sp_armthumb.c 5.3 MB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116101171011810119101201012110122101231012410125101261012710128101291013010131101321013310134101351013610137101381013910140101411014210143101441014510146101471014810149101501015110152101531015410155101561015710158101591016010161101621016310164101651016610167101681016910170101711017210173101741017510176101771017810179101801018110182101831018410185101861018710188101891019010191101921019310194101951019610197101981019910200102011020210203102041020510206102071020810209102101021110212102131021410215102161021710218102191022010221102221022310224102251022610227102281022910230102311023210233102341023510236102371023810239102401024110242102431024410245102461024710248102491025010251102521025310254102551025610257102581025910260102611026210263102641026510266102671026810269102701027110272102731027410275102761027710278102791028010281102821028310284102851028610287102881028910290102911029210293102941029510296102971029810299103001030110302103031030410305103061030710308103091031010311103121031310314103151031610317103181031910320103211032210323103241032510326103271032810329103301033110332103331033410335103361033710338103391034010341103421034310344103451034610347103481034910350103511035210353103541035510356103571035810359103601036110362103631036410365103661036710368103691037010371103721037310374103751037610377103781037910380103811038210383103841038510386103871038810389103901039110392103931039410395103961039710398103991040010401104021040310404104051040610407104081040910410104111041210413104141041510416104171041810419104201042110422104231042410425104261042710428104291043010431104321043310434104351043610437104381043910440104411044210443104441044510446104471044810449104501045110452104531045410455104561045710458104591046010461104621046310464104651046610467104681046910470104711047210473104741047510476104771047810479104801048110482104831048410485104861048710488104891049010491104921049310494104951049610497104981049910500105011050210503105041050510506105071050810509105101051110512105131051410515105161051710518105191052010521105221052310524105251052610527105281052910530105311053210533105341053510536105371053810539105401054110542105431054410545105461054710548105491055010551105521055310554105551055610557105581055910560105611056210563105641056510566105671056810569105701057110572105731057410575105761057710578105791058010581105821058310584105851058610587105881058910590105911059210593105941059510596105971059810599106001060110602106031060410605106061060710608106091061010611106121061310614106151061610617106181061910620106211062210623106241062510626106271062810629106301063110632106331063410635106361063710638106391064010641106421064310644106451064610647106481064910650106511065210653106541065510656106571065810659106601066110662106631066410665106661066710668106691067010671106721067310674106751067610677106781067910680106811068210683106841068510686106871068810689106901069110692106931069410695106961069710698106991070010701107021070310704107051070610707107081070910710107111071210713107141071510716107171071810719107201072110722107231072410725107261072710728107291073010731107321073310734107351073610737107381073910740107411074210743107441074510746107471074810749107501075110752107531075410755107561075710758107591076010761107621076310764107651076610767107681076910770107711077210773107741077510776107771077810779107801078110782107831078410785107861078710788107891079010791107921079310794107951079610797107981079910800108011080210803108041080510806108071080810809108101081110812108131081410815108161081710818108191082010821108221082310824108251082610827108281082910830108311083210833108341083510836108371083810839108401084110842108431084410845108461084710848108491085010851108521085310854108551085610857108581085910860108611086210863108641086510866108671086810869108701087110872108731087410875108761087710878108791088010881108821088310884108851088610887108881088910890108911089210893108941089510896108971089810899109001090110902109031090410905109061090710908109091091010911109121091310914109151091610917109181091910920109211092210923109241092510926109271092810929109301093110932109331093410935109361093710938109391094010941109421094310944109451094610947109481094910950109511095210953109541095510956109571095810959109601096110962109631096410965109661096710968109691097010971109721097310974109751097610977109781097910980109811098210983109841098510986109871098810989109901099110992109931099410995109961099710998109991100011001110021100311004110051100611007110081100911010110111101211013110141101511016110171101811019110201102111022110231102411025110261102711028110291103011031110321103311034110351103611037110381103911040110411104211043110441104511046110471104811049110501105111052110531105411055110561105711058110591106011061110621106311064110651106611067110681106911070110711107211073110741107511076110771107811079110801108111082110831108411085110861108711088110891109011091110921109311094110951109611097110981109911100111011110211103111041110511106111071110811109111101111111112111131111411115111161111711118111191112011121111221112311124111251112611127111281112911130111311113211133111341113511136111371113811139111401114111142111431114411145111461114711148111491115011151111521115311154111551115611157111581115911160111611116211163111641116511166111671116811169111701117111172111731117411175111761117711178111791118011181111821118311184111851118611187111881118911190111911119211193111941119511196111971119811199112001120111202112031120411205112061120711208112091121011211112121121311214112151121611217112181121911220112211122211223112241122511226112271122811229112301123111232112331123411235112361123711238112391124011241112421124311244112451124611247112481124911250112511125211253112541125511256112571125811259112601126111262112631126411265112661126711268112691127011271112721127311274112751127611277112781127911280112811128211283112841128511286112871128811289112901129111292112931129411295112961129711298112991130011301113021130311304113051130611307113081130911310113111131211313113141131511316113171131811319113201132111322113231132411325113261132711328113291133011331113321133311334113351133611337113381133911340113411134211343113441134511346113471134811349113501135111352113531135411355113561135711358113591136011361113621136311364113651136611367113681136911370113711137211373113741137511376113771137811379113801138111382113831138411385113861138711388113891139011391113921139311394113951139611397113981139911400114011140211403114041140511406114071140811409114101141111412114131141411415114161141711418114191142011421114221142311424114251142611427114281142911430114311143211433114341143511436114371143811439114401144111442114431144411445114461144711448114491145011451114521145311454114551145611457114581145911460114611146211463114641146511466114671146811469114701147111472114731147411475114761147711478114791148011481114821148311484114851148611487114881148911490114911149211493114941149511496114971149811499115001150111502115031150411505115061150711508115091151011511115121151311514115151151611517115181151911520115211152211523115241152511526115271152811529115301153111532115331153411535115361153711538115391154011541115421154311544115451154611547115481154911550115511155211553115541155511556115571155811559115601156111562115631156411565115661156711568115691157011571115721157311574115751157611577115781157911580115811158211583115841158511586115871158811589115901159111592115931159411595115961159711598115991160011601116021160311604116051160611607116081160911610116111161211613116141161511616116171161811619116201162111622116231162411625116261162711628116291163011631116321163311634116351163611637116381163911640116411164211643116441164511646116471164811649116501165111652116531165411655116561165711658116591166011661116621166311664116651166611667116681166911670116711167211673116741167511676116771167811679116801168111682116831168411685116861168711688116891169011691116921169311694116951169611697116981169911700117011170211703117041170511706117071170811709117101171111712117131171411715117161171711718117191172011721117221172311724117251172611727117281172911730117311173211733117341173511736117371173811739117401174111742117431174411745117461174711748117491175011751117521175311754117551175611757117581175911760117611176211763117641176511766117671176811769117701177111772117731177411775117761177711778117791178011781117821178311784117851178611787117881178911790117911179211793117941179511796117971179811799118001180111802118031180411805118061180711808118091181011811118121181311814118151181611817118181181911820118211182211823118241182511826118271182811829118301183111832118331183411835118361183711838118391184011841118421184311844118451184611847118481184911850118511185211853118541185511856118571185811859118601186111862118631186411865118661186711868118691187011871118721187311874118751187611877118781187911880118811188211883118841188511886118871188811889118901189111892118931189411895118961189711898118991190011901119021190311904119051190611907119081190911910119111191211913119141191511916119171191811919119201192111922119231192411925119261192711928119291193011931119321193311934119351193611937119381193911940119411194211943119441194511946119471194811949119501195111952119531195411955119561195711958119591196011961119621196311964119651196611967119681196911970119711197211973119741197511976119771197811979119801198111982119831198411985119861198711988119891199011991119921199311994119951199611997119981199912000120011200212003120041200512006120071200812009120101201112012120131201412015120161201712018120191202012021120221202312024120251202612027120281202912030120311203212033120341203512036120371203812039120401204112042120431204412045120461204712048120491205012051120521205312054120551205612057120581205912060120611206212063120641206512066120671206812069120701207112072120731207412075120761207712078120791208012081120821208312084120851208612087120881208912090120911209212093120941209512096120971209812099121001210112102121031210412105121061210712108121091211012111121121211312114121151211612117121181211912120121211212212123121241212512126121271212812129121301213112132121331213412135121361213712138121391214012141121421214312144121451214612147121481214912150121511215212153121541215512156121571215812159121601216112162121631216412165121661216712168121691217012171121721217312174121751217612177121781217912180121811218212183121841218512186121871218812189121901219112192121931219412195121961219712198121991220012201122021220312204122051220612207122081220912210122111221212213122141221512216122171221812219122201222112222122231222412225122261222712228122291223012231122321223312234122351223612237122381223912240122411224212243122441224512246122471224812249122501225112252122531225412255122561225712258122591226012261122621226312264122651226612267122681226912270122711227212273122741227512276122771227812279122801228112282122831228412285122861228712288122891229012291122921229312294122951229612297122981229912300123011230212303123041230512306123071230812309123101231112312123131231412315123161231712318123191232012321123221232312324123251232612327123281232912330123311233212333123341233512336123371233812339123401234112342123431234412345123461234712348123491235012351123521235312354123551235612357123581235912360123611236212363123641236512366123671236812369123701237112372123731237412375123761237712378123791238012381123821238312384123851238612387123881238912390123911239212393123941239512396123971239812399124001240112402124031240412405124061240712408124091241012411124121241312414124151241612417124181241912420124211242212423124241242512426124271242812429124301243112432124331243412435124361243712438124391244012441124421244312444124451244612447124481244912450124511245212453124541245512456124571245812459124601246112462124631246412465124661246712468124691247012471124721247312474124751247612477124781247912480124811248212483124841248512486124871248812489124901249112492124931249412495124961249712498124991250012501125021250312504125051250612507125081250912510125111251212513125141251512516125171251812519125201252112522125231252412525125261252712528125291253012531125321253312534125351253612537125381253912540125411254212543125441254512546125471254812549125501255112552125531255412555125561255712558125591256012561125621256312564125651256612567125681256912570125711257212573125741257512576125771257812579125801258112582125831258412585125861258712588125891259012591125921259312594125951259612597125981259912600126011260212603126041260512606126071260812609126101261112612126131261412615126161261712618126191262012621126221262312624126251262612627126281262912630126311263212633126341263512636126371263812639126401264112642126431264412645126461264712648126491265012651126521265312654126551265612657126581265912660126611266212663126641266512666126671266812669126701267112672126731267412675126761267712678126791268012681126821268312684126851268612687126881268912690126911269212693126941269512696126971269812699127001270112702127031270412705127061270712708127091271012711127121271312714127151271612717127181271912720127211272212723127241272512726127271272812729127301273112732127331273412735127361273712738127391274012741127421274312744127451274612747127481274912750127511275212753127541275512756127571275812759127601276112762127631276412765127661276712768127691277012771127721277312774127751277612777127781277912780127811278212783127841278512786127871278812789127901279112792127931279412795127961279712798127991280012801128021280312804128051280612807128081280912810128111281212813128141281512816128171281812819128201282112822128231282412825128261282712828128291283012831128321283312834128351283612837128381283912840128411284212843128441284512846128471284812849128501285112852128531285412855128561285712858128591286012861128621286312864128651286612867128681286912870128711287212873128741287512876128771287812879128801288112882128831288412885128861288712888128891289012891128921289312894128951289612897128981289912900129011290212903129041290512906129071290812909129101291112912129131291412915129161291712918129191292012921129221292312924129251292612927129281292912930129311293212933129341293512936129371293812939129401294112942129431294412945129461294712948129491295012951129521295312954129551295612957129581295912960129611296212963129641296512966129671296812969129701297112972129731297412975129761297712978129791298012981129821298312984129851298612987129881298912990129911299212993129941299512996129971299812999130001300113002130031300413005130061300713008130091301013011130121301313014130151301613017130181301913020130211302213023130241302513026130271302813029130301303113032130331303413035130361303713038130391304013041130421304313044130451304613047130481304913050130511305213053130541305513056130571305813059130601306113062130631306413065130661306713068130691307013071130721307313074130751307613077130781307913080130811308213083130841308513086130871308813089130901309113092130931309413095130961309713098130991310013101131021310313104131051310613107131081310913110131111311213113131141311513116131171311813119131201312113122131231312413125131261312713128131291313013131131321313313134131351313613137131381313913140131411314213143131441314513146131471314813149131501315113152131531315413155131561315713158131591316013161131621316313164131651316613167131681316913170131711317213173131741317513176131771317813179131801318113182131831318413185131861318713188131891319013191131921319313194131951319613197131981319913200132011320213203132041320513206132071320813209132101321113212132131321413215132161321713218132191322013221132221322313224132251322613227132281322913230132311323213233132341323513236132371323813239132401324113242132431324413245132461324713248132491325013251132521325313254132551325613257132581325913260132611326213263132641326513266132671326813269132701327113272132731327413275132761327713278132791328013281132821328313284132851328613287132881328913290132911329213293132941329513296132971329813299133001330113302133031330413305133061330713308133091331013311133121331313314133151331613317133181331913320133211332213323133241332513326133271332813329133301333113332133331333413335133361333713338133391334013341133421334313344133451334613347133481334913350133511335213353133541335513356133571335813359133601336113362133631336413365133661336713368133691337013371133721337313374133751337613377133781337913380133811338213383133841338513386133871338813389133901339113392133931339413395133961339713398133991340013401134021340313404134051340613407134081340913410134111341213413134141341513416134171341813419134201342113422134231342413425134261342713428134291343013431134321343313434134351343613437134381343913440134411344213443134441344513446134471344813449134501345113452134531345413455134561345713458134591346013461134621346313464134651346613467134681346913470134711347213473134741347513476134771347813479134801348113482134831348413485134861348713488134891349013491134921349313494134951349613497134981349913500135011350213503135041350513506135071350813509135101351113512135131351413515135161351713518135191352013521135221352313524135251352613527135281352913530135311353213533135341353513536135371353813539135401354113542135431354413545135461354713548135491355013551135521355313554135551355613557135581355913560135611356213563135641356513566135671356813569135701357113572135731357413575135761357713578135791358013581135821358313584135851358613587135881358913590135911359213593135941359513596135971359813599136001360113602136031360413605136061360713608136091361013611136121361313614136151361613617136181361913620136211362213623136241362513626136271362813629136301363113632136331363413635136361363713638136391364013641136421364313644136451364613647136481364913650136511365213653136541365513656136571365813659136601366113662136631366413665136661366713668136691367013671136721367313674136751367613677136781367913680136811368213683136841368513686136871368813689136901369113692136931369413695136961369713698136991370013701137021370313704137051370613707137081370913710137111371213713137141371513716137171371813719137201372113722137231372413725137261372713728137291373013731137321373313734137351373613737137381373913740137411374213743137441374513746137471374813749137501375113752137531375413755137561375713758137591376013761137621376313764137651376613767137681376913770137711377213773137741377513776137771377813779137801378113782137831378413785137861378713788137891379013791137921379313794137951379613797137981379913800138011380213803138041380513806138071380813809138101381113812138131381413815138161381713818138191382013821138221382313824138251382613827138281382913830138311383213833138341383513836138371383813839138401384113842138431384413845138461384713848138491385013851138521385313854138551385613857138581385913860138611386213863138641386513866138671386813869138701387113872138731387413875138761387713878138791388013881138821388313884138851388613887138881388913890138911389213893138941389513896138971389813899139001390113902139031390413905139061390713908139091391013911139121391313914139151391613917139181391913920139211392213923139241392513926139271392813929139301393113932139331393413935139361393713938139391394013941139421394313944139451394613947139481394913950139511395213953139541395513956139571395813959139601396113962139631396413965139661396713968139691397013971139721397313974139751397613977139781397913980139811398213983139841398513986139871398813989139901399113992139931399413995139961399713998139991400014001140021400314004140051400614007140081400914010140111401214013140141401514016140171401814019140201402114022140231402414025140261402714028140291403014031140321403314034140351403614037140381403914040140411404214043140441404514046140471404814049140501405114052140531405414055140561405714058140591406014061140621406314064140651406614067140681406914070140711407214073140741407514076140771407814079140801408114082140831408414085140861408714088140891409014091140921409314094140951409614097140981409914100141011410214103141041410514106141071410814109141101411114112141131411414115141161411714118141191412014121141221412314124141251412614127141281412914130141311413214133141341413514136141371413814139141401414114142141431414414145141461414714148141491415014151141521415314154141551415614157141581415914160141611416214163141641416514166141671416814169141701417114172141731417414175141761417714178141791418014181141821418314184141851418614187141881418914190141911419214193141941419514196141971419814199142001420114202142031420414205142061420714208142091421014211142121421314214142151421614217142181421914220142211422214223142241422514226142271422814229142301423114232142331423414235142361423714238142391424014241142421424314244142451424614247142481424914250142511425214253142541425514256142571425814259142601426114262142631426414265142661426714268142691427014271142721427314274142751427614277142781427914280142811428214283142841428514286142871428814289142901429114292142931429414295142961429714298142991430014301143021430314304143051430614307143081430914310143111431214313143141431514316143171431814319143201432114322143231432414325143261432714328143291433014331143321433314334143351433614337143381433914340143411434214343143441434514346143471434814349143501435114352143531435414355143561435714358143591436014361143621436314364143651436614367143681436914370143711437214373143741437514376143771437814379143801438114382143831438414385143861438714388143891439014391143921439314394143951439614397143981439914400144011440214403144041440514406144071440814409144101441114412144131441414415144161441714418144191442014421144221442314424144251442614427144281442914430144311443214433144341443514436144371443814439144401444114442144431444414445144461444714448144491445014451144521445314454144551445614457144581445914460144611446214463144641446514466144671446814469144701447114472144731447414475144761447714478144791448014481144821448314484144851448614487144881448914490144911449214493144941449514496144971449814499145001450114502145031450414505145061450714508145091451014511145121451314514145151451614517145181451914520145211452214523145241452514526145271452814529145301453114532145331453414535145361453714538145391454014541145421454314544145451454614547145481454914550145511455214553145541455514556145571455814559145601456114562145631456414565145661456714568145691457014571145721457314574145751457614577145781457914580145811458214583145841458514586145871458814589145901459114592145931459414595145961459714598145991460014601146021460314604146051460614607146081460914610146111461214613146141461514616146171461814619146201462114622146231462414625146261462714628146291463014631146321463314634146351463614637146381463914640146411464214643146441464514646146471464814649146501465114652146531465414655146561465714658146591466014661146621466314664146651466614667146681466914670146711467214673146741467514676146771467814679146801468114682146831468414685146861468714688146891469014691146921469314694146951469614697146981469914700147011470214703147041470514706147071470814709147101471114712147131471414715147161471714718147191472014721147221472314724147251472614727147281472914730147311473214733147341473514736147371473814739147401474114742147431474414745147461474714748147491475014751147521475314754147551475614757147581475914760147611476214763147641476514766147671476814769147701477114772147731477414775147761477714778147791478014781147821478314784147851478614787147881478914790147911479214793147941479514796147971479814799148001480114802148031480414805148061480714808148091481014811148121481314814148151481614817148181481914820148211482214823148241482514826148271482814829148301483114832148331483414835148361483714838148391484014841148421484314844148451484614847148481484914850148511485214853148541485514856148571485814859148601486114862148631486414865148661486714868148691487014871148721487314874148751487614877148781487914880148811488214883148841488514886148871488814889148901489114892148931489414895148961489714898148991490014901149021490314904149051490614907149081490914910149111491214913149141491514916149171491814919149201492114922149231492414925149261492714928149291493014931149321493314934149351493614937149381493914940149411494214943149441494514946149471494814949149501495114952149531495414955149561495714958149591496014961149621496314964149651496614967149681496914970149711497214973149741497514976149771497814979149801498114982149831498414985149861498714988149891499014991149921499314994149951499614997149981499915000150011500215003150041500515006150071500815009150101501115012150131501415015150161501715018150191502015021150221502315024150251502615027150281502915030150311503215033150341503515036150371503815039150401504115042150431504415045150461504715048150491505015051150521505315054150551505615057150581505915060150611506215063150641506515066150671506815069150701507115072150731507415075150761507715078150791508015081150821508315084150851508615087150881508915090150911509215093150941509515096150971509815099151001510115102151031510415105151061510715108151091511015111151121511315114151151511615117151181511915120151211512215123151241512515126151271512815129151301513115132151331513415135151361513715138151391514015141151421514315144151451514615147151481514915150151511515215153151541515515156151571515815159151601516115162151631516415165151661516715168151691517015171151721517315174151751517615177151781517915180151811518215183151841518515186151871518815189151901519115192151931519415195151961519715198151991520015201152021520315204152051520615207152081520915210152111521215213152141521515216152171521815219152201522115222152231522415225152261522715228152291523015231152321523315234152351523615237152381523915240152411524215243152441524515246152471524815249152501525115252152531525415255152561525715258152591526015261152621526315264152651526615267152681526915270152711527215273152741527515276152771527815279152801528115282152831528415285152861528715288152891529015291152921529315294152951529615297152981529915300153011530215303153041530515306153071530815309153101531115312153131531415315153161531715318153191532015321153221532315324153251532615327153281532915330153311533215333153341533515336153371533815339153401534115342153431534415345153461534715348153491535015351153521535315354153551535615357153581535915360153611536215363153641536515366153671536815369153701537115372153731537415375153761537715378153791538015381153821538315384153851538615387153881538915390153911539215393153941539515396153971539815399154001540115402154031540415405154061540715408154091541015411154121541315414154151541615417154181541915420154211542215423154241542515426154271542815429154301543115432154331543415435154361543715438154391544015441154421544315444154451544615447154481544915450154511545215453154541545515456154571545815459154601546115462154631546415465154661546715468154691547015471154721547315474154751547615477154781547915480154811548215483154841548515486154871548815489154901549115492154931549415495154961549715498154991550015501155021550315504155051550615507155081550915510155111551215513155141551515516155171551815519155201552115522155231552415525155261552715528155291553015531155321553315534155351553615537155381553915540155411554215543155441554515546155471554815549155501555115552155531555415555155561555715558155591556015561155621556315564155651556615567155681556915570155711557215573155741557515576155771557815579155801558115582155831558415585155861558715588155891559015591155921559315594155951559615597155981559915600156011560215603156041560515606156071560815609156101561115612156131561415615156161561715618156191562015621156221562315624156251562615627156281562915630156311563215633156341563515636156371563815639156401564115642156431564415645156461564715648156491565015651156521565315654156551565615657156581565915660156611566215663156641566515666156671566815669156701567115672156731567415675156761567715678156791568015681156821568315684156851568615687156881568915690156911569215693156941569515696156971569815699157001570115702157031570415705157061570715708157091571015711157121571315714157151571615717157181571915720157211572215723157241572515726157271572815729157301573115732157331573415735157361573715738157391574015741157421574315744157451574615747157481574915750157511575215753157541575515756157571575815759157601576115762157631576415765157661576715768157691577015771157721577315774157751577615777157781577915780157811578215783157841578515786157871578815789157901579115792157931579415795157961579715798157991580015801158021580315804158051580615807158081580915810158111581215813158141581515816158171581815819158201582115822158231582415825158261582715828158291583015831158321583315834158351583615837158381583915840158411584215843158441584515846158471584815849158501585115852158531585415855158561585715858158591586015861158621586315864158651586615867158681586915870158711587215873158741587515876158771587815879158801588115882158831588415885158861588715888158891589015891158921589315894158951589615897158981589915900159011590215903159041590515906159071590815909159101591115912159131591415915159161591715918159191592015921159221592315924159251592615927159281592915930159311593215933159341593515936159371593815939159401594115942159431594415945159461594715948159491595015951159521595315954159551595615957159581595915960159611596215963159641596515966159671596815969159701597115972159731597415975159761597715978159791598015981159821598315984159851598615987159881598915990159911599215993159941599515996159971599815999160001600116002160031600416005160061600716008160091601016011160121601316014160151601616017160181601916020160211602216023160241602516026160271602816029160301603116032160331603416035160361603716038160391604016041160421604316044160451604616047160481604916050160511605216053160541605516056160571605816059160601606116062160631606416065160661606716068160691607016071160721607316074160751607616077160781607916080160811608216083160841608516086160871608816089160901609116092160931609416095160961609716098160991610016101161021610316104161051610616107161081610916110161111611216113161141611516116161171611816119161201612116122161231612416125161261612716128161291613016131161321613316134161351613616137161381613916140161411614216143161441614516146161471614816149161501615116152161531615416155161561615716158161591616016161161621616316164161651616616167161681616916170161711617216173161741617516176161771617816179161801618116182161831618416185161861618716188161891619016191161921619316194161951619616197161981619916200162011620216203162041620516206162071620816209162101621116212162131621416215162161621716218162191622016221162221622316224162251622616227162281622916230162311623216233162341623516236162371623816239162401624116242162431624416245162461624716248162491625016251162521625316254162551625616257162581625916260162611626216263162641626516266162671626816269162701627116272162731627416275162761627716278162791628016281162821628316284162851628616287162881628916290162911629216293162941629516296162971629816299163001630116302163031630416305163061630716308163091631016311163121631316314163151631616317163181631916320163211632216323163241632516326163271632816329163301633116332163331633416335163361633716338163391634016341163421634316344163451634616347163481634916350163511635216353163541635516356163571635816359163601636116362163631636416365163661636716368163691637016371163721637316374163751637616377163781637916380163811638216383163841638516386163871638816389163901639116392163931639416395163961639716398163991640016401164021640316404164051640616407164081640916410164111641216413164141641516416164171641816419164201642116422164231642416425164261642716428164291643016431164321643316434164351643616437164381643916440164411644216443164441644516446164471644816449164501645116452164531645416455164561645716458164591646016461164621646316464164651646616467164681646916470164711647216473164741647516476164771647816479164801648116482164831648416485164861648716488164891649016491164921649316494164951649616497164981649916500165011650216503165041650516506165071650816509165101651116512165131651416515165161651716518165191652016521165221652316524165251652616527165281652916530165311653216533165341653516536165371653816539165401654116542165431654416545165461654716548165491655016551165521655316554165551655616557165581655916560165611656216563165641656516566165671656816569165701657116572165731657416575165761657716578165791658016581165821658316584165851658616587165881658916590165911659216593165941659516596165971659816599166001660116602166031660416605166061660716608166091661016611166121661316614166151661616617166181661916620166211662216623166241662516626166271662816629166301663116632166331663416635166361663716638166391664016641166421664316644166451664616647166481664916650166511665216653166541665516656166571665816659166601666116662166631666416665166661666716668166691667016671166721667316674166751667616677166781667916680166811668216683166841668516686166871668816689166901669116692166931669416695166961669716698166991670016701167021670316704167051670616707167081670916710167111671216713167141671516716167171671816719167201672116722167231672416725167261672716728167291673016731167321673316734167351673616737167381673916740167411674216743167441674516746167471674816749167501675116752167531675416755167561675716758167591676016761167621676316764167651676616767167681676916770167711677216773167741677516776167771677816779167801678116782167831678416785167861678716788167891679016791167921679316794167951679616797167981679916800168011680216803168041680516806168071680816809168101681116812168131681416815168161681716818168191682016821168221682316824168251682616827168281682916830168311683216833168341683516836168371683816839168401684116842168431684416845168461684716848168491685016851168521685316854168551685616857168581685916860168611686216863168641686516866168671686816869168701687116872168731687416875168761687716878168791688016881168821688316884168851688616887168881688916890168911689216893168941689516896168971689816899169001690116902169031690416905169061690716908169091691016911169121691316914169151691616917169181691916920169211692216923169241692516926169271692816929169301693116932169331693416935169361693716938169391694016941169421694316944169451694616947169481694916950169511695216953169541695516956169571695816959169601696116962169631696416965169661696716968169691697016971169721697316974169751697616977169781697916980169811698216983169841698516986169871698816989169901699116992169931699416995169961699716998169991700017001170021700317004170051700617007170081700917010170111701217013170141701517016170171701817019170201702117022170231702417025170261702717028170291703017031170321703317034170351703617037170381703917040170411704217043170441704517046170471704817049170501705117052170531705417055170561705717058170591706017061170621706317064170651706617067170681706917070170711707217073170741707517076170771707817079170801708117082170831708417085170861708717088170891709017091170921709317094170951709617097170981709917100171011710217103171041710517106171071710817109171101711117112171131711417115171161711717118171191712017121171221712317124171251712617127171281712917130171311713217133171341713517136171371713817139171401714117142171431714417145171461714717148171491715017151171521715317154171551715617157171581715917160171611716217163171641716517166171671716817169171701717117172171731717417175171761717717178171791718017181171821718317184171851718617187171881718917190171911719217193171941719517196171971719817199172001720117202172031720417205172061720717208172091721017211172121721317214172151721617217172181721917220172211722217223172241722517226172271722817229172301723117232172331723417235172361723717238172391724017241172421724317244172451724617247172481724917250172511725217253172541725517256172571725817259172601726117262172631726417265172661726717268172691727017271172721727317274172751727617277172781727917280172811728217283172841728517286172871728817289172901729117292172931729417295172961729717298172991730017301173021730317304173051730617307173081730917310173111731217313173141731517316173171731817319173201732117322173231732417325173261732717328173291733017331173321733317334173351733617337173381733917340173411734217343173441734517346173471734817349173501735117352173531735417355173561735717358173591736017361173621736317364173651736617367173681736917370173711737217373173741737517376173771737817379173801738117382173831738417385173861738717388173891739017391173921739317394173951739617397173981739917400174011740217403174041740517406174071740817409174101741117412174131741417415174161741717418174191742017421174221742317424174251742617427174281742917430174311743217433174341743517436174371743817439174401744117442174431744417445174461744717448174491745017451174521745317454174551745617457174581745917460174611746217463174641746517466174671746817469174701747117472174731747417475174761747717478174791748017481174821748317484174851748617487174881748917490174911749217493174941749517496174971749817499175001750117502175031750417505175061750717508175091751017511175121751317514175151751617517175181751917520175211752217523175241752517526175271752817529175301753117532175331753417535175361753717538175391754017541175421754317544175451754617547175481754917550175511755217553175541755517556175571755817559175601756117562175631756417565175661756717568175691757017571175721757317574175751757617577175781757917580175811758217583175841758517586175871758817589175901759117592175931759417595175961759717598175991760017601176021760317604176051760617607176081760917610176111761217613176141761517616176171761817619176201762117622176231762417625176261762717628176291763017631176321763317634176351763617637176381763917640176411764217643176441764517646176471764817649176501765117652176531765417655176561765717658176591766017661176621766317664176651766617667176681766917670176711767217673176741767517676176771767817679176801768117682176831768417685176861768717688176891769017691176921769317694176951769617697176981769917700177011770217703177041770517706177071770817709177101771117712177131771417715177161771717718177191772017721177221772317724177251772617727177281772917730177311773217733177341773517736177371773817739177401774117742177431774417745177461774717748177491775017751177521775317754177551775617757177581775917760177611776217763177641776517766177671776817769177701777117772177731777417775177761777717778177791778017781177821778317784177851778617787177881778917790177911779217793177941779517796177971779817799178001780117802178031780417805178061780717808178091781017811178121781317814178151781617817178181781917820178211782217823178241782517826178271782817829178301783117832178331783417835178361783717838178391784017841178421784317844178451784617847178481784917850178511785217853178541785517856178571785817859178601786117862178631786417865178661786717868178691787017871178721787317874178751787617877178781787917880178811788217883178841788517886178871788817889178901789117892178931789417895178961789717898178991790017901179021790317904179051790617907179081790917910179111791217913179141791517916179171791817919179201792117922179231792417925179261792717928179291793017931179321793317934179351793617937179381793917940179411794217943179441794517946179471794817949179501795117952179531795417955179561795717958179591796017961179621796317964179651796617967179681796917970179711797217973179741797517976179771797817979179801798117982179831798417985179861798717988179891799017991179921799317994179951799617997179981799918000180011800218003180041800518006180071800818009180101801118012180131801418015180161801718018180191802018021180221802318024180251802618027180281802918030180311803218033180341803518036180371803818039180401804118042180431804418045180461804718048180491805018051180521805318054180551805618057180581805918060180611806218063180641806518066180671806818069180701807118072180731807418075180761807718078180791808018081180821808318084180851808618087180881808918090180911809218093180941809518096180971809818099181001810118102181031810418105181061810718108181091811018111181121811318114181151811618117181181811918120181211812218123181241812518126181271812818129181301813118132181331813418135181361813718138181391814018141181421814318144181451814618147181481814918150181511815218153181541815518156181571815818159181601816118162181631816418165181661816718168181691817018171181721817318174181751817618177181781817918180181811818218183181841818518186181871818818189181901819118192181931819418195181961819718198181991820018201182021820318204182051820618207182081820918210182111821218213182141821518216182171821818219182201822118222182231822418225182261822718228182291823018231182321823318234182351823618237182381823918240182411824218243182441824518246182471824818249182501825118252182531825418255182561825718258182591826018261182621826318264182651826618267182681826918270182711827218273182741827518276182771827818279182801828118282182831828418285182861828718288182891829018291182921829318294182951829618297182981829918300183011830218303183041830518306183071830818309183101831118312183131831418315183161831718318183191832018321183221832318324183251832618327183281832918330183311833218333183341833518336183371833818339183401834118342183431834418345183461834718348183491835018351183521835318354183551835618357183581835918360183611836218363183641836518366183671836818369183701837118372183731837418375183761837718378183791838018381183821838318384183851838618387183881838918390183911839218393183941839518396183971839818399184001840118402184031840418405184061840718408184091841018411184121841318414184151841618417184181841918420184211842218423184241842518426184271842818429184301843118432184331843418435184361843718438184391844018441184421844318444184451844618447184481844918450184511845218453184541845518456184571845818459184601846118462184631846418465184661846718468184691847018471184721847318474184751847618477184781847918480184811848218483184841848518486184871848818489184901849118492184931849418495184961849718498184991850018501185021850318504185051850618507185081850918510185111851218513185141851518516185171851818519185201852118522185231852418525185261852718528185291853018531185321853318534185351853618537185381853918540185411854218543185441854518546185471854818549185501855118552185531855418555185561855718558185591856018561185621856318564185651856618567185681856918570185711857218573185741857518576185771857818579185801858118582185831858418585185861858718588185891859018591185921859318594185951859618597185981859918600186011860218603186041860518606186071860818609186101861118612186131861418615186161861718618186191862018621186221862318624186251862618627186281862918630186311863218633186341863518636186371863818639186401864118642186431864418645186461864718648186491865018651186521865318654186551865618657186581865918660186611866218663186641866518666186671866818669186701867118672186731867418675186761867718678186791868018681186821868318684186851868618687186881868918690186911869218693186941869518696186971869818699187001870118702187031870418705187061870718708187091871018711187121871318714187151871618717187181871918720187211872218723187241872518726187271872818729187301873118732187331873418735187361873718738187391874018741187421874318744187451874618747187481874918750187511875218753187541875518756187571875818759187601876118762187631876418765187661876718768187691877018771187721877318774187751877618777187781877918780187811878218783187841878518786187871878818789187901879118792187931879418795187961879718798187991880018801188021880318804188051880618807188081880918810188111881218813188141881518816188171881818819188201882118822188231882418825188261882718828188291883018831188321883318834188351883618837188381883918840188411884218843188441884518846188471884818849188501885118852188531885418855188561885718858188591886018861188621886318864188651886618867188681886918870188711887218873188741887518876188771887818879188801888118882188831888418885188861888718888188891889018891188921889318894188951889618897188981889918900189011890218903189041890518906189071890818909189101891118912189131891418915189161891718918189191892018921189221892318924189251892618927189281892918930189311893218933189341893518936189371893818939189401894118942189431894418945189461894718948189491895018951189521895318954189551895618957189581895918960189611896218963189641896518966189671896818969189701897118972189731897418975189761897718978189791898018981189821898318984189851898618987189881898918990189911899218993189941899518996189971899818999190001900119002190031900419005190061900719008190091901019011190121901319014190151901619017190181901919020190211902219023190241902519026190271902819029190301903119032190331903419035190361903719038190391904019041190421904319044190451904619047190481904919050190511905219053190541905519056190571905819059190601906119062190631906419065190661906719068190691907019071190721907319074190751907619077190781907919080190811908219083190841908519086190871908819089190901909119092190931909419095190961909719098190991910019101191021910319104191051910619107191081910919110191111911219113191141911519116191171911819119191201912119122191231912419125191261912719128191291913019131191321913319134191351913619137191381913919140191411914219143191441914519146191471914819149191501915119152191531915419155191561915719158191591916019161191621916319164191651916619167191681916919170191711917219173191741917519176191771917819179191801918119182191831918419185191861918719188191891919019191191921919319194191951919619197191981919919200192011920219203192041920519206192071920819209192101921119212192131921419215192161921719218192191922019221192221922319224192251922619227192281922919230192311923219233192341923519236192371923819239192401924119242192431924419245192461924719248192491925019251192521925319254192551925619257192581925919260192611926219263192641926519266192671926819269192701927119272192731927419275192761927719278192791928019281192821928319284192851928619287192881928919290192911929219293192941929519296192971929819299193001930119302193031930419305193061930719308193091931019311193121931319314193151931619317193181931919320193211932219323193241932519326193271932819329193301933119332193331933419335193361933719338193391934019341193421934319344193451934619347193481934919350193511935219353193541935519356193571935819359193601936119362193631936419365193661936719368193691937019371193721937319374193751937619377193781937919380193811938219383193841938519386193871938819389193901939119392193931939419395193961939719398193991940019401194021940319404194051940619407194081940919410194111941219413194141941519416194171941819419194201942119422194231942419425194261942719428194291943019431194321943319434194351943619437194381943919440194411944219443194441944519446194471944819449194501945119452194531945419455194561945719458194591946019461194621946319464194651946619467194681946919470194711947219473194741947519476194771947819479194801948119482194831948419485194861948719488194891949019491194921949319494194951949619497194981949919500195011950219503195041950519506195071950819509195101951119512195131951419515195161951719518195191952019521195221952319524195251952619527195281952919530195311953219533195341953519536195371953819539195401954119542195431954419545195461954719548195491955019551195521955319554195551955619557195581955919560195611956219563195641956519566195671956819569195701957119572195731957419575195761957719578195791958019581195821958319584195851958619587195881958919590195911959219593195941959519596195971959819599196001960119602196031960419605196061960719608196091961019611196121961319614196151961619617196181961919620196211962219623196241962519626196271962819629196301963119632196331963419635196361963719638196391964019641196421964319644196451964619647196481964919650196511965219653196541965519656196571965819659196601966119662196631966419665196661966719668196691967019671196721967319674196751967619677196781967919680196811968219683196841968519686196871968819689196901969119692196931969419695196961969719698196991970019701197021970319704197051970619707197081970919710197111971219713197141971519716197171971819719197201972119722197231972419725197261972719728197291973019731197321973319734197351973619737197381973919740197411974219743197441974519746197471974819749197501975119752197531975419755197561975719758197591976019761197621976319764197651976619767197681976919770197711977219773197741977519776197771977819779197801978119782197831978419785197861978719788197891979019791197921979319794197951979619797197981979919800198011980219803198041980519806198071980819809198101981119812198131981419815198161981719818198191982019821198221982319824198251982619827198281982919830198311983219833198341983519836198371983819839198401984119842198431984419845198461984719848198491985019851198521985319854198551985619857198581985919860198611986219863198641986519866198671986819869198701987119872198731987419875198761987719878198791988019881198821988319884198851988619887198881988919890198911989219893198941989519896198971989819899199001990119902199031990419905199061990719908199091991019911199121991319914199151991619917199181991919920199211992219923199241992519926199271992819929199301993119932199331993419935199361993719938199391994019941199421994319944199451994619947199481994919950199511995219953199541995519956199571995819959199601996119962199631996419965199661996719968199691997019971199721997319974199751997619977199781997919980199811998219983199841998519986199871998819989199901999119992199931999419995199961999719998199992000020001200022000320004200052000620007200082000920010200112001220013200142001520016200172001820019200202002120022200232002420025200262002720028200292003020031200322003320034200352003620037200382003920040200412004220043200442004520046200472004820049200502005120052200532005420055200562005720058200592006020061200622006320064200652006620067200682006920070200712007220073200742007520076200772007820079200802008120082200832008420085200862008720088200892009020091200922009320094200952009620097200982009920100201012010220103201042010520106201072010820109201102011120112201132011420115201162011720118201192012020121201222012320124201252012620127201282012920130201312013220133201342013520136201372013820139201402014120142201432014420145201462014720148201492015020151201522015320154201552015620157201582015920160201612016220163201642016520166201672016820169201702017120172201732017420175201762017720178201792018020181201822018320184201852018620187201882018920190201912019220193201942019520196201972019820199202002020120202202032020420205202062020720208202092021020211202122021320214202152021620217202182021920220202212022220223202242022520226202272022820229202302023120232202332023420235202362023720238202392024020241202422024320244202452024620247202482024920250202512025220253202542025520256202572025820259202602026120262202632026420265202662026720268202692027020271202722027320274202752027620277202782027920280202812028220283202842028520286202872028820289202902029120292202932029420295202962029720298202992030020301203022030320304203052030620307203082030920310203112031220313203142031520316203172031820319203202032120322203232032420325203262032720328203292033020331203322033320334203352033620337203382033920340203412034220343203442034520346203472034820349203502035120352203532035420355203562035720358203592036020361203622036320364203652036620367203682036920370203712037220373203742037520376203772037820379203802038120382203832038420385203862038720388203892039020391203922039320394203952039620397203982039920400204012040220403204042040520406204072040820409204102041120412204132041420415204162041720418204192042020421204222042320424204252042620427204282042920430204312043220433204342043520436204372043820439204402044120442204432044420445204462044720448204492045020451204522045320454204552045620457204582045920460204612046220463204642046520466204672046820469204702047120472204732047420475204762047720478204792048020481204822048320484204852048620487204882048920490204912049220493204942049520496204972049820499205002050120502205032050420505205062050720508205092051020511205122051320514205152051620517205182051920520205212052220523205242052520526205272052820529205302053120532205332053420535205362053720538205392054020541205422054320544205452054620547205482054920550205512055220553205542055520556205572055820559205602056120562205632056420565205662056720568205692057020571205722057320574205752057620577205782057920580205812058220583205842058520586205872058820589205902059120592205932059420595205962059720598205992060020601206022060320604206052060620607206082060920610206112061220613206142061520616206172061820619206202062120622206232062420625206262062720628206292063020631206322063320634206352063620637206382063920640206412064220643206442064520646206472064820649206502065120652206532065420655206562065720658206592066020661206622066320664206652066620667206682066920670206712067220673206742067520676206772067820679206802068120682206832068420685206862068720688206892069020691206922069320694206952069620697206982069920700207012070220703207042070520706207072070820709207102071120712207132071420715207162071720718207192072020721207222072320724207252072620727207282072920730207312073220733207342073520736207372073820739207402074120742207432074420745207462074720748207492075020751207522075320754207552075620757207582075920760207612076220763207642076520766207672076820769207702077120772207732077420775207762077720778207792078020781207822078320784207852078620787207882078920790207912079220793207942079520796207972079820799208002080120802208032080420805208062080720808208092081020811208122081320814208152081620817208182081920820208212082220823208242082520826208272082820829208302083120832208332083420835208362083720838208392084020841208422084320844208452084620847208482084920850208512085220853208542085520856208572085820859208602086120862208632086420865208662086720868208692087020871208722087320874208752087620877208782087920880208812088220883208842088520886208872088820889208902089120892208932089420895208962089720898208992090020901209022090320904209052090620907209082090920910209112091220913209142091520916209172091820919209202092120922209232092420925209262092720928209292093020931209322093320934209352093620937209382093920940209412094220943209442094520946209472094820949209502095120952209532095420955209562095720958209592096020961209622096320964209652096620967209682096920970209712097220973209742097520976209772097820979209802098120982209832098420985209862098720988209892099020991209922099320994209952099620997209982099921000210012100221003210042100521006210072100821009210102101121012210132101421015210162101721018210192102021021210222102321024210252102621027210282102921030210312103221033210342103521036210372103821039210402104121042210432104421045210462104721048210492105021051210522105321054210552105621057210582105921060210612106221063210642106521066210672106821069210702107121072210732107421075210762107721078210792108021081210822108321084210852108621087210882108921090210912109221093210942109521096210972109821099211002110121102211032110421105211062110721108211092111021111211122111321114211152111621117211182111921120211212112221123211242112521126211272112821129211302113121132211332113421135211362113721138211392114021141211422114321144211452114621147211482114921150211512115221153211542115521156211572115821159211602116121162211632116421165211662116721168211692117021171211722117321174211752117621177211782117921180211812118221183211842118521186211872118821189211902119121192211932119421195211962119721198211992120021201212022120321204212052120621207212082120921210212112121221213212142121521216212172121821219212202122121222212232122421225212262122721228212292123021231212322123321234212352123621237212382123921240212412124221243212442124521246212472124821249212502125121252212532125421255212562125721258212592126021261212622126321264212652126621267212682126921270212712127221273212742127521276212772127821279212802128121282212832128421285212862128721288212892129021291212922129321294212952129621297212982129921300213012130221303213042130521306213072130821309213102131121312213132131421315213162131721318213192132021321213222132321324213252132621327213282132921330213312133221333213342133521336213372133821339213402134121342213432134421345213462134721348213492135021351213522135321354213552135621357213582135921360213612136221363213642136521366213672136821369213702137121372213732137421375213762137721378213792138021381213822138321384213852138621387213882138921390213912139221393213942139521396213972139821399214002140121402214032140421405214062140721408214092141021411214122141321414214152141621417214182141921420214212142221423214242142521426214272142821429214302143121432214332143421435214362143721438214392144021441214422144321444214452144621447214482144921450214512145221453214542145521456214572145821459214602146121462214632146421465214662146721468214692147021471214722147321474214752147621477214782147921480214812148221483214842148521486214872148821489214902149121492214932149421495214962149721498214992150021501215022150321504215052150621507215082150921510215112151221513215142151521516215172151821519215202152121522215232152421525215262152721528215292153021531215322153321534215352153621537215382153921540215412154221543215442154521546215472154821549215502155121552215532155421555215562155721558215592156021561215622156321564215652156621567215682156921570215712157221573215742157521576215772157821579215802158121582215832158421585215862158721588215892159021591215922159321594215952159621597215982159921600216012160221603216042160521606216072160821609216102161121612216132161421615216162161721618216192162021621216222162321624216252162621627216282162921630216312163221633216342163521636216372163821639216402164121642216432164421645216462164721648216492165021651216522165321654216552165621657216582165921660216612166221663216642166521666216672166821669216702167121672216732167421675216762167721678216792168021681216822168321684216852168621687216882168921690216912169221693216942169521696216972169821699217002170121702217032170421705217062170721708217092171021711217122171321714217152171621717217182171921720217212172221723217242172521726217272172821729217302173121732217332173421735217362173721738217392174021741217422174321744217452174621747217482174921750217512175221753217542175521756217572175821759217602176121762217632176421765217662176721768217692177021771217722177321774217752177621777217782177921780217812178221783217842178521786217872178821789217902179121792217932179421795217962179721798217992180021801218022180321804218052180621807218082180921810218112181221813218142181521816218172181821819218202182121822218232182421825218262182721828218292183021831218322183321834218352183621837218382183921840218412184221843218442184521846218472184821849218502185121852218532185421855218562185721858218592186021861218622186321864218652186621867218682186921870218712187221873218742187521876218772187821879218802188121882218832188421885218862188721888218892189021891218922189321894218952189621897218982189921900219012190221903219042190521906219072190821909219102191121912219132191421915219162191721918219192192021921219222192321924219252192621927219282192921930219312193221933219342193521936219372193821939219402194121942219432194421945219462194721948219492195021951219522195321954219552195621957219582195921960219612196221963219642196521966219672196821969219702197121972219732197421975219762197721978219792198021981219822198321984219852198621987219882198921990219912199221993219942199521996219972199821999220002200122002220032200422005220062200722008220092201022011220122201322014220152201622017220182201922020220212202222023220242202522026220272202822029220302203122032220332203422035220362203722038220392204022041220422204322044220452204622047220482204922050220512205222053220542205522056220572205822059220602206122062220632206422065220662206722068220692207022071220722207322074220752207622077220782207922080220812208222083220842208522086220872208822089220902209122092220932209422095220962209722098220992210022101221022210322104221052210622107221082210922110221112211222113221142211522116221172211822119221202212122122221232212422125221262212722128221292213022131221322213322134221352213622137221382213922140221412214222143221442214522146221472214822149221502215122152221532215422155221562215722158221592216022161221622216322164221652216622167221682216922170221712217222173221742217522176221772217822179221802218122182221832218422185221862218722188221892219022191221922219322194221952219622197221982219922200222012220222203222042220522206222072220822209222102221122212222132221422215222162221722218222192222022221222222222322224222252222622227222282222922230222312223222233222342223522236222372223822239222402224122242222432224422245222462224722248222492225022251222522225322254222552225622257222582225922260222612226222263222642226522266222672226822269222702227122272222732227422275222762227722278222792228022281222822228322284222852228622287222882228922290222912229222293222942229522296222972229822299223002230122302223032230422305223062230722308223092231022311223122231322314223152231622317223182231922320223212232222323223242232522326223272232822329223302233122332223332233422335223362233722338223392234022341223422234322344223452234622347223482234922350223512235222353223542235522356223572235822359223602236122362223632236422365223662236722368223692237022371223722237322374223752237622377223782237922380223812238222383223842238522386223872238822389223902239122392223932239422395223962239722398223992240022401224022240322404224052240622407224082240922410224112241222413224142241522416224172241822419224202242122422224232242422425224262242722428224292243022431224322243322434224352243622437224382243922440224412244222443224442244522446224472244822449224502245122452224532245422455224562245722458224592246022461224622246322464224652246622467224682246922470224712247222473224742247522476224772247822479224802248122482224832248422485224862248722488224892249022491224922249322494224952249622497224982249922500225012250222503225042250522506225072250822509225102251122512225132251422515225162251722518225192252022521225222252322524225252252622527225282252922530225312253222533225342253522536225372253822539225402254122542225432254422545225462254722548225492255022551225522255322554225552255622557225582255922560225612256222563225642256522566225672256822569225702257122572225732257422575225762257722578225792258022581225822258322584225852258622587225882258922590225912259222593225942259522596225972259822599226002260122602226032260422605226062260722608226092261022611226122261322614226152261622617226182261922620226212262222623226242262522626226272262822629226302263122632226332263422635226362263722638226392264022641226422264322644226452264622647226482264922650226512265222653226542265522656226572265822659226602266122662226632266422665226662266722668226692267022671226722267322674226752267622677226782267922680226812268222683226842268522686226872268822689226902269122692226932269422695226962269722698226992270022701227022270322704227052270622707227082270922710227112271222713227142271522716227172271822719227202272122722227232272422725227262272722728227292273022731227322273322734227352273622737227382273922740227412274222743227442274522746227472274822749227502275122752227532275422755227562275722758227592276022761227622276322764227652276622767227682276922770227712277222773227742277522776227772277822779227802278122782227832278422785227862278722788227892279022791227922279322794227952279622797227982279922800228012280222803228042280522806228072280822809228102281122812228132281422815228162281722818228192282022821228222282322824228252282622827228282282922830228312283222833228342283522836228372283822839228402284122842228432284422845228462284722848228492285022851228522285322854228552285622857228582285922860228612286222863228642286522866228672286822869228702287122872228732287422875228762287722878228792288022881228822288322884228852288622887228882288922890228912289222893228942289522896228972289822899229002290122902229032290422905229062290722908229092291022911229122291322914229152291622917229182291922920229212292222923229242292522926229272292822929229302293122932229332293422935229362293722938229392294022941229422294322944229452294622947229482294922950229512295222953229542295522956229572295822959229602296122962229632296422965229662296722968229692297022971229722297322974229752297622977229782297922980229812298222983229842298522986229872298822989229902299122992229932299422995229962299722998229992300023001230022300323004230052300623007230082300923010230112301223013230142301523016230172301823019230202302123022230232302423025230262302723028230292303023031230322303323034230352303623037230382303923040230412304223043230442304523046230472304823049230502305123052230532305423055230562305723058230592306023061230622306323064230652306623067230682306923070230712307223073230742307523076230772307823079230802308123082230832308423085230862308723088230892309023091230922309323094230952309623097230982309923100231012310223103231042310523106231072310823109231102311123112231132311423115231162311723118231192312023121231222312323124231252312623127231282312923130231312313223133231342313523136231372313823139231402314123142231432314423145231462314723148231492315023151231522315323154231552315623157231582315923160231612316223163231642316523166231672316823169231702317123172231732317423175231762317723178231792318023181231822318323184231852318623187231882318923190231912319223193231942319523196231972319823199232002320123202232032320423205232062320723208232092321023211232122321323214232152321623217232182321923220232212322223223232242322523226232272322823229232302323123232232332323423235232362323723238232392324023241232422324323244232452324623247232482324923250232512325223253232542325523256232572325823259232602326123262232632326423265232662326723268232692327023271232722327323274232752327623277232782327923280232812328223283232842328523286232872328823289232902329123292232932329423295232962329723298232992330023301233022330323304233052330623307233082330923310233112331223313233142331523316233172331823319233202332123322233232332423325233262332723328233292333023331233322333323334233352333623337233382333923340233412334223343233442334523346233472334823349233502335123352233532335423355233562335723358233592336023361233622336323364233652336623367233682336923370233712337223373233742337523376233772337823379233802338123382233832338423385233862338723388233892339023391233922339323394233952339623397233982339923400234012340223403234042340523406234072340823409234102341123412234132341423415234162341723418234192342023421234222342323424234252342623427234282342923430234312343223433234342343523436234372343823439234402344123442234432344423445234462344723448234492345023451234522345323454234552345623457234582345923460234612346223463234642346523466234672346823469234702347123472234732347423475234762347723478234792348023481234822348323484234852348623487234882348923490234912349223493234942349523496234972349823499235002350123502235032350423505235062350723508235092351023511235122351323514235152351623517235182351923520235212352223523235242352523526235272352823529235302353123532235332353423535235362353723538235392354023541235422354323544235452354623547235482354923550235512355223553235542355523556235572355823559235602356123562235632356423565235662356723568235692357023571235722357323574235752357623577235782357923580235812358223583235842358523586235872358823589235902359123592235932359423595235962359723598235992360023601236022360323604236052360623607236082360923610236112361223613236142361523616236172361823619236202362123622236232362423625236262362723628236292363023631236322363323634236352363623637236382363923640236412364223643236442364523646236472364823649236502365123652236532365423655236562365723658236592366023661236622366323664236652366623667236682366923670236712367223673236742367523676236772367823679236802368123682236832368423685236862368723688236892369023691236922369323694236952369623697236982369923700237012370223703237042370523706237072370823709237102371123712237132371423715237162371723718237192372023721237222372323724237252372623727237282372923730237312373223733237342373523736237372373823739237402374123742237432374423745237462374723748237492375023751237522375323754237552375623757237582375923760237612376223763237642376523766237672376823769237702377123772237732377423775237762377723778237792378023781237822378323784237852378623787237882378923790237912379223793237942379523796237972379823799238002380123802238032380423805238062380723808238092381023811238122381323814238152381623817238182381923820238212382223823238242382523826238272382823829238302383123832238332383423835238362383723838238392384023841238422384323844238452384623847238482384923850238512385223853238542385523856238572385823859238602386123862238632386423865238662386723868238692387023871238722387323874238752387623877238782387923880238812388223883238842388523886238872388823889238902389123892238932389423895238962389723898238992390023901239022390323904239052390623907239082390923910239112391223913239142391523916239172391823919239202392123922239232392423925239262392723928239292393023931239322393323934239352393623937239382393923940239412394223943239442394523946239472394823949239502395123952239532395423955239562395723958239592396023961239622396323964239652396623967239682396923970239712397223973239742397523976239772397823979239802398123982239832398423985239862398723988239892399023991239922399323994239952399623997239982399924000240012400224003240042400524006240072400824009240102401124012240132401424015240162401724018240192402024021240222402324024240252402624027240282402924030240312403224033240342403524036240372403824039240402404124042240432404424045240462404724048240492405024051240522405324054240552405624057240582405924060240612406224063240642406524066240672406824069240702407124072240732407424075240762407724078240792408024081240822408324084240852408624087240882408924090240912409224093240942409524096240972409824099241002410124102241032410424105241062410724108241092411024111241122411324114241152411624117241182411924120241212412224123241242412524126241272412824129241302413124132241332413424135241362413724138241392414024141241422414324144241452414624147241482414924150241512415224153241542415524156241572415824159241602416124162241632416424165241662416724168241692417024171241722417324174241752417624177241782417924180241812418224183241842418524186241872418824189241902419124192241932419424195241962419724198241992420024201242022420324204242052420624207242082420924210242112421224213242142421524216242172421824219242202422124222242232422424225242262422724228242292423024231242322423324234242352423624237242382423924240242412424224243242442424524246242472424824249242502425124252242532425424255242562425724258242592426024261242622426324264242652426624267242682426924270242712427224273242742427524276242772427824279242802428124282242832428424285242862428724288242892429024291242922429324294242952429624297242982429924300243012430224303243042430524306243072430824309243102431124312243132431424315243162431724318243192432024321243222432324324243252432624327243282432924330243312433224333243342433524336243372433824339243402434124342243432434424345243462434724348243492435024351243522435324354243552435624357243582435924360243612436224363243642436524366243672436824369243702437124372243732437424375243762437724378243792438024381243822438324384243852438624387243882438924390243912439224393243942439524396243972439824399244002440124402244032440424405244062440724408244092441024411244122441324414244152441624417244182441924420244212442224423244242442524426244272442824429244302443124432244332443424435244362443724438244392444024441244422444324444244452444624447244482444924450244512445224453244542445524456244572445824459244602446124462244632446424465244662446724468244692447024471244722447324474244752447624477244782447924480244812448224483244842448524486244872448824489244902449124492244932449424495244962449724498244992450024501245022450324504245052450624507245082450924510245112451224513245142451524516245172451824519245202452124522245232452424525245262452724528245292453024531245322453324534245352453624537245382453924540245412454224543245442454524546245472454824549245502455124552245532455424555245562455724558245592456024561245622456324564245652456624567245682456924570245712457224573245742457524576245772457824579245802458124582245832458424585245862458724588245892459024591245922459324594245952459624597245982459924600246012460224603246042460524606246072460824609246102461124612246132461424615246162461724618246192462024621246222462324624246252462624627246282462924630246312463224633246342463524636246372463824639246402464124642246432464424645246462464724648246492465024651246522465324654246552465624657246582465924660246612466224663246642466524666246672466824669246702467124672246732467424675246762467724678246792468024681246822468324684246852468624687246882468924690246912469224693246942469524696246972469824699247002470124702247032470424705247062470724708247092471024711247122471324714247152471624717247182471924720247212472224723247242472524726247272472824729247302473124732247332473424735247362473724738247392474024741247422474324744247452474624747247482474924750247512475224753247542475524756247572475824759247602476124762247632476424765247662476724768247692477024771247722477324774247752477624777247782477924780247812478224783247842478524786247872478824789247902479124792247932479424795247962479724798247992480024801248022480324804248052480624807248082480924810248112481224813248142481524816248172481824819248202482124822248232482424825248262482724828248292483024831248322483324834248352483624837248382483924840248412484224843248442484524846248472484824849248502485124852248532485424855248562485724858248592486024861248622486324864248652486624867248682486924870248712487224873248742487524876248772487824879248802488124882248832488424885248862488724888248892489024891248922489324894248952489624897248982489924900249012490224903249042490524906249072490824909249102491124912249132491424915249162491724918249192492024921249222492324924249252492624927249282492924930249312493224933249342493524936249372493824939249402494124942249432494424945249462494724948249492495024951249522495324954249552495624957249582495924960249612496224963249642496524966249672496824969249702497124972249732497424975249762497724978249792498024981249822498324984249852498624987249882498924990249912499224993249942499524996249972499824999250002500125002250032500425005250062500725008250092501025011250122501325014250152501625017250182501925020250212502225023250242502525026250272502825029250302503125032250332503425035250362503725038250392504025041250422504325044250452504625047250482504925050250512505225053250542505525056250572505825059250602506125062250632506425065250662506725068250692507025071250722507325074250752507625077250782507925080250812508225083250842508525086250872508825089250902509125092250932509425095250962509725098250992510025101251022510325104251052510625107251082510925110251112511225113251142511525116251172511825119251202512125122251232512425125251262512725128251292513025131251322513325134251352513625137251382513925140251412514225143251442514525146251472514825149251502515125152251532515425155251562515725158251592516025161251622516325164251652516625167251682516925170251712517225173251742517525176251772517825179251802518125182251832518425185251862518725188251892519025191251922519325194251952519625197251982519925200252012520225203252042520525206252072520825209252102521125212252132521425215252162521725218252192522025221252222522325224252252522625227252282522925230252312523225233252342523525236252372523825239252402524125242252432524425245252462524725248252492525025251252522525325254252552525625257252582525925260252612526225263252642526525266252672526825269252702527125272252732527425275252762527725278252792528025281252822528325284252852528625287252882528925290252912529225293252942529525296252972529825299253002530125302253032530425305253062530725308253092531025311253122531325314253152531625317253182531925320253212532225323253242532525326253272532825329253302533125332253332533425335253362533725338253392534025341253422534325344253452534625347253482534925350253512535225353253542535525356253572535825359253602536125362253632536425365253662536725368253692537025371253722537325374253752537625377253782537925380253812538225383253842538525386253872538825389253902539125392253932539425395253962539725398253992540025401254022540325404254052540625407254082540925410254112541225413254142541525416254172541825419254202542125422254232542425425254262542725428254292543025431254322543325434254352543625437254382543925440254412544225443254442544525446254472544825449254502545125452254532545425455254562545725458254592546025461254622546325464254652546625467254682546925470254712547225473254742547525476254772547825479254802548125482254832548425485254862548725488254892549025491254922549325494254952549625497254982549925500255012550225503255042550525506255072550825509255102551125512255132551425515255162551725518255192552025521255222552325524255252552625527255282552925530255312553225533255342553525536255372553825539255402554125542255432554425545255462554725548255492555025551255522555325554255552555625557255582555925560255612556225563255642556525566255672556825569255702557125572255732557425575255762557725578255792558025581255822558325584255852558625587255882558925590255912559225593255942559525596255972559825599256002560125602256032560425605256062560725608256092561025611256122561325614256152561625617256182561925620256212562225623256242562525626256272562825629256302563125632256332563425635256362563725638256392564025641256422564325644256452564625647256482564925650256512565225653256542565525656256572565825659256602566125662256632566425665256662566725668256692567025671256722567325674256752567625677256782567925680256812568225683256842568525686256872568825689256902569125692256932569425695256962569725698256992570025701257022570325704257052570625707257082570925710257112571225713257142571525716257172571825719257202572125722257232572425725257262572725728257292573025731257322573325734257352573625737257382573925740257412574225743257442574525746257472574825749257502575125752257532575425755257562575725758257592576025761257622576325764257652576625767257682576925770257712577225773257742577525776257772577825779257802578125782257832578425785257862578725788257892579025791257922579325794257952579625797257982579925800258012580225803258042580525806258072580825809258102581125812258132581425815258162581725818258192582025821258222582325824258252582625827258282582925830258312583225833258342583525836258372583825839258402584125842258432584425845258462584725848258492585025851258522585325854258552585625857258582585925860258612586225863258642586525866258672586825869258702587125872258732587425875258762587725878258792588025881258822588325884258852588625887258882588925890258912589225893258942589525896258972589825899259002590125902259032590425905259062590725908259092591025911259122591325914259152591625917259182591925920259212592225923259242592525926259272592825929259302593125932259332593425935259362593725938259392594025941259422594325944259452594625947259482594925950259512595225953259542595525956259572595825959259602596125962259632596425965259662596725968259692597025971259722597325974259752597625977259782597925980259812598225983259842598525986259872598825989259902599125992259932599425995259962599725998259992600026001260022600326004260052600626007260082600926010260112601226013260142601526016260172601826019260202602126022260232602426025260262602726028260292603026031260322603326034260352603626037260382603926040260412604226043260442604526046260472604826049260502605126052260532605426055260562605726058260592606026061260622606326064260652606626067260682606926070260712607226073260742607526076260772607826079260802608126082260832608426085260862608726088260892609026091260922609326094260952609626097260982609926100261012610226103261042610526106261072610826109261102611126112261132611426115261162611726118261192612026121261222612326124261252612626127261282612926130261312613226133261342613526136261372613826139261402614126142261432614426145261462614726148261492615026151261522615326154261552615626157261582615926160261612616226163261642616526166261672616826169261702617126172261732617426175261762617726178261792618026181261822618326184261852618626187261882618926190261912619226193261942619526196261972619826199262002620126202262032620426205262062620726208262092621026211262122621326214262152621626217262182621926220262212622226223262242622526226262272622826229262302623126232262332623426235262362623726238262392624026241262422624326244262452624626247262482624926250262512625226253262542625526256262572625826259262602626126262262632626426265262662626726268262692627026271262722627326274262752627626277262782627926280262812628226283262842628526286262872628826289262902629126292262932629426295262962629726298262992630026301263022630326304263052630626307263082630926310263112631226313263142631526316263172631826319263202632126322263232632426325263262632726328263292633026331263322633326334263352633626337263382633926340263412634226343263442634526346263472634826349263502635126352263532635426355263562635726358263592636026361263622636326364263652636626367263682636926370263712637226373263742637526376263772637826379263802638126382263832638426385263862638726388263892639026391263922639326394263952639626397263982639926400264012640226403264042640526406264072640826409264102641126412264132641426415264162641726418264192642026421264222642326424264252642626427264282642926430264312643226433264342643526436264372643826439264402644126442264432644426445264462644726448264492645026451264522645326454264552645626457264582645926460264612646226463264642646526466264672646826469264702647126472264732647426475264762647726478264792648026481264822648326484264852648626487264882648926490264912649226493264942649526496264972649826499265002650126502265032650426505265062650726508265092651026511265122651326514265152651626517265182651926520265212652226523265242652526526265272652826529265302653126532265332653426535265362653726538265392654026541265422654326544265452654626547265482654926550265512655226553265542655526556265572655826559265602656126562265632656426565265662656726568265692657026571265722657326574265752657626577265782657926580265812658226583265842658526586265872658826589265902659126592265932659426595265962659726598265992660026601266022660326604266052660626607266082660926610266112661226613266142661526616266172661826619266202662126622266232662426625266262662726628266292663026631266322663326634266352663626637266382663926640266412664226643266442664526646266472664826649266502665126652266532665426655266562665726658266592666026661266622666326664266652666626667266682666926670266712667226673266742667526676266772667826679266802668126682266832668426685266862668726688266892669026691266922669326694266952669626697266982669926700267012670226703267042670526706267072670826709267102671126712267132671426715267162671726718267192672026721267222672326724267252672626727267282672926730267312673226733267342673526736267372673826739267402674126742267432674426745267462674726748267492675026751267522675326754267552675626757267582675926760267612676226763267642676526766267672676826769267702677126772267732677426775267762677726778267792678026781267822678326784267852678626787267882678926790267912679226793267942679526796267972679826799268002680126802268032680426805268062680726808268092681026811268122681326814268152681626817268182681926820268212682226823268242682526826268272682826829268302683126832268332683426835268362683726838268392684026841268422684326844268452684626847268482684926850268512685226853268542685526856268572685826859268602686126862268632686426865268662686726868268692687026871268722687326874268752687626877268782687926880268812688226883268842688526886268872688826889268902689126892268932689426895268962689726898268992690026901269022690326904269052690626907269082690926910269112691226913269142691526916269172691826919269202692126922269232692426925269262692726928269292693026931269322693326934269352693626937269382693926940269412694226943269442694526946269472694826949269502695126952269532695426955269562695726958269592696026961269622696326964269652696626967269682696926970269712697226973269742697526976269772697826979269802698126982269832698426985269862698726988269892699026991269922699326994269952699626997269982699927000270012700227003270042700527006270072700827009270102701127012270132701427015270162701727018270192702027021270222702327024270252702627027270282702927030270312703227033270342703527036270372703827039270402704127042270432704427045270462704727048270492705027051270522705327054270552705627057270582705927060270612706227063270642706527066270672706827069270702707127072270732707427075270762707727078270792708027081270822708327084270852708627087270882708927090270912709227093270942709527096270972709827099271002710127102271032710427105271062710727108271092711027111271122711327114271152711627117271182711927120271212712227123271242712527126271272712827129271302713127132271332713427135271362713727138271392714027141271422714327144271452714627147271482714927150271512715227153271542715527156271572715827159271602716127162271632716427165271662716727168271692717027171271722717327174271752717627177271782717927180271812718227183271842718527186271872718827189271902719127192271932719427195271962719727198271992720027201272022720327204272052720627207272082720927210272112721227213272142721527216272172721827219272202722127222272232722427225272262722727228272292723027231272322723327234272352723627237272382723927240272412724227243272442724527246272472724827249272502725127252272532725427255272562725727258272592726027261272622726327264272652726627267272682726927270272712727227273272742727527276272772727827279272802728127282272832728427285272862728727288272892729027291272922729327294272952729627297272982729927300273012730227303273042730527306273072730827309273102731127312273132731427315273162731727318273192732027321273222732327324273252732627327273282732927330273312733227333273342733527336273372733827339273402734127342273432734427345273462734727348273492735027351273522735327354273552735627357273582735927360273612736227363273642736527366273672736827369273702737127372273732737427375273762737727378273792738027381273822738327384273852738627387273882738927390273912739227393273942739527396273972739827399274002740127402274032740427405274062740727408274092741027411274122741327414274152741627417274182741927420274212742227423274242742527426274272742827429274302743127432274332743427435274362743727438274392744027441274422744327444274452744627447274482744927450274512745227453274542745527456274572745827459274602746127462274632746427465274662746727468274692747027471274722747327474274752747627477274782747927480274812748227483274842748527486274872748827489274902749127492274932749427495274962749727498274992750027501275022750327504275052750627507275082750927510275112751227513275142751527516275172751827519275202752127522275232752427525275262752727528275292753027531275322753327534275352753627537275382753927540275412754227543275442754527546275472754827549275502755127552275532755427555275562755727558275592756027561275622756327564275652756627567275682756927570275712757227573275742757527576275772757827579275802758127582275832758427585275862758727588275892759027591275922759327594275952759627597275982759927600276012760227603276042760527606276072760827609276102761127612276132761427615276162761727618276192762027621276222762327624276252762627627276282762927630276312763227633276342763527636276372763827639276402764127642276432764427645276462764727648276492765027651276522765327654276552765627657276582765927660276612766227663276642766527666276672766827669276702767127672276732767427675276762767727678276792768027681276822768327684276852768627687276882768927690276912769227693276942769527696276972769827699277002770127702277032770427705277062770727708277092771027711277122771327714277152771627717277182771927720277212772227723277242772527726277272772827729277302773127732277332773427735277362773727738277392774027741277422774327744277452774627747277482774927750277512775227753277542775527756277572775827759277602776127762277632776427765277662776727768277692777027771277722777327774277752777627777277782777927780277812778227783277842778527786277872778827789277902779127792277932779427795277962779727798277992780027801278022780327804278052780627807278082780927810278112781227813278142781527816278172781827819278202782127822278232782427825278262782727828278292783027831278322783327834278352783627837278382783927840278412784227843278442784527846278472784827849278502785127852278532785427855278562785727858278592786027861278622786327864278652786627867278682786927870278712787227873278742787527876278772787827879278802788127882278832788427885278862788727888278892789027891278922789327894278952789627897278982789927900279012790227903279042790527906279072790827909279102791127912279132791427915279162791727918279192792027921279222792327924279252792627927279282792927930279312793227933279342793527936279372793827939279402794127942279432794427945279462794727948279492795027951279522795327954279552795627957279582795927960279612796227963279642796527966279672796827969279702797127972279732797427975279762797727978279792798027981279822798327984279852798627987279882798927990279912799227993279942799527996279972799827999280002800128002280032800428005280062800728008280092801028011280122801328014280152801628017280182801928020280212802228023280242802528026280272802828029280302803128032280332803428035280362803728038280392804028041280422804328044280452804628047280482804928050280512805228053280542805528056280572805828059280602806128062280632806428065280662806728068280692807028071280722807328074280752807628077280782807928080280812808228083280842808528086280872808828089280902809128092280932809428095280962809728098280992810028101281022810328104281052810628107281082810928110281112811228113281142811528116281172811828119281202812128122281232812428125281262812728128281292813028131281322813328134281352813628137281382813928140281412814228143281442814528146281472814828149281502815128152281532815428155281562815728158281592816028161281622816328164281652816628167281682816928170281712817228173281742817528176281772817828179281802818128182281832818428185281862818728188281892819028191281922819328194281952819628197281982819928200282012820228203282042820528206282072820828209282102821128212282132821428215282162821728218282192822028221282222822328224282252822628227282282822928230282312823228233282342823528236282372823828239282402824128242282432824428245282462824728248282492825028251282522825328254282552825628257282582825928260282612826228263282642826528266282672826828269282702827128272282732827428275282762827728278282792828028281282822828328284282852828628287282882828928290282912829228293282942829528296282972829828299283002830128302283032830428305283062830728308283092831028311283122831328314283152831628317283182831928320283212832228323283242832528326283272832828329283302833128332283332833428335283362833728338283392834028341283422834328344283452834628347283482834928350283512835228353283542835528356283572835828359283602836128362283632836428365283662836728368283692837028371283722837328374283752837628377283782837928380283812838228383283842838528386283872838828389283902839128392283932839428395283962839728398283992840028401284022840328404284052840628407284082840928410284112841228413284142841528416284172841828419284202842128422284232842428425284262842728428284292843028431284322843328434284352843628437284382843928440284412844228443284442844528446284472844828449284502845128452284532845428455284562845728458284592846028461284622846328464284652846628467284682846928470284712847228473284742847528476284772847828479284802848128482284832848428485284862848728488284892849028491284922849328494284952849628497284982849928500285012850228503285042850528506285072850828509285102851128512285132851428515285162851728518285192852028521285222852328524285252852628527285282852928530285312853228533285342853528536285372853828539285402854128542285432854428545285462854728548285492855028551285522855328554285552855628557285582855928560285612856228563285642856528566285672856828569285702857128572285732857428575285762857728578285792858028581285822858328584285852858628587285882858928590285912859228593285942859528596285972859828599286002860128602286032860428605286062860728608286092861028611286122861328614286152861628617286182861928620286212862228623286242862528626286272862828629286302863128632286332863428635286362863728638286392864028641286422864328644286452864628647286482864928650286512865228653286542865528656286572865828659286602866128662286632866428665286662866728668286692867028671286722867328674286752867628677286782867928680286812868228683286842868528686286872868828689286902869128692286932869428695286962869728698286992870028701287022870328704287052870628707287082870928710287112871228713287142871528716287172871828719287202872128722287232872428725287262872728728287292873028731287322873328734287352873628737287382873928740287412874228743287442874528746287472874828749287502875128752287532875428755287562875728758287592876028761287622876328764287652876628767287682876928770287712877228773287742877528776287772877828779287802878128782287832878428785287862878728788287892879028791287922879328794287952879628797287982879928800288012880228803288042880528806288072880828809288102881128812288132881428815288162881728818288192882028821288222882328824288252882628827288282882928830288312883228833288342883528836288372883828839288402884128842288432884428845288462884728848288492885028851288522885328854288552885628857288582885928860288612886228863288642886528866288672886828869288702887128872288732887428875288762887728878288792888028881288822888328884288852888628887288882888928890288912889228893288942889528896288972889828899289002890128902289032890428905289062890728908289092891028911289122891328914289152891628917289182891928920289212892228923289242892528926289272892828929289302893128932289332893428935289362893728938289392894028941289422894328944289452894628947289482894928950289512895228953289542895528956289572895828959289602896128962289632896428965289662896728968289692897028971289722897328974289752897628977289782897928980289812898228983289842898528986289872898828989289902899128992289932899428995289962899728998289992900029001290022900329004290052900629007290082900929010290112901229013290142901529016290172901829019290202902129022290232902429025290262902729028290292903029031290322903329034290352903629037290382903929040290412904229043290442904529046290472904829049290502905129052290532905429055290562905729058290592906029061290622906329064290652906629067290682906929070290712907229073290742907529076290772907829079290802908129082290832908429085290862908729088290892909029091290922909329094290952909629097290982909929100291012910229103291042910529106291072910829109291102911129112291132911429115291162911729118291192912029121291222912329124291252912629127291282912929130291312913229133291342913529136291372913829139291402914129142291432914429145291462914729148291492915029151291522915329154291552915629157291582915929160291612916229163291642916529166291672916829169291702917129172291732917429175291762917729178291792918029181291822918329184291852918629187291882918929190291912919229193291942919529196291972919829199292002920129202292032920429205292062920729208292092921029211292122921329214292152921629217292182921929220292212922229223292242922529226292272922829229292302923129232292332923429235292362923729238292392924029241292422924329244292452924629247292482924929250292512925229253292542925529256292572925829259292602926129262292632926429265292662926729268292692927029271292722927329274292752927629277292782927929280292812928229283292842928529286292872928829289292902929129292292932929429295292962929729298292992930029301293022930329304293052930629307293082930929310293112931229313293142931529316293172931829319293202932129322293232932429325293262932729328293292933029331293322933329334293352933629337293382933929340293412934229343293442934529346293472934829349293502935129352293532935429355293562935729358293592936029361293622936329364293652936629367293682936929370293712937229373293742937529376293772937829379293802938129382293832938429385293862938729388293892939029391293922939329394293952939629397293982939929400294012940229403294042940529406294072940829409294102941129412294132941429415294162941729418294192942029421294222942329424294252942629427294282942929430294312943229433294342943529436294372943829439294402944129442294432944429445294462944729448294492945029451294522945329454294552945629457294582945929460294612946229463294642946529466294672946829469294702947129472294732947429475294762947729478294792948029481294822948329484294852948629487294882948929490294912949229493294942949529496294972949829499295002950129502295032950429505295062950729508295092951029511295122951329514295152951629517295182951929520295212952229523295242952529526295272952829529295302953129532295332953429535295362953729538295392954029541295422954329544295452954629547295482954929550295512955229553295542955529556295572955829559295602956129562295632956429565295662956729568295692957029571295722957329574295752957629577295782957929580295812958229583295842958529586295872958829589295902959129592295932959429595295962959729598295992960029601296022960329604296052960629607296082960929610296112961229613296142961529616296172961829619296202962129622296232962429625296262962729628296292963029631296322963329634296352963629637296382963929640296412964229643296442964529646296472964829649296502965129652296532965429655296562965729658296592966029661296622966329664296652966629667296682966929670296712967229673296742967529676296772967829679296802968129682296832968429685296862968729688296892969029691296922969329694296952969629697296982969929700297012970229703297042970529706297072970829709297102971129712297132971429715297162971729718297192972029721297222972329724297252972629727297282972929730297312973229733297342973529736297372973829739297402974129742297432974429745297462974729748297492975029751297522975329754297552975629757297582975929760297612976229763297642976529766297672976829769297702977129772297732977429775297762977729778297792978029781297822978329784297852978629787297882978929790297912979229793297942979529796297972979829799298002980129802298032980429805298062980729808298092981029811298122981329814298152981629817298182981929820298212982229823298242982529826298272982829829298302983129832298332983429835298362983729838298392984029841298422984329844298452984629847298482984929850298512985229853298542985529856298572985829859298602986129862298632986429865298662986729868298692987029871298722987329874298752987629877298782987929880298812988229883298842988529886298872988829889298902989129892298932989429895298962989729898298992990029901299022990329904299052990629907299082990929910299112991229913299142991529916299172991829919299202992129922299232992429925299262992729928299292993029931299322993329934299352993629937299382993929940299412994229943299442994529946299472994829949299502995129952299532995429955299562995729958299592996029961299622996329964299652996629967299682996929970299712997229973299742997529976299772997829979299802998129982299832998429985299862998729988299892999029991299922999329994299952999629997299982999930000300013000230003300043000530006300073000830009300103001130012300133001430015300163001730018300193002030021300223002330024300253002630027300283002930030300313003230033300343003530036300373003830039300403004130042300433004430045300463004730048300493005030051300523005330054300553005630057300583005930060300613006230063300643006530066300673006830069300703007130072300733007430075300763007730078300793008030081300823008330084300853008630087300883008930090300913009230093300943009530096300973009830099301003010130102301033010430105301063010730108301093011030111301123011330114301153011630117301183011930120301213012230123301243012530126301273012830129301303013130132301333013430135301363013730138301393014030141301423014330144301453014630147301483014930150301513015230153301543015530156301573015830159301603016130162301633016430165301663016730168301693017030171301723017330174301753017630177301783017930180301813018230183301843018530186301873018830189301903019130192301933019430195301963019730198301993020030201302023020330204302053020630207302083020930210302113021230213302143021530216302173021830219302203022130222302233022430225302263022730228302293023030231302323023330234302353023630237302383023930240302413024230243302443024530246302473024830249302503025130252302533025430255302563025730258302593026030261302623026330264302653026630267302683026930270302713027230273302743027530276302773027830279302803028130282302833028430285302863028730288302893029030291302923029330294302953029630297302983029930300303013030230303303043030530306303073030830309303103031130312303133031430315303163031730318303193032030321303223032330324303253032630327303283032930330303313033230333303343033530336303373033830339303403034130342303433034430345303463034730348303493035030351303523035330354303553035630357303583035930360303613036230363303643036530366303673036830369303703037130372303733037430375303763037730378303793038030381303823038330384303853038630387303883038930390303913039230393303943039530396303973039830399304003040130402304033040430405304063040730408304093041030411304123041330414304153041630417304183041930420304213042230423304243042530426304273042830429304303043130432304333043430435304363043730438304393044030441304423044330444304453044630447304483044930450304513045230453304543045530456304573045830459304603046130462304633046430465304663046730468304693047030471304723047330474304753047630477304783047930480304813048230483304843048530486304873048830489304903049130492304933049430495304963049730498304993050030501305023050330504305053050630507305083050930510305113051230513305143051530516305173051830519305203052130522305233052430525305263052730528305293053030531305323053330534305353053630537305383053930540305413054230543305443054530546305473054830549305503055130552305533055430555305563055730558305593056030561305623056330564305653056630567305683056930570305713057230573305743057530576305773057830579305803058130582305833058430585305863058730588305893059030591305923059330594305953059630597305983059930600306013060230603306043060530606306073060830609306103061130612306133061430615306163061730618306193062030621306223062330624306253062630627306283062930630306313063230633306343063530636306373063830639306403064130642306433064430645306463064730648306493065030651306523065330654306553065630657306583065930660306613066230663306643066530666306673066830669306703067130672306733067430675306763067730678306793068030681306823068330684306853068630687306883068930690306913069230693306943069530696306973069830699307003070130702307033070430705307063070730708307093071030711307123071330714307153071630717307183071930720307213072230723307243072530726307273072830729307303073130732307333073430735307363073730738307393074030741307423074330744307453074630747307483074930750307513075230753307543075530756307573075830759307603076130762307633076430765307663076730768307693077030771307723077330774307753077630777307783077930780307813078230783307843078530786307873078830789307903079130792307933079430795307963079730798307993080030801308023080330804308053080630807308083080930810308113081230813308143081530816308173081830819308203082130822308233082430825308263082730828308293083030831308323083330834308353083630837308383083930840308413084230843308443084530846308473084830849308503085130852308533085430855308563085730858308593086030861308623086330864308653086630867308683086930870308713087230873308743087530876308773087830879308803088130882308833088430885308863088730888308893089030891308923089330894308953089630897308983089930900309013090230903309043090530906309073090830909309103091130912309133091430915309163091730918309193092030921309223092330924309253092630927309283092930930309313093230933309343093530936309373093830939309403094130942309433094430945309463094730948309493095030951309523095330954309553095630957309583095930960309613096230963309643096530966309673096830969309703097130972309733097430975309763097730978309793098030981309823098330984309853098630987309883098930990309913099230993309943099530996309973099830999310003100131002310033100431005310063100731008310093101031011310123101331014310153101631017310183101931020310213102231023310243102531026310273102831029310303103131032310333103431035310363103731038310393104031041310423104331044310453104631047310483104931050310513105231053310543105531056310573105831059310603106131062310633106431065310663106731068310693107031071310723107331074310753107631077310783107931080310813108231083310843108531086310873108831089310903109131092310933109431095310963109731098310993110031101311023110331104311053110631107311083110931110311113111231113311143111531116311173111831119311203112131122311233112431125311263112731128311293113031131311323113331134311353113631137311383113931140311413114231143311443114531146311473114831149311503115131152311533115431155311563115731158311593116031161311623116331164311653116631167311683116931170311713117231173311743117531176311773117831179311803118131182311833118431185311863118731188311893119031191311923119331194311953119631197311983119931200312013120231203312043120531206312073120831209312103121131212312133121431215312163121731218312193122031221312223122331224312253122631227312283122931230312313123231233312343123531236312373123831239312403124131242312433124431245312463124731248312493125031251312523125331254312553125631257312583125931260312613126231263312643126531266312673126831269312703127131272312733127431275312763127731278312793128031281312823128331284312853128631287312883128931290312913129231293312943129531296312973129831299313003130131302313033130431305313063130731308313093131031311313123131331314313153131631317313183131931320313213132231323313243132531326313273132831329313303133131332313333133431335313363133731338313393134031341313423134331344313453134631347313483134931350313513135231353313543135531356313573135831359313603136131362313633136431365313663136731368313693137031371313723137331374313753137631377313783137931380313813138231383313843138531386313873138831389313903139131392313933139431395313963139731398313993140031401314023140331404314053140631407314083140931410314113141231413314143141531416314173141831419314203142131422314233142431425314263142731428314293143031431314323143331434314353143631437314383143931440314413144231443314443144531446314473144831449314503145131452314533145431455314563145731458314593146031461314623146331464314653146631467314683146931470314713147231473314743147531476314773147831479314803148131482314833148431485314863148731488314893149031491314923149331494314953149631497314983149931500315013150231503315043150531506315073150831509315103151131512315133151431515315163151731518315193152031521315223152331524315253152631527315283152931530315313153231533315343153531536315373153831539315403154131542315433154431545315463154731548315493155031551315523155331554315553155631557315583155931560315613156231563315643156531566315673156831569315703157131572315733157431575315763157731578315793158031581315823158331584315853158631587315883158931590315913159231593315943159531596315973159831599316003160131602316033160431605316063160731608316093161031611316123161331614316153161631617316183161931620316213162231623316243162531626316273162831629316303163131632316333163431635316363163731638316393164031641316423164331644316453164631647316483164931650316513165231653316543165531656316573165831659316603166131662316633166431665316663166731668316693167031671316723167331674316753167631677316783167931680316813168231683316843168531686316873168831689316903169131692316933169431695316963169731698316993170031701317023170331704317053170631707317083170931710317113171231713317143171531716317173171831719317203172131722317233172431725317263172731728317293173031731317323173331734317353173631737317383173931740317413174231743317443174531746317473174831749317503175131752317533175431755317563175731758317593176031761317623176331764317653176631767317683176931770317713177231773317743177531776317773177831779317803178131782317833178431785317863178731788317893179031791317923179331794317953179631797317983179931800318013180231803318043180531806318073180831809318103181131812318133181431815318163181731818318193182031821318223182331824318253182631827318283182931830318313183231833318343183531836318373183831839318403184131842318433184431845318463184731848318493185031851318523185331854318553185631857318583185931860318613186231863318643186531866318673186831869318703187131872318733187431875318763187731878318793188031881318823188331884318853188631887318883188931890318913189231893318943189531896318973189831899319003190131902319033190431905319063190731908319093191031911319123191331914319153191631917319183191931920319213192231923319243192531926319273192831929319303193131932319333193431935319363193731938319393194031941319423194331944319453194631947319483194931950319513195231953319543195531956319573195831959319603196131962319633196431965319663196731968319693197031971319723197331974319753197631977319783197931980319813198231983319843198531986319873198831989319903199131992319933199431995319963199731998319993200032001320023200332004320053200632007320083200932010320113201232013320143201532016320173201832019320203202132022320233202432025320263202732028320293203032031320323203332034320353203632037320383203932040320413204232043320443204532046320473204832049320503205132052320533205432055320563205732058320593206032061320623206332064320653206632067320683206932070320713207232073320743207532076320773207832079320803208132082320833208432085320863208732088320893209032091320923209332094320953209632097320983209932100321013210232103321043210532106321073210832109321103211132112321133211432115321163211732118321193212032121321223212332124321253212632127321283212932130321313213232133321343213532136321373213832139321403214132142321433214432145321463214732148321493215032151321523215332154321553215632157321583215932160321613216232163321643216532166321673216832169321703217132172321733217432175321763217732178321793218032181321823218332184321853218632187321883218932190321913219232193321943219532196321973219832199322003220132202322033220432205322063220732208322093221032211322123221332214322153221632217322183221932220322213222232223322243222532226322273222832229322303223132232322333223432235322363223732238322393224032241322423224332244322453224632247322483224932250322513225232253322543225532256322573225832259322603226132262322633226432265322663226732268322693227032271322723227332274322753227632277322783227932280322813228232283322843228532286322873228832289322903229132292322933229432295322963229732298322993230032301323023230332304323053230632307323083230932310323113231232313323143231532316323173231832319323203232132322323233232432325323263232732328323293233032331323323233332334323353233632337323383233932340323413234232343323443234532346323473234832349323503235132352323533235432355323563235732358323593236032361323623236332364323653236632367323683236932370323713237232373323743237532376323773237832379323803238132382323833238432385323863238732388323893239032391323923239332394323953239632397323983239932400324013240232403324043240532406324073240832409324103241132412324133241432415324163241732418324193242032421324223242332424324253242632427324283242932430324313243232433324343243532436324373243832439324403244132442324433244432445324463244732448324493245032451324523245332454324553245632457324583245932460324613246232463324643246532466324673246832469324703247132472324733247432475324763247732478324793248032481324823248332484324853248632487324883248932490324913249232493324943249532496324973249832499325003250132502325033250432505325063250732508325093251032511325123251332514325153251632517325183251932520325213252232523325243252532526325273252832529325303253132532325333253432535325363253732538325393254032541325423254332544325453254632547325483254932550325513255232553325543255532556325573255832559325603256132562325633256432565325663256732568325693257032571325723257332574325753257632577325783257932580325813258232583325843258532586325873258832589325903259132592325933259432595325963259732598325993260032601326023260332604326053260632607326083260932610326113261232613326143261532616326173261832619326203262132622326233262432625326263262732628326293263032631326323263332634326353263632637326383263932640326413264232643326443264532646326473264832649326503265132652326533265432655326563265732658326593266032661326623266332664326653266632667326683266932670326713267232673326743267532676326773267832679326803268132682326833268432685326863268732688326893269032691326923269332694326953269632697326983269932700327013270232703327043270532706327073270832709327103271132712327133271432715327163271732718327193272032721327223272332724327253272632727327283272932730327313273232733327343273532736327373273832739327403274132742327433274432745327463274732748327493275032751327523275332754327553275632757327583275932760327613276232763327643276532766327673276832769327703277132772327733277432775327763277732778327793278032781327823278332784327853278632787327883278932790327913279232793327943279532796327973279832799328003280132802328033280432805328063280732808328093281032811328123281332814328153281632817328183281932820328213282232823328243282532826328273282832829328303283132832328333283432835328363283732838328393284032841328423284332844328453284632847328483284932850328513285232853328543285532856328573285832859328603286132862328633286432865328663286732868328693287032871328723287332874328753287632877328783287932880328813288232883328843288532886328873288832889328903289132892328933289432895328963289732898328993290032901329023290332904329053290632907329083290932910329113291232913329143291532916329173291832919329203292132922329233292432925329263292732928329293293032931329323293332934329353293632937329383293932940329413294232943329443294532946329473294832949329503295132952329533295432955329563295732958329593296032961329623296332964329653296632967329683296932970329713297232973329743297532976329773297832979329803298132982329833298432985329863298732988329893299032991329923299332994329953299632997329983299933000330013300233003330043300533006330073300833009330103301133012330133301433015330163301733018330193302033021330223302333024330253302633027330283302933030330313303233033330343303533036330373303833039330403304133042330433304433045330463304733048330493305033051330523305333054330553305633057330583305933060330613306233063330643306533066330673306833069330703307133072330733307433075330763307733078330793308033081330823308333084330853308633087330883308933090330913309233093330943309533096330973309833099331003310133102331033310433105331063310733108331093311033111331123311333114331153311633117331183311933120331213312233123331243312533126331273312833129331303313133132331333313433135331363313733138331393314033141331423314333144331453314633147331483314933150331513315233153331543315533156331573315833159331603316133162331633316433165331663316733168331693317033171331723317333174331753317633177331783317933180331813318233183331843318533186331873318833189331903319133192331933319433195331963319733198331993320033201332023320333204332053320633207332083320933210332113321233213332143321533216332173321833219332203322133222332233322433225332263322733228332293323033231332323323333234332353323633237332383323933240332413324233243332443324533246332473324833249332503325133252332533325433255332563325733258332593326033261332623326333264332653326633267332683326933270332713327233273332743327533276332773327833279332803328133282332833328433285332863328733288332893329033291332923329333294332953329633297332983329933300333013330233303333043330533306333073330833309333103331133312333133331433315333163331733318333193332033321333223332333324333253332633327333283332933330333313333233333333343333533336333373333833339333403334133342333433334433345333463334733348333493335033351333523335333354333553335633357333583335933360333613336233363333643336533366333673336833369333703337133372333733337433375333763337733378333793338033381333823338333384333853338633387333883338933390333913339233393333943339533396333973339833399334003340133402334033340433405334063340733408334093341033411334123341333414334153341633417334183341933420334213342233423334243342533426334273342833429334303343133432334333343433435334363343733438334393344033441334423344333444334453344633447334483344933450334513345233453334543345533456334573345833459334603346133462334633346433465334663346733468334693347033471334723347333474334753347633477334783347933480334813348233483334843348533486334873348833489334903349133492334933349433495334963349733498334993350033501335023350333504335053350633507335083350933510335113351233513335143351533516335173351833519335203352133522335233352433525335263352733528335293353033531335323353333534335353353633537335383353933540335413354233543335443354533546335473354833549335503355133552335533355433555335563355733558335593356033561335623356333564335653356633567335683356933570335713357233573335743357533576335773357833579335803358133582335833358433585335863358733588335893359033591335923359333594335953359633597335983359933600336013360233603336043360533606336073360833609336103361133612336133361433615336163361733618336193362033621336223362333624336253362633627336283362933630336313363233633336343363533636336373363833639336403364133642336433364433645336463364733648336493365033651336523365333654336553365633657336583365933660336613366233663336643366533666336673366833669336703367133672336733367433675336763367733678336793368033681336823368333684336853368633687336883368933690336913369233693336943369533696336973369833699337003370133702337033370433705337063370733708337093371033711337123371333714337153371633717337183371933720337213372233723337243372533726337273372833729337303373133732337333373433735337363373733738337393374033741337423374333744337453374633747337483374933750337513375233753337543375533756337573375833759337603376133762337633376433765337663376733768337693377033771337723377333774337753377633777337783377933780337813378233783337843378533786337873378833789337903379133792337933379433795337963379733798337993380033801338023380333804338053380633807338083380933810338113381233813338143381533816338173381833819338203382133822338233382433825338263382733828338293383033831338323383333834338353383633837338383383933840338413384233843338443384533846338473384833849338503385133852338533385433855338563385733858338593386033861338623386333864338653386633867338683386933870338713387233873338743387533876338773387833879338803388133882338833388433885338863388733888338893389033891338923389333894338953389633897338983389933900339013390233903339043390533906339073390833909339103391133912339133391433915339163391733918339193392033921339223392333924339253392633927339283392933930339313393233933339343393533936339373393833939339403394133942339433394433945339463394733948339493395033951339523395333954339553395633957339583395933960339613396233963339643396533966339673396833969339703397133972339733397433975339763397733978339793398033981339823398333984339853398633987339883398933990339913399233993339943399533996339973399833999340003400134002340033400434005340063400734008340093401034011340123401334014340153401634017340183401934020340213402234023340243402534026340273402834029340303403134032340333403434035340363403734038340393404034041340423404334044340453404634047340483404934050340513405234053340543405534056340573405834059340603406134062340633406434065340663406734068340693407034071340723407334074340753407634077340783407934080340813408234083340843408534086340873408834089340903409134092340933409434095340963409734098340993410034101341023410334104341053410634107341083410934110341113411234113341143411534116341173411834119341203412134122341233412434125341263412734128341293413034131341323413334134341353413634137341383413934140341413414234143341443414534146341473414834149341503415134152341533415434155341563415734158341593416034161341623416334164341653416634167341683416934170341713417234173341743417534176341773417834179341803418134182341833418434185341863418734188341893419034191341923419334194341953419634197341983419934200342013420234203342043420534206342073420834209342103421134212342133421434215342163421734218342193422034221342223422334224342253422634227342283422934230342313423234233342343423534236342373423834239342403424134242342433424434245342463424734248342493425034251342523425334254342553425634257342583425934260342613426234263342643426534266342673426834269342703427134272342733427434275342763427734278342793428034281342823428334284342853428634287342883428934290342913429234293342943429534296342973429834299343003430134302343033430434305343063430734308343093431034311343123431334314343153431634317343183431934320343213432234323343243432534326343273432834329343303433134332343333433434335343363433734338343393434034341343423434334344343453434634347343483434934350343513435234353343543435534356343573435834359343603436134362343633436434365343663436734368343693437034371343723437334374343753437634377343783437934380343813438234383343843438534386343873438834389343903439134392343933439434395343963439734398343993440034401344023440334404344053440634407344083440934410344113441234413344143441534416344173441834419344203442134422344233442434425344263442734428344293443034431344323443334434344353443634437344383443934440344413444234443344443444534446344473444834449344503445134452344533445434455344563445734458344593446034461344623446334464344653446634467344683446934470344713447234473344743447534476344773447834479344803448134482344833448434485344863448734488344893449034491344923449334494344953449634497344983449934500345013450234503345043450534506345073450834509345103451134512345133451434515345163451734518345193452034521345223452334524345253452634527345283452934530345313453234533345343453534536345373453834539345403454134542345433454434545345463454734548345493455034551345523455334554345553455634557345583455934560345613456234563345643456534566345673456834569345703457134572345733457434575345763457734578345793458034581345823458334584345853458634587345883458934590345913459234593345943459534596345973459834599346003460134602346033460434605346063460734608346093461034611346123461334614346153461634617346183461934620346213462234623346243462534626346273462834629346303463134632346333463434635346363463734638346393464034641346423464334644346453464634647346483464934650346513465234653346543465534656346573465834659346603466134662346633466434665346663466734668346693467034671346723467334674346753467634677346783467934680346813468234683346843468534686346873468834689346903469134692346933469434695346963469734698346993470034701347023470334704347053470634707347083470934710347113471234713347143471534716347173471834719347203472134722347233472434725347263472734728347293473034731347323473334734347353473634737347383473934740347413474234743347443474534746347473474834749347503475134752347533475434755347563475734758347593476034761347623476334764347653476634767347683476934770347713477234773347743477534776347773477834779347803478134782347833478434785347863478734788347893479034791347923479334794347953479634797347983479934800348013480234803348043480534806348073480834809348103481134812348133481434815348163481734818348193482034821348223482334824348253482634827348283482934830348313483234833348343483534836348373483834839348403484134842348433484434845348463484734848348493485034851348523485334854348553485634857348583485934860348613486234863348643486534866348673486834869348703487134872348733487434875348763487734878348793488034881348823488334884348853488634887348883488934890348913489234893348943489534896348973489834899349003490134902349033490434905349063490734908349093491034911349123491334914349153491634917349183491934920349213492234923349243492534926349273492834929349303493134932349333493434935349363493734938349393494034941349423494334944349453494634947349483494934950349513495234953349543495534956349573495834959349603496134962349633496434965349663496734968349693497034971349723497334974349753497634977349783497934980349813498234983349843498534986349873498834989349903499134992349933499434995349963499734998349993500035001350023500335004350053500635007350083500935010350113501235013350143501535016350173501835019350203502135022350233502435025350263502735028350293503035031350323503335034350353503635037350383503935040350413504235043350443504535046350473504835049350503505135052350533505435055350563505735058350593506035061350623506335064350653506635067350683506935070350713507235073350743507535076350773507835079350803508135082350833508435085350863508735088350893509035091350923509335094350953509635097350983509935100351013510235103351043510535106351073510835109351103511135112351133511435115351163511735118351193512035121351223512335124351253512635127351283512935130351313513235133351343513535136351373513835139351403514135142351433514435145351463514735148351493515035151351523515335154351553515635157351583515935160351613516235163351643516535166351673516835169351703517135172351733517435175351763517735178351793518035181351823518335184351853518635187351883518935190351913519235193351943519535196351973519835199352003520135202352033520435205352063520735208352093521035211352123521335214352153521635217352183521935220352213522235223352243522535226352273522835229352303523135232352333523435235352363523735238352393524035241352423524335244352453524635247352483524935250352513525235253352543525535256352573525835259352603526135262352633526435265352663526735268352693527035271352723527335274352753527635277352783527935280352813528235283352843528535286352873528835289352903529135292352933529435295352963529735298352993530035301353023530335304353053530635307353083530935310353113531235313353143531535316353173531835319353203532135322353233532435325353263532735328353293533035331353323533335334353353533635337353383533935340353413534235343353443534535346353473534835349353503535135352353533535435355353563535735358353593536035361353623536335364353653536635367353683536935370353713537235373353743537535376353773537835379353803538135382353833538435385353863538735388353893539035391353923539335394353953539635397353983539935400354013540235403354043540535406354073540835409354103541135412354133541435415354163541735418354193542035421354223542335424354253542635427354283542935430354313543235433354343543535436354373543835439354403544135442354433544435445354463544735448354493545035451354523545335454354553545635457354583545935460354613546235463354643546535466354673546835469354703547135472354733547435475354763547735478354793548035481354823548335484354853548635487354883548935490354913549235493354943549535496354973549835499355003550135502355033550435505355063550735508355093551035511355123551335514355153551635517355183551935520355213552235523355243552535526355273552835529355303553135532355333553435535355363553735538355393554035541355423554335544355453554635547355483554935550355513555235553355543555535556355573555835559355603556135562355633556435565355663556735568355693557035571355723557335574355753557635577355783557935580355813558235583355843558535586355873558835589355903559135592355933559435595355963559735598355993560035601356023560335604356053560635607356083560935610356113561235613356143561535616356173561835619356203562135622356233562435625356263562735628356293563035631356323563335634356353563635637356383563935640356413564235643356443564535646356473564835649356503565135652356533565435655356563565735658356593566035661356623566335664356653566635667356683566935670356713567235673356743567535676356773567835679356803568135682356833568435685356863568735688356893569035691356923569335694356953569635697356983569935700357013570235703357043570535706357073570835709357103571135712357133571435715357163571735718357193572035721357223572335724357253572635727357283572935730357313573235733357343573535736357373573835739357403574135742357433574435745357463574735748357493575035751357523575335754357553575635757357583575935760357613576235763357643576535766357673576835769357703577135772357733577435775357763577735778357793578035781357823578335784357853578635787357883578935790357913579235793357943579535796357973579835799358003580135802358033580435805358063580735808358093581035811358123581335814358153581635817358183581935820358213582235823358243582535826358273582835829358303583135832358333583435835358363583735838358393584035841358423584335844358453584635847358483584935850358513585235853358543585535856358573585835859358603586135862358633586435865358663586735868358693587035871358723587335874358753587635877358783587935880358813588235883358843588535886358873588835889358903589135892358933589435895358963589735898358993590035901359023590335904359053590635907359083590935910359113591235913359143591535916359173591835919359203592135922359233592435925359263592735928359293593035931359323593335934359353593635937359383593935940359413594235943359443594535946359473594835949359503595135952359533595435955359563595735958359593596035961359623596335964359653596635967359683596935970359713597235973359743597535976359773597835979359803598135982359833598435985359863598735988359893599035991359923599335994359953599635997359983599936000360013600236003360043600536006360073600836009360103601136012360133601436015360163601736018360193602036021360223602336024360253602636027360283602936030360313603236033360343603536036360373603836039360403604136042360433604436045360463604736048360493605036051360523605336054360553605636057360583605936060360613606236063360643606536066360673606836069360703607136072360733607436075360763607736078360793608036081360823608336084360853608636087360883608936090360913609236093360943609536096360973609836099361003610136102361033610436105361063610736108361093611036111361123611336114361153611636117361183611936120361213612236123361243612536126361273612836129361303613136132361333613436135361363613736138361393614036141361423614336144361453614636147361483614936150361513615236153361543615536156361573615836159361603616136162361633616436165361663616736168361693617036171361723617336174361753617636177361783617936180361813618236183361843618536186361873618836189361903619136192361933619436195361963619736198361993620036201362023620336204362053620636207362083620936210362113621236213362143621536216362173621836219362203622136222362233622436225362263622736228362293623036231362323623336234362353623636237362383623936240362413624236243362443624536246362473624836249362503625136252362533625436255362563625736258362593626036261362623626336264362653626636267362683626936270362713627236273362743627536276362773627836279362803628136282362833628436285362863628736288362893629036291362923629336294362953629636297362983629936300363013630236303363043630536306363073630836309363103631136312363133631436315363163631736318363193632036321363223632336324363253632636327363283632936330363313633236333363343633536336363373633836339363403634136342363433634436345363463634736348363493635036351363523635336354363553635636357363583635936360363613636236363363643636536366363673636836369363703637136372363733637436375363763637736378363793638036381363823638336384363853638636387363883638936390363913639236393363943639536396363973639836399364003640136402364033640436405364063640736408364093641036411364123641336414364153641636417364183641936420364213642236423364243642536426364273642836429364303643136432364333643436435364363643736438364393644036441364423644336444364453644636447364483644936450364513645236453364543645536456364573645836459364603646136462364633646436465364663646736468364693647036471364723647336474364753647636477364783647936480364813648236483364843648536486364873648836489364903649136492364933649436495364963649736498364993650036501365023650336504365053650636507365083650936510365113651236513365143651536516365173651836519365203652136522365233652436525365263652736528365293653036531365323653336534365353653636537365383653936540365413654236543365443654536546365473654836549365503655136552365533655436555365563655736558365593656036561365623656336564365653656636567365683656936570365713657236573365743657536576365773657836579365803658136582365833658436585365863658736588365893659036591365923659336594365953659636597365983659936600366013660236603366043660536606366073660836609366103661136612366133661436615366163661736618366193662036621366223662336624366253662636627366283662936630366313663236633366343663536636366373663836639366403664136642366433664436645366463664736648366493665036651366523665336654366553665636657366583665936660366613666236663366643666536666366673666836669366703667136672366733667436675366763667736678366793668036681366823668336684366853668636687366883668936690366913669236693366943669536696366973669836699367003670136702367033670436705367063670736708367093671036711367123671336714367153671636717367183671936720367213672236723367243672536726367273672836729367303673136732367333673436735367363673736738367393674036741367423674336744367453674636747367483674936750367513675236753367543675536756367573675836759367603676136762367633676436765367663676736768367693677036771367723677336774367753677636777367783677936780367813678236783367843678536786367873678836789367903679136792367933679436795367963679736798367993680036801368023680336804368053680636807368083680936810368113681236813368143681536816368173681836819368203682136822368233682436825368263682736828368293683036831368323683336834368353683636837368383683936840368413684236843368443684536846368473684836849368503685136852368533685436855368563685736858368593686036861368623686336864368653686636867368683686936870368713687236873368743687536876368773687836879368803688136882368833688436885368863688736888368893689036891368923689336894368953689636897368983689936900369013690236903369043690536906369073690836909369103691136912369133691436915369163691736918369193692036921369223692336924369253692636927369283692936930369313693236933369343693536936369373693836939369403694136942369433694436945369463694736948369493695036951369523695336954369553695636957369583695936960369613696236963369643696536966369673696836969369703697136972369733697436975369763697736978369793698036981369823698336984369853698636987369883698936990369913699236993369943699536996369973699836999370003700137002370033700437005370063700737008370093701037011370123701337014370153701637017370183701937020370213702237023370243702537026370273702837029370303703137032370333703437035370363703737038370393704037041370423704337044370453704637047370483704937050370513705237053370543705537056370573705837059370603706137062370633706437065370663706737068370693707037071370723707337074370753707637077370783707937080370813708237083370843708537086370873708837089370903709137092370933709437095370963709737098370993710037101371023710337104371053710637107371083710937110371113711237113371143711537116371173711837119371203712137122371233712437125371263712737128371293713037131371323713337134371353713637137371383713937140371413714237143371443714537146371473714837149371503715137152371533715437155371563715737158371593716037161371623716337164371653716637167371683716937170371713717237173371743717537176371773717837179371803718137182371833718437185371863718737188371893719037191371923719337194371953719637197371983719937200372013720237203372043720537206372073720837209372103721137212372133721437215372163721737218372193722037221372223722337224372253722637227372283722937230372313723237233372343723537236372373723837239372403724137242372433724437245372463724737248372493725037251372523725337254372553725637257372583725937260372613726237263372643726537266372673726837269372703727137272372733727437275372763727737278372793728037281372823728337284372853728637287372883728937290372913729237293372943729537296372973729837299373003730137302373033730437305373063730737308373093731037311373123731337314373153731637317373183731937320373213732237323373243732537326373273732837329373303733137332373333733437335373363733737338373393734037341373423734337344373453734637347373483734937350373513735237353373543735537356373573735837359373603736137362373633736437365373663736737368373693737037371373723737337374373753737637377373783737937380373813738237383373843738537386373873738837389373903739137392373933739437395373963739737398373993740037401374023740337404374053740637407374083740937410374113741237413374143741537416374173741837419374203742137422374233742437425374263742737428374293743037431374323743337434374353743637437374383743937440374413744237443374443744537446374473744837449374503745137452374533745437455374563745737458374593746037461374623746337464374653746637467374683746937470374713747237473374743747537476374773747837479374803748137482374833748437485374863748737488374893749037491374923749337494374953749637497374983749937500375013750237503375043750537506375073750837509375103751137512375133751437515375163751737518375193752037521375223752337524375253752637527375283752937530375313753237533375343753537536375373753837539375403754137542375433754437545375463754737548375493755037551375523755337554375553755637557375583755937560375613756237563375643756537566375673756837569375703757137572375733757437575375763757737578375793758037581375823758337584375853758637587375883758937590375913759237593375943759537596375973759837599376003760137602376033760437605376063760737608376093761037611376123761337614376153761637617376183761937620376213762237623376243762537626376273762837629376303763137632376333763437635376363763737638376393764037641376423764337644376453764637647376483764937650376513765237653376543765537656376573765837659376603766137662376633766437665376663766737668376693767037671376723767337674376753767637677376783767937680376813768237683376843768537686376873768837689376903769137692376933769437695376963769737698376993770037701377023770337704377053770637707377083770937710377113771237713377143771537716377173771837719377203772137722377233772437725377263772737728377293773037731377323773337734377353773637737377383773937740377413774237743377443774537746377473774837749377503775137752377533775437755377563775737758377593776037761377623776337764377653776637767377683776937770377713777237773377743777537776377773777837779377803778137782377833778437785377863778737788377893779037791377923779337794377953779637797377983779937800378013780237803378043780537806378073780837809378103781137812378133781437815378163781737818378193782037821378223782337824378253782637827378283782937830378313783237833378343783537836378373783837839378403784137842378433784437845378463784737848378493785037851378523785337854378553785637857378583785937860378613786237863378643786537866378673786837869378703787137872378733787437875378763787737878378793788037881378823788337884378853788637887378883788937890378913789237893378943789537896378973789837899379003790137902379033790437905379063790737908379093791037911379123791337914379153791637917379183791937920379213792237923379243792537926379273792837929379303793137932379333793437935379363793737938379393794037941379423794337944379453794637947379483794937950379513795237953379543795537956379573795837959379603796137962379633796437965379663796737968379693797037971379723797337974379753797637977379783797937980379813798237983379843798537986379873798837989379903799137992379933799437995379963799737998379993800038001380023800338004380053800638007380083800938010380113801238013380143801538016380173801838019380203802138022380233802438025380263802738028380293803038031380323803338034380353803638037380383803938040380413804238043380443804538046380473804838049380503805138052380533805438055380563805738058380593806038061380623806338064380653806638067380683806938070380713807238073380743807538076380773807838079380803808138082380833808438085380863808738088380893809038091380923809338094380953809638097380983809938100381013810238103381043810538106381073810838109381103811138112381133811438115381163811738118381193812038121381223812338124381253812638127381283812938130381313813238133381343813538136381373813838139381403814138142381433814438145381463814738148381493815038151381523815338154381553815638157381583815938160381613816238163381643816538166381673816838169381703817138172381733817438175381763817738178381793818038181381823818338184381853818638187381883818938190381913819238193381943819538196381973819838199382003820138202382033820438205382063820738208382093821038211382123821338214382153821638217382183821938220382213822238223382243822538226382273822838229382303823138232382333823438235382363823738238382393824038241382423824338244382453824638247382483824938250382513825238253382543825538256382573825838259382603826138262382633826438265382663826738268382693827038271382723827338274382753827638277382783827938280382813828238283382843828538286382873828838289382903829138292382933829438295382963829738298382993830038301383023830338304383053830638307383083830938310383113831238313383143831538316383173831838319383203832138322383233832438325383263832738328383293833038331383323833338334383353833638337383383833938340383413834238343383443834538346383473834838349383503835138352383533835438355383563835738358383593836038361383623836338364383653836638367383683836938370383713837238373383743837538376383773837838379383803838138382383833838438385383863838738388383893839038391383923839338394383953839638397383983839938400384013840238403384043840538406384073840838409384103841138412384133841438415384163841738418384193842038421384223842338424384253842638427384283842938430384313843238433384343843538436384373843838439384403844138442384433844438445384463844738448384493845038451384523845338454384553845638457384583845938460384613846238463384643846538466384673846838469384703847138472384733847438475384763847738478384793848038481384823848338484384853848638487384883848938490384913849238493384943849538496384973849838499385003850138502385033850438505385063850738508385093851038511385123851338514385153851638517385183851938520385213852238523385243852538526385273852838529385303853138532385333853438535385363853738538385393854038541385423854338544385453854638547385483854938550385513855238553385543855538556385573855838559385603856138562385633856438565385663856738568385693857038571385723857338574385753857638577385783857938580385813858238583385843858538586385873858838589385903859138592385933859438595385963859738598385993860038601386023860338604386053860638607386083860938610386113861238613386143861538616386173861838619386203862138622386233862438625386263862738628386293863038631386323863338634386353863638637386383863938640386413864238643386443864538646386473864838649386503865138652386533865438655386563865738658386593866038661386623866338664386653866638667386683866938670386713867238673386743867538676386773867838679386803868138682386833868438685386863868738688386893869038691386923869338694386953869638697386983869938700387013870238703387043870538706387073870838709387103871138712387133871438715387163871738718387193872038721387223872338724387253872638727387283872938730387313873238733387343873538736387373873838739387403874138742387433874438745387463874738748387493875038751387523875338754387553875638757387583875938760387613876238763387643876538766387673876838769387703877138772387733877438775387763877738778387793878038781387823878338784387853878638787387883878938790387913879238793387943879538796387973879838799388003880138802388033880438805388063880738808388093881038811388123881338814388153881638817388183881938820388213882238823388243882538826388273882838829388303883138832388333883438835388363883738838388393884038841388423884338844388453884638847388483884938850388513885238853388543885538856388573885838859388603886138862388633886438865388663886738868388693887038871388723887338874388753887638877388783887938880388813888238883388843888538886388873888838889388903889138892388933889438895388963889738898388993890038901389023890338904389053890638907389083890938910389113891238913389143891538916389173891838919389203892138922389233892438925389263892738928389293893038931389323893338934389353893638937389383893938940389413894238943389443894538946389473894838949389503895138952389533895438955389563895738958389593896038961389623896338964389653896638967389683896938970389713897238973389743897538976389773897838979389803898138982389833898438985389863898738988389893899038991389923899338994389953899638997389983899939000390013900239003390043900539006390073900839009390103901139012390133901439015390163901739018390193902039021390223902339024390253902639027390283902939030390313903239033390343903539036390373903839039390403904139042390433904439045390463904739048390493905039051390523905339054390553905639057390583905939060390613906239063390643906539066390673906839069390703907139072390733907439075390763907739078390793908039081390823908339084390853908639087390883908939090390913909239093390943909539096390973909839099391003910139102391033910439105391063910739108391093911039111391123911339114391153911639117391183911939120391213912239123391243912539126391273912839129391303913139132391333913439135391363913739138391393914039141391423914339144391453914639147391483914939150391513915239153391543915539156391573915839159391603916139162391633916439165391663916739168391693917039171391723917339174391753917639177391783917939180391813918239183391843918539186391873918839189391903919139192391933919439195391963919739198391993920039201392023920339204392053920639207392083920939210392113921239213392143921539216392173921839219392203922139222392233922439225392263922739228392293923039231392323923339234392353923639237392383923939240392413924239243392443924539246392473924839249392503925139252392533925439255392563925739258392593926039261392623926339264392653926639267392683926939270392713927239273392743927539276392773927839279392803928139282392833928439285392863928739288392893929039291392923929339294392953929639297392983929939300393013930239303393043930539306393073930839309393103931139312393133931439315393163931739318393193932039321393223932339324393253932639327393283932939330393313933239333393343933539336393373933839339393403934139342393433934439345393463934739348393493935039351393523935339354393553935639357393583935939360393613936239363393643936539366393673936839369393703937139372393733937439375393763937739378393793938039381393823938339384393853938639387393883938939390393913939239393393943939539396393973939839399394003940139402394033940439405394063940739408394093941039411394123941339414394153941639417394183941939420394213942239423394243942539426394273942839429394303943139432394333943439435394363943739438394393944039441394423944339444394453944639447394483944939450394513945239453394543945539456394573945839459394603946139462394633946439465394663946739468394693947039471394723947339474394753947639477394783947939480394813948239483394843948539486394873948839489394903949139492394933949439495394963949739498394993950039501395023950339504395053950639507395083950939510395113951239513395143951539516395173951839519395203952139522395233952439525395263952739528395293953039531395323953339534395353953639537395383953939540395413954239543395443954539546395473954839549395503955139552395533955439555395563955739558395593956039561395623956339564395653956639567395683956939570395713957239573395743957539576395773957839579395803958139582395833958439585395863958739588395893959039591395923959339594395953959639597395983959939600396013960239603396043960539606396073960839609396103961139612396133961439615396163961739618396193962039621396223962339624396253962639627396283962939630396313963239633396343963539636396373963839639396403964139642396433964439645396463964739648396493965039651396523965339654396553965639657396583965939660396613966239663396643966539666396673966839669396703967139672396733967439675396763967739678396793968039681396823968339684396853968639687396883968939690396913969239693396943969539696396973969839699397003970139702397033970439705397063970739708397093971039711397123971339714397153971639717397183971939720397213972239723397243972539726397273972839729397303973139732397333973439735397363973739738397393974039741397423974339744397453974639747397483974939750397513975239753397543975539756397573975839759397603976139762397633976439765397663976739768397693977039771397723977339774397753977639777397783977939780397813978239783397843978539786397873978839789397903979139792397933979439795397963979739798397993980039801398023980339804398053980639807398083980939810398113981239813398143981539816398173981839819398203982139822398233982439825398263982739828398293983039831398323983339834398353983639837398383983939840398413984239843398443984539846398473984839849398503985139852398533985439855398563985739858398593986039861398623986339864398653986639867398683986939870398713987239873398743987539876398773987839879398803988139882398833988439885398863988739888398893989039891398923989339894398953989639897398983989939900399013990239903399043990539906399073990839909399103991139912399133991439915399163991739918399193992039921399223992339924399253992639927399283992939930399313993239933399343993539936399373993839939399403994139942399433994439945399463994739948399493995039951399523995339954399553995639957399583995939960399613996239963399643996539966399673996839969399703997139972399733997439975399763997739978399793998039981399823998339984399853998639987399883998939990399913999239993399943999539996399973999839999400004000140002400034000440005400064000740008400094001040011400124001340014400154001640017400184001940020400214002240023400244002540026400274002840029400304003140032400334003440035400364003740038400394004040041400424004340044400454004640047400484004940050400514005240053400544005540056400574005840059400604006140062400634006440065400664006740068400694007040071400724007340074400754007640077400784007940080400814008240083400844008540086400874008840089400904009140092400934009440095400964009740098400994010040101401024010340104401054010640107401084010940110401114011240113401144011540116401174011840119401204012140122401234012440125401264012740128401294013040131401324013340134401354013640137401384013940140401414014240143401444014540146401474014840149401504015140152401534015440155401564015740158401594016040161401624016340164401654016640167401684016940170401714017240173401744017540176401774017840179401804018140182401834018440185401864018740188401894019040191401924019340194401954019640197401984019940200402014020240203402044020540206402074020840209402104021140212402134021440215402164021740218402194022040221402224022340224402254022640227402284022940230402314023240233402344023540236402374023840239402404024140242402434024440245402464024740248402494025040251402524025340254402554025640257402584025940260402614026240263402644026540266402674026840269402704027140272402734027440275402764027740278402794028040281402824028340284402854028640287402884028940290402914029240293402944029540296402974029840299403004030140302403034030440305403064030740308403094031040311403124031340314403154031640317403184031940320403214032240323403244032540326403274032840329403304033140332403334033440335403364033740338403394034040341403424034340344403454034640347403484034940350403514035240353403544035540356403574035840359403604036140362403634036440365403664036740368403694037040371403724037340374403754037640377403784037940380403814038240383403844038540386403874038840389403904039140392403934039440395403964039740398403994040040401404024040340404404054040640407404084040940410404114041240413404144041540416404174041840419404204042140422404234042440425404264042740428404294043040431404324043340434404354043640437404384043940440404414044240443404444044540446404474044840449404504045140452404534045440455404564045740458404594046040461404624046340464404654046640467404684046940470404714047240473404744047540476404774047840479404804048140482404834048440485404864048740488404894049040491404924049340494404954049640497404984049940500405014050240503405044050540506405074050840509405104051140512405134051440515405164051740518405194052040521405224052340524405254052640527405284052940530405314053240533405344053540536405374053840539405404054140542405434054440545405464054740548405494055040551405524055340554405554055640557405584055940560405614056240563405644056540566405674056840569405704057140572405734057440575405764057740578405794058040581405824058340584405854058640587405884058940590405914059240593405944059540596405974059840599406004060140602406034060440605406064060740608406094061040611406124061340614406154061640617406184061940620406214062240623406244062540626406274062840629406304063140632406334063440635406364063740638406394064040641406424064340644406454064640647406484064940650406514065240653406544065540656406574065840659406604066140662406634066440665406664066740668406694067040671406724067340674406754067640677406784067940680406814068240683406844068540686406874068840689406904069140692406934069440695406964069740698406994070040701407024070340704407054070640707407084070940710407114071240713407144071540716407174071840719407204072140722407234072440725407264072740728407294073040731407324073340734407354073640737407384073940740407414074240743407444074540746407474074840749407504075140752407534075440755407564075740758407594076040761407624076340764407654076640767407684076940770407714077240773407744077540776407774077840779407804078140782407834078440785407864078740788407894079040791407924079340794407954079640797407984079940800408014080240803408044080540806408074080840809408104081140812408134081440815408164081740818408194082040821408224082340824408254082640827408284082940830408314083240833408344083540836408374083840839408404084140842408434084440845408464084740848408494085040851408524085340854408554085640857408584085940860408614086240863408644086540866408674086840869408704087140872408734087440875408764087740878408794088040881408824088340884408854088640887408884088940890408914089240893408944089540896408974089840899409004090140902409034090440905409064090740908409094091040911409124091340914409154091640917409184091940920409214092240923409244092540926409274092840929409304093140932409334093440935409364093740938409394094040941409424094340944409454094640947409484094940950409514095240953409544095540956409574095840959409604096140962409634096440965409664096740968409694097040971409724097340974409754097640977409784097940980409814098240983409844098540986409874098840989409904099140992409934099440995409964099740998409994100041001410024100341004410054100641007410084100941010410114101241013410144101541016410174101841019410204102141022410234102441025410264102741028410294103041031410324103341034410354103641037410384103941040410414104241043410444104541046410474104841049410504105141052410534105441055410564105741058410594106041061410624106341064410654106641067410684106941070410714107241073410744107541076410774107841079410804108141082410834108441085410864108741088410894109041091410924109341094410954109641097410984109941100411014110241103411044110541106411074110841109411104111141112411134111441115411164111741118411194112041121411224112341124411254112641127411284112941130411314113241133411344113541136411374113841139411404114141142411434114441145411464114741148411494115041151411524115341154411554115641157411584115941160411614116241163411644116541166411674116841169411704117141172411734117441175411764117741178411794118041181411824118341184411854118641187411884118941190411914119241193411944119541196411974119841199412004120141202412034120441205412064120741208412094121041211412124121341214412154121641217412184121941220412214122241223412244122541226412274122841229412304123141232412334123441235412364123741238412394124041241412424124341244412454124641247412484124941250412514125241253412544125541256412574125841259412604126141262412634126441265412664126741268412694127041271412724127341274412754127641277412784127941280412814128241283412844128541286412874128841289412904129141292412934129441295412964129741298412994130041301413024130341304413054130641307413084130941310413114131241313413144131541316413174131841319413204132141322413234132441325413264132741328413294133041331413324133341334413354133641337413384133941340413414134241343413444134541346413474134841349413504135141352413534135441355413564135741358413594136041361413624136341364413654136641367413684136941370413714137241373413744137541376413774137841379413804138141382413834138441385413864138741388413894139041391413924139341394413954139641397413984139941400414014140241403414044140541406414074140841409414104141141412414134141441415414164141741418414194142041421414224142341424414254142641427414284142941430414314143241433414344143541436414374143841439414404144141442414434144441445414464144741448414494145041451414524145341454414554145641457414584145941460414614146241463414644146541466414674146841469414704147141472414734147441475414764147741478414794148041481414824148341484414854148641487414884148941490414914149241493414944149541496414974149841499415004150141502415034150441505415064150741508415094151041511415124151341514415154151641517415184151941520415214152241523415244152541526415274152841529415304153141532415334153441535415364153741538415394154041541415424154341544415454154641547415484154941550415514155241553415544155541556415574155841559415604156141562415634156441565415664156741568415694157041571415724157341574415754157641577415784157941580415814158241583415844158541586415874158841589415904159141592415934159441595415964159741598415994160041601416024160341604416054160641607416084160941610416114161241613416144161541616416174161841619416204162141622416234162441625416264162741628416294163041631416324163341634416354163641637416384163941640416414164241643416444164541646416474164841649416504165141652416534165441655416564165741658416594166041661416624166341664416654166641667416684166941670416714167241673416744167541676416774167841679416804168141682416834168441685416864168741688416894169041691416924169341694416954169641697416984169941700417014170241703417044170541706417074170841709417104171141712417134171441715417164171741718417194172041721417224172341724417254172641727417284172941730417314173241733417344173541736417374173841739417404174141742417434174441745417464174741748417494175041751417524175341754417554175641757417584175941760417614176241763417644176541766417674176841769417704177141772417734177441775417764177741778417794178041781417824178341784417854178641787417884178941790417914179241793417944179541796417974179841799418004180141802418034180441805418064180741808418094181041811418124181341814418154181641817418184181941820418214182241823418244182541826418274182841829418304183141832418334183441835418364183741838418394184041841418424184341844418454184641847418484184941850418514185241853418544185541856418574185841859418604186141862418634186441865418664186741868418694187041871418724187341874418754187641877418784187941880418814188241883418844188541886418874188841889418904189141892418934189441895418964189741898418994190041901419024190341904419054190641907419084190941910419114191241913419144191541916419174191841919419204192141922419234192441925419264192741928419294193041931419324193341934419354193641937419384193941940419414194241943419444194541946419474194841949419504195141952419534195441955419564195741958419594196041961419624196341964419654196641967419684196941970419714197241973419744197541976419774197841979419804198141982419834198441985419864198741988419894199041991419924199341994419954199641997419984199942000420014200242003420044200542006420074200842009420104201142012420134201442015420164201742018420194202042021420224202342024420254202642027420284202942030420314203242033420344203542036420374203842039420404204142042420434204442045420464204742048420494205042051420524205342054420554205642057420584205942060420614206242063420644206542066420674206842069420704207142072420734207442075420764207742078420794208042081420824208342084420854208642087420884208942090420914209242093420944209542096420974209842099421004210142102421034210442105421064210742108421094211042111421124211342114421154211642117421184211942120421214212242123421244212542126421274212842129421304213142132421334213442135421364213742138421394214042141421424214342144421454214642147421484214942150421514215242153421544215542156421574215842159421604216142162421634216442165421664216742168421694217042171421724217342174421754217642177421784217942180421814218242183421844218542186421874218842189421904219142192421934219442195421964219742198421994220042201422024220342204422054220642207422084220942210422114221242213422144221542216422174221842219422204222142222422234222442225422264222742228422294223042231422324223342234422354223642237422384223942240422414224242243422444224542246422474224842249422504225142252422534225442255422564225742258422594226042261422624226342264422654226642267422684226942270422714227242273422744227542276422774227842279422804228142282422834228442285422864228742288422894229042291422924229342294422954229642297422984229942300423014230242303423044230542306423074230842309423104231142312423134231442315423164231742318423194232042321423224232342324423254232642327423284232942330423314233242333423344233542336423374233842339423404234142342423434234442345423464234742348423494235042351423524235342354423554235642357423584235942360423614236242363423644236542366423674236842369423704237142372423734237442375423764237742378423794238042381423824238342384423854238642387423884238942390423914239242393423944239542396423974239842399424004240142402424034240442405424064240742408424094241042411424124241342414424154241642417424184241942420424214242242423424244242542426424274242842429424304243142432424334243442435424364243742438424394244042441424424244342444424454244642447424484244942450424514245242453424544245542456424574245842459424604246142462424634246442465424664246742468424694247042471424724247342474424754247642477424784247942480424814248242483424844248542486424874248842489424904249142492424934249442495424964249742498424994250042501425024250342504425054250642507425084250942510425114251242513425144251542516425174251842519425204252142522425234252442525425264252742528425294253042531425324253342534425354253642537425384253942540425414254242543425444254542546425474254842549425504255142552425534255442555425564255742558425594256042561425624256342564425654256642567425684256942570425714257242573425744257542576425774257842579425804258142582425834258442585425864258742588425894259042591425924259342594425954259642597425984259942600426014260242603426044260542606426074260842609426104261142612426134261442615426164261742618426194262042621426224262342624426254262642627426284262942630426314263242633426344263542636426374263842639426404264142642426434264442645426464264742648426494265042651426524265342654426554265642657426584265942660426614266242663426644266542666426674266842669426704267142672426734267442675426764267742678426794268042681426824268342684426854268642687426884268942690426914269242693426944269542696426974269842699427004270142702427034270442705427064270742708427094271042711427124271342714427154271642717427184271942720427214272242723427244272542726427274272842729427304273142732427334273442735427364273742738427394274042741427424274342744427454274642747427484274942750427514275242753427544275542756427574275842759427604276142762427634276442765427664276742768427694277042771427724277342774427754277642777427784277942780427814278242783427844278542786427874278842789427904279142792427934279442795427964279742798427994280042801428024280342804428054280642807428084280942810428114281242813428144281542816428174281842819428204282142822428234282442825428264282742828428294283042831428324283342834428354283642837428384283942840428414284242843428444284542846428474284842849428504285142852428534285442855428564285742858428594286042861428624286342864428654286642867428684286942870428714287242873428744287542876428774287842879428804288142882428834288442885428864288742888428894289042891428924289342894428954289642897428984289942900429014290242903429044290542906429074290842909429104291142912429134291442915429164291742918429194292042921429224292342924429254292642927429284292942930429314293242933429344293542936429374293842939429404294142942429434294442945429464294742948429494295042951429524295342954429554295642957429584295942960429614296242963429644296542966429674296842969429704297142972429734297442975429764297742978429794298042981429824298342984429854298642987429884298942990429914299242993429944299542996429974299842999430004300143002430034300443005430064300743008430094301043011430124301343014430154301643017430184301943020430214302243023430244302543026430274302843029430304303143032430334303443035430364303743038430394304043041430424304343044430454304643047430484304943050430514305243053430544305543056430574305843059430604306143062430634306443065430664306743068430694307043071430724307343074430754307643077430784307943080430814308243083430844308543086430874308843089430904309143092430934309443095430964309743098430994310043101431024310343104431054310643107431084310943110431114311243113431144311543116431174311843119431204312143122431234312443125431264312743128431294313043131431324313343134431354313643137431384313943140431414314243143431444314543146431474314843149431504315143152431534315443155431564315743158431594316043161431624316343164431654316643167431684316943170431714317243173431744317543176431774317843179431804318143182431834318443185431864318743188431894319043191431924319343194431954319643197431984319943200432014320243203432044320543206432074320843209432104321143212432134321443215432164321743218432194322043221432224322343224432254322643227432284322943230432314323243233432344323543236432374323843239432404324143242432434324443245432464324743248432494325043251432524325343254432554325643257432584325943260432614326243263432644326543266432674326843269432704327143272432734327443275432764327743278432794328043281432824328343284432854328643287432884328943290432914329243293432944329543296432974329843299433004330143302433034330443305433064330743308433094331043311433124331343314433154331643317433184331943320433214332243323433244332543326433274332843329433304333143332433334333443335433364333743338433394334043341433424334343344433454334643347433484334943350433514335243353433544335543356433574335843359433604336143362433634336443365433664336743368433694337043371433724337343374433754337643377433784337943380433814338243383433844338543386433874338843389433904339143392433934339443395433964339743398433994340043401434024340343404434054340643407434084340943410434114341243413434144341543416434174341843419434204342143422434234342443425434264342743428434294343043431434324343343434434354343643437434384343943440434414344243443434444344543446434474344843449434504345143452434534345443455434564345743458434594346043461434624346343464434654346643467434684346943470434714347243473434744347543476434774347843479434804348143482434834348443485434864348743488434894349043491434924349343494434954349643497434984349943500435014350243503435044350543506435074350843509435104351143512435134351443515435164351743518435194352043521435224352343524435254352643527435284352943530435314353243533435344353543536435374353843539435404354143542435434354443545435464354743548435494355043551435524355343554435554355643557435584355943560435614356243563435644356543566435674356843569435704357143572435734357443575435764357743578435794358043581435824358343584435854358643587435884358943590435914359243593435944359543596435974359843599436004360143602436034360443605436064360743608436094361043611436124361343614436154361643617436184361943620436214362243623436244362543626436274362843629436304363143632436334363443635436364363743638436394364043641436424364343644436454364643647436484364943650436514365243653436544365543656436574365843659436604366143662436634366443665436664366743668436694367043671436724367343674436754367643677436784367943680436814368243683436844368543686436874368843689436904369143692436934369443695436964369743698436994370043701437024370343704437054370643707437084370943710437114371243713437144371543716437174371843719437204372143722437234372443725437264372743728437294373043731437324373343734437354373643737437384373943740437414374243743437444374543746437474374843749437504375143752437534375443755437564375743758437594376043761437624376343764437654376643767437684376943770437714377243773437744377543776437774377843779437804378143782437834378443785437864378743788437894379043791437924379343794437954379643797437984379943800438014380243803438044380543806438074380843809438104381143812438134381443815438164381743818438194382043821438224382343824438254382643827438284382943830438314383243833438344383543836438374383843839438404384143842438434384443845438464384743848438494385043851438524385343854438554385643857438584385943860438614386243863438644386543866438674386843869438704387143872438734387443875438764387743878438794388043881438824388343884438854388643887438884388943890438914389243893438944389543896438974389843899439004390143902439034390443905439064390743908439094391043911439124391343914439154391643917439184391943920439214392243923439244392543926439274392843929439304393143932439334393443935439364393743938439394394043941439424394343944439454394643947439484394943950439514395243953439544395543956439574395843959439604396143962439634396443965439664396743968439694397043971439724397343974439754397643977439784397943980439814398243983439844398543986439874398843989439904399143992439934399443995439964399743998439994400044001440024400344004440054400644007440084400944010440114401244013440144401544016440174401844019440204402144022440234402444025440264402744028440294403044031440324403344034440354403644037440384403944040440414404244043440444404544046440474404844049440504405144052440534405444055440564405744058440594406044061440624406344064440654406644067440684406944070440714407244073440744407544076440774407844079440804408144082440834408444085440864408744088440894409044091440924409344094440954409644097440984409944100441014410244103441044410544106441074410844109441104411144112441134411444115441164411744118441194412044121441224412344124441254412644127441284412944130441314413244133441344413544136441374413844139441404414144142441434414444145441464414744148441494415044151441524415344154441554415644157441584415944160441614416244163441644416544166441674416844169441704417144172441734417444175441764417744178441794418044181441824418344184441854418644187441884418944190441914419244193441944419544196441974419844199442004420144202442034420444205442064420744208442094421044211442124421344214442154421644217442184421944220442214422244223442244422544226442274422844229442304423144232442334423444235442364423744238442394424044241442424424344244442454424644247442484424944250442514425244253442544425544256442574425844259442604426144262442634426444265442664426744268442694427044271442724427344274442754427644277442784427944280442814428244283442844428544286442874428844289442904429144292442934429444295442964429744298442994430044301443024430344304443054430644307443084430944310443114431244313443144431544316443174431844319443204432144322443234432444325443264432744328443294433044331443324433344334443354433644337443384433944340443414434244343443444434544346443474434844349443504435144352443534435444355443564435744358443594436044361443624436344364443654436644367443684436944370443714437244373443744437544376443774437844379443804438144382443834438444385443864438744388443894439044391443924439344394443954439644397443984439944400444014440244403444044440544406444074440844409444104441144412444134441444415444164441744418444194442044421444224442344424444254442644427444284442944430444314443244433444344443544436444374443844439444404444144442444434444444445444464444744448444494445044451444524445344454444554445644457444584445944460444614446244463444644446544466444674446844469444704447144472444734447444475444764447744478444794448044481444824448344484444854448644487444884448944490444914449244493444944449544496444974449844499445004450144502445034450444505445064450744508445094451044511445124451344514445154451644517445184451944520445214452244523445244452544526445274452844529445304453144532445334453444535445364453744538445394454044541445424454344544445454454644547445484454944550445514455244553445544455544556445574455844559445604456144562445634456444565445664456744568445694457044571445724457344574445754457644577445784457944580445814458244583445844458544586445874458844589445904459144592445934459444595445964459744598445994460044601446024460344604446054460644607446084460944610446114461244613446144461544616446174461844619446204462144622446234462444625446264462744628446294463044631446324463344634446354463644637446384463944640446414464244643446444464544646446474464844649446504465144652446534465444655446564465744658446594466044661446624466344664446654466644667446684466944670446714467244673446744467544676446774467844679446804468144682446834468444685446864468744688446894469044691446924469344694446954469644697446984469944700447014470244703447044470544706447074470844709447104471144712447134471444715447164471744718447194472044721447224472344724447254472644727447284472944730447314473244733447344473544736447374473844739447404474144742447434474444745447464474744748447494475044751447524475344754447554475644757447584475944760447614476244763447644476544766447674476844769447704477144772447734477444775447764477744778447794478044781447824478344784447854478644787447884478944790447914479244793447944479544796447974479844799448004480144802448034480444805448064480744808448094481044811448124481344814448154481644817448184481944820448214482244823448244482544826448274482844829448304483144832448334483444835448364483744838448394484044841448424484344844448454484644847448484484944850448514485244853448544485544856448574485844859448604486144862448634486444865448664486744868448694487044871448724487344874448754487644877448784487944880448814488244883448844488544886448874488844889448904489144892448934489444895448964489744898448994490044901449024490344904449054490644907449084490944910449114491244913449144491544916449174491844919449204492144922449234492444925449264492744928449294493044931449324493344934449354493644937449384493944940449414494244943449444494544946449474494844949449504495144952449534495444955449564495744958449594496044961449624496344964449654496644967449684496944970449714497244973449744497544976449774497844979449804498144982449834498444985449864498744988449894499044991449924499344994449954499644997449984499945000450014500245003450044500545006450074500845009450104501145012450134501445015450164501745018450194502045021450224502345024450254502645027450284502945030450314503245033450344503545036450374503845039450404504145042450434504445045450464504745048450494505045051450524505345054450554505645057450584505945060450614506245063450644506545066450674506845069450704507145072450734507445075450764507745078450794508045081450824508345084450854508645087450884508945090450914509245093450944509545096450974509845099451004510145102451034510445105451064510745108451094511045111451124511345114451154511645117451184511945120451214512245123451244512545126451274512845129451304513145132451334513445135451364513745138451394514045141451424514345144451454514645147451484514945150451514515245153451544515545156451574515845159451604516145162451634516445165451664516745168451694517045171451724517345174451754517645177451784517945180451814518245183451844518545186451874518845189451904519145192451934519445195451964519745198451994520045201452024520345204452054520645207452084520945210452114521245213452144521545216452174521845219452204522145222452234522445225452264522745228452294523045231452324523345234452354523645237452384523945240452414524245243452444524545246452474524845249452504525145252452534525445255452564525745258452594526045261452624526345264452654526645267452684526945270452714527245273452744527545276452774527845279452804528145282452834528445285452864528745288452894529045291452924529345294452954529645297452984529945300453014530245303453044530545306453074530845309453104531145312453134531445315453164531745318453194532045321453224532345324453254532645327453284532945330453314533245333453344533545336453374533845339453404534145342453434534445345453464534745348453494535045351453524535345354453554535645357453584535945360453614536245363453644536545366453674536845369453704537145372453734537445375453764537745378453794538045381453824538345384453854538645387453884538945390453914539245393453944539545396453974539845399454004540145402454034540445405454064540745408454094541045411454124541345414454154541645417454184541945420454214542245423454244542545426454274542845429454304543145432454334543445435454364543745438454394544045441454424544345444454454544645447454484544945450454514545245453454544545545456454574545845459454604546145462454634546445465454664546745468454694547045471454724547345474454754547645477454784547945480454814548245483454844548545486454874548845489454904549145492454934549445495454964549745498454994550045501455024550345504455054550645507455084550945510455114551245513455144551545516455174551845519455204552145522455234552445525455264552745528455294553045531455324553345534455354553645537455384553945540455414554245543455444554545546455474554845549455504555145552455534555445555455564555745558455594556045561455624556345564455654556645567455684556945570455714557245573455744557545576455774557845579455804558145582455834558445585455864558745588455894559045591455924559345594455954559645597455984559945600456014560245603456044560545606456074560845609456104561145612456134561445615456164561745618456194562045621456224562345624456254562645627456284562945630456314563245633456344563545636456374563845639456404564145642456434564445645456464564745648456494565045651456524565345654456554565645657456584565945660456614566245663456644566545666456674566845669456704567145672456734567445675456764567745678456794568045681456824568345684456854568645687456884568945690456914569245693456944569545696456974569845699457004570145702457034570445705457064570745708457094571045711457124571345714457154571645717457184571945720457214572245723457244572545726457274572845729457304573145732457334573445735457364573745738457394574045741457424574345744457454574645747457484574945750457514575245753457544575545756457574575845759457604576145762457634576445765457664576745768457694577045771457724577345774457754577645777457784577945780457814578245783457844578545786457874578845789457904579145792457934579445795457964579745798457994580045801458024580345804458054580645807458084580945810458114581245813458144581545816458174581845819458204582145822458234582445825458264582745828458294583045831458324583345834458354583645837458384583945840458414584245843458444584545846458474584845849458504585145852458534585445855458564585745858458594586045861458624586345864458654586645867458684586945870458714587245873458744587545876458774587845879458804588145882458834588445885458864588745888458894589045891458924589345894458954589645897458984589945900459014590245903459044590545906459074590845909459104591145912459134591445915459164591745918459194592045921459224592345924459254592645927459284592945930459314593245933459344593545936459374593845939459404594145942459434594445945459464594745948459494595045951459524595345954459554595645957459584595945960459614596245963459644596545966459674596845969459704597145972459734597445975459764597745978459794598045981459824598345984459854598645987459884598945990459914599245993459944599545996459974599845999460004600146002460034600446005460064600746008460094601046011460124601346014460154601646017460184601946020460214602246023460244602546026460274602846029460304603146032460334603446035460364603746038460394604046041460424604346044460454604646047460484604946050460514605246053460544605546056460574605846059460604606146062460634606446065460664606746068460694607046071460724607346074460754607646077460784607946080460814608246083460844608546086460874608846089460904609146092460934609446095460964609746098460994610046101461024610346104461054610646107461084610946110461114611246113461144611546116461174611846119461204612146122461234612446125461264612746128461294613046131461324613346134461354613646137461384613946140461414614246143461444614546146461474614846149461504615146152461534615446155461564615746158461594616046161461624616346164461654616646167461684616946170461714617246173461744617546176461774617846179461804618146182461834618446185461864618746188461894619046191461924619346194461954619646197461984619946200462014620246203462044620546206462074620846209462104621146212462134621446215462164621746218462194622046221462224622346224462254622646227462284622946230462314623246233462344623546236462374623846239462404624146242462434624446245462464624746248462494625046251462524625346254462554625646257462584625946260462614626246263462644626546266462674626846269462704627146272462734627446275462764627746278462794628046281462824628346284462854628646287462884628946290462914629246293462944629546296462974629846299463004630146302463034630446305463064630746308463094631046311463124631346314463154631646317463184631946320463214632246323463244632546326463274632846329463304633146332463334633446335463364633746338463394634046341463424634346344463454634646347463484634946350463514635246353463544635546356463574635846359463604636146362463634636446365463664636746368463694637046371463724637346374463754637646377463784637946380463814638246383463844638546386463874638846389463904639146392463934639446395463964639746398463994640046401464024640346404464054640646407464084640946410464114641246413464144641546416464174641846419464204642146422464234642446425464264642746428464294643046431464324643346434464354643646437464384643946440464414644246443464444644546446464474644846449464504645146452464534645446455464564645746458464594646046461464624646346464464654646646467464684646946470464714647246473464744647546476464774647846479464804648146482464834648446485464864648746488464894649046491464924649346494464954649646497464984649946500465014650246503465044650546506465074650846509465104651146512465134651446515465164651746518465194652046521465224652346524465254652646527465284652946530465314653246533465344653546536465374653846539465404654146542465434654446545465464654746548465494655046551465524655346554465554655646557465584655946560465614656246563465644656546566465674656846569465704657146572465734657446575465764657746578465794658046581465824658346584465854658646587465884658946590465914659246593465944659546596465974659846599466004660146602466034660446605466064660746608466094661046611466124661346614466154661646617466184661946620466214662246623466244662546626466274662846629466304663146632466334663446635466364663746638466394664046641466424664346644466454664646647466484664946650466514665246653466544665546656466574665846659466604666146662466634666446665466664666746668466694667046671466724667346674466754667646677466784667946680466814668246683466844668546686466874668846689466904669146692466934669446695466964669746698466994670046701467024670346704467054670646707467084670946710467114671246713467144671546716467174671846719467204672146722467234672446725467264672746728467294673046731467324673346734467354673646737467384673946740467414674246743467444674546746467474674846749467504675146752467534675446755467564675746758467594676046761467624676346764467654676646767467684676946770467714677246773467744677546776467774677846779467804678146782467834678446785467864678746788467894679046791467924679346794467954679646797467984679946800468014680246803468044680546806468074680846809468104681146812468134681446815468164681746818468194682046821468224682346824468254682646827468284682946830468314683246833468344683546836468374683846839468404684146842468434684446845468464684746848468494685046851468524685346854468554685646857468584685946860468614686246863468644686546866468674686846869468704687146872468734687446875468764687746878468794688046881468824688346884468854688646887468884688946890468914689246893468944689546896468974689846899469004690146902469034690446905469064690746908469094691046911469124691346914469154691646917469184691946920469214692246923469244692546926469274692846929469304693146932469334693446935469364693746938469394694046941469424694346944469454694646947469484694946950469514695246953469544695546956469574695846959469604696146962469634696446965469664696746968469694697046971469724697346974469754697646977469784697946980469814698246983469844698546986469874698846989469904699146992469934699446995469964699746998469994700047001470024700347004470054700647007470084700947010470114701247013470144701547016470174701847019470204702147022470234702447025470264702747028470294703047031470324703347034470354703647037470384703947040470414704247043470444704547046470474704847049470504705147052470534705447055470564705747058470594706047061470624706347064470654706647067470684706947070470714707247073470744707547076470774707847079470804708147082470834708447085470864708747088470894709047091470924709347094470954709647097470984709947100471014710247103471044710547106471074710847109471104711147112471134711447115471164711747118471194712047121471224712347124471254712647127471284712947130471314713247133471344713547136471374713847139471404714147142471434714447145471464714747148471494715047151471524715347154471554715647157471584715947160471614716247163471644716547166471674716847169471704717147172471734717447175471764717747178471794718047181471824718347184471854718647187471884718947190471914719247193471944719547196471974719847199472004720147202472034720447205472064720747208472094721047211472124721347214472154721647217472184721947220472214722247223472244722547226472274722847229472304723147232472334723447235472364723747238472394724047241472424724347244472454724647247472484724947250472514725247253472544725547256472574725847259472604726147262472634726447265472664726747268472694727047271472724727347274472754727647277472784727947280472814728247283472844728547286472874728847289472904729147292472934729447295472964729747298472994730047301473024730347304473054730647307473084730947310473114731247313473144731547316473174731847319473204732147322473234732447325473264732747328473294733047331473324733347334473354733647337473384733947340473414734247343473444734547346473474734847349473504735147352473534735447355473564735747358473594736047361473624736347364473654736647367473684736947370473714737247373473744737547376473774737847379473804738147382473834738447385473864738747388473894739047391473924739347394473954739647397473984739947400474014740247403474044740547406474074740847409474104741147412474134741447415474164741747418474194742047421474224742347424474254742647427474284742947430474314743247433474344743547436474374743847439474404744147442474434744447445474464744747448474494745047451474524745347454474554745647457474584745947460474614746247463474644746547466474674746847469474704747147472474734747447475474764747747478474794748047481474824748347484474854748647487474884748947490474914749247493474944749547496474974749847499475004750147502475034750447505475064750747508475094751047511475124751347514475154751647517475184751947520475214752247523475244752547526475274752847529475304753147532475334753447535475364753747538475394754047541475424754347544475454754647547475484754947550475514755247553475544755547556475574755847559475604756147562475634756447565475664756747568475694757047571475724757347574475754757647577475784757947580475814758247583475844758547586475874758847589475904759147592475934759447595475964759747598475994760047601476024760347604476054760647607476084760947610476114761247613476144761547616476174761847619476204762147622476234762447625476264762747628476294763047631476324763347634476354763647637476384763947640476414764247643476444764547646476474764847649476504765147652476534765447655476564765747658476594766047661476624766347664476654766647667476684766947670476714767247673476744767547676476774767847679476804768147682476834768447685476864768747688476894769047691476924769347694476954769647697476984769947700477014770247703477044770547706477074770847709477104771147712477134771447715477164771747718477194772047721477224772347724477254772647727477284772947730477314773247733477344773547736477374773847739477404774147742477434774447745477464774747748477494775047751477524775347754477554775647757477584775947760477614776247763477644776547766477674776847769477704777147772477734777447775477764777747778477794778047781477824778347784477854778647787477884778947790477914779247793477944779547796477974779847799478004780147802478034780447805478064780747808478094781047811478124781347814478154781647817478184781947820478214782247823478244782547826478274782847829478304783147832478334783447835478364783747838478394784047841478424784347844478454784647847478484784947850478514785247853478544785547856478574785847859478604786147862478634786447865478664786747868478694787047871478724787347874478754787647877478784787947880478814788247883478844788547886478874788847889478904789147892478934789447895478964789747898478994790047901479024790347904479054790647907479084790947910479114791247913479144791547916479174791847919479204792147922479234792447925479264792747928479294793047931479324793347934479354793647937479384793947940479414794247943479444794547946479474794847949479504795147952479534795447955479564795747958479594796047961479624796347964479654796647967479684796947970479714797247973479744797547976479774797847979479804798147982479834798447985479864798747988479894799047991479924799347994479954799647997479984799948000480014800248003480044800548006480074800848009480104801148012480134801448015480164801748018480194802048021480224802348024480254802648027480284802948030480314803248033480344803548036480374803848039480404804148042480434804448045480464804748048480494805048051480524805348054480554805648057480584805948060480614806248063480644806548066480674806848069480704807148072480734807448075480764807748078480794808048081480824808348084480854808648087480884808948090480914809248093480944809548096480974809848099481004810148102481034810448105481064810748108481094811048111481124811348114481154811648117481184811948120481214812248123481244812548126481274812848129481304813148132481334813448135481364813748138481394814048141481424814348144481454814648147481484814948150481514815248153481544815548156481574815848159481604816148162481634816448165481664816748168481694817048171481724817348174481754817648177481784817948180481814818248183481844818548186481874818848189481904819148192481934819448195481964819748198481994820048201482024820348204482054820648207482084820948210482114821248213482144821548216482174821848219482204822148222482234822448225482264822748228482294823048231482324823348234482354823648237482384823948240482414824248243482444824548246482474824848249482504825148252482534825448255482564825748258482594826048261482624826348264482654826648267482684826948270482714827248273482744827548276482774827848279482804828148282482834828448285482864828748288482894829048291482924829348294482954829648297482984829948300483014830248303483044830548306483074830848309483104831148312483134831448315483164831748318483194832048321483224832348324483254832648327483284832948330483314833248333483344833548336483374833848339483404834148342483434834448345483464834748348483494835048351483524835348354483554835648357483584835948360483614836248363483644836548366483674836848369483704837148372483734837448375483764837748378483794838048381483824838348384483854838648387483884838948390483914839248393483944839548396483974839848399484004840148402484034840448405484064840748408484094841048411484124841348414484154841648417484184841948420484214842248423484244842548426484274842848429484304843148432484334843448435484364843748438484394844048441484424844348444484454844648447484484844948450484514845248453484544845548456484574845848459484604846148462484634846448465484664846748468484694847048471484724847348474484754847648477484784847948480484814848248483484844848548486484874848848489484904849148492484934849448495484964849748498484994850048501485024850348504485054850648507485084850948510485114851248513485144851548516485174851848519485204852148522485234852448525485264852748528485294853048531485324853348534485354853648537485384853948540485414854248543485444854548546485474854848549485504855148552485534855448555485564855748558485594856048561485624856348564485654856648567485684856948570485714857248573485744857548576485774857848579485804858148582485834858448585485864858748588485894859048591485924859348594485954859648597485984859948600486014860248603486044860548606486074860848609486104861148612486134861448615486164861748618486194862048621486224862348624486254862648627486284862948630486314863248633486344863548636486374863848639486404864148642486434864448645486464864748648486494865048651486524865348654486554865648657486584865948660486614866248663486644866548666486674866848669486704867148672486734867448675486764867748678486794868048681486824868348684486854868648687486884868948690486914869248693486944869548696486974869848699487004870148702487034870448705487064870748708487094871048711487124871348714487154871648717487184871948720487214872248723487244872548726487274872848729487304873148732487334873448735487364873748738487394874048741487424874348744487454874648747487484874948750487514875248753487544875548756487574875848759487604876148762487634876448765487664876748768487694877048771487724877348774487754877648777487784877948780487814878248783487844878548786487874878848789487904879148792487934879448795487964879748798487994880048801488024880348804488054880648807488084880948810488114881248813488144881548816488174881848819488204882148822488234882448825488264882748828488294883048831488324883348834488354883648837488384883948840488414884248843488444884548846488474884848849488504885148852488534885448855488564885748858488594886048861488624886348864488654886648867488684886948870488714887248873488744887548876488774887848879488804888148882488834888448885488864888748888488894889048891488924889348894488954889648897488984889948900489014890248903489044890548906489074890848909489104891148912489134891448915489164891748918489194892048921489224892348924489254892648927489284892948930489314893248933489344893548936489374893848939489404894148942489434894448945489464894748948489494895048951489524895348954489554895648957489584895948960489614896248963489644896548966489674896848969489704897148972489734897448975489764897748978489794898048981489824898348984489854898648987489884898948990489914899248993489944899548996489974899848999490004900149002490034900449005490064900749008490094901049011490124901349014490154901649017490184901949020490214902249023490244902549026490274902849029490304903149032490334903449035490364903749038490394904049041490424904349044490454904649047490484904949050490514905249053490544905549056490574905849059490604906149062490634906449065490664906749068490694907049071490724907349074490754907649077490784907949080490814908249083490844908549086490874908849089490904909149092490934909449095490964909749098490994910049101491024910349104491054910649107491084910949110491114911249113491144911549116491174911849119491204912149122491234912449125491264912749128491294913049131491324913349134491354913649137491384913949140491414914249143491444914549146491474914849149491504915149152491534915449155491564915749158491594916049161491624916349164491654916649167491684916949170491714917249173491744917549176491774917849179491804918149182491834918449185491864918749188491894919049191491924919349194491954919649197491984919949200492014920249203492044920549206492074920849209492104921149212492134921449215492164921749218492194922049221492224922349224492254922649227492284922949230492314923249233492344923549236492374923849239492404924149242492434924449245492464924749248492494925049251492524925349254492554925649257492584925949260492614926249263492644926549266492674926849269492704927149272492734927449275492764927749278492794928049281492824928349284492854928649287492884928949290492914929249293492944929549296492974929849299493004930149302493034930449305493064930749308493094931049311493124931349314493154931649317493184931949320493214932249323493244932549326493274932849329493304933149332493334933449335493364933749338493394934049341493424934349344493454934649347493484934949350493514935249353493544935549356493574935849359493604936149362493634936449365493664936749368493694937049371493724937349374493754937649377493784937949380493814938249383493844938549386493874938849389493904939149392493934939449395493964939749398493994940049401494024940349404494054940649407494084940949410494114941249413494144941549416494174941849419494204942149422494234942449425494264942749428494294943049431494324943349434494354943649437494384943949440494414944249443494444944549446494474944849449494504945149452494534945449455494564945749458494594946049461494624946349464494654946649467494684946949470494714947249473494744947549476494774947849479494804948149482494834948449485494864948749488494894949049491494924949349494494954949649497494984949949500495014950249503495044950549506495074950849509495104951149512495134951449515495164951749518495194952049521495224952349524495254952649527495284952949530495314953249533495344953549536495374953849539495404954149542495434954449545495464954749548495494955049551495524955349554495554955649557495584955949560495614956249563495644956549566495674956849569495704957149572495734957449575495764957749578495794958049581495824958349584495854958649587495884958949590495914959249593495944959549596495974959849599496004960149602496034960449605496064960749608496094961049611496124961349614496154961649617496184961949620496214962249623496244962549626496274962849629496304963149632496334963449635496364963749638496394964049641496424964349644496454964649647496484964949650496514965249653496544965549656496574965849659496604966149662496634966449665496664966749668496694967049671496724967349674496754967649677496784967949680496814968249683496844968549686496874968849689496904969149692496934969449695496964969749698496994970049701497024970349704497054970649707497084970949710497114971249713497144971549716497174971849719497204972149722497234972449725497264972749728497294973049731497324973349734497354973649737497384973949740497414974249743497444974549746497474974849749497504975149752497534975449755497564975749758497594976049761497624976349764497654976649767497684976949770497714977249773497744977549776497774977849779497804978149782497834978449785497864978749788497894979049791497924979349794497954979649797497984979949800498014980249803498044980549806498074980849809498104981149812498134981449815498164981749818498194982049821498224982349824498254982649827498284982949830498314983249833498344983549836498374983849839498404984149842498434984449845498464984749848498494985049851498524985349854498554985649857498584985949860498614986249863498644986549866498674986849869498704987149872498734987449875498764987749878498794988049881498824988349884498854988649887498884988949890498914989249893498944989549896498974989849899499004990149902499034990449905499064990749908499094991049911499124991349914499154991649917499184991949920499214992249923499244992549926499274992849929499304993149932499334993449935499364993749938499394994049941499424994349944499454994649947499484994949950499514995249953499544995549956499574995849959499604996149962499634996449965499664996749968499694997049971499724997349974499754997649977499784997949980499814998249983499844998549986499874998849989499904999149992499934999449995499964999749998499995000050001500025000350004500055000650007500085000950010500115001250013500145001550016500175001850019500205002150022500235002450025500265002750028500295003050031500325003350034500355003650037500385003950040500415004250043500445004550046500475004850049500505005150052500535005450055500565005750058500595006050061500625006350064500655006650067500685006950070500715007250073500745007550076500775007850079500805008150082500835008450085500865008750088500895009050091500925009350094500955009650097500985009950100501015010250103501045010550106501075010850109501105011150112501135011450115501165011750118501195012050121501225012350124501255012650127501285012950130501315013250133501345013550136501375013850139501405014150142501435014450145501465014750148501495015050151501525015350154501555015650157501585015950160501615016250163501645016550166501675016850169501705017150172501735017450175501765017750178501795018050181501825018350184501855018650187501885018950190501915019250193501945019550196501975019850199502005020150202502035020450205502065020750208502095021050211502125021350214502155021650217502185021950220502215022250223502245022550226502275022850229502305023150232502335023450235502365023750238502395024050241502425024350244502455024650247502485024950250502515025250253502545025550256502575025850259502605026150262502635026450265502665026750268502695027050271502725027350274502755027650277502785027950280502815028250283502845028550286502875028850289502905029150292502935029450295502965029750298502995030050301503025030350304503055030650307503085030950310503115031250313503145031550316503175031850319503205032150322503235032450325503265032750328503295033050331503325033350334503355033650337503385033950340503415034250343503445034550346503475034850349503505035150352503535035450355503565035750358503595036050361503625036350364503655036650367503685036950370503715037250373503745037550376503775037850379503805038150382503835038450385503865038750388503895039050391503925039350394503955039650397503985039950400504015040250403504045040550406504075040850409504105041150412504135041450415504165041750418504195042050421504225042350424504255042650427504285042950430504315043250433504345043550436504375043850439504405044150442504435044450445504465044750448504495045050451504525045350454504555045650457504585045950460504615046250463504645046550466504675046850469504705047150472504735047450475504765047750478504795048050481504825048350484504855048650487504885048950490504915049250493504945049550496504975049850499505005050150502505035050450505505065050750508505095051050511505125051350514505155051650517505185051950520505215052250523505245052550526505275052850529505305053150532505335053450535505365053750538505395054050541505425054350544505455054650547505485054950550505515055250553505545055550556505575055850559505605056150562505635056450565505665056750568505695057050571505725057350574505755057650577505785057950580505815058250583505845058550586505875058850589505905059150592505935059450595505965059750598505995060050601506025060350604506055060650607506085060950610506115061250613506145061550616506175061850619506205062150622506235062450625506265062750628506295063050631506325063350634506355063650637506385063950640506415064250643506445064550646506475064850649506505065150652506535065450655506565065750658506595066050661506625066350664506655066650667506685066950670506715067250673506745067550676506775067850679506805068150682506835068450685506865068750688506895069050691506925069350694506955069650697506985069950700507015070250703507045070550706507075070850709507105071150712507135071450715507165071750718507195072050721507225072350724507255072650727507285072950730507315073250733507345073550736507375073850739507405074150742507435074450745507465074750748507495075050751507525075350754507555075650757507585075950760507615076250763507645076550766507675076850769507705077150772507735077450775507765077750778507795078050781507825078350784507855078650787507885078950790507915079250793507945079550796507975079850799508005080150802508035080450805508065080750808508095081050811508125081350814508155081650817508185081950820508215082250823508245082550826508275082850829508305083150832508335083450835508365083750838508395084050841508425084350844508455084650847508485084950850508515085250853508545085550856508575085850859508605086150862508635086450865508665086750868508695087050871508725087350874508755087650877508785087950880508815088250883508845088550886508875088850889508905089150892508935089450895508965089750898508995090050901509025090350904509055090650907509085090950910509115091250913509145091550916509175091850919509205092150922509235092450925509265092750928509295093050931509325093350934509355093650937509385093950940509415094250943509445094550946509475094850949509505095150952509535095450955509565095750958509595096050961509625096350964509655096650967509685096950970509715097250973509745097550976509775097850979509805098150982509835098450985509865098750988509895099050991509925099350994509955099650997509985099951000510015100251003510045100551006510075100851009510105101151012510135101451015510165101751018510195102051021510225102351024510255102651027510285102951030510315103251033510345103551036510375103851039510405104151042510435104451045510465104751048510495105051051510525105351054510555105651057510585105951060510615106251063510645106551066510675106851069510705107151072510735107451075510765107751078510795108051081510825108351084510855108651087510885108951090510915109251093510945109551096510975109851099511005110151102511035110451105511065110751108511095111051111511125111351114511155111651117511185111951120511215112251123511245112551126511275112851129511305113151132511335113451135511365113751138511395114051141511425114351144511455114651147511485114951150511515115251153511545115551156511575115851159511605116151162511635116451165511665116751168511695117051171511725117351174511755117651177511785117951180511815118251183511845118551186511875118851189511905119151192511935119451195511965119751198511995120051201512025120351204512055120651207512085120951210512115121251213512145121551216512175121851219512205122151222512235122451225512265122751228512295123051231512325123351234512355123651237512385123951240512415124251243512445124551246512475124851249512505125151252512535125451255512565125751258512595126051261512625126351264512655126651267512685126951270512715127251273512745127551276512775127851279512805128151282512835128451285512865128751288512895129051291512925129351294512955129651297512985129951300513015130251303513045130551306513075130851309513105131151312513135131451315513165131751318513195132051321513225132351324513255132651327513285132951330513315133251333513345133551336513375133851339513405134151342513435134451345513465134751348513495135051351513525135351354513555135651357513585135951360513615136251363513645136551366513675136851369513705137151372513735137451375513765137751378513795138051381513825138351384513855138651387513885138951390513915139251393513945139551396513975139851399514005140151402514035140451405514065140751408514095141051411514125141351414514155141651417514185141951420514215142251423514245142551426514275142851429514305143151432514335143451435514365143751438514395144051441514425144351444514455144651447514485144951450514515145251453514545145551456514575145851459514605146151462514635146451465514665146751468514695147051471514725147351474514755147651477514785147951480514815148251483514845148551486514875148851489514905149151492514935149451495514965149751498514995150051501515025150351504515055150651507515085150951510515115151251513515145151551516515175151851519515205152151522515235152451525515265152751528515295153051531515325153351534515355153651537515385153951540515415154251543515445154551546515475154851549515505155151552515535155451555515565155751558515595156051561515625156351564515655156651567515685156951570515715157251573515745157551576515775157851579515805158151582515835158451585515865158751588515895159051591515925159351594515955159651597515985159951600516015160251603516045160551606516075160851609516105161151612516135161451615516165161751618516195162051621516225162351624516255162651627516285162951630516315163251633516345163551636516375163851639516405164151642516435164451645516465164751648516495165051651516525165351654516555165651657516585165951660516615166251663516645166551666516675166851669516705167151672516735167451675516765167751678516795168051681516825168351684516855168651687516885168951690516915169251693516945169551696516975169851699517005170151702517035170451705517065170751708517095171051711517125171351714517155171651717517185171951720517215172251723517245172551726517275172851729517305173151732517335173451735517365173751738517395174051741517425174351744517455174651747517485174951750517515175251753517545175551756517575175851759517605176151762517635176451765517665176751768517695177051771517725177351774517755177651777517785177951780517815178251783517845178551786517875178851789517905179151792517935179451795517965179751798517995180051801518025180351804518055180651807518085180951810518115181251813518145181551816518175181851819518205182151822518235182451825518265182751828518295183051831518325183351834518355183651837518385183951840518415184251843518445184551846518475184851849518505185151852518535185451855518565185751858518595186051861518625186351864518655186651867518685186951870518715187251873518745187551876518775187851879518805188151882518835188451885518865188751888518895189051891518925189351894518955189651897518985189951900519015190251903519045190551906519075190851909519105191151912519135191451915519165191751918519195192051921519225192351924519255192651927519285192951930519315193251933519345193551936519375193851939519405194151942519435194451945519465194751948519495195051951519525195351954519555195651957519585195951960519615196251963519645196551966519675196851969519705197151972519735197451975519765197751978519795198051981519825198351984519855198651987519885198951990519915199251993519945199551996519975199851999520005200152002520035200452005520065200752008520095201052011520125201352014520155201652017520185201952020520215202252023520245202552026520275202852029520305203152032520335203452035520365203752038520395204052041520425204352044520455204652047520485204952050520515205252053520545205552056520575205852059520605206152062520635206452065520665206752068520695207052071520725207352074520755207652077520785207952080520815208252083520845208552086520875208852089520905209152092520935209452095520965209752098520995210052101521025210352104521055210652107521085210952110521115211252113521145211552116521175211852119521205212152122521235212452125521265212752128521295213052131521325213352134521355213652137521385213952140521415214252143521445214552146521475214852149521505215152152521535215452155521565215752158521595216052161521625216352164521655216652167521685216952170521715217252173521745217552176521775217852179521805218152182521835218452185521865218752188521895219052191521925219352194521955219652197521985219952200522015220252203522045220552206522075220852209522105221152212522135221452215522165221752218522195222052221522225222352224522255222652227522285222952230522315223252233522345223552236522375223852239522405224152242522435224452245522465224752248522495225052251522525225352254522555225652257522585225952260522615226252263522645226552266522675226852269522705227152272522735227452275522765227752278522795228052281522825228352284522855228652287522885228952290522915229252293522945229552296522975229852299523005230152302523035230452305523065230752308523095231052311523125231352314523155231652317523185231952320523215232252323523245232552326523275232852329523305233152332523335233452335523365233752338523395234052341523425234352344523455234652347523485234952350523515235252353523545235552356523575235852359523605236152362523635236452365523665236752368523695237052371523725237352374523755237652377523785237952380523815238252383523845238552386523875238852389523905239152392523935239452395523965239752398523995240052401524025240352404524055240652407524085240952410524115241252413524145241552416524175241852419524205242152422524235242452425524265242752428524295243052431524325243352434524355243652437524385243952440524415244252443524445244552446524475244852449524505245152452524535245452455524565245752458524595246052461524625246352464524655246652467524685246952470524715247252473524745247552476524775247852479524805248152482524835248452485524865248752488524895249052491524925249352494524955249652497524985249952500525015250252503525045250552506525075250852509525105251152512525135251452515525165251752518525195252052521525225252352524525255252652527525285252952530525315253252533525345253552536525375253852539525405254152542525435254452545525465254752548525495255052551525525255352554525555255652557525585255952560525615256252563525645256552566525675256852569525705257152572525735257452575525765257752578525795258052581525825258352584525855258652587525885258952590525915259252593525945259552596525975259852599526005260152602526035260452605526065260752608526095261052611526125261352614526155261652617526185261952620526215262252623526245262552626526275262852629526305263152632526335263452635526365263752638526395264052641526425264352644526455264652647526485264952650526515265252653526545265552656526575265852659526605266152662526635266452665526665266752668526695267052671526725267352674526755267652677526785267952680526815268252683526845268552686526875268852689526905269152692526935269452695526965269752698526995270052701527025270352704527055270652707527085270952710527115271252713527145271552716527175271852719527205272152722527235272452725527265272752728527295273052731527325273352734527355273652737527385273952740527415274252743527445274552746527475274852749527505275152752527535275452755527565275752758527595276052761527625276352764527655276652767527685276952770527715277252773527745277552776527775277852779527805278152782527835278452785527865278752788527895279052791527925279352794527955279652797527985279952800528015280252803528045280552806528075280852809528105281152812528135281452815528165281752818528195282052821528225282352824528255282652827528285282952830528315283252833528345283552836528375283852839528405284152842528435284452845528465284752848528495285052851528525285352854528555285652857528585285952860528615286252863528645286552866528675286852869528705287152872528735287452875528765287752878528795288052881528825288352884528855288652887528885288952890528915289252893528945289552896528975289852899529005290152902529035290452905529065290752908529095291052911529125291352914529155291652917529185291952920529215292252923529245292552926529275292852929529305293152932529335293452935529365293752938529395294052941529425294352944529455294652947529485294952950529515295252953529545295552956529575295852959529605296152962529635296452965529665296752968529695297052971529725297352974529755297652977529785297952980529815298252983529845298552986529875298852989529905299152992529935299452995529965299752998529995300053001530025300353004530055300653007530085300953010530115301253013530145301553016530175301853019530205302153022530235302453025530265302753028530295303053031530325303353034530355303653037530385303953040530415304253043530445304553046530475304853049530505305153052530535305453055530565305753058530595306053061530625306353064530655306653067530685306953070530715307253073530745307553076530775307853079530805308153082530835308453085530865308753088530895309053091530925309353094530955309653097530985309953100531015310253103531045310553106531075310853109531105311153112531135311453115531165311753118531195312053121531225312353124531255312653127531285312953130531315313253133531345313553136531375313853139531405314153142531435314453145531465314753148531495315053151531525315353154531555315653157531585315953160531615316253163531645316553166531675316853169531705317153172531735317453175531765317753178531795318053181531825318353184531855318653187531885318953190531915319253193531945319553196531975319853199532005320153202532035320453205532065320753208532095321053211532125321353214532155321653217532185321953220532215322253223532245322553226532275322853229532305323153232532335323453235532365323753238532395324053241532425324353244532455324653247532485324953250532515325253253532545325553256532575325853259532605326153262532635326453265532665326753268532695327053271532725327353274532755327653277532785327953280532815328253283532845328553286532875328853289532905329153292532935329453295532965329753298532995330053301533025330353304533055330653307533085330953310533115331253313533145331553316533175331853319533205332153322533235332453325533265332753328533295333053331533325333353334533355333653337533385333953340533415334253343533445334553346533475334853349533505335153352533535335453355533565335753358533595336053361533625336353364533655336653367533685336953370533715337253373533745337553376533775337853379533805338153382533835338453385533865338753388533895339053391533925339353394533955339653397533985339953400534015340253403534045340553406534075340853409534105341153412534135341453415534165341753418534195342053421534225342353424534255342653427534285342953430534315343253433534345343553436534375343853439534405344153442534435344453445534465344753448534495345053451534525345353454534555345653457534585345953460534615346253463534645346553466534675346853469534705347153472534735347453475534765347753478534795348053481534825348353484534855348653487534885348953490534915349253493534945349553496534975349853499535005350153502535035350453505535065350753508535095351053511535125351353514535155351653517535185351953520535215352253523535245352553526535275352853529535305353153532535335353453535535365353753538535395354053541535425354353544535455354653547535485354953550535515355253553535545355553556535575355853559535605356153562535635356453565535665356753568535695357053571535725357353574535755357653577535785357953580535815358253583535845358553586535875358853589535905359153592535935359453595535965359753598535995360053601536025360353604536055360653607536085360953610536115361253613536145361553616536175361853619536205362153622536235362453625536265362753628536295363053631536325363353634536355363653637536385363953640536415364253643536445364553646536475364853649536505365153652536535365453655536565365753658536595366053661536625366353664536655366653667536685366953670536715367253673536745367553676536775367853679536805368153682536835368453685536865368753688536895369053691536925369353694536955369653697536985369953700537015370253703537045370553706537075370853709537105371153712537135371453715537165371753718537195372053721537225372353724537255372653727537285372953730537315373253733537345373553736537375373853739537405374153742537435374453745537465374753748537495375053751537525375353754537555375653757537585375953760537615376253763537645376553766537675376853769537705377153772537735377453775537765377753778537795378053781537825378353784537855378653787537885378953790537915379253793537945379553796537975379853799538005380153802538035380453805538065380753808538095381053811538125381353814538155381653817538185381953820538215382253823538245382553826538275382853829538305383153832538335383453835538365383753838538395384053841538425384353844538455384653847538485384953850538515385253853538545385553856538575385853859538605386153862538635386453865538665386753868538695387053871538725387353874538755387653877538785387953880538815388253883538845388553886538875388853889538905389153892538935389453895538965389753898538995390053901539025390353904539055390653907539085390953910539115391253913539145391553916539175391853919539205392153922539235392453925539265392753928539295393053931539325393353934539355393653937539385393953940539415394253943539445394553946539475394853949539505395153952539535395453955539565395753958539595396053961539625396353964539655396653967539685396953970539715397253973539745397553976539775397853979539805398153982539835398453985539865398753988539895399053991539925399353994539955399653997539985399954000540015400254003540045400554006540075400854009540105401154012540135401454015540165401754018540195402054021540225402354024540255402654027540285402954030540315403254033540345403554036540375403854039540405404154042540435404454045540465404754048540495405054051540525405354054540555405654057540585405954060540615406254063540645406554066540675406854069540705407154072540735407454075540765407754078540795408054081540825408354084540855408654087540885408954090540915409254093540945409554096540975409854099541005410154102541035410454105541065410754108541095411054111541125411354114541155411654117541185411954120541215412254123541245412554126541275412854129541305413154132541335413454135541365413754138541395414054141541425414354144541455414654147541485414954150541515415254153541545415554156541575415854159541605416154162541635416454165541665416754168541695417054171541725417354174541755417654177541785417954180541815418254183541845418554186541875418854189541905419154192541935419454195541965419754198541995420054201542025420354204542055420654207542085420954210542115421254213542145421554216542175421854219542205422154222542235422454225542265422754228542295423054231542325423354234542355423654237542385423954240542415424254243542445424554246542475424854249542505425154252542535425454255542565425754258542595426054261542625426354264542655426654267542685426954270542715427254273542745427554276542775427854279542805428154282542835428454285542865428754288542895429054291542925429354294542955429654297542985429954300543015430254303543045430554306543075430854309543105431154312543135431454315543165431754318543195432054321543225432354324543255432654327543285432954330543315433254333543345433554336543375433854339543405434154342543435434454345543465434754348543495435054351543525435354354543555435654357543585435954360543615436254363543645436554366543675436854369543705437154372543735437454375543765437754378543795438054381543825438354384543855438654387543885438954390543915439254393543945439554396543975439854399544005440154402544035440454405544065440754408544095441054411544125441354414544155441654417544185441954420544215442254423544245442554426544275442854429544305443154432544335443454435544365443754438544395444054441544425444354444544455444654447544485444954450544515445254453544545445554456544575445854459544605446154462544635446454465544665446754468544695447054471544725447354474544755447654477544785447954480544815448254483544845448554486544875448854489544905449154492544935449454495544965449754498544995450054501545025450354504545055450654507545085450954510545115451254513545145451554516545175451854519545205452154522545235452454525545265452754528545295453054531545325453354534545355453654537545385453954540545415454254543545445454554546545475454854549545505455154552545535455454555545565455754558545595456054561545625456354564545655456654567545685456954570545715457254573545745457554576545775457854579545805458154582545835458454585545865458754588545895459054591545925459354594545955459654597545985459954600546015460254603546045460554606546075460854609546105461154612546135461454615546165461754618546195462054621546225462354624546255462654627546285462954630546315463254633546345463554636546375463854639546405464154642546435464454645546465464754648546495465054651546525465354654546555465654657546585465954660546615466254663546645466554666546675466854669546705467154672546735467454675546765467754678546795468054681546825468354684546855468654687546885468954690546915469254693546945469554696546975469854699547005470154702547035470454705547065470754708547095471054711547125471354714547155471654717547185471954720547215472254723547245472554726547275472854729547305473154732547335473454735547365473754738547395474054741547425474354744547455474654747547485474954750547515475254753547545475554756547575475854759547605476154762547635476454765547665476754768547695477054771547725477354774547755477654777547785477954780547815478254783547845478554786547875478854789547905479154792547935479454795547965479754798547995480054801548025480354804548055480654807548085480954810548115481254813548145481554816548175481854819548205482154822548235482454825548265482754828548295483054831548325483354834548355483654837548385483954840548415484254843548445484554846548475484854849548505485154852548535485454855548565485754858548595486054861548625486354864548655486654867548685486954870548715487254873548745487554876548775487854879548805488154882548835488454885548865488754888548895489054891548925489354894548955489654897548985489954900549015490254903549045490554906549075490854909549105491154912549135491454915549165491754918549195492054921549225492354924549255492654927549285492954930549315493254933549345493554936549375493854939549405494154942549435494454945549465494754948549495495054951549525495354954549555495654957549585495954960549615496254963549645496554966549675496854969549705497154972549735497454975549765497754978549795498054981549825498354984549855498654987549885498954990549915499254993549945499554996549975499854999550005500155002550035500455005550065500755008550095501055011550125501355014550155501655017550185501955020550215502255023550245502555026550275502855029550305503155032550335503455035550365503755038550395504055041550425504355044550455504655047550485504955050550515505255053550545505555056550575505855059550605506155062550635506455065550665506755068550695507055071550725507355074550755507655077550785507955080550815508255083550845508555086550875508855089550905509155092550935509455095550965509755098550995510055101551025510355104551055510655107551085510955110551115511255113551145511555116551175511855119551205512155122551235512455125551265512755128551295513055131551325513355134551355513655137551385513955140551415514255143551445514555146551475514855149551505515155152551535515455155551565515755158551595516055161551625516355164551655516655167551685516955170551715517255173551745517555176551775517855179551805518155182551835518455185551865518755188551895519055191551925519355194551955519655197551985519955200552015520255203552045520555206552075520855209552105521155212552135521455215552165521755218552195522055221552225522355224552255522655227552285522955230552315523255233552345523555236552375523855239552405524155242552435524455245552465524755248552495525055251552525525355254552555525655257552585525955260552615526255263552645526555266552675526855269552705527155272552735527455275552765527755278552795528055281552825528355284552855528655287552885528955290552915529255293552945529555296552975529855299553005530155302553035530455305553065530755308553095531055311553125531355314553155531655317553185531955320553215532255323553245532555326553275532855329553305533155332553335533455335553365533755338553395534055341553425534355344553455534655347553485534955350553515535255353553545535555356553575535855359553605536155362553635536455365553665536755368553695537055371553725537355374553755537655377553785537955380553815538255383553845538555386553875538855389553905539155392553935539455395553965539755398553995540055401554025540355404554055540655407554085540955410554115541255413554145541555416554175541855419554205542155422554235542455425554265542755428554295543055431554325543355434554355543655437554385543955440554415544255443554445544555446554475544855449554505545155452554535545455455554565545755458554595546055461554625546355464554655546655467554685546955470554715547255473554745547555476554775547855479554805548155482554835548455485554865548755488554895549055491554925549355494554955549655497554985549955500555015550255503555045550555506555075550855509555105551155512555135551455515555165551755518555195552055521555225552355524555255552655527555285552955530555315553255533555345553555536555375553855539555405554155542555435554455545555465554755548555495555055551555525555355554555555555655557555585555955560555615556255563555645556555566555675556855569555705557155572555735557455575555765557755578555795558055581555825558355584555855558655587555885558955590555915559255593555945559555596555975559855599556005560155602556035560455605556065560755608556095561055611556125561355614556155561655617556185561955620556215562255623556245562555626556275562855629556305563155632556335563455635556365563755638556395564055641556425564355644556455564655647556485564955650556515565255653556545565555656556575565855659556605566155662556635566455665556665566755668556695567055671556725567355674556755567655677556785567955680556815568255683556845568555686556875568855689556905569155692556935569455695556965569755698556995570055701557025570355704557055570655707557085570955710557115571255713557145571555716557175571855719557205572155722557235572455725557265572755728557295573055731557325573355734557355573655737557385573955740557415574255743557445574555746557475574855749557505575155752557535575455755557565575755758557595576055761557625576355764557655576655767557685576955770557715577255773557745577555776557775577855779557805578155782557835578455785557865578755788557895579055791557925579355794557955579655797557985579955800558015580255803558045580555806558075580855809558105581155812558135581455815558165581755818558195582055821558225582355824558255582655827558285582955830558315583255833558345583555836558375583855839558405584155842558435584455845558465584755848558495585055851558525585355854558555585655857558585585955860558615586255863558645586555866558675586855869558705587155872558735587455875558765587755878558795588055881558825588355884558855588655887558885588955890558915589255893558945589555896558975589855899559005590155902559035590455905559065590755908559095591055911559125591355914559155591655917559185591955920559215592255923559245592555926559275592855929559305593155932559335593455935559365593755938559395594055941559425594355944559455594655947559485594955950559515595255953559545595555956559575595855959559605596155962559635596455965559665596755968559695597055971559725597355974559755597655977559785597955980559815598255983559845598555986559875598855989559905599155992559935599455995559965599755998559995600056001560025600356004560055600656007560085600956010560115601256013560145601556016560175601856019560205602156022560235602456025560265602756028560295603056031560325603356034560355603656037560385603956040560415604256043560445604556046560475604856049560505605156052560535605456055560565605756058560595606056061560625606356064560655606656067560685606956070560715607256073560745607556076560775607856079560805608156082560835608456085560865608756088560895609056091560925609356094560955609656097560985609956100561015610256103561045610556106561075610856109561105611156112561135611456115561165611756118561195612056121561225612356124561255612656127561285612956130561315613256133561345613556136561375613856139561405614156142561435614456145561465614756148561495615056151561525615356154561555615656157561585615956160561615616256163561645616556166561675616856169561705617156172561735617456175561765617756178561795618056181561825618356184561855618656187561885618956190561915619256193561945619556196561975619856199562005620156202562035620456205562065620756208562095621056211562125621356214562155621656217562185621956220562215622256223562245622556226562275622856229562305623156232562335623456235562365623756238562395624056241562425624356244562455624656247562485624956250562515625256253562545625556256562575625856259562605626156262562635626456265562665626756268562695627056271562725627356274562755627656277562785627956280562815628256283562845628556286562875628856289562905629156292562935629456295562965629756298562995630056301563025630356304563055630656307563085630956310563115631256313563145631556316563175631856319563205632156322563235632456325563265632756328563295633056331563325633356334563355633656337563385633956340563415634256343563445634556346563475634856349563505635156352563535635456355563565635756358563595636056361563625636356364563655636656367563685636956370563715637256373563745637556376563775637856379563805638156382563835638456385563865638756388563895639056391563925639356394563955639656397563985639956400564015640256403564045640556406564075640856409564105641156412564135641456415564165641756418564195642056421564225642356424564255642656427564285642956430564315643256433564345643556436564375643856439564405644156442564435644456445564465644756448564495645056451564525645356454564555645656457564585645956460564615646256463564645646556466564675646856469564705647156472564735647456475564765647756478564795648056481564825648356484564855648656487564885648956490564915649256493564945649556496564975649856499565005650156502565035650456505565065650756508565095651056511565125651356514565155651656517565185651956520565215652256523565245652556526565275652856529565305653156532565335653456535565365653756538565395654056541565425654356544565455654656547565485654956550565515655256553565545655556556565575655856559565605656156562565635656456565565665656756568565695657056571565725657356574565755657656577565785657956580565815658256583565845658556586565875658856589565905659156592565935659456595565965659756598565995660056601566025660356604566055660656607566085660956610566115661256613566145661556616566175661856619566205662156622566235662456625566265662756628566295663056631566325663356634566355663656637566385663956640566415664256643566445664556646566475664856649566505665156652566535665456655566565665756658566595666056661566625666356664566655666656667566685666956670566715667256673566745667556676566775667856679566805668156682566835668456685566865668756688566895669056691566925669356694566955669656697566985669956700567015670256703567045670556706567075670856709567105671156712567135671456715567165671756718567195672056721567225672356724567255672656727567285672956730567315673256733567345673556736567375673856739567405674156742567435674456745567465674756748567495675056751567525675356754567555675656757567585675956760567615676256763567645676556766567675676856769567705677156772567735677456775567765677756778567795678056781567825678356784567855678656787567885678956790567915679256793567945679556796567975679856799568005680156802568035680456805568065680756808568095681056811568125681356814568155681656817568185681956820568215682256823568245682556826568275682856829568305683156832568335683456835568365683756838568395684056841568425684356844568455684656847568485684956850568515685256853568545685556856568575685856859568605686156862568635686456865568665686756868568695687056871568725687356874568755687656877568785687956880568815688256883568845688556886568875688856889568905689156892568935689456895568965689756898568995690056901569025690356904569055690656907569085690956910569115691256913569145691556916569175691856919569205692156922569235692456925569265692756928569295693056931569325693356934569355693656937569385693956940569415694256943569445694556946569475694856949569505695156952569535695456955569565695756958569595696056961569625696356964569655696656967569685696956970569715697256973569745697556976569775697856979569805698156982569835698456985569865698756988569895699056991569925699356994569955699656997569985699957000570015700257003570045700557006570075700857009570105701157012570135701457015570165701757018570195702057021570225702357024570255702657027570285702957030570315703257033570345703557036570375703857039570405704157042570435704457045570465704757048570495705057051570525705357054570555705657057570585705957060570615706257063570645706557066570675706857069570705707157072570735707457075570765707757078570795708057081570825708357084570855708657087570885708957090570915709257093570945709557096570975709857099571005710157102571035710457105571065710757108571095711057111571125711357114571155711657117571185711957120571215712257123571245712557126571275712857129571305713157132571335713457135571365713757138571395714057141571425714357144571455714657147571485714957150571515715257153571545715557156571575715857159571605716157162571635716457165571665716757168571695717057171571725717357174571755717657177571785717957180571815718257183571845718557186571875718857189571905719157192571935719457195571965719757198571995720057201572025720357204572055720657207572085720957210572115721257213572145721557216572175721857219572205722157222572235722457225572265722757228572295723057231572325723357234572355723657237572385723957240572415724257243572445724557246572475724857249572505725157252572535725457255572565725757258572595726057261572625726357264572655726657267572685726957270572715727257273572745727557276572775727857279572805728157282572835728457285572865728757288572895729057291572925729357294572955729657297572985729957300573015730257303573045730557306573075730857309573105731157312573135731457315573165731757318573195732057321573225732357324573255732657327573285732957330573315733257333573345733557336573375733857339573405734157342573435734457345573465734757348573495735057351573525735357354573555735657357573585735957360573615736257363573645736557366573675736857369573705737157372573735737457375573765737757378573795738057381573825738357384573855738657387573885738957390573915739257393573945739557396573975739857399574005740157402574035740457405574065740757408574095741057411574125741357414574155741657417574185741957420574215742257423574245742557426574275742857429574305743157432574335743457435574365743757438574395744057441574425744357444574455744657447574485744957450574515745257453574545745557456574575745857459574605746157462574635746457465574665746757468574695747057471574725747357474574755747657477574785747957480574815748257483574845748557486574875748857489574905749157492574935749457495574965749757498574995750057501575025750357504575055750657507575085750957510575115751257513575145751557516575175751857519575205752157522575235752457525575265752757528575295753057531575325753357534575355753657537575385753957540575415754257543575445754557546575475754857549575505755157552575535755457555575565755757558575595756057561575625756357564575655756657567575685756957570575715757257573575745757557576575775757857579575805758157582575835758457585575865758757588575895759057591575925759357594575955759657597575985759957600576015760257603576045760557606576075760857609576105761157612576135761457615576165761757618576195762057621576225762357624576255762657627576285762957630576315763257633576345763557636576375763857639576405764157642576435764457645576465764757648576495765057651576525765357654576555765657657576585765957660576615766257663576645766557666576675766857669576705767157672576735767457675576765767757678576795768057681576825768357684576855768657687576885768957690576915769257693576945769557696576975769857699577005770157702577035770457705577065770757708577095771057711577125771357714577155771657717577185771957720577215772257723577245772557726577275772857729577305773157732577335773457735577365773757738577395774057741577425774357744577455774657747577485774957750577515775257753577545775557756577575775857759577605776157762577635776457765577665776757768577695777057771577725777357774577755777657777577785777957780577815778257783577845778557786577875778857789577905779157792577935779457795577965779757798577995780057801578025780357804578055780657807578085780957810578115781257813578145781557816578175781857819578205782157822578235782457825578265782757828578295783057831578325783357834578355783657837578385783957840578415784257843578445784557846578475784857849578505785157852578535785457855578565785757858578595786057861578625786357864578655786657867578685786957870578715787257873578745787557876578775787857879578805788157882578835788457885578865788757888578895789057891578925789357894578955789657897578985789957900579015790257903579045790557906579075790857909579105791157912579135791457915579165791757918579195792057921579225792357924579255792657927579285792957930579315793257933579345793557936579375793857939579405794157942579435794457945579465794757948579495795057951579525795357954579555795657957579585795957960579615796257963579645796557966579675796857969579705797157972579735797457975579765797757978579795798057981579825798357984579855798657987579885798957990579915799257993579945799557996579975799857999580005800158002580035800458005580065800758008580095801058011580125801358014580155801658017580185801958020580215802258023580245802558026580275802858029580305803158032580335803458035580365803758038580395804058041580425804358044580455804658047580485804958050580515805258053580545805558056580575805858059580605806158062580635806458065580665806758068580695807058071580725807358074580755807658077580785807958080580815808258083580845808558086580875808858089580905809158092580935809458095580965809758098580995810058101581025810358104581055810658107581085810958110581115811258113581145811558116581175811858119581205812158122581235812458125581265812758128581295813058131581325813358134581355813658137581385813958140581415814258143581445814558146581475814858149581505815158152581535815458155581565815758158581595816058161581625816358164581655816658167581685816958170581715817258173581745817558176581775817858179581805818158182581835818458185581865818758188581895819058191581925819358194581955819658197581985819958200582015820258203582045820558206582075820858209582105821158212582135821458215582165821758218582195822058221582225822358224582255822658227582285822958230582315823258233582345823558236582375823858239582405824158242582435824458245582465824758248582495825058251582525825358254582555825658257582585825958260582615826258263582645826558266582675826858269582705827158272582735827458275582765827758278582795828058281582825828358284582855828658287582885828958290582915829258293582945829558296582975829858299583005830158302583035830458305583065830758308583095831058311583125831358314583155831658317583185831958320583215832258323583245832558326583275832858329583305833158332583335833458335583365833758338583395834058341583425834358344583455834658347583485834958350583515835258353583545835558356583575835858359583605836158362583635836458365583665836758368583695837058371583725837358374583755837658377583785837958380583815838258383583845838558386583875838858389583905839158392583935839458395583965839758398583995840058401584025840358404584055840658407584085840958410584115841258413584145841558416584175841858419584205842158422584235842458425584265842758428584295843058431584325843358434584355843658437584385843958440584415844258443584445844558446584475844858449584505845158452584535845458455584565845758458584595846058461584625846358464584655846658467584685846958470584715847258473584745847558476584775847858479584805848158482584835848458485584865848758488584895849058491584925849358494584955849658497584985849958500585015850258503585045850558506585075850858509585105851158512585135851458515585165851758518585195852058521585225852358524585255852658527585285852958530585315853258533585345853558536585375853858539585405854158542585435854458545585465854758548585495855058551585525855358554585555855658557585585855958560585615856258563585645856558566585675856858569585705857158572585735857458575585765857758578585795858058581585825858358584585855858658587585885858958590585915859258593585945859558596585975859858599586005860158602586035860458605586065860758608586095861058611586125861358614586155861658617586185861958620586215862258623586245862558626586275862858629586305863158632586335863458635586365863758638586395864058641586425864358644586455864658647586485864958650586515865258653586545865558656586575865858659586605866158662586635866458665586665866758668586695867058671586725867358674586755867658677586785867958680586815868258683586845868558686586875868858689586905869158692586935869458695586965869758698586995870058701587025870358704587055870658707587085870958710587115871258713587145871558716587175871858719587205872158722587235872458725587265872758728587295873058731587325873358734587355873658737587385873958740587415874258743587445874558746587475874858749587505875158752587535875458755587565875758758587595876058761587625876358764587655876658767587685876958770587715877258773587745877558776587775877858779587805878158782587835878458785587865878758788587895879058791587925879358794587955879658797587985879958800588015880258803588045880558806588075880858809588105881158812588135881458815588165881758818588195882058821588225882358824588255882658827588285882958830588315883258833588345883558836588375883858839588405884158842588435884458845588465884758848588495885058851588525885358854588555885658857588585885958860588615886258863588645886558866588675886858869588705887158872588735887458875588765887758878588795888058881588825888358884588855888658887588885888958890588915889258893588945889558896588975889858899589005890158902589035890458905589065890758908589095891058911589125891358914589155891658917589185891958920589215892258923589245892558926589275892858929589305893158932589335893458935589365893758938589395894058941589425894358944589455894658947589485894958950589515895258953589545895558956589575895858959589605896158962589635896458965589665896758968589695897058971589725897358974589755897658977589785897958980589815898258983589845898558986589875898858989589905899158992589935899458995589965899758998589995900059001590025900359004590055900659007590085900959010590115901259013590145901559016590175901859019590205902159022590235902459025590265902759028590295903059031590325903359034590355903659037590385903959040590415904259043590445904559046590475904859049590505905159052590535905459055590565905759058590595906059061590625906359064590655906659067590685906959070590715907259073590745907559076590775907859079590805908159082590835908459085590865908759088590895909059091590925909359094590955909659097590985909959100591015910259103591045910559106591075910859109591105911159112591135911459115591165911759118591195912059121591225912359124591255912659127591285912959130591315913259133591345913559136591375913859139591405914159142591435914459145591465914759148591495915059151591525915359154591555915659157591585915959160591615916259163591645916559166591675916859169591705917159172591735917459175591765917759178591795918059181591825918359184591855918659187591885918959190591915919259193591945919559196591975919859199592005920159202592035920459205592065920759208592095921059211592125921359214592155921659217592185921959220592215922259223592245922559226592275922859229592305923159232592335923459235592365923759238592395924059241592425924359244592455924659247592485924959250592515925259253592545925559256592575925859259592605926159262592635926459265592665926759268592695927059271592725927359274592755927659277592785927959280592815928259283592845928559286592875928859289592905929159292592935929459295592965929759298592995930059301593025930359304593055930659307593085930959310593115931259313593145931559316593175931859319593205932159322593235932459325593265932759328593295933059331593325933359334593355933659337593385933959340593415934259343593445934559346593475934859349593505935159352593535935459355593565935759358593595936059361593625936359364593655936659367593685936959370593715937259373593745937559376593775937859379593805938159382593835938459385593865938759388593895939059391593925939359394593955939659397593985939959400594015940259403594045940559406594075940859409594105941159412594135941459415594165941759418594195942059421594225942359424594255942659427594285942959430594315943259433594345943559436594375943859439594405944159442594435944459445594465944759448594495945059451594525945359454594555945659457594585945959460594615946259463594645946559466594675946859469594705947159472594735947459475594765947759478594795948059481594825948359484594855948659487594885948959490594915949259493594945949559496594975949859499595005950159502595035950459505595065950759508595095951059511595125951359514595155951659517595185951959520595215952259523595245952559526595275952859529595305953159532595335953459535595365953759538595395954059541595425954359544595455954659547595485954959550595515955259553595545955559556595575955859559595605956159562595635956459565595665956759568595695957059571595725957359574595755957659577595785957959580595815958259583595845958559586595875958859589595905959159592595935959459595595965959759598595995960059601596025960359604596055960659607596085960959610596115961259613596145961559616596175961859619596205962159622596235962459625596265962759628596295963059631596325963359634596355963659637596385963959640596415964259643596445964559646596475964859649596505965159652596535965459655596565965759658596595966059661596625966359664596655966659667596685966959670596715967259673596745967559676596775967859679596805968159682596835968459685596865968759688596895969059691596925969359694596955969659697596985969959700597015970259703597045970559706597075970859709597105971159712597135971459715597165971759718597195972059721597225972359724597255972659727597285972959730597315973259733597345973559736597375973859739597405974159742597435974459745597465974759748597495975059751597525975359754597555975659757597585975959760597615976259763597645976559766597675976859769597705977159772597735977459775597765977759778597795978059781597825978359784597855978659787597885978959790597915979259793597945979559796597975979859799598005980159802598035980459805598065980759808598095981059811598125981359814598155981659817598185981959820598215982259823598245982559826598275982859829598305983159832598335983459835598365983759838598395984059841598425984359844598455984659847598485984959850598515985259853598545985559856598575985859859598605986159862598635986459865598665986759868598695987059871598725987359874598755987659877598785987959880598815988259883598845988559886598875988859889598905989159892598935989459895598965989759898598995990059901599025990359904599055990659907599085990959910599115991259913599145991559916599175991859919599205992159922599235992459925599265992759928599295993059931599325993359934599355993659937599385993959940599415994259943599445994559946599475994859949599505995159952599535995459955599565995759958599595996059961599625996359964599655996659967599685996959970599715997259973599745997559976599775997859979599805998159982599835998459985599865998759988599895999059991599925999359994599955999659997599985999960000600016000260003600046000560006600076000860009600106001160012600136001460015600166001760018600196002060021600226002360024600256002660027600286002960030600316003260033600346003560036600376003860039600406004160042600436004460045600466004760048600496005060051600526005360054600556005660057600586005960060600616006260063600646006560066600676006860069600706007160072600736007460075600766007760078600796008060081600826008360084600856008660087600886008960090600916009260093600946009560096600976009860099601006010160102601036010460105601066010760108601096011060111601126011360114601156011660117601186011960120601216012260123601246012560126601276012860129601306013160132601336013460135601366013760138601396014060141601426014360144601456014660147601486014960150601516015260153601546015560156601576015860159601606016160162601636016460165601666016760168601696017060171601726017360174601756017660177601786017960180601816018260183601846018560186601876018860189601906019160192601936019460195601966019760198601996020060201602026020360204602056020660207602086020960210602116021260213602146021560216602176021860219602206022160222602236022460225602266022760228602296023060231602326023360234602356023660237602386023960240602416024260243602446024560246602476024860249602506025160252602536025460255602566025760258602596026060261602626026360264602656026660267602686026960270602716027260273602746027560276602776027860279602806028160282602836028460285602866028760288602896029060291602926029360294602956029660297602986029960300603016030260303603046030560306603076030860309603106031160312603136031460315603166031760318603196032060321603226032360324603256032660327603286032960330603316033260333603346033560336603376033860339603406034160342603436034460345603466034760348603496035060351603526035360354603556035660357603586035960360603616036260363603646036560366603676036860369603706037160372603736037460375603766037760378603796038060381603826038360384603856038660387603886038960390603916039260393603946039560396603976039860399604006040160402604036040460405604066040760408604096041060411604126041360414604156041660417604186041960420604216042260423604246042560426604276042860429604306043160432604336043460435604366043760438604396044060441604426044360444604456044660447604486044960450604516045260453604546045560456604576045860459604606046160462604636046460465604666046760468604696047060471604726047360474604756047660477604786047960480604816048260483604846048560486604876048860489604906049160492604936049460495604966049760498604996050060501605026050360504605056050660507605086050960510605116051260513605146051560516605176051860519605206052160522605236052460525605266052760528605296053060531605326053360534605356053660537605386053960540605416054260543605446054560546605476054860549605506055160552605536055460555605566055760558605596056060561605626056360564605656056660567605686056960570605716057260573605746057560576605776057860579605806058160582605836058460585605866058760588605896059060591605926059360594605956059660597605986059960600606016060260603606046060560606606076060860609606106061160612606136061460615606166061760618606196062060621606226062360624606256062660627606286062960630606316063260633606346063560636606376063860639606406064160642606436064460645606466064760648606496065060651606526065360654606556065660657606586065960660606616066260663606646066560666606676066860669606706067160672606736067460675606766067760678606796068060681606826068360684606856068660687606886068960690606916069260693606946069560696606976069860699607006070160702607036070460705607066070760708607096071060711607126071360714607156071660717607186071960720607216072260723607246072560726607276072860729607306073160732607336073460735607366073760738607396074060741607426074360744607456074660747607486074960750607516075260753607546075560756607576075860759607606076160762607636076460765607666076760768607696077060771607726077360774607756077660777607786077960780607816078260783607846078560786607876078860789607906079160792607936079460795607966079760798607996080060801608026080360804608056080660807608086080960810608116081260813608146081560816608176081860819608206082160822608236082460825608266082760828608296083060831608326083360834608356083660837608386083960840608416084260843608446084560846608476084860849608506085160852608536085460855608566085760858608596086060861608626086360864608656086660867608686086960870608716087260873608746087560876608776087860879608806088160882608836088460885608866088760888608896089060891608926089360894608956089660897608986089960900609016090260903609046090560906609076090860909609106091160912609136091460915609166091760918609196092060921609226092360924609256092660927609286092960930609316093260933609346093560936609376093860939609406094160942609436094460945609466094760948609496095060951609526095360954609556095660957609586095960960609616096260963609646096560966609676096860969609706097160972609736097460975609766097760978609796098060981609826098360984609856098660987609886098960990609916099260993609946099560996609976099860999610006100161002610036100461005610066100761008610096101061011610126101361014610156101661017610186101961020610216102261023610246102561026610276102861029610306103161032610336103461035610366103761038610396104061041610426104361044610456104661047610486104961050610516105261053610546105561056610576105861059610606106161062610636106461065610666106761068610696107061071610726107361074610756107661077610786107961080610816108261083610846108561086610876108861089610906109161092610936109461095610966109761098610996110061101611026110361104611056110661107611086110961110611116111261113611146111561116611176111861119611206112161122611236112461125611266112761128611296113061131611326113361134611356113661137611386113961140611416114261143611446114561146611476114861149611506115161152611536115461155611566115761158611596116061161611626116361164611656116661167611686116961170611716117261173611746117561176611776117861179611806118161182611836118461185611866118761188611896119061191611926119361194611956119661197611986119961200612016120261203612046120561206612076120861209612106121161212612136121461215612166121761218612196122061221612226122361224612256122661227612286122961230612316123261233612346123561236612376123861239612406124161242612436124461245612466124761248612496125061251612526125361254612556125661257612586125961260612616126261263612646126561266612676126861269612706127161272612736127461275612766127761278612796128061281612826128361284612856128661287612886128961290612916129261293612946129561296612976129861299613006130161302613036130461305613066130761308613096131061311613126131361314613156131661317613186131961320613216132261323613246132561326613276132861329613306133161332613336133461335613366133761338613396134061341613426134361344613456134661347613486134961350613516135261353613546135561356613576135861359613606136161362613636136461365613666136761368613696137061371613726137361374613756137661377613786137961380613816138261383613846138561386613876138861389613906139161392613936139461395613966139761398613996140061401614026140361404614056140661407614086140961410614116141261413614146141561416614176141861419614206142161422614236142461425614266142761428614296143061431614326143361434614356143661437614386143961440614416144261443614446144561446614476144861449614506145161452614536145461455614566145761458614596146061461614626146361464614656146661467614686146961470614716147261473614746147561476614776147861479614806148161482614836148461485614866148761488614896149061491614926149361494614956149661497614986149961500615016150261503615046150561506615076150861509615106151161512615136151461515615166151761518615196152061521615226152361524615256152661527615286152961530615316153261533615346153561536615376153861539615406154161542615436154461545615466154761548615496155061551615526155361554615556155661557615586155961560615616156261563615646156561566615676156861569615706157161572615736157461575615766157761578615796158061581615826158361584615856158661587615886158961590615916159261593615946159561596615976159861599616006160161602616036160461605616066160761608616096161061611616126161361614616156161661617616186161961620616216162261623616246162561626616276162861629616306163161632616336163461635616366163761638616396164061641616426164361644616456164661647616486164961650616516165261653616546165561656616576165861659616606166161662616636166461665616666166761668616696167061671616726167361674616756167661677616786167961680616816168261683616846168561686616876168861689616906169161692616936169461695616966169761698616996170061701617026170361704617056170661707617086170961710617116171261713617146171561716617176171861719617206172161722617236172461725617266172761728617296173061731617326173361734617356173661737617386173961740617416174261743617446174561746617476174861749617506175161752617536175461755617566175761758617596176061761617626176361764617656176661767617686176961770617716177261773617746177561776617776177861779617806178161782617836178461785617866178761788617896179061791617926179361794617956179661797617986179961800618016180261803618046180561806618076180861809618106181161812618136181461815618166181761818618196182061821618226182361824618256182661827618286182961830618316183261833618346183561836618376183861839618406184161842618436184461845618466184761848618496185061851618526185361854618556185661857618586185961860618616186261863618646186561866618676186861869618706187161872618736187461875618766187761878618796188061881618826188361884618856188661887618886188961890618916189261893618946189561896618976189861899619006190161902619036190461905619066190761908619096191061911619126191361914619156191661917619186191961920619216192261923619246192561926619276192861929619306193161932619336193461935619366193761938619396194061941619426194361944619456194661947619486194961950619516195261953619546195561956619576195861959619606196161962619636196461965619666196761968619696197061971619726197361974619756197661977619786197961980619816198261983619846198561986619876198861989619906199161992619936199461995619966199761998619996200062001620026200362004620056200662007620086200962010620116201262013620146201562016620176201862019620206202162022620236202462025620266202762028620296203062031620326203362034620356203662037620386203962040620416204262043620446204562046620476204862049620506205162052620536205462055620566205762058620596206062061620626206362064620656206662067620686206962070620716207262073620746207562076620776207862079620806208162082620836208462085620866208762088620896209062091620926209362094620956209662097620986209962100621016210262103621046210562106621076210862109621106211162112621136211462115621166211762118621196212062121621226212362124621256212662127621286212962130621316213262133621346213562136621376213862139621406214162142621436214462145621466214762148621496215062151621526215362154621556215662157621586215962160621616216262163621646216562166621676216862169621706217162172621736217462175621766217762178621796218062181621826218362184621856218662187621886218962190621916219262193621946219562196621976219862199622006220162202622036220462205622066220762208622096221062211622126221362214622156221662217622186221962220622216222262223622246222562226622276222862229622306223162232622336223462235622366223762238622396224062241622426224362244622456224662247622486224962250622516225262253622546225562256622576225862259622606226162262622636226462265622666226762268622696227062271622726227362274622756227662277622786227962280622816228262283622846228562286622876228862289622906229162292622936229462295622966229762298622996230062301623026230362304623056230662307623086230962310623116231262313623146231562316623176231862319623206232162322623236232462325623266232762328623296233062331623326233362334623356233662337623386233962340623416234262343623446234562346623476234862349623506235162352623536235462355623566235762358623596236062361623626236362364623656236662367623686236962370623716237262373623746237562376623776237862379623806238162382623836238462385623866238762388623896239062391623926239362394623956239662397623986239962400624016240262403624046240562406624076240862409624106241162412624136241462415624166241762418624196242062421624226242362424624256242662427624286242962430624316243262433624346243562436624376243862439624406244162442624436244462445624466244762448624496245062451624526245362454624556245662457624586245962460624616246262463624646246562466624676246862469624706247162472624736247462475624766247762478624796248062481624826248362484624856248662487624886248962490624916249262493624946249562496624976249862499625006250162502625036250462505625066250762508625096251062511625126251362514625156251662517625186251962520625216252262523625246252562526625276252862529625306253162532625336253462535625366253762538625396254062541625426254362544625456254662547625486254962550625516255262553625546255562556625576255862559625606256162562625636256462565625666256762568625696257062571625726257362574625756257662577625786257962580625816258262583625846258562586625876258862589625906259162592625936259462595625966259762598625996260062601626026260362604626056260662607626086260962610626116261262613626146261562616626176261862619626206262162622626236262462625626266262762628626296263062631626326263362634626356263662637626386263962640626416264262643626446264562646626476264862649626506265162652626536265462655626566265762658626596266062661626626266362664626656266662667626686266962670626716267262673626746267562676626776267862679626806268162682626836268462685626866268762688626896269062691626926269362694626956269662697626986269962700627016270262703627046270562706627076270862709627106271162712627136271462715627166271762718627196272062721627226272362724627256272662727627286272962730627316273262733627346273562736627376273862739627406274162742627436274462745627466274762748627496275062751627526275362754627556275662757627586275962760627616276262763627646276562766627676276862769627706277162772627736277462775627766277762778627796278062781627826278362784627856278662787627886278962790627916279262793627946279562796627976279862799628006280162802628036280462805628066280762808628096281062811628126281362814628156281662817628186281962820628216282262823628246282562826628276282862829628306283162832628336283462835628366283762838628396284062841628426284362844628456284662847628486284962850628516285262853628546285562856628576285862859628606286162862628636286462865628666286762868628696287062871628726287362874628756287662877628786287962880628816288262883628846288562886628876288862889628906289162892628936289462895628966289762898628996290062901629026290362904629056290662907629086290962910629116291262913629146291562916629176291862919629206292162922629236292462925629266292762928629296293062931629326293362934629356293662937629386293962940629416294262943629446294562946629476294862949629506295162952629536295462955629566295762958629596296062961629626296362964629656296662967629686296962970629716297262973629746297562976629776297862979629806298162982629836298462985629866298762988629896299062991629926299362994629956299662997629986299963000630016300263003630046300563006630076300863009630106301163012630136301463015630166301763018630196302063021630226302363024630256302663027630286302963030630316303263033630346303563036630376303863039630406304163042630436304463045630466304763048630496305063051630526305363054630556305663057630586305963060630616306263063630646306563066630676306863069630706307163072630736307463075630766307763078630796308063081630826308363084630856308663087630886308963090630916309263093630946309563096630976309863099631006310163102631036310463105631066310763108631096311063111631126311363114631156311663117631186311963120631216312263123631246312563126631276312863129631306313163132631336313463135631366313763138631396314063141631426314363144631456314663147631486314963150631516315263153631546315563156631576315863159631606316163162631636316463165631666316763168631696317063171631726317363174631756317663177631786317963180631816318263183631846318563186631876318863189631906319163192631936319463195631966319763198631996320063201632026320363204632056320663207632086320963210632116321263213632146321563216632176321863219632206322163222632236322463225632266322763228632296323063231632326323363234632356323663237632386323963240632416324263243632446324563246632476324863249632506325163252632536325463255632566325763258632596326063261632626326363264632656326663267632686326963270632716327263273632746327563276632776327863279632806328163282632836328463285632866328763288632896329063291632926329363294632956329663297632986329963300633016330263303633046330563306633076330863309633106331163312633136331463315633166331763318633196332063321633226332363324633256332663327633286332963330633316333263333633346333563336633376333863339633406334163342633436334463345633466334763348633496335063351633526335363354633556335663357633586335963360633616336263363633646336563366633676336863369633706337163372633736337463375633766337763378633796338063381633826338363384633856338663387633886338963390633916339263393633946339563396633976339863399634006340163402634036340463405634066340763408634096341063411634126341363414634156341663417634186341963420634216342263423634246342563426634276342863429634306343163432634336343463435634366343763438634396344063441634426344363444634456344663447634486344963450634516345263453634546345563456634576345863459634606346163462634636346463465634666346763468634696347063471634726347363474634756347663477634786347963480634816348263483634846348563486634876348863489634906349163492634936349463495634966349763498634996350063501635026350363504635056350663507635086350963510635116351263513635146351563516635176351863519635206352163522635236352463525635266352763528635296353063531635326353363534635356353663537635386353963540635416354263543635446354563546635476354863549635506355163552635536355463555635566355763558635596356063561635626356363564635656356663567635686356963570635716357263573635746357563576635776357863579635806358163582635836358463585635866358763588635896359063591635926359363594635956359663597635986359963600636016360263603636046360563606636076360863609636106361163612636136361463615636166361763618636196362063621636226362363624636256362663627636286362963630636316363263633636346363563636636376363863639636406364163642636436364463645636466364763648636496365063651636526365363654636556365663657636586365963660636616366263663636646366563666636676366863669636706367163672636736367463675636766367763678636796368063681636826368363684636856368663687636886368963690636916369263693636946369563696636976369863699637006370163702637036370463705637066370763708637096371063711637126371363714637156371663717637186371963720637216372263723637246372563726637276372863729637306373163732637336373463735637366373763738637396374063741637426374363744637456374663747637486374963750637516375263753637546375563756637576375863759637606376163762637636376463765637666376763768637696377063771637726377363774637756377663777637786377963780637816378263783637846378563786637876378863789637906379163792637936379463795637966379763798637996380063801638026380363804638056380663807638086380963810638116381263813638146381563816638176381863819638206382163822638236382463825638266382763828638296383063831638326383363834638356383663837638386383963840638416384263843638446384563846638476384863849638506385163852638536385463855638566385763858638596386063861638626386363864638656386663867638686386963870638716387263873638746387563876638776387863879638806388163882638836388463885638866388763888638896389063891638926389363894638956389663897638986389963900639016390263903639046390563906639076390863909639106391163912639136391463915639166391763918639196392063921639226392363924639256392663927639286392963930639316393263933639346393563936639376393863939639406394163942639436394463945639466394763948639496395063951639526395363954639556395663957639586395963960639616396263963639646396563966639676396863969639706397163972639736397463975639766397763978639796398063981639826398363984639856398663987639886398963990639916399263993639946399563996639976399863999640006400164002640036400464005640066400764008640096401064011640126401364014640156401664017640186401964020640216402264023640246402564026640276402864029640306403164032640336403464035640366403764038640396404064041640426404364044640456404664047640486404964050640516405264053640546405564056640576405864059640606406164062640636406464065640666406764068640696407064071640726407364074640756407664077640786407964080640816408264083640846408564086640876408864089640906409164092640936409464095640966409764098640996410064101641026410364104641056410664107641086410964110641116411264113641146411564116641176411864119641206412164122641236412464125641266412764128641296413064131641326413364134641356413664137641386413964140641416414264143641446414564146641476414864149641506415164152641536415464155641566415764158641596416064161641626416364164641656416664167641686416964170641716417264173641746417564176641776417864179641806418164182641836418464185641866418764188641896419064191641926419364194641956419664197641986419964200642016420264203642046420564206642076420864209642106421164212642136421464215642166421764218642196422064221642226422364224642256422664227642286422964230642316423264233642346423564236642376423864239642406424164242642436424464245642466424764248642496425064251642526425364254642556425664257642586425964260642616426264263642646426564266642676426864269642706427164272642736427464275642766427764278642796428064281642826428364284642856428664287642886428964290642916429264293642946429564296642976429864299643006430164302643036430464305643066430764308643096431064311643126431364314643156431664317643186431964320643216432264323643246432564326643276432864329643306433164332643336433464335643366433764338643396434064341643426434364344643456434664347643486434964350643516435264353643546435564356643576435864359643606436164362643636436464365643666436764368643696437064371643726437364374643756437664377643786437964380643816438264383643846438564386643876438864389643906439164392643936439464395643966439764398643996440064401644026440364404644056440664407644086440964410644116441264413644146441564416644176441864419644206442164422644236442464425644266442764428644296443064431644326443364434644356443664437644386443964440644416444264443644446444564446644476444864449644506445164452644536445464455644566445764458644596446064461644626446364464644656446664467644686446964470644716447264473644746447564476644776447864479644806448164482644836448464485644866448764488644896449064491644926449364494644956449664497644986449964500645016450264503645046450564506645076450864509645106451164512645136451464515645166451764518645196452064521645226452364524645256452664527645286452964530645316453264533645346453564536645376453864539645406454164542645436454464545645466454764548645496455064551645526455364554645556455664557645586455964560645616456264563645646456564566645676456864569645706457164572645736457464575645766457764578645796458064581645826458364584645856458664587645886458964590645916459264593645946459564596645976459864599646006460164602646036460464605646066460764608646096461064611646126461364614646156461664617646186461964620646216462264623646246462564626646276462864629646306463164632646336463464635646366463764638646396464064641646426464364644646456464664647646486464964650646516465264653646546465564656646576465864659646606466164662646636466464665646666466764668646696467064671646726467364674646756467664677646786467964680646816468264683646846468564686646876468864689646906469164692646936469464695646966469764698646996470064701647026470364704647056470664707647086470964710647116471264713647146471564716647176471864719647206472164722647236472464725647266472764728647296473064731647326473364734647356473664737647386473964740647416474264743647446474564746647476474864749647506475164752647536475464755647566475764758647596476064761647626476364764647656476664767647686476964770647716477264773647746477564776647776477864779647806478164782647836478464785647866478764788647896479064791647926479364794647956479664797647986479964800648016480264803648046480564806648076480864809648106481164812648136481464815648166481764818648196482064821648226482364824648256482664827648286482964830648316483264833648346483564836648376483864839648406484164842648436484464845648466484764848648496485064851648526485364854648556485664857648586485964860648616486264863648646486564866648676486864869648706487164872648736487464875648766487764878648796488064881648826488364884648856488664887648886488964890648916489264893648946489564896648976489864899649006490164902649036490464905649066490764908649096491064911649126491364914649156491664917649186491964920649216492264923649246492564926649276492864929649306493164932649336493464935649366493764938649396494064941649426494364944649456494664947649486494964950649516495264953649546495564956649576495864959649606496164962649636496464965649666496764968649696497064971649726497364974649756497664977649786497964980649816498264983649846498564986649876498864989649906499164992649936499464995649966499764998649996500065001650026500365004650056500665007650086500965010650116501265013650146501565016650176501865019650206502165022650236502465025650266502765028650296503065031650326503365034650356503665037650386503965040650416504265043650446504565046650476504865049650506505165052650536505465055650566505765058650596506065061650626506365064650656506665067650686506965070650716507265073650746507565076650776507865079650806508165082650836508465085650866508765088650896509065091650926509365094650956509665097650986509965100651016510265103651046510565106651076510865109651106511165112651136511465115651166511765118651196512065121651226512365124651256512665127651286512965130651316513265133651346513565136651376513865139651406514165142651436514465145651466514765148651496515065151651526515365154651556515665157651586515965160651616516265163651646516565166651676516865169651706517165172651736517465175651766517765178651796518065181651826518365184651856518665187651886518965190651916519265193651946519565196651976519865199652006520165202652036520465205652066520765208652096521065211652126521365214652156521665217652186521965220652216522265223652246522565226652276522865229652306523165232652336523465235652366523765238652396524065241652426524365244652456524665247652486524965250652516525265253652546525565256652576525865259652606526165262652636526465265652666526765268652696527065271652726527365274652756527665277652786527965280652816528265283652846528565286652876528865289652906529165292652936529465295652966529765298652996530065301653026530365304653056530665307653086530965310653116531265313653146531565316653176531865319653206532165322653236532465325653266532765328653296533065331653326533365334653356533665337653386533965340653416534265343653446534565346653476534865349653506535165352653536535465355653566535765358653596536065361653626536365364653656536665367653686536965370653716537265373653746537565376653776537865379653806538165382653836538465385653866538765388653896539065391653926539365394653956539665397653986539965400654016540265403654046540565406654076540865409654106541165412654136541465415654166541765418654196542065421654226542365424654256542665427654286542965430654316543265433654346543565436654376543865439654406544165442654436544465445654466544765448654496545065451654526545365454654556545665457654586545965460654616546265463654646546565466654676546865469654706547165472654736547465475654766547765478654796548065481654826548365484654856548665487654886548965490654916549265493654946549565496654976549865499655006550165502655036550465505655066550765508655096551065511655126551365514655156551665517655186551965520655216552265523655246552565526655276552865529655306553165532655336553465535655366553765538655396554065541655426554365544655456554665547655486554965550655516555265553655546555565556655576555865559655606556165562655636556465565655666556765568655696557065571655726557365574655756557665577655786557965580655816558265583655846558565586655876558865589655906559165592655936559465595655966559765598655996560065601656026560365604656056560665607656086560965610656116561265613656146561565616656176561865619656206562165622656236562465625656266562765628656296563065631656326563365634656356563665637656386563965640656416564265643656446564565646656476564865649656506565165652656536565465655656566565765658656596566065661656626566365664656656566665667656686566965670656716567265673656746567565676656776567865679656806568165682656836568465685656866568765688656896569065691656926569365694656956569665697656986569965700657016570265703657046570565706657076570865709657106571165712657136571465715657166571765718657196572065721657226572365724657256572665727657286572965730657316573265733657346573565736657376573865739657406574165742657436574465745657466574765748657496575065751657526575365754657556575665757657586575965760657616576265763657646576565766657676576865769657706577165772657736577465775657766577765778657796578065781657826578365784657856578665787657886578965790657916579265793657946579565796657976579865799658006580165802658036580465805658066580765808658096581065811658126581365814658156581665817658186581965820658216582265823658246582565826658276582865829658306583165832658336583465835658366583765838658396584065841658426584365844658456584665847658486584965850658516585265853658546585565856658576585865859658606586165862658636586465865658666586765868658696587065871658726587365874658756587665877658786587965880658816588265883658846588565886658876588865889658906589165892658936589465895658966589765898658996590065901659026590365904659056590665907659086590965910659116591265913659146591565916659176591865919659206592165922659236592465925659266592765928659296593065931659326593365934659356593665937659386593965940659416594265943659446594565946659476594865949659506595165952659536595465955659566595765958659596596065961659626596365964659656596665967659686596965970659716597265973659746597565976659776597865979659806598165982659836598465985659866598765988659896599065991659926599365994659956599665997659986599966000660016600266003660046600566006660076600866009660106601166012660136601466015660166601766018660196602066021660226602366024660256602666027660286602966030660316603266033660346603566036660376603866039660406604166042660436604466045660466604766048660496605066051660526605366054660556605666057660586605966060660616606266063660646606566066660676606866069660706607166072660736607466075660766607766078660796608066081660826608366084660856608666087660886608966090660916609266093660946609566096660976609866099661006610166102661036610466105661066610766108661096611066111661126611366114661156611666117661186611966120661216612266123661246612566126661276612866129661306613166132661336613466135661366613766138661396614066141661426614366144661456614666147661486614966150661516615266153661546615566156661576615866159661606616166162661636616466165661666616766168661696617066171661726617366174661756617666177661786617966180661816618266183661846618566186661876618866189661906619166192661936619466195661966619766198661996620066201662026620366204662056620666207662086620966210662116621266213662146621566216662176621866219662206622166222662236622466225662266622766228662296623066231662326623366234662356623666237662386623966240662416624266243662446624566246662476624866249662506625166252662536625466255662566625766258662596626066261662626626366264662656626666267662686626966270662716627266273662746627566276662776627866279662806628166282662836628466285662866628766288662896629066291662926629366294662956629666297662986629966300663016630266303663046630566306663076630866309663106631166312663136631466315663166631766318663196632066321663226632366324663256632666327663286632966330663316633266333663346633566336663376633866339663406634166342663436634466345663466634766348663496635066351663526635366354663556635666357663586635966360663616636266363663646636566366663676636866369663706637166372663736637466375663766637766378663796638066381663826638366384663856638666387663886638966390663916639266393663946639566396663976639866399664006640166402664036640466405664066640766408664096641066411664126641366414664156641666417664186641966420664216642266423664246642566426664276642866429664306643166432664336643466435664366643766438664396644066441664426644366444664456644666447664486644966450664516645266453664546645566456664576645866459664606646166462664636646466465664666646766468664696647066471664726647366474664756647666477664786647966480664816648266483664846648566486664876648866489664906649166492664936649466495664966649766498664996650066501665026650366504665056650666507665086650966510665116651266513665146651566516665176651866519665206652166522665236652466525665266652766528665296653066531665326653366534665356653666537665386653966540665416654266543665446654566546665476654866549665506655166552665536655466555665566655766558665596656066561665626656366564665656656666567665686656966570665716657266573665746657566576665776657866579665806658166582665836658466585665866658766588665896659066591665926659366594665956659666597665986659966600666016660266603666046660566606666076660866609666106661166612666136661466615666166661766618666196662066621666226662366624666256662666627666286662966630666316663266633666346663566636666376663866639666406664166642666436664466645666466664766648666496665066651666526665366654666556665666657666586665966660666616666266663666646666566666666676666866669666706667166672666736667466675666766667766678666796668066681666826668366684666856668666687666886668966690666916669266693666946669566696666976669866699667006670166702667036670466705667066670766708667096671066711667126671366714667156671666717667186671966720667216672266723667246672566726667276672866729667306673166732667336673466735667366673766738667396674066741667426674366744667456674666747667486674966750667516675266753667546675566756667576675866759667606676166762667636676466765667666676766768667696677066771667726677366774667756677666777667786677966780667816678266783667846678566786667876678866789667906679166792667936679466795667966679766798667996680066801668026680366804668056680666807668086680966810668116681266813668146681566816668176681866819668206682166822668236682466825668266682766828668296683066831668326683366834668356683666837668386683966840668416684266843668446684566846668476684866849668506685166852668536685466855668566685766858668596686066861668626686366864668656686666867668686686966870668716687266873668746687566876668776687866879668806688166882668836688466885668866688766888668896689066891668926689366894668956689666897668986689966900669016690266903669046690566906669076690866909669106691166912669136691466915669166691766918669196692066921669226692366924669256692666927669286692966930669316693266933669346693566936669376693866939669406694166942669436694466945669466694766948669496695066951669526695366954669556695666957669586695966960669616696266963669646696566966669676696866969669706697166972669736697466975669766697766978669796698066981669826698366984669856698666987669886698966990669916699266993669946699566996669976699866999670006700167002670036700467005670066700767008670096701067011670126701367014670156701667017670186701967020670216702267023670246702567026670276702867029670306703167032670336703467035670366703767038670396704067041670426704367044670456704667047670486704967050670516705267053670546705567056670576705867059670606706167062670636706467065670666706767068670696707067071670726707367074670756707667077670786707967080670816708267083670846708567086670876708867089670906709167092670936709467095670966709767098670996710067101671026710367104671056710667107671086710967110671116711267113671146711567116671176711867119671206712167122671236712467125671266712767128671296713067131671326713367134671356713667137671386713967140671416714267143671446714567146671476714867149671506715167152671536715467155671566715767158671596716067161671626716367164671656716667167671686716967170671716717267173671746717567176671776717867179671806718167182671836718467185671866718767188671896719067191671926719367194671956719667197671986719967200672016720267203672046720567206672076720867209672106721167212672136721467215672166721767218672196722067221672226722367224672256722667227672286722967230672316723267233672346723567236672376723867239672406724167242672436724467245672466724767248672496725067251672526725367254672556725667257672586725967260672616726267263672646726567266672676726867269672706727167272672736727467275672766727767278672796728067281672826728367284672856728667287672886728967290672916729267293672946729567296672976729867299673006730167302673036730467305673066730767308673096731067311673126731367314673156731667317673186731967320673216732267323673246732567326673276732867329673306733167332673336733467335673366733767338673396734067341673426734367344673456734667347673486734967350673516735267353673546735567356673576735867359673606736167362673636736467365673666736767368673696737067371673726737367374673756737667377673786737967380673816738267383673846738567386673876738867389673906739167392673936739467395673966739767398673996740067401674026740367404674056740667407674086740967410674116741267413674146741567416674176741867419674206742167422674236742467425674266742767428674296743067431674326743367434674356743667437674386743967440674416744267443674446744567446674476744867449674506745167452674536745467455674566745767458674596746067461674626746367464674656746667467674686746967470674716747267473674746747567476674776747867479674806748167482674836748467485674866748767488674896749067491674926749367494674956749667497674986749967500675016750267503675046750567506675076750867509675106751167512675136751467515675166751767518675196752067521675226752367524675256752667527675286752967530675316753267533675346753567536675376753867539675406754167542675436754467545675466754767548675496755067551675526755367554675556755667557675586755967560675616756267563675646756567566675676756867569675706757167572675736757467575675766757767578675796758067581675826758367584675856758667587675886758967590675916759267593675946759567596675976759867599676006760167602676036760467605676066760767608676096761067611676126761367614676156761667617676186761967620676216762267623676246762567626676276762867629676306763167632676336763467635676366763767638676396764067641676426764367644676456764667647676486764967650676516765267653676546765567656676576765867659676606766167662676636766467665676666766767668676696767067671676726767367674676756767667677676786767967680676816768267683676846768567686676876768867689676906769167692676936769467695676966769767698676996770067701677026770367704677056770667707677086770967710677116771267713677146771567716677176771867719677206772167722677236772467725677266772767728677296773067731677326773367734677356773667737677386773967740677416774267743677446774567746677476774867749677506775167752677536775467755677566775767758677596776067761677626776367764677656776667767677686776967770677716777267773677746777567776677776777867779677806778167782677836778467785677866778767788677896779067791677926779367794677956779667797677986779967800678016780267803678046780567806678076780867809678106781167812678136781467815678166781767818678196782067821678226782367824678256782667827678286782967830678316783267833678346783567836678376783867839678406784167842678436784467845678466784767848678496785067851678526785367854678556785667857678586785967860678616786267863678646786567866678676786867869678706787167872678736787467875678766787767878678796788067881678826788367884678856788667887678886788967890678916789267893678946789567896678976789867899679006790167902679036790467905679066790767908679096791067911679126791367914679156791667917679186791967920679216792267923679246792567926679276792867929679306793167932679336793467935679366793767938679396794067941679426794367944679456794667947679486794967950679516795267953679546795567956679576795867959679606796167962679636796467965679666796767968679696797067971679726797367974679756797667977679786797967980679816798267983679846798567986679876798867989679906799167992679936799467995679966799767998679996800068001680026800368004680056800668007680086800968010680116801268013680146801568016680176801868019680206802168022680236802468025680266802768028680296803068031680326803368034680356803668037680386803968040680416804268043680446804568046680476804868049680506805168052680536805468055680566805768058680596806068061680626806368064680656806668067680686806968070680716807268073680746807568076680776807868079680806808168082680836808468085680866808768088680896809068091680926809368094680956809668097680986809968100681016810268103681046810568106681076810868109681106811168112681136811468115681166811768118681196812068121681226812368124681256812668127681286812968130681316813268133681346813568136681376813868139681406814168142681436814468145681466814768148681496815068151681526815368154681556815668157681586815968160681616816268163681646816568166681676816868169681706817168172681736817468175681766817768178681796818068181681826818368184681856818668187681886818968190681916819268193681946819568196681976819868199682006820168202682036820468205682066820768208682096821068211682126821368214682156821668217682186821968220682216822268223682246822568226682276822868229682306823168232682336823468235682366823768238682396824068241682426824368244682456824668247682486824968250682516825268253682546825568256682576825868259682606826168262682636826468265682666826768268682696827068271682726827368274682756827668277682786827968280682816828268283682846828568286682876828868289682906829168292682936829468295682966829768298682996830068301683026830368304683056830668307683086830968310683116831268313683146831568316683176831868319683206832168322683236832468325683266832768328683296833068331683326833368334683356833668337683386833968340683416834268343683446834568346683476834868349683506835168352683536835468355683566835768358683596836068361683626836368364683656836668367683686836968370683716837268373683746837568376683776837868379683806838168382683836838468385683866838768388683896839068391683926839368394683956839668397683986839968400684016840268403684046840568406684076840868409684106841168412684136841468415684166841768418684196842068421684226842368424684256842668427684286842968430684316843268433684346843568436684376843868439684406844168442684436844468445684466844768448684496845068451684526845368454684556845668457684586845968460684616846268463684646846568466684676846868469684706847168472684736847468475684766847768478684796848068481684826848368484684856848668487684886848968490684916849268493684946849568496684976849868499685006850168502685036850468505685066850768508685096851068511685126851368514685156851668517685186851968520685216852268523685246852568526685276852868529685306853168532685336853468535685366853768538685396854068541685426854368544685456854668547685486854968550685516855268553685546855568556685576855868559685606856168562685636856468565685666856768568685696857068571685726857368574685756857668577685786857968580685816858268583685846858568586685876858868589685906859168592685936859468595685966859768598685996860068601686026860368604686056860668607686086860968610686116861268613686146861568616686176861868619686206862168622686236862468625686266862768628686296863068631686326863368634686356863668637686386863968640686416864268643686446864568646686476864868649686506865168652686536865468655686566865768658686596866068661686626866368664686656866668667686686866968670686716867268673686746867568676686776867868679686806868168682686836868468685686866868768688686896869068691686926869368694686956869668697686986869968700687016870268703687046870568706687076870868709687106871168712687136871468715687166871768718687196872068721687226872368724687256872668727687286872968730687316873268733687346873568736687376873868739687406874168742687436874468745687466874768748687496875068751687526875368754687556875668757687586875968760687616876268763687646876568766687676876868769687706877168772687736877468775687766877768778687796878068781687826878368784687856878668787687886878968790687916879268793687946879568796687976879868799688006880168802688036880468805688066880768808688096881068811688126881368814688156881668817688186881968820688216882268823688246882568826688276882868829688306883168832688336883468835688366883768838688396884068841688426884368844688456884668847688486884968850688516885268853688546885568856688576885868859688606886168862688636886468865688666886768868688696887068871688726887368874688756887668877688786887968880688816888268883688846888568886688876888868889688906889168892688936889468895688966889768898688996890068901689026890368904689056890668907689086890968910689116891268913689146891568916689176891868919689206892168922689236892468925689266892768928689296893068931689326893368934689356893668937689386893968940689416894268943689446894568946689476894868949689506895168952689536895468955689566895768958689596896068961689626896368964689656896668967689686896968970689716897268973689746897568976689776897868979689806898168982689836898468985689866898768988689896899068991689926899368994689956899668997689986899969000690016900269003690046900569006690076900869009690106901169012690136901469015690166901769018690196902069021690226902369024690256902669027690286902969030690316903269033690346903569036690376903869039690406904169042690436904469045690466904769048690496905069051690526905369054690556905669057690586905969060690616906269063690646906569066690676906869069690706907169072690736907469075690766907769078690796908069081690826908369084690856908669087690886908969090690916909269093690946909569096690976909869099691006910169102691036910469105691066910769108691096911069111691126911369114691156911669117691186911969120691216912269123691246912569126691276912869129691306913169132691336913469135691366913769138691396914069141691426914369144691456914669147691486914969150691516915269153691546915569156691576915869159691606916169162691636916469165691666916769168691696917069171691726917369174691756917669177691786917969180691816918269183691846918569186691876918869189691906919169192691936919469195691966919769198691996920069201692026920369204692056920669207692086920969210692116921269213692146921569216692176921869219692206922169222692236922469225692266922769228692296923069231692326923369234692356923669237692386923969240692416924269243692446924569246692476924869249692506925169252692536925469255692566925769258692596926069261692626926369264692656926669267692686926969270692716927269273692746927569276692776927869279692806928169282692836928469285692866928769288692896929069291692926929369294692956929669297692986929969300693016930269303693046930569306693076930869309693106931169312693136931469315693166931769318693196932069321693226932369324693256932669327693286932969330693316933269333693346933569336693376933869339693406934169342693436934469345693466934769348693496935069351693526935369354693556935669357693586935969360693616936269363693646936569366693676936869369693706937169372693736937469375693766937769378693796938069381693826938369384693856938669387693886938969390693916939269393693946939569396693976939869399694006940169402694036940469405694066940769408694096941069411694126941369414694156941669417694186941969420694216942269423694246942569426694276942869429694306943169432694336943469435694366943769438694396944069441694426944369444694456944669447694486944969450694516945269453694546945569456694576945869459694606946169462694636946469465694666946769468694696947069471694726947369474694756947669477694786947969480694816948269483694846948569486694876948869489694906949169492694936949469495694966949769498694996950069501695026950369504695056950669507695086950969510695116951269513695146951569516695176951869519695206952169522695236952469525695266952769528695296953069531695326953369534695356953669537695386953969540695416954269543695446954569546695476954869549695506955169552695536955469555695566955769558695596956069561695626956369564695656956669567695686956969570695716957269573695746957569576695776957869579695806958169582695836958469585695866958769588695896959069591695926959369594695956959669597695986959969600696016960269603696046960569606696076960869609696106961169612696136961469615696166961769618696196962069621696226962369624696256962669627696286962969630696316963269633696346963569636696376963869639696406964169642696436964469645696466964769648696496965069651696526965369654696556965669657696586965969660696616966269663696646966569666696676966869669696706967169672696736967469675696766967769678696796968069681696826968369684696856968669687696886968969690696916969269693696946969569696696976969869699697006970169702697036970469705697066970769708697096971069711697126971369714697156971669717697186971969720697216972269723697246972569726697276972869729697306973169732697336973469735697366973769738697396974069741697426974369744697456974669747697486974969750697516975269753697546975569756697576975869759697606976169762697636976469765697666976769768697696977069771697726977369774697756977669777697786977969780697816978269783697846978569786697876978869789697906979169792697936979469795697966979769798697996980069801698026980369804698056980669807698086980969810698116981269813698146981569816698176981869819698206982169822698236982469825698266982769828698296983069831698326983369834698356983669837698386983969840698416984269843698446984569846698476984869849698506985169852698536985469855698566985769858698596986069861698626986369864698656986669867698686986969870698716987269873698746987569876698776987869879698806988169882698836988469885698866988769888698896989069891698926989369894698956989669897698986989969900699016990269903699046990569906699076990869909699106991169912699136991469915699166991769918699196992069921699226992369924699256992669927699286992969930699316993269933699346993569936699376993869939699406994169942699436994469945699466994769948699496995069951699526995369954699556995669957699586995969960699616996269963699646996569966699676996869969699706997169972699736997469975699766997769978699796998069981699826998369984699856998669987699886998969990699916999269993699946999569996699976999869999700007000170002700037000470005700067000770008700097001070011700127001370014700157001670017700187001970020700217002270023700247002570026700277002870029700307003170032700337003470035700367003770038700397004070041700427004370044700457004670047700487004970050700517005270053700547005570056700577005870059700607006170062700637006470065700667006770068700697007070071700727007370074700757007670077700787007970080700817008270083700847008570086700877008870089700907009170092700937009470095700967009770098700997010070101701027010370104701057010670107701087010970110701117011270113701147011570116701177011870119701207012170122701237012470125701267012770128701297013070131701327013370134701357013670137701387013970140701417014270143701447014570146701477014870149701507015170152701537015470155701567015770158701597016070161701627016370164701657016670167701687016970170701717017270173701747017570176701777017870179701807018170182701837018470185701867018770188701897019070191701927019370194701957019670197701987019970200702017020270203702047020570206702077020870209702107021170212702137021470215702167021770218702197022070221702227022370224702257022670227702287022970230702317023270233702347023570236702377023870239702407024170242702437024470245702467024770248702497025070251702527025370254702557025670257702587025970260702617026270263702647026570266702677026870269702707027170272702737027470275702767027770278702797028070281702827028370284702857028670287702887028970290702917029270293702947029570296702977029870299703007030170302703037030470305703067030770308703097031070311703127031370314703157031670317703187031970320703217032270323703247032570326703277032870329703307033170332703337033470335703367033770338703397034070341703427034370344703457034670347703487034970350703517035270353703547035570356703577035870359703607036170362703637036470365703667036770368703697037070371703727037370374703757037670377703787037970380703817038270383703847038570386703877038870389703907039170392703937039470395703967039770398703997040070401704027040370404704057040670407704087040970410704117041270413704147041570416704177041870419704207042170422704237042470425704267042770428704297043070431704327043370434704357043670437704387043970440704417044270443704447044570446704477044870449704507045170452704537045470455704567045770458704597046070461704627046370464704657046670467704687046970470704717047270473704747047570476704777047870479704807048170482704837048470485704867048770488704897049070491704927049370494704957049670497704987049970500705017050270503705047050570506705077050870509705107051170512705137051470515705167051770518705197052070521705227052370524705257052670527705287052970530705317053270533705347053570536705377053870539705407054170542705437054470545705467054770548705497055070551705527055370554705557055670557705587055970560705617056270563705647056570566705677056870569705707057170572705737057470575705767057770578705797058070581705827058370584705857058670587705887058970590705917059270593705947059570596705977059870599706007060170602706037060470605706067060770608706097061070611706127061370614706157061670617706187061970620706217062270623706247062570626706277062870629706307063170632706337063470635706367063770638706397064070641706427064370644706457064670647706487064970650706517065270653706547065570656706577065870659706607066170662706637066470665706667066770668706697067070671706727067370674706757067670677706787067970680706817068270683706847068570686706877068870689706907069170692706937069470695706967069770698706997070070701707027070370704707057070670707707087070970710707117071270713707147071570716707177071870719707207072170722707237072470725707267072770728707297073070731707327073370734707357073670737707387073970740707417074270743707447074570746707477074870749707507075170752707537075470755707567075770758707597076070761707627076370764707657076670767707687076970770707717077270773707747077570776707777077870779707807078170782707837078470785707867078770788707897079070791707927079370794707957079670797707987079970800708017080270803708047080570806708077080870809708107081170812708137081470815708167081770818708197082070821708227082370824708257082670827708287082970830708317083270833708347083570836708377083870839708407084170842708437084470845708467084770848708497085070851708527085370854708557085670857708587085970860708617086270863708647086570866708677086870869708707087170872708737087470875708767087770878708797088070881708827088370884708857088670887708887088970890708917089270893708947089570896708977089870899709007090170902709037090470905709067090770908709097091070911709127091370914709157091670917709187091970920709217092270923709247092570926709277092870929709307093170932709337093470935709367093770938709397094070941709427094370944709457094670947709487094970950709517095270953709547095570956709577095870959709607096170962709637096470965709667096770968709697097070971709727097370974709757097670977709787097970980709817098270983709847098570986709877098870989709907099170992709937099470995709967099770998709997100071001710027100371004710057100671007710087100971010710117101271013710147101571016710177101871019710207102171022710237102471025710267102771028710297103071031710327103371034710357103671037710387103971040710417104271043710447104571046710477104871049710507105171052710537105471055710567105771058710597106071061710627106371064710657106671067710687106971070710717107271073710747107571076710777107871079710807108171082710837108471085710867108771088710897109071091710927109371094710957109671097710987109971100711017110271103711047110571106711077110871109711107111171112711137111471115711167111771118711197112071121711227112371124711257112671127711287112971130711317113271133711347113571136711377113871139711407114171142711437114471145711467114771148711497115071151711527115371154711557115671157711587115971160711617116271163711647116571166711677116871169711707117171172711737117471175711767117771178711797118071181711827118371184711857118671187711887118971190711917119271193711947119571196711977119871199712007120171202712037120471205712067120771208712097121071211712127121371214712157121671217712187121971220712217122271223712247122571226712277122871229712307123171232712337123471235712367123771238712397124071241712427124371244712457124671247712487124971250712517125271253712547125571256712577125871259712607126171262712637126471265712667126771268712697127071271712727127371274712757127671277712787127971280712817128271283712847128571286712877128871289712907129171292712937129471295712967129771298712997130071301713027130371304713057130671307713087130971310713117131271313713147131571316713177131871319713207132171322713237132471325713267132771328713297133071331713327133371334713357133671337713387133971340713417134271343713447134571346713477134871349713507135171352713537135471355713567135771358713597136071361713627136371364713657136671367713687136971370713717137271373713747137571376713777137871379713807138171382713837138471385713867138771388713897139071391713927139371394713957139671397713987139971400714017140271403714047140571406714077140871409714107141171412714137141471415714167141771418714197142071421714227142371424714257142671427714287142971430714317143271433714347143571436714377143871439714407144171442714437144471445714467144771448714497145071451714527145371454714557145671457714587145971460714617146271463714647146571466714677146871469714707147171472714737147471475714767147771478714797148071481714827148371484714857148671487714887148971490714917149271493714947149571496714977149871499715007150171502715037150471505715067150771508715097151071511715127151371514715157151671517715187151971520715217152271523715247152571526715277152871529715307153171532715337153471535715367153771538715397154071541715427154371544715457154671547715487154971550715517155271553715547155571556715577155871559715607156171562715637156471565715667156771568715697157071571715727157371574715757157671577715787157971580715817158271583715847158571586715877158871589715907159171592715937159471595715967159771598715997160071601716027160371604716057160671607716087160971610716117161271613716147161571616716177161871619716207162171622716237162471625716267162771628716297163071631716327163371634716357163671637716387163971640716417164271643716447164571646716477164871649716507165171652716537165471655716567165771658716597166071661716627166371664716657166671667716687166971670716717167271673716747167571676716777167871679716807168171682716837168471685716867168771688716897169071691716927169371694716957169671697716987169971700717017170271703717047170571706717077170871709717107171171712717137171471715717167171771718717197172071721717227172371724717257172671727717287172971730717317173271733717347173571736717377173871739717407174171742717437174471745717467174771748717497175071751717527175371754717557175671757717587175971760717617176271763717647176571766717677176871769717707177171772717737177471775717767177771778717797178071781717827178371784717857178671787717887178971790717917179271793717947179571796717977179871799718007180171802718037180471805718067180771808718097181071811718127181371814718157181671817718187181971820718217182271823718247182571826718277182871829718307183171832718337183471835718367183771838718397184071841718427184371844718457184671847718487184971850718517185271853718547185571856718577185871859718607186171862718637186471865718667186771868718697187071871718727187371874718757187671877718787187971880718817188271883718847188571886718877188871889718907189171892718937189471895718967189771898718997190071901719027190371904719057190671907719087190971910719117191271913719147191571916719177191871919719207192171922719237192471925719267192771928719297193071931719327193371934719357193671937719387193971940719417194271943719447194571946719477194871949719507195171952719537195471955719567195771958719597196071961719627196371964719657196671967719687196971970719717197271973719747197571976719777197871979719807198171982719837198471985719867198771988719897199071991719927199371994719957199671997719987199972000720017200272003720047200572006720077200872009720107201172012720137201472015720167201772018720197202072021720227202372024720257202672027720287202972030720317203272033720347203572036720377203872039720407204172042720437204472045720467204772048720497205072051720527205372054720557205672057720587205972060720617206272063720647206572066720677206872069720707207172072720737207472075720767207772078720797208072081720827208372084720857208672087720887208972090720917209272093720947209572096720977209872099721007210172102721037210472105721067210772108721097211072111721127211372114721157211672117721187211972120721217212272123721247212572126721277212872129721307213172132721337213472135721367213772138721397214072141721427214372144721457214672147721487214972150721517215272153721547215572156721577215872159721607216172162721637216472165721667216772168721697217072171721727217372174721757217672177721787217972180721817218272183721847218572186721877218872189721907219172192721937219472195721967219772198721997220072201722027220372204722057220672207722087220972210722117221272213722147221572216722177221872219722207222172222722237222472225722267222772228722297223072231722327223372234722357223672237722387223972240722417224272243722447224572246722477224872249722507225172252722537225472255722567225772258722597226072261722627226372264722657226672267722687226972270722717227272273722747227572276722777227872279722807228172282722837228472285722867228772288722897229072291722927229372294722957229672297722987229972300723017230272303723047230572306723077230872309723107231172312723137231472315723167231772318723197232072321723227232372324723257232672327723287232972330723317233272333723347233572336723377233872339723407234172342723437234472345723467234772348723497235072351723527235372354723557235672357723587235972360723617236272363723647236572366723677236872369723707237172372723737237472375723767237772378723797238072381723827238372384723857238672387723887238972390723917239272393723947239572396723977239872399724007240172402724037240472405724067240772408724097241072411724127241372414724157241672417724187241972420724217242272423724247242572426724277242872429724307243172432724337243472435724367243772438724397244072441724427244372444724457244672447724487244972450724517245272453724547245572456724577245872459724607246172462724637246472465724667246772468724697247072471724727247372474724757247672477724787247972480724817248272483724847248572486724877248872489724907249172492724937249472495724967249772498724997250072501725027250372504725057250672507725087250972510725117251272513725147251572516725177251872519725207252172522725237252472525725267252772528725297253072531725327253372534725357253672537725387253972540725417254272543725447254572546725477254872549725507255172552725537255472555725567255772558725597256072561725627256372564725657256672567725687256972570725717257272573725747257572576725777257872579725807258172582725837258472585725867258772588725897259072591725927259372594725957259672597725987259972600726017260272603726047260572606726077260872609726107261172612726137261472615726167261772618726197262072621726227262372624726257262672627726287262972630726317263272633726347263572636726377263872639726407264172642726437264472645726467264772648726497265072651726527265372654726557265672657726587265972660726617266272663726647266572666726677266872669726707267172672726737267472675726767267772678726797268072681726827268372684726857268672687726887268972690726917269272693726947269572696726977269872699727007270172702727037270472705727067270772708727097271072711727127271372714727157271672717727187271972720727217272272723727247272572726727277272872729727307273172732727337273472735727367273772738727397274072741727427274372744727457274672747727487274972750727517275272753727547275572756727577275872759727607276172762727637276472765727667276772768727697277072771727727277372774727757277672777727787277972780727817278272783727847278572786727877278872789727907279172792727937279472795727967279772798727997280072801728027280372804728057280672807728087280972810728117281272813728147281572816728177281872819728207282172822728237282472825728267282772828728297283072831728327283372834728357283672837728387283972840728417284272843728447284572846728477284872849728507285172852728537285472855728567285772858728597286072861728627286372864728657286672867728687286972870728717287272873728747287572876728777287872879728807288172882728837288472885728867288772888728897289072891728927289372894728957289672897728987289972900729017290272903729047290572906729077290872909729107291172912729137291472915729167291772918729197292072921729227292372924729257292672927729287292972930729317293272933729347293572936729377293872939729407294172942729437294472945729467294772948729497295072951729527295372954729557295672957729587295972960729617296272963729647296572966729677296872969729707297172972729737297472975729767297772978729797298072981729827298372984729857298672987729887298972990729917299272993729947299572996729977299872999730007300173002730037300473005730067300773008730097301073011730127301373014730157301673017730187301973020730217302273023730247302573026730277302873029730307303173032730337303473035730367303773038730397304073041730427304373044730457304673047730487304973050730517305273053730547305573056730577305873059730607306173062730637306473065730667306773068730697307073071730727307373074730757307673077730787307973080730817308273083730847308573086730877308873089730907309173092730937309473095730967309773098730997310073101731027310373104731057310673107731087310973110731117311273113731147311573116731177311873119731207312173122731237312473125731267312773128731297313073131731327313373134731357313673137731387313973140731417314273143731447314573146731477314873149731507315173152731537315473155731567315773158731597316073161731627316373164731657316673167731687316973170731717317273173731747317573176731777317873179731807318173182731837318473185731867318773188731897319073191731927319373194731957319673197731987319973200732017320273203732047320573206732077320873209732107321173212732137321473215732167321773218732197322073221732227322373224732257322673227732287322973230732317323273233732347323573236732377323873239732407324173242732437324473245732467324773248732497325073251732527325373254732557325673257732587325973260732617326273263732647326573266732677326873269732707327173272732737327473275732767327773278732797328073281732827328373284732857328673287732887328973290732917329273293732947329573296732977329873299733007330173302733037330473305733067330773308733097331073311733127331373314733157331673317733187331973320733217332273323733247332573326733277332873329733307333173332733337333473335733367333773338733397334073341733427334373344733457334673347733487334973350733517335273353733547335573356733577335873359733607336173362733637336473365733667336773368733697337073371733727337373374733757337673377733787337973380733817338273383733847338573386733877338873389733907339173392733937339473395733967339773398733997340073401734027340373404734057340673407734087340973410734117341273413734147341573416734177341873419734207342173422734237342473425734267342773428734297343073431734327343373434734357343673437734387343973440734417344273443734447344573446734477344873449734507345173452734537345473455734567345773458734597346073461734627346373464734657346673467734687346973470734717347273473734747347573476734777347873479734807348173482734837348473485734867348773488734897349073491734927349373494734957349673497734987349973500735017350273503735047350573506735077350873509735107351173512735137351473515735167351773518735197352073521735227352373524735257352673527735287352973530735317353273533735347353573536735377353873539735407354173542735437354473545735467354773548735497355073551735527355373554735557355673557735587355973560735617356273563735647356573566735677356873569735707357173572735737357473575735767357773578735797358073581735827358373584735857358673587735887358973590735917359273593735947359573596735977359873599736007360173602736037360473605736067360773608736097361073611736127361373614736157361673617736187361973620736217362273623736247362573626736277362873629736307363173632736337363473635736367363773638736397364073641736427364373644736457364673647736487364973650736517365273653736547365573656736577365873659736607366173662736637366473665736667366773668736697367073671736727367373674736757367673677736787367973680736817368273683736847368573686736877368873689736907369173692736937369473695736967369773698736997370073701737027370373704737057370673707737087370973710737117371273713737147371573716737177371873719737207372173722737237372473725737267372773728737297373073731737327373373734737357373673737737387373973740737417374273743737447374573746737477374873749737507375173752737537375473755737567375773758737597376073761737627376373764737657376673767737687376973770737717377273773737747377573776737777377873779737807378173782737837378473785737867378773788737897379073791737927379373794737957379673797737987379973800738017380273803738047380573806738077380873809738107381173812738137381473815738167381773818738197382073821738227382373824738257382673827738287382973830738317383273833738347383573836738377383873839738407384173842738437384473845738467384773848738497385073851738527385373854738557385673857738587385973860738617386273863738647386573866738677386873869738707387173872738737387473875738767387773878738797388073881738827388373884738857388673887738887388973890738917389273893738947389573896738977389873899739007390173902739037390473905739067390773908739097391073911739127391373914739157391673917739187391973920739217392273923739247392573926739277392873929739307393173932739337393473935739367393773938739397394073941739427394373944739457394673947739487394973950739517395273953739547395573956739577395873959739607396173962739637396473965739667396773968739697397073971739727397373974739757397673977739787397973980739817398273983739847398573986739877398873989739907399173992739937399473995739967399773998739997400074001740027400374004740057400674007740087400974010740117401274013740147401574016740177401874019740207402174022740237402474025740267402774028740297403074031740327403374034740357403674037740387403974040740417404274043740447404574046740477404874049740507405174052740537405474055740567405774058740597406074061740627406374064740657406674067740687406974070740717407274073740747407574076740777407874079740807408174082740837408474085740867408774088740897409074091740927409374094740957409674097740987409974100741017410274103741047410574106741077410874109741107411174112741137411474115741167411774118741197412074121741227412374124741257412674127741287412974130741317413274133741347413574136741377413874139741407414174142741437414474145741467414774148741497415074151741527415374154741557415674157741587415974160741617416274163741647416574166741677416874169741707417174172741737417474175741767417774178741797418074181741827418374184741857418674187741887418974190741917419274193741947419574196741977419874199742007420174202742037420474205742067420774208742097421074211742127421374214742157421674217742187421974220742217422274223742247422574226742277422874229742307423174232742337423474235742367423774238742397424074241742427424374244742457424674247742487424974250742517425274253742547425574256742577425874259742607426174262742637426474265742667426774268742697427074271742727427374274742757427674277742787427974280742817428274283742847428574286742877428874289742907429174292742937429474295742967429774298742997430074301743027430374304743057430674307743087430974310743117431274313743147431574316743177431874319743207432174322743237432474325743267432774328743297433074331743327433374334743357433674337743387433974340743417434274343743447434574346743477434874349743507435174352743537435474355743567435774358743597436074361743627436374364743657436674367743687436974370743717437274373743747437574376743777437874379743807438174382743837438474385743867438774388743897439074391743927439374394743957439674397743987439974400744017440274403744047440574406744077440874409744107441174412744137441474415744167441774418744197442074421744227442374424744257442674427744287442974430744317443274433744347443574436744377443874439744407444174442744437444474445744467444774448744497445074451744527445374454744557445674457744587445974460744617446274463744647446574466744677446874469744707447174472744737447474475744767447774478744797448074481744827448374484744857448674487744887448974490744917449274493744947449574496744977449874499745007450174502745037450474505745067450774508745097451074511745127451374514745157451674517745187451974520745217452274523745247452574526745277452874529745307453174532745337453474535745367453774538745397454074541745427454374544745457454674547745487454974550745517455274553745547455574556745577455874559745607456174562745637456474565745667456774568745697457074571745727457374574745757457674577745787457974580745817458274583745847458574586745877458874589745907459174592745937459474595745967459774598745997460074601746027460374604746057460674607746087460974610746117461274613746147461574616746177461874619746207462174622746237462474625746267462774628746297463074631746327463374634746357463674637746387463974640746417464274643746447464574646746477464874649746507465174652746537465474655746567465774658746597466074661746627466374664746657466674667746687466974670746717467274673746747467574676746777467874679746807468174682746837468474685746867468774688746897469074691746927469374694746957469674697746987469974700747017470274703747047470574706747077470874709747107471174712747137471474715747167471774718747197472074721747227472374724747257472674727747287472974730747317473274733747347473574736747377473874739747407474174742747437474474745747467474774748747497475074751747527475374754747557475674757747587475974760747617476274763747647476574766747677476874769747707477174772747737477474775747767477774778747797478074781747827478374784747857478674787747887478974790747917479274793747947479574796747977479874799748007480174802748037480474805748067480774808748097481074811748127481374814748157481674817748187481974820748217482274823748247482574826748277482874829748307483174832748337483474835748367483774838748397484074841748427484374844748457484674847748487484974850748517485274853748547485574856748577485874859748607486174862748637486474865748667486774868748697487074871748727487374874748757487674877748787487974880748817488274883748847488574886748877488874889748907489174892748937489474895748967489774898748997490074901749027490374904749057490674907749087490974910749117491274913749147491574916749177491874919749207492174922749237492474925749267492774928749297493074931749327493374934749357493674937749387493974940749417494274943749447494574946749477494874949749507495174952749537495474955749567495774958749597496074961749627496374964749657496674967749687496974970749717497274973749747497574976749777497874979749807498174982749837498474985749867498774988749897499074991749927499374994749957499674997749987499975000750017500275003750047500575006750077500875009750107501175012750137501475015750167501775018750197502075021750227502375024750257502675027750287502975030750317503275033750347503575036750377503875039750407504175042750437504475045750467504775048750497505075051750527505375054750557505675057750587505975060750617506275063750647506575066750677506875069750707507175072750737507475075750767507775078750797508075081750827508375084750857508675087750887508975090750917509275093750947509575096750977509875099751007510175102751037510475105751067510775108751097511075111751127511375114751157511675117751187511975120751217512275123751247512575126751277512875129751307513175132751337513475135751367513775138751397514075141751427514375144751457514675147751487514975150751517515275153751547515575156751577515875159751607516175162751637516475165751667516775168751697517075171751727517375174751757517675177751787517975180751817518275183751847518575186751877518875189751907519175192751937519475195751967519775198751997520075201752027520375204752057520675207752087520975210752117521275213752147521575216752177521875219752207522175222752237522475225752267522775228752297523075231752327523375234752357523675237752387523975240752417524275243752447524575246752477524875249752507525175252752537525475255752567525775258752597526075261752627526375264752657526675267752687526975270752717527275273752747527575276752777527875279752807528175282752837528475285752867528775288752897529075291752927529375294752957529675297752987529975300753017530275303753047530575306753077530875309753107531175312753137531475315753167531775318753197532075321753227532375324753257532675327753287532975330753317533275333753347533575336753377533875339753407534175342753437534475345753467534775348753497535075351753527535375354753557535675357753587535975360753617536275363753647536575366753677536875369753707537175372753737537475375753767537775378753797538075381753827538375384753857538675387753887538975390753917539275393753947539575396753977539875399754007540175402754037540475405754067540775408754097541075411754127541375414754157541675417754187541975420754217542275423754247542575426754277542875429754307543175432754337543475435754367543775438754397544075441754427544375444754457544675447754487544975450754517545275453754547545575456754577545875459754607546175462754637546475465754667546775468754697547075471754727547375474754757547675477754787547975480754817548275483754847548575486754877548875489754907549175492754937549475495754967549775498754997550075501755027550375504755057550675507755087550975510755117551275513755147551575516755177551875519755207552175522755237552475525755267552775528755297553075531755327553375534755357553675537755387553975540755417554275543755447554575546755477554875549755507555175552755537555475555755567555775558755597556075561755627556375564755657556675567755687556975570755717557275573755747557575576755777557875579755807558175582755837558475585755867558775588755897559075591755927559375594755957559675597755987559975600756017560275603756047560575606756077560875609756107561175612756137561475615756167561775618756197562075621756227562375624756257562675627756287562975630756317563275633756347563575636756377563875639756407564175642756437564475645756467564775648756497565075651756527565375654756557565675657756587565975660756617566275663756647566575666756677566875669756707567175672756737567475675756767567775678756797568075681756827568375684756857568675687756887568975690756917569275693756947569575696756977569875699757007570175702757037570475705757067570775708757097571075711757127571375714757157571675717757187571975720757217572275723757247572575726757277572875729757307573175732757337573475735757367573775738757397574075741757427574375744757457574675747757487574975750757517575275753757547575575756757577575875759757607576175762757637576475765757667576775768757697577075771757727577375774757757577675777757787577975780757817578275783757847578575786757877578875789757907579175792757937579475795757967579775798757997580075801758027580375804758057580675807758087580975810758117581275813758147581575816758177581875819758207582175822758237582475825758267582775828758297583075831758327583375834758357583675837758387583975840758417584275843758447584575846758477584875849758507585175852758537585475855758567585775858758597586075861758627586375864758657586675867758687586975870758717587275873758747587575876758777587875879758807588175882758837588475885758867588775888758897589075891758927589375894758957589675897758987589975900759017590275903759047590575906759077590875909759107591175912759137591475915759167591775918759197592075921759227592375924759257592675927759287592975930759317593275933759347593575936759377593875939759407594175942759437594475945759467594775948759497595075951759527595375954759557595675957759587595975960759617596275963759647596575966759677596875969759707597175972759737597475975759767597775978759797598075981759827598375984759857598675987759887598975990759917599275993759947599575996759977599875999760007600176002760037600476005760067600776008760097601076011760127601376014760157601676017760187601976020760217602276023760247602576026760277602876029760307603176032760337603476035760367603776038760397604076041760427604376044760457604676047760487604976050760517605276053760547605576056760577605876059760607606176062760637606476065760667606776068760697607076071760727607376074760757607676077760787607976080760817608276083760847608576086760877608876089760907609176092760937609476095760967609776098760997610076101761027610376104761057610676107761087610976110761117611276113761147611576116761177611876119761207612176122761237612476125761267612776128761297613076131761327613376134761357613676137761387613976140761417614276143761447614576146761477614876149761507615176152761537615476155761567615776158761597616076161761627616376164761657616676167761687616976170761717617276173761747617576176761777617876179761807618176182761837618476185761867618776188761897619076191761927619376194761957619676197761987619976200762017620276203762047620576206762077620876209762107621176212762137621476215762167621776218762197622076221762227622376224762257622676227762287622976230762317623276233762347623576236762377623876239762407624176242762437624476245762467624776248762497625076251762527625376254762557625676257762587625976260762617626276263762647626576266762677626876269762707627176272762737627476275762767627776278762797628076281762827628376284762857628676287762887628976290762917629276293762947629576296762977629876299763007630176302763037630476305763067630776308763097631076311763127631376314763157631676317763187631976320763217632276323763247632576326763277632876329763307633176332763337633476335763367633776338763397634076341763427634376344763457634676347763487634976350763517635276353763547635576356763577635876359763607636176362763637636476365763667636776368763697637076371763727637376374763757637676377763787637976380763817638276383763847638576386763877638876389763907639176392763937639476395763967639776398763997640076401764027640376404764057640676407764087640976410764117641276413764147641576416764177641876419764207642176422764237642476425764267642776428764297643076431764327643376434764357643676437764387643976440764417644276443764447644576446764477644876449764507645176452764537645476455764567645776458764597646076461764627646376464764657646676467764687646976470764717647276473764747647576476764777647876479764807648176482764837648476485764867648776488764897649076491764927649376494764957649676497764987649976500765017650276503765047650576506765077650876509765107651176512765137651476515765167651776518765197652076521765227652376524765257652676527765287652976530765317653276533765347653576536765377653876539765407654176542765437654476545765467654776548765497655076551765527655376554765557655676557765587655976560765617656276563765647656576566765677656876569765707657176572765737657476575765767657776578765797658076581765827658376584765857658676587765887658976590765917659276593765947659576596765977659876599766007660176602766037660476605766067660776608766097661076611766127661376614766157661676617766187661976620766217662276623766247662576626766277662876629766307663176632766337663476635766367663776638766397664076641766427664376644766457664676647766487664976650766517665276653766547665576656766577665876659766607666176662766637666476665766667666776668766697667076671766727667376674766757667676677766787667976680766817668276683766847668576686766877668876689766907669176692766937669476695766967669776698766997670076701767027670376704767057670676707767087670976710767117671276713767147671576716767177671876719767207672176722767237672476725767267672776728767297673076731767327673376734767357673676737767387673976740767417674276743767447674576746767477674876749767507675176752767537675476755767567675776758767597676076761767627676376764767657676676767767687676976770767717677276773767747677576776767777677876779767807678176782767837678476785767867678776788767897679076791767927679376794767957679676797767987679976800768017680276803768047680576806768077680876809768107681176812768137681476815768167681776818768197682076821768227682376824768257682676827768287682976830768317683276833768347683576836768377683876839768407684176842768437684476845768467684776848768497685076851768527685376854768557685676857768587685976860768617686276863768647686576866768677686876869768707687176872768737687476875768767687776878768797688076881768827688376884768857688676887768887688976890768917689276893768947689576896768977689876899769007690176902769037690476905769067690776908769097691076911769127691376914769157691676917769187691976920769217692276923769247692576926769277692876929769307693176932769337693476935769367693776938769397694076941769427694376944769457694676947769487694976950769517695276953769547695576956769577695876959769607696176962769637696476965769667696776968769697697076971769727697376974769757697676977769787697976980769817698276983769847698576986769877698876989769907699176992769937699476995769967699776998769997700077001770027700377004770057700677007770087700977010770117701277013770147701577016770177701877019770207702177022770237702477025770267702777028770297703077031770327703377034770357703677037770387703977040770417704277043770447704577046770477704877049770507705177052770537705477055770567705777058770597706077061770627706377064770657706677067770687706977070770717707277073770747707577076770777707877079770807708177082770837708477085770867708777088770897709077091770927709377094770957709677097770987709977100771017710277103771047710577106771077710877109771107711177112771137711477115771167711777118771197712077121771227712377124771257712677127771287712977130771317713277133771347713577136771377713877139771407714177142771437714477145771467714777148771497715077151771527715377154771557715677157771587715977160771617716277163771647716577166771677716877169771707717177172771737717477175771767717777178771797718077181771827718377184771857718677187771887718977190771917719277193771947719577196771977719877199772007720177202772037720477205772067720777208772097721077211772127721377214772157721677217772187721977220772217722277223772247722577226772277722877229772307723177232772337723477235772367723777238772397724077241772427724377244772457724677247772487724977250772517725277253772547725577256772577725877259772607726177262772637726477265772667726777268772697727077271772727727377274772757727677277772787727977280772817728277283772847728577286772877728877289772907729177292772937729477295772967729777298772997730077301773027730377304773057730677307773087730977310773117731277313773147731577316773177731877319773207732177322773237732477325773267732777328773297733077331773327733377334773357733677337773387733977340773417734277343773447734577346773477734877349773507735177352773537735477355773567735777358773597736077361773627736377364773657736677367773687736977370773717737277373773747737577376773777737877379773807738177382773837738477385773867738777388773897739077391773927739377394773957739677397773987739977400774017740277403774047740577406774077740877409774107741177412774137741477415774167741777418774197742077421774227742377424774257742677427774287742977430774317743277433774347743577436774377743877439774407744177442774437744477445774467744777448774497745077451774527745377454774557745677457774587745977460774617746277463774647746577466774677746877469774707747177472774737747477475774767747777478774797748077481774827748377484774857748677487774887748977490774917749277493774947749577496774977749877499775007750177502775037750477505775067750777508775097751077511775127751377514775157751677517775187751977520775217752277523775247752577526775277752877529775307753177532775337753477535775367753777538775397754077541775427754377544775457754677547775487754977550775517755277553775547755577556775577755877559775607756177562775637756477565775667756777568775697757077571775727757377574775757757677577775787757977580775817758277583775847758577586775877758877589775907759177592775937759477595775967759777598775997760077601776027760377604776057760677607776087760977610776117761277613776147761577616776177761877619776207762177622776237762477625776267762777628776297763077631776327763377634776357763677637776387763977640776417764277643776447764577646776477764877649776507765177652776537765477655776567765777658776597766077661776627766377664776657766677667776687766977670776717767277673776747767577676776777767877679776807768177682776837768477685776867768777688776897769077691776927769377694776957769677697776987769977700777017770277703777047770577706777077770877709777107771177712777137771477715777167771777718777197772077721777227772377724777257772677727777287772977730777317773277733777347773577736777377773877739777407774177742777437774477745777467774777748777497775077751777527775377754777557775677757777587775977760777617776277763777647776577766777677776877769777707777177772777737777477775777767777777778777797778077781777827778377784777857778677787777887778977790777917779277793777947779577796777977779877799778007780177802778037780477805778067780777808778097781077811778127781377814778157781677817778187781977820778217782277823778247782577826778277782877829778307783177832778337783477835778367783777838778397784077841778427784377844778457784677847778487784977850778517785277853778547785577856778577785877859778607786177862778637786477865778667786777868778697787077871778727787377874778757787677877778787787977880778817788277883778847788577886778877788877889778907789177892778937789477895778967789777898778997790077901779027790377904779057790677907779087790977910779117791277913779147791577916779177791877919779207792177922779237792477925779267792777928779297793077931779327793377934779357793677937779387793977940779417794277943779447794577946779477794877949779507795177952779537795477955779567795777958779597796077961779627796377964779657796677967779687796977970779717797277973779747797577976779777797877979779807798177982779837798477985779867798777988779897799077991779927799377994779957799677997779987799978000780017800278003780047800578006780077800878009780107801178012780137801478015780167801778018780197802078021780227802378024780257802678027780287802978030780317803278033780347803578036780377803878039780407804178042780437804478045780467804778048780497805078051780527805378054780557805678057780587805978060780617806278063780647806578066780677806878069780707807178072780737807478075780767807778078780797808078081780827808378084780857808678087780887808978090780917809278093780947809578096780977809878099781007810178102781037810478105781067810778108781097811078111781127811378114781157811678117781187811978120781217812278123781247812578126781277812878129781307813178132781337813478135781367813778138781397814078141781427814378144781457814678147781487814978150781517815278153781547815578156781577815878159781607816178162781637816478165781667816778168781697817078171781727817378174781757817678177781787817978180781817818278183781847818578186781877818878189781907819178192781937819478195781967819778198781997820078201782027820378204782057820678207782087820978210782117821278213782147821578216782177821878219782207822178222782237822478225782267822778228782297823078231782327823378234782357823678237782387823978240782417824278243782447824578246782477824878249782507825178252782537825478255782567825778258782597826078261782627826378264782657826678267782687826978270782717827278273782747827578276782777827878279782807828178282782837828478285782867828778288782897829078291782927829378294782957829678297782987829978300783017830278303783047830578306783077830878309783107831178312783137831478315783167831778318783197832078321783227832378324783257832678327783287832978330783317833278333783347833578336783377833878339783407834178342783437834478345783467834778348783497835078351783527835378354783557835678357783587835978360783617836278363783647836578366783677836878369783707837178372783737837478375783767837778378783797838078381783827838378384783857838678387783887838978390783917839278393783947839578396783977839878399784007840178402784037840478405784067840778408784097841078411784127841378414784157841678417784187841978420784217842278423784247842578426784277842878429784307843178432784337843478435784367843778438784397844078441784427844378444784457844678447784487844978450784517845278453784547845578456784577845878459784607846178462784637846478465784667846778468784697847078471784727847378474784757847678477784787847978480784817848278483784847848578486784877848878489784907849178492784937849478495784967849778498784997850078501785027850378504785057850678507785087850978510785117851278513785147851578516785177851878519785207852178522785237852478525785267852778528785297853078531785327853378534785357853678537785387853978540785417854278543785447854578546785477854878549785507855178552785537855478555785567855778558785597856078561785627856378564785657856678567785687856978570785717857278573785747857578576785777857878579785807858178582785837858478585785867858778588785897859078591785927859378594785957859678597785987859978600786017860278603786047860578606786077860878609786107861178612786137861478615786167861778618786197862078621786227862378624786257862678627786287862978630786317863278633786347863578636786377863878639786407864178642786437864478645786467864778648786497865078651786527865378654786557865678657786587865978660786617866278663786647866578666786677866878669786707867178672786737867478675786767867778678786797868078681786827868378684786857868678687786887868978690786917869278693786947869578696786977869878699787007870178702787037870478705787067870778708787097871078711787127871378714787157871678717787187871978720787217872278723787247872578726787277872878729787307873178732787337873478735787367873778738787397874078741787427874378744787457874678747787487874978750787517875278753787547875578756787577875878759787607876178762787637876478765787667876778768787697877078771787727877378774787757877678777787787877978780787817878278783787847878578786787877878878789787907879178792787937879478795787967879778798787997880078801788027880378804788057880678807788087880978810788117881278813788147881578816788177881878819788207882178822788237882478825788267882778828788297883078831788327883378834788357883678837788387883978840788417884278843788447884578846788477884878849788507885178852788537885478855788567885778858788597886078861788627886378864788657886678867788687886978870788717887278873788747887578876788777887878879788807888178882788837888478885788867888778888788897889078891788927889378894788957889678897788987889978900789017890278903789047890578906789077890878909789107891178912789137891478915789167891778918789197892078921789227892378924789257892678927789287892978930789317893278933789347893578936789377893878939789407894178942789437894478945789467894778948789497895078951789527895378954789557895678957789587895978960789617896278963789647896578966789677896878969789707897178972789737897478975789767897778978789797898078981789827898378984789857898678987789887898978990789917899278993789947899578996789977899878999790007900179002790037900479005790067900779008790097901079011790127901379014790157901679017790187901979020790217902279023790247902579026790277902879029790307903179032790337903479035790367903779038790397904079041790427904379044790457904679047790487904979050790517905279053790547905579056790577905879059790607906179062790637906479065790667906779068790697907079071790727907379074790757907679077790787907979080790817908279083790847908579086790877908879089790907909179092790937909479095790967909779098790997910079101791027910379104791057910679107791087910979110791117911279113791147911579116791177911879119791207912179122791237912479125791267912779128791297913079131791327913379134791357913679137791387913979140791417914279143791447914579146791477914879149791507915179152791537915479155791567915779158791597916079161791627916379164791657916679167791687916979170791717917279173791747917579176791777917879179791807918179182791837918479185791867918779188791897919079191791927919379194791957919679197791987919979200792017920279203792047920579206792077920879209792107921179212792137921479215792167921779218792197922079221792227922379224792257922679227792287922979230792317923279233792347923579236792377923879239792407924179242792437924479245792467924779248792497925079251792527925379254792557925679257792587925979260792617926279263792647926579266792677926879269792707927179272792737927479275792767927779278792797928079281792827928379284792857928679287792887928979290792917929279293792947929579296792977929879299793007930179302793037930479305793067930779308793097931079311793127931379314793157931679317793187931979320793217932279323793247932579326793277932879329793307933179332793337933479335793367933779338793397934079341793427934379344793457934679347793487934979350793517935279353793547935579356793577935879359793607936179362793637936479365793667936779368793697937079371793727937379374793757937679377793787937979380793817938279383793847938579386793877938879389793907939179392793937939479395793967939779398793997940079401794027940379404794057940679407794087940979410794117941279413794147941579416794177941879419794207942179422794237942479425794267942779428794297943079431794327943379434794357943679437794387943979440794417944279443794447944579446794477944879449794507945179452794537945479455794567945779458794597946079461794627946379464794657946679467794687946979470794717947279473794747947579476794777947879479794807948179482794837948479485794867948779488794897949079491794927949379494794957949679497794987949979500795017950279503795047950579506795077950879509795107951179512795137951479515795167951779518795197952079521795227952379524795257952679527795287952979530795317953279533795347953579536795377953879539795407954179542795437954479545795467954779548795497955079551795527955379554795557955679557795587955979560795617956279563795647956579566795677956879569795707957179572795737957479575795767957779578795797958079581795827958379584795857958679587795887958979590795917959279593795947959579596795977959879599796007960179602796037960479605796067960779608796097961079611796127961379614796157961679617796187961979620796217962279623796247962579626796277962879629796307963179632796337963479635796367963779638796397964079641796427964379644796457964679647796487964979650796517965279653796547965579656796577965879659796607966179662796637966479665796667966779668796697967079671796727967379674796757967679677796787967979680796817968279683796847968579686796877968879689796907969179692796937969479695796967969779698796997970079701797027970379704797057970679707797087970979710797117971279713797147971579716797177971879719797207972179722797237972479725797267972779728797297973079731797327973379734797357973679737797387973979740797417974279743797447974579746797477974879749797507975179752797537975479755797567975779758797597976079761797627976379764797657976679767797687976979770797717977279773797747977579776797777977879779797807978179782797837978479785797867978779788797897979079791797927979379794797957979679797797987979979800798017980279803798047980579806798077980879809798107981179812798137981479815798167981779818798197982079821798227982379824798257982679827798287982979830798317983279833798347983579836798377983879839798407984179842798437984479845798467984779848798497985079851798527985379854798557985679857798587985979860798617986279863798647986579866798677986879869798707987179872798737987479875798767987779878798797988079881798827988379884798857988679887798887988979890798917989279893798947989579896798977989879899799007990179902799037990479905799067990779908799097991079911799127991379914799157991679917799187991979920799217992279923799247992579926799277992879929799307993179932799337993479935799367993779938799397994079941799427994379944799457994679947799487994979950799517995279953799547995579956799577995879959799607996179962799637996479965799667996779968799697997079971799727997379974799757997679977799787997979980799817998279983799847998579986799877998879989799907999179992799937999479995799967999779998799998000080001800028000380004800058000680007800088000980010800118001280013800148001580016800178001880019800208002180022800238002480025800268002780028800298003080031800328003380034800358003680037800388003980040800418004280043800448004580046800478004880049800508005180052800538005480055800568005780058800598006080061800628006380064800658006680067800688006980070800718007280073800748007580076800778007880079800808008180082800838008480085800868008780088800898009080091800928009380094800958009680097800988009980100801018010280103801048010580106801078010880109801108011180112801138011480115801168011780118801198012080121801228012380124801258012680127801288012980130801318013280133801348013580136801378013880139801408014180142801438014480145801468014780148801498015080151801528015380154801558015680157801588015980160801618016280163801648016580166801678016880169801708017180172801738017480175801768017780178801798018080181801828018380184801858018680187801888018980190801918019280193801948019580196801978019880199802008020180202802038020480205802068020780208802098021080211802128021380214802158021680217802188021980220802218022280223802248022580226802278022880229802308023180232802338023480235802368023780238802398024080241802428024380244802458024680247802488024980250802518025280253802548025580256802578025880259802608026180262802638026480265802668026780268802698027080271802728027380274802758027680277802788027980280802818028280283802848028580286802878028880289802908029180292802938029480295802968029780298802998030080301803028030380304803058030680307803088030980310803118031280313803148031580316803178031880319803208032180322803238032480325803268032780328803298033080331803328033380334803358033680337803388033980340803418034280343803448034580346803478034880349803508035180352803538035480355803568035780358803598036080361803628036380364803658036680367803688036980370803718037280373803748037580376803778037880379803808038180382803838038480385803868038780388803898039080391803928039380394803958039680397803988039980400804018040280403804048040580406804078040880409804108041180412804138041480415804168041780418804198042080421804228042380424804258042680427804288042980430804318043280433804348043580436804378043880439804408044180442804438044480445804468044780448804498045080451804528045380454804558045680457804588045980460804618046280463804648046580466804678046880469804708047180472804738047480475804768047780478804798048080481804828048380484804858048680487804888048980490804918049280493804948049580496804978049880499805008050180502805038050480505805068050780508805098051080511805128051380514805158051680517805188051980520805218052280523805248052580526805278052880529805308053180532805338053480535805368053780538805398054080541805428054380544805458054680547805488054980550805518055280553805548055580556805578055880559805608056180562805638056480565805668056780568805698057080571805728057380574805758057680577805788057980580805818058280583805848058580586805878058880589805908059180592805938059480595805968059780598805998060080601806028060380604806058060680607806088060980610806118061280613806148061580616806178061880619806208062180622806238062480625806268062780628806298063080631806328063380634806358063680637806388063980640806418064280643806448064580646806478064880649806508065180652806538065480655806568065780658806598066080661806628066380664806658066680667806688066980670806718067280673806748067580676806778067880679806808068180682806838068480685806868068780688806898069080691806928069380694806958069680697806988069980700807018070280703807048070580706807078070880709807108071180712807138071480715807168071780718807198072080721807228072380724807258072680727807288072980730807318073280733807348073580736807378073880739807408074180742807438074480745807468074780748807498075080751807528075380754807558075680757807588075980760807618076280763807648076580766807678076880769807708077180772807738077480775807768077780778807798078080781807828078380784807858078680787807888078980790807918079280793807948079580796807978079880799808008080180802808038080480805808068080780808808098081080811808128081380814808158081680817808188081980820808218082280823808248082580826808278082880829808308083180832808338083480835808368083780838808398084080841808428084380844808458084680847808488084980850808518085280853808548085580856808578085880859808608086180862808638086480865808668086780868808698087080871808728087380874808758087680877808788087980880808818088280883808848088580886808878088880889808908089180892808938089480895808968089780898808998090080901809028090380904809058090680907809088090980910809118091280913809148091580916809178091880919809208092180922809238092480925809268092780928809298093080931809328093380934809358093680937809388093980940809418094280943809448094580946809478094880949809508095180952809538095480955809568095780958809598096080961809628096380964809658096680967809688096980970809718097280973809748097580976809778097880979809808098180982809838098480985809868098780988809898099080991809928099380994809958099680997809988099981000810018100281003810048100581006810078100881009810108101181012810138101481015810168101781018810198102081021810228102381024810258102681027810288102981030810318103281033810348103581036810378103881039810408104181042810438104481045810468104781048810498105081051810528105381054810558105681057810588105981060810618106281063810648106581066810678106881069810708107181072810738107481075810768107781078810798108081081810828108381084810858108681087810888108981090810918109281093810948109581096810978109881099811008110181102811038110481105811068110781108811098111081111811128111381114811158111681117811188111981120811218112281123811248112581126811278112881129811308113181132811338113481135811368113781138811398114081141811428114381144811458114681147811488114981150811518115281153811548115581156811578115881159811608116181162811638116481165811668116781168811698117081171811728117381174811758117681177811788117981180811818118281183811848118581186811878118881189811908119181192811938119481195811968119781198811998120081201812028120381204812058120681207812088120981210812118121281213812148121581216812178121881219812208122181222812238122481225812268122781228812298123081231812328123381234812358123681237812388123981240812418124281243812448124581246812478124881249812508125181252812538125481255812568125781258812598126081261812628126381264812658126681267812688126981270812718127281273812748127581276812778127881279812808128181282812838128481285812868128781288812898129081291812928129381294812958129681297812988129981300813018130281303813048130581306813078130881309813108131181312813138131481315813168131781318813198132081321813228132381324813258132681327813288132981330813318133281333813348133581336813378133881339813408134181342813438134481345813468134781348813498135081351813528135381354813558135681357813588135981360813618136281363813648136581366813678136881369813708137181372813738137481375813768137781378813798138081381813828138381384813858138681387813888138981390813918139281393813948139581396813978139881399814008140181402814038140481405814068140781408814098141081411814128141381414814158141681417814188141981420814218142281423814248142581426814278142881429814308143181432814338143481435814368143781438814398144081441814428144381444814458144681447814488144981450814518145281453814548145581456814578145881459814608146181462814638146481465814668146781468814698147081471814728147381474814758147681477814788147981480814818148281483814848148581486814878148881489814908149181492814938149481495814968149781498814998150081501815028150381504815058150681507815088150981510815118151281513815148151581516815178151881519815208152181522815238152481525815268152781528815298153081531815328153381534815358153681537815388153981540815418154281543815448154581546815478154881549815508155181552815538155481555815568155781558815598156081561815628156381564815658156681567815688156981570815718157281573815748157581576815778157881579815808158181582815838158481585815868158781588815898159081591815928159381594815958159681597815988159981600816018160281603816048160581606816078160881609816108161181612816138161481615816168161781618816198162081621816228162381624816258162681627816288162981630816318163281633816348163581636816378163881639816408164181642816438164481645816468164781648816498165081651816528165381654816558165681657816588165981660816618166281663816648166581666816678166881669816708167181672816738167481675816768167781678816798168081681816828168381684816858168681687816888168981690816918169281693816948169581696816978169881699817008170181702817038170481705817068170781708817098171081711817128171381714817158171681717817188171981720817218172281723817248172581726817278172881729817308173181732817338173481735817368173781738817398174081741817428174381744817458174681747817488174981750817518175281753817548175581756817578175881759817608176181762817638176481765817668176781768817698177081771817728177381774817758177681777817788177981780817818178281783817848178581786817878178881789817908179181792817938179481795817968179781798817998180081801818028180381804818058180681807818088180981810818118181281813818148181581816818178181881819818208182181822818238182481825818268182781828818298183081831818328183381834818358183681837818388183981840818418184281843818448184581846818478184881849818508185181852818538185481855818568185781858818598186081861818628186381864818658186681867818688186981870818718187281873818748187581876818778187881879818808188181882818838188481885818868188781888818898189081891818928189381894818958189681897818988189981900819018190281903819048190581906819078190881909819108191181912819138191481915819168191781918819198192081921819228192381924819258192681927819288192981930819318193281933819348193581936819378193881939819408194181942819438194481945819468194781948819498195081951819528195381954819558195681957819588195981960819618196281963819648196581966819678196881969819708197181972819738197481975819768197781978819798198081981819828198381984819858198681987819888198981990819918199281993819948199581996819978199881999820008200182002820038200482005820068200782008820098201082011820128201382014820158201682017820188201982020820218202282023820248202582026820278202882029820308203182032820338203482035820368203782038820398204082041820428204382044820458204682047820488204982050820518205282053820548205582056820578205882059820608206182062820638206482065820668206782068820698207082071820728207382074820758207682077820788207982080820818208282083820848208582086820878208882089820908209182092820938209482095820968209782098820998210082101821028210382104821058210682107821088210982110821118211282113821148211582116821178211882119821208212182122821238212482125821268212782128821298213082131821328213382134821358213682137821388213982140821418214282143821448214582146821478214882149821508215182152821538215482155821568215782158821598216082161821628216382164821658216682167821688216982170821718217282173821748217582176821778217882179821808218182182821838218482185821868218782188821898219082191821928219382194821958219682197821988219982200822018220282203822048220582206822078220882209822108221182212822138221482215822168221782218822198222082221822228222382224822258222682227822288222982230822318223282233822348223582236822378223882239822408224182242822438224482245822468224782248822498225082251822528225382254822558225682257822588225982260822618226282263822648226582266822678226882269822708227182272822738227482275822768227782278822798228082281822828228382284822858228682287822888228982290822918229282293822948229582296822978229882299823008230182302823038230482305823068230782308823098231082311823128231382314823158231682317823188231982320823218232282323823248232582326823278232882329823308233182332823338233482335823368233782338823398234082341823428234382344823458234682347823488234982350823518235282353823548235582356823578235882359823608236182362823638236482365823668236782368823698237082371823728237382374823758237682377823788237982380823818238282383823848238582386823878238882389823908239182392823938239482395823968239782398823998240082401824028240382404824058240682407824088240982410824118241282413824148241582416824178241882419824208242182422824238242482425824268242782428824298243082431824328243382434824358243682437824388243982440824418244282443824448244582446824478244882449824508245182452824538245482455824568245782458824598246082461824628246382464824658246682467824688246982470824718247282473824748247582476824778247882479824808248182482824838248482485824868248782488824898249082491824928249382494824958249682497824988249982500825018250282503825048250582506825078250882509825108251182512825138251482515825168251782518825198252082521825228252382524825258252682527825288252982530825318253282533825348253582536825378253882539825408254182542825438254482545825468254782548825498255082551825528255382554825558255682557825588255982560825618256282563825648256582566825678256882569825708257182572825738257482575825768257782578825798258082581825828258382584825858258682587825888258982590825918259282593825948259582596825978259882599826008260182602826038260482605826068260782608826098261082611826128261382614826158261682617826188261982620826218262282623826248262582626826278262882629826308263182632826338263482635826368263782638826398264082641826428264382644826458264682647826488264982650826518265282653826548265582656826578265882659826608266182662826638266482665826668266782668826698267082671826728267382674826758267682677826788267982680826818268282683826848268582686826878268882689826908269182692826938269482695826968269782698826998270082701827028270382704827058270682707827088270982710827118271282713827148271582716827178271882719827208272182722827238272482725827268272782728827298273082731827328273382734827358273682737827388273982740827418274282743827448274582746827478274882749827508275182752827538275482755827568275782758827598276082761827628276382764827658276682767827688276982770827718277282773827748277582776827778277882779827808278182782827838278482785827868278782788827898279082791827928279382794827958279682797827988279982800828018280282803828048280582806828078280882809828108281182812828138281482815828168281782818828198282082821828228282382824828258282682827828288282982830828318283282833828348283582836828378283882839828408284182842828438284482845828468284782848828498285082851828528285382854828558285682857828588285982860828618286282863828648286582866828678286882869828708287182872828738287482875828768287782878828798288082881828828288382884828858288682887828888288982890828918289282893828948289582896828978289882899829008290182902829038290482905829068290782908829098291082911829128291382914829158291682917829188291982920829218292282923829248292582926829278292882929829308293182932829338293482935829368293782938829398294082941829428294382944829458294682947829488294982950829518295282953829548295582956829578295882959829608296182962829638296482965829668296782968829698297082971829728297382974829758297682977829788297982980829818298282983829848298582986829878298882989829908299182992829938299482995829968299782998829998300083001830028300383004830058300683007830088300983010830118301283013830148301583016830178301883019830208302183022830238302483025830268302783028830298303083031830328303383034830358303683037830388303983040830418304283043830448304583046830478304883049830508305183052830538305483055830568305783058830598306083061830628306383064830658306683067830688306983070830718307283073830748307583076830778307883079830808308183082830838308483085830868308783088830898309083091830928309383094830958309683097830988309983100831018310283103831048310583106831078310883109831108311183112831138311483115831168311783118831198312083121831228312383124831258312683127831288312983130831318313283133831348313583136831378313883139831408314183142831438314483145831468314783148831498315083151831528315383154831558315683157831588315983160831618316283163831648316583166831678316883169831708317183172831738317483175831768317783178831798318083181831828318383184831858318683187831888318983190831918319283193831948319583196831978319883199832008320183202832038320483205832068320783208832098321083211832128321383214832158321683217832188321983220832218322283223832248322583226832278322883229832308323183232832338323483235832368323783238832398324083241832428324383244832458324683247832488324983250832518325283253832548325583256832578325883259832608326183262832638326483265832668326783268832698327083271832728327383274832758327683277832788327983280832818328283283832848328583286832878328883289832908329183292832938329483295832968329783298832998330083301833028330383304833058330683307833088330983310833118331283313833148331583316833178331883319833208332183322833238332483325833268332783328833298333083331833328333383334833358333683337833388333983340833418334283343833448334583346833478334883349833508335183352833538335483355833568335783358833598336083361833628336383364833658336683367833688336983370833718337283373833748337583376833778337883379833808338183382833838338483385833868338783388833898339083391833928339383394833958339683397833988339983400834018340283403834048340583406834078340883409834108341183412834138341483415834168341783418834198342083421834228342383424834258342683427834288342983430834318343283433834348343583436834378343883439834408344183442834438344483445834468344783448834498345083451834528345383454834558345683457834588345983460834618346283463834648346583466834678346883469834708347183472834738347483475834768347783478834798348083481834828348383484834858348683487834888348983490834918349283493834948349583496834978349883499835008350183502835038350483505835068350783508835098351083511835128351383514835158351683517835188351983520835218352283523835248352583526835278352883529835308353183532835338353483535835368353783538835398354083541835428354383544835458354683547835488354983550835518355283553835548355583556835578355883559835608356183562835638356483565835668356783568835698357083571835728357383574835758357683577835788357983580835818358283583835848358583586835878358883589835908359183592835938359483595835968359783598835998360083601836028360383604836058360683607836088360983610836118361283613836148361583616836178361883619836208362183622836238362483625836268362783628836298363083631836328363383634836358363683637836388363983640836418364283643836448364583646836478364883649836508365183652836538365483655836568365783658836598366083661836628366383664836658366683667836688366983670836718367283673836748367583676836778367883679836808368183682836838368483685836868368783688836898369083691836928369383694836958369683697836988369983700837018370283703837048370583706837078370883709837108371183712837138371483715837168371783718837198372083721837228372383724837258372683727837288372983730837318373283733837348373583736837378373883739837408374183742837438374483745837468374783748837498375083751837528375383754837558375683757837588375983760837618376283763837648376583766837678376883769837708377183772837738377483775837768377783778837798378083781837828378383784837858378683787837888378983790837918379283793837948379583796837978379883799838008380183802838038380483805838068380783808838098381083811838128381383814838158381683817838188381983820838218382283823838248382583826838278382883829838308383183832838338383483835838368383783838838398384083841838428384383844838458384683847838488384983850838518385283853838548385583856838578385883859838608386183862838638386483865838668386783868838698387083871838728387383874838758387683877838788387983880838818388283883838848388583886838878388883889838908389183892838938389483895838968389783898838998390083901839028390383904839058390683907839088390983910839118391283913839148391583916839178391883919839208392183922839238392483925839268392783928839298393083931839328393383934839358393683937839388393983940839418394283943839448394583946839478394883949839508395183952839538395483955839568395783958839598396083961839628396383964839658396683967839688396983970839718397283973839748397583976839778397883979839808398183982839838398483985839868398783988839898399083991839928399383994839958399683997839988399984000840018400284003840048400584006840078400884009840108401184012840138401484015840168401784018840198402084021840228402384024840258402684027840288402984030840318403284033840348403584036840378403884039840408404184042840438404484045840468404784048840498405084051840528405384054840558405684057840588405984060840618406284063840648406584066840678406884069840708407184072840738407484075840768407784078840798408084081840828408384084840858408684087840888408984090840918409284093840948409584096840978409884099841008410184102841038410484105841068410784108841098411084111841128411384114841158411684117841188411984120841218412284123841248412584126841278412884129841308413184132841338413484135841368413784138841398414084141841428414384144841458414684147841488414984150841518415284153841548415584156841578415884159841608416184162841638416484165841668416784168841698417084171841728417384174841758417684177841788417984180841818418284183841848418584186841878418884189841908419184192841938419484195841968419784198841998420084201842028420384204842058420684207842088420984210842118421284213842148421584216842178421884219842208422184222842238422484225842268422784228842298423084231842328423384234842358423684237842388423984240842418424284243842448424584246842478424884249842508425184252842538425484255842568425784258842598426084261842628426384264842658426684267842688426984270842718427284273842748427584276842778427884279842808428184282842838428484285842868428784288842898429084291842928429384294842958429684297842988429984300843018430284303843048430584306843078430884309843108431184312843138431484315843168431784318843198432084321843228432384324843258432684327843288432984330843318433284333843348433584336843378433884339843408434184342843438434484345843468434784348843498435084351843528435384354843558435684357843588435984360843618436284363843648436584366843678436884369843708437184372843738437484375843768437784378843798438084381843828438384384843858438684387843888438984390843918439284393843948439584396843978439884399844008440184402844038440484405844068440784408844098441084411844128441384414844158441684417844188441984420844218442284423844248442584426844278442884429844308443184432844338443484435844368443784438844398444084441844428444384444844458444684447844488444984450844518445284453844548445584456844578445884459844608446184462844638446484465844668446784468844698447084471844728447384474844758447684477844788447984480844818448284483844848448584486844878448884489844908449184492844938449484495844968449784498844998450084501845028450384504845058450684507845088450984510845118451284513845148451584516845178451884519845208452184522845238452484525845268452784528845298453084531845328453384534845358453684537845388453984540845418454284543845448454584546845478454884549845508455184552845538455484555845568455784558845598456084561845628456384564845658456684567845688456984570845718457284573845748457584576845778457884579845808458184582845838458484585845868458784588845898459084591845928459384594845958459684597845988459984600846018460284603846048460584606846078460884609846108461184612846138461484615846168461784618846198462084621846228462384624846258462684627846288462984630846318463284633846348463584636846378463884639846408464184642846438464484645846468464784648846498465084651846528465384654846558465684657846588465984660846618466284663846648466584666846678466884669846708467184672846738467484675846768467784678846798468084681846828468384684846858468684687846888468984690846918469284693846948469584696846978469884699847008470184702847038470484705847068470784708847098471084711847128471384714847158471684717847188471984720847218472284723847248472584726847278472884729847308473184732847338473484735847368473784738847398474084741847428474384744847458474684747847488474984750847518475284753847548475584756847578475884759847608476184762847638476484765847668476784768847698477084771847728477384774847758477684777847788477984780847818478284783847848478584786847878478884789847908479184792847938479484795847968479784798847998480084801848028480384804848058480684807848088480984810848118481284813848148481584816848178481884819848208482184822848238482484825848268482784828848298483084831848328483384834848358483684837848388483984840848418484284843848448484584846848478484884849848508485184852848538485484855848568485784858848598486084861848628486384864848658486684867848688486984870848718487284873848748487584876848778487884879848808488184882848838488484885848868488784888848898489084891848928489384894848958489684897848988489984900849018490284903849048490584906849078490884909849108491184912849138491484915849168491784918849198492084921849228492384924849258492684927849288492984930849318493284933849348493584936849378493884939849408494184942849438494484945849468494784948849498495084951849528495384954849558495684957849588495984960849618496284963849648496584966849678496884969849708497184972849738497484975849768497784978849798498084981849828498384984849858498684987849888498984990849918499284993849948499584996849978499884999850008500185002850038500485005850068500785008850098501085011850128501385014850158501685017850188501985020850218502285023850248502585026850278502885029850308503185032850338503485035850368503785038850398504085041850428504385044850458504685047850488504985050850518505285053850548505585056850578505885059850608506185062850638506485065850668506785068850698507085071850728507385074850758507685077850788507985080850818508285083850848508585086850878508885089850908509185092850938509485095850968509785098850998510085101851028510385104851058510685107851088510985110851118511285113851148511585116851178511885119851208512185122851238512485125851268512785128851298513085131851328513385134851358513685137851388513985140851418514285143851448514585146851478514885149851508515185152851538515485155851568515785158851598516085161851628516385164851658516685167851688516985170851718517285173851748517585176851778517885179851808518185182851838518485185851868518785188851898519085191851928519385194851958519685197851988519985200852018520285203852048520585206852078520885209852108521185212852138521485215852168521785218852198522085221852228522385224852258522685227852288522985230852318523285233852348523585236852378523885239852408524185242852438524485245852468524785248852498525085251852528525385254852558525685257852588525985260852618526285263852648526585266852678526885269852708527185272852738527485275852768527785278852798528085281852828528385284852858528685287852888528985290852918529285293852948529585296852978529885299853008530185302853038530485305853068530785308853098531085311853128531385314853158531685317853188531985320853218532285323853248532585326853278532885329853308533185332853338533485335853368533785338853398534085341853428534385344853458534685347853488534985350853518535285353853548535585356853578535885359853608536185362853638536485365853668536785368853698537085371853728537385374853758537685377853788537985380853818538285383853848538585386853878538885389853908539185392853938539485395853968539785398853998540085401854028540385404854058540685407854088540985410854118541285413854148541585416854178541885419854208542185422854238542485425854268542785428854298543085431854328543385434854358543685437854388543985440854418544285443854448544585446854478544885449854508545185452854538545485455854568545785458854598546085461854628546385464854658546685467854688546985470854718547285473854748547585476854778547885479854808548185482854838548485485854868548785488854898549085491854928549385494854958549685497854988549985500855018550285503855048550585506855078550885509855108551185512855138551485515855168551785518855198552085521855228552385524855258552685527855288552985530855318553285533855348553585536855378553885539855408554185542855438554485545855468554785548855498555085551855528555385554855558555685557855588555985560855618556285563855648556585566855678556885569855708557185572855738557485575855768557785578855798558085581855828558385584855858558685587855888558985590855918559285593855948559585596855978559885599856008560185602856038560485605856068560785608856098561085611856128561385614856158561685617856188561985620856218562285623856248562585626856278562885629856308563185632856338563485635856368563785638856398564085641856428564385644856458564685647856488564985650856518565285653856548565585656856578565885659856608566185662856638566485665856668566785668856698567085671856728567385674856758567685677856788567985680856818568285683856848568585686856878568885689856908569185692856938569485695856968569785698856998570085701857028570385704857058570685707857088570985710857118571285713857148571585716857178571885719857208572185722857238572485725857268572785728857298573085731857328573385734857358573685737857388573985740857418574285743857448574585746857478574885749857508575185752857538575485755857568575785758857598576085761857628576385764857658576685767857688576985770857718577285773857748577585776857778577885779857808578185782857838578485785857868578785788857898579085791857928579385794857958579685797857988579985800858018580285803858048580585806858078580885809858108581185812858138581485815858168581785818858198582085821858228582385824858258582685827858288582985830858318583285833858348583585836858378583885839858408584185842858438584485845858468584785848858498585085851858528585385854858558585685857858588585985860858618586285863858648586585866858678586885869858708587185872858738587485875858768587785878858798588085881858828588385884858858588685887858888588985890858918589285893858948589585896858978589885899859008590185902859038590485905859068590785908859098591085911859128591385914859158591685917859188591985920859218592285923859248592585926859278592885929859308593185932859338593485935859368593785938859398594085941859428594385944859458594685947859488594985950859518595285953859548595585956859578595885959859608596185962859638596485965859668596785968859698597085971859728597385974859758597685977859788597985980859818598285983859848598585986859878598885989859908599185992859938599485995859968599785998859998600086001860028600386004860058600686007860088600986010860118601286013860148601586016860178601886019860208602186022860238602486025860268602786028860298603086031860328603386034860358603686037860388603986040860418604286043860448604586046860478604886049860508605186052860538605486055860568605786058860598606086061860628606386064860658606686067860688606986070860718607286073860748607586076860778607886079860808608186082860838608486085860868608786088860898609086091860928609386094860958609686097860988609986100861018610286103861048610586106861078610886109861108611186112861138611486115861168611786118861198612086121861228612386124861258612686127861288612986130861318613286133861348613586136861378613886139861408614186142861438614486145861468614786148861498615086151861528615386154861558615686157861588615986160861618616286163861648616586166861678616886169861708617186172861738617486175861768617786178861798618086181861828618386184861858618686187861888618986190861918619286193861948619586196861978619886199862008620186202862038620486205862068620786208862098621086211862128621386214862158621686217862188621986220862218622286223862248622586226862278622886229862308623186232862338623486235862368623786238862398624086241862428624386244862458624686247862488624986250862518625286253862548625586256862578625886259862608626186262862638626486265862668626786268862698627086271862728627386274862758627686277862788627986280862818628286283862848628586286862878628886289862908629186292862938629486295862968629786298862998630086301863028630386304863058630686307863088630986310863118631286313863148631586316863178631886319863208632186322863238632486325863268632786328863298633086331863328633386334863358633686337863388633986340863418634286343863448634586346863478634886349863508635186352863538635486355863568635786358863598636086361863628636386364863658636686367863688636986370863718637286373863748637586376863778637886379863808638186382863838638486385863868638786388863898639086391863928639386394863958639686397863988639986400864018640286403864048640586406864078640886409864108641186412864138641486415864168641786418864198642086421864228642386424864258642686427864288642986430864318643286433864348643586436864378643886439864408644186442864438644486445864468644786448864498645086451864528645386454864558645686457864588645986460864618646286463864648646586466864678646886469864708647186472864738647486475864768647786478864798648086481864828648386484864858648686487864888648986490864918649286493864948649586496864978649886499865008650186502865038650486505865068650786508865098651086511865128651386514865158651686517865188651986520865218652286523865248652586526865278652886529865308653186532865338653486535865368653786538865398654086541865428654386544865458654686547865488654986550865518655286553865548655586556865578655886559865608656186562865638656486565865668656786568865698657086571865728657386574865758657686577865788657986580865818658286583865848658586586865878658886589865908659186592865938659486595865968659786598865998660086601866028660386604866058660686607866088660986610866118661286613866148661586616866178661886619866208662186622866238662486625866268662786628866298663086631866328663386634866358663686637866388663986640866418664286643866448664586646866478664886649866508665186652866538665486655866568665786658866598666086661866628666386664866658666686667866688666986670866718667286673866748667586676866778667886679866808668186682866838668486685866868668786688866898669086691866928669386694866958669686697866988669986700867018670286703867048670586706867078670886709867108671186712867138671486715867168671786718867198672086721867228672386724867258672686727867288672986730867318673286733867348673586736867378673886739867408674186742867438674486745867468674786748867498675086751867528675386754867558675686757867588675986760867618676286763867648676586766867678676886769867708677186772867738677486775867768677786778867798678086781867828678386784867858678686787867888678986790867918679286793867948679586796867978679886799868008680186802868038680486805868068680786808868098681086811868128681386814868158681686817868188681986820868218682286823868248682586826868278682886829868308683186832868338683486835868368683786838868398684086841868428684386844868458684686847868488684986850868518685286853868548685586856868578685886859868608686186862868638686486865868668686786868868698687086871868728687386874868758687686877868788687986880868818688286883868848688586886868878688886889868908689186892868938689486895868968689786898868998690086901869028690386904869058690686907869088690986910869118691286913869148691586916869178691886919869208692186922869238692486925869268692786928869298693086931869328693386934869358693686937869388693986940869418694286943869448694586946869478694886949869508695186952869538695486955869568695786958869598696086961869628696386964869658696686967869688696986970869718697286973869748697586976869778697886979869808698186982869838698486985869868698786988869898699086991869928699386994869958699686997869988699987000870018700287003870048700587006870078700887009870108701187012870138701487015870168701787018870198702087021870228702387024870258702687027870288702987030870318703287033870348703587036870378703887039870408704187042870438704487045870468704787048870498705087051870528705387054870558705687057870588705987060870618706287063870648706587066870678706887069870708707187072870738707487075870768707787078870798708087081870828708387084870858708687087870888708987090870918709287093870948709587096870978709887099871008710187102871038710487105871068710787108871098711087111871128711387114871158711687117871188711987120871218712287123871248712587126871278712887129871308713187132871338713487135871368713787138871398714087141871428714387144871458714687147871488714987150871518715287153871548715587156871578715887159871608716187162871638716487165871668716787168871698717087171871728717387174871758717687177871788717987180871818718287183871848718587186871878718887189871908719187192871938719487195871968719787198871998720087201872028720387204872058720687207872088720987210872118721287213872148721587216872178721887219872208722187222872238722487225872268722787228872298723087231872328723387234872358723687237872388723987240872418724287243872448724587246872478724887249872508725187252872538725487255872568725787258872598726087261872628726387264872658726687267872688726987270872718727287273872748727587276872778727887279872808728187282872838728487285872868728787288872898729087291872928729387294872958729687297872988729987300873018730287303873048730587306873078730887309873108731187312873138731487315873168731787318873198732087321873228732387324873258732687327873288732987330873318733287333873348733587336873378733887339873408734187342873438734487345873468734787348873498735087351873528735387354873558735687357873588735987360873618736287363873648736587366873678736887369873708737187372873738737487375873768737787378873798738087381873828738387384873858738687387873888738987390873918739287393873948739587396873978739887399874008740187402874038740487405874068740787408874098741087411874128741387414874158741687417874188741987420874218742287423874248742587426874278742887429874308743187432874338743487435874368743787438874398744087441874428744387444874458744687447874488744987450874518745287453874548745587456874578745887459874608746187462874638746487465874668746787468874698747087471874728747387474874758747687477874788747987480874818748287483874848748587486874878748887489874908749187492874938749487495874968749787498874998750087501875028750387504875058750687507875088750987510875118751287513875148751587516875178751887519875208752187522875238752487525875268752787528875298753087531875328753387534875358753687537875388753987540875418754287543875448754587546875478754887549875508755187552875538755487555875568755787558875598756087561875628756387564875658756687567875688756987570875718757287573875748757587576875778757887579875808758187582875838758487585875868758787588875898759087591875928759387594875958759687597875988759987600876018760287603876048760587606876078760887609876108761187612876138761487615876168761787618876198762087621876228762387624876258762687627876288762987630876318763287633876348763587636876378763887639876408764187642876438764487645876468764787648876498765087651876528765387654876558765687657876588765987660876618766287663876648766587666876678766887669876708767187672876738767487675876768767787678876798768087681876828768387684876858768687687876888768987690876918769287693876948769587696876978769887699877008770187702877038770487705877068770787708877098771087711877128771387714877158771687717877188771987720877218772287723877248772587726877278772887729877308773187732877338773487735877368773787738877398774087741877428774387744877458774687747877488774987750877518775287753877548775587756877578775887759877608776187762877638776487765877668776787768877698777087771877728777387774877758777687777877788777987780877818778287783877848778587786877878778887789877908779187792877938779487795877968779787798877998780087801878028780387804878058780687807878088780987810878118781287813878148781587816878178781887819878208782187822878238782487825878268782787828878298783087831878328783387834878358783687837878388783987840878418784287843878448784587846878478784887849878508785187852878538785487855878568785787858878598786087861878628786387864878658786687867878688786987870878718787287873878748787587876878778787887879878808788187882878838788487885878868788787888878898789087891878928789387894878958789687897878988789987900879018790287903879048790587906879078790887909879108791187912879138791487915879168791787918879198792087921879228792387924879258792687927879288792987930879318793287933879348793587936879378793887939879408794187942879438794487945879468794787948879498795087951879528795387954879558795687957879588795987960879618796287963879648796587966879678796887969879708797187972879738797487975879768797787978879798798087981879828798387984879858798687987879888798987990879918799287993879948799587996879978799887999880008800188002880038800488005880068800788008880098801088011880128801388014880158801688017880188801988020880218802288023880248802588026880278802888029880308803188032880338803488035880368803788038880398804088041880428804388044880458804688047880488804988050880518805288053880548805588056880578805888059880608806188062880638806488065880668806788068880698807088071880728807388074880758807688077880788807988080880818808288083880848808588086880878808888089880908809188092880938809488095880968809788098880998810088101881028810388104881058810688107881088810988110881118811288113881148811588116881178811888119881208812188122881238812488125881268812788128881298813088131881328813388134881358813688137881388813988140881418814288143881448814588146881478814888149881508815188152881538815488155881568815788158881598816088161881628816388164881658816688167881688816988170881718817288173881748817588176881778817888179881808818188182881838818488185881868818788188881898819088191881928819388194881958819688197881988819988200882018820288203882048820588206882078820888209882108821188212882138821488215882168821788218882198822088221882228822388224882258822688227882288822988230882318823288233882348823588236882378823888239882408824188242882438824488245882468824788248882498825088251882528825388254882558825688257882588825988260882618826288263882648826588266882678826888269882708827188272882738827488275882768827788278882798828088281882828828388284882858828688287882888828988290882918829288293882948829588296882978829888299883008830188302883038830488305883068830788308883098831088311883128831388314883158831688317883188831988320883218832288323883248832588326883278832888329883308833188332883338833488335883368833788338883398834088341883428834388344883458834688347883488834988350883518835288353883548835588356883578835888359883608836188362883638836488365883668836788368883698837088371883728837388374883758837688377883788837988380883818838288383883848838588386883878838888389883908839188392883938839488395883968839788398883998840088401884028840388404884058840688407884088840988410884118841288413884148841588416884178841888419884208842188422884238842488425884268842788428884298843088431884328843388434884358843688437884388843988440884418844288443884448844588446884478844888449884508845188452884538845488455884568845788458884598846088461884628846388464884658846688467884688846988470884718847288473884748847588476884778847888479884808848188482884838848488485884868848788488884898849088491884928849388494884958849688497884988849988500885018850288503885048850588506885078850888509885108851188512885138851488515885168851788518885198852088521885228852388524885258852688527885288852988530885318853288533885348853588536885378853888539885408854188542885438854488545885468854788548885498855088551885528855388554885558855688557885588855988560885618856288563885648856588566885678856888569885708857188572885738857488575885768857788578885798858088581885828858388584885858858688587885888858988590885918859288593885948859588596885978859888599886008860188602886038860488605886068860788608886098861088611886128861388614886158861688617886188861988620886218862288623886248862588626886278862888629886308863188632886338863488635886368863788638886398864088641886428864388644886458864688647886488864988650886518865288653886548865588656886578865888659886608866188662886638866488665886668866788668886698867088671886728867388674886758867688677886788867988680886818868288683886848868588686886878868888689886908869188692886938869488695886968869788698886998870088701887028870388704887058870688707887088870988710887118871288713887148871588716887178871888719887208872188722887238872488725887268872788728887298873088731887328873388734887358873688737887388873988740887418874288743887448874588746887478874888749887508875188752887538875488755887568875788758887598876088761887628876388764887658876688767887688876988770887718877288773887748877588776887778877888779887808878188782887838878488785887868878788788887898879088791887928879388794887958879688797887988879988800888018880288803888048880588806888078880888809888108881188812888138881488815888168881788818888198882088821888228882388824888258882688827888288882988830888318883288833888348883588836888378883888839888408884188842888438884488845888468884788848888498885088851888528885388854888558885688857888588885988860888618886288863888648886588866888678886888869888708887188872888738887488875888768887788878888798888088881888828888388884888858888688887888888888988890888918889288893888948889588896888978889888899889008890188902889038890488905889068890788908889098891088911889128891388914889158891688917889188891988920889218892288923889248892588926889278892888929889308893188932889338893488935889368893788938889398894088941889428894388944889458894688947889488894988950889518895288953889548895588956889578895888959889608896188962889638896488965889668896788968889698897088971889728897388974889758897688977889788897988980889818898288983889848898588986889878898888989889908899188992889938899488995889968899788998889998900089001890028900389004890058900689007890088900989010890118901289013890148901589016890178901889019890208902189022890238902489025890268902789028890298903089031890328903389034890358903689037890388903989040890418904289043890448904589046890478904889049890508905189052890538905489055890568905789058890598906089061890628906389064890658906689067890688906989070890718907289073890748907589076890778907889079890808908189082890838908489085890868908789088890898909089091890928909389094890958909689097890988909989100891018910289103891048910589106891078910889109891108911189112891138911489115891168911789118891198912089121891228912389124891258912689127891288912989130891318913289133891348913589136891378913889139891408914189142891438914489145891468914789148891498915089151891528915389154891558915689157891588915989160891618916289163891648916589166891678916889169891708917189172891738917489175891768917789178891798918089181891828918389184891858918689187891888918989190891918919289193891948919589196891978919889199892008920189202892038920489205892068920789208892098921089211892128921389214892158921689217892188921989220892218922289223892248922589226892278922889229892308923189232892338923489235892368923789238892398924089241892428924389244892458924689247892488924989250892518925289253892548925589256892578925889259892608926189262892638926489265892668926789268892698927089271892728927389274892758927689277892788927989280892818928289283892848928589286892878928889289892908929189292892938929489295892968929789298892998930089301893028930389304893058930689307893088930989310893118931289313893148931589316893178931889319893208932189322893238932489325893268932789328893298933089331893328933389334893358933689337893388933989340893418934289343893448934589346893478934889349893508935189352893538935489355893568935789358893598936089361893628936389364893658936689367893688936989370893718937289373893748937589376893778937889379893808938189382893838938489385893868938789388893898939089391893928939389394893958939689397893988939989400894018940289403894048940589406894078940889409894108941189412894138941489415894168941789418894198942089421894228942389424894258942689427894288942989430894318943289433894348943589436894378943889439894408944189442894438944489445894468944789448894498945089451894528945389454894558945689457894588945989460894618946289463894648946589466894678946889469894708947189472894738947489475894768947789478894798948089481894828948389484894858948689487894888948989490894918949289493894948949589496894978949889499895008950189502895038950489505895068950789508895098951089511895128951389514895158951689517895188951989520895218952289523895248952589526895278952889529895308953189532895338953489535895368953789538895398954089541895428954389544895458954689547895488954989550895518955289553895548955589556895578955889559895608956189562895638956489565895668956789568895698957089571895728957389574895758957689577895788957989580895818958289583895848958589586895878958889589895908959189592895938959489595895968959789598895998960089601896028960389604896058960689607896088960989610896118961289613896148961589616896178961889619896208962189622896238962489625896268962789628896298963089631896328963389634896358963689637896388963989640896418964289643896448964589646896478964889649896508965189652896538965489655896568965789658896598966089661896628966389664896658966689667896688966989670896718967289673896748967589676896778967889679896808968189682896838968489685896868968789688896898969089691896928969389694896958969689697896988969989700897018970289703897048970589706897078970889709897108971189712897138971489715897168971789718897198972089721897228972389724897258972689727897288972989730897318973289733897348973589736897378973889739897408974189742897438974489745897468974789748897498975089751897528975389754897558975689757897588975989760897618976289763897648976589766897678976889769897708977189772897738977489775897768977789778897798978089781897828978389784897858978689787897888978989790897918979289793897948979589796897978979889799898008980189802898038980489805898068980789808898098981089811898128981389814898158981689817898188981989820898218982289823898248982589826898278982889829898308983189832898338983489835898368983789838898398984089841898428984389844898458984689847898488984989850898518985289853898548985589856898578985889859898608986189862898638986489865898668986789868898698987089871898728987389874898758987689877898788987989880898818988289883898848988589886898878988889889898908989189892898938989489895898968989789898898998990089901899028990389904899058990689907899088990989910899118991289913899148991589916899178991889919899208992189922899238992489925899268992789928899298993089931899328993389934899358993689937899388993989940899418994289943899448994589946899478994889949899508995189952899538995489955899568995789958899598996089961899628996389964899658996689967899688996989970899718997289973899748997589976899778997889979899808998189982899838998489985899868998789988899898999089991899928999389994899958999689997899988999990000900019000290003900049000590006900079000890009900109001190012900139001490015900169001790018900199002090021900229002390024900259002690027900289002990030900319003290033900349003590036900379003890039900409004190042900439004490045900469004790048900499005090051900529005390054900559005690057900589005990060900619006290063900649006590066900679006890069900709007190072900739007490075900769007790078900799008090081900829008390084900859008690087900889008990090900919009290093900949009590096900979009890099901009010190102901039010490105901069010790108901099011090111901129011390114901159011690117901189011990120901219012290123901249012590126901279012890129901309013190132901339013490135901369013790138901399014090141901429014390144901459014690147901489014990150901519015290153901549015590156901579015890159901609016190162901639016490165901669016790168901699017090171901729017390174901759017690177901789017990180901819018290183901849018590186901879018890189901909019190192901939019490195901969019790198901999020090201902029020390204902059020690207902089020990210902119021290213902149021590216902179021890219902209022190222902239022490225902269022790228902299023090231902329023390234902359023690237902389023990240902419024290243902449024590246902479024890249902509025190252902539025490255902569025790258902599026090261902629026390264902659026690267902689026990270902719027290273902749027590276902779027890279902809028190282902839028490285902869028790288902899029090291902929029390294902959029690297902989029990300903019030290303903049030590306903079030890309903109031190312903139031490315903169031790318903199032090321903229032390324903259032690327903289032990330903319033290333903349033590336903379033890339903409034190342903439034490345903469034790348903499035090351903529035390354903559035690357903589035990360903619036290363903649036590366903679036890369903709037190372903739037490375903769037790378903799038090381903829038390384903859038690387903889038990390903919039290393903949039590396903979039890399904009040190402904039040490405904069040790408904099041090411904129041390414904159041690417904189041990420904219042290423904249042590426904279042890429904309043190432904339043490435904369043790438904399044090441904429044390444904459044690447904489044990450904519045290453904549045590456904579045890459904609046190462904639046490465904669046790468904699047090471904729047390474904759047690477904789047990480904819048290483904849048590486904879048890489904909049190492904939049490495904969049790498904999050090501905029050390504905059050690507905089050990510905119051290513905149051590516905179051890519905209052190522905239052490525905269052790528905299053090531905329053390534905359053690537905389053990540905419054290543905449054590546905479054890549905509055190552905539055490555905569055790558905599056090561905629056390564905659056690567905689056990570905719057290573905749057590576905779057890579905809058190582905839058490585905869058790588905899059090591905929059390594905959059690597905989059990600906019060290603906049060590606906079060890609906109061190612906139061490615906169061790618906199062090621906229062390624906259062690627906289062990630906319063290633906349063590636906379063890639906409064190642906439064490645906469064790648906499065090651906529065390654906559065690657906589065990660906619066290663906649066590666906679066890669906709067190672906739067490675906769067790678906799068090681906829068390684906859068690687906889068990690906919069290693906949069590696906979069890699907009070190702907039070490705907069070790708907099071090711907129071390714907159071690717907189071990720907219072290723907249072590726907279072890729907309073190732907339073490735907369073790738907399074090741907429074390744907459074690747907489074990750907519075290753907549075590756907579075890759907609076190762907639076490765907669076790768907699077090771907729077390774907759077690777907789077990780907819078290783907849078590786907879078890789907909079190792907939079490795907969079790798907999080090801908029080390804908059080690807908089080990810908119081290813908149081590816908179081890819908209082190822908239082490825908269082790828908299083090831908329083390834908359083690837908389083990840908419084290843908449084590846908479084890849908509085190852908539085490855908569085790858908599086090861908629086390864908659086690867908689086990870908719087290873908749087590876908779087890879908809088190882908839088490885908869088790888908899089090891908929089390894908959089690897908989089990900909019090290903909049090590906909079090890909909109091190912909139091490915909169091790918909199092090921909229092390924909259092690927909289092990930909319093290933909349093590936909379093890939909409094190942909439094490945909469094790948909499095090951909529095390954909559095690957909589095990960909619096290963909649096590966909679096890969909709097190972909739097490975909769097790978909799098090981909829098390984909859098690987909889098990990909919099290993909949099590996909979099890999910009100191002910039100491005910069100791008910099101091011910129101391014910159101691017910189101991020910219102291023910249102591026910279102891029910309103191032910339103491035910369103791038910399104091041910429104391044910459104691047910489104991050910519105291053910549105591056910579105891059910609106191062910639106491065910669106791068910699107091071910729107391074910759107691077910789107991080910819108291083910849108591086910879108891089910909109191092910939109491095910969109791098910999110091101911029110391104911059110691107911089110991110911119111291113911149111591116911179111891119911209112191122911239112491125911269112791128911299113091131911329113391134911359113691137911389113991140911419114291143911449114591146911479114891149911509115191152911539115491155911569115791158911599116091161911629116391164911659116691167911689116991170911719117291173911749117591176911779117891179911809118191182911839118491185911869118791188911899119091191911929119391194911959119691197911989119991200912019120291203912049120591206912079120891209912109121191212912139121491215912169121791218912199122091221912229122391224912259122691227912289122991230912319123291233912349123591236912379123891239912409124191242912439124491245912469124791248912499125091251912529125391254912559125691257912589125991260912619126291263912649126591266912679126891269912709127191272912739127491275912769127791278912799128091281912829128391284912859128691287912889128991290912919129291293912949129591296912979129891299913009130191302913039130491305913069130791308913099131091311913129131391314913159131691317913189131991320913219132291323913249132591326913279132891329913309133191332913339133491335913369133791338913399134091341913429134391344913459134691347913489134991350913519135291353913549135591356913579135891359913609136191362913639136491365913669136791368913699137091371913729137391374913759137691377913789137991380913819138291383913849138591386913879138891389913909139191392913939139491395913969139791398913999140091401914029140391404914059140691407914089140991410914119141291413914149141591416914179141891419914209142191422914239142491425914269142791428914299143091431914329143391434914359143691437914389143991440914419144291443914449144591446914479144891449914509145191452914539145491455914569145791458914599146091461914629146391464914659146691467914689146991470914719147291473914749147591476914779147891479914809148191482914839148491485914869148791488914899149091491914929149391494914959149691497914989149991500915019150291503915049150591506915079150891509915109151191512915139151491515915169151791518915199152091521915229152391524915259152691527915289152991530915319153291533915349153591536915379153891539915409154191542915439154491545915469154791548915499155091551915529155391554915559155691557915589155991560915619156291563915649156591566915679156891569915709157191572915739157491575915769157791578915799158091581915829158391584915859158691587915889158991590915919159291593915949159591596915979159891599916009160191602916039160491605916069160791608916099161091611916129161391614916159161691617916189161991620916219162291623916249162591626916279162891629916309163191632916339163491635916369163791638916399164091641916429164391644916459164691647916489164991650916519165291653916549165591656916579165891659916609166191662916639166491665916669166791668916699167091671916729167391674916759167691677916789167991680916819168291683916849168591686916879168891689916909169191692916939169491695916969169791698916999170091701917029170391704917059170691707917089170991710917119171291713917149171591716917179171891719917209172191722917239172491725917269172791728917299173091731917329173391734917359173691737917389173991740917419174291743917449174591746917479174891749917509175191752917539175491755917569175791758917599176091761917629176391764917659176691767917689176991770917719177291773917749177591776917779177891779917809178191782917839178491785917869178791788917899179091791917929179391794917959179691797917989179991800918019180291803918049180591806918079180891809918109181191812918139181491815918169181791818918199182091821918229182391824918259182691827918289182991830918319183291833918349183591836918379183891839918409184191842918439184491845918469184791848918499185091851918529185391854918559185691857918589185991860918619186291863918649186591866918679186891869918709187191872918739187491875918769187791878918799188091881918829188391884918859188691887918889188991890918919189291893918949189591896918979189891899919009190191902919039190491905919069190791908919099191091911919129191391914919159191691917919189191991920919219192291923919249192591926919279192891929919309193191932919339193491935919369193791938919399194091941919429194391944919459194691947919489194991950919519195291953919549195591956919579195891959919609196191962919639196491965919669196791968919699197091971919729197391974919759197691977919789197991980919819198291983919849198591986919879198891989919909199191992919939199491995919969199791998919999200092001920029200392004920059200692007920089200992010920119201292013920149201592016920179201892019920209202192022920239202492025920269202792028920299203092031920329203392034920359203692037920389203992040920419204292043920449204592046920479204892049920509205192052920539205492055920569205792058920599206092061920629206392064920659206692067920689206992070920719207292073920749207592076920779207892079920809208192082920839208492085920869208792088920899209092091920929209392094920959209692097920989209992100921019210292103921049210592106921079210892109921109211192112921139211492115921169211792118921199212092121921229212392124921259212692127921289212992130921319213292133921349213592136921379213892139921409214192142921439214492145921469214792148921499215092151921529215392154921559215692157921589215992160921619216292163921649216592166921679216892169921709217192172921739217492175921769217792178921799218092181921829218392184921859218692187921889218992190921919219292193921949219592196921979219892199922009220192202922039220492205922069220792208922099221092211922129221392214922159221692217922189221992220922219222292223922249222592226922279222892229922309223192232922339223492235922369223792238922399224092241922429224392244922459224692247922489224992250922519225292253922549225592256922579225892259922609226192262922639226492265922669226792268922699227092271922729227392274922759227692277922789227992280922819228292283922849228592286922879228892289922909229192292922939229492295922969229792298922999230092301923029230392304923059230692307923089230992310923119231292313923149231592316923179231892319923209232192322923239232492325923269232792328923299233092331923329233392334923359233692337923389233992340923419234292343923449234592346923479234892349923509235192352923539235492355923569235792358923599236092361923629236392364923659236692367923689236992370923719237292373923749237592376923779237892379923809238192382923839238492385923869238792388923899239092391923929239392394923959239692397923989239992400924019240292403924049240592406924079240892409924109241192412924139241492415924169241792418924199242092421924229242392424924259242692427924289242992430924319243292433924349243592436924379243892439924409244192442924439244492445924469244792448924499245092451924529245392454924559245692457924589245992460924619246292463924649246592466924679246892469924709247192472924739247492475924769247792478924799248092481924829248392484924859248692487924889248992490924919249292493924949249592496924979249892499925009250192502925039250492505925069250792508925099251092511925129251392514925159251692517925189251992520925219252292523925249252592526925279252892529925309253192532925339253492535925369253792538925399254092541925429254392544925459254692547925489254992550925519255292553925549255592556925579255892559925609256192562925639256492565925669256792568925699257092571925729257392574925759257692577925789257992580925819258292583925849258592586925879258892589925909259192592925939259492595925969259792598925999260092601926029260392604926059260692607926089260992610926119261292613926149261592616926179261892619926209262192622926239262492625926269262792628926299263092631926329263392634926359263692637926389263992640926419264292643926449264592646926479264892649926509265192652926539265492655926569265792658926599266092661926629266392664926659266692667926689266992670926719267292673926749267592676926779267892679926809268192682926839268492685926869268792688926899269092691926929269392694926959269692697926989269992700927019270292703927049270592706927079270892709927109271192712927139271492715927169271792718927199272092721927229272392724927259272692727927289272992730927319273292733927349273592736927379273892739927409274192742927439274492745927469274792748927499275092751927529275392754927559275692757927589275992760927619276292763927649276592766927679276892769927709277192772927739277492775927769277792778927799278092781927829278392784927859278692787927889278992790927919279292793927949279592796927979279892799928009280192802928039280492805928069280792808928099281092811928129281392814928159281692817928189281992820928219282292823928249282592826928279282892829928309283192832928339283492835928369283792838928399284092841928429284392844928459284692847928489284992850928519285292853928549285592856928579285892859928609286192862928639286492865928669286792868928699287092871928729287392874928759287692877928789287992880928819288292883928849288592886928879288892889928909289192892928939289492895928969289792898928999290092901929029290392904929059290692907929089290992910929119291292913929149291592916929179291892919929209292192922929239292492925929269292792928929299293092931929329293392934929359293692937929389293992940929419294292943929449294592946929479294892949929509295192952929539295492955929569295792958929599296092961929629296392964929659296692967929689296992970929719297292973929749297592976929779297892979929809298192982929839298492985929869298792988929899299092991929929299392994929959299692997929989299993000930019300293003930049300593006930079300893009930109301193012930139301493015930169301793018930199302093021930229302393024930259302693027930289302993030930319303293033930349303593036930379303893039930409304193042930439304493045930469304793048930499305093051930529305393054930559305693057930589305993060930619306293063930649306593066930679306893069930709307193072930739307493075930769307793078930799308093081930829308393084930859308693087930889308993090930919309293093930949309593096930979309893099931009310193102931039310493105931069310793108931099311093111931129311393114931159311693117931189311993120931219312293123931249312593126931279312893129931309313193132931339313493135931369313793138931399314093141931429314393144931459314693147931489314993150931519315293153931549315593156931579315893159931609316193162931639316493165931669316793168931699317093171931729317393174931759317693177931789317993180931819318293183931849318593186931879318893189931909319193192931939319493195931969319793198931999320093201932029320393204932059320693207932089320993210932119321293213932149321593216932179321893219932209322193222932239322493225932269322793228932299323093231932329323393234932359323693237932389323993240932419324293243932449324593246932479324893249932509325193252932539325493255932569325793258932599326093261932629326393264932659326693267932689326993270932719327293273932749327593276932779327893279932809328193282932839328493285932869328793288932899329093291932929329393294932959329693297932989329993300933019330293303933049330593306933079330893309933109331193312933139331493315933169331793318933199332093321933229332393324933259332693327933289332993330933319333293333933349333593336933379333893339933409334193342933439334493345933469334793348933499335093351933529335393354933559335693357933589335993360933619336293363933649336593366933679336893369933709337193372933739337493375933769337793378933799338093381933829338393384933859338693387933889338993390933919339293393933949339593396933979339893399934009340193402934039340493405934069340793408934099341093411934129341393414934159341693417934189341993420934219342293423934249342593426934279342893429934309343193432934339343493435934369343793438934399344093441934429344393444934459344693447934489344993450934519345293453934549345593456934579345893459934609346193462934639346493465934669346793468934699347093471934729347393474934759347693477934789347993480934819348293483934849348593486934879348893489934909349193492934939349493495934969349793498934999350093501935029350393504935059350693507935089350993510935119351293513935149351593516935179351893519935209352193522935239352493525935269352793528935299353093531935329353393534935359353693537935389353993540935419354293543935449354593546935479354893549935509355193552935539355493555935569355793558935599356093561935629356393564935659356693567935689356993570935719357293573935749357593576935779357893579935809358193582935839358493585935869358793588935899359093591935929359393594935959359693597935989359993600936019360293603936049360593606936079360893609936109361193612936139361493615936169361793618936199362093621936229362393624936259362693627936289362993630936319363293633936349363593636936379363893639936409364193642936439364493645936469364793648936499365093651936529365393654936559365693657936589365993660936619366293663936649366593666936679366893669936709367193672936739367493675936769367793678936799368093681936829368393684936859368693687936889368993690936919369293693936949369593696936979369893699937009370193702937039370493705937069370793708937099371093711937129371393714937159371693717937189371993720937219372293723937249372593726937279372893729937309373193732937339373493735937369373793738937399374093741937429374393744937459374693747937489374993750937519375293753937549375593756937579375893759937609376193762937639376493765937669376793768937699377093771937729377393774937759377693777937789377993780937819378293783937849378593786937879378893789937909379193792937939379493795937969379793798937999380093801938029380393804938059380693807938089380993810938119381293813938149381593816938179381893819938209382193822938239382493825938269382793828938299383093831938329383393834938359383693837938389383993840938419384293843938449384593846938479384893849938509385193852938539385493855938569385793858938599386093861938629386393864938659386693867938689386993870938719387293873938749387593876938779387893879938809388193882938839388493885938869388793888938899389093891938929389393894938959389693897938989389993900939019390293903939049390593906939079390893909939109391193912939139391493915939169391793918939199392093921939229392393924939259392693927939289392993930939319393293933939349393593936939379393893939939409394193942939439394493945939469394793948939499395093951939529395393954939559395693957939589395993960939619396293963939649396593966939679396893969939709397193972939739397493975939769397793978939799398093981939829398393984939859398693987939889398993990939919399293993939949399593996939979399893999940009400194002940039400494005940069400794008940099401094011940129401394014940159401694017940189401994020940219402294023940249402594026940279402894029940309403194032940339403494035940369403794038940399404094041940429404394044940459404694047940489404994050940519405294053940549405594056940579405894059940609406194062940639406494065940669406794068940699407094071940729407394074940759407694077940789407994080940819408294083940849408594086940879408894089940909409194092940939409494095940969409794098940999410094101941029410394104941059410694107941089410994110941119411294113941149411594116941179411894119941209412194122941239412494125941269412794128941299413094131941329413394134941359413694137941389413994140941419414294143941449414594146941479414894149941509415194152941539415494155941569415794158941599416094161941629416394164941659416694167941689416994170941719417294173941749417594176941779417894179941809418194182941839418494185941869418794188941899419094191941929419394194941959419694197941989419994200942019420294203942049420594206942079420894209942109421194212942139421494215942169421794218942199422094221942229422394224942259422694227942289422994230942319423294233942349423594236942379423894239942409424194242942439424494245942469424794248942499425094251942529425394254942559425694257942589425994260942619426294263942649426594266942679426894269942709427194272942739427494275942769427794278942799428094281942829428394284942859428694287942889428994290942919429294293942949429594296942979429894299943009430194302943039430494305943069430794308943099431094311943129431394314943159431694317943189431994320943219432294323943249432594326943279432894329943309433194332943339433494335943369433794338943399434094341943429434394344943459434694347943489434994350943519435294353943549435594356943579435894359943609436194362943639436494365943669436794368943699437094371943729437394374943759437694377943789437994380943819438294383943849438594386943879438894389943909439194392943939439494395943969439794398943999440094401944029440394404944059440694407944089440994410944119441294413944149441594416944179441894419944209442194422944239442494425944269442794428944299443094431944329443394434944359443694437944389443994440944419444294443944449444594446944479444894449944509445194452944539445494455944569445794458944599446094461944629446394464944659446694467944689446994470944719447294473944749447594476944779447894479944809448194482944839448494485944869448794488944899449094491944929449394494944959449694497944989449994500945019450294503945049450594506945079450894509945109451194512945139451494515945169451794518945199452094521945229452394524945259452694527945289452994530945319453294533945349453594536945379453894539945409454194542945439454494545945469454794548945499455094551945529455394554945559455694557945589455994560945619456294563945649456594566945679456894569945709457194572945739457494575945769457794578945799458094581945829458394584945859458694587945889458994590945919459294593945949459594596945979459894599946009460194602946039460494605946069460794608946099461094611946129461394614946159461694617946189461994620946219462294623946249462594626946279462894629946309463194632946339463494635946369463794638946399464094641946429464394644946459464694647946489464994650946519465294653946549465594656946579465894659946609466194662946639466494665946669466794668946699467094671946729467394674946759467694677946789467994680946819468294683946849468594686946879468894689946909469194692946939469494695946969469794698946999470094701947029470394704947059470694707947089470994710947119471294713947149471594716947179471894719947209472194722947239472494725947269472794728947299473094731947329473394734947359473694737947389473994740947419474294743947449474594746947479474894749947509475194752947539475494755947569475794758947599476094761947629476394764947659476694767947689476994770947719477294773947749477594776947779477894779947809478194782947839478494785947869478794788947899479094791947929479394794947959479694797947989479994800948019480294803948049480594806948079480894809948109481194812948139481494815948169481794818948199482094821948229482394824948259482694827948289482994830948319483294833948349483594836948379483894839948409484194842948439484494845948469484794848948499485094851948529485394854948559485694857948589485994860948619486294863948649486594866948679486894869948709487194872948739487494875948769487794878948799488094881948829488394884948859488694887948889488994890948919489294893948949489594896948979489894899949009490194902949039490494905949069490794908949099491094911949129491394914949159491694917949189491994920949219492294923949249492594926949279492894929949309493194932949339493494935949369493794938949399494094941949429494394944949459494694947949489494994950949519495294953949549495594956949579495894959949609496194962949639496494965949669496794968949699497094971949729497394974949759497694977949789497994980949819498294983949849498594986949879498894989949909499194992949939499494995949969499794998949999500095001950029500395004950059500695007950089500995010950119501295013950149501595016950179501895019950209502195022950239502495025950269502795028950299503095031950329503395034950359503695037950389503995040950419504295043950449504595046950479504895049950509505195052950539505495055950569505795058950599506095061950629506395064950659506695067950689506995070950719507295073950749507595076950779507895079950809508195082950839508495085950869508795088950899509095091950929509395094950959509695097950989509995100951019510295103951049510595106951079510895109951109511195112951139511495115951169511795118951199512095121951229512395124951259512695127951289512995130951319513295133951349513595136951379513895139951409514195142951439514495145951469514795148951499515095151951529515395154951559515695157951589515995160951619516295163951649516595166951679516895169951709517195172951739517495175951769517795178951799518095181951829518395184951859518695187951889518995190951919519295193951949519595196951979519895199952009520195202952039520495205952069520795208952099521095211952129521395214952159521695217952189521995220952219522295223952249522595226952279522895229952309523195232952339523495235952369523795238952399524095241952429524395244952459524695247952489524995250952519525295253952549525595256952579525895259952609526195262952639526495265952669526795268952699527095271952729527395274952759527695277952789527995280952819528295283952849528595286952879528895289952909529195292952939529495295952969529795298952999530095301953029530395304953059530695307953089530995310953119531295313953149531595316953179531895319953209532195322953239532495325953269532795328953299533095331953329533395334953359533695337953389533995340953419534295343953449534595346953479534895349953509535195352953539535495355953569535795358953599536095361953629536395364953659536695367953689536995370953719537295373953749537595376953779537895379953809538195382953839538495385953869538795388953899539095391953929539395394953959539695397953989539995400954019540295403954049540595406954079540895409954109541195412954139541495415954169541795418954199542095421954229542395424954259542695427954289542995430954319543295433954349543595436954379543895439954409544195442954439544495445954469544795448954499545095451954529545395454954559545695457954589545995460954619546295463954649546595466954679546895469954709547195472954739547495475954769547795478954799548095481954829548395484954859548695487954889548995490954919549295493954949549595496954979549895499955009550195502955039550495505955069550795508955099551095511955129551395514955159551695517955189551995520955219552295523955249552595526955279552895529955309553195532955339553495535955369553795538955399554095541955429554395544955459554695547955489554995550955519555295553955549555595556955579555895559955609556195562955639556495565955669556795568955699557095571955729557395574955759557695577955789557995580955819558295583955849558595586955879558895589955909559195592955939559495595955969559795598955999560095601956029560395604956059560695607956089560995610956119561295613956149561595616956179561895619956209562195622956239562495625956269562795628956299563095631956329563395634956359563695637956389563995640956419564295643956449564595646956479564895649956509565195652956539565495655956569565795658956599566095661956629566395664956659566695667956689566995670956719567295673956749567595676956779567895679956809568195682956839568495685956869568795688956899569095691956929569395694956959569695697956989569995700957019570295703957049570595706957079570895709957109571195712957139571495715957169571795718957199572095721957229572395724957259572695727957289572995730957319573295733957349573595736957379573895739957409574195742957439574495745957469574795748957499575095751957529575395754957559575695757957589575995760957619576295763957649576595766957679576895769957709577195772957739577495775957769577795778957799578095781957829578395784957859578695787957889578995790957919579295793957949579595796957979579895799958009580195802958039580495805958069580795808958099581095811958129581395814958159581695817958189581995820958219582295823958249582595826958279582895829958309583195832958339583495835958369583795838958399584095841958429584395844958459584695847958489584995850958519585295853958549585595856958579585895859958609586195862958639586495865958669586795868958699587095871958729587395874958759587695877958789587995880958819588295883958849588595886958879588895889958909589195892958939589495895958969589795898958999590095901959029590395904959059590695907959089590995910959119591295913959149591595916959179591895919959209592195922959239592495925959269592795928959299593095931959329593395934959359593695937959389593995940959419594295943959449594595946959479594895949959509595195952959539595495955959569595795958959599596095961959629596395964959659596695967959689596995970959719597295973959749597595976959779597895979959809598195982959839598495985959869598795988959899599095991959929599395994959959599695997959989599996000960019600296003960049600596006960079600896009960109601196012960139601496015960169601796018960199602096021960229602396024960259602696027960289602996030960319603296033960349603596036960379603896039960409604196042960439604496045960469604796048960499605096051960529605396054960559605696057960589605996060960619606296063960649606596066960679606896069960709607196072960739607496075960769607796078960799608096081960829608396084960859608696087960889608996090960919609296093960949609596096960979609896099961009610196102961039610496105961069610796108961099611096111961129611396114961159611696117961189611996120961219612296123961249612596126961279612896129961309613196132961339613496135961369613796138961399614096141961429614396144961459614696147961489614996150961519615296153961549615596156961579615896159961609616196162961639616496165961669616796168961699617096171961729617396174961759617696177961789617996180961819618296183961849618596186961879618896189961909619196192961939619496195961969619796198961999620096201962029620396204962059620696207962089620996210962119621296213962149621596216962179621896219962209622196222962239622496225962269622796228962299623096231962329623396234962359623696237962389623996240962419624296243962449624596246962479624896249962509625196252962539625496255962569625796258962599626096261962629626396264962659626696267962689626996270962719627296273962749627596276962779627896279962809628196282962839628496285962869628796288962899629096291962929629396294962959629696297962989629996300963019630296303963049630596306963079630896309963109631196312963139631496315963169631796318963199632096321963229632396324963259632696327963289632996330963319633296333963349633596336963379633896339963409634196342963439634496345963469634796348963499635096351963529635396354963559635696357963589635996360963619636296363963649636596366963679636896369963709637196372963739637496375963769637796378963799638096381963829638396384963859638696387963889638996390963919639296393963949639596396963979639896399964009640196402964039640496405964069640796408964099641096411964129641396414964159641696417964189641996420964219642296423964249642596426964279642896429964309643196432964339643496435964369643796438964399644096441964429644396444964459644696447964489644996450964519645296453964549645596456964579645896459964609646196462964639646496465964669646796468964699647096471964729647396474964759647696477964789647996480964819648296483964849648596486964879648896489964909649196492964939649496495964969649796498964999650096501965029650396504965059650696507965089650996510965119651296513965149651596516965179651896519965209652196522965239652496525965269652796528965299653096531965329653396534965359653696537965389653996540965419654296543965449654596546965479654896549965509655196552965539655496555965569655796558965599656096561965629656396564965659656696567965689656996570965719657296573965749657596576965779657896579965809658196582965839658496585965869658796588965899659096591965929659396594965959659696597965989659996600966019660296603966049660596606966079660896609966109661196612966139661496615966169661796618966199662096621966229662396624966259662696627966289662996630966319663296633966349663596636966379663896639966409664196642966439664496645966469664796648966499665096651966529665396654966559665696657966589665996660966619666296663966649666596666966679666896669966709667196672966739667496675966769667796678966799668096681966829668396684966859668696687966889668996690966919669296693966949669596696966979669896699967009670196702967039670496705967069670796708967099671096711967129671396714967159671696717967189671996720967219672296723967249672596726967279672896729967309673196732967339673496735967369673796738967399674096741967429674396744967459674696747967489674996750967519675296753967549675596756967579675896759967609676196762967639676496765967669676796768967699677096771967729677396774967759677696777967789677996780967819678296783967849678596786967879678896789967909679196792967939679496795967969679796798967999680096801968029680396804968059680696807968089680996810968119681296813968149681596816968179681896819968209682196822968239682496825968269682796828968299683096831968329683396834968359683696837968389683996840968419684296843968449684596846968479684896849968509685196852968539685496855968569685796858968599686096861968629686396864968659686696867968689686996870968719687296873968749687596876968779687896879968809688196882968839688496885968869688796888968899689096891968929689396894968959689696897968989689996900969019690296903969049690596906969079690896909969109691196912969139691496915969169691796918969199692096921969229692396924969259692696927969289692996930969319693296933969349693596936969379693896939969409694196942969439694496945969469694796948969499695096951969529695396954969559695696957969589695996960969619696296963969649696596966969679696896969969709697196972969739697496975969769697796978969799698096981969829698396984969859698696987969889698996990969919699296993969949699596996969979699896999970009700197002970039700497005970069700797008970099701097011970129701397014970159701697017970189701997020970219702297023970249702597026970279702897029970309703197032970339703497035970369703797038970399704097041970429704397044970459704697047970489704997050970519705297053970549705597056970579705897059970609706197062970639706497065970669706797068970699707097071970729707397074970759707697077970789707997080970819708297083970849708597086970879708897089970909709197092970939709497095970969709797098970999710097101971029710397104971059710697107971089710997110971119711297113971149711597116971179711897119971209712197122971239712497125971269712797128971299713097131971329713397134971359713697137971389713997140971419714297143971449714597146971479714897149971509715197152971539715497155971569715797158971599716097161971629716397164971659716697167971689716997170971719717297173971749717597176971779717897179971809718197182971839718497185971869718797188971899719097191971929719397194971959719697197971989719997200972019720297203972049720597206972079720897209972109721197212972139721497215972169721797218972199722097221972229722397224972259722697227972289722997230972319723297233972349723597236972379723897239972409724197242972439724497245972469724797248972499725097251972529725397254972559725697257972589725997260972619726297263972649726597266972679726897269972709727197272972739727497275972769727797278972799728097281972829728397284972859728697287972889728997290972919729297293972949729597296972979729897299973009730197302973039730497305973069730797308973099731097311973129731397314973159731697317973189731997320973219732297323973249732597326973279732897329973309733197332973339733497335973369733797338973399734097341973429734397344973459734697347973489734997350973519735297353973549735597356973579735897359973609736197362973639736497365973669736797368973699737097371973729737397374973759737697377973789737997380973819738297383973849738597386973879738897389973909739197392973939739497395973969739797398973999740097401974029740397404974059740697407974089740997410974119741297413974149741597416974179741897419974209742197422974239742497425974269742797428974299743097431974329743397434974359743697437974389743997440974419744297443974449744597446974479744897449974509745197452974539745497455974569745797458974599746097461974629746397464974659746697467974689746997470974719747297473974749747597476974779747897479974809748197482974839748497485974869748797488974899749097491974929749397494974959749697497974989749997500975019750297503975049750597506975079750897509975109751197512975139751497515975169751797518975199752097521975229752397524975259752697527975289752997530975319753297533975349753597536975379753897539975409754197542975439754497545975469754797548975499755097551975529755397554975559755697557975589755997560975619756297563975649756597566975679756897569975709757197572975739757497575975769757797578975799758097581975829758397584975859758697587975889758997590975919759297593975949759597596975979759897599976009760197602976039760497605976069760797608976099761097611976129761397614976159761697617976189761997620976219762297623976249762597626976279762897629976309763197632976339763497635976369763797638976399764097641976429764397644976459764697647976489764997650976519765297653976549765597656976579765897659976609766197662976639766497665976669766797668976699767097671976729767397674976759767697677976789767997680976819768297683976849768597686976879768897689976909769197692976939769497695976969769797698976999770097701977029770397704977059770697707977089770997710977119771297713977149771597716977179771897719977209772197722977239772497725977269772797728977299773097731977329773397734977359773697737977389773997740977419774297743977449774597746977479774897749977509775197752977539775497755977569775797758977599776097761977629776397764977659776697767977689776997770977719777297773977749777597776977779777897779977809778197782977839778497785977869778797788977899779097791977929779397794977959779697797977989779997800978019780297803978049780597806978079780897809978109781197812978139781497815978169781797818978199782097821978229782397824978259782697827978289782997830978319783297833978349783597836978379783897839978409784197842978439784497845978469784797848978499785097851978529785397854978559785697857978589785997860978619786297863978649786597866978679786897869978709787197872978739787497875978769787797878978799788097881978829788397884978859788697887978889788997890978919789297893978949789597896978979789897899979009790197902979039790497905979069790797908979099791097911979129791397914979159791697917979189791997920979219792297923979249792597926979279792897929979309793197932979339793497935979369793797938979399794097941979429794397944979459794697947979489794997950979519795297953979549795597956979579795897959979609796197962979639796497965979669796797968979699797097971979729797397974979759797697977979789797997980979819798297983979849798597986979879798897989979909799197992979939799497995979969799797998979999800098001980029800398004980059800698007980089800998010980119801298013980149801598016980179801898019980209802198022980239802498025980269802798028980299803098031980329803398034980359803698037980389803998040980419804298043980449804598046980479804898049980509805198052980539805498055980569805798058980599806098061980629806398064980659806698067980689806998070980719807298073980749807598076980779807898079980809808198082980839808498085980869808798088980899809098091980929809398094980959809698097980989809998100981019810298103981049810598106981079810898109981109811198112981139811498115981169811798118981199812098121981229812398124981259812698127981289812998130981319813298133981349813598136981379813898139981409814198142981439814498145981469814798148981499815098151981529815398154981559815698157981589815998160981619816298163981649816598166981679816898169981709817198172981739817498175981769817798178981799818098181981829818398184981859818698187981889818998190981919819298193981949819598196981979819898199982009820198202982039820498205982069820798208982099821098211982129821398214982159821698217982189821998220982219822298223982249822598226982279822898229982309823198232982339823498235982369823798238982399824098241982429824398244982459824698247982489824998250982519825298253982549825598256982579825898259982609826198262982639826498265982669826798268982699827098271982729827398274982759827698277982789827998280982819828298283982849828598286982879828898289982909829198292982939829498295982969829798298982999830098301983029830398304983059830698307983089830998310983119831298313983149831598316983179831898319983209832198322983239832498325983269832798328983299833098331983329833398334983359833698337983389833998340983419834298343983449834598346983479834898349983509835198352983539835498355983569835798358983599836098361983629836398364983659836698367983689836998370983719837298373983749837598376983779837898379983809838198382983839838498385983869838798388983899839098391983929839398394983959839698397983989839998400984019840298403984049840598406984079840898409984109841198412984139841498415984169841798418984199842098421984229842398424984259842698427984289842998430984319843298433984349843598436984379843898439984409844198442984439844498445984469844798448984499845098451984529845398454984559845698457984589845998460984619846298463984649846598466984679846898469984709847198472984739847498475984769847798478984799848098481984829848398484984859848698487984889848998490984919849298493984949849598496984979849898499985009850198502985039850498505985069850798508985099851098511985129851398514985159851698517985189851998520985219852298523985249852598526985279852898529985309853198532985339853498535985369853798538985399854098541985429854398544985459854698547985489854998550985519855298553985549855598556985579855898559985609856198562985639856498565985669856798568985699857098571985729857398574985759857698577985789857998580985819858298583985849858598586985879858898589985909859198592985939859498595985969859798598985999860098601986029860398604986059860698607986089860998610986119861298613986149861598616986179861898619986209862198622986239862498625986269862798628986299863098631986329863398634986359863698637986389863998640986419864298643986449864598646986479864898649986509865198652986539865498655986569865798658986599866098661986629866398664986659866698667986689866998670986719867298673986749867598676986779867898679986809868198682986839868498685986869868798688986899869098691986929869398694986959869698697986989869998700987019870298703987049870598706987079870898709987109871198712987139871498715987169871798718987199872098721987229872398724987259872698727987289872998730987319873298733987349873598736987379873898739987409874198742987439874498745987469874798748987499875098751987529875398754987559875698757987589875998760987619876298763987649876598766987679876898769987709877198772987739877498775987769877798778987799878098781987829878398784987859878698787987889878998790987919879298793987949879598796987979879898799988009880198802988039880498805988069880798808988099881098811988129881398814988159881698817988189881998820988219882298823988249882598826988279882898829988309883198832988339883498835988369883798838988399884098841988429884398844988459884698847988489884998850988519885298853988549885598856988579885898859988609886198862988639886498865988669886798868988699887098871988729887398874988759887698877988789887998880988819888298883988849888598886988879888898889988909889198892988939889498895988969889798898988999890098901989029890398904989059890698907989089890998910989119891298913989149891598916989179891898919989209892198922989239892498925989269892798928989299893098931989329893398934989359893698937989389893998940989419894298943989449894598946989479894898949989509895198952989539895498955989569895798958989599896098961989629896398964989659896698967989689896998970989719897298973989749897598976989779897898979989809898198982989839898498985989869898798988989899899098991989929899398994989959899698997989989899999000990019900299003990049900599006990079900899009990109901199012990139901499015990169901799018990199902099021990229902399024990259902699027990289902999030990319903299033990349903599036990379903899039990409904199042990439904499045990469904799048990499905099051990529905399054990559905699057990589905999060990619906299063990649906599066990679906899069990709907199072990739907499075990769907799078990799908099081990829908399084990859908699087990889908999090990919909299093990949909599096990979909899099991009910199102991039910499105991069910799108991099911099111991129911399114991159911699117991189911999120991219912299123991249912599126991279912899129991309913199132991339913499135991369913799138991399914099141991429914399144991459914699147991489914999150991519915299153991549915599156991579915899159991609916199162991639916499165991669916799168991699917099171991729917399174991759917699177991789917999180991819918299183991849918599186991879918899189991909919199192991939919499195991969919799198991999920099201992029920399204992059920699207992089920999210992119921299213992149921599216992179921899219992209922199222992239922499225992269922799228992299923099231992329923399234992359923699237992389923999240992419924299243992449924599246992479924899249992509925199252992539925499255992569925799258992599926099261992629926399264992659926699267992689926999270992719927299273992749927599276992779927899279992809928199282992839928499285992869928799288992899929099291992929929399294992959929699297992989929999300993019930299303993049930599306993079930899309993109931199312993139931499315993169931799318993199932099321993229932399324993259932699327993289932999330993319933299333993349933599336993379933899339993409934199342993439934499345993469934799348993499935099351993529935399354993559935699357993589935999360993619936299363993649936599366993679936899369993709937199372993739937499375993769937799378993799938099381993829938399384993859938699387993889938999390993919939299393993949939599396993979939899399994009940199402994039940499405994069940799408994099941099411994129941399414994159941699417994189941999420994219942299423994249942599426994279942899429994309943199432994339943499435994369943799438994399944099441994429944399444994459944699447994489944999450994519945299453994549945599456994579945899459994609946199462994639946499465994669946799468994699947099471994729947399474994759947699477994789947999480994819948299483994849948599486994879948899489994909949199492994939949499495994969949799498994999950099501995029950399504995059950699507995089950999510995119951299513995149951599516995179951899519995209952199522995239952499525995269952799528995299953099531995329953399534995359953699537995389953999540995419954299543995449954599546995479954899549995509955199552995539955499555995569955799558995599956099561995629956399564995659956699567995689956999570995719957299573995749957599576995779957899579995809958199582995839958499585995869958799588995899959099591995929959399594995959959699597995989959999600996019960299603996049960599606996079960899609996109961199612996139961499615996169961799618996199962099621996229962399624996259962699627996289962999630996319963299633996349963599636996379963899639996409964199642996439964499645996469964799648996499965099651996529965399654996559965699657996589965999660996619966299663996649966599666996679966899669996709967199672996739967499675996769967799678996799968099681996829968399684996859968699687996889968999690996919969299693996949969599696996979969899699997009970199702997039970499705997069970799708997099971099711997129971399714997159971699717997189971999720997219972299723997249972599726997279972899729997309973199732997339973499735997369973799738997399974099741997429974399744997459974699747997489974999750997519975299753997549975599756997579975899759997609976199762997639976499765997669976799768997699977099771997729977399774997759977699777997789977999780997819978299783997849978599786997879978899789997909979199792997939979499795997969979799798997999980099801998029980399804998059980699807998089980999810998119981299813998149981599816998179981899819998209982199822998239982499825998269982799828998299983099831998329983399834998359983699837998389983999840998419984299843998449984599846998479984899849998509985199852998539985499855998569985799858998599986099861998629986399864998659986699867998689986999870998719987299873998749987599876998779987899879998809988199882998839988499885998869988799888998899989099891998929989399894998959989699897998989989999900999019990299903999049990599906999079990899909999109991199912999139991499915999169991799918999199992099921999229992399924999259992699927999289992999930999319993299933999349993599936999379993899939999409994199942999439994499945999469994799948999499995099951999529995399954999559995699957999589995999960999619996299963999649996599966999679996899969999709997199972999739997499975999769997799978999799998099981999829998399984999859998699987999889998999990999919999299993999949999599996999979999899999100000100001100002100003100004100005100006100007100008100009100010100011100012100013100014100015100016100017100018100019100020100021100022100023100024100025100026100027100028100029100030100031100032100033100034100035100036100037100038100039100040100041100042100043100044100045100046100047100048100049100050100051100052100053100054100055100056100057100058100059100060100061100062100063100064100065100066100067100068100069100070100071100072100073100074100075100076100077100078100079100080100081100082100083100084100085100086100087100088100089100090100091100092100093100094100095100096100097100098100099100100100101100102100103100104100105100106100107100108100109100110100111100112100113100114100115100116100117100118100119100120100121100122100123100124100125100126100127100128100129100130100131100132100133100134100135100136100137100138100139100140100141100142100143100144100145100146100147100148100149100150100151100152100153100154100155100156100157100158100159100160100161100162100163100164100165100166100167100168100169100170100171100172100173100174100175100176100177100178100179100180100181100182100183100184100185100186100187100188100189100190100191100192100193100194100195100196100197100198100199100200100201100202100203100204100205100206100207100208100209100210100211100212100213100214100215100216100217100218100219100220100221100222100223100224100225100226100227100228100229100230100231100232100233100234100235100236100237100238100239100240100241100242100243100244100245100246100247100248100249100250100251100252100253100254100255100256100257100258100259100260100261100262100263100264100265100266100267100268100269100270100271100272100273100274100275100276100277100278100279100280100281100282100283100284100285100286100287100288100289100290100291100292100293100294100295100296100297100298100299100300100301100302100303100304100305100306100307100308100309100310100311100312100313100314100315100316100317100318100319100320100321100322100323100324100325100326100327100328100329100330100331100332100333100334100335100336100337100338100339100340100341100342100343100344100345100346100347100348100349100350100351100352100353100354100355100356100357100358100359100360100361100362100363100364100365100366100367100368100369100370100371100372100373100374100375100376100377100378100379100380100381100382100383100384100385100386100387100388100389100390100391100392100393100394100395100396100397100398100399100400100401100402100403100404100405100406100407100408100409100410100411100412100413100414100415100416100417100418100419100420100421100422100423100424100425100426100427100428100429100430100431100432100433100434100435100436100437100438100439100440100441100442100443100444100445100446100447100448100449100450100451100452100453100454100455100456100457100458100459100460100461100462100463100464100465100466100467100468100469100470100471100472100473100474100475100476100477100478100479100480100481100482100483100484100485100486100487100488100489100490100491100492100493100494100495100496100497100498100499100500100501100502100503100504100505100506100507100508100509100510100511100512100513100514100515100516100517100518100519100520100521100522100523100524100525100526100527100528100529100530100531100532100533100534100535100536100537100538100539100540100541100542100543100544100545100546100547100548100549100550100551100552100553100554100555100556100557100558100559100560100561100562100563100564100565100566100567100568100569100570100571100572100573100574100575100576100577100578100579100580100581100582100583100584100585100586100587100588100589100590100591100592100593100594100595100596100597100598100599100600100601100602100603100604100605100606100607100608100609100610100611100612100613100614100615100616100617100618100619100620100621100622100623100624100625100626100627100628100629100630100631100632100633100634100635100636100637100638100639100640100641100642100643100644100645100646100647100648100649100650100651100652100653100654100655100656100657100658100659100660100661100662100663100664100665100666100667100668100669100670100671100672100673100674100675100676100677100678100679100680100681100682100683100684100685100686100687100688100689100690100691100692100693100694100695100696100697100698100699100700100701100702100703100704100705100706100707100708100709100710100711100712100713100714100715100716100717100718100719100720100721100722100723100724100725100726100727100728100729100730100731100732100733100734100735100736100737100738100739100740100741100742100743100744100745100746100747100748100749100750100751100752100753100754100755100756100757100758100759100760100761100762100763100764100765100766100767100768100769100770100771100772100773100774100775100776100777100778100779100780100781100782100783100784100785100786100787100788100789100790100791100792100793100794100795100796100797100798100799100800100801100802100803100804100805100806100807100808100809100810100811100812100813100814100815100816100817100818100819100820100821100822100823100824100825100826100827100828100829100830100831100832100833100834100835100836100837100838100839100840100841100842100843100844100845100846100847100848100849100850100851100852100853100854100855100856100857100858100859100860100861100862100863100864100865100866100867100868100869100870100871100872100873100874100875100876100877100878100879100880100881100882100883100884100885100886100887100888100889100890100891100892100893100894100895100896100897100898100899100900100901100902100903100904100905100906100907100908100909100910100911100912100913100914100915100916100917100918100919100920100921100922100923100924100925100926100927100928100929100930100931100932100933100934100935100936100937100938100939100940100941100942100943100944100945100946100947100948100949100950100951100952100953100954100955100956100957100958100959100960100961100962100963100964100965100966100967100968100969100970100971100972100973100974100975100976100977100978100979100980100981100982100983100984100985100986100987100988100989100990100991100992100993100994100995100996100997100998100999101000101001101002101003101004101005101006101007101008101009101010101011101012101013101014101015101016101017101018101019101020101021101022101023101024101025101026101027101028101029101030101031101032101033101034101035101036101037101038101039101040101041101042101043101044101045101046101047101048101049101050101051101052101053101054101055101056101057101058101059101060101061101062101063101064101065101066101067101068101069101070101071101072101073101074101075101076101077101078101079101080101081101082101083101084101085101086101087101088101089101090101091101092101093101094101095101096101097101098101099101100101101101102101103101104101105101106101107101108101109101110101111101112101113101114101115101116101117101118101119101120101121101122101123101124101125101126101127101128101129101130101131101132101133101134101135101136101137101138101139101140101141101142101143101144101145101146101147101148101149101150101151101152101153101154101155101156101157101158101159101160101161101162101163101164101165101166101167101168101169101170101171101172101173101174101175101176101177101178101179101180101181101182101183101184101185101186101187101188101189101190101191101192101193101194101195101196101197101198101199101200101201101202101203101204101205101206101207101208101209101210101211101212101213101214101215101216101217101218101219101220101221101222101223101224101225101226101227101228101229101230101231101232101233101234101235101236101237101238101239101240101241101242101243101244101245101246101247101248101249101250101251101252101253101254101255101256101257101258101259101260101261101262101263101264101265101266101267101268101269101270101271101272101273101274101275101276101277101278101279101280101281101282101283101284101285101286101287101288101289101290101291101292101293101294101295101296101297101298101299101300101301101302101303101304101305101306101307101308101309101310101311101312101313101314101315101316101317101318101319101320101321101322101323101324101325101326101327101328101329101330101331101332101333101334101335101336101337101338101339101340101341101342101343101344101345101346101347101348101349101350101351101352101353101354101355101356101357101358101359101360101361101362101363101364101365101366101367101368101369101370101371101372101373101374101375101376101377101378101379101380101381101382101383101384101385101386101387101388101389101390101391101392101393101394101395101396101397101398101399101400101401101402101403101404101405101406101407101408101409101410101411101412101413101414101415101416101417101418101419101420101421101422101423101424101425101426101427101428101429101430101431101432101433101434101435101436101437101438101439101440101441101442101443101444101445101446101447101448101449101450101451101452101453101454101455101456101457101458101459101460101461101462101463101464101465101466101467101468101469101470101471101472101473101474101475101476101477101478101479101480101481101482101483101484101485101486101487101488101489101490101491101492101493101494101495101496101497101498101499101500101501101502101503101504101505101506101507101508101509101510101511101512101513101514101515101516101517101518101519101520101521101522101523101524101525101526101527101528101529101530101531101532101533101534101535101536101537101538101539101540101541101542101543101544101545101546101547101548101549101550101551101552101553101554101555101556101557101558101559101560101561101562101563101564101565101566101567101568101569101570101571101572101573101574101575101576101577101578101579101580101581101582101583101584101585101586101587101588101589101590101591101592101593101594101595101596101597101598101599101600101601101602101603101604101605101606101607101608101609101610101611101612101613101614101615101616101617101618101619101620101621101622101623101624101625101626101627101628101629101630101631101632101633101634101635101636101637101638101639101640101641101642101643101644101645101646101647101648101649101650101651101652101653101654101655101656101657101658101659101660101661101662101663101664101665101666101667101668101669101670101671101672101673101674101675101676101677101678101679101680101681101682101683101684101685101686101687101688101689101690101691101692101693101694101695101696101697101698101699101700101701101702101703101704101705101706101707101708101709101710101711101712101713101714101715101716101717101718101719101720101721101722101723101724101725101726101727101728101729101730101731101732101733101734101735101736101737101738101739101740101741101742101743101744101745101746101747101748101749101750101751101752101753101754101755101756101757101758101759101760101761101762101763101764101765101766101767101768101769101770101771101772101773101774101775101776101777101778101779101780101781101782101783101784101785101786101787101788101789101790101791101792101793101794101795101796101797101798101799101800101801101802101803101804101805101806101807101808101809101810101811101812101813101814101815101816101817101818101819101820101821101822101823101824101825101826101827101828101829101830101831101832101833101834101835101836101837101838101839101840101841101842101843101844101845101846101847101848101849101850101851101852101853101854101855101856101857101858101859101860101861101862101863101864101865101866101867101868101869101870101871101872101873101874101875101876101877101878101879101880101881101882101883101884101885101886101887101888101889101890101891101892101893101894101895101896101897101898101899101900101901101902101903101904101905101906101907101908101909101910101911101912101913101914101915101916101917101918101919101920101921101922101923101924101925101926101927101928101929101930101931101932101933101934101935101936101937101938101939101940101941101942101943101944101945101946101947101948101949101950101951101952101953101954101955101956101957101958101959101960101961101962101963101964101965101966101967101968101969101970101971101972101973101974101975101976101977101978101979101980101981101982101983101984101985101986101987101988101989101990101991101992101993101994101995101996101997101998101999102000102001102002102003102004102005102006102007102008102009102010102011102012102013102014102015102016102017102018102019102020102021102022102023102024102025102026102027102028102029102030102031102032102033102034102035102036102037102038102039102040102041102042102043102044102045102046102047102048102049102050102051102052102053102054102055102056102057102058102059102060102061102062102063102064102065102066102067102068102069102070102071102072102073102074102075102076102077102078102079102080102081102082102083102084102085102086102087102088102089102090102091102092102093102094102095102096102097102098102099102100102101102102102103102104102105102106102107102108102109102110102111102112102113102114102115102116102117102118102119102120102121102122102123102124102125102126102127102128102129102130102131102132102133102134102135102136102137102138102139102140102141102142102143102144102145102146102147102148102149102150102151102152102153102154102155102156102157102158102159102160102161102162102163102164102165102166102167102168102169102170102171102172102173102174102175102176102177102178102179102180102181102182102183102184102185102186102187102188102189102190102191102192102193102194102195102196102197102198102199102200102201102202102203102204102205102206102207102208102209102210102211102212102213102214102215102216102217102218102219102220102221102222102223102224102225102226102227102228102229102230102231102232102233102234102235102236102237102238102239102240102241102242102243102244102245102246102247102248102249102250102251102252102253102254102255102256102257102258102259102260102261102262102263102264102265102266102267102268102269102270102271102272102273102274102275102276102277102278102279102280102281102282102283102284102285102286102287102288102289102290102291102292102293102294102295102296102297102298102299102300102301102302102303102304102305102306102307102308102309102310102311102312102313102314102315102316102317102318102319102320102321102322102323102324102325102326102327102328102329102330102331102332102333102334102335102336102337102338102339102340102341102342102343102344102345102346102347102348102349102350102351102352102353102354102355102356102357102358102359102360102361102362102363102364102365102366102367102368102369102370102371102372102373102374102375102376102377102378102379102380102381102382102383102384102385102386102387102388102389102390102391102392102393102394102395102396102397102398102399102400102401102402102403102404102405102406102407102408102409102410102411102412102413102414102415102416102417102418102419102420102421102422102423102424102425102426102427102428102429102430102431102432102433102434102435102436102437102438102439102440102441102442102443102444102445102446102447102448102449102450102451102452102453102454102455102456102457102458102459102460102461102462102463102464102465102466102467102468102469102470102471102472102473102474102475102476102477102478102479102480102481102482102483102484102485102486102487102488102489102490102491102492102493102494102495102496102497102498102499102500102501102502102503102504102505102506102507102508102509102510102511102512102513102514102515102516102517102518102519102520102521102522102523102524102525102526102527102528102529102530102531102532102533102534102535102536102537102538102539102540102541102542102543102544102545102546102547102548102549102550102551102552102553102554102555102556102557102558102559102560102561102562102563102564102565102566102567102568102569102570102571102572102573102574102575102576102577102578102579102580102581102582102583102584102585102586102587102588102589102590102591102592102593102594102595102596102597102598102599102600102601102602102603102604102605102606102607102608102609102610102611102612102613102614102615102616102617102618102619102620102621102622102623102624102625102626102627102628102629102630102631102632102633102634102635102636102637102638102639102640102641102642102643102644102645102646102647102648102649102650102651102652102653102654102655102656102657102658102659102660102661102662102663102664102665102666102667102668102669102670102671102672102673102674102675102676102677102678102679102680102681102682102683102684102685102686102687102688102689102690102691102692102693102694102695102696102697102698102699102700102701102702102703102704102705102706102707102708102709102710102711102712102713102714102715102716102717102718102719102720102721102722102723102724102725102726102727102728102729102730102731102732102733102734102735102736102737102738102739102740102741102742102743102744102745102746102747102748102749102750102751102752102753102754102755102756102757102758102759102760102761102762102763102764102765102766102767102768102769102770102771102772102773102774102775102776102777102778102779102780102781102782102783102784102785102786102787102788102789102790102791102792102793102794102795102796102797102798102799102800102801102802102803102804102805102806102807102808102809102810102811102812102813102814102815102816102817102818102819102820102821102822102823102824102825102826102827102828102829102830102831102832102833102834102835102836102837102838102839102840102841102842102843102844102845102846102847102848102849102850102851102852102853102854102855102856102857102858102859102860102861102862102863102864102865102866102867102868102869102870102871102872102873102874102875102876102877102878102879102880102881102882102883102884102885102886102887102888102889102890102891102892102893102894102895102896102897102898102899102900102901102902102903102904102905102906102907102908102909102910102911102912102913102914102915102916102917102918102919102920102921102922102923102924102925102926102927102928102929102930102931102932102933102934102935102936102937102938102939102940102941102942102943102944102945102946102947102948102949102950102951102952102953102954102955102956102957102958102959102960102961102962102963102964102965102966102967102968102969102970102971102972102973102974102975102976102977102978102979102980102981102982102983102984102985102986102987102988102989102990102991102992102993102994102995102996102997102998102999103000103001103002103003103004103005103006103007103008103009103010103011103012103013103014103015103016103017103018103019103020103021103022103023103024103025103026103027103028103029103030103031103032103033103034103035103036103037103038103039103040103041103042103043103044103045103046103047103048103049103050103051103052103053103054103055103056103057103058103059103060103061103062103063103064103065103066103067103068103069103070103071103072103073103074103075103076103077103078103079103080103081103082103083103084103085103086103087103088103089103090103091103092103093103094103095103096103097103098103099103100103101103102103103103104103105103106103107103108103109103110103111103112103113103114103115103116103117103118103119103120103121103122103123103124103125103126103127103128103129103130103131103132103133103134103135103136103137103138103139103140103141103142103143103144103145103146103147103148103149103150103151103152103153103154103155103156103157103158103159103160103161103162103163103164103165103166103167103168103169103170103171103172103173103174103175103176103177103178103179103180103181103182103183103184103185103186103187103188103189103190103191103192103193103194103195103196103197103198103199103200103201103202103203103204103205103206103207103208103209103210103211103212103213103214103215103216103217103218103219103220103221103222103223103224103225103226103227103228103229103230103231103232103233103234103235103236103237103238103239103240103241103242103243103244103245103246103247103248103249103250103251103252103253103254103255103256103257103258103259103260103261103262103263103264103265103266103267103268103269103270103271103272103273103274103275103276103277103278103279103280103281103282103283103284103285103286103287103288103289103290103291103292103293103294103295103296103297103298103299103300103301103302103303103304103305103306103307103308103309103310103311103312103313103314103315103316103317103318103319103320103321103322103323103324103325103326103327103328103329103330103331103332103333103334103335103336103337103338103339103340103341103342103343103344103345103346103347103348103349103350103351103352103353103354103355103356103357103358103359103360103361103362103363103364103365103366103367103368103369103370103371103372103373103374103375103376103377103378103379103380103381103382103383103384103385103386103387103388103389103390103391103392103393103394103395103396103397103398103399103400103401103402103403103404103405103406103407103408103409103410103411103412103413103414103415103416103417103418103419103420103421103422103423103424103425103426103427103428103429103430103431103432103433103434103435103436103437103438103439103440103441103442103443103444103445103446103447103448103449103450103451103452103453103454103455103456103457103458103459103460103461103462103463103464103465103466103467103468103469103470103471103472103473103474103475103476103477103478103479103480103481103482103483103484103485103486103487103488103489103490103491103492103493103494103495103496103497103498103499103500103501103502103503103504103505103506103507103508103509103510103511103512103513103514103515103516103517103518103519103520103521103522103523103524103525103526103527103528103529103530103531103532103533103534103535103536103537103538103539103540103541103542103543103544103545103546103547103548103549103550103551103552103553103554103555103556103557103558103559103560103561103562103563103564103565103566103567103568103569103570103571103572103573103574103575103576103577103578103579103580103581103582103583103584103585103586103587103588103589103590103591103592103593103594103595103596103597103598103599103600103601103602103603103604103605103606103607103608103609103610103611103612103613103614103615103616103617103618103619103620103621103622103623103624103625103626103627103628103629103630103631103632103633103634103635103636103637103638103639103640103641103642103643103644103645103646103647103648103649103650103651103652103653103654103655103656103657103658103659103660103661103662103663103664103665103666103667103668103669103670103671103672103673103674103675103676103677103678103679103680103681103682103683103684103685103686103687103688103689103690103691103692103693103694103695103696103697103698103699103700103701103702103703103704103705103706103707103708103709103710103711103712103713103714103715103716103717103718103719103720103721103722103723103724103725103726103727103728103729103730103731103732103733103734103735103736103737103738103739103740103741103742103743103744103745103746103747103748103749103750103751103752103753103754103755103756103757103758103759103760103761103762103763103764103765103766103767103768103769103770103771103772103773103774103775103776103777103778103779103780103781103782103783103784103785103786103787103788103789103790103791103792103793103794103795103796103797103798103799103800103801103802103803103804103805103806103807103808103809103810103811103812103813103814103815103816103817103818103819103820103821103822103823103824103825103826103827103828103829103830103831103832103833103834103835103836103837103838103839103840103841103842103843103844103845103846103847103848103849103850103851103852103853103854103855103856103857103858103859103860103861103862103863103864103865103866103867103868103869103870103871103872103873103874103875103876103877103878103879103880103881103882103883103884103885103886103887103888103889103890103891103892103893103894103895103896103897103898103899103900103901103902103903103904103905103906103907103908103909103910103911103912103913103914103915103916103917103918103919103920103921103922103923103924103925103926103927103928103929103930103931103932103933103934103935103936103937103938103939103940103941103942103943103944103945103946103947103948103949103950103951103952103953103954103955103956103957103958103959103960103961103962103963103964103965103966103967103968103969103970103971103972103973103974103975103976103977103978103979103980103981103982103983103984103985103986103987103988103989103990103991103992103993103994103995103996103997103998103999104000104001104002104003104004104005104006104007104008104009104010104011104012104013104014104015104016104017104018104019104020104021104022104023104024104025104026104027104028104029104030104031104032104033104034104035104036104037104038104039104040104041104042104043104044104045104046104047104048104049104050104051104052104053104054104055104056104057104058104059104060104061104062104063104064104065104066104067104068104069104070104071104072104073104074104075104076104077104078104079104080104081104082104083104084104085104086104087104088104089104090104091104092104093104094104095104096104097104098104099104100104101104102104103104104104105104106104107104108104109104110104111104112104113104114104115104116104117104118104119104120104121104122104123104124104125104126104127104128104129104130104131104132104133104134104135104136104137104138104139104140104141104142104143104144104145104146104147104148104149104150104151104152104153104154104155104156104157104158104159104160104161104162104163104164104165104166104167104168104169104170104171104172104173104174104175104176104177104178104179104180104181104182104183104184104185104186104187104188104189104190104191104192104193104194104195104196104197104198104199104200104201104202104203104204104205104206104207104208104209104210104211104212104213104214104215104216104217104218104219104220104221104222104223104224104225104226104227104228104229104230104231104232104233104234104235104236104237104238104239104240104241104242104243104244104245104246104247104248104249104250104251104252104253104254104255104256104257104258104259104260104261104262104263104264104265104266104267104268104269104270104271104272104273104274104275104276104277104278104279104280104281104282104283104284104285104286104287104288104289104290104291104292104293104294104295104296104297104298104299104300104301104302104303104304104305104306104307104308104309104310104311104312104313104314104315104316104317104318104319104320104321104322104323104324104325104326104327104328104329104330104331104332104333104334104335104336104337104338104339104340104341104342104343104344104345104346104347104348104349104350104351104352104353104354104355104356104357104358104359104360104361104362104363104364104365104366104367104368104369104370104371104372104373104374104375104376104377104378104379104380104381104382104383104384104385104386104387104388104389104390104391104392104393104394104395104396104397104398104399104400104401104402104403104404104405104406104407104408104409104410104411104412104413104414104415104416104417104418104419104420104421104422104423104424104425104426104427104428104429104430104431104432104433104434104435104436104437104438104439104440104441104442104443104444104445104446104447104448104449104450104451104452104453104454104455104456104457104458104459104460104461104462104463104464104465104466104467104468104469104470104471104472104473104474104475104476104477104478104479104480104481104482104483104484104485104486104487104488104489104490104491104492104493104494104495104496104497104498104499104500104501104502104503104504104505104506104507104508104509104510104511104512104513104514104515104516104517104518104519104520104521104522104523104524104525104526104527104528104529104530104531104532104533104534104535104536104537104538104539104540104541104542104543104544104545104546104547104548104549104550104551104552104553104554104555104556104557104558104559104560104561104562104563104564104565104566104567104568104569104570104571104572104573104574104575104576104577104578104579104580104581104582104583104584104585104586104587104588104589104590104591104592104593104594104595104596104597104598104599104600104601104602104603104604104605104606104607104608104609104610104611104612104613104614104615104616104617104618104619104620104621104622104623104624104625104626104627104628104629104630104631104632104633104634104635104636104637104638104639104640104641104642104643104644104645104646104647104648104649104650104651104652104653104654104655104656104657104658104659104660104661104662104663104664104665104666104667104668104669104670104671104672104673104674104675104676104677104678104679104680104681104682104683104684104685104686104687104688104689104690104691104692104693104694104695104696104697104698104699104700104701104702104703104704104705104706104707104708104709104710104711104712104713104714104715104716104717104718104719104720104721104722104723104724104725104726104727104728104729104730104731104732104733104734104735104736104737104738104739104740104741104742104743104744104745104746104747104748104749104750104751104752104753104754104755104756104757104758104759104760104761104762104763104764104765104766104767104768104769104770104771104772104773104774104775104776104777104778104779104780104781104782104783104784104785104786104787104788104789104790104791104792104793104794104795104796104797104798104799104800104801104802104803104804104805104806104807104808104809104810104811104812104813104814104815104816104817104818104819104820104821104822104823104824104825104826104827104828104829104830104831104832104833104834104835104836104837104838104839104840104841104842104843104844104845104846104847104848104849104850104851104852104853104854104855104856104857104858104859104860104861104862104863104864104865104866104867104868104869104870104871104872104873104874104875104876104877104878104879104880104881104882104883104884104885104886104887104888104889104890104891104892104893104894104895104896104897104898104899104900104901104902104903104904104905104906104907104908104909104910104911104912104913104914104915104916104917104918104919104920104921104922104923104924104925104926104927104928104929104930104931104932104933104934104935104936104937104938104939104940104941104942104943104944104945104946104947104948104949104950104951104952104953104954104955104956104957104958104959104960104961104962104963104964104965104966104967104968104969104970104971104972104973104974104975104976104977104978104979104980104981104982104983104984104985104986104987104988104989104990104991104992104993104994104995104996104997104998104999105000105001105002105003105004105005105006105007105008105009105010105011105012105013105014105015105016105017105018105019105020105021105022105023105024105025105026105027105028105029105030105031105032105033105034105035105036105037105038105039105040105041105042105043105044105045105046105047105048105049105050105051105052105053105054105055105056105057105058105059105060105061105062105063105064105065105066105067105068105069105070105071105072105073105074105075105076105077105078105079105080105081105082105083105084105085105086105087105088105089105090105091105092105093105094105095105096105097105098105099105100105101105102105103105104105105105106105107105108105109105110105111105112105113105114105115105116105117105118105119105120105121105122105123105124105125105126105127105128105129105130105131105132105133105134105135105136105137105138105139105140105141105142105143105144105145105146105147105148105149105150105151105152105153105154105155105156105157105158105159105160105161105162105163105164105165105166105167105168105169105170105171105172105173105174105175105176105177105178105179105180105181105182105183105184105185105186105187105188105189105190105191105192105193105194105195105196105197105198105199105200105201105202105203105204105205105206105207105208105209105210105211105212105213105214105215105216105217105218105219105220105221105222105223105224105225105226105227105228105229105230105231105232105233105234105235105236105237105238105239105240105241105242105243105244105245105246105247105248105249105250105251105252105253105254105255105256105257105258105259105260105261105262105263105264105265105266105267105268105269105270105271105272105273105274105275105276105277105278105279105280105281105282105283105284105285105286105287105288105289105290105291105292105293105294105295105296105297105298105299105300105301105302105303105304105305105306105307105308105309105310105311105312105313105314105315105316105317105318105319105320105321105322105323105324105325105326105327105328105329105330105331105332105333105334105335105336105337105338105339105340105341105342105343105344105345105346105347105348105349105350105351105352105353105354105355105356105357105358105359105360105361105362105363105364105365105366105367105368105369105370105371105372105373105374105375105376105377105378105379105380105381105382105383105384105385105386105387105388105389105390105391105392105393105394105395105396105397105398105399105400105401105402105403105404105405105406105407105408105409105410105411105412105413105414105415105416105417105418105419105420105421105422105423105424105425105426105427105428105429105430105431105432105433105434105435105436105437105438105439105440105441105442105443105444105445105446105447105448105449105450105451105452105453105454105455105456105457105458105459105460105461105462105463105464105465105466105467105468105469105470105471105472105473105474105475105476105477105478105479105480105481105482105483105484105485105486105487105488105489105490105491105492105493105494105495105496105497105498105499105500105501105502105503105504105505105506105507105508105509105510105511105512105513105514105515105516105517105518105519105520105521105522105523105524105525105526105527105528105529105530105531105532105533105534105535105536105537105538105539105540105541105542105543105544105545105546105547105548105549105550105551105552105553105554105555105556105557105558105559105560105561105562105563105564105565105566105567105568105569105570105571105572105573105574105575105576105577105578105579105580105581105582105583105584105585105586105587105588105589105590105591105592105593105594105595105596105597105598105599105600105601105602105603105604105605105606105607105608105609105610105611105612105613105614105615105616105617105618105619105620105621105622105623105624105625105626105627105628105629105630105631105632105633105634105635105636105637105638105639105640105641105642105643105644105645105646105647105648105649105650105651105652105653105654105655105656105657105658105659105660105661105662105663105664105665105666105667105668105669105670105671105672105673105674105675105676105677105678105679105680105681105682105683105684105685105686105687105688105689105690105691105692105693105694105695105696105697105698105699105700105701105702105703105704105705105706105707105708105709105710105711105712105713105714105715105716105717105718105719105720105721105722105723105724105725105726105727105728105729105730105731105732105733105734105735105736105737105738105739105740105741105742105743105744105745105746105747105748105749105750105751105752105753105754105755105756105757105758105759105760105761105762105763105764105765105766105767105768105769105770105771105772105773105774105775105776105777105778105779105780105781105782105783105784105785105786105787105788105789105790105791105792105793105794105795105796105797105798105799105800105801105802105803105804105805105806105807105808105809105810105811105812105813105814105815105816105817105818105819105820105821105822105823105824105825105826105827105828105829105830105831105832105833105834105835105836105837105838105839105840105841105842105843105844105845105846105847105848105849105850105851105852105853105854105855105856105857105858105859105860105861105862105863105864105865105866105867105868105869105870105871105872105873105874105875105876105877105878105879105880105881105882105883105884105885105886105887105888105889105890105891105892105893105894105895105896105897105898105899105900105901105902105903105904105905105906105907105908105909105910105911105912105913105914105915105916105917105918105919105920105921105922105923105924105925105926105927105928105929105930105931105932105933105934105935105936105937105938105939105940105941105942105943105944105945105946105947105948105949105950105951105952105953105954105955105956105957105958105959105960105961105962105963105964105965105966105967105968105969105970105971105972105973105974105975105976105977105978105979105980105981105982105983105984105985105986105987105988105989105990105991105992105993105994105995105996105997105998105999106000106001106002106003106004106005106006106007106008106009106010106011106012106013106014106015106016106017106018106019106020106021106022106023106024106025106026106027106028106029106030106031106032106033106034106035106036106037106038106039106040106041106042106043106044106045106046106047106048106049106050106051106052106053106054106055106056106057106058106059106060106061106062106063106064106065106066106067106068106069106070106071106072106073106074106075106076106077106078106079106080106081106082106083106084106085106086106087106088106089106090106091106092106093106094106095106096106097106098106099106100106101106102106103106104106105106106106107106108106109106110106111106112106113106114106115106116106117106118106119106120106121106122106123106124106125106126106127106128106129106130106131106132106133106134106135106136106137106138106139106140106141106142106143106144106145106146106147106148106149106150106151106152106153106154106155106156106157106158106159106160106161106162106163106164106165106166106167106168106169106170106171106172106173106174106175106176106177106178106179106180106181106182106183106184106185106186106187106188106189106190106191106192106193106194106195106196106197106198106199106200106201106202106203106204106205106206106207106208106209106210106211106212106213106214106215106216106217106218106219106220106221106222106223106224106225106226106227106228106229106230106231106232106233106234106235106236106237106238106239106240106241106242106243106244106245106246106247106248106249106250106251106252106253106254106255106256106257106258106259106260106261106262106263106264106265106266106267106268106269106270106271106272106273106274106275106276106277106278106279106280106281106282106283106284106285106286106287106288106289106290106291106292106293106294106295106296106297106298106299106300106301106302106303106304106305106306106307106308106309106310106311106312106313106314106315106316106317106318106319106320106321106322106323106324106325106326106327106328106329106330106331106332106333106334106335106336106337106338106339106340106341106342106343106344106345106346106347106348106349106350106351106352106353106354106355106356106357106358106359106360106361106362106363106364106365106366106367106368106369106370106371106372106373106374106375106376106377106378106379106380106381106382106383106384106385106386106387106388106389106390106391106392106393106394106395106396106397106398106399106400106401106402106403106404106405106406106407106408106409106410106411106412106413106414106415106416106417106418106419106420106421106422106423106424106425106426106427106428106429106430106431106432106433106434106435106436106437106438106439106440106441106442106443106444106445106446106447106448106449106450106451106452106453106454106455106456106457106458106459106460106461106462106463106464106465106466106467106468106469106470106471106472106473106474106475106476106477106478106479106480106481106482106483106484106485106486106487106488106489106490106491106492106493106494106495106496106497106498106499106500106501106502106503106504106505106506106507106508106509106510106511106512106513106514106515106516106517106518106519106520106521106522106523106524106525106526106527106528106529106530106531106532106533106534106535106536106537106538106539106540106541106542106543106544106545106546106547106548106549106550106551106552106553106554106555106556106557106558106559106560106561106562106563106564106565106566106567106568106569106570106571106572106573106574106575106576106577106578106579106580106581106582106583106584106585106586106587106588106589106590106591106592106593106594106595106596106597106598106599106600106601106602106603106604106605106606106607106608106609106610106611106612106613106614106615106616106617106618106619106620106621106622106623106624106625106626106627106628106629106630106631106632106633106634106635106636106637106638106639106640106641106642106643106644106645106646106647106648106649106650106651106652106653106654106655106656106657106658106659106660106661106662106663106664106665106666106667106668106669106670106671106672106673106674106675106676106677106678106679106680106681106682106683106684106685106686106687106688106689106690106691106692106693106694106695106696106697106698106699106700106701106702106703106704106705106706106707106708106709106710106711106712106713106714106715106716106717106718106719106720106721106722106723106724106725106726106727106728106729106730106731106732106733106734106735106736106737106738106739106740106741106742106743106744106745106746106747106748106749106750106751106752106753106754106755106756106757106758106759106760106761106762106763106764106765106766106767106768106769106770106771106772106773106774106775106776106777106778106779106780106781106782106783106784106785106786106787106788106789106790106791106792106793106794106795106796106797106798106799106800106801106802106803106804106805106806106807106808106809106810106811106812106813106814106815106816106817106818106819106820106821106822106823106824106825106826106827106828106829106830106831106832106833106834106835106836106837106838106839106840106841106842106843106844106845106846106847106848106849106850106851106852106853106854106855106856106857106858106859106860106861106862106863106864106865106866106867106868106869106870106871106872106873106874106875106876106877106878106879106880106881106882106883106884106885106886106887106888106889106890106891106892106893106894106895106896106897106898106899106900106901106902106903106904106905106906106907106908106909106910106911106912106913106914106915106916106917106918106919106920106921106922106923106924106925106926106927106928106929106930106931106932106933106934106935106936106937106938106939106940106941106942106943106944106945106946106947106948106949106950106951106952106953106954106955106956106957106958106959106960106961106962106963106964106965106966106967106968106969106970106971106972106973106974106975106976106977106978106979106980106981106982106983106984106985106986106987106988106989106990106991106992106993106994106995106996106997106998106999107000107001107002107003107004107005107006107007107008107009107010107011107012107013107014107015107016107017107018107019107020107021107022107023107024107025107026107027107028107029107030107031107032107033107034107035107036107037107038107039107040107041107042107043107044107045107046107047107048107049107050107051107052107053107054107055107056107057107058107059107060107061107062107063107064107065107066107067107068107069107070107071107072107073107074107075107076107077107078107079107080107081107082107083107084107085107086107087107088107089107090107091107092107093107094107095107096107097107098107099107100107101107102107103107104107105107106107107107108107109107110107111107112107113107114107115107116107117107118107119107120107121107122107123107124107125107126107127107128107129107130107131107132107133107134107135107136107137107138107139107140107141107142107143107144107145107146107147107148107149107150107151107152107153107154107155107156107157107158107159107160107161107162107163107164107165107166107167107168107169107170107171107172107173107174107175107176107177107178107179107180107181107182107183107184107185107186107187107188107189107190107191107192107193107194107195107196107197107198107199107200107201107202107203107204107205107206107207107208107209107210107211107212107213107214107215107216107217107218107219107220107221107222107223107224107225107226107227107228107229107230107231107232107233107234107235107236107237107238107239107240107241107242107243107244107245107246107247107248107249107250107251107252107253107254107255107256107257107258107259107260107261107262107263107264107265107266107267107268107269107270107271107272107273107274107275107276107277107278107279107280107281107282107283107284107285107286107287107288107289107290107291107292107293107294107295107296107297107298107299107300107301107302107303107304107305107306107307107308107309107310107311107312107313107314107315107316107317107318107319107320107321107322107323107324107325107326107327107328107329107330107331107332107333107334107335107336107337107338107339107340107341107342107343107344107345107346107347107348107349107350107351107352107353107354107355107356107357107358107359107360107361107362107363107364107365107366107367107368107369107370107371107372107373107374107375107376107377107378107379107380107381107382107383107384107385107386107387107388107389107390107391107392107393107394107395107396107397107398107399107400107401107402107403107404107405107406107407107408107409107410107411107412107413107414107415107416107417107418107419107420107421107422107423107424107425107426107427107428107429107430107431107432107433107434107435107436107437107438107439107440107441107442107443107444107445107446107447107448107449107450107451107452107453107454107455107456107457107458107459107460107461107462107463107464107465107466107467107468107469107470107471107472107473107474107475107476107477107478107479107480107481107482107483107484107485107486107487107488107489107490107491107492107493107494107495107496107497107498107499107500107501107502107503107504107505107506107507107508107509107510107511107512107513107514107515107516107517107518107519107520107521107522107523107524107525107526107527107528107529107530107531107532107533107534107535107536107537107538107539107540107541107542107543107544107545107546107547107548107549107550107551107552107553107554107555107556107557107558107559107560107561107562107563107564107565107566107567107568107569107570107571107572107573107574107575107576107577107578107579107580107581107582107583107584107585107586107587107588107589107590107591107592107593107594107595107596107597107598107599107600107601107602107603107604107605107606107607107608107609107610107611107612107613107614107615107616107617107618107619107620107621107622107623107624107625107626107627107628107629107630107631107632107633107634107635107636107637107638107639107640107641107642107643107644107645107646107647107648107649107650107651107652107653107654107655107656107657107658107659107660107661107662107663107664107665107666107667107668107669107670107671107672107673107674107675107676107677107678107679107680107681107682107683107684107685107686107687107688107689107690107691107692107693107694107695107696107697107698107699107700107701107702107703107704107705107706107707107708107709107710107711107712107713107714107715107716107717107718107719107720107721107722107723107724107725107726107727107728107729107730107731107732107733107734107735107736107737107738107739107740107741107742107743107744107745107746107747107748107749107750107751107752107753107754107755107756107757107758107759107760107761107762107763107764107765107766107767107768107769107770107771107772107773107774107775107776107777107778107779107780107781107782107783107784107785107786107787107788107789107790107791107792107793107794107795107796107797107798107799107800107801107802107803107804107805107806107807107808107809107810107811107812107813107814107815107816107817107818107819107820107821107822107823107824107825107826107827107828107829107830107831107832107833107834107835107836107837107838107839107840107841107842107843107844107845107846107847107848107849107850107851107852107853107854107855107856107857107858107859107860107861107862107863107864107865107866107867107868107869107870107871107872107873107874107875107876107877107878107879107880107881107882107883107884107885107886107887107888107889107890107891107892107893107894107895107896107897107898107899107900107901107902107903107904107905107906107907107908107909107910107911107912107913107914107915107916107917107918107919107920107921107922107923107924107925107926107927107928107929107930107931107932107933107934107935107936107937107938107939107940107941107942107943107944107945107946107947107948107949107950107951107952107953107954107955107956107957107958107959107960107961107962107963107964107965107966107967107968107969107970107971107972107973107974107975107976107977107978107979107980107981107982107983107984107985107986107987107988107989107990107991107992107993107994107995107996107997107998107999108000108001108002108003108004108005108006108007108008108009108010108011108012108013108014108015108016108017108018108019108020108021108022108023108024108025108026108027108028108029108030108031108032108033108034108035108036108037108038108039108040108041108042108043108044108045108046108047108048108049108050108051108052108053108054108055108056108057108058108059108060108061108062108063108064108065108066108067108068108069108070108071108072108073108074108075108076108077108078108079108080108081108082108083108084108085108086108087108088108089108090108091108092108093108094108095108096108097108098108099108100108101108102108103108104108105108106108107108108108109108110108111108112108113108114108115108116108117108118108119108120108121108122108123108124108125108126108127108128108129108130108131108132108133108134108135108136108137108138108139108140108141108142108143108144108145108146108147108148108149108150108151108152108153108154108155108156108157108158108159108160108161108162108163108164108165108166108167108168108169108170108171108172108173108174108175108176108177108178108179108180108181108182108183108184108185108186108187108188108189108190108191108192108193108194108195108196108197108198108199108200108201108202108203108204108205108206108207108208108209108210108211108212108213108214108215108216108217108218108219108220108221108222108223108224108225108226108227108228108229108230108231108232108233108234108235108236108237108238108239108240108241108242108243108244108245108246108247108248108249108250108251108252108253108254108255108256108257108258108259108260108261108262108263108264108265108266108267108268108269108270108271108272108273108274108275108276108277108278108279108280108281108282108283108284108285108286108287108288108289108290108291108292108293108294108295108296108297108298108299108300108301108302108303108304108305108306108307108308108309108310108311108312108313108314108315108316108317108318108319108320108321108322108323108324108325108326108327108328108329108330108331108332108333108334108335108336108337108338108339108340108341108342108343108344108345108346108347108348108349108350108351108352108353108354108355108356108357108358108359108360108361108362108363108364108365108366108367108368108369108370108371108372108373108374108375108376108377108378108379108380108381108382108383108384108385108386108387108388108389108390108391108392108393108394108395108396108397108398108399108400108401108402108403108404108405108406108407108408108409108410108411108412108413108414108415108416108417108418108419108420108421108422108423108424108425108426108427108428108429108430108431108432108433108434108435108436108437108438108439108440108441108442108443108444108445108446108447108448108449108450108451108452108453108454108455108456108457108458108459108460108461108462108463108464108465108466108467108468108469108470108471108472108473108474108475108476108477108478108479108480108481108482108483108484108485108486108487108488108489108490108491108492108493108494108495108496108497108498108499108500108501108502108503108504108505108506108507108508108509108510108511108512108513108514108515108516108517108518108519108520108521108522108523108524108525108526108527108528108529108530108531108532108533108534108535108536108537108538108539108540108541108542108543108544108545108546108547108548108549108550108551108552108553108554108555108556108557108558108559108560108561108562108563108564108565108566108567108568108569108570108571108572108573108574108575108576108577108578108579108580108581108582108583108584108585108586108587108588108589108590108591108592108593108594108595108596108597108598108599108600108601108602108603108604108605108606108607108608108609108610108611108612108613108614108615108616108617108618108619108620108621108622108623108624108625108626108627108628108629108630108631108632108633108634108635108636108637108638108639108640108641108642108643108644108645108646108647108648108649108650108651108652108653108654108655108656108657108658108659108660108661108662108663108664108665108666108667108668108669108670108671108672108673108674108675108676108677108678108679108680108681108682108683108684108685108686108687108688108689108690108691108692108693108694108695108696108697108698108699108700108701108702108703108704108705108706108707108708108709108710108711108712108713108714108715108716108717108718108719108720108721108722108723108724108725108726108727108728108729108730108731108732108733108734108735108736108737108738108739108740108741108742108743108744108745108746108747108748108749108750108751108752108753108754108755108756108757108758108759108760108761108762108763108764108765108766108767108768108769108770108771108772108773108774108775108776108777108778108779108780108781108782108783108784108785108786108787108788108789108790108791108792108793108794108795108796108797108798108799108800108801108802108803108804108805108806108807108808108809108810108811108812108813108814108815108816108817108818108819108820108821108822108823108824108825108826108827108828108829108830108831108832108833108834108835108836108837108838108839108840108841108842108843108844108845108846108847108848108849108850108851108852108853108854108855108856108857108858108859108860108861108862108863108864108865108866108867108868108869108870108871108872108873108874108875108876108877108878108879108880108881108882108883108884108885108886108887108888108889108890108891108892108893108894108895108896108897108898108899108900108901108902108903108904108905108906108907108908108909108910108911108912108913108914108915108916108917108918108919108920108921108922108923108924108925108926108927108928108929108930108931108932108933108934108935108936108937108938108939108940108941108942108943108944108945108946108947108948108949108950108951108952108953108954108955108956108957108958108959108960108961108962108963108964108965108966108967108968108969108970108971108972108973108974108975108976108977108978108979108980108981108982108983108984108985108986108987108988108989108990108991108992108993108994108995108996108997108998108999109000109001109002109003109004109005109006109007109008109009109010109011109012109013109014109015109016109017109018109019109020109021109022109023109024109025109026109027109028109029109030109031109032109033109034109035109036109037109038109039109040109041109042109043109044109045109046109047109048109049109050109051109052109053109054109055109056109057109058109059109060109061109062109063109064109065109066109067109068109069109070109071109072109073109074109075109076109077109078109079109080109081109082109083109084109085109086109087109088109089109090109091109092109093109094109095109096109097109098109099109100109101109102109103109104109105109106109107109108109109109110109111109112109113109114109115109116109117109118109119109120109121109122109123109124109125109126109127109128109129109130109131109132109133109134109135109136109137109138109139109140109141109142109143109144109145109146109147109148109149109150109151109152109153109154109155109156109157109158109159109160109161109162109163109164109165109166109167109168109169109170109171109172109173109174109175109176109177109178109179109180109181109182109183109184109185109186109187109188109189109190109191109192109193109194109195109196109197109198109199109200109201109202109203109204109205109206109207109208109209109210109211109212109213109214109215109216109217109218109219109220109221109222109223109224109225109226109227109228109229109230109231109232109233109234109235109236109237109238109239109240109241109242109243109244109245109246109247109248109249109250109251109252109253109254109255109256109257109258109259109260109261109262109263109264109265109266109267109268109269109270109271109272109273109274109275109276109277109278109279109280109281109282109283109284109285109286109287109288109289109290109291109292109293109294109295109296109297109298109299109300109301109302109303109304109305109306109307109308109309109310109311109312109313109314109315109316109317109318109319109320109321109322109323109324109325109326109327109328109329109330109331109332109333109334109335109336109337109338109339109340109341109342109343109344109345109346109347109348109349109350109351109352109353109354109355109356109357109358109359109360109361109362109363109364109365109366109367109368109369109370109371109372109373109374109375109376109377109378109379109380109381109382109383109384109385109386109387109388109389109390109391109392109393109394109395109396109397109398109399109400109401109402109403109404109405109406109407109408109409109410109411109412109413109414109415109416109417109418109419109420109421109422109423109424109425109426109427109428109429109430109431109432109433109434109435109436109437109438109439109440109441109442109443109444109445109446109447109448109449109450109451109452109453109454109455109456109457109458109459109460109461109462109463109464109465109466109467109468109469109470109471109472109473109474109475109476109477109478109479109480109481109482109483109484109485109486109487109488109489109490109491109492109493109494109495109496109497109498109499109500109501109502109503109504109505109506109507109508109509109510109511109512109513109514109515109516109517109518109519109520109521109522109523109524109525109526109527109528109529109530109531109532109533109534109535109536109537109538109539109540109541109542109543109544109545109546109547109548109549109550109551109552109553109554109555109556109557109558109559109560109561109562109563109564109565109566109567109568109569109570109571109572109573109574109575109576109577109578109579109580109581109582109583109584109585109586109587109588109589109590109591109592109593109594109595109596109597109598109599109600109601109602109603109604109605109606109607109608109609109610109611109612109613109614109615109616109617109618109619109620109621109622109623109624109625109626109627109628109629109630109631109632109633109634109635109636109637109638109639109640109641109642109643109644109645109646109647109648109649109650109651109652109653109654109655109656109657109658109659109660109661109662109663109664109665109666109667109668109669109670109671109672109673109674109675109676109677109678109679109680109681109682109683109684109685109686109687109688109689109690109691109692109693109694109695109696109697109698109699109700109701109702109703109704109705109706109707109708109709109710109711109712109713109714109715109716109717109718109719109720109721109722109723109724109725109726109727109728109729109730109731109732109733109734109735109736109737109738109739109740109741109742109743109744109745109746109747109748109749109750109751109752109753109754109755109756109757109758109759109760109761109762109763109764109765109766109767109768109769109770109771109772109773109774109775109776109777109778109779109780109781109782109783109784109785109786109787109788109789109790109791109792109793109794109795109796109797109798109799109800109801109802109803109804109805109806109807109808109809109810109811109812109813109814109815109816109817109818109819109820109821109822109823109824109825109826109827109828109829109830109831109832109833109834109835109836109837109838109839109840109841109842109843109844109845109846109847109848109849109850109851109852109853109854109855109856109857109858109859109860109861109862109863109864109865109866109867109868109869109870109871109872109873109874109875109876109877109878109879109880109881109882109883109884109885109886109887109888109889109890109891109892109893109894109895109896109897109898109899109900109901109902109903109904109905109906109907109908109909109910109911109912109913109914109915109916109917109918109919109920109921109922109923109924109925109926109927109928109929109930109931109932109933109934109935109936109937109938109939109940109941109942109943109944109945109946109947109948109949109950109951109952109953109954109955109956109957109958109959109960109961109962109963109964109965109966109967109968109969109970109971109972109973109974109975109976109977109978109979109980109981109982109983109984109985109986109987109988109989109990109991109992109993109994109995109996109997109998109999110000110001110002110003110004110005110006110007110008110009110010110011110012110013110014110015110016110017110018110019110020110021110022110023110024110025110026110027110028110029110030110031110032110033110034110035110036110037110038110039110040110041110042110043110044110045110046110047110048110049110050110051110052110053110054110055110056110057110058110059110060110061110062110063110064110065110066110067110068110069110070110071110072110073110074110075110076110077110078110079110080110081110082110083110084110085110086110087110088110089110090110091110092110093110094110095110096110097110098110099110100110101110102110103110104110105110106110107110108110109110110110111110112110113110114110115110116110117110118110119110120110121110122110123110124110125110126110127110128110129110130110131110132110133110134110135110136110137110138110139110140110141110142110143110144110145110146110147110148110149110150110151110152110153110154110155110156110157110158110159110160110161110162110163110164110165110166110167110168110169110170110171110172110173110174110175110176110177110178110179110180110181110182110183110184110185110186110187110188110189110190110191110192110193110194110195110196110197110198110199110200110201110202110203110204110205110206110207110208110209110210110211110212110213110214110215110216110217110218110219110220110221110222110223110224110225110226110227110228110229110230110231110232110233110234110235110236110237110238110239110240110241110242110243110244110245110246110247110248110249110250110251110252110253110254110255110256110257110258110259110260110261110262110263110264110265110266110267110268110269110270110271110272110273110274110275110276110277110278110279110280110281110282110283110284110285110286110287110288110289110290110291110292110293110294110295110296110297110298110299110300110301110302110303110304110305110306110307110308110309110310110311110312110313110314110315110316110317110318110319110320110321110322110323110324110325110326110327110328110329110330110331110332110333110334110335110336110337110338110339110340110341110342110343110344110345110346110347110348110349110350110351110352110353110354110355110356110357110358110359110360110361110362110363110364110365110366110367110368110369110370110371110372110373110374110375110376110377110378110379110380110381110382110383110384110385110386110387110388110389110390110391110392110393110394110395110396110397110398110399110400110401110402110403110404110405110406110407110408110409110410110411110412110413110414110415110416110417110418110419110420110421110422110423110424110425110426110427110428110429110430110431110432110433110434110435110436110437110438110439110440110441110442110443110444110445110446110447110448110449110450110451110452110453110454110455110456110457110458110459110460110461110462110463110464110465110466110467110468110469110470110471110472110473110474110475110476110477110478110479110480110481110482110483110484110485110486110487110488110489110490110491110492110493110494110495110496110497110498110499110500110501110502110503110504110505110506110507110508110509110510110511110512110513110514110515110516110517110518110519110520110521110522110523110524110525110526110527110528110529110530110531110532110533110534110535110536110537110538110539110540110541110542110543110544110545110546110547110548110549110550110551110552110553110554110555110556110557110558110559110560110561110562110563110564110565110566110567110568110569110570110571110572110573110574110575110576110577110578110579110580110581110582110583110584110585110586110587110588110589110590110591110592110593110594110595110596110597110598110599110600110601110602110603110604110605110606110607110608110609110610110611110612110613110614110615110616110617110618110619110620110621110622110623110624110625110626110627110628110629110630110631110632110633110634110635110636110637110638110639110640110641110642110643110644110645110646110647110648110649110650110651110652110653110654110655110656110657110658110659110660110661110662110663110664110665110666110667110668110669110670110671110672110673110674110675110676110677110678110679110680110681110682110683110684110685110686110687110688110689110690110691110692110693110694110695110696110697110698110699110700110701110702110703110704110705110706110707110708110709110710110711110712110713110714110715110716110717110718110719110720110721110722110723110724110725110726110727110728110729110730110731110732110733110734110735110736110737110738110739110740110741110742110743110744110745110746110747110748110749110750110751110752110753110754110755110756110757110758110759110760110761110762110763110764110765110766110767110768110769110770110771110772110773110774110775110776110777110778110779110780110781110782110783110784110785110786110787110788110789110790110791110792110793110794110795110796110797110798110799110800110801110802110803110804110805110806110807110808110809110810110811110812110813110814110815110816110817110818110819110820110821110822110823110824110825110826110827110828110829110830110831110832110833110834110835110836110837110838110839110840110841110842110843110844110845110846110847110848110849110850110851110852110853110854110855110856110857110858110859110860110861110862110863110864110865110866110867110868110869110870110871110872110873110874110875110876110877110878110879110880110881110882110883110884110885110886110887110888110889110890110891110892110893110894110895110896110897110898110899110900110901110902110903110904110905110906110907110908110909110910110911110912110913110914110915110916110917110918110919110920110921110922110923110924110925110926110927110928110929110930110931110932110933110934110935110936110937110938110939110940110941110942110943110944110945110946110947110948110949110950110951110952110953110954110955110956110957110958110959110960110961110962110963110964110965110966110967110968110969110970110971110972110973110974110975110976110977110978110979110980110981110982110983110984110985110986110987110988110989110990110991110992110993110994110995110996110997110998110999111000111001111002111003111004111005111006111007111008111009111010111011111012111013111014111015111016111017111018111019111020111021111022111023111024111025111026111027111028111029111030111031111032111033111034111035111036111037111038111039111040111041111042111043111044111045111046111047111048111049111050111051111052111053111054111055111056111057111058111059111060111061111062111063111064111065111066111067111068111069111070111071111072111073111074111075111076111077111078111079111080111081111082111083111084111085111086111087111088111089111090111091111092111093111094111095111096111097111098111099111100111101111102111103111104111105111106111107111108111109111110111111111112111113111114111115111116111117111118111119111120111121111122111123111124111125111126111127111128111129111130111131111132111133111134111135111136111137111138111139111140111141111142111143111144111145111146111147111148111149111150111151111152111153111154111155111156111157111158111159111160111161111162111163111164111165111166111167111168111169111170111171111172111173111174111175111176111177111178111179111180111181111182111183111184111185111186111187111188111189111190111191111192111193111194111195111196111197111198111199111200111201111202111203111204111205111206111207111208111209111210111211111212111213111214111215111216111217111218111219111220111221111222111223111224111225111226111227111228111229111230111231111232111233111234111235111236111237111238111239111240111241111242111243111244111245111246111247111248111249111250111251111252111253111254111255111256111257111258111259111260111261111262111263111264111265111266111267111268111269111270111271111272111273111274111275111276111277111278111279111280111281111282111283111284111285111286111287111288111289111290111291111292111293111294111295111296111297111298111299111300111301111302111303111304111305111306111307111308111309111310111311111312111313111314111315111316111317111318111319111320111321111322111323111324111325111326111327111328111329111330111331111332111333111334111335111336111337111338111339111340111341111342111343111344111345111346111347111348111349111350111351111352111353111354111355111356111357111358111359111360111361111362111363111364111365111366111367111368111369111370111371111372111373111374111375111376111377111378111379111380111381111382111383111384111385111386111387111388111389111390111391111392111393111394111395111396111397111398111399111400111401111402111403111404111405111406111407111408111409111410111411111412111413111414111415111416111417111418111419111420111421111422111423111424111425111426111427111428111429111430111431111432111433111434111435111436111437111438111439111440111441111442111443111444111445111446111447111448111449111450111451111452111453111454111455111456111457111458111459111460111461111462111463111464111465111466111467111468111469111470111471111472111473111474111475111476111477111478111479111480111481111482111483111484111485111486111487111488111489111490111491111492111493111494111495111496111497111498111499111500111501111502111503111504111505111506111507111508111509111510111511111512111513111514111515111516111517111518111519111520111521111522111523111524111525111526111527111528111529111530111531111532111533111534111535111536111537111538111539111540111541111542111543111544111545111546111547111548111549111550111551111552111553111554111555111556111557111558111559111560111561111562111563111564111565111566111567111568111569111570111571111572111573111574111575111576111577111578111579111580111581111582111583111584111585111586111587111588111589111590111591111592111593111594111595111596111597111598111599111600111601111602111603111604111605111606111607111608111609111610111611111612111613111614111615111616111617111618111619111620111621111622111623111624111625111626111627111628111629111630111631111632111633111634111635111636111637111638111639111640111641111642111643111644111645111646111647111648111649111650111651111652111653111654111655111656111657111658111659111660111661111662111663111664111665111666111667111668111669111670111671111672111673111674111675111676111677111678111679111680111681111682111683111684111685111686111687111688111689111690111691111692111693111694111695111696111697111698111699111700111701111702111703111704111705111706111707111708111709111710111711111712111713111714111715111716111717111718111719111720111721111722111723111724111725111726111727111728111729111730111731111732111733111734111735111736111737111738111739111740111741111742111743111744111745111746111747111748111749111750111751111752111753111754111755111756111757111758111759111760111761111762111763111764111765111766111767111768111769111770111771111772111773111774111775111776111777111778111779111780111781111782111783111784111785111786111787111788111789111790111791111792111793111794111795111796111797111798111799111800111801111802111803111804111805111806111807111808111809111810111811111812111813111814111815111816111817111818111819111820111821111822111823111824111825111826111827111828111829111830111831111832111833111834111835111836111837111838111839111840111841111842111843111844111845111846111847111848111849111850111851111852111853111854111855111856111857111858111859111860111861111862111863111864111865111866111867111868111869111870111871111872111873111874111875111876111877111878111879111880111881111882111883111884111885111886111887111888111889111890111891111892111893111894111895111896111897111898111899111900111901111902111903111904111905111906111907111908111909111910111911111912111913111914111915111916111917111918111919111920111921111922111923111924111925111926111927111928111929111930111931111932111933111934111935111936111937111938111939111940111941111942111943111944111945111946111947111948111949111950111951111952111953111954111955111956111957111958111959111960111961111962111963111964111965111966111967111968111969111970111971111972111973111974111975111976111977111978111979111980111981111982111983111984111985111986111987111988111989111990111991111992111993111994111995111996111997111998111999112000112001112002112003112004112005112006112007112008112009112010112011112012112013112014112015112016112017112018112019112020112021112022112023112024112025112026112027112028112029112030112031112032112033112034112035112036112037112038112039112040112041112042112043112044112045112046112047112048112049112050112051112052112053112054112055112056112057112058112059112060112061112062112063112064112065112066112067112068112069112070112071112072112073112074112075112076112077112078112079112080112081112082112083112084112085112086112087112088112089112090112091112092112093112094112095112096112097112098112099112100112101112102112103112104112105112106112107112108112109112110112111112112112113112114112115112116112117112118112119112120112121112122112123112124112125112126112127112128112129112130112131112132112133112134112135112136112137112138112139112140112141112142112143112144112145112146112147112148112149112150112151112152112153112154112155112156112157112158112159112160112161112162112163112164112165112166112167112168112169112170112171112172112173112174112175112176112177112178112179112180112181112182112183112184112185112186112187112188112189112190112191112192112193112194112195112196112197112198112199112200112201112202112203112204112205112206112207112208112209112210112211112212112213112214112215112216112217112218112219112220112221112222112223112224112225112226112227112228112229112230112231112232112233112234112235112236112237112238112239112240112241112242112243112244112245112246112247112248112249112250112251112252112253112254112255112256112257112258112259112260112261112262112263112264112265112266112267112268112269112270112271112272112273112274112275112276112277112278112279112280112281112282112283112284112285112286112287112288112289112290112291112292112293112294112295112296112297112298112299112300112301112302112303112304112305112306112307112308112309112310112311112312112313112314112315112316112317112318112319112320112321112322112323112324112325112326112327112328112329112330112331112332112333112334112335112336112337112338112339112340112341112342112343112344112345112346112347112348112349112350112351112352112353112354112355112356112357112358112359112360112361112362112363112364112365112366112367112368112369112370112371112372112373112374112375112376112377112378112379112380112381112382112383112384112385112386112387112388112389112390112391112392112393112394112395112396112397112398112399112400112401112402112403112404112405112406112407112408112409112410112411112412112413112414112415112416112417112418112419112420112421112422112423112424112425112426112427112428112429112430112431112432112433112434112435112436112437112438112439112440112441112442112443112444112445112446112447112448112449112450112451112452112453112454112455112456112457112458112459112460112461112462112463112464112465112466112467112468112469112470112471112472112473112474112475112476112477112478112479112480112481112482112483112484112485112486112487112488112489112490112491112492112493112494112495112496112497112498112499112500112501112502112503112504112505112506112507112508112509112510112511112512112513112514112515112516112517112518112519112520112521112522112523112524112525112526112527112528112529112530112531112532112533112534112535112536112537112538112539112540112541112542112543112544112545112546112547112548112549112550112551112552112553112554112555112556112557112558112559112560112561112562112563112564112565112566112567112568112569112570112571112572112573112574112575112576112577112578112579112580112581112582112583112584112585112586112587112588112589112590112591112592112593112594112595112596112597112598112599112600112601112602112603112604112605112606112607112608112609112610112611112612112613112614112615112616112617112618112619112620112621112622112623112624112625112626112627112628112629112630112631112632112633112634112635112636112637112638112639112640112641112642112643112644112645112646112647112648112649112650112651112652112653112654112655112656112657112658112659112660112661112662112663112664112665112666112667112668112669112670112671112672112673112674112675112676112677112678112679112680112681112682112683112684112685112686112687112688112689112690112691112692112693112694112695112696112697112698112699112700112701112702112703112704112705112706112707112708112709112710112711112712112713112714112715112716112717112718112719112720112721112722112723112724112725112726112727112728112729112730112731112732112733112734112735112736112737112738112739112740112741112742112743112744112745112746112747112748112749112750112751112752112753112754112755112756112757112758112759112760112761112762112763112764112765112766112767112768112769112770112771112772112773112774112775112776112777112778112779112780112781112782112783112784112785112786112787112788112789112790112791112792112793112794112795112796112797112798112799112800112801112802112803112804112805112806112807112808112809112810112811112812112813112814112815112816112817112818112819112820112821112822112823112824112825112826112827112828112829112830112831112832112833112834112835112836112837112838112839112840112841112842112843112844112845112846112847112848112849112850112851112852112853112854112855112856112857112858112859112860112861112862112863112864112865112866112867112868112869112870112871112872112873112874112875112876112877112878112879112880112881112882112883112884112885112886112887112888112889112890112891112892112893112894112895112896112897112898112899112900112901112902112903112904112905112906112907112908112909112910112911112912112913112914112915112916112917112918112919112920112921112922112923112924112925112926112927112928112929112930112931112932112933112934112935112936112937112938112939112940112941112942112943112944112945112946112947112948112949112950112951112952112953112954112955112956112957112958112959112960112961112962112963112964112965112966112967112968112969112970112971112972112973112974112975112976112977112978112979112980112981112982112983112984112985112986112987112988112989112990112991112992112993112994112995112996112997112998112999113000113001113002113003113004113005113006113007113008113009113010113011113012113013113014113015113016113017113018113019113020113021113022113023113024113025113026113027113028113029113030113031113032113033113034113035113036113037113038113039113040113041113042113043113044113045113046113047113048113049113050113051113052113053113054113055113056113057113058113059113060113061113062113063113064113065113066113067113068113069113070113071113072113073113074113075113076113077113078113079113080113081113082113083113084113085113086113087113088113089113090113091113092113093113094113095113096113097113098113099113100113101113102113103113104113105113106113107113108113109113110113111113112113113113114113115113116113117113118113119113120113121113122113123113124113125113126113127113128113129113130113131113132113133113134113135113136113137113138113139113140113141113142113143113144113145113146113147113148113149113150113151113152113153113154113155113156113157113158113159113160113161113162113163113164113165113166113167113168113169113170113171113172113173113174113175113176113177113178113179113180113181113182113183113184113185113186113187113188113189113190113191113192113193113194113195113196113197113198113199113200113201113202113203113204113205113206113207113208113209113210113211113212113213113214113215113216113217113218113219113220113221113222113223113224113225113226113227113228113229113230113231113232113233113234113235113236113237113238113239113240113241113242113243113244113245113246113247113248113249113250113251113252113253113254113255113256113257113258113259113260113261113262113263113264113265113266113267113268113269113270113271113272113273113274113275113276113277113278113279113280113281113282113283113284113285113286113287113288113289113290113291113292113293113294113295113296113297113298113299113300113301113302113303113304113305113306113307113308113309113310113311113312113313113314113315113316113317113318113319113320113321113322113323113324113325113326113327113328113329113330113331113332113333113334113335113336113337113338113339113340113341113342113343113344113345113346113347113348113349113350113351113352113353113354113355113356113357113358113359113360113361113362113363113364113365113366113367113368113369113370113371113372113373113374113375113376113377113378113379113380113381113382113383113384113385113386113387113388113389113390113391113392113393113394113395113396113397113398113399113400113401113402113403113404113405113406113407113408113409113410113411113412113413113414113415113416113417113418113419113420113421113422113423113424113425113426113427113428113429113430113431113432113433113434113435113436113437113438113439113440113441113442113443113444113445113446113447113448113449113450113451113452113453113454113455113456113457113458113459113460113461113462113463113464113465113466113467113468113469113470113471113472113473113474113475113476113477113478113479113480113481113482113483113484113485113486113487113488113489113490113491113492113493113494113495113496113497113498113499113500113501113502113503113504113505113506113507113508113509113510113511113512113513113514113515113516113517113518113519113520113521113522113523113524113525113526113527113528113529113530113531113532113533113534113535113536113537113538113539113540113541113542113543113544113545113546113547113548113549113550113551113552113553113554113555113556113557113558113559113560113561113562113563113564113565113566113567113568113569113570113571113572113573113574113575113576113577113578113579113580113581113582113583113584113585113586113587113588113589113590113591113592113593113594113595113596113597113598113599113600113601113602113603113604113605113606113607113608113609113610113611113612113613113614113615113616113617113618113619113620113621113622113623113624113625113626113627113628113629113630113631113632113633113634113635113636113637113638113639113640113641113642113643113644113645113646113647113648113649113650113651113652113653113654113655113656113657113658113659113660113661113662113663113664113665113666113667113668113669113670113671113672113673113674113675113676113677113678113679113680113681113682113683113684113685113686113687113688113689113690113691113692113693113694113695113696113697113698113699113700113701113702113703113704113705113706113707113708113709113710113711113712113713113714113715113716113717113718113719113720113721113722113723113724113725113726113727113728113729113730113731113732113733113734113735113736113737113738113739113740113741113742113743113744113745113746113747113748113749113750113751113752113753113754113755113756113757113758113759113760113761113762113763113764113765113766113767113768113769113770113771113772113773113774113775113776113777113778113779113780113781113782113783113784113785113786113787113788113789113790113791113792113793113794113795113796113797113798113799113800113801113802113803113804113805113806113807113808113809113810113811113812113813113814113815113816113817113818113819113820113821113822113823113824113825113826113827113828113829113830113831113832113833113834113835113836113837113838113839113840113841113842113843113844113845113846113847113848113849113850113851113852113853113854113855113856113857113858113859113860113861113862113863113864113865113866113867113868113869113870113871113872113873113874113875113876113877113878113879113880113881113882113883113884113885113886113887113888113889113890113891113892113893113894113895113896113897113898113899113900113901113902113903113904113905113906113907113908113909113910113911113912113913113914113915113916113917113918113919113920113921113922113923113924113925113926113927113928113929113930113931113932113933113934113935113936113937113938113939113940113941113942113943113944113945113946113947113948113949113950113951113952113953113954113955113956113957113958113959113960113961113962113963113964113965113966113967113968113969113970113971113972113973113974113975113976113977113978113979113980113981113982113983113984113985113986113987113988113989113990113991113992113993113994113995113996113997113998113999114000114001114002114003114004114005114006114007114008114009114010114011114012114013114014114015114016114017114018114019114020114021114022114023114024114025114026114027114028114029114030114031114032114033114034114035114036114037114038114039114040114041114042114043114044114045114046114047114048114049114050114051114052114053114054114055114056114057114058114059114060114061114062114063114064114065114066114067114068114069114070114071114072114073114074114075114076114077114078114079114080114081114082114083114084114085114086114087114088114089114090114091114092114093114094114095114096114097114098114099114100114101114102114103114104114105114106114107114108114109114110114111114112114113114114114115114116114117114118114119114120114121114122114123114124114125114126114127114128114129114130114131114132114133114134114135114136114137114138114139114140114141114142114143114144114145114146114147114148114149114150114151114152114153114154114155114156114157114158114159114160114161114162114163114164114165114166114167114168114169114170114171114172114173114174114175114176114177114178114179114180114181114182114183114184114185114186114187114188114189114190114191114192114193114194114195114196114197114198114199114200114201114202114203114204114205114206114207114208114209114210114211114212114213114214114215114216114217114218114219114220114221114222114223114224114225114226114227114228114229114230114231114232114233114234114235114236114237114238114239114240114241114242114243114244114245114246114247114248114249114250114251114252114253114254114255114256114257114258114259114260114261114262114263114264114265114266114267114268114269114270114271114272114273114274114275114276114277114278114279114280114281114282114283114284114285114286114287114288114289114290114291114292114293114294114295114296114297114298114299114300114301114302114303114304114305114306114307114308114309114310114311114312114313114314114315114316114317114318114319114320114321114322114323114324114325114326114327114328114329114330114331114332114333114334114335114336114337114338114339114340114341114342114343114344114345114346114347114348114349114350114351114352114353114354114355114356114357114358114359114360114361114362114363114364114365114366114367114368114369114370114371114372114373114374114375114376114377114378114379114380114381114382114383114384114385114386114387114388114389114390114391114392114393114394114395114396114397114398114399114400114401114402114403114404114405114406114407114408114409114410114411114412114413114414114415114416114417114418114419114420114421114422114423114424114425114426114427114428114429114430114431114432114433114434114435114436114437114438114439114440114441114442114443114444114445114446114447114448114449114450114451114452114453114454114455114456114457114458114459114460114461114462114463114464114465114466114467114468114469114470114471114472114473114474114475114476114477114478114479114480114481114482114483114484114485114486114487114488114489114490114491114492114493114494114495114496114497114498114499114500114501114502114503114504114505114506114507114508114509114510114511114512114513114514114515114516114517114518114519114520114521114522114523114524114525114526114527114528114529114530114531114532114533114534114535114536114537114538114539114540114541114542114543114544114545114546114547114548114549114550114551114552114553114554114555114556114557114558114559114560114561114562114563114564114565114566114567114568114569114570114571114572114573114574114575114576114577114578114579114580114581114582114583114584114585114586114587114588114589114590114591114592114593114594114595114596114597114598114599114600114601114602114603114604114605114606114607114608114609114610114611114612114613114614114615114616114617114618114619114620114621114622114623114624114625114626114627114628114629114630114631114632114633114634114635114636114637114638114639114640114641114642114643114644114645114646114647114648114649114650114651114652114653114654114655114656114657114658114659114660114661114662114663114664114665114666114667114668114669114670114671114672114673114674114675114676114677114678114679114680114681114682114683114684114685114686114687114688114689114690114691114692114693114694114695114696114697114698114699114700114701114702114703114704114705114706114707114708114709114710114711114712114713114714114715114716114717114718114719114720114721114722114723114724114725114726114727114728114729114730114731114732114733114734114735114736114737114738114739114740114741114742114743114744114745114746114747114748114749114750114751114752114753114754114755114756114757114758114759114760114761114762114763114764114765114766114767114768114769114770114771114772114773114774114775114776114777114778114779114780114781114782114783114784114785114786114787114788114789114790114791114792114793114794114795114796114797114798114799114800114801114802114803114804114805114806114807114808114809114810114811114812114813114814114815114816114817114818114819114820114821114822114823114824114825114826114827114828114829114830114831114832114833114834114835114836114837114838114839114840114841114842114843114844114845114846114847114848114849114850114851114852114853114854114855114856114857114858114859114860114861114862114863114864114865114866114867114868114869114870114871114872114873114874114875114876114877114878114879114880114881114882114883114884114885114886114887114888114889114890114891114892114893114894114895114896114897114898114899114900114901114902114903114904114905114906114907114908114909114910114911114912114913114914114915114916114917114918114919114920114921114922114923114924114925114926114927114928114929114930114931114932114933114934114935114936114937114938114939114940114941114942114943114944114945114946114947114948114949114950114951114952114953114954114955114956114957114958114959114960114961114962114963114964114965114966114967114968114969114970114971114972114973114974114975114976114977114978114979114980114981114982114983114984114985114986114987114988114989114990114991114992114993114994114995114996114997114998114999115000115001115002115003115004115005115006115007115008115009115010115011115012115013115014115015115016115017115018115019115020115021115022115023115024115025115026115027115028115029115030115031115032115033115034115035115036115037115038115039115040115041115042115043115044115045115046115047115048115049115050115051115052115053115054115055115056115057115058115059115060115061115062115063115064115065115066115067115068115069115070115071115072115073115074115075115076115077115078115079115080115081115082115083115084115085115086115087115088115089115090115091115092115093115094115095115096115097115098115099115100115101115102115103115104115105115106115107115108115109115110115111115112115113115114115115115116115117115118115119115120115121115122115123115124115125115126115127115128115129115130115131115132115133115134115135115136115137115138115139115140115141115142115143115144115145115146115147115148115149115150115151115152115153115154115155115156115157115158115159115160115161115162115163115164115165115166115167115168115169115170115171115172115173115174115175115176115177115178115179115180115181115182115183115184115185115186115187115188115189115190115191115192115193115194115195115196115197115198115199115200115201115202115203115204115205115206115207115208115209115210115211115212115213115214115215115216115217115218115219115220115221115222115223115224115225115226115227115228115229115230115231115232115233115234115235115236115237115238115239115240115241115242115243115244115245115246115247115248115249115250115251115252115253115254115255115256115257115258115259115260115261115262115263115264115265115266115267115268115269115270115271115272115273115274115275115276115277115278115279115280115281115282115283115284115285115286115287115288115289115290115291115292115293115294115295115296115297115298115299115300115301115302115303115304115305115306115307115308115309115310115311115312115313115314115315115316115317115318115319115320115321115322115323115324115325115326115327115328115329115330115331115332115333115334115335115336115337115338115339115340115341115342115343115344115345115346115347115348115349115350115351115352115353115354115355115356115357115358115359115360115361115362115363115364115365115366115367115368115369115370115371115372115373115374115375115376115377115378115379115380115381115382115383115384115385115386115387115388115389115390115391115392115393115394115395115396115397115398115399115400115401115402115403115404115405115406115407115408115409115410115411115412115413115414115415115416115417115418115419115420115421115422115423115424115425115426115427115428115429115430115431115432115433115434115435115436115437115438115439115440115441115442115443115444115445115446115447115448115449115450115451115452115453115454115455115456115457115458115459115460115461115462115463115464115465115466115467115468115469115470115471115472115473115474115475115476115477115478115479115480115481115482115483115484115485115486115487115488115489115490115491115492115493115494115495115496115497115498115499115500115501115502115503115504115505115506115507115508115509115510115511115512115513115514115515115516115517115518115519115520115521115522115523115524115525115526115527115528115529115530115531115532115533115534115535115536115537115538115539115540115541115542115543115544115545115546115547115548115549115550115551115552115553115554115555115556115557115558115559115560115561115562115563115564115565115566115567115568115569115570115571115572115573115574115575115576115577115578115579115580115581115582115583115584115585115586115587115588115589115590115591115592115593115594115595115596115597115598115599115600115601115602115603115604115605115606115607115608115609115610115611115612115613115614115615115616115617115618115619115620115621115622115623115624115625115626115627115628115629115630115631115632115633115634115635115636115637115638115639115640115641115642115643115644115645115646115647115648115649115650115651115652115653115654115655115656115657115658115659115660115661115662115663115664115665115666115667115668115669115670115671115672115673115674115675115676115677115678115679115680115681115682115683115684115685115686115687115688115689115690115691115692115693115694115695115696115697115698115699115700115701115702115703115704115705115706115707115708115709115710115711115712115713115714115715115716115717115718115719115720115721115722115723115724115725115726115727115728115729115730115731115732115733115734115735115736115737115738115739115740115741115742115743115744115745115746115747115748115749115750115751115752115753115754115755115756115757115758115759115760115761115762115763115764115765115766115767115768115769115770115771115772115773115774115775115776115777115778115779115780115781115782115783115784115785115786115787115788115789115790115791115792115793115794115795115796115797115798115799115800115801115802115803115804115805115806115807115808115809115810115811115812115813115814115815115816115817115818115819115820115821115822115823115824115825115826115827115828115829115830115831115832115833115834115835115836115837115838115839115840115841115842115843115844115845115846115847115848115849115850115851115852115853115854115855115856115857115858115859115860115861115862115863115864115865115866115867115868115869115870115871115872115873115874115875115876115877115878115879115880115881115882115883115884115885115886115887115888115889115890115891115892115893115894115895115896115897115898115899115900115901115902115903115904115905115906115907115908115909115910115911115912115913115914115915115916115917115918115919115920115921115922115923115924115925115926115927115928115929115930115931115932115933115934115935115936115937115938115939115940115941115942115943115944115945115946115947115948115949115950115951115952115953115954115955115956115957115958115959115960115961115962115963115964115965115966115967115968115969115970115971115972115973115974115975115976115977115978115979115980115981115982115983115984115985115986115987115988115989115990115991115992115993115994115995115996115997115998115999116000116001116002116003116004116005116006116007116008116009116010116011116012116013116014116015116016116017116018116019116020116021116022116023116024116025116026116027116028116029116030116031116032116033116034116035116036116037116038116039116040116041116042116043116044116045116046116047116048116049116050116051116052116053116054116055116056116057116058116059116060116061116062116063116064116065116066116067116068116069116070116071116072116073116074116075116076116077116078116079116080116081116082116083116084116085116086116087116088116089116090116091116092116093116094116095116096116097116098116099116100116101116102116103116104116105116106116107116108116109116110116111116112116113116114116115116116116117116118116119116120116121116122116123116124116125116126116127116128116129116130116131116132116133116134116135116136116137116138116139116140116141116142116143116144116145116146116147116148116149116150116151116152116153116154116155116156116157116158116159116160116161116162116163116164116165116166116167116168116169116170116171116172116173116174116175116176116177116178116179116180116181116182116183116184116185116186116187116188116189116190116191116192116193116194116195116196116197116198116199116200116201116202116203116204116205116206116207116208116209116210116211116212116213116214116215116216116217116218116219116220116221116222116223116224116225116226116227116228116229116230116231116232116233116234116235116236116237116238116239116240116241116242116243116244116245116246116247116248116249116250116251116252116253116254116255116256116257116258116259116260116261116262116263116264116265116266116267116268116269116270116271116272116273116274116275116276116277116278116279116280116281116282116283116284116285116286116287116288116289116290116291116292116293116294116295116296116297116298116299116300116301116302116303116304116305116306116307116308116309116310116311116312116313116314116315116316116317116318116319116320116321116322116323116324116325116326116327116328116329116330116331116332116333116334116335116336116337116338116339116340116341116342116343116344116345116346116347116348116349116350116351116352116353116354116355116356116357116358116359116360116361116362116363116364116365116366116367116368116369116370116371116372116373116374116375116376116377116378116379116380116381116382116383116384116385116386116387116388116389116390116391116392116393116394116395116396116397116398116399116400116401116402116403116404116405116406116407116408116409116410116411116412116413116414116415116416116417116418116419116420116421116422116423116424116425116426116427116428116429116430116431116432116433116434116435116436116437116438116439116440116441116442116443116444116445116446116447116448116449116450116451116452116453116454116455116456116457116458116459116460116461116462116463116464116465116466116467116468116469116470116471116472116473116474116475116476116477116478116479116480116481116482116483116484116485116486116487116488116489116490116491116492116493116494116495116496116497116498116499116500116501116502116503116504116505116506116507116508116509116510116511116512116513116514116515116516116517116518116519116520116521116522116523116524116525116526116527116528116529116530116531116532116533116534116535116536116537116538116539116540116541116542116543116544116545116546116547116548116549116550116551116552116553116554116555116556116557116558116559116560116561116562116563116564116565116566116567116568116569116570116571116572116573116574116575116576116577116578116579116580116581116582116583116584116585116586116587116588116589116590116591116592116593116594116595116596116597116598116599116600116601116602116603116604116605116606116607116608116609116610116611116612116613116614116615116616116617116618116619116620116621116622116623116624116625116626116627116628116629116630116631116632116633116634116635116636116637116638116639116640116641116642116643116644116645116646116647116648116649116650116651116652116653116654116655116656116657116658116659116660116661116662116663116664116665116666116667116668116669116670116671116672116673116674116675116676116677116678116679116680116681116682116683116684116685116686116687116688116689116690116691116692116693116694116695116696116697116698116699116700116701116702116703116704116705116706116707116708116709116710116711116712116713116714116715116716116717116718116719116720116721116722116723116724116725116726116727116728116729116730116731116732116733116734116735116736116737116738116739116740116741116742116743116744116745116746116747116748116749116750116751116752116753116754116755116756116757116758116759116760116761116762116763116764116765116766116767116768116769116770116771116772116773116774116775116776116777116778116779116780116781116782116783116784116785116786116787116788116789116790116791116792116793116794116795116796116797116798116799116800116801116802116803116804116805116806116807116808116809116810116811116812116813116814116815116816116817116818116819116820116821116822116823116824116825116826116827116828116829116830116831116832116833116834116835116836116837116838116839116840116841116842116843116844116845116846116847116848116849116850116851116852116853116854116855116856116857116858116859116860116861116862116863116864116865116866116867116868116869116870116871116872116873116874116875116876116877116878116879116880116881116882116883116884116885116886116887116888116889116890116891116892116893116894116895116896116897116898116899116900116901116902116903116904116905116906116907116908116909116910116911116912116913116914116915116916116917116918116919116920116921116922116923116924116925116926116927116928116929116930116931116932116933116934116935116936116937116938116939116940116941116942116943116944116945116946116947116948116949116950116951116952116953116954116955116956116957116958116959116960116961116962116963116964116965116966116967116968116969116970116971116972116973116974116975116976116977116978116979116980116981116982116983116984116985116986116987116988116989116990116991116992116993116994116995116996116997116998116999117000117001117002117003117004117005117006117007117008117009117010117011117012117013117014117015117016117017117018117019117020117021117022117023117024117025117026117027117028117029117030117031117032117033117034117035117036117037117038117039117040117041117042117043117044117045117046117047117048117049117050117051117052117053117054117055117056117057117058117059117060117061117062117063117064117065117066117067117068117069117070117071117072117073117074117075117076117077117078117079117080117081117082117083117084117085117086117087117088117089117090117091117092117093117094117095117096117097117098117099117100117101117102117103117104117105117106117107117108117109117110117111117112117113117114117115117116117117117118117119117120117121117122117123117124117125117126117127117128117129117130117131117132117133117134117135117136117137117138117139117140117141117142117143117144117145117146117147117148117149117150117151117152117153117154117155117156117157117158117159117160117161117162117163117164117165117166117167117168117169117170117171117172117173117174117175117176117177117178117179117180117181117182117183117184117185117186117187117188117189117190117191117192117193117194117195117196117197117198117199117200117201117202117203117204117205117206117207117208117209117210117211117212117213117214117215117216117217117218117219117220117221117222117223117224117225117226117227117228117229117230117231117232117233117234117235117236117237117238117239117240117241117242117243117244117245117246117247117248117249117250117251117252117253117254117255117256117257117258117259117260117261117262117263117264117265117266117267117268117269117270117271117272117273117274117275117276117277117278117279117280117281117282117283117284117285117286117287117288117289117290117291117292117293117294117295117296117297117298117299117300117301117302117303117304117305117306117307117308117309117310117311117312117313117314117315117316117317117318117319117320117321117322117323117324117325117326117327117328117329117330117331117332117333117334117335117336117337117338117339117340117341117342117343117344117345117346117347117348117349117350117351117352117353117354117355117356117357117358117359117360117361117362117363117364117365117366117367117368117369117370117371117372117373117374117375117376117377117378117379117380117381117382117383117384117385117386117387117388117389117390117391117392117393117394117395117396117397117398117399117400117401117402117403117404117405117406117407117408117409117410117411117412117413117414117415117416117417117418117419117420117421117422117423117424117425117426117427117428117429117430117431117432117433117434117435117436117437117438117439117440117441117442117443117444117445117446117447117448117449117450117451117452117453117454117455117456117457117458117459117460117461117462117463117464117465117466117467117468117469117470117471117472117473117474117475117476117477117478117479117480117481117482117483117484117485117486117487117488117489117490117491117492117493117494117495117496117497117498117499117500117501117502117503117504117505117506117507117508117509117510117511117512117513117514117515117516117517117518117519117520117521117522117523117524117525117526117527117528117529117530117531117532117533117534117535117536117537117538117539117540117541117542117543117544117545117546117547117548117549117550117551117552117553117554117555117556117557117558117559117560117561117562117563117564117565117566117567117568117569117570117571117572117573117574117575117576117577117578117579117580117581117582117583117584117585117586117587117588117589117590117591117592117593117594117595117596117597117598117599117600117601117602117603117604117605117606117607117608117609117610117611117612117613117614117615117616117617117618117619117620117621117622117623117624117625117626117627117628117629117630117631117632117633117634117635117636117637117638117639117640117641117642117643117644117645117646117647117648117649117650117651117652117653117654117655117656117657117658117659117660117661117662117663117664117665117666117667117668117669117670117671117672117673117674117675117676117677117678117679117680117681117682117683117684117685117686117687117688117689117690117691117692117693117694117695117696117697117698117699117700117701117702117703117704117705117706117707117708117709117710117711117712117713117714117715117716117717117718117719117720117721117722117723117724117725117726117727117728117729117730117731117732117733117734117735117736117737117738117739117740117741117742117743117744117745117746117747117748117749117750117751117752117753117754117755117756117757117758117759117760117761117762117763117764117765117766117767117768117769117770117771117772117773117774117775117776117777117778117779117780117781117782117783117784117785117786117787117788117789117790117791117792117793117794117795117796117797117798117799117800117801117802117803117804117805117806117807117808117809117810117811117812117813117814117815117816117817117818117819117820117821117822117823117824117825117826117827117828117829117830117831117832117833117834117835117836117837117838117839117840117841117842117843117844117845117846117847117848117849117850117851117852117853117854117855117856117857117858117859117860117861117862117863117864117865117866117867117868117869117870117871117872117873117874117875117876117877117878117879117880117881117882117883117884117885117886117887117888117889117890117891117892117893117894117895117896117897117898117899117900117901117902117903117904117905117906117907117908117909117910117911117912117913117914117915117916117917117918117919117920117921117922117923117924117925117926117927117928117929117930117931117932117933117934117935117936117937117938117939117940117941117942117943117944117945117946117947117948117949117950117951117952117953117954117955117956117957117958117959117960117961117962117963117964117965117966117967117968117969117970117971117972117973117974117975117976117977117978117979117980117981117982117983117984117985117986117987117988117989117990117991117992117993117994117995117996117997117998117999118000118001118002118003118004118005118006118007118008118009118010118011118012118013118014118015118016118017118018118019118020118021118022118023118024118025118026118027118028118029118030118031118032118033118034118035118036118037118038118039118040118041118042118043118044118045118046118047118048118049118050118051118052118053118054118055118056118057118058118059118060118061118062118063118064118065118066118067118068118069118070118071118072118073118074118075118076118077118078118079118080118081118082118083118084118085118086118087118088118089118090118091118092118093118094118095118096118097118098118099118100118101118102118103118104118105118106118107118108118109118110118111118112118113118114118115118116118117118118118119118120118121118122118123118124118125118126118127118128118129118130118131118132118133118134118135118136118137118138118139118140118141118142118143118144118145118146118147118148118149118150118151118152118153118154118155118156118157118158118159118160118161118162118163118164118165118166118167118168118169118170118171118172118173118174118175118176118177118178118179118180118181118182118183118184118185118186118187118188118189118190118191118192118193118194118195118196118197118198118199118200118201118202118203118204118205118206118207118208118209118210118211118212118213118214118215118216118217118218118219118220118221118222118223118224118225118226118227118228118229118230118231118232118233118234118235118236118237118238118239118240118241118242118243118244118245118246118247118248118249118250118251118252118253118254118255118256118257118258118259118260118261118262118263118264118265118266118267118268118269118270118271118272118273118274118275118276118277118278118279118280118281118282118283118284118285118286118287118288118289118290118291118292118293118294118295118296118297118298118299118300118301118302118303118304118305118306118307118308118309118310118311118312118313118314118315118316118317118318118319118320118321118322118323118324118325118326118327118328118329118330118331118332118333118334118335118336118337118338118339118340118341118342118343118344118345118346118347118348118349118350118351118352118353118354118355118356118357118358118359118360118361118362118363118364118365118366118367118368118369118370118371118372118373118374118375118376118377118378118379118380118381118382118383118384118385118386118387118388118389118390118391118392118393118394118395118396118397118398118399118400118401118402118403118404118405118406118407118408118409118410118411118412118413118414118415118416118417118418118419118420118421118422118423118424118425118426118427118428118429118430118431118432118433118434118435118436118437118438118439118440118441118442118443118444118445118446118447118448118449118450118451118452118453118454118455118456118457118458118459118460118461118462118463118464118465118466118467118468118469118470118471118472118473118474118475118476118477118478118479118480118481118482118483118484118485118486118487118488118489118490118491118492118493118494118495118496118497118498118499118500118501118502118503118504118505118506118507118508118509118510118511118512118513118514118515118516118517118518118519118520118521118522118523118524118525118526118527118528118529118530118531118532118533118534118535118536118537118538118539118540118541118542118543118544118545118546118547118548118549118550118551118552118553118554118555118556118557118558118559118560118561118562118563118564118565118566118567118568118569118570118571118572118573118574118575118576118577118578118579118580118581118582118583118584118585118586118587118588118589118590118591118592118593118594118595118596118597118598118599118600118601118602118603118604118605118606118607118608118609118610118611118612118613118614118615118616118617118618118619118620118621118622118623118624118625118626118627118628118629118630118631118632118633118634118635118636118637118638118639118640118641118642118643118644118645118646118647118648118649118650118651118652118653118654118655118656118657118658118659118660118661118662118663118664118665118666118667118668118669118670118671118672118673118674118675118676118677118678118679118680118681118682118683118684118685118686118687118688118689118690118691118692118693118694118695118696118697118698118699118700118701118702118703118704118705118706118707118708118709118710118711118712118713118714118715118716118717118718118719118720118721118722118723118724118725118726118727118728118729118730118731118732118733118734118735118736118737118738118739118740118741118742118743118744118745118746118747118748118749118750118751118752118753118754118755118756118757118758118759118760118761118762118763118764118765118766118767118768118769118770118771118772118773118774118775118776118777118778118779118780118781118782118783118784118785118786118787118788118789118790118791118792118793118794118795118796118797118798118799118800118801118802118803118804118805118806118807118808118809118810118811118812118813118814118815118816118817118818118819118820118821118822118823118824118825118826118827118828118829118830118831118832118833118834118835118836118837118838118839118840118841118842118843118844118845118846118847118848118849118850118851118852118853118854118855118856118857118858118859118860118861118862118863118864118865118866118867118868118869118870118871118872118873118874118875118876118877118878118879118880118881118882118883118884118885118886118887118888118889118890118891118892118893118894118895118896118897118898118899118900118901118902118903118904118905118906118907118908118909118910118911118912118913118914118915118916118917118918118919118920118921118922118923118924118925118926118927118928118929118930118931118932118933118934118935118936118937118938118939118940118941118942118943118944118945118946118947118948118949118950118951118952118953118954118955118956118957118958118959118960118961118962118963118964118965118966118967118968118969118970118971118972118973118974118975118976118977118978118979118980118981118982118983118984118985118986118987118988118989118990118991118992118993118994118995118996118997118998118999119000119001119002119003119004119005119006119007119008119009119010119011119012119013119014119015119016119017119018119019119020119021119022119023119024119025119026119027119028119029119030119031119032119033119034119035119036119037119038119039119040119041119042119043119044119045119046119047119048119049119050119051119052119053119054119055119056119057119058119059119060119061119062119063119064119065119066119067119068119069119070119071119072119073119074119075119076119077119078119079119080119081119082119083119084119085119086119087119088119089119090119091119092119093119094119095119096119097119098119099119100119101119102119103119104119105119106119107119108119109119110119111119112119113119114119115119116119117119118119119119120119121119122119123119124119125119126119127119128119129119130119131119132119133119134119135119136119137119138119139119140119141119142119143119144119145119146119147119148119149119150119151119152119153119154119155119156119157119158119159119160119161119162119163119164119165119166119167119168119169119170119171119172119173119174119175119176119177119178119179119180119181119182119183119184119185119186119187119188119189119190119191119192119193119194119195119196119197119198119199119200119201119202119203119204119205119206119207119208119209119210119211119212119213119214119215119216119217119218119219119220119221119222119223119224119225119226119227119228119229119230119231119232119233119234119235119236119237119238119239119240119241119242119243119244119245119246119247119248119249119250119251119252119253119254119255119256119257119258119259119260119261119262119263119264119265119266119267119268119269119270119271119272119273119274119275119276119277119278119279119280119281119282119283119284119285119286119287119288119289119290119291119292119293119294119295119296119297119298119299119300119301119302119303119304119305119306119307119308119309119310119311119312119313119314119315119316119317119318119319119320119321119322119323119324119325119326119327119328119329119330119331119332119333119334119335119336119337119338119339119340119341119342119343119344119345119346119347119348119349119350119351119352119353119354119355119356119357119358119359119360119361119362119363119364119365119366119367119368119369119370119371119372119373119374119375119376119377119378119379119380119381119382119383119384119385119386119387119388119389119390119391119392119393119394119395119396119397119398119399119400119401119402119403119404119405119406119407119408119409119410119411119412119413119414119415119416119417119418119419119420119421119422119423119424119425119426119427119428119429119430119431119432119433119434119435119436119437119438119439119440119441119442119443119444119445119446119447119448119449119450119451119452119453119454119455119456119457119458119459119460119461119462119463119464119465119466119467119468119469119470119471119472119473119474119475119476119477119478119479119480119481119482119483119484119485119486119487119488119489119490119491119492119493119494119495119496119497119498119499119500119501119502119503119504119505119506119507119508119509119510119511119512119513119514119515119516119517119518119519119520119521119522119523119524119525119526119527119528119529119530119531119532119533119534119535119536119537119538119539119540119541119542119543119544119545119546119547119548119549119550119551119552119553119554119555119556119557119558119559119560119561119562119563119564119565119566119567119568119569119570119571119572119573119574119575119576119577119578119579119580119581119582119583119584119585119586119587119588119589119590119591119592119593119594119595119596119597119598119599119600119601119602119603119604119605119606119607119608119609119610119611119612119613119614119615119616119617119618119619119620119621119622119623119624119625119626119627119628119629119630119631119632119633119634119635119636119637119638119639119640119641119642119643119644119645119646119647119648119649119650119651119652119653119654119655119656119657119658119659119660119661119662119663119664119665119666119667119668119669119670119671119672119673119674119675119676119677119678119679119680119681119682119683119684119685119686119687119688119689119690119691119692119693119694119695119696119697119698119699119700119701119702119703119704119705119706119707119708119709119710119711119712119713119714119715119716119717119718119719119720119721119722119723119724119725119726119727119728119729119730119731119732119733119734119735119736119737119738119739119740119741119742119743119744119745119746119747119748119749119750119751119752119753119754119755119756119757119758119759119760119761119762119763119764119765119766119767119768119769119770119771119772119773119774119775119776119777119778119779119780119781119782119783119784119785119786119787119788119789119790119791119792119793119794119795119796119797119798119799119800119801119802119803119804119805119806119807119808119809119810119811119812119813119814119815119816119817119818119819119820119821119822119823119824119825119826119827119828119829119830119831119832119833119834119835119836119837119838119839119840119841119842119843119844119845119846119847119848119849119850119851119852119853119854119855119856119857119858119859119860119861119862119863119864119865119866119867119868119869119870119871119872119873119874119875119876119877119878119879119880119881119882119883119884119885119886119887119888119889119890119891119892119893119894119895119896119897119898119899119900119901119902119903119904119905119906119907119908119909119910119911119912119913119914119915119916119917119918119919119920119921119922119923119924119925119926119927119928119929119930119931119932119933119934119935119936119937119938119939119940119941119942119943119944119945119946119947119948119949119950119951119952119953119954119955119956119957119958119959119960119961119962119963119964119965119966119967119968119969119970119971119972119973119974119975119976119977119978119979119980119981119982119983119984119985119986119987119988119989119990119991119992119993119994119995119996119997119998119999120000120001120002120003120004120005120006120007120008120009120010120011120012120013120014120015120016120017120018120019120020120021120022120023120024120025120026120027120028120029120030120031120032120033120034120035120036120037120038120039120040120041120042120043120044120045120046120047120048120049120050120051120052120053120054120055120056120057120058120059120060120061120062120063120064120065120066120067120068120069120070120071120072120073120074120075120076120077120078120079120080120081120082120083120084120085120086120087120088120089120090120091120092120093120094120095120096120097120098120099120100120101120102120103120104120105120106120107120108120109120110120111120112120113120114120115120116120117120118120119120120120121120122120123120124120125120126120127120128120129120130120131120132120133120134120135120136120137120138120139120140120141120142120143120144120145120146120147120148120149120150120151120152120153120154120155120156120157120158120159120160120161120162120163120164120165120166120167120168120169120170120171120172120173120174120175120176120177120178120179120180120181120182120183120184120185120186120187120188120189120190120191120192120193120194120195120196120197120198120199120200120201120202120203120204120205120206120207120208120209120210120211120212120213120214120215120216120217120218120219120220120221120222120223120224120225120226120227120228120229120230120231120232120233120234120235120236120237120238120239120240120241120242120243120244120245120246120247120248120249120250120251120252120253120254120255120256120257120258120259120260120261120262120263120264120265120266120267120268120269120270120271120272120273120274120275120276120277120278120279120280120281120282120283120284120285120286120287120288120289120290120291120292120293120294120295120296120297120298120299120300120301120302120303120304120305120306120307120308120309120310120311120312120313120314120315120316120317120318120319120320120321120322120323120324120325120326120327120328120329120330120331120332120333120334120335120336120337120338120339120340120341120342120343120344120345120346120347120348120349120350120351120352120353120354120355120356120357120358120359120360120361120362120363120364120365120366120367120368120369120370120371120372120373120374120375120376120377120378120379120380120381120382120383120384120385120386120387120388120389120390120391120392120393120394120395120396120397120398120399120400120401120402120403120404120405120406120407120408120409120410120411120412120413120414120415120416120417120418120419120420120421120422120423120424120425120426120427120428120429120430120431120432120433120434120435120436120437120438120439120440120441120442120443120444120445120446120447120448120449120450120451120452120453120454120455120456120457120458120459120460120461120462120463120464120465120466120467120468120469120470120471120472120473120474120475120476120477120478120479120480120481120482120483120484120485120486120487120488120489120490120491120492120493120494120495120496120497120498120499120500120501120502120503120504120505120506120507120508120509120510120511120512120513120514120515120516120517120518120519120520120521120522120523120524120525120526120527120528120529120530120531120532120533120534120535120536120537120538120539120540120541120542120543120544120545120546120547120548120549120550120551120552120553120554120555120556120557120558120559120560120561120562120563120564120565120566120567120568120569120570120571120572120573120574120575120576120577120578120579120580120581120582120583120584120585120586120587120588120589120590120591120592120593120594120595120596120597120598120599120600120601120602120603120604120605120606120607120608120609120610120611120612120613120614120615120616120617120618120619120620120621120622120623120624120625120626120627120628120629120630120631120632120633120634120635120636120637120638120639120640120641120642120643120644120645120646120647120648120649120650120651120652120653120654120655120656120657120658120659120660120661120662120663120664120665120666120667120668120669120670120671120672120673120674120675120676120677120678120679120680120681120682120683120684120685120686120687120688120689120690120691120692120693120694120695120696120697120698120699120700120701120702120703120704120705120706120707120708120709120710120711120712120713120714120715120716120717120718120719120720120721120722120723120724120725120726120727120728120729120730120731120732120733120734120735120736120737120738120739120740120741120742120743120744120745120746120747120748120749120750120751120752120753120754120755120756120757120758120759120760120761120762120763120764120765120766120767120768120769120770120771120772120773120774120775120776120777120778120779120780120781120782120783120784120785120786120787120788120789120790120791120792120793120794120795120796120797120798120799120800120801120802120803120804120805120806120807120808120809120810120811120812120813120814120815120816120817120818120819120820120821120822120823120824120825120826120827120828120829120830120831120832120833120834120835120836120837120838120839120840120841120842120843120844120845120846120847120848120849120850120851120852120853120854120855120856120857120858120859120860120861120862120863120864120865120866120867120868120869120870120871120872120873120874120875120876120877120878120879120880120881120882120883120884120885120886120887120888120889120890120891120892120893120894120895120896120897120898120899120900120901120902120903120904120905120906120907120908120909120910120911120912120913120914120915120916120917120918120919120920120921120922120923120924120925120926120927120928120929120930120931120932120933120934120935120936120937120938120939120940120941120942120943120944120945120946120947120948120949120950120951120952120953120954120955120956120957120958120959120960120961120962120963120964120965120966120967120968120969120970120971120972120973120974120975120976120977120978120979120980120981120982120983120984120985120986120987120988120989120990120991120992120993120994120995120996120997120998120999121000121001121002121003121004121005121006121007121008121009121010121011121012121013121014121015121016121017121018121019121020121021121022121023121024121025121026121027121028121029121030121031121032121033121034121035121036121037121038121039121040121041121042121043121044121045121046121047121048121049121050121051121052121053121054121055121056121057121058121059121060121061121062121063121064121065121066121067121068121069121070121071121072121073121074121075121076121077121078121079121080121081121082121083121084121085121086121087121088121089121090121091121092121093121094121095121096121097121098121099121100121101121102121103121104121105121106121107121108121109121110121111121112121113121114121115121116121117121118121119121120121121121122121123121124121125121126121127121128121129121130121131121132121133121134121135121136121137121138121139121140121141121142121143121144121145121146121147121148121149121150121151121152121153121154121155121156121157121158121159121160121161121162121163121164121165121166121167121168121169121170121171121172121173121174121175121176121177121178121179121180121181121182121183121184121185121186121187121188121189121190121191121192121193121194121195121196121197121198121199121200121201121202121203121204121205121206121207121208121209121210121211121212121213121214121215121216121217121218121219121220121221121222121223121224121225121226121227121228121229121230121231121232121233121234121235121236121237121238121239121240121241121242121243121244121245121246121247121248121249121250121251121252121253121254121255121256121257121258121259121260121261121262121263121264121265121266121267121268121269121270121271121272121273121274121275121276121277121278121279121280121281121282121283121284121285121286121287121288121289121290121291121292121293121294121295121296121297121298121299121300121301121302121303121304121305121306121307121308121309121310121311121312121313121314121315121316121317121318121319121320121321121322121323121324121325121326121327121328121329121330121331121332121333121334121335121336121337121338121339121340121341121342121343121344121345121346121347121348121349121350121351121352121353121354121355121356121357121358121359121360121361121362121363121364121365121366121367121368121369121370121371121372121373121374121375121376121377121378121379121380121381121382121383121384121385121386121387121388121389121390121391121392121393121394121395121396121397121398121399121400121401121402121403121404121405121406121407121408121409121410121411121412121413121414121415121416121417121418121419121420121421121422121423121424121425121426121427121428121429121430121431121432121433121434121435121436121437121438121439121440121441121442121443121444121445121446121447121448121449121450121451121452121453121454121455121456121457121458121459121460121461121462121463121464121465121466121467121468121469121470121471121472121473121474121475121476121477121478121479121480121481121482121483121484121485121486121487121488121489121490121491121492121493121494121495121496121497121498121499121500121501121502121503121504121505121506121507121508121509121510121511121512121513121514121515121516121517121518121519121520121521121522121523121524121525121526121527121528121529121530121531121532121533121534121535121536121537121538121539121540121541121542121543121544121545121546121547121548121549121550121551121552121553121554121555121556121557121558121559121560121561121562121563121564121565121566121567121568121569121570121571121572121573121574121575121576121577121578121579121580121581121582121583121584121585121586121587121588121589121590121591121592121593121594121595121596121597121598121599121600121601121602121603121604121605121606121607121608121609121610121611121612121613121614121615121616121617121618121619121620121621121622121623121624121625121626121627121628121629121630121631121632121633121634121635121636121637121638121639121640121641121642121643121644121645121646121647121648121649121650121651121652121653121654121655121656121657121658121659121660121661121662121663121664121665121666121667121668121669121670121671121672121673121674121675121676121677121678121679121680121681121682121683121684121685121686121687121688121689121690121691121692121693121694121695121696121697121698121699121700121701121702121703121704121705121706121707121708121709121710121711121712121713121714121715121716121717121718121719121720121721121722121723121724121725121726121727121728121729121730121731121732121733121734121735121736121737121738121739121740121741121742121743121744121745121746121747121748121749121750121751121752121753121754121755121756121757121758121759121760121761121762121763121764121765121766121767121768121769121770121771121772121773121774121775121776121777121778121779121780121781121782121783121784121785121786121787121788121789121790121791121792121793121794121795121796121797121798121799121800121801121802121803121804121805121806121807121808121809121810121811121812121813121814121815121816121817121818121819121820121821121822121823121824121825121826121827121828121829121830121831121832121833121834121835121836121837121838121839121840121841121842121843121844121845121846121847121848121849121850121851121852121853121854121855121856121857121858121859121860121861121862121863121864121865121866121867121868121869121870121871121872121873121874121875121876121877121878121879121880121881121882121883121884121885121886121887121888121889121890121891121892121893121894121895121896121897121898121899121900121901121902121903121904121905121906121907121908121909121910121911121912121913121914121915121916121917121918121919121920121921121922121923121924121925121926121927121928121929121930121931121932121933121934121935121936121937121938121939121940121941121942121943121944121945121946121947121948121949121950121951121952121953121954121955121956121957121958121959121960121961121962121963121964121965121966121967121968121969121970121971121972121973121974121975121976121977121978121979121980121981121982121983121984121985121986121987121988121989121990121991121992121993121994121995121996121997121998121999122000122001122002122003122004122005122006122007122008122009122010122011122012122013122014122015122016122017122018122019122020122021122022122023122024122025122026122027122028122029122030122031122032122033122034122035122036122037122038122039122040122041122042122043122044122045122046122047122048122049122050122051122052122053122054122055122056122057122058122059122060122061122062122063122064122065122066122067122068122069122070122071122072122073122074122075122076122077122078122079122080122081122082122083122084122085122086122087122088122089122090122091122092122093122094122095122096122097122098122099122100122101122102122103122104122105122106122107122108122109122110122111122112122113122114122115122116122117122118122119122120122121122122122123122124122125122126122127122128122129122130122131122132122133122134122135122136122137122138122139122140122141122142122143122144122145122146122147122148122149122150122151122152122153122154122155122156122157122158122159122160122161122162122163122164122165122166122167122168122169122170122171122172122173122174122175122176122177122178122179122180122181122182122183122184122185122186122187122188122189122190122191122192122193122194122195122196122197122198122199122200122201122202122203122204122205122206122207122208122209122210122211122212122213122214122215122216122217122218122219122220122221122222122223122224122225122226122227122228122229122230122231122232122233122234122235122236122237122238122239122240122241122242122243122244122245122246122247122248122249122250122251122252122253122254122255122256122257122258122259122260122261122262122263122264122265122266122267122268122269122270122271122272122273122274122275122276122277122278122279122280122281122282122283122284122285122286122287122288122289122290122291122292122293122294122295122296122297122298122299122300122301122302122303122304122305122306122307122308122309122310122311122312122313122314122315122316122317122318122319122320122321122322122323122324122325122326122327122328122329122330122331122332122333122334122335122336122337122338122339122340122341122342122343122344122345122346122347122348122349122350122351122352122353122354122355122356122357122358122359122360122361122362122363122364122365122366122367122368122369122370122371122372122373122374122375122376122377122378122379122380122381122382122383122384122385122386122387122388122389122390122391122392122393122394122395122396122397122398122399122400122401122402122403122404122405122406122407122408122409122410122411122412122413122414122415122416122417122418122419122420122421122422122423122424122425122426122427122428122429122430122431122432122433122434122435122436122437122438122439122440122441122442122443122444122445122446122447122448122449122450122451122452122453122454122455122456122457122458122459122460122461122462122463122464122465122466122467122468122469122470122471122472122473122474122475122476122477122478122479122480122481122482122483122484122485122486122487122488122489122490122491122492122493122494122495122496122497122498122499122500122501122502122503122504122505122506122507122508122509122510122511122512122513122514122515122516122517122518122519122520122521122522122523122524122525122526122527122528122529122530122531122532122533122534122535122536122537122538122539122540122541122542122543122544122545122546122547122548122549122550122551122552122553122554122555122556122557122558122559122560122561122562122563122564122565122566122567122568122569122570122571122572122573122574122575122576122577122578122579122580122581122582122583122584122585122586122587122588122589122590122591122592122593122594122595122596122597122598122599122600122601122602122603122604122605122606122607122608122609122610122611122612122613122614122615122616122617122618122619122620122621122622122623122624122625122626122627122628122629122630122631122632122633122634122635122636122637122638122639122640122641122642122643122644122645122646122647122648122649122650122651122652122653122654122655122656122657122658122659122660122661122662122663122664122665122666122667122668122669122670122671122672122673122674122675122676122677122678122679122680122681122682122683122684122685122686122687122688122689122690122691122692122693122694122695122696122697122698122699122700122701122702122703122704122705122706122707122708122709122710122711122712122713122714122715122716122717122718122719122720122721122722122723122724122725122726122727122728122729122730122731122732122733122734122735122736122737122738122739122740122741122742122743122744122745122746122747122748122749122750122751122752122753122754122755122756122757122758122759122760122761122762122763122764122765122766122767122768122769122770122771122772122773122774122775122776122777122778122779122780122781122782122783122784122785122786122787122788122789122790122791122792122793122794122795122796122797122798122799122800122801122802122803122804122805122806122807122808122809122810122811122812122813122814122815122816122817122818122819122820122821122822122823122824122825122826122827122828122829122830122831122832122833122834122835122836122837122838122839122840122841122842122843122844122845122846122847122848122849122850122851122852122853122854122855122856122857122858122859122860122861122862122863122864122865122866122867122868122869122870122871122872122873122874122875122876122877122878122879122880122881122882122883122884122885122886122887122888122889122890122891122892122893122894122895122896122897122898122899122900122901122902122903122904122905122906122907122908122909122910122911122912122913122914122915122916122917122918122919122920122921122922122923122924122925122926122927122928122929122930122931122932122933122934122935122936122937122938122939122940122941122942122943122944122945122946122947122948122949122950122951122952122953122954122955122956122957122958122959122960122961122962122963122964122965122966122967122968122969122970122971122972122973122974122975122976122977122978122979122980122981122982122983122984122985122986122987122988122989122990122991122992122993122994122995122996122997122998122999123000123001123002123003123004123005123006123007123008123009123010123011123012123013123014123015123016123017123018123019123020123021123022123023123024123025123026123027123028123029123030123031123032123033123034123035123036123037123038123039123040123041123042123043123044123045123046123047123048123049123050123051123052123053123054123055123056123057123058123059123060123061123062123063123064123065123066123067123068123069123070123071123072123073123074123075123076123077123078123079123080123081123082123083123084123085123086123087123088123089123090123091123092123093123094123095123096123097123098123099123100123101123102123103123104123105123106123107123108123109123110123111123112123113123114123115123116123117123118123119123120123121123122123123123124123125123126123127123128123129123130123131123132123133123134123135123136123137123138123139123140123141123142123143123144123145123146123147123148123149123150123151123152123153123154123155123156123157123158123159123160123161123162123163123164123165123166123167123168123169123170123171123172123173123174123175123176123177123178123179123180123181123182123183123184123185123186123187123188123189123190123191123192123193123194123195123196123197123198123199123200123201123202123203123204123205123206123207123208123209123210123211123212123213123214123215123216123217123218123219123220123221123222123223123224123225123226123227123228123229123230123231123232123233123234123235123236123237123238123239123240123241123242123243123244123245123246123247123248123249123250123251123252123253123254123255123256123257123258123259123260123261123262123263123264123265123266123267123268123269123270123271123272123273123274123275123276123277123278123279123280123281123282123283123284123285123286123287123288123289123290123291123292123293123294123295123296123297123298123299123300123301123302123303123304123305123306123307123308123309123310123311123312123313123314123315123316123317123318123319123320123321123322123323123324123325123326123327123328123329123330123331123332123333123334123335123336123337123338123339123340123341123342123343123344123345123346123347123348123349123350123351123352123353123354123355123356123357123358123359123360123361123362123363123364123365123366123367123368123369123370123371123372123373123374123375123376123377123378123379123380123381123382123383123384123385123386123387123388123389123390123391123392123393123394123395123396123397123398123399123400123401123402123403123404123405123406123407123408123409123410123411123412123413123414123415123416123417123418123419123420123421123422123423123424123425123426123427123428123429123430123431123432123433123434123435123436123437123438123439123440123441123442123443123444123445123446123447123448123449123450123451123452123453123454123455123456123457123458123459123460123461123462123463123464123465123466123467123468123469123470123471123472123473123474123475123476123477123478123479123480123481123482123483123484123485123486123487123488123489123490123491123492123493123494123495123496123497123498123499123500123501123502123503123504123505123506123507123508123509123510123511123512123513123514123515123516123517123518123519123520123521123522123523123524123525123526123527123528123529123530123531123532123533123534123535123536123537123538123539123540123541123542123543123544123545123546123547123548123549123550123551123552123553123554123555123556123557123558123559123560123561123562123563123564123565123566123567123568123569123570123571123572123573123574123575123576123577123578123579123580123581123582123583123584123585123586123587123588123589123590123591123592123593123594123595123596123597123598123599123600123601123602123603123604123605123606123607123608123609123610123611123612123613123614123615123616123617123618123619123620123621123622123623123624123625123626123627123628123629123630123631123632123633123634123635123636123637123638123639123640123641123642123643123644123645123646123647123648123649123650123651123652123653123654123655123656123657123658123659123660123661123662123663123664123665123666123667123668123669123670123671123672123673123674123675123676123677123678123679123680123681123682123683123684123685123686123687123688123689123690123691123692123693123694123695123696123697123698123699123700123701123702123703123704123705123706123707123708123709123710123711123712123713123714123715123716123717123718123719123720123721123722123723123724123725123726123727123728123729123730123731123732123733123734123735123736123737123738123739123740123741123742123743123744123745123746123747123748123749123750123751123752123753123754123755123756123757123758123759123760123761123762123763123764123765123766123767123768123769123770123771123772123773123774123775123776123777123778123779123780123781123782123783123784123785123786123787123788123789123790123791123792123793123794123795123796123797123798123799123800123801123802123803123804123805123806123807123808123809123810123811123812123813123814123815123816123817123818123819123820123821123822123823123824123825123826123827123828123829123830123831123832123833123834123835123836123837123838123839123840123841123842123843123844123845123846123847123848123849123850123851123852123853123854123855123856123857123858123859123860123861123862123863123864123865123866123867123868123869123870123871123872123873123874123875123876123877123878123879123880123881123882123883123884123885123886123887123888123889123890123891123892123893123894123895123896123897123898123899123900123901123902123903123904123905123906123907123908123909123910123911123912123913123914123915123916123917123918123919123920123921123922123923123924123925123926123927123928123929123930123931123932123933123934123935123936123937123938123939123940123941123942123943123944123945123946123947123948123949123950123951123952123953123954123955123956123957123958123959123960123961123962123963123964123965123966123967123968123969123970123971123972123973123974123975123976123977123978123979123980123981123982123983123984123985123986123987123988123989123990123991123992123993123994123995123996123997123998123999124000124001124002124003124004124005124006124007124008124009124010124011124012124013124014124015124016124017124018124019124020124021124022124023124024124025124026124027124028124029124030124031124032124033124034124035124036124037124038124039124040124041124042124043124044124045124046124047124048124049124050124051124052124053124054124055124056124057124058124059124060124061124062124063124064124065124066124067124068124069124070124071124072124073124074124075124076124077124078124079124080124081124082124083124084124085124086124087124088124089124090124091124092124093124094124095124096124097124098124099124100124101124102124103124104124105124106124107124108124109124110124111124112124113124114124115124116124117124118124119124120124121124122124123124124124125124126124127124128124129124130124131124132124133124134124135124136124137124138124139124140124141124142124143124144124145124146124147124148124149124150124151124152124153124154124155124156124157124158124159124160124161124162124163124164124165124166124167124168124169124170124171124172124173124174124175124176124177124178124179124180124181124182124183124184124185124186124187124188124189124190124191124192124193124194124195124196124197124198124199124200124201124202124203124204124205124206124207124208124209124210124211124212124213124214124215124216124217124218124219124220124221124222124223124224124225124226124227124228124229124230124231124232124233124234124235124236124237124238124239124240124241124242124243124244124245124246124247124248124249124250124251124252124253124254124255124256124257124258124259124260124261124262124263124264124265124266124267124268124269124270124271124272124273124274124275124276124277124278124279124280124281124282124283124284124285124286124287124288124289124290124291124292124293124294124295124296124297124298124299124300124301124302124303124304124305124306124307124308124309124310124311124312124313124314124315124316124317124318124319124320124321124322124323124324124325124326124327124328124329124330124331124332124333124334124335124336124337124338124339124340124341124342124343124344124345124346124347124348124349124350124351124352124353124354124355124356124357124358124359124360124361124362124363124364124365124366124367124368124369124370124371124372124373124374124375124376124377124378124379124380124381124382124383124384124385124386124387124388124389124390124391124392124393124394124395124396124397124398124399124400124401124402124403124404124405124406124407124408124409124410124411124412124413124414124415124416124417124418124419124420124421124422124423124424124425124426124427124428124429124430124431124432124433124434124435124436124437124438124439124440124441124442124443124444124445124446124447124448124449124450124451124452124453124454124455124456124457124458124459124460124461124462124463124464124465124466124467124468124469124470124471124472124473124474124475124476124477124478124479124480124481124482124483124484124485124486124487124488124489124490124491124492124493124494124495124496124497124498124499124500124501124502124503124504124505124506124507124508124509124510124511124512124513124514124515124516124517124518124519124520124521124522124523124524124525124526124527124528124529124530124531124532124533124534124535124536124537124538124539124540124541124542124543124544124545124546124547124548124549124550124551124552124553124554124555124556124557124558124559124560124561124562124563124564124565124566124567124568124569124570124571124572124573124574124575124576124577124578124579124580124581124582124583124584124585124586124587124588124589124590124591124592124593124594124595124596124597124598124599124600124601124602124603124604124605124606124607124608124609124610124611124612124613124614124615124616124617124618124619124620124621124622124623124624124625124626124627124628124629124630124631124632124633124634124635124636124637124638124639124640124641124642124643124644124645124646124647124648124649124650124651124652124653124654124655124656124657124658124659124660124661124662124663124664124665124666124667124668124669124670124671124672124673124674124675124676124677124678124679124680124681124682124683124684124685124686124687124688124689124690124691124692124693124694124695124696124697124698124699124700124701124702124703124704124705124706124707124708124709124710124711124712124713124714124715124716124717124718124719124720124721124722124723124724124725124726124727124728124729124730124731124732124733124734124735124736124737124738124739124740124741124742124743124744124745124746124747124748124749124750124751124752124753124754124755124756124757124758124759124760124761124762124763124764124765124766124767124768124769124770124771124772124773124774124775124776124777124778124779124780124781124782124783124784124785124786124787124788124789124790124791124792124793124794124795124796124797124798124799124800124801124802124803124804124805124806124807124808124809124810124811124812124813124814124815124816124817124818124819124820124821124822124823124824124825124826124827124828124829124830124831124832124833124834124835124836124837124838124839124840124841124842124843124844124845124846124847124848124849124850124851124852124853124854124855124856124857124858124859124860124861124862124863124864124865124866124867124868124869124870124871124872124873124874124875124876124877124878124879124880124881124882124883124884124885124886124887124888124889124890124891124892124893124894124895124896124897124898124899124900124901124902124903124904124905124906124907124908124909124910124911124912124913124914124915124916124917124918124919124920124921124922124923124924124925124926124927124928124929124930124931124932124933124934124935124936124937124938124939124940124941124942124943124944124945124946124947124948124949124950124951124952124953124954124955124956124957124958124959124960124961124962124963124964124965124966124967124968124969124970124971124972124973124974124975124976124977124978124979124980124981124982124983124984124985124986124987124988124989124990124991124992124993124994124995124996124997124998124999125000125001125002125003125004125005125006125007125008125009125010125011125012125013125014125015125016125017125018125019125020125021125022125023125024125025125026125027125028125029125030125031125032125033125034125035125036125037125038125039125040125041125042125043125044125045125046125047125048125049125050125051125052125053125054125055125056125057125058125059125060125061125062125063125064125065125066125067125068125069125070125071125072125073125074125075125076125077125078125079125080125081125082125083125084125085125086125087125088125089125090125091125092125093125094125095125096125097125098125099125100125101125102125103125104125105125106125107125108125109125110125111125112125113125114125115125116125117125118125119125120125121125122125123125124125125125126125127125128125129125130125131125132125133125134125135125136125137125138125139125140125141125142125143125144125145125146125147125148125149125150125151125152125153125154125155125156125157125158125159125160125161125162125163125164125165125166125167125168125169125170125171125172125173125174125175125176125177125178125179125180125181125182125183125184125185125186125187125188125189125190125191125192125193125194125195125196125197125198125199125200125201125202125203125204125205125206125207125208125209125210125211125212125213125214125215125216125217125218125219125220125221125222125223125224125225125226125227125228125229125230125231125232125233125234125235125236125237125238125239125240125241125242125243125244125245125246125247125248125249125250125251125252125253125254125255125256125257125258125259125260125261125262125263125264125265125266125267125268125269125270125271125272125273125274125275125276125277125278125279125280125281125282125283125284125285125286125287125288125289125290125291125292125293125294125295125296125297125298125299125300125301125302125303125304125305125306125307125308125309125310125311125312125313125314125315125316125317125318125319125320125321125322125323125324125325125326125327125328125329125330125331125332125333125334125335125336125337125338125339125340125341125342125343125344125345125346125347125348125349125350125351125352125353125354125355125356125357125358125359125360125361125362125363125364125365125366125367125368125369125370125371125372125373125374125375125376125377125378125379125380125381125382125383125384125385125386125387125388125389125390125391125392125393125394125395125396125397125398125399125400125401125402125403125404125405125406125407125408125409125410125411125412125413125414125415125416125417125418125419125420125421125422125423125424125425125426125427125428125429125430125431125432125433125434125435125436125437125438125439125440125441125442125443125444125445125446125447125448125449125450125451125452125453125454125455125456125457125458125459125460125461125462125463125464125465125466125467125468125469125470125471125472125473125474125475125476125477125478125479125480125481125482125483125484125485125486125487125488125489125490125491125492125493125494125495125496125497125498125499125500125501125502125503125504125505125506125507125508125509125510125511125512125513125514125515125516125517125518125519125520125521125522125523125524125525125526125527125528125529125530125531125532125533125534125535125536125537125538125539125540125541125542125543125544125545125546125547125548125549125550125551125552125553125554125555125556125557125558125559125560125561125562125563125564125565125566125567125568125569125570125571125572125573125574125575125576125577125578125579125580125581125582125583125584125585125586125587125588125589125590125591125592125593125594125595125596125597125598125599125600125601125602125603125604125605125606125607125608125609125610125611125612125613125614125615125616125617125618125619125620125621125622125623125624125625125626125627125628125629125630125631125632125633125634125635125636125637125638125639125640125641125642125643125644125645125646125647125648125649125650125651125652125653125654125655125656125657125658125659125660125661125662125663125664125665125666125667125668125669125670125671125672125673125674125675125676125677125678125679125680125681125682125683125684125685125686125687125688125689125690125691125692125693125694125695125696125697125698125699125700125701125702125703125704125705125706125707125708125709125710125711125712125713125714125715125716125717125718125719125720125721125722125723125724125725125726125727125728125729125730125731125732125733125734125735125736125737125738125739125740125741125742125743125744125745125746125747125748125749125750125751125752125753125754125755125756125757125758125759125760125761125762125763125764125765125766125767125768125769125770125771125772125773125774125775125776125777125778125779125780125781125782125783125784125785125786125787125788125789125790125791125792125793125794125795125796125797125798125799125800125801125802125803125804125805125806125807125808125809125810125811125812125813125814125815125816125817125818125819125820125821125822125823125824125825125826125827125828125829125830125831125832125833125834125835125836125837125838125839125840125841125842125843125844125845125846125847125848125849125850125851125852125853125854125855125856125857125858125859125860125861125862125863125864125865125866125867125868125869125870125871125872125873125874125875125876125877125878125879125880125881125882125883125884125885125886125887125888125889125890125891125892125893125894125895125896125897125898125899125900125901125902125903125904125905125906125907125908125909125910125911125912125913125914125915125916125917125918125919125920125921125922125923125924125925125926125927125928125929125930125931125932125933125934125935125936125937125938125939125940125941125942125943125944125945125946125947125948125949125950125951125952125953125954125955125956125957125958125959125960125961125962125963125964125965125966125967125968125969125970125971125972125973125974125975125976125977125978125979125980125981125982125983125984125985125986125987125988125989125990125991125992125993125994125995125996125997125998125999126000126001126002126003126004126005126006126007126008126009126010126011126012126013126014126015126016126017126018126019126020126021126022126023126024126025126026126027126028126029126030126031126032126033126034126035126036126037126038126039126040126041126042126043126044126045126046126047126048126049126050126051126052126053126054126055126056126057126058126059126060126061126062126063126064126065126066126067126068126069126070126071126072126073126074126075126076126077126078126079126080126081126082126083126084126085126086126087126088126089126090126091126092126093126094126095126096126097126098126099126100126101126102126103126104126105126106126107126108126109126110126111126112126113126114126115126116126117126118126119126120126121126122126123126124126125126126126127126128126129126130126131126132126133126134126135126136126137126138126139126140126141126142126143126144126145126146126147126148126149126150126151126152126153126154126155126156126157126158126159126160126161126162126163126164126165126166126167126168126169126170126171126172126173126174126175126176126177126178126179126180126181126182126183126184126185126186126187126188126189126190126191126192126193126194126195126196126197126198126199126200126201126202126203126204126205126206126207126208126209126210126211126212126213126214126215126216126217126218126219126220126221126222126223126224126225126226126227126228126229126230126231126232126233126234126235126236126237126238126239126240126241126242126243126244126245126246126247126248126249126250126251126252126253126254126255126256126257126258126259126260126261126262126263126264126265126266126267126268126269126270126271126272126273126274126275126276126277126278126279126280126281126282126283126284126285126286126287126288126289126290126291126292126293126294126295126296126297126298126299126300126301126302126303126304126305126306126307126308126309126310126311126312126313126314126315126316126317126318126319126320126321126322126323126324126325126326126327126328126329126330126331126332126333126334126335126336126337126338126339126340126341126342126343126344126345126346126347126348126349126350126351126352126353126354126355126356126357126358126359126360126361126362126363126364126365126366126367126368126369126370126371126372126373126374126375126376126377126378126379126380126381126382126383126384126385126386126387126388126389126390126391126392126393126394126395126396126397126398126399126400126401126402126403126404126405126406126407126408126409126410126411126412126413126414126415126416126417126418126419126420126421126422126423126424126425126426126427126428126429126430126431126432126433126434126435126436126437126438126439126440126441126442126443126444126445126446126447126448126449126450126451126452126453126454126455126456126457126458126459126460126461126462126463126464126465126466126467126468126469126470126471126472126473126474126475126476126477126478126479126480126481126482126483126484126485126486126487126488126489126490126491126492126493126494126495126496126497126498126499126500126501126502126503126504126505126506126507126508126509126510126511126512126513126514126515126516126517126518126519126520126521126522126523126524126525126526126527126528126529126530126531126532126533126534126535126536126537126538126539126540126541126542126543126544126545126546126547126548126549126550126551126552126553126554126555126556126557126558126559126560126561126562126563126564126565126566126567126568126569126570126571126572126573126574126575126576126577126578126579126580126581126582126583126584126585126586126587126588126589126590126591126592126593126594126595126596126597126598126599126600126601126602126603126604126605126606126607126608126609126610126611126612126613126614126615126616126617126618126619126620126621126622126623126624126625126626126627126628126629126630126631126632126633126634126635126636126637126638126639126640126641126642126643126644126645126646126647126648126649126650126651126652126653126654126655126656126657126658126659126660126661126662126663126664126665126666126667126668126669126670126671126672126673126674126675126676126677126678126679126680126681126682126683126684126685126686126687126688126689126690126691126692126693126694126695126696126697126698126699126700126701126702126703126704126705126706126707126708126709126710126711126712126713126714126715126716126717126718126719126720126721126722126723126724126725126726126727126728126729126730126731126732126733126734126735126736126737126738126739126740126741126742126743126744126745126746126747126748126749126750126751126752126753126754126755126756126757126758126759126760126761126762126763126764126765126766126767126768126769126770126771126772126773126774126775126776126777126778126779126780126781126782126783126784126785126786126787126788126789126790126791126792126793126794126795126796126797126798126799126800126801126802126803126804126805126806126807126808126809126810126811126812126813126814126815126816126817126818126819126820126821126822126823126824126825126826126827126828126829126830126831126832126833126834126835126836126837126838126839126840126841126842126843126844126845126846126847126848126849126850126851126852126853126854126855126856126857126858126859126860126861126862126863126864126865126866126867126868126869126870126871126872126873126874126875126876126877126878126879126880126881126882126883126884126885126886126887126888126889126890126891126892126893126894126895126896126897126898126899126900126901126902126903126904126905126906126907126908126909126910126911126912126913126914126915126916126917126918126919126920126921126922126923126924126925126926126927126928126929126930126931126932126933126934126935126936126937126938126939126940126941126942126943126944126945126946126947126948126949126950126951126952126953126954126955126956126957126958126959126960126961126962126963126964126965126966126967126968126969126970126971126972126973126974126975126976126977126978126979126980126981126982126983126984126985126986126987126988126989126990126991126992126993126994126995126996126997126998126999127000127001127002127003127004127005127006127007127008127009127010127011127012127013127014127015127016127017127018127019127020127021127022127023127024127025127026127027127028127029127030127031127032127033127034127035127036127037127038127039127040127041127042127043127044127045127046127047127048127049127050127051127052127053127054127055127056127057127058127059127060127061127062127063127064127065127066127067127068127069127070127071127072127073127074127075127076127077127078127079127080127081127082127083127084127085127086127087127088127089127090127091127092127093127094127095127096127097127098127099127100127101127102127103127104127105127106127107127108127109127110127111127112127113127114127115127116127117127118127119127120127121127122127123127124127125127126127127127128127129127130127131127132127133127134127135127136127137127138127139127140127141127142127143127144127145127146127147127148127149127150127151127152127153127154127155127156127157127158127159127160127161127162127163127164127165127166127167127168127169127170127171127172127173127174127175127176127177127178127179127180127181127182127183127184127185127186127187127188127189127190127191127192127193127194127195127196127197127198127199127200127201127202127203127204127205127206127207127208127209127210127211127212127213127214127215127216127217127218127219127220127221127222127223127224127225127226127227127228127229127230127231127232127233127234127235127236127237127238127239127240127241127242127243127244127245127246127247127248127249127250127251127252127253127254127255127256127257127258127259127260127261127262127263127264127265127266127267127268127269127270127271127272127273127274127275127276127277127278127279127280127281127282127283127284127285127286127287127288127289127290127291127292127293127294127295127296127297127298127299127300127301127302127303127304127305127306127307127308127309127310127311127312127313127314127315127316127317127318127319127320127321127322127323127324127325127326127327127328127329127330127331127332127333127334127335127336127337127338127339127340127341127342127343127344127345127346127347127348127349127350127351127352127353127354127355127356127357127358127359127360127361127362127363127364127365127366127367127368127369127370127371127372127373127374127375127376127377127378127379127380127381127382127383127384127385127386127387127388127389127390127391127392127393127394127395127396127397127398127399127400127401127402127403127404127405127406127407127408127409127410127411127412127413127414127415127416127417127418127419127420127421127422127423127424127425127426127427127428127429127430127431127432127433127434127435127436127437127438127439127440127441127442127443127444127445127446127447127448127449127450127451127452127453127454127455127456127457127458127459127460127461127462127463127464127465127466127467127468127469127470127471127472127473127474127475127476127477127478127479127480127481127482127483127484127485127486127487127488127489127490127491127492127493127494127495127496127497127498127499127500127501127502127503127504127505127506127507127508127509127510127511127512127513127514127515127516127517127518127519127520127521127522127523127524127525127526127527127528127529127530127531127532127533127534127535127536127537127538127539127540127541127542127543127544127545127546127547127548127549127550127551127552127553127554127555127556127557127558127559127560127561127562127563127564127565127566127567127568127569127570127571127572127573127574127575127576127577127578127579127580127581127582127583127584127585127586127587127588127589127590127591127592127593127594127595127596127597127598127599127600127601127602127603127604127605127606127607127608127609127610127611127612127613127614127615127616127617127618127619127620127621127622127623127624127625127626127627127628127629127630127631127632127633127634127635127636127637127638127639127640127641127642127643127644127645127646127647127648127649127650127651127652127653127654127655127656127657127658127659127660127661127662127663127664127665127666127667127668127669127670127671127672127673127674127675127676127677127678127679127680127681127682127683127684127685127686127687127688127689127690127691127692127693127694127695127696127697127698127699127700127701127702127703127704127705127706127707127708127709127710127711127712127713127714127715127716127717127718127719127720127721127722127723127724127725127726127727127728127729127730127731127732127733127734127735127736127737127738127739127740127741127742127743127744127745127746127747127748127749127750127751127752127753127754127755127756127757127758127759127760127761127762127763127764127765127766127767127768127769127770127771127772127773127774127775127776127777127778127779127780127781127782127783127784127785127786127787127788127789127790127791127792127793127794127795127796127797127798127799127800127801127802127803127804127805127806127807127808127809127810127811127812127813127814127815127816127817127818127819127820127821127822127823127824127825127826127827127828127829127830127831127832127833127834127835127836127837127838127839127840127841127842127843127844127845127846127847127848127849127850127851127852127853127854127855127856127857127858127859127860127861127862127863127864127865127866127867127868127869127870127871127872127873127874127875127876127877127878127879127880127881127882127883127884127885127886127887127888127889127890127891127892127893127894127895127896127897127898127899127900127901127902127903127904127905127906127907127908127909127910127911127912127913127914127915127916127917127918127919127920127921127922127923127924127925127926127927127928127929127930127931127932127933127934127935127936127937127938127939127940127941127942127943127944127945127946127947127948127949127950127951127952127953127954127955127956127957127958127959127960127961127962127963127964127965127966127967127968127969127970127971127972127973127974127975127976127977127978127979127980127981127982127983127984127985127986127987127988127989127990127991127992127993127994127995127996127997127998127999128000128001128002128003128004128005128006128007128008128009128010128011128012128013128014128015128016128017128018128019128020128021128022128023128024128025128026128027128028128029128030128031128032128033128034128035128036128037128038128039128040128041128042128043128044128045128046128047128048128049128050128051128052128053128054128055128056128057128058128059128060128061128062128063128064128065128066128067128068128069128070128071128072128073128074128075128076128077128078128079128080128081128082128083128084128085128086128087128088128089128090128091128092128093128094128095128096128097128098128099128100128101128102128103128104128105128106128107128108128109128110128111128112128113128114128115128116128117128118128119128120128121128122128123128124128125128126128127128128128129128130128131128132128133128134128135128136128137128138128139128140128141128142128143128144128145128146128147128148128149128150128151128152128153128154128155128156128157128158128159128160128161128162128163128164128165128166128167128168128169128170128171128172128173128174128175128176128177128178128179128180128181128182128183128184128185128186128187128188128189128190128191128192128193128194128195128196128197128198128199128200128201128202128203128204128205128206128207128208128209128210128211128212128213128214128215128216128217128218128219128220128221128222128223128224128225128226128227128228128229128230128231128232128233128234128235128236128237128238128239128240128241128242128243128244128245128246128247128248128249128250128251128252128253128254128255128256128257128258128259128260128261128262128263128264128265128266128267128268128269128270128271128272128273128274128275128276128277128278128279128280128281128282128283128284128285128286128287128288128289128290128291128292128293128294128295128296128297128298128299128300128301128302128303128304128305128306128307128308128309128310128311128312128313128314128315128316128317128318128319128320128321128322128323128324128325128326128327128328128329128330128331128332128333128334128335128336128337128338128339128340128341128342128343128344128345128346128347128348128349128350128351128352128353128354128355128356128357128358128359128360128361128362128363128364128365128366128367128368128369128370128371128372128373128374128375128376128377128378128379128380128381128382128383128384128385128386128387128388128389128390128391128392128393128394128395128396128397128398128399128400128401128402128403128404128405128406128407128408128409128410128411128412128413128414128415128416128417128418128419128420128421128422128423128424128425128426128427128428128429128430128431128432128433128434128435128436128437128438128439128440128441128442128443128444128445128446128447128448128449128450128451128452128453128454128455128456128457128458128459128460128461128462128463128464128465128466128467128468128469128470128471128472128473128474128475128476128477128478128479128480128481128482128483128484128485128486128487128488128489128490128491128492128493128494128495128496128497128498128499128500128501128502128503128504128505128506128507128508128509128510128511128512128513128514128515128516128517128518128519128520128521128522128523128524128525128526128527128528128529128530128531128532128533128534128535128536128537128538128539128540128541128542128543128544128545128546128547128548128549128550128551128552128553128554128555128556128557128558128559128560128561128562128563128564128565128566128567128568128569128570128571128572128573128574128575128576128577128578128579128580128581128582128583128584128585128586128587128588128589128590128591128592128593128594128595128596128597128598128599128600128601128602128603128604128605128606128607128608128609128610128611128612128613128614128615128616128617128618128619128620128621128622128623128624128625128626128627128628128629128630128631128632128633128634128635128636128637128638128639128640128641128642128643128644128645128646128647128648128649128650128651128652128653128654128655128656128657128658128659128660128661128662128663128664128665128666128667128668128669128670128671128672128673128674128675128676128677128678128679128680128681128682128683128684128685128686128687128688128689128690128691128692128693128694128695128696128697128698128699128700128701128702128703128704128705128706128707128708128709128710128711128712128713128714128715128716128717128718128719128720128721128722128723128724128725128726128727128728128729128730128731128732128733128734128735128736128737128738128739128740128741128742128743128744128745128746128747128748128749128750128751128752128753128754128755128756128757128758128759128760128761128762128763128764128765128766128767128768128769128770128771128772128773128774128775128776128777128778128779128780128781128782128783128784128785128786128787128788128789128790128791128792128793128794128795128796128797128798128799128800128801128802128803128804128805128806128807128808128809128810128811128812128813128814128815128816128817128818128819128820128821128822128823128824128825128826128827128828128829128830128831128832128833128834128835128836128837128838128839128840128841128842128843128844128845128846128847128848128849128850128851128852128853128854128855128856128857128858128859128860128861128862128863128864128865128866128867128868128869128870128871128872128873128874128875128876128877128878128879128880128881128882128883128884128885128886128887128888128889128890128891128892128893128894128895128896128897128898128899128900128901128902128903128904128905128906128907128908128909128910128911128912128913128914128915128916128917128918128919128920128921128922128923128924128925128926128927128928128929128930128931128932128933128934128935128936128937128938128939128940128941128942128943128944128945128946128947128948128949128950128951128952128953128954128955128956128957128958128959128960128961128962128963128964128965128966128967128968128969128970128971128972128973128974128975128976128977128978128979128980128981128982128983128984128985128986128987128988128989128990128991128992128993128994128995128996128997128998128999129000129001129002129003129004129005129006129007129008129009129010129011129012129013129014129015129016129017129018129019129020129021129022129023129024129025129026129027129028129029129030129031129032129033129034129035129036129037129038129039129040129041129042129043129044129045129046129047129048129049129050129051129052129053129054129055129056129057129058129059129060129061129062129063129064129065129066129067129068129069129070129071129072129073129074129075129076129077129078129079129080129081129082129083129084129085129086129087129088129089129090129091129092129093129094129095129096129097129098129099129100129101129102129103129104129105129106129107129108129109129110129111129112129113129114129115129116129117129118129119129120129121129122129123129124129125129126129127129128129129129130129131129132129133129134129135129136129137129138129139129140129141129142129143129144129145129146129147129148129149129150129151129152129153129154129155129156129157129158129159129160129161129162129163129164129165129166129167129168129169129170129171129172129173129174129175129176129177129178129179129180129181129182129183129184129185129186129187129188129189129190129191129192129193129194129195129196129197129198129199129200129201129202129203129204129205129206129207129208129209129210129211129212129213129214129215129216129217129218129219129220129221129222129223129224129225129226129227129228129229129230129231129232129233129234129235129236129237129238129239129240129241129242129243129244129245129246129247129248129249129250129251129252129253129254129255129256129257129258129259129260129261129262129263129264129265129266129267129268129269129270129271129272129273129274129275129276129277129278129279129280129281129282129283129284129285129286129287129288129289129290129291129292129293129294129295129296129297129298129299129300129301129302129303129304129305129306129307129308129309129310129311129312129313129314129315129316129317129318129319129320129321129322129323129324129325129326129327129328129329129330129331129332129333129334129335129336129337129338129339129340129341129342129343129344129345129346129347129348129349129350129351129352129353129354129355129356129357129358129359129360129361129362129363129364129365129366129367129368129369129370129371129372129373129374129375129376129377129378129379129380129381129382129383129384129385129386129387129388129389129390129391129392129393129394129395129396129397129398129399129400129401129402129403129404129405129406129407129408129409129410129411129412129413129414129415129416129417129418129419129420129421129422129423129424129425129426129427129428129429129430129431129432129433129434129435129436129437129438129439129440129441129442129443129444129445129446129447129448129449129450129451129452129453129454129455129456129457129458129459129460129461129462129463129464129465129466129467129468129469129470129471129472129473129474129475129476129477129478129479129480129481129482129483129484129485129486129487129488129489129490129491129492129493129494129495129496129497129498129499129500129501129502129503129504129505129506129507129508129509129510129511129512129513129514129515129516129517129518129519129520129521129522129523129524129525129526129527129528129529129530129531129532129533129534129535129536129537129538129539129540129541129542129543129544129545129546129547129548129549129550129551129552129553129554129555129556129557129558129559129560129561129562129563129564129565129566129567129568129569129570129571129572129573129574129575129576129577129578129579129580129581129582129583129584129585129586129587129588129589129590129591129592129593129594129595129596129597129598129599129600129601129602129603129604129605129606129607129608129609129610129611129612129613129614129615129616129617129618129619129620129621129622129623129624129625129626129627129628129629129630129631129632129633129634129635129636129637129638129639129640129641129642129643129644129645129646129647129648129649129650129651129652129653129654129655129656129657129658129659129660129661129662129663129664129665129666129667129668129669129670129671129672129673129674129675129676129677129678129679129680129681129682129683129684129685129686129687129688129689129690129691129692129693129694129695129696129697129698129699129700129701129702129703129704129705129706129707129708129709129710129711129712129713129714129715129716129717129718129719129720129721129722129723129724129725129726129727129728129729129730129731129732129733129734129735129736129737129738129739129740129741129742129743129744129745129746129747129748129749129750129751129752129753129754129755129756129757129758129759129760129761129762129763129764129765129766129767129768129769129770129771129772129773129774129775129776129777129778129779129780129781129782129783129784129785129786129787129788129789129790129791129792129793129794129795129796129797129798129799129800129801129802129803129804129805129806129807129808129809129810129811129812129813129814129815129816129817129818129819129820129821129822129823129824129825129826129827129828129829129830129831129832129833129834129835129836129837129838129839129840129841129842129843129844129845129846129847129848129849129850129851129852129853129854129855129856129857129858129859129860129861129862129863129864129865129866129867129868129869129870129871129872129873129874129875129876129877129878129879129880129881129882129883129884129885129886129887129888129889129890129891129892129893129894129895129896129897129898129899129900129901129902129903129904129905129906129907129908129909129910129911129912129913129914129915129916129917129918129919129920129921129922129923129924129925129926129927129928129929129930129931129932129933129934129935129936129937129938129939129940129941129942129943129944129945129946129947129948129949129950129951129952129953129954129955129956129957129958129959129960129961129962129963129964129965129966129967129968129969129970129971129972129973129974129975129976129977129978129979129980129981129982129983129984129985129986129987129988129989129990129991129992129993129994129995129996129997129998129999130000130001130002130003130004130005130006130007130008130009130010130011130012130013130014130015130016130017130018130019130020130021130022130023130024130025130026130027130028130029130030130031130032130033130034130035130036130037130038130039130040130041130042130043130044130045130046130047130048130049130050130051130052130053130054130055130056130057130058130059130060130061130062130063130064130065130066130067130068130069130070130071130072130073130074130075130076130077130078130079130080130081130082130083130084130085130086130087130088130089130090130091130092130093130094130095130096130097130098130099130100130101130102130103130104130105130106130107130108130109130110130111130112130113130114130115130116130117130118130119130120130121130122130123130124130125130126130127130128130129130130130131130132130133130134130135130136130137130138130139130140130141130142130143130144130145130146130147130148130149130150130151130152130153130154130155130156130157130158130159130160130161130162130163130164130165130166130167130168130169130170130171130172130173130174130175130176130177130178130179130180130181130182130183130184130185130186130187130188130189130190130191130192130193130194130195130196130197130198130199130200130201130202130203130204130205130206130207130208130209130210130211130212130213130214130215130216130217130218130219130220130221130222130223130224130225130226130227130228130229130230130231130232130233130234130235130236130237130238130239130240130241130242130243130244130245130246130247130248130249130250130251130252130253130254130255130256130257130258130259130260130261130262130263130264130265130266130267130268130269130270130271130272130273130274130275130276130277130278130279130280130281130282130283130284130285130286130287130288130289130290130291130292130293130294130295130296130297130298130299130300130301130302130303130304130305130306130307130308130309130310130311130312130313130314130315130316130317130318130319130320130321130322130323130324130325130326130327130328130329130330130331130332130333130334130335130336130337130338130339130340130341130342130343130344130345130346130347130348130349130350130351130352130353130354130355130356130357130358130359130360130361130362130363130364130365130366130367130368130369130370130371130372130373130374130375130376130377130378130379130380130381130382130383130384130385130386130387130388130389130390130391130392130393130394130395130396130397130398130399130400130401130402130403130404130405130406130407130408130409130410130411130412130413130414130415130416130417130418130419130420130421130422130423130424130425130426130427130428130429130430130431130432130433130434130435130436130437130438130439130440130441130442130443130444130445130446130447130448130449130450130451130452130453130454130455130456130457130458130459130460130461130462130463130464130465130466130467130468130469130470130471130472130473130474130475130476130477130478130479130480130481130482130483130484130485130486130487130488130489130490130491130492130493130494130495130496130497130498130499130500130501130502130503130504130505130506130507130508130509130510130511130512130513130514130515130516130517130518130519130520130521130522130523130524130525130526130527130528130529130530130531130532130533130534130535130536130537130538130539130540130541130542130543130544130545130546130547130548130549130550130551130552130553130554130555130556130557130558130559130560130561130562130563130564130565130566130567130568130569130570130571130572130573130574130575130576130577130578130579130580130581130582130583130584130585130586130587130588130589130590130591130592130593130594130595130596130597130598130599130600130601130602130603130604130605130606130607130608130609130610130611130612130613130614130615130616130617130618130619130620130621130622130623130624130625130626130627130628130629130630130631130632130633130634130635130636130637130638130639130640130641130642130643130644130645130646130647130648130649130650130651130652130653130654130655130656130657130658130659130660130661130662130663130664130665130666130667130668130669130670130671130672130673130674130675130676130677130678130679130680130681130682130683130684130685130686130687130688130689130690130691130692130693130694130695130696130697130698130699130700130701130702130703130704130705130706130707130708130709130710130711130712130713130714130715130716130717130718130719130720130721130722130723130724130725130726130727130728130729130730130731130732130733130734130735130736130737130738130739130740130741130742130743130744130745130746130747130748130749130750130751130752130753130754130755130756130757130758130759130760130761130762130763130764130765130766130767130768130769130770130771130772130773130774130775130776130777130778130779130780130781130782130783130784130785130786130787130788130789130790130791130792130793130794130795130796130797130798130799130800130801130802130803130804130805130806130807130808130809130810130811130812130813130814130815130816130817130818130819130820130821130822130823130824130825130826130827130828130829130830130831130832130833130834130835130836130837130838130839130840130841130842130843130844130845130846130847130848130849130850130851130852130853130854130855130856130857130858130859130860130861130862130863130864130865130866130867130868130869130870130871130872130873130874130875130876130877130878130879130880130881130882130883130884130885130886130887130888130889130890130891130892130893130894130895130896130897130898130899130900130901130902130903130904130905130906130907130908130909130910130911130912130913130914130915130916130917130918130919130920130921130922130923130924130925130926130927130928130929130930130931130932130933130934130935130936130937130938130939130940130941130942130943130944130945130946130947130948130949130950130951130952130953130954130955130956130957130958130959130960130961130962130963130964130965130966130967130968130969130970130971130972130973130974130975130976130977130978130979130980130981130982130983130984130985130986130987130988130989130990130991130992130993130994130995130996130997130998130999131000131001131002131003131004131005131006131007131008131009131010131011131012131013131014131015131016131017131018131019131020131021131022131023131024131025131026131027131028131029131030131031131032131033131034131035131036131037131038131039131040131041131042131043131044131045131046131047131048131049131050131051131052131053131054131055131056131057131058131059131060131061131062131063131064131065131066131067131068131069131070131071131072131073131074131075131076131077131078131079131080131081131082131083131084131085131086131087131088131089131090131091131092131093131094131095131096131097131098131099131100131101131102131103131104131105131106131107131108131109131110131111131112131113131114131115131116131117131118131119131120131121131122131123131124131125131126131127131128131129131130131131131132131133131134131135131136131137131138131139131140131141131142131143131144131145131146131147131148131149131150131151131152131153131154131155131156131157131158131159131160131161131162131163131164131165131166131167131168131169131170131171131172131173131174131175131176131177131178131179131180131181131182131183131184131185131186131187131188131189131190131191131192131193131194131195131196131197131198131199131200131201131202131203131204131205131206131207131208131209131210131211131212131213131214131215131216131217131218131219131220131221131222131223131224131225131226131227131228131229131230131231131232131233131234131235131236131237131238131239131240131241131242131243131244131245131246131247131248131249131250131251131252131253131254131255131256131257131258131259131260131261131262131263131264131265131266131267131268131269131270131271131272131273131274131275131276131277131278131279131280131281131282131283131284131285131286131287131288131289131290131291131292131293131294131295131296131297131298131299131300131301131302131303131304131305131306131307131308131309131310131311131312131313131314131315131316131317131318131319131320131321131322131323131324131325131326131327131328131329131330131331131332131333131334131335131336131337131338131339131340131341131342131343131344131345131346131347131348131349131350131351131352131353131354131355131356131357131358131359131360131361131362131363131364131365131366131367131368131369131370131371131372131373131374131375131376131377131378131379131380131381131382131383131384131385131386131387131388131389131390131391131392131393131394131395131396131397131398131399131400131401131402131403131404131405131406131407131408131409131410131411131412131413131414131415131416131417131418131419131420131421131422131423131424131425131426131427131428131429131430131431131432131433131434131435131436131437131438131439131440131441131442131443131444131445131446131447131448131449131450131451131452131453131454131455131456131457131458131459131460131461131462131463131464131465131466131467131468131469131470131471131472131473131474131475131476131477131478131479131480131481131482131483131484131485131486131487131488131489131490131491131492131493131494131495131496131497131498131499131500131501131502131503131504131505131506131507131508131509131510131511131512131513131514131515131516131517131518131519131520131521131522131523131524131525131526131527131528131529131530131531131532131533131534131535131536131537131538131539131540131541131542131543131544131545131546131547131548131549131550131551131552131553131554131555131556131557131558131559131560131561131562131563131564131565131566131567131568131569131570131571131572131573131574131575131576131577131578131579131580131581131582131583131584131585131586131587131588131589131590131591131592131593131594131595131596131597131598131599131600131601131602131603131604131605131606131607131608131609131610131611131612131613131614131615131616131617131618131619131620131621131622131623131624131625131626131627131628131629131630131631131632131633131634131635131636131637131638131639131640131641131642131643131644131645131646131647131648131649131650131651131652131653131654131655131656131657131658131659131660131661131662131663131664131665131666131667131668131669131670131671131672131673131674131675131676131677131678131679131680131681131682131683131684131685131686131687131688131689131690131691131692131693131694131695131696131697131698131699131700131701131702131703131704131705131706131707131708131709131710131711131712131713131714131715131716131717131718131719131720131721131722131723131724131725131726131727131728131729131730131731131732131733131734131735131736131737131738131739131740131741131742131743131744131745131746131747131748131749131750131751131752131753131754131755131756131757131758131759131760131761131762131763131764131765131766131767131768131769131770131771131772131773131774131775131776131777131778131779131780131781131782131783131784131785131786131787131788131789131790131791131792131793131794131795131796131797131798131799131800131801131802131803131804131805131806131807131808131809131810131811131812131813131814131815131816131817131818131819131820131821131822131823131824131825131826131827131828131829131830131831131832131833131834131835131836131837131838131839131840131841131842131843131844131845131846131847131848131849131850131851131852131853131854131855131856131857131858131859131860131861131862131863131864131865131866131867131868131869131870131871131872131873131874131875131876131877131878131879131880131881131882131883131884131885131886131887131888131889131890131891131892131893131894131895131896131897131898131899131900131901131902131903131904131905131906131907131908131909131910131911131912131913131914131915131916131917131918131919131920131921131922131923131924131925131926131927131928131929131930131931131932131933131934131935131936131937131938131939131940131941131942131943131944131945131946131947131948131949131950131951131952131953131954131955131956131957131958131959131960131961131962131963131964131965131966131967131968131969131970131971131972131973131974131975131976131977131978131979131980131981131982131983131984131985131986131987131988131989131990131991131992131993131994131995131996131997131998131999132000132001132002132003132004132005132006132007132008132009132010132011132012132013132014132015132016132017132018132019132020132021132022132023132024132025132026132027132028132029132030132031132032132033132034132035132036132037132038132039132040132041132042132043132044132045132046132047132048132049132050132051132052132053132054132055132056132057132058132059132060132061132062132063132064132065132066132067132068132069132070132071132072132073132074132075132076132077132078132079132080132081132082132083132084132085132086132087132088132089132090132091132092132093132094132095132096132097132098132099132100132101132102132103132104132105132106132107132108132109132110132111132112132113132114132115132116132117132118132119132120132121132122132123132124132125132126132127132128132129132130132131132132132133132134132135132136132137132138132139132140132141132142132143132144132145132146132147132148132149132150132151132152132153132154132155132156132157132158132159132160132161132162132163132164132165132166132167132168132169132170132171132172132173132174132175132176132177132178132179132180132181132182132183132184132185132186132187132188132189132190132191132192132193132194132195132196132197132198132199132200132201132202132203132204132205132206132207132208132209132210132211132212132213132214132215132216132217132218132219132220132221132222132223132224132225132226132227132228132229132230132231132232132233132234132235132236132237132238132239132240132241132242132243132244132245132246132247132248132249132250132251132252132253132254132255132256132257132258132259132260132261132262132263132264132265132266132267132268132269132270132271132272132273132274132275132276132277132278132279132280132281132282132283132284132285132286132287132288132289132290132291132292132293132294132295132296132297132298132299132300132301132302132303132304132305132306132307132308132309132310132311132312132313132314132315132316132317132318132319132320132321132322132323132324132325132326132327132328132329132330132331132332132333132334132335132336132337132338132339132340132341132342132343132344132345132346132347132348132349132350132351132352132353132354132355132356132357132358132359132360132361132362132363132364132365132366132367132368132369132370132371132372132373132374132375132376132377132378132379132380132381132382132383132384132385132386132387132388132389132390132391132392132393132394132395132396132397132398132399132400132401132402132403132404132405132406132407132408132409132410132411132412132413132414132415132416132417132418132419132420132421132422132423132424132425132426132427132428132429132430132431132432132433132434132435132436132437132438132439132440132441132442132443132444132445132446132447132448132449132450132451132452132453132454132455132456132457132458132459132460132461132462132463132464132465132466132467132468132469132470132471132472132473132474132475132476132477132478132479132480132481132482132483132484132485132486132487132488132489132490132491132492132493132494132495132496132497132498132499132500132501132502132503132504132505132506132507132508132509132510132511132512132513132514132515132516132517132518132519132520132521132522132523132524132525132526132527132528132529132530132531132532132533132534132535132536132537132538132539132540132541132542132543132544132545132546132547132548132549132550132551132552132553132554132555132556132557132558132559132560132561132562132563132564132565132566132567132568132569132570132571132572132573132574132575132576132577132578132579132580132581132582132583132584132585132586132587132588132589132590132591132592132593132594132595132596132597132598132599132600132601132602132603132604132605132606132607132608132609132610132611132612132613132614132615132616132617132618132619132620132621132622132623132624132625132626132627132628132629132630132631132632132633132634132635132636132637132638132639132640132641132642132643132644132645132646132647132648132649132650132651132652132653132654132655132656132657132658132659132660132661132662132663132664132665132666132667132668132669132670132671132672132673132674132675132676132677132678132679132680132681132682132683132684132685132686132687132688132689132690132691132692132693132694132695132696132697132698132699132700132701132702132703132704132705132706132707132708132709132710132711132712132713132714132715132716132717132718132719132720132721132722132723132724132725132726132727132728132729132730132731132732132733132734132735132736132737132738132739132740132741132742132743132744132745132746132747132748132749132750132751132752132753132754132755132756132757132758132759132760132761132762132763132764132765132766132767132768132769132770132771132772132773132774132775132776132777132778132779132780132781132782132783132784132785132786132787132788132789132790132791132792132793132794132795132796132797132798132799132800132801132802132803132804132805132806132807132808132809132810132811132812132813132814132815132816132817132818132819132820132821132822132823132824132825132826132827132828132829132830132831132832132833132834132835132836132837132838132839132840132841132842132843132844132845132846132847132848132849132850132851132852132853132854132855132856132857132858132859132860132861132862132863132864132865132866132867132868132869132870132871132872132873132874132875132876132877132878132879132880132881132882132883132884132885132886132887132888132889132890132891132892132893132894132895132896132897132898132899132900132901132902132903132904132905132906132907132908132909132910132911132912132913132914132915132916132917132918132919132920132921132922132923132924132925132926132927132928132929132930132931132932132933132934132935132936132937132938132939132940132941132942132943132944132945132946132947132948132949132950132951132952132953132954132955132956132957132958132959132960132961132962132963132964132965132966132967132968132969132970132971132972132973132974132975132976132977132978132979132980132981132982132983132984132985132986132987132988132989132990132991132992132993132994132995132996132997132998132999133000133001133002133003133004133005133006133007133008133009133010133011133012133013133014133015133016133017133018133019133020133021133022133023133024133025133026133027133028133029133030133031133032133033133034133035133036133037133038133039133040133041133042133043133044133045133046133047133048133049133050133051133052133053133054133055133056133057133058133059133060133061133062133063133064133065133066133067133068133069133070133071133072133073133074133075133076133077133078133079133080133081133082133083133084133085133086133087133088133089133090133091133092133093133094133095133096133097133098133099133100133101133102133103133104133105133106133107133108133109133110133111133112133113133114133115133116133117133118133119133120133121133122133123133124133125133126133127133128133129133130133131133132133133133134133135133136133137133138133139133140133141133142133143133144133145133146133147133148133149133150133151133152133153133154133155133156133157133158133159133160133161133162133163133164133165133166133167133168133169133170133171133172133173133174133175133176133177133178133179133180133181133182133183133184133185133186133187133188133189133190133191133192133193133194133195133196133197133198133199133200133201133202133203133204133205133206133207133208133209133210133211133212133213133214133215133216133217133218133219133220133221133222133223133224133225133226133227133228133229133230133231133232133233133234133235133236133237133238133239133240133241133242133243133244133245133246133247133248133249133250133251133252133253133254133255133256133257133258133259133260133261133262133263133264133265133266133267133268133269133270133271133272133273133274133275133276133277133278133279133280133281133282133283133284133285133286133287133288133289133290133291133292133293133294133295133296133297133298133299133300133301133302133303133304133305133306133307133308133309133310133311133312133313133314133315133316133317133318133319133320133321133322133323133324133325133326133327133328133329133330133331133332133333133334133335133336133337133338133339133340133341133342133343133344133345133346133347133348133349133350133351133352133353133354133355133356133357133358133359133360133361133362133363133364133365133366133367133368133369133370133371133372133373133374133375133376133377133378133379133380133381133382133383133384133385133386133387133388133389133390133391133392133393133394133395133396133397133398133399133400133401133402133403133404133405133406133407133408133409133410133411133412133413133414133415133416133417133418133419133420133421133422133423133424133425133426133427133428133429133430133431133432133433133434133435133436133437133438133439133440133441133442133443133444133445133446133447133448133449133450133451133452133453133454133455133456133457133458133459133460133461133462133463133464133465133466133467133468133469133470133471133472133473133474133475133476133477133478133479133480133481133482133483133484133485133486133487133488133489133490133491133492133493133494133495133496133497133498133499133500133501133502133503133504133505133506133507133508133509133510133511133512133513133514133515133516133517133518133519133520133521133522133523133524133525133526133527133528133529133530133531133532133533133534133535133536133537133538133539133540133541133542133543133544133545133546133547133548133549133550133551133552133553133554133555133556133557133558133559133560133561133562133563133564133565133566133567133568133569133570133571133572133573133574133575133576133577133578133579133580133581133582133583133584133585133586133587133588133589133590133591133592133593133594133595133596133597133598133599133600133601133602133603133604133605133606133607133608133609133610133611133612133613133614133615133616133617133618133619133620133621133622133623133624133625133626133627133628133629133630133631133632133633133634133635133636133637133638133639133640133641133642133643133644133645133646133647133648133649133650133651133652133653133654133655133656133657133658133659133660133661133662133663133664133665133666133667133668133669133670133671133672133673133674133675133676133677133678133679133680133681133682133683133684133685133686133687133688133689133690133691133692133693133694133695133696133697133698133699133700133701133702133703133704133705133706133707133708133709133710133711133712133713133714133715133716133717133718133719133720133721133722133723133724133725133726133727133728133729133730133731133732133733133734133735133736133737133738133739133740133741133742133743133744133745133746133747133748133749133750133751133752133753133754133755133756133757133758133759133760133761133762133763133764133765133766133767133768133769133770133771133772133773133774133775133776133777133778133779133780133781133782133783133784133785133786133787133788133789133790133791133792133793133794133795133796133797133798133799133800133801133802133803133804133805133806133807133808133809133810133811133812133813133814133815133816133817133818133819133820133821133822133823133824133825133826133827133828133829133830133831133832133833133834133835133836133837133838133839133840133841133842133843133844133845133846133847133848133849133850133851133852133853133854133855133856133857133858133859133860133861133862133863133864133865133866133867133868133869133870133871133872133873133874133875133876133877133878133879133880133881133882133883133884133885133886133887133888133889133890133891133892133893133894133895133896133897133898133899133900133901133902133903133904133905133906133907133908133909133910133911133912133913133914133915133916133917133918133919133920133921133922133923133924133925133926133927133928133929133930133931133932133933133934133935133936133937133938133939133940133941133942133943133944133945133946133947133948133949133950133951133952133953133954133955133956133957133958133959133960133961133962133963133964133965133966133967133968133969133970133971133972133973133974133975133976133977133978133979133980133981133982133983133984133985133986133987133988133989133990133991133992133993133994133995133996133997133998133999134000134001134002134003134004134005134006134007134008134009134010134011134012134013134014134015134016134017134018134019134020134021134022134023134024134025134026134027134028134029134030134031134032134033134034134035134036134037134038134039134040134041134042134043134044134045134046134047134048134049134050134051134052134053134054134055134056134057134058134059134060134061134062134063134064134065134066134067134068134069134070134071134072134073134074134075134076134077134078134079134080134081134082134083134084134085134086134087134088134089134090134091134092134093134094134095134096134097134098134099134100134101134102134103134104134105134106134107134108134109134110134111134112134113134114134115134116134117134118134119134120134121134122134123134124134125134126134127134128134129134130134131134132134133134134134135134136134137134138134139134140134141134142134143134144134145134146134147134148134149134150134151134152134153134154134155134156134157134158134159134160134161134162134163134164134165134166134167134168134169134170134171134172134173134174134175134176134177134178134179134180134181134182134183134184134185134186134187134188134189134190134191134192134193134194134195134196134197134198134199134200134201134202134203134204134205134206134207134208134209134210134211134212134213134214134215134216134217134218134219134220134221134222134223134224134225134226134227134228134229134230134231134232134233134234134235134236134237134238134239134240134241134242134243134244134245134246134247134248134249134250134251134252134253134254134255134256134257134258134259134260134261134262134263134264134265134266134267134268134269134270134271134272134273134274134275134276134277134278134279134280134281134282134283134284134285134286134287134288134289134290134291134292134293134294134295134296134297134298134299134300134301134302134303134304134305134306134307134308134309134310134311134312134313134314134315134316134317134318134319134320134321134322134323134324134325134326134327134328134329134330134331134332134333134334134335134336134337134338134339134340134341134342134343134344134345134346134347134348134349134350134351134352134353134354134355134356134357134358134359134360134361134362134363134364134365134366134367134368134369134370134371134372134373134374134375134376134377134378134379134380134381134382134383134384134385134386134387134388134389134390134391134392134393134394134395134396134397134398134399134400134401134402134403134404134405134406134407134408134409134410134411134412134413134414134415134416134417134418134419134420134421134422134423134424134425134426134427134428134429134430134431134432134433134434134435134436134437134438134439134440134441134442134443134444134445134446134447134448134449134450134451134452134453134454134455134456134457134458134459134460134461134462134463134464134465134466134467134468134469134470134471134472134473134474134475134476134477134478134479134480134481134482134483134484134485134486134487134488134489134490134491134492134493134494134495134496134497134498134499134500134501134502134503134504134505134506134507134508134509134510134511134512134513134514134515134516134517134518134519134520134521134522134523134524134525134526134527134528134529134530134531134532134533134534134535134536134537134538134539134540134541134542134543134544134545134546134547134548134549134550134551134552134553134554134555134556134557134558134559134560134561134562134563134564134565134566134567134568134569134570134571134572134573134574134575134576134577134578134579134580134581134582134583134584134585134586134587134588134589134590134591134592134593134594134595134596134597134598134599134600134601134602134603134604134605134606134607134608134609134610134611134612134613134614134615134616134617134618134619134620134621134622134623134624134625134626134627134628134629134630134631134632134633134634134635134636134637134638134639134640134641134642134643134644134645134646134647134648134649134650134651134652134653134654134655134656134657134658134659134660134661134662134663134664134665134666134667134668134669134670134671134672134673134674134675134676134677134678134679134680134681134682134683134684134685134686134687134688134689134690134691134692134693134694134695134696134697134698134699134700134701134702134703134704134705134706134707134708134709134710134711134712134713134714134715134716134717134718134719134720134721134722134723134724134725134726134727134728134729134730134731134732134733134734134735134736134737134738134739134740134741134742134743134744134745134746134747134748134749134750134751134752134753134754134755134756134757134758134759134760134761134762134763134764134765134766134767134768134769134770134771134772134773134774134775134776134777134778134779134780134781134782134783134784134785134786134787134788134789134790134791134792134793134794134795134796134797134798134799134800134801134802134803134804134805134806134807134808134809134810134811134812134813134814134815134816134817134818134819134820134821134822134823134824134825134826134827134828134829134830134831134832134833134834134835134836134837134838134839134840134841134842134843134844134845134846134847134848134849134850134851134852134853134854134855134856134857134858134859134860134861134862134863134864134865134866134867134868134869134870134871134872134873134874134875134876134877134878134879134880134881134882134883134884134885134886134887134888134889134890134891134892134893134894134895134896134897134898134899134900134901134902134903134904134905134906134907134908134909134910134911134912134913134914134915134916134917134918134919134920134921134922134923134924134925134926134927134928134929134930134931134932134933134934134935134936134937134938134939134940134941134942134943134944134945134946134947134948134949134950134951134952134953134954134955134956134957134958134959134960134961134962134963134964134965134966134967134968134969134970134971134972134973134974134975134976134977134978134979134980134981134982134983134984134985134986134987134988134989134990134991134992134993134994134995134996134997134998134999135000135001135002135003135004135005135006135007135008135009135010135011135012135013135014135015135016135017135018135019135020135021135022135023135024135025135026135027135028135029135030135031135032135033135034135035135036135037135038135039135040135041135042135043135044135045135046135047135048135049135050135051135052135053135054135055135056135057135058135059135060135061135062135063135064135065135066135067135068135069135070135071135072135073135074135075135076135077135078135079135080135081135082135083135084135085135086135087135088135089135090135091135092135093135094135095135096135097135098135099135100135101135102135103135104135105135106135107135108135109135110135111135112135113135114135115135116135117135118135119135120135121135122135123135124135125135126135127135128135129135130135131135132135133135134135135135136135137135138135139135140135141135142135143135144135145135146135147135148135149135150135151135152135153135154135155135156135157135158135159135160135161135162135163135164135165135166135167135168135169135170135171135172135173135174135175135176135177135178135179135180135181135182135183135184135185135186135187135188135189135190135191135192135193135194135195135196135197135198135199135200135201135202135203135204135205135206135207135208135209135210135211135212135213135214135215135216135217135218135219135220135221135222135223135224135225135226135227135228135229135230135231135232135233135234135235135236135237135238135239135240135241135242135243135244135245135246135247135248135249135250135251135252135253135254135255135256135257135258135259135260135261135262135263135264135265135266135267135268135269135270135271135272135273135274135275135276135277135278135279135280135281135282135283135284135285135286135287135288135289135290135291135292135293135294135295135296135297135298135299135300135301135302135303135304135305135306135307135308135309135310135311135312135313135314135315135316135317135318135319135320135321135322135323135324135325135326135327135328135329135330135331135332135333135334135335135336135337135338135339135340135341135342135343135344135345135346135347135348135349135350135351135352135353135354135355135356135357135358135359135360135361135362135363135364135365135366135367135368135369135370135371135372135373135374135375135376135377135378135379135380135381135382135383135384135385135386135387135388135389135390135391135392135393135394135395135396135397135398135399135400135401135402135403135404135405135406135407135408135409135410135411135412135413135414135415135416135417135418135419135420135421135422135423135424135425135426135427135428135429135430135431135432135433135434135435135436135437135438135439135440135441135442135443135444135445135446135447135448135449135450135451135452135453135454135455135456135457135458135459135460135461135462135463135464135465135466135467135468135469135470135471135472135473135474135475135476135477135478135479135480135481135482135483135484135485135486135487135488135489135490135491135492135493135494135495135496135497135498135499135500135501135502135503135504135505135506135507135508135509135510135511135512135513135514135515135516135517135518135519135520135521135522135523135524135525135526135527135528135529135530135531135532135533135534135535135536135537135538135539135540135541135542135543135544135545135546135547135548135549135550135551135552135553135554135555135556135557135558135559135560135561135562135563135564135565135566135567135568135569135570135571135572135573135574135575135576135577135578135579135580135581135582135583135584135585135586135587135588135589135590135591135592135593135594135595135596135597135598135599135600135601135602135603135604135605135606135607135608135609135610135611135612135613135614135615135616135617135618135619135620135621135622135623135624135625135626135627135628135629135630135631135632135633135634135635135636135637135638135639135640135641135642135643135644135645135646135647135648135649135650135651135652135653135654135655135656135657135658135659135660135661135662135663135664135665135666135667135668135669135670135671135672135673135674135675135676135677135678135679135680135681135682135683135684135685135686135687135688135689135690135691135692135693135694135695135696135697135698135699135700135701135702135703135704135705135706135707135708135709135710135711135712135713135714135715135716135717135718135719135720135721135722135723135724135725135726135727135728135729135730135731135732135733135734135735135736135737135738135739135740135741135742135743135744135745135746135747135748135749135750135751135752135753135754135755135756135757135758135759135760135761135762135763135764135765135766135767135768135769135770135771135772135773135774135775135776135777135778135779135780135781135782135783135784135785135786135787135788135789135790135791135792135793135794135795135796135797135798135799135800135801135802135803135804135805135806135807135808135809135810135811135812135813135814135815135816135817135818135819135820135821135822135823135824135825135826135827135828135829135830135831135832135833135834135835135836135837135838135839135840135841135842135843135844135845135846135847135848135849135850135851135852135853135854135855135856135857135858135859135860135861135862135863135864135865135866135867135868135869135870135871135872135873135874135875135876135877135878135879135880135881135882135883135884135885135886135887135888135889135890135891135892135893135894135895135896135897135898135899135900135901135902135903135904135905135906135907135908135909135910135911135912135913135914135915135916135917135918135919135920135921135922135923135924135925135926135927135928135929135930135931135932135933135934135935135936135937135938135939135940135941135942135943135944135945135946135947135948135949135950135951135952135953135954135955135956135957135958135959135960135961135962135963135964135965135966135967135968135969135970135971135972135973135974135975135976135977135978135979135980135981135982135983135984135985135986135987135988135989135990135991135992135993135994135995135996135997135998135999136000136001136002136003136004136005136006136007136008136009136010136011136012136013136014136015136016136017136018136019136020136021136022136023136024136025136026136027136028136029136030136031136032136033136034136035136036136037136038136039136040136041136042136043136044136045136046136047136048136049136050136051136052136053136054136055136056136057136058136059136060136061136062136063136064136065136066136067136068136069136070136071136072136073136074136075136076136077136078136079136080136081136082136083136084136085136086136087136088136089136090136091136092136093136094136095136096136097136098136099136100136101136102136103136104136105136106136107136108136109136110136111136112136113136114136115136116136117136118136119136120136121136122136123136124136125136126136127136128136129136130136131136132136133136134136135136136136137136138136139136140136141136142136143136144136145136146136147136148136149136150136151136152136153136154136155136156136157136158136159136160136161136162136163136164136165136166136167136168136169136170136171136172136173136174136175136176136177136178136179136180136181136182136183136184136185136186136187136188136189136190136191136192136193136194136195136196136197136198136199136200136201136202136203136204136205136206136207136208136209136210136211136212136213136214136215136216136217136218136219136220136221136222136223136224136225136226136227136228136229136230136231136232136233136234136235136236136237136238136239136240136241136242136243136244136245136246136247136248136249136250136251136252136253136254136255136256136257136258136259136260136261136262136263136264136265136266136267136268136269136270136271136272136273136274136275136276136277136278136279136280136281136282136283136284136285136286136287136288136289136290136291136292136293136294136295136296136297136298136299136300136301136302136303136304136305136306136307136308136309136310136311136312136313136314136315136316136317136318136319136320136321136322136323136324136325136326136327136328136329136330136331136332136333136334136335136336136337136338136339136340136341136342136343136344136345136346136347136348136349136350136351136352136353136354136355136356136357136358136359136360136361136362136363136364136365136366136367136368136369136370136371136372136373136374136375136376136377136378136379136380136381136382136383136384136385136386136387136388136389136390136391136392136393136394136395136396136397136398136399136400136401136402136403136404136405136406136407136408136409136410136411136412136413136414136415136416136417136418136419136420136421136422136423136424136425136426136427136428136429136430136431136432136433136434136435136436136437136438136439136440136441136442136443136444136445136446136447136448136449136450136451136452136453136454136455136456136457136458136459136460136461136462136463136464136465136466136467136468136469136470136471136472136473136474136475136476136477136478136479136480136481136482136483136484136485136486136487136488136489136490136491136492136493136494136495136496136497136498136499136500136501136502136503136504136505136506136507136508136509136510136511136512136513136514136515136516136517136518136519136520136521136522136523136524136525136526136527136528136529136530136531136532136533136534136535136536136537136538136539136540136541136542136543136544136545136546136547136548136549136550136551136552136553136554136555136556136557136558136559136560136561136562136563136564136565136566136567136568136569136570136571136572136573136574136575136576136577136578136579136580136581136582136583136584136585136586136587136588136589136590136591136592136593136594136595136596136597136598136599136600136601136602136603136604136605136606136607136608136609136610136611136612136613136614136615136616136617136618136619136620136621136622136623136624136625136626136627136628136629136630136631136632136633136634136635136636136637136638136639136640136641136642136643136644136645136646136647136648136649136650136651136652136653136654136655136656136657136658136659136660136661136662136663136664136665136666136667136668136669136670136671136672136673136674136675136676136677136678136679136680136681136682136683136684136685136686136687136688136689136690136691136692136693136694136695136696136697136698136699136700136701136702136703136704136705136706136707136708136709136710136711136712136713136714136715136716136717136718136719136720136721136722136723136724136725136726136727136728136729136730136731136732136733136734136735136736136737136738136739136740136741136742136743136744136745136746136747136748136749136750136751136752136753136754136755136756136757136758136759136760136761136762136763136764136765136766136767136768136769136770136771136772136773136774136775136776136777136778136779136780136781136782136783136784136785136786136787136788136789136790136791136792136793136794136795136796136797136798136799136800136801136802136803136804136805136806136807136808136809136810136811136812136813136814136815136816136817136818136819136820136821136822136823136824136825136826136827136828136829136830136831136832136833136834136835136836136837136838136839136840136841136842136843136844136845136846136847136848136849136850136851136852136853136854136855136856136857136858136859136860136861136862136863136864136865136866136867136868136869136870136871136872136873136874136875136876136877136878136879136880136881136882136883136884136885136886136887136888136889136890136891136892136893136894136895136896136897136898136899136900136901136902136903136904136905136906136907136908136909136910136911136912136913136914136915136916136917136918136919136920136921136922136923136924136925136926136927136928136929136930136931136932136933136934136935136936136937136938136939136940136941136942136943136944136945136946136947136948136949136950136951136952136953136954136955136956136957136958136959136960136961136962136963136964136965136966136967136968136969136970136971136972136973136974136975136976136977136978136979136980136981136982136983136984136985136986136987136988136989136990136991136992136993136994136995136996136997136998136999137000137001137002137003137004137005137006137007137008137009137010137011137012137013137014137015137016137017137018137019137020137021137022137023137024137025137026137027137028137029137030137031137032137033137034137035137036137037137038137039137040137041137042137043137044137045137046137047137048137049137050137051137052137053137054137055137056137057137058137059137060137061137062137063137064137065137066137067137068137069137070137071137072137073137074137075137076137077137078137079137080137081137082137083137084137085137086137087137088137089137090137091137092137093137094137095137096137097137098137099137100137101137102137103137104137105137106137107137108137109137110137111137112137113137114137115137116137117137118137119137120137121137122137123137124137125137126137127137128137129137130137131137132137133137134137135137136137137137138137139137140137141137142137143137144137145137146137147137148137149137150137151137152137153137154137155137156137157137158137159137160137161137162137163137164137165137166137167137168137169137170137171137172137173137174137175137176137177137178137179137180137181137182137183137184137185137186137187137188137189137190137191137192137193137194137195137196137197137198137199137200137201137202137203137204137205137206137207137208137209137210137211137212137213137214137215137216137217137218137219137220137221137222137223137224137225137226137227137228137229137230137231137232137233137234137235137236137237137238137239137240137241137242137243137244137245137246137247137248137249137250137251137252137253137254137255137256137257137258137259137260137261137262137263137264137265137266137267137268137269137270137271137272137273137274137275137276137277137278137279137280137281137282137283137284137285137286137287137288137289137290137291137292137293137294137295137296137297137298137299137300137301137302137303137304137305137306137307137308137309137310137311137312137313137314137315137316137317137318137319137320137321137322137323137324137325137326137327137328137329137330137331137332137333137334137335137336137337137338137339137340137341137342137343137344137345137346137347137348137349137350137351137352137353137354137355137356137357137358137359137360137361137362137363137364137365137366137367137368137369137370137371137372137373137374137375137376137377137378137379137380137381137382137383137384137385137386137387137388137389137390137391137392137393137394137395137396137397137398137399137400137401137402137403137404137405137406137407137408137409137410137411137412137413137414137415137416137417137418137419137420137421137422137423137424137425137426137427137428137429137430137431137432137433137434137435137436137437137438137439137440137441137442137443137444137445137446137447137448137449137450137451137452137453137454137455137456137457137458137459137460137461137462137463137464137465137466137467137468137469137470137471137472137473137474137475137476137477137478137479137480137481137482137483137484137485137486137487137488137489137490137491137492137493137494137495137496137497137498137499137500137501137502137503137504137505137506137507137508137509137510137511137512137513137514137515137516137517137518137519137520137521137522137523137524137525137526137527137528137529137530137531137532137533137534137535137536137537137538137539137540137541137542137543137544137545137546137547137548137549137550137551137552137553137554137555137556137557137558137559137560137561137562137563137564137565137566137567137568137569137570137571137572137573137574137575137576137577137578137579137580137581137582137583137584137585137586137587137588137589137590137591137592137593137594137595137596137597137598137599137600137601137602137603137604137605137606137607137608137609137610137611137612137613137614137615137616137617137618137619137620137621137622137623137624137625137626137627137628137629137630137631137632137633137634137635137636137637137638137639137640137641137642137643137644137645137646137647137648137649137650137651137652137653137654137655137656137657137658137659137660137661137662137663137664137665137666137667137668137669137670137671137672137673137674137675137676137677137678137679137680137681137682137683137684137685137686137687137688137689137690137691137692137693137694137695137696137697137698137699137700137701137702137703137704137705137706137707137708137709137710137711137712137713137714137715137716137717137718137719137720137721137722137723137724137725137726137727137728137729137730137731137732137733137734137735137736137737137738137739137740137741137742137743137744137745137746137747137748137749137750137751137752137753137754137755137756137757137758137759137760137761137762137763137764137765137766137767137768137769137770137771137772137773137774137775137776137777137778137779137780137781137782137783137784137785137786137787137788137789137790137791137792137793137794137795137796137797137798137799137800137801137802137803137804137805137806137807137808137809137810137811137812137813137814137815137816137817137818137819137820137821137822137823137824137825137826137827137828137829137830137831137832137833137834137835137836137837137838137839137840137841137842137843137844137845137846137847137848137849137850137851137852137853137854137855137856137857137858137859137860137861137862137863137864137865137866137867137868137869137870137871137872137873137874137875137876137877137878137879137880137881137882137883137884137885137886137887137888137889137890137891137892137893137894137895137896137897137898137899137900137901137902137903137904137905137906137907137908137909137910137911137912137913137914137915137916137917137918137919137920137921137922137923137924137925137926137927137928137929137930137931137932137933137934137935137936137937137938137939137940137941137942137943137944137945137946137947137948137949137950137951137952137953137954137955137956137957137958137959137960137961137962137963137964137965137966137967137968137969137970137971137972137973137974137975137976137977137978137979137980137981137982137983137984137985137986137987137988137989137990137991137992137993137994137995137996137997137998137999138000138001138002138003138004138005138006138007138008138009138010138011138012138013138014138015138016138017138018138019138020138021138022138023138024138025138026138027138028138029138030138031138032138033138034138035138036138037138038138039138040138041138042138043138044138045138046138047138048138049138050138051138052138053138054138055138056138057138058138059138060138061138062138063138064138065138066138067138068138069138070138071138072138073138074138075138076138077138078138079138080138081138082138083138084138085138086138087138088138089138090138091138092138093138094138095138096138097138098138099138100138101138102138103138104138105138106138107138108138109138110138111138112138113138114138115138116138117138118138119138120138121138122138123138124138125138126138127138128138129138130138131138132138133138134138135138136138137138138138139138140138141138142138143138144138145138146138147138148138149138150138151138152138153138154138155138156138157138158138159138160138161138162138163138164138165138166138167138168138169138170138171138172138173138174138175138176138177138178138179138180138181138182138183138184138185138186138187138188138189138190138191138192138193138194138195138196138197138198138199138200138201138202138203138204138205138206138207138208138209138210138211138212138213138214138215138216138217138218138219138220138221138222138223138224138225138226138227138228138229138230138231138232138233138234138235138236138237138238138239138240138241138242138243138244138245138246138247138248138249138250138251138252138253138254138255138256138257138258138259138260138261138262138263138264138265138266138267138268138269138270138271138272138273138274138275138276138277138278138279138280138281138282138283138284138285138286138287138288138289138290138291138292138293138294138295138296138297138298138299138300138301138302138303138304138305138306138307138308138309138310138311138312138313138314138315138316138317138318138319138320138321138322138323138324138325138326138327138328138329138330138331138332138333138334138335138336138337138338138339138340138341138342138343138344138345138346138347138348138349138350138351138352138353138354138355138356138357138358138359138360138361138362138363138364138365138366138367138368138369138370138371138372138373138374138375138376138377138378138379138380138381138382138383138384138385138386138387138388138389138390138391138392138393138394138395138396138397138398138399138400138401138402138403138404138405138406138407138408138409138410138411138412138413138414138415138416138417138418138419138420138421138422138423138424138425138426138427138428138429138430138431138432138433138434138435138436138437138438138439138440138441138442138443138444138445138446138447138448138449138450138451138452138453138454138455138456138457138458138459138460138461138462138463138464138465138466138467138468138469138470138471138472138473138474138475138476138477138478138479138480138481138482138483138484138485138486138487138488138489138490138491138492138493138494138495138496138497138498138499138500138501138502138503138504138505138506138507138508138509138510138511138512138513138514138515138516138517138518138519138520138521138522138523138524138525138526138527138528138529138530138531138532138533138534138535138536138537138538138539138540138541138542138543138544138545138546138547138548138549138550138551138552138553138554138555138556138557138558138559138560138561138562138563138564138565138566138567138568138569138570138571138572138573138574138575138576138577138578138579138580138581138582138583138584138585138586138587138588138589138590138591138592138593138594138595138596138597138598138599138600138601138602138603138604138605138606138607138608138609138610138611138612138613138614138615138616138617138618138619138620138621138622138623138624138625138626138627138628138629138630138631138632138633138634138635138636138637138638138639138640138641138642138643138644138645138646138647138648138649138650138651138652138653138654138655138656138657138658138659138660138661138662138663138664138665138666138667138668138669138670138671138672138673138674138675138676138677138678138679138680138681138682138683138684138685138686138687138688138689138690138691138692138693138694138695138696138697138698138699138700138701138702138703138704138705138706138707138708138709138710138711138712138713138714138715138716138717138718138719138720138721138722138723138724138725138726138727138728138729138730138731138732138733138734138735138736138737138738138739138740138741138742138743138744138745138746138747138748138749138750138751138752138753138754138755138756138757138758138759138760138761138762138763138764138765138766138767138768138769138770138771138772138773138774138775138776138777138778138779138780138781138782138783138784138785138786138787138788138789138790138791138792138793138794138795138796138797138798138799138800138801138802138803138804138805138806138807138808138809138810138811138812138813138814138815138816138817138818138819138820138821138822138823138824138825138826138827138828138829138830138831138832138833138834138835138836138837138838138839138840138841138842138843138844138845138846138847138848138849138850138851138852138853138854138855138856138857138858138859138860138861138862138863138864138865138866138867138868138869138870138871138872138873138874138875138876138877138878138879138880138881138882138883138884138885138886138887138888138889138890138891138892138893138894138895138896138897138898138899138900138901138902138903138904138905138906138907138908138909138910138911138912138913138914138915138916138917138918138919138920138921138922138923138924138925138926138927138928138929138930138931138932138933138934138935138936138937138938138939138940138941138942138943138944138945138946138947138948138949138950138951138952138953138954138955138956138957138958138959138960138961138962138963138964138965138966138967138968138969138970138971138972138973138974138975138976138977138978138979138980138981138982138983138984138985138986138987138988138989138990138991138992138993138994138995138996138997138998138999139000139001139002139003139004139005139006139007139008139009139010139011139012139013139014139015139016139017139018139019139020139021139022139023139024139025139026139027139028139029139030139031139032139033139034139035139036139037139038139039139040139041139042139043139044139045139046139047139048139049139050139051139052139053139054139055139056139057139058139059139060139061139062139063139064139065139066139067139068139069139070139071139072139073139074139075139076139077139078139079139080139081139082139083139084139085139086139087139088139089139090139091139092139093139094139095139096139097139098139099139100139101139102139103139104139105139106139107139108139109139110139111139112139113139114139115139116139117139118139119139120139121139122139123139124139125139126139127139128139129139130139131139132139133139134139135139136139137139138139139139140139141139142139143139144139145139146139147139148139149139150139151139152139153139154139155139156139157139158139159139160139161139162139163139164139165139166139167139168139169139170139171139172139173139174139175139176139177139178139179139180139181139182139183139184139185139186139187139188139189139190139191139192139193139194139195139196139197139198139199139200139201139202139203139204139205139206139207139208139209139210139211139212139213139214139215139216139217139218139219139220139221139222139223139224139225139226139227139228139229139230139231139232139233139234139235139236139237139238139239139240139241139242139243139244139245139246139247139248139249139250139251139252139253139254139255139256139257139258139259139260139261139262139263139264139265139266139267139268139269139270139271139272139273139274139275139276139277139278139279139280139281139282139283139284139285139286139287139288139289139290139291139292139293139294139295139296139297139298139299139300139301139302139303139304139305139306139307139308139309139310139311139312139313139314139315139316139317139318139319139320139321139322139323139324139325139326139327139328139329139330139331139332139333139334139335139336139337139338139339139340139341139342139343139344139345139346139347139348139349139350139351139352139353139354139355139356139357139358139359139360139361139362139363139364139365139366139367139368139369139370139371139372139373139374139375139376139377139378139379139380139381139382139383139384139385139386139387139388139389139390139391139392139393139394139395139396139397139398139399139400139401139402139403139404139405139406139407139408139409139410139411139412139413139414139415139416139417139418139419139420139421139422139423139424139425139426139427139428139429139430139431139432139433139434139435139436139437139438139439139440139441139442139443139444139445139446139447139448139449139450139451139452139453139454139455139456139457139458139459139460139461139462139463139464139465139466139467139468139469139470139471139472139473139474139475139476139477139478139479139480139481139482139483139484139485139486139487139488139489139490139491139492139493139494139495139496139497139498139499139500139501139502139503139504139505139506139507139508139509139510139511139512139513139514139515139516139517139518139519139520139521139522139523139524139525139526139527139528139529139530139531139532139533139534139535139536139537139538139539139540139541139542139543139544139545139546139547139548139549139550139551139552139553139554139555139556139557139558139559139560139561139562139563139564139565139566139567139568139569139570139571139572139573139574139575139576139577139578139579139580139581139582139583139584139585139586139587139588139589139590139591139592139593139594139595139596139597139598139599139600139601139602139603139604139605139606139607139608139609139610139611139612139613139614139615139616139617139618139619139620139621139622139623139624139625139626139627139628139629139630139631139632139633139634139635139636139637139638139639139640139641139642139643139644139645139646139647139648139649139650139651139652139653139654139655139656139657139658139659139660139661139662139663139664139665139666139667139668139669139670139671139672139673139674139675139676139677139678139679139680139681139682139683139684139685139686139687139688139689139690139691139692139693139694139695139696139697139698139699139700139701139702139703139704139705139706139707139708139709139710139711139712139713139714139715139716139717139718139719139720139721139722139723139724139725139726139727139728139729139730139731139732139733139734139735139736139737139738139739139740139741139742139743139744139745139746139747139748139749139750139751139752139753139754139755139756139757139758139759139760139761139762139763139764139765139766139767139768139769139770139771139772139773139774139775139776139777139778139779139780139781139782139783139784139785139786139787139788139789139790139791139792139793139794139795139796139797139798139799139800139801139802139803139804139805139806139807139808139809139810139811139812139813139814139815139816139817139818139819139820139821139822139823139824139825139826139827139828139829139830139831139832139833139834139835139836139837139838139839139840139841139842139843139844139845139846139847139848139849139850139851139852139853139854139855139856139857139858139859139860139861139862139863139864139865139866139867139868139869139870139871139872139873139874139875139876139877139878139879139880139881139882139883139884139885139886139887139888139889139890139891139892139893139894139895139896139897139898139899139900139901139902139903139904139905139906139907139908139909139910139911139912139913139914139915139916139917139918139919139920139921139922139923139924139925139926139927139928139929139930139931139932139933139934139935139936139937139938139939139940139941139942139943139944139945139946139947139948139949139950139951139952139953139954139955139956139957139958139959139960139961139962139963139964139965139966139967139968139969139970139971139972139973139974139975139976139977139978139979139980139981139982139983139984139985139986139987139988139989139990139991139992139993139994139995139996139997139998139999140000140001140002140003140004140005140006140007140008140009140010140011140012140013140014140015140016140017140018140019140020140021140022140023140024140025140026140027140028140029140030140031140032140033140034140035140036140037140038140039140040140041140042140043140044140045140046140047140048140049140050140051140052140053140054140055140056140057140058140059140060140061140062140063140064140065140066140067140068140069140070140071140072140073140074140075140076140077140078140079140080140081140082140083140084140085140086140087140088140089140090140091140092140093140094140095140096140097140098140099140100140101140102140103140104140105140106140107140108140109140110140111140112140113140114140115140116140117140118140119140120140121140122140123140124140125140126140127140128140129140130140131140132140133140134140135140136140137140138140139140140140141140142140143140144140145140146140147140148140149140150140151140152140153140154140155140156140157140158140159140160140161140162140163140164140165140166140167140168140169140170140171140172140173140174140175140176140177140178140179140180140181140182140183140184140185140186140187140188140189140190140191140192140193140194140195140196140197140198140199140200140201140202140203140204140205140206140207140208140209140210140211140212140213140214140215140216140217140218140219140220140221140222140223140224140225140226140227140228140229140230140231140232140233140234140235140236140237140238140239140240140241140242140243140244140245140246140247140248140249140250140251140252140253140254140255140256140257140258140259140260140261140262140263140264140265140266140267140268140269140270140271140272140273140274140275140276140277140278140279140280140281140282140283140284140285140286140287140288140289140290140291140292140293140294140295140296140297140298140299140300140301140302140303140304140305140306140307140308140309140310140311140312140313140314140315140316140317140318140319140320140321140322140323140324140325140326140327140328140329140330140331140332140333140334140335140336140337140338140339140340140341140342140343140344140345140346140347140348140349140350140351140352140353140354140355140356140357140358140359140360140361140362140363140364140365140366140367140368140369140370140371140372140373140374140375140376140377140378140379140380140381140382140383140384140385140386140387140388140389140390140391140392140393140394140395140396140397140398140399140400140401140402140403140404140405140406140407140408140409140410140411140412140413140414140415140416140417140418140419140420140421140422140423140424140425140426140427140428140429140430140431140432140433140434140435140436140437140438140439140440140441140442140443140444140445140446140447140448140449140450140451140452140453140454140455140456140457140458140459140460140461140462140463140464140465140466140467140468140469140470140471140472140473140474140475140476140477140478140479140480140481140482140483140484140485140486140487140488140489140490140491140492140493140494140495140496140497140498140499140500140501140502140503140504140505140506140507140508140509140510140511140512140513140514140515140516140517140518140519140520140521140522140523140524140525140526140527140528140529140530140531140532140533140534140535140536140537140538140539140540140541140542140543140544140545140546140547140548140549140550140551140552140553140554140555140556140557140558140559140560140561140562140563140564140565140566140567140568140569140570140571140572140573140574140575140576140577140578140579140580140581140582140583140584140585140586140587140588140589140590140591140592140593140594140595140596140597140598140599140600140601140602140603140604140605140606140607140608140609140610140611140612140613140614140615140616140617140618140619140620140621140622140623140624140625140626140627140628140629140630140631140632140633140634140635140636140637140638140639140640140641140642140643140644140645140646140647140648140649140650140651140652140653140654140655140656140657140658140659140660140661140662140663140664140665140666140667140668140669140670140671140672140673140674140675140676140677140678140679140680140681140682140683140684140685140686140687140688140689140690140691140692140693140694140695140696140697140698140699140700140701140702140703140704140705140706140707140708140709140710140711140712140713140714140715140716140717140718140719140720140721140722140723140724140725140726140727140728140729140730140731140732140733140734140735140736140737140738140739140740140741140742140743140744140745140746140747140748140749140750140751140752140753140754140755140756140757140758140759140760140761140762140763140764140765140766140767140768140769140770140771140772140773140774140775140776140777140778140779140780140781140782140783140784140785140786140787140788140789140790140791140792140793140794140795140796140797140798140799140800140801140802140803140804140805140806140807140808140809140810140811140812140813140814140815140816140817140818140819140820140821140822140823140824140825140826140827140828140829140830140831140832140833140834140835140836140837140838140839140840140841140842140843140844140845140846140847140848140849140850140851140852140853140854140855140856140857140858140859140860140861140862140863140864140865140866140867140868140869140870140871140872140873140874140875140876140877140878140879140880140881140882140883140884140885140886140887140888140889140890140891140892140893140894140895140896140897140898140899140900140901140902140903140904140905140906140907140908140909140910140911140912140913140914140915140916140917140918140919140920140921140922140923140924140925140926140927140928140929140930140931140932140933140934140935140936140937140938140939140940140941140942140943140944140945140946140947140948140949140950140951140952140953140954140955140956140957140958140959140960140961140962140963140964140965140966140967140968140969140970140971140972140973140974140975140976140977140978140979140980140981140982140983140984140985140986140987140988140989140990140991140992140993140994140995140996140997140998140999141000141001141002141003141004141005141006141007141008141009141010141011141012141013141014141015141016141017141018141019141020141021141022141023141024141025141026141027141028141029141030141031141032141033141034141035141036141037141038141039141040141041141042141043141044141045141046141047141048141049141050141051141052141053141054141055141056141057141058141059141060141061141062141063141064141065141066141067141068141069141070141071141072141073141074141075141076141077141078141079141080141081141082141083141084141085141086141087141088141089141090141091141092141093141094141095141096141097141098141099141100141101141102141103141104141105141106141107141108141109141110141111141112141113141114141115141116141117141118141119141120141121141122141123141124141125141126141127141128141129141130141131141132141133141134141135141136141137141138141139141140141141141142141143141144141145141146141147141148141149141150141151141152141153141154141155141156141157141158141159141160141161141162141163141164141165141166141167141168141169141170141171141172141173141174141175141176141177141178141179141180141181141182141183141184141185141186141187141188141189141190141191141192141193141194141195141196141197141198141199141200141201141202141203141204141205141206141207141208141209141210141211141212141213141214141215141216141217141218141219141220141221141222141223141224141225141226141227141228141229141230141231141232141233141234141235141236141237141238141239141240141241141242141243141244141245141246141247141248141249141250141251141252141253141254141255141256141257141258141259141260141261141262141263141264141265141266141267141268141269141270141271141272141273141274141275141276141277141278141279141280141281141282141283141284141285141286141287141288141289141290141291141292141293141294141295141296141297141298141299141300141301141302141303141304141305141306141307141308141309141310141311141312141313141314141315141316141317141318141319141320141321141322141323141324141325141326141327141328141329141330141331141332141333141334141335141336141337141338141339141340141341141342141343141344141345141346141347141348141349141350141351141352141353141354141355141356141357141358141359141360141361141362141363141364141365141366141367141368141369141370141371141372141373141374141375141376141377141378141379141380141381141382141383141384141385141386141387141388141389141390141391141392141393141394141395141396141397141398141399141400141401141402141403141404141405141406141407141408141409141410141411141412141413141414141415141416141417141418141419141420141421141422141423141424141425141426141427141428141429141430141431141432141433141434141435141436141437141438141439141440141441141442141443141444141445141446141447141448141449141450141451141452141453141454141455141456141457141458141459141460141461141462141463141464141465141466141467141468141469141470141471141472141473141474141475141476141477141478141479141480141481141482141483141484141485141486141487141488141489141490141491141492141493141494141495141496141497141498141499141500141501141502141503141504141505141506141507141508141509141510141511141512141513141514141515141516141517141518141519141520141521141522141523141524141525141526141527141528141529141530141531141532141533141534141535141536141537141538141539141540141541141542141543141544141545141546141547141548141549141550141551141552141553141554141555141556141557141558141559141560141561141562141563141564141565141566141567141568141569141570141571141572141573141574141575141576141577141578141579141580141581141582141583141584141585141586141587141588141589141590141591141592141593141594141595141596141597141598141599141600141601141602141603141604141605141606141607141608141609141610141611141612141613141614141615141616141617141618141619141620141621141622141623141624141625141626141627141628141629141630141631141632141633141634141635141636141637141638141639141640141641141642141643141644141645141646141647141648141649141650141651141652141653141654141655141656141657141658141659141660141661141662141663141664141665141666141667141668141669141670141671141672141673141674141675141676141677141678141679141680141681141682141683141684141685141686141687141688141689141690141691141692141693141694141695141696141697141698141699141700141701141702141703141704141705141706141707141708141709141710141711141712141713141714141715141716141717141718141719141720141721141722141723141724141725141726141727141728141729141730141731141732141733141734141735141736141737141738141739141740141741141742141743141744141745141746141747141748141749141750141751141752141753141754141755141756141757141758141759141760141761141762141763141764141765141766141767141768141769141770141771141772141773141774141775141776141777141778141779141780141781141782141783141784141785141786141787141788141789141790141791141792141793141794141795141796141797141798141799141800141801141802141803141804141805141806141807141808141809141810141811141812141813141814141815141816141817141818141819141820141821141822141823141824141825141826141827141828141829141830141831141832141833141834141835141836141837141838141839141840141841141842141843141844141845141846141847141848141849141850141851141852141853141854141855141856141857141858141859141860141861141862141863141864141865141866141867141868141869141870141871141872141873141874141875141876141877141878141879141880141881141882141883141884141885141886141887141888141889141890141891141892141893141894141895141896141897141898141899141900141901141902141903141904141905141906141907141908141909141910141911141912141913141914141915141916141917141918141919141920141921141922141923141924141925141926141927141928141929141930141931141932141933141934141935141936141937141938141939141940141941141942141943141944141945141946141947141948141949141950141951141952141953141954141955141956141957141958141959141960141961141962141963141964141965141966141967141968141969141970141971141972141973141974141975141976141977141978141979141980141981141982141983141984141985141986141987141988141989141990141991141992141993141994141995141996141997141998141999142000142001142002142003142004142005142006142007142008142009142010142011142012142013142014142015142016142017142018142019142020142021142022142023142024142025142026142027142028142029142030142031142032142033142034142035142036142037142038142039142040142041142042142043142044142045142046142047142048142049142050142051142052142053142054142055142056142057142058142059142060142061142062142063142064142065142066142067142068142069142070142071142072142073142074142075142076142077142078142079142080142081142082142083142084142085142086142087142088142089142090142091142092142093142094142095142096142097142098142099142100142101142102142103142104142105142106142107142108142109142110142111142112142113142114142115142116142117142118142119142120142121142122142123142124142125142126142127142128142129142130142131142132142133142134142135142136142137142138142139142140142141142142142143142144142145142146142147142148142149142150142151142152142153142154142155142156142157142158142159142160142161142162142163142164142165142166142167142168142169142170142171142172142173142174142175142176142177142178142179142180142181142182142183142184142185142186142187142188142189142190142191142192142193142194142195142196142197142198142199142200142201142202142203142204142205142206142207142208142209142210142211142212142213142214142215142216142217142218142219142220142221142222142223142224142225142226142227142228142229142230142231142232142233142234142235142236142237142238142239142240142241142242142243142244142245142246142247142248142249142250142251142252142253142254142255142256142257142258142259142260142261142262142263142264142265142266142267142268142269142270142271142272142273142274142275142276142277142278142279142280142281142282142283142284142285142286142287142288142289142290142291142292142293142294142295142296142297142298142299142300142301142302142303142304142305142306142307142308142309142310142311142312142313142314142315142316142317142318142319142320142321142322142323142324142325142326142327142328142329142330142331142332142333142334142335142336142337142338142339142340142341142342142343142344142345142346142347142348142349142350142351142352142353142354142355142356142357142358142359142360142361142362142363142364142365142366142367142368142369142370142371142372142373142374142375142376142377142378142379142380142381142382142383142384142385142386142387142388142389142390142391142392142393142394142395142396142397142398142399142400142401142402142403142404142405142406142407142408142409142410142411142412142413142414142415142416142417142418142419142420142421142422142423142424142425142426142427142428142429142430142431142432142433142434142435142436142437142438142439142440142441142442142443142444142445142446142447142448142449142450142451142452142453142454142455142456142457142458142459142460142461142462142463142464142465142466142467142468142469142470142471142472142473142474142475142476142477142478142479142480142481142482142483142484142485142486142487142488142489142490142491142492142493142494142495142496142497142498142499142500142501142502142503142504142505142506142507142508142509142510142511142512142513142514142515142516142517142518142519142520142521142522142523142524142525142526142527142528142529142530142531142532142533142534142535142536142537142538142539142540142541142542142543142544142545142546142547142548142549142550142551142552142553142554142555142556142557142558142559142560142561142562142563142564142565142566142567142568142569142570142571142572142573142574142575142576142577142578142579142580142581142582142583142584142585142586142587142588142589142590142591142592142593142594142595142596142597142598142599142600142601142602142603142604142605142606142607142608142609142610142611142612142613142614142615142616142617142618142619142620142621142622142623142624142625142626142627142628142629142630142631142632142633142634142635142636142637142638142639142640142641142642142643142644142645142646142647142648142649142650142651142652142653142654142655142656142657142658142659142660142661142662142663142664142665142666142667142668142669142670142671142672142673142674142675142676142677142678142679142680142681142682142683142684142685142686142687142688142689142690142691142692142693142694142695142696142697142698142699142700142701142702142703142704142705142706142707142708142709142710142711142712142713142714142715142716142717142718142719142720142721142722142723142724142725142726142727142728142729142730142731142732142733142734142735142736142737142738142739142740142741142742142743142744142745142746142747142748142749142750142751142752142753142754142755142756142757142758142759142760142761142762142763142764142765142766142767142768142769142770142771142772142773142774142775142776142777142778142779142780142781142782142783142784142785142786142787142788142789142790142791142792142793142794142795142796142797142798142799142800142801142802142803142804142805142806142807142808142809142810142811142812142813142814142815142816142817142818142819142820142821142822142823142824142825142826142827142828142829142830142831142832142833142834142835142836142837142838142839142840142841142842142843142844142845142846142847142848142849142850142851142852142853142854142855142856142857142858142859142860142861142862142863142864142865142866142867142868142869142870142871142872142873142874142875142876142877142878142879142880142881142882142883142884142885142886142887142888142889142890142891142892142893142894142895142896142897142898142899142900142901142902142903142904142905142906142907142908142909142910142911142912142913142914142915142916142917142918142919142920142921142922142923142924142925142926142927142928142929142930142931142932142933142934142935142936142937142938142939142940142941142942142943142944142945142946142947142948142949142950142951142952142953142954142955142956142957142958142959142960142961142962142963142964142965142966142967142968142969142970142971142972142973142974142975142976142977142978142979142980142981142982142983142984142985142986142987142988142989142990142991142992142993142994142995142996142997142998142999143000143001143002143003143004143005143006143007143008143009143010143011143012143013143014143015143016143017143018143019143020143021143022143023143024143025143026143027143028143029143030143031143032143033143034143035143036143037143038143039143040143041143042143043143044143045143046143047143048143049143050143051143052143053143054143055143056143057143058143059143060143061143062143063143064143065143066143067143068143069143070143071143072143073143074143075143076143077143078143079143080143081143082143083143084143085143086143087143088143089143090143091143092143093143094143095143096143097143098143099143100143101143102143103143104143105143106143107143108143109143110143111143112143113143114143115143116143117143118143119143120143121143122143123143124143125143126143127143128143129143130143131143132143133143134143135143136143137143138143139143140143141143142143143143144143145143146143147143148143149143150143151143152143153143154143155143156143157143158143159143160143161143162143163143164143165143166143167143168143169143170143171143172143173143174143175143176143177143178143179143180143181143182143183143184143185143186143187143188143189143190143191143192143193143194143195143196143197143198143199143200143201143202143203143204143205143206143207143208143209143210143211143212143213143214143215143216143217143218143219143220143221143222143223143224143225143226143227143228143229143230143231143232143233143234143235143236143237143238143239143240143241143242143243143244143245143246143247143248143249143250143251143252143253143254143255143256143257143258143259143260143261143262143263143264143265143266143267143268143269143270143271143272143273143274143275143276143277143278143279143280143281143282143283143284143285143286143287143288143289143290143291143292143293143294143295143296143297143298143299143300143301143302143303143304143305143306143307143308143309143310143311143312143313143314143315143316143317143318143319143320143321143322143323143324143325143326143327143328143329143330143331143332143333143334143335143336143337143338143339143340143341143342143343143344143345143346143347143348143349143350143351143352143353143354143355143356143357143358143359143360143361143362143363143364143365143366143367143368143369143370143371143372143373143374143375143376143377143378143379143380143381143382143383143384143385143386143387143388143389143390143391143392143393143394143395143396143397143398143399143400143401143402143403143404143405143406143407143408143409143410143411143412143413143414143415143416143417143418143419143420143421143422143423143424143425143426143427143428143429143430143431143432143433143434143435143436143437143438143439143440143441143442143443143444143445143446143447143448143449143450143451143452143453143454143455143456143457143458143459143460143461143462143463143464143465143466143467143468143469143470143471143472143473143474143475143476143477143478143479143480143481143482143483143484143485143486143487143488143489143490143491143492143493143494143495143496143497143498143499143500143501143502143503143504143505143506143507143508143509143510143511143512143513143514143515143516143517143518143519143520143521143522143523143524143525143526143527143528143529143530143531143532143533143534143535143536143537143538143539143540143541143542143543143544143545143546143547143548143549143550143551143552143553143554143555143556143557143558143559143560143561143562143563143564143565143566143567143568143569143570143571143572143573143574143575143576143577143578143579143580143581143582143583143584143585143586143587143588143589143590143591143592143593143594143595143596143597143598143599143600143601143602143603143604143605143606143607143608143609143610143611143612143613143614143615143616143617143618143619143620143621143622143623143624143625143626143627143628143629143630143631143632143633143634143635143636143637143638143639143640143641143642143643143644143645143646143647143648143649143650143651143652143653143654143655143656143657143658143659143660143661143662143663143664143665143666143667143668143669143670143671143672143673143674143675143676143677143678143679143680143681143682143683143684143685143686143687143688143689143690143691143692143693143694143695143696143697143698143699143700143701143702143703143704143705143706143707143708143709143710143711143712143713143714143715143716143717143718143719143720143721143722143723143724143725143726143727143728143729143730143731143732143733143734143735143736143737143738143739143740143741143742143743143744143745143746143747143748143749143750143751143752143753143754143755143756143757143758143759143760143761143762143763143764143765143766143767143768143769143770143771143772143773143774143775143776143777143778143779143780143781143782143783143784143785143786143787143788143789143790143791143792143793143794143795143796143797143798143799143800143801143802143803143804143805143806143807143808143809143810143811143812143813143814143815143816143817143818143819143820143821143822143823143824143825143826143827143828143829143830143831143832143833143834143835143836143837143838143839143840143841143842143843143844143845143846143847143848143849143850143851143852143853143854143855143856143857143858143859143860143861143862143863143864143865143866143867143868143869143870143871143872143873143874143875143876143877143878143879143880143881143882143883143884143885143886143887143888143889143890143891143892143893143894143895143896143897143898143899143900143901143902143903143904143905143906143907143908143909143910143911143912143913143914143915143916143917143918143919143920143921143922143923143924143925143926143927143928143929143930143931143932143933143934143935143936143937143938143939143940143941143942143943143944143945143946143947143948143949143950143951143952143953143954143955143956143957143958143959143960143961143962143963143964143965143966143967143968143969143970143971143972143973143974143975143976143977143978143979143980143981143982143983143984143985143986143987143988143989143990143991143992143993143994143995143996143997143998143999144000144001144002144003144004144005144006144007144008144009144010144011144012144013144014144015144016144017144018144019144020144021144022144023144024144025144026144027144028144029144030144031144032144033144034144035144036144037144038144039144040144041144042144043144044144045144046144047144048144049144050144051144052144053144054144055144056144057144058144059144060144061144062144063144064144065144066144067144068144069144070144071144072144073144074144075144076144077144078144079144080144081144082144083144084144085144086144087144088144089144090144091144092144093144094144095144096144097144098144099144100144101144102144103144104144105144106144107144108144109144110144111144112144113144114144115144116144117144118144119144120144121144122144123144124144125144126144127144128144129144130144131144132144133144134144135144136144137144138144139144140144141144142144143144144144145144146144147144148144149144150144151144152144153144154144155144156144157144158144159144160144161144162144163144164144165144166144167144168144169144170144171144172144173144174144175144176144177144178144179144180144181144182144183144184144185144186144187144188144189144190144191144192144193144194144195144196144197144198144199144200144201144202144203144204144205144206144207144208144209144210144211144212144213144214144215144216144217144218144219144220144221144222144223144224144225144226144227144228144229144230144231144232144233144234144235144236144237144238144239144240144241144242144243144244144245144246144247144248144249144250144251144252144253144254144255144256144257144258144259144260144261144262144263144264144265144266144267144268144269144270144271144272144273144274144275144276144277144278144279144280144281144282144283144284144285144286144287144288144289144290144291144292144293144294144295144296144297144298144299144300144301144302144303144304144305144306144307144308144309144310144311144312144313144314144315144316144317144318144319144320144321144322144323144324144325144326144327144328144329144330144331144332144333144334144335144336144337144338144339144340144341144342144343144344144345144346144347144348144349144350144351144352144353144354144355144356144357144358144359144360144361144362144363144364144365144366144367144368144369144370144371144372144373144374144375144376144377144378144379144380144381144382144383144384144385144386144387144388144389144390144391144392144393144394144395144396144397144398144399144400144401144402144403144404144405144406144407144408144409144410144411144412144413144414144415144416144417144418144419144420144421144422144423144424144425144426144427144428144429144430144431144432144433144434144435144436144437144438144439144440144441144442144443144444144445144446144447144448144449144450144451144452144453144454144455144456144457144458144459144460144461144462144463144464144465144466144467144468144469144470144471144472144473144474144475144476144477144478144479144480144481144482144483144484144485144486144487144488144489144490144491144492144493144494144495144496144497144498144499144500144501144502144503144504144505144506144507144508144509144510144511144512144513144514144515144516144517144518144519144520144521144522144523144524144525144526144527144528144529144530144531144532144533144534144535144536144537144538144539144540144541144542144543144544144545144546144547144548144549144550144551144552144553144554144555144556144557144558144559144560144561144562144563144564144565144566144567144568144569144570144571144572144573144574144575144576144577144578144579144580144581144582144583144584144585144586144587144588144589144590144591144592144593144594144595144596144597144598144599144600144601144602144603144604144605144606144607144608144609144610144611144612144613144614144615144616144617144618144619144620144621144622144623144624144625144626144627144628144629144630144631144632144633144634144635144636144637144638144639144640144641144642144643144644144645144646144647144648144649144650144651144652144653144654144655144656144657144658144659144660144661144662144663144664144665144666144667144668144669144670144671144672144673144674144675144676144677144678144679144680144681144682144683144684144685144686144687144688144689144690144691144692144693144694144695144696144697144698144699144700144701144702144703144704144705144706144707144708144709144710144711144712144713144714144715144716144717144718144719144720144721144722144723144724144725144726144727144728144729144730144731144732144733144734144735144736144737144738144739144740144741144742144743144744144745144746144747144748144749144750144751144752144753144754144755144756144757144758144759144760144761144762144763144764144765144766144767144768144769144770144771144772144773144774144775144776144777144778144779144780144781144782144783144784144785144786144787144788144789144790144791144792144793144794144795144796144797144798144799144800144801144802144803144804144805144806144807144808144809144810144811144812144813144814144815144816144817144818144819144820144821144822144823144824144825144826144827144828144829144830144831144832144833144834144835144836144837144838144839144840144841144842144843144844144845144846144847144848144849144850144851144852144853144854144855144856144857144858144859144860144861144862144863144864144865144866144867144868144869144870144871144872144873144874144875144876144877144878144879144880144881144882144883144884144885144886144887144888144889144890144891144892144893144894144895144896144897144898144899144900144901144902144903144904144905144906144907144908144909144910144911144912144913144914144915144916144917144918144919144920144921144922144923144924144925144926144927144928144929144930144931144932144933144934144935144936144937144938144939144940144941144942144943144944144945144946144947144948144949144950144951144952144953144954144955144956144957144958144959144960144961144962144963144964144965144966144967144968144969144970144971144972144973144974144975144976144977144978144979144980144981144982144983144984144985144986144987144988144989144990144991144992144993144994144995144996144997144998144999145000145001145002145003145004145005145006145007145008145009145010145011145012145013145014145015145016145017145018145019145020145021145022145023145024145025145026145027145028145029145030145031145032145033145034145035145036145037145038145039145040145041145042145043145044145045145046145047145048145049145050145051145052145053145054145055145056145057145058145059145060145061145062145063145064145065145066145067145068145069145070145071145072145073145074145075145076145077145078145079145080145081145082145083145084145085145086145087145088145089145090145091145092145093145094145095145096145097145098145099145100145101145102145103145104145105145106145107145108145109145110145111145112145113145114145115145116145117145118145119145120145121145122145123145124145125145126145127145128145129145130145131145132145133145134145135145136145137145138145139145140145141145142145143145144145145145146145147145148145149145150145151145152145153145154145155145156145157145158145159145160145161145162145163145164145165145166145167145168145169145170145171145172145173145174145175145176145177145178145179145180145181145182145183145184145185145186145187145188145189145190145191145192145193145194145195145196145197145198145199145200145201145202145203145204145205145206145207145208145209145210145211145212145213145214145215145216145217145218145219145220145221145222145223145224145225145226145227145228145229145230145231145232145233145234145235145236145237145238145239145240145241145242145243145244145245145246145247145248145249145250145251145252145253145254145255145256145257145258145259145260145261145262145263145264145265145266145267145268145269145270145271145272145273145274145275145276145277145278145279145280145281145282145283145284145285145286145287145288145289145290145291145292145293145294145295145296145297145298145299145300145301145302145303145304145305145306145307145308145309145310145311145312145313145314145315145316145317145318145319145320145321145322145323145324145325145326145327145328145329145330145331145332145333145334145335145336145337145338145339145340145341145342145343145344145345145346145347145348145349145350145351145352145353145354145355145356145357145358145359145360145361145362145363145364145365145366145367145368145369145370145371145372145373145374145375145376145377145378145379145380145381145382145383145384145385145386145387145388145389145390145391145392145393145394145395145396145397145398145399145400145401145402145403145404145405145406145407145408145409145410145411145412145413145414145415145416145417145418145419145420145421145422145423145424145425145426145427145428145429145430145431145432145433145434145435145436145437145438145439145440145441145442145443145444145445145446145447145448145449145450145451145452145453145454145455145456145457145458145459145460145461145462145463145464145465145466145467145468145469145470145471145472145473145474145475145476145477145478145479145480145481145482145483145484145485145486145487145488145489145490145491145492145493145494145495145496145497145498145499145500145501145502145503145504145505145506145507145508145509145510145511145512145513145514145515145516145517145518145519145520145521145522145523145524145525145526145527145528145529145530145531145532145533145534145535145536145537145538145539145540145541145542145543145544145545145546145547145548145549145550145551145552145553145554145555145556145557145558145559145560145561145562145563145564145565145566145567145568145569145570145571145572145573145574145575145576145577145578145579145580145581145582145583145584145585145586145587145588145589145590145591145592145593145594145595145596145597145598145599145600145601145602145603145604145605145606145607145608145609145610145611145612145613145614145615145616145617145618145619145620145621145622145623145624145625145626145627145628145629145630145631145632145633145634145635145636145637145638145639145640145641145642145643145644145645145646145647145648145649145650145651145652145653145654145655145656145657145658145659145660145661145662145663145664145665145666145667145668145669145670145671145672145673145674145675145676145677145678145679145680145681145682145683145684145685145686145687145688145689145690145691145692145693145694145695145696145697145698145699145700145701145702145703145704145705145706145707145708145709145710145711145712145713145714145715145716145717145718145719145720145721145722145723145724145725145726145727145728145729145730145731145732145733145734145735145736145737145738145739145740145741145742145743145744145745145746145747145748145749145750145751145752145753145754145755145756145757145758145759145760145761145762145763145764145765145766145767145768145769145770145771145772145773145774145775145776145777145778145779145780145781145782145783145784145785145786145787145788145789145790145791145792145793145794145795145796145797145798145799145800145801145802145803145804145805145806145807145808145809145810145811145812145813145814145815145816145817145818145819145820145821145822145823145824145825145826145827145828145829145830145831145832145833145834145835145836145837145838145839145840145841145842145843145844145845145846145847145848145849145850145851145852145853145854145855145856145857145858145859145860145861145862145863145864145865145866145867145868145869145870145871145872145873145874145875145876145877145878145879145880145881145882145883145884145885145886145887145888145889145890145891145892145893145894145895145896145897145898145899145900145901145902145903145904145905145906145907145908145909145910145911145912145913145914145915145916145917145918145919145920145921145922145923145924145925145926145927145928145929145930145931145932145933145934145935145936145937145938145939145940145941145942145943145944145945145946145947145948145949145950145951145952145953145954145955145956145957145958145959145960145961145962145963145964145965145966145967145968145969145970145971145972145973145974145975145976145977145978145979145980145981145982145983145984145985145986145987145988145989145990145991145992145993145994145995145996145997145998145999146000146001146002146003146004146005146006146007146008146009146010146011146012146013146014146015146016146017146018146019146020146021146022146023146024146025146026146027146028146029146030146031146032146033146034146035146036146037146038146039146040146041146042146043146044146045146046146047146048146049146050146051146052146053146054146055146056146057146058146059146060146061146062146063146064146065146066146067146068146069146070146071146072146073146074146075146076146077146078146079146080146081146082146083146084146085146086146087146088146089146090146091146092146093146094146095146096146097146098146099146100146101146102146103146104146105146106146107146108146109146110146111146112146113146114146115146116146117146118146119146120146121146122146123146124146125146126146127146128146129146130146131146132146133146134146135146136146137146138146139146140146141146142146143146144146145146146146147146148146149146150146151146152146153146154146155146156146157146158146159146160146161146162146163146164146165146166146167146168146169146170146171146172146173146174146175146176146177146178146179146180146181146182146183146184146185146186146187146188146189146190146191146192146193146194146195146196146197146198146199146200146201146202146203146204146205146206146207146208146209146210146211146212146213146214146215146216146217146218146219146220146221146222146223146224146225146226146227146228146229146230146231146232146233146234146235146236146237146238146239146240146241146242146243146244146245146246146247146248146249146250146251146252146253146254146255146256146257146258146259146260146261146262146263146264146265146266146267146268146269146270146271146272146273146274146275146276146277146278146279146280146281146282146283146284146285146286146287146288146289146290146291146292146293146294146295146296146297146298146299146300146301146302146303146304146305146306146307146308146309146310146311146312146313146314146315146316146317146318146319146320146321146322146323146324146325146326146327146328146329146330146331146332146333146334146335146336146337146338146339146340146341146342146343146344146345146346146347146348146349146350146351146352146353146354146355146356146357146358146359146360146361146362146363146364146365146366146367146368146369146370146371146372146373146374146375146376146377146378146379146380146381146382146383146384146385146386146387146388146389146390146391146392146393146394146395146396146397146398146399146400146401146402146403146404146405146406146407146408146409146410146411146412146413146414146415146416146417146418146419146420146421146422146423146424146425146426146427146428146429146430146431146432146433146434146435146436146437146438146439146440146441146442146443146444146445146446146447146448146449146450146451146452146453146454146455146456146457146458146459146460146461146462146463146464146465146466146467146468146469146470146471146472146473146474146475146476146477146478146479146480146481146482146483146484146485146486146487146488146489146490146491146492146493146494146495146496146497146498146499146500146501146502146503146504146505146506146507146508146509146510146511146512146513146514146515146516146517146518146519146520146521146522146523146524146525146526146527146528146529146530146531146532146533146534146535146536146537146538146539146540146541146542146543146544146545146546146547146548146549146550146551146552146553146554146555146556146557146558146559146560146561146562146563146564146565146566146567146568146569146570146571146572146573146574146575146576146577146578146579146580146581146582146583146584146585146586146587146588146589146590146591146592146593146594146595146596146597146598146599146600146601146602146603146604146605146606146607146608146609146610146611146612146613146614146615146616146617146618146619146620146621146622146623146624146625146626146627146628146629146630146631146632146633146634146635146636146637146638146639146640146641146642146643146644146645146646146647146648146649146650146651146652146653146654146655146656146657146658146659146660146661146662146663146664146665146666146667146668146669146670146671146672146673146674146675146676146677146678146679146680146681146682146683146684146685146686146687146688146689146690146691146692146693146694146695146696146697146698146699146700146701146702146703146704146705146706146707146708146709146710146711146712146713146714146715146716146717146718146719146720146721146722146723146724146725146726146727146728146729146730146731146732146733146734146735146736146737146738146739146740146741146742146743146744146745146746146747146748146749146750146751146752146753146754146755146756146757146758146759146760146761146762146763146764146765146766146767146768146769146770146771146772146773146774146775146776146777146778146779146780146781146782146783146784146785146786146787146788146789146790146791146792146793146794146795146796146797146798146799146800146801146802146803146804146805146806146807146808146809146810146811146812146813146814146815146816146817146818146819146820146821146822146823146824146825146826146827146828146829146830146831146832146833146834146835146836146837146838146839146840146841146842146843146844146845146846146847146848146849146850146851146852146853146854146855146856146857146858146859146860146861146862146863146864146865146866146867146868146869146870146871146872146873146874146875146876146877146878146879146880146881146882146883146884146885146886146887146888146889146890146891146892146893146894146895146896146897146898146899146900146901146902146903146904146905146906146907146908146909146910146911146912146913146914146915146916146917146918146919146920146921146922146923146924146925146926146927146928146929146930146931146932146933146934146935146936146937146938146939146940146941146942146943146944146945146946146947146948146949146950146951146952146953146954146955146956146957146958146959146960146961146962146963146964146965146966146967146968146969146970146971146972146973146974146975146976146977146978146979146980146981146982146983146984146985146986146987146988146989146990146991146992146993146994146995146996146997146998146999147000147001147002147003147004147005147006147007147008147009147010147011147012147013147014147015147016147017147018147019147020147021147022147023147024147025147026147027147028147029147030147031147032147033147034147035147036147037147038147039147040147041147042147043147044147045147046147047147048147049147050147051147052147053147054147055147056147057147058147059147060147061147062147063147064147065147066147067147068147069147070147071147072147073147074147075147076147077147078147079147080147081147082147083147084147085147086147087147088147089147090147091147092147093147094147095147096147097147098147099147100147101147102147103147104147105147106147107147108147109147110147111147112147113147114147115147116147117147118147119147120147121147122147123147124147125147126147127147128147129147130147131147132147133147134147135147136147137147138147139147140147141147142147143147144147145147146147147147148147149147150147151147152147153147154147155147156147157147158147159147160147161147162147163147164147165147166147167147168147169147170147171147172147173147174147175147176147177147178147179147180147181147182147183147184147185147186147187147188147189147190147191147192147193147194147195147196147197147198147199147200147201147202147203147204147205147206147207147208147209147210147211147212147213147214147215147216147217147218147219147220147221147222147223147224147225147226147227147228147229147230147231147232147233147234147235147236147237147238147239147240147241147242147243147244147245147246147247147248147249147250147251147252147253147254147255147256147257147258147259147260147261147262147263147264147265147266147267147268147269147270147271147272147273147274147275147276147277147278147279147280147281147282147283147284147285147286147287147288147289147290147291147292147293147294147295147296147297147298147299147300147301147302147303147304147305147306147307147308147309147310147311147312147313147314147315147316147317147318147319147320147321147322147323147324147325147326147327147328147329147330147331147332147333147334147335147336147337147338147339147340147341147342147343147344147345147346147347147348147349147350147351147352147353147354147355147356147357147358147359147360147361147362147363147364147365147366147367147368147369147370147371147372147373147374147375147376147377147378147379147380147381147382147383147384147385147386147387147388147389147390147391147392147393147394147395147396147397147398147399147400147401147402147403147404147405147406147407147408147409147410147411147412147413147414147415147416147417147418147419147420147421147422147423147424147425147426147427147428147429147430147431147432147433147434147435147436147437147438147439147440147441147442147443147444147445147446147447147448147449147450147451147452147453147454147455147456147457147458147459147460147461147462147463147464147465147466147467147468147469147470147471147472147473147474147475147476147477147478147479147480147481147482147483147484147485147486147487147488147489147490147491147492147493147494147495147496147497147498147499147500147501147502147503147504147505147506147507147508147509147510147511147512147513147514147515147516147517147518147519147520147521147522147523147524147525147526147527147528147529147530147531147532147533147534147535147536147537147538147539147540147541147542147543147544147545147546147547147548147549147550147551147552147553147554147555147556147557147558147559147560147561147562147563147564147565147566147567147568147569147570147571147572147573147574147575147576147577147578147579147580147581147582147583147584147585147586147587147588147589147590147591147592147593147594147595147596147597147598147599147600147601147602147603147604147605147606147607147608147609147610147611147612147613147614147615147616147617147618147619147620147621147622147623147624147625147626147627147628147629147630147631147632147633147634147635147636147637147638147639147640147641147642147643147644147645147646147647147648147649147650147651147652147653147654147655147656147657147658147659147660147661147662147663147664147665147666147667147668147669147670147671147672147673147674147675147676147677147678147679147680147681147682147683147684147685147686147687147688147689147690147691147692147693147694147695147696147697147698147699147700147701147702147703147704147705147706147707147708147709147710147711147712147713147714147715147716147717147718147719147720147721147722147723147724147725147726147727147728147729147730147731147732147733147734147735147736147737147738147739147740147741147742147743147744147745147746147747147748147749147750147751147752147753147754147755147756147757147758147759147760147761147762147763147764147765147766147767147768147769147770147771147772147773147774147775147776147777147778147779147780147781147782147783147784147785147786147787147788147789147790147791147792147793147794147795147796147797147798147799147800147801147802147803147804147805147806147807147808147809147810147811147812147813147814147815147816147817147818147819147820147821147822147823147824147825147826147827147828147829147830147831147832147833147834147835147836147837147838147839147840147841147842147843147844147845147846147847147848147849147850147851147852147853147854147855147856147857147858147859147860147861147862147863147864147865147866147867147868147869147870147871147872147873147874147875147876147877147878147879147880147881147882147883147884147885147886147887147888147889147890147891147892147893147894147895147896147897147898147899147900147901147902147903147904147905147906147907147908147909147910147911147912147913147914147915147916147917147918147919147920147921147922147923147924147925147926147927147928147929147930147931147932147933147934147935147936147937147938147939147940147941147942147943147944147945147946147947147948147949147950147951147952147953147954147955147956147957147958147959147960147961147962147963147964147965147966147967147968147969147970147971147972147973147974147975147976147977147978147979147980147981147982147983147984147985147986147987147988147989147990147991147992147993147994147995147996147997147998147999148000148001148002148003148004148005148006148007148008148009148010148011148012148013148014148015148016148017148018148019148020148021148022148023148024148025148026148027148028148029148030148031148032148033148034148035148036148037148038148039148040148041148042148043148044148045148046148047148048148049148050148051148052148053148054148055148056148057148058148059148060148061148062148063148064148065148066148067148068148069148070148071148072148073148074148075148076148077148078148079148080148081148082148083148084148085148086148087148088148089148090148091148092148093148094148095148096148097148098148099148100148101148102148103148104148105148106148107148108148109148110148111148112148113148114148115148116148117148118148119148120148121148122148123148124148125148126148127148128148129148130148131148132148133148134148135148136148137148138148139148140148141148142148143148144148145148146148147148148148149148150148151148152148153148154148155148156148157148158148159148160148161148162148163148164148165148166148167148168148169148170148171148172148173148174148175148176148177148178148179148180148181148182148183148184148185148186148187148188148189148190148191148192148193148194148195148196148197148198148199148200148201148202148203148204148205148206148207148208148209148210148211148212148213148214148215148216148217148218148219148220148221148222148223148224148225148226148227148228148229148230148231148232148233148234148235148236148237148238148239148240148241148242148243148244148245148246148247148248148249148250148251148252148253148254148255148256148257148258148259148260148261148262148263148264148265148266148267148268148269148270148271148272148273148274148275148276148277148278148279148280148281148282148283148284148285148286148287148288148289148290148291148292148293148294148295148296148297148298148299148300148301148302148303148304148305148306148307148308148309148310148311148312148313148314148315148316148317148318148319148320148321148322148323148324148325148326148327148328148329148330148331148332148333148334148335148336148337148338148339148340148341148342148343148344148345148346148347148348148349148350148351148352148353148354148355148356148357148358148359148360148361148362148363148364148365148366148367148368148369148370148371148372148373148374148375148376148377148378148379148380148381148382148383148384148385148386148387148388148389148390148391148392148393148394148395148396148397148398148399148400148401148402148403148404148405148406148407148408148409148410148411148412148413148414148415148416148417148418148419148420148421148422148423148424148425148426148427148428148429148430148431148432148433148434148435148436148437148438148439148440148441148442148443148444148445148446148447148448148449148450148451148452148453148454148455148456148457148458148459148460148461148462148463148464148465148466148467148468148469148470148471148472148473148474148475148476148477148478148479148480148481148482148483148484148485148486148487148488148489148490148491148492148493148494148495148496148497148498148499148500148501148502148503148504148505148506148507148508148509148510148511148512148513148514148515148516148517148518148519148520148521148522148523148524148525148526148527148528148529148530148531148532148533148534148535148536148537148538148539148540148541148542148543148544148545148546148547148548148549148550148551148552148553148554148555148556148557148558148559148560148561148562148563148564148565148566148567148568148569148570148571148572148573148574148575148576148577148578148579148580148581148582148583148584148585148586148587148588148589148590148591148592148593148594148595148596148597148598148599148600148601148602148603148604148605148606148607148608148609148610148611148612148613148614148615148616148617148618148619148620148621148622148623148624148625148626148627148628148629148630148631148632148633148634148635148636148637148638148639148640148641148642148643148644148645148646148647148648148649148650148651148652148653148654148655148656148657148658148659148660148661148662148663148664148665148666148667148668148669148670148671148672148673148674148675148676148677148678148679148680148681148682148683148684148685148686148687148688148689148690148691148692148693148694148695148696148697148698148699148700148701148702148703148704148705148706148707148708148709148710148711148712148713148714148715148716148717148718148719148720148721148722148723148724148725148726148727148728148729148730148731148732148733148734148735148736148737148738148739148740148741148742148743148744148745148746148747148748148749148750148751148752148753148754148755148756148757148758148759148760148761148762148763148764148765148766148767148768148769148770148771148772148773148774148775148776148777148778148779148780148781148782148783148784148785148786148787148788148789148790148791148792148793148794148795148796148797148798148799148800148801148802148803148804148805148806148807148808148809148810148811148812148813148814148815148816148817148818148819148820148821148822148823148824148825148826148827148828148829148830148831148832148833148834148835148836148837148838148839148840148841148842148843148844148845148846148847148848148849148850148851148852148853148854148855148856148857148858148859148860148861148862148863148864148865148866148867148868148869148870148871148872148873148874148875148876148877148878148879148880148881148882148883148884148885148886148887148888148889148890148891148892148893148894148895148896148897148898148899148900148901148902148903148904148905148906148907148908148909148910148911148912148913148914148915148916148917148918148919148920148921148922148923148924148925148926148927148928148929148930148931148932148933148934148935148936148937148938148939148940148941148942148943148944148945148946148947148948148949148950148951148952148953148954148955148956148957148958148959148960148961148962148963148964148965148966148967148968148969148970148971148972148973148974148975148976148977148978148979148980148981148982148983148984148985148986148987148988148989148990148991148992148993148994148995148996148997148998148999149000149001149002149003149004149005149006149007149008149009149010149011149012149013149014149015149016149017149018149019149020149021149022149023149024149025149026149027149028149029149030149031149032149033149034149035149036149037149038149039149040149041149042149043149044149045149046149047149048149049149050149051149052149053149054149055149056149057149058149059149060149061149062149063149064149065149066149067149068149069149070149071149072149073149074149075149076149077149078149079149080149081149082149083149084149085149086149087149088149089149090149091149092149093149094149095149096149097149098149099149100149101149102149103149104149105149106149107149108149109149110149111149112149113149114149115149116149117149118149119149120149121149122149123149124149125149126149127149128149129149130149131149132149133149134149135149136149137149138149139149140149141149142149143149144149145149146149147149148149149149150149151149152149153149154149155149156149157149158149159149160149161149162149163149164149165149166149167149168149169149170149171149172149173149174149175149176149177149178149179149180149181149182149183149184149185149186149187149188149189149190149191149192149193149194149195149196149197149198149199149200149201149202149203149204149205149206149207149208149209149210149211149212149213149214149215149216149217149218149219149220149221149222149223149224149225149226149227149228149229149230149231149232149233149234149235149236149237149238149239149240149241149242149243149244149245149246149247149248149249149250149251149252149253149254149255149256149257149258149259149260149261149262149263149264149265149266149267149268149269149270149271149272149273149274149275149276149277149278149279149280149281149282149283149284149285149286149287149288149289149290149291149292149293149294149295149296149297149298149299149300149301149302149303149304149305149306149307149308149309149310149311149312149313149314149315149316149317149318149319149320149321149322149323149324149325149326149327149328149329149330149331149332149333149334149335149336149337149338149339149340149341149342149343149344149345149346149347149348149349149350149351149352149353149354149355149356149357149358149359149360149361149362149363149364149365149366149367149368149369149370149371149372149373149374149375149376149377149378149379149380149381149382149383149384149385149386149387149388149389149390149391149392149393149394149395149396149397149398149399149400149401149402149403149404149405149406149407149408149409149410149411149412149413149414149415149416149417149418149419149420149421149422149423149424149425149426149427149428149429149430149431149432149433149434149435149436149437149438149439149440149441149442149443149444149445149446149447149448149449149450149451149452149453149454149455149456149457149458149459149460149461149462149463149464149465149466149467149468149469149470149471149472149473149474149475149476149477149478149479149480149481149482149483149484149485149486149487149488149489149490149491149492149493149494149495149496149497149498149499149500149501149502149503149504149505149506149507149508149509149510149511149512149513149514149515149516149517149518149519149520149521149522149523149524149525149526149527149528149529149530149531149532149533149534149535149536149537149538149539149540149541149542149543149544149545149546149547149548149549149550149551149552149553149554149555149556149557149558149559149560149561149562149563149564149565149566149567149568149569149570149571149572149573149574149575149576149577149578149579149580149581149582149583149584149585149586149587149588149589149590149591149592149593149594149595149596149597149598149599149600149601149602149603149604149605149606149607149608149609149610149611149612149613149614149615149616149617149618149619149620149621149622149623149624149625149626149627149628149629149630149631149632149633149634149635149636149637149638149639149640149641149642149643149644149645149646149647149648149649149650149651149652149653149654149655149656149657149658149659149660149661149662149663149664149665149666149667149668149669149670149671149672149673149674149675149676149677149678149679149680149681149682149683149684149685149686149687149688149689149690149691149692149693149694149695149696149697149698149699149700149701149702149703149704149705149706149707149708149709149710149711149712149713149714149715149716149717149718149719149720149721149722149723149724149725149726149727149728149729149730149731149732149733149734149735149736149737149738149739149740149741149742149743149744149745149746149747149748149749149750149751149752149753149754149755149756149757149758149759149760149761149762149763149764149765149766149767149768149769149770149771149772149773149774149775149776149777149778149779149780149781149782149783149784149785149786149787149788149789149790149791149792149793149794149795149796149797149798149799149800149801149802149803149804149805149806149807149808149809149810149811149812149813149814149815149816149817149818149819149820149821149822149823149824149825149826149827149828149829149830149831149832149833149834149835149836149837149838149839149840149841149842149843149844149845149846149847149848149849149850149851149852149853149854149855149856149857149858149859149860149861149862149863149864149865149866149867149868149869149870149871149872149873149874149875149876149877149878149879149880149881149882149883149884149885149886149887149888149889149890149891149892149893149894149895149896149897149898149899149900149901149902149903149904149905149906149907149908149909149910149911149912149913149914149915149916149917149918149919149920149921149922149923149924149925149926149927149928149929149930149931149932149933149934149935149936149937149938149939149940149941149942149943149944149945149946149947149948149949149950149951149952149953149954149955149956149957149958149959149960149961149962149963149964149965149966149967149968149969149970149971149972149973149974149975149976149977149978149979149980149981149982149983149984149985149986149987149988149989149990149991149992149993149994149995149996149997149998149999150000150001150002150003150004150005150006150007150008150009150010150011150012150013150014150015150016150017150018150019150020150021150022150023150024150025150026150027150028150029150030150031150032150033150034150035150036150037150038150039150040150041150042150043150044150045150046150047150048150049150050150051150052150053150054150055150056150057150058150059150060150061150062150063150064150065150066150067150068150069150070150071150072150073150074150075150076150077150078150079150080150081150082150083150084150085150086150087150088150089150090150091150092150093150094150095150096150097150098150099150100150101150102150103150104150105150106150107150108150109150110150111150112150113150114150115150116150117150118150119150120150121150122150123150124150125150126150127150128150129150130150131150132150133150134150135150136150137150138150139150140150141150142150143150144150145150146150147150148150149150150150151150152150153150154150155150156150157150158150159150160150161150162150163150164150165150166150167150168150169150170150171150172150173150174150175150176150177150178150179150180150181150182150183150184150185150186150187150188150189150190150191150192150193150194150195150196150197150198150199150200150201150202150203150204150205150206150207150208150209150210150211150212150213150214150215150216150217150218150219150220150221150222150223150224150225150226150227150228150229150230150231150232150233150234150235150236150237150238150239150240150241150242150243150244150245150246150247150248150249150250150251150252150253150254150255150256150257150258150259150260150261150262150263150264150265150266150267150268150269150270150271150272150273150274150275150276150277150278150279150280150281150282150283150284150285150286150287150288150289150290150291150292150293150294150295150296150297150298150299150300150301150302150303150304150305150306150307150308150309150310150311150312150313150314150315150316150317150318150319150320150321150322150323150324150325150326150327150328150329150330150331150332150333150334150335150336150337150338150339150340150341150342150343150344150345150346150347150348150349150350150351150352150353150354150355150356150357150358150359150360150361150362150363150364150365150366150367150368150369150370150371150372150373150374150375150376150377150378150379150380150381150382150383150384150385150386150387150388150389150390150391150392150393150394150395150396150397150398150399150400150401150402150403150404150405150406150407150408150409150410150411150412150413150414150415150416150417150418150419150420150421150422150423150424150425150426150427150428150429150430150431150432150433150434150435150436150437150438150439150440150441150442150443150444150445150446150447150448150449150450150451150452150453150454150455150456150457150458150459150460150461150462150463150464150465150466150467150468150469150470150471150472150473150474150475150476150477150478150479150480150481150482150483150484150485150486150487150488150489150490150491150492150493150494150495150496150497150498150499150500150501150502150503150504150505150506150507150508150509150510150511150512150513150514150515150516150517150518150519150520150521150522150523150524150525150526150527150528150529150530150531150532150533150534150535150536150537150538150539150540150541150542150543150544150545150546150547150548150549150550150551150552150553150554150555150556150557150558150559150560150561150562150563150564150565150566150567150568150569150570150571150572150573150574150575150576150577150578150579150580150581150582150583150584150585150586150587150588150589150590150591150592150593150594150595150596150597150598150599150600150601150602150603150604150605150606150607150608150609150610150611150612150613150614150615150616150617150618150619150620150621150622150623150624150625150626150627150628150629150630150631150632150633150634150635150636150637150638150639150640150641150642150643150644150645150646150647150648150649150650150651150652150653150654150655150656150657150658150659150660150661150662150663150664150665150666150667150668150669150670150671150672150673150674150675150676150677150678150679150680150681150682150683150684150685150686150687150688150689150690150691150692150693150694150695150696150697150698150699150700150701150702150703150704150705150706150707150708150709150710150711150712150713150714150715150716150717150718150719150720150721150722150723150724150725150726150727150728150729150730150731150732150733150734150735150736150737150738150739150740150741150742150743150744150745150746150747150748150749150750150751150752150753150754150755150756150757150758150759150760150761150762150763150764150765150766150767150768150769150770150771150772150773150774150775150776150777150778150779150780150781150782150783150784150785150786150787150788150789150790150791150792150793150794150795150796150797150798150799150800150801150802150803150804150805150806150807150808150809150810150811150812150813150814150815150816150817150818150819150820150821150822150823150824150825150826150827150828150829150830150831150832150833150834150835150836150837150838150839150840150841150842150843150844150845150846150847150848150849150850150851150852150853150854150855150856150857150858150859150860150861150862150863150864150865150866150867150868150869150870150871150872150873150874150875150876150877150878150879150880150881150882150883150884150885150886150887150888150889150890150891150892150893150894150895150896150897150898150899150900150901150902150903150904150905150906150907150908150909150910150911150912150913150914150915150916150917150918150919150920150921150922150923150924150925150926150927150928150929150930150931150932150933150934150935150936150937150938150939150940150941150942150943150944150945150946150947150948150949150950150951150952150953150954150955150956150957150958150959150960150961150962150963150964150965150966150967150968150969150970150971150972150973150974150975150976150977150978150979150980150981150982150983150984150985150986150987150988150989150990150991150992150993150994150995150996150997150998150999151000151001151002151003151004151005151006151007151008151009151010151011151012151013151014151015151016151017151018151019151020151021151022151023151024151025151026151027151028151029151030151031151032151033151034151035151036151037151038151039151040151041151042151043151044151045151046151047151048151049151050151051151052151053151054151055151056151057151058151059151060151061151062151063151064151065151066151067151068151069151070151071151072151073151074151075151076151077151078151079151080151081151082151083151084151085151086151087151088151089151090151091151092151093151094151095151096151097151098151099151100151101151102151103151104151105151106151107151108151109151110151111151112151113151114151115151116151117151118151119151120151121151122151123151124151125151126151127151128151129151130151131151132151133151134151135151136151137151138151139151140151141151142151143151144151145151146151147151148151149151150151151151152151153151154151155151156151157151158151159151160151161151162151163151164151165151166151167151168151169151170151171151172151173151174151175151176151177151178151179151180151181151182151183151184151185151186151187151188151189151190151191151192151193151194151195151196151197151198151199151200151201151202151203151204151205151206151207151208151209151210151211151212151213151214151215151216151217151218151219151220151221151222151223151224151225151226151227151228151229151230151231151232151233151234151235151236151237151238151239151240151241151242151243151244151245151246151247151248151249151250151251151252151253151254151255151256151257151258151259151260151261151262151263151264151265151266151267151268151269151270151271151272151273151274151275151276151277151278151279151280151281151282151283151284151285151286151287151288151289151290151291151292151293151294151295151296151297151298151299151300151301151302151303151304151305151306151307151308151309151310151311151312151313151314151315151316151317151318151319151320151321151322151323151324151325151326151327151328151329151330151331151332151333151334151335151336151337151338151339151340151341151342151343151344151345151346151347151348151349151350151351151352151353151354151355151356151357151358151359151360151361151362151363151364151365151366151367151368151369151370151371151372151373151374151375151376151377151378151379151380151381151382151383151384151385151386151387151388151389151390151391151392151393151394151395151396151397151398151399151400151401151402151403151404151405151406151407151408151409151410151411151412151413151414151415151416151417151418151419151420151421151422151423151424151425151426151427151428151429151430151431151432151433151434151435151436151437151438151439151440151441151442151443151444151445151446151447151448151449151450151451151452151453151454151455151456151457151458151459151460151461151462151463151464151465151466151467151468151469151470151471151472151473151474151475151476151477151478151479151480151481151482151483151484151485151486151487151488151489151490151491151492151493151494151495151496151497151498151499151500151501151502151503151504151505151506151507151508151509151510151511151512151513151514151515151516151517151518151519151520151521151522151523151524151525151526151527151528151529151530151531151532151533151534151535151536151537151538151539151540151541151542151543151544151545151546151547151548151549151550151551151552151553151554151555151556151557151558151559151560151561151562151563151564151565151566151567151568151569151570151571151572151573151574151575151576151577151578151579151580151581151582151583151584151585151586151587151588151589151590151591151592151593151594151595151596151597151598151599151600151601151602151603151604151605151606151607151608151609151610151611151612151613151614151615151616151617151618151619151620151621151622151623151624151625151626151627151628151629151630151631151632151633151634151635151636151637151638151639151640151641151642151643151644151645151646151647151648151649151650151651151652151653151654151655151656151657151658151659151660151661151662151663151664151665151666151667151668151669151670151671151672151673151674151675151676151677151678151679151680151681151682151683151684151685151686151687151688151689151690151691151692151693151694151695151696151697151698151699151700151701151702151703151704151705151706151707151708151709151710151711151712151713151714151715151716151717151718151719151720151721151722151723151724151725151726151727151728151729151730151731151732151733151734151735151736151737151738151739151740151741151742151743151744151745151746151747151748151749151750151751151752151753151754151755151756151757151758151759151760151761151762151763151764151765151766151767151768151769151770151771151772151773151774151775151776151777151778151779151780151781151782151783151784151785151786151787151788151789151790151791151792151793151794151795151796151797151798151799151800151801151802151803151804151805151806151807151808151809151810151811151812151813151814151815151816151817151818151819151820151821151822151823151824151825151826151827151828151829151830151831151832151833151834151835151836151837151838151839151840151841151842151843151844151845151846151847151848151849151850151851151852151853151854151855151856151857151858151859151860151861151862151863151864151865151866151867151868151869151870151871151872151873151874151875151876151877151878151879151880151881151882151883151884151885151886151887151888151889151890151891151892151893151894151895151896151897151898151899151900151901151902151903151904151905151906151907151908151909151910151911151912151913151914151915151916151917151918151919151920151921151922151923151924151925151926151927151928151929151930151931151932151933151934151935151936151937151938151939151940151941151942151943151944151945151946151947151948151949151950151951151952151953151954151955151956151957151958151959151960151961151962151963151964151965151966151967151968151969151970151971151972151973151974151975151976151977151978151979151980151981151982151983151984151985151986151987151988151989151990151991151992151993151994151995151996151997151998151999152000152001152002152003152004152005152006152007152008152009152010152011152012152013152014152015152016152017152018152019152020152021152022152023152024152025152026152027152028152029152030152031152032152033152034152035152036152037152038152039152040152041152042152043152044152045152046152047152048152049152050152051152052152053152054152055152056152057152058152059152060152061152062152063152064152065152066152067152068152069152070152071152072152073152074152075152076152077152078152079152080152081152082152083152084152085152086152087152088152089152090152091152092152093152094152095152096152097152098152099152100152101152102152103152104152105152106152107152108152109152110152111152112152113152114152115152116152117152118152119152120152121152122152123152124152125152126152127152128152129152130152131152132152133152134152135152136152137152138152139152140152141152142152143152144152145152146152147152148152149152150152151152152152153152154152155152156152157152158152159152160152161152162152163152164152165152166152167152168152169152170152171152172152173152174152175152176152177152178152179152180152181152182152183152184152185152186152187152188152189152190152191152192152193152194152195152196152197152198152199152200152201152202152203152204152205152206152207152208152209152210152211152212152213152214152215152216152217152218152219152220152221152222152223152224152225152226152227152228152229152230152231152232152233152234152235152236152237152238152239152240152241152242152243152244152245152246152247152248152249152250152251152252152253152254152255152256152257152258152259152260152261152262152263152264152265152266152267152268152269152270152271152272152273152274152275152276152277152278152279152280152281152282152283152284152285152286152287152288152289152290152291152292152293152294152295152296152297152298152299152300152301152302152303152304152305152306152307152308152309152310152311152312152313152314152315152316152317152318152319152320152321152322152323152324152325152326152327152328152329152330152331152332152333152334152335152336152337152338152339152340152341152342152343152344152345152346152347152348152349152350152351152352152353152354152355152356152357152358152359152360152361152362152363152364152365152366152367152368152369152370152371152372152373152374152375152376152377152378152379152380152381152382152383152384152385152386152387152388152389152390152391152392152393152394152395152396152397152398152399152400152401152402152403152404152405152406152407152408152409152410152411152412152413152414152415152416152417152418152419152420152421152422152423152424152425152426152427152428152429152430152431152432152433152434152435152436152437152438152439152440152441152442152443152444152445152446152447152448152449152450152451152452152453152454152455152456152457152458152459152460152461152462152463152464152465152466152467152468152469152470152471152472152473152474152475152476152477152478152479152480152481152482152483152484152485152486152487152488152489152490152491152492152493152494152495152496152497152498152499152500152501152502152503152504152505152506152507152508152509152510152511152512152513152514152515152516152517152518152519152520152521152522152523152524152525152526152527152528152529152530152531152532152533152534152535152536152537152538152539152540152541152542152543152544152545152546152547152548152549152550152551152552152553152554152555152556152557152558152559152560152561152562152563152564152565152566152567152568152569152570152571152572152573152574152575152576152577152578152579152580152581152582152583152584152585152586152587152588152589152590152591152592152593152594152595152596152597152598152599152600152601152602152603152604152605152606152607152608152609152610152611152612152613152614152615152616152617152618152619152620152621152622152623152624152625152626152627152628152629152630152631152632152633152634152635152636152637152638152639152640152641152642152643152644152645152646152647152648152649152650152651152652152653152654152655152656152657152658152659152660152661152662152663152664152665152666152667152668152669152670152671152672152673152674152675152676152677152678152679152680152681152682152683152684152685152686152687152688152689152690152691152692152693152694152695152696152697152698152699152700152701152702152703152704152705152706152707152708152709152710152711152712152713152714152715152716152717152718152719152720152721152722152723152724152725152726152727152728152729152730152731152732152733152734152735152736152737152738152739152740152741152742152743152744152745152746152747152748152749152750152751152752152753152754152755152756152757152758152759152760152761152762152763152764152765152766152767152768152769152770152771152772152773152774152775152776152777152778152779152780152781152782152783152784152785152786152787152788152789152790152791152792152793152794152795152796152797152798152799152800152801152802152803152804152805152806152807152808152809152810152811152812152813152814152815152816152817152818152819152820152821152822152823152824152825152826152827152828152829152830152831152832152833152834152835152836152837152838152839152840152841152842152843152844152845152846152847152848152849152850152851152852152853152854152855152856152857152858152859152860152861152862152863152864152865152866152867152868152869152870152871152872152873152874152875152876152877152878152879152880152881152882152883152884152885152886152887152888152889152890152891152892152893152894152895152896152897152898152899152900152901152902152903152904152905152906152907152908152909152910152911152912152913152914152915152916152917152918152919152920152921152922152923152924152925152926152927152928152929152930152931152932152933152934152935152936152937152938152939152940152941152942152943152944152945152946152947152948152949152950152951152952152953152954152955152956152957152958152959152960152961152962152963152964152965152966152967152968152969152970152971152972152973152974152975152976152977152978152979152980152981152982152983152984152985152986152987152988152989152990152991152992152993152994152995152996152997152998152999153000153001153002153003153004153005153006153007153008153009153010153011153012153013153014153015153016153017153018153019153020153021153022153023153024153025153026153027153028153029153030153031153032153033153034153035153036153037153038153039153040153041153042153043153044153045153046153047153048153049153050153051153052153053153054153055153056153057153058153059153060153061153062153063153064153065153066153067153068153069153070153071153072153073153074153075153076153077153078153079153080153081153082153083153084153085153086153087153088153089153090153091153092153093153094153095153096153097153098153099153100153101153102153103153104153105153106153107153108153109153110153111153112153113153114153115153116153117153118153119153120153121153122153123153124153125153126153127153128153129153130153131153132153133153134153135153136153137153138153139153140153141153142153143153144153145153146153147153148153149153150153151153152153153153154153155153156153157153158153159153160153161153162153163153164153165153166153167153168153169153170153171153172153173153174153175153176153177153178153179153180153181153182153183153184153185153186153187153188153189153190153191153192153193153194153195153196153197153198153199153200153201153202153203153204153205153206153207153208153209153210153211153212153213153214153215153216153217153218153219153220153221153222153223153224153225153226153227153228153229153230153231153232153233153234153235153236153237153238153239153240153241153242153243153244153245153246153247153248153249153250153251153252153253153254153255153256153257153258153259153260153261153262153263153264153265153266153267153268153269153270153271153272153273153274153275153276153277153278153279153280153281153282153283153284153285153286153287153288153289153290153291153292153293153294153295153296153297153298153299153300153301153302153303153304153305153306153307153308153309153310153311153312153313153314153315153316153317153318153319153320153321153322153323153324153325153326153327153328153329153330153331153332153333153334153335153336153337153338153339153340153341153342153343153344153345153346153347153348153349153350153351153352153353153354153355153356153357153358153359153360153361153362153363153364153365153366153367153368153369153370153371153372153373153374153375153376153377153378153379153380153381153382153383153384153385153386153387153388153389153390153391153392153393153394153395153396153397153398153399153400153401153402153403153404153405153406153407153408153409153410153411153412153413153414153415153416153417153418153419153420153421153422153423153424153425153426153427153428153429153430153431153432153433153434153435153436153437153438153439153440153441153442153443153444153445153446153447153448153449153450153451153452153453153454153455153456153457153458153459153460153461153462153463153464153465153466153467153468153469153470153471153472153473153474153475153476153477153478153479153480153481153482153483153484153485153486153487153488153489153490153491153492153493153494153495153496153497153498153499153500153501153502153503153504153505153506153507153508153509153510153511153512153513153514153515153516153517153518153519153520153521153522153523153524153525153526153527153528153529153530153531153532153533153534153535153536153537153538153539153540153541153542153543153544153545153546153547153548153549153550153551153552153553153554153555153556153557153558153559153560153561153562153563153564153565153566153567153568153569153570153571153572153573153574153575153576153577153578153579153580153581153582153583153584153585153586153587153588153589153590153591153592153593153594153595153596153597153598153599153600153601153602153603153604153605153606153607153608153609153610153611153612153613153614153615153616153617153618153619153620153621153622153623153624153625153626153627153628153629153630153631153632153633153634153635153636153637153638153639153640153641153642153643153644153645153646153647153648153649153650153651153652153653153654153655153656153657153658153659153660153661153662153663153664153665153666153667153668153669153670153671153672153673153674153675153676153677153678153679153680153681153682153683153684153685153686153687153688153689153690153691153692153693153694153695153696153697153698153699153700153701153702153703153704153705153706153707153708153709153710153711153712153713153714153715153716153717153718153719153720153721153722153723153724153725153726153727153728153729153730153731153732153733153734153735153736153737153738153739153740153741153742153743153744153745153746153747153748153749153750153751153752153753153754153755153756153757153758153759153760153761153762153763153764153765153766153767153768153769153770153771153772153773153774153775153776153777153778153779153780153781153782153783153784153785153786153787153788153789153790153791153792153793153794153795153796153797153798153799153800153801153802153803153804153805153806153807153808153809153810153811153812153813153814153815153816153817153818153819153820153821153822153823153824153825153826153827153828153829153830153831153832153833153834153835153836153837153838153839153840153841153842153843153844153845153846153847153848153849153850153851153852153853153854153855153856153857153858153859153860153861153862153863153864153865153866153867153868153869153870153871153872153873153874153875153876153877153878153879153880153881153882153883153884153885153886153887153888153889153890153891153892153893153894153895153896153897153898153899153900153901153902153903153904153905153906153907153908153909153910153911153912153913153914153915153916153917153918153919153920153921153922153923153924153925153926153927153928153929153930153931153932153933153934153935153936153937153938153939153940153941153942153943153944153945153946153947153948153949153950153951153952153953153954153955153956153957153958153959153960153961153962153963153964153965153966153967153968153969153970153971153972153973153974153975153976153977153978153979153980153981153982153983153984153985153986153987153988153989153990153991153992153993153994153995153996153997153998153999154000154001154002154003154004154005154006154007154008154009154010154011154012154013154014154015154016154017154018154019154020154021154022154023154024154025154026154027154028154029154030154031154032154033154034154035154036154037154038154039154040154041154042154043154044154045154046154047154048154049154050154051154052154053154054154055154056154057154058154059154060154061154062154063154064154065154066154067154068154069154070154071154072154073154074154075154076154077154078154079154080154081154082154083154084154085154086154087154088154089154090154091154092154093154094154095154096154097154098154099154100154101154102154103154104154105154106154107154108154109154110154111154112154113154114154115154116154117154118154119154120154121154122154123154124154125154126154127154128154129154130154131154132154133154134154135154136154137154138154139154140154141154142154143154144154145154146154147154148154149154150154151154152154153154154154155154156154157154158154159154160154161154162154163154164154165154166154167154168154169154170154171154172154173154174154175154176154177154178154179154180154181154182154183154184154185154186154187154188154189154190154191154192154193154194154195154196154197154198154199154200154201154202154203154204154205154206154207154208154209154210154211154212154213154214154215154216154217154218154219154220154221154222154223154224154225154226154227154228154229154230154231154232154233154234154235154236154237154238154239154240154241154242154243154244154245154246154247154248154249154250154251154252154253154254154255154256154257154258154259154260154261154262154263154264154265154266154267154268154269154270154271154272154273154274154275154276154277154278154279154280154281154282154283154284154285154286154287154288154289154290154291154292154293154294154295154296154297154298154299154300154301154302154303154304154305154306154307154308154309154310154311154312154313154314154315154316154317154318154319154320154321154322154323154324154325154326154327154328154329154330154331154332154333154334154335154336154337154338154339154340154341154342154343154344154345154346154347154348154349154350154351154352154353154354154355154356154357154358154359154360154361154362154363154364154365154366154367154368154369154370154371154372154373154374154375154376154377154378154379154380154381154382154383154384154385154386154387154388154389154390154391154392154393154394154395154396154397154398154399154400154401154402154403154404154405154406154407154408154409154410154411154412154413154414154415154416154417154418154419154420154421154422154423154424154425154426154427154428154429154430154431154432154433154434154435154436154437154438154439154440154441154442154443154444154445154446154447154448154449154450154451154452154453154454154455154456154457154458154459154460154461154462154463154464154465154466154467154468154469154470154471154472154473154474154475154476154477154478154479154480154481154482154483154484154485154486154487154488154489154490154491154492154493154494154495154496154497154498154499154500154501154502154503154504154505154506154507154508154509154510154511154512154513154514154515154516154517154518154519154520154521154522154523154524154525154526154527154528154529154530154531154532154533154534154535154536154537154538154539154540154541154542154543154544154545154546154547154548154549154550154551154552154553154554154555154556154557154558154559154560154561154562154563154564154565154566154567154568154569154570154571154572154573154574154575154576154577154578154579154580154581154582154583154584154585154586154587154588154589154590154591154592154593154594154595154596154597154598154599154600154601154602154603154604154605154606154607154608154609154610154611154612154613154614154615154616154617154618154619154620154621154622154623154624154625154626154627154628154629154630154631154632154633154634154635154636154637154638154639154640154641154642154643154644154645154646154647154648154649154650154651154652154653154654154655154656154657154658154659154660154661154662154663154664154665154666154667154668154669154670154671154672154673154674154675154676154677154678154679154680154681154682154683154684154685154686154687154688154689154690154691154692154693154694154695154696154697154698154699154700154701154702154703154704154705154706154707154708154709154710154711154712154713154714154715154716154717154718154719154720154721154722154723154724154725154726154727154728154729154730154731154732154733154734154735154736154737154738154739154740154741154742154743154744154745154746154747154748154749154750154751154752154753154754154755154756154757154758154759154760154761154762154763154764154765154766154767154768154769154770154771154772154773154774154775154776154777154778154779154780154781154782154783154784154785154786154787154788154789154790154791154792154793154794154795154796154797154798154799154800154801154802154803154804154805154806154807154808154809154810154811154812154813154814154815154816154817154818154819154820154821154822154823154824154825154826154827154828154829154830154831154832154833154834154835154836154837154838154839154840154841154842154843154844154845154846154847154848154849154850154851154852154853154854154855154856154857154858154859154860154861154862154863154864154865154866154867154868154869154870154871154872154873154874154875154876154877154878154879154880154881154882154883154884154885154886154887154888154889154890154891154892154893154894154895154896154897154898154899154900154901154902154903154904154905154906154907154908154909154910154911154912154913154914154915154916154917154918154919154920154921154922154923154924154925154926154927154928154929154930154931154932154933154934154935154936154937154938154939154940154941154942154943154944154945154946154947154948154949154950154951154952154953154954154955154956154957154958154959154960154961154962154963154964154965154966154967154968154969154970154971154972154973154974154975154976154977154978154979154980154981154982154983154984154985154986154987154988154989154990154991154992154993154994154995154996154997154998154999155000155001155002155003155004155005155006155007155008155009155010155011155012155013155014155015155016155017155018155019155020155021155022155023155024155025155026155027155028155029155030155031155032155033155034155035155036155037155038155039155040155041155042155043155044155045155046155047155048155049155050155051155052155053155054155055155056155057155058155059155060155061155062155063155064155065155066155067155068155069155070155071155072155073155074155075155076155077155078155079155080155081155082155083155084155085155086155087155088155089155090155091155092155093155094155095155096155097155098155099155100155101155102155103155104155105155106155107155108155109155110155111155112155113155114155115155116155117155118155119155120155121155122155123155124155125155126155127155128155129155130155131155132155133155134155135155136155137155138155139155140155141155142155143155144155145155146155147155148155149155150155151155152155153155154155155155156155157155158155159155160155161155162155163155164155165155166155167155168155169155170155171155172155173155174155175155176155177155178155179155180155181155182155183155184155185155186155187155188155189155190155191155192155193155194155195155196155197155198155199155200155201155202155203155204155205155206155207155208155209155210155211155212155213155214155215155216155217155218155219155220155221155222155223155224155225155226155227155228155229155230155231155232155233155234155235155236155237155238155239155240155241155242155243155244155245155246155247155248155249155250155251155252155253155254155255155256155257155258155259155260155261155262155263155264155265155266155267155268155269155270155271155272155273155274155275155276155277155278155279155280155281155282155283155284155285155286155287155288155289155290155291155292155293155294155295155296155297155298155299155300155301155302155303155304155305155306155307155308155309155310155311155312155313155314155315155316155317155318155319155320155321155322155323155324155325155326155327155328155329155330155331155332155333155334155335155336155337155338155339155340155341155342155343155344155345155346155347155348155349155350155351155352155353155354155355155356155357155358155359155360155361155362155363155364155365155366155367155368155369155370155371155372155373155374155375155376155377155378155379155380155381155382155383155384155385155386155387155388155389155390155391155392155393155394155395155396155397155398155399155400155401155402155403155404155405155406155407155408155409155410155411155412155413155414155415155416155417155418155419155420155421155422155423155424155425155426155427155428155429155430155431155432155433155434155435155436155437155438155439155440155441155442155443155444155445155446155447155448155449155450155451155452155453155454155455155456155457155458155459155460155461155462155463155464155465155466155467155468155469155470155471155472155473155474155475155476155477155478155479155480155481155482155483155484155485155486155487155488155489155490155491155492155493155494155495155496155497155498155499155500155501155502155503155504155505155506155507155508155509155510155511155512155513155514155515155516155517155518155519155520155521155522155523155524155525155526155527155528155529155530155531155532155533155534155535155536155537155538155539155540155541155542155543155544155545155546155547155548155549155550155551155552155553155554155555155556155557155558155559155560155561155562155563155564155565155566155567155568155569155570155571155572155573155574155575155576155577155578155579155580155581155582155583155584155585155586155587155588155589155590155591155592155593155594155595155596155597155598155599155600155601155602155603155604155605155606155607155608155609155610155611155612155613155614155615155616155617155618155619155620155621155622155623155624155625155626155627155628155629155630155631155632155633155634155635155636155637155638155639155640155641155642155643155644155645155646155647155648155649155650155651155652155653155654155655155656155657155658155659155660155661155662155663155664155665155666155667155668155669155670155671155672155673155674155675155676155677155678155679155680155681155682155683155684155685155686155687155688155689155690155691155692155693155694155695155696155697155698155699155700155701155702155703155704155705155706155707155708155709155710155711155712155713155714155715155716155717155718155719155720155721155722155723155724155725155726155727155728155729155730155731155732155733155734155735155736155737155738155739155740155741155742155743155744155745155746155747155748155749155750155751155752155753155754155755155756155757155758155759155760155761155762155763155764155765155766155767155768155769155770155771155772155773155774155775155776155777155778155779155780155781155782155783155784155785155786155787155788155789155790155791155792155793155794155795155796155797155798155799155800155801155802155803155804155805155806155807155808155809155810155811155812155813155814155815155816155817155818155819155820155821155822155823155824155825155826155827155828155829155830155831155832155833155834155835155836155837155838155839155840155841155842155843155844155845155846155847155848155849155850155851155852155853155854155855155856155857155858155859155860155861155862155863155864155865155866155867155868155869155870155871155872155873155874155875155876155877155878155879155880155881155882155883155884155885155886155887155888155889155890155891155892155893155894155895155896155897155898155899155900155901155902155903155904155905155906155907155908155909155910155911155912155913155914155915155916155917155918155919155920155921155922155923155924155925155926155927155928155929155930155931155932155933155934155935155936155937155938155939155940155941155942155943155944155945155946155947155948155949155950155951155952155953155954155955155956155957155958155959155960155961155962155963155964155965155966155967155968155969155970155971155972155973155974155975155976155977155978155979155980155981155982155983155984155985155986155987155988155989155990155991155992155993155994155995155996155997155998155999156000156001156002156003156004156005156006156007156008156009156010156011156012156013156014156015156016156017156018156019156020156021156022156023156024156025156026156027156028156029156030156031156032156033156034156035156036156037156038156039156040156041156042156043156044156045156046156047156048156049156050156051156052156053156054156055156056156057156058156059156060156061156062156063156064156065156066156067156068156069156070156071156072156073156074156075156076156077156078156079156080156081156082156083156084156085156086156087156088156089156090156091156092156093156094156095156096156097156098156099156100156101156102156103156104156105156106156107156108156109156110156111156112156113156114156115156116156117156118156119156120156121156122156123156124156125156126156127156128156129156130156131156132156133156134156135156136156137156138156139156140156141156142156143156144156145156146156147156148156149156150156151156152156153156154156155156156156157156158156159156160156161156162156163156164156165156166156167156168156169156170156171156172156173156174156175156176156177156178156179156180156181156182156183156184156185156186156187156188156189156190156191156192156193156194156195156196156197156198156199156200156201156202156203156204156205156206156207156208156209156210156211156212156213156214156215156216156217156218156219156220156221156222156223156224156225156226156227156228156229156230156231156232156233156234156235156236156237156238156239156240156241156242156243156244156245156246156247156248156249156250156251156252156253156254156255156256156257156258156259156260156261156262156263156264156265156266156267156268156269156270156271156272156273156274156275156276156277156278156279156280156281156282156283156284156285156286156287156288156289156290156291156292156293156294156295156296156297156298156299156300156301156302156303156304156305156306156307156308156309156310156311156312156313156314156315156316156317156318156319156320156321156322156323156324156325156326156327156328156329156330156331156332156333156334156335156336156337156338156339156340156341156342156343156344156345156346156347156348156349156350156351156352156353156354156355156356156357156358156359156360156361156362156363156364156365156366156367156368156369156370156371156372156373156374156375156376156377156378156379156380156381156382156383156384156385156386156387156388156389156390156391156392156393156394156395156396156397156398156399156400156401156402156403156404156405156406156407156408156409156410156411156412156413156414156415156416156417156418156419156420156421156422156423156424156425156426156427156428156429156430156431156432156433156434156435156436156437156438156439156440156441156442156443156444156445156446156447156448156449156450156451156452156453156454156455156456156457156458156459156460156461156462156463156464156465156466156467156468156469156470156471156472156473156474156475156476156477156478156479156480156481156482156483156484156485156486156487156488156489156490156491156492156493156494156495156496156497156498156499156500156501156502156503156504156505156506156507156508156509156510156511156512156513156514156515156516156517156518156519156520156521156522156523156524156525156526156527156528156529156530156531156532156533156534156535156536156537156538156539156540156541156542156543156544156545156546156547156548156549156550156551156552156553156554156555156556156557156558156559156560156561156562156563156564156565156566156567156568156569156570156571156572156573156574156575156576156577156578156579156580156581156582156583156584156585156586156587156588156589156590156591156592156593156594156595156596156597156598156599156600156601156602156603156604156605156606156607156608156609156610156611156612156613156614156615156616156617156618156619156620156621156622156623156624156625156626156627156628156629156630156631156632156633156634156635156636156637156638156639156640156641156642156643156644156645156646156647156648156649156650156651156652156653156654156655156656156657156658156659156660156661156662156663156664156665156666156667156668156669156670156671156672156673156674156675156676156677156678156679156680156681156682156683156684156685156686156687156688156689156690156691156692156693156694156695156696156697156698156699156700156701156702156703156704156705156706156707156708156709156710156711156712156713156714156715156716156717156718156719156720156721156722156723156724156725156726156727156728156729156730156731156732156733156734156735156736156737156738156739156740156741156742156743156744156745156746156747156748156749156750156751156752156753156754156755156756156757156758156759156760156761156762156763156764156765156766156767156768156769156770156771156772156773156774156775156776156777156778156779156780156781156782156783156784156785156786156787156788156789156790156791156792156793156794156795156796156797156798156799156800156801156802156803156804156805156806156807156808156809156810156811156812156813156814156815156816156817156818156819156820156821156822156823156824156825156826156827156828156829156830156831156832156833156834156835156836156837156838156839156840156841156842156843156844156845156846156847156848156849156850156851156852156853156854156855156856156857156858156859156860156861156862156863156864156865156866156867156868156869156870156871156872156873156874156875156876156877156878156879156880156881156882156883156884156885156886156887156888156889156890156891156892156893156894156895156896156897156898156899156900156901156902156903156904156905156906156907156908156909156910156911156912156913156914156915156916156917156918156919156920156921156922156923156924156925156926156927156928156929156930156931156932156933156934156935156936156937156938156939156940156941156942156943156944156945156946156947156948156949156950156951156952156953156954156955156956156957156958156959156960156961156962156963156964156965156966156967156968156969156970156971156972156973156974156975156976156977156978156979156980156981156982156983156984156985156986156987156988156989156990156991156992156993156994156995156996156997156998156999157000157001157002157003157004157005157006157007157008157009157010157011157012157013157014157015157016157017157018157019157020157021157022157023157024157025157026157027157028157029157030157031157032157033157034157035157036157037157038157039157040157041157042157043157044157045157046157047157048157049157050157051157052157053157054157055157056157057157058157059157060157061157062157063157064157065157066157067157068157069157070157071157072157073157074157075157076157077157078157079157080157081157082157083157084157085157086157087157088157089157090157091157092157093157094157095157096157097157098157099157100157101157102157103157104157105157106157107157108157109157110157111157112157113157114157115157116157117157118157119157120157121157122157123157124157125157126157127157128157129157130157131157132157133157134157135157136157137157138157139157140157141157142157143157144157145157146157147157148157149157150157151157152157153157154157155157156157157157158157159157160157161157162157163157164157165157166157167157168157169157170157171157172157173157174157175157176157177157178157179157180157181157182157183157184157185157186157187157188157189157190157191157192157193157194157195157196157197157198157199157200157201157202157203157204157205157206157207157208157209157210157211157212157213157214157215157216157217157218157219157220157221157222157223157224157225157226157227157228157229157230157231157232157233157234157235157236157237157238157239157240157241157242157243157244157245157246157247157248157249157250157251157252157253157254157255157256157257157258157259157260157261157262157263157264157265157266157267157268157269157270157271157272157273157274157275157276157277157278157279157280157281157282157283157284157285157286157287157288157289157290157291157292157293157294157295157296157297157298157299157300157301157302157303157304157305157306157307157308157309157310157311157312157313157314157315157316157317157318157319157320157321157322157323157324157325157326157327157328157329157330157331157332157333157334157335157336157337157338157339157340157341157342157343157344157345157346157347157348157349157350157351157352157353157354157355157356157357157358157359157360157361157362157363157364157365157366157367157368157369157370157371157372157373157374157375157376157377157378157379157380157381157382157383157384157385157386157387157388157389157390157391157392157393157394157395157396157397157398157399157400157401157402157403157404157405157406157407157408157409157410157411157412157413157414157415157416157417157418157419157420157421157422157423157424157425157426157427157428157429157430157431157432157433157434157435157436157437157438157439157440157441157442157443157444157445157446157447157448157449157450157451157452157453157454157455157456157457157458157459157460157461157462157463157464157465157466157467157468157469157470157471157472157473157474157475157476157477157478157479157480157481157482157483157484157485157486157487157488157489157490157491157492157493157494157495157496157497157498157499157500157501157502157503157504157505157506157507157508157509157510157511157512157513157514157515157516157517157518157519157520157521157522157523157524157525157526157527157528157529157530157531157532157533157534157535157536157537157538157539157540157541157542157543157544157545157546157547157548157549157550157551157552157553157554157555157556157557157558157559157560157561157562157563157564157565157566157567157568157569157570157571157572157573157574157575157576157577157578157579157580157581157582157583157584157585157586157587157588157589157590157591157592157593157594157595157596157597157598157599157600157601157602157603157604157605157606157607157608157609157610157611157612157613157614157615157616157617157618157619157620157621157622157623157624157625157626157627157628157629157630157631157632157633157634157635157636157637157638157639157640157641157642157643157644157645157646157647157648157649157650157651157652157653157654157655157656157657157658157659157660157661157662157663157664157665157666157667157668157669157670157671157672157673157674157675157676157677157678157679157680157681157682157683157684157685157686157687157688157689157690157691157692157693157694157695157696157697157698157699157700157701157702157703157704157705157706157707157708157709157710157711157712157713157714157715157716157717157718157719157720157721157722157723157724157725157726157727157728157729157730157731157732157733157734157735157736157737157738157739157740157741157742157743157744157745157746157747157748157749157750157751157752157753157754157755157756157757157758157759157760157761157762157763157764157765157766157767157768157769157770157771157772157773157774157775157776157777157778157779157780157781157782157783157784157785157786157787157788157789157790157791157792157793157794157795157796157797157798157799157800157801157802157803157804157805157806157807157808157809157810157811157812157813157814157815157816157817157818157819157820157821157822157823157824157825157826157827157828157829157830157831157832157833157834157835157836157837157838157839157840157841157842157843157844157845157846157847157848157849157850157851157852157853157854157855157856157857157858157859157860157861157862157863157864157865157866157867157868157869157870157871157872157873157874157875157876157877157878157879157880157881157882157883157884157885157886157887157888157889157890157891157892157893157894157895157896157897157898157899157900157901157902157903157904157905157906157907157908157909157910157911157912157913157914157915157916157917157918157919157920157921157922157923157924157925157926157927157928157929157930157931157932157933157934157935157936157937157938157939157940157941157942157943157944157945157946157947157948157949157950157951157952157953157954157955157956157957157958157959157960157961157962157963157964157965157966157967157968157969157970157971157972157973157974157975157976157977157978157979157980157981157982157983157984157985157986157987157988157989157990157991157992157993157994157995157996157997157998157999158000158001158002158003158004158005158006158007158008158009158010158011158012158013158014158015158016158017158018158019158020158021158022158023158024158025158026158027158028158029158030158031158032158033158034158035158036158037158038158039158040158041158042158043158044158045158046158047158048158049158050158051158052158053158054158055158056158057158058158059158060158061158062158063158064158065158066158067158068158069158070158071158072158073158074158075158076158077158078158079158080158081158082158083158084158085158086158087158088158089158090158091158092158093158094158095158096158097158098158099158100158101158102158103158104158105158106158107158108158109158110158111158112158113158114158115158116158117158118158119158120158121158122158123158124158125158126158127158128158129158130158131158132158133158134158135158136158137158138158139158140158141158142158143158144158145158146158147158148158149158150158151158152158153158154158155158156158157158158158159158160158161158162158163158164158165158166158167158168158169158170158171158172158173158174158175158176158177158178158179158180158181158182158183158184158185158186158187158188158189158190158191158192158193158194158195158196158197158198158199158200158201158202158203158204158205158206158207158208158209158210158211158212158213158214158215158216158217158218158219158220158221158222158223158224158225158226158227158228158229158230158231158232158233158234158235158236158237158238158239158240158241158242158243158244158245158246158247158248158249158250158251158252158253158254158255158256158257158258158259158260158261158262158263158264158265158266158267158268158269158270158271158272158273158274158275158276158277158278158279158280158281158282158283158284158285158286158287158288158289158290158291158292158293158294158295158296158297158298158299158300158301158302158303158304158305158306158307158308158309158310158311158312158313158314158315158316158317158318158319158320158321158322158323158324158325158326158327158328158329158330158331158332158333158334158335158336158337158338158339158340158341158342158343158344158345158346158347158348158349158350158351158352158353158354158355158356158357158358158359158360158361158362158363158364158365158366158367158368158369158370158371158372158373158374158375158376158377158378158379158380158381158382158383158384158385158386158387158388158389158390158391158392158393158394158395158396158397158398158399158400158401158402158403158404158405158406158407158408158409158410158411158412158413158414158415158416158417158418158419158420158421158422158423158424158425158426158427158428158429158430158431158432158433158434158435158436158437158438158439158440158441158442158443158444158445158446158447158448158449158450158451158452158453158454158455158456158457158458158459158460158461158462158463158464158465158466158467158468158469158470158471158472158473158474158475158476158477158478158479158480158481158482158483158484158485158486158487158488158489158490158491158492158493158494158495158496158497158498158499158500158501158502158503158504158505158506158507158508158509158510158511158512158513158514158515158516158517158518158519158520158521158522158523158524158525158526158527158528158529158530158531158532158533158534158535158536158537158538158539158540158541158542158543158544158545158546158547158548158549158550158551158552158553158554158555158556158557158558158559158560158561158562158563158564158565158566158567158568158569158570158571158572158573158574158575158576158577158578158579158580158581158582158583158584158585158586158587158588158589158590158591158592158593158594158595158596158597158598158599158600158601158602158603158604158605158606158607158608158609158610158611158612158613158614158615158616158617158618158619158620158621158622158623158624158625158626158627158628158629158630158631158632158633158634158635158636158637158638158639158640158641158642158643158644158645158646158647158648158649158650158651158652158653158654158655158656158657158658158659158660158661158662158663158664158665158666158667158668158669158670158671158672158673158674158675158676158677158678158679158680158681158682158683158684158685158686158687158688158689158690158691158692158693158694158695158696158697158698158699158700158701158702158703158704158705158706158707158708158709158710158711158712158713158714158715158716158717158718158719158720158721158722158723158724158725158726158727158728158729158730158731158732158733158734158735158736158737158738158739158740158741158742158743158744158745158746158747158748158749158750158751158752158753158754158755158756158757158758158759158760158761158762158763158764158765158766158767158768158769158770158771158772158773158774158775158776158777158778158779158780158781158782158783158784158785158786158787158788158789158790158791158792158793158794158795158796158797158798158799158800158801158802158803158804158805158806158807158808158809158810158811158812158813158814158815158816158817158818158819158820158821158822158823158824158825158826158827158828158829158830158831158832158833158834158835158836158837158838158839158840158841158842158843158844158845158846158847158848158849158850158851158852158853158854158855158856158857158858158859158860158861158862158863158864158865158866158867158868158869158870158871158872158873158874158875158876158877158878158879158880158881158882158883158884158885158886158887158888158889158890158891158892158893158894158895158896158897158898158899158900158901158902158903158904158905158906158907158908158909158910158911158912158913158914158915158916158917158918158919158920158921158922158923158924158925158926158927158928158929158930158931158932158933158934158935158936158937158938158939158940158941158942158943158944158945158946158947158948158949158950158951158952158953158954158955158956158957158958158959158960158961158962158963158964158965158966158967158968158969158970158971158972158973158974158975158976158977158978158979158980158981158982158983158984158985158986158987158988158989158990158991158992158993158994158995158996158997158998158999159000159001159002159003159004159005159006159007159008159009159010159011159012159013159014159015159016159017159018159019159020159021159022159023159024159025159026159027159028159029159030159031159032159033159034159035159036159037159038159039159040159041159042159043159044159045159046159047159048159049159050159051159052159053159054159055159056159057159058159059159060159061159062159063159064159065159066159067159068159069159070159071159072159073159074159075159076159077159078159079159080159081159082159083159084159085159086159087159088159089159090159091159092159093159094159095159096159097159098159099159100159101159102159103159104159105159106159107159108159109159110159111159112159113159114159115159116159117159118159119159120159121159122159123159124159125159126159127159128159129159130159131159132159133159134159135159136159137159138159139159140159141159142159143159144159145159146159147159148159149159150159151159152159153159154159155159156159157159158159159159160159161159162159163159164159165159166159167159168159169159170159171159172159173159174159175159176159177159178159179159180159181159182159183159184159185159186159187159188159189159190159191159192159193159194159195159196159197159198159199159200159201159202159203159204159205159206159207159208159209159210159211159212159213159214159215159216159217159218159219159220159221159222159223159224159225159226159227159228159229159230159231159232159233159234159235159236159237159238159239159240159241159242159243159244159245159246159247159248159249159250159251159252159253159254159255159256159257159258159259159260159261159262159263159264159265159266159267159268159269159270159271159272159273159274159275159276159277159278159279159280159281159282159283159284159285159286159287159288159289159290159291159292159293159294159295159296159297159298159299159300159301159302159303159304159305159306159307159308159309159310159311159312159313159314159315159316159317159318159319159320159321159322159323159324159325159326159327159328159329159330159331159332159333159334159335159336159337159338159339159340159341159342159343159344159345159346159347159348159349159350159351159352159353159354159355159356159357159358159359159360159361159362159363159364159365159366159367159368159369159370159371159372159373159374159375159376159377159378159379159380159381159382159383159384159385159386159387159388159389159390159391159392159393159394159395159396159397159398159399159400159401159402159403159404159405159406159407159408159409159410159411159412159413159414159415159416159417159418159419159420159421159422159423159424159425159426159427159428159429159430159431159432159433159434159435159436159437159438159439159440159441159442159443159444159445159446159447159448159449159450159451159452159453159454159455159456159457159458159459159460159461159462159463159464159465159466159467159468159469159470159471159472159473159474159475159476159477159478159479159480159481159482159483159484159485159486159487159488159489159490159491159492159493159494159495159496159497159498159499159500159501159502159503159504159505159506159507159508159509159510159511159512159513159514159515159516159517159518159519159520159521159522159523159524159525159526159527159528159529159530159531159532159533159534159535159536159537159538159539159540159541159542159543159544159545159546159547159548159549159550159551159552159553159554159555159556159557159558159559159560159561159562159563159564159565159566159567159568159569159570159571159572159573159574159575159576159577159578159579159580159581159582159583159584159585159586159587159588159589159590159591159592159593159594159595159596159597159598159599159600159601159602159603159604159605159606159607159608159609159610159611159612159613159614159615159616159617159618159619159620159621159622159623159624159625159626159627159628159629159630159631159632159633159634159635159636159637159638159639159640159641159642159643159644159645159646159647159648159649159650159651159652159653159654159655159656159657159658159659159660159661159662159663159664159665159666159667159668159669159670159671159672159673159674159675159676159677159678159679159680159681159682159683159684159685159686159687159688159689159690159691159692159693159694159695159696159697159698159699159700159701159702159703159704159705159706159707159708159709159710159711159712159713159714159715159716159717159718159719159720159721159722159723159724159725159726159727159728159729159730159731159732159733159734159735159736159737159738159739159740159741159742159743159744159745159746159747159748159749159750159751159752159753159754159755159756159757159758159759159760159761159762159763159764159765159766159767159768159769159770159771159772159773159774159775159776159777159778159779159780159781159782159783159784159785159786159787159788159789159790159791159792159793159794159795159796159797159798159799159800159801159802159803159804159805159806159807159808159809159810159811159812159813159814159815159816159817159818159819159820159821159822159823159824159825159826159827159828159829159830159831159832159833159834159835159836159837159838159839159840159841159842159843159844159845159846159847159848159849159850159851159852159853159854159855159856159857159858159859159860159861159862159863159864159865159866159867159868159869159870159871159872159873159874159875159876159877159878159879159880159881159882159883159884159885159886159887159888159889159890159891159892159893159894159895159896159897159898159899159900159901159902159903159904159905159906159907159908159909159910159911159912159913159914159915159916159917159918159919159920159921159922159923159924159925159926159927159928159929159930159931159932159933159934159935159936159937159938159939159940159941159942159943159944159945159946159947159948159949159950159951159952159953159954159955159956159957159958159959159960159961159962159963159964159965159966159967159968159969159970159971159972159973159974159975159976159977159978159979159980159981159982159983159984159985159986159987159988159989159990159991159992159993159994159995159996159997159998159999160000160001160002160003160004160005160006160007160008160009160010160011160012160013160014160015160016160017160018160019160020160021160022160023160024160025160026160027160028160029160030160031160032160033160034160035160036160037160038160039160040160041160042160043160044160045160046160047160048160049160050160051160052160053160054160055160056160057160058160059160060160061160062160063160064160065160066160067160068160069160070160071160072160073160074160075160076160077160078160079160080160081160082160083160084160085160086160087160088160089160090160091160092160093160094160095160096160097160098160099160100160101160102160103160104160105160106160107160108160109160110160111160112160113160114160115160116160117160118160119160120160121160122160123160124160125160126160127160128160129160130160131160132160133160134160135160136160137160138160139160140160141160142160143160144160145160146160147160148160149160150160151160152160153160154160155160156160157160158160159160160160161160162160163160164160165160166160167160168160169160170160171160172160173160174160175160176160177160178160179160180160181160182160183160184160185160186160187160188160189160190160191160192160193160194160195160196160197160198160199160200160201160202160203160204160205160206160207160208160209160210160211160212160213160214160215160216160217160218160219160220160221160222160223160224160225160226160227160228160229160230160231160232160233160234160235160236160237160238160239160240160241160242160243160244160245160246160247160248160249160250160251160252160253160254160255160256160257160258160259160260160261160262160263160264160265160266160267160268160269160270160271160272160273160274160275160276160277160278160279160280160281160282160283160284160285160286160287160288160289160290160291160292160293160294160295160296160297160298160299160300160301160302160303160304160305160306160307160308160309160310160311160312160313160314160315160316160317160318160319160320160321160322160323160324160325160326160327160328160329160330160331160332160333160334160335160336160337160338160339160340160341160342160343160344160345160346160347160348160349160350160351160352160353160354160355160356160357160358160359160360160361160362160363160364160365160366160367160368160369160370160371160372160373160374160375160376160377160378160379160380160381160382160383160384160385160386160387160388160389160390160391160392160393160394160395160396160397160398160399160400160401160402160403160404160405160406160407160408160409160410160411160412160413160414160415160416160417160418160419160420160421160422160423160424160425160426160427160428160429160430160431160432160433160434160435160436160437160438160439160440160441160442160443160444160445160446160447160448160449160450160451160452160453160454160455160456160457160458160459160460160461160462160463160464160465160466160467160468160469160470160471160472160473160474160475160476160477160478160479160480160481160482160483160484160485160486160487160488160489160490160491160492160493160494160495160496160497160498160499160500160501160502160503160504160505160506160507160508160509160510160511160512160513160514160515160516160517160518160519160520160521160522160523160524160525160526160527160528160529160530160531160532160533160534160535160536160537160538160539160540160541160542160543160544160545160546160547160548160549160550160551160552160553160554160555160556160557160558160559160560160561160562160563160564160565160566160567160568160569160570160571160572160573160574160575160576160577160578160579160580160581160582160583160584160585160586160587160588160589160590160591160592160593160594160595160596160597160598160599160600160601160602160603160604160605160606160607160608160609160610160611160612160613160614160615160616160617160618160619160620160621160622160623160624160625160626160627160628160629160630160631160632160633160634160635160636160637160638160639160640160641160642160643160644160645160646160647160648160649160650160651160652160653160654160655160656160657160658160659160660160661160662160663160664160665160666160667160668160669160670160671160672160673160674160675160676160677160678160679160680160681160682160683160684160685160686160687160688160689160690160691160692160693160694160695160696160697160698160699160700160701160702160703160704160705160706160707160708160709160710160711160712160713160714160715160716160717160718160719160720160721160722160723160724160725160726160727160728160729160730160731160732160733160734160735160736160737160738160739160740160741160742160743160744160745160746160747160748160749160750160751160752160753160754160755160756160757160758160759160760160761160762160763160764160765160766160767160768160769160770160771160772160773160774160775160776160777160778160779160780160781160782160783160784160785160786160787160788160789160790160791160792160793160794160795160796160797160798160799160800160801160802160803160804160805160806160807160808160809160810160811160812160813160814160815160816160817160818160819160820160821160822160823160824160825160826160827160828160829160830160831160832160833160834160835160836160837160838160839160840160841160842160843160844160845160846160847160848160849160850160851160852160853160854160855160856160857160858160859160860160861160862160863160864160865160866160867160868160869160870160871160872160873160874160875160876160877160878160879160880160881160882160883160884160885160886160887160888160889160890160891160892160893160894160895160896160897160898160899160900160901160902160903160904160905160906160907160908160909160910160911160912160913160914160915160916160917160918160919160920160921160922160923160924160925160926160927160928160929160930160931160932160933160934160935160936160937160938160939160940160941160942160943160944160945160946160947160948160949160950160951160952160953160954160955160956160957160958160959160960160961160962160963160964160965160966160967160968160969160970160971160972160973160974160975160976160977160978160979160980160981160982160983160984160985160986160987160988160989160990160991160992160993160994160995160996160997160998160999161000161001161002161003161004161005161006161007161008161009161010161011161012161013161014161015161016161017161018161019161020161021161022161023161024161025161026161027161028161029161030161031161032161033161034161035161036161037161038161039161040161041161042161043161044161045161046161047161048161049161050161051161052161053161054161055161056161057161058161059161060161061161062161063161064161065161066161067161068161069161070161071161072161073161074161075161076161077161078161079161080161081161082161083161084161085161086161087161088161089161090161091161092161093161094161095161096161097161098161099161100161101161102161103161104161105161106161107161108161109161110161111161112161113161114161115161116161117161118161119161120161121161122161123161124161125161126161127161128161129161130161131161132161133161134161135161136161137161138161139161140161141161142161143161144161145161146161147161148161149161150161151161152161153161154161155161156161157161158161159161160161161161162161163161164161165161166161167161168161169161170161171161172161173161174161175161176161177161178161179161180161181161182161183161184161185161186161187161188161189161190161191161192161193161194161195161196161197161198161199161200161201161202161203161204161205161206161207161208161209161210161211161212161213161214161215161216161217161218161219161220161221161222161223161224161225161226161227161228161229161230161231161232161233161234161235161236161237161238161239161240161241161242161243161244161245161246161247161248161249161250161251161252161253161254161255161256161257161258161259161260161261161262161263161264161265161266161267161268161269161270161271161272161273161274161275161276161277161278161279161280161281161282161283161284161285161286161287161288161289161290161291161292161293161294161295161296161297161298161299161300161301161302161303161304161305161306161307161308161309161310161311161312161313161314161315161316161317161318161319161320161321161322161323161324161325161326161327161328161329161330161331161332161333161334161335161336161337161338161339161340161341161342161343161344161345161346161347161348161349161350161351161352161353161354161355161356161357161358161359161360161361161362161363161364161365161366161367161368161369161370161371161372161373161374161375161376161377161378161379161380161381161382161383161384161385161386161387161388161389161390161391161392161393161394161395161396161397161398161399161400161401161402161403161404161405161406161407161408161409161410161411161412161413161414161415161416161417161418161419161420161421161422161423161424161425161426161427161428161429161430161431161432161433161434161435161436161437161438161439161440161441161442161443161444161445161446161447161448161449161450161451161452161453161454161455161456161457161458161459161460161461161462161463161464161465161466161467161468161469161470161471161472161473161474161475161476161477161478161479161480161481161482161483161484161485161486161487161488161489161490161491161492161493161494161495161496161497161498161499161500161501161502161503161504161505161506161507161508161509161510161511161512161513161514161515161516161517161518161519161520161521161522161523161524161525161526161527161528161529161530161531161532161533161534161535161536161537161538161539161540161541161542161543161544161545161546161547161548161549161550161551161552161553161554161555161556161557161558161559161560161561161562161563161564161565161566161567161568161569161570161571161572161573161574161575161576161577161578161579161580161581161582161583161584161585161586161587161588161589161590161591161592161593161594161595161596161597161598161599161600161601161602161603161604161605161606161607161608161609161610161611161612161613161614161615161616161617161618161619161620161621161622161623161624161625161626161627161628161629161630161631161632161633161634161635161636161637161638161639161640161641161642161643161644161645161646161647161648161649161650161651161652161653161654161655161656161657161658161659161660161661161662161663161664161665161666161667161668161669161670161671161672161673161674161675161676161677161678161679161680161681161682161683161684161685161686161687161688161689161690161691161692161693161694161695161696161697161698161699161700161701161702161703161704161705161706161707161708161709161710161711161712161713161714161715161716161717161718161719161720161721161722161723161724161725161726161727161728161729161730161731161732161733161734161735161736161737161738161739161740161741161742161743161744161745161746161747161748161749161750161751161752161753161754161755161756161757161758161759161760161761161762161763161764161765161766161767161768161769161770161771161772161773161774161775161776161777161778161779161780161781161782161783161784161785161786161787161788161789161790161791161792161793161794161795161796161797161798161799161800161801161802161803161804161805161806161807161808161809161810161811161812161813161814161815161816161817161818161819161820161821161822161823161824161825161826161827161828161829161830161831161832161833161834161835161836161837161838161839161840161841161842161843161844161845161846161847161848161849161850161851161852161853161854161855161856161857161858161859161860161861161862161863161864161865161866161867161868161869161870161871161872161873161874161875161876161877161878161879161880161881161882161883161884161885161886161887161888161889161890161891161892161893161894161895161896161897161898161899161900161901161902161903161904161905161906161907161908161909161910161911161912161913161914161915161916161917161918161919161920161921161922161923161924161925161926161927161928161929161930161931161932161933161934161935161936161937161938161939161940161941161942161943161944161945161946161947161948161949161950161951161952161953161954161955161956161957161958161959161960161961161962161963161964161965161966161967161968161969161970161971161972161973161974161975161976161977161978161979161980161981161982161983161984161985161986161987161988161989161990161991161992161993161994161995161996161997161998161999162000162001162002162003162004162005162006162007162008162009162010162011162012162013162014162015162016162017162018162019162020162021162022162023162024162025162026162027162028162029162030162031162032162033162034162035162036162037162038162039162040162041162042162043162044162045162046162047162048162049162050162051162052162053162054162055162056162057162058162059162060162061162062162063162064162065162066162067162068162069162070162071162072162073162074162075162076162077162078162079162080162081162082162083162084162085162086162087162088162089162090162091162092162093162094162095162096162097162098162099162100162101162102162103162104162105162106162107162108162109162110162111162112162113162114162115162116162117162118162119162120162121162122162123162124162125162126162127162128162129162130162131162132162133162134162135162136162137162138162139162140162141162142162143162144162145162146162147162148162149162150162151162152162153162154162155162156162157162158162159162160162161162162162163162164162165162166162167162168162169162170162171162172162173162174162175162176162177162178162179162180162181162182162183162184162185162186162187162188162189162190162191162192162193162194162195162196162197162198162199162200162201162202162203162204162205162206162207162208162209162210162211162212162213162214162215162216162217162218162219162220162221162222162223162224162225162226162227162228162229162230162231162232162233162234162235162236162237162238162239162240162241162242162243162244162245162246162247162248162249162250162251162252162253162254162255162256162257162258162259162260162261162262162263162264162265162266162267162268162269162270162271162272162273162274162275162276162277162278162279162280162281162282162283162284162285162286162287162288162289162290162291162292162293162294162295162296162297162298162299162300162301162302162303162304162305162306162307162308162309162310162311162312162313162314162315162316162317162318162319162320162321162322162323162324162325162326162327162328162329162330162331162332162333162334162335162336162337162338162339162340162341162342162343162344162345162346162347162348162349162350162351162352162353162354162355162356162357162358162359162360162361162362162363162364162365162366162367162368162369162370162371162372162373162374162375162376162377162378162379162380162381162382162383162384162385162386162387162388162389162390162391162392162393162394162395162396162397162398162399162400162401162402162403162404162405162406162407162408162409162410162411162412162413162414162415162416162417162418162419162420162421162422162423162424162425162426162427162428162429162430162431162432162433162434162435162436162437162438162439162440162441162442162443162444162445162446162447162448162449162450162451162452162453162454162455162456162457162458162459162460162461162462162463162464162465162466162467162468162469162470162471162472162473162474162475162476162477162478162479162480162481162482162483162484162485162486162487162488162489162490162491162492162493162494162495162496162497162498162499162500162501162502162503162504162505162506162507162508162509162510162511162512162513162514162515162516162517162518162519162520162521162522162523162524162525162526162527162528162529162530162531162532162533162534162535162536162537162538162539162540162541162542162543162544162545162546162547162548162549162550162551162552162553162554162555162556162557162558162559162560162561162562162563162564162565162566162567162568162569162570162571162572162573162574162575162576162577162578162579162580162581162582162583162584162585162586162587162588162589162590162591162592162593162594162595162596162597162598162599162600162601162602162603162604162605162606162607162608162609162610162611162612162613162614162615162616162617162618162619162620162621162622162623162624162625162626162627162628162629162630162631162632162633162634162635162636162637162638162639162640162641162642162643162644162645162646162647162648162649162650162651162652162653162654162655162656162657162658162659162660162661162662162663162664162665162666162667162668162669162670162671162672162673162674162675162676162677162678162679162680162681162682162683162684162685162686162687162688162689162690162691162692162693162694162695162696162697162698162699162700162701162702162703162704162705162706162707162708162709162710162711162712162713162714162715162716162717162718162719162720162721162722162723162724162725162726162727162728162729162730162731162732162733162734162735162736162737162738162739162740162741162742162743162744162745162746162747162748162749162750162751162752162753162754162755162756162757162758162759162760162761162762162763162764162765162766162767162768162769162770162771162772162773162774162775162776162777162778162779162780162781162782162783162784162785162786162787162788162789162790162791162792162793162794162795162796162797162798162799162800162801162802162803162804162805162806162807162808162809162810162811162812162813162814162815162816162817162818162819162820162821162822162823162824162825162826162827162828162829162830162831162832162833162834162835162836162837162838162839162840162841162842162843162844162845162846162847162848162849162850162851162852162853162854162855162856162857162858162859162860162861162862162863162864162865162866162867162868162869162870162871162872162873162874162875162876162877162878162879162880162881162882162883162884162885162886162887162888162889162890162891162892162893162894162895162896162897162898162899162900162901162902162903162904162905162906162907162908162909162910162911162912162913162914162915162916162917162918162919162920162921162922162923162924162925162926162927162928162929162930162931162932162933162934162935162936162937162938162939162940162941162942162943162944162945162946162947162948162949162950162951162952162953162954162955162956162957162958162959162960162961162962162963162964162965162966162967162968162969162970162971162972162973162974162975162976162977162978162979162980162981162982162983162984162985162986162987162988162989162990162991162992162993162994162995162996162997162998162999163000163001163002163003163004163005163006163007163008163009163010163011163012163013163014163015163016163017163018163019163020163021163022163023163024163025163026163027163028163029163030163031163032163033163034163035163036163037163038163039163040163041163042163043163044163045163046163047163048163049163050163051163052163053163054163055163056163057163058163059163060163061163062163063163064163065163066163067163068163069163070163071163072163073163074163075163076163077163078163079163080163081163082163083163084163085163086163087163088163089163090163091163092163093163094163095163096163097163098163099163100163101163102163103163104163105163106163107163108163109163110163111163112163113163114163115163116163117163118163119163120163121163122163123163124163125163126163127163128163129163130163131163132163133163134163135163136163137163138163139163140163141163142163143163144163145163146163147163148163149163150163151163152163153163154163155163156163157163158163159163160163161163162163163163164163165163166163167163168163169163170163171163172163173163174163175163176163177163178163179163180163181163182163183163184163185163186163187163188163189163190163191163192163193163194163195163196163197163198163199163200163201163202163203163204163205163206163207163208163209163210163211163212163213163214163215163216163217163218163219163220163221163222163223163224163225163226163227163228163229163230163231163232163233163234163235163236163237163238163239163240163241163242163243163244163245163246163247163248163249163250163251163252163253163254163255163256163257163258163259163260163261163262163263163264163265163266163267163268163269163270163271163272163273163274163275163276163277163278163279163280163281163282163283163284163285163286163287163288163289163290163291163292163293163294163295163296163297163298163299163300163301163302163303163304163305163306163307163308163309163310163311163312163313163314163315163316163317163318163319163320163321163322163323163324163325163326163327163328163329163330163331163332163333163334163335163336163337163338163339163340163341163342163343163344163345163346163347163348163349163350163351163352163353163354163355163356163357163358163359163360163361163362163363163364163365163366163367163368163369163370163371163372163373163374163375163376163377163378163379163380163381163382163383163384163385163386163387163388163389163390163391163392163393163394163395163396163397163398163399163400163401163402163403163404163405163406163407163408163409163410163411163412163413163414163415163416163417163418163419163420163421163422163423163424163425163426163427163428163429163430163431163432163433163434163435163436163437163438163439163440163441163442163443163444163445163446163447163448163449163450163451163452163453163454163455163456163457163458163459163460163461163462163463163464163465163466163467163468163469163470163471163472163473163474163475163476163477163478163479163480163481163482163483163484163485163486163487163488163489163490163491163492163493163494163495163496163497163498163499163500163501163502163503163504163505163506163507163508163509163510163511163512163513163514163515163516163517163518163519163520163521163522163523163524163525163526163527163528163529163530163531163532163533163534163535163536163537163538163539163540163541163542163543163544163545163546163547163548163549163550163551163552163553163554163555163556163557163558163559163560163561163562163563163564163565163566163567163568163569163570163571163572163573163574163575163576163577163578163579163580163581163582163583163584163585163586163587163588163589163590163591163592163593163594163595163596163597163598163599163600163601163602163603163604163605163606163607163608163609163610163611163612163613163614163615163616163617163618163619163620163621163622163623163624163625163626163627163628163629163630163631163632163633163634163635163636163637163638163639163640163641163642163643163644163645163646163647163648163649163650163651163652163653163654163655163656163657163658163659163660163661163662163663163664163665163666163667163668163669163670163671163672163673163674163675163676163677163678163679163680163681163682163683163684163685163686163687163688163689163690163691163692163693163694163695163696163697163698163699163700163701163702163703163704163705163706163707163708163709163710163711163712163713163714163715163716163717163718163719163720163721163722163723163724163725163726163727163728163729163730163731163732163733163734163735163736163737163738163739163740163741163742163743163744163745163746163747163748163749163750163751163752163753163754163755163756163757163758163759163760163761163762163763163764163765163766163767163768163769163770163771163772163773163774163775163776163777163778163779163780163781163782163783163784163785163786163787163788163789163790163791163792163793163794163795163796163797163798163799163800163801163802163803163804163805163806163807163808163809163810163811163812163813163814163815163816163817163818163819163820163821163822163823163824163825163826163827163828163829163830163831163832163833163834163835163836163837163838163839163840163841163842163843163844163845163846163847163848163849163850163851163852163853163854163855163856163857163858163859163860163861163862163863163864163865163866163867163868163869163870163871163872163873163874163875163876163877163878163879163880163881163882163883163884163885163886163887163888163889163890163891163892163893163894163895163896163897163898163899163900163901163902163903163904163905163906163907163908163909163910163911163912163913163914163915163916163917163918163919163920163921163922163923163924163925163926163927163928163929163930163931163932163933163934163935163936163937163938163939163940163941163942163943163944163945163946163947163948163949163950163951163952163953163954163955163956163957163958163959163960163961163962163963163964163965163966163967163968163969163970163971163972163973163974163975163976163977163978163979163980163981163982163983163984163985163986163987163988163989163990163991163992163993163994163995163996163997163998163999164000164001164002164003164004164005164006164007164008164009164010164011164012164013164014164015164016164017164018164019164020164021164022164023164024164025164026164027164028164029164030164031164032164033164034164035164036164037164038164039164040164041164042164043164044164045164046164047164048164049164050164051164052164053164054164055164056164057164058164059164060164061164062164063164064164065164066164067164068164069164070164071164072164073164074164075164076164077164078164079164080164081164082164083164084164085164086164087164088164089164090164091164092164093164094164095164096164097164098164099164100164101164102164103164104164105164106164107164108164109164110164111164112164113164114164115164116164117164118164119164120164121164122164123164124164125164126164127164128164129164130164131164132164133164134164135164136164137164138164139164140164141164142164143164144164145164146164147164148164149164150164151164152164153164154164155164156164157164158164159164160164161164162164163164164164165164166164167164168164169164170164171164172164173164174164175164176164177164178164179164180164181164182164183164184164185164186164187164188164189164190164191164192164193164194164195164196164197164198164199164200164201164202164203164204164205164206164207164208164209164210164211164212164213164214164215164216164217164218164219164220164221164222164223164224164225164226164227164228164229164230164231164232164233164234164235164236164237164238164239164240164241164242164243164244164245164246164247164248164249164250164251164252164253164254164255164256164257164258164259164260164261164262164263164264164265164266164267164268164269164270164271164272164273164274164275164276164277164278164279164280164281164282164283164284164285164286164287164288164289164290164291164292164293164294164295164296164297164298164299164300164301164302164303164304164305164306164307164308164309164310164311164312164313164314164315164316164317164318164319164320164321164322164323164324164325164326164327164328164329164330164331164332164333164334164335164336164337164338164339164340164341164342164343164344164345164346164347164348164349164350164351164352164353164354164355164356164357164358164359164360164361164362164363164364164365164366164367164368164369164370164371164372164373164374164375164376164377164378164379164380164381164382164383164384164385164386164387164388164389164390164391164392164393164394164395164396164397164398164399164400164401164402164403164404164405164406164407164408164409164410164411164412164413164414164415164416164417164418164419164420164421164422164423164424164425164426164427164428164429164430164431164432164433164434164435164436164437164438164439164440164441164442164443164444164445164446164447164448164449164450164451164452164453164454164455164456164457164458164459164460164461164462164463164464164465164466164467164468164469164470164471164472164473164474164475164476164477164478164479164480164481164482164483164484164485164486164487164488164489164490164491164492164493164494164495164496164497164498164499164500164501164502164503164504164505164506164507164508164509164510164511164512164513164514164515164516164517164518164519164520164521164522164523164524164525164526164527164528164529164530164531164532164533164534164535164536164537164538164539164540164541164542164543164544164545164546164547164548164549164550164551164552164553164554164555164556164557164558164559164560164561164562164563164564164565164566164567164568164569164570164571164572164573164574164575164576164577164578164579164580164581164582164583164584164585164586164587164588164589164590164591164592164593164594164595164596164597164598164599164600164601164602164603164604164605164606164607164608164609164610164611164612164613164614164615164616164617164618164619164620164621164622164623164624164625164626164627164628164629164630164631164632164633164634164635164636164637164638164639164640164641164642164643164644164645164646164647164648164649164650164651164652164653164654164655164656164657164658164659164660164661164662164663164664164665164666164667164668164669164670164671164672164673164674164675164676164677164678164679164680164681164682164683164684164685164686164687164688164689164690164691164692164693164694164695164696164697164698164699164700164701164702164703164704164705164706164707164708164709164710164711164712164713164714164715164716164717164718164719164720164721164722164723164724164725164726164727164728164729164730164731164732164733164734164735164736164737164738164739164740164741164742164743164744164745164746164747164748164749164750164751164752164753164754164755164756164757164758164759164760164761164762164763164764164765164766164767164768164769164770164771164772164773164774164775164776164777164778164779164780164781164782164783164784164785164786164787164788164789164790164791164792164793164794164795164796164797164798164799164800164801164802164803164804164805164806164807164808164809164810164811164812164813164814164815164816164817164818164819164820164821164822164823164824164825164826164827164828164829164830164831164832164833164834164835164836164837164838164839164840164841164842164843164844164845164846164847164848164849164850164851164852164853164854164855164856164857164858164859164860164861164862164863164864164865164866164867164868164869164870164871164872164873164874164875164876164877164878164879164880164881164882164883164884164885164886164887164888164889164890164891164892164893164894164895164896164897164898164899164900164901164902164903164904164905164906164907164908164909164910164911164912164913164914164915164916164917164918164919164920164921164922164923164924164925164926164927164928164929164930164931164932164933164934164935164936164937164938164939164940164941164942164943164944164945164946164947164948164949164950164951164952164953164954164955164956164957164958164959164960164961164962164963164964164965164966164967164968164969164970164971164972164973164974164975164976164977164978164979164980164981164982164983164984164985164986164987164988164989164990164991164992164993164994164995164996164997164998164999165000165001165002165003165004165005165006165007165008165009165010165011165012165013165014165015165016165017165018165019165020165021165022165023165024165025165026165027165028165029165030165031165032165033165034165035165036165037165038165039165040165041165042165043165044165045165046165047165048165049165050165051165052165053165054165055165056165057165058165059165060165061165062165063165064165065165066165067165068165069165070165071165072165073165074165075165076165077165078165079165080165081165082165083165084165085165086165087165088165089165090165091165092165093165094165095165096165097165098165099165100165101165102165103165104165105165106165107165108165109165110165111165112165113165114165115165116165117165118165119165120165121165122165123165124165125165126165127165128165129165130165131165132165133165134165135165136165137165138165139165140165141165142165143165144165145165146165147165148165149165150165151165152165153165154165155165156165157165158165159165160165161165162165163165164165165165166165167165168165169165170165171165172165173165174165175165176165177165178165179165180165181165182165183165184165185165186165187165188165189165190165191165192165193165194165195165196165197165198165199165200165201165202165203165204165205165206165207165208165209165210165211165212165213165214165215165216165217165218165219165220165221165222165223165224165225165226165227165228165229165230165231165232165233165234165235165236165237165238165239165240165241165242165243165244165245165246165247165248165249165250165251165252165253165254165255165256165257165258165259165260165261165262165263165264165265165266165267165268165269165270165271165272165273165274165275165276165277165278165279165280165281165282165283165284165285165286165287165288165289165290165291165292165293165294165295165296165297165298165299165300165301165302165303165304165305165306165307165308165309165310165311165312165313165314165315165316165317165318165319165320165321165322165323165324165325165326165327165328165329165330165331165332165333165334165335165336165337165338165339165340165341165342165343165344165345165346165347165348165349165350165351165352165353165354165355165356165357165358165359165360165361165362165363165364165365165366165367165368165369165370165371165372165373165374165375165376165377165378165379165380165381165382165383165384165385165386165387165388165389165390165391165392165393165394165395165396165397165398165399165400165401165402165403165404165405165406165407165408165409165410165411165412165413165414165415165416165417165418165419165420165421165422165423165424165425165426165427165428165429165430165431165432165433165434165435165436165437165438165439165440165441165442165443165444165445165446165447165448165449165450165451165452165453165454165455165456165457165458165459165460165461165462165463165464165465165466165467165468165469165470165471165472165473165474165475165476165477165478165479165480165481165482165483165484165485165486165487165488165489165490165491165492165493165494165495165496165497165498165499165500165501165502165503165504165505165506165507165508165509165510165511165512165513165514165515165516165517165518165519165520165521165522165523165524165525165526165527165528165529165530165531165532165533165534165535165536165537165538165539165540165541165542165543165544165545165546165547165548165549165550165551165552165553165554165555165556165557165558165559165560165561165562165563165564165565165566165567165568165569165570165571165572165573165574165575165576165577165578165579165580165581165582165583165584165585165586165587165588165589165590165591165592165593165594165595165596165597165598165599165600165601165602165603165604165605165606165607165608165609165610165611165612165613165614165615165616165617165618165619165620165621165622165623165624165625165626165627165628165629165630165631165632165633165634165635165636165637165638165639165640165641165642165643165644165645165646165647165648165649165650165651165652165653165654165655165656165657165658165659165660165661165662165663165664165665165666165667165668165669165670165671165672165673165674165675165676165677165678165679165680165681165682165683165684165685165686165687165688165689165690165691165692165693165694165695165696165697165698165699165700165701165702165703165704165705165706165707165708165709165710165711165712165713165714165715165716165717165718165719165720165721165722165723165724165725165726165727165728165729165730165731165732165733165734165735165736165737165738165739165740165741165742165743165744165745165746165747165748165749165750165751165752165753165754165755165756165757165758165759165760165761165762165763165764165765165766165767165768165769165770165771165772165773165774165775165776165777165778165779165780165781165782165783165784165785165786165787165788165789165790165791165792165793165794165795165796165797165798165799165800165801165802165803165804165805165806165807165808165809165810165811165812165813165814165815165816165817165818165819165820165821165822165823165824165825165826165827165828165829165830165831165832165833165834165835165836165837165838165839165840165841165842165843165844165845165846165847165848165849165850165851165852165853165854165855165856165857165858165859165860165861165862165863165864165865165866165867165868165869165870165871165872165873165874165875165876165877165878165879165880165881165882165883165884165885165886165887165888165889165890165891165892165893165894165895165896165897165898165899165900165901165902165903165904165905165906165907165908165909165910165911165912165913165914165915165916165917165918165919165920165921165922165923165924165925165926165927165928165929165930165931165932165933165934165935165936165937165938165939165940165941165942165943165944165945165946165947165948165949165950165951165952165953165954165955165956165957165958165959165960165961165962165963165964165965165966165967165968165969165970165971165972165973165974165975165976165977165978165979165980165981165982165983165984165985165986165987165988165989165990165991165992165993165994165995165996165997165998165999166000166001166002166003166004166005166006166007166008166009166010166011166012166013166014166015166016166017166018166019166020166021166022166023166024166025166026166027166028166029166030166031166032166033166034166035166036166037166038166039166040166041166042166043166044166045166046166047166048166049166050166051166052166053166054166055166056166057166058166059166060166061166062166063166064166065166066166067166068166069166070166071166072166073166074166075166076166077166078166079166080166081166082166083166084166085166086166087166088166089166090166091166092166093166094166095166096166097166098166099166100166101166102166103166104166105166106166107166108166109166110166111166112166113166114166115166116166117166118166119166120166121166122166123166124166125166126166127166128166129166130166131166132166133166134166135166136166137166138166139166140166141166142166143166144166145166146166147166148166149166150166151166152166153166154166155166156166157166158166159166160166161166162166163166164166165166166166167166168166169166170166171166172166173166174166175166176166177166178166179166180166181166182166183166184166185166186166187166188166189166190166191166192166193166194166195166196166197166198166199166200166201166202166203166204166205166206166207166208166209166210166211166212166213166214166215166216166217166218166219166220166221166222166223166224166225166226166227166228166229166230166231166232166233166234166235166236166237166238166239166240166241166242166243166244166245166246166247166248166249166250166251166252166253166254166255166256166257166258166259166260166261166262166263166264166265166266166267166268166269166270166271166272166273166274166275166276166277166278166279166280166281166282166283166284166285166286166287166288166289166290166291166292166293166294166295166296166297166298166299166300166301166302166303166304166305166306166307166308166309166310166311166312166313166314166315166316166317166318166319166320166321166322166323166324166325166326166327166328166329166330166331166332166333166334166335166336166337166338166339166340166341166342166343166344166345166346166347166348166349166350166351166352166353166354166355166356166357166358166359166360166361166362166363166364166365166366166367166368166369166370166371166372166373166374166375166376166377166378166379166380166381166382166383166384166385166386166387166388166389166390166391166392166393166394166395166396166397166398166399166400166401166402166403166404166405166406166407166408166409166410166411166412166413166414166415166416166417166418166419166420166421166422166423166424166425166426166427166428166429166430166431166432166433166434166435166436166437166438166439166440166441166442166443166444166445166446166447166448166449166450166451166452166453166454166455166456166457166458166459166460166461166462166463166464166465166466166467166468166469166470166471166472166473166474166475166476166477166478166479166480166481166482166483166484166485166486166487166488166489166490166491166492166493166494166495166496166497166498166499166500166501166502166503166504166505166506166507166508166509166510166511166512166513166514166515166516166517166518166519166520166521166522166523166524166525166526166527166528166529166530166531166532166533166534166535166536166537166538166539166540166541166542166543166544166545166546166547166548166549166550166551166552166553166554166555166556166557166558166559166560166561166562166563166564166565166566166567166568166569166570166571166572166573166574166575166576166577166578166579166580166581166582166583166584166585166586166587166588166589166590166591166592166593166594166595166596166597166598166599166600166601166602166603166604166605166606166607166608166609166610166611166612166613166614166615166616166617166618166619166620166621166622166623166624166625166626166627166628166629166630166631166632166633166634166635166636166637166638166639166640166641166642166643166644166645166646166647166648166649166650166651166652166653166654166655166656166657166658166659166660166661166662166663166664166665166666166667166668166669166670166671166672166673166674166675166676166677166678166679166680166681166682166683166684166685166686166687166688166689166690166691166692166693166694166695166696166697166698166699166700166701166702166703166704166705166706166707166708166709166710166711166712166713166714166715166716166717166718166719166720166721166722166723166724166725166726166727166728166729166730166731166732166733166734166735166736166737166738166739166740166741166742166743166744166745166746166747166748166749166750166751166752166753166754166755166756166757166758166759166760166761166762166763166764166765166766166767166768166769166770166771166772166773166774166775166776166777166778166779166780166781166782166783166784166785166786166787166788166789166790166791166792166793166794166795166796166797166798166799166800166801166802166803166804166805166806166807166808166809166810166811166812166813166814166815166816166817166818166819166820166821166822166823166824166825166826166827166828166829166830166831166832166833166834166835166836166837166838166839166840166841166842166843166844166845166846166847166848166849166850166851166852166853166854166855166856166857166858166859166860166861166862166863166864166865166866166867166868166869166870166871166872166873166874166875166876166877166878166879166880166881166882166883166884166885166886166887166888166889166890166891166892166893166894166895166896166897166898166899166900166901166902166903166904166905166906166907166908166909166910166911166912166913166914166915166916166917166918166919166920166921166922166923166924166925166926166927166928166929166930166931166932166933166934166935166936166937166938166939166940166941166942166943166944166945166946166947166948166949166950166951166952166953166954166955166956166957166958166959166960166961166962166963166964166965166966166967166968166969166970166971166972166973166974166975166976166977166978166979166980166981166982166983166984166985166986166987166988166989166990166991166992166993166994166995166996166997166998166999167000167001167002167003167004167005167006167007167008167009167010167011167012167013167014167015167016167017167018167019167020167021167022167023167024167025167026167027167028167029167030167031167032167033167034167035167036167037167038167039167040167041167042167043167044167045167046167047167048167049167050167051167052167053167054167055167056167057167058167059167060167061167062167063167064167065167066167067167068167069167070167071167072167073167074167075167076167077167078167079167080167081167082167083167084167085167086167087167088167089167090167091167092167093167094167095167096167097167098167099167100167101167102167103167104167105167106167107167108167109167110167111167112167113167114167115167116167117167118167119167120167121167122167123167124167125167126167127167128167129167130167131167132167133167134167135167136167137167138167139167140167141167142167143167144167145167146167147167148167149167150167151167152167153167154167155167156167157167158167159167160167161167162167163167164167165167166167167167168167169167170167171167172167173167174167175167176167177167178167179167180167181167182167183167184167185167186167187167188167189167190167191167192167193167194167195167196167197167198167199167200167201167202167203167204167205167206167207167208167209167210167211167212167213167214167215167216167217167218167219167220167221167222167223167224167225167226167227167228167229167230167231167232167233167234167235167236167237167238167239167240167241167242167243167244167245167246167247167248167249167250167251167252167253167254167255167256167257167258167259167260167261167262167263167264167265167266167267167268167269167270167271167272167273167274167275167276167277167278167279167280167281167282167283167284167285167286167287167288167289167290167291167292167293167294167295167296167297167298167299167300167301167302167303167304167305167306167307167308167309167310167311167312167313167314167315167316167317167318167319167320167321167322167323167324167325167326167327167328167329167330167331167332167333167334167335167336167337167338167339167340167341167342167343167344167345167346167347167348167349167350167351167352167353167354167355167356167357167358167359167360167361167362167363167364167365167366167367167368167369167370167371167372167373167374167375167376167377167378167379167380167381167382167383167384167385167386167387167388167389167390167391167392167393167394167395167396167397167398167399167400167401167402167403167404167405167406167407167408167409167410167411167412167413167414167415167416167417167418167419167420167421167422167423167424167425167426167427167428167429167430167431167432167433167434167435167436167437167438167439167440167441167442167443167444167445167446167447167448167449167450167451167452167453167454167455167456167457167458167459167460167461167462167463167464167465167466167467167468167469167470167471167472167473167474167475167476167477167478167479167480167481167482167483167484167485167486167487167488167489167490167491167492167493167494167495167496167497167498167499167500167501167502167503167504167505167506167507167508167509167510167511167512167513167514167515167516167517167518167519167520167521167522167523167524167525167526167527167528167529167530167531167532167533167534167535167536167537167538167539167540167541167542167543167544167545167546167547167548167549167550167551167552167553167554167555167556167557167558167559167560167561167562167563167564167565167566167567167568167569167570167571167572167573167574167575167576167577167578167579167580167581167582167583167584167585167586167587167588167589167590167591167592167593167594167595167596167597167598167599167600167601167602167603167604167605167606167607167608167609167610167611167612167613167614167615167616167617167618167619167620167621167622167623167624167625167626167627167628167629167630167631167632167633167634167635167636167637167638167639167640167641167642167643167644167645167646167647167648167649167650167651167652167653167654167655167656167657167658167659167660167661167662167663167664167665167666167667167668167669167670167671167672167673167674167675167676167677167678167679167680167681167682167683167684167685167686167687167688167689167690167691167692167693167694167695167696167697167698167699167700167701167702167703167704167705167706167707167708167709167710167711167712167713167714167715167716167717167718167719167720167721167722167723167724167725167726167727167728167729167730167731167732167733167734167735167736167737167738167739167740167741167742167743167744167745167746167747167748167749167750167751167752167753167754167755167756167757167758167759167760167761167762167763167764167765167766167767167768167769167770167771167772167773167774167775167776167777167778167779167780167781167782167783167784167785167786167787167788167789167790167791167792167793167794167795167796167797167798167799167800167801167802167803167804167805167806167807167808167809167810167811167812167813167814167815167816167817167818167819167820167821167822167823167824167825167826167827167828167829167830167831167832167833167834167835167836167837167838167839167840167841167842167843167844167845167846167847167848167849167850167851167852167853167854167855167856167857167858167859167860167861167862167863167864167865167866167867167868167869167870167871167872167873167874167875167876167877167878167879167880167881167882167883167884167885167886167887167888167889167890167891167892167893167894167895167896167897167898167899167900167901167902167903167904167905167906167907167908167909167910167911167912167913167914167915167916167917167918167919167920167921167922167923167924167925167926167927167928167929167930167931167932167933167934167935167936167937167938167939167940167941167942167943167944167945167946167947167948167949167950167951167952167953167954167955167956167957167958167959167960167961167962167963167964167965167966167967167968167969167970167971167972167973167974167975167976167977167978167979167980167981167982167983167984167985167986167987167988167989167990167991167992167993167994167995167996167997167998167999168000168001168002168003168004168005168006168007168008168009168010168011168012168013168014168015168016168017168018168019168020168021168022168023168024168025168026168027168028168029168030168031168032168033168034168035168036168037168038168039168040168041168042168043168044168045168046168047168048168049168050168051168052168053168054168055168056168057168058168059168060168061168062168063168064168065168066168067168068168069168070168071168072168073168074168075168076168077168078168079168080168081168082168083168084168085168086168087168088168089168090168091168092168093168094168095168096168097168098168099168100168101168102168103168104168105168106168107168108168109168110168111168112168113168114168115168116168117168118168119168120168121168122168123168124168125168126168127168128168129168130168131168132168133168134168135168136168137168138168139168140168141168142168143168144168145168146168147168148168149168150168151168152168153168154168155168156168157168158168159168160168161168162168163168164168165168166168167168168168169168170168171168172168173168174168175168176168177168178168179168180168181168182168183168184168185168186168187168188168189168190168191168192168193168194168195168196168197168198168199168200168201168202168203168204168205168206168207168208168209168210168211168212168213168214168215168216168217168218168219168220168221168222168223168224168225168226168227168228168229168230168231168232168233168234168235168236168237168238168239168240168241168242168243168244168245168246168247168248168249168250168251168252168253168254168255168256168257168258168259168260168261168262168263168264168265168266168267168268168269168270168271168272168273168274168275168276168277168278168279168280168281168282168283168284168285168286168287168288168289168290168291168292168293168294168295168296168297168298168299168300168301168302168303168304168305168306168307168308168309168310168311168312168313168314168315168316168317168318168319168320168321168322168323168324168325168326168327168328168329168330168331168332168333168334168335168336168337168338168339168340168341168342168343168344168345168346168347168348168349168350168351168352168353168354168355168356168357168358168359168360168361168362168363168364168365168366168367168368168369168370168371168372168373168374168375168376168377168378168379168380168381168382168383168384168385168386168387168388168389168390168391168392168393168394168395168396168397168398168399168400168401168402168403168404168405168406168407168408168409168410168411168412168413168414168415168416168417168418168419168420168421168422168423168424168425168426168427168428168429168430168431168432168433168434168435168436168437168438168439168440168441168442168443168444168445168446168447168448168449168450168451168452168453168454168455168456168457168458168459168460168461168462168463168464168465168466168467168468168469168470168471168472168473168474168475168476168477168478168479168480168481168482168483168484168485168486168487168488168489168490168491168492168493168494168495168496168497168498168499168500168501168502168503168504168505168506168507168508168509168510168511168512168513168514168515168516168517168518168519168520168521168522168523168524168525168526168527168528168529168530168531168532168533168534168535168536168537168538168539168540168541168542168543168544168545168546168547168548168549168550168551168552168553168554168555168556168557168558168559168560168561168562168563168564168565168566168567168568168569168570168571168572168573168574168575168576168577168578168579168580168581168582168583168584168585168586168587168588168589168590168591168592168593168594168595168596168597168598168599168600168601168602168603168604168605168606168607168608168609168610168611168612168613168614168615168616168617168618168619168620168621168622168623168624168625168626168627168628168629168630168631168632168633168634168635168636168637168638168639168640168641168642168643168644168645168646168647168648168649168650168651168652168653168654168655168656168657168658168659168660168661168662168663168664168665168666168667168668168669168670168671168672168673168674168675168676168677168678168679168680168681168682168683168684168685168686168687168688168689168690168691168692168693168694168695168696168697168698168699168700168701168702168703168704168705168706168707168708168709168710168711168712168713168714168715168716168717168718168719168720168721168722168723168724168725168726168727168728168729168730168731168732168733168734168735168736168737168738168739168740168741168742168743168744168745168746168747168748168749168750168751168752168753168754168755168756168757168758168759168760168761168762168763168764168765168766168767168768168769168770168771168772168773168774168775168776168777168778168779168780168781168782168783168784168785168786168787168788168789168790168791168792168793168794168795168796168797168798168799168800168801168802168803168804168805168806168807168808168809168810168811168812168813168814168815168816168817168818168819168820168821168822168823168824168825168826168827168828168829168830168831168832168833168834168835168836168837168838168839168840168841168842168843168844168845168846168847168848168849168850168851168852168853168854168855168856168857168858168859168860168861168862168863168864168865168866168867168868168869168870168871168872168873168874168875168876168877168878168879168880168881168882168883168884168885168886168887168888168889168890168891168892168893168894168895168896168897168898168899168900168901168902168903168904168905168906168907168908168909168910168911168912168913168914168915168916168917168918168919168920168921168922168923168924168925168926168927168928168929168930168931168932168933168934168935168936168937168938168939168940168941168942168943168944168945168946168947168948168949168950168951168952168953168954168955168956168957168958168959168960168961168962168963168964168965168966168967168968168969168970168971168972168973168974168975168976168977168978168979168980168981168982168983168984168985168986168987168988168989168990168991168992168993168994168995168996168997168998168999169000169001169002169003169004169005169006169007169008169009169010169011169012169013169014169015169016169017169018169019169020169021169022169023169024169025169026169027169028169029169030169031169032169033169034169035169036169037169038169039169040169041169042169043169044169045169046169047169048169049169050169051169052169053169054169055169056169057169058169059169060169061169062169063169064169065169066169067169068169069169070169071169072169073169074169075169076169077169078169079169080169081169082169083169084169085169086169087169088169089169090169091169092169093169094169095169096169097169098169099169100169101169102169103169104169105169106169107169108169109169110169111169112169113169114169115169116169117169118169119169120169121169122169123169124169125169126169127169128169129169130169131169132169133169134169135169136169137169138169139169140169141169142169143169144169145169146169147169148169149169150169151169152169153169154169155169156169157169158169159169160169161169162169163169164169165169166169167169168169169169170169171169172169173169174169175169176169177169178169179169180169181169182169183169184169185169186169187169188169189169190169191169192169193169194169195169196169197169198169199169200169201169202169203169204169205169206169207169208169209169210169211169212169213169214169215169216169217169218169219169220169221169222169223169224169225169226169227169228169229169230169231169232169233169234169235169236169237169238169239169240169241169242169243169244169245169246169247169248169249169250169251169252169253169254169255169256169257169258169259169260169261169262169263169264169265169266169267169268169269169270169271169272169273169274169275169276169277169278169279169280169281169282169283169284169285169286169287169288169289169290169291169292169293169294169295169296169297169298169299169300169301169302169303169304169305169306169307169308169309169310169311169312169313169314169315169316169317169318169319169320169321169322169323169324169325169326169327169328169329169330169331169332169333169334169335169336169337169338169339169340169341169342169343169344169345169346169347169348169349169350169351169352169353169354169355169356169357169358169359169360169361169362169363169364169365169366169367169368169369169370169371169372169373169374169375169376169377169378169379169380169381169382169383169384169385169386169387169388169389169390169391169392169393169394169395169396169397169398169399169400169401169402169403169404169405169406169407169408169409169410169411169412169413169414169415169416169417169418169419169420169421169422169423169424169425169426169427169428169429169430169431169432169433169434169435169436169437169438169439169440169441169442169443169444169445169446169447169448169449169450169451169452169453169454169455169456169457169458169459169460169461169462169463169464169465169466169467169468169469169470169471169472169473169474169475169476169477169478169479169480169481169482169483169484169485169486169487169488169489169490169491169492169493169494169495169496169497169498169499169500169501169502169503169504169505169506169507169508169509169510169511169512169513169514169515169516169517169518169519169520169521169522169523169524169525169526169527169528169529169530169531169532169533169534169535169536169537169538169539169540169541169542169543169544169545169546169547169548169549169550169551169552169553169554169555169556169557169558169559169560169561169562169563169564169565169566169567169568169569169570169571169572169573169574169575169576169577169578169579169580169581169582169583169584169585169586169587169588169589169590169591169592169593169594169595169596169597169598169599169600169601169602169603169604169605169606169607169608169609169610169611169612169613169614169615169616169617169618169619169620169621169622169623169624169625169626169627169628169629169630169631169632169633169634169635169636169637169638169639169640169641169642169643169644169645169646169647169648169649169650169651169652169653169654169655169656169657169658169659169660169661169662169663169664169665169666169667169668169669169670169671169672169673169674169675169676169677169678169679169680169681169682169683169684169685169686169687169688169689169690169691169692169693169694169695169696169697169698169699169700169701169702169703169704169705169706169707169708169709169710169711169712169713169714169715169716169717169718169719169720169721169722169723169724169725169726169727169728169729169730169731169732169733169734169735169736169737169738169739169740169741169742169743169744169745169746169747169748169749169750169751169752169753169754169755169756169757169758169759169760169761169762169763169764169765169766169767169768169769169770169771169772169773169774169775169776169777169778169779169780169781169782169783169784169785169786169787169788169789169790169791169792169793169794169795169796169797169798169799169800169801169802169803169804169805169806169807169808169809169810169811169812169813169814169815169816169817169818169819169820169821169822169823169824169825169826169827169828169829169830169831169832169833169834169835169836169837169838169839169840169841169842169843169844169845169846169847169848169849169850169851169852169853169854169855169856169857169858169859169860169861169862169863169864169865169866169867169868169869169870169871169872169873169874169875169876169877169878169879169880169881169882169883169884169885169886169887169888169889169890169891169892169893169894169895169896169897169898169899169900169901169902169903169904169905169906169907169908169909169910169911169912169913169914169915169916169917169918169919169920169921169922169923169924169925169926169927169928169929169930169931169932169933169934169935169936169937169938169939169940169941169942169943169944169945169946169947169948169949169950169951169952169953169954169955169956169957169958169959169960169961169962169963169964169965169966169967169968169969169970169971169972169973169974169975169976169977169978169979169980169981169982169983169984169985169986169987169988169989169990169991169992169993169994169995169996169997169998169999170000170001170002170003170004170005170006170007170008170009170010170011170012170013170014170015170016170017170018170019170020170021170022170023170024170025170026170027170028170029170030170031170032170033170034170035170036170037170038170039170040170041170042170043170044170045170046170047170048170049170050170051170052170053170054170055170056170057170058170059170060170061170062170063170064170065170066170067170068170069170070170071170072170073170074170075170076170077170078170079170080170081170082170083170084170085170086170087170088170089170090170091170092170093170094170095170096170097170098170099170100170101170102170103170104170105170106170107170108170109170110170111170112170113170114170115170116170117170118170119170120170121170122170123170124170125170126170127170128170129170130170131170132170133170134170135170136170137170138170139170140170141170142170143170144170145170146170147170148170149170150170151170152170153170154170155170156170157170158170159170160170161170162170163170164170165170166170167170168170169170170170171170172170173170174170175170176170177170178170179170180170181170182170183170184170185170186170187170188170189170190170191170192170193170194170195170196170197170198170199170200170201170202170203170204170205170206170207170208170209170210170211170212170213170214170215170216170217170218170219170220170221170222170223170224170225170226170227170228170229170230170231170232170233170234170235170236170237170238170239170240170241170242170243170244170245170246170247170248170249170250170251170252170253170254170255170256170257170258170259170260170261170262170263170264170265170266170267170268170269170270170271170272170273170274170275170276170277170278170279170280170281170282170283170284170285170286170287170288170289170290170291170292170293170294170295170296170297170298170299170300170301170302170303170304170305170306170307170308170309170310170311170312170313170314170315170316170317170318170319170320170321170322170323170324170325170326170327170328170329170330170331170332170333170334170335170336170337170338170339170340170341170342170343170344170345170346170347170348170349170350170351170352170353170354170355170356170357170358170359170360170361170362170363170364170365170366170367170368170369170370170371170372170373170374170375170376170377170378170379170380170381170382170383170384170385170386170387170388170389170390170391170392170393170394170395170396170397170398170399170400170401170402170403170404170405170406170407170408170409170410170411170412170413170414170415170416170417170418170419170420170421170422170423170424170425170426170427170428170429170430170431170432170433170434170435170436170437170438170439170440170441170442170443170444170445170446170447170448170449170450170451170452170453170454170455170456170457170458170459170460170461170462170463170464170465170466170467170468170469170470170471170472170473170474170475170476170477170478170479170480170481170482170483170484170485170486170487170488170489170490170491170492170493170494170495170496170497170498170499170500170501170502170503170504170505170506170507170508170509170510170511170512170513170514170515170516170517170518170519170520170521170522170523170524170525170526170527170528170529170530170531170532170533170534170535170536170537170538170539170540170541170542170543170544170545170546170547170548170549170550170551170552170553170554170555170556170557170558170559170560170561170562170563170564170565170566170567170568170569170570170571170572170573170574170575170576170577170578170579170580170581170582170583170584170585170586170587170588170589170590170591170592170593170594170595170596170597170598170599170600170601170602170603170604170605170606170607170608170609170610170611170612170613170614170615170616170617170618170619170620170621170622170623170624170625170626170627170628170629170630170631170632170633170634170635170636170637170638170639170640170641170642170643170644170645170646170647170648170649170650170651170652170653170654170655170656170657170658170659170660170661170662170663170664170665170666170667170668170669170670170671170672170673170674170675170676170677170678170679170680170681170682170683170684170685170686170687170688170689170690170691170692170693170694170695170696170697170698170699170700170701170702170703170704170705170706170707170708170709170710170711170712170713170714170715170716170717170718170719170720170721170722170723170724170725170726170727170728170729170730170731170732170733170734170735170736170737170738170739170740170741170742170743170744170745170746170747170748170749170750170751170752170753170754170755170756170757170758170759170760170761170762170763170764170765170766170767170768170769170770170771170772170773170774170775170776170777170778170779170780170781170782170783170784170785170786170787170788170789170790170791170792170793170794170795170796170797170798170799170800170801170802170803170804170805170806170807170808170809170810170811170812170813170814170815170816170817170818170819170820170821170822170823170824170825170826170827170828170829170830170831170832170833170834170835170836170837170838170839170840170841170842170843170844170845170846170847170848170849170850170851170852170853170854170855170856170857170858170859170860170861170862170863170864170865170866170867170868170869170870170871170872170873170874170875170876170877170878170879170880170881170882170883170884170885170886170887170888170889170890170891170892170893170894170895170896170897170898170899170900170901170902170903170904170905170906170907170908170909170910170911170912170913170914170915170916170917170918170919170920170921170922170923170924170925170926170927170928170929170930170931170932170933170934170935170936170937170938170939170940170941170942170943170944170945170946170947170948170949170950170951170952170953170954170955170956170957170958170959170960170961170962170963170964170965170966170967170968170969170970170971170972170973170974170975170976170977170978170979170980170981170982170983170984170985170986170987170988170989170990170991170992170993170994170995170996170997170998170999171000171001171002171003171004171005171006171007171008171009171010171011171012171013171014171015171016171017171018171019171020171021171022171023171024171025171026171027171028171029171030171031171032171033171034171035171036171037171038171039171040171041171042171043171044171045171046171047171048171049171050171051171052171053171054171055171056171057171058171059171060171061171062171063171064171065171066171067171068171069171070171071171072171073171074171075171076171077171078171079171080171081171082171083171084171085171086171087171088171089171090171091171092171093171094171095171096171097171098171099171100171101171102171103171104171105171106171107171108171109171110171111171112171113171114171115171116171117171118171119171120171121171122171123171124171125171126171127171128171129171130171131171132171133171134171135171136171137171138171139171140171141171142171143171144171145171146171147171148171149171150171151171152171153171154171155171156171157171158171159171160171161171162171163171164171165171166171167171168171169171170171171171172171173171174171175171176171177171178171179171180171181171182171183171184171185171186171187171188171189171190171191171192171193171194171195171196171197171198171199171200171201171202171203171204171205171206171207171208171209171210171211171212171213171214171215171216171217171218171219171220171221171222171223171224171225171226171227171228171229171230171231171232171233171234171235171236171237171238171239171240171241171242171243171244171245171246171247171248171249171250171251171252171253171254171255171256171257171258171259171260171261171262171263171264171265171266171267171268171269171270171271171272171273171274171275171276171277171278171279171280171281171282171283171284171285171286171287171288171289171290171291171292171293171294171295171296171297171298171299171300171301171302171303171304171305171306171307171308171309171310171311171312171313171314171315171316171317171318171319171320171321171322171323171324171325171326171327171328171329171330171331171332171333171334171335171336171337171338171339171340171341171342171343171344171345171346171347171348171349171350171351171352171353171354171355171356171357171358171359171360171361171362171363171364171365171366171367171368171369171370171371171372171373171374171375171376171377171378171379171380171381171382171383171384171385171386171387171388171389171390171391171392171393171394171395171396171397171398171399171400171401171402171403171404171405171406171407171408171409171410171411171412171413171414171415171416171417171418171419171420171421171422171423171424171425171426171427171428171429171430171431171432171433171434171435171436171437171438171439171440171441171442171443171444171445171446171447171448171449171450171451171452171453171454171455171456171457171458171459171460171461171462171463171464171465171466171467171468171469171470171471171472171473171474171475171476171477171478171479171480171481171482171483171484171485171486171487171488171489171490171491171492171493171494171495171496171497171498171499171500171501171502171503171504171505171506171507171508171509171510171511171512171513171514171515171516171517171518171519171520171521171522171523171524171525171526171527171528171529171530171531171532171533171534171535171536171537171538171539171540171541171542171543171544171545171546171547171548171549171550171551171552171553171554171555171556171557171558171559171560171561171562171563171564171565171566171567171568171569171570171571171572171573171574171575171576171577171578171579171580171581171582171583171584171585171586171587171588171589171590171591171592171593171594171595171596171597171598171599171600171601171602171603171604171605171606171607171608171609171610171611171612171613171614171615171616171617171618171619171620171621171622171623171624171625171626171627171628171629171630171631171632171633171634171635171636171637171638171639171640171641171642171643171644171645171646171647171648171649171650171651171652171653171654171655171656171657171658171659171660171661171662171663171664171665171666171667171668171669171670171671171672171673171674171675171676171677171678171679171680171681171682171683171684171685171686171687171688171689171690171691171692171693171694171695171696171697171698171699171700171701171702171703171704171705171706171707171708171709171710171711171712171713171714171715171716171717171718171719171720171721171722171723171724171725171726171727171728171729171730171731171732171733171734171735171736171737171738171739171740171741171742171743171744171745171746171747171748171749171750171751171752171753171754171755171756171757171758171759171760171761171762171763171764171765171766171767171768171769171770171771171772171773171774171775171776171777171778171779171780171781171782171783171784171785171786171787171788171789171790171791171792171793171794171795171796171797171798171799171800171801171802171803171804171805171806171807171808171809171810171811171812171813171814171815171816171817171818171819171820171821171822171823171824171825171826171827171828171829171830171831171832171833171834171835171836171837171838171839171840171841171842171843171844171845171846171847171848171849171850171851171852171853171854171855171856171857171858171859171860171861171862171863171864171865171866171867171868171869171870171871171872171873171874171875171876171877171878171879171880171881171882171883171884171885171886171887171888171889171890171891171892171893171894171895171896171897171898171899171900171901171902171903171904171905171906171907171908171909171910171911171912171913171914171915171916171917171918171919171920171921171922171923171924171925171926171927171928171929171930171931171932171933171934171935171936171937171938171939171940171941171942171943171944171945171946171947171948171949171950171951171952171953171954171955171956171957171958171959171960171961171962171963171964171965171966171967171968171969171970171971171972171973171974171975171976171977171978171979171980171981171982171983171984171985171986171987171988171989171990171991171992171993171994171995171996171997171998171999172000172001172002172003172004172005172006172007172008172009172010172011172012172013172014172015172016172017172018172019172020172021172022172023172024172025172026172027172028172029172030172031172032172033172034172035172036172037172038172039172040172041172042172043172044172045172046172047172048172049172050172051172052172053172054172055172056172057172058172059172060172061172062172063172064172065172066172067172068172069172070172071172072172073172074172075172076172077172078172079172080172081172082172083172084172085172086172087172088172089172090172091172092172093172094172095172096172097172098172099172100172101172102172103172104172105172106172107172108172109172110172111172112172113172114172115172116172117172118172119172120172121172122172123172124172125172126172127172128172129172130172131172132172133172134172135172136172137172138172139172140172141172142172143172144172145172146172147172148172149172150172151172152172153172154172155172156172157172158172159172160172161172162172163172164172165172166172167172168172169172170172171172172172173172174172175172176172177172178172179172180172181172182172183172184172185172186172187172188172189172190172191172192172193172194172195172196172197172198172199172200172201172202172203172204172205172206172207172208172209172210172211172212172213172214172215172216172217172218172219172220172221172222172223172224172225172226172227172228172229172230172231172232172233172234172235172236172237172238172239172240172241172242172243172244172245172246172247172248172249172250172251172252172253172254172255172256172257172258172259172260172261172262172263172264172265172266172267172268172269172270172271172272172273172274172275172276172277172278172279172280172281172282172283172284172285172286172287172288172289172290172291172292172293172294172295172296172297172298172299172300172301172302172303172304172305172306172307172308172309172310172311172312172313172314172315172316172317172318172319172320172321172322172323172324172325172326172327172328172329172330172331172332172333172334172335172336172337172338172339172340172341172342172343172344172345172346172347172348172349172350172351172352172353172354172355172356172357172358172359172360172361172362172363172364172365172366172367172368172369172370172371172372172373172374172375172376172377172378172379172380172381172382172383172384172385172386172387172388172389172390172391172392172393172394172395172396172397172398172399172400172401172402172403172404172405172406172407172408172409172410172411172412172413172414172415172416172417172418172419172420172421172422172423172424172425172426172427172428172429172430172431172432172433172434172435172436172437172438172439172440172441172442172443172444172445172446172447172448172449172450172451172452172453172454172455172456172457172458172459172460172461172462172463172464172465172466172467172468172469172470172471172472172473172474172475172476172477172478172479172480172481172482172483172484172485172486172487172488172489172490172491172492172493172494172495172496172497172498172499172500172501172502172503172504172505172506172507172508172509172510172511172512172513172514172515172516172517172518172519172520172521172522172523172524172525172526172527172528172529172530172531172532172533172534172535172536172537172538172539172540172541172542172543172544172545172546172547172548172549172550172551172552172553172554172555172556172557172558172559172560172561172562172563172564172565172566172567172568172569172570172571172572172573172574172575172576172577172578172579172580172581172582172583172584172585172586172587172588172589172590172591172592172593172594172595172596172597172598172599172600172601172602172603172604172605172606172607172608172609172610172611172612172613172614172615172616172617172618172619172620172621172622172623172624172625172626172627172628172629172630172631172632172633172634172635172636172637172638172639172640172641172642172643172644172645172646172647172648172649172650172651172652172653172654172655172656172657172658172659172660172661172662172663172664172665172666172667172668172669172670172671172672172673172674172675172676172677172678172679172680172681172682172683172684172685172686172687172688172689172690172691172692172693172694172695172696172697172698172699172700172701172702172703172704172705172706172707172708172709172710172711172712172713172714172715172716172717172718172719172720172721172722172723172724172725172726172727172728172729172730172731172732172733172734172735172736172737172738172739172740172741172742172743172744172745172746172747172748172749172750172751172752172753172754172755172756172757172758172759172760172761172762172763172764172765172766172767172768172769172770172771172772172773172774172775172776172777172778172779172780172781172782172783172784172785172786172787172788172789172790172791172792172793172794172795172796172797172798172799172800172801172802172803172804172805172806172807172808172809172810172811172812172813172814172815172816172817172818172819172820172821172822172823172824172825172826172827172828172829172830172831172832172833172834172835172836172837172838172839172840172841172842172843172844172845172846172847172848172849172850172851172852172853172854172855172856172857172858172859172860172861172862172863172864172865172866172867172868172869172870172871172872172873172874172875172876172877172878172879172880172881172882172883172884172885172886172887172888172889172890172891172892172893172894172895172896172897172898172899172900172901172902172903172904172905172906172907172908172909172910172911172912172913172914172915172916172917172918172919172920172921172922172923172924172925172926172927172928172929172930172931172932172933172934172935172936172937172938172939172940172941172942172943172944172945172946172947172948172949172950172951172952172953172954172955172956172957172958172959172960172961172962172963172964172965172966172967172968172969172970172971172972172973172974172975172976172977172978172979172980172981172982172983172984172985172986172987172988172989172990172991172992172993172994172995172996172997172998172999173000173001173002173003173004173005173006173007173008173009173010173011173012173013173014173015173016173017173018173019173020173021173022173023173024173025173026173027173028173029173030173031173032173033173034173035173036173037173038173039173040173041173042173043173044173045173046173047173048173049173050173051173052173053173054173055173056173057173058173059173060173061173062173063173064173065173066173067173068173069173070173071173072173073173074173075173076173077173078173079173080173081173082173083173084173085173086173087173088173089173090173091173092173093173094173095173096173097173098173099173100173101173102173103173104173105173106173107173108173109173110173111173112173113173114173115173116173117173118173119173120173121173122173123173124173125173126173127173128173129173130173131173132173133173134173135173136173137173138173139173140173141173142173143173144173145173146173147173148173149173150173151173152173153173154173155173156173157173158173159173160173161173162173163173164173165173166173167173168173169173170173171173172173173173174173175173176173177173178173179173180173181173182173183173184173185173186173187173188173189173190173191173192173193173194173195173196173197173198173199173200173201173202173203173204173205173206173207173208173209173210173211173212173213173214173215173216173217173218173219173220173221173222173223173224173225173226173227173228173229173230173231173232173233173234173235173236173237173238173239173240173241173242173243173244173245173246173247173248173249173250173251173252173253173254173255173256173257173258173259173260173261173262173263173264173265173266173267173268173269173270173271173272173273173274173275173276173277173278173279173280173281173282173283173284173285173286173287173288173289173290173291173292173293173294173295173296173297173298173299173300173301173302173303173304173305173306173307173308173309173310173311173312173313173314173315173316173317173318173319173320173321173322173323173324173325173326173327173328173329173330173331173332173333173334173335173336173337173338173339173340173341173342173343173344173345173346173347173348173349173350173351173352173353173354173355173356173357173358173359173360173361173362173363173364173365173366173367173368173369173370173371173372173373173374173375173376173377173378173379173380173381173382173383173384173385173386173387173388173389173390173391173392173393173394173395173396173397173398173399173400173401173402173403173404173405173406173407173408173409173410173411173412173413173414173415173416173417173418173419173420173421173422173423173424173425173426173427173428173429173430173431173432173433173434173435173436173437173438173439173440173441173442173443173444173445173446173447173448173449173450173451173452173453173454173455173456173457173458173459173460173461173462173463173464173465173466173467173468173469173470173471173472173473173474173475173476173477173478173479173480173481173482173483173484173485173486173487173488173489173490173491173492173493173494173495173496173497173498173499173500173501173502173503173504173505173506173507173508173509173510173511173512173513173514173515173516173517173518173519173520173521173522173523173524173525173526173527173528173529173530173531173532173533173534173535173536173537173538173539173540173541173542173543173544173545173546173547173548173549173550173551173552173553173554173555173556173557173558173559173560173561173562173563173564173565173566173567173568173569173570173571173572173573173574173575173576173577173578173579173580173581173582173583173584173585173586173587173588173589173590173591173592173593173594173595173596173597173598173599173600173601173602173603173604173605173606173607173608173609173610173611173612173613173614173615173616173617173618173619173620173621173622173623173624173625173626173627173628173629173630173631173632173633173634173635173636173637173638173639173640173641173642173643173644173645173646173647173648173649173650173651173652173653173654173655173656173657173658173659173660173661173662173663173664173665173666173667173668173669173670173671173672173673173674173675173676173677173678173679173680173681173682173683173684173685173686173687173688173689173690173691173692173693173694173695173696173697173698173699173700173701173702173703173704173705173706173707173708173709173710173711173712173713173714173715173716173717173718173719173720173721173722173723173724173725173726173727173728173729173730173731173732173733173734173735173736173737173738173739173740173741173742173743173744173745173746173747173748173749173750173751173752173753173754173755173756173757173758173759173760173761173762173763173764173765173766173767173768173769173770173771173772173773173774173775173776173777173778173779173780173781173782173783173784173785173786173787173788173789173790173791173792173793173794173795173796173797173798173799173800173801173802173803173804173805173806173807173808173809173810173811173812173813173814173815173816173817173818173819173820173821173822173823173824173825173826173827173828173829173830173831173832173833173834173835173836173837173838173839173840173841173842173843173844173845173846173847173848173849173850173851173852173853173854173855173856173857173858173859173860173861173862173863173864173865173866173867173868173869173870173871173872173873173874173875173876173877173878173879173880173881173882173883173884173885173886173887173888173889173890173891173892173893173894173895173896173897173898173899173900173901173902173903173904173905173906173907173908173909173910173911173912173913173914173915173916173917173918173919173920173921173922173923173924173925173926173927173928173929173930173931173932173933173934173935173936173937173938173939173940173941173942173943173944173945173946173947173948173949173950173951173952173953173954173955173956173957173958173959173960173961173962173963173964173965173966173967173968173969173970173971173972173973173974173975173976173977173978173979173980173981173982173983173984173985173986173987173988173989173990173991173992173993173994173995173996173997173998173999174000174001174002174003174004174005174006174007174008174009174010174011174012174013174014174015174016174017174018174019174020174021174022174023174024174025174026174027174028174029174030174031174032174033174034174035174036174037174038174039174040174041174042174043174044174045174046174047174048174049174050174051174052174053174054174055174056174057174058174059174060174061174062174063174064174065174066174067174068174069174070174071174072174073174074174075174076174077174078174079174080174081174082174083174084174085174086174087174088174089174090174091174092174093174094174095174096174097174098174099174100174101174102174103174104174105174106174107174108174109174110174111174112174113174114174115174116174117174118174119174120174121174122174123174124174125174126174127174128174129174130174131174132174133174134174135174136174137174138174139174140174141174142174143174144174145174146174147174148174149174150174151174152174153174154174155174156174157174158174159174160174161174162174163174164174165174166174167174168174169174170174171174172174173174174174175174176174177174178174179174180174181174182174183174184174185174186174187174188174189174190174191174192174193174194174195174196174197174198174199174200174201174202174203174204174205174206174207174208174209174210174211174212174213174214174215174216174217174218174219174220174221174222174223174224174225174226174227174228174229174230174231174232174233174234174235174236174237174238174239174240174241174242174243174244174245174246174247174248174249174250174251174252174253174254174255174256174257174258174259174260174261174262174263174264174265174266174267174268174269174270174271174272174273174274174275174276174277174278174279174280174281174282174283174284174285174286174287174288174289174290174291174292174293174294174295174296174297174298174299174300174301174302174303174304174305174306174307174308174309174310174311174312174313174314174315174316174317174318174319174320174321174322174323174324174325174326174327174328174329174330174331174332174333174334174335174336174337174338174339174340174341174342174343174344174345174346174347174348174349174350174351174352174353174354174355174356174357174358174359174360174361174362174363174364174365174366174367174368174369174370174371174372174373174374174375174376174377174378174379174380174381174382174383174384174385174386174387174388174389174390174391174392174393174394174395174396174397174398174399174400174401174402174403174404174405174406174407174408174409174410174411174412174413174414174415174416174417174418174419174420174421174422174423174424174425174426174427174428174429174430174431174432174433174434174435174436174437174438174439174440174441174442174443174444174445174446174447174448174449174450174451174452174453174454174455174456174457174458174459174460174461174462174463174464174465174466174467174468174469174470174471174472174473174474174475174476174477174478174479174480174481174482174483174484174485174486174487174488174489174490174491174492174493174494174495174496174497174498174499174500174501174502174503174504174505174506174507174508174509174510174511174512174513174514174515174516174517174518174519174520174521174522174523174524174525174526174527174528174529174530174531174532174533174534174535174536174537174538174539174540174541174542174543174544174545174546174547174548174549174550174551174552174553174554174555174556174557174558174559174560174561174562174563174564174565174566174567174568174569174570174571174572174573174574174575174576174577174578174579174580174581174582174583174584174585174586174587174588174589174590174591174592174593174594174595174596174597174598174599174600174601174602174603174604174605174606174607174608174609174610174611174612174613174614174615174616174617174618174619174620174621174622174623174624174625174626174627174628174629174630174631174632174633174634174635174636174637174638174639174640174641174642174643174644174645174646174647174648174649174650174651174652174653174654174655174656174657174658174659174660174661174662174663174664174665174666174667174668174669174670174671174672174673174674174675174676174677174678174679174680174681174682174683174684174685174686174687174688174689174690174691174692174693174694174695174696174697174698174699174700174701174702174703174704174705174706174707174708174709174710174711174712174713174714174715174716174717174718174719174720174721174722174723174724174725174726174727174728174729174730174731174732174733174734174735174736174737174738174739174740174741174742174743174744174745174746174747174748174749174750174751174752174753174754174755174756174757174758174759174760174761174762174763174764174765174766174767174768174769174770174771174772174773174774174775174776174777174778174779174780174781174782174783174784174785174786174787174788174789174790174791174792174793174794174795174796174797174798174799174800174801174802174803174804174805174806174807174808174809174810174811174812174813174814174815174816174817174818174819174820174821174822174823174824174825174826174827174828174829174830174831174832174833174834174835174836174837174838174839174840174841174842174843174844174845174846174847174848174849174850174851174852174853174854174855174856174857174858174859174860174861174862174863174864174865174866174867174868174869174870174871174872174873174874174875174876174877174878174879174880174881174882174883174884174885174886174887174888174889174890174891174892174893174894174895174896174897174898174899174900174901174902174903174904174905174906174907174908174909174910174911174912174913174914174915174916174917174918174919174920174921174922174923174924174925174926174927174928174929174930174931174932174933174934174935174936174937174938174939174940174941174942174943174944174945174946174947174948174949174950174951174952174953174954174955174956174957174958174959174960174961174962174963174964174965174966174967174968174969174970174971174972174973174974174975174976174977174978174979174980174981174982174983174984174985174986174987174988174989174990174991174992174993174994174995174996174997174998174999175000175001175002175003175004175005175006175007175008175009175010175011175012175013175014175015175016175017175018175019175020175021175022175023175024175025175026175027175028175029175030175031175032175033175034175035175036175037175038175039175040175041175042175043175044175045175046175047175048175049175050175051175052175053175054175055175056175057175058175059175060175061175062175063175064175065175066175067175068175069175070175071175072175073175074175075175076175077175078175079175080175081175082175083175084175085175086175087175088175089175090175091175092175093175094175095175096175097175098175099175100175101175102175103175104175105175106175107175108175109175110175111175112175113175114175115175116175117175118175119175120175121175122175123175124175125175126175127175128175129175130175131175132175133175134175135175136175137175138175139175140175141175142175143175144175145175146175147175148175149175150175151175152175153175154175155175156175157175158175159175160175161175162175163175164175165175166175167175168175169175170175171175172175173175174175175175176175177175178175179175180175181175182175183175184175185175186175187175188175189175190175191175192175193175194175195175196175197175198175199175200175201175202175203175204175205175206175207175208175209175210175211175212175213175214175215175216175217175218175219175220175221175222175223175224175225175226175227175228175229175230175231175232175233175234175235175236175237175238175239175240175241175242175243175244175245175246175247175248175249175250175251175252175253175254175255175256175257175258175259175260175261175262175263175264175265175266175267175268175269175270175271175272175273175274175275175276175277175278175279175280175281175282175283175284175285175286175287175288175289175290175291175292175293175294175295175296175297175298175299175300175301175302175303175304175305175306175307175308175309175310175311175312175313175314175315175316175317175318175319175320175321175322175323175324175325175326175327175328175329175330175331175332175333175334175335175336175337175338175339175340175341175342175343175344175345175346175347175348175349175350175351175352175353175354175355175356175357175358175359175360175361175362175363175364175365175366175367175368175369175370175371175372175373175374175375175376175377175378175379175380175381175382175383175384175385175386175387175388175389175390175391175392175393175394175395175396175397175398175399175400175401175402175403175404175405175406175407175408175409175410175411175412175413175414175415175416175417175418175419175420175421175422175423175424175425175426175427175428175429175430175431175432175433175434175435175436175437175438175439175440175441175442175443175444175445175446175447175448175449175450175451175452175453175454175455175456175457175458175459175460175461175462175463175464175465175466175467175468175469175470175471175472175473175474175475175476175477175478175479175480175481175482175483175484175485175486175487175488175489175490175491175492175493175494175495175496175497175498175499175500175501175502175503175504175505175506175507175508175509175510175511175512175513175514175515175516175517175518175519175520175521175522175523175524175525175526175527175528175529175530175531175532175533175534175535175536175537175538175539175540175541175542175543175544175545175546175547175548175549175550175551175552175553175554175555175556175557175558175559175560175561175562175563175564175565175566175567175568175569175570175571175572175573175574175575175576175577175578175579175580175581175582175583175584175585175586175587175588175589175590175591175592175593175594175595175596175597175598175599175600175601175602175603175604175605175606175607175608175609175610175611175612175613175614175615175616175617175618175619175620175621175622175623175624175625175626175627175628175629175630175631175632175633175634175635175636175637175638175639175640175641175642175643175644175645175646175647175648175649175650175651175652175653175654175655175656175657175658175659175660175661175662175663175664175665175666175667175668175669175670175671175672175673175674175675175676175677175678175679175680175681175682175683175684175685175686175687175688175689175690175691175692175693175694175695175696175697175698175699175700175701175702175703175704175705175706175707175708175709175710175711175712175713175714175715175716175717175718175719175720175721175722175723175724175725175726175727175728175729175730175731175732175733175734175735175736175737175738175739175740175741175742175743175744175745175746175747175748175749175750175751175752175753175754175755175756175757175758175759175760175761175762175763175764175765175766175767175768175769175770175771175772175773175774175775175776175777175778175779175780175781175782175783175784175785175786175787175788175789175790175791175792175793175794175795175796175797175798175799175800175801175802175803175804175805175806175807175808175809175810175811175812175813175814175815175816175817175818175819175820175821175822175823175824175825175826175827175828175829175830175831175832175833175834175835175836175837175838175839175840175841175842175843175844175845175846175847175848175849175850175851175852175853175854175855175856175857175858175859175860175861175862175863175864175865175866175867175868175869175870175871175872175873175874175875175876175877175878175879175880175881175882175883175884175885175886175887175888175889175890175891175892175893175894175895175896175897175898175899175900175901175902175903175904175905175906175907175908175909175910175911175912175913175914175915175916175917175918175919175920175921175922175923175924175925175926175927175928175929175930175931175932175933175934175935175936175937175938175939175940175941175942175943175944175945175946175947175948175949175950175951175952175953175954175955175956175957175958175959175960175961175962175963175964175965175966175967175968175969175970175971175972175973175974175975175976175977175978175979175980175981175982175983175984175985175986175987175988175989175990175991175992175993175994175995175996175997175998175999176000176001176002176003176004176005176006176007176008176009176010176011176012176013176014176015176016176017176018176019176020176021176022176023176024176025176026176027176028176029176030176031176032176033176034176035176036176037176038176039176040176041176042176043176044176045176046176047176048176049176050176051176052176053176054176055176056176057176058176059176060176061176062176063176064176065176066176067176068176069176070176071176072176073176074176075176076176077176078176079176080176081176082176083176084176085176086176087176088176089176090176091176092176093176094176095176096176097176098176099176100176101176102176103176104176105176106176107176108176109176110176111176112176113176114176115176116176117176118176119176120176121176122176123176124176125176126176127176128176129176130176131176132176133176134176135176136176137176138176139176140176141176142176143176144176145176146176147176148176149176150176151176152176153176154176155176156176157176158176159176160176161176162176163176164176165176166176167176168176169176170176171176172176173176174176175176176176177176178176179176180176181176182176183176184176185176186176187176188176189176190176191176192176193176194176195176196176197176198176199176200176201176202176203176204176205176206176207176208176209176210176211176212176213176214176215176216176217176218176219176220176221176222176223176224176225176226176227176228176229176230176231176232176233176234176235176236176237176238176239176240176241176242176243176244176245176246176247176248176249176250176251176252176253176254176255176256176257176258176259176260176261176262176263176264176265176266176267176268176269176270176271176272176273176274176275176276176277176278176279176280176281176282176283176284176285176286176287176288176289176290176291176292176293176294176295176296176297176298176299176300176301176302176303176304176305176306176307176308176309176310176311176312176313176314176315176316176317176318176319176320176321176322176323176324176325176326176327176328176329176330176331176332176333176334176335176336176337176338176339176340176341176342176343176344176345176346176347176348176349176350176351176352176353176354176355176356176357176358176359176360176361176362176363176364176365176366176367176368176369176370176371176372176373176374176375176376176377176378176379176380176381176382176383176384176385176386176387176388176389176390176391176392176393176394176395176396176397176398176399176400176401176402176403176404176405176406176407176408176409176410176411176412176413176414176415176416176417176418176419176420176421176422176423176424176425176426176427176428176429176430176431176432176433176434176435176436176437176438176439176440176441176442176443176444176445176446176447176448176449176450176451176452176453176454176455176456176457176458176459176460176461176462176463176464176465176466176467176468176469176470176471176472176473176474176475176476176477176478176479176480176481176482176483176484176485176486176487176488176489176490176491176492176493176494176495176496176497176498176499176500176501176502176503176504176505176506176507176508176509176510176511176512176513176514176515176516176517176518176519176520176521176522176523176524176525176526176527176528176529176530176531176532176533176534176535176536176537176538176539176540176541176542176543176544176545176546176547176548176549176550176551176552176553176554176555176556176557176558176559176560176561176562176563176564176565176566176567176568176569176570176571176572176573176574176575176576176577176578176579176580176581176582176583176584176585176586176587176588176589176590176591176592176593176594176595176596176597176598176599176600176601176602176603176604176605176606176607176608176609176610176611176612176613176614176615176616176617176618176619176620176621176622176623176624176625176626176627176628176629176630176631176632176633176634176635176636176637176638176639176640176641176642176643176644176645176646176647176648176649176650176651176652176653176654176655176656176657176658176659176660176661176662176663176664176665176666176667176668176669176670176671176672176673176674176675176676176677176678176679176680176681176682176683176684176685176686176687176688176689176690176691176692176693176694176695176696176697176698176699176700176701176702176703176704176705176706176707176708176709176710176711176712176713176714176715176716176717176718176719176720176721176722176723176724176725176726176727176728176729176730176731176732176733176734176735176736176737176738176739176740176741176742176743176744176745176746176747176748176749176750176751176752176753176754176755176756176757176758176759176760176761176762176763176764176765176766176767176768176769176770176771176772176773176774176775176776176777176778176779176780176781176782176783176784176785176786176787176788176789176790176791176792176793176794176795176796176797176798176799176800176801176802176803176804176805176806176807176808176809176810176811176812176813176814176815176816176817176818176819176820176821176822176823176824176825176826176827176828176829176830176831176832176833176834176835176836176837176838176839176840176841176842176843176844176845176846176847176848176849176850176851176852176853176854176855176856176857176858176859176860176861176862176863176864176865176866176867176868176869176870176871176872176873176874176875176876176877176878176879176880176881176882176883176884176885176886176887176888176889176890176891176892176893176894176895176896176897176898176899176900176901176902176903176904176905176906176907176908176909176910176911176912176913176914176915176916176917176918176919176920176921176922176923176924176925176926176927176928176929176930176931176932176933176934176935176936176937176938176939176940176941176942176943176944176945176946176947176948176949176950176951176952176953176954176955176956176957176958176959176960176961176962176963176964176965176966176967176968176969176970176971176972176973176974176975176976176977176978176979176980176981176982176983176984176985176986176987176988176989176990176991176992176993176994176995176996176997176998176999177000177001177002177003177004177005177006177007177008177009177010177011177012177013177014177015177016177017177018177019177020177021177022177023177024177025177026177027177028177029177030177031177032177033177034177035177036177037177038177039177040177041177042177043177044177045177046177047177048177049177050177051177052177053177054177055177056177057177058177059177060177061177062177063177064177065177066177067177068177069177070177071177072177073177074177075177076177077177078177079177080177081177082177083177084177085177086177087177088177089177090177091177092177093177094177095177096177097177098177099177100177101177102177103177104177105177106177107177108177109177110177111177112177113177114177115177116177117177118177119177120177121177122177123177124177125177126177127177128177129177130177131177132177133177134177135177136177137177138177139177140177141177142177143177144177145177146177147177148177149177150177151177152177153177154177155177156177157177158177159177160177161177162177163177164177165177166177167177168177169177170177171177172177173177174177175177176177177177178177179177180177181177182177183177184177185177186177187177188177189177190177191177192177193177194177195177196177197177198177199177200177201177202177203177204177205177206177207177208177209177210177211177212177213177214177215177216177217177218177219177220177221177222177223177224177225177226177227177228177229177230177231177232177233177234177235177236177237177238177239177240177241177242177243177244177245177246177247177248177249177250177251177252177253177254177255177256177257177258177259177260177261177262177263177264177265177266177267177268177269177270177271177272177273177274177275177276177277177278177279177280177281177282177283177284177285177286177287177288177289177290177291177292177293177294177295177296177297177298177299177300177301177302177303177304177305177306177307177308177309177310177311177312177313177314177315177316177317177318177319177320177321177322177323177324177325177326177327177328177329177330177331177332177333177334177335177336177337177338177339177340177341177342177343177344177345177346177347177348177349177350177351177352177353177354177355177356177357177358177359177360177361177362177363177364177365177366177367177368177369177370177371177372177373177374177375177376177377177378177379177380177381177382177383177384177385177386177387177388177389177390177391177392177393177394177395177396177397177398177399177400177401177402177403177404177405177406177407177408177409177410177411177412177413177414177415177416177417177418177419177420177421177422177423177424177425177426177427177428177429177430177431177432177433177434177435177436177437177438177439177440177441177442177443177444177445177446177447177448177449177450177451177452177453177454177455177456177457177458177459177460177461177462177463177464177465177466177467177468177469177470177471177472177473177474177475177476177477177478177479177480177481177482177483177484177485177486177487177488177489177490177491177492177493177494177495177496177497177498177499177500177501177502177503177504177505177506177507177508177509177510177511177512177513177514177515177516177517177518177519177520177521177522177523177524177525177526177527177528177529177530177531177532177533177534177535177536177537177538177539177540177541177542177543177544177545177546177547177548177549177550177551177552177553177554177555177556177557177558177559177560177561177562177563177564177565177566177567177568177569177570177571177572177573177574177575177576177577177578177579177580177581177582177583177584177585177586177587177588177589177590177591177592177593177594177595177596177597177598177599177600177601177602177603177604177605177606177607177608177609177610177611177612177613177614177615177616177617177618177619177620177621177622177623177624177625177626177627177628177629177630177631177632177633177634177635177636177637177638177639177640177641177642177643177644177645177646177647177648177649177650177651177652177653177654177655177656177657177658177659177660177661177662177663177664177665177666177667177668177669177670177671177672177673177674177675177676177677177678177679177680177681177682177683177684177685177686177687177688177689177690177691177692177693177694177695177696177697177698177699177700177701177702177703177704177705177706177707177708177709177710177711177712177713177714177715177716177717177718177719177720177721177722177723177724177725177726177727177728177729177730177731177732177733177734177735177736177737177738177739177740177741177742177743177744177745177746177747177748177749177750177751177752177753177754177755177756177757177758177759177760177761177762177763177764177765177766177767177768177769177770177771177772177773177774177775177776177777177778177779177780177781177782177783177784177785177786177787177788177789177790177791177792177793177794177795177796177797177798177799177800177801177802177803177804177805177806177807177808177809177810177811177812177813177814177815177816177817177818177819177820177821177822177823177824177825177826177827177828177829177830177831177832177833177834177835177836177837177838177839177840177841177842177843177844177845177846177847177848177849177850177851177852177853177854177855177856177857177858177859177860177861177862177863177864177865177866177867177868177869177870177871177872177873177874177875177876177877177878177879177880177881177882177883177884177885177886177887177888177889177890177891177892177893177894177895177896177897177898177899177900177901177902177903177904177905177906177907177908177909177910177911177912177913177914177915177916177917177918177919177920177921177922177923177924177925177926177927177928177929177930177931177932177933177934177935177936177937177938177939177940177941177942177943177944177945177946177947177948177949177950177951177952177953177954177955177956177957177958177959177960177961177962177963177964177965177966177967177968177969177970177971177972177973177974177975177976177977177978177979177980177981177982177983177984177985177986177987177988177989177990177991177992177993177994177995177996177997177998177999178000178001178002178003178004178005178006178007178008178009178010178011178012178013178014178015178016178017178018178019178020178021178022178023178024178025178026178027178028178029178030178031178032178033178034178035178036178037178038178039178040178041178042178043178044178045178046178047178048178049178050178051178052178053178054178055178056178057178058178059178060178061178062178063178064178065178066178067178068178069178070178071178072178073178074178075178076178077178078178079178080178081178082178083178084178085178086178087178088178089178090178091178092178093178094178095178096178097178098178099178100178101178102178103178104178105178106178107178108178109178110178111178112178113178114178115178116178117178118178119178120178121178122178123178124178125178126178127178128178129178130178131178132178133178134178135178136178137178138178139178140178141178142178143178144178145178146178147178148178149178150178151178152178153178154178155178156178157178158178159178160178161178162178163178164178165178166178167178168178169178170178171178172178173178174178175178176178177178178178179178180178181178182178183178184178185178186178187178188178189178190178191178192178193178194178195178196178197178198178199178200178201178202178203178204178205178206178207178208178209178210178211178212178213178214178215178216178217178218178219178220178221178222178223178224178225178226178227178228178229178230178231178232178233178234178235178236178237178238178239178240178241178242178243178244178245178246178247178248178249178250178251178252178253178254178255178256178257178258178259178260178261178262178263178264178265178266178267178268178269178270178271178272178273178274178275178276178277178278178279178280178281178282178283178284178285178286178287178288178289178290178291178292178293178294178295178296178297178298178299178300178301178302178303178304178305178306178307178308178309178310178311178312178313178314178315178316178317178318178319178320178321178322178323178324178325178326178327178328178329178330178331178332178333178334178335178336178337178338178339178340178341178342178343178344178345178346178347178348178349178350178351178352178353178354178355178356178357178358178359178360178361178362178363178364178365178366178367178368178369178370178371178372178373178374178375178376178377178378178379178380178381178382178383178384178385178386178387178388178389178390178391178392178393178394178395178396178397178398178399178400178401178402178403178404178405178406178407178408178409178410178411178412178413178414178415178416178417178418178419178420178421178422178423178424178425178426178427178428178429178430178431178432178433178434178435178436178437178438178439178440178441178442178443178444178445178446178447178448178449178450178451178452178453178454178455178456178457178458178459178460178461178462178463178464178465178466178467178468178469178470178471178472178473178474178475178476178477178478178479178480178481178482178483178484178485178486178487178488178489178490178491178492178493178494178495178496178497178498178499178500178501178502178503178504178505178506178507178508178509178510178511178512178513178514178515178516178517178518178519178520178521178522178523178524178525178526178527178528178529178530178531178532178533178534178535178536178537178538178539178540178541178542178543178544178545178546178547178548178549178550178551178552178553178554178555178556178557178558178559178560178561178562178563178564178565178566178567178568178569178570178571178572178573178574178575178576178577178578178579178580178581178582178583178584178585178586178587178588178589178590178591178592178593178594178595178596178597178598178599178600178601178602178603178604178605178606178607178608178609178610178611178612178613178614178615178616178617178618178619178620178621178622178623178624178625178626178627178628178629178630178631178632178633178634178635178636178637178638178639178640178641178642178643178644178645178646178647178648178649178650178651178652178653178654178655178656178657178658178659178660178661178662178663178664178665178666178667178668178669178670178671178672178673178674178675178676178677178678178679178680178681178682178683178684178685178686178687178688178689178690178691178692178693178694178695178696178697178698178699178700178701178702178703178704178705178706178707178708178709178710178711178712178713178714178715178716178717178718178719178720178721178722178723178724178725178726178727178728178729178730178731178732178733178734178735178736178737178738178739178740178741178742178743178744178745178746178747178748178749178750178751178752178753178754178755178756178757178758178759178760178761178762178763178764178765178766178767178768178769178770178771178772178773178774178775178776178777178778178779178780178781178782178783178784178785178786178787178788178789178790178791178792178793178794178795178796178797178798178799178800178801178802178803178804178805178806178807178808178809178810178811178812178813178814178815178816178817178818178819178820178821178822178823178824178825178826178827178828178829178830178831178832178833178834178835178836178837178838178839178840178841178842178843178844178845178846178847178848178849178850178851178852178853178854178855178856178857178858178859178860178861178862178863178864178865178866178867178868178869178870178871178872178873178874178875178876178877178878178879178880178881178882178883178884178885178886178887178888178889178890178891178892178893178894178895178896178897178898178899178900178901178902178903178904178905178906178907178908178909178910178911178912178913178914178915178916178917178918178919178920178921178922178923178924178925178926178927178928178929178930178931178932178933178934178935178936178937178938178939178940178941178942178943178944178945178946178947178948178949178950178951178952178953178954178955178956178957178958178959178960178961178962178963178964178965178966178967178968178969178970178971178972178973178974178975178976178977178978178979178980178981178982178983178984178985178986178987178988178989178990178991178992178993178994178995178996178997178998178999179000179001179002179003179004179005179006179007179008179009179010179011179012179013179014179015179016179017179018179019179020179021179022179023179024179025179026179027179028179029179030179031179032179033179034179035179036179037179038179039179040179041179042179043179044179045179046179047179048179049179050179051179052179053179054179055179056179057179058179059179060179061179062179063179064179065179066179067179068179069179070179071179072179073179074179075179076179077179078179079179080179081179082179083179084179085179086179087179088179089179090179091179092179093179094179095179096179097179098179099179100179101179102179103179104179105179106179107179108179109179110179111179112179113179114179115179116179117179118179119179120179121179122179123179124179125179126179127179128179129179130179131179132179133179134179135179136179137179138179139179140179141179142179143179144179145179146179147179148179149179150179151179152179153179154179155179156179157179158179159179160179161179162179163179164179165179166179167179168179169179170179171179172179173179174179175179176179177179178179179179180179181179182179183179184179185179186179187179188179189179190179191179192179193179194179195179196179197179198179199179200179201179202179203179204179205179206179207179208179209179210179211179212179213179214179215179216179217179218179219179220179221179222179223179224179225179226179227179228179229179230179231179232179233179234179235179236179237179238179239179240179241179242179243179244179245179246179247179248179249179250179251179252179253179254179255179256179257179258179259179260179261179262179263179264179265179266179267179268179269179270179271179272179273179274179275179276179277179278179279179280179281179282179283179284179285179286179287179288179289179290179291179292179293179294179295179296179297179298179299179300179301179302179303179304179305179306179307179308179309179310179311179312179313179314179315179316179317179318179319179320179321179322179323179324179325179326179327179328179329179330179331179332179333179334179335179336179337179338179339179340179341179342179343179344179345179346179347179348179349179350179351179352179353179354179355179356179357179358179359179360179361179362179363179364179365179366179367179368179369179370179371179372179373179374179375179376179377179378179379179380179381179382179383179384179385179386179387179388179389179390179391179392179393179394179395179396179397179398179399179400179401179402179403179404179405179406179407179408179409179410179411179412179413179414179415179416179417179418179419179420179421179422179423179424179425179426179427179428179429179430179431179432179433179434179435179436179437179438179439179440179441179442179443179444179445179446179447179448179449179450179451179452179453179454179455179456179457179458179459179460179461179462179463179464179465179466179467179468179469179470179471179472179473179474179475179476179477179478179479179480179481179482179483179484179485179486179487179488179489179490179491179492179493179494179495179496179497179498179499179500179501179502179503179504179505179506179507179508179509179510179511179512179513179514179515179516179517179518179519179520179521179522179523179524179525179526179527179528179529179530179531179532179533179534179535179536179537179538179539179540179541179542179543179544179545179546179547179548179549179550179551179552179553179554179555179556179557179558179559179560179561179562179563179564179565179566179567179568179569179570179571179572179573179574179575179576179577179578179579179580179581179582179583179584179585179586179587179588179589179590179591179592179593179594179595179596179597179598179599179600179601179602179603179604179605179606179607179608179609179610179611179612179613179614179615179616179617179618179619179620179621179622179623179624179625179626179627179628179629179630179631179632179633179634179635179636179637179638179639179640179641179642179643179644179645179646179647179648179649179650179651179652179653179654179655179656179657179658179659179660179661179662179663179664179665179666179667179668179669179670179671179672179673179674179675179676179677179678179679179680179681179682179683179684179685179686179687179688179689179690179691179692179693179694179695179696179697179698179699179700179701179702179703179704179705179706179707179708179709179710179711179712179713179714179715179716179717179718179719179720179721179722179723179724179725179726179727179728179729179730179731179732179733179734179735179736179737179738179739179740179741179742179743179744179745179746179747179748179749179750179751179752179753179754179755179756179757179758179759179760179761179762179763179764179765179766179767179768179769179770179771179772179773179774179775179776179777179778179779179780179781179782179783179784179785179786179787179788179789179790179791179792179793179794179795179796179797179798179799179800179801179802179803179804179805179806179807179808179809179810179811179812179813179814179815179816179817179818179819179820179821179822179823179824179825179826179827179828179829179830179831179832179833179834179835179836179837179838179839179840179841179842179843179844179845179846179847179848179849179850179851179852179853179854179855179856179857179858179859179860179861179862179863179864179865179866179867179868179869179870179871179872179873179874179875179876179877179878179879179880179881179882179883179884179885179886179887179888179889179890179891179892179893179894179895179896179897179898179899179900179901179902179903179904179905179906179907179908179909179910179911179912179913179914179915179916179917179918179919179920179921179922179923179924179925179926179927179928179929179930179931179932179933179934179935179936179937179938179939179940179941179942179943179944179945179946179947179948179949179950179951179952179953179954179955179956179957179958179959179960179961179962179963179964179965179966179967179968179969179970179971179972179973179974179975179976179977179978179979179980179981179982179983179984179985179986179987179988179989179990179991179992179993179994179995179996179997179998179999180000180001180002180003180004180005180006180007180008180009180010180011180012180013180014180015180016180017180018180019180020180021180022180023180024180025180026180027180028180029180030180031180032180033180034180035180036180037180038180039180040180041180042180043180044180045180046180047180048180049180050180051180052180053180054180055180056180057180058180059180060180061180062180063180064180065180066180067180068180069180070180071180072180073180074180075180076180077180078180079180080180081180082180083180084180085180086180087180088180089180090180091180092180093180094180095180096180097180098180099180100180101180102180103180104180105180106180107180108180109180110180111180112180113180114180115180116180117180118180119180120180121180122180123180124180125180126180127180128180129180130180131180132180133180134180135180136180137180138180139180140180141180142180143180144180145180146180147180148180149180150180151180152180153180154180155180156180157180158180159180160180161180162180163180164180165180166180167180168180169180170180171180172180173180174180175180176180177180178180179180180180181180182180183180184180185180186180187180188180189180190180191180192180193180194180195180196180197180198180199180200180201180202180203180204180205180206180207180208180209180210180211180212180213180214180215180216180217180218180219180220180221180222180223180224180225180226180227180228180229180230180231180232180233180234180235180236180237180238180239180240180241180242180243180244180245180246180247180248180249180250180251180252180253180254180255180256180257180258180259180260180261180262180263180264180265180266180267180268180269180270180271180272180273180274180275180276180277180278180279180280180281180282180283180284180285180286180287180288180289180290180291180292180293180294180295180296180297180298180299180300180301180302180303180304180305180306180307180308180309180310180311180312180313180314180315180316180317180318180319180320180321180322180323180324180325180326180327180328180329180330180331180332180333180334180335180336180337180338180339180340180341180342180343180344180345180346180347180348180349180350180351180352180353180354180355180356180357180358180359180360180361180362180363180364180365180366180367180368180369180370180371180372180373180374180375180376180377180378180379180380180381180382180383180384180385180386180387180388180389180390180391180392180393180394180395180396180397180398180399180400180401180402180403180404180405180406180407180408180409180410180411180412180413180414180415180416180417180418180419180420180421180422180423180424180425180426180427180428180429180430180431180432180433180434180435180436180437180438180439180440180441180442180443180444180445180446180447180448180449180450180451180452180453180454180455180456180457180458180459180460180461180462180463180464180465180466180467180468180469180470180471180472180473180474180475180476180477180478180479180480180481180482180483180484180485180486180487180488180489180490180491180492180493180494180495180496180497180498180499180500180501180502180503180504180505180506180507180508180509180510180511180512180513180514180515180516180517180518180519180520180521180522180523180524180525180526180527180528180529180530180531180532180533180534180535180536180537180538180539180540180541180542180543180544180545180546180547180548180549180550180551180552180553180554180555180556180557180558180559180560180561180562180563180564180565180566180567180568180569180570180571180572180573180574180575180576180577180578180579180580180581180582180583180584180585180586180587180588180589180590180591180592180593180594180595180596180597180598180599180600180601180602180603180604180605180606180607180608180609180610180611180612180613180614180615180616180617180618180619180620180621180622180623180624180625180626180627180628180629180630180631180632180633180634180635180636180637180638180639180640180641180642180643180644180645180646180647180648180649180650180651180652180653180654180655180656180657180658180659180660180661180662180663180664180665180666180667180668180669180670180671180672180673180674180675180676180677180678180679180680180681180682180683180684180685180686180687180688180689180690180691180692180693180694180695180696180697180698180699180700180701180702180703180704180705180706180707180708180709180710180711180712180713180714180715180716180717180718180719180720180721180722180723180724180725180726180727180728180729180730180731180732180733180734180735180736180737180738180739180740180741180742180743180744180745180746180747180748180749180750180751180752180753180754180755180756180757180758180759180760180761180762180763180764180765180766180767180768180769180770180771180772180773180774180775180776180777180778180779180780180781180782180783180784180785180786180787180788180789180790180791180792180793180794180795180796180797180798180799180800180801180802180803180804180805180806180807180808180809180810180811180812180813180814180815180816180817180818180819180820180821180822180823180824180825180826180827180828180829180830180831180832180833180834180835180836180837180838180839180840180841180842180843180844180845180846180847180848180849180850180851180852180853180854180855180856180857180858180859180860180861180862180863180864180865180866180867180868180869180870180871180872180873180874180875180876180877180878180879180880180881180882180883180884180885180886180887180888180889180890180891180892180893180894180895180896180897180898180899180900180901180902180903180904180905180906180907180908180909180910180911180912180913180914180915180916180917180918180919180920180921180922180923180924180925180926180927180928180929180930180931180932180933180934180935180936180937180938180939180940180941180942180943180944180945180946180947180948180949180950180951180952180953180954180955180956180957180958180959180960180961180962180963180964180965180966180967180968180969180970180971180972180973180974180975180976180977180978180979180980180981180982180983180984180985180986180987180988180989180990180991180992180993180994180995180996180997180998180999181000181001181002181003181004181005181006181007181008181009181010181011181012181013181014181015181016181017181018181019181020181021181022181023181024181025181026181027181028181029181030181031181032181033181034181035181036181037181038181039181040181041181042181043181044181045181046181047181048181049181050181051181052181053181054181055181056181057181058181059181060181061181062181063181064181065181066181067181068181069181070181071181072181073181074181075181076181077181078181079181080181081181082181083181084181085181086181087181088181089181090181091181092181093181094181095181096181097181098181099181100181101181102181103181104181105181106181107181108181109181110181111181112181113181114181115181116181117181118181119181120181121181122181123181124181125181126181127181128181129181130181131181132181133181134181135181136181137181138181139181140181141181142181143181144181145181146181147181148181149181150181151181152181153181154181155181156181157181158181159181160181161181162181163181164181165181166181167181168181169181170181171181172181173181174181175181176181177181178181179181180181181181182181183181184181185181186181187181188181189181190181191181192181193181194181195181196181197181198181199181200181201181202181203181204181205181206181207181208181209181210181211181212181213181214181215181216181217181218181219181220181221181222181223181224181225181226181227181228181229181230181231181232181233181234181235181236181237181238181239181240181241181242181243181244181245181246181247181248181249181250181251181252181253181254181255181256181257181258181259181260181261181262181263181264181265181266181267181268181269181270181271181272181273181274181275181276181277181278181279181280181281181282181283181284181285181286181287181288181289181290181291181292181293181294181295181296181297181298181299181300181301181302181303181304181305181306181307181308181309181310181311181312181313181314181315181316181317181318181319181320181321181322181323181324181325181326181327181328181329181330181331181332181333181334181335181336181337181338181339181340181341181342181343181344181345181346181347181348181349181350181351181352181353181354181355181356181357181358181359181360181361181362181363181364181365181366181367181368181369181370181371181372181373181374181375181376181377181378181379181380181381181382181383181384181385181386181387181388181389181390181391181392181393181394181395181396181397181398181399181400181401181402181403181404181405181406181407181408181409181410181411181412181413181414181415181416181417181418181419181420181421181422181423181424181425181426181427181428181429181430181431181432181433181434181435181436181437181438181439181440181441181442181443181444181445181446181447181448181449181450181451181452181453181454181455181456181457181458181459181460181461181462181463181464181465181466181467181468181469181470181471181472181473181474181475181476181477181478181479181480181481181482181483181484181485181486181487181488181489181490181491181492181493181494181495181496181497181498181499181500181501181502181503181504181505181506181507181508181509181510181511181512181513181514181515181516181517181518181519181520181521181522181523181524181525181526181527181528181529181530181531181532181533181534181535181536181537181538181539181540181541181542181543181544181545181546181547181548181549181550181551181552181553181554181555181556181557181558181559181560181561181562181563181564181565181566181567181568181569181570181571181572181573181574181575181576181577181578181579181580181581181582181583181584181585181586181587181588181589181590181591181592181593181594181595181596181597181598181599181600181601181602181603181604181605181606181607181608181609181610181611181612181613181614181615181616181617181618181619181620181621181622181623181624181625181626181627181628181629181630181631181632181633181634181635181636181637181638181639181640181641181642181643181644181645181646181647181648181649181650181651181652181653181654181655181656181657181658181659181660181661181662181663181664181665181666181667181668181669181670181671181672181673181674181675181676181677181678181679181680181681181682181683181684181685181686181687181688181689181690181691181692181693181694181695181696181697181698181699181700181701181702181703181704181705181706181707181708181709181710181711181712181713181714181715181716181717181718181719181720181721181722181723181724181725181726181727181728181729181730181731181732181733181734181735181736181737181738181739181740181741181742181743181744181745181746181747181748181749181750181751181752181753181754181755181756181757181758181759181760181761181762181763181764181765181766181767181768181769181770181771181772181773181774181775181776181777181778181779181780181781181782181783181784181785181786181787181788181789181790181791181792181793181794181795181796181797181798181799181800181801181802181803181804181805181806181807181808181809181810181811181812181813181814181815181816181817181818181819181820181821181822181823181824181825181826181827181828181829181830181831181832181833181834181835181836181837181838181839181840181841181842181843181844181845181846181847181848181849181850181851181852181853181854181855181856181857181858181859181860181861181862181863181864181865181866181867181868181869181870181871181872181873181874181875181876181877181878181879181880181881181882181883181884181885181886181887181888181889181890181891181892181893181894181895181896181897181898181899181900181901181902181903181904181905181906181907181908181909181910181911181912181913181914181915181916181917181918181919181920181921181922181923181924181925181926181927181928181929181930181931181932181933181934181935181936181937181938181939181940181941181942181943181944181945181946181947181948181949181950181951181952181953181954181955181956181957181958181959181960181961181962181963181964181965181966181967181968181969181970181971181972181973181974181975181976181977181978181979181980181981181982181983181984181985181986181987181988181989181990181991181992181993181994181995181996181997181998181999182000182001182002182003182004182005182006182007182008182009182010182011182012182013182014182015182016182017182018182019182020182021182022182023182024182025182026182027182028182029182030182031182032182033182034182035182036182037182038182039182040182041182042182043182044182045182046182047182048182049182050182051182052182053182054182055182056182057182058182059182060182061182062182063182064182065182066182067182068182069182070182071182072182073182074182075182076182077182078182079182080182081182082182083182084182085182086182087182088182089182090182091182092182093182094182095182096182097182098182099182100182101182102182103182104182105182106182107182108182109182110182111182112182113182114182115182116182117182118182119182120182121182122182123182124182125182126182127182128182129182130182131182132182133182134182135182136182137182138182139182140182141182142182143182144182145182146182147182148182149182150182151182152182153182154182155182156182157182158182159182160182161182162182163182164182165182166182167182168182169182170182171182172182173182174182175182176182177182178182179182180182181182182182183182184182185182186182187182188182189182190182191182192182193182194182195182196182197182198182199182200182201182202182203182204182205182206182207182208182209182210182211182212182213182214182215182216182217182218182219182220182221182222182223182224182225182226182227182228182229182230182231182232182233182234182235182236182237182238182239182240182241182242182243182244182245182246182247182248182249182250182251182252182253182254182255182256182257182258182259182260182261182262182263182264182265182266182267182268182269182270182271182272182273182274182275182276182277182278182279182280182281182282182283182284182285182286182287182288182289182290182291182292182293182294182295182296182297182298182299182300182301182302182303182304182305182306182307182308182309182310182311182312182313182314182315182316182317182318182319182320182321182322182323182324182325182326182327182328182329182330182331182332182333182334182335182336182337182338182339182340182341182342182343182344182345182346182347182348182349182350182351182352182353182354182355182356182357182358182359182360182361182362182363182364182365182366182367182368182369182370182371182372182373182374182375182376182377182378182379182380182381182382182383182384182385182386182387182388182389182390182391182392182393182394182395182396182397182398182399182400182401182402182403182404182405182406182407182408182409182410182411182412182413182414182415182416182417182418182419182420182421182422182423182424182425182426182427182428182429182430182431182432182433182434182435182436182437182438182439182440182441182442182443182444182445182446182447182448182449182450182451182452182453182454182455182456182457182458182459182460182461182462182463182464182465182466182467182468182469182470182471182472182473182474182475182476182477182478182479182480182481182482182483182484182485182486182487182488182489182490182491182492182493182494182495182496182497182498182499182500182501182502182503182504182505182506182507182508182509182510182511182512182513182514182515182516182517182518182519182520182521182522182523182524182525182526182527182528182529182530182531182532182533182534182535182536182537182538182539182540182541182542182543182544182545182546182547182548182549182550182551182552182553182554182555182556182557182558182559182560182561182562182563182564182565182566182567182568182569182570182571182572182573182574182575182576182577182578182579182580182581182582182583182584182585182586182587182588182589182590182591182592182593182594182595182596182597182598182599182600182601182602182603182604182605182606182607182608182609182610182611182612182613182614182615182616182617182618182619182620182621182622182623182624182625182626182627182628182629182630182631182632182633182634182635182636182637182638182639182640182641182642182643182644182645182646182647182648182649182650182651182652182653182654182655182656182657182658182659182660182661182662182663182664182665182666182667182668182669182670182671182672182673182674182675182676182677182678182679182680182681182682182683182684182685182686182687182688182689182690182691182692182693182694182695182696182697182698182699182700182701182702182703182704182705182706182707182708182709182710182711182712182713182714182715182716182717182718182719182720182721182722182723182724182725182726182727182728182729182730182731182732182733182734182735182736182737182738182739182740182741182742182743182744182745182746182747182748182749182750182751182752182753182754182755182756182757182758182759182760182761182762182763182764182765182766182767182768182769182770182771182772182773182774182775182776182777182778182779182780182781182782182783182784182785182786182787182788182789182790182791182792182793182794182795182796182797182798182799182800182801182802182803182804182805182806182807182808182809182810182811182812182813182814182815182816182817182818182819182820182821182822182823182824182825182826182827182828182829182830182831182832182833182834182835182836182837182838182839182840182841182842182843182844182845182846182847182848182849182850182851182852182853182854182855182856182857182858182859182860182861182862182863182864182865182866182867182868182869182870182871182872182873182874182875182876182877182878182879182880182881182882182883182884182885182886182887182888182889182890182891182892182893182894182895182896182897182898182899182900182901182902182903182904182905182906182907182908182909182910182911182912182913182914182915182916182917182918182919182920182921182922182923182924182925182926182927182928182929182930182931182932182933182934182935182936182937182938182939182940182941182942182943182944182945182946182947182948182949182950182951182952182953182954182955182956182957182958182959182960182961182962182963182964182965182966182967182968182969182970182971182972182973182974182975182976182977182978182979182980182981182982182983182984182985182986182987182988182989182990182991182992182993182994182995182996182997182998182999183000183001183002183003183004183005183006183007183008183009183010183011183012183013183014183015183016183017183018183019183020183021183022183023183024183025183026183027183028183029183030183031183032183033183034183035183036183037183038183039183040183041183042183043183044183045183046183047183048183049183050183051183052183053183054183055183056183057183058183059183060183061183062183063183064183065183066183067183068183069183070183071183072183073183074183075183076183077183078183079183080183081183082183083183084183085183086183087183088183089183090183091183092183093183094183095183096183097183098183099183100183101183102183103183104183105183106183107183108183109183110183111183112183113183114183115183116183117183118183119183120183121183122183123183124183125183126183127183128183129183130183131183132183133183134183135183136183137183138183139183140183141183142183143183144183145183146183147183148183149183150183151183152183153183154183155183156183157183158183159183160183161183162183163183164183165183166183167183168183169183170183171183172183173183174183175183176183177183178183179183180183181183182183183183184183185183186183187183188183189183190183191183192183193183194183195183196183197183198183199183200183201183202183203183204183205183206183207183208183209183210183211183212183213183214183215183216183217183218183219183220183221183222183223183224183225183226183227183228183229183230183231183232183233183234183235183236183237183238183239183240183241183242183243183244183245183246183247183248183249183250183251183252183253183254183255183256183257183258183259183260183261183262183263183264183265183266183267183268183269183270183271183272183273183274183275183276183277183278183279183280183281183282183283183284183285183286183287183288183289183290183291183292183293183294183295183296183297183298183299183300183301183302183303183304183305183306183307183308183309183310183311183312183313183314183315183316183317183318183319183320183321183322183323183324183325183326183327183328183329183330183331183332183333183334183335183336183337183338183339183340183341183342183343183344183345183346183347183348183349183350183351183352183353183354183355183356183357183358183359183360183361183362183363183364183365183366183367183368183369183370183371183372183373183374183375183376183377183378183379183380183381183382183383183384183385183386183387183388183389183390183391183392183393183394183395183396183397183398183399183400183401183402183403183404183405183406183407183408183409183410183411183412183413183414183415183416183417183418183419183420183421183422183423183424183425183426183427183428183429183430183431183432183433183434183435183436183437183438183439183440183441183442183443183444183445183446183447183448183449183450183451183452183453183454183455183456183457183458183459183460183461183462183463183464183465183466183467183468183469183470183471183472183473183474183475183476183477183478183479183480183481183482183483183484183485183486183487183488183489183490183491183492183493183494183495183496183497183498183499183500183501183502183503183504183505183506183507183508183509183510183511183512183513183514183515183516183517183518183519183520183521183522183523183524183525183526183527183528183529183530183531183532183533183534183535183536183537183538183539183540183541183542183543183544183545183546183547183548183549183550183551183552183553183554183555183556183557183558183559183560183561183562183563183564183565183566183567183568183569183570183571183572183573183574183575183576183577183578183579183580183581183582183583183584183585183586183587183588183589183590183591183592183593183594183595183596183597183598183599183600183601183602183603183604183605183606183607183608183609183610183611183612183613183614183615183616183617183618183619183620183621183622183623183624183625183626183627183628183629183630183631183632183633183634183635183636183637183638183639183640183641183642183643183644183645183646183647183648183649183650183651183652183653183654183655183656183657183658183659183660183661183662183663183664183665183666183667183668183669183670183671183672183673183674183675183676183677183678183679183680183681183682183683183684183685183686183687183688183689183690183691183692183693183694183695183696183697183698183699183700183701183702183703183704183705183706183707183708183709183710183711183712183713183714183715183716183717183718183719183720183721183722183723183724183725183726183727183728183729183730183731183732183733183734183735183736183737183738183739183740183741183742183743183744183745183746183747183748183749183750183751183752183753183754183755183756183757183758183759183760183761183762183763183764183765183766183767183768183769183770183771183772183773183774183775183776183777183778183779183780183781183782183783183784183785183786183787183788183789183790183791183792183793183794183795183796183797183798183799183800183801183802183803183804183805183806183807183808183809183810183811183812183813183814183815183816183817183818183819183820183821183822183823183824183825183826183827183828183829183830183831183832183833183834183835183836183837183838183839183840183841183842183843183844183845183846183847183848183849183850183851183852183853183854183855183856183857183858183859183860183861183862183863183864183865183866183867183868183869183870183871183872183873183874183875183876183877183878183879183880183881183882183883183884183885183886183887183888183889183890183891183892183893183894183895183896183897183898183899183900183901183902183903183904183905183906183907183908183909183910183911183912183913183914183915183916183917183918183919183920183921183922183923183924183925183926183927183928183929183930183931183932183933183934183935183936183937183938183939183940183941183942183943183944183945183946183947183948183949183950183951183952183953183954183955183956183957183958183959183960183961183962183963183964183965183966183967183968183969183970183971183972183973183974183975183976183977183978183979183980183981183982183983183984183985183986183987183988183989183990183991183992183993183994183995183996183997183998183999184000184001184002184003184004184005184006184007184008184009184010184011184012184013184014184015184016184017184018184019184020184021184022184023184024184025184026184027184028184029184030184031184032184033184034184035184036184037184038184039184040184041184042184043184044184045184046184047184048184049184050184051184052184053184054184055184056184057184058184059184060184061184062184063184064184065184066184067184068184069184070184071184072184073184074184075184076184077184078184079184080184081184082184083184084184085184086184087184088184089184090184091184092184093184094184095184096184097184098184099184100184101184102184103184104184105184106184107184108184109184110184111184112184113184114184115184116184117184118184119184120184121184122184123184124184125184126184127184128184129184130184131184132184133184134184135184136184137184138184139184140184141184142184143184144184145184146184147184148184149184150184151184152184153184154184155184156184157184158184159184160184161184162184163184164184165184166184167184168184169184170184171184172184173184174184175184176184177184178184179184180184181184182184183184184184185184186184187184188184189184190184191184192184193184194184195184196184197184198184199184200184201184202184203184204184205184206184207184208184209184210184211184212184213184214184215184216184217184218184219184220184221184222184223184224184225184226184227184228184229184230184231184232184233184234184235184236184237184238184239184240184241184242184243184244184245184246184247184248184249184250184251184252184253184254184255184256184257184258184259184260184261184262184263184264184265184266184267184268184269184270184271184272184273184274184275184276184277184278184279184280184281184282184283184284184285184286184287184288184289184290184291184292184293184294184295184296184297184298184299184300184301184302184303184304184305184306184307184308184309184310184311184312184313184314184315184316184317184318184319184320184321184322184323184324184325184326184327184328184329184330184331184332184333184334184335184336184337184338184339184340184341184342184343184344184345184346184347184348184349184350184351184352184353184354184355184356184357184358184359184360184361184362184363184364184365184366184367184368184369184370184371184372184373184374184375184376184377184378184379184380184381184382184383184384184385184386184387184388184389184390184391184392184393184394184395184396184397184398184399184400184401184402184403184404184405184406184407184408184409184410184411184412184413184414184415184416184417184418184419184420184421184422184423184424184425184426184427184428184429184430184431184432184433184434184435184436184437184438184439184440184441184442184443184444184445184446184447184448184449184450184451184452184453184454184455184456184457184458184459184460184461184462184463184464184465184466184467184468184469184470184471184472184473184474184475184476184477184478184479184480184481184482184483184484184485184486184487184488184489184490184491184492184493184494184495184496184497184498184499184500184501184502184503184504184505184506184507184508184509184510184511184512184513184514184515184516184517184518184519184520184521184522184523184524184525184526184527184528184529184530184531184532184533184534184535184536184537184538184539184540184541184542184543184544184545184546184547184548184549184550184551184552184553184554184555184556184557184558184559184560184561184562184563184564184565184566184567184568184569184570184571184572184573184574184575184576184577184578184579184580184581184582184583184584184585184586184587184588184589184590184591184592184593184594184595184596184597184598184599184600184601184602184603184604184605184606184607184608184609184610184611184612184613184614184615184616184617184618184619184620184621184622184623184624184625184626184627184628184629184630184631184632184633184634184635184636184637184638184639184640184641184642184643184644184645184646184647184648184649184650184651184652184653184654184655184656184657184658184659184660184661184662184663184664184665184666184667184668184669184670184671184672184673184674184675184676184677184678184679184680184681184682184683184684184685184686184687184688184689184690184691184692184693184694184695184696184697184698184699184700184701184702184703184704184705184706184707184708184709184710184711184712184713184714184715184716184717184718184719184720184721184722184723184724184725184726184727184728184729184730184731184732184733184734184735184736184737184738184739184740184741184742184743184744184745184746184747184748184749184750184751184752184753184754184755184756184757184758184759184760184761184762184763184764184765184766184767184768184769184770184771184772184773184774184775184776184777184778184779184780184781184782184783184784184785184786184787184788184789184790184791184792184793184794184795184796184797184798184799184800184801184802184803184804184805184806184807184808184809184810184811184812184813184814184815184816184817184818184819184820184821184822184823184824184825184826184827184828184829184830184831184832184833184834184835184836184837184838184839184840184841184842184843184844184845184846184847184848184849184850184851184852184853184854184855184856184857184858184859184860184861184862184863184864184865184866184867184868184869184870184871184872184873184874184875184876184877184878184879184880184881184882184883184884184885184886184887184888184889184890184891184892184893184894184895184896184897184898184899184900184901184902184903184904184905184906184907184908184909184910184911184912184913184914184915184916184917184918184919184920184921184922184923184924184925184926184927184928184929184930184931184932184933184934184935184936184937184938184939184940184941184942184943184944184945184946184947184948184949184950184951184952184953184954184955184956184957184958184959184960184961184962184963184964184965184966184967184968184969184970184971184972184973184974184975184976184977184978184979184980184981184982184983184984184985184986184987184988184989184990184991184992184993184994184995184996184997184998184999185000185001185002185003185004185005185006185007185008185009185010185011185012185013185014185015185016185017185018185019185020185021185022185023185024185025185026185027185028185029185030185031185032185033185034185035185036185037185038185039185040185041185042185043185044185045185046185047185048185049185050185051185052185053185054185055185056185057185058185059185060185061185062185063185064185065185066185067185068185069185070185071185072185073185074185075185076185077185078185079185080185081185082185083185084185085185086185087185088185089185090185091185092185093185094185095185096185097185098185099185100185101185102185103185104185105185106185107185108185109185110185111185112185113185114185115185116185117185118185119185120185121185122185123185124185125185126185127185128185129185130185131185132185133185134185135185136185137185138185139185140185141185142185143185144185145185146185147185148185149185150185151185152185153185154185155185156185157185158185159185160185161185162185163185164185165185166185167185168185169185170185171185172185173185174185175185176185177185178185179185180185181185182185183185184185185185186185187185188185189185190185191185192185193185194185195185196185197185198185199185200185201185202185203185204185205185206185207185208185209185210185211185212185213185214185215185216185217185218185219185220185221185222185223185224185225185226185227185228185229185230185231185232185233185234185235185236185237185238185239185240185241185242185243185244185245185246185247185248185249185250185251185252185253185254185255185256185257185258185259185260185261185262185263185264185265185266185267185268185269185270185271185272185273185274185275185276185277185278185279185280185281185282185283185284185285185286185287185288185289185290185291185292185293185294185295185296185297185298185299185300185301185302185303185304185305185306185307185308185309185310185311185312185313185314185315185316185317185318185319185320185321185322185323185324185325185326185327185328185329185330185331185332185333185334185335185336185337185338185339185340185341185342185343185344185345185346185347185348185349185350185351185352185353185354185355185356185357185358185359185360185361185362185363185364185365185366185367185368185369185370185371185372185373185374185375185376185377185378185379185380185381185382185383185384185385185386185387185388185389185390185391185392185393185394185395185396185397185398185399185400185401185402185403185404185405185406185407185408185409185410185411185412185413185414185415185416185417185418185419185420185421185422185423185424185425185426185427185428185429185430185431185432185433185434185435185436185437185438185439185440185441185442185443185444185445185446185447185448185449185450185451185452185453185454185455185456185457185458185459185460185461185462185463185464185465185466185467185468185469185470185471185472185473185474185475185476185477185478185479185480185481185482185483185484185485185486185487185488185489185490185491185492185493185494185495185496185497185498185499185500185501185502185503185504185505185506185507185508185509185510185511185512185513185514185515185516185517185518185519185520185521185522185523185524185525185526185527185528185529185530185531185532185533185534185535185536185537185538185539185540185541185542185543185544185545185546185547185548185549185550185551185552185553185554185555185556185557185558185559185560185561185562185563185564185565185566185567185568185569185570185571185572185573185574185575185576185577185578185579185580185581185582185583185584185585185586185587185588185589185590185591185592185593185594185595185596185597185598185599185600185601185602185603185604185605185606185607185608185609185610185611185612185613185614185615185616185617185618185619185620185621185622185623185624185625185626185627185628185629185630185631185632185633185634185635185636185637185638185639185640185641185642185643185644185645185646185647185648185649185650185651185652185653185654185655185656185657185658185659185660185661185662185663185664185665185666185667185668185669185670185671185672185673185674185675185676185677185678185679185680185681185682185683185684185685185686185687185688185689185690185691185692185693185694185695185696185697185698185699185700185701185702185703185704185705185706185707185708185709185710185711185712185713185714185715185716185717185718185719185720185721185722185723185724185725185726185727185728185729185730185731185732185733185734185735185736185737185738185739185740185741185742185743185744185745185746185747185748185749185750185751185752185753185754185755185756185757185758185759185760185761185762185763185764185765185766185767185768185769185770185771185772185773185774185775185776185777185778185779185780185781185782185783185784185785185786185787185788185789185790185791185792185793185794185795185796185797185798185799185800185801185802185803185804185805185806185807185808185809185810185811185812185813185814185815185816185817185818185819185820185821185822185823185824185825185826185827185828185829185830185831185832185833185834185835185836185837185838185839185840185841185842185843185844185845185846185847185848185849185850185851185852185853185854185855185856185857185858185859185860185861185862185863185864185865185866185867185868185869185870185871185872185873185874185875185876185877185878185879185880185881185882185883185884185885185886185887185888185889185890185891185892185893185894185895185896185897185898185899185900185901185902185903185904185905185906185907185908185909185910185911185912185913185914185915185916185917185918185919185920185921185922185923185924185925185926185927185928185929185930185931185932185933185934185935185936185937185938185939185940185941185942185943185944185945185946185947185948185949185950185951185952185953185954185955185956185957185958185959185960185961185962185963185964185965185966185967185968185969185970185971185972185973185974185975185976185977185978185979185980185981185982185983185984185985185986185987185988185989185990185991185992185993185994185995185996185997185998185999186000186001186002186003186004186005186006186007186008186009186010186011186012186013186014186015186016186017186018186019186020186021186022186023186024186025186026186027186028186029186030186031186032186033186034186035186036186037186038186039186040186041186042186043186044186045186046186047186048186049186050186051186052186053186054186055186056186057186058186059186060186061186062186063186064186065186066186067186068186069186070186071186072186073186074186075186076186077186078186079186080186081186082186083186084186085186086186087186088186089186090186091186092186093186094186095186096186097186098186099186100186101186102186103186104186105186106186107186108186109186110186111186112186113186114186115186116186117186118186119186120186121186122186123186124186125186126186127186128186129186130186131186132186133186134186135186136186137186138186139186140186141186142186143186144186145186146186147186148186149186150186151186152186153186154186155186156186157186158186159186160186161186162186163186164186165186166186167186168186169186170186171186172186173186174186175186176186177186178186179186180186181186182186183186184186185186186186187186188186189186190186191186192186193186194186195186196186197186198186199186200186201186202186203186204186205186206186207186208186209186210186211186212186213186214186215186216186217186218186219186220186221186222186223186224186225186226186227186228186229186230186231186232186233186234186235186236186237186238186239186240186241186242186243186244186245186246186247186248186249186250186251186252186253186254186255186256186257186258186259186260186261186262186263186264186265186266186267186268186269186270186271186272186273186274186275186276186277186278186279186280186281186282186283186284186285186286186287186288186289186290186291186292186293186294186295186296186297186298186299186300186301186302186303186304186305186306186307186308186309186310186311186312186313186314186315186316186317186318186319186320186321186322186323186324186325186326186327186328186329186330186331186332186333186334186335186336186337186338186339186340186341186342186343186344186345186346186347186348186349186350186351186352186353186354186355186356186357186358186359186360186361186362186363186364186365186366186367186368186369186370186371186372186373186374186375186376186377186378186379186380186381186382186383186384186385186386186387186388186389186390186391186392186393186394186395186396186397186398186399186400186401186402186403186404186405186406186407186408186409186410186411186412186413186414186415186416186417186418186419186420186421186422186423186424186425186426186427186428186429186430186431186432186433186434186435186436186437186438186439186440186441186442186443186444186445186446186447186448186449186450186451186452186453186454186455186456186457186458186459186460186461186462186463186464186465186466186467186468186469186470186471186472186473186474186475186476186477186478186479186480186481186482186483186484186485186486186487186488186489186490186491186492186493186494186495186496186497186498186499186500186501186502186503186504186505186506186507186508186509186510186511186512186513186514186515186516186517186518186519186520186521186522186523186524186525186526186527186528186529186530186531186532186533186534186535186536186537186538186539186540186541186542186543186544186545186546186547186548186549186550186551186552186553186554186555186556186557186558186559186560186561186562186563186564186565186566186567186568186569186570186571186572186573186574186575186576186577186578186579186580186581186582186583186584186585186586186587186588186589186590186591186592186593186594186595186596186597186598186599186600186601186602186603186604186605186606186607186608186609186610186611186612186613186614186615186616186617186618186619186620186621186622186623186624186625186626186627186628186629186630186631186632186633186634186635186636186637186638186639186640186641186642186643186644186645186646186647186648186649186650186651186652186653186654186655186656186657186658186659186660186661186662186663186664186665186666186667186668186669186670186671186672186673186674186675186676186677186678186679186680186681186682186683186684186685186686186687186688186689186690186691186692186693186694186695186696186697186698186699186700186701186702186703186704186705186706186707186708186709186710186711186712186713186714186715186716186717186718186719186720186721186722186723186724186725186726186727186728186729186730186731186732186733186734186735186736186737186738186739186740186741186742186743186744186745186746186747186748186749186750186751186752186753186754186755186756186757186758186759186760186761186762186763186764186765186766186767186768186769186770186771186772186773186774186775186776186777186778186779186780186781186782186783186784186785186786186787186788186789186790186791186792186793186794186795186796186797186798186799186800186801186802186803186804186805186806186807186808186809186810186811186812186813186814186815186816186817186818186819186820186821186822186823186824186825186826186827186828186829186830186831186832186833186834186835186836186837186838186839186840186841186842186843186844186845186846186847186848186849186850186851186852186853186854186855186856186857186858186859186860186861186862186863186864186865186866186867186868186869186870186871186872186873186874186875186876186877186878186879186880186881186882186883186884186885186886186887186888186889186890186891186892186893186894186895186896186897186898186899186900186901186902186903186904186905186906186907186908186909186910186911186912186913186914186915186916186917186918186919186920186921186922186923186924186925186926186927186928186929186930186931186932186933186934186935186936186937186938186939186940186941186942186943186944186945186946186947186948186949186950186951186952186953186954186955186956186957186958186959186960186961186962186963186964186965186966186967186968186969186970186971186972186973186974186975186976186977186978186979186980186981186982186983186984186985186986186987186988186989186990186991186992186993186994186995186996186997186998186999187000187001187002187003187004187005187006187007187008187009187010187011187012187013187014187015187016187017187018187019187020187021187022187023187024187025187026187027187028187029187030187031187032187033187034187035187036187037187038187039187040187041187042187043187044187045187046187047187048187049187050187051187052187053187054187055187056187057187058187059187060187061187062187063187064187065187066187067187068187069187070187071187072187073187074187075187076187077187078187079187080187081187082187083187084187085187086187087187088187089187090187091187092187093187094187095187096187097187098187099187100187101187102187103187104187105187106187107187108187109187110187111187112187113187114187115187116187117187118187119187120187121187122187123187124187125187126187127187128187129187130187131187132187133187134187135187136187137187138187139187140187141187142187143187144187145187146187147187148187149187150187151187152187153187154187155187156187157187158187159187160187161187162187163187164187165187166187167187168187169187170187171187172187173187174187175187176187177187178187179187180187181187182187183187184187185187186187187187188187189187190187191187192187193187194187195187196187197187198187199187200187201187202187203187204187205187206187207187208187209187210187211187212187213187214187215187216187217187218187219187220187221187222187223187224187225187226187227187228187229187230187231187232187233187234187235187236187237187238187239187240187241187242187243187244187245187246187247187248187249187250187251187252187253187254187255187256187257187258187259187260187261187262187263187264187265187266187267187268187269187270187271187272187273187274187275187276187277187278187279187280187281187282187283187284187285187286187287187288187289187290187291187292187293187294187295187296187297187298187299187300187301187302187303187304187305187306187307187308187309187310187311187312187313187314187315187316187317187318187319187320187321187322187323187324187325187326187327187328187329187330187331187332187333187334187335187336187337187338187339187340187341187342187343187344187345187346187347187348187349187350187351187352187353187354187355187356187357187358187359187360187361187362187363187364187365187366187367187368187369187370187371187372187373187374187375187376187377187378187379187380187381187382187383187384187385187386187387187388187389187390187391187392187393187394187395187396187397187398187399187400187401187402187403187404187405187406187407187408187409187410187411187412187413187414187415187416187417187418187419187420187421187422187423187424187425187426187427187428187429187430187431187432187433187434187435187436187437187438187439187440187441187442187443187444187445187446187447187448187449187450187451187452187453187454187455187456187457187458187459187460187461187462187463187464187465187466187467187468187469187470187471187472187473187474187475187476187477187478187479187480187481187482187483187484187485187486187487187488187489187490187491187492187493187494187495187496187497187498187499187500187501187502187503187504187505187506187507187508187509187510187511187512187513187514187515187516187517187518187519187520187521187522187523187524187525187526187527187528187529187530187531187532187533187534187535187536187537187538187539187540187541187542187543187544187545187546187547187548187549187550187551187552187553187554187555187556187557187558187559187560187561187562187563187564187565187566187567187568187569187570187571187572187573187574187575187576187577187578187579187580187581187582187583187584187585187586187587187588187589187590187591187592187593187594187595187596187597187598187599187600187601187602187603187604187605187606187607187608187609187610187611187612187613187614187615187616187617187618187619187620187621187622187623187624187625187626187627187628187629187630187631187632187633187634187635187636187637187638187639187640187641187642187643187644187645187646187647187648187649187650187651187652187653187654187655187656187657187658187659187660187661187662187663187664187665187666187667187668187669187670187671187672187673187674187675187676187677187678187679187680187681187682187683187684187685187686187687187688187689187690187691187692187693187694187695187696187697187698187699187700187701187702187703187704187705187706187707187708187709187710187711187712187713187714187715187716187717187718187719187720187721187722187723187724187725187726187727187728187729187730187731187732187733187734187735187736187737187738187739187740187741187742187743187744187745187746187747187748187749187750187751187752187753187754187755187756187757187758187759187760187761187762187763187764187765187766187767187768187769187770187771187772187773187774187775187776187777187778187779187780187781187782187783187784187785187786187787187788187789187790187791187792187793187794187795187796187797187798187799187800187801187802187803187804187805187806187807187808187809187810187811187812187813187814187815187816187817187818187819187820187821187822187823187824187825187826187827187828187829187830187831187832187833187834187835187836187837187838187839187840187841187842187843187844187845187846187847187848187849187850187851187852187853187854187855187856187857187858187859187860187861187862187863187864187865187866187867187868187869187870187871187872187873187874187875187876187877187878187879187880187881187882187883187884187885187886187887187888187889187890187891187892187893187894187895187896187897187898187899187900187901187902187903187904187905187906187907187908187909187910187911187912187913187914187915187916187917187918187919187920187921187922187923187924187925187926187927187928187929187930187931187932187933187934187935187936187937187938187939187940187941187942187943187944187945187946187947187948187949187950187951187952187953187954187955187956187957187958187959187960187961187962187963187964187965187966187967187968187969187970187971187972187973187974187975187976187977187978187979187980187981187982187983187984187985187986187987187988187989187990187991187992187993187994187995187996187997187998187999188000188001188002188003188004188005188006188007188008188009188010188011188012188013188014188015188016188017188018188019188020188021188022188023188024188025188026188027188028188029188030188031188032188033188034188035188036188037188038188039188040188041188042188043188044188045188046188047188048188049188050188051188052188053188054188055188056188057188058188059188060188061188062188063188064188065188066188067188068188069188070188071188072188073188074188075188076188077188078188079188080188081188082188083188084188085188086188087188088188089188090188091188092188093188094188095188096188097188098188099188100188101188102188103188104188105188106188107188108188109188110188111188112188113188114188115188116188117188118188119188120188121188122188123188124188125188126188127188128188129188130188131188132188133188134188135188136188137188138188139188140188141188142188143188144188145188146188147188148188149188150188151188152188153188154188155188156188157188158188159188160188161188162188163188164188165188166188167188168188169188170188171188172188173188174188175188176188177188178188179188180188181188182188183188184188185188186188187188188188189188190188191188192188193188194188195188196188197188198188199188200188201188202188203188204188205188206188207188208188209188210188211188212188213188214188215188216188217188218188219188220188221188222188223188224188225188226188227188228188229188230188231188232188233188234188235188236188237188238188239188240188241188242188243188244188245188246188247188248188249188250188251188252188253188254188255188256188257188258188259188260188261188262188263188264188265188266188267188268188269188270188271188272188273188274188275188276188277188278188279188280188281188282188283188284188285188286188287188288188289188290188291188292188293188294188295188296188297188298188299188300188301188302188303188304188305188306188307188308188309188310188311188312188313188314188315188316188317188318188319188320188321188322188323188324188325188326188327188328188329188330188331188332188333188334188335188336188337188338188339188340188341188342188343188344188345188346188347188348188349188350188351188352188353188354188355188356188357188358188359188360188361188362188363188364188365188366188367188368188369188370188371188372188373188374188375188376188377188378188379188380188381188382188383188384188385188386188387188388188389188390188391188392188393188394188395188396188397188398188399188400188401188402188403188404188405188406188407188408188409188410188411188412188413188414188415188416188417188418188419188420188421188422188423188424188425188426188427188428188429188430188431188432188433188434188435188436188437188438188439188440188441188442188443188444188445188446188447188448188449188450188451188452188453188454188455188456188457188458188459188460188461188462188463188464188465188466188467188468188469188470188471188472188473188474188475188476188477188478188479188480188481188482188483188484188485188486188487188488188489188490188491188492188493188494188495188496188497188498188499188500188501188502188503188504188505188506188507188508188509188510188511188512188513188514188515188516188517188518188519188520188521188522188523188524188525188526188527188528188529188530188531188532188533188534188535188536188537188538188539188540188541188542188543188544188545188546188547188548188549188550188551188552188553188554188555188556188557188558188559188560188561188562188563188564188565188566188567188568188569188570188571188572188573188574188575188576188577188578188579188580188581188582188583188584188585188586188587188588188589188590188591188592188593188594188595188596188597188598188599188600188601188602188603188604188605188606188607188608188609188610188611188612188613188614188615188616188617188618188619188620188621188622188623188624188625188626188627188628188629188630188631188632188633188634188635188636188637188638188639188640188641188642188643188644188645188646188647188648188649188650188651188652188653188654188655188656188657188658188659188660188661188662188663188664188665188666188667188668188669188670188671188672188673188674188675188676188677188678188679188680188681188682188683188684188685188686188687188688188689188690188691188692188693188694188695188696188697188698188699188700188701188702188703188704188705188706188707188708188709188710188711188712188713188714188715188716188717188718188719188720188721188722188723188724188725188726188727188728188729188730188731188732188733188734188735188736188737188738188739188740188741188742188743188744188745188746188747188748188749188750188751188752188753188754188755188756188757188758188759188760188761188762188763188764188765188766188767188768188769188770188771188772188773188774188775188776188777188778188779188780188781188782188783188784188785188786188787188788188789188790188791188792188793188794188795188796188797188798188799188800188801188802188803188804188805188806188807188808188809188810188811188812188813188814188815188816188817188818188819188820188821188822188823188824188825188826188827188828188829188830188831188832188833188834188835188836188837188838188839188840188841188842188843188844188845188846188847188848188849188850188851188852188853188854188855188856188857188858188859188860188861188862188863188864188865188866188867188868188869188870188871188872188873188874188875188876188877188878188879188880188881188882188883188884188885188886188887188888188889188890188891188892188893188894188895188896188897188898188899188900188901188902188903188904188905188906188907188908188909188910188911188912188913188914188915188916188917188918188919188920188921188922188923188924188925188926188927188928188929188930188931188932188933188934188935188936188937188938188939188940188941188942188943188944188945188946188947188948188949188950188951188952188953188954188955188956188957188958188959188960188961188962188963188964188965188966188967188968188969188970188971188972188973188974188975188976188977188978188979188980188981188982188983188984188985188986188987188988188989188990188991188992188993188994188995188996188997188998188999189000189001189002189003189004189005189006189007189008189009189010189011189012189013189014189015189016189017189018189019189020189021189022189023189024189025189026189027189028189029189030189031189032189033189034189035189036189037189038189039189040189041189042189043189044189045189046189047189048189049189050189051189052189053189054189055189056189057189058189059189060189061189062189063189064189065189066189067189068189069189070189071189072189073189074189075189076189077189078189079189080189081189082189083189084189085189086189087189088189089189090189091189092189093189094189095189096189097189098189099189100189101189102189103189104189105189106189107189108189109189110189111189112189113189114189115189116189117189118189119189120189121189122189123189124189125189126189127189128189129189130189131189132189133189134189135189136189137189138189139189140189141189142189143189144189145189146189147189148189149189150189151189152189153189154189155189156189157189158189159189160189161189162189163189164189165189166189167189168189169189170189171189172189173189174189175189176189177189178189179189180189181189182189183189184189185189186189187189188189189189190189191189192189193189194189195189196189197189198189199189200189201189202189203189204189205189206189207189208189209189210189211189212189213189214189215189216189217189218189219189220189221189222189223189224189225189226189227189228189229189230189231189232189233189234189235189236189237189238189239189240189241189242189243189244189245189246189247189248189249189250189251189252189253189254189255189256189257189258189259189260189261189262189263189264189265189266189267189268189269189270189271189272189273189274189275189276189277189278189279189280189281189282189283189284189285189286189287189288189289189290189291189292189293189294189295189296189297189298189299189300189301189302189303189304189305189306189307189308189309189310189311189312189313189314189315189316189317189318189319189320189321189322189323189324189325189326189327189328189329189330189331189332189333189334189335189336189337189338189339189340189341189342189343189344189345189346189347189348189349189350189351189352189353189354189355189356189357189358189359189360189361189362189363189364189365189366189367189368189369189370189371189372189373189374189375189376189377189378189379189380189381189382189383189384189385189386189387189388189389189390189391189392189393189394189395189396189397189398189399189400189401189402189403189404189405189406189407189408189409189410189411189412189413189414189415189416189417189418189419189420189421189422189423189424189425189426189427189428189429189430189431189432189433189434189435189436189437189438189439189440189441189442189443189444189445189446189447189448189449189450189451189452189453189454189455189456189457189458189459189460189461189462189463189464189465189466189467189468189469189470189471189472189473189474189475189476189477189478189479189480189481189482189483189484189485189486189487189488189489189490189491189492189493189494189495189496189497189498189499189500189501189502189503189504189505189506189507189508189509189510189511189512189513189514189515189516189517189518189519189520189521189522189523189524189525189526189527189528189529189530189531189532189533189534189535189536189537189538189539189540189541189542189543189544189545189546189547189548189549189550189551189552189553189554189555189556189557189558189559189560189561189562189563189564189565189566189567189568189569189570189571189572189573189574189575189576189577189578189579189580189581189582189583189584189585189586189587189588189589189590189591189592189593189594189595189596189597189598189599189600189601189602189603189604189605189606189607189608189609189610189611189612189613189614189615189616189617189618189619189620189621189622189623189624189625189626189627189628189629189630189631189632189633189634189635189636189637189638189639189640189641189642189643189644189645189646189647189648189649189650189651189652189653189654189655189656189657189658189659189660189661189662189663189664189665189666189667189668189669189670189671189672189673189674189675189676189677189678189679189680189681189682189683189684189685189686189687189688189689189690189691189692189693189694189695189696189697189698189699189700189701189702189703189704189705189706189707189708189709189710189711189712189713189714189715189716189717189718189719189720189721189722189723189724189725189726189727189728189729189730189731189732189733189734189735189736189737189738189739189740189741189742189743189744189745189746189747189748189749189750189751189752189753189754189755189756189757189758189759189760189761189762189763189764189765189766189767189768189769189770189771189772189773189774189775189776189777189778189779189780189781189782189783189784189785189786189787189788189789189790189791189792189793189794189795189796189797189798189799189800189801189802189803189804189805189806189807189808189809189810189811189812189813189814189815189816189817189818189819189820189821189822189823189824189825189826189827189828189829189830189831189832189833189834189835189836189837189838189839189840189841189842189843189844189845189846189847189848189849189850189851189852189853189854189855189856189857189858189859189860189861189862189863189864189865189866189867189868189869189870189871189872189873189874189875189876189877189878189879189880189881189882189883189884189885189886189887189888189889189890189891189892189893189894189895189896189897189898189899189900189901189902189903189904189905189906189907189908189909189910189911189912189913189914189915189916189917189918189919189920189921189922189923189924189925189926189927189928189929189930189931189932189933189934189935189936189937189938189939189940189941189942189943189944189945189946189947189948189949189950189951189952189953189954189955189956189957189958189959189960189961189962189963189964189965189966189967189968189969189970189971189972189973189974189975189976189977189978189979189980189981189982189983189984189985189986189987189988189989189990189991189992189993189994189995189996189997189998189999190000190001190002190003190004190005190006190007190008190009190010190011190012190013190014190015190016190017190018190019190020190021190022190023190024190025190026190027190028190029190030190031190032190033190034190035190036190037190038190039190040190041190042190043190044190045190046190047190048190049190050190051190052190053190054190055190056190057190058190059190060190061190062190063190064190065190066190067190068190069190070190071190072190073190074190075190076190077190078190079190080190081190082190083190084190085190086190087190088190089190090190091190092190093190094190095190096190097190098190099190100190101190102190103190104190105190106190107190108190109190110190111190112190113190114190115190116190117190118190119190120190121190122190123190124190125190126190127190128190129190130190131190132190133190134190135190136190137190138190139190140190141190142190143190144190145190146190147190148190149190150190151190152190153190154190155190156190157190158190159190160190161190162190163190164190165190166190167190168190169190170190171190172190173190174190175190176190177190178190179190180190181190182190183190184190185190186190187190188190189190190190191190192190193190194190195190196190197190198190199190200190201190202190203190204190205190206190207190208190209190210190211190212190213190214190215190216190217190218190219190220190221190222190223190224190225190226190227190228190229190230190231190232190233190234190235190236190237190238190239190240190241190242190243190244190245190246190247190248190249190250190251190252190253190254190255190256190257190258190259190260190261190262190263190264190265190266190267190268190269190270190271190272190273190274190275190276190277190278190279190280190281190282190283190284190285190286190287190288190289190290190291190292190293190294190295190296190297190298190299190300190301190302190303190304190305190306190307190308190309190310190311190312190313190314190315190316190317190318190319190320190321190322190323190324190325190326190327190328190329190330190331190332190333190334190335190336190337190338190339190340190341190342190343190344190345190346190347190348190349190350190351190352190353190354190355190356190357190358190359190360190361190362190363190364190365190366190367190368190369190370190371190372190373190374190375190376190377190378190379190380190381190382190383190384190385190386190387190388190389190390190391190392190393190394190395190396190397190398190399190400190401190402190403190404190405190406190407190408190409190410190411190412190413190414190415190416190417190418190419190420190421190422190423190424190425190426190427190428190429190430190431190432190433190434190435190436190437190438190439190440190441190442190443190444190445190446190447190448190449190450190451190452190453190454190455190456190457190458190459190460190461190462190463190464190465190466190467190468190469190470190471190472190473190474190475190476190477190478190479190480190481190482190483190484190485190486190487190488190489190490190491190492190493190494190495190496190497190498190499190500190501190502190503190504190505190506190507190508190509190510190511190512190513190514190515190516190517190518190519190520190521190522190523190524190525190526190527190528190529190530190531190532190533190534190535190536190537190538190539190540190541190542190543190544190545190546190547190548190549190550190551190552190553190554190555190556190557190558190559190560190561190562190563190564190565190566190567190568190569190570190571190572190573190574190575190576190577190578190579190580190581190582190583190584190585190586190587190588190589190590190591190592190593190594190595190596190597190598190599190600190601190602190603190604190605190606190607190608190609190610190611190612190613190614190615190616190617190618190619190620190621190622190623190624190625190626190627190628190629190630190631190632190633190634190635190636190637190638190639190640190641190642190643190644190645190646190647190648190649190650190651190652190653190654190655190656190657190658190659190660190661190662190663190664190665190666190667190668190669190670190671190672190673190674190675190676190677190678190679190680190681190682190683190684190685190686190687190688190689190690190691190692190693190694190695190696190697190698190699190700190701190702190703190704190705190706190707190708190709190710190711190712190713190714190715190716190717190718190719190720190721190722190723190724190725190726190727190728190729190730190731190732190733190734190735190736190737190738190739190740190741190742190743190744190745190746190747190748190749190750190751190752190753190754190755190756190757190758190759190760190761190762190763190764190765190766190767190768190769190770190771190772190773190774190775190776190777190778190779190780190781190782190783190784190785190786190787190788190789190790190791190792190793190794190795190796190797190798190799190800190801190802190803190804190805190806190807190808190809190810190811190812190813190814190815190816190817190818190819190820190821190822190823190824190825190826190827190828190829190830190831190832190833190834190835190836190837190838190839190840190841190842190843190844190845190846190847190848190849190850190851190852190853190854190855190856190857190858190859190860190861190862190863190864190865190866190867190868190869190870190871190872190873190874190875190876190877190878190879190880190881190882190883190884190885190886190887190888190889190890190891190892190893190894190895190896190897190898190899190900190901190902190903190904190905190906190907190908190909190910190911190912190913190914190915190916190917190918190919190920190921190922190923190924190925190926190927190928190929190930190931190932190933190934190935190936190937190938190939190940190941190942190943190944190945190946190947190948190949190950190951190952190953190954190955190956190957190958190959190960190961190962190963190964190965190966190967190968190969190970190971190972190973190974190975190976190977190978190979190980190981190982190983190984190985190986190987190988190989190990190991190992190993190994190995190996190997190998190999191000191001191002191003191004191005191006191007191008191009191010191011191012191013191014191015191016191017191018191019191020191021191022191023191024191025191026191027191028191029191030191031191032191033191034191035191036191037191038191039191040191041191042191043191044191045191046191047191048191049191050191051191052191053191054191055191056191057191058191059191060191061191062191063191064191065191066191067191068191069191070191071191072191073191074191075191076191077191078191079191080191081191082191083191084191085191086191087191088191089191090191091191092191093191094191095191096191097191098191099191100191101191102191103191104191105191106191107191108191109191110191111191112191113191114191115191116191117191118191119191120191121191122191123191124191125191126191127191128191129191130191131191132191133191134191135191136191137191138191139191140191141191142191143191144191145191146191147191148191149191150191151191152191153191154191155191156191157191158191159191160191161191162191163191164191165191166191167191168191169191170191171191172191173191174191175191176191177191178191179191180191181191182191183191184191185191186191187191188191189191190191191191192191193191194191195191196191197191198191199191200191201191202191203191204191205191206191207191208191209191210191211191212191213191214191215191216191217191218191219191220191221191222191223191224191225191226191227191228191229191230191231191232191233191234191235191236191237191238191239191240191241191242191243191244191245191246191247191248191249191250191251191252191253191254191255191256191257191258191259191260191261191262191263191264191265191266191267191268191269191270191271191272191273191274191275191276191277191278191279191280191281191282191283191284191285191286191287191288191289191290191291191292191293191294191295191296191297191298191299191300191301191302191303191304191305191306191307191308191309191310191311191312191313191314191315191316191317191318191319191320191321191322191323191324191325191326191327191328191329191330191331191332191333191334191335191336191337191338191339191340191341191342191343191344191345191346191347191348191349191350191351191352191353191354191355191356191357191358191359191360191361191362191363191364191365191366191367191368191369191370191371191372191373191374191375191376191377191378191379191380191381191382191383191384191385191386191387191388191389191390191391191392191393191394191395191396191397191398191399191400191401191402191403191404191405191406191407191408191409191410191411191412191413191414191415191416191417191418191419191420191421191422191423191424191425191426191427191428191429191430191431191432191433191434191435191436191437191438191439191440191441191442191443191444191445191446191447191448191449191450191451191452191453191454191455191456191457191458191459191460191461191462191463191464191465191466191467191468191469191470191471191472191473191474191475191476191477191478191479191480191481191482191483191484191485191486191487191488191489191490191491191492191493191494191495191496191497191498191499191500191501191502191503191504191505191506191507191508191509191510191511191512191513191514191515191516191517191518191519191520191521191522191523191524191525191526191527191528191529191530191531191532191533191534191535191536191537191538191539191540191541191542191543191544191545191546191547191548191549191550191551191552191553191554191555191556191557191558191559191560191561191562191563191564191565191566191567191568191569191570191571191572191573191574191575191576191577191578191579191580191581191582191583191584191585191586191587191588191589191590191591191592191593191594191595191596191597191598191599191600191601191602191603191604191605191606191607191608191609191610191611191612191613191614191615191616191617191618191619191620191621191622191623191624191625191626191627191628191629191630191631191632191633191634191635191636191637191638191639191640191641191642191643191644191645191646191647191648191649191650191651191652191653191654191655191656191657191658191659191660191661191662191663191664191665191666191667191668191669191670191671191672191673191674191675191676191677191678191679191680191681191682191683191684191685191686191687191688191689191690191691191692191693191694191695191696191697191698191699191700191701191702191703191704191705191706191707191708191709191710191711191712191713191714191715191716191717191718191719191720191721191722191723191724191725191726191727191728191729191730191731191732191733191734191735191736191737191738191739191740191741191742191743191744191745191746191747191748191749191750191751191752191753191754191755191756191757191758191759191760191761191762191763191764191765191766191767191768191769191770191771191772191773191774191775191776191777191778191779191780191781191782191783191784191785191786191787191788191789191790191791191792191793191794191795191796191797191798191799191800191801191802191803191804191805191806191807191808191809191810191811191812191813191814191815191816191817191818191819191820191821191822191823191824191825191826191827191828191829191830191831191832191833191834191835191836191837191838191839191840191841191842191843191844191845191846191847191848191849191850191851191852191853191854191855191856191857191858191859191860191861191862191863191864191865191866191867191868191869191870191871191872191873191874191875191876191877191878191879191880191881191882191883191884191885191886191887191888191889191890191891191892191893191894191895191896191897191898191899191900191901191902191903191904191905191906191907191908191909191910191911191912191913191914191915191916191917191918191919191920191921191922191923191924191925191926191927191928191929191930191931191932191933191934191935191936191937191938191939191940191941191942191943191944191945191946191947191948191949191950191951191952191953191954191955191956191957191958191959191960191961191962191963191964191965191966191967191968191969191970191971191972191973191974191975191976191977191978191979191980191981191982191983191984191985191986191987191988191989191990191991191992191993191994191995191996191997191998191999192000192001192002192003192004192005192006192007192008192009192010192011192012192013192014192015192016192017192018192019192020192021192022192023192024192025192026192027192028192029192030192031192032192033192034192035192036192037192038192039192040192041192042192043192044192045192046192047192048192049192050192051192052192053192054192055192056192057192058192059192060192061192062192063192064192065192066192067192068192069192070192071192072192073192074192075192076192077192078192079192080192081192082192083192084192085192086192087192088192089192090192091192092192093192094192095192096192097192098192099192100192101192102192103192104192105192106192107192108192109192110192111192112192113192114192115192116192117192118192119192120192121192122192123192124192125192126192127192128192129192130192131192132192133192134192135192136192137192138192139192140192141192142192143192144192145192146192147192148192149192150192151192152192153192154192155192156192157192158192159192160192161192162192163192164192165192166192167192168192169192170192171192172192173192174192175192176192177192178192179192180192181192182192183192184192185192186192187192188192189192190192191192192192193192194192195192196192197192198192199192200192201192202192203192204192205192206192207192208192209192210192211192212192213192214192215192216192217192218192219192220192221192222192223192224192225192226192227192228192229192230192231192232192233192234192235192236192237192238192239192240192241192242192243192244192245192246192247192248192249192250192251192252192253192254192255192256192257192258192259192260192261192262192263192264192265192266192267192268192269192270192271192272192273192274192275192276192277192278192279192280192281192282192283192284192285192286192287192288192289192290192291192292192293192294192295192296192297192298192299192300192301192302192303192304192305192306192307192308192309192310192311192312192313192314192315192316192317192318192319192320192321192322192323192324192325192326192327192328192329192330192331192332192333192334192335192336192337192338192339192340192341192342192343192344192345192346192347192348192349192350192351192352192353192354192355192356192357192358192359192360192361192362192363192364192365192366192367192368192369192370192371192372192373192374192375192376192377192378192379192380192381192382192383192384192385192386192387192388192389192390192391192392192393192394192395192396192397192398192399192400192401192402192403192404192405192406192407192408192409192410192411192412192413192414192415192416192417192418192419192420192421192422192423192424192425192426192427192428192429192430192431192432192433192434192435192436192437192438192439192440192441192442192443192444192445192446192447192448192449192450192451192452192453192454192455192456192457192458192459192460192461192462192463192464192465192466192467192468192469192470192471192472192473192474192475192476192477192478192479192480192481192482192483192484192485192486192487192488192489192490192491192492192493192494192495192496192497192498192499192500192501192502192503192504192505192506192507192508192509192510192511192512192513192514192515192516192517192518192519192520192521192522192523192524192525192526192527192528192529192530192531192532192533192534192535192536192537192538192539192540192541192542192543192544192545192546192547192548192549192550192551192552192553192554192555192556192557192558192559192560192561192562192563192564192565192566192567192568192569192570192571192572192573192574192575192576192577192578192579192580192581192582192583192584192585192586192587192588192589192590192591192592192593192594192595192596192597192598192599192600192601192602192603192604192605192606192607192608192609192610192611192612192613192614192615192616192617192618192619192620192621192622192623192624192625192626192627192628192629192630192631192632192633192634192635192636192637192638192639192640192641192642192643192644192645192646192647192648192649192650192651192652192653192654192655192656192657192658192659192660192661192662192663192664192665192666192667192668192669192670192671192672192673192674192675192676192677192678192679192680192681192682192683192684192685192686192687192688192689192690192691192692192693192694192695192696192697192698192699192700192701192702192703192704192705192706192707192708192709192710192711192712192713192714192715192716192717192718192719192720192721192722192723192724192725192726192727192728192729192730192731192732192733192734192735192736192737192738192739192740192741192742192743192744192745192746192747192748192749192750192751192752192753192754192755192756192757192758192759192760192761192762192763192764192765192766192767192768192769192770192771192772192773192774192775192776192777192778192779192780192781192782192783192784192785192786192787192788192789192790192791192792192793192794192795192796192797192798192799192800192801192802192803192804192805192806192807192808192809192810192811192812192813192814192815192816192817192818192819192820192821192822192823192824192825192826192827192828192829192830192831192832192833192834192835192836192837192838192839192840192841192842192843192844192845192846192847192848192849192850192851192852192853192854192855192856192857192858192859192860192861192862192863192864192865192866192867192868192869192870192871192872192873192874192875192876192877192878192879192880192881192882192883192884192885192886192887192888192889192890192891192892192893192894192895192896192897192898192899192900192901192902192903192904192905192906192907192908192909192910192911192912192913192914192915192916192917192918192919192920192921192922192923192924192925192926192927192928192929192930192931192932192933192934192935192936192937192938192939192940192941192942192943192944192945192946192947192948192949192950192951192952192953192954192955192956192957192958192959192960192961192962192963192964192965192966192967192968192969192970192971192972192973192974192975192976192977192978192979192980192981192982192983192984192985192986192987192988192989192990192991192992192993192994192995192996192997192998192999193000193001193002193003193004193005193006193007193008193009193010193011193012193013193014193015193016193017193018193019193020193021193022193023193024193025193026193027193028193029193030193031193032193033193034193035193036193037193038193039193040193041193042193043193044193045193046193047193048193049193050193051193052193053193054193055193056193057193058193059193060193061193062193063193064193065193066193067193068193069193070193071193072193073193074193075193076193077193078193079193080193081193082193083193084193085193086193087193088193089193090193091193092193093193094193095193096193097193098193099193100193101193102193103193104193105193106193107193108193109193110193111193112193113193114193115193116193117193118193119193120193121193122193123193124193125193126193127193128193129193130193131193132193133193134193135193136193137193138193139193140193141193142193143193144193145193146193147193148193149193150193151193152193153193154193155193156193157193158193159193160193161193162193163193164193165193166193167193168193169193170193171193172193173193174193175193176193177193178193179193180193181193182193183193184193185193186193187193188193189193190193191193192193193193194193195193196193197193198193199193200193201193202193203193204193205193206193207193208193209193210193211193212193213193214193215193216193217193218193219193220193221193222193223193224193225193226193227193228193229193230193231193232193233193234193235193236193237193238193239193240193241193242193243193244193245193246193247193248193249193250193251193252193253193254193255193256193257193258193259193260193261193262193263193264193265193266193267193268193269193270193271193272193273193274193275193276193277193278193279193280193281193282193283193284193285193286193287193288193289193290193291193292193293193294193295193296193297193298193299193300193301193302193303193304193305193306193307193308193309193310193311193312193313193314193315193316193317193318193319193320193321193322193323193324193325193326193327193328193329193330193331193332193333193334193335193336193337193338193339193340193341193342193343193344193345193346193347193348193349193350193351193352193353193354193355193356193357193358193359193360193361193362193363193364193365193366193367193368193369193370193371193372193373193374193375193376193377193378193379193380193381193382193383193384193385193386193387193388193389193390193391193392193393193394193395193396193397193398193399193400193401193402193403193404193405193406193407193408193409193410193411193412193413193414193415193416193417193418193419193420193421193422193423193424193425193426193427193428193429193430193431193432193433193434193435193436193437193438193439193440193441193442193443193444193445193446193447193448193449193450193451193452193453193454193455193456193457193458193459193460193461193462193463193464193465193466193467193468193469193470193471193472193473193474193475193476193477193478193479193480193481193482193483193484193485193486193487193488193489193490193491193492193493193494193495193496193497193498193499193500193501193502193503193504193505193506193507193508193509193510193511193512193513193514193515193516193517193518193519193520193521193522193523193524193525193526193527193528193529193530193531193532193533193534193535193536193537193538193539193540193541193542193543193544193545193546193547193548193549193550193551193552193553193554193555193556193557193558193559193560193561193562193563193564193565193566193567193568193569193570193571193572193573193574193575193576193577193578193579193580193581193582193583193584193585193586193587193588193589193590193591193592193593193594193595193596193597193598193599193600193601193602193603193604193605193606193607193608193609193610193611193612193613193614193615193616193617193618193619193620193621193622193623193624193625193626193627193628193629193630193631193632193633193634193635193636193637193638193639193640193641193642193643193644193645193646193647193648193649193650193651193652193653193654193655193656193657193658193659193660193661193662193663193664193665193666193667193668193669193670193671193672193673193674193675193676193677193678193679193680193681193682193683193684193685193686193687193688193689193690193691193692193693193694193695193696193697193698193699193700193701193702193703193704193705193706193707193708193709193710193711193712193713193714193715193716193717193718193719193720193721193722193723193724193725193726193727193728193729193730193731193732193733193734193735193736193737193738193739193740193741193742193743193744193745193746193747193748193749193750193751193752193753193754193755193756193757193758193759193760193761193762193763193764193765193766193767193768193769193770193771193772193773193774193775193776193777193778193779193780193781193782193783193784193785193786193787193788193789193790193791193792193793193794193795193796193797193798193799193800193801193802193803193804193805193806193807193808193809193810193811193812193813193814193815193816193817193818193819193820193821193822193823193824193825193826193827193828193829193830193831193832193833193834193835193836193837193838193839193840193841193842193843193844193845193846193847193848193849193850193851193852193853193854193855193856193857193858193859193860193861193862193863193864193865193866193867193868193869193870193871193872193873193874193875193876193877193878193879193880193881193882193883193884193885193886193887193888193889193890193891193892193893193894193895193896193897193898193899193900193901193902193903193904193905193906193907193908193909193910193911193912193913193914193915193916193917193918193919193920193921193922193923193924193925193926193927193928193929193930193931193932193933193934193935193936193937193938193939193940193941193942193943193944193945193946193947193948193949193950193951193952193953193954193955193956193957193958193959193960193961193962193963193964193965193966193967193968193969193970193971193972193973193974193975193976193977193978193979193980193981193982193983193984193985193986193987193988193989193990193991193992193993193994193995193996193997193998193999194000194001194002194003194004194005194006194007194008194009194010194011194012194013194014194015194016194017194018194019194020194021194022194023194024194025194026194027194028194029194030194031194032194033194034194035194036194037194038194039194040194041194042194043194044194045194046194047194048194049194050194051194052194053194054194055194056194057194058194059194060194061194062194063194064194065194066194067194068194069194070194071194072194073194074194075194076194077194078194079194080194081194082194083194084194085194086194087194088194089194090194091194092194093194094194095194096194097194098194099194100194101194102194103194104194105194106194107194108194109194110194111194112194113194114194115194116194117194118194119194120194121194122194123194124194125194126194127194128194129194130194131194132194133194134194135194136194137194138194139194140194141194142194143194144194145194146194147194148194149194150194151194152194153194154194155194156194157194158194159194160194161194162194163194164194165194166194167194168194169194170194171194172194173194174194175194176194177194178194179194180194181194182194183194184194185194186194187194188194189194190194191194192194193194194194195194196194197194198194199194200194201194202194203194204194205194206194207194208194209194210194211194212194213194214194215194216194217194218194219194220194221194222194223194224194225194226194227194228194229194230194231194232194233194234194235194236194237194238194239194240194241194242194243194244194245194246194247194248194249194250194251194252194253194254194255194256194257194258194259194260194261194262194263194264194265194266194267194268194269194270194271194272194273194274194275194276194277194278194279194280194281194282194283194284194285194286194287194288194289194290194291194292194293194294194295194296194297194298194299194300194301194302194303194304194305194306194307194308194309194310194311194312194313194314194315194316194317194318194319194320194321194322194323194324194325194326194327194328194329194330194331194332194333194334194335194336194337194338194339194340194341194342194343194344194345194346194347194348194349194350194351194352194353194354194355194356194357194358194359194360194361194362194363194364194365194366194367194368194369194370194371194372194373194374194375194376194377194378194379194380194381194382194383194384194385194386194387194388194389194390194391194392194393194394194395194396194397194398194399194400194401194402194403194404194405194406194407194408194409194410194411194412194413194414194415194416194417194418194419194420194421194422194423194424194425194426194427194428194429194430194431194432194433194434194435194436194437194438194439194440194441194442194443194444194445194446194447194448194449194450194451194452194453194454194455194456194457194458194459194460194461194462194463194464194465194466194467194468194469194470194471194472194473194474194475194476194477194478194479194480194481194482194483194484194485194486194487194488194489194490194491194492194493194494194495194496194497194498194499194500194501194502194503194504194505194506194507194508194509194510194511194512194513194514194515194516194517194518194519194520194521194522194523194524194525194526194527194528194529194530194531194532194533194534194535194536194537194538194539194540194541194542194543194544194545194546194547194548194549194550194551194552194553194554194555194556194557194558194559194560194561194562194563194564194565194566194567194568194569194570194571194572194573194574194575194576194577194578194579194580194581194582194583194584194585194586194587194588194589194590194591194592194593194594194595194596194597194598194599194600194601194602194603194604194605194606194607194608194609194610194611194612194613194614194615194616194617194618194619194620194621194622194623194624194625194626194627194628194629194630194631194632194633194634194635194636194637194638194639194640194641194642194643194644194645194646194647194648194649194650194651194652194653194654194655194656194657194658194659194660194661194662194663194664194665194666194667194668194669194670194671194672194673194674194675194676194677194678194679194680194681194682194683194684194685194686194687194688194689194690194691194692194693194694194695194696194697194698194699194700194701194702194703194704194705194706194707194708194709194710194711194712194713194714194715194716194717194718194719194720194721194722194723194724194725194726194727194728194729194730194731194732194733194734194735194736194737194738194739194740194741194742194743194744194745194746194747194748194749194750194751194752194753194754194755194756194757194758194759194760194761194762194763194764194765194766194767194768194769194770194771194772194773194774194775194776194777194778194779194780194781194782194783194784194785194786194787194788194789194790194791194792194793194794194795194796194797194798194799194800194801194802194803194804194805194806194807194808194809194810194811194812194813194814194815194816194817194818194819194820194821194822194823194824194825194826194827194828194829194830194831194832194833194834194835194836194837194838194839194840194841194842194843194844194845194846194847194848194849194850194851194852194853194854194855194856194857194858194859194860194861194862194863194864194865194866194867194868194869194870194871194872194873194874194875194876194877194878194879194880194881194882194883194884194885194886194887194888194889194890194891194892194893194894194895194896194897194898194899194900194901194902194903194904194905194906194907194908194909194910194911194912194913194914194915194916194917194918194919194920194921194922194923194924194925194926194927194928194929194930194931194932194933194934194935194936194937194938194939194940194941194942194943194944194945194946194947194948194949194950194951194952194953194954194955194956194957194958194959194960194961194962194963194964194965194966194967194968194969194970194971194972194973194974194975194976194977194978194979194980194981194982194983194984194985194986194987194988194989194990194991194992194993194994194995194996194997194998194999195000195001195002195003195004195005195006195007195008195009195010195011195012195013195014195015195016195017195018195019195020195021195022195023195024195025195026195027195028195029195030195031195032195033195034195035195036195037195038195039195040195041195042195043195044195045195046195047195048195049195050195051195052195053195054195055195056195057195058195059195060195061195062195063195064195065195066195067195068195069195070195071195072195073195074195075195076195077195078195079195080195081195082195083195084195085195086195087195088195089195090195091195092195093195094195095195096195097195098195099195100195101195102195103195104195105195106195107195108195109195110195111195112195113195114195115195116195117195118195119195120195121195122195123195124195125195126195127195128195129195130195131195132195133195134195135195136195137195138195139195140195141195142195143195144195145195146195147195148195149195150195151195152195153195154195155195156195157195158195159195160195161195162195163195164195165195166195167195168195169195170195171195172195173195174195175195176195177195178195179195180195181195182195183195184195185195186195187195188195189195190195191195192195193195194195195195196195197195198195199195200195201195202195203195204195205195206195207195208195209195210195211195212195213195214195215195216195217195218195219195220195221195222195223195224195225195226195227195228195229195230195231195232195233195234195235195236195237195238195239195240195241195242195243195244195245195246195247195248195249195250195251195252195253195254195255195256195257195258195259195260195261195262195263195264195265195266195267195268195269195270195271195272195273195274195275195276195277195278195279195280195281195282195283195284195285195286195287195288195289195290195291195292195293195294195295195296195297195298195299195300195301195302195303195304195305195306195307195308195309195310195311195312195313195314195315195316195317195318195319195320195321195322195323195324195325195326195327195328195329195330195331195332195333195334195335195336195337195338195339195340195341195342195343195344195345195346195347195348195349195350195351195352195353195354195355195356195357195358195359195360195361195362195363195364195365195366195367195368195369195370195371195372195373195374195375195376195377195378195379195380195381195382195383195384195385195386195387195388195389195390195391195392195393195394195395195396195397195398195399195400195401195402195403195404195405195406195407195408195409195410195411195412195413195414195415195416195417195418195419195420195421195422195423195424195425195426195427195428195429195430195431195432195433195434195435195436195437195438195439195440195441195442195443195444195445195446195447195448195449195450195451195452195453195454195455195456195457195458195459195460195461195462195463195464195465195466195467195468195469195470195471195472195473195474195475195476195477195478195479195480195481195482195483195484195485195486195487195488195489195490195491195492195493195494195495195496195497195498195499195500195501195502195503195504195505195506195507195508195509195510195511195512195513195514195515195516195517195518195519195520195521195522195523195524195525195526195527195528195529195530195531195532195533195534195535195536195537195538195539195540195541195542195543195544195545195546195547195548195549195550195551195552195553195554195555195556195557195558195559195560195561195562195563195564195565195566195567195568195569195570195571195572195573195574195575195576195577195578195579195580195581195582195583195584195585195586195587195588195589195590195591195592195593195594195595195596195597195598195599195600195601195602195603195604195605195606195607195608195609195610195611195612195613195614195615195616195617195618195619195620195621195622195623195624195625195626195627195628195629195630195631195632195633195634195635195636195637195638195639195640195641195642195643195644195645195646195647195648195649195650195651195652195653195654195655195656195657195658195659195660195661195662195663195664195665195666195667195668195669195670195671195672195673195674195675195676195677195678195679195680195681195682195683195684195685195686195687195688195689195690195691195692195693195694195695195696195697195698195699195700195701195702195703195704195705195706195707195708195709195710195711195712195713195714195715195716195717195718195719195720195721195722195723195724195725195726195727195728195729195730195731195732195733195734195735195736195737195738195739195740195741195742195743195744195745195746195747195748195749195750195751195752195753195754195755195756195757195758195759195760195761195762195763195764195765195766195767195768195769195770195771195772195773195774195775195776195777195778195779195780195781195782195783195784195785195786195787195788195789195790195791195792195793195794195795195796195797195798195799195800195801195802195803195804195805195806195807195808195809195810195811195812195813195814195815195816195817195818195819195820195821195822195823195824195825195826195827195828195829195830195831195832195833195834195835195836195837195838195839195840195841195842195843195844195845195846195847195848195849195850195851195852195853195854195855195856195857195858195859195860195861195862195863195864195865195866195867195868195869195870195871195872195873195874195875195876195877195878195879195880195881195882195883195884195885195886195887195888195889195890195891195892195893195894195895195896195897195898195899195900195901195902195903195904195905195906195907195908195909195910195911195912195913195914195915195916195917195918195919195920195921195922195923195924195925195926195927195928195929195930195931195932195933195934195935195936195937195938195939195940195941195942195943195944195945195946195947195948195949195950195951195952195953195954195955195956195957195958195959195960195961195962195963195964195965195966195967195968195969195970195971195972195973195974195975195976195977195978195979195980195981195982195983195984195985195986195987195988195989195990195991195992195993195994195995195996195997195998195999196000196001196002196003196004196005196006196007196008196009196010196011196012196013196014196015196016196017196018196019196020196021196022196023196024196025196026196027196028196029196030196031196032196033196034196035196036196037196038196039196040196041196042196043196044196045196046196047196048196049196050196051196052196053196054196055196056196057196058196059196060196061196062196063196064196065196066196067196068196069196070196071196072196073196074196075196076196077196078196079196080196081196082196083196084196085196086196087196088196089196090196091196092196093196094196095196096196097196098196099196100196101196102196103196104196105196106196107196108196109196110196111196112196113196114196115196116196117196118196119196120196121196122196123196124196125196126196127196128196129196130196131196132196133196134196135196136196137196138196139196140196141196142196143196144196145196146196147196148196149196150196151196152196153196154196155196156196157196158196159196160196161196162196163196164196165196166196167196168196169196170196171196172196173196174196175196176196177196178196179196180196181196182196183196184196185196186196187196188196189196190196191196192196193196194196195196196196197196198196199196200196201196202196203196204196205196206196207196208196209196210196211196212196213196214196215196216196217196218196219196220196221196222196223196224196225196226196227196228196229196230196231196232196233196234196235196236196237196238196239196240196241196242196243196244196245196246196247196248196249196250196251196252196253196254196255196256196257196258196259196260196261196262196263196264196265196266196267196268196269196270196271196272196273196274196275196276196277196278196279196280196281196282196283196284196285196286196287196288196289196290196291196292196293196294196295196296196297196298196299196300196301196302196303196304196305196306196307196308196309196310196311196312196313196314196315196316196317196318196319196320196321196322196323196324196325196326196327196328196329196330196331196332196333196334196335196336196337196338196339196340196341196342196343196344196345196346196347196348196349196350196351196352196353196354196355196356196357196358196359196360196361196362196363196364196365196366196367196368196369196370196371196372196373196374196375196376196377196378196379196380196381196382196383196384196385196386196387196388196389196390196391196392196393196394196395196396196397196398196399196400196401196402196403196404196405196406196407196408196409196410196411196412196413196414196415196416196417196418196419196420196421196422196423196424196425196426196427196428196429196430196431196432196433196434196435196436196437196438196439196440196441196442196443196444196445196446196447196448196449196450196451196452196453196454196455196456196457196458196459196460196461196462196463196464196465196466196467196468196469196470196471196472196473196474196475196476196477196478196479196480196481196482196483196484196485196486196487196488196489196490196491196492196493196494196495196496196497196498196499196500196501196502196503196504196505196506196507196508196509196510196511196512196513196514196515196516196517196518196519196520196521196522196523196524196525196526196527196528196529196530196531196532196533196534196535196536196537196538196539196540196541196542196543196544196545196546196547196548196549196550196551196552196553196554196555196556196557196558196559196560196561196562196563196564196565196566196567196568196569196570196571196572196573196574196575196576196577196578196579196580196581196582196583196584196585196586196587196588196589196590196591196592196593196594196595196596196597196598196599196600196601196602196603196604196605196606196607196608196609196610196611196612196613196614196615196616196617196618196619196620196621196622196623196624196625196626196627196628196629196630196631196632196633196634196635196636196637196638196639196640196641196642196643196644196645196646196647196648196649196650196651196652196653196654196655196656196657196658196659196660196661196662196663196664196665196666196667196668196669196670196671196672196673196674196675196676196677196678196679196680196681196682196683196684196685196686196687196688196689196690196691196692196693196694196695196696196697196698196699196700196701196702196703196704196705196706196707196708196709196710196711196712196713196714196715196716196717196718196719196720196721196722196723196724196725196726196727196728196729196730196731196732196733196734196735196736196737196738196739196740196741196742196743196744196745196746196747196748196749196750196751196752196753196754196755196756196757196758196759196760196761196762196763196764196765196766196767196768196769196770196771196772196773196774196775196776196777196778196779196780196781196782196783196784196785196786196787196788196789196790196791196792196793196794196795196796196797196798196799196800196801196802196803196804196805196806196807196808196809196810196811196812196813196814196815196816196817196818196819196820196821196822196823196824196825196826196827196828196829196830196831196832196833196834196835196836196837196838196839196840196841196842196843196844196845196846196847196848196849196850196851196852196853196854196855196856196857196858196859196860196861196862196863196864196865196866196867196868196869196870196871196872196873196874196875196876196877196878196879196880196881196882196883196884196885196886196887196888196889196890196891196892196893196894196895196896196897196898196899196900196901196902196903196904196905196906196907196908196909196910196911196912196913196914196915196916196917196918196919196920196921196922196923196924196925196926196927196928196929196930196931196932196933196934196935196936196937196938196939196940196941196942196943196944196945196946196947196948196949196950196951196952196953196954196955196956196957196958196959196960196961196962196963196964196965196966196967196968196969196970196971196972196973196974196975196976196977196978196979196980196981196982196983196984196985196986196987196988196989196990196991196992196993196994196995196996196997196998196999197000197001197002197003197004197005197006197007197008197009197010197011197012197013197014197015197016197017197018197019197020197021197022197023197024197025197026197027197028197029197030197031197032197033197034197035197036197037197038197039197040197041197042197043197044197045197046197047197048197049197050197051197052197053197054197055197056197057197058197059197060197061197062197063197064197065197066197067197068197069197070197071197072197073197074197075197076197077197078197079197080197081197082197083197084197085197086197087197088197089197090197091197092197093197094197095197096197097197098197099197100197101197102197103197104197105197106197107197108197109197110197111197112197113197114197115197116197117197118197119197120197121197122197123197124197125197126197127197128197129197130197131197132197133197134197135197136197137197138197139197140197141197142197143197144197145197146197147197148197149197150197151197152197153197154197155197156197157197158197159197160197161197162197163197164197165197166197167197168197169197170197171197172197173197174197175197176197177197178197179197180197181197182197183197184197185197186197187197188197189197190197191197192197193197194197195197196197197197198197199197200197201197202197203197204197205197206197207197208197209197210197211197212197213197214197215197216197217197218197219197220197221197222197223197224197225197226197227197228197229197230197231197232197233197234197235197236197237197238197239197240197241197242197243197244197245197246197247197248197249197250197251197252197253197254197255197256197257197258197259197260197261197262197263197264197265197266197267197268197269197270197271197272197273197274197275197276197277197278197279197280197281197282197283197284197285197286197287197288197289197290197291197292197293197294197295197296197297197298197299197300197301197302197303197304197305197306197307197308197309197310197311197312197313197314197315197316197317197318197319197320197321197322197323197324197325197326197327197328197329197330197331197332197333197334197335197336197337197338197339197340197341197342197343197344197345197346197347197348197349197350197351197352197353197354197355197356197357197358197359197360197361197362197363197364197365197366197367197368197369197370197371197372197373197374197375197376197377197378197379197380197381197382197383197384197385197386197387197388197389197390197391197392197393197394197395197396197397197398197399197400197401197402197403197404197405197406197407197408197409197410197411197412197413197414197415197416197417197418197419197420197421197422197423197424197425197426197427197428197429197430197431197432197433197434197435197436197437197438197439197440197441197442197443197444197445197446197447197448197449197450197451197452197453197454197455197456197457197458197459197460197461197462197463197464197465197466197467197468197469197470197471197472197473197474197475197476197477197478197479197480197481197482197483197484197485197486197487197488197489197490197491197492197493197494197495197496197497197498197499197500197501197502197503197504197505197506197507197508197509197510197511197512197513197514197515197516197517197518197519197520197521197522197523197524197525197526197527197528197529197530197531197532197533197534197535197536197537197538197539197540197541197542197543197544197545197546197547197548197549197550197551197552197553197554197555197556197557197558197559197560197561197562197563197564197565197566197567197568197569197570197571197572197573197574197575197576197577197578197579197580197581197582197583197584197585197586197587197588197589197590197591197592197593197594197595197596197597197598197599197600197601197602197603197604197605197606197607197608197609197610197611197612197613197614197615197616197617197618197619197620197621197622197623197624197625197626197627197628197629197630197631197632197633197634197635197636197637197638197639197640197641197642197643197644197645197646197647197648197649197650197651197652197653197654197655197656197657197658197659197660197661197662197663197664197665197666197667197668197669197670197671197672197673197674197675197676197677197678197679197680197681197682197683197684197685197686197687197688197689197690197691197692197693197694197695197696197697197698197699197700197701197702197703197704197705197706197707197708197709197710197711197712197713197714197715197716197717197718197719197720197721197722197723197724197725197726197727197728197729197730197731197732197733197734197735197736197737197738197739197740197741197742197743197744197745197746197747197748197749197750197751197752197753197754197755197756197757197758197759197760197761197762197763197764197765197766197767197768197769197770197771197772197773197774197775197776197777197778197779197780197781197782197783197784197785197786197787197788197789197790197791197792197793197794197795197796197797197798197799197800197801197802197803197804197805197806197807197808197809197810197811197812197813197814197815197816197817197818197819197820197821197822197823197824197825197826197827197828197829197830197831197832197833197834197835197836197837197838197839197840197841197842197843197844197845197846197847197848197849197850197851197852197853197854197855197856197857197858197859197860197861197862197863197864197865197866197867197868197869197870197871197872197873197874197875197876197877197878197879197880197881197882197883197884197885197886197887197888197889197890197891197892197893197894197895197896197897197898197899197900197901197902197903197904197905197906197907197908197909197910197911197912197913197914197915197916197917197918197919197920197921197922197923197924197925197926197927197928197929197930197931197932197933197934197935197936197937197938197939197940197941197942197943197944197945197946197947197948197949197950197951197952197953197954197955197956197957197958197959197960197961197962197963197964197965197966197967197968197969197970197971197972197973197974197975197976197977197978197979197980197981197982197983197984197985197986197987197988197989197990197991197992197993197994197995197996197997197998197999198000198001198002198003198004198005198006198007198008198009198010198011198012198013198014198015198016198017198018198019198020198021198022198023198024198025198026198027198028198029198030198031198032198033198034198035198036198037198038198039198040198041198042198043198044198045198046198047198048198049198050198051198052198053198054198055198056198057198058198059198060198061198062198063198064198065198066198067198068198069198070198071198072198073198074198075198076198077198078198079198080198081198082198083198084198085198086198087198088198089198090198091198092198093198094198095198096198097198098198099198100198101198102198103198104198105198106198107198108198109198110198111198112198113198114198115198116198117198118198119198120198121198122198123198124198125198126198127198128198129198130198131198132198133198134198135198136198137198138198139198140198141198142198143198144198145198146198147198148198149198150198151198152198153198154198155198156198157198158198159198160198161198162198163198164198165198166198167198168198169198170198171198172198173198174198175198176198177198178198179198180198181198182198183198184198185198186198187198188198189198190198191198192198193198194198195198196198197198198198199198200198201198202198203198204198205198206198207198208198209198210198211198212198213198214198215198216198217198218198219198220198221198222198223198224198225198226198227198228198229198230198231198232198233198234198235198236198237198238198239198240198241198242198243198244198245198246198247198248198249198250198251198252198253198254198255198256198257198258198259198260198261198262198263198264198265198266198267198268198269198270198271198272198273198274198275198276198277198278198279198280198281198282198283198284198285198286198287198288198289198290198291198292198293198294198295198296198297198298198299198300198301198302198303198304198305198306198307198308198309198310198311198312198313198314198315198316198317198318198319198320198321198322198323198324198325198326198327198328198329198330198331198332198333198334198335198336198337198338198339198340198341198342198343198344198345198346198347198348198349198350198351198352198353198354198355198356198357198358198359198360198361198362198363198364198365198366198367198368198369198370198371198372198373198374198375198376198377198378198379198380198381198382198383198384198385198386198387198388198389198390198391198392198393198394198395198396198397198398198399198400198401198402198403198404198405198406198407198408198409198410198411198412198413198414198415198416198417198418198419198420198421198422198423198424198425198426198427198428198429198430198431198432198433198434198435198436198437198438198439198440198441198442198443198444198445198446198447198448198449198450198451198452198453198454198455198456198457198458198459198460198461198462198463198464198465198466198467198468198469198470198471198472198473198474198475198476198477198478198479198480198481198482198483198484198485198486198487198488198489198490198491198492198493198494198495198496198497198498198499198500198501198502198503198504198505198506198507198508198509198510198511198512198513198514198515198516198517198518198519198520198521198522198523198524198525198526198527198528198529198530198531198532198533198534198535198536198537198538198539198540198541198542198543198544198545198546198547198548198549198550198551198552198553198554198555198556198557198558198559198560198561198562198563198564198565198566198567198568198569198570198571198572198573198574198575198576198577198578198579198580198581198582198583198584198585198586198587198588198589198590198591198592198593198594198595198596198597198598198599198600198601198602198603198604198605198606198607198608198609198610198611198612198613198614198615198616198617198618198619198620198621198622198623198624198625198626198627198628198629198630198631198632198633198634198635198636198637198638198639198640198641198642198643198644198645198646198647198648198649198650198651198652198653198654198655198656198657198658198659198660198661198662198663198664198665198666198667198668198669198670198671198672198673198674198675198676198677198678198679198680198681198682198683198684198685198686198687198688198689198690198691198692198693198694198695198696198697198698198699198700198701198702198703198704198705198706198707198708198709198710198711198712198713198714198715198716198717198718198719198720198721198722198723198724198725198726198727198728198729198730198731198732198733198734198735198736198737198738198739198740198741198742198743198744198745198746198747198748198749198750198751198752198753198754198755198756198757198758198759198760198761198762198763198764198765198766198767198768198769198770198771198772198773198774198775198776198777198778198779198780198781198782198783198784198785198786198787198788198789198790198791198792198793198794198795198796198797198798198799198800198801198802198803198804198805198806198807198808198809198810198811198812198813198814198815198816198817198818198819198820198821198822198823198824198825198826198827198828198829198830198831198832198833198834198835198836198837198838198839198840198841198842198843198844198845198846198847198848198849198850198851198852198853198854198855198856198857198858198859198860198861198862198863198864198865198866198867198868198869198870198871198872198873198874198875198876198877198878198879198880198881198882198883198884198885198886198887198888198889198890198891198892198893198894198895198896198897198898198899198900198901198902198903198904198905198906198907198908198909198910198911198912198913198914198915198916198917198918198919198920198921198922198923198924198925198926198927198928198929198930198931198932198933198934198935198936198937198938198939198940198941198942198943198944198945198946198947198948198949198950198951198952198953198954198955198956198957198958198959198960198961198962198963198964198965198966198967198968198969198970198971198972198973198974198975198976198977198978198979198980198981198982198983198984198985198986198987198988198989198990198991198992198993198994198995198996198997198998198999199000199001199002199003199004199005199006199007199008199009199010199011199012199013199014199015199016199017199018199019199020199021199022199023199024199025199026199027199028199029199030199031199032199033199034199035199036199037199038199039199040199041199042199043199044199045199046199047199048199049199050199051199052199053199054199055199056199057199058199059199060199061199062199063199064199065199066199067199068199069199070199071199072199073199074199075199076199077199078199079199080199081199082199083199084199085199086199087199088199089199090199091199092199093199094199095199096199097199098199099199100199101199102199103199104199105199106199107199108199109199110199111199112199113199114199115199116199117199118199119199120199121199122199123199124199125199126199127199128199129199130199131199132199133199134199135199136199137199138199139199140199141199142199143199144199145199146199147199148199149199150199151199152199153199154199155199156199157199158199159199160199161199162199163199164199165199166199167199168199169199170199171199172199173199174199175199176199177199178199179199180199181199182199183199184199185199186199187199188199189199190199191199192199193199194199195199196199197199198199199199200199201199202199203199204199205199206199207199208199209199210199211199212199213199214199215199216199217199218199219199220199221199222199223199224199225199226199227199228199229199230199231199232199233199234199235199236199237199238199239199240199241199242199243199244199245199246199247199248199249199250199251199252199253199254199255199256199257199258199259199260199261199262199263199264199265199266199267199268199269199270199271199272199273199274199275199276199277199278199279199280199281199282199283199284199285199286199287199288199289199290199291199292199293199294199295199296199297199298199299199300199301199302199303199304199305199306199307199308199309199310199311199312199313199314199315199316199317199318199319199320199321199322199323199324199325199326199327199328199329199330199331199332199333199334199335199336199337199338199339199340199341199342199343199344199345199346199347199348199349199350199351199352199353199354199355199356199357199358199359199360199361199362199363199364199365199366199367199368199369199370199371199372199373199374199375199376199377199378199379199380199381199382199383199384199385199386199387199388199389199390199391199392199393199394199395199396199397199398199399199400199401199402199403199404199405199406199407199408199409199410199411199412199413199414199415199416199417199418199419199420199421199422199423199424199425199426199427199428199429199430199431199432199433199434199435199436199437199438199439199440199441199442199443199444199445199446199447199448199449199450199451199452199453199454199455199456199457199458199459199460199461199462199463199464199465199466199467199468199469199470199471199472199473199474199475199476199477199478199479199480199481199482199483199484199485199486199487199488199489199490199491199492199493199494199495199496199497199498199499199500199501199502199503199504199505199506199507199508199509199510199511199512199513199514199515199516199517199518199519199520199521199522199523199524199525199526199527199528199529199530199531199532199533199534199535199536199537199538199539199540199541199542199543199544199545199546199547199548199549199550199551199552199553199554199555199556199557199558199559199560199561199562199563199564199565199566199567199568199569199570199571199572199573199574199575199576199577199578199579199580199581199582199583199584199585199586199587199588199589199590199591199592199593199594199595199596199597199598199599199600199601199602199603199604199605199606199607199608199609199610199611199612199613199614199615199616199617199618199619199620199621199622199623199624199625199626199627199628199629199630199631199632199633199634199635199636199637199638199639199640199641199642199643199644199645199646199647199648199649199650199651199652199653199654199655199656199657199658199659199660199661199662199663199664199665199666199667199668199669199670199671199672199673199674199675199676199677199678199679199680199681199682199683199684199685199686199687199688199689199690199691199692199693199694199695199696199697199698199699199700199701199702199703199704199705199706199707199708199709199710199711199712199713199714199715199716199717199718199719199720199721199722199723199724199725199726199727199728199729199730199731199732199733199734199735199736199737199738199739199740199741199742199743199744199745199746199747199748199749199750199751199752199753199754199755199756199757199758199759199760199761199762199763199764199765199766199767199768199769199770199771199772199773199774199775199776199777199778199779199780199781199782199783199784199785199786199787199788199789199790199791199792199793199794199795199796199797199798199799199800199801199802199803199804199805199806199807199808199809199810199811199812199813199814199815199816199817199818199819199820199821199822199823199824199825199826199827199828199829199830199831199832199833199834199835199836199837199838199839199840199841199842199843199844199845199846199847199848199849199850199851199852199853199854199855199856199857199858199859199860199861199862199863199864199865199866199867199868199869199870199871199872199873199874199875199876199877199878199879199880199881199882199883199884199885199886199887199888199889199890199891199892199893199894199895199896199897199898199899199900199901199902199903199904199905199906199907199908199909199910199911199912199913199914199915199916199917199918199919199920199921199922199923199924199925199926199927199928199929199930199931199932199933199934199935199936199937199938199939199940199941199942199943199944199945199946199947199948199949199950199951199952199953199954199955199956199957199958199959199960199961199962199963199964199965199966199967199968199969199970199971199972199973199974199975199976199977199978199979199980199981199982199983199984199985199986199987199988199989199990199991199992199993199994199995199996199997199998199999200000200001200002200003200004200005200006200007200008200009200010200011200012200013200014200015200016200017200018200019200020200021200022200023200024200025200026200027200028200029200030200031200032200033200034200035200036200037200038200039200040200041200042200043200044200045200046200047200048200049200050200051200052200053200054200055200056200057200058200059200060200061200062200063200064200065200066200067200068200069200070200071200072200073200074200075200076200077200078200079200080200081200082200083200084200085200086200087200088200089200090200091200092200093200094200095200096200097200098200099200100200101200102200103200104200105200106200107200108200109200110200111200112200113200114200115200116200117200118200119200120200121200122200123200124200125200126200127200128200129200130200131200132200133200134200135200136200137200138200139200140200141200142200143200144200145200146200147200148200149200150200151200152200153200154200155200156200157200158200159200160200161200162200163200164200165200166200167200168200169200170200171200172200173200174200175200176200177200178200179200180200181200182200183200184200185200186200187200188200189200190200191200192200193200194200195200196200197200198200199200200200201200202200203200204200205200206200207200208200209200210200211200212200213200214200215200216200217200218200219200220200221200222200223200224200225200226200227200228200229200230200231200232200233200234200235200236200237200238200239200240200241200242200243200244200245200246200247200248200249200250200251200252200253200254200255200256200257200258200259200260200261200262200263200264200265200266200267200268200269200270200271200272200273200274200275200276200277200278200279200280200281200282200283200284200285200286200287200288200289200290200291200292200293200294200295200296200297200298200299200300200301200302200303200304200305200306200307200308200309200310200311200312200313200314200315200316200317200318200319200320200321200322200323200324200325200326200327200328200329200330200331200332200333200334200335200336200337200338200339200340200341200342200343200344200345200346200347200348200349200350200351200352200353200354200355200356200357200358200359200360200361200362200363200364200365200366200367200368200369200370200371200372200373200374200375200376200377200378200379200380200381200382200383200384200385200386200387200388200389200390200391200392200393200394200395200396200397200398200399200400200401200402200403200404200405200406200407200408200409200410200411200412200413200414200415200416200417200418200419200420200421200422200423200424200425200426200427200428200429200430200431200432200433200434200435200436200437200438200439200440200441200442200443200444200445200446200447200448200449200450200451200452200453200454200455200456200457200458200459200460200461200462200463200464200465200466200467200468200469200470200471200472200473200474200475200476200477200478200479200480200481200482200483200484200485200486200487200488200489200490200491200492200493200494200495200496200497200498200499200500200501200502200503200504200505200506200507200508200509200510200511200512200513200514200515200516200517200518200519200520200521200522200523200524200525200526200527200528200529200530200531200532200533200534200535200536200537200538200539200540200541200542200543200544200545200546200547200548200549200550200551200552200553200554200555200556200557200558200559200560200561200562200563200564200565200566200567200568200569200570200571200572200573200574200575200576200577200578200579200580200581200582200583200584200585200586200587200588200589200590200591200592200593200594200595200596200597200598200599200600200601200602200603200604200605200606200607200608200609200610200611200612200613200614200615200616200617200618200619200620200621200622200623200624200625200626200627200628200629200630200631200632200633200634200635200636200637200638200639200640200641200642200643200644200645200646200647200648200649200650200651200652200653200654200655200656200657200658200659200660200661200662200663200664200665200666200667200668200669200670200671200672200673200674200675200676200677200678200679200680200681200682200683200684200685200686200687200688200689200690200691200692200693200694200695200696200697200698200699200700200701200702200703200704200705200706200707200708200709200710200711200712200713200714200715200716200717200718200719200720200721200722200723200724200725200726200727200728200729200730200731200732200733200734200735200736200737200738200739200740200741200742200743200744200745200746200747200748200749200750200751200752200753200754200755200756200757200758200759200760200761200762200763200764200765200766200767200768200769200770200771200772200773200774200775200776200777200778200779200780200781200782200783200784200785200786200787200788200789200790200791200792200793200794200795200796200797200798200799200800200801200802200803200804200805200806200807200808200809200810200811200812200813200814200815200816200817200818200819200820200821200822200823200824200825200826200827200828200829200830200831200832200833200834200835200836200837200838200839200840200841200842200843200844200845200846200847200848200849200850200851200852200853200854200855200856200857200858200859200860200861200862200863200864200865200866200867200868200869200870200871200872200873200874200875200876200877200878200879200880200881200882200883200884200885200886200887200888200889200890200891200892200893200894200895200896200897200898200899200900200901200902200903200904200905200906200907200908200909200910200911200912200913200914200915200916200917200918200919200920200921200922200923200924200925200926200927200928200929200930200931200932200933200934200935200936200937200938200939200940200941200942200943200944200945200946200947200948200949200950200951200952200953200954200955200956200957200958200959200960200961200962200963200964200965200966200967200968200969200970200971200972200973200974200975200976200977200978200979200980200981200982200983200984200985200986200987200988200989200990200991200992200993200994200995200996200997200998200999201000201001201002201003201004201005201006201007201008201009201010201011201012201013201014201015201016201017201018201019201020201021201022201023201024201025201026201027201028201029201030201031201032201033201034201035201036201037201038201039201040201041201042201043201044201045201046201047201048201049201050201051201052201053201054201055201056201057201058201059201060201061201062201063201064201065201066201067201068201069201070201071201072201073201074201075201076201077201078201079201080201081201082201083201084201085201086201087201088201089201090201091201092201093201094201095201096201097201098201099201100201101201102201103201104201105201106201107201108201109201110201111201112201113201114201115201116201117201118201119201120201121201122201123201124201125201126201127201128201129201130201131201132201133201134201135201136201137201138201139201140201141201142201143201144201145201146201147201148201149201150201151201152201153201154201155201156201157201158201159201160201161201162201163201164201165201166201167201168201169201170201171201172201173201174201175201176201177201178201179201180201181201182201183201184201185201186201187201188201189201190201191201192201193201194201195201196201197201198201199201200201201201202201203201204201205201206201207201208201209201210201211201212201213201214201215201216201217201218201219201220201221201222201223201224201225201226201227201228201229201230201231201232201233201234201235201236201237201238201239201240201241201242201243201244201245201246201247201248201249201250201251201252201253201254201255201256201257201258201259201260201261201262201263201264201265201266201267201268201269201270201271201272201273201274201275201276201277201278201279201280201281201282201283201284201285201286201287201288201289201290201291201292201293201294201295201296201297201298201299201300201301201302201303201304201305201306201307201308201309201310201311201312201313201314201315201316201317201318201319201320201321201322201323201324201325201326201327201328201329201330201331201332201333201334201335201336201337201338201339201340201341201342201343201344201345201346201347201348201349201350201351201352201353201354201355201356201357201358201359201360201361201362201363201364201365201366201367201368201369201370201371201372201373201374201375201376201377201378201379201380201381201382201383201384201385201386201387201388201389201390201391201392201393201394201395201396201397201398201399201400201401201402201403201404201405201406201407201408201409201410201411201412201413201414201415201416201417201418201419201420201421201422201423201424201425201426201427201428201429201430201431201432201433201434201435201436201437201438201439201440201441201442201443201444201445201446201447201448201449201450201451201452201453201454201455201456201457201458201459201460201461201462201463201464201465201466201467201468201469201470201471201472201473201474201475201476201477201478201479201480201481201482201483201484201485201486201487201488201489201490201491201492201493201494201495201496201497201498201499201500201501201502201503201504201505201506201507201508201509201510201511201512201513201514201515201516201517201518201519201520201521201522201523201524201525201526201527201528201529201530201531201532201533201534201535201536201537201538201539201540201541201542201543201544201545201546201547201548201549201550201551201552201553201554201555201556201557201558201559201560201561201562201563201564201565201566201567201568201569201570201571201572201573201574201575201576201577201578201579201580201581201582201583201584201585201586201587201588201589201590201591201592201593201594201595201596201597201598201599201600201601201602201603201604201605201606201607201608201609201610201611201612201613201614201615201616201617201618201619201620201621201622201623201624201625201626201627201628201629201630201631201632201633201634201635201636201637201638201639201640201641201642201643201644201645201646201647201648201649201650201651201652201653201654201655201656201657201658201659201660201661201662201663201664201665201666201667201668201669201670201671201672201673201674201675201676201677201678201679201680201681201682201683201684201685201686201687201688201689201690201691201692201693201694201695201696201697201698201699201700201701201702201703201704201705201706201707201708201709201710201711201712201713201714201715201716201717201718201719201720201721201722201723201724201725201726201727201728201729201730201731201732201733201734201735201736201737201738201739201740201741201742201743201744201745201746201747201748201749201750201751201752201753201754201755201756201757201758201759201760201761201762201763201764201765201766201767201768201769201770201771201772201773201774201775201776201777201778201779201780201781201782201783201784201785201786201787201788201789201790201791201792201793201794201795201796201797201798201799201800201801201802201803201804201805201806201807201808201809201810201811201812201813201814201815201816201817201818201819201820201821201822201823201824201825201826201827201828201829201830201831201832201833201834201835201836201837201838201839201840201841201842201843201844201845201846201847201848201849201850201851201852201853201854201855201856201857201858201859201860201861201862201863201864201865201866201867201868201869201870201871201872201873201874201875201876201877201878201879201880201881201882201883201884201885201886201887201888201889201890201891201892201893201894201895201896201897201898201899201900201901201902201903201904201905201906201907201908201909201910201911201912201913201914201915201916201917201918201919201920201921201922201923201924201925201926201927201928201929201930201931201932201933201934201935201936201937201938201939201940201941201942201943201944201945201946201947201948201949201950201951201952201953201954201955201956201957201958201959201960201961201962201963201964201965201966201967201968201969201970201971201972201973201974201975201976201977201978201979201980201981201982201983201984201985201986201987201988201989201990201991201992201993201994201995201996201997201998201999202000202001202002202003202004202005202006202007202008202009202010202011202012202013202014202015202016202017202018202019202020202021202022202023202024202025202026202027202028202029202030202031202032202033202034202035202036202037202038202039202040202041202042202043202044202045202046202047202048202049202050202051202052202053202054202055202056202057202058202059202060202061202062202063202064202065202066202067202068202069202070202071202072202073202074202075202076202077202078202079202080202081202082202083202084202085202086202087202088202089202090202091202092202093202094202095202096202097202098202099202100202101202102202103202104202105202106202107202108202109202110202111202112202113202114202115202116202117202118202119202120202121202122202123202124202125202126202127202128202129202130202131202132202133202134202135202136202137202138202139202140202141202142202143202144202145202146202147202148202149202150202151202152202153202154202155202156202157202158202159202160202161202162202163202164202165202166202167202168202169202170202171202172202173202174202175202176202177202178202179202180202181202182202183202184202185202186202187202188202189202190202191202192202193202194202195202196202197202198202199202200202201202202202203202204202205202206202207202208202209202210202211202212202213202214202215202216202217202218202219202220202221202222202223202224202225202226202227202228202229202230202231202232202233202234202235202236202237202238202239202240202241202242202243202244202245202246202247202248202249202250202251202252202253202254202255202256202257202258202259202260202261202262202263202264202265202266202267202268202269202270202271202272202273202274202275202276202277202278202279202280202281202282202283202284202285202286202287202288202289202290202291202292202293202294202295202296202297202298202299202300202301202302202303202304202305202306202307202308202309202310202311202312202313202314202315202316202317202318202319202320202321202322202323202324202325202326202327202328202329202330202331202332202333202334202335202336202337202338202339202340202341202342202343202344202345202346202347202348202349202350202351202352202353202354202355202356202357202358202359202360202361202362202363202364202365202366202367202368202369202370202371202372202373202374202375202376202377202378202379202380202381202382202383202384202385202386202387202388202389202390202391202392202393202394202395202396202397202398202399202400202401202402202403202404202405202406202407202408202409202410202411202412202413202414202415202416202417202418202419202420202421202422202423202424202425202426202427202428202429202430202431202432202433202434202435202436202437202438202439202440202441202442202443202444202445202446202447202448202449202450202451202452202453202454202455202456202457202458202459202460202461202462202463202464202465202466202467202468202469202470202471202472202473202474202475202476202477202478202479202480202481202482202483202484202485202486202487202488202489202490202491202492202493202494202495202496202497202498202499202500202501202502202503202504202505202506202507202508202509202510202511202512202513202514202515202516202517202518202519202520202521202522202523202524202525202526202527202528202529202530202531202532202533202534202535202536202537202538202539202540202541202542202543202544202545202546202547202548202549202550202551202552202553202554202555202556202557202558202559202560202561202562202563202564202565202566202567202568202569202570202571202572202573202574202575202576202577202578202579202580202581202582202583202584202585202586202587202588202589202590202591202592202593202594202595202596202597202598202599202600202601202602202603202604202605202606202607202608202609202610202611202612202613202614202615202616202617202618202619202620202621202622202623202624202625202626202627202628202629202630202631202632202633202634202635202636202637202638202639202640202641202642202643202644202645202646202647202648202649202650202651202652202653202654202655202656202657202658202659202660202661202662202663202664202665202666202667202668202669202670202671202672202673202674202675202676202677202678202679202680202681202682202683202684202685202686202687202688202689202690202691202692202693202694202695202696202697202698202699202700202701202702202703202704202705202706202707202708202709202710202711202712202713202714202715202716202717202718202719202720202721202722202723202724202725202726202727202728202729202730202731202732202733202734202735202736202737202738202739202740202741202742202743202744202745202746202747202748202749202750202751202752202753202754202755202756202757202758202759202760202761202762202763202764202765202766202767202768202769202770202771202772202773202774202775202776202777202778202779202780202781202782202783202784202785202786202787202788202789202790202791202792202793202794202795202796202797202798202799202800202801202802202803202804202805202806202807202808202809202810202811202812202813202814202815202816202817202818202819202820202821202822202823202824202825202826202827202828202829202830202831202832202833202834202835202836202837202838202839202840202841202842202843202844202845202846202847202848202849202850202851202852202853202854202855202856202857202858202859202860202861202862202863202864202865202866202867202868202869202870202871202872202873202874202875202876202877202878202879202880202881202882202883202884202885202886202887202888202889202890202891202892202893202894202895202896202897202898202899202900202901202902202903202904202905202906202907202908202909202910202911202912202913202914202915202916202917202918202919202920202921202922202923202924202925202926202927202928202929202930202931202932202933202934202935202936202937202938202939202940202941202942202943202944202945202946202947202948202949202950202951202952202953202954202955202956202957202958202959202960202961202962202963202964202965202966202967202968202969202970202971202972202973202974202975202976202977202978202979202980202981202982202983202984202985202986202987202988202989202990202991202992202993202994202995202996202997202998202999203000203001203002203003203004203005203006203007203008203009203010203011203012203013203014203015203016203017203018203019203020203021203022203023203024203025203026203027203028203029203030203031203032203033203034203035203036203037203038203039203040203041203042203043203044203045203046203047203048203049203050203051203052203053203054203055203056203057203058203059203060203061203062203063203064203065203066203067203068203069203070203071203072203073203074203075203076203077203078203079203080203081203082203083203084203085203086203087203088203089203090203091203092203093203094203095203096203097203098203099203100203101203102203103203104203105203106203107203108203109203110203111203112203113203114203115203116203117203118203119203120203121203122203123203124203125203126203127203128203129203130203131203132203133203134203135203136203137203138203139203140203141203142203143203144203145203146203147203148203149203150203151203152203153203154203155203156203157203158203159203160203161203162203163203164203165203166203167203168203169203170203171203172203173203174203175203176203177203178203179203180203181203182203183203184203185203186203187203188203189203190203191203192203193203194203195203196203197203198203199203200203201203202203203203204203205203206203207203208203209203210203211203212203213203214203215203216203217203218203219203220203221203222203223203224203225203226203227203228203229203230203231203232203233203234203235203236203237203238203239203240203241203242203243203244203245203246203247203248203249203250203251203252203253203254203255203256203257203258203259203260203261203262203263203264203265203266203267203268203269203270203271203272203273203274203275203276203277203278203279203280203281203282203283203284203285203286203287203288203289203290203291203292203293203294203295203296203297203298203299203300203301203302203303203304203305203306203307203308203309203310203311203312203313203314203315203316203317203318203319203320203321203322203323203324203325203326203327203328203329203330203331203332203333203334203335203336203337203338203339203340203341203342203343203344203345203346203347203348203349203350203351203352203353203354203355203356203357203358203359203360203361203362203363203364203365203366203367203368203369203370203371203372203373203374203375203376203377203378203379203380203381203382203383203384203385203386203387203388203389203390203391203392203393203394203395203396203397203398203399203400203401203402203403203404203405203406203407203408203409203410203411203412203413203414203415203416203417203418203419203420203421203422203423203424203425203426203427203428203429203430203431203432203433203434203435203436203437203438203439203440203441203442203443203444203445203446203447203448203449203450203451203452203453203454203455203456203457203458203459203460203461203462203463203464203465203466203467203468203469203470203471203472203473203474203475203476203477203478203479203480203481203482203483203484203485203486203487203488203489203490203491203492203493203494203495203496203497203498203499203500203501203502203503203504203505203506203507203508203509203510203511203512203513203514203515203516203517203518203519203520203521203522203523203524203525203526203527203528203529203530203531203532203533203534203535203536203537203538203539203540203541203542203543203544203545203546203547203548203549203550203551203552203553203554203555203556203557203558203559203560203561203562203563203564203565203566203567203568203569203570203571203572203573203574203575203576203577203578203579203580203581203582203583203584203585203586203587203588203589203590203591203592203593203594203595203596203597203598203599203600203601203602203603203604203605203606203607203608203609203610203611203612203613203614203615203616203617203618203619203620203621203622203623203624203625203626203627203628203629203630203631203632203633203634203635203636203637203638203639203640203641203642203643203644203645203646203647203648203649203650203651203652203653203654203655203656203657203658203659203660203661203662203663203664203665203666203667203668203669203670203671203672203673203674203675203676203677203678203679203680203681203682203683203684203685203686203687203688203689203690203691203692203693203694203695203696203697203698203699203700203701203702203703203704203705203706203707203708203709203710203711203712203713203714203715203716203717203718203719203720203721203722203723203724203725203726203727203728203729203730203731203732203733203734203735203736203737203738203739203740203741203742203743203744203745203746203747203748203749203750203751203752203753203754203755203756203757203758203759203760203761203762203763203764203765203766203767203768203769203770203771203772203773203774203775203776203777203778203779203780203781203782203783203784203785203786203787203788203789203790203791203792203793203794203795203796203797203798203799203800203801203802203803203804203805203806203807203808203809203810203811203812203813203814203815203816203817203818203819203820203821203822203823203824203825203826203827203828203829203830203831203832203833203834203835203836203837203838203839203840203841203842203843203844203845203846203847203848203849203850203851203852203853203854203855203856203857203858203859203860203861203862203863203864203865203866203867203868203869203870203871203872203873203874203875203876203877203878203879203880203881203882203883203884203885203886203887203888203889203890203891203892203893203894203895203896203897203898203899203900203901203902203903203904203905203906203907203908203909203910203911203912203913203914203915203916203917203918203919203920203921203922203923203924203925203926203927203928203929203930203931203932203933203934203935203936203937203938203939203940203941203942203943203944203945203946203947203948203949203950203951203952203953203954203955203956203957203958203959203960203961203962203963203964203965203966203967203968203969203970203971203972203973203974203975203976203977203978203979203980203981203982203983203984203985203986203987203988203989203990203991203992203993203994203995203996203997203998203999204000204001204002204003204004204005204006204007204008204009204010204011204012204013204014204015204016204017204018204019204020204021204022204023204024204025204026204027204028204029204030204031204032204033204034204035204036204037204038204039204040204041204042204043204044204045204046204047204048204049204050204051204052204053204054204055204056204057204058204059204060204061204062204063204064204065204066204067204068204069204070204071204072204073204074204075204076204077204078204079204080204081204082204083204084204085204086204087204088204089204090204091204092204093204094204095204096204097204098204099204100204101204102204103204104204105204106204107204108204109204110204111204112204113204114204115204116204117204118204119204120204121204122204123204124204125204126204127204128204129204130204131204132204133204134204135204136204137204138204139204140204141204142204143204144204145204146204147204148204149204150204151204152204153204154204155204156204157204158204159204160204161204162204163204164204165204166204167204168204169204170204171204172204173204174204175204176204177204178204179204180204181204182204183204184204185204186204187204188204189204190204191204192204193204194204195204196204197204198204199204200204201204202204203204204204205204206204207204208204209204210204211204212204213204214204215204216204217204218204219204220204221204222204223204224204225204226204227204228204229204230204231204232204233204234204235204236204237204238204239204240204241204242204243204244204245204246204247204248204249204250204251204252204253204254204255204256204257204258204259204260204261204262204263204264204265204266204267204268204269204270204271204272204273204274204275204276204277204278204279204280204281204282204283204284204285204286204287204288204289204290204291204292204293204294204295204296204297204298204299204300204301204302204303204304204305204306204307204308204309204310204311204312204313204314204315204316204317204318204319204320204321204322204323204324204325204326204327204328204329204330204331204332204333204334204335204336204337204338204339204340204341204342204343204344204345204346204347204348204349204350204351204352204353204354204355204356204357204358204359204360204361204362204363204364204365204366204367204368204369204370204371204372204373204374204375204376204377204378204379204380204381204382204383204384204385204386204387204388204389204390204391204392204393204394204395204396204397204398204399204400204401204402204403204404204405204406204407204408204409204410204411204412204413204414204415204416204417204418204419204420204421204422204423204424204425204426204427204428204429204430204431204432204433204434204435204436204437204438204439204440204441204442204443204444204445204446204447204448204449204450204451204452204453204454204455204456204457204458204459204460204461204462204463204464204465204466204467204468204469204470204471204472204473204474204475204476204477204478204479204480204481204482204483204484204485204486204487204488204489204490204491204492204493204494204495204496204497204498204499204500204501204502204503204504204505204506204507204508204509204510204511204512204513204514204515204516204517204518204519204520204521204522204523204524204525204526204527204528204529204530204531204532204533204534204535204536204537204538204539204540204541204542204543204544204545204546204547204548204549204550204551204552204553204554204555204556204557204558204559204560204561204562204563204564204565204566204567204568204569204570204571204572204573204574204575204576204577204578204579204580204581204582204583204584204585204586204587204588204589204590204591204592204593204594204595204596204597204598204599204600204601204602204603204604204605204606204607204608204609204610204611204612204613204614204615204616204617204618204619204620204621204622204623204624204625204626204627204628204629204630204631204632204633204634204635204636204637204638204639204640204641204642204643204644204645204646204647204648204649204650204651204652204653204654204655204656204657204658204659204660204661204662204663204664204665204666204667204668204669204670204671204672204673204674204675204676204677204678204679204680204681204682204683204684204685204686204687204688204689204690204691204692204693204694204695204696204697204698204699204700204701204702204703204704204705204706204707204708204709204710204711204712204713204714204715204716204717204718204719204720204721204722204723204724204725204726204727204728204729204730204731204732204733204734204735204736204737204738204739204740204741204742204743204744204745204746204747204748204749204750204751204752204753204754204755204756204757204758204759204760204761204762204763204764204765204766204767204768204769204770204771204772204773204774204775204776204777204778204779204780204781204782204783204784204785204786204787204788204789204790204791204792204793204794204795204796204797204798204799204800204801204802204803204804204805204806204807204808204809204810204811204812204813204814204815204816204817204818204819204820204821204822204823204824204825204826204827204828204829204830204831204832204833204834204835204836204837204838204839204840204841204842204843204844204845204846204847204848204849204850204851204852204853204854204855204856204857204858204859204860204861204862204863204864204865204866204867204868204869204870204871204872204873204874204875204876204877204878204879204880204881204882204883204884204885204886204887204888204889204890204891204892204893204894204895204896204897204898204899204900204901204902204903204904204905204906204907204908204909204910204911204912204913204914204915204916204917204918204919204920204921204922204923204924204925204926204927204928204929204930204931204932204933204934204935204936204937204938204939204940204941204942204943204944204945204946204947204948204949204950204951204952204953204954204955204956204957204958204959204960204961204962204963204964204965204966204967204968204969204970204971204972204973204974204975204976204977204978204979204980204981204982204983204984204985204986204987204988204989204990204991204992204993204994204995204996204997204998204999205000205001205002205003205004205005205006205007205008205009205010205011205012205013205014205015205016205017205018205019205020205021205022205023205024205025205026205027205028205029205030205031205032205033205034205035205036205037205038205039205040205041205042205043205044205045205046205047205048205049205050205051205052205053205054205055205056205057205058205059205060205061205062205063205064205065205066205067205068205069205070205071205072205073205074205075205076205077205078205079205080205081205082205083205084205085205086205087205088205089205090205091205092205093205094205095205096205097205098205099205100205101205102205103205104205105205106205107205108205109205110205111205112205113205114205115205116205117205118205119205120205121205122205123205124205125205126205127205128205129205130205131205132205133205134205135205136205137205138205139205140205141205142205143205144205145205146205147205148205149205150205151205152205153205154205155205156205157205158205159205160205161205162205163205164205165205166205167205168205169205170205171205172205173205174205175205176205177205178205179205180205181205182205183205184205185205186205187205188205189205190205191205192205193205194205195205196205197205198205199205200205201205202205203205204205205205206205207205208205209205210205211205212205213205214205215205216205217205218205219205220205221205222205223205224205225205226205227205228205229205230205231205232205233205234205235205236205237205238205239205240205241205242205243205244205245205246205247205248205249205250205251205252205253205254205255205256205257205258205259205260205261205262205263205264205265205266205267205268205269205270205271205272205273205274205275205276205277205278205279205280205281205282205283205284205285205286205287205288205289205290205291205292205293205294205295205296205297205298205299205300205301205302205303205304205305205306205307205308205309205310205311205312205313205314205315205316205317205318205319205320205321205322205323205324205325205326205327205328205329205330205331205332205333205334205335205336205337205338205339205340205341205342205343205344205345205346205347205348205349205350205351205352205353205354205355205356205357205358205359205360205361205362205363205364205365205366205367205368205369205370205371205372205373205374205375205376205377205378205379205380205381205382205383205384205385205386205387205388205389205390205391205392205393205394205395205396205397205398205399205400205401205402205403205404205405205406205407205408205409205410205411205412205413205414205415205416205417205418205419205420205421205422205423205424205425205426205427205428205429205430205431205432205433205434205435205436205437205438205439205440205441205442205443205444205445205446205447205448205449205450205451205452205453205454205455205456205457205458205459205460205461205462205463205464205465205466205467205468205469205470205471205472205473205474205475205476205477205478205479205480205481205482205483205484205485205486205487205488205489205490205491205492205493205494205495205496205497205498205499205500205501205502205503205504205505205506205507205508205509205510205511205512205513205514205515205516205517205518205519205520205521205522205523205524205525205526205527205528205529205530205531205532205533205534205535205536205537205538205539205540205541205542205543205544205545205546205547205548205549205550205551205552205553205554205555205556205557205558205559205560205561205562205563205564205565205566205567205568205569205570205571205572205573205574205575205576205577205578205579205580205581205582205583205584205585205586205587205588205589205590205591205592205593205594205595205596205597205598205599205600205601205602205603205604205605205606205607205608205609205610205611205612205613205614205615205616205617205618205619205620205621205622205623205624205625205626205627205628205629205630205631205632205633205634205635205636205637205638205639205640205641205642205643205644205645205646205647205648205649205650205651205652205653205654205655205656205657205658205659205660205661205662205663205664205665205666205667205668205669205670205671205672205673205674205675205676205677205678205679205680205681205682205683205684205685205686205687205688205689205690205691205692205693205694205695205696205697205698205699205700205701205702205703205704205705205706205707205708205709205710205711205712205713205714205715205716205717205718205719205720205721205722205723205724205725205726205727205728205729205730205731205732205733205734205735205736205737205738205739205740205741205742205743205744205745205746205747205748205749205750205751205752205753205754205755205756205757205758205759205760205761205762205763205764205765205766205767205768205769205770205771205772205773205774205775205776205777205778205779205780205781205782205783205784205785205786205787205788205789205790205791205792205793205794205795205796205797205798205799205800205801205802205803205804205805205806205807205808205809205810205811205812205813205814205815205816205817205818205819205820205821205822205823205824205825205826205827205828205829205830205831205832205833205834205835205836205837205838205839205840205841205842205843205844205845205846205847205848205849205850205851205852205853205854205855205856205857205858205859205860205861205862205863205864205865205866205867205868205869205870205871205872205873205874205875205876205877205878205879205880205881205882205883205884205885205886205887205888205889205890205891205892205893205894205895205896205897205898205899205900205901205902205903205904205905205906205907205908205909205910205911205912205913205914205915205916205917205918205919205920205921205922205923205924205925205926205927205928205929205930205931205932205933205934205935205936205937205938205939205940205941205942205943205944205945205946205947205948205949205950205951205952205953205954205955205956205957205958205959205960205961205962205963205964205965205966205967205968205969205970205971205972205973205974205975205976205977205978205979205980205981205982205983205984205985205986205987205988205989205990205991205992205993205994205995205996205997205998205999206000206001206002206003206004206005206006206007206008206009206010206011206012206013206014206015206016206017206018206019206020206021206022206023206024206025206026206027206028206029206030206031206032206033206034206035206036206037206038206039206040206041206042206043206044206045206046206047206048206049206050206051206052206053206054206055206056206057206058206059206060206061206062206063206064206065206066206067206068206069206070206071206072206073206074206075206076206077206078206079206080206081206082206083206084206085206086206087206088206089206090206091206092206093206094206095206096206097206098206099206100206101206102206103206104206105206106206107206108206109206110206111206112206113206114206115206116206117206118206119206120206121206122206123206124206125206126206127206128206129206130206131206132206133206134206135206136206137206138206139206140206141206142206143206144206145206146206147206148206149206150206151206152206153206154206155206156206157206158206159206160206161206162206163206164206165206166206167206168206169206170206171206172206173206174206175206176206177206178206179206180206181206182206183206184206185206186206187206188206189206190206191206192206193206194206195206196206197206198206199206200206201206202206203206204206205206206206207206208206209206210206211206212206213206214206215206216206217206218206219206220206221206222206223206224206225206226206227206228206229206230206231206232206233206234206235206236206237206238206239206240206241206242206243206244206245206246206247206248206249206250206251206252206253206254206255206256206257206258206259206260206261206262206263206264206265206266206267206268206269206270206271206272206273206274206275206276206277206278206279206280206281206282206283206284206285206286206287206288206289206290206291206292206293206294206295206296206297206298206299206300206301206302206303206304206305206306206307206308206309206310206311206312206313206314206315206316206317206318206319206320206321206322206323206324206325206326206327206328206329206330206331206332206333206334206335206336206337206338206339206340206341206342206343206344206345206346206347206348206349206350206351206352206353206354206355206356206357206358206359206360206361206362206363206364206365206366206367206368206369206370206371206372206373206374206375206376206377206378206379206380206381206382206383206384206385206386206387206388206389206390206391206392206393206394206395206396206397206398206399206400206401206402206403206404206405206406206407206408206409206410206411206412206413206414206415206416206417206418206419206420206421206422206423206424206425206426206427206428206429206430206431206432206433206434206435206436206437206438206439206440206441206442206443206444206445206446206447206448206449206450206451206452206453206454206455206456206457206458206459206460206461206462206463206464206465206466206467206468206469206470206471206472206473206474206475206476206477206478206479206480206481206482206483206484206485206486206487206488206489206490206491206492206493206494206495206496206497206498206499206500206501206502206503206504206505206506206507206508206509206510206511206512206513206514206515206516206517206518206519206520206521206522206523206524206525206526206527206528206529206530206531206532206533206534206535206536206537206538206539206540206541206542206543206544206545206546206547206548206549206550206551206552206553206554206555206556206557206558206559206560206561206562206563206564206565206566206567206568206569206570206571206572206573206574206575206576206577206578206579206580206581206582206583206584206585206586206587206588206589206590206591206592206593206594206595206596206597206598206599206600206601206602206603206604206605206606206607206608206609206610206611206612206613206614206615206616206617206618206619206620206621206622206623206624206625206626206627206628206629206630206631206632206633206634206635206636206637206638206639206640206641206642206643206644206645206646206647206648206649206650206651206652206653206654206655206656206657206658206659206660206661206662206663206664206665206666206667206668206669206670206671206672206673206674206675206676206677206678206679206680206681206682206683206684206685206686206687206688206689206690206691206692206693206694206695206696206697206698206699206700206701206702206703206704206705206706206707206708206709206710206711206712206713206714206715206716206717206718206719206720206721206722206723206724206725206726206727206728206729206730206731206732206733206734206735206736206737206738206739206740206741206742206743206744206745206746206747206748206749206750206751206752206753206754206755206756206757206758206759206760206761206762206763206764206765206766206767206768206769206770206771206772206773206774206775206776206777206778206779206780206781206782206783206784206785206786206787206788206789206790206791206792206793206794206795206796206797206798206799206800206801206802206803206804206805206806206807206808206809206810206811206812206813206814206815206816206817206818206819206820206821206822206823206824206825206826206827206828206829206830206831206832206833206834206835206836206837206838206839206840206841206842206843206844206845206846206847206848206849206850206851206852206853206854206855206856206857206858206859206860206861206862206863206864206865206866206867206868206869206870206871206872206873206874206875206876206877206878206879206880206881206882206883206884206885206886206887206888206889206890206891206892206893206894206895206896206897206898206899206900206901206902206903206904206905206906206907206908206909206910206911206912206913206914206915206916206917206918206919206920206921206922206923206924206925206926206927206928206929206930206931206932206933206934206935206936206937206938206939206940206941206942206943206944206945206946206947206948206949206950206951206952206953206954206955206956206957206958206959206960206961206962206963206964206965206966206967206968206969206970206971206972206973206974206975206976206977206978206979206980206981206982206983206984206985206986206987206988206989206990206991206992206993206994206995206996206997206998206999207000207001207002207003207004207005207006207007207008207009207010207011207012207013207014207015207016207017207018207019207020207021207022207023207024207025207026207027207028207029207030207031207032207033207034207035207036207037207038207039207040207041207042207043207044207045207046207047207048207049207050207051207052207053207054207055207056207057207058207059207060207061207062207063207064207065207066207067207068207069207070207071207072207073207074207075207076207077207078207079207080207081207082207083207084207085207086207087207088207089207090207091207092207093207094207095207096207097207098207099207100207101207102207103207104207105207106207107207108207109207110207111207112207113207114207115207116207117207118207119207120207121207122207123207124207125207126207127207128207129207130207131207132207133207134207135207136207137207138207139207140207141207142207143207144207145207146207147207148207149207150207151207152207153207154207155207156207157207158207159207160207161207162207163207164207165207166207167207168207169207170207171207172207173207174207175207176207177207178207179207180207181207182207183207184207185207186207187207188207189207190207191207192207193207194207195207196207197207198207199207200207201207202207203207204207205207206207207207208207209207210207211207212207213207214207215207216207217207218207219207220207221207222207223207224207225207226207227207228207229207230207231207232207233207234207235207236207237207238207239207240207241207242207243207244207245207246207247207248207249207250207251207252207253207254207255207256207257207258207259207260207261207262207263207264207265207266207267207268207269207270207271207272207273207274207275207276207277207278207279207280207281207282207283207284207285207286207287207288207289207290207291207292207293207294207295207296207297207298207299207300207301207302207303207304207305207306207307207308207309207310207311207312207313207314207315207316207317207318207319207320207321207322207323207324207325207326207327207328207329207330207331207332207333207334207335207336207337207338207339207340207341207342207343207344207345207346207347207348207349207350207351207352207353207354207355207356207357207358207359207360207361207362207363207364207365207366207367207368207369207370207371207372207373207374207375207376207377207378207379207380207381207382207383207384207385207386207387207388207389207390207391207392207393207394207395207396207397207398207399207400207401207402207403207404207405207406207407207408207409207410207411207412207413207414207415207416207417207418207419207420207421207422207423207424207425207426207427207428207429207430207431207432207433207434207435207436207437207438207439207440207441207442207443207444207445207446207447207448207449207450207451207452207453207454207455207456207457207458207459207460207461207462207463207464207465207466207467207468207469207470207471207472207473207474207475207476207477207478207479207480207481207482207483207484207485207486207487207488207489207490207491207492207493207494207495207496207497207498207499207500207501207502207503207504207505207506207507207508207509207510207511207512207513207514207515207516207517207518207519207520207521207522207523207524207525207526207527207528207529207530207531207532207533207534207535207536207537207538207539207540207541207542207543207544207545207546207547207548207549207550207551207552207553207554207555207556207557207558207559207560207561207562207563207564207565207566207567207568207569207570207571207572207573207574207575207576207577207578207579207580207581207582207583207584207585207586207587207588207589207590207591207592207593207594207595207596207597207598207599207600207601207602207603207604207605207606207607207608207609207610207611207612207613207614207615207616207617207618207619207620207621207622207623207624207625207626207627207628207629207630207631207632207633207634207635207636207637207638207639207640207641207642207643207644207645207646207647207648207649207650207651207652207653207654207655207656207657207658207659207660207661207662207663207664207665207666207667207668207669207670207671207672207673207674207675207676207677207678207679207680207681207682207683207684207685207686207687207688207689207690207691207692207693207694207695207696207697207698207699207700207701207702207703207704207705207706207707207708207709207710207711207712207713207714207715207716207717207718207719207720207721207722207723207724207725207726207727207728207729207730207731207732207733207734207735207736207737207738207739207740207741207742207743207744207745207746207747207748207749207750207751207752207753207754207755207756207757207758207759207760207761207762207763207764207765207766207767207768207769207770207771207772207773207774207775207776207777207778207779207780207781207782207783207784207785207786207787207788207789207790207791207792207793207794207795207796207797207798207799207800207801207802207803207804207805207806207807207808207809207810207811207812207813207814207815207816207817207818207819207820207821207822207823207824207825207826207827207828207829207830207831207832207833207834207835207836207837207838207839207840207841207842207843207844207845207846207847207848207849207850207851207852207853207854207855207856207857207858207859207860207861207862207863207864207865207866207867207868207869207870207871207872207873207874207875207876207877207878207879207880207881207882207883207884207885207886207887207888207889207890207891207892207893207894207895207896207897207898207899207900207901207902207903207904207905207906207907207908207909207910207911207912207913207914207915207916207917207918207919207920207921207922207923207924207925207926207927207928207929207930207931207932207933207934207935207936207937207938207939207940207941207942207943207944207945207946207947207948207949207950207951207952207953207954207955207956207957207958207959207960207961207962207963207964207965207966207967207968207969207970207971207972207973207974207975207976207977207978207979207980207981207982207983207984207985207986207987207988207989207990207991207992207993207994207995207996207997207998207999208000208001208002208003208004208005208006208007208008208009208010208011208012208013208014208015208016208017208018208019208020208021208022208023208024208025208026208027208028208029208030208031208032208033208034208035208036208037208038208039208040208041208042208043208044208045208046208047208048208049208050208051208052208053208054208055208056208057208058208059208060208061208062208063208064208065208066208067208068208069208070208071208072208073208074208075208076208077208078208079208080208081208082208083208084208085208086208087208088208089208090208091208092208093208094208095208096208097208098208099208100208101208102208103208104208105208106208107208108208109208110208111208112208113208114208115208116208117208118208119208120208121208122208123208124208125208126208127208128208129208130208131208132208133208134208135208136208137208138208139208140208141208142208143208144208145208146208147208148208149208150208151208152208153208154208155208156208157208158208159208160208161208162208163208164208165208166208167208168208169208170208171208172208173208174208175208176208177208178208179208180208181208182208183208184208185208186208187208188208189208190208191208192208193208194208195208196208197208198208199208200208201208202208203208204208205208206208207208208208209208210208211208212208213208214208215208216208217208218208219208220208221208222208223208224208225208226208227208228208229208230208231208232208233208234208235208236208237208238208239208240208241208242208243208244208245208246208247208248208249208250208251208252208253208254208255208256208257208258208259208260208261208262208263208264208265208266208267208268208269208270208271208272208273208274208275208276208277208278208279208280208281208282208283208284208285208286208287208288208289208290208291208292208293208294208295208296208297208298208299208300208301208302208303208304208305208306208307208308208309208310208311208312208313208314208315208316208317208318208319208320208321208322208323208324208325208326208327208328208329208330208331208332208333208334208335208336208337208338208339208340208341208342208343208344208345208346208347208348208349208350208351208352208353208354208355208356208357208358208359208360208361208362208363208364208365208366208367208368208369208370208371208372208373208374208375208376208377208378208379208380208381208382208383208384208385208386208387208388208389208390208391208392208393208394208395208396208397208398208399208400208401208402208403208404208405208406208407208408208409208410208411208412208413208414208415208416208417208418208419208420208421208422208423208424208425208426208427208428208429208430208431208432208433208434208435208436208437208438208439208440208441208442208443208444208445208446208447208448208449208450208451208452208453208454208455208456208457208458208459208460208461208462208463208464208465208466208467208468208469208470208471208472208473208474208475208476208477208478208479208480208481208482208483208484208485208486208487208488208489208490208491208492208493208494208495208496208497208498208499208500208501208502208503208504208505208506208507208508208509208510208511208512208513208514208515208516208517208518208519208520208521208522208523208524208525208526208527208528208529208530208531208532208533208534208535208536208537208538208539208540208541208542208543208544208545208546208547208548208549208550208551208552208553208554208555208556208557208558208559208560208561208562208563208564208565208566208567208568208569208570208571208572208573208574208575208576208577208578208579208580208581208582208583208584208585208586208587208588208589208590208591208592208593208594208595208596208597208598208599208600208601208602208603208604208605208606208607208608208609208610208611208612208613208614208615208616208617208618208619208620208621208622208623208624208625208626208627208628208629208630208631208632208633208634208635208636208637208638208639208640208641208642208643208644208645208646208647208648208649208650208651208652208653208654208655208656208657208658208659208660208661208662208663208664208665208666208667208668208669208670208671208672208673208674208675208676208677208678208679208680208681208682208683208684208685208686208687208688208689208690208691208692208693208694208695208696208697208698208699208700208701208702208703208704208705208706208707208708208709208710208711208712208713208714208715208716208717208718208719208720208721208722208723208724208725208726208727208728208729208730208731208732208733208734208735208736208737208738208739208740208741208742208743208744208745208746208747208748208749208750208751208752208753208754208755208756208757208758208759208760208761208762208763208764208765208766208767208768208769208770208771208772208773208774208775208776208777208778208779208780208781208782208783208784208785208786208787208788208789208790208791208792208793208794208795208796208797208798208799208800208801208802208803208804208805208806208807208808208809208810208811208812208813208814208815208816208817208818208819208820208821208822208823208824208825208826208827208828208829208830208831208832208833208834208835208836208837208838208839208840208841208842208843208844208845208846208847208848208849208850208851208852208853208854208855208856208857208858208859208860208861208862208863208864208865208866208867208868208869208870208871208872208873208874208875208876208877208878208879208880208881208882208883208884208885208886208887208888208889208890208891208892208893208894208895208896208897208898208899208900208901208902208903208904208905208906208907208908208909208910208911208912208913208914208915208916208917208918208919208920208921208922208923208924208925208926208927208928208929208930208931208932208933208934208935208936208937208938208939208940208941208942208943208944208945208946208947208948208949208950208951208952208953208954208955208956208957208958208959208960208961208962208963208964208965208966208967208968208969208970208971208972208973208974208975208976208977208978208979208980208981208982208983208984208985208986208987208988208989208990208991208992208993208994208995208996208997208998208999209000209001209002209003209004209005209006209007209008209009209010209011209012209013209014209015209016209017209018209019209020209021209022209023209024209025209026209027209028209029209030209031209032209033209034209035209036209037209038209039209040209041209042209043209044209045209046209047209048209049209050209051209052209053209054209055209056209057209058209059209060209061209062209063209064209065209066209067209068209069209070209071209072209073209074209075209076209077209078209079209080209081209082209083209084209085209086209087209088209089209090209091209092209093209094209095209096209097209098209099209100209101209102209103209104209105209106209107209108209109209110209111209112209113209114209115209116209117209118209119209120209121209122209123209124209125209126209127209128209129209130209131209132209133209134209135209136209137209138209139209140209141209142209143209144209145209146209147209148209149209150209151209152209153209154209155209156209157209158209159209160209161209162209163209164209165209166209167209168209169209170209171209172209173209174209175209176209177209178209179209180209181209182209183209184209185209186209187209188209189209190209191209192209193209194209195209196209197209198209199209200209201209202209203209204209205209206209207209208209209209210209211209212209213209214209215209216209217209218209219209220209221209222209223209224209225209226209227209228209229209230209231209232209233209234209235209236209237209238209239209240209241209242209243209244209245209246209247209248209249209250209251209252209253209254209255209256209257209258209259209260209261209262209263209264209265209266209267209268209269209270209271209272209273209274209275209276209277209278209279209280209281209282209283209284209285209286209287209288209289209290209291209292209293209294209295209296209297209298209299209300209301209302209303209304209305209306209307209308209309209310209311209312209313209314209315209316209317209318209319209320209321209322209323209324209325209326209327209328209329209330209331209332209333209334209335209336209337209338209339209340209341209342209343209344209345209346209347209348209349209350209351209352209353209354209355209356209357209358209359209360209361209362209363209364209365209366209367209368209369209370209371209372209373209374209375209376209377209378209379209380209381209382209383209384209385209386209387209388209389209390209391209392209393209394209395209396209397209398209399209400209401209402209403209404209405209406209407209408209409209410209411209412209413209414209415209416209417209418209419209420209421209422209423209424209425209426209427209428209429209430209431209432209433209434209435209436209437209438209439209440209441209442209443209444209445209446209447209448209449209450209451209452209453209454209455209456209457209458209459209460209461209462209463209464209465209466209467209468209469209470209471209472209473209474209475209476209477209478209479209480209481209482209483209484209485209486209487209488209489209490209491209492209493209494209495209496209497209498209499209500209501209502209503209504209505209506209507209508209509209510209511209512209513209514209515209516209517209518209519209520209521209522209523209524209525209526209527209528209529209530209531209532209533209534209535209536209537209538209539209540209541209542209543209544209545209546209547209548209549209550209551209552209553209554209555209556209557209558209559209560209561209562209563209564209565209566209567209568209569209570209571209572209573209574209575209576209577209578209579209580209581209582209583209584209585209586209587209588209589209590209591209592209593209594209595209596209597209598209599209600209601209602209603209604209605209606209607209608209609209610209611209612209613209614209615209616209617209618209619209620209621209622209623209624209625209626209627209628209629209630209631209632209633209634209635209636209637209638209639209640209641209642209643209644209645209646209647209648209649209650209651209652209653209654209655209656209657209658209659209660209661209662209663209664209665209666209667209668209669209670209671209672209673209674209675209676209677209678209679209680209681209682209683209684209685209686209687209688209689209690209691209692209693209694209695209696209697209698209699209700209701209702209703209704209705209706209707209708209709209710209711209712209713209714209715209716209717209718209719209720209721209722209723209724209725209726209727209728209729209730209731209732209733209734209735209736209737209738209739209740209741209742209743209744209745209746209747209748209749209750209751209752209753209754209755209756209757209758209759209760209761209762209763209764209765209766209767209768209769209770209771209772209773209774209775209776209777209778209779209780209781209782209783209784209785209786209787209788209789209790209791209792209793209794209795209796209797209798209799209800209801209802209803209804209805209806209807209808209809209810209811209812209813209814209815209816209817209818209819209820209821209822209823209824209825209826209827209828209829209830209831209832209833209834209835209836209837209838209839209840209841209842209843209844209845209846209847209848209849209850209851209852209853209854209855209856209857209858209859209860209861209862209863209864209865209866209867209868209869209870209871209872209873209874209875209876209877209878209879209880209881209882209883209884209885209886209887209888209889209890209891209892209893209894209895209896209897209898209899209900209901209902209903209904209905209906209907209908209909209910209911209912209913209914209915209916209917209918209919209920209921209922209923209924209925209926209927209928209929209930209931209932209933209934209935209936209937209938209939209940209941209942209943209944209945209946209947209948209949209950209951209952209953209954209955209956209957209958209959209960209961209962209963209964209965209966209967209968209969209970209971209972209973209974209975209976209977209978209979209980209981209982209983209984209985209986209987209988209989209990209991209992209993209994209995209996209997209998209999210000210001210002210003210004210005210006210007210008210009210010210011210012210013210014210015210016210017210018210019210020210021210022210023210024210025210026210027210028210029210030210031210032210033210034210035210036210037210038210039210040210041210042210043210044210045210046210047210048210049210050210051210052210053210054210055210056210057210058210059210060210061210062210063210064210065210066210067210068210069210070210071210072210073210074210075210076210077210078210079210080210081210082210083210084210085210086210087210088210089210090210091210092210093210094210095210096210097210098210099210100210101210102210103210104210105210106210107210108210109210110210111210112210113210114210115210116210117210118210119210120210121210122210123210124210125210126210127210128210129210130210131210132210133210134210135210136210137210138210139210140210141210142210143210144210145210146210147210148210149210150210151210152210153210154210155210156210157210158210159210160210161210162210163210164210165210166210167210168210169210170210171210172210173210174210175210176210177210178210179210180210181210182210183210184210185210186210187210188210189210190210191210192210193210194210195210196210197210198210199210200210201210202210203210204210205210206210207210208210209210210210211210212210213210214210215210216210217210218210219210220210221210222210223210224210225210226210227210228210229210230210231210232210233210234210235210236210237210238210239210240210241210242210243210244210245210246210247210248210249210250210251210252210253210254210255210256210257210258210259210260210261210262210263210264210265210266210267210268210269210270210271210272210273210274210275210276210277210278210279210280210281210282210283210284210285210286210287210288210289210290210291210292210293210294210295210296210297210298210299210300210301210302210303210304210305210306210307210308210309210310210311210312210313210314210315210316210317210318210319210320210321210322210323210324210325210326210327210328210329210330210331210332210333210334210335210336210337210338210339210340210341210342210343210344210345210346210347210348210349210350210351210352210353210354210355210356210357210358210359210360210361210362210363210364210365210366210367210368210369210370210371210372210373210374210375210376210377210378210379210380210381210382210383210384210385210386210387210388210389210390210391210392210393210394210395210396210397210398210399210400210401210402210403210404210405210406210407210408210409210410210411210412210413210414210415210416210417210418210419210420210421210422210423210424210425210426210427210428210429210430210431210432210433210434210435210436210437210438210439210440210441210442210443210444210445210446210447210448210449210450210451210452210453210454210455210456210457210458210459210460210461210462210463210464210465210466210467210468210469210470210471210472210473210474210475210476210477210478210479210480210481210482210483210484210485210486210487210488210489210490210491210492210493210494210495210496210497210498210499210500210501210502210503210504210505210506210507210508210509210510210511210512210513210514210515210516210517210518210519210520210521210522210523210524210525210526210527210528210529210530210531210532210533210534210535210536210537210538210539210540210541210542210543210544210545210546210547210548210549210550210551210552210553210554210555210556210557210558210559210560210561210562210563210564210565210566210567210568210569210570210571210572210573210574210575210576210577210578210579210580210581210582210583210584210585210586210587210588210589210590210591210592210593210594210595210596210597210598210599210600210601210602210603210604210605210606210607210608210609210610210611210612210613210614210615210616210617210618210619210620210621210622210623210624210625210626210627210628210629210630210631210632210633210634210635210636210637210638210639210640210641210642210643210644210645210646210647210648210649210650210651210652210653210654210655210656210657210658210659210660210661210662210663210664210665210666210667210668210669210670210671210672210673210674210675210676210677210678210679210680210681210682210683210684210685210686210687210688210689210690210691210692210693210694210695210696210697210698210699210700210701210702210703210704210705210706210707210708210709210710210711210712210713210714210715210716210717210718210719210720210721210722210723210724210725210726210727210728210729210730210731210732210733210734210735210736210737210738210739210740210741210742210743210744210745210746210747210748210749210750210751210752210753210754210755210756210757210758210759210760210761210762210763210764210765210766210767210768210769210770210771210772210773210774210775210776210777210778210779210780210781210782210783210784210785210786210787210788210789210790210791210792210793210794210795210796210797210798210799210800210801210802210803210804210805210806210807210808210809210810210811210812210813210814210815210816210817210818210819210820210821210822210823210824210825210826210827210828210829210830210831210832210833210834210835210836210837210838210839210840210841210842210843210844210845210846210847210848210849210850210851210852210853210854210855210856210857210858210859210860210861210862210863210864210865210866210867210868210869210870210871210872210873210874210875210876210877210878210879210880210881210882210883210884210885210886210887210888210889210890210891210892210893210894210895210896210897210898210899210900210901210902210903210904210905210906210907210908210909210910210911210912210913210914210915210916210917210918210919210920210921210922210923210924210925210926210927210928210929210930210931210932210933210934210935210936210937210938210939210940210941210942210943210944210945210946210947210948210949210950210951210952210953210954210955210956210957210958210959210960210961210962210963210964210965210966210967210968210969210970210971210972210973210974210975210976210977210978210979210980210981210982210983210984210985210986210987210988210989210990210991210992210993210994210995210996210997210998210999211000211001211002211003211004211005211006211007211008211009211010211011211012211013211014211015211016211017211018211019211020211021211022211023211024211025211026211027211028211029211030211031211032211033211034211035211036211037211038211039211040211041211042211043211044211045211046211047211048211049211050211051211052211053211054211055211056211057211058211059211060211061211062211063211064211065211066211067211068211069211070211071211072211073211074211075211076211077211078211079211080211081211082211083211084211085211086211087211088211089211090211091211092211093211094211095211096211097211098211099211100211101211102211103211104211105211106211107211108211109211110211111211112211113211114211115211116211117211118211119211120211121211122211123211124211125211126211127211128211129211130211131211132211133211134211135211136211137211138211139211140211141211142211143211144211145211146211147211148211149211150211151211152211153211154211155211156211157211158211159211160211161211162211163211164211165211166211167211168211169211170211171211172211173211174211175211176211177211178211179211180211181211182211183211184211185211186211187211188211189211190211191211192211193211194211195211196211197211198211199211200211201211202211203211204211205211206211207211208211209211210211211211212211213211214211215211216211217211218211219211220211221211222211223211224211225211226211227211228211229211230211231211232211233211234211235211236211237211238211239211240211241211242211243211244211245211246211247211248211249211250211251211252211253211254211255211256211257211258211259211260211261211262211263211264211265211266211267211268211269211270211271211272211273211274211275211276211277211278211279211280211281211282211283211284211285211286211287211288211289211290211291211292211293211294211295211296211297211298211299211300211301211302211303211304211305211306211307211308211309211310211311211312211313211314211315211316211317211318211319211320211321211322211323211324211325211326211327211328211329211330211331211332211333211334211335211336211337211338211339211340211341211342211343211344211345211346211347211348211349211350211351211352211353211354211355211356211357211358211359211360211361211362211363211364211365211366211367211368211369211370211371211372211373211374211375211376211377211378211379211380211381211382211383211384211385211386211387211388211389211390211391211392211393211394211395211396211397211398211399211400211401211402211403211404211405211406211407211408211409211410211411211412211413211414211415211416211417211418211419211420211421211422211423211424211425211426211427211428211429211430211431211432211433211434211435211436211437211438211439211440211441211442211443211444211445211446211447211448211449211450211451211452211453211454211455211456211457211458211459211460211461211462211463211464211465211466211467211468211469211470211471211472211473211474211475211476211477211478211479211480211481211482211483211484211485211486211487211488211489211490211491211492211493211494211495211496211497211498211499211500211501211502211503211504211505211506211507211508211509211510211511211512211513211514211515211516211517211518211519211520211521211522211523211524211525211526211527211528211529211530211531211532211533211534211535211536211537211538211539211540211541211542211543211544211545211546211547211548211549211550211551211552211553211554211555211556211557211558211559211560211561211562211563211564211565211566211567211568211569211570211571211572211573211574211575211576211577211578211579211580211581211582211583211584211585211586211587211588211589211590211591211592211593211594211595211596211597211598211599211600211601211602211603211604211605211606211607211608211609211610211611211612211613211614211615211616211617211618211619211620211621211622211623211624211625211626211627211628211629211630211631211632211633211634211635211636211637211638211639211640211641211642211643211644211645211646211647211648211649211650211651211652211653211654211655211656211657211658211659211660211661211662211663211664211665211666211667211668211669211670211671211672211673211674211675211676211677211678211679211680211681211682211683211684211685211686211687211688211689211690211691211692211693211694211695211696211697211698211699211700211701211702211703211704211705211706211707211708211709211710211711211712211713211714211715211716211717211718211719211720211721211722211723211724211725211726211727211728211729211730211731211732211733211734211735211736211737211738211739211740211741211742211743211744211745211746211747211748211749211750211751211752211753211754211755211756211757211758211759211760211761211762211763211764211765211766211767211768211769211770211771211772211773211774211775211776211777211778211779211780211781211782211783211784211785211786211787211788211789211790211791211792211793211794211795211796211797211798211799211800211801211802211803211804211805211806211807211808211809211810211811211812211813211814211815211816211817211818211819211820211821211822211823211824211825211826211827211828211829211830211831211832211833211834211835211836211837211838211839211840211841211842211843211844211845211846211847211848211849211850211851211852211853211854211855211856211857211858211859211860211861211862211863211864211865211866211867211868211869211870211871211872211873211874211875211876211877211878211879211880211881211882211883211884211885211886211887211888211889211890211891211892211893211894211895211896211897211898211899211900211901211902211903211904211905211906211907211908211909211910211911211912211913211914211915211916211917211918211919211920211921211922211923211924211925211926211927211928211929211930211931211932211933211934211935211936211937211938211939211940211941211942211943211944211945211946211947211948211949211950211951211952211953211954211955211956211957211958211959211960211961211962211963211964211965211966211967211968211969211970211971211972211973211974211975211976211977211978211979211980211981211982211983211984211985211986211987211988211989211990211991211992211993211994211995211996211997211998211999212000212001212002212003212004212005212006212007212008212009212010212011212012212013212014212015212016212017212018212019212020212021212022212023212024212025212026212027212028212029212030212031212032212033212034212035212036212037212038212039212040212041212042212043212044212045212046212047212048212049212050212051212052212053212054212055212056212057212058212059212060212061212062212063212064212065212066212067212068212069212070212071212072212073212074212075212076212077212078212079212080212081212082212083212084212085212086212087212088212089212090212091212092212093212094212095212096212097212098212099212100212101212102212103212104212105212106212107212108212109212110212111212112212113212114212115212116212117212118212119212120212121212122212123212124212125212126212127212128212129212130212131212132212133212134212135212136212137212138212139212140212141212142212143212144212145212146212147212148212149212150212151212152212153212154212155212156212157212158212159212160212161212162212163212164212165212166212167212168212169212170212171212172212173212174212175212176212177212178212179212180212181212182212183212184212185212186212187212188212189212190212191212192212193212194212195212196212197212198212199212200212201212202212203212204212205212206212207212208212209212210212211212212212213212214212215212216212217212218212219212220212221212222212223212224212225212226212227212228212229212230212231212232212233212234212235212236212237212238212239212240212241212242212243212244212245212246212247212248212249212250212251212252212253212254212255212256212257212258212259212260212261212262212263212264212265212266212267212268212269212270212271212272212273212274212275212276212277212278212279212280212281212282212283212284212285212286212287212288212289212290212291212292212293212294212295212296212297212298212299212300212301212302212303212304212305212306212307212308212309212310212311212312212313212314212315212316212317212318212319212320212321212322212323212324212325212326212327212328212329212330212331212332212333212334212335212336212337212338212339212340212341212342212343212344212345212346212347212348212349212350212351212352212353212354212355212356212357212358212359212360212361212362212363212364212365212366212367212368212369212370212371212372212373212374212375212376212377212378212379212380212381212382212383212384212385212386212387212388212389212390212391212392212393212394212395212396212397212398212399212400212401212402212403212404212405212406212407212408212409212410212411212412212413212414212415212416212417212418212419212420212421212422212423212424212425212426212427212428212429212430212431212432212433212434212435212436212437212438212439212440212441212442212443212444212445212446212447212448212449212450212451212452212453212454212455212456212457212458212459212460212461212462212463212464212465212466212467212468212469212470212471212472212473212474212475212476212477212478212479212480212481212482212483212484212485212486212487212488212489212490212491212492212493212494212495212496212497212498212499212500212501212502212503212504212505212506212507212508212509212510212511212512212513212514212515212516212517212518212519212520212521212522212523212524212525212526212527212528212529212530212531212532212533212534212535212536212537212538212539212540212541212542212543212544212545212546212547212548212549212550212551212552212553212554212555212556212557212558212559212560212561212562212563212564212565212566212567212568212569212570212571212572212573212574212575212576212577212578212579212580212581212582212583212584212585212586212587212588212589212590212591212592212593212594212595212596212597212598212599212600212601212602212603212604212605212606212607212608212609212610212611212612212613212614212615212616212617212618212619212620212621212622212623212624212625212626212627212628212629212630212631212632212633212634212635212636212637212638212639212640212641212642212643212644212645212646212647212648212649212650212651212652212653212654212655212656212657212658212659212660212661212662212663212664212665212666212667212668212669212670212671212672212673212674212675212676212677212678212679212680212681212682212683212684212685212686212687212688212689212690212691212692212693212694212695212696212697212698212699212700212701212702212703212704212705212706212707212708212709212710212711212712212713212714212715212716212717212718212719212720212721212722212723212724212725212726212727212728212729212730212731212732212733212734212735212736212737212738212739212740212741212742212743212744212745212746212747212748212749212750212751212752212753212754212755212756212757212758212759212760212761212762212763212764212765212766212767212768212769212770212771212772212773212774212775212776212777212778212779212780212781212782212783212784212785212786212787212788212789212790212791212792212793212794212795212796212797212798212799212800212801212802212803212804212805212806212807212808212809212810212811212812212813212814212815212816212817212818212819212820212821212822212823212824212825212826212827212828212829212830212831212832212833212834212835212836212837212838212839212840212841212842212843212844212845212846212847212848212849212850212851212852212853212854212855212856212857212858212859212860212861212862212863212864212865212866212867212868212869212870212871212872212873212874212875212876212877212878212879212880212881212882212883212884212885212886212887212888212889212890212891212892212893212894212895212896212897212898212899212900212901212902212903212904212905212906212907212908212909212910212911212912212913212914212915212916212917212918212919212920212921212922212923212924212925212926212927212928212929212930212931212932212933212934212935212936212937212938212939212940212941212942212943212944212945212946212947212948212949212950212951212952212953212954212955212956212957212958212959212960212961212962212963212964212965212966212967212968212969212970212971212972212973212974212975212976212977212978212979212980212981212982212983212984212985212986212987212988212989212990212991212992212993212994212995212996212997212998212999213000213001213002213003213004213005213006213007213008213009213010213011213012213013213014213015213016213017213018213019213020213021213022213023213024213025213026213027213028213029213030213031213032213033213034213035213036213037213038213039213040213041213042213043213044213045213046213047213048213049213050213051213052213053213054213055213056213057213058213059213060213061213062213063213064213065213066213067213068213069213070213071213072213073213074213075213076213077213078213079213080213081213082213083213084213085213086213087213088213089213090213091213092213093213094213095213096213097213098213099213100213101213102213103213104213105213106213107213108213109213110213111213112213113213114213115213116213117213118213119213120213121213122213123213124213125213126213127213128213129213130213131213132213133213134213135213136213137213138213139213140213141213142213143213144213145213146213147213148213149213150213151213152213153213154213155213156213157213158213159213160213161213162213163213164213165213166213167213168213169213170213171213172213173213174213175213176213177213178213179213180213181213182213183213184213185213186213187213188213189213190213191213192213193213194213195213196213197213198213199213200213201213202213203213204213205213206213207213208213209213210213211213212213213213214213215213216213217213218213219213220213221213222213223213224213225213226213227213228213229213230213231213232213233213234213235213236213237213238213239213240213241213242213243213244213245213246213247213248213249213250213251213252213253213254213255213256213257213258213259213260213261213262213263213264213265213266213267213268213269213270213271213272213273213274213275213276213277213278213279213280213281213282213283213284213285213286213287213288213289213290213291213292213293213294213295213296213297213298213299213300213301213302213303213304213305213306213307213308213309213310213311213312213313213314213315213316213317213318213319213320213321213322213323213324213325213326213327213328213329213330213331213332213333213334213335213336213337213338213339213340213341213342213343213344213345213346213347213348213349213350213351213352213353213354213355213356213357213358213359213360213361213362213363213364213365213366213367213368213369213370213371213372213373213374213375213376213377213378213379213380213381213382213383213384213385213386213387213388213389213390213391213392213393213394213395213396213397213398213399213400213401213402213403213404213405213406213407213408213409213410213411213412213413213414213415213416213417213418213419213420213421213422213423213424213425213426213427213428213429213430213431213432213433213434213435213436213437213438213439213440213441213442213443213444213445213446213447213448213449213450213451213452213453213454213455213456213457213458213459213460213461213462213463213464213465213466213467213468213469213470213471213472213473213474213475213476213477213478213479213480213481213482213483213484213485213486213487213488213489213490213491213492213493213494213495213496213497213498213499213500213501213502213503213504213505213506213507213508213509213510213511213512213513213514213515213516213517213518213519213520213521213522213523213524213525213526213527213528213529213530213531213532213533213534213535213536213537213538213539213540213541213542213543213544213545213546213547213548213549213550213551213552213553213554213555213556213557213558213559213560213561213562213563213564213565213566213567213568213569213570213571213572213573213574213575213576213577213578213579213580213581213582213583213584213585213586213587213588213589213590213591213592213593213594213595213596213597213598213599213600213601213602213603213604213605213606213607213608213609213610213611213612213613213614213615213616213617213618213619213620213621213622213623213624213625213626213627213628213629213630213631213632213633213634213635213636213637213638213639213640213641213642213643213644213645213646213647213648213649213650213651213652213653213654213655213656213657213658213659213660213661213662213663213664213665213666213667213668213669213670213671213672213673213674213675213676213677213678213679213680213681213682213683213684213685213686213687213688213689213690213691213692213693213694213695213696213697213698213699213700213701213702213703213704213705213706213707213708213709213710213711213712213713213714213715213716213717213718213719213720213721213722213723213724213725213726213727213728213729213730213731213732213733213734213735213736213737213738213739213740213741213742213743213744213745213746213747213748213749213750213751213752213753213754213755213756213757213758213759213760213761213762213763213764213765213766213767213768213769213770213771213772213773213774213775213776213777213778213779213780213781213782213783213784213785213786213787213788213789213790213791213792213793213794213795213796213797213798213799213800213801213802213803213804213805213806213807213808213809213810213811213812213813213814213815213816213817213818213819213820213821213822213823213824213825213826213827213828213829213830213831213832213833213834213835213836213837213838213839213840213841213842213843213844213845213846213847213848213849213850213851213852213853213854213855213856213857213858213859213860213861213862213863213864213865213866213867213868213869213870213871213872213873213874213875213876213877213878213879213880213881213882213883213884213885213886213887213888213889213890213891213892213893213894213895213896213897213898213899213900213901213902213903213904213905213906213907213908213909213910213911213912213913213914213915213916213917213918213919213920213921213922213923213924213925213926213927213928213929213930213931213932213933213934213935213936213937213938213939213940213941213942213943213944213945213946213947213948213949213950213951213952213953213954213955213956213957213958213959213960213961213962213963213964213965213966213967213968213969213970213971213972213973213974213975213976213977213978213979213980213981213982213983213984213985213986213987213988213989213990213991213992213993213994213995213996213997213998213999214000214001214002214003214004214005214006214007214008214009214010214011214012214013214014214015214016214017214018214019214020214021214022214023214024214025214026214027214028214029214030214031214032214033214034214035214036214037214038214039214040214041214042214043214044214045214046214047214048214049214050214051214052214053214054214055214056214057214058214059214060214061214062214063214064214065214066214067214068214069214070214071214072214073214074214075214076214077214078214079214080214081214082214083214084214085214086214087214088214089214090214091214092214093214094214095214096214097214098214099214100214101214102214103214104214105214106214107214108214109214110214111214112214113214114214115214116214117214118214119214120214121214122214123214124214125214126214127214128214129214130214131214132214133214134214135214136214137214138214139214140214141214142214143214144214145214146214147214148214149214150214151214152214153214154214155214156214157214158214159214160214161214162214163214164214165214166214167214168214169214170214171214172214173214174214175214176214177214178214179214180214181214182214183214184214185214186214187214188214189214190214191214192214193214194214195214196214197214198214199214200214201214202214203214204214205214206214207214208214209214210214211214212214213214214214215214216214217214218214219214220214221214222214223214224214225214226214227214228214229214230214231214232214233214234214235214236214237214238214239214240214241214242214243214244214245214246214247214248214249214250214251214252214253214254214255214256214257214258214259214260214261214262214263214264214265214266214267214268214269214270214271214272214273214274214275214276214277214278214279214280214281214282214283214284214285214286214287214288214289214290214291214292214293214294214295214296214297214298214299214300214301214302214303214304214305214306214307214308214309214310214311214312214313214314214315214316214317214318214319214320214321214322214323214324214325214326214327214328214329214330214331214332214333214334214335214336214337214338214339214340214341214342214343214344214345214346214347214348214349214350214351214352214353214354214355214356214357214358214359214360214361214362214363214364214365214366214367214368214369214370214371214372214373214374214375214376214377214378214379214380214381214382214383214384214385214386214387214388214389214390214391214392214393214394214395214396214397214398214399214400214401214402214403214404214405214406214407214408214409214410214411214412214413214414214415214416214417214418214419214420214421214422214423214424214425214426214427214428214429214430214431214432214433214434214435214436214437214438214439214440214441214442214443214444214445214446214447214448214449214450214451214452214453214454214455214456214457214458214459214460214461214462214463214464214465214466214467214468214469214470214471214472214473214474214475214476214477214478214479214480214481214482214483214484214485214486214487214488214489214490214491214492214493214494214495214496214497214498214499214500214501214502214503214504214505214506214507214508214509214510214511214512214513214514214515214516214517214518214519214520214521214522214523214524214525214526214527214528214529214530214531214532214533214534214535214536214537214538214539214540214541214542214543214544214545214546214547214548214549214550214551214552214553214554214555214556214557214558214559214560214561214562214563214564214565214566214567214568214569214570214571214572214573214574214575214576214577214578214579214580214581214582214583214584214585214586214587214588214589214590214591214592214593214594214595214596214597214598214599214600214601214602214603214604214605214606214607214608214609214610214611214612214613214614214615214616214617214618214619214620214621214622214623214624214625214626214627214628214629214630214631214632214633214634214635214636214637214638214639214640214641214642214643214644214645214646214647214648214649214650214651214652214653214654214655214656214657214658214659214660214661214662214663214664214665214666214667214668214669214670214671214672214673214674214675214676214677214678214679214680214681214682214683214684214685214686214687214688214689214690214691214692214693214694214695214696214697214698214699214700214701214702214703214704214705214706214707214708214709214710214711214712214713214714214715214716214717214718214719214720214721214722214723214724214725214726214727214728214729214730214731214732214733214734214735214736214737214738214739214740214741214742214743214744214745214746214747214748214749214750214751214752214753214754214755214756214757214758214759214760214761214762214763214764214765214766214767214768214769214770214771214772214773214774214775214776214777214778214779214780214781214782214783214784214785214786214787214788214789214790214791214792214793214794214795214796214797214798214799214800214801214802214803214804214805214806214807214808214809214810214811214812214813214814214815214816214817214818214819214820214821214822214823214824214825214826214827214828214829214830214831214832214833214834214835214836214837214838214839214840214841214842214843214844214845214846214847214848214849214850214851214852214853214854214855214856214857214858214859214860214861214862214863214864214865214866214867214868214869214870214871214872214873214874214875214876214877214878214879214880214881214882214883214884214885214886214887214888214889214890214891214892214893214894214895214896214897214898214899214900214901214902214903214904214905214906214907214908214909214910214911214912214913214914214915214916214917214918214919214920214921214922214923214924214925214926214927214928214929214930214931214932214933214934214935214936214937214938214939214940214941214942214943214944214945214946214947214948214949214950214951214952214953214954214955214956214957214958214959214960214961214962214963214964214965214966214967214968214969214970214971214972214973214974214975214976214977214978214979214980214981214982214983214984214985214986214987214988214989214990214991214992214993214994214995214996214997214998214999215000215001215002215003215004215005215006215007215008215009215010215011215012215013215014215015215016215017215018215019215020215021215022215023215024215025215026215027215028215029215030215031215032215033215034215035215036215037215038215039215040215041215042215043215044215045215046215047215048215049215050215051215052215053215054215055215056215057215058215059215060215061215062215063215064215065215066215067215068215069215070215071215072215073215074215075215076215077215078215079215080215081215082215083215084215085215086215087215088215089215090215091215092215093215094215095215096215097215098215099215100215101215102215103215104215105215106215107215108215109215110215111215112215113215114215115215116215117215118215119215120215121215122215123215124215125215126215127215128215129215130215131215132215133215134215135215136215137215138215139215140215141215142215143215144215145215146215147215148215149215150215151215152215153215154215155215156215157215158215159215160215161215162215163215164215165215166215167215168215169215170215171215172215173215174215175215176215177215178215179215180215181215182215183215184215185215186215187215188215189215190215191215192215193215194215195215196215197215198215199215200215201215202215203215204215205215206215207215208215209215210215211215212215213215214215215215216215217215218215219215220215221215222215223215224215225215226215227215228215229215230215231215232215233215234215235215236215237215238215239215240215241215242215243215244215245215246215247215248215249215250215251215252215253215254215255215256215257215258215259215260215261215262215263215264215265215266215267215268215269215270215271215272215273215274215275215276215277215278215279215280215281215282215283215284215285215286215287215288215289215290215291215292215293215294215295215296215297215298215299215300215301215302215303215304215305215306215307215308215309215310215311215312215313215314215315215316215317215318215319215320215321215322215323215324215325215326215327215328215329215330215331215332215333215334215335215336215337215338215339215340215341215342215343215344215345215346215347215348215349215350215351215352215353215354215355215356215357215358215359215360215361215362215363215364215365215366215367215368215369215370215371215372215373215374215375215376215377215378215379215380215381215382215383215384215385215386215387215388215389215390215391215392215393215394215395215396215397215398215399215400215401215402215403215404215405215406215407215408215409215410215411215412215413215414215415215416215417215418215419215420215421215422215423215424215425215426215427215428215429215430215431215432215433215434215435215436215437215438215439215440215441215442215443215444215445215446215447215448215449215450215451215452215453215454215455215456215457215458215459215460215461215462215463215464215465215466215467215468215469215470215471215472215473215474215475215476215477215478215479215480215481215482215483215484215485215486215487215488215489215490215491215492215493215494215495215496215497215498215499215500215501215502215503215504215505215506215507215508215509215510215511215512215513215514215515215516215517215518215519215520215521215522215523215524215525215526215527215528215529215530215531215532215533215534215535215536215537215538215539215540215541215542215543215544215545215546215547215548215549215550215551215552215553215554215555215556215557215558215559215560215561215562215563215564215565215566215567215568215569215570215571215572215573215574215575215576215577215578215579215580215581215582215583215584215585215586215587215588215589215590215591215592215593215594215595215596215597215598215599215600215601215602215603215604215605215606215607215608215609215610215611215612215613215614215615215616215617215618215619215620215621215622215623215624215625215626215627215628215629215630215631215632215633215634215635215636215637215638215639215640215641215642215643215644215645215646215647215648215649215650215651215652215653215654215655215656215657215658215659215660215661215662215663215664215665215666215667215668215669215670215671215672215673215674215675215676215677215678215679215680215681215682215683215684215685215686215687215688215689215690215691215692215693215694215695215696215697215698215699215700215701215702215703215704215705215706215707215708215709215710215711215712215713215714215715215716215717215718215719215720215721215722215723215724215725215726215727215728215729215730215731215732215733215734215735215736215737215738215739215740215741215742215743215744215745215746215747215748215749215750215751215752215753215754215755215756215757215758215759215760215761215762215763215764215765215766215767215768215769215770215771215772215773215774215775215776215777215778215779215780215781215782215783215784215785215786215787215788215789215790215791215792215793215794215795215796215797215798215799215800215801215802215803215804215805215806215807215808215809215810215811215812215813215814215815215816215817215818215819215820215821215822215823215824215825215826215827215828215829215830215831215832215833215834215835215836215837215838215839215840215841215842215843215844215845215846215847215848215849215850215851215852215853215854215855215856215857215858215859215860215861215862215863215864215865215866215867215868215869215870215871215872215873215874215875215876215877215878215879215880215881215882215883215884215885215886215887215888215889215890215891215892215893215894215895215896215897215898215899215900215901215902215903215904215905215906215907215908215909215910215911215912215913215914215915215916215917215918215919215920215921215922215923215924215925215926215927215928215929215930215931215932215933215934215935215936215937215938215939215940215941215942215943215944215945215946215947215948215949215950215951215952215953215954215955215956215957215958215959215960215961215962215963215964215965215966215967215968215969215970215971215972215973215974215975215976215977215978215979215980215981215982215983215984215985215986215987215988215989215990215991215992215993215994215995215996215997215998215999216000216001216002216003216004216005216006216007216008216009216010216011216012216013216014216015216016216017216018216019216020216021216022216023216024216025216026216027216028216029216030216031216032216033216034216035216036216037216038216039216040216041216042216043216044216045216046216047216048216049216050216051216052216053216054216055216056216057216058216059216060216061216062216063216064216065216066216067216068216069216070216071216072216073216074216075216076216077216078216079216080216081216082216083216084216085216086216087216088216089216090216091216092216093216094216095216096216097216098216099216100216101216102216103216104216105216106216107216108216109216110216111216112216113216114216115216116216117216118216119216120216121216122216123216124216125216126216127216128216129216130216131216132216133216134216135216136216137216138216139216140216141216142216143216144216145216146216147216148216149216150216151216152216153216154216155216156216157216158216159216160216161216162216163216164216165216166216167216168216169216170216171216172216173216174216175216176216177216178216179216180216181216182216183216184216185216186216187216188216189216190216191216192216193216194216195216196216197216198216199216200216201216202216203216204216205216206216207216208216209216210216211216212216213216214216215216216216217216218216219216220216221216222216223216224216225216226216227216228216229216230216231216232216233216234216235216236216237216238216239216240216241216242216243216244216245216246216247216248216249216250216251216252216253216254216255216256216257216258216259216260216261216262216263216264216265216266216267216268216269216270216271216272216273216274216275216276216277216278216279216280216281216282216283216284216285216286216287216288216289216290216291216292216293216294216295216296216297216298216299216300216301216302216303216304216305216306216307216308216309216310216311216312216313216314216315216316216317216318216319216320216321216322216323216324216325216326216327216328216329216330216331216332216333216334216335216336216337216338216339216340216341216342216343216344216345216346216347216348216349216350216351216352216353216354216355216356216357216358216359216360216361216362216363216364216365216366216367216368216369216370216371216372216373216374216375216376216377216378216379216380216381216382216383216384216385216386216387216388216389216390216391216392216393216394216395216396216397216398216399216400216401216402216403216404216405216406216407216408216409216410216411216412216413216414216415216416216417216418216419216420216421216422216423216424216425216426216427216428216429216430216431216432216433216434216435216436216437216438216439216440216441216442216443216444216445216446216447216448216449216450216451216452216453216454216455216456216457216458216459216460216461216462216463216464216465216466216467216468216469216470216471216472216473216474216475216476216477216478216479216480216481216482216483216484216485216486216487216488216489216490216491216492216493216494216495216496216497216498216499216500216501216502216503216504216505216506216507216508216509216510216511216512216513216514216515216516216517216518216519216520216521216522216523216524216525216526216527216528216529216530216531216532216533216534216535216536216537216538216539216540216541216542216543216544216545216546216547216548216549216550216551216552216553216554216555216556216557216558216559216560216561216562216563216564216565216566216567216568216569216570216571216572216573216574216575216576216577216578216579216580216581216582216583216584216585216586216587216588216589216590216591216592216593216594216595216596216597216598216599216600216601216602216603216604216605216606216607216608216609216610216611216612216613216614216615216616216617216618216619216620216621216622216623216624216625216626216627216628216629216630216631216632216633216634216635216636216637216638216639216640216641216642216643216644216645216646216647216648216649216650216651216652216653216654216655216656216657216658216659216660216661216662216663216664216665216666216667216668216669216670216671216672216673216674216675216676216677216678216679216680216681216682216683216684216685216686216687216688216689216690216691216692216693216694216695216696216697216698216699216700216701216702216703216704216705216706216707216708216709216710216711216712216713216714216715216716216717216718216719216720216721216722216723216724216725216726216727216728216729216730216731216732216733216734216735216736216737216738216739216740216741216742216743216744216745216746216747216748216749216750216751216752216753216754216755216756216757216758216759216760216761216762216763216764216765216766216767216768216769216770216771216772216773216774216775216776216777216778216779216780216781216782216783216784216785216786216787216788216789216790216791216792216793216794216795216796216797216798216799216800216801216802216803216804216805216806216807216808216809216810216811216812216813216814216815216816216817216818216819216820216821216822216823216824216825216826216827216828216829216830216831216832216833216834216835216836216837216838216839216840216841216842216843216844216845216846216847216848216849216850216851216852216853216854216855216856216857216858216859216860216861216862216863216864216865216866216867216868216869216870216871216872216873216874216875216876216877216878216879216880216881216882216883216884216885216886216887216888216889216890216891216892216893216894216895216896216897216898216899216900216901216902216903216904216905216906216907216908216909216910216911216912216913216914216915216916216917216918216919216920216921216922216923216924216925216926216927216928216929216930216931216932216933216934216935216936216937216938216939216940216941216942216943216944216945216946216947216948216949216950216951216952216953216954216955216956216957216958216959216960216961216962216963216964216965216966216967216968216969216970216971216972216973216974216975216976216977216978216979216980216981216982216983216984216985216986216987216988216989216990216991216992216993216994216995216996216997216998216999217000217001217002217003217004217005217006217007217008217009217010217011217012217013217014217015217016217017217018217019217020217021217022217023217024217025217026217027217028217029217030217031217032217033217034217035217036217037217038217039217040217041217042217043217044217045217046217047217048217049217050217051217052217053217054217055217056217057217058217059217060217061217062217063217064217065217066217067217068217069217070217071217072217073217074217075217076217077217078217079217080217081217082217083217084217085217086217087217088217089217090217091217092217093217094217095217096217097217098217099217100217101217102217103217104217105217106217107217108217109217110217111217112217113217114217115217116217117217118217119217120217121217122217123217124217125217126217127217128217129217130217131217132217133217134217135217136217137217138217139217140217141217142217143217144217145217146217147217148217149217150217151217152217153217154217155217156217157217158217159217160217161217162217163217164217165217166217167217168217169217170217171217172217173217174217175217176217177217178217179217180217181217182217183217184217185217186217187217188217189217190217191217192217193217194217195217196217197217198217199217200217201217202217203217204217205217206217207217208217209217210217211217212217213217214217215217216217217217218217219217220217221217222217223217224217225217226217227217228217229217230217231217232217233217234217235217236217237217238217239217240217241217242217243217244217245217246217247217248217249217250217251217252217253217254217255217256217257217258217259217260217261217262217263217264217265217266217267217268217269217270217271217272217273217274217275217276217277217278217279217280217281217282217283217284217285217286217287217288217289217290217291217292217293217294217295217296217297217298217299217300217301217302217303217304217305217306217307217308217309217310217311217312217313217314217315217316217317217318217319217320217321217322217323217324217325217326217327217328217329217330217331217332217333217334217335217336217337217338217339217340217341217342217343217344217345217346217347217348217349217350217351217352217353217354217355217356217357217358217359217360217361217362217363217364217365217366217367217368217369217370217371217372217373217374217375217376217377217378217379217380217381217382217383217384217385217386217387217388217389217390217391217392217393217394217395217396217397217398217399217400217401217402217403217404217405217406217407217408217409217410217411217412217413217414217415217416217417217418217419217420217421217422217423217424217425217426217427217428217429217430217431217432217433217434217435217436217437217438217439217440217441217442217443217444217445217446217447217448217449217450217451217452217453217454217455217456217457217458217459217460217461217462217463217464217465217466217467217468217469217470217471217472217473217474217475217476217477217478217479217480217481217482217483217484217485217486217487217488217489217490217491217492217493217494217495217496217497217498217499217500217501217502217503217504217505217506217507217508217509217510217511217512217513217514217515217516217517217518217519217520217521217522217523217524217525217526217527217528217529217530217531217532217533217534217535217536217537217538217539217540217541217542217543217544217545217546217547217548217549217550217551217552217553217554217555217556217557217558217559217560217561217562217563217564217565217566217567217568217569217570217571217572217573217574217575217576217577217578217579217580217581217582217583217584217585217586217587217588217589217590217591217592217593217594217595217596217597217598217599217600217601217602217603217604217605217606217607217608217609217610217611217612217613217614217615217616217617217618217619217620217621217622217623217624217625217626217627217628217629217630217631217632217633217634217635217636217637217638217639217640217641217642217643217644217645217646217647217648217649217650217651217652217653217654217655217656217657217658217659217660217661217662217663217664217665217666217667217668217669217670217671217672217673217674217675217676217677217678217679217680217681217682217683217684217685217686217687217688217689217690217691217692217693217694217695217696217697217698217699217700217701217702217703217704217705217706217707217708217709217710217711217712217713217714217715217716217717217718217719217720217721217722217723217724217725217726217727217728217729217730217731217732217733217734217735217736217737217738217739217740217741217742217743217744217745217746217747217748217749217750217751217752217753217754217755217756217757217758217759217760217761217762217763217764217765217766217767217768217769217770217771217772217773217774217775217776217777217778217779217780217781217782217783217784217785217786217787217788217789217790217791217792217793217794217795217796217797217798217799217800217801217802217803217804217805217806217807217808217809217810217811217812217813217814217815217816217817217818217819217820217821217822217823217824217825217826217827217828217829217830217831217832217833217834217835217836217837217838217839217840217841217842217843217844217845217846217847217848217849217850217851217852217853217854217855217856217857217858217859217860217861217862217863217864217865217866217867217868217869217870217871217872217873217874217875217876217877217878217879217880217881217882217883217884217885217886217887217888217889217890217891217892217893217894217895217896217897217898217899217900217901217902217903217904217905217906217907217908217909217910217911217912217913217914217915217916217917217918217919217920217921217922217923217924217925217926217927217928217929217930217931217932217933217934217935217936217937217938217939217940217941217942217943217944217945217946217947217948217949217950217951217952217953217954217955217956217957217958217959217960217961217962217963217964217965217966217967217968217969217970217971217972217973217974217975217976217977217978217979217980217981217982217983217984217985217986217987217988217989217990217991217992217993217994217995217996217997217998217999218000218001218002218003218004218005218006218007218008218009218010218011218012218013218014218015218016218017218018218019218020218021218022218023218024218025218026218027218028218029218030218031218032218033218034218035218036218037218038218039218040218041218042218043218044218045218046218047218048218049218050218051218052218053218054218055218056218057218058218059218060218061218062218063218064218065218066218067218068218069218070218071218072218073218074218075218076218077218078218079218080218081218082218083218084218085218086218087218088218089218090218091218092218093218094218095218096218097218098218099218100218101218102218103218104218105218106218107218108218109218110218111218112218113218114218115218116218117218118218119218120218121218122218123218124218125218126218127218128218129218130218131218132218133218134218135218136218137218138218139218140218141218142218143218144218145218146218147218148218149218150218151218152218153218154218155218156218157218158218159218160218161218162218163218164218165218166218167218168218169218170218171218172218173218174218175218176218177218178218179218180218181218182218183218184218185218186218187218188218189218190218191218192218193218194218195218196218197218198218199218200218201218202218203218204218205218206218207218208218209218210218211218212218213218214218215218216218217218218218219218220218221218222218223218224218225218226218227218228218229218230218231218232218233218234218235218236218237218238218239218240218241218242218243218244218245218246218247218248218249218250218251218252218253218254218255218256218257218258218259218260218261218262218263218264218265218266218267218268218269218270218271218272218273218274218275218276218277218278218279218280218281218282218283218284218285218286218287218288218289218290218291218292218293218294218295218296218297218298218299218300218301218302218303218304218305218306218307218308218309218310218311218312218313218314218315218316218317218318218319218320218321218322218323218324218325218326218327218328218329218330218331218332218333218334218335218336218337218338218339218340218341218342218343218344218345218346218347218348218349218350218351218352218353218354218355218356218357218358218359218360218361218362218363218364218365218366218367218368218369218370218371218372218373218374218375218376218377218378218379218380218381218382218383218384218385218386218387218388218389218390218391218392218393218394218395218396218397218398218399218400218401218402218403218404218405218406218407218408218409218410218411218412218413218414218415218416218417218418218419218420218421218422218423218424218425218426218427218428218429218430218431218432218433218434218435218436218437218438218439218440218441218442218443218444218445218446218447218448218449218450218451218452218453218454218455218456218457218458218459218460218461218462218463218464218465218466218467218468218469218470218471218472218473218474218475218476218477218478218479218480218481218482218483218484218485218486218487218488218489218490218491218492218493218494218495218496218497218498218499218500218501218502218503218504218505218506218507218508218509218510218511218512218513218514218515218516218517218518218519218520218521218522218523218524218525218526218527218528218529218530218531218532218533218534218535218536218537218538218539218540218541218542218543218544218545218546218547218548218549218550218551218552218553218554218555218556218557218558218559218560218561218562218563218564218565218566218567218568218569218570218571218572218573218574218575218576218577218578218579218580218581218582218583218584218585218586218587218588218589218590218591218592218593218594218595218596218597218598218599218600218601218602218603218604218605218606218607218608218609218610218611218612218613218614218615218616218617218618218619218620218621218622218623218624218625218626218627218628218629218630218631218632218633218634218635218636218637218638218639218640218641218642218643218644218645218646218647218648218649218650218651218652218653218654218655218656218657218658218659218660218661218662218663218664218665218666218667218668218669218670218671218672218673218674218675218676218677218678218679218680218681218682218683218684218685218686218687218688218689218690218691218692218693218694218695218696218697218698218699218700218701218702218703218704218705218706218707218708218709218710218711218712218713218714218715218716218717218718218719218720218721218722218723218724218725218726218727218728218729218730218731218732218733218734218735218736218737218738218739218740218741218742218743218744218745218746218747218748218749218750218751218752218753218754218755218756218757218758218759218760218761218762218763218764218765218766218767218768218769218770218771218772218773218774218775218776218777218778218779218780218781218782218783218784218785218786218787218788218789218790218791218792218793218794218795218796218797218798218799218800218801218802218803218804218805218806218807218808218809218810218811218812218813218814218815218816218817218818218819218820218821218822218823218824218825218826218827218828218829218830218831218832218833218834218835218836218837218838218839218840218841218842218843218844218845218846218847218848218849218850218851218852218853218854218855218856218857218858218859218860218861218862218863218864218865218866218867218868218869218870218871218872218873218874218875218876218877218878218879218880218881218882218883218884218885218886218887218888218889218890218891218892218893218894218895218896218897218898218899218900218901218902218903218904218905218906218907218908218909218910218911218912218913218914218915218916218917218918218919218920218921218922218923218924218925218926218927218928218929218930218931218932218933218934218935218936218937218938218939218940218941218942218943218944218945218946218947218948218949218950218951218952218953218954218955218956218957218958218959218960218961218962218963218964218965218966218967218968218969218970218971218972218973218974218975218976218977218978218979218980218981218982218983218984218985218986218987218988218989218990218991218992218993218994218995218996218997218998218999219000219001219002219003
  1. /* sp.c
  2. *
  3. * Copyright (C) 2006-2022 wolfSSL Inc.
  4. *
  5. * This file is part of wolfSSL.
  6. *
  7. * wolfSSL is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License as published by
  9. * the Free Software Foundation; either version 2 of the License, or
  10. * (at your option) any later version.
  11. *
  12. * wolfSSL is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU General Public License
  18. * along with this program; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
  20. */
  21. /* Implementation by Sean Parkinson. */
  22. #ifdef HAVE_CONFIG_H
  23. #include <config.h>
  24. #endif
  25. #include <wolfssl/wolfcrypt/settings.h>
  26. #if defined(WOLFSSL_HAVE_SP_RSA) || defined(WOLFSSL_HAVE_SP_DH) || \
  27. defined(WOLFSSL_HAVE_SP_ECC)
  28. #include <wolfssl/wolfcrypt/error-crypt.h>
  29. #include <wolfssl/wolfcrypt/cpuid.h>
  30. #ifdef NO_INLINE
  31. #include <wolfssl/wolfcrypt/misc.h>
  32. #else
  33. #define WOLFSSL_MISC_INCLUDED
  34. #include <wolfcrypt/src/misc.c>
  35. #endif
  36. #ifdef RSA_LOW_MEM
  37. #ifndef WOLFSSL_SP_SMALL
  38. #define WOLFSSL_SP_SMALL
  39. #endif
  40. #endif
  41. #include <wolfssl/wolfcrypt/sp.h>
  42. #ifdef WOLFSSL_SP_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 = ((bits + 31) / 32) - 1; ii >= 0; ii--) \
  48. fprintf(stderr, SP_PRINT_FMT, (var)[ii]); \
  49. fprintf(stderr, "\n"); \
  50. } while (0)
  51. #define SP_PRINT_VAL(var, name) \
  52. fprintf(stderr, name "=0x" SP_PRINT_FMT "\n", var)
  53. #define SP_PRINT_INT(var, name) \
  54. fprintf(stderr, name "=%d\n", var)
  55. #if defined(WOLFSSL_HAVE_SP_RSA) || defined(WOLFSSL_HAVE_SP_DH)
  56. #ifndef WOLFSSL_SP_NO_2048
  57. /* Read big endian unsigned byte array into r.
  58. *
  59. * r A single precision integer.
  60. * size Maximum number of bytes to convert
  61. * a Byte array.
  62. * n Number of bytes in array to read.
  63. */
  64. static void sp_2048_from_bin(sp_digit* r, int size, const byte* a, int n)
  65. {
  66. int i;
  67. int j;
  68. byte* d;
  69. for (i = n - 1,j = 0; i >= 3; i -= 4) {
  70. r[j] = ((sp_digit)a[i - 0] << 0) |
  71. ((sp_digit)a[i - 1] << 8) |
  72. ((sp_digit)a[i - 2] << 16) |
  73. ((sp_digit)a[i - 3] << 24);
  74. j++;
  75. }
  76. if (i >= 0) {
  77. r[j] = 0;
  78. d = (byte*)r;
  79. switch (i) {
  80. case 2: d[n - 1 - 2] = a[2]; //fallthrough
  81. case 1: d[n - 1 - 1] = a[1]; //fallthrough
  82. case 0: d[n - 1 - 0] = a[0]; //fallthrough
  83. }
  84. j++;
  85. }
  86. for (; j < size; j++) {
  87. r[j] = 0;
  88. }
  89. }
  90. /* Convert an mp_int to an array of sp_digit.
  91. *
  92. * r A single precision integer.
  93. * size Maximum number of bytes to convert
  94. * a A multi-precision integer.
  95. */
  96. static void sp_2048_from_mp(sp_digit* r, int size, const mp_int* a)
  97. {
  98. #if DIGIT_BIT == 32
  99. int i;
  100. int j = 0;
  101. for (i = 0; i < size; i++) {
  102. sp_digit mask =
  103. (((sp_digit)(a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1;
  104. r[i] = a->dp[j] & mask;
  105. j += (int)(((sp_digit)1) -
  106. (((sp_digit)(a->used - i - 2)) >> (SP_WORD_SIZE - 1)));
  107. }
  108. #elif DIGIT_BIT > 32
  109. int i;
  110. int j = 0;
  111. word32 s = 0;
  112. r[0] = 0;
  113. for (i = 0; i < a->used && j < size; i++) {
  114. r[j] |= ((sp_digit)a->dp[i] << s);
  115. r[j] &= 0xffffffff;
  116. s = 32U - s;
  117. if (j + 1 >= size) {
  118. break;
  119. }
  120. /* lint allow cast of mismatch word32 and mp_digit */
  121. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  122. while ((s + 32U) <= (word32)DIGIT_BIT) {
  123. s += 32U;
  124. r[j] &= 0xffffffff;
  125. if (j + 1 >= size) {
  126. break;
  127. }
  128. if (s < (word32)DIGIT_BIT) {
  129. /* lint allow cast of mismatch word32 and mp_digit */
  130. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  131. }
  132. else {
  133. r[++j] = (sp_digit)0;
  134. }
  135. }
  136. s = (word32)DIGIT_BIT - s;
  137. }
  138. for (j++; j < size; j++) {
  139. r[j] = 0;
  140. }
  141. #else
  142. int i;
  143. int j = 0;
  144. int s = 0;
  145. r[0] = 0;
  146. for (i = 0; i < a->used && j < size; i++) {
  147. r[j] |= ((sp_digit)a->dp[i]) << s;
  148. if (s + DIGIT_BIT >= 32) {
  149. r[j] &= 0xffffffff;
  150. if (j + 1 >= size) {
  151. break;
  152. }
  153. s = 32 - s;
  154. if (s == DIGIT_BIT) {
  155. r[++j] = 0;
  156. s = 0;
  157. }
  158. else {
  159. r[++j] = a->dp[i] >> s;
  160. s = DIGIT_BIT - s;
  161. }
  162. }
  163. else {
  164. s += DIGIT_BIT;
  165. }
  166. }
  167. for (j++; j < size; j++) {
  168. r[j] = 0;
  169. }
  170. #endif
  171. }
  172. /* Write r as big endian to byte array.
  173. * Fixed length number of bytes written: 256
  174. *
  175. * r A single precision integer.
  176. * a Byte array.
  177. */
  178. static void sp_2048_to_bin_64(sp_digit* r, byte* a)
  179. {
  180. int i;
  181. int j = 0;
  182. for (i = 63; i >= 0; i--) {
  183. a[j++] = r[i] >> 24;
  184. a[j++] = r[i] >> 16;
  185. a[j++] = r[i] >> 8;
  186. a[j++] = r[i] >> 0;
  187. }
  188. }
  189. #if (defined(WOLFSSL_HAVE_SP_RSA) && (!defined(WOLFSSL_RSA_PUBLIC_ONLY) || !defined(WOLFSSL_SP_SMALL))) || defined(WOLFSSL_HAVE_SP_DH)
  190. /* Normalize the values in each word to 32.
  191. *
  192. * a Array of sp_digit to normalize.
  193. */
  194. #define sp_2048_norm_64(a)
  195. #endif /* (WOLFSSL_HAVE_SP_RSA && (!WOLFSSL_RSA_PUBLIC_ONLY || !WOLFSSL_SP_SMALL)) || WOLFSSL_HAVE_SP_DH */
  196. /* Normalize the values in each word to 32.
  197. *
  198. * a Array of sp_digit to normalize.
  199. */
  200. #define sp_2048_norm_64(a)
  201. #ifndef WOLFSSL_SP_SMALL
  202. #ifndef WOLFSSL_SP_LARGE_CODE
  203. /* Multiply a and b into r. (r = a * b)
  204. *
  205. * r A single precision integer.
  206. * a A single precision integer.
  207. * b A single precision integer.
  208. */
  209. SP_NOINLINE static void sp_2048_mul_8(sp_digit* r, const sp_digit* a,
  210. const sp_digit* b)
  211. {
  212. sp_digit t[8 * 2];
  213. sp_digit* tmp = t;
  214. __asm__ __volatile__ (
  215. "movs r3, #0\n\t"
  216. "movs r4, #0\n\t"
  217. "mov r8, r3\n\t"
  218. "mov r11, %[tmp]\n\t"
  219. "mov r9, %[a]\n\t"
  220. "mov r10, %[b]\n\t"
  221. "movs r6, #32\n\t"
  222. "add r6, r6, r9\n\t"
  223. "mov r12, r6\n\t"
  224. "\n"
  225. "L_sp_2048_mul_8_words_%=:\n\t"
  226. "movs %[tmp], #0\n\t"
  227. "movs r5, #0\n\t"
  228. "movs r6, #28\n\t"
  229. "mov %[a], r8\n\t"
  230. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  231. "subs %[a], %[a], r6\n\t"
  232. #else
  233. "sub %[a], %[a], r6\n\t"
  234. #endif
  235. #ifdef WOLFSSL_KEIL
  236. "sbcs r6, r6, r6\n\t"
  237. #elif defined(__clang__)
  238. "sbcs r6, r6\n\t"
  239. #else
  240. "sbc r6, r6\n\t"
  241. #endif
  242. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  243. "mvns r6, r6\n\t"
  244. #else
  245. "mvn r6, r6\n\t"
  246. #endif
  247. #ifdef WOLFSSL_KEIL
  248. "ands %[a], %[a], r6\n\t"
  249. #elif defined(__clang__)
  250. "ands %[a], r6\n\t"
  251. #else
  252. "and %[a], r6\n\t"
  253. #endif
  254. "mov %[b], r8\n\t"
  255. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  256. "subs %[b], %[b], %[a]\n\t"
  257. #else
  258. "sub %[b], %[b], %[a]\n\t"
  259. #endif
  260. "add %[a], %[a], r9\n\t"
  261. "add %[b], %[b], r10\n\t"
  262. "\n"
  263. "L_sp_2048_mul_8_mul_%=:\n\t"
  264. "# Multiply Start\n\t"
  265. "ldrh r6, [%[a]]\n\t"
  266. "ldrh r7, [%[b]]\n\t"
  267. #ifdef WOLFSSL_KEIL
  268. "muls r7, r6, r7\n\t"
  269. #elif defined(__clang__)
  270. "muls r7, r6\n\t"
  271. #else
  272. "mul r7, r6\n\t"
  273. #endif
  274. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  275. "adds r3, r3, r7\n\t"
  276. #else
  277. "add r3, r3, r7\n\t"
  278. #endif
  279. #ifdef WOLFSSL_KEIL
  280. "adcs r4, r4, %[tmp]\n\t"
  281. #elif defined(__clang__)
  282. "adcs r4, %[tmp]\n\t"
  283. #else
  284. "adc r4, %[tmp]\n\t"
  285. #endif
  286. #ifdef WOLFSSL_KEIL
  287. "adcs r5, r5, %[tmp]\n\t"
  288. #elif defined(__clang__)
  289. "adcs r5, %[tmp]\n\t"
  290. #else
  291. "adc r5, %[tmp]\n\t"
  292. #endif
  293. "ldr r7, [%[b]]\n\t"
  294. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  295. "lsrs r7, r7, #16\n\t"
  296. #else
  297. "lsr r7, r7, #16\n\t"
  298. #endif
  299. #ifdef WOLFSSL_KEIL
  300. "muls r6, r7, r6\n\t"
  301. #elif defined(__clang__)
  302. "muls r6, r7\n\t"
  303. #else
  304. "mul r6, r7\n\t"
  305. #endif
  306. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  307. "lsrs r7, r6, #16\n\t"
  308. #else
  309. "lsr r7, r6, #16\n\t"
  310. #endif
  311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  312. "lsls r6, r6, #16\n\t"
  313. #else
  314. "lsl r6, r6, #16\n\t"
  315. #endif
  316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  317. "adds r3, r3, r6\n\t"
  318. #else
  319. "add r3, r3, r6\n\t"
  320. #endif
  321. #ifdef WOLFSSL_KEIL
  322. "adcs r4, r4, r7\n\t"
  323. #elif defined(__clang__)
  324. "adcs r4, r7\n\t"
  325. #else
  326. "adc r4, r7\n\t"
  327. #endif
  328. #ifdef WOLFSSL_KEIL
  329. "adcs r5, r5, %[tmp]\n\t"
  330. #elif defined(__clang__)
  331. "adcs r5, %[tmp]\n\t"
  332. #else
  333. "adc r5, %[tmp]\n\t"
  334. #endif
  335. "ldr r6, [%[a]]\n\t"
  336. "ldr r7, [%[b]]\n\t"
  337. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  338. "lsrs r6, r6, #16\n\t"
  339. #else
  340. "lsr r6, r6, #16\n\t"
  341. #endif
  342. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  343. "lsrs r7, r7, #16\n\t"
  344. #else
  345. "lsr r7, r7, #16\n\t"
  346. #endif
  347. #ifdef WOLFSSL_KEIL
  348. "muls r7, r6, r7\n\t"
  349. #elif defined(__clang__)
  350. "muls r7, r6\n\t"
  351. #else
  352. "mul r7, r6\n\t"
  353. #endif
  354. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  355. "adds r4, r4, r7\n\t"
  356. #else
  357. "add r4, r4, r7\n\t"
  358. #endif
  359. #ifdef WOLFSSL_KEIL
  360. "adcs r5, r5, %[tmp]\n\t"
  361. #elif defined(__clang__)
  362. "adcs r5, %[tmp]\n\t"
  363. #else
  364. "adc r5, %[tmp]\n\t"
  365. #endif
  366. "ldrh r7, [%[b]]\n\t"
  367. #ifdef WOLFSSL_KEIL
  368. "muls r6, r7, r6\n\t"
  369. #elif defined(__clang__)
  370. "muls r6, r7\n\t"
  371. #else
  372. "mul r6, r7\n\t"
  373. #endif
  374. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  375. "lsrs r7, r6, #16\n\t"
  376. #else
  377. "lsr r7, r6, #16\n\t"
  378. #endif
  379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  380. "lsls r6, r6, #16\n\t"
  381. #else
  382. "lsl r6, r6, #16\n\t"
  383. #endif
  384. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  385. "adds r3, r3, r6\n\t"
  386. #else
  387. "add r3, r3, r6\n\t"
  388. #endif
  389. #ifdef WOLFSSL_KEIL
  390. "adcs r4, r4, r7\n\t"
  391. #elif defined(__clang__)
  392. "adcs r4, r7\n\t"
  393. #else
  394. "adc r4, r7\n\t"
  395. #endif
  396. #ifdef WOLFSSL_KEIL
  397. "adcs r5, r5, %[tmp]\n\t"
  398. #elif defined(__clang__)
  399. "adcs r5, %[tmp]\n\t"
  400. #else
  401. "adc r5, %[tmp]\n\t"
  402. #endif
  403. "# Multiply Done\n\t"
  404. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  405. "adds %[a], %[a], #4\n\t"
  406. #else
  407. "add %[a], %[a], #4\n\t"
  408. #endif
  409. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  410. "subs %[b], %[b], #4\n\t"
  411. #else
  412. "sub %[b], %[b], #4\n\t"
  413. #endif
  414. "cmp %[a], r12\n\t"
  415. "beq L_sp_2048_mul_8_done_mul_%=\n\t"
  416. "mov r6, r8\n\t"
  417. "add r6, r6, r9\n\t"
  418. "cmp %[a], r6\n\t"
  419. "ble L_sp_2048_mul_8_mul_%=\n\t"
  420. "\n"
  421. "L_sp_2048_mul_8_done_mul_%=:\n\t"
  422. "mov %[tmp], r11\n\t"
  423. "mov r7, r8\n\t"
  424. "str r3, [%[tmp], r7]\n\t"
  425. "movs r3, r4\n\t"
  426. "movs r4, r5\n\t"
  427. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  428. "adds r7, r7, #4\n\t"
  429. #else
  430. "add r7, r7, #4\n\t"
  431. #endif
  432. "mov r8, r7\n\t"
  433. "movs r6, #56\n\t"
  434. "cmp r7, r6\n\t"
  435. "ble L_sp_2048_mul_8_words_%=\n\t"
  436. "str r3, [%[tmp], r7]\n\t"
  437. "mov %[a], r9\n\t"
  438. "mov %[b], r10\n\t"
  439. : [a] "+l" (a), [b] "+l" (b), [tmp] "+l" (tmp)
  440. :
  441. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  442. );
  443. XMEMCPY(r, t, sizeof(t));
  444. }
  445. #else
  446. /* Multiply a and b into r. (r = a * b)
  447. *
  448. * r A single precision integer.
  449. * a A single precision integer.
  450. * b A single precision integer.
  451. */
  452. SP_NOINLINE static void sp_2048_mul_8(sp_digit* r, const sp_digit* a,
  453. const sp_digit* b)
  454. {
  455. __asm__ __volatile__ (
  456. "sub sp, sp, #32\n\t"
  457. "mov r8, %[r]\n\t"
  458. "mov r9, %[a]\n\t"
  459. "mov r10, %[b]\n\t"
  460. "movs %[r], #0\n\t"
  461. "# A[0] * B[0]\n\t"
  462. "ldr %[a], [%[a]]\n\t"
  463. "ldr %[b], [%[b]]\n\t"
  464. "uxth r6, %[a]\n\t"
  465. "uxth r3, %[b]\n\t"
  466. #ifdef WOLFSSL_KEIL
  467. "muls r3, r6, r3\n\t"
  468. #elif defined(__clang__)
  469. "muls r3, r6\n\t"
  470. #else
  471. "mul r3, r6\n\t"
  472. #endif
  473. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  474. "lsrs r7, %[b], #16\n\t"
  475. #else
  476. "lsr r7, %[b], #16\n\t"
  477. #endif
  478. #ifdef WOLFSSL_KEIL
  479. "muls r6, r7, r6\n\t"
  480. #elif defined(__clang__)
  481. "muls r6, r7\n\t"
  482. #else
  483. "mul r6, r7\n\t"
  484. #endif
  485. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  486. "lsrs r4, r6, #16\n\t"
  487. #else
  488. "lsr r4, r6, #16\n\t"
  489. #endif
  490. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  491. "lsls r6, r6, #16\n\t"
  492. #else
  493. "lsl r6, r6, #16\n\t"
  494. #endif
  495. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  496. "adds r3, r3, r6\n\t"
  497. #else
  498. "add r3, r3, r6\n\t"
  499. #endif
  500. #ifdef WOLFSSL_KEIL
  501. "adcs r4, r4, %[r]\n\t"
  502. #elif defined(__clang__)
  503. "adcs r4, %[r]\n\t"
  504. #else
  505. "adc r4, %[r]\n\t"
  506. #endif
  507. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  508. "lsrs r6, %[a], #16\n\t"
  509. #else
  510. "lsr r6, %[a], #16\n\t"
  511. #endif
  512. #ifdef WOLFSSL_KEIL
  513. "muls r7, r6, r7\n\t"
  514. #elif defined(__clang__)
  515. "muls r7, r6\n\t"
  516. #else
  517. "mul r7, r6\n\t"
  518. #endif
  519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  520. "adds r4, r4, r7\n\t"
  521. #else
  522. "add r4, r4, r7\n\t"
  523. #endif
  524. "uxth r7, %[b]\n\t"
  525. #ifdef WOLFSSL_KEIL
  526. "muls r6, r7, r6\n\t"
  527. #elif defined(__clang__)
  528. "muls r6, r7\n\t"
  529. #else
  530. "mul r6, r7\n\t"
  531. #endif
  532. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  533. "lsrs r7, r6, #16\n\t"
  534. #else
  535. "lsr r7, r6, #16\n\t"
  536. #endif
  537. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  538. "lsls r6, r6, #16\n\t"
  539. #else
  540. "lsl r6, r6, #16\n\t"
  541. #endif
  542. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  543. "adds r3, r3, r6\n\t"
  544. #else
  545. "add r3, r3, r6\n\t"
  546. #endif
  547. #ifdef WOLFSSL_KEIL
  548. "adcs r4, r4, r7\n\t"
  549. #elif defined(__clang__)
  550. "adcs r4, r7\n\t"
  551. #else
  552. "adc r4, r7\n\t"
  553. #endif
  554. "movs r5, #0\n\t"
  555. "str r3, [sp]\n\t"
  556. "# A[0] * B[1]\n\t"
  557. "movs r3, #0\n\t"
  558. "mov %[a], r9\n\t"
  559. "mov %[b], r10\n\t"
  560. "ldr %[a], [%[a]]\n\t"
  561. "ldr %[b], [%[b], #4]\n\t"
  562. "uxth r6, %[a]\n\t"
  563. "uxth r7, %[b]\n\t"
  564. #ifdef WOLFSSL_KEIL
  565. "muls r7, r6, r7\n\t"
  566. #elif defined(__clang__)
  567. "muls r7, r6\n\t"
  568. #else
  569. "mul r7, r6\n\t"
  570. #endif
  571. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  572. "adds r4, r4, r7\n\t"
  573. #else
  574. "add r4, r4, r7\n\t"
  575. #endif
  576. #ifdef WOLFSSL_KEIL
  577. "adcs r5, r5, %[r]\n\t"
  578. #elif defined(__clang__)
  579. "adcs r5, %[r]\n\t"
  580. #else
  581. "adc r5, %[r]\n\t"
  582. #endif
  583. #ifdef WOLFSSL_KEIL
  584. "adcs r3, r3, %[r]\n\t"
  585. #elif defined(__clang__)
  586. "adcs r3, %[r]\n\t"
  587. #else
  588. "adc r3, %[r]\n\t"
  589. #endif
  590. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  591. "lsrs r7, %[b], #16\n\t"
  592. #else
  593. "lsr r7, %[b], #16\n\t"
  594. #endif
  595. #ifdef WOLFSSL_KEIL
  596. "muls r6, r7, r6\n\t"
  597. #elif defined(__clang__)
  598. "muls r6, r7\n\t"
  599. #else
  600. "mul r6, r7\n\t"
  601. #endif
  602. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  603. "lsrs r7, r6, #16\n\t"
  604. #else
  605. "lsr r7, r6, #16\n\t"
  606. #endif
  607. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  608. "lsls r6, r6, #16\n\t"
  609. #else
  610. "lsl r6, r6, #16\n\t"
  611. #endif
  612. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  613. "adds r4, r4, r6\n\t"
  614. #else
  615. "add r4, r4, r6\n\t"
  616. #endif
  617. #ifdef WOLFSSL_KEIL
  618. "adcs r5, r5, r7\n\t"
  619. #elif defined(__clang__)
  620. "adcs r5, r7\n\t"
  621. #else
  622. "adc r5, r7\n\t"
  623. #endif
  624. #ifdef WOLFSSL_KEIL
  625. "adcs r3, r3, %[r]\n\t"
  626. #elif defined(__clang__)
  627. "adcs r3, %[r]\n\t"
  628. #else
  629. "adc r3, %[r]\n\t"
  630. #endif
  631. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  632. "lsrs r6, %[a], #16\n\t"
  633. #else
  634. "lsr r6, %[a], #16\n\t"
  635. #endif
  636. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  637. "lsrs r7, %[b], #16\n\t"
  638. #else
  639. "lsr r7, %[b], #16\n\t"
  640. #endif
  641. #ifdef WOLFSSL_KEIL
  642. "muls r7, r6, r7\n\t"
  643. #elif defined(__clang__)
  644. "muls r7, r6\n\t"
  645. #else
  646. "mul r7, r6\n\t"
  647. #endif
  648. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  649. "adds r5, r5, r7\n\t"
  650. #else
  651. "add r5, r5, r7\n\t"
  652. #endif
  653. #ifdef WOLFSSL_KEIL
  654. "adcs r3, r3, %[r]\n\t"
  655. #elif defined(__clang__)
  656. "adcs r3, %[r]\n\t"
  657. #else
  658. "adc r3, %[r]\n\t"
  659. #endif
  660. "uxth r7, %[b]\n\t"
  661. #ifdef WOLFSSL_KEIL
  662. "muls r6, r7, r6\n\t"
  663. #elif defined(__clang__)
  664. "muls r6, r7\n\t"
  665. #else
  666. "mul r6, r7\n\t"
  667. #endif
  668. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  669. "lsrs r7, r6, #16\n\t"
  670. #else
  671. "lsr r7, r6, #16\n\t"
  672. #endif
  673. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  674. "lsls r6, r6, #16\n\t"
  675. #else
  676. "lsl r6, r6, #16\n\t"
  677. #endif
  678. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  679. "adds r4, r4, r6\n\t"
  680. #else
  681. "add r4, r4, r6\n\t"
  682. #endif
  683. #ifdef WOLFSSL_KEIL
  684. "adcs r5, r5, r7\n\t"
  685. #elif defined(__clang__)
  686. "adcs r5, r7\n\t"
  687. #else
  688. "adc r5, r7\n\t"
  689. #endif
  690. #ifdef WOLFSSL_KEIL
  691. "adcs r3, r3, %[r]\n\t"
  692. #elif defined(__clang__)
  693. "adcs r3, %[r]\n\t"
  694. #else
  695. "adc r3, %[r]\n\t"
  696. #endif
  697. "# A[1] * B[0]\n\t"
  698. "mov %[a], r9\n\t"
  699. "mov %[b], r10\n\t"
  700. "ldr %[a], [%[a], #4]\n\t"
  701. "ldr %[b], [%[b]]\n\t"
  702. "uxth r6, %[a]\n\t"
  703. "uxth r7, %[b]\n\t"
  704. #ifdef WOLFSSL_KEIL
  705. "muls r7, r6, r7\n\t"
  706. #elif defined(__clang__)
  707. "muls r7, r6\n\t"
  708. #else
  709. "mul r7, r6\n\t"
  710. #endif
  711. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  712. "adds r4, r4, r7\n\t"
  713. #else
  714. "add r4, r4, r7\n\t"
  715. #endif
  716. #ifdef WOLFSSL_KEIL
  717. "adcs r5, r5, %[r]\n\t"
  718. #elif defined(__clang__)
  719. "adcs r5, %[r]\n\t"
  720. #else
  721. "adc r5, %[r]\n\t"
  722. #endif
  723. #ifdef WOLFSSL_KEIL
  724. "adcs r3, r3, %[r]\n\t"
  725. #elif defined(__clang__)
  726. "adcs r3, %[r]\n\t"
  727. #else
  728. "adc r3, %[r]\n\t"
  729. #endif
  730. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  731. "lsrs r7, %[b], #16\n\t"
  732. #else
  733. "lsr r7, %[b], #16\n\t"
  734. #endif
  735. #ifdef WOLFSSL_KEIL
  736. "muls r6, r7, r6\n\t"
  737. #elif defined(__clang__)
  738. "muls r6, r7\n\t"
  739. #else
  740. "mul r6, r7\n\t"
  741. #endif
  742. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  743. "lsrs r7, r6, #16\n\t"
  744. #else
  745. "lsr r7, r6, #16\n\t"
  746. #endif
  747. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  748. "lsls r6, r6, #16\n\t"
  749. #else
  750. "lsl r6, r6, #16\n\t"
  751. #endif
  752. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  753. "adds r4, r4, r6\n\t"
  754. #else
  755. "add r4, r4, r6\n\t"
  756. #endif
  757. #ifdef WOLFSSL_KEIL
  758. "adcs r5, r5, r7\n\t"
  759. #elif defined(__clang__)
  760. "adcs r5, r7\n\t"
  761. #else
  762. "adc r5, r7\n\t"
  763. #endif
  764. #ifdef WOLFSSL_KEIL
  765. "adcs r3, r3, %[r]\n\t"
  766. #elif defined(__clang__)
  767. "adcs r3, %[r]\n\t"
  768. #else
  769. "adc r3, %[r]\n\t"
  770. #endif
  771. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  772. "lsrs r6, %[a], #16\n\t"
  773. #else
  774. "lsr r6, %[a], #16\n\t"
  775. #endif
  776. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  777. "lsrs r7, %[b], #16\n\t"
  778. #else
  779. "lsr r7, %[b], #16\n\t"
  780. #endif
  781. #ifdef WOLFSSL_KEIL
  782. "muls r7, r6, r7\n\t"
  783. #elif defined(__clang__)
  784. "muls r7, r6\n\t"
  785. #else
  786. "mul r7, r6\n\t"
  787. #endif
  788. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  789. "adds r5, r5, r7\n\t"
  790. #else
  791. "add r5, r5, r7\n\t"
  792. #endif
  793. #ifdef WOLFSSL_KEIL
  794. "adcs r3, r3, %[r]\n\t"
  795. #elif defined(__clang__)
  796. "adcs r3, %[r]\n\t"
  797. #else
  798. "adc r3, %[r]\n\t"
  799. #endif
  800. "uxth r7, %[b]\n\t"
  801. #ifdef WOLFSSL_KEIL
  802. "muls r6, r7, r6\n\t"
  803. #elif defined(__clang__)
  804. "muls r6, r7\n\t"
  805. #else
  806. "mul r6, r7\n\t"
  807. #endif
  808. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  809. "lsrs r7, r6, #16\n\t"
  810. #else
  811. "lsr r7, r6, #16\n\t"
  812. #endif
  813. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  814. "lsls r6, r6, #16\n\t"
  815. #else
  816. "lsl r6, r6, #16\n\t"
  817. #endif
  818. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  819. "adds r4, r4, r6\n\t"
  820. #else
  821. "add r4, r4, r6\n\t"
  822. #endif
  823. #ifdef WOLFSSL_KEIL
  824. "adcs r5, r5, r7\n\t"
  825. #elif defined(__clang__)
  826. "adcs r5, r7\n\t"
  827. #else
  828. "adc r5, r7\n\t"
  829. #endif
  830. #ifdef WOLFSSL_KEIL
  831. "adcs r3, r3, %[r]\n\t"
  832. #elif defined(__clang__)
  833. "adcs r3, %[r]\n\t"
  834. #else
  835. "adc r3, %[r]\n\t"
  836. #endif
  837. "str r4, [sp, #4]\n\t"
  838. "# A[2] * B[0]\n\t"
  839. "movs r4, #0\n\t"
  840. "mov %[a], r9\n\t"
  841. "mov %[b], r10\n\t"
  842. "ldr %[a], [%[a], #8]\n\t"
  843. "ldr %[b], [%[b]]\n\t"
  844. "uxth r6, %[a]\n\t"
  845. "uxth r7, %[b]\n\t"
  846. #ifdef WOLFSSL_KEIL
  847. "muls r7, r6, r7\n\t"
  848. #elif defined(__clang__)
  849. "muls r7, r6\n\t"
  850. #else
  851. "mul r7, r6\n\t"
  852. #endif
  853. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  854. "adds r5, r5, r7\n\t"
  855. #else
  856. "add r5, r5, r7\n\t"
  857. #endif
  858. #ifdef WOLFSSL_KEIL
  859. "adcs r3, r3, %[r]\n\t"
  860. #elif defined(__clang__)
  861. "adcs r3, %[r]\n\t"
  862. #else
  863. "adc r3, %[r]\n\t"
  864. #endif
  865. #ifdef WOLFSSL_KEIL
  866. "adcs r4, r4, %[r]\n\t"
  867. #elif defined(__clang__)
  868. "adcs r4, %[r]\n\t"
  869. #else
  870. "adc r4, %[r]\n\t"
  871. #endif
  872. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  873. "lsrs r7, %[b], #16\n\t"
  874. #else
  875. "lsr r7, %[b], #16\n\t"
  876. #endif
  877. #ifdef WOLFSSL_KEIL
  878. "muls r6, r7, r6\n\t"
  879. #elif defined(__clang__)
  880. "muls r6, r7\n\t"
  881. #else
  882. "mul r6, r7\n\t"
  883. #endif
  884. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  885. "lsrs r7, r6, #16\n\t"
  886. #else
  887. "lsr r7, r6, #16\n\t"
  888. #endif
  889. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  890. "lsls r6, r6, #16\n\t"
  891. #else
  892. "lsl r6, r6, #16\n\t"
  893. #endif
  894. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  895. "adds r5, r5, r6\n\t"
  896. #else
  897. "add r5, r5, r6\n\t"
  898. #endif
  899. #ifdef WOLFSSL_KEIL
  900. "adcs r3, r3, r7\n\t"
  901. #elif defined(__clang__)
  902. "adcs r3, r7\n\t"
  903. #else
  904. "adc r3, r7\n\t"
  905. #endif
  906. #ifdef WOLFSSL_KEIL
  907. "adcs r4, r4, %[r]\n\t"
  908. #elif defined(__clang__)
  909. "adcs r4, %[r]\n\t"
  910. #else
  911. "adc r4, %[r]\n\t"
  912. #endif
  913. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  914. "lsrs r6, %[a], #16\n\t"
  915. #else
  916. "lsr r6, %[a], #16\n\t"
  917. #endif
  918. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  919. "lsrs r7, %[b], #16\n\t"
  920. #else
  921. "lsr r7, %[b], #16\n\t"
  922. #endif
  923. #ifdef WOLFSSL_KEIL
  924. "muls r7, r6, r7\n\t"
  925. #elif defined(__clang__)
  926. "muls r7, r6\n\t"
  927. #else
  928. "mul r7, r6\n\t"
  929. #endif
  930. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  931. "adds r3, r3, r7\n\t"
  932. #else
  933. "add r3, r3, r7\n\t"
  934. #endif
  935. #ifdef WOLFSSL_KEIL
  936. "adcs r4, r4, %[r]\n\t"
  937. #elif defined(__clang__)
  938. "adcs r4, %[r]\n\t"
  939. #else
  940. "adc r4, %[r]\n\t"
  941. #endif
  942. "uxth r7, %[b]\n\t"
  943. #ifdef WOLFSSL_KEIL
  944. "muls r6, r7, r6\n\t"
  945. #elif defined(__clang__)
  946. "muls r6, r7\n\t"
  947. #else
  948. "mul r6, r7\n\t"
  949. #endif
  950. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  951. "lsrs r7, r6, #16\n\t"
  952. #else
  953. "lsr r7, r6, #16\n\t"
  954. #endif
  955. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  956. "lsls r6, r6, #16\n\t"
  957. #else
  958. "lsl r6, r6, #16\n\t"
  959. #endif
  960. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  961. "adds r5, r5, r6\n\t"
  962. #else
  963. "add r5, r5, r6\n\t"
  964. #endif
  965. #ifdef WOLFSSL_KEIL
  966. "adcs r3, r3, r7\n\t"
  967. #elif defined(__clang__)
  968. "adcs r3, r7\n\t"
  969. #else
  970. "adc r3, r7\n\t"
  971. #endif
  972. #ifdef WOLFSSL_KEIL
  973. "adcs r4, r4, %[r]\n\t"
  974. #elif defined(__clang__)
  975. "adcs r4, %[r]\n\t"
  976. #else
  977. "adc r4, %[r]\n\t"
  978. #endif
  979. "# A[1] * B[1]\n\t"
  980. "mov %[a], r9\n\t"
  981. "mov %[b], r10\n\t"
  982. "ldr %[a], [%[a], #4]\n\t"
  983. "ldr %[b], [%[b], #4]\n\t"
  984. "uxth r6, %[a]\n\t"
  985. "uxth r7, %[b]\n\t"
  986. #ifdef WOLFSSL_KEIL
  987. "muls r7, r6, r7\n\t"
  988. #elif defined(__clang__)
  989. "muls r7, r6\n\t"
  990. #else
  991. "mul r7, r6\n\t"
  992. #endif
  993. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  994. "adds r5, r5, r7\n\t"
  995. #else
  996. "add r5, r5, r7\n\t"
  997. #endif
  998. #ifdef WOLFSSL_KEIL
  999. "adcs r3, r3, %[r]\n\t"
  1000. #elif defined(__clang__)
  1001. "adcs r3, %[r]\n\t"
  1002. #else
  1003. "adc r3, %[r]\n\t"
  1004. #endif
  1005. #ifdef WOLFSSL_KEIL
  1006. "adcs r4, r4, %[r]\n\t"
  1007. #elif defined(__clang__)
  1008. "adcs r4, %[r]\n\t"
  1009. #else
  1010. "adc r4, %[r]\n\t"
  1011. #endif
  1012. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1013. "lsrs r7, %[b], #16\n\t"
  1014. #else
  1015. "lsr r7, %[b], #16\n\t"
  1016. #endif
  1017. #ifdef WOLFSSL_KEIL
  1018. "muls r6, r7, r6\n\t"
  1019. #elif defined(__clang__)
  1020. "muls r6, r7\n\t"
  1021. #else
  1022. "mul r6, r7\n\t"
  1023. #endif
  1024. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1025. "lsrs r7, r6, #16\n\t"
  1026. #else
  1027. "lsr r7, r6, #16\n\t"
  1028. #endif
  1029. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1030. "lsls r6, r6, #16\n\t"
  1031. #else
  1032. "lsl r6, r6, #16\n\t"
  1033. #endif
  1034. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1035. "adds r5, r5, r6\n\t"
  1036. #else
  1037. "add r5, r5, r6\n\t"
  1038. #endif
  1039. #ifdef WOLFSSL_KEIL
  1040. "adcs r3, r3, r7\n\t"
  1041. #elif defined(__clang__)
  1042. "adcs r3, r7\n\t"
  1043. #else
  1044. "adc r3, r7\n\t"
  1045. #endif
  1046. #ifdef WOLFSSL_KEIL
  1047. "adcs r4, r4, %[r]\n\t"
  1048. #elif defined(__clang__)
  1049. "adcs r4, %[r]\n\t"
  1050. #else
  1051. "adc r4, %[r]\n\t"
  1052. #endif
  1053. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1054. "lsrs r6, %[a], #16\n\t"
  1055. #else
  1056. "lsr r6, %[a], #16\n\t"
  1057. #endif
  1058. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1059. "lsrs r7, %[b], #16\n\t"
  1060. #else
  1061. "lsr r7, %[b], #16\n\t"
  1062. #endif
  1063. #ifdef WOLFSSL_KEIL
  1064. "muls r7, r6, r7\n\t"
  1065. #elif defined(__clang__)
  1066. "muls r7, r6\n\t"
  1067. #else
  1068. "mul r7, r6\n\t"
  1069. #endif
  1070. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1071. "adds r3, r3, r7\n\t"
  1072. #else
  1073. "add r3, r3, r7\n\t"
  1074. #endif
  1075. #ifdef WOLFSSL_KEIL
  1076. "adcs r4, r4, %[r]\n\t"
  1077. #elif defined(__clang__)
  1078. "adcs r4, %[r]\n\t"
  1079. #else
  1080. "adc r4, %[r]\n\t"
  1081. #endif
  1082. "uxth r7, %[b]\n\t"
  1083. #ifdef WOLFSSL_KEIL
  1084. "muls r6, r7, r6\n\t"
  1085. #elif defined(__clang__)
  1086. "muls r6, r7\n\t"
  1087. #else
  1088. "mul r6, r7\n\t"
  1089. #endif
  1090. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1091. "lsrs r7, r6, #16\n\t"
  1092. #else
  1093. "lsr r7, r6, #16\n\t"
  1094. #endif
  1095. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1096. "lsls r6, r6, #16\n\t"
  1097. #else
  1098. "lsl r6, r6, #16\n\t"
  1099. #endif
  1100. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1101. "adds r5, r5, r6\n\t"
  1102. #else
  1103. "add r5, r5, r6\n\t"
  1104. #endif
  1105. #ifdef WOLFSSL_KEIL
  1106. "adcs r3, r3, r7\n\t"
  1107. #elif defined(__clang__)
  1108. "adcs r3, r7\n\t"
  1109. #else
  1110. "adc r3, r7\n\t"
  1111. #endif
  1112. #ifdef WOLFSSL_KEIL
  1113. "adcs r4, r4, %[r]\n\t"
  1114. #elif defined(__clang__)
  1115. "adcs r4, %[r]\n\t"
  1116. #else
  1117. "adc r4, %[r]\n\t"
  1118. #endif
  1119. "# A[0] * B[2]\n\t"
  1120. "mov %[a], r9\n\t"
  1121. "mov %[b], r10\n\t"
  1122. "ldr %[a], [%[a]]\n\t"
  1123. "ldr %[b], [%[b], #8]\n\t"
  1124. "uxth r6, %[a]\n\t"
  1125. "uxth r7, %[b]\n\t"
  1126. #ifdef WOLFSSL_KEIL
  1127. "muls r7, r6, r7\n\t"
  1128. #elif defined(__clang__)
  1129. "muls r7, r6\n\t"
  1130. #else
  1131. "mul r7, r6\n\t"
  1132. #endif
  1133. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1134. "adds r5, r5, r7\n\t"
  1135. #else
  1136. "add r5, r5, r7\n\t"
  1137. #endif
  1138. #ifdef WOLFSSL_KEIL
  1139. "adcs r3, r3, %[r]\n\t"
  1140. #elif defined(__clang__)
  1141. "adcs r3, %[r]\n\t"
  1142. #else
  1143. "adc r3, %[r]\n\t"
  1144. #endif
  1145. #ifdef WOLFSSL_KEIL
  1146. "adcs r4, r4, %[r]\n\t"
  1147. #elif defined(__clang__)
  1148. "adcs r4, %[r]\n\t"
  1149. #else
  1150. "adc r4, %[r]\n\t"
  1151. #endif
  1152. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1153. "lsrs r7, %[b], #16\n\t"
  1154. #else
  1155. "lsr r7, %[b], #16\n\t"
  1156. #endif
  1157. #ifdef WOLFSSL_KEIL
  1158. "muls r6, r7, r6\n\t"
  1159. #elif defined(__clang__)
  1160. "muls r6, r7\n\t"
  1161. #else
  1162. "mul r6, r7\n\t"
  1163. #endif
  1164. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1165. "lsrs r7, r6, #16\n\t"
  1166. #else
  1167. "lsr r7, r6, #16\n\t"
  1168. #endif
  1169. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1170. "lsls r6, r6, #16\n\t"
  1171. #else
  1172. "lsl r6, r6, #16\n\t"
  1173. #endif
  1174. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1175. "adds r5, r5, r6\n\t"
  1176. #else
  1177. "add r5, r5, r6\n\t"
  1178. #endif
  1179. #ifdef WOLFSSL_KEIL
  1180. "adcs r3, r3, r7\n\t"
  1181. #elif defined(__clang__)
  1182. "adcs r3, r7\n\t"
  1183. #else
  1184. "adc r3, r7\n\t"
  1185. #endif
  1186. #ifdef WOLFSSL_KEIL
  1187. "adcs r4, r4, %[r]\n\t"
  1188. #elif defined(__clang__)
  1189. "adcs r4, %[r]\n\t"
  1190. #else
  1191. "adc r4, %[r]\n\t"
  1192. #endif
  1193. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1194. "lsrs r6, %[a], #16\n\t"
  1195. #else
  1196. "lsr r6, %[a], #16\n\t"
  1197. #endif
  1198. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1199. "lsrs r7, %[b], #16\n\t"
  1200. #else
  1201. "lsr r7, %[b], #16\n\t"
  1202. #endif
  1203. #ifdef WOLFSSL_KEIL
  1204. "muls r7, r6, r7\n\t"
  1205. #elif defined(__clang__)
  1206. "muls r7, r6\n\t"
  1207. #else
  1208. "mul r7, r6\n\t"
  1209. #endif
  1210. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1211. "adds r3, r3, r7\n\t"
  1212. #else
  1213. "add r3, r3, r7\n\t"
  1214. #endif
  1215. #ifdef WOLFSSL_KEIL
  1216. "adcs r4, r4, %[r]\n\t"
  1217. #elif defined(__clang__)
  1218. "adcs r4, %[r]\n\t"
  1219. #else
  1220. "adc r4, %[r]\n\t"
  1221. #endif
  1222. "uxth r7, %[b]\n\t"
  1223. #ifdef WOLFSSL_KEIL
  1224. "muls r6, r7, r6\n\t"
  1225. #elif defined(__clang__)
  1226. "muls r6, r7\n\t"
  1227. #else
  1228. "mul r6, r7\n\t"
  1229. #endif
  1230. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1231. "lsrs r7, r6, #16\n\t"
  1232. #else
  1233. "lsr r7, r6, #16\n\t"
  1234. #endif
  1235. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1236. "lsls r6, r6, #16\n\t"
  1237. #else
  1238. "lsl r6, r6, #16\n\t"
  1239. #endif
  1240. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1241. "adds r5, r5, r6\n\t"
  1242. #else
  1243. "add r5, r5, r6\n\t"
  1244. #endif
  1245. #ifdef WOLFSSL_KEIL
  1246. "adcs r3, r3, r7\n\t"
  1247. #elif defined(__clang__)
  1248. "adcs r3, r7\n\t"
  1249. #else
  1250. "adc r3, r7\n\t"
  1251. #endif
  1252. #ifdef WOLFSSL_KEIL
  1253. "adcs r4, r4, %[r]\n\t"
  1254. #elif defined(__clang__)
  1255. "adcs r4, %[r]\n\t"
  1256. #else
  1257. "adc r4, %[r]\n\t"
  1258. #endif
  1259. "str r5, [sp, #8]\n\t"
  1260. "# A[0] * B[3]\n\t"
  1261. "movs r5, #0\n\t"
  1262. "mov %[a], r9\n\t"
  1263. "mov %[b], r10\n\t"
  1264. "ldr %[a], [%[a]]\n\t"
  1265. "ldr %[b], [%[b], #12]\n\t"
  1266. "uxth r6, %[a]\n\t"
  1267. "uxth r7, %[b]\n\t"
  1268. #ifdef WOLFSSL_KEIL
  1269. "muls r7, r6, r7\n\t"
  1270. #elif defined(__clang__)
  1271. "muls r7, r6\n\t"
  1272. #else
  1273. "mul r7, r6\n\t"
  1274. #endif
  1275. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1276. "adds r3, r3, r7\n\t"
  1277. #else
  1278. "add r3, r3, r7\n\t"
  1279. #endif
  1280. #ifdef WOLFSSL_KEIL
  1281. "adcs r4, r4, %[r]\n\t"
  1282. #elif defined(__clang__)
  1283. "adcs r4, %[r]\n\t"
  1284. #else
  1285. "adc r4, %[r]\n\t"
  1286. #endif
  1287. #ifdef WOLFSSL_KEIL
  1288. "adcs r5, r5, %[r]\n\t"
  1289. #elif defined(__clang__)
  1290. "adcs r5, %[r]\n\t"
  1291. #else
  1292. "adc r5, %[r]\n\t"
  1293. #endif
  1294. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1295. "lsrs r7, %[b], #16\n\t"
  1296. #else
  1297. "lsr r7, %[b], #16\n\t"
  1298. #endif
  1299. #ifdef WOLFSSL_KEIL
  1300. "muls r6, r7, r6\n\t"
  1301. #elif defined(__clang__)
  1302. "muls r6, r7\n\t"
  1303. #else
  1304. "mul r6, r7\n\t"
  1305. #endif
  1306. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1307. "lsrs r7, r6, #16\n\t"
  1308. #else
  1309. "lsr r7, r6, #16\n\t"
  1310. #endif
  1311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1312. "lsls r6, r6, #16\n\t"
  1313. #else
  1314. "lsl r6, r6, #16\n\t"
  1315. #endif
  1316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1317. "adds r3, r3, r6\n\t"
  1318. #else
  1319. "add r3, r3, r6\n\t"
  1320. #endif
  1321. #ifdef WOLFSSL_KEIL
  1322. "adcs r4, r4, r7\n\t"
  1323. #elif defined(__clang__)
  1324. "adcs r4, r7\n\t"
  1325. #else
  1326. "adc r4, r7\n\t"
  1327. #endif
  1328. #ifdef WOLFSSL_KEIL
  1329. "adcs r5, r5, %[r]\n\t"
  1330. #elif defined(__clang__)
  1331. "adcs r5, %[r]\n\t"
  1332. #else
  1333. "adc r5, %[r]\n\t"
  1334. #endif
  1335. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1336. "lsrs r6, %[a], #16\n\t"
  1337. #else
  1338. "lsr r6, %[a], #16\n\t"
  1339. #endif
  1340. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1341. "lsrs r7, %[b], #16\n\t"
  1342. #else
  1343. "lsr r7, %[b], #16\n\t"
  1344. #endif
  1345. #ifdef WOLFSSL_KEIL
  1346. "muls r7, r6, r7\n\t"
  1347. #elif defined(__clang__)
  1348. "muls r7, r6\n\t"
  1349. #else
  1350. "mul r7, r6\n\t"
  1351. #endif
  1352. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1353. "adds r4, r4, r7\n\t"
  1354. #else
  1355. "add r4, r4, r7\n\t"
  1356. #endif
  1357. #ifdef WOLFSSL_KEIL
  1358. "adcs r5, r5, %[r]\n\t"
  1359. #elif defined(__clang__)
  1360. "adcs r5, %[r]\n\t"
  1361. #else
  1362. "adc r5, %[r]\n\t"
  1363. #endif
  1364. "uxth r7, %[b]\n\t"
  1365. #ifdef WOLFSSL_KEIL
  1366. "muls r6, r7, r6\n\t"
  1367. #elif defined(__clang__)
  1368. "muls r6, r7\n\t"
  1369. #else
  1370. "mul r6, r7\n\t"
  1371. #endif
  1372. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1373. "lsrs r7, r6, #16\n\t"
  1374. #else
  1375. "lsr r7, r6, #16\n\t"
  1376. #endif
  1377. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1378. "lsls r6, r6, #16\n\t"
  1379. #else
  1380. "lsl r6, r6, #16\n\t"
  1381. #endif
  1382. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1383. "adds r3, r3, r6\n\t"
  1384. #else
  1385. "add r3, r3, r6\n\t"
  1386. #endif
  1387. #ifdef WOLFSSL_KEIL
  1388. "adcs r4, r4, r7\n\t"
  1389. #elif defined(__clang__)
  1390. "adcs r4, r7\n\t"
  1391. #else
  1392. "adc r4, r7\n\t"
  1393. #endif
  1394. #ifdef WOLFSSL_KEIL
  1395. "adcs r5, r5, %[r]\n\t"
  1396. #elif defined(__clang__)
  1397. "adcs r5, %[r]\n\t"
  1398. #else
  1399. "adc r5, %[r]\n\t"
  1400. #endif
  1401. "# A[1] * B[2]\n\t"
  1402. "mov %[a], r9\n\t"
  1403. "mov %[b], r10\n\t"
  1404. "ldr %[a], [%[a], #4]\n\t"
  1405. "ldr %[b], [%[b], #8]\n\t"
  1406. "uxth r6, %[a]\n\t"
  1407. "uxth r7, %[b]\n\t"
  1408. #ifdef WOLFSSL_KEIL
  1409. "muls r7, r6, r7\n\t"
  1410. #elif defined(__clang__)
  1411. "muls r7, r6\n\t"
  1412. #else
  1413. "mul r7, r6\n\t"
  1414. #endif
  1415. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1416. "adds r3, r3, r7\n\t"
  1417. #else
  1418. "add r3, r3, r7\n\t"
  1419. #endif
  1420. #ifdef WOLFSSL_KEIL
  1421. "adcs r4, r4, %[r]\n\t"
  1422. #elif defined(__clang__)
  1423. "adcs r4, %[r]\n\t"
  1424. #else
  1425. "adc r4, %[r]\n\t"
  1426. #endif
  1427. #ifdef WOLFSSL_KEIL
  1428. "adcs r5, r5, %[r]\n\t"
  1429. #elif defined(__clang__)
  1430. "adcs r5, %[r]\n\t"
  1431. #else
  1432. "adc r5, %[r]\n\t"
  1433. #endif
  1434. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1435. "lsrs r7, %[b], #16\n\t"
  1436. #else
  1437. "lsr r7, %[b], #16\n\t"
  1438. #endif
  1439. #ifdef WOLFSSL_KEIL
  1440. "muls r6, r7, r6\n\t"
  1441. #elif defined(__clang__)
  1442. "muls r6, r7\n\t"
  1443. #else
  1444. "mul r6, r7\n\t"
  1445. #endif
  1446. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1447. "lsrs r7, r6, #16\n\t"
  1448. #else
  1449. "lsr r7, r6, #16\n\t"
  1450. #endif
  1451. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1452. "lsls r6, r6, #16\n\t"
  1453. #else
  1454. "lsl r6, r6, #16\n\t"
  1455. #endif
  1456. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1457. "adds r3, r3, r6\n\t"
  1458. #else
  1459. "add r3, r3, r6\n\t"
  1460. #endif
  1461. #ifdef WOLFSSL_KEIL
  1462. "adcs r4, r4, r7\n\t"
  1463. #elif defined(__clang__)
  1464. "adcs r4, r7\n\t"
  1465. #else
  1466. "adc r4, r7\n\t"
  1467. #endif
  1468. #ifdef WOLFSSL_KEIL
  1469. "adcs r5, r5, %[r]\n\t"
  1470. #elif defined(__clang__)
  1471. "adcs r5, %[r]\n\t"
  1472. #else
  1473. "adc r5, %[r]\n\t"
  1474. #endif
  1475. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1476. "lsrs r6, %[a], #16\n\t"
  1477. #else
  1478. "lsr r6, %[a], #16\n\t"
  1479. #endif
  1480. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1481. "lsrs r7, %[b], #16\n\t"
  1482. #else
  1483. "lsr r7, %[b], #16\n\t"
  1484. #endif
  1485. #ifdef WOLFSSL_KEIL
  1486. "muls r7, r6, r7\n\t"
  1487. #elif defined(__clang__)
  1488. "muls r7, r6\n\t"
  1489. #else
  1490. "mul r7, r6\n\t"
  1491. #endif
  1492. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1493. "adds r4, r4, r7\n\t"
  1494. #else
  1495. "add r4, r4, r7\n\t"
  1496. #endif
  1497. #ifdef WOLFSSL_KEIL
  1498. "adcs r5, r5, %[r]\n\t"
  1499. #elif defined(__clang__)
  1500. "adcs r5, %[r]\n\t"
  1501. #else
  1502. "adc r5, %[r]\n\t"
  1503. #endif
  1504. "uxth r7, %[b]\n\t"
  1505. #ifdef WOLFSSL_KEIL
  1506. "muls r6, r7, r6\n\t"
  1507. #elif defined(__clang__)
  1508. "muls r6, r7\n\t"
  1509. #else
  1510. "mul r6, r7\n\t"
  1511. #endif
  1512. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1513. "lsrs r7, r6, #16\n\t"
  1514. #else
  1515. "lsr r7, r6, #16\n\t"
  1516. #endif
  1517. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1518. "lsls r6, r6, #16\n\t"
  1519. #else
  1520. "lsl r6, r6, #16\n\t"
  1521. #endif
  1522. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1523. "adds r3, r3, r6\n\t"
  1524. #else
  1525. "add r3, r3, r6\n\t"
  1526. #endif
  1527. #ifdef WOLFSSL_KEIL
  1528. "adcs r4, r4, r7\n\t"
  1529. #elif defined(__clang__)
  1530. "adcs r4, r7\n\t"
  1531. #else
  1532. "adc r4, r7\n\t"
  1533. #endif
  1534. #ifdef WOLFSSL_KEIL
  1535. "adcs r5, r5, %[r]\n\t"
  1536. #elif defined(__clang__)
  1537. "adcs r5, %[r]\n\t"
  1538. #else
  1539. "adc r5, %[r]\n\t"
  1540. #endif
  1541. "# A[2] * B[1]\n\t"
  1542. "mov %[a], r9\n\t"
  1543. "mov %[b], r10\n\t"
  1544. "ldr %[a], [%[a], #8]\n\t"
  1545. "ldr %[b], [%[b], #4]\n\t"
  1546. "uxth r6, %[a]\n\t"
  1547. "uxth r7, %[b]\n\t"
  1548. #ifdef WOLFSSL_KEIL
  1549. "muls r7, r6, r7\n\t"
  1550. #elif defined(__clang__)
  1551. "muls r7, r6\n\t"
  1552. #else
  1553. "mul r7, r6\n\t"
  1554. #endif
  1555. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1556. "adds r3, r3, r7\n\t"
  1557. #else
  1558. "add r3, r3, r7\n\t"
  1559. #endif
  1560. #ifdef WOLFSSL_KEIL
  1561. "adcs r4, r4, %[r]\n\t"
  1562. #elif defined(__clang__)
  1563. "adcs r4, %[r]\n\t"
  1564. #else
  1565. "adc r4, %[r]\n\t"
  1566. #endif
  1567. #ifdef WOLFSSL_KEIL
  1568. "adcs r5, r5, %[r]\n\t"
  1569. #elif defined(__clang__)
  1570. "adcs r5, %[r]\n\t"
  1571. #else
  1572. "adc r5, %[r]\n\t"
  1573. #endif
  1574. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1575. "lsrs r7, %[b], #16\n\t"
  1576. #else
  1577. "lsr r7, %[b], #16\n\t"
  1578. #endif
  1579. #ifdef WOLFSSL_KEIL
  1580. "muls r6, r7, r6\n\t"
  1581. #elif defined(__clang__)
  1582. "muls r6, r7\n\t"
  1583. #else
  1584. "mul r6, r7\n\t"
  1585. #endif
  1586. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1587. "lsrs r7, r6, #16\n\t"
  1588. #else
  1589. "lsr r7, r6, #16\n\t"
  1590. #endif
  1591. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1592. "lsls r6, r6, #16\n\t"
  1593. #else
  1594. "lsl r6, r6, #16\n\t"
  1595. #endif
  1596. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1597. "adds r3, r3, r6\n\t"
  1598. #else
  1599. "add r3, r3, r6\n\t"
  1600. #endif
  1601. #ifdef WOLFSSL_KEIL
  1602. "adcs r4, r4, r7\n\t"
  1603. #elif defined(__clang__)
  1604. "adcs r4, r7\n\t"
  1605. #else
  1606. "adc r4, r7\n\t"
  1607. #endif
  1608. #ifdef WOLFSSL_KEIL
  1609. "adcs r5, r5, %[r]\n\t"
  1610. #elif defined(__clang__)
  1611. "adcs r5, %[r]\n\t"
  1612. #else
  1613. "adc r5, %[r]\n\t"
  1614. #endif
  1615. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1616. "lsrs r6, %[a], #16\n\t"
  1617. #else
  1618. "lsr r6, %[a], #16\n\t"
  1619. #endif
  1620. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1621. "lsrs r7, %[b], #16\n\t"
  1622. #else
  1623. "lsr r7, %[b], #16\n\t"
  1624. #endif
  1625. #ifdef WOLFSSL_KEIL
  1626. "muls r7, r6, r7\n\t"
  1627. #elif defined(__clang__)
  1628. "muls r7, r6\n\t"
  1629. #else
  1630. "mul r7, r6\n\t"
  1631. #endif
  1632. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1633. "adds r4, r4, r7\n\t"
  1634. #else
  1635. "add r4, r4, r7\n\t"
  1636. #endif
  1637. #ifdef WOLFSSL_KEIL
  1638. "adcs r5, r5, %[r]\n\t"
  1639. #elif defined(__clang__)
  1640. "adcs r5, %[r]\n\t"
  1641. #else
  1642. "adc r5, %[r]\n\t"
  1643. #endif
  1644. "uxth r7, %[b]\n\t"
  1645. #ifdef WOLFSSL_KEIL
  1646. "muls r6, r7, r6\n\t"
  1647. #elif defined(__clang__)
  1648. "muls r6, r7\n\t"
  1649. #else
  1650. "mul r6, r7\n\t"
  1651. #endif
  1652. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1653. "lsrs r7, r6, #16\n\t"
  1654. #else
  1655. "lsr r7, r6, #16\n\t"
  1656. #endif
  1657. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1658. "lsls r6, r6, #16\n\t"
  1659. #else
  1660. "lsl r6, r6, #16\n\t"
  1661. #endif
  1662. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1663. "adds r3, r3, r6\n\t"
  1664. #else
  1665. "add r3, r3, r6\n\t"
  1666. #endif
  1667. #ifdef WOLFSSL_KEIL
  1668. "adcs r4, r4, r7\n\t"
  1669. #elif defined(__clang__)
  1670. "adcs r4, r7\n\t"
  1671. #else
  1672. "adc r4, r7\n\t"
  1673. #endif
  1674. #ifdef WOLFSSL_KEIL
  1675. "adcs r5, r5, %[r]\n\t"
  1676. #elif defined(__clang__)
  1677. "adcs r5, %[r]\n\t"
  1678. #else
  1679. "adc r5, %[r]\n\t"
  1680. #endif
  1681. "# A[3] * B[0]\n\t"
  1682. "mov %[a], r9\n\t"
  1683. "mov %[b], r10\n\t"
  1684. "ldr %[a], [%[a], #12]\n\t"
  1685. "ldr %[b], [%[b]]\n\t"
  1686. "uxth r6, %[a]\n\t"
  1687. "uxth r7, %[b]\n\t"
  1688. #ifdef WOLFSSL_KEIL
  1689. "muls r7, r6, r7\n\t"
  1690. #elif defined(__clang__)
  1691. "muls r7, r6\n\t"
  1692. #else
  1693. "mul r7, r6\n\t"
  1694. #endif
  1695. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1696. "adds r3, r3, r7\n\t"
  1697. #else
  1698. "add r3, r3, r7\n\t"
  1699. #endif
  1700. #ifdef WOLFSSL_KEIL
  1701. "adcs r4, r4, %[r]\n\t"
  1702. #elif defined(__clang__)
  1703. "adcs r4, %[r]\n\t"
  1704. #else
  1705. "adc r4, %[r]\n\t"
  1706. #endif
  1707. #ifdef WOLFSSL_KEIL
  1708. "adcs r5, r5, %[r]\n\t"
  1709. #elif defined(__clang__)
  1710. "adcs r5, %[r]\n\t"
  1711. #else
  1712. "adc r5, %[r]\n\t"
  1713. #endif
  1714. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1715. "lsrs r7, %[b], #16\n\t"
  1716. #else
  1717. "lsr r7, %[b], #16\n\t"
  1718. #endif
  1719. #ifdef WOLFSSL_KEIL
  1720. "muls r6, r7, r6\n\t"
  1721. #elif defined(__clang__)
  1722. "muls r6, r7\n\t"
  1723. #else
  1724. "mul r6, r7\n\t"
  1725. #endif
  1726. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1727. "lsrs r7, r6, #16\n\t"
  1728. #else
  1729. "lsr r7, r6, #16\n\t"
  1730. #endif
  1731. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1732. "lsls r6, r6, #16\n\t"
  1733. #else
  1734. "lsl r6, r6, #16\n\t"
  1735. #endif
  1736. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1737. "adds r3, r3, r6\n\t"
  1738. #else
  1739. "add r3, r3, r6\n\t"
  1740. #endif
  1741. #ifdef WOLFSSL_KEIL
  1742. "adcs r4, r4, r7\n\t"
  1743. #elif defined(__clang__)
  1744. "adcs r4, r7\n\t"
  1745. #else
  1746. "adc r4, r7\n\t"
  1747. #endif
  1748. #ifdef WOLFSSL_KEIL
  1749. "adcs r5, r5, %[r]\n\t"
  1750. #elif defined(__clang__)
  1751. "adcs r5, %[r]\n\t"
  1752. #else
  1753. "adc r5, %[r]\n\t"
  1754. #endif
  1755. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1756. "lsrs r6, %[a], #16\n\t"
  1757. #else
  1758. "lsr r6, %[a], #16\n\t"
  1759. #endif
  1760. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1761. "lsrs r7, %[b], #16\n\t"
  1762. #else
  1763. "lsr r7, %[b], #16\n\t"
  1764. #endif
  1765. #ifdef WOLFSSL_KEIL
  1766. "muls r7, r6, r7\n\t"
  1767. #elif defined(__clang__)
  1768. "muls r7, r6\n\t"
  1769. #else
  1770. "mul r7, r6\n\t"
  1771. #endif
  1772. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1773. "adds r4, r4, r7\n\t"
  1774. #else
  1775. "add r4, r4, r7\n\t"
  1776. #endif
  1777. #ifdef WOLFSSL_KEIL
  1778. "adcs r5, r5, %[r]\n\t"
  1779. #elif defined(__clang__)
  1780. "adcs r5, %[r]\n\t"
  1781. #else
  1782. "adc r5, %[r]\n\t"
  1783. #endif
  1784. "uxth r7, %[b]\n\t"
  1785. #ifdef WOLFSSL_KEIL
  1786. "muls r6, r7, r6\n\t"
  1787. #elif defined(__clang__)
  1788. "muls r6, r7\n\t"
  1789. #else
  1790. "mul r6, r7\n\t"
  1791. #endif
  1792. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1793. "lsrs r7, r6, #16\n\t"
  1794. #else
  1795. "lsr r7, r6, #16\n\t"
  1796. #endif
  1797. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1798. "lsls r6, r6, #16\n\t"
  1799. #else
  1800. "lsl r6, r6, #16\n\t"
  1801. #endif
  1802. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1803. "adds r3, r3, r6\n\t"
  1804. #else
  1805. "add r3, r3, r6\n\t"
  1806. #endif
  1807. #ifdef WOLFSSL_KEIL
  1808. "adcs r4, r4, r7\n\t"
  1809. #elif defined(__clang__)
  1810. "adcs r4, r7\n\t"
  1811. #else
  1812. "adc r4, r7\n\t"
  1813. #endif
  1814. #ifdef WOLFSSL_KEIL
  1815. "adcs r5, r5, %[r]\n\t"
  1816. #elif defined(__clang__)
  1817. "adcs r5, %[r]\n\t"
  1818. #else
  1819. "adc r5, %[r]\n\t"
  1820. #endif
  1821. "str r3, [sp, #12]\n\t"
  1822. "# A[4] * B[0]\n\t"
  1823. "movs r3, #0\n\t"
  1824. "mov %[a], r9\n\t"
  1825. "mov %[b], r10\n\t"
  1826. "ldr %[a], [%[a], #16]\n\t"
  1827. "ldr %[b], [%[b]]\n\t"
  1828. "uxth r6, %[a]\n\t"
  1829. "uxth r7, %[b]\n\t"
  1830. #ifdef WOLFSSL_KEIL
  1831. "muls r7, r6, r7\n\t"
  1832. #elif defined(__clang__)
  1833. "muls r7, r6\n\t"
  1834. #else
  1835. "mul r7, r6\n\t"
  1836. #endif
  1837. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1838. "adds r4, r4, r7\n\t"
  1839. #else
  1840. "add r4, r4, r7\n\t"
  1841. #endif
  1842. #ifdef WOLFSSL_KEIL
  1843. "adcs r5, r5, %[r]\n\t"
  1844. #elif defined(__clang__)
  1845. "adcs r5, %[r]\n\t"
  1846. #else
  1847. "adc r5, %[r]\n\t"
  1848. #endif
  1849. #ifdef WOLFSSL_KEIL
  1850. "adcs r3, r3, %[r]\n\t"
  1851. #elif defined(__clang__)
  1852. "adcs r3, %[r]\n\t"
  1853. #else
  1854. "adc r3, %[r]\n\t"
  1855. #endif
  1856. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1857. "lsrs r7, %[b], #16\n\t"
  1858. #else
  1859. "lsr r7, %[b], #16\n\t"
  1860. #endif
  1861. #ifdef WOLFSSL_KEIL
  1862. "muls r6, r7, r6\n\t"
  1863. #elif defined(__clang__)
  1864. "muls r6, r7\n\t"
  1865. #else
  1866. "mul r6, r7\n\t"
  1867. #endif
  1868. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1869. "lsrs r7, r6, #16\n\t"
  1870. #else
  1871. "lsr r7, r6, #16\n\t"
  1872. #endif
  1873. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1874. "lsls r6, r6, #16\n\t"
  1875. #else
  1876. "lsl r6, r6, #16\n\t"
  1877. #endif
  1878. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1879. "adds r4, r4, r6\n\t"
  1880. #else
  1881. "add r4, r4, r6\n\t"
  1882. #endif
  1883. #ifdef WOLFSSL_KEIL
  1884. "adcs r5, r5, r7\n\t"
  1885. #elif defined(__clang__)
  1886. "adcs r5, r7\n\t"
  1887. #else
  1888. "adc r5, r7\n\t"
  1889. #endif
  1890. #ifdef WOLFSSL_KEIL
  1891. "adcs r3, r3, %[r]\n\t"
  1892. #elif defined(__clang__)
  1893. "adcs r3, %[r]\n\t"
  1894. #else
  1895. "adc r3, %[r]\n\t"
  1896. #endif
  1897. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1898. "lsrs r6, %[a], #16\n\t"
  1899. #else
  1900. "lsr r6, %[a], #16\n\t"
  1901. #endif
  1902. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1903. "lsrs r7, %[b], #16\n\t"
  1904. #else
  1905. "lsr r7, %[b], #16\n\t"
  1906. #endif
  1907. #ifdef WOLFSSL_KEIL
  1908. "muls r7, r6, r7\n\t"
  1909. #elif defined(__clang__)
  1910. "muls r7, r6\n\t"
  1911. #else
  1912. "mul r7, r6\n\t"
  1913. #endif
  1914. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1915. "adds r5, r5, r7\n\t"
  1916. #else
  1917. "add r5, r5, r7\n\t"
  1918. #endif
  1919. #ifdef WOLFSSL_KEIL
  1920. "adcs r3, r3, %[r]\n\t"
  1921. #elif defined(__clang__)
  1922. "adcs r3, %[r]\n\t"
  1923. #else
  1924. "adc r3, %[r]\n\t"
  1925. #endif
  1926. "uxth r7, %[b]\n\t"
  1927. #ifdef WOLFSSL_KEIL
  1928. "muls r6, r7, r6\n\t"
  1929. #elif defined(__clang__)
  1930. "muls r6, r7\n\t"
  1931. #else
  1932. "mul r6, r7\n\t"
  1933. #endif
  1934. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1935. "lsrs r7, r6, #16\n\t"
  1936. #else
  1937. "lsr r7, r6, #16\n\t"
  1938. #endif
  1939. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1940. "lsls r6, r6, #16\n\t"
  1941. #else
  1942. "lsl r6, r6, #16\n\t"
  1943. #endif
  1944. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1945. "adds r4, r4, r6\n\t"
  1946. #else
  1947. "add r4, r4, r6\n\t"
  1948. #endif
  1949. #ifdef WOLFSSL_KEIL
  1950. "adcs r5, r5, r7\n\t"
  1951. #elif defined(__clang__)
  1952. "adcs r5, r7\n\t"
  1953. #else
  1954. "adc r5, r7\n\t"
  1955. #endif
  1956. #ifdef WOLFSSL_KEIL
  1957. "adcs r3, r3, %[r]\n\t"
  1958. #elif defined(__clang__)
  1959. "adcs r3, %[r]\n\t"
  1960. #else
  1961. "adc r3, %[r]\n\t"
  1962. #endif
  1963. "# A[3] * B[1]\n\t"
  1964. "mov %[a], r9\n\t"
  1965. "mov %[b], r10\n\t"
  1966. "ldr %[a], [%[a], #12]\n\t"
  1967. "ldr %[b], [%[b], #4]\n\t"
  1968. "uxth r6, %[a]\n\t"
  1969. "uxth r7, %[b]\n\t"
  1970. #ifdef WOLFSSL_KEIL
  1971. "muls r7, r6, r7\n\t"
  1972. #elif defined(__clang__)
  1973. "muls r7, r6\n\t"
  1974. #else
  1975. "mul r7, r6\n\t"
  1976. #endif
  1977. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1978. "adds r4, r4, r7\n\t"
  1979. #else
  1980. "add r4, r4, r7\n\t"
  1981. #endif
  1982. #ifdef WOLFSSL_KEIL
  1983. "adcs r5, r5, %[r]\n\t"
  1984. #elif defined(__clang__)
  1985. "adcs r5, %[r]\n\t"
  1986. #else
  1987. "adc r5, %[r]\n\t"
  1988. #endif
  1989. #ifdef WOLFSSL_KEIL
  1990. "adcs r3, r3, %[r]\n\t"
  1991. #elif defined(__clang__)
  1992. "adcs r3, %[r]\n\t"
  1993. #else
  1994. "adc r3, %[r]\n\t"
  1995. #endif
  1996. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1997. "lsrs r7, %[b], #16\n\t"
  1998. #else
  1999. "lsr r7, %[b], #16\n\t"
  2000. #endif
  2001. #ifdef WOLFSSL_KEIL
  2002. "muls r6, r7, r6\n\t"
  2003. #elif defined(__clang__)
  2004. "muls r6, r7\n\t"
  2005. #else
  2006. "mul r6, r7\n\t"
  2007. #endif
  2008. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2009. "lsrs r7, r6, #16\n\t"
  2010. #else
  2011. "lsr r7, r6, #16\n\t"
  2012. #endif
  2013. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2014. "lsls r6, r6, #16\n\t"
  2015. #else
  2016. "lsl r6, r6, #16\n\t"
  2017. #endif
  2018. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2019. "adds r4, r4, r6\n\t"
  2020. #else
  2021. "add r4, r4, r6\n\t"
  2022. #endif
  2023. #ifdef WOLFSSL_KEIL
  2024. "adcs r5, r5, r7\n\t"
  2025. #elif defined(__clang__)
  2026. "adcs r5, r7\n\t"
  2027. #else
  2028. "adc r5, r7\n\t"
  2029. #endif
  2030. #ifdef WOLFSSL_KEIL
  2031. "adcs r3, r3, %[r]\n\t"
  2032. #elif defined(__clang__)
  2033. "adcs r3, %[r]\n\t"
  2034. #else
  2035. "adc r3, %[r]\n\t"
  2036. #endif
  2037. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2038. "lsrs r6, %[a], #16\n\t"
  2039. #else
  2040. "lsr r6, %[a], #16\n\t"
  2041. #endif
  2042. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2043. "lsrs r7, %[b], #16\n\t"
  2044. #else
  2045. "lsr r7, %[b], #16\n\t"
  2046. #endif
  2047. #ifdef WOLFSSL_KEIL
  2048. "muls r7, r6, r7\n\t"
  2049. #elif defined(__clang__)
  2050. "muls r7, r6\n\t"
  2051. #else
  2052. "mul r7, r6\n\t"
  2053. #endif
  2054. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2055. "adds r5, r5, r7\n\t"
  2056. #else
  2057. "add r5, r5, r7\n\t"
  2058. #endif
  2059. #ifdef WOLFSSL_KEIL
  2060. "adcs r3, r3, %[r]\n\t"
  2061. #elif defined(__clang__)
  2062. "adcs r3, %[r]\n\t"
  2063. #else
  2064. "adc r3, %[r]\n\t"
  2065. #endif
  2066. "uxth r7, %[b]\n\t"
  2067. #ifdef WOLFSSL_KEIL
  2068. "muls r6, r7, r6\n\t"
  2069. #elif defined(__clang__)
  2070. "muls r6, r7\n\t"
  2071. #else
  2072. "mul r6, r7\n\t"
  2073. #endif
  2074. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2075. "lsrs r7, r6, #16\n\t"
  2076. #else
  2077. "lsr r7, r6, #16\n\t"
  2078. #endif
  2079. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2080. "lsls r6, r6, #16\n\t"
  2081. #else
  2082. "lsl r6, r6, #16\n\t"
  2083. #endif
  2084. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2085. "adds r4, r4, r6\n\t"
  2086. #else
  2087. "add r4, r4, r6\n\t"
  2088. #endif
  2089. #ifdef WOLFSSL_KEIL
  2090. "adcs r5, r5, r7\n\t"
  2091. #elif defined(__clang__)
  2092. "adcs r5, r7\n\t"
  2093. #else
  2094. "adc r5, r7\n\t"
  2095. #endif
  2096. #ifdef WOLFSSL_KEIL
  2097. "adcs r3, r3, %[r]\n\t"
  2098. #elif defined(__clang__)
  2099. "adcs r3, %[r]\n\t"
  2100. #else
  2101. "adc r3, %[r]\n\t"
  2102. #endif
  2103. "# A[2] * B[2]\n\t"
  2104. "mov %[a], r9\n\t"
  2105. "mov %[b], r10\n\t"
  2106. "ldr %[a], [%[a], #8]\n\t"
  2107. "ldr %[b], [%[b], #8]\n\t"
  2108. "uxth r6, %[a]\n\t"
  2109. "uxth r7, %[b]\n\t"
  2110. #ifdef WOLFSSL_KEIL
  2111. "muls r7, r6, r7\n\t"
  2112. #elif defined(__clang__)
  2113. "muls r7, r6\n\t"
  2114. #else
  2115. "mul r7, r6\n\t"
  2116. #endif
  2117. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2118. "adds r4, r4, r7\n\t"
  2119. #else
  2120. "add r4, r4, r7\n\t"
  2121. #endif
  2122. #ifdef WOLFSSL_KEIL
  2123. "adcs r5, r5, %[r]\n\t"
  2124. #elif defined(__clang__)
  2125. "adcs r5, %[r]\n\t"
  2126. #else
  2127. "adc r5, %[r]\n\t"
  2128. #endif
  2129. #ifdef WOLFSSL_KEIL
  2130. "adcs r3, r3, %[r]\n\t"
  2131. #elif defined(__clang__)
  2132. "adcs r3, %[r]\n\t"
  2133. #else
  2134. "adc r3, %[r]\n\t"
  2135. #endif
  2136. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2137. "lsrs r7, %[b], #16\n\t"
  2138. #else
  2139. "lsr r7, %[b], #16\n\t"
  2140. #endif
  2141. #ifdef WOLFSSL_KEIL
  2142. "muls r6, r7, r6\n\t"
  2143. #elif defined(__clang__)
  2144. "muls r6, r7\n\t"
  2145. #else
  2146. "mul r6, r7\n\t"
  2147. #endif
  2148. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2149. "lsrs r7, r6, #16\n\t"
  2150. #else
  2151. "lsr r7, r6, #16\n\t"
  2152. #endif
  2153. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2154. "lsls r6, r6, #16\n\t"
  2155. #else
  2156. "lsl r6, r6, #16\n\t"
  2157. #endif
  2158. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2159. "adds r4, r4, r6\n\t"
  2160. #else
  2161. "add r4, r4, r6\n\t"
  2162. #endif
  2163. #ifdef WOLFSSL_KEIL
  2164. "adcs r5, r5, r7\n\t"
  2165. #elif defined(__clang__)
  2166. "adcs r5, r7\n\t"
  2167. #else
  2168. "adc r5, r7\n\t"
  2169. #endif
  2170. #ifdef WOLFSSL_KEIL
  2171. "adcs r3, r3, %[r]\n\t"
  2172. #elif defined(__clang__)
  2173. "adcs r3, %[r]\n\t"
  2174. #else
  2175. "adc r3, %[r]\n\t"
  2176. #endif
  2177. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2178. "lsrs r6, %[a], #16\n\t"
  2179. #else
  2180. "lsr r6, %[a], #16\n\t"
  2181. #endif
  2182. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2183. "lsrs r7, %[b], #16\n\t"
  2184. #else
  2185. "lsr r7, %[b], #16\n\t"
  2186. #endif
  2187. #ifdef WOLFSSL_KEIL
  2188. "muls r7, r6, r7\n\t"
  2189. #elif defined(__clang__)
  2190. "muls r7, r6\n\t"
  2191. #else
  2192. "mul r7, r6\n\t"
  2193. #endif
  2194. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2195. "adds r5, r5, r7\n\t"
  2196. #else
  2197. "add r5, r5, r7\n\t"
  2198. #endif
  2199. #ifdef WOLFSSL_KEIL
  2200. "adcs r3, r3, %[r]\n\t"
  2201. #elif defined(__clang__)
  2202. "adcs r3, %[r]\n\t"
  2203. #else
  2204. "adc r3, %[r]\n\t"
  2205. #endif
  2206. "uxth r7, %[b]\n\t"
  2207. #ifdef WOLFSSL_KEIL
  2208. "muls r6, r7, r6\n\t"
  2209. #elif defined(__clang__)
  2210. "muls r6, r7\n\t"
  2211. #else
  2212. "mul r6, r7\n\t"
  2213. #endif
  2214. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2215. "lsrs r7, r6, #16\n\t"
  2216. #else
  2217. "lsr r7, r6, #16\n\t"
  2218. #endif
  2219. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2220. "lsls r6, r6, #16\n\t"
  2221. #else
  2222. "lsl r6, r6, #16\n\t"
  2223. #endif
  2224. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2225. "adds r4, r4, r6\n\t"
  2226. #else
  2227. "add r4, r4, r6\n\t"
  2228. #endif
  2229. #ifdef WOLFSSL_KEIL
  2230. "adcs r5, r5, r7\n\t"
  2231. #elif defined(__clang__)
  2232. "adcs r5, r7\n\t"
  2233. #else
  2234. "adc r5, r7\n\t"
  2235. #endif
  2236. #ifdef WOLFSSL_KEIL
  2237. "adcs r3, r3, %[r]\n\t"
  2238. #elif defined(__clang__)
  2239. "adcs r3, %[r]\n\t"
  2240. #else
  2241. "adc r3, %[r]\n\t"
  2242. #endif
  2243. "# A[1] * B[3]\n\t"
  2244. "mov %[a], r9\n\t"
  2245. "mov %[b], r10\n\t"
  2246. "ldr %[a], [%[a], #4]\n\t"
  2247. "ldr %[b], [%[b], #12]\n\t"
  2248. "uxth r6, %[a]\n\t"
  2249. "uxth r7, %[b]\n\t"
  2250. #ifdef WOLFSSL_KEIL
  2251. "muls r7, r6, r7\n\t"
  2252. #elif defined(__clang__)
  2253. "muls r7, r6\n\t"
  2254. #else
  2255. "mul r7, r6\n\t"
  2256. #endif
  2257. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2258. "adds r4, r4, r7\n\t"
  2259. #else
  2260. "add r4, r4, r7\n\t"
  2261. #endif
  2262. #ifdef WOLFSSL_KEIL
  2263. "adcs r5, r5, %[r]\n\t"
  2264. #elif defined(__clang__)
  2265. "adcs r5, %[r]\n\t"
  2266. #else
  2267. "adc r5, %[r]\n\t"
  2268. #endif
  2269. #ifdef WOLFSSL_KEIL
  2270. "adcs r3, r3, %[r]\n\t"
  2271. #elif defined(__clang__)
  2272. "adcs r3, %[r]\n\t"
  2273. #else
  2274. "adc r3, %[r]\n\t"
  2275. #endif
  2276. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2277. "lsrs r7, %[b], #16\n\t"
  2278. #else
  2279. "lsr r7, %[b], #16\n\t"
  2280. #endif
  2281. #ifdef WOLFSSL_KEIL
  2282. "muls r6, r7, r6\n\t"
  2283. #elif defined(__clang__)
  2284. "muls r6, r7\n\t"
  2285. #else
  2286. "mul r6, r7\n\t"
  2287. #endif
  2288. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2289. "lsrs r7, r6, #16\n\t"
  2290. #else
  2291. "lsr r7, r6, #16\n\t"
  2292. #endif
  2293. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2294. "lsls r6, r6, #16\n\t"
  2295. #else
  2296. "lsl r6, r6, #16\n\t"
  2297. #endif
  2298. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2299. "adds r4, r4, r6\n\t"
  2300. #else
  2301. "add r4, r4, r6\n\t"
  2302. #endif
  2303. #ifdef WOLFSSL_KEIL
  2304. "adcs r5, r5, r7\n\t"
  2305. #elif defined(__clang__)
  2306. "adcs r5, r7\n\t"
  2307. #else
  2308. "adc r5, r7\n\t"
  2309. #endif
  2310. #ifdef WOLFSSL_KEIL
  2311. "adcs r3, r3, %[r]\n\t"
  2312. #elif defined(__clang__)
  2313. "adcs r3, %[r]\n\t"
  2314. #else
  2315. "adc r3, %[r]\n\t"
  2316. #endif
  2317. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2318. "lsrs r6, %[a], #16\n\t"
  2319. #else
  2320. "lsr r6, %[a], #16\n\t"
  2321. #endif
  2322. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2323. "lsrs r7, %[b], #16\n\t"
  2324. #else
  2325. "lsr r7, %[b], #16\n\t"
  2326. #endif
  2327. #ifdef WOLFSSL_KEIL
  2328. "muls r7, r6, r7\n\t"
  2329. #elif defined(__clang__)
  2330. "muls r7, r6\n\t"
  2331. #else
  2332. "mul r7, r6\n\t"
  2333. #endif
  2334. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2335. "adds r5, r5, r7\n\t"
  2336. #else
  2337. "add r5, r5, r7\n\t"
  2338. #endif
  2339. #ifdef WOLFSSL_KEIL
  2340. "adcs r3, r3, %[r]\n\t"
  2341. #elif defined(__clang__)
  2342. "adcs r3, %[r]\n\t"
  2343. #else
  2344. "adc r3, %[r]\n\t"
  2345. #endif
  2346. "uxth r7, %[b]\n\t"
  2347. #ifdef WOLFSSL_KEIL
  2348. "muls r6, r7, r6\n\t"
  2349. #elif defined(__clang__)
  2350. "muls r6, r7\n\t"
  2351. #else
  2352. "mul r6, r7\n\t"
  2353. #endif
  2354. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2355. "lsrs r7, r6, #16\n\t"
  2356. #else
  2357. "lsr r7, r6, #16\n\t"
  2358. #endif
  2359. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2360. "lsls r6, r6, #16\n\t"
  2361. #else
  2362. "lsl r6, r6, #16\n\t"
  2363. #endif
  2364. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2365. "adds r4, r4, r6\n\t"
  2366. #else
  2367. "add r4, r4, r6\n\t"
  2368. #endif
  2369. #ifdef WOLFSSL_KEIL
  2370. "adcs r5, r5, r7\n\t"
  2371. #elif defined(__clang__)
  2372. "adcs r5, r7\n\t"
  2373. #else
  2374. "adc r5, r7\n\t"
  2375. #endif
  2376. #ifdef WOLFSSL_KEIL
  2377. "adcs r3, r3, %[r]\n\t"
  2378. #elif defined(__clang__)
  2379. "adcs r3, %[r]\n\t"
  2380. #else
  2381. "adc r3, %[r]\n\t"
  2382. #endif
  2383. "# A[0] * B[4]\n\t"
  2384. "mov %[a], r9\n\t"
  2385. "mov %[b], r10\n\t"
  2386. "ldr %[a], [%[a]]\n\t"
  2387. "ldr %[b], [%[b], #16]\n\t"
  2388. "uxth r6, %[a]\n\t"
  2389. "uxth r7, %[b]\n\t"
  2390. #ifdef WOLFSSL_KEIL
  2391. "muls r7, r6, r7\n\t"
  2392. #elif defined(__clang__)
  2393. "muls r7, r6\n\t"
  2394. #else
  2395. "mul r7, r6\n\t"
  2396. #endif
  2397. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2398. "adds r4, r4, r7\n\t"
  2399. #else
  2400. "add r4, r4, r7\n\t"
  2401. #endif
  2402. #ifdef WOLFSSL_KEIL
  2403. "adcs r5, r5, %[r]\n\t"
  2404. #elif defined(__clang__)
  2405. "adcs r5, %[r]\n\t"
  2406. #else
  2407. "adc r5, %[r]\n\t"
  2408. #endif
  2409. #ifdef WOLFSSL_KEIL
  2410. "adcs r3, r3, %[r]\n\t"
  2411. #elif defined(__clang__)
  2412. "adcs r3, %[r]\n\t"
  2413. #else
  2414. "adc r3, %[r]\n\t"
  2415. #endif
  2416. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2417. "lsrs r7, %[b], #16\n\t"
  2418. #else
  2419. "lsr r7, %[b], #16\n\t"
  2420. #endif
  2421. #ifdef WOLFSSL_KEIL
  2422. "muls r6, r7, r6\n\t"
  2423. #elif defined(__clang__)
  2424. "muls r6, r7\n\t"
  2425. #else
  2426. "mul r6, r7\n\t"
  2427. #endif
  2428. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2429. "lsrs r7, r6, #16\n\t"
  2430. #else
  2431. "lsr r7, r6, #16\n\t"
  2432. #endif
  2433. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2434. "lsls r6, r6, #16\n\t"
  2435. #else
  2436. "lsl r6, r6, #16\n\t"
  2437. #endif
  2438. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2439. "adds r4, r4, r6\n\t"
  2440. #else
  2441. "add r4, r4, r6\n\t"
  2442. #endif
  2443. #ifdef WOLFSSL_KEIL
  2444. "adcs r5, r5, r7\n\t"
  2445. #elif defined(__clang__)
  2446. "adcs r5, r7\n\t"
  2447. #else
  2448. "adc r5, r7\n\t"
  2449. #endif
  2450. #ifdef WOLFSSL_KEIL
  2451. "adcs r3, r3, %[r]\n\t"
  2452. #elif defined(__clang__)
  2453. "adcs r3, %[r]\n\t"
  2454. #else
  2455. "adc r3, %[r]\n\t"
  2456. #endif
  2457. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2458. "lsrs r6, %[a], #16\n\t"
  2459. #else
  2460. "lsr r6, %[a], #16\n\t"
  2461. #endif
  2462. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2463. "lsrs r7, %[b], #16\n\t"
  2464. #else
  2465. "lsr r7, %[b], #16\n\t"
  2466. #endif
  2467. #ifdef WOLFSSL_KEIL
  2468. "muls r7, r6, r7\n\t"
  2469. #elif defined(__clang__)
  2470. "muls r7, r6\n\t"
  2471. #else
  2472. "mul r7, r6\n\t"
  2473. #endif
  2474. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2475. "adds r5, r5, r7\n\t"
  2476. #else
  2477. "add r5, r5, r7\n\t"
  2478. #endif
  2479. #ifdef WOLFSSL_KEIL
  2480. "adcs r3, r3, %[r]\n\t"
  2481. #elif defined(__clang__)
  2482. "adcs r3, %[r]\n\t"
  2483. #else
  2484. "adc r3, %[r]\n\t"
  2485. #endif
  2486. "uxth r7, %[b]\n\t"
  2487. #ifdef WOLFSSL_KEIL
  2488. "muls r6, r7, r6\n\t"
  2489. #elif defined(__clang__)
  2490. "muls r6, r7\n\t"
  2491. #else
  2492. "mul r6, r7\n\t"
  2493. #endif
  2494. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2495. "lsrs r7, r6, #16\n\t"
  2496. #else
  2497. "lsr r7, r6, #16\n\t"
  2498. #endif
  2499. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2500. "lsls r6, r6, #16\n\t"
  2501. #else
  2502. "lsl r6, r6, #16\n\t"
  2503. #endif
  2504. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2505. "adds r4, r4, r6\n\t"
  2506. #else
  2507. "add r4, r4, r6\n\t"
  2508. #endif
  2509. #ifdef WOLFSSL_KEIL
  2510. "adcs r5, r5, r7\n\t"
  2511. #elif defined(__clang__)
  2512. "adcs r5, r7\n\t"
  2513. #else
  2514. "adc r5, r7\n\t"
  2515. #endif
  2516. #ifdef WOLFSSL_KEIL
  2517. "adcs r3, r3, %[r]\n\t"
  2518. #elif defined(__clang__)
  2519. "adcs r3, %[r]\n\t"
  2520. #else
  2521. "adc r3, %[r]\n\t"
  2522. #endif
  2523. "str r4, [sp, #16]\n\t"
  2524. "# A[0] * B[5]\n\t"
  2525. "movs r4, #0\n\t"
  2526. "mov %[a], r9\n\t"
  2527. "mov %[b], r10\n\t"
  2528. "ldr %[a], [%[a]]\n\t"
  2529. "ldr %[b], [%[b], #20]\n\t"
  2530. "uxth r6, %[a]\n\t"
  2531. "uxth r7, %[b]\n\t"
  2532. #ifdef WOLFSSL_KEIL
  2533. "muls r7, r6, r7\n\t"
  2534. #elif defined(__clang__)
  2535. "muls r7, r6\n\t"
  2536. #else
  2537. "mul r7, r6\n\t"
  2538. #endif
  2539. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2540. "adds r5, r5, r7\n\t"
  2541. #else
  2542. "add r5, r5, r7\n\t"
  2543. #endif
  2544. #ifdef WOLFSSL_KEIL
  2545. "adcs r3, r3, %[r]\n\t"
  2546. #elif defined(__clang__)
  2547. "adcs r3, %[r]\n\t"
  2548. #else
  2549. "adc r3, %[r]\n\t"
  2550. #endif
  2551. #ifdef WOLFSSL_KEIL
  2552. "adcs r4, r4, %[r]\n\t"
  2553. #elif defined(__clang__)
  2554. "adcs r4, %[r]\n\t"
  2555. #else
  2556. "adc r4, %[r]\n\t"
  2557. #endif
  2558. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2559. "lsrs r7, %[b], #16\n\t"
  2560. #else
  2561. "lsr r7, %[b], #16\n\t"
  2562. #endif
  2563. #ifdef WOLFSSL_KEIL
  2564. "muls r6, r7, r6\n\t"
  2565. #elif defined(__clang__)
  2566. "muls r6, r7\n\t"
  2567. #else
  2568. "mul r6, r7\n\t"
  2569. #endif
  2570. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2571. "lsrs r7, r6, #16\n\t"
  2572. #else
  2573. "lsr r7, r6, #16\n\t"
  2574. #endif
  2575. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2576. "lsls r6, r6, #16\n\t"
  2577. #else
  2578. "lsl r6, r6, #16\n\t"
  2579. #endif
  2580. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2581. "adds r5, r5, r6\n\t"
  2582. #else
  2583. "add r5, r5, r6\n\t"
  2584. #endif
  2585. #ifdef WOLFSSL_KEIL
  2586. "adcs r3, r3, r7\n\t"
  2587. #elif defined(__clang__)
  2588. "adcs r3, r7\n\t"
  2589. #else
  2590. "adc r3, r7\n\t"
  2591. #endif
  2592. #ifdef WOLFSSL_KEIL
  2593. "adcs r4, r4, %[r]\n\t"
  2594. #elif defined(__clang__)
  2595. "adcs r4, %[r]\n\t"
  2596. #else
  2597. "adc r4, %[r]\n\t"
  2598. #endif
  2599. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2600. "lsrs r6, %[a], #16\n\t"
  2601. #else
  2602. "lsr r6, %[a], #16\n\t"
  2603. #endif
  2604. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2605. "lsrs r7, %[b], #16\n\t"
  2606. #else
  2607. "lsr r7, %[b], #16\n\t"
  2608. #endif
  2609. #ifdef WOLFSSL_KEIL
  2610. "muls r7, r6, r7\n\t"
  2611. #elif defined(__clang__)
  2612. "muls r7, r6\n\t"
  2613. #else
  2614. "mul r7, r6\n\t"
  2615. #endif
  2616. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2617. "adds r3, r3, r7\n\t"
  2618. #else
  2619. "add r3, r3, r7\n\t"
  2620. #endif
  2621. #ifdef WOLFSSL_KEIL
  2622. "adcs r4, r4, %[r]\n\t"
  2623. #elif defined(__clang__)
  2624. "adcs r4, %[r]\n\t"
  2625. #else
  2626. "adc r4, %[r]\n\t"
  2627. #endif
  2628. "uxth r7, %[b]\n\t"
  2629. #ifdef WOLFSSL_KEIL
  2630. "muls r6, r7, r6\n\t"
  2631. #elif defined(__clang__)
  2632. "muls r6, r7\n\t"
  2633. #else
  2634. "mul r6, r7\n\t"
  2635. #endif
  2636. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2637. "lsrs r7, r6, #16\n\t"
  2638. #else
  2639. "lsr r7, r6, #16\n\t"
  2640. #endif
  2641. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2642. "lsls r6, r6, #16\n\t"
  2643. #else
  2644. "lsl r6, r6, #16\n\t"
  2645. #endif
  2646. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2647. "adds r5, r5, r6\n\t"
  2648. #else
  2649. "add r5, r5, r6\n\t"
  2650. #endif
  2651. #ifdef WOLFSSL_KEIL
  2652. "adcs r3, r3, r7\n\t"
  2653. #elif defined(__clang__)
  2654. "adcs r3, r7\n\t"
  2655. #else
  2656. "adc r3, r7\n\t"
  2657. #endif
  2658. #ifdef WOLFSSL_KEIL
  2659. "adcs r4, r4, %[r]\n\t"
  2660. #elif defined(__clang__)
  2661. "adcs r4, %[r]\n\t"
  2662. #else
  2663. "adc r4, %[r]\n\t"
  2664. #endif
  2665. "# A[1] * B[4]\n\t"
  2666. "mov %[a], r9\n\t"
  2667. "mov %[b], r10\n\t"
  2668. "ldr %[a], [%[a], #4]\n\t"
  2669. "ldr %[b], [%[b], #16]\n\t"
  2670. "uxth r6, %[a]\n\t"
  2671. "uxth r7, %[b]\n\t"
  2672. #ifdef WOLFSSL_KEIL
  2673. "muls r7, r6, r7\n\t"
  2674. #elif defined(__clang__)
  2675. "muls r7, r6\n\t"
  2676. #else
  2677. "mul r7, r6\n\t"
  2678. #endif
  2679. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2680. "adds r5, r5, r7\n\t"
  2681. #else
  2682. "add r5, r5, r7\n\t"
  2683. #endif
  2684. #ifdef WOLFSSL_KEIL
  2685. "adcs r3, r3, %[r]\n\t"
  2686. #elif defined(__clang__)
  2687. "adcs r3, %[r]\n\t"
  2688. #else
  2689. "adc r3, %[r]\n\t"
  2690. #endif
  2691. #ifdef WOLFSSL_KEIL
  2692. "adcs r4, r4, %[r]\n\t"
  2693. #elif defined(__clang__)
  2694. "adcs r4, %[r]\n\t"
  2695. #else
  2696. "adc r4, %[r]\n\t"
  2697. #endif
  2698. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2699. "lsrs r7, %[b], #16\n\t"
  2700. #else
  2701. "lsr r7, %[b], #16\n\t"
  2702. #endif
  2703. #ifdef WOLFSSL_KEIL
  2704. "muls r6, r7, r6\n\t"
  2705. #elif defined(__clang__)
  2706. "muls r6, r7\n\t"
  2707. #else
  2708. "mul r6, r7\n\t"
  2709. #endif
  2710. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2711. "lsrs r7, r6, #16\n\t"
  2712. #else
  2713. "lsr r7, r6, #16\n\t"
  2714. #endif
  2715. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2716. "lsls r6, r6, #16\n\t"
  2717. #else
  2718. "lsl r6, r6, #16\n\t"
  2719. #endif
  2720. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2721. "adds r5, r5, r6\n\t"
  2722. #else
  2723. "add r5, r5, r6\n\t"
  2724. #endif
  2725. #ifdef WOLFSSL_KEIL
  2726. "adcs r3, r3, r7\n\t"
  2727. #elif defined(__clang__)
  2728. "adcs r3, r7\n\t"
  2729. #else
  2730. "adc r3, r7\n\t"
  2731. #endif
  2732. #ifdef WOLFSSL_KEIL
  2733. "adcs r4, r4, %[r]\n\t"
  2734. #elif defined(__clang__)
  2735. "adcs r4, %[r]\n\t"
  2736. #else
  2737. "adc r4, %[r]\n\t"
  2738. #endif
  2739. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2740. "lsrs r6, %[a], #16\n\t"
  2741. #else
  2742. "lsr r6, %[a], #16\n\t"
  2743. #endif
  2744. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2745. "lsrs r7, %[b], #16\n\t"
  2746. #else
  2747. "lsr r7, %[b], #16\n\t"
  2748. #endif
  2749. #ifdef WOLFSSL_KEIL
  2750. "muls r7, r6, r7\n\t"
  2751. #elif defined(__clang__)
  2752. "muls r7, r6\n\t"
  2753. #else
  2754. "mul r7, r6\n\t"
  2755. #endif
  2756. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2757. "adds r3, r3, r7\n\t"
  2758. #else
  2759. "add r3, r3, r7\n\t"
  2760. #endif
  2761. #ifdef WOLFSSL_KEIL
  2762. "adcs r4, r4, %[r]\n\t"
  2763. #elif defined(__clang__)
  2764. "adcs r4, %[r]\n\t"
  2765. #else
  2766. "adc r4, %[r]\n\t"
  2767. #endif
  2768. "uxth r7, %[b]\n\t"
  2769. #ifdef WOLFSSL_KEIL
  2770. "muls r6, r7, r6\n\t"
  2771. #elif defined(__clang__)
  2772. "muls r6, r7\n\t"
  2773. #else
  2774. "mul r6, r7\n\t"
  2775. #endif
  2776. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2777. "lsrs r7, r6, #16\n\t"
  2778. #else
  2779. "lsr r7, r6, #16\n\t"
  2780. #endif
  2781. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2782. "lsls r6, r6, #16\n\t"
  2783. #else
  2784. "lsl r6, r6, #16\n\t"
  2785. #endif
  2786. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2787. "adds r5, r5, r6\n\t"
  2788. #else
  2789. "add r5, r5, r6\n\t"
  2790. #endif
  2791. #ifdef WOLFSSL_KEIL
  2792. "adcs r3, r3, r7\n\t"
  2793. #elif defined(__clang__)
  2794. "adcs r3, r7\n\t"
  2795. #else
  2796. "adc r3, r7\n\t"
  2797. #endif
  2798. #ifdef WOLFSSL_KEIL
  2799. "adcs r4, r4, %[r]\n\t"
  2800. #elif defined(__clang__)
  2801. "adcs r4, %[r]\n\t"
  2802. #else
  2803. "adc r4, %[r]\n\t"
  2804. #endif
  2805. "# A[2] * B[3]\n\t"
  2806. "mov %[a], r9\n\t"
  2807. "mov %[b], r10\n\t"
  2808. "ldr %[a], [%[a], #8]\n\t"
  2809. "ldr %[b], [%[b], #12]\n\t"
  2810. "uxth r6, %[a]\n\t"
  2811. "uxth r7, %[b]\n\t"
  2812. #ifdef WOLFSSL_KEIL
  2813. "muls r7, r6, r7\n\t"
  2814. #elif defined(__clang__)
  2815. "muls r7, r6\n\t"
  2816. #else
  2817. "mul r7, r6\n\t"
  2818. #endif
  2819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2820. "adds r5, r5, r7\n\t"
  2821. #else
  2822. "add r5, r5, r7\n\t"
  2823. #endif
  2824. #ifdef WOLFSSL_KEIL
  2825. "adcs r3, r3, %[r]\n\t"
  2826. #elif defined(__clang__)
  2827. "adcs r3, %[r]\n\t"
  2828. #else
  2829. "adc r3, %[r]\n\t"
  2830. #endif
  2831. #ifdef WOLFSSL_KEIL
  2832. "adcs r4, r4, %[r]\n\t"
  2833. #elif defined(__clang__)
  2834. "adcs r4, %[r]\n\t"
  2835. #else
  2836. "adc r4, %[r]\n\t"
  2837. #endif
  2838. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2839. "lsrs r7, %[b], #16\n\t"
  2840. #else
  2841. "lsr r7, %[b], #16\n\t"
  2842. #endif
  2843. #ifdef WOLFSSL_KEIL
  2844. "muls r6, r7, r6\n\t"
  2845. #elif defined(__clang__)
  2846. "muls r6, r7\n\t"
  2847. #else
  2848. "mul r6, r7\n\t"
  2849. #endif
  2850. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2851. "lsrs r7, r6, #16\n\t"
  2852. #else
  2853. "lsr r7, r6, #16\n\t"
  2854. #endif
  2855. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2856. "lsls r6, r6, #16\n\t"
  2857. #else
  2858. "lsl r6, r6, #16\n\t"
  2859. #endif
  2860. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2861. "adds r5, r5, r6\n\t"
  2862. #else
  2863. "add r5, r5, r6\n\t"
  2864. #endif
  2865. #ifdef WOLFSSL_KEIL
  2866. "adcs r3, r3, r7\n\t"
  2867. #elif defined(__clang__)
  2868. "adcs r3, r7\n\t"
  2869. #else
  2870. "adc r3, r7\n\t"
  2871. #endif
  2872. #ifdef WOLFSSL_KEIL
  2873. "adcs r4, r4, %[r]\n\t"
  2874. #elif defined(__clang__)
  2875. "adcs r4, %[r]\n\t"
  2876. #else
  2877. "adc r4, %[r]\n\t"
  2878. #endif
  2879. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2880. "lsrs r6, %[a], #16\n\t"
  2881. #else
  2882. "lsr r6, %[a], #16\n\t"
  2883. #endif
  2884. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2885. "lsrs r7, %[b], #16\n\t"
  2886. #else
  2887. "lsr r7, %[b], #16\n\t"
  2888. #endif
  2889. #ifdef WOLFSSL_KEIL
  2890. "muls r7, r6, r7\n\t"
  2891. #elif defined(__clang__)
  2892. "muls r7, r6\n\t"
  2893. #else
  2894. "mul r7, r6\n\t"
  2895. #endif
  2896. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2897. "adds r3, r3, r7\n\t"
  2898. #else
  2899. "add r3, r3, r7\n\t"
  2900. #endif
  2901. #ifdef WOLFSSL_KEIL
  2902. "adcs r4, r4, %[r]\n\t"
  2903. #elif defined(__clang__)
  2904. "adcs r4, %[r]\n\t"
  2905. #else
  2906. "adc r4, %[r]\n\t"
  2907. #endif
  2908. "uxth r7, %[b]\n\t"
  2909. #ifdef WOLFSSL_KEIL
  2910. "muls r6, r7, r6\n\t"
  2911. #elif defined(__clang__)
  2912. "muls r6, r7\n\t"
  2913. #else
  2914. "mul r6, r7\n\t"
  2915. #endif
  2916. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2917. "lsrs r7, r6, #16\n\t"
  2918. #else
  2919. "lsr r7, r6, #16\n\t"
  2920. #endif
  2921. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2922. "lsls r6, r6, #16\n\t"
  2923. #else
  2924. "lsl r6, r6, #16\n\t"
  2925. #endif
  2926. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2927. "adds r5, r5, r6\n\t"
  2928. #else
  2929. "add r5, r5, r6\n\t"
  2930. #endif
  2931. #ifdef WOLFSSL_KEIL
  2932. "adcs r3, r3, r7\n\t"
  2933. #elif defined(__clang__)
  2934. "adcs r3, r7\n\t"
  2935. #else
  2936. "adc r3, r7\n\t"
  2937. #endif
  2938. #ifdef WOLFSSL_KEIL
  2939. "adcs r4, r4, %[r]\n\t"
  2940. #elif defined(__clang__)
  2941. "adcs r4, %[r]\n\t"
  2942. #else
  2943. "adc r4, %[r]\n\t"
  2944. #endif
  2945. "# A[3] * B[2]\n\t"
  2946. "mov %[a], r9\n\t"
  2947. "mov %[b], r10\n\t"
  2948. "ldr %[a], [%[a], #12]\n\t"
  2949. "ldr %[b], [%[b], #8]\n\t"
  2950. "uxth r6, %[a]\n\t"
  2951. "uxth r7, %[b]\n\t"
  2952. #ifdef WOLFSSL_KEIL
  2953. "muls r7, r6, r7\n\t"
  2954. #elif defined(__clang__)
  2955. "muls r7, r6\n\t"
  2956. #else
  2957. "mul r7, r6\n\t"
  2958. #endif
  2959. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2960. "adds r5, r5, r7\n\t"
  2961. #else
  2962. "add r5, r5, r7\n\t"
  2963. #endif
  2964. #ifdef WOLFSSL_KEIL
  2965. "adcs r3, r3, %[r]\n\t"
  2966. #elif defined(__clang__)
  2967. "adcs r3, %[r]\n\t"
  2968. #else
  2969. "adc r3, %[r]\n\t"
  2970. #endif
  2971. #ifdef WOLFSSL_KEIL
  2972. "adcs r4, r4, %[r]\n\t"
  2973. #elif defined(__clang__)
  2974. "adcs r4, %[r]\n\t"
  2975. #else
  2976. "adc r4, %[r]\n\t"
  2977. #endif
  2978. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2979. "lsrs r7, %[b], #16\n\t"
  2980. #else
  2981. "lsr r7, %[b], #16\n\t"
  2982. #endif
  2983. #ifdef WOLFSSL_KEIL
  2984. "muls r6, r7, r6\n\t"
  2985. #elif defined(__clang__)
  2986. "muls r6, r7\n\t"
  2987. #else
  2988. "mul r6, r7\n\t"
  2989. #endif
  2990. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2991. "lsrs r7, r6, #16\n\t"
  2992. #else
  2993. "lsr r7, r6, #16\n\t"
  2994. #endif
  2995. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2996. "lsls r6, r6, #16\n\t"
  2997. #else
  2998. "lsl r6, r6, #16\n\t"
  2999. #endif
  3000. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3001. "adds r5, r5, r6\n\t"
  3002. #else
  3003. "add r5, r5, r6\n\t"
  3004. #endif
  3005. #ifdef WOLFSSL_KEIL
  3006. "adcs r3, r3, r7\n\t"
  3007. #elif defined(__clang__)
  3008. "adcs r3, r7\n\t"
  3009. #else
  3010. "adc r3, r7\n\t"
  3011. #endif
  3012. #ifdef WOLFSSL_KEIL
  3013. "adcs r4, r4, %[r]\n\t"
  3014. #elif defined(__clang__)
  3015. "adcs r4, %[r]\n\t"
  3016. #else
  3017. "adc r4, %[r]\n\t"
  3018. #endif
  3019. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3020. "lsrs r6, %[a], #16\n\t"
  3021. #else
  3022. "lsr r6, %[a], #16\n\t"
  3023. #endif
  3024. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3025. "lsrs r7, %[b], #16\n\t"
  3026. #else
  3027. "lsr r7, %[b], #16\n\t"
  3028. #endif
  3029. #ifdef WOLFSSL_KEIL
  3030. "muls r7, r6, r7\n\t"
  3031. #elif defined(__clang__)
  3032. "muls r7, r6\n\t"
  3033. #else
  3034. "mul r7, r6\n\t"
  3035. #endif
  3036. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3037. "adds r3, r3, r7\n\t"
  3038. #else
  3039. "add r3, r3, r7\n\t"
  3040. #endif
  3041. #ifdef WOLFSSL_KEIL
  3042. "adcs r4, r4, %[r]\n\t"
  3043. #elif defined(__clang__)
  3044. "adcs r4, %[r]\n\t"
  3045. #else
  3046. "adc r4, %[r]\n\t"
  3047. #endif
  3048. "uxth r7, %[b]\n\t"
  3049. #ifdef WOLFSSL_KEIL
  3050. "muls r6, r7, r6\n\t"
  3051. #elif defined(__clang__)
  3052. "muls r6, r7\n\t"
  3053. #else
  3054. "mul r6, r7\n\t"
  3055. #endif
  3056. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3057. "lsrs r7, r6, #16\n\t"
  3058. #else
  3059. "lsr r7, r6, #16\n\t"
  3060. #endif
  3061. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3062. "lsls r6, r6, #16\n\t"
  3063. #else
  3064. "lsl r6, r6, #16\n\t"
  3065. #endif
  3066. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3067. "adds r5, r5, r6\n\t"
  3068. #else
  3069. "add r5, r5, r6\n\t"
  3070. #endif
  3071. #ifdef WOLFSSL_KEIL
  3072. "adcs r3, r3, r7\n\t"
  3073. #elif defined(__clang__)
  3074. "adcs r3, r7\n\t"
  3075. #else
  3076. "adc r3, r7\n\t"
  3077. #endif
  3078. #ifdef WOLFSSL_KEIL
  3079. "adcs r4, r4, %[r]\n\t"
  3080. #elif defined(__clang__)
  3081. "adcs r4, %[r]\n\t"
  3082. #else
  3083. "adc r4, %[r]\n\t"
  3084. #endif
  3085. "# A[4] * B[1]\n\t"
  3086. "mov %[a], r9\n\t"
  3087. "mov %[b], r10\n\t"
  3088. "ldr %[a], [%[a], #16]\n\t"
  3089. "ldr %[b], [%[b], #4]\n\t"
  3090. "uxth r6, %[a]\n\t"
  3091. "uxth r7, %[b]\n\t"
  3092. #ifdef WOLFSSL_KEIL
  3093. "muls r7, r6, r7\n\t"
  3094. #elif defined(__clang__)
  3095. "muls r7, r6\n\t"
  3096. #else
  3097. "mul r7, r6\n\t"
  3098. #endif
  3099. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3100. "adds r5, r5, r7\n\t"
  3101. #else
  3102. "add r5, r5, r7\n\t"
  3103. #endif
  3104. #ifdef WOLFSSL_KEIL
  3105. "adcs r3, r3, %[r]\n\t"
  3106. #elif defined(__clang__)
  3107. "adcs r3, %[r]\n\t"
  3108. #else
  3109. "adc r3, %[r]\n\t"
  3110. #endif
  3111. #ifdef WOLFSSL_KEIL
  3112. "adcs r4, r4, %[r]\n\t"
  3113. #elif defined(__clang__)
  3114. "adcs r4, %[r]\n\t"
  3115. #else
  3116. "adc r4, %[r]\n\t"
  3117. #endif
  3118. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3119. "lsrs r7, %[b], #16\n\t"
  3120. #else
  3121. "lsr r7, %[b], #16\n\t"
  3122. #endif
  3123. #ifdef WOLFSSL_KEIL
  3124. "muls r6, r7, r6\n\t"
  3125. #elif defined(__clang__)
  3126. "muls r6, r7\n\t"
  3127. #else
  3128. "mul r6, r7\n\t"
  3129. #endif
  3130. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3131. "lsrs r7, r6, #16\n\t"
  3132. #else
  3133. "lsr r7, r6, #16\n\t"
  3134. #endif
  3135. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3136. "lsls r6, r6, #16\n\t"
  3137. #else
  3138. "lsl r6, r6, #16\n\t"
  3139. #endif
  3140. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3141. "adds r5, r5, r6\n\t"
  3142. #else
  3143. "add r5, r5, r6\n\t"
  3144. #endif
  3145. #ifdef WOLFSSL_KEIL
  3146. "adcs r3, r3, r7\n\t"
  3147. #elif defined(__clang__)
  3148. "adcs r3, r7\n\t"
  3149. #else
  3150. "adc r3, r7\n\t"
  3151. #endif
  3152. #ifdef WOLFSSL_KEIL
  3153. "adcs r4, r4, %[r]\n\t"
  3154. #elif defined(__clang__)
  3155. "adcs r4, %[r]\n\t"
  3156. #else
  3157. "adc r4, %[r]\n\t"
  3158. #endif
  3159. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3160. "lsrs r6, %[a], #16\n\t"
  3161. #else
  3162. "lsr r6, %[a], #16\n\t"
  3163. #endif
  3164. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3165. "lsrs r7, %[b], #16\n\t"
  3166. #else
  3167. "lsr r7, %[b], #16\n\t"
  3168. #endif
  3169. #ifdef WOLFSSL_KEIL
  3170. "muls r7, r6, r7\n\t"
  3171. #elif defined(__clang__)
  3172. "muls r7, r6\n\t"
  3173. #else
  3174. "mul r7, r6\n\t"
  3175. #endif
  3176. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3177. "adds r3, r3, r7\n\t"
  3178. #else
  3179. "add r3, r3, r7\n\t"
  3180. #endif
  3181. #ifdef WOLFSSL_KEIL
  3182. "adcs r4, r4, %[r]\n\t"
  3183. #elif defined(__clang__)
  3184. "adcs r4, %[r]\n\t"
  3185. #else
  3186. "adc r4, %[r]\n\t"
  3187. #endif
  3188. "uxth r7, %[b]\n\t"
  3189. #ifdef WOLFSSL_KEIL
  3190. "muls r6, r7, r6\n\t"
  3191. #elif defined(__clang__)
  3192. "muls r6, r7\n\t"
  3193. #else
  3194. "mul r6, r7\n\t"
  3195. #endif
  3196. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3197. "lsrs r7, r6, #16\n\t"
  3198. #else
  3199. "lsr r7, r6, #16\n\t"
  3200. #endif
  3201. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3202. "lsls r6, r6, #16\n\t"
  3203. #else
  3204. "lsl r6, r6, #16\n\t"
  3205. #endif
  3206. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3207. "adds r5, r5, r6\n\t"
  3208. #else
  3209. "add r5, r5, r6\n\t"
  3210. #endif
  3211. #ifdef WOLFSSL_KEIL
  3212. "adcs r3, r3, r7\n\t"
  3213. #elif defined(__clang__)
  3214. "adcs r3, r7\n\t"
  3215. #else
  3216. "adc r3, r7\n\t"
  3217. #endif
  3218. #ifdef WOLFSSL_KEIL
  3219. "adcs r4, r4, %[r]\n\t"
  3220. #elif defined(__clang__)
  3221. "adcs r4, %[r]\n\t"
  3222. #else
  3223. "adc r4, %[r]\n\t"
  3224. #endif
  3225. "# A[5] * B[0]\n\t"
  3226. "mov %[a], r9\n\t"
  3227. "mov %[b], r10\n\t"
  3228. "ldr %[a], [%[a], #20]\n\t"
  3229. "ldr %[b], [%[b]]\n\t"
  3230. "uxth r6, %[a]\n\t"
  3231. "uxth r7, %[b]\n\t"
  3232. #ifdef WOLFSSL_KEIL
  3233. "muls r7, r6, r7\n\t"
  3234. #elif defined(__clang__)
  3235. "muls r7, r6\n\t"
  3236. #else
  3237. "mul r7, r6\n\t"
  3238. #endif
  3239. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3240. "adds r5, r5, r7\n\t"
  3241. #else
  3242. "add r5, r5, r7\n\t"
  3243. #endif
  3244. #ifdef WOLFSSL_KEIL
  3245. "adcs r3, r3, %[r]\n\t"
  3246. #elif defined(__clang__)
  3247. "adcs r3, %[r]\n\t"
  3248. #else
  3249. "adc r3, %[r]\n\t"
  3250. #endif
  3251. #ifdef WOLFSSL_KEIL
  3252. "adcs r4, r4, %[r]\n\t"
  3253. #elif defined(__clang__)
  3254. "adcs r4, %[r]\n\t"
  3255. #else
  3256. "adc r4, %[r]\n\t"
  3257. #endif
  3258. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3259. "lsrs r7, %[b], #16\n\t"
  3260. #else
  3261. "lsr r7, %[b], #16\n\t"
  3262. #endif
  3263. #ifdef WOLFSSL_KEIL
  3264. "muls r6, r7, r6\n\t"
  3265. #elif defined(__clang__)
  3266. "muls r6, r7\n\t"
  3267. #else
  3268. "mul r6, r7\n\t"
  3269. #endif
  3270. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3271. "lsrs r7, r6, #16\n\t"
  3272. #else
  3273. "lsr r7, r6, #16\n\t"
  3274. #endif
  3275. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3276. "lsls r6, r6, #16\n\t"
  3277. #else
  3278. "lsl r6, r6, #16\n\t"
  3279. #endif
  3280. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3281. "adds r5, r5, r6\n\t"
  3282. #else
  3283. "add r5, r5, r6\n\t"
  3284. #endif
  3285. #ifdef WOLFSSL_KEIL
  3286. "adcs r3, r3, r7\n\t"
  3287. #elif defined(__clang__)
  3288. "adcs r3, r7\n\t"
  3289. #else
  3290. "adc r3, r7\n\t"
  3291. #endif
  3292. #ifdef WOLFSSL_KEIL
  3293. "adcs r4, r4, %[r]\n\t"
  3294. #elif defined(__clang__)
  3295. "adcs r4, %[r]\n\t"
  3296. #else
  3297. "adc r4, %[r]\n\t"
  3298. #endif
  3299. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3300. "lsrs r6, %[a], #16\n\t"
  3301. #else
  3302. "lsr r6, %[a], #16\n\t"
  3303. #endif
  3304. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3305. "lsrs r7, %[b], #16\n\t"
  3306. #else
  3307. "lsr r7, %[b], #16\n\t"
  3308. #endif
  3309. #ifdef WOLFSSL_KEIL
  3310. "muls r7, r6, r7\n\t"
  3311. #elif defined(__clang__)
  3312. "muls r7, r6\n\t"
  3313. #else
  3314. "mul r7, r6\n\t"
  3315. #endif
  3316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3317. "adds r3, r3, r7\n\t"
  3318. #else
  3319. "add r3, r3, r7\n\t"
  3320. #endif
  3321. #ifdef WOLFSSL_KEIL
  3322. "adcs r4, r4, %[r]\n\t"
  3323. #elif defined(__clang__)
  3324. "adcs r4, %[r]\n\t"
  3325. #else
  3326. "adc r4, %[r]\n\t"
  3327. #endif
  3328. "uxth r7, %[b]\n\t"
  3329. #ifdef WOLFSSL_KEIL
  3330. "muls r6, r7, r6\n\t"
  3331. #elif defined(__clang__)
  3332. "muls r6, r7\n\t"
  3333. #else
  3334. "mul r6, r7\n\t"
  3335. #endif
  3336. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3337. "lsrs r7, r6, #16\n\t"
  3338. #else
  3339. "lsr r7, r6, #16\n\t"
  3340. #endif
  3341. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3342. "lsls r6, r6, #16\n\t"
  3343. #else
  3344. "lsl r6, r6, #16\n\t"
  3345. #endif
  3346. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3347. "adds r5, r5, r6\n\t"
  3348. #else
  3349. "add r5, r5, r6\n\t"
  3350. #endif
  3351. #ifdef WOLFSSL_KEIL
  3352. "adcs r3, r3, r7\n\t"
  3353. #elif defined(__clang__)
  3354. "adcs r3, r7\n\t"
  3355. #else
  3356. "adc r3, r7\n\t"
  3357. #endif
  3358. #ifdef WOLFSSL_KEIL
  3359. "adcs r4, r4, %[r]\n\t"
  3360. #elif defined(__clang__)
  3361. "adcs r4, %[r]\n\t"
  3362. #else
  3363. "adc r4, %[r]\n\t"
  3364. #endif
  3365. "str r5, [sp, #20]\n\t"
  3366. "# A[6] * B[0]\n\t"
  3367. "movs r5, #0\n\t"
  3368. "mov %[a], r9\n\t"
  3369. "mov %[b], r10\n\t"
  3370. "ldr %[a], [%[a], #24]\n\t"
  3371. "ldr %[b], [%[b]]\n\t"
  3372. "uxth r6, %[a]\n\t"
  3373. "uxth r7, %[b]\n\t"
  3374. #ifdef WOLFSSL_KEIL
  3375. "muls r7, r6, r7\n\t"
  3376. #elif defined(__clang__)
  3377. "muls r7, r6\n\t"
  3378. #else
  3379. "mul r7, r6\n\t"
  3380. #endif
  3381. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3382. "adds r3, r3, r7\n\t"
  3383. #else
  3384. "add r3, r3, r7\n\t"
  3385. #endif
  3386. #ifdef WOLFSSL_KEIL
  3387. "adcs r4, r4, %[r]\n\t"
  3388. #elif defined(__clang__)
  3389. "adcs r4, %[r]\n\t"
  3390. #else
  3391. "adc r4, %[r]\n\t"
  3392. #endif
  3393. #ifdef WOLFSSL_KEIL
  3394. "adcs r5, r5, %[r]\n\t"
  3395. #elif defined(__clang__)
  3396. "adcs r5, %[r]\n\t"
  3397. #else
  3398. "adc r5, %[r]\n\t"
  3399. #endif
  3400. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3401. "lsrs r7, %[b], #16\n\t"
  3402. #else
  3403. "lsr r7, %[b], #16\n\t"
  3404. #endif
  3405. #ifdef WOLFSSL_KEIL
  3406. "muls r6, r7, r6\n\t"
  3407. #elif defined(__clang__)
  3408. "muls r6, r7\n\t"
  3409. #else
  3410. "mul r6, r7\n\t"
  3411. #endif
  3412. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3413. "lsrs r7, r6, #16\n\t"
  3414. #else
  3415. "lsr r7, r6, #16\n\t"
  3416. #endif
  3417. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3418. "lsls r6, r6, #16\n\t"
  3419. #else
  3420. "lsl r6, r6, #16\n\t"
  3421. #endif
  3422. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3423. "adds r3, r3, r6\n\t"
  3424. #else
  3425. "add r3, r3, r6\n\t"
  3426. #endif
  3427. #ifdef WOLFSSL_KEIL
  3428. "adcs r4, r4, r7\n\t"
  3429. #elif defined(__clang__)
  3430. "adcs r4, r7\n\t"
  3431. #else
  3432. "adc r4, r7\n\t"
  3433. #endif
  3434. #ifdef WOLFSSL_KEIL
  3435. "adcs r5, r5, %[r]\n\t"
  3436. #elif defined(__clang__)
  3437. "adcs r5, %[r]\n\t"
  3438. #else
  3439. "adc r5, %[r]\n\t"
  3440. #endif
  3441. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3442. "lsrs r6, %[a], #16\n\t"
  3443. #else
  3444. "lsr r6, %[a], #16\n\t"
  3445. #endif
  3446. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3447. "lsrs r7, %[b], #16\n\t"
  3448. #else
  3449. "lsr r7, %[b], #16\n\t"
  3450. #endif
  3451. #ifdef WOLFSSL_KEIL
  3452. "muls r7, r6, r7\n\t"
  3453. #elif defined(__clang__)
  3454. "muls r7, r6\n\t"
  3455. #else
  3456. "mul r7, r6\n\t"
  3457. #endif
  3458. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3459. "adds r4, r4, r7\n\t"
  3460. #else
  3461. "add r4, r4, r7\n\t"
  3462. #endif
  3463. #ifdef WOLFSSL_KEIL
  3464. "adcs r5, r5, %[r]\n\t"
  3465. #elif defined(__clang__)
  3466. "adcs r5, %[r]\n\t"
  3467. #else
  3468. "adc r5, %[r]\n\t"
  3469. #endif
  3470. "uxth r7, %[b]\n\t"
  3471. #ifdef WOLFSSL_KEIL
  3472. "muls r6, r7, r6\n\t"
  3473. #elif defined(__clang__)
  3474. "muls r6, r7\n\t"
  3475. #else
  3476. "mul r6, r7\n\t"
  3477. #endif
  3478. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3479. "lsrs r7, r6, #16\n\t"
  3480. #else
  3481. "lsr r7, r6, #16\n\t"
  3482. #endif
  3483. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3484. "lsls r6, r6, #16\n\t"
  3485. #else
  3486. "lsl r6, r6, #16\n\t"
  3487. #endif
  3488. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3489. "adds r3, r3, r6\n\t"
  3490. #else
  3491. "add r3, r3, r6\n\t"
  3492. #endif
  3493. #ifdef WOLFSSL_KEIL
  3494. "adcs r4, r4, r7\n\t"
  3495. #elif defined(__clang__)
  3496. "adcs r4, r7\n\t"
  3497. #else
  3498. "adc r4, r7\n\t"
  3499. #endif
  3500. #ifdef WOLFSSL_KEIL
  3501. "adcs r5, r5, %[r]\n\t"
  3502. #elif defined(__clang__)
  3503. "adcs r5, %[r]\n\t"
  3504. #else
  3505. "adc r5, %[r]\n\t"
  3506. #endif
  3507. "# A[5] * B[1]\n\t"
  3508. "mov %[a], r9\n\t"
  3509. "mov %[b], r10\n\t"
  3510. "ldr %[a], [%[a], #20]\n\t"
  3511. "ldr %[b], [%[b], #4]\n\t"
  3512. "uxth r6, %[a]\n\t"
  3513. "uxth r7, %[b]\n\t"
  3514. #ifdef WOLFSSL_KEIL
  3515. "muls r7, r6, r7\n\t"
  3516. #elif defined(__clang__)
  3517. "muls r7, r6\n\t"
  3518. #else
  3519. "mul r7, r6\n\t"
  3520. #endif
  3521. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3522. "adds r3, r3, r7\n\t"
  3523. #else
  3524. "add r3, r3, r7\n\t"
  3525. #endif
  3526. #ifdef WOLFSSL_KEIL
  3527. "adcs r4, r4, %[r]\n\t"
  3528. #elif defined(__clang__)
  3529. "adcs r4, %[r]\n\t"
  3530. #else
  3531. "adc r4, %[r]\n\t"
  3532. #endif
  3533. #ifdef WOLFSSL_KEIL
  3534. "adcs r5, r5, %[r]\n\t"
  3535. #elif defined(__clang__)
  3536. "adcs r5, %[r]\n\t"
  3537. #else
  3538. "adc r5, %[r]\n\t"
  3539. #endif
  3540. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3541. "lsrs r7, %[b], #16\n\t"
  3542. #else
  3543. "lsr r7, %[b], #16\n\t"
  3544. #endif
  3545. #ifdef WOLFSSL_KEIL
  3546. "muls r6, r7, r6\n\t"
  3547. #elif defined(__clang__)
  3548. "muls r6, r7\n\t"
  3549. #else
  3550. "mul r6, r7\n\t"
  3551. #endif
  3552. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3553. "lsrs r7, r6, #16\n\t"
  3554. #else
  3555. "lsr r7, r6, #16\n\t"
  3556. #endif
  3557. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3558. "lsls r6, r6, #16\n\t"
  3559. #else
  3560. "lsl r6, r6, #16\n\t"
  3561. #endif
  3562. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3563. "adds r3, r3, r6\n\t"
  3564. #else
  3565. "add r3, r3, r6\n\t"
  3566. #endif
  3567. #ifdef WOLFSSL_KEIL
  3568. "adcs r4, r4, r7\n\t"
  3569. #elif defined(__clang__)
  3570. "adcs r4, r7\n\t"
  3571. #else
  3572. "adc r4, r7\n\t"
  3573. #endif
  3574. #ifdef WOLFSSL_KEIL
  3575. "adcs r5, r5, %[r]\n\t"
  3576. #elif defined(__clang__)
  3577. "adcs r5, %[r]\n\t"
  3578. #else
  3579. "adc r5, %[r]\n\t"
  3580. #endif
  3581. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3582. "lsrs r6, %[a], #16\n\t"
  3583. #else
  3584. "lsr r6, %[a], #16\n\t"
  3585. #endif
  3586. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3587. "lsrs r7, %[b], #16\n\t"
  3588. #else
  3589. "lsr r7, %[b], #16\n\t"
  3590. #endif
  3591. #ifdef WOLFSSL_KEIL
  3592. "muls r7, r6, r7\n\t"
  3593. #elif defined(__clang__)
  3594. "muls r7, r6\n\t"
  3595. #else
  3596. "mul r7, r6\n\t"
  3597. #endif
  3598. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3599. "adds r4, r4, r7\n\t"
  3600. #else
  3601. "add r4, r4, r7\n\t"
  3602. #endif
  3603. #ifdef WOLFSSL_KEIL
  3604. "adcs r5, r5, %[r]\n\t"
  3605. #elif defined(__clang__)
  3606. "adcs r5, %[r]\n\t"
  3607. #else
  3608. "adc r5, %[r]\n\t"
  3609. #endif
  3610. "uxth r7, %[b]\n\t"
  3611. #ifdef WOLFSSL_KEIL
  3612. "muls r6, r7, r6\n\t"
  3613. #elif defined(__clang__)
  3614. "muls r6, r7\n\t"
  3615. #else
  3616. "mul r6, r7\n\t"
  3617. #endif
  3618. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3619. "lsrs r7, r6, #16\n\t"
  3620. #else
  3621. "lsr r7, r6, #16\n\t"
  3622. #endif
  3623. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3624. "lsls r6, r6, #16\n\t"
  3625. #else
  3626. "lsl r6, r6, #16\n\t"
  3627. #endif
  3628. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3629. "adds r3, r3, r6\n\t"
  3630. #else
  3631. "add r3, r3, r6\n\t"
  3632. #endif
  3633. #ifdef WOLFSSL_KEIL
  3634. "adcs r4, r4, r7\n\t"
  3635. #elif defined(__clang__)
  3636. "adcs r4, r7\n\t"
  3637. #else
  3638. "adc r4, r7\n\t"
  3639. #endif
  3640. #ifdef WOLFSSL_KEIL
  3641. "adcs r5, r5, %[r]\n\t"
  3642. #elif defined(__clang__)
  3643. "adcs r5, %[r]\n\t"
  3644. #else
  3645. "adc r5, %[r]\n\t"
  3646. #endif
  3647. "# A[4] * B[2]\n\t"
  3648. "mov %[a], r9\n\t"
  3649. "mov %[b], r10\n\t"
  3650. "ldr %[a], [%[a], #16]\n\t"
  3651. "ldr %[b], [%[b], #8]\n\t"
  3652. "uxth r6, %[a]\n\t"
  3653. "uxth r7, %[b]\n\t"
  3654. #ifdef WOLFSSL_KEIL
  3655. "muls r7, r6, r7\n\t"
  3656. #elif defined(__clang__)
  3657. "muls r7, r6\n\t"
  3658. #else
  3659. "mul r7, r6\n\t"
  3660. #endif
  3661. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3662. "adds r3, r3, r7\n\t"
  3663. #else
  3664. "add r3, r3, r7\n\t"
  3665. #endif
  3666. #ifdef WOLFSSL_KEIL
  3667. "adcs r4, r4, %[r]\n\t"
  3668. #elif defined(__clang__)
  3669. "adcs r4, %[r]\n\t"
  3670. #else
  3671. "adc r4, %[r]\n\t"
  3672. #endif
  3673. #ifdef WOLFSSL_KEIL
  3674. "adcs r5, r5, %[r]\n\t"
  3675. #elif defined(__clang__)
  3676. "adcs r5, %[r]\n\t"
  3677. #else
  3678. "adc r5, %[r]\n\t"
  3679. #endif
  3680. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3681. "lsrs r7, %[b], #16\n\t"
  3682. #else
  3683. "lsr r7, %[b], #16\n\t"
  3684. #endif
  3685. #ifdef WOLFSSL_KEIL
  3686. "muls r6, r7, r6\n\t"
  3687. #elif defined(__clang__)
  3688. "muls r6, r7\n\t"
  3689. #else
  3690. "mul r6, r7\n\t"
  3691. #endif
  3692. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3693. "lsrs r7, r6, #16\n\t"
  3694. #else
  3695. "lsr r7, r6, #16\n\t"
  3696. #endif
  3697. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3698. "lsls r6, r6, #16\n\t"
  3699. #else
  3700. "lsl r6, r6, #16\n\t"
  3701. #endif
  3702. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3703. "adds r3, r3, r6\n\t"
  3704. #else
  3705. "add r3, r3, r6\n\t"
  3706. #endif
  3707. #ifdef WOLFSSL_KEIL
  3708. "adcs r4, r4, r7\n\t"
  3709. #elif defined(__clang__)
  3710. "adcs r4, r7\n\t"
  3711. #else
  3712. "adc r4, r7\n\t"
  3713. #endif
  3714. #ifdef WOLFSSL_KEIL
  3715. "adcs r5, r5, %[r]\n\t"
  3716. #elif defined(__clang__)
  3717. "adcs r5, %[r]\n\t"
  3718. #else
  3719. "adc r5, %[r]\n\t"
  3720. #endif
  3721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3722. "lsrs r6, %[a], #16\n\t"
  3723. #else
  3724. "lsr r6, %[a], #16\n\t"
  3725. #endif
  3726. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3727. "lsrs r7, %[b], #16\n\t"
  3728. #else
  3729. "lsr r7, %[b], #16\n\t"
  3730. #endif
  3731. #ifdef WOLFSSL_KEIL
  3732. "muls r7, r6, r7\n\t"
  3733. #elif defined(__clang__)
  3734. "muls r7, r6\n\t"
  3735. #else
  3736. "mul r7, r6\n\t"
  3737. #endif
  3738. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3739. "adds r4, r4, r7\n\t"
  3740. #else
  3741. "add r4, r4, r7\n\t"
  3742. #endif
  3743. #ifdef WOLFSSL_KEIL
  3744. "adcs r5, r5, %[r]\n\t"
  3745. #elif defined(__clang__)
  3746. "adcs r5, %[r]\n\t"
  3747. #else
  3748. "adc r5, %[r]\n\t"
  3749. #endif
  3750. "uxth r7, %[b]\n\t"
  3751. #ifdef WOLFSSL_KEIL
  3752. "muls r6, r7, r6\n\t"
  3753. #elif defined(__clang__)
  3754. "muls r6, r7\n\t"
  3755. #else
  3756. "mul r6, r7\n\t"
  3757. #endif
  3758. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3759. "lsrs r7, r6, #16\n\t"
  3760. #else
  3761. "lsr r7, r6, #16\n\t"
  3762. #endif
  3763. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3764. "lsls r6, r6, #16\n\t"
  3765. #else
  3766. "lsl r6, r6, #16\n\t"
  3767. #endif
  3768. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3769. "adds r3, r3, r6\n\t"
  3770. #else
  3771. "add r3, r3, r6\n\t"
  3772. #endif
  3773. #ifdef WOLFSSL_KEIL
  3774. "adcs r4, r4, r7\n\t"
  3775. #elif defined(__clang__)
  3776. "adcs r4, r7\n\t"
  3777. #else
  3778. "adc r4, r7\n\t"
  3779. #endif
  3780. #ifdef WOLFSSL_KEIL
  3781. "adcs r5, r5, %[r]\n\t"
  3782. #elif defined(__clang__)
  3783. "adcs r5, %[r]\n\t"
  3784. #else
  3785. "adc r5, %[r]\n\t"
  3786. #endif
  3787. "# A[3] * B[3]\n\t"
  3788. "mov %[a], r9\n\t"
  3789. "mov %[b], r10\n\t"
  3790. "ldr %[a], [%[a], #12]\n\t"
  3791. "ldr %[b], [%[b], #12]\n\t"
  3792. "uxth r6, %[a]\n\t"
  3793. "uxth r7, %[b]\n\t"
  3794. #ifdef WOLFSSL_KEIL
  3795. "muls r7, r6, r7\n\t"
  3796. #elif defined(__clang__)
  3797. "muls r7, r6\n\t"
  3798. #else
  3799. "mul r7, r6\n\t"
  3800. #endif
  3801. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3802. "adds r3, r3, r7\n\t"
  3803. #else
  3804. "add r3, r3, r7\n\t"
  3805. #endif
  3806. #ifdef WOLFSSL_KEIL
  3807. "adcs r4, r4, %[r]\n\t"
  3808. #elif defined(__clang__)
  3809. "adcs r4, %[r]\n\t"
  3810. #else
  3811. "adc r4, %[r]\n\t"
  3812. #endif
  3813. #ifdef WOLFSSL_KEIL
  3814. "adcs r5, r5, %[r]\n\t"
  3815. #elif defined(__clang__)
  3816. "adcs r5, %[r]\n\t"
  3817. #else
  3818. "adc r5, %[r]\n\t"
  3819. #endif
  3820. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3821. "lsrs r7, %[b], #16\n\t"
  3822. #else
  3823. "lsr r7, %[b], #16\n\t"
  3824. #endif
  3825. #ifdef WOLFSSL_KEIL
  3826. "muls r6, r7, r6\n\t"
  3827. #elif defined(__clang__)
  3828. "muls r6, r7\n\t"
  3829. #else
  3830. "mul r6, r7\n\t"
  3831. #endif
  3832. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3833. "lsrs r7, r6, #16\n\t"
  3834. #else
  3835. "lsr r7, r6, #16\n\t"
  3836. #endif
  3837. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3838. "lsls r6, r6, #16\n\t"
  3839. #else
  3840. "lsl r6, r6, #16\n\t"
  3841. #endif
  3842. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3843. "adds r3, r3, r6\n\t"
  3844. #else
  3845. "add r3, r3, r6\n\t"
  3846. #endif
  3847. #ifdef WOLFSSL_KEIL
  3848. "adcs r4, r4, r7\n\t"
  3849. #elif defined(__clang__)
  3850. "adcs r4, r7\n\t"
  3851. #else
  3852. "adc r4, r7\n\t"
  3853. #endif
  3854. #ifdef WOLFSSL_KEIL
  3855. "adcs r5, r5, %[r]\n\t"
  3856. #elif defined(__clang__)
  3857. "adcs r5, %[r]\n\t"
  3858. #else
  3859. "adc r5, %[r]\n\t"
  3860. #endif
  3861. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3862. "lsrs r6, %[a], #16\n\t"
  3863. #else
  3864. "lsr r6, %[a], #16\n\t"
  3865. #endif
  3866. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3867. "lsrs r7, %[b], #16\n\t"
  3868. #else
  3869. "lsr r7, %[b], #16\n\t"
  3870. #endif
  3871. #ifdef WOLFSSL_KEIL
  3872. "muls r7, r6, r7\n\t"
  3873. #elif defined(__clang__)
  3874. "muls r7, r6\n\t"
  3875. #else
  3876. "mul r7, r6\n\t"
  3877. #endif
  3878. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3879. "adds r4, r4, r7\n\t"
  3880. #else
  3881. "add r4, r4, r7\n\t"
  3882. #endif
  3883. #ifdef WOLFSSL_KEIL
  3884. "adcs r5, r5, %[r]\n\t"
  3885. #elif defined(__clang__)
  3886. "adcs r5, %[r]\n\t"
  3887. #else
  3888. "adc r5, %[r]\n\t"
  3889. #endif
  3890. "uxth r7, %[b]\n\t"
  3891. #ifdef WOLFSSL_KEIL
  3892. "muls r6, r7, r6\n\t"
  3893. #elif defined(__clang__)
  3894. "muls r6, r7\n\t"
  3895. #else
  3896. "mul r6, r7\n\t"
  3897. #endif
  3898. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3899. "lsrs r7, r6, #16\n\t"
  3900. #else
  3901. "lsr r7, r6, #16\n\t"
  3902. #endif
  3903. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3904. "lsls r6, r6, #16\n\t"
  3905. #else
  3906. "lsl r6, r6, #16\n\t"
  3907. #endif
  3908. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3909. "adds r3, r3, r6\n\t"
  3910. #else
  3911. "add r3, r3, r6\n\t"
  3912. #endif
  3913. #ifdef WOLFSSL_KEIL
  3914. "adcs r4, r4, r7\n\t"
  3915. #elif defined(__clang__)
  3916. "adcs r4, r7\n\t"
  3917. #else
  3918. "adc r4, r7\n\t"
  3919. #endif
  3920. #ifdef WOLFSSL_KEIL
  3921. "adcs r5, r5, %[r]\n\t"
  3922. #elif defined(__clang__)
  3923. "adcs r5, %[r]\n\t"
  3924. #else
  3925. "adc r5, %[r]\n\t"
  3926. #endif
  3927. "# A[2] * B[4]\n\t"
  3928. "mov %[a], r9\n\t"
  3929. "mov %[b], r10\n\t"
  3930. "ldr %[a], [%[a], #8]\n\t"
  3931. "ldr %[b], [%[b], #16]\n\t"
  3932. "uxth r6, %[a]\n\t"
  3933. "uxth r7, %[b]\n\t"
  3934. #ifdef WOLFSSL_KEIL
  3935. "muls r7, r6, r7\n\t"
  3936. #elif defined(__clang__)
  3937. "muls r7, r6\n\t"
  3938. #else
  3939. "mul r7, r6\n\t"
  3940. #endif
  3941. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3942. "adds r3, r3, r7\n\t"
  3943. #else
  3944. "add r3, r3, r7\n\t"
  3945. #endif
  3946. #ifdef WOLFSSL_KEIL
  3947. "adcs r4, r4, %[r]\n\t"
  3948. #elif defined(__clang__)
  3949. "adcs r4, %[r]\n\t"
  3950. #else
  3951. "adc r4, %[r]\n\t"
  3952. #endif
  3953. #ifdef WOLFSSL_KEIL
  3954. "adcs r5, r5, %[r]\n\t"
  3955. #elif defined(__clang__)
  3956. "adcs r5, %[r]\n\t"
  3957. #else
  3958. "adc r5, %[r]\n\t"
  3959. #endif
  3960. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3961. "lsrs r7, %[b], #16\n\t"
  3962. #else
  3963. "lsr r7, %[b], #16\n\t"
  3964. #endif
  3965. #ifdef WOLFSSL_KEIL
  3966. "muls r6, r7, r6\n\t"
  3967. #elif defined(__clang__)
  3968. "muls r6, r7\n\t"
  3969. #else
  3970. "mul r6, r7\n\t"
  3971. #endif
  3972. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3973. "lsrs r7, r6, #16\n\t"
  3974. #else
  3975. "lsr r7, r6, #16\n\t"
  3976. #endif
  3977. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3978. "lsls r6, r6, #16\n\t"
  3979. #else
  3980. "lsl r6, r6, #16\n\t"
  3981. #endif
  3982. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3983. "adds r3, r3, r6\n\t"
  3984. #else
  3985. "add r3, r3, r6\n\t"
  3986. #endif
  3987. #ifdef WOLFSSL_KEIL
  3988. "adcs r4, r4, r7\n\t"
  3989. #elif defined(__clang__)
  3990. "adcs r4, r7\n\t"
  3991. #else
  3992. "adc r4, r7\n\t"
  3993. #endif
  3994. #ifdef WOLFSSL_KEIL
  3995. "adcs r5, r5, %[r]\n\t"
  3996. #elif defined(__clang__)
  3997. "adcs r5, %[r]\n\t"
  3998. #else
  3999. "adc r5, %[r]\n\t"
  4000. #endif
  4001. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4002. "lsrs r6, %[a], #16\n\t"
  4003. #else
  4004. "lsr r6, %[a], #16\n\t"
  4005. #endif
  4006. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4007. "lsrs r7, %[b], #16\n\t"
  4008. #else
  4009. "lsr r7, %[b], #16\n\t"
  4010. #endif
  4011. #ifdef WOLFSSL_KEIL
  4012. "muls r7, r6, r7\n\t"
  4013. #elif defined(__clang__)
  4014. "muls r7, r6\n\t"
  4015. #else
  4016. "mul r7, r6\n\t"
  4017. #endif
  4018. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4019. "adds r4, r4, r7\n\t"
  4020. #else
  4021. "add r4, r4, r7\n\t"
  4022. #endif
  4023. #ifdef WOLFSSL_KEIL
  4024. "adcs r5, r5, %[r]\n\t"
  4025. #elif defined(__clang__)
  4026. "adcs r5, %[r]\n\t"
  4027. #else
  4028. "adc r5, %[r]\n\t"
  4029. #endif
  4030. "uxth r7, %[b]\n\t"
  4031. #ifdef WOLFSSL_KEIL
  4032. "muls r6, r7, r6\n\t"
  4033. #elif defined(__clang__)
  4034. "muls r6, r7\n\t"
  4035. #else
  4036. "mul r6, r7\n\t"
  4037. #endif
  4038. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4039. "lsrs r7, r6, #16\n\t"
  4040. #else
  4041. "lsr r7, r6, #16\n\t"
  4042. #endif
  4043. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4044. "lsls r6, r6, #16\n\t"
  4045. #else
  4046. "lsl r6, r6, #16\n\t"
  4047. #endif
  4048. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4049. "adds r3, r3, r6\n\t"
  4050. #else
  4051. "add r3, r3, r6\n\t"
  4052. #endif
  4053. #ifdef WOLFSSL_KEIL
  4054. "adcs r4, r4, r7\n\t"
  4055. #elif defined(__clang__)
  4056. "adcs r4, r7\n\t"
  4057. #else
  4058. "adc r4, r7\n\t"
  4059. #endif
  4060. #ifdef WOLFSSL_KEIL
  4061. "adcs r5, r5, %[r]\n\t"
  4062. #elif defined(__clang__)
  4063. "adcs r5, %[r]\n\t"
  4064. #else
  4065. "adc r5, %[r]\n\t"
  4066. #endif
  4067. "# A[1] * B[5]\n\t"
  4068. "mov %[a], r9\n\t"
  4069. "mov %[b], r10\n\t"
  4070. "ldr %[a], [%[a], #4]\n\t"
  4071. "ldr %[b], [%[b], #20]\n\t"
  4072. "uxth r6, %[a]\n\t"
  4073. "uxth r7, %[b]\n\t"
  4074. #ifdef WOLFSSL_KEIL
  4075. "muls r7, r6, r7\n\t"
  4076. #elif defined(__clang__)
  4077. "muls r7, r6\n\t"
  4078. #else
  4079. "mul r7, r6\n\t"
  4080. #endif
  4081. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4082. "adds r3, r3, r7\n\t"
  4083. #else
  4084. "add r3, r3, r7\n\t"
  4085. #endif
  4086. #ifdef WOLFSSL_KEIL
  4087. "adcs r4, r4, %[r]\n\t"
  4088. #elif defined(__clang__)
  4089. "adcs r4, %[r]\n\t"
  4090. #else
  4091. "adc r4, %[r]\n\t"
  4092. #endif
  4093. #ifdef WOLFSSL_KEIL
  4094. "adcs r5, r5, %[r]\n\t"
  4095. #elif defined(__clang__)
  4096. "adcs r5, %[r]\n\t"
  4097. #else
  4098. "adc r5, %[r]\n\t"
  4099. #endif
  4100. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4101. "lsrs r7, %[b], #16\n\t"
  4102. #else
  4103. "lsr r7, %[b], #16\n\t"
  4104. #endif
  4105. #ifdef WOLFSSL_KEIL
  4106. "muls r6, r7, r6\n\t"
  4107. #elif defined(__clang__)
  4108. "muls r6, r7\n\t"
  4109. #else
  4110. "mul r6, r7\n\t"
  4111. #endif
  4112. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4113. "lsrs r7, r6, #16\n\t"
  4114. #else
  4115. "lsr r7, r6, #16\n\t"
  4116. #endif
  4117. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4118. "lsls r6, r6, #16\n\t"
  4119. #else
  4120. "lsl r6, r6, #16\n\t"
  4121. #endif
  4122. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4123. "adds r3, r3, r6\n\t"
  4124. #else
  4125. "add r3, r3, r6\n\t"
  4126. #endif
  4127. #ifdef WOLFSSL_KEIL
  4128. "adcs r4, r4, r7\n\t"
  4129. #elif defined(__clang__)
  4130. "adcs r4, r7\n\t"
  4131. #else
  4132. "adc r4, r7\n\t"
  4133. #endif
  4134. #ifdef WOLFSSL_KEIL
  4135. "adcs r5, r5, %[r]\n\t"
  4136. #elif defined(__clang__)
  4137. "adcs r5, %[r]\n\t"
  4138. #else
  4139. "adc r5, %[r]\n\t"
  4140. #endif
  4141. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4142. "lsrs r6, %[a], #16\n\t"
  4143. #else
  4144. "lsr r6, %[a], #16\n\t"
  4145. #endif
  4146. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4147. "lsrs r7, %[b], #16\n\t"
  4148. #else
  4149. "lsr r7, %[b], #16\n\t"
  4150. #endif
  4151. #ifdef WOLFSSL_KEIL
  4152. "muls r7, r6, r7\n\t"
  4153. #elif defined(__clang__)
  4154. "muls r7, r6\n\t"
  4155. #else
  4156. "mul r7, r6\n\t"
  4157. #endif
  4158. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4159. "adds r4, r4, r7\n\t"
  4160. #else
  4161. "add r4, r4, r7\n\t"
  4162. #endif
  4163. #ifdef WOLFSSL_KEIL
  4164. "adcs r5, r5, %[r]\n\t"
  4165. #elif defined(__clang__)
  4166. "adcs r5, %[r]\n\t"
  4167. #else
  4168. "adc r5, %[r]\n\t"
  4169. #endif
  4170. "uxth r7, %[b]\n\t"
  4171. #ifdef WOLFSSL_KEIL
  4172. "muls r6, r7, r6\n\t"
  4173. #elif defined(__clang__)
  4174. "muls r6, r7\n\t"
  4175. #else
  4176. "mul r6, r7\n\t"
  4177. #endif
  4178. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4179. "lsrs r7, r6, #16\n\t"
  4180. #else
  4181. "lsr r7, r6, #16\n\t"
  4182. #endif
  4183. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4184. "lsls r6, r6, #16\n\t"
  4185. #else
  4186. "lsl r6, r6, #16\n\t"
  4187. #endif
  4188. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4189. "adds r3, r3, r6\n\t"
  4190. #else
  4191. "add r3, r3, r6\n\t"
  4192. #endif
  4193. #ifdef WOLFSSL_KEIL
  4194. "adcs r4, r4, r7\n\t"
  4195. #elif defined(__clang__)
  4196. "adcs r4, r7\n\t"
  4197. #else
  4198. "adc r4, r7\n\t"
  4199. #endif
  4200. #ifdef WOLFSSL_KEIL
  4201. "adcs r5, r5, %[r]\n\t"
  4202. #elif defined(__clang__)
  4203. "adcs r5, %[r]\n\t"
  4204. #else
  4205. "adc r5, %[r]\n\t"
  4206. #endif
  4207. "# A[0] * B[6]\n\t"
  4208. "mov %[a], r9\n\t"
  4209. "mov %[b], r10\n\t"
  4210. "ldr %[a], [%[a]]\n\t"
  4211. "ldr %[b], [%[b], #24]\n\t"
  4212. "uxth r6, %[a]\n\t"
  4213. "uxth r7, %[b]\n\t"
  4214. #ifdef WOLFSSL_KEIL
  4215. "muls r7, r6, r7\n\t"
  4216. #elif defined(__clang__)
  4217. "muls r7, r6\n\t"
  4218. #else
  4219. "mul r7, r6\n\t"
  4220. #endif
  4221. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4222. "adds r3, r3, r7\n\t"
  4223. #else
  4224. "add r3, r3, r7\n\t"
  4225. #endif
  4226. #ifdef WOLFSSL_KEIL
  4227. "adcs r4, r4, %[r]\n\t"
  4228. #elif defined(__clang__)
  4229. "adcs r4, %[r]\n\t"
  4230. #else
  4231. "adc r4, %[r]\n\t"
  4232. #endif
  4233. #ifdef WOLFSSL_KEIL
  4234. "adcs r5, r5, %[r]\n\t"
  4235. #elif defined(__clang__)
  4236. "adcs r5, %[r]\n\t"
  4237. #else
  4238. "adc r5, %[r]\n\t"
  4239. #endif
  4240. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4241. "lsrs r7, %[b], #16\n\t"
  4242. #else
  4243. "lsr r7, %[b], #16\n\t"
  4244. #endif
  4245. #ifdef WOLFSSL_KEIL
  4246. "muls r6, r7, r6\n\t"
  4247. #elif defined(__clang__)
  4248. "muls r6, r7\n\t"
  4249. #else
  4250. "mul r6, r7\n\t"
  4251. #endif
  4252. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4253. "lsrs r7, r6, #16\n\t"
  4254. #else
  4255. "lsr r7, r6, #16\n\t"
  4256. #endif
  4257. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4258. "lsls r6, r6, #16\n\t"
  4259. #else
  4260. "lsl r6, r6, #16\n\t"
  4261. #endif
  4262. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4263. "adds r3, r3, r6\n\t"
  4264. #else
  4265. "add r3, r3, r6\n\t"
  4266. #endif
  4267. #ifdef WOLFSSL_KEIL
  4268. "adcs r4, r4, r7\n\t"
  4269. #elif defined(__clang__)
  4270. "adcs r4, r7\n\t"
  4271. #else
  4272. "adc r4, r7\n\t"
  4273. #endif
  4274. #ifdef WOLFSSL_KEIL
  4275. "adcs r5, r5, %[r]\n\t"
  4276. #elif defined(__clang__)
  4277. "adcs r5, %[r]\n\t"
  4278. #else
  4279. "adc r5, %[r]\n\t"
  4280. #endif
  4281. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4282. "lsrs r6, %[a], #16\n\t"
  4283. #else
  4284. "lsr r6, %[a], #16\n\t"
  4285. #endif
  4286. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4287. "lsrs r7, %[b], #16\n\t"
  4288. #else
  4289. "lsr r7, %[b], #16\n\t"
  4290. #endif
  4291. #ifdef WOLFSSL_KEIL
  4292. "muls r7, r6, r7\n\t"
  4293. #elif defined(__clang__)
  4294. "muls r7, r6\n\t"
  4295. #else
  4296. "mul r7, r6\n\t"
  4297. #endif
  4298. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4299. "adds r4, r4, r7\n\t"
  4300. #else
  4301. "add r4, r4, r7\n\t"
  4302. #endif
  4303. #ifdef WOLFSSL_KEIL
  4304. "adcs r5, r5, %[r]\n\t"
  4305. #elif defined(__clang__)
  4306. "adcs r5, %[r]\n\t"
  4307. #else
  4308. "adc r5, %[r]\n\t"
  4309. #endif
  4310. "uxth r7, %[b]\n\t"
  4311. #ifdef WOLFSSL_KEIL
  4312. "muls r6, r7, r6\n\t"
  4313. #elif defined(__clang__)
  4314. "muls r6, r7\n\t"
  4315. #else
  4316. "mul r6, r7\n\t"
  4317. #endif
  4318. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4319. "lsrs r7, r6, #16\n\t"
  4320. #else
  4321. "lsr r7, r6, #16\n\t"
  4322. #endif
  4323. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4324. "lsls r6, r6, #16\n\t"
  4325. #else
  4326. "lsl r6, r6, #16\n\t"
  4327. #endif
  4328. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4329. "adds r3, r3, r6\n\t"
  4330. #else
  4331. "add r3, r3, r6\n\t"
  4332. #endif
  4333. #ifdef WOLFSSL_KEIL
  4334. "adcs r4, r4, r7\n\t"
  4335. #elif defined(__clang__)
  4336. "adcs r4, r7\n\t"
  4337. #else
  4338. "adc r4, r7\n\t"
  4339. #endif
  4340. #ifdef WOLFSSL_KEIL
  4341. "adcs r5, r5, %[r]\n\t"
  4342. #elif defined(__clang__)
  4343. "adcs r5, %[r]\n\t"
  4344. #else
  4345. "adc r5, %[r]\n\t"
  4346. #endif
  4347. "str r3, [sp, #24]\n\t"
  4348. "# A[0] * B[7]\n\t"
  4349. "movs r3, #0\n\t"
  4350. "mov %[a], r9\n\t"
  4351. "mov %[b], r10\n\t"
  4352. "ldr %[a], [%[a]]\n\t"
  4353. "ldr %[b], [%[b], #28]\n\t"
  4354. "uxth r6, %[a]\n\t"
  4355. "uxth r7, %[b]\n\t"
  4356. #ifdef WOLFSSL_KEIL
  4357. "muls r7, r6, r7\n\t"
  4358. #elif defined(__clang__)
  4359. "muls r7, r6\n\t"
  4360. #else
  4361. "mul r7, r6\n\t"
  4362. #endif
  4363. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4364. "adds r4, r4, r7\n\t"
  4365. #else
  4366. "add r4, r4, r7\n\t"
  4367. #endif
  4368. #ifdef WOLFSSL_KEIL
  4369. "adcs r5, r5, %[r]\n\t"
  4370. #elif defined(__clang__)
  4371. "adcs r5, %[r]\n\t"
  4372. #else
  4373. "adc r5, %[r]\n\t"
  4374. #endif
  4375. #ifdef WOLFSSL_KEIL
  4376. "adcs r3, r3, %[r]\n\t"
  4377. #elif defined(__clang__)
  4378. "adcs r3, %[r]\n\t"
  4379. #else
  4380. "adc r3, %[r]\n\t"
  4381. #endif
  4382. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4383. "lsrs r7, %[b], #16\n\t"
  4384. #else
  4385. "lsr r7, %[b], #16\n\t"
  4386. #endif
  4387. #ifdef WOLFSSL_KEIL
  4388. "muls r6, r7, r6\n\t"
  4389. #elif defined(__clang__)
  4390. "muls r6, r7\n\t"
  4391. #else
  4392. "mul r6, r7\n\t"
  4393. #endif
  4394. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4395. "lsrs r7, r6, #16\n\t"
  4396. #else
  4397. "lsr r7, r6, #16\n\t"
  4398. #endif
  4399. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4400. "lsls r6, r6, #16\n\t"
  4401. #else
  4402. "lsl r6, r6, #16\n\t"
  4403. #endif
  4404. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4405. "adds r4, r4, r6\n\t"
  4406. #else
  4407. "add r4, r4, r6\n\t"
  4408. #endif
  4409. #ifdef WOLFSSL_KEIL
  4410. "adcs r5, r5, r7\n\t"
  4411. #elif defined(__clang__)
  4412. "adcs r5, r7\n\t"
  4413. #else
  4414. "adc r5, r7\n\t"
  4415. #endif
  4416. #ifdef WOLFSSL_KEIL
  4417. "adcs r3, r3, %[r]\n\t"
  4418. #elif defined(__clang__)
  4419. "adcs r3, %[r]\n\t"
  4420. #else
  4421. "adc r3, %[r]\n\t"
  4422. #endif
  4423. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4424. "lsrs r6, %[a], #16\n\t"
  4425. #else
  4426. "lsr r6, %[a], #16\n\t"
  4427. #endif
  4428. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4429. "lsrs r7, %[b], #16\n\t"
  4430. #else
  4431. "lsr r7, %[b], #16\n\t"
  4432. #endif
  4433. #ifdef WOLFSSL_KEIL
  4434. "muls r7, r6, r7\n\t"
  4435. #elif defined(__clang__)
  4436. "muls r7, r6\n\t"
  4437. #else
  4438. "mul r7, r6\n\t"
  4439. #endif
  4440. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4441. "adds r5, r5, r7\n\t"
  4442. #else
  4443. "add r5, r5, r7\n\t"
  4444. #endif
  4445. #ifdef WOLFSSL_KEIL
  4446. "adcs r3, r3, %[r]\n\t"
  4447. #elif defined(__clang__)
  4448. "adcs r3, %[r]\n\t"
  4449. #else
  4450. "adc r3, %[r]\n\t"
  4451. #endif
  4452. "uxth r7, %[b]\n\t"
  4453. #ifdef WOLFSSL_KEIL
  4454. "muls r6, r7, r6\n\t"
  4455. #elif defined(__clang__)
  4456. "muls r6, r7\n\t"
  4457. #else
  4458. "mul r6, r7\n\t"
  4459. #endif
  4460. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4461. "lsrs r7, r6, #16\n\t"
  4462. #else
  4463. "lsr r7, r6, #16\n\t"
  4464. #endif
  4465. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4466. "lsls r6, r6, #16\n\t"
  4467. #else
  4468. "lsl r6, r6, #16\n\t"
  4469. #endif
  4470. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4471. "adds r4, r4, r6\n\t"
  4472. #else
  4473. "add r4, r4, r6\n\t"
  4474. #endif
  4475. #ifdef WOLFSSL_KEIL
  4476. "adcs r5, r5, r7\n\t"
  4477. #elif defined(__clang__)
  4478. "adcs r5, r7\n\t"
  4479. #else
  4480. "adc r5, r7\n\t"
  4481. #endif
  4482. #ifdef WOLFSSL_KEIL
  4483. "adcs r3, r3, %[r]\n\t"
  4484. #elif defined(__clang__)
  4485. "adcs r3, %[r]\n\t"
  4486. #else
  4487. "adc r3, %[r]\n\t"
  4488. #endif
  4489. "# A[1] * B[6]\n\t"
  4490. "mov %[a], r9\n\t"
  4491. "mov %[b], r10\n\t"
  4492. "ldr %[a], [%[a], #4]\n\t"
  4493. "ldr %[b], [%[b], #24]\n\t"
  4494. "uxth r6, %[a]\n\t"
  4495. "uxth r7, %[b]\n\t"
  4496. #ifdef WOLFSSL_KEIL
  4497. "muls r7, r6, r7\n\t"
  4498. #elif defined(__clang__)
  4499. "muls r7, r6\n\t"
  4500. #else
  4501. "mul r7, r6\n\t"
  4502. #endif
  4503. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4504. "adds r4, r4, r7\n\t"
  4505. #else
  4506. "add r4, r4, r7\n\t"
  4507. #endif
  4508. #ifdef WOLFSSL_KEIL
  4509. "adcs r5, r5, %[r]\n\t"
  4510. #elif defined(__clang__)
  4511. "adcs r5, %[r]\n\t"
  4512. #else
  4513. "adc r5, %[r]\n\t"
  4514. #endif
  4515. #ifdef WOLFSSL_KEIL
  4516. "adcs r3, r3, %[r]\n\t"
  4517. #elif defined(__clang__)
  4518. "adcs r3, %[r]\n\t"
  4519. #else
  4520. "adc r3, %[r]\n\t"
  4521. #endif
  4522. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4523. "lsrs r7, %[b], #16\n\t"
  4524. #else
  4525. "lsr r7, %[b], #16\n\t"
  4526. #endif
  4527. #ifdef WOLFSSL_KEIL
  4528. "muls r6, r7, r6\n\t"
  4529. #elif defined(__clang__)
  4530. "muls r6, r7\n\t"
  4531. #else
  4532. "mul r6, r7\n\t"
  4533. #endif
  4534. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4535. "lsrs r7, r6, #16\n\t"
  4536. #else
  4537. "lsr r7, r6, #16\n\t"
  4538. #endif
  4539. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4540. "lsls r6, r6, #16\n\t"
  4541. #else
  4542. "lsl r6, r6, #16\n\t"
  4543. #endif
  4544. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4545. "adds r4, r4, r6\n\t"
  4546. #else
  4547. "add r4, r4, r6\n\t"
  4548. #endif
  4549. #ifdef WOLFSSL_KEIL
  4550. "adcs r5, r5, r7\n\t"
  4551. #elif defined(__clang__)
  4552. "adcs r5, r7\n\t"
  4553. #else
  4554. "adc r5, r7\n\t"
  4555. #endif
  4556. #ifdef WOLFSSL_KEIL
  4557. "adcs r3, r3, %[r]\n\t"
  4558. #elif defined(__clang__)
  4559. "adcs r3, %[r]\n\t"
  4560. #else
  4561. "adc r3, %[r]\n\t"
  4562. #endif
  4563. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4564. "lsrs r6, %[a], #16\n\t"
  4565. #else
  4566. "lsr r6, %[a], #16\n\t"
  4567. #endif
  4568. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4569. "lsrs r7, %[b], #16\n\t"
  4570. #else
  4571. "lsr r7, %[b], #16\n\t"
  4572. #endif
  4573. #ifdef WOLFSSL_KEIL
  4574. "muls r7, r6, r7\n\t"
  4575. #elif defined(__clang__)
  4576. "muls r7, r6\n\t"
  4577. #else
  4578. "mul r7, r6\n\t"
  4579. #endif
  4580. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4581. "adds r5, r5, r7\n\t"
  4582. #else
  4583. "add r5, r5, r7\n\t"
  4584. #endif
  4585. #ifdef WOLFSSL_KEIL
  4586. "adcs r3, r3, %[r]\n\t"
  4587. #elif defined(__clang__)
  4588. "adcs r3, %[r]\n\t"
  4589. #else
  4590. "adc r3, %[r]\n\t"
  4591. #endif
  4592. "uxth r7, %[b]\n\t"
  4593. #ifdef WOLFSSL_KEIL
  4594. "muls r6, r7, r6\n\t"
  4595. #elif defined(__clang__)
  4596. "muls r6, r7\n\t"
  4597. #else
  4598. "mul r6, r7\n\t"
  4599. #endif
  4600. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4601. "lsrs r7, r6, #16\n\t"
  4602. #else
  4603. "lsr r7, r6, #16\n\t"
  4604. #endif
  4605. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4606. "lsls r6, r6, #16\n\t"
  4607. #else
  4608. "lsl r6, r6, #16\n\t"
  4609. #endif
  4610. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4611. "adds r4, r4, r6\n\t"
  4612. #else
  4613. "add r4, r4, r6\n\t"
  4614. #endif
  4615. #ifdef WOLFSSL_KEIL
  4616. "adcs r5, r5, r7\n\t"
  4617. #elif defined(__clang__)
  4618. "adcs r5, r7\n\t"
  4619. #else
  4620. "adc r5, r7\n\t"
  4621. #endif
  4622. #ifdef WOLFSSL_KEIL
  4623. "adcs r3, r3, %[r]\n\t"
  4624. #elif defined(__clang__)
  4625. "adcs r3, %[r]\n\t"
  4626. #else
  4627. "adc r3, %[r]\n\t"
  4628. #endif
  4629. "# A[2] * B[5]\n\t"
  4630. "mov %[a], r9\n\t"
  4631. "mov %[b], r10\n\t"
  4632. "ldr %[a], [%[a], #8]\n\t"
  4633. "ldr %[b], [%[b], #20]\n\t"
  4634. "uxth r6, %[a]\n\t"
  4635. "uxth r7, %[b]\n\t"
  4636. #ifdef WOLFSSL_KEIL
  4637. "muls r7, r6, r7\n\t"
  4638. #elif defined(__clang__)
  4639. "muls r7, r6\n\t"
  4640. #else
  4641. "mul r7, r6\n\t"
  4642. #endif
  4643. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4644. "adds r4, r4, r7\n\t"
  4645. #else
  4646. "add r4, r4, r7\n\t"
  4647. #endif
  4648. #ifdef WOLFSSL_KEIL
  4649. "adcs r5, r5, %[r]\n\t"
  4650. #elif defined(__clang__)
  4651. "adcs r5, %[r]\n\t"
  4652. #else
  4653. "adc r5, %[r]\n\t"
  4654. #endif
  4655. #ifdef WOLFSSL_KEIL
  4656. "adcs r3, r3, %[r]\n\t"
  4657. #elif defined(__clang__)
  4658. "adcs r3, %[r]\n\t"
  4659. #else
  4660. "adc r3, %[r]\n\t"
  4661. #endif
  4662. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4663. "lsrs r7, %[b], #16\n\t"
  4664. #else
  4665. "lsr r7, %[b], #16\n\t"
  4666. #endif
  4667. #ifdef WOLFSSL_KEIL
  4668. "muls r6, r7, r6\n\t"
  4669. #elif defined(__clang__)
  4670. "muls r6, r7\n\t"
  4671. #else
  4672. "mul r6, r7\n\t"
  4673. #endif
  4674. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4675. "lsrs r7, r6, #16\n\t"
  4676. #else
  4677. "lsr r7, r6, #16\n\t"
  4678. #endif
  4679. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4680. "lsls r6, r6, #16\n\t"
  4681. #else
  4682. "lsl r6, r6, #16\n\t"
  4683. #endif
  4684. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4685. "adds r4, r4, r6\n\t"
  4686. #else
  4687. "add r4, r4, r6\n\t"
  4688. #endif
  4689. #ifdef WOLFSSL_KEIL
  4690. "adcs r5, r5, r7\n\t"
  4691. #elif defined(__clang__)
  4692. "adcs r5, r7\n\t"
  4693. #else
  4694. "adc r5, r7\n\t"
  4695. #endif
  4696. #ifdef WOLFSSL_KEIL
  4697. "adcs r3, r3, %[r]\n\t"
  4698. #elif defined(__clang__)
  4699. "adcs r3, %[r]\n\t"
  4700. #else
  4701. "adc r3, %[r]\n\t"
  4702. #endif
  4703. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4704. "lsrs r6, %[a], #16\n\t"
  4705. #else
  4706. "lsr r6, %[a], #16\n\t"
  4707. #endif
  4708. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4709. "lsrs r7, %[b], #16\n\t"
  4710. #else
  4711. "lsr r7, %[b], #16\n\t"
  4712. #endif
  4713. #ifdef WOLFSSL_KEIL
  4714. "muls r7, r6, r7\n\t"
  4715. #elif defined(__clang__)
  4716. "muls r7, r6\n\t"
  4717. #else
  4718. "mul r7, r6\n\t"
  4719. #endif
  4720. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4721. "adds r5, r5, r7\n\t"
  4722. #else
  4723. "add r5, r5, r7\n\t"
  4724. #endif
  4725. #ifdef WOLFSSL_KEIL
  4726. "adcs r3, r3, %[r]\n\t"
  4727. #elif defined(__clang__)
  4728. "adcs r3, %[r]\n\t"
  4729. #else
  4730. "adc r3, %[r]\n\t"
  4731. #endif
  4732. "uxth r7, %[b]\n\t"
  4733. #ifdef WOLFSSL_KEIL
  4734. "muls r6, r7, r6\n\t"
  4735. #elif defined(__clang__)
  4736. "muls r6, r7\n\t"
  4737. #else
  4738. "mul r6, r7\n\t"
  4739. #endif
  4740. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4741. "lsrs r7, r6, #16\n\t"
  4742. #else
  4743. "lsr r7, r6, #16\n\t"
  4744. #endif
  4745. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4746. "lsls r6, r6, #16\n\t"
  4747. #else
  4748. "lsl r6, r6, #16\n\t"
  4749. #endif
  4750. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4751. "adds r4, r4, r6\n\t"
  4752. #else
  4753. "add r4, r4, r6\n\t"
  4754. #endif
  4755. #ifdef WOLFSSL_KEIL
  4756. "adcs r5, r5, r7\n\t"
  4757. #elif defined(__clang__)
  4758. "adcs r5, r7\n\t"
  4759. #else
  4760. "adc r5, r7\n\t"
  4761. #endif
  4762. #ifdef WOLFSSL_KEIL
  4763. "adcs r3, r3, %[r]\n\t"
  4764. #elif defined(__clang__)
  4765. "adcs r3, %[r]\n\t"
  4766. #else
  4767. "adc r3, %[r]\n\t"
  4768. #endif
  4769. "# A[3] * B[4]\n\t"
  4770. "mov %[a], r9\n\t"
  4771. "mov %[b], r10\n\t"
  4772. "ldr %[a], [%[a], #12]\n\t"
  4773. "ldr %[b], [%[b], #16]\n\t"
  4774. "uxth r6, %[a]\n\t"
  4775. "uxth r7, %[b]\n\t"
  4776. #ifdef WOLFSSL_KEIL
  4777. "muls r7, r6, r7\n\t"
  4778. #elif defined(__clang__)
  4779. "muls r7, r6\n\t"
  4780. #else
  4781. "mul r7, r6\n\t"
  4782. #endif
  4783. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4784. "adds r4, r4, r7\n\t"
  4785. #else
  4786. "add r4, r4, r7\n\t"
  4787. #endif
  4788. #ifdef WOLFSSL_KEIL
  4789. "adcs r5, r5, %[r]\n\t"
  4790. #elif defined(__clang__)
  4791. "adcs r5, %[r]\n\t"
  4792. #else
  4793. "adc r5, %[r]\n\t"
  4794. #endif
  4795. #ifdef WOLFSSL_KEIL
  4796. "adcs r3, r3, %[r]\n\t"
  4797. #elif defined(__clang__)
  4798. "adcs r3, %[r]\n\t"
  4799. #else
  4800. "adc r3, %[r]\n\t"
  4801. #endif
  4802. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4803. "lsrs r7, %[b], #16\n\t"
  4804. #else
  4805. "lsr r7, %[b], #16\n\t"
  4806. #endif
  4807. #ifdef WOLFSSL_KEIL
  4808. "muls r6, r7, r6\n\t"
  4809. #elif defined(__clang__)
  4810. "muls r6, r7\n\t"
  4811. #else
  4812. "mul r6, r7\n\t"
  4813. #endif
  4814. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4815. "lsrs r7, r6, #16\n\t"
  4816. #else
  4817. "lsr r7, r6, #16\n\t"
  4818. #endif
  4819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4820. "lsls r6, r6, #16\n\t"
  4821. #else
  4822. "lsl r6, r6, #16\n\t"
  4823. #endif
  4824. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4825. "adds r4, r4, r6\n\t"
  4826. #else
  4827. "add r4, r4, r6\n\t"
  4828. #endif
  4829. #ifdef WOLFSSL_KEIL
  4830. "adcs r5, r5, r7\n\t"
  4831. #elif defined(__clang__)
  4832. "adcs r5, r7\n\t"
  4833. #else
  4834. "adc r5, r7\n\t"
  4835. #endif
  4836. #ifdef WOLFSSL_KEIL
  4837. "adcs r3, r3, %[r]\n\t"
  4838. #elif defined(__clang__)
  4839. "adcs r3, %[r]\n\t"
  4840. #else
  4841. "adc r3, %[r]\n\t"
  4842. #endif
  4843. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4844. "lsrs r6, %[a], #16\n\t"
  4845. #else
  4846. "lsr r6, %[a], #16\n\t"
  4847. #endif
  4848. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4849. "lsrs r7, %[b], #16\n\t"
  4850. #else
  4851. "lsr r7, %[b], #16\n\t"
  4852. #endif
  4853. #ifdef WOLFSSL_KEIL
  4854. "muls r7, r6, r7\n\t"
  4855. #elif defined(__clang__)
  4856. "muls r7, r6\n\t"
  4857. #else
  4858. "mul r7, r6\n\t"
  4859. #endif
  4860. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4861. "adds r5, r5, r7\n\t"
  4862. #else
  4863. "add r5, r5, r7\n\t"
  4864. #endif
  4865. #ifdef WOLFSSL_KEIL
  4866. "adcs r3, r3, %[r]\n\t"
  4867. #elif defined(__clang__)
  4868. "adcs r3, %[r]\n\t"
  4869. #else
  4870. "adc r3, %[r]\n\t"
  4871. #endif
  4872. "uxth r7, %[b]\n\t"
  4873. #ifdef WOLFSSL_KEIL
  4874. "muls r6, r7, r6\n\t"
  4875. #elif defined(__clang__)
  4876. "muls r6, r7\n\t"
  4877. #else
  4878. "mul r6, r7\n\t"
  4879. #endif
  4880. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4881. "lsrs r7, r6, #16\n\t"
  4882. #else
  4883. "lsr r7, r6, #16\n\t"
  4884. #endif
  4885. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4886. "lsls r6, r6, #16\n\t"
  4887. #else
  4888. "lsl r6, r6, #16\n\t"
  4889. #endif
  4890. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4891. "adds r4, r4, r6\n\t"
  4892. #else
  4893. "add r4, r4, r6\n\t"
  4894. #endif
  4895. #ifdef WOLFSSL_KEIL
  4896. "adcs r5, r5, r7\n\t"
  4897. #elif defined(__clang__)
  4898. "adcs r5, r7\n\t"
  4899. #else
  4900. "adc r5, r7\n\t"
  4901. #endif
  4902. #ifdef WOLFSSL_KEIL
  4903. "adcs r3, r3, %[r]\n\t"
  4904. #elif defined(__clang__)
  4905. "adcs r3, %[r]\n\t"
  4906. #else
  4907. "adc r3, %[r]\n\t"
  4908. #endif
  4909. "# A[4] * B[3]\n\t"
  4910. "mov %[a], r9\n\t"
  4911. "mov %[b], r10\n\t"
  4912. "ldr %[a], [%[a], #16]\n\t"
  4913. "ldr %[b], [%[b], #12]\n\t"
  4914. "uxth r6, %[a]\n\t"
  4915. "uxth r7, %[b]\n\t"
  4916. #ifdef WOLFSSL_KEIL
  4917. "muls r7, r6, r7\n\t"
  4918. #elif defined(__clang__)
  4919. "muls r7, r6\n\t"
  4920. #else
  4921. "mul r7, r6\n\t"
  4922. #endif
  4923. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4924. "adds r4, r4, r7\n\t"
  4925. #else
  4926. "add r4, r4, r7\n\t"
  4927. #endif
  4928. #ifdef WOLFSSL_KEIL
  4929. "adcs r5, r5, %[r]\n\t"
  4930. #elif defined(__clang__)
  4931. "adcs r5, %[r]\n\t"
  4932. #else
  4933. "adc r5, %[r]\n\t"
  4934. #endif
  4935. #ifdef WOLFSSL_KEIL
  4936. "adcs r3, r3, %[r]\n\t"
  4937. #elif defined(__clang__)
  4938. "adcs r3, %[r]\n\t"
  4939. #else
  4940. "adc r3, %[r]\n\t"
  4941. #endif
  4942. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4943. "lsrs r7, %[b], #16\n\t"
  4944. #else
  4945. "lsr r7, %[b], #16\n\t"
  4946. #endif
  4947. #ifdef WOLFSSL_KEIL
  4948. "muls r6, r7, r6\n\t"
  4949. #elif defined(__clang__)
  4950. "muls r6, r7\n\t"
  4951. #else
  4952. "mul r6, r7\n\t"
  4953. #endif
  4954. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4955. "lsrs r7, r6, #16\n\t"
  4956. #else
  4957. "lsr r7, r6, #16\n\t"
  4958. #endif
  4959. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4960. "lsls r6, r6, #16\n\t"
  4961. #else
  4962. "lsl r6, r6, #16\n\t"
  4963. #endif
  4964. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4965. "adds r4, r4, r6\n\t"
  4966. #else
  4967. "add r4, r4, r6\n\t"
  4968. #endif
  4969. #ifdef WOLFSSL_KEIL
  4970. "adcs r5, r5, r7\n\t"
  4971. #elif defined(__clang__)
  4972. "adcs r5, r7\n\t"
  4973. #else
  4974. "adc r5, r7\n\t"
  4975. #endif
  4976. #ifdef WOLFSSL_KEIL
  4977. "adcs r3, r3, %[r]\n\t"
  4978. #elif defined(__clang__)
  4979. "adcs r3, %[r]\n\t"
  4980. #else
  4981. "adc r3, %[r]\n\t"
  4982. #endif
  4983. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4984. "lsrs r6, %[a], #16\n\t"
  4985. #else
  4986. "lsr r6, %[a], #16\n\t"
  4987. #endif
  4988. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4989. "lsrs r7, %[b], #16\n\t"
  4990. #else
  4991. "lsr r7, %[b], #16\n\t"
  4992. #endif
  4993. #ifdef WOLFSSL_KEIL
  4994. "muls r7, r6, r7\n\t"
  4995. #elif defined(__clang__)
  4996. "muls r7, r6\n\t"
  4997. #else
  4998. "mul r7, r6\n\t"
  4999. #endif
  5000. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5001. "adds r5, r5, r7\n\t"
  5002. #else
  5003. "add r5, r5, r7\n\t"
  5004. #endif
  5005. #ifdef WOLFSSL_KEIL
  5006. "adcs r3, r3, %[r]\n\t"
  5007. #elif defined(__clang__)
  5008. "adcs r3, %[r]\n\t"
  5009. #else
  5010. "adc r3, %[r]\n\t"
  5011. #endif
  5012. "uxth r7, %[b]\n\t"
  5013. #ifdef WOLFSSL_KEIL
  5014. "muls r6, r7, r6\n\t"
  5015. #elif defined(__clang__)
  5016. "muls r6, r7\n\t"
  5017. #else
  5018. "mul r6, r7\n\t"
  5019. #endif
  5020. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5021. "lsrs r7, r6, #16\n\t"
  5022. #else
  5023. "lsr r7, r6, #16\n\t"
  5024. #endif
  5025. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5026. "lsls r6, r6, #16\n\t"
  5027. #else
  5028. "lsl r6, r6, #16\n\t"
  5029. #endif
  5030. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5031. "adds r4, r4, r6\n\t"
  5032. #else
  5033. "add r4, r4, r6\n\t"
  5034. #endif
  5035. #ifdef WOLFSSL_KEIL
  5036. "adcs r5, r5, r7\n\t"
  5037. #elif defined(__clang__)
  5038. "adcs r5, r7\n\t"
  5039. #else
  5040. "adc r5, r7\n\t"
  5041. #endif
  5042. #ifdef WOLFSSL_KEIL
  5043. "adcs r3, r3, %[r]\n\t"
  5044. #elif defined(__clang__)
  5045. "adcs r3, %[r]\n\t"
  5046. #else
  5047. "adc r3, %[r]\n\t"
  5048. #endif
  5049. "# A[5] * B[2]\n\t"
  5050. "mov %[a], r9\n\t"
  5051. "mov %[b], r10\n\t"
  5052. "ldr %[a], [%[a], #20]\n\t"
  5053. "ldr %[b], [%[b], #8]\n\t"
  5054. "uxth r6, %[a]\n\t"
  5055. "uxth r7, %[b]\n\t"
  5056. #ifdef WOLFSSL_KEIL
  5057. "muls r7, r6, r7\n\t"
  5058. #elif defined(__clang__)
  5059. "muls r7, r6\n\t"
  5060. #else
  5061. "mul r7, r6\n\t"
  5062. #endif
  5063. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5064. "adds r4, r4, r7\n\t"
  5065. #else
  5066. "add r4, r4, r7\n\t"
  5067. #endif
  5068. #ifdef WOLFSSL_KEIL
  5069. "adcs r5, r5, %[r]\n\t"
  5070. #elif defined(__clang__)
  5071. "adcs r5, %[r]\n\t"
  5072. #else
  5073. "adc r5, %[r]\n\t"
  5074. #endif
  5075. #ifdef WOLFSSL_KEIL
  5076. "adcs r3, r3, %[r]\n\t"
  5077. #elif defined(__clang__)
  5078. "adcs r3, %[r]\n\t"
  5079. #else
  5080. "adc r3, %[r]\n\t"
  5081. #endif
  5082. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5083. "lsrs r7, %[b], #16\n\t"
  5084. #else
  5085. "lsr r7, %[b], #16\n\t"
  5086. #endif
  5087. #ifdef WOLFSSL_KEIL
  5088. "muls r6, r7, r6\n\t"
  5089. #elif defined(__clang__)
  5090. "muls r6, r7\n\t"
  5091. #else
  5092. "mul r6, r7\n\t"
  5093. #endif
  5094. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5095. "lsrs r7, r6, #16\n\t"
  5096. #else
  5097. "lsr r7, r6, #16\n\t"
  5098. #endif
  5099. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5100. "lsls r6, r6, #16\n\t"
  5101. #else
  5102. "lsl r6, r6, #16\n\t"
  5103. #endif
  5104. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5105. "adds r4, r4, r6\n\t"
  5106. #else
  5107. "add r4, r4, r6\n\t"
  5108. #endif
  5109. #ifdef WOLFSSL_KEIL
  5110. "adcs r5, r5, r7\n\t"
  5111. #elif defined(__clang__)
  5112. "adcs r5, r7\n\t"
  5113. #else
  5114. "adc r5, r7\n\t"
  5115. #endif
  5116. #ifdef WOLFSSL_KEIL
  5117. "adcs r3, r3, %[r]\n\t"
  5118. #elif defined(__clang__)
  5119. "adcs r3, %[r]\n\t"
  5120. #else
  5121. "adc r3, %[r]\n\t"
  5122. #endif
  5123. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5124. "lsrs r6, %[a], #16\n\t"
  5125. #else
  5126. "lsr r6, %[a], #16\n\t"
  5127. #endif
  5128. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5129. "lsrs r7, %[b], #16\n\t"
  5130. #else
  5131. "lsr r7, %[b], #16\n\t"
  5132. #endif
  5133. #ifdef WOLFSSL_KEIL
  5134. "muls r7, r6, r7\n\t"
  5135. #elif defined(__clang__)
  5136. "muls r7, r6\n\t"
  5137. #else
  5138. "mul r7, r6\n\t"
  5139. #endif
  5140. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5141. "adds r5, r5, r7\n\t"
  5142. #else
  5143. "add r5, r5, r7\n\t"
  5144. #endif
  5145. #ifdef WOLFSSL_KEIL
  5146. "adcs r3, r3, %[r]\n\t"
  5147. #elif defined(__clang__)
  5148. "adcs r3, %[r]\n\t"
  5149. #else
  5150. "adc r3, %[r]\n\t"
  5151. #endif
  5152. "uxth r7, %[b]\n\t"
  5153. #ifdef WOLFSSL_KEIL
  5154. "muls r6, r7, r6\n\t"
  5155. #elif defined(__clang__)
  5156. "muls r6, r7\n\t"
  5157. #else
  5158. "mul r6, r7\n\t"
  5159. #endif
  5160. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5161. "lsrs r7, r6, #16\n\t"
  5162. #else
  5163. "lsr r7, r6, #16\n\t"
  5164. #endif
  5165. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5166. "lsls r6, r6, #16\n\t"
  5167. #else
  5168. "lsl r6, r6, #16\n\t"
  5169. #endif
  5170. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5171. "adds r4, r4, r6\n\t"
  5172. #else
  5173. "add r4, r4, r6\n\t"
  5174. #endif
  5175. #ifdef WOLFSSL_KEIL
  5176. "adcs r5, r5, r7\n\t"
  5177. #elif defined(__clang__)
  5178. "adcs r5, r7\n\t"
  5179. #else
  5180. "adc r5, r7\n\t"
  5181. #endif
  5182. #ifdef WOLFSSL_KEIL
  5183. "adcs r3, r3, %[r]\n\t"
  5184. #elif defined(__clang__)
  5185. "adcs r3, %[r]\n\t"
  5186. #else
  5187. "adc r3, %[r]\n\t"
  5188. #endif
  5189. "# A[6] * B[1]\n\t"
  5190. "mov %[a], r9\n\t"
  5191. "mov %[b], r10\n\t"
  5192. "ldr %[a], [%[a], #24]\n\t"
  5193. "ldr %[b], [%[b], #4]\n\t"
  5194. "uxth r6, %[a]\n\t"
  5195. "uxth r7, %[b]\n\t"
  5196. #ifdef WOLFSSL_KEIL
  5197. "muls r7, r6, r7\n\t"
  5198. #elif defined(__clang__)
  5199. "muls r7, r6\n\t"
  5200. #else
  5201. "mul r7, r6\n\t"
  5202. #endif
  5203. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5204. "adds r4, r4, r7\n\t"
  5205. #else
  5206. "add r4, r4, r7\n\t"
  5207. #endif
  5208. #ifdef WOLFSSL_KEIL
  5209. "adcs r5, r5, %[r]\n\t"
  5210. #elif defined(__clang__)
  5211. "adcs r5, %[r]\n\t"
  5212. #else
  5213. "adc r5, %[r]\n\t"
  5214. #endif
  5215. #ifdef WOLFSSL_KEIL
  5216. "adcs r3, r3, %[r]\n\t"
  5217. #elif defined(__clang__)
  5218. "adcs r3, %[r]\n\t"
  5219. #else
  5220. "adc r3, %[r]\n\t"
  5221. #endif
  5222. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5223. "lsrs r7, %[b], #16\n\t"
  5224. #else
  5225. "lsr r7, %[b], #16\n\t"
  5226. #endif
  5227. #ifdef WOLFSSL_KEIL
  5228. "muls r6, r7, r6\n\t"
  5229. #elif defined(__clang__)
  5230. "muls r6, r7\n\t"
  5231. #else
  5232. "mul r6, r7\n\t"
  5233. #endif
  5234. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5235. "lsrs r7, r6, #16\n\t"
  5236. #else
  5237. "lsr r7, r6, #16\n\t"
  5238. #endif
  5239. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5240. "lsls r6, r6, #16\n\t"
  5241. #else
  5242. "lsl r6, r6, #16\n\t"
  5243. #endif
  5244. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5245. "adds r4, r4, r6\n\t"
  5246. #else
  5247. "add r4, r4, r6\n\t"
  5248. #endif
  5249. #ifdef WOLFSSL_KEIL
  5250. "adcs r5, r5, r7\n\t"
  5251. #elif defined(__clang__)
  5252. "adcs r5, r7\n\t"
  5253. #else
  5254. "adc r5, r7\n\t"
  5255. #endif
  5256. #ifdef WOLFSSL_KEIL
  5257. "adcs r3, r3, %[r]\n\t"
  5258. #elif defined(__clang__)
  5259. "adcs r3, %[r]\n\t"
  5260. #else
  5261. "adc r3, %[r]\n\t"
  5262. #endif
  5263. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5264. "lsrs r6, %[a], #16\n\t"
  5265. #else
  5266. "lsr r6, %[a], #16\n\t"
  5267. #endif
  5268. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5269. "lsrs r7, %[b], #16\n\t"
  5270. #else
  5271. "lsr r7, %[b], #16\n\t"
  5272. #endif
  5273. #ifdef WOLFSSL_KEIL
  5274. "muls r7, r6, r7\n\t"
  5275. #elif defined(__clang__)
  5276. "muls r7, r6\n\t"
  5277. #else
  5278. "mul r7, r6\n\t"
  5279. #endif
  5280. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5281. "adds r5, r5, r7\n\t"
  5282. #else
  5283. "add r5, r5, r7\n\t"
  5284. #endif
  5285. #ifdef WOLFSSL_KEIL
  5286. "adcs r3, r3, %[r]\n\t"
  5287. #elif defined(__clang__)
  5288. "adcs r3, %[r]\n\t"
  5289. #else
  5290. "adc r3, %[r]\n\t"
  5291. #endif
  5292. "uxth r7, %[b]\n\t"
  5293. #ifdef WOLFSSL_KEIL
  5294. "muls r6, r7, r6\n\t"
  5295. #elif defined(__clang__)
  5296. "muls r6, r7\n\t"
  5297. #else
  5298. "mul r6, r7\n\t"
  5299. #endif
  5300. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5301. "lsrs r7, r6, #16\n\t"
  5302. #else
  5303. "lsr r7, r6, #16\n\t"
  5304. #endif
  5305. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5306. "lsls r6, r6, #16\n\t"
  5307. #else
  5308. "lsl r6, r6, #16\n\t"
  5309. #endif
  5310. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5311. "adds r4, r4, r6\n\t"
  5312. #else
  5313. "add r4, r4, r6\n\t"
  5314. #endif
  5315. #ifdef WOLFSSL_KEIL
  5316. "adcs r5, r5, r7\n\t"
  5317. #elif defined(__clang__)
  5318. "adcs r5, r7\n\t"
  5319. #else
  5320. "adc r5, r7\n\t"
  5321. #endif
  5322. #ifdef WOLFSSL_KEIL
  5323. "adcs r3, r3, %[r]\n\t"
  5324. #elif defined(__clang__)
  5325. "adcs r3, %[r]\n\t"
  5326. #else
  5327. "adc r3, %[r]\n\t"
  5328. #endif
  5329. "# A[7] * B[0]\n\t"
  5330. "mov %[a], r9\n\t"
  5331. "mov %[b], r10\n\t"
  5332. "ldr %[a], [%[a], #28]\n\t"
  5333. "ldr %[b], [%[b]]\n\t"
  5334. "uxth r6, %[a]\n\t"
  5335. "uxth r7, %[b]\n\t"
  5336. #ifdef WOLFSSL_KEIL
  5337. "muls r7, r6, r7\n\t"
  5338. #elif defined(__clang__)
  5339. "muls r7, r6\n\t"
  5340. #else
  5341. "mul r7, r6\n\t"
  5342. #endif
  5343. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5344. "adds r4, r4, r7\n\t"
  5345. #else
  5346. "add r4, r4, r7\n\t"
  5347. #endif
  5348. #ifdef WOLFSSL_KEIL
  5349. "adcs r5, r5, %[r]\n\t"
  5350. #elif defined(__clang__)
  5351. "adcs r5, %[r]\n\t"
  5352. #else
  5353. "adc r5, %[r]\n\t"
  5354. #endif
  5355. #ifdef WOLFSSL_KEIL
  5356. "adcs r3, r3, %[r]\n\t"
  5357. #elif defined(__clang__)
  5358. "adcs r3, %[r]\n\t"
  5359. #else
  5360. "adc r3, %[r]\n\t"
  5361. #endif
  5362. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5363. "lsrs r7, %[b], #16\n\t"
  5364. #else
  5365. "lsr r7, %[b], #16\n\t"
  5366. #endif
  5367. #ifdef WOLFSSL_KEIL
  5368. "muls r6, r7, r6\n\t"
  5369. #elif defined(__clang__)
  5370. "muls r6, r7\n\t"
  5371. #else
  5372. "mul r6, r7\n\t"
  5373. #endif
  5374. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5375. "lsrs r7, r6, #16\n\t"
  5376. #else
  5377. "lsr r7, r6, #16\n\t"
  5378. #endif
  5379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5380. "lsls r6, r6, #16\n\t"
  5381. #else
  5382. "lsl r6, r6, #16\n\t"
  5383. #endif
  5384. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5385. "adds r4, r4, r6\n\t"
  5386. #else
  5387. "add r4, r4, r6\n\t"
  5388. #endif
  5389. #ifdef WOLFSSL_KEIL
  5390. "adcs r5, r5, r7\n\t"
  5391. #elif defined(__clang__)
  5392. "adcs r5, r7\n\t"
  5393. #else
  5394. "adc r5, r7\n\t"
  5395. #endif
  5396. #ifdef WOLFSSL_KEIL
  5397. "adcs r3, r3, %[r]\n\t"
  5398. #elif defined(__clang__)
  5399. "adcs r3, %[r]\n\t"
  5400. #else
  5401. "adc r3, %[r]\n\t"
  5402. #endif
  5403. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5404. "lsrs r6, %[a], #16\n\t"
  5405. #else
  5406. "lsr r6, %[a], #16\n\t"
  5407. #endif
  5408. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5409. "lsrs r7, %[b], #16\n\t"
  5410. #else
  5411. "lsr r7, %[b], #16\n\t"
  5412. #endif
  5413. #ifdef WOLFSSL_KEIL
  5414. "muls r7, r6, r7\n\t"
  5415. #elif defined(__clang__)
  5416. "muls r7, r6\n\t"
  5417. #else
  5418. "mul r7, r6\n\t"
  5419. #endif
  5420. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5421. "adds r5, r5, r7\n\t"
  5422. #else
  5423. "add r5, r5, r7\n\t"
  5424. #endif
  5425. #ifdef WOLFSSL_KEIL
  5426. "adcs r3, r3, %[r]\n\t"
  5427. #elif defined(__clang__)
  5428. "adcs r3, %[r]\n\t"
  5429. #else
  5430. "adc r3, %[r]\n\t"
  5431. #endif
  5432. "uxth r7, %[b]\n\t"
  5433. #ifdef WOLFSSL_KEIL
  5434. "muls r6, r7, r6\n\t"
  5435. #elif defined(__clang__)
  5436. "muls r6, r7\n\t"
  5437. #else
  5438. "mul r6, r7\n\t"
  5439. #endif
  5440. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5441. "lsrs r7, r6, #16\n\t"
  5442. #else
  5443. "lsr r7, r6, #16\n\t"
  5444. #endif
  5445. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5446. "lsls r6, r6, #16\n\t"
  5447. #else
  5448. "lsl r6, r6, #16\n\t"
  5449. #endif
  5450. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5451. "adds r4, r4, r6\n\t"
  5452. #else
  5453. "add r4, r4, r6\n\t"
  5454. #endif
  5455. #ifdef WOLFSSL_KEIL
  5456. "adcs r5, r5, r7\n\t"
  5457. #elif defined(__clang__)
  5458. "adcs r5, r7\n\t"
  5459. #else
  5460. "adc r5, r7\n\t"
  5461. #endif
  5462. #ifdef WOLFSSL_KEIL
  5463. "adcs r3, r3, %[r]\n\t"
  5464. #elif defined(__clang__)
  5465. "adcs r3, %[r]\n\t"
  5466. #else
  5467. "adc r3, %[r]\n\t"
  5468. #endif
  5469. "str r4, [sp, #28]\n\t"
  5470. "# A[7] * B[1]\n\t"
  5471. "movs r4, #0\n\t"
  5472. "mov %[a], r9\n\t"
  5473. "mov %[b], r10\n\t"
  5474. "ldr %[a], [%[a], #28]\n\t"
  5475. "ldr %[b], [%[b], #4]\n\t"
  5476. "uxth r6, %[a]\n\t"
  5477. "uxth r7, %[b]\n\t"
  5478. #ifdef WOLFSSL_KEIL
  5479. "muls r7, r6, r7\n\t"
  5480. #elif defined(__clang__)
  5481. "muls r7, r6\n\t"
  5482. #else
  5483. "mul r7, r6\n\t"
  5484. #endif
  5485. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5486. "adds r5, r5, r7\n\t"
  5487. #else
  5488. "add r5, r5, r7\n\t"
  5489. #endif
  5490. #ifdef WOLFSSL_KEIL
  5491. "adcs r3, r3, %[r]\n\t"
  5492. #elif defined(__clang__)
  5493. "adcs r3, %[r]\n\t"
  5494. #else
  5495. "adc r3, %[r]\n\t"
  5496. #endif
  5497. #ifdef WOLFSSL_KEIL
  5498. "adcs r4, r4, %[r]\n\t"
  5499. #elif defined(__clang__)
  5500. "adcs r4, %[r]\n\t"
  5501. #else
  5502. "adc r4, %[r]\n\t"
  5503. #endif
  5504. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5505. "lsrs r7, %[b], #16\n\t"
  5506. #else
  5507. "lsr r7, %[b], #16\n\t"
  5508. #endif
  5509. #ifdef WOLFSSL_KEIL
  5510. "muls r6, r7, r6\n\t"
  5511. #elif defined(__clang__)
  5512. "muls r6, r7\n\t"
  5513. #else
  5514. "mul r6, r7\n\t"
  5515. #endif
  5516. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5517. "lsrs r7, r6, #16\n\t"
  5518. #else
  5519. "lsr r7, r6, #16\n\t"
  5520. #endif
  5521. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5522. "lsls r6, r6, #16\n\t"
  5523. #else
  5524. "lsl r6, r6, #16\n\t"
  5525. #endif
  5526. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5527. "adds r5, r5, r6\n\t"
  5528. #else
  5529. "add r5, r5, r6\n\t"
  5530. #endif
  5531. #ifdef WOLFSSL_KEIL
  5532. "adcs r3, r3, r7\n\t"
  5533. #elif defined(__clang__)
  5534. "adcs r3, r7\n\t"
  5535. #else
  5536. "adc r3, r7\n\t"
  5537. #endif
  5538. #ifdef WOLFSSL_KEIL
  5539. "adcs r4, r4, %[r]\n\t"
  5540. #elif defined(__clang__)
  5541. "adcs r4, %[r]\n\t"
  5542. #else
  5543. "adc r4, %[r]\n\t"
  5544. #endif
  5545. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5546. "lsrs r6, %[a], #16\n\t"
  5547. #else
  5548. "lsr r6, %[a], #16\n\t"
  5549. #endif
  5550. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5551. "lsrs r7, %[b], #16\n\t"
  5552. #else
  5553. "lsr r7, %[b], #16\n\t"
  5554. #endif
  5555. #ifdef WOLFSSL_KEIL
  5556. "muls r7, r6, r7\n\t"
  5557. #elif defined(__clang__)
  5558. "muls r7, r6\n\t"
  5559. #else
  5560. "mul r7, r6\n\t"
  5561. #endif
  5562. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5563. "adds r3, r3, r7\n\t"
  5564. #else
  5565. "add r3, r3, r7\n\t"
  5566. #endif
  5567. #ifdef WOLFSSL_KEIL
  5568. "adcs r4, r4, %[r]\n\t"
  5569. #elif defined(__clang__)
  5570. "adcs r4, %[r]\n\t"
  5571. #else
  5572. "adc r4, %[r]\n\t"
  5573. #endif
  5574. "uxth r7, %[b]\n\t"
  5575. #ifdef WOLFSSL_KEIL
  5576. "muls r6, r7, r6\n\t"
  5577. #elif defined(__clang__)
  5578. "muls r6, r7\n\t"
  5579. #else
  5580. "mul r6, r7\n\t"
  5581. #endif
  5582. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5583. "lsrs r7, r6, #16\n\t"
  5584. #else
  5585. "lsr r7, r6, #16\n\t"
  5586. #endif
  5587. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5588. "lsls r6, r6, #16\n\t"
  5589. #else
  5590. "lsl r6, r6, #16\n\t"
  5591. #endif
  5592. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5593. "adds r5, r5, r6\n\t"
  5594. #else
  5595. "add r5, r5, r6\n\t"
  5596. #endif
  5597. #ifdef WOLFSSL_KEIL
  5598. "adcs r3, r3, r7\n\t"
  5599. #elif defined(__clang__)
  5600. "adcs r3, r7\n\t"
  5601. #else
  5602. "adc r3, r7\n\t"
  5603. #endif
  5604. #ifdef WOLFSSL_KEIL
  5605. "adcs r4, r4, %[r]\n\t"
  5606. #elif defined(__clang__)
  5607. "adcs r4, %[r]\n\t"
  5608. #else
  5609. "adc r4, %[r]\n\t"
  5610. #endif
  5611. "# A[6] * B[2]\n\t"
  5612. "mov %[a], r9\n\t"
  5613. "mov %[b], r10\n\t"
  5614. "ldr %[a], [%[a], #24]\n\t"
  5615. "ldr %[b], [%[b], #8]\n\t"
  5616. "uxth r6, %[a]\n\t"
  5617. "uxth r7, %[b]\n\t"
  5618. #ifdef WOLFSSL_KEIL
  5619. "muls r7, r6, r7\n\t"
  5620. #elif defined(__clang__)
  5621. "muls r7, r6\n\t"
  5622. #else
  5623. "mul r7, r6\n\t"
  5624. #endif
  5625. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5626. "adds r5, r5, r7\n\t"
  5627. #else
  5628. "add r5, r5, r7\n\t"
  5629. #endif
  5630. #ifdef WOLFSSL_KEIL
  5631. "adcs r3, r3, %[r]\n\t"
  5632. #elif defined(__clang__)
  5633. "adcs r3, %[r]\n\t"
  5634. #else
  5635. "adc r3, %[r]\n\t"
  5636. #endif
  5637. #ifdef WOLFSSL_KEIL
  5638. "adcs r4, r4, %[r]\n\t"
  5639. #elif defined(__clang__)
  5640. "adcs r4, %[r]\n\t"
  5641. #else
  5642. "adc r4, %[r]\n\t"
  5643. #endif
  5644. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5645. "lsrs r7, %[b], #16\n\t"
  5646. #else
  5647. "lsr r7, %[b], #16\n\t"
  5648. #endif
  5649. #ifdef WOLFSSL_KEIL
  5650. "muls r6, r7, r6\n\t"
  5651. #elif defined(__clang__)
  5652. "muls r6, r7\n\t"
  5653. #else
  5654. "mul r6, r7\n\t"
  5655. #endif
  5656. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5657. "lsrs r7, r6, #16\n\t"
  5658. #else
  5659. "lsr r7, r6, #16\n\t"
  5660. #endif
  5661. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5662. "lsls r6, r6, #16\n\t"
  5663. #else
  5664. "lsl r6, r6, #16\n\t"
  5665. #endif
  5666. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5667. "adds r5, r5, r6\n\t"
  5668. #else
  5669. "add r5, r5, r6\n\t"
  5670. #endif
  5671. #ifdef WOLFSSL_KEIL
  5672. "adcs r3, r3, r7\n\t"
  5673. #elif defined(__clang__)
  5674. "adcs r3, r7\n\t"
  5675. #else
  5676. "adc r3, r7\n\t"
  5677. #endif
  5678. #ifdef WOLFSSL_KEIL
  5679. "adcs r4, r4, %[r]\n\t"
  5680. #elif defined(__clang__)
  5681. "adcs r4, %[r]\n\t"
  5682. #else
  5683. "adc r4, %[r]\n\t"
  5684. #endif
  5685. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5686. "lsrs r6, %[a], #16\n\t"
  5687. #else
  5688. "lsr r6, %[a], #16\n\t"
  5689. #endif
  5690. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5691. "lsrs r7, %[b], #16\n\t"
  5692. #else
  5693. "lsr r7, %[b], #16\n\t"
  5694. #endif
  5695. #ifdef WOLFSSL_KEIL
  5696. "muls r7, r6, r7\n\t"
  5697. #elif defined(__clang__)
  5698. "muls r7, r6\n\t"
  5699. #else
  5700. "mul r7, r6\n\t"
  5701. #endif
  5702. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5703. "adds r3, r3, r7\n\t"
  5704. #else
  5705. "add r3, r3, r7\n\t"
  5706. #endif
  5707. #ifdef WOLFSSL_KEIL
  5708. "adcs r4, r4, %[r]\n\t"
  5709. #elif defined(__clang__)
  5710. "adcs r4, %[r]\n\t"
  5711. #else
  5712. "adc r4, %[r]\n\t"
  5713. #endif
  5714. "uxth r7, %[b]\n\t"
  5715. #ifdef WOLFSSL_KEIL
  5716. "muls r6, r7, r6\n\t"
  5717. #elif defined(__clang__)
  5718. "muls r6, r7\n\t"
  5719. #else
  5720. "mul r6, r7\n\t"
  5721. #endif
  5722. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5723. "lsrs r7, r6, #16\n\t"
  5724. #else
  5725. "lsr r7, r6, #16\n\t"
  5726. #endif
  5727. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5728. "lsls r6, r6, #16\n\t"
  5729. #else
  5730. "lsl r6, r6, #16\n\t"
  5731. #endif
  5732. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5733. "adds r5, r5, r6\n\t"
  5734. #else
  5735. "add r5, r5, r6\n\t"
  5736. #endif
  5737. #ifdef WOLFSSL_KEIL
  5738. "adcs r3, r3, r7\n\t"
  5739. #elif defined(__clang__)
  5740. "adcs r3, r7\n\t"
  5741. #else
  5742. "adc r3, r7\n\t"
  5743. #endif
  5744. #ifdef WOLFSSL_KEIL
  5745. "adcs r4, r4, %[r]\n\t"
  5746. #elif defined(__clang__)
  5747. "adcs r4, %[r]\n\t"
  5748. #else
  5749. "adc r4, %[r]\n\t"
  5750. #endif
  5751. "# A[5] * B[3]\n\t"
  5752. "mov %[a], r9\n\t"
  5753. "mov %[b], r10\n\t"
  5754. "ldr %[a], [%[a], #20]\n\t"
  5755. "ldr %[b], [%[b], #12]\n\t"
  5756. "uxth r6, %[a]\n\t"
  5757. "uxth r7, %[b]\n\t"
  5758. #ifdef WOLFSSL_KEIL
  5759. "muls r7, r6, r7\n\t"
  5760. #elif defined(__clang__)
  5761. "muls r7, r6\n\t"
  5762. #else
  5763. "mul r7, r6\n\t"
  5764. #endif
  5765. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5766. "adds r5, r5, r7\n\t"
  5767. #else
  5768. "add r5, r5, r7\n\t"
  5769. #endif
  5770. #ifdef WOLFSSL_KEIL
  5771. "adcs r3, r3, %[r]\n\t"
  5772. #elif defined(__clang__)
  5773. "adcs r3, %[r]\n\t"
  5774. #else
  5775. "adc r3, %[r]\n\t"
  5776. #endif
  5777. #ifdef WOLFSSL_KEIL
  5778. "adcs r4, r4, %[r]\n\t"
  5779. #elif defined(__clang__)
  5780. "adcs r4, %[r]\n\t"
  5781. #else
  5782. "adc r4, %[r]\n\t"
  5783. #endif
  5784. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5785. "lsrs r7, %[b], #16\n\t"
  5786. #else
  5787. "lsr r7, %[b], #16\n\t"
  5788. #endif
  5789. #ifdef WOLFSSL_KEIL
  5790. "muls r6, r7, r6\n\t"
  5791. #elif defined(__clang__)
  5792. "muls r6, r7\n\t"
  5793. #else
  5794. "mul r6, r7\n\t"
  5795. #endif
  5796. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5797. "lsrs r7, r6, #16\n\t"
  5798. #else
  5799. "lsr r7, r6, #16\n\t"
  5800. #endif
  5801. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5802. "lsls r6, r6, #16\n\t"
  5803. #else
  5804. "lsl r6, r6, #16\n\t"
  5805. #endif
  5806. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5807. "adds r5, r5, r6\n\t"
  5808. #else
  5809. "add r5, r5, r6\n\t"
  5810. #endif
  5811. #ifdef WOLFSSL_KEIL
  5812. "adcs r3, r3, r7\n\t"
  5813. #elif defined(__clang__)
  5814. "adcs r3, r7\n\t"
  5815. #else
  5816. "adc r3, r7\n\t"
  5817. #endif
  5818. #ifdef WOLFSSL_KEIL
  5819. "adcs r4, r4, %[r]\n\t"
  5820. #elif defined(__clang__)
  5821. "adcs r4, %[r]\n\t"
  5822. #else
  5823. "adc r4, %[r]\n\t"
  5824. #endif
  5825. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5826. "lsrs r6, %[a], #16\n\t"
  5827. #else
  5828. "lsr r6, %[a], #16\n\t"
  5829. #endif
  5830. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5831. "lsrs r7, %[b], #16\n\t"
  5832. #else
  5833. "lsr r7, %[b], #16\n\t"
  5834. #endif
  5835. #ifdef WOLFSSL_KEIL
  5836. "muls r7, r6, r7\n\t"
  5837. #elif defined(__clang__)
  5838. "muls r7, r6\n\t"
  5839. #else
  5840. "mul r7, r6\n\t"
  5841. #endif
  5842. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5843. "adds r3, r3, r7\n\t"
  5844. #else
  5845. "add r3, r3, r7\n\t"
  5846. #endif
  5847. #ifdef WOLFSSL_KEIL
  5848. "adcs r4, r4, %[r]\n\t"
  5849. #elif defined(__clang__)
  5850. "adcs r4, %[r]\n\t"
  5851. #else
  5852. "adc r4, %[r]\n\t"
  5853. #endif
  5854. "uxth r7, %[b]\n\t"
  5855. #ifdef WOLFSSL_KEIL
  5856. "muls r6, r7, r6\n\t"
  5857. #elif defined(__clang__)
  5858. "muls r6, r7\n\t"
  5859. #else
  5860. "mul r6, r7\n\t"
  5861. #endif
  5862. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5863. "lsrs r7, r6, #16\n\t"
  5864. #else
  5865. "lsr r7, r6, #16\n\t"
  5866. #endif
  5867. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5868. "lsls r6, r6, #16\n\t"
  5869. #else
  5870. "lsl r6, r6, #16\n\t"
  5871. #endif
  5872. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5873. "adds r5, r5, r6\n\t"
  5874. #else
  5875. "add r5, r5, r6\n\t"
  5876. #endif
  5877. #ifdef WOLFSSL_KEIL
  5878. "adcs r3, r3, r7\n\t"
  5879. #elif defined(__clang__)
  5880. "adcs r3, r7\n\t"
  5881. #else
  5882. "adc r3, r7\n\t"
  5883. #endif
  5884. #ifdef WOLFSSL_KEIL
  5885. "adcs r4, r4, %[r]\n\t"
  5886. #elif defined(__clang__)
  5887. "adcs r4, %[r]\n\t"
  5888. #else
  5889. "adc r4, %[r]\n\t"
  5890. #endif
  5891. "# A[4] * B[4]\n\t"
  5892. "mov %[a], r9\n\t"
  5893. "mov %[b], r10\n\t"
  5894. "ldr %[a], [%[a], #16]\n\t"
  5895. "ldr %[b], [%[b], #16]\n\t"
  5896. "uxth r6, %[a]\n\t"
  5897. "uxth r7, %[b]\n\t"
  5898. #ifdef WOLFSSL_KEIL
  5899. "muls r7, r6, r7\n\t"
  5900. #elif defined(__clang__)
  5901. "muls r7, r6\n\t"
  5902. #else
  5903. "mul r7, r6\n\t"
  5904. #endif
  5905. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5906. "adds r5, r5, r7\n\t"
  5907. #else
  5908. "add r5, r5, r7\n\t"
  5909. #endif
  5910. #ifdef WOLFSSL_KEIL
  5911. "adcs r3, r3, %[r]\n\t"
  5912. #elif defined(__clang__)
  5913. "adcs r3, %[r]\n\t"
  5914. #else
  5915. "adc r3, %[r]\n\t"
  5916. #endif
  5917. #ifdef WOLFSSL_KEIL
  5918. "adcs r4, r4, %[r]\n\t"
  5919. #elif defined(__clang__)
  5920. "adcs r4, %[r]\n\t"
  5921. #else
  5922. "adc r4, %[r]\n\t"
  5923. #endif
  5924. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5925. "lsrs r7, %[b], #16\n\t"
  5926. #else
  5927. "lsr r7, %[b], #16\n\t"
  5928. #endif
  5929. #ifdef WOLFSSL_KEIL
  5930. "muls r6, r7, r6\n\t"
  5931. #elif defined(__clang__)
  5932. "muls r6, r7\n\t"
  5933. #else
  5934. "mul r6, r7\n\t"
  5935. #endif
  5936. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5937. "lsrs r7, r6, #16\n\t"
  5938. #else
  5939. "lsr r7, r6, #16\n\t"
  5940. #endif
  5941. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5942. "lsls r6, r6, #16\n\t"
  5943. #else
  5944. "lsl r6, r6, #16\n\t"
  5945. #endif
  5946. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5947. "adds r5, r5, r6\n\t"
  5948. #else
  5949. "add r5, r5, r6\n\t"
  5950. #endif
  5951. #ifdef WOLFSSL_KEIL
  5952. "adcs r3, r3, r7\n\t"
  5953. #elif defined(__clang__)
  5954. "adcs r3, r7\n\t"
  5955. #else
  5956. "adc r3, r7\n\t"
  5957. #endif
  5958. #ifdef WOLFSSL_KEIL
  5959. "adcs r4, r4, %[r]\n\t"
  5960. #elif defined(__clang__)
  5961. "adcs r4, %[r]\n\t"
  5962. #else
  5963. "adc r4, %[r]\n\t"
  5964. #endif
  5965. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5966. "lsrs r6, %[a], #16\n\t"
  5967. #else
  5968. "lsr r6, %[a], #16\n\t"
  5969. #endif
  5970. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5971. "lsrs r7, %[b], #16\n\t"
  5972. #else
  5973. "lsr r7, %[b], #16\n\t"
  5974. #endif
  5975. #ifdef WOLFSSL_KEIL
  5976. "muls r7, r6, r7\n\t"
  5977. #elif defined(__clang__)
  5978. "muls r7, r6\n\t"
  5979. #else
  5980. "mul r7, r6\n\t"
  5981. #endif
  5982. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5983. "adds r3, r3, r7\n\t"
  5984. #else
  5985. "add r3, r3, r7\n\t"
  5986. #endif
  5987. #ifdef WOLFSSL_KEIL
  5988. "adcs r4, r4, %[r]\n\t"
  5989. #elif defined(__clang__)
  5990. "adcs r4, %[r]\n\t"
  5991. #else
  5992. "adc r4, %[r]\n\t"
  5993. #endif
  5994. "uxth r7, %[b]\n\t"
  5995. #ifdef WOLFSSL_KEIL
  5996. "muls r6, r7, r6\n\t"
  5997. #elif defined(__clang__)
  5998. "muls r6, r7\n\t"
  5999. #else
  6000. "mul r6, r7\n\t"
  6001. #endif
  6002. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6003. "lsrs r7, r6, #16\n\t"
  6004. #else
  6005. "lsr r7, r6, #16\n\t"
  6006. #endif
  6007. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6008. "lsls r6, r6, #16\n\t"
  6009. #else
  6010. "lsl r6, r6, #16\n\t"
  6011. #endif
  6012. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6013. "adds r5, r5, r6\n\t"
  6014. #else
  6015. "add r5, r5, r6\n\t"
  6016. #endif
  6017. #ifdef WOLFSSL_KEIL
  6018. "adcs r3, r3, r7\n\t"
  6019. #elif defined(__clang__)
  6020. "adcs r3, r7\n\t"
  6021. #else
  6022. "adc r3, r7\n\t"
  6023. #endif
  6024. #ifdef WOLFSSL_KEIL
  6025. "adcs r4, r4, %[r]\n\t"
  6026. #elif defined(__clang__)
  6027. "adcs r4, %[r]\n\t"
  6028. #else
  6029. "adc r4, %[r]\n\t"
  6030. #endif
  6031. "# A[3] * B[5]\n\t"
  6032. "mov %[a], r9\n\t"
  6033. "mov %[b], r10\n\t"
  6034. "ldr %[a], [%[a], #12]\n\t"
  6035. "ldr %[b], [%[b], #20]\n\t"
  6036. "uxth r6, %[a]\n\t"
  6037. "uxth r7, %[b]\n\t"
  6038. #ifdef WOLFSSL_KEIL
  6039. "muls r7, r6, r7\n\t"
  6040. #elif defined(__clang__)
  6041. "muls r7, r6\n\t"
  6042. #else
  6043. "mul r7, r6\n\t"
  6044. #endif
  6045. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6046. "adds r5, r5, r7\n\t"
  6047. #else
  6048. "add r5, r5, r7\n\t"
  6049. #endif
  6050. #ifdef WOLFSSL_KEIL
  6051. "adcs r3, r3, %[r]\n\t"
  6052. #elif defined(__clang__)
  6053. "adcs r3, %[r]\n\t"
  6054. #else
  6055. "adc r3, %[r]\n\t"
  6056. #endif
  6057. #ifdef WOLFSSL_KEIL
  6058. "adcs r4, r4, %[r]\n\t"
  6059. #elif defined(__clang__)
  6060. "adcs r4, %[r]\n\t"
  6061. #else
  6062. "adc r4, %[r]\n\t"
  6063. #endif
  6064. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6065. "lsrs r7, %[b], #16\n\t"
  6066. #else
  6067. "lsr r7, %[b], #16\n\t"
  6068. #endif
  6069. #ifdef WOLFSSL_KEIL
  6070. "muls r6, r7, r6\n\t"
  6071. #elif defined(__clang__)
  6072. "muls r6, r7\n\t"
  6073. #else
  6074. "mul r6, r7\n\t"
  6075. #endif
  6076. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6077. "lsrs r7, r6, #16\n\t"
  6078. #else
  6079. "lsr r7, r6, #16\n\t"
  6080. #endif
  6081. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6082. "lsls r6, r6, #16\n\t"
  6083. #else
  6084. "lsl r6, r6, #16\n\t"
  6085. #endif
  6086. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6087. "adds r5, r5, r6\n\t"
  6088. #else
  6089. "add r5, r5, r6\n\t"
  6090. #endif
  6091. #ifdef WOLFSSL_KEIL
  6092. "adcs r3, r3, r7\n\t"
  6093. #elif defined(__clang__)
  6094. "adcs r3, r7\n\t"
  6095. #else
  6096. "adc r3, r7\n\t"
  6097. #endif
  6098. #ifdef WOLFSSL_KEIL
  6099. "adcs r4, r4, %[r]\n\t"
  6100. #elif defined(__clang__)
  6101. "adcs r4, %[r]\n\t"
  6102. #else
  6103. "adc r4, %[r]\n\t"
  6104. #endif
  6105. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6106. "lsrs r6, %[a], #16\n\t"
  6107. #else
  6108. "lsr r6, %[a], #16\n\t"
  6109. #endif
  6110. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6111. "lsrs r7, %[b], #16\n\t"
  6112. #else
  6113. "lsr r7, %[b], #16\n\t"
  6114. #endif
  6115. #ifdef WOLFSSL_KEIL
  6116. "muls r7, r6, r7\n\t"
  6117. #elif defined(__clang__)
  6118. "muls r7, r6\n\t"
  6119. #else
  6120. "mul r7, r6\n\t"
  6121. #endif
  6122. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6123. "adds r3, r3, r7\n\t"
  6124. #else
  6125. "add r3, r3, r7\n\t"
  6126. #endif
  6127. #ifdef WOLFSSL_KEIL
  6128. "adcs r4, r4, %[r]\n\t"
  6129. #elif defined(__clang__)
  6130. "adcs r4, %[r]\n\t"
  6131. #else
  6132. "adc r4, %[r]\n\t"
  6133. #endif
  6134. "uxth r7, %[b]\n\t"
  6135. #ifdef WOLFSSL_KEIL
  6136. "muls r6, r7, r6\n\t"
  6137. #elif defined(__clang__)
  6138. "muls r6, r7\n\t"
  6139. #else
  6140. "mul r6, r7\n\t"
  6141. #endif
  6142. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6143. "lsrs r7, r6, #16\n\t"
  6144. #else
  6145. "lsr r7, r6, #16\n\t"
  6146. #endif
  6147. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6148. "lsls r6, r6, #16\n\t"
  6149. #else
  6150. "lsl r6, r6, #16\n\t"
  6151. #endif
  6152. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6153. "adds r5, r5, r6\n\t"
  6154. #else
  6155. "add r5, r5, r6\n\t"
  6156. #endif
  6157. #ifdef WOLFSSL_KEIL
  6158. "adcs r3, r3, r7\n\t"
  6159. #elif defined(__clang__)
  6160. "adcs r3, r7\n\t"
  6161. #else
  6162. "adc r3, r7\n\t"
  6163. #endif
  6164. #ifdef WOLFSSL_KEIL
  6165. "adcs r4, r4, %[r]\n\t"
  6166. #elif defined(__clang__)
  6167. "adcs r4, %[r]\n\t"
  6168. #else
  6169. "adc r4, %[r]\n\t"
  6170. #endif
  6171. "# A[2] * B[6]\n\t"
  6172. "mov %[a], r9\n\t"
  6173. "mov %[b], r10\n\t"
  6174. "ldr %[a], [%[a], #8]\n\t"
  6175. "ldr %[b], [%[b], #24]\n\t"
  6176. "uxth r6, %[a]\n\t"
  6177. "uxth r7, %[b]\n\t"
  6178. #ifdef WOLFSSL_KEIL
  6179. "muls r7, r6, r7\n\t"
  6180. #elif defined(__clang__)
  6181. "muls r7, r6\n\t"
  6182. #else
  6183. "mul r7, r6\n\t"
  6184. #endif
  6185. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6186. "adds r5, r5, r7\n\t"
  6187. #else
  6188. "add r5, r5, r7\n\t"
  6189. #endif
  6190. #ifdef WOLFSSL_KEIL
  6191. "adcs r3, r3, %[r]\n\t"
  6192. #elif defined(__clang__)
  6193. "adcs r3, %[r]\n\t"
  6194. #else
  6195. "adc r3, %[r]\n\t"
  6196. #endif
  6197. #ifdef WOLFSSL_KEIL
  6198. "adcs r4, r4, %[r]\n\t"
  6199. #elif defined(__clang__)
  6200. "adcs r4, %[r]\n\t"
  6201. #else
  6202. "adc r4, %[r]\n\t"
  6203. #endif
  6204. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6205. "lsrs r7, %[b], #16\n\t"
  6206. #else
  6207. "lsr r7, %[b], #16\n\t"
  6208. #endif
  6209. #ifdef WOLFSSL_KEIL
  6210. "muls r6, r7, r6\n\t"
  6211. #elif defined(__clang__)
  6212. "muls r6, r7\n\t"
  6213. #else
  6214. "mul r6, r7\n\t"
  6215. #endif
  6216. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6217. "lsrs r7, r6, #16\n\t"
  6218. #else
  6219. "lsr r7, r6, #16\n\t"
  6220. #endif
  6221. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6222. "lsls r6, r6, #16\n\t"
  6223. #else
  6224. "lsl r6, r6, #16\n\t"
  6225. #endif
  6226. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6227. "adds r5, r5, r6\n\t"
  6228. #else
  6229. "add r5, r5, r6\n\t"
  6230. #endif
  6231. #ifdef WOLFSSL_KEIL
  6232. "adcs r3, r3, r7\n\t"
  6233. #elif defined(__clang__)
  6234. "adcs r3, r7\n\t"
  6235. #else
  6236. "adc r3, r7\n\t"
  6237. #endif
  6238. #ifdef WOLFSSL_KEIL
  6239. "adcs r4, r4, %[r]\n\t"
  6240. #elif defined(__clang__)
  6241. "adcs r4, %[r]\n\t"
  6242. #else
  6243. "adc r4, %[r]\n\t"
  6244. #endif
  6245. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6246. "lsrs r6, %[a], #16\n\t"
  6247. #else
  6248. "lsr r6, %[a], #16\n\t"
  6249. #endif
  6250. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6251. "lsrs r7, %[b], #16\n\t"
  6252. #else
  6253. "lsr r7, %[b], #16\n\t"
  6254. #endif
  6255. #ifdef WOLFSSL_KEIL
  6256. "muls r7, r6, r7\n\t"
  6257. #elif defined(__clang__)
  6258. "muls r7, r6\n\t"
  6259. #else
  6260. "mul r7, r6\n\t"
  6261. #endif
  6262. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6263. "adds r3, r3, r7\n\t"
  6264. #else
  6265. "add r3, r3, r7\n\t"
  6266. #endif
  6267. #ifdef WOLFSSL_KEIL
  6268. "adcs r4, r4, %[r]\n\t"
  6269. #elif defined(__clang__)
  6270. "adcs r4, %[r]\n\t"
  6271. #else
  6272. "adc r4, %[r]\n\t"
  6273. #endif
  6274. "uxth r7, %[b]\n\t"
  6275. #ifdef WOLFSSL_KEIL
  6276. "muls r6, r7, r6\n\t"
  6277. #elif defined(__clang__)
  6278. "muls r6, r7\n\t"
  6279. #else
  6280. "mul r6, r7\n\t"
  6281. #endif
  6282. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6283. "lsrs r7, r6, #16\n\t"
  6284. #else
  6285. "lsr r7, r6, #16\n\t"
  6286. #endif
  6287. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6288. "lsls r6, r6, #16\n\t"
  6289. #else
  6290. "lsl r6, r6, #16\n\t"
  6291. #endif
  6292. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6293. "adds r5, r5, r6\n\t"
  6294. #else
  6295. "add r5, r5, r6\n\t"
  6296. #endif
  6297. #ifdef WOLFSSL_KEIL
  6298. "adcs r3, r3, r7\n\t"
  6299. #elif defined(__clang__)
  6300. "adcs r3, r7\n\t"
  6301. #else
  6302. "adc r3, r7\n\t"
  6303. #endif
  6304. #ifdef WOLFSSL_KEIL
  6305. "adcs r4, r4, %[r]\n\t"
  6306. #elif defined(__clang__)
  6307. "adcs r4, %[r]\n\t"
  6308. #else
  6309. "adc r4, %[r]\n\t"
  6310. #endif
  6311. "# A[1] * B[7]\n\t"
  6312. "mov %[a], r9\n\t"
  6313. "mov %[b], r10\n\t"
  6314. "ldr %[a], [%[a], #4]\n\t"
  6315. "ldr %[b], [%[b], #28]\n\t"
  6316. "uxth r6, %[a]\n\t"
  6317. "uxth r7, %[b]\n\t"
  6318. #ifdef WOLFSSL_KEIL
  6319. "muls r7, r6, r7\n\t"
  6320. #elif defined(__clang__)
  6321. "muls r7, r6\n\t"
  6322. #else
  6323. "mul r7, r6\n\t"
  6324. #endif
  6325. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6326. "adds r5, r5, r7\n\t"
  6327. #else
  6328. "add r5, r5, r7\n\t"
  6329. #endif
  6330. #ifdef WOLFSSL_KEIL
  6331. "adcs r3, r3, %[r]\n\t"
  6332. #elif defined(__clang__)
  6333. "adcs r3, %[r]\n\t"
  6334. #else
  6335. "adc r3, %[r]\n\t"
  6336. #endif
  6337. #ifdef WOLFSSL_KEIL
  6338. "adcs r4, r4, %[r]\n\t"
  6339. #elif defined(__clang__)
  6340. "adcs r4, %[r]\n\t"
  6341. #else
  6342. "adc r4, %[r]\n\t"
  6343. #endif
  6344. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6345. "lsrs r7, %[b], #16\n\t"
  6346. #else
  6347. "lsr r7, %[b], #16\n\t"
  6348. #endif
  6349. #ifdef WOLFSSL_KEIL
  6350. "muls r6, r7, r6\n\t"
  6351. #elif defined(__clang__)
  6352. "muls r6, r7\n\t"
  6353. #else
  6354. "mul r6, r7\n\t"
  6355. #endif
  6356. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6357. "lsrs r7, r6, #16\n\t"
  6358. #else
  6359. "lsr r7, r6, #16\n\t"
  6360. #endif
  6361. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6362. "lsls r6, r6, #16\n\t"
  6363. #else
  6364. "lsl r6, r6, #16\n\t"
  6365. #endif
  6366. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6367. "adds r5, r5, r6\n\t"
  6368. #else
  6369. "add r5, r5, r6\n\t"
  6370. #endif
  6371. #ifdef WOLFSSL_KEIL
  6372. "adcs r3, r3, r7\n\t"
  6373. #elif defined(__clang__)
  6374. "adcs r3, r7\n\t"
  6375. #else
  6376. "adc r3, r7\n\t"
  6377. #endif
  6378. #ifdef WOLFSSL_KEIL
  6379. "adcs r4, r4, %[r]\n\t"
  6380. #elif defined(__clang__)
  6381. "adcs r4, %[r]\n\t"
  6382. #else
  6383. "adc r4, %[r]\n\t"
  6384. #endif
  6385. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6386. "lsrs r6, %[a], #16\n\t"
  6387. #else
  6388. "lsr r6, %[a], #16\n\t"
  6389. #endif
  6390. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6391. "lsrs r7, %[b], #16\n\t"
  6392. #else
  6393. "lsr r7, %[b], #16\n\t"
  6394. #endif
  6395. #ifdef WOLFSSL_KEIL
  6396. "muls r7, r6, r7\n\t"
  6397. #elif defined(__clang__)
  6398. "muls r7, r6\n\t"
  6399. #else
  6400. "mul r7, r6\n\t"
  6401. #endif
  6402. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6403. "adds r3, r3, r7\n\t"
  6404. #else
  6405. "add r3, r3, r7\n\t"
  6406. #endif
  6407. #ifdef WOLFSSL_KEIL
  6408. "adcs r4, r4, %[r]\n\t"
  6409. #elif defined(__clang__)
  6410. "adcs r4, %[r]\n\t"
  6411. #else
  6412. "adc r4, %[r]\n\t"
  6413. #endif
  6414. "uxth r7, %[b]\n\t"
  6415. #ifdef WOLFSSL_KEIL
  6416. "muls r6, r7, r6\n\t"
  6417. #elif defined(__clang__)
  6418. "muls r6, r7\n\t"
  6419. #else
  6420. "mul r6, r7\n\t"
  6421. #endif
  6422. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6423. "lsrs r7, r6, #16\n\t"
  6424. #else
  6425. "lsr r7, r6, #16\n\t"
  6426. #endif
  6427. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6428. "lsls r6, r6, #16\n\t"
  6429. #else
  6430. "lsl r6, r6, #16\n\t"
  6431. #endif
  6432. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6433. "adds r5, r5, r6\n\t"
  6434. #else
  6435. "add r5, r5, r6\n\t"
  6436. #endif
  6437. #ifdef WOLFSSL_KEIL
  6438. "adcs r3, r3, r7\n\t"
  6439. #elif defined(__clang__)
  6440. "adcs r3, r7\n\t"
  6441. #else
  6442. "adc r3, r7\n\t"
  6443. #endif
  6444. #ifdef WOLFSSL_KEIL
  6445. "adcs r4, r4, %[r]\n\t"
  6446. #elif defined(__clang__)
  6447. "adcs r4, %[r]\n\t"
  6448. #else
  6449. "adc r4, %[r]\n\t"
  6450. #endif
  6451. "mov %[r], r8\n\t"
  6452. "str r5, [%[r], #32]\n\t"
  6453. "movs %[r], #0\n\t"
  6454. "# A[2] * B[7]\n\t"
  6455. "movs r5, #0\n\t"
  6456. "mov %[a], r9\n\t"
  6457. "mov %[b], r10\n\t"
  6458. "ldr %[a], [%[a], #8]\n\t"
  6459. "ldr %[b], [%[b], #28]\n\t"
  6460. "uxth r6, %[a]\n\t"
  6461. "uxth r7, %[b]\n\t"
  6462. #ifdef WOLFSSL_KEIL
  6463. "muls r7, r6, r7\n\t"
  6464. #elif defined(__clang__)
  6465. "muls r7, r6\n\t"
  6466. #else
  6467. "mul r7, r6\n\t"
  6468. #endif
  6469. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6470. "adds r3, r3, r7\n\t"
  6471. #else
  6472. "add r3, r3, r7\n\t"
  6473. #endif
  6474. #ifdef WOLFSSL_KEIL
  6475. "adcs r4, r4, %[r]\n\t"
  6476. #elif defined(__clang__)
  6477. "adcs r4, %[r]\n\t"
  6478. #else
  6479. "adc r4, %[r]\n\t"
  6480. #endif
  6481. #ifdef WOLFSSL_KEIL
  6482. "adcs r5, r5, %[r]\n\t"
  6483. #elif defined(__clang__)
  6484. "adcs r5, %[r]\n\t"
  6485. #else
  6486. "adc r5, %[r]\n\t"
  6487. #endif
  6488. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6489. "lsrs r7, %[b], #16\n\t"
  6490. #else
  6491. "lsr r7, %[b], #16\n\t"
  6492. #endif
  6493. #ifdef WOLFSSL_KEIL
  6494. "muls r6, r7, r6\n\t"
  6495. #elif defined(__clang__)
  6496. "muls r6, r7\n\t"
  6497. #else
  6498. "mul r6, r7\n\t"
  6499. #endif
  6500. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6501. "lsrs r7, r6, #16\n\t"
  6502. #else
  6503. "lsr r7, r6, #16\n\t"
  6504. #endif
  6505. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6506. "lsls r6, r6, #16\n\t"
  6507. #else
  6508. "lsl r6, r6, #16\n\t"
  6509. #endif
  6510. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6511. "adds r3, r3, r6\n\t"
  6512. #else
  6513. "add r3, r3, r6\n\t"
  6514. #endif
  6515. #ifdef WOLFSSL_KEIL
  6516. "adcs r4, r4, r7\n\t"
  6517. #elif defined(__clang__)
  6518. "adcs r4, r7\n\t"
  6519. #else
  6520. "adc r4, r7\n\t"
  6521. #endif
  6522. #ifdef WOLFSSL_KEIL
  6523. "adcs r5, r5, %[r]\n\t"
  6524. #elif defined(__clang__)
  6525. "adcs r5, %[r]\n\t"
  6526. #else
  6527. "adc r5, %[r]\n\t"
  6528. #endif
  6529. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6530. "lsrs r6, %[a], #16\n\t"
  6531. #else
  6532. "lsr r6, %[a], #16\n\t"
  6533. #endif
  6534. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6535. "lsrs r7, %[b], #16\n\t"
  6536. #else
  6537. "lsr r7, %[b], #16\n\t"
  6538. #endif
  6539. #ifdef WOLFSSL_KEIL
  6540. "muls r7, r6, r7\n\t"
  6541. #elif defined(__clang__)
  6542. "muls r7, r6\n\t"
  6543. #else
  6544. "mul r7, r6\n\t"
  6545. #endif
  6546. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6547. "adds r4, r4, r7\n\t"
  6548. #else
  6549. "add r4, r4, r7\n\t"
  6550. #endif
  6551. #ifdef WOLFSSL_KEIL
  6552. "adcs r5, r5, %[r]\n\t"
  6553. #elif defined(__clang__)
  6554. "adcs r5, %[r]\n\t"
  6555. #else
  6556. "adc r5, %[r]\n\t"
  6557. #endif
  6558. "uxth r7, %[b]\n\t"
  6559. #ifdef WOLFSSL_KEIL
  6560. "muls r6, r7, r6\n\t"
  6561. #elif defined(__clang__)
  6562. "muls r6, r7\n\t"
  6563. #else
  6564. "mul r6, r7\n\t"
  6565. #endif
  6566. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6567. "lsrs r7, r6, #16\n\t"
  6568. #else
  6569. "lsr r7, r6, #16\n\t"
  6570. #endif
  6571. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6572. "lsls r6, r6, #16\n\t"
  6573. #else
  6574. "lsl r6, r6, #16\n\t"
  6575. #endif
  6576. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6577. "adds r3, r3, r6\n\t"
  6578. #else
  6579. "add r3, r3, r6\n\t"
  6580. #endif
  6581. #ifdef WOLFSSL_KEIL
  6582. "adcs r4, r4, r7\n\t"
  6583. #elif defined(__clang__)
  6584. "adcs r4, r7\n\t"
  6585. #else
  6586. "adc r4, r7\n\t"
  6587. #endif
  6588. #ifdef WOLFSSL_KEIL
  6589. "adcs r5, r5, %[r]\n\t"
  6590. #elif defined(__clang__)
  6591. "adcs r5, %[r]\n\t"
  6592. #else
  6593. "adc r5, %[r]\n\t"
  6594. #endif
  6595. "# A[3] * B[6]\n\t"
  6596. "mov %[a], r9\n\t"
  6597. "mov %[b], r10\n\t"
  6598. "ldr %[a], [%[a], #12]\n\t"
  6599. "ldr %[b], [%[b], #24]\n\t"
  6600. "uxth r6, %[a]\n\t"
  6601. "uxth r7, %[b]\n\t"
  6602. #ifdef WOLFSSL_KEIL
  6603. "muls r7, r6, r7\n\t"
  6604. #elif defined(__clang__)
  6605. "muls r7, r6\n\t"
  6606. #else
  6607. "mul r7, r6\n\t"
  6608. #endif
  6609. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6610. "adds r3, r3, r7\n\t"
  6611. #else
  6612. "add r3, r3, r7\n\t"
  6613. #endif
  6614. #ifdef WOLFSSL_KEIL
  6615. "adcs r4, r4, %[r]\n\t"
  6616. #elif defined(__clang__)
  6617. "adcs r4, %[r]\n\t"
  6618. #else
  6619. "adc r4, %[r]\n\t"
  6620. #endif
  6621. #ifdef WOLFSSL_KEIL
  6622. "adcs r5, r5, %[r]\n\t"
  6623. #elif defined(__clang__)
  6624. "adcs r5, %[r]\n\t"
  6625. #else
  6626. "adc r5, %[r]\n\t"
  6627. #endif
  6628. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6629. "lsrs r7, %[b], #16\n\t"
  6630. #else
  6631. "lsr r7, %[b], #16\n\t"
  6632. #endif
  6633. #ifdef WOLFSSL_KEIL
  6634. "muls r6, r7, r6\n\t"
  6635. #elif defined(__clang__)
  6636. "muls r6, r7\n\t"
  6637. #else
  6638. "mul r6, r7\n\t"
  6639. #endif
  6640. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6641. "lsrs r7, r6, #16\n\t"
  6642. #else
  6643. "lsr r7, r6, #16\n\t"
  6644. #endif
  6645. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6646. "lsls r6, r6, #16\n\t"
  6647. #else
  6648. "lsl r6, r6, #16\n\t"
  6649. #endif
  6650. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6651. "adds r3, r3, r6\n\t"
  6652. #else
  6653. "add r3, r3, r6\n\t"
  6654. #endif
  6655. #ifdef WOLFSSL_KEIL
  6656. "adcs r4, r4, r7\n\t"
  6657. #elif defined(__clang__)
  6658. "adcs r4, r7\n\t"
  6659. #else
  6660. "adc r4, r7\n\t"
  6661. #endif
  6662. #ifdef WOLFSSL_KEIL
  6663. "adcs r5, r5, %[r]\n\t"
  6664. #elif defined(__clang__)
  6665. "adcs r5, %[r]\n\t"
  6666. #else
  6667. "adc r5, %[r]\n\t"
  6668. #endif
  6669. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6670. "lsrs r6, %[a], #16\n\t"
  6671. #else
  6672. "lsr r6, %[a], #16\n\t"
  6673. #endif
  6674. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6675. "lsrs r7, %[b], #16\n\t"
  6676. #else
  6677. "lsr r7, %[b], #16\n\t"
  6678. #endif
  6679. #ifdef WOLFSSL_KEIL
  6680. "muls r7, r6, r7\n\t"
  6681. #elif defined(__clang__)
  6682. "muls r7, r6\n\t"
  6683. #else
  6684. "mul r7, r6\n\t"
  6685. #endif
  6686. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6687. "adds r4, r4, r7\n\t"
  6688. #else
  6689. "add r4, r4, r7\n\t"
  6690. #endif
  6691. #ifdef WOLFSSL_KEIL
  6692. "adcs r5, r5, %[r]\n\t"
  6693. #elif defined(__clang__)
  6694. "adcs r5, %[r]\n\t"
  6695. #else
  6696. "adc r5, %[r]\n\t"
  6697. #endif
  6698. "uxth r7, %[b]\n\t"
  6699. #ifdef WOLFSSL_KEIL
  6700. "muls r6, r7, r6\n\t"
  6701. #elif defined(__clang__)
  6702. "muls r6, r7\n\t"
  6703. #else
  6704. "mul r6, r7\n\t"
  6705. #endif
  6706. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6707. "lsrs r7, r6, #16\n\t"
  6708. #else
  6709. "lsr r7, r6, #16\n\t"
  6710. #endif
  6711. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6712. "lsls r6, r6, #16\n\t"
  6713. #else
  6714. "lsl r6, r6, #16\n\t"
  6715. #endif
  6716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6717. "adds r3, r3, r6\n\t"
  6718. #else
  6719. "add r3, r3, r6\n\t"
  6720. #endif
  6721. #ifdef WOLFSSL_KEIL
  6722. "adcs r4, r4, r7\n\t"
  6723. #elif defined(__clang__)
  6724. "adcs r4, r7\n\t"
  6725. #else
  6726. "adc r4, r7\n\t"
  6727. #endif
  6728. #ifdef WOLFSSL_KEIL
  6729. "adcs r5, r5, %[r]\n\t"
  6730. #elif defined(__clang__)
  6731. "adcs r5, %[r]\n\t"
  6732. #else
  6733. "adc r5, %[r]\n\t"
  6734. #endif
  6735. "# A[4] * B[5]\n\t"
  6736. "mov %[a], r9\n\t"
  6737. "mov %[b], r10\n\t"
  6738. "ldr %[a], [%[a], #16]\n\t"
  6739. "ldr %[b], [%[b], #20]\n\t"
  6740. "uxth r6, %[a]\n\t"
  6741. "uxth r7, %[b]\n\t"
  6742. #ifdef WOLFSSL_KEIL
  6743. "muls r7, r6, r7\n\t"
  6744. #elif defined(__clang__)
  6745. "muls r7, r6\n\t"
  6746. #else
  6747. "mul r7, r6\n\t"
  6748. #endif
  6749. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6750. "adds r3, r3, r7\n\t"
  6751. #else
  6752. "add r3, r3, r7\n\t"
  6753. #endif
  6754. #ifdef WOLFSSL_KEIL
  6755. "adcs r4, r4, %[r]\n\t"
  6756. #elif defined(__clang__)
  6757. "adcs r4, %[r]\n\t"
  6758. #else
  6759. "adc r4, %[r]\n\t"
  6760. #endif
  6761. #ifdef WOLFSSL_KEIL
  6762. "adcs r5, r5, %[r]\n\t"
  6763. #elif defined(__clang__)
  6764. "adcs r5, %[r]\n\t"
  6765. #else
  6766. "adc r5, %[r]\n\t"
  6767. #endif
  6768. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6769. "lsrs r7, %[b], #16\n\t"
  6770. #else
  6771. "lsr r7, %[b], #16\n\t"
  6772. #endif
  6773. #ifdef WOLFSSL_KEIL
  6774. "muls r6, r7, r6\n\t"
  6775. #elif defined(__clang__)
  6776. "muls r6, r7\n\t"
  6777. #else
  6778. "mul r6, r7\n\t"
  6779. #endif
  6780. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6781. "lsrs r7, r6, #16\n\t"
  6782. #else
  6783. "lsr r7, r6, #16\n\t"
  6784. #endif
  6785. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6786. "lsls r6, r6, #16\n\t"
  6787. #else
  6788. "lsl r6, r6, #16\n\t"
  6789. #endif
  6790. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6791. "adds r3, r3, r6\n\t"
  6792. #else
  6793. "add r3, r3, r6\n\t"
  6794. #endif
  6795. #ifdef WOLFSSL_KEIL
  6796. "adcs r4, r4, r7\n\t"
  6797. #elif defined(__clang__)
  6798. "adcs r4, r7\n\t"
  6799. #else
  6800. "adc r4, r7\n\t"
  6801. #endif
  6802. #ifdef WOLFSSL_KEIL
  6803. "adcs r5, r5, %[r]\n\t"
  6804. #elif defined(__clang__)
  6805. "adcs r5, %[r]\n\t"
  6806. #else
  6807. "adc r5, %[r]\n\t"
  6808. #endif
  6809. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6810. "lsrs r6, %[a], #16\n\t"
  6811. #else
  6812. "lsr r6, %[a], #16\n\t"
  6813. #endif
  6814. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6815. "lsrs r7, %[b], #16\n\t"
  6816. #else
  6817. "lsr r7, %[b], #16\n\t"
  6818. #endif
  6819. #ifdef WOLFSSL_KEIL
  6820. "muls r7, r6, r7\n\t"
  6821. #elif defined(__clang__)
  6822. "muls r7, r6\n\t"
  6823. #else
  6824. "mul r7, r6\n\t"
  6825. #endif
  6826. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6827. "adds r4, r4, r7\n\t"
  6828. #else
  6829. "add r4, r4, r7\n\t"
  6830. #endif
  6831. #ifdef WOLFSSL_KEIL
  6832. "adcs r5, r5, %[r]\n\t"
  6833. #elif defined(__clang__)
  6834. "adcs r5, %[r]\n\t"
  6835. #else
  6836. "adc r5, %[r]\n\t"
  6837. #endif
  6838. "uxth r7, %[b]\n\t"
  6839. #ifdef WOLFSSL_KEIL
  6840. "muls r6, r7, r6\n\t"
  6841. #elif defined(__clang__)
  6842. "muls r6, r7\n\t"
  6843. #else
  6844. "mul r6, r7\n\t"
  6845. #endif
  6846. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6847. "lsrs r7, r6, #16\n\t"
  6848. #else
  6849. "lsr r7, r6, #16\n\t"
  6850. #endif
  6851. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6852. "lsls r6, r6, #16\n\t"
  6853. #else
  6854. "lsl r6, r6, #16\n\t"
  6855. #endif
  6856. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6857. "adds r3, r3, r6\n\t"
  6858. #else
  6859. "add r3, r3, r6\n\t"
  6860. #endif
  6861. #ifdef WOLFSSL_KEIL
  6862. "adcs r4, r4, r7\n\t"
  6863. #elif defined(__clang__)
  6864. "adcs r4, r7\n\t"
  6865. #else
  6866. "adc r4, r7\n\t"
  6867. #endif
  6868. #ifdef WOLFSSL_KEIL
  6869. "adcs r5, r5, %[r]\n\t"
  6870. #elif defined(__clang__)
  6871. "adcs r5, %[r]\n\t"
  6872. #else
  6873. "adc r5, %[r]\n\t"
  6874. #endif
  6875. "# A[5] * B[4]\n\t"
  6876. "mov %[a], r9\n\t"
  6877. "mov %[b], r10\n\t"
  6878. "ldr %[a], [%[a], #20]\n\t"
  6879. "ldr %[b], [%[b], #16]\n\t"
  6880. "uxth r6, %[a]\n\t"
  6881. "uxth r7, %[b]\n\t"
  6882. #ifdef WOLFSSL_KEIL
  6883. "muls r7, r6, r7\n\t"
  6884. #elif defined(__clang__)
  6885. "muls r7, r6\n\t"
  6886. #else
  6887. "mul r7, r6\n\t"
  6888. #endif
  6889. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6890. "adds r3, r3, r7\n\t"
  6891. #else
  6892. "add r3, r3, r7\n\t"
  6893. #endif
  6894. #ifdef WOLFSSL_KEIL
  6895. "adcs r4, r4, %[r]\n\t"
  6896. #elif defined(__clang__)
  6897. "adcs r4, %[r]\n\t"
  6898. #else
  6899. "adc r4, %[r]\n\t"
  6900. #endif
  6901. #ifdef WOLFSSL_KEIL
  6902. "adcs r5, r5, %[r]\n\t"
  6903. #elif defined(__clang__)
  6904. "adcs r5, %[r]\n\t"
  6905. #else
  6906. "adc r5, %[r]\n\t"
  6907. #endif
  6908. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6909. "lsrs r7, %[b], #16\n\t"
  6910. #else
  6911. "lsr r7, %[b], #16\n\t"
  6912. #endif
  6913. #ifdef WOLFSSL_KEIL
  6914. "muls r6, r7, r6\n\t"
  6915. #elif defined(__clang__)
  6916. "muls r6, r7\n\t"
  6917. #else
  6918. "mul r6, r7\n\t"
  6919. #endif
  6920. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6921. "lsrs r7, r6, #16\n\t"
  6922. #else
  6923. "lsr r7, r6, #16\n\t"
  6924. #endif
  6925. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6926. "lsls r6, r6, #16\n\t"
  6927. #else
  6928. "lsl r6, r6, #16\n\t"
  6929. #endif
  6930. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6931. "adds r3, r3, r6\n\t"
  6932. #else
  6933. "add r3, r3, r6\n\t"
  6934. #endif
  6935. #ifdef WOLFSSL_KEIL
  6936. "adcs r4, r4, r7\n\t"
  6937. #elif defined(__clang__)
  6938. "adcs r4, r7\n\t"
  6939. #else
  6940. "adc r4, r7\n\t"
  6941. #endif
  6942. #ifdef WOLFSSL_KEIL
  6943. "adcs r5, r5, %[r]\n\t"
  6944. #elif defined(__clang__)
  6945. "adcs r5, %[r]\n\t"
  6946. #else
  6947. "adc r5, %[r]\n\t"
  6948. #endif
  6949. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6950. "lsrs r6, %[a], #16\n\t"
  6951. #else
  6952. "lsr r6, %[a], #16\n\t"
  6953. #endif
  6954. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6955. "lsrs r7, %[b], #16\n\t"
  6956. #else
  6957. "lsr r7, %[b], #16\n\t"
  6958. #endif
  6959. #ifdef WOLFSSL_KEIL
  6960. "muls r7, r6, r7\n\t"
  6961. #elif defined(__clang__)
  6962. "muls r7, r6\n\t"
  6963. #else
  6964. "mul r7, r6\n\t"
  6965. #endif
  6966. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6967. "adds r4, r4, r7\n\t"
  6968. #else
  6969. "add r4, r4, r7\n\t"
  6970. #endif
  6971. #ifdef WOLFSSL_KEIL
  6972. "adcs r5, r5, %[r]\n\t"
  6973. #elif defined(__clang__)
  6974. "adcs r5, %[r]\n\t"
  6975. #else
  6976. "adc r5, %[r]\n\t"
  6977. #endif
  6978. "uxth r7, %[b]\n\t"
  6979. #ifdef WOLFSSL_KEIL
  6980. "muls r6, r7, r6\n\t"
  6981. #elif defined(__clang__)
  6982. "muls r6, r7\n\t"
  6983. #else
  6984. "mul r6, r7\n\t"
  6985. #endif
  6986. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6987. "lsrs r7, r6, #16\n\t"
  6988. #else
  6989. "lsr r7, r6, #16\n\t"
  6990. #endif
  6991. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6992. "lsls r6, r6, #16\n\t"
  6993. #else
  6994. "lsl r6, r6, #16\n\t"
  6995. #endif
  6996. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6997. "adds r3, r3, r6\n\t"
  6998. #else
  6999. "add r3, r3, r6\n\t"
  7000. #endif
  7001. #ifdef WOLFSSL_KEIL
  7002. "adcs r4, r4, r7\n\t"
  7003. #elif defined(__clang__)
  7004. "adcs r4, r7\n\t"
  7005. #else
  7006. "adc r4, r7\n\t"
  7007. #endif
  7008. #ifdef WOLFSSL_KEIL
  7009. "adcs r5, r5, %[r]\n\t"
  7010. #elif defined(__clang__)
  7011. "adcs r5, %[r]\n\t"
  7012. #else
  7013. "adc r5, %[r]\n\t"
  7014. #endif
  7015. "# A[6] * B[3]\n\t"
  7016. "mov %[a], r9\n\t"
  7017. "mov %[b], r10\n\t"
  7018. "ldr %[a], [%[a], #24]\n\t"
  7019. "ldr %[b], [%[b], #12]\n\t"
  7020. "uxth r6, %[a]\n\t"
  7021. "uxth r7, %[b]\n\t"
  7022. #ifdef WOLFSSL_KEIL
  7023. "muls r7, r6, r7\n\t"
  7024. #elif defined(__clang__)
  7025. "muls r7, r6\n\t"
  7026. #else
  7027. "mul r7, r6\n\t"
  7028. #endif
  7029. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7030. "adds r3, r3, r7\n\t"
  7031. #else
  7032. "add r3, r3, r7\n\t"
  7033. #endif
  7034. #ifdef WOLFSSL_KEIL
  7035. "adcs r4, r4, %[r]\n\t"
  7036. #elif defined(__clang__)
  7037. "adcs r4, %[r]\n\t"
  7038. #else
  7039. "adc r4, %[r]\n\t"
  7040. #endif
  7041. #ifdef WOLFSSL_KEIL
  7042. "adcs r5, r5, %[r]\n\t"
  7043. #elif defined(__clang__)
  7044. "adcs r5, %[r]\n\t"
  7045. #else
  7046. "adc r5, %[r]\n\t"
  7047. #endif
  7048. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7049. "lsrs r7, %[b], #16\n\t"
  7050. #else
  7051. "lsr r7, %[b], #16\n\t"
  7052. #endif
  7053. #ifdef WOLFSSL_KEIL
  7054. "muls r6, r7, r6\n\t"
  7055. #elif defined(__clang__)
  7056. "muls r6, r7\n\t"
  7057. #else
  7058. "mul r6, r7\n\t"
  7059. #endif
  7060. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7061. "lsrs r7, r6, #16\n\t"
  7062. #else
  7063. "lsr r7, r6, #16\n\t"
  7064. #endif
  7065. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7066. "lsls r6, r6, #16\n\t"
  7067. #else
  7068. "lsl r6, r6, #16\n\t"
  7069. #endif
  7070. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7071. "adds r3, r3, r6\n\t"
  7072. #else
  7073. "add r3, r3, r6\n\t"
  7074. #endif
  7075. #ifdef WOLFSSL_KEIL
  7076. "adcs r4, r4, r7\n\t"
  7077. #elif defined(__clang__)
  7078. "adcs r4, r7\n\t"
  7079. #else
  7080. "adc r4, r7\n\t"
  7081. #endif
  7082. #ifdef WOLFSSL_KEIL
  7083. "adcs r5, r5, %[r]\n\t"
  7084. #elif defined(__clang__)
  7085. "adcs r5, %[r]\n\t"
  7086. #else
  7087. "adc r5, %[r]\n\t"
  7088. #endif
  7089. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7090. "lsrs r6, %[a], #16\n\t"
  7091. #else
  7092. "lsr r6, %[a], #16\n\t"
  7093. #endif
  7094. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7095. "lsrs r7, %[b], #16\n\t"
  7096. #else
  7097. "lsr r7, %[b], #16\n\t"
  7098. #endif
  7099. #ifdef WOLFSSL_KEIL
  7100. "muls r7, r6, r7\n\t"
  7101. #elif defined(__clang__)
  7102. "muls r7, r6\n\t"
  7103. #else
  7104. "mul r7, r6\n\t"
  7105. #endif
  7106. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7107. "adds r4, r4, r7\n\t"
  7108. #else
  7109. "add r4, r4, r7\n\t"
  7110. #endif
  7111. #ifdef WOLFSSL_KEIL
  7112. "adcs r5, r5, %[r]\n\t"
  7113. #elif defined(__clang__)
  7114. "adcs r5, %[r]\n\t"
  7115. #else
  7116. "adc r5, %[r]\n\t"
  7117. #endif
  7118. "uxth r7, %[b]\n\t"
  7119. #ifdef WOLFSSL_KEIL
  7120. "muls r6, r7, r6\n\t"
  7121. #elif defined(__clang__)
  7122. "muls r6, r7\n\t"
  7123. #else
  7124. "mul r6, r7\n\t"
  7125. #endif
  7126. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7127. "lsrs r7, r6, #16\n\t"
  7128. #else
  7129. "lsr r7, r6, #16\n\t"
  7130. #endif
  7131. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7132. "lsls r6, r6, #16\n\t"
  7133. #else
  7134. "lsl r6, r6, #16\n\t"
  7135. #endif
  7136. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7137. "adds r3, r3, r6\n\t"
  7138. #else
  7139. "add r3, r3, r6\n\t"
  7140. #endif
  7141. #ifdef WOLFSSL_KEIL
  7142. "adcs r4, r4, r7\n\t"
  7143. #elif defined(__clang__)
  7144. "adcs r4, r7\n\t"
  7145. #else
  7146. "adc r4, r7\n\t"
  7147. #endif
  7148. #ifdef WOLFSSL_KEIL
  7149. "adcs r5, r5, %[r]\n\t"
  7150. #elif defined(__clang__)
  7151. "adcs r5, %[r]\n\t"
  7152. #else
  7153. "adc r5, %[r]\n\t"
  7154. #endif
  7155. "# A[7] * B[2]\n\t"
  7156. "mov %[a], r9\n\t"
  7157. "mov %[b], r10\n\t"
  7158. "ldr %[a], [%[a], #28]\n\t"
  7159. "ldr %[b], [%[b], #8]\n\t"
  7160. "uxth r6, %[a]\n\t"
  7161. "uxth r7, %[b]\n\t"
  7162. #ifdef WOLFSSL_KEIL
  7163. "muls r7, r6, r7\n\t"
  7164. #elif defined(__clang__)
  7165. "muls r7, r6\n\t"
  7166. #else
  7167. "mul r7, r6\n\t"
  7168. #endif
  7169. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7170. "adds r3, r3, r7\n\t"
  7171. #else
  7172. "add r3, r3, r7\n\t"
  7173. #endif
  7174. #ifdef WOLFSSL_KEIL
  7175. "adcs r4, r4, %[r]\n\t"
  7176. #elif defined(__clang__)
  7177. "adcs r4, %[r]\n\t"
  7178. #else
  7179. "adc r4, %[r]\n\t"
  7180. #endif
  7181. #ifdef WOLFSSL_KEIL
  7182. "adcs r5, r5, %[r]\n\t"
  7183. #elif defined(__clang__)
  7184. "adcs r5, %[r]\n\t"
  7185. #else
  7186. "adc r5, %[r]\n\t"
  7187. #endif
  7188. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7189. "lsrs r7, %[b], #16\n\t"
  7190. #else
  7191. "lsr r7, %[b], #16\n\t"
  7192. #endif
  7193. #ifdef WOLFSSL_KEIL
  7194. "muls r6, r7, r6\n\t"
  7195. #elif defined(__clang__)
  7196. "muls r6, r7\n\t"
  7197. #else
  7198. "mul r6, r7\n\t"
  7199. #endif
  7200. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7201. "lsrs r7, r6, #16\n\t"
  7202. #else
  7203. "lsr r7, r6, #16\n\t"
  7204. #endif
  7205. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7206. "lsls r6, r6, #16\n\t"
  7207. #else
  7208. "lsl r6, r6, #16\n\t"
  7209. #endif
  7210. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7211. "adds r3, r3, r6\n\t"
  7212. #else
  7213. "add r3, r3, r6\n\t"
  7214. #endif
  7215. #ifdef WOLFSSL_KEIL
  7216. "adcs r4, r4, r7\n\t"
  7217. #elif defined(__clang__)
  7218. "adcs r4, r7\n\t"
  7219. #else
  7220. "adc r4, r7\n\t"
  7221. #endif
  7222. #ifdef WOLFSSL_KEIL
  7223. "adcs r5, r5, %[r]\n\t"
  7224. #elif defined(__clang__)
  7225. "adcs r5, %[r]\n\t"
  7226. #else
  7227. "adc r5, %[r]\n\t"
  7228. #endif
  7229. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7230. "lsrs r6, %[a], #16\n\t"
  7231. #else
  7232. "lsr r6, %[a], #16\n\t"
  7233. #endif
  7234. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7235. "lsrs r7, %[b], #16\n\t"
  7236. #else
  7237. "lsr r7, %[b], #16\n\t"
  7238. #endif
  7239. #ifdef WOLFSSL_KEIL
  7240. "muls r7, r6, r7\n\t"
  7241. #elif defined(__clang__)
  7242. "muls r7, r6\n\t"
  7243. #else
  7244. "mul r7, r6\n\t"
  7245. #endif
  7246. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7247. "adds r4, r4, r7\n\t"
  7248. #else
  7249. "add r4, r4, r7\n\t"
  7250. #endif
  7251. #ifdef WOLFSSL_KEIL
  7252. "adcs r5, r5, %[r]\n\t"
  7253. #elif defined(__clang__)
  7254. "adcs r5, %[r]\n\t"
  7255. #else
  7256. "adc r5, %[r]\n\t"
  7257. #endif
  7258. "uxth r7, %[b]\n\t"
  7259. #ifdef WOLFSSL_KEIL
  7260. "muls r6, r7, r6\n\t"
  7261. #elif defined(__clang__)
  7262. "muls r6, r7\n\t"
  7263. #else
  7264. "mul r6, r7\n\t"
  7265. #endif
  7266. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7267. "lsrs r7, r6, #16\n\t"
  7268. #else
  7269. "lsr r7, r6, #16\n\t"
  7270. #endif
  7271. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7272. "lsls r6, r6, #16\n\t"
  7273. #else
  7274. "lsl r6, r6, #16\n\t"
  7275. #endif
  7276. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7277. "adds r3, r3, r6\n\t"
  7278. #else
  7279. "add r3, r3, r6\n\t"
  7280. #endif
  7281. #ifdef WOLFSSL_KEIL
  7282. "adcs r4, r4, r7\n\t"
  7283. #elif defined(__clang__)
  7284. "adcs r4, r7\n\t"
  7285. #else
  7286. "adc r4, r7\n\t"
  7287. #endif
  7288. #ifdef WOLFSSL_KEIL
  7289. "adcs r5, r5, %[r]\n\t"
  7290. #elif defined(__clang__)
  7291. "adcs r5, %[r]\n\t"
  7292. #else
  7293. "adc r5, %[r]\n\t"
  7294. #endif
  7295. "mov %[r], r8\n\t"
  7296. "str r3, [%[r], #36]\n\t"
  7297. "movs %[r], #0\n\t"
  7298. "# A[7] * B[3]\n\t"
  7299. "movs r3, #0\n\t"
  7300. "mov %[a], r9\n\t"
  7301. "mov %[b], r10\n\t"
  7302. "ldr %[a], [%[a], #28]\n\t"
  7303. "ldr %[b], [%[b], #12]\n\t"
  7304. "uxth r6, %[a]\n\t"
  7305. "uxth r7, %[b]\n\t"
  7306. #ifdef WOLFSSL_KEIL
  7307. "muls r7, r6, r7\n\t"
  7308. #elif defined(__clang__)
  7309. "muls r7, r6\n\t"
  7310. #else
  7311. "mul r7, r6\n\t"
  7312. #endif
  7313. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7314. "adds r4, r4, r7\n\t"
  7315. #else
  7316. "add r4, r4, r7\n\t"
  7317. #endif
  7318. #ifdef WOLFSSL_KEIL
  7319. "adcs r5, r5, %[r]\n\t"
  7320. #elif defined(__clang__)
  7321. "adcs r5, %[r]\n\t"
  7322. #else
  7323. "adc r5, %[r]\n\t"
  7324. #endif
  7325. #ifdef WOLFSSL_KEIL
  7326. "adcs r3, r3, %[r]\n\t"
  7327. #elif defined(__clang__)
  7328. "adcs r3, %[r]\n\t"
  7329. #else
  7330. "adc r3, %[r]\n\t"
  7331. #endif
  7332. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7333. "lsrs r7, %[b], #16\n\t"
  7334. #else
  7335. "lsr r7, %[b], #16\n\t"
  7336. #endif
  7337. #ifdef WOLFSSL_KEIL
  7338. "muls r6, r7, r6\n\t"
  7339. #elif defined(__clang__)
  7340. "muls r6, r7\n\t"
  7341. #else
  7342. "mul r6, r7\n\t"
  7343. #endif
  7344. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7345. "lsrs r7, r6, #16\n\t"
  7346. #else
  7347. "lsr r7, r6, #16\n\t"
  7348. #endif
  7349. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7350. "lsls r6, r6, #16\n\t"
  7351. #else
  7352. "lsl r6, r6, #16\n\t"
  7353. #endif
  7354. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7355. "adds r4, r4, r6\n\t"
  7356. #else
  7357. "add r4, r4, r6\n\t"
  7358. #endif
  7359. #ifdef WOLFSSL_KEIL
  7360. "adcs r5, r5, r7\n\t"
  7361. #elif defined(__clang__)
  7362. "adcs r5, r7\n\t"
  7363. #else
  7364. "adc r5, r7\n\t"
  7365. #endif
  7366. #ifdef WOLFSSL_KEIL
  7367. "adcs r3, r3, %[r]\n\t"
  7368. #elif defined(__clang__)
  7369. "adcs r3, %[r]\n\t"
  7370. #else
  7371. "adc r3, %[r]\n\t"
  7372. #endif
  7373. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7374. "lsrs r6, %[a], #16\n\t"
  7375. #else
  7376. "lsr r6, %[a], #16\n\t"
  7377. #endif
  7378. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7379. "lsrs r7, %[b], #16\n\t"
  7380. #else
  7381. "lsr r7, %[b], #16\n\t"
  7382. #endif
  7383. #ifdef WOLFSSL_KEIL
  7384. "muls r7, r6, r7\n\t"
  7385. #elif defined(__clang__)
  7386. "muls r7, r6\n\t"
  7387. #else
  7388. "mul r7, r6\n\t"
  7389. #endif
  7390. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7391. "adds r5, r5, r7\n\t"
  7392. #else
  7393. "add r5, r5, r7\n\t"
  7394. #endif
  7395. #ifdef WOLFSSL_KEIL
  7396. "adcs r3, r3, %[r]\n\t"
  7397. #elif defined(__clang__)
  7398. "adcs r3, %[r]\n\t"
  7399. #else
  7400. "adc r3, %[r]\n\t"
  7401. #endif
  7402. "uxth r7, %[b]\n\t"
  7403. #ifdef WOLFSSL_KEIL
  7404. "muls r6, r7, r6\n\t"
  7405. #elif defined(__clang__)
  7406. "muls r6, r7\n\t"
  7407. #else
  7408. "mul r6, r7\n\t"
  7409. #endif
  7410. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7411. "lsrs r7, r6, #16\n\t"
  7412. #else
  7413. "lsr r7, r6, #16\n\t"
  7414. #endif
  7415. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7416. "lsls r6, r6, #16\n\t"
  7417. #else
  7418. "lsl r6, r6, #16\n\t"
  7419. #endif
  7420. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7421. "adds r4, r4, r6\n\t"
  7422. #else
  7423. "add r4, r4, r6\n\t"
  7424. #endif
  7425. #ifdef WOLFSSL_KEIL
  7426. "adcs r5, r5, r7\n\t"
  7427. #elif defined(__clang__)
  7428. "adcs r5, r7\n\t"
  7429. #else
  7430. "adc r5, r7\n\t"
  7431. #endif
  7432. #ifdef WOLFSSL_KEIL
  7433. "adcs r3, r3, %[r]\n\t"
  7434. #elif defined(__clang__)
  7435. "adcs r3, %[r]\n\t"
  7436. #else
  7437. "adc r3, %[r]\n\t"
  7438. #endif
  7439. "# A[6] * B[4]\n\t"
  7440. "mov %[a], r9\n\t"
  7441. "mov %[b], r10\n\t"
  7442. "ldr %[a], [%[a], #24]\n\t"
  7443. "ldr %[b], [%[b], #16]\n\t"
  7444. "uxth r6, %[a]\n\t"
  7445. "uxth r7, %[b]\n\t"
  7446. #ifdef WOLFSSL_KEIL
  7447. "muls r7, r6, r7\n\t"
  7448. #elif defined(__clang__)
  7449. "muls r7, r6\n\t"
  7450. #else
  7451. "mul r7, r6\n\t"
  7452. #endif
  7453. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7454. "adds r4, r4, r7\n\t"
  7455. #else
  7456. "add r4, r4, r7\n\t"
  7457. #endif
  7458. #ifdef WOLFSSL_KEIL
  7459. "adcs r5, r5, %[r]\n\t"
  7460. #elif defined(__clang__)
  7461. "adcs r5, %[r]\n\t"
  7462. #else
  7463. "adc r5, %[r]\n\t"
  7464. #endif
  7465. #ifdef WOLFSSL_KEIL
  7466. "adcs r3, r3, %[r]\n\t"
  7467. #elif defined(__clang__)
  7468. "adcs r3, %[r]\n\t"
  7469. #else
  7470. "adc r3, %[r]\n\t"
  7471. #endif
  7472. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7473. "lsrs r7, %[b], #16\n\t"
  7474. #else
  7475. "lsr r7, %[b], #16\n\t"
  7476. #endif
  7477. #ifdef WOLFSSL_KEIL
  7478. "muls r6, r7, r6\n\t"
  7479. #elif defined(__clang__)
  7480. "muls r6, r7\n\t"
  7481. #else
  7482. "mul r6, r7\n\t"
  7483. #endif
  7484. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7485. "lsrs r7, r6, #16\n\t"
  7486. #else
  7487. "lsr r7, r6, #16\n\t"
  7488. #endif
  7489. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7490. "lsls r6, r6, #16\n\t"
  7491. #else
  7492. "lsl r6, r6, #16\n\t"
  7493. #endif
  7494. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7495. "adds r4, r4, r6\n\t"
  7496. #else
  7497. "add r4, r4, r6\n\t"
  7498. #endif
  7499. #ifdef WOLFSSL_KEIL
  7500. "adcs r5, r5, r7\n\t"
  7501. #elif defined(__clang__)
  7502. "adcs r5, r7\n\t"
  7503. #else
  7504. "adc r5, r7\n\t"
  7505. #endif
  7506. #ifdef WOLFSSL_KEIL
  7507. "adcs r3, r3, %[r]\n\t"
  7508. #elif defined(__clang__)
  7509. "adcs r3, %[r]\n\t"
  7510. #else
  7511. "adc r3, %[r]\n\t"
  7512. #endif
  7513. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7514. "lsrs r6, %[a], #16\n\t"
  7515. #else
  7516. "lsr r6, %[a], #16\n\t"
  7517. #endif
  7518. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7519. "lsrs r7, %[b], #16\n\t"
  7520. #else
  7521. "lsr r7, %[b], #16\n\t"
  7522. #endif
  7523. #ifdef WOLFSSL_KEIL
  7524. "muls r7, r6, r7\n\t"
  7525. #elif defined(__clang__)
  7526. "muls r7, r6\n\t"
  7527. #else
  7528. "mul r7, r6\n\t"
  7529. #endif
  7530. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7531. "adds r5, r5, r7\n\t"
  7532. #else
  7533. "add r5, r5, r7\n\t"
  7534. #endif
  7535. #ifdef WOLFSSL_KEIL
  7536. "adcs r3, r3, %[r]\n\t"
  7537. #elif defined(__clang__)
  7538. "adcs r3, %[r]\n\t"
  7539. #else
  7540. "adc r3, %[r]\n\t"
  7541. #endif
  7542. "uxth r7, %[b]\n\t"
  7543. #ifdef WOLFSSL_KEIL
  7544. "muls r6, r7, r6\n\t"
  7545. #elif defined(__clang__)
  7546. "muls r6, r7\n\t"
  7547. #else
  7548. "mul r6, r7\n\t"
  7549. #endif
  7550. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7551. "lsrs r7, r6, #16\n\t"
  7552. #else
  7553. "lsr r7, r6, #16\n\t"
  7554. #endif
  7555. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7556. "lsls r6, r6, #16\n\t"
  7557. #else
  7558. "lsl r6, r6, #16\n\t"
  7559. #endif
  7560. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7561. "adds r4, r4, r6\n\t"
  7562. #else
  7563. "add r4, r4, r6\n\t"
  7564. #endif
  7565. #ifdef WOLFSSL_KEIL
  7566. "adcs r5, r5, r7\n\t"
  7567. #elif defined(__clang__)
  7568. "adcs r5, r7\n\t"
  7569. #else
  7570. "adc r5, r7\n\t"
  7571. #endif
  7572. #ifdef WOLFSSL_KEIL
  7573. "adcs r3, r3, %[r]\n\t"
  7574. #elif defined(__clang__)
  7575. "adcs r3, %[r]\n\t"
  7576. #else
  7577. "adc r3, %[r]\n\t"
  7578. #endif
  7579. "# A[5] * B[5]\n\t"
  7580. "mov %[a], r9\n\t"
  7581. "mov %[b], r10\n\t"
  7582. "ldr %[a], [%[a], #20]\n\t"
  7583. "ldr %[b], [%[b], #20]\n\t"
  7584. "uxth r6, %[a]\n\t"
  7585. "uxth r7, %[b]\n\t"
  7586. #ifdef WOLFSSL_KEIL
  7587. "muls r7, r6, r7\n\t"
  7588. #elif defined(__clang__)
  7589. "muls r7, r6\n\t"
  7590. #else
  7591. "mul r7, r6\n\t"
  7592. #endif
  7593. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7594. "adds r4, r4, r7\n\t"
  7595. #else
  7596. "add r4, r4, r7\n\t"
  7597. #endif
  7598. #ifdef WOLFSSL_KEIL
  7599. "adcs r5, r5, %[r]\n\t"
  7600. #elif defined(__clang__)
  7601. "adcs r5, %[r]\n\t"
  7602. #else
  7603. "adc r5, %[r]\n\t"
  7604. #endif
  7605. #ifdef WOLFSSL_KEIL
  7606. "adcs r3, r3, %[r]\n\t"
  7607. #elif defined(__clang__)
  7608. "adcs r3, %[r]\n\t"
  7609. #else
  7610. "adc r3, %[r]\n\t"
  7611. #endif
  7612. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7613. "lsrs r7, %[b], #16\n\t"
  7614. #else
  7615. "lsr r7, %[b], #16\n\t"
  7616. #endif
  7617. #ifdef WOLFSSL_KEIL
  7618. "muls r6, r7, r6\n\t"
  7619. #elif defined(__clang__)
  7620. "muls r6, r7\n\t"
  7621. #else
  7622. "mul r6, r7\n\t"
  7623. #endif
  7624. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7625. "lsrs r7, r6, #16\n\t"
  7626. #else
  7627. "lsr r7, r6, #16\n\t"
  7628. #endif
  7629. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7630. "lsls r6, r6, #16\n\t"
  7631. #else
  7632. "lsl r6, r6, #16\n\t"
  7633. #endif
  7634. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7635. "adds r4, r4, r6\n\t"
  7636. #else
  7637. "add r4, r4, r6\n\t"
  7638. #endif
  7639. #ifdef WOLFSSL_KEIL
  7640. "adcs r5, r5, r7\n\t"
  7641. #elif defined(__clang__)
  7642. "adcs r5, r7\n\t"
  7643. #else
  7644. "adc r5, r7\n\t"
  7645. #endif
  7646. #ifdef WOLFSSL_KEIL
  7647. "adcs r3, r3, %[r]\n\t"
  7648. #elif defined(__clang__)
  7649. "adcs r3, %[r]\n\t"
  7650. #else
  7651. "adc r3, %[r]\n\t"
  7652. #endif
  7653. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7654. "lsrs r6, %[a], #16\n\t"
  7655. #else
  7656. "lsr r6, %[a], #16\n\t"
  7657. #endif
  7658. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7659. "lsrs r7, %[b], #16\n\t"
  7660. #else
  7661. "lsr r7, %[b], #16\n\t"
  7662. #endif
  7663. #ifdef WOLFSSL_KEIL
  7664. "muls r7, r6, r7\n\t"
  7665. #elif defined(__clang__)
  7666. "muls r7, r6\n\t"
  7667. #else
  7668. "mul r7, r6\n\t"
  7669. #endif
  7670. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7671. "adds r5, r5, r7\n\t"
  7672. #else
  7673. "add r5, r5, r7\n\t"
  7674. #endif
  7675. #ifdef WOLFSSL_KEIL
  7676. "adcs r3, r3, %[r]\n\t"
  7677. #elif defined(__clang__)
  7678. "adcs r3, %[r]\n\t"
  7679. #else
  7680. "adc r3, %[r]\n\t"
  7681. #endif
  7682. "uxth r7, %[b]\n\t"
  7683. #ifdef WOLFSSL_KEIL
  7684. "muls r6, r7, r6\n\t"
  7685. #elif defined(__clang__)
  7686. "muls r6, r7\n\t"
  7687. #else
  7688. "mul r6, r7\n\t"
  7689. #endif
  7690. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7691. "lsrs r7, r6, #16\n\t"
  7692. #else
  7693. "lsr r7, r6, #16\n\t"
  7694. #endif
  7695. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7696. "lsls r6, r6, #16\n\t"
  7697. #else
  7698. "lsl r6, r6, #16\n\t"
  7699. #endif
  7700. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7701. "adds r4, r4, r6\n\t"
  7702. #else
  7703. "add r4, r4, r6\n\t"
  7704. #endif
  7705. #ifdef WOLFSSL_KEIL
  7706. "adcs r5, r5, r7\n\t"
  7707. #elif defined(__clang__)
  7708. "adcs r5, r7\n\t"
  7709. #else
  7710. "adc r5, r7\n\t"
  7711. #endif
  7712. #ifdef WOLFSSL_KEIL
  7713. "adcs r3, r3, %[r]\n\t"
  7714. #elif defined(__clang__)
  7715. "adcs r3, %[r]\n\t"
  7716. #else
  7717. "adc r3, %[r]\n\t"
  7718. #endif
  7719. "# A[4] * B[6]\n\t"
  7720. "mov %[a], r9\n\t"
  7721. "mov %[b], r10\n\t"
  7722. "ldr %[a], [%[a], #16]\n\t"
  7723. "ldr %[b], [%[b], #24]\n\t"
  7724. "uxth r6, %[a]\n\t"
  7725. "uxth r7, %[b]\n\t"
  7726. #ifdef WOLFSSL_KEIL
  7727. "muls r7, r6, r7\n\t"
  7728. #elif defined(__clang__)
  7729. "muls r7, r6\n\t"
  7730. #else
  7731. "mul r7, r6\n\t"
  7732. #endif
  7733. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7734. "adds r4, r4, r7\n\t"
  7735. #else
  7736. "add r4, r4, r7\n\t"
  7737. #endif
  7738. #ifdef WOLFSSL_KEIL
  7739. "adcs r5, r5, %[r]\n\t"
  7740. #elif defined(__clang__)
  7741. "adcs r5, %[r]\n\t"
  7742. #else
  7743. "adc r5, %[r]\n\t"
  7744. #endif
  7745. #ifdef WOLFSSL_KEIL
  7746. "adcs r3, r3, %[r]\n\t"
  7747. #elif defined(__clang__)
  7748. "adcs r3, %[r]\n\t"
  7749. #else
  7750. "adc r3, %[r]\n\t"
  7751. #endif
  7752. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7753. "lsrs r7, %[b], #16\n\t"
  7754. #else
  7755. "lsr r7, %[b], #16\n\t"
  7756. #endif
  7757. #ifdef WOLFSSL_KEIL
  7758. "muls r6, r7, r6\n\t"
  7759. #elif defined(__clang__)
  7760. "muls r6, r7\n\t"
  7761. #else
  7762. "mul r6, r7\n\t"
  7763. #endif
  7764. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7765. "lsrs r7, r6, #16\n\t"
  7766. #else
  7767. "lsr r7, r6, #16\n\t"
  7768. #endif
  7769. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7770. "lsls r6, r6, #16\n\t"
  7771. #else
  7772. "lsl r6, r6, #16\n\t"
  7773. #endif
  7774. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7775. "adds r4, r4, r6\n\t"
  7776. #else
  7777. "add r4, r4, r6\n\t"
  7778. #endif
  7779. #ifdef WOLFSSL_KEIL
  7780. "adcs r5, r5, r7\n\t"
  7781. #elif defined(__clang__)
  7782. "adcs r5, r7\n\t"
  7783. #else
  7784. "adc r5, r7\n\t"
  7785. #endif
  7786. #ifdef WOLFSSL_KEIL
  7787. "adcs r3, r3, %[r]\n\t"
  7788. #elif defined(__clang__)
  7789. "adcs r3, %[r]\n\t"
  7790. #else
  7791. "adc r3, %[r]\n\t"
  7792. #endif
  7793. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7794. "lsrs r6, %[a], #16\n\t"
  7795. #else
  7796. "lsr r6, %[a], #16\n\t"
  7797. #endif
  7798. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7799. "lsrs r7, %[b], #16\n\t"
  7800. #else
  7801. "lsr r7, %[b], #16\n\t"
  7802. #endif
  7803. #ifdef WOLFSSL_KEIL
  7804. "muls r7, r6, r7\n\t"
  7805. #elif defined(__clang__)
  7806. "muls r7, r6\n\t"
  7807. #else
  7808. "mul r7, r6\n\t"
  7809. #endif
  7810. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7811. "adds r5, r5, r7\n\t"
  7812. #else
  7813. "add r5, r5, r7\n\t"
  7814. #endif
  7815. #ifdef WOLFSSL_KEIL
  7816. "adcs r3, r3, %[r]\n\t"
  7817. #elif defined(__clang__)
  7818. "adcs r3, %[r]\n\t"
  7819. #else
  7820. "adc r3, %[r]\n\t"
  7821. #endif
  7822. "uxth r7, %[b]\n\t"
  7823. #ifdef WOLFSSL_KEIL
  7824. "muls r6, r7, r6\n\t"
  7825. #elif defined(__clang__)
  7826. "muls r6, r7\n\t"
  7827. #else
  7828. "mul r6, r7\n\t"
  7829. #endif
  7830. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7831. "lsrs r7, r6, #16\n\t"
  7832. #else
  7833. "lsr r7, r6, #16\n\t"
  7834. #endif
  7835. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7836. "lsls r6, r6, #16\n\t"
  7837. #else
  7838. "lsl r6, r6, #16\n\t"
  7839. #endif
  7840. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7841. "adds r4, r4, r6\n\t"
  7842. #else
  7843. "add r4, r4, r6\n\t"
  7844. #endif
  7845. #ifdef WOLFSSL_KEIL
  7846. "adcs r5, r5, r7\n\t"
  7847. #elif defined(__clang__)
  7848. "adcs r5, r7\n\t"
  7849. #else
  7850. "adc r5, r7\n\t"
  7851. #endif
  7852. #ifdef WOLFSSL_KEIL
  7853. "adcs r3, r3, %[r]\n\t"
  7854. #elif defined(__clang__)
  7855. "adcs r3, %[r]\n\t"
  7856. #else
  7857. "adc r3, %[r]\n\t"
  7858. #endif
  7859. "# A[3] * B[7]\n\t"
  7860. "mov %[a], r9\n\t"
  7861. "mov %[b], r10\n\t"
  7862. "ldr %[a], [%[a], #12]\n\t"
  7863. "ldr %[b], [%[b], #28]\n\t"
  7864. "uxth r6, %[a]\n\t"
  7865. "uxth r7, %[b]\n\t"
  7866. #ifdef WOLFSSL_KEIL
  7867. "muls r7, r6, r7\n\t"
  7868. #elif defined(__clang__)
  7869. "muls r7, r6\n\t"
  7870. #else
  7871. "mul r7, r6\n\t"
  7872. #endif
  7873. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7874. "adds r4, r4, r7\n\t"
  7875. #else
  7876. "add r4, r4, r7\n\t"
  7877. #endif
  7878. #ifdef WOLFSSL_KEIL
  7879. "adcs r5, r5, %[r]\n\t"
  7880. #elif defined(__clang__)
  7881. "adcs r5, %[r]\n\t"
  7882. #else
  7883. "adc r5, %[r]\n\t"
  7884. #endif
  7885. #ifdef WOLFSSL_KEIL
  7886. "adcs r3, r3, %[r]\n\t"
  7887. #elif defined(__clang__)
  7888. "adcs r3, %[r]\n\t"
  7889. #else
  7890. "adc r3, %[r]\n\t"
  7891. #endif
  7892. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7893. "lsrs r7, %[b], #16\n\t"
  7894. #else
  7895. "lsr r7, %[b], #16\n\t"
  7896. #endif
  7897. #ifdef WOLFSSL_KEIL
  7898. "muls r6, r7, r6\n\t"
  7899. #elif defined(__clang__)
  7900. "muls r6, r7\n\t"
  7901. #else
  7902. "mul r6, r7\n\t"
  7903. #endif
  7904. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7905. "lsrs r7, r6, #16\n\t"
  7906. #else
  7907. "lsr r7, r6, #16\n\t"
  7908. #endif
  7909. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7910. "lsls r6, r6, #16\n\t"
  7911. #else
  7912. "lsl r6, r6, #16\n\t"
  7913. #endif
  7914. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7915. "adds r4, r4, r6\n\t"
  7916. #else
  7917. "add r4, r4, r6\n\t"
  7918. #endif
  7919. #ifdef WOLFSSL_KEIL
  7920. "adcs r5, r5, r7\n\t"
  7921. #elif defined(__clang__)
  7922. "adcs r5, r7\n\t"
  7923. #else
  7924. "adc r5, r7\n\t"
  7925. #endif
  7926. #ifdef WOLFSSL_KEIL
  7927. "adcs r3, r3, %[r]\n\t"
  7928. #elif defined(__clang__)
  7929. "adcs r3, %[r]\n\t"
  7930. #else
  7931. "adc r3, %[r]\n\t"
  7932. #endif
  7933. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7934. "lsrs r6, %[a], #16\n\t"
  7935. #else
  7936. "lsr r6, %[a], #16\n\t"
  7937. #endif
  7938. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7939. "lsrs r7, %[b], #16\n\t"
  7940. #else
  7941. "lsr r7, %[b], #16\n\t"
  7942. #endif
  7943. #ifdef WOLFSSL_KEIL
  7944. "muls r7, r6, r7\n\t"
  7945. #elif defined(__clang__)
  7946. "muls r7, r6\n\t"
  7947. #else
  7948. "mul r7, r6\n\t"
  7949. #endif
  7950. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7951. "adds r5, r5, r7\n\t"
  7952. #else
  7953. "add r5, r5, r7\n\t"
  7954. #endif
  7955. #ifdef WOLFSSL_KEIL
  7956. "adcs r3, r3, %[r]\n\t"
  7957. #elif defined(__clang__)
  7958. "adcs r3, %[r]\n\t"
  7959. #else
  7960. "adc r3, %[r]\n\t"
  7961. #endif
  7962. "uxth r7, %[b]\n\t"
  7963. #ifdef WOLFSSL_KEIL
  7964. "muls r6, r7, r6\n\t"
  7965. #elif defined(__clang__)
  7966. "muls r6, r7\n\t"
  7967. #else
  7968. "mul r6, r7\n\t"
  7969. #endif
  7970. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7971. "lsrs r7, r6, #16\n\t"
  7972. #else
  7973. "lsr r7, r6, #16\n\t"
  7974. #endif
  7975. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7976. "lsls r6, r6, #16\n\t"
  7977. #else
  7978. "lsl r6, r6, #16\n\t"
  7979. #endif
  7980. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7981. "adds r4, r4, r6\n\t"
  7982. #else
  7983. "add r4, r4, r6\n\t"
  7984. #endif
  7985. #ifdef WOLFSSL_KEIL
  7986. "adcs r5, r5, r7\n\t"
  7987. #elif defined(__clang__)
  7988. "adcs r5, r7\n\t"
  7989. #else
  7990. "adc r5, r7\n\t"
  7991. #endif
  7992. #ifdef WOLFSSL_KEIL
  7993. "adcs r3, r3, %[r]\n\t"
  7994. #elif defined(__clang__)
  7995. "adcs r3, %[r]\n\t"
  7996. #else
  7997. "adc r3, %[r]\n\t"
  7998. #endif
  7999. "mov %[r], r8\n\t"
  8000. "str r4, [%[r], #40]\n\t"
  8001. "movs %[r], #0\n\t"
  8002. "# A[4] * B[7]\n\t"
  8003. "movs r4, #0\n\t"
  8004. "mov %[a], r9\n\t"
  8005. "mov %[b], r10\n\t"
  8006. "ldr %[a], [%[a], #16]\n\t"
  8007. "ldr %[b], [%[b], #28]\n\t"
  8008. "uxth r6, %[a]\n\t"
  8009. "uxth r7, %[b]\n\t"
  8010. #ifdef WOLFSSL_KEIL
  8011. "muls r7, r6, r7\n\t"
  8012. #elif defined(__clang__)
  8013. "muls r7, r6\n\t"
  8014. #else
  8015. "mul r7, r6\n\t"
  8016. #endif
  8017. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8018. "adds r5, r5, r7\n\t"
  8019. #else
  8020. "add r5, r5, r7\n\t"
  8021. #endif
  8022. #ifdef WOLFSSL_KEIL
  8023. "adcs r3, r3, %[r]\n\t"
  8024. #elif defined(__clang__)
  8025. "adcs r3, %[r]\n\t"
  8026. #else
  8027. "adc r3, %[r]\n\t"
  8028. #endif
  8029. #ifdef WOLFSSL_KEIL
  8030. "adcs r4, r4, %[r]\n\t"
  8031. #elif defined(__clang__)
  8032. "adcs r4, %[r]\n\t"
  8033. #else
  8034. "adc r4, %[r]\n\t"
  8035. #endif
  8036. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8037. "lsrs r7, %[b], #16\n\t"
  8038. #else
  8039. "lsr r7, %[b], #16\n\t"
  8040. #endif
  8041. #ifdef WOLFSSL_KEIL
  8042. "muls r6, r7, r6\n\t"
  8043. #elif defined(__clang__)
  8044. "muls r6, r7\n\t"
  8045. #else
  8046. "mul r6, r7\n\t"
  8047. #endif
  8048. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8049. "lsrs r7, r6, #16\n\t"
  8050. #else
  8051. "lsr r7, r6, #16\n\t"
  8052. #endif
  8053. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8054. "lsls r6, r6, #16\n\t"
  8055. #else
  8056. "lsl r6, r6, #16\n\t"
  8057. #endif
  8058. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8059. "adds r5, r5, r6\n\t"
  8060. #else
  8061. "add r5, r5, r6\n\t"
  8062. #endif
  8063. #ifdef WOLFSSL_KEIL
  8064. "adcs r3, r3, r7\n\t"
  8065. #elif defined(__clang__)
  8066. "adcs r3, r7\n\t"
  8067. #else
  8068. "adc r3, r7\n\t"
  8069. #endif
  8070. #ifdef WOLFSSL_KEIL
  8071. "adcs r4, r4, %[r]\n\t"
  8072. #elif defined(__clang__)
  8073. "adcs r4, %[r]\n\t"
  8074. #else
  8075. "adc r4, %[r]\n\t"
  8076. #endif
  8077. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8078. "lsrs r6, %[a], #16\n\t"
  8079. #else
  8080. "lsr r6, %[a], #16\n\t"
  8081. #endif
  8082. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8083. "lsrs r7, %[b], #16\n\t"
  8084. #else
  8085. "lsr r7, %[b], #16\n\t"
  8086. #endif
  8087. #ifdef WOLFSSL_KEIL
  8088. "muls r7, r6, r7\n\t"
  8089. #elif defined(__clang__)
  8090. "muls r7, r6\n\t"
  8091. #else
  8092. "mul r7, r6\n\t"
  8093. #endif
  8094. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8095. "adds r3, r3, r7\n\t"
  8096. #else
  8097. "add r3, r3, r7\n\t"
  8098. #endif
  8099. #ifdef WOLFSSL_KEIL
  8100. "adcs r4, r4, %[r]\n\t"
  8101. #elif defined(__clang__)
  8102. "adcs r4, %[r]\n\t"
  8103. #else
  8104. "adc r4, %[r]\n\t"
  8105. #endif
  8106. "uxth r7, %[b]\n\t"
  8107. #ifdef WOLFSSL_KEIL
  8108. "muls r6, r7, r6\n\t"
  8109. #elif defined(__clang__)
  8110. "muls r6, r7\n\t"
  8111. #else
  8112. "mul r6, r7\n\t"
  8113. #endif
  8114. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8115. "lsrs r7, r6, #16\n\t"
  8116. #else
  8117. "lsr r7, r6, #16\n\t"
  8118. #endif
  8119. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8120. "lsls r6, r6, #16\n\t"
  8121. #else
  8122. "lsl r6, r6, #16\n\t"
  8123. #endif
  8124. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8125. "adds r5, r5, r6\n\t"
  8126. #else
  8127. "add r5, r5, r6\n\t"
  8128. #endif
  8129. #ifdef WOLFSSL_KEIL
  8130. "adcs r3, r3, r7\n\t"
  8131. #elif defined(__clang__)
  8132. "adcs r3, r7\n\t"
  8133. #else
  8134. "adc r3, r7\n\t"
  8135. #endif
  8136. #ifdef WOLFSSL_KEIL
  8137. "adcs r4, r4, %[r]\n\t"
  8138. #elif defined(__clang__)
  8139. "adcs r4, %[r]\n\t"
  8140. #else
  8141. "adc r4, %[r]\n\t"
  8142. #endif
  8143. "# A[5] * B[6]\n\t"
  8144. "mov %[a], r9\n\t"
  8145. "mov %[b], r10\n\t"
  8146. "ldr %[a], [%[a], #20]\n\t"
  8147. "ldr %[b], [%[b], #24]\n\t"
  8148. "uxth r6, %[a]\n\t"
  8149. "uxth r7, %[b]\n\t"
  8150. #ifdef WOLFSSL_KEIL
  8151. "muls r7, r6, r7\n\t"
  8152. #elif defined(__clang__)
  8153. "muls r7, r6\n\t"
  8154. #else
  8155. "mul r7, r6\n\t"
  8156. #endif
  8157. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8158. "adds r5, r5, r7\n\t"
  8159. #else
  8160. "add r5, r5, r7\n\t"
  8161. #endif
  8162. #ifdef WOLFSSL_KEIL
  8163. "adcs r3, r3, %[r]\n\t"
  8164. #elif defined(__clang__)
  8165. "adcs r3, %[r]\n\t"
  8166. #else
  8167. "adc r3, %[r]\n\t"
  8168. #endif
  8169. #ifdef WOLFSSL_KEIL
  8170. "adcs r4, r4, %[r]\n\t"
  8171. #elif defined(__clang__)
  8172. "adcs r4, %[r]\n\t"
  8173. #else
  8174. "adc r4, %[r]\n\t"
  8175. #endif
  8176. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8177. "lsrs r7, %[b], #16\n\t"
  8178. #else
  8179. "lsr r7, %[b], #16\n\t"
  8180. #endif
  8181. #ifdef WOLFSSL_KEIL
  8182. "muls r6, r7, r6\n\t"
  8183. #elif defined(__clang__)
  8184. "muls r6, r7\n\t"
  8185. #else
  8186. "mul r6, r7\n\t"
  8187. #endif
  8188. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8189. "lsrs r7, r6, #16\n\t"
  8190. #else
  8191. "lsr r7, r6, #16\n\t"
  8192. #endif
  8193. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8194. "lsls r6, r6, #16\n\t"
  8195. #else
  8196. "lsl r6, r6, #16\n\t"
  8197. #endif
  8198. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8199. "adds r5, r5, r6\n\t"
  8200. #else
  8201. "add r5, r5, r6\n\t"
  8202. #endif
  8203. #ifdef WOLFSSL_KEIL
  8204. "adcs r3, r3, r7\n\t"
  8205. #elif defined(__clang__)
  8206. "adcs r3, r7\n\t"
  8207. #else
  8208. "adc r3, r7\n\t"
  8209. #endif
  8210. #ifdef WOLFSSL_KEIL
  8211. "adcs r4, r4, %[r]\n\t"
  8212. #elif defined(__clang__)
  8213. "adcs r4, %[r]\n\t"
  8214. #else
  8215. "adc r4, %[r]\n\t"
  8216. #endif
  8217. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8218. "lsrs r6, %[a], #16\n\t"
  8219. #else
  8220. "lsr r6, %[a], #16\n\t"
  8221. #endif
  8222. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8223. "lsrs r7, %[b], #16\n\t"
  8224. #else
  8225. "lsr r7, %[b], #16\n\t"
  8226. #endif
  8227. #ifdef WOLFSSL_KEIL
  8228. "muls r7, r6, r7\n\t"
  8229. #elif defined(__clang__)
  8230. "muls r7, r6\n\t"
  8231. #else
  8232. "mul r7, r6\n\t"
  8233. #endif
  8234. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8235. "adds r3, r3, r7\n\t"
  8236. #else
  8237. "add r3, r3, r7\n\t"
  8238. #endif
  8239. #ifdef WOLFSSL_KEIL
  8240. "adcs r4, r4, %[r]\n\t"
  8241. #elif defined(__clang__)
  8242. "adcs r4, %[r]\n\t"
  8243. #else
  8244. "adc r4, %[r]\n\t"
  8245. #endif
  8246. "uxth r7, %[b]\n\t"
  8247. #ifdef WOLFSSL_KEIL
  8248. "muls r6, r7, r6\n\t"
  8249. #elif defined(__clang__)
  8250. "muls r6, r7\n\t"
  8251. #else
  8252. "mul r6, r7\n\t"
  8253. #endif
  8254. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8255. "lsrs r7, r6, #16\n\t"
  8256. #else
  8257. "lsr r7, r6, #16\n\t"
  8258. #endif
  8259. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8260. "lsls r6, r6, #16\n\t"
  8261. #else
  8262. "lsl r6, r6, #16\n\t"
  8263. #endif
  8264. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8265. "adds r5, r5, r6\n\t"
  8266. #else
  8267. "add r5, r5, r6\n\t"
  8268. #endif
  8269. #ifdef WOLFSSL_KEIL
  8270. "adcs r3, r3, r7\n\t"
  8271. #elif defined(__clang__)
  8272. "adcs r3, r7\n\t"
  8273. #else
  8274. "adc r3, r7\n\t"
  8275. #endif
  8276. #ifdef WOLFSSL_KEIL
  8277. "adcs r4, r4, %[r]\n\t"
  8278. #elif defined(__clang__)
  8279. "adcs r4, %[r]\n\t"
  8280. #else
  8281. "adc r4, %[r]\n\t"
  8282. #endif
  8283. "# A[6] * B[5]\n\t"
  8284. "mov %[a], r9\n\t"
  8285. "mov %[b], r10\n\t"
  8286. "ldr %[a], [%[a], #24]\n\t"
  8287. "ldr %[b], [%[b], #20]\n\t"
  8288. "uxth r6, %[a]\n\t"
  8289. "uxth r7, %[b]\n\t"
  8290. #ifdef WOLFSSL_KEIL
  8291. "muls r7, r6, r7\n\t"
  8292. #elif defined(__clang__)
  8293. "muls r7, r6\n\t"
  8294. #else
  8295. "mul r7, r6\n\t"
  8296. #endif
  8297. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8298. "adds r5, r5, r7\n\t"
  8299. #else
  8300. "add r5, r5, r7\n\t"
  8301. #endif
  8302. #ifdef WOLFSSL_KEIL
  8303. "adcs r3, r3, %[r]\n\t"
  8304. #elif defined(__clang__)
  8305. "adcs r3, %[r]\n\t"
  8306. #else
  8307. "adc r3, %[r]\n\t"
  8308. #endif
  8309. #ifdef WOLFSSL_KEIL
  8310. "adcs r4, r4, %[r]\n\t"
  8311. #elif defined(__clang__)
  8312. "adcs r4, %[r]\n\t"
  8313. #else
  8314. "adc r4, %[r]\n\t"
  8315. #endif
  8316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8317. "lsrs r7, %[b], #16\n\t"
  8318. #else
  8319. "lsr r7, %[b], #16\n\t"
  8320. #endif
  8321. #ifdef WOLFSSL_KEIL
  8322. "muls r6, r7, r6\n\t"
  8323. #elif defined(__clang__)
  8324. "muls r6, r7\n\t"
  8325. #else
  8326. "mul r6, r7\n\t"
  8327. #endif
  8328. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8329. "lsrs r7, r6, #16\n\t"
  8330. #else
  8331. "lsr r7, r6, #16\n\t"
  8332. #endif
  8333. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8334. "lsls r6, r6, #16\n\t"
  8335. #else
  8336. "lsl r6, r6, #16\n\t"
  8337. #endif
  8338. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8339. "adds r5, r5, r6\n\t"
  8340. #else
  8341. "add r5, r5, r6\n\t"
  8342. #endif
  8343. #ifdef WOLFSSL_KEIL
  8344. "adcs r3, r3, r7\n\t"
  8345. #elif defined(__clang__)
  8346. "adcs r3, r7\n\t"
  8347. #else
  8348. "adc r3, r7\n\t"
  8349. #endif
  8350. #ifdef WOLFSSL_KEIL
  8351. "adcs r4, r4, %[r]\n\t"
  8352. #elif defined(__clang__)
  8353. "adcs r4, %[r]\n\t"
  8354. #else
  8355. "adc r4, %[r]\n\t"
  8356. #endif
  8357. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8358. "lsrs r6, %[a], #16\n\t"
  8359. #else
  8360. "lsr r6, %[a], #16\n\t"
  8361. #endif
  8362. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8363. "lsrs r7, %[b], #16\n\t"
  8364. #else
  8365. "lsr r7, %[b], #16\n\t"
  8366. #endif
  8367. #ifdef WOLFSSL_KEIL
  8368. "muls r7, r6, r7\n\t"
  8369. #elif defined(__clang__)
  8370. "muls r7, r6\n\t"
  8371. #else
  8372. "mul r7, r6\n\t"
  8373. #endif
  8374. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8375. "adds r3, r3, r7\n\t"
  8376. #else
  8377. "add r3, r3, r7\n\t"
  8378. #endif
  8379. #ifdef WOLFSSL_KEIL
  8380. "adcs r4, r4, %[r]\n\t"
  8381. #elif defined(__clang__)
  8382. "adcs r4, %[r]\n\t"
  8383. #else
  8384. "adc r4, %[r]\n\t"
  8385. #endif
  8386. "uxth r7, %[b]\n\t"
  8387. #ifdef WOLFSSL_KEIL
  8388. "muls r6, r7, r6\n\t"
  8389. #elif defined(__clang__)
  8390. "muls r6, r7\n\t"
  8391. #else
  8392. "mul r6, r7\n\t"
  8393. #endif
  8394. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8395. "lsrs r7, r6, #16\n\t"
  8396. #else
  8397. "lsr r7, r6, #16\n\t"
  8398. #endif
  8399. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8400. "lsls r6, r6, #16\n\t"
  8401. #else
  8402. "lsl r6, r6, #16\n\t"
  8403. #endif
  8404. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8405. "adds r5, r5, r6\n\t"
  8406. #else
  8407. "add r5, r5, r6\n\t"
  8408. #endif
  8409. #ifdef WOLFSSL_KEIL
  8410. "adcs r3, r3, r7\n\t"
  8411. #elif defined(__clang__)
  8412. "adcs r3, r7\n\t"
  8413. #else
  8414. "adc r3, r7\n\t"
  8415. #endif
  8416. #ifdef WOLFSSL_KEIL
  8417. "adcs r4, r4, %[r]\n\t"
  8418. #elif defined(__clang__)
  8419. "adcs r4, %[r]\n\t"
  8420. #else
  8421. "adc r4, %[r]\n\t"
  8422. #endif
  8423. "# A[7] * B[4]\n\t"
  8424. "mov %[a], r9\n\t"
  8425. "mov %[b], r10\n\t"
  8426. "ldr %[a], [%[a], #28]\n\t"
  8427. "ldr %[b], [%[b], #16]\n\t"
  8428. "uxth r6, %[a]\n\t"
  8429. "uxth r7, %[b]\n\t"
  8430. #ifdef WOLFSSL_KEIL
  8431. "muls r7, r6, r7\n\t"
  8432. #elif defined(__clang__)
  8433. "muls r7, r6\n\t"
  8434. #else
  8435. "mul r7, r6\n\t"
  8436. #endif
  8437. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8438. "adds r5, r5, r7\n\t"
  8439. #else
  8440. "add r5, r5, r7\n\t"
  8441. #endif
  8442. #ifdef WOLFSSL_KEIL
  8443. "adcs r3, r3, %[r]\n\t"
  8444. #elif defined(__clang__)
  8445. "adcs r3, %[r]\n\t"
  8446. #else
  8447. "adc r3, %[r]\n\t"
  8448. #endif
  8449. #ifdef WOLFSSL_KEIL
  8450. "adcs r4, r4, %[r]\n\t"
  8451. #elif defined(__clang__)
  8452. "adcs r4, %[r]\n\t"
  8453. #else
  8454. "adc r4, %[r]\n\t"
  8455. #endif
  8456. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8457. "lsrs r7, %[b], #16\n\t"
  8458. #else
  8459. "lsr r7, %[b], #16\n\t"
  8460. #endif
  8461. #ifdef WOLFSSL_KEIL
  8462. "muls r6, r7, r6\n\t"
  8463. #elif defined(__clang__)
  8464. "muls r6, r7\n\t"
  8465. #else
  8466. "mul r6, r7\n\t"
  8467. #endif
  8468. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8469. "lsrs r7, r6, #16\n\t"
  8470. #else
  8471. "lsr r7, r6, #16\n\t"
  8472. #endif
  8473. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8474. "lsls r6, r6, #16\n\t"
  8475. #else
  8476. "lsl r6, r6, #16\n\t"
  8477. #endif
  8478. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8479. "adds r5, r5, r6\n\t"
  8480. #else
  8481. "add r5, r5, r6\n\t"
  8482. #endif
  8483. #ifdef WOLFSSL_KEIL
  8484. "adcs r3, r3, r7\n\t"
  8485. #elif defined(__clang__)
  8486. "adcs r3, r7\n\t"
  8487. #else
  8488. "adc r3, r7\n\t"
  8489. #endif
  8490. #ifdef WOLFSSL_KEIL
  8491. "adcs r4, r4, %[r]\n\t"
  8492. #elif defined(__clang__)
  8493. "adcs r4, %[r]\n\t"
  8494. #else
  8495. "adc r4, %[r]\n\t"
  8496. #endif
  8497. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8498. "lsrs r6, %[a], #16\n\t"
  8499. #else
  8500. "lsr r6, %[a], #16\n\t"
  8501. #endif
  8502. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8503. "lsrs r7, %[b], #16\n\t"
  8504. #else
  8505. "lsr r7, %[b], #16\n\t"
  8506. #endif
  8507. #ifdef WOLFSSL_KEIL
  8508. "muls r7, r6, r7\n\t"
  8509. #elif defined(__clang__)
  8510. "muls r7, r6\n\t"
  8511. #else
  8512. "mul r7, r6\n\t"
  8513. #endif
  8514. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8515. "adds r3, r3, r7\n\t"
  8516. #else
  8517. "add r3, r3, r7\n\t"
  8518. #endif
  8519. #ifdef WOLFSSL_KEIL
  8520. "adcs r4, r4, %[r]\n\t"
  8521. #elif defined(__clang__)
  8522. "adcs r4, %[r]\n\t"
  8523. #else
  8524. "adc r4, %[r]\n\t"
  8525. #endif
  8526. "uxth r7, %[b]\n\t"
  8527. #ifdef WOLFSSL_KEIL
  8528. "muls r6, r7, r6\n\t"
  8529. #elif defined(__clang__)
  8530. "muls r6, r7\n\t"
  8531. #else
  8532. "mul r6, r7\n\t"
  8533. #endif
  8534. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8535. "lsrs r7, r6, #16\n\t"
  8536. #else
  8537. "lsr r7, r6, #16\n\t"
  8538. #endif
  8539. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8540. "lsls r6, r6, #16\n\t"
  8541. #else
  8542. "lsl r6, r6, #16\n\t"
  8543. #endif
  8544. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8545. "adds r5, r5, r6\n\t"
  8546. #else
  8547. "add r5, r5, r6\n\t"
  8548. #endif
  8549. #ifdef WOLFSSL_KEIL
  8550. "adcs r3, r3, r7\n\t"
  8551. #elif defined(__clang__)
  8552. "adcs r3, r7\n\t"
  8553. #else
  8554. "adc r3, r7\n\t"
  8555. #endif
  8556. #ifdef WOLFSSL_KEIL
  8557. "adcs r4, r4, %[r]\n\t"
  8558. #elif defined(__clang__)
  8559. "adcs r4, %[r]\n\t"
  8560. #else
  8561. "adc r4, %[r]\n\t"
  8562. #endif
  8563. "mov %[r], r8\n\t"
  8564. "str r5, [%[r], #44]\n\t"
  8565. "movs %[r], #0\n\t"
  8566. "# A[7] * B[5]\n\t"
  8567. "movs r5, #0\n\t"
  8568. "mov %[a], r9\n\t"
  8569. "mov %[b], r10\n\t"
  8570. "ldr %[a], [%[a], #28]\n\t"
  8571. "ldr %[b], [%[b], #20]\n\t"
  8572. "uxth r6, %[a]\n\t"
  8573. "uxth r7, %[b]\n\t"
  8574. #ifdef WOLFSSL_KEIL
  8575. "muls r7, r6, r7\n\t"
  8576. #elif defined(__clang__)
  8577. "muls r7, r6\n\t"
  8578. #else
  8579. "mul r7, r6\n\t"
  8580. #endif
  8581. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8582. "adds r3, r3, r7\n\t"
  8583. #else
  8584. "add r3, r3, r7\n\t"
  8585. #endif
  8586. #ifdef WOLFSSL_KEIL
  8587. "adcs r4, r4, %[r]\n\t"
  8588. #elif defined(__clang__)
  8589. "adcs r4, %[r]\n\t"
  8590. #else
  8591. "adc r4, %[r]\n\t"
  8592. #endif
  8593. #ifdef WOLFSSL_KEIL
  8594. "adcs r5, r5, %[r]\n\t"
  8595. #elif defined(__clang__)
  8596. "adcs r5, %[r]\n\t"
  8597. #else
  8598. "adc r5, %[r]\n\t"
  8599. #endif
  8600. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8601. "lsrs r7, %[b], #16\n\t"
  8602. #else
  8603. "lsr r7, %[b], #16\n\t"
  8604. #endif
  8605. #ifdef WOLFSSL_KEIL
  8606. "muls r6, r7, r6\n\t"
  8607. #elif defined(__clang__)
  8608. "muls r6, r7\n\t"
  8609. #else
  8610. "mul r6, r7\n\t"
  8611. #endif
  8612. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8613. "lsrs r7, r6, #16\n\t"
  8614. #else
  8615. "lsr r7, r6, #16\n\t"
  8616. #endif
  8617. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8618. "lsls r6, r6, #16\n\t"
  8619. #else
  8620. "lsl r6, r6, #16\n\t"
  8621. #endif
  8622. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8623. "adds r3, r3, r6\n\t"
  8624. #else
  8625. "add r3, r3, r6\n\t"
  8626. #endif
  8627. #ifdef WOLFSSL_KEIL
  8628. "adcs r4, r4, r7\n\t"
  8629. #elif defined(__clang__)
  8630. "adcs r4, r7\n\t"
  8631. #else
  8632. "adc r4, r7\n\t"
  8633. #endif
  8634. #ifdef WOLFSSL_KEIL
  8635. "adcs r5, r5, %[r]\n\t"
  8636. #elif defined(__clang__)
  8637. "adcs r5, %[r]\n\t"
  8638. #else
  8639. "adc r5, %[r]\n\t"
  8640. #endif
  8641. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8642. "lsrs r6, %[a], #16\n\t"
  8643. #else
  8644. "lsr r6, %[a], #16\n\t"
  8645. #endif
  8646. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8647. "lsrs r7, %[b], #16\n\t"
  8648. #else
  8649. "lsr r7, %[b], #16\n\t"
  8650. #endif
  8651. #ifdef WOLFSSL_KEIL
  8652. "muls r7, r6, r7\n\t"
  8653. #elif defined(__clang__)
  8654. "muls r7, r6\n\t"
  8655. #else
  8656. "mul r7, r6\n\t"
  8657. #endif
  8658. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8659. "adds r4, r4, r7\n\t"
  8660. #else
  8661. "add r4, r4, r7\n\t"
  8662. #endif
  8663. #ifdef WOLFSSL_KEIL
  8664. "adcs r5, r5, %[r]\n\t"
  8665. #elif defined(__clang__)
  8666. "adcs r5, %[r]\n\t"
  8667. #else
  8668. "adc r5, %[r]\n\t"
  8669. #endif
  8670. "uxth r7, %[b]\n\t"
  8671. #ifdef WOLFSSL_KEIL
  8672. "muls r6, r7, r6\n\t"
  8673. #elif defined(__clang__)
  8674. "muls r6, r7\n\t"
  8675. #else
  8676. "mul r6, r7\n\t"
  8677. #endif
  8678. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8679. "lsrs r7, r6, #16\n\t"
  8680. #else
  8681. "lsr r7, r6, #16\n\t"
  8682. #endif
  8683. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8684. "lsls r6, r6, #16\n\t"
  8685. #else
  8686. "lsl r6, r6, #16\n\t"
  8687. #endif
  8688. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8689. "adds r3, r3, r6\n\t"
  8690. #else
  8691. "add r3, r3, r6\n\t"
  8692. #endif
  8693. #ifdef WOLFSSL_KEIL
  8694. "adcs r4, r4, r7\n\t"
  8695. #elif defined(__clang__)
  8696. "adcs r4, r7\n\t"
  8697. #else
  8698. "adc r4, r7\n\t"
  8699. #endif
  8700. #ifdef WOLFSSL_KEIL
  8701. "adcs r5, r5, %[r]\n\t"
  8702. #elif defined(__clang__)
  8703. "adcs r5, %[r]\n\t"
  8704. #else
  8705. "adc r5, %[r]\n\t"
  8706. #endif
  8707. "# A[6] * B[6]\n\t"
  8708. "mov %[a], r9\n\t"
  8709. "mov %[b], r10\n\t"
  8710. "ldr %[a], [%[a], #24]\n\t"
  8711. "ldr %[b], [%[b], #24]\n\t"
  8712. "uxth r6, %[a]\n\t"
  8713. "uxth r7, %[b]\n\t"
  8714. #ifdef WOLFSSL_KEIL
  8715. "muls r7, r6, r7\n\t"
  8716. #elif defined(__clang__)
  8717. "muls r7, r6\n\t"
  8718. #else
  8719. "mul r7, r6\n\t"
  8720. #endif
  8721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8722. "adds r3, r3, r7\n\t"
  8723. #else
  8724. "add r3, r3, r7\n\t"
  8725. #endif
  8726. #ifdef WOLFSSL_KEIL
  8727. "adcs r4, r4, %[r]\n\t"
  8728. #elif defined(__clang__)
  8729. "adcs r4, %[r]\n\t"
  8730. #else
  8731. "adc r4, %[r]\n\t"
  8732. #endif
  8733. #ifdef WOLFSSL_KEIL
  8734. "adcs r5, r5, %[r]\n\t"
  8735. #elif defined(__clang__)
  8736. "adcs r5, %[r]\n\t"
  8737. #else
  8738. "adc r5, %[r]\n\t"
  8739. #endif
  8740. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8741. "lsrs r7, %[b], #16\n\t"
  8742. #else
  8743. "lsr r7, %[b], #16\n\t"
  8744. #endif
  8745. #ifdef WOLFSSL_KEIL
  8746. "muls r6, r7, r6\n\t"
  8747. #elif defined(__clang__)
  8748. "muls r6, r7\n\t"
  8749. #else
  8750. "mul r6, r7\n\t"
  8751. #endif
  8752. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8753. "lsrs r7, r6, #16\n\t"
  8754. #else
  8755. "lsr r7, r6, #16\n\t"
  8756. #endif
  8757. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8758. "lsls r6, r6, #16\n\t"
  8759. #else
  8760. "lsl r6, r6, #16\n\t"
  8761. #endif
  8762. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8763. "adds r3, r3, r6\n\t"
  8764. #else
  8765. "add r3, r3, r6\n\t"
  8766. #endif
  8767. #ifdef WOLFSSL_KEIL
  8768. "adcs r4, r4, r7\n\t"
  8769. #elif defined(__clang__)
  8770. "adcs r4, r7\n\t"
  8771. #else
  8772. "adc r4, r7\n\t"
  8773. #endif
  8774. #ifdef WOLFSSL_KEIL
  8775. "adcs r5, r5, %[r]\n\t"
  8776. #elif defined(__clang__)
  8777. "adcs r5, %[r]\n\t"
  8778. #else
  8779. "adc r5, %[r]\n\t"
  8780. #endif
  8781. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8782. "lsrs r6, %[a], #16\n\t"
  8783. #else
  8784. "lsr r6, %[a], #16\n\t"
  8785. #endif
  8786. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8787. "lsrs r7, %[b], #16\n\t"
  8788. #else
  8789. "lsr r7, %[b], #16\n\t"
  8790. #endif
  8791. #ifdef WOLFSSL_KEIL
  8792. "muls r7, r6, r7\n\t"
  8793. #elif defined(__clang__)
  8794. "muls r7, r6\n\t"
  8795. #else
  8796. "mul r7, r6\n\t"
  8797. #endif
  8798. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8799. "adds r4, r4, r7\n\t"
  8800. #else
  8801. "add r4, r4, r7\n\t"
  8802. #endif
  8803. #ifdef WOLFSSL_KEIL
  8804. "adcs r5, r5, %[r]\n\t"
  8805. #elif defined(__clang__)
  8806. "adcs r5, %[r]\n\t"
  8807. #else
  8808. "adc r5, %[r]\n\t"
  8809. #endif
  8810. "uxth r7, %[b]\n\t"
  8811. #ifdef WOLFSSL_KEIL
  8812. "muls r6, r7, r6\n\t"
  8813. #elif defined(__clang__)
  8814. "muls r6, r7\n\t"
  8815. #else
  8816. "mul r6, r7\n\t"
  8817. #endif
  8818. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8819. "lsrs r7, r6, #16\n\t"
  8820. #else
  8821. "lsr r7, r6, #16\n\t"
  8822. #endif
  8823. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8824. "lsls r6, r6, #16\n\t"
  8825. #else
  8826. "lsl r6, r6, #16\n\t"
  8827. #endif
  8828. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8829. "adds r3, r3, r6\n\t"
  8830. #else
  8831. "add r3, r3, r6\n\t"
  8832. #endif
  8833. #ifdef WOLFSSL_KEIL
  8834. "adcs r4, r4, r7\n\t"
  8835. #elif defined(__clang__)
  8836. "adcs r4, r7\n\t"
  8837. #else
  8838. "adc r4, r7\n\t"
  8839. #endif
  8840. #ifdef WOLFSSL_KEIL
  8841. "adcs r5, r5, %[r]\n\t"
  8842. #elif defined(__clang__)
  8843. "adcs r5, %[r]\n\t"
  8844. #else
  8845. "adc r5, %[r]\n\t"
  8846. #endif
  8847. "# A[5] * B[7]\n\t"
  8848. "mov %[a], r9\n\t"
  8849. "mov %[b], r10\n\t"
  8850. "ldr %[a], [%[a], #20]\n\t"
  8851. "ldr %[b], [%[b], #28]\n\t"
  8852. "uxth r6, %[a]\n\t"
  8853. "uxth r7, %[b]\n\t"
  8854. #ifdef WOLFSSL_KEIL
  8855. "muls r7, r6, r7\n\t"
  8856. #elif defined(__clang__)
  8857. "muls r7, r6\n\t"
  8858. #else
  8859. "mul r7, r6\n\t"
  8860. #endif
  8861. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8862. "adds r3, r3, r7\n\t"
  8863. #else
  8864. "add r3, r3, r7\n\t"
  8865. #endif
  8866. #ifdef WOLFSSL_KEIL
  8867. "adcs r4, r4, %[r]\n\t"
  8868. #elif defined(__clang__)
  8869. "adcs r4, %[r]\n\t"
  8870. #else
  8871. "adc r4, %[r]\n\t"
  8872. #endif
  8873. #ifdef WOLFSSL_KEIL
  8874. "adcs r5, r5, %[r]\n\t"
  8875. #elif defined(__clang__)
  8876. "adcs r5, %[r]\n\t"
  8877. #else
  8878. "adc r5, %[r]\n\t"
  8879. #endif
  8880. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8881. "lsrs r7, %[b], #16\n\t"
  8882. #else
  8883. "lsr r7, %[b], #16\n\t"
  8884. #endif
  8885. #ifdef WOLFSSL_KEIL
  8886. "muls r6, r7, r6\n\t"
  8887. #elif defined(__clang__)
  8888. "muls r6, r7\n\t"
  8889. #else
  8890. "mul r6, r7\n\t"
  8891. #endif
  8892. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8893. "lsrs r7, r6, #16\n\t"
  8894. #else
  8895. "lsr r7, r6, #16\n\t"
  8896. #endif
  8897. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8898. "lsls r6, r6, #16\n\t"
  8899. #else
  8900. "lsl r6, r6, #16\n\t"
  8901. #endif
  8902. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8903. "adds r3, r3, r6\n\t"
  8904. #else
  8905. "add r3, r3, r6\n\t"
  8906. #endif
  8907. #ifdef WOLFSSL_KEIL
  8908. "adcs r4, r4, r7\n\t"
  8909. #elif defined(__clang__)
  8910. "adcs r4, r7\n\t"
  8911. #else
  8912. "adc r4, r7\n\t"
  8913. #endif
  8914. #ifdef WOLFSSL_KEIL
  8915. "adcs r5, r5, %[r]\n\t"
  8916. #elif defined(__clang__)
  8917. "adcs r5, %[r]\n\t"
  8918. #else
  8919. "adc r5, %[r]\n\t"
  8920. #endif
  8921. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8922. "lsrs r6, %[a], #16\n\t"
  8923. #else
  8924. "lsr r6, %[a], #16\n\t"
  8925. #endif
  8926. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8927. "lsrs r7, %[b], #16\n\t"
  8928. #else
  8929. "lsr r7, %[b], #16\n\t"
  8930. #endif
  8931. #ifdef WOLFSSL_KEIL
  8932. "muls r7, r6, r7\n\t"
  8933. #elif defined(__clang__)
  8934. "muls r7, r6\n\t"
  8935. #else
  8936. "mul r7, r6\n\t"
  8937. #endif
  8938. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8939. "adds r4, r4, r7\n\t"
  8940. #else
  8941. "add r4, r4, r7\n\t"
  8942. #endif
  8943. #ifdef WOLFSSL_KEIL
  8944. "adcs r5, r5, %[r]\n\t"
  8945. #elif defined(__clang__)
  8946. "adcs r5, %[r]\n\t"
  8947. #else
  8948. "adc r5, %[r]\n\t"
  8949. #endif
  8950. "uxth r7, %[b]\n\t"
  8951. #ifdef WOLFSSL_KEIL
  8952. "muls r6, r7, r6\n\t"
  8953. #elif defined(__clang__)
  8954. "muls r6, r7\n\t"
  8955. #else
  8956. "mul r6, r7\n\t"
  8957. #endif
  8958. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8959. "lsrs r7, r6, #16\n\t"
  8960. #else
  8961. "lsr r7, r6, #16\n\t"
  8962. #endif
  8963. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8964. "lsls r6, r6, #16\n\t"
  8965. #else
  8966. "lsl r6, r6, #16\n\t"
  8967. #endif
  8968. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8969. "adds r3, r3, r6\n\t"
  8970. #else
  8971. "add r3, r3, r6\n\t"
  8972. #endif
  8973. #ifdef WOLFSSL_KEIL
  8974. "adcs r4, r4, r7\n\t"
  8975. #elif defined(__clang__)
  8976. "adcs r4, r7\n\t"
  8977. #else
  8978. "adc r4, r7\n\t"
  8979. #endif
  8980. #ifdef WOLFSSL_KEIL
  8981. "adcs r5, r5, %[r]\n\t"
  8982. #elif defined(__clang__)
  8983. "adcs r5, %[r]\n\t"
  8984. #else
  8985. "adc r5, %[r]\n\t"
  8986. #endif
  8987. "mov %[r], r8\n\t"
  8988. "str r3, [%[r], #48]\n\t"
  8989. "movs %[r], #0\n\t"
  8990. "# A[6] * B[7]\n\t"
  8991. "movs r3, #0\n\t"
  8992. "mov %[a], r9\n\t"
  8993. "mov %[b], r10\n\t"
  8994. "ldr %[a], [%[a], #24]\n\t"
  8995. "ldr %[b], [%[b], #28]\n\t"
  8996. "uxth r6, %[a]\n\t"
  8997. "uxth r7, %[b]\n\t"
  8998. #ifdef WOLFSSL_KEIL
  8999. "muls r7, r6, r7\n\t"
  9000. #elif defined(__clang__)
  9001. "muls r7, r6\n\t"
  9002. #else
  9003. "mul r7, r6\n\t"
  9004. #endif
  9005. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9006. "adds r4, r4, r7\n\t"
  9007. #else
  9008. "add r4, r4, r7\n\t"
  9009. #endif
  9010. #ifdef WOLFSSL_KEIL
  9011. "adcs r5, r5, %[r]\n\t"
  9012. #elif defined(__clang__)
  9013. "adcs r5, %[r]\n\t"
  9014. #else
  9015. "adc r5, %[r]\n\t"
  9016. #endif
  9017. #ifdef WOLFSSL_KEIL
  9018. "adcs r3, r3, %[r]\n\t"
  9019. #elif defined(__clang__)
  9020. "adcs r3, %[r]\n\t"
  9021. #else
  9022. "adc r3, %[r]\n\t"
  9023. #endif
  9024. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9025. "lsrs r7, %[b], #16\n\t"
  9026. #else
  9027. "lsr r7, %[b], #16\n\t"
  9028. #endif
  9029. #ifdef WOLFSSL_KEIL
  9030. "muls r6, r7, r6\n\t"
  9031. #elif defined(__clang__)
  9032. "muls r6, r7\n\t"
  9033. #else
  9034. "mul r6, r7\n\t"
  9035. #endif
  9036. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9037. "lsrs r7, r6, #16\n\t"
  9038. #else
  9039. "lsr r7, r6, #16\n\t"
  9040. #endif
  9041. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9042. "lsls r6, r6, #16\n\t"
  9043. #else
  9044. "lsl r6, r6, #16\n\t"
  9045. #endif
  9046. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9047. "adds r4, r4, r6\n\t"
  9048. #else
  9049. "add r4, r4, r6\n\t"
  9050. #endif
  9051. #ifdef WOLFSSL_KEIL
  9052. "adcs r5, r5, r7\n\t"
  9053. #elif defined(__clang__)
  9054. "adcs r5, r7\n\t"
  9055. #else
  9056. "adc r5, r7\n\t"
  9057. #endif
  9058. #ifdef WOLFSSL_KEIL
  9059. "adcs r3, r3, %[r]\n\t"
  9060. #elif defined(__clang__)
  9061. "adcs r3, %[r]\n\t"
  9062. #else
  9063. "adc r3, %[r]\n\t"
  9064. #endif
  9065. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9066. "lsrs r6, %[a], #16\n\t"
  9067. #else
  9068. "lsr r6, %[a], #16\n\t"
  9069. #endif
  9070. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9071. "lsrs r7, %[b], #16\n\t"
  9072. #else
  9073. "lsr r7, %[b], #16\n\t"
  9074. #endif
  9075. #ifdef WOLFSSL_KEIL
  9076. "muls r7, r6, r7\n\t"
  9077. #elif defined(__clang__)
  9078. "muls r7, r6\n\t"
  9079. #else
  9080. "mul r7, r6\n\t"
  9081. #endif
  9082. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9083. "adds r5, r5, r7\n\t"
  9084. #else
  9085. "add r5, r5, r7\n\t"
  9086. #endif
  9087. #ifdef WOLFSSL_KEIL
  9088. "adcs r3, r3, %[r]\n\t"
  9089. #elif defined(__clang__)
  9090. "adcs r3, %[r]\n\t"
  9091. #else
  9092. "adc r3, %[r]\n\t"
  9093. #endif
  9094. "uxth r7, %[b]\n\t"
  9095. #ifdef WOLFSSL_KEIL
  9096. "muls r6, r7, r6\n\t"
  9097. #elif defined(__clang__)
  9098. "muls r6, r7\n\t"
  9099. #else
  9100. "mul r6, r7\n\t"
  9101. #endif
  9102. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9103. "lsrs r7, r6, #16\n\t"
  9104. #else
  9105. "lsr r7, r6, #16\n\t"
  9106. #endif
  9107. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9108. "lsls r6, r6, #16\n\t"
  9109. #else
  9110. "lsl r6, r6, #16\n\t"
  9111. #endif
  9112. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9113. "adds r4, r4, r6\n\t"
  9114. #else
  9115. "add r4, r4, r6\n\t"
  9116. #endif
  9117. #ifdef WOLFSSL_KEIL
  9118. "adcs r5, r5, r7\n\t"
  9119. #elif defined(__clang__)
  9120. "adcs r5, r7\n\t"
  9121. #else
  9122. "adc r5, r7\n\t"
  9123. #endif
  9124. #ifdef WOLFSSL_KEIL
  9125. "adcs r3, r3, %[r]\n\t"
  9126. #elif defined(__clang__)
  9127. "adcs r3, %[r]\n\t"
  9128. #else
  9129. "adc r3, %[r]\n\t"
  9130. #endif
  9131. "# A[7] * B[6]\n\t"
  9132. "mov %[a], r9\n\t"
  9133. "mov %[b], r10\n\t"
  9134. "ldr %[a], [%[a], #28]\n\t"
  9135. "ldr %[b], [%[b], #24]\n\t"
  9136. "uxth r6, %[a]\n\t"
  9137. "uxth r7, %[b]\n\t"
  9138. #ifdef WOLFSSL_KEIL
  9139. "muls r7, r6, r7\n\t"
  9140. #elif defined(__clang__)
  9141. "muls r7, r6\n\t"
  9142. #else
  9143. "mul r7, r6\n\t"
  9144. #endif
  9145. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9146. "adds r4, r4, r7\n\t"
  9147. #else
  9148. "add r4, r4, r7\n\t"
  9149. #endif
  9150. #ifdef WOLFSSL_KEIL
  9151. "adcs r5, r5, %[r]\n\t"
  9152. #elif defined(__clang__)
  9153. "adcs r5, %[r]\n\t"
  9154. #else
  9155. "adc r5, %[r]\n\t"
  9156. #endif
  9157. #ifdef WOLFSSL_KEIL
  9158. "adcs r3, r3, %[r]\n\t"
  9159. #elif defined(__clang__)
  9160. "adcs r3, %[r]\n\t"
  9161. #else
  9162. "adc r3, %[r]\n\t"
  9163. #endif
  9164. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9165. "lsrs r7, %[b], #16\n\t"
  9166. #else
  9167. "lsr r7, %[b], #16\n\t"
  9168. #endif
  9169. #ifdef WOLFSSL_KEIL
  9170. "muls r6, r7, r6\n\t"
  9171. #elif defined(__clang__)
  9172. "muls r6, r7\n\t"
  9173. #else
  9174. "mul r6, r7\n\t"
  9175. #endif
  9176. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9177. "lsrs r7, r6, #16\n\t"
  9178. #else
  9179. "lsr r7, r6, #16\n\t"
  9180. #endif
  9181. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9182. "lsls r6, r6, #16\n\t"
  9183. #else
  9184. "lsl r6, r6, #16\n\t"
  9185. #endif
  9186. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9187. "adds r4, r4, r6\n\t"
  9188. #else
  9189. "add r4, r4, r6\n\t"
  9190. #endif
  9191. #ifdef WOLFSSL_KEIL
  9192. "adcs r5, r5, r7\n\t"
  9193. #elif defined(__clang__)
  9194. "adcs r5, r7\n\t"
  9195. #else
  9196. "adc r5, r7\n\t"
  9197. #endif
  9198. #ifdef WOLFSSL_KEIL
  9199. "adcs r3, r3, %[r]\n\t"
  9200. #elif defined(__clang__)
  9201. "adcs r3, %[r]\n\t"
  9202. #else
  9203. "adc r3, %[r]\n\t"
  9204. #endif
  9205. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9206. "lsrs r6, %[a], #16\n\t"
  9207. #else
  9208. "lsr r6, %[a], #16\n\t"
  9209. #endif
  9210. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9211. "lsrs r7, %[b], #16\n\t"
  9212. #else
  9213. "lsr r7, %[b], #16\n\t"
  9214. #endif
  9215. #ifdef WOLFSSL_KEIL
  9216. "muls r7, r6, r7\n\t"
  9217. #elif defined(__clang__)
  9218. "muls r7, r6\n\t"
  9219. #else
  9220. "mul r7, r6\n\t"
  9221. #endif
  9222. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9223. "adds r5, r5, r7\n\t"
  9224. #else
  9225. "add r5, r5, r7\n\t"
  9226. #endif
  9227. #ifdef WOLFSSL_KEIL
  9228. "adcs r3, r3, %[r]\n\t"
  9229. #elif defined(__clang__)
  9230. "adcs r3, %[r]\n\t"
  9231. #else
  9232. "adc r3, %[r]\n\t"
  9233. #endif
  9234. "uxth r7, %[b]\n\t"
  9235. #ifdef WOLFSSL_KEIL
  9236. "muls r6, r7, r6\n\t"
  9237. #elif defined(__clang__)
  9238. "muls r6, r7\n\t"
  9239. #else
  9240. "mul r6, r7\n\t"
  9241. #endif
  9242. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9243. "lsrs r7, r6, #16\n\t"
  9244. #else
  9245. "lsr r7, r6, #16\n\t"
  9246. #endif
  9247. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9248. "lsls r6, r6, #16\n\t"
  9249. #else
  9250. "lsl r6, r6, #16\n\t"
  9251. #endif
  9252. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9253. "adds r4, r4, r6\n\t"
  9254. #else
  9255. "add r4, r4, r6\n\t"
  9256. #endif
  9257. #ifdef WOLFSSL_KEIL
  9258. "adcs r5, r5, r7\n\t"
  9259. #elif defined(__clang__)
  9260. "adcs r5, r7\n\t"
  9261. #else
  9262. "adc r5, r7\n\t"
  9263. #endif
  9264. #ifdef WOLFSSL_KEIL
  9265. "adcs r3, r3, %[r]\n\t"
  9266. #elif defined(__clang__)
  9267. "adcs r3, %[r]\n\t"
  9268. #else
  9269. "adc r3, %[r]\n\t"
  9270. #endif
  9271. "mov %[r], r8\n\t"
  9272. "str r4, [%[r], #52]\n\t"
  9273. "movs %[r], #0\n\t"
  9274. "# A[7] * B[7]\n\t"
  9275. "mov %[a], r9\n\t"
  9276. "mov %[b], r10\n\t"
  9277. "ldr %[a], [%[a], #28]\n\t"
  9278. "ldr %[b], [%[b], #28]\n\t"
  9279. "uxth r6, %[a]\n\t"
  9280. "uxth r7, %[b]\n\t"
  9281. #ifdef WOLFSSL_KEIL
  9282. "muls r7, r6, r7\n\t"
  9283. #elif defined(__clang__)
  9284. "muls r7, r6\n\t"
  9285. #else
  9286. "mul r7, r6\n\t"
  9287. #endif
  9288. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9289. "adds r5, r5, r7\n\t"
  9290. #else
  9291. "add r5, r5, r7\n\t"
  9292. #endif
  9293. #ifdef WOLFSSL_KEIL
  9294. "adcs r3, r3, %[r]\n\t"
  9295. #elif defined(__clang__)
  9296. "adcs r3, %[r]\n\t"
  9297. #else
  9298. "adc r3, %[r]\n\t"
  9299. #endif
  9300. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9301. "lsrs r7, %[b], #16\n\t"
  9302. #else
  9303. "lsr r7, %[b], #16\n\t"
  9304. #endif
  9305. #ifdef WOLFSSL_KEIL
  9306. "muls r6, r7, r6\n\t"
  9307. #elif defined(__clang__)
  9308. "muls r6, r7\n\t"
  9309. #else
  9310. "mul r6, r7\n\t"
  9311. #endif
  9312. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9313. "lsrs r7, r6, #16\n\t"
  9314. #else
  9315. "lsr r7, r6, #16\n\t"
  9316. #endif
  9317. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9318. "lsls r6, r6, #16\n\t"
  9319. #else
  9320. "lsl r6, r6, #16\n\t"
  9321. #endif
  9322. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9323. "adds r5, r5, r6\n\t"
  9324. #else
  9325. "add r5, r5, r6\n\t"
  9326. #endif
  9327. #ifdef WOLFSSL_KEIL
  9328. "adcs r3, r3, r7\n\t"
  9329. #elif defined(__clang__)
  9330. "adcs r3, r7\n\t"
  9331. #else
  9332. "adc r3, r7\n\t"
  9333. #endif
  9334. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9335. "lsrs r6, %[a], #16\n\t"
  9336. #else
  9337. "lsr r6, %[a], #16\n\t"
  9338. #endif
  9339. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9340. "lsrs r7, %[b], #16\n\t"
  9341. #else
  9342. "lsr r7, %[b], #16\n\t"
  9343. #endif
  9344. #ifdef WOLFSSL_KEIL
  9345. "muls r7, r6, r7\n\t"
  9346. #elif defined(__clang__)
  9347. "muls r7, r6\n\t"
  9348. #else
  9349. "mul r7, r6\n\t"
  9350. #endif
  9351. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9352. "adds r3, r3, r7\n\t"
  9353. #else
  9354. "add r3, r3, r7\n\t"
  9355. #endif
  9356. "uxth r7, %[b]\n\t"
  9357. #ifdef WOLFSSL_KEIL
  9358. "muls r6, r7, r6\n\t"
  9359. #elif defined(__clang__)
  9360. "muls r6, r7\n\t"
  9361. #else
  9362. "mul r6, r7\n\t"
  9363. #endif
  9364. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9365. "lsrs r7, r6, #16\n\t"
  9366. #else
  9367. "lsr r7, r6, #16\n\t"
  9368. #endif
  9369. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9370. "lsls r6, r6, #16\n\t"
  9371. #else
  9372. "lsl r6, r6, #16\n\t"
  9373. #endif
  9374. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9375. "adds r5, r5, r6\n\t"
  9376. #else
  9377. "add r5, r5, r6\n\t"
  9378. #endif
  9379. #ifdef WOLFSSL_KEIL
  9380. "adcs r3, r3, r7\n\t"
  9381. #elif defined(__clang__)
  9382. "adcs r3, r7\n\t"
  9383. #else
  9384. "adc r3, r7\n\t"
  9385. #endif
  9386. "mov %[r], r8\n\t"
  9387. "str r5, [%[r], #56]\n\t"
  9388. "str r3, [%[r], #60]\n\t"
  9389. "pop {r3, r4, r5, r6}\n\t"
  9390. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  9391. "pop {r3, r4, r5, r6}\n\t"
  9392. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  9393. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  9394. :
  9395. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10"
  9396. );
  9397. }
  9398. #endif /* !WOLFSSL_SP_LARGE_CODE */
  9399. /* Add b to a into r. (r = a + b)
  9400. *
  9401. * r A single precision integer.
  9402. * a A single precision integer.
  9403. * b A single precision integer.
  9404. */
  9405. SP_NOINLINE static sp_digit sp_2048_add_8(sp_digit* r, const sp_digit* a,
  9406. const sp_digit* b)
  9407. {
  9408. __asm__ __volatile__ (
  9409. "ldm %[b]!, {r5, r6}\n\t"
  9410. "ldm %[a]!, {r3, r4}\n\t"
  9411. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9412. "adds r3, r3, r5\n\t"
  9413. #else
  9414. "add r3, r3, r5\n\t"
  9415. #endif
  9416. #ifdef WOLFSSL_KEIL
  9417. "adcs r4, r4, r6\n\t"
  9418. #elif defined(__clang__)
  9419. "adcs r4, r6\n\t"
  9420. #else
  9421. "adc r4, r6\n\t"
  9422. #endif
  9423. "stm %[r]!, {r3, r4}\n\t"
  9424. "ldm %[b]!, {r5, r6}\n\t"
  9425. "ldm %[a]!, {r3, r4}\n\t"
  9426. #ifdef WOLFSSL_KEIL
  9427. "adcs r3, r3, r5\n\t"
  9428. #elif defined(__clang__)
  9429. "adcs r3, r5\n\t"
  9430. #else
  9431. "adc r3, r5\n\t"
  9432. #endif
  9433. #ifdef WOLFSSL_KEIL
  9434. "adcs r4, r4, r6\n\t"
  9435. #elif defined(__clang__)
  9436. "adcs r4, r6\n\t"
  9437. #else
  9438. "adc r4, r6\n\t"
  9439. #endif
  9440. "stm %[r]!, {r3, r4}\n\t"
  9441. "ldm %[b]!, {r5, r6}\n\t"
  9442. "ldm %[a]!, {r3, r4}\n\t"
  9443. #ifdef WOLFSSL_KEIL
  9444. "adcs r3, r3, r5\n\t"
  9445. #elif defined(__clang__)
  9446. "adcs r3, r5\n\t"
  9447. #else
  9448. "adc r3, r5\n\t"
  9449. #endif
  9450. #ifdef WOLFSSL_KEIL
  9451. "adcs r4, r4, r6\n\t"
  9452. #elif defined(__clang__)
  9453. "adcs r4, r6\n\t"
  9454. #else
  9455. "adc r4, r6\n\t"
  9456. #endif
  9457. "stm %[r]!, {r3, r4}\n\t"
  9458. "ldm %[b]!, {r5, r6}\n\t"
  9459. "ldm %[a]!, {r3, r4}\n\t"
  9460. #ifdef WOLFSSL_KEIL
  9461. "adcs r3, r3, r5\n\t"
  9462. #elif defined(__clang__)
  9463. "adcs r3, r5\n\t"
  9464. #else
  9465. "adc r3, r5\n\t"
  9466. #endif
  9467. #ifdef WOLFSSL_KEIL
  9468. "adcs r4, r4, r6\n\t"
  9469. #elif defined(__clang__)
  9470. "adcs r4, r6\n\t"
  9471. #else
  9472. "adc r4, r6\n\t"
  9473. #endif
  9474. "stm %[r]!, {r3, r4}\n\t"
  9475. "movs %[r], #0\n\t"
  9476. #ifdef WOLFSSL_KEIL
  9477. "adcs %[r], %[r], %[r]\n\t"
  9478. #elif defined(__clang__)
  9479. "adcs %[r], %[r]\n\t"
  9480. #else
  9481. "adc %[r], %[r]\n\t"
  9482. #endif
  9483. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  9484. :
  9485. : "memory", "r3", "r4", "r5", "r6"
  9486. );
  9487. return (uint32_t)(size_t)r;
  9488. }
  9489. /* Add b to a into r. (r = a + b)
  9490. *
  9491. * r A single precision integer.
  9492. * a A single precision integer.
  9493. * b A single precision integer.
  9494. */
  9495. SP_NOINLINE static sp_digit sp_2048_add_word_8(sp_digit* r, const sp_digit* a,
  9496. sp_digit b)
  9497. {
  9498. __asm__ __volatile__ (
  9499. "movs r5, #0\n\t"
  9500. "ldm %[a]!, {r3, r4}\n\t"
  9501. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9502. "adds r3, r3, %[b]\n\t"
  9503. #else
  9504. "add r3, r3, %[b]\n\t"
  9505. #endif
  9506. #ifdef WOLFSSL_KEIL
  9507. "adcs r4, r4, r5\n\t"
  9508. #elif defined(__clang__)
  9509. "adcs r4, r5\n\t"
  9510. #else
  9511. "adc r4, r5\n\t"
  9512. #endif
  9513. "stm %[r]!, {r3, r4}\n\t"
  9514. "ldm %[a]!, {r3, r4}\n\t"
  9515. #ifdef WOLFSSL_KEIL
  9516. "adcs r3, r3, r5\n\t"
  9517. #elif defined(__clang__)
  9518. "adcs r3, r5\n\t"
  9519. #else
  9520. "adc r3, r5\n\t"
  9521. #endif
  9522. #ifdef WOLFSSL_KEIL
  9523. "adcs r4, r4, r5\n\t"
  9524. #elif defined(__clang__)
  9525. "adcs r4, r5\n\t"
  9526. #else
  9527. "adc r4, r5\n\t"
  9528. #endif
  9529. "stm %[r]!, {r3, r4}\n\t"
  9530. "ldm %[a]!, {r3, r4}\n\t"
  9531. #ifdef WOLFSSL_KEIL
  9532. "adcs r3, r3, r5\n\t"
  9533. #elif defined(__clang__)
  9534. "adcs r3, r5\n\t"
  9535. #else
  9536. "adc r3, r5\n\t"
  9537. #endif
  9538. #ifdef WOLFSSL_KEIL
  9539. "adcs r4, r4, r5\n\t"
  9540. #elif defined(__clang__)
  9541. "adcs r4, r5\n\t"
  9542. #else
  9543. "adc r4, r5\n\t"
  9544. #endif
  9545. "stm %[r]!, {r3, r4}\n\t"
  9546. "ldm %[a]!, {r3, r4}\n\t"
  9547. #ifdef WOLFSSL_KEIL
  9548. "adcs r3, r3, r5\n\t"
  9549. #elif defined(__clang__)
  9550. "adcs r3, r5\n\t"
  9551. #else
  9552. "adc r3, r5\n\t"
  9553. #endif
  9554. #ifdef WOLFSSL_KEIL
  9555. "adcs r4, r4, r5\n\t"
  9556. #elif defined(__clang__)
  9557. "adcs r4, r5\n\t"
  9558. #else
  9559. "adc r4, r5\n\t"
  9560. #endif
  9561. "stm %[r]!, {r3, r4}\n\t"
  9562. "movs %[r], #0\n\t"
  9563. #ifdef WOLFSSL_KEIL
  9564. "adcs %[r], %[r], %[r]\n\t"
  9565. #elif defined(__clang__)
  9566. "adcs %[r], %[r]\n\t"
  9567. #else
  9568. "adc %[r], %[r]\n\t"
  9569. #endif
  9570. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  9571. :
  9572. : "memory", "r3", "r4", "r5"
  9573. );
  9574. return (uint32_t)(size_t)r;
  9575. }
  9576. /* Sub b from a into a. (a -= b)
  9577. *
  9578. * a A single precision integer.
  9579. * b A single precision integer.
  9580. */
  9581. SP_NOINLINE static sp_digit sp_2048_sub_in_place_16(sp_digit* a,
  9582. const sp_digit* b)
  9583. {
  9584. __asm__ __volatile__ (
  9585. "ldm %[b]!, {r4, r5}\n\t"
  9586. "ldr r2, [%[a]]\n\t"
  9587. "ldr r3, [%[a], #4]\n\t"
  9588. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9589. "subs r2, r2, r4\n\t"
  9590. #else
  9591. "sub r2, r2, r4\n\t"
  9592. #endif
  9593. #ifdef WOLFSSL_KEIL
  9594. "sbcs r3, r3, r5\n\t"
  9595. #elif defined(__clang__)
  9596. "sbcs r3, r5\n\t"
  9597. #else
  9598. "sbc r3, r5\n\t"
  9599. #endif
  9600. "stm %[a]!, {r2, r3}\n\t"
  9601. "ldm %[b]!, {r4, r5}\n\t"
  9602. "ldr r2, [%[a]]\n\t"
  9603. "ldr r3, [%[a], #4]\n\t"
  9604. #ifdef WOLFSSL_KEIL
  9605. "sbcs r2, r2, r4\n\t"
  9606. #elif defined(__clang__)
  9607. "sbcs r2, r4\n\t"
  9608. #else
  9609. "sbc r2, r4\n\t"
  9610. #endif
  9611. #ifdef WOLFSSL_KEIL
  9612. "sbcs r3, r3, r5\n\t"
  9613. #elif defined(__clang__)
  9614. "sbcs r3, r5\n\t"
  9615. #else
  9616. "sbc r3, r5\n\t"
  9617. #endif
  9618. "stm %[a]!, {r2, r3}\n\t"
  9619. "ldm %[b]!, {r4, r5}\n\t"
  9620. "ldr r2, [%[a]]\n\t"
  9621. "ldr r3, [%[a], #4]\n\t"
  9622. #ifdef WOLFSSL_KEIL
  9623. "sbcs r2, r2, r4\n\t"
  9624. #elif defined(__clang__)
  9625. "sbcs r2, r4\n\t"
  9626. #else
  9627. "sbc r2, r4\n\t"
  9628. #endif
  9629. #ifdef WOLFSSL_KEIL
  9630. "sbcs r3, r3, r5\n\t"
  9631. #elif defined(__clang__)
  9632. "sbcs r3, r5\n\t"
  9633. #else
  9634. "sbc r3, r5\n\t"
  9635. #endif
  9636. "stm %[a]!, {r2, r3}\n\t"
  9637. "ldm %[b]!, {r4, r5}\n\t"
  9638. "ldr r2, [%[a]]\n\t"
  9639. "ldr r3, [%[a], #4]\n\t"
  9640. #ifdef WOLFSSL_KEIL
  9641. "sbcs r2, r2, r4\n\t"
  9642. #elif defined(__clang__)
  9643. "sbcs r2, r4\n\t"
  9644. #else
  9645. "sbc r2, r4\n\t"
  9646. #endif
  9647. #ifdef WOLFSSL_KEIL
  9648. "sbcs r3, r3, r5\n\t"
  9649. #elif defined(__clang__)
  9650. "sbcs r3, r5\n\t"
  9651. #else
  9652. "sbc r3, r5\n\t"
  9653. #endif
  9654. "stm %[a]!, {r2, r3}\n\t"
  9655. "ldm %[b]!, {r4, r5}\n\t"
  9656. "ldr r2, [%[a]]\n\t"
  9657. "ldr r3, [%[a], #4]\n\t"
  9658. #ifdef WOLFSSL_KEIL
  9659. "sbcs r2, r2, r4\n\t"
  9660. #elif defined(__clang__)
  9661. "sbcs r2, r4\n\t"
  9662. #else
  9663. "sbc r2, r4\n\t"
  9664. #endif
  9665. #ifdef WOLFSSL_KEIL
  9666. "sbcs r3, r3, r5\n\t"
  9667. #elif defined(__clang__)
  9668. "sbcs r3, r5\n\t"
  9669. #else
  9670. "sbc r3, r5\n\t"
  9671. #endif
  9672. "stm %[a]!, {r2, r3}\n\t"
  9673. "ldm %[b]!, {r4, r5}\n\t"
  9674. "ldr r2, [%[a]]\n\t"
  9675. "ldr r3, [%[a], #4]\n\t"
  9676. #ifdef WOLFSSL_KEIL
  9677. "sbcs r2, r2, r4\n\t"
  9678. #elif defined(__clang__)
  9679. "sbcs r2, r4\n\t"
  9680. #else
  9681. "sbc r2, r4\n\t"
  9682. #endif
  9683. #ifdef WOLFSSL_KEIL
  9684. "sbcs r3, r3, r5\n\t"
  9685. #elif defined(__clang__)
  9686. "sbcs r3, r5\n\t"
  9687. #else
  9688. "sbc r3, r5\n\t"
  9689. #endif
  9690. "stm %[a]!, {r2, r3}\n\t"
  9691. "ldm %[b]!, {r4, r5}\n\t"
  9692. "ldr r2, [%[a]]\n\t"
  9693. "ldr r3, [%[a], #4]\n\t"
  9694. #ifdef WOLFSSL_KEIL
  9695. "sbcs r2, r2, r4\n\t"
  9696. #elif defined(__clang__)
  9697. "sbcs r2, r4\n\t"
  9698. #else
  9699. "sbc r2, r4\n\t"
  9700. #endif
  9701. #ifdef WOLFSSL_KEIL
  9702. "sbcs r3, r3, r5\n\t"
  9703. #elif defined(__clang__)
  9704. "sbcs r3, r5\n\t"
  9705. #else
  9706. "sbc r3, r5\n\t"
  9707. #endif
  9708. "stm %[a]!, {r2, r3}\n\t"
  9709. "ldm %[b]!, {r4, r5}\n\t"
  9710. "ldr r2, [%[a]]\n\t"
  9711. "ldr r3, [%[a], #4]\n\t"
  9712. #ifdef WOLFSSL_KEIL
  9713. "sbcs r2, r2, r4\n\t"
  9714. #elif defined(__clang__)
  9715. "sbcs r2, r4\n\t"
  9716. #else
  9717. "sbc r2, r4\n\t"
  9718. #endif
  9719. #ifdef WOLFSSL_KEIL
  9720. "sbcs r3, r3, r5\n\t"
  9721. #elif defined(__clang__)
  9722. "sbcs r3, r5\n\t"
  9723. #else
  9724. "sbc r3, r5\n\t"
  9725. #endif
  9726. "stm %[a]!, {r2, r3}\n\t"
  9727. #ifdef WOLFSSL_KEIL
  9728. "sbcs %[a], %[a], %[a]\n\t"
  9729. #elif defined(__clang__)
  9730. "sbcs %[a], %[a]\n\t"
  9731. #else
  9732. "sbc %[a], %[a]\n\t"
  9733. #endif
  9734. : [a] "+l" (a), [b] "+l" (b)
  9735. :
  9736. : "memory", "r2", "r3", "r4", "r5"
  9737. );
  9738. return (uint32_t)(size_t)a;
  9739. }
  9740. /* Add b to a into r. (r = a + b)
  9741. *
  9742. * r A single precision integer.
  9743. * a A single precision integer.
  9744. * b A single precision integer.
  9745. */
  9746. SP_NOINLINE static sp_digit sp_2048_add_16(sp_digit* r, const sp_digit* a,
  9747. const sp_digit* b)
  9748. {
  9749. __asm__ __volatile__ (
  9750. "ldm %[b]!, {r5, r6}\n\t"
  9751. "ldm %[a]!, {r3, r4}\n\t"
  9752. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9753. "adds r3, r3, r5\n\t"
  9754. #else
  9755. "add r3, r3, r5\n\t"
  9756. #endif
  9757. #ifdef WOLFSSL_KEIL
  9758. "adcs r4, r4, r6\n\t"
  9759. #elif defined(__clang__)
  9760. "adcs r4, r6\n\t"
  9761. #else
  9762. "adc r4, r6\n\t"
  9763. #endif
  9764. "stm %[r]!, {r3, r4}\n\t"
  9765. "ldm %[b]!, {r5, r6}\n\t"
  9766. "ldm %[a]!, {r3, r4}\n\t"
  9767. #ifdef WOLFSSL_KEIL
  9768. "adcs r3, r3, r5\n\t"
  9769. #elif defined(__clang__)
  9770. "adcs r3, r5\n\t"
  9771. #else
  9772. "adc r3, r5\n\t"
  9773. #endif
  9774. #ifdef WOLFSSL_KEIL
  9775. "adcs r4, r4, r6\n\t"
  9776. #elif defined(__clang__)
  9777. "adcs r4, r6\n\t"
  9778. #else
  9779. "adc r4, r6\n\t"
  9780. #endif
  9781. "stm %[r]!, {r3, r4}\n\t"
  9782. "ldm %[b]!, {r5, r6}\n\t"
  9783. "ldm %[a]!, {r3, r4}\n\t"
  9784. #ifdef WOLFSSL_KEIL
  9785. "adcs r3, r3, r5\n\t"
  9786. #elif defined(__clang__)
  9787. "adcs r3, r5\n\t"
  9788. #else
  9789. "adc r3, r5\n\t"
  9790. #endif
  9791. #ifdef WOLFSSL_KEIL
  9792. "adcs r4, r4, r6\n\t"
  9793. #elif defined(__clang__)
  9794. "adcs r4, r6\n\t"
  9795. #else
  9796. "adc r4, r6\n\t"
  9797. #endif
  9798. "stm %[r]!, {r3, r4}\n\t"
  9799. "ldm %[b]!, {r5, r6}\n\t"
  9800. "ldm %[a]!, {r3, r4}\n\t"
  9801. #ifdef WOLFSSL_KEIL
  9802. "adcs r3, r3, r5\n\t"
  9803. #elif defined(__clang__)
  9804. "adcs r3, r5\n\t"
  9805. #else
  9806. "adc r3, r5\n\t"
  9807. #endif
  9808. #ifdef WOLFSSL_KEIL
  9809. "adcs r4, r4, r6\n\t"
  9810. #elif defined(__clang__)
  9811. "adcs r4, r6\n\t"
  9812. #else
  9813. "adc r4, r6\n\t"
  9814. #endif
  9815. "stm %[r]!, {r3, r4}\n\t"
  9816. "ldm %[b]!, {r5, r6}\n\t"
  9817. "ldm %[a]!, {r3, r4}\n\t"
  9818. #ifdef WOLFSSL_KEIL
  9819. "adcs r3, r3, r5\n\t"
  9820. #elif defined(__clang__)
  9821. "adcs r3, r5\n\t"
  9822. #else
  9823. "adc r3, r5\n\t"
  9824. #endif
  9825. #ifdef WOLFSSL_KEIL
  9826. "adcs r4, r4, r6\n\t"
  9827. #elif defined(__clang__)
  9828. "adcs r4, r6\n\t"
  9829. #else
  9830. "adc r4, r6\n\t"
  9831. #endif
  9832. "stm %[r]!, {r3, r4}\n\t"
  9833. "ldm %[b]!, {r5, r6}\n\t"
  9834. "ldm %[a]!, {r3, r4}\n\t"
  9835. #ifdef WOLFSSL_KEIL
  9836. "adcs r3, r3, r5\n\t"
  9837. #elif defined(__clang__)
  9838. "adcs r3, r5\n\t"
  9839. #else
  9840. "adc r3, r5\n\t"
  9841. #endif
  9842. #ifdef WOLFSSL_KEIL
  9843. "adcs r4, r4, r6\n\t"
  9844. #elif defined(__clang__)
  9845. "adcs r4, r6\n\t"
  9846. #else
  9847. "adc r4, r6\n\t"
  9848. #endif
  9849. "stm %[r]!, {r3, r4}\n\t"
  9850. "ldm %[b]!, {r5, r6}\n\t"
  9851. "ldm %[a]!, {r3, r4}\n\t"
  9852. #ifdef WOLFSSL_KEIL
  9853. "adcs r3, r3, r5\n\t"
  9854. #elif defined(__clang__)
  9855. "adcs r3, r5\n\t"
  9856. #else
  9857. "adc r3, r5\n\t"
  9858. #endif
  9859. #ifdef WOLFSSL_KEIL
  9860. "adcs r4, r4, r6\n\t"
  9861. #elif defined(__clang__)
  9862. "adcs r4, r6\n\t"
  9863. #else
  9864. "adc r4, r6\n\t"
  9865. #endif
  9866. "stm %[r]!, {r3, r4}\n\t"
  9867. "ldm %[b]!, {r5, r6}\n\t"
  9868. "ldm %[a]!, {r3, r4}\n\t"
  9869. #ifdef WOLFSSL_KEIL
  9870. "adcs r3, r3, r5\n\t"
  9871. #elif defined(__clang__)
  9872. "adcs r3, r5\n\t"
  9873. #else
  9874. "adc r3, r5\n\t"
  9875. #endif
  9876. #ifdef WOLFSSL_KEIL
  9877. "adcs r4, r4, r6\n\t"
  9878. #elif defined(__clang__)
  9879. "adcs r4, r6\n\t"
  9880. #else
  9881. "adc r4, r6\n\t"
  9882. #endif
  9883. "stm %[r]!, {r3, r4}\n\t"
  9884. "movs %[r], #0\n\t"
  9885. #ifdef WOLFSSL_KEIL
  9886. "adcs %[r], %[r], %[r]\n\t"
  9887. #elif defined(__clang__)
  9888. "adcs %[r], %[r]\n\t"
  9889. #else
  9890. "adc %[r], %[r]\n\t"
  9891. #endif
  9892. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  9893. :
  9894. : "memory", "r3", "r4", "r5", "r6"
  9895. );
  9896. return (uint32_t)(size_t)r;
  9897. }
  9898. /* AND m into each word of a and store in r.
  9899. *
  9900. * r A single precision integer.
  9901. * a A single precision integer.
  9902. * m Mask to AND against each digit.
  9903. */
  9904. static void sp_2048_mask_8(sp_digit* r, const sp_digit* a, sp_digit m)
  9905. {
  9906. #ifdef WOLFSSL_SP_SMALL
  9907. int i;
  9908. for (i=0; i<8; i++) {
  9909. r[i] = a[i] & m;
  9910. }
  9911. #else
  9912. r[0] = a[0] & m;
  9913. r[1] = a[1] & m;
  9914. r[2] = a[2] & m;
  9915. r[3] = a[3] & m;
  9916. r[4] = a[4] & m;
  9917. r[5] = a[5] & m;
  9918. r[6] = a[6] & m;
  9919. r[7] = a[7] & m;
  9920. #endif
  9921. }
  9922. /* Multiply a and b into r. (r = a * b)
  9923. *
  9924. * r A single precision integer.
  9925. * a A single precision integer.
  9926. * b A single precision integer.
  9927. */
  9928. SP_NOINLINE static void sp_2048_mul_16(sp_digit* r, const sp_digit* a,
  9929. const sp_digit* b)
  9930. {
  9931. sp_digit* z0 = r;
  9932. sp_digit z1[16];
  9933. sp_digit a1[8];
  9934. sp_digit b1[8];
  9935. sp_digit* z2 = r + 16;
  9936. sp_digit u;
  9937. sp_digit ca;
  9938. sp_digit cb;
  9939. ca = sp_2048_add_8(a1, a, &a[8]);
  9940. cb = sp_2048_add_8(b1, b, &b[8]);
  9941. u = ca & cb;
  9942. sp_2048_mul_8(z2, &a[8], &b[8]);
  9943. sp_2048_mul_8(z0, a, b);
  9944. sp_2048_mul_8(z1, a1, b1);
  9945. u += sp_2048_sub_in_place_16(z1, z0);
  9946. u += sp_2048_sub_in_place_16(z1, z2);
  9947. sp_2048_mask_8(a1, a1, 0 - cb);
  9948. u += sp_2048_add_8(z1 + 8, z1 + 8, a1);
  9949. sp_2048_mask_8(b1, b1, 0 - ca);
  9950. u += sp_2048_add_8(z1 + 8, z1 + 8, b1);
  9951. u += sp_2048_add_16(r + 8, r + 8, z1);
  9952. (void)sp_2048_add_word_8(r + 24, r + 24, u);
  9953. }
  9954. /* Add b to a into r. (r = a + b)
  9955. *
  9956. * r A single precision integer.
  9957. * a A single precision integer.
  9958. * b A single precision integer.
  9959. */
  9960. SP_NOINLINE static sp_digit sp_2048_add_word_16(sp_digit* r, const sp_digit* a,
  9961. sp_digit b)
  9962. {
  9963. __asm__ __volatile__ (
  9964. "movs r5, #0\n\t"
  9965. "ldm %[a]!, {r3, r4}\n\t"
  9966. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9967. "adds r3, r3, %[b]\n\t"
  9968. #else
  9969. "add r3, r3, %[b]\n\t"
  9970. #endif
  9971. #ifdef WOLFSSL_KEIL
  9972. "adcs r4, r4, r5\n\t"
  9973. #elif defined(__clang__)
  9974. "adcs r4, r5\n\t"
  9975. #else
  9976. "adc r4, r5\n\t"
  9977. #endif
  9978. "stm %[r]!, {r3, r4}\n\t"
  9979. "ldm %[a]!, {r3, r4}\n\t"
  9980. #ifdef WOLFSSL_KEIL
  9981. "adcs r3, r3, r5\n\t"
  9982. #elif defined(__clang__)
  9983. "adcs r3, r5\n\t"
  9984. #else
  9985. "adc r3, r5\n\t"
  9986. #endif
  9987. #ifdef WOLFSSL_KEIL
  9988. "adcs r4, r4, r5\n\t"
  9989. #elif defined(__clang__)
  9990. "adcs r4, r5\n\t"
  9991. #else
  9992. "adc r4, r5\n\t"
  9993. #endif
  9994. "stm %[r]!, {r3, r4}\n\t"
  9995. "ldm %[a]!, {r3, r4}\n\t"
  9996. #ifdef WOLFSSL_KEIL
  9997. "adcs r3, r3, r5\n\t"
  9998. #elif defined(__clang__)
  9999. "adcs r3, r5\n\t"
  10000. #else
  10001. "adc r3, r5\n\t"
  10002. #endif
  10003. #ifdef WOLFSSL_KEIL
  10004. "adcs r4, r4, r5\n\t"
  10005. #elif defined(__clang__)
  10006. "adcs r4, r5\n\t"
  10007. #else
  10008. "adc r4, r5\n\t"
  10009. #endif
  10010. "stm %[r]!, {r3, r4}\n\t"
  10011. "ldm %[a]!, {r3, r4}\n\t"
  10012. #ifdef WOLFSSL_KEIL
  10013. "adcs r3, r3, r5\n\t"
  10014. #elif defined(__clang__)
  10015. "adcs r3, r5\n\t"
  10016. #else
  10017. "adc r3, r5\n\t"
  10018. #endif
  10019. #ifdef WOLFSSL_KEIL
  10020. "adcs r4, r4, r5\n\t"
  10021. #elif defined(__clang__)
  10022. "adcs r4, r5\n\t"
  10023. #else
  10024. "adc r4, r5\n\t"
  10025. #endif
  10026. "stm %[r]!, {r3, r4}\n\t"
  10027. "ldm %[a]!, {r3, r4}\n\t"
  10028. #ifdef WOLFSSL_KEIL
  10029. "adcs r3, r3, r5\n\t"
  10030. #elif defined(__clang__)
  10031. "adcs r3, r5\n\t"
  10032. #else
  10033. "adc r3, r5\n\t"
  10034. #endif
  10035. #ifdef WOLFSSL_KEIL
  10036. "adcs r4, r4, r5\n\t"
  10037. #elif defined(__clang__)
  10038. "adcs r4, r5\n\t"
  10039. #else
  10040. "adc r4, r5\n\t"
  10041. #endif
  10042. "stm %[r]!, {r3, r4}\n\t"
  10043. "ldm %[a]!, {r3, r4}\n\t"
  10044. #ifdef WOLFSSL_KEIL
  10045. "adcs r3, r3, r5\n\t"
  10046. #elif defined(__clang__)
  10047. "adcs r3, r5\n\t"
  10048. #else
  10049. "adc r3, r5\n\t"
  10050. #endif
  10051. #ifdef WOLFSSL_KEIL
  10052. "adcs r4, r4, r5\n\t"
  10053. #elif defined(__clang__)
  10054. "adcs r4, r5\n\t"
  10055. #else
  10056. "adc r4, r5\n\t"
  10057. #endif
  10058. "stm %[r]!, {r3, r4}\n\t"
  10059. "ldm %[a]!, {r3, r4}\n\t"
  10060. #ifdef WOLFSSL_KEIL
  10061. "adcs r3, r3, r5\n\t"
  10062. #elif defined(__clang__)
  10063. "adcs r3, r5\n\t"
  10064. #else
  10065. "adc r3, r5\n\t"
  10066. #endif
  10067. #ifdef WOLFSSL_KEIL
  10068. "adcs r4, r4, r5\n\t"
  10069. #elif defined(__clang__)
  10070. "adcs r4, r5\n\t"
  10071. #else
  10072. "adc r4, r5\n\t"
  10073. #endif
  10074. "stm %[r]!, {r3, r4}\n\t"
  10075. "ldm %[a]!, {r3, r4}\n\t"
  10076. #ifdef WOLFSSL_KEIL
  10077. "adcs r3, r3, r5\n\t"
  10078. #elif defined(__clang__)
  10079. "adcs r3, r5\n\t"
  10080. #else
  10081. "adc r3, r5\n\t"
  10082. #endif
  10083. #ifdef WOLFSSL_KEIL
  10084. "adcs r4, r4, r5\n\t"
  10085. #elif defined(__clang__)
  10086. "adcs r4, r5\n\t"
  10087. #else
  10088. "adc r4, r5\n\t"
  10089. #endif
  10090. "stm %[r]!, {r3, r4}\n\t"
  10091. "movs %[r], #0\n\t"
  10092. #ifdef WOLFSSL_KEIL
  10093. "adcs %[r], %[r], %[r]\n\t"
  10094. #elif defined(__clang__)
  10095. "adcs %[r], %[r]\n\t"
  10096. #else
  10097. "adc %[r], %[r]\n\t"
  10098. #endif
  10099. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  10100. :
  10101. : "memory", "r3", "r4", "r5"
  10102. );
  10103. return (uint32_t)(size_t)r;
  10104. }
  10105. /* Sub b from a into a. (a -= b)
  10106. *
  10107. * a A single precision integer.
  10108. * b A single precision integer.
  10109. */
  10110. SP_NOINLINE static sp_digit sp_2048_sub_in_place_32(sp_digit* a,
  10111. const sp_digit* b)
  10112. {
  10113. __asm__ __volatile__ (
  10114. "ldm %[b]!, {r4, r5}\n\t"
  10115. "ldr r2, [%[a]]\n\t"
  10116. "ldr r3, [%[a], #4]\n\t"
  10117. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10118. "subs r2, r2, r4\n\t"
  10119. #else
  10120. "sub r2, r2, r4\n\t"
  10121. #endif
  10122. #ifdef WOLFSSL_KEIL
  10123. "sbcs r3, r3, r5\n\t"
  10124. #elif defined(__clang__)
  10125. "sbcs r3, r5\n\t"
  10126. #else
  10127. "sbc r3, r5\n\t"
  10128. #endif
  10129. "stm %[a]!, {r2, r3}\n\t"
  10130. "ldm %[b]!, {r4, r5}\n\t"
  10131. "ldr r2, [%[a]]\n\t"
  10132. "ldr r3, [%[a], #4]\n\t"
  10133. #ifdef WOLFSSL_KEIL
  10134. "sbcs r2, r2, r4\n\t"
  10135. #elif defined(__clang__)
  10136. "sbcs r2, r4\n\t"
  10137. #else
  10138. "sbc r2, r4\n\t"
  10139. #endif
  10140. #ifdef WOLFSSL_KEIL
  10141. "sbcs r3, r3, r5\n\t"
  10142. #elif defined(__clang__)
  10143. "sbcs r3, r5\n\t"
  10144. #else
  10145. "sbc r3, r5\n\t"
  10146. #endif
  10147. "stm %[a]!, {r2, r3}\n\t"
  10148. "ldm %[b]!, {r4, r5}\n\t"
  10149. "ldr r2, [%[a]]\n\t"
  10150. "ldr r3, [%[a], #4]\n\t"
  10151. #ifdef WOLFSSL_KEIL
  10152. "sbcs r2, r2, r4\n\t"
  10153. #elif defined(__clang__)
  10154. "sbcs r2, r4\n\t"
  10155. #else
  10156. "sbc r2, r4\n\t"
  10157. #endif
  10158. #ifdef WOLFSSL_KEIL
  10159. "sbcs r3, r3, r5\n\t"
  10160. #elif defined(__clang__)
  10161. "sbcs r3, r5\n\t"
  10162. #else
  10163. "sbc r3, r5\n\t"
  10164. #endif
  10165. "stm %[a]!, {r2, r3}\n\t"
  10166. "ldm %[b]!, {r4, r5}\n\t"
  10167. "ldr r2, [%[a]]\n\t"
  10168. "ldr r3, [%[a], #4]\n\t"
  10169. #ifdef WOLFSSL_KEIL
  10170. "sbcs r2, r2, r4\n\t"
  10171. #elif defined(__clang__)
  10172. "sbcs r2, r4\n\t"
  10173. #else
  10174. "sbc r2, r4\n\t"
  10175. #endif
  10176. #ifdef WOLFSSL_KEIL
  10177. "sbcs r3, r3, r5\n\t"
  10178. #elif defined(__clang__)
  10179. "sbcs r3, r5\n\t"
  10180. #else
  10181. "sbc r3, r5\n\t"
  10182. #endif
  10183. "stm %[a]!, {r2, r3}\n\t"
  10184. "ldm %[b]!, {r4, r5}\n\t"
  10185. "ldr r2, [%[a]]\n\t"
  10186. "ldr r3, [%[a], #4]\n\t"
  10187. #ifdef WOLFSSL_KEIL
  10188. "sbcs r2, r2, r4\n\t"
  10189. #elif defined(__clang__)
  10190. "sbcs r2, r4\n\t"
  10191. #else
  10192. "sbc r2, r4\n\t"
  10193. #endif
  10194. #ifdef WOLFSSL_KEIL
  10195. "sbcs r3, r3, r5\n\t"
  10196. #elif defined(__clang__)
  10197. "sbcs r3, r5\n\t"
  10198. #else
  10199. "sbc r3, r5\n\t"
  10200. #endif
  10201. "stm %[a]!, {r2, r3}\n\t"
  10202. "ldm %[b]!, {r4, r5}\n\t"
  10203. "ldr r2, [%[a]]\n\t"
  10204. "ldr r3, [%[a], #4]\n\t"
  10205. #ifdef WOLFSSL_KEIL
  10206. "sbcs r2, r2, r4\n\t"
  10207. #elif defined(__clang__)
  10208. "sbcs r2, r4\n\t"
  10209. #else
  10210. "sbc r2, r4\n\t"
  10211. #endif
  10212. #ifdef WOLFSSL_KEIL
  10213. "sbcs r3, r3, r5\n\t"
  10214. #elif defined(__clang__)
  10215. "sbcs r3, r5\n\t"
  10216. #else
  10217. "sbc r3, r5\n\t"
  10218. #endif
  10219. "stm %[a]!, {r2, r3}\n\t"
  10220. "ldm %[b]!, {r4, r5}\n\t"
  10221. "ldr r2, [%[a]]\n\t"
  10222. "ldr r3, [%[a], #4]\n\t"
  10223. #ifdef WOLFSSL_KEIL
  10224. "sbcs r2, r2, r4\n\t"
  10225. #elif defined(__clang__)
  10226. "sbcs r2, r4\n\t"
  10227. #else
  10228. "sbc r2, r4\n\t"
  10229. #endif
  10230. #ifdef WOLFSSL_KEIL
  10231. "sbcs r3, r3, r5\n\t"
  10232. #elif defined(__clang__)
  10233. "sbcs r3, r5\n\t"
  10234. #else
  10235. "sbc r3, r5\n\t"
  10236. #endif
  10237. "stm %[a]!, {r2, r3}\n\t"
  10238. "ldm %[b]!, {r4, r5}\n\t"
  10239. "ldr r2, [%[a]]\n\t"
  10240. "ldr r3, [%[a], #4]\n\t"
  10241. #ifdef WOLFSSL_KEIL
  10242. "sbcs r2, r2, r4\n\t"
  10243. #elif defined(__clang__)
  10244. "sbcs r2, r4\n\t"
  10245. #else
  10246. "sbc r2, r4\n\t"
  10247. #endif
  10248. #ifdef WOLFSSL_KEIL
  10249. "sbcs r3, r3, r5\n\t"
  10250. #elif defined(__clang__)
  10251. "sbcs r3, r5\n\t"
  10252. #else
  10253. "sbc r3, r5\n\t"
  10254. #endif
  10255. "stm %[a]!, {r2, r3}\n\t"
  10256. "ldm %[b]!, {r4, r5}\n\t"
  10257. "ldr r2, [%[a]]\n\t"
  10258. "ldr r3, [%[a], #4]\n\t"
  10259. #ifdef WOLFSSL_KEIL
  10260. "sbcs r2, r2, r4\n\t"
  10261. #elif defined(__clang__)
  10262. "sbcs r2, r4\n\t"
  10263. #else
  10264. "sbc r2, r4\n\t"
  10265. #endif
  10266. #ifdef WOLFSSL_KEIL
  10267. "sbcs r3, r3, r5\n\t"
  10268. #elif defined(__clang__)
  10269. "sbcs r3, r5\n\t"
  10270. #else
  10271. "sbc r3, r5\n\t"
  10272. #endif
  10273. "stm %[a]!, {r2, r3}\n\t"
  10274. "ldm %[b]!, {r4, r5}\n\t"
  10275. "ldr r2, [%[a]]\n\t"
  10276. "ldr r3, [%[a], #4]\n\t"
  10277. #ifdef WOLFSSL_KEIL
  10278. "sbcs r2, r2, r4\n\t"
  10279. #elif defined(__clang__)
  10280. "sbcs r2, r4\n\t"
  10281. #else
  10282. "sbc r2, r4\n\t"
  10283. #endif
  10284. #ifdef WOLFSSL_KEIL
  10285. "sbcs r3, r3, r5\n\t"
  10286. #elif defined(__clang__)
  10287. "sbcs r3, r5\n\t"
  10288. #else
  10289. "sbc r3, r5\n\t"
  10290. #endif
  10291. "stm %[a]!, {r2, r3}\n\t"
  10292. "ldm %[b]!, {r4, r5}\n\t"
  10293. "ldr r2, [%[a]]\n\t"
  10294. "ldr r3, [%[a], #4]\n\t"
  10295. #ifdef WOLFSSL_KEIL
  10296. "sbcs r2, r2, r4\n\t"
  10297. #elif defined(__clang__)
  10298. "sbcs r2, r4\n\t"
  10299. #else
  10300. "sbc r2, r4\n\t"
  10301. #endif
  10302. #ifdef WOLFSSL_KEIL
  10303. "sbcs r3, r3, r5\n\t"
  10304. #elif defined(__clang__)
  10305. "sbcs r3, r5\n\t"
  10306. #else
  10307. "sbc r3, r5\n\t"
  10308. #endif
  10309. "stm %[a]!, {r2, r3}\n\t"
  10310. "ldm %[b]!, {r4, r5}\n\t"
  10311. "ldr r2, [%[a]]\n\t"
  10312. "ldr r3, [%[a], #4]\n\t"
  10313. #ifdef WOLFSSL_KEIL
  10314. "sbcs r2, r2, r4\n\t"
  10315. #elif defined(__clang__)
  10316. "sbcs r2, r4\n\t"
  10317. #else
  10318. "sbc r2, r4\n\t"
  10319. #endif
  10320. #ifdef WOLFSSL_KEIL
  10321. "sbcs r3, r3, r5\n\t"
  10322. #elif defined(__clang__)
  10323. "sbcs r3, r5\n\t"
  10324. #else
  10325. "sbc r3, r5\n\t"
  10326. #endif
  10327. "stm %[a]!, {r2, r3}\n\t"
  10328. "ldm %[b]!, {r4, r5}\n\t"
  10329. "ldr r2, [%[a]]\n\t"
  10330. "ldr r3, [%[a], #4]\n\t"
  10331. #ifdef WOLFSSL_KEIL
  10332. "sbcs r2, r2, r4\n\t"
  10333. #elif defined(__clang__)
  10334. "sbcs r2, r4\n\t"
  10335. #else
  10336. "sbc r2, r4\n\t"
  10337. #endif
  10338. #ifdef WOLFSSL_KEIL
  10339. "sbcs r3, r3, r5\n\t"
  10340. #elif defined(__clang__)
  10341. "sbcs r3, r5\n\t"
  10342. #else
  10343. "sbc r3, r5\n\t"
  10344. #endif
  10345. "stm %[a]!, {r2, r3}\n\t"
  10346. "ldm %[b]!, {r4, r5}\n\t"
  10347. "ldr r2, [%[a]]\n\t"
  10348. "ldr r3, [%[a], #4]\n\t"
  10349. #ifdef WOLFSSL_KEIL
  10350. "sbcs r2, r2, r4\n\t"
  10351. #elif defined(__clang__)
  10352. "sbcs r2, r4\n\t"
  10353. #else
  10354. "sbc r2, r4\n\t"
  10355. #endif
  10356. #ifdef WOLFSSL_KEIL
  10357. "sbcs r3, r3, r5\n\t"
  10358. #elif defined(__clang__)
  10359. "sbcs r3, r5\n\t"
  10360. #else
  10361. "sbc r3, r5\n\t"
  10362. #endif
  10363. "stm %[a]!, {r2, r3}\n\t"
  10364. "ldm %[b]!, {r4, r5}\n\t"
  10365. "ldr r2, [%[a]]\n\t"
  10366. "ldr r3, [%[a], #4]\n\t"
  10367. #ifdef WOLFSSL_KEIL
  10368. "sbcs r2, r2, r4\n\t"
  10369. #elif defined(__clang__)
  10370. "sbcs r2, r4\n\t"
  10371. #else
  10372. "sbc r2, r4\n\t"
  10373. #endif
  10374. #ifdef WOLFSSL_KEIL
  10375. "sbcs r3, r3, r5\n\t"
  10376. #elif defined(__clang__)
  10377. "sbcs r3, r5\n\t"
  10378. #else
  10379. "sbc r3, r5\n\t"
  10380. #endif
  10381. "stm %[a]!, {r2, r3}\n\t"
  10382. "ldm %[b]!, {r4, r5}\n\t"
  10383. "ldr r2, [%[a]]\n\t"
  10384. "ldr r3, [%[a], #4]\n\t"
  10385. #ifdef WOLFSSL_KEIL
  10386. "sbcs r2, r2, r4\n\t"
  10387. #elif defined(__clang__)
  10388. "sbcs r2, r4\n\t"
  10389. #else
  10390. "sbc r2, r4\n\t"
  10391. #endif
  10392. #ifdef WOLFSSL_KEIL
  10393. "sbcs r3, r3, r5\n\t"
  10394. #elif defined(__clang__)
  10395. "sbcs r3, r5\n\t"
  10396. #else
  10397. "sbc r3, r5\n\t"
  10398. #endif
  10399. "stm %[a]!, {r2, r3}\n\t"
  10400. #ifdef WOLFSSL_KEIL
  10401. "sbcs %[a], %[a], %[a]\n\t"
  10402. #elif defined(__clang__)
  10403. "sbcs %[a], %[a]\n\t"
  10404. #else
  10405. "sbc %[a], %[a]\n\t"
  10406. #endif
  10407. : [a] "+l" (a), [b] "+l" (b)
  10408. :
  10409. : "memory", "r2", "r3", "r4", "r5"
  10410. );
  10411. return (uint32_t)(size_t)a;
  10412. }
  10413. /* Add b to a into r. (r = a + b)
  10414. *
  10415. * r A single precision integer.
  10416. * a A single precision integer.
  10417. * b A single precision integer.
  10418. */
  10419. SP_NOINLINE static sp_digit sp_2048_add_32(sp_digit* r, const sp_digit* a,
  10420. const sp_digit* b)
  10421. {
  10422. __asm__ __volatile__ (
  10423. "ldm %[b]!, {r5, r6}\n\t"
  10424. "ldm %[a]!, {r3, r4}\n\t"
  10425. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10426. "adds r3, r3, r5\n\t"
  10427. #else
  10428. "add r3, r3, r5\n\t"
  10429. #endif
  10430. #ifdef WOLFSSL_KEIL
  10431. "adcs r4, r4, r6\n\t"
  10432. #elif defined(__clang__)
  10433. "adcs r4, r6\n\t"
  10434. #else
  10435. "adc r4, r6\n\t"
  10436. #endif
  10437. "stm %[r]!, {r3, r4}\n\t"
  10438. "ldm %[b]!, {r5, r6}\n\t"
  10439. "ldm %[a]!, {r3, r4}\n\t"
  10440. #ifdef WOLFSSL_KEIL
  10441. "adcs r3, r3, r5\n\t"
  10442. #elif defined(__clang__)
  10443. "adcs r3, r5\n\t"
  10444. #else
  10445. "adc r3, r5\n\t"
  10446. #endif
  10447. #ifdef WOLFSSL_KEIL
  10448. "adcs r4, r4, r6\n\t"
  10449. #elif defined(__clang__)
  10450. "adcs r4, r6\n\t"
  10451. #else
  10452. "adc r4, r6\n\t"
  10453. #endif
  10454. "stm %[r]!, {r3, r4}\n\t"
  10455. "ldm %[b]!, {r5, r6}\n\t"
  10456. "ldm %[a]!, {r3, r4}\n\t"
  10457. #ifdef WOLFSSL_KEIL
  10458. "adcs r3, r3, r5\n\t"
  10459. #elif defined(__clang__)
  10460. "adcs r3, r5\n\t"
  10461. #else
  10462. "adc r3, r5\n\t"
  10463. #endif
  10464. #ifdef WOLFSSL_KEIL
  10465. "adcs r4, r4, r6\n\t"
  10466. #elif defined(__clang__)
  10467. "adcs r4, r6\n\t"
  10468. #else
  10469. "adc r4, r6\n\t"
  10470. #endif
  10471. "stm %[r]!, {r3, r4}\n\t"
  10472. "ldm %[b]!, {r5, r6}\n\t"
  10473. "ldm %[a]!, {r3, r4}\n\t"
  10474. #ifdef WOLFSSL_KEIL
  10475. "adcs r3, r3, r5\n\t"
  10476. #elif defined(__clang__)
  10477. "adcs r3, r5\n\t"
  10478. #else
  10479. "adc r3, r5\n\t"
  10480. #endif
  10481. #ifdef WOLFSSL_KEIL
  10482. "adcs r4, r4, r6\n\t"
  10483. #elif defined(__clang__)
  10484. "adcs r4, r6\n\t"
  10485. #else
  10486. "adc r4, r6\n\t"
  10487. #endif
  10488. "stm %[r]!, {r3, r4}\n\t"
  10489. "ldm %[b]!, {r5, r6}\n\t"
  10490. "ldm %[a]!, {r3, r4}\n\t"
  10491. #ifdef WOLFSSL_KEIL
  10492. "adcs r3, r3, r5\n\t"
  10493. #elif defined(__clang__)
  10494. "adcs r3, r5\n\t"
  10495. #else
  10496. "adc r3, r5\n\t"
  10497. #endif
  10498. #ifdef WOLFSSL_KEIL
  10499. "adcs r4, r4, r6\n\t"
  10500. #elif defined(__clang__)
  10501. "adcs r4, r6\n\t"
  10502. #else
  10503. "adc r4, r6\n\t"
  10504. #endif
  10505. "stm %[r]!, {r3, r4}\n\t"
  10506. "ldm %[b]!, {r5, r6}\n\t"
  10507. "ldm %[a]!, {r3, r4}\n\t"
  10508. #ifdef WOLFSSL_KEIL
  10509. "adcs r3, r3, r5\n\t"
  10510. #elif defined(__clang__)
  10511. "adcs r3, r5\n\t"
  10512. #else
  10513. "adc r3, r5\n\t"
  10514. #endif
  10515. #ifdef WOLFSSL_KEIL
  10516. "adcs r4, r4, r6\n\t"
  10517. #elif defined(__clang__)
  10518. "adcs r4, r6\n\t"
  10519. #else
  10520. "adc r4, r6\n\t"
  10521. #endif
  10522. "stm %[r]!, {r3, r4}\n\t"
  10523. "ldm %[b]!, {r5, r6}\n\t"
  10524. "ldm %[a]!, {r3, r4}\n\t"
  10525. #ifdef WOLFSSL_KEIL
  10526. "adcs r3, r3, r5\n\t"
  10527. #elif defined(__clang__)
  10528. "adcs r3, r5\n\t"
  10529. #else
  10530. "adc r3, r5\n\t"
  10531. #endif
  10532. #ifdef WOLFSSL_KEIL
  10533. "adcs r4, r4, r6\n\t"
  10534. #elif defined(__clang__)
  10535. "adcs r4, r6\n\t"
  10536. #else
  10537. "adc r4, r6\n\t"
  10538. #endif
  10539. "stm %[r]!, {r3, r4}\n\t"
  10540. "ldm %[b]!, {r5, r6}\n\t"
  10541. "ldm %[a]!, {r3, r4}\n\t"
  10542. #ifdef WOLFSSL_KEIL
  10543. "adcs r3, r3, r5\n\t"
  10544. #elif defined(__clang__)
  10545. "adcs r3, r5\n\t"
  10546. #else
  10547. "adc r3, r5\n\t"
  10548. #endif
  10549. #ifdef WOLFSSL_KEIL
  10550. "adcs r4, r4, r6\n\t"
  10551. #elif defined(__clang__)
  10552. "adcs r4, r6\n\t"
  10553. #else
  10554. "adc r4, r6\n\t"
  10555. #endif
  10556. "stm %[r]!, {r3, r4}\n\t"
  10557. "ldm %[b]!, {r5, r6}\n\t"
  10558. "ldm %[a]!, {r3, r4}\n\t"
  10559. #ifdef WOLFSSL_KEIL
  10560. "adcs r3, r3, r5\n\t"
  10561. #elif defined(__clang__)
  10562. "adcs r3, r5\n\t"
  10563. #else
  10564. "adc r3, r5\n\t"
  10565. #endif
  10566. #ifdef WOLFSSL_KEIL
  10567. "adcs r4, r4, r6\n\t"
  10568. #elif defined(__clang__)
  10569. "adcs r4, r6\n\t"
  10570. #else
  10571. "adc r4, r6\n\t"
  10572. #endif
  10573. "stm %[r]!, {r3, r4}\n\t"
  10574. "ldm %[b]!, {r5, r6}\n\t"
  10575. "ldm %[a]!, {r3, r4}\n\t"
  10576. #ifdef WOLFSSL_KEIL
  10577. "adcs r3, r3, r5\n\t"
  10578. #elif defined(__clang__)
  10579. "adcs r3, r5\n\t"
  10580. #else
  10581. "adc r3, r5\n\t"
  10582. #endif
  10583. #ifdef WOLFSSL_KEIL
  10584. "adcs r4, r4, r6\n\t"
  10585. #elif defined(__clang__)
  10586. "adcs r4, r6\n\t"
  10587. #else
  10588. "adc r4, r6\n\t"
  10589. #endif
  10590. "stm %[r]!, {r3, r4}\n\t"
  10591. "ldm %[b]!, {r5, r6}\n\t"
  10592. "ldm %[a]!, {r3, r4}\n\t"
  10593. #ifdef WOLFSSL_KEIL
  10594. "adcs r3, r3, r5\n\t"
  10595. #elif defined(__clang__)
  10596. "adcs r3, r5\n\t"
  10597. #else
  10598. "adc r3, r5\n\t"
  10599. #endif
  10600. #ifdef WOLFSSL_KEIL
  10601. "adcs r4, r4, r6\n\t"
  10602. #elif defined(__clang__)
  10603. "adcs r4, r6\n\t"
  10604. #else
  10605. "adc r4, r6\n\t"
  10606. #endif
  10607. "stm %[r]!, {r3, r4}\n\t"
  10608. "ldm %[b]!, {r5, r6}\n\t"
  10609. "ldm %[a]!, {r3, r4}\n\t"
  10610. #ifdef WOLFSSL_KEIL
  10611. "adcs r3, r3, r5\n\t"
  10612. #elif defined(__clang__)
  10613. "adcs r3, r5\n\t"
  10614. #else
  10615. "adc r3, r5\n\t"
  10616. #endif
  10617. #ifdef WOLFSSL_KEIL
  10618. "adcs r4, r4, r6\n\t"
  10619. #elif defined(__clang__)
  10620. "adcs r4, r6\n\t"
  10621. #else
  10622. "adc r4, r6\n\t"
  10623. #endif
  10624. "stm %[r]!, {r3, r4}\n\t"
  10625. "ldm %[b]!, {r5, r6}\n\t"
  10626. "ldm %[a]!, {r3, r4}\n\t"
  10627. #ifdef WOLFSSL_KEIL
  10628. "adcs r3, r3, r5\n\t"
  10629. #elif defined(__clang__)
  10630. "adcs r3, r5\n\t"
  10631. #else
  10632. "adc r3, r5\n\t"
  10633. #endif
  10634. #ifdef WOLFSSL_KEIL
  10635. "adcs r4, r4, r6\n\t"
  10636. #elif defined(__clang__)
  10637. "adcs r4, r6\n\t"
  10638. #else
  10639. "adc r4, r6\n\t"
  10640. #endif
  10641. "stm %[r]!, {r3, r4}\n\t"
  10642. "ldm %[b]!, {r5, r6}\n\t"
  10643. "ldm %[a]!, {r3, r4}\n\t"
  10644. #ifdef WOLFSSL_KEIL
  10645. "adcs r3, r3, r5\n\t"
  10646. #elif defined(__clang__)
  10647. "adcs r3, r5\n\t"
  10648. #else
  10649. "adc r3, r5\n\t"
  10650. #endif
  10651. #ifdef WOLFSSL_KEIL
  10652. "adcs r4, r4, r6\n\t"
  10653. #elif defined(__clang__)
  10654. "adcs r4, r6\n\t"
  10655. #else
  10656. "adc r4, r6\n\t"
  10657. #endif
  10658. "stm %[r]!, {r3, r4}\n\t"
  10659. "ldm %[b]!, {r5, r6}\n\t"
  10660. "ldm %[a]!, {r3, r4}\n\t"
  10661. #ifdef WOLFSSL_KEIL
  10662. "adcs r3, r3, r5\n\t"
  10663. #elif defined(__clang__)
  10664. "adcs r3, r5\n\t"
  10665. #else
  10666. "adc r3, r5\n\t"
  10667. #endif
  10668. #ifdef WOLFSSL_KEIL
  10669. "adcs r4, r4, r6\n\t"
  10670. #elif defined(__clang__)
  10671. "adcs r4, r6\n\t"
  10672. #else
  10673. "adc r4, r6\n\t"
  10674. #endif
  10675. "stm %[r]!, {r3, r4}\n\t"
  10676. "ldm %[b]!, {r5, r6}\n\t"
  10677. "ldm %[a]!, {r3, r4}\n\t"
  10678. #ifdef WOLFSSL_KEIL
  10679. "adcs r3, r3, r5\n\t"
  10680. #elif defined(__clang__)
  10681. "adcs r3, r5\n\t"
  10682. #else
  10683. "adc r3, r5\n\t"
  10684. #endif
  10685. #ifdef WOLFSSL_KEIL
  10686. "adcs r4, r4, r6\n\t"
  10687. #elif defined(__clang__)
  10688. "adcs r4, r6\n\t"
  10689. #else
  10690. "adc r4, r6\n\t"
  10691. #endif
  10692. "stm %[r]!, {r3, r4}\n\t"
  10693. "movs %[r], #0\n\t"
  10694. #ifdef WOLFSSL_KEIL
  10695. "adcs %[r], %[r], %[r]\n\t"
  10696. #elif defined(__clang__)
  10697. "adcs %[r], %[r]\n\t"
  10698. #else
  10699. "adc %[r], %[r]\n\t"
  10700. #endif
  10701. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  10702. :
  10703. : "memory", "r3", "r4", "r5", "r6"
  10704. );
  10705. return (uint32_t)(size_t)r;
  10706. }
  10707. /* AND m into each word of a and store in r.
  10708. *
  10709. * r A single precision integer.
  10710. * a A single precision integer.
  10711. * m Mask to AND against each digit.
  10712. */
  10713. static void sp_2048_mask_16(sp_digit* r, const sp_digit* a, sp_digit m)
  10714. {
  10715. #ifdef WOLFSSL_SP_SMALL
  10716. int i;
  10717. for (i=0; i<16; i++) {
  10718. r[i] = a[i] & m;
  10719. }
  10720. #else
  10721. int i;
  10722. for (i = 0; i < 16; i += 8) {
  10723. r[i+0] = a[i+0] & m;
  10724. r[i+1] = a[i+1] & m;
  10725. r[i+2] = a[i+2] & m;
  10726. r[i+3] = a[i+3] & m;
  10727. r[i+4] = a[i+4] & m;
  10728. r[i+5] = a[i+5] & m;
  10729. r[i+6] = a[i+6] & m;
  10730. r[i+7] = a[i+7] & m;
  10731. }
  10732. #endif
  10733. }
  10734. /* Multiply a and b into r. (r = a * b)
  10735. *
  10736. * r A single precision integer.
  10737. * a A single precision integer.
  10738. * b A single precision integer.
  10739. */
  10740. SP_NOINLINE static void sp_2048_mul_32(sp_digit* r, const sp_digit* a,
  10741. const sp_digit* b)
  10742. {
  10743. sp_digit* z0 = r;
  10744. sp_digit z1[32];
  10745. sp_digit a1[16];
  10746. sp_digit b1[16];
  10747. sp_digit* z2 = r + 32;
  10748. sp_digit u;
  10749. sp_digit ca;
  10750. sp_digit cb;
  10751. ca = sp_2048_add_16(a1, a, &a[16]);
  10752. cb = sp_2048_add_16(b1, b, &b[16]);
  10753. u = ca & cb;
  10754. sp_2048_mul_16(z2, &a[16], &b[16]);
  10755. sp_2048_mul_16(z0, a, b);
  10756. sp_2048_mul_16(z1, a1, b1);
  10757. u += sp_2048_sub_in_place_32(z1, z0);
  10758. u += sp_2048_sub_in_place_32(z1, z2);
  10759. sp_2048_mask_16(a1, a1, 0 - cb);
  10760. u += sp_2048_add_16(z1 + 16, z1 + 16, a1);
  10761. sp_2048_mask_16(b1, b1, 0 - ca);
  10762. u += sp_2048_add_16(z1 + 16, z1 + 16, b1);
  10763. u += sp_2048_add_32(r + 16, r + 16, z1);
  10764. (void)sp_2048_add_word_16(r + 48, r + 48, u);
  10765. }
  10766. /* Add b to a into r. (r = a + b)
  10767. *
  10768. * r A single precision integer.
  10769. * a A single precision integer.
  10770. * b A single precision integer.
  10771. */
  10772. SP_NOINLINE static sp_digit sp_2048_add_word_32(sp_digit* r, const sp_digit* a,
  10773. sp_digit b)
  10774. {
  10775. __asm__ __volatile__ (
  10776. "movs r5, #0\n\t"
  10777. "ldm %[a]!, {r3, r4}\n\t"
  10778. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10779. "adds r3, r3, %[b]\n\t"
  10780. #else
  10781. "add r3, r3, %[b]\n\t"
  10782. #endif
  10783. #ifdef WOLFSSL_KEIL
  10784. "adcs r4, r4, r5\n\t"
  10785. #elif defined(__clang__)
  10786. "adcs r4, r5\n\t"
  10787. #else
  10788. "adc r4, r5\n\t"
  10789. #endif
  10790. "stm %[r]!, {r3, r4}\n\t"
  10791. "ldm %[a]!, {r3, r4}\n\t"
  10792. #ifdef WOLFSSL_KEIL
  10793. "adcs r3, r3, r5\n\t"
  10794. #elif defined(__clang__)
  10795. "adcs r3, r5\n\t"
  10796. #else
  10797. "adc r3, r5\n\t"
  10798. #endif
  10799. #ifdef WOLFSSL_KEIL
  10800. "adcs r4, r4, r5\n\t"
  10801. #elif defined(__clang__)
  10802. "adcs r4, r5\n\t"
  10803. #else
  10804. "adc r4, r5\n\t"
  10805. #endif
  10806. "stm %[r]!, {r3, r4}\n\t"
  10807. "ldm %[a]!, {r3, r4}\n\t"
  10808. #ifdef WOLFSSL_KEIL
  10809. "adcs r3, r3, r5\n\t"
  10810. #elif defined(__clang__)
  10811. "adcs r3, r5\n\t"
  10812. #else
  10813. "adc r3, r5\n\t"
  10814. #endif
  10815. #ifdef WOLFSSL_KEIL
  10816. "adcs r4, r4, r5\n\t"
  10817. #elif defined(__clang__)
  10818. "adcs r4, r5\n\t"
  10819. #else
  10820. "adc r4, r5\n\t"
  10821. #endif
  10822. "stm %[r]!, {r3, r4}\n\t"
  10823. "ldm %[a]!, {r3, r4}\n\t"
  10824. #ifdef WOLFSSL_KEIL
  10825. "adcs r3, r3, r5\n\t"
  10826. #elif defined(__clang__)
  10827. "adcs r3, r5\n\t"
  10828. #else
  10829. "adc r3, r5\n\t"
  10830. #endif
  10831. #ifdef WOLFSSL_KEIL
  10832. "adcs r4, r4, r5\n\t"
  10833. #elif defined(__clang__)
  10834. "adcs r4, r5\n\t"
  10835. #else
  10836. "adc r4, r5\n\t"
  10837. #endif
  10838. "stm %[r]!, {r3, r4}\n\t"
  10839. "ldm %[a]!, {r3, r4}\n\t"
  10840. #ifdef WOLFSSL_KEIL
  10841. "adcs r3, r3, r5\n\t"
  10842. #elif defined(__clang__)
  10843. "adcs r3, r5\n\t"
  10844. #else
  10845. "adc r3, r5\n\t"
  10846. #endif
  10847. #ifdef WOLFSSL_KEIL
  10848. "adcs r4, r4, r5\n\t"
  10849. #elif defined(__clang__)
  10850. "adcs r4, r5\n\t"
  10851. #else
  10852. "adc r4, r5\n\t"
  10853. #endif
  10854. "stm %[r]!, {r3, r4}\n\t"
  10855. "ldm %[a]!, {r3, r4}\n\t"
  10856. #ifdef WOLFSSL_KEIL
  10857. "adcs r3, r3, r5\n\t"
  10858. #elif defined(__clang__)
  10859. "adcs r3, r5\n\t"
  10860. #else
  10861. "adc r3, r5\n\t"
  10862. #endif
  10863. #ifdef WOLFSSL_KEIL
  10864. "adcs r4, r4, r5\n\t"
  10865. #elif defined(__clang__)
  10866. "adcs r4, r5\n\t"
  10867. #else
  10868. "adc r4, r5\n\t"
  10869. #endif
  10870. "stm %[r]!, {r3, r4}\n\t"
  10871. "ldm %[a]!, {r3, r4}\n\t"
  10872. #ifdef WOLFSSL_KEIL
  10873. "adcs r3, r3, r5\n\t"
  10874. #elif defined(__clang__)
  10875. "adcs r3, r5\n\t"
  10876. #else
  10877. "adc r3, r5\n\t"
  10878. #endif
  10879. #ifdef WOLFSSL_KEIL
  10880. "adcs r4, r4, r5\n\t"
  10881. #elif defined(__clang__)
  10882. "adcs r4, r5\n\t"
  10883. #else
  10884. "adc r4, r5\n\t"
  10885. #endif
  10886. "stm %[r]!, {r3, r4}\n\t"
  10887. "ldm %[a]!, {r3, r4}\n\t"
  10888. #ifdef WOLFSSL_KEIL
  10889. "adcs r3, r3, r5\n\t"
  10890. #elif defined(__clang__)
  10891. "adcs r3, r5\n\t"
  10892. #else
  10893. "adc r3, r5\n\t"
  10894. #endif
  10895. #ifdef WOLFSSL_KEIL
  10896. "adcs r4, r4, r5\n\t"
  10897. #elif defined(__clang__)
  10898. "adcs r4, r5\n\t"
  10899. #else
  10900. "adc r4, r5\n\t"
  10901. #endif
  10902. "stm %[r]!, {r3, r4}\n\t"
  10903. "ldm %[a]!, {r3, r4}\n\t"
  10904. #ifdef WOLFSSL_KEIL
  10905. "adcs r3, r3, r5\n\t"
  10906. #elif defined(__clang__)
  10907. "adcs r3, r5\n\t"
  10908. #else
  10909. "adc r3, r5\n\t"
  10910. #endif
  10911. #ifdef WOLFSSL_KEIL
  10912. "adcs r4, r4, r5\n\t"
  10913. #elif defined(__clang__)
  10914. "adcs r4, r5\n\t"
  10915. #else
  10916. "adc r4, r5\n\t"
  10917. #endif
  10918. "stm %[r]!, {r3, r4}\n\t"
  10919. "ldm %[a]!, {r3, r4}\n\t"
  10920. #ifdef WOLFSSL_KEIL
  10921. "adcs r3, r3, r5\n\t"
  10922. #elif defined(__clang__)
  10923. "adcs r3, r5\n\t"
  10924. #else
  10925. "adc r3, r5\n\t"
  10926. #endif
  10927. #ifdef WOLFSSL_KEIL
  10928. "adcs r4, r4, r5\n\t"
  10929. #elif defined(__clang__)
  10930. "adcs r4, r5\n\t"
  10931. #else
  10932. "adc r4, r5\n\t"
  10933. #endif
  10934. "stm %[r]!, {r3, r4}\n\t"
  10935. "ldm %[a]!, {r3, r4}\n\t"
  10936. #ifdef WOLFSSL_KEIL
  10937. "adcs r3, r3, r5\n\t"
  10938. #elif defined(__clang__)
  10939. "adcs r3, r5\n\t"
  10940. #else
  10941. "adc r3, r5\n\t"
  10942. #endif
  10943. #ifdef WOLFSSL_KEIL
  10944. "adcs r4, r4, r5\n\t"
  10945. #elif defined(__clang__)
  10946. "adcs r4, r5\n\t"
  10947. #else
  10948. "adc r4, r5\n\t"
  10949. #endif
  10950. "stm %[r]!, {r3, r4}\n\t"
  10951. "ldm %[a]!, {r3, r4}\n\t"
  10952. #ifdef WOLFSSL_KEIL
  10953. "adcs r3, r3, r5\n\t"
  10954. #elif defined(__clang__)
  10955. "adcs r3, r5\n\t"
  10956. #else
  10957. "adc r3, r5\n\t"
  10958. #endif
  10959. #ifdef WOLFSSL_KEIL
  10960. "adcs r4, r4, r5\n\t"
  10961. #elif defined(__clang__)
  10962. "adcs r4, r5\n\t"
  10963. #else
  10964. "adc r4, r5\n\t"
  10965. #endif
  10966. "stm %[r]!, {r3, r4}\n\t"
  10967. "ldm %[a]!, {r3, r4}\n\t"
  10968. #ifdef WOLFSSL_KEIL
  10969. "adcs r3, r3, r5\n\t"
  10970. #elif defined(__clang__)
  10971. "adcs r3, r5\n\t"
  10972. #else
  10973. "adc r3, r5\n\t"
  10974. #endif
  10975. #ifdef WOLFSSL_KEIL
  10976. "adcs r4, r4, r5\n\t"
  10977. #elif defined(__clang__)
  10978. "adcs r4, r5\n\t"
  10979. #else
  10980. "adc r4, r5\n\t"
  10981. #endif
  10982. "stm %[r]!, {r3, r4}\n\t"
  10983. "ldm %[a]!, {r3, r4}\n\t"
  10984. #ifdef WOLFSSL_KEIL
  10985. "adcs r3, r3, r5\n\t"
  10986. #elif defined(__clang__)
  10987. "adcs r3, r5\n\t"
  10988. #else
  10989. "adc r3, r5\n\t"
  10990. #endif
  10991. #ifdef WOLFSSL_KEIL
  10992. "adcs r4, r4, r5\n\t"
  10993. #elif defined(__clang__)
  10994. "adcs r4, r5\n\t"
  10995. #else
  10996. "adc r4, r5\n\t"
  10997. #endif
  10998. "stm %[r]!, {r3, r4}\n\t"
  10999. "ldm %[a]!, {r3, r4}\n\t"
  11000. #ifdef WOLFSSL_KEIL
  11001. "adcs r3, r3, r5\n\t"
  11002. #elif defined(__clang__)
  11003. "adcs r3, r5\n\t"
  11004. #else
  11005. "adc r3, r5\n\t"
  11006. #endif
  11007. #ifdef WOLFSSL_KEIL
  11008. "adcs r4, r4, r5\n\t"
  11009. #elif defined(__clang__)
  11010. "adcs r4, r5\n\t"
  11011. #else
  11012. "adc r4, r5\n\t"
  11013. #endif
  11014. "stm %[r]!, {r3, r4}\n\t"
  11015. "ldm %[a]!, {r3, r4}\n\t"
  11016. #ifdef WOLFSSL_KEIL
  11017. "adcs r3, r3, r5\n\t"
  11018. #elif defined(__clang__)
  11019. "adcs r3, r5\n\t"
  11020. #else
  11021. "adc r3, r5\n\t"
  11022. #endif
  11023. #ifdef WOLFSSL_KEIL
  11024. "adcs r4, r4, r5\n\t"
  11025. #elif defined(__clang__)
  11026. "adcs r4, r5\n\t"
  11027. #else
  11028. "adc r4, r5\n\t"
  11029. #endif
  11030. "stm %[r]!, {r3, r4}\n\t"
  11031. "movs %[r], #0\n\t"
  11032. #ifdef WOLFSSL_KEIL
  11033. "adcs %[r], %[r], %[r]\n\t"
  11034. #elif defined(__clang__)
  11035. "adcs %[r], %[r]\n\t"
  11036. #else
  11037. "adc %[r], %[r]\n\t"
  11038. #endif
  11039. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  11040. :
  11041. : "memory", "r3", "r4", "r5"
  11042. );
  11043. return (uint32_t)(size_t)r;
  11044. }
  11045. /* Sub b from a into a. (a -= b)
  11046. *
  11047. * a A single precision integer.
  11048. * b A single precision integer.
  11049. */
  11050. SP_NOINLINE static sp_digit sp_2048_sub_in_place_64(sp_digit* a,
  11051. const sp_digit* b)
  11052. {
  11053. __asm__ __volatile__ (
  11054. "ldm %[b]!, {r4, r5}\n\t"
  11055. "ldr r2, [%[a]]\n\t"
  11056. "ldr r3, [%[a], #4]\n\t"
  11057. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11058. "subs r2, r2, r4\n\t"
  11059. #else
  11060. "sub r2, r2, r4\n\t"
  11061. #endif
  11062. #ifdef WOLFSSL_KEIL
  11063. "sbcs r3, r3, r5\n\t"
  11064. #elif defined(__clang__)
  11065. "sbcs r3, r5\n\t"
  11066. #else
  11067. "sbc r3, r5\n\t"
  11068. #endif
  11069. "stm %[a]!, {r2, r3}\n\t"
  11070. "ldm %[b]!, {r4, r5}\n\t"
  11071. "ldr r2, [%[a]]\n\t"
  11072. "ldr r3, [%[a], #4]\n\t"
  11073. #ifdef WOLFSSL_KEIL
  11074. "sbcs r2, r2, r4\n\t"
  11075. #elif defined(__clang__)
  11076. "sbcs r2, r4\n\t"
  11077. #else
  11078. "sbc r2, r4\n\t"
  11079. #endif
  11080. #ifdef WOLFSSL_KEIL
  11081. "sbcs r3, r3, r5\n\t"
  11082. #elif defined(__clang__)
  11083. "sbcs r3, r5\n\t"
  11084. #else
  11085. "sbc r3, r5\n\t"
  11086. #endif
  11087. "stm %[a]!, {r2, r3}\n\t"
  11088. "ldm %[b]!, {r4, r5}\n\t"
  11089. "ldr r2, [%[a]]\n\t"
  11090. "ldr r3, [%[a], #4]\n\t"
  11091. #ifdef WOLFSSL_KEIL
  11092. "sbcs r2, r2, r4\n\t"
  11093. #elif defined(__clang__)
  11094. "sbcs r2, r4\n\t"
  11095. #else
  11096. "sbc r2, r4\n\t"
  11097. #endif
  11098. #ifdef WOLFSSL_KEIL
  11099. "sbcs r3, r3, r5\n\t"
  11100. #elif defined(__clang__)
  11101. "sbcs r3, r5\n\t"
  11102. #else
  11103. "sbc r3, r5\n\t"
  11104. #endif
  11105. "stm %[a]!, {r2, r3}\n\t"
  11106. "ldm %[b]!, {r4, r5}\n\t"
  11107. "ldr r2, [%[a]]\n\t"
  11108. "ldr r3, [%[a], #4]\n\t"
  11109. #ifdef WOLFSSL_KEIL
  11110. "sbcs r2, r2, r4\n\t"
  11111. #elif defined(__clang__)
  11112. "sbcs r2, r4\n\t"
  11113. #else
  11114. "sbc r2, r4\n\t"
  11115. #endif
  11116. #ifdef WOLFSSL_KEIL
  11117. "sbcs r3, r3, r5\n\t"
  11118. #elif defined(__clang__)
  11119. "sbcs r3, r5\n\t"
  11120. #else
  11121. "sbc r3, r5\n\t"
  11122. #endif
  11123. "stm %[a]!, {r2, r3}\n\t"
  11124. "ldm %[b]!, {r4, r5}\n\t"
  11125. "ldr r2, [%[a]]\n\t"
  11126. "ldr r3, [%[a], #4]\n\t"
  11127. #ifdef WOLFSSL_KEIL
  11128. "sbcs r2, r2, r4\n\t"
  11129. #elif defined(__clang__)
  11130. "sbcs r2, r4\n\t"
  11131. #else
  11132. "sbc r2, r4\n\t"
  11133. #endif
  11134. #ifdef WOLFSSL_KEIL
  11135. "sbcs r3, r3, r5\n\t"
  11136. #elif defined(__clang__)
  11137. "sbcs r3, r5\n\t"
  11138. #else
  11139. "sbc r3, r5\n\t"
  11140. #endif
  11141. "stm %[a]!, {r2, r3}\n\t"
  11142. "ldm %[b]!, {r4, r5}\n\t"
  11143. "ldr r2, [%[a]]\n\t"
  11144. "ldr r3, [%[a], #4]\n\t"
  11145. #ifdef WOLFSSL_KEIL
  11146. "sbcs r2, r2, r4\n\t"
  11147. #elif defined(__clang__)
  11148. "sbcs r2, r4\n\t"
  11149. #else
  11150. "sbc r2, r4\n\t"
  11151. #endif
  11152. #ifdef WOLFSSL_KEIL
  11153. "sbcs r3, r3, r5\n\t"
  11154. #elif defined(__clang__)
  11155. "sbcs r3, r5\n\t"
  11156. #else
  11157. "sbc r3, r5\n\t"
  11158. #endif
  11159. "stm %[a]!, {r2, r3}\n\t"
  11160. "ldm %[b]!, {r4, r5}\n\t"
  11161. "ldr r2, [%[a]]\n\t"
  11162. "ldr r3, [%[a], #4]\n\t"
  11163. #ifdef WOLFSSL_KEIL
  11164. "sbcs r2, r2, r4\n\t"
  11165. #elif defined(__clang__)
  11166. "sbcs r2, r4\n\t"
  11167. #else
  11168. "sbc r2, r4\n\t"
  11169. #endif
  11170. #ifdef WOLFSSL_KEIL
  11171. "sbcs r3, r3, r5\n\t"
  11172. #elif defined(__clang__)
  11173. "sbcs r3, r5\n\t"
  11174. #else
  11175. "sbc r3, r5\n\t"
  11176. #endif
  11177. "stm %[a]!, {r2, r3}\n\t"
  11178. "ldm %[b]!, {r4, r5}\n\t"
  11179. "ldr r2, [%[a]]\n\t"
  11180. "ldr r3, [%[a], #4]\n\t"
  11181. #ifdef WOLFSSL_KEIL
  11182. "sbcs r2, r2, r4\n\t"
  11183. #elif defined(__clang__)
  11184. "sbcs r2, r4\n\t"
  11185. #else
  11186. "sbc r2, r4\n\t"
  11187. #endif
  11188. #ifdef WOLFSSL_KEIL
  11189. "sbcs r3, r3, r5\n\t"
  11190. #elif defined(__clang__)
  11191. "sbcs r3, r5\n\t"
  11192. #else
  11193. "sbc r3, r5\n\t"
  11194. #endif
  11195. "stm %[a]!, {r2, r3}\n\t"
  11196. "ldm %[b]!, {r4, r5}\n\t"
  11197. "ldr r2, [%[a]]\n\t"
  11198. "ldr r3, [%[a], #4]\n\t"
  11199. #ifdef WOLFSSL_KEIL
  11200. "sbcs r2, r2, r4\n\t"
  11201. #elif defined(__clang__)
  11202. "sbcs r2, r4\n\t"
  11203. #else
  11204. "sbc r2, r4\n\t"
  11205. #endif
  11206. #ifdef WOLFSSL_KEIL
  11207. "sbcs r3, r3, r5\n\t"
  11208. #elif defined(__clang__)
  11209. "sbcs r3, r5\n\t"
  11210. #else
  11211. "sbc r3, r5\n\t"
  11212. #endif
  11213. "stm %[a]!, {r2, r3}\n\t"
  11214. "ldm %[b]!, {r4, r5}\n\t"
  11215. "ldr r2, [%[a]]\n\t"
  11216. "ldr r3, [%[a], #4]\n\t"
  11217. #ifdef WOLFSSL_KEIL
  11218. "sbcs r2, r2, r4\n\t"
  11219. #elif defined(__clang__)
  11220. "sbcs r2, r4\n\t"
  11221. #else
  11222. "sbc r2, r4\n\t"
  11223. #endif
  11224. #ifdef WOLFSSL_KEIL
  11225. "sbcs r3, r3, r5\n\t"
  11226. #elif defined(__clang__)
  11227. "sbcs r3, r5\n\t"
  11228. #else
  11229. "sbc r3, r5\n\t"
  11230. #endif
  11231. "stm %[a]!, {r2, r3}\n\t"
  11232. "ldm %[b]!, {r4, r5}\n\t"
  11233. "ldr r2, [%[a]]\n\t"
  11234. "ldr r3, [%[a], #4]\n\t"
  11235. #ifdef WOLFSSL_KEIL
  11236. "sbcs r2, r2, r4\n\t"
  11237. #elif defined(__clang__)
  11238. "sbcs r2, r4\n\t"
  11239. #else
  11240. "sbc r2, r4\n\t"
  11241. #endif
  11242. #ifdef WOLFSSL_KEIL
  11243. "sbcs r3, r3, r5\n\t"
  11244. #elif defined(__clang__)
  11245. "sbcs r3, r5\n\t"
  11246. #else
  11247. "sbc r3, r5\n\t"
  11248. #endif
  11249. "stm %[a]!, {r2, r3}\n\t"
  11250. "ldm %[b]!, {r4, r5}\n\t"
  11251. "ldr r2, [%[a]]\n\t"
  11252. "ldr r3, [%[a], #4]\n\t"
  11253. #ifdef WOLFSSL_KEIL
  11254. "sbcs r2, r2, r4\n\t"
  11255. #elif defined(__clang__)
  11256. "sbcs r2, r4\n\t"
  11257. #else
  11258. "sbc r2, r4\n\t"
  11259. #endif
  11260. #ifdef WOLFSSL_KEIL
  11261. "sbcs r3, r3, r5\n\t"
  11262. #elif defined(__clang__)
  11263. "sbcs r3, r5\n\t"
  11264. #else
  11265. "sbc r3, r5\n\t"
  11266. #endif
  11267. "stm %[a]!, {r2, r3}\n\t"
  11268. "ldm %[b]!, {r4, r5}\n\t"
  11269. "ldr r2, [%[a]]\n\t"
  11270. "ldr r3, [%[a], #4]\n\t"
  11271. #ifdef WOLFSSL_KEIL
  11272. "sbcs r2, r2, r4\n\t"
  11273. #elif defined(__clang__)
  11274. "sbcs r2, r4\n\t"
  11275. #else
  11276. "sbc r2, r4\n\t"
  11277. #endif
  11278. #ifdef WOLFSSL_KEIL
  11279. "sbcs r3, r3, r5\n\t"
  11280. #elif defined(__clang__)
  11281. "sbcs r3, r5\n\t"
  11282. #else
  11283. "sbc r3, r5\n\t"
  11284. #endif
  11285. "stm %[a]!, {r2, r3}\n\t"
  11286. "ldm %[b]!, {r4, r5}\n\t"
  11287. "ldr r2, [%[a]]\n\t"
  11288. "ldr r3, [%[a], #4]\n\t"
  11289. #ifdef WOLFSSL_KEIL
  11290. "sbcs r2, r2, r4\n\t"
  11291. #elif defined(__clang__)
  11292. "sbcs r2, r4\n\t"
  11293. #else
  11294. "sbc r2, r4\n\t"
  11295. #endif
  11296. #ifdef WOLFSSL_KEIL
  11297. "sbcs r3, r3, r5\n\t"
  11298. #elif defined(__clang__)
  11299. "sbcs r3, r5\n\t"
  11300. #else
  11301. "sbc r3, r5\n\t"
  11302. #endif
  11303. "stm %[a]!, {r2, r3}\n\t"
  11304. "ldm %[b]!, {r4, r5}\n\t"
  11305. "ldr r2, [%[a]]\n\t"
  11306. "ldr r3, [%[a], #4]\n\t"
  11307. #ifdef WOLFSSL_KEIL
  11308. "sbcs r2, r2, r4\n\t"
  11309. #elif defined(__clang__)
  11310. "sbcs r2, r4\n\t"
  11311. #else
  11312. "sbc r2, r4\n\t"
  11313. #endif
  11314. #ifdef WOLFSSL_KEIL
  11315. "sbcs r3, r3, r5\n\t"
  11316. #elif defined(__clang__)
  11317. "sbcs r3, r5\n\t"
  11318. #else
  11319. "sbc r3, r5\n\t"
  11320. #endif
  11321. "stm %[a]!, {r2, r3}\n\t"
  11322. "ldm %[b]!, {r4, r5}\n\t"
  11323. "ldr r2, [%[a]]\n\t"
  11324. "ldr r3, [%[a], #4]\n\t"
  11325. #ifdef WOLFSSL_KEIL
  11326. "sbcs r2, r2, r4\n\t"
  11327. #elif defined(__clang__)
  11328. "sbcs r2, r4\n\t"
  11329. #else
  11330. "sbc r2, r4\n\t"
  11331. #endif
  11332. #ifdef WOLFSSL_KEIL
  11333. "sbcs r3, r3, r5\n\t"
  11334. #elif defined(__clang__)
  11335. "sbcs r3, r5\n\t"
  11336. #else
  11337. "sbc r3, r5\n\t"
  11338. #endif
  11339. "stm %[a]!, {r2, r3}\n\t"
  11340. "ldm %[b]!, {r4, r5}\n\t"
  11341. "ldr r2, [%[a]]\n\t"
  11342. "ldr r3, [%[a], #4]\n\t"
  11343. #ifdef WOLFSSL_KEIL
  11344. "sbcs r2, r2, r4\n\t"
  11345. #elif defined(__clang__)
  11346. "sbcs r2, r4\n\t"
  11347. #else
  11348. "sbc r2, r4\n\t"
  11349. #endif
  11350. #ifdef WOLFSSL_KEIL
  11351. "sbcs r3, r3, r5\n\t"
  11352. #elif defined(__clang__)
  11353. "sbcs r3, r5\n\t"
  11354. #else
  11355. "sbc r3, r5\n\t"
  11356. #endif
  11357. "stm %[a]!, {r2, r3}\n\t"
  11358. "ldm %[b]!, {r4, r5}\n\t"
  11359. "ldr r2, [%[a]]\n\t"
  11360. "ldr r3, [%[a], #4]\n\t"
  11361. #ifdef WOLFSSL_KEIL
  11362. "sbcs r2, r2, r4\n\t"
  11363. #elif defined(__clang__)
  11364. "sbcs r2, r4\n\t"
  11365. #else
  11366. "sbc r2, r4\n\t"
  11367. #endif
  11368. #ifdef WOLFSSL_KEIL
  11369. "sbcs r3, r3, r5\n\t"
  11370. #elif defined(__clang__)
  11371. "sbcs r3, r5\n\t"
  11372. #else
  11373. "sbc r3, r5\n\t"
  11374. #endif
  11375. "stm %[a]!, {r2, r3}\n\t"
  11376. "ldm %[b]!, {r4, r5}\n\t"
  11377. "ldr r2, [%[a]]\n\t"
  11378. "ldr r3, [%[a], #4]\n\t"
  11379. #ifdef WOLFSSL_KEIL
  11380. "sbcs r2, r2, r4\n\t"
  11381. #elif defined(__clang__)
  11382. "sbcs r2, r4\n\t"
  11383. #else
  11384. "sbc r2, r4\n\t"
  11385. #endif
  11386. #ifdef WOLFSSL_KEIL
  11387. "sbcs r3, r3, r5\n\t"
  11388. #elif defined(__clang__)
  11389. "sbcs r3, r5\n\t"
  11390. #else
  11391. "sbc r3, r5\n\t"
  11392. #endif
  11393. "stm %[a]!, {r2, r3}\n\t"
  11394. "ldm %[b]!, {r4, r5}\n\t"
  11395. "ldr r2, [%[a]]\n\t"
  11396. "ldr r3, [%[a], #4]\n\t"
  11397. #ifdef WOLFSSL_KEIL
  11398. "sbcs r2, r2, r4\n\t"
  11399. #elif defined(__clang__)
  11400. "sbcs r2, r4\n\t"
  11401. #else
  11402. "sbc r2, r4\n\t"
  11403. #endif
  11404. #ifdef WOLFSSL_KEIL
  11405. "sbcs r3, r3, r5\n\t"
  11406. #elif defined(__clang__)
  11407. "sbcs r3, r5\n\t"
  11408. #else
  11409. "sbc r3, r5\n\t"
  11410. #endif
  11411. "stm %[a]!, {r2, r3}\n\t"
  11412. "ldm %[b]!, {r4, r5}\n\t"
  11413. "ldr r2, [%[a]]\n\t"
  11414. "ldr r3, [%[a], #4]\n\t"
  11415. #ifdef WOLFSSL_KEIL
  11416. "sbcs r2, r2, r4\n\t"
  11417. #elif defined(__clang__)
  11418. "sbcs r2, r4\n\t"
  11419. #else
  11420. "sbc r2, r4\n\t"
  11421. #endif
  11422. #ifdef WOLFSSL_KEIL
  11423. "sbcs r3, r3, r5\n\t"
  11424. #elif defined(__clang__)
  11425. "sbcs r3, r5\n\t"
  11426. #else
  11427. "sbc r3, r5\n\t"
  11428. #endif
  11429. "stm %[a]!, {r2, r3}\n\t"
  11430. "ldm %[b]!, {r4, r5}\n\t"
  11431. "ldr r2, [%[a]]\n\t"
  11432. "ldr r3, [%[a], #4]\n\t"
  11433. #ifdef WOLFSSL_KEIL
  11434. "sbcs r2, r2, r4\n\t"
  11435. #elif defined(__clang__)
  11436. "sbcs r2, r4\n\t"
  11437. #else
  11438. "sbc r2, r4\n\t"
  11439. #endif
  11440. #ifdef WOLFSSL_KEIL
  11441. "sbcs r3, r3, r5\n\t"
  11442. #elif defined(__clang__)
  11443. "sbcs r3, r5\n\t"
  11444. #else
  11445. "sbc r3, r5\n\t"
  11446. #endif
  11447. "stm %[a]!, {r2, r3}\n\t"
  11448. "ldm %[b]!, {r4, r5}\n\t"
  11449. "ldr r2, [%[a]]\n\t"
  11450. "ldr r3, [%[a], #4]\n\t"
  11451. #ifdef WOLFSSL_KEIL
  11452. "sbcs r2, r2, r4\n\t"
  11453. #elif defined(__clang__)
  11454. "sbcs r2, r4\n\t"
  11455. #else
  11456. "sbc r2, r4\n\t"
  11457. #endif
  11458. #ifdef WOLFSSL_KEIL
  11459. "sbcs r3, r3, r5\n\t"
  11460. #elif defined(__clang__)
  11461. "sbcs r3, r5\n\t"
  11462. #else
  11463. "sbc r3, r5\n\t"
  11464. #endif
  11465. "stm %[a]!, {r2, r3}\n\t"
  11466. "ldm %[b]!, {r4, r5}\n\t"
  11467. "ldr r2, [%[a]]\n\t"
  11468. "ldr r3, [%[a], #4]\n\t"
  11469. #ifdef WOLFSSL_KEIL
  11470. "sbcs r2, r2, r4\n\t"
  11471. #elif defined(__clang__)
  11472. "sbcs r2, r4\n\t"
  11473. #else
  11474. "sbc r2, r4\n\t"
  11475. #endif
  11476. #ifdef WOLFSSL_KEIL
  11477. "sbcs r3, r3, r5\n\t"
  11478. #elif defined(__clang__)
  11479. "sbcs r3, r5\n\t"
  11480. #else
  11481. "sbc r3, r5\n\t"
  11482. #endif
  11483. "stm %[a]!, {r2, r3}\n\t"
  11484. "ldm %[b]!, {r4, r5}\n\t"
  11485. "ldr r2, [%[a]]\n\t"
  11486. "ldr r3, [%[a], #4]\n\t"
  11487. #ifdef WOLFSSL_KEIL
  11488. "sbcs r2, r2, r4\n\t"
  11489. #elif defined(__clang__)
  11490. "sbcs r2, r4\n\t"
  11491. #else
  11492. "sbc r2, r4\n\t"
  11493. #endif
  11494. #ifdef WOLFSSL_KEIL
  11495. "sbcs r3, r3, r5\n\t"
  11496. #elif defined(__clang__)
  11497. "sbcs r3, r5\n\t"
  11498. #else
  11499. "sbc r3, r5\n\t"
  11500. #endif
  11501. "stm %[a]!, {r2, r3}\n\t"
  11502. "ldm %[b]!, {r4, r5}\n\t"
  11503. "ldr r2, [%[a]]\n\t"
  11504. "ldr r3, [%[a], #4]\n\t"
  11505. #ifdef WOLFSSL_KEIL
  11506. "sbcs r2, r2, r4\n\t"
  11507. #elif defined(__clang__)
  11508. "sbcs r2, r4\n\t"
  11509. #else
  11510. "sbc r2, r4\n\t"
  11511. #endif
  11512. #ifdef WOLFSSL_KEIL
  11513. "sbcs r3, r3, r5\n\t"
  11514. #elif defined(__clang__)
  11515. "sbcs r3, r5\n\t"
  11516. #else
  11517. "sbc r3, r5\n\t"
  11518. #endif
  11519. "stm %[a]!, {r2, r3}\n\t"
  11520. "ldm %[b]!, {r4, r5}\n\t"
  11521. "ldr r2, [%[a]]\n\t"
  11522. "ldr r3, [%[a], #4]\n\t"
  11523. #ifdef WOLFSSL_KEIL
  11524. "sbcs r2, r2, r4\n\t"
  11525. #elif defined(__clang__)
  11526. "sbcs r2, r4\n\t"
  11527. #else
  11528. "sbc r2, r4\n\t"
  11529. #endif
  11530. #ifdef WOLFSSL_KEIL
  11531. "sbcs r3, r3, r5\n\t"
  11532. #elif defined(__clang__)
  11533. "sbcs r3, r5\n\t"
  11534. #else
  11535. "sbc r3, r5\n\t"
  11536. #endif
  11537. "stm %[a]!, {r2, r3}\n\t"
  11538. "ldm %[b]!, {r4, r5}\n\t"
  11539. "ldr r2, [%[a]]\n\t"
  11540. "ldr r3, [%[a], #4]\n\t"
  11541. #ifdef WOLFSSL_KEIL
  11542. "sbcs r2, r2, r4\n\t"
  11543. #elif defined(__clang__)
  11544. "sbcs r2, r4\n\t"
  11545. #else
  11546. "sbc r2, r4\n\t"
  11547. #endif
  11548. #ifdef WOLFSSL_KEIL
  11549. "sbcs r3, r3, r5\n\t"
  11550. #elif defined(__clang__)
  11551. "sbcs r3, r5\n\t"
  11552. #else
  11553. "sbc r3, r5\n\t"
  11554. #endif
  11555. "stm %[a]!, {r2, r3}\n\t"
  11556. "ldm %[b]!, {r4, r5}\n\t"
  11557. "ldr r2, [%[a]]\n\t"
  11558. "ldr r3, [%[a], #4]\n\t"
  11559. #ifdef WOLFSSL_KEIL
  11560. "sbcs r2, r2, r4\n\t"
  11561. #elif defined(__clang__)
  11562. "sbcs r2, r4\n\t"
  11563. #else
  11564. "sbc r2, r4\n\t"
  11565. #endif
  11566. #ifdef WOLFSSL_KEIL
  11567. "sbcs r3, r3, r5\n\t"
  11568. #elif defined(__clang__)
  11569. "sbcs r3, r5\n\t"
  11570. #else
  11571. "sbc r3, r5\n\t"
  11572. #endif
  11573. "stm %[a]!, {r2, r3}\n\t"
  11574. "ldm %[b]!, {r4, r5}\n\t"
  11575. "ldr r2, [%[a]]\n\t"
  11576. "ldr r3, [%[a], #4]\n\t"
  11577. #ifdef WOLFSSL_KEIL
  11578. "sbcs r2, r2, r4\n\t"
  11579. #elif defined(__clang__)
  11580. "sbcs r2, r4\n\t"
  11581. #else
  11582. "sbc r2, r4\n\t"
  11583. #endif
  11584. #ifdef WOLFSSL_KEIL
  11585. "sbcs r3, r3, r5\n\t"
  11586. #elif defined(__clang__)
  11587. "sbcs r3, r5\n\t"
  11588. #else
  11589. "sbc r3, r5\n\t"
  11590. #endif
  11591. "stm %[a]!, {r2, r3}\n\t"
  11592. "ldm %[b]!, {r4, r5}\n\t"
  11593. "ldr r2, [%[a]]\n\t"
  11594. "ldr r3, [%[a], #4]\n\t"
  11595. #ifdef WOLFSSL_KEIL
  11596. "sbcs r2, r2, r4\n\t"
  11597. #elif defined(__clang__)
  11598. "sbcs r2, r4\n\t"
  11599. #else
  11600. "sbc r2, r4\n\t"
  11601. #endif
  11602. #ifdef WOLFSSL_KEIL
  11603. "sbcs r3, r3, r5\n\t"
  11604. #elif defined(__clang__)
  11605. "sbcs r3, r5\n\t"
  11606. #else
  11607. "sbc r3, r5\n\t"
  11608. #endif
  11609. "stm %[a]!, {r2, r3}\n\t"
  11610. "ldm %[b]!, {r4, r5}\n\t"
  11611. "ldr r2, [%[a]]\n\t"
  11612. "ldr r3, [%[a], #4]\n\t"
  11613. #ifdef WOLFSSL_KEIL
  11614. "sbcs r2, r2, r4\n\t"
  11615. #elif defined(__clang__)
  11616. "sbcs r2, r4\n\t"
  11617. #else
  11618. "sbc r2, r4\n\t"
  11619. #endif
  11620. #ifdef WOLFSSL_KEIL
  11621. "sbcs r3, r3, r5\n\t"
  11622. #elif defined(__clang__)
  11623. "sbcs r3, r5\n\t"
  11624. #else
  11625. "sbc r3, r5\n\t"
  11626. #endif
  11627. "stm %[a]!, {r2, r3}\n\t"
  11628. #ifdef WOLFSSL_KEIL
  11629. "sbcs %[a], %[a], %[a]\n\t"
  11630. #elif defined(__clang__)
  11631. "sbcs %[a], %[a]\n\t"
  11632. #else
  11633. "sbc %[a], %[a]\n\t"
  11634. #endif
  11635. : [a] "+l" (a), [b] "+l" (b)
  11636. :
  11637. : "memory", "r2", "r3", "r4", "r5"
  11638. );
  11639. return (uint32_t)(size_t)a;
  11640. }
  11641. /* Add b to a into r. (r = a + b)
  11642. *
  11643. * r A single precision integer.
  11644. * a A single precision integer.
  11645. * b A single precision integer.
  11646. */
  11647. SP_NOINLINE static sp_digit sp_2048_add_64(sp_digit* r, const sp_digit* a,
  11648. const sp_digit* b)
  11649. {
  11650. __asm__ __volatile__ (
  11651. "ldm %[b]!, {r5, r6}\n\t"
  11652. "ldm %[a]!, {r3, r4}\n\t"
  11653. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11654. "adds r3, r3, r5\n\t"
  11655. #else
  11656. "add r3, r3, r5\n\t"
  11657. #endif
  11658. #ifdef WOLFSSL_KEIL
  11659. "adcs r4, r4, r6\n\t"
  11660. #elif defined(__clang__)
  11661. "adcs r4, r6\n\t"
  11662. #else
  11663. "adc r4, r6\n\t"
  11664. #endif
  11665. "stm %[r]!, {r3, r4}\n\t"
  11666. "ldm %[b]!, {r5, r6}\n\t"
  11667. "ldm %[a]!, {r3, r4}\n\t"
  11668. #ifdef WOLFSSL_KEIL
  11669. "adcs r3, r3, r5\n\t"
  11670. #elif defined(__clang__)
  11671. "adcs r3, r5\n\t"
  11672. #else
  11673. "adc r3, r5\n\t"
  11674. #endif
  11675. #ifdef WOLFSSL_KEIL
  11676. "adcs r4, r4, r6\n\t"
  11677. #elif defined(__clang__)
  11678. "adcs r4, r6\n\t"
  11679. #else
  11680. "adc r4, r6\n\t"
  11681. #endif
  11682. "stm %[r]!, {r3, r4}\n\t"
  11683. "ldm %[b]!, {r5, r6}\n\t"
  11684. "ldm %[a]!, {r3, r4}\n\t"
  11685. #ifdef WOLFSSL_KEIL
  11686. "adcs r3, r3, r5\n\t"
  11687. #elif defined(__clang__)
  11688. "adcs r3, r5\n\t"
  11689. #else
  11690. "adc r3, r5\n\t"
  11691. #endif
  11692. #ifdef WOLFSSL_KEIL
  11693. "adcs r4, r4, r6\n\t"
  11694. #elif defined(__clang__)
  11695. "adcs r4, r6\n\t"
  11696. #else
  11697. "adc r4, r6\n\t"
  11698. #endif
  11699. "stm %[r]!, {r3, r4}\n\t"
  11700. "ldm %[b]!, {r5, r6}\n\t"
  11701. "ldm %[a]!, {r3, r4}\n\t"
  11702. #ifdef WOLFSSL_KEIL
  11703. "adcs r3, r3, r5\n\t"
  11704. #elif defined(__clang__)
  11705. "adcs r3, r5\n\t"
  11706. #else
  11707. "adc r3, r5\n\t"
  11708. #endif
  11709. #ifdef WOLFSSL_KEIL
  11710. "adcs r4, r4, r6\n\t"
  11711. #elif defined(__clang__)
  11712. "adcs r4, r6\n\t"
  11713. #else
  11714. "adc r4, r6\n\t"
  11715. #endif
  11716. "stm %[r]!, {r3, r4}\n\t"
  11717. "ldm %[b]!, {r5, r6}\n\t"
  11718. "ldm %[a]!, {r3, r4}\n\t"
  11719. #ifdef WOLFSSL_KEIL
  11720. "adcs r3, r3, r5\n\t"
  11721. #elif defined(__clang__)
  11722. "adcs r3, r5\n\t"
  11723. #else
  11724. "adc r3, r5\n\t"
  11725. #endif
  11726. #ifdef WOLFSSL_KEIL
  11727. "adcs r4, r4, r6\n\t"
  11728. #elif defined(__clang__)
  11729. "adcs r4, r6\n\t"
  11730. #else
  11731. "adc r4, r6\n\t"
  11732. #endif
  11733. "stm %[r]!, {r3, r4}\n\t"
  11734. "ldm %[b]!, {r5, r6}\n\t"
  11735. "ldm %[a]!, {r3, r4}\n\t"
  11736. #ifdef WOLFSSL_KEIL
  11737. "adcs r3, r3, r5\n\t"
  11738. #elif defined(__clang__)
  11739. "adcs r3, r5\n\t"
  11740. #else
  11741. "adc r3, r5\n\t"
  11742. #endif
  11743. #ifdef WOLFSSL_KEIL
  11744. "adcs r4, r4, r6\n\t"
  11745. #elif defined(__clang__)
  11746. "adcs r4, r6\n\t"
  11747. #else
  11748. "adc r4, r6\n\t"
  11749. #endif
  11750. "stm %[r]!, {r3, r4}\n\t"
  11751. "ldm %[b]!, {r5, r6}\n\t"
  11752. "ldm %[a]!, {r3, r4}\n\t"
  11753. #ifdef WOLFSSL_KEIL
  11754. "adcs r3, r3, r5\n\t"
  11755. #elif defined(__clang__)
  11756. "adcs r3, r5\n\t"
  11757. #else
  11758. "adc r3, r5\n\t"
  11759. #endif
  11760. #ifdef WOLFSSL_KEIL
  11761. "adcs r4, r4, r6\n\t"
  11762. #elif defined(__clang__)
  11763. "adcs r4, r6\n\t"
  11764. #else
  11765. "adc r4, r6\n\t"
  11766. #endif
  11767. "stm %[r]!, {r3, r4}\n\t"
  11768. "ldm %[b]!, {r5, r6}\n\t"
  11769. "ldm %[a]!, {r3, r4}\n\t"
  11770. #ifdef WOLFSSL_KEIL
  11771. "adcs r3, r3, r5\n\t"
  11772. #elif defined(__clang__)
  11773. "adcs r3, r5\n\t"
  11774. #else
  11775. "adc r3, r5\n\t"
  11776. #endif
  11777. #ifdef WOLFSSL_KEIL
  11778. "adcs r4, r4, r6\n\t"
  11779. #elif defined(__clang__)
  11780. "adcs r4, r6\n\t"
  11781. #else
  11782. "adc r4, r6\n\t"
  11783. #endif
  11784. "stm %[r]!, {r3, r4}\n\t"
  11785. "ldm %[b]!, {r5, r6}\n\t"
  11786. "ldm %[a]!, {r3, r4}\n\t"
  11787. #ifdef WOLFSSL_KEIL
  11788. "adcs r3, r3, r5\n\t"
  11789. #elif defined(__clang__)
  11790. "adcs r3, r5\n\t"
  11791. #else
  11792. "adc r3, r5\n\t"
  11793. #endif
  11794. #ifdef WOLFSSL_KEIL
  11795. "adcs r4, r4, r6\n\t"
  11796. #elif defined(__clang__)
  11797. "adcs r4, r6\n\t"
  11798. #else
  11799. "adc r4, r6\n\t"
  11800. #endif
  11801. "stm %[r]!, {r3, r4}\n\t"
  11802. "ldm %[b]!, {r5, r6}\n\t"
  11803. "ldm %[a]!, {r3, r4}\n\t"
  11804. #ifdef WOLFSSL_KEIL
  11805. "adcs r3, r3, r5\n\t"
  11806. #elif defined(__clang__)
  11807. "adcs r3, r5\n\t"
  11808. #else
  11809. "adc r3, r5\n\t"
  11810. #endif
  11811. #ifdef WOLFSSL_KEIL
  11812. "adcs r4, r4, r6\n\t"
  11813. #elif defined(__clang__)
  11814. "adcs r4, r6\n\t"
  11815. #else
  11816. "adc r4, r6\n\t"
  11817. #endif
  11818. "stm %[r]!, {r3, r4}\n\t"
  11819. "ldm %[b]!, {r5, r6}\n\t"
  11820. "ldm %[a]!, {r3, r4}\n\t"
  11821. #ifdef WOLFSSL_KEIL
  11822. "adcs r3, r3, r5\n\t"
  11823. #elif defined(__clang__)
  11824. "adcs r3, r5\n\t"
  11825. #else
  11826. "adc r3, r5\n\t"
  11827. #endif
  11828. #ifdef WOLFSSL_KEIL
  11829. "adcs r4, r4, r6\n\t"
  11830. #elif defined(__clang__)
  11831. "adcs r4, r6\n\t"
  11832. #else
  11833. "adc r4, r6\n\t"
  11834. #endif
  11835. "stm %[r]!, {r3, r4}\n\t"
  11836. "ldm %[b]!, {r5, r6}\n\t"
  11837. "ldm %[a]!, {r3, r4}\n\t"
  11838. #ifdef WOLFSSL_KEIL
  11839. "adcs r3, r3, r5\n\t"
  11840. #elif defined(__clang__)
  11841. "adcs r3, r5\n\t"
  11842. #else
  11843. "adc r3, r5\n\t"
  11844. #endif
  11845. #ifdef WOLFSSL_KEIL
  11846. "adcs r4, r4, r6\n\t"
  11847. #elif defined(__clang__)
  11848. "adcs r4, r6\n\t"
  11849. #else
  11850. "adc r4, r6\n\t"
  11851. #endif
  11852. "stm %[r]!, {r3, r4}\n\t"
  11853. "ldm %[b]!, {r5, r6}\n\t"
  11854. "ldm %[a]!, {r3, r4}\n\t"
  11855. #ifdef WOLFSSL_KEIL
  11856. "adcs r3, r3, r5\n\t"
  11857. #elif defined(__clang__)
  11858. "adcs r3, r5\n\t"
  11859. #else
  11860. "adc r3, r5\n\t"
  11861. #endif
  11862. #ifdef WOLFSSL_KEIL
  11863. "adcs r4, r4, r6\n\t"
  11864. #elif defined(__clang__)
  11865. "adcs r4, r6\n\t"
  11866. #else
  11867. "adc r4, r6\n\t"
  11868. #endif
  11869. "stm %[r]!, {r3, r4}\n\t"
  11870. "ldm %[b]!, {r5, r6}\n\t"
  11871. "ldm %[a]!, {r3, r4}\n\t"
  11872. #ifdef WOLFSSL_KEIL
  11873. "adcs r3, r3, r5\n\t"
  11874. #elif defined(__clang__)
  11875. "adcs r3, r5\n\t"
  11876. #else
  11877. "adc r3, r5\n\t"
  11878. #endif
  11879. #ifdef WOLFSSL_KEIL
  11880. "adcs r4, r4, r6\n\t"
  11881. #elif defined(__clang__)
  11882. "adcs r4, r6\n\t"
  11883. #else
  11884. "adc r4, r6\n\t"
  11885. #endif
  11886. "stm %[r]!, {r3, r4}\n\t"
  11887. "ldm %[b]!, {r5, r6}\n\t"
  11888. "ldm %[a]!, {r3, r4}\n\t"
  11889. #ifdef WOLFSSL_KEIL
  11890. "adcs r3, r3, r5\n\t"
  11891. #elif defined(__clang__)
  11892. "adcs r3, r5\n\t"
  11893. #else
  11894. "adc r3, r5\n\t"
  11895. #endif
  11896. #ifdef WOLFSSL_KEIL
  11897. "adcs r4, r4, r6\n\t"
  11898. #elif defined(__clang__)
  11899. "adcs r4, r6\n\t"
  11900. #else
  11901. "adc r4, r6\n\t"
  11902. #endif
  11903. "stm %[r]!, {r3, r4}\n\t"
  11904. "ldm %[b]!, {r5, r6}\n\t"
  11905. "ldm %[a]!, {r3, r4}\n\t"
  11906. #ifdef WOLFSSL_KEIL
  11907. "adcs r3, r3, r5\n\t"
  11908. #elif defined(__clang__)
  11909. "adcs r3, r5\n\t"
  11910. #else
  11911. "adc r3, r5\n\t"
  11912. #endif
  11913. #ifdef WOLFSSL_KEIL
  11914. "adcs r4, r4, r6\n\t"
  11915. #elif defined(__clang__)
  11916. "adcs r4, r6\n\t"
  11917. #else
  11918. "adc r4, r6\n\t"
  11919. #endif
  11920. "stm %[r]!, {r3, r4}\n\t"
  11921. "ldm %[b]!, {r5, r6}\n\t"
  11922. "ldm %[a]!, {r3, r4}\n\t"
  11923. #ifdef WOLFSSL_KEIL
  11924. "adcs r3, r3, r5\n\t"
  11925. #elif defined(__clang__)
  11926. "adcs r3, r5\n\t"
  11927. #else
  11928. "adc r3, r5\n\t"
  11929. #endif
  11930. #ifdef WOLFSSL_KEIL
  11931. "adcs r4, r4, r6\n\t"
  11932. #elif defined(__clang__)
  11933. "adcs r4, r6\n\t"
  11934. #else
  11935. "adc r4, r6\n\t"
  11936. #endif
  11937. "stm %[r]!, {r3, r4}\n\t"
  11938. "ldm %[b]!, {r5, r6}\n\t"
  11939. "ldm %[a]!, {r3, r4}\n\t"
  11940. #ifdef WOLFSSL_KEIL
  11941. "adcs r3, r3, r5\n\t"
  11942. #elif defined(__clang__)
  11943. "adcs r3, r5\n\t"
  11944. #else
  11945. "adc r3, r5\n\t"
  11946. #endif
  11947. #ifdef WOLFSSL_KEIL
  11948. "adcs r4, r4, r6\n\t"
  11949. #elif defined(__clang__)
  11950. "adcs r4, r6\n\t"
  11951. #else
  11952. "adc r4, r6\n\t"
  11953. #endif
  11954. "stm %[r]!, {r3, r4}\n\t"
  11955. "ldm %[b]!, {r5, r6}\n\t"
  11956. "ldm %[a]!, {r3, r4}\n\t"
  11957. #ifdef WOLFSSL_KEIL
  11958. "adcs r3, r3, r5\n\t"
  11959. #elif defined(__clang__)
  11960. "adcs r3, r5\n\t"
  11961. #else
  11962. "adc r3, r5\n\t"
  11963. #endif
  11964. #ifdef WOLFSSL_KEIL
  11965. "adcs r4, r4, r6\n\t"
  11966. #elif defined(__clang__)
  11967. "adcs r4, r6\n\t"
  11968. #else
  11969. "adc r4, r6\n\t"
  11970. #endif
  11971. "stm %[r]!, {r3, r4}\n\t"
  11972. "ldm %[b]!, {r5, r6}\n\t"
  11973. "ldm %[a]!, {r3, r4}\n\t"
  11974. #ifdef WOLFSSL_KEIL
  11975. "adcs r3, r3, r5\n\t"
  11976. #elif defined(__clang__)
  11977. "adcs r3, r5\n\t"
  11978. #else
  11979. "adc r3, r5\n\t"
  11980. #endif
  11981. #ifdef WOLFSSL_KEIL
  11982. "adcs r4, r4, r6\n\t"
  11983. #elif defined(__clang__)
  11984. "adcs r4, r6\n\t"
  11985. #else
  11986. "adc r4, r6\n\t"
  11987. #endif
  11988. "stm %[r]!, {r3, r4}\n\t"
  11989. "ldm %[b]!, {r5, r6}\n\t"
  11990. "ldm %[a]!, {r3, r4}\n\t"
  11991. #ifdef WOLFSSL_KEIL
  11992. "adcs r3, r3, r5\n\t"
  11993. #elif defined(__clang__)
  11994. "adcs r3, r5\n\t"
  11995. #else
  11996. "adc r3, r5\n\t"
  11997. #endif
  11998. #ifdef WOLFSSL_KEIL
  11999. "adcs r4, r4, r6\n\t"
  12000. #elif defined(__clang__)
  12001. "adcs r4, r6\n\t"
  12002. #else
  12003. "adc r4, r6\n\t"
  12004. #endif
  12005. "stm %[r]!, {r3, r4}\n\t"
  12006. "ldm %[b]!, {r5, r6}\n\t"
  12007. "ldm %[a]!, {r3, r4}\n\t"
  12008. #ifdef WOLFSSL_KEIL
  12009. "adcs r3, r3, r5\n\t"
  12010. #elif defined(__clang__)
  12011. "adcs r3, r5\n\t"
  12012. #else
  12013. "adc r3, r5\n\t"
  12014. #endif
  12015. #ifdef WOLFSSL_KEIL
  12016. "adcs r4, r4, r6\n\t"
  12017. #elif defined(__clang__)
  12018. "adcs r4, r6\n\t"
  12019. #else
  12020. "adc r4, r6\n\t"
  12021. #endif
  12022. "stm %[r]!, {r3, r4}\n\t"
  12023. "ldm %[b]!, {r5, r6}\n\t"
  12024. "ldm %[a]!, {r3, r4}\n\t"
  12025. #ifdef WOLFSSL_KEIL
  12026. "adcs r3, r3, r5\n\t"
  12027. #elif defined(__clang__)
  12028. "adcs r3, r5\n\t"
  12029. #else
  12030. "adc r3, r5\n\t"
  12031. #endif
  12032. #ifdef WOLFSSL_KEIL
  12033. "adcs r4, r4, r6\n\t"
  12034. #elif defined(__clang__)
  12035. "adcs r4, r6\n\t"
  12036. #else
  12037. "adc r4, r6\n\t"
  12038. #endif
  12039. "stm %[r]!, {r3, r4}\n\t"
  12040. "ldm %[b]!, {r5, r6}\n\t"
  12041. "ldm %[a]!, {r3, r4}\n\t"
  12042. #ifdef WOLFSSL_KEIL
  12043. "adcs r3, r3, r5\n\t"
  12044. #elif defined(__clang__)
  12045. "adcs r3, r5\n\t"
  12046. #else
  12047. "adc r3, r5\n\t"
  12048. #endif
  12049. #ifdef WOLFSSL_KEIL
  12050. "adcs r4, r4, r6\n\t"
  12051. #elif defined(__clang__)
  12052. "adcs r4, r6\n\t"
  12053. #else
  12054. "adc r4, r6\n\t"
  12055. #endif
  12056. "stm %[r]!, {r3, r4}\n\t"
  12057. "ldm %[b]!, {r5, r6}\n\t"
  12058. "ldm %[a]!, {r3, r4}\n\t"
  12059. #ifdef WOLFSSL_KEIL
  12060. "adcs r3, r3, r5\n\t"
  12061. #elif defined(__clang__)
  12062. "adcs r3, r5\n\t"
  12063. #else
  12064. "adc r3, r5\n\t"
  12065. #endif
  12066. #ifdef WOLFSSL_KEIL
  12067. "adcs r4, r4, r6\n\t"
  12068. #elif defined(__clang__)
  12069. "adcs r4, r6\n\t"
  12070. #else
  12071. "adc r4, r6\n\t"
  12072. #endif
  12073. "stm %[r]!, {r3, r4}\n\t"
  12074. "ldm %[b]!, {r5, r6}\n\t"
  12075. "ldm %[a]!, {r3, r4}\n\t"
  12076. #ifdef WOLFSSL_KEIL
  12077. "adcs r3, r3, r5\n\t"
  12078. #elif defined(__clang__)
  12079. "adcs r3, r5\n\t"
  12080. #else
  12081. "adc r3, r5\n\t"
  12082. #endif
  12083. #ifdef WOLFSSL_KEIL
  12084. "adcs r4, r4, r6\n\t"
  12085. #elif defined(__clang__)
  12086. "adcs r4, r6\n\t"
  12087. #else
  12088. "adc r4, r6\n\t"
  12089. #endif
  12090. "stm %[r]!, {r3, r4}\n\t"
  12091. "ldm %[b]!, {r5, r6}\n\t"
  12092. "ldm %[a]!, {r3, r4}\n\t"
  12093. #ifdef WOLFSSL_KEIL
  12094. "adcs r3, r3, r5\n\t"
  12095. #elif defined(__clang__)
  12096. "adcs r3, r5\n\t"
  12097. #else
  12098. "adc r3, r5\n\t"
  12099. #endif
  12100. #ifdef WOLFSSL_KEIL
  12101. "adcs r4, r4, r6\n\t"
  12102. #elif defined(__clang__)
  12103. "adcs r4, r6\n\t"
  12104. #else
  12105. "adc r4, r6\n\t"
  12106. #endif
  12107. "stm %[r]!, {r3, r4}\n\t"
  12108. "ldm %[b]!, {r5, r6}\n\t"
  12109. "ldm %[a]!, {r3, r4}\n\t"
  12110. #ifdef WOLFSSL_KEIL
  12111. "adcs r3, r3, r5\n\t"
  12112. #elif defined(__clang__)
  12113. "adcs r3, r5\n\t"
  12114. #else
  12115. "adc r3, r5\n\t"
  12116. #endif
  12117. #ifdef WOLFSSL_KEIL
  12118. "adcs r4, r4, r6\n\t"
  12119. #elif defined(__clang__)
  12120. "adcs r4, r6\n\t"
  12121. #else
  12122. "adc r4, r6\n\t"
  12123. #endif
  12124. "stm %[r]!, {r3, r4}\n\t"
  12125. "ldm %[b]!, {r5, r6}\n\t"
  12126. "ldm %[a]!, {r3, r4}\n\t"
  12127. #ifdef WOLFSSL_KEIL
  12128. "adcs r3, r3, r5\n\t"
  12129. #elif defined(__clang__)
  12130. "adcs r3, r5\n\t"
  12131. #else
  12132. "adc r3, r5\n\t"
  12133. #endif
  12134. #ifdef WOLFSSL_KEIL
  12135. "adcs r4, r4, r6\n\t"
  12136. #elif defined(__clang__)
  12137. "adcs r4, r6\n\t"
  12138. #else
  12139. "adc r4, r6\n\t"
  12140. #endif
  12141. "stm %[r]!, {r3, r4}\n\t"
  12142. "ldm %[b]!, {r5, r6}\n\t"
  12143. "ldm %[a]!, {r3, r4}\n\t"
  12144. #ifdef WOLFSSL_KEIL
  12145. "adcs r3, r3, r5\n\t"
  12146. #elif defined(__clang__)
  12147. "adcs r3, r5\n\t"
  12148. #else
  12149. "adc r3, r5\n\t"
  12150. #endif
  12151. #ifdef WOLFSSL_KEIL
  12152. "adcs r4, r4, r6\n\t"
  12153. #elif defined(__clang__)
  12154. "adcs r4, r6\n\t"
  12155. #else
  12156. "adc r4, r6\n\t"
  12157. #endif
  12158. "stm %[r]!, {r3, r4}\n\t"
  12159. "ldm %[b]!, {r5, r6}\n\t"
  12160. "ldm %[a]!, {r3, r4}\n\t"
  12161. #ifdef WOLFSSL_KEIL
  12162. "adcs r3, r3, r5\n\t"
  12163. #elif defined(__clang__)
  12164. "adcs r3, r5\n\t"
  12165. #else
  12166. "adc r3, r5\n\t"
  12167. #endif
  12168. #ifdef WOLFSSL_KEIL
  12169. "adcs r4, r4, r6\n\t"
  12170. #elif defined(__clang__)
  12171. "adcs r4, r6\n\t"
  12172. #else
  12173. "adc r4, r6\n\t"
  12174. #endif
  12175. "stm %[r]!, {r3, r4}\n\t"
  12176. "ldm %[b]!, {r5, r6}\n\t"
  12177. "ldm %[a]!, {r3, r4}\n\t"
  12178. #ifdef WOLFSSL_KEIL
  12179. "adcs r3, r3, r5\n\t"
  12180. #elif defined(__clang__)
  12181. "adcs r3, r5\n\t"
  12182. #else
  12183. "adc r3, r5\n\t"
  12184. #endif
  12185. #ifdef WOLFSSL_KEIL
  12186. "adcs r4, r4, r6\n\t"
  12187. #elif defined(__clang__)
  12188. "adcs r4, r6\n\t"
  12189. #else
  12190. "adc r4, r6\n\t"
  12191. #endif
  12192. "stm %[r]!, {r3, r4}\n\t"
  12193. "movs %[r], #0\n\t"
  12194. #ifdef WOLFSSL_KEIL
  12195. "adcs %[r], %[r], %[r]\n\t"
  12196. #elif defined(__clang__)
  12197. "adcs %[r], %[r]\n\t"
  12198. #else
  12199. "adc %[r], %[r]\n\t"
  12200. #endif
  12201. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  12202. :
  12203. : "memory", "r3", "r4", "r5", "r6"
  12204. );
  12205. return (uint32_t)(size_t)r;
  12206. }
  12207. /* AND m into each word of a and store in r.
  12208. *
  12209. * r A single precision integer.
  12210. * a A single precision integer.
  12211. * m Mask to AND against each digit.
  12212. */
  12213. static void sp_2048_mask_32(sp_digit* r, const sp_digit* a, sp_digit m)
  12214. {
  12215. #ifdef WOLFSSL_SP_SMALL
  12216. int i;
  12217. for (i=0; i<32; i++) {
  12218. r[i] = a[i] & m;
  12219. }
  12220. #else
  12221. int i;
  12222. for (i = 0; i < 32; i += 8) {
  12223. r[i+0] = a[i+0] & m;
  12224. r[i+1] = a[i+1] & m;
  12225. r[i+2] = a[i+2] & m;
  12226. r[i+3] = a[i+3] & m;
  12227. r[i+4] = a[i+4] & m;
  12228. r[i+5] = a[i+5] & m;
  12229. r[i+6] = a[i+6] & m;
  12230. r[i+7] = a[i+7] & m;
  12231. }
  12232. #endif
  12233. }
  12234. /* Multiply a and b into r. (r = a * b)
  12235. *
  12236. * r A single precision integer.
  12237. * a A single precision integer.
  12238. * b A single precision integer.
  12239. */
  12240. SP_NOINLINE static void sp_2048_mul_64(sp_digit* r, const sp_digit* a,
  12241. const sp_digit* b)
  12242. {
  12243. sp_digit* z0 = r;
  12244. sp_digit z1[64];
  12245. sp_digit a1[32];
  12246. sp_digit b1[32];
  12247. sp_digit* z2 = r + 64;
  12248. sp_digit u;
  12249. sp_digit ca;
  12250. sp_digit cb;
  12251. ca = sp_2048_add_32(a1, a, &a[32]);
  12252. cb = sp_2048_add_32(b1, b, &b[32]);
  12253. u = ca & cb;
  12254. sp_2048_mul_32(z2, &a[32], &b[32]);
  12255. sp_2048_mul_32(z0, a, b);
  12256. sp_2048_mul_32(z1, a1, b1);
  12257. u += sp_2048_sub_in_place_64(z1, z0);
  12258. u += sp_2048_sub_in_place_64(z1, z2);
  12259. sp_2048_mask_32(a1, a1, 0 - cb);
  12260. u += sp_2048_add_32(z1 + 32, z1 + 32, a1);
  12261. sp_2048_mask_32(b1, b1, 0 - ca);
  12262. u += sp_2048_add_32(z1 + 32, z1 + 32, b1);
  12263. u += sp_2048_add_64(r + 32, r + 32, z1);
  12264. (void)sp_2048_add_word_32(r + 96, r + 96, u);
  12265. }
  12266. #ifndef WOLFSSL_SP_LARGE_CODE
  12267. /* Square a and put result in r. (r = a * a)
  12268. *
  12269. * r A single precision integer.
  12270. * a A single precision integer.
  12271. */
  12272. SP_NOINLINE static void sp_2048_sqr_8(sp_digit* r, const sp_digit* a)
  12273. {
  12274. __asm__ __volatile__ (
  12275. "movs r3, #0\n\t"
  12276. "movs r4, #0\n\t"
  12277. "movs r5, #0\n\t"
  12278. "mov r8, r3\n\t"
  12279. "mov r11, %[r]\n\t"
  12280. "movs r6, #0x40\n\t"
  12281. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12282. "negs r6, r6\n\t"
  12283. #else
  12284. "neg r6, r6\n\t"
  12285. #endif
  12286. "add sp, sp, r6\n\t"
  12287. "mov r10, sp\n\t"
  12288. "mov r9, %[a]\n\t"
  12289. "\n"
  12290. "L_sp_2048_sqr_8_words_%=:\n\t"
  12291. "movs %[r], #0\n\t"
  12292. "movs r6, #28\n\t"
  12293. "mov %[a], r8\n\t"
  12294. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12295. "subs %[a], %[a], r6\n\t"
  12296. #else
  12297. "sub %[a], %[a], r6\n\t"
  12298. #endif
  12299. #ifdef WOLFSSL_KEIL
  12300. "sbcs r6, r6, r6\n\t"
  12301. #elif defined(__clang__)
  12302. "sbcs r6, r6\n\t"
  12303. #else
  12304. "sbc r6, r6\n\t"
  12305. #endif
  12306. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12307. "mvns r6, r6\n\t"
  12308. #else
  12309. "mvn r6, r6\n\t"
  12310. #endif
  12311. #ifdef WOLFSSL_KEIL
  12312. "ands %[a], %[a], r6\n\t"
  12313. #elif defined(__clang__)
  12314. "ands %[a], r6\n\t"
  12315. #else
  12316. "and %[a], r6\n\t"
  12317. #endif
  12318. "mov r2, r8\n\t"
  12319. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12320. "subs r2, r2, %[a]\n\t"
  12321. #else
  12322. "sub r2, r2, %[a]\n\t"
  12323. #endif
  12324. "add %[a], %[a], r9\n\t"
  12325. "add r2, r2, r9\n\t"
  12326. "\n"
  12327. "L_sp_2048_sqr_8_mul_%=:\n\t"
  12328. "cmp r2, %[a]\n\t"
  12329. "beq L_sp_2048_sqr_8_sqr_%=\n\t"
  12330. "# Multiply * 2: Start\n\t"
  12331. "ldrh r6, [%[a]]\n\t"
  12332. "ldrh r7, [r2]\n\t"
  12333. #ifdef WOLFSSL_KEIL
  12334. "muls r7, r6, r7\n\t"
  12335. #elif defined(__clang__)
  12336. "muls r7, r6\n\t"
  12337. #else
  12338. "mul r7, r6\n\t"
  12339. #endif
  12340. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12341. "adds r3, r3, r7\n\t"
  12342. #else
  12343. "add r3, r3, r7\n\t"
  12344. #endif
  12345. #ifdef WOLFSSL_KEIL
  12346. "adcs r4, r4, %[r]\n\t"
  12347. #elif defined(__clang__)
  12348. "adcs r4, %[r]\n\t"
  12349. #else
  12350. "adc r4, %[r]\n\t"
  12351. #endif
  12352. #ifdef WOLFSSL_KEIL
  12353. "adcs r5, r5, %[r]\n\t"
  12354. #elif defined(__clang__)
  12355. "adcs r5, %[r]\n\t"
  12356. #else
  12357. "adc r5, %[r]\n\t"
  12358. #endif
  12359. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12360. "adds r3, r3, r7\n\t"
  12361. #else
  12362. "add r3, r3, r7\n\t"
  12363. #endif
  12364. #ifdef WOLFSSL_KEIL
  12365. "adcs r4, r4, %[r]\n\t"
  12366. #elif defined(__clang__)
  12367. "adcs r4, %[r]\n\t"
  12368. #else
  12369. "adc r4, %[r]\n\t"
  12370. #endif
  12371. #ifdef WOLFSSL_KEIL
  12372. "adcs r5, r5, %[r]\n\t"
  12373. #elif defined(__clang__)
  12374. "adcs r5, %[r]\n\t"
  12375. #else
  12376. "adc r5, %[r]\n\t"
  12377. #endif
  12378. "ldr r7, [r2]\n\t"
  12379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12380. "lsrs r7, r7, #16\n\t"
  12381. #else
  12382. "lsr r7, r7, #16\n\t"
  12383. #endif
  12384. #ifdef WOLFSSL_KEIL
  12385. "muls r6, r7, r6\n\t"
  12386. #elif defined(__clang__)
  12387. "muls r6, r7\n\t"
  12388. #else
  12389. "mul r6, r7\n\t"
  12390. #endif
  12391. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12392. "lsrs r7, r6, #16\n\t"
  12393. #else
  12394. "lsr r7, r6, #16\n\t"
  12395. #endif
  12396. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12397. "lsls r6, r6, #16\n\t"
  12398. #else
  12399. "lsl r6, r6, #16\n\t"
  12400. #endif
  12401. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12402. "adds r3, r3, r6\n\t"
  12403. #else
  12404. "add r3, r3, r6\n\t"
  12405. #endif
  12406. #ifdef WOLFSSL_KEIL
  12407. "adcs r4, r4, r7\n\t"
  12408. #elif defined(__clang__)
  12409. "adcs r4, r7\n\t"
  12410. #else
  12411. "adc r4, r7\n\t"
  12412. #endif
  12413. #ifdef WOLFSSL_KEIL
  12414. "adcs r5, r5, %[r]\n\t"
  12415. #elif defined(__clang__)
  12416. "adcs r5, %[r]\n\t"
  12417. #else
  12418. "adc r5, %[r]\n\t"
  12419. #endif
  12420. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12421. "adds r3, r3, r6\n\t"
  12422. #else
  12423. "add r3, r3, r6\n\t"
  12424. #endif
  12425. #ifdef WOLFSSL_KEIL
  12426. "adcs r4, r4, r7\n\t"
  12427. #elif defined(__clang__)
  12428. "adcs r4, r7\n\t"
  12429. #else
  12430. "adc r4, r7\n\t"
  12431. #endif
  12432. #ifdef WOLFSSL_KEIL
  12433. "adcs r5, r5, %[r]\n\t"
  12434. #elif defined(__clang__)
  12435. "adcs r5, %[r]\n\t"
  12436. #else
  12437. "adc r5, %[r]\n\t"
  12438. #endif
  12439. "ldr r6, [%[a]]\n\t"
  12440. "ldr r7, [r2]\n\t"
  12441. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12442. "lsrs r6, r6, #16\n\t"
  12443. #else
  12444. "lsr r6, r6, #16\n\t"
  12445. #endif
  12446. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12447. "lsrs r7, r7, #16\n\t"
  12448. #else
  12449. "lsr r7, r7, #16\n\t"
  12450. #endif
  12451. #ifdef WOLFSSL_KEIL
  12452. "muls r7, r6, r7\n\t"
  12453. #elif defined(__clang__)
  12454. "muls r7, r6\n\t"
  12455. #else
  12456. "mul r7, r6\n\t"
  12457. #endif
  12458. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12459. "adds r4, r4, r7\n\t"
  12460. #else
  12461. "add r4, r4, r7\n\t"
  12462. #endif
  12463. #ifdef WOLFSSL_KEIL
  12464. "adcs r5, r5, %[r]\n\t"
  12465. #elif defined(__clang__)
  12466. "adcs r5, %[r]\n\t"
  12467. #else
  12468. "adc r5, %[r]\n\t"
  12469. #endif
  12470. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12471. "adds r4, r4, r7\n\t"
  12472. #else
  12473. "add r4, r4, r7\n\t"
  12474. #endif
  12475. #ifdef WOLFSSL_KEIL
  12476. "adcs r5, r5, %[r]\n\t"
  12477. #elif defined(__clang__)
  12478. "adcs r5, %[r]\n\t"
  12479. #else
  12480. "adc r5, %[r]\n\t"
  12481. #endif
  12482. "ldrh r7, [r2]\n\t"
  12483. #ifdef WOLFSSL_KEIL
  12484. "muls r6, r7, r6\n\t"
  12485. #elif defined(__clang__)
  12486. "muls r6, r7\n\t"
  12487. #else
  12488. "mul r6, r7\n\t"
  12489. #endif
  12490. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12491. "lsrs r7, r6, #16\n\t"
  12492. #else
  12493. "lsr r7, r6, #16\n\t"
  12494. #endif
  12495. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12496. "lsls r6, r6, #16\n\t"
  12497. #else
  12498. "lsl r6, r6, #16\n\t"
  12499. #endif
  12500. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12501. "adds r3, r3, r6\n\t"
  12502. #else
  12503. "add r3, r3, r6\n\t"
  12504. #endif
  12505. #ifdef WOLFSSL_KEIL
  12506. "adcs r4, r4, r7\n\t"
  12507. #elif defined(__clang__)
  12508. "adcs r4, r7\n\t"
  12509. #else
  12510. "adc r4, r7\n\t"
  12511. #endif
  12512. #ifdef WOLFSSL_KEIL
  12513. "adcs r5, r5, %[r]\n\t"
  12514. #elif defined(__clang__)
  12515. "adcs r5, %[r]\n\t"
  12516. #else
  12517. "adc r5, %[r]\n\t"
  12518. #endif
  12519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12520. "adds r3, r3, r6\n\t"
  12521. #else
  12522. "add r3, r3, r6\n\t"
  12523. #endif
  12524. #ifdef WOLFSSL_KEIL
  12525. "adcs r4, r4, r7\n\t"
  12526. #elif defined(__clang__)
  12527. "adcs r4, r7\n\t"
  12528. #else
  12529. "adc r4, r7\n\t"
  12530. #endif
  12531. #ifdef WOLFSSL_KEIL
  12532. "adcs r5, r5, %[r]\n\t"
  12533. #elif defined(__clang__)
  12534. "adcs r5, %[r]\n\t"
  12535. #else
  12536. "adc r5, %[r]\n\t"
  12537. #endif
  12538. "# Multiply * 2: Done\n\t"
  12539. "bal L_sp_2048_sqr_8_done_sqr_%=\n\t"
  12540. "\n"
  12541. "L_sp_2048_sqr_8_sqr_%=:\n\t"
  12542. "mov r12, r2\n\t"
  12543. "ldr r2, [%[a]]\n\t"
  12544. "# Square: Start\n\t"
  12545. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12546. "lsrs r7, r2, #16\n\t"
  12547. #else
  12548. "lsr r7, r2, #16\n\t"
  12549. #endif
  12550. "uxth r6, r2\n\t"
  12551. #ifdef WOLFSSL_KEIL
  12552. "muls r6, r6, r6\n\t"
  12553. #elif defined(__clang__)
  12554. "muls r6, r6\n\t"
  12555. #else
  12556. "mul r6, r6\n\t"
  12557. #endif
  12558. #ifdef WOLFSSL_KEIL
  12559. "muls r7, r7, r7\n\t"
  12560. #elif defined(__clang__)
  12561. "muls r7, r7\n\t"
  12562. #else
  12563. "mul r7, r7\n\t"
  12564. #endif
  12565. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12566. "adds r3, r3, r6\n\t"
  12567. #else
  12568. "add r3, r3, r6\n\t"
  12569. #endif
  12570. #ifdef WOLFSSL_KEIL
  12571. "adcs r4, r4, r7\n\t"
  12572. #elif defined(__clang__)
  12573. "adcs r4, r7\n\t"
  12574. #else
  12575. "adc r4, r7\n\t"
  12576. #endif
  12577. #ifdef WOLFSSL_KEIL
  12578. "adcs r5, r5, %[r]\n\t"
  12579. #elif defined(__clang__)
  12580. "adcs r5, %[r]\n\t"
  12581. #else
  12582. "adc r5, %[r]\n\t"
  12583. #endif
  12584. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12585. "lsrs r7, r2, #16\n\t"
  12586. #else
  12587. "lsr r7, r2, #16\n\t"
  12588. #endif
  12589. "uxth r6, r2\n\t"
  12590. #ifdef WOLFSSL_KEIL
  12591. "muls r6, r7, r6\n\t"
  12592. #elif defined(__clang__)
  12593. "muls r6, r7\n\t"
  12594. #else
  12595. "mul r6, r7\n\t"
  12596. #endif
  12597. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12598. "lsrs r7, r6, #15\n\t"
  12599. #else
  12600. "lsr r7, r6, #15\n\t"
  12601. #endif
  12602. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12603. "lsls r6, r6, #17\n\t"
  12604. #else
  12605. "lsl r6, r6, #17\n\t"
  12606. #endif
  12607. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12608. "adds r3, r3, r6\n\t"
  12609. #else
  12610. "add r3, r3, r6\n\t"
  12611. #endif
  12612. #ifdef WOLFSSL_KEIL
  12613. "adcs r4, r4, r7\n\t"
  12614. #elif defined(__clang__)
  12615. "adcs r4, r7\n\t"
  12616. #else
  12617. "adc r4, r7\n\t"
  12618. #endif
  12619. #ifdef WOLFSSL_KEIL
  12620. "adcs r5, r5, %[r]\n\t"
  12621. #elif defined(__clang__)
  12622. "adcs r5, %[r]\n\t"
  12623. #else
  12624. "adc r5, %[r]\n\t"
  12625. #endif
  12626. "# Square: Done\n\t"
  12627. "mov r2, r12\n\t"
  12628. "\n"
  12629. "L_sp_2048_sqr_8_done_sqr_%=:\n\t"
  12630. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12631. "adds %[a], %[a], #4\n\t"
  12632. #else
  12633. "add %[a], %[a], #4\n\t"
  12634. #endif
  12635. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12636. "subs r2, r2, #4\n\t"
  12637. #else
  12638. "sub r2, r2, #4\n\t"
  12639. #endif
  12640. "movs r6, #32\n\t"
  12641. "add r6, r6, r9\n\t"
  12642. "cmp %[a], r6\n\t"
  12643. "beq L_sp_2048_sqr_8_done_mul_%=\n\t"
  12644. "cmp %[a], r2\n\t"
  12645. "bgt L_sp_2048_sqr_8_done_mul_%=\n\t"
  12646. "mov r7, r8\n\t"
  12647. "add r7, r7, r9\n\t"
  12648. "cmp %[a], r7\n\t"
  12649. "ble L_sp_2048_sqr_8_mul_%=\n\t"
  12650. "\n"
  12651. "L_sp_2048_sqr_8_done_mul_%=:\n\t"
  12652. "mov %[r], r10\n\t"
  12653. "mov r7, r8\n\t"
  12654. "str r3, [%[r], r7]\n\t"
  12655. "movs r3, r4\n\t"
  12656. "movs r4, r5\n\t"
  12657. "movs r5, #0\n\t"
  12658. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12659. "adds r7, r7, #4\n\t"
  12660. #else
  12661. "add r7, r7, #4\n\t"
  12662. #endif
  12663. "mov r8, r7\n\t"
  12664. "movs r6, #56\n\t"
  12665. "cmp r7, r6\n\t"
  12666. "ble L_sp_2048_sqr_8_words_%=\n\t"
  12667. "mov %[a], r9\n\t"
  12668. "str r3, [%[r], r7]\n\t"
  12669. "mov %[r], r11\n\t"
  12670. "mov %[a], r10\n\t"
  12671. "movs r3, #60\n\t"
  12672. "\n"
  12673. "L_sp_2048_sqr_8_store_%=:\n\t"
  12674. "ldr r6, [%[a], r3]\n\t"
  12675. "str r6, [%[r], r3]\n\t"
  12676. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12677. "subs r3, r3, #4\n\t"
  12678. #else
  12679. "sub r3, r3, #4\n\t"
  12680. #endif
  12681. "bge L_sp_2048_sqr_8_store_%=\n\t"
  12682. "movs r6, #0x40\n\t"
  12683. "add sp, sp, r6\n\t"
  12684. : [r] "+l" (r), [a] "+l" (a)
  12685. :
  12686. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  12687. );
  12688. }
  12689. #else
  12690. /* Square a and put result in r. (r = a * a)
  12691. *
  12692. * r A single precision integer.
  12693. * a A single precision integer.
  12694. */
  12695. SP_NOINLINE static void sp_2048_sqr_8(sp_digit* r, const sp_digit* a)
  12696. {
  12697. __asm__ __volatile__ (
  12698. "sub sp, sp, #32\n\t"
  12699. "mov r8, %[r]\n\t"
  12700. "mov r9, %[a]\n\t"
  12701. "movs %[r], #0\n\t"
  12702. "ldm %[a]!, {r2, r3, r4, r5}\n\t"
  12703. "mov r10, r2\n\t"
  12704. "mov r11, r3\n\t"
  12705. "mov r12, r4\n\t"
  12706. "mov lr, r5\n\t"
  12707. "mov %[a], r9\n\t"
  12708. "# A[0] * A[0]\n\t"
  12709. "movs r4, #0\n\t"
  12710. "mov r7, r10\n\t"
  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. "uxth r5, r7\n\t"
  12717. "movs r2, r5\n\t"
  12718. "movs r3, r6\n\t"
  12719. #ifdef WOLFSSL_KEIL
  12720. "muls r2, r2, r2\n\t"
  12721. #elif defined(__clang__)
  12722. "muls r2, r2\n\t"
  12723. #else
  12724. "mul r2, r2\n\t"
  12725. #endif
  12726. #ifdef WOLFSSL_KEIL
  12727. "muls r3, r3, r3\n\t"
  12728. #elif defined(__clang__)
  12729. "muls r3, r3\n\t"
  12730. #else
  12731. "mul r3, r3\n\t"
  12732. #endif
  12733. #ifdef WOLFSSL_KEIL
  12734. "muls r5, r6, r5\n\t"
  12735. #elif defined(__clang__)
  12736. "muls r5, r6\n\t"
  12737. #else
  12738. "mul r5, r6\n\t"
  12739. #endif
  12740. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12741. "lsrs r6, r5, #15\n\t"
  12742. #else
  12743. "lsr r6, r5, #15\n\t"
  12744. #endif
  12745. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12746. "lsls r5, r5, #17\n\t"
  12747. #else
  12748. "lsl r5, r5, #17\n\t"
  12749. #endif
  12750. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12751. "adds r2, r2, r5\n\t"
  12752. #else
  12753. "add r2, r2, r5\n\t"
  12754. #endif
  12755. #ifdef WOLFSSL_KEIL
  12756. "adcs r3, r3, r6\n\t"
  12757. #elif defined(__clang__)
  12758. "adcs r3, r6\n\t"
  12759. #else
  12760. "adc r3, r6\n\t"
  12761. #endif
  12762. "str r2, [sp]\n\t"
  12763. "# A[1] * A[0]\n\t"
  12764. "movs r2, #0\n\t"
  12765. "mov %[a], r11\n\t"
  12766. "uxth r5, %[a]\n\t"
  12767. "uxth r6, r7\n\t"
  12768. #ifdef WOLFSSL_KEIL
  12769. "muls r6, r5, r6\n\t"
  12770. #elif defined(__clang__)
  12771. "muls r6, r5\n\t"
  12772. #else
  12773. "mul r6, r5\n\t"
  12774. #endif
  12775. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12776. "adds r3, r3, r6\n\t"
  12777. #else
  12778. "add r3, r3, r6\n\t"
  12779. #endif
  12780. #ifdef WOLFSSL_KEIL
  12781. "adcs r4, r4, %[r]\n\t"
  12782. #elif defined(__clang__)
  12783. "adcs r4, %[r]\n\t"
  12784. #else
  12785. "adc r4, %[r]\n\t"
  12786. #endif
  12787. #ifdef WOLFSSL_KEIL
  12788. "adcs r2, r2, %[r]\n\t"
  12789. #elif defined(__clang__)
  12790. "adcs r2, %[r]\n\t"
  12791. #else
  12792. "adc r2, %[r]\n\t"
  12793. #endif
  12794. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12795. "adds r3, r3, r6\n\t"
  12796. #else
  12797. "add r3, r3, r6\n\t"
  12798. #endif
  12799. #ifdef WOLFSSL_KEIL
  12800. "adcs r4, r4, %[r]\n\t"
  12801. #elif defined(__clang__)
  12802. "adcs r4, %[r]\n\t"
  12803. #else
  12804. "adc r4, %[r]\n\t"
  12805. #endif
  12806. #ifdef WOLFSSL_KEIL
  12807. "adcs r2, r2, %[r]\n\t"
  12808. #elif defined(__clang__)
  12809. "adcs r2, %[r]\n\t"
  12810. #else
  12811. "adc r2, %[r]\n\t"
  12812. #endif
  12813. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12814. "lsrs r6, r7, #16\n\t"
  12815. #else
  12816. "lsr r6, r7, #16\n\t"
  12817. #endif
  12818. #ifdef WOLFSSL_KEIL
  12819. "muls r5, r6, r5\n\t"
  12820. #elif defined(__clang__)
  12821. "muls r5, r6\n\t"
  12822. #else
  12823. "mul r5, r6\n\t"
  12824. #endif
  12825. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12826. "lsrs r6, r5, #16\n\t"
  12827. #else
  12828. "lsr r6, r5, #16\n\t"
  12829. #endif
  12830. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12831. "lsls r5, r5, #16\n\t"
  12832. #else
  12833. "lsl r5, r5, #16\n\t"
  12834. #endif
  12835. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12836. "adds r3, r3, r5\n\t"
  12837. #else
  12838. "add r3, r3, r5\n\t"
  12839. #endif
  12840. #ifdef WOLFSSL_KEIL
  12841. "adcs r4, r4, r6\n\t"
  12842. #elif defined(__clang__)
  12843. "adcs r4, r6\n\t"
  12844. #else
  12845. "adc r4, r6\n\t"
  12846. #endif
  12847. #ifdef WOLFSSL_KEIL
  12848. "adcs r2, r2, %[r]\n\t"
  12849. #elif defined(__clang__)
  12850. "adcs r2, %[r]\n\t"
  12851. #else
  12852. "adc r2, %[r]\n\t"
  12853. #endif
  12854. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12855. "adds r3, r3, r5\n\t"
  12856. #else
  12857. "add r3, r3, r5\n\t"
  12858. #endif
  12859. #ifdef WOLFSSL_KEIL
  12860. "adcs r4, r4, r6\n\t"
  12861. #elif defined(__clang__)
  12862. "adcs r4, r6\n\t"
  12863. #else
  12864. "adc r4, r6\n\t"
  12865. #endif
  12866. #ifdef WOLFSSL_KEIL
  12867. "adcs r2, r2, %[r]\n\t"
  12868. #elif defined(__clang__)
  12869. "adcs r2, %[r]\n\t"
  12870. #else
  12871. "adc r2, %[r]\n\t"
  12872. #endif
  12873. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12874. "lsrs r5, %[a], #16\n\t"
  12875. #else
  12876. "lsr r5, %[a], #16\n\t"
  12877. #endif
  12878. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12879. "lsrs r6, r7, #16\n\t"
  12880. #else
  12881. "lsr r6, r7, #16\n\t"
  12882. #endif
  12883. #ifdef WOLFSSL_KEIL
  12884. "muls r6, r5, r6\n\t"
  12885. #elif defined(__clang__)
  12886. "muls r6, r5\n\t"
  12887. #else
  12888. "mul r6, r5\n\t"
  12889. #endif
  12890. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12891. "adds r4, r4, r6\n\t"
  12892. #else
  12893. "add r4, r4, r6\n\t"
  12894. #endif
  12895. #ifdef WOLFSSL_KEIL
  12896. "adcs r2, r2, %[r]\n\t"
  12897. #elif defined(__clang__)
  12898. "adcs r2, %[r]\n\t"
  12899. #else
  12900. "adc r2, %[r]\n\t"
  12901. #endif
  12902. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12903. "adds r4, r4, r6\n\t"
  12904. #else
  12905. "add r4, r4, r6\n\t"
  12906. #endif
  12907. #ifdef WOLFSSL_KEIL
  12908. "adcs r2, r2, %[r]\n\t"
  12909. #elif defined(__clang__)
  12910. "adcs r2, %[r]\n\t"
  12911. #else
  12912. "adc r2, %[r]\n\t"
  12913. #endif
  12914. "uxth r6, r7\n\t"
  12915. #ifdef WOLFSSL_KEIL
  12916. "muls r5, r6, r5\n\t"
  12917. #elif defined(__clang__)
  12918. "muls r5, r6\n\t"
  12919. #else
  12920. "mul r5, r6\n\t"
  12921. #endif
  12922. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12923. "lsrs r6, r5, #16\n\t"
  12924. #else
  12925. "lsr r6, r5, #16\n\t"
  12926. #endif
  12927. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12928. "lsls r5, r5, #16\n\t"
  12929. #else
  12930. "lsl r5, r5, #16\n\t"
  12931. #endif
  12932. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12933. "adds r3, r3, r5\n\t"
  12934. #else
  12935. "add r3, r3, r5\n\t"
  12936. #endif
  12937. #ifdef WOLFSSL_KEIL
  12938. "adcs r4, r4, r6\n\t"
  12939. #elif defined(__clang__)
  12940. "adcs r4, r6\n\t"
  12941. #else
  12942. "adc r4, r6\n\t"
  12943. #endif
  12944. #ifdef WOLFSSL_KEIL
  12945. "adcs r2, r2, %[r]\n\t"
  12946. #elif defined(__clang__)
  12947. "adcs r2, %[r]\n\t"
  12948. #else
  12949. "adc r2, %[r]\n\t"
  12950. #endif
  12951. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12952. "adds r3, r3, r5\n\t"
  12953. #else
  12954. "add r3, r3, r5\n\t"
  12955. #endif
  12956. #ifdef WOLFSSL_KEIL
  12957. "adcs r4, r4, r6\n\t"
  12958. #elif defined(__clang__)
  12959. "adcs r4, r6\n\t"
  12960. #else
  12961. "adc r4, r6\n\t"
  12962. #endif
  12963. #ifdef WOLFSSL_KEIL
  12964. "adcs r2, r2, %[r]\n\t"
  12965. #elif defined(__clang__)
  12966. "adcs r2, %[r]\n\t"
  12967. #else
  12968. "adc r2, %[r]\n\t"
  12969. #endif
  12970. "str r3, [sp, #4]\n\t"
  12971. "# A[2] * A[0]\n\t"
  12972. "movs r3, #0\n\t"
  12973. "mov %[a], r9\n\t"
  12974. "mov %[a], r12\n\t"
  12975. "uxth r5, %[a]\n\t"
  12976. "uxth r6, r7\n\t"
  12977. #ifdef WOLFSSL_KEIL
  12978. "muls r6, r5, r6\n\t"
  12979. #elif defined(__clang__)
  12980. "muls r6, r5\n\t"
  12981. #else
  12982. "mul r6, r5\n\t"
  12983. #endif
  12984. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12985. "adds r4, r4, r6\n\t"
  12986. #else
  12987. "add r4, r4, r6\n\t"
  12988. #endif
  12989. #ifdef WOLFSSL_KEIL
  12990. "adcs r2, r2, %[r]\n\t"
  12991. #elif defined(__clang__)
  12992. "adcs r2, %[r]\n\t"
  12993. #else
  12994. "adc r2, %[r]\n\t"
  12995. #endif
  12996. #ifdef WOLFSSL_KEIL
  12997. "adcs r3, r3, %[r]\n\t"
  12998. #elif defined(__clang__)
  12999. "adcs r3, %[r]\n\t"
  13000. #else
  13001. "adc r3, %[r]\n\t"
  13002. #endif
  13003. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13004. "adds r4, r4, r6\n\t"
  13005. #else
  13006. "add r4, r4, r6\n\t"
  13007. #endif
  13008. #ifdef WOLFSSL_KEIL
  13009. "adcs r2, r2, %[r]\n\t"
  13010. #elif defined(__clang__)
  13011. "adcs r2, %[r]\n\t"
  13012. #else
  13013. "adc r2, %[r]\n\t"
  13014. #endif
  13015. #ifdef WOLFSSL_KEIL
  13016. "adcs r3, r3, %[r]\n\t"
  13017. #elif defined(__clang__)
  13018. "adcs r3, %[r]\n\t"
  13019. #else
  13020. "adc r3, %[r]\n\t"
  13021. #endif
  13022. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13023. "lsrs r6, r7, #16\n\t"
  13024. #else
  13025. "lsr r6, r7, #16\n\t"
  13026. #endif
  13027. #ifdef WOLFSSL_KEIL
  13028. "muls r5, r6, r5\n\t"
  13029. #elif defined(__clang__)
  13030. "muls r5, r6\n\t"
  13031. #else
  13032. "mul r5, r6\n\t"
  13033. #endif
  13034. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13035. "lsrs r6, r5, #16\n\t"
  13036. #else
  13037. "lsr r6, r5, #16\n\t"
  13038. #endif
  13039. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13040. "lsls r5, r5, #16\n\t"
  13041. #else
  13042. "lsl r5, r5, #16\n\t"
  13043. #endif
  13044. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13045. "adds r4, r4, r5\n\t"
  13046. #else
  13047. "add r4, r4, r5\n\t"
  13048. #endif
  13049. #ifdef WOLFSSL_KEIL
  13050. "adcs r2, r2, r6\n\t"
  13051. #elif defined(__clang__)
  13052. "adcs r2, r6\n\t"
  13053. #else
  13054. "adc r2, r6\n\t"
  13055. #endif
  13056. #ifdef WOLFSSL_KEIL
  13057. "adcs r3, r3, %[r]\n\t"
  13058. #elif defined(__clang__)
  13059. "adcs r3, %[r]\n\t"
  13060. #else
  13061. "adc r3, %[r]\n\t"
  13062. #endif
  13063. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13064. "adds r4, r4, r5\n\t"
  13065. #else
  13066. "add r4, r4, r5\n\t"
  13067. #endif
  13068. #ifdef WOLFSSL_KEIL
  13069. "adcs r2, r2, r6\n\t"
  13070. #elif defined(__clang__)
  13071. "adcs r2, r6\n\t"
  13072. #else
  13073. "adc r2, r6\n\t"
  13074. #endif
  13075. #ifdef WOLFSSL_KEIL
  13076. "adcs r3, r3, %[r]\n\t"
  13077. #elif defined(__clang__)
  13078. "adcs r3, %[r]\n\t"
  13079. #else
  13080. "adc r3, %[r]\n\t"
  13081. #endif
  13082. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13083. "lsrs r5, %[a], #16\n\t"
  13084. #else
  13085. "lsr r5, %[a], #16\n\t"
  13086. #endif
  13087. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13088. "lsrs r6, r7, #16\n\t"
  13089. #else
  13090. "lsr r6, r7, #16\n\t"
  13091. #endif
  13092. #ifdef WOLFSSL_KEIL
  13093. "muls r6, r5, r6\n\t"
  13094. #elif defined(__clang__)
  13095. "muls r6, r5\n\t"
  13096. #else
  13097. "mul r6, r5\n\t"
  13098. #endif
  13099. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13100. "adds r2, r2, r6\n\t"
  13101. #else
  13102. "add r2, r2, r6\n\t"
  13103. #endif
  13104. #ifdef WOLFSSL_KEIL
  13105. "adcs r3, r3, %[r]\n\t"
  13106. #elif defined(__clang__)
  13107. "adcs r3, %[r]\n\t"
  13108. #else
  13109. "adc r3, %[r]\n\t"
  13110. #endif
  13111. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13112. "adds r2, r2, r6\n\t"
  13113. #else
  13114. "add r2, r2, r6\n\t"
  13115. #endif
  13116. #ifdef WOLFSSL_KEIL
  13117. "adcs r3, r3, %[r]\n\t"
  13118. #elif defined(__clang__)
  13119. "adcs r3, %[r]\n\t"
  13120. #else
  13121. "adc r3, %[r]\n\t"
  13122. #endif
  13123. "uxth r6, r7\n\t"
  13124. #ifdef WOLFSSL_KEIL
  13125. "muls r5, r6, r5\n\t"
  13126. #elif defined(__clang__)
  13127. "muls r5, r6\n\t"
  13128. #else
  13129. "mul r5, r6\n\t"
  13130. #endif
  13131. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13132. "lsrs r6, r5, #16\n\t"
  13133. #else
  13134. "lsr r6, r5, #16\n\t"
  13135. #endif
  13136. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13137. "lsls r5, r5, #16\n\t"
  13138. #else
  13139. "lsl r5, r5, #16\n\t"
  13140. #endif
  13141. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13142. "adds r4, r4, r5\n\t"
  13143. #else
  13144. "add r4, r4, r5\n\t"
  13145. #endif
  13146. #ifdef WOLFSSL_KEIL
  13147. "adcs r2, r2, r6\n\t"
  13148. #elif defined(__clang__)
  13149. "adcs r2, r6\n\t"
  13150. #else
  13151. "adc r2, r6\n\t"
  13152. #endif
  13153. #ifdef WOLFSSL_KEIL
  13154. "adcs r3, r3, %[r]\n\t"
  13155. #elif defined(__clang__)
  13156. "adcs r3, %[r]\n\t"
  13157. #else
  13158. "adc r3, %[r]\n\t"
  13159. #endif
  13160. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13161. "adds r4, r4, r5\n\t"
  13162. #else
  13163. "add r4, r4, r5\n\t"
  13164. #endif
  13165. #ifdef WOLFSSL_KEIL
  13166. "adcs r2, r2, r6\n\t"
  13167. #elif defined(__clang__)
  13168. "adcs r2, r6\n\t"
  13169. #else
  13170. "adc r2, r6\n\t"
  13171. #endif
  13172. #ifdef WOLFSSL_KEIL
  13173. "adcs r3, r3, %[r]\n\t"
  13174. #elif defined(__clang__)
  13175. "adcs r3, %[r]\n\t"
  13176. #else
  13177. "adc r3, %[r]\n\t"
  13178. #endif
  13179. "# A[1] * A[1]\n\t"
  13180. "mov r7, r11\n\t"
  13181. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13182. "lsrs r6, r7, #16\n\t"
  13183. #else
  13184. "lsr r6, r7, #16\n\t"
  13185. #endif
  13186. "uxth r5, r7\n\t"
  13187. #ifdef WOLFSSL_KEIL
  13188. "muls r5, r5, r5\n\t"
  13189. #elif defined(__clang__)
  13190. "muls r5, r5\n\t"
  13191. #else
  13192. "mul r5, r5\n\t"
  13193. #endif
  13194. #ifdef WOLFSSL_KEIL
  13195. "muls r6, r6, r6\n\t"
  13196. #elif defined(__clang__)
  13197. "muls r6, r6\n\t"
  13198. #else
  13199. "mul r6, r6\n\t"
  13200. #endif
  13201. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13202. "adds r4, r4, r5\n\t"
  13203. #else
  13204. "add r4, r4, r5\n\t"
  13205. #endif
  13206. #ifdef WOLFSSL_KEIL
  13207. "adcs r2, r2, r6\n\t"
  13208. #elif defined(__clang__)
  13209. "adcs r2, r6\n\t"
  13210. #else
  13211. "adc r2, r6\n\t"
  13212. #endif
  13213. #ifdef WOLFSSL_KEIL
  13214. "adcs r3, r3, %[r]\n\t"
  13215. #elif defined(__clang__)
  13216. "adcs r3, %[r]\n\t"
  13217. #else
  13218. "adc r3, %[r]\n\t"
  13219. #endif
  13220. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13221. "lsrs r6, r7, #16\n\t"
  13222. #else
  13223. "lsr r6, r7, #16\n\t"
  13224. #endif
  13225. "uxth r5, r7\n\t"
  13226. #ifdef WOLFSSL_KEIL
  13227. "muls r5, r6, r5\n\t"
  13228. #elif defined(__clang__)
  13229. "muls r5, r6\n\t"
  13230. #else
  13231. "mul r5, r6\n\t"
  13232. #endif
  13233. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13234. "lsrs r6, r5, #15\n\t"
  13235. #else
  13236. "lsr r6, r5, #15\n\t"
  13237. #endif
  13238. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13239. "lsls r5, r5, #17\n\t"
  13240. #else
  13241. "lsl r5, r5, #17\n\t"
  13242. #endif
  13243. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13244. "adds r4, r4, r5\n\t"
  13245. #else
  13246. "add r4, r4, r5\n\t"
  13247. #endif
  13248. #ifdef WOLFSSL_KEIL
  13249. "adcs r2, r2, r6\n\t"
  13250. #elif defined(__clang__)
  13251. "adcs r2, r6\n\t"
  13252. #else
  13253. "adc r2, r6\n\t"
  13254. #endif
  13255. #ifdef WOLFSSL_KEIL
  13256. "adcs r3, r3, %[r]\n\t"
  13257. #elif defined(__clang__)
  13258. "adcs r3, %[r]\n\t"
  13259. #else
  13260. "adc r3, %[r]\n\t"
  13261. #endif
  13262. "str r4, [sp, #8]\n\t"
  13263. "# A[2] * A[1]\n\t"
  13264. "movs r4, #0\n\t"
  13265. "mov %[a], r9\n\t"
  13266. "mov %[a], r12\n\t"
  13267. "uxth r5, %[a]\n\t"
  13268. "uxth r6, r7\n\t"
  13269. #ifdef WOLFSSL_KEIL
  13270. "muls r6, r5, r6\n\t"
  13271. #elif defined(__clang__)
  13272. "muls r6, r5\n\t"
  13273. #else
  13274. "mul r6, r5\n\t"
  13275. #endif
  13276. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13277. "adds r2, r2, r6\n\t"
  13278. #else
  13279. "add r2, r2, r6\n\t"
  13280. #endif
  13281. #ifdef WOLFSSL_KEIL
  13282. "adcs r3, r3, %[r]\n\t"
  13283. #elif defined(__clang__)
  13284. "adcs r3, %[r]\n\t"
  13285. #else
  13286. "adc r3, %[r]\n\t"
  13287. #endif
  13288. #ifdef WOLFSSL_KEIL
  13289. "adcs r4, r4, %[r]\n\t"
  13290. #elif defined(__clang__)
  13291. "adcs r4, %[r]\n\t"
  13292. #else
  13293. "adc r4, %[r]\n\t"
  13294. #endif
  13295. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13296. "adds r2, r2, r6\n\t"
  13297. #else
  13298. "add r2, r2, r6\n\t"
  13299. #endif
  13300. #ifdef WOLFSSL_KEIL
  13301. "adcs r3, r3, %[r]\n\t"
  13302. #elif defined(__clang__)
  13303. "adcs r3, %[r]\n\t"
  13304. #else
  13305. "adc r3, %[r]\n\t"
  13306. #endif
  13307. #ifdef WOLFSSL_KEIL
  13308. "adcs r4, r4, %[r]\n\t"
  13309. #elif defined(__clang__)
  13310. "adcs r4, %[r]\n\t"
  13311. #else
  13312. "adc r4, %[r]\n\t"
  13313. #endif
  13314. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13315. "lsrs r6, r7, #16\n\t"
  13316. #else
  13317. "lsr r6, r7, #16\n\t"
  13318. #endif
  13319. #ifdef WOLFSSL_KEIL
  13320. "muls r5, r6, r5\n\t"
  13321. #elif defined(__clang__)
  13322. "muls r5, r6\n\t"
  13323. #else
  13324. "mul r5, r6\n\t"
  13325. #endif
  13326. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13327. "lsrs r6, r5, #16\n\t"
  13328. #else
  13329. "lsr r6, r5, #16\n\t"
  13330. #endif
  13331. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13332. "lsls r5, r5, #16\n\t"
  13333. #else
  13334. "lsl r5, r5, #16\n\t"
  13335. #endif
  13336. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13337. "adds r2, r2, r5\n\t"
  13338. #else
  13339. "add r2, r2, r5\n\t"
  13340. #endif
  13341. #ifdef WOLFSSL_KEIL
  13342. "adcs r3, r3, r6\n\t"
  13343. #elif defined(__clang__)
  13344. "adcs r3, r6\n\t"
  13345. #else
  13346. "adc r3, r6\n\t"
  13347. #endif
  13348. #ifdef WOLFSSL_KEIL
  13349. "adcs r4, r4, %[r]\n\t"
  13350. #elif defined(__clang__)
  13351. "adcs r4, %[r]\n\t"
  13352. #else
  13353. "adc r4, %[r]\n\t"
  13354. #endif
  13355. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13356. "adds r2, r2, r5\n\t"
  13357. #else
  13358. "add r2, r2, r5\n\t"
  13359. #endif
  13360. #ifdef WOLFSSL_KEIL
  13361. "adcs r3, r3, r6\n\t"
  13362. #elif defined(__clang__)
  13363. "adcs r3, r6\n\t"
  13364. #else
  13365. "adc r3, r6\n\t"
  13366. #endif
  13367. #ifdef WOLFSSL_KEIL
  13368. "adcs r4, r4, %[r]\n\t"
  13369. #elif defined(__clang__)
  13370. "adcs r4, %[r]\n\t"
  13371. #else
  13372. "adc r4, %[r]\n\t"
  13373. #endif
  13374. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13375. "lsrs r5, %[a], #16\n\t"
  13376. #else
  13377. "lsr r5, %[a], #16\n\t"
  13378. #endif
  13379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13380. "lsrs r6, r7, #16\n\t"
  13381. #else
  13382. "lsr r6, r7, #16\n\t"
  13383. #endif
  13384. #ifdef WOLFSSL_KEIL
  13385. "muls r6, r5, r6\n\t"
  13386. #elif defined(__clang__)
  13387. "muls r6, r5\n\t"
  13388. #else
  13389. "mul r6, r5\n\t"
  13390. #endif
  13391. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13392. "adds r3, r3, r6\n\t"
  13393. #else
  13394. "add r3, r3, r6\n\t"
  13395. #endif
  13396. #ifdef WOLFSSL_KEIL
  13397. "adcs r4, r4, %[r]\n\t"
  13398. #elif defined(__clang__)
  13399. "adcs r4, %[r]\n\t"
  13400. #else
  13401. "adc r4, %[r]\n\t"
  13402. #endif
  13403. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13404. "adds r3, r3, r6\n\t"
  13405. #else
  13406. "add r3, r3, r6\n\t"
  13407. #endif
  13408. #ifdef WOLFSSL_KEIL
  13409. "adcs r4, r4, %[r]\n\t"
  13410. #elif defined(__clang__)
  13411. "adcs r4, %[r]\n\t"
  13412. #else
  13413. "adc r4, %[r]\n\t"
  13414. #endif
  13415. "uxth r6, r7\n\t"
  13416. #ifdef WOLFSSL_KEIL
  13417. "muls r5, r6, r5\n\t"
  13418. #elif defined(__clang__)
  13419. "muls r5, r6\n\t"
  13420. #else
  13421. "mul r5, r6\n\t"
  13422. #endif
  13423. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13424. "lsrs r6, r5, #16\n\t"
  13425. #else
  13426. "lsr r6, r5, #16\n\t"
  13427. #endif
  13428. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13429. "lsls r5, r5, #16\n\t"
  13430. #else
  13431. "lsl r5, r5, #16\n\t"
  13432. #endif
  13433. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13434. "adds r2, r2, r5\n\t"
  13435. #else
  13436. "add r2, r2, r5\n\t"
  13437. #endif
  13438. #ifdef WOLFSSL_KEIL
  13439. "adcs r3, r3, r6\n\t"
  13440. #elif defined(__clang__)
  13441. "adcs r3, r6\n\t"
  13442. #else
  13443. "adc r3, r6\n\t"
  13444. #endif
  13445. #ifdef WOLFSSL_KEIL
  13446. "adcs r4, r4, %[r]\n\t"
  13447. #elif defined(__clang__)
  13448. "adcs r4, %[r]\n\t"
  13449. #else
  13450. "adc r4, %[r]\n\t"
  13451. #endif
  13452. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13453. "adds r2, r2, r5\n\t"
  13454. #else
  13455. "add r2, r2, r5\n\t"
  13456. #endif
  13457. #ifdef WOLFSSL_KEIL
  13458. "adcs r3, r3, r6\n\t"
  13459. #elif defined(__clang__)
  13460. "adcs r3, r6\n\t"
  13461. #else
  13462. "adc r3, r6\n\t"
  13463. #endif
  13464. #ifdef WOLFSSL_KEIL
  13465. "adcs r4, r4, %[r]\n\t"
  13466. #elif defined(__clang__)
  13467. "adcs r4, %[r]\n\t"
  13468. #else
  13469. "adc r4, %[r]\n\t"
  13470. #endif
  13471. "# A[3] * A[0]\n\t"
  13472. "mov %[a], r9\n\t"
  13473. "mov r7, r10\n\t"
  13474. "mov %[a], lr\n\t"
  13475. "uxth r5, %[a]\n\t"
  13476. "uxth r6, r7\n\t"
  13477. #ifdef WOLFSSL_KEIL
  13478. "muls r6, r5, r6\n\t"
  13479. #elif defined(__clang__)
  13480. "muls r6, r5\n\t"
  13481. #else
  13482. "mul r6, r5\n\t"
  13483. #endif
  13484. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13485. "adds r2, r2, r6\n\t"
  13486. #else
  13487. "add r2, r2, r6\n\t"
  13488. #endif
  13489. #ifdef WOLFSSL_KEIL
  13490. "adcs r3, r3, %[r]\n\t"
  13491. #elif defined(__clang__)
  13492. "adcs r3, %[r]\n\t"
  13493. #else
  13494. "adc r3, %[r]\n\t"
  13495. #endif
  13496. #ifdef WOLFSSL_KEIL
  13497. "adcs r4, r4, %[r]\n\t"
  13498. #elif defined(__clang__)
  13499. "adcs r4, %[r]\n\t"
  13500. #else
  13501. "adc r4, %[r]\n\t"
  13502. #endif
  13503. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13504. "adds r2, r2, r6\n\t"
  13505. #else
  13506. "add r2, r2, r6\n\t"
  13507. #endif
  13508. #ifdef WOLFSSL_KEIL
  13509. "adcs r3, r3, %[r]\n\t"
  13510. #elif defined(__clang__)
  13511. "adcs r3, %[r]\n\t"
  13512. #else
  13513. "adc r3, %[r]\n\t"
  13514. #endif
  13515. #ifdef WOLFSSL_KEIL
  13516. "adcs r4, r4, %[r]\n\t"
  13517. #elif defined(__clang__)
  13518. "adcs r4, %[r]\n\t"
  13519. #else
  13520. "adc r4, %[r]\n\t"
  13521. #endif
  13522. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13523. "lsrs r6, r7, #16\n\t"
  13524. #else
  13525. "lsr r6, r7, #16\n\t"
  13526. #endif
  13527. #ifdef WOLFSSL_KEIL
  13528. "muls r5, r6, r5\n\t"
  13529. #elif defined(__clang__)
  13530. "muls r5, r6\n\t"
  13531. #else
  13532. "mul r5, r6\n\t"
  13533. #endif
  13534. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13535. "lsrs r6, r5, #16\n\t"
  13536. #else
  13537. "lsr r6, r5, #16\n\t"
  13538. #endif
  13539. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13540. "lsls r5, r5, #16\n\t"
  13541. #else
  13542. "lsl r5, r5, #16\n\t"
  13543. #endif
  13544. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13545. "adds r2, r2, r5\n\t"
  13546. #else
  13547. "add r2, r2, r5\n\t"
  13548. #endif
  13549. #ifdef WOLFSSL_KEIL
  13550. "adcs r3, r3, r6\n\t"
  13551. #elif defined(__clang__)
  13552. "adcs r3, r6\n\t"
  13553. #else
  13554. "adc r3, r6\n\t"
  13555. #endif
  13556. #ifdef WOLFSSL_KEIL
  13557. "adcs r4, r4, %[r]\n\t"
  13558. #elif defined(__clang__)
  13559. "adcs r4, %[r]\n\t"
  13560. #else
  13561. "adc r4, %[r]\n\t"
  13562. #endif
  13563. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13564. "adds r2, r2, r5\n\t"
  13565. #else
  13566. "add r2, r2, r5\n\t"
  13567. #endif
  13568. #ifdef WOLFSSL_KEIL
  13569. "adcs r3, r3, r6\n\t"
  13570. #elif defined(__clang__)
  13571. "adcs r3, r6\n\t"
  13572. #else
  13573. "adc r3, r6\n\t"
  13574. #endif
  13575. #ifdef WOLFSSL_KEIL
  13576. "adcs r4, r4, %[r]\n\t"
  13577. #elif defined(__clang__)
  13578. "adcs r4, %[r]\n\t"
  13579. #else
  13580. "adc r4, %[r]\n\t"
  13581. #endif
  13582. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13583. "lsrs r5, %[a], #16\n\t"
  13584. #else
  13585. "lsr r5, %[a], #16\n\t"
  13586. #endif
  13587. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13588. "lsrs r6, r7, #16\n\t"
  13589. #else
  13590. "lsr r6, r7, #16\n\t"
  13591. #endif
  13592. #ifdef WOLFSSL_KEIL
  13593. "muls r6, r5, r6\n\t"
  13594. #elif defined(__clang__)
  13595. "muls r6, r5\n\t"
  13596. #else
  13597. "mul r6, r5\n\t"
  13598. #endif
  13599. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13600. "adds r3, r3, r6\n\t"
  13601. #else
  13602. "add r3, r3, r6\n\t"
  13603. #endif
  13604. #ifdef WOLFSSL_KEIL
  13605. "adcs r4, r4, %[r]\n\t"
  13606. #elif defined(__clang__)
  13607. "adcs r4, %[r]\n\t"
  13608. #else
  13609. "adc r4, %[r]\n\t"
  13610. #endif
  13611. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13612. "adds r3, r3, r6\n\t"
  13613. #else
  13614. "add r3, r3, r6\n\t"
  13615. #endif
  13616. #ifdef WOLFSSL_KEIL
  13617. "adcs r4, r4, %[r]\n\t"
  13618. #elif defined(__clang__)
  13619. "adcs r4, %[r]\n\t"
  13620. #else
  13621. "adc r4, %[r]\n\t"
  13622. #endif
  13623. "uxth r6, r7\n\t"
  13624. #ifdef WOLFSSL_KEIL
  13625. "muls r5, r6, r5\n\t"
  13626. #elif defined(__clang__)
  13627. "muls r5, r6\n\t"
  13628. #else
  13629. "mul r5, r6\n\t"
  13630. #endif
  13631. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13632. "lsrs r6, r5, #16\n\t"
  13633. #else
  13634. "lsr r6, r5, #16\n\t"
  13635. #endif
  13636. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13637. "lsls r5, r5, #16\n\t"
  13638. #else
  13639. "lsl r5, r5, #16\n\t"
  13640. #endif
  13641. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13642. "adds r2, r2, r5\n\t"
  13643. #else
  13644. "add r2, r2, r5\n\t"
  13645. #endif
  13646. #ifdef WOLFSSL_KEIL
  13647. "adcs r3, r3, r6\n\t"
  13648. #elif defined(__clang__)
  13649. "adcs r3, r6\n\t"
  13650. #else
  13651. "adc r3, r6\n\t"
  13652. #endif
  13653. #ifdef WOLFSSL_KEIL
  13654. "adcs r4, r4, %[r]\n\t"
  13655. #elif defined(__clang__)
  13656. "adcs r4, %[r]\n\t"
  13657. #else
  13658. "adc r4, %[r]\n\t"
  13659. #endif
  13660. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13661. "adds r2, r2, r5\n\t"
  13662. #else
  13663. "add r2, r2, r5\n\t"
  13664. #endif
  13665. #ifdef WOLFSSL_KEIL
  13666. "adcs r3, r3, r6\n\t"
  13667. #elif defined(__clang__)
  13668. "adcs r3, r6\n\t"
  13669. #else
  13670. "adc r3, r6\n\t"
  13671. #endif
  13672. #ifdef WOLFSSL_KEIL
  13673. "adcs r4, r4, %[r]\n\t"
  13674. #elif defined(__clang__)
  13675. "adcs r4, %[r]\n\t"
  13676. #else
  13677. "adc r4, %[r]\n\t"
  13678. #endif
  13679. "str r2, [sp, #12]\n\t"
  13680. "# A[4] * A[0]\n\t"
  13681. "movs r2, #0\n\t"
  13682. "mov %[a], r9\n\t"
  13683. "ldr %[a], [%[a], #16]\n\t"
  13684. "uxth r5, %[a]\n\t"
  13685. "uxth r6, r7\n\t"
  13686. #ifdef WOLFSSL_KEIL
  13687. "muls r6, r5, r6\n\t"
  13688. #elif defined(__clang__)
  13689. "muls r6, r5\n\t"
  13690. #else
  13691. "mul r6, r5\n\t"
  13692. #endif
  13693. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13694. "adds r3, r3, r6\n\t"
  13695. #else
  13696. "add r3, r3, r6\n\t"
  13697. #endif
  13698. #ifdef WOLFSSL_KEIL
  13699. "adcs r4, r4, %[r]\n\t"
  13700. #elif defined(__clang__)
  13701. "adcs r4, %[r]\n\t"
  13702. #else
  13703. "adc r4, %[r]\n\t"
  13704. #endif
  13705. #ifdef WOLFSSL_KEIL
  13706. "adcs r2, r2, %[r]\n\t"
  13707. #elif defined(__clang__)
  13708. "adcs r2, %[r]\n\t"
  13709. #else
  13710. "adc r2, %[r]\n\t"
  13711. #endif
  13712. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13713. "adds r3, r3, r6\n\t"
  13714. #else
  13715. "add r3, r3, r6\n\t"
  13716. #endif
  13717. #ifdef WOLFSSL_KEIL
  13718. "adcs r4, r4, %[r]\n\t"
  13719. #elif defined(__clang__)
  13720. "adcs r4, %[r]\n\t"
  13721. #else
  13722. "adc r4, %[r]\n\t"
  13723. #endif
  13724. #ifdef WOLFSSL_KEIL
  13725. "adcs r2, r2, %[r]\n\t"
  13726. #elif defined(__clang__)
  13727. "adcs r2, %[r]\n\t"
  13728. #else
  13729. "adc r2, %[r]\n\t"
  13730. #endif
  13731. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13732. "lsrs r6, r7, #16\n\t"
  13733. #else
  13734. "lsr r6, r7, #16\n\t"
  13735. #endif
  13736. #ifdef WOLFSSL_KEIL
  13737. "muls r5, r6, r5\n\t"
  13738. #elif defined(__clang__)
  13739. "muls r5, r6\n\t"
  13740. #else
  13741. "mul r5, r6\n\t"
  13742. #endif
  13743. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13744. "lsrs r6, r5, #16\n\t"
  13745. #else
  13746. "lsr r6, r5, #16\n\t"
  13747. #endif
  13748. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13749. "lsls r5, r5, #16\n\t"
  13750. #else
  13751. "lsl r5, r5, #16\n\t"
  13752. #endif
  13753. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13754. "adds r3, r3, r5\n\t"
  13755. #else
  13756. "add r3, r3, r5\n\t"
  13757. #endif
  13758. #ifdef WOLFSSL_KEIL
  13759. "adcs r4, r4, r6\n\t"
  13760. #elif defined(__clang__)
  13761. "adcs r4, r6\n\t"
  13762. #else
  13763. "adc r4, r6\n\t"
  13764. #endif
  13765. #ifdef WOLFSSL_KEIL
  13766. "adcs r2, r2, %[r]\n\t"
  13767. #elif defined(__clang__)
  13768. "adcs r2, %[r]\n\t"
  13769. #else
  13770. "adc r2, %[r]\n\t"
  13771. #endif
  13772. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13773. "adds r3, r3, r5\n\t"
  13774. #else
  13775. "add r3, r3, r5\n\t"
  13776. #endif
  13777. #ifdef WOLFSSL_KEIL
  13778. "adcs r4, r4, r6\n\t"
  13779. #elif defined(__clang__)
  13780. "adcs r4, r6\n\t"
  13781. #else
  13782. "adc r4, r6\n\t"
  13783. #endif
  13784. #ifdef WOLFSSL_KEIL
  13785. "adcs r2, r2, %[r]\n\t"
  13786. #elif defined(__clang__)
  13787. "adcs r2, %[r]\n\t"
  13788. #else
  13789. "adc r2, %[r]\n\t"
  13790. #endif
  13791. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13792. "lsrs r5, %[a], #16\n\t"
  13793. #else
  13794. "lsr r5, %[a], #16\n\t"
  13795. #endif
  13796. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13797. "lsrs r6, r7, #16\n\t"
  13798. #else
  13799. "lsr r6, r7, #16\n\t"
  13800. #endif
  13801. #ifdef WOLFSSL_KEIL
  13802. "muls r6, r5, r6\n\t"
  13803. #elif defined(__clang__)
  13804. "muls r6, r5\n\t"
  13805. #else
  13806. "mul r6, r5\n\t"
  13807. #endif
  13808. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13809. "adds r4, r4, r6\n\t"
  13810. #else
  13811. "add r4, r4, r6\n\t"
  13812. #endif
  13813. #ifdef WOLFSSL_KEIL
  13814. "adcs r2, r2, %[r]\n\t"
  13815. #elif defined(__clang__)
  13816. "adcs r2, %[r]\n\t"
  13817. #else
  13818. "adc r2, %[r]\n\t"
  13819. #endif
  13820. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13821. "adds r4, r4, r6\n\t"
  13822. #else
  13823. "add r4, r4, r6\n\t"
  13824. #endif
  13825. #ifdef WOLFSSL_KEIL
  13826. "adcs r2, r2, %[r]\n\t"
  13827. #elif defined(__clang__)
  13828. "adcs r2, %[r]\n\t"
  13829. #else
  13830. "adc r2, %[r]\n\t"
  13831. #endif
  13832. "uxth r6, r7\n\t"
  13833. #ifdef WOLFSSL_KEIL
  13834. "muls r5, r6, r5\n\t"
  13835. #elif defined(__clang__)
  13836. "muls r5, r6\n\t"
  13837. #else
  13838. "mul r5, r6\n\t"
  13839. #endif
  13840. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13841. "lsrs r6, r5, #16\n\t"
  13842. #else
  13843. "lsr r6, r5, #16\n\t"
  13844. #endif
  13845. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13846. "lsls r5, r5, #16\n\t"
  13847. #else
  13848. "lsl r5, r5, #16\n\t"
  13849. #endif
  13850. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13851. "adds r3, r3, r5\n\t"
  13852. #else
  13853. "add r3, r3, r5\n\t"
  13854. #endif
  13855. #ifdef WOLFSSL_KEIL
  13856. "adcs r4, r4, r6\n\t"
  13857. #elif defined(__clang__)
  13858. "adcs r4, r6\n\t"
  13859. #else
  13860. "adc r4, r6\n\t"
  13861. #endif
  13862. #ifdef WOLFSSL_KEIL
  13863. "adcs r2, r2, %[r]\n\t"
  13864. #elif defined(__clang__)
  13865. "adcs r2, %[r]\n\t"
  13866. #else
  13867. "adc r2, %[r]\n\t"
  13868. #endif
  13869. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13870. "adds r3, r3, r5\n\t"
  13871. #else
  13872. "add r3, r3, r5\n\t"
  13873. #endif
  13874. #ifdef WOLFSSL_KEIL
  13875. "adcs r4, r4, r6\n\t"
  13876. #elif defined(__clang__)
  13877. "adcs r4, r6\n\t"
  13878. #else
  13879. "adc r4, r6\n\t"
  13880. #endif
  13881. #ifdef WOLFSSL_KEIL
  13882. "adcs r2, r2, %[r]\n\t"
  13883. #elif defined(__clang__)
  13884. "adcs r2, %[r]\n\t"
  13885. #else
  13886. "adc r2, %[r]\n\t"
  13887. #endif
  13888. "# A[3] * A[1]\n\t"
  13889. "mov %[a], r9\n\t"
  13890. "mov r7, r11\n\t"
  13891. "mov %[a], lr\n\t"
  13892. "uxth r5, %[a]\n\t"
  13893. "uxth r6, r7\n\t"
  13894. #ifdef WOLFSSL_KEIL
  13895. "muls r6, r5, r6\n\t"
  13896. #elif defined(__clang__)
  13897. "muls r6, r5\n\t"
  13898. #else
  13899. "mul r6, r5\n\t"
  13900. #endif
  13901. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13902. "adds r3, r3, r6\n\t"
  13903. #else
  13904. "add r3, r3, r6\n\t"
  13905. #endif
  13906. #ifdef WOLFSSL_KEIL
  13907. "adcs r4, r4, %[r]\n\t"
  13908. #elif defined(__clang__)
  13909. "adcs r4, %[r]\n\t"
  13910. #else
  13911. "adc r4, %[r]\n\t"
  13912. #endif
  13913. #ifdef WOLFSSL_KEIL
  13914. "adcs r2, r2, %[r]\n\t"
  13915. #elif defined(__clang__)
  13916. "adcs r2, %[r]\n\t"
  13917. #else
  13918. "adc r2, %[r]\n\t"
  13919. #endif
  13920. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13921. "adds r3, r3, r6\n\t"
  13922. #else
  13923. "add r3, r3, r6\n\t"
  13924. #endif
  13925. #ifdef WOLFSSL_KEIL
  13926. "adcs r4, r4, %[r]\n\t"
  13927. #elif defined(__clang__)
  13928. "adcs r4, %[r]\n\t"
  13929. #else
  13930. "adc r4, %[r]\n\t"
  13931. #endif
  13932. #ifdef WOLFSSL_KEIL
  13933. "adcs r2, r2, %[r]\n\t"
  13934. #elif defined(__clang__)
  13935. "adcs r2, %[r]\n\t"
  13936. #else
  13937. "adc r2, %[r]\n\t"
  13938. #endif
  13939. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13940. "lsrs r6, r7, #16\n\t"
  13941. #else
  13942. "lsr r6, r7, #16\n\t"
  13943. #endif
  13944. #ifdef WOLFSSL_KEIL
  13945. "muls r5, r6, r5\n\t"
  13946. #elif defined(__clang__)
  13947. "muls r5, r6\n\t"
  13948. #else
  13949. "mul r5, r6\n\t"
  13950. #endif
  13951. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13952. "lsrs r6, r5, #16\n\t"
  13953. #else
  13954. "lsr r6, r5, #16\n\t"
  13955. #endif
  13956. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13957. "lsls r5, r5, #16\n\t"
  13958. #else
  13959. "lsl r5, r5, #16\n\t"
  13960. #endif
  13961. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13962. "adds r3, r3, r5\n\t"
  13963. #else
  13964. "add r3, r3, r5\n\t"
  13965. #endif
  13966. #ifdef WOLFSSL_KEIL
  13967. "adcs r4, r4, r6\n\t"
  13968. #elif defined(__clang__)
  13969. "adcs r4, r6\n\t"
  13970. #else
  13971. "adc r4, r6\n\t"
  13972. #endif
  13973. #ifdef WOLFSSL_KEIL
  13974. "adcs r2, r2, %[r]\n\t"
  13975. #elif defined(__clang__)
  13976. "adcs r2, %[r]\n\t"
  13977. #else
  13978. "adc r2, %[r]\n\t"
  13979. #endif
  13980. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13981. "adds r3, r3, r5\n\t"
  13982. #else
  13983. "add r3, r3, r5\n\t"
  13984. #endif
  13985. #ifdef WOLFSSL_KEIL
  13986. "adcs r4, r4, r6\n\t"
  13987. #elif defined(__clang__)
  13988. "adcs r4, r6\n\t"
  13989. #else
  13990. "adc r4, r6\n\t"
  13991. #endif
  13992. #ifdef WOLFSSL_KEIL
  13993. "adcs r2, r2, %[r]\n\t"
  13994. #elif defined(__clang__)
  13995. "adcs r2, %[r]\n\t"
  13996. #else
  13997. "adc r2, %[r]\n\t"
  13998. #endif
  13999. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14000. "lsrs r5, %[a], #16\n\t"
  14001. #else
  14002. "lsr r5, %[a], #16\n\t"
  14003. #endif
  14004. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14005. "lsrs r6, r7, #16\n\t"
  14006. #else
  14007. "lsr r6, r7, #16\n\t"
  14008. #endif
  14009. #ifdef WOLFSSL_KEIL
  14010. "muls r6, r5, r6\n\t"
  14011. #elif defined(__clang__)
  14012. "muls r6, r5\n\t"
  14013. #else
  14014. "mul r6, r5\n\t"
  14015. #endif
  14016. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14017. "adds r4, r4, r6\n\t"
  14018. #else
  14019. "add r4, r4, r6\n\t"
  14020. #endif
  14021. #ifdef WOLFSSL_KEIL
  14022. "adcs r2, r2, %[r]\n\t"
  14023. #elif defined(__clang__)
  14024. "adcs r2, %[r]\n\t"
  14025. #else
  14026. "adc r2, %[r]\n\t"
  14027. #endif
  14028. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14029. "adds r4, r4, r6\n\t"
  14030. #else
  14031. "add r4, r4, r6\n\t"
  14032. #endif
  14033. #ifdef WOLFSSL_KEIL
  14034. "adcs r2, r2, %[r]\n\t"
  14035. #elif defined(__clang__)
  14036. "adcs r2, %[r]\n\t"
  14037. #else
  14038. "adc r2, %[r]\n\t"
  14039. #endif
  14040. "uxth r6, r7\n\t"
  14041. #ifdef WOLFSSL_KEIL
  14042. "muls r5, r6, r5\n\t"
  14043. #elif defined(__clang__)
  14044. "muls r5, r6\n\t"
  14045. #else
  14046. "mul r5, r6\n\t"
  14047. #endif
  14048. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14049. "lsrs r6, r5, #16\n\t"
  14050. #else
  14051. "lsr r6, r5, #16\n\t"
  14052. #endif
  14053. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14054. "lsls r5, r5, #16\n\t"
  14055. #else
  14056. "lsl r5, r5, #16\n\t"
  14057. #endif
  14058. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14059. "adds r3, r3, r5\n\t"
  14060. #else
  14061. "add r3, r3, r5\n\t"
  14062. #endif
  14063. #ifdef WOLFSSL_KEIL
  14064. "adcs r4, r4, r6\n\t"
  14065. #elif defined(__clang__)
  14066. "adcs r4, r6\n\t"
  14067. #else
  14068. "adc r4, r6\n\t"
  14069. #endif
  14070. #ifdef WOLFSSL_KEIL
  14071. "adcs r2, r2, %[r]\n\t"
  14072. #elif defined(__clang__)
  14073. "adcs r2, %[r]\n\t"
  14074. #else
  14075. "adc r2, %[r]\n\t"
  14076. #endif
  14077. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14078. "adds r3, r3, r5\n\t"
  14079. #else
  14080. "add r3, r3, r5\n\t"
  14081. #endif
  14082. #ifdef WOLFSSL_KEIL
  14083. "adcs r4, r4, r6\n\t"
  14084. #elif defined(__clang__)
  14085. "adcs r4, r6\n\t"
  14086. #else
  14087. "adc r4, r6\n\t"
  14088. #endif
  14089. #ifdef WOLFSSL_KEIL
  14090. "adcs r2, r2, %[r]\n\t"
  14091. #elif defined(__clang__)
  14092. "adcs r2, %[r]\n\t"
  14093. #else
  14094. "adc r2, %[r]\n\t"
  14095. #endif
  14096. "# A[2] * A[2]\n\t"
  14097. "mov r7, r12\n\t"
  14098. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14099. "lsrs r6, r7, #16\n\t"
  14100. #else
  14101. "lsr r6, r7, #16\n\t"
  14102. #endif
  14103. "uxth r5, r7\n\t"
  14104. #ifdef WOLFSSL_KEIL
  14105. "muls r5, r5, r5\n\t"
  14106. #elif defined(__clang__)
  14107. "muls r5, r5\n\t"
  14108. #else
  14109. "mul r5, r5\n\t"
  14110. #endif
  14111. #ifdef WOLFSSL_KEIL
  14112. "muls r6, r6, r6\n\t"
  14113. #elif defined(__clang__)
  14114. "muls r6, r6\n\t"
  14115. #else
  14116. "mul r6, r6\n\t"
  14117. #endif
  14118. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14119. "adds r3, r3, r5\n\t"
  14120. #else
  14121. "add r3, r3, r5\n\t"
  14122. #endif
  14123. #ifdef WOLFSSL_KEIL
  14124. "adcs r4, r4, r6\n\t"
  14125. #elif defined(__clang__)
  14126. "adcs r4, r6\n\t"
  14127. #else
  14128. "adc r4, r6\n\t"
  14129. #endif
  14130. #ifdef WOLFSSL_KEIL
  14131. "adcs r2, r2, %[r]\n\t"
  14132. #elif defined(__clang__)
  14133. "adcs r2, %[r]\n\t"
  14134. #else
  14135. "adc r2, %[r]\n\t"
  14136. #endif
  14137. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14138. "lsrs r6, r7, #16\n\t"
  14139. #else
  14140. "lsr r6, r7, #16\n\t"
  14141. #endif
  14142. "uxth r5, r7\n\t"
  14143. #ifdef WOLFSSL_KEIL
  14144. "muls r5, r6, r5\n\t"
  14145. #elif defined(__clang__)
  14146. "muls r5, r6\n\t"
  14147. #else
  14148. "mul r5, r6\n\t"
  14149. #endif
  14150. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14151. "lsrs r6, r5, #15\n\t"
  14152. #else
  14153. "lsr r6, r5, #15\n\t"
  14154. #endif
  14155. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14156. "lsls r5, r5, #17\n\t"
  14157. #else
  14158. "lsl r5, r5, #17\n\t"
  14159. #endif
  14160. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14161. "adds r3, r3, r5\n\t"
  14162. #else
  14163. "add r3, r3, r5\n\t"
  14164. #endif
  14165. #ifdef WOLFSSL_KEIL
  14166. "adcs r4, r4, r6\n\t"
  14167. #elif defined(__clang__)
  14168. "adcs r4, r6\n\t"
  14169. #else
  14170. "adc r4, r6\n\t"
  14171. #endif
  14172. #ifdef WOLFSSL_KEIL
  14173. "adcs r2, r2, %[r]\n\t"
  14174. #elif defined(__clang__)
  14175. "adcs r2, %[r]\n\t"
  14176. #else
  14177. "adc r2, %[r]\n\t"
  14178. #endif
  14179. "str r3, [sp, #16]\n\t"
  14180. "# A[3] * A[2]\n\t"
  14181. "movs r3, #0\n\t"
  14182. "mov %[a], r9\n\t"
  14183. "mov %[a], lr\n\t"
  14184. "uxth r5, %[a]\n\t"
  14185. "uxth r6, r7\n\t"
  14186. #ifdef WOLFSSL_KEIL
  14187. "muls r6, r5, r6\n\t"
  14188. #elif defined(__clang__)
  14189. "muls r6, r5\n\t"
  14190. #else
  14191. "mul r6, r5\n\t"
  14192. #endif
  14193. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14194. "adds r4, r4, r6\n\t"
  14195. #else
  14196. "add r4, r4, r6\n\t"
  14197. #endif
  14198. #ifdef WOLFSSL_KEIL
  14199. "adcs r2, r2, %[r]\n\t"
  14200. #elif defined(__clang__)
  14201. "adcs r2, %[r]\n\t"
  14202. #else
  14203. "adc r2, %[r]\n\t"
  14204. #endif
  14205. #ifdef WOLFSSL_KEIL
  14206. "adcs r3, r3, %[r]\n\t"
  14207. #elif defined(__clang__)
  14208. "adcs r3, %[r]\n\t"
  14209. #else
  14210. "adc r3, %[r]\n\t"
  14211. #endif
  14212. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14213. "adds r4, r4, r6\n\t"
  14214. #else
  14215. "add r4, r4, r6\n\t"
  14216. #endif
  14217. #ifdef WOLFSSL_KEIL
  14218. "adcs r2, r2, %[r]\n\t"
  14219. #elif defined(__clang__)
  14220. "adcs r2, %[r]\n\t"
  14221. #else
  14222. "adc r2, %[r]\n\t"
  14223. #endif
  14224. #ifdef WOLFSSL_KEIL
  14225. "adcs r3, r3, %[r]\n\t"
  14226. #elif defined(__clang__)
  14227. "adcs r3, %[r]\n\t"
  14228. #else
  14229. "adc r3, %[r]\n\t"
  14230. #endif
  14231. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14232. "lsrs r6, r7, #16\n\t"
  14233. #else
  14234. "lsr r6, r7, #16\n\t"
  14235. #endif
  14236. #ifdef WOLFSSL_KEIL
  14237. "muls r5, r6, r5\n\t"
  14238. #elif defined(__clang__)
  14239. "muls r5, r6\n\t"
  14240. #else
  14241. "mul r5, r6\n\t"
  14242. #endif
  14243. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14244. "lsrs r6, r5, #16\n\t"
  14245. #else
  14246. "lsr r6, r5, #16\n\t"
  14247. #endif
  14248. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14249. "lsls r5, r5, #16\n\t"
  14250. #else
  14251. "lsl r5, r5, #16\n\t"
  14252. #endif
  14253. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14254. "adds r4, r4, r5\n\t"
  14255. #else
  14256. "add r4, r4, r5\n\t"
  14257. #endif
  14258. #ifdef WOLFSSL_KEIL
  14259. "adcs r2, r2, r6\n\t"
  14260. #elif defined(__clang__)
  14261. "adcs r2, r6\n\t"
  14262. #else
  14263. "adc r2, r6\n\t"
  14264. #endif
  14265. #ifdef WOLFSSL_KEIL
  14266. "adcs r3, r3, %[r]\n\t"
  14267. #elif defined(__clang__)
  14268. "adcs r3, %[r]\n\t"
  14269. #else
  14270. "adc r3, %[r]\n\t"
  14271. #endif
  14272. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14273. "adds r4, r4, r5\n\t"
  14274. #else
  14275. "add r4, r4, r5\n\t"
  14276. #endif
  14277. #ifdef WOLFSSL_KEIL
  14278. "adcs r2, r2, r6\n\t"
  14279. #elif defined(__clang__)
  14280. "adcs r2, r6\n\t"
  14281. #else
  14282. "adc r2, r6\n\t"
  14283. #endif
  14284. #ifdef WOLFSSL_KEIL
  14285. "adcs r3, r3, %[r]\n\t"
  14286. #elif defined(__clang__)
  14287. "adcs r3, %[r]\n\t"
  14288. #else
  14289. "adc r3, %[r]\n\t"
  14290. #endif
  14291. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14292. "lsrs r5, %[a], #16\n\t"
  14293. #else
  14294. "lsr r5, %[a], #16\n\t"
  14295. #endif
  14296. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14297. "lsrs r6, r7, #16\n\t"
  14298. #else
  14299. "lsr r6, r7, #16\n\t"
  14300. #endif
  14301. #ifdef WOLFSSL_KEIL
  14302. "muls r6, r5, r6\n\t"
  14303. #elif defined(__clang__)
  14304. "muls r6, r5\n\t"
  14305. #else
  14306. "mul r6, r5\n\t"
  14307. #endif
  14308. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14309. "adds r2, r2, r6\n\t"
  14310. #else
  14311. "add r2, r2, r6\n\t"
  14312. #endif
  14313. #ifdef WOLFSSL_KEIL
  14314. "adcs r3, r3, %[r]\n\t"
  14315. #elif defined(__clang__)
  14316. "adcs r3, %[r]\n\t"
  14317. #else
  14318. "adc r3, %[r]\n\t"
  14319. #endif
  14320. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14321. "adds r2, r2, r6\n\t"
  14322. #else
  14323. "add r2, r2, r6\n\t"
  14324. #endif
  14325. #ifdef WOLFSSL_KEIL
  14326. "adcs r3, r3, %[r]\n\t"
  14327. #elif defined(__clang__)
  14328. "adcs r3, %[r]\n\t"
  14329. #else
  14330. "adc r3, %[r]\n\t"
  14331. #endif
  14332. "uxth r6, r7\n\t"
  14333. #ifdef WOLFSSL_KEIL
  14334. "muls r5, r6, r5\n\t"
  14335. #elif defined(__clang__)
  14336. "muls r5, r6\n\t"
  14337. #else
  14338. "mul r5, r6\n\t"
  14339. #endif
  14340. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14341. "lsrs r6, r5, #16\n\t"
  14342. #else
  14343. "lsr r6, r5, #16\n\t"
  14344. #endif
  14345. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14346. "lsls r5, r5, #16\n\t"
  14347. #else
  14348. "lsl r5, r5, #16\n\t"
  14349. #endif
  14350. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14351. "adds r4, r4, r5\n\t"
  14352. #else
  14353. "add r4, r4, r5\n\t"
  14354. #endif
  14355. #ifdef WOLFSSL_KEIL
  14356. "adcs r2, r2, r6\n\t"
  14357. #elif defined(__clang__)
  14358. "adcs r2, r6\n\t"
  14359. #else
  14360. "adc r2, r6\n\t"
  14361. #endif
  14362. #ifdef WOLFSSL_KEIL
  14363. "adcs r3, r3, %[r]\n\t"
  14364. #elif defined(__clang__)
  14365. "adcs r3, %[r]\n\t"
  14366. #else
  14367. "adc r3, %[r]\n\t"
  14368. #endif
  14369. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14370. "adds r4, r4, r5\n\t"
  14371. #else
  14372. "add r4, r4, r5\n\t"
  14373. #endif
  14374. #ifdef WOLFSSL_KEIL
  14375. "adcs r2, r2, r6\n\t"
  14376. #elif defined(__clang__)
  14377. "adcs r2, r6\n\t"
  14378. #else
  14379. "adc r2, r6\n\t"
  14380. #endif
  14381. #ifdef WOLFSSL_KEIL
  14382. "adcs r3, r3, %[r]\n\t"
  14383. #elif defined(__clang__)
  14384. "adcs r3, %[r]\n\t"
  14385. #else
  14386. "adc r3, %[r]\n\t"
  14387. #endif
  14388. "# A[4] * A[1]\n\t"
  14389. "mov %[a], r9\n\t"
  14390. "mov r7, r11\n\t"
  14391. "ldr %[a], [%[a], #16]\n\t"
  14392. "uxth r5, %[a]\n\t"
  14393. "uxth r6, r7\n\t"
  14394. #ifdef WOLFSSL_KEIL
  14395. "muls r6, r5, r6\n\t"
  14396. #elif defined(__clang__)
  14397. "muls r6, r5\n\t"
  14398. #else
  14399. "mul r6, r5\n\t"
  14400. #endif
  14401. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14402. "adds r4, r4, r6\n\t"
  14403. #else
  14404. "add r4, r4, r6\n\t"
  14405. #endif
  14406. #ifdef WOLFSSL_KEIL
  14407. "adcs r2, r2, %[r]\n\t"
  14408. #elif defined(__clang__)
  14409. "adcs r2, %[r]\n\t"
  14410. #else
  14411. "adc r2, %[r]\n\t"
  14412. #endif
  14413. #ifdef WOLFSSL_KEIL
  14414. "adcs r3, r3, %[r]\n\t"
  14415. #elif defined(__clang__)
  14416. "adcs r3, %[r]\n\t"
  14417. #else
  14418. "adc r3, %[r]\n\t"
  14419. #endif
  14420. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14421. "adds r4, r4, r6\n\t"
  14422. #else
  14423. "add r4, r4, r6\n\t"
  14424. #endif
  14425. #ifdef WOLFSSL_KEIL
  14426. "adcs r2, r2, %[r]\n\t"
  14427. #elif defined(__clang__)
  14428. "adcs r2, %[r]\n\t"
  14429. #else
  14430. "adc r2, %[r]\n\t"
  14431. #endif
  14432. #ifdef WOLFSSL_KEIL
  14433. "adcs r3, r3, %[r]\n\t"
  14434. #elif defined(__clang__)
  14435. "adcs r3, %[r]\n\t"
  14436. #else
  14437. "adc r3, %[r]\n\t"
  14438. #endif
  14439. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14440. "lsrs r6, r7, #16\n\t"
  14441. #else
  14442. "lsr r6, r7, #16\n\t"
  14443. #endif
  14444. #ifdef WOLFSSL_KEIL
  14445. "muls r5, r6, r5\n\t"
  14446. #elif defined(__clang__)
  14447. "muls r5, r6\n\t"
  14448. #else
  14449. "mul r5, r6\n\t"
  14450. #endif
  14451. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14452. "lsrs r6, r5, #16\n\t"
  14453. #else
  14454. "lsr r6, r5, #16\n\t"
  14455. #endif
  14456. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14457. "lsls r5, r5, #16\n\t"
  14458. #else
  14459. "lsl r5, r5, #16\n\t"
  14460. #endif
  14461. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14462. "adds r4, r4, r5\n\t"
  14463. #else
  14464. "add r4, r4, r5\n\t"
  14465. #endif
  14466. #ifdef WOLFSSL_KEIL
  14467. "adcs r2, r2, r6\n\t"
  14468. #elif defined(__clang__)
  14469. "adcs r2, r6\n\t"
  14470. #else
  14471. "adc r2, r6\n\t"
  14472. #endif
  14473. #ifdef WOLFSSL_KEIL
  14474. "adcs r3, r3, %[r]\n\t"
  14475. #elif defined(__clang__)
  14476. "adcs r3, %[r]\n\t"
  14477. #else
  14478. "adc r3, %[r]\n\t"
  14479. #endif
  14480. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14481. "adds r4, r4, r5\n\t"
  14482. #else
  14483. "add r4, r4, r5\n\t"
  14484. #endif
  14485. #ifdef WOLFSSL_KEIL
  14486. "adcs r2, r2, r6\n\t"
  14487. #elif defined(__clang__)
  14488. "adcs r2, r6\n\t"
  14489. #else
  14490. "adc r2, r6\n\t"
  14491. #endif
  14492. #ifdef WOLFSSL_KEIL
  14493. "adcs r3, r3, %[r]\n\t"
  14494. #elif defined(__clang__)
  14495. "adcs r3, %[r]\n\t"
  14496. #else
  14497. "adc r3, %[r]\n\t"
  14498. #endif
  14499. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14500. "lsrs r5, %[a], #16\n\t"
  14501. #else
  14502. "lsr r5, %[a], #16\n\t"
  14503. #endif
  14504. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14505. "lsrs r6, r7, #16\n\t"
  14506. #else
  14507. "lsr r6, r7, #16\n\t"
  14508. #endif
  14509. #ifdef WOLFSSL_KEIL
  14510. "muls r6, r5, r6\n\t"
  14511. #elif defined(__clang__)
  14512. "muls r6, r5\n\t"
  14513. #else
  14514. "mul r6, r5\n\t"
  14515. #endif
  14516. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14517. "adds r2, r2, r6\n\t"
  14518. #else
  14519. "add r2, r2, r6\n\t"
  14520. #endif
  14521. #ifdef WOLFSSL_KEIL
  14522. "adcs r3, r3, %[r]\n\t"
  14523. #elif defined(__clang__)
  14524. "adcs r3, %[r]\n\t"
  14525. #else
  14526. "adc r3, %[r]\n\t"
  14527. #endif
  14528. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14529. "adds r2, r2, r6\n\t"
  14530. #else
  14531. "add r2, r2, r6\n\t"
  14532. #endif
  14533. #ifdef WOLFSSL_KEIL
  14534. "adcs r3, r3, %[r]\n\t"
  14535. #elif defined(__clang__)
  14536. "adcs r3, %[r]\n\t"
  14537. #else
  14538. "adc r3, %[r]\n\t"
  14539. #endif
  14540. "uxth r6, r7\n\t"
  14541. #ifdef WOLFSSL_KEIL
  14542. "muls r5, r6, r5\n\t"
  14543. #elif defined(__clang__)
  14544. "muls r5, r6\n\t"
  14545. #else
  14546. "mul r5, r6\n\t"
  14547. #endif
  14548. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14549. "lsrs r6, r5, #16\n\t"
  14550. #else
  14551. "lsr r6, r5, #16\n\t"
  14552. #endif
  14553. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14554. "lsls r5, r5, #16\n\t"
  14555. #else
  14556. "lsl r5, r5, #16\n\t"
  14557. #endif
  14558. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14559. "adds r4, r4, r5\n\t"
  14560. #else
  14561. "add r4, r4, r5\n\t"
  14562. #endif
  14563. #ifdef WOLFSSL_KEIL
  14564. "adcs r2, r2, r6\n\t"
  14565. #elif defined(__clang__)
  14566. "adcs r2, r6\n\t"
  14567. #else
  14568. "adc r2, r6\n\t"
  14569. #endif
  14570. #ifdef WOLFSSL_KEIL
  14571. "adcs r3, r3, %[r]\n\t"
  14572. #elif defined(__clang__)
  14573. "adcs r3, %[r]\n\t"
  14574. #else
  14575. "adc r3, %[r]\n\t"
  14576. #endif
  14577. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14578. "adds r4, r4, r5\n\t"
  14579. #else
  14580. "add r4, r4, r5\n\t"
  14581. #endif
  14582. #ifdef WOLFSSL_KEIL
  14583. "adcs r2, r2, r6\n\t"
  14584. #elif defined(__clang__)
  14585. "adcs r2, r6\n\t"
  14586. #else
  14587. "adc r2, r6\n\t"
  14588. #endif
  14589. #ifdef WOLFSSL_KEIL
  14590. "adcs r3, r3, %[r]\n\t"
  14591. #elif defined(__clang__)
  14592. "adcs r3, %[r]\n\t"
  14593. #else
  14594. "adc r3, %[r]\n\t"
  14595. #endif
  14596. "# A[5] * A[0]\n\t"
  14597. "mov %[a], r9\n\t"
  14598. "mov r7, r10\n\t"
  14599. "ldr %[a], [%[a], #20]\n\t"
  14600. "uxth r5, %[a]\n\t"
  14601. "uxth r6, r7\n\t"
  14602. #ifdef WOLFSSL_KEIL
  14603. "muls r6, r5, r6\n\t"
  14604. #elif defined(__clang__)
  14605. "muls r6, r5\n\t"
  14606. #else
  14607. "mul r6, r5\n\t"
  14608. #endif
  14609. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14610. "adds r4, r4, r6\n\t"
  14611. #else
  14612. "add r4, r4, r6\n\t"
  14613. #endif
  14614. #ifdef WOLFSSL_KEIL
  14615. "adcs r2, r2, %[r]\n\t"
  14616. #elif defined(__clang__)
  14617. "adcs r2, %[r]\n\t"
  14618. #else
  14619. "adc r2, %[r]\n\t"
  14620. #endif
  14621. #ifdef WOLFSSL_KEIL
  14622. "adcs r3, r3, %[r]\n\t"
  14623. #elif defined(__clang__)
  14624. "adcs r3, %[r]\n\t"
  14625. #else
  14626. "adc r3, %[r]\n\t"
  14627. #endif
  14628. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14629. "adds r4, r4, r6\n\t"
  14630. #else
  14631. "add r4, r4, r6\n\t"
  14632. #endif
  14633. #ifdef WOLFSSL_KEIL
  14634. "adcs r2, r2, %[r]\n\t"
  14635. #elif defined(__clang__)
  14636. "adcs r2, %[r]\n\t"
  14637. #else
  14638. "adc r2, %[r]\n\t"
  14639. #endif
  14640. #ifdef WOLFSSL_KEIL
  14641. "adcs r3, r3, %[r]\n\t"
  14642. #elif defined(__clang__)
  14643. "adcs r3, %[r]\n\t"
  14644. #else
  14645. "adc r3, %[r]\n\t"
  14646. #endif
  14647. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14648. "lsrs r6, r7, #16\n\t"
  14649. #else
  14650. "lsr r6, r7, #16\n\t"
  14651. #endif
  14652. #ifdef WOLFSSL_KEIL
  14653. "muls r5, r6, r5\n\t"
  14654. #elif defined(__clang__)
  14655. "muls r5, r6\n\t"
  14656. #else
  14657. "mul r5, r6\n\t"
  14658. #endif
  14659. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14660. "lsrs r6, r5, #16\n\t"
  14661. #else
  14662. "lsr r6, r5, #16\n\t"
  14663. #endif
  14664. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14665. "lsls r5, r5, #16\n\t"
  14666. #else
  14667. "lsl r5, r5, #16\n\t"
  14668. #endif
  14669. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14670. "adds r4, r4, r5\n\t"
  14671. #else
  14672. "add r4, r4, r5\n\t"
  14673. #endif
  14674. #ifdef WOLFSSL_KEIL
  14675. "adcs r2, r2, r6\n\t"
  14676. #elif defined(__clang__)
  14677. "adcs r2, r6\n\t"
  14678. #else
  14679. "adc r2, r6\n\t"
  14680. #endif
  14681. #ifdef WOLFSSL_KEIL
  14682. "adcs r3, r3, %[r]\n\t"
  14683. #elif defined(__clang__)
  14684. "adcs r3, %[r]\n\t"
  14685. #else
  14686. "adc r3, %[r]\n\t"
  14687. #endif
  14688. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14689. "adds r4, r4, r5\n\t"
  14690. #else
  14691. "add r4, r4, r5\n\t"
  14692. #endif
  14693. #ifdef WOLFSSL_KEIL
  14694. "adcs r2, r2, r6\n\t"
  14695. #elif defined(__clang__)
  14696. "adcs r2, r6\n\t"
  14697. #else
  14698. "adc r2, r6\n\t"
  14699. #endif
  14700. #ifdef WOLFSSL_KEIL
  14701. "adcs r3, r3, %[r]\n\t"
  14702. #elif defined(__clang__)
  14703. "adcs r3, %[r]\n\t"
  14704. #else
  14705. "adc r3, %[r]\n\t"
  14706. #endif
  14707. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14708. "lsrs r5, %[a], #16\n\t"
  14709. #else
  14710. "lsr r5, %[a], #16\n\t"
  14711. #endif
  14712. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14713. "lsrs r6, r7, #16\n\t"
  14714. #else
  14715. "lsr r6, r7, #16\n\t"
  14716. #endif
  14717. #ifdef WOLFSSL_KEIL
  14718. "muls r6, r5, r6\n\t"
  14719. #elif defined(__clang__)
  14720. "muls r6, r5\n\t"
  14721. #else
  14722. "mul r6, r5\n\t"
  14723. #endif
  14724. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14725. "adds r2, r2, r6\n\t"
  14726. #else
  14727. "add r2, r2, r6\n\t"
  14728. #endif
  14729. #ifdef WOLFSSL_KEIL
  14730. "adcs r3, r3, %[r]\n\t"
  14731. #elif defined(__clang__)
  14732. "adcs r3, %[r]\n\t"
  14733. #else
  14734. "adc r3, %[r]\n\t"
  14735. #endif
  14736. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14737. "adds r2, r2, r6\n\t"
  14738. #else
  14739. "add r2, r2, r6\n\t"
  14740. #endif
  14741. #ifdef WOLFSSL_KEIL
  14742. "adcs r3, r3, %[r]\n\t"
  14743. #elif defined(__clang__)
  14744. "adcs r3, %[r]\n\t"
  14745. #else
  14746. "adc r3, %[r]\n\t"
  14747. #endif
  14748. "uxth r6, r7\n\t"
  14749. #ifdef WOLFSSL_KEIL
  14750. "muls r5, r6, r5\n\t"
  14751. #elif defined(__clang__)
  14752. "muls r5, r6\n\t"
  14753. #else
  14754. "mul r5, r6\n\t"
  14755. #endif
  14756. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14757. "lsrs r6, r5, #16\n\t"
  14758. #else
  14759. "lsr r6, r5, #16\n\t"
  14760. #endif
  14761. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14762. "lsls r5, r5, #16\n\t"
  14763. #else
  14764. "lsl r5, r5, #16\n\t"
  14765. #endif
  14766. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14767. "adds r4, r4, r5\n\t"
  14768. #else
  14769. "add r4, r4, r5\n\t"
  14770. #endif
  14771. #ifdef WOLFSSL_KEIL
  14772. "adcs r2, r2, r6\n\t"
  14773. #elif defined(__clang__)
  14774. "adcs r2, r6\n\t"
  14775. #else
  14776. "adc r2, r6\n\t"
  14777. #endif
  14778. #ifdef WOLFSSL_KEIL
  14779. "adcs r3, r3, %[r]\n\t"
  14780. #elif defined(__clang__)
  14781. "adcs r3, %[r]\n\t"
  14782. #else
  14783. "adc r3, %[r]\n\t"
  14784. #endif
  14785. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14786. "adds r4, r4, r5\n\t"
  14787. #else
  14788. "add r4, r4, r5\n\t"
  14789. #endif
  14790. #ifdef WOLFSSL_KEIL
  14791. "adcs r2, r2, r6\n\t"
  14792. #elif defined(__clang__)
  14793. "adcs r2, r6\n\t"
  14794. #else
  14795. "adc r2, r6\n\t"
  14796. #endif
  14797. #ifdef WOLFSSL_KEIL
  14798. "adcs r3, r3, %[r]\n\t"
  14799. #elif defined(__clang__)
  14800. "adcs r3, %[r]\n\t"
  14801. #else
  14802. "adc r3, %[r]\n\t"
  14803. #endif
  14804. "str r4, [sp, #20]\n\t"
  14805. "# A[6] * A[0]\n\t"
  14806. "movs r4, #0\n\t"
  14807. "mov %[a], r9\n\t"
  14808. "ldr %[a], [%[a], #24]\n\t"
  14809. "uxth r5, %[a]\n\t"
  14810. "uxth r6, r7\n\t"
  14811. #ifdef WOLFSSL_KEIL
  14812. "muls r6, r5, r6\n\t"
  14813. #elif defined(__clang__)
  14814. "muls r6, r5\n\t"
  14815. #else
  14816. "mul r6, r5\n\t"
  14817. #endif
  14818. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14819. "adds r2, r2, r6\n\t"
  14820. #else
  14821. "add r2, r2, r6\n\t"
  14822. #endif
  14823. #ifdef WOLFSSL_KEIL
  14824. "adcs r3, r3, %[r]\n\t"
  14825. #elif defined(__clang__)
  14826. "adcs r3, %[r]\n\t"
  14827. #else
  14828. "adc r3, %[r]\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. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14838. "adds r2, r2, r6\n\t"
  14839. #else
  14840. "add r2, r2, r6\n\t"
  14841. #endif
  14842. #ifdef WOLFSSL_KEIL
  14843. "adcs r3, r3, %[r]\n\t"
  14844. #elif defined(__clang__)
  14845. "adcs r3, %[r]\n\t"
  14846. #else
  14847. "adc r3, %[r]\n\t"
  14848. #endif
  14849. #ifdef WOLFSSL_KEIL
  14850. "adcs r4, r4, %[r]\n\t"
  14851. #elif defined(__clang__)
  14852. "adcs r4, %[r]\n\t"
  14853. #else
  14854. "adc r4, %[r]\n\t"
  14855. #endif
  14856. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14857. "lsrs r6, r7, #16\n\t"
  14858. #else
  14859. "lsr r6, r7, #16\n\t"
  14860. #endif
  14861. #ifdef WOLFSSL_KEIL
  14862. "muls r5, r6, r5\n\t"
  14863. #elif defined(__clang__)
  14864. "muls r5, r6\n\t"
  14865. #else
  14866. "mul r5, r6\n\t"
  14867. #endif
  14868. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14869. "lsrs r6, r5, #16\n\t"
  14870. #else
  14871. "lsr r6, r5, #16\n\t"
  14872. #endif
  14873. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14874. "lsls r5, r5, #16\n\t"
  14875. #else
  14876. "lsl r5, r5, #16\n\t"
  14877. #endif
  14878. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14879. "adds r2, r2, r5\n\t"
  14880. #else
  14881. "add r2, r2, r5\n\t"
  14882. #endif
  14883. #ifdef WOLFSSL_KEIL
  14884. "adcs r3, r3, r6\n\t"
  14885. #elif defined(__clang__)
  14886. "adcs r3, r6\n\t"
  14887. #else
  14888. "adc r3, r6\n\t"
  14889. #endif
  14890. #ifdef WOLFSSL_KEIL
  14891. "adcs r4, r4, %[r]\n\t"
  14892. #elif defined(__clang__)
  14893. "adcs r4, %[r]\n\t"
  14894. #else
  14895. "adc r4, %[r]\n\t"
  14896. #endif
  14897. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14898. "adds r2, r2, r5\n\t"
  14899. #else
  14900. "add r2, r2, r5\n\t"
  14901. #endif
  14902. #ifdef WOLFSSL_KEIL
  14903. "adcs r3, r3, r6\n\t"
  14904. #elif defined(__clang__)
  14905. "adcs r3, r6\n\t"
  14906. #else
  14907. "adc r3, r6\n\t"
  14908. #endif
  14909. #ifdef WOLFSSL_KEIL
  14910. "adcs r4, r4, %[r]\n\t"
  14911. #elif defined(__clang__)
  14912. "adcs r4, %[r]\n\t"
  14913. #else
  14914. "adc r4, %[r]\n\t"
  14915. #endif
  14916. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14917. "lsrs r5, %[a], #16\n\t"
  14918. #else
  14919. "lsr r5, %[a], #16\n\t"
  14920. #endif
  14921. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14922. "lsrs r6, r7, #16\n\t"
  14923. #else
  14924. "lsr r6, r7, #16\n\t"
  14925. #endif
  14926. #ifdef WOLFSSL_KEIL
  14927. "muls r6, r5, r6\n\t"
  14928. #elif defined(__clang__)
  14929. "muls r6, r5\n\t"
  14930. #else
  14931. "mul r6, r5\n\t"
  14932. #endif
  14933. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14934. "adds r3, r3, r6\n\t"
  14935. #else
  14936. "add r3, r3, r6\n\t"
  14937. #endif
  14938. #ifdef WOLFSSL_KEIL
  14939. "adcs r4, r4, %[r]\n\t"
  14940. #elif defined(__clang__)
  14941. "adcs r4, %[r]\n\t"
  14942. #else
  14943. "adc r4, %[r]\n\t"
  14944. #endif
  14945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14946. "adds r3, r3, r6\n\t"
  14947. #else
  14948. "add r3, r3, r6\n\t"
  14949. #endif
  14950. #ifdef WOLFSSL_KEIL
  14951. "adcs r4, r4, %[r]\n\t"
  14952. #elif defined(__clang__)
  14953. "adcs r4, %[r]\n\t"
  14954. #else
  14955. "adc r4, %[r]\n\t"
  14956. #endif
  14957. "uxth r6, r7\n\t"
  14958. #ifdef WOLFSSL_KEIL
  14959. "muls r5, r6, r5\n\t"
  14960. #elif defined(__clang__)
  14961. "muls r5, r6\n\t"
  14962. #else
  14963. "mul r5, r6\n\t"
  14964. #endif
  14965. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14966. "lsrs r6, r5, #16\n\t"
  14967. #else
  14968. "lsr r6, r5, #16\n\t"
  14969. #endif
  14970. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14971. "lsls r5, r5, #16\n\t"
  14972. #else
  14973. "lsl r5, r5, #16\n\t"
  14974. #endif
  14975. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14976. "adds r2, r2, r5\n\t"
  14977. #else
  14978. "add r2, r2, r5\n\t"
  14979. #endif
  14980. #ifdef WOLFSSL_KEIL
  14981. "adcs r3, r3, r6\n\t"
  14982. #elif defined(__clang__)
  14983. "adcs r3, r6\n\t"
  14984. #else
  14985. "adc r3, r6\n\t"
  14986. #endif
  14987. #ifdef WOLFSSL_KEIL
  14988. "adcs r4, r4, %[r]\n\t"
  14989. #elif defined(__clang__)
  14990. "adcs r4, %[r]\n\t"
  14991. #else
  14992. "adc r4, %[r]\n\t"
  14993. #endif
  14994. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14995. "adds r2, r2, r5\n\t"
  14996. #else
  14997. "add r2, r2, r5\n\t"
  14998. #endif
  14999. #ifdef WOLFSSL_KEIL
  15000. "adcs r3, r3, r6\n\t"
  15001. #elif defined(__clang__)
  15002. "adcs r3, r6\n\t"
  15003. #else
  15004. "adc r3, r6\n\t"
  15005. #endif
  15006. #ifdef WOLFSSL_KEIL
  15007. "adcs r4, r4, %[r]\n\t"
  15008. #elif defined(__clang__)
  15009. "adcs r4, %[r]\n\t"
  15010. #else
  15011. "adc r4, %[r]\n\t"
  15012. #endif
  15013. "# A[5] * A[1]\n\t"
  15014. "mov %[a], r9\n\t"
  15015. "mov r7, r11\n\t"
  15016. "ldr %[a], [%[a], #20]\n\t"
  15017. "uxth r5, %[a]\n\t"
  15018. "uxth r6, r7\n\t"
  15019. #ifdef WOLFSSL_KEIL
  15020. "muls r6, r5, r6\n\t"
  15021. #elif defined(__clang__)
  15022. "muls r6, r5\n\t"
  15023. #else
  15024. "mul r6, r5\n\t"
  15025. #endif
  15026. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15027. "adds r2, r2, r6\n\t"
  15028. #else
  15029. "add r2, r2, r6\n\t"
  15030. #endif
  15031. #ifdef WOLFSSL_KEIL
  15032. "adcs r3, r3, %[r]\n\t"
  15033. #elif defined(__clang__)
  15034. "adcs r3, %[r]\n\t"
  15035. #else
  15036. "adc r3, %[r]\n\t"
  15037. #endif
  15038. #ifdef WOLFSSL_KEIL
  15039. "adcs r4, r4, %[r]\n\t"
  15040. #elif defined(__clang__)
  15041. "adcs r4, %[r]\n\t"
  15042. #else
  15043. "adc r4, %[r]\n\t"
  15044. #endif
  15045. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15046. "adds r2, r2, r6\n\t"
  15047. #else
  15048. "add r2, r2, r6\n\t"
  15049. #endif
  15050. #ifdef WOLFSSL_KEIL
  15051. "adcs r3, r3, %[r]\n\t"
  15052. #elif defined(__clang__)
  15053. "adcs r3, %[r]\n\t"
  15054. #else
  15055. "adc r3, %[r]\n\t"
  15056. #endif
  15057. #ifdef WOLFSSL_KEIL
  15058. "adcs r4, r4, %[r]\n\t"
  15059. #elif defined(__clang__)
  15060. "adcs r4, %[r]\n\t"
  15061. #else
  15062. "adc r4, %[r]\n\t"
  15063. #endif
  15064. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15065. "lsrs r6, r7, #16\n\t"
  15066. #else
  15067. "lsr r6, r7, #16\n\t"
  15068. #endif
  15069. #ifdef WOLFSSL_KEIL
  15070. "muls r5, r6, r5\n\t"
  15071. #elif defined(__clang__)
  15072. "muls r5, r6\n\t"
  15073. #else
  15074. "mul r5, r6\n\t"
  15075. #endif
  15076. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15077. "lsrs r6, r5, #16\n\t"
  15078. #else
  15079. "lsr r6, r5, #16\n\t"
  15080. #endif
  15081. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15082. "lsls r5, r5, #16\n\t"
  15083. #else
  15084. "lsl r5, r5, #16\n\t"
  15085. #endif
  15086. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15087. "adds r2, r2, r5\n\t"
  15088. #else
  15089. "add r2, r2, r5\n\t"
  15090. #endif
  15091. #ifdef WOLFSSL_KEIL
  15092. "adcs r3, r3, r6\n\t"
  15093. #elif defined(__clang__)
  15094. "adcs r3, r6\n\t"
  15095. #else
  15096. "adc r3, r6\n\t"
  15097. #endif
  15098. #ifdef WOLFSSL_KEIL
  15099. "adcs r4, r4, %[r]\n\t"
  15100. #elif defined(__clang__)
  15101. "adcs r4, %[r]\n\t"
  15102. #else
  15103. "adc r4, %[r]\n\t"
  15104. #endif
  15105. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15106. "adds r2, r2, r5\n\t"
  15107. #else
  15108. "add r2, r2, r5\n\t"
  15109. #endif
  15110. #ifdef WOLFSSL_KEIL
  15111. "adcs r3, r3, r6\n\t"
  15112. #elif defined(__clang__)
  15113. "adcs r3, r6\n\t"
  15114. #else
  15115. "adc r3, r6\n\t"
  15116. #endif
  15117. #ifdef WOLFSSL_KEIL
  15118. "adcs r4, r4, %[r]\n\t"
  15119. #elif defined(__clang__)
  15120. "adcs r4, %[r]\n\t"
  15121. #else
  15122. "adc r4, %[r]\n\t"
  15123. #endif
  15124. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15125. "lsrs r5, %[a], #16\n\t"
  15126. #else
  15127. "lsr r5, %[a], #16\n\t"
  15128. #endif
  15129. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15130. "lsrs r6, r7, #16\n\t"
  15131. #else
  15132. "lsr r6, r7, #16\n\t"
  15133. #endif
  15134. #ifdef WOLFSSL_KEIL
  15135. "muls r6, r5, r6\n\t"
  15136. #elif defined(__clang__)
  15137. "muls r6, r5\n\t"
  15138. #else
  15139. "mul r6, r5\n\t"
  15140. #endif
  15141. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15142. "adds r3, r3, r6\n\t"
  15143. #else
  15144. "add r3, r3, r6\n\t"
  15145. #endif
  15146. #ifdef WOLFSSL_KEIL
  15147. "adcs r4, r4, %[r]\n\t"
  15148. #elif defined(__clang__)
  15149. "adcs r4, %[r]\n\t"
  15150. #else
  15151. "adc r4, %[r]\n\t"
  15152. #endif
  15153. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15154. "adds r3, r3, r6\n\t"
  15155. #else
  15156. "add r3, r3, r6\n\t"
  15157. #endif
  15158. #ifdef WOLFSSL_KEIL
  15159. "adcs r4, r4, %[r]\n\t"
  15160. #elif defined(__clang__)
  15161. "adcs r4, %[r]\n\t"
  15162. #else
  15163. "adc r4, %[r]\n\t"
  15164. #endif
  15165. "uxth r6, r7\n\t"
  15166. #ifdef WOLFSSL_KEIL
  15167. "muls r5, r6, r5\n\t"
  15168. #elif defined(__clang__)
  15169. "muls r5, r6\n\t"
  15170. #else
  15171. "mul r5, r6\n\t"
  15172. #endif
  15173. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15174. "lsrs r6, r5, #16\n\t"
  15175. #else
  15176. "lsr r6, r5, #16\n\t"
  15177. #endif
  15178. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15179. "lsls r5, r5, #16\n\t"
  15180. #else
  15181. "lsl r5, r5, #16\n\t"
  15182. #endif
  15183. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15184. "adds r2, r2, r5\n\t"
  15185. #else
  15186. "add r2, r2, r5\n\t"
  15187. #endif
  15188. #ifdef WOLFSSL_KEIL
  15189. "adcs r3, r3, r6\n\t"
  15190. #elif defined(__clang__)
  15191. "adcs r3, r6\n\t"
  15192. #else
  15193. "adc r3, r6\n\t"
  15194. #endif
  15195. #ifdef WOLFSSL_KEIL
  15196. "adcs r4, r4, %[r]\n\t"
  15197. #elif defined(__clang__)
  15198. "adcs r4, %[r]\n\t"
  15199. #else
  15200. "adc r4, %[r]\n\t"
  15201. #endif
  15202. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15203. "adds r2, r2, r5\n\t"
  15204. #else
  15205. "add r2, r2, r5\n\t"
  15206. #endif
  15207. #ifdef WOLFSSL_KEIL
  15208. "adcs r3, r3, r6\n\t"
  15209. #elif defined(__clang__)
  15210. "adcs r3, r6\n\t"
  15211. #else
  15212. "adc r3, r6\n\t"
  15213. #endif
  15214. #ifdef WOLFSSL_KEIL
  15215. "adcs r4, r4, %[r]\n\t"
  15216. #elif defined(__clang__)
  15217. "adcs r4, %[r]\n\t"
  15218. #else
  15219. "adc r4, %[r]\n\t"
  15220. #endif
  15221. "# A[4] * A[2]\n\t"
  15222. "mov %[a], r9\n\t"
  15223. "mov r7, r12\n\t"
  15224. "ldr %[a], [%[a], #16]\n\t"
  15225. "uxth r5, %[a]\n\t"
  15226. "uxth r6, r7\n\t"
  15227. #ifdef WOLFSSL_KEIL
  15228. "muls r6, r5, r6\n\t"
  15229. #elif defined(__clang__)
  15230. "muls r6, r5\n\t"
  15231. #else
  15232. "mul r6, r5\n\t"
  15233. #endif
  15234. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15235. "adds r2, r2, r6\n\t"
  15236. #else
  15237. "add r2, r2, r6\n\t"
  15238. #endif
  15239. #ifdef WOLFSSL_KEIL
  15240. "adcs r3, r3, %[r]\n\t"
  15241. #elif defined(__clang__)
  15242. "adcs r3, %[r]\n\t"
  15243. #else
  15244. "adc r3, %[r]\n\t"
  15245. #endif
  15246. #ifdef WOLFSSL_KEIL
  15247. "adcs r4, r4, %[r]\n\t"
  15248. #elif defined(__clang__)
  15249. "adcs r4, %[r]\n\t"
  15250. #else
  15251. "adc r4, %[r]\n\t"
  15252. #endif
  15253. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15254. "adds r2, r2, r6\n\t"
  15255. #else
  15256. "add r2, r2, r6\n\t"
  15257. #endif
  15258. #ifdef WOLFSSL_KEIL
  15259. "adcs r3, r3, %[r]\n\t"
  15260. #elif defined(__clang__)
  15261. "adcs r3, %[r]\n\t"
  15262. #else
  15263. "adc r3, %[r]\n\t"
  15264. #endif
  15265. #ifdef WOLFSSL_KEIL
  15266. "adcs r4, r4, %[r]\n\t"
  15267. #elif defined(__clang__)
  15268. "adcs r4, %[r]\n\t"
  15269. #else
  15270. "adc r4, %[r]\n\t"
  15271. #endif
  15272. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15273. "lsrs r6, r7, #16\n\t"
  15274. #else
  15275. "lsr r6, r7, #16\n\t"
  15276. #endif
  15277. #ifdef WOLFSSL_KEIL
  15278. "muls r5, r6, r5\n\t"
  15279. #elif defined(__clang__)
  15280. "muls r5, r6\n\t"
  15281. #else
  15282. "mul r5, r6\n\t"
  15283. #endif
  15284. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15285. "lsrs r6, r5, #16\n\t"
  15286. #else
  15287. "lsr r6, r5, #16\n\t"
  15288. #endif
  15289. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15290. "lsls r5, r5, #16\n\t"
  15291. #else
  15292. "lsl r5, r5, #16\n\t"
  15293. #endif
  15294. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15295. "adds r2, r2, r5\n\t"
  15296. #else
  15297. "add r2, r2, r5\n\t"
  15298. #endif
  15299. #ifdef WOLFSSL_KEIL
  15300. "adcs r3, r3, r6\n\t"
  15301. #elif defined(__clang__)
  15302. "adcs r3, r6\n\t"
  15303. #else
  15304. "adc r3, r6\n\t"
  15305. #endif
  15306. #ifdef WOLFSSL_KEIL
  15307. "adcs r4, r4, %[r]\n\t"
  15308. #elif defined(__clang__)
  15309. "adcs r4, %[r]\n\t"
  15310. #else
  15311. "adc r4, %[r]\n\t"
  15312. #endif
  15313. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15314. "adds r2, r2, r5\n\t"
  15315. #else
  15316. "add r2, r2, r5\n\t"
  15317. #endif
  15318. #ifdef WOLFSSL_KEIL
  15319. "adcs r3, r3, r6\n\t"
  15320. #elif defined(__clang__)
  15321. "adcs r3, r6\n\t"
  15322. #else
  15323. "adc r3, r6\n\t"
  15324. #endif
  15325. #ifdef WOLFSSL_KEIL
  15326. "adcs r4, r4, %[r]\n\t"
  15327. #elif defined(__clang__)
  15328. "adcs r4, %[r]\n\t"
  15329. #else
  15330. "adc r4, %[r]\n\t"
  15331. #endif
  15332. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15333. "lsrs r5, %[a], #16\n\t"
  15334. #else
  15335. "lsr r5, %[a], #16\n\t"
  15336. #endif
  15337. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15338. "lsrs r6, r7, #16\n\t"
  15339. #else
  15340. "lsr r6, r7, #16\n\t"
  15341. #endif
  15342. #ifdef WOLFSSL_KEIL
  15343. "muls r6, r5, r6\n\t"
  15344. #elif defined(__clang__)
  15345. "muls r6, r5\n\t"
  15346. #else
  15347. "mul r6, r5\n\t"
  15348. #endif
  15349. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15350. "adds r3, r3, r6\n\t"
  15351. #else
  15352. "add r3, r3, r6\n\t"
  15353. #endif
  15354. #ifdef WOLFSSL_KEIL
  15355. "adcs r4, r4, %[r]\n\t"
  15356. #elif defined(__clang__)
  15357. "adcs r4, %[r]\n\t"
  15358. #else
  15359. "adc r4, %[r]\n\t"
  15360. #endif
  15361. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15362. "adds r3, r3, r6\n\t"
  15363. #else
  15364. "add r3, r3, r6\n\t"
  15365. #endif
  15366. #ifdef WOLFSSL_KEIL
  15367. "adcs r4, r4, %[r]\n\t"
  15368. #elif defined(__clang__)
  15369. "adcs r4, %[r]\n\t"
  15370. #else
  15371. "adc r4, %[r]\n\t"
  15372. #endif
  15373. "uxth r6, r7\n\t"
  15374. #ifdef WOLFSSL_KEIL
  15375. "muls r5, r6, r5\n\t"
  15376. #elif defined(__clang__)
  15377. "muls r5, r6\n\t"
  15378. #else
  15379. "mul r5, r6\n\t"
  15380. #endif
  15381. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15382. "lsrs r6, r5, #16\n\t"
  15383. #else
  15384. "lsr r6, r5, #16\n\t"
  15385. #endif
  15386. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15387. "lsls r5, r5, #16\n\t"
  15388. #else
  15389. "lsl r5, r5, #16\n\t"
  15390. #endif
  15391. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15392. "adds r2, r2, r5\n\t"
  15393. #else
  15394. "add r2, r2, r5\n\t"
  15395. #endif
  15396. #ifdef WOLFSSL_KEIL
  15397. "adcs r3, r3, r6\n\t"
  15398. #elif defined(__clang__)
  15399. "adcs r3, r6\n\t"
  15400. #else
  15401. "adc r3, r6\n\t"
  15402. #endif
  15403. #ifdef WOLFSSL_KEIL
  15404. "adcs r4, r4, %[r]\n\t"
  15405. #elif defined(__clang__)
  15406. "adcs r4, %[r]\n\t"
  15407. #else
  15408. "adc r4, %[r]\n\t"
  15409. #endif
  15410. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15411. "adds r2, r2, r5\n\t"
  15412. #else
  15413. "add r2, r2, r5\n\t"
  15414. #endif
  15415. #ifdef WOLFSSL_KEIL
  15416. "adcs r3, r3, r6\n\t"
  15417. #elif defined(__clang__)
  15418. "adcs r3, r6\n\t"
  15419. #else
  15420. "adc r3, r6\n\t"
  15421. #endif
  15422. #ifdef WOLFSSL_KEIL
  15423. "adcs r4, r4, %[r]\n\t"
  15424. #elif defined(__clang__)
  15425. "adcs r4, %[r]\n\t"
  15426. #else
  15427. "adc r4, %[r]\n\t"
  15428. #endif
  15429. "# A[3] * A[3]\n\t"
  15430. "mov r7, lr\n\t"
  15431. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15432. "lsrs r6, r7, #16\n\t"
  15433. #else
  15434. "lsr r6, r7, #16\n\t"
  15435. #endif
  15436. "uxth r5, r7\n\t"
  15437. #ifdef WOLFSSL_KEIL
  15438. "muls r5, r5, r5\n\t"
  15439. #elif defined(__clang__)
  15440. "muls r5, r5\n\t"
  15441. #else
  15442. "mul r5, r5\n\t"
  15443. #endif
  15444. #ifdef WOLFSSL_KEIL
  15445. "muls r6, r6, r6\n\t"
  15446. #elif defined(__clang__)
  15447. "muls r6, r6\n\t"
  15448. #else
  15449. "mul r6, r6\n\t"
  15450. #endif
  15451. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15452. "adds r2, r2, r5\n\t"
  15453. #else
  15454. "add r2, r2, r5\n\t"
  15455. #endif
  15456. #ifdef WOLFSSL_KEIL
  15457. "adcs r3, r3, r6\n\t"
  15458. #elif defined(__clang__)
  15459. "adcs r3, r6\n\t"
  15460. #else
  15461. "adc r3, r6\n\t"
  15462. #endif
  15463. #ifdef WOLFSSL_KEIL
  15464. "adcs r4, r4, %[r]\n\t"
  15465. #elif defined(__clang__)
  15466. "adcs r4, %[r]\n\t"
  15467. #else
  15468. "adc r4, %[r]\n\t"
  15469. #endif
  15470. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15471. "lsrs r6, r7, #16\n\t"
  15472. #else
  15473. "lsr r6, r7, #16\n\t"
  15474. #endif
  15475. "uxth r5, r7\n\t"
  15476. #ifdef WOLFSSL_KEIL
  15477. "muls r5, r6, r5\n\t"
  15478. #elif defined(__clang__)
  15479. "muls r5, r6\n\t"
  15480. #else
  15481. "mul r5, r6\n\t"
  15482. #endif
  15483. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15484. "lsrs r6, r5, #15\n\t"
  15485. #else
  15486. "lsr r6, r5, #15\n\t"
  15487. #endif
  15488. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15489. "lsls r5, r5, #17\n\t"
  15490. #else
  15491. "lsl r5, r5, #17\n\t"
  15492. #endif
  15493. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15494. "adds r2, r2, r5\n\t"
  15495. #else
  15496. "add r2, r2, r5\n\t"
  15497. #endif
  15498. #ifdef WOLFSSL_KEIL
  15499. "adcs r3, r3, r6\n\t"
  15500. #elif defined(__clang__)
  15501. "adcs r3, r6\n\t"
  15502. #else
  15503. "adc r3, r6\n\t"
  15504. #endif
  15505. #ifdef WOLFSSL_KEIL
  15506. "adcs r4, r4, %[r]\n\t"
  15507. #elif defined(__clang__)
  15508. "adcs r4, %[r]\n\t"
  15509. #else
  15510. "adc r4, %[r]\n\t"
  15511. #endif
  15512. "str r2, [sp, #24]\n\t"
  15513. "# A[4] * A[3]\n\t"
  15514. "movs r2, #0\n\t"
  15515. "mov %[a], r9\n\t"
  15516. "ldr %[a], [%[a], #16]\n\t"
  15517. "uxth r5, %[a]\n\t"
  15518. "uxth r6, r7\n\t"
  15519. #ifdef WOLFSSL_KEIL
  15520. "muls r6, r5, r6\n\t"
  15521. #elif defined(__clang__)
  15522. "muls r6, r5\n\t"
  15523. #else
  15524. "mul r6, r5\n\t"
  15525. #endif
  15526. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15527. "adds r3, r3, r6\n\t"
  15528. #else
  15529. "add r3, r3, r6\n\t"
  15530. #endif
  15531. #ifdef WOLFSSL_KEIL
  15532. "adcs r4, r4, %[r]\n\t"
  15533. #elif defined(__clang__)
  15534. "adcs r4, %[r]\n\t"
  15535. #else
  15536. "adc r4, %[r]\n\t"
  15537. #endif
  15538. #ifdef WOLFSSL_KEIL
  15539. "adcs r2, r2, %[r]\n\t"
  15540. #elif defined(__clang__)
  15541. "adcs r2, %[r]\n\t"
  15542. #else
  15543. "adc r2, %[r]\n\t"
  15544. #endif
  15545. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15546. "adds r3, r3, r6\n\t"
  15547. #else
  15548. "add r3, r3, r6\n\t"
  15549. #endif
  15550. #ifdef WOLFSSL_KEIL
  15551. "adcs r4, r4, %[r]\n\t"
  15552. #elif defined(__clang__)
  15553. "adcs r4, %[r]\n\t"
  15554. #else
  15555. "adc r4, %[r]\n\t"
  15556. #endif
  15557. #ifdef WOLFSSL_KEIL
  15558. "adcs r2, r2, %[r]\n\t"
  15559. #elif defined(__clang__)
  15560. "adcs r2, %[r]\n\t"
  15561. #else
  15562. "adc r2, %[r]\n\t"
  15563. #endif
  15564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15565. "lsrs r6, r7, #16\n\t"
  15566. #else
  15567. "lsr r6, r7, #16\n\t"
  15568. #endif
  15569. #ifdef WOLFSSL_KEIL
  15570. "muls r5, r6, r5\n\t"
  15571. #elif defined(__clang__)
  15572. "muls r5, r6\n\t"
  15573. #else
  15574. "mul r5, r6\n\t"
  15575. #endif
  15576. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15577. "lsrs r6, r5, #16\n\t"
  15578. #else
  15579. "lsr r6, r5, #16\n\t"
  15580. #endif
  15581. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15582. "lsls r5, r5, #16\n\t"
  15583. #else
  15584. "lsl r5, r5, #16\n\t"
  15585. #endif
  15586. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15587. "adds r3, r3, r5\n\t"
  15588. #else
  15589. "add r3, r3, r5\n\t"
  15590. #endif
  15591. #ifdef WOLFSSL_KEIL
  15592. "adcs r4, r4, r6\n\t"
  15593. #elif defined(__clang__)
  15594. "adcs r4, r6\n\t"
  15595. #else
  15596. "adc r4, r6\n\t"
  15597. #endif
  15598. #ifdef WOLFSSL_KEIL
  15599. "adcs r2, r2, %[r]\n\t"
  15600. #elif defined(__clang__)
  15601. "adcs r2, %[r]\n\t"
  15602. #else
  15603. "adc r2, %[r]\n\t"
  15604. #endif
  15605. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15606. "adds r3, r3, r5\n\t"
  15607. #else
  15608. "add r3, r3, r5\n\t"
  15609. #endif
  15610. #ifdef WOLFSSL_KEIL
  15611. "adcs r4, r4, r6\n\t"
  15612. #elif defined(__clang__)
  15613. "adcs r4, r6\n\t"
  15614. #else
  15615. "adc r4, r6\n\t"
  15616. #endif
  15617. #ifdef WOLFSSL_KEIL
  15618. "adcs r2, r2, %[r]\n\t"
  15619. #elif defined(__clang__)
  15620. "adcs r2, %[r]\n\t"
  15621. #else
  15622. "adc r2, %[r]\n\t"
  15623. #endif
  15624. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15625. "lsrs r5, %[a], #16\n\t"
  15626. #else
  15627. "lsr r5, %[a], #16\n\t"
  15628. #endif
  15629. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15630. "lsrs r6, r7, #16\n\t"
  15631. #else
  15632. "lsr r6, r7, #16\n\t"
  15633. #endif
  15634. #ifdef WOLFSSL_KEIL
  15635. "muls r6, r5, r6\n\t"
  15636. #elif defined(__clang__)
  15637. "muls r6, r5\n\t"
  15638. #else
  15639. "mul r6, r5\n\t"
  15640. #endif
  15641. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15642. "adds r4, r4, r6\n\t"
  15643. #else
  15644. "add r4, r4, r6\n\t"
  15645. #endif
  15646. #ifdef WOLFSSL_KEIL
  15647. "adcs r2, r2, %[r]\n\t"
  15648. #elif defined(__clang__)
  15649. "adcs r2, %[r]\n\t"
  15650. #else
  15651. "adc r2, %[r]\n\t"
  15652. #endif
  15653. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15654. "adds r4, r4, r6\n\t"
  15655. #else
  15656. "add r4, r4, r6\n\t"
  15657. #endif
  15658. #ifdef WOLFSSL_KEIL
  15659. "adcs r2, r2, %[r]\n\t"
  15660. #elif defined(__clang__)
  15661. "adcs r2, %[r]\n\t"
  15662. #else
  15663. "adc r2, %[r]\n\t"
  15664. #endif
  15665. "uxth r6, r7\n\t"
  15666. #ifdef WOLFSSL_KEIL
  15667. "muls r5, r6, r5\n\t"
  15668. #elif defined(__clang__)
  15669. "muls r5, r6\n\t"
  15670. #else
  15671. "mul r5, r6\n\t"
  15672. #endif
  15673. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15674. "lsrs r6, r5, #16\n\t"
  15675. #else
  15676. "lsr r6, r5, #16\n\t"
  15677. #endif
  15678. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15679. "lsls r5, r5, #16\n\t"
  15680. #else
  15681. "lsl r5, r5, #16\n\t"
  15682. #endif
  15683. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15684. "adds r3, r3, r5\n\t"
  15685. #else
  15686. "add r3, r3, r5\n\t"
  15687. #endif
  15688. #ifdef WOLFSSL_KEIL
  15689. "adcs r4, r4, r6\n\t"
  15690. #elif defined(__clang__)
  15691. "adcs r4, r6\n\t"
  15692. #else
  15693. "adc r4, r6\n\t"
  15694. #endif
  15695. #ifdef WOLFSSL_KEIL
  15696. "adcs r2, r2, %[r]\n\t"
  15697. #elif defined(__clang__)
  15698. "adcs r2, %[r]\n\t"
  15699. #else
  15700. "adc r2, %[r]\n\t"
  15701. #endif
  15702. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15703. "adds r3, r3, r5\n\t"
  15704. #else
  15705. "add r3, r3, r5\n\t"
  15706. #endif
  15707. #ifdef WOLFSSL_KEIL
  15708. "adcs r4, r4, r6\n\t"
  15709. #elif defined(__clang__)
  15710. "adcs r4, r6\n\t"
  15711. #else
  15712. "adc r4, r6\n\t"
  15713. #endif
  15714. #ifdef WOLFSSL_KEIL
  15715. "adcs r2, r2, %[r]\n\t"
  15716. #elif defined(__clang__)
  15717. "adcs r2, %[r]\n\t"
  15718. #else
  15719. "adc r2, %[r]\n\t"
  15720. #endif
  15721. "# A[5] * A[2]\n\t"
  15722. "mov %[a], r9\n\t"
  15723. "mov r7, r12\n\t"
  15724. "ldr %[a], [%[a], #20]\n\t"
  15725. "uxth r5, %[a]\n\t"
  15726. "uxth r6, r7\n\t"
  15727. #ifdef WOLFSSL_KEIL
  15728. "muls r6, r5, r6\n\t"
  15729. #elif defined(__clang__)
  15730. "muls r6, r5\n\t"
  15731. #else
  15732. "mul r6, r5\n\t"
  15733. #endif
  15734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15735. "adds r3, r3, r6\n\t"
  15736. #else
  15737. "add r3, r3, r6\n\t"
  15738. #endif
  15739. #ifdef WOLFSSL_KEIL
  15740. "adcs r4, r4, %[r]\n\t"
  15741. #elif defined(__clang__)
  15742. "adcs r4, %[r]\n\t"
  15743. #else
  15744. "adc r4, %[r]\n\t"
  15745. #endif
  15746. #ifdef WOLFSSL_KEIL
  15747. "adcs r2, r2, %[r]\n\t"
  15748. #elif defined(__clang__)
  15749. "adcs r2, %[r]\n\t"
  15750. #else
  15751. "adc r2, %[r]\n\t"
  15752. #endif
  15753. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15754. "adds r3, r3, r6\n\t"
  15755. #else
  15756. "add r3, r3, r6\n\t"
  15757. #endif
  15758. #ifdef WOLFSSL_KEIL
  15759. "adcs r4, r4, %[r]\n\t"
  15760. #elif defined(__clang__)
  15761. "adcs r4, %[r]\n\t"
  15762. #else
  15763. "adc r4, %[r]\n\t"
  15764. #endif
  15765. #ifdef WOLFSSL_KEIL
  15766. "adcs r2, r2, %[r]\n\t"
  15767. #elif defined(__clang__)
  15768. "adcs r2, %[r]\n\t"
  15769. #else
  15770. "adc r2, %[r]\n\t"
  15771. #endif
  15772. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15773. "lsrs r6, r7, #16\n\t"
  15774. #else
  15775. "lsr r6, r7, #16\n\t"
  15776. #endif
  15777. #ifdef WOLFSSL_KEIL
  15778. "muls r5, r6, r5\n\t"
  15779. #elif defined(__clang__)
  15780. "muls r5, r6\n\t"
  15781. #else
  15782. "mul r5, r6\n\t"
  15783. #endif
  15784. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15785. "lsrs r6, r5, #16\n\t"
  15786. #else
  15787. "lsr r6, r5, #16\n\t"
  15788. #endif
  15789. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15790. "lsls r5, r5, #16\n\t"
  15791. #else
  15792. "lsl r5, r5, #16\n\t"
  15793. #endif
  15794. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15795. "adds r3, r3, r5\n\t"
  15796. #else
  15797. "add r3, r3, r5\n\t"
  15798. #endif
  15799. #ifdef WOLFSSL_KEIL
  15800. "adcs r4, r4, r6\n\t"
  15801. #elif defined(__clang__)
  15802. "adcs r4, r6\n\t"
  15803. #else
  15804. "adc r4, r6\n\t"
  15805. #endif
  15806. #ifdef WOLFSSL_KEIL
  15807. "adcs r2, r2, %[r]\n\t"
  15808. #elif defined(__clang__)
  15809. "adcs r2, %[r]\n\t"
  15810. #else
  15811. "adc r2, %[r]\n\t"
  15812. #endif
  15813. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15814. "adds r3, r3, r5\n\t"
  15815. #else
  15816. "add r3, r3, r5\n\t"
  15817. #endif
  15818. #ifdef WOLFSSL_KEIL
  15819. "adcs r4, r4, r6\n\t"
  15820. #elif defined(__clang__)
  15821. "adcs r4, r6\n\t"
  15822. #else
  15823. "adc r4, r6\n\t"
  15824. #endif
  15825. #ifdef WOLFSSL_KEIL
  15826. "adcs r2, r2, %[r]\n\t"
  15827. #elif defined(__clang__)
  15828. "adcs r2, %[r]\n\t"
  15829. #else
  15830. "adc r2, %[r]\n\t"
  15831. #endif
  15832. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15833. "lsrs r5, %[a], #16\n\t"
  15834. #else
  15835. "lsr r5, %[a], #16\n\t"
  15836. #endif
  15837. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15838. "lsrs r6, r7, #16\n\t"
  15839. #else
  15840. "lsr r6, r7, #16\n\t"
  15841. #endif
  15842. #ifdef WOLFSSL_KEIL
  15843. "muls r6, r5, r6\n\t"
  15844. #elif defined(__clang__)
  15845. "muls r6, r5\n\t"
  15846. #else
  15847. "mul r6, r5\n\t"
  15848. #endif
  15849. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15850. "adds r4, r4, r6\n\t"
  15851. #else
  15852. "add r4, r4, r6\n\t"
  15853. #endif
  15854. #ifdef WOLFSSL_KEIL
  15855. "adcs r2, r2, %[r]\n\t"
  15856. #elif defined(__clang__)
  15857. "adcs r2, %[r]\n\t"
  15858. #else
  15859. "adc r2, %[r]\n\t"
  15860. #endif
  15861. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15862. "adds r4, r4, r6\n\t"
  15863. #else
  15864. "add r4, r4, r6\n\t"
  15865. #endif
  15866. #ifdef WOLFSSL_KEIL
  15867. "adcs r2, r2, %[r]\n\t"
  15868. #elif defined(__clang__)
  15869. "adcs r2, %[r]\n\t"
  15870. #else
  15871. "adc r2, %[r]\n\t"
  15872. #endif
  15873. "uxth r6, r7\n\t"
  15874. #ifdef WOLFSSL_KEIL
  15875. "muls r5, r6, r5\n\t"
  15876. #elif defined(__clang__)
  15877. "muls r5, r6\n\t"
  15878. #else
  15879. "mul r5, r6\n\t"
  15880. #endif
  15881. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15882. "lsrs r6, r5, #16\n\t"
  15883. #else
  15884. "lsr r6, r5, #16\n\t"
  15885. #endif
  15886. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15887. "lsls r5, r5, #16\n\t"
  15888. #else
  15889. "lsl r5, r5, #16\n\t"
  15890. #endif
  15891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15892. "adds r3, r3, r5\n\t"
  15893. #else
  15894. "add r3, r3, r5\n\t"
  15895. #endif
  15896. #ifdef WOLFSSL_KEIL
  15897. "adcs r4, r4, r6\n\t"
  15898. #elif defined(__clang__)
  15899. "adcs r4, r6\n\t"
  15900. #else
  15901. "adc r4, r6\n\t"
  15902. #endif
  15903. #ifdef WOLFSSL_KEIL
  15904. "adcs r2, r2, %[r]\n\t"
  15905. #elif defined(__clang__)
  15906. "adcs r2, %[r]\n\t"
  15907. #else
  15908. "adc r2, %[r]\n\t"
  15909. #endif
  15910. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15911. "adds r3, r3, r5\n\t"
  15912. #else
  15913. "add r3, r3, r5\n\t"
  15914. #endif
  15915. #ifdef WOLFSSL_KEIL
  15916. "adcs r4, r4, r6\n\t"
  15917. #elif defined(__clang__)
  15918. "adcs r4, r6\n\t"
  15919. #else
  15920. "adc r4, r6\n\t"
  15921. #endif
  15922. #ifdef WOLFSSL_KEIL
  15923. "adcs r2, r2, %[r]\n\t"
  15924. #elif defined(__clang__)
  15925. "adcs r2, %[r]\n\t"
  15926. #else
  15927. "adc r2, %[r]\n\t"
  15928. #endif
  15929. "# A[6] * A[1]\n\t"
  15930. "mov %[a], r9\n\t"
  15931. "mov r7, r11\n\t"
  15932. "ldr %[a], [%[a], #24]\n\t"
  15933. "uxth r5, %[a]\n\t"
  15934. "uxth r6, r7\n\t"
  15935. #ifdef WOLFSSL_KEIL
  15936. "muls r6, r5, r6\n\t"
  15937. #elif defined(__clang__)
  15938. "muls r6, r5\n\t"
  15939. #else
  15940. "mul r6, r5\n\t"
  15941. #endif
  15942. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15943. "adds r3, r3, r6\n\t"
  15944. #else
  15945. "add r3, r3, r6\n\t"
  15946. #endif
  15947. #ifdef WOLFSSL_KEIL
  15948. "adcs r4, r4, %[r]\n\t"
  15949. #elif defined(__clang__)
  15950. "adcs r4, %[r]\n\t"
  15951. #else
  15952. "adc r4, %[r]\n\t"
  15953. #endif
  15954. #ifdef WOLFSSL_KEIL
  15955. "adcs r2, r2, %[r]\n\t"
  15956. #elif defined(__clang__)
  15957. "adcs r2, %[r]\n\t"
  15958. #else
  15959. "adc r2, %[r]\n\t"
  15960. #endif
  15961. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15962. "adds r3, r3, r6\n\t"
  15963. #else
  15964. "add r3, r3, r6\n\t"
  15965. #endif
  15966. #ifdef WOLFSSL_KEIL
  15967. "adcs r4, r4, %[r]\n\t"
  15968. #elif defined(__clang__)
  15969. "adcs r4, %[r]\n\t"
  15970. #else
  15971. "adc r4, %[r]\n\t"
  15972. #endif
  15973. #ifdef WOLFSSL_KEIL
  15974. "adcs r2, r2, %[r]\n\t"
  15975. #elif defined(__clang__)
  15976. "adcs r2, %[r]\n\t"
  15977. #else
  15978. "adc r2, %[r]\n\t"
  15979. #endif
  15980. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15981. "lsrs r6, r7, #16\n\t"
  15982. #else
  15983. "lsr r6, r7, #16\n\t"
  15984. #endif
  15985. #ifdef WOLFSSL_KEIL
  15986. "muls r5, r6, r5\n\t"
  15987. #elif defined(__clang__)
  15988. "muls r5, r6\n\t"
  15989. #else
  15990. "mul r5, r6\n\t"
  15991. #endif
  15992. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15993. "lsrs r6, r5, #16\n\t"
  15994. #else
  15995. "lsr r6, r5, #16\n\t"
  15996. #endif
  15997. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15998. "lsls r5, r5, #16\n\t"
  15999. #else
  16000. "lsl r5, r5, #16\n\t"
  16001. #endif
  16002. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16003. "adds r3, r3, r5\n\t"
  16004. #else
  16005. "add r3, r3, r5\n\t"
  16006. #endif
  16007. #ifdef WOLFSSL_KEIL
  16008. "adcs r4, r4, r6\n\t"
  16009. #elif defined(__clang__)
  16010. "adcs r4, r6\n\t"
  16011. #else
  16012. "adc r4, r6\n\t"
  16013. #endif
  16014. #ifdef WOLFSSL_KEIL
  16015. "adcs r2, r2, %[r]\n\t"
  16016. #elif defined(__clang__)
  16017. "adcs r2, %[r]\n\t"
  16018. #else
  16019. "adc r2, %[r]\n\t"
  16020. #endif
  16021. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16022. "adds r3, r3, r5\n\t"
  16023. #else
  16024. "add r3, r3, r5\n\t"
  16025. #endif
  16026. #ifdef WOLFSSL_KEIL
  16027. "adcs r4, r4, r6\n\t"
  16028. #elif defined(__clang__)
  16029. "adcs r4, r6\n\t"
  16030. #else
  16031. "adc r4, r6\n\t"
  16032. #endif
  16033. #ifdef WOLFSSL_KEIL
  16034. "adcs r2, r2, %[r]\n\t"
  16035. #elif defined(__clang__)
  16036. "adcs r2, %[r]\n\t"
  16037. #else
  16038. "adc r2, %[r]\n\t"
  16039. #endif
  16040. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16041. "lsrs r5, %[a], #16\n\t"
  16042. #else
  16043. "lsr r5, %[a], #16\n\t"
  16044. #endif
  16045. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16046. "lsrs r6, r7, #16\n\t"
  16047. #else
  16048. "lsr r6, r7, #16\n\t"
  16049. #endif
  16050. #ifdef WOLFSSL_KEIL
  16051. "muls r6, r5, r6\n\t"
  16052. #elif defined(__clang__)
  16053. "muls r6, r5\n\t"
  16054. #else
  16055. "mul r6, r5\n\t"
  16056. #endif
  16057. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16058. "adds r4, r4, r6\n\t"
  16059. #else
  16060. "add r4, r4, r6\n\t"
  16061. #endif
  16062. #ifdef WOLFSSL_KEIL
  16063. "adcs r2, r2, %[r]\n\t"
  16064. #elif defined(__clang__)
  16065. "adcs r2, %[r]\n\t"
  16066. #else
  16067. "adc r2, %[r]\n\t"
  16068. #endif
  16069. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16070. "adds r4, r4, r6\n\t"
  16071. #else
  16072. "add r4, r4, r6\n\t"
  16073. #endif
  16074. #ifdef WOLFSSL_KEIL
  16075. "adcs r2, r2, %[r]\n\t"
  16076. #elif defined(__clang__)
  16077. "adcs r2, %[r]\n\t"
  16078. #else
  16079. "adc r2, %[r]\n\t"
  16080. #endif
  16081. "uxth r6, r7\n\t"
  16082. #ifdef WOLFSSL_KEIL
  16083. "muls r5, r6, r5\n\t"
  16084. #elif defined(__clang__)
  16085. "muls r5, r6\n\t"
  16086. #else
  16087. "mul r5, r6\n\t"
  16088. #endif
  16089. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16090. "lsrs r6, r5, #16\n\t"
  16091. #else
  16092. "lsr r6, r5, #16\n\t"
  16093. #endif
  16094. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16095. "lsls r5, r5, #16\n\t"
  16096. #else
  16097. "lsl r5, r5, #16\n\t"
  16098. #endif
  16099. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16100. "adds r3, r3, r5\n\t"
  16101. #else
  16102. "add r3, r3, r5\n\t"
  16103. #endif
  16104. #ifdef WOLFSSL_KEIL
  16105. "adcs r4, r4, r6\n\t"
  16106. #elif defined(__clang__)
  16107. "adcs r4, r6\n\t"
  16108. #else
  16109. "adc r4, r6\n\t"
  16110. #endif
  16111. #ifdef WOLFSSL_KEIL
  16112. "adcs r2, r2, %[r]\n\t"
  16113. #elif defined(__clang__)
  16114. "adcs r2, %[r]\n\t"
  16115. #else
  16116. "adc r2, %[r]\n\t"
  16117. #endif
  16118. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16119. "adds r3, r3, r5\n\t"
  16120. #else
  16121. "add r3, r3, r5\n\t"
  16122. #endif
  16123. #ifdef WOLFSSL_KEIL
  16124. "adcs r4, r4, r6\n\t"
  16125. #elif defined(__clang__)
  16126. "adcs r4, r6\n\t"
  16127. #else
  16128. "adc r4, r6\n\t"
  16129. #endif
  16130. #ifdef WOLFSSL_KEIL
  16131. "adcs r2, r2, %[r]\n\t"
  16132. #elif defined(__clang__)
  16133. "adcs r2, %[r]\n\t"
  16134. #else
  16135. "adc r2, %[r]\n\t"
  16136. #endif
  16137. "# A[7] * A[0]\n\t"
  16138. "mov %[a], r9\n\t"
  16139. "mov r7, r10\n\t"
  16140. "ldr %[a], [%[a], #28]\n\t"
  16141. "uxth r5, %[a]\n\t"
  16142. "uxth r6, r7\n\t"
  16143. #ifdef WOLFSSL_KEIL
  16144. "muls r6, r5, r6\n\t"
  16145. #elif defined(__clang__)
  16146. "muls r6, r5\n\t"
  16147. #else
  16148. "mul r6, r5\n\t"
  16149. #endif
  16150. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16151. "adds r3, r3, r6\n\t"
  16152. #else
  16153. "add r3, r3, r6\n\t"
  16154. #endif
  16155. #ifdef WOLFSSL_KEIL
  16156. "adcs r4, r4, %[r]\n\t"
  16157. #elif defined(__clang__)
  16158. "adcs r4, %[r]\n\t"
  16159. #else
  16160. "adc r4, %[r]\n\t"
  16161. #endif
  16162. #ifdef WOLFSSL_KEIL
  16163. "adcs r2, r2, %[r]\n\t"
  16164. #elif defined(__clang__)
  16165. "adcs r2, %[r]\n\t"
  16166. #else
  16167. "adc r2, %[r]\n\t"
  16168. #endif
  16169. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16170. "adds r3, r3, r6\n\t"
  16171. #else
  16172. "add r3, r3, r6\n\t"
  16173. #endif
  16174. #ifdef WOLFSSL_KEIL
  16175. "adcs r4, r4, %[r]\n\t"
  16176. #elif defined(__clang__)
  16177. "adcs r4, %[r]\n\t"
  16178. #else
  16179. "adc r4, %[r]\n\t"
  16180. #endif
  16181. #ifdef WOLFSSL_KEIL
  16182. "adcs r2, r2, %[r]\n\t"
  16183. #elif defined(__clang__)
  16184. "adcs r2, %[r]\n\t"
  16185. #else
  16186. "adc r2, %[r]\n\t"
  16187. #endif
  16188. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16189. "lsrs r6, r7, #16\n\t"
  16190. #else
  16191. "lsr r6, r7, #16\n\t"
  16192. #endif
  16193. #ifdef WOLFSSL_KEIL
  16194. "muls r5, r6, r5\n\t"
  16195. #elif defined(__clang__)
  16196. "muls r5, r6\n\t"
  16197. #else
  16198. "mul r5, r6\n\t"
  16199. #endif
  16200. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16201. "lsrs r6, r5, #16\n\t"
  16202. #else
  16203. "lsr r6, r5, #16\n\t"
  16204. #endif
  16205. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16206. "lsls r5, r5, #16\n\t"
  16207. #else
  16208. "lsl r5, r5, #16\n\t"
  16209. #endif
  16210. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16211. "adds r3, r3, r5\n\t"
  16212. #else
  16213. "add r3, r3, r5\n\t"
  16214. #endif
  16215. #ifdef WOLFSSL_KEIL
  16216. "adcs r4, r4, r6\n\t"
  16217. #elif defined(__clang__)
  16218. "adcs r4, r6\n\t"
  16219. #else
  16220. "adc r4, r6\n\t"
  16221. #endif
  16222. #ifdef WOLFSSL_KEIL
  16223. "adcs r2, r2, %[r]\n\t"
  16224. #elif defined(__clang__)
  16225. "adcs r2, %[r]\n\t"
  16226. #else
  16227. "adc r2, %[r]\n\t"
  16228. #endif
  16229. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16230. "adds r3, r3, r5\n\t"
  16231. #else
  16232. "add r3, r3, r5\n\t"
  16233. #endif
  16234. #ifdef WOLFSSL_KEIL
  16235. "adcs r4, r4, r6\n\t"
  16236. #elif defined(__clang__)
  16237. "adcs r4, r6\n\t"
  16238. #else
  16239. "adc r4, r6\n\t"
  16240. #endif
  16241. #ifdef WOLFSSL_KEIL
  16242. "adcs r2, r2, %[r]\n\t"
  16243. #elif defined(__clang__)
  16244. "adcs r2, %[r]\n\t"
  16245. #else
  16246. "adc r2, %[r]\n\t"
  16247. #endif
  16248. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16249. "lsrs r5, %[a], #16\n\t"
  16250. #else
  16251. "lsr r5, %[a], #16\n\t"
  16252. #endif
  16253. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16254. "lsrs r6, r7, #16\n\t"
  16255. #else
  16256. "lsr r6, r7, #16\n\t"
  16257. #endif
  16258. #ifdef WOLFSSL_KEIL
  16259. "muls r6, r5, r6\n\t"
  16260. #elif defined(__clang__)
  16261. "muls r6, r5\n\t"
  16262. #else
  16263. "mul r6, r5\n\t"
  16264. #endif
  16265. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16266. "adds r4, r4, r6\n\t"
  16267. #else
  16268. "add r4, r4, r6\n\t"
  16269. #endif
  16270. #ifdef WOLFSSL_KEIL
  16271. "adcs r2, r2, %[r]\n\t"
  16272. #elif defined(__clang__)
  16273. "adcs r2, %[r]\n\t"
  16274. #else
  16275. "adc r2, %[r]\n\t"
  16276. #endif
  16277. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16278. "adds r4, r4, r6\n\t"
  16279. #else
  16280. "add r4, r4, r6\n\t"
  16281. #endif
  16282. #ifdef WOLFSSL_KEIL
  16283. "adcs r2, r2, %[r]\n\t"
  16284. #elif defined(__clang__)
  16285. "adcs r2, %[r]\n\t"
  16286. #else
  16287. "adc r2, %[r]\n\t"
  16288. #endif
  16289. "uxth r6, r7\n\t"
  16290. #ifdef WOLFSSL_KEIL
  16291. "muls r5, r6, r5\n\t"
  16292. #elif defined(__clang__)
  16293. "muls r5, r6\n\t"
  16294. #else
  16295. "mul r5, r6\n\t"
  16296. #endif
  16297. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16298. "lsrs r6, r5, #16\n\t"
  16299. #else
  16300. "lsr r6, r5, #16\n\t"
  16301. #endif
  16302. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16303. "lsls r5, r5, #16\n\t"
  16304. #else
  16305. "lsl r5, r5, #16\n\t"
  16306. #endif
  16307. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16308. "adds r3, r3, r5\n\t"
  16309. #else
  16310. "add r3, r3, r5\n\t"
  16311. #endif
  16312. #ifdef WOLFSSL_KEIL
  16313. "adcs r4, r4, r6\n\t"
  16314. #elif defined(__clang__)
  16315. "adcs r4, r6\n\t"
  16316. #else
  16317. "adc r4, r6\n\t"
  16318. #endif
  16319. #ifdef WOLFSSL_KEIL
  16320. "adcs r2, r2, %[r]\n\t"
  16321. #elif defined(__clang__)
  16322. "adcs r2, %[r]\n\t"
  16323. #else
  16324. "adc r2, %[r]\n\t"
  16325. #endif
  16326. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16327. "adds r3, r3, r5\n\t"
  16328. #else
  16329. "add r3, r3, r5\n\t"
  16330. #endif
  16331. #ifdef WOLFSSL_KEIL
  16332. "adcs r4, r4, r6\n\t"
  16333. #elif defined(__clang__)
  16334. "adcs r4, r6\n\t"
  16335. #else
  16336. "adc r4, r6\n\t"
  16337. #endif
  16338. #ifdef WOLFSSL_KEIL
  16339. "adcs r2, r2, %[r]\n\t"
  16340. #elif defined(__clang__)
  16341. "adcs r2, %[r]\n\t"
  16342. #else
  16343. "adc r2, %[r]\n\t"
  16344. #endif
  16345. "str r3, [sp, #28]\n\t"
  16346. "# A[7] * A[1]\n\t"
  16347. "movs r3, #0\n\t"
  16348. "mov %[a], r9\n\t"
  16349. "mov r7, r11\n\t"
  16350. "ldr %[a], [%[a], #28]\n\t"
  16351. "uxth r5, %[a]\n\t"
  16352. "uxth r6, r7\n\t"
  16353. #ifdef WOLFSSL_KEIL
  16354. "muls r6, r5, r6\n\t"
  16355. #elif defined(__clang__)
  16356. "muls r6, r5\n\t"
  16357. #else
  16358. "mul r6, r5\n\t"
  16359. #endif
  16360. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16361. "adds r4, r4, r6\n\t"
  16362. #else
  16363. "add r4, r4, r6\n\t"
  16364. #endif
  16365. #ifdef WOLFSSL_KEIL
  16366. "adcs r2, r2, %[r]\n\t"
  16367. #elif defined(__clang__)
  16368. "adcs r2, %[r]\n\t"
  16369. #else
  16370. "adc r2, %[r]\n\t"
  16371. #endif
  16372. #ifdef WOLFSSL_KEIL
  16373. "adcs r3, r3, %[r]\n\t"
  16374. #elif defined(__clang__)
  16375. "adcs r3, %[r]\n\t"
  16376. #else
  16377. "adc r3, %[r]\n\t"
  16378. #endif
  16379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16380. "adds r4, r4, r6\n\t"
  16381. #else
  16382. "add r4, r4, r6\n\t"
  16383. #endif
  16384. #ifdef WOLFSSL_KEIL
  16385. "adcs r2, r2, %[r]\n\t"
  16386. #elif defined(__clang__)
  16387. "adcs r2, %[r]\n\t"
  16388. #else
  16389. "adc r2, %[r]\n\t"
  16390. #endif
  16391. #ifdef WOLFSSL_KEIL
  16392. "adcs r3, r3, %[r]\n\t"
  16393. #elif defined(__clang__)
  16394. "adcs r3, %[r]\n\t"
  16395. #else
  16396. "adc r3, %[r]\n\t"
  16397. #endif
  16398. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16399. "lsrs r6, r7, #16\n\t"
  16400. #else
  16401. "lsr r6, r7, #16\n\t"
  16402. #endif
  16403. #ifdef WOLFSSL_KEIL
  16404. "muls r5, r6, r5\n\t"
  16405. #elif defined(__clang__)
  16406. "muls r5, r6\n\t"
  16407. #else
  16408. "mul r5, r6\n\t"
  16409. #endif
  16410. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16411. "lsrs r6, r5, #16\n\t"
  16412. #else
  16413. "lsr r6, r5, #16\n\t"
  16414. #endif
  16415. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16416. "lsls r5, r5, #16\n\t"
  16417. #else
  16418. "lsl r5, r5, #16\n\t"
  16419. #endif
  16420. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16421. "adds r4, r4, r5\n\t"
  16422. #else
  16423. "add r4, r4, r5\n\t"
  16424. #endif
  16425. #ifdef WOLFSSL_KEIL
  16426. "adcs r2, r2, r6\n\t"
  16427. #elif defined(__clang__)
  16428. "adcs r2, r6\n\t"
  16429. #else
  16430. "adc r2, r6\n\t"
  16431. #endif
  16432. #ifdef WOLFSSL_KEIL
  16433. "adcs r3, r3, %[r]\n\t"
  16434. #elif defined(__clang__)
  16435. "adcs r3, %[r]\n\t"
  16436. #else
  16437. "adc r3, %[r]\n\t"
  16438. #endif
  16439. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16440. "adds r4, r4, r5\n\t"
  16441. #else
  16442. "add r4, r4, r5\n\t"
  16443. #endif
  16444. #ifdef WOLFSSL_KEIL
  16445. "adcs r2, r2, r6\n\t"
  16446. #elif defined(__clang__)
  16447. "adcs r2, r6\n\t"
  16448. #else
  16449. "adc r2, r6\n\t"
  16450. #endif
  16451. #ifdef WOLFSSL_KEIL
  16452. "adcs r3, r3, %[r]\n\t"
  16453. #elif defined(__clang__)
  16454. "adcs r3, %[r]\n\t"
  16455. #else
  16456. "adc r3, %[r]\n\t"
  16457. #endif
  16458. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16459. "lsrs r5, %[a], #16\n\t"
  16460. #else
  16461. "lsr r5, %[a], #16\n\t"
  16462. #endif
  16463. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16464. "lsrs r6, r7, #16\n\t"
  16465. #else
  16466. "lsr r6, r7, #16\n\t"
  16467. #endif
  16468. #ifdef WOLFSSL_KEIL
  16469. "muls r6, r5, r6\n\t"
  16470. #elif defined(__clang__)
  16471. "muls r6, r5\n\t"
  16472. #else
  16473. "mul r6, r5\n\t"
  16474. #endif
  16475. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16476. "adds r2, r2, r6\n\t"
  16477. #else
  16478. "add r2, r2, r6\n\t"
  16479. #endif
  16480. #ifdef WOLFSSL_KEIL
  16481. "adcs r3, r3, %[r]\n\t"
  16482. #elif defined(__clang__)
  16483. "adcs r3, %[r]\n\t"
  16484. #else
  16485. "adc r3, %[r]\n\t"
  16486. #endif
  16487. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16488. "adds r2, r2, r6\n\t"
  16489. #else
  16490. "add r2, r2, r6\n\t"
  16491. #endif
  16492. #ifdef WOLFSSL_KEIL
  16493. "adcs r3, r3, %[r]\n\t"
  16494. #elif defined(__clang__)
  16495. "adcs r3, %[r]\n\t"
  16496. #else
  16497. "adc r3, %[r]\n\t"
  16498. #endif
  16499. "uxth r6, r7\n\t"
  16500. #ifdef WOLFSSL_KEIL
  16501. "muls r5, r6, r5\n\t"
  16502. #elif defined(__clang__)
  16503. "muls r5, r6\n\t"
  16504. #else
  16505. "mul r5, r6\n\t"
  16506. #endif
  16507. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16508. "lsrs r6, r5, #16\n\t"
  16509. #else
  16510. "lsr r6, r5, #16\n\t"
  16511. #endif
  16512. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16513. "lsls r5, r5, #16\n\t"
  16514. #else
  16515. "lsl r5, r5, #16\n\t"
  16516. #endif
  16517. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16518. "adds r4, r4, r5\n\t"
  16519. #else
  16520. "add r4, r4, r5\n\t"
  16521. #endif
  16522. #ifdef WOLFSSL_KEIL
  16523. "adcs r2, r2, r6\n\t"
  16524. #elif defined(__clang__)
  16525. "adcs r2, r6\n\t"
  16526. #else
  16527. "adc r2, r6\n\t"
  16528. #endif
  16529. #ifdef WOLFSSL_KEIL
  16530. "adcs r3, r3, %[r]\n\t"
  16531. #elif defined(__clang__)
  16532. "adcs r3, %[r]\n\t"
  16533. #else
  16534. "adc r3, %[r]\n\t"
  16535. #endif
  16536. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16537. "adds r4, r4, r5\n\t"
  16538. #else
  16539. "add r4, r4, r5\n\t"
  16540. #endif
  16541. #ifdef WOLFSSL_KEIL
  16542. "adcs r2, r2, r6\n\t"
  16543. #elif defined(__clang__)
  16544. "adcs r2, r6\n\t"
  16545. #else
  16546. "adc r2, r6\n\t"
  16547. #endif
  16548. #ifdef WOLFSSL_KEIL
  16549. "adcs r3, r3, %[r]\n\t"
  16550. #elif defined(__clang__)
  16551. "adcs r3, %[r]\n\t"
  16552. #else
  16553. "adc r3, %[r]\n\t"
  16554. #endif
  16555. "# A[6] * A[2]\n\t"
  16556. "mov %[a], r9\n\t"
  16557. "mov r7, r12\n\t"
  16558. "ldr %[a], [%[a], #24]\n\t"
  16559. "uxth r5, %[a]\n\t"
  16560. "uxth r6, r7\n\t"
  16561. #ifdef WOLFSSL_KEIL
  16562. "muls r6, r5, r6\n\t"
  16563. #elif defined(__clang__)
  16564. "muls r6, r5\n\t"
  16565. #else
  16566. "mul r6, r5\n\t"
  16567. #endif
  16568. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16569. "adds r4, r4, r6\n\t"
  16570. #else
  16571. "add r4, r4, r6\n\t"
  16572. #endif
  16573. #ifdef WOLFSSL_KEIL
  16574. "adcs r2, r2, %[r]\n\t"
  16575. #elif defined(__clang__)
  16576. "adcs r2, %[r]\n\t"
  16577. #else
  16578. "adc r2, %[r]\n\t"
  16579. #endif
  16580. #ifdef WOLFSSL_KEIL
  16581. "adcs r3, r3, %[r]\n\t"
  16582. #elif defined(__clang__)
  16583. "adcs r3, %[r]\n\t"
  16584. #else
  16585. "adc r3, %[r]\n\t"
  16586. #endif
  16587. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16588. "adds r4, r4, r6\n\t"
  16589. #else
  16590. "add r4, r4, r6\n\t"
  16591. #endif
  16592. #ifdef WOLFSSL_KEIL
  16593. "adcs r2, r2, %[r]\n\t"
  16594. #elif defined(__clang__)
  16595. "adcs r2, %[r]\n\t"
  16596. #else
  16597. "adc r2, %[r]\n\t"
  16598. #endif
  16599. #ifdef WOLFSSL_KEIL
  16600. "adcs r3, r3, %[r]\n\t"
  16601. #elif defined(__clang__)
  16602. "adcs r3, %[r]\n\t"
  16603. #else
  16604. "adc r3, %[r]\n\t"
  16605. #endif
  16606. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16607. "lsrs r6, r7, #16\n\t"
  16608. #else
  16609. "lsr r6, r7, #16\n\t"
  16610. #endif
  16611. #ifdef WOLFSSL_KEIL
  16612. "muls r5, r6, r5\n\t"
  16613. #elif defined(__clang__)
  16614. "muls r5, r6\n\t"
  16615. #else
  16616. "mul r5, r6\n\t"
  16617. #endif
  16618. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16619. "lsrs r6, r5, #16\n\t"
  16620. #else
  16621. "lsr r6, r5, #16\n\t"
  16622. #endif
  16623. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16624. "lsls r5, r5, #16\n\t"
  16625. #else
  16626. "lsl r5, r5, #16\n\t"
  16627. #endif
  16628. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16629. "adds r4, r4, r5\n\t"
  16630. #else
  16631. "add r4, r4, r5\n\t"
  16632. #endif
  16633. #ifdef WOLFSSL_KEIL
  16634. "adcs r2, r2, r6\n\t"
  16635. #elif defined(__clang__)
  16636. "adcs r2, r6\n\t"
  16637. #else
  16638. "adc r2, r6\n\t"
  16639. #endif
  16640. #ifdef WOLFSSL_KEIL
  16641. "adcs r3, r3, %[r]\n\t"
  16642. #elif defined(__clang__)
  16643. "adcs r3, %[r]\n\t"
  16644. #else
  16645. "adc r3, %[r]\n\t"
  16646. #endif
  16647. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16648. "adds r4, r4, r5\n\t"
  16649. #else
  16650. "add r4, r4, r5\n\t"
  16651. #endif
  16652. #ifdef WOLFSSL_KEIL
  16653. "adcs r2, r2, r6\n\t"
  16654. #elif defined(__clang__)
  16655. "adcs r2, r6\n\t"
  16656. #else
  16657. "adc r2, r6\n\t"
  16658. #endif
  16659. #ifdef WOLFSSL_KEIL
  16660. "adcs r3, r3, %[r]\n\t"
  16661. #elif defined(__clang__)
  16662. "adcs r3, %[r]\n\t"
  16663. #else
  16664. "adc r3, %[r]\n\t"
  16665. #endif
  16666. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16667. "lsrs r5, %[a], #16\n\t"
  16668. #else
  16669. "lsr r5, %[a], #16\n\t"
  16670. #endif
  16671. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16672. "lsrs r6, r7, #16\n\t"
  16673. #else
  16674. "lsr r6, r7, #16\n\t"
  16675. #endif
  16676. #ifdef WOLFSSL_KEIL
  16677. "muls r6, r5, r6\n\t"
  16678. #elif defined(__clang__)
  16679. "muls r6, r5\n\t"
  16680. #else
  16681. "mul r6, r5\n\t"
  16682. #endif
  16683. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16684. "adds r2, r2, r6\n\t"
  16685. #else
  16686. "add r2, r2, r6\n\t"
  16687. #endif
  16688. #ifdef WOLFSSL_KEIL
  16689. "adcs r3, r3, %[r]\n\t"
  16690. #elif defined(__clang__)
  16691. "adcs r3, %[r]\n\t"
  16692. #else
  16693. "adc r3, %[r]\n\t"
  16694. #endif
  16695. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16696. "adds r2, r2, r6\n\t"
  16697. #else
  16698. "add r2, r2, r6\n\t"
  16699. #endif
  16700. #ifdef WOLFSSL_KEIL
  16701. "adcs r3, r3, %[r]\n\t"
  16702. #elif defined(__clang__)
  16703. "adcs r3, %[r]\n\t"
  16704. #else
  16705. "adc r3, %[r]\n\t"
  16706. #endif
  16707. "uxth r6, r7\n\t"
  16708. #ifdef WOLFSSL_KEIL
  16709. "muls r5, r6, r5\n\t"
  16710. #elif defined(__clang__)
  16711. "muls r5, r6\n\t"
  16712. #else
  16713. "mul r5, r6\n\t"
  16714. #endif
  16715. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16716. "lsrs r6, r5, #16\n\t"
  16717. #else
  16718. "lsr r6, r5, #16\n\t"
  16719. #endif
  16720. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16721. "lsls r5, r5, #16\n\t"
  16722. #else
  16723. "lsl r5, r5, #16\n\t"
  16724. #endif
  16725. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16726. "adds r4, r4, r5\n\t"
  16727. #else
  16728. "add r4, r4, r5\n\t"
  16729. #endif
  16730. #ifdef WOLFSSL_KEIL
  16731. "adcs r2, r2, r6\n\t"
  16732. #elif defined(__clang__)
  16733. "adcs r2, r6\n\t"
  16734. #else
  16735. "adc r2, r6\n\t"
  16736. #endif
  16737. #ifdef WOLFSSL_KEIL
  16738. "adcs r3, r3, %[r]\n\t"
  16739. #elif defined(__clang__)
  16740. "adcs r3, %[r]\n\t"
  16741. #else
  16742. "adc r3, %[r]\n\t"
  16743. #endif
  16744. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16745. "adds r4, r4, r5\n\t"
  16746. #else
  16747. "add r4, r4, r5\n\t"
  16748. #endif
  16749. #ifdef WOLFSSL_KEIL
  16750. "adcs r2, r2, r6\n\t"
  16751. #elif defined(__clang__)
  16752. "adcs r2, r6\n\t"
  16753. #else
  16754. "adc r2, r6\n\t"
  16755. #endif
  16756. #ifdef WOLFSSL_KEIL
  16757. "adcs r3, r3, %[r]\n\t"
  16758. #elif defined(__clang__)
  16759. "adcs r3, %[r]\n\t"
  16760. #else
  16761. "adc r3, %[r]\n\t"
  16762. #endif
  16763. "# A[5] * A[3]\n\t"
  16764. "mov %[a], r9\n\t"
  16765. "mov r7, lr\n\t"
  16766. "ldr %[a], [%[a], #20]\n\t"
  16767. "uxth r5, %[a]\n\t"
  16768. "uxth r6, r7\n\t"
  16769. #ifdef WOLFSSL_KEIL
  16770. "muls r6, r5, r6\n\t"
  16771. #elif defined(__clang__)
  16772. "muls r6, r5\n\t"
  16773. #else
  16774. "mul r6, r5\n\t"
  16775. #endif
  16776. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16777. "adds r4, r4, r6\n\t"
  16778. #else
  16779. "add r4, r4, r6\n\t"
  16780. #endif
  16781. #ifdef WOLFSSL_KEIL
  16782. "adcs r2, r2, %[r]\n\t"
  16783. #elif defined(__clang__)
  16784. "adcs r2, %[r]\n\t"
  16785. #else
  16786. "adc r2, %[r]\n\t"
  16787. #endif
  16788. #ifdef WOLFSSL_KEIL
  16789. "adcs r3, r3, %[r]\n\t"
  16790. #elif defined(__clang__)
  16791. "adcs r3, %[r]\n\t"
  16792. #else
  16793. "adc r3, %[r]\n\t"
  16794. #endif
  16795. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16796. "adds r4, r4, r6\n\t"
  16797. #else
  16798. "add r4, r4, r6\n\t"
  16799. #endif
  16800. #ifdef WOLFSSL_KEIL
  16801. "adcs r2, r2, %[r]\n\t"
  16802. #elif defined(__clang__)
  16803. "adcs r2, %[r]\n\t"
  16804. #else
  16805. "adc r2, %[r]\n\t"
  16806. #endif
  16807. #ifdef WOLFSSL_KEIL
  16808. "adcs r3, r3, %[r]\n\t"
  16809. #elif defined(__clang__)
  16810. "adcs r3, %[r]\n\t"
  16811. #else
  16812. "adc r3, %[r]\n\t"
  16813. #endif
  16814. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16815. "lsrs r6, r7, #16\n\t"
  16816. #else
  16817. "lsr r6, r7, #16\n\t"
  16818. #endif
  16819. #ifdef WOLFSSL_KEIL
  16820. "muls r5, r6, r5\n\t"
  16821. #elif defined(__clang__)
  16822. "muls r5, r6\n\t"
  16823. #else
  16824. "mul r5, r6\n\t"
  16825. #endif
  16826. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16827. "lsrs r6, r5, #16\n\t"
  16828. #else
  16829. "lsr r6, r5, #16\n\t"
  16830. #endif
  16831. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16832. "lsls r5, r5, #16\n\t"
  16833. #else
  16834. "lsl r5, r5, #16\n\t"
  16835. #endif
  16836. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16837. "adds r4, r4, r5\n\t"
  16838. #else
  16839. "add r4, r4, r5\n\t"
  16840. #endif
  16841. #ifdef WOLFSSL_KEIL
  16842. "adcs r2, r2, r6\n\t"
  16843. #elif defined(__clang__)
  16844. "adcs r2, r6\n\t"
  16845. #else
  16846. "adc r2, r6\n\t"
  16847. #endif
  16848. #ifdef WOLFSSL_KEIL
  16849. "adcs r3, r3, %[r]\n\t"
  16850. #elif defined(__clang__)
  16851. "adcs r3, %[r]\n\t"
  16852. #else
  16853. "adc r3, %[r]\n\t"
  16854. #endif
  16855. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16856. "adds r4, r4, r5\n\t"
  16857. #else
  16858. "add r4, r4, r5\n\t"
  16859. #endif
  16860. #ifdef WOLFSSL_KEIL
  16861. "adcs r2, r2, r6\n\t"
  16862. #elif defined(__clang__)
  16863. "adcs r2, r6\n\t"
  16864. #else
  16865. "adc r2, r6\n\t"
  16866. #endif
  16867. #ifdef WOLFSSL_KEIL
  16868. "adcs r3, r3, %[r]\n\t"
  16869. #elif defined(__clang__)
  16870. "adcs r3, %[r]\n\t"
  16871. #else
  16872. "adc r3, %[r]\n\t"
  16873. #endif
  16874. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16875. "lsrs r5, %[a], #16\n\t"
  16876. #else
  16877. "lsr r5, %[a], #16\n\t"
  16878. #endif
  16879. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16880. "lsrs r6, r7, #16\n\t"
  16881. #else
  16882. "lsr r6, r7, #16\n\t"
  16883. #endif
  16884. #ifdef WOLFSSL_KEIL
  16885. "muls r6, r5, r6\n\t"
  16886. #elif defined(__clang__)
  16887. "muls r6, r5\n\t"
  16888. #else
  16889. "mul r6, r5\n\t"
  16890. #endif
  16891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16892. "adds r2, r2, r6\n\t"
  16893. #else
  16894. "add r2, r2, r6\n\t"
  16895. #endif
  16896. #ifdef WOLFSSL_KEIL
  16897. "adcs r3, r3, %[r]\n\t"
  16898. #elif defined(__clang__)
  16899. "adcs r3, %[r]\n\t"
  16900. #else
  16901. "adc r3, %[r]\n\t"
  16902. #endif
  16903. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16904. "adds r2, r2, r6\n\t"
  16905. #else
  16906. "add r2, r2, r6\n\t"
  16907. #endif
  16908. #ifdef WOLFSSL_KEIL
  16909. "adcs r3, r3, %[r]\n\t"
  16910. #elif defined(__clang__)
  16911. "adcs r3, %[r]\n\t"
  16912. #else
  16913. "adc r3, %[r]\n\t"
  16914. #endif
  16915. "uxth r6, r7\n\t"
  16916. #ifdef WOLFSSL_KEIL
  16917. "muls r5, r6, r5\n\t"
  16918. #elif defined(__clang__)
  16919. "muls r5, r6\n\t"
  16920. #else
  16921. "mul r5, r6\n\t"
  16922. #endif
  16923. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16924. "lsrs r6, r5, #16\n\t"
  16925. #else
  16926. "lsr r6, r5, #16\n\t"
  16927. #endif
  16928. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16929. "lsls r5, r5, #16\n\t"
  16930. #else
  16931. "lsl r5, r5, #16\n\t"
  16932. #endif
  16933. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16934. "adds r4, r4, r5\n\t"
  16935. #else
  16936. "add r4, r4, r5\n\t"
  16937. #endif
  16938. #ifdef WOLFSSL_KEIL
  16939. "adcs r2, r2, r6\n\t"
  16940. #elif defined(__clang__)
  16941. "adcs r2, r6\n\t"
  16942. #else
  16943. "adc r2, r6\n\t"
  16944. #endif
  16945. #ifdef WOLFSSL_KEIL
  16946. "adcs r3, r3, %[r]\n\t"
  16947. #elif defined(__clang__)
  16948. "adcs r3, %[r]\n\t"
  16949. #else
  16950. "adc r3, %[r]\n\t"
  16951. #endif
  16952. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16953. "adds r4, r4, r5\n\t"
  16954. #else
  16955. "add r4, r4, r5\n\t"
  16956. #endif
  16957. #ifdef WOLFSSL_KEIL
  16958. "adcs r2, r2, r6\n\t"
  16959. #elif defined(__clang__)
  16960. "adcs r2, r6\n\t"
  16961. #else
  16962. "adc r2, r6\n\t"
  16963. #endif
  16964. #ifdef WOLFSSL_KEIL
  16965. "adcs r3, r3, %[r]\n\t"
  16966. #elif defined(__clang__)
  16967. "adcs r3, %[r]\n\t"
  16968. #else
  16969. "adc r3, %[r]\n\t"
  16970. #endif
  16971. "# A[4] * A[4]\n\t"
  16972. "mov %[a], r9\n\t"
  16973. "ldr r7, [%[a], #16]\n\t"
  16974. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16975. "lsrs r6, r7, #16\n\t"
  16976. #else
  16977. "lsr r6, r7, #16\n\t"
  16978. #endif
  16979. "uxth r5, r7\n\t"
  16980. #ifdef WOLFSSL_KEIL
  16981. "muls r5, r5, r5\n\t"
  16982. #elif defined(__clang__)
  16983. "muls r5, r5\n\t"
  16984. #else
  16985. "mul r5, r5\n\t"
  16986. #endif
  16987. #ifdef WOLFSSL_KEIL
  16988. "muls r6, r6, r6\n\t"
  16989. #elif defined(__clang__)
  16990. "muls r6, r6\n\t"
  16991. #else
  16992. "mul r6, r6\n\t"
  16993. #endif
  16994. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16995. "adds r4, r4, r5\n\t"
  16996. #else
  16997. "add r4, r4, r5\n\t"
  16998. #endif
  16999. #ifdef WOLFSSL_KEIL
  17000. "adcs r2, r2, r6\n\t"
  17001. #elif defined(__clang__)
  17002. "adcs r2, r6\n\t"
  17003. #else
  17004. "adc r2, r6\n\t"
  17005. #endif
  17006. #ifdef WOLFSSL_KEIL
  17007. "adcs r3, r3, %[r]\n\t"
  17008. #elif defined(__clang__)
  17009. "adcs r3, %[r]\n\t"
  17010. #else
  17011. "adc r3, %[r]\n\t"
  17012. #endif
  17013. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17014. "lsrs r6, r7, #16\n\t"
  17015. #else
  17016. "lsr r6, r7, #16\n\t"
  17017. #endif
  17018. "uxth r5, r7\n\t"
  17019. #ifdef WOLFSSL_KEIL
  17020. "muls r5, r6, r5\n\t"
  17021. #elif defined(__clang__)
  17022. "muls r5, r6\n\t"
  17023. #else
  17024. "mul r5, r6\n\t"
  17025. #endif
  17026. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17027. "lsrs r6, r5, #15\n\t"
  17028. #else
  17029. "lsr r6, r5, #15\n\t"
  17030. #endif
  17031. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17032. "lsls r5, r5, #17\n\t"
  17033. #else
  17034. "lsl r5, r5, #17\n\t"
  17035. #endif
  17036. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17037. "adds r4, r4, r5\n\t"
  17038. #else
  17039. "add r4, r4, r5\n\t"
  17040. #endif
  17041. #ifdef WOLFSSL_KEIL
  17042. "adcs r2, r2, r6\n\t"
  17043. #elif defined(__clang__)
  17044. "adcs r2, r6\n\t"
  17045. #else
  17046. "adc r2, r6\n\t"
  17047. #endif
  17048. #ifdef WOLFSSL_KEIL
  17049. "adcs r3, r3, %[r]\n\t"
  17050. #elif defined(__clang__)
  17051. "adcs r3, %[r]\n\t"
  17052. #else
  17053. "adc r3, %[r]\n\t"
  17054. #endif
  17055. "mov %[r], r8\n\t"
  17056. "str r4, [%[r], #32]\n\t"
  17057. "movs %[r], #0\n\t"
  17058. "movs %[a], #16\n\t"
  17059. "add %[a], %[a], r9\n\t"
  17060. "ldm %[a]!, {r5, r6}\n\t"
  17061. "mov r10, r5\n\t"
  17062. "mov r11, r6\n\t"
  17063. "ldm %[a]!, {r5, r6}\n\t"
  17064. "mov r12, r5\n\t"
  17065. "mov lr, r6\n\t"
  17066. "mov %[a], r9\n\t"
  17067. "# A[5] * A[4]\n\t"
  17068. "movs r4, #0\n\t"
  17069. "mov %[a], r11\n\t"
  17070. "uxth r5, %[a]\n\t"
  17071. "uxth r6, r7\n\t"
  17072. #ifdef WOLFSSL_KEIL
  17073. "muls r6, r5, r6\n\t"
  17074. #elif defined(__clang__)
  17075. "muls r6, r5\n\t"
  17076. #else
  17077. "mul r6, r5\n\t"
  17078. #endif
  17079. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17080. "adds r2, r2, r6\n\t"
  17081. #else
  17082. "add r2, r2, r6\n\t"
  17083. #endif
  17084. #ifdef WOLFSSL_KEIL
  17085. "adcs r3, r3, %[r]\n\t"
  17086. #elif defined(__clang__)
  17087. "adcs r3, %[r]\n\t"
  17088. #else
  17089. "adc r3, %[r]\n\t"
  17090. #endif
  17091. #ifdef WOLFSSL_KEIL
  17092. "adcs r4, r4, %[r]\n\t"
  17093. #elif defined(__clang__)
  17094. "adcs r4, %[r]\n\t"
  17095. #else
  17096. "adc r4, %[r]\n\t"
  17097. #endif
  17098. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17099. "adds r2, r2, r6\n\t"
  17100. #else
  17101. "add r2, r2, r6\n\t"
  17102. #endif
  17103. #ifdef WOLFSSL_KEIL
  17104. "adcs r3, r3, %[r]\n\t"
  17105. #elif defined(__clang__)
  17106. "adcs r3, %[r]\n\t"
  17107. #else
  17108. "adc r3, %[r]\n\t"
  17109. #endif
  17110. #ifdef WOLFSSL_KEIL
  17111. "adcs r4, r4, %[r]\n\t"
  17112. #elif defined(__clang__)
  17113. "adcs r4, %[r]\n\t"
  17114. #else
  17115. "adc r4, %[r]\n\t"
  17116. #endif
  17117. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17118. "lsrs r6, r7, #16\n\t"
  17119. #else
  17120. "lsr r6, r7, #16\n\t"
  17121. #endif
  17122. #ifdef WOLFSSL_KEIL
  17123. "muls r5, r6, r5\n\t"
  17124. #elif defined(__clang__)
  17125. "muls r5, r6\n\t"
  17126. #else
  17127. "mul r5, r6\n\t"
  17128. #endif
  17129. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17130. "lsrs r6, r5, #16\n\t"
  17131. #else
  17132. "lsr r6, r5, #16\n\t"
  17133. #endif
  17134. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17135. "lsls r5, r5, #16\n\t"
  17136. #else
  17137. "lsl r5, r5, #16\n\t"
  17138. #endif
  17139. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17140. "adds r2, r2, r5\n\t"
  17141. #else
  17142. "add r2, r2, r5\n\t"
  17143. #endif
  17144. #ifdef WOLFSSL_KEIL
  17145. "adcs r3, r3, r6\n\t"
  17146. #elif defined(__clang__)
  17147. "adcs r3, r6\n\t"
  17148. #else
  17149. "adc r3, r6\n\t"
  17150. #endif
  17151. #ifdef WOLFSSL_KEIL
  17152. "adcs r4, r4, %[r]\n\t"
  17153. #elif defined(__clang__)
  17154. "adcs r4, %[r]\n\t"
  17155. #else
  17156. "adc r4, %[r]\n\t"
  17157. #endif
  17158. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17159. "adds r2, r2, r5\n\t"
  17160. #else
  17161. "add r2, r2, r5\n\t"
  17162. #endif
  17163. #ifdef WOLFSSL_KEIL
  17164. "adcs r3, r3, r6\n\t"
  17165. #elif defined(__clang__)
  17166. "adcs r3, r6\n\t"
  17167. #else
  17168. "adc r3, r6\n\t"
  17169. #endif
  17170. #ifdef WOLFSSL_KEIL
  17171. "adcs r4, r4, %[r]\n\t"
  17172. #elif defined(__clang__)
  17173. "adcs r4, %[r]\n\t"
  17174. #else
  17175. "adc r4, %[r]\n\t"
  17176. #endif
  17177. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17178. "lsrs r5, %[a], #16\n\t"
  17179. #else
  17180. "lsr r5, %[a], #16\n\t"
  17181. #endif
  17182. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17183. "lsrs r6, r7, #16\n\t"
  17184. #else
  17185. "lsr r6, r7, #16\n\t"
  17186. #endif
  17187. #ifdef WOLFSSL_KEIL
  17188. "muls r6, r5, r6\n\t"
  17189. #elif defined(__clang__)
  17190. "muls r6, r5\n\t"
  17191. #else
  17192. "mul r6, r5\n\t"
  17193. #endif
  17194. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17195. "adds r3, r3, r6\n\t"
  17196. #else
  17197. "add r3, r3, r6\n\t"
  17198. #endif
  17199. #ifdef WOLFSSL_KEIL
  17200. "adcs r4, r4, %[r]\n\t"
  17201. #elif defined(__clang__)
  17202. "adcs r4, %[r]\n\t"
  17203. #else
  17204. "adc r4, %[r]\n\t"
  17205. #endif
  17206. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17207. "adds r3, r3, r6\n\t"
  17208. #else
  17209. "add r3, r3, r6\n\t"
  17210. #endif
  17211. #ifdef WOLFSSL_KEIL
  17212. "adcs r4, r4, %[r]\n\t"
  17213. #elif defined(__clang__)
  17214. "adcs r4, %[r]\n\t"
  17215. #else
  17216. "adc r4, %[r]\n\t"
  17217. #endif
  17218. "uxth r6, r7\n\t"
  17219. #ifdef WOLFSSL_KEIL
  17220. "muls r5, r6, r5\n\t"
  17221. #elif defined(__clang__)
  17222. "muls r5, r6\n\t"
  17223. #else
  17224. "mul r5, r6\n\t"
  17225. #endif
  17226. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17227. "lsrs r6, r5, #16\n\t"
  17228. #else
  17229. "lsr r6, r5, #16\n\t"
  17230. #endif
  17231. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17232. "lsls r5, r5, #16\n\t"
  17233. #else
  17234. "lsl r5, r5, #16\n\t"
  17235. #endif
  17236. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17237. "adds r2, r2, r5\n\t"
  17238. #else
  17239. "add r2, r2, r5\n\t"
  17240. #endif
  17241. #ifdef WOLFSSL_KEIL
  17242. "adcs r3, r3, r6\n\t"
  17243. #elif defined(__clang__)
  17244. "adcs r3, r6\n\t"
  17245. #else
  17246. "adc r3, r6\n\t"
  17247. #endif
  17248. #ifdef WOLFSSL_KEIL
  17249. "adcs r4, r4, %[r]\n\t"
  17250. #elif defined(__clang__)
  17251. "adcs r4, %[r]\n\t"
  17252. #else
  17253. "adc r4, %[r]\n\t"
  17254. #endif
  17255. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17256. "adds r2, r2, r5\n\t"
  17257. #else
  17258. "add r2, r2, r5\n\t"
  17259. #endif
  17260. #ifdef WOLFSSL_KEIL
  17261. "adcs r3, r3, r6\n\t"
  17262. #elif defined(__clang__)
  17263. "adcs r3, r6\n\t"
  17264. #else
  17265. "adc r3, r6\n\t"
  17266. #endif
  17267. #ifdef WOLFSSL_KEIL
  17268. "adcs r4, r4, %[r]\n\t"
  17269. #elif defined(__clang__)
  17270. "adcs r4, %[r]\n\t"
  17271. #else
  17272. "adc r4, %[r]\n\t"
  17273. #endif
  17274. "# A[6] * A[3]\n\t"
  17275. "mov %[a], r9\n\t"
  17276. "ldr r7, [%[a], #12]\n\t"
  17277. "mov %[a], r12\n\t"
  17278. "uxth r5, %[a]\n\t"
  17279. "uxth r6, r7\n\t"
  17280. #ifdef WOLFSSL_KEIL
  17281. "muls r6, r5, r6\n\t"
  17282. #elif defined(__clang__)
  17283. "muls r6, r5\n\t"
  17284. #else
  17285. "mul r6, r5\n\t"
  17286. #endif
  17287. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17288. "adds r2, r2, r6\n\t"
  17289. #else
  17290. "add r2, r2, r6\n\t"
  17291. #endif
  17292. #ifdef WOLFSSL_KEIL
  17293. "adcs r3, r3, %[r]\n\t"
  17294. #elif defined(__clang__)
  17295. "adcs r3, %[r]\n\t"
  17296. #else
  17297. "adc r3, %[r]\n\t"
  17298. #endif
  17299. #ifdef WOLFSSL_KEIL
  17300. "adcs r4, r4, %[r]\n\t"
  17301. #elif defined(__clang__)
  17302. "adcs r4, %[r]\n\t"
  17303. #else
  17304. "adc r4, %[r]\n\t"
  17305. #endif
  17306. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17307. "adds r2, r2, r6\n\t"
  17308. #else
  17309. "add r2, r2, r6\n\t"
  17310. #endif
  17311. #ifdef WOLFSSL_KEIL
  17312. "adcs r3, r3, %[r]\n\t"
  17313. #elif defined(__clang__)
  17314. "adcs r3, %[r]\n\t"
  17315. #else
  17316. "adc r3, %[r]\n\t"
  17317. #endif
  17318. #ifdef WOLFSSL_KEIL
  17319. "adcs r4, r4, %[r]\n\t"
  17320. #elif defined(__clang__)
  17321. "adcs r4, %[r]\n\t"
  17322. #else
  17323. "adc r4, %[r]\n\t"
  17324. #endif
  17325. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17326. "lsrs r6, r7, #16\n\t"
  17327. #else
  17328. "lsr r6, r7, #16\n\t"
  17329. #endif
  17330. #ifdef WOLFSSL_KEIL
  17331. "muls r5, r6, r5\n\t"
  17332. #elif defined(__clang__)
  17333. "muls r5, r6\n\t"
  17334. #else
  17335. "mul r5, r6\n\t"
  17336. #endif
  17337. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17338. "lsrs r6, r5, #16\n\t"
  17339. #else
  17340. "lsr r6, r5, #16\n\t"
  17341. #endif
  17342. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17343. "lsls r5, r5, #16\n\t"
  17344. #else
  17345. "lsl r5, r5, #16\n\t"
  17346. #endif
  17347. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17348. "adds r2, r2, r5\n\t"
  17349. #else
  17350. "add r2, r2, r5\n\t"
  17351. #endif
  17352. #ifdef WOLFSSL_KEIL
  17353. "adcs r3, r3, r6\n\t"
  17354. #elif defined(__clang__)
  17355. "adcs r3, r6\n\t"
  17356. #else
  17357. "adc r3, r6\n\t"
  17358. #endif
  17359. #ifdef WOLFSSL_KEIL
  17360. "adcs r4, r4, %[r]\n\t"
  17361. #elif defined(__clang__)
  17362. "adcs r4, %[r]\n\t"
  17363. #else
  17364. "adc r4, %[r]\n\t"
  17365. #endif
  17366. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17367. "adds r2, r2, r5\n\t"
  17368. #else
  17369. "add r2, r2, r5\n\t"
  17370. #endif
  17371. #ifdef WOLFSSL_KEIL
  17372. "adcs r3, r3, r6\n\t"
  17373. #elif defined(__clang__)
  17374. "adcs r3, r6\n\t"
  17375. #else
  17376. "adc r3, r6\n\t"
  17377. #endif
  17378. #ifdef WOLFSSL_KEIL
  17379. "adcs r4, r4, %[r]\n\t"
  17380. #elif defined(__clang__)
  17381. "adcs r4, %[r]\n\t"
  17382. #else
  17383. "adc r4, %[r]\n\t"
  17384. #endif
  17385. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17386. "lsrs r5, %[a], #16\n\t"
  17387. #else
  17388. "lsr r5, %[a], #16\n\t"
  17389. #endif
  17390. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17391. "lsrs r6, r7, #16\n\t"
  17392. #else
  17393. "lsr r6, r7, #16\n\t"
  17394. #endif
  17395. #ifdef WOLFSSL_KEIL
  17396. "muls r6, r5, r6\n\t"
  17397. #elif defined(__clang__)
  17398. "muls r6, r5\n\t"
  17399. #else
  17400. "mul r6, r5\n\t"
  17401. #endif
  17402. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17403. "adds r3, r3, r6\n\t"
  17404. #else
  17405. "add r3, r3, r6\n\t"
  17406. #endif
  17407. #ifdef WOLFSSL_KEIL
  17408. "adcs r4, r4, %[r]\n\t"
  17409. #elif defined(__clang__)
  17410. "adcs r4, %[r]\n\t"
  17411. #else
  17412. "adc r4, %[r]\n\t"
  17413. #endif
  17414. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17415. "adds r3, r3, r6\n\t"
  17416. #else
  17417. "add r3, r3, r6\n\t"
  17418. #endif
  17419. #ifdef WOLFSSL_KEIL
  17420. "adcs r4, r4, %[r]\n\t"
  17421. #elif defined(__clang__)
  17422. "adcs r4, %[r]\n\t"
  17423. #else
  17424. "adc r4, %[r]\n\t"
  17425. #endif
  17426. "uxth r6, r7\n\t"
  17427. #ifdef WOLFSSL_KEIL
  17428. "muls r5, r6, r5\n\t"
  17429. #elif defined(__clang__)
  17430. "muls r5, r6\n\t"
  17431. #else
  17432. "mul r5, r6\n\t"
  17433. #endif
  17434. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17435. "lsrs r6, r5, #16\n\t"
  17436. #else
  17437. "lsr r6, r5, #16\n\t"
  17438. #endif
  17439. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17440. "lsls r5, r5, #16\n\t"
  17441. #else
  17442. "lsl r5, r5, #16\n\t"
  17443. #endif
  17444. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17445. "adds r2, r2, r5\n\t"
  17446. #else
  17447. "add r2, r2, r5\n\t"
  17448. #endif
  17449. #ifdef WOLFSSL_KEIL
  17450. "adcs r3, r3, r6\n\t"
  17451. #elif defined(__clang__)
  17452. "adcs r3, r6\n\t"
  17453. #else
  17454. "adc r3, r6\n\t"
  17455. #endif
  17456. #ifdef WOLFSSL_KEIL
  17457. "adcs r4, r4, %[r]\n\t"
  17458. #elif defined(__clang__)
  17459. "adcs r4, %[r]\n\t"
  17460. #else
  17461. "adc r4, %[r]\n\t"
  17462. #endif
  17463. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17464. "adds r2, r2, r5\n\t"
  17465. #else
  17466. "add r2, r2, r5\n\t"
  17467. #endif
  17468. #ifdef WOLFSSL_KEIL
  17469. "adcs r3, r3, r6\n\t"
  17470. #elif defined(__clang__)
  17471. "adcs r3, r6\n\t"
  17472. #else
  17473. "adc r3, r6\n\t"
  17474. #endif
  17475. #ifdef WOLFSSL_KEIL
  17476. "adcs r4, r4, %[r]\n\t"
  17477. #elif defined(__clang__)
  17478. "adcs r4, %[r]\n\t"
  17479. #else
  17480. "adc r4, %[r]\n\t"
  17481. #endif
  17482. "# A[7] * A[2]\n\t"
  17483. "mov %[a], r9\n\t"
  17484. "ldr r7, [%[a], #8]\n\t"
  17485. "mov %[a], lr\n\t"
  17486. "uxth r5, %[a]\n\t"
  17487. "uxth r6, r7\n\t"
  17488. #ifdef WOLFSSL_KEIL
  17489. "muls r6, r5, r6\n\t"
  17490. #elif defined(__clang__)
  17491. "muls r6, r5\n\t"
  17492. #else
  17493. "mul r6, r5\n\t"
  17494. #endif
  17495. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17496. "adds r2, r2, r6\n\t"
  17497. #else
  17498. "add r2, r2, r6\n\t"
  17499. #endif
  17500. #ifdef WOLFSSL_KEIL
  17501. "adcs r3, r3, %[r]\n\t"
  17502. #elif defined(__clang__)
  17503. "adcs r3, %[r]\n\t"
  17504. #else
  17505. "adc r3, %[r]\n\t"
  17506. #endif
  17507. #ifdef WOLFSSL_KEIL
  17508. "adcs r4, r4, %[r]\n\t"
  17509. #elif defined(__clang__)
  17510. "adcs r4, %[r]\n\t"
  17511. #else
  17512. "adc r4, %[r]\n\t"
  17513. #endif
  17514. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17515. "adds r2, r2, r6\n\t"
  17516. #else
  17517. "add r2, r2, r6\n\t"
  17518. #endif
  17519. #ifdef WOLFSSL_KEIL
  17520. "adcs r3, r3, %[r]\n\t"
  17521. #elif defined(__clang__)
  17522. "adcs r3, %[r]\n\t"
  17523. #else
  17524. "adc r3, %[r]\n\t"
  17525. #endif
  17526. #ifdef WOLFSSL_KEIL
  17527. "adcs r4, r4, %[r]\n\t"
  17528. #elif defined(__clang__)
  17529. "adcs r4, %[r]\n\t"
  17530. #else
  17531. "adc r4, %[r]\n\t"
  17532. #endif
  17533. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17534. "lsrs r6, r7, #16\n\t"
  17535. #else
  17536. "lsr r6, r7, #16\n\t"
  17537. #endif
  17538. #ifdef WOLFSSL_KEIL
  17539. "muls r5, r6, r5\n\t"
  17540. #elif defined(__clang__)
  17541. "muls r5, r6\n\t"
  17542. #else
  17543. "mul r5, r6\n\t"
  17544. #endif
  17545. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17546. "lsrs r6, r5, #16\n\t"
  17547. #else
  17548. "lsr r6, r5, #16\n\t"
  17549. #endif
  17550. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17551. "lsls r5, r5, #16\n\t"
  17552. #else
  17553. "lsl r5, r5, #16\n\t"
  17554. #endif
  17555. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17556. "adds r2, r2, r5\n\t"
  17557. #else
  17558. "add r2, r2, r5\n\t"
  17559. #endif
  17560. #ifdef WOLFSSL_KEIL
  17561. "adcs r3, r3, r6\n\t"
  17562. #elif defined(__clang__)
  17563. "adcs r3, r6\n\t"
  17564. #else
  17565. "adc r3, r6\n\t"
  17566. #endif
  17567. #ifdef WOLFSSL_KEIL
  17568. "adcs r4, r4, %[r]\n\t"
  17569. #elif defined(__clang__)
  17570. "adcs r4, %[r]\n\t"
  17571. #else
  17572. "adc r4, %[r]\n\t"
  17573. #endif
  17574. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17575. "adds r2, r2, r5\n\t"
  17576. #else
  17577. "add r2, r2, r5\n\t"
  17578. #endif
  17579. #ifdef WOLFSSL_KEIL
  17580. "adcs r3, r3, r6\n\t"
  17581. #elif defined(__clang__)
  17582. "adcs r3, r6\n\t"
  17583. #else
  17584. "adc r3, r6\n\t"
  17585. #endif
  17586. #ifdef WOLFSSL_KEIL
  17587. "adcs r4, r4, %[r]\n\t"
  17588. #elif defined(__clang__)
  17589. "adcs r4, %[r]\n\t"
  17590. #else
  17591. "adc r4, %[r]\n\t"
  17592. #endif
  17593. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17594. "lsrs r5, %[a], #16\n\t"
  17595. #else
  17596. "lsr r5, %[a], #16\n\t"
  17597. #endif
  17598. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17599. "lsrs r6, r7, #16\n\t"
  17600. #else
  17601. "lsr r6, r7, #16\n\t"
  17602. #endif
  17603. #ifdef WOLFSSL_KEIL
  17604. "muls r6, r5, r6\n\t"
  17605. #elif defined(__clang__)
  17606. "muls r6, r5\n\t"
  17607. #else
  17608. "mul r6, r5\n\t"
  17609. #endif
  17610. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17611. "adds r3, r3, r6\n\t"
  17612. #else
  17613. "add r3, r3, r6\n\t"
  17614. #endif
  17615. #ifdef WOLFSSL_KEIL
  17616. "adcs r4, r4, %[r]\n\t"
  17617. #elif defined(__clang__)
  17618. "adcs r4, %[r]\n\t"
  17619. #else
  17620. "adc r4, %[r]\n\t"
  17621. #endif
  17622. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17623. "adds r3, r3, r6\n\t"
  17624. #else
  17625. "add r3, r3, r6\n\t"
  17626. #endif
  17627. #ifdef WOLFSSL_KEIL
  17628. "adcs r4, r4, %[r]\n\t"
  17629. #elif defined(__clang__)
  17630. "adcs r4, %[r]\n\t"
  17631. #else
  17632. "adc r4, %[r]\n\t"
  17633. #endif
  17634. "uxth r6, r7\n\t"
  17635. #ifdef WOLFSSL_KEIL
  17636. "muls r5, r6, r5\n\t"
  17637. #elif defined(__clang__)
  17638. "muls r5, r6\n\t"
  17639. #else
  17640. "mul r5, r6\n\t"
  17641. #endif
  17642. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17643. "lsrs r6, r5, #16\n\t"
  17644. #else
  17645. "lsr r6, r5, #16\n\t"
  17646. #endif
  17647. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17648. "lsls r5, r5, #16\n\t"
  17649. #else
  17650. "lsl r5, r5, #16\n\t"
  17651. #endif
  17652. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17653. "adds r2, r2, r5\n\t"
  17654. #else
  17655. "add r2, r2, r5\n\t"
  17656. #endif
  17657. #ifdef WOLFSSL_KEIL
  17658. "adcs r3, r3, r6\n\t"
  17659. #elif defined(__clang__)
  17660. "adcs r3, r6\n\t"
  17661. #else
  17662. "adc r3, r6\n\t"
  17663. #endif
  17664. #ifdef WOLFSSL_KEIL
  17665. "adcs r4, r4, %[r]\n\t"
  17666. #elif defined(__clang__)
  17667. "adcs r4, %[r]\n\t"
  17668. #else
  17669. "adc r4, %[r]\n\t"
  17670. #endif
  17671. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17672. "adds r2, r2, r5\n\t"
  17673. #else
  17674. "add r2, r2, r5\n\t"
  17675. #endif
  17676. #ifdef WOLFSSL_KEIL
  17677. "adcs r3, r3, r6\n\t"
  17678. #elif defined(__clang__)
  17679. "adcs r3, r6\n\t"
  17680. #else
  17681. "adc r3, r6\n\t"
  17682. #endif
  17683. #ifdef WOLFSSL_KEIL
  17684. "adcs r4, r4, %[r]\n\t"
  17685. #elif defined(__clang__)
  17686. "adcs r4, %[r]\n\t"
  17687. #else
  17688. "adc r4, %[r]\n\t"
  17689. #endif
  17690. "mov %[r], r8\n\t"
  17691. "str r2, [%[r], #36]\n\t"
  17692. "movs %[r], #0\n\t"
  17693. "# A[7] * A[3]\n\t"
  17694. "movs r2, #0\n\t"
  17695. "mov %[a], r9\n\t"
  17696. "ldr r7, [%[a], #12]\n\t"
  17697. "mov %[a], lr\n\t"
  17698. "uxth r5, %[a]\n\t"
  17699. "uxth r6, r7\n\t"
  17700. #ifdef WOLFSSL_KEIL
  17701. "muls r6, r5, r6\n\t"
  17702. #elif defined(__clang__)
  17703. "muls r6, r5\n\t"
  17704. #else
  17705. "mul r6, r5\n\t"
  17706. #endif
  17707. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17708. "adds r3, r3, r6\n\t"
  17709. #else
  17710. "add r3, r3, r6\n\t"
  17711. #endif
  17712. #ifdef WOLFSSL_KEIL
  17713. "adcs r4, r4, %[r]\n\t"
  17714. #elif defined(__clang__)
  17715. "adcs r4, %[r]\n\t"
  17716. #else
  17717. "adc r4, %[r]\n\t"
  17718. #endif
  17719. #ifdef WOLFSSL_KEIL
  17720. "adcs r2, r2, %[r]\n\t"
  17721. #elif defined(__clang__)
  17722. "adcs r2, %[r]\n\t"
  17723. #else
  17724. "adc r2, %[r]\n\t"
  17725. #endif
  17726. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17727. "adds r3, r3, r6\n\t"
  17728. #else
  17729. "add r3, r3, r6\n\t"
  17730. #endif
  17731. #ifdef WOLFSSL_KEIL
  17732. "adcs r4, r4, %[r]\n\t"
  17733. #elif defined(__clang__)
  17734. "adcs r4, %[r]\n\t"
  17735. #else
  17736. "adc r4, %[r]\n\t"
  17737. #endif
  17738. #ifdef WOLFSSL_KEIL
  17739. "adcs r2, r2, %[r]\n\t"
  17740. #elif defined(__clang__)
  17741. "adcs r2, %[r]\n\t"
  17742. #else
  17743. "adc r2, %[r]\n\t"
  17744. #endif
  17745. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17746. "lsrs r6, r7, #16\n\t"
  17747. #else
  17748. "lsr r6, r7, #16\n\t"
  17749. #endif
  17750. #ifdef WOLFSSL_KEIL
  17751. "muls r5, r6, r5\n\t"
  17752. #elif defined(__clang__)
  17753. "muls r5, r6\n\t"
  17754. #else
  17755. "mul r5, r6\n\t"
  17756. #endif
  17757. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17758. "lsrs r6, r5, #16\n\t"
  17759. #else
  17760. "lsr r6, r5, #16\n\t"
  17761. #endif
  17762. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17763. "lsls r5, r5, #16\n\t"
  17764. #else
  17765. "lsl r5, r5, #16\n\t"
  17766. #endif
  17767. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17768. "adds r3, r3, r5\n\t"
  17769. #else
  17770. "add r3, r3, r5\n\t"
  17771. #endif
  17772. #ifdef WOLFSSL_KEIL
  17773. "adcs r4, r4, r6\n\t"
  17774. #elif defined(__clang__)
  17775. "adcs r4, r6\n\t"
  17776. #else
  17777. "adc r4, r6\n\t"
  17778. #endif
  17779. #ifdef WOLFSSL_KEIL
  17780. "adcs r2, r2, %[r]\n\t"
  17781. #elif defined(__clang__)
  17782. "adcs r2, %[r]\n\t"
  17783. #else
  17784. "adc r2, %[r]\n\t"
  17785. #endif
  17786. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17787. "adds r3, r3, r5\n\t"
  17788. #else
  17789. "add r3, r3, r5\n\t"
  17790. #endif
  17791. #ifdef WOLFSSL_KEIL
  17792. "adcs r4, r4, r6\n\t"
  17793. #elif defined(__clang__)
  17794. "adcs r4, r6\n\t"
  17795. #else
  17796. "adc r4, r6\n\t"
  17797. #endif
  17798. #ifdef WOLFSSL_KEIL
  17799. "adcs r2, r2, %[r]\n\t"
  17800. #elif defined(__clang__)
  17801. "adcs r2, %[r]\n\t"
  17802. #else
  17803. "adc r2, %[r]\n\t"
  17804. #endif
  17805. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17806. "lsrs r5, %[a], #16\n\t"
  17807. #else
  17808. "lsr r5, %[a], #16\n\t"
  17809. #endif
  17810. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17811. "lsrs r6, r7, #16\n\t"
  17812. #else
  17813. "lsr r6, r7, #16\n\t"
  17814. #endif
  17815. #ifdef WOLFSSL_KEIL
  17816. "muls r6, r5, r6\n\t"
  17817. #elif defined(__clang__)
  17818. "muls r6, r5\n\t"
  17819. #else
  17820. "mul r6, r5\n\t"
  17821. #endif
  17822. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17823. "adds r4, r4, r6\n\t"
  17824. #else
  17825. "add r4, r4, r6\n\t"
  17826. #endif
  17827. #ifdef WOLFSSL_KEIL
  17828. "adcs r2, r2, %[r]\n\t"
  17829. #elif defined(__clang__)
  17830. "adcs r2, %[r]\n\t"
  17831. #else
  17832. "adc r2, %[r]\n\t"
  17833. #endif
  17834. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17835. "adds r4, r4, r6\n\t"
  17836. #else
  17837. "add r4, r4, r6\n\t"
  17838. #endif
  17839. #ifdef WOLFSSL_KEIL
  17840. "adcs r2, r2, %[r]\n\t"
  17841. #elif defined(__clang__)
  17842. "adcs r2, %[r]\n\t"
  17843. #else
  17844. "adc r2, %[r]\n\t"
  17845. #endif
  17846. "uxth r6, r7\n\t"
  17847. #ifdef WOLFSSL_KEIL
  17848. "muls r5, r6, r5\n\t"
  17849. #elif defined(__clang__)
  17850. "muls r5, r6\n\t"
  17851. #else
  17852. "mul r5, r6\n\t"
  17853. #endif
  17854. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17855. "lsrs r6, r5, #16\n\t"
  17856. #else
  17857. "lsr r6, r5, #16\n\t"
  17858. #endif
  17859. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17860. "lsls r5, r5, #16\n\t"
  17861. #else
  17862. "lsl r5, r5, #16\n\t"
  17863. #endif
  17864. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17865. "adds r3, r3, r5\n\t"
  17866. #else
  17867. "add r3, r3, r5\n\t"
  17868. #endif
  17869. #ifdef WOLFSSL_KEIL
  17870. "adcs r4, r4, r6\n\t"
  17871. #elif defined(__clang__)
  17872. "adcs r4, r6\n\t"
  17873. #else
  17874. "adc r4, r6\n\t"
  17875. #endif
  17876. #ifdef WOLFSSL_KEIL
  17877. "adcs r2, r2, %[r]\n\t"
  17878. #elif defined(__clang__)
  17879. "adcs r2, %[r]\n\t"
  17880. #else
  17881. "adc r2, %[r]\n\t"
  17882. #endif
  17883. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17884. "adds r3, r3, r5\n\t"
  17885. #else
  17886. "add r3, r3, r5\n\t"
  17887. #endif
  17888. #ifdef WOLFSSL_KEIL
  17889. "adcs r4, r4, r6\n\t"
  17890. #elif defined(__clang__)
  17891. "adcs r4, r6\n\t"
  17892. #else
  17893. "adc r4, r6\n\t"
  17894. #endif
  17895. #ifdef WOLFSSL_KEIL
  17896. "adcs r2, r2, %[r]\n\t"
  17897. #elif defined(__clang__)
  17898. "adcs r2, %[r]\n\t"
  17899. #else
  17900. "adc r2, %[r]\n\t"
  17901. #endif
  17902. "# A[6] * A[4]\n\t"
  17903. "mov %[a], r9\n\t"
  17904. "mov r7, r10\n\t"
  17905. "mov %[a], r12\n\t"
  17906. "uxth r5, %[a]\n\t"
  17907. "uxth r6, r7\n\t"
  17908. #ifdef WOLFSSL_KEIL
  17909. "muls r6, r5, r6\n\t"
  17910. #elif defined(__clang__)
  17911. "muls r6, r5\n\t"
  17912. #else
  17913. "mul r6, r5\n\t"
  17914. #endif
  17915. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17916. "adds r3, r3, r6\n\t"
  17917. #else
  17918. "add r3, r3, r6\n\t"
  17919. #endif
  17920. #ifdef WOLFSSL_KEIL
  17921. "adcs r4, r4, %[r]\n\t"
  17922. #elif defined(__clang__)
  17923. "adcs r4, %[r]\n\t"
  17924. #else
  17925. "adc r4, %[r]\n\t"
  17926. #endif
  17927. #ifdef WOLFSSL_KEIL
  17928. "adcs r2, r2, %[r]\n\t"
  17929. #elif defined(__clang__)
  17930. "adcs r2, %[r]\n\t"
  17931. #else
  17932. "adc r2, %[r]\n\t"
  17933. #endif
  17934. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17935. "adds r3, r3, r6\n\t"
  17936. #else
  17937. "add r3, r3, r6\n\t"
  17938. #endif
  17939. #ifdef WOLFSSL_KEIL
  17940. "adcs r4, r4, %[r]\n\t"
  17941. #elif defined(__clang__)
  17942. "adcs r4, %[r]\n\t"
  17943. #else
  17944. "adc r4, %[r]\n\t"
  17945. #endif
  17946. #ifdef WOLFSSL_KEIL
  17947. "adcs r2, r2, %[r]\n\t"
  17948. #elif defined(__clang__)
  17949. "adcs r2, %[r]\n\t"
  17950. #else
  17951. "adc r2, %[r]\n\t"
  17952. #endif
  17953. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17954. "lsrs r6, r7, #16\n\t"
  17955. #else
  17956. "lsr r6, r7, #16\n\t"
  17957. #endif
  17958. #ifdef WOLFSSL_KEIL
  17959. "muls r5, r6, r5\n\t"
  17960. #elif defined(__clang__)
  17961. "muls r5, r6\n\t"
  17962. #else
  17963. "mul r5, r6\n\t"
  17964. #endif
  17965. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17966. "lsrs r6, r5, #16\n\t"
  17967. #else
  17968. "lsr r6, r5, #16\n\t"
  17969. #endif
  17970. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17971. "lsls r5, r5, #16\n\t"
  17972. #else
  17973. "lsl r5, r5, #16\n\t"
  17974. #endif
  17975. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17976. "adds r3, r3, r5\n\t"
  17977. #else
  17978. "add r3, r3, r5\n\t"
  17979. #endif
  17980. #ifdef WOLFSSL_KEIL
  17981. "adcs r4, r4, r6\n\t"
  17982. #elif defined(__clang__)
  17983. "adcs r4, r6\n\t"
  17984. #else
  17985. "adc r4, r6\n\t"
  17986. #endif
  17987. #ifdef WOLFSSL_KEIL
  17988. "adcs r2, r2, %[r]\n\t"
  17989. #elif defined(__clang__)
  17990. "adcs r2, %[r]\n\t"
  17991. #else
  17992. "adc r2, %[r]\n\t"
  17993. #endif
  17994. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17995. "adds r3, r3, r5\n\t"
  17996. #else
  17997. "add r3, r3, r5\n\t"
  17998. #endif
  17999. #ifdef WOLFSSL_KEIL
  18000. "adcs r4, r4, r6\n\t"
  18001. #elif defined(__clang__)
  18002. "adcs r4, r6\n\t"
  18003. #else
  18004. "adc r4, r6\n\t"
  18005. #endif
  18006. #ifdef WOLFSSL_KEIL
  18007. "adcs r2, r2, %[r]\n\t"
  18008. #elif defined(__clang__)
  18009. "adcs r2, %[r]\n\t"
  18010. #else
  18011. "adc r2, %[r]\n\t"
  18012. #endif
  18013. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18014. "lsrs r5, %[a], #16\n\t"
  18015. #else
  18016. "lsr r5, %[a], #16\n\t"
  18017. #endif
  18018. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18019. "lsrs r6, r7, #16\n\t"
  18020. #else
  18021. "lsr r6, r7, #16\n\t"
  18022. #endif
  18023. #ifdef WOLFSSL_KEIL
  18024. "muls r6, r5, r6\n\t"
  18025. #elif defined(__clang__)
  18026. "muls r6, r5\n\t"
  18027. #else
  18028. "mul r6, r5\n\t"
  18029. #endif
  18030. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18031. "adds r4, r4, r6\n\t"
  18032. #else
  18033. "add r4, r4, r6\n\t"
  18034. #endif
  18035. #ifdef WOLFSSL_KEIL
  18036. "adcs r2, r2, %[r]\n\t"
  18037. #elif defined(__clang__)
  18038. "adcs r2, %[r]\n\t"
  18039. #else
  18040. "adc r2, %[r]\n\t"
  18041. #endif
  18042. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18043. "adds r4, r4, r6\n\t"
  18044. #else
  18045. "add r4, r4, r6\n\t"
  18046. #endif
  18047. #ifdef WOLFSSL_KEIL
  18048. "adcs r2, r2, %[r]\n\t"
  18049. #elif defined(__clang__)
  18050. "adcs r2, %[r]\n\t"
  18051. #else
  18052. "adc r2, %[r]\n\t"
  18053. #endif
  18054. "uxth r6, r7\n\t"
  18055. #ifdef WOLFSSL_KEIL
  18056. "muls r5, r6, r5\n\t"
  18057. #elif defined(__clang__)
  18058. "muls r5, r6\n\t"
  18059. #else
  18060. "mul r5, r6\n\t"
  18061. #endif
  18062. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18063. "lsrs r6, r5, #16\n\t"
  18064. #else
  18065. "lsr r6, r5, #16\n\t"
  18066. #endif
  18067. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18068. "lsls r5, r5, #16\n\t"
  18069. #else
  18070. "lsl r5, r5, #16\n\t"
  18071. #endif
  18072. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18073. "adds r3, r3, r5\n\t"
  18074. #else
  18075. "add r3, r3, r5\n\t"
  18076. #endif
  18077. #ifdef WOLFSSL_KEIL
  18078. "adcs r4, r4, r6\n\t"
  18079. #elif defined(__clang__)
  18080. "adcs r4, r6\n\t"
  18081. #else
  18082. "adc r4, r6\n\t"
  18083. #endif
  18084. #ifdef WOLFSSL_KEIL
  18085. "adcs r2, r2, %[r]\n\t"
  18086. #elif defined(__clang__)
  18087. "adcs r2, %[r]\n\t"
  18088. #else
  18089. "adc r2, %[r]\n\t"
  18090. #endif
  18091. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18092. "adds r3, r3, r5\n\t"
  18093. #else
  18094. "add r3, r3, r5\n\t"
  18095. #endif
  18096. #ifdef WOLFSSL_KEIL
  18097. "adcs r4, r4, r6\n\t"
  18098. #elif defined(__clang__)
  18099. "adcs r4, r6\n\t"
  18100. #else
  18101. "adc r4, r6\n\t"
  18102. #endif
  18103. #ifdef WOLFSSL_KEIL
  18104. "adcs r2, r2, %[r]\n\t"
  18105. #elif defined(__clang__)
  18106. "adcs r2, %[r]\n\t"
  18107. #else
  18108. "adc r2, %[r]\n\t"
  18109. #endif
  18110. "# A[5] * A[5]\n\t"
  18111. "mov r7, r11\n\t"
  18112. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18113. "lsrs r6, r7, #16\n\t"
  18114. #else
  18115. "lsr r6, r7, #16\n\t"
  18116. #endif
  18117. "uxth r5, r7\n\t"
  18118. #ifdef WOLFSSL_KEIL
  18119. "muls r5, r5, r5\n\t"
  18120. #elif defined(__clang__)
  18121. "muls r5, r5\n\t"
  18122. #else
  18123. "mul r5, r5\n\t"
  18124. #endif
  18125. #ifdef WOLFSSL_KEIL
  18126. "muls r6, r6, r6\n\t"
  18127. #elif defined(__clang__)
  18128. "muls r6, r6\n\t"
  18129. #else
  18130. "mul r6, r6\n\t"
  18131. #endif
  18132. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18133. "adds r3, r3, r5\n\t"
  18134. #else
  18135. "add r3, r3, r5\n\t"
  18136. #endif
  18137. #ifdef WOLFSSL_KEIL
  18138. "adcs r4, r4, r6\n\t"
  18139. #elif defined(__clang__)
  18140. "adcs r4, r6\n\t"
  18141. #else
  18142. "adc r4, r6\n\t"
  18143. #endif
  18144. #ifdef WOLFSSL_KEIL
  18145. "adcs r2, r2, %[r]\n\t"
  18146. #elif defined(__clang__)
  18147. "adcs r2, %[r]\n\t"
  18148. #else
  18149. "adc r2, %[r]\n\t"
  18150. #endif
  18151. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18152. "lsrs r6, r7, #16\n\t"
  18153. #else
  18154. "lsr r6, r7, #16\n\t"
  18155. #endif
  18156. "uxth r5, r7\n\t"
  18157. #ifdef WOLFSSL_KEIL
  18158. "muls r5, r6, r5\n\t"
  18159. #elif defined(__clang__)
  18160. "muls r5, r6\n\t"
  18161. #else
  18162. "mul r5, r6\n\t"
  18163. #endif
  18164. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18165. "lsrs r6, r5, #15\n\t"
  18166. #else
  18167. "lsr r6, r5, #15\n\t"
  18168. #endif
  18169. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18170. "lsls r5, r5, #17\n\t"
  18171. #else
  18172. "lsl r5, r5, #17\n\t"
  18173. #endif
  18174. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18175. "adds r3, r3, r5\n\t"
  18176. #else
  18177. "add r3, r3, r5\n\t"
  18178. #endif
  18179. #ifdef WOLFSSL_KEIL
  18180. "adcs r4, r4, r6\n\t"
  18181. #elif defined(__clang__)
  18182. "adcs r4, r6\n\t"
  18183. #else
  18184. "adc r4, r6\n\t"
  18185. #endif
  18186. #ifdef WOLFSSL_KEIL
  18187. "adcs r2, r2, %[r]\n\t"
  18188. #elif defined(__clang__)
  18189. "adcs r2, %[r]\n\t"
  18190. #else
  18191. "adc r2, %[r]\n\t"
  18192. #endif
  18193. "mov %[r], r8\n\t"
  18194. "str r3, [%[r], #40]\n\t"
  18195. "movs %[r], #0\n\t"
  18196. "# A[6] * A[5]\n\t"
  18197. "movs r3, #0\n\t"
  18198. "mov %[a], r9\n\t"
  18199. "mov %[a], r12\n\t"
  18200. "uxth r5, %[a]\n\t"
  18201. "uxth r6, r7\n\t"
  18202. #ifdef WOLFSSL_KEIL
  18203. "muls r6, r5, r6\n\t"
  18204. #elif defined(__clang__)
  18205. "muls r6, r5\n\t"
  18206. #else
  18207. "mul r6, r5\n\t"
  18208. #endif
  18209. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18210. "adds r4, r4, r6\n\t"
  18211. #else
  18212. "add r4, r4, r6\n\t"
  18213. #endif
  18214. #ifdef WOLFSSL_KEIL
  18215. "adcs r2, r2, %[r]\n\t"
  18216. #elif defined(__clang__)
  18217. "adcs r2, %[r]\n\t"
  18218. #else
  18219. "adc r2, %[r]\n\t"
  18220. #endif
  18221. #ifdef WOLFSSL_KEIL
  18222. "adcs r3, r3, %[r]\n\t"
  18223. #elif defined(__clang__)
  18224. "adcs r3, %[r]\n\t"
  18225. #else
  18226. "adc r3, %[r]\n\t"
  18227. #endif
  18228. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18229. "adds r4, r4, r6\n\t"
  18230. #else
  18231. "add r4, r4, r6\n\t"
  18232. #endif
  18233. #ifdef WOLFSSL_KEIL
  18234. "adcs r2, r2, %[r]\n\t"
  18235. #elif defined(__clang__)
  18236. "adcs r2, %[r]\n\t"
  18237. #else
  18238. "adc r2, %[r]\n\t"
  18239. #endif
  18240. #ifdef WOLFSSL_KEIL
  18241. "adcs r3, r3, %[r]\n\t"
  18242. #elif defined(__clang__)
  18243. "adcs r3, %[r]\n\t"
  18244. #else
  18245. "adc r3, %[r]\n\t"
  18246. #endif
  18247. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18248. "lsrs r6, r7, #16\n\t"
  18249. #else
  18250. "lsr r6, r7, #16\n\t"
  18251. #endif
  18252. #ifdef WOLFSSL_KEIL
  18253. "muls r5, r6, r5\n\t"
  18254. #elif defined(__clang__)
  18255. "muls r5, r6\n\t"
  18256. #else
  18257. "mul r5, r6\n\t"
  18258. #endif
  18259. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18260. "lsrs r6, r5, #16\n\t"
  18261. #else
  18262. "lsr r6, r5, #16\n\t"
  18263. #endif
  18264. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18265. "lsls r5, r5, #16\n\t"
  18266. #else
  18267. "lsl r5, r5, #16\n\t"
  18268. #endif
  18269. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18270. "adds r4, r4, r5\n\t"
  18271. #else
  18272. "add r4, r4, r5\n\t"
  18273. #endif
  18274. #ifdef WOLFSSL_KEIL
  18275. "adcs r2, r2, r6\n\t"
  18276. #elif defined(__clang__)
  18277. "adcs r2, r6\n\t"
  18278. #else
  18279. "adc r2, r6\n\t"
  18280. #endif
  18281. #ifdef WOLFSSL_KEIL
  18282. "adcs r3, r3, %[r]\n\t"
  18283. #elif defined(__clang__)
  18284. "adcs r3, %[r]\n\t"
  18285. #else
  18286. "adc r3, %[r]\n\t"
  18287. #endif
  18288. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18289. "adds r4, r4, r5\n\t"
  18290. #else
  18291. "add r4, r4, r5\n\t"
  18292. #endif
  18293. #ifdef WOLFSSL_KEIL
  18294. "adcs r2, r2, r6\n\t"
  18295. #elif defined(__clang__)
  18296. "adcs r2, r6\n\t"
  18297. #else
  18298. "adc r2, r6\n\t"
  18299. #endif
  18300. #ifdef WOLFSSL_KEIL
  18301. "adcs r3, r3, %[r]\n\t"
  18302. #elif defined(__clang__)
  18303. "adcs r3, %[r]\n\t"
  18304. #else
  18305. "adc r3, %[r]\n\t"
  18306. #endif
  18307. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18308. "lsrs r5, %[a], #16\n\t"
  18309. #else
  18310. "lsr r5, %[a], #16\n\t"
  18311. #endif
  18312. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18313. "lsrs r6, r7, #16\n\t"
  18314. #else
  18315. "lsr r6, r7, #16\n\t"
  18316. #endif
  18317. #ifdef WOLFSSL_KEIL
  18318. "muls r6, r5, r6\n\t"
  18319. #elif defined(__clang__)
  18320. "muls r6, r5\n\t"
  18321. #else
  18322. "mul r6, r5\n\t"
  18323. #endif
  18324. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18325. "adds r2, r2, r6\n\t"
  18326. #else
  18327. "add r2, r2, r6\n\t"
  18328. #endif
  18329. #ifdef WOLFSSL_KEIL
  18330. "adcs r3, r3, %[r]\n\t"
  18331. #elif defined(__clang__)
  18332. "adcs r3, %[r]\n\t"
  18333. #else
  18334. "adc r3, %[r]\n\t"
  18335. #endif
  18336. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18337. "adds r2, r2, r6\n\t"
  18338. #else
  18339. "add r2, r2, r6\n\t"
  18340. #endif
  18341. #ifdef WOLFSSL_KEIL
  18342. "adcs r3, r3, %[r]\n\t"
  18343. #elif defined(__clang__)
  18344. "adcs r3, %[r]\n\t"
  18345. #else
  18346. "adc r3, %[r]\n\t"
  18347. #endif
  18348. "uxth r6, r7\n\t"
  18349. #ifdef WOLFSSL_KEIL
  18350. "muls r5, r6, r5\n\t"
  18351. #elif defined(__clang__)
  18352. "muls r5, r6\n\t"
  18353. #else
  18354. "mul r5, r6\n\t"
  18355. #endif
  18356. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18357. "lsrs r6, r5, #16\n\t"
  18358. #else
  18359. "lsr r6, r5, #16\n\t"
  18360. #endif
  18361. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18362. "lsls r5, r5, #16\n\t"
  18363. #else
  18364. "lsl r5, r5, #16\n\t"
  18365. #endif
  18366. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18367. "adds r4, r4, r5\n\t"
  18368. #else
  18369. "add r4, r4, r5\n\t"
  18370. #endif
  18371. #ifdef WOLFSSL_KEIL
  18372. "adcs r2, r2, r6\n\t"
  18373. #elif defined(__clang__)
  18374. "adcs r2, r6\n\t"
  18375. #else
  18376. "adc r2, r6\n\t"
  18377. #endif
  18378. #ifdef WOLFSSL_KEIL
  18379. "adcs r3, r3, %[r]\n\t"
  18380. #elif defined(__clang__)
  18381. "adcs r3, %[r]\n\t"
  18382. #else
  18383. "adc r3, %[r]\n\t"
  18384. #endif
  18385. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18386. "adds r4, r4, r5\n\t"
  18387. #else
  18388. "add r4, r4, r5\n\t"
  18389. #endif
  18390. #ifdef WOLFSSL_KEIL
  18391. "adcs r2, r2, r6\n\t"
  18392. #elif defined(__clang__)
  18393. "adcs r2, r6\n\t"
  18394. #else
  18395. "adc r2, r6\n\t"
  18396. #endif
  18397. #ifdef WOLFSSL_KEIL
  18398. "adcs r3, r3, %[r]\n\t"
  18399. #elif defined(__clang__)
  18400. "adcs r3, %[r]\n\t"
  18401. #else
  18402. "adc r3, %[r]\n\t"
  18403. #endif
  18404. "# A[7] * A[4]\n\t"
  18405. "mov %[a], r9\n\t"
  18406. "mov r7, r10\n\t"
  18407. "mov %[a], lr\n\t"
  18408. "uxth r5, %[a]\n\t"
  18409. "uxth r6, r7\n\t"
  18410. #ifdef WOLFSSL_KEIL
  18411. "muls r6, r5, r6\n\t"
  18412. #elif defined(__clang__)
  18413. "muls r6, r5\n\t"
  18414. #else
  18415. "mul r6, r5\n\t"
  18416. #endif
  18417. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18418. "adds r4, r4, r6\n\t"
  18419. #else
  18420. "add r4, r4, r6\n\t"
  18421. #endif
  18422. #ifdef WOLFSSL_KEIL
  18423. "adcs r2, r2, %[r]\n\t"
  18424. #elif defined(__clang__)
  18425. "adcs r2, %[r]\n\t"
  18426. #else
  18427. "adc r2, %[r]\n\t"
  18428. #endif
  18429. #ifdef WOLFSSL_KEIL
  18430. "adcs r3, r3, %[r]\n\t"
  18431. #elif defined(__clang__)
  18432. "adcs r3, %[r]\n\t"
  18433. #else
  18434. "adc r3, %[r]\n\t"
  18435. #endif
  18436. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18437. "adds r4, r4, r6\n\t"
  18438. #else
  18439. "add r4, r4, r6\n\t"
  18440. #endif
  18441. #ifdef WOLFSSL_KEIL
  18442. "adcs r2, r2, %[r]\n\t"
  18443. #elif defined(__clang__)
  18444. "adcs r2, %[r]\n\t"
  18445. #else
  18446. "adc r2, %[r]\n\t"
  18447. #endif
  18448. #ifdef WOLFSSL_KEIL
  18449. "adcs r3, r3, %[r]\n\t"
  18450. #elif defined(__clang__)
  18451. "adcs r3, %[r]\n\t"
  18452. #else
  18453. "adc r3, %[r]\n\t"
  18454. #endif
  18455. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18456. "lsrs r6, r7, #16\n\t"
  18457. #else
  18458. "lsr r6, r7, #16\n\t"
  18459. #endif
  18460. #ifdef WOLFSSL_KEIL
  18461. "muls r5, r6, r5\n\t"
  18462. #elif defined(__clang__)
  18463. "muls r5, r6\n\t"
  18464. #else
  18465. "mul r5, r6\n\t"
  18466. #endif
  18467. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18468. "lsrs r6, r5, #16\n\t"
  18469. #else
  18470. "lsr r6, r5, #16\n\t"
  18471. #endif
  18472. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18473. "lsls r5, r5, #16\n\t"
  18474. #else
  18475. "lsl r5, r5, #16\n\t"
  18476. #endif
  18477. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18478. "adds r4, r4, r5\n\t"
  18479. #else
  18480. "add r4, r4, r5\n\t"
  18481. #endif
  18482. #ifdef WOLFSSL_KEIL
  18483. "adcs r2, r2, r6\n\t"
  18484. #elif defined(__clang__)
  18485. "adcs r2, r6\n\t"
  18486. #else
  18487. "adc r2, r6\n\t"
  18488. #endif
  18489. #ifdef WOLFSSL_KEIL
  18490. "adcs r3, r3, %[r]\n\t"
  18491. #elif defined(__clang__)
  18492. "adcs r3, %[r]\n\t"
  18493. #else
  18494. "adc r3, %[r]\n\t"
  18495. #endif
  18496. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18497. "adds r4, r4, r5\n\t"
  18498. #else
  18499. "add r4, r4, r5\n\t"
  18500. #endif
  18501. #ifdef WOLFSSL_KEIL
  18502. "adcs r2, r2, r6\n\t"
  18503. #elif defined(__clang__)
  18504. "adcs r2, r6\n\t"
  18505. #else
  18506. "adc r2, r6\n\t"
  18507. #endif
  18508. #ifdef WOLFSSL_KEIL
  18509. "adcs r3, r3, %[r]\n\t"
  18510. #elif defined(__clang__)
  18511. "adcs r3, %[r]\n\t"
  18512. #else
  18513. "adc r3, %[r]\n\t"
  18514. #endif
  18515. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18516. "lsrs r5, %[a], #16\n\t"
  18517. #else
  18518. "lsr r5, %[a], #16\n\t"
  18519. #endif
  18520. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18521. "lsrs r6, r7, #16\n\t"
  18522. #else
  18523. "lsr r6, r7, #16\n\t"
  18524. #endif
  18525. #ifdef WOLFSSL_KEIL
  18526. "muls r6, r5, r6\n\t"
  18527. #elif defined(__clang__)
  18528. "muls r6, r5\n\t"
  18529. #else
  18530. "mul r6, r5\n\t"
  18531. #endif
  18532. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18533. "adds r2, r2, r6\n\t"
  18534. #else
  18535. "add r2, r2, r6\n\t"
  18536. #endif
  18537. #ifdef WOLFSSL_KEIL
  18538. "adcs r3, r3, %[r]\n\t"
  18539. #elif defined(__clang__)
  18540. "adcs r3, %[r]\n\t"
  18541. #else
  18542. "adc r3, %[r]\n\t"
  18543. #endif
  18544. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18545. "adds r2, r2, r6\n\t"
  18546. #else
  18547. "add r2, r2, r6\n\t"
  18548. #endif
  18549. #ifdef WOLFSSL_KEIL
  18550. "adcs r3, r3, %[r]\n\t"
  18551. #elif defined(__clang__)
  18552. "adcs r3, %[r]\n\t"
  18553. #else
  18554. "adc r3, %[r]\n\t"
  18555. #endif
  18556. "uxth r6, r7\n\t"
  18557. #ifdef WOLFSSL_KEIL
  18558. "muls r5, r6, r5\n\t"
  18559. #elif defined(__clang__)
  18560. "muls r5, r6\n\t"
  18561. #else
  18562. "mul r5, r6\n\t"
  18563. #endif
  18564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18565. "lsrs r6, r5, #16\n\t"
  18566. #else
  18567. "lsr r6, r5, #16\n\t"
  18568. #endif
  18569. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18570. "lsls r5, r5, #16\n\t"
  18571. #else
  18572. "lsl r5, r5, #16\n\t"
  18573. #endif
  18574. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18575. "adds r4, r4, r5\n\t"
  18576. #else
  18577. "add r4, r4, r5\n\t"
  18578. #endif
  18579. #ifdef WOLFSSL_KEIL
  18580. "adcs r2, r2, r6\n\t"
  18581. #elif defined(__clang__)
  18582. "adcs r2, r6\n\t"
  18583. #else
  18584. "adc r2, r6\n\t"
  18585. #endif
  18586. #ifdef WOLFSSL_KEIL
  18587. "adcs r3, r3, %[r]\n\t"
  18588. #elif defined(__clang__)
  18589. "adcs r3, %[r]\n\t"
  18590. #else
  18591. "adc r3, %[r]\n\t"
  18592. #endif
  18593. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18594. "adds r4, r4, r5\n\t"
  18595. #else
  18596. "add r4, r4, r5\n\t"
  18597. #endif
  18598. #ifdef WOLFSSL_KEIL
  18599. "adcs r2, r2, r6\n\t"
  18600. #elif defined(__clang__)
  18601. "adcs r2, r6\n\t"
  18602. #else
  18603. "adc r2, r6\n\t"
  18604. #endif
  18605. #ifdef WOLFSSL_KEIL
  18606. "adcs r3, r3, %[r]\n\t"
  18607. #elif defined(__clang__)
  18608. "adcs r3, %[r]\n\t"
  18609. #else
  18610. "adc r3, %[r]\n\t"
  18611. #endif
  18612. "mov %[r], r8\n\t"
  18613. "str r4, [%[r], #44]\n\t"
  18614. "movs %[r], #0\n\t"
  18615. "# A[7] * A[5]\n\t"
  18616. "movs r4, #0\n\t"
  18617. "mov %[a], r9\n\t"
  18618. "mov r7, r11\n\t"
  18619. "mov %[a], lr\n\t"
  18620. "uxth r5, %[a]\n\t"
  18621. "uxth r6, r7\n\t"
  18622. #ifdef WOLFSSL_KEIL
  18623. "muls r6, r5, r6\n\t"
  18624. #elif defined(__clang__)
  18625. "muls r6, r5\n\t"
  18626. #else
  18627. "mul r6, r5\n\t"
  18628. #endif
  18629. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18630. "adds r2, r2, r6\n\t"
  18631. #else
  18632. "add r2, r2, r6\n\t"
  18633. #endif
  18634. #ifdef WOLFSSL_KEIL
  18635. "adcs r3, r3, %[r]\n\t"
  18636. #elif defined(__clang__)
  18637. "adcs r3, %[r]\n\t"
  18638. #else
  18639. "adc r3, %[r]\n\t"
  18640. #endif
  18641. #ifdef WOLFSSL_KEIL
  18642. "adcs r4, r4, %[r]\n\t"
  18643. #elif defined(__clang__)
  18644. "adcs r4, %[r]\n\t"
  18645. #else
  18646. "adc r4, %[r]\n\t"
  18647. #endif
  18648. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18649. "adds r2, r2, r6\n\t"
  18650. #else
  18651. "add r2, r2, r6\n\t"
  18652. #endif
  18653. #ifdef WOLFSSL_KEIL
  18654. "adcs r3, r3, %[r]\n\t"
  18655. #elif defined(__clang__)
  18656. "adcs r3, %[r]\n\t"
  18657. #else
  18658. "adc r3, %[r]\n\t"
  18659. #endif
  18660. #ifdef WOLFSSL_KEIL
  18661. "adcs r4, r4, %[r]\n\t"
  18662. #elif defined(__clang__)
  18663. "adcs r4, %[r]\n\t"
  18664. #else
  18665. "adc r4, %[r]\n\t"
  18666. #endif
  18667. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18668. "lsrs r6, r7, #16\n\t"
  18669. #else
  18670. "lsr r6, r7, #16\n\t"
  18671. #endif
  18672. #ifdef WOLFSSL_KEIL
  18673. "muls r5, r6, r5\n\t"
  18674. #elif defined(__clang__)
  18675. "muls r5, r6\n\t"
  18676. #else
  18677. "mul r5, r6\n\t"
  18678. #endif
  18679. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18680. "lsrs r6, r5, #16\n\t"
  18681. #else
  18682. "lsr r6, r5, #16\n\t"
  18683. #endif
  18684. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18685. "lsls r5, r5, #16\n\t"
  18686. #else
  18687. "lsl r5, r5, #16\n\t"
  18688. #endif
  18689. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18690. "adds r2, r2, r5\n\t"
  18691. #else
  18692. "add r2, r2, r5\n\t"
  18693. #endif
  18694. #ifdef WOLFSSL_KEIL
  18695. "adcs r3, r3, r6\n\t"
  18696. #elif defined(__clang__)
  18697. "adcs r3, r6\n\t"
  18698. #else
  18699. "adc r3, r6\n\t"
  18700. #endif
  18701. #ifdef WOLFSSL_KEIL
  18702. "adcs r4, r4, %[r]\n\t"
  18703. #elif defined(__clang__)
  18704. "adcs r4, %[r]\n\t"
  18705. #else
  18706. "adc r4, %[r]\n\t"
  18707. #endif
  18708. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18709. "adds r2, r2, r5\n\t"
  18710. #else
  18711. "add r2, r2, r5\n\t"
  18712. #endif
  18713. #ifdef WOLFSSL_KEIL
  18714. "adcs r3, r3, r6\n\t"
  18715. #elif defined(__clang__)
  18716. "adcs r3, r6\n\t"
  18717. #else
  18718. "adc r3, r6\n\t"
  18719. #endif
  18720. #ifdef WOLFSSL_KEIL
  18721. "adcs r4, r4, %[r]\n\t"
  18722. #elif defined(__clang__)
  18723. "adcs r4, %[r]\n\t"
  18724. #else
  18725. "adc r4, %[r]\n\t"
  18726. #endif
  18727. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18728. "lsrs r5, %[a], #16\n\t"
  18729. #else
  18730. "lsr r5, %[a], #16\n\t"
  18731. #endif
  18732. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18733. "lsrs r6, r7, #16\n\t"
  18734. #else
  18735. "lsr r6, r7, #16\n\t"
  18736. #endif
  18737. #ifdef WOLFSSL_KEIL
  18738. "muls r6, r5, r6\n\t"
  18739. #elif defined(__clang__)
  18740. "muls r6, r5\n\t"
  18741. #else
  18742. "mul r6, r5\n\t"
  18743. #endif
  18744. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18745. "adds r3, r3, r6\n\t"
  18746. #else
  18747. "add r3, r3, r6\n\t"
  18748. #endif
  18749. #ifdef WOLFSSL_KEIL
  18750. "adcs r4, r4, %[r]\n\t"
  18751. #elif defined(__clang__)
  18752. "adcs r4, %[r]\n\t"
  18753. #else
  18754. "adc r4, %[r]\n\t"
  18755. #endif
  18756. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18757. "adds r3, r3, r6\n\t"
  18758. #else
  18759. "add r3, r3, r6\n\t"
  18760. #endif
  18761. #ifdef WOLFSSL_KEIL
  18762. "adcs r4, r4, %[r]\n\t"
  18763. #elif defined(__clang__)
  18764. "adcs r4, %[r]\n\t"
  18765. #else
  18766. "adc r4, %[r]\n\t"
  18767. #endif
  18768. "uxth r6, r7\n\t"
  18769. #ifdef WOLFSSL_KEIL
  18770. "muls r5, r6, r5\n\t"
  18771. #elif defined(__clang__)
  18772. "muls r5, r6\n\t"
  18773. #else
  18774. "mul r5, r6\n\t"
  18775. #endif
  18776. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18777. "lsrs r6, r5, #16\n\t"
  18778. #else
  18779. "lsr r6, r5, #16\n\t"
  18780. #endif
  18781. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18782. "lsls r5, r5, #16\n\t"
  18783. #else
  18784. "lsl r5, r5, #16\n\t"
  18785. #endif
  18786. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18787. "adds r2, r2, r5\n\t"
  18788. #else
  18789. "add r2, r2, r5\n\t"
  18790. #endif
  18791. #ifdef WOLFSSL_KEIL
  18792. "adcs r3, r3, r6\n\t"
  18793. #elif defined(__clang__)
  18794. "adcs r3, r6\n\t"
  18795. #else
  18796. "adc r3, r6\n\t"
  18797. #endif
  18798. #ifdef WOLFSSL_KEIL
  18799. "adcs r4, r4, %[r]\n\t"
  18800. #elif defined(__clang__)
  18801. "adcs r4, %[r]\n\t"
  18802. #else
  18803. "adc r4, %[r]\n\t"
  18804. #endif
  18805. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18806. "adds r2, r2, r5\n\t"
  18807. #else
  18808. "add r2, r2, r5\n\t"
  18809. #endif
  18810. #ifdef WOLFSSL_KEIL
  18811. "adcs r3, r3, r6\n\t"
  18812. #elif defined(__clang__)
  18813. "adcs r3, r6\n\t"
  18814. #else
  18815. "adc r3, r6\n\t"
  18816. #endif
  18817. #ifdef WOLFSSL_KEIL
  18818. "adcs r4, r4, %[r]\n\t"
  18819. #elif defined(__clang__)
  18820. "adcs r4, %[r]\n\t"
  18821. #else
  18822. "adc r4, %[r]\n\t"
  18823. #endif
  18824. "# A[6] * A[6]\n\t"
  18825. "mov r7, r12\n\t"
  18826. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18827. "lsrs r6, r7, #16\n\t"
  18828. #else
  18829. "lsr r6, r7, #16\n\t"
  18830. #endif
  18831. "uxth r5, r7\n\t"
  18832. #ifdef WOLFSSL_KEIL
  18833. "muls r5, r5, r5\n\t"
  18834. #elif defined(__clang__)
  18835. "muls r5, r5\n\t"
  18836. #else
  18837. "mul r5, r5\n\t"
  18838. #endif
  18839. #ifdef WOLFSSL_KEIL
  18840. "muls r6, r6, r6\n\t"
  18841. #elif defined(__clang__)
  18842. "muls r6, r6\n\t"
  18843. #else
  18844. "mul r6, r6\n\t"
  18845. #endif
  18846. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18847. "adds r2, r2, r5\n\t"
  18848. #else
  18849. "add r2, r2, r5\n\t"
  18850. #endif
  18851. #ifdef WOLFSSL_KEIL
  18852. "adcs r3, r3, r6\n\t"
  18853. #elif defined(__clang__)
  18854. "adcs r3, r6\n\t"
  18855. #else
  18856. "adc r3, r6\n\t"
  18857. #endif
  18858. #ifdef WOLFSSL_KEIL
  18859. "adcs r4, r4, %[r]\n\t"
  18860. #elif defined(__clang__)
  18861. "adcs r4, %[r]\n\t"
  18862. #else
  18863. "adc r4, %[r]\n\t"
  18864. #endif
  18865. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18866. "lsrs r6, r7, #16\n\t"
  18867. #else
  18868. "lsr r6, r7, #16\n\t"
  18869. #endif
  18870. "uxth r5, r7\n\t"
  18871. #ifdef WOLFSSL_KEIL
  18872. "muls r5, r6, r5\n\t"
  18873. #elif defined(__clang__)
  18874. "muls r5, r6\n\t"
  18875. #else
  18876. "mul r5, r6\n\t"
  18877. #endif
  18878. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18879. "lsrs r6, r5, #15\n\t"
  18880. #else
  18881. "lsr r6, r5, #15\n\t"
  18882. #endif
  18883. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18884. "lsls r5, r5, #17\n\t"
  18885. #else
  18886. "lsl r5, r5, #17\n\t"
  18887. #endif
  18888. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18889. "adds r2, r2, r5\n\t"
  18890. #else
  18891. "add r2, r2, r5\n\t"
  18892. #endif
  18893. #ifdef WOLFSSL_KEIL
  18894. "adcs r3, r3, r6\n\t"
  18895. #elif defined(__clang__)
  18896. "adcs r3, r6\n\t"
  18897. #else
  18898. "adc r3, r6\n\t"
  18899. #endif
  18900. #ifdef WOLFSSL_KEIL
  18901. "adcs r4, r4, %[r]\n\t"
  18902. #elif defined(__clang__)
  18903. "adcs r4, %[r]\n\t"
  18904. #else
  18905. "adc r4, %[r]\n\t"
  18906. #endif
  18907. "mov %[r], r8\n\t"
  18908. "str r2, [%[r], #48]\n\t"
  18909. "movs %[r], #0\n\t"
  18910. "# A[7] * A[6]\n\t"
  18911. "movs r2, #0\n\t"
  18912. "mov %[a], r9\n\t"
  18913. "mov %[a], lr\n\t"
  18914. "uxth r5, %[a]\n\t"
  18915. "uxth r6, r7\n\t"
  18916. #ifdef WOLFSSL_KEIL
  18917. "muls r6, r5, r6\n\t"
  18918. #elif defined(__clang__)
  18919. "muls r6, r5\n\t"
  18920. #else
  18921. "mul r6, r5\n\t"
  18922. #endif
  18923. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18924. "adds r3, r3, r6\n\t"
  18925. #else
  18926. "add r3, r3, r6\n\t"
  18927. #endif
  18928. #ifdef WOLFSSL_KEIL
  18929. "adcs r4, r4, %[r]\n\t"
  18930. #elif defined(__clang__)
  18931. "adcs r4, %[r]\n\t"
  18932. #else
  18933. "adc r4, %[r]\n\t"
  18934. #endif
  18935. #ifdef WOLFSSL_KEIL
  18936. "adcs r2, r2, %[r]\n\t"
  18937. #elif defined(__clang__)
  18938. "adcs r2, %[r]\n\t"
  18939. #else
  18940. "adc r2, %[r]\n\t"
  18941. #endif
  18942. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18943. "adds r3, r3, r6\n\t"
  18944. #else
  18945. "add r3, r3, r6\n\t"
  18946. #endif
  18947. #ifdef WOLFSSL_KEIL
  18948. "adcs r4, r4, %[r]\n\t"
  18949. #elif defined(__clang__)
  18950. "adcs r4, %[r]\n\t"
  18951. #else
  18952. "adc r4, %[r]\n\t"
  18953. #endif
  18954. #ifdef WOLFSSL_KEIL
  18955. "adcs r2, r2, %[r]\n\t"
  18956. #elif defined(__clang__)
  18957. "adcs r2, %[r]\n\t"
  18958. #else
  18959. "adc r2, %[r]\n\t"
  18960. #endif
  18961. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18962. "lsrs r6, r7, #16\n\t"
  18963. #else
  18964. "lsr r6, r7, #16\n\t"
  18965. #endif
  18966. #ifdef WOLFSSL_KEIL
  18967. "muls r5, r6, r5\n\t"
  18968. #elif defined(__clang__)
  18969. "muls r5, r6\n\t"
  18970. #else
  18971. "mul r5, r6\n\t"
  18972. #endif
  18973. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18974. "lsrs r6, r5, #16\n\t"
  18975. #else
  18976. "lsr r6, r5, #16\n\t"
  18977. #endif
  18978. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18979. "lsls r5, r5, #16\n\t"
  18980. #else
  18981. "lsl r5, r5, #16\n\t"
  18982. #endif
  18983. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18984. "adds r3, r3, r5\n\t"
  18985. #else
  18986. "add r3, r3, r5\n\t"
  18987. #endif
  18988. #ifdef WOLFSSL_KEIL
  18989. "adcs r4, r4, r6\n\t"
  18990. #elif defined(__clang__)
  18991. "adcs r4, r6\n\t"
  18992. #else
  18993. "adc r4, r6\n\t"
  18994. #endif
  18995. #ifdef WOLFSSL_KEIL
  18996. "adcs r2, r2, %[r]\n\t"
  18997. #elif defined(__clang__)
  18998. "adcs r2, %[r]\n\t"
  18999. #else
  19000. "adc r2, %[r]\n\t"
  19001. #endif
  19002. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19003. "adds r3, r3, r5\n\t"
  19004. #else
  19005. "add r3, r3, r5\n\t"
  19006. #endif
  19007. #ifdef WOLFSSL_KEIL
  19008. "adcs r4, r4, r6\n\t"
  19009. #elif defined(__clang__)
  19010. "adcs r4, r6\n\t"
  19011. #else
  19012. "adc r4, r6\n\t"
  19013. #endif
  19014. #ifdef WOLFSSL_KEIL
  19015. "adcs r2, r2, %[r]\n\t"
  19016. #elif defined(__clang__)
  19017. "adcs r2, %[r]\n\t"
  19018. #else
  19019. "adc r2, %[r]\n\t"
  19020. #endif
  19021. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19022. "lsrs r5, %[a], #16\n\t"
  19023. #else
  19024. "lsr r5, %[a], #16\n\t"
  19025. #endif
  19026. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19027. "lsrs r6, r7, #16\n\t"
  19028. #else
  19029. "lsr r6, r7, #16\n\t"
  19030. #endif
  19031. #ifdef WOLFSSL_KEIL
  19032. "muls r6, r5, r6\n\t"
  19033. #elif defined(__clang__)
  19034. "muls r6, r5\n\t"
  19035. #else
  19036. "mul r6, r5\n\t"
  19037. #endif
  19038. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19039. "adds r4, r4, r6\n\t"
  19040. #else
  19041. "add r4, r4, r6\n\t"
  19042. #endif
  19043. #ifdef WOLFSSL_KEIL
  19044. "adcs r2, r2, %[r]\n\t"
  19045. #elif defined(__clang__)
  19046. "adcs r2, %[r]\n\t"
  19047. #else
  19048. "adc r2, %[r]\n\t"
  19049. #endif
  19050. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19051. "adds r4, r4, r6\n\t"
  19052. #else
  19053. "add r4, r4, r6\n\t"
  19054. #endif
  19055. #ifdef WOLFSSL_KEIL
  19056. "adcs r2, r2, %[r]\n\t"
  19057. #elif defined(__clang__)
  19058. "adcs r2, %[r]\n\t"
  19059. #else
  19060. "adc r2, %[r]\n\t"
  19061. #endif
  19062. "uxth r6, r7\n\t"
  19063. #ifdef WOLFSSL_KEIL
  19064. "muls r5, r6, r5\n\t"
  19065. #elif defined(__clang__)
  19066. "muls r5, r6\n\t"
  19067. #else
  19068. "mul r5, r6\n\t"
  19069. #endif
  19070. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19071. "lsrs r6, r5, #16\n\t"
  19072. #else
  19073. "lsr r6, r5, #16\n\t"
  19074. #endif
  19075. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19076. "lsls r5, r5, #16\n\t"
  19077. #else
  19078. "lsl r5, r5, #16\n\t"
  19079. #endif
  19080. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19081. "adds r3, r3, r5\n\t"
  19082. #else
  19083. "add r3, r3, r5\n\t"
  19084. #endif
  19085. #ifdef WOLFSSL_KEIL
  19086. "adcs r4, r4, r6\n\t"
  19087. #elif defined(__clang__)
  19088. "adcs r4, r6\n\t"
  19089. #else
  19090. "adc r4, r6\n\t"
  19091. #endif
  19092. #ifdef WOLFSSL_KEIL
  19093. "adcs r2, r2, %[r]\n\t"
  19094. #elif defined(__clang__)
  19095. "adcs r2, %[r]\n\t"
  19096. #else
  19097. "adc r2, %[r]\n\t"
  19098. #endif
  19099. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19100. "adds r3, r3, r5\n\t"
  19101. #else
  19102. "add r3, r3, r5\n\t"
  19103. #endif
  19104. #ifdef WOLFSSL_KEIL
  19105. "adcs r4, r4, r6\n\t"
  19106. #elif defined(__clang__)
  19107. "adcs r4, r6\n\t"
  19108. #else
  19109. "adc r4, r6\n\t"
  19110. #endif
  19111. #ifdef WOLFSSL_KEIL
  19112. "adcs r2, r2, %[r]\n\t"
  19113. #elif defined(__clang__)
  19114. "adcs r2, %[r]\n\t"
  19115. #else
  19116. "adc r2, %[r]\n\t"
  19117. #endif
  19118. "mov %[r], r8\n\t"
  19119. "str r3, [%[r], #52]\n\t"
  19120. "movs %[r], #0\n\t"
  19121. "# A[7] * A[7]\n\t"
  19122. "mov %[a], r9\n\t"
  19123. "mov r7, lr\n\t"
  19124. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19125. "lsrs r6, r7, #16\n\t"
  19126. #else
  19127. "lsr r6, r7, #16\n\t"
  19128. #endif
  19129. "uxth r5, r7\n\t"
  19130. #ifdef WOLFSSL_KEIL
  19131. "muls r5, r5, r5\n\t"
  19132. #elif defined(__clang__)
  19133. "muls r5, r5\n\t"
  19134. #else
  19135. "mul r5, r5\n\t"
  19136. #endif
  19137. #ifdef WOLFSSL_KEIL
  19138. "muls r6, r6, r6\n\t"
  19139. #elif defined(__clang__)
  19140. "muls r6, r6\n\t"
  19141. #else
  19142. "mul r6, r6\n\t"
  19143. #endif
  19144. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19145. "adds r4, r4, r5\n\t"
  19146. #else
  19147. "add r4, r4, r5\n\t"
  19148. #endif
  19149. #ifdef WOLFSSL_KEIL
  19150. "adcs r2, r2, r6\n\t"
  19151. #elif defined(__clang__)
  19152. "adcs r2, r6\n\t"
  19153. #else
  19154. "adc r2, r6\n\t"
  19155. #endif
  19156. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19157. "lsrs r6, r7, #16\n\t"
  19158. #else
  19159. "lsr r6, r7, #16\n\t"
  19160. #endif
  19161. "uxth r5, r7\n\t"
  19162. #ifdef WOLFSSL_KEIL
  19163. "muls r5, r6, r5\n\t"
  19164. #elif defined(__clang__)
  19165. "muls r5, r6\n\t"
  19166. #else
  19167. "mul r5, r6\n\t"
  19168. #endif
  19169. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19170. "lsrs r6, r5, #15\n\t"
  19171. #else
  19172. "lsr r6, r5, #15\n\t"
  19173. #endif
  19174. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19175. "lsls r5, r5, #17\n\t"
  19176. #else
  19177. "lsl r5, r5, #17\n\t"
  19178. #endif
  19179. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19180. "adds r4, r4, r5\n\t"
  19181. #else
  19182. "add r4, r4, r5\n\t"
  19183. #endif
  19184. #ifdef WOLFSSL_KEIL
  19185. "adcs r2, r2, r6\n\t"
  19186. #elif defined(__clang__)
  19187. "adcs r2, r6\n\t"
  19188. #else
  19189. "adc r2, r6\n\t"
  19190. #endif
  19191. "mov %[r], r8\n\t"
  19192. "str r4, [%[r], #56]\n\t"
  19193. "str r2, [%[r], #60]\n\t"
  19194. "pop {r2, r3, r4, r5}\n\t"
  19195. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  19196. "pop {r2, r3, r4, r5}\n\t"
  19197. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  19198. : [r] "+l" (r), [a] "+l" (a)
  19199. :
  19200. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr"
  19201. );
  19202. }
  19203. #endif /* !WOLFSSL_SP_LARGE_CODE */
  19204. /* Sub b from a into r. (r = a - b)
  19205. *
  19206. * r A single precision integer.
  19207. * a A single precision integer.
  19208. * b A single precision integer.
  19209. */
  19210. SP_NOINLINE static sp_digit sp_2048_sub_8(sp_digit* r, const sp_digit* a,
  19211. const sp_digit* b)
  19212. {
  19213. __asm__ __volatile__ (
  19214. "ldm %[b]!, {r5, r6}\n\t"
  19215. "ldm %[a]!, {r3, r4}\n\t"
  19216. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19217. "subs r3, r3, r5\n\t"
  19218. #else
  19219. "sub r3, r3, r5\n\t"
  19220. #endif
  19221. #ifdef WOLFSSL_KEIL
  19222. "sbcs r4, r4, r6\n\t"
  19223. #elif defined(__clang__)
  19224. "sbcs r4, r6\n\t"
  19225. #else
  19226. "sbc r4, r6\n\t"
  19227. #endif
  19228. "stm %[r]!, {r3, r4}\n\t"
  19229. "ldm %[b]!, {r5, r6}\n\t"
  19230. "ldm %[a]!, {r3, r4}\n\t"
  19231. #ifdef WOLFSSL_KEIL
  19232. "sbcs r3, r3, r5\n\t"
  19233. #elif defined(__clang__)
  19234. "sbcs r3, r5\n\t"
  19235. #else
  19236. "sbc r3, r5\n\t"
  19237. #endif
  19238. #ifdef WOLFSSL_KEIL
  19239. "sbcs r4, r4, r6\n\t"
  19240. #elif defined(__clang__)
  19241. "sbcs r4, r6\n\t"
  19242. #else
  19243. "sbc r4, r6\n\t"
  19244. #endif
  19245. "stm %[r]!, {r3, r4}\n\t"
  19246. "ldm %[b]!, {r5, r6}\n\t"
  19247. "ldm %[a]!, {r3, r4}\n\t"
  19248. #ifdef WOLFSSL_KEIL
  19249. "sbcs r3, r3, r5\n\t"
  19250. #elif defined(__clang__)
  19251. "sbcs r3, r5\n\t"
  19252. #else
  19253. "sbc r3, r5\n\t"
  19254. #endif
  19255. #ifdef WOLFSSL_KEIL
  19256. "sbcs r4, r4, r6\n\t"
  19257. #elif defined(__clang__)
  19258. "sbcs r4, r6\n\t"
  19259. #else
  19260. "sbc r4, r6\n\t"
  19261. #endif
  19262. "stm %[r]!, {r3, r4}\n\t"
  19263. "ldm %[b]!, {r5, r6}\n\t"
  19264. "ldm %[a]!, {r3, r4}\n\t"
  19265. #ifdef WOLFSSL_KEIL
  19266. "sbcs r3, r3, r5\n\t"
  19267. #elif defined(__clang__)
  19268. "sbcs r3, r5\n\t"
  19269. #else
  19270. "sbc r3, r5\n\t"
  19271. #endif
  19272. #ifdef WOLFSSL_KEIL
  19273. "sbcs r4, r4, r6\n\t"
  19274. #elif defined(__clang__)
  19275. "sbcs r4, r6\n\t"
  19276. #else
  19277. "sbc r4, r6\n\t"
  19278. #endif
  19279. "stm %[r]!, {r3, r4}\n\t"
  19280. #ifdef WOLFSSL_KEIL
  19281. "sbcs %[r], %[r], %[r]\n\t"
  19282. #elif defined(__clang__)
  19283. "sbcs %[r], %[r]\n\t"
  19284. #else
  19285. "sbc %[r], %[r]\n\t"
  19286. #endif
  19287. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  19288. :
  19289. : "memory", "r3", "r4", "r5", "r6"
  19290. );
  19291. return (uint32_t)(size_t)r;
  19292. }
  19293. /* Square a and put result in r. (r = a * a)
  19294. *
  19295. * r A single precision integer.
  19296. * a A single precision integer.
  19297. */
  19298. SP_NOINLINE static void sp_2048_sqr_16(sp_digit* r, const sp_digit* a)
  19299. {
  19300. sp_digit* z0 = r;
  19301. sp_digit* z2 = r + 16;
  19302. sp_digit z1[16];
  19303. sp_digit* a1 = z1;
  19304. sp_digit* zero = z1 + 8;
  19305. sp_digit u;
  19306. sp_digit mask;
  19307. sp_digit* p1;
  19308. sp_digit* p2;
  19309. XMEMSET(zero, 0, sizeof(sp_digit) * 8);
  19310. mask = sp_2048_sub_8(a1, a, &a[8]);
  19311. p1 = (sp_digit*)(((sp_digit)zero & mask ) | ((sp_digit)a1 & (~mask)));
  19312. p2 = (sp_digit*)(((sp_digit)zero & (~mask)) | ((sp_digit)a1 & mask ));
  19313. (void)sp_2048_sub_8(a1, p1, p2);
  19314. sp_2048_sqr_8(z2, &a[8]);
  19315. sp_2048_sqr_8(z0, a);
  19316. sp_2048_sqr_8(z1, a1);
  19317. u = 0;
  19318. u -= sp_2048_sub_in_place_16(z1, z2);
  19319. u -= sp_2048_sub_in_place_16(z1, z0);
  19320. u += sp_2048_sub_in_place_16(r + 8, z1);
  19321. sp_2048_add_word_8(r + 24, r + 24, u);
  19322. }
  19323. /* Sub b from a into r. (r = a - b)
  19324. *
  19325. * r A single precision integer.
  19326. * a A single precision integer.
  19327. * b A single precision integer.
  19328. */
  19329. SP_NOINLINE static sp_digit sp_2048_sub_16(sp_digit* r, const sp_digit* a,
  19330. const sp_digit* b)
  19331. {
  19332. __asm__ __volatile__ (
  19333. "ldm %[b]!, {r5, r6}\n\t"
  19334. "ldm %[a]!, {r3, r4}\n\t"
  19335. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19336. "subs r3, r3, r5\n\t"
  19337. #else
  19338. "sub r3, r3, r5\n\t"
  19339. #endif
  19340. #ifdef WOLFSSL_KEIL
  19341. "sbcs r4, r4, r6\n\t"
  19342. #elif defined(__clang__)
  19343. "sbcs r4, r6\n\t"
  19344. #else
  19345. "sbc r4, r6\n\t"
  19346. #endif
  19347. "stm %[r]!, {r3, r4}\n\t"
  19348. "ldm %[b]!, {r5, r6}\n\t"
  19349. "ldm %[a]!, {r3, r4}\n\t"
  19350. #ifdef WOLFSSL_KEIL
  19351. "sbcs r3, r3, r5\n\t"
  19352. #elif defined(__clang__)
  19353. "sbcs r3, r5\n\t"
  19354. #else
  19355. "sbc r3, r5\n\t"
  19356. #endif
  19357. #ifdef WOLFSSL_KEIL
  19358. "sbcs r4, r4, r6\n\t"
  19359. #elif defined(__clang__)
  19360. "sbcs r4, r6\n\t"
  19361. #else
  19362. "sbc r4, r6\n\t"
  19363. #endif
  19364. "stm %[r]!, {r3, r4}\n\t"
  19365. "ldm %[b]!, {r5, r6}\n\t"
  19366. "ldm %[a]!, {r3, r4}\n\t"
  19367. #ifdef WOLFSSL_KEIL
  19368. "sbcs r3, r3, r5\n\t"
  19369. #elif defined(__clang__)
  19370. "sbcs r3, r5\n\t"
  19371. #else
  19372. "sbc r3, r5\n\t"
  19373. #endif
  19374. #ifdef WOLFSSL_KEIL
  19375. "sbcs r4, r4, r6\n\t"
  19376. #elif defined(__clang__)
  19377. "sbcs r4, r6\n\t"
  19378. #else
  19379. "sbc r4, r6\n\t"
  19380. #endif
  19381. "stm %[r]!, {r3, r4}\n\t"
  19382. "ldm %[b]!, {r5, r6}\n\t"
  19383. "ldm %[a]!, {r3, r4}\n\t"
  19384. #ifdef WOLFSSL_KEIL
  19385. "sbcs r3, r3, r5\n\t"
  19386. #elif defined(__clang__)
  19387. "sbcs r3, r5\n\t"
  19388. #else
  19389. "sbc r3, r5\n\t"
  19390. #endif
  19391. #ifdef WOLFSSL_KEIL
  19392. "sbcs r4, r4, r6\n\t"
  19393. #elif defined(__clang__)
  19394. "sbcs r4, r6\n\t"
  19395. #else
  19396. "sbc r4, r6\n\t"
  19397. #endif
  19398. "stm %[r]!, {r3, r4}\n\t"
  19399. "ldm %[b]!, {r5, r6}\n\t"
  19400. "ldm %[a]!, {r3, r4}\n\t"
  19401. #ifdef WOLFSSL_KEIL
  19402. "sbcs r3, r3, r5\n\t"
  19403. #elif defined(__clang__)
  19404. "sbcs r3, r5\n\t"
  19405. #else
  19406. "sbc r3, r5\n\t"
  19407. #endif
  19408. #ifdef WOLFSSL_KEIL
  19409. "sbcs r4, r4, r6\n\t"
  19410. #elif defined(__clang__)
  19411. "sbcs r4, r6\n\t"
  19412. #else
  19413. "sbc r4, r6\n\t"
  19414. #endif
  19415. "stm %[r]!, {r3, r4}\n\t"
  19416. "ldm %[b]!, {r5, r6}\n\t"
  19417. "ldm %[a]!, {r3, r4}\n\t"
  19418. #ifdef WOLFSSL_KEIL
  19419. "sbcs r3, r3, r5\n\t"
  19420. #elif defined(__clang__)
  19421. "sbcs r3, r5\n\t"
  19422. #else
  19423. "sbc r3, r5\n\t"
  19424. #endif
  19425. #ifdef WOLFSSL_KEIL
  19426. "sbcs r4, r4, r6\n\t"
  19427. #elif defined(__clang__)
  19428. "sbcs r4, r6\n\t"
  19429. #else
  19430. "sbc r4, r6\n\t"
  19431. #endif
  19432. "stm %[r]!, {r3, r4}\n\t"
  19433. "ldm %[b]!, {r5, r6}\n\t"
  19434. "ldm %[a]!, {r3, r4}\n\t"
  19435. #ifdef WOLFSSL_KEIL
  19436. "sbcs r3, r3, r5\n\t"
  19437. #elif defined(__clang__)
  19438. "sbcs r3, r5\n\t"
  19439. #else
  19440. "sbc r3, r5\n\t"
  19441. #endif
  19442. #ifdef WOLFSSL_KEIL
  19443. "sbcs r4, r4, r6\n\t"
  19444. #elif defined(__clang__)
  19445. "sbcs r4, r6\n\t"
  19446. #else
  19447. "sbc r4, r6\n\t"
  19448. #endif
  19449. "stm %[r]!, {r3, r4}\n\t"
  19450. "ldm %[b]!, {r5, r6}\n\t"
  19451. "ldm %[a]!, {r3, r4}\n\t"
  19452. #ifdef WOLFSSL_KEIL
  19453. "sbcs r3, r3, r5\n\t"
  19454. #elif defined(__clang__)
  19455. "sbcs r3, r5\n\t"
  19456. #else
  19457. "sbc r3, r5\n\t"
  19458. #endif
  19459. #ifdef WOLFSSL_KEIL
  19460. "sbcs r4, r4, r6\n\t"
  19461. #elif defined(__clang__)
  19462. "sbcs r4, r6\n\t"
  19463. #else
  19464. "sbc r4, r6\n\t"
  19465. #endif
  19466. "stm %[r]!, {r3, r4}\n\t"
  19467. #ifdef WOLFSSL_KEIL
  19468. "sbcs %[r], %[r], %[r]\n\t"
  19469. #elif defined(__clang__)
  19470. "sbcs %[r], %[r]\n\t"
  19471. #else
  19472. "sbc %[r], %[r]\n\t"
  19473. #endif
  19474. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  19475. :
  19476. : "memory", "r3", "r4", "r5", "r6"
  19477. );
  19478. return (uint32_t)(size_t)r;
  19479. }
  19480. /* Square a and put result in r. (r = a * a)
  19481. *
  19482. * r A single precision integer.
  19483. * a A single precision integer.
  19484. */
  19485. SP_NOINLINE static void sp_2048_sqr_32(sp_digit* r, const sp_digit* a)
  19486. {
  19487. sp_digit* z0 = r;
  19488. sp_digit* z2 = r + 32;
  19489. sp_digit z1[32];
  19490. sp_digit* a1 = z1;
  19491. sp_digit* zero = z1 + 16;
  19492. sp_digit u;
  19493. sp_digit mask;
  19494. sp_digit* p1;
  19495. sp_digit* p2;
  19496. XMEMSET(zero, 0, sizeof(sp_digit) * 16);
  19497. mask = sp_2048_sub_16(a1, a, &a[16]);
  19498. p1 = (sp_digit*)(((sp_digit)zero & mask ) | ((sp_digit)a1 & (~mask)));
  19499. p2 = (sp_digit*)(((sp_digit)zero & (~mask)) | ((sp_digit)a1 & mask ));
  19500. (void)sp_2048_sub_16(a1, p1, p2);
  19501. sp_2048_sqr_16(z2, &a[16]);
  19502. sp_2048_sqr_16(z0, a);
  19503. sp_2048_sqr_16(z1, a1);
  19504. u = 0;
  19505. u -= sp_2048_sub_in_place_32(z1, z2);
  19506. u -= sp_2048_sub_in_place_32(z1, z0);
  19507. u += sp_2048_sub_in_place_32(r + 16, z1);
  19508. sp_2048_add_word_16(r + 48, r + 48, u);
  19509. }
  19510. /* Sub b from a into r. (r = a - b)
  19511. *
  19512. * r A single precision integer.
  19513. * a A single precision integer.
  19514. * b A single precision integer.
  19515. */
  19516. SP_NOINLINE static sp_digit sp_2048_sub_32(sp_digit* r, const sp_digit* a,
  19517. const sp_digit* b)
  19518. {
  19519. __asm__ __volatile__ (
  19520. "ldm %[b]!, {r5, r6}\n\t"
  19521. "ldm %[a]!, {r3, r4}\n\t"
  19522. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19523. "subs r3, r3, r5\n\t"
  19524. #else
  19525. "sub r3, r3, r5\n\t"
  19526. #endif
  19527. #ifdef WOLFSSL_KEIL
  19528. "sbcs r4, r4, r6\n\t"
  19529. #elif defined(__clang__)
  19530. "sbcs r4, r6\n\t"
  19531. #else
  19532. "sbc r4, r6\n\t"
  19533. #endif
  19534. "stm %[r]!, {r3, r4}\n\t"
  19535. "ldm %[b]!, {r5, r6}\n\t"
  19536. "ldm %[a]!, {r3, r4}\n\t"
  19537. #ifdef WOLFSSL_KEIL
  19538. "sbcs r3, r3, r5\n\t"
  19539. #elif defined(__clang__)
  19540. "sbcs r3, r5\n\t"
  19541. #else
  19542. "sbc r3, r5\n\t"
  19543. #endif
  19544. #ifdef WOLFSSL_KEIL
  19545. "sbcs r4, r4, r6\n\t"
  19546. #elif defined(__clang__)
  19547. "sbcs r4, r6\n\t"
  19548. #else
  19549. "sbc r4, r6\n\t"
  19550. #endif
  19551. "stm %[r]!, {r3, r4}\n\t"
  19552. "ldm %[b]!, {r5, r6}\n\t"
  19553. "ldm %[a]!, {r3, r4}\n\t"
  19554. #ifdef WOLFSSL_KEIL
  19555. "sbcs r3, r3, r5\n\t"
  19556. #elif defined(__clang__)
  19557. "sbcs r3, r5\n\t"
  19558. #else
  19559. "sbc r3, r5\n\t"
  19560. #endif
  19561. #ifdef WOLFSSL_KEIL
  19562. "sbcs r4, r4, r6\n\t"
  19563. #elif defined(__clang__)
  19564. "sbcs r4, r6\n\t"
  19565. #else
  19566. "sbc r4, r6\n\t"
  19567. #endif
  19568. "stm %[r]!, {r3, r4}\n\t"
  19569. "ldm %[b]!, {r5, r6}\n\t"
  19570. "ldm %[a]!, {r3, r4}\n\t"
  19571. #ifdef WOLFSSL_KEIL
  19572. "sbcs r3, r3, r5\n\t"
  19573. #elif defined(__clang__)
  19574. "sbcs r3, r5\n\t"
  19575. #else
  19576. "sbc r3, r5\n\t"
  19577. #endif
  19578. #ifdef WOLFSSL_KEIL
  19579. "sbcs r4, r4, r6\n\t"
  19580. #elif defined(__clang__)
  19581. "sbcs r4, r6\n\t"
  19582. #else
  19583. "sbc r4, r6\n\t"
  19584. #endif
  19585. "stm %[r]!, {r3, r4}\n\t"
  19586. "ldm %[b]!, {r5, r6}\n\t"
  19587. "ldm %[a]!, {r3, r4}\n\t"
  19588. #ifdef WOLFSSL_KEIL
  19589. "sbcs r3, r3, r5\n\t"
  19590. #elif defined(__clang__)
  19591. "sbcs r3, r5\n\t"
  19592. #else
  19593. "sbc r3, r5\n\t"
  19594. #endif
  19595. #ifdef WOLFSSL_KEIL
  19596. "sbcs r4, r4, r6\n\t"
  19597. #elif defined(__clang__)
  19598. "sbcs r4, r6\n\t"
  19599. #else
  19600. "sbc r4, r6\n\t"
  19601. #endif
  19602. "stm %[r]!, {r3, r4}\n\t"
  19603. "ldm %[b]!, {r5, r6}\n\t"
  19604. "ldm %[a]!, {r3, r4}\n\t"
  19605. #ifdef WOLFSSL_KEIL
  19606. "sbcs r3, r3, r5\n\t"
  19607. #elif defined(__clang__)
  19608. "sbcs r3, r5\n\t"
  19609. #else
  19610. "sbc r3, r5\n\t"
  19611. #endif
  19612. #ifdef WOLFSSL_KEIL
  19613. "sbcs r4, r4, r6\n\t"
  19614. #elif defined(__clang__)
  19615. "sbcs r4, r6\n\t"
  19616. #else
  19617. "sbc r4, r6\n\t"
  19618. #endif
  19619. "stm %[r]!, {r3, r4}\n\t"
  19620. "ldm %[b]!, {r5, r6}\n\t"
  19621. "ldm %[a]!, {r3, r4}\n\t"
  19622. #ifdef WOLFSSL_KEIL
  19623. "sbcs r3, r3, r5\n\t"
  19624. #elif defined(__clang__)
  19625. "sbcs r3, r5\n\t"
  19626. #else
  19627. "sbc r3, r5\n\t"
  19628. #endif
  19629. #ifdef WOLFSSL_KEIL
  19630. "sbcs r4, r4, r6\n\t"
  19631. #elif defined(__clang__)
  19632. "sbcs r4, r6\n\t"
  19633. #else
  19634. "sbc r4, r6\n\t"
  19635. #endif
  19636. "stm %[r]!, {r3, r4}\n\t"
  19637. "ldm %[b]!, {r5, r6}\n\t"
  19638. "ldm %[a]!, {r3, r4}\n\t"
  19639. #ifdef WOLFSSL_KEIL
  19640. "sbcs r3, r3, r5\n\t"
  19641. #elif defined(__clang__)
  19642. "sbcs r3, r5\n\t"
  19643. #else
  19644. "sbc r3, r5\n\t"
  19645. #endif
  19646. #ifdef WOLFSSL_KEIL
  19647. "sbcs r4, r4, r6\n\t"
  19648. #elif defined(__clang__)
  19649. "sbcs r4, r6\n\t"
  19650. #else
  19651. "sbc r4, r6\n\t"
  19652. #endif
  19653. "stm %[r]!, {r3, r4}\n\t"
  19654. "ldm %[b]!, {r5, r6}\n\t"
  19655. "ldm %[a]!, {r3, r4}\n\t"
  19656. #ifdef WOLFSSL_KEIL
  19657. "sbcs r3, r3, r5\n\t"
  19658. #elif defined(__clang__)
  19659. "sbcs r3, r5\n\t"
  19660. #else
  19661. "sbc r3, r5\n\t"
  19662. #endif
  19663. #ifdef WOLFSSL_KEIL
  19664. "sbcs r4, r4, r6\n\t"
  19665. #elif defined(__clang__)
  19666. "sbcs r4, r6\n\t"
  19667. #else
  19668. "sbc r4, r6\n\t"
  19669. #endif
  19670. "stm %[r]!, {r3, r4}\n\t"
  19671. "ldm %[b]!, {r5, r6}\n\t"
  19672. "ldm %[a]!, {r3, r4}\n\t"
  19673. #ifdef WOLFSSL_KEIL
  19674. "sbcs r3, r3, r5\n\t"
  19675. #elif defined(__clang__)
  19676. "sbcs r3, r5\n\t"
  19677. #else
  19678. "sbc r3, r5\n\t"
  19679. #endif
  19680. #ifdef WOLFSSL_KEIL
  19681. "sbcs r4, r4, r6\n\t"
  19682. #elif defined(__clang__)
  19683. "sbcs r4, r6\n\t"
  19684. #else
  19685. "sbc r4, r6\n\t"
  19686. #endif
  19687. "stm %[r]!, {r3, r4}\n\t"
  19688. "ldm %[b]!, {r5, r6}\n\t"
  19689. "ldm %[a]!, {r3, r4}\n\t"
  19690. #ifdef WOLFSSL_KEIL
  19691. "sbcs r3, r3, r5\n\t"
  19692. #elif defined(__clang__)
  19693. "sbcs r3, r5\n\t"
  19694. #else
  19695. "sbc r3, r5\n\t"
  19696. #endif
  19697. #ifdef WOLFSSL_KEIL
  19698. "sbcs r4, r4, r6\n\t"
  19699. #elif defined(__clang__)
  19700. "sbcs r4, r6\n\t"
  19701. #else
  19702. "sbc r4, r6\n\t"
  19703. #endif
  19704. "stm %[r]!, {r3, r4}\n\t"
  19705. "ldm %[b]!, {r5, r6}\n\t"
  19706. "ldm %[a]!, {r3, r4}\n\t"
  19707. #ifdef WOLFSSL_KEIL
  19708. "sbcs r3, r3, r5\n\t"
  19709. #elif defined(__clang__)
  19710. "sbcs r3, r5\n\t"
  19711. #else
  19712. "sbc r3, r5\n\t"
  19713. #endif
  19714. #ifdef WOLFSSL_KEIL
  19715. "sbcs r4, r4, r6\n\t"
  19716. #elif defined(__clang__)
  19717. "sbcs r4, r6\n\t"
  19718. #else
  19719. "sbc r4, r6\n\t"
  19720. #endif
  19721. "stm %[r]!, {r3, r4}\n\t"
  19722. "ldm %[b]!, {r5, r6}\n\t"
  19723. "ldm %[a]!, {r3, r4}\n\t"
  19724. #ifdef WOLFSSL_KEIL
  19725. "sbcs r3, r3, r5\n\t"
  19726. #elif defined(__clang__)
  19727. "sbcs r3, r5\n\t"
  19728. #else
  19729. "sbc r3, r5\n\t"
  19730. #endif
  19731. #ifdef WOLFSSL_KEIL
  19732. "sbcs r4, r4, r6\n\t"
  19733. #elif defined(__clang__)
  19734. "sbcs r4, r6\n\t"
  19735. #else
  19736. "sbc r4, r6\n\t"
  19737. #endif
  19738. "stm %[r]!, {r3, r4}\n\t"
  19739. "ldm %[b]!, {r5, r6}\n\t"
  19740. "ldm %[a]!, {r3, r4}\n\t"
  19741. #ifdef WOLFSSL_KEIL
  19742. "sbcs r3, r3, r5\n\t"
  19743. #elif defined(__clang__)
  19744. "sbcs r3, r5\n\t"
  19745. #else
  19746. "sbc r3, r5\n\t"
  19747. #endif
  19748. #ifdef WOLFSSL_KEIL
  19749. "sbcs r4, r4, r6\n\t"
  19750. #elif defined(__clang__)
  19751. "sbcs r4, r6\n\t"
  19752. #else
  19753. "sbc r4, r6\n\t"
  19754. #endif
  19755. "stm %[r]!, {r3, r4}\n\t"
  19756. "ldm %[b]!, {r5, r6}\n\t"
  19757. "ldm %[a]!, {r3, r4}\n\t"
  19758. #ifdef WOLFSSL_KEIL
  19759. "sbcs r3, r3, r5\n\t"
  19760. #elif defined(__clang__)
  19761. "sbcs r3, r5\n\t"
  19762. #else
  19763. "sbc r3, r5\n\t"
  19764. #endif
  19765. #ifdef WOLFSSL_KEIL
  19766. "sbcs r4, r4, r6\n\t"
  19767. #elif defined(__clang__)
  19768. "sbcs r4, r6\n\t"
  19769. #else
  19770. "sbc r4, r6\n\t"
  19771. #endif
  19772. "stm %[r]!, {r3, r4}\n\t"
  19773. "ldm %[b]!, {r5, r6}\n\t"
  19774. "ldm %[a]!, {r3, r4}\n\t"
  19775. #ifdef WOLFSSL_KEIL
  19776. "sbcs r3, r3, r5\n\t"
  19777. #elif defined(__clang__)
  19778. "sbcs r3, r5\n\t"
  19779. #else
  19780. "sbc r3, r5\n\t"
  19781. #endif
  19782. #ifdef WOLFSSL_KEIL
  19783. "sbcs r4, r4, r6\n\t"
  19784. #elif defined(__clang__)
  19785. "sbcs r4, r6\n\t"
  19786. #else
  19787. "sbc r4, r6\n\t"
  19788. #endif
  19789. "stm %[r]!, {r3, r4}\n\t"
  19790. #ifdef WOLFSSL_KEIL
  19791. "sbcs %[r], %[r], %[r]\n\t"
  19792. #elif defined(__clang__)
  19793. "sbcs %[r], %[r]\n\t"
  19794. #else
  19795. "sbc %[r], %[r]\n\t"
  19796. #endif
  19797. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  19798. :
  19799. : "memory", "r3", "r4", "r5", "r6"
  19800. );
  19801. return (uint32_t)(size_t)r;
  19802. }
  19803. /* Square a and put result in r. (r = a * a)
  19804. *
  19805. * r A single precision integer.
  19806. * a A single precision integer.
  19807. */
  19808. SP_NOINLINE static void sp_2048_sqr_64(sp_digit* r, const sp_digit* a)
  19809. {
  19810. sp_digit* z0 = r;
  19811. sp_digit* z2 = r + 64;
  19812. sp_digit z1[64];
  19813. sp_digit* a1 = z1;
  19814. sp_digit* zero = z1 + 32;
  19815. sp_digit u;
  19816. sp_digit mask;
  19817. sp_digit* p1;
  19818. sp_digit* p2;
  19819. XMEMSET(zero, 0, sizeof(sp_digit) * 32);
  19820. mask = sp_2048_sub_32(a1, a, &a[32]);
  19821. p1 = (sp_digit*)(((sp_digit)zero & mask ) | ((sp_digit)a1 & (~mask)));
  19822. p2 = (sp_digit*)(((sp_digit)zero & (~mask)) | ((sp_digit)a1 & mask ));
  19823. (void)sp_2048_sub_32(a1, p1, p2);
  19824. sp_2048_sqr_32(z2, &a[32]);
  19825. sp_2048_sqr_32(z0, a);
  19826. sp_2048_sqr_32(z1, a1);
  19827. u = 0;
  19828. u -= sp_2048_sub_in_place_64(z1, z2);
  19829. u -= sp_2048_sub_in_place_64(z1, z0);
  19830. u += sp_2048_sub_in_place_64(r + 32, z1);
  19831. sp_2048_add_word_32(r + 96, r + 96, u);
  19832. }
  19833. #endif /* !WOLFSSL_SP_SMALL */
  19834. #ifdef WOLFSSL_SP_SMALL
  19835. /* Add b to a into r. (r = a + b)
  19836. *
  19837. * r A single precision integer.
  19838. * a A single precision integer.
  19839. * b A single precision integer.
  19840. */
  19841. SP_NOINLINE static sp_digit sp_2048_add_64(sp_digit* r, const sp_digit* a,
  19842. const sp_digit* b)
  19843. {
  19844. __asm__ __volatile__ (
  19845. "movs r6, %[a]\n\t"
  19846. "movs r7, #0\n\t"
  19847. "movs r3, #0\n\t"
  19848. "movs r4, #0xff\n\t"
  19849. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19850. "adds r4, r4, #1\n\t"
  19851. #else
  19852. "add r4, r4, #1\n\t"
  19853. #endif
  19854. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19855. "subs r7, r7, #1\n\t"
  19856. #else
  19857. "sub r7, r7, #1\n\t"
  19858. #endif
  19859. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19860. "adds r6, r6, r4\n\t"
  19861. #else
  19862. "add r6, r6, r4\n\t"
  19863. #endif
  19864. "\n"
  19865. "L_sp_2048_add_64_word_%=:\n\t"
  19866. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19867. "adds r3, r3, r7\n\t"
  19868. #else
  19869. "add r3, r3, r7\n\t"
  19870. #endif
  19871. "ldr r4, [%[a]]\n\t"
  19872. "ldr r5, [%[b]]\n\t"
  19873. #ifdef WOLFSSL_KEIL
  19874. "adcs r4, r4, r5\n\t"
  19875. #elif defined(__clang__)
  19876. "adcs r4, r5\n\t"
  19877. #else
  19878. "adc r4, r5\n\t"
  19879. #endif
  19880. "str r4, [%[r]]\n\t"
  19881. "movs r3, #0\n\t"
  19882. #ifdef WOLFSSL_KEIL
  19883. "adcs r3, r3, r3\n\t"
  19884. #elif defined(__clang__)
  19885. "adcs r3, r3\n\t"
  19886. #else
  19887. "adc r3, r3\n\t"
  19888. #endif
  19889. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19890. "adds %[a], %[a], #4\n\t"
  19891. #else
  19892. "add %[a], %[a], #4\n\t"
  19893. #endif
  19894. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19895. "adds %[b], %[b], #4\n\t"
  19896. #else
  19897. "add %[b], %[b], #4\n\t"
  19898. #endif
  19899. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19900. "adds %[r], %[r], #4\n\t"
  19901. #else
  19902. "add %[r], %[r], #4\n\t"
  19903. #endif
  19904. "cmp %[a], r6\n\t"
  19905. "bne L_sp_2048_add_64_word_%=\n\t"
  19906. "movs %[r], r3\n\t"
  19907. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  19908. :
  19909. : "memory", "r3", "r4", "r5", "r6", "r7"
  19910. );
  19911. return (uint32_t)(size_t)r;
  19912. }
  19913. #endif /* WOLFSSL_SP_SMALL */
  19914. #ifdef WOLFSSL_SP_SMALL
  19915. /* Sub b from a into a. (a -= b)
  19916. *
  19917. * a A single precision integer.
  19918. * b A single precision integer.
  19919. */
  19920. SP_NOINLINE static sp_digit sp_2048_sub_in_place_64(sp_digit* a,
  19921. const sp_digit* b)
  19922. {
  19923. __asm__ __volatile__ (
  19924. "movs r7, %[a]\n\t"
  19925. "movs r2, #0\n\t"
  19926. "movs r5, #0xff\n\t"
  19927. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19928. "adds r5, r5, #1\n\t"
  19929. #else
  19930. "add r5, r5, #1\n\t"
  19931. #endif
  19932. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19933. "adds r7, r7, r5\n\t"
  19934. #else
  19935. "add r7, r7, r5\n\t"
  19936. #endif
  19937. "\n"
  19938. "L_sp_2048_sub_in_place_64_words_%=:\n\t"
  19939. "movs r5, #0\n\t"
  19940. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19941. "subs r5, r5, r2\n\t"
  19942. #else
  19943. "sub r5, r5, r2\n\t"
  19944. #endif
  19945. "ldr r3, [%[a]]\n\t"
  19946. "ldr r4, [%[a], #4]\n\t"
  19947. "ldr r5, [%[b]]\n\t"
  19948. "ldr r6, [%[b], #4]\n\t"
  19949. #ifdef WOLFSSL_KEIL
  19950. "sbcs r3, r3, r5\n\t"
  19951. #elif defined(__clang__)
  19952. "sbcs r3, r5\n\t"
  19953. #else
  19954. "sbc r3, r5\n\t"
  19955. #endif
  19956. #ifdef WOLFSSL_KEIL
  19957. "sbcs r4, r4, r6\n\t"
  19958. #elif defined(__clang__)
  19959. "sbcs r4, r6\n\t"
  19960. #else
  19961. "sbc r4, r6\n\t"
  19962. #endif
  19963. "str r3, [%[a]]\n\t"
  19964. "str r4, [%[a], #4]\n\t"
  19965. #ifdef WOLFSSL_KEIL
  19966. "sbcs r2, r2, r2\n\t"
  19967. #elif defined(__clang__)
  19968. "sbcs r2, r2\n\t"
  19969. #else
  19970. "sbc r2, r2\n\t"
  19971. #endif
  19972. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19973. "adds %[a], %[a], #8\n\t"
  19974. #else
  19975. "add %[a], %[a], #8\n\t"
  19976. #endif
  19977. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19978. "adds %[b], %[b], #8\n\t"
  19979. #else
  19980. "add %[b], %[b], #8\n\t"
  19981. #endif
  19982. "cmp %[a], r7\n\t"
  19983. "bne L_sp_2048_sub_in_place_64_words_%=\n\t"
  19984. "movs %[a], r2\n\t"
  19985. : [a] "+l" (a), [b] "+l" (b)
  19986. :
  19987. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  19988. );
  19989. return (uint32_t)(size_t)a;
  19990. }
  19991. #endif /* WOLFSSL_SP_SMALL */
  19992. #ifdef WOLFSSL_SP_SMALL
  19993. /* Multiply a and b into r. (r = a * b)
  19994. *
  19995. * r A single precision integer.
  19996. * a A single precision integer.
  19997. * b A single precision integer.
  19998. */
  19999. SP_NOINLINE static void sp_2048_mul_64(sp_digit* r, const sp_digit* a,
  20000. const sp_digit* b)
  20001. {
  20002. sp_digit t[64 * 2];
  20003. sp_digit* tmp = t;
  20004. __asm__ __volatile__ (
  20005. "movs r3, #0\n\t"
  20006. "movs r4, #0\n\t"
  20007. "mov r8, r3\n\t"
  20008. "mov r11, %[tmp]\n\t"
  20009. "mov r9, %[a]\n\t"
  20010. "mov r10, %[b]\n\t"
  20011. "movs r6, #0xff\n\t"
  20012. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20013. "adds r6, r6, #1\n\t"
  20014. #else
  20015. "add r6, r6, #1\n\t"
  20016. #endif
  20017. "add r6, r6, r9\n\t"
  20018. "mov r12, r6\n\t"
  20019. "\n"
  20020. "L_sp_2048_mul_64_words_%=:\n\t"
  20021. "movs %[tmp], #0\n\t"
  20022. "movs r5, #0\n\t"
  20023. "movs r6, #0xfc\n\t"
  20024. "mov %[a], r8\n\t"
  20025. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20026. "subs %[a], %[a], r6\n\t"
  20027. #else
  20028. "sub %[a], %[a], r6\n\t"
  20029. #endif
  20030. #ifdef WOLFSSL_KEIL
  20031. "sbcs r6, r6, r6\n\t"
  20032. #elif defined(__clang__)
  20033. "sbcs r6, r6\n\t"
  20034. #else
  20035. "sbc r6, r6\n\t"
  20036. #endif
  20037. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20038. "mvns r6, r6\n\t"
  20039. #else
  20040. "mvn r6, r6\n\t"
  20041. #endif
  20042. #ifdef WOLFSSL_KEIL
  20043. "ands %[a], %[a], r6\n\t"
  20044. #elif defined(__clang__)
  20045. "ands %[a], r6\n\t"
  20046. #else
  20047. "and %[a], r6\n\t"
  20048. #endif
  20049. "mov %[b], r8\n\t"
  20050. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20051. "subs %[b], %[b], %[a]\n\t"
  20052. #else
  20053. "sub %[b], %[b], %[a]\n\t"
  20054. #endif
  20055. "add %[a], %[a], r9\n\t"
  20056. "add %[b], %[b], r10\n\t"
  20057. "\n"
  20058. "L_sp_2048_mul_64_mul_%=:\n\t"
  20059. "# Multiply Start\n\t"
  20060. "ldrh r6, [%[a]]\n\t"
  20061. "ldrh r7, [%[b]]\n\t"
  20062. #ifdef WOLFSSL_KEIL
  20063. "muls r7, r6, r7\n\t"
  20064. #elif defined(__clang__)
  20065. "muls r7, r6\n\t"
  20066. #else
  20067. "mul r7, r6\n\t"
  20068. #endif
  20069. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20070. "adds r3, r3, r7\n\t"
  20071. #else
  20072. "add r3, r3, r7\n\t"
  20073. #endif
  20074. #ifdef WOLFSSL_KEIL
  20075. "adcs r4, r4, %[tmp]\n\t"
  20076. #elif defined(__clang__)
  20077. "adcs r4, %[tmp]\n\t"
  20078. #else
  20079. "adc r4, %[tmp]\n\t"
  20080. #endif
  20081. #ifdef WOLFSSL_KEIL
  20082. "adcs r5, r5, %[tmp]\n\t"
  20083. #elif defined(__clang__)
  20084. "adcs r5, %[tmp]\n\t"
  20085. #else
  20086. "adc r5, %[tmp]\n\t"
  20087. #endif
  20088. "ldr r7, [%[b]]\n\t"
  20089. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20090. "lsrs r7, r7, #16\n\t"
  20091. #else
  20092. "lsr r7, r7, #16\n\t"
  20093. #endif
  20094. #ifdef WOLFSSL_KEIL
  20095. "muls r6, r7, r6\n\t"
  20096. #elif defined(__clang__)
  20097. "muls r6, r7\n\t"
  20098. #else
  20099. "mul r6, r7\n\t"
  20100. #endif
  20101. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20102. "lsrs r7, r6, #16\n\t"
  20103. #else
  20104. "lsr r7, r6, #16\n\t"
  20105. #endif
  20106. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20107. "lsls r6, r6, #16\n\t"
  20108. #else
  20109. "lsl r6, r6, #16\n\t"
  20110. #endif
  20111. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20112. "adds r3, r3, r6\n\t"
  20113. #else
  20114. "add r3, r3, r6\n\t"
  20115. #endif
  20116. #ifdef WOLFSSL_KEIL
  20117. "adcs r4, r4, r7\n\t"
  20118. #elif defined(__clang__)
  20119. "adcs r4, r7\n\t"
  20120. #else
  20121. "adc r4, r7\n\t"
  20122. #endif
  20123. #ifdef WOLFSSL_KEIL
  20124. "adcs r5, r5, %[tmp]\n\t"
  20125. #elif defined(__clang__)
  20126. "adcs r5, %[tmp]\n\t"
  20127. #else
  20128. "adc r5, %[tmp]\n\t"
  20129. #endif
  20130. "ldr r6, [%[a]]\n\t"
  20131. "ldr r7, [%[b]]\n\t"
  20132. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20133. "lsrs r6, r6, #16\n\t"
  20134. #else
  20135. "lsr r6, r6, #16\n\t"
  20136. #endif
  20137. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20138. "lsrs r7, r7, #16\n\t"
  20139. #else
  20140. "lsr r7, r7, #16\n\t"
  20141. #endif
  20142. #ifdef WOLFSSL_KEIL
  20143. "muls r7, r6, r7\n\t"
  20144. #elif defined(__clang__)
  20145. "muls r7, r6\n\t"
  20146. #else
  20147. "mul r7, r6\n\t"
  20148. #endif
  20149. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20150. "adds r4, r4, r7\n\t"
  20151. #else
  20152. "add r4, r4, r7\n\t"
  20153. #endif
  20154. #ifdef WOLFSSL_KEIL
  20155. "adcs r5, r5, %[tmp]\n\t"
  20156. #elif defined(__clang__)
  20157. "adcs r5, %[tmp]\n\t"
  20158. #else
  20159. "adc r5, %[tmp]\n\t"
  20160. #endif
  20161. "ldrh r7, [%[b]]\n\t"
  20162. #ifdef WOLFSSL_KEIL
  20163. "muls r6, r7, r6\n\t"
  20164. #elif defined(__clang__)
  20165. "muls r6, r7\n\t"
  20166. #else
  20167. "mul r6, r7\n\t"
  20168. #endif
  20169. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20170. "lsrs r7, r6, #16\n\t"
  20171. #else
  20172. "lsr r7, r6, #16\n\t"
  20173. #endif
  20174. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20175. "lsls r6, r6, #16\n\t"
  20176. #else
  20177. "lsl r6, r6, #16\n\t"
  20178. #endif
  20179. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20180. "adds r3, r3, r6\n\t"
  20181. #else
  20182. "add r3, r3, r6\n\t"
  20183. #endif
  20184. #ifdef WOLFSSL_KEIL
  20185. "adcs r4, r4, r7\n\t"
  20186. #elif defined(__clang__)
  20187. "adcs r4, r7\n\t"
  20188. #else
  20189. "adc r4, r7\n\t"
  20190. #endif
  20191. #ifdef WOLFSSL_KEIL
  20192. "adcs r5, r5, %[tmp]\n\t"
  20193. #elif defined(__clang__)
  20194. "adcs r5, %[tmp]\n\t"
  20195. #else
  20196. "adc r5, %[tmp]\n\t"
  20197. #endif
  20198. "# Multiply Done\n\t"
  20199. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20200. "adds %[a], %[a], #4\n\t"
  20201. #else
  20202. "add %[a], %[a], #4\n\t"
  20203. #endif
  20204. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20205. "subs %[b], %[b], #4\n\t"
  20206. #else
  20207. "sub %[b], %[b], #4\n\t"
  20208. #endif
  20209. "cmp %[a], r12\n\t"
  20210. "beq L_sp_2048_mul_64_done_mul_%=\n\t"
  20211. "mov r6, r8\n\t"
  20212. "add r6, r6, r9\n\t"
  20213. "cmp %[a], r6\n\t"
  20214. "ble L_sp_2048_mul_64_mul_%=\n\t"
  20215. "\n"
  20216. "L_sp_2048_mul_64_done_mul_%=:\n\t"
  20217. "mov %[tmp], r11\n\t"
  20218. "mov r7, r8\n\t"
  20219. "str r3, [%[tmp], r7]\n\t"
  20220. "movs r3, r4\n\t"
  20221. "movs r4, r5\n\t"
  20222. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20223. "adds r7, r7, #4\n\t"
  20224. #else
  20225. "add r7, r7, #4\n\t"
  20226. #endif
  20227. "mov r8, r7\n\t"
  20228. "movs r6, #0xff\n\t"
  20229. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20230. "adds r6, r6, #0xf9\n\t"
  20231. #else
  20232. "add r6, r6, #0xf9\n\t"
  20233. #endif
  20234. "cmp r7, r6\n\t"
  20235. "ble L_sp_2048_mul_64_words_%=\n\t"
  20236. "str r3, [%[tmp], r7]\n\t"
  20237. "mov %[a], r9\n\t"
  20238. "mov %[b], r10\n\t"
  20239. : [a] "+l" (a), [b] "+l" (b), [tmp] "+l" (tmp)
  20240. :
  20241. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  20242. );
  20243. XMEMCPY(r, t, sizeof(t));
  20244. }
  20245. /* Square a and put result in r. (r = a * a)
  20246. *
  20247. * r A single precision integer.
  20248. * a A single precision integer.
  20249. */
  20250. SP_NOINLINE static void sp_2048_sqr_64(sp_digit* r, const sp_digit* a)
  20251. {
  20252. __asm__ __volatile__ (
  20253. "movs r3, #0\n\t"
  20254. "movs r4, #0\n\t"
  20255. "movs r5, #0\n\t"
  20256. "mov r8, r3\n\t"
  20257. "mov r11, %[r]\n\t"
  20258. "movs r6, #2\n\t"
  20259. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20260. "lsls r6, r6, #8\n\t"
  20261. #else
  20262. "lsl r6, r6, #8\n\t"
  20263. #endif
  20264. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20265. "negs r6, r6\n\t"
  20266. #else
  20267. "neg r6, r6\n\t"
  20268. #endif
  20269. "add sp, sp, r6\n\t"
  20270. "mov r10, sp\n\t"
  20271. "mov r9, %[a]\n\t"
  20272. "\n"
  20273. "L_sp_2048_sqr_64_words_%=:\n\t"
  20274. "movs %[r], #0\n\t"
  20275. "movs r6, #0xfc\n\t"
  20276. "mov %[a], r8\n\t"
  20277. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20278. "subs %[a], %[a], r6\n\t"
  20279. #else
  20280. "sub %[a], %[a], r6\n\t"
  20281. #endif
  20282. #ifdef WOLFSSL_KEIL
  20283. "sbcs r6, r6, r6\n\t"
  20284. #elif defined(__clang__)
  20285. "sbcs r6, r6\n\t"
  20286. #else
  20287. "sbc r6, r6\n\t"
  20288. #endif
  20289. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20290. "mvns r6, r6\n\t"
  20291. #else
  20292. "mvn r6, r6\n\t"
  20293. #endif
  20294. #ifdef WOLFSSL_KEIL
  20295. "ands %[a], %[a], r6\n\t"
  20296. #elif defined(__clang__)
  20297. "ands %[a], r6\n\t"
  20298. #else
  20299. "and %[a], r6\n\t"
  20300. #endif
  20301. "mov r2, r8\n\t"
  20302. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20303. "subs r2, r2, %[a]\n\t"
  20304. #else
  20305. "sub r2, r2, %[a]\n\t"
  20306. #endif
  20307. "add %[a], %[a], r9\n\t"
  20308. "add r2, r2, r9\n\t"
  20309. "\n"
  20310. "L_sp_2048_sqr_64_mul_%=:\n\t"
  20311. "cmp r2, %[a]\n\t"
  20312. "beq L_sp_2048_sqr_64_sqr_%=\n\t"
  20313. "# Multiply * 2: Start\n\t"
  20314. "ldrh r6, [%[a]]\n\t"
  20315. "ldrh r7, [r2]\n\t"
  20316. #ifdef WOLFSSL_KEIL
  20317. "muls r7, r6, r7\n\t"
  20318. #elif defined(__clang__)
  20319. "muls r7, r6\n\t"
  20320. #else
  20321. "mul r7, r6\n\t"
  20322. #endif
  20323. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20324. "adds r3, r3, r7\n\t"
  20325. #else
  20326. "add r3, r3, r7\n\t"
  20327. #endif
  20328. #ifdef WOLFSSL_KEIL
  20329. "adcs r4, r4, %[r]\n\t"
  20330. #elif defined(__clang__)
  20331. "adcs r4, %[r]\n\t"
  20332. #else
  20333. "adc r4, %[r]\n\t"
  20334. #endif
  20335. #ifdef WOLFSSL_KEIL
  20336. "adcs r5, r5, %[r]\n\t"
  20337. #elif defined(__clang__)
  20338. "adcs r5, %[r]\n\t"
  20339. #else
  20340. "adc r5, %[r]\n\t"
  20341. #endif
  20342. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20343. "adds r3, r3, r7\n\t"
  20344. #else
  20345. "add r3, r3, r7\n\t"
  20346. #endif
  20347. #ifdef WOLFSSL_KEIL
  20348. "adcs r4, r4, %[r]\n\t"
  20349. #elif defined(__clang__)
  20350. "adcs r4, %[r]\n\t"
  20351. #else
  20352. "adc r4, %[r]\n\t"
  20353. #endif
  20354. #ifdef WOLFSSL_KEIL
  20355. "adcs r5, r5, %[r]\n\t"
  20356. #elif defined(__clang__)
  20357. "adcs r5, %[r]\n\t"
  20358. #else
  20359. "adc r5, %[r]\n\t"
  20360. #endif
  20361. "ldr r7, [r2]\n\t"
  20362. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20363. "lsrs r7, r7, #16\n\t"
  20364. #else
  20365. "lsr r7, r7, #16\n\t"
  20366. #endif
  20367. #ifdef WOLFSSL_KEIL
  20368. "muls r6, r7, r6\n\t"
  20369. #elif defined(__clang__)
  20370. "muls r6, r7\n\t"
  20371. #else
  20372. "mul r6, r7\n\t"
  20373. #endif
  20374. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20375. "lsrs r7, r6, #16\n\t"
  20376. #else
  20377. "lsr r7, r6, #16\n\t"
  20378. #endif
  20379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20380. "lsls r6, r6, #16\n\t"
  20381. #else
  20382. "lsl r6, r6, #16\n\t"
  20383. #endif
  20384. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20385. "adds r3, r3, r6\n\t"
  20386. #else
  20387. "add r3, r3, r6\n\t"
  20388. #endif
  20389. #ifdef WOLFSSL_KEIL
  20390. "adcs r4, r4, r7\n\t"
  20391. #elif defined(__clang__)
  20392. "adcs r4, r7\n\t"
  20393. #else
  20394. "adc r4, r7\n\t"
  20395. #endif
  20396. #ifdef WOLFSSL_KEIL
  20397. "adcs r5, r5, %[r]\n\t"
  20398. #elif defined(__clang__)
  20399. "adcs r5, %[r]\n\t"
  20400. #else
  20401. "adc r5, %[r]\n\t"
  20402. #endif
  20403. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20404. "adds r3, r3, r6\n\t"
  20405. #else
  20406. "add r3, r3, r6\n\t"
  20407. #endif
  20408. #ifdef WOLFSSL_KEIL
  20409. "adcs r4, r4, r7\n\t"
  20410. #elif defined(__clang__)
  20411. "adcs r4, r7\n\t"
  20412. #else
  20413. "adc r4, r7\n\t"
  20414. #endif
  20415. #ifdef WOLFSSL_KEIL
  20416. "adcs r5, r5, %[r]\n\t"
  20417. #elif defined(__clang__)
  20418. "adcs r5, %[r]\n\t"
  20419. #else
  20420. "adc r5, %[r]\n\t"
  20421. #endif
  20422. "ldr r6, [%[a]]\n\t"
  20423. "ldr r7, [r2]\n\t"
  20424. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20425. "lsrs r6, r6, #16\n\t"
  20426. #else
  20427. "lsr r6, r6, #16\n\t"
  20428. #endif
  20429. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20430. "lsrs r7, r7, #16\n\t"
  20431. #else
  20432. "lsr r7, r7, #16\n\t"
  20433. #endif
  20434. #ifdef WOLFSSL_KEIL
  20435. "muls r7, r6, r7\n\t"
  20436. #elif defined(__clang__)
  20437. "muls r7, r6\n\t"
  20438. #else
  20439. "mul r7, r6\n\t"
  20440. #endif
  20441. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20442. "adds r4, r4, r7\n\t"
  20443. #else
  20444. "add r4, r4, r7\n\t"
  20445. #endif
  20446. #ifdef WOLFSSL_KEIL
  20447. "adcs r5, r5, %[r]\n\t"
  20448. #elif defined(__clang__)
  20449. "adcs r5, %[r]\n\t"
  20450. #else
  20451. "adc r5, %[r]\n\t"
  20452. #endif
  20453. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20454. "adds r4, r4, r7\n\t"
  20455. #else
  20456. "add r4, r4, r7\n\t"
  20457. #endif
  20458. #ifdef WOLFSSL_KEIL
  20459. "adcs r5, r5, %[r]\n\t"
  20460. #elif defined(__clang__)
  20461. "adcs r5, %[r]\n\t"
  20462. #else
  20463. "adc r5, %[r]\n\t"
  20464. #endif
  20465. "ldrh r7, [r2]\n\t"
  20466. #ifdef WOLFSSL_KEIL
  20467. "muls r6, r7, r6\n\t"
  20468. #elif defined(__clang__)
  20469. "muls r6, r7\n\t"
  20470. #else
  20471. "mul r6, r7\n\t"
  20472. #endif
  20473. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20474. "lsrs r7, r6, #16\n\t"
  20475. #else
  20476. "lsr r7, r6, #16\n\t"
  20477. #endif
  20478. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20479. "lsls r6, r6, #16\n\t"
  20480. #else
  20481. "lsl r6, r6, #16\n\t"
  20482. #endif
  20483. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20484. "adds r3, r3, r6\n\t"
  20485. #else
  20486. "add r3, r3, r6\n\t"
  20487. #endif
  20488. #ifdef WOLFSSL_KEIL
  20489. "adcs r4, r4, r7\n\t"
  20490. #elif defined(__clang__)
  20491. "adcs r4, r7\n\t"
  20492. #else
  20493. "adc r4, r7\n\t"
  20494. #endif
  20495. #ifdef WOLFSSL_KEIL
  20496. "adcs r5, r5, %[r]\n\t"
  20497. #elif defined(__clang__)
  20498. "adcs r5, %[r]\n\t"
  20499. #else
  20500. "adc r5, %[r]\n\t"
  20501. #endif
  20502. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20503. "adds r3, r3, r6\n\t"
  20504. #else
  20505. "add r3, r3, r6\n\t"
  20506. #endif
  20507. #ifdef WOLFSSL_KEIL
  20508. "adcs r4, r4, r7\n\t"
  20509. #elif defined(__clang__)
  20510. "adcs r4, r7\n\t"
  20511. #else
  20512. "adc r4, r7\n\t"
  20513. #endif
  20514. #ifdef WOLFSSL_KEIL
  20515. "adcs r5, r5, %[r]\n\t"
  20516. #elif defined(__clang__)
  20517. "adcs r5, %[r]\n\t"
  20518. #else
  20519. "adc r5, %[r]\n\t"
  20520. #endif
  20521. "# Multiply * 2: Done\n\t"
  20522. "bal L_sp_2048_sqr_64_done_sqr_%=\n\t"
  20523. "\n"
  20524. "L_sp_2048_sqr_64_sqr_%=:\n\t"
  20525. "mov r12, r2\n\t"
  20526. "ldr r2, [%[a]]\n\t"
  20527. "# Square: Start\n\t"
  20528. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20529. "lsrs r7, r2, #16\n\t"
  20530. #else
  20531. "lsr r7, r2, #16\n\t"
  20532. #endif
  20533. "uxth r6, r2\n\t"
  20534. #ifdef WOLFSSL_KEIL
  20535. "muls r6, r6, r6\n\t"
  20536. #elif defined(__clang__)
  20537. "muls r6, r6\n\t"
  20538. #else
  20539. "mul r6, r6\n\t"
  20540. #endif
  20541. #ifdef WOLFSSL_KEIL
  20542. "muls r7, r7, r7\n\t"
  20543. #elif defined(__clang__)
  20544. "muls r7, r7\n\t"
  20545. #else
  20546. "mul r7, r7\n\t"
  20547. #endif
  20548. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20549. "adds r3, r3, r6\n\t"
  20550. #else
  20551. "add r3, r3, r6\n\t"
  20552. #endif
  20553. #ifdef WOLFSSL_KEIL
  20554. "adcs r4, r4, r7\n\t"
  20555. #elif defined(__clang__)
  20556. "adcs r4, r7\n\t"
  20557. #else
  20558. "adc r4, r7\n\t"
  20559. #endif
  20560. #ifdef WOLFSSL_KEIL
  20561. "adcs r5, r5, %[r]\n\t"
  20562. #elif defined(__clang__)
  20563. "adcs r5, %[r]\n\t"
  20564. #else
  20565. "adc r5, %[r]\n\t"
  20566. #endif
  20567. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20568. "lsrs r7, r2, #16\n\t"
  20569. #else
  20570. "lsr r7, r2, #16\n\t"
  20571. #endif
  20572. "uxth r6, r2\n\t"
  20573. #ifdef WOLFSSL_KEIL
  20574. "muls r6, r7, r6\n\t"
  20575. #elif defined(__clang__)
  20576. "muls r6, r7\n\t"
  20577. #else
  20578. "mul r6, r7\n\t"
  20579. #endif
  20580. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20581. "lsrs r7, r6, #15\n\t"
  20582. #else
  20583. "lsr r7, r6, #15\n\t"
  20584. #endif
  20585. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20586. "lsls r6, r6, #17\n\t"
  20587. #else
  20588. "lsl r6, r6, #17\n\t"
  20589. #endif
  20590. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20591. "adds r3, r3, r6\n\t"
  20592. #else
  20593. "add r3, r3, r6\n\t"
  20594. #endif
  20595. #ifdef WOLFSSL_KEIL
  20596. "adcs r4, r4, r7\n\t"
  20597. #elif defined(__clang__)
  20598. "adcs r4, r7\n\t"
  20599. #else
  20600. "adc r4, r7\n\t"
  20601. #endif
  20602. #ifdef WOLFSSL_KEIL
  20603. "adcs r5, r5, %[r]\n\t"
  20604. #elif defined(__clang__)
  20605. "adcs r5, %[r]\n\t"
  20606. #else
  20607. "adc r5, %[r]\n\t"
  20608. #endif
  20609. "# Square: Done\n\t"
  20610. "mov r2, r12\n\t"
  20611. "\n"
  20612. "L_sp_2048_sqr_64_done_sqr_%=:\n\t"
  20613. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20614. "adds %[a], %[a], #4\n\t"
  20615. #else
  20616. "add %[a], %[a], #4\n\t"
  20617. #endif
  20618. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20619. "subs r2, r2, #4\n\t"
  20620. #else
  20621. "sub r2, r2, #4\n\t"
  20622. #endif
  20623. "movs r6, #0xff\n\t"
  20624. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20625. "adds r6, r6, #1\n\t"
  20626. #else
  20627. "add r6, r6, #1\n\t"
  20628. #endif
  20629. "add r6, r6, r9\n\t"
  20630. "cmp %[a], r6\n\t"
  20631. "beq L_sp_2048_sqr_64_done_mul_%=\n\t"
  20632. "cmp %[a], r2\n\t"
  20633. "bgt L_sp_2048_sqr_64_done_mul_%=\n\t"
  20634. "mov r7, r8\n\t"
  20635. "add r7, r7, r9\n\t"
  20636. "cmp %[a], r7\n\t"
  20637. "ble L_sp_2048_sqr_64_mul_%=\n\t"
  20638. "\n"
  20639. "L_sp_2048_sqr_64_done_mul_%=:\n\t"
  20640. "mov %[r], r10\n\t"
  20641. "mov r7, r8\n\t"
  20642. "str r3, [%[r], r7]\n\t"
  20643. "movs r3, r4\n\t"
  20644. "movs r4, r5\n\t"
  20645. "movs r5, #0\n\t"
  20646. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20647. "adds r7, r7, #4\n\t"
  20648. #else
  20649. "add r7, r7, #4\n\t"
  20650. #endif
  20651. "mov r8, r7\n\t"
  20652. "movs r6, #0xff\n\t"
  20653. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20654. "adds r6, r6, #0xf9\n\t"
  20655. #else
  20656. "add r6, r6, #0xf9\n\t"
  20657. #endif
  20658. "cmp r7, r6\n\t"
  20659. "ble L_sp_2048_sqr_64_words_%=\n\t"
  20660. "mov %[a], r9\n\t"
  20661. "str r3, [%[r], r7]\n\t"
  20662. "mov %[r], r11\n\t"
  20663. "mov %[a], r10\n\t"
  20664. "movs r3, #0xff\n\t"
  20665. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20666. "adds r3, r3, #0xfd\n\t"
  20667. #else
  20668. "add r3, r3, #0xfd\n\t"
  20669. #endif
  20670. "\n"
  20671. "L_sp_2048_sqr_64_store_%=:\n\t"
  20672. "ldr r6, [%[a], r3]\n\t"
  20673. "str r6, [%[r], r3]\n\t"
  20674. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20675. "subs r3, r3, #4\n\t"
  20676. #else
  20677. "sub r3, r3, #4\n\t"
  20678. #endif
  20679. "bge L_sp_2048_sqr_64_store_%=\n\t"
  20680. "movs r6, #2\n\t"
  20681. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20682. "lsls r6, r6, #8\n\t"
  20683. #else
  20684. "lsl r6, r6, #8\n\t"
  20685. #endif
  20686. "add sp, sp, r6\n\t"
  20687. : [r] "+l" (r), [a] "+l" (a)
  20688. :
  20689. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  20690. );
  20691. }
  20692. #endif /* WOLFSSL_SP_SMALL */
  20693. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  20694. #ifdef WOLFSSL_SP_SMALL
  20695. /* AND m into each word of a and store in r.
  20696. *
  20697. * r A single precision integer.
  20698. * a A single precision integer.
  20699. * m Mask to AND against each digit.
  20700. */
  20701. static void sp_2048_mask_32(sp_digit* r, const sp_digit* a, sp_digit m)
  20702. {
  20703. int i;
  20704. for (i=0; i<32; i++) {
  20705. r[i] = a[i] & m;
  20706. }
  20707. }
  20708. #endif /* WOLFSSL_SP_SMALL */
  20709. #ifdef WOLFSSL_SP_SMALL
  20710. /* Add b to a into r. (r = a + b)
  20711. *
  20712. * r A single precision integer.
  20713. * a A single precision integer.
  20714. * b A single precision integer.
  20715. */
  20716. SP_NOINLINE static sp_digit sp_2048_add_32(sp_digit* r, const sp_digit* a,
  20717. const sp_digit* b)
  20718. {
  20719. __asm__ __volatile__ (
  20720. "movs r6, %[a]\n\t"
  20721. "movs r7, #0\n\t"
  20722. "movs r3, #0\n\t"
  20723. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20724. "adds r6, r6, #0x80\n\t"
  20725. #else
  20726. "add r6, r6, #0x80\n\t"
  20727. #endif
  20728. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20729. "subs r7, r7, #1\n\t"
  20730. #else
  20731. "sub r7, r7, #1\n\t"
  20732. #endif
  20733. "\n"
  20734. "L_sp_2048_add_32_word_%=:\n\t"
  20735. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20736. "adds r3, r3, r7\n\t"
  20737. #else
  20738. "add r3, r3, r7\n\t"
  20739. #endif
  20740. "ldr r4, [%[a]]\n\t"
  20741. "ldr r5, [%[b]]\n\t"
  20742. #ifdef WOLFSSL_KEIL
  20743. "adcs r4, r4, r5\n\t"
  20744. #elif defined(__clang__)
  20745. "adcs r4, r5\n\t"
  20746. #else
  20747. "adc r4, r5\n\t"
  20748. #endif
  20749. "str r4, [%[r]]\n\t"
  20750. "movs r3, #0\n\t"
  20751. #ifdef WOLFSSL_KEIL
  20752. "adcs r3, r3, r3\n\t"
  20753. #elif defined(__clang__)
  20754. "adcs r3, r3\n\t"
  20755. #else
  20756. "adc r3, r3\n\t"
  20757. #endif
  20758. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20759. "adds %[a], %[a], #4\n\t"
  20760. #else
  20761. "add %[a], %[a], #4\n\t"
  20762. #endif
  20763. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20764. "adds %[b], %[b], #4\n\t"
  20765. #else
  20766. "add %[b], %[b], #4\n\t"
  20767. #endif
  20768. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20769. "adds %[r], %[r], #4\n\t"
  20770. #else
  20771. "add %[r], %[r], #4\n\t"
  20772. #endif
  20773. "cmp %[a], r6\n\t"
  20774. "bne L_sp_2048_add_32_word_%=\n\t"
  20775. "movs %[r], r3\n\t"
  20776. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  20777. :
  20778. : "memory", "r3", "r4", "r5", "r6", "r7"
  20779. );
  20780. return (uint32_t)(size_t)r;
  20781. }
  20782. #endif /* WOLFSSL_SP_SMALL */
  20783. #ifdef WOLFSSL_SP_SMALL
  20784. /* Sub b from a into a. (a -= b)
  20785. *
  20786. * a A single precision integer.
  20787. * b A single precision integer.
  20788. */
  20789. SP_NOINLINE static sp_digit sp_2048_sub_in_place_32(sp_digit* a,
  20790. const sp_digit* b)
  20791. {
  20792. __asm__ __volatile__ (
  20793. "movs r7, %[a]\n\t"
  20794. "movs r2, #0\n\t"
  20795. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20796. "adds r7, r7, #0x80\n\t"
  20797. #else
  20798. "add r7, r7, #0x80\n\t"
  20799. #endif
  20800. "\n"
  20801. "L_sp_2048_sub_in_place_32_words_%=:\n\t"
  20802. "movs r5, #0\n\t"
  20803. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20804. "subs r5, r5, r2\n\t"
  20805. #else
  20806. "sub r5, r5, r2\n\t"
  20807. #endif
  20808. "ldr r3, [%[a]]\n\t"
  20809. "ldr r4, [%[a], #4]\n\t"
  20810. "ldr r5, [%[b]]\n\t"
  20811. "ldr r6, [%[b], #4]\n\t"
  20812. #ifdef WOLFSSL_KEIL
  20813. "sbcs r3, r3, r5\n\t"
  20814. #elif defined(__clang__)
  20815. "sbcs r3, r5\n\t"
  20816. #else
  20817. "sbc r3, r5\n\t"
  20818. #endif
  20819. #ifdef WOLFSSL_KEIL
  20820. "sbcs r4, r4, r6\n\t"
  20821. #elif defined(__clang__)
  20822. "sbcs r4, r6\n\t"
  20823. #else
  20824. "sbc r4, r6\n\t"
  20825. #endif
  20826. "str r3, [%[a]]\n\t"
  20827. "str r4, [%[a], #4]\n\t"
  20828. #ifdef WOLFSSL_KEIL
  20829. "sbcs r2, r2, r2\n\t"
  20830. #elif defined(__clang__)
  20831. "sbcs r2, r2\n\t"
  20832. #else
  20833. "sbc r2, r2\n\t"
  20834. #endif
  20835. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20836. "adds %[a], %[a], #8\n\t"
  20837. #else
  20838. "add %[a], %[a], #8\n\t"
  20839. #endif
  20840. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20841. "adds %[b], %[b], #8\n\t"
  20842. #else
  20843. "add %[b], %[b], #8\n\t"
  20844. #endif
  20845. "cmp %[a], r7\n\t"
  20846. "bne L_sp_2048_sub_in_place_32_words_%=\n\t"
  20847. "movs %[a], r2\n\t"
  20848. : [a] "+l" (a), [b] "+l" (b)
  20849. :
  20850. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  20851. );
  20852. return (uint32_t)(size_t)a;
  20853. }
  20854. #endif /* WOLFSSL_SP_SMALL */
  20855. #ifdef WOLFSSL_SP_SMALL
  20856. /* Multiply a and b into r. (r = a * b)
  20857. *
  20858. * r A single precision integer.
  20859. * a A single precision integer.
  20860. * b A single precision integer.
  20861. */
  20862. SP_NOINLINE static void sp_2048_mul_32(sp_digit* r, const sp_digit* a,
  20863. const sp_digit* b)
  20864. {
  20865. sp_digit t[32 * 2];
  20866. sp_digit* tmp = t;
  20867. __asm__ __volatile__ (
  20868. "movs r3, #0\n\t"
  20869. "movs r4, #0\n\t"
  20870. "mov r8, r3\n\t"
  20871. "mov r11, %[tmp]\n\t"
  20872. "mov r9, %[a]\n\t"
  20873. "mov r10, %[b]\n\t"
  20874. "movs r6, #0x80\n\t"
  20875. "add r6, r6, r9\n\t"
  20876. "mov r12, r6\n\t"
  20877. "\n"
  20878. "L_sp_2048_mul_32_words_%=:\n\t"
  20879. "movs %[tmp], #0\n\t"
  20880. "movs r5, #0\n\t"
  20881. "movs r6, #0x7c\n\t"
  20882. "mov %[a], r8\n\t"
  20883. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20884. "subs %[a], %[a], r6\n\t"
  20885. #else
  20886. "sub %[a], %[a], r6\n\t"
  20887. #endif
  20888. #ifdef WOLFSSL_KEIL
  20889. "sbcs r6, r6, r6\n\t"
  20890. #elif defined(__clang__)
  20891. "sbcs r6, r6\n\t"
  20892. #else
  20893. "sbc r6, r6\n\t"
  20894. #endif
  20895. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20896. "mvns r6, r6\n\t"
  20897. #else
  20898. "mvn r6, r6\n\t"
  20899. #endif
  20900. #ifdef WOLFSSL_KEIL
  20901. "ands %[a], %[a], r6\n\t"
  20902. #elif defined(__clang__)
  20903. "ands %[a], r6\n\t"
  20904. #else
  20905. "and %[a], r6\n\t"
  20906. #endif
  20907. "mov %[b], r8\n\t"
  20908. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20909. "subs %[b], %[b], %[a]\n\t"
  20910. #else
  20911. "sub %[b], %[b], %[a]\n\t"
  20912. #endif
  20913. "add %[a], %[a], r9\n\t"
  20914. "add %[b], %[b], r10\n\t"
  20915. "\n"
  20916. "L_sp_2048_mul_32_mul_%=:\n\t"
  20917. "# Multiply Start\n\t"
  20918. "ldrh r6, [%[a]]\n\t"
  20919. "ldrh r7, [%[b]]\n\t"
  20920. #ifdef WOLFSSL_KEIL
  20921. "muls r7, r6, r7\n\t"
  20922. #elif defined(__clang__)
  20923. "muls r7, r6\n\t"
  20924. #else
  20925. "mul r7, r6\n\t"
  20926. #endif
  20927. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20928. "adds r3, r3, r7\n\t"
  20929. #else
  20930. "add r3, r3, r7\n\t"
  20931. #endif
  20932. #ifdef WOLFSSL_KEIL
  20933. "adcs r4, r4, %[tmp]\n\t"
  20934. #elif defined(__clang__)
  20935. "adcs r4, %[tmp]\n\t"
  20936. #else
  20937. "adc r4, %[tmp]\n\t"
  20938. #endif
  20939. #ifdef WOLFSSL_KEIL
  20940. "adcs r5, r5, %[tmp]\n\t"
  20941. #elif defined(__clang__)
  20942. "adcs r5, %[tmp]\n\t"
  20943. #else
  20944. "adc r5, %[tmp]\n\t"
  20945. #endif
  20946. "ldr r7, [%[b]]\n\t"
  20947. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20948. "lsrs r7, r7, #16\n\t"
  20949. #else
  20950. "lsr r7, r7, #16\n\t"
  20951. #endif
  20952. #ifdef WOLFSSL_KEIL
  20953. "muls r6, r7, r6\n\t"
  20954. #elif defined(__clang__)
  20955. "muls r6, r7\n\t"
  20956. #else
  20957. "mul r6, r7\n\t"
  20958. #endif
  20959. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20960. "lsrs r7, r6, #16\n\t"
  20961. #else
  20962. "lsr r7, r6, #16\n\t"
  20963. #endif
  20964. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20965. "lsls r6, r6, #16\n\t"
  20966. #else
  20967. "lsl r6, r6, #16\n\t"
  20968. #endif
  20969. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20970. "adds r3, r3, r6\n\t"
  20971. #else
  20972. "add r3, r3, r6\n\t"
  20973. #endif
  20974. #ifdef WOLFSSL_KEIL
  20975. "adcs r4, r4, r7\n\t"
  20976. #elif defined(__clang__)
  20977. "adcs r4, r7\n\t"
  20978. #else
  20979. "adc r4, r7\n\t"
  20980. #endif
  20981. #ifdef WOLFSSL_KEIL
  20982. "adcs r5, r5, %[tmp]\n\t"
  20983. #elif defined(__clang__)
  20984. "adcs r5, %[tmp]\n\t"
  20985. #else
  20986. "adc r5, %[tmp]\n\t"
  20987. #endif
  20988. "ldr r6, [%[a]]\n\t"
  20989. "ldr r7, [%[b]]\n\t"
  20990. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20991. "lsrs r6, r6, #16\n\t"
  20992. #else
  20993. "lsr r6, r6, #16\n\t"
  20994. #endif
  20995. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20996. "lsrs r7, r7, #16\n\t"
  20997. #else
  20998. "lsr r7, r7, #16\n\t"
  20999. #endif
  21000. #ifdef WOLFSSL_KEIL
  21001. "muls r7, r6, r7\n\t"
  21002. #elif defined(__clang__)
  21003. "muls r7, r6\n\t"
  21004. #else
  21005. "mul r7, r6\n\t"
  21006. #endif
  21007. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21008. "adds r4, r4, r7\n\t"
  21009. #else
  21010. "add r4, r4, r7\n\t"
  21011. #endif
  21012. #ifdef WOLFSSL_KEIL
  21013. "adcs r5, r5, %[tmp]\n\t"
  21014. #elif defined(__clang__)
  21015. "adcs r5, %[tmp]\n\t"
  21016. #else
  21017. "adc r5, %[tmp]\n\t"
  21018. #endif
  21019. "ldrh r7, [%[b]]\n\t"
  21020. #ifdef WOLFSSL_KEIL
  21021. "muls r6, r7, r6\n\t"
  21022. #elif defined(__clang__)
  21023. "muls r6, r7\n\t"
  21024. #else
  21025. "mul r6, r7\n\t"
  21026. #endif
  21027. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21028. "lsrs r7, r6, #16\n\t"
  21029. #else
  21030. "lsr r7, r6, #16\n\t"
  21031. #endif
  21032. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21033. "lsls r6, r6, #16\n\t"
  21034. #else
  21035. "lsl r6, r6, #16\n\t"
  21036. #endif
  21037. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21038. "adds r3, r3, r6\n\t"
  21039. #else
  21040. "add r3, r3, r6\n\t"
  21041. #endif
  21042. #ifdef WOLFSSL_KEIL
  21043. "adcs r4, r4, r7\n\t"
  21044. #elif defined(__clang__)
  21045. "adcs r4, r7\n\t"
  21046. #else
  21047. "adc r4, r7\n\t"
  21048. #endif
  21049. #ifdef WOLFSSL_KEIL
  21050. "adcs r5, r5, %[tmp]\n\t"
  21051. #elif defined(__clang__)
  21052. "adcs r5, %[tmp]\n\t"
  21053. #else
  21054. "adc r5, %[tmp]\n\t"
  21055. #endif
  21056. "# Multiply Done\n\t"
  21057. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21058. "adds %[a], %[a], #4\n\t"
  21059. #else
  21060. "add %[a], %[a], #4\n\t"
  21061. #endif
  21062. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21063. "subs %[b], %[b], #4\n\t"
  21064. #else
  21065. "sub %[b], %[b], #4\n\t"
  21066. #endif
  21067. "cmp %[a], r12\n\t"
  21068. "beq L_sp_2048_mul_32_done_mul_%=\n\t"
  21069. "mov r6, r8\n\t"
  21070. "add r6, r6, r9\n\t"
  21071. "cmp %[a], r6\n\t"
  21072. "ble L_sp_2048_mul_32_mul_%=\n\t"
  21073. "\n"
  21074. "L_sp_2048_mul_32_done_mul_%=:\n\t"
  21075. "mov %[tmp], r11\n\t"
  21076. "mov r7, r8\n\t"
  21077. "str r3, [%[tmp], r7]\n\t"
  21078. "movs r3, r4\n\t"
  21079. "movs r4, r5\n\t"
  21080. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21081. "adds r7, r7, #4\n\t"
  21082. #else
  21083. "add r7, r7, #4\n\t"
  21084. #endif
  21085. "mov r8, r7\n\t"
  21086. "movs r6, #0xf8\n\t"
  21087. "cmp r7, r6\n\t"
  21088. "ble L_sp_2048_mul_32_words_%=\n\t"
  21089. "str r3, [%[tmp], r7]\n\t"
  21090. "mov %[a], r9\n\t"
  21091. "mov %[b], r10\n\t"
  21092. : [a] "+l" (a), [b] "+l" (b), [tmp] "+l" (tmp)
  21093. :
  21094. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  21095. );
  21096. XMEMCPY(r, t, sizeof(t));
  21097. }
  21098. /* Square a and put result in r. (r = a * a)
  21099. *
  21100. * r A single precision integer.
  21101. * a A single precision integer.
  21102. */
  21103. SP_NOINLINE static void sp_2048_sqr_32(sp_digit* r, const sp_digit* a)
  21104. {
  21105. __asm__ __volatile__ (
  21106. "movs r3, #0\n\t"
  21107. "movs r4, #0\n\t"
  21108. "movs r5, #0\n\t"
  21109. "mov r8, r3\n\t"
  21110. "mov r11, %[r]\n\t"
  21111. "movs r6, #0xff\n\t"
  21112. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21113. "adds r6, r6, #1\n\t"
  21114. #else
  21115. "add r6, r6, #1\n\t"
  21116. #endif
  21117. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21118. "negs r6, r6\n\t"
  21119. #else
  21120. "neg r6, r6\n\t"
  21121. #endif
  21122. "add sp, sp, r6\n\t"
  21123. "mov r10, sp\n\t"
  21124. "mov r9, %[a]\n\t"
  21125. "\n"
  21126. "L_sp_2048_sqr_32_words_%=:\n\t"
  21127. "movs %[r], #0\n\t"
  21128. "movs r6, #0x7c\n\t"
  21129. "mov %[a], r8\n\t"
  21130. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21131. "subs %[a], %[a], r6\n\t"
  21132. #else
  21133. "sub %[a], %[a], r6\n\t"
  21134. #endif
  21135. #ifdef WOLFSSL_KEIL
  21136. "sbcs r6, r6, r6\n\t"
  21137. #elif defined(__clang__)
  21138. "sbcs r6, r6\n\t"
  21139. #else
  21140. "sbc r6, r6\n\t"
  21141. #endif
  21142. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21143. "mvns r6, r6\n\t"
  21144. #else
  21145. "mvn r6, r6\n\t"
  21146. #endif
  21147. #ifdef WOLFSSL_KEIL
  21148. "ands %[a], %[a], r6\n\t"
  21149. #elif defined(__clang__)
  21150. "ands %[a], r6\n\t"
  21151. #else
  21152. "and %[a], r6\n\t"
  21153. #endif
  21154. "mov r2, r8\n\t"
  21155. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21156. "subs r2, r2, %[a]\n\t"
  21157. #else
  21158. "sub r2, r2, %[a]\n\t"
  21159. #endif
  21160. "add %[a], %[a], r9\n\t"
  21161. "add r2, r2, r9\n\t"
  21162. "\n"
  21163. "L_sp_2048_sqr_32_mul_%=:\n\t"
  21164. "cmp r2, %[a]\n\t"
  21165. "beq L_sp_2048_sqr_32_sqr_%=\n\t"
  21166. "# Multiply * 2: Start\n\t"
  21167. "ldrh r6, [%[a]]\n\t"
  21168. "ldrh r7, [r2]\n\t"
  21169. #ifdef WOLFSSL_KEIL
  21170. "muls r7, r6, r7\n\t"
  21171. #elif defined(__clang__)
  21172. "muls r7, r6\n\t"
  21173. #else
  21174. "mul r7, r6\n\t"
  21175. #endif
  21176. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21177. "adds r3, r3, r7\n\t"
  21178. #else
  21179. "add r3, r3, r7\n\t"
  21180. #endif
  21181. #ifdef WOLFSSL_KEIL
  21182. "adcs r4, r4, %[r]\n\t"
  21183. #elif defined(__clang__)
  21184. "adcs r4, %[r]\n\t"
  21185. #else
  21186. "adc r4, %[r]\n\t"
  21187. #endif
  21188. #ifdef WOLFSSL_KEIL
  21189. "adcs r5, r5, %[r]\n\t"
  21190. #elif defined(__clang__)
  21191. "adcs r5, %[r]\n\t"
  21192. #else
  21193. "adc r5, %[r]\n\t"
  21194. #endif
  21195. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21196. "adds r3, r3, r7\n\t"
  21197. #else
  21198. "add r3, r3, r7\n\t"
  21199. #endif
  21200. #ifdef WOLFSSL_KEIL
  21201. "adcs r4, r4, %[r]\n\t"
  21202. #elif defined(__clang__)
  21203. "adcs r4, %[r]\n\t"
  21204. #else
  21205. "adc r4, %[r]\n\t"
  21206. #endif
  21207. #ifdef WOLFSSL_KEIL
  21208. "adcs r5, r5, %[r]\n\t"
  21209. #elif defined(__clang__)
  21210. "adcs r5, %[r]\n\t"
  21211. #else
  21212. "adc r5, %[r]\n\t"
  21213. #endif
  21214. "ldr r7, [r2]\n\t"
  21215. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21216. "lsrs r7, r7, #16\n\t"
  21217. #else
  21218. "lsr r7, r7, #16\n\t"
  21219. #endif
  21220. #ifdef WOLFSSL_KEIL
  21221. "muls r6, r7, r6\n\t"
  21222. #elif defined(__clang__)
  21223. "muls r6, r7\n\t"
  21224. #else
  21225. "mul r6, r7\n\t"
  21226. #endif
  21227. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21228. "lsrs r7, r6, #16\n\t"
  21229. #else
  21230. "lsr r7, r6, #16\n\t"
  21231. #endif
  21232. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21233. "lsls r6, r6, #16\n\t"
  21234. #else
  21235. "lsl r6, r6, #16\n\t"
  21236. #endif
  21237. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21238. "adds r3, r3, r6\n\t"
  21239. #else
  21240. "add r3, r3, r6\n\t"
  21241. #endif
  21242. #ifdef WOLFSSL_KEIL
  21243. "adcs r4, r4, r7\n\t"
  21244. #elif defined(__clang__)
  21245. "adcs r4, r7\n\t"
  21246. #else
  21247. "adc r4, r7\n\t"
  21248. #endif
  21249. #ifdef WOLFSSL_KEIL
  21250. "adcs r5, r5, %[r]\n\t"
  21251. #elif defined(__clang__)
  21252. "adcs r5, %[r]\n\t"
  21253. #else
  21254. "adc r5, %[r]\n\t"
  21255. #endif
  21256. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21257. "adds r3, r3, r6\n\t"
  21258. #else
  21259. "add r3, r3, r6\n\t"
  21260. #endif
  21261. #ifdef WOLFSSL_KEIL
  21262. "adcs r4, r4, r7\n\t"
  21263. #elif defined(__clang__)
  21264. "adcs r4, r7\n\t"
  21265. #else
  21266. "adc r4, r7\n\t"
  21267. #endif
  21268. #ifdef WOLFSSL_KEIL
  21269. "adcs r5, r5, %[r]\n\t"
  21270. #elif defined(__clang__)
  21271. "adcs r5, %[r]\n\t"
  21272. #else
  21273. "adc r5, %[r]\n\t"
  21274. #endif
  21275. "ldr r6, [%[a]]\n\t"
  21276. "ldr r7, [r2]\n\t"
  21277. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21278. "lsrs r6, r6, #16\n\t"
  21279. #else
  21280. "lsr r6, r6, #16\n\t"
  21281. #endif
  21282. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21283. "lsrs r7, r7, #16\n\t"
  21284. #else
  21285. "lsr r7, r7, #16\n\t"
  21286. #endif
  21287. #ifdef WOLFSSL_KEIL
  21288. "muls r7, r6, r7\n\t"
  21289. #elif defined(__clang__)
  21290. "muls r7, r6\n\t"
  21291. #else
  21292. "mul r7, r6\n\t"
  21293. #endif
  21294. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21295. "adds r4, r4, r7\n\t"
  21296. #else
  21297. "add r4, r4, r7\n\t"
  21298. #endif
  21299. #ifdef WOLFSSL_KEIL
  21300. "adcs r5, r5, %[r]\n\t"
  21301. #elif defined(__clang__)
  21302. "adcs r5, %[r]\n\t"
  21303. #else
  21304. "adc r5, %[r]\n\t"
  21305. #endif
  21306. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21307. "adds r4, r4, r7\n\t"
  21308. #else
  21309. "add r4, r4, r7\n\t"
  21310. #endif
  21311. #ifdef WOLFSSL_KEIL
  21312. "adcs r5, r5, %[r]\n\t"
  21313. #elif defined(__clang__)
  21314. "adcs r5, %[r]\n\t"
  21315. #else
  21316. "adc r5, %[r]\n\t"
  21317. #endif
  21318. "ldrh r7, [r2]\n\t"
  21319. #ifdef WOLFSSL_KEIL
  21320. "muls r6, r7, r6\n\t"
  21321. #elif defined(__clang__)
  21322. "muls r6, r7\n\t"
  21323. #else
  21324. "mul r6, r7\n\t"
  21325. #endif
  21326. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21327. "lsrs r7, r6, #16\n\t"
  21328. #else
  21329. "lsr r7, r6, #16\n\t"
  21330. #endif
  21331. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21332. "lsls r6, r6, #16\n\t"
  21333. #else
  21334. "lsl r6, r6, #16\n\t"
  21335. #endif
  21336. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21337. "adds r3, r3, r6\n\t"
  21338. #else
  21339. "add r3, r3, r6\n\t"
  21340. #endif
  21341. #ifdef WOLFSSL_KEIL
  21342. "adcs r4, r4, r7\n\t"
  21343. #elif defined(__clang__)
  21344. "adcs r4, r7\n\t"
  21345. #else
  21346. "adc r4, r7\n\t"
  21347. #endif
  21348. #ifdef WOLFSSL_KEIL
  21349. "adcs r5, r5, %[r]\n\t"
  21350. #elif defined(__clang__)
  21351. "adcs r5, %[r]\n\t"
  21352. #else
  21353. "adc r5, %[r]\n\t"
  21354. #endif
  21355. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21356. "adds r3, r3, r6\n\t"
  21357. #else
  21358. "add r3, r3, r6\n\t"
  21359. #endif
  21360. #ifdef WOLFSSL_KEIL
  21361. "adcs r4, r4, r7\n\t"
  21362. #elif defined(__clang__)
  21363. "adcs r4, r7\n\t"
  21364. #else
  21365. "adc r4, r7\n\t"
  21366. #endif
  21367. #ifdef WOLFSSL_KEIL
  21368. "adcs r5, r5, %[r]\n\t"
  21369. #elif defined(__clang__)
  21370. "adcs r5, %[r]\n\t"
  21371. #else
  21372. "adc r5, %[r]\n\t"
  21373. #endif
  21374. "# Multiply * 2: Done\n\t"
  21375. "bal L_sp_2048_sqr_32_done_sqr_%=\n\t"
  21376. "\n"
  21377. "L_sp_2048_sqr_32_sqr_%=:\n\t"
  21378. "mov r12, r2\n\t"
  21379. "ldr r2, [%[a]]\n\t"
  21380. "# Square: Start\n\t"
  21381. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21382. "lsrs r7, r2, #16\n\t"
  21383. #else
  21384. "lsr r7, r2, #16\n\t"
  21385. #endif
  21386. "uxth r6, r2\n\t"
  21387. #ifdef WOLFSSL_KEIL
  21388. "muls r6, r6, r6\n\t"
  21389. #elif defined(__clang__)
  21390. "muls r6, r6\n\t"
  21391. #else
  21392. "mul r6, r6\n\t"
  21393. #endif
  21394. #ifdef WOLFSSL_KEIL
  21395. "muls r7, r7, r7\n\t"
  21396. #elif defined(__clang__)
  21397. "muls r7, r7\n\t"
  21398. #else
  21399. "mul r7, r7\n\t"
  21400. #endif
  21401. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21402. "adds r3, r3, r6\n\t"
  21403. #else
  21404. "add r3, r3, r6\n\t"
  21405. #endif
  21406. #ifdef WOLFSSL_KEIL
  21407. "adcs r4, r4, r7\n\t"
  21408. #elif defined(__clang__)
  21409. "adcs r4, r7\n\t"
  21410. #else
  21411. "adc r4, r7\n\t"
  21412. #endif
  21413. #ifdef WOLFSSL_KEIL
  21414. "adcs r5, r5, %[r]\n\t"
  21415. #elif defined(__clang__)
  21416. "adcs r5, %[r]\n\t"
  21417. #else
  21418. "adc r5, %[r]\n\t"
  21419. #endif
  21420. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21421. "lsrs r7, r2, #16\n\t"
  21422. #else
  21423. "lsr r7, r2, #16\n\t"
  21424. #endif
  21425. "uxth r6, r2\n\t"
  21426. #ifdef WOLFSSL_KEIL
  21427. "muls r6, r7, r6\n\t"
  21428. #elif defined(__clang__)
  21429. "muls r6, r7\n\t"
  21430. #else
  21431. "mul r6, r7\n\t"
  21432. #endif
  21433. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21434. "lsrs r7, r6, #15\n\t"
  21435. #else
  21436. "lsr r7, r6, #15\n\t"
  21437. #endif
  21438. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21439. "lsls r6, r6, #17\n\t"
  21440. #else
  21441. "lsl r6, r6, #17\n\t"
  21442. #endif
  21443. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21444. "adds r3, r3, r6\n\t"
  21445. #else
  21446. "add r3, r3, r6\n\t"
  21447. #endif
  21448. #ifdef WOLFSSL_KEIL
  21449. "adcs r4, r4, r7\n\t"
  21450. #elif defined(__clang__)
  21451. "adcs r4, r7\n\t"
  21452. #else
  21453. "adc r4, r7\n\t"
  21454. #endif
  21455. #ifdef WOLFSSL_KEIL
  21456. "adcs r5, r5, %[r]\n\t"
  21457. #elif defined(__clang__)
  21458. "adcs r5, %[r]\n\t"
  21459. #else
  21460. "adc r5, %[r]\n\t"
  21461. #endif
  21462. "# Square: Done\n\t"
  21463. "mov r2, r12\n\t"
  21464. "\n"
  21465. "L_sp_2048_sqr_32_done_sqr_%=:\n\t"
  21466. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21467. "adds %[a], %[a], #4\n\t"
  21468. #else
  21469. "add %[a], %[a], #4\n\t"
  21470. #endif
  21471. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21472. "subs r2, r2, #4\n\t"
  21473. #else
  21474. "sub r2, r2, #4\n\t"
  21475. #endif
  21476. "movs r6, #0x80\n\t"
  21477. "add r6, r6, r9\n\t"
  21478. "cmp %[a], r6\n\t"
  21479. "beq L_sp_2048_sqr_32_done_mul_%=\n\t"
  21480. "cmp %[a], r2\n\t"
  21481. "bgt L_sp_2048_sqr_32_done_mul_%=\n\t"
  21482. "mov r7, r8\n\t"
  21483. "add r7, r7, r9\n\t"
  21484. "cmp %[a], r7\n\t"
  21485. "ble L_sp_2048_sqr_32_mul_%=\n\t"
  21486. "\n"
  21487. "L_sp_2048_sqr_32_done_mul_%=:\n\t"
  21488. "mov %[r], r10\n\t"
  21489. "mov r7, r8\n\t"
  21490. "str r3, [%[r], r7]\n\t"
  21491. "movs r3, r4\n\t"
  21492. "movs r4, r5\n\t"
  21493. "movs r5, #0\n\t"
  21494. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21495. "adds r7, r7, #4\n\t"
  21496. #else
  21497. "add r7, r7, #4\n\t"
  21498. #endif
  21499. "mov r8, r7\n\t"
  21500. "movs r6, #0xf8\n\t"
  21501. "cmp r7, r6\n\t"
  21502. "ble L_sp_2048_sqr_32_words_%=\n\t"
  21503. "mov %[a], r9\n\t"
  21504. "str r3, [%[r], r7]\n\t"
  21505. "mov %[r], r11\n\t"
  21506. "mov %[a], r10\n\t"
  21507. "movs r3, #0xfc\n\t"
  21508. "\n"
  21509. "L_sp_2048_sqr_32_store_%=:\n\t"
  21510. "ldr r6, [%[a], r3]\n\t"
  21511. "str r6, [%[r], r3]\n\t"
  21512. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21513. "subs r3, r3, #4\n\t"
  21514. #else
  21515. "sub r3, r3, #4\n\t"
  21516. #endif
  21517. "bge L_sp_2048_sqr_32_store_%=\n\t"
  21518. "movs r6, #0xff\n\t"
  21519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21520. "adds r6, r6, #1\n\t"
  21521. #else
  21522. "add r6, r6, #1\n\t"
  21523. #endif
  21524. "add sp, sp, r6\n\t"
  21525. : [r] "+l" (r), [a] "+l" (a)
  21526. :
  21527. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  21528. );
  21529. }
  21530. #endif /* WOLFSSL_SP_SMALL */
  21531. #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */
  21532. /* Caclulate the bottom digit of -1/a mod 2^n.
  21533. *
  21534. * a A single precision number.
  21535. * rho Bottom word of inverse.
  21536. */
  21537. static void sp_2048_mont_setup(const sp_digit* a, sp_digit* rho)
  21538. {
  21539. sp_digit x;
  21540. sp_digit b;
  21541. b = a[0];
  21542. x = (((b + 2) & 4) << 1) + b; /* here x*a==1 mod 2**4 */
  21543. x *= 2 - b * x; /* here x*a==1 mod 2**8 */
  21544. x *= 2 - b * x; /* here x*a==1 mod 2**16 */
  21545. x *= 2 - b * x; /* here x*a==1 mod 2**32 */
  21546. /* rho = -1/m mod b */
  21547. *rho = (sp_digit)0 - x;
  21548. }
  21549. /* Mul a by digit b into r. (r = a * b)
  21550. *
  21551. * r A single precision integer.
  21552. * a A single precision integer.
  21553. * b A single precision digit.
  21554. */
  21555. SP_NOINLINE static void sp_2048_mul_d_64(sp_digit* r, const sp_digit* a,
  21556. sp_digit b)
  21557. {
  21558. __asm__ __volatile__ (
  21559. "movs r6, #0xff\n\t"
  21560. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21561. "adds r6, r6, #1\n\t"
  21562. #else
  21563. "add r6, r6, #1\n\t"
  21564. #endif
  21565. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21566. "adds r6, r6, %[a]\n\t"
  21567. #else
  21568. "add r6, r6, %[a]\n\t"
  21569. #endif
  21570. "mov r8, %[r]\n\t"
  21571. "mov r9, r6\n\t"
  21572. "movs r3, #0\n\t"
  21573. "movs r4, #0\n\t"
  21574. "\n"
  21575. "L_sp_2048_mul_d_64_%=:\n\t"
  21576. "movs %[r], #0\n\t"
  21577. "movs r5, #0\n\t"
  21578. "# A[] * B\n\t"
  21579. "ldrh r6, [%[a]]\n\t"
  21580. "uxth r7, %[b]\n\t"
  21581. #ifdef WOLFSSL_KEIL
  21582. "muls r7, r6, r7\n\t"
  21583. #elif defined(__clang__)
  21584. "muls r7, r6\n\t"
  21585. #else
  21586. "mul r7, r6\n\t"
  21587. #endif
  21588. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21589. "adds r3, r3, r7\n\t"
  21590. #else
  21591. "add r3, r3, r7\n\t"
  21592. #endif
  21593. #ifdef WOLFSSL_KEIL
  21594. "adcs r4, r4, %[r]\n\t"
  21595. #elif defined(__clang__)
  21596. "adcs r4, %[r]\n\t"
  21597. #else
  21598. "adc r4, %[r]\n\t"
  21599. #endif
  21600. #ifdef WOLFSSL_KEIL
  21601. "adcs r5, r5, %[r]\n\t"
  21602. #elif defined(__clang__)
  21603. "adcs r5, %[r]\n\t"
  21604. #else
  21605. "adc r5, %[r]\n\t"
  21606. #endif
  21607. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21608. "lsrs r7, %[b], #16\n\t"
  21609. #else
  21610. "lsr r7, %[b], #16\n\t"
  21611. #endif
  21612. #ifdef WOLFSSL_KEIL
  21613. "muls r6, r7, r6\n\t"
  21614. #elif defined(__clang__)
  21615. "muls r6, r7\n\t"
  21616. #else
  21617. "mul r6, r7\n\t"
  21618. #endif
  21619. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21620. "lsrs r7, r6, #16\n\t"
  21621. #else
  21622. "lsr r7, r6, #16\n\t"
  21623. #endif
  21624. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21625. "lsls r6, r6, #16\n\t"
  21626. #else
  21627. "lsl r6, r6, #16\n\t"
  21628. #endif
  21629. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21630. "adds r3, r3, r6\n\t"
  21631. #else
  21632. "add r3, r3, r6\n\t"
  21633. #endif
  21634. #ifdef WOLFSSL_KEIL
  21635. "adcs r4, r4, r7\n\t"
  21636. #elif defined(__clang__)
  21637. "adcs r4, r7\n\t"
  21638. #else
  21639. "adc r4, r7\n\t"
  21640. #endif
  21641. #ifdef WOLFSSL_KEIL
  21642. "adcs r5, r5, %[r]\n\t"
  21643. #elif defined(__clang__)
  21644. "adcs r5, %[r]\n\t"
  21645. #else
  21646. "adc r5, %[r]\n\t"
  21647. #endif
  21648. "ldr r6, [%[a]]\n\t"
  21649. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21650. "lsrs r6, r6, #16\n\t"
  21651. #else
  21652. "lsr r6, r6, #16\n\t"
  21653. #endif
  21654. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21655. "lsrs r7, %[b], #16\n\t"
  21656. #else
  21657. "lsr r7, %[b], #16\n\t"
  21658. #endif
  21659. #ifdef WOLFSSL_KEIL
  21660. "muls r7, r6, r7\n\t"
  21661. #elif defined(__clang__)
  21662. "muls r7, r6\n\t"
  21663. #else
  21664. "mul r7, r6\n\t"
  21665. #endif
  21666. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21667. "adds r4, r4, r7\n\t"
  21668. #else
  21669. "add r4, r4, r7\n\t"
  21670. #endif
  21671. #ifdef WOLFSSL_KEIL
  21672. "adcs r5, r5, %[r]\n\t"
  21673. #elif defined(__clang__)
  21674. "adcs r5, %[r]\n\t"
  21675. #else
  21676. "adc r5, %[r]\n\t"
  21677. #endif
  21678. "uxth r7, %[b]\n\t"
  21679. #ifdef WOLFSSL_KEIL
  21680. "muls r6, r7, r6\n\t"
  21681. #elif defined(__clang__)
  21682. "muls r6, r7\n\t"
  21683. #else
  21684. "mul r6, r7\n\t"
  21685. #endif
  21686. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21687. "lsrs r7, r6, #16\n\t"
  21688. #else
  21689. "lsr r7, r6, #16\n\t"
  21690. #endif
  21691. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21692. "lsls r6, r6, #16\n\t"
  21693. #else
  21694. "lsl r6, r6, #16\n\t"
  21695. #endif
  21696. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21697. "adds r3, r3, r6\n\t"
  21698. #else
  21699. "add r3, r3, r6\n\t"
  21700. #endif
  21701. #ifdef WOLFSSL_KEIL
  21702. "adcs r4, r4, r7\n\t"
  21703. #elif defined(__clang__)
  21704. "adcs r4, r7\n\t"
  21705. #else
  21706. "adc r4, r7\n\t"
  21707. #endif
  21708. #ifdef WOLFSSL_KEIL
  21709. "adcs r5, r5, %[r]\n\t"
  21710. #elif defined(__clang__)
  21711. "adcs r5, %[r]\n\t"
  21712. #else
  21713. "adc r5, %[r]\n\t"
  21714. #endif
  21715. "# A[] * B - Done\n\t"
  21716. "mov %[r], r8\n\t"
  21717. "str r3, [%[r]]\n\t"
  21718. "movs r3, r4\n\t"
  21719. "movs r4, r5\n\t"
  21720. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21721. "adds %[r], %[r], #4\n\t"
  21722. #else
  21723. "add %[r], %[r], #4\n\t"
  21724. #endif
  21725. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21726. "adds %[a], %[a], #4\n\t"
  21727. #else
  21728. "add %[a], %[a], #4\n\t"
  21729. #endif
  21730. "mov r8, %[r]\n\t"
  21731. "cmp %[a], r9\n\t"
  21732. "blt L_sp_2048_mul_d_64_%=\n\t"
  21733. "str r3, [%[r]]\n\t"
  21734. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  21735. :
  21736. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  21737. );
  21738. }
  21739. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  21740. /* r = 2^n mod m where n is the number of bits to reduce by.
  21741. * Given m must be 2048 bits, just need to subtract.
  21742. *
  21743. * r A single precision number.
  21744. * m A single precision number.
  21745. */
  21746. static void sp_2048_mont_norm_32(sp_digit* r, const sp_digit* m)
  21747. {
  21748. XMEMSET(r, 0, sizeof(sp_digit) * 32);
  21749. /* r = 2^n mod m */
  21750. sp_2048_sub_in_place_32(r, m);
  21751. }
  21752. /* Conditionally subtract b from a using the mask m.
  21753. * m is -1 to subtract and 0 when not copying.
  21754. *
  21755. * r A single precision number representing condition subtract result.
  21756. * a A single precision number to subtract from.
  21757. * b A single precision number to subtract.
  21758. * m Mask value to apply.
  21759. */
  21760. SP_NOINLINE static sp_digit sp_2048_cond_sub_32(sp_digit* r, const sp_digit* a,
  21761. const sp_digit* b, sp_digit m)
  21762. {
  21763. __asm__ __volatile__ (
  21764. "movs r4, #0\n\t"
  21765. "movs r5, #0x80\n\t"
  21766. "mov r8, r5\n\t"
  21767. "movs r7, #0\n\t"
  21768. "\n"
  21769. "L_sp_2048_cond_sub_32_words_%=:\n\t"
  21770. "ldr r6, [%[b], r7]\n\t"
  21771. #ifdef WOLFSSL_KEIL
  21772. "ands r6, r6, %[m]\n\t"
  21773. #elif defined(__clang__)
  21774. "ands r6, %[m]\n\t"
  21775. #else
  21776. "and r6, %[m]\n\t"
  21777. #endif
  21778. "movs r5, #0\n\t"
  21779. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21780. "subs r5, r5, r4\n\t"
  21781. #else
  21782. "sub r5, r5, r4\n\t"
  21783. #endif
  21784. "ldr r5, [%[a], r7]\n\t"
  21785. #ifdef WOLFSSL_KEIL
  21786. "sbcs r5, r5, r6\n\t"
  21787. #elif defined(__clang__)
  21788. "sbcs r5, r6\n\t"
  21789. #else
  21790. "sbc r5, r6\n\t"
  21791. #endif
  21792. #ifdef WOLFSSL_KEIL
  21793. "sbcs r4, r4, r4\n\t"
  21794. #elif defined(__clang__)
  21795. "sbcs r4, r4\n\t"
  21796. #else
  21797. "sbc r4, r4\n\t"
  21798. #endif
  21799. "str r5, [%[r], r7]\n\t"
  21800. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21801. "adds r7, r7, #4\n\t"
  21802. #else
  21803. "add r7, r7, #4\n\t"
  21804. #endif
  21805. "cmp r7, r8\n\t"
  21806. "blt L_sp_2048_cond_sub_32_words_%=\n\t"
  21807. "movs %[r], r4\n\t"
  21808. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m)
  21809. :
  21810. : "memory", "r4", "r5", "r6", "r7", "r8"
  21811. );
  21812. return (uint32_t)(size_t)r;
  21813. }
  21814. /* Reduce the number back to 2048 bits using Montgomery reduction.
  21815. *
  21816. * a A single precision number to reduce in place.
  21817. * m The single precision number representing the modulus.
  21818. * mp The digit representing the negative inverse of m mod 2^n.
  21819. */
  21820. SP_NOINLINE static void sp_2048_mont_reduce_32(sp_digit* a, const sp_digit* m,
  21821. sp_digit mp)
  21822. {
  21823. __asm__ __volatile__ (
  21824. "movs r7, #0\n\t"
  21825. "mov r8, %[mp]\n\t"
  21826. "mov r12, r7\n\t"
  21827. "mov lr, %[m]\n\t"
  21828. "mov r9, %[a]\n\t"
  21829. "mov r11, %[a]\n\t"
  21830. "movs r5, #0x7c\n\t"
  21831. "movs r6, #0x80\n\t"
  21832. "add r9, r9, r5\n\t"
  21833. "add r11, r11, r6\n\t"
  21834. "\n"
  21835. "L_sp_2048_mont_reduce_32_mod_%=:\n\t"
  21836. "movs r7, #0\n\t"
  21837. "movs r4, #0\n\t"
  21838. "# a[i] += m[0] * mu\n\t"
  21839. "ldm %[m]!, {%[mp]}\n\t"
  21840. "ldm %[a]!, {r3}\n\t"
  21841. "# mu = a[i] * mp\n\t"
  21842. "mov r5, r8\n\t"
  21843. #ifdef WOLFSSL_KEIL
  21844. "muls r5, r3, r5\n\t"
  21845. #elif defined(__clang__)
  21846. "muls r5, r3\n\t"
  21847. #else
  21848. "mul r5, r3\n\t"
  21849. #endif
  21850. "mov r10, r5\n\t"
  21851. "# Multiply m[0] and mu - Start\n\t"
  21852. "mov r5, r10\n\t"
  21853. "uxth r6, %[mp]\n\t"
  21854. "uxth r5, r5\n\t"
  21855. #ifdef WOLFSSL_KEIL
  21856. "muls r6, r5, r6\n\t"
  21857. #elif defined(__clang__)
  21858. "muls r6, r5\n\t"
  21859. #else
  21860. "mul r6, r5\n\t"
  21861. #endif
  21862. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21863. "adds r3, r3, r6\n\t"
  21864. #else
  21865. "add r3, r3, r6\n\t"
  21866. #endif
  21867. #ifdef WOLFSSL_KEIL
  21868. "adcs r4, r4, r7\n\t"
  21869. #elif defined(__clang__)
  21870. "adcs r4, r7\n\t"
  21871. #else
  21872. "adc r4, r7\n\t"
  21873. #endif
  21874. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21875. "lsrs r6, %[mp], #16\n\t"
  21876. #else
  21877. "lsr r6, %[mp], #16\n\t"
  21878. #endif
  21879. #ifdef WOLFSSL_KEIL
  21880. "muls r5, r6, r5\n\t"
  21881. #elif defined(__clang__)
  21882. "muls r5, r6\n\t"
  21883. #else
  21884. "mul r5, r6\n\t"
  21885. #endif
  21886. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21887. "lsrs r6, r5, #16\n\t"
  21888. #else
  21889. "lsr r6, r5, #16\n\t"
  21890. #endif
  21891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21892. "lsls r5, r5, #16\n\t"
  21893. #else
  21894. "lsl r5, r5, #16\n\t"
  21895. #endif
  21896. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21897. "adds r3, r3, r5\n\t"
  21898. #else
  21899. "add r3, r3, r5\n\t"
  21900. #endif
  21901. #ifdef WOLFSSL_KEIL
  21902. "adcs r4, r4, r6\n\t"
  21903. #elif defined(__clang__)
  21904. "adcs r4, r6\n\t"
  21905. #else
  21906. "adc r4, r6\n\t"
  21907. #endif
  21908. "mov r5, r10\n\t"
  21909. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21910. "lsrs r6, %[mp], #16\n\t"
  21911. #else
  21912. "lsr r6, %[mp], #16\n\t"
  21913. #endif
  21914. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21915. "lsrs r5, r5, #16\n\t"
  21916. #else
  21917. "lsr r5, r5, #16\n\t"
  21918. #endif
  21919. #ifdef WOLFSSL_KEIL
  21920. "muls r6, r5, r6\n\t"
  21921. #elif defined(__clang__)
  21922. "muls r6, r5\n\t"
  21923. #else
  21924. "mul r6, r5\n\t"
  21925. #endif
  21926. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21927. "adds r4, r4, r6\n\t"
  21928. #else
  21929. "add r4, r4, r6\n\t"
  21930. #endif
  21931. "uxth r6, %[mp]\n\t"
  21932. #ifdef WOLFSSL_KEIL
  21933. "muls r5, r6, r5\n\t"
  21934. #elif defined(__clang__)
  21935. "muls r5, r6\n\t"
  21936. #else
  21937. "mul r5, r6\n\t"
  21938. #endif
  21939. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21940. "lsrs r6, r5, #16\n\t"
  21941. #else
  21942. "lsr r6, r5, #16\n\t"
  21943. #endif
  21944. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21945. "lsls r5, r5, #16\n\t"
  21946. #else
  21947. "lsl r5, r5, #16\n\t"
  21948. #endif
  21949. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21950. "adds r3, r3, r5\n\t"
  21951. #else
  21952. "add r3, r3, r5\n\t"
  21953. #endif
  21954. #ifdef WOLFSSL_KEIL
  21955. "adcs r4, r4, r6\n\t"
  21956. #elif defined(__clang__)
  21957. "adcs r4, r6\n\t"
  21958. #else
  21959. "adc r4, r6\n\t"
  21960. #endif
  21961. "# Multiply m[0] and mu - Done\n\t"
  21962. "\n"
  21963. "L_sp_2048_mont_reduce_32_word_%=:\n\t"
  21964. "# a[i+j] += m[j] * mu\n\t"
  21965. "ldr r3, [%[a]]\n\t"
  21966. "ldm %[m]!, {%[mp]}\n\t"
  21967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21968. "adds r3, r3, r4\n\t"
  21969. #else
  21970. "add r3, r3, r4\n\t"
  21971. #endif
  21972. "movs r4, #0\n\t"
  21973. #ifdef WOLFSSL_KEIL
  21974. "adcs r4, r4, r7\n\t"
  21975. #elif defined(__clang__)
  21976. "adcs r4, r7\n\t"
  21977. #else
  21978. "adc r4, r7\n\t"
  21979. #endif
  21980. "# Multiply m[j] and mu - Start\n\t"
  21981. "mov r5, r10\n\t"
  21982. "uxth r6, %[mp]\n\t"
  21983. "uxth r5, r5\n\t"
  21984. #ifdef WOLFSSL_KEIL
  21985. "muls r6, r5, r6\n\t"
  21986. #elif defined(__clang__)
  21987. "muls r6, r5\n\t"
  21988. #else
  21989. "mul r6, r5\n\t"
  21990. #endif
  21991. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21992. "adds r3, r3, r6\n\t"
  21993. #else
  21994. "add r3, r3, r6\n\t"
  21995. #endif
  21996. #ifdef WOLFSSL_KEIL
  21997. "adcs r4, r4, r7\n\t"
  21998. #elif defined(__clang__)
  21999. "adcs r4, r7\n\t"
  22000. #else
  22001. "adc r4, r7\n\t"
  22002. #endif
  22003. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22004. "lsrs r6, %[mp], #16\n\t"
  22005. #else
  22006. "lsr r6, %[mp], #16\n\t"
  22007. #endif
  22008. #ifdef WOLFSSL_KEIL
  22009. "muls r5, r6, r5\n\t"
  22010. #elif defined(__clang__)
  22011. "muls r5, r6\n\t"
  22012. #else
  22013. "mul r5, r6\n\t"
  22014. #endif
  22015. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22016. "lsrs r6, r5, #16\n\t"
  22017. #else
  22018. "lsr r6, r5, #16\n\t"
  22019. #endif
  22020. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22021. "lsls r5, r5, #16\n\t"
  22022. #else
  22023. "lsl r5, r5, #16\n\t"
  22024. #endif
  22025. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22026. "adds r3, r3, r5\n\t"
  22027. #else
  22028. "add r3, r3, r5\n\t"
  22029. #endif
  22030. #ifdef WOLFSSL_KEIL
  22031. "adcs r4, r4, r6\n\t"
  22032. #elif defined(__clang__)
  22033. "adcs r4, r6\n\t"
  22034. #else
  22035. "adc r4, r6\n\t"
  22036. #endif
  22037. "mov r5, r10\n\t"
  22038. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22039. "lsrs r6, %[mp], #16\n\t"
  22040. #else
  22041. "lsr r6, %[mp], #16\n\t"
  22042. #endif
  22043. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22044. "lsrs r5, r5, #16\n\t"
  22045. #else
  22046. "lsr r5, r5, #16\n\t"
  22047. #endif
  22048. #ifdef WOLFSSL_KEIL
  22049. "muls r6, r5, r6\n\t"
  22050. #elif defined(__clang__)
  22051. "muls r6, r5\n\t"
  22052. #else
  22053. "mul r6, r5\n\t"
  22054. #endif
  22055. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22056. "adds r4, r4, r6\n\t"
  22057. #else
  22058. "add r4, r4, r6\n\t"
  22059. #endif
  22060. "uxth r6, %[mp]\n\t"
  22061. #ifdef WOLFSSL_KEIL
  22062. "muls r5, r6, r5\n\t"
  22063. #elif defined(__clang__)
  22064. "muls r5, r6\n\t"
  22065. #else
  22066. "mul r5, r6\n\t"
  22067. #endif
  22068. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22069. "lsrs r6, r5, #16\n\t"
  22070. #else
  22071. "lsr r6, r5, #16\n\t"
  22072. #endif
  22073. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22074. "lsls r5, r5, #16\n\t"
  22075. #else
  22076. "lsl r5, r5, #16\n\t"
  22077. #endif
  22078. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22079. "adds r3, r3, r5\n\t"
  22080. #else
  22081. "add r3, r3, r5\n\t"
  22082. #endif
  22083. #ifdef WOLFSSL_KEIL
  22084. "adcs r4, r4, r6\n\t"
  22085. #elif defined(__clang__)
  22086. "adcs r4, r6\n\t"
  22087. #else
  22088. "adc r4, r6\n\t"
  22089. #endif
  22090. "# Multiply m[j] and mu - Done\n\t"
  22091. "stm %[a]!, {r3}\n\t"
  22092. "cmp %[a], r9\n\t"
  22093. "blt L_sp_2048_mont_reduce_32_word_%=\n\t"
  22094. "# a[i+31] += m[31] * mu\n\t"
  22095. "ldr %[mp], [%[m]]\n\t"
  22096. "mov r3, r12\n\t"
  22097. "# Multiply m[31] and mu - Start\n\t"
  22098. "mov r5, r10\n\t"
  22099. "uxth r6, %[mp]\n\t"
  22100. "uxth r5, r5\n\t"
  22101. #ifdef WOLFSSL_KEIL
  22102. "muls r6, r5, r6\n\t"
  22103. #elif defined(__clang__)
  22104. "muls r6, r5\n\t"
  22105. #else
  22106. "mul r6, r5\n\t"
  22107. #endif
  22108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22109. "adds r4, r4, r6\n\t"
  22110. #else
  22111. "add r4, r4, r6\n\t"
  22112. #endif
  22113. #ifdef WOLFSSL_KEIL
  22114. "adcs r3, r3, r7\n\t"
  22115. #elif defined(__clang__)
  22116. "adcs r3, r7\n\t"
  22117. #else
  22118. "adc r3, r7\n\t"
  22119. #endif
  22120. #ifdef WOLFSSL_KEIL
  22121. "adcs r7, r7, r7\n\t"
  22122. #elif defined(__clang__)
  22123. "adcs r7, r7\n\t"
  22124. #else
  22125. "adc r7, r7\n\t"
  22126. #endif
  22127. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22128. "lsrs r6, %[mp], #16\n\t"
  22129. #else
  22130. "lsr r6, %[mp], #16\n\t"
  22131. #endif
  22132. #ifdef WOLFSSL_KEIL
  22133. "muls r5, r6, r5\n\t"
  22134. #elif defined(__clang__)
  22135. "muls r5, r6\n\t"
  22136. #else
  22137. "mul r5, r6\n\t"
  22138. #endif
  22139. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22140. "lsrs r6, r5, #16\n\t"
  22141. #else
  22142. "lsr r6, r5, #16\n\t"
  22143. #endif
  22144. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22145. "lsls r5, r5, #16\n\t"
  22146. #else
  22147. "lsl r5, r5, #16\n\t"
  22148. #endif
  22149. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22150. "adds r4, r4, r5\n\t"
  22151. #else
  22152. "add r4, r4, r5\n\t"
  22153. #endif
  22154. #ifdef WOLFSSL_KEIL
  22155. "adcs r3, r3, r6\n\t"
  22156. #elif defined(__clang__)
  22157. "adcs r3, r6\n\t"
  22158. #else
  22159. "adc r3, r6\n\t"
  22160. #endif
  22161. #ifdef WOLFSSL_KEIL
  22162. "adcs r7, r7, r7\n\t"
  22163. #elif defined(__clang__)
  22164. "adcs r7, r7\n\t"
  22165. #else
  22166. "adc r7, r7\n\t"
  22167. #endif
  22168. "mov r5, r10\n\t"
  22169. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22170. "lsrs r6, %[mp], #16\n\t"
  22171. #else
  22172. "lsr r6, %[mp], #16\n\t"
  22173. #endif
  22174. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22175. "lsrs r5, r5, #16\n\t"
  22176. #else
  22177. "lsr r5, r5, #16\n\t"
  22178. #endif
  22179. #ifdef WOLFSSL_KEIL
  22180. "muls r6, r5, r6\n\t"
  22181. #elif defined(__clang__)
  22182. "muls r6, r5\n\t"
  22183. #else
  22184. "mul r6, r5\n\t"
  22185. #endif
  22186. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22187. "adds r3, r3, r6\n\t"
  22188. #else
  22189. "add r3, r3, r6\n\t"
  22190. #endif
  22191. #ifdef WOLFSSL_KEIL
  22192. "adcs r7, r7, r7\n\t"
  22193. #elif defined(__clang__)
  22194. "adcs r7, r7\n\t"
  22195. #else
  22196. "adc r7, r7\n\t"
  22197. #endif
  22198. "uxth r6, %[mp]\n\t"
  22199. #ifdef WOLFSSL_KEIL
  22200. "muls r5, r6, r5\n\t"
  22201. #elif defined(__clang__)
  22202. "muls r5, r6\n\t"
  22203. #else
  22204. "mul r5, r6\n\t"
  22205. #endif
  22206. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22207. "lsrs r6, r5, #16\n\t"
  22208. #else
  22209. "lsr r6, r5, #16\n\t"
  22210. #endif
  22211. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22212. "lsls r5, r5, #16\n\t"
  22213. #else
  22214. "lsl r5, r5, #16\n\t"
  22215. #endif
  22216. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22217. "adds r4, r4, r5\n\t"
  22218. #else
  22219. "add r4, r4, r5\n\t"
  22220. #endif
  22221. #ifdef WOLFSSL_KEIL
  22222. "adcs r3, r3, r6\n\t"
  22223. #elif defined(__clang__)
  22224. "adcs r3, r6\n\t"
  22225. #else
  22226. "adc r3, r6\n\t"
  22227. #endif
  22228. #ifdef WOLFSSL_KEIL
  22229. "adcs r7, r7, r7\n\t"
  22230. #elif defined(__clang__)
  22231. "adcs r7, r7\n\t"
  22232. #else
  22233. "adc r7, r7\n\t"
  22234. #endif
  22235. "# Multiply m[31] and mu - Done\n\t"
  22236. "ldr r5, [%[a]]\n\t"
  22237. "ldr r6, [%[a], #4]\n\t"
  22238. "movs %[mp], #0\n\t"
  22239. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22240. "adds r5, r5, r4\n\t"
  22241. #else
  22242. "add r5, r5, r4\n\t"
  22243. #endif
  22244. #ifdef WOLFSSL_KEIL
  22245. "adcs r6, r6, r3\n\t"
  22246. #elif defined(__clang__)
  22247. "adcs r6, r3\n\t"
  22248. #else
  22249. "adc r6, r3\n\t"
  22250. #endif
  22251. #ifdef WOLFSSL_KEIL
  22252. "adcs r7, r7, %[mp]\n\t"
  22253. #elif defined(__clang__)
  22254. "adcs r7, %[mp]\n\t"
  22255. #else
  22256. "adc r7, %[mp]\n\t"
  22257. #endif
  22258. "stm %[a]!, {r5, r6}\n\t"
  22259. "# i += 1\n\t"
  22260. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22261. "subs %[a], %[a], #4\n\t"
  22262. #else
  22263. "sub %[a], %[a], #4\n\t"
  22264. #endif
  22265. "movs r3, #0x7c\n\t"
  22266. "mov r9, %[a]\n\t"
  22267. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22268. "subs %[a], %[a], r3\n\t"
  22269. #else
  22270. "sub %[a], %[a], r3\n\t"
  22271. #endif
  22272. "mov r12, r7\n\t"
  22273. "mov %[m], lr\n\t"
  22274. "cmp r11, %[a]\n\t"
  22275. "bgt L_sp_2048_mont_reduce_32_mod_%=\n\t"
  22276. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22277. "negs r7, r7\n\t"
  22278. #else
  22279. "neg r7, r7\n\t"
  22280. #endif
  22281. "# Subtract masked modulus\n\t"
  22282. "movs r4, #0x80\n\t"
  22283. "movs %[mp], #0\n\t"
  22284. "movs r3, #0\n\t"
  22285. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22286. "subs %[a], %[a], r4\n\t"
  22287. #else
  22288. "sub %[a], %[a], r4\n\t"
  22289. #endif
  22290. #ifndef WOLFSSL_SP_LARGE_CODE
  22291. "\n"
  22292. "L_sp_2048_mont_reduce_32_sub_mask_%=:\n\t"
  22293. "ldm %[m]!, {r6}\n\t"
  22294. "movs r5, #0\n\t"
  22295. #ifdef WOLFSSL_KEIL
  22296. "ands r6, r6, r7\n\t"
  22297. #elif defined(__clang__)
  22298. "ands r6, r7\n\t"
  22299. #else
  22300. "and r6, r7\n\t"
  22301. #endif
  22302. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22303. "subs r5, r5, %[mp]\n\t"
  22304. #else
  22305. "sub r5, r5, %[mp]\n\t"
  22306. #endif
  22307. "ldr r5, [%[a], r4]\n\t"
  22308. #ifdef WOLFSSL_KEIL
  22309. "sbcs r5, r5, r6\n\t"
  22310. #elif defined(__clang__)
  22311. "sbcs r5, r6\n\t"
  22312. #else
  22313. "sbc r5, r6\n\t"
  22314. #endif
  22315. #ifdef WOLFSSL_KEIL
  22316. "sbcs %[mp], %[mp], %[mp]\n\t"
  22317. #elif defined(__clang__)
  22318. "sbcs %[mp], %[mp]\n\t"
  22319. #else
  22320. "sbc %[mp], %[mp]\n\t"
  22321. #endif
  22322. "stm %[a]!, {r5}\n\t"
  22323. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22324. "adds r3, r3, #4\n\t"
  22325. #else
  22326. "add r3, r3, #4\n\t"
  22327. #endif
  22328. "cmp r3, r4\n\t"
  22329. "blt L_sp_2048_mont_reduce_32_sub_mask_%=\n\t"
  22330. #else /* WOLFSSL_SP_LARGE_CODE */
  22331. "ldm %[m]!, {r6}\n\t"
  22332. #ifdef WOLFSSL_KEIL
  22333. "ands r6, r6, r7\n\t"
  22334. #elif defined(__clang__)
  22335. "ands r6, r7\n\t"
  22336. #else
  22337. "and r6, r7\n\t"
  22338. #endif
  22339. "ldr r5, [%[a], r4]\n\t"
  22340. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22341. "subs r5, r5, r6\n\t"
  22342. #else
  22343. "sub r5, r5, r6\n\t"
  22344. #endif
  22345. "stm %[a]!, {r5}\n\t"
  22346. "ldm %[m]!, {r6}\n\t"
  22347. #ifdef WOLFSSL_KEIL
  22348. "ands r6, r6, r7\n\t"
  22349. #elif defined(__clang__)
  22350. "ands r6, r7\n\t"
  22351. #else
  22352. "and r6, r7\n\t"
  22353. #endif
  22354. "ldr r5, [%[a], r4]\n\t"
  22355. #ifdef WOLFSSL_KEIL
  22356. "sbcs r5, r5, r6\n\t"
  22357. #elif defined(__clang__)
  22358. "sbcs r5, r6\n\t"
  22359. #else
  22360. "sbc r5, r6\n\t"
  22361. #endif
  22362. "stm %[a]!, {r5}\n\t"
  22363. "ldm %[m]!, {r6}\n\t"
  22364. #ifdef WOLFSSL_KEIL
  22365. "ands r6, r6, r7\n\t"
  22366. #elif defined(__clang__)
  22367. "ands r6, r7\n\t"
  22368. #else
  22369. "and r6, r7\n\t"
  22370. #endif
  22371. "ldr r5, [%[a], r4]\n\t"
  22372. #ifdef WOLFSSL_KEIL
  22373. "sbcs r5, r5, r6\n\t"
  22374. #elif defined(__clang__)
  22375. "sbcs r5, r6\n\t"
  22376. #else
  22377. "sbc r5, r6\n\t"
  22378. #endif
  22379. "stm %[a]!, {r5}\n\t"
  22380. "ldm %[m]!, {r6}\n\t"
  22381. #ifdef WOLFSSL_KEIL
  22382. "ands r6, r6, r7\n\t"
  22383. #elif defined(__clang__)
  22384. "ands r6, r7\n\t"
  22385. #else
  22386. "and r6, r7\n\t"
  22387. #endif
  22388. "ldr r5, [%[a], r4]\n\t"
  22389. #ifdef WOLFSSL_KEIL
  22390. "sbcs r5, r5, r6\n\t"
  22391. #elif defined(__clang__)
  22392. "sbcs r5, r6\n\t"
  22393. #else
  22394. "sbc r5, r6\n\t"
  22395. #endif
  22396. "stm %[a]!, {r5}\n\t"
  22397. "ldm %[m]!, {r6}\n\t"
  22398. #ifdef WOLFSSL_KEIL
  22399. "ands r6, r6, r7\n\t"
  22400. #elif defined(__clang__)
  22401. "ands r6, r7\n\t"
  22402. #else
  22403. "and r6, r7\n\t"
  22404. #endif
  22405. "ldr r5, [%[a], r4]\n\t"
  22406. #ifdef WOLFSSL_KEIL
  22407. "sbcs r5, r5, r6\n\t"
  22408. #elif defined(__clang__)
  22409. "sbcs r5, r6\n\t"
  22410. #else
  22411. "sbc r5, r6\n\t"
  22412. #endif
  22413. "stm %[a]!, {r5}\n\t"
  22414. "ldm %[m]!, {r6}\n\t"
  22415. #ifdef WOLFSSL_KEIL
  22416. "ands r6, r6, r7\n\t"
  22417. #elif defined(__clang__)
  22418. "ands r6, r7\n\t"
  22419. #else
  22420. "and r6, r7\n\t"
  22421. #endif
  22422. "ldr r5, [%[a], r4]\n\t"
  22423. #ifdef WOLFSSL_KEIL
  22424. "sbcs r5, r5, r6\n\t"
  22425. #elif defined(__clang__)
  22426. "sbcs r5, r6\n\t"
  22427. #else
  22428. "sbc r5, r6\n\t"
  22429. #endif
  22430. "stm %[a]!, {r5}\n\t"
  22431. "ldm %[m]!, {r6}\n\t"
  22432. #ifdef WOLFSSL_KEIL
  22433. "ands r6, r6, r7\n\t"
  22434. #elif defined(__clang__)
  22435. "ands r6, r7\n\t"
  22436. #else
  22437. "and r6, r7\n\t"
  22438. #endif
  22439. "ldr r5, [%[a], r4]\n\t"
  22440. #ifdef WOLFSSL_KEIL
  22441. "sbcs r5, r5, r6\n\t"
  22442. #elif defined(__clang__)
  22443. "sbcs r5, r6\n\t"
  22444. #else
  22445. "sbc r5, r6\n\t"
  22446. #endif
  22447. "stm %[a]!, {r5}\n\t"
  22448. "ldm %[m]!, {r6}\n\t"
  22449. #ifdef WOLFSSL_KEIL
  22450. "ands r6, r6, r7\n\t"
  22451. #elif defined(__clang__)
  22452. "ands r6, r7\n\t"
  22453. #else
  22454. "and r6, r7\n\t"
  22455. #endif
  22456. "ldr r5, [%[a], r4]\n\t"
  22457. #ifdef WOLFSSL_KEIL
  22458. "sbcs r5, r5, r6\n\t"
  22459. #elif defined(__clang__)
  22460. "sbcs r5, r6\n\t"
  22461. #else
  22462. "sbc r5, r6\n\t"
  22463. #endif
  22464. "stm %[a]!, {r5}\n\t"
  22465. "ldm %[m]!, {r6}\n\t"
  22466. #ifdef WOLFSSL_KEIL
  22467. "ands r6, r6, r7\n\t"
  22468. #elif defined(__clang__)
  22469. "ands r6, r7\n\t"
  22470. #else
  22471. "and r6, r7\n\t"
  22472. #endif
  22473. "ldr r5, [%[a], r4]\n\t"
  22474. #ifdef WOLFSSL_KEIL
  22475. "sbcs r5, r5, r6\n\t"
  22476. #elif defined(__clang__)
  22477. "sbcs r5, r6\n\t"
  22478. #else
  22479. "sbc r5, r6\n\t"
  22480. #endif
  22481. "stm %[a]!, {r5}\n\t"
  22482. "ldm %[m]!, {r6}\n\t"
  22483. #ifdef WOLFSSL_KEIL
  22484. "ands r6, r6, r7\n\t"
  22485. #elif defined(__clang__)
  22486. "ands r6, r7\n\t"
  22487. #else
  22488. "and r6, r7\n\t"
  22489. #endif
  22490. "ldr r5, [%[a], r4]\n\t"
  22491. #ifdef WOLFSSL_KEIL
  22492. "sbcs r5, r5, r6\n\t"
  22493. #elif defined(__clang__)
  22494. "sbcs r5, r6\n\t"
  22495. #else
  22496. "sbc r5, r6\n\t"
  22497. #endif
  22498. "stm %[a]!, {r5}\n\t"
  22499. "ldm %[m]!, {r6}\n\t"
  22500. #ifdef WOLFSSL_KEIL
  22501. "ands r6, r6, r7\n\t"
  22502. #elif defined(__clang__)
  22503. "ands r6, r7\n\t"
  22504. #else
  22505. "and r6, r7\n\t"
  22506. #endif
  22507. "ldr r5, [%[a], r4]\n\t"
  22508. #ifdef WOLFSSL_KEIL
  22509. "sbcs r5, r5, r6\n\t"
  22510. #elif defined(__clang__)
  22511. "sbcs r5, r6\n\t"
  22512. #else
  22513. "sbc r5, r6\n\t"
  22514. #endif
  22515. "stm %[a]!, {r5}\n\t"
  22516. "ldm %[m]!, {r6}\n\t"
  22517. #ifdef WOLFSSL_KEIL
  22518. "ands r6, r6, r7\n\t"
  22519. #elif defined(__clang__)
  22520. "ands r6, r7\n\t"
  22521. #else
  22522. "and r6, r7\n\t"
  22523. #endif
  22524. "ldr r5, [%[a], r4]\n\t"
  22525. #ifdef WOLFSSL_KEIL
  22526. "sbcs r5, r5, r6\n\t"
  22527. #elif defined(__clang__)
  22528. "sbcs r5, r6\n\t"
  22529. #else
  22530. "sbc r5, r6\n\t"
  22531. #endif
  22532. "stm %[a]!, {r5}\n\t"
  22533. "ldm %[m]!, {r6}\n\t"
  22534. #ifdef WOLFSSL_KEIL
  22535. "ands r6, r6, r7\n\t"
  22536. #elif defined(__clang__)
  22537. "ands r6, r7\n\t"
  22538. #else
  22539. "and r6, r7\n\t"
  22540. #endif
  22541. "ldr r5, [%[a], r4]\n\t"
  22542. #ifdef WOLFSSL_KEIL
  22543. "sbcs r5, r5, r6\n\t"
  22544. #elif defined(__clang__)
  22545. "sbcs r5, r6\n\t"
  22546. #else
  22547. "sbc r5, r6\n\t"
  22548. #endif
  22549. "stm %[a]!, {r5}\n\t"
  22550. "ldm %[m]!, {r6}\n\t"
  22551. #ifdef WOLFSSL_KEIL
  22552. "ands r6, r6, r7\n\t"
  22553. #elif defined(__clang__)
  22554. "ands r6, r7\n\t"
  22555. #else
  22556. "and r6, r7\n\t"
  22557. #endif
  22558. "ldr r5, [%[a], r4]\n\t"
  22559. #ifdef WOLFSSL_KEIL
  22560. "sbcs r5, r5, r6\n\t"
  22561. #elif defined(__clang__)
  22562. "sbcs r5, r6\n\t"
  22563. #else
  22564. "sbc r5, r6\n\t"
  22565. #endif
  22566. "stm %[a]!, {r5}\n\t"
  22567. "ldm %[m]!, {r6}\n\t"
  22568. #ifdef WOLFSSL_KEIL
  22569. "ands r6, r6, r7\n\t"
  22570. #elif defined(__clang__)
  22571. "ands r6, r7\n\t"
  22572. #else
  22573. "and r6, r7\n\t"
  22574. #endif
  22575. "ldr r5, [%[a], r4]\n\t"
  22576. #ifdef WOLFSSL_KEIL
  22577. "sbcs r5, r5, r6\n\t"
  22578. #elif defined(__clang__)
  22579. "sbcs r5, r6\n\t"
  22580. #else
  22581. "sbc r5, r6\n\t"
  22582. #endif
  22583. "stm %[a]!, {r5}\n\t"
  22584. "ldm %[m]!, {r6}\n\t"
  22585. #ifdef WOLFSSL_KEIL
  22586. "ands r6, r6, r7\n\t"
  22587. #elif defined(__clang__)
  22588. "ands r6, r7\n\t"
  22589. #else
  22590. "and r6, r7\n\t"
  22591. #endif
  22592. "ldr r5, [%[a], r4]\n\t"
  22593. #ifdef WOLFSSL_KEIL
  22594. "sbcs r5, r5, r6\n\t"
  22595. #elif defined(__clang__)
  22596. "sbcs r5, r6\n\t"
  22597. #else
  22598. "sbc r5, r6\n\t"
  22599. #endif
  22600. "stm %[a]!, {r5}\n\t"
  22601. "ldm %[m]!, {r6}\n\t"
  22602. #ifdef WOLFSSL_KEIL
  22603. "ands r6, r6, r7\n\t"
  22604. #elif defined(__clang__)
  22605. "ands r6, r7\n\t"
  22606. #else
  22607. "and r6, r7\n\t"
  22608. #endif
  22609. "ldr r5, [%[a], r4]\n\t"
  22610. #ifdef WOLFSSL_KEIL
  22611. "sbcs r5, r5, r6\n\t"
  22612. #elif defined(__clang__)
  22613. "sbcs r5, r6\n\t"
  22614. #else
  22615. "sbc r5, r6\n\t"
  22616. #endif
  22617. "stm %[a]!, {r5}\n\t"
  22618. "ldm %[m]!, {r6}\n\t"
  22619. #ifdef WOLFSSL_KEIL
  22620. "ands r6, r6, r7\n\t"
  22621. #elif defined(__clang__)
  22622. "ands r6, r7\n\t"
  22623. #else
  22624. "and r6, r7\n\t"
  22625. #endif
  22626. "ldr r5, [%[a], r4]\n\t"
  22627. #ifdef WOLFSSL_KEIL
  22628. "sbcs r5, r5, r6\n\t"
  22629. #elif defined(__clang__)
  22630. "sbcs r5, r6\n\t"
  22631. #else
  22632. "sbc r5, r6\n\t"
  22633. #endif
  22634. "stm %[a]!, {r5}\n\t"
  22635. "ldm %[m]!, {r6}\n\t"
  22636. #ifdef WOLFSSL_KEIL
  22637. "ands r6, r6, r7\n\t"
  22638. #elif defined(__clang__)
  22639. "ands r6, r7\n\t"
  22640. #else
  22641. "and r6, r7\n\t"
  22642. #endif
  22643. "ldr r5, [%[a], r4]\n\t"
  22644. #ifdef WOLFSSL_KEIL
  22645. "sbcs r5, r5, r6\n\t"
  22646. #elif defined(__clang__)
  22647. "sbcs r5, r6\n\t"
  22648. #else
  22649. "sbc r5, r6\n\t"
  22650. #endif
  22651. "stm %[a]!, {r5}\n\t"
  22652. "ldm %[m]!, {r6}\n\t"
  22653. #ifdef WOLFSSL_KEIL
  22654. "ands r6, r6, r7\n\t"
  22655. #elif defined(__clang__)
  22656. "ands r6, r7\n\t"
  22657. #else
  22658. "and r6, r7\n\t"
  22659. #endif
  22660. "ldr r5, [%[a], r4]\n\t"
  22661. #ifdef WOLFSSL_KEIL
  22662. "sbcs r5, r5, r6\n\t"
  22663. #elif defined(__clang__)
  22664. "sbcs r5, r6\n\t"
  22665. #else
  22666. "sbc r5, r6\n\t"
  22667. #endif
  22668. "stm %[a]!, {r5}\n\t"
  22669. "ldm %[m]!, {r6}\n\t"
  22670. #ifdef WOLFSSL_KEIL
  22671. "ands r6, r6, r7\n\t"
  22672. #elif defined(__clang__)
  22673. "ands r6, r7\n\t"
  22674. #else
  22675. "and r6, r7\n\t"
  22676. #endif
  22677. "ldr r5, [%[a], r4]\n\t"
  22678. #ifdef WOLFSSL_KEIL
  22679. "sbcs r5, r5, r6\n\t"
  22680. #elif defined(__clang__)
  22681. "sbcs r5, r6\n\t"
  22682. #else
  22683. "sbc r5, r6\n\t"
  22684. #endif
  22685. "stm %[a]!, {r5}\n\t"
  22686. "ldm %[m]!, {r6}\n\t"
  22687. #ifdef WOLFSSL_KEIL
  22688. "ands r6, r6, r7\n\t"
  22689. #elif defined(__clang__)
  22690. "ands r6, r7\n\t"
  22691. #else
  22692. "and r6, r7\n\t"
  22693. #endif
  22694. "ldr r5, [%[a], r4]\n\t"
  22695. #ifdef WOLFSSL_KEIL
  22696. "sbcs r5, r5, r6\n\t"
  22697. #elif defined(__clang__)
  22698. "sbcs r5, r6\n\t"
  22699. #else
  22700. "sbc r5, r6\n\t"
  22701. #endif
  22702. "stm %[a]!, {r5}\n\t"
  22703. "ldm %[m]!, {r6}\n\t"
  22704. #ifdef WOLFSSL_KEIL
  22705. "ands r6, r6, r7\n\t"
  22706. #elif defined(__clang__)
  22707. "ands r6, r7\n\t"
  22708. #else
  22709. "and r6, r7\n\t"
  22710. #endif
  22711. "ldr r5, [%[a], r4]\n\t"
  22712. #ifdef WOLFSSL_KEIL
  22713. "sbcs r5, r5, r6\n\t"
  22714. #elif defined(__clang__)
  22715. "sbcs r5, r6\n\t"
  22716. #else
  22717. "sbc r5, r6\n\t"
  22718. #endif
  22719. "stm %[a]!, {r5}\n\t"
  22720. "ldm %[m]!, {r6}\n\t"
  22721. #ifdef WOLFSSL_KEIL
  22722. "ands r6, r6, r7\n\t"
  22723. #elif defined(__clang__)
  22724. "ands r6, r7\n\t"
  22725. #else
  22726. "and r6, r7\n\t"
  22727. #endif
  22728. "ldr r5, [%[a], r4]\n\t"
  22729. #ifdef WOLFSSL_KEIL
  22730. "sbcs r5, r5, r6\n\t"
  22731. #elif defined(__clang__)
  22732. "sbcs r5, r6\n\t"
  22733. #else
  22734. "sbc r5, r6\n\t"
  22735. #endif
  22736. "stm %[a]!, {r5}\n\t"
  22737. "ldm %[m]!, {r6}\n\t"
  22738. #ifdef WOLFSSL_KEIL
  22739. "ands r6, r6, r7\n\t"
  22740. #elif defined(__clang__)
  22741. "ands r6, r7\n\t"
  22742. #else
  22743. "and r6, r7\n\t"
  22744. #endif
  22745. "ldr r5, [%[a], r4]\n\t"
  22746. #ifdef WOLFSSL_KEIL
  22747. "sbcs r5, r5, r6\n\t"
  22748. #elif defined(__clang__)
  22749. "sbcs r5, r6\n\t"
  22750. #else
  22751. "sbc r5, r6\n\t"
  22752. #endif
  22753. "stm %[a]!, {r5}\n\t"
  22754. "ldm %[m]!, {r6}\n\t"
  22755. #ifdef WOLFSSL_KEIL
  22756. "ands r6, r6, r7\n\t"
  22757. #elif defined(__clang__)
  22758. "ands r6, r7\n\t"
  22759. #else
  22760. "and r6, r7\n\t"
  22761. #endif
  22762. "ldr r5, [%[a], r4]\n\t"
  22763. #ifdef WOLFSSL_KEIL
  22764. "sbcs r5, r5, r6\n\t"
  22765. #elif defined(__clang__)
  22766. "sbcs r5, r6\n\t"
  22767. #else
  22768. "sbc r5, r6\n\t"
  22769. #endif
  22770. "stm %[a]!, {r5}\n\t"
  22771. "ldm %[m]!, {r6}\n\t"
  22772. #ifdef WOLFSSL_KEIL
  22773. "ands r6, r6, r7\n\t"
  22774. #elif defined(__clang__)
  22775. "ands r6, r7\n\t"
  22776. #else
  22777. "and r6, r7\n\t"
  22778. #endif
  22779. "ldr r5, [%[a], r4]\n\t"
  22780. #ifdef WOLFSSL_KEIL
  22781. "sbcs r5, r5, r6\n\t"
  22782. #elif defined(__clang__)
  22783. "sbcs r5, r6\n\t"
  22784. #else
  22785. "sbc r5, r6\n\t"
  22786. #endif
  22787. "stm %[a]!, {r5}\n\t"
  22788. "ldm %[m]!, {r6}\n\t"
  22789. #ifdef WOLFSSL_KEIL
  22790. "ands r6, r6, r7\n\t"
  22791. #elif defined(__clang__)
  22792. "ands r6, r7\n\t"
  22793. #else
  22794. "and r6, r7\n\t"
  22795. #endif
  22796. "ldr r5, [%[a], r4]\n\t"
  22797. #ifdef WOLFSSL_KEIL
  22798. "sbcs r5, r5, r6\n\t"
  22799. #elif defined(__clang__)
  22800. "sbcs r5, r6\n\t"
  22801. #else
  22802. "sbc r5, r6\n\t"
  22803. #endif
  22804. "stm %[a]!, {r5}\n\t"
  22805. "ldm %[m]!, {r6}\n\t"
  22806. #ifdef WOLFSSL_KEIL
  22807. "ands r6, r6, r7\n\t"
  22808. #elif defined(__clang__)
  22809. "ands r6, r7\n\t"
  22810. #else
  22811. "and r6, r7\n\t"
  22812. #endif
  22813. "ldr r5, [%[a], r4]\n\t"
  22814. #ifdef WOLFSSL_KEIL
  22815. "sbcs r5, r5, r6\n\t"
  22816. #elif defined(__clang__)
  22817. "sbcs r5, r6\n\t"
  22818. #else
  22819. "sbc r5, r6\n\t"
  22820. #endif
  22821. "stm %[a]!, {r5}\n\t"
  22822. "ldm %[m]!, {r6}\n\t"
  22823. #ifdef WOLFSSL_KEIL
  22824. "ands r6, r6, r7\n\t"
  22825. #elif defined(__clang__)
  22826. "ands r6, r7\n\t"
  22827. #else
  22828. "and r6, r7\n\t"
  22829. #endif
  22830. "ldr r5, [%[a], r4]\n\t"
  22831. #ifdef WOLFSSL_KEIL
  22832. "sbcs r5, r5, r6\n\t"
  22833. #elif defined(__clang__)
  22834. "sbcs r5, r6\n\t"
  22835. #else
  22836. "sbc r5, r6\n\t"
  22837. #endif
  22838. "stm %[a]!, {r5}\n\t"
  22839. "ldm %[m]!, {r6}\n\t"
  22840. #ifdef WOLFSSL_KEIL
  22841. "ands r6, r6, r7\n\t"
  22842. #elif defined(__clang__)
  22843. "ands r6, r7\n\t"
  22844. #else
  22845. "and r6, r7\n\t"
  22846. #endif
  22847. "ldr r5, [%[a], r4]\n\t"
  22848. #ifdef WOLFSSL_KEIL
  22849. "sbcs r5, r5, r6\n\t"
  22850. #elif defined(__clang__)
  22851. "sbcs r5, r6\n\t"
  22852. #else
  22853. "sbc r5, r6\n\t"
  22854. #endif
  22855. "stm %[a]!, {r5}\n\t"
  22856. "ldm %[m]!, {r6}\n\t"
  22857. #ifdef WOLFSSL_KEIL
  22858. "ands r6, r6, r7\n\t"
  22859. #elif defined(__clang__)
  22860. "ands r6, r7\n\t"
  22861. #else
  22862. "and r6, r7\n\t"
  22863. #endif
  22864. "ldr r5, [%[a], r4]\n\t"
  22865. #ifdef WOLFSSL_KEIL
  22866. "sbcs r5, r5, r6\n\t"
  22867. #elif defined(__clang__)
  22868. "sbcs r5, r6\n\t"
  22869. #else
  22870. "sbc r5, r6\n\t"
  22871. #endif
  22872. "stm %[a]!, {r5}\n\t"
  22873. #endif /* WOLFSSL_SP_LARGE_CODE */
  22874. : [a] "+l" (a), [m] "+l" (m), [mp] "+l" (mp)
  22875. :
  22876. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr"
  22877. );
  22878. }
  22879. /* Multiply two Montgomery form numbers mod the modulus (prime).
  22880. * (r = a * b mod m)
  22881. *
  22882. * r Result of multiplication.
  22883. * a First number to multiply in Montgomery form.
  22884. * b Second number to multiply in Montgomery form.
  22885. * m Modulus (prime).
  22886. * mp Montgomery mulitplier.
  22887. */
  22888. SP_NOINLINE static void sp_2048_mont_mul_32(sp_digit* r, const sp_digit* a,
  22889. const sp_digit* b, const sp_digit* m, sp_digit mp)
  22890. {
  22891. sp_2048_mul_32(r, a, b);
  22892. sp_2048_mont_reduce_32(r, m, mp);
  22893. }
  22894. /* Square the Montgomery form number. (r = a * a mod m)
  22895. *
  22896. * r Result of squaring.
  22897. * a Number to square in Montgomery form.
  22898. * m Modulus (prime).
  22899. * mp Montgomery mulitplier.
  22900. */
  22901. SP_NOINLINE static void sp_2048_mont_sqr_32(sp_digit* r, const sp_digit* a,
  22902. const sp_digit* m, sp_digit mp)
  22903. {
  22904. sp_2048_sqr_32(r, a);
  22905. sp_2048_mont_reduce_32(r, m, mp);
  22906. }
  22907. /* Mul a by digit b into r. (r = a * b)
  22908. *
  22909. * r A single precision integer.
  22910. * a A single precision integer.
  22911. * b A single precision digit.
  22912. */
  22913. SP_NOINLINE static void sp_2048_mul_d_32(sp_digit* r, const sp_digit* a,
  22914. sp_digit b)
  22915. {
  22916. __asm__ __volatile__ (
  22917. "movs r6, #0x80\n\t"
  22918. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22919. "adds r6, r6, %[a]\n\t"
  22920. #else
  22921. "add r6, r6, %[a]\n\t"
  22922. #endif
  22923. "mov r8, %[r]\n\t"
  22924. "mov r9, r6\n\t"
  22925. "movs r3, #0\n\t"
  22926. "movs r4, #0\n\t"
  22927. "\n"
  22928. "L_sp_2048_mul_d_32_%=:\n\t"
  22929. "movs %[r], #0\n\t"
  22930. "movs r5, #0\n\t"
  22931. "# A[] * B\n\t"
  22932. "ldrh r6, [%[a]]\n\t"
  22933. "uxth r7, %[b]\n\t"
  22934. #ifdef WOLFSSL_KEIL
  22935. "muls r7, r6, r7\n\t"
  22936. #elif defined(__clang__)
  22937. "muls r7, r6\n\t"
  22938. #else
  22939. "mul r7, r6\n\t"
  22940. #endif
  22941. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22942. "adds r3, r3, r7\n\t"
  22943. #else
  22944. "add r3, r3, r7\n\t"
  22945. #endif
  22946. #ifdef WOLFSSL_KEIL
  22947. "adcs r4, r4, %[r]\n\t"
  22948. #elif defined(__clang__)
  22949. "adcs r4, %[r]\n\t"
  22950. #else
  22951. "adc r4, %[r]\n\t"
  22952. #endif
  22953. #ifdef WOLFSSL_KEIL
  22954. "adcs r5, r5, %[r]\n\t"
  22955. #elif defined(__clang__)
  22956. "adcs r5, %[r]\n\t"
  22957. #else
  22958. "adc r5, %[r]\n\t"
  22959. #endif
  22960. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22961. "lsrs r7, %[b], #16\n\t"
  22962. #else
  22963. "lsr r7, %[b], #16\n\t"
  22964. #endif
  22965. #ifdef WOLFSSL_KEIL
  22966. "muls r6, r7, r6\n\t"
  22967. #elif defined(__clang__)
  22968. "muls r6, r7\n\t"
  22969. #else
  22970. "mul r6, r7\n\t"
  22971. #endif
  22972. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22973. "lsrs r7, r6, #16\n\t"
  22974. #else
  22975. "lsr r7, r6, #16\n\t"
  22976. #endif
  22977. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22978. "lsls r6, r6, #16\n\t"
  22979. #else
  22980. "lsl r6, r6, #16\n\t"
  22981. #endif
  22982. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22983. "adds r3, r3, r6\n\t"
  22984. #else
  22985. "add r3, r3, r6\n\t"
  22986. #endif
  22987. #ifdef WOLFSSL_KEIL
  22988. "adcs r4, r4, r7\n\t"
  22989. #elif defined(__clang__)
  22990. "adcs r4, r7\n\t"
  22991. #else
  22992. "adc r4, r7\n\t"
  22993. #endif
  22994. #ifdef WOLFSSL_KEIL
  22995. "adcs r5, r5, %[r]\n\t"
  22996. #elif defined(__clang__)
  22997. "adcs r5, %[r]\n\t"
  22998. #else
  22999. "adc r5, %[r]\n\t"
  23000. #endif
  23001. "ldr r6, [%[a]]\n\t"
  23002. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23003. "lsrs r6, r6, #16\n\t"
  23004. #else
  23005. "lsr r6, r6, #16\n\t"
  23006. #endif
  23007. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23008. "lsrs r7, %[b], #16\n\t"
  23009. #else
  23010. "lsr r7, %[b], #16\n\t"
  23011. #endif
  23012. #ifdef WOLFSSL_KEIL
  23013. "muls r7, r6, r7\n\t"
  23014. #elif defined(__clang__)
  23015. "muls r7, r6\n\t"
  23016. #else
  23017. "mul r7, r6\n\t"
  23018. #endif
  23019. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23020. "adds r4, r4, r7\n\t"
  23021. #else
  23022. "add r4, r4, r7\n\t"
  23023. #endif
  23024. #ifdef WOLFSSL_KEIL
  23025. "adcs r5, r5, %[r]\n\t"
  23026. #elif defined(__clang__)
  23027. "adcs r5, %[r]\n\t"
  23028. #else
  23029. "adc r5, %[r]\n\t"
  23030. #endif
  23031. "uxth r7, %[b]\n\t"
  23032. #ifdef WOLFSSL_KEIL
  23033. "muls r6, r7, r6\n\t"
  23034. #elif defined(__clang__)
  23035. "muls r6, r7\n\t"
  23036. #else
  23037. "mul r6, r7\n\t"
  23038. #endif
  23039. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23040. "lsrs r7, r6, #16\n\t"
  23041. #else
  23042. "lsr r7, r6, #16\n\t"
  23043. #endif
  23044. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23045. "lsls r6, r6, #16\n\t"
  23046. #else
  23047. "lsl r6, r6, #16\n\t"
  23048. #endif
  23049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23050. "adds r3, r3, r6\n\t"
  23051. #else
  23052. "add r3, r3, r6\n\t"
  23053. #endif
  23054. #ifdef WOLFSSL_KEIL
  23055. "adcs r4, r4, r7\n\t"
  23056. #elif defined(__clang__)
  23057. "adcs r4, r7\n\t"
  23058. #else
  23059. "adc r4, r7\n\t"
  23060. #endif
  23061. #ifdef WOLFSSL_KEIL
  23062. "adcs r5, r5, %[r]\n\t"
  23063. #elif defined(__clang__)
  23064. "adcs r5, %[r]\n\t"
  23065. #else
  23066. "adc r5, %[r]\n\t"
  23067. #endif
  23068. "# A[] * B - Done\n\t"
  23069. "mov %[r], r8\n\t"
  23070. "str r3, [%[r]]\n\t"
  23071. "movs r3, r4\n\t"
  23072. "movs r4, r5\n\t"
  23073. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23074. "adds %[r], %[r], #4\n\t"
  23075. #else
  23076. "add %[r], %[r], #4\n\t"
  23077. #endif
  23078. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23079. "adds %[a], %[a], #4\n\t"
  23080. #else
  23081. "add %[a], %[a], #4\n\t"
  23082. #endif
  23083. "mov r8, %[r]\n\t"
  23084. "cmp %[a], r9\n\t"
  23085. "blt L_sp_2048_mul_d_32_%=\n\t"
  23086. "str r3, [%[r]]\n\t"
  23087. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  23088. :
  23089. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  23090. );
  23091. }
  23092. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  23093. *
  23094. * d1 The high order half of the number to divide.
  23095. * d0 The low order half of the number to divide.
  23096. * div The divisor.
  23097. * returns the result of the division.
  23098. *
  23099. * Note that this is an approximate div. It may give an answer 1 larger.
  23100. */
  23101. SP_NOINLINE static sp_digit div_2048_word_32(sp_digit d1, sp_digit d0,
  23102. sp_digit div)
  23103. {
  23104. __asm__ __volatile__ (
  23105. "movs r3, #0\n\t"
  23106. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23107. "lsrs r5, %[div], #1\n\t"
  23108. #else
  23109. "lsr r5, %[div], #1\n\t"
  23110. #endif
  23111. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23112. "adds r5, r5, #1\n\t"
  23113. #else
  23114. "add r5, r5, #1\n\t"
  23115. #endif
  23116. "mov r8, %[d0]\n\t"
  23117. "mov r9, %[d1]\n\t"
  23118. "# Do top 32\n\t"
  23119. "movs r6, r5\n\t"
  23120. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23121. "subs r6, r6, %[d1]\n\t"
  23122. #else
  23123. "sub r6, r6, %[d1]\n\t"
  23124. #endif
  23125. #ifdef WOLFSSL_KEIL
  23126. "sbcs r6, r6, r6\n\t"
  23127. #elif defined(__clang__)
  23128. "sbcs r6, r6\n\t"
  23129. #else
  23130. "sbc r6, r6\n\t"
  23131. #endif
  23132. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23133. "adds r3, r3, r3\n\t"
  23134. #else
  23135. "add r3, r3, r3\n\t"
  23136. #endif
  23137. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23138. "subs r3, r3, r6\n\t"
  23139. #else
  23140. "sub r3, r3, r6\n\t"
  23141. #endif
  23142. #ifdef WOLFSSL_KEIL
  23143. "ands r6, r6, r5\n\t"
  23144. #elif defined(__clang__)
  23145. "ands r6, r5\n\t"
  23146. #else
  23147. "and r6, r5\n\t"
  23148. #endif
  23149. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23150. "subs %[d1], %[d1], r6\n\t"
  23151. #else
  23152. "sub %[d1], %[d1], r6\n\t"
  23153. #endif
  23154. "movs r4, #29\n\t"
  23155. "\n"
  23156. "L_div_2048_word_32_loop_%=:\n\t"
  23157. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23158. "lsls %[d0], %[d0], #1\n\t"
  23159. #else
  23160. "lsl %[d0], %[d0], #1\n\t"
  23161. #endif
  23162. #ifdef WOLFSSL_KEIL
  23163. "adcs %[d1], %[d1], %[d1]\n\t"
  23164. #elif defined(__clang__)
  23165. "adcs %[d1], %[d1]\n\t"
  23166. #else
  23167. "adc %[d1], %[d1]\n\t"
  23168. #endif
  23169. "movs r6, r5\n\t"
  23170. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23171. "subs r6, r6, %[d1]\n\t"
  23172. #else
  23173. "sub r6, r6, %[d1]\n\t"
  23174. #endif
  23175. #ifdef WOLFSSL_KEIL
  23176. "sbcs r6, r6, r6\n\t"
  23177. #elif defined(__clang__)
  23178. "sbcs r6, r6\n\t"
  23179. #else
  23180. "sbc r6, r6\n\t"
  23181. #endif
  23182. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23183. "adds r3, r3, r3\n\t"
  23184. #else
  23185. "add r3, r3, r3\n\t"
  23186. #endif
  23187. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23188. "subs r3, r3, r6\n\t"
  23189. #else
  23190. "sub r3, r3, r6\n\t"
  23191. #endif
  23192. #ifdef WOLFSSL_KEIL
  23193. "ands r6, r6, r5\n\t"
  23194. #elif defined(__clang__)
  23195. "ands r6, r5\n\t"
  23196. #else
  23197. "and r6, r5\n\t"
  23198. #endif
  23199. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23200. "subs %[d1], %[d1], r6\n\t"
  23201. #else
  23202. "sub %[d1], %[d1], r6\n\t"
  23203. #endif
  23204. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23205. "subs r4, r4, #1\n\t"
  23206. #else
  23207. "sub r4, r4, #1\n\t"
  23208. #endif
  23209. "bpl L_div_2048_word_32_loop_%=\n\t"
  23210. "movs r7, #0\n\t"
  23211. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23212. "adds r3, r3, r3\n\t"
  23213. #else
  23214. "add r3, r3, r3\n\t"
  23215. #endif
  23216. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23217. "adds r3, r3, #1\n\t"
  23218. #else
  23219. "add r3, r3, #1\n\t"
  23220. #endif
  23221. "# r * div - Start\n\t"
  23222. "uxth %[d1], r3\n\t"
  23223. "uxth r4, %[div]\n\t"
  23224. #ifdef WOLFSSL_KEIL
  23225. "muls r4, %[d1], r4\n\t"
  23226. #elif defined(__clang__)
  23227. "muls r4, %[d1]\n\t"
  23228. #else
  23229. "mul r4, %[d1]\n\t"
  23230. #endif
  23231. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23232. "lsrs r6, %[div], #16\n\t"
  23233. #else
  23234. "lsr r6, %[div], #16\n\t"
  23235. #endif
  23236. #ifdef WOLFSSL_KEIL
  23237. "muls %[d1], r6, %[d1]\n\t"
  23238. #elif defined(__clang__)
  23239. "muls %[d1], r6\n\t"
  23240. #else
  23241. "mul %[d1], r6\n\t"
  23242. #endif
  23243. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23244. "lsrs r5, %[d1], #16\n\t"
  23245. #else
  23246. "lsr r5, %[d1], #16\n\t"
  23247. #endif
  23248. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23249. "lsls %[d1], %[d1], #16\n\t"
  23250. #else
  23251. "lsl %[d1], %[d1], #16\n\t"
  23252. #endif
  23253. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23254. "adds r4, r4, %[d1]\n\t"
  23255. #else
  23256. "add r4, r4, %[d1]\n\t"
  23257. #endif
  23258. #ifdef WOLFSSL_KEIL
  23259. "adcs r5, r5, r7\n\t"
  23260. #elif defined(__clang__)
  23261. "adcs r5, r7\n\t"
  23262. #else
  23263. "adc r5, r7\n\t"
  23264. #endif
  23265. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23266. "lsrs %[d1], r3, #16\n\t"
  23267. #else
  23268. "lsr %[d1], r3, #16\n\t"
  23269. #endif
  23270. #ifdef WOLFSSL_KEIL
  23271. "muls r6, %[d1], r6\n\t"
  23272. #elif defined(__clang__)
  23273. "muls r6, %[d1]\n\t"
  23274. #else
  23275. "mul r6, %[d1]\n\t"
  23276. #endif
  23277. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23278. "adds r5, r5, r6\n\t"
  23279. #else
  23280. "add r5, r5, r6\n\t"
  23281. #endif
  23282. "uxth r6, %[div]\n\t"
  23283. #ifdef WOLFSSL_KEIL
  23284. "muls %[d1], r6, %[d1]\n\t"
  23285. #elif defined(__clang__)
  23286. "muls %[d1], r6\n\t"
  23287. #else
  23288. "mul %[d1], r6\n\t"
  23289. #endif
  23290. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23291. "lsrs r6, %[d1], #16\n\t"
  23292. #else
  23293. "lsr r6, %[d1], #16\n\t"
  23294. #endif
  23295. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23296. "lsls %[d1], %[d1], #16\n\t"
  23297. #else
  23298. "lsl %[d1], %[d1], #16\n\t"
  23299. #endif
  23300. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23301. "adds r4, r4, %[d1]\n\t"
  23302. #else
  23303. "add r4, r4, %[d1]\n\t"
  23304. #endif
  23305. #ifdef WOLFSSL_KEIL
  23306. "adcs r5, r5, r6\n\t"
  23307. #elif defined(__clang__)
  23308. "adcs r5, r6\n\t"
  23309. #else
  23310. "adc r5, r6\n\t"
  23311. #endif
  23312. "# r * div - Done\n\t"
  23313. "mov %[d1], r8\n\t"
  23314. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23315. "subs %[d1], %[d1], r4\n\t"
  23316. #else
  23317. "sub %[d1], %[d1], r4\n\t"
  23318. #endif
  23319. "movs r4, %[d1]\n\t"
  23320. "mov %[d1], r9\n\t"
  23321. #ifdef WOLFSSL_KEIL
  23322. "sbcs %[d1], %[d1], r5\n\t"
  23323. #elif defined(__clang__)
  23324. "sbcs %[d1], r5\n\t"
  23325. #else
  23326. "sbc %[d1], r5\n\t"
  23327. #endif
  23328. "movs r5, %[d1]\n\t"
  23329. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23330. "adds r3, r3, r5\n\t"
  23331. #else
  23332. "add r3, r3, r5\n\t"
  23333. #endif
  23334. "# r * div - Start\n\t"
  23335. "uxth %[d1], r3\n\t"
  23336. "uxth r4, %[div]\n\t"
  23337. #ifdef WOLFSSL_KEIL
  23338. "muls r4, %[d1], r4\n\t"
  23339. #elif defined(__clang__)
  23340. "muls r4, %[d1]\n\t"
  23341. #else
  23342. "mul r4, %[d1]\n\t"
  23343. #endif
  23344. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23345. "lsrs r6, %[div], #16\n\t"
  23346. #else
  23347. "lsr r6, %[div], #16\n\t"
  23348. #endif
  23349. #ifdef WOLFSSL_KEIL
  23350. "muls %[d1], r6, %[d1]\n\t"
  23351. #elif defined(__clang__)
  23352. "muls %[d1], r6\n\t"
  23353. #else
  23354. "mul %[d1], r6\n\t"
  23355. #endif
  23356. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23357. "lsrs r5, %[d1], #16\n\t"
  23358. #else
  23359. "lsr r5, %[d1], #16\n\t"
  23360. #endif
  23361. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23362. "lsls %[d1], %[d1], #16\n\t"
  23363. #else
  23364. "lsl %[d1], %[d1], #16\n\t"
  23365. #endif
  23366. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23367. "adds r4, r4, %[d1]\n\t"
  23368. #else
  23369. "add r4, r4, %[d1]\n\t"
  23370. #endif
  23371. #ifdef WOLFSSL_KEIL
  23372. "adcs r5, r5, r7\n\t"
  23373. #elif defined(__clang__)
  23374. "adcs r5, r7\n\t"
  23375. #else
  23376. "adc r5, r7\n\t"
  23377. #endif
  23378. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23379. "lsrs %[d1], r3, #16\n\t"
  23380. #else
  23381. "lsr %[d1], r3, #16\n\t"
  23382. #endif
  23383. #ifdef WOLFSSL_KEIL
  23384. "muls r6, %[d1], r6\n\t"
  23385. #elif defined(__clang__)
  23386. "muls r6, %[d1]\n\t"
  23387. #else
  23388. "mul r6, %[d1]\n\t"
  23389. #endif
  23390. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23391. "adds r5, r5, r6\n\t"
  23392. #else
  23393. "add r5, r5, r6\n\t"
  23394. #endif
  23395. "uxth r6, %[div]\n\t"
  23396. #ifdef WOLFSSL_KEIL
  23397. "muls %[d1], r6, %[d1]\n\t"
  23398. #elif defined(__clang__)
  23399. "muls %[d1], r6\n\t"
  23400. #else
  23401. "mul %[d1], r6\n\t"
  23402. #endif
  23403. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23404. "lsrs r6, %[d1], #16\n\t"
  23405. #else
  23406. "lsr r6, %[d1], #16\n\t"
  23407. #endif
  23408. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23409. "lsls %[d1], %[d1], #16\n\t"
  23410. #else
  23411. "lsl %[d1], %[d1], #16\n\t"
  23412. #endif
  23413. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23414. "adds r4, r4, %[d1]\n\t"
  23415. #else
  23416. "add r4, r4, %[d1]\n\t"
  23417. #endif
  23418. #ifdef WOLFSSL_KEIL
  23419. "adcs r5, r5, r6\n\t"
  23420. #elif defined(__clang__)
  23421. "adcs r5, r6\n\t"
  23422. #else
  23423. "adc r5, r6\n\t"
  23424. #endif
  23425. "# r * div - Done\n\t"
  23426. "mov %[d1], r8\n\t"
  23427. "mov r6, r9\n\t"
  23428. #ifdef WOLFSSL_KEIL
  23429. "subs r4, %[d1], r4\n\t"
  23430. #else
  23431. #ifdef __clang__
  23432. "subs r4, %[d1], r4\n\t"
  23433. #else
  23434. "sub r4, %[d1], r4\n\t"
  23435. #endif
  23436. #endif
  23437. #ifdef WOLFSSL_KEIL
  23438. "sbcs r6, r6, r5\n\t"
  23439. #elif defined(__clang__)
  23440. "sbcs r6, r5\n\t"
  23441. #else
  23442. "sbc r6, r5\n\t"
  23443. #endif
  23444. "movs r5, r6\n\t"
  23445. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23446. "adds r3, r3, r5\n\t"
  23447. #else
  23448. "add r3, r3, r5\n\t"
  23449. #endif
  23450. "# r * div - Start\n\t"
  23451. "uxth %[d1], r3\n\t"
  23452. "uxth r4, %[div]\n\t"
  23453. #ifdef WOLFSSL_KEIL
  23454. "muls r4, %[d1], r4\n\t"
  23455. #elif defined(__clang__)
  23456. "muls r4, %[d1]\n\t"
  23457. #else
  23458. "mul r4, %[d1]\n\t"
  23459. #endif
  23460. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23461. "lsrs r6, %[div], #16\n\t"
  23462. #else
  23463. "lsr r6, %[div], #16\n\t"
  23464. #endif
  23465. #ifdef WOLFSSL_KEIL
  23466. "muls %[d1], r6, %[d1]\n\t"
  23467. #elif defined(__clang__)
  23468. "muls %[d1], r6\n\t"
  23469. #else
  23470. "mul %[d1], r6\n\t"
  23471. #endif
  23472. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23473. "lsrs r5, %[d1], #16\n\t"
  23474. #else
  23475. "lsr r5, %[d1], #16\n\t"
  23476. #endif
  23477. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23478. "lsls %[d1], %[d1], #16\n\t"
  23479. #else
  23480. "lsl %[d1], %[d1], #16\n\t"
  23481. #endif
  23482. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23483. "adds r4, r4, %[d1]\n\t"
  23484. #else
  23485. "add r4, r4, %[d1]\n\t"
  23486. #endif
  23487. #ifdef WOLFSSL_KEIL
  23488. "adcs r5, r5, r7\n\t"
  23489. #elif defined(__clang__)
  23490. "adcs r5, r7\n\t"
  23491. #else
  23492. "adc r5, r7\n\t"
  23493. #endif
  23494. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23495. "lsrs %[d1], r3, #16\n\t"
  23496. #else
  23497. "lsr %[d1], r3, #16\n\t"
  23498. #endif
  23499. #ifdef WOLFSSL_KEIL
  23500. "muls r6, %[d1], r6\n\t"
  23501. #elif defined(__clang__)
  23502. "muls r6, %[d1]\n\t"
  23503. #else
  23504. "mul r6, %[d1]\n\t"
  23505. #endif
  23506. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23507. "adds r5, r5, r6\n\t"
  23508. #else
  23509. "add r5, r5, r6\n\t"
  23510. #endif
  23511. "uxth r6, %[div]\n\t"
  23512. #ifdef WOLFSSL_KEIL
  23513. "muls %[d1], r6, %[d1]\n\t"
  23514. #elif defined(__clang__)
  23515. "muls %[d1], r6\n\t"
  23516. #else
  23517. "mul %[d1], r6\n\t"
  23518. #endif
  23519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23520. "lsrs r6, %[d1], #16\n\t"
  23521. #else
  23522. "lsr r6, %[d1], #16\n\t"
  23523. #endif
  23524. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23525. "lsls %[d1], %[d1], #16\n\t"
  23526. #else
  23527. "lsl %[d1], %[d1], #16\n\t"
  23528. #endif
  23529. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23530. "adds r4, r4, %[d1]\n\t"
  23531. #else
  23532. "add r4, r4, %[d1]\n\t"
  23533. #endif
  23534. #ifdef WOLFSSL_KEIL
  23535. "adcs r5, r5, r6\n\t"
  23536. #elif defined(__clang__)
  23537. "adcs r5, r6\n\t"
  23538. #else
  23539. "adc r5, r6\n\t"
  23540. #endif
  23541. "# r * div - Done\n\t"
  23542. "mov %[d1], r8\n\t"
  23543. "mov r6, r9\n\t"
  23544. #ifdef WOLFSSL_KEIL
  23545. "subs r4, %[d1], r4\n\t"
  23546. #else
  23547. #ifdef __clang__
  23548. "subs r4, %[d1], r4\n\t"
  23549. #else
  23550. "sub r4, %[d1], r4\n\t"
  23551. #endif
  23552. #endif
  23553. #ifdef WOLFSSL_KEIL
  23554. "sbcs r6, r6, r5\n\t"
  23555. #elif defined(__clang__)
  23556. "sbcs r6, r5\n\t"
  23557. #else
  23558. "sbc r6, r5\n\t"
  23559. #endif
  23560. "movs r5, r6\n\t"
  23561. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23562. "adds r3, r3, r5\n\t"
  23563. #else
  23564. "add r3, r3, r5\n\t"
  23565. #endif
  23566. "# r * div - Start\n\t"
  23567. "uxth %[d1], r3\n\t"
  23568. "uxth r4, %[div]\n\t"
  23569. #ifdef WOLFSSL_KEIL
  23570. "muls r4, %[d1], r4\n\t"
  23571. #elif defined(__clang__)
  23572. "muls r4, %[d1]\n\t"
  23573. #else
  23574. "mul r4, %[d1]\n\t"
  23575. #endif
  23576. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23577. "lsrs r6, %[div], #16\n\t"
  23578. #else
  23579. "lsr r6, %[div], #16\n\t"
  23580. #endif
  23581. #ifdef WOLFSSL_KEIL
  23582. "muls %[d1], r6, %[d1]\n\t"
  23583. #elif defined(__clang__)
  23584. "muls %[d1], r6\n\t"
  23585. #else
  23586. "mul %[d1], r6\n\t"
  23587. #endif
  23588. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23589. "lsrs r5, %[d1], #16\n\t"
  23590. #else
  23591. "lsr r5, %[d1], #16\n\t"
  23592. #endif
  23593. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23594. "lsls %[d1], %[d1], #16\n\t"
  23595. #else
  23596. "lsl %[d1], %[d1], #16\n\t"
  23597. #endif
  23598. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23599. "adds r4, r4, %[d1]\n\t"
  23600. #else
  23601. "add r4, r4, %[d1]\n\t"
  23602. #endif
  23603. #ifdef WOLFSSL_KEIL
  23604. "adcs r5, r5, r7\n\t"
  23605. #elif defined(__clang__)
  23606. "adcs r5, r7\n\t"
  23607. #else
  23608. "adc r5, r7\n\t"
  23609. #endif
  23610. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23611. "lsrs %[d1], r3, #16\n\t"
  23612. #else
  23613. "lsr %[d1], r3, #16\n\t"
  23614. #endif
  23615. #ifdef WOLFSSL_KEIL
  23616. "muls r6, %[d1], r6\n\t"
  23617. #elif defined(__clang__)
  23618. "muls r6, %[d1]\n\t"
  23619. #else
  23620. "mul r6, %[d1]\n\t"
  23621. #endif
  23622. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23623. "adds r5, r5, r6\n\t"
  23624. #else
  23625. "add r5, r5, r6\n\t"
  23626. #endif
  23627. "uxth r6, %[div]\n\t"
  23628. #ifdef WOLFSSL_KEIL
  23629. "muls %[d1], r6, %[d1]\n\t"
  23630. #elif defined(__clang__)
  23631. "muls %[d1], r6\n\t"
  23632. #else
  23633. "mul %[d1], r6\n\t"
  23634. #endif
  23635. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23636. "lsrs r6, %[d1], #16\n\t"
  23637. #else
  23638. "lsr r6, %[d1], #16\n\t"
  23639. #endif
  23640. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23641. "lsls %[d1], %[d1], #16\n\t"
  23642. #else
  23643. "lsl %[d1], %[d1], #16\n\t"
  23644. #endif
  23645. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23646. "adds r4, r4, %[d1]\n\t"
  23647. #else
  23648. "add r4, r4, %[d1]\n\t"
  23649. #endif
  23650. #ifdef WOLFSSL_KEIL
  23651. "adcs r5, r5, r6\n\t"
  23652. #elif defined(__clang__)
  23653. "adcs r5, r6\n\t"
  23654. #else
  23655. "adc r5, r6\n\t"
  23656. #endif
  23657. "# r * div - Done\n\t"
  23658. "mov %[d1], r8\n\t"
  23659. "mov r6, r9\n\t"
  23660. #ifdef WOLFSSL_KEIL
  23661. "subs r4, %[d1], r4\n\t"
  23662. #else
  23663. #ifdef __clang__
  23664. "subs r4, %[d1], r4\n\t"
  23665. #else
  23666. "sub r4, %[d1], r4\n\t"
  23667. #endif
  23668. #endif
  23669. #ifdef WOLFSSL_KEIL
  23670. "sbcs r6, r6, r5\n\t"
  23671. #elif defined(__clang__)
  23672. "sbcs r6, r5\n\t"
  23673. #else
  23674. "sbc r6, r5\n\t"
  23675. #endif
  23676. "movs r5, r6\n\t"
  23677. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23678. "adds r3, r3, r5\n\t"
  23679. #else
  23680. "add r3, r3, r5\n\t"
  23681. #endif
  23682. "movs r6, %[div]\n\t"
  23683. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23684. "subs r6, r6, r4\n\t"
  23685. #else
  23686. "sub r6, r6, r4\n\t"
  23687. #endif
  23688. #ifdef WOLFSSL_KEIL
  23689. "sbcs r6, r6, r6\n\t"
  23690. #elif defined(__clang__)
  23691. "sbcs r6, r6\n\t"
  23692. #else
  23693. "sbc r6, r6\n\t"
  23694. #endif
  23695. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23696. "subs r3, r3, r6\n\t"
  23697. #else
  23698. "sub r3, r3, r6\n\t"
  23699. #endif
  23700. "movs %[d1], r3\n\t"
  23701. : [d1] "+l" (d1), [d0] "+l" (d0), [div] "+l" (div)
  23702. :
  23703. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  23704. );
  23705. return (uint32_t)(size_t)d1;
  23706. }
  23707. /* Compare a with b in constant time.
  23708. *
  23709. * a A single precision integer.
  23710. * b A single precision integer.
  23711. * return -ve, 0 or +ve if a is less than, equal to or greater than b
  23712. * respectively.
  23713. */
  23714. SP_NOINLINE static sp_int32 sp_2048_cmp_32(const sp_digit* a, const sp_digit* b)
  23715. {
  23716. __asm__ __volatile__ (
  23717. "movs r2, #0\n\t"
  23718. "movs r3, #0\n\t"
  23719. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23720. "mvns r3, r3\n\t"
  23721. #else
  23722. "mvn r3, r3\n\t"
  23723. #endif
  23724. "movs r6, #0x7c\n\t"
  23725. "\n"
  23726. "L_sp_2048_cmp_32_words_%=:\n\t"
  23727. "ldr r7, [%[a], r6]\n\t"
  23728. "ldr r5, [%[b], r6]\n\t"
  23729. #ifdef WOLFSSL_KEIL
  23730. "ands r7, r7, r3\n\t"
  23731. #elif defined(__clang__)
  23732. "ands r7, r3\n\t"
  23733. #else
  23734. "and r7, r3\n\t"
  23735. #endif
  23736. #ifdef WOLFSSL_KEIL
  23737. "ands r5, r5, r3\n\t"
  23738. #elif defined(__clang__)
  23739. "ands r5, r3\n\t"
  23740. #else
  23741. "and r5, r3\n\t"
  23742. #endif
  23743. "movs r4, r7\n\t"
  23744. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23745. "subs r7, r7, r5\n\t"
  23746. #else
  23747. "sub r7, r7, r5\n\t"
  23748. #endif
  23749. #ifdef WOLFSSL_KEIL
  23750. "sbcs r7, r7, r7\n\t"
  23751. #elif defined(__clang__)
  23752. "sbcs r7, r7\n\t"
  23753. #else
  23754. "sbc r7, r7\n\t"
  23755. #endif
  23756. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23757. "adds r2, r2, r7\n\t"
  23758. #else
  23759. "add r2, r2, r7\n\t"
  23760. #endif
  23761. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23762. "mvns r7, r7\n\t"
  23763. #else
  23764. "mvn r7, r7\n\t"
  23765. #endif
  23766. #ifdef WOLFSSL_KEIL
  23767. "ands r3, r3, r7\n\t"
  23768. #elif defined(__clang__)
  23769. "ands r3, r7\n\t"
  23770. #else
  23771. "and r3, r7\n\t"
  23772. #endif
  23773. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23774. "subs r5, r5, r4\n\t"
  23775. #else
  23776. "sub r5, r5, r4\n\t"
  23777. #endif
  23778. #ifdef WOLFSSL_KEIL
  23779. "sbcs r7, r7, r7\n\t"
  23780. #elif defined(__clang__)
  23781. "sbcs r7, r7\n\t"
  23782. #else
  23783. "sbc r7, r7\n\t"
  23784. #endif
  23785. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23786. "subs r2, r2, r7\n\t"
  23787. #else
  23788. "sub r2, r2, r7\n\t"
  23789. #endif
  23790. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23791. "mvns r7, r7\n\t"
  23792. #else
  23793. "mvn r7, r7\n\t"
  23794. #endif
  23795. #ifdef WOLFSSL_KEIL
  23796. "ands r3, r3, r7\n\t"
  23797. #elif defined(__clang__)
  23798. "ands r3, r7\n\t"
  23799. #else
  23800. "and r3, r7\n\t"
  23801. #endif
  23802. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23803. "subs r6, r6, #4\n\t"
  23804. #else
  23805. "sub r6, r6, #4\n\t"
  23806. #endif
  23807. "bge L_sp_2048_cmp_32_words_%=\n\t"
  23808. "movs %[a], r2\n\t"
  23809. : [a] "+l" (a), [b] "+l" (b)
  23810. :
  23811. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  23812. );
  23813. return (uint32_t)(size_t)a;
  23814. }
  23815. /* Divide d in a and put remainder into r (m*d + r = a)
  23816. * m is not calculated as it is not needed at this time.
  23817. *
  23818. * a Number to be divided.
  23819. * d Number to divide with.
  23820. * m Multiplier result.
  23821. * r Remainder from the division.
  23822. * returns MP_OKAY indicating success.
  23823. */
  23824. static WC_INLINE int sp_2048_div_32(const sp_digit* a, const sp_digit* d, sp_digit* m,
  23825. sp_digit* r)
  23826. {
  23827. sp_digit t1[64], t2[33];
  23828. sp_digit div, r1;
  23829. int i;
  23830. (void)m;
  23831. div = d[31];
  23832. XMEMCPY(t1, a, sizeof(*t1) * 2 * 32);
  23833. r1 = sp_2048_cmp_32(&t1[32], d) >= 0;
  23834. sp_2048_cond_sub_32(&t1[32], &t1[32], d, (sp_digit)0 - r1);
  23835. for (i = 31; i >= 0; i--) {
  23836. volatile sp_digit mask = (sp_digit)0 - (t1[32 + i] == div);
  23837. sp_digit hi = t1[32 + i] + mask;
  23838. r1 = div_2048_word_32(hi, t1[32 + i - 1], div);
  23839. r1 |= mask;
  23840. sp_2048_mul_d_32(t2, d, r1);
  23841. t1[32 + i] += sp_2048_sub_in_place_32(&t1[i], t2);
  23842. t1[32 + i] -= t2[32];
  23843. sp_2048_mask_32(t2, d, t1[32 + i]);
  23844. t1[32 + i] += sp_2048_add_32(&t1[i], &t1[i], t2);
  23845. sp_2048_mask_32(t2, d, t1[32 + i]);
  23846. t1[32 + i] += sp_2048_add_32(&t1[i], &t1[i], t2);
  23847. }
  23848. r1 = sp_2048_cmp_32(t1, d) >= 0;
  23849. sp_2048_cond_sub_32(r, t1, d, (sp_digit)0 - r1);
  23850. return MP_OKAY;
  23851. }
  23852. /* Reduce a modulo m into r. (r = a mod m)
  23853. *
  23854. * r A single precision number that is the reduced result.
  23855. * a A single precision number that is to be reduced.
  23856. * m A single precision number that is the modulus to reduce with.
  23857. * returns MP_OKAY indicating success.
  23858. */
  23859. static WC_INLINE int sp_2048_mod_32(sp_digit* r, const sp_digit* a, const sp_digit* m)
  23860. {
  23861. int ret;
  23862. ret = sp_2048_div_32(a, m, NULL, r);
  23863. return ret;
  23864. }
  23865. #ifdef WOLFSSL_SP_SMALL
  23866. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  23867. *
  23868. * r A single precision number that is the result of the operation.
  23869. * a A single precision number being exponentiated.
  23870. * e A single precision number that is the exponent.
  23871. * bits The number of bits in the exponent.
  23872. * m A single precision number that is the modulus.
  23873. * returns 0 on success.
  23874. * returns MEMORY_E on dynamic memory allocation failure.
  23875. * returns MP_VAL when base is even or exponent is 0.
  23876. */
  23877. static int sp_2048_mod_exp_32(sp_digit* r, const sp_digit* a, const sp_digit* e,
  23878. int bits, const sp_digit* m, int reduceA)
  23879. {
  23880. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  23881. sp_digit* td = NULL;
  23882. #else
  23883. sp_digit td[16 * 64];
  23884. #endif
  23885. sp_digit* t[16];
  23886. sp_digit* norm = NULL;
  23887. sp_digit mp = 1;
  23888. sp_digit n;
  23889. sp_digit mask;
  23890. int i;
  23891. int c;
  23892. byte y;
  23893. int err = MP_OKAY;
  23894. if (bits == 0) {
  23895. err = MP_VAL;
  23896. }
  23897. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  23898. if (err == MP_OKAY) {
  23899. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (16 * 64), NULL,
  23900. DYNAMIC_TYPE_TMP_BUFFER);
  23901. if (td == NULL)
  23902. err = MEMORY_E;
  23903. }
  23904. #endif
  23905. if (err == MP_OKAY) {
  23906. norm = td;
  23907. for (i=0; i<16; i++) {
  23908. t[i] = td + i * 64;
  23909. }
  23910. sp_2048_mont_setup(m, &mp);
  23911. sp_2048_mont_norm_32(norm, m);
  23912. XMEMSET(t[1], 0, sizeof(sp_digit) * 32U);
  23913. if (reduceA != 0) {
  23914. err = sp_2048_mod_32(t[1] + 32, a, m);
  23915. if (err == MP_OKAY) {
  23916. err = sp_2048_mod_32(t[1], t[1], m);
  23917. }
  23918. }
  23919. else {
  23920. XMEMCPY(t[1] + 32, a, sizeof(sp_digit) * 32);
  23921. err = sp_2048_mod_32(t[1], t[1], m);
  23922. }
  23923. }
  23924. if (err == MP_OKAY) {
  23925. sp_2048_mont_sqr_32(t[ 2], t[ 1], m, mp);
  23926. sp_2048_mont_mul_32(t[ 3], t[ 2], t[ 1], m, mp);
  23927. sp_2048_mont_sqr_32(t[ 4], t[ 2], m, mp);
  23928. sp_2048_mont_mul_32(t[ 5], t[ 3], t[ 2], m, mp);
  23929. sp_2048_mont_sqr_32(t[ 6], t[ 3], m, mp);
  23930. sp_2048_mont_mul_32(t[ 7], t[ 4], t[ 3], m, mp);
  23931. sp_2048_mont_sqr_32(t[ 8], t[ 4], m, mp);
  23932. sp_2048_mont_mul_32(t[ 9], t[ 5], t[ 4], m, mp);
  23933. sp_2048_mont_sqr_32(t[10], t[ 5], m, mp);
  23934. sp_2048_mont_mul_32(t[11], t[ 6], t[ 5], m, mp);
  23935. sp_2048_mont_sqr_32(t[12], t[ 6], m, mp);
  23936. sp_2048_mont_mul_32(t[13], t[ 7], t[ 6], m, mp);
  23937. sp_2048_mont_sqr_32(t[14], t[ 7], m, mp);
  23938. sp_2048_mont_mul_32(t[15], t[ 8], t[ 7], m, mp);
  23939. i = (bits - 1) / 32;
  23940. n = e[i--];
  23941. c = bits & 31;
  23942. if (c == 0) {
  23943. c = 32;
  23944. }
  23945. c -= bits % 4;
  23946. if (c == 32) {
  23947. c = 28;
  23948. }
  23949. if (c < 0) {
  23950. /* Number of bits in top word is less than number needed. */
  23951. c = -c;
  23952. y = (byte)(n << c);
  23953. n = e[i--];
  23954. y |= (byte)(n >> (64 - c));
  23955. n <<= c;
  23956. c = 64 - c;
  23957. }
  23958. else if (c == 0) {
  23959. /* All bits in top word used. */
  23960. y = (byte)n;
  23961. }
  23962. else {
  23963. y = (byte)(n >> c);
  23964. n <<= 32 - c;
  23965. }
  23966. XMEMCPY(r, t[y], sizeof(sp_digit) * 32);
  23967. for (; i>=0 || c>=4; ) {
  23968. if (c == 0) {
  23969. n = e[i--];
  23970. y = (byte)(n >> 28);
  23971. n <<= 4;
  23972. c = 28;
  23973. }
  23974. else if (c < 4) {
  23975. y = (byte)(n >> 28);
  23976. n = e[i--];
  23977. c = 4 - c;
  23978. y |= (byte)(n >> (32 - c));
  23979. n <<= c;
  23980. c = 32 - c;
  23981. }
  23982. else {
  23983. y = (byte)((n >> 28) & 0xf);
  23984. n <<= 4;
  23985. c -= 4;
  23986. }
  23987. sp_2048_mont_sqr_32(r, r, m, mp);
  23988. sp_2048_mont_sqr_32(r, r, m, mp);
  23989. sp_2048_mont_sqr_32(r, r, m, mp);
  23990. sp_2048_mont_sqr_32(r, r, m, mp);
  23991. sp_2048_mont_mul_32(r, r, t[y], m, mp);
  23992. }
  23993. XMEMSET(&r[32], 0, sizeof(sp_digit) * 32U);
  23994. sp_2048_mont_reduce_32(r, m, mp);
  23995. mask = 0 - (sp_2048_cmp_32(r, m) >= 0);
  23996. sp_2048_cond_sub_32(r, r, m, mask);
  23997. }
  23998. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  23999. if (td != NULL)
  24000. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  24001. #endif
  24002. return err;
  24003. }
  24004. #else
  24005. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  24006. *
  24007. * r A single precision number that is the result of the operation.
  24008. * a A single precision number being exponentiated.
  24009. * e A single precision number that is the exponent.
  24010. * bits The number of bits in the exponent.
  24011. * m A single precision number that is the modulus.
  24012. * returns 0 on success.
  24013. * returns MEMORY_E on dynamic memory allocation failure.
  24014. * returns MP_VAL when base is even or exponent is 0.
  24015. */
  24016. static int sp_2048_mod_exp_32(sp_digit* r, const sp_digit* a, const sp_digit* e,
  24017. int bits, const sp_digit* m, int reduceA)
  24018. {
  24019. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  24020. sp_digit* td = NULL;
  24021. #else
  24022. sp_digit td[32 * 64];
  24023. #endif
  24024. sp_digit* t[32];
  24025. sp_digit* norm = NULL;
  24026. sp_digit mp = 1;
  24027. sp_digit n;
  24028. sp_digit mask;
  24029. int i;
  24030. int c;
  24031. byte y;
  24032. int err = MP_OKAY;
  24033. if (bits == 0) {
  24034. err = MP_VAL;
  24035. }
  24036. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  24037. if (err == MP_OKAY) {
  24038. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (32 * 64), NULL,
  24039. DYNAMIC_TYPE_TMP_BUFFER);
  24040. if (td == NULL)
  24041. err = MEMORY_E;
  24042. }
  24043. #endif
  24044. if (err == MP_OKAY) {
  24045. norm = td;
  24046. for (i=0; i<32; i++) {
  24047. t[i] = td + i * 64;
  24048. }
  24049. sp_2048_mont_setup(m, &mp);
  24050. sp_2048_mont_norm_32(norm, m);
  24051. XMEMSET(t[1], 0, sizeof(sp_digit) * 32U);
  24052. if (reduceA != 0) {
  24053. err = sp_2048_mod_32(t[1] + 32, a, m);
  24054. if (err == MP_OKAY) {
  24055. err = sp_2048_mod_32(t[1], t[1], m);
  24056. }
  24057. }
  24058. else {
  24059. XMEMCPY(t[1] + 32, a, sizeof(sp_digit) * 32);
  24060. err = sp_2048_mod_32(t[1], t[1], m);
  24061. }
  24062. }
  24063. if (err == MP_OKAY) {
  24064. sp_2048_mont_sqr_32(t[ 2], t[ 1], m, mp);
  24065. sp_2048_mont_mul_32(t[ 3], t[ 2], t[ 1], m, mp);
  24066. sp_2048_mont_sqr_32(t[ 4], t[ 2], m, mp);
  24067. sp_2048_mont_mul_32(t[ 5], t[ 3], t[ 2], m, mp);
  24068. sp_2048_mont_sqr_32(t[ 6], t[ 3], m, mp);
  24069. sp_2048_mont_mul_32(t[ 7], t[ 4], t[ 3], m, mp);
  24070. sp_2048_mont_sqr_32(t[ 8], t[ 4], m, mp);
  24071. sp_2048_mont_mul_32(t[ 9], t[ 5], t[ 4], m, mp);
  24072. sp_2048_mont_sqr_32(t[10], t[ 5], m, mp);
  24073. sp_2048_mont_mul_32(t[11], t[ 6], t[ 5], m, mp);
  24074. sp_2048_mont_sqr_32(t[12], t[ 6], m, mp);
  24075. sp_2048_mont_mul_32(t[13], t[ 7], t[ 6], m, mp);
  24076. sp_2048_mont_sqr_32(t[14], t[ 7], m, mp);
  24077. sp_2048_mont_mul_32(t[15], t[ 8], t[ 7], m, mp);
  24078. sp_2048_mont_sqr_32(t[16], t[ 8], m, mp);
  24079. sp_2048_mont_mul_32(t[17], t[ 9], t[ 8], m, mp);
  24080. sp_2048_mont_sqr_32(t[18], t[ 9], m, mp);
  24081. sp_2048_mont_mul_32(t[19], t[10], t[ 9], m, mp);
  24082. sp_2048_mont_sqr_32(t[20], t[10], m, mp);
  24083. sp_2048_mont_mul_32(t[21], t[11], t[10], m, mp);
  24084. sp_2048_mont_sqr_32(t[22], t[11], m, mp);
  24085. sp_2048_mont_mul_32(t[23], t[12], t[11], m, mp);
  24086. sp_2048_mont_sqr_32(t[24], t[12], m, mp);
  24087. sp_2048_mont_mul_32(t[25], t[13], t[12], m, mp);
  24088. sp_2048_mont_sqr_32(t[26], t[13], m, mp);
  24089. sp_2048_mont_mul_32(t[27], t[14], t[13], m, mp);
  24090. sp_2048_mont_sqr_32(t[28], t[14], m, mp);
  24091. sp_2048_mont_mul_32(t[29], t[15], t[14], m, mp);
  24092. sp_2048_mont_sqr_32(t[30], t[15], m, mp);
  24093. sp_2048_mont_mul_32(t[31], t[16], t[15], m, mp);
  24094. i = (bits - 1) / 32;
  24095. n = e[i--];
  24096. c = bits & 31;
  24097. if (c == 0) {
  24098. c = 32;
  24099. }
  24100. c -= bits % 5;
  24101. if (c == 32) {
  24102. c = 27;
  24103. }
  24104. if (c < 0) {
  24105. /* Number of bits in top word is less than number needed. */
  24106. c = -c;
  24107. y = (byte)(n << c);
  24108. n = e[i--];
  24109. y |= (byte)(n >> (64 - c));
  24110. n <<= c;
  24111. c = 64 - c;
  24112. }
  24113. else if (c == 0) {
  24114. /* All bits in top word used. */
  24115. y = (byte)n;
  24116. }
  24117. else {
  24118. y = (byte)(n >> c);
  24119. n <<= 32 - c;
  24120. }
  24121. XMEMCPY(r, t[y], sizeof(sp_digit) * 32);
  24122. for (; i>=0 || c>=5; ) {
  24123. if (c == 0) {
  24124. n = e[i--];
  24125. y = (byte)(n >> 27);
  24126. n <<= 5;
  24127. c = 27;
  24128. }
  24129. else if (c < 5) {
  24130. y = (byte)(n >> 27);
  24131. n = e[i--];
  24132. c = 5 - c;
  24133. y |= (byte)(n >> (32 - c));
  24134. n <<= c;
  24135. c = 32 - c;
  24136. }
  24137. else {
  24138. y = (byte)((n >> 27) & 0x1f);
  24139. n <<= 5;
  24140. c -= 5;
  24141. }
  24142. sp_2048_mont_sqr_32(r, r, m, mp);
  24143. sp_2048_mont_sqr_32(r, r, m, mp);
  24144. sp_2048_mont_sqr_32(r, r, m, mp);
  24145. sp_2048_mont_sqr_32(r, r, m, mp);
  24146. sp_2048_mont_sqr_32(r, r, m, mp);
  24147. sp_2048_mont_mul_32(r, r, t[y], m, mp);
  24148. }
  24149. XMEMSET(&r[32], 0, sizeof(sp_digit) * 32U);
  24150. sp_2048_mont_reduce_32(r, m, mp);
  24151. mask = 0 - (sp_2048_cmp_32(r, m) >= 0);
  24152. sp_2048_cond_sub_32(r, r, m, mask);
  24153. }
  24154. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  24155. if (td != NULL)
  24156. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  24157. #endif
  24158. return err;
  24159. }
  24160. #endif /* WOLFSSL_SP_SMALL */
  24161. #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */
  24162. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  24163. /* r = 2^n mod m where n is the number of bits to reduce by.
  24164. * Given m must be 2048 bits, just need to subtract.
  24165. *
  24166. * r A single precision number.
  24167. * m A single precision number.
  24168. */
  24169. static void sp_2048_mont_norm_64(sp_digit* r, const sp_digit* m)
  24170. {
  24171. XMEMSET(r, 0, sizeof(sp_digit) * 64);
  24172. /* r = 2^n mod m */
  24173. sp_2048_sub_in_place_64(r, m);
  24174. }
  24175. #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */
  24176. /* Conditionally subtract b from a using the mask m.
  24177. * m is -1 to subtract and 0 when not copying.
  24178. *
  24179. * r A single precision number representing condition subtract result.
  24180. * a A single precision number to subtract from.
  24181. * b A single precision number to subtract.
  24182. * m Mask value to apply.
  24183. */
  24184. SP_NOINLINE static sp_digit sp_2048_cond_sub_64(sp_digit* r, const sp_digit* a,
  24185. const sp_digit* b, sp_digit m)
  24186. {
  24187. __asm__ __volatile__ (
  24188. "movs r4, #0\n\t"
  24189. "movs r5, #0xff\n\t"
  24190. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24191. "adds r5, r5, #1\n\t"
  24192. #else
  24193. "add r5, r5, #1\n\t"
  24194. #endif
  24195. "mov r8, r5\n\t"
  24196. "movs r7, #0\n\t"
  24197. "\n"
  24198. "L_sp_2048_cond_sub_64_words_%=:\n\t"
  24199. "ldr r6, [%[b], r7]\n\t"
  24200. #ifdef WOLFSSL_KEIL
  24201. "ands r6, r6, %[m]\n\t"
  24202. #elif defined(__clang__)
  24203. "ands r6, %[m]\n\t"
  24204. #else
  24205. "and r6, %[m]\n\t"
  24206. #endif
  24207. "movs r5, #0\n\t"
  24208. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24209. "subs r5, r5, r4\n\t"
  24210. #else
  24211. "sub r5, r5, r4\n\t"
  24212. #endif
  24213. "ldr r5, [%[a], r7]\n\t"
  24214. #ifdef WOLFSSL_KEIL
  24215. "sbcs r5, r5, r6\n\t"
  24216. #elif defined(__clang__)
  24217. "sbcs r5, r6\n\t"
  24218. #else
  24219. "sbc r5, r6\n\t"
  24220. #endif
  24221. #ifdef WOLFSSL_KEIL
  24222. "sbcs r4, r4, r4\n\t"
  24223. #elif defined(__clang__)
  24224. "sbcs r4, r4\n\t"
  24225. #else
  24226. "sbc r4, r4\n\t"
  24227. #endif
  24228. "str r5, [%[r], r7]\n\t"
  24229. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24230. "adds r7, r7, #4\n\t"
  24231. #else
  24232. "add r7, r7, #4\n\t"
  24233. #endif
  24234. "cmp r7, r8\n\t"
  24235. "blt L_sp_2048_cond_sub_64_words_%=\n\t"
  24236. "movs %[r], r4\n\t"
  24237. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m)
  24238. :
  24239. : "memory", "r4", "r5", "r6", "r7", "r8"
  24240. );
  24241. return (uint32_t)(size_t)r;
  24242. }
  24243. /* Reduce the number back to 2048 bits using Montgomery reduction.
  24244. *
  24245. * a A single precision number to reduce in place.
  24246. * m The single precision number representing the modulus.
  24247. * mp The digit representing the negative inverse of m mod 2^n.
  24248. */
  24249. SP_NOINLINE static void sp_2048_mont_reduce_64(sp_digit* a, const sp_digit* m,
  24250. sp_digit mp)
  24251. {
  24252. __asm__ __volatile__ (
  24253. "movs r7, #0\n\t"
  24254. "mov r8, %[mp]\n\t"
  24255. "mov r12, r7\n\t"
  24256. "mov lr, %[m]\n\t"
  24257. "mov r9, %[a]\n\t"
  24258. "mov r11, %[a]\n\t"
  24259. "movs r5, #0xfc\n\t"
  24260. "movs r6, #0xff\n\t"
  24261. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24262. "adds r6, r6, #1\n\t"
  24263. #else
  24264. "add r6, r6, #1\n\t"
  24265. #endif
  24266. "add r9, r9, r5\n\t"
  24267. "add r11, r11, r6\n\t"
  24268. "\n"
  24269. "L_sp_2048_mont_reduce_64_mod_%=:\n\t"
  24270. "movs r7, #0\n\t"
  24271. "movs r4, #0\n\t"
  24272. "# a[i] += m[0] * mu\n\t"
  24273. "ldm %[m]!, {%[mp]}\n\t"
  24274. "ldm %[a]!, {r3}\n\t"
  24275. "# mu = a[i] * mp\n\t"
  24276. "mov r5, r8\n\t"
  24277. #ifdef WOLFSSL_KEIL
  24278. "muls r5, r3, r5\n\t"
  24279. #elif defined(__clang__)
  24280. "muls r5, r3\n\t"
  24281. #else
  24282. "mul r5, r3\n\t"
  24283. #endif
  24284. "mov r10, r5\n\t"
  24285. "# Multiply m[0] and mu - Start\n\t"
  24286. "mov r5, r10\n\t"
  24287. "uxth r6, %[mp]\n\t"
  24288. "uxth r5, r5\n\t"
  24289. #ifdef WOLFSSL_KEIL
  24290. "muls r6, r5, r6\n\t"
  24291. #elif defined(__clang__)
  24292. "muls r6, r5\n\t"
  24293. #else
  24294. "mul r6, r5\n\t"
  24295. #endif
  24296. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24297. "adds r3, r3, r6\n\t"
  24298. #else
  24299. "add r3, r3, r6\n\t"
  24300. #endif
  24301. #ifdef WOLFSSL_KEIL
  24302. "adcs r4, r4, r7\n\t"
  24303. #elif defined(__clang__)
  24304. "adcs r4, r7\n\t"
  24305. #else
  24306. "adc r4, r7\n\t"
  24307. #endif
  24308. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24309. "lsrs r6, %[mp], #16\n\t"
  24310. #else
  24311. "lsr r6, %[mp], #16\n\t"
  24312. #endif
  24313. #ifdef WOLFSSL_KEIL
  24314. "muls r5, r6, r5\n\t"
  24315. #elif defined(__clang__)
  24316. "muls r5, r6\n\t"
  24317. #else
  24318. "mul r5, r6\n\t"
  24319. #endif
  24320. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24321. "lsrs r6, r5, #16\n\t"
  24322. #else
  24323. "lsr r6, r5, #16\n\t"
  24324. #endif
  24325. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24326. "lsls r5, r5, #16\n\t"
  24327. #else
  24328. "lsl r5, r5, #16\n\t"
  24329. #endif
  24330. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24331. "adds r3, r3, r5\n\t"
  24332. #else
  24333. "add r3, r3, r5\n\t"
  24334. #endif
  24335. #ifdef WOLFSSL_KEIL
  24336. "adcs r4, r4, r6\n\t"
  24337. #elif defined(__clang__)
  24338. "adcs r4, r6\n\t"
  24339. #else
  24340. "adc r4, r6\n\t"
  24341. #endif
  24342. "mov r5, r10\n\t"
  24343. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24344. "lsrs r6, %[mp], #16\n\t"
  24345. #else
  24346. "lsr r6, %[mp], #16\n\t"
  24347. #endif
  24348. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24349. "lsrs r5, r5, #16\n\t"
  24350. #else
  24351. "lsr r5, r5, #16\n\t"
  24352. #endif
  24353. #ifdef WOLFSSL_KEIL
  24354. "muls r6, r5, r6\n\t"
  24355. #elif defined(__clang__)
  24356. "muls r6, r5\n\t"
  24357. #else
  24358. "mul r6, r5\n\t"
  24359. #endif
  24360. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24361. "adds r4, r4, r6\n\t"
  24362. #else
  24363. "add r4, r4, r6\n\t"
  24364. #endif
  24365. "uxth r6, %[mp]\n\t"
  24366. #ifdef WOLFSSL_KEIL
  24367. "muls r5, r6, r5\n\t"
  24368. #elif defined(__clang__)
  24369. "muls r5, r6\n\t"
  24370. #else
  24371. "mul r5, r6\n\t"
  24372. #endif
  24373. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24374. "lsrs r6, r5, #16\n\t"
  24375. #else
  24376. "lsr r6, r5, #16\n\t"
  24377. #endif
  24378. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24379. "lsls r5, r5, #16\n\t"
  24380. #else
  24381. "lsl r5, r5, #16\n\t"
  24382. #endif
  24383. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24384. "adds r3, r3, r5\n\t"
  24385. #else
  24386. "add r3, r3, r5\n\t"
  24387. #endif
  24388. #ifdef WOLFSSL_KEIL
  24389. "adcs r4, r4, r6\n\t"
  24390. #elif defined(__clang__)
  24391. "adcs r4, r6\n\t"
  24392. #else
  24393. "adc r4, r6\n\t"
  24394. #endif
  24395. "# Multiply m[0] and mu - Done\n\t"
  24396. "\n"
  24397. "L_sp_2048_mont_reduce_64_word_%=:\n\t"
  24398. "# a[i+j] += m[j] * mu\n\t"
  24399. "ldr r3, [%[a]]\n\t"
  24400. "ldm %[m]!, {%[mp]}\n\t"
  24401. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24402. "adds r3, r3, r4\n\t"
  24403. #else
  24404. "add r3, r3, r4\n\t"
  24405. #endif
  24406. "movs r4, #0\n\t"
  24407. #ifdef WOLFSSL_KEIL
  24408. "adcs r4, r4, r7\n\t"
  24409. #elif defined(__clang__)
  24410. "adcs r4, r7\n\t"
  24411. #else
  24412. "adc r4, r7\n\t"
  24413. #endif
  24414. "# Multiply m[j] and mu - Start\n\t"
  24415. "mov r5, r10\n\t"
  24416. "uxth r6, %[mp]\n\t"
  24417. "uxth r5, r5\n\t"
  24418. #ifdef WOLFSSL_KEIL
  24419. "muls r6, r5, r6\n\t"
  24420. #elif defined(__clang__)
  24421. "muls r6, r5\n\t"
  24422. #else
  24423. "mul r6, r5\n\t"
  24424. #endif
  24425. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24426. "adds r3, r3, r6\n\t"
  24427. #else
  24428. "add r3, r3, r6\n\t"
  24429. #endif
  24430. #ifdef WOLFSSL_KEIL
  24431. "adcs r4, r4, r7\n\t"
  24432. #elif defined(__clang__)
  24433. "adcs r4, r7\n\t"
  24434. #else
  24435. "adc r4, r7\n\t"
  24436. #endif
  24437. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24438. "lsrs r6, %[mp], #16\n\t"
  24439. #else
  24440. "lsr r6, %[mp], #16\n\t"
  24441. #endif
  24442. #ifdef WOLFSSL_KEIL
  24443. "muls r5, r6, r5\n\t"
  24444. #elif defined(__clang__)
  24445. "muls r5, r6\n\t"
  24446. #else
  24447. "mul r5, r6\n\t"
  24448. #endif
  24449. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24450. "lsrs r6, r5, #16\n\t"
  24451. #else
  24452. "lsr r6, r5, #16\n\t"
  24453. #endif
  24454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24455. "lsls r5, r5, #16\n\t"
  24456. #else
  24457. "lsl r5, r5, #16\n\t"
  24458. #endif
  24459. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24460. "adds r3, r3, r5\n\t"
  24461. #else
  24462. "add r3, r3, r5\n\t"
  24463. #endif
  24464. #ifdef WOLFSSL_KEIL
  24465. "adcs r4, r4, r6\n\t"
  24466. #elif defined(__clang__)
  24467. "adcs r4, r6\n\t"
  24468. #else
  24469. "adc r4, r6\n\t"
  24470. #endif
  24471. "mov r5, r10\n\t"
  24472. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24473. "lsrs r6, %[mp], #16\n\t"
  24474. #else
  24475. "lsr r6, %[mp], #16\n\t"
  24476. #endif
  24477. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24478. "lsrs r5, r5, #16\n\t"
  24479. #else
  24480. "lsr r5, r5, #16\n\t"
  24481. #endif
  24482. #ifdef WOLFSSL_KEIL
  24483. "muls r6, r5, r6\n\t"
  24484. #elif defined(__clang__)
  24485. "muls r6, r5\n\t"
  24486. #else
  24487. "mul r6, r5\n\t"
  24488. #endif
  24489. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24490. "adds r4, r4, r6\n\t"
  24491. #else
  24492. "add r4, r4, r6\n\t"
  24493. #endif
  24494. "uxth r6, %[mp]\n\t"
  24495. #ifdef WOLFSSL_KEIL
  24496. "muls r5, r6, r5\n\t"
  24497. #elif defined(__clang__)
  24498. "muls r5, r6\n\t"
  24499. #else
  24500. "mul r5, r6\n\t"
  24501. #endif
  24502. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24503. "lsrs r6, r5, #16\n\t"
  24504. #else
  24505. "lsr r6, r5, #16\n\t"
  24506. #endif
  24507. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24508. "lsls r5, r5, #16\n\t"
  24509. #else
  24510. "lsl r5, r5, #16\n\t"
  24511. #endif
  24512. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24513. "adds r3, r3, r5\n\t"
  24514. #else
  24515. "add r3, r3, r5\n\t"
  24516. #endif
  24517. #ifdef WOLFSSL_KEIL
  24518. "adcs r4, r4, r6\n\t"
  24519. #elif defined(__clang__)
  24520. "adcs r4, r6\n\t"
  24521. #else
  24522. "adc r4, r6\n\t"
  24523. #endif
  24524. "# Multiply m[j] and mu - Done\n\t"
  24525. "stm %[a]!, {r3}\n\t"
  24526. "cmp %[a], r9\n\t"
  24527. "blt L_sp_2048_mont_reduce_64_word_%=\n\t"
  24528. "# a[i+63] += m[63] * mu\n\t"
  24529. "ldr %[mp], [%[m]]\n\t"
  24530. "mov r3, r12\n\t"
  24531. "# Multiply m[63] and mu - Start\n\t"
  24532. "mov r5, r10\n\t"
  24533. "uxth r6, %[mp]\n\t"
  24534. "uxth r5, r5\n\t"
  24535. #ifdef WOLFSSL_KEIL
  24536. "muls r6, r5, r6\n\t"
  24537. #elif defined(__clang__)
  24538. "muls r6, r5\n\t"
  24539. #else
  24540. "mul r6, r5\n\t"
  24541. #endif
  24542. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24543. "adds r4, r4, r6\n\t"
  24544. #else
  24545. "add r4, r4, r6\n\t"
  24546. #endif
  24547. #ifdef WOLFSSL_KEIL
  24548. "adcs r3, r3, r7\n\t"
  24549. #elif defined(__clang__)
  24550. "adcs r3, r7\n\t"
  24551. #else
  24552. "adc r3, r7\n\t"
  24553. #endif
  24554. #ifdef WOLFSSL_KEIL
  24555. "adcs r7, r7, r7\n\t"
  24556. #elif defined(__clang__)
  24557. "adcs r7, r7\n\t"
  24558. #else
  24559. "adc r7, r7\n\t"
  24560. #endif
  24561. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24562. "lsrs r6, %[mp], #16\n\t"
  24563. #else
  24564. "lsr r6, %[mp], #16\n\t"
  24565. #endif
  24566. #ifdef WOLFSSL_KEIL
  24567. "muls r5, r6, r5\n\t"
  24568. #elif defined(__clang__)
  24569. "muls r5, r6\n\t"
  24570. #else
  24571. "mul r5, r6\n\t"
  24572. #endif
  24573. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24574. "lsrs r6, r5, #16\n\t"
  24575. #else
  24576. "lsr r6, r5, #16\n\t"
  24577. #endif
  24578. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24579. "lsls r5, r5, #16\n\t"
  24580. #else
  24581. "lsl r5, r5, #16\n\t"
  24582. #endif
  24583. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24584. "adds r4, r4, r5\n\t"
  24585. #else
  24586. "add r4, r4, r5\n\t"
  24587. #endif
  24588. #ifdef WOLFSSL_KEIL
  24589. "adcs r3, r3, r6\n\t"
  24590. #elif defined(__clang__)
  24591. "adcs r3, r6\n\t"
  24592. #else
  24593. "adc r3, r6\n\t"
  24594. #endif
  24595. #ifdef WOLFSSL_KEIL
  24596. "adcs r7, r7, r7\n\t"
  24597. #elif defined(__clang__)
  24598. "adcs r7, r7\n\t"
  24599. #else
  24600. "adc r7, r7\n\t"
  24601. #endif
  24602. "mov r5, r10\n\t"
  24603. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24604. "lsrs r6, %[mp], #16\n\t"
  24605. #else
  24606. "lsr r6, %[mp], #16\n\t"
  24607. #endif
  24608. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24609. "lsrs r5, r5, #16\n\t"
  24610. #else
  24611. "lsr r5, r5, #16\n\t"
  24612. #endif
  24613. #ifdef WOLFSSL_KEIL
  24614. "muls r6, r5, r6\n\t"
  24615. #elif defined(__clang__)
  24616. "muls r6, r5\n\t"
  24617. #else
  24618. "mul r6, r5\n\t"
  24619. #endif
  24620. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24621. "adds r3, r3, r6\n\t"
  24622. #else
  24623. "add r3, r3, r6\n\t"
  24624. #endif
  24625. #ifdef WOLFSSL_KEIL
  24626. "adcs r7, r7, r7\n\t"
  24627. #elif defined(__clang__)
  24628. "adcs r7, r7\n\t"
  24629. #else
  24630. "adc r7, r7\n\t"
  24631. #endif
  24632. "uxth r6, %[mp]\n\t"
  24633. #ifdef WOLFSSL_KEIL
  24634. "muls r5, r6, r5\n\t"
  24635. #elif defined(__clang__)
  24636. "muls r5, r6\n\t"
  24637. #else
  24638. "mul r5, r6\n\t"
  24639. #endif
  24640. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24641. "lsrs r6, r5, #16\n\t"
  24642. #else
  24643. "lsr r6, r5, #16\n\t"
  24644. #endif
  24645. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24646. "lsls r5, r5, #16\n\t"
  24647. #else
  24648. "lsl r5, r5, #16\n\t"
  24649. #endif
  24650. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24651. "adds r4, r4, r5\n\t"
  24652. #else
  24653. "add r4, r4, r5\n\t"
  24654. #endif
  24655. #ifdef WOLFSSL_KEIL
  24656. "adcs r3, r3, r6\n\t"
  24657. #elif defined(__clang__)
  24658. "adcs r3, r6\n\t"
  24659. #else
  24660. "adc r3, r6\n\t"
  24661. #endif
  24662. #ifdef WOLFSSL_KEIL
  24663. "adcs r7, r7, r7\n\t"
  24664. #elif defined(__clang__)
  24665. "adcs r7, r7\n\t"
  24666. #else
  24667. "adc r7, r7\n\t"
  24668. #endif
  24669. "# Multiply m[63] and mu - Done\n\t"
  24670. "ldr r5, [%[a]]\n\t"
  24671. "ldr r6, [%[a], #4]\n\t"
  24672. "movs %[mp], #0\n\t"
  24673. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24674. "adds r5, r5, r4\n\t"
  24675. #else
  24676. "add r5, r5, r4\n\t"
  24677. #endif
  24678. #ifdef WOLFSSL_KEIL
  24679. "adcs r6, r6, r3\n\t"
  24680. #elif defined(__clang__)
  24681. "adcs r6, r3\n\t"
  24682. #else
  24683. "adc r6, r3\n\t"
  24684. #endif
  24685. #ifdef WOLFSSL_KEIL
  24686. "adcs r7, r7, %[mp]\n\t"
  24687. #elif defined(__clang__)
  24688. "adcs r7, %[mp]\n\t"
  24689. #else
  24690. "adc r7, %[mp]\n\t"
  24691. #endif
  24692. "stm %[a]!, {r5, r6}\n\t"
  24693. "# i += 1\n\t"
  24694. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24695. "subs %[a], %[a], #4\n\t"
  24696. #else
  24697. "sub %[a], %[a], #4\n\t"
  24698. #endif
  24699. "movs r3, #0xfc\n\t"
  24700. "mov r9, %[a]\n\t"
  24701. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24702. "subs %[a], %[a], r3\n\t"
  24703. #else
  24704. "sub %[a], %[a], r3\n\t"
  24705. #endif
  24706. "mov r12, r7\n\t"
  24707. "mov %[m], lr\n\t"
  24708. "cmp r11, %[a]\n\t"
  24709. "bgt L_sp_2048_mont_reduce_64_mod_%=\n\t"
  24710. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24711. "negs r7, r7\n\t"
  24712. #else
  24713. "neg r7, r7\n\t"
  24714. #endif
  24715. "# Subtract masked modulus\n\t"
  24716. "movs r4, #0xff\n\t"
  24717. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24718. "adds r4, r4, #1\n\t"
  24719. #else
  24720. "add r4, r4, #1\n\t"
  24721. #endif
  24722. "movs %[mp], #0\n\t"
  24723. "movs r3, #0\n\t"
  24724. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24725. "subs %[a], %[a], r4\n\t"
  24726. #else
  24727. "sub %[a], %[a], r4\n\t"
  24728. #endif
  24729. #ifndef WOLFSSL_SP_LARGE_CODE
  24730. "\n"
  24731. "L_sp_2048_mont_reduce_64_sub_mask_%=:\n\t"
  24732. "ldm %[m]!, {r6}\n\t"
  24733. "movs r5, #0\n\t"
  24734. #ifdef WOLFSSL_KEIL
  24735. "ands r6, r6, r7\n\t"
  24736. #elif defined(__clang__)
  24737. "ands r6, r7\n\t"
  24738. #else
  24739. "and r6, r7\n\t"
  24740. #endif
  24741. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24742. "subs r5, r5, %[mp]\n\t"
  24743. #else
  24744. "sub r5, r5, %[mp]\n\t"
  24745. #endif
  24746. "ldr r5, [%[a], r4]\n\t"
  24747. #ifdef WOLFSSL_KEIL
  24748. "sbcs r5, r5, r6\n\t"
  24749. #elif defined(__clang__)
  24750. "sbcs r5, r6\n\t"
  24751. #else
  24752. "sbc r5, r6\n\t"
  24753. #endif
  24754. #ifdef WOLFSSL_KEIL
  24755. "sbcs %[mp], %[mp], %[mp]\n\t"
  24756. #elif defined(__clang__)
  24757. "sbcs %[mp], %[mp]\n\t"
  24758. #else
  24759. "sbc %[mp], %[mp]\n\t"
  24760. #endif
  24761. "stm %[a]!, {r5}\n\t"
  24762. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24763. "adds r3, r3, #4\n\t"
  24764. #else
  24765. "add r3, r3, #4\n\t"
  24766. #endif
  24767. "cmp r3, r4\n\t"
  24768. "blt L_sp_2048_mont_reduce_64_sub_mask_%=\n\t"
  24769. #else /* WOLFSSL_SP_LARGE_CODE */
  24770. "ldm %[m]!, {r6}\n\t"
  24771. #ifdef WOLFSSL_KEIL
  24772. "ands r6, r6, r7\n\t"
  24773. #elif defined(__clang__)
  24774. "ands r6, r7\n\t"
  24775. #else
  24776. "and r6, r7\n\t"
  24777. #endif
  24778. "ldr r5, [%[a], r4]\n\t"
  24779. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24780. "subs r5, r5, r6\n\t"
  24781. #else
  24782. "sub r5, r5, r6\n\t"
  24783. #endif
  24784. "stm %[a]!, {r5}\n\t"
  24785. "ldm %[m]!, {r6}\n\t"
  24786. #ifdef WOLFSSL_KEIL
  24787. "ands r6, r6, r7\n\t"
  24788. #elif defined(__clang__)
  24789. "ands r6, r7\n\t"
  24790. #else
  24791. "and r6, r7\n\t"
  24792. #endif
  24793. "ldr r5, [%[a], r4]\n\t"
  24794. #ifdef WOLFSSL_KEIL
  24795. "sbcs r5, r5, r6\n\t"
  24796. #elif defined(__clang__)
  24797. "sbcs r5, r6\n\t"
  24798. #else
  24799. "sbc r5, r6\n\t"
  24800. #endif
  24801. "stm %[a]!, {r5}\n\t"
  24802. "ldm %[m]!, {r6}\n\t"
  24803. #ifdef WOLFSSL_KEIL
  24804. "ands r6, r6, r7\n\t"
  24805. #elif defined(__clang__)
  24806. "ands r6, r7\n\t"
  24807. #else
  24808. "and r6, r7\n\t"
  24809. #endif
  24810. "ldr r5, [%[a], r4]\n\t"
  24811. #ifdef WOLFSSL_KEIL
  24812. "sbcs r5, r5, r6\n\t"
  24813. #elif defined(__clang__)
  24814. "sbcs r5, r6\n\t"
  24815. #else
  24816. "sbc r5, r6\n\t"
  24817. #endif
  24818. "stm %[a]!, {r5}\n\t"
  24819. "ldm %[m]!, {r6}\n\t"
  24820. #ifdef WOLFSSL_KEIL
  24821. "ands r6, r6, r7\n\t"
  24822. #elif defined(__clang__)
  24823. "ands r6, r7\n\t"
  24824. #else
  24825. "and r6, r7\n\t"
  24826. #endif
  24827. "ldr r5, [%[a], r4]\n\t"
  24828. #ifdef WOLFSSL_KEIL
  24829. "sbcs r5, r5, r6\n\t"
  24830. #elif defined(__clang__)
  24831. "sbcs r5, r6\n\t"
  24832. #else
  24833. "sbc r5, r6\n\t"
  24834. #endif
  24835. "stm %[a]!, {r5}\n\t"
  24836. "ldm %[m]!, {r6}\n\t"
  24837. #ifdef WOLFSSL_KEIL
  24838. "ands r6, r6, r7\n\t"
  24839. #elif defined(__clang__)
  24840. "ands r6, r7\n\t"
  24841. #else
  24842. "and r6, r7\n\t"
  24843. #endif
  24844. "ldr r5, [%[a], r4]\n\t"
  24845. #ifdef WOLFSSL_KEIL
  24846. "sbcs r5, r5, r6\n\t"
  24847. #elif defined(__clang__)
  24848. "sbcs r5, r6\n\t"
  24849. #else
  24850. "sbc r5, r6\n\t"
  24851. #endif
  24852. "stm %[a]!, {r5}\n\t"
  24853. "ldm %[m]!, {r6}\n\t"
  24854. #ifdef WOLFSSL_KEIL
  24855. "ands r6, r6, r7\n\t"
  24856. #elif defined(__clang__)
  24857. "ands r6, r7\n\t"
  24858. #else
  24859. "and r6, r7\n\t"
  24860. #endif
  24861. "ldr r5, [%[a], r4]\n\t"
  24862. #ifdef WOLFSSL_KEIL
  24863. "sbcs r5, r5, r6\n\t"
  24864. #elif defined(__clang__)
  24865. "sbcs r5, r6\n\t"
  24866. #else
  24867. "sbc r5, r6\n\t"
  24868. #endif
  24869. "stm %[a]!, {r5}\n\t"
  24870. "ldm %[m]!, {r6}\n\t"
  24871. #ifdef WOLFSSL_KEIL
  24872. "ands r6, r6, r7\n\t"
  24873. #elif defined(__clang__)
  24874. "ands r6, r7\n\t"
  24875. #else
  24876. "and r6, r7\n\t"
  24877. #endif
  24878. "ldr r5, [%[a], r4]\n\t"
  24879. #ifdef WOLFSSL_KEIL
  24880. "sbcs r5, r5, r6\n\t"
  24881. #elif defined(__clang__)
  24882. "sbcs r5, r6\n\t"
  24883. #else
  24884. "sbc r5, r6\n\t"
  24885. #endif
  24886. "stm %[a]!, {r5}\n\t"
  24887. "ldm %[m]!, {r6}\n\t"
  24888. #ifdef WOLFSSL_KEIL
  24889. "ands r6, r6, r7\n\t"
  24890. #elif defined(__clang__)
  24891. "ands r6, r7\n\t"
  24892. #else
  24893. "and r6, r7\n\t"
  24894. #endif
  24895. "ldr r5, [%[a], r4]\n\t"
  24896. #ifdef WOLFSSL_KEIL
  24897. "sbcs r5, r5, r6\n\t"
  24898. #elif defined(__clang__)
  24899. "sbcs r5, r6\n\t"
  24900. #else
  24901. "sbc r5, r6\n\t"
  24902. #endif
  24903. "stm %[a]!, {r5}\n\t"
  24904. "ldm %[m]!, {r6}\n\t"
  24905. #ifdef WOLFSSL_KEIL
  24906. "ands r6, r6, r7\n\t"
  24907. #elif defined(__clang__)
  24908. "ands r6, r7\n\t"
  24909. #else
  24910. "and r6, r7\n\t"
  24911. #endif
  24912. "ldr r5, [%[a], r4]\n\t"
  24913. #ifdef WOLFSSL_KEIL
  24914. "sbcs r5, r5, r6\n\t"
  24915. #elif defined(__clang__)
  24916. "sbcs r5, r6\n\t"
  24917. #else
  24918. "sbc r5, r6\n\t"
  24919. #endif
  24920. "stm %[a]!, {r5}\n\t"
  24921. "ldm %[m]!, {r6}\n\t"
  24922. #ifdef WOLFSSL_KEIL
  24923. "ands r6, r6, r7\n\t"
  24924. #elif defined(__clang__)
  24925. "ands r6, r7\n\t"
  24926. #else
  24927. "and r6, r7\n\t"
  24928. #endif
  24929. "ldr r5, [%[a], r4]\n\t"
  24930. #ifdef WOLFSSL_KEIL
  24931. "sbcs r5, r5, r6\n\t"
  24932. #elif defined(__clang__)
  24933. "sbcs r5, r6\n\t"
  24934. #else
  24935. "sbc r5, r6\n\t"
  24936. #endif
  24937. "stm %[a]!, {r5}\n\t"
  24938. "ldm %[m]!, {r6}\n\t"
  24939. #ifdef WOLFSSL_KEIL
  24940. "ands r6, r6, r7\n\t"
  24941. #elif defined(__clang__)
  24942. "ands r6, r7\n\t"
  24943. #else
  24944. "and r6, r7\n\t"
  24945. #endif
  24946. "ldr r5, [%[a], r4]\n\t"
  24947. #ifdef WOLFSSL_KEIL
  24948. "sbcs r5, r5, r6\n\t"
  24949. #elif defined(__clang__)
  24950. "sbcs r5, r6\n\t"
  24951. #else
  24952. "sbc r5, r6\n\t"
  24953. #endif
  24954. "stm %[a]!, {r5}\n\t"
  24955. "ldm %[m]!, {r6}\n\t"
  24956. #ifdef WOLFSSL_KEIL
  24957. "ands r6, r6, r7\n\t"
  24958. #elif defined(__clang__)
  24959. "ands r6, r7\n\t"
  24960. #else
  24961. "and r6, r7\n\t"
  24962. #endif
  24963. "ldr r5, [%[a], r4]\n\t"
  24964. #ifdef WOLFSSL_KEIL
  24965. "sbcs r5, r5, r6\n\t"
  24966. #elif defined(__clang__)
  24967. "sbcs r5, r6\n\t"
  24968. #else
  24969. "sbc r5, r6\n\t"
  24970. #endif
  24971. "stm %[a]!, {r5}\n\t"
  24972. "ldm %[m]!, {r6}\n\t"
  24973. #ifdef WOLFSSL_KEIL
  24974. "ands r6, r6, r7\n\t"
  24975. #elif defined(__clang__)
  24976. "ands r6, r7\n\t"
  24977. #else
  24978. "and r6, r7\n\t"
  24979. #endif
  24980. "ldr r5, [%[a], r4]\n\t"
  24981. #ifdef WOLFSSL_KEIL
  24982. "sbcs r5, r5, r6\n\t"
  24983. #elif defined(__clang__)
  24984. "sbcs r5, r6\n\t"
  24985. #else
  24986. "sbc r5, r6\n\t"
  24987. #endif
  24988. "stm %[a]!, {r5}\n\t"
  24989. "ldm %[m]!, {r6}\n\t"
  24990. #ifdef WOLFSSL_KEIL
  24991. "ands r6, r6, r7\n\t"
  24992. #elif defined(__clang__)
  24993. "ands r6, r7\n\t"
  24994. #else
  24995. "and r6, r7\n\t"
  24996. #endif
  24997. "ldr r5, [%[a], r4]\n\t"
  24998. #ifdef WOLFSSL_KEIL
  24999. "sbcs r5, r5, r6\n\t"
  25000. #elif defined(__clang__)
  25001. "sbcs r5, r6\n\t"
  25002. #else
  25003. "sbc r5, r6\n\t"
  25004. #endif
  25005. "stm %[a]!, {r5}\n\t"
  25006. "ldm %[m]!, {r6}\n\t"
  25007. #ifdef WOLFSSL_KEIL
  25008. "ands r6, r6, r7\n\t"
  25009. #elif defined(__clang__)
  25010. "ands r6, r7\n\t"
  25011. #else
  25012. "and r6, r7\n\t"
  25013. #endif
  25014. "ldr r5, [%[a], r4]\n\t"
  25015. #ifdef WOLFSSL_KEIL
  25016. "sbcs r5, r5, r6\n\t"
  25017. #elif defined(__clang__)
  25018. "sbcs r5, r6\n\t"
  25019. #else
  25020. "sbc r5, r6\n\t"
  25021. #endif
  25022. "stm %[a]!, {r5}\n\t"
  25023. "ldm %[m]!, {r6}\n\t"
  25024. #ifdef WOLFSSL_KEIL
  25025. "ands r6, r6, r7\n\t"
  25026. #elif defined(__clang__)
  25027. "ands r6, r7\n\t"
  25028. #else
  25029. "and r6, r7\n\t"
  25030. #endif
  25031. "ldr r5, [%[a], r4]\n\t"
  25032. #ifdef WOLFSSL_KEIL
  25033. "sbcs r5, r5, r6\n\t"
  25034. #elif defined(__clang__)
  25035. "sbcs r5, r6\n\t"
  25036. #else
  25037. "sbc r5, r6\n\t"
  25038. #endif
  25039. "stm %[a]!, {r5}\n\t"
  25040. "ldm %[m]!, {r6}\n\t"
  25041. #ifdef WOLFSSL_KEIL
  25042. "ands r6, r6, r7\n\t"
  25043. #elif defined(__clang__)
  25044. "ands r6, r7\n\t"
  25045. #else
  25046. "and r6, r7\n\t"
  25047. #endif
  25048. "ldr r5, [%[a], r4]\n\t"
  25049. #ifdef WOLFSSL_KEIL
  25050. "sbcs r5, r5, r6\n\t"
  25051. #elif defined(__clang__)
  25052. "sbcs r5, r6\n\t"
  25053. #else
  25054. "sbc r5, r6\n\t"
  25055. #endif
  25056. "stm %[a]!, {r5}\n\t"
  25057. "ldm %[m]!, {r6}\n\t"
  25058. #ifdef WOLFSSL_KEIL
  25059. "ands r6, r6, r7\n\t"
  25060. #elif defined(__clang__)
  25061. "ands r6, r7\n\t"
  25062. #else
  25063. "and r6, r7\n\t"
  25064. #endif
  25065. "ldr r5, [%[a], r4]\n\t"
  25066. #ifdef WOLFSSL_KEIL
  25067. "sbcs r5, r5, r6\n\t"
  25068. #elif defined(__clang__)
  25069. "sbcs r5, r6\n\t"
  25070. #else
  25071. "sbc r5, r6\n\t"
  25072. #endif
  25073. "stm %[a]!, {r5}\n\t"
  25074. "ldm %[m]!, {r6}\n\t"
  25075. #ifdef WOLFSSL_KEIL
  25076. "ands r6, r6, r7\n\t"
  25077. #elif defined(__clang__)
  25078. "ands r6, r7\n\t"
  25079. #else
  25080. "and r6, r7\n\t"
  25081. #endif
  25082. "ldr r5, [%[a], r4]\n\t"
  25083. #ifdef WOLFSSL_KEIL
  25084. "sbcs r5, r5, r6\n\t"
  25085. #elif defined(__clang__)
  25086. "sbcs r5, r6\n\t"
  25087. #else
  25088. "sbc r5, r6\n\t"
  25089. #endif
  25090. "stm %[a]!, {r5}\n\t"
  25091. "ldm %[m]!, {r6}\n\t"
  25092. #ifdef WOLFSSL_KEIL
  25093. "ands r6, r6, r7\n\t"
  25094. #elif defined(__clang__)
  25095. "ands r6, r7\n\t"
  25096. #else
  25097. "and r6, r7\n\t"
  25098. #endif
  25099. "ldr r5, [%[a], r4]\n\t"
  25100. #ifdef WOLFSSL_KEIL
  25101. "sbcs r5, r5, r6\n\t"
  25102. #elif defined(__clang__)
  25103. "sbcs r5, r6\n\t"
  25104. #else
  25105. "sbc r5, r6\n\t"
  25106. #endif
  25107. "stm %[a]!, {r5}\n\t"
  25108. "ldm %[m]!, {r6}\n\t"
  25109. #ifdef WOLFSSL_KEIL
  25110. "ands r6, r6, r7\n\t"
  25111. #elif defined(__clang__)
  25112. "ands r6, r7\n\t"
  25113. #else
  25114. "and r6, r7\n\t"
  25115. #endif
  25116. "ldr r5, [%[a], r4]\n\t"
  25117. #ifdef WOLFSSL_KEIL
  25118. "sbcs r5, r5, r6\n\t"
  25119. #elif defined(__clang__)
  25120. "sbcs r5, r6\n\t"
  25121. #else
  25122. "sbc r5, r6\n\t"
  25123. #endif
  25124. "stm %[a]!, {r5}\n\t"
  25125. "ldm %[m]!, {r6}\n\t"
  25126. #ifdef WOLFSSL_KEIL
  25127. "ands r6, r6, r7\n\t"
  25128. #elif defined(__clang__)
  25129. "ands r6, r7\n\t"
  25130. #else
  25131. "and r6, r7\n\t"
  25132. #endif
  25133. "ldr r5, [%[a], r4]\n\t"
  25134. #ifdef WOLFSSL_KEIL
  25135. "sbcs r5, r5, r6\n\t"
  25136. #elif defined(__clang__)
  25137. "sbcs r5, r6\n\t"
  25138. #else
  25139. "sbc r5, r6\n\t"
  25140. #endif
  25141. "stm %[a]!, {r5}\n\t"
  25142. "ldm %[m]!, {r6}\n\t"
  25143. #ifdef WOLFSSL_KEIL
  25144. "ands r6, r6, r7\n\t"
  25145. #elif defined(__clang__)
  25146. "ands r6, r7\n\t"
  25147. #else
  25148. "and r6, r7\n\t"
  25149. #endif
  25150. "ldr r5, [%[a], r4]\n\t"
  25151. #ifdef WOLFSSL_KEIL
  25152. "sbcs r5, r5, r6\n\t"
  25153. #elif defined(__clang__)
  25154. "sbcs r5, r6\n\t"
  25155. #else
  25156. "sbc r5, r6\n\t"
  25157. #endif
  25158. "stm %[a]!, {r5}\n\t"
  25159. "ldm %[m]!, {r6}\n\t"
  25160. #ifdef WOLFSSL_KEIL
  25161. "ands r6, r6, r7\n\t"
  25162. #elif defined(__clang__)
  25163. "ands r6, r7\n\t"
  25164. #else
  25165. "and r6, r7\n\t"
  25166. #endif
  25167. "ldr r5, [%[a], r4]\n\t"
  25168. #ifdef WOLFSSL_KEIL
  25169. "sbcs r5, r5, r6\n\t"
  25170. #elif defined(__clang__)
  25171. "sbcs r5, r6\n\t"
  25172. #else
  25173. "sbc r5, r6\n\t"
  25174. #endif
  25175. "stm %[a]!, {r5}\n\t"
  25176. "ldm %[m]!, {r6}\n\t"
  25177. #ifdef WOLFSSL_KEIL
  25178. "ands r6, r6, r7\n\t"
  25179. #elif defined(__clang__)
  25180. "ands r6, r7\n\t"
  25181. #else
  25182. "and r6, r7\n\t"
  25183. #endif
  25184. "ldr r5, [%[a], r4]\n\t"
  25185. #ifdef WOLFSSL_KEIL
  25186. "sbcs r5, r5, r6\n\t"
  25187. #elif defined(__clang__)
  25188. "sbcs r5, r6\n\t"
  25189. #else
  25190. "sbc r5, r6\n\t"
  25191. #endif
  25192. "stm %[a]!, {r5}\n\t"
  25193. "ldm %[m]!, {r6}\n\t"
  25194. #ifdef WOLFSSL_KEIL
  25195. "ands r6, r6, r7\n\t"
  25196. #elif defined(__clang__)
  25197. "ands r6, r7\n\t"
  25198. #else
  25199. "and r6, r7\n\t"
  25200. #endif
  25201. "ldr r5, [%[a], r4]\n\t"
  25202. #ifdef WOLFSSL_KEIL
  25203. "sbcs r5, r5, r6\n\t"
  25204. #elif defined(__clang__)
  25205. "sbcs r5, r6\n\t"
  25206. #else
  25207. "sbc r5, r6\n\t"
  25208. #endif
  25209. "stm %[a]!, {r5}\n\t"
  25210. "ldm %[m]!, {r6}\n\t"
  25211. #ifdef WOLFSSL_KEIL
  25212. "ands r6, r6, r7\n\t"
  25213. #elif defined(__clang__)
  25214. "ands r6, r7\n\t"
  25215. #else
  25216. "and r6, r7\n\t"
  25217. #endif
  25218. "ldr r5, [%[a], r4]\n\t"
  25219. #ifdef WOLFSSL_KEIL
  25220. "sbcs r5, r5, r6\n\t"
  25221. #elif defined(__clang__)
  25222. "sbcs r5, r6\n\t"
  25223. #else
  25224. "sbc r5, r6\n\t"
  25225. #endif
  25226. "stm %[a]!, {r5}\n\t"
  25227. "ldm %[m]!, {r6}\n\t"
  25228. #ifdef WOLFSSL_KEIL
  25229. "ands r6, r6, r7\n\t"
  25230. #elif defined(__clang__)
  25231. "ands r6, r7\n\t"
  25232. #else
  25233. "and r6, r7\n\t"
  25234. #endif
  25235. "ldr r5, [%[a], r4]\n\t"
  25236. #ifdef WOLFSSL_KEIL
  25237. "sbcs r5, r5, r6\n\t"
  25238. #elif defined(__clang__)
  25239. "sbcs r5, r6\n\t"
  25240. #else
  25241. "sbc r5, r6\n\t"
  25242. #endif
  25243. "stm %[a]!, {r5}\n\t"
  25244. "ldm %[m]!, {r6}\n\t"
  25245. #ifdef WOLFSSL_KEIL
  25246. "ands r6, r6, r7\n\t"
  25247. #elif defined(__clang__)
  25248. "ands r6, r7\n\t"
  25249. #else
  25250. "and r6, r7\n\t"
  25251. #endif
  25252. "ldr r5, [%[a], r4]\n\t"
  25253. #ifdef WOLFSSL_KEIL
  25254. "sbcs r5, r5, r6\n\t"
  25255. #elif defined(__clang__)
  25256. "sbcs r5, r6\n\t"
  25257. #else
  25258. "sbc r5, r6\n\t"
  25259. #endif
  25260. "stm %[a]!, {r5}\n\t"
  25261. "ldm %[m]!, {r6}\n\t"
  25262. #ifdef WOLFSSL_KEIL
  25263. "ands r6, r6, r7\n\t"
  25264. #elif defined(__clang__)
  25265. "ands r6, r7\n\t"
  25266. #else
  25267. "and r6, r7\n\t"
  25268. #endif
  25269. "ldr r5, [%[a], r4]\n\t"
  25270. #ifdef WOLFSSL_KEIL
  25271. "sbcs r5, r5, r6\n\t"
  25272. #elif defined(__clang__)
  25273. "sbcs r5, r6\n\t"
  25274. #else
  25275. "sbc r5, r6\n\t"
  25276. #endif
  25277. "stm %[a]!, {r5}\n\t"
  25278. "ldm %[m]!, {r6}\n\t"
  25279. #ifdef WOLFSSL_KEIL
  25280. "ands r6, r6, r7\n\t"
  25281. #elif defined(__clang__)
  25282. "ands r6, r7\n\t"
  25283. #else
  25284. "and r6, r7\n\t"
  25285. #endif
  25286. "ldr r5, [%[a], r4]\n\t"
  25287. #ifdef WOLFSSL_KEIL
  25288. "sbcs r5, r5, r6\n\t"
  25289. #elif defined(__clang__)
  25290. "sbcs r5, r6\n\t"
  25291. #else
  25292. "sbc r5, r6\n\t"
  25293. #endif
  25294. "stm %[a]!, {r5}\n\t"
  25295. "ldm %[m]!, {r6}\n\t"
  25296. #ifdef WOLFSSL_KEIL
  25297. "ands r6, r6, r7\n\t"
  25298. #elif defined(__clang__)
  25299. "ands r6, r7\n\t"
  25300. #else
  25301. "and r6, r7\n\t"
  25302. #endif
  25303. "ldr r5, [%[a], r4]\n\t"
  25304. #ifdef WOLFSSL_KEIL
  25305. "sbcs r5, r5, r6\n\t"
  25306. #elif defined(__clang__)
  25307. "sbcs r5, r6\n\t"
  25308. #else
  25309. "sbc r5, r6\n\t"
  25310. #endif
  25311. "stm %[a]!, {r5}\n\t"
  25312. "ldm %[m]!, {r6}\n\t"
  25313. #ifdef WOLFSSL_KEIL
  25314. "ands r6, r6, r7\n\t"
  25315. #elif defined(__clang__)
  25316. "ands r6, r7\n\t"
  25317. #else
  25318. "and r6, r7\n\t"
  25319. #endif
  25320. "ldr r5, [%[a], r4]\n\t"
  25321. #ifdef WOLFSSL_KEIL
  25322. "sbcs r5, r5, r6\n\t"
  25323. #elif defined(__clang__)
  25324. "sbcs r5, r6\n\t"
  25325. #else
  25326. "sbc r5, r6\n\t"
  25327. #endif
  25328. "stm %[a]!, {r5}\n\t"
  25329. "ldm %[m]!, {r6}\n\t"
  25330. #ifdef WOLFSSL_KEIL
  25331. "ands r6, r6, r7\n\t"
  25332. #elif defined(__clang__)
  25333. "ands r6, r7\n\t"
  25334. #else
  25335. "and r6, r7\n\t"
  25336. #endif
  25337. "ldr r5, [%[a], r4]\n\t"
  25338. #ifdef WOLFSSL_KEIL
  25339. "sbcs r5, r5, r6\n\t"
  25340. #elif defined(__clang__)
  25341. "sbcs r5, r6\n\t"
  25342. #else
  25343. "sbc r5, r6\n\t"
  25344. #endif
  25345. "stm %[a]!, {r5}\n\t"
  25346. "ldm %[m]!, {r6}\n\t"
  25347. #ifdef WOLFSSL_KEIL
  25348. "ands r6, r6, r7\n\t"
  25349. #elif defined(__clang__)
  25350. "ands r6, r7\n\t"
  25351. #else
  25352. "and r6, r7\n\t"
  25353. #endif
  25354. "ldr r5, [%[a], r4]\n\t"
  25355. #ifdef WOLFSSL_KEIL
  25356. "sbcs r5, r5, r6\n\t"
  25357. #elif defined(__clang__)
  25358. "sbcs r5, r6\n\t"
  25359. #else
  25360. "sbc r5, r6\n\t"
  25361. #endif
  25362. "stm %[a]!, {r5}\n\t"
  25363. "ldm %[m]!, {r6}\n\t"
  25364. #ifdef WOLFSSL_KEIL
  25365. "ands r6, r6, r7\n\t"
  25366. #elif defined(__clang__)
  25367. "ands r6, r7\n\t"
  25368. #else
  25369. "and r6, r7\n\t"
  25370. #endif
  25371. "ldr r5, [%[a], r4]\n\t"
  25372. #ifdef WOLFSSL_KEIL
  25373. "sbcs r5, r5, r6\n\t"
  25374. #elif defined(__clang__)
  25375. "sbcs r5, r6\n\t"
  25376. #else
  25377. "sbc r5, r6\n\t"
  25378. #endif
  25379. "stm %[a]!, {r5}\n\t"
  25380. "ldm %[m]!, {r6}\n\t"
  25381. #ifdef WOLFSSL_KEIL
  25382. "ands r6, r6, r7\n\t"
  25383. #elif defined(__clang__)
  25384. "ands r6, r7\n\t"
  25385. #else
  25386. "and r6, r7\n\t"
  25387. #endif
  25388. "ldr r5, [%[a], r4]\n\t"
  25389. #ifdef WOLFSSL_KEIL
  25390. "sbcs r5, r5, r6\n\t"
  25391. #elif defined(__clang__)
  25392. "sbcs r5, r6\n\t"
  25393. #else
  25394. "sbc r5, r6\n\t"
  25395. #endif
  25396. "stm %[a]!, {r5}\n\t"
  25397. "ldm %[m]!, {r6}\n\t"
  25398. #ifdef WOLFSSL_KEIL
  25399. "ands r6, r6, r7\n\t"
  25400. #elif defined(__clang__)
  25401. "ands r6, r7\n\t"
  25402. #else
  25403. "and r6, r7\n\t"
  25404. #endif
  25405. "ldr r5, [%[a], r4]\n\t"
  25406. #ifdef WOLFSSL_KEIL
  25407. "sbcs r5, r5, r6\n\t"
  25408. #elif defined(__clang__)
  25409. "sbcs r5, r6\n\t"
  25410. #else
  25411. "sbc r5, r6\n\t"
  25412. #endif
  25413. "stm %[a]!, {r5}\n\t"
  25414. "ldm %[m]!, {r6}\n\t"
  25415. #ifdef WOLFSSL_KEIL
  25416. "ands r6, r6, r7\n\t"
  25417. #elif defined(__clang__)
  25418. "ands r6, r7\n\t"
  25419. #else
  25420. "and r6, r7\n\t"
  25421. #endif
  25422. "ldr r5, [%[a], r4]\n\t"
  25423. #ifdef WOLFSSL_KEIL
  25424. "sbcs r5, r5, r6\n\t"
  25425. #elif defined(__clang__)
  25426. "sbcs r5, r6\n\t"
  25427. #else
  25428. "sbc r5, r6\n\t"
  25429. #endif
  25430. "stm %[a]!, {r5}\n\t"
  25431. "ldm %[m]!, {r6}\n\t"
  25432. #ifdef WOLFSSL_KEIL
  25433. "ands r6, r6, r7\n\t"
  25434. #elif defined(__clang__)
  25435. "ands r6, r7\n\t"
  25436. #else
  25437. "and r6, r7\n\t"
  25438. #endif
  25439. "ldr r5, [%[a], r4]\n\t"
  25440. #ifdef WOLFSSL_KEIL
  25441. "sbcs r5, r5, r6\n\t"
  25442. #elif defined(__clang__)
  25443. "sbcs r5, r6\n\t"
  25444. #else
  25445. "sbc r5, r6\n\t"
  25446. #endif
  25447. "stm %[a]!, {r5}\n\t"
  25448. "ldm %[m]!, {r6}\n\t"
  25449. #ifdef WOLFSSL_KEIL
  25450. "ands r6, r6, r7\n\t"
  25451. #elif defined(__clang__)
  25452. "ands r6, r7\n\t"
  25453. #else
  25454. "and r6, r7\n\t"
  25455. #endif
  25456. "ldr r5, [%[a], r4]\n\t"
  25457. #ifdef WOLFSSL_KEIL
  25458. "sbcs r5, r5, r6\n\t"
  25459. #elif defined(__clang__)
  25460. "sbcs r5, r6\n\t"
  25461. #else
  25462. "sbc r5, r6\n\t"
  25463. #endif
  25464. "stm %[a]!, {r5}\n\t"
  25465. "ldm %[m]!, {r6}\n\t"
  25466. #ifdef WOLFSSL_KEIL
  25467. "ands r6, r6, r7\n\t"
  25468. #elif defined(__clang__)
  25469. "ands r6, r7\n\t"
  25470. #else
  25471. "and r6, r7\n\t"
  25472. #endif
  25473. "ldr r5, [%[a], r4]\n\t"
  25474. #ifdef WOLFSSL_KEIL
  25475. "sbcs r5, r5, r6\n\t"
  25476. #elif defined(__clang__)
  25477. "sbcs r5, r6\n\t"
  25478. #else
  25479. "sbc r5, r6\n\t"
  25480. #endif
  25481. "stm %[a]!, {r5}\n\t"
  25482. "ldm %[m]!, {r6}\n\t"
  25483. #ifdef WOLFSSL_KEIL
  25484. "ands r6, r6, r7\n\t"
  25485. #elif defined(__clang__)
  25486. "ands r6, r7\n\t"
  25487. #else
  25488. "and r6, r7\n\t"
  25489. #endif
  25490. "ldr r5, [%[a], r4]\n\t"
  25491. #ifdef WOLFSSL_KEIL
  25492. "sbcs r5, r5, r6\n\t"
  25493. #elif defined(__clang__)
  25494. "sbcs r5, r6\n\t"
  25495. #else
  25496. "sbc r5, r6\n\t"
  25497. #endif
  25498. "stm %[a]!, {r5}\n\t"
  25499. "ldm %[m]!, {r6}\n\t"
  25500. #ifdef WOLFSSL_KEIL
  25501. "ands r6, r6, r7\n\t"
  25502. #elif defined(__clang__)
  25503. "ands r6, r7\n\t"
  25504. #else
  25505. "and r6, r7\n\t"
  25506. #endif
  25507. "ldr r5, [%[a], r4]\n\t"
  25508. #ifdef WOLFSSL_KEIL
  25509. "sbcs r5, r5, r6\n\t"
  25510. #elif defined(__clang__)
  25511. "sbcs r5, r6\n\t"
  25512. #else
  25513. "sbc r5, r6\n\t"
  25514. #endif
  25515. "stm %[a]!, {r5}\n\t"
  25516. "ldm %[m]!, {r6}\n\t"
  25517. #ifdef WOLFSSL_KEIL
  25518. "ands r6, r6, r7\n\t"
  25519. #elif defined(__clang__)
  25520. "ands r6, r7\n\t"
  25521. #else
  25522. "and r6, r7\n\t"
  25523. #endif
  25524. "ldr r5, [%[a], r4]\n\t"
  25525. #ifdef WOLFSSL_KEIL
  25526. "sbcs r5, r5, r6\n\t"
  25527. #elif defined(__clang__)
  25528. "sbcs r5, r6\n\t"
  25529. #else
  25530. "sbc r5, r6\n\t"
  25531. #endif
  25532. "stm %[a]!, {r5}\n\t"
  25533. "ldm %[m]!, {r6}\n\t"
  25534. #ifdef WOLFSSL_KEIL
  25535. "ands r6, r6, r7\n\t"
  25536. #elif defined(__clang__)
  25537. "ands r6, r7\n\t"
  25538. #else
  25539. "and r6, r7\n\t"
  25540. #endif
  25541. "ldr r5, [%[a], r4]\n\t"
  25542. #ifdef WOLFSSL_KEIL
  25543. "sbcs r5, r5, r6\n\t"
  25544. #elif defined(__clang__)
  25545. "sbcs r5, r6\n\t"
  25546. #else
  25547. "sbc r5, r6\n\t"
  25548. #endif
  25549. "stm %[a]!, {r5}\n\t"
  25550. "ldm %[m]!, {r6}\n\t"
  25551. #ifdef WOLFSSL_KEIL
  25552. "ands r6, r6, r7\n\t"
  25553. #elif defined(__clang__)
  25554. "ands r6, r7\n\t"
  25555. #else
  25556. "and r6, r7\n\t"
  25557. #endif
  25558. "ldr r5, [%[a], r4]\n\t"
  25559. #ifdef WOLFSSL_KEIL
  25560. "sbcs r5, r5, r6\n\t"
  25561. #elif defined(__clang__)
  25562. "sbcs r5, r6\n\t"
  25563. #else
  25564. "sbc r5, r6\n\t"
  25565. #endif
  25566. "stm %[a]!, {r5}\n\t"
  25567. "ldm %[m]!, {r6}\n\t"
  25568. #ifdef WOLFSSL_KEIL
  25569. "ands r6, r6, r7\n\t"
  25570. #elif defined(__clang__)
  25571. "ands r6, r7\n\t"
  25572. #else
  25573. "and r6, r7\n\t"
  25574. #endif
  25575. "ldr r5, [%[a], r4]\n\t"
  25576. #ifdef WOLFSSL_KEIL
  25577. "sbcs r5, r5, r6\n\t"
  25578. #elif defined(__clang__)
  25579. "sbcs r5, r6\n\t"
  25580. #else
  25581. "sbc r5, r6\n\t"
  25582. #endif
  25583. "stm %[a]!, {r5}\n\t"
  25584. "ldm %[m]!, {r6}\n\t"
  25585. #ifdef WOLFSSL_KEIL
  25586. "ands r6, r6, r7\n\t"
  25587. #elif defined(__clang__)
  25588. "ands r6, r7\n\t"
  25589. #else
  25590. "and r6, r7\n\t"
  25591. #endif
  25592. "ldr r5, [%[a], r4]\n\t"
  25593. #ifdef WOLFSSL_KEIL
  25594. "sbcs r5, r5, r6\n\t"
  25595. #elif defined(__clang__)
  25596. "sbcs r5, r6\n\t"
  25597. #else
  25598. "sbc r5, r6\n\t"
  25599. #endif
  25600. "stm %[a]!, {r5}\n\t"
  25601. "ldm %[m]!, {r6}\n\t"
  25602. #ifdef WOLFSSL_KEIL
  25603. "ands r6, r6, r7\n\t"
  25604. #elif defined(__clang__)
  25605. "ands r6, r7\n\t"
  25606. #else
  25607. "and r6, r7\n\t"
  25608. #endif
  25609. "ldr r5, [%[a], r4]\n\t"
  25610. #ifdef WOLFSSL_KEIL
  25611. "sbcs r5, r5, r6\n\t"
  25612. #elif defined(__clang__)
  25613. "sbcs r5, r6\n\t"
  25614. #else
  25615. "sbc r5, r6\n\t"
  25616. #endif
  25617. "stm %[a]!, {r5}\n\t"
  25618. "ldm %[m]!, {r6}\n\t"
  25619. #ifdef WOLFSSL_KEIL
  25620. "ands r6, r6, r7\n\t"
  25621. #elif defined(__clang__)
  25622. "ands r6, r7\n\t"
  25623. #else
  25624. "and r6, r7\n\t"
  25625. #endif
  25626. "ldr r5, [%[a], r4]\n\t"
  25627. #ifdef WOLFSSL_KEIL
  25628. "sbcs r5, r5, r6\n\t"
  25629. #elif defined(__clang__)
  25630. "sbcs r5, r6\n\t"
  25631. #else
  25632. "sbc r5, r6\n\t"
  25633. #endif
  25634. "stm %[a]!, {r5}\n\t"
  25635. "ldm %[m]!, {r6}\n\t"
  25636. #ifdef WOLFSSL_KEIL
  25637. "ands r6, r6, r7\n\t"
  25638. #elif defined(__clang__)
  25639. "ands r6, r7\n\t"
  25640. #else
  25641. "and r6, r7\n\t"
  25642. #endif
  25643. "ldr r5, [%[a], r4]\n\t"
  25644. #ifdef WOLFSSL_KEIL
  25645. "sbcs r5, r5, r6\n\t"
  25646. #elif defined(__clang__)
  25647. "sbcs r5, r6\n\t"
  25648. #else
  25649. "sbc r5, r6\n\t"
  25650. #endif
  25651. "stm %[a]!, {r5}\n\t"
  25652. "ldm %[m]!, {r6}\n\t"
  25653. #ifdef WOLFSSL_KEIL
  25654. "ands r6, r6, r7\n\t"
  25655. #elif defined(__clang__)
  25656. "ands r6, r7\n\t"
  25657. #else
  25658. "and r6, r7\n\t"
  25659. #endif
  25660. "ldr r5, [%[a], r4]\n\t"
  25661. #ifdef WOLFSSL_KEIL
  25662. "sbcs r5, r5, r6\n\t"
  25663. #elif defined(__clang__)
  25664. "sbcs r5, r6\n\t"
  25665. #else
  25666. "sbc r5, r6\n\t"
  25667. #endif
  25668. "stm %[a]!, {r5}\n\t"
  25669. "ldm %[m]!, {r6}\n\t"
  25670. #ifdef WOLFSSL_KEIL
  25671. "ands r6, r6, r7\n\t"
  25672. #elif defined(__clang__)
  25673. "ands r6, r7\n\t"
  25674. #else
  25675. "and r6, r7\n\t"
  25676. #endif
  25677. "ldr r5, [%[a], r4]\n\t"
  25678. #ifdef WOLFSSL_KEIL
  25679. "sbcs r5, r5, r6\n\t"
  25680. #elif defined(__clang__)
  25681. "sbcs r5, r6\n\t"
  25682. #else
  25683. "sbc r5, r6\n\t"
  25684. #endif
  25685. "stm %[a]!, {r5}\n\t"
  25686. "ldm %[m]!, {r6}\n\t"
  25687. #ifdef WOLFSSL_KEIL
  25688. "ands r6, r6, r7\n\t"
  25689. #elif defined(__clang__)
  25690. "ands r6, r7\n\t"
  25691. #else
  25692. "and r6, r7\n\t"
  25693. #endif
  25694. "ldr r5, [%[a], r4]\n\t"
  25695. #ifdef WOLFSSL_KEIL
  25696. "sbcs r5, r5, r6\n\t"
  25697. #elif defined(__clang__)
  25698. "sbcs r5, r6\n\t"
  25699. #else
  25700. "sbc r5, r6\n\t"
  25701. #endif
  25702. "stm %[a]!, {r5}\n\t"
  25703. "ldm %[m]!, {r6}\n\t"
  25704. #ifdef WOLFSSL_KEIL
  25705. "ands r6, r6, r7\n\t"
  25706. #elif defined(__clang__)
  25707. "ands r6, r7\n\t"
  25708. #else
  25709. "and r6, r7\n\t"
  25710. #endif
  25711. "ldr r5, [%[a], r4]\n\t"
  25712. #ifdef WOLFSSL_KEIL
  25713. "sbcs r5, r5, r6\n\t"
  25714. #elif defined(__clang__)
  25715. "sbcs r5, r6\n\t"
  25716. #else
  25717. "sbc r5, r6\n\t"
  25718. #endif
  25719. "stm %[a]!, {r5}\n\t"
  25720. "ldm %[m]!, {r6}\n\t"
  25721. #ifdef WOLFSSL_KEIL
  25722. "ands r6, r6, r7\n\t"
  25723. #elif defined(__clang__)
  25724. "ands r6, r7\n\t"
  25725. #else
  25726. "and r6, r7\n\t"
  25727. #endif
  25728. "ldr r5, [%[a], r4]\n\t"
  25729. #ifdef WOLFSSL_KEIL
  25730. "sbcs r5, r5, r6\n\t"
  25731. #elif defined(__clang__)
  25732. "sbcs r5, r6\n\t"
  25733. #else
  25734. "sbc r5, r6\n\t"
  25735. #endif
  25736. "stm %[a]!, {r5}\n\t"
  25737. "ldm %[m]!, {r6}\n\t"
  25738. #ifdef WOLFSSL_KEIL
  25739. "ands r6, r6, r7\n\t"
  25740. #elif defined(__clang__)
  25741. "ands r6, r7\n\t"
  25742. #else
  25743. "and r6, r7\n\t"
  25744. #endif
  25745. "ldr r5, [%[a], r4]\n\t"
  25746. #ifdef WOLFSSL_KEIL
  25747. "sbcs r5, r5, r6\n\t"
  25748. #elif defined(__clang__)
  25749. "sbcs r5, r6\n\t"
  25750. #else
  25751. "sbc r5, r6\n\t"
  25752. #endif
  25753. "stm %[a]!, {r5}\n\t"
  25754. "ldm %[m]!, {r6}\n\t"
  25755. #ifdef WOLFSSL_KEIL
  25756. "ands r6, r6, r7\n\t"
  25757. #elif defined(__clang__)
  25758. "ands r6, r7\n\t"
  25759. #else
  25760. "and r6, r7\n\t"
  25761. #endif
  25762. "ldr r5, [%[a], r4]\n\t"
  25763. #ifdef WOLFSSL_KEIL
  25764. "sbcs r5, r5, r6\n\t"
  25765. #elif defined(__clang__)
  25766. "sbcs r5, r6\n\t"
  25767. #else
  25768. "sbc r5, r6\n\t"
  25769. #endif
  25770. "stm %[a]!, {r5}\n\t"
  25771. "ldm %[m]!, {r6}\n\t"
  25772. #ifdef WOLFSSL_KEIL
  25773. "ands r6, r6, r7\n\t"
  25774. #elif defined(__clang__)
  25775. "ands r6, r7\n\t"
  25776. #else
  25777. "and r6, r7\n\t"
  25778. #endif
  25779. "ldr r5, [%[a], r4]\n\t"
  25780. #ifdef WOLFSSL_KEIL
  25781. "sbcs r5, r5, r6\n\t"
  25782. #elif defined(__clang__)
  25783. "sbcs r5, r6\n\t"
  25784. #else
  25785. "sbc r5, r6\n\t"
  25786. #endif
  25787. "stm %[a]!, {r5}\n\t"
  25788. "ldm %[m]!, {r6}\n\t"
  25789. #ifdef WOLFSSL_KEIL
  25790. "ands r6, r6, r7\n\t"
  25791. #elif defined(__clang__)
  25792. "ands r6, r7\n\t"
  25793. #else
  25794. "and r6, r7\n\t"
  25795. #endif
  25796. "ldr r5, [%[a], r4]\n\t"
  25797. #ifdef WOLFSSL_KEIL
  25798. "sbcs r5, r5, r6\n\t"
  25799. #elif defined(__clang__)
  25800. "sbcs r5, r6\n\t"
  25801. #else
  25802. "sbc r5, r6\n\t"
  25803. #endif
  25804. "stm %[a]!, {r5}\n\t"
  25805. "ldm %[m]!, {r6}\n\t"
  25806. #ifdef WOLFSSL_KEIL
  25807. "ands r6, r6, r7\n\t"
  25808. #elif defined(__clang__)
  25809. "ands r6, r7\n\t"
  25810. #else
  25811. "and r6, r7\n\t"
  25812. #endif
  25813. "ldr r5, [%[a], r4]\n\t"
  25814. #ifdef WOLFSSL_KEIL
  25815. "sbcs r5, r5, r6\n\t"
  25816. #elif defined(__clang__)
  25817. "sbcs r5, r6\n\t"
  25818. #else
  25819. "sbc r5, r6\n\t"
  25820. #endif
  25821. "stm %[a]!, {r5}\n\t"
  25822. "ldm %[m]!, {r6}\n\t"
  25823. #ifdef WOLFSSL_KEIL
  25824. "ands r6, r6, r7\n\t"
  25825. #elif defined(__clang__)
  25826. "ands r6, r7\n\t"
  25827. #else
  25828. "and r6, r7\n\t"
  25829. #endif
  25830. "ldr r5, [%[a], r4]\n\t"
  25831. #ifdef WOLFSSL_KEIL
  25832. "sbcs r5, r5, r6\n\t"
  25833. #elif defined(__clang__)
  25834. "sbcs r5, r6\n\t"
  25835. #else
  25836. "sbc r5, r6\n\t"
  25837. #endif
  25838. "stm %[a]!, {r5}\n\t"
  25839. "ldm %[m]!, {r6}\n\t"
  25840. #ifdef WOLFSSL_KEIL
  25841. "ands r6, r6, r7\n\t"
  25842. #elif defined(__clang__)
  25843. "ands r6, r7\n\t"
  25844. #else
  25845. "and r6, r7\n\t"
  25846. #endif
  25847. "ldr r5, [%[a], r4]\n\t"
  25848. #ifdef WOLFSSL_KEIL
  25849. "sbcs r5, r5, r6\n\t"
  25850. #elif defined(__clang__)
  25851. "sbcs r5, r6\n\t"
  25852. #else
  25853. "sbc r5, r6\n\t"
  25854. #endif
  25855. "stm %[a]!, {r5}\n\t"
  25856. #endif /* WOLFSSL_SP_LARGE_CODE */
  25857. : [a] "+l" (a), [m] "+l" (m), [mp] "+l" (mp)
  25858. :
  25859. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr"
  25860. );
  25861. }
  25862. /* Multiply two Montgomery form numbers mod the modulus (prime).
  25863. * (r = a * b mod m)
  25864. *
  25865. * r Result of multiplication.
  25866. * a First number to multiply in Montgomery form.
  25867. * b Second number to multiply in Montgomery form.
  25868. * m Modulus (prime).
  25869. * mp Montgomery mulitplier.
  25870. */
  25871. SP_NOINLINE static void sp_2048_mont_mul_64(sp_digit* r, const sp_digit* a,
  25872. const sp_digit* b, const sp_digit* m, sp_digit mp)
  25873. {
  25874. sp_2048_mul_64(r, a, b);
  25875. sp_2048_mont_reduce_64(r, m, mp);
  25876. }
  25877. /* Square the Montgomery form number. (r = a * a mod m)
  25878. *
  25879. * r Result of squaring.
  25880. * a Number to square in Montgomery form.
  25881. * m Modulus (prime).
  25882. * mp Montgomery mulitplier.
  25883. */
  25884. SP_NOINLINE static void sp_2048_mont_sqr_64(sp_digit* r, const sp_digit* a,
  25885. const sp_digit* m, sp_digit mp)
  25886. {
  25887. sp_2048_sqr_64(r, a);
  25888. sp_2048_mont_reduce_64(r, m, mp);
  25889. }
  25890. #ifdef WOLFSSL_SP_SMALL
  25891. /* Sub b from a into r. (r = a - b)
  25892. *
  25893. * r A single precision integer.
  25894. * a A single precision integer.
  25895. * b A single precision integer.
  25896. */
  25897. SP_NOINLINE static sp_digit sp_2048_sub_64(sp_digit* r, const sp_digit* a,
  25898. const sp_digit* b)
  25899. {
  25900. __asm__ __volatile__ (
  25901. "movs r6, %[a]\n\t"
  25902. "movs r3, #0\n\t"
  25903. "movs r5, #0xff\n\t"
  25904. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  25905. "adds r5, r5, #1\n\t"
  25906. #else
  25907. "add r5, r5, #1\n\t"
  25908. #endif
  25909. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  25910. "adds r6, r6, r5\n\t"
  25911. #else
  25912. "add r6, r6, r5\n\t"
  25913. #endif
  25914. "\n"
  25915. "L_sp_2048_sub_64_word_%=:\n\t"
  25916. "movs r5, #0\n\t"
  25917. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  25918. "subs r5, r5, r3\n\t"
  25919. #else
  25920. "sub r5, r5, r3\n\t"
  25921. #endif
  25922. "ldr r4, [%[a]]\n\t"
  25923. "ldr r5, [%[b]]\n\t"
  25924. #ifdef WOLFSSL_KEIL
  25925. "sbcs r4, r4, r5\n\t"
  25926. #elif defined(__clang__)
  25927. "sbcs r4, r5\n\t"
  25928. #else
  25929. "sbc r4, r5\n\t"
  25930. #endif
  25931. "str r4, [%[r]]\n\t"
  25932. #ifdef WOLFSSL_KEIL
  25933. "sbcs r3, r3, r3\n\t"
  25934. #elif defined(__clang__)
  25935. "sbcs r3, r3\n\t"
  25936. #else
  25937. "sbc r3, r3\n\t"
  25938. #endif
  25939. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  25940. "adds %[a], %[a], #4\n\t"
  25941. #else
  25942. "add %[a], %[a], #4\n\t"
  25943. #endif
  25944. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  25945. "adds %[b], %[b], #4\n\t"
  25946. #else
  25947. "add %[b], %[b], #4\n\t"
  25948. #endif
  25949. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  25950. "adds %[r], %[r], #4\n\t"
  25951. #else
  25952. "add %[r], %[r], #4\n\t"
  25953. #endif
  25954. "cmp %[a], r6\n\t"
  25955. "bne L_sp_2048_sub_64_word_%=\n\t"
  25956. "movs %[r], r3\n\t"
  25957. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  25958. :
  25959. : "memory", "r3", "r4", "r5", "r6"
  25960. );
  25961. return (uint32_t)(size_t)r;
  25962. }
  25963. #else
  25964. /* Sub b from a into r. (r = a - b)
  25965. *
  25966. * r A single precision integer.
  25967. * a A single precision integer.
  25968. * b A single precision integer.
  25969. */
  25970. SP_NOINLINE static sp_digit sp_2048_sub_64(sp_digit* r, const sp_digit* a,
  25971. const sp_digit* b)
  25972. {
  25973. __asm__ __volatile__ (
  25974. "ldm %[b]!, {r5, r6}\n\t"
  25975. "ldm %[a]!, {r3, r4}\n\t"
  25976. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  25977. "subs r3, r3, r5\n\t"
  25978. #else
  25979. "sub r3, r3, r5\n\t"
  25980. #endif
  25981. #ifdef WOLFSSL_KEIL
  25982. "sbcs r4, r4, r6\n\t"
  25983. #elif defined(__clang__)
  25984. "sbcs r4, r6\n\t"
  25985. #else
  25986. "sbc r4, r6\n\t"
  25987. #endif
  25988. "stm %[r]!, {r3, r4}\n\t"
  25989. "ldm %[b]!, {r5, r6}\n\t"
  25990. "ldm %[a]!, {r3, r4}\n\t"
  25991. #ifdef WOLFSSL_KEIL
  25992. "sbcs r3, r3, r5\n\t"
  25993. #elif defined(__clang__)
  25994. "sbcs r3, r5\n\t"
  25995. #else
  25996. "sbc r3, r5\n\t"
  25997. #endif
  25998. #ifdef WOLFSSL_KEIL
  25999. "sbcs r4, r4, r6\n\t"
  26000. #elif defined(__clang__)
  26001. "sbcs r4, r6\n\t"
  26002. #else
  26003. "sbc r4, r6\n\t"
  26004. #endif
  26005. "stm %[r]!, {r3, r4}\n\t"
  26006. "ldm %[b]!, {r5, r6}\n\t"
  26007. "ldm %[a]!, {r3, r4}\n\t"
  26008. #ifdef WOLFSSL_KEIL
  26009. "sbcs r3, r3, r5\n\t"
  26010. #elif defined(__clang__)
  26011. "sbcs r3, r5\n\t"
  26012. #else
  26013. "sbc r3, r5\n\t"
  26014. #endif
  26015. #ifdef WOLFSSL_KEIL
  26016. "sbcs r4, r4, r6\n\t"
  26017. #elif defined(__clang__)
  26018. "sbcs r4, r6\n\t"
  26019. #else
  26020. "sbc r4, r6\n\t"
  26021. #endif
  26022. "stm %[r]!, {r3, r4}\n\t"
  26023. "ldm %[b]!, {r5, r6}\n\t"
  26024. "ldm %[a]!, {r3, r4}\n\t"
  26025. #ifdef WOLFSSL_KEIL
  26026. "sbcs r3, r3, r5\n\t"
  26027. #elif defined(__clang__)
  26028. "sbcs r3, r5\n\t"
  26029. #else
  26030. "sbc r3, r5\n\t"
  26031. #endif
  26032. #ifdef WOLFSSL_KEIL
  26033. "sbcs r4, r4, r6\n\t"
  26034. #elif defined(__clang__)
  26035. "sbcs r4, r6\n\t"
  26036. #else
  26037. "sbc r4, r6\n\t"
  26038. #endif
  26039. "stm %[r]!, {r3, r4}\n\t"
  26040. "ldm %[b]!, {r5, r6}\n\t"
  26041. "ldm %[a]!, {r3, r4}\n\t"
  26042. #ifdef WOLFSSL_KEIL
  26043. "sbcs r3, r3, r5\n\t"
  26044. #elif defined(__clang__)
  26045. "sbcs r3, r5\n\t"
  26046. #else
  26047. "sbc r3, r5\n\t"
  26048. #endif
  26049. #ifdef WOLFSSL_KEIL
  26050. "sbcs r4, r4, r6\n\t"
  26051. #elif defined(__clang__)
  26052. "sbcs r4, r6\n\t"
  26053. #else
  26054. "sbc r4, r6\n\t"
  26055. #endif
  26056. "stm %[r]!, {r3, r4}\n\t"
  26057. "ldm %[b]!, {r5, r6}\n\t"
  26058. "ldm %[a]!, {r3, r4}\n\t"
  26059. #ifdef WOLFSSL_KEIL
  26060. "sbcs r3, r3, r5\n\t"
  26061. #elif defined(__clang__)
  26062. "sbcs r3, r5\n\t"
  26063. #else
  26064. "sbc r3, r5\n\t"
  26065. #endif
  26066. #ifdef WOLFSSL_KEIL
  26067. "sbcs r4, r4, r6\n\t"
  26068. #elif defined(__clang__)
  26069. "sbcs r4, r6\n\t"
  26070. #else
  26071. "sbc r4, r6\n\t"
  26072. #endif
  26073. "stm %[r]!, {r3, r4}\n\t"
  26074. "ldm %[b]!, {r5, r6}\n\t"
  26075. "ldm %[a]!, {r3, r4}\n\t"
  26076. #ifdef WOLFSSL_KEIL
  26077. "sbcs r3, r3, r5\n\t"
  26078. #elif defined(__clang__)
  26079. "sbcs r3, r5\n\t"
  26080. #else
  26081. "sbc r3, r5\n\t"
  26082. #endif
  26083. #ifdef WOLFSSL_KEIL
  26084. "sbcs r4, r4, r6\n\t"
  26085. #elif defined(__clang__)
  26086. "sbcs r4, r6\n\t"
  26087. #else
  26088. "sbc r4, r6\n\t"
  26089. #endif
  26090. "stm %[r]!, {r3, r4}\n\t"
  26091. "ldm %[b]!, {r5, r6}\n\t"
  26092. "ldm %[a]!, {r3, r4}\n\t"
  26093. #ifdef WOLFSSL_KEIL
  26094. "sbcs r3, r3, r5\n\t"
  26095. #elif defined(__clang__)
  26096. "sbcs r3, r5\n\t"
  26097. #else
  26098. "sbc r3, r5\n\t"
  26099. #endif
  26100. #ifdef WOLFSSL_KEIL
  26101. "sbcs r4, r4, r6\n\t"
  26102. #elif defined(__clang__)
  26103. "sbcs r4, r6\n\t"
  26104. #else
  26105. "sbc r4, r6\n\t"
  26106. #endif
  26107. "stm %[r]!, {r3, r4}\n\t"
  26108. "ldm %[b]!, {r5, r6}\n\t"
  26109. "ldm %[a]!, {r3, r4}\n\t"
  26110. #ifdef WOLFSSL_KEIL
  26111. "sbcs r3, r3, r5\n\t"
  26112. #elif defined(__clang__)
  26113. "sbcs r3, r5\n\t"
  26114. #else
  26115. "sbc r3, r5\n\t"
  26116. #endif
  26117. #ifdef WOLFSSL_KEIL
  26118. "sbcs r4, r4, r6\n\t"
  26119. #elif defined(__clang__)
  26120. "sbcs r4, r6\n\t"
  26121. #else
  26122. "sbc r4, r6\n\t"
  26123. #endif
  26124. "stm %[r]!, {r3, r4}\n\t"
  26125. "ldm %[b]!, {r5, r6}\n\t"
  26126. "ldm %[a]!, {r3, r4}\n\t"
  26127. #ifdef WOLFSSL_KEIL
  26128. "sbcs r3, r3, r5\n\t"
  26129. #elif defined(__clang__)
  26130. "sbcs r3, r5\n\t"
  26131. #else
  26132. "sbc r3, r5\n\t"
  26133. #endif
  26134. #ifdef WOLFSSL_KEIL
  26135. "sbcs r4, r4, r6\n\t"
  26136. #elif defined(__clang__)
  26137. "sbcs r4, r6\n\t"
  26138. #else
  26139. "sbc r4, r6\n\t"
  26140. #endif
  26141. "stm %[r]!, {r3, r4}\n\t"
  26142. "ldm %[b]!, {r5, r6}\n\t"
  26143. "ldm %[a]!, {r3, r4}\n\t"
  26144. #ifdef WOLFSSL_KEIL
  26145. "sbcs r3, r3, r5\n\t"
  26146. #elif defined(__clang__)
  26147. "sbcs r3, r5\n\t"
  26148. #else
  26149. "sbc r3, r5\n\t"
  26150. #endif
  26151. #ifdef WOLFSSL_KEIL
  26152. "sbcs r4, r4, r6\n\t"
  26153. #elif defined(__clang__)
  26154. "sbcs r4, r6\n\t"
  26155. #else
  26156. "sbc r4, r6\n\t"
  26157. #endif
  26158. "stm %[r]!, {r3, r4}\n\t"
  26159. "ldm %[b]!, {r5, r6}\n\t"
  26160. "ldm %[a]!, {r3, r4}\n\t"
  26161. #ifdef WOLFSSL_KEIL
  26162. "sbcs r3, r3, r5\n\t"
  26163. #elif defined(__clang__)
  26164. "sbcs r3, r5\n\t"
  26165. #else
  26166. "sbc r3, r5\n\t"
  26167. #endif
  26168. #ifdef WOLFSSL_KEIL
  26169. "sbcs r4, r4, r6\n\t"
  26170. #elif defined(__clang__)
  26171. "sbcs r4, r6\n\t"
  26172. #else
  26173. "sbc r4, r6\n\t"
  26174. #endif
  26175. "stm %[r]!, {r3, r4}\n\t"
  26176. "ldm %[b]!, {r5, r6}\n\t"
  26177. "ldm %[a]!, {r3, r4}\n\t"
  26178. #ifdef WOLFSSL_KEIL
  26179. "sbcs r3, r3, r5\n\t"
  26180. #elif defined(__clang__)
  26181. "sbcs r3, r5\n\t"
  26182. #else
  26183. "sbc r3, r5\n\t"
  26184. #endif
  26185. #ifdef WOLFSSL_KEIL
  26186. "sbcs r4, r4, r6\n\t"
  26187. #elif defined(__clang__)
  26188. "sbcs r4, r6\n\t"
  26189. #else
  26190. "sbc r4, r6\n\t"
  26191. #endif
  26192. "stm %[r]!, {r3, r4}\n\t"
  26193. "ldm %[b]!, {r5, r6}\n\t"
  26194. "ldm %[a]!, {r3, r4}\n\t"
  26195. #ifdef WOLFSSL_KEIL
  26196. "sbcs r3, r3, r5\n\t"
  26197. #elif defined(__clang__)
  26198. "sbcs r3, r5\n\t"
  26199. #else
  26200. "sbc r3, r5\n\t"
  26201. #endif
  26202. #ifdef WOLFSSL_KEIL
  26203. "sbcs r4, r4, r6\n\t"
  26204. #elif defined(__clang__)
  26205. "sbcs r4, r6\n\t"
  26206. #else
  26207. "sbc r4, r6\n\t"
  26208. #endif
  26209. "stm %[r]!, {r3, r4}\n\t"
  26210. "ldm %[b]!, {r5, r6}\n\t"
  26211. "ldm %[a]!, {r3, r4}\n\t"
  26212. #ifdef WOLFSSL_KEIL
  26213. "sbcs r3, r3, r5\n\t"
  26214. #elif defined(__clang__)
  26215. "sbcs r3, r5\n\t"
  26216. #else
  26217. "sbc r3, r5\n\t"
  26218. #endif
  26219. #ifdef WOLFSSL_KEIL
  26220. "sbcs r4, r4, r6\n\t"
  26221. #elif defined(__clang__)
  26222. "sbcs r4, r6\n\t"
  26223. #else
  26224. "sbc r4, r6\n\t"
  26225. #endif
  26226. "stm %[r]!, {r3, r4}\n\t"
  26227. "ldm %[b]!, {r5, r6}\n\t"
  26228. "ldm %[a]!, {r3, r4}\n\t"
  26229. #ifdef WOLFSSL_KEIL
  26230. "sbcs r3, r3, r5\n\t"
  26231. #elif defined(__clang__)
  26232. "sbcs r3, r5\n\t"
  26233. #else
  26234. "sbc r3, r5\n\t"
  26235. #endif
  26236. #ifdef WOLFSSL_KEIL
  26237. "sbcs r4, r4, r6\n\t"
  26238. #elif defined(__clang__)
  26239. "sbcs r4, r6\n\t"
  26240. #else
  26241. "sbc r4, r6\n\t"
  26242. #endif
  26243. "stm %[r]!, {r3, r4}\n\t"
  26244. "ldm %[b]!, {r5, r6}\n\t"
  26245. "ldm %[a]!, {r3, r4}\n\t"
  26246. #ifdef WOLFSSL_KEIL
  26247. "sbcs r3, r3, r5\n\t"
  26248. #elif defined(__clang__)
  26249. "sbcs r3, r5\n\t"
  26250. #else
  26251. "sbc r3, r5\n\t"
  26252. #endif
  26253. #ifdef WOLFSSL_KEIL
  26254. "sbcs r4, r4, r6\n\t"
  26255. #elif defined(__clang__)
  26256. "sbcs r4, r6\n\t"
  26257. #else
  26258. "sbc r4, r6\n\t"
  26259. #endif
  26260. "stm %[r]!, {r3, r4}\n\t"
  26261. "ldm %[b]!, {r5, r6}\n\t"
  26262. "ldm %[a]!, {r3, r4}\n\t"
  26263. #ifdef WOLFSSL_KEIL
  26264. "sbcs r3, r3, r5\n\t"
  26265. #elif defined(__clang__)
  26266. "sbcs r3, r5\n\t"
  26267. #else
  26268. "sbc r3, r5\n\t"
  26269. #endif
  26270. #ifdef WOLFSSL_KEIL
  26271. "sbcs r4, r4, r6\n\t"
  26272. #elif defined(__clang__)
  26273. "sbcs r4, r6\n\t"
  26274. #else
  26275. "sbc r4, r6\n\t"
  26276. #endif
  26277. "stm %[r]!, {r3, r4}\n\t"
  26278. "ldm %[b]!, {r5, r6}\n\t"
  26279. "ldm %[a]!, {r3, r4}\n\t"
  26280. #ifdef WOLFSSL_KEIL
  26281. "sbcs r3, r3, r5\n\t"
  26282. #elif defined(__clang__)
  26283. "sbcs r3, r5\n\t"
  26284. #else
  26285. "sbc r3, r5\n\t"
  26286. #endif
  26287. #ifdef WOLFSSL_KEIL
  26288. "sbcs r4, r4, r6\n\t"
  26289. #elif defined(__clang__)
  26290. "sbcs r4, r6\n\t"
  26291. #else
  26292. "sbc r4, r6\n\t"
  26293. #endif
  26294. "stm %[r]!, {r3, r4}\n\t"
  26295. "ldm %[b]!, {r5, r6}\n\t"
  26296. "ldm %[a]!, {r3, r4}\n\t"
  26297. #ifdef WOLFSSL_KEIL
  26298. "sbcs r3, r3, r5\n\t"
  26299. #elif defined(__clang__)
  26300. "sbcs r3, r5\n\t"
  26301. #else
  26302. "sbc r3, r5\n\t"
  26303. #endif
  26304. #ifdef WOLFSSL_KEIL
  26305. "sbcs r4, r4, r6\n\t"
  26306. #elif defined(__clang__)
  26307. "sbcs r4, r6\n\t"
  26308. #else
  26309. "sbc r4, r6\n\t"
  26310. #endif
  26311. "stm %[r]!, {r3, r4}\n\t"
  26312. "ldm %[b]!, {r5, r6}\n\t"
  26313. "ldm %[a]!, {r3, r4}\n\t"
  26314. #ifdef WOLFSSL_KEIL
  26315. "sbcs r3, r3, r5\n\t"
  26316. #elif defined(__clang__)
  26317. "sbcs r3, r5\n\t"
  26318. #else
  26319. "sbc r3, r5\n\t"
  26320. #endif
  26321. #ifdef WOLFSSL_KEIL
  26322. "sbcs r4, r4, r6\n\t"
  26323. #elif defined(__clang__)
  26324. "sbcs r4, r6\n\t"
  26325. #else
  26326. "sbc r4, r6\n\t"
  26327. #endif
  26328. "stm %[r]!, {r3, r4}\n\t"
  26329. "ldm %[b]!, {r5, r6}\n\t"
  26330. "ldm %[a]!, {r3, r4}\n\t"
  26331. #ifdef WOLFSSL_KEIL
  26332. "sbcs r3, r3, r5\n\t"
  26333. #elif defined(__clang__)
  26334. "sbcs r3, r5\n\t"
  26335. #else
  26336. "sbc r3, r5\n\t"
  26337. #endif
  26338. #ifdef WOLFSSL_KEIL
  26339. "sbcs r4, r4, r6\n\t"
  26340. #elif defined(__clang__)
  26341. "sbcs r4, r6\n\t"
  26342. #else
  26343. "sbc r4, r6\n\t"
  26344. #endif
  26345. "stm %[r]!, {r3, r4}\n\t"
  26346. "ldm %[b]!, {r5, r6}\n\t"
  26347. "ldm %[a]!, {r3, r4}\n\t"
  26348. #ifdef WOLFSSL_KEIL
  26349. "sbcs r3, r3, r5\n\t"
  26350. #elif defined(__clang__)
  26351. "sbcs r3, r5\n\t"
  26352. #else
  26353. "sbc r3, r5\n\t"
  26354. #endif
  26355. #ifdef WOLFSSL_KEIL
  26356. "sbcs r4, r4, r6\n\t"
  26357. #elif defined(__clang__)
  26358. "sbcs r4, r6\n\t"
  26359. #else
  26360. "sbc r4, r6\n\t"
  26361. #endif
  26362. "stm %[r]!, {r3, r4}\n\t"
  26363. "ldm %[b]!, {r5, r6}\n\t"
  26364. "ldm %[a]!, {r3, r4}\n\t"
  26365. #ifdef WOLFSSL_KEIL
  26366. "sbcs r3, r3, r5\n\t"
  26367. #elif defined(__clang__)
  26368. "sbcs r3, r5\n\t"
  26369. #else
  26370. "sbc r3, r5\n\t"
  26371. #endif
  26372. #ifdef WOLFSSL_KEIL
  26373. "sbcs r4, r4, r6\n\t"
  26374. #elif defined(__clang__)
  26375. "sbcs r4, r6\n\t"
  26376. #else
  26377. "sbc r4, r6\n\t"
  26378. #endif
  26379. "stm %[r]!, {r3, r4}\n\t"
  26380. "ldm %[b]!, {r5, r6}\n\t"
  26381. "ldm %[a]!, {r3, r4}\n\t"
  26382. #ifdef WOLFSSL_KEIL
  26383. "sbcs r3, r3, r5\n\t"
  26384. #elif defined(__clang__)
  26385. "sbcs r3, r5\n\t"
  26386. #else
  26387. "sbc r3, r5\n\t"
  26388. #endif
  26389. #ifdef WOLFSSL_KEIL
  26390. "sbcs r4, r4, r6\n\t"
  26391. #elif defined(__clang__)
  26392. "sbcs r4, r6\n\t"
  26393. #else
  26394. "sbc r4, r6\n\t"
  26395. #endif
  26396. "stm %[r]!, {r3, r4}\n\t"
  26397. "ldm %[b]!, {r5, r6}\n\t"
  26398. "ldm %[a]!, {r3, r4}\n\t"
  26399. #ifdef WOLFSSL_KEIL
  26400. "sbcs r3, r3, r5\n\t"
  26401. #elif defined(__clang__)
  26402. "sbcs r3, r5\n\t"
  26403. #else
  26404. "sbc r3, r5\n\t"
  26405. #endif
  26406. #ifdef WOLFSSL_KEIL
  26407. "sbcs r4, r4, r6\n\t"
  26408. #elif defined(__clang__)
  26409. "sbcs r4, r6\n\t"
  26410. #else
  26411. "sbc r4, r6\n\t"
  26412. #endif
  26413. "stm %[r]!, {r3, r4}\n\t"
  26414. "ldm %[b]!, {r5, r6}\n\t"
  26415. "ldm %[a]!, {r3, r4}\n\t"
  26416. #ifdef WOLFSSL_KEIL
  26417. "sbcs r3, r3, r5\n\t"
  26418. #elif defined(__clang__)
  26419. "sbcs r3, r5\n\t"
  26420. #else
  26421. "sbc r3, r5\n\t"
  26422. #endif
  26423. #ifdef WOLFSSL_KEIL
  26424. "sbcs r4, r4, r6\n\t"
  26425. #elif defined(__clang__)
  26426. "sbcs r4, r6\n\t"
  26427. #else
  26428. "sbc r4, r6\n\t"
  26429. #endif
  26430. "stm %[r]!, {r3, r4}\n\t"
  26431. "ldm %[b]!, {r5, r6}\n\t"
  26432. "ldm %[a]!, {r3, r4}\n\t"
  26433. #ifdef WOLFSSL_KEIL
  26434. "sbcs r3, r3, r5\n\t"
  26435. #elif defined(__clang__)
  26436. "sbcs r3, r5\n\t"
  26437. #else
  26438. "sbc r3, r5\n\t"
  26439. #endif
  26440. #ifdef WOLFSSL_KEIL
  26441. "sbcs r4, r4, r6\n\t"
  26442. #elif defined(__clang__)
  26443. "sbcs r4, r6\n\t"
  26444. #else
  26445. "sbc r4, r6\n\t"
  26446. #endif
  26447. "stm %[r]!, {r3, r4}\n\t"
  26448. "ldm %[b]!, {r5, r6}\n\t"
  26449. "ldm %[a]!, {r3, r4}\n\t"
  26450. #ifdef WOLFSSL_KEIL
  26451. "sbcs r3, r3, r5\n\t"
  26452. #elif defined(__clang__)
  26453. "sbcs r3, r5\n\t"
  26454. #else
  26455. "sbc r3, r5\n\t"
  26456. #endif
  26457. #ifdef WOLFSSL_KEIL
  26458. "sbcs r4, r4, r6\n\t"
  26459. #elif defined(__clang__)
  26460. "sbcs r4, r6\n\t"
  26461. #else
  26462. "sbc r4, r6\n\t"
  26463. #endif
  26464. "stm %[r]!, {r3, r4}\n\t"
  26465. "ldm %[b]!, {r5, r6}\n\t"
  26466. "ldm %[a]!, {r3, r4}\n\t"
  26467. #ifdef WOLFSSL_KEIL
  26468. "sbcs r3, r3, r5\n\t"
  26469. #elif defined(__clang__)
  26470. "sbcs r3, r5\n\t"
  26471. #else
  26472. "sbc r3, r5\n\t"
  26473. #endif
  26474. #ifdef WOLFSSL_KEIL
  26475. "sbcs r4, r4, r6\n\t"
  26476. #elif defined(__clang__)
  26477. "sbcs r4, r6\n\t"
  26478. #else
  26479. "sbc r4, r6\n\t"
  26480. #endif
  26481. "stm %[r]!, {r3, r4}\n\t"
  26482. "ldm %[b]!, {r5, r6}\n\t"
  26483. "ldm %[a]!, {r3, r4}\n\t"
  26484. #ifdef WOLFSSL_KEIL
  26485. "sbcs r3, r3, r5\n\t"
  26486. #elif defined(__clang__)
  26487. "sbcs r3, r5\n\t"
  26488. #else
  26489. "sbc r3, r5\n\t"
  26490. #endif
  26491. #ifdef WOLFSSL_KEIL
  26492. "sbcs r4, r4, r6\n\t"
  26493. #elif defined(__clang__)
  26494. "sbcs r4, r6\n\t"
  26495. #else
  26496. "sbc r4, r6\n\t"
  26497. #endif
  26498. "stm %[r]!, {r3, r4}\n\t"
  26499. "ldm %[b]!, {r5, r6}\n\t"
  26500. "ldm %[a]!, {r3, r4}\n\t"
  26501. #ifdef WOLFSSL_KEIL
  26502. "sbcs r3, r3, r5\n\t"
  26503. #elif defined(__clang__)
  26504. "sbcs r3, r5\n\t"
  26505. #else
  26506. "sbc r3, r5\n\t"
  26507. #endif
  26508. #ifdef WOLFSSL_KEIL
  26509. "sbcs r4, r4, r6\n\t"
  26510. #elif defined(__clang__)
  26511. "sbcs r4, r6\n\t"
  26512. #else
  26513. "sbc r4, r6\n\t"
  26514. #endif
  26515. "stm %[r]!, {r3, r4}\n\t"
  26516. #ifdef WOLFSSL_KEIL
  26517. "sbcs %[r], %[r], %[r]\n\t"
  26518. #elif defined(__clang__)
  26519. "sbcs %[r], %[r]\n\t"
  26520. #else
  26521. "sbc %[r], %[r]\n\t"
  26522. #endif
  26523. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  26524. :
  26525. : "memory", "r3", "r4", "r5", "r6"
  26526. );
  26527. return (uint32_t)(size_t)r;
  26528. }
  26529. #endif /* WOLFSSL_SP_SMALL */
  26530. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  26531. *
  26532. * d1 The high order half of the number to divide.
  26533. * d0 The low order half of the number to divide.
  26534. * div The divisor.
  26535. * returns the result of the division.
  26536. *
  26537. * Note that this is an approximate div. It may give an answer 1 larger.
  26538. */
  26539. SP_NOINLINE static sp_digit div_2048_word_64(sp_digit d1, sp_digit d0,
  26540. sp_digit div)
  26541. {
  26542. __asm__ __volatile__ (
  26543. "movs r3, #0\n\t"
  26544. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26545. "lsrs r5, %[div], #1\n\t"
  26546. #else
  26547. "lsr r5, %[div], #1\n\t"
  26548. #endif
  26549. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26550. "adds r5, r5, #1\n\t"
  26551. #else
  26552. "add r5, r5, #1\n\t"
  26553. #endif
  26554. "mov r8, %[d0]\n\t"
  26555. "mov r9, %[d1]\n\t"
  26556. "# Do top 32\n\t"
  26557. "movs r6, r5\n\t"
  26558. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26559. "subs r6, r6, %[d1]\n\t"
  26560. #else
  26561. "sub r6, r6, %[d1]\n\t"
  26562. #endif
  26563. #ifdef WOLFSSL_KEIL
  26564. "sbcs r6, r6, r6\n\t"
  26565. #elif defined(__clang__)
  26566. "sbcs r6, r6\n\t"
  26567. #else
  26568. "sbc r6, r6\n\t"
  26569. #endif
  26570. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26571. "adds r3, r3, r3\n\t"
  26572. #else
  26573. "add r3, r3, r3\n\t"
  26574. #endif
  26575. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26576. "subs r3, r3, r6\n\t"
  26577. #else
  26578. "sub r3, r3, r6\n\t"
  26579. #endif
  26580. #ifdef WOLFSSL_KEIL
  26581. "ands r6, r6, r5\n\t"
  26582. #elif defined(__clang__)
  26583. "ands r6, r5\n\t"
  26584. #else
  26585. "and r6, r5\n\t"
  26586. #endif
  26587. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26588. "subs %[d1], %[d1], r6\n\t"
  26589. #else
  26590. "sub %[d1], %[d1], r6\n\t"
  26591. #endif
  26592. "movs r4, #29\n\t"
  26593. "\n"
  26594. "L_div_2048_word_64_loop_%=:\n\t"
  26595. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26596. "lsls %[d0], %[d0], #1\n\t"
  26597. #else
  26598. "lsl %[d0], %[d0], #1\n\t"
  26599. #endif
  26600. #ifdef WOLFSSL_KEIL
  26601. "adcs %[d1], %[d1], %[d1]\n\t"
  26602. #elif defined(__clang__)
  26603. "adcs %[d1], %[d1]\n\t"
  26604. #else
  26605. "adc %[d1], %[d1]\n\t"
  26606. #endif
  26607. "movs r6, r5\n\t"
  26608. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26609. "subs r6, r6, %[d1]\n\t"
  26610. #else
  26611. "sub r6, r6, %[d1]\n\t"
  26612. #endif
  26613. #ifdef WOLFSSL_KEIL
  26614. "sbcs r6, r6, r6\n\t"
  26615. #elif defined(__clang__)
  26616. "sbcs r6, r6\n\t"
  26617. #else
  26618. "sbc r6, r6\n\t"
  26619. #endif
  26620. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26621. "adds r3, r3, r3\n\t"
  26622. #else
  26623. "add r3, r3, r3\n\t"
  26624. #endif
  26625. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26626. "subs r3, r3, r6\n\t"
  26627. #else
  26628. "sub r3, r3, r6\n\t"
  26629. #endif
  26630. #ifdef WOLFSSL_KEIL
  26631. "ands r6, r6, r5\n\t"
  26632. #elif defined(__clang__)
  26633. "ands r6, r5\n\t"
  26634. #else
  26635. "and r6, r5\n\t"
  26636. #endif
  26637. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26638. "subs %[d1], %[d1], r6\n\t"
  26639. #else
  26640. "sub %[d1], %[d1], r6\n\t"
  26641. #endif
  26642. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26643. "subs r4, r4, #1\n\t"
  26644. #else
  26645. "sub r4, r4, #1\n\t"
  26646. #endif
  26647. "bpl L_div_2048_word_64_loop_%=\n\t"
  26648. "movs r7, #0\n\t"
  26649. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26650. "adds r3, r3, r3\n\t"
  26651. #else
  26652. "add r3, r3, r3\n\t"
  26653. #endif
  26654. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26655. "adds r3, r3, #1\n\t"
  26656. #else
  26657. "add r3, r3, #1\n\t"
  26658. #endif
  26659. "# r * div - Start\n\t"
  26660. "uxth %[d1], r3\n\t"
  26661. "uxth r4, %[div]\n\t"
  26662. #ifdef WOLFSSL_KEIL
  26663. "muls r4, %[d1], r4\n\t"
  26664. #elif defined(__clang__)
  26665. "muls r4, %[d1]\n\t"
  26666. #else
  26667. "mul r4, %[d1]\n\t"
  26668. #endif
  26669. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26670. "lsrs r6, %[div], #16\n\t"
  26671. #else
  26672. "lsr r6, %[div], #16\n\t"
  26673. #endif
  26674. #ifdef WOLFSSL_KEIL
  26675. "muls %[d1], r6, %[d1]\n\t"
  26676. #elif defined(__clang__)
  26677. "muls %[d1], r6\n\t"
  26678. #else
  26679. "mul %[d1], r6\n\t"
  26680. #endif
  26681. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26682. "lsrs r5, %[d1], #16\n\t"
  26683. #else
  26684. "lsr r5, %[d1], #16\n\t"
  26685. #endif
  26686. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26687. "lsls %[d1], %[d1], #16\n\t"
  26688. #else
  26689. "lsl %[d1], %[d1], #16\n\t"
  26690. #endif
  26691. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26692. "adds r4, r4, %[d1]\n\t"
  26693. #else
  26694. "add r4, r4, %[d1]\n\t"
  26695. #endif
  26696. #ifdef WOLFSSL_KEIL
  26697. "adcs r5, r5, r7\n\t"
  26698. #elif defined(__clang__)
  26699. "adcs r5, r7\n\t"
  26700. #else
  26701. "adc r5, r7\n\t"
  26702. #endif
  26703. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26704. "lsrs %[d1], r3, #16\n\t"
  26705. #else
  26706. "lsr %[d1], r3, #16\n\t"
  26707. #endif
  26708. #ifdef WOLFSSL_KEIL
  26709. "muls r6, %[d1], r6\n\t"
  26710. #elif defined(__clang__)
  26711. "muls r6, %[d1]\n\t"
  26712. #else
  26713. "mul r6, %[d1]\n\t"
  26714. #endif
  26715. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26716. "adds r5, r5, r6\n\t"
  26717. #else
  26718. "add r5, r5, r6\n\t"
  26719. #endif
  26720. "uxth r6, %[div]\n\t"
  26721. #ifdef WOLFSSL_KEIL
  26722. "muls %[d1], r6, %[d1]\n\t"
  26723. #elif defined(__clang__)
  26724. "muls %[d1], r6\n\t"
  26725. #else
  26726. "mul %[d1], r6\n\t"
  26727. #endif
  26728. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26729. "lsrs r6, %[d1], #16\n\t"
  26730. #else
  26731. "lsr r6, %[d1], #16\n\t"
  26732. #endif
  26733. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26734. "lsls %[d1], %[d1], #16\n\t"
  26735. #else
  26736. "lsl %[d1], %[d1], #16\n\t"
  26737. #endif
  26738. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26739. "adds r4, r4, %[d1]\n\t"
  26740. #else
  26741. "add r4, r4, %[d1]\n\t"
  26742. #endif
  26743. #ifdef WOLFSSL_KEIL
  26744. "adcs r5, r5, r6\n\t"
  26745. #elif defined(__clang__)
  26746. "adcs r5, r6\n\t"
  26747. #else
  26748. "adc r5, r6\n\t"
  26749. #endif
  26750. "# r * div - Done\n\t"
  26751. "mov %[d1], r8\n\t"
  26752. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26753. "subs %[d1], %[d1], r4\n\t"
  26754. #else
  26755. "sub %[d1], %[d1], r4\n\t"
  26756. #endif
  26757. "movs r4, %[d1]\n\t"
  26758. "mov %[d1], r9\n\t"
  26759. #ifdef WOLFSSL_KEIL
  26760. "sbcs %[d1], %[d1], r5\n\t"
  26761. #elif defined(__clang__)
  26762. "sbcs %[d1], r5\n\t"
  26763. #else
  26764. "sbc %[d1], r5\n\t"
  26765. #endif
  26766. "movs r5, %[d1]\n\t"
  26767. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26768. "adds r3, r3, r5\n\t"
  26769. #else
  26770. "add r3, r3, r5\n\t"
  26771. #endif
  26772. "# r * div - Start\n\t"
  26773. "uxth %[d1], r3\n\t"
  26774. "uxth r4, %[div]\n\t"
  26775. #ifdef WOLFSSL_KEIL
  26776. "muls r4, %[d1], r4\n\t"
  26777. #elif defined(__clang__)
  26778. "muls r4, %[d1]\n\t"
  26779. #else
  26780. "mul r4, %[d1]\n\t"
  26781. #endif
  26782. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26783. "lsrs r6, %[div], #16\n\t"
  26784. #else
  26785. "lsr r6, %[div], #16\n\t"
  26786. #endif
  26787. #ifdef WOLFSSL_KEIL
  26788. "muls %[d1], r6, %[d1]\n\t"
  26789. #elif defined(__clang__)
  26790. "muls %[d1], r6\n\t"
  26791. #else
  26792. "mul %[d1], r6\n\t"
  26793. #endif
  26794. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26795. "lsrs r5, %[d1], #16\n\t"
  26796. #else
  26797. "lsr r5, %[d1], #16\n\t"
  26798. #endif
  26799. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26800. "lsls %[d1], %[d1], #16\n\t"
  26801. #else
  26802. "lsl %[d1], %[d1], #16\n\t"
  26803. #endif
  26804. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26805. "adds r4, r4, %[d1]\n\t"
  26806. #else
  26807. "add r4, r4, %[d1]\n\t"
  26808. #endif
  26809. #ifdef WOLFSSL_KEIL
  26810. "adcs r5, r5, r7\n\t"
  26811. #elif defined(__clang__)
  26812. "adcs r5, r7\n\t"
  26813. #else
  26814. "adc r5, r7\n\t"
  26815. #endif
  26816. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26817. "lsrs %[d1], r3, #16\n\t"
  26818. #else
  26819. "lsr %[d1], r3, #16\n\t"
  26820. #endif
  26821. #ifdef WOLFSSL_KEIL
  26822. "muls r6, %[d1], r6\n\t"
  26823. #elif defined(__clang__)
  26824. "muls r6, %[d1]\n\t"
  26825. #else
  26826. "mul r6, %[d1]\n\t"
  26827. #endif
  26828. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26829. "adds r5, r5, r6\n\t"
  26830. #else
  26831. "add r5, r5, r6\n\t"
  26832. #endif
  26833. "uxth r6, %[div]\n\t"
  26834. #ifdef WOLFSSL_KEIL
  26835. "muls %[d1], r6, %[d1]\n\t"
  26836. #elif defined(__clang__)
  26837. "muls %[d1], r6\n\t"
  26838. #else
  26839. "mul %[d1], r6\n\t"
  26840. #endif
  26841. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26842. "lsrs r6, %[d1], #16\n\t"
  26843. #else
  26844. "lsr r6, %[d1], #16\n\t"
  26845. #endif
  26846. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26847. "lsls %[d1], %[d1], #16\n\t"
  26848. #else
  26849. "lsl %[d1], %[d1], #16\n\t"
  26850. #endif
  26851. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26852. "adds r4, r4, %[d1]\n\t"
  26853. #else
  26854. "add r4, r4, %[d1]\n\t"
  26855. #endif
  26856. #ifdef WOLFSSL_KEIL
  26857. "adcs r5, r5, r6\n\t"
  26858. #elif defined(__clang__)
  26859. "adcs r5, r6\n\t"
  26860. #else
  26861. "adc r5, r6\n\t"
  26862. #endif
  26863. "# r * div - Done\n\t"
  26864. "mov %[d1], r8\n\t"
  26865. "mov r6, r9\n\t"
  26866. #ifdef WOLFSSL_KEIL
  26867. "subs r4, %[d1], r4\n\t"
  26868. #else
  26869. #ifdef __clang__
  26870. "subs r4, %[d1], r4\n\t"
  26871. #else
  26872. "sub r4, %[d1], r4\n\t"
  26873. #endif
  26874. #endif
  26875. #ifdef WOLFSSL_KEIL
  26876. "sbcs r6, r6, r5\n\t"
  26877. #elif defined(__clang__)
  26878. "sbcs r6, r5\n\t"
  26879. #else
  26880. "sbc r6, r5\n\t"
  26881. #endif
  26882. "movs r5, r6\n\t"
  26883. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26884. "adds r3, r3, r5\n\t"
  26885. #else
  26886. "add r3, r3, r5\n\t"
  26887. #endif
  26888. "# r * div - Start\n\t"
  26889. "uxth %[d1], r3\n\t"
  26890. "uxth r4, %[div]\n\t"
  26891. #ifdef WOLFSSL_KEIL
  26892. "muls r4, %[d1], r4\n\t"
  26893. #elif defined(__clang__)
  26894. "muls r4, %[d1]\n\t"
  26895. #else
  26896. "mul r4, %[d1]\n\t"
  26897. #endif
  26898. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26899. "lsrs r6, %[div], #16\n\t"
  26900. #else
  26901. "lsr r6, %[div], #16\n\t"
  26902. #endif
  26903. #ifdef WOLFSSL_KEIL
  26904. "muls %[d1], r6, %[d1]\n\t"
  26905. #elif defined(__clang__)
  26906. "muls %[d1], r6\n\t"
  26907. #else
  26908. "mul %[d1], r6\n\t"
  26909. #endif
  26910. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26911. "lsrs r5, %[d1], #16\n\t"
  26912. #else
  26913. "lsr r5, %[d1], #16\n\t"
  26914. #endif
  26915. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26916. "lsls %[d1], %[d1], #16\n\t"
  26917. #else
  26918. "lsl %[d1], %[d1], #16\n\t"
  26919. #endif
  26920. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26921. "adds r4, r4, %[d1]\n\t"
  26922. #else
  26923. "add r4, r4, %[d1]\n\t"
  26924. #endif
  26925. #ifdef WOLFSSL_KEIL
  26926. "adcs r5, r5, r7\n\t"
  26927. #elif defined(__clang__)
  26928. "adcs r5, r7\n\t"
  26929. #else
  26930. "adc r5, r7\n\t"
  26931. #endif
  26932. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26933. "lsrs %[d1], r3, #16\n\t"
  26934. #else
  26935. "lsr %[d1], r3, #16\n\t"
  26936. #endif
  26937. #ifdef WOLFSSL_KEIL
  26938. "muls r6, %[d1], r6\n\t"
  26939. #elif defined(__clang__)
  26940. "muls r6, %[d1]\n\t"
  26941. #else
  26942. "mul r6, %[d1]\n\t"
  26943. #endif
  26944. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26945. "adds r5, r5, r6\n\t"
  26946. #else
  26947. "add r5, r5, r6\n\t"
  26948. #endif
  26949. "uxth r6, %[div]\n\t"
  26950. #ifdef WOLFSSL_KEIL
  26951. "muls %[d1], r6, %[d1]\n\t"
  26952. #elif defined(__clang__)
  26953. "muls %[d1], r6\n\t"
  26954. #else
  26955. "mul %[d1], r6\n\t"
  26956. #endif
  26957. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26958. "lsrs r6, %[d1], #16\n\t"
  26959. #else
  26960. "lsr r6, %[d1], #16\n\t"
  26961. #endif
  26962. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26963. "lsls %[d1], %[d1], #16\n\t"
  26964. #else
  26965. "lsl %[d1], %[d1], #16\n\t"
  26966. #endif
  26967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26968. "adds r4, r4, %[d1]\n\t"
  26969. #else
  26970. "add r4, r4, %[d1]\n\t"
  26971. #endif
  26972. #ifdef WOLFSSL_KEIL
  26973. "adcs r5, r5, r6\n\t"
  26974. #elif defined(__clang__)
  26975. "adcs r5, r6\n\t"
  26976. #else
  26977. "adc r5, r6\n\t"
  26978. #endif
  26979. "# r * div - Done\n\t"
  26980. "mov %[d1], r8\n\t"
  26981. "mov r6, r9\n\t"
  26982. #ifdef WOLFSSL_KEIL
  26983. "subs r4, %[d1], r4\n\t"
  26984. #else
  26985. #ifdef __clang__
  26986. "subs r4, %[d1], r4\n\t"
  26987. #else
  26988. "sub r4, %[d1], r4\n\t"
  26989. #endif
  26990. #endif
  26991. #ifdef WOLFSSL_KEIL
  26992. "sbcs r6, r6, r5\n\t"
  26993. #elif defined(__clang__)
  26994. "sbcs r6, r5\n\t"
  26995. #else
  26996. "sbc r6, r5\n\t"
  26997. #endif
  26998. "movs r5, r6\n\t"
  26999. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27000. "adds r3, r3, r5\n\t"
  27001. #else
  27002. "add r3, r3, r5\n\t"
  27003. #endif
  27004. "# r * div - Start\n\t"
  27005. "uxth %[d1], r3\n\t"
  27006. "uxth r4, %[div]\n\t"
  27007. #ifdef WOLFSSL_KEIL
  27008. "muls r4, %[d1], r4\n\t"
  27009. #elif defined(__clang__)
  27010. "muls r4, %[d1]\n\t"
  27011. #else
  27012. "mul r4, %[d1]\n\t"
  27013. #endif
  27014. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27015. "lsrs r6, %[div], #16\n\t"
  27016. #else
  27017. "lsr r6, %[div], #16\n\t"
  27018. #endif
  27019. #ifdef WOLFSSL_KEIL
  27020. "muls %[d1], r6, %[d1]\n\t"
  27021. #elif defined(__clang__)
  27022. "muls %[d1], r6\n\t"
  27023. #else
  27024. "mul %[d1], r6\n\t"
  27025. #endif
  27026. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27027. "lsrs r5, %[d1], #16\n\t"
  27028. #else
  27029. "lsr r5, %[d1], #16\n\t"
  27030. #endif
  27031. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27032. "lsls %[d1], %[d1], #16\n\t"
  27033. #else
  27034. "lsl %[d1], %[d1], #16\n\t"
  27035. #endif
  27036. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27037. "adds r4, r4, %[d1]\n\t"
  27038. #else
  27039. "add r4, r4, %[d1]\n\t"
  27040. #endif
  27041. #ifdef WOLFSSL_KEIL
  27042. "adcs r5, r5, r7\n\t"
  27043. #elif defined(__clang__)
  27044. "adcs r5, r7\n\t"
  27045. #else
  27046. "adc r5, r7\n\t"
  27047. #endif
  27048. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27049. "lsrs %[d1], r3, #16\n\t"
  27050. #else
  27051. "lsr %[d1], r3, #16\n\t"
  27052. #endif
  27053. #ifdef WOLFSSL_KEIL
  27054. "muls r6, %[d1], r6\n\t"
  27055. #elif defined(__clang__)
  27056. "muls r6, %[d1]\n\t"
  27057. #else
  27058. "mul r6, %[d1]\n\t"
  27059. #endif
  27060. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27061. "adds r5, r5, r6\n\t"
  27062. #else
  27063. "add r5, r5, r6\n\t"
  27064. #endif
  27065. "uxth r6, %[div]\n\t"
  27066. #ifdef WOLFSSL_KEIL
  27067. "muls %[d1], r6, %[d1]\n\t"
  27068. #elif defined(__clang__)
  27069. "muls %[d1], r6\n\t"
  27070. #else
  27071. "mul %[d1], r6\n\t"
  27072. #endif
  27073. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27074. "lsrs r6, %[d1], #16\n\t"
  27075. #else
  27076. "lsr r6, %[d1], #16\n\t"
  27077. #endif
  27078. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27079. "lsls %[d1], %[d1], #16\n\t"
  27080. #else
  27081. "lsl %[d1], %[d1], #16\n\t"
  27082. #endif
  27083. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27084. "adds r4, r4, %[d1]\n\t"
  27085. #else
  27086. "add r4, r4, %[d1]\n\t"
  27087. #endif
  27088. #ifdef WOLFSSL_KEIL
  27089. "adcs r5, r5, r6\n\t"
  27090. #elif defined(__clang__)
  27091. "adcs r5, r6\n\t"
  27092. #else
  27093. "adc r5, r6\n\t"
  27094. #endif
  27095. "# r * div - Done\n\t"
  27096. "mov %[d1], r8\n\t"
  27097. "mov r6, r9\n\t"
  27098. #ifdef WOLFSSL_KEIL
  27099. "subs r4, %[d1], r4\n\t"
  27100. #else
  27101. #ifdef __clang__
  27102. "subs r4, %[d1], r4\n\t"
  27103. #else
  27104. "sub r4, %[d1], r4\n\t"
  27105. #endif
  27106. #endif
  27107. #ifdef WOLFSSL_KEIL
  27108. "sbcs r6, r6, r5\n\t"
  27109. #elif defined(__clang__)
  27110. "sbcs r6, r5\n\t"
  27111. #else
  27112. "sbc r6, r5\n\t"
  27113. #endif
  27114. "movs r5, r6\n\t"
  27115. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27116. "adds r3, r3, r5\n\t"
  27117. #else
  27118. "add r3, r3, r5\n\t"
  27119. #endif
  27120. "movs r6, %[div]\n\t"
  27121. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27122. "subs r6, r6, r4\n\t"
  27123. #else
  27124. "sub r6, r6, r4\n\t"
  27125. #endif
  27126. #ifdef WOLFSSL_KEIL
  27127. "sbcs r6, r6, r6\n\t"
  27128. #elif defined(__clang__)
  27129. "sbcs r6, r6\n\t"
  27130. #else
  27131. "sbc r6, r6\n\t"
  27132. #endif
  27133. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27134. "subs r3, r3, r6\n\t"
  27135. #else
  27136. "sub r3, r3, r6\n\t"
  27137. #endif
  27138. "movs %[d1], r3\n\t"
  27139. : [d1] "+l" (d1), [d0] "+l" (d0), [div] "+l" (div)
  27140. :
  27141. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  27142. );
  27143. return (uint32_t)(size_t)d1;
  27144. }
  27145. /* Divide d in a and put remainder into r (m*d + r = a)
  27146. * m is not calculated as it is not needed at this time.
  27147. *
  27148. * a Number to be divided.
  27149. * d Number to divide with.
  27150. * m Multiplier result.
  27151. * r Remainder from the division.
  27152. * returns MP_OKAY indicating success.
  27153. */
  27154. static WC_INLINE int sp_2048_div_64_cond(const sp_digit* a, const sp_digit* d, sp_digit* m,
  27155. sp_digit* r)
  27156. {
  27157. sp_digit t1[128], t2[65];
  27158. sp_digit div, r1;
  27159. int i;
  27160. (void)m;
  27161. div = d[63];
  27162. XMEMCPY(t1, a, sizeof(*t1) * 2 * 64);
  27163. for (i = 63; i > 0; i--) {
  27164. if (t1[i + 64] != d[i])
  27165. break;
  27166. }
  27167. if (t1[i + 64] >= d[i]) {
  27168. sp_2048_sub_in_place_64(&t1[64], d);
  27169. }
  27170. for (i = 63; i >= 0; i--) {
  27171. if (t1[64 + i] == div) {
  27172. r1 = SP_DIGIT_MAX;
  27173. }
  27174. else {
  27175. r1 = div_2048_word_64(t1[64 + i], t1[64 + i - 1], div);
  27176. }
  27177. sp_2048_mul_d_64(t2, d, r1);
  27178. t1[64 + i] += sp_2048_sub_in_place_64(&t1[i], t2);
  27179. t1[64 + i] -= t2[64];
  27180. if (t1[64 + i] != 0) {
  27181. t1[64 + i] += sp_2048_add_64(&t1[i], &t1[i], d);
  27182. if (t1[64 + i] != 0)
  27183. t1[64 + i] += sp_2048_add_64(&t1[i], &t1[i], d);
  27184. }
  27185. }
  27186. for (i = 63; i > 0; i--) {
  27187. if (t1[i] != d[i])
  27188. break;
  27189. }
  27190. if (t1[i] >= d[i]) {
  27191. sp_2048_sub_64(r, t1, d);
  27192. }
  27193. else {
  27194. XMEMCPY(r, t1, sizeof(*t1) * 64);
  27195. }
  27196. return MP_OKAY;
  27197. }
  27198. /* Reduce a modulo m into r. (r = a mod m)
  27199. *
  27200. * r A single precision number that is the reduced result.
  27201. * a A single precision number that is to be reduced.
  27202. * m A single precision number that is the modulus to reduce with.
  27203. * returns MP_OKAY indicating success.
  27204. */
  27205. static WC_INLINE int sp_2048_mod_64_cond(sp_digit* r, const sp_digit* a, const sp_digit* m)
  27206. {
  27207. int ret;
  27208. ret = sp_2048_div_64_cond(a, m, NULL, r);
  27209. return ret;
  27210. }
  27211. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  27212. /* AND m into each word of a and store in r.
  27213. *
  27214. * r A single precision integer.
  27215. * a A single precision integer.
  27216. * m Mask to AND against each digit.
  27217. */
  27218. static void sp_2048_mask_64(sp_digit* r, const sp_digit* a, sp_digit m)
  27219. {
  27220. #ifdef WOLFSSL_SP_SMALL
  27221. int i;
  27222. for (i=0; i<64; i++) {
  27223. r[i] = a[i] & m;
  27224. }
  27225. #else
  27226. int i;
  27227. for (i = 0; i < 64; i += 8) {
  27228. r[i+0] = a[i+0] & m;
  27229. r[i+1] = a[i+1] & m;
  27230. r[i+2] = a[i+2] & m;
  27231. r[i+3] = a[i+3] & m;
  27232. r[i+4] = a[i+4] & m;
  27233. r[i+5] = a[i+5] & m;
  27234. r[i+6] = a[i+6] & m;
  27235. r[i+7] = a[i+7] & m;
  27236. }
  27237. #endif
  27238. }
  27239. /* Compare a with b in constant time.
  27240. *
  27241. * a A single precision integer.
  27242. * b A single precision integer.
  27243. * return -ve, 0 or +ve if a is less than, equal to or greater than b
  27244. * respectively.
  27245. */
  27246. SP_NOINLINE static sp_int32 sp_2048_cmp_64(const sp_digit* a, const sp_digit* b)
  27247. {
  27248. __asm__ __volatile__ (
  27249. "movs r2, #0\n\t"
  27250. "movs r3, #0\n\t"
  27251. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27252. "mvns r3, r3\n\t"
  27253. #else
  27254. "mvn r3, r3\n\t"
  27255. #endif
  27256. "movs r6, #0xfc\n\t"
  27257. "\n"
  27258. "L_sp_2048_cmp_64_words_%=:\n\t"
  27259. "ldr r7, [%[a], r6]\n\t"
  27260. "ldr r5, [%[b], r6]\n\t"
  27261. #ifdef WOLFSSL_KEIL
  27262. "ands r7, r7, r3\n\t"
  27263. #elif defined(__clang__)
  27264. "ands r7, r3\n\t"
  27265. #else
  27266. "and r7, r3\n\t"
  27267. #endif
  27268. #ifdef WOLFSSL_KEIL
  27269. "ands r5, r5, r3\n\t"
  27270. #elif defined(__clang__)
  27271. "ands r5, r3\n\t"
  27272. #else
  27273. "and r5, r3\n\t"
  27274. #endif
  27275. "movs r4, r7\n\t"
  27276. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27277. "subs r7, r7, r5\n\t"
  27278. #else
  27279. "sub r7, r7, r5\n\t"
  27280. #endif
  27281. #ifdef WOLFSSL_KEIL
  27282. "sbcs r7, r7, r7\n\t"
  27283. #elif defined(__clang__)
  27284. "sbcs r7, r7\n\t"
  27285. #else
  27286. "sbc r7, r7\n\t"
  27287. #endif
  27288. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27289. "adds r2, r2, r7\n\t"
  27290. #else
  27291. "add r2, r2, r7\n\t"
  27292. #endif
  27293. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27294. "mvns r7, r7\n\t"
  27295. #else
  27296. "mvn r7, r7\n\t"
  27297. #endif
  27298. #ifdef WOLFSSL_KEIL
  27299. "ands r3, r3, r7\n\t"
  27300. #elif defined(__clang__)
  27301. "ands r3, r7\n\t"
  27302. #else
  27303. "and r3, r7\n\t"
  27304. #endif
  27305. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27306. "subs r5, r5, r4\n\t"
  27307. #else
  27308. "sub r5, r5, r4\n\t"
  27309. #endif
  27310. #ifdef WOLFSSL_KEIL
  27311. "sbcs r7, r7, r7\n\t"
  27312. #elif defined(__clang__)
  27313. "sbcs r7, r7\n\t"
  27314. #else
  27315. "sbc r7, r7\n\t"
  27316. #endif
  27317. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27318. "subs r2, r2, r7\n\t"
  27319. #else
  27320. "sub r2, r2, r7\n\t"
  27321. #endif
  27322. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27323. "mvns r7, r7\n\t"
  27324. #else
  27325. "mvn r7, r7\n\t"
  27326. #endif
  27327. #ifdef WOLFSSL_KEIL
  27328. "ands r3, r3, r7\n\t"
  27329. #elif defined(__clang__)
  27330. "ands r3, r7\n\t"
  27331. #else
  27332. "and r3, r7\n\t"
  27333. #endif
  27334. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27335. "subs r6, r6, #4\n\t"
  27336. #else
  27337. "sub r6, r6, #4\n\t"
  27338. #endif
  27339. "bge L_sp_2048_cmp_64_words_%=\n\t"
  27340. "movs %[a], r2\n\t"
  27341. : [a] "+l" (a), [b] "+l" (b)
  27342. :
  27343. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  27344. );
  27345. return (uint32_t)(size_t)a;
  27346. }
  27347. /* Divide d in a and put remainder into r (m*d + r = a)
  27348. * m is not calculated as it is not needed at this time.
  27349. *
  27350. * a Number to be divided.
  27351. * d Number to divide with.
  27352. * m Multiplier result.
  27353. * r Remainder from the division.
  27354. * returns MP_OKAY indicating success.
  27355. */
  27356. static WC_INLINE int sp_2048_div_64(const sp_digit* a, const sp_digit* d, sp_digit* m,
  27357. sp_digit* r)
  27358. {
  27359. sp_digit t1[128], t2[65];
  27360. sp_digit div, r1;
  27361. int i;
  27362. (void)m;
  27363. div = d[63];
  27364. XMEMCPY(t1, a, sizeof(*t1) * 2 * 64);
  27365. r1 = sp_2048_cmp_64(&t1[64], d) >= 0;
  27366. sp_2048_cond_sub_64(&t1[64], &t1[64], d, (sp_digit)0 - r1);
  27367. for (i = 63; i >= 0; i--) {
  27368. volatile sp_digit mask = (sp_digit)0 - (t1[64 + i] == div);
  27369. sp_digit hi = t1[64 + i] + mask;
  27370. r1 = div_2048_word_64(hi, t1[64 + i - 1], div);
  27371. r1 |= mask;
  27372. sp_2048_mul_d_64(t2, d, r1);
  27373. t1[64 + i] += sp_2048_sub_in_place_64(&t1[i], t2);
  27374. t1[64 + i] -= t2[64];
  27375. sp_2048_mask_64(t2, d, t1[64 + i]);
  27376. t1[64 + i] += sp_2048_add_64(&t1[i], &t1[i], t2);
  27377. sp_2048_mask_64(t2, d, t1[64 + i]);
  27378. t1[64 + i] += sp_2048_add_64(&t1[i], &t1[i], t2);
  27379. }
  27380. r1 = sp_2048_cmp_64(t1, d) >= 0;
  27381. sp_2048_cond_sub_64(r, t1, d, (sp_digit)0 - r1);
  27382. return MP_OKAY;
  27383. }
  27384. /* Reduce a modulo m into r. (r = a mod m)
  27385. *
  27386. * r A single precision number that is the reduced result.
  27387. * a A single precision number that is to be reduced.
  27388. * m A single precision number that is the modulus to reduce with.
  27389. * returns MP_OKAY indicating success.
  27390. */
  27391. static WC_INLINE int sp_2048_mod_64(sp_digit* r, const sp_digit* a, const sp_digit* m)
  27392. {
  27393. int ret;
  27394. ret = sp_2048_div_64(a, m, NULL, r);
  27395. return ret;
  27396. }
  27397. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || \
  27398. defined(WOLFSSL_HAVE_SP_DH)
  27399. #ifdef WOLFSSL_SP_SMALL
  27400. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  27401. *
  27402. * r A single precision number that is the result of the operation.
  27403. * a A single precision number being exponentiated.
  27404. * e A single precision number that is the exponent.
  27405. * bits The number of bits in the exponent.
  27406. * m A single precision number that is the modulus.
  27407. * returns 0 on success.
  27408. * returns MEMORY_E on dynamic memory allocation failure.
  27409. * returns MP_VAL when base is even or exponent is 0.
  27410. */
  27411. static int sp_2048_mod_exp_64(sp_digit* r, const sp_digit* a, const sp_digit* e,
  27412. int bits, const sp_digit* m, int reduceA)
  27413. {
  27414. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  27415. sp_digit* td = NULL;
  27416. #else
  27417. sp_digit td[8 * 128];
  27418. #endif
  27419. sp_digit* t[8];
  27420. sp_digit* norm = NULL;
  27421. sp_digit mp = 1;
  27422. sp_digit n;
  27423. sp_digit mask;
  27424. int i;
  27425. int c;
  27426. byte y;
  27427. int err = MP_OKAY;
  27428. if (bits == 0) {
  27429. err = MP_VAL;
  27430. }
  27431. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  27432. if (err == MP_OKAY) {
  27433. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (8 * 128), NULL,
  27434. DYNAMIC_TYPE_TMP_BUFFER);
  27435. if (td == NULL)
  27436. err = MEMORY_E;
  27437. }
  27438. #endif
  27439. if (err == MP_OKAY) {
  27440. norm = td;
  27441. for (i=0; i<8; i++) {
  27442. t[i] = td + i * 128;
  27443. }
  27444. sp_2048_mont_setup(m, &mp);
  27445. sp_2048_mont_norm_64(norm, m);
  27446. XMEMSET(t[1], 0, sizeof(sp_digit) * 64U);
  27447. if (reduceA != 0) {
  27448. err = sp_2048_mod_64(t[1] + 64, a, m);
  27449. if (err == MP_OKAY) {
  27450. err = sp_2048_mod_64(t[1], t[1], m);
  27451. }
  27452. }
  27453. else {
  27454. XMEMCPY(t[1] + 64, a, sizeof(sp_digit) * 64);
  27455. err = sp_2048_mod_64(t[1], t[1], m);
  27456. }
  27457. }
  27458. if (err == MP_OKAY) {
  27459. sp_2048_mont_sqr_64(t[ 2], t[ 1], m, mp);
  27460. sp_2048_mont_mul_64(t[ 3], t[ 2], t[ 1], m, mp);
  27461. sp_2048_mont_sqr_64(t[ 4], t[ 2], m, mp);
  27462. sp_2048_mont_mul_64(t[ 5], t[ 3], t[ 2], m, mp);
  27463. sp_2048_mont_sqr_64(t[ 6], t[ 3], m, mp);
  27464. sp_2048_mont_mul_64(t[ 7], t[ 4], t[ 3], m, mp);
  27465. i = (bits - 1) / 32;
  27466. n = e[i--];
  27467. c = bits & 31;
  27468. if (c == 0) {
  27469. c = 32;
  27470. }
  27471. c -= bits % 3;
  27472. if (c == 32) {
  27473. c = 29;
  27474. }
  27475. if (c < 0) {
  27476. /* Number of bits in top word is less than number needed. */
  27477. c = -c;
  27478. y = (byte)(n << c);
  27479. n = e[i--];
  27480. y |= (byte)(n >> (64 - c));
  27481. n <<= c;
  27482. c = 64 - c;
  27483. }
  27484. else if (c == 0) {
  27485. /* All bits in top word used. */
  27486. y = (byte)n;
  27487. }
  27488. else {
  27489. y = (byte)(n >> c);
  27490. n <<= 32 - c;
  27491. }
  27492. XMEMCPY(r, t[y], sizeof(sp_digit) * 64);
  27493. for (; i>=0 || c>=3; ) {
  27494. if (c == 0) {
  27495. n = e[i--];
  27496. y = (byte)(n >> 29);
  27497. n <<= 3;
  27498. c = 29;
  27499. }
  27500. else if (c < 3) {
  27501. y = (byte)(n >> 29);
  27502. n = e[i--];
  27503. c = 3 - c;
  27504. y |= (byte)(n >> (32 - c));
  27505. n <<= c;
  27506. c = 32 - c;
  27507. }
  27508. else {
  27509. y = (byte)((n >> 29) & 0x7);
  27510. n <<= 3;
  27511. c -= 3;
  27512. }
  27513. sp_2048_mont_sqr_64(r, r, m, mp);
  27514. sp_2048_mont_sqr_64(r, r, m, mp);
  27515. sp_2048_mont_sqr_64(r, r, m, mp);
  27516. sp_2048_mont_mul_64(r, r, t[y], m, mp);
  27517. }
  27518. XMEMSET(&r[64], 0, sizeof(sp_digit) * 64U);
  27519. sp_2048_mont_reduce_64(r, m, mp);
  27520. mask = 0 - (sp_2048_cmp_64(r, m) >= 0);
  27521. sp_2048_cond_sub_64(r, r, m, mask);
  27522. }
  27523. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  27524. if (td != NULL)
  27525. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  27526. #endif
  27527. return err;
  27528. }
  27529. #else
  27530. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  27531. *
  27532. * r A single precision number that is the result of the operation.
  27533. * a A single precision number being exponentiated.
  27534. * e A single precision number that is the exponent.
  27535. * bits The number of bits in the exponent.
  27536. * m A single precision number that is the modulus.
  27537. * returns 0 on success.
  27538. * returns MEMORY_E on dynamic memory allocation failure.
  27539. * returns MP_VAL when base is even or exponent is 0.
  27540. */
  27541. static int sp_2048_mod_exp_64(sp_digit* r, const sp_digit* a, const sp_digit* e,
  27542. int bits, const sp_digit* m, int reduceA)
  27543. {
  27544. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  27545. sp_digit* td = NULL;
  27546. #else
  27547. sp_digit td[16 * 128];
  27548. #endif
  27549. sp_digit* t[16];
  27550. sp_digit* norm = NULL;
  27551. sp_digit mp = 1;
  27552. sp_digit n;
  27553. sp_digit mask;
  27554. int i;
  27555. int c;
  27556. byte y;
  27557. int err = MP_OKAY;
  27558. if (bits == 0) {
  27559. err = MP_VAL;
  27560. }
  27561. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  27562. if (err == MP_OKAY) {
  27563. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (16 * 128), NULL,
  27564. DYNAMIC_TYPE_TMP_BUFFER);
  27565. if (td == NULL)
  27566. err = MEMORY_E;
  27567. }
  27568. #endif
  27569. if (err == MP_OKAY) {
  27570. norm = td;
  27571. for (i=0; i<16; i++) {
  27572. t[i] = td + i * 128;
  27573. }
  27574. sp_2048_mont_setup(m, &mp);
  27575. sp_2048_mont_norm_64(norm, m);
  27576. XMEMSET(t[1], 0, sizeof(sp_digit) * 64U);
  27577. if (reduceA != 0) {
  27578. err = sp_2048_mod_64(t[1] + 64, a, m);
  27579. if (err == MP_OKAY) {
  27580. err = sp_2048_mod_64(t[1], t[1], m);
  27581. }
  27582. }
  27583. else {
  27584. XMEMCPY(t[1] + 64, a, sizeof(sp_digit) * 64);
  27585. err = sp_2048_mod_64(t[1], t[1], m);
  27586. }
  27587. }
  27588. if (err == MP_OKAY) {
  27589. sp_2048_mont_sqr_64(t[ 2], t[ 1], m, mp);
  27590. sp_2048_mont_mul_64(t[ 3], t[ 2], t[ 1], m, mp);
  27591. sp_2048_mont_sqr_64(t[ 4], t[ 2], m, mp);
  27592. sp_2048_mont_mul_64(t[ 5], t[ 3], t[ 2], m, mp);
  27593. sp_2048_mont_sqr_64(t[ 6], t[ 3], m, mp);
  27594. sp_2048_mont_mul_64(t[ 7], t[ 4], t[ 3], m, mp);
  27595. sp_2048_mont_sqr_64(t[ 8], t[ 4], m, mp);
  27596. sp_2048_mont_mul_64(t[ 9], t[ 5], t[ 4], m, mp);
  27597. sp_2048_mont_sqr_64(t[10], t[ 5], m, mp);
  27598. sp_2048_mont_mul_64(t[11], t[ 6], t[ 5], m, mp);
  27599. sp_2048_mont_sqr_64(t[12], t[ 6], m, mp);
  27600. sp_2048_mont_mul_64(t[13], t[ 7], t[ 6], m, mp);
  27601. sp_2048_mont_sqr_64(t[14], t[ 7], m, mp);
  27602. sp_2048_mont_mul_64(t[15], t[ 8], t[ 7], m, mp);
  27603. i = (bits - 1) / 32;
  27604. n = e[i--];
  27605. c = bits & 31;
  27606. if (c == 0) {
  27607. c = 32;
  27608. }
  27609. c -= bits % 4;
  27610. if (c == 32) {
  27611. c = 28;
  27612. }
  27613. if (c < 0) {
  27614. /* Number of bits in top word is less than number needed. */
  27615. c = -c;
  27616. y = (byte)(n << c);
  27617. n = e[i--];
  27618. y |= (byte)(n >> (64 - c));
  27619. n <<= c;
  27620. c = 64 - c;
  27621. }
  27622. else if (c == 0) {
  27623. /* All bits in top word used. */
  27624. y = (byte)n;
  27625. }
  27626. else {
  27627. y = (byte)(n >> c);
  27628. n <<= 32 - c;
  27629. }
  27630. XMEMCPY(r, t[y], sizeof(sp_digit) * 64);
  27631. for (; i>=0 || c>=4; ) {
  27632. if (c == 0) {
  27633. n = e[i--];
  27634. y = (byte)(n >> 28);
  27635. n <<= 4;
  27636. c = 28;
  27637. }
  27638. else if (c < 4) {
  27639. y = (byte)(n >> 28);
  27640. n = e[i--];
  27641. c = 4 - c;
  27642. y |= (byte)(n >> (32 - c));
  27643. n <<= c;
  27644. c = 32 - c;
  27645. }
  27646. else {
  27647. y = (byte)((n >> 28) & 0xf);
  27648. n <<= 4;
  27649. c -= 4;
  27650. }
  27651. sp_2048_mont_sqr_64(r, r, m, mp);
  27652. sp_2048_mont_sqr_64(r, r, m, mp);
  27653. sp_2048_mont_sqr_64(r, r, m, mp);
  27654. sp_2048_mont_sqr_64(r, r, m, mp);
  27655. sp_2048_mont_mul_64(r, r, t[y], m, mp);
  27656. }
  27657. XMEMSET(&r[64], 0, sizeof(sp_digit) * 64U);
  27658. sp_2048_mont_reduce_64(r, m, mp);
  27659. mask = 0 - (sp_2048_cmp_64(r, m) >= 0);
  27660. sp_2048_cond_sub_64(r, r, m, mask);
  27661. }
  27662. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  27663. if (td != NULL)
  27664. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  27665. #endif
  27666. return err;
  27667. }
  27668. #endif /* WOLFSSL_SP_SMALL */
  27669. #endif /* (WOLFSSL_HAVE_SP_RSA && !WOLFSSL_RSA_PUBLIC_ONLY) || WOLFSSL_HAVE_SP_DH */
  27670. #endif /* (WOLFSSL_HAVE_SP_RSA && !WOLFSSL_RSA_PUBLIC_ONLY) || WOLFSSL_HAVE_SP_DH */
  27671. #ifdef WOLFSSL_HAVE_SP_RSA
  27672. /* RSA public key operation.
  27673. *
  27674. * in Array of bytes representing the number to exponentiate, base.
  27675. * inLen Number of bytes in base.
  27676. * em Public exponent.
  27677. * mm Modulus.
  27678. * out Buffer to hold big-endian bytes of exponentiation result.
  27679. * Must be at least 256 bytes long.
  27680. * outLen Number of bytes in result.
  27681. * returns 0 on success, MP_TO_E when the outLen is too small, MP_READ_E when
  27682. * an array is too long and MEMORY_E when dynamic memory allocation fails.
  27683. */
  27684. int sp_RsaPublic_2048(const byte* in, word32 inLen, const mp_int* em,
  27685. const mp_int* mm, byte* out, word32* outLen)
  27686. {
  27687. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  27688. sp_digit* a = NULL;
  27689. #else
  27690. sp_digit a[64 * 5];
  27691. #endif
  27692. sp_digit* m = NULL;
  27693. sp_digit* r = NULL;
  27694. sp_digit *ah = NULL;
  27695. sp_digit e[1] = {0};
  27696. int err = MP_OKAY;
  27697. if (*outLen < 256) {
  27698. err = MP_TO_E;
  27699. }
  27700. else if (mp_count_bits(em) > 32 || inLen > 256 ||
  27701. mp_count_bits(mm) != 2048) {
  27702. err = MP_READ_E;
  27703. }
  27704. else if (mp_iseven(mm)) {
  27705. err = MP_VAL;
  27706. }
  27707. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  27708. if (err == MP_OKAY) {
  27709. a = (sp_digit*)XMALLOC(sizeof(sp_digit) * 64 * 5, NULL,
  27710. DYNAMIC_TYPE_RSA);
  27711. if (a == NULL)
  27712. err = MEMORY_E;
  27713. }
  27714. #endif
  27715. if (err == MP_OKAY) {
  27716. ah = a + 64;
  27717. r = a + 64 * 2;
  27718. m = r + 64 * 2;
  27719. sp_2048_from_bin(ah, 64, in, inLen);
  27720. #if DIGIT_BIT >= 32
  27721. e[0] = em->dp[0];
  27722. #else
  27723. e[0] = em->dp[0];
  27724. if (em->used > 1) {
  27725. e[0] |= ((sp_digit)em->dp[1]) << DIGIT_BIT;
  27726. }
  27727. #endif
  27728. if (e[0] == 0) {
  27729. err = MP_EXPTMOD_E;
  27730. }
  27731. }
  27732. if (err == MP_OKAY) {
  27733. sp_2048_from_mp(m, 64, mm);
  27734. if (e[0] == 0x10001) {
  27735. int i;
  27736. sp_digit mp;
  27737. sp_2048_mont_setup(m, &mp);
  27738. /* Convert to Montgomery form. */
  27739. XMEMSET(a, 0, sizeof(sp_digit) * 64);
  27740. err = sp_2048_mod_64_cond(r, a, m);
  27741. /* Montgomery form: r = a.R mod m */
  27742. if (err == MP_OKAY) {
  27743. /* r = a ^ 0x10000 => r = a squared 16 times */
  27744. for (i = 15; i >= 0; i--) {
  27745. sp_2048_mont_sqr_64(r, r, m, mp);
  27746. }
  27747. /* mont_red(r.R.R) = (r.R.R / R) mod m = r.R mod m
  27748. * mont_red(r.R * a) = (r.R.a / R) mod m = r.a mod m
  27749. */
  27750. sp_2048_mont_mul_64(r, r, ah, m, mp);
  27751. for (i = 63; i > 0; i--) {
  27752. if (r[i] != m[i]) {
  27753. break;
  27754. }
  27755. }
  27756. if (r[i] >= m[i]) {
  27757. sp_2048_sub_in_place_64(r, m);
  27758. }
  27759. }
  27760. }
  27761. else if (e[0] == 0x3) {
  27762. if (err == MP_OKAY) {
  27763. sp_2048_sqr_64(r, ah);
  27764. err = sp_2048_mod_64_cond(r, r, m);
  27765. }
  27766. if (err == MP_OKAY) {
  27767. sp_2048_mul_64(r, ah, r);
  27768. err = sp_2048_mod_64_cond(r, r, m);
  27769. }
  27770. }
  27771. else {
  27772. int i;
  27773. sp_digit mp;
  27774. sp_2048_mont_setup(m, &mp);
  27775. /* Convert to Montgomery form. */
  27776. XMEMSET(a, 0, sizeof(sp_digit) * 64);
  27777. err = sp_2048_mod_64_cond(a, a, m);
  27778. if (err == MP_OKAY) {
  27779. for (i = 31; i >= 0; i--) {
  27780. if (e[0] >> i) {
  27781. break;
  27782. }
  27783. }
  27784. XMEMCPY(r, a, sizeof(sp_digit) * 64);
  27785. for (i--; i >= 0; i--) {
  27786. sp_2048_mont_sqr_64(r, r, m, mp);
  27787. if (((e[0] >> i) & 1) == 1) {
  27788. sp_2048_mont_mul_64(r, r, a, m, mp);
  27789. }
  27790. }
  27791. XMEMSET(&r[64], 0, sizeof(sp_digit) * 64);
  27792. sp_2048_mont_reduce_64(r, m, mp);
  27793. for (i = 63; i > 0; i--) {
  27794. if (r[i] != m[i]) {
  27795. break;
  27796. }
  27797. }
  27798. if (r[i] >= m[i]) {
  27799. sp_2048_sub_in_place_64(r, m);
  27800. }
  27801. }
  27802. }
  27803. }
  27804. if (err == MP_OKAY) {
  27805. sp_2048_to_bin_64(r, out);
  27806. *outLen = 256;
  27807. }
  27808. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  27809. if (a != NULL)
  27810. XFREE(a, NULL, DYNAMIC_TYPE_RSA);
  27811. #endif
  27812. return err;
  27813. }
  27814. #ifndef WOLFSSL_RSA_PUBLIC_ONLY
  27815. /* Conditionally add a and b using the mask m.
  27816. * m is -1 to add and 0 when not.
  27817. *
  27818. * r A single precision number representing conditional add result.
  27819. * a A single precision number to add with.
  27820. * b A single precision number to add.
  27821. * m Mask value to apply.
  27822. */
  27823. SP_NOINLINE static sp_digit sp_2048_cond_add_32(sp_digit* r, const sp_digit* a,
  27824. const sp_digit* b, sp_digit m)
  27825. {
  27826. __asm__ __volatile__ (
  27827. "movs r4, #0\n\t"
  27828. "movs r5, #0x80\n\t"
  27829. "mov r8, r5\n\t"
  27830. "movs r7, #0\n\t"
  27831. "\n"
  27832. "L_sp_2048_cond_add_32_words_%=:\n\t"
  27833. "ldr r6, [%[b], r7]\n\t"
  27834. #ifdef WOLFSSL_KEIL
  27835. "ands r6, r6, %[m]\n\t"
  27836. #elif defined(__clang__)
  27837. "ands r6, %[m]\n\t"
  27838. #else
  27839. "and r6, %[m]\n\t"
  27840. #endif
  27841. "movs r5, #0\n\t"
  27842. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27843. "subs r5, r5, #1\n\t"
  27844. #else
  27845. "sub r5, r5, #1\n\t"
  27846. #endif
  27847. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27848. "adds r5, r5, r4\n\t"
  27849. #else
  27850. "add r5, r5, r4\n\t"
  27851. #endif
  27852. "ldr r5, [%[a], r7]\n\t"
  27853. #ifdef WOLFSSL_KEIL
  27854. "adcs r5, r5, r6\n\t"
  27855. #elif defined(__clang__)
  27856. "adcs r5, r6\n\t"
  27857. #else
  27858. "adc r5, r6\n\t"
  27859. #endif
  27860. "movs r4, #0\n\t"
  27861. #ifdef WOLFSSL_KEIL
  27862. "adcs r4, r4, r4\n\t"
  27863. #elif defined(__clang__)
  27864. "adcs r4, r4\n\t"
  27865. #else
  27866. "adc r4, r4\n\t"
  27867. #endif
  27868. "str r5, [%[r], r7]\n\t"
  27869. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27870. "adds r7, r7, #4\n\t"
  27871. #else
  27872. "add r7, r7, #4\n\t"
  27873. #endif
  27874. "cmp r7, r8\n\t"
  27875. "blt L_sp_2048_cond_add_32_words_%=\n\t"
  27876. "movs %[r], r4\n\t"
  27877. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m)
  27878. :
  27879. : "memory", "r4", "r5", "r6", "r7", "r8"
  27880. );
  27881. return (uint32_t)(size_t)r;
  27882. }
  27883. /* RSA private key operation.
  27884. *
  27885. * in Array of bytes representing the number to exponentiate, base.
  27886. * inLen Number of bytes in base.
  27887. * dm Private exponent.
  27888. * pm First prime.
  27889. * qm Second prime.
  27890. * dpm First prime's CRT exponent.
  27891. * dqm Second prime's CRT exponent.
  27892. * qim Inverse of second prime mod p.
  27893. * mm Modulus.
  27894. * out Buffer to hold big-endian bytes of exponentiation result.
  27895. * Must be at least 256 bytes long.
  27896. * outLen Number of bytes in result.
  27897. * returns 0 on success, MP_TO_E when the outLen is too small, MP_READ_E when
  27898. * an array is too long and MEMORY_E when dynamic memory allocation fails.
  27899. */
  27900. int sp_RsaPrivate_2048(const byte* in, word32 inLen, const mp_int* dm,
  27901. const mp_int* pm, const mp_int* qm, const mp_int* dpm, const mp_int* dqm,
  27902. const mp_int* qim, const mp_int* mm, byte* out, word32* outLen)
  27903. {
  27904. #if defined(SP_RSA_PRIVATE_EXP_D) || defined(RSA_LOW_MEM)
  27905. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  27906. sp_digit* d = NULL;
  27907. #else
  27908. sp_digit d[64 * 4];
  27909. #endif
  27910. sp_digit* a = NULL;
  27911. sp_digit* m = NULL;
  27912. sp_digit* r = NULL;
  27913. int err = MP_OKAY;
  27914. (void)pm;
  27915. (void)qm;
  27916. (void)dpm;
  27917. (void)dqm;
  27918. (void)qim;
  27919. if (*outLen < 256U) {
  27920. err = MP_TO_E;
  27921. }
  27922. if (err == MP_OKAY) {
  27923. if (mp_count_bits(dm) > 2048) {
  27924. err = MP_READ_E;
  27925. }
  27926. else if (inLen > 256) {
  27927. err = MP_READ_E;
  27928. }
  27929. else if (mp_count_bits(mm) != 2048) {
  27930. err = MP_READ_E;
  27931. }
  27932. else if (mp_iseven(mm)) {
  27933. err = MP_VAL;
  27934. }
  27935. }
  27936. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  27937. if (err == MP_OKAY) {
  27938. d = (sp_digit*)XMALLOC(sizeof(sp_digit) * 64 * 4, NULL,
  27939. DYNAMIC_TYPE_RSA);
  27940. if (d == NULL)
  27941. err = MEMORY_E;
  27942. }
  27943. #endif
  27944. if (err == MP_OKAY) {
  27945. a = d + 64;
  27946. m = a + 128;
  27947. r = a;
  27948. sp_2048_from_bin(a, 64, in, inLen);
  27949. sp_2048_from_mp(d, 64, dm);
  27950. sp_2048_from_mp(m, 64, mm);
  27951. err = sp_2048_mod_exp_64(r, a, d, 2048, m, 0);
  27952. }
  27953. if (err == MP_OKAY) {
  27954. sp_2048_to_bin_64(r, out);
  27955. *outLen = 256;
  27956. }
  27957. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  27958. if (d != NULL)
  27959. #endif
  27960. {
  27961. /* only "a" and "r" are sensitive and need zeroized (same pointer) */
  27962. if (a != NULL)
  27963. ForceZero(a, sizeof(sp_digit) * 64);
  27964. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  27965. XFREE(d, NULL, DYNAMIC_TYPE_RSA);
  27966. #endif
  27967. }
  27968. return err;
  27969. #else
  27970. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  27971. sp_digit* a = NULL;
  27972. #else
  27973. sp_digit a[32 * 11];
  27974. #endif
  27975. sp_digit* p = NULL;
  27976. sp_digit* q = NULL;
  27977. sp_digit* dp = NULL;
  27978. sp_digit* tmpa = NULL;
  27979. sp_digit* tmpb = NULL;
  27980. sp_digit* r = NULL;
  27981. sp_digit* qi = NULL;
  27982. sp_digit* dq = NULL;
  27983. sp_digit c;
  27984. int err = MP_OKAY;
  27985. (void)dm;
  27986. (void)mm;
  27987. if (*outLen < 256) {
  27988. err = MP_TO_E;
  27989. }
  27990. else if (inLen > 256 || mp_count_bits(mm) != 2048) {
  27991. err = MP_READ_E;
  27992. }
  27993. else if (mp_iseven(mm)) {
  27994. err = MP_VAL;
  27995. }
  27996. else if (mp_iseven(pm)) {
  27997. err = MP_VAL;
  27998. }
  27999. else if (mp_iseven(qm)) {
  28000. err = MP_VAL;
  28001. }
  28002. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  28003. if (err == MP_OKAY) {
  28004. a = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32 * 11, NULL,
  28005. DYNAMIC_TYPE_RSA);
  28006. if (a == NULL)
  28007. err = MEMORY_E;
  28008. }
  28009. #endif
  28010. if (err == MP_OKAY) {
  28011. p = a + 64 * 2;
  28012. q = p + 32;
  28013. qi = dq = dp = q + 32;
  28014. tmpa = qi + 32;
  28015. tmpb = tmpa + 64;
  28016. r = a;
  28017. sp_2048_from_bin(a, 64, in, inLen);
  28018. sp_2048_from_mp(p, 32, pm);
  28019. sp_2048_from_mp(q, 32, qm);
  28020. sp_2048_from_mp(dp, 32, dpm);
  28021. err = sp_2048_mod_exp_32(tmpa, a, dp, 1024, p, 1);
  28022. }
  28023. if (err == MP_OKAY) {
  28024. sp_2048_from_mp(dq, 32, dqm);
  28025. err = sp_2048_mod_exp_32(tmpb, a, dq, 1024, q, 1);
  28026. }
  28027. if (err == MP_OKAY) {
  28028. c = sp_2048_sub_in_place_32(tmpa, tmpb);
  28029. c += sp_2048_cond_add_32(tmpa, tmpa, p, c);
  28030. sp_2048_cond_add_32(tmpa, tmpa, p, c);
  28031. sp_2048_from_mp(qi, 32, qim);
  28032. sp_2048_mul_32(tmpa, tmpa, qi);
  28033. err = sp_2048_mod_32(tmpa, tmpa, p);
  28034. }
  28035. if (err == MP_OKAY) {
  28036. sp_2048_mul_32(tmpa, q, tmpa);
  28037. XMEMSET(&tmpb[32], 0, sizeof(sp_digit) * 32);
  28038. sp_2048_add_64(r, tmpb, tmpa);
  28039. sp_2048_to_bin_64(r, out);
  28040. *outLen = 256;
  28041. }
  28042. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  28043. if (a != NULL)
  28044. #endif
  28045. {
  28046. ForceZero(a, sizeof(sp_digit) * 32 * 11);
  28047. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  28048. XFREE(a, NULL, DYNAMIC_TYPE_RSA);
  28049. #endif
  28050. }
  28051. #endif /* SP_RSA_PRIVATE_EXP_D || RSA_LOW_MEM */
  28052. return err;
  28053. }
  28054. #endif /* WOLFSSL_RSA_PUBLIC_ONLY */
  28055. #endif /* WOLFSSL_HAVE_SP_RSA */
  28056. #if defined(WOLFSSL_HAVE_SP_DH) || (defined(WOLFSSL_HAVE_SP_RSA) && \
  28057. !defined(WOLFSSL_RSA_PUBLIC_ONLY))
  28058. /* Convert an array of sp_digit to an mp_int.
  28059. *
  28060. * a A single precision integer.
  28061. * r A multi-precision integer.
  28062. */
  28063. static int sp_2048_to_mp(const sp_digit* a, mp_int* r)
  28064. {
  28065. int err;
  28066. err = mp_grow(r, (2048 + DIGIT_BIT - 1) / DIGIT_BIT);
  28067. if (err == MP_OKAY) { /*lint !e774 case where err is always MP_OKAY*/
  28068. #if DIGIT_BIT == 32
  28069. XMEMCPY(r->dp, a, sizeof(sp_digit) * 64);
  28070. r->used = 64;
  28071. mp_clamp(r);
  28072. #elif DIGIT_BIT < 32
  28073. int i;
  28074. int j = 0;
  28075. int s = 0;
  28076. r->dp[0] = 0;
  28077. for (i = 0; i < 64; i++) {
  28078. r->dp[j] |= (mp_digit)(a[i] << s);
  28079. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  28080. s = DIGIT_BIT - s;
  28081. r->dp[++j] = (mp_digit)(a[i] >> s);
  28082. while (s + DIGIT_BIT <= 32) {
  28083. s += DIGIT_BIT;
  28084. r->dp[j++] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  28085. if (s == SP_WORD_SIZE) {
  28086. r->dp[j] = 0;
  28087. }
  28088. else {
  28089. r->dp[j] = (mp_digit)(a[i] >> s);
  28090. }
  28091. }
  28092. s = 32 - s;
  28093. }
  28094. r->used = (2048 + DIGIT_BIT - 1) / DIGIT_BIT;
  28095. mp_clamp(r);
  28096. #else
  28097. int i;
  28098. int j = 0;
  28099. int s = 0;
  28100. r->dp[0] = 0;
  28101. for (i = 0; i < 64; i++) {
  28102. r->dp[j] |= ((mp_digit)a[i]) << s;
  28103. if (s + 32 >= DIGIT_BIT) {
  28104. #if DIGIT_BIT != 32 && DIGIT_BIT != 64
  28105. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  28106. #endif
  28107. s = DIGIT_BIT - s;
  28108. r->dp[++j] = a[i] >> s;
  28109. s = 32 - s;
  28110. }
  28111. else {
  28112. s += 32;
  28113. }
  28114. }
  28115. r->used = (2048 + DIGIT_BIT - 1) / DIGIT_BIT;
  28116. mp_clamp(r);
  28117. #endif
  28118. }
  28119. return err;
  28120. }
  28121. /* Perform the modular exponentiation for Diffie-Hellman.
  28122. *
  28123. * base Base. MP integer.
  28124. * exp Exponent. MP integer.
  28125. * mod Modulus. MP integer.
  28126. * res Result. MP integer.
  28127. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  28128. * and MEMORY_E if memory allocation fails.
  28129. */
  28130. int sp_ModExp_2048(const mp_int* base, const mp_int* exp, const mp_int* mod,
  28131. mp_int* res)
  28132. {
  28133. int err = MP_OKAY;
  28134. sp_digit b[128];
  28135. sp_digit e[64];
  28136. sp_digit m[64];
  28137. sp_digit* r = b;
  28138. int expBits = mp_count_bits(exp);
  28139. if (mp_count_bits(base) > 2048) {
  28140. err = MP_READ_E;
  28141. }
  28142. else if (expBits > 2048) {
  28143. err = MP_READ_E;
  28144. }
  28145. else if (mp_count_bits(mod) != 2048) {
  28146. err = MP_READ_E;
  28147. }
  28148. else if (mp_iseven(mod)) {
  28149. err = MP_VAL;
  28150. }
  28151. if (err == MP_OKAY) {
  28152. sp_2048_from_mp(b, 64, base);
  28153. sp_2048_from_mp(e, 64, exp);
  28154. sp_2048_from_mp(m, 64, mod);
  28155. err = sp_2048_mod_exp_64(r, b, e, expBits, m, 0);
  28156. }
  28157. if (err == MP_OKAY) {
  28158. err = sp_2048_to_mp(r, res);
  28159. }
  28160. XMEMSET(e, 0, sizeof(e));
  28161. return err;
  28162. }
  28163. #ifdef WOLFSSL_HAVE_SP_DH
  28164. #ifdef HAVE_FFDHE_2048
  28165. /* Lefy shift a by n bits into r. (r = a << n)
  28166. *
  28167. * r A single precision integer.
  28168. * a A single precision integer.
  28169. * n Integer representing number of bits to shift.
  28170. */
  28171. static void sp_2048_lshift_64(sp_digit* r, const sp_digit* a, byte n)
  28172. {
  28173. __asm__ __volatile__ (
  28174. "movs r7, #31\n\t"
  28175. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28176. "subs r7, r7, %[n]\n\t"
  28177. #else
  28178. "sub r7, r7, %[n]\n\t"
  28179. #endif
  28180. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28181. "adds %[a], %[a], #0xc0\n\t"
  28182. #else
  28183. "add %[a], %[a], #0xc0\n\t"
  28184. #endif
  28185. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28186. "adds %[r], %[r], #0xc0\n\t"
  28187. #else
  28188. "add %[r], %[r], #0xc0\n\t"
  28189. #endif
  28190. "ldr r4, [%[a], #60]\n\t"
  28191. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28192. "lsrs r5, r4, #1\n\t"
  28193. #else
  28194. "lsr r5, r4, #1\n\t"
  28195. #endif
  28196. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28197. "lsls r4, r4, %[n]\n\t"
  28198. #else
  28199. "lsl r4, r4, %[n]\n\t"
  28200. #endif
  28201. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28202. "lsrs r5, r5, r7\n\t"
  28203. #else
  28204. "lsr r5, r5, r7\n\t"
  28205. #endif
  28206. "ldr r3, [%[a], #56]\n\t"
  28207. "str r5, [%[r], #64]\n\t"
  28208. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28209. "lsrs r6, r3, #1\n\t"
  28210. #else
  28211. "lsr r6, r3, #1\n\t"
  28212. #endif
  28213. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28214. "lsls r3, r3, %[n]\n\t"
  28215. #else
  28216. "lsl r3, r3, %[n]\n\t"
  28217. #endif
  28218. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28219. "lsrs r6, r6, r7\n\t"
  28220. #else
  28221. "lsr r6, r6, r7\n\t"
  28222. #endif
  28223. #ifdef WOLFSSL_KEIL
  28224. "orrs r4, r4, r6\n\t"
  28225. #elif defined(__clang__)
  28226. "orrs r4, r6\n\t"
  28227. #else
  28228. "orr r4, r6\n\t"
  28229. #endif
  28230. "ldr r5, [%[a], #52]\n\t"
  28231. "str r4, [%[r], #60]\n\t"
  28232. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28233. "lsrs r6, r5, #1\n\t"
  28234. #else
  28235. "lsr r6, r5, #1\n\t"
  28236. #endif
  28237. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28238. "lsls r5, r5, %[n]\n\t"
  28239. #else
  28240. "lsl r5, r5, %[n]\n\t"
  28241. #endif
  28242. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28243. "lsrs r6, r6, r7\n\t"
  28244. #else
  28245. "lsr r6, r6, r7\n\t"
  28246. #endif
  28247. #ifdef WOLFSSL_KEIL
  28248. "orrs r3, r3, r6\n\t"
  28249. #elif defined(__clang__)
  28250. "orrs r3, r6\n\t"
  28251. #else
  28252. "orr r3, r6\n\t"
  28253. #endif
  28254. "ldr r4, [%[a], #48]\n\t"
  28255. "str r3, [%[r], #56]\n\t"
  28256. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28257. "lsrs r6, r4, #1\n\t"
  28258. #else
  28259. "lsr r6, r4, #1\n\t"
  28260. #endif
  28261. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28262. "lsls r4, r4, %[n]\n\t"
  28263. #else
  28264. "lsl r4, r4, %[n]\n\t"
  28265. #endif
  28266. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28267. "lsrs r6, r6, r7\n\t"
  28268. #else
  28269. "lsr r6, r6, r7\n\t"
  28270. #endif
  28271. #ifdef WOLFSSL_KEIL
  28272. "orrs r5, r5, r6\n\t"
  28273. #elif defined(__clang__)
  28274. "orrs r5, r6\n\t"
  28275. #else
  28276. "orr r5, r6\n\t"
  28277. #endif
  28278. "ldr r3, [%[a], #44]\n\t"
  28279. "str r5, [%[r], #52]\n\t"
  28280. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28281. "lsrs r6, r3, #1\n\t"
  28282. #else
  28283. "lsr r6, r3, #1\n\t"
  28284. #endif
  28285. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28286. "lsls r3, r3, %[n]\n\t"
  28287. #else
  28288. "lsl r3, r3, %[n]\n\t"
  28289. #endif
  28290. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28291. "lsrs r6, r6, r7\n\t"
  28292. #else
  28293. "lsr r6, r6, r7\n\t"
  28294. #endif
  28295. #ifdef WOLFSSL_KEIL
  28296. "orrs r4, r4, r6\n\t"
  28297. #elif defined(__clang__)
  28298. "orrs r4, r6\n\t"
  28299. #else
  28300. "orr r4, r6\n\t"
  28301. #endif
  28302. "ldr r5, [%[a], #40]\n\t"
  28303. "str r4, [%[r], #48]\n\t"
  28304. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28305. "lsrs r6, r5, #1\n\t"
  28306. #else
  28307. "lsr r6, r5, #1\n\t"
  28308. #endif
  28309. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28310. "lsls r5, r5, %[n]\n\t"
  28311. #else
  28312. "lsl r5, r5, %[n]\n\t"
  28313. #endif
  28314. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28315. "lsrs r6, r6, r7\n\t"
  28316. #else
  28317. "lsr r6, r6, r7\n\t"
  28318. #endif
  28319. #ifdef WOLFSSL_KEIL
  28320. "orrs r3, r3, r6\n\t"
  28321. #elif defined(__clang__)
  28322. "orrs r3, r6\n\t"
  28323. #else
  28324. "orr r3, r6\n\t"
  28325. #endif
  28326. "ldr r4, [%[a], #36]\n\t"
  28327. "str r3, [%[r], #44]\n\t"
  28328. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28329. "lsrs r6, r4, #1\n\t"
  28330. #else
  28331. "lsr r6, r4, #1\n\t"
  28332. #endif
  28333. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28334. "lsls r4, r4, %[n]\n\t"
  28335. #else
  28336. "lsl r4, r4, %[n]\n\t"
  28337. #endif
  28338. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28339. "lsrs r6, r6, r7\n\t"
  28340. #else
  28341. "lsr r6, r6, r7\n\t"
  28342. #endif
  28343. #ifdef WOLFSSL_KEIL
  28344. "orrs r5, r5, r6\n\t"
  28345. #elif defined(__clang__)
  28346. "orrs r5, r6\n\t"
  28347. #else
  28348. "orr r5, r6\n\t"
  28349. #endif
  28350. "ldr r3, [%[a], #32]\n\t"
  28351. "str r5, [%[r], #40]\n\t"
  28352. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28353. "lsrs r6, r3, #1\n\t"
  28354. #else
  28355. "lsr r6, r3, #1\n\t"
  28356. #endif
  28357. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28358. "lsls r3, r3, %[n]\n\t"
  28359. #else
  28360. "lsl r3, r3, %[n]\n\t"
  28361. #endif
  28362. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28363. "lsrs r6, r6, r7\n\t"
  28364. #else
  28365. "lsr r6, r6, r7\n\t"
  28366. #endif
  28367. #ifdef WOLFSSL_KEIL
  28368. "orrs r4, r4, r6\n\t"
  28369. #elif defined(__clang__)
  28370. "orrs r4, r6\n\t"
  28371. #else
  28372. "orr r4, r6\n\t"
  28373. #endif
  28374. "ldr r5, [%[a], #28]\n\t"
  28375. "str r4, [%[r], #36]\n\t"
  28376. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28377. "lsrs r6, r5, #1\n\t"
  28378. #else
  28379. "lsr r6, r5, #1\n\t"
  28380. #endif
  28381. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28382. "lsls r5, r5, %[n]\n\t"
  28383. #else
  28384. "lsl r5, r5, %[n]\n\t"
  28385. #endif
  28386. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28387. "lsrs r6, r6, r7\n\t"
  28388. #else
  28389. "lsr r6, r6, r7\n\t"
  28390. #endif
  28391. #ifdef WOLFSSL_KEIL
  28392. "orrs r3, r3, r6\n\t"
  28393. #elif defined(__clang__)
  28394. "orrs r3, r6\n\t"
  28395. #else
  28396. "orr r3, r6\n\t"
  28397. #endif
  28398. "ldr r4, [%[a], #24]\n\t"
  28399. "str r3, [%[r], #32]\n\t"
  28400. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28401. "lsrs r6, r4, #1\n\t"
  28402. #else
  28403. "lsr r6, r4, #1\n\t"
  28404. #endif
  28405. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28406. "lsls r4, r4, %[n]\n\t"
  28407. #else
  28408. "lsl r4, r4, %[n]\n\t"
  28409. #endif
  28410. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28411. "lsrs r6, r6, r7\n\t"
  28412. #else
  28413. "lsr r6, r6, r7\n\t"
  28414. #endif
  28415. #ifdef WOLFSSL_KEIL
  28416. "orrs r5, r5, r6\n\t"
  28417. #elif defined(__clang__)
  28418. "orrs r5, r6\n\t"
  28419. #else
  28420. "orr r5, r6\n\t"
  28421. #endif
  28422. "ldr r3, [%[a], #20]\n\t"
  28423. "str r5, [%[r], #28]\n\t"
  28424. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28425. "lsrs r6, r3, #1\n\t"
  28426. #else
  28427. "lsr r6, r3, #1\n\t"
  28428. #endif
  28429. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28430. "lsls r3, r3, %[n]\n\t"
  28431. #else
  28432. "lsl r3, r3, %[n]\n\t"
  28433. #endif
  28434. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28435. "lsrs r6, r6, r7\n\t"
  28436. #else
  28437. "lsr r6, r6, r7\n\t"
  28438. #endif
  28439. #ifdef WOLFSSL_KEIL
  28440. "orrs r4, r4, r6\n\t"
  28441. #elif defined(__clang__)
  28442. "orrs r4, r6\n\t"
  28443. #else
  28444. "orr r4, r6\n\t"
  28445. #endif
  28446. "ldr r5, [%[a], #16]\n\t"
  28447. "str r4, [%[r], #24]\n\t"
  28448. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28449. "lsrs r6, r5, #1\n\t"
  28450. #else
  28451. "lsr r6, r5, #1\n\t"
  28452. #endif
  28453. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28454. "lsls r5, r5, %[n]\n\t"
  28455. #else
  28456. "lsl r5, r5, %[n]\n\t"
  28457. #endif
  28458. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28459. "lsrs r6, r6, r7\n\t"
  28460. #else
  28461. "lsr r6, r6, r7\n\t"
  28462. #endif
  28463. #ifdef WOLFSSL_KEIL
  28464. "orrs r3, r3, r6\n\t"
  28465. #elif defined(__clang__)
  28466. "orrs r3, r6\n\t"
  28467. #else
  28468. "orr r3, r6\n\t"
  28469. #endif
  28470. "ldr r4, [%[a], #12]\n\t"
  28471. "str r3, [%[r], #20]\n\t"
  28472. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28473. "lsrs r6, r4, #1\n\t"
  28474. #else
  28475. "lsr r6, r4, #1\n\t"
  28476. #endif
  28477. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28478. "lsls r4, r4, %[n]\n\t"
  28479. #else
  28480. "lsl r4, r4, %[n]\n\t"
  28481. #endif
  28482. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28483. "lsrs r6, r6, r7\n\t"
  28484. #else
  28485. "lsr r6, r6, r7\n\t"
  28486. #endif
  28487. #ifdef WOLFSSL_KEIL
  28488. "orrs r5, r5, r6\n\t"
  28489. #elif defined(__clang__)
  28490. "orrs r5, r6\n\t"
  28491. #else
  28492. "orr r5, r6\n\t"
  28493. #endif
  28494. "ldr r3, [%[a], #8]\n\t"
  28495. "str r5, [%[r], #16]\n\t"
  28496. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28497. "lsrs r6, r3, #1\n\t"
  28498. #else
  28499. "lsr r6, r3, #1\n\t"
  28500. #endif
  28501. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28502. "lsls r3, r3, %[n]\n\t"
  28503. #else
  28504. "lsl r3, r3, %[n]\n\t"
  28505. #endif
  28506. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28507. "lsrs r6, r6, r7\n\t"
  28508. #else
  28509. "lsr r6, r6, r7\n\t"
  28510. #endif
  28511. #ifdef WOLFSSL_KEIL
  28512. "orrs r4, r4, r6\n\t"
  28513. #elif defined(__clang__)
  28514. "orrs r4, r6\n\t"
  28515. #else
  28516. "orr r4, r6\n\t"
  28517. #endif
  28518. "ldr r5, [%[a], #4]\n\t"
  28519. "str r4, [%[r], #12]\n\t"
  28520. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28521. "lsrs r6, r5, #1\n\t"
  28522. #else
  28523. "lsr r6, r5, #1\n\t"
  28524. #endif
  28525. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28526. "lsls r5, r5, %[n]\n\t"
  28527. #else
  28528. "lsl r5, r5, %[n]\n\t"
  28529. #endif
  28530. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28531. "lsrs r6, r6, r7\n\t"
  28532. #else
  28533. "lsr r6, r6, r7\n\t"
  28534. #endif
  28535. #ifdef WOLFSSL_KEIL
  28536. "orrs r3, r3, r6\n\t"
  28537. #elif defined(__clang__)
  28538. "orrs r3, r6\n\t"
  28539. #else
  28540. "orr r3, r6\n\t"
  28541. #endif
  28542. "ldr r4, [%[a]]\n\t"
  28543. "str r3, [%[r], #8]\n\t"
  28544. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28545. "lsrs r6, r4, #1\n\t"
  28546. #else
  28547. "lsr r6, r4, #1\n\t"
  28548. #endif
  28549. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28550. "lsls r4, r4, %[n]\n\t"
  28551. #else
  28552. "lsl r4, r4, %[n]\n\t"
  28553. #endif
  28554. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28555. "lsrs r6, r6, r7\n\t"
  28556. #else
  28557. "lsr r6, r6, r7\n\t"
  28558. #endif
  28559. #ifdef WOLFSSL_KEIL
  28560. "orrs r5, r5, r6\n\t"
  28561. #elif defined(__clang__)
  28562. "orrs r5, r6\n\t"
  28563. #else
  28564. "orr r5, r6\n\t"
  28565. #endif
  28566. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28567. "subs %[a], %[a], #0x40\n\t"
  28568. #else
  28569. "sub %[a], %[a], #0x40\n\t"
  28570. #endif
  28571. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28572. "subs %[r], %[r], #0x40\n\t"
  28573. #else
  28574. "sub %[r], %[r], #0x40\n\t"
  28575. #endif
  28576. "ldr r3, [%[a], #60]\n\t"
  28577. "str r5, [%[r], #68]\n\t"
  28578. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28579. "lsrs r6, r3, #1\n\t"
  28580. #else
  28581. "lsr r6, r3, #1\n\t"
  28582. #endif
  28583. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28584. "lsls r3, r3, %[n]\n\t"
  28585. #else
  28586. "lsl r3, r3, %[n]\n\t"
  28587. #endif
  28588. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28589. "lsrs r6, r6, r7\n\t"
  28590. #else
  28591. "lsr r6, r6, r7\n\t"
  28592. #endif
  28593. #ifdef WOLFSSL_KEIL
  28594. "orrs r4, r4, r6\n\t"
  28595. #elif defined(__clang__)
  28596. "orrs r4, r6\n\t"
  28597. #else
  28598. "orr r4, r6\n\t"
  28599. #endif
  28600. "ldr r5, [%[a], #56]\n\t"
  28601. "str r4, [%[r], #64]\n\t"
  28602. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28603. "lsrs r6, r5, #1\n\t"
  28604. #else
  28605. "lsr r6, r5, #1\n\t"
  28606. #endif
  28607. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28608. "lsls r5, r5, %[n]\n\t"
  28609. #else
  28610. "lsl r5, r5, %[n]\n\t"
  28611. #endif
  28612. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28613. "lsrs r6, r6, r7\n\t"
  28614. #else
  28615. "lsr r6, r6, r7\n\t"
  28616. #endif
  28617. #ifdef WOLFSSL_KEIL
  28618. "orrs r3, r3, r6\n\t"
  28619. #elif defined(__clang__)
  28620. "orrs r3, r6\n\t"
  28621. #else
  28622. "orr r3, r6\n\t"
  28623. #endif
  28624. "ldr r4, [%[a], #52]\n\t"
  28625. "str r3, [%[r], #60]\n\t"
  28626. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28627. "lsrs r6, r4, #1\n\t"
  28628. #else
  28629. "lsr r6, r4, #1\n\t"
  28630. #endif
  28631. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28632. "lsls r4, r4, %[n]\n\t"
  28633. #else
  28634. "lsl r4, r4, %[n]\n\t"
  28635. #endif
  28636. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28637. "lsrs r6, r6, r7\n\t"
  28638. #else
  28639. "lsr r6, r6, r7\n\t"
  28640. #endif
  28641. #ifdef WOLFSSL_KEIL
  28642. "orrs r5, r5, r6\n\t"
  28643. #elif defined(__clang__)
  28644. "orrs r5, r6\n\t"
  28645. #else
  28646. "orr r5, r6\n\t"
  28647. #endif
  28648. "ldr r3, [%[a], #48]\n\t"
  28649. "str r5, [%[r], #56]\n\t"
  28650. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28651. "lsrs r6, r3, #1\n\t"
  28652. #else
  28653. "lsr r6, r3, #1\n\t"
  28654. #endif
  28655. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28656. "lsls r3, r3, %[n]\n\t"
  28657. #else
  28658. "lsl r3, r3, %[n]\n\t"
  28659. #endif
  28660. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28661. "lsrs r6, r6, r7\n\t"
  28662. #else
  28663. "lsr r6, r6, r7\n\t"
  28664. #endif
  28665. #ifdef WOLFSSL_KEIL
  28666. "orrs r4, r4, r6\n\t"
  28667. #elif defined(__clang__)
  28668. "orrs r4, r6\n\t"
  28669. #else
  28670. "orr r4, r6\n\t"
  28671. #endif
  28672. "ldr r5, [%[a], #44]\n\t"
  28673. "str r4, [%[r], #52]\n\t"
  28674. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28675. "lsrs r6, r5, #1\n\t"
  28676. #else
  28677. "lsr r6, r5, #1\n\t"
  28678. #endif
  28679. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28680. "lsls r5, r5, %[n]\n\t"
  28681. #else
  28682. "lsl r5, r5, %[n]\n\t"
  28683. #endif
  28684. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28685. "lsrs r6, r6, r7\n\t"
  28686. #else
  28687. "lsr r6, r6, r7\n\t"
  28688. #endif
  28689. #ifdef WOLFSSL_KEIL
  28690. "orrs r3, r3, r6\n\t"
  28691. #elif defined(__clang__)
  28692. "orrs r3, r6\n\t"
  28693. #else
  28694. "orr r3, r6\n\t"
  28695. #endif
  28696. "ldr r4, [%[a], #40]\n\t"
  28697. "str r3, [%[r], #48]\n\t"
  28698. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28699. "lsrs r6, r4, #1\n\t"
  28700. #else
  28701. "lsr r6, r4, #1\n\t"
  28702. #endif
  28703. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28704. "lsls r4, r4, %[n]\n\t"
  28705. #else
  28706. "lsl r4, r4, %[n]\n\t"
  28707. #endif
  28708. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28709. "lsrs r6, r6, r7\n\t"
  28710. #else
  28711. "lsr r6, r6, r7\n\t"
  28712. #endif
  28713. #ifdef WOLFSSL_KEIL
  28714. "orrs r5, r5, r6\n\t"
  28715. #elif defined(__clang__)
  28716. "orrs r5, r6\n\t"
  28717. #else
  28718. "orr r5, r6\n\t"
  28719. #endif
  28720. "ldr r3, [%[a], #36]\n\t"
  28721. "str r5, [%[r], #44]\n\t"
  28722. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28723. "lsrs r6, r3, #1\n\t"
  28724. #else
  28725. "lsr r6, r3, #1\n\t"
  28726. #endif
  28727. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28728. "lsls r3, r3, %[n]\n\t"
  28729. #else
  28730. "lsl r3, r3, %[n]\n\t"
  28731. #endif
  28732. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28733. "lsrs r6, r6, r7\n\t"
  28734. #else
  28735. "lsr r6, r6, r7\n\t"
  28736. #endif
  28737. #ifdef WOLFSSL_KEIL
  28738. "orrs r4, r4, r6\n\t"
  28739. #elif defined(__clang__)
  28740. "orrs r4, r6\n\t"
  28741. #else
  28742. "orr r4, r6\n\t"
  28743. #endif
  28744. "ldr r5, [%[a], #32]\n\t"
  28745. "str r4, [%[r], #40]\n\t"
  28746. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28747. "lsrs r6, r5, #1\n\t"
  28748. #else
  28749. "lsr r6, r5, #1\n\t"
  28750. #endif
  28751. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28752. "lsls r5, r5, %[n]\n\t"
  28753. #else
  28754. "lsl r5, r5, %[n]\n\t"
  28755. #endif
  28756. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28757. "lsrs r6, r6, r7\n\t"
  28758. #else
  28759. "lsr r6, r6, r7\n\t"
  28760. #endif
  28761. #ifdef WOLFSSL_KEIL
  28762. "orrs r3, r3, r6\n\t"
  28763. #elif defined(__clang__)
  28764. "orrs r3, r6\n\t"
  28765. #else
  28766. "orr r3, r6\n\t"
  28767. #endif
  28768. "ldr r4, [%[a], #28]\n\t"
  28769. "str r3, [%[r], #36]\n\t"
  28770. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28771. "lsrs r6, r4, #1\n\t"
  28772. #else
  28773. "lsr r6, r4, #1\n\t"
  28774. #endif
  28775. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28776. "lsls r4, r4, %[n]\n\t"
  28777. #else
  28778. "lsl r4, r4, %[n]\n\t"
  28779. #endif
  28780. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28781. "lsrs r6, r6, r7\n\t"
  28782. #else
  28783. "lsr r6, r6, r7\n\t"
  28784. #endif
  28785. #ifdef WOLFSSL_KEIL
  28786. "orrs r5, r5, r6\n\t"
  28787. #elif defined(__clang__)
  28788. "orrs r5, r6\n\t"
  28789. #else
  28790. "orr r5, r6\n\t"
  28791. #endif
  28792. "ldr r3, [%[a], #24]\n\t"
  28793. "str r5, [%[r], #32]\n\t"
  28794. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28795. "lsrs r6, r3, #1\n\t"
  28796. #else
  28797. "lsr r6, r3, #1\n\t"
  28798. #endif
  28799. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28800. "lsls r3, r3, %[n]\n\t"
  28801. #else
  28802. "lsl r3, r3, %[n]\n\t"
  28803. #endif
  28804. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28805. "lsrs r6, r6, r7\n\t"
  28806. #else
  28807. "lsr r6, r6, r7\n\t"
  28808. #endif
  28809. #ifdef WOLFSSL_KEIL
  28810. "orrs r4, r4, r6\n\t"
  28811. #elif defined(__clang__)
  28812. "orrs r4, r6\n\t"
  28813. #else
  28814. "orr r4, r6\n\t"
  28815. #endif
  28816. "ldr r5, [%[a], #20]\n\t"
  28817. "str r4, [%[r], #28]\n\t"
  28818. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28819. "lsrs r6, r5, #1\n\t"
  28820. #else
  28821. "lsr r6, r5, #1\n\t"
  28822. #endif
  28823. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28824. "lsls r5, r5, %[n]\n\t"
  28825. #else
  28826. "lsl r5, r5, %[n]\n\t"
  28827. #endif
  28828. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28829. "lsrs r6, r6, r7\n\t"
  28830. #else
  28831. "lsr r6, r6, r7\n\t"
  28832. #endif
  28833. #ifdef WOLFSSL_KEIL
  28834. "orrs r3, r3, r6\n\t"
  28835. #elif defined(__clang__)
  28836. "orrs r3, r6\n\t"
  28837. #else
  28838. "orr r3, r6\n\t"
  28839. #endif
  28840. "ldr r4, [%[a], #16]\n\t"
  28841. "str r3, [%[r], #24]\n\t"
  28842. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28843. "lsrs r6, r4, #1\n\t"
  28844. #else
  28845. "lsr r6, r4, #1\n\t"
  28846. #endif
  28847. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28848. "lsls r4, r4, %[n]\n\t"
  28849. #else
  28850. "lsl r4, r4, %[n]\n\t"
  28851. #endif
  28852. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28853. "lsrs r6, r6, r7\n\t"
  28854. #else
  28855. "lsr r6, r6, r7\n\t"
  28856. #endif
  28857. #ifdef WOLFSSL_KEIL
  28858. "orrs r5, r5, r6\n\t"
  28859. #elif defined(__clang__)
  28860. "orrs r5, r6\n\t"
  28861. #else
  28862. "orr r5, r6\n\t"
  28863. #endif
  28864. "ldr r3, [%[a], #12]\n\t"
  28865. "str r5, [%[r], #20]\n\t"
  28866. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28867. "lsrs r6, r3, #1\n\t"
  28868. #else
  28869. "lsr r6, r3, #1\n\t"
  28870. #endif
  28871. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28872. "lsls r3, r3, %[n]\n\t"
  28873. #else
  28874. "lsl r3, r3, %[n]\n\t"
  28875. #endif
  28876. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28877. "lsrs r6, r6, r7\n\t"
  28878. #else
  28879. "lsr r6, r6, r7\n\t"
  28880. #endif
  28881. #ifdef WOLFSSL_KEIL
  28882. "orrs r4, r4, r6\n\t"
  28883. #elif defined(__clang__)
  28884. "orrs r4, r6\n\t"
  28885. #else
  28886. "orr r4, r6\n\t"
  28887. #endif
  28888. "ldr r5, [%[a], #8]\n\t"
  28889. "str r4, [%[r], #16]\n\t"
  28890. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28891. "lsrs r6, r5, #1\n\t"
  28892. #else
  28893. "lsr r6, r5, #1\n\t"
  28894. #endif
  28895. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28896. "lsls r5, r5, %[n]\n\t"
  28897. #else
  28898. "lsl r5, r5, %[n]\n\t"
  28899. #endif
  28900. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28901. "lsrs r6, r6, r7\n\t"
  28902. #else
  28903. "lsr r6, r6, r7\n\t"
  28904. #endif
  28905. #ifdef WOLFSSL_KEIL
  28906. "orrs r3, r3, r6\n\t"
  28907. #elif defined(__clang__)
  28908. "orrs r3, r6\n\t"
  28909. #else
  28910. "orr r3, r6\n\t"
  28911. #endif
  28912. "ldr r4, [%[a], #4]\n\t"
  28913. "str r3, [%[r], #12]\n\t"
  28914. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28915. "lsrs r6, r4, #1\n\t"
  28916. #else
  28917. "lsr r6, r4, #1\n\t"
  28918. #endif
  28919. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28920. "lsls r4, r4, %[n]\n\t"
  28921. #else
  28922. "lsl r4, r4, %[n]\n\t"
  28923. #endif
  28924. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28925. "lsrs r6, r6, r7\n\t"
  28926. #else
  28927. "lsr r6, r6, r7\n\t"
  28928. #endif
  28929. #ifdef WOLFSSL_KEIL
  28930. "orrs r5, r5, r6\n\t"
  28931. #elif defined(__clang__)
  28932. "orrs r5, r6\n\t"
  28933. #else
  28934. "orr r5, r6\n\t"
  28935. #endif
  28936. "ldr r3, [%[a]]\n\t"
  28937. "str r5, [%[r], #8]\n\t"
  28938. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28939. "lsrs r6, r3, #1\n\t"
  28940. #else
  28941. "lsr r6, r3, #1\n\t"
  28942. #endif
  28943. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28944. "lsls r3, r3, %[n]\n\t"
  28945. #else
  28946. "lsl r3, r3, %[n]\n\t"
  28947. #endif
  28948. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28949. "lsrs r6, r6, r7\n\t"
  28950. #else
  28951. "lsr r6, r6, r7\n\t"
  28952. #endif
  28953. #ifdef WOLFSSL_KEIL
  28954. "orrs r4, r4, r6\n\t"
  28955. #elif defined(__clang__)
  28956. "orrs r4, r6\n\t"
  28957. #else
  28958. "orr r4, r6\n\t"
  28959. #endif
  28960. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28961. "subs %[a], %[a], #0x40\n\t"
  28962. #else
  28963. "sub %[a], %[a], #0x40\n\t"
  28964. #endif
  28965. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28966. "subs %[r], %[r], #0x40\n\t"
  28967. #else
  28968. "sub %[r], %[r], #0x40\n\t"
  28969. #endif
  28970. "ldr r5, [%[a], #60]\n\t"
  28971. "str r4, [%[r], #68]\n\t"
  28972. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28973. "lsrs r6, r5, #1\n\t"
  28974. #else
  28975. "lsr r6, r5, #1\n\t"
  28976. #endif
  28977. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28978. "lsls r5, r5, %[n]\n\t"
  28979. #else
  28980. "lsl r5, r5, %[n]\n\t"
  28981. #endif
  28982. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28983. "lsrs r6, r6, r7\n\t"
  28984. #else
  28985. "lsr r6, r6, r7\n\t"
  28986. #endif
  28987. #ifdef WOLFSSL_KEIL
  28988. "orrs r3, r3, r6\n\t"
  28989. #elif defined(__clang__)
  28990. "orrs r3, r6\n\t"
  28991. #else
  28992. "orr r3, r6\n\t"
  28993. #endif
  28994. "ldr r4, [%[a], #56]\n\t"
  28995. "str r3, [%[r], #64]\n\t"
  28996. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28997. "lsrs r6, r4, #1\n\t"
  28998. #else
  28999. "lsr r6, r4, #1\n\t"
  29000. #endif
  29001. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29002. "lsls r4, r4, %[n]\n\t"
  29003. #else
  29004. "lsl r4, r4, %[n]\n\t"
  29005. #endif
  29006. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29007. "lsrs r6, r6, r7\n\t"
  29008. #else
  29009. "lsr r6, r6, r7\n\t"
  29010. #endif
  29011. #ifdef WOLFSSL_KEIL
  29012. "orrs r5, r5, r6\n\t"
  29013. #elif defined(__clang__)
  29014. "orrs r5, r6\n\t"
  29015. #else
  29016. "orr r5, r6\n\t"
  29017. #endif
  29018. "ldr r3, [%[a], #52]\n\t"
  29019. "str r5, [%[r], #60]\n\t"
  29020. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29021. "lsrs r6, r3, #1\n\t"
  29022. #else
  29023. "lsr r6, r3, #1\n\t"
  29024. #endif
  29025. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29026. "lsls r3, r3, %[n]\n\t"
  29027. #else
  29028. "lsl r3, r3, %[n]\n\t"
  29029. #endif
  29030. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29031. "lsrs r6, r6, r7\n\t"
  29032. #else
  29033. "lsr r6, r6, r7\n\t"
  29034. #endif
  29035. #ifdef WOLFSSL_KEIL
  29036. "orrs r4, r4, r6\n\t"
  29037. #elif defined(__clang__)
  29038. "orrs r4, r6\n\t"
  29039. #else
  29040. "orr r4, r6\n\t"
  29041. #endif
  29042. "ldr r5, [%[a], #48]\n\t"
  29043. "str r4, [%[r], #56]\n\t"
  29044. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29045. "lsrs r6, r5, #1\n\t"
  29046. #else
  29047. "lsr r6, r5, #1\n\t"
  29048. #endif
  29049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29050. "lsls r5, r5, %[n]\n\t"
  29051. #else
  29052. "lsl r5, r5, %[n]\n\t"
  29053. #endif
  29054. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29055. "lsrs r6, r6, r7\n\t"
  29056. #else
  29057. "lsr r6, r6, r7\n\t"
  29058. #endif
  29059. #ifdef WOLFSSL_KEIL
  29060. "orrs r3, r3, r6\n\t"
  29061. #elif defined(__clang__)
  29062. "orrs r3, r6\n\t"
  29063. #else
  29064. "orr r3, r6\n\t"
  29065. #endif
  29066. "ldr r4, [%[a], #44]\n\t"
  29067. "str r3, [%[r], #52]\n\t"
  29068. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29069. "lsrs r6, r4, #1\n\t"
  29070. #else
  29071. "lsr r6, r4, #1\n\t"
  29072. #endif
  29073. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29074. "lsls r4, r4, %[n]\n\t"
  29075. #else
  29076. "lsl r4, r4, %[n]\n\t"
  29077. #endif
  29078. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29079. "lsrs r6, r6, r7\n\t"
  29080. #else
  29081. "lsr r6, r6, r7\n\t"
  29082. #endif
  29083. #ifdef WOLFSSL_KEIL
  29084. "orrs r5, r5, r6\n\t"
  29085. #elif defined(__clang__)
  29086. "orrs r5, r6\n\t"
  29087. #else
  29088. "orr r5, r6\n\t"
  29089. #endif
  29090. "ldr r3, [%[a], #40]\n\t"
  29091. "str r5, [%[r], #48]\n\t"
  29092. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29093. "lsrs r6, r3, #1\n\t"
  29094. #else
  29095. "lsr r6, r3, #1\n\t"
  29096. #endif
  29097. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29098. "lsls r3, r3, %[n]\n\t"
  29099. #else
  29100. "lsl r3, r3, %[n]\n\t"
  29101. #endif
  29102. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29103. "lsrs r6, r6, r7\n\t"
  29104. #else
  29105. "lsr r6, r6, r7\n\t"
  29106. #endif
  29107. #ifdef WOLFSSL_KEIL
  29108. "orrs r4, r4, r6\n\t"
  29109. #elif defined(__clang__)
  29110. "orrs r4, r6\n\t"
  29111. #else
  29112. "orr r4, r6\n\t"
  29113. #endif
  29114. "ldr r5, [%[a], #36]\n\t"
  29115. "str r4, [%[r], #44]\n\t"
  29116. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29117. "lsrs r6, r5, #1\n\t"
  29118. #else
  29119. "lsr r6, r5, #1\n\t"
  29120. #endif
  29121. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29122. "lsls r5, r5, %[n]\n\t"
  29123. #else
  29124. "lsl r5, r5, %[n]\n\t"
  29125. #endif
  29126. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29127. "lsrs r6, r6, r7\n\t"
  29128. #else
  29129. "lsr r6, r6, r7\n\t"
  29130. #endif
  29131. #ifdef WOLFSSL_KEIL
  29132. "orrs r3, r3, r6\n\t"
  29133. #elif defined(__clang__)
  29134. "orrs r3, r6\n\t"
  29135. #else
  29136. "orr r3, r6\n\t"
  29137. #endif
  29138. "ldr r4, [%[a], #32]\n\t"
  29139. "str r3, [%[r], #40]\n\t"
  29140. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29141. "lsrs r6, r4, #1\n\t"
  29142. #else
  29143. "lsr r6, r4, #1\n\t"
  29144. #endif
  29145. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29146. "lsls r4, r4, %[n]\n\t"
  29147. #else
  29148. "lsl r4, r4, %[n]\n\t"
  29149. #endif
  29150. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29151. "lsrs r6, r6, r7\n\t"
  29152. #else
  29153. "lsr r6, r6, r7\n\t"
  29154. #endif
  29155. #ifdef WOLFSSL_KEIL
  29156. "orrs r5, r5, r6\n\t"
  29157. #elif defined(__clang__)
  29158. "orrs r5, r6\n\t"
  29159. #else
  29160. "orr r5, r6\n\t"
  29161. #endif
  29162. "ldr r3, [%[a], #28]\n\t"
  29163. "str r5, [%[r], #36]\n\t"
  29164. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29165. "lsrs r6, r3, #1\n\t"
  29166. #else
  29167. "lsr r6, r3, #1\n\t"
  29168. #endif
  29169. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29170. "lsls r3, r3, %[n]\n\t"
  29171. #else
  29172. "lsl r3, r3, %[n]\n\t"
  29173. #endif
  29174. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29175. "lsrs r6, r6, r7\n\t"
  29176. #else
  29177. "lsr r6, r6, r7\n\t"
  29178. #endif
  29179. #ifdef WOLFSSL_KEIL
  29180. "orrs r4, r4, r6\n\t"
  29181. #elif defined(__clang__)
  29182. "orrs r4, r6\n\t"
  29183. #else
  29184. "orr r4, r6\n\t"
  29185. #endif
  29186. "ldr r5, [%[a], #24]\n\t"
  29187. "str r4, [%[r], #32]\n\t"
  29188. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29189. "lsrs r6, r5, #1\n\t"
  29190. #else
  29191. "lsr r6, r5, #1\n\t"
  29192. #endif
  29193. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29194. "lsls r5, r5, %[n]\n\t"
  29195. #else
  29196. "lsl r5, r5, %[n]\n\t"
  29197. #endif
  29198. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29199. "lsrs r6, r6, r7\n\t"
  29200. #else
  29201. "lsr r6, r6, r7\n\t"
  29202. #endif
  29203. #ifdef WOLFSSL_KEIL
  29204. "orrs r3, r3, r6\n\t"
  29205. #elif defined(__clang__)
  29206. "orrs r3, r6\n\t"
  29207. #else
  29208. "orr r3, r6\n\t"
  29209. #endif
  29210. "ldr r4, [%[a], #20]\n\t"
  29211. "str r3, [%[r], #28]\n\t"
  29212. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29213. "lsrs r6, r4, #1\n\t"
  29214. #else
  29215. "lsr r6, r4, #1\n\t"
  29216. #endif
  29217. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29218. "lsls r4, r4, %[n]\n\t"
  29219. #else
  29220. "lsl r4, r4, %[n]\n\t"
  29221. #endif
  29222. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29223. "lsrs r6, r6, r7\n\t"
  29224. #else
  29225. "lsr r6, r6, r7\n\t"
  29226. #endif
  29227. #ifdef WOLFSSL_KEIL
  29228. "orrs r5, r5, r6\n\t"
  29229. #elif defined(__clang__)
  29230. "orrs r5, r6\n\t"
  29231. #else
  29232. "orr r5, r6\n\t"
  29233. #endif
  29234. "ldr r3, [%[a], #16]\n\t"
  29235. "str r5, [%[r], #24]\n\t"
  29236. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29237. "lsrs r6, r3, #1\n\t"
  29238. #else
  29239. "lsr r6, r3, #1\n\t"
  29240. #endif
  29241. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29242. "lsls r3, r3, %[n]\n\t"
  29243. #else
  29244. "lsl r3, r3, %[n]\n\t"
  29245. #endif
  29246. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29247. "lsrs r6, r6, r7\n\t"
  29248. #else
  29249. "lsr r6, r6, r7\n\t"
  29250. #endif
  29251. #ifdef WOLFSSL_KEIL
  29252. "orrs r4, r4, r6\n\t"
  29253. #elif defined(__clang__)
  29254. "orrs r4, r6\n\t"
  29255. #else
  29256. "orr r4, r6\n\t"
  29257. #endif
  29258. "ldr r5, [%[a], #12]\n\t"
  29259. "str r4, [%[r], #20]\n\t"
  29260. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29261. "lsrs r6, r5, #1\n\t"
  29262. #else
  29263. "lsr r6, r5, #1\n\t"
  29264. #endif
  29265. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29266. "lsls r5, r5, %[n]\n\t"
  29267. #else
  29268. "lsl r5, r5, %[n]\n\t"
  29269. #endif
  29270. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29271. "lsrs r6, r6, r7\n\t"
  29272. #else
  29273. "lsr r6, r6, r7\n\t"
  29274. #endif
  29275. #ifdef WOLFSSL_KEIL
  29276. "orrs r3, r3, r6\n\t"
  29277. #elif defined(__clang__)
  29278. "orrs r3, r6\n\t"
  29279. #else
  29280. "orr r3, r6\n\t"
  29281. #endif
  29282. "ldr r4, [%[a], #8]\n\t"
  29283. "str r3, [%[r], #16]\n\t"
  29284. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29285. "lsrs r6, r4, #1\n\t"
  29286. #else
  29287. "lsr r6, r4, #1\n\t"
  29288. #endif
  29289. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29290. "lsls r4, r4, %[n]\n\t"
  29291. #else
  29292. "lsl r4, r4, %[n]\n\t"
  29293. #endif
  29294. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29295. "lsrs r6, r6, r7\n\t"
  29296. #else
  29297. "lsr r6, r6, r7\n\t"
  29298. #endif
  29299. #ifdef WOLFSSL_KEIL
  29300. "orrs r5, r5, r6\n\t"
  29301. #elif defined(__clang__)
  29302. "orrs r5, r6\n\t"
  29303. #else
  29304. "orr r5, r6\n\t"
  29305. #endif
  29306. "ldr r3, [%[a], #4]\n\t"
  29307. "str r5, [%[r], #12]\n\t"
  29308. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29309. "lsrs r6, r3, #1\n\t"
  29310. #else
  29311. "lsr r6, r3, #1\n\t"
  29312. #endif
  29313. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29314. "lsls r3, r3, %[n]\n\t"
  29315. #else
  29316. "lsl r3, r3, %[n]\n\t"
  29317. #endif
  29318. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29319. "lsrs r6, r6, r7\n\t"
  29320. #else
  29321. "lsr r6, r6, r7\n\t"
  29322. #endif
  29323. #ifdef WOLFSSL_KEIL
  29324. "orrs r4, r4, r6\n\t"
  29325. #elif defined(__clang__)
  29326. "orrs r4, r6\n\t"
  29327. #else
  29328. "orr r4, r6\n\t"
  29329. #endif
  29330. "ldr r5, [%[a]]\n\t"
  29331. "str r4, [%[r], #8]\n\t"
  29332. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29333. "lsrs r6, r5, #1\n\t"
  29334. #else
  29335. "lsr r6, r5, #1\n\t"
  29336. #endif
  29337. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29338. "lsls r5, r5, %[n]\n\t"
  29339. #else
  29340. "lsl r5, r5, %[n]\n\t"
  29341. #endif
  29342. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29343. "lsrs r6, r6, r7\n\t"
  29344. #else
  29345. "lsr r6, r6, r7\n\t"
  29346. #endif
  29347. #ifdef WOLFSSL_KEIL
  29348. "orrs r3, r3, r6\n\t"
  29349. #elif defined(__clang__)
  29350. "orrs r3, r6\n\t"
  29351. #else
  29352. "orr r3, r6\n\t"
  29353. #endif
  29354. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29355. "subs %[a], %[a], #0x40\n\t"
  29356. #else
  29357. "sub %[a], %[a], #0x40\n\t"
  29358. #endif
  29359. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29360. "subs %[r], %[r], #0x40\n\t"
  29361. #else
  29362. "sub %[r], %[r], #0x40\n\t"
  29363. #endif
  29364. "ldr r4, [%[a], #60]\n\t"
  29365. "str r3, [%[r], #68]\n\t"
  29366. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29367. "lsrs r6, r4, #1\n\t"
  29368. #else
  29369. "lsr r6, r4, #1\n\t"
  29370. #endif
  29371. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29372. "lsls r4, r4, %[n]\n\t"
  29373. #else
  29374. "lsl r4, r4, %[n]\n\t"
  29375. #endif
  29376. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29377. "lsrs r6, r6, r7\n\t"
  29378. #else
  29379. "lsr r6, r6, r7\n\t"
  29380. #endif
  29381. #ifdef WOLFSSL_KEIL
  29382. "orrs r5, r5, r6\n\t"
  29383. #elif defined(__clang__)
  29384. "orrs r5, r6\n\t"
  29385. #else
  29386. "orr r5, r6\n\t"
  29387. #endif
  29388. "ldr r3, [%[a], #56]\n\t"
  29389. "str r5, [%[r], #64]\n\t"
  29390. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29391. "lsrs r6, r3, #1\n\t"
  29392. #else
  29393. "lsr r6, r3, #1\n\t"
  29394. #endif
  29395. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29396. "lsls r3, r3, %[n]\n\t"
  29397. #else
  29398. "lsl r3, r3, %[n]\n\t"
  29399. #endif
  29400. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29401. "lsrs r6, r6, r7\n\t"
  29402. #else
  29403. "lsr r6, r6, r7\n\t"
  29404. #endif
  29405. #ifdef WOLFSSL_KEIL
  29406. "orrs r4, r4, r6\n\t"
  29407. #elif defined(__clang__)
  29408. "orrs r4, r6\n\t"
  29409. #else
  29410. "orr r4, r6\n\t"
  29411. #endif
  29412. "ldr r5, [%[a], #52]\n\t"
  29413. "str r4, [%[r], #60]\n\t"
  29414. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29415. "lsrs r6, r5, #1\n\t"
  29416. #else
  29417. "lsr r6, r5, #1\n\t"
  29418. #endif
  29419. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29420. "lsls r5, r5, %[n]\n\t"
  29421. #else
  29422. "lsl r5, r5, %[n]\n\t"
  29423. #endif
  29424. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29425. "lsrs r6, r6, r7\n\t"
  29426. #else
  29427. "lsr r6, r6, r7\n\t"
  29428. #endif
  29429. #ifdef WOLFSSL_KEIL
  29430. "orrs r3, r3, r6\n\t"
  29431. #elif defined(__clang__)
  29432. "orrs r3, r6\n\t"
  29433. #else
  29434. "orr r3, r6\n\t"
  29435. #endif
  29436. "ldr r4, [%[a], #48]\n\t"
  29437. "str r3, [%[r], #56]\n\t"
  29438. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29439. "lsrs r6, r4, #1\n\t"
  29440. #else
  29441. "lsr r6, r4, #1\n\t"
  29442. #endif
  29443. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29444. "lsls r4, r4, %[n]\n\t"
  29445. #else
  29446. "lsl r4, r4, %[n]\n\t"
  29447. #endif
  29448. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29449. "lsrs r6, r6, r7\n\t"
  29450. #else
  29451. "lsr r6, r6, r7\n\t"
  29452. #endif
  29453. #ifdef WOLFSSL_KEIL
  29454. "orrs r5, r5, r6\n\t"
  29455. #elif defined(__clang__)
  29456. "orrs r5, r6\n\t"
  29457. #else
  29458. "orr r5, r6\n\t"
  29459. #endif
  29460. "ldr r3, [%[a], #44]\n\t"
  29461. "str r5, [%[r], #52]\n\t"
  29462. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29463. "lsrs r6, r3, #1\n\t"
  29464. #else
  29465. "lsr r6, r3, #1\n\t"
  29466. #endif
  29467. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29468. "lsls r3, r3, %[n]\n\t"
  29469. #else
  29470. "lsl r3, r3, %[n]\n\t"
  29471. #endif
  29472. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29473. "lsrs r6, r6, r7\n\t"
  29474. #else
  29475. "lsr r6, r6, r7\n\t"
  29476. #endif
  29477. #ifdef WOLFSSL_KEIL
  29478. "orrs r4, r4, r6\n\t"
  29479. #elif defined(__clang__)
  29480. "orrs r4, r6\n\t"
  29481. #else
  29482. "orr r4, r6\n\t"
  29483. #endif
  29484. "ldr r5, [%[a], #40]\n\t"
  29485. "str r4, [%[r], #48]\n\t"
  29486. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29487. "lsrs r6, r5, #1\n\t"
  29488. #else
  29489. "lsr r6, r5, #1\n\t"
  29490. #endif
  29491. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29492. "lsls r5, r5, %[n]\n\t"
  29493. #else
  29494. "lsl r5, r5, %[n]\n\t"
  29495. #endif
  29496. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29497. "lsrs r6, r6, r7\n\t"
  29498. #else
  29499. "lsr r6, r6, r7\n\t"
  29500. #endif
  29501. #ifdef WOLFSSL_KEIL
  29502. "orrs r3, r3, r6\n\t"
  29503. #elif defined(__clang__)
  29504. "orrs r3, r6\n\t"
  29505. #else
  29506. "orr r3, r6\n\t"
  29507. #endif
  29508. "ldr r4, [%[a], #36]\n\t"
  29509. "str r3, [%[r], #44]\n\t"
  29510. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29511. "lsrs r6, r4, #1\n\t"
  29512. #else
  29513. "lsr r6, r4, #1\n\t"
  29514. #endif
  29515. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29516. "lsls r4, r4, %[n]\n\t"
  29517. #else
  29518. "lsl r4, r4, %[n]\n\t"
  29519. #endif
  29520. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29521. "lsrs r6, r6, r7\n\t"
  29522. #else
  29523. "lsr r6, r6, r7\n\t"
  29524. #endif
  29525. #ifdef WOLFSSL_KEIL
  29526. "orrs r5, r5, r6\n\t"
  29527. #elif defined(__clang__)
  29528. "orrs r5, r6\n\t"
  29529. #else
  29530. "orr r5, r6\n\t"
  29531. #endif
  29532. "ldr r3, [%[a], #32]\n\t"
  29533. "str r5, [%[r], #40]\n\t"
  29534. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29535. "lsrs r6, r3, #1\n\t"
  29536. #else
  29537. "lsr r6, r3, #1\n\t"
  29538. #endif
  29539. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29540. "lsls r3, r3, %[n]\n\t"
  29541. #else
  29542. "lsl r3, r3, %[n]\n\t"
  29543. #endif
  29544. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29545. "lsrs r6, r6, r7\n\t"
  29546. #else
  29547. "lsr r6, r6, r7\n\t"
  29548. #endif
  29549. #ifdef WOLFSSL_KEIL
  29550. "orrs r4, r4, r6\n\t"
  29551. #elif defined(__clang__)
  29552. "orrs r4, r6\n\t"
  29553. #else
  29554. "orr r4, r6\n\t"
  29555. #endif
  29556. "ldr r5, [%[a], #28]\n\t"
  29557. "str r4, [%[r], #36]\n\t"
  29558. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29559. "lsrs r6, r5, #1\n\t"
  29560. #else
  29561. "lsr r6, r5, #1\n\t"
  29562. #endif
  29563. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29564. "lsls r5, r5, %[n]\n\t"
  29565. #else
  29566. "lsl r5, r5, %[n]\n\t"
  29567. #endif
  29568. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29569. "lsrs r6, r6, r7\n\t"
  29570. #else
  29571. "lsr r6, r6, r7\n\t"
  29572. #endif
  29573. #ifdef WOLFSSL_KEIL
  29574. "orrs r3, r3, r6\n\t"
  29575. #elif defined(__clang__)
  29576. "orrs r3, r6\n\t"
  29577. #else
  29578. "orr r3, r6\n\t"
  29579. #endif
  29580. "ldr r4, [%[a], #24]\n\t"
  29581. "str r3, [%[r], #32]\n\t"
  29582. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29583. "lsrs r6, r4, #1\n\t"
  29584. #else
  29585. "lsr r6, r4, #1\n\t"
  29586. #endif
  29587. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29588. "lsls r4, r4, %[n]\n\t"
  29589. #else
  29590. "lsl r4, r4, %[n]\n\t"
  29591. #endif
  29592. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29593. "lsrs r6, r6, r7\n\t"
  29594. #else
  29595. "lsr r6, r6, r7\n\t"
  29596. #endif
  29597. #ifdef WOLFSSL_KEIL
  29598. "orrs r5, r5, r6\n\t"
  29599. #elif defined(__clang__)
  29600. "orrs r5, r6\n\t"
  29601. #else
  29602. "orr r5, r6\n\t"
  29603. #endif
  29604. "ldr r3, [%[a], #20]\n\t"
  29605. "str r5, [%[r], #28]\n\t"
  29606. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29607. "lsrs r6, r3, #1\n\t"
  29608. #else
  29609. "lsr r6, r3, #1\n\t"
  29610. #endif
  29611. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29612. "lsls r3, r3, %[n]\n\t"
  29613. #else
  29614. "lsl r3, r3, %[n]\n\t"
  29615. #endif
  29616. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29617. "lsrs r6, r6, r7\n\t"
  29618. #else
  29619. "lsr r6, r6, r7\n\t"
  29620. #endif
  29621. #ifdef WOLFSSL_KEIL
  29622. "orrs r4, r4, r6\n\t"
  29623. #elif defined(__clang__)
  29624. "orrs r4, r6\n\t"
  29625. #else
  29626. "orr r4, r6\n\t"
  29627. #endif
  29628. "ldr r5, [%[a], #16]\n\t"
  29629. "str r4, [%[r], #24]\n\t"
  29630. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29631. "lsrs r6, r5, #1\n\t"
  29632. #else
  29633. "lsr r6, r5, #1\n\t"
  29634. #endif
  29635. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29636. "lsls r5, r5, %[n]\n\t"
  29637. #else
  29638. "lsl r5, r5, %[n]\n\t"
  29639. #endif
  29640. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29641. "lsrs r6, r6, r7\n\t"
  29642. #else
  29643. "lsr r6, r6, r7\n\t"
  29644. #endif
  29645. #ifdef WOLFSSL_KEIL
  29646. "orrs r3, r3, r6\n\t"
  29647. #elif defined(__clang__)
  29648. "orrs r3, r6\n\t"
  29649. #else
  29650. "orr r3, r6\n\t"
  29651. #endif
  29652. "ldr r4, [%[a], #12]\n\t"
  29653. "str r3, [%[r], #20]\n\t"
  29654. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29655. "lsrs r6, r4, #1\n\t"
  29656. #else
  29657. "lsr r6, r4, #1\n\t"
  29658. #endif
  29659. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29660. "lsls r4, r4, %[n]\n\t"
  29661. #else
  29662. "lsl r4, r4, %[n]\n\t"
  29663. #endif
  29664. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29665. "lsrs r6, r6, r7\n\t"
  29666. #else
  29667. "lsr r6, r6, r7\n\t"
  29668. #endif
  29669. #ifdef WOLFSSL_KEIL
  29670. "orrs r5, r5, r6\n\t"
  29671. #elif defined(__clang__)
  29672. "orrs r5, r6\n\t"
  29673. #else
  29674. "orr r5, r6\n\t"
  29675. #endif
  29676. "ldr r3, [%[a], #8]\n\t"
  29677. "str r5, [%[r], #16]\n\t"
  29678. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29679. "lsrs r6, r3, #1\n\t"
  29680. #else
  29681. "lsr r6, r3, #1\n\t"
  29682. #endif
  29683. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29684. "lsls r3, r3, %[n]\n\t"
  29685. #else
  29686. "lsl r3, r3, %[n]\n\t"
  29687. #endif
  29688. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29689. "lsrs r6, r6, r7\n\t"
  29690. #else
  29691. "lsr r6, r6, r7\n\t"
  29692. #endif
  29693. #ifdef WOLFSSL_KEIL
  29694. "orrs r4, r4, r6\n\t"
  29695. #elif defined(__clang__)
  29696. "orrs r4, r6\n\t"
  29697. #else
  29698. "orr r4, r6\n\t"
  29699. #endif
  29700. "ldr r5, [%[a], #4]\n\t"
  29701. "str r4, [%[r], #12]\n\t"
  29702. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29703. "lsrs r6, r5, #1\n\t"
  29704. #else
  29705. "lsr r6, r5, #1\n\t"
  29706. #endif
  29707. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29708. "lsls r5, r5, %[n]\n\t"
  29709. #else
  29710. "lsl r5, r5, %[n]\n\t"
  29711. #endif
  29712. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29713. "lsrs r6, r6, r7\n\t"
  29714. #else
  29715. "lsr r6, r6, r7\n\t"
  29716. #endif
  29717. #ifdef WOLFSSL_KEIL
  29718. "orrs r3, r3, r6\n\t"
  29719. #elif defined(__clang__)
  29720. "orrs r3, r6\n\t"
  29721. #else
  29722. "orr r3, r6\n\t"
  29723. #endif
  29724. "ldr r4, [%[a]]\n\t"
  29725. "str r3, [%[r], #8]\n\t"
  29726. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29727. "lsrs r6, r4, #1\n\t"
  29728. #else
  29729. "lsr r6, r4, #1\n\t"
  29730. #endif
  29731. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29732. "lsls r4, r4, %[n]\n\t"
  29733. #else
  29734. "lsl r4, r4, %[n]\n\t"
  29735. #endif
  29736. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29737. "lsrs r6, r6, r7\n\t"
  29738. #else
  29739. "lsr r6, r6, r7\n\t"
  29740. #endif
  29741. #ifdef WOLFSSL_KEIL
  29742. "orrs r5, r5, r6\n\t"
  29743. #elif defined(__clang__)
  29744. "orrs r5, r6\n\t"
  29745. #else
  29746. "orr r5, r6\n\t"
  29747. #endif
  29748. "str r4, [%[r]]\n\t"
  29749. "str r5, [%[r], #4]\n\t"
  29750. : [r] "+l" (r), [a] "+l" (a), [n] "+l" (n)
  29751. :
  29752. : "memory", "r3", "r4", "r5", "r6", "r7"
  29753. );
  29754. }
  29755. /* Modular exponentiate 2 to the e mod m. (r = 2^e mod m)
  29756. *
  29757. * r A single precision number that is the result of the operation.
  29758. * e A single precision number that is the exponent.
  29759. * bits The number of bits in the exponent.
  29760. * m A single precision number that is the modulus.
  29761. * returns 0 on success.
  29762. * returns MEMORY_E on dynamic memory allocation failure.
  29763. * returns MP_VAL when base is even.
  29764. */
  29765. static int sp_2048_mod_exp_2_64(sp_digit* r, const sp_digit* e, int bits,
  29766. const sp_digit* m)
  29767. {
  29768. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  29769. sp_digit* td = NULL;
  29770. #else
  29771. sp_digit td[193];
  29772. #endif
  29773. sp_digit* norm = NULL;
  29774. sp_digit* tmp = NULL;
  29775. sp_digit mp = 1;
  29776. sp_digit n;
  29777. sp_digit o;
  29778. sp_digit mask;
  29779. int i;
  29780. int c;
  29781. byte y;
  29782. int err = MP_OKAY;
  29783. if (bits == 0) {
  29784. err = MP_VAL;
  29785. }
  29786. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  29787. if (err == MP_OKAY) {
  29788. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 193, NULL,
  29789. DYNAMIC_TYPE_TMP_BUFFER);
  29790. if (td == NULL)
  29791. err = MEMORY_E;
  29792. }
  29793. #endif
  29794. if (err == MP_OKAY) {
  29795. norm = td;
  29796. tmp = td + 128;
  29797. sp_2048_mont_setup(m, &mp);
  29798. sp_2048_mont_norm_64(norm, m);
  29799. i = (bits - 1) / 32;
  29800. n = e[i--];
  29801. c = bits & 31;
  29802. if (c == 0) {
  29803. c = 32;
  29804. }
  29805. c -= bits % 5;
  29806. if (c == 32) {
  29807. c = 27;
  29808. }
  29809. if (c < 0) {
  29810. /* Number of bits in top word is less than number needed. */
  29811. c = -c;
  29812. y = (byte)(n << c);
  29813. n = e[i--];
  29814. y |= (byte)(n >> (64 - c));
  29815. n <<= c;
  29816. c = 64 - c;
  29817. }
  29818. else if (c == 0) {
  29819. /* All bits in top word used. */
  29820. y = (byte)n;
  29821. }
  29822. else {
  29823. y = (byte)(n >> c);
  29824. n <<= 32 - c;
  29825. }
  29826. sp_2048_lshift_64(r, norm, y);
  29827. for (; i>=0 || c>=5; ) {
  29828. if (c == 0) {
  29829. n = e[i--];
  29830. y = (byte)(n >> 27);
  29831. n <<= 5;
  29832. c = 27;
  29833. }
  29834. else if (c < 5) {
  29835. y = (byte)(n >> 27);
  29836. n = e[i--];
  29837. c = 5 - c;
  29838. y |= (byte)(n >> (32 - c));
  29839. n <<= c;
  29840. c = 32 - c;
  29841. }
  29842. else {
  29843. y = (byte)((n >> 27) & 0x1f);
  29844. n <<= 5;
  29845. c -= 5;
  29846. }
  29847. sp_2048_mont_sqr_64(r, r, m, mp);
  29848. sp_2048_mont_sqr_64(r, r, m, mp);
  29849. sp_2048_mont_sqr_64(r, r, m, mp);
  29850. sp_2048_mont_sqr_64(r, r, m, mp);
  29851. sp_2048_mont_sqr_64(r, r, m, mp);
  29852. sp_2048_lshift_64(r, r, y);
  29853. sp_2048_mul_d_64(tmp, norm, r[64]);
  29854. r[64] = 0;
  29855. o = sp_2048_add_64(r, r, tmp);
  29856. sp_2048_cond_sub_64(r, r, m, (sp_digit)0 - o);
  29857. }
  29858. XMEMSET(&r[64], 0, sizeof(sp_digit) * 64U);
  29859. sp_2048_mont_reduce_64(r, m, mp);
  29860. mask = 0 - (sp_2048_cmp_64(r, m) >= 0);
  29861. sp_2048_cond_sub_64(r, r, m, mask);
  29862. }
  29863. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  29864. if (td != NULL)
  29865. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  29866. #endif
  29867. return err;
  29868. }
  29869. #endif /* HAVE_FFDHE_2048 */
  29870. /* Perform the modular exponentiation for Diffie-Hellman.
  29871. *
  29872. * base Base.
  29873. * exp Array of bytes that is the exponent.
  29874. * expLen Length of data, in bytes, in exponent.
  29875. * mod Modulus.
  29876. * out Buffer to hold big-endian bytes of exponentiation result.
  29877. * Must be at least 256 bytes long.
  29878. * outLen Length, in bytes, of exponentiation result.
  29879. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  29880. * and MEMORY_E if memory allocation fails.
  29881. */
  29882. int sp_DhExp_2048(const mp_int* base, const byte* exp, word32 expLen,
  29883. const mp_int* mod, byte* out, word32* outLen)
  29884. {
  29885. int err = MP_OKAY;
  29886. sp_digit b[128];
  29887. sp_digit e[64];
  29888. sp_digit m[64];
  29889. sp_digit* r = b;
  29890. word32 i;
  29891. if (mp_count_bits(base) > 2048) {
  29892. err = MP_READ_E;
  29893. }
  29894. else if (expLen > 256) {
  29895. err = MP_READ_E;
  29896. }
  29897. else if (mp_count_bits(mod) != 2048) {
  29898. err = MP_READ_E;
  29899. }
  29900. else if (mp_iseven(mod)) {
  29901. err = MP_VAL;
  29902. }
  29903. if (err == MP_OKAY) {
  29904. sp_2048_from_mp(b, 64, base);
  29905. sp_2048_from_bin(e, 64, exp, expLen);
  29906. sp_2048_from_mp(m, 64, mod);
  29907. #ifdef HAVE_FFDHE_2048
  29908. if (base->used == 1 && base->dp[0] == 2 && m[63] == (sp_digit)-1)
  29909. err = sp_2048_mod_exp_2_64(r, e, expLen * 8, m);
  29910. else
  29911. #endif
  29912. err = sp_2048_mod_exp_64(r, b, e, expLen * 8, m, 0);
  29913. }
  29914. if (err == MP_OKAY) {
  29915. sp_2048_to_bin_64(r, out);
  29916. *outLen = 256;
  29917. for (i=0; i<256 && out[i] == 0; i++) {
  29918. /* Search for first non-zero. */
  29919. }
  29920. *outLen -= i;
  29921. XMEMMOVE(out, out + i, *outLen);
  29922. }
  29923. XMEMSET(e, 0, sizeof(e));
  29924. return err;
  29925. }
  29926. #endif /* WOLFSSL_HAVE_SP_DH */
  29927. /* Perform the modular exponentiation for Diffie-Hellman.
  29928. *
  29929. * base Base. MP integer.
  29930. * exp Exponent. MP integer.
  29931. * mod Modulus. MP integer.
  29932. * res Result. MP integer.
  29933. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  29934. * and MEMORY_E if memory allocation fails.
  29935. */
  29936. int sp_ModExp_1024(const mp_int* base, const mp_int* exp, const mp_int* mod,
  29937. mp_int* res)
  29938. {
  29939. int err = MP_OKAY;
  29940. sp_digit b[64];
  29941. sp_digit e[32];
  29942. sp_digit m[32];
  29943. sp_digit* r = b;
  29944. int expBits = mp_count_bits(exp);
  29945. if (mp_count_bits(base) > 1024) {
  29946. err = MP_READ_E;
  29947. }
  29948. else if (expBits > 1024) {
  29949. err = MP_READ_E;
  29950. }
  29951. else if (mp_count_bits(mod) != 1024) {
  29952. err = MP_READ_E;
  29953. }
  29954. else if (mp_iseven(mod)) {
  29955. err = MP_VAL;
  29956. }
  29957. if (err == MP_OKAY) {
  29958. sp_2048_from_mp(b, 32, base);
  29959. sp_2048_from_mp(e, 32, exp);
  29960. sp_2048_from_mp(m, 32, mod);
  29961. err = sp_2048_mod_exp_32(r, b, e, expBits, m, 0);
  29962. }
  29963. if (err == MP_OKAY) {
  29964. XMEMSET(r + 32, 0, sizeof(*r) * 32U);
  29965. err = sp_2048_to_mp(r, res);
  29966. res->used = mod->used;
  29967. mp_clamp(res);
  29968. }
  29969. XMEMSET(e, 0, sizeof(e));
  29970. return err;
  29971. }
  29972. #endif /* WOLFSSL_HAVE_SP_DH | (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) */
  29973. #endif /* !WOLFSSL_SP_NO_2048 */
  29974. #ifndef WOLFSSL_SP_NO_3072
  29975. /* Read big endian unsigned byte array into r.
  29976. *
  29977. * r A single precision integer.
  29978. * size Maximum number of bytes to convert
  29979. * a Byte array.
  29980. * n Number of bytes in array to read.
  29981. */
  29982. static void sp_3072_from_bin(sp_digit* r, int size, const byte* a, int n)
  29983. {
  29984. int i;
  29985. int j;
  29986. byte* d;
  29987. for (i = n - 1,j = 0; i >= 3; i -= 4) {
  29988. r[j] = ((sp_digit)a[i - 0] << 0) |
  29989. ((sp_digit)a[i - 1] << 8) |
  29990. ((sp_digit)a[i - 2] << 16) |
  29991. ((sp_digit)a[i - 3] << 24);
  29992. j++;
  29993. }
  29994. if (i >= 0) {
  29995. r[j] = 0;
  29996. d = (byte*)r;
  29997. switch (i) {
  29998. case 2: d[n - 1 - 2] = a[2]; //fallthrough
  29999. case 1: d[n - 1 - 1] = a[1]; //fallthrough
  30000. case 0: d[n - 1 - 0] = a[0]; //fallthrough
  30001. }
  30002. j++;
  30003. }
  30004. for (; j < size; j++) {
  30005. r[j] = 0;
  30006. }
  30007. }
  30008. /* Convert an mp_int to an array of sp_digit.
  30009. *
  30010. * r A single precision integer.
  30011. * size Maximum number of bytes to convert
  30012. * a A multi-precision integer.
  30013. */
  30014. static void sp_3072_from_mp(sp_digit* r, int size, const mp_int* a)
  30015. {
  30016. #if DIGIT_BIT == 32
  30017. int i;
  30018. int j = 0;
  30019. for (i = 0; i < size; i++) {
  30020. sp_digit mask =
  30021. (((sp_digit)(a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1;
  30022. r[i] = a->dp[j] & mask;
  30023. j += (int)(((sp_digit)1) -
  30024. (((sp_digit)(a->used - i - 2)) >> (SP_WORD_SIZE - 1)));
  30025. }
  30026. #elif DIGIT_BIT > 32
  30027. int i;
  30028. int j = 0;
  30029. word32 s = 0;
  30030. r[0] = 0;
  30031. for (i = 0; i < a->used && j < size; i++) {
  30032. r[j] |= ((sp_digit)a->dp[i] << s);
  30033. r[j] &= 0xffffffff;
  30034. s = 32U - s;
  30035. if (j + 1 >= size) {
  30036. break;
  30037. }
  30038. /* lint allow cast of mismatch word32 and mp_digit */
  30039. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  30040. while ((s + 32U) <= (word32)DIGIT_BIT) {
  30041. s += 32U;
  30042. r[j] &= 0xffffffff;
  30043. if (j + 1 >= size) {
  30044. break;
  30045. }
  30046. if (s < (word32)DIGIT_BIT) {
  30047. /* lint allow cast of mismatch word32 and mp_digit */
  30048. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  30049. }
  30050. else {
  30051. r[++j] = (sp_digit)0;
  30052. }
  30053. }
  30054. s = (word32)DIGIT_BIT - s;
  30055. }
  30056. for (j++; j < size; j++) {
  30057. r[j] = 0;
  30058. }
  30059. #else
  30060. int i;
  30061. int j = 0;
  30062. int s = 0;
  30063. r[0] = 0;
  30064. for (i = 0; i < a->used && j < size; i++) {
  30065. r[j] |= ((sp_digit)a->dp[i]) << s;
  30066. if (s + DIGIT_BIT >= 32) {
  30067. r[j] &= 0xffffffff;
  30068. if (j + 1 >= size) {
  30069. break;
  30070. }
  30071. s = 32 - s;
  30072. if (s == DIGIT_BIT) {
  30073. r[++j] = 0;
  30074. s = 0;
  30075. }
  30076. else {
  30077. r[++j] = a->dp[i] >> s;
  30078. s = DIGIT_BIT - s;
  30079. }
  30080. }
  30081. else {
  30082. s += DIGIT_BIT;
  30083. }
  30084. }
  30085. for (j++; j < size; j++) {
  30086. r[j] = 0;
  30087. }
  30088. #endif
  30089. }
  30090. /* Write r as big endian to byte array.
  30091. * Fixed length number of bytes written: 384
  30092. *
  30093. * r A single precision integer.
  30094. * a Byte array.
  30095. */
  30096. static void sp_3072_to_bin_96(sp_digit* r, byte* a)
  30097. {
  30098. int i;
  30099. int j = 0;
  30100. for (i = 95; i >= 0; i--) {
  30101. a[j++] = r[i] >> 24;
  30102. a[j++] = r[i] >> 16;
  30103. a[j++] = r[i] >> 8;
  30104. a[j++] = r[i] >> 0;
  30105. }
  30106. }
  30107. #if (defined(WOLFSSL_HAVE_SP_RSA) && (!defined(WOLFSSL_RSA_PUBLIC_ONLY) || !defined(WOLFSSL_SP_SMALL))) || defined(WOLFSSL_HAVE_SP_DH)
  30108. /* Normalize the values in each word to 32.
  30109. *
  30110. * a Array of sp_digit to normalize.
  30111. */
  30112. #define sp_3072_norm_96(a)
  30113. #endif /* (WOLFSSL_HAVE_SP_RSA && (!WOLFSSL_RSA_PUBLIC_ONLY || !WOLFSSL_SP_SMALL)) || WOLFSSL_HAVE_SP_DH */
  30114. /* Normalize the values in each word to 32.
  30115. *
  30116. * a Array of sp_digit to normalize.
  30117. */
  30118. #define sp_3072_norm_96(a)
  30119. #ifndef WOLFSSL_SP_SMALL
  30120. #ifndef WOLFSSL_SP_LARGE_CODE
  30121. /* Multiply a and b into r. (r = a * b)
  30122. *
  30123. * r A single precision integer.
  30124. * a A single precision integer.
  30125. * b A single precision integer.
  30126. */
  30127. SP_NOINLINE static void sp_3072_mul_12(sp_digit* r, const sp_digit* a,
  30128. const sp_digit* b)
  30129. {
  30130. sp_digit t[12 * 2];
  30131. sp_digit* tmp = t;
  30132. __asm__ __volatile__ (
  30133. "movs r3, #0\n\t"
  30134. "movs r4, #0\n\t"
  30135. "mov r8, r3\n\t"
  30136. "mov r11, %[tmp]\n\t"
  30137. "mov r9, %[a]\n\t"
  30138. "mov r10, %[b]\n\t"
  30139. "movs r6, #48\n\t"
  30140. "add r6, r6, r9\n\t"
  30141. "mov r12, r6\n\t"
  30142. "\n"
  30143. "L_sp_3072_mul_12_words_%=:\n\t"
  30144. "movs %[tmp], #0\n\t"
  30145. "movs r5, #0\n\t"
  30146. "movs r6, #44\n\t"
  30147. "mov %[a], r8\n\t"
  30148. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30149. "subs %[a], %[a], r6\n\t"
  30150. #else
  30151. "sub %[a], %[a], r6\n\t"
  30152. #endif
  30153. #ifdef WOLFSSL_KEIL
  30154. "sbcs r6, r6, r6\n\t"
  30155. #elif defined(__clang__)
  30156. "sbcs r6, r6\n\t"
  30157. #else
  30158. "sbc r6, r6\n\t"
  30159. #endif
  30160. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30161. "mvns r6, r6\n\t"
  30162. #else
  30163. "mvn r6, r6\n\t"
  30164. #endif
  30165. #ifdef WOLFSSL_KEIL
  30166. "ands %[a], %[a], r6\n\t"
  30167. #elif defined(__clang__)
  30168. "ands %[a], r6\n\t"
  30169. #else
  30170. "and %[a], r6\n\t"
  30171. #endif
  30172. "mov %[b], r8\n\t"
  30173. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30174. "subs %[b], %[b], %[a]\n\t"
  30175. #else
  30176. "sub %[b], %[b], %[a]\n\t"
  30177. #endif
  30178. "add %[a], %[a], r9\n\t"
  30179. "add %[b], %[b], r10\n\t"
  30180. "\n"
  30181. "L_sp_3072_mul_12_mul_%=:\n\t"
  30182. "# Multiply Start\n\t"
  30183. "ldrh r6, [%[a]]\n\t"
  30184. "ldrh r7, [%[b]]\n\t"
  30185. #ifdef WOLFSSL_KEIL
  30186. "muls r7, r6, r7\n\t"
  30187. #elif defined(__clang__)
  30188. "muls r7, r6\n\t"
  30189. #else
  30190. "mul r7, r6\n\t"
  30191. #endif
  30192. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30193. "adds r3, r3, r7\n\t"
  30194. #else
  30195. "add r3, r3, r7\n\t"
  30196. #endif
  30197. #ifdef WOLFSSL_KEIL
  30198. "adcs r4, r4, %[tmp]\n\t"
  30199. #elif defined(__clang__)
  30200. "adcs r4, %[tmp]\n\t"
  30201. #else
  30202. "adc r4, %[tmp]\n\t"
  30203. #endif
  30204. #ifdef WOLFSSL_KEIL
  30205. "adcs r5, r5, %[tmp]\n\t"
  30206. #elif defined(__clang__)
  30207. "adcs r5, %[tmp]\n\t"
  30208. #else
  30209. "adc r5, %[tmp]\n\t"
  30210. #endif
  30211. "ldr r7, [%[b]]\n\t"
  30212. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30213. "lsrs r7, r7, #16\n\t"
  30214. #else
  30215. "lsr r7, r7, #16\n\t"
  30216. #endif
  30217. #ifdef WOLFSSL_KEIL
  30218. "muls r6, r7, r6\n\t"
  30219. #elif defined(__clang__)
  30220. "muls r6, r7\n\t"
  30221. #else
  30222. "mul r6, r7\n\t"
  30223. #endif
  30224. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30225. "lsrs r7, r6, #16\n\t"
  30226. #else
  30227. "lsr r7, r6, #16\n\t"
  30228. #endif
  30229. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30230. "lsls r6, r6, #16\n\t"
  30231. #else
  30232. "lsl r6, r6, #16\n\t"
  30233. #endif
  30234. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30235. "adds r3, r3, r6\n\t"
  30236. #else
  30237. "add r3, r3, r6\n\t"
  30238. #endif
  30239. #ifdef WOLFSSL_KEIL
  30240. "adcs r4, r4, r7\n\t"
  30241. #elif defined(__clang__)
  30242. "adcs r4, r7\n\t"
  30243. #else
  30244. "adc r4, r7\n\t"
  30245. #endif
  30246. #ifdef WOLFSSL_KEIL
  30247. "adcs r5, r5, %[tmp]\n\t"
  30248. #elif defined(__clang__)
  30249. "adcs r5, %[tmp]\n\t"
  30250. #else
  30251. "adc r5, %[tmp]\n\t"
  30252. #endif
  30253. "ldr r6, [%[a]]\n\t"
  30254. "ldr r7, [%[b]]\n\t"
  30255. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30256. "lsrs r6, r6, #16\n\t"
  30257. #else
  30258. "lsr r6, r6, #16\n\t"
  30259. #endif
  30260. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30261. "lsrs r7, r7, #16\n\t"
  30262. #else
  30263. "lsr r7, r7, #16\n\t"
  30264. #endif
  30265. #ifdef WOLFSSL_KEIL
  30266. "muls r7, r6, r7\n\t"
  30267. #elif defined(__clang__)
  30268. "muls r7, r6\n\t"
  30269. #else
  30270. "mul r7, r6\n\t"
  30271. #endif
  30272. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30273. "adds r4, r4, r7\n\t"
  30274. #else
  30275. "add r4, r4, r7\n\t"
  30276. #endif
  30277. #ifdef WOLFSSL_KEIL
  30278. "adcs r5, r5, %[tmp]\n\t"
  30279. #elif defined(__clang__)
  30280. "adcs r5, %[tmp]\n\t"
  30281. #else
  30282. "adc r5, %[tmp]\n\t"
  30283. #endif
  30284. "ldrh r7, [%[b]]\n\t"
  30285. #ifdef WOLFSSL_KEIL
  30286. "muls r6, r7, r6\n\t"
  30287. #elif defined(__clang__)
  30288. "muls r6, r7\n\t"
  30289. #else
  30290. "mul r6, r7\n\t"
  30291. #endif
  30292. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30293. "lsrs r7, r6, #16\n\t"
  30294. #else
  30295. "lsr r7, r6, #16\n\t"
  30296. #endif
  30297. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30298. "lsls r6, r6, #16\n\t"
  30299. #else
  30300. "lsl r6, r6, #16\n\t"
  30301. #endif
  30302. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30303. "adds r3, r3, r6\n\t"
  30304. #else
  30305. "add r3, r3, r6\n\t"
  30306. #endif
  30307. #ifdef WOLFSSL_KEIL
  30308. "adcs r4, r4, r7\n\t"
  30309. #elif defined(__clang__)
  30310. "adcs r4, r7\n\t"
  30311. #else
  30312. "adc r4, r7\n\t"
  30313. #endif
  30314. #ifdef WOLFSSL_KEIL
  30315. "adcs r5, r5, %[tmp]\n\t"
  30316. #elif defined(__clang__)
  30317. "adcs r5, %[tmp]\n\t"
  30318. #else
  30319. "adc r5, %[tmp]\n\t"
  30320. #endif
  30321. "# Multiply Done\n\t"
  30322. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30323. "adds %[a], %[a], #4\n\t"
  30324. #else
  30325. "add %[a], %[a], #4\n\t"
  30326. #endif
  30327. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30328. "subs %[b], %[b], #4\n\t"
  30329. #else
  30330. "sub %[b], %[b], #4\n\t"
  30331. #endif
  30332. "cmp %[a], r12\n\t"
  30333. "beq L_sp_3072_mul_12_done_mul_%=\n\t"
  30334. "mov r6, r8\n\t"
  30335. "add r6, r6, r9\n\t"
  30336. "cmp %[a], r6\n\t"
  30337. "ble L_sp_3072_mul_12_mul_%=\n\t"
  30338. "\n"
  30339. "L_sp_3072_mul_12_done_mul_%=:\n\t"
  30340. "mov %[tmp], r11\n\t"
  30341. "mov r7, r8\n\t"
  30342. "str r3, [%[tmp], r7]\n\t"
  30343. "movs r3, r4\n\t"
  30344. "movs r4, r5\n\t"
  30345. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30346. "adds r7, r7, #4\n\t"
  30347. #else
  30348. "add r7, r7, #4\n\t"
  30349. #endif
  30350. "mov r8, r7\n\t"
  30351. "movs r6, #0x58\n\t"
  30352. "cmp r7, r6\n\t"
  30353. "ble L_sp_3072_mul_12_words_%=\n\t"
  30354. "str r3, [%[tmp], r7]\n\t"
  30355. "mov %[a], r9\n\t"
  30356. "mov %[b], r10\n\t"
  30357. : [a] "+l" (a), [b] "+l" (b), [tmp] "+l" (tmp)
  30358. :
  30359. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  30360. );
  30361. XMEMCPY(r, t, sizeof(t));
  30362. }
  30363. #else
  30364. /* Multiply a and b into r. (r = a * b)
  30365. *
  30366. * r A single precision integer.
  30367. * a A single precision integer.
  30368. * b A single precision integer.
  30369. */
  30370. SP_NOINLINE static void sp_3072_mul_12(sp_digit* r, const sp_digit* a,
  30371. const sp_digit* b)
  30372. {
  30373. __asm__ __volatile__ (
  30374. "sub sp, sp, #48\n\t"
  30375. "mov r8, %[r]\n\t"
  30376. "mov r9, %[a]\n\t"
  30377. "mov r10, %[b]\n\t"
  30378. "movs %[r], #0\n\t"
  30379. "# A[0] * B[0]\n\t"
  30380. "ldr %[a], [%[a]]\n\t"
  30381. "ldr %[b], [%[b]]\n\t"
  30382. "uxth r6, %[a]\n\t"
  30383. "uxth r3, %[b]\n\t"
  30384. #ifdef WOLFSSL_KEIL
  30385. "muls r3, r6, r3\n\t"
  30386. #elif defined(__clang__)
  30387. "muls r3, r6\n\t"
  30388. #else
  30389. "mul r3, r6\n\t"
  30390. #endif
  30391. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30392. "lsrs r7, %[b], #16\n\t"
  30393. #else
  30394. "lsr r7, %[b], #16\n\t"
  30395. #endif
  30396. #ifdef WOLFSSL_KEIL
  30397. "muls r6, r7, r6\n\t"
  30398. #elif defined(__clang__)
  30399. "muls r6, r7\n\t"
  30400. #else
  30401. "mul r6, r7\n\t"
  30402. #endif
  30403. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30404. "lsrs r4, r6, #16\n\t"
  30405. #else
  30406. "lsr r4, r6, #16\n\t"
  30407. #endif
  30408. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30409. "lsls r6, r6, #16\n\t"
  30410. #else
  30411. "lsl r6, r6, #16\n\t"
  30412. #endif
  30413. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30414. "adds r3, r3, r6\n\t"
  30415. #else
  30416. "add r3, r3, r6\n\t"
  30417. #endif
  30418. #ifdef WOLFSSL_KEIL
  30419. "adcs r4, r4, %[r]\n\t"
  30420. #elif defined(__clang__)
  30421. "adcs r4, %[r]\n\t"
  30422. #else
  30423. "adc r4, %[r]\n\t"
  30424. #endif
  30425. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30426. "lsrs r6, %[a], #16\n\t"
  30427. #else
  30428. "lsr r6, %[a], #16\n\t"
  30429. #endif
  30430. #ifdef WOLFSSL_KEIL
  30431. "muls r7, r6, r7\n\t"
  30432. #elif defined(__clang__)
  30433. "muls r7, r6\n\t"
  30434. #else
  30435. "mul r7, r6\n\t"
  30436. #endif
  30437. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30438. "adds r4, r4, r7\n\t"
  30439. #else
  30440. "add r4, r4, r7\n\t"
  30441. #endif
  30442. "uxth r7, %[b]\n\t"
  30443. #ifdef WOLFSSL_KEIL
  30444. "muls r6, r7, r6\n\t"
  30445. #elif defined(__clang__)
  30446. "muls r6, r7\n\t"
  30447. #else
  30448. "mul r6, r7\n\t"
  30449. #endif
  30450. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30451. "lsrs r7, r6, #16\n\t"
  30452. #else
  30453. "lsr r7, r6, #16\n\t"
  30454. #endif
  30455. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30456. "lsls r6, r6, #16\n\t"
  30457. #else
  30458. "lsl r6, r6, #16\n\t"
  30459. #endif
  30460. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30461. "adds r3, r3, r6\n\t"
  30462. #else
  30463. "add r3, r3, r6\n\t"
  30464. #endif
  30465. #ifdef WOLFSSL_KEIL
  30466. "adcs r4, r4, r7\n\t"
  30467. #elif defined(__clang__)
  30468. "adcs r4, r7\n\t"
  30469. #else
  30470. "adc r4, r7\n\t"
  30471. #endif
  30472. "movs r5, #0\n\t"
  30473. "str r3, [sp]\n\t"
  30474. "# A[0] * B[1]\n\t"
  30475. "movs r3, #0\n\t"
  30476. "mov %[a], r9\n\t"
  30477. "mov %[b], r10\n\t"
  30478. "ldr %[a], [%[a]]\n\t"
  30479. "ldr %[b], [%[b], #4]\n\t"
  30480. "uxth r6, %[a]\n\t"
  30481. "uxth r7, %[b]\n\t"
  30482. #ifdef WOLFSSL_KEIL
  30483. "muls r7, r6, r7\n\t"
  30484. #elif defined(__clang__)
  30485. "muls r7, r6\n\t"
  30486. #else
  30487. "mul r7, r6\n\t"
  30488. #endif
  30489. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30490. "adds r4, r4, r7\n\t"
  30491. #else
  30492. "add r4, r4, r7\n\t"
  30493. #endif
  30494. #ifdef WOLFSSL_KEIL
  30495. "adcs r5, r5, %[r]\n\t"
  30496. #elif defined(__clang__)
  30497. "adcs r5, %[r]\n\t"
  30498. #else
  30499. "adc r5, %[r]\n\t"
  30500. #endif
  30501. #ifdef WOLFSSL_KEIL
  30502. "adcs r3, r3, %[r]\n\t"
  30503. #elif defined(__clang__)
  30504. "adcs r3, %[r]\n\t"
  30505. #else
  30506. "adc r3, %[r]\n\t"
  30507. #endif
  30508. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30509. "lsrs r7, %[b], #16\n\t"
  30510. #else
  30511. "lsr r7, %[b], #16\n\t"
  30512. #endif
  30513. #ifdef WOLFSSL_KEIL
  30514. "muls r6, r7, r6\n\t"
  30515. #elif defined(__clang__)
  30516. "muls r6, r7\n\t"
  30517. #else
  30518. "mul r6, r7\n\t"
  30519. #endif
  30520. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30521. "lsrs r7, r6, #16\n\t"
  30522. #else
  30523. "lsr r7, r6, #16\n\t"
  30524. #endif
  30525. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30526. "lsls r6, r6, #16\n\t"
  30527. #else
  30528. "lsl r6, r6, #16\n\t"
  30529. #endif
  30530. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30531. "adds r4, r4, r6\n\t"
  30532. #else
  30533. "add r4, r4, r6\n\t"
  30534. #endif
  30535. #ifdef WOLFSSL_KEIL
  30536. "adcs r5, r5, r7\n\t"
  30537. #elif defined(__clang__)
  30538. "adcs r5, r7\n\t"
  30539. #else
  30540. "adc r5, r7\n\t"
  30541. #endif
  30542. #ifdef WOLFSSL_KEIL
  30543. "adcs r3, r3, %[r]\n\t"
  30544. #elif defined(__clang__)
  30545. "adcs r3, %[r]\n\t"
  30546. #else
  30547. "adc r3, %[r]\n\t"
  30548. #endif
  30549. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30550. "lsrs r6, %[a], #16\n\t"
  30551. #else
  30552. "lsr r6, %[a], #16\n\t"
  30553. #endif
  30554. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30555. "lsrs r7, %[b], #16\n\t"
  30556. #else
  30557. "lsr r7, %[b], #16\n\t"
  30558. #endif
  30559. #ifdef WOLFSSL_KEIL
  30560. "muls r7, r6, r7\n\t"
  30561. #elif defined(__clang__)
  30562. "muls r7, r6\n\t"
  30563. #else
  30564. "mul r7, r6\n\t"
  30565. #endif
  30566. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30567. "adds r5, r5, r7\n\t"
  30568. #else
  30569. "add r5, r5, r7\n\t"
  30570. #endif
  30571. #ifdef WOLFSSL_KEIL
  30572. "adcs r3, r3, %[r]\n\t"
  30573. #elif defined(__clang__)
  30574. "adcs r3, %[r]\n\t"
  30575. #else
  30576. "adc r3, %[r]\n\t"
  30577. #endif
  30578. "uxth r7, %[b]\n\t"
  30579. #ifdef WOLFSSL_KEIL
  30580. "muls r6, r7, r6\n\t"
  30581. #elif defined(__clang__)
  30582. "muls r6, r7\n\t"
  30583. #else
  30584. "mul r6, r7\n\t"
  30585. #endif
  30586. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30587. "lsrs r7, r6, #16\n\t"
  30588. #else
  30589. "lsr r7, r6, #16\n\t"
  30590. #endif
  30591. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30592. "lsls r6, r6, #16\n\t"
  30593. #else
  30594. "lsl r6, r6, #16\n\t"
  30595. #endif
  30596. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30597. "adds r4, r4, r6\n\t"
  30598. #else
  30599. "add r4, r4, r6\n\t"
  30600. #endif
  30601. #ifdef WOLFSSL_KEIL
  30602. "adcs r5, r5, r7\n\t"
  30603. #elif defined(__clang__)
  30604. "adcs r5, r7\n\t"
  30605. #else
  30606. "adc r5, r7\n\t"
  30607. #endif
  30608. #ifdef WOLFSSL_KEIL
  30609. "adcs r3, r3, %[r]\n\t"
  30610. #elif defined(__clang__)
  30611. "adcs r3, %[r]\n\t"
  30612. #else
  30613. "adc r3, %[r]\n\t"
  30614. #endif
  30615. "# A[1] * B[0]\n\t"
  30616. "mov %[a], r9\n\t"
  30617. "mov %[b], r10\n\t"
  30618. "ldr %[a], [%[a], #4]\n\t"
  30619. "ldr %[b], [%[b]]\n\t"
  30620. "uxth r6, %[a]\n\t"
  30621. "uxth r7, %[b]\n\t"
  30622. #ifdef WOLFSSL_KEIL
  30623. "muls r7, r6, r7\n\t"
  30624. #elif defined(__clang__)
  30625. "muls r7, r6\n\t"
  30626. #else
  30627. "mul r7, r6\n\t"
  30628. #endif
  30629. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30630. "adds r4, r4, r7\n\t"
  30631. #else
  30632. "add r4, r4, r7\n\t"
  30633. #endif
  30634. #ifdef WOLFSSL_KEIL
  30635. "adcs r5, r5, %[r]\n\t"
  30636. #elif defined(__clang__)
  30637. "adcs r5, %[r]\n\t"
  30638. #else
  30639. "adc r5, %[r]\n\t"
  30640. #endif
  30641. #ifdef WOLFSSL_KEIL
  30642. "adcs r3, r3, %[r]\n\t"
  30643. #elif defined(__clang__)
  30644. "adcs r3, %[r]\n\t"
  30645. #else
  30646. "adc r3, %[r]\n\t"
  30647. #endif
  30648. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30649. "lsrs r7, %[b], #16\n\t"
  30650. #else
  30651. "lsr r7, %[b], #16\n\t"
  30652. #endif
  30653. #ifdef WOLFSSL_KEIL
  30654. "muls r6, r7, r6\n\t"
  30655. #elif defined(__clang__)
  30656. "muls r6, r7\n\t"
  30657. #else
  30658. "mul r6, r7\n\t"
  30659. #endif
  30660. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30661. "lsrs r7, r6, #16\n\t"
  30662. #else
  30663. "lsr r7, r6, #16\n\t"
  30664. #endif
  30665. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30666. "lsls r6, r6, #16\n\t"
  30667. #else
  30668. "lsl r6, r6, #16\n\t"
  30669. #endif
  30670. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30671. "adds r4, r4, r6\n\t"
  30672. #else
  30673. "add r4, r4, r6\n\t"
  30674. #endif
  30675. #ifdef WOLFSSL_KEIL
  30676. "adcs r5, r5, r7\n\t"
  30677. #elif defined(__clang__)
  30678. "adcs r5, r7\n\t"
  30679. #else
  30680. "adc r5, r7\n\t"
  30681. #endif
  30682. #ifdef WOLFSSL_KEIL
  30683. "adcs r3, r3, %[r]\n\t"
  30684. #elif defined(__clang__)
  30685. "adcs r3, %[r]\n\t"
  30686. #else
  30687. "adc r3, %[r]\n\t"
  30688. #endif
  30689. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30690. "lsrs r6, %[a], #16\n\t"
  30691. #else
  30692. "lsr r6, %[a], #16\n\t"
  30693. #endif
  30694. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30695. "lsrs r7, %[b], #16\n\t"
  30696. #else
  30697. "lsr r7, %[b], #16\n\t"
  30698. #endif
  30699. #ifdef WOLFSSL_KEIL
  30700. "muls r7, r6, r7\n\t"
  30701. #elif defined(__clang__)
  30702. "muls r7, r6\n\t"
  30703. #else
  30704. "mul r7, r6\n\t"
  30705. #endif
  30706. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30707. "adds r5, r5, r7\n\t"
  30708. #else
  30709. "add r5, r5, r7\n\t"
  30710. #endif
  30711. #ifdef WOLFSSL_KEIL
  30712. "adcs r3, r3, %[r]\n\t"
  30713. #elif defined(__clang__)
  30714. "adcs r3, %[r]\n\t"
  30715. #else
  30716. "adc r3, %[r]\n\t"
  30717. #endif
  30718. "uxth r7, %[b]\n\t"
  30719. #ifdef WOLFSSL_KEIL
  30720. "muls r6, r7, r6\n\t"
  30721. #elif defined(__clang__)
  30722. "muls r6, r7\n\t"
  30723. #else
  30724. "mul r6, r7\n\t"
  30725. #endif
  30726. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30727. "lsrs r7, r6, #16\n\t"
  30728. #else
  30729. "lsr r7, r6, #16\n\t"
  30730. #endif
  30731. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30732. "lsls r6, r6, #16\n\t"
  30733. #else
  30734. "lsl r6, r6, #16\n\t"
  30735. #endif
  30736. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30737. "adds r4, r4, r6\n\t"
  30738. #else
  30739. "add r4, r4, r6\n\t"
  30740. #endif
  30741. #ifdef WOLFSSL_KEIL
  30742. "adcs r5, r5, r7\n\t"
  30743. #elif defined(__clang__)
  30744. "adcs r5, r7\n\t"
  30745. #else
  30746. "adc r5, r7\n\t"
  30747. #endif
  30748. #ifdef WOLFSSL_KEIL
  30749. "adcs r3, r3, %[r]\n\t"
  30750. #elif defined(__clang__)
  30751. "adcs r3, %[r]\n\t"
  30752. #else
  30753. "adc r3, %[r]\n\t"
  30754. #endif
  30755. "str r4, [sp, #4]\n\t"
  30756. "# A[2] * B[0]\n\t"
  30757. "movs r4, #0\n\t"
  30758. "mov %[a], r9\n\t"
  30759. "mov %[b], r10\n\t"
  30760. "ldr %[a], [%[a], #8]\n\t"
  30761. "ldr %[b], [%[b]]\n\t"
  30762. "uxth r6, %[a]\n\t"
  30763. "uxth r7, %[b]\n\t"
  30764. #ifdef WOLFSSL_KEIL
  30765. "muls r7, r6, r7\n\t"
  30766. #elif defined(__clang__)
  30767. "muls r7, r6\n\t"
  30768. #else
  30769. "mul r7, r6\n\t"
  30770. #endif
  30771. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30772. "adds r5, r5, r7\n\t"
  30773. #else
  30774. "add r5, r5, r7\n\t"
  30775. #endif
  30776. #ifdef WOLFSSL_KEIL
  30777. "adcs r3, r3, %[r]\n\t"
  30778. #elif defined(__clang__)
  30779. "adcs r3, %[r]\n\t"
  30780. #else
  30781. "adc r3, %[r]\n\t"
  30782. #endif
  30783. #ifdef WOLFSSL_KEIL
  30784. "adcs r4, r4, %[r]\n\t"
  30785. #elif defined(__clang__)
  30786. "adcs r4, %[r]\n\t"
  30787. #else
  30788. "adc r4, %[r]\n\t"
  30789. #endif
  30790. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30791. "lsrs r7, %[b], #16\n\t"
  30792. #else
  30793. "lsr r7, %[b], #16\n\t"
  30794. #endif
  30795. #ifdef WOLFSSL_KEIL
  30796. "muls r6, r7, r6\n\t"
  30797. #elif defined(__clang__)
  30798. "muls r6, r7\n\t"
  30799. #else
  30800. "mul r6, r7\n\t"
  30801. #endif
  30802. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30803. "lsrs r7, r6, #16\n\t"
  30804. #else
  30805. "lsr r7, r6, #16\n\t"
  30806. #endif
  30807. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30808. "lsls r6, r6, #16\n\t"
  30809. #else
  30810. "lsl r6, r6, #16\n\t"
  30811. #endif
  30812. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30813. "adds r5, r5, r6\n\t"
  30814. #else
  30815. "add r5, r5, r6\n\t"
  30816. #endif
  30817. #ifdef WOLFSSL_KEIL
  30818. "adcs r3, r3, r7\n\t"
  30819. #elif defined(__clang__)
  30820. "adcs r3, r7\n\t"
  30821. #else
  30822. "adc r3, r7\n\t"
  30823. #endif
  30824. #ifdef WOLFSSL_KEIL
  30825. "adcs r4, r4, %[r]\n\t"
  30826. #elif defined(__clang__)
  30827. "adcs r4, %[r]\n\t"
  30828. #else
  30829. "adc r4, %[r]\n\t"
  30830. #endif
  30831. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30832. "lsrs r6, %[a], #16\n\t"
  30833. #else
  30834. "lsr r6, %[a], #16\n\t"
  30835. #endif
  30836. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30837. "lsrs r7, %[b], #16\n\t"
  30838. #else
  30839. "lsr r7, %[b], #16\n\t"
  30840. #endif
  30841. #ifdef WOLFSSL_KEIL
  30842. "muls r7, r6, r7\n\t"
  30843. #elif defined(__clang__)
  30844. "muls r7, r6\n\t"
  30845. #else
  30846. "mul r7, r6\n\t"
  30847. #endif
  30848. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30849. "adds r3, r3, r7\n\t"
  30850. #else
  30851. "add r3, r3, r7\n\t"
  30852. #endif
  30853. #ifdef WOLFSSL_KEIL
  30854. "adcs r4, r4, %[r]\n\t"
  30855. #elif defined(__clang__)
  30856. "adcs r4, %[r]\n\t"
  30857. #else
  30858. "adc r4, %[r]\n\t"
  30859. #endif
  30860. "uxth r7, %[b]\n\t"
  30861. #ifdef WOLFSSL_KEIL
  30862. "muls r6, r7, r6\n\t"
  30863. #elif defined(__clang__)
  30864. "muls r6, r7\n\t"
  30865. #else
  30866. "mul r6, r7\n\t"
  30867. #endif
  30868. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30869. "lsrs r7, r6, #16\n\t"
  30870. #else
  30871. "lsr r7, r6, #16\n\t"
  30872. #endif
  30873. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30874. "lsls r6, r6, #16\n\t"
  30875. #else
  30876. "lsl r6, r6, #16\n\t"
  30877. #endif
  30878. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30879. "adds r5, r5, r6\n\t"
  30880. #else
  30881. "add r5, r5, r6\n\t"
  30882. #endif
  30883. #ifdef WOLFSSL_KEIL
  30884. "adcs r3, r3, r7\n\t"
  30885. #elif defined(__clang__)
  30886. "adcs r3, r7\n\t"
  30887. #else
  30888. "adc r3, r7\n\t"
  30889. #endif
  30890. #ifdef WOLFSSL_KEIL
  30891. "adcs r4, r4, %[r]\n\t"
  30892. #elif defined(__clang__)
  30893. "adcs r4, %[r]\n\t"
  30894. #else
  30895. "adc r4, %[r]\n\t"
  30896. #endif
  30897. "# A[1] * B[1]\n\t"
  30898. "mov %[a], r9\n\t"
  30899. "mov %[b], r10\n\t"
  30900. "ldr %[a], [%[a], #4]\n\t"
  30901. "ldr %[b], [%[b], #4]\n\t"
  30902. "uxth r6, %[a]\n\t"
  30903. "uxth r7, %[b]\n\t"
  30904. #ifdef WOLFSSL_KEIL
  30905. "muls r7, r6, r7\n\t"
  30906. #elif defined(__clang__)
  30907. "muls r7, r6\n\t"
  30908. #else
  30909. "mul r7, r6\n\t"
  30910. #endif
  30911. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30912. "adds r5, r5, r7\n\t"
  30913. #else
  30914. "add r5, r5, r7\n\t"
  30915. #endif
  30916. #ifdef WOLFSSL_KEIL
  30917. "adcs r3, r3, %[r]\n\t"
  30918. #elif defined(__clang__)
  30919. "adcs r3, %[r]\n\t"
  30920. #else
  30921. "adc r3, %[r]\n\t"
  30922. #endif
  30923. #ifdef WOLFSSL_KEIL
  30924. "adcs r4, r4, %[r]\n\t"
  30925. #elif defined(__clang__)
  30926. "adcs r4, %[r]\n\t"
  30927. #else
  30928. "adc r4, %[r]\n\t"
  30929. #endif
  30930. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30931. "lsrs r7, %[b], #16\n\t"
  30932. #else
  30933. "lsr r7, %[b], #16\n\t"
  30934. #endif
  30935. #ifdef WOLFSSL_KEIL
  30936. "muls r6, r7, r6\n\t"
  30937. #elif defined(__clang__)
  30938. "muls r6, r7\n\t"
  30939. #else
  30940. "mul r6, r7\n\t"
  30941. #endif
  30942. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30943. "lsrs r7, r6, #16\n\t"
  30944. #else
  30945. "lsr r7, r6, #16\n\t"
  30946. #endif
  30947. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30948. "lsls r6, r6, #16\n\t"
  30949. #else
  30950. "lsl r6, r6, #16\n\t"
  30951. #endif
  30952. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30953. "adds r5, r5, r6\n\t"
  30954. #else
  30955. "add r5, r5, r6\n\t"
  30956. #endif
  30957. #ifdef WOLFSSL_KEIL
  30958. "adcs r3, r3, r7\n\t"
  30959. #elif defined(__clang__)
  30960. "adcs r3, r7\n\t"
  30961. #else
  30962. "adc r3, r7\n\t"
  30963. #endif
  30964. #ifdef WOLFSSL_KEIL
  30965. "adcs r4, r4, %[r]\n\t"
  30966. #elif defined(__clang__)
  30967. "adcs r4, %[r]\n\t"
  30968. #else
  30969. "adc r4, %[r]\n\t"
  30970. #endif
  30971. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30972. "lsrs r6, %[a], #16\n\t"
  30973. #else
  30974. "lsr r6, %[a], #16\n\t"
  30975. #endif
  30976. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30977. "lsrs r7, %[b], #16\n\t"
  30978. #else
  30979. "lsr r7, %[b], #16\n\t"
  30980. #endif
  30981. #ifdef WOLFSSL_KEIL
  30982. "muls r7, r6, r7\n\t"
  30983. #elif defined(__clang__)
  30984. "muls r7, r6\n\t"
  30985. #else
  30986. "mul r7, r6\n\t"
  30987. #endif
  30988. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30989. "adds r3, r3, r7\n\t"
  30990. #else
  30991. "add r3, r3, r7\n\t"
  30992. #endif
  30993. #ifdef WOLFSSL_KEIL
  30994. "adcs r4, r4, %[r]\n\t"
  30995. #elif defined(__clang__)
  30996. "adcs r4, %[r]\n\t"
  30997. #else
  30998. "adc r4, %[r]\n\t"
  30999. #endif
  31000. "uxth r7, %[b]\n\t"
  31001. #ifdef WOLFSSL_KEIL
  31002. "muls r6, r7, r6\n\t"
  31003. #elif defined(__clang__)
  31004. "muls r6, r7\n\t"
  31005. #else
  31006. "mul r6, r7\n\t"
  31007. #endif
  31008. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31009. "lsrs r7, r6, #16\n\t"
  31010. #else
  31011. "lsr r7, r6, #16\n\t"
  31012. #endif
  31013. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31014. "lsls r6, r6, #16\n\t"
  31015. #else
  31016. "lsl r6, r6, #16\n\t"
  31017. #endif
  31018. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31019. "adds r5, r5, r6\n\t"
  31020. #else
  31021. "add r5, r5, r6\n\t"
  31022. #endif
  31023. #ifdef WOLFSSL_KEIL
  31024. "adcs r3, r3, r7\n\t"
  31025. #elif defined(__clang__)
  31026. "adcs r3, r7\n\t"
  31027. #else
  31028. "adc r3, r7\n\t"
  31029. #endif
  31030. #ifdef WOLFSSL_KEIL
  31031. "adcs r4, r4, %[r]\n\t"
  31032. #elif defined(__clang__)
  31033. "adcs r4, %[r]\n\t"
  31034. #else
  31035. "adc r4, %[r]\n\t"
  31036. #endif
  31037. "# A[0] * B[2]\n\t"
  31038. "mov %[a], r9\n\t"
  31039. "mov %[b], r10\n\t"
  31040. "ldr %[a], [%[a]]\n\t"
  31041. "ldr %[b], [%[b], #8]\n\t"
  31042. "uxth r6, %[a]\n\t"
  31043. "uxth r7, %[b]\n\t"
  31044. #ifdef WOLFSSL_KEIL
  31045. "muls r7, r6, r7\n\t"
  31046. #elif defined(__clang__)
  31047. "muls r7, r6\n\t"
  31048. #else
  31049. "mul r7, r6\n\t"
  31050. #endif
  31051. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31052. "adds r5, r5, r7\n\t"
  31053. #else
  31054. "add r5, r5, r7\n\t"
  31055. #endif
  31056. #ifdef WOLFSSL_KEIL
  31057. "adcs r3, r3, %[r]\n\t"
  31058. #elif defined(__clang__)
  31059. "adcs r3, %[r]\n\t"
  31060. #else
  31061. "adc r3, %[r]\n\t"
  31062. #endif
  31063. #ifdef WOLFSSL_KEIL
  31064. "adcs r4, r4, %[r]\n\t"
  31065. #elif defined(__clang__)
  31066. "adcs r4, %[r]\n\t"
  31067. #else
  31068. "adc r4, %[r]\n\t"
  31069. #endif
  31070. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31071. "lsrs r7, %[b], #16\n\t"
  31072. #else
  31073. "lsr r7, %[b], #16\n\t"
  31074. #endif
  31075. #ifdef WOLFSSL_KEIL
  31076. "muls r6, r7, r6\n\t"
  31077. #elif defined(__clang__)
  31078. "muls r6, r7\n\t"
  31079. #else
  31080. "mul r6, r7\n\t"
  31081. #endif
  31082. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31083. "lsrs r7, r6, #16\n\t"
  31084. #else
  31085. "lsr r7, r6, #16\n\t"
  31086. #endif
  31087. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31088. "lsls r6, r6, #16\n\t"
  31089. #else
  31090. "lsl r6, r6, #16\n\t"
  31091. #endif
  31092. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31093. "adds r5, r5, r6\n\t"
  31094. #else
  31095. "add r5, r5, r6\n\t"
  31096. #endif
  31097. #ifdef WOLFSSL_KEIL
  31098. "adcs r3, r3, r7\n\t"
  31099. #elif defined(__clang__)
  31100. "adcs r3, r7\n\t"
  31101. #else
  31102. "adc r3, r7\n\t"
  31103. #endif
  31104. #ifdef WOLFSSL_KEIL
  31105. "adcs r4, r4, %[r]\n\t"
  31106. #elif defined(__clang__)
  31107. "adcs r4, %[r]\n\t"
  31108. #else
  31109. "adc r4, %[r]\n\t"
  31110. #endif
  31111. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31112. "lsrs r6, %[a], #16\n\t"
  31113. #else
  31114. "lsr r6, %[a], #16\n\t"
  31115. #endif
  31116. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31117. "lsrs r7, %[b], #16\n\t"
  31118. #else
  31119. "lsr r7, %[b], #16\n\t"
  31120. #endif
  31121. #ifdef WOLFSSL_KEIL
  31122. "muls r7, r6, r7\n\t"
  31123. #elif defined(__clang__)
  31124. "muls r7, r6\n\t"
  31125. #else
  31126. "mul r7, r6\n\t"
  31127. #endif
  31128. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31129. "adds r3, r3, r7\n\t"
  31130. #else
  31131. "add r3, r3, r7\n\t"
  31132. #endif
  31133. #ifdef WOLFSSL_KEIL
  31134. "adcs r4, r4, %[r]\n\t"
  31135. #elif defined(__clang__)
  31136. "adcs r4, %[r]\n\t"
  31137. #else
  31138. "adc r4, %[r]\n\t"
  31139. #endif
  31140. "uxth r7, %[b]\n\t"
  31141. #ifdef WOLFSSL_KEIL
  31142. "muls r6, r7, r6\n\t"
  31143. #elif defined(__clang__)
  31144. "muls r6, r7\n\t"
  31145. #else
  31146. "mul r6, r7\n\t"
  31147. #endif
  31148. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31149. "lsrs r7, r6, #16\n\t"
  31150. #else
  31151. "lsr r7, r6, #16\n\t"
  31152. #endif
  31153. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31154. "lsls r6, r6, #16\n\t"
  31155. #else
  31156. "lsl r6, r6, #16\n\t"
  31157. #endif
  31158. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31159. "adds r5, r5, r6\n\t"
  31160. #else
  31161. "add r5, r5, r6\n\t"
  31162. #endif
  31163. #ifdef WOLFSSL_KEIL
  31164. "adcs r3, r3, r7\n\t"
  31165. #elif defined(__clang__)
  31166. "adcs r3, r7\n\t"
  31167. #else
  31168. "adc r3, r7\n\t"
  31169. #endif
  31170. #ifdef WOLFSSL_KEIL
  31171. "adcs r4, r4, %[r]\n\t"
  31172. #elif defined(__clang__)
  31173. "adcs r4, %[r]\n\t"
  31174. #else
  31175. "adc r4, %[r]\n\t"
  31176. #endif
  31177. "str r5, [sp, #8]\n\t"
  31178. "# A[0] * B[3]\n\t"
  31179. "movs r5, #0\n\t"
  31180. "mov %[a], r9\n\t"
  31181. "mov %[b], r10\n\t"
  31182. "ldr %[a], [%[a]]\n\t"
  31183. "ldr %[b], [%[b], #12]\n\t"
  31184. "uxth r6, %[a]\n\t"
  31185. "uxth r7, %[b]\n\t"
  31186. #ifdef WOLFSSL_KEIL
  31187. "muls r7, r6, r7\n\t"
  31188. #elif defined(__clang__)
  31189. "muls r7, r6\n\t"
  31190. #else
  31191. "mul r7, r6\n\t"
  31192. #endif
  31193. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31194. "adds r3, r3, r7\n\t"
  31195. #else
  31196. "add r3, r3, r7\n\t"
  31197. #endif
  31198. #ifdef WOLFSSL_KEIL
  31199. "adcs r4, r4, %[r]\n\t"
  31200. #elif defined(__clang__)
  31201. "adcs r4, %[r]\n\t"
  31202. #else
  31203. "adc r4, %[r]\n\t"
  31204. #endif
  31205. #ifdef WOLFSSL_KEIL
  31206. "adcs r5, r5, %[r]\n\t"
  31207. #elif defined(__clang__)
  31208. "adcs r5, %[r]\n\t"
  31209. #else
  31210. "adc r5, %[r]\n\t"
  31211. #endif
  31212. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31213. "lsrs r7, %[b], #16\n\t"
  31214. #else
  31215. "lsr r7, %[b], #16\n\t"
  31216. #endif
  31217. #ifdef WOLFSSL_KEIL
  31218. "muls r6, r7, r6\n\t"
  31219. #elif defined(__clang__)
  31220. "muls r6, r7\n\t"
  31221. #else
  31222. "mul r6, r7\n\t"
  31223. #endif
  31224. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31225. "lsrs r7, r6, #16\n\t"
  31226. #else
  31227. "lsr r7, r6, #16\n\t"
  31228. #endif
  31229. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31230. "lsls r6, r6, #16\n\t"
  31231. #else
  31232. "lsl r6, r6, #16\n\t"
  31233. #endif
  31234. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31235. "adds r3, r3, r6\n\t"
  31236. #else
  31237. "add r3, r3, r6\n\t"
  31238. #endif
  31239. #ifdef WOLFSSL_KEIL
  31240. "adcs r4, r4, r7\n\t"
  31241. #elif defined(__clang__)
  31242. "adcs r4, r7\n\t"
  31243. #else
  31244. "adc r4, r7\n\t"
  31245. #endif
  31246. #ifdef WOLFSSL_KEIL
  31247. "adcs r5, r5, %[r]\n\t"
  31248. #elif defined(__clang__)
  31249. "adcs r5, %[r]\n\t"
  31250. #else
  31251. "adc r5, %[r]\n\t"
  31252. #endif
  31253. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31254. "lsrs r6, %[a], #16\n\t"
  31255. #else
  31256. "lsr r6, %[a], #16\n\t"
  31257. #endif
  31258. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31259. "lsrs r7, %[b], #16\n\t"
  31260. #else
  31261. "lsr r7, %[b], #16\n\t"
  31262. #endif
  31263. #ifdef WOLFSSL_KEIL
  31264. "muls r7, r6, r7\n\t"
  31265. #elif defined(__clang__)
  31266. "muls r7, r6\n\t"
  31267. #else
  31268. "mul r7, r6\n\t"
  31269. #endif
  31270. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31271. "adds r4, r4, r7\n\t"
  31272. #else
  31273. "add r4, r4, r7\n\t"
  31274. #endif
  31275. #ifdef WOLFSSL_KEIL
  31276. "adcs r5, r5, %[r]\n\t"
  31277. #elif defined(__clang__)
  31278. "adcs r5, %[r]\n\t"
  31279. #else
  31280. "adc r5, %[r]\n\t"
  31281. #endif
  31282. "uxth r7, %[b]\n\t"
  31283. #ifdef WOLFSSL_KEIL
  31284. "muls r6, r7, r6\n\t"
  31285. #elif defined(__clang__)
  31286. "muls r6, r7\n\t"
  31287. #else
  31288. "mul r6, r7\n\t"
  31289. #endif
  31290. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31291. "lsrs r7, r6, #16\n\t"
  31292. #else
  31293. "lsr r7, r6, #16\n\t"
  31294. #endif
  31295. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31296. "lsls r6, r6, #16\n\t"
  31297. #else
  31298. "lsl r6, r6, #16\n\t"
  31299. #endif
  31300. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31301. "adds r3, r3, r6\n\t"
  31302. #else
  31303. "add r3, r3, r6\n\t"
  31304. #endif
  31305. #ifdef WOLFSSL_KEIL
  31306. "adcs r4, r4, r7\n\t"
  31307. #elif defined(__clang__)
  31308. "adcs r4, r7\n\t"
  31309. #else
  31310. "adc r4, r7\n\t"
  31311. #endif
  31312. #ifdef WOLFSSL_KEIL
  31313. "adcs r5, r5, %[r]\n\t"
  31314. #elif defined(__clang__)
  31315. "adcs r5, %[r]\n\t"
  31316. #else
  31317. "adc r5, %[r]\n\t"
  31318. #endif
  31319. "# A[1] * B[2]\n\t"
  31320. "mov %[a], r9\n\t"
  31321. "mov %[b], r10\n\t"
  31322. "ldr %[a], [%[a], #4]\n\t"
  31323. "ldr %[b], [%[b], #8]\n\t"
  31324. "uxth r6, %[a]\n\t"
  31325. "uxth r7, %[b]\n\t"
  31326. #ifdef WOLFSSL_KEIL
  31327. "muls r7, r6, r7\n\t"
  31328. #elif defined(__clang__)
  31329. "muls r7, r6\n\t"
  31330. #else
  31331. "mul r7, r6\n\t"
  31332. #endif
  31333. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31334. "adds r3, r3, r7\n\t"
  31335. #else
  31336. "add r3, r3, r7\n\t"
  31337. #endif
  31338. #ifdef WOLFSSL_KEIL
  31339. "adcs r4, r4, %[r]\n\t"
  31340. #elif defined(__clang__)
  31341. "adcs r4, %[r]\n\t"
  31342. #else
  31343. "adc r4, %[r]\n\t"
  31344. #endif
  31345. #ifdef WOLFSSL_KEIL
  31346. "adcs r5, r5, %[r]\n\t"
  31347. #elif defined(__clang__)
  31348. "adcs r5, %[r]\n\t"
  31349. #else
  31350. "adc r5, %[r]\n\t"
  31351. #endif
  31352. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31353. "lsrs r7, %[b], #16\n\t"
  31354. #else
  31355. "lsr r7, %[b], #16\n\t"
  31356. #endif
  31357. #ifdef WOLFSSL_KEIL
  31358. "muls r6, r7, r6\n\t"
  31359. #elif defined(__clang__)
  31360. "muls r6, r7\n\t"
  31361. #else
  31362. "mul r6, r7\n\t"
  31363. #endif
  31364. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31365. "lsrs r7, r6, #16\n\t"
  31366. #else
  31367. "lsr r7, r6, #16\n\t"
  31368. #endif
  31369. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31370. "lsls r6, r6, #16\n\t"
  31371. #else
  31372. "lsl r6, r6, #16\n\t"
  31373. #endif
  31374. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31375. "adds r3, r3, r6\n\t"
  31376. #else
  31377. "add r3, r3, r6\n\t"
  31378. #endif
  31379. #ifdef WOLFSSL_KEIL
  31380. "adcs r4, r4, r7\n\t"
  31381. #elif defined(__clang__)
  31382. "adcs r4, r7\n\t"
  31383. #else
  31384. "adc r4, r7\n\t"
  31385. #endif
  31386. #ifdef WOLFSSL_KEIL
  31387. "adcs r5, r5, %[r]\n\t"
  31388. #elif defined(__clang__)
  31389. "adcs r5, %[r]\n\t"
  31390. #else
  31391. "adc r5, %[r]\n\t"
  31392. #endif
  31393. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31394. "lsrs r6, %[a], #16\n\t"
  31395. #else
  31396. "lsr r6, %[a], #16\n\t"
  31397. #endif
  31398. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31399. "lsrs r7, %[b], #16\n\t"
  31400. #else
  31401. "lsr r7, %[b], #16\n\t"
  31402. #endif
  31403. #ifdef WOLFSSL_KEIL
  31404. "muls r7, r6, r7\n\t"
  31405. #elif defined(__clang__)
  31406. "muls r7, r6\n\t"
  31407. #else
  31408. "mul r7, r6\n\t"
  31409. #endif
  31410. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31411. "adds r4, r4, r7\n\t"
  31412. #else
  31413. "add r4, r4, r7\n\t"
  31414. #endif
  31415. #ifdef WOLFSSL_KEIL
  31416. "adcs r5, r5, %[r]\n\t"
  31417. #elif defined(__clang__)
  31418. "adcs r5, %[r]\n\t"
  31419. #else
  31420. "adc r5, %[r]\n\t"
  31421. #endif
  31422. "uxth r7, %[b]\n\t"
  31423. #ifdef WOLFSSL_KEIL
  31424. "muls r6, r7, r6\n\t"
  31425. #elif defined(__clang__)
  31426. "muls r6, r7\n\t"
  31427. #else
  31428. "mul r6, r7\n\t"
  31429. #endif
  31430. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31431. "lsrs r7, r6, #16\n\t"
  31432. #else
  31433. "lsr r7, r6, #16\n\t"
  31434. #endif
  31435. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31436. "lsls r6, r6, #16\n\t"
  31437. #else
  31438. "lsl r6, r6, #16\n\t"
  31439. #endif
  31440. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31441. "adds r3, r3, r6\n\t"
  31442. #else
  31443. "add r3, r3, r6\n\t"
  31444. #endif
  31445. #ifdef WOLFSSL_KEIL
  31446. "adcs r4, r4, r7\n\t"
  31447. #elif defined(__clang__)
  31448. "adcs r4, r7\n\t"
  31449. #else
  31450. "adc r4, r7\n\t"
  31451. #endif
  31452. #ifdef WOLFSSL_KEIL
  31453. "adcs r5, r5, %[r]\n\t"
  31454. #elif defined(__clang__)
  31455. "adcs r5, %[r]\n\t"
  31456. #else
  31457. "adc r5, %[r]\n\t"
  31458. #endif
  31459. "# A[2] * B[1]\n\t"
  31460. "mov %[a], r9\n\t"
  31461. "mov %[b], r10\n\t"
  31462. "ldr %[a], [%[a], #8]\n\t"
  31463. "ldr %[b], [%[b], #4]\n\t"
  31464. "uxth r6, %[a]\n\t"
  31465. "uxth r7, %[b]\n\t"
  31466. #ifdef WOLFSSL_KEIL
  31467. "muls r7, r6, r7\n\t"
  31468. #elif defined(__clang__)
  31469. "muls r7, r6\n\t"
  31470. #else
  31471. "mul r7, r6\n\t"
  31472. #endif
  31473. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31474. "adds r3, r3, r7\n\t"
  31475. #else
  31476. "add r3, r3, r7\n\t"
  31477. #endif
  31478. #ifdef WOLFSSL_KEIL
  31479. "adcs r4, r4, %[r]\n\t"
  31480. #elif defined(__clang__)
  31481. "adcs r4, %[r]\n\t"
  31482. #else
  31483. "adc r4, %[r]\n\t"
  31484. #endif
  31485. #ifdef WOLFSSL_KEIL
  31486. "adcs r5, r5, %[r]\n\t"
  31487. #elif defined(__clang__)
  31488. "adcs r5, %[r]\n\t"
  31489. #else
  31490. "adc r5, %[r]\n\t"
  31491. #endif
  31492. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31493. "lsrs r7, %[b], #16\n\t"
  31494. #else
  31495. "lsr r7, %[b], #16\n\t"
  31496. #endif
  31497. #ifdef WOLFSSL_KEIL
  31498. "muls r6, r7, r6\n\t"
  31499. #elif defined(__clang__)
  31500. "muls r6, r7\n\t"
  31501. #else
  31502. "mul r6, r7\n\t"
  31503. #endif
  31504. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31505. "lsrs r7, r6, #16\n\t"
  31506. #else
  31507. "lsr r7, r6, #16\n\t"
  31508. #endif
  31509. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31510. "lsls r6, r6, #16\n\t"
  31511. #else
  31512. "lsl r6, r6, #16\n\t"
  31513. #endif
  31514. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31515. "adds r3, r3, r6\n\t"
  31516. #else
  31517. "add r3, r3, r6\n\t"
  31518. #endif
  31519. #ifdef WOLFSSL_KEIL
  31520. "adcs r4, r4, r7\n\t"
  31521. #elif defined(__clang__)
  31522. "adcs r4, r7\n\t"
  31523. #else
  31524. "adc r4, r7\n\t"
  31525. #endif
  31526. #ifdef WOLFSSL_KEIL
  31527. "adcs r5, r5, %[r]\n\t"
  31528. #elif defined(__clang__)
  31529. "adcs r5, %[r]\n\t"
  31530. #else
  31531. "adc r5, %[r]\n\t"
  31532. #endif
  31533. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31534. "lsrs r6, %[a], #16\n\t"
  31535. #else
  31536. "lsr r6, %[a], #16\n\t"
  31537. #endif
  31538. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31539. "lsrs r7, %[b], #16\n\t"
  31540. #else
  31541. "lsr r7, %[b], #16\n\t"
  31542. #endif
  31543. #ifdef WOLFSSL_KEIL
  31544. "muls r7, r6, r7\n\t"
  31545. #elif defined(__clang__)
  31546. "muls r7, r6\n\t"
  31547. #else
  31548. "mul r7, r6\n\t"
  31549. #endif
  31550. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31551. "adds r4, r4, r7\n\t"
  31552. #else
  31553. "add r4, r4, r7\n\t"
  31554. #endif
  31555. #ifdef WOLFSSL_KEIL
  31556. "adcs r5, r5, %[r]\n\t"
  31557. #elif defined(__clang__)
  31558. "adcs r5, %[r]\n\t"
  31559. #else
  31560. "adc r5, %[r]\n\t"
  31561. #endif
  31562. "uxth r7, %[b]\n\t"
  31563. #ifdef WOLFSSL_KEIL
  31564. "muls r6, r7, r6\n\t"
  31565. #elif defined(__clang__)
  31566. "muls r6, r7\n\t"
  31567. #else
  31568. "mul r6, r7\n\t"
  31569. #endif
  31570. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31571. "lsrs r7, r6, #16\n\t"
  31572. #else
  31573. "lsr r7, r6, #16\n\t"
  31574. #endif
  31575. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31576. "lsls r6, r6, #16\n\t"
  31577. #else
  31578. "lsl r6, r6, #16\n\t"
  31579. #endif
  31580. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31581. "adds r3, r3, r6\n\t"
  31582. #else
  31583. "add r3, r3, r6\n\t"
  31584. #endif
  31585. #ifdef WOLFSSL_KEIL
  31586. "adcs r4, r4, r7\n\t"
  31587. #elif defined(__clang__)
  31588. "adcs r4, r7\n\t"
  31589. #else
  31590. "adc r4, r7\n\t"
  31591. #endif
  31592. #ifdef WOLFSSL_KEIL
  31593. "adcs r5, r5, %[r]\n\t"
  31594. #elif defined(__clang__)
  31595. "adcs r5, %[r]\n\t"
  31596. #else
  31597. "adc r5, %[r]\n\t"
  31598. #endif
  31599. "# A[3] * B[0]\n\t"
  31600. "mov %[a], r9\n\t"
  31601. "mov %[b], r10\n\t"
  31602. "ldr %[a], [%[a], #12]\n\t"
  31603. "ldr %[b], [%[b]]\n\t"
  31604. "uxth r6, %[a]\n\t"
  31605. "uxth r7, %[b]\n\t"
  31606. #ifdef WOLFSSL_KEIL
  31607. "muls r7, r6, r7\n\t"
  31608. #elif defined(__clang__)
  31609. "muls r7, r6\n\t"
  31610. #else
  31611. "mul r7, r6\n\t"
  31612. #endif
  31613. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31614. "adds r3, r3, r7\n\t"
  31615. #else
  31616. "add r3, r3, r7\n\t"
  31617. #endif
  31618. #ifdef WOLFSSL_KEIL
  31619. "adcs r4, r4, %[r]\n\t"
  31620. #elif defined(__clang__)
  31621. "adcs r4, %[r]\n\t"
  31622. #else
  31623. "adc r4, %[r]\n\t"
  31624. #endif
  31625. #ifdef WOLFSSL_KEIL
  31626. "adcs r5, r5, %[r]\n\t"
  31627. #elif defined(__clang__)
  31628. "adcs r5, %[r]\n\t"
  31629. #else
  31630. "adc r5, %[r]\n\t"
  31631. #endif
  31632. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31633. "lsrs r7, %[b], #16\n\t"
  31634. #else
  31635. "lsr r7, %[b], #16\n\t"
  31636. #endif
  31637. #ifdef WOLFSSL_KEIL
  31638. "muls r6, r7, r6\n\t"
  31639. #elif defined(__clang__)
  31640. "muls r6, r7\n\t"
  31641. #else
  31642. "mul r6, r7\n\t"
  31643. #endif
  31644. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31645. "lsrs r7, r6, #16\n\t"
  31646. #else
  31647. "lsr r7, r6, #16\n\t"
  31648. #endif
  31649. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31650. "lsls r6, r6, #16\n\t"
  31651. #else
  31652. "lsl r6, r6, #16\n\t"
  31653. #endif
  31654. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31655. "adds r3, r3, r6\n\t"
  31656. #else
  31657. "add r3, r3, r6\n\t"
  31658. #endif
  31659. #ifdef WOLFSSL_KEIL
  31660. "adcs r4, r4, r7\n\t"
  31661. #elif defined(__clang__)
  31662. "adcs r4, r7\n\t"
  31663. #else
  31664. "adc r4, r7\n\t"
  31665. #endif
  31666. #ifdef WOLFSSL_KEIL
  31667. "adcs r5, r5, %[r]\n\t"
  31668. #elif defined(__clang__)
  31669. "adcs r5, %[r]\n\t"
  31670. #else
  31671. "adc r5, %[r]\n\t"
  31672. #endif
  31673. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31674. "lsrs r6, %[a], #16\n\t"
  31675. #else
  31676. "lsr r6, %[a], #16\n\t"
  31677. #endif
  31678. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31679. "lsrs r7, %[b], #16\n\t"
  31680. #else
  31681. "lsr r7, %[b], #16\n\t"
  31682. #endif
  31683. #ifdef WOLFSSL_KEIL
  31684. "muls r7, r6, r7\n\t"
  31685. #elif defined(__clang__)
  31686. "muls r7, r6\n\t"
  31687. #else
  31688. "mul r7, r6\n\t"
  31689. #endif
  31690. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31691. "adds r4, r4, r7\n\t"
  31692. #else
  31693. "add r4, r4, r7\n\t"
  31694. #endif
  31695. #ifdef WOLFSSL_KEIL
  31696. "adcs r5, r5, %[r]\n\t"
  31697. #elif defined(__clang__)
  31698. "adcs r5, %[r]\n\t"
  31699. #else
  31700. "adc r5, %[r]\n\t"
  31701. #endif
  31702. "uxth r7, %[b]\n\t"
  31703. #ifdef WOLFSSL_KEIL
  31704. "muls r6, r7, r6\n\t"
  31705. #elif defined(__clang__)
  31706. "muls r6, r7\n\t"
  31707. #else
  31708. "mul r6, r7\n\t"
  31709. #endif
  31710. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31711. "lsrs r7, r6, #16\n\t"
  31712. #else
  31713. "lsr r7, r6, #16\n\t"
  31714. #endif
  31715. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31716. "lsls r6, r6, #16\n\t"
  31717. #else
  31718. "lsl r6, r6, #16\n\t"
  31719. #endif
  31720. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31721. "adds r3, r3, r6\n\t"
  31722. #else
  31723. "add r3, r3, r6\n\t"
  31724. #endif
  31725. #ifdef WOLFSSL_KEIL
  31726. "adcs r4, r4, r7\n\t"
  31727. #elif defined(__clang__)
  31728. "adcs r4, r7\n\t"
  31729. #else
  31730. "adc r4, r7\n\t"
  31731. #endif
  31732. #ifdef WOLFSSL_KEIL
  31733. "adcs r5, r5, %[r]\n\t"
  31734. #elif defined(__clang__)
  31735. "adcs r5, %[r]\n\t"
  31736. #else
  31737. "adc r5, %[r]\n\t"
  31738. #endif
  31739. "str r3, [sp, #12]\n\t"
  31740. "# A[4] * B[0]\n\t"
  31741. "movs r3, #0\n\t"
  31742. "mov %[a], r9\n\t"
  31743. "mov %[b], r10\n\t"
  31744. "ldr %[a], [%[a], #16]\n\t"
  31745. "ldr %[b], [%[b]]\n\t"
  31746. "uxth r6, %[a]\n\t"
  31747. "uxth r7, %[b]\n\t"
  31748. #ifdef WOLFSSL_KEIL
  31749. "muls r7, r6, r7\n\t"
  31750. #elif defined(__clang__)
  31751. "muls r7, r6\n\t"
  31752. #else
  31753. "mul r7, r6\n\t"
  31754. #endif
  31755. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31756. "adds r4, r4, r7\n\t"
  31757. #else
  31758. "add r4, r4, r7\n\t"
  31759. #endif
  31760. #ifdef WOLFSSL_KEIL
  31761. "adcs r5, r5, %[r]\n\t"
  31762. #elif defined(__clang__)
  31763. "adcs r5, %[r]\n\t"
  31764. #else
  31765. "adc r5, %[r]\n\t"
  31766. #endif
  31767. #ifdef WOLFSSL_KEIL
  31768. "adcs r3, r3, %[r]\n\t"
  31769. #elif defined(__clang__)
  31770. "adcs r3, %[r]\n\t"
  31771. #else
  31772. "adc r3, %[r]\n\t"
  31773. #endif
  31774. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31775. "lsrs r7, %[b], #16\n\t"
  31776. #else
  31777. "lsr r7, %[b], #16\n\t"
  31778. #endif
  31779. #ifdef WOLFSSL_KEIL
  31780. "muls r6, r7, r6\n\t"
  31781. #elif defined(__clang__)
  31782. "muls r6, r7\n\t"
  31783. #else
  31784. "mul r6, r7\n\t"
  31785. #endif
  31786. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31787. "lsrs r7, r6, #16\n\t"
  31788. #else
  31789. "lsr r7, r6, #16\n\t"
  31790. #endif
  31791. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31792. "lsls r6, r6, #16\n\t"
  31793. #else
  31794. "lsl r6, r6, #16\n\t"
  31795. #endif
  31796. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31797. "adds r4, r4, r6\n\t"
  31798. #else
  31799. "add r4, r4, r6\n\t"
  31800. #endif
  31801. #ifdef WOLFSSL_KEIL
  31802. "adcs r5, r5, r7\n\t"
  31803. #elif defined(__clang__)
  31804. "adcs r5, r7\n\t"
  31805. #else
  31806. "adc r5, r7\n\t"
  31807. #endif
  31808. #ifdef WOLFSSL_KEIL
  31809. "adcs r3, r3, %[r]\n\t"
  31810. #elif defined(__clang__)
  31811. "adcs r3, %[r]\n\t"
  31812. #else
  31813. "adc r3, %[r]\n\t"
  31814. #endif
  31815. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31816. "lsrs r6, %[a], #16\n\t"
  31817. #else
  31818. "lsr r6, %[a], #16\n\t"
  31819. #endif
  31820. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31821. "lsrs r7, %[b], #16\n\t"
  31822. #else
  31823. "lsr r7, %[b], #16\n\t"
  31824. #endif
  31825. #ifdef WOLFSSL_KEIL
  31826. "muls r7, r6, r7\n\t"
  31827. #elif defined(__clang__)
  31828. "muls r7, r6\n\t"
  31829. #else
  31830. "mul r7, r6\n\t"
  31831. #endif
  31832. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31833. "adds r5, r5, r7\n\t"
  31834. #else
  31835. "add r5, r5, r7\n\t"
  31836. #endif
  31837. #ifdef WOLFSSL_KEIL
  31838. "adcs r3, r3, %[r]\n\t"
  31839. #elif defined(__clang__)
  31840. "adcs r3, %[r]\n\t"
  31841. #else
  31842. "adc r3, %[r]\n\t"
  31843. #endif
  31844. "uxth r7, %[b]\n\t"
  31845. #ifdef WOLFSSL_KEIL
  31846. "muls r6, r7, r6\n\t"
  31847. #elif defined(__clang__)
  31848. "muls r6, r7\n\t"
  31849. #else
  31850. "mul r6, r7\n\t"
  31851. #endif
  31852. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31853. "lsrs r7, r6, #16\n\t"
  31854. #else
  31855. "lsr r7, r6, #16\n\t"
  31856. #endif
  31857. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31858. "lsls r6, r6, #16\n\t"
  31859. #else
  31860. "lsl r6, r6, #16\n\t"
  31861. #endif
  31862. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31863. "adds r4, r4, r6\n\t"
  31864. #else
  31865. "add r4, r4, r6\n\t"
  31866. #endif
  31867. #ifdef WOLFSSL_KEIL
  31868. "adcs r5, r5, r7\n\t"
  31869. #elif defined(__clang__)
  31870. "adcs r5, r7\n\t"
  31871. #else
  31872. "adc r5, r7\n\t"
  31873. #endif
  31874. #ifdef WOLFSSL_KEIL
  31875. "adcs r3, r3, %[r]\n\t"
  31876. #elif defined(__clang__)
  31877. "adcs r3, %[r]\n\t"
  31878. #else
  31879. "adc r3, %[r]\n\t"
  31880. #endif
  31881. "# A[3] * B[1]\n\t"
  31882. "mov %[a], r9\n\t"
  31883. "mov %[b], r10\n\t"
  31884. "ldr %[a], [%[a], #12]\n\t"
  31885. "ldr %[b], [%[b], #4]\n\t"
  31886. "uxth r6, %[a]\n\t"
  31887. "uxth r7, %[b]\n\t"
  31888. #ifdef WOLFSSL_KEIL
  31889. "muls r7, r6, r7\n\t"
  31890. #elif defined(__clang__)
  31891. "muls r7, r6\n\t"
  31892. #else
  31893. "mul r7, r6\n\t"
  31894. #endif
  31895. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31896. "adds r4, r4, r7\n\t"
  31897. #else
  31898. "add r4, r4, r7\n\t"
  31899. #endif
  31900. #ifdef WOLFSSL_KEIL
  31901. "adcs r5, r5, %[r]\n\t"
  31902. #elif defined(__clang__)
  31903. "adcs r5, %[r]\n\t"
  31904. #else
  31905. "adc r5, %[r]\n\t"
  31906. #endif
  31907. #ifdef WOLFSSL_KEIL
  31908. "adcs r3, r3, %[r]\n\t"
  31909. #elif defined(__clang__)
  31910. "adcs r3, %[r]\n\t"
  31911. #else
  31912. "adc r3, %[r]\n\t"
  31913. #endif
  31914. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31915. "lsrs r7, %[b], #16\n\t"
  31916. #else
  31917. "lsr r7, %[b], #16\n\t"
  31918. #endif
  31919. #ifdef WOLFSSL_KEIL
  31920. "muls r6, r7, r6\n\t"
  31921. #elif defined(__clang__)
  31922. "muls r6, r7\n\t"
  31923. #else
  31924. "mul r6, r7\n\t"
  31925. #endif
  31926. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31927. "lsrs r7, r6, #16\n\t"
  31928. #else
  31929. "lsr r7, r6, #16\n\t"
  31930. #endif
  31931. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31932. "lsls r6, r6, #16\n\t"
  31933. #else
  31934. "lsl r6, r6, #16\n\t"
  31935. #endif
  31936. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31937. "adds r4, r4, r6\n\t"
  31938. #else
  31939. "add r4, r4, r6\n\t"
  31940. #endif
  31941. #ifdef WOLFSSL_KEIL
  31942. "adcs r5, r5, r7\n\t"
  31943. #elif defined(__clang__)
  31944. "adcs r5, r7\n\t"
  31945. #else
  31946. "adc r5, r7\n\t"
  31947. #endif
  31948. #ifdef WOLFSSL_KEIL
  31949. "adcs r3, r3, %[r]\n\t"
  31950. #elif defined(__clang__)
  31951. "adcs r3, %[r]\n\t"
  31952. #else
  31953. "adc r3, %[r]\n\t"
  31954. #endif
  31955. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31956. "lsrs r6, %[a], #16\n\t"
  31957. #else
  31958. "lsr r6, %[a], #16\n\t"
  31959. #endif
  31960. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31961. "lsrs r7, %[b], #16\n\t"
  31962. #else
  31963. "lsr r7, %[b], #16\n\t"
  31964. #endif
  31965. #ifdef WOLFSSL_KEIL
  31966. "muls r7, r6, r7\n\t"
  31967. #elif defined(__clang__)
  31968. "muls r7, r6\n\t"
  31969. #else
  31970. "mul r7, r6\n\t"
  31971. #endif
  31972. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31973. "adds r5, r5, r7\n\t"
  31974. #else
  31975. "add r5, r5, r7\n\t"
  31976. #endif
  31977. #ifdef WOLFSSL_KEIL
  31978. "adcs r3, r3, %[r]\n\t"
  31979. #elif defined(__clang__)
  31980. "adcs r3, %[r]\n\t"
  31981. #else
  31982. "adc r3, %[r]\n\t"
  31983. #endif
  31984. "uxth r7, %[b]\n\t"
  31985. #ifdef WOLFSSL_KEIL
  31986. "muls r6, r7, r6\n\t"
  31987. #elif defined(__clang__)
  31988. "muls r6, r7\n\t"
  31989. #else
  31990. "mul r6, r7\n\t"
  31991. #endif
  31992. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31993. "lsrs r7, r6, #16\n\t"
  31994. #else
  31995. "lsr r7, r6, #16\n\t"
  31996. #endif
  31997. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31998. "lsls r6, r6, #16\n\t"
  31999. #else
  32000. "lsl r6, r6, #16\n\t"
  32001. #endif
  32002. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32003. "adds r4, r4, r6\n\t"
  32004. #else
  32005. "add r4, r4, r6\n\t"
  32006. #endif
  32007. #ifdef WOLFSSL_KEIL
  32008. "adcs r5, r5, r7\n\t"
  32009. #elif defined(__clang__)
  32010. "adcs r5, r7\n\t"
  32011. #else
  32012. "adc r5, r7\n\t"
  32013. #endif
  32014. #ifdef WOLFSSL_KEIL
  32015. "adcs r3, r3, %[r]\n\t"
  32016. #elif defined(__clang__)
  32017. "adcs r3, %[r]\n\t"
  32018. #else
  32019. "adc r3, %[r]\n\t"
  32020. #endif
  32021. "# A[2] * B[2]\n\t"
  32022. "mov %[a], r9\n\t"
  32023. "mov %[b], r10\n\t"
  32024. "ldr %[a], [%[a], #8]\n\t"
  32025. "ldr %[b], [%[b], #8]\n\t"
  32026. "uxth r6, %[a]\n\t"
  32027. "uxth r7, %[b]\n\t"
  32028. #ifdef WOLFSSL_KEIL
  32029. "muls r7, r6, r7\n\t"
  32030. #elif defined(__clang__)
  32031. "muls r7, r6\n\t"
  32032. #else
  32033. "mul r7, r6\n\t"
  32034. #endif
  32035. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32036. "adds r4, r4, r7\n\t"
  32037. #else
  32038. "add r4, r4, r7\n\t"
  32039. #endif
  32040. #ifdef WOLFSSL_KEIL
  32041. "adcs r5, r5, %[r]\n\t"
  32042. #elif defined(__clang__)
  32043. "adcs r5, %[r]\n\t"
  32044. #else
  32045. "adc r5, %[r]\n\t"
  32046. #endif
  32047. #ifdef WOLFSSL_KEIL
  32048. "adcs r3, r3, %[r]\n\t"
  32049. #elif defined(__clang__)
  32050. "adcs r3, %[r]\n\t"
  32051. #else
  32052. "adc r3, %[r]\n\t"
  32053. #endif
  32054. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32055. "lsrs r7, %[b], #16\n\t"
  32056. #else
  32057. "lsr r7, %[b], #16\n\t"
  32058. #endif
  32059. #ifdef WOLFSSL_KEIL
  32060. "muls r6, r7, r6\n\t"
  32061. #elif defined(__clang__)
  32062. "muls r6, r7\n\t"
  32063. #else
  32064. "mul r6, r7\n\t"
  32065. #endif
  32066. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32067. "lsrs r7, r6, #16\n\t"
  32068. #else
  32069. "lsr r7, r6, #16\n\t"
  32070. #endif
  32071. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32072. "lsls r6, r6, #16\n\t"
  32073. #else
  32074. "lsl r6, r6, #16\n\t"
  32075. #endif
  32076. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32077. "adds r4, r4, r6\n\t"
  32078. #else
  32079. "add r4, r4, r6\n\t"
  32080. #endif
  32081. #ifdef WOLFSSL_KEIL
  32082. "adcs r5, r5, r7\n\t"
  32083. #elif defined(__clang__)
  32084. "adcs r5, r7\n\t"
  32085. #else
  32086. "adc r5, r7\n\t"
  32087. #endif
  32088. #ifdef WOLFSSL_KEIL
  32089. "adcs r3, r3, %[r]\n\t"
  32090. #elif defined(__clang__)
  32091. "adcs r3, %[r]\n\t"
  32092. #else
  32093. "adc r3, %[r]\n\t"
  32094. #endif
  32095. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32096. "lsrs r6, %[a], #16\n\t"
  32097. #else
  32098. "lsr r6, %[a], #16\n\t"
  32099. #endif
  32100. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32101. "lsrs r7, %[b], #16\n\t"
  32102. #else
  32103. "lsr r7, %[b], #16\n\t"
  32104. #endif
  32105. #ifdef WOLFSSL_KEIL
  32106. "muls r7, r6, r7\n\t"
  32107. #elif defined(__clang__)
  32108. "muls r7, r6\n\t"
  32109. #else
  32110. "mul r7, r6\n\t"
  32111. #endif
  32112. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32113. "adds r5, r5, r7\n\t"
  32114. #else
  32115. "add r5, r5, r7\n\t"
  32116. #endif
  32117. #ifdef WOLFSSL_KEIL
  32118. "adcs r3, r3, %[r]\n\t"
  32119. #elif defined(__clang__)
  32120. "adcs r3, %[r]\n\t"
  32121. #else
  32122. "adc r3, %[r]\n\t"
  32123. #endif
  32124. "uxth r7, %[b]\n\t"
  32125. #ifdef WOLFSSL_KEIL
  32126. "muls r6, r7, r6\n\t"
  32127. #elif defined(__clang__)
  32128. "muls r6, r7\n\t"
  32129. #else
  32130. "mul r6, r7\n\t"
  32131. #endif
  32132. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32133. "lsrs r7, r6, #16\n\t"
  32134. #else
  32135. "lsr r7, r6, #16\n\t"
  32136. #endif
  32137. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32138. "lsls r6, r6, #16\n\t"
  32139. #else
  32140. "lsl r6, r6, #16\n\t"
  32141. #endif
  32142. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32143. "adds r4, r4, r6\n\t"
  32144. #else
  32145. "add r4, r4, r6\n\t"
  32146. #endif
  32147. #ifdef WOLFSSL_KEIL
  32148. "adcs r5, r5, r7\n\t"
  32149. #elif defined(__clang__)
  32150. "adcs r5, r7\n\t"
  32151. #else
  32152. "adc r5, r7\n\t"
  32153. #endif
  32154. #ifdef WOLFSSL_KEIL
  32155. "adcs r3, r3, %[r]\n\t"
  32156. #elif defined(__clang__)
  32157. "adcs r3, %[r]\n\t"
  32158. #else
  32159. "adc r3, %[r]\n\t"
  32160. #endif
  32161. "# A[1] * B[3]\n\t"
  32162. "mov %[a], r9\n\t"
  32163. "mov %[b], r10\n\t"
  32164. "ldr %[a], [%[a], #4]\n\t"
  32165. "ldr %[b], [%[b], #12]\n\t"
  32166. "uxth r6, %[a]\n\t"
  32167. "uxth r7, %[b]\n\t"
  32168. #ifdef WOLFSSL_KEIL
  32169. "muls r7, r6, r7\n\t"
  32170. #elif defined(__clang__)
  32171. "muls r7, r6\n\t"
  32172. #else
  32173. "mul r7, r6\n\t"
  32174. #endif
  32175. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32176. "adds r4, r4, r7\n\t"
  32177. #else
  32178. "add r4, r4, r7\n\t"
  32179. #endif
  32180. #ifdef WOLFSSL_KEIL
  32181. "adcs r5, r5, %[r]\n\t"
  32182. #elif defined(__clang__)
  32183. "adcs r5, %[r]\n\t"
  32184. #else
  32185. "adc r5, %[r]\n\t"
  32186. #endif
  32187. #ifdef WOLFSSL_KEIL
  32188. "adcs r3, r3, %[r]\n\t"
  32189. #elif defined(__clang__)
  32190. "adcs r3, %[r]\n\t"
  32191. #else
  32192. "adc r3, %[r]\n\t"
  32193. #endif
  32194. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32195. "lsrs r7, %[b], #16\n\t"
  32196. #else
  32197. "lsr r7, %[b], #16\n\t"
  32198. #endif
  32199. #ifdef WOLFSSL_KEIL
  32200. "muls r6, r7, r6\n\t"
  32201. #elif defined(__clang__)
  32202. "muls r6, r7\n\t"
  32203. #else
  32204. "mul r6, r7\n\t"
  32205. #endif
  32206. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32207. "lsrs r7, r6, #16\n\t"
  32208. #else
  32209. "lsr r7, r6, #16\n\t"
  32210. #endif
  32211. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32212. "lsls r6, r6, #16\n\t"
  32213. #else
  32214. "lsl r6, r6, #16\n\t"
  32215. #endif
  32216. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32217. "adds r4, r4, r6\n\t"
  32218. #else
  32219. "add r4, r4, r6\n\t"
  32220. #endif
  32221. #ifdef WOLFSSL_KEIL
  32222. "adcs r5, r5, r7\n\t"
  32223. #elif defined(__clang__)
  32224. "adcs r5, r7\n\t"
  32225. #else
  32226. "adc r5, r7\n\t"
  32227. #endif
  32228. #ifdef WOLFSSL_KEIL
  32229. "adcs r3, r3, %[r]\n\t"
  32230. #elif defined(__clang__)
  32231. "adcs r3, %[r]\n\t"
  32232. #else
  32233. "adc r3, %[r]\n\t"
  32234. #endif
  32235. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32236. "lsrs r6, %[a], #16\n\t"
  32237. #else
  32238. "lsr r6, %[a], #16\n\t"
  32239. #endif
  32240. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32241. "lsrs r7, %[b], #16\n\t"
  32242. #else
  32243. "lsr r7, %[b], #16\n\t"
  32244. #endif
  32245. #ifdef WOLFSSL_KEIL
  32246. "muls r7, r6, r7\n\t"
  32247. #elif defined(__clang__)
  32248. "muls r7, r6\n\t"
  32249. #else
  32250. "mul r7, r6\n\t"
  32251. #endif
  32252. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32253. "adds r5, r5, r7\n\t"
  32254. #else
  32255. "add r5, r5, r7\n\t"
  32256. #endif
  32257. #ifdef WOLFSSL_KEIL
  32258. "adcs r3, r3, %[r]\n\t"
  32259. #elif defined(__clang__)
  32260. "adcs r3, %[r]\n\t"
  32261. #else
  32262. "adc r3, %[r]\n\t"
  32263. #endif
  32264. "uxth r7, %[b]\n\t"
  32265. #ifdef WOLFSSL_KEIL
  32266. "muls r6, r7, r6\n\t"
  32267. #elif defined(__clang__)
  32268. "muls r6, r7\n\t"
  32269. #else
  32270. "mul r6, r7\n\t"
  32271. #endif
  32272. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32273. "lsrs r7, r6, #16\n\t"
  32274. #else
  32275. "lsr r7, r6, #16\n\t"
  32276. #endif
  32277. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32278. "lsls r6, r6, #16\n\t"
  32279. #else
  32280. "lsl r6, r6, #16\n\t"
  32281. #endif
  32282. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32283. "adds r4, r4, r6\n\t"
  32284. #else
  32285. "add r4, r4, r6\n\t"
  32286. #endif
  32287. #ifdef WOLFSSL_KEIL
  32288. "adcs r5, r5, r7\n\t"
  32289. #elif defined(__clang__)
  32290. "adcs r5, r7\n\t"
  32291. #else
  32292. "adc r5, r7\n\t"
  32293. #endif
  32294. #ifdef WOLFSSL_KEIL
  32295. "adcs r3, r3, %[r]\n\t"
  32296. #elif defined(__clang__)
  32297. "adcs r3, %[r]\n\t"
  32298. #else
  32299. "adc r3, %[r]\n\t"
  32300. #endif
  32301. "# A[0] * B[4]\n\t"
  32302. "mov %[a], r9\n\t"
  32303. "mov %[b], r10\n\t"
  32304. "ldr %[a], [%[a]]\n\t"
  32305. "ldr %[b], [%[b], #16]\n\t"
  32306. "uxth r6, %[a]\n\t"
  32307. "uxth r7, %[b]\n\t"
  32308. #ifdef WOLFSSL_KEIL
  32309. "muls r7, r6, r7\n\t"
  32310. #elif defined(__clang__)
  32311. "muls r7, r6\n\t"
  32312. #else
  32313. "mul r7, r6\n\t"
  32314. #endif
  32315. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32316. "adds r4, r4, r7\n\t"
  32317. #else
  32318. "add r4, r4, r7\n\t"
  32319. #endif
  32320. #ifdef WOLFSSL_KEIL
  32321. "adcs r5, r5, %[r]\n\t"
  32322. #elif defined(__clang__)
  32323. "adcs r5, %[r]\n\t"
  32324. #else
  32325. "adc r5, %[r]\n\t"
  32326. #endif
  32327. #ifdef WOLFSSL_KEIL
  32328. "adcs r3, r3, %[r]\n\t"
  32329. #elif defined(__clang__)
  32330. "adcs r3, %[r]\n\t"
  32331. #else
  32332. "adc r3, %[r]\n\t"
  32333. #endif
  32334. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32335. "lsrs r7, %[b], #16\n\t"
  32336. #else
  32337. "lsr r7, %[b], #16\n\t"
  32338. #endif
  32339. #ifdef WOLFSSL_KEIL
  32340. "muls r6, r7, r6\n\t"
  32341. #elif defined(__clang__)
  32342. "muls r6, r7\n\t"
  32343. #else
  32344. "mul r6, r7\n\t"
  32345. #endif
  32346. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32347. "lsrs r7, r6, #16\n\t"
  32348. #else
  32349. "lsr r7, r6, #16\n\t"
  32350. #endif
  32351. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32352. "lsls r6, r6, #16\n\t"
  32353. #else
  32354. "lsl r6, r6, #16\n\t"
  32355. #endif
  32356. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32357. "adds r4, r4, r6\n\t"
  32358. #else
  32359. "add r4, r4, r6\n\t"
  32360. #endif
  32361. #ifdef WOLFSSL_KEIL
  32362. "adcs r5, r5, r7\n\t"
  32363. #elif defined(__clang__)
  32364. "adcs r5, r7\n\t"
  32365. #else
  32366. "adc r5, r7\n\t"
  32367. #endif
  32368. #ifdef WOLFSSL_KEIL
  32369. "adcs r3, r3, %[r]\n\t"
  32370. #elif defined(__clang__)
  32371. "adcs r3, %[r]\n\t"
  32372. #else
  32373. "adc r3, %[r]\n\t"
  32374. #endif
  32375. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32376. "lsrs r6, %[a], #16\n\t"
  32377. #else
  32378. "lsr r6, %[a], #16\n\t"
  32379. #endif
  32380. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32381. "lsrs r7, %[b], #16\n\t"
  32382. #else
  32383. "lsr r7, %[b], #16\n\t"
  32384. #endif
  32385. #ifdef WOLFSSL_KEIL
  32386. "muls r7, r6, r7\n\t"
  32387. #elif defined(__clang__)
  32388. "muls r7, r6\n\t"
  32389. #else
  32390. "mul r7, r6\n\t"
  32391. #endif
  32392. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32393. "adds r5, r5, r7\n\t"
  32394. #else
  32395. "add r5, r5, r7\n\t"
  32396. #endif
  32397. #ifdef WOLFSSL_KEIL
  32398. "adcs r3, r3, %[r]\n\t"
  32399. #elif defined(__clang__)
  32400. "adcs r3, %[r]\n\t"
  32401. #else
  32402. "adc r3, %[r]\n\t"
  32403. #endif
  32404. "uxth r7, %[b]\n\t"
  32405. #ifdef WOLFSSL_KEIL
  32406. "muls r6, r7, r6\n\t"
  32407. #elif defined(__clang__)
  32408. "muls r6, r7\n\t"
  32409. #else
  32410. "mul r6, r7\n\t"
  32411. #endif
  32412. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32413. "lsrs r7, r6, #16\n\t"
  32414. #else
  32415. "lsr r7, r6, #16\n\t"
  32416. #endif
  32417. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32418. "lsls r6, r6, #16\n\t"
  32419. #else
  32420. "lsl r6, r6, #16\n\t"
  32421. #endif
  32422. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32423. "adds r4, r4, r6\n\t"
  32424. #else
  32425. "add r4, r4, r6\n\t"
  32426. #endif
  32427. #ifdef WOLFSSL_KEIL
  32428. "adcs r5, r5, r7\n\t"
  32429. #elif defined(__clang__)
  32430. "adcs r5, r7\n\t"
  32431. #else
  32432. "adc r5, r7\n\t"
  32433. #endif
  32434. #ifdef WOLFSSL_KEIL
  32435. "adcs r3, r3, %[r]\n\t"
  32436. #elif defined(__clang__)
  32437. "adcs r3, %[r]\n\t"
  32438. #else
  32439. "adc r3, %[r]\n\t"
  32440. #endif
  32441. "str r4, [sp, #16]\n\t"
  32442. "# A[0] * B[5]\n\t"
  32443. "movs r4, #0\n\t"
  32444. "mov %[a], r9\n\t"
  32445. "mov %[b], r10\n\t"
  32446. "ldr %[a], [%[a]]\n\t"
  32447. "ldr %[b], [%[b], #20]\n\t"
  32448. "uxth r6, %[a]\n\t"
  32449. "uxth r7, %[b]\n\t"
  32450. #ifdef WOLFSSL_KEIL
  32451. "muls r7, r6, r7\n\t"
  32452. #elif defined(__clang__)
  32453. "muls r7, r6\n\t"
  32454. #else
  32455. "mul r7, r6\n\t"
  32456. #endif
  32457. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32458. "adds r5, r5, r7\n\t"
  32459. #else
  32460. "add r5, r5, r7\n\t"
  32461. #endif
  32462. #ifdef WOLFSSL_KEIL
  32463. "adcs r3, r3, %[r]\n\t"
  32464. #elif defined(__clang__)
  32465. "adcs r3, %[r]\n\t"
  32466. #else
  32467. "adc r3, %[r]\n\t"
  32468. #endif
  32469. #ifdef WOLFSSL_KEIL
  32470. "adcs r4, r4, %[r]\n\t"
  32471. #elif defined(__clang__)
  32472. "adcs r4, %[r]\n\t"
  32473. #else
  32474. "adc r4, %[r]\n\t"
  32475. #endif
  32476. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32477. "lsrs r7, %[b], #16\n\t"
  32478. #else
  32479. "lsr r7, %[b], #16\n\t"
  32480. #endif
  32481. #ifdef WOLFSSL_KEIL
  32482. "muls r6, r7, r6\n\t"
  32483. #elif defined(__clang__)
  32484. "muls r6, r7\n\t"
  32485. #else
  32486. "mul r6, r7\n\t"
  32487. #endif
  32488. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32489. "lsrs r7, r6, #16\n\t"
  32490. #else
  32491. "lsr r7, r6, #16\n\t"
  32492. #endif
  32493. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32494. "lsls r6, r6, #16\n\t"
  32495. #else
  32496. "lsl r6, r6, #16\n\t"
  32497. #endif
  32498. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32499. "adds r5, r5, r6\n\t"
  32500. #else
  32501. "add r5, r5, r6\n\t"
  32502. #endif
  32503. #ifdef WOLFSSL_KEIL
  32504. "adcs r3, r3, r7\n\t"
  32505. #elif defined(__clang__)
  32506. "adcs r3, r7\n\t"
  32507. #else
  32508. "adc r3, r7\n\t"
  32509. #endif
  32510. #ifdef WOLFSSL_KEIL
  32511. "adcs r4, r4, %[r]\n\t"
  32512. #elif defined(__clang__)
  32513. "adcs r4, %[r]\n\t"
  32514. #else
  32515. "adc r4, %[r]\n\t"
  32516. #endif
  32517. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32518. "lsrs r6, %[a], #16\n\t"
  32519. #else
  32520. "lsr r6, %[a], #16\n\t"
  32521. #endif
  32522. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32523. "lsrs r7, %[b], #16\n\t"
  32524. #else
  32525. "lsr r7, %[b], #16\n\t"
  32526. #endif
  32527. #ifdef WOLFSSL_KEIL
  32528. "muls r7, r6, r7\n\t"
  32529. #elif defined(__clang__)
  32530. "muls r7, r6\n\t"
  32531. #else
  32532. "mul r7, r6\n\t"
  32533. #endif
  32534. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32535. "adds r3, r3, r7\n\t"
  32536. #else
  32537. "add r3, r3, r7\n\t"
  32538. #endif
  32539. #ifdef WOLFSSL_KEIL
  32540. "adcs r4, r4, %[r]\n\t"
  32541. #elif defined(__clang__)
  32542. "adcs r4, %[r]\n\t"
  32543. #else
  32544. "adc r4, %[r]\n\t"
  32545. #endif
  32546. "uxth r7, %[b]\n\t"
  32547. #ifdef WOLFSSL_KEIL
  32548. "muls r6, r7, r6\n\t"
  32549. #elif defined(__clang__)
  32550. "muls r6, r7\n\t"
  32551. #else
  32552. "mul r6, r7\n\t"
  32553. #endif
  32554. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32555. "lsrs r7, r6, #16\n\t"
  32556. #else
  32557. "lsr r7, r6, #16\n\t"
  32558. #endif
  32559. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32560. "lsls r6, r6, #16\n\t"
  32561. #else
  32562. "lsl r6, r6, #16\n\t"
  32563. #endif
  32564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32565. "adds r5, r5, r6\n\t"
  32566. #else
  32567. "add r5, r5, r6\n\t"
  32568. #endif
  32569. #ifdef WOLFSSL_KEIL
  32570. "adcs r3, r3, r7\n\t"
  32571. #elif defined(__clang__)
  32572. "adcs r3, r7\n\t"
  32573. #else
  32574. "adc r3, r7\n\t"
  32575. #endif
  32576. #ifdef WOLFSSL_KEIL
  32577. "adcs r4, r4, %[r]\n\t"
  32578. #elif defined(__clang__)
  32579. "adcs r4, %[r]\n\t"
  32580. #else
  32581. "adc r4, %[r]\n\t"
  32582. #endif
  32583. "# A[1] * B[4]\n\t"
  32584. "mov %[a], r9\n\t"
  32585. "mov %[b], r10\n\t"
  32586. "ldr %[a], [%[a], #4]\n\t"
  32587. "ldr %[b], [%[b], #16]\n\t"
  32588. "uxth r6, %[a]\n\t"
  32589. "uxth r7, %[b]\n\t"
  32590. #ifdef WOLFSSL_KEIL
  32591. "muls r7, r6, r7\n\t"
  32592. #elif defined(__clang__)
  32593. "muls r7, r6\n\t"
  32594. #else
  32595. "mul r7, r6\n\t"
  32596. #endif
  32597. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32598. "adds r5, r5, r7\n\t"
  32599. #else
  32600. "add r5, r5, r7\n\t"
  32601. #endif
  32602. #ifdef WOLFSSL_KEIL
  32603. "adcs r3, r3, %[r]\n\t"
  32604. #elif defined(__clang__)
  32605. "adcs r3, %[r]\n\t"
  32606. #else
  32607. "adc r3, %[r]\n\t"
  32608. #endif
  32609. #ifdef WOLFSSL_KEIL
  32610. "adcs r4, r4, %[r]\n\t"
  32611. #elif defined(__clang__)
  32612. "adcs r4, %[r]\n\t"
  32613. #else
  32614. "adc r4, %[r]\n\t"
  32615. #endif
  32616. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32617. "lsrs r7, %[b], #16\n\t"
  32618. #else
  32619. "lsr r7, %[b], #16\n\t"
  32620. #endif
  32621. #ifdef WOLFSSL_KEIL
  32622. "muls r6, r7, r6\n\t"
  32623. #elif defined(__clang__)
  32624. "muls r6, r7\n\t"
  32625. #else
  32626. "mul r6, r7\n\t"
  32627. #endif
  32628. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32629. "lsrs r7, r6, #16\n\t"
  32630. #else
  32631. "lsr r7, r6, #16\n\t"
  32632. #endif
  32633. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32634. "lsls r6, r6, #16\n\t"
  32635. #else
  32636. "lsl r6, r6, #16\n\t"
  32637. #endif
  32638. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32639. "adds r5, r5, r6\n\t"
  32640. #else
  32641. "add r5, r5, r6\n\t"
  32642. #endif
  32643. #ifdef WOLFSSL_KEIL
  32644. "adcs r3, r3, r7\n\t"
  32645. #elif defined(__clang__)
  32646. "adcs r3, r7\n\t"
  32647. #else
  32648. "adc r3, r7\n\t"
  32649. #endif
  32650. #ifdef WOLFSSL_KEIL
  32651. "adcs r4, r4, %[r]\n\t"
  32652. #elif defined(__clang__)
  32653. "adcs r4, %[r]\n\t"
  32654. #else
  32655. "adc r4, %[r]\n\t"
  32656. #endif
  32657. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32658. "lsrs r6, %[a], #16\n\t"
  32659. #else
  32660. "lsr r6, %[a], #16\n\t"
  32661. #endif
  32662. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32663. "lsrs r7, %[b], #16\n\t"
  32664. #else
  32665. "lsr r7, %[b], #16\n\t"
  32666. #endif
  32667. #ifdef WOLFSSL_KEIL
  32668. "muls r7, r6, r7\n\t"
  32669. #elif defined(__clang__)
  32670. "muls r7, r6\n\t"
  32671. #else
  32672. "mul r7, r6\n\t"
  32673. #endif
  32674. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32675. "adds r3, r3, r7\n\t"
  32676. #else
  32677. "add r3, r3, r7\n\t"
  32678. #endif
  32679. #ifdef WOLFSSL_KEIL
  32680. "adcs r4, r4, %[r]\n\t"
  32681. #elif defined(__clang__)
  32682. "adcs r4, %[r]\n\t"
  32683. #else
  32684. "adc r4, %[r]\n\t"
  32685. #endif
  32686. "uxth r7, %[b]\n\t"
  32687. #ifdef WOLFSSL_KEIL
  32688. "muls r6, r7, r6\n\t"
  32689. #elif defined(__clang__)
  32690. "muls r6, r7\n\t"
  32691. #else
  32692. "mul r6, r7\n\t"
  32693. #endif
  32694. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32695. "lsrs r7, r6, #16\n\t"
  32696. #else
  32697. "lsr r7, r6, #16\n\t"
  32698. #endif
  32699. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32700. "lsls r6, r6, #16\n\t"
  32701. #else
  32702. "lsl r6, r6, #16\n\t"
  32703. #endif
  32704. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32705. "adds r5, r5, r6\n\t"
  32706. #else
  32707. "add r5, r5, r6\n\t"
  32708. #endif
  32709. #ifdef WOLFSSL_KEIL
  32710. "adcs r3, r3, r7\n\t"
  32711. #elif defined(__clang__)
  32712. "adcs r3, r7\n\t"
  32713. #else
  32714. "adc r3, r7\n\t"
  32715. #endif
  32716. #ifdef WOLFSSL_KEIL
  32717. "adcs r4, r4, %[r]\n\t"
  32718. #elif defined(__clang__)
  32719. "adcs r4, %[r]\n\t"
  32720. #else
  32721. "adc r4, %[r]\n\t"
  32722. #endif
  32723. "# A[2] * B[3]\n\t"
  32724. "mov %[a], r9\n\t"
  32725. "mov %[b], r10\n\t"
  32726. "ldr %[a], [%[a], #8]\n\t"
  32727. "ldr %[b], [%[b], #12]\n\t"
  32728. "uxth r6, %[a]\n\t"
  32729. "uxth r7, %[b]\n\t"
  32730. #ifdef WOLFSSL_KEIL
  32731. "muls r7, r6, r7\n\t"
  32732. #elif defined(__clang__)
  32733. "muls r7, r6\n\t"
  32734. #else
  32735. "mul r7, r6\n\t"
  32736. #endif
  32737. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32738. "adds r5, r5, r7\n\t"
  32739. #else
  32740. "add r5, r5, r7\n\t"
  32741. #endif
  32742. #ifdef WOLFSSL_KEIL
  32743. "adcs r3, r3, %[r]\n\t"
  32744. #elif defined(__clang__)
  32745. "adcs r3, %[r]\n\t"
  32746. #else
  32747. "adc r3, %[r]\n\t"
  32748. #endif
  32749. #ifdef WOLFSSL_KEIL
  32750. "adcs r4, r4, %[r]\n\t"
  32751. #elif defined(__clang__)
  32752. "adcs r4, %[r]\n\t"
  32753. #else
  32754. "adc r4, %[r]\n\t"
  32755. #endif
  32756. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32757. "lsrs r7, %[b], #16\n\t"
  32758. #else
  32759. "lsr r7, %[b], #16\n\t"
  32760. #endif
  32761. #ifdef WOLFSSL_KEIL
  32762. "muls r6, r7, r6\n\t"
  32763. #elif defined(__clang__)
  32764. "muls r6, r7\n\t"
  32765. #else
  32766. "mul r6, r7\n\t"
  32767. #endif
  32768. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32769. "lsrs r7, r6, #16\n\t"
  32770. #else
  32771. "lsr r7, r6, #16\n\t"
  32772. #endif
  32773. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32774. "lsls r6, r6, #16\n\t"
  32775. #else
  32776. "lsl r6, r6, #16\n\t"
  32777. #endif
  32778. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32779. "adds r5, r5, r6\n\t"
  32780. #else
  32781. "add r5, r5, r6\n\t"
  32782. #endif
  32783. #ifdef WOLFSSL_KEIL
  32784. "adcs r3, r3, r7\n\t"
  32785. #elif defined(__clang__)
  32786. "adcs r3, r7\n\t"
  32787. #else
  32788. "adc r3, r7\n\t"
  32789. #endif
  32790. #ifdef WOLFSSL_KEIL
  32791. "adcs r4, r4, %[r]\n\t"
  32792. #elif defined(__clang__)
  32793. "adcs r4, %[r]\n\t"
  32794. #else
  32795. "adc r4, %[r]\n\t"
  32796. #endif
  32797. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32798. "lsrs r6, %[a], #16\n\t"
  32799. #else
  32800. "lsr r6, %[a], #16\n\t"
  32801. #endif
  32802. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32803. "lsrs r7, %[b], #16\n\t"
  32804. #else
  32805. "lsr r7, %[b], #16\n\t"
  32806. #endif
  32807. #ifdef WOLFSSL_KEIL
  32808. "muls r7, r6, r7\n\t"
  32809. #elif defined(__clang__)
  32810. "muls r7, r6\n\t"
  32811. #else
  32812. "mul r7, r6\n\t"
  32813. #endif
  32814. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32815. "adds r3, r3, r7\n\t"
  32816. #else
  32817. "add r3, r3, r7\n\t"
  32818. #endif
  32819. #ifdef WOLFSSL_KEIL
  32820. "adcs r4, r4, %[r]\n\t"
  32821. #elif defined(__clang__)
  32822. "adcs r4, %[r]\n\t"
  32823. #else
  32824. "adc r4, %[r]\n\t"
  32825. #endif
  32826. "uxth r7, %[b]\n\t"
  32827. #ifdef WOLFSSL_KEIL
  32828. "muls r6, r7, r6\n\t"
  32829. #elif defined(__clang__)
  32830. "muls r6, r7\n\t"
  32831. #else
  32832. "mul r6, r7\n\t"
  32833. #endif
  32834. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32835. "lsrs r7, r6, #16\n\t"
  32836. #else
  32837. "lsr r7, r6, #16\n\t"
  32838. #endif
  32839. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32840. "lsls r6, r6, #16\n\t"
  32841. #else
  32842. "lsl r6, r6, #16\n\t"
  32843. #endif
  32844. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32845. "adds r5, r5, r6\n\t"
  32846. #else
  32847. "add r5, r5, r6\n\t"
  32848. #endif
  32849. #ifdef WOLFSSL_KEIL
  32850. "adcs r3, r3, r7\n\t"
  32851. #elif defined(__clang__)
  32852. "adcs r3, r7\n\t"
  32853. #else
  32854. "adc r3, r7\n\t"
  32855. #endif
  32856. #ifdef WOLFSSL_KEIL
  32857. "adcs r4, r4, %[r]\n\t"
  32858. #elif defined(__clang__)
  32859. "adcs r4, %[r]\n\t"
  32860. #else
  32861. "adc r4, %[r]\n\t"
  32862. #endif
  32863. "# A[3] * B[2]\n\t"
  32864. "mov %[a], r9\n\t"
  32865. "mov %[b], r10\n\t"
  32866. "ldr %[a], [%[a], #12]\n\t"
  32867. "ldr %[b], [%[b], #8]\n\t"
  32868. "uxth r6, %[a]\n\t"
  32869. "uxth r7, %[b]\n\t"
  32870. #ifdef WOLFSSL_KEIL
  32871. "muls r7, r6, r7\n\t"
  32872. #elif defined(__clang__)
  32873. "muls r7, r6\n\t"
  32874. #else
  32875. "mul r7, r6\n\t"
  32876. #endif
  32877. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32878. "adds r5, r5, r7\n\t"
  32879. #else
  32880. "add r5, r5, r7\n\t"
  32881. #endif
  32882. #ifdef WOLFSSL_KEIL
  32883. "adcs r3, r3, %[r]\n\t"
  32884. #elif defined(__clang__)
  32885. "adcs r3, %[r]\n\t"
  32886. #else
  32887. "adc r3, %[r]\n\t"
  32888. #endif
  32889. #ifdef WOLFSSL_KEIL
  32890. "adcs r4, r4, %[r]\n\t"
  32891. #elif defined(__clang__)
  32892. "adcs r4, %[r]\n\t"
  32893. #else
  32894. "adc r4, %[r]\n\t"
  32895. #endif
  32896. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32897. "lsrs r7, %[b], #16\n\t"
  32898. #else
  32899. "lsr r7, %[b], #16\n\t"
  32900. #endif
  32901. #ifdef WOLFSSL_KEIL
  32902. "muls r6, r7, r6\n\t"
  32903. #elif defined(__clang__)
  32904. "muls r6, r7\n\t"
  32905. #else
  32906. "mul r6, r7\n\t"
  32907. #endif
  32908. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32909. "lsrs r7, r6, #16\n\t"
  32910. #else
  32911. "lsr r7, r6, #16\n\t"
  32912. #endif
  32913. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32914. "lsls r6, r6, #16\n\t"
  32915. #else
  32916. "lsl r6, r6, #16\n\t"
  32917. #endif
  32918. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32919. "adds r5, r5, r6\n\t"
  32920. #else
  32921. "add r5, r5, r6\n\t"
  32922. #endif
  32923. #ifdef WOLFSSL_KEIL
  32924. "adcs r3, r3, r7\n\t"
  32925. #elif defined(__clang__)
  32926. "adcs r3, r7\n\t"
  32927. #else
  32928. "adc r3, r7\n\t"
  32929. #endif
  32930. #ifdef WOLFSSL_KEIL
  32931. "adcs r4, r4, %[r]\n\t"
  32932. #elif defined(__clang__)
  32933. "adcs r4, %[r]\n\t"
  32934. #else
  32935. "adc r4, %[r]\n\t"
  32936. #endif
  32937. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32938. "lsrs r6, %[a], #16\n\t"
  32939. #else
  32940. "lsr r6, %[a], #16\n\t"
  32941. #endif
  32942. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32943. "lsrs r7, %[b], #16\n\t"
  32944. #else
  32945. "lsr r7, %[b], #16\n\t"
  32946. #endif
  32947. #ifdef WOLFSSL_KEIL
  32948. "muls r7, r6, r7\n\t"
  32949. #elif defined(__clang__)
  32950. "muls r7, r6\n\t"
  32951. #else
  32952. "mul r7, r6\n\t"
  32953. #endif
  32954. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32955. "adds r3, r3, r7\n\t"
  32956. #else
  32957. "add r3, r3, r7\n\t"
  32958. #endif
  32959. #ifdef WOLFSSL_KEIL
  32960. "adcs r4, r4, %[r]\n\t"
  32961. #elif defined(__clang__)
  32962. "adcs r4, %[r]\n\t"
  32963. #else
  32964. "adc r4, %[r]\n\t"
  32965. #endif
  32966. "uxth r7, %[b]\n\t"
  32967. #ifdef WOLFSSL_KEIL
  32968. "muls r6, r7, r6\n\t"
  32969. #elif defined(__clang__)
  32970. "muls r6, r7\n\t"
  32971. #else
  32972. "mul r6, r7\n\t"
  32973. #endif
  32974. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32975. "lsrs r7, r6, #16\n\t"
  32976. #else
  32977. "lsr r7, r6, #16\n\t"
  32978. #endif
  32979. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32980. "lsls r6, r6, #16\n\t"
  32981. #else
  32982. "lsl r6, r6, #16\n\t"
  32983. #endif
  32984. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32985. "adds r5, r5, r6\n\t"
  32986. #else
  32987. "add r5, r5, r6\n\t"
  32988. #endif
  32989. #ifdef WOLFSSL_KEIL
  32990. "adcs r3, r3, r7\n\t"
  32991. #elif defined(__clang__)
  32992. "adcs r3, r7\n\t"
  32993. #else
  32994. "adc r3, r7\n\t"
  32995. #endif
  32996. #ifdef WOLFSSL_KEIL
  32997. "adcs r4, r4, %[r]\n\t"
  32998. #elif defined(__clang__)
  32999. "adcs r4, %[r]\n\t"
  33000. #else
  33001. "adc r4, %[r]\n\t"
  33002. #endif
  33003. "# A[4] * B[1]\n\t"
  33004. "mov %[a], r9\n\t"
  33005. "mov %[b], r10\n\t"
  33006. "ldr %[a], [%[a], #16]\n\t"
  33007. "ldr %[b], [%[b], #4]\n\t"
  33008. "uxth r6, %[a]\n\t"
  33009. "uxth r7, %[b]\n\t"
  33010. #ifdef WOLFSSL_KEIL
  33011. "muls r7, r6, r7\n\t"
  33012. #elif defined(__clang__)
  33013. "muls r7, r6\n\t"
  33014. #else
  33015. "mul r7, r6\n\t"
  33016. #endif
  33017. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33018. "adds r5, r5, r7\n\t"
  33019. #else
  33020. "add r5, r5, r7\n\t"
  33021. #endif
  33022. #ifdef WOLFSSL_KEIL
  33023. "adcs r3, r3, %[r]\n\t"
  33024. #elif defined(__clang__)
  33025. "adcs r3, %[r]\n\t"
  33026. #else
  33027. "adc r3, %[r]\n\t"
  33028. #endif
  33029. #ifdef WOLFSSL_KEIL
  33030. "adcs r4, r4, %[r]\n\t"
  33031. #elif defined(__clang__)
  33032. "adcs r4, %[r]\n\t"
  33033. #else
  33034. "adc r4, %[r]\n\t"
  33035. #endif
  33036. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33037. "lsrs r7, %[b], #16\n\t"
  33038. #else
  33039. "lsr r7, %[b], #16\n\t"
  33040. #endif
  33041. #ifdef WOLFSSL_KEIL
  33042. "muls r6, r7, r6\n\t"
  33043. #elif defined(__clang__)
  33044. "muls r6, r7\n\t"
  33045. #else
  33046. "mul r6, r7\n\t"
  33047. #endif
  33048. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33049. "lsrs r7, r6, #16\n\t"
  33050. #else
  33051. "lsr r7, r6, #16\n\t"
  33052. #endif
  33053. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33054. "lsls r6, r6, #16\n\t"
  33055. #else
  33056. "lsl r6, r6, #16\n\t"
  33057. #endif
  33058. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33059. "adds r5, r5, r6\n\t"
  33060. #else
  33061. "add r5, r5, r6\n\t"
  33062. #endif
  33063. #ifdef WOLFSSL_KEIL
  33064. "adcs r3, r3, r7\n\t"
  33065. #elif defined(__clang__)
  33066. "adcs r3, r7\n\t"
  33067. #else
  33068. "adc r3, r7\n\t"
  33069. #endif
  33070. #ifdef WOLFSSL_KEIL
  33071. "adcs r4, r4, %[r]\n\t"
  33072. #elif defined(__clang__)
  33073. "adcs r4, %[r]\n\t"
  33074. #else
  33075. "adc r4, %[r]\n\t"
  33076. #endif
  33077. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33078. "lsrs r6, %[a], #16\n\t"
  33079. #else
  33080. "lsr r6, %[a], #16\n\t"
  33081. #endif
  33082. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33083. "lsrs r7, %[b], #16\n\t"
  33084. #else
  33085. "lsr r7, %[b], #16\n\t"
  33086. #endif
  33087. #ifdef WOLFSSL_KEIL
  33088. "muls r7, r6, r7\n\t"
  33089. #elif defined(__clang__)
  33090. "muls r7, r6\n\t"
  33091. #else
  33092. "mul r7, r6\n\t"
  33093. #endif
  33094. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33095. "adds r3, r3, r7\n\t"
  33096. #else
  33097. "add r3, r3, r7\n\t"
  33098. #endif
  33099. #ifdef WOLFSSL_KEIL
  33100. "adcs r4, r4, %[r]\n\t"
  33101. #elif defined(__clang__)
  33102. "adcs r4, %[r]\n\t"
  33103. #else
  33104. "adc r4, %[r]\n\t"
  33105. #endif
  33106. "uxth r7, %[b]\n\t"
  33107. #ifdef WOLFSSL_KEIL
  33108. "muls r6, r7, r6\n\t"
  33109. #elif defined(__clang__)
  33110. "muls r6, r7\n\t"
  33111. #else
  33112. "mul r6, r7\n\t"
  33113. #endif
  33114. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33115. "lsrs r7, r6, #16\n\t"
  33116. #else
  33117. "lsr r7, r6, #16\n\t"
  33118. #endif
  33119. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33120. "lsls r6, r6, #16\n\t"
  33121. #else
  33122. "lsl r6, r6, #16\n\t"
  33123. #endif
  33124. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33125. "adds r5, r5, r6\n\t"
  33126. #else
  33127. "add r5, r5, r6\n\t"
  33128. #endif
  33129. #ifdef WOLFSSL_KEIL
  33130. "adcs r3, r3, r7\n\t"
  33131. #elif defined(__clang__)
  33132. "adcs r3, r7\n\t"
  33133. #else
  33134. "adc r3, r7\n\t"
  33135. #endif
  33136. #ifdef WOLFSSL_KEIL
  33137. "adcs r4, r4, %[r]\n\t"
  33138. #elif defined(__clang__)
  33139. "adcs r4, %[r]\n\t"
  33140. #else
  33141. "adc r4, %[r]\n\t"
  33142. #endif
  33143. "# A[5] * B[0]\n\t"
  33144. "mov %[a], r9\n\t"
  33145. "mov %[b], r10\n\t"
  33146. "ldr %[a], [%[a], #20]\n\t"
  33147. "ldr %[b], [%[b]]\n\t"
  33148. "uxth r6, %[a]\n\t"
  33149. "uxth r7, %[b]\n\t"
  33150. #ifdef WOLFSSL_KEIL
  33151. "muls r7, r6, r7\n\t"
  33152. #elif defined(__clang__)
  33153. "muls r7, r6\n\t"
  33154. #else
  33155. "mul r7, r6\n\t"
  33156. #endif
  33157. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33158. "adds r5, r5, r7\n\t"
  33159. #else
  33160. "add r5, r5, r7\n\t"
  33161. #endif
  33162. #ifdef WOLFSSL_KEIL
  33163. "adcs r3, r3, %[r]\n\t"
  33164. #elif defined(__clang__)
  33165. "adcs r3, %[r]\n\t"
  33166. #else
  33167. "adc r3, %[r]\n\t"
  33168. #endif
  33169. #ifdef WOLFSSL_KEIL
  33170. "adcs r4, r4, %[r]\n\t"
  33171. #elif defined(__clang__)
  33172. "adcs r4, %[r]\n\t"
  33173. #else
  33174. "adc r4, %[r]\n\t"
  33175. #endif
  33176. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33177. "lsrs r7, %[b], #16\n\t"
  33178. #else
  33179. "lsr r7, %[b], #16\n\t"
  33180. #endif
  33181. #ifdef WOLFSSL_KEIL
  33182. "muls r6, r7, r6\n\t"
  33183. #elif defined(__clang__)
  33184. "muls r6, r7\n\t"
  33185. #else
  33186. "mul r6, r7\n\t"
  33187. #endif
  33188. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33189. "lsrs r7, r6, #16\n\t"
  33190. #else
  33191. "lsr r7, r6, #16\n\t"
  33192. #endif
  33193. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33194. "lsls r6, r6, #16\n\t"
  33195. #else
  33196. "lsl r6, r6, #16\n\t"
  33197. #endif
  33198. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33199. "adds r5, r5, r6\n\t"
  33200. #else
  33201. "add r5, r5, r6\n\t"
  33202. #endif
  33203. #ifdef WOLFSSL_KEIL
  33204. "adcs r3, r3, r7\n\t"
  33205. #elif defined(__clang__)
  33206. "adcs r3, r7\n\t"
  33207. #else
  33208. "adc r3, r7\n\t"
  33209. #endif
  33210. #ifdef WOLFSSL_KEIL
  33211. "adcs r4, r4, %[r]\n\t"
  33212. #elif defined(__clang__)
  33213. "adcs r4, %[r]\n\t"
  33214. #else
  33215. "adc r4, %[r]\n\t"
  33216. #endif
  33217. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33218. "lsrs r6, %[a], #16\n\t"
  33219. #else
  33220. "lsr r6, %[a], #16\n\t"
  33221. #endif
  33222. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33223. "lsrs r7, %[b], #16\n\t"
  33224. #else
  33225. "lsr r7, %[b], #16\n\t"
  33226. #endif
  33227. #ifdef WOLFSSL_KEIL
  33228. "muls r7, r6, r7\n\t"
  33229. #elif defined(__clang__)
  33230. "muls r7, r6\n\t"
  33231. #else
  33232. "mul r7, r6\n\t"
  33233. #endif
  33234. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33235. "adds r3, r3, r7\n\t"
  33236. #else
  33237. "add r3, r3, r7\n\t"
  33238. #endif
  33239. #ifdef WOLFSSL_KEIL
  33240. "adcs r4, r4, %[r]\n\t"
  33241. #elif defined(__clang__)
  33242. "adcs r4, %[r]\n\t"
  33243. #else
  33244. "adc r4, %[r]\n\t"
  33245. #endif
  33246. "uxth r7, %[b]\n\t"
  33247. #ifdef WOLFSSL_KEIL
  33248. "muls r6, r7, r6\n\t"
  33249. #elif defined(__clang__)
  33250. "muls r6, r7\n\t"
  33251. #else
  33252. "mul r6, r7\n\t"
  33253. #endif
  33254. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33255. "lsrs r7, r6, #16\n\t"
  33256. #else
  33257. "lsr r7, r6, #16\n\t"
  33258. #endif
  33259. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33260. "lsls r6, r6, #16\n\t"
  33261. #else
  33262. "lsl r6, r6, #16\n\t"
  33263. #endif
  33264. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33265. "adds r5, r5, r6\n\t"
  33266. #else
  33267. "add r5, r5, r6\n\t"
  33268. #endif
  33269. #ifdef WOLFSSL_KEIL
  33270. "adcs r3, r3, r7\n\t"
  33271. #elif defined(__clang__)
  33272. "adcs r3, r7\n\t"
  33273. #else
  33274. "adc r3, r7\n\t"
  33275. #endif
  33276. #ifdef WOLFSSL_KEIL
  33277. "adcs r4, r4, %[r]\n\t"
  33278. #elif defined(__clang__)
  33279. "adcs r4, %[r]\n\t"
  33280. #else
  33281. "adc r4, %[r]\n\t"
  33282. #endif
  33283. "str r5, [sp, #20]\n\t"
  33284. "# A[6] * B[0]\n\t"
  33285. "movs r5, #0\n\t"
  33286. "mov %[a], r9\n\t"
  33287. "mov %[b], r10\n\t"
  33288. "ldr %[a], [%[a], #24]\n\t"
  33289. "ldr %[b], [%[b]]\n\t"
  33290. "uxth r6, %[a]\n\t"
  33291. "uxth r7, %[b]\n\t"
  33292. #ifdef WOLFSSL_KEIL
  33293. "muls r7, r6, r7\n\t"
  33294. #elif defined(__clang__)
  33295. "muls r7, r6\n\t"
  33296. #else
  33297. "mul r7, r6\n\t"
  33298. #endif
  33299. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33300. "adds r3, r3, r7\n\t"
  33301. #else
  33302. "add r3, r3, r7\n\t"
  33303. #endif
  33304. #ifdef WOLFSSL_KEIL
  33305. "adcs r4, r4, %[r]\n\t"
  33306. #elif defined(__clang__)
  33307. "adcs r4, %[r]\n\t"
  33308. #else
  33309. "adc r4, %[r]\n\t"
  33310. #endif
  33311. #ifdef WOLFSSL_KEIL
  33312. "adcs r5, r5, %[r]\n\t"
  33313. #elif defined(__clang__)
  33314. "adcs r5, %[r]\n\t"
  33315. #else
  33316. "adc r5, %[r]\n\t"
  33317. #endif
  33318. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33319. "lsrs r7, %[b], #16\n\t"
  33320. #else
  33321. "lsr r7, %[b], #16\n\t"
  33322. #endif
  33323. #ifdef WOLFSSL_KEIL
  33324. "muls r6, r7, r6\n\t"
  33325. #elif defined(__clang__)
  33326. "muls r6, r7\n\t"
  33327. #else
  33328. "mul r6, r7\n\t"
  33329. #endif
  33330. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33331. "lsrs r7, r6, #16\n\t"
  33332. #else
  33333. "lsr r7, r6, #16\n\t"
  33334. #endif
  33335. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33336. "lsls r6, r6, #16\n\t"
  33337. #else
  33338. "lsl r6, r6, #16\n\t"
  33339. #endif
  33340. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33341. "adds r3, r3, r6\n\t"
  33342. #else
  33343. "add r3, r3, r6\n\t"
  33344. #endif
  33345. #ifdef WOLFSSL_KEIL
  33346. "adcs r4, r4, r7\n\t"
  33347. #elif defined(__clang__)
  33348. "adcs r4, r7\n\t"
  33349. #else
  33350. "adc r4, r7\n\t"
  33351. #endif
  33352. #ifdef WOLFSSL_KEIL
  33353. "adcs r5, r5, %[r]\n\t"
  33354. #elif defined(__clang__)
  33355. "adcs r5, %[r]\n\t"
  33356. #else
  33357. "adc r5, %[r]\n\t"
  33358. #endif
  33359. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33360. "lsrs r6, %[a], #16\n\t"
  33361. #else
  33362. "lsr r6, %[a], #16\n\t"
  33363. #endif
  33364. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33365. "lsrs r7, %[b], #16\n\t"
  33366. #else
  33367. "lsr r7, %[b], #16\n\t"
  33368. #endif
  33369. #ifdef WOLFSSL_KEIL
  33370. "muls r7, r6, r7\n\t"
  33371. #elif defined(__clang__)
  33372. "muls r7, r6\n\t"
  33373. #else
  33374. "mul r7, r6\n\t"
  33375. #endif
  33376. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33377. "adds r4, r4, r7\n\t"
  33378. #else
  33379. "add r4, r4, r7\n\t"
  33380. #endif
  33381. #ifdef WOLFSSL_KEIL
  33382. "adcs r5, r5, %[r]\n\t"
  33383. #elif defined(__clang__)
  33384. "adcs r5, %[r]\n\t"
  33385. #else
  33386. "adc r5, %[r]\n\t"
  33387. #endif
  33388. "uxth r7, %[b]\n\t"
  33389. #ifdef WOLFSSL_KEIL
  33390. "muls r6, r7, r6\n\t"
  33391. #elif defined(__clang__)
  33392. "muls r6, r7\n\t"
  33393. #else
  33394. "mul r6, r7\n\t"
  33395. #endif
  33396. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33397. "lsrs r7, r6, #16\n\t"
  33398. #else
  33399. "lsr r7, r6, #16\n\t"
  33400. #endif
  33401. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33402. "lsls r6, r6, #16\n\t"
  33403. #else
  33404. "lsl r6, r6, #16\n\t"
  33405. #endif
  33406. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33407. "adds r3, r3, r6\n\t"
  33408. #else
  33409. "add r3, r3, r6\n\t"
  33410. #endif
  33411. #ifdef WOLFSSL_KEIL
  33412. "adcs r4, r4, r7\n\t"
  33413. #elif defined(__clang__)
  33414. "adcs r4, r7\n\t"
  33415. #else
  33416. "adc r4, r7\n\t"
  33417. #endif
  33418. #ifdef WOLFSSL_KEIL
  33419. "adcs r5, r5, %[r]\n\t"
  33420. #elif defined(__clang__)
  33421. "adcs r5, %[r]\n\t"
  33422. #else
  33423. "adc r5, %[r]\n\t"
  33424. #endif
  33425. "# A[5] * B[1]\n\t"
  33426. "mov %[a], r9\n\t"
  33427. "mov %[b], r10\n\t"
  33428. "ldr %[a], [%[a], #20]\n\t"
  33429. "ldr %[b], [%[b], #4]\n\t"
  33430. "uxth r6, %[a]\n\t"
  33431. "uxth r7, %[b]\n\t"
  33432. #ifdef WOLFSSL_KEIL
  33433. "muls r7, r6, r7\n\t"
  33434. #elif defined(__clang__)
  33435. "muls r7, r6\n\t"
  33436. #else
  33437. "mul r7, r6\n\t"
  33438. #endif
  33439. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33440. "adds r3, r3, r7\n\t"
  33441. #else
  33442. "add r3, r3, r7\n\t"
  33443. #endif
  33444. #ifdef WOLFSSL_KEIL
  33445. "adcs r4, r4, %[r]\n\t"
  33446. #elif defined(__clang__)
  33447. "adcs r4, %[r]\n\t"
  33448. #else
  33449. "adc r4, %[r]\n\t"
  33450. #endif
  33451. #ifdef WOLFSSL_KEIL
  33452. "adcs r5, r5, %[r]\n\t"
  33453. #elif defined(__clang__)
  33454. "adcs r5, %[r]\n\t"
  33455. #else
  33456. "adc r5, %[r]\n\t"
  33457. #endif
  33458. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33459. "lsrs r7, %[b], #16\n\t"
  33460. #else
  33461. "lsr r7, %[b], #16\n\t"
  33462. #endif
  33463. #ifdef WOLFSSL_KEIL
  33464. "muls r6, r7, r6\n\t"
  33465. #elif defined(__clang__)
  33466. "muls r6, r7\n\t"
  33467. #else
  33468. "mul r6, r7\n\t"
  33469. #endif
  33470. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33471. "lsrs r7, r6, #16\n\t"
  33472. #else
  33473. "lsr r7, r6, #16\n\t"
  33474. #endif
  33475. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33476. "lsls r6, r6, #16\n\t"
  33477. #else
  33478. "lsl r6, r6, #16\n\t"
  33479. #endif
  33480. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33481. "adds r3, r3, r6\n\t"
  33482. #else
  33483. "add r3, r3, r6\n\t"
  33484. #endif
  33485. #ifdef WOLFSSL_KEIL
  33486. "adcs r4, r4, r7\n\t"
  33487. #elif defined(__clang__)
  33488. "adcs r4, r7\n\t"
  33489. #else
  33490. "adc r4, r7\n\t"
  33491. #endif
  33492. #ifdef WOLFSSL_KEIL
  33493. "adcs r5, r5, %[r]\n\t"
  33494. #elif defined(__clang__)
  33495. "adcs r5, %[r]\n\t"
  33496. #else
  33497. "adc r5, %[r]\n\t"
  33498. #endif
  33499. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33500. "lsrs r6, %[a], #16\n\t"
  33501. #else
  33502. "lsr r6, %[a], #16\n\t"
  33503. #endif
  33504. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33505. "lsrs r7, %[b], #16\n\t"
  33506. #else
  33507. "lsr r7, %[b], #16\n\t"
  33508. #endif
  33509. #ifdef WOLFSSL_KEIL
  33510. "muls r7, r6, r7\n\t"
  33511. #elif defined(__clang__)
  33512. "muls r7, r6\n\t"
  33513. #else
  33514. "mul r7, r6\n\t"
  33515. #endif
  33516. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33517. "adds r4, r4, r7\n\t"
  33518. #else
  33519. "add r4, r4, r7\n\t"
  33520. #endif
  33521. #ifdef WOLFSSL_KEIL
  33522. "adcs r5, r5, %[r]\n\t"
  33523. #elif defined(__clang__)
  33524. "adcs r5, %[r]\n\t"
  33525. #else
  33526. "adc r5, %[r]\n\t"
  33527. #endif
  33528. "uxth r7, %[b]\n\t"
  33529. #ifdef WOLFSSL_KEIL
  33530. "muls r6, r7, r6\n\t"
  33531. #elif defined(__clang__)
  33532. "muls r6, r7\n\t"
  33533. #else
  33534. "mul r6, r7\n\t"
  33535. #endif
  33536. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33537. "lsrs r7, r6, #16\n\t"
  33538. #else
  33539. "lsr r7, r6, #16\n\t"
  33540. #endif
  33541. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33542. "lsls r6, r6, #16\n\t"
  33543. #else
  33544. "lsl r6, r6, #16\n\t"
  33545. #endif
  33546. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33547. "adds r3, r3, r6\n\t"
  33548. #else
  33549. "add r3, r3, r6\n\t"
  33550. #endif
  33551. #ifdef WOLFSSL_KEIL
  33552. "adcs r4, r4, r7\n\t"
  33553. #elif defined(__clang__)
  33554. "adcs r4, r7\n\t"
  33555. #else
  33556. "adc r4, r7\n\t"
  33557. #endif
  33558. #ifdef WOLFSSL_KEIL
  33559. "adcs r5, r5, %[r]\n\t"
  33560. #elif defined(__clang__)
  33561. "adcs r5, %[r]\n\t"
  33562. #else
  33563. "adc r5, %[r]\n\t"
  33564. #endif
  33565. "# A[4] * B[2]\n\t"
  33566. "mov %[a], r9\n\t"
  33567. "mov %[b], r10\n\t"
  33568. "ldr %[a], [%[a], #16]\n\t"
  33569. "ldr %[b], [%[b], #8]\n\t"
  33570. "uxth r6, %[a]\n\t"
  33571. "uxth r7, %[b]\n\t"
  33572. #ifdef WOLFSSL_KEIL
  33573. "muls r7, r6, r7\n\t"
  33574. #elif defined(__clang__)
  33575. "muls r7, r6\n\t"
  33576. #else
  33577. "mul r7, r6\n\t"
  33578. #endif
  33579. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33580. "adds r3, r3, r7\n\t"
  33581. #else
  33582. "add r3, r3, r7\n\t"
  33583. #endif
  33584. #ifdef WOLFSSL_KEIL
  33585. "adcs r4, r4, %[r]\n\t"
  33586. #elif defined(__clang__)
  33587. "adcs r4, %[r]\n\t"
  33588. #else
  33589. "adc r4, %[r]\n\t"
  33590. #endif
  33591. #ifdef WOLFSSL_KEIL
  33592. "adcs r5, r5, %[r]\n\t"
  33593. #elif defined(__clang__)
  33594. "adcs r5, %[r]\n\t"
  33595. #else
  33596. "adc r5, %[r]\n\t"
  33597. #endif
  33598. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33599. "lsrs r7, %[b], #16\n\t"
  33600. #else
  33601. "lsr r7, %[b], #16\n\t"
  33602. #endif
  33603. #ifdef WOLFSSL_KEIL
  33604. "muls r6, r7, r6\n\t"
  33605. #elif defined(__clang__)
  33606. "muls r6, r7\n\t"
  33607. #else
  33608. "mul r6, r7\n\t"
  33609. #endif
  33610. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33611. "lsrs r7, r6, #16\n\t"
  33612. #else
  33613. "lsr r7, r6, #16\n\t"
  33614. #endif
  33615. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33616. "lsls r6, r6, #16\n\t"
  33617. #else
  33618. "lsl r6, r6, #16\n\t"
  33619. #endif
  33620. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33621. "adds r3, r3, r6\n\t"
  33622. #else
  33623. "add r3, r3, r6\n\t"
  33624. #endif
  33625. #ifdef WOLFSSL_KEIL
  33626. "adcs r4, r4, r7\n\t"
  33627. #elif defined(__clang__)
  33628. "adcs r4, r7\n\t"
  33629. #else
  33630. "adc r4, r7\n\t"
  33631. #endif
  33632. #ifdef WOLFSSL_KEIL
  33633. "adcs r5, r5, %[r]\n\t"
  33634. #elif defined(__clang__)
  33635. "adcs r5, %[r]\n\t"
  33636. #else
  33637. "adc r5, %[r]\n\t"
  33638. #endif
  33639. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33640. "lsrs r6, %[a], #16\n\t"
  33641. #else
  33642. "lsr r6, %[a], #16\n\t"
  33643. #endif
  33644. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33645. "lsrs r7, %[b], #16\n\t"
  33646. #else
  33647. "lsr r7, %[b], #16\n\t"
  33648. #endif
  33649. #ifdef WOLFSSL_KEIL
  33650. "muls r7, r6, r7\n\t"
  33651. #elif defined(__clang__)
  33652. "muls r7, r6\n\t"
  33653. #else
  33654. "mul r7, r6\n\t"
  33655. #endif
  33656. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33657. "adds r4, r4, r7\n\t"
  33658. #else
  33659. "add r4, r4, r7\n\t"
  33660. #endif
  33661. #ifdef WOLFSSL_KEIL
  33662. "adcs r5, r5, %[r]\n\t"
  33663. #elif defined(__clang__)
  33664. "adcs r5, %[r]\n\t"
  33665. #else
  33666. "adc r5, %[r]\n\t"
  33667. #endif
  33668. "uxth r7, %[b]\n\t"
  33669. #ifdef WOLFSSL_KEIL
  33670. "muls r6, r7, r6\n\t"
  33671. #elif defined(__clang__)
  33672. "muls r6, r7\n\t"
  33673. #else
  33674. "mul r6, r7\n\t"
  33675. #endif
  33676. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33677. "lsrs r7, r6, #16\n\t"
  33678. #else
  33679. "lsr r7, r6, #16\n\t"
  33680. #endif
  33681. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33682. "lsls r6, r6, #16\n\t"
  33683. #else
  33684. "lsl r6, r6, #16\n\t"
  33685. #endif
  33686. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33687. "adds r3, r3, r6\n\t"
  33688. #else
  33689. "add r3, r3, r6\n\t"
  33690. #endif
  33691. #ifdef WOLFSSL_KEIL
  33692. "adcs r4, r4, r7\n\t"
  33693. #elif defined(__clang__)
  33694. "adcs r4, r7\n\t"
  33695. #else
  33696. "adc r4, r7\n\t"
  33697. #endif
  33698. #ifdef WOLFSSL_KEIL
  33699. "adcs r5, r5, %[r]\n\t"
  33700. #elif defined(__clang__)
  33701. "adcs r5, %[r]\n\t"
  33702. #else
  33703. "adc r5, %[r]\n\t"
  33704. #endif
  33705. "# A[3] * B[3]\n\t"
  33706. "mov %[a], r9\n\t"
  33707. "mov %[b], r10\n\t"
  33708. "ldr %[a], [%[a], #12]\n\t"
  33709. "ldr %[b], [%[b], #12]\n\t"
  33710. "uxth r6, %[a]\n\t"
  33711. "uxth r7, %[b]\n\t"
  33712. #ifdef WOLFSSL_KEIL
  33713. "muls r7, r6, r7\n\t"
  33714. #elif defined(__clang__)
  33715. "muls r7, r6\n\t"
  33716. #else
  33717. "mul r7, r6\n\t"
  33718. #endif
  33719. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33720. "adds r3, r3, r7\n\t"
  33721. #else
  33722. "add r3, r3, r7\n\t"
  33723. #endif
  33724. #ifdef WOLFSSL_KEIL
  33725. "adcs r4, r4, %[r]\n\t"
  33726. #elif defined(__clang__)
  33727. "adcs r4, %[r]\n\t"
  33728. #else
  33729. "adc r4, %[r]\n\t"
  33730. #endif
  33731. #ifdef WOLFSSL_KEIL
  33732. "adcs r5, r5, %[r]\n\t"
  33733. #elif defined(__clang__)
  33734. "adcs r5, %[r]\n\t"
  33735. #else
  33736. "adc r5, %[r]\n\t"
  33737. #endif
  33738. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33739. "lsrs r7, %[b], #16\n\t"
  33740. #else
  33741. "lsr r7, %[b], #16\n\t"
  33742. #endif
  33743. #ifdef WOLFSSL_KEIL
  33744. "muls r6, r7, r6\n\t"
  33745. #elif defined(__clang__)
  33746. "muls r6, r7\n\t"
  33747. #else
  33748. "mul r6, r7\n\t"
  33749. #endif
  33750. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33751. "lsrs r7, r6, #16\n\t"
  33752. #else
  33753. "lsr r7, r6, #16\n\t"
  33754. #endif
  33755. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33756. "lsls r6, r6, #16\n\t"
  33757. #else
  33758. "lsl r6, r6, #16\n\t"
  33759. #endif
  33760. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33761. "adds r3, r3, r6\n\t"
  33762. #else
  33763. "add r3, r3, r6\n\t"
  33764. #endif
  33765. #ifdef WOLFSSL_KEIL
  33766. "adcs r4, r4, r7\n\t"
  33767. #elif defined(__clang__)
  33768. "adcs r4, r7\n\t"
  33769. #else
  33770. "adc r4, r7\n\t"
  33771. #endif
  33772. #ifdef WOLFSSL_KEIL
  33773. "adcs r5, r5, %[r]\n\t"
  33774. #elif defined(__clang__)
  33775. "adcs r5, %[r]\n\t"
  33776. #else
  33777. "adc r5, %[r]\n\t"
  33778. #endif
  33779. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33780. "lsrs r6, %[a], #16\n\t"
  33781. #else
  33782. "lsr r6, %[a], #16\n\t"
  33783. #endif
  33784. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33785. "lsrs r7, %[b], #16\n\t"
  33786. #else
  33787. "lsr r7, %[b], #16\n\t"
  33788. #endif
  33789. #ifdef WOLFSSL_KEIL
  33790. "muls r7, r6, r7\n\t"
  33791. #elif defined(__clang__)
  33792. "muls r7, r6\n\t"
  33793. #else
  33794. "mul r7, r6\n\t"
  33795. #endif
  33796. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33797. "adds r4, r4, r7\n\t"
  33798. #else
  33799. "add r4, r4, r7\n\t"
  33800. #endif
  33801. #ifdef WOLFSSL_KEIL
  33802. "adcs r5, r5, %[r]\n\t"
  33803. #elif defined(__clang__)
  33804. "adcs r5, %[r]\n\t"
  33805. #else
  33806. "adc r5, %[r]\n\t"
  33807. #endif
  33808. "uxth r7, %[b]\n\t"
  33809. #ifdef WOLFSSL_KEIL
  33810. "muls r6, r7, r6\n\t"
  33811. #elif defined(__clang__)
  33812. "muls r6, r7\n\t"
  33813. #else
  33814. "mul r6, r7\n\t"
  33815. #endif
  33816. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33817. "lsrs r7, r6, #16\n\t"
  33818. #else
  33819. "lsr r7, r6, #16\n\t"
  33820. #endif
  33821. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33822. "lsls r6, r6, #16\n\t"
  33823. #else
  33824. "lsl r6, r6, #16\n\t"
  33825. #endif
  33826. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33827. "adds r3, r3, r6\n\t"
  33828. #else
  33829. "add r3, r3, r6\n\t"
  33830. #endif
  33831. #ifdef WOLFSSL_KEIL
  33832. "adcs r4, r4, r7\n\t"
  33833. #elif defined(__clang__)
  33834. "adcs r4, r7\n\t"
  33835. #else
  33836. "adc r4, r7\n\t"
  33837. #endif
  33838. #ifdef WOLFSSL_KEIL
  33839. "adcs r5, r5, %[r]\n\t"
  33840. #elif defined(__clang__)
  33841. "adcs r5, %[r]\n\t"
  33842. #else
  33843. "adc r5, %[r]\n\t"
  33844. #endif
  33845. "# A[2] * B[4]\n\t"
  33846. "mov %[a], r9\n\t"
  33847. "mov %[b], r10\n\t"
  33848. "ldr %[a], [%[a], #8]\n\t"
  33849. "ldr %[b], [%[b], #16]\n\t"
  33850. "uxth r6, %[a]\n\t"
  33851. "uxth r7, %[b]\n\t"
  33852. #ifdef WOLFSSL_KEIL
  33853. "muls r7, r6, r7\n\t"
  33854. #elif defined(__clang__)
  33855. "muls r7, r6\n\t"
  33856. #else
  33857. "mul r7, r6\n\t"
  33858. #endif
  33859. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33860. "adds r3, r3, r7\n\t"
  33861. #else
  33862. "add r3, r3, r7\n\t"
  33863. #endif
  33864. #ifdef WOLFSSL_KEIL
  33865. "adcs r4, r4, %[r]\n\t"
  33866. #elif defined(__clang__)
  33867. "adcs r4, %[r]\n\t"
  33868. #else
  33869. "adc r4, %[r]\n\t"
  33870. #endif
  33871. #ifdef WOLFSSL_KEIL
  33872. "adcs r5, r5, %[r]\n\t"
  33873. #elif defined(__clang__)
  33874. "adcs r5, %[r]\n\t"
  33875. #else
  33876. "adc r5, %[r]\n\t"
  33877. #endif
  33878. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33879. "lsrs r7, %[b], #16\n\t"
  33880. #else
  33881. "lsr r7, %[b], #16\n\t"
  33882. #endif
  33883. #ifdef WOLFSSL_KEIL
  33884. "muls r6, r7, r6\n\t"
  33885. #elif defined(__clang__)
  33886. "muls r6, r7\n\t"
  33887. #else
  33888. "mul r6, r7\n\t"
  33889. #endif
  33890. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33891. "lsrs r7, r6, #16\n\t"
  33892. #else
  33893. "lsr r7, r6, #16\n\t"
  33894. #endif
  33895. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33896. "lsls r6, r6, #16\n\t"
  33897. #else
  33898. "lsl r6, r6, #16\n\t"
  33899. #endif
  33900. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33901. "adds r3, r3, r6\n\t"
  33902. #else
  33903. "add r3, r3, r6\n\t"
  33904. #endif
  33905. #ifdef WOLFSSL_KEIL
  33906. "adcs r4, r4, r7\n\t"
  33907. #elif defined(__clang__)
  33908. "adcs r4, r7\n\t"
  33909. #else
  33910. "adc r4, r7\n\t"
  33911. #endif
  33912. #ifdef WOLFSSL_KEIL
  33913. "adcs r5, r5, %[r]\n\t"
  33914. #elif defined(__clang__)
  33915. "adcs r5, %[r]\n\t"
  33916. #else
  33917. "adc r5, %[r]\n\t"
  33918. #endif
  33919. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33920. "lsrs r6, %[a], #16\n\t"
  33921. #else
  33922. "lsr r6, %[a], #16\n\t"
  33923. #endif
  33924. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33925. "lsrs r7, %[b], #16\n\t"
  33926. #else
  33927. "lsr r7, %[b], #16\n\t"
  33928. #endif
  33929. #ifdef WOLFSSL_KEIL
  33930. "muls r7, r6, r7\n\t"
  33931. #elif defined(__clang__)
  33932. "muls r7, r6\n\t"
  33933. #else
  33934. "mul r7, r6\n\t"
  33935. #endif
  33936. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33937. "adds r4, r4, r7\n\t"
  33938. #else
  33939. "add r4, r4, r7\n\t"
  33940. #endif
  33941. #ifdef WOLFSSL_KEIL
  33942. "adcs r5, r5, %[r]\n\t"
  33943. #elif defined(__clang__)
  33944. "adcs r5, %[r]\n\t"
  33945. #else
  33946. "adc r5, %[r]\n\t"
  33947. #endif
  33948. "uxth r7, %[b]\n\t"
  33949. #ifdef WOLFSSL_KEIL
  33950. "muls r6, r7, r6\n\t"
  33951. #elif defined(__clang__)
  33952. "muls r6, r7\n\t"
  33953. #else
  33954. "mul r6, r7\n\t"
  33955. #endif
  33956. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33957. "lsrs r7, r6, #16\n\t"
  33958. #else
  33959. "lsr r7, r6, #16\n\t"
  33960. #endif
  33961. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33962. "lsls r6, r6, #16\n\t"
  33963. #else
  33964. "lsl r6, r6, #16\n\t"
  33965. #endif
  33966. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33967. "adds r3, r3, r6\n\t"
  33968. #else
  33969. "add r3, r3, r6\n\t"
  33970. #endif
  33971. #ifdef WOLFSSL_KEIL
  33972. "adcs r4, r4, r7\n\t"
  33973. #elif defined(__clang__)
  33974. "adcs r4, r7\n\t"
  33975. #else
  33976. "adc r4, r7\n\t"
  33977. #endif
  33978. #ifdef WOLFSSL_KEIL
  33979. "adcs r5, r5, %[r]\n\t"
  33980. #elif defined(__clang__)
  33981. "adcs r5, %[r]\n\t"
  33982. #else
  33983. "adc r5, %[r]\n\t"
  33984. #endif
  33985. "# A[1] * B[5]\n\t"
  33986. "mov %[a], r9\n\t"
  33987. "mov %[b], r10\n\t"
  33988. "ldr %[a], [%[a], #4]\n\t"
  33989. "ldr %[b], [%[b], #20]\n\t"
  33990. "uxth r6, %[a]\n\t"
  33991. "uxth r7, %[b]\n\t"
  33992. #ifdef WOLFSSL_KEIL
  33993. "muls r7, r6, r7\n\t"
  33994. #elif defined(__clang__)
  33995. "muls r7, r6\n\t"
  33996. #else
  33997. "mul r7, r6\n\t"
  33998. #endif
  33999. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34000. "adds r3, r3, r7\n\t"
  34001. #else
  34002. "add r3, r3, r7\n\t"
  34003. #endif
  34004. #ifdef WOLFSSL_KEIL
  34005. "adcs r4, r4, %[r]\n\t"
  34006. #elif defined(__clang__)
  34007. "adcs r4, %[r]\n\t"
  34008. #else
  34009. "adc r4, %[r]\n\t"
  34010. #endif
  34011. #ifdef WOLFSSL_KEIL
  34012. "adcs r5, r5, %[r]\n\t"
  34013. #elif defined(__clang__)
  34014. "adcs r5, %[r]\n\t"
  34015. #else
  34016. "adc r5, %[r]\n\t"
  34017. #endif
  34018. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34019. "lsrs r7, %[b], #16\n\t"
  34020. #else
  34021. "lsr r7, %[b], #16\n\t"
  34022. #endif
  34023. #ifdef WOLFSSL_KEIL
  34024. "muls r6, r7, r6\n\t"
  34025. #elif defined(__clang__)
  34026. "muls r6, r7\n\t"
  34027. #else
  34028. "mul r6, r7\n\t"
  34029. #endif
  34030. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34031. "lsrs r7, r6, #16\n\t"
  34032. #else
  34033. "lsr r7, r6, #16\n\t"
  34034. #endif
  34035. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34036. "lsls r6, r6, #16\n\t"
  34037. #else
  34038. "lsl r6, r6, #16\n\t"
  34039. #endif
  34040. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34041. "adds r3, r3, r6\n\t"
  34042. #else
  34043. "add r3, r3, r6\n\t"
  34044. #endif
  34045. #ifdef WOLFSSL_KEIL
  34046. "adcs r4, r4, r7\n\t"
  34047. #elif defined(__clang__)
  34048. "adcs r4, r7\n\t"
  34049. #else
  34050. "adc r4, r7\n\t"
  34051. #endif
  34052. #ifdef WOLFSSL_KEIL
  34053. "adcs r5, r5, %[r]\n\t"
  34054. #elif defined(__clang__)
  34055. "adcs r5, %[r]\n\t"
  34056. #else
  34057. "adc r5, %[r]\n\t"
  34058. #endif
  34059. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34060. "lsrs r6, %[a], #16\n\t"
  34061. #else
  34062. "lsr r6, %[a], #16\n\t"
  34063. #endif
  34064. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34065. "lsrs r7, %[b], #16\n\t"
  34066. #else
  34067. "lsr r7, %[b], #16\n\t"
  34068. #endif
  34069. #ifdef WOLFSSL_KEIL
  34070. "muls r7, r6, r7\n\t"
  34071. #elif defined(__clang__)
  34072. "muls r7, r6\n\t"
  34073. #else
  34074. "mul r7, r6\n\t"
  34075. #endif
  34076. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34077. "adds r4, r4, r7\n\t"
  34078. #else
  34079. "add r4, r4, r7\n\t"
  34080. #endif
  34081. #ifdef WOLFSSL_KEIL
  34082. "adcs r5, r5, %[r]\n\t"
  34083. #elif defined(__clang__)
  34084. "adcs r5, %[r]\n\t"
  34085. #else
  34086. "adc r5, %[r]\n\t"
  34087. #endif
  34088. "uxth r7, %[b]\n\t"
  34089. #ifdef WOLFSSL_KEIL
  34090. "muls r6, r7, r6\n\t"
  34091. #elif defined(__clang__)
  34092. "muls r6, r7\n\t"
  34093. #else
  34094. "mul r6, r7\n\t"
  34095. #endif
  34096. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34097. "lsrs r7, r6, #16\n\t"
  34098. #else
  34099. "lsr r7, r6, #16\n\t"
  34100. #endif
  34101. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34102. "lsls r6, r6, #16\n\t"
  34103. #else
  34104. "lsl r6, r6, #16\n\t"
  34105. #endif
  34106. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34107. "adds r3, r3, r6\n\t"
  34108. #else
  34109. "add r3, r3, r6\n\t"
  34110. #endif
  34111. #ifdef WOLFSSL_KEIL
  34112. "adcs r4, r4, r7\n\t"
  34113. #elif defined(__clang__)
  34114. "adcs r4, r7\n\t"
  34115. #else
  34116. "adc r4, r7\n\t"
  34117. #endif
  34118. #ifdef WOLFSSL_KEIL
  34119. "adcs r5, r5, %[r]\n\t"
  34120. #elif defined(__clang__)
  34121. "adcs r5, %[r]\n\t"
  34122. #else
  34123. "adc r5, %[r]\n\t"
  34124. #endif
  34125. "# A[0] * B[6]\n\t"
  34126. "mov %[a], r9\n\t"
  34127. "mov %[b], r10\n\t"
  34128. "ldr %[a], [%[a]]\n\t"
  34129. "ldr %[b], [%[b], #24]\n\t"
  34130. "uxth r6, %[a]\n\t"
  34131. "uxth r7, %[b]\n\t"
  34132. #ifdef WOLFSSL_KEIL
  34133. "muls r7, r6, r7\n\t"
  34134. #elif defined(__clang__)
  34135. "muls r7, r6\n\t"
  34136. #else
  34137. "mul r7, r6\n\t"
  34138. #endif
  34139. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34140. "adds r3, r3, r7\n\t"
  34141. #else
  34142. "add r3, r3, r7\n\t"
  34143. #endif
  34144. #ifdef WOLFSSL_KEIL
  34145. "adcs r4, r4, %[r]\n\t"
  34146. #elif defined(__clang__)
  34147. "adcs r4, %[r]\n\t"
  34148. #else
  34149. "adc r4, %[r]\n\t"
  34150. #endif
  34151. #ifdef WOLFSSL_KEIL
  34152. "adcs r5, r5, %[r]\n\t"
  34153. #elif defined(__clang__)
  34154. "adcs r5, %[r]\n\t"
  34155. #else
  34156. "adc r5, %[r]\n\t"
  34157. #endif
  34158. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34159. "lsrs r7, %[b], #16\n\t"
  34160. #else
  34161. "lsr r7, %[b], #16\n\t"
  34162. #endif
  34163. #ifdef WOLFSSL_KEIL
  34164. "muls r6, r7, r6\n\t"
  34165. #elif defined(__clang__)
  34166. "muls r6, r7\n\t"
  34167. #else
  34168. "mul r6, r7\n\t"
  34169. #endif
  34170. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34171. "lsrs r7, r6, #16\n\t"
  34172. #else
  34173. "lsr r7, r6, #16\n\t"
  34174. #endif
  34175. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34176. "lsls r6, r6, #16\n\t"
  34177. #else
  34178. "lsl r6, r6, #16\n\t"
  34179. #endif
  34180. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34181. "adds r3, r3, r6\n\t"
  34182. #else
  34183. "add r3, r3, r6\n\t"
  34184. #endif
  34185. #ifdef WOLFSSL_KEIL
  34186. "adcs r4, r4, r7\n\t"
  34187. #elif defined(__clang__)
  34188. "adcs r4, r7\n\t"
  34189. #else
  34190. "adc r4, r7\n\t"
  34191. #endif
  34192. #ifdef WOLFSSL_KEIL
  34193. "adcs r5, r5, %[r]\n\t"
  34194. #elif defined(__clang__)
  34195. "adcs r5, %[r]\n\t"
  34196. #else
  34197. "adc r5, %[r]\n\t"
  34198. #endif
  34199. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34200. "lsrs r6, %[a], #16\n\t"
  34201. #else
  34202. "lsr r6, %[a], #16\n\t"
  34203. #endif
  34204. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34205. "lsrs r7, %[b], #16\n\t"
  34206. #else
  34207. "lsr r7, %[b], #16\n\t"
  34208. #endif
  34209. #ifdef WOLFSSL_KEIL
  34210. "muls r7, r6, r7\n\t"
  34211. #elif defined(__clang__)
  34212. "muls r7, r6\n\t"
  34213. #else
  34214. "mul r7, r6\n\t"
  34215. #endif
  34216. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34217. "adds r4, r4, r7\n\t"
  34218. #else
  34219. "add r4, r4, r7\n\t"
  34220. #endif
  34221. #ifdef WOLFSSL_KEIL
  34222. "adcs r5, r5, %[r]\n\t"
  34223. #elif defined(__clang__)
  34224. "adcs r5, %[r]\n\t"
  34225. #else
  34226. "adc r5, %[r]\n\t"
  34227. #endif
  34228. "uxth r7, %[b]\n\t"
  34229. #ifdef WOLFSSL_KEIL
  34230. "muls r6, r7, r6\n\t"
  34231. #elif defined(__clang__)
  34232. "muls r6, r7\n\t"
  34233. #else
  34234. "mul r6, r7\n\t"
  34235. #endif
  34236. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34237. "lsrs r7, r6, #16\n\t"
  34238. #else
  34239. "lsr r7, r6, #16\n\t"
  34240. #endif
  34241. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34242. "lsls r6, r6, #16\n\t"
  34243. #else
  34244. "lsl r6, r6, #16\n\t"
  34245. #endif
  34246. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34247. "adds r3, r3, r6\n\t"
  34248. #else
  34249. "add r3, r3, r6\n\t"
  34250. #endif
  34251. #ifdef WOLFSSL_KEIL
  34252. "adcs r4, r4, r7\n\t"
  34253. #elif defined(__clang__)
  34254. "adcs r4, r7\n\t"
  34255. #else
  34256. "adc r4, r7\n\t"
  34257. #endif
  34258. #ifdef WOLFSSL_KEIL
  34259. "adcs r5, r5, %[r]\n\t"
  34260. #elif defined(__clang__)
  34261. "adcs r5, %[r]\n\t"
  34262. #else
  34263. "adc r5, %[r]\n\t"
  34264. #endif
  34265. "str r3, [sp, #24]\n\t"
  34266. "# A[0] * B[7]\n\t"
  34267. "movs r3, #0\n\t"
  34268. "mov %[a], r9\n\t"
  34269. "mov %[b], r10\n\t"
  34270. "ldr %[a], [%[a]]\n\t"
  34271. "ldr %[b], [%[b], #28]\n\t"
  34272. "uxth r6, %[a]\n\t"
  34273. "uxth r7, %[b]\n\t"
  34274. #ifdef WOLFSSL_KEIL
  34275. "muls r7, r6, r7\n\t"
  34276. #elif defined(__clang__)
  34277. "muls r7, r6\n\t"
  34278. #else
  34279. "mul r7, r6\n\t"
  34280. #endif
  34281. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34282. "adds r4, r4, r7\n\t"
  34283. #else
  34284. "add r4, r4, r7\n\t"
  34285. #endif
  34286. #ifdef WOLFSSL_KEIL
  34287. "adcs r5, r5, %[r]\n\t"
  34288. #elif defined(__clang__)
  34289. "adcs r5, %[r]\n\t"
  34290. #else
  34291. "adc r5, %[r]\n\t"
  34292. #endif
  34293. #ifdef WOLFSSL_KEIL
  34294. "adcs r3, r3, %[r]\n\t"
  34295. #elif defined(__clang__)
  34296. "adcs r3, %[r]\n\t"
  34297. #else
  34298. "adc r3, %[r]\n\t"
  34299. #endif
  34300. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34301. "lsrs r7, %[b], #16\n\t"
  34302. #else
  34303. "lsr r7, %[b], #16\n\t"
  34304. #endif
  34305. #ifdef WOLFSSL_KEIL
  34306. "muls r6, r7, r6\n\t"
  34307. #elif defined(__clang__)
  34308. "muls r6, r7\n\t"
  34309. #else
  34310. "mul r6, r7\n\t"
  34311. #endif
  34312. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34313. "lsrs r7, r6, #16\n\t"
  34314. #else
  34315. "lsr r7, r6, #16\n\t"
  34316. #endif
  34317. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34318. "lsls r6, r6, #16\n\t"
  34319. #else
  34320. "lsl r6, r6, #16\n\t"
  34321. #endif
  34322. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34323. "adds r4, r4, r6\n\t"
  34324. #else
  34325. "add r4, r4, r6\n\t"
  34326. #endif
  34327. #ifdef WOLFSSL_KEIL
  34328. "adcs r5, r5, r7\n\t"
  34329. #elif defined(__clang__)
  34330. "adcs r5, r7\n\t"
  34331. #else
  34332. "adc r5, r7\n\t"
  34333. #endif
  34334. #ifdef WOLFSSL_KEIL
  34335. "adcs r3, r3, %[r]\n\t"
  34336. #elif defined(__clang__)
  34337. "adcs r3, %[r]\n\t"
  34338. #else
  34339. "adc r3, %[r]\n\t"
  34340. #endif
  34341. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34342. "lsrs r6, %[a], #16\n\t"
  34343. #else
  34344. "lsr r6, %[a], #16\n\t"
  34345. #endif
  34346. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34347. "lsrs r7, %[b], #16\n\t"
  34348. #else
  34349. "lsr r7, %[b], #16\n\t"
  34350. #endif
  34351. #ifdef WOLFSSL_KEIL
  34352. "muls r7, r6, r7\n\t"
  34353. #elif defined(__clang__)
  34354. "muls r7, r6\n\t"
  34355. #else
  34356. "mul r7, r6\n\t"
  34357. #endif
  34358. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34359. "adds r5, r5, r7\n\t"
  34360. #else
  34361. "add r5, r5, r7\n\t"
  34362. #endif
  34363. #ifdef WOLFSSL_KEIL
  34364. "adcs r3, r3, %[r]\n\t"
  34365. #elif defined(__clang__)
  34366. "adcs r3, %[r]\n\t"
  34367. #else
  34368. "adc r3, %[r]\n\t"
  34369. #endif
  34370. "uxth r7, %[b]\n\t"
  34371. #ifdef WOLFSSL_KEIL
  34372. "muls r6, r7, r6\n\t"
  34373. #elif defined(__clang__)
  34374. "muls r6, r7\n\t"
  34375. #else
  34376. "mul r6, r7\n\t"
  34377. #endif
  34378. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34379. "lsrs r7, r6, #16\n\t"
  34380. #else
  34381. "lsr r7, r6, #16\n\t"
  34382. #endif
  34383. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34384. "lsls r6, r6, #16\n\t"
  34385. #else
  34386. "lsl r6, r6, #16\n\t"
  34387. #endif
  34388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34389. "adds r4, r4, r6\n\t"
  34390. #else
  34391. "add r4, r4, r6\n\t"
  34392. #endif
  34393. #ifdef WOLFSSL_KEIL
  34394. "adcs r5, r5, r7\n\t"
  34395. #elif defined(__clang__)
  34396. "adcs r5, r7\n\t"
  34397. #else
  34398. "adc r5, r7\n\t"
  34399. #endif
  34400. #ifdef WOLFSSL_KEIL
  34401. "adcs r3, r3, %[r]\n\t"
  34402. #elif defined(__clang__)
  34403. "adcs r3, %[r]\n\t"
  34404. #else
  34405. "adc r3, %[r]\n\t"
  34406. #endif
  34407. "# A[1] * B[6]\n\t"
  34408. "mov %[a], r9\n\t"
  34409. "mov %[b], r10\n\t"
  34410. "ldr %[a], [%[a], #4]\n\t"
  34411. "ldr %[b], [%[b], #24]\n\t"
  34412. "uxth r6, %[a]\n\t"
  34413. "uxth r7, %[b]\n\t"
  34414. #ifdef WOLFSSL_KEIL
  34415. "muls r7, r6, r7\n\t"
  34416. #elif defined(__clang__)
  34417. "muls r7, r6\n\t"
  34418. #else
  34419. "mul r7, r6\n\t"
  34420. #endif
  34421. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34422. "adds r4, r4, r7\n\t"
  34423. #else
  34424. "add r4, r4, r7\n\t"
  34425. #endif
  34426. #ifdef WOLFSSL_KEIL
  34427. "adcs r5, r5, %[r]\n\t"
  34428. #elif defined(__clang__)
  34429. "adcs r5, %[r]\n\t"
  34430. #else
  34431. "adc r5, %[r]\n\t"
  34432. #endif
  34433. #ifdef WOLFSSL_KEIL
  34434. "adcs r3, r3, %[r]\n\t"
  34435. #elif defined(__clang__)
  34436. "adcs r3, %[r]\n\t"
  34437. #else
  34438. "adc r3, %[r]\n\t"
  34439. #endif
  34440. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34441. "lsrs r7, %[b], #16\n\t"
  34442. #else
  34443. "lsr r7, %[b], #16\n\t"
  34444. #endif
  34445. #ifdef WOLFSSL_KEIL
  34446. "muls r6, r7, r6\n\t"
  34447. #elif defined(__clang__)
  34448. "muls r6, r7\n\t"
  34449. #else
  34450. "mul r6, r7\n\t"
  34451. #endif
  34452. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34453. "lsrs r7, r6, #16\n\t"
  34454. #else
  34455. "lsr r7, r6, #16\n\t"
  34456. #endif
  34457. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34458. "lsls r6, r6, #16\n\t"
  34459. #else
  34460. "lsl r6, r6, #16\n\t"
  34461. #endif
  34462. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34463. "adds r4, r4, r6\n\t"
  34464. #else
  34465. "add r4, r4, r6\n\t"
  34466. #endif
  34467. #ifdef WOLFSSL_KEIL
  34468. "adcs r5, r5, r7\n\t"
  34469. #elif defined(__clang__)
  34470. "adcs r5, r7\n\t"
  34471. #else
  34472. "adc r5, r7\n\t"
  34473. #endif
  34474. #ifdef WOLFSSL_KEIL
  34475. "adcs r3, r3, %[r]\n\t"
  34476. #elif defined(__clang__)
  34477. "adcs r3, %[r]\n\t"
  34478. #else
  34479. "adc r3, %[r]\n\t"
  34480. #endif
  34481. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34482. "lsrs r6, %[a], #16\n\t"
  34483. #else
  34484. "lsr r6, %[a], #16\n\t"
  34485. #endif
  34486. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34487. "lsrs r7, %[b], #16\n\t"
  34488. #else
  34489. "lsr r7, %[b], #16\n\t"
  34490. #endif
  34491. #ifdef WOLFSSL_KEIL
  34492. "muls r7, r6, r7\n\t"
  34493. #elif defined(__clang__)
  34494. "muls r7, r6\n\t"
  34495. #else
  34496. "mul r7, r6\n\t"
  34497. #endif
  34498. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34499. "adds r5, r5, r7\n\t"
  34500. #else
  34501. "add r5, r5, r7\n\t"
  34502. #endif
  34503. #ifdef WOLFSSL_KEIL
  34504. "adcs r3, r3, %[r]\n\t"
  34505. #elif defined(__clang__)
  34506. "adcs r3, %[r]\n\t"
  34507. #else
  34508. "adc r3, %[r]\n\t"
  34509. #endif
  34510. "uxth r7, %[b]\n\t"
  34511. #ifdef WOLFSSL_KEIL
  34512. "muls r6, r7, r6\n\t"
  34513. #elif defined(__clang__)
  34514. "muls r6, r7\n\t"
  34515. #else
  34516. "mul r6, r7\n\t"
  34517. #endif
  34518. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34519. "lsrs r7, r6, #16\n\t"
  34520. #else
  34521. "lsr r7, r6, #16\n\t"
  34522. #endif
  34523. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34524. "lsls r6, r6, #16\n\t"
  34525. #else
  34526. "lsl r6, r6, #16\n\t"
  34527. #endif
  34528. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34529. "adds r4, r4, r6\n\t"
  34530. #else
  34531. "add r4, r4, r6\n\t"
  34532. #endif
  34533. #ifdef WOLFSSL_KEIL
  34534. "adcs r5, r5, r7\n\t"
  34535. #elif defined(__clang__)
  34536. "adcs r5, r7\n\t"
  34537. #else
  34538. "adc r5, r7\n\t"
  34539. #endif
  34540. #ifdef WOLFSSL_KEIL
  34541. "adcs r3, r3, %[r]\n\t"
  34542. #elif defined(__clang__)
  34543. "adcs r3, %[r]\n\t"
  34544. #else
  34545. "adc r3, %[r]\n\t"
  34546. #endif
  34547. "# A[2] * B[5]\n\t"
  34548. "mov %[a], r9\n\t"
  34549. "mov %[b], r10\n\t"
  34550. "ldr %[a], [%[a], #8]\n\t"
  34551. "ldr %[b], [%[b], #20]\n\t"
  34552. "uxth r6, %[a]\n\t"
  34553. "uxth r7, %[b]\n\t"
  34554. #ifdef WOLFSSL_KEIL
  34555. "muls r7, r6, r7\n\t"
  34556. #elif defined(__clang__)
  34557. "muls r7, r6\n\t"
  34558. #else
  34559. "mul r7, r6\n\t"
  34560. #endif
  34561. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34562. "adds r4, r4, r7\n\t"
  34563. #else
  34564. "add r4, r4, r7\n\t"
  34565. #endif
  34566. #ifdef WOLFSSL_KEIL
  34567. "adcs r5, r5, %[r]\n\t"
  34568. #elif defined(__clang__)
  34569. "adcs r5, %[r]\n\t"
  34570. #else
  34571. "adc r5, %[r]\n\t"
  34572. #endif
  34573. #ifdef WOLFSSL_KEIL
  34574. "adcs r3, r3, %[r]\n\t"
  34575. #elif defined(__clang__)
  34576. "adcs r3, %[r]\n\t"
  34577. #else
  34578. "adc r3, %[r]\n\t"
  34579. #endif
  34580. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34581. "lsrs r7, %[b], #16\n\t"
  34582. #else
  34583. "lsr r7, %[b], #16\n\t"
  34584. #endif
  34585. #ifdef WOLFSSL_KEIL
  34586. "muls r6, r7, r6\n\t"
  34587. #elif defined(__clang__)
  34588. "muls r6, r7\n\t"
  34589. #else
  34590. "mul r6, r7\n\t"
  34591. #endif
  34592. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34593. "lsrs r7, r6, #16\n\t"
  34594. #else
  34595. "lsr r7, r6, #16\n\t"
  34596. #endif
  34597. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34598. "lsls r6, r6, #16\n\t"
  34599. #else
  34600. "lsl r6, r6, #16\n\t"
  34601. #endif
  34602. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34603. "adds r4, r4, r6\n\t"
  34604. #else
  34605. "add r4, r4, r6\n\t"
  34606. #endif
  34607. #ifdef WOLFSSL_KEIL
  34608. "adcs r5, r5, r7\n\t"
  34609. #elif defined(__clang__)
  34610. "adcs r5, r7\n\t"
  34611. #else
  34612. "adc r5, r7\n\t"
  34613. #endif
  34614. #ifdef WOLFSSL_KEIL
  34615. "adcs r3, r3, %[r]\n\t"
  34616. #elif defined(__clang__)
  34617. "adcs r3, %[r]\n\t"
  34618. #else
  34619. "adc r3, %[r]\n\t"
  34620. #endif
  34621. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34622. "lsrs r6, %[a], #16\n\t"
  34623. #else
  34624. "lsr r6, %[a], #16\n\t"
  34625. #endif
  34626. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34627. "lsrs r7, %[b], #16\n\t"
  34628. #else
  34629. "lsr r7, %[b], #16\n\t"
  34630. #endif
  34631. #ifdef WOLFSSL_KEIL
  34632. "muls r7, r6, r7\n\t"
  34633. #elif defined(__clang__)
  34634. "muls r7, r6\n\t"
  34635. #else
  34636. "mul r7, r6\n\t"
  34637. #endif
  34638. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34639. "adds r5, r5, r7\n\t"
  34640. #else
  34641. "add r5, r5, r7\n\t"
  34642. #endif
  34643. #ifdef WOLFSSL_KEIL
  34644. "adcs r3, r3, %[r]\n\t"
  34645. #elif defined(__clang__)
  34646. "adcs r3, %[r]\n\t"
  34647. #else
  34648. "adc r3, %[r]\n\t"
  34649. #endif
  34650. "uxth r7, %[b]\n\t"
  34651. #ifdef WOLFSSL_KEIL
  34652. "muls r6, r7, r6\n\t"
  34653. #elif defined(__clang__)
  34654. "muls r6, r7\n\t"
  34655. #else
  34656. "mul r6, r7\n\t"
  34657. #endif
  34658. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34659. "lsrs r7, r6, #16\n\t"
  34660. #else
  34661. "lsr r7, r6, #16\n\t"
  34662. #endif
  34663. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34664. "lsls r6, r6, #16\n\t"
  34665. #else
  34666. "lsl r6, r6, #16\n\t"
  34667. #endif
  34668. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34669. "adds r4, r4, r6\n\t"
  34670. #else
  34671. "add r4, r4, r6\n\t"
  34672. #endif
  34673. #ifdef WOLFSSL_KEIL
  34674. "adcs r5, r5, r7\n\t"
  34675. #elif defined(__clang__)
  34676. "adcs r5, r7\n\t"
  34677. #else
  34678. "adc r5, r7\n\t"
  34679. #endif
  34680. #ifdef WOLFSSL_KEIL
  34681. "adcs r3, r3, %[r]\n\t"
  34682. #elif defined(__clang__)
  34683. "adcs r3, %[r]\n\t"
  34684. #else
  34685. "adc r3, %[r]\n\t"
  34686. #endif
  34687. "# A[3] * B[4]\n\t"
  34688. "mov %[a], r9\n\t"
  34689. "mov %[b], r10\n\t"
  34690. "ldr %[a], [%[a], #12]\n\t"
  34691. "ldr %[b], [%[b], #16]\n\t"
  34692. "uxth r6, %[a]\n\t"
  34693. "uxth r7, %[b]\n\t"
  34694. #ifdef WOLFSSL_KEIL
  34695. "muls r7, r6, r7\n\t"
  34696. #elif defined(__clang__)
  34697. "muls r7, r6\n\t"
  34698. #else
  34699. "mul r7, r6\n\t"
  34700. #endif
  34701. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34702. "adds r4, r4, r7\n\t"
  34703. #else
  34704. "add r4, r4, r7\n\t"
  34705. #endif
  34706. #ifdef WOLFSSL_KEIL
  34707. "adcs r5, r5, %[r]\n\t"
  34708. #elif defined(__clang__)
  34709. "adcs r5, %[r]\n\t"
  34710. #else
  34711. "adc r5, %[r]\n\t"
  34712. #endif
  34713. #ifdef WOLFSSL_KEIL
  34714. "adcs r3, r3, %[r]\n\t"
  34715. #elif defined(__clang__)
  34716. "adcs r3, %[r]\n\t"
  34717. #else
  34718. "adc r3, %[r]\n\t"
  34719. #endif
  34720. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34721. "lsrs r7, %[b], #16\n\t"
  34722. #else
  34723. "lsr r7, %[b], #16\n\t"
  34724. #endif
  34725. #ifdef WOLFSSL_KEIL
  34726. "muls r6, r7, r6\n\t"
  34727. #elif defined(__clang__)
  34728. "muls r6, r7\n\t"
  34729. #else
  34730. "mul r6, r7\n\t"
  34731. #endif
  34732. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34733. "lsrs r7, r6, #16\n\t"
  34734. #else
  34735. "lsr r7, r6, #16\n\t"
  34736. #endif
  34737. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34738. "lsls r6, r6, #16\n\t"
  34739. #else
  34740. "lsl r6, r6, #16\n\t"
  34741. #endif
  34742. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34743. "adds r4, r4, r6\n\t"
  34744. #else
  34745. "add r4, r4, r6\n\t"
  34746. #endif
  34747. #ifdef WOLFSSL_KEIL
  34748. "adcs r5, r5, r7\n\t"
  34749. #elif defined(__clang__)
  34750. "adcs r5, r7\n\t"
  34751. #else
  34752. "adc r5, r7\n\t"
  34753. #endif
  34754. #ifdef WOLFSSL_KEIL
  34755. "adcs r3, r3, %[r]\n\t"
  34756. #elif defined(__clang__)
  34757. "adcs r3, %[r]\n\t"
  34758. #else
  34759. "adc r3, %[r]\n\t"
  34760. #endif
  34761. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34762. "lsrs r6, %[a], #16\n\t"
  34763. #else
  34764. "lsr r6, %[a], #16\n\t"
  34765. #endif
  34766. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34767. "lsrs r7, %[b], #16\n\t"
  34768. #else
  34769. "lsr r7, %[b], #16\n\t"
  34770. #endif
  34771. #ifdef WOLFSSL_KEIL
  34772. "muls r7, r6, r7\n\t"
  34773. #elif defined(__clang__)
  34774. "muls r7, r6\n\t"
  34775. #else
  34776. "mul r7, r6\n\t"
  34777. #endif
  34778. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34779. "adds r5, r5, r7\n\t"
  34780. #else
  34781. "add r5, r5, r7\n\t"
  34782. #endif
  34783. #ifdef WOLFSSL_KEIL
  34784. "adcs r3, r3, %[r]\n\t"
  34785. #elif defined(__clang__)
  34786. "adcs r3, %[r]\n\t"
  34787. #else
  34788. "adc r3, %[r]\n\t"
  34789. #endif
  34790. "uxth r7, %[b]\n\t"
  34791. #ifdef WOLFSSL_KEIL
  34792. "muls r6, r7, r6\n\t"
  34793. #elif defined(__clang__)
  34794. "muls r6, r7\n\t"
  34795. #else
  34796. "mul r6, r7\n\t"
  34797. #endif
  34798. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34799. "lsrs r7, r6, #16\n\t"
  34800. #else
  34801. "lsr r7, r6, #16\n\t"
  34802. #endif
  34803. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34804. "lsls r6, r6, #16\n\t"
  34805. #else
  34806. "lsl r6, r6, #16\n\t"
  34807. #endif
  34808. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34809. "adds r4, r4, r6\n\t"
  34810. #else
  34811. "add r4, r4, r6\n\t"
  34812. #endif
  34813. #ifdef WOLFSSL_KEIL
  34814. "adcs r5, r5, r7\n\t"
  34815. #elif defined(__clang__)
  34816. "adcs r5, r7\n\t"
  34817. #else
  34818. "adc r5, r7\n\t"
  34819. #endif
  34820. #ifdef WOLFSSL_KEIL
  34821. "adcs r3, r3, %[r]\n\t"
  34822. #elif defined(__clang__)
  34823. "adcs r3, %[r]\n\t"
  34824. #else
  34825. "adc r3, %[r]\n\t"
  34826. #endif
  34827. "# A[4] * B[3]\n\t"
  34828. "mov %[a], r9\n\t"
  34829. "mov %[b], r10\n\t"
  34830. "ldr %[a], [%[a], #16]\n\t"
  34831. "ldr %[b], [%[b], #12]\n\t"
  34832. "uxth r6, %[a]\n\t"
  34833. "uxth r7, %[b]\n\t"
  34834. #ifdef WOLFSSL_KEIL
  34835. "muls r7, r6, r7\n\t"
  34836. #elif defined(__clang__)
  34837. "muls r7, r6\n\t"
  34838. #else
  34839. "mul r7, r6\n\t"
  34840. #endif
  34841. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34842. "adds r4, r4, r7\n\t"
  34843. #else
  34844. "add r4, r4, r7\n\t"
  34845. #endif
  34846. #ifdef WOLFSSL_KEIL
  34847. "adcs r5, r5, %[r]\n\t"
  34848. #elif defined(__clang__)
  34849. "adcs r5, %[r]\n\t"
  34850. #else
  34851. "adc r5, %[r]\n\t"
  34852. #endif
  34853. #ifdef WOLFSSL_KEIL
  34854. "adcs r3, r3, %[r]\n\t"
  34855. #elif defined(__clang__)
  34856. "adcs r3, %[r]\n\t"
  34857. #else
  34858. "adc r3, %[r]\n\t"
  34859. #endif
  34860. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34861. "lsrs r7, %[b], #16\n\t"
  34862. #else
  34863. "lsr r7, %[b], #16\n\t"
  34864. #endif
  34865. #ifdef WOLFSSL_KEIL
  34866. "muls r6, r7, r6\n\t"
  34867. #elif defined(__clang__)
  34868. "muls r6, r7\n\t"
  34869. #else
  34870. "mul r6, r7\n\t"
  34871. #endif
  34872. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34873. "lsrs r7, r6, #16\n\t"
  34874. #else
  34875. "lsr r7, r6, #16\n\t"
  34876. #endif
  34877. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34878. "lsls r6, r6, #16\n\t"
  34879. #else
  34880. "lsl r6, r6, #16\n\t"
  34881. #endif
  34882. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34883. "adds r4, r4, r6\n\t"
  34884. #else
  34885. "add r4, r4, r6\n\t"
  34886. #endif
  34887. #ifdef WOLFSSL_KEIL
  34888. "adcs r5, r5, r7\n\t"
  34889. #elif defined(__clang__)
  34890. "adcs r5, r7\n\t"
  34891. #else
  34892. "adc r5, r7\n\t"
  34893. #endif
  34894. #ifdef WOLFSSL_KEIL
  34895. "adcs r3, r3, %[r]\n\t"
  34896. #elif defined(__clang__)
  34897. "adcs r3, %[r]\n\t"
  34898. #else
  34899. "adc r3, %[r]\n\t"
  34900. #endif
  34901. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34902. "lsrs r6, %[a], #16\n\t"
  34903. #else
  34904. "lsr r6, %[a], #16\n\t"
  34905. #endif
  34906. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34907. "lsrs r7, %[b], #16\n\t"
  34908. #else
  34909. "lsr r7, %[b], #16\n\t"
  34910. #endif
  34911. #ifdef WOLFSSL_KEIL
  34912. "muls r7, r6, r7\n\t"
  34913. #elif defined(__clang__)
  34914. "muls r7, r6\n\t"
  34915. #else
  34916. "mul r7, r6\n\t"
  34917. #endif
  34918. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34919. "adds r5, r5, r7\n\t"
  34920. #else
  34921. "add r5, r5, r7\n\t"
  34922. #endif
  34923. #ifdef WOLFSSL_KEIL
  34924. "adcs r3, r3, %[r]\n\t"
  34925. #elif defined(__clang__)
  34926. "adcs r3, %[r]\n\t"
  34927. #else
  34928. "adc r3, %[r]\n\t"
  34929. #endif
  34930. "uxth r7, %[b]\n\t"
  34931. #ifdef WOLFSSL_KEIL
  34932. "muls r6, r7, r6\n\t"
  34933. #elif defined(__clang__)
  34934. "muls r6, r7\n\t"
  34935. #else
  34936. "mul r6, r7\n\t"
  34937. #endif
  34938. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34939. "lsrs r7, r6, #16\n\t"
  34940. #else
  34941. "lsr r7, r6, #16\n\t"
  34942. #endif
  34943. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34944. "lsls r6, r6, #16\n\t"
  34945. #else
  34946. "lsl r6, r6, #16\n\t"
  34947. #endif
  34948. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34949. "adds r4, r4, r6\n\t"
  34950. #else
  34951. "add r4, r4, r6\n\t"
  34952. #endif
  34953. #ifdef WOLFSSL_KEIL
  34954. "adcs r5, r5, r7\n\t"
  34955. #elif defined(__clang__)
  34956. "adcs r5, r7\n\t"
  34957. #else
  34958. "adc r5, r7\n\t"
  34959. #endif
  34960. #ifdef WOLFSSL_KEIL
  34961. "adcs r3, r3, %[r]\n\t"
  34962. #elif defined(__clang__)
  34963. "adcs r3, %[r]\n\t"
  34964. #else
  34965. "adc r3, %[r]\n\t"
  34966. #endif
  34967. "# A[5] * B[2]\n\t"
  34968. "mov %[a], r9\n\t"
  34969. "mov %[b], r10\n\t"
  34970. "ldr %[a], [%[a], #20]\n\t"
  34971. "ldr %[b], [%[b], #8]\n\t"
  34972. "uxth r6, %[a]\n\t"
  34973. "uxth r7, %[b]\n\t"
  34974. #ifdef WOLFSSL_KEIL
  34975. "muls r7, r6, r7\n\t"
  34976. #elif defined(__clang__)
  34977. "muls r7, r6\n\t"
  34978. #else
  34979. "mul r7, r6\n\t"
  34980. #endif
  34981. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34982. "adds r4, r4, r7\n\t"
  34983. #else
  34984. "add r4, r4, r7\n\t"
  34985. #endif
  34986. #ifdef WOLFSSL_KEIL
  34987. "adcs r5, r5, %[r]\n\t"
  34988. #elif defined(__clang__)
  34989. "adcs r5, %[r]\n\t"
  34990. #else
  34991. "adc r5, %[r]\n\t"
  34992. #endif
  34993. #ifdef WOLFSSL_KEIL
  34994. "adcs r3, r3, %[r]\n\t"
  34995. #elif defined(__clang__)
  34996. "adcs r3, %[r]\n\t"
  34997. #else
  34998. "adc r3, %[r]\n\t"
  34999. #endif
  35000. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35001. "lsrs r7, %[b], #16\n\t"
  35002. #else
  35003. "lsr r7, %[b], #16\n\t"
  35004. #endif
  35005. #ifdef WOLFSSL_KEIL
  35006. "muls r6, r7, r6\n\t"
  35007. #elif defined(__clang__)
  35008. "muls r6, r7\n\t"
  35009. #else
  35010. "mul r6, r7\n\t"
  35011. #endif
  35012. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35013. "lsrs r7, r6, #16\n\t"
  35014. #else
  35015. "lsr r7, r6, #16\n\t"
  35016. #endif
  35017. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35018. "lsls r6, r6, #16\n\t"
  35019. #else
  35020. "lsl r6, r6, #16\n\t"
  35021. #endif
  35022. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35023. "adds r4, r4, r6\n\t"
  35024. #else
  35025. "add r4, r4, r6\n\t"
  35026. #endif
  35027. #ifdef WOLFSSL_KEIL
  35028. "adcs r5, r5, r7\n\t"
  35029. #elif defined(__clang__)
  35030. "adcs r5, r7\n\t"
  35031. #else
  35032. "adc r5, r7\n\t"
  35033. #endif
  35034. #ifdef WOLFSSL_KEIL
  35035. "adcs r3, r3, %[r]\n\t"
  35036. #elif defined(__clang__)
  35037. "adcs r3, %[r]\n\t"
  35038. #else
  35039. "adc r3, %[r]\n\t"
  35040. #endif
  35041. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35042. "lsrs r6, %[a], #16\n\t"
  35043. #else
  35044. "lsr r6, %[a], #16\n\t"
  35045. #endif
  35046. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35047. "lsrs r7, %[b], #16\n\t"
  35048. #else
  35049. "lsr r7, %[b], #16\n\t"
  35050. #endif
  35051. #ifdef WOLFSSL_KEIL
  35052. "muls r7, r6, r7\n\t"
  35053. #elif defined(__clang__)
  35054. "muls r7, r6\n\t"
  35055. #else
  35056. "mul r7, r6\n\t"
  35057. #endif
  35058. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35059. "adds r5, r5, r7\n\t"
  35060. #else
  35061. "add r5, r5, r7\n\t"
  35062. #endif
  35063. #ifdef WOLFSSL_KEIL
  35064. "adcs r3, r3, %[r]\n\t"
  35065. #elif defined(__clang__)
  35066. "adcs r3, %[r]\n\t"
  35067. #else
  35068. "adc r3, %[r]\n\t"
  35069. #endif
  35070. "uxth r7, %[b]\n\t"
  35071. #ifdef WOLFSSL_KEIL
  35072. "muls r6, r7, r6\n\t"
  35073. #elif defined(__clang__)
  35074. "muls r6, r7\n\t"
  35075. #else
  35076. "mul r6, r7\n\t"
  35077. #endif
  35078. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35079. "lsrs r7, r6, #16\n\t"
  35080. #else
  35081. "lsr r7, r6, #16\n\t"
  35082. #endif
  35083. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35084. "lsls r6, r6, #16\n\t"
  35085. #else
  35086. "lsl r6, r6, #16\n\t"
  35087. #endif
  35088. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35089. "adds r4, r4, r6\n\t"
  35090. #else
  35091. "add r4, r4, r6\n\t"
  35092. #endif
  35093. #ifdef WOLFSSL_KEIL
  35094. "adcs r5, r5, r7\n\t"
  35095. #elif defined(__clang__)
  35096. "adcs r5, r7\n\t"
  35097. #else
  35098. "adc r5, r7\n\t"
  35099. #endif
  35100. #ifdef WOLFSSL_KEIL
  35101. "adcs r3, r3, %[r]\n\t"
  35102. #elif defined(__clang__)
  35103. "adcs r3, %[r]\n\t"
  35104. #else
  35105. "adc r3, %[r]\n\t"
  35106. #endif
  35107. "# A[6] * B[1]\n\t"
  35108. "mov %[a], r9\n\t"
  35109. "mov %[b], r10\n\t"
  35110. "ldr %[a], [%[a], #24]\n\t"
  35111. "ldr %[b], [%[b], #4]\n\t"
  35112. "uxth r6, %[a]\n\t"
  35113. "uxth r7, %[b]\n\t"
  35114. #ifdef WOLFSSL_KEIL
  35115. "muls r7, r6, r7\n\t"
  35116. #elif defined(__clang__)
  35117. "muls r7, r6\n\t"
  35118. #else
  35119. "mul r7, r6\n\t"
  35120. #endif
  35121. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35122. "adds r4, r4, r7\n\t"
  35123. #else
  35124. "add r4, r4, r7\n\t"
  35125. #endif
  35126. #ifdef WOLFSSL_KEIL
  35127. "adcs r5, r5, %[r]\n\t"
  35128. #elif defined(__clang__)
  35129. "adcs r5, %[r]\n\t"
  35130. #else
  35131. "adc r5, %[r]\n\t"
  35132. #endif
  35133. #ifdef WOLFSSL_KEIL
  35134. "adcs r3, r3, %[r]\n\t"
  35135. #elif defined(__clang__)
  35136. "adcs r3, %[r]\n\t"
  35137. #else
  35138. "adc r3, %[r]\n\t"
  35139. #endif
  35140. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35141. "lsrs r7, %[b], #16\n\t"
  35142. #else
  35143. "lsr r7, %[b], #16\n\t"
  35144. #endif
  35145. #ifdef WOLFSSL_KEIL
  35146. "muls r6, r7, r6\n\t"
  35147. #elif defined(__clang__)
  35148. "muls r6, r7\n\t"
  35149. #else
  35150. "mul r6, r7\n\t"
  35151. #endif
  35152. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35153. "lsrs r7, r6, #16\n\t"
  35154. #else
  35155. "lsr r7, r6, #16\n\t"
  35156. #endif
  35157. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35158. "lsls r6, r6, #16\n\t"
  35159. #else
  35160. "lsl r6, r6, #16\n\t"
  35161. #endif
  35162. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35163. "adds r4, r4, r6\n\t"
  35164. #else
  35165. "add r4, r4, r6\n\t"
  35166. #endif
  35167. #ifdef WOLFSSL_KEIL
  35168. "adcs r5, r5, r7\n\t"
  35169. #elif defined(__clang__)
  35170. "adcs r5, r7\n\t"
  35171. #else
  35172. "adc r5, r7\n\t"
  35173. #endif
  35174. #ifdef WOLFSSL_KEIL
  35175. "adcs r3, r3, %[r]\n\t"
  35176. #elif defined(__clang__)
  35177. "adcs r3, %[r]\n\t"
  35178. #else
  35179. "adc r3, %[r]\n\t"
  35180. #endif
  35181. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35182. "lsrs r6, %[a], #16\n\t"
  35183. #else
  35184. "lsr r6, %[a], #16\n\t"
  35185. #endif
  35186. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35187. "lsrs r7, %[b], #16\n\t"
  35188. #else
  35189. "lsr r7, %[b], #16\n\t"
  35190. #endif
  35191. #ifdef WOLFSSL_KEIL
  35192. "muls r7, r6, r7\n\t"
  35193. #elif defined(__clang__)
  35194. "muls r7, r6\n\t"
  35195. #else
  35196. "mul r7, r6\n\t"
  35197. #endif
  35198. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35199. "adds r5, r5, r7\n\t"
  35200. #else
  35201. "add r5, r5, r7\n\t"
  35202. #endif
  35203. #ifdef WOLFSSL_KEIL
  35204. "adcs r3, r3, %[r]\n\t"
  35205. #elif defined(__clang__)
  35206. "adcs r3, %[r]\n\t"
  35207. #else
  35208. "adc r3, %[r]\n\t"
  35209. #endif
  35210. "uxth r7, %[b]\n\t"
  35211. #ifdef WOLFSSL_KEIL
  35212. "muls r6, r7, r6\n\t"
  35213. #elif defined(__clang__)
  35214. "muls r6, r7\n\t"
  35215. #else
  35216. "mul r6, r7\n\t"
  35217. #endif
  35218. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35219. "lsrs r7, r6, #16\n\t"
  35220. #else
  35221. "lsr r7, r6, #16\n\t"
  35222. #endif
  35223. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35224. "lsls r6, r6, #16\n\t"
  35225. #else
  35226. "lsl r6, r6, #16\n\t"
  35227. #endif
  35228. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35229. "adds r4, r4, r6\n\t"
  35230. #else
  35231. "add r4, r4, r6\n\t"
  35232. #endif
  35233. #ifdef WOLFSSL_KEIL
  35234. "adcs r5, r5, r7\n\t"
  35235. #elif defined(__clang__)
  35236. "adcs r5, r7\n\t"
  35237. #else
  35238. "adc r5, r7\n\t"
  35239. #endif
  35240. #ifdef WOLFSSL_KEIL
  35241. "adcs r3, r3, %[r]\n\t"
  35242. #elif defined(__clang__)
  35243. "adcs r3, %[r]\n\t"
  35244. #else
  35245. "adc r3, %[r]\n\t"
  35246. #endif
  35247. "# A[7] * B[0]\n\t"
  35248. "mov %[a], r9\n\t"
  35249. "mov %[b], r10\n\t"
  35250. "ldr %[a], [%[a], #28]\n\t"
  35251. "ldr %[b], [%[b]]\n\t"
  35252. "uxth r6, %[a]\n\t"
  35253. "uxth r7, %[b]\n\t"
  35254. #ifdef WOLFSSL_KEIL
  35255. "muls r7, r6, r7\n\t"
  35256. #elif defined(__clang__)
  35257. "muls r7, r6\n\t"
  35258. #else
  35259. "mul r7, r6\n\t"
  35260. #endif
  35261. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35262. "adds r4, r4, r7\n\t"
  35263. #else
  35264. "add r4, r4, r7\n\t"
  35265. #endif
  35266. #ifdef WOLFSSL_KEIL
  35267. "adcs r5, r5, %[r]\n\t"
  35268. #elif defined(__clang__)
  35269. "adcs r5, %[r]\n\t"
  35270. #else
  35271. "adc r5, %[r]\n\t"
  35272. #endif
  35273. #ifdef WOLFSSL_KEIL
  35274. "adcs r3, r3, %[r]\n\t"
  35275. #elif defined(__clang__)
  35276. "adcs r3, %[r]\n\t"
  35277. #else
  35278. "adc r3, %[r]\n\t"
  35279. #endif
  35280. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35281. "lsrs r7, %[b], #16\n\t"
  35282. #else
  35283. "lsr r7, %[b], #16\n\t"
  35284. #endif
  35285. #ifdef WOLFSSL_KEIL
  35286. "muls r6, r7, r6\n\t"
  35287. #elif defined(__clang__)
  35288. "muls r6, r7\n\t"
  35289. #else
  35290. "mul r6, r7\n\t"
  35291. #endif
  35292. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35293. "lsrs r7, r6, #16\n\t"
  35294. #else
  35295. "lsr r7, r6, #16\n\t"
  35296. #endif
  35297. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35298. "lsls r6, r6, #16\n\t"
  35299. #else
  35300. "lsl r6, r6, #16\n\t"
  35301. #endif
  35302. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35303. "adds r4, r4, r6\n\t"
  35304. #else
  35305. "add r4, r4, r6\n\t"
  35306. #endif
  35307. #ifdef WOLFSSL_KEIL
  35308. "adcs r5, r5, r7\n\t"
  35309. #elif defined(__clang__)
  35310. "adcs r5, r7\n\t"
  35311. #else
  35312. "adc r5, r7\n\t"
  35313. #endif
  35314. #ifdef WOLFSSL_KEIL
  35315. "adcs r3, r3, %[r]\n\t"
  35316. #elif defined(__clang__)
  35317. "adcs r3, %[r]\n\t"
  35318. #else
  35319. "adc r3, %[r]\n\t"
  35320. #endif
  35321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35322. "lsrs r6, %[a], #16\n\t"
  35323. #else
  35324. "lsr r6, %[a], #16\n\t"
  35325. #endif
  35326. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35327. "lsrs r7, %[b], #16\n\t"
  35328. #else
  35329. "lsr r7, %[b], #16\n\t"
  35330. #endif
  35331. #ifdef WOLFSSL_KEIL
  35332. "muls r7, r6, r7\n\t"
  35333. #elif defined(__clang__)
  35334. "muls r7, r6\n\t"
  35335. #else
  35336. "mul r7, r6\n\t"
  35337. #endif
  35338. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35339. "adds r5, r5, r7\n\t"
  35340. #else
  35341. "add r5, r5, r7\n\t"
  35342. #endif
  35343. #ifdef WOLFSSL_KEIL
  35344. "adcs r3, r3, %[r]\n\t"
  35345. #elif defined(__clang__)
  35346. "adcs r3, %[r]\n\t"
  35347. #else
  35348. "adc r3, %[r]\n\t"
  35349. #endif
  35350. "uxth r7, %[b]\n\t"
  35351. #ifdef WOLFSSL_KEIL
  35352. "muls r6, r7, r6\n\t"
  35353. #elif defined(__clang__)
  35354. "muls r6, r7\n\t"
  35355. #else
  35356. "mul r6, r7\n\t"
  35357. #endif
  35358. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35359. "lsrs r7, r6, #16\n\t"
  35360. #else
  35361. "lsr r7, r6, #16\n\t"
  35362. #endif
  35363. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35364. "lsls r6, r6, #16\n\t"
  35365. #else
  35366. "lsl r6, r6, #16\n\t"
  35367. #endif
  35368. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35369. "adds r4, r4, r6\n\t"
  35370. #else
  35371. "add r4, r4, r6\n\t"
  35372. #endif
  35373. #ifdef WOLFSSL_KEIL
  35374. "adcs r5, r5, r7\n\t"
  35375. #elif defined(__clang__)
  35376. "adcs r5, r7\n\t"
  35377. #else
  35378. "adc r5, r7\n\t"
  35379. #endif
  35380. #ifdef WOLFSSL_KEIL
  35381. "adcs r3, r3, %[r]\n\t"
  35382. #elif defined(__clang__)
  35383. "adcs r3, %[r]\n\t"
  35384. #else
  35385. "adc r3, %[r]\n\t"
  35386. #endif
  35387. "str r4, [sp, #28]\n\t"
  35388. "# A[8] * B[0]\n\t"
  35389. "movs r4, #0\n\t"
  35390. "mov %[a], r9\n\t"
  35391. "mov %[b], r10\n\t"
  35392. "ldr %[a], [%[a], #32]\n\t"
  35393. "ldr %[b], [%[b]]\n\t"
  35394. "uxth r6, %[a]\n\t"
  35395. "uxth r7, %[b]\n\t"
  35396. #ifdef WOLFSSL_KEIL
  35397. "muls r7, r6, r7\n\t"
  35398. #elif defined(__clang__)
  35399. "muls r7, r6\n\t"
  35400. #else
  35401. "mul r7, r6\n\t"
  35402. #endif
  35403. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35404. "adds r5, r5, r7\n\t"
  35405. #else
  35406. "add r5, r5, r7\n\t"
  35407. #endif
  35408. #ifdef WOLFSSL_KEIL
  35409. "adcs r3, r3, %[r]\n\t"
  35410. #elif defined(__clang__)
  35411. "adcs r3, %[r]\n\t"
  35412. #else
  35413. "adc r3, %[r]\n\t"
  35414. #endif
  35415. #ifdef WOLFSSL_KEIL
  35416. "adcs r4, r4, %[r]\n\t"
  35417. #elif defined(__clang__)
  35418. "adcs r4, %[r]\n\t"
  35419. #else
  35420. "adc r4, %[r]\n\t"
  35421. #endif
  35422. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35423. "lsrs r7, %[b], #16\n\t"
  35424. #else
  35425. "lsr r7, %[b], #16\n\t"
  35426. #endif
  35427. #ifdef WOLFSSL_KEIL
  35428. "muls r6, r7, r6\n\t"
  35429. #elif defined(__clang__)
  35430. "muls r6, r7\n\t"
  35431. #else
  35432. "mul r6, r7\n\t"
  35433. #endif
  35434. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35435. "lsrs r7, r6, #16\n\t"
  35436. #else
  35437. "lsr r7, r6, #16\n\t"
  35438. #endif
  35439. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35440. "lsls r6, r6, #16\n\t"
  35441. #else
  35442. "lsl r6, r6, #16\n\t"
  35443. #endif
  35444. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35445. "adds r5, r5, r6\n\t"
  35446. #else
  35447. "add r5, r5, r6\n\t"
  35448. #endif
  35449. #ifdef WOLFSSL_KEIL
  35450. "adcs r3, r3, r7\n\t"
  35451. #elif defined(__clang__)
  35452. "adcs r3, r7\n\t"
  35453. #else
  35454. "adc r3, r7\n\t"
  35455. #endif
  35456. #ifdef WOLFSSL_KEIL
  35457. "adcs r4, r4, %[r]\n\t"
  35458. #elif defined(__clang__)
  35459. "adcs r4, %[r]\n\t"
  35460. #else
  35461. "adc r4, %[r]\n\t"
  35462. #endif
  35463. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35464. "lsrs r6, %[a], #16\n\t"
  35465. #else
  35466. "lsr r6, %[a], #16\n\t"
  35467. #endif
  35468. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35469. "lsrs r7, %[b], #16\n\t"
  35470. #else
  35471. "lsr r7, %[b], #16\n\t"
  35472. #endif
  35473. #ifdef WOLFSSL_KEIL
  35474. "muls r7, r6, r7\n\t"
  35475. #elif defined(__clang__)
  35476. "muls r7, r6\n\t"
  35477. #else
  35478. "mul r7, r6\n\t"
  35479. #endif
  35480. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35481. "adds r3, r3, r7\n\t"
  35482. #else
  35483. "add r3, r3, r7\n\t"
  35484. #endif
  35485. #ifdef WOLFSSL_KEIL
  35486. "adcs r4, r4, %[r]\n\t"
  35487. #elif defined(__clang__)
  35488. "adcs r4, %[r]\n\t"
  35489. #else
  35490. "adc r4, %[r]\n\t"
  35491. #endif
  35492. "uxth r7, %[b]\n\t"
  35493. #ifdef WOLFSSL_KEIL
  35494. "muls r6, r7, r6\n\t"
  35495. #elif defined(__clang__)
  35496. "muls r6, r7\n\t"
  35497. #else
  35498. "mul r6, r7\n\t"
  35499. #endif
  35500. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35501. "lsrs r7, r6, #16\n\t"
  35502. #else
  35503. "lsr r7, r6, #16\n\t"
  35504. #endif
  35505. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35506. "lsls r6, r6, #16\n\t"
  35507. #else
  35508. "lsl r6, r6, #16\n\t"
  35509. #endif
  35510. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35511. "adds r5, r5, r6\n\t"
  35512. #else
  35513. "add r5, r5, r6\n\t"
  35514. #endif
  35515. #ifdef WOLFSSL_KEIL
  35516. "adcs r3, r3, r7\n\t"
  35517. #elif defined(__clang__)
  35518. "adcs r3, r7\n\t"
  35519. #else
  35520. "adc r3, r7\n\t"
  35521. #endif
  35522. #ifdef WOLFSSL_KEIL
  35523. "adcs r4, r4, %[r]\n\t"
  35524. #elif defined(__clang__)
  35525. "adcs r4, %[r]\n\t"
  35526. #else
  35527. "adc r4, %[r]\n\t"
  35528. #endif
  35529. "# A[7] * B[1]\n\t"
  35530. "mov %[a], r9\n\t"
  35531. "mov %[b], r10\n\t"
  35532. "ldr %[a], [%[a], #28]\n\t"
  35533. "ldr %[b], [%[b], #4]\n\t"
  35534. "uxth r6, %[a]\n\t"
  35535. "uxth r7, %[b]\n\t"
  35536. #ifdef WOLFSSL_KEIL
  35537. "muls r7, r6, r7\n\t"
  35538. #elif defined(__clang__)
  35539. "muls r7, r6\n\t"
  35540. #else
  35541. "mul r7, r6\n\t"
  35542. #endif
  35543. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35544. "adds r5, r5, r7\n\t"
  35545. #else
  35546. "add r5, r5, r7\n\t"
  35547. #endif
  35548. #ifdef WOLFSSL_KEIL
  35549. "adcs r3, r3, %[r]\n\t"
  35550. #elif defined(__clang__)
  35551. "adcs r3, %[r]\n\t"
  35552. #else
  35553. "adc r3, %[r]\n\t"
  35554. #endif
  35555. #ifdef WOLFSSL_KEIL
  35556. "adcs r4, r4, %[r]\n\t"
  35557. #elif defined(__clang__)
  35558. "adcs r4, %[r]\n\t"
  35559. #else
  35560. "adc r4, %[r]\n\t"
  35561. #endif
  35562. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35563. "lsrs r7, %[b], #16\n\t"
  35564. #else
  35565. "lsr r7, %[b], #16\n\t"
  35566. #endif
  35567. #ifdef WOLFSSL_KEIL
  35568. "muls r6, r7, r6\n\t"
  35569. #elif defined(__clang__)
  35570. "muls r6, r7\n\t"
  35571. #else
  35572. "mul r6, r7\n\t"
  35573. #endif
  35574. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35575. "lsrs r7, r6, #16\n\t"
  35576. #else
  35577. "lsr r7, r6, #16\n\t"
  35578. #endif
  35579. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35580. "lsls r6, r6, #16\n\t"
  35581. #else
  35582. "lsl r6, r6, #16\n\t"
  35583. #endif
  35584. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35585. "adds r5, r5, r6\n\t"
  35586. #else
  35587. "add r5, r5, r6\n\t"
  35588. #endif
  35589. #ifdef WOLFSSL_KEIL
  35590. "adcs r3, r3, r7\n\t"
  35591. #elif defined(__clang__)
  35592. "adcs r3, r7\n\t"
  35593. #else
  35594. "adc r3, r7\n\t"
  35595. #endif
  35596. #ifdef WOLFSSL_KEIL
  35597. "adcs r4, r4, %[r]\n\t"
  35598. #elif defined(__clang__)
  35599. "adcs r4, %[r]\n\t"
  35600. #else
  35601. "adc r4, %[r]\n\t"
  35602. #endif
  35603. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35604. "lsrs r6, %[a], #16\n\t"
  35605. #else
  35606. "lsr r6, %[a], #16\n\t"
  35607. #endif
  35608. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35609. "lsrs r7, %[b], #16\n\t"
  35610. #else
  35611. "lsr r7, %[b], #16\n\t"
  35612. #endif
  35613. #ifdef WOLFSSL_KEIL
  35614. "muls r7, r6, r7\n\t"
  35615. #elif defined(__clang__)
  35616. "muls r7, r6\n\t"
  35617. #else
  35618. "mul r7, r6\n\t"
  35619. #endif
  35620. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35621. "adds r3, r3, r7\n\t"
  35622. #else
  35623. "add r3, r3, r7\n\t"
  35624. #endif
  35625. #ifdef WOLFSSL_KEIL
  35626. "adcs r4, r4, %[r]\n\t"
  35627. #elif defined(__clang__)
  35628. "adcs r4, %[r]\n\t"
  35629. #else
  35630. "adc r4, %[r]\n\t"
  35631. #endif
  35632. "uxth r7, %[b]\n\t"
  35633. #ifdef WOLFSSL_KEIL
  35634. "muls r6, r7, r6\n\t"
  35635. #elif defined(__clang__)
  35636. "muls r6, r7\n\t"
  35637. #else
  35638. "mul r6, r7\n\t"
  35639. #endif
  35640. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35641. "lsrs r7, r6, #16\n\t"
  35642. #else
  35643. "lsr r7, r6, #16\n\t"
  35644. #endif
  35645. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35646. "lsls r6, r6, #16\n\t"
  35647. #else
  35648. "lsl r6, r6, #16\n\t"
  35649. #endif
  35650. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35651. "adds r5, r5, r6\n\t"
  35652. #else
  35653. "add r5, r5, r6\n\t"
  35654. #endif
  35655. #ifdef WOLFSSL_KEIL
  35656. "adcs r3, r3, r7\n\t"
  35657. #elif defined(__clang__)
  35658. "adcs r3, r7\n\t"
  35659. #else
  35660. "adc r3, r7\n\t"
  35661. #endif
  35662. #ifdef WOLFSSL_KEIL
  35663. "adcs r4, r4, %[r]\n\t"
  35664. #elif defined(__clang__)
  35665. "adcs r4, %[r]\n\t"
  35666. #else
  35667. "adc r4, %[r]\n\t"
  35668. #endif
  35669. "# A[6] * B[2]\n\t"
  35670. "mov %[a], r9\n\t"
  35671. "mov %[b], r10\n\t"
  35672. "ldr %[a], [%[a], #24]\n\t"
  35673. "ldr %[b], [%[b], #8]\n\t"
  35674. "uxth r6, %[a]\n\t"
  35675. "uxth r7, %[b]\n\t"
  35676. #ifdef WOLFSSL_KEIL
  35677. "muls r7, r6, r7\n\t"
  35678. #elif defined(__clang__)
  35679. "muls r7, r6\n\t"
  35680. #else
  35681. "mul r7, r6\n\t"
  35682. #endif
  35683. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35684. "adds r5, r5, r7\n\t"
  35685. #else
  35686. "add r5, r5, r7\n\t"
  35687. #endif
  35688. #ifdef WOLFSSL_KEIL
  35689. "adcs r3, r3, %[r]\n\t"
  35690. #elif defined(__clang__)
  35691. "adcs r3, %[r]\n\t"
  35692. #else
  35693. "adc r3, %[r]\n\t"
  35694. #endif
  35695. #ifdef WOLFSSL_KEIL
  35696. "adcs r4, r4, %[r]\n\t"
  35697. #elif defined(__clang__)
  35698. "adcs r4, %[r]\n\t"
  35699. #else
  35700. "adc r4, %[r]\n\t"
  35701. #endif
  35702. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35703. "lsrs r7, %[b], #16\n\t"
  35704. #else
  35705. "lsr r7, %[b], #16\n\t"
  35706. #endif
  35707. #ifdef WOLFSSL_KEIL
  35708. "muls r6, r7, r6\n\t"
  35709. #elif defined(__clang__)
  35710. "muls r6, r7\n\t"
  35711. #else
  35712. "mul r6, r7\n\t"
  35713. #endif
  35714. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35715. "lsrs r7, r6, #16\n\t"
  35716. #else
  35717. "lsr r7, r6, #16\n\t"
  35718. #endif
  35719. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35720. "lsls r6, r6, #16\n\t"
  35721. #else
  35722. "lsl r6, r6, #16\n\t"
  35723. #endif
  35724. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35725. "adds r5, r5, r6\n\t"
  35726. #else
  35727. "add r5, r5, r6\n\t"
  35728. #endif
  35729. #ifdef WOLFSSL_KEIL
  35730. "adcs r3, r3, r7\n\t"
  35731. #elif defined(__clang__)
  35732. "adcs r3, r7\n\t"
  35733. #else
  35734. "adc r3, r7\n\t"
  35735. #endif
  35736. #ifdef WOLFSSL_KEIL
  35737. "adcs r4, r4, %[r]\n\t"
  35738. #elif defined(__clang__)
  35739. "adcs r4, %[r]\n\t"
  35740. #else
  35741. "adc r4, %[r]\n\t"
  35742. #endif
  35743. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35744. "lsrs r6, %[a], #16\n\t"
  35745. #else
  35746. "lsr r6, %[a], #16\n\t"
  35747. #endif
  35748. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35749. "lsrs r7, %[b], #16\n\t"
  35750. #else
  35751. "lsr r7, %[b], #16\n\t"
  35752. #endif
  35753. #ifdef WOLFSSL_KEIL
  35754. "muls r7, r6, r7\n\t"
  35755. #elif defined(__clang__)
  35756. "muls r7, r6\n\t"
  35757. #else
  35758. "mul r7, r6\n\t"
  35759. #endif
  35760. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35761. "adds r3, r3, r7\n\t"
  35762. #else
  35763. "add r3, r3, r7\n\t"
  35764. #endif
  35765. #ifdef WOLFSSL_KEIL
  35766. "adcs r4, r4, %[r]\n\t"
  35767. #elif defined(__clang__)
  35768. "adcs r4, %[r]\n\t"
  35769. #else
  35770. "adc r4, %[r]\n\t"
  35771. #endif
  35772. "uxth r7, %[b]\n\t"
  35773. #ifdef WOLFSSL_KEIL
  35774. "muls r6, r7, r6\n\t"
  35775. #elif defined(__clang__)
  35776. "muls r6, r7\n\t"
  35777. #else
  35778. "mul r6, r7\n\t"
  35779. #endif
  35780. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35781. "lsrs r7, r6, #16\n\t"
  35782. #else
  35783. "lsr r7, r6, #16\n\t"
  35784. #endif
  35785. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35786. "lsls r6, r6, #16\n\t"
  35787. #else
  35788. "lsl r6, r6, #16\n\t"
  35789. #endif
  35790. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35791. "adds r5, r5, r6\n\t"
  35792. #else
  35793. "add r5, r5, r6\n\t"
  35794. #endif
  35795. #ifdef WOLFSSL_KEIL
  35796. "adcs r3, r3, r7\n\t"
  35797. #elif defined(__clang__)
  35798. "adcs r3, r7\n\t"
  35799. #else
  35800. "adc r3, r7\n\t"
  35801. #endif
  35802. #ifdef WOLFSSL_KEIL
  35803. "adcs r4, r4, %[r]\n\t"
  35804. #elif defined(__clang__)
  35805. "adcs r4, %[r]\n\t"
  35806. #else
  35807. "adc r4, %[r]\n\t"
  35808. #endif
  35809. "# A[5] * B[3]\n\t"
  35810. "mov %[a], r9\n\t"
  35811. "mov %[b], r10\n\t"
  35812. "ldr %[a], [%[a], #20]\n\t"
  35813. "ldr %[b], [%[b], #12]\n\t"
  35814. "uxth r6, %[a]\n\t"
  35815. "uxth r7, %[b]\n\t"
  35816. #ifdef WOLFSSL_KEIL
  35817. "muls r7, r6, r7\n\t"
  35818. #elif defined(__clang__)
  35819. "muls r7, r6\n\t"
  35820. #else
  35821. "mul r7, r6\n\t"
  35822. #endif
  35823. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35824. "adds r5, r5, r7\n\t"
  35825. #else
  35826. "add r5, r5, r7\n\t"
  35827. #endif
  35828. #ifdef WOLFSSL_KEIL
  35829. "adcs r3, r3, %[r]\n\t"
  35830. #elif defined(__clang__)
  35831. "adcs r3, %[r]\n\t"
  35832. #else
  35833. "adc r3, %[r]\n\t"
  35834. #endif
  35835. #ifdef WOLFSSL_KEIL
  35836. "adcs r4, r4, %[r]\n\t"
  35837. #elif defined(__clang__)
  35838. "adcs r4, %[r]\n\t"
  35839. #else
  35840. "adc r4, %[r]\n\t"
  35841. #endif
  35842. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35843. "lsrs r7, %[b], #16\n\t"
  35844. #else
  35845. "lsr r7, %[b], #16\n\t"
  35846. #endif
  35847. #ifdef WOLFSSL_KEIL
  35848. "muls r6, r7, r6\n\t"
  35849. #elif defined(__clang__)
  35850. "muls r6, r7\n\t"
  35851. #else
  35852. "mul r6, r7\n\t"
  35853. #endif
  35854. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35855. "lsrs r7, r6, #16\n\t"
  35856. #else
  35857. "lsr r7, r6, #16\n\t"
  35858. #endif
  35859. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35860. "lsls r6, r6, #16\n\t"
  35861. #else
  35862. "lsl r6, r6, #16\n\t"
  35863. #endif
  35864. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35865. "adds r5, r5, r6\n\t"
  35866. #else
  35867. "add r5, r5, r6\n\t"
  35868. #endif
  35869. #ifdef WOLFSSL_KEIL
  35870. "adcs r3, r3, r7\n\t"
  35871. #elif defined(__clang__)
  35872. "adcs r3, r7\n\t"
  35873. #else
  35874. "adc r3, r7\n\t"
  35875. #endif
  35876. #ifdef WOLFSSL_KEIL
  35877. "adcs r4, r4, %[r]\n\t"
  35878. #elif defined(__clang__)
  35879. "adcs r4, %[r]\n\t"
  35880. #else
  35881. "adc r4, %[r]\n\t"
  35882. #endif
  35883. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35884. "lsrs r6, %[a], #16\n\t"
  35885. #else
  35886. "lsr r6, %[a], #16\n\t"
  35887. #endif
  35888. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35889. "lsrs r7, %[b], #16\n\t"
  35890. #else
  35891. "lsr r7, %[b], #16\n\t"
  35892. #endif
  35893. #ifdef WOLFSSL_KEIL
  35894. "muls r7, r6, r7\n\t"
  35895. #elif defined(__clang__)
  35896. "muls r7, r6\n\t"
  35897. #else
  35898. "mul r7, r6\n\t"
  35899. #endif
  35900. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35901. "adds r3, r3, r7\n\t"
  35902. #else
  35903. "add r3, r3, r7\n\t"
  35904. #endif
  35905. #ifdef WOLFSSL_KEIL
  35906. "adcs r4, r4, %[r]\n\t"
  35907. #elif defined(__clang__)
  35908. "adcs r4, %[r]\n\t"
  35909. #else
  35910. "adc r4, %[r]\n\t"
  35911. #endif
  35912. "uxth r7, %[b]\n\t"
  35913. #ifdef WOLFSSL_KEIL
  35914. "muls r6, r7, r6\n\t"
  35915. #elif defined(__clang__)
  35916. "muls r6, r7\n\t"
  35917. #else
  35918. "mul r6, r7\n\t"
  35919. #endif
  35920. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35921. "lsrs r7, r6, #16\n\t"
  35922. #else
  35923. "lsr r7, r6, #16\n\t"
  35924. #endif
  35925. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35926. "lsls r6, r6, #16\n\t"
  35927. #else
  35928. "lsl r6, r6, #16\n\t"
  35929. #endif
  35930. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35931. "adds r5, r5, r6\n\t"
  35932. #else
  35933. "add r5, r5, r6\n\t"
  35934. #endif
  35935. #ifdef WOLFSSL_KEIL
  35936. "adcs r3, r3, r7\n\t"
  35937. #elif defined(__clang__)
  35938. "adcs r3, r7\n\t"
  35939. #else
  35940. "adc r3, r7\n\t"
  35941. #endif
  35942. #ifdef WOLFSSL_KEIL
  35943. "adcs r4, r4, %[r]\n\t"
  35944. #elif defined(__clang__)
  35945. "adcs r4, %[r]\n\t"
  35946. #else
  35947. "adc r4, %[r]\n\t"
  35948. #endif
  35949. "# A[4] * B[4]\n\t"
  35950. "mov %[a], r9\n\t"
  35951. "mov %[b], r10\n\t"
  35952. "ldr %[a], [%[a], #16]\n\t"
  35953. "ldr %[b], [%[b], #16]\n\t"
  35954. "uxth r6, %[a]\n\t"
  35955. "uxth r7, %[b]\n\t"
  35956. #ifdef WOLFSSL_KEIL
  35957. "muls r7, r6, r7\n\t"
  35958. #elif defined(__clang__)
  35959. "muls r7, r6\n\t"
  35960. #else
  35961. "mul r7, r6\n\t"
  35962. #endif
  35963. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35964. "adds r5, r5, r7\n\t"
  35965. #else
  35966. "add r5, r5, r7\n\t"
  35967. #endif
  35968. #ifdef WOLFSSL_KEIL
  35969. "adcs r3, r3, %[r]\n\t"
  35970. #elif defined(__clang__)
  35971. "adcs r3, %[r]\n\t"
  35972. #else
  35973. "adc r3, %[r]\n\t"
  35974. #endif
  35975. #ifdef WOLFSSL_KEIL
  35976. "adcs r4, r4, %[r]\n\t"
  35977. #elif defined(__clang__)
  35978. "adcs r4, %[r]\n\t"
  35979. #else
  35980. "adc r4, %[r]\n\t"
  35981. #endif
  35982. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35983. "lsrs r7, %[b], #16\n\t"
  35984. #else
  35985. "lsr r7, %[b], #16\n\t"
  35986. #endif
  35987. #ifdef WOLFSSL_KEIL
  35988. "muls r6, r7, r6\n\t"
  35989. #elif defined(__clang__)
  35990. "muls r6, r7\n\t"
  35991. #else
  35992. "mul r6, r7\n\t"
  35993. #endif
  35994. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35995. "lsrs r7, r6, #16\n\t"
  35996. #else
  35997. "lsr r7, r6, #16\n\t"
  35998. #endif
  35999. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36000. "lsls r6, r6, #16\n\t"
  36001. #else
  36002. "lsl r6, r6, #16\n\t"
  36003. #endif
  36004. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36005. "adds r5, r5, r6\n\t"
  36006. #else
  36007. "add r5, r5, r6\n\t"
  36008. #endif
  36009. #ifdef WOLFSSL_KEIL
  36010. "adcs r3, r3, r7\n\t"
  36011. #elif defined(__clang__)
  36012. "adcs r3, r7\n\t"
  36013. #else
  36014. "adc r3, r7\n\t"
  36015. #endif
  36016. #ifdef WOLFSSL_KEIL
  36017. "adcs r4, r4, %[r]\n\t"
  36018. #elif defined(__clang__)
  36019. "adcs r4, %[r]\n\t"
  36020. #else
  36021. "adc r4, %[r]\n\t"
  36022. #endif
  36023. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36024. "lsrs r6, %[a], #16\n\t"
  36025. #else
  36026. "lsr r6, %[a], #16\n\t"
  36027. #endif
  36028. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36029. "lsrs r7, %[b], #16\n\t"
  36030. #else
  36031. "lsr r7, %[b], #16\n\t"
  36032. #endif
  36033. #ifdef WOLFSSL_KEIL
  36034. "muls r7, r6, r7\n\t"
  36035. #elif defined(__clang__)
  36036. "muls r7, r6\n\t"
  36037. #else
  36038. "mul r7, r6\n\t"
  36039. #endif
  36040. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36041. "adds r3, r3, r7\n\t"
  36042. #else
  36043. "add r3, r3, r7\n\t"
  36044. #endif
  36045. #ifdef WOLFSSL_KEIL
  36046. "adcs r4, r4, %[r]\n\t"
  36047. #elif defined(__clang__)
  36048. "adcs r4, %[r]\n\t"
  36049. #else
  36050. "adc r4, %[r]\n\t"
  36051. #endif
  36052. "uxth r7, %[b]\n\t"
  36053. #ifdef WOLFSSL_KEIL
  36054. "muls r6, r7, r6\n\t"
  36055. #elif defined(__clang__)
  36056. "muls r6, r7\n\t"
  36057. #else
  36058. "mul r6, r7\n\t"
  36059. #endif
  36060. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36061. "lsrs r7, r6, #16\n\t"
  36062. #else
  36063. "lsr r7, r6, #16\n\t"
  36064. #endif
  36065. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36066. "lsls r6, r6, #16\n\t"
  36067. #else
  36068. "lsl r6, r6, #16\n\t"
  36069. #endif
  36070. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36071. "adds r5, r5, r6\n\t"
  36072. #else
  36073. "add r5, r5, r6\n\t"
  36074. #endif
  36075. #ifdef WOLFSSL_KEIL
  36076. "adcs r3, r3, r7\n\t"
  36077. #elif defined(__clang__)
  36078. "adcs r3, r7\n\t"
  36079. #else
  36080. "adc r3, r7\n\t"
  36081. #endif
  36082. #ifdef WOLFSSL_KEIL
  36083. "adcs r4, r4, %[r]\n\t"
  36084. #elif defined(__clang__)
  36085. "adcs r4, %[r]\n\t"
  36086. #else
  36087. "adc r4, %[r]\n\t"
  36088. #endif
  36089. "# A[3] * B[5]\n\t"
  36090. "mov %[a], r9\n\t"
  36091. "mov %[b], r10\n\t"
  36092. "ldr %[a], [%[a], #12]\n\t"
  36093. "ldr %[b], [%[b], #20]\n\t"
  36094. "uxth r6, %[a]\n\t"
  36095. "uxth r7, %[b]\n\t"
  36096. #ifdef WOLFSSL_KEIL
  36097. "muls r7, r6, r7\n\t"
  36098. #elif defined(__clang__)
  36099. "muls r7, r6\n\t"
  36100. #else
  36101. "mul r7, r6\n\t"
  36102. #endif
  36103. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36104. "adds r5, r5, r7\n\t"
  36105. #else
  36106. "add r5, r5, r7\n\t"
  36107. #endif
  36108. #ifdef WOLFSSL_KEIL
  36109. "adcs r3, r3, %[r]\n\t"
  36110. #elif defined(__clang__)
  36111. "adcs r3, %[r]\n\t"
  36112. #else
  36113. "adc r3, %[r]\n\t"
  36114. #endif
  36115. #ifdef WOLFSSL_KEIL
  36116. "adcs r4, r4, %[r]\n\t"
  36117. #elif defined(__clang__)
  36118. "adcs r4, %[r]\n\t"
  36119. #else
  36120. "adc r4, %[r]\n\t"
  36121. #endif
  36122. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36123. "lsrs r7, %[b], #16\n\t"
  36124. #else
  36125. "lsr r7, %[b], #16\n\t"
  36126. #endif
  36127. #ifdef WOLFSSL_KEIL
  36128. "muls r6, r7, r6\n\t"
  36129. #elif defined(__clang__)
  36130. "muls r6, r7\n\t"
  36131. #else
  36132. "mul r6, r7\n\t"
  36133. #endif
  36134. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36135. "lsrs r7, r6, #16\n\t"
  36136. #else
  36137. "lsr r7, r6, #16\n\t"
  36138. #endif
  36139. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36140. "lsls r6, r6, #16\n\t"
  36141. #else
  36142. "lsl r6, r6, #16\n\t"
  36143. #endif
  36144. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36145. "adds r5, r5, r6\n\t"
  36146. #else
  36147. "add r5, r5, r6\n\t"
  36148. #endif
  36149. #ifdef WOLFSSL_KEIL
  36150. "adcs r3, r3, r7\n\t"
  36151. #elif defined(__clang__)
  36152. "adcs r3, r7\n\t"
  36153. #else
  36154. "adc r3, r7\n\t"
  36155. #endif
  36156. #ifdef WOLFSSL_KEIL
  36157. "adcs r4, r4, %[r]\n\t"
  36158. #elif defined(__clang__)
  36159. "adcs r4, %[r]\n\t"
  36160. #else
  36161. "adc r4, %[r]\n\t"
  36162. #endif
  36163. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36164. "lsrs r6, %[a], #16\n\t"
  36165. #else
  36166. "lsr r6, %[a], #16\n\t"
  36167. #endif
  36168. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36169. "lsrs r7, %[b], #16\n\t"
  36170. #else
  36171. "lsr r7, %[b], #16\n\t"
  36172. #endif
  36173. #ifdef WOLFSSL_KEIL
  36174. "muls r7, r6, r7\n\t"
  36175. #elif defined(__clang__)
  36176. "muls r7, r6\n\t"
  36177. #else
  36178. "mul r7, r6\n\t"
  36179. #endif
  36180. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36181. "adds r3, r3, r7\n\t"
  36182. #else
  36183. "add r3, r3, r7\n\t"
  36184. #endif
  36185. #ifdef WOLFSSL_KEIL
  36186. "adcs r4, r4, %[r]\n\t"
  36187. #elif defined(__clang__)
  36188. "adcs r4, %[r]\n\t"
  36189. #else
  36190. "adc r4, %[r]\n\t"
  36191. #endif
  36192. "uxth r7, %[b]\n\t"
  36193. #ifdef WOLFSSL_KEIL
  36194. "muls r6, r7, r6\n\t"
  36195. #elif defined(__clang__)
  36196. "muls r6, r7\n\t"
  36197. #else
  36198. "mul r6, r7\n\t"
  36199. #endif
  36200. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36201. "lsrs r7, r6, #16\n\t"
  36202. #else
  36203. "lsr r7, r6, #16\n\t"
  36204. #endif
  36205. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36206. "lsls r6, r6, #16\n\t"
  36207. #else
  36208. "lsl r6, r6, #16\n\t"
  36209. #endif
  36210. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36211. "adds r5, r5, r6\n\t"
  36212. #else
  36213. "add r5, r5, r6\n\t"
  36214. #endif
  36215. #ifdef WOLFSSL_KEIL
  36216. "adcs r3, r3, r7\n\t"
  36217. #elif defined(__clang__)
  36218. "adcs r3, r7\n\t"
  36219. #else
  36220. "adc r3, r7\n\t"
  36221. #endif
  36222. #ifdef WOLFSSL_KEIL
  36223. "adcs r4, r4, %[r]\n\t"
  36224. #elif defined(__clang__)
  36225. "adcs r4, %[r]\n\t"
  36226. #else
  36227. "adc r4, %[r]\n\t"
  36228. #endif
  36229. "# A[2] * B[6]\n\t"
  36230. "mov %[a], r9\n\t"
  36231. "mov %[b], r10\n\t"
  36232. "ldr %[a], [%[a], #8]\n\t"
  36233. "ldr %[b], [%[b], #24]\n\t"
  36234. "uxth r6, %[a]\n\t"
  36235. "uxth r7, %[b]\n\t"
  36236. #ifdef WOLFSSL_KEIL
  36237. "muls r7, r6, r7\n\t"
  36238. #elif defined(__clang__)
  36239. "muls r7, r6\n\t"
  36240. #else
  36241. "mul r7, r6\n\t"
  36242. #endif
  36243. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36244. "adds r5, r5, r7\n\t"
  36245. #else
  36246. "add r5, r5, r7\n\t"
  36247. #endif
  36248. #ifdef WOLFSSL_KEIL
  36249. "adcs r3, r3, %[r]\n\t"
  36250. #elif defined(__clang__)
  36251. "adcs r3, %[r]\n\t"
  36252. #else
  36253. "adc r3, %[r]\n\t"
  36254. #endif
  36255. #ifdef WOLFSSL_KEIL
  36256. "adcs r4, r4, %[r]\n\t"
  36257. #elif defined(__clang__)
  36258. "adcs r4, %[r]\n\t"
  36259. #else
  36260. "adc r4, %[r]\n\t"
  36261. #endif
  36262. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36263. "lsrs r7, %[b], #16\n\t"
  36264. #else
  36265. "lsr r7, %[b], #16\n\t"
  36266. #endif
  36267. #ifdef WOLFSSL_KEIL
  36268. "muls r6, r7, r6\n\t"
  36269. #elif defined(__clang__)
  36270. "muls r6, r7\n\t"
  36271. #else
  36272. "mul r6, r7\n\t"
  36273. #endif
  36274. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36275. "lsrs r7, r6, #16\n\t"
  36276. #else
  36277. "lsr r7, r6, #16\n\t"
  36278. #endif
  36279. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36280. "lsls r6, r6, #16\n\t"
  36281. #else
  36282. "lsl r6, r6, #16\n\t"
  36283. #endif
  36284. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36285. "adds r5, r5, r6\n\t"
  36286. #else
  36287. "add r5, r5, r6\n\t"
  36288. #endif
  36289. #ifdef WOLFSSL_KEIL
  36290. "adcs r3, r3, r7\n\t"
  36291. #elif defined(__clang__)
  36292. "adcs r3, r7\n\t"
  36293. #else
  36294. "adc r3, r7\n\t"
  36295. #endif
  36296. #ifdef WOLFSSL_KEIL
  36297. "adcs r4, r4, %[r]\n\t"
  36298. #elif defined(__clang__)
  36299. "adcs r4, %[r]\n\t"
  36300. #else
  36301. "adc r4, %[r]\n\t"
  36302. #endif
  36303. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36304. "lsrs r6, %[a], #16\n\t"
  36305. #else
  36306. "lsr r6, %[a], #16\n\t"
  36307. #endif
  36308. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36309. "lsrs r7, %[b], #16\n\t"
  36310. #else
  36311. "lsr r7, %[b], #16\n\t"
  36312. #endif
  36313. #ifdef WOLFSSL_KEIL
  36314. "muls r7, r6, r7\n\t"
  36315. #elif defined(__clang__)
  36316. "muls r7, r6\n\t"
  36317. #else
  36318. "mul r7, r6\n\t"
  36319. #endif
  36320. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36321. "adds r3, r3, r7\n\t"
  36322. #else
  36323. "add r3, r3, r7\n\t"
  36324. #endif
  36325. #ifdef WOLFSSL_KEIL
  36326. "adcs r4, r4, %[r]\n\t"
  36327. #elif defined(__clang__)
  36328. "adcs r4, %[r]\n\t"
  36329. #else
  36330. "adc r4, %[r]\n\t"
  36331. #endif
  36332. "uxth r7, %[b]\n\t"
  36333. #ifdef WOLFSSL_KEIL
  36334. "muls r6, r7, r6\n\t"
  36335. #elif defined(__clang__)
  36336. "muls r6, r7\n\t"
  36337. #else
  36338. "mul r6, r7\n\t"
  36339. #endif
  36340. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36341. "lsrs r7, r6, #16\n\t"
  36342. #else
  36343. "lsr r7, r6, #16\n\t"
  36344. #endif
  36345. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36346. "lsls r6, r6, #16\n\t"
  36347. #else
  36348. "lsl r6, r6, #16\n\t"
  36349. #endif
  36350. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36351. "adds r5, r5, r6\n\t"
  36352. #else
  36353. "add r5, r5, r6\n\t"
  36354. #endif
  36355. #ifdef WOLFSSL_KEIL
  36356. "adcs r3, r3, r7\n\t"
  36357. #elif defined(__clang__)
  36358. "adcs r3, r7\n\t"
  36359. #else
  36360. "adc r3, r7\n\t"
  36361. #endif
  36362. #ifdef WOLFSSL_KEIL
  36363. "adcs r4, r4, %[r]\n\t"
  36364. #elif defined(__clang__)
  36365. "adcs r4, %[r]\n\t"
  36366. #else
  36367. "adc r4, %[r]\n\t"
  36368. #endif
  36369. "# A[1] * B[7]\n\t"
  36370. "mov %[a], r9\n\t"
  36371. "mov %[b], r10\n\t"
  36372. "ldr %[a], [%[a], #4]\n\t"
  36373. "ldr %[b], [%[b], #28]\n\t"
  36374. "uxth r6, %[a]\n\t"
  36375. "uxth r7, %[b]\n\t"
  36376. #ifdef WOLFSSL_KEIL
  36377. "muls r7, r6, r7\n\t"
  36378. #elif defined(__clang__)
  36379. "muls r7, r6\n\t"
  36380. #else
  36381. "mul r7, r6\n\t"
  36382. #endif
  36383. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36384. "adds r5, r5, r7\n\t"
  36385. #else
  36386. "add r5, r5, r7\n\t"
  36387. #endif
  36388. #ifdef WOLFSSL_KEIL
  36389. "adcs r3, r3, %[r]\n\t"
  36390. #elif defined(__clang__)
  36391. "adcs r3, %[r]\n\t"
  36392. #else
  36393. "adc r3, %[r]\n\t"
  36394. #endif
  36395. #ifdef WOLFSSL_KEIL
  36396. "adcs r4, r4, %[r]\n\t"
  36397. #elif defined(__clang__)
  36398. "adcs r4, %[r]\n\t"
  36399. #else
  36400. "adc r4, %[r]\n\t"
  36401. #endif
  36402. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36403. "lsrs r7, %[b], #16\n\t"
  36404. #else
  36405. "lsr r7, %[b], #16\n\t"
  36406. #endif
  36407. #ifdef WOLFSSL_KEIL
  36408. "muls r6, r7, r6\n\t"
  36409. #elif defined(__clang__)
  36410. "muls r6, r7\n\t"
  36411. #else
  36412. "mul r6, r7\n\t"
  36413. #endif
  36414. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36415. "lsrs r7, r6, #16\n\t"
  36416. #else
  36417. "lsr r7, r6, #16\n\t"
  36418. #endif
  36419. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36420. "lsls r6, r6, #16\n\t"
  36421. #else
  36422. "lsl r6, r6, #16\n\t"
  36423. #endif
  36424. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36425. "adds r5, r5, r6\n\t"
  36426. #else
  36427. "add r5, r5, r6\n\t"
  36428. #endif
  36429. #ifdef WOLFSSL_KEIL
  36430. "adcs r3, r3, r7\n\t"
  36431. #elif defined(__clang__)
  36432. "adcs r3, r7\n\t"
  36433. #else
  36434. "adc r3, r7\n\t"
  36435. #endif
  36436. #ifdef WOLFSSL_KEIL
  36437. "adcs r4, r4, %[r]\n\t"
  36438. #elif defined(__clang__)
  36439. "adcs r4, %[r]\n\t"
  36440. #else
  36441. "adc r4, %[r]\n\t"
  36442. #endif
  36443. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36444. "lsrs r6, %[a], #16\n\t"
  36445. #else
  36446. "lsr r6, %[a], #16\n\t"
  36447. #endif
  36448. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36449. "lsrs r7, %[b], #16\n\t"
  36450. #else
  36451. "lsr r7, %[b], #16\n\t"
  36452. #endif
  36453. #ifdef WOLFSSL_KEIL
  36454. "muls r7, r6, r7\n\t"
  36455. #elif defined(__clang__)
  36456. "muls r7, r6\n\t"
  36457. #else
  36458. "mul r7, r6\n\t"
  36459. #endif
  36460. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36461. "adds r3, r3, r7\n\t"
  36462. #else
  36463. "add r3, r3, r7\n\t"
  36464. #endif
  36465. #ifdef WOLFSSL_KEIL
  36466. "adcs r4, r4, %[r]\n\t"
  36467. #elif defined(__clang__)
  36468. "adcs r4, %[r]\n\t"
  36469. #else
  36470. "adc r4, %[r]\n\t"
  36471. #endif
  36472. "uxth r7, %[b]\n\t"
  36473. #ifdef WOLFSSL_KEIL
  36474. "muls r6, r7, r6\n\t"
  36475. #elif defined(__clang__)
  36476. "muls r6, r7\n\t"
  36477. #else
  36478. "mul r6, r7\n\t"
  36479. #endif
  36480. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36481. "lsrs r7, r6, #16\n\t"
  36482. #else
  36483. "lsr r7, r6, #16\n\t"
  36484. #endif
  36485. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36486. "lsls r6, r6, #16\n\t"
  36487. #else
  36488. "lsl r6, r6, #16\n\t"
  36489. #endif
  36490. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36491. "adds r5, r5, r6\n\t"
  36492. #else
  36493. "add r5, r5, r6\n\t"
  36494. #endif
  36495. #ifdef WOLFSSL_KEIL
  36496. "adcs r3, r3, r7\n\t"
  36497. #elif defined(__clang__)
  36498. "adcs r3, r7\n\t"
  36499. #else
  36500. "adc r3, r7\n\t"
  36501. #endif
  36502. #ifdef WOLFSSL_KEIL
  36503. "adcs r4, r4, %[r]\n\t"
  36504. #elif defined(__clang__)
  36505. "adcs r4, %[r]\n\t"
  36506. #else
  36507. "adc r4, %[r]\n\t"
  36508. #endif
  36509. "# A[0] * B[8]\n\t"
  36510. "mov %[a], r9\n\t"
  36511. "mov %[b], r10\n\t"
  36512. "ldr %[a], [%[a]]\n\t"
  36513. "ldr %[b], [%[b], #32]\n\t"
  36514. "uxth r6, %[a]\n\t"
  36515. "uxth r7, %[b]\n\t"
  36516. #ifdef WOLFSSL_KEIL
  36517. "muls r7, r6, r7\n\t"
  36518. #elif defined(__clang__)
  36519. "muls r7, r6\n\t"
  36520. #else
  36521. "mul r7, r6\n\t"
  36522. #endif
  36523. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36524. "adds r5, r5, r7\n\t"
  36525. #else
  36526. "add r5, r5, r7\n\t"
  36527. #endif
  36528. #ifdef WOLFSSL_KEIL
  36529. "adcs r3, r3, %[r]\n\t"
  36530. #elif defined(__clang__)
  36531. "adcs r3, %[r]\n\t"
  36532. #else
  36533. "adc r3, %[r]\n\t"
  36534. #endif
  36535. #ifdef WOLFSSL_KEIL
  36536. "adcs r4, r4, %[r]\n\t"
  36537. #elif defined(__clang__)
  36538. "adcs r4, %[r]\n\t"
  36539. #else
  36540. "adc r4, %[r]\n\t"
  36541. #endif
  36542. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36543. "lsrs r7, %[b], #16\n\t"
  36544. #else
  36545. "lsr r7, %[b], #16\n\t"
  36546. #endif
  36547. #ifdef WOLFSSL_KEIL
  36548. "muls r6, r7, r6\n\t"
  36549. #elif defined(__clang__)
  36550. "muls r6, r7\n\t"
  36551. #else
  36552. "mul r6, r7\n\t"
  36553. #endif
  36554. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36555. "lsrs r7, r6, #16\n\t"
  36556. #else
  36557. "lsr r7, r6, #16\n\t"
  36558. #endif
  36559. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36560. "lsls r6, r6, #16\n\t"
  36561. #else
  36562. "lsl r6, r6, #16\n\t"
  36563. #endif
  36564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36565. "adds r5, r5, r6\n\t"
  36566. #else
  36567. "add r5, r5, r6\n\t"
  36568. #endif
  36569. #ifdef WOLFSSL_KEIL
  36570. "adcs r3, r3, r7\n\t"
  36571. #elif defined(__clang__)
  36572. "adcs r3, r7\n\t"
  36573. #else
  36574. "adc r3, r7\n\t"
  36575. #endif
  36576. #ifdef WOLFSSL_KEIL
  36577. "adcs r4, r4, %[r]\n\t"
  36578. #elif defined(__clang__)
  36579. "adcs r4, %[r]\n\t"
  36580. #else
  36581. "adc r4, %[r]\n\t"
  36582. #endif
  36583. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36584. "lsrs r6, %[a], #16\n\t"
  36585. #else
  36586. "lsr r6, %[a], #16\n\t"
  36587. #endif
  36588. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36589. "lsrs r7, %[b], #16\n\t"
  36590. #else
  36591. "lsr r7, %[b], #16\n\t"
  36592. #endif
  36593. #ifdef WOLFSSL_KEIL
  36594. "muls r7, r6, r7\n\t"
  36595. #elif defined(__clang__)
  36596. "muls r7, r6\n\t"
  36597. #else
  36598. "mul r7, r6\n\t"
  36599. #endif
  36600. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36601. "adds r3, r3, r7\n\t"
  36602. #else
  36603. "add r3, r3, r7\n\t"
  36604. #endif
  36605. #ifdef WOLFSSL_KEIL
  36606. "adcs r4, r4, %[r]\n\t"
  36607. #elif defined(__clang__)
  36608. "adcs r4, %[r]\n\t"
  36609. #else
  36610. "adc r4, %[r]\n\t"
  36611. #endif
  36612. "uxth r7, %[b]\n\t"
  36613. #ifdef WOLFSSL_KEIL
  36614. "muls r6, r7, r6\n\t"
  36615. #elif defined(__clang__)
  36616. "muls r6, r7\n\t"
  36617. #else
  36618. "mul r6, r7\n\t"
  36619. #endif
  36620. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36621. "lsrs r7, r6, #16\n\t"
  36622. #else
  36623. "lsr r7, r6, #16\n\t"
  36624. #endif
  36625. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36626. "lsls r6, r6, #16\n\t"
  36627. #else
  36628. "lsl r6, r6, #16\n\t"
  36629. #endif
  36630. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36631. "adds r5, r5, r6\n\t"
  36632. #else
  36633. "add r5, r5, r6\n\t"
  36634. #endif
  36635. #ifdef WOLFSSL_KEIL
  36636. "adcs r3, r3, r7\n\t"
  36637. #elif defined(__clang__)
  36638. "adcs r3, r7\n\t"
  36639. #else
  36640. "adc r3, r7\n\t"
  36641. #endif
  36642. #ifdef WOLFSSL_KEIL
  36643. "adcs r4, r4, %[r]\n\t"
  36644. #elif defined(__clang__)
  36645. "adcs r4, %[r]\n\t"
  36646. #else
  36647. "adc r4, %[r]\n\t"
  36648. #endif
  36649. "str r5, [sp, #32]\n\t"
  36650. "# A[0] * B[9]\n\t"
  36651. "movs r5, #0\n\t"
  36652. "mov %[a], r9\n\t"
  36653. "mov %[b], r10\n\t"
  36654. "ldr %[a], [%[a]]\n\t"
  36655. "ldr %[b], [%[b], #36]\n\t"
  36656. "uxth r6, %[a]\n\t"
  36657. "uxth r7, %[b]\n\t"
  36658. #ifdef WOLFSSL_KEIL
  36659. "muls r7, r6, r7\n\t"
  36660. #elif defined(__clang__)
  36661. "muls r7, r6\n\t"
  36662. #else
  36663. "mul r7, r6\n\t"
  36664. #endif
  36665. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36666. "adds r3, r3, r7\n\t"
  36667. #else
  36668. "add r3, r3, r7\n\t"
  36669. #endif
  36670. #ifdef WOLFSSL_KEIL
  36671. "adcs r4, r4, %[r]\n\t"
  36672. #elif defined(__clang__)
  36673. "adcs r4, %[r]\n\t"
  36674. #else
  36675. "adc r4, %[r]\n\t"
  36676. #endif
  36677. #ifdef WOLFSSL_KEIL
  36678. "adcs r5, r5, %[r]\n\t"
  36679. #elif defined(__clang__)
  36680. "adcs r5, %[r]\n\t"
  36681. #else
  36682. "adc r5, %[r]\n\t"
  36683. #endif
  36684. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36685. "lsrs r7, %[b], #16\n\t"
  36686. #else
  36687. "lsr r7, %[b], #16\n\t"
  36688. #endif
  36689. #ifdef WOLFSSL_KEIL
  36690. "muls r6, r7, r6\n\t"
  36691. #elif defined(__clang__)
  36692. "muls r6, r7\n\t"
  36693. #else
  36694. "mul r6, r7\n\t"
  36695. #endif
  36696. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36697. "lsrs r7, r6, #16\n\t"
  36698. #else
  36699. "lsr r7, r6, #16\n\t"
  36700. #endif
  36701. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36702. "lsls r6, r6, #16\n\t"
  36703. #else
  36704. "lsl r6, r6, #16\n\t"
  36705. #endif
  36706. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36707. "adds r3, r3, r6\n\t"
  36708. #else
  36709. "add r3, r3, r6\n\t"
  36710. #endif
  36711. #ifdef WOLFSSL_KEIL
  36712. "adcs r4, r4, r7\n\t"
  36713. #elif defined(__clang__)
  36714. "adcs r4, r7\n\t"
  36715. #else
  36716. "adc r4, r7\n\t"
  36717. #endif
  36718. #ifdef WOLFSSL_KEIL
  36719. "adcs r5, r5, %[r]\n\t"
  36720. #elif defined(__clang__)
  36721. "adcs r5, %[r]\n\t"
  36722. #else
  36723. "adc r5, %[r]\n\t"
  36724. #endif
  36725. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36726. "lsrs r6, %[a], #16\n\t"
  36727. #else
  36728. "lsr r6, %[a], #16\n\t"
  36729. #endif
  36730. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36731. "lsrs r7, %[b], #16\n\t"
  36732. #else
  36733. "lsr r7, %[b], #16\n\t"
  36734. #endif
  36735. #ifdef WOLFSSL_KEIL
  36736. "muls r7, r6, r7\n\t"
  36737. #elif defined(__clang__)
  36738. "muls r7, r6\n\t"
  36739. #else
  36740. "mul r7, r6\n\t"
  36741. #endif
  36742. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36743. "adds r4, r4, r7\n\t"
  36744. #else
  36745. "add r4, r4, r7\n\t"
  36746. #endif
  36747. #ifdef WOLFSSL_KEIL
  36748. "adcs r5, r5, %[r]\n\t"
  36749. #elif defined(__clang__)
  36750. "adcs r5, %[r]\n\t"
  36751. #else
  36752. "adc r5, %[r]\n\t"
  36753. #endif
  36754. "uxth r7, %[b]\n\t"
  36755. #ifdef WOLFSSL_KEIL
  36756. "muls r6, r7, r6\n\t"
  36757. #elif defined(__clang__)
  36758. "muls r6, r7\n\t"
  36759. #else
  36760. "mul r6, r7\n\t"
  36761. #endif
  36762. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36763. "lsrs r7, r6, #16\n\t"
  36764. #else
  36765. "lsr r7, r6, #16\n\t"
  36766. #endif
  36767. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36768. "lsls r6, r6, #16\n\t"
  36769. #else
  36770. "lsl r6, r6, #16\n\t"
  36771. #endif
  36772. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36773. "adds r3, r3, r6\n\t"
  36774. #else
  36775. "add r3, r3, r6\n\t"
  36776. #endif
  36777. #ifdef WOLFSSL_KEIL
  36778. "adcs r4, r4, r7\n\t"
  36779. #elif defined(__clang__)
  36780. "adcs r4, r7\n\t"
  36781. #else
  36782. "adc r4, r7\n\t"
  36783. #endif
  36784. #ifdef WOLFSSL_KEIL
  36785. "adcs r5, r5, %[r]\n\t"
  36786. #elif defined(__clang__)
  36787. "adcs r5, %[r]\n\t"
  36788. #else
  36789. "adc r5, %[r]\n\t"
  36790. #endif
  36791. "# A[1] * B[8]\n\t"
  36792. "mov %[a], r9\n\t"
  36793. "mov %[b], r10\n\t"
  36794. "ldr %[a], [%[a], #4]\n\t"
  36795. "ldr %[b], [%[b], #32]\n\t"
  36796. "uxth r6, %[a]\n\t"
  36797. "uxth r7, %[b]\n\t"
  36798. #ifdef WOLFSSL_KEIL
  36799. "muls r7, r6, r7\n\t"
  36800. #elif defined(__clang__)
  36801. "muls r7, r6\n\t"
  36802. #else
  36803. "mul r7, r6\n\t"
  36804. #endif
  36805. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36806. "adds r3, r3, r7\n\t"
  36807. #else
  36808. "add r3, r3, r7\n\t"
  36809. #endif
  36810. #ifdef WOLFSSL_KEIL
  36811. "adcs r4, r4, %[r]\n\t"
  36812. #elif defined(__clang__)
  36813. "adcs r4, %[r]\n\t"
  36814. #else
  36815. "adc r4, %[r]\n\t"
  36816. #endif
  36817. #ifdef WOLFSSL_KEIL
  36818. "adcs r5, r5, %[r]\n\t"
  36819. #elif defined(__clang__)
  36820. "adcs r5, %[r]\n\t"
  36821. #else
  36822. "adc r5, %[r]\n\t"
  36823. #endif
  36824. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36825. "lsrs r7, %[b], #16\n\t"
  36826. #else
  36827. "lsr r7, %[b], #16\n\t"
  36828. #endif
  36829. #ifdef WOLFSSL_KEIL
  36830. "muls r6, r7, r6\n\t"
  36831. #elif defined(__clang__)
  36832. "muls r6, r7\n\t"
  36833. #else
  36834. "mul r6, r7\n\t"
  36835. #endif
  36836. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36837. "lsrs r7, r6, #16\n\t"
  36838. #else
  36839. "lsr r7, r6, #16\n\t"
  36840. #endif
  36841. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36842. "lsls r6, r6, #16\n\t"
  36843. #else
  36844. "lsl r6, r6, #16\n\t"
  36845. #endif
  36846. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36847. "adds r3, r3, r6\n\t"
  36848. #else
  36849. "add r3, r3, r6\n\t"
  36850. #endif
  36851. #ifdef WOLFSSL_KEIL
  36852. "adcs r4, r4, r7\n\t"
  36853. #elif defined(__clang__)
  36854. "adcs r4, r7\n\t"
  36855. #else
  36856. "adc r4, r7\n\t"
  36857. #endif
  36858. #ifdef WOLFSSL_KEIL
  36859. "adcs r5, r5, %[r]\n\t"
  36860. #elif defined(__clang__)
  36861. "adcs r5, %[r]\n\t"
  36862. #else
  36863. "adc r5, %[r]\n\t"
  36864. #endif
  36865. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36866. "lsrs r6, %[a], #16\n\t"
  36867. #else
  36868. "lsr r6, %[a], #16\n\t"
  36869. #endif
  36870. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36871. "lsrs r7, %[b], #16\n\t"
  36872. #else
  36873. "lsr r7, %[b], #16\n\t"
  36874. #endif
  36875. #ifdef WOLFSSL_KEIL
  36876. "muls r7, r6, r7\n\t"
  36877. #elif defined(__clang__)
  36878. "muls r7, r6\n\t"
  36879. #else
  36880. "mul r7, r6\n\t"
  36881. #endif
  36882. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36883. "adds r4, r4, r7\n\t"
  36884. #else
  36885. "add r4, r4, r7\n\t"
  36886. #endif
  36887. #ifdef WOLFSSL_KEIL
  36888. "adcs r5, r5, %[r]\n\t"
  36889. #elif defined(__clang__)
  36890. "adcs r5, %[r]\n\t"
  36891. #else
  36892. "adc r5, %[r]\n\t"
  36893. #endif
  36894. "uxth r7, %[b]\n\t"
  36895. #ifdef WOLFSSL_KEIL
  36896. "muls r6, r7, r6\n\t"
  36897. #elif defined(__clang__)
  36898. "muls r6, r7\n\t"
  36899. #else
  36900. "mul r6, r7\n\t"
  36901. #endif
  36902. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36903. "lsrs r7, r6, #16\n\t"
  36904. #else
  36905. "lsr r7, r6, #16\n\t"
  36906. #endif
  36907. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36908. "lsls r6, r6, #16\n\t"
  36909. #else
  36910. "lsl r6, r6, #16\n\t"
  36911. #endif
  36912. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36913. "adds r3, r3, r6\n\t"
  36914. #else
  36915. "add r3, r3, r6\n\t"
  36916. #endif
  36917. #ifdef WOLFSSL_KEIL
  36918. "adcs r4, r4, r7\n\t"
  36919. #elif defined(__clang__)
  36920. "adcs r4, r7\n\t"
  36921. #else
  36922. "adc r4, r7\n\t"
  36923. #endif
  36924. #ifdef WOLFSSL_KEIL
  36925. "adcs r5, r5, %[r]\n\t"
  36926. #elif defined(__clang__)
  36927. "adcs r5, %[r]\n\t"
  36928. #else
  36929. "adc r5, %[r]\n\t"
  36930. #endif
  36931. "# A[2] * B[7]\n\t"
  36932. "mov %[a], r9\n\t"
  36933. "mov %[b], r10\n\t"
  36934. "ldr %[a], [%[a], #8]\n\t"
  36935. "ldr %[b], [%[b], #28]\n\t"
  36936. "uxth r6, %[a]\n\t"
  36937. "uxth r7, %[b]\n\t"
  36938. #ifdef WOLFSSL_KEIL
  36939. "muls r7, r6, r7\n\t"
  36940. #elif defined(__clang__)
  36941. "muls r7, r6\n\t"
  36942. #else
  36943. "mul r7, r6\n\t"
  36944. #endif
  36945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36946. "adds r3, r3, r7\n\t"
  36947. #else
  36948. "add r3, r3, r7\n\t"
  36949. #endif
  36950. #ifdef WOLFSSL_KEIL
  36951. "adcs r4, r4, %[r]\n\t"
  36952. #elif defined(__clang__)
  36953. "adcs r4, %[r]\n\t"
  36954. #else
  36955. "adc r4, %[r]\n\t"
  36956. #endif
  36957. #ifdef WOLFSSL_KEIL
  36958. "adcs r5, r5, %[r]\n\t"
  36959. #elif defined(__clang__)
  36960. "adcs r5, %[r]\n\t"
  36961. #else
  36962. "adc r5, %[r]\n\t"
  36963. #endif
  36964. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36965. "lsrs r7, %[b], #16\n\t"
  36966. #else
  36967. "lsr r7, %[b], #16\n\t"
  36968. #endif
  36969. #ifdef WOLFSSL_KEIL
  36970. "muls r6, r7, r6\n\t"
  36971. #elif defined(__clang__)
  36972. "muls r6, r7\n\t"
  36973. #else
  36974. "mul r6, r7\n\t"
  36975. #endif
  36976. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36977. "lsrs r7, r6, #16\n\t"
  36978. #else
  36979. "lsr r7, r6, #16\n\t"
  36980. #endif
  36981. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36982. "lsls r6, r6, #16\n\t"
  36983. #else
  36984. "lsl r6, r6, #16\n\t"
  36985. #endif
  36986. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36987. "adds r3, r3, r6\n\t"
  36988. #else
  36989. "add r3, r3, r6\n\t"
  36990. #endif
  36991. #ifdef WOLFSSL_KEIL
  36992. "adcs r4, r4, r7\n\t"
  36993. #elif defined(__clang__)
  36994. "adcs r4, r7\n\t"
  36995. #else
  36996. "adc r4, r7\n\t"
  36997. #endif
  36998. #ifdef WOLFSSL_KEIL
  36999. "adcs r5, r5, %[r]\n\t"
  37000. #elif defined(__clang__)
  37001. "adcs r5, %[r]\n\t"
  37002. #else
  37003. "adc r5, %[r]\n\t"
  37004. #endif
  37005. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37006. "lsrs r6, %[a], #16\n\t"
  37007. #else
  37008. "lsr r6, %[a], #16\n\t"
  37009. #endif
  37010. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37011. "lsrs r7, %[b], #16\n\t"
  37012. #else
  37013. "lsr r7, %[b], #16\n\t"
  37014. #endif
  37015. #ifdef WOLFSSL_KEIL
  37016. "muls r7, r6, r7\n\t"
  37017. #elif defined(__clang__)
  37018. "muls r7, r6\n\t"
  37019. #else
  37020. "mul r7, r6\n\t"
  37021. #endif
  37022. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37023. "adds r4, r4, r7\n\t"
  37024. #else
  37025. "add r4, r4, r7\n\t"
  37026. #endif
  37027. #ifdef WOLFSSL_KEIL
  37028. "adcs r5, r5, %[r]\n\t"
  37029. #elif defined(__clang__)
  37030. "adcs r5, %[r]\n\t"
  37031. #else
  37032. "adc r5, %[r]\n\t"
  37033. #endif
  37034. "uxth r7, %[b]\n\t"
  37035. #ifdef WOLFSSL_KEIL
  37036. "muls r6, r7, r6\n\t"
  37037. #elif defined(__clang__)
  37038. "muls r6, r7\n\t"
  37039. #else
  37040. "mul r6, r7\n\t"
  37041. #endif
  37042. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37043. "lsrs r7, r6, #16\n\t"
  37044. #else
  37045. "lsr r7, r6, #16\n\t"
  37046. #endif
  37047. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37048. "lsls r6, r6, #16\n\t"
  37049. #else
  37050. "lsl r6, r6, #16\n\t"
  37051. #endif
  37052. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37053. "adds r3, r3, r6\n\t"
  37054. #else
  37055. "add r3, r3, r6\n\t"
  37056. #endif
  37057. #ifdef WOLFSSL_KEIL
  37058. "adcs r4, r4, r7\n\t"
  37059. #elif defined(__clang__)
  37060. "adcs r4, r7\n\t"
  37061. #else
  37062. "adc r4, r7\n\t"
  37063. #endif
  37064. #ifdef WOLFSSL_KEIL
  37065. "adcs r5, r5, %[r]\n\t"
  37066. #elif defined(__clang__)
  37067. "adcs r5, %[r]\n\t"
  37068. #else
  37069. "adc r5, %[r]\n\t"
  37070. #endif
  37071. "# A[3] * B[6]\n\t"
  37072. "mov %[a], r9\n\t"
  37073. "mov %[b], r10\n\t"
  37074. "ldr %[a], [%[a], #12]\n\t"
  37075. "ldr %[b], [%[b], #24]\n\t"
  37076. "uxth r6, %[a]\n\t"
  37077. "uxth r7, %[b]\n\t"
  37078. #ifdef WOLFSSL_KEIL
  37079. "muls r7, r6, r7\n\t"
  37080. #elif defined(__clang__)
  37081. "muls r7, r6\n\t"
  37082. #else
  37083. "mul r7, r6\n\t"
  37084. #endif
  37085. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37086. "adds r3, r3, r7\n\t"
  37087. #else
  37088. "add r3, r3, r7\n\t"
  37089. #endif
  37090. #ifdef WOLFSSL_KEIL
  37091. "adcs r4, r4, %[r]\n\t"
  37092. #elif defined(__clang__)
  37093. "adcs r4, %[r]\n\t"
  37094. #else
  37095. "adc r4, %[r]\n\t"
  37096. #endif
  37097. #ifdef WOLFSSL_KEIL
  37098. "adcs r5, r5, %[r]\n\t"
  37099. #elif defined(__clang__)
  37100. "adcs r5, %[r]\n\t"
  37101. #else
  37102. "adc r5, %[r]\n\t"
  37103. #endif
  37104. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37105. "lsrs r7, %[b], #16\n\t"
  37106. #else
  37107. "lsr r7, %[b], #16\n\t"
  37108. #endif
  37109. #ifdef WOLFSSL_KEIL
  37110. "muls r6, r7, r6\n\t"
  37111. #elif defined(__clang__)
  37112. "muls r6, r7\n\t"
  37113. #else
  37114. "mul r6, r7\n\t"
  37115. #endif
  37116. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37117. "lsrs r7, r6, #16\n\t"
  37118. #else
  37119. "lsr r7, r6, #16\n\t"
  37120. #endif
  37121. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37122. "lsls r6, r6, #16\n\t"
  37123. #else
  37124. "lsl r6, r6, #16\n\t"
  37125. #endif
  37126. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37127. "adds r3, r3, r6\n\t"
  37128. #else
  37129. "add r3, r3, r6\n\t"
  37130. #endif
  37131. #ifdef WOLFSSL_KEIL
  37132. "adcs r4, r4, r7\n\t"
  37133. #elif defined(__clang__)
  37134. "adcs r4, r7\n\t"
  37135. #else
  37136. "adc r4, r7\n\t"
  37137. #endif
  37138. #ifdef WOLFSSL_KEIL
  37139. "adcs r5, r5, %[r]\n\t"
  37140. #elif defined(__clang__)
  37141. "adcs r5, %[r]\n\t"
  37142. #else
  37143. "adc r5, %[r]\n\t"
  37144. #endif
  37145. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37146. "lsrs r6, %[a], #16\n\t"
  37147. #else
  37148. "lsr r6, %[a], #16\n\t"
  37149. #endif
  37150. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37151. "lsrs r7, %[b], #16\n\t"
  37152. #else
  37153. "lsr r7, %[b], #16\n\t"
  37154. #endif
  37155. #ifdef WOLFSSL_KEIL
  37156. "muls r7, r6, r7\n\t"
  37157. #elif defined(__clang__)
  37158. "muls r7, r6\n\t"
  37159. #else
  37160. "mul r7, r6\n\t"
  37161. #endif
  37162. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37163. "adds r4, r4, r7\n\t"
  37164. #else
  37165. "add r4, r4, r7\n\t"
  37166. #endif
  37167. #ifdef WOLFSSL_KEIL
  37168. "adcs r5, r5, %[r]\n\t"
  37169. #elif defined(__clang__)
  37170. "adcs r5, %[r]\n\t"
  37171. #else
  37172. "adc r5, %[r]\n\t"
  37173. #endif
  37174. "uxth r7, %[b]\n\t"
  37175. #ifdef WOLFSSL_KEIL
  37176. "muls r6, r7, r6\n\t"
  37177. #elif defined(__clang__)
  37178. "muls r6, r7\n\t"
  37179. #else
  37180. "mul r6, r7\n\t"
  37181. #endif
  37182. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37183. "lsrs r7, r6, #16\n\t"
  37184. #else
  37185. "lsr r7, r6, #16\n\t"
  37186. #endif
  37187. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37188. "lsls r6, r6, #16\n\t"
  37189. #else
  37190. "lsl r6, r6, #16\n\t"
  37191. #endif
  37192. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37193. "adds r3, r3, r6\n\t"
  37194. #else
  37195. "add r3, r3, r6\n\t"
  37196. #endif
  37197. #ifdef WOLFSSL_KEIL
  37198. "adcs r4, r4, r7\n\t"
  37199. #elif defined(__clang__)
  37200. "adcs r4, r7\n\t"
  37201. #else
  37202. "adc r4, r7\n\t"
  37203. #endif
  37204. #ifdef WOLFSSL_KEIL
  37205. "adcs r5, r5, %[r]\n\t"
  37206. #elif defined(__clang__)
  37207. "adcs r5, %[r]\n\t"
  37208. #else
  37209. "adc r5, %[r]\n\t"
  37210. #endif
  37211. "# A[4] * B[5]\n\t"
  37212. "mov %[a], r9\n\t"
  37213. "mov %[b], r10\n\t"
  37214. "ldr %[a], [%[a], #16]\n\t"
  37215. "ldr %[b], [%[b], #20]\n\t"
  37216. "uxth r6, %[a]\n\t"
  37217. "uxth r7, %[b]\n\t"
  37218. #ifdef WOLFSSL_KEIL
  37219. "muls r7, r6, r7\n\t"
  37220. #elif defined(__clang__)
  37221. "muls r7, r6\n\t"
  37222. #else
  37223. "mul r7, r6\n\t"
  37224. #endif
  37225. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37226. "adds r3, r3, r7\n\t"
  37227. #else
  37228. "add r3, r3, r7\n\t"
  37229. #endif
  37230. #ifdef WOLFSSL_KEIL
  37231. "adcs r4, r4, %[r]\n\t"
  37232. #elif defined(__clang__)
  37233. "adcs r4, %[r]\n\t"
  37234. #else
  37235. "adc r4, %[r]\n\t"
  37236. #endif
  37237. #ifdef WOLFSSL_KEIL
  37238. "adcs r5, r5, %[r]\n\t"
  37239. #elif defined(__clang__)
  37240. "adcs r5, %[r]\n\t"
  37241. #else
  37242. "adc r5, %[r]\n\t"
  37243. #endif
  37244. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37245. "lsrs r7, %[b], #16\n\t"
  37246. #else
  37247. "lsr r7, %[b], #16\n\t"
  37248. #endif
  37249. #ifdef WOLFSSL_KEIL
  37250. "muls r6, r7, r6\n\t"
  37251. #elif defined(__clang__)
  37252. "muls r6, r7\n\t"
  37253. #else
  37254. "mul r6, r7\n\t"
  37255. #endif
  37256. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37257. "lsrs r7, r6, #16\n\t"
  37258. #else
  37259. "lsr r7, r6, #16\n\t"
  37260. #endif
  37261. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37262. "lsls r6, r6, #16\n\t"
  37263. #else
  37264. "lsl r6, r6, #16\n\t"
  37265. #endif
  37266. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37267. "adds r3, r3, r6\n\t"
  37268. #else
  37269. "add r3, r3, r6\n\t"
  37270. #endif
  37271. #ifdef WOLFSSL_KEIL
  37272. "adcs r4, r4, r7\n\t"
  37273. #elif defined(__clang__)
  37274. "adcs r4, r7\n\t"
  37275. #else
  37276. "adc r4, r7\n\t"
  37277. #endif
  37278. #ifdef WOLFSSL_KEIL
  37279. "adcs r5, r5, %[r]\n\t"
  37280. #elif defined(__clang__)
  37281. "adcs r5, %[r]\n\t"
  37282. #else
  37283. "adc r5, %[r]\n\t"
  37284. #endif
  37285. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37286. "lsrs r6, %[a], #16\n\t"
  37287. #else
  37288. "lsr r6, %[a], #16\n\t"
  37289. #endif
  37290. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37291. "lsrs r7, %[b], #16\n\t"
  37292. #else
  37293. "lsr r7, %[b], #16\n\t"
  37294. #endif
  37295. #ifdef WOLFSSL_KEIL
  37296. "muls r7, r6, r7\n\t"
  37297. #elif defined(__clang__)
  37298. "muls r7, r6\n\t"
  37299. #else
  37300. "mul r7, r6\n\t"
  37301. #endif
  37302. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37303. "adds r4, r4, r7\n\t"
  37304. #else
  37305. "add r4, r4, r7\n\t"
  37306. #endif
  37307. #ifdef WOLFSSL_KEIL
  37308. "adcs r5, r5, %[r]\n\t"
  37309. #elif defined(__clang__)
  37310. "adcs r5, %[r]\n\t"
  37311. #else
  37312. "adc r5, %[r]\n\t"
  37313. #endif
  37314. "uxth r7, %[b]\n\t"
  37315. #ifdef WOLFSSL_KEIL
  37316. "muls r6, r7, r6\n\t"
  37317. #elif defined(__clang__)
  37318. "muls r6, r7\n\t"
  37319. #else
  37320. "mul r6, r7\n\t"
  37321. #endif
  37322. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37323. "lsrs r7, r6, #16\n\t"
  37324. #else
  37325. "lsr r7, r6, #16\n\t"
  37326. #endif
  37327. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37328. "lsls r6, r6, #16\n\t"
  37329. #else
  37330. "lsl r6, r6, #16\n\t"
  37331. #endif
  37332. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37333. "adds r3, r3, r6\n\t"
  37334. #else
  37335. "add r3, r3, r6\n\t"
  37336. #endif
  37337. #ifdef WOLFSSL_KEIL
  37338. "adcs r4, r4, r7\n\t"
  37339. #elif defined(__clang__)
  37340. "adcs r4, r7\n\t"
  37341. #else
  37342. "adc r4, r7\n\t"
  37343. #endif
  37344. #ifdef WOLFSSL_KEIL
  37345. "adcs r5, r5, %[r]\n\t"
  37346. #elif defined(__clang__)
  37347. "adcs r5, %[r]\n\t"
  37348. #else
  37349. "adc r5, %[r]\n\t"
  37350. #endif
  37351. "# A[5] * B[4]\n\t"
  37352. "mov %[a], r9\n\t"
  37353. "mov %[b], r10\n\t"
  37354. "ldr %[a], [%[a], #20]\n\t"
  37355. "ldr %[b], [%[b], #16]\n\t"
  37356. "uxth r6, %[a]\n\t"
  37357. "uxth r7, %[b]\n\t"
  37358. #ifdef WOLFSSL_KEIL
  37359. "muls r7, r6, r7\n\t"
  37360. #elif defined(__clang__)
  37361. "muls r7, r6\n\t"
  37362. #else
  37363. "mul r7, r6\n\t"
  37364. #endif
  37365. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37366. "adds r3, r3, r7\n\t"
  37367. #else
  37368. "add r3, r3, r7\n\t"
  37369. #endif
  37370. #ifdef WOLFSSL_KEIL
  37371. "adcs r4, r4, %[r]\n\t"
  37372. #elif defined(__clang__)
  37373. "adcs r4, %[r]\n\t"
  37374. #else
  37375. "adc r4, %[r]\n\t"
  37376. #endif
  37377. #ifdef WOLFSSL_KEIL
  37378. "adcs r5, r5, %[r]\n\t"
  37379. #elif defined(__clang__)
  37380. "adcs r5, %[r]\n\t"
  37381. #else
  37382. "adc r5, %[r]\n\t"
  37383. #endif
  37384. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37385. "lsrs r7, %[b], #16\n\t"
  37386. #else
  37387. "lsr r7, %[b], #16\n\t"
  37388. #endif
  37389. #ifdef WOLFSSL_KEIL
  37390. "muls r6, r7, r6\n\t"
  37391. #elif defined(__clang__)
  37392. "muls r6, r7\n\t"
  37393. #else
  37394. "mul r6, r7\n\t"
  37395. #endif
  37396. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37397. "lsrs r7, r6, #16\n\t"
  37398. #else
  37399. "lsr r7, r6, #16\n\t"
  37400. #endif
  37401. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37402. "lsls r6, r6, #16\n\t"
  37403. #else
  37404. "lsl r6, r6, #16\n\t"
  37405. #endif
  37406. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37407. "adds r3, r3, r6\n\t"
  37408. #else
  37409. "add r3, r3, r6\n\t"
  37410. #endif
  37411. #ifdef WOLFSSL_KEIL
  37412. "adcs r4, r4, r7\n\t"
  37413. #elif defined(__clang__)
  37414. "adcs r4, r7\n\t"
  37415. #else
  37416. "adc r4, r7\n\t"
  37417. #endif
  37418. #ifdef WOLFSSL_KEIL
  37419. "adcs r5, r5, %[r]\n\t"
  37420. #elif defined(__clang__)
  37421. "adcs r5, %[r]\n\t"
  37422. #else
  37423. "adc r5, %[r]\n\t"
  37424. #endif
  37425. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37426. "lsrs r6, %[a], #16\n\t"
  37427. #else
  37428. "lsr r6, %[a], #16\n\t"
  37429. #endif
  37430. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37431. "lsrs r7, %[b], #16\n\t"
  37432. #else
  37433. "lsr r7, %[b], #16\n\t"
  37434. #endif
  37435. #ifdef WOLFSSL_KEIL
  37436. "muls r7, r6, r7\n\t"
  37437. #elif defined(__clang__)
  37438. "muls r7, r6\n\t"
  37439. #else
  37440. "mul r7, r6\n\t"
  37441. #endif
  37442. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37443. "adds r4, r4, r7\n\t"
  37444. #else
  37445. "add r4, r4, r7\n\t"
  37446. #endif
  37447. #ifdef WOLFSSL_KEIL
  37448. "adcs r5, r5, %[r]\n\t"
  37449. #elif defined(__clang__)
  37450. "adcs r5, %[r]\n\t"
  37451. #else
  37452. "adc r5, %[r]\n\t"
  37453. #endif
  37454. "uxth r7, %[b]\n\t"
  37455. #ifdef WOLFSSL_KEIL
  37456. "muls r6, r7, r6\n\t"
  37457. #elif defined(__clang__)
  37458. "muls r6, r7\n\t"
  37459. #else
  37460. "mul r6, r7\n\t"
  37461. #endif
  37462. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37463. "lsrs r7, r6, #16\n\t"
  37464. #else
  37465. "lsr r7, r6, #16\n\t"
  37466. #endif
  37467. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37468. "lsls r6, r6, #16\n\t"
  37469. #else
  37470. "lsl r6, r6, #16\n\t"
  37471. #endif
  37472. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37473. "adds r3, r3, r6\n\t"
  37474. #else
  37475. "add r3, r3, r6\n\t"
  37476. #endif
  37477. #ifdef WOLFSSL_KEIL
  37478. "adcs r4, r4, r7\n\t"
  37479. #elif defined(__clang__)
  37480. "adcs r4, r7\n\t"
  37481. #else
  37482. "adc r4, r7\n\t"
  37483. #endif
  37484. #ifdef WOLFSSL_KEIL
  37485. "adcs r5, r5, %[r]\n\t"
  37486. #elif defined(__clang__)
  37487. "adcs r5, %[r]\n\t"
  37488. #else
  37489. "adc r5, %[r]\n\t"
  37490. #endif
  37491. "# A[6] * B[3]\n\t"
  37492. "mov %[a], r9\n\t"
  37493. "mov %[b], r10\n\t"
  37494. "ldr %[a], [%[a], #24]\n\t"
  37495. "ldr %[b], [%[b], #12]\n\t"
  37496. "uxth r6, %[a]\n\t"
  37497. "uxth r7, %[b]\n\t"
  37498. #ifdef WOLFSSL_KEIL
  37499. "muls r7, r6, r7\n\t"
  37500. #elif defined(__clang__)
  37501. "muls r7, r6\n\t"
  37502. #else
  37503. "mul r7, r6\n\t"
  37504. #endif
  37505. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37506. "adds r3, r3, r7\n\t"
  37507. #else
  37508. "add r3, r3, r7\n\t"
  37509. #endif
  37510. #ifdef WOLFSSL_KEIL
  37511. "adcs r4, r4, %[r]\n\t"
  37512. #elif defined(__clang__)
  37513. "adcs r4, %[r]\n\t"
  37514. #else
  37515. "adc r4, %[r]\n\t"
  37516. #endif
  37517. #ifdef WOLFSSL_KEIL
  37518. "adcs r5, r5, %[r]\n\t"
  37519. #elif defined(__clang__)
  37520. "adcs r5, %[r]\n\t"
  37521. #else
  37522. "adc r5, %[r]\n\t"
  37523. #endif
  37524. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37525. "lsrs r7, %[b], #16\n\t"
  37526. #else
  37527. "lsr r7, %[b], #16\n\t"
  37528. #endif
  37529. #ifdef WOLFSSL_KEIL
  37530. "muls r6, r7, r6\n\t"
  37531. #elif defined(__clang__)
  37532. "muls r6, r7\n\t"
  37533. #else
  37534. "mul r6, r7\n\t"
  37535. #endif
  37536. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37537. "lsrs r7, r6, #16\n\t"
  37538. #else
  37539. "lsr r7, r6, #16\n\t"
  37540. #endif
  37541. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37542. "lsls r6, r6, #16\n\t"
  37543. #else
  37544. "lsl r6, r6, #16\n\t"
  37545. #endif
  37546. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37547. "adds r3, r3, r6\n\t"
  37548. #else
  37549. "add r3, r3, r6\n\t"
  37550. #endif
  37551. #ifdef WOLFSSL_KEIL
  37552. "adcs r4, r4, r7\n\t"
  37553. #elif defined(__clang__)
  37554. "adcs r4, r7\n\t"
  37555. #else
  37556. "adc r4, r7\n\t"
  37557. #endif
  37558. #ifdef WOLFSSL_KEIL
  37559. "adcs r5, r5, %[r]\n\t"
  37560. #elif defined(__clang__)
  37561. "adcs r5, %[r]\n\t"
  37562. #else
  37563. "adc r5, %[r]\n\t"
  37564. #endif
  37565. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37566. "lsrs r6, %[a], #16\n\t"
  37567. #else
  37568. "lsr r6, %[a], #16\n\t"
  37569. #endif
  37570. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37571. "lsrs r7, %[b], #16\n\t"
  37572. #else
  37573. "lsr r7, %[b], #16\n\t"
  37574. #endif
  37575. #ifdef WOLFSSL_KEIL
  37576. "muls r7, r6, r7\n\t"
  37577. #elif defined(__clang__)
  37578. "muls r7, r6\n\t"
  37579. #else
  37580. "mul r7, r6\n\t"
  37581. #endif
  37582. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37583. "adds r4, r4, r7\n\t"
  37584. #else
  37585. "add r4, r4, r7\n\t"
  37586. #endif
  37587. #ifdef WOLFSSL_KEIL
  37588. "adcs r5, r5, %[r]\n\t"
  37589. #elif defined(__clang__)
  37590. "adcs r5, %[r]\n\t"
  37591. #else
  37592. "adc r5, %[r]\n\t"
  37593. #endif
  37594. "uxth r7, %[b]\n\t"
  37595. #ifdef WOLFSSL_KEIL
  37596. "muls r6, r7, r6\n\t"
  37597. #elif defined(__clang__)
  37598. "muls r6, r7\n\t"
  37599. #else
  37600. "mul r6, r7\n\t"
  37601. #endif
  37602. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37603. "lsrs r7, r6, #16\n\t"
  37604. #else
  37605. "lsr r7, r6, #16\n\t"
  37606. #endif
  37607. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37608. "lsls r6, r6, #16\n\t"
  37609. #else
  37610. "lsl r6, r6, #16\n\t"
  37611. #endif
  37612. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37613. "adds r3, r3, r6\n\t"
  37614. #else
  37615. "add r3, r3, r6\n\t"
  37616. #endif
  37617. #ifdef WOLFSSL_KEIL
  37618. "adcs r4, r4, r7\n\t"
  37619. #elif defined(__clang__)
  37620. "adcs r4, r7\n\t"
  37621. #else
  37622. "adc r4, r7\n\t"
  37623. #endif
  37624. #ifdef WOLFSSL_KEIL
  37625. "adcs r5, r5, %[r]\n\t"
  37626. #elif defined(__clang__)
  37627. "adcs r5, %[r]\n\t"
  37628. #else
  37629. "adc r5, %[r]\n\t"
  37630. #endif
  37631. "# A[7] * B[2]\n\t"
  37632. "mov %[a], r9\n\t"
  37633. "mov %[b], r10\n\t"
  37634. "ldr %[a], [%[a], #28]\n\t"
  37635. "ldr %[b], [%[b], #8]\n\t"
  37636. "uxth r6, %[a]\n\t"
  37637. "uxth r7, %[b]\n\t"
  37638. #ifdef WOLFSSL_KEIL
  37639. "muls r7, r6, r7\n\t"
  37640. #elif defined(__clang__)
  37641. "muls r7, r6\n\t"
  37642. #else
  37643. "mul r7, r6\n\t"
  37644. #endif
  37645. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37646. "adds r3, r3, r7\n\t"
  37647. #else
  37648. "add r3, r3, r7\n\t"
  37649. #endif
  37650. #ifdef WOLFSSL_KEIL
  37651. "adcs r4, r4, %[r]\n\t"
  37652. #elif defined(__clang__)
  37653. "adcs r4, %[r]\n\t"
  37654. #else
  37655. "adc r4, %[r]\n\t"
  37656. #endif
  37657. #ifdef WOLFSSL_KEIL
  37658. "adcs r5, r5, %[r]\n\t"
  37659. #elif defined(__clang__)
  37660. "adcs r5, %[r]\n\t"
  37661. #else
  37662. "adc r5, %[r]\n\t"
  37663. #endif
  37664. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37665. "lsrs r7, %[b], #16\n\t"
  37666. #else
  37667. "lsr r7, %[b], #16\n\t"
  37668. #endif
  37669. #ifdef WOLFSSL_KEIL
  37670. "muls r6, r7, r6\n\t"
  37671. #elif defined(__clang__)
  37672. "muls r6, r7\n\t"
  37673. #else
  37674. "mul r6, r7\n\t"
  37675. #endif
  37676. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37677. "lsrs r7, r6, #16\n\t"
  37678. #else
  37679. "lsr r7, r6, #16\n\t"
  37680. #endif
  37681. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37682. "lsls r6, r6, #16\n\t"
  37683. #else
  37684. "lsl r6, r6, #16\n\t"
  37685. #endif
  37686. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37687. "adds r3, r3, r6\n\t"
  37688. #else
  37689. "add r3, r3, r6\n\t"
  37690. #endif
  37691. #ifdef WOLFSSL_KEIL
  37692. "adcs r4, r4, r7\n\t"
  37693. #elif defined(__clang__)
  37694. "adcs r4, r7\n\t"
  37695. #else
  37696. "adc r4, r7\n\t"
  37697. #endif
  37698. #ifdef WOLFSSL_KEIL
  37699. "adcs r5, r5, %[r]\n\t"
  37700. #elif defined(__clang__)
  37701. "adcs r5, %[r]\n\t"
  37702. #else
  37703. "adc r5, %[r]\n\t"
  37704. #endif
  37705. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37706. "lsrs r6, %[a], #16\n\t"
  37707. #else
  37708. "lsr r6, %[a], #16\n\t"
  37709. #endif
  37710. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37711. "lsrs r7, %[b], #16\n\t"
  37712. #else
  37713. "lsr r7, %[b], #16\n\t"
  37714. #endif
  37715. #ifdef WOLFSSL_KEIL
  37716. "muls r7, r6, r7\n\t"
  37717. #elif defined(__clang__)
  37718. "muls r7, r6\n\t"
  37719. #else
  37720. "mul r7, r6\n\t"
  37721. #endif
  37722. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37723. "adds r4, r4, r7\n\t"
  37724. #else
  37725. "add r4, r4, r7\n\t"
  37726. #endif
  37727. #ifdef WOLFSSL_KEIL
  37728. "adcs r5, r5, %[r]\n\t"
  37729. #elif defined(__clang__)
  37730. "adcs r5, %[r]\n\t"
  37731. #else
  37732. "adc r5, %[r]\n\t"
  37733. #endif
  37734. "uxth r7, %[b]\n\t"
  37735. #ifdef WOLFSSL_KEIL
  37736. "muls r6, r7, r6\n\t"
  37737. #elif defined(__clang__)
  37738. "muls r6, r7\n\t"
  37739. #else
  37740. "mul r6, r7\n\t"
  37741. #endif
  37742. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37743. "lsrs r7, r6, #16\n\t"
  37744. #else
  37745. "lsr r7, r6, #16\n\t"
  37746. #endif
  37747. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37748. "lsls r6, r6, #16\n\t"
  37749. #else
  37750. "lsl r6, r6, #16\n\t"
  37751. #endif
  37752. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37753. "adds r3, r3, r6\n\t"
  37754. #else
  37755. "add r3, r3, r6\n\t"
  37756. #endif
  37757. #ifdef WOLFSSL_KEIL
  37758. "adcs r4, r4, r7\n\t"
  37759. #elif defined(__clang__)
  37760. "adcs r4, r7\n\t"
  37761. #else
  37762. "adc r4, r7\n\t"
  37763. #endif
  37764. #ifdef WOLFSSL_KEIL
  37765. "adcs r5, r5, %[r]\n\t"
  37766. #elif defined(__clang__)
  37767. "adcs r5, %[r]\n\t"
  37768. #else
  37769. "adc r5, %[r]\n\t"
  37770. #endif
  37771. "# A[8] * B[1]\n\t"
  37772. "mov %[a], r9\n\t"
  37773. "mov %[b], r10\n\t"
  37774. "ldr %[a], [%[a], #32]\n\t"
  37775. "ldr %[b], [%[b], #4]\n\t"
  37776. "uxth r6, %[a]\n\t"
  37777. "uxth r7, %[b]\n\t"
  37778. #ifdef WOLFSSL_KEIL
  37779. "muls r7, r6, r7\n\t"
  37780. #elif defined(__clang__)
  37781. "muls r7, r6\n\t"
  37782. #else
  37783. "mul r7, r6\n\t"
  37784. #endif
  37785. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37786. "adds r3, r3, r7\n\t"
  37787. #else
  37788. "add r3, r3, r7\n\t"
  37789. #endif
  37790. #ifdef WOLFSSL_KEIL
  37791. "adcs r4, r4, %[r]\n\t"
  37792. #elif defined(__clang__)
  37793. "adcs r4, %[r]\n\t"
  37794. #else
  37795. "adc r4, %[r]\n\t"
  37796. #endif
  37797. #ifdef WOLFSSL_KEIL
  37798. "adcs r5, r5, %[r]\n\t"
  37799. #elif defined(__clang__)
  37800. "adcs r5, %[r]\n\t"
  37801. #else
  37802. "adc r5, %[r]\n\t"
  37803. #endif
  37804. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37805. "lsrs r7, %[b], #16\n\t"
  37806. #else
  37807. "lsr r7, %[b], #16\n\t"
  37808. #endif
  37809. #ifdef WOLFSSL_KEIL
  37810. "muls r6, r7, r6\n\t"
  37811. #elif defined(__clang__)
  37812. "muls r6, r7\n\t"
  37813. #else
  37814. "mul r6, r7\n\t"
  37815. #endif
  37816. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37817. "lsrs r7, r6, #16\n\t"
  37818. #else
  37819. "lsr r7, r6, #16\n\t"
  37820. #endif
  37821. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37822. "lsls r6, r6, #16\n\t"
  37823. #else
  37824. "lsl r6, r6, #16\n\t"
  37825. #endif
  37826. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37827. "adds r3, r3, r6\n\t"
  37828. #else
  37829. "add r3, r3, r6\n\t"
  37830. #endif
  37831. #ifdef WOLFSSL_KEIL
  37832. "adcs r4, r4, r7\n\t"
  37833. #elif defined(__clang__)
  37834. "adcs r4, r7\n\t"
  37835. #else
  37836. "adc r4, r7\n\t"
  37837. #endif
  37838. #ifdef WOLFSSL_KEIL
  37839. "adcs r5, r5, %[r]\n\t"
  37840. #elif defined(__clang__)
  37841. "adcs r5, %[r]\n\t"
  37842. #else
  37843. "adc r5, %[r]\n\t"
  37844. #endif
  37845. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37846. "lsrs r6, %[a], #16\n\t"
  37847. #else
  37848. "lsr r6, %[a], #16\n\t"
  37849. #endif
  37850. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37851. "lsrs r7, %[b], #16\n\t"
  37852. #else
  37853. "lsr r7, %[b], #16\n\t"
  37854. #endif
  37855. #ifdef WOLFSSL_KEIL
  37856. "muls r7, r6, r7\n\t"
  37857. #elif defined(__clang__)
  37858. "muls r7, r6\n\t"
  37859. #else
  37860. "mul r7, r6\n\t"
  37861. #endif
  37862. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37863. "adds r4, r4, r7\n\t"
  37864. #else
  37865. "add r4, r4, r7\n\t"
  37866. #endif
  37867. #ifdef WOLFSSL_KEIL
  37868. "adcs r5, r5, %[r]\n\t"
  37869. #elif defined(__clang__)
  37870. "adcs r5, %[r]\n\t"
  37871. #else
  37872. "adc r5, %[r]\n\t"
  37873. #endif
  37874. "uxth r7, %[b]\n\t"
  37875. #ifdef WOLFSSL_KEIL
  37876. "muls r6, r7, r6\n\t"
  37877. #elif defined(__clang__)
  37878. "muls r6, r7\n\t"
  37879. #else
  37880. "mul r6, r7\n\t"
  37881. #endif
  37882. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37883. "lsrs r7, r6, #16\n\t"
  37884. #else
  37885. "lsr r7, r6, #16\n\t"
  37886. #endif
  37887. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37888. "lsls r6, r6, #16\n\t"
  37889. #else
  37890. "lsl r6, r6, #16\n\t"
  37891. #endif
  37892. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37893. "adds r3, r3, r6\n\t"
  37894. #else
  37895. "add r3, r3, r6\n\t"
  37896. #endif
  37897. #ifdef WOLFSSL_KEIL
  37898. "adcs r4, r4, r7\n\t"
  37899. #elif defined(__clang__)
  37900. "adcs r4, r7\n\t"
  37901. #else
  37902. "adc r4, r7\n\t"
  37903. #endif
  37904. #ifdef WOLFSSL_KEIL
  37905. "adcs r5, r5, %[r]\n\t"
  37906. #elif defined(__clang__)
  37907. "adcs r5, %[r]\n\t"
  37908. #else
  37909. "adc r5, %[r]\n\t"
  37910. #endif
  37911. "# A[9] * B[0]\n\t"
  37912. "mov %[a], r9\n\t"
  37913. "mov %[b], r10\n\t"
  37914. "ldr %[a], [%[a], #36]\n\t"
  37915. "ldr %[b], [%[b]]\n\t"
  37916. "uxth r6, %[a]\n\t"
  37917. "uxth r7, %[b]\n\t"
  37918. #ifdef WOLFSSL_KEIL
  37919. "muls r7, r6, r7\n\t"
  37920. #elif defined(__clang__)
  37921. "muls r7, r6\n\t"
  37922. #else
  37923. "mul r7, r6\n\t"
  37924. #endif
  37925. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37926. "adds r3, r3, r7\n\t"
  37927. #else
  37928. "add r3, r3, r7\n\t"
  37929. #endif
  37930. #ifdef WOLFSSL_KEIL
  37931. "adcs r4, r4, %[r]\n\t"
  37932. #elif defined(__clang__)
  37933. "adcs r4, %[r]\n\t"
  37934. #else
  37935. "adc r4, %[r]\n\t"
  37936. #endif
  37937. #ifdef WOLFSSL_KEIL
  37938. "adcs r5, r5, %[r]\n\t"
  37939. #elif defined(__clang__)
  37940. "adcs r5, %[r]\n\t"
  37941. #else
  37942. "adc r5, %[r]\n\t"
  37943. #endif
  37944. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37945. "lsrs r7, %[b], #16\n\t"
  37946. #else
  37947. "lsr r7, %[b], #16\n\t"
  37948. #endif
  37949. #ifdef WOLFSSL_KEIL
  37950. "muls r6, r7, r6\n\t"
  37951. #elif defined(__clang__)
  37952. "muls r6, r7\n\t"
  37953. #else
  37954. "mul r6, r7\n\t"
  37955. #endif
  37956. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37957. "lsrs r7, r6, #16\n\t"
  37958. #else
  37959. "lsr r7, r6, #16\n\t"
  37960. #endif
  37961. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37962. "lsls r6, r6, #16\n\t"
  37963. #else
  37964. "lsl r6, r6, #16\n\t"
  37965. #endif
  37966. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37967. "adds r3, r3, r6\n\t"
  37968. #else
  37969. "add r3, r3, r6\n\t"
  37970. #endif
  37971. #ifdef WOLFSSL_KEIL
  37972. "adcs r4, r4, r7\n\t"
  37973. #elif defined(__clang__)
  37974. "adcs r4, r7\n\t"
  37975. #else
  37976. "adc r4, r7\n\t"
  37977. #endif
  37978. #ifdef WOLFSSL_KEIL
  37979. "adcs r5, r5, %[r]\n\t"
  37980. #elif defined(__clang__)
  37981. "adcs r5, %[r]\n\t"
  37982. #else
  37983. "adc r5, %[r]\n\t"
  37984. #endif
  37985. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37986. "lsrs r6, %[a], #16\n\t"
  37987. #else
  37988. "lsr r6, %[a], #16\n\t"
  37989. #endif
  37990. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37991. "lsrs r7, %[b], #16\n\t"
  37992. #else
  37993. "lsr r7, %[b], #16\n\t"
  37994. #endif
  37995. #ifdef WOLFSSL_KEIL
  37996. "muls r7, r6, r7\n\t"
  37997. #elif defined(__clang__)
  37998. "muls r7, r6\n\t"
  37999. #else
  38000. "mul r7, r6\n\t"
  38001. #endif
  38002. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38003. "adds r4, r4, r7\n\t"
  38004. #else
  38005. "add r4, r4, r7\n\t"
  38006. #endif
  38007. #ifdef WOLFSSL_KEIL
  38008. "adcs r5, r5, %[r]\n\t"
  38009. #elif defined(__clang__)
  38010. "adcs r5, %[r]\n\t"
  38011. #else
  38012. "adc r5, %[r]\n\t"
  38013. #endif
  38014. "uxth r7, %[b]\n\t"
  38015. #ifdef WOLFSSL_KEIL
  38016. "muls r6, r7, r6\n\t"
  38017. #elif defined(__clang__)
  38018. "muls r6, r7\n\t"
  38019. #else
  38020. "mul r6, r7\n\t"
  38021. #endif
  38022. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38023. "lsrs r7, r6, #16\n\t"
  38024. #else
  38025. "lsr r7, r6, #16\n\t"
  38026. #endif
  38027. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38028. "lsls r6, r6, #16\n\t"
  38029. #else
  38030. "lsl r6, r6, #16\n\t"
  38031. #endif
  38032. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38033. "adds r3, r3, r6\n\t"
  38034. #else
  38035. "add r3, r3, r6\n\t"
  38036. #endif
  38037. #ifdef WOLFSSL_KEIL
  38038. "adcs r4, r4, r7\n\t"
  38039. #elif defined(__clang__)
  38040. "adcs r4, r7\n\t"
  38041. #else
  38042. "adc r4, r7\n\t"
  38043. #endif
  38044. #ifdef WOLFSSL_KEIL
  38045. "adcs r5, r5, %[r]\n\t"
  38046. #elif defined(__clang__)
  38047. "adcs r5, %[r]\n\t"
  38048. #else
  38049. "adc r5, %[r]\n\t"
  38050. #endif
  38051. "str r3, [sp, #36]\n\t"
  38052. "# A[10] * B[0]\n\t"
  38053. "movs r3, #0\n\t"
  38054. "mov %[a], r9\n\t"
  38055. "mov %[b], r10\n\t"
  38056. "ldr %[a], [%[a], #40]\n\t"
  38057. "ldr %[b], [%[b]]\n\t"
  38058. "uxth r6, %[a]\n\t"
  38059. "uxth r7, %[b]\n\t"
  38060. #ifdef WOLFSSL_KEIL
  38061. "muls r7, r6, r7\n\t"
  38062. #elif defined(__clang__)
  38063. "muls r7, r6\n\t"
  38064. #else
  38065. "mul r7, r6\n\t"
  38066. #endif
  38067. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38068. "adds r4, r4, r7\n\t"
  38069. #else
  38070. "add r4, r4, r7\n\t"
  38071. #endif
  38072. #ifdef WOLFSSL_KEIL
  38073. "adcs r5, r5, %[r]\n\t"
  38074. #elif defined(__clang__)
  38075. "adcs r5, %[r]\n\t"
  38076. #else
  38077. "adc r5, %[r]\n\t"
  38078. #endif
  38079. #ifdef WOLFSSL_KEIL
  38080. "adcs r3, r3, %[r]\n\t"
  38081. #elif defined(__clang__)
  38082. "adcs r3, %[r]\n\t"
  38083. #else
  38084. "adc r3, %[r]\n\t"
  38085. #endif
  38086. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38087. "lsrs r7, %[b], #16\n\t"
  38088. #else
  38089. "lsr r7, %[b], #16\n\t"
  38090. #endif
  38091. #ifdef WOLFSSL_KEIL
  38092. "muls r6, r7, r6\n\t"
  38093. #elif defined(__clang__)
  38094. "muls r6, r7\n\t"
  38095. #else
  38096. "mul r6, r7\n\t"
  38097. #endif
  38098. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38099. "lsrs r7, r6, #16\n\t"
  38100. #else
  38101. "lsr r7, r6, #16\n\t"
  38102. #endif
  38103. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38104. "lsls r6, r6, #16\n\t"
  38105. #else
  38106. "lsl r6, r6, #16\n\t"
  38107. #endif
  38108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38109. "adds r4, r4, r6\n\t"
  38110. #else
  38111. "add r4, r4, r6\n\t"
  38112. #endif
  38113. #ifdef WOLFSSL_KEIL
  38114. "adcs r5, r5, r7\n\t"
  38115. #elif defined(__clang__)
  38116. "adcs r5, r7\n\t"
  38117. #else
  38118. "adc r5, r7\n\t"
  38119. #endif
  38120. #ifdef WOLFSSL_KEIL
  38121. "adcs r3, r3, %[r]\n\t"
  38122. #elif defined(__clang__)
  38123. "adcs r3, %[r]\n\t"
  38124. #else
  38125. "adc r3, %[r]\n\t"
  38126. #endif
  38127. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38128. "lsrs r6, %[a], #16\n\t"
  38129. #else
  38130. "lsr r6, %[a], #16\n\t"
  38131. #endif
  38132. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38133. "lsrs r7, %[b], #16\n\t"
  38134. #else
  38135. "lsr r7, %[b], #16\n\t"
  38136. #endif
  38137. #ifdef WOLFSSL_KEIL
  38138. "muls r7, r6, r7\n\t"
  38139. #elif defined(__clang__)
  38140. "muls r7, r6\n\t"
  38141. #else
  38142. "mul r7, r6\n\t"
  38143. #endif
  38144. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38145. "adds r5, r5, r7\n\t"
  38146. #else
  38147. "add r5, r5, r7\n\t"
  38148. #endif
  38149. #ifdef WOLFSSL_KEIL
  38150. "adcs r3, r3, %[r]\n\t"
  38151. #elif defined(__clang__)
  38152. "adcs r3, %[r]\n\t"
  38153. #else
  38154. "adc r3, %[r]\n\t"
  38155. #endif
  38156. "uxth r7, %[b]\n\t"
  38157. #ifdef WOLFSSL_KEIL
  38158. "muls r6, r7, r6\n\t"
  38159. #elif defined(__clang__)
  38160. "muls r6, r7\n\t"
  38161. #else
  38162. "mul r6, r7\n\t"
  38163. #endif
  38164. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38165. "lsrs r7, r6, #16\n\t"
  38166. #else
  38167. "lsr r7, r6, #16\n\t"
  38168. #endif
  38169. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38170. "lsls r6, r6, #16\n\t"
  38171. #else
  38172. "lsl r6, r6, #16\n\t"
  38173. #endif
  38174. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38175. "adds r4, r4, r6\n\t"
  38176. #else
  38177. "add r4, r4, r6\n\t"
  38178. #endif
  38179. #ifdef WOLFSSL_KEIL
  38180. "adcs r5, r5, r7\n\t"
  38181. #elif defined(__clang__)
  38182. "adcs r5, r7\n\t"
  38183. #else
  38184. "adc r5, r7\n\t"
  38185. #endif
  38186. #ifdef WOLFSSL_KEIL
  38187. "adcs r3, r3, %[r]\n\t"
  38188. #elif defined(__clang__)
  38189. "adcs r3, %[r]\n\t"
  38190. #else
  38191. "adc r3, %[r]\n\t"
  38192. #endif
  38193. "# A[9] * B[1]\n\t"
  38194. "mov %[a], r9\n\t"
  38195. "mov %[b], r10\n\t"
  38196. "ldr %[a], [%[a], #36]\n\t"
  38197. "ldr %[b], [%[b], #4]\n\t"
  38198. "uxth r6, %[a]\n\t"
  38199. "uxth r7, %[b]\n\t"
  38200. #ifdef WOLFSSL_KEIL
  38201. "muls r7, r6, r7\n\t"
  38202. #elif defined(__clang__)
  38203. "muls r7, r6\n\t"
  38204. #else
  38205. "mul r7, r6\n\t"
  38206. #endif
  38207. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38208. "adds r4, r4, r7\n\t"
  38209. #else
  38210. "add r4, r4, r7\n\t"
  38211. #endif
  38212. #ifdef WOLFSSL_KEIL
  38213. "adcs r5, r5, %[r]\n\t"
  38214. #elif defined(__clang__)
  38215. "adcs r5, %[r]\n\t"
  38216. #else
  38217. "adc r5, %[r]\n\t"
  38218. #endif
  38219. #ifdef WOLFSSL_KEIL
  38220. "adcs r3, r3, %[r]\n\t"
  38221. #elif defined(__clang__)
  38222. "adcs r3, %[r]\n\t"
  38223. #else
  38224. "adc r3, %[r]\n\t"
  38225. #endif
  38226. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38227. "lsrs r7, %[b], #16\n\t"
  38228. #else
  38229. "lsr r7, %[b], #16\n\t"
  38230. #endif
  38231. #ifdef WOLFSSL_KEIL
  38232. "muls r6, r7, r6\n\t"
  38233. #elif defined(__clang__)
  38234. "muls r6, r7\n\t"
  38235. #else
  38236. "mul r6, r7\n\t"
  38237. #endif
  38238. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38239. "lsrs r7, r6, #16\n\t"
  38240. #else
  38241. "lsr r7, r6, #16\n\t"
  38242. #endif
  38243. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38244. "lsls r6, r6, #16\n\t"
  38245. #else
  38246. "lsl r6, r6, #16\n\t"
  38247. #endif
  38248. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38249. "adds r4, r4, r6\n\t"
  38250. #else
  38251. "add r4, r4, r6\n\t"
  38252. #endif
  38253. #ifdef WOLFSSL_KEIL
  38254. "adcs r5, r5, r7\n\t"
  38255. #elif defined(__clang__)
  38256. "adcs r5, r7\n\t"
  38257. #else
  38258. "adc r5, r7\n\t"
  38259. #endif
  38260. #ifdef WOLFSSL_KEIL
  38261. "adcs r3, r3, %[r]\n\t"
  38262. #elif defined(__clang__)
  38263. "adcs r3, %[r]\n\t"
  38264. #else
  38265. "adc r3, %[r]\n\t"
  38266. #endif
  38267. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38268. "lsrs r6, %[a], #16\n\t"
  38269. #else
  38270. "lsr r6, %[a], #16\n\t"
  38271. #endif
  38272. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38273. "lsrs r7, %[b], #16\n\t"
  38274. #else
  38275. "lsr r7, %[b], #16\n\t"
  38276. #endif
  38277. #ifdef WOLFSSL_KEIL
  38278. "muls r7, r6, r7\n\t"
  38279. #elif defined(__clang__)
  38280. "muls r7, r6\n\t"
  38281. #else
  38282. "mul r7, r6\n\t"
  38283. #endif
  38284. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38285. "adds r5, r5, r7\n\t"
  38286. #else
  38287. "add r5, r5, r7\n\t"
  38288. #endif
  38289. #ifdef WOLFSSL_KEIL
  38290. "adcs r3, r3, %[r]\n\t"
  38291. #elif defined(__clang__)
  38292. "adcs r3, %[r]\n\t"
  38293. #else
  38294. "adc r3, %[r]\n\t"
  38295. #endif
  38296. "uxth r7, %[b]\n\t"
  38297. #ifdef WOLFSSL_KEIL
  38298. "muls r6, r7, r6\n\t"
  38299. #elif defined(__clang__)
  38300. "muls r6, r7\n\t"
  38301. #else
  38302. "mul r6, r7\n\t"
  38303. #endif
  38304. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38305. "lsrs r7, r6, #16\n\t"
  38306. #else
  38307. "lsr r7, r6, #16\n\t"
  38308. #endif
  38309. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38310. "lsls r6, r6, #16\n\t"
  38311. #else
  38312. "lsl r6, r6, #16\n\t"
  38313. #endif
  38314. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38315. "adds r4, r4, r6\n\t"
  38316. #else
  38317. "add r4, r4, r6\n\t"
  38318. #endif
  38319. #ifdef WOLFSSL_KEIL
  38320. "adcs r5, r5, r7\n\t"
  38321. #elif defined(__clang__)
  38322. "adcs r5, r7\n\t"
  38323. #else
  38324. "adc r5, r7\n\t"
  38325. #endif
  38326. #ifdef WOLFSSL_KEIL
  38327. "adcs r3, r3, %[r]\n\t"
  38328. #elif defined(__clang__)
  38329. "adcs r3, %[r]\n\t"
  38330. #else
  38331. "adc r3, %[r]\n\t"
  38332. #endif
  38333. "# A[8] * B[2]\n\t"
  38334. "mov %[a], r9\n\t"
  38335. "mov %[b], r10\n\t"
  38336. "ldr %[a], [%[a], #32]\n\t"
  38337. "ldr %[b], [%[b], #8]\n\t"
  38338. "uxth r6, %[a]\n\t"
  38339. "uxth r7, %[b]\n\t"
  38340. #ifdef WOLFSSL_KEIL
  38341. "muls r7, r6, r7\n\t"
  38342. #elif defined(__clang__)
  38343. "muls r7, r6\n\t"
  38344. #else
  38345. "mul r7, r6\n\t"
  38346. #endif
  38347. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38348. "adds r4, r4, r7\n\t"
  38349. #else
  38350. "add r4, r4, r7\n\t"
  38351. #endif
  38352. #ifdef WOLFSSL_KEIL
  38353. "adcs r5, r5, %[r]\n\t"
  38354. #elif defined(__clang__)
  38355. "adcs r5, %[r]\n\t"
  38356. #else
  38357. "adc r5, %[r]\n\t"
  38358. #endif
  38359. #ifdef WOLFSSL_KEIL
  38360. "adcs r3, r3, %[r]\n\t"
  38361. #elif defined(__clang__)
  38362. "adcs r3, %[r]\n\t"
  38363. #else
  38364. "adc r3, %[r]\n\t"
  38365. #endif
  38366. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38367. "lsrs r7, %[b], #16\n\t"
  38368. #else
  38369. "lsr r7, %[b], #16\n\t"
  38370. #endif
  38371. #ifdef WOLFSSL_KEIL
  38372. "muls r6, r7, r6\n\t"
  38373. #elif defined(__clang__)
  38374. "muls r6, r7\n\t"
  38375. #else
  38376. "mul r6, r7\n\t"
  38377. #endif
  38378. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38379. "lsrs r7, r6, #16\n\t"
  38380. #else
  38381. "lsr r7, r6, #16\n\t"
  38382. #endif
  38383. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38384. "lsls r6, r6, #16\n\t"
  38385. #else
  38386. "lsl r6, r6, #16\n\t"
  38387. #endif
  38388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38389. "adds r4, r4, r6\n\t"
  38390. #else
  38391. "add r4, r4, r6\n\t"
  38392. #endif
  38393. #ifdef WOLFSSL_KEIL
  38394. "adcs r5, r5, r7\n\t"
  38395. #elif defined(__clang__)
  38396. "adcs r5, r7\n\t"
  38397. #else
  38398. "adc r5, r7\n\t"
  38399. #endif
  38400. #ifdef WOLFSSL_KEIL
  38401. "adcs r3, r3, %[r]\n\t"
  38402. #elif defined(__clang__)
  38403. "adcs r3, %[r]\n\t"
  38404. #else
  38405. "adc r3, %[r]\n\t"
  38406. #endif
  38407. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38408. "lsrs r6, %[a], #16\n\t"
  38409. #else
  38410. "lsr r6, %[a], #16\n\t"
  38411. #endif
  38412. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38413. "lsrs r7, %[b], #16\n\t"
  38414. #else
  38415. "lsr r7, %[b], #16\n\t"
  38416. #endif
  38417. #ifdef WOLFSSL_KEIL
  38418. "muls r7, r6, r7\n\t"
  38419. #elif defined(__clang__)
  38420. "muls r7, r6\n\t"
  38421. #else
  38422. "mul r7, r6\n\t"
  38423. #endif
  38424. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38425. "adds r5, r5, r7\n\t"
  38426. #else
  38427. "add r5, r5, r7\n\t"
  38428. #endif
  38429. #ifdef WOLFSSL_KEIL
  38430. "adcs r3, r3, %[r]\n\t"
  38431. #elif defined(__clang__)
  38432. "adcs r3, %[r]\n\t"
  38433. #else
  38434. "adc r3, %[r]\n\t"
  38435. #endif
  38436. "uxth r7, %[b]\n\t"
  38437. #ifdef WOLFSSL_KEIL
  38438. "muls r6, r7, r6\n\t"
  38439. #elif defined(__clang__)
  38440. "muls r6, r7\n\t"
  38441. #else
  38442. "mul r6, r7\n\t"
  38443. #endif
  38444. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38445. "lsrs r7, r6, #16\n\t"
  38446. #else
  38447. "lsr r7, r6, #16\n\t"
  38448. #endif
  38449. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38450. "lsls r6, r6, #16\n\t"
  38451. #else
  38452. "lsl r6, r6, #16\n\t"
  38453. #endif
  38454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38455. "adds r4, r4, r6\n\t"
  38456. #else
  38457. "add r4, r4, r6\n\t"
  38458. #endif
  38459. #ifdef WOLFSSL_KEIL
  38460. "adcs r5, r5, r7\n\t"
  38461. #elif defined(__clang__)
  38462. "adcs r5, r7\n\t"
  38463. #else
  38464. "adc r5, r7\n\t"
  38465. #endif
  38466. #ifdef WOLFSSL_KEIL
  38467. "adcs r3, r3, %[r]\n\t"
  38468. #elif defined(__clang__)
  38469. "adcs r3, %[r]\n\t"
  38470. #else
  38471. "adc r3, %[r]\n\t"
  38472. #endif
  38473. "# A[7] * B[3]\n\t"
  38474. "mov %[a], r9\n\t"
  38475. "mov %[b], r10\n\t"
  38476. "ldr %[a], [%[a], #28]\n\t"
  38477. "ldr %[b], [%[b], #12]\n\t"
  38478. "uxth r6, %[a]\n\t"
  38479. "uxth r7, %[b]\n\t"
  38480. #ifdef WOLFSSL_KEIL
  38481. "muls r7, r6, r7\n\t"
  38482. #elif defined(__clang__)
  38483. "muls r7, r6\n\t"
  38484. #else
  38485. "mul r7, r6\n\t"
  38486. #endif
  38487. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38488. "adds r4, r4, r7\n\t"
  38489. #else
  38490. "add r4, r4, r7\n\t"
  38491. #endif
  38492. #ifdef WOLFSSL_KEIL
  38493. "adcs r5, r5, %[r]\n\t"
  38494. #elif defined(__clang__)
  38495. "adcs r5, %[r]\n\t"
  38496. #else
  38497. "adc r5, %[r]\n\t"
  38498. #endif
  38499. #ifdef WOLFSSL_KEIL
  38500. "adcs r3, r3, %[r]\n\t"
  38501. #elif defined(__clang__)
  38502. "adcs r3, %[r]\n\t"
  38503. #else
  38504. "adc r3, %[r]\n\t"
  38505. #endif
  38506. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38507. "lsrs r7, %[b], #16\n\t"
  38508. #else
  38509. "lsr r7, %[b], #16\n\t"
  38510. #endif
  38511. #ifdef WOLFSSL_KEIL
  38512. "muls r6, r7, r6\n\t"
  38513. #elif defined(__clang__)
  38514. "muls r6, r7\n\t"
  38515. #else
  38516. "mul r6, r7\n\t"
  38517. #endif
  38518. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38519. "lsrs r7, r6, #16\n\t"
  38520. #else
  38521. "lsr r7, r6, #16\n\t"
  38522. #endif
  38523. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38524. "lsls r6, r6, #16\n\t"
  38525. #else
  38526. "lsl r6, r6, #16\n\t"
  38527. #endif
  38528. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38529. "adds r4, r4, r6\n\t"
  38530. #else
  38531. "add r4, r4, r6\n\t"
  38532. #endif
  38533. #ifdef WOLFSSL_KEIL
  38534. "adcs r5, r5, r7\n\t"
  38535. #elif defined(__clang__)
  38536. "adcs r5, r7\n\t"
  38537. #else
  38538. "adc r5, r7\n\t"
  38539. #endif
  38540. #ifdef WOLFSSL_KEIL
  38541. "adcs r3, r3, %[r]\n\t"
  38542. #elif defined(__clang__)
  38543. "adcs r3, %[r]\n\t"
  38544. #else
  38545. "adc r3, %[r]\n\t"
  38546. #endif
  38547. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38548. "lsrs r6, %[a], #16\n\t"
  38549. #else
  38550. "lsr r6, %[a], #16\n\t"
  38551. #endif
  38552. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38553. "lsrs r7, %[b], #16\n\t"
  38554. #else
  38555. "lsr r7, %[b], #16\n\t"
  38556. #endif
  38557. #ifdef WOLFSSL_KEIL
  38558. "muls r7, r6, r7\n\t"
  38559. #elif defined(__clang__)
  38560. "muls r7, r6\n\t"
  38561. #else
  38562. "mul r7, r6\n\t"
  38563. #endif
  38564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38565. "adds r5, r5, r7\n\t"
  38566. #else
  38567. "add r5, r5, r7\n\t"
  38568. #endif
  38569. #ifdef WOLFSSL_KEIL
  38570. "adcs r3, r3, %[r]\n\t"
  38571. #elif defined(__clang__)
  38572. "adcs r3, %[r]\n\t"
  38573. #else
  38574. "adc r3, %[r]\n\t"
  38575. #endif
  38576. "uxth r7, %[b]\n\t"
  38577. #ifdef WOLFSSL_KEIL
  38578. "muls r6, r7, r6\n\t"
  38579. #elif defined(__clang__)
  38580. "muls r6, r7\n\t"
  38581. #else
  38582. "mul r6, r7\n\t"
  38583. #endif
  38584. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38585. "lsrs r7, r6, #16\n\t"
  38586. #else
  38587. "lsr r7, r6, #16\n\t"
  38588. #endif
  38589. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38590. "lsls r6, r6, #16\n\t"
  38591. #else
  38592. "lsl r6, r6, #16\n\t"
  38593. #endif
  38594. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38595. "adds r4, r4, r6\n\t"
  38596. #else
  38597. "add r4, r4, r6\n\t"
  38598. #endif
  38599. #ifdef WOLFSSL_KEIL
  38600. "adcs r5, r5, r7\n\t"
  38601. #elif defined(__clang__)
  38602. "adcs r5, r7\n\t"
  38603. #else
  38604. "adc r5, r7\n\t"
  38605. #endif
  38606. #ifdef WOLFSSL_KEIL
  38607. "adcs r3, r3, %[r]\n\t"
  38608. #elif defined(__clang__)
  38609. "adcs r3, %[r]\n\t"
  38610. #else
  38611. "adc r3, %[r]\n\t"
  38612. #endif
  38613. "# A[6] * B[4]\n\t"
  38614. "mov %[a], r9\n\t"
  38615. "mov %[b], r10\n\t"
  38616. "ldr %[a], [%[a], #24]\n\t"
  38617. "ldr %[b], [%[b], #16]\n\t"
  38618. "uxth r6, %[a]\n\t"
  38619. "uxth r7, %[b]\n\t"
  38620. #ifdef WOLFSSL_KEIL
  38621. "muls r7, r6, r7\n\t"
  38622. #elif defined(__clang__)
  38623. "muls r7, r6\n\t"
  38624. #else
  38625. "mul r7, r6\n\t"
  38626. #endif
  38627. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38628. "adds r4, r4, r7\n\t"
  38629. #else
  38630. "add r4, r4, r7\n\t"
  38631. #endif
  38632. #ifdef WOLFSSL_KEIL
  38633. "adcs r5, r5, %[r]\n\t"
  38634. #elif defined(__clang__)
  38635. "adcs r5, %[r]\n\t"
  38636. #else
  38637. "adc r5, %[r]\n\t"
  38638. #endif
  38639. #ifdef WOLFSSL_KEIL
  38640. "adcs r3, r3, %[r]\n\t"
  38641. #elif defined(__clang__)
  38642. "adcs r3, %[r]\n\t"
  38643. #else
  38644. "adc r3, %[r]\n\t"
  38645. #endif
  38646. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38647. "lsrs r7, %[b], #16\n\t"
  38648. #else
  38649. "lsr r7, %[b], #16\n\t"
  38650. #endif
  38651. #ifdef WOLFSSL_KEIL
  38652. "muls r6, r7, r6\n\t"
  38653. #elif defined(__clang__)
  38654. "muls r6, r7\n\t"
  38655. #else
  38656. "mul r6, r7\n\t"
  38657. #endif
  38658. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38659. "lsrs r7, r6, #16\n\t"
  38660. #else
  38661. "lsr r7, r6, #16\n\t"
  38662. #endif
  38663. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38664. "lsls r6, r6, #16\n\t"
  38665. #else
  38666. "lsl r6, r6, #16\n\t"
  38667. #endif
  38668. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38669. "adds r4, r4, r6\n\t"
  38670. #else
  38671. "add r4, r4, r6\n\t"
  38672. #endif
  38673. #ifdef WOLFSSL_KEIL
  38674. "adcs r5, r5, r7\n\t"
  38675. #elif defined(__clang__)
  38676. "adcs r5, r7\n\t"
  38677. #else
  38678. "adc r5, r7\n\t"
  38679. #endif
  38680. #ifdef WOLFSSL_KEIL
  38681. "adcs r3, r3, %[r]\n\t"
  38682. #elif defined(__clang__)
  38683. "adcs r3, %[r]\n\t"
  38684. #else
  38685. "adc r3, %[r]\n\t"
  38686. #endif
  38687. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38688. "lsrs r6, %[a], #16\n\t"
  38689. #else
  38690. "lsr r6, %[a], #16\n\t"
  38691. #endif
  38692. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38693. "lsrs r7, %[b], #16\n\t"
  38694. #else
  38695. "lsr r7, %[b], #16\n\t"
  38696. #endif
  38697. #ifdef WOLFSSL_KEIL
  38698. "muls r7, r6, r7\n\t"
  38699. #elif defined(__clang__)
  38700. "muls r7, r6\n\t"
  38701. #else
  38702. "mul r7, r6\n\t"
  38703. #endif
  38704. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38705. "adds r5, r5, r7\n\t"
  38706. #else
  38707. "add r5, r5, r7\n\t"
  38708. #endif
  38709. #ifdef WOLFSSL_KEIL
  38710. "adcs r3, r3, %[r]\n\t"
  38711. #elif defined(__clang__)
  38712. "adcs r3, %[r]\n\t"
  38713. #else
  38714. "adc r3, %[r]\n\t"
  38715. #endif
  38716. "uxth r7, %[b]\n\t"
  38717. #ifdef WOLFSSL_KEIL
  38718. "muls r6, r7, r6\n\t"
  38719. #elif defined(__clang__)
  38720. "muls r6, r7\n\t"
  38721. #else
  38722. "mul r6, r7\n\t"
  38723. #endif
  38724. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38725. "lsrs r7, r6, #16\n\t"
  38726. #else
  38727. "lsr r7, r6, #16\n\t"
  38728. #endif
  38729. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38730. "lsls r6, r6, #16\n\t"
  38731. #else
  38732. "lsl r6, r6, #16\n\t"
  38733. #endif
  38734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38735. "adds r4, r4, r6\n\t"
  38736. #else
  38737. "add r4, r4, r6\n\t"
  38738. #endif
  38739. #ifdef WOLFSSL_KEIL
  38740. "adcs r5, r5, r7\n\t"
  38741. #elif defined(__clang__)
  38742. "adcs r5, r7\n\t"
  38743. #else
  38744. "adc r5, r7\n\t"
  38745. #endif
  38746. #ifdef WOLFSSL_KEIL
  38747. "adcs r3, r3, %[r]\n\t"
  38748. #elif defined(__clang__)
  38749. "adcs r3, %[r]\n\t"
  38750. #else
  38751. "adc r3, %[r]\n\t"
  38752. #endif
  38753. "# A[5] * B[5]\n\t"
  38754. "mov %[a], r9\n\t"
  38755. "mov %[b], r10\n\t"
  38756. "ldr %[a], [%[a], #20]\n\t"
  38757. "ldr %[b], [%[b], #20]\n\t"
  38758. "uxth r6, %[a]\n\t"
  38759. "uxth r7, %[b]\n\t"
  38760. #ifdef WOLFSSL_KEIL
  38761. "muls r7, r6, r7\n\t"
  38762. #elif defined(__clang__)
  38763. "muls r7, r6\n\t"
  38764. #else
  38765. "mul r7, r6\n\t"
  38766. #endif
  38767. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38768. "adds r4, r4, r7\n\t"
  38769. #else
  38770. "add r4, r4, r7\n\t"
  38771. #endif
  38772. #ifdef WOLFSSL_KEIL
  38773. "adcs r5, r5, %[r]\n\t"
  38774. #elif defined(__clang__)
  38775. "adcs r5, %[r]\n\t"
  38776. #else
  38777. "adc r5, %[r]\n\t"
  38778. #endif
  38779. #ifdef WOLFSSL_KEIL
  38780. "adcs r3, r3, %[r]\n\t"
  38781. #elif defined(__clang__)
  38782. "adcs r3, %[r]\n\t"
  38783. #else
  38784. "adc r3, %[r]\n\t"
  38785. #endif
  38786. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38787. "lsrs r7, %[b], #16\n\t"
  38788. #else
  38789. "lsr r7, %[b], #16\n\t"
  38790. #endif
  38791. #ifdef WOLFSSL_KEIL
  38792. "muls r6, r7, r6\n\t"
  38793. #elif defined(__clang__)
  38794. "muls r6, r7\n\t"
  38795. #else
  38796. "mul r6, r7\n\t"
  38797. #endif
  38798. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38799. "lsrs r7, r6, #16\n\t"
  38800. #else
  38801. "lsr r7, r6, #16\n\t"
  38802. #endif
  38803. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38804. "lsls r6, r6, #16\n\t"
  38805. #else
  38806. "lsl r6, r6, #16\n\t"
  38807. #endif
  38808. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38809. "adds r4, r4, r6\n\t"
  38810. #else
  38811. "add r4, r4, r6\n\t"
  38812. #endif
  38813. #ifdef WOLFSSL_KEIL
  38814. "adcs r5, r5, r7\n\t"
  38815. #elif defined(__clang__)
  38816. "adcs r5, r7\n\t"
  38817. #else
  38818. "adc r5, r7\n\t"
  38819. #endif
  38820. #ifdef WOLFSSL_KEIL
  38821. "adcs r3, r3, %[r]\n\t"
  38822. #elif defined(__clang__)
  38823. "adcs r3, %[r]\n\t"
  38824. #else
  38825. "adc r3, %[r]\n\t"
  38826. #endif
  38827. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38828. "lsrs r6, %[a], #16\n\t"
  38829. #else
  38830. "lsr r6, %[a], #16\n\t"
  38831. #endif
  38832. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38833. "lsrs r7, %[b], #16\n\t"
  38834. #else
  38835. "lsr r7, %[b], #16\n\t"
  38836. #endif
  38837. #ifdef WOLFSSL_KEIL
  38838. "muls r7, r6, r7\n\t"
  38839. #elif defined(__clang__)
  38840. "muls r7, r6\n\t"
  38841. #else
  38842. "mul r7, r6\n\t"
  38843. #endif
  38844. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38845. "adds r5, r5, r7\n\t"
  38846. #else
  38847. "add r5, r5, r7\n\t"
  38848. #endif
  38849. #ifdef WOLFSSL_KEIL
  38850. "adcs r3, r3, %[r]\n\t"
  38851. #elif defined(__clang__)
  38852. "adcs r3, %[r]\n\t"
  38853. #else
  38854. "adc r3, %[r]\n\t"
  38855. #endif
  38856. "uxth r7, %[b]\n\t"
  38857. #ifdef WOLFSSL_KEIL
  38858. "muls r6, r7, r6\n\t"
  38859. #elif defined(__clang__)
  38860. "muls r6, r7\n\t"
  38861. #else
  38862. "mul r6, r7\n\t"
  38863. #endif
  38864. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38865. "lsrs r7, r6, #16\n\t"
  38866. #else
  38867. "lsr r7, r6, #16\n\t"
  38868. #endif
  38869. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38870. "lsls r6, r6, #16\n\t"
  38871. #else
  38872. "lsl r6, r6, #16\n\t"
  38873. #endif
  38874. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38875. "adds r4, r4, r6\n\t"
  38876. #else
  38877. "add r4, r4, r6\n\t"
  38878. #endif
  38879. #ifdef WOLFSSL_KEIL
  38880. "adcs r5, r5, r7\n\t"
  38881. #elif defined(__clang__)
  38882. "adcs r5, r7\n\t"
  38883. #else
  38884. "adc r5, r7\n\t"
  38885. #endif
  38886. #ifdef WOLFSSL_KEIL
  38887. "adcs r3, r3, %[r]\n\t"
  38888. #elif defined(__clang__)
  38889. "adcs r3, %[r]\n\t"
  38890. #else
  38891. "adc r3, %[r]\n\t"
  38892. #endif
  38893. "# A[4] * B[6]\n\t"
  38894. "mov %[a], r9\n\t"
  38895. "mov %[b], r10\n\t"
  38896. "ldr %[a], [%[a], #16]\n\t"
  38897. "ldr %[b], [%[b], #24]\n\t"
  38898. "uxth r6, %[a]\n\t"
  38899. "uxth r7, %[b]\n\t"
  38900. #ifdef WOLFSSL_KEIL
  38901. "muls r7, r6, r7\n\t"
  38902. #elif defined(__clang__)
  38903. "muls r7, r6\n\t"
  38904. #else
  38905. "mul r7, r6\n\t"
  38906. #endif
  38907. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38908. "adds r4, r4, r7\n\t"
  38909. #else
  38910. "add r4, r4, r7\n\t"
  38911. #endif
  38912. #ifdef WOLFSSL_KEIL
  38913. "adcs r5, r5, %[r]\n\t"
  38914. #elif defined(__clang__)
  38915. "adcs r5, %[r]\n\t"
  38916. #else
  38917. "adc r5, %[r]\n\t"
  38918. #endif
  38919. #ifdef WOLFSSL_KEIL
  38920. "adcs r3, r3, %[r]\n\t"
  38921. #elif defined(__clang__)
  38922. "adcs r3, %[r]\n\t"
  38923. #else
  38924. "adc r3, %[r]\n\t"
  38925. #endif
  38926. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38927. "lsrs r7, %[b], #16\n\t"
  38928. #else
  38929. "lsr r7, %[b], #16\n\t"
  38930. #endif
  38931. #ifdef WOLFSSL_KEIL
  38932. "muls r6, r7, r6\n\t"
  38933. #elif defined(__clang__)
  38934. "muls r6, r7\n\t"
  38935. #else
  38936. "mul r6, r7\n\t"
  38937. #endif
  38938. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38939. "lsrs r7, r6, #16\n\t"
  38940. #else
  38941. "lsr r7, r6, #16\n\t"
  38942. #endif
  38943. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38944. "lsls r6, r6, #16\n\t"
  38945. #else
  38946. "lsl r6, r6, #16\n\t"
  38947. #endif
  38948. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38949. "adds r4, r4, r6\n\t"
  38950. #else
  38951. "add r4, r4, r6\n\t"
  38952. #endif
  38953. #ifdef WOLFSSL_KEIL
  38954. "adcs r5, r5, r7\n\t"
  38955. #elif defined(__clang__)
  38956. "adcs r5, r7\n\t"
  38957. #else
  38958. "adc r5, r7\n\t"
  38959. #endif
  38960. #ifdef WOLFSSL_KEIL
  38961. "adcs r3, r3, %[r]\n\t"
  38962. #elif defined(__clang__)
  38963. "adcs r3, %[r]\n\t"
  38964. #else
  38965. "adc r3, %[r]\n\t"
  38966. #endif
  38967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38968. "lsrs r6, %[a], #16\n\t"
  38969. #else
  38970. "lsr r6, %[a], #16\n\t"
  38971. #endif
  38972. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38973. "lsrs r7, %[b], #16\n\t"
  38974. #else
  38975. "lsr r7, %[b], #16\n\t"
  38976. #endif
  38977. #ifdef WOLFSSL_KEIL
  38978. "muls r7, r6, r7\n\t"
  38979. #elif defined(__clang__)
  38980. "muls r7, r6\n\t"
  38981. #else
  38982. "mul r7, r6\n\t"
  38983. #endif
  38984. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38985. "adds r5, r5, r7\n\t"
  38986. #else
  38987. "add r5, r5, r7\n\t"
  38988. #endif
  38989. #ifdef WOLFSSL_KEIL
  38990. "adcs r3, r3, %[r]\n\t"
  38991. #elif defined(__clang__)
  38992. "adcs r3, %[r]\n\t"
  38993. #else
  38994. "adc r3, %[r]\n\t"
  38995. #endif
  38996. "uxth r7, %[b]\n\t"
  38997. #ifdef WOLFSSL_KEIL
  38998. "muls r6, r7, r6\n\t"
  38999. #elif defined(__clang__)
  39000. "muls r6, r7\n\t"
  39001. #else
  39002. "mul r6, r7\n\t"
  39003. #endif
  39004. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39005. "lsrs r7, r6, #16\n\t"
  39006. #else
  39007. "lsr r7, r6, #16\n\t"
  39008. #endif
  39009. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39010. "lsls r6, r6, #16\n\t"
  39011. #else
  39012. "lsl r6, r6, #16\n\t"
  39013. #endif
  39014. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39015. "adds r4, r4, r6\n\t"
  39016. #else
  39017. "add r4, r4, r6\n\t"
  39018. #endif
  39019. #ifdef WOLFSSL_KEIL
  39020. "adcs r5, r5, r7\n\t"
  39021. #elif defined(__clang__)
  39022. "adcs r5, r7\n\t"
  39023. #else
  39024. "adc r5, r7\n\t"
  39025. #endif
  39026. #ifdef WOLFSSL_KEIL
  39027. "adcs r3, r3, %[r]\n\t"
  39028. #elif defined(__clang__)
  39029. "adcs r3, %[r]\n\t"
  39030. #else
  39031. "adc r3, %[r]\n\t"
  39032. #endif
  39033. "# A[3] * B[7]\n\t"
  39034. "mov %[a], r9\n\t"
  39035. "mov %[b], r10\n\t"
  39036. "ldr %[a], [%[a], #12]\n\t"
  39037. "ldr %[b], [%[b], #28]\n\t"
  39038. "uxth r6, %[a]\n\t"
  39039. "uxth r7, %[b]\n\t"
  39040. #ifdef WOLFSSL_KEIL
  39041. "muls r7, r6, r7\n\t"
  39042. #elif defined(__clang__)
  39043. "muls r7, r6\n\t"
  39044. #else
  39045. "mul r7, r6\n\t"
  39046. #endif
  39047. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39048. "adds r4, r4, r7\n\t"
  39049. #else
  39050. "add r4, r4, r7\n\t"
  39051. #endif
  39052. #ifdef WOLFSSL_KEIL
  39053. "adcs r5, r5, %[r]\n\t"
  39054. #elif defined(__clang__)
  39055. "adcs r5, %[r]\n\t"
  39056. #else
  39057. "adc r5, %[r]\n\t"
  39058. #endif
  39059. #ifdef WOLFSSL_KEIL
  39060. "adcs r3, r3, %[r]\n\t"
  39061. #elif defined(__clang__)
  39062. "adcs r3, %[r]\n\t"
  39063. #else
  39064. "adc r3, %[r]\n\t"
  39065. #endif
  39066. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39067. "lsrs r7, %[b], #16\n\t"
  39068. #else
  39069. "lsr r7, %[b], #16\n\t"
  39070. #endif
  39071. #ifdef WOLFSSL_KEIL
  39072. "muls r6, r7, r6\n\t"
  39073. #elif defined(__clang__)
  39074. "muls r6, r7\n\t"
  39075. #else
  39076. "mul r6, r7\n\t"
  39077. #endif
  39078. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39079. "lsrs r7, r6, #16\n\t"
  39080. #else
  39081. "lsr r7, r6, #16\n\t"
  39082. #endif
  39083. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39084. "lsls r6, r6, #16\n\t"
  39085. #else
  39086. "lsl r6, r6, #16\n\t"
  39087. #endif
  39088. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39089. "adds r4, r4, r6\n\t"
  39090. #else
  39091. "add r4, r4, r6\n\t"
  39092. #endif
  39093. #ifdef WOLFSSL_KEIL
  39094. "adcs r5, r5, r7\n\t"
  39095. #elif defined(__clang__)
  39096. "adcs r5, r7\n\t"
  39097. #else
  39098. "adc r5, r7\n\t"
  39099. #endif
  39100. #ifdef WOLFSSL_KEIL
  39101. "adcs r3, r3, %[r]\n\t"
  39102. #elif defined(__clang__)
  39103. "adcs r3, %[r]\n\t"
  39104. #else
  39105. "adc r3, %[r]\n\t"
  39106. #endif
  39107. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39108. "lsrs r6, %[a], #16\n\t"
  39109. #else
  39110. "lsr r6, %[a], #16\n\t"
  39111. #endif
  39112. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39113. "lsrs r7, %[b], #16\n\t"
  39114. #else
  39115. "lsr r7, %[b], #16\n\t"
  39116. #endif
  39117. #ifdef WOLFSSL_KEIL
  39118. "muls r7, r6, r7\n\t"
  39119. #elif defined(__clang__)
  39120. "muls r7, r6\n\t"
  39121. #else
  39122. "mul r7, r6\n\t"
  39123. #endif
  39124. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39125. "adds r5, r5, r7\n\t"
  39126. #else
  39127. "add r5, r5, r7\n\t"
  39128. #endif
  39129. #ifdef WOLFSSL_KEIL
  39130. "adcs r3, r3, %[r]\n\t"
  39131. #elif defined(__clang__)
  39132. "adcs r3, %[r]\n\t"
  39133. #else
  39134. "adc r3, %[r]\n\t"
  39135. #endif
  39136. "uxth r7, %[b]\n\t"
  39137. #ifdef WOLFSSL_KEIL
  39138. "muls r6, r7, r6\n\t"
  39139. #elif defined(__clang__)
  39140. "muls r6, r7\n\t"
  39141. #else
  39142. "mul r6, r7\n\t"
  39143. #endif
  39144. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39145. "lsrs r7, r6, #16\n\t"
  39146. #else
  39147. "lsr r7, r6, #16\n\t"
  39148. #endif
  39149. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39150. "lsls r6, r6, #16\n\t"
  39151. #else
  39152. "lsl r6, r6, #16\n\t"
  39153. #endif
  39154. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39155. "adds r4, r4, r6\n\t"
  39156. #else
  39157. "add r4, r4, r6\n\t"
  39158. #endif
  39159. #ifdef WOLFSSL_KEIL
  39160. "adcs r5, r5, r7\n\t"
  39161. #elif defined(__clang__)
  39162. "adcs r5, r7\n\t"
  39163. #else
  39164. "adc r5, r7\n\t"
  39165. #endif
  39166. #ifdef WOLFSSL_KEIL
  39167. "adcs r3, r3, %[r]\n\t"
  39168. #elif defined(__clang__)
  39169. "adcs r3, %[r]\n\t"
  39170. #else
  39171. "adc r3, %[r]\n\t"
  39172. #endif
  39173. "# A[2] * B[8]\n\t"
  39174. "mov %[a], r9\n\t"
  39175. "mov %[b], r10\n\t"
  39176. "ldr %[a], [%[a], #8]\n\t"
  39177. "ldr %[b], [%[b], #32]\n\t"
  39178. "uxth r6, %[a]\n\t"
  39179. "uxth r7, %[b]\n\t"
  39180. #ifdef WOLFSSL_KEIL
  39181. "muls r7, r6, r7\n\t"
  39182. #elif defined(__clang__)
  39183. "muls r7, r6\n\t"
  39184. #else
  39185. "mul r7, r6\n\t"
  39186. #endif
  39187. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39188. "adds r4, r4, r7\n\t"
  39189. #else
  39190. "add r4, r4, r7\n\t"
  39191. #endif
  39192. #ifdef WOLFSSL_KEIL
  39193. "adcs r5, r5, %[r]\n\t"
  39194. #elif defined(__clang__)
  39195. "adcs r5, %[r]\n\t"
  39196. #else
  39197. "adc r5, %[r]\n\t"
  39198. #endif
  39199. #ifdef WOLFSSL_KEIL
  39200. "adcs r3, r3, %[r]\n\t"
  39201. #elif defined(__clang__)
  39202. "adcs r3, %[r]\n\t"
  39203. #else
  39204. "adc r3, %[r]\n\t"
  39205. #endif
  39206. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39207. "lsrs r7, %[b], #16\n\t"
  39208. #else
  39209. "lsr r7, %[b], #16\n\t"
  39210. #endif
  39211. #ifdef WOLFSSL_KEIL
  39212. "muls r6, r7, r6\n\t"
  39213. #elif defined(__clang__)
  39214. "muls r6, r7\n\t"
  39215. #else
  39216. "mul r6, r7\n\t"
  39217. #endif
  39218. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39219. "lsrs r7, r6, #16\n\t"
  39220. #else
  39221. "lsr r7, r6, #16\n\t"
  39222. #endif
  39223. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39224. "lsls r6, r6, #16\n\t"
  39225. #else
  39226. "lsl r6, r6, #16\n\t"
  39227. #endif
  39228. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39229. "adds r4, r4, r6\n\t"
  39230. #else
  39231. "add r4, r4, r6\n\t"
  39232. #endif
  39233. #ifdef WOLFSSL_KEIL
  39234. "adcs r5, r5, r7\n\t"
  39235. #elif defined(__clang__)
  39236. "adcs r5, r7\n\t"
  39237. #else
  39238. "adc r5, r7\n\t"
  39239. #endif
  39240. #ifdef WOLFSSL_KEIL
  39241. "adcs r3, r3, %[r]\n\t"
  39242. #elif defined(__clang__)
  39243. "adcs r3, %[r]\n\t"
  39244. #else
  39245. "adc r3, %[r]\n\t"
  39246. #endif
  39247. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39248. "lsrs r6, %[a], #16\n\t"
  39249. #else
  39250. "lsr r6, %[a], #16\n\t"
  39251. #endif
  39252. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39253. "lsrs r7, %[b], #16\n\t"
  39254. #else
  39255. "lsr r7, %[b], #16\n\t"
  39256. #endif
  39257. #ifdef WOLFSSL_KEIL
  39258. "muls r7, r6, r7\n\t"
  39259. #elif defined(__clang__)
  39260. "muls r7, r6\n\t"
  39261. #else
  39262. "mul r7, r6\n\t"
  39263. #endif
  39264. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39265. "adds r5, r5, r7\n\t"
  39266. #else
  39267. "add r5, r5, r7\n\t"
  39268. #endif
  39269. #ifdef WOLFSSL_KEIL
  39270. "adcs r3, r3, %[r]\n\t"
  39271. #elif defined(__clang__)
  39272. "adcs r3, %[r]\n\t"
  39273. #else
  39274. "adc r3, %[r]\n\t"
  39275. #endif
  39276. "uxth r7, %[b]\n\t"
  39277. #ifdef WOLFSSL_KEIL
  39278. "muls r6, r7, r6\n\t"
  39279. #elif defined(__clang__)
  39280. "muls r6, r7\n\t"
  39281. #else
  39282. "mul r6, r7\n\t"
  39283. #endif
  39284. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39285. "lsrs r7, r6, #16\n\t"
  39286. #else
  39287. "lsr r7, r6, #16\n\t"
  39288. #endif
  39289. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39290. "lsls r6, r6, #16\n\t"
  39291. #else
  39292. "lsl r6, r6, #16\n\t"
  39293. #endif
  39294. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39295. "adds r4, r4, r6\n\t"
  39296. #else
  39297. "add r4, r4, r6\n\t"
  39298. #endif
  39299. #ifdef WOLFSSL_KEIL
  39300. "adcs r5, r5, r7\n\t"
  39301. #elif defined(__clang__)
  39302. "adcs r5, r7\n\t"
  39303. #else
  39304. "adc r5, r7\n\t"
  39305. #endif
  39306. #ifdef WOLFSSL_KEIL
  39307. "adcs r3, r3, %[r]\n\t"
  39308. #elif defined(__clang__)
  39309. "adcs r3, %[r]\n\t"
  39310. #else
  39311. "adc r3, %[r]\n\t"
  39312. #endif
  39313. "# A[1] * B[9]\n\t"
  39314. "mov %[a], r9\n\t"
  39315. "mov %[b], r10\n\t"
  39316. "ldr %[a], [%[a], #4]\n\t"
  39317. "ldr %[b], [%[b], #36]\n\t"
  39318. "uxth r6, %[a]\n\t"
  39319. "uxth r7, %[b]\n\t"
  39320. #ifdef WOLFSSL_KEIL
  39321. "muls r7, r6, r7\n\t"
  39322. #elif defined(__clang__)
  39323. "muls r7, r6\n\t"
  39324. #else
  39325. "mul r7, r6\n\t"
  39326. #endif
  39327. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39328. "adds r4, r4, r7\n\t"
  39329. #else
  39330. "add r4, r4, r7\n\t"
  39331. #endif
  39332. #ifdef WOLFSSL_KEIL
  39333. "adcs r5, r5, %[r]\n\t"
  39334. #elif defined(__clang__)
  39335. "adcs r5, %[r]\n\t"
  39336. #else
  39337. "adc r5, %[r]\n\t"
  39338. #endif
  39339. #ifdef WOLFSSL_KEIL
  39340. "adcs r3, r3, %[r]\n\t"
  39341. #elif defined(__clang__)
  39342. "adcs r3, %[r]\n\t"
  39343. #else
  39344. "adc r3, %[r]\n\t"
  39345. #endif
  39346. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39347. "lsrs r7, %[b], #16\n\t"
  39348. #else
  39349. "lsr r7, %[b], #16\n\t"
  39350. #endif
  39351. #ifdef WOLFSSL_KEIL
  39352. "muls r6, r7, r6\n\t"
  39353. #elif defined(__clang__)
  39354. "muls r6, r7\n\t"
  39355. #else
  39356. "mul r6, r7\n\t"
  39357. #endif
  39358. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39359. "lsrs r7, r6, #16\n\t"
  39360. #else
  39361. "lsr r7, r6, #16\n\t"
  39362. #endif
  39363. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39364. "lsls r6, r6, #16\n\t"
  39365. #else
  39366. "lsl r6, r6, #16\n\t"
  39367. #endif
  39368. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39369. "adds r4, r4, r6\n\t"
  39370. #else
  39371. "add r4, r4, r6\n\t"
  39372. #endif
  39373. #ifdef WOLFSSL_KEIL
  39374. "adcs r5, r5, r7\n\t"
  39375. #elif defined(__clang__)
  39376. "adcs r5, r7\n\t"
  39377. #else
  39378. "adc r5, r7\n\t"
  39379. #endif
  39380. #ifdef WOLFSSL_KEIL
  39381. "adcs r3, r3, %[r]\n\t"
  39382. #elif defined(__clang__)
  39383. "adcs r3, %[r]\n\t"
  39384. #else
  39385. "adc r3, %[r]\n\t"
  39386. #endif
  39387. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39388. "lsrs r6, %[a], #16\n\t"
  39389. #else
  39390. "lsr r6, %[a], #16\n\t"
  39391. #endif
  39392. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39393. "lsrs r7, %[b], #16\n\t"
  39394. #else
  39395. "lsr r7, %[b], #16\n\t"
  39396. #endif
  39397. #ifdef WOLFSSL_KEIL
  39398. "muls r7, r6, r7\n\t"
  39399. #elif defined(__clang__)
  39400. "muls r7, r6\n\t"
  39401. #else
  39402. "mul r7, r6\n\t"
  39403. #endif
  39404. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39405. "adds r5, r5, r7\n\t"
  39406. #else
  39407. "add r5, r5, r7\n\t"
  39408. #endif
  39409. #ifdef WOLFSSL_KEIL
  39410. "adcs r3, r3, %[r]\n\t"
  39411. #elif defined(__clang__)
  39412. "adcs r3, %[r]\n\t"
  39413. #else
  39414. "adc r3, %[r]\n\t"
  39415. #endif
  39416. "uxth r7, %[b]\n\t"
  39417. #ifdef WOLFSSL_KEIL
  39418. "muls r6, r7, r6\n\t"
  39419. #elif defined(__clang__)
  39420. "muls r6, r7\n\t"
  39421. #else
  39422. "mul r6, r7\n\t"
  39423. #endif
  39424. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39425. "lsrs r7, r6, #16\n\t"
  39426. #else
  39427. "lsr r7, r6, #16\n\t"
  39428. #endif
  39429. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39430. "lsls r6, r6, #16\n\t"
  39431. #else
  39432. "lsl r6, r6, #16\n\t"
  39433. #endif
  39434. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39435. "adds r4, r4, r6\n\t"
  39436. #else
  39437. "add r4, r4, r6\n\t"
  39438. #endif
  39439. #ifdef WOLFSSL_KEIL
  39440. "adcs r5, r5, r7\n\t"
  39441. #elif defined(__clang__)
  39442. "adcs r5, r7\n\t"
  39443. #else
  39444. "adc r5, r7\n\t"
  39445. #endif
  39446. #ifdef WOLFSSL_KEIL
  39447. "adcs r3, r3, %[r]\n\t"
  39448. #elif defined(__clang__)
  39449. "adcs r3, %[r]\n\t"
  39450. #else
  39451. "adc r3, %[r]\n\t"
  39452. #endif
  39453. "# A[0] * B[10]\n\t"
  39454. "mov %[a], r9\n\t"
  39455. "mov %[b], r10\n\t"
  39456. "ldr %[a], [%[a]]\n\t"
  39457. "ldr %[b], [%[b], #40]\n\t"
  39458. "uxth r6, %[a]\n\t"
  39459. "uxth r7, %[b]\n\t"
  39460. #ifdef WOLFSSL_KEIL
  39461. "muls r7, r6, r7\n\t"
  39462. #elif defined(__clang__)
  39463. "muls r7, r6\n\t"
  39464. #else
  39465. "mul r7, r6\n\t"
  39466. #endif
  39467. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39468. "adds r4, r4, r7\n\t"
  39469. #else
  39470. "add r4, r4, r7\n\t"
  39471. #endif
  39472. #ifdef WOLFSSL_KEIL
  39473. "adcs r5, r5, %[r]\n\t"
  39474. #elif defined(__clang__)
  39475. "adcs r5, %[r]\n\t"
  39476. #else
  39477. "adc r5, %[r]\n\t"
  39478. #endif
  39479. #ifdef WOLFSSL_KEIL
  39480. "adcs r3, r3, %[r]\n\t"
  39481. #elif defined(__clang__)
  39482. "adcs r3, %[r]\n\t"
  39483. #else
  39484. "adc r3, %[r]\n\t"
  39485. #endif
  39486. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39487. "lsrs r7, %[b], #16\n\t"
  39488. #else
  39489. "lsr r7, %[b], #16\n\t"
  39490. #endif
  39491. #ifdef WOLFSSL_KEIL
  39492. "muls r6, r7, r6\n\t"
  39493. #elif defined(__clang__)
  39494. "muls r6, r7\n\t"
  39495. #else
  39496. "mul r6, r7\n\t"
  39497. #endif
  39498. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39499. "lsrs r7, r6, #16\n\t"
  39500. #else
  39501. "lsr r7, r6, #16\n\t"
  39502. #endif
  39503. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39504. "lsls r6, r6, #16\n\t"
  39505. #else
  39506. "lsl r6, r6, #16\n\t"
  39507. #endif
  39508. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39509. "adds r4, r4, r6\n\t"
  39510. #else
  39511. "add r4, r4, r6\n\t"
  39512. #endif
  39513. #ifdef WOLFSSL_KEIL
  39514. "adcs r5, r5, r7\n\t"
  39515. #elif defined(__clang__)
  39516. "adcs r5, r7\n\t"
  39517. #else
  39518. "adc r5, r7\n\t"
  39519. #endif
  39520. #ifdef WOLFSSL_KEIL
  39521. "adcs r3, r3, %[r]\n\t"
  39522. #elif defined(__clang__)
  39523. "adcs r3, %[r]\n\t"
  39524. #else
  39525. "adc r3, %[r]\n\t"
  39526. #endif
  39527. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39528. "lsrs r6, %[a], #16\n\t"
  39529. #else
  39530. "lsr r6, %[a], #16\n\t"
  39531. #endif
  39532. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39533. "lsrs r7, %[b], #16\n\t"
  39534. #else
  39535. "lsr r7, %[b], #16\n\t"
  39536. #endif
  39537. #ifdef WOLFSSL_KEIL
  39538. "muls r7, r6, r7\n\t"
  39539. #elif defined(__clang__)
  39540. "muls r7, r6\n\t"
  39541. #else
  39542. "mul r7, r6\n\t"
  39543. #endif
  39544. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39545. "adds r5, r5, r7\n\t"
  39546. #else
  39547. "add r5, r5, r7\n\t"
  39548. #endif
  39549. #ifdef WOLFSSL_KEIL
  39550. "adcs r3, r3, %[r]\n\t"
  39551. #elif defined(__clang__)
  39552. "adcs r3, %[r]\n\t"
  39553. #else
  39554. "adc r3, %[r]\n\t"
  39555. #endif
  39556. "uxth r7, %[b]\n\t"
  39557. #ifdef WOLFSSL_KEIL
  39558. "muls r6, r7, r6\n\t"
  39559. #elif defined(__clang__)
  39560. "muls r6, r7\n\t"
  39561. #else
  39562. "mul r6, r7\n\t"
  39563. #endif
  39564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39565. "lsrs r7, r6, #16\n\t"
  39566. #else
  39567. "lsr r7, r6, #16\n\t"
  39568. #endif
  39569. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39570. "lsls r6, r6, #16\n\t"
  39571. #else
  39572. "lsl r6, r6, #16\n\t"
  39573. #endif
  39574. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39575. "adds r4, r4, r6\n\t"
  39576. #else
  39577. "add r4, r4, r6\n\t"
  39578. #endif
  39579. #ifdef WOLFSSL_KEIL
  39580. "adcs r5, r5, r7\n\t"
  39581. #elif defined(__clang__)
  39582. "adcs r5, r7\n\t"
  39583. #else
  39584. "adc r5, r7\n\t"
  39585. #endif
  39586. #ifdef WOLFSSL_KEIL
  39587. "adcs r3, r3, %[r]\n\t"
  39588. #elif defined(__clang__)
  39589. "adcs r3, %[r]\n\t"
  39590. #else
  39591. "adc r3, %[r]\n\t"
  39592. #endif
  39593. "str r4, [sp, #40]\n\t"
  39594. "# A[0] * B[11]\n\t"
  39595. "movs r4, #0\n\t"
  39596. "mov %[a], r9\n\t"
  39597. "mov %[b], r10\n\t"
  39598. "ldr %[a], [%[a]]\n\t"
  39599. "ldr %[b], [%[b], #44]\n\t"
  39600. "uxth r6, %[a]\n\t"
  39601. "uxth r7, %[b]\n\t"
  39602. #ifdef WOLFSSL_KEIL
  39603. "muls r7, r6, r7\n\t"
  39604. #elif defined(__clang__)
  39605. "muls r7, r6\n\t"
  39606. #else
  39607. "mul r7, r6\n\t"
  39608. #endif
  39609. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39610. "adds r5, r5, r7\n\t"
  39611. #else
  39612. "add r5, r5, r7\n\t"
  39613. #endif
  39614. #ifdef WOLFSSL_KEIL
  39615. "adcs r3, r3, %[r]\n\t"
  39616. #elif defined(__clang__)
  39617. "adcs r3, %[r]\n\t"
  39618. #else
  39619. "adc r3, %[r]\n\t"
  39620. #endif
  39621. #ifdef WOLFSSL_KEIL
  39622. "adcs r4, r4, %[r]\n\t"
  39623. #elif defined(__clang__)
  39624. "adcs r4, %[r]\n\t"
  39625. #else
  39626. "adc r4, %[r]\n\t"
  39627. #endif
  39628. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39629. "lsrs r7, %[b], #16\n\t"
  39630. #else
  39631. "lsr r7, %[b], #16\n\t"
  39632. #endif
  39633. #ifdef WOLFSSL_KEIL
  39634. "muls r6, r7, r6\n\t"
  39635. #elif defined(__clang__)
  39636. "muls r6, r7\n\t"
  39637. #else
  39638. "mul r6, r7\n\t"
  39639. #endif
  39640. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39641. "lsrs r7, r6, #16\n\t"
  39642. #else
  39643. "lsr r7, r6, #16\n\t"
  39644. #endif
  39645. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39646. "lsls r6, r6, #16\n\t"
  39647. #else
  39648. "lsl r6, r6, #16\n\t"
  39649. #endif
  39650. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39651. "adds r5, r5, r6\n\t"
  39652. #else
  39653. "add r5, r5, r6\n\t"
  39654. #endif
  39655. #ifdef WOLFSSL_KEIL
  39656. "adcs r3, r3, r7\n\t"
  39657. #elif defined(__clang__)
  39658. "adcs r3, r7\n\t"
  39659. #else
  39660. "adc r3, r7\n\t"
  39661. #endif
  39662. #ifdef WOLFSSL_KEIL
  39663. "adcs r4, r4, %[r]\n\t"
  39664. #elif defined(__clang__)
  39665. "adcs r4, %[r]\n\t"
  39666. #else
  39667. "adc r4, %[r]\n\t"
  39668. #endif
  39669. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39670. "lsrs r6, %[a], #16\n\t"
  39671. #else
  39672. "lsr r6, %[a], #16\n\t"
  39673. #endif
  39674. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39675. "lsrs r7, %[b], #16\n\t"
  39676. #else
  39677. "lsr r7, %[b], #16\n\t"
  39678. #endif
  39679. #ifdef WOLFSSL_KEIL
  39680. "muls r7, r6, r7\n\t"
  39681. #elif defined(__clang__)
  39682. "muls r7, r6\n\t"
  39683. #else
  39684. "mul r7, r6\n\t"
  39685. #endif
  39686. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39687. "adds r3, r3, r7\n\t"
  39688. #else
  39689. "add r3, r3, r7\n\t"
  39690. #endif
  39691. #ifdef WOLFSSL_KEIL
  39692. "adcs r4, r4, %[r]\n\t"
  39693. #elif defined(__clang__)
  39694. "adcs r4, %[r]\n\t"
  39695. #else
  39696. "adc r4, %[r]\n\t"
  39697. #endif
  39698. "uxth r7, %[b]\n\t"
  39699. #ifdef WOLFSSL_KEIL
  39700. "muls r6, r7, r6\n\t"
  39701. #elif defined(__clang__)
  39702. "muls r6, r7\n\t"
  39703. #else
  39704. "mul r6, r7\n\t"
  39705. #endif
  39706. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39707. "lsrs r7, r6, #16\n\t"
  39708. #else
  39709. "lsr r7, r6, #16\n\t"
  39710. #endif
  39711. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39712. "lsls r6, r6, #16\n\t"
  39713. #else
  39714. "lsl r6, r6, #16\n\t"
  39715. #endif
  39716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39717. "adds r5, r5, r6\n\t"
  39718. #else
  39719. "add r5, r5, r6\n\t"
  39720. #endif
  39721. #ifdef WOLFSSL_KEIL
  39722. "adcs r3, r3, r7\n\t"
  39723. #elif defined(__clang__)
  39724. "adcs r3, r7\n\t"
  39725. #else
  39726. "adc r3, r7\n\t"
  39727. #endif
  39728. #ifdef WOLFSSL_KEIL
  39729. "adcs r4, r4, %[r]\n\t"
  39730. #elif defined(__clang__)
  39731. "adcs r4, %[r]\n\t"
  39732. #else
  39733. "adc r4, %[r]\n\t"
  39734. #endif
  39735. "# A[1] * B[10]\n\t"
  39736. "mov %[a], r9\n\t"
  39737. "mov %[b], r10\n\t"
  39738. "ldr %[a], [%[a], #4]\n\t"
  39739. "ldr %[b], [%[b], #40]\n\t"
  39740. "uxth r6, %[a]\n\t"
  39741. "uxth r7, %[b]\n\t"
  39742. #ifdef WOLFSSL_KEIL
  39743. "muls r7, r6, r7\n\t"
  39744. #elif defined(__clang__)
  39745. "muls r7, r6\n\t"
  39746. #else
  39747. "mul r7, r6\n\t"
  39748. #endif
  39749. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39750. "adds r5, r5, r7\n\t"
  39751. #else
  39752. "add r5, r5, r7\n\t"
  39753. #endif
  39754. #ifdef WOLFSSL_KEIL
  39755. "adcs r3, r3, %[r]\n\t"
  39756. #elif defined(__clang__)
  39757. "adcs r3, %[r]\n\t"
  39758. #else
  39759. "adc r3, %[r]\n\t"
  39760. #endif
  39761. #ifdef WOLFSSL_KEIL
  39762. "adcs r4, r4, %[r]\n\t"
  39763. #elif defined(__clang__)
  39764. "adcs r4, %[r]\n\t"
  39765. #else
  39766. "adc r4, %[r]\n\t"
  39767. #endif
  39768. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39769. "lsrs r7, %[b], #16\n\t"
  39770. #else
  39771. "lsr r7, %[b], #16\n\t"
  39772. #endif
  39773. #ifdef WOLFSSL_KEIL
  39774. "muls r6, r7, r6\n\t"
  39775. #elif defined(__clang__)
  39776. "muls r6, r7\n\t"
  39777. #else
  39778. "mul r6, r7\n\t"
  39779. #endif
  39780. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39781. "lsrs r7, r6, #16\n\t"
  39782. #else
  39783. "lsr r7, r6, #16\n\t"
  39784. #endif
  39785. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39786. "lsls r6, r6, #16\n\t"
  39787. #else
  39788. "lsl r6, r6, #16\n\t"
  39789. #endif
  39790. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39791. "adds r5, r5, r6\n\t"
  39792. #else
  39793. "add r5, r5, r6\n\t"
  39794. #endif
  39795. #ifdef WOLFSSL_KEIL
  39796. "adcs r3, r3, r7\n\t"
  39797. #elif defined(__clang__)
  39798. "adcs r3, r7\n\t"
  39799. #else
  39800. "adc r3, r7\n\t"
  39801. #endif
  39802. #ifdef WOLFSSL_KEIL
  39803. "adcs r4, r4, %[r]\n\t"
  39804. #elif defined(__clang__)
  39805. "adcs r4, %[r]\n\t"
  39806. #else
  39807. "adc r4, %[r]\n\t"
  39808. #endif
  39809. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39810. "lsrs r6, %[a], #16\n\t"
  39811. #else
  39812. "lsr r6, %[a], #16\n\t"
  39813. #endif
  39814. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39815. "lsrs r7, %[b], #16\n\t"
  39816. #else
  39817. "lsr r7, %[b], #16\n\t"
  39818. #endif
  39819. #ifdef WOLFSSL_KEIL
  39820. "muls r7, r6, r7\n\t"
  39821. #elif defined(__clang__)
  39822. "muls r7, r6\n\t"
  39823. #else
  39824. "mul r7, r6\n\t"
  39825. #endif
  39826. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39827. "adds r3, r3, r7\n\t"
  39828. #else
  39829. "add r3, r3, r7\n\t"
  39830. #endif
  39831. #ifdef WOLFSSL_KEIL
  39832. "adcs r4, r4, %[r]\n\t"
  39833. #elif defined(__clang__)
  39834. "adcs r4, %[r]\n\t"
  39835. #else
  39836. "adc r4, %[r]\n\t"
  39837. #endif
  39838. "uxth r7, %[b]\n\t"
  39839. #ifdef WOLFSSL_KEIL
  39840. "muls r6, r7, r6\n\t"
  39841. #elif defined(__clang__)
  39842. "muls r6, r7\n\t"
  39843. #else
  39844. "mul r6, r7\n\t"
  39845. #endif
  39846. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39847. "lsrs r7, r6, #16\n\t"
  39848. #else
  39849. "lsr r7, r6, #16\n\t"
  39850. #endif
  39851. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39852. "lsls r6, r6, #16\n\t"
  39853. #else
  39854. "lsl r6, r6, #16\n\t"
  39855. #endif
  39856. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39857. "adds r5, r5, r6\n\t"
  39858. #else
  39859. "add r5, r5, r6\n\t"
  39860. #endif
  39861. #ifdef WOLFSSL_KEIL
  39862. "adcs r3, r3, r7\n\t"
  39863. #elif defined(__clang__)
  39864. "adcs r3, r7\n\t"
  39865. #else
  39866. "adc r3, r7\n\t"
  39867. #endif
  39868. #ifdef WOLFSSL_KEIL
  39869. "adcs r4, r4, %[r]\n\t"
  39870. #elif defined(__clang__)
  39871. "adcs r4, %[r]\n\t"
  39872. #else
  39873. "adc r4, %[r]\n\t"
  39874. #endif
  39875. "# A[2] * B[9]\n\t"
  39876. "mov %[a], r9\n\t"
  39877. "mov %[b], r10\n\t"
  39878. "ldr %[a], [%[a], #8]\n\t"
  39879. "ldr %[b], [%[b], #36]\n\t"
  39880. "uxth r6, %[a]\n\t"
  39881. "uxth r7, %[b]\n\t"
  39882. #ifdef WOLFSSL_KEIL
  39883. "muls r7, r6, r7\n\t"
  39884. #elif defined(__clang__)
  39885. "muls r7, r6\n\t"
  39886. #else
  39887. "mul r7, r6\n\t"
  39888. #endif
  39889. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39890. "adds r5, r5, r7\n\t"
  39891. #else
  39892. "add r5, r5, r7\n\t"
  39893. #endif
  39894. #ifdef WOLFSSL_KEIL
  39895. "adcs r3, r3, %[r]\n\t"
  39896. #elif defined(__clang__)
  39897. "adcs r3, %[r]\n\t"
  39898. #else
  39899. "adc r3, %[r]\n\t"
  39900. #endif
  39901. #ifdef WOLFSSL_KEIL
  39902. "adcs r4, r4, %[r]\n\t"
  39903. #elif defined(__clang__)
  39904. "adcs r4, %[r]\n\t"
  39905. #else
  39906. "adc r4, %[r]\n\t"
  39907. #endif
  39908. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39909. "lsrs r7, %[b], #16\n\t"
  39910. #else
  39911. "lsr r7, %[b], #16\n\t"
  39912. #endif
  39913. #ifdef WOLFSSL_KEIL
  39914. "muls r6, r7, r6\n\t"
  39915. #elif defined(__clang__)
  39916. "muls r6, r7\n\t"
  39917. #else
  39918. "mul r6, r7\n\t"
  39919. #endif
  39920. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39921. "lsrs r7, r6, #16\n\t"
  39922. #else
  39923. "lsr r7, r6, #16\n\t"
  39924. #endif
  39925. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39926. "lsls r6, r6, #16\n\t"
  39927. #else
  39928. "lsl r6, r6, #16\n\t"
  39929. #endif
  39930. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39931. "adds r5, r5, r6\n\t"
  39932. #else
  39933. "add r5, r5, r6\n\t"
  39934. #endif
  39935. #ifdef WOLFSSL_KEIL
  39936. "adcs r3, r3, r7\n\t"
  39937. #elif defined(__clang__)
  39938. "adcs r3, r7\n\t"
  39939. #else
  39940. "adc r3, r7\n\t"
  39941. #endif
  39942. #ifdef WOLFSSL_KEIL
  39943. "adcs r4, r4, %[r]\n\t"
  39944. #elif defined(__clang__)
  39945. "adcs r4, %[r]\n\t"
  39946. #else
  39947. "adc r4, %[r]\n\t"
  39948. #endif
  39949. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39950. "lsrs r6, %[a], #16\n\t"
  39951. #else
  39952. "lsr r6, %[a], #16\n\t"
  39953. #endif
  39954. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39955. "lsrs r7, %[b], #16\n\t"
  39956. #else
  39957. "lsr r7, %[b], #16\n\t"
  39958. #endif
  39959. #ifdef WOLFSSL_KEIL
  39960. "muls r7, r6, r7\n\t"
  39961. #elif defined(__clang__)
  39962. "muls r7, r6\n\t"
  39963. #else
  39964. "mul r7, r6\n\t"
  39965. #endif
  39966. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39967. "adds r3, r3, r7\n\t"
  39968. #else
  39969. "add r3, r3, r7\n\t"
  39970. #endif
  39971. #ifdef WOLFSSL_KEIL
  39972. "adcs r4, r4, %[r]\n\t"
  39973. #elif defined(__clang__)
  39974. "adcs r4, %[r]\n\t"
  39975. #else
  39976. "adc r4, %[r]\n\t"
  39977. #endif
  39978. "uxth r7, %[b]\n\t"
  39979. #ifdef WOLFSSL_KEIL
  39980. "muls r6, r7, r6\n\t"
  39981. #elif defined(__clang__)
  39982. "muls r6, r7\n\t"
  39983. #else
  39984. "mul r6, r7\n\t"
  39985. #endif
  39986. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39987. "lsrs r7, r6, #16\n\t"
  39988. #else
  39989. "lsr r7, r6, #16\n\t"
  39990. #endif
  39991. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39992. "lsls r6, r6, #16\n\t"
  39993. #else
  39994. "lsl r6, r6, #16\n\t"
  39995. #endif
  39996. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39997. "adds r5, r5, r6\n\t"
  39998. #else
  39999. "add r5, r5, r6\n\t"
  40000. #endif
  40001. #ifdef WOLFSSL_KEIL
  40002. "adcs r3, r3, r7\n\t"
  40003. #elif defined(__clang__)
  40004. "adcs r3, r7\n\t"
  40005. #else
  40006. "adc r3, r7\n\t"
  40007. #endif
  40008. #ifdef WOLFSSL_KEIL
  40009. "adcs r4, r4, %[r]\n\t"
  40010. #elif defined(__clang__)
  40011. "adcs r4, %[r]\n\t"
  40012. #else
  40013. "adc r4, %[r]\n\t"
  40014. #endif
  40015. "# A[3] * B[8]\n\t"
  40016. "mov %[a], r9\n\t"
  40017. "mov %[b], r10\n\t"
  40018. "ldr %[a], [%[a], #12]\n\t"
  40019. "ldr %[b], [%[b], #32]\n\t"
  40020. "uxth r6, %[a]\n\t"
  40021. "uxth r7, %[b]\n\t"
  40022. #ifdef WOLFSSL_KEIL
  40023. "muls r7, r6, r7\n\t"
  40024. #elif defined(__clang__)
  40025. "muls r7, r6\n\t"
  40026. #else
  40027. "mul r7, r6\n\t"
  40028. #endif
  40029. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40030. "adds r5, r5, r7\n\t"
  40031. #else
  40032. "add r5, r5, r7\n\t"
  40033. #endif
  40034. #ifdef WOLFSSL_KEIL
  40035. "adcs r3, r3, %[r]\n\t"
  40036. #elif defined(__clang__)
  40037. "adcs r3, %[r]\n\t"
  40038. #else
  40039. "adc r3, %[r]\n\t"
  40040. #endif
  40041. #ifdef WOLFSSL_KEIL
  40042. "adcs r4, r4, %[r]\n\t"
  40043. #elif defined(__clang__)
  40044. "adcs r4, %[r]\n\t"
  40045. #else
  40046. "adc r4, %[r]\n\t"
  40047. #endif
  40048. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40049. "lsrs r7, %[b], #16\n\t"
  40050. #else
  40051. "lsr r7, %[b], #16\n\t"
  40052. #endif
  40053. #ifdef WOLFSSL_KEIL
  40054. "muls r6, r7, r6\n\t"
  40055. #elif defined(__clang__)
  40056. "muls r6, r7\n\t"
  40057. #else
  40058. "mul r6, r7\n\t"
  40059. #endif
  40060. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40061. "lsrs r7, r6, #16\n\t"
  40062. #else
  40063. "lsr r7, r6, #16\n\t"
  40064. #endif
  40065. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40066. "lsls r6, r6, #16\n\t"
  40067. #else
  40068. "lsl r6, r6, #16\n\t"
  40069. #endif
  40070. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40071. "adds r5, r5, r6\n\t"
  40072. #else
  40073. "add r5, r5, r6\n\t"
  40074. #endif
  40075. #ifdef WOLFSSL_KEIL
  40076. "adcs r3, r3, r7\n\t"
  40077. #elif defined(__clang__)
  40078. "adcs r3, r7\n\t"
  40079. #else
  40080. "adc r3, r7\n\t"
  40081. #endif
  40082. #ifdef WOLFSSL_KEIL
  40083. "adcs r4, r4, %[r]\n\t"
  40084. #elif defined(__clang__)
  40085. "adcs r4, %[r]\n\t"
  40086. #else
  40087. "adc r4, %[r]\n\t"
  40088. #endif
  40089. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40090. "lsrs r6, %[a], #16\n\t"
  40091. #else
  40092. "lsr r6, %[a], #16\n\t"
  40093. #endif
  40094. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40095. "lsrs r7, %[b], #16\n\t"
  40096. #else
  40097. "lsr r7, %[b], #16\n\t"
  40098. #endif
  40099. #ifdef WOLFSSL_KEIL
  40100. "muls r7, r6, r7\n\t"
  40101. #elif defined(__clang__)
  40102. "muls r7, r6\n\t"
  40103. #else
  40104. "mul r7, r6\n\t"
  40105. #endif
  40106. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40107. "adds r3, r3, r7\n\t"
  40108. #else
  40109. "add r3, r3, r7\n\t"
  40110. #endif
  40111. #ifdef WOLFSSL_KEIL
  40112. "adcs r4, r4, %[r]\n\t"
  40113. #elif defined(__clang__)
  40114. "adcs r4, %[r]\n\t"
  40115. #else
  40116. "adc r4, %[r]\n\t"
  40117. #endif
  40118. "uxth r7, %[b]\n\t"
  40119. #ifdef WOLFSSL_KEIL
  40120. "muls r6, r7, r6\n\t"
  40121. #elif defined(__clang__)
  40122. "muls r6, r7\n\t"
  40123. #else
  40124. "mul r6, r7\n\t"
  40125. #endif
  40126. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40127. "lsrs r7, r6, #16\n\t"
  40128. #else
  40129. "lsr r7, r6, #16\n\t"
  40130. #endif
  40131. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40132. "lsls r6, r6, #16\n\t"
  40133. #else
  40134. "lsl r6, r6, #16\n\t"
  40135. #endif
  40136. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40137. "adds r5, r5, r6\n\t"
  40138. #else
  40139. "add r5, r5, r6\n\t"
  40140. #endif
  40141. #ifdef WOLFSSL_KEIL
  40142. "adcs r3, r3, r7\n\t"
  40143. #elif defined(__clang__)
  40144. "adcs r3, r7\n\t"
  40145. #else
  40146. "adc r3, r7\n\t"
  40147. #endif
  40148. #ifdef WOLFSSL_KEIL
  40149. "adcs r4, r4, %[r]\n\t"
  40150. #elif defined(__clang__)
  40151. "adcs r4, %[r]\n\t"
  40152. #else
  40153. "adc r4, %[r]\n\t"
  40154. #endif
  40155. "# A[4] * B[7]\n\t"
  40156. "mov %[a], r9\n\t"
  40157. "mov %[b], r10\n\t"
  40158. "ldr %[a], [%[a], #16]\n\t"
  40159. "ldr %[b], [%[b], #28]\n\t"
  40160. "uxth r6, %[a]\n\t"
  40161. "uxth r7, %[b]\n\t"
  40162. #ifdef WOLFSSL_KEIL
  40163. "muls r7, r6, r7\n\t"
  40164. #elif defined(__clang__)
  40165. "muls r7, r6\n\t"
  40166. #else
  40167. "mul r7, r6\n\t"
  40168. #endif
  40169. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40170. "adds r5, r5, r7\n\t"
  40171. #else
  40172. "add r5, r5, r7\n\t"
  40173. #endif
  40174. #ifdef WOLFSSL_KEIL
  40175. "adcs r3, r3, %[r]\n\t"
  40176. #elif defined(__clang__)
  40177. "adcs r3, %[r]\n\t"
  40178. #else
  40179. "adc r3, %[r]\n\t"
  40180. #endif
  40181. #ifdef WOLFSSL_KEIL
  40182. "adcs r4, r4, %[r]\n\t"
  40183. #elif defined(__clang__)
  40184. "adcs r4, %[r]\n\t"
  40185. #else
  40186. "adc r4, %[r]\n\t"
  40187. #endif
  40188. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40189. "lsrs r7, %[b], #16\n\t"
  40190. #else
  40191. "lsr r7, %[b], #16\n\t"
  40192. #endif
  40193. #ifdef WOLFSSL_KEIL
  40194. "muls r6, r7, r6\n\t"
  40195. #elif defined(__clang__)
  40196. "muls r6, r7\n\t"
  40197. #else
  40198. "mul r6, r7\n\t"
  40199. #endif
  40200. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40201. "lsrs r7, r6, #16\n\t"
  40202. #else
  40203. "lsr r7, r6, #16\n\t"
  40204. #endif
  40205. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40206. "lsls r6, r6, #16\n\t"
  40207. #else
  40208. "lsl r6, r6, #16\n\t"
  40209. #endif
  40210. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40211. "adds r5, r5, r6\n\t"
  40212. #else
  40213. "add r5, r5, r6\n\t"
  40214. #endif
  40215. #ifdef WOLFSSL_KEIL
  40216. "adcs r3, r3, r7\n\t"
  40217. #elif defined(__clang__)
  40218. "adcs r3, r7\n\t"
  40219. #else
  40220. "adc r3, r7\n\t"
  40221. #endif
  40222. #ifdef WOLFSSL_KEIL
  40223. "adcs r4, r4, %[r]\n\t"
  40224. #elif defined(__clang__)
  40225. "adcs r4, %[r]\n\t"
  40226. #else
  40227. "adc r4, %[r]\n\t"
  40228. #endif
  40229. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40230. "lsrs r6, %[a], #16\n\t"
  40231. #else
  40232. "lsr r6, %[a], #16\n\t"
  40233. #endif
  40234. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40235. "lsrs r7, %[b], #16\n\t"
  40236. #else
  40237. "lsr r7, %[b], #16\n\t"
  40238. #endif
  40239. #ifdef WOLFSSL_KEIL
  40240. "muls r7, r6, r7\n\t"
  40241. #elif defined(__clang__)
  40242. "muls r7, r6\n\t"
  40243. #else
  40244. "mul r7, r6\n\t"
  40245. #endif
  40246. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40247. "adds r3, r3, r7\n\t"
  40248. #else
  40249. "add r3, r3, r7\n\t"
  40250. #endif
  40251. #ifdef WOLFSSL_KEIL
  40252. "adcs r4, r4, %[r]\n\t"
  40253. #elif defined(__clang__)
  40254. "adcs r4, %[r]\n\t"
  40255. #else
  40256. "adc r4, %[r]\n\t"
  40257. #endif
  40258. "uxth r7, %[b]\n\t"
  40259. #ifdef WOLFSSL_KEIL
  40260. "muls r6, r7, r6\n\t"
  40261. #elif defined(__clang__)
  40262. "muls r6, r7\n\t"
  40263. #else
  40264. "mul r6, r7\n\t"
  40265. #endif
  40266. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40267. "lsrs r7, r6, #16\n\t"
  40268. #else
  40269. "lsr r7, r6, #16\n\t"
  40270. #endif
  40271. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40272. "lsls r6, r6, #16\n\t"
  40273. #else
  40274. "lsl r6, r6, #16\n\t"
  40275. #endif
  40276. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40277. "adds r5, r5, r6\n\t"
  40278. #else
  40279. "add r5, r5, r6\n\t"
  40280. #endif
  40281. #ifdef WOLFSSL_KEIL
  40282. "adcs r3, r3, r7\n\t"
  40283. #elif defined(__clang__)
  40284. "adcs r3, r7\n\t"
  40285. #else
  40286. "adc r3, r7\n\t"
  40287. #endif
  40288. #ifdef WOLFSSL_KEIL
  40289. "adcs r4, r4, %[r]\n\t"
  40290. #elif defined(__clang__)
  40291. "adcs r4, %[r]\n\t"
  40292. #else
  40293. "adc r4, %[r]\n\t"
  40294. #endif
  40295. "# A[5] * B[6]\n\t"
  40296. "mov %[a], r9\n\t"
  40297. "mov %[b], r10\n\t"
  40298. "ldr %[a], [%[a], #20]\n\t"
  40299. "ldr %[b], [%[b], #24]\n\t"
  40300. "uxth r6, %[a]\n\t"
  40301. "uxth r7, %[b]\n\t"
  40302. #ifdef WOLFSSL_KEIL
  40303. "muls r7, r6, r7\n\t"
  40304. #elif defined(__clang__)
  40305. "muls r7, r6\n\t"
  40306. #else
  40307. "mul r7, r6\n\t"
  40308. #endif
  40309. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40310. "adds r5, r5, r7\n\t"
  40311. #else
  40312. "add r5, r5, r7\n\t"
  40313. #endif
  40314. #ifdef WOLFSSL_KEIL
  40315. "adcs r3, r3, %[r]\n\t"
  40316. #elif defined(__clang__)
  40317. "adcs r3, %[r]\n\t"
  40318. #else
  40319. "adc r3, %[r]\n\t"
  40320. #endif
  40321. #ifdef WOLFSSL_KEIL
  40322. "adcs r4, r4, %[r]\n\t"
  40323. #elif defined(__clang__)
  40324. "adcs r4, %[r]\n\t"
  40325. #else
  40326. "adc r4, %[r]\n\t"
  40327. #endif
  40328. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40329. "lsrs r7, %[b], #16\n\t"
  40330. #else
  40331. "lsr r7, %[b], #16\n\t"
  40332. #endif
  40333. #ifdef WOLFSSL_KEIL
  40334. "muls r6, r7, r6\n\t"
  40335. #elif defined(__clang__)
  40336. "muls r6, r7\n\t"
  40337. #else
  40338. "mul r6, r7\n\t"
  40339. #endif
  40340. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40341. "lsrs r7, r6, #16\n\t"
  40342. #else
  40343. "lsr r7, r6, #16\n\t"
  40344. #endif
  40345. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40346. "lsls r6, r6, #16\n\t"
  40347. #else
  40348. "lsl r6, r6, #16\n\t"
  40349. #endif
  40350. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40351. "adds r5, r5, r6\n\t"
  40352. #else
  40353. "add r5, r5, r6\n\t"
  40354. #endif
  40355. #ifdef WOLFSSL_KEIL
  40356. "adcs r3, r3, r7\n\t"
  40357. #elif defined(__clang__)
  40358. "adcs r3, r7\n\t"
  40359. #else
  40360. "adc r3, r7\n\t"
  40361. #endif
  40362. #ifdef WOLFSSL_KEIL
  40363. "adcs r4, r4, %[r]\n\t"
  40364. #elif defined(__clang__)
  40365. "adcs r4, %[r]\n\t"
  40366. #else
  40367. "adc r4, %[r]\n\t"
  40368. #endif
  40369. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40370. "lsrs r6, %[a], #16\n\t"
  40371. #else
  40372. "lsr r6, %[a], #16\n\t"
  40373. #endif
  40374. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40375. "lsrs r7, %[b], #16\n\t"
  40376. #else
  40377. "lsr r7, %[b], #16\n\t"
  40378. #endif
  40379. #ifdef WOLFSSL_KEIL
  40380. "muls r7, r6, r7\n\t"
  40381. #elif defined(__clang__)
  40382. "muls r7, r6\n\t"
  40383. #else
  40384. "mul r7, r6\n\t"
  40385. #endif
  40386. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40387. "adds r3, r3, r7\n\t"
  40388. #else
  40389. "add r3, r3, r7\n\t"
  40390. #endif
  40391. #ifdef WOLFSSL_KEIL
  40392. "adcs r4, r4, %[r]\n\t"
  40393. #elif defined(__clang__)
  40394. "adcs r4, %[r]\n\t"
  40395. #else
  40396. "adc r4, %[r]\n\t"
  40397. #endif
  40398. "uxth r7, %[b]\n\t"
  40399. #ifdef WOLFSSL_KEIL
  40400. "muls r6, r7, r6\n\t"
  40401. #elif defined(__clang__)
  40402. "muls r6, r7\n\t"
  40403. #else
  40404. "mul r6, r7\n\t"
  40405. #endif
  40406. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40407. "lsrs r7, r6, #16\n\t"
  40408. #else
  40409. "lsr r7, r6, #16\n\t"
  40410. #endif
  40411. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40412. "lsls r6, r6, #16\n\t"
  40413. #else
  40414. "lsl r6, r6, #16\n\t"
  40415. #endif
  40416. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40417. "adds r5, r5, r6\n\t"
  40418. #else
  40419. "add r5, r5, r6\n\t"
  40420. #endif
  40421. #ifdef WOLFSSL_KEIL
  40422. "adcs r3, r3, r7\n\t"
  40423. #elif defined(__clang__)
  40424. "adcs r3, r7\n\t"
  40425. #else
  40426. "adc r3, r7\n\t"
  40427. #endif
  40428. #ifdef WOLFSSL_KEIL
  40429. "adcs r4, r4, %[r]\n\t"
  40430. #elif defined(__clang__)
  40431. "adcs r4, %[r]\n\t"
  40432. #else
  40433. "adc r4, %[r]\n\t"
  40434. #endif
  40435. "# A[6] * B[5]\n\t"
  40436. "mov %[a], r9\n\t"
  40437. "mov %[b], r10\n\t"
  40438. "ldr %[a], [%[a], #24]\n\t"
  40439. "ldr %[b], [%[b], #20]\n\t"
  40440. "uxth r6, %[a]\n\t"
  40441. "uxth r7, %[b]\n\t"
  40442. #ifdef WOLFSSL_KEIL
  40443. "muls r7, r6, r7\n\t"
  40444. #elif defined(__clang__)
  40445. "muls r7, r6\n\t"
  40446. #else
  40447. "mul r7, r6\n\t"
  40448. #endif
  40449. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40450. "adds r5, r5, r7\n\t"
  40451. #else
  40452. "add r5, r5, r7\n\t"
  40453. #endif
  40454. #ifdef WOLFSSL_KEIL
  40455. "adcs r3, r3, %[r]\n\t"
  40456. #elif defined(__clang__)
  40457. "adcs r3, %[r]\n\t"
  40458. #else
  40459. "adc r3, %[r]\n\t"
  40460. #endif
  40461. #ifdef WOLFSSL_KEIL
  40462. "adcs r4, r4, %[r]\n\t"
  40463. #elif defined(__clang__)
  40464. "adcs r4, %[r]\n\t"
  40465. #else
  40466. "adc r4, %[r]\n\t"
  40467. #endif
  40468. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40469. "lsrs r7, %[b], #16\n\t"
  40470. #else
  40471. "lsr r7, %[b], #16\n\t"
  40472. #endif
  40473. #ifdef WOLFSSL_KEIL
  40474. "muls r6, r7, r6\n\t"
  40475. #elif defined(__clang__)
  40476. "muls r6, r7\n\t"
  40477. #else
  40478. "mul r6, r7\n\t"
  40479. #endif
  40480. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40481. "lsrs r7, r6, #16\n\t"
  40482. #else
  40483. "lsr r7, r6, #16\n\t"
  40484. #endif
  40485. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40486. "lsls r6, r6, #16\n\t"
  40487. #else
  40488. "lsl r6, r6, #16\n\t"
  40489. #endif
  40490. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40491. "adds r5, r5, r6\n\t"
  40492. #else
  40493. "add r5, r5, r6\n\t"
  40494. #endif
  40495. #ifdef WOLFSSL_KEIL
  40496. "adcs r3, r3, r7\n\t"
  40497. #elif defined(__clang__)
  40498. "adcs r3, r7\n\t"
  40499. #else
  40500. "adc r3, r7\n\t"
  40501. #endif
  40502. #ifdef WOLFSSL_KEIL
  40503. "adcs r4, r4, %[r]\n\t"
  40504. #elif defined(__clang__)
  40505. "adcs r4, %[r]\n\t"
  40506. #else
  40507. "adc r4, %[r]\n\t"
  40508. #endif
  40509. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40510. "lsrs r6, %[a], #16\n\t"
  40511. #else
  40512. "lsr r6, %[a], #16\n\t"
  40513. #endif
  40514. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40515. "lsrs r7, %[b], #16\n\t"
  40516. #else
  40517. "lsr r7, %[b], #16\n\t"
  40518. #endif
  40519. #ifdef WOLFSSL_KEIL
  40520. "muls r7, r6, r7\n\t"
  40521. #elif defined(__clang__)
  40522. "muls r7, r6\n\t"
  40523. #else
  40524. "mul r7, r6\n\t"
  40525. #endif
  40526. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40527. "adds r3, r3, r7\n\t"
  40528. #else
  40529. "add r3, r3, r7\n\t"
  40530. #endif
  40531. #ifdef WOLFSSL_KEIL
  40532. "adcs r4, r4, %[r]\n\t"
  40533. #elif defined(__clang__)
  40534. "adcs r4, %[r]\n\t"
  40535. #else
  40536. "adc r4, %[r]\n\t"
  40537. #endif
  40538. "uxth r7, %[b]\n\t"
  40539. #ifdef WOLFSSL_KEIL
  40540. "muls r6, r7, r6\n\t"
  40541. #elif defined(__clang__)
  40542. "muls r6, r7\n\t"
  40543. #else
  40544. "mul r6, r7\n\t"
  40545. #endif
  40546. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40547. "lsrs r7, r6, #16\n\t"
  40548. #else
  40549. "lsr r7, r6, #16\n\t"
  40550. #endif
  40551. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40552. "lsls r6, r6, #16\n\t"
  40553. #else
  40554. "lsl r6, r6, #16\n\t"
  40555. #endif
  40556. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40557. "adds r5, r5, r6\n\t"
  40558. #else
  40559. "add r5, r5, r6\n\t"
  40560. #endif
  40561. #ifdef WOLFSSL_KEIL
  40562. "adcs r3, r3, r7\n\t"
  40563. #elif defined(__clang__)
  40564. "adcs r3, r7\n\t"
  40565. #else
  40566. "adc r3, r7\n\t"
  40567. #endif
  40568. #ifdef WOLFSSL_KEIL
  40569. "adcs r4, r4, %[r]\n\t"
  40570. #elif defined(__clang__)
  40571. "adcs r4, %[r]\n\t"
  40572. #else
  40573. "adc r4, %[r]\n\t"
  40574. #endif
  40575. "# A[7] * B[4]\n\t"
  40576. "mov %[a], r9\n\t"
  40577. "mov %[b], r10\n\t"
  40578. "ldr %[a], [%[a], #28]\n\t"
  40579. "ldr %[b], [%[b], #16]\n\t"
  40580. "uxth r6, %[a]\n\t"
  40581. "uxth r7, %[b]\n\t"
  40582. #ifdef WOLFSSL_KEIL
  40583. "muls r7, r6, r7\n\t"
  40584. #elif defined(__clang__)
  40585. "muls r7, r6\n\t"
  40586. #else
  40587. "mul r7, r6\n\t"
  40588. #endif
  40589. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40590. "adds r5, r5, r7\n\t"
  40591. #else
  40592. "add r5, r5, r7\n\t"
  40593. #endif
  40594. #ifdef WOLFSSL_KEIL
  40595. "adcs r3, r3, %[r]\n\t"
  40596. #elif defined(__clang__)
  40597. "adcs r3, %[r]\n\t"
  40598. #else
  40599. "adc r3, %[r]\n\t"
  40600. #endif
  40601. #ifdef WOLFSSL_KEIL
  40602. "adcs r4, r4, %[r]\n\t"
  40603. #elif defined(__clang__)
  40604. "adcs r4, %[r]\n\t"
  40605. #else
  40606. "adc r4, %[r]\n\t"
  40607. #endif
  40608. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40609. "lsrs r7, %[b], #16\n\t"
  40610. #else
  40611. "lsr r7, %[b], #16\n\t"
  40612. #endif
  40613. #ifdef WOLFSSL_KEIL
  40614. "muls r6, r7, r6\n\t"
  40615. #elif defined(__clang__)
  40616. "muls r6, r7\n\t"
  40617. #else
  40618. "mul r6, r7\n\t"
  40619. #endif
  40620. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40621. "lsrs r7, r6, #16\n\t"
  40622. #else
  40623. "lsr r7, r6, #16\n\t"
  40624. #endif
  40625. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40626. "lsls r6, r6, #16\n\t"
  40627. #else
  40628. "lsl r6, r6, #16\n\t"
  40629. #endif
  40630. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40631. "adds r5, r5, r6\n\t"
  40632. #else
  40633. "add r5, r5, r6\n\t"
  40634. #endif
  40635. #ifdef WOLFSSL_KEIL
  40636. "adcs r3, r3, r7\n\t"
  40637. #elif defined(__clang__)
  40638. "adcs r3, r7\n\t"
  40639. #else
  40640. "adc r3, r7\n\t"
  40641. #endif
  40642. #ifdef WOLFSSL_KEIL
  40643. "adcs r4, r4, %[r]\n\t"
  40644. #elif defined(__clang__)
  40645. "adcs r4, %[r]\n\t"
  40646. #else
  40647. "adc r4, %[r]\n\t"
  40648. #endif
  40649. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40650. "lsrs r6, %[a], #16\n\t"
  40651. #else
  40652. "lsr r6, %[a], #16\n\t"
  40653. #endif
  40654. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40655. "lsrs r7, %[b], #16\n\t"
  40656. #else
  40657. "lsr r7, %[b], #16\n\t"
  40658. #endif
  40659. #ifdef WOLFSSL_KEIL
  40660. "muls r7, r6, r7\n\t"
  40661. #elif defined(__clang__)
  40662. "muls r7, r6\n\t"
  40663. #else
  40664. "mul r7, r6\n\t"
  40665. #endif
  40666. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40667. "adds r3, r3, r7\n\t"
  40668. #else
  40669. "add r3, r3, r7\n\t"
  40670. #endif
  40671. #ifdef WOLFSSL_KEIL
  40672. "adcs r4, r4, %[r]\n\t"
  40673. #elif defined(__clang__)
  40674. "adcs r4, %[r]\n\t"
  40675. #else
  40676. "adc r4, %[r]\n\t"
  40677. #endif
  40678. "uxth r7, %[b]\n\t"
  40679. #ifdef WOLFSSL_KEIL
  40680. "muls r6, r7, r6\n\t"
  40681. #elif defined(__clang__)
  40682. "muls r6, r7\n\t"
  40683. #else
  40684. "mul r6, r7\n\t"
  40685. #endif
  40686. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40687. "lsrs r7, r6, #16\n\t"
  40688. #else
  40689. "lsr r7, r6, #16\n\t"
  40690. #endif
  40691. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40692. "lsls r6, r6, #16\n\t"
  40693. #else
  40694. "lsl r6, r6, #16\n\t"
  40695. #endif
  40696. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40697. "adds r5, r5, r6\n\t"
  40698. #else
  40699. "add r5, r5, r6\n\t"
  40700. #endif
  40701. #ifdef WOLFSSL_KEIL
  40702. "adcs r3, r3, r7\n\t"
  40703. #elif defined(__clang__)
  40704. "adcs r3, r7\n\t"
  40705. #else
  40706. "adc r3, r7\n\t"
  40707. #endif
  40708. #ifdef WOLFSSL_KEIL
  40709. "adcs r4, r4, %[r]\n\t"
  40710. #elif defined(__clang__)
  40711. "adcs r4, %[r]\n\t"
  40712. #else
  40713. "adc r4, %[r]\n\t"
  40714. #endif
  40715. "# A[8] * B[3]\n\t"
  40716. "mov %[a], r9\n\t"
  40717. "mov %[b], r10\n\t"
  40718. "ldr %[a], [%[a], #32]\n\t"
  40719. "ldr %[b], [%[b], #12]\n\t"
  40720. "uxth r6, %[a]\n\t"
  40721. "uxth r7, %[b]\n\t"
  40722. #ifdef WOLFSSL_KEIL
  40723. "muls r7, r6, r7\n\t"
  40724. #elif defined(__clang__)
  40725. "muls r7, r6\n\t"
  40726. #else
  40727. "mul r7, r6\n\t"
  40728. #endif
  40729. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40730. "adds r5, r5, r7\n\t"
  40731. #else
  40732. "add r5, r5, r7\n\t"
  40733. #endif
  40734. #ifdef WOLFSSL_KEIL
  40735. "adcs r3, r3, %[r]\n\t"
  40736. #elif defined(__clang__)
  40737. "adcs r3, %[r]\n\t"
  40738. #else
  40739. "adc r3, %[r]\n\t"
  40740. #endif
  40741. #ifdef WOLFSSL_KEIL
  40742. "adcs r4, r4, %[r]\n\t"
  40743. #elif defined(__clang__)
  40744. "adcs r4, %[r]\n\t"
  40745. #else
  40746. "adc r4, %[r]\n\t"
  40747. #endif
  40748. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40749. "lsrs r7, %[b], #16\n\t"
  40750. #else
  40751. "lsr r7, %[b], #16\n\t"
  40752. #endif
  40753. #ifdef WOLFSSL_KEIL
  40754. "muls r6, r7, r6\n\t"
  40755. #elif defined(__clang__)
  40756. "muls r6, r7\n\t"
  40757. #else
  40758. "mul r6, r7\n\t"
  40759. #endif
  40760. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40761. "lsrs r7, r6, #16\n\t"
  40762. #else
  40763. "lsr r7, r6, #16\n\t"
  40764. #endif
  40765. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40766. "lsls r6, r6, #16\n\t"
  40767. #else
  40768. "lsl r6, r6, #16\n\t"
  40769. #endif
  40770. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40771. "adds r5, r5, r6\n\t"
  40772. #else
  40773. "add r5, r5, r6\n\t"
  40774. #endif
  40775. #ifdef WOLFSSL_KEIL
  40776. "adcs r3, r3, r7\n\t"
  40777. #elif defined(__clang__)
  40778. "adcs r3, r7\n\t"
  40779. #else
  40780. "adc r3, r7\n\t"
  40781. #endif
  40782. #ifdef WOLFSSL_KEIL
  40783. "adcs r4, r4, %[r]\n\t"
  40784. #elif defined(__clang__)
  40785. "adcs r4, %[r]\n\t"
  40786. #else
  40787. "adc r4, %[r]\n\t"
  40788. #endif
  40789. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40790. "lsrs r6, %[a], #16\n\t"
  40791. #else
  40792. "lsr r6, %[a], #16\n\t"
  40793. #endif
  40794. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40795. "lsrs r7, %[b], #16\n\t"
  40796. #else
  40797. "lsr r7, %[b], #16\n\t"
  40798. #endif
  40799. #ifdef WOLFSSL_KEIL
  40800. "muls r7, r6, r7\n\t"
  40801. #elif defined(__clang__)
  40802. "muls r7, r6\n\t"
  40803. #else
  40804. "mul r7, r6\n\t"
  40805. #endif
  40806. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40807. "adds r3, r3, r7\n\t"
  40808. #else
  40809. "add r3, r3, r7\n\t"
  40810. #endif
  40811. #ifdef WOLFSSL_KEIL
  40812. "adcs r4, r4, %[r]\n\t"
  40813. #elif defined(__clang__)
  40814. "adcs r4, %[r]\n\t"
  40815. #else
  40816. "adc r4, %[r]\n\t"
  40817. #endif
  40818. "uxth r7, %[b]\n\t"
  40819. #ifdef WOLFSSL_KEIL
  40820. "muls r6, r7, r6\n\t"
  40821. #elif defined(__clang__)
  40822. "muls r6, r7\n\t"
  40823. #else
  40824. "mul r6, r7\n\t"
  40825. #endif
  40826. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40827. "lsrs r7, r6, #16\n\t"
  40828. #else
  40829. "lsr r7, r6, #16\n\t"
  40830. #endif
  40831. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40832. "lsls r6, r6, #16\n\t"
  40833. #else
  40834. "lsl r6, r6, #16\n\t"
  40835. #endif
  40836. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40837. "adds r5, r5, r6\n\t"
  40838. #else
  40839. "add r5, r5, r6\n\t"
  40840. #endif
  40841. #ifdef WOLFSSL_KEIL
  40842. "adcs r3, r3, r7\n\t"
  40843. #elif defined(__clang__)
  40844. "adcs r3, r7\n\t"
  40845. #else
  40846. "adc r3, r7\n\t"
  40847. #endif
  40848. #ifdef WOLFSSL_KEIL
  40849. "adcs r4, r4, %[r]\n\t"
  40850. #elif defined(__clang__)
  40851. "adcs r4, %[r]\n\t"
  40852. #else
  40853. "adc r4, %[r]\n\t"
  40854. #endif
  40855. "# A[9] * B[2]\n\t"
  40856. "mov %[a], r9\n\t"
  40857. "mov %[b], r10\n\t"
  40858. "ldr %[a], [%[a], #36]\n\t"
  40859. "ldr %[b], [%[b], #8]\n\t"
  40860. "uxth r6, %[a]\n\t"
  40861. "uxth r7, %[b]\n\t"
  40862. #ifdef WOLFSSL_KEIL
  40863. "muls r7, r6, r7\n\t"
  40864. #elif defined(__clang__)
  40865. "muls r7, r6\n\t"
  40866. #else
  40867. "mul r7, r6\n\t"
  40868. #endif
  40869. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40870. "adds r5, r5, r7\n\t"
  40871. #else
  40872. "add r5, r5, r7\n\t"
  40873. #endif
  40874. #ifdef WOLFSSL_KEIL
  40875. "adcs r3, r3, %[r]\n\t"
  40876. #elif defined(__clang__)
  40877. "adcs r3, %[r]\n\t"
  40878. #else
  40879. "adc r3, %[r]\n\t"
  40880. #endif
  40881. #ifdef WOLFSSL_KEIL
  40882. "adcs r4, r4, %[r]\n\t"
  40883. #elif defined(__clang__)
  40884. "adcs r4, %[r]\n\t"
  40885. #else
  40886. "adc r4, %[r]\n\t"
  40887. #endif
  40888. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40889. "lsrs r7, %[b], #16\n\t"
  40890. #else
  40891. "lsr r7, %[b], #16\n\t"
  40892. #endif
  40893. #ifdef WOLFSSL_KEIL
  40894. "muls r6, r7, r6\n\t"
  40895. #elif defined(__clang__)
  40896. "muls r6, r7\n\t"
  40897. #else
  40898. "mul r6, r7\n\t"
  40899. #endif
  40900. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40901. "lsrs r7, r6, #16\n\t"
  40902. #else
  40903. "lsr r7, r6, #16\n\t"
  40904. #endif
  40905. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40906. "lsls r6, r6, #16\n\t"
  40907. #else
  40908. "lsl r6, r6, #16\n\t"
  40909. #endif
  40910. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40911. "adds r5, r5, r6\n\t"
  40912. #else
  40913. "add r5, r5, r6\n\t"
  40914. #endif
  40915. #ifdef WOLFSSL_KEIL
  40916. "adcs r3, r3, r7\n\t"
  40917. #elif defined(__clang__)
  40918. "adcs r3, r7\n\t"
  40919. #else
  40920. "adc r3, r7\n\t"
  40921. #endif
  40922. #ifdef WOLFSSL_KEIL
  40923. "adcs r4, r4, %[r]\n\t"
  40924. #elif defined(__clang__)
  40925. "adcs r4, %[r]\n\t"
  40926. #else
  40927. "adc r4, %[r]\n\t"
  40928. #endif
  40929. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40930. "lsrs r6, %[a], #16\n\t"
  40931. #else
  40932. "lsr r6, %[a], #16\n\t"
  40933. #endif
  40934. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40935. "lsrs r7, %[b], #16\n\t"
  40936. #else
  40937. "lsr r7, %[b], #16\n\t"
  40938. #endif
  40939. #ifdef WOLFSSL_KEIL
  40940. "muls r7, r6, r7\n\t"
  40941. #elif defined(__clang__)
  40942. "muls r7, r6\n\t"
  40943. #else
  40944. "mul r7, r6\n\t"
  40945. #endif
  40946. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40947. "adds r3, r3, r7\n\t"
  40948. #else
  40949. "add r3, r3, r7\n\t"
  40950. #endif
  40951. #ifdef WOLFSSL_KEIL
  40952. "adcs r4, r4, %[r]\n\t"
  40953. #elif defined(__clang__)
  40954. "adcs r4, %[r]\n\t"
  40955. #else
  40956. "adc r4, %[r]\n\t"
  40957. #endif
  40958. "uxth r7, %[b]\n\t"
  40959. #ifdef WOLFSSL_KEIL
  40960. "muls r6, r7, r6\n\t"
  40961. #elif defined(__clang__)
  40962. "muls r6, r7\n\t"
  40963. #else
  40964. "mul r6, r7\n\t"
  40965. #endif
  40966. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40967. "lsrs r7, r6, #16\n\t"
  40968. #else
  40969. "lsr r7, r6, #16\n\t"
  40970. #endif
  40971. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40972. "lsls r6, r6, #16\n\t"
  40973. #else
  40974. "lsl r6, r6, #16\n\t"
  40975. #endif
  40976. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40977. "adds r5, r5, r6\n\t"
  40978. #else
  40979. "add r5, r5, r6\n\t"
  40980. #endif
  40981. #ifdef WOLFSSL_KEIL
  40982. "adcs r3, r3, r7\n\t"
  40983. #elif defined(__clang__)
  40984. "adcs r3, r7\n\t"
  40985. #else
  40986. "adc r3, r7\n\t"
  40987. #endif
  40988. #ifdef WOLFSSL_KEIL
  40989. "adcs r4, r4, %[r]\n\t"
  40990. #elif defined(__clang__)
  40991. "adcs r4, %[r]\n\t"
  40992. #else
  40993. "adc r4, %[r]\n\t"
  40994. #endif
  40995. "# A[10] * B[1]\n\t"
  40996. "mov %[a], r9\n\t"
  40997. "mov %[b], r10\n\t"
  40998. "ldr %[a], [%[a], #40]\n\t"
  40999. "ldr %[b], [%[b], #4]\n\t"
  41000. "uxth r6, %[a]\n\t"
  41001. "uxth r7, %[b]\n\t"
  41002. #ifdef WOLFSSL_KEIL
  41003. "muls r7, r6, r7\n\t"
  41004. #elif defined(__clang__)
  41005. "muls r7, r6\n\t"
  41006. #else
  41007. "mul r7, r6\n\t"
  41008. #endif
  41009. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41010. "adds r5, r5, r7\n\t"
  41011. #else
  41012. "add r5, r5, r7\n\t"
  41013. #endif
  41014. #ifdef WOLFSSL_KEIL
  41015. "adcs r3, r3, %[r]\n\t"
  41016. #elif defined(__clang__)
  41017. "adcs r3, %[r]\n\t"
  41018. #else
  41019. "adc r3, %[r]\n\t"
  41020. #endif
  41021. #ifdef WOLFSSL_KEIL
  41022. "adcs r4, r4, %[r]\n\t"
  41023. #elif defined(__clang__)
  41024. "adcs r4, %[r]\n\t"
  41025. #else
  41026. "adc r4, %[r]\n\t"
  41027. #endif
  41028. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41029. "lsrs r7, %[b], #16\n\t"
  41030. #else
  41031. "lsr r7, %[b], #16\n\t"
  41032. #endif
  41033. #ifdef WOLFSSL_KEIL
  41034. "muls r6, r7, r6\n\t"
  41035. #elif defined(__clang__)
  41036. "muls r6, r7\n\t"
  41037. #else
  41038. "mul r6, r7\n\t"
  41039. #endif
  41040. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41041. "lsrs r7, r6, #16\n\t"
  41042. #else
  41043. "lsr r7, r6, #16\n\t"
  41044. #endif
  41045. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41046. "lsls r6, r6, #16\n\t"
  41047. #else
  41048. "lsl r6, r6, #16\n\t"
  41049. #endif
  41050. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41051. "adds r5, r5, r6\n\t"
  41052. #else
  41053. "add r5, r5, r6\n\t"
  41054. #endif
  41055. #ifdef WOLFSSL_KEIL
  41056. "adcs r3, r3, r7\n\t"
  41057. #elif defined(__clang__)
  41058. "adcs r3, r7\n\t"
  41059. #else
  41060. "adc r3, r7\n\t"
  41061. #endif
  41062. #ifdef WOLFSSL_KEIL
  41063. "adcs r4, r4, %[r]\n\t"
  41064. #elif defined(__clang__)
  41065. "adcs r4, %[r]\n\t"
  41066. #else
  41067. "adc r4, %[r]\n\t"
  41068. #endif
  41069. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41070. "lsrs r6, %[a], #16\n\t"
  41071. #else
  41072. "lsr r6, %[a], #16\n\t"
  41073. #endif
  41074. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41075. "lsrs r7, %[b], #16\n\t"
  41076. #else
  41077. "lsr r7, %[b], #16\n\t"
  41078. #endif
  41079. #ifdef WOLFSSL_KEIL
  41080. "muls r7, r6, r7\n\t"
  41081. #elif defined(__clang__)
  41082. "muls r7, r6\n\t"
  41083. #else
  41084. "mul r7, r6\n\t"
  41085. #endif
  41086. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41087. "adds r3, r3, r7\n\t"
  41088. #else
  41089. "add r3, r3, r7\n\t"
  41090. #endif
  41091. #ifdef WOLFSSL_KEIL
  41092. "adcs r4, r4, %[r]\n\t"
  41093. #elif defined(__clang__)
  41094. "adcs r4, %[r]\n\t"
  41095. #else
  41096. "adc r4, %[r]\n\t"
  41097. #endif
  41098. "uxth r7, %[b]\n\t"
  41099. #ifdef WOLFSSL_KEIL
  41100. "muls r6, r7, r6\n\t"
  41101. #elif defined(__clang__)
  41102. "muls r6, r7\n\t"
  41103. #else
  41104. "mul r6, r7\n\t"
  41105. #endif
  41106. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41107. "lsrs r7, r6, #16\n\t"
  41108. #else
  41109. "lsr r7, r6, #16\n\t"
  41110. #endif
  41111. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41112. "lsls r6, r6, #16\n\t"
  41113. #else
  41114. "lsl r6, r6, #16\n\t"
  41115. #endif
  41116. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41117. "adds r5, r5, r6\n\t"
  41118. #else
  41119. "add r5, r5, r6\n\t"
  41120. #endif
  41121. #ifdef WOLFSSL_KEIL
  41122. "adcs r3, r3, r7\n\t"
  41123. #elif defined(__clang__)
  41124. "adcs r3, r7\n\t"
  41125. #else
  41126. "adc r3, r7\n\t"
  41127. #endif
  41128. #ifdef WOLFSSL_KEIL
  41129. "adcs r4, r4, %[r]\n\t"
  41130. #elif defined(__clang__)
  41131. "adcs r4, %[r]\n\t"
  41132. #else
  41133. "adc r4, %[r]\n\t"
  41134. #endif
  41135. "# A[11] * B[0]\n\t"
  41136. "mov %[a], r9\n\t"
  41137. "mov %[b], r10\n\t"
  41138. "ldr %[a], [%[a], #44]\n\t"
  41139. "ldr %[b], [%[b]]\n\t"
  41140. "uxth r6, %[a]\n\t"
  41141. "uxth r7, %[b]\n\t"
  41142. #ifdef WOLFSSL_KEIL
  41143. "muls r7, r6, r7\n\t"
  41144. #elif defined(__clang__)
  41145. "muls r7, r6\n\t"
  41146. #else
  41147. "mul r7, r6\n\t"
  41148. #endif
  41149. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41150. "adds r5, r5, r7\n\t"
  41151. #else
  41152. "add r5, r5, r7\n\t"
  41153. #endif
  41154. #ifdef WOLFSSL_KEIL
  41155. "adcs r3, r3, %[r]\n\t"
  41156. #elif defined(__clang__)
  41157. "adcs r3, %[r]\n\t"
  41158. #else
  41159. "adc r3, %[r]\n\t"
  41160. #endif
  41161. #ifdef WOLFSSL_KEIL
  41162. "adcs r4, r4, %[r]\n\t"
  41163. #elif defined(__clang__)
  41164. "adcs r4, %[r]\n\t"
  41165. #else
  41166. "adc r4, %[r]\n\t"
  41167. #endif
  41168. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41169. "lsrs r7, %[b], #16\n\t"
  41170. #else
  41171. "lsr r7, %[b], #16\n\t"
  41172. #endif
  41173. #ifdef WOLFSSL_KEIL
  41174. "muls r6, r7, r6\n\t"
  41175. #elif defined(__clang__)
  41176. "muls r6, r7\n\t"
  41177. #else
  41178. "mul r6, r7\n\t"
  41179. #endif
  41180. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41181. "lsrs r7, r6, #16\n\t"
  41182. #else
  41183. "lsr r7, r6, #16\n\t"
  41184. #endif
  41185. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41186. "lsls r6, r6, #16\n\t"
  41187. #else
  41188. "lsl r6, r6, #16\n\t"
  41189. #endif
  41190. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41191. "adds r5, r5, r6\n\t"
  41192. #else
  41193. "add r5, r5, r6\n\t"
  41194. #endif
  41195. #ifdef WOLFSSL_KEIL
  41196. "adcs r3, r3, r7\n\t"
  41197. #elif defined(__clang__)
  41198. "adcs r3, r7\n\t"
  41199. #else
  41200. "adc r3, r7\n\t"
  41201. #endif
  41202. #ifdef WOLFSSL_KEIL
  41203. "adcs r4, r4, %[r]\n\t"
  41204. #elif defined(__clang__)
  41205. "adcs r4, %[r]\n\t"
  41206. #else
  41207. "adc r4, %[r]\n\t"
  41208. #endif
  41209. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41210. "lsrs r6, %[a], #16\n\t"
  41211. #else
  41212. "lsr r6, %[a], #16\n\t"
  41213. #endif
  41214. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41215. "lsrs r7, %[b], #16\n\t"
  41216. #else
  41217. "lsr r7, %[b], #16\n\t"
  41218. #endif
  41219. #ifdef WOLFSSL_KEIL
  41220. "muls r7, r6, r7\n\t"
  41221. #elif defined(__clang__)
  41222. "muls r7, r6\n\t"
  41223. #else
  41224. "mul r7, r6\n\t"
  41225. #endif
  41226. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41227. "adds r3, r3, r7\n\t"
  41228. #else
  41229. "add r3, r3, r7\n\t"
  41230. #endif
  41231. #ifdef WOLFSSL_KEIL
  41232. "adcs r4, r4, %[r]\n\t"
  41233. #elif defined(__clang__)
  41234. "adcs r4, %[r]\n\t"
  41235. #else
  41236. "adc r4, %[r]\n\t"
  41237. #endif
  41238. "uxth r7, %[b]\n\t"
  41239. #ifdef WOLFSSL_KEIL
  41240. "muls r6, r7, r6\n\t"
  41241. #elif defined(__clang__)
  41242. "muls r6, r7\n\t"
  41243. #else
  41244. "mul r6, r7\n\t"
  41245. #endif
  41246. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41247. "lsrs r7, r6, #16\n\t"
  41248. #else
  41249. "lsr r7, r6, #16\n\t"
  41250. #endif
  41251. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41252. "lsls r6, r6, #16\n\t"
  41253. #else
  41254. "lsl r6, r6, #16\n\t"
  41255. #endif
  41256. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41257. "adds r5, r5, r6\n\t"
  41258. #else
  41259. "add r5, r5, r6\n\t"
  41260. #endif
  41261. #ifdef WOLFSSL_KEIL
  41262. "adcs r3, r3, r7\n\t"
  41263. #elif defined(__clang__)
  41264. "adcs r3, r7\n\t"
  41265. #else
  41266. "adc r3, r7\n\t"
  41267. #endif
  41268. #ifdef WOLFSSL_KEIL
  41269. "adcs r4, r4, %[r]\n\t"
  41270. #elif defined(__clang__)
  41271. "adcs r4, %[r]\n\t"
  41272. #else
  41273. "adc r4, %[r]\n\t"
  41274. #endif
  41275. "str r5, [sp, #44]\n\t"
  41276. "# A[11] * B[1]\n\t"
  41277. "movs r5, #0\n\t"
  41278. "mov %[a], r9\n\t"
  41279. "mov %[b], r10\n\t"
  41280. "ldr %[a], [%[a], #44]\n\t"
  41281. "ldr %[b], [%[b], #4]\n\t"
  41282. "uxth r6, %[a]\n\t"
  41283. "uxth r7, %[b]\n\t"
  41284. #ifdef WOLFSSL_KEIL
  41285. "muls r7, r6, r7\n\t"
  41286. #elif defined(__clang__)
  41287. "muls r7, r6\n\t"
  41288. #else
  41289. "mul r7, r6\n\t"
  41290. #endif
  41291. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41292. "adds r3, r3, r7\n\t"
  41293. #else
  41294. "add r3, r3, r7\n\t"
  41295. #endif
  41296. #ifdef WOLFSSL_KEIL
  41297. "adcs r4, r4, %[r]\n\t"
  41298. #elif defined(__clang__)
  41299. "adcs r4, %[r]\n\t"
  41300. #else
  41301. "adc r4, %[r]\n\t"
  41302. #endif
  41303. #ifdef WOLFSSL_KEIL
  41304. "adcs r5, r5, %[r]\n\t"
  41305. #elif defined(__clang__)
  41306. "adcs r5, %[r]\n\t"
  41307. #else
  41308. "adc r5, %[r]\n\t"
  41309. #endif
  41310. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41311. "lsrs r7, %[b], #16\n\t"
  41312. #else
  41313. "lsr r7, %[b], #16\n\t"
  41314. #endif
  41315. #ifdef WOLFSSL_KEIL
  41316. "muls r6, r7, r6\n\t"
  41317. #elif defined(__clang__)
  41318. "muls r6, r7\n\t"
  41319. #else
  41320. "mul r6, r7\n\t"
  41321. #endif
  41322. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41323. "lsrs r7, r6, #16\n\t"
  41324. #else
  41325. "lsr r7, r6, #16\n\t"
  41326. #endif
  41327. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41328. "lsls r6, r6, #16\n\t"
  41329. #else
  41330. "lsl r6, r6, #16\n\t"
  41331. #endif
  41332. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41333. "adds r3, r3, r6\n\t"
  41334. #else
  41335. "add r3, r3, r6\n\t"
  41336. #endif
  41337. #ifdef WOLFSSL_KEIL
  41338. "adcs r4, r4, r7\n\t"
  41339. #elif defined(__clang__)
  41340. "adcs r4, r7\n\t"
  41341. #else
  41342. "adc r4, r7\n\t"
  41343. #endif
  41344. #ifdef WOLFSSL_KEIL
  41345. "adcs r5, r5, %[r]\n\t"
  41346. #elif defined(__clang__)
  41347. "adcs r5, %[r]\n\t"
  41348. #else
  41349. "adc r5, %[r]\n\t"
  41350. #endif
  41351. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41352. "lsrs r6, %[a], #16\n\t"
  41353. #else
  41354. "lsr r6, %[a], #16\n\t"
  41355. #endif
  41356. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41357. "lsrs r7, %[b], #16\n\t"
  41358. #else
  41359. "lsr r7, %[b], #16\n\t"
  41360. #endif
  41361. #ifdef WOLFSSL_KEIL
  41362. "muls r7, r6, r7\n\t"
  41363. #elif defined(__clang__)
  41364. "muls r7, r6\n\t"
  41365. #else
  41366. "mul r7, r6\n\t"
  41367. #endif
  41368. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41369. "adds r4, r4, r7\n\t"
  41370. #else
  41371. "add r4, r4, r7\n\t"
  41372. #endif
  41373. #ifdef WOLFSSL_KEIL
  41374. "adcs r5, r5, %[r]\n\t"
  41375. #elif defined(__clang__)
  41376. "adcs r5, %[r]\n\t"
  41377. #else
  41378. "adc r5, %[r]\n\t"
  41379. #endif
  41380. "uxth r7, %[b]\n\t"
  41381. #ifdef WOLFSSL_KEIL
  41382. "muls r6, r7, r6\n\t"
  41383. #elif defined(__clang__)
  41384. "muls r6, r7\n\t"
  41385. #else
  41386. "mul r6, r7\n\t"
  41387. #endif
  41388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41389. "lsrs r7, r6, #16\n\t"
  41390. #else
  41391. "lsr r7, r6, #16\n\t"
  41392. #endif
  41393. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41394. "lsls r6, r6, #16\n\t"
  41395. #else
  41396. "lsl r6, r6, #16\n\t"
  41397. #endif
  41398. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41399. "adds r3, r3, r6\n\t"
  41400. #else
  41401. "add r3, r3, r6\n\t"
  41402. #endif
  41403. #ifdef WOLFSSL_KEIL
  41404. "adcs r4, r4, r7\n\t"
  41405. #elif defined(__clang__)
  41406. "adcs r4, r7\n\t"
  41407. #else
  41408. "adc r4, r7\n\t"
  41409. #endif
  41410. #ifdef WOLFSSL_KEIL
  41411. "adcs r5, r5, %[r]\n\t"
  41412. #elif defined(__clang__)
  41413. "adcs r5, %[r]\n\t"
  41414. #else
  41415. "adc r5, %[r]\n\t"
  41416. #endif
  41417. "# A[10] * B[2]\n\t"
  41418. "mov %[a], r9\n\t"
  41419. "mov %[b], r10\n\t"
  41420. "ldr %[a], [%[a], #40]\n\t"
  41421. "ldr %[b], [%[b], #8]\n\t"
  41422. "uxth r6, %[a]\n\t"
  41423. "uxth r7, %[b]\n\t"
  41424. #ifdef WOLFSSL_KEIL
  41425. "muls r7, r6, r7\n\t"
  41426. #elif defined(__clang__)
  41427. "muls r7, r6\n\t"
  41428. #else
  41429. "mul r7, r6\n\t"
  41430. #endif
  41431. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41432. "adds r3, r3, r7\n\t"
  41433. #else
  41434. "add r3, r3, r7\n\t"
  41435. #endif
  41436. #ifdef WOLFSSL_KEIL
  41437. "adcs r4, r4, %[r]\n\t"
  41438. #elif defined(__clang__)
  41439. "adcs r4, %[r]\n\t"
  41440. #else
  41441. "adc r4, %[r]\n\t"
  41442. #endif
  41443. #ifdef WOLFSSL_KEIL
  41444. "adcs r5, r5, %[r]\n\t"
  41445. #elif defined(__clang__)
  41446. "adcs r5, %[r]\n\t"
  41447. #else
  41448. "adc r5, %[r]\n\t"
  41449. #endif
  41450. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41451. "lsrs r7, %[b], #16\n\t"
  41452. #else
  41453. "lsr r7, %[b], #16\n\t"
  41454. #endif
  41455. #ifdef WOLFSSL_KEIL
  41456. "muls r6, r7, r6\n\t"
  41457. #elif defined(__clang__)
  41458. "muls r6, r7\n\t"
  41459. #else
  41460. "mul r6, r7\n\t"
  41461. #endif
  41462. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41463. "lsrs r7, r6, #16\n\t"
  41464. #else
  41465. "lsr r7, r6, #16\n\t"
  41466. #endif
  41467. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41468. "lsls r6, r6, #16\n\t"
  41469. #else
  41470. "lsl r6, r6, #16\n\t"
  41471. #endif
  41472. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41473. "adds r3, r3, r6\n\t"
  41474. #else
  41475. "add r3, r3, r6\n\t"
  41476. #endif
  41477. #ifdef WOLFSSL_KEIL
  41478. "adcs r4, r4, r7\n\t"
  41479. #elif defined(__clang__)
  41480. "adcs r4, r7\n\t"
  41481. #else
  41482. "adc r4, r7\n\t"
  41483. #endif
  41484. #ifdef WOLFSSL_KEIL
  41485. "adcs r5, r5, %[r]\n\t"
  41486. #elif defined(__clang__)
  41487. "adcs r5, %[r]\n\t"
  41488. #else
  41489. "adc r5, %[r]\n\t"
  41490. #endif
  41491. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41492. "lsrs r6, %[a], #16\n\t"
  41493. #else
  41494. "lsr r6, %[a], #16\n\t"
  41495. #endif
  41496. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41497. "lsrs r7, %[b], #16\n\t"
  41498. #else
  41499. "lsr r7, %[b], #16\n\t"
  41500. #endif
  41501. #ifdef WOLFSSL_KEIL
  41502. "muls r7, r6, r7\n\t"
  41503. #elif defined(__clang__)
  41504. "muls r7, r6\n\t"
  41505. #else
  41506. "mul r7, r6\n\t"
  41507. #endif
  41508. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41509. "adds r4, r4, r7\n\t"
  41510. #else
  41511. "add r4, r4, r7\n\t"
  41512. #endif
  41513. #ifdef WOLFSSL_KEIL
  41514. "adcs r5, r5, %[r]\n\t"
  41515. #elif defined(__clang__)
  41516. "adcs r5, %[r]\n\t"
  41517. #else
  41518. "adc r5, %[r]\n\t"
  41519. #endif
  41520. "uxth r7, %[b]\n\t"
  41521. #ifdef WOLFSSL_KEIL
  41522. "muls r6, r7, r6\n\t"
  41523. #elif defined(__clang__)
  41524. "muls r6, r7\n\t"
  41525. #else
  41526. "mul r6, r7\n\t"
  41527. #endif
  41528. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41529. "lsrs r7, r6, #16\n\t"
  41530. #else
  41531. "lsr r7, r6, #16\n\t"
  41532. #endif
  41533. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41534. "lsls r6, r6, #16\n\t"
  41535. #else
  41536. "lsl r6, r6, #16\n\t"
  41537. #endif
  41538. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41539. "adds r3, r3, r6\n\t"
  41540. #else
  41541. "add r3, r3, r6\n\t"
  41542. #endif
  41543. #ifdef WOLFSSL_KEIL
  41544. "adcs r4, r4, r7\n\t"
  41545. #elif defined(__clang__)
  41546. "adcs r4, r7\n\t"
  41547. #else
  41548. "adc r4, r7\n\t"
  41549. #endif
  41550. #ifdef WOLFSSL_KEIL
  41551. "adcs r5, r5, %[r]\n\t"
  41552. #elif defined(__clang__)
  41553. "adcs r5, %[r]\n\t"
  41554. #else
  41555. "adc r5, %[r]\n\t"
  41556. #endif
  41557. "# A[9] * B[3]\n\t"
  41558. "mov %[a], r9\n\t"
  41559. "mov %[b], r10\n\t"
  41560. "ldr %[a], [%[a], #36]\n\t"
  41561. "ldr %[b], [%[b], #12]\n\t"
  41562. "uxth r6, %[a]\n\t"
  41563. "uxth r7, %[b]\n\t"
  41564. #ifdef WOLFSSL_KEIL
  41565. "muls r7, r6, r7\n\t"
  41566. #elif defined(__clang__)
  41567. "muls r7, r6\n\t"
  41568. #else
  41569. "mul r7, r6\n\t"
  41570. #endif
  41571. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41572. "adds r3, r3, r7\n\t"
  41573. #else
  41574. "add r3, r3, r7\n\t"
  41575. #endif
  41576. #ifdef WOLFSSL_KEIL
  41577. "adcs r4, r4, %[r]\n\t"
  41578. #elif defined(__clang__)
  41579. "adcs r4, %[r]\n\t"
  41580. #else
  41581. "adc r4, %[r]\n\t"
  41582. #endif
  41583. #ifdef WOLFSSL_KEIL
  41584. "adcs r5, r5, %[r]\n\t"
  41585. #elif defined(__clang__)
  41586. "adcs r5, %[r]\n\t"
  41587. #else
  41588. "adc r5, %[r]\n\t"
  41589. #endif
  41590. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41591. "lsrs r7, %[b], #16\n\t"
  41592. #else
  41593. "lsr r7, %[b], #16\n\t"
  41594. #endif
  41595. #ifdef WOLFSSL_KEIL
  41596. "muls r6, r7, r6\n\t"
  41597. #elif defined(__clang__)
  41598. "muls r6, r7\n\t"
  41599. #else
  41600. "mul r6, r7\n\t"
  41601. #endif
  41602. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41603. "lsrs r7, r6, #16\n\t"
  41604. #else
  41605. "lsr r7, r6, #16\n\t"
  41606. #endif
  41607. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41608. "lsls r6, r6, #16\n\t"
  41609. #else
  41610. "lsl r6, r6, #16\n\t"
  41611. #endif
  41612. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41613. "adds r3, r3, r6\n\t"
  41614. #else
  41615. "add r3, r3, r6\n\t"
  41616. #endif
  41617. #ifdef WOLFSSL_KEIL
  41618. "adcs r4, r4, r7\n\t"
  41619. #elif defined(__clang__)
  41620. "adcs r4, r7\n\t"
  41621. #else
  41622. "adc r4, r7\n\t"
  41623. #endif
  41624. #ifdef WOLFSSL_KEIL
  41625. "adcs r5, r5, %[r]\n\t"
  41626. #elif defined(__clang__)
  41627. "adcs r5, %[r]\n\t"
  41628. #else
  41629. "adc r5, %[r]\n\t"
  41630. #endif
  41631. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41632. "lsrs r6, %[a], #16\n\t"
  41633. #else
  41634. "lsr r6, %[a], #16\n\t"
  41635. #endif
  41636. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41637. "lsrs r7, %[b], #16\n\t"
  41638. #else
  41639. "lsr r7, %[b], #16\n\t"
  41640. #endif
  41641. #ifdef WOLFSSL_KEIL
  41642. "muls r7, r6, r7\n\t"
  41643. #elif defined(__clang__)
  41644. "muls r7, r6\n\t"
  41645. #else
  41646. "mul r7, r6\n\t"
  41647. #endif
  41648. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41649. "adds r4, r4, r7\n\t"
  41650. #else
  41651. "add r4, r4, r7\n\t"
  41652. #endif
  41653. #ifdef WOLFSSL_KEIL
  41654. "adcs r5, r5, %[r]\n\t"
  41655. #elif defined(__clang__)
  41656. "adcs r5, %[r]\n\t"
  41657. #else
  41658. "adc r5, %[r]\n\t"
  41659. #endif
  41660. "uxth r7, %[b]\n\t"
  41661. #ifdef WOLFSSL_KEIL
  41662. "muls r6, r7, r6\n\t"
  41663. #elif defined(__clang__)
  41664. "muls r6, r7\n\t"
  41665. #else
  41666. "mul r6, r7\n\t"
  41667. #endif
  41668. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41669. "lsrs r7, r6, #16\n\t"
  41670. #else
  41671. "lsr r7, r6, #16\n\t"
  41672. #endif
  41673. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41674. "lsls r6, r6, #16\n\t"
  41675. #else
  41676. "lsl r6, r6, #16\n\t"
  41677. #endif
  41678. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41679. "adds r3, r3, r6\n\t"
  41680. #else
  41681. "add r3, r3, r6\n\t"
  41682. #endif
  41683. #ifdef WOLFSSL_KEIL
  41684. "adcs r4, r4, r7\n\t"
  41685. #elif defined(__clang__)
  41686. "adcs r4, r7\n\t"
  41687. #else
  41688. "adc r4, r7\n\t"
  41689. #endif
  41690. #ifdef WOLFSSL_KEIL
  41691. "adcs r5, r5, %[r]\n\t"
  41692. #elif defined(__clang__)
  41693. "adcs r5, %[r]\n\t"
  41694. #else
  41695. "adc r5, %[r]\n\t"
  41696. #endif
  41697. "# A[8] * B[4]\n\t"
  41698. "mov %[a], r9\n\t"
  41699. "mov %[b], r10\n\t"
  41700. "ldr %[a], [%[a], #32]\n\t"
  41701. "ldr %[b], [%[b], #16]\n\t"
  41702. "uxth r6, %[a]\n\t"
  41703. "uxth r7, %[b]\n\t"
  41704. #ifdef WOLFSSL_KEIL
  41705. "muls r7, r6, r7\n\t"
  41706. #elif defined(__clang__)
  41707. "muls r7, r6\n\t"
  41708. #else
  41709. "mul r7, r6\n\t"
  41710. #endif
  41711. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41712. "adds r3, r3, r7\n\t"
  41713. #else
  41714. "add r3, r3, r7\n\t"
  41715. #endif
  41716. #ifdef WOLFSSL_KEIL
  41717. "adcs r4, r4, %[r]\n\t"
  41718. #elif defined(__clang__)
  41719. "adcs r4, %[r]\n\t"
  41720. #else
  41721. "adc r4, %[r]\n\t"
  41722. #endif
  41723. #ifdef WOLFSSL_KEIL
  41724. "adcs r5, r5, %[r]\n\t"
  41725. #elif defined(__clang__)
  41726. "adcs r5, %[r]\n\t"
  41727. #else
  41728. "adc r5, %[r]\n\t"
  41729. #endif
  41730. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41731. "lsrs r7, %[b], #16\n\t"
  41732. #else
  41733. "lsr r7, %[b], #16\n\t"
  41734. #endif
  41735. #ifdef WOLFSSL_KEIL
  41736. "muls r6, r7, r6\n\t"
  41737. #elif defined(__clang__)
  41738. "muls r6, r7\n\t"
  41739. #else
  41740. "mul r6, r7\n\t"
  41741. #endif
  41742. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41743. "lsrs r7, r6, #16\n\t"
  41744. #else
  41745. "lsr r7, r6, #16\n\t"
  41746. #endif
  41747. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41748. "lsls r6, r6, #16\n\t"
  41749. #else
  41750. "lsl r6, r6, #16\n\t"
  41751. #endif
  41752. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41753. "adds r3, r3, r6\n\t"
  41754. #else
  41755. "add r3, r3, r6\n\t"
  41756. #endif
  41757. #ifdef WOLFSSL_KEIL
  41758. "adcs r4, r4, r7\n\t"
  41759. #elif defined(__clang__)
  41760. "adcs r4, r7\n\t"
  41761. #else
  41762. "adc r4, r7\n\t"
  41763. #endif
  41764. #ifdef WOLFSSL_KEIL
  41765. "adcs r5, r5, %[r]\n\t"
  41766. #elif defined(__clang__)
  41767. "adcs r5, %[r]\n\t"
  41768. #else
  41769. "adc r5, %[r]\n\t"
  41770. #endif
  41771. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41772. "lsrs r6, %[a], #16\n\t"
  41773. #else
  41774. "lsr r6, %[a], #16\n\t"
  41775. #endif
  41776. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41777. "lsrs r7, %[b], #16\n\t"
  41778. #else
  41779. "lsr r7, %[b], #16\n\t"
  41780. #endif
  41781. #ifdef WOLFSSL_KEIL
  41782. "muls r7, r6, r7\n\t"
  41783. #elif defined(__clang__)
  41784. "muls r7, r6\n\t"
  41785. #else
  41786. "mul r7, r6\n\t"
  41787. #endif
  41788. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41789. "adds r4, r4, r7\n\t"
  41790. #else
  41791. "add r4, r4, r7\n\t"
  41792. #endif
  41793. #ifdef WOLFSSL_KEIL
  41794. "adcs r5, r5, %[r]\n\t"
  41795. #elif defined(__clang__)
  41796. "adcs r5, %[r]\n\t"
  41797. #else
  41798. "adc r5, %[r]\n\t"
  41799. #endif
  41800. "uxth r7, %[b]\n\t"
  41801. #ifdef WOLFSSL_KEIL
  41802. "muls r6, r7, r6\n\t"
  41803. #elif defined(__clang__)
  41804. "muls r6, r7\n\t"
  41805. #else
  41806. "mul r6, r7\n\t"
  41807. #endif
  41808. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41809. "lsrs r7, r6, #16\n\t"
  41810. #else
  41811. "lsr r7, r6, #16\n\t"
  41812. #endif
  41813. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41814. "lsls r6, r6, #16\n\t"
  41815. #else
  41816. "lsl r6, r6, #16\n\t"
  41817. #endif
  41818. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41819. "adds r3, r3, r6\n\t"
  41820. #else
  41821. "add r3, r3, r6\n\t"
  41822. #endif
  41823. #ifdef WOLFSSL_KEIL
  41824. "adcs r4, r4, r7\n\t"
  41825. #elif defined(__clang__)
  41826. "adcs r4, r7\n\t"
  41827. #else
  41828. "adc r4, r7\n\t"
  41829. #endif
  41830. #ifdef WOLFSSL_KEIL
  41831. "adcs r5, r5, %[r]\n\t"
  41832. #elif defined(__clang__)
  41833. "adcs r5, %[r]\n\t"
  41834. #else
  41835. "adc r5, %[r]\n\t"
  41836. #endif
  41837. "# A[7] * B[5]\n\t"
  41838. "mov %[a], r9\n\t"
  41839. "mov %[b], r10\n\t"
  41840. "ldr %[a], [%[a], #28]\n\t"
  41841. "ldr %[b], [%[b], #20]\n\t"
  41842. "uxth r6, %[a]\n\t"
  41843. "uxth r7, %[b]\n\t"
  41844. #ifdef WOLFSSL_KEIL
  41845. "muls r7, r6, r7\n\t"
  41846. #elif defined(__clang__)
  41847. "muls r7, r6\n\t"
  41848. #else
  41849. "mul r7, r6\n\t"
  41850. #endif
  41851. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41852. "adds r3, r3, r7\n\t"
  41853. #else
  41854. "add r3, r3, r7\n\t"
  41855. #endif
  41856. #ifdef WOLFSSL_KEIL
  41857. "adcs r4, r4, %[r]\n\t"
  41858. #elif defined(__clang__)
  41859. "adcs r4, %[r]\n\t"
  41860. #else
  41861. "adc r4, %[r]\n\t"
  41862. #endif
  41863. #ifdef WOLFSSL_KEIL
  41864. "adcs r5, r5, %[r]\n\t"
  41865. #elif defined(__clang__)
  41866. "adcs r5, %[r]\n\t"
  41867. #else
  41868. "adc r5, %[r]\n\t"
  41869. #endif
  41870. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41871. "lsrs r7, %[b], #16\n\t"
  41872. #else
  41873. "lsr r7, %[b], #16\n\t"
  41874. #endif
  41875. #ifdef WOLFSSL_KEIL
  41876. "muls r6, r7, r6\n\t"
  41877. #elif defined(__clang__)
  41878. "muls r6, r7\n\t"
  41879. #else
  41880. "mul r6, r7\n\t"
  41881. #endif
  41882. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41883. "lsrs r7, r6, #16\n\t"
  41884. #else
  41885. "lsr r7, r6, #16\n\t"
  41886. #endif
  41887. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41888. "lsls r6, r6, #16\n\t"
  41889. #else
  41890. "lsl r6, r6, #16\n\t"
  41891. #endif
  41892. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41893. "adds r3, r3, r6\n\t"
  41894. #else
  41895. "add r3, r3, r6\n\t"
  41896. #endif
  41897. #ifdef WOLFSSL_KEIL
  41898. "adcs r4, r4, r7\n\t"
  41899. #elif defined(__clang__)
  41900. "adcs r4, r7\n\t"
  41901. #else
  41902. "adc r4, r7\n\t"
  41903. #endif
  41904. #ifdef WOLFSSL_KEIL
  41905. "adcs r5, r5, %[r]\n\t"
  41906. #elif defined(__clang__)
  41907. "adcs r5, %[r]\n\t"
  41908. #else
  41909. "adc r5, %[r]\n\t"
  41910. #endif
  41911. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41912. "lsrs r6, %[a], #16\n\t"
  41913. #else
  41914. "lsr r6, %[a], #16\n\t"
  41915. #endif
  41916. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41917. "lsrs r7, %[b], #16\n\t"
  41918. #else
  41919. "lsr r7, %[b], #16\n\t"
  41920. #endif
  41921. #ifdef WOLFSSL_KEIL
  41922. "muls r7, r6, r7\n\t"
  41923. #elif defined(__clang__)
  41924. "muls r7, r6\n\t"
  41925. #else
  41926. "mul r7, r6\n\t"
  41927. #endif
  41928. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41929. "adds r4, r4, r7\n\t"
  41930. #else
  41931. "add r4, r4, r7\n\t"
  41932. #endif
  41933. #ifdef WOLFSSL_KEIL
  41934. "adcs r5, r5, %[r]\n\t"
  41935. #elif defined(__clang__)
  41936. "adcs r5, %[r]\n\t"
  41937. #else
  41938. "adc r5, %[r]\n\t"
  41939. #endif
  41940. "uxth r7, %[b]\n\t"
  41941. #ifdef WOLFSSL_KEIL
  41942. "muls r6, r7, r6\n\t"
  41943. #elif defined(__clang__)
  41944. "muls r6, r7\n\t"
  41945. #else
  41946. "mul r6, r7\n\t"
  41947. #endif
  41948. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41949. "lsrs r7, r6, #16\n\t"
  41950. #else
  41951. "lsr r7, r6, #16\n\t"
  41952. #endif
  41953. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41954. "lsls r6, r6, #16\n\t"
  41955. #else
  41956. "lsl r6, r6, #16\n\t"
  41957. #endif
  41958. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41959. "adds r3, r3, r6\n\t"
  41960. #else
  41961. "add r3, r3, r6\n\t"
  41962. #endif
  41963. #ifdef WOLFSSL_KEIL
  41964. "adcs r4, r4, r7\n\t"
  41965. #elif defined(__clang__)
  41966. "adcs r4, r7\n\t"
  41967. #else
  41968. "adc r4, r7\n\t"
  41969. #endif
  41970. #ifdef WOLFSSL_KEIL
  41971. "adcs r5, r5, %[r]\n\t"
  41972. #elif defined(__clang__)
  41973. "adcs r5, %[r]\n\t"
  41974. #else
  41975. "adc r5, %[r]\n\t"
  41976. #endif
  41977. "# A[6] * B[6]\n\t"
  41978. "mov %[a], r9\n\t"
  41979. "mov %[b], r10\n\t"
  41980. "ldr %[a], [%[a], #24]\n\t"
  41981. "ldr %[b], [%[b], #24]\n\t"
  41982. "uxth r6, %[a]\n\t"
  41983. "uxth r7, %[b]\n\t"
  41984. #ifdef WOLFSSL_KEIL
  41985. "muls r7, r6, r7\n\t"
  41986. #elif defined(__clang__)
  41987. "muls r7, r6\n\t"
  41988. #else
  41989. "mul r7, r6\n\t"
  41990. #endif
  41991. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41992. "adds r3, r3, r7\n\t"
  41993. #else
  41994. "add r3, r3, r7\n\t"
  41995. #endif
  41996. #ifdef WOLFSSL_KEIL
  41997. "adcs r4, r4, %[r]\n\t"
  41998. #elif defined(__clang__)
  41999. "adcs r4, %[r]\n\t"
  42000. #else
  42001. "adc r4, %[r]\n\t"
  42002. #endif
  42003. #ifdef WOLFSSL_KEIL
  42004. "adcs r5, r5, %[r]\n\t"
  42005. #elif defined(__clang__)
  42006. "adcs r5, %[r]\n\t"
  42007. #else
  42008. "adc r5, %[r]\n\t"
  42009. #endif
  42010. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42011. "lsrs r7, %[b], #16\n\t"
  42012. #else
  42013. "lsr r7, %[b], #16\n\t"
  42014. #endif
  42015. #ifdef WOLFSSL_KEIL
  42016. "muls r6, r7, r6\n\t"
  42017. #elif defined(__clang__)
  42018. "muls r6, r7\n\t"
  42019. #else
  42020. "mul r6, r7\n\t"
  42021. #endif
  42022. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42023. "lsrs r7, r6, #16\n\t"
  42024. #else
  42025. "lsr r7, r6, #16\n\t"
  42026. #endif
  42027. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42028. "lsls r6, r6, #16\n\t"
  42029. #else
  42030. "lsl r6, r6, #16\n\t"
  42031. #endif
  42032. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42033. "adds r3, r3, r6\n\t"
  42034. #else
  42035. "add r3, r3, r6\n\t"
  42036. #endif
  42037. #ifdef WOLFSSL_KEIL
  42038. "adcs r4, r4, r7\n\t"
  42039. #elif defined(__clang__)
  42040. "adcs r4, r7\n\t"
  42041. #else
  42042. "adc r4, r7\n\t"
  42043. #endif
  42044. #ifdef WOLFSSL_KEIL
  42045. "adcs r5, r5, %[r]\n\t"
  42046. #elif defined(__clang__)
  42047. "adcs r5, %[r]\n\t"
  42048. #else
  42049. "adc r5, %[r]\n\t"
  42050. #endif
  42051. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42052. "lsrs r6, %[a], #16\n\t"
  42053. #else
  42054. "lsr r6, %[a], #16\n\t"
  42055. #endif
  42056. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42057. "lsrs r7, %[b], #16\n\t"
  42058. #else
  42059. "lsr r7, %[b], #16\n\t"
  42060. #endif
  42061. #ifdef WOLFSSL_KEIL
  42062. "muls r7, r6, r7\n\t"
  42063. #elif defined(__clang__)
  42064. "muls r7, r6\n\t"
  42065. #else
  42066. "mul r7, r6\n\t"
  42067. #endif
  42068. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42069. "adds r4, r4, r7\n\t"
  42070. #else
  42071. "add r4, r4, r7\n\t"
  42072. #endif
  42073. #ifdef WOLFSSL_KEIL
  42074. "adcs r5, r5, %[r]\n\t"
  42075. #elif defined(__clang__)
  42076. "adcs r5, %[r]\n\t"
  42077. #else
  42078. "adc r5, %[r]\n\t"
  42079. #endif
  42080. "uxth r7, %[b]\n\t"
  42081. #ifdef WOLFSSL_KEIL
  42082. "muls r6, r7, r6\n\t"
  42083. #elif defined(__clang__)
  42084. "muls r6, r7\n\t"
  42085. #else
  42086. "mul r6, r7\n\t"
  42087. #endif
  42088. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42089. "lsrs r7, r6, #16\n\t"
  42090. #else
  42091. "lsr r7, r6, #16\n\t"
  42092. #endif
  42093. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42094. "lsls r6, r6, #16\n\t"
  42095. #else
  42096. "lsl r6, r6, #16\n\t"
  42097. #endif
  42098. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42099. "adds r3, r3, r6\n\t"
  42100. #else
  42101. "add r3, r3, r6\n\t"
  42102. #endif
  42103. #ifdef WOLFSSL_KEIL
  42104. "adcs r4, r4, r7\n\t"
  42105. #elif defined(__clang__)
  42106. "adcs r4, r7\n\t"
  42107. #else
  42108. "adc r4, r7\n\t"
  42109. #endif
  42110. #ifdef WOLFSSL_KEIL
  42111. "adcs r5, r5, %[r]\n\t"
  42112. #elif defined(__clang__)
  42113. "adcs r5, %[r]\n\t"
  42114. #else
  42115. "adc r5, %[r]\n\t"
  42116. #endif
  42117. "# A[5] * B[7]\n\t"
  42118. "mov %[a], r9\n\t"
  42119. "mov %[b], r10\n\t"
  42120. "ldr %[a], [%[a], #20]\n\t"
  42121. "ldr %[b], [%[b], #28]\n\t"
  42122. "uxth r6, %[a]\n\t"
  42123. "uxth r7, %[b]\n\t"
  42124. #ifdef WOLFSSL_KEIL
  42125. "muls r7, r6, r7\n\t"
  42126. #elif defined(__clang__)
  42127. "muls r7, r6\n\t"
  42128. #else
  42129. "mul r7, r6\n\t"
  42130. #endif
  42131. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42132. "adds r3, r3, r7\n\t"
  42133. #else
  42134. "add r3, r3, r7\n\t"
  42135. #endif
  42136. #ifdef WOLFSSL_KEIL
  42137. "adcs r4, r4, %[r]\n\t"
  42138. #elif defined(__clang__)
  42139. "adcs r4, %[r]\n\t"
  42140. #else
  42141. "adc r4, %[r]\n\t"
  42142. #endif
  42143. #ifdef WOLFSSL_KEIL
  42144. "adcs r5, r5, %[r]\n\t"
  42145. #elif defined(__clang__)
  42146. "adcs r5, %[r]\n\t"
  42147. #else
  42148. "adc r5, %[r]\n\t"
  42149. #endif
  42150. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42151. "lsrs r7, %[b], #16\n\t"
  42152. #else
  42153. "lsr r7, %[b], #16\n\t"
  42154. #endif
  42155. #ifdef WOLFSSL_KEIL
  42156. "muls r6, r7, r6\n\t"
  42157. #elif defined(__clang__)
  42158. "muls r6, r7\n\t"
  42159. #else
  42160. "mul r6, r7\n\t"
  42161. #endif
  42162. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42163. "lsrs r7, r6, #16\n\t"
  42164. #else
  42165. "lsr r7, r6, #16\n\t"
  42166. #endif
  42167. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42168. "lsls r6, r6, #16\n\t"
  42169. #else
  42170. "lsl r6, r6, #16\n\t"
  42171. #endif
  42172. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42173. "adds r3, r3, r6\n\t"
  42174. #else
  42175. "add r3, r3, r6\n\t"
  42176. #endif
  42177. #ifdef WOLFSSL_KEIL
  42178. "adcs r4, r4, r7\n\t"
  42179. #elif defined(__clang__)
  42180. "adcs r4, r7\n\t"
  42181. #else
  42182. "adc r4, r7\n\t"
  42183. #endif
  42184. #ifdef WOLFSSL_KEIL
  42185. "adcs r5, r5, %[r]\n\t"
  42186. #elif defined(__clang__)
  42187. "adcs r5, %[r]\n\t"
  42188. #else
  42189. "adc r5, %[r]\n\t"
  42190. #endif
  42191. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42192. "lsrs r6, %[a], #16\n\t"
  42193. #else
  42194. "lsr r6, %[a], #16\n\t"
  42195. #endif
  42196. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42197. "lsrs r7, %[b], #16\n\t"
  42198. #else
  42199. "lsr r7, %[b], #16\n\t"
  42200. #endif
  42201. #ifdef WOLFSSL_KEIL
  42202. "muls r7, r6, r7\n\t"
  42203. #elif defined(__clang__)
  42204. "muls r7, r6\n\t"
  42205. #else
  42206. "mul r7, r6\n\t"
  42207. #endif
  42208. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42209. "adds r4, r4, r7\n\t"
  42210. #else
  42211. "add r4, r4, r7\n\t"
  42212. #endif
  42213. #ifdef WOLFSSL_KEIL
  42214. "adcs r5, r5, %[r]\n\t"
  42215. #elif defined(__clang__)
  42216. "adcs r5, %[r]\n\t"
  42217. #else
  42218. "adc r5, %[r]\n\t"
  42219. #endif
  42220. "uxth r7, %[b]\n\t"
  42221. #ifdef WOLFSSL_KEIL
  42222. "muls r6, r7, r6\n\t"
  42223. #elif defined(__clang__)
  42224. "muls r6, r7\n\t"
  42225. #else
  42226. "mul r6, r7\n\t"
  42227. #endif
  42228. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42229. "lsrs r7, r6, #16\n\t"
  42230. #else
  42231. "lsr r7, r6, #16\n\t"
  42232. #endif
  42233. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42234. "lsls r6, r6, #16\n\t"
  42235. #else
  42236. "lsl r6, r6, #16\n\t"
  42237. #endif
  42238. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42239. "adds r3, r3, r6\n\t"
  42240. #else
  42241. "add r3, r3, r6\n\t"
  42242. #endif
  42243. #ifdef WOLFSSL_KEIL
  42244. "adcs r4, r4, r7\n\t"
  42245. #elif defined(__clang__)
  42246. "adcs r4, r7\n\t"
  42247. #else
  42248. "adc r4, r7\n\t"
  42249. #endif
  42250. #ifdef WOLFSSL_KEIL
  42251. "adcs r5, r5, %[r]\n\t"
  42252. #elif defined(__clang__)
  42253. "adcs r5, %[r]\n\t"
  42254. #else
  42255. "adc r5, %[r]\n\t"
  42256. #endif
  42257. "# A[4] * B[8]\n\t"
  42258. "mov %[a], r9\n\t"
  42259. "mov %[b], r10\n\t"
  42260. "ldr %[a], [%[a], #16]\n\t"
  42261. "ldr %[b], [%[b], #32]\n\t"
  42262. "uxth r6, %[a]\n\t"
  42263. "uxth r7, %[b]\n\t"
  42264. #ifdef WOLFSSL_KEIL
  42265. "muls r7, r6, r7\n\t"
  42266. #elif defined(__clang__)
  42267. "muls r7, r6\n\t"
  42268. #else
  42269. "mul r7, r6\n\t"
  42270. #endif
  42271. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42272. "adds r3, r3, r7\n\t"
  42273. #else
  42274. "add r3, r3, r7\n\t"
  42275. #endif
  42276. #ifdef WOLFSSL_KEIL
  42277. "adcs r4, r4, %[r]\n\t"
  42278. #elif defined(__clang__)
  42279. "adcs r4, %[r]\n\t"
  42280. #else
  42281. "adc r4, %[r]\n\t"
  42282. #endif
  42283. #ifdef WOLFSSL_KEIL
  42284. "adcs r5, r5, %[r]\n\t"
  42285. #elif defined(__clang__)
  42286. "adcs r5, %[r]\n\t"
  42287. #else
  42288. "adc r5, %[r]\n\t"
  42289. #endif
  42290. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42291. "lsrs r7, %[b], #16\n\t"
  42292. #else
  42293. "lsr r7, %[b], #16\n\t"
  42294. #endif
  42295. #ifdef WOLFSSL_KEIL
  42296. "muls r6, r7, r6\n\t"
  42297. #elif defined(__clang__)
  42298. "muls r6, r7\n\t"
  42299. #else
  42300. "mul r6, r7\n\t"
  42301. #endif
  42302. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42303. "lsrs r7, r6, #16\n\t"
  42304. #else
  42305. "lsr r7, r6, #16\n\t"
  42306. #endif
  42307. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42308. "lsls r6, r6, #16\n\t"
  42309. #else
  42310. "lsl r6, r6, #16\n\t"
  42311. #endif
  42312. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42313. "adds r3, r3, r6\n\t"
  42314. #else
  42315. "add r3, r3, r6\n\t"
  42316. #endif
  42317. #ifdef WOLFSSL_KEIL
  42318. "adcs r4, r4, r7\n\t"
  42319. #elif defined(__clang__)
  42320. "adcs r4, r7\n\t"
  42321. #else
  42322. "adc r4, r7\n\t"
  42323. #endif
  42324. #ifdef WOLFSSL_KEIL
  42325. "adcs r5, r5, %[r]\n\t"
  42326. #elif defined(__clang__)
  42327. "adcs r5, %[r]\n\t"
  42328. #else
  42329. "adc r5, %[r]\n\t"
  42330. #endif
  42331. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42332. "lsrs r6, %[a], #16\n\t"
  42333. #else
  42334. "lsr r6, %[a], #16\n\t"
  42335. #endif
  42336. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42337. "lsrs r7, %[b], #16\n\t"
  42338. #else
  42339. "lsr r7, %[b], #16\n\t"
  42340. #endif
  42341. #ifdef WOLFSSL_KEIL
  42342. "muls r7, r6, r7\n\t"
  42343. #elif defined(__clang__)
  42344. "muls r7, r6\n\t"
  42345. #else
  42346. "mul r7, r6\n\t"
  42347. #endif
  42348. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42349. "adds r4, r4, r7\n\t"
  42350. #else
  42351. "add r4, r4, r7\n\t"
  42352. #endif
  42353. #ifdef WOLFSSL_KEIL
  42354. "adcs r5, r5, %[r]\n\t"
  42355. #elif defined(__clang__)
  42356. "adcs r5, %[r]\n\t"
  42357. #else
  42358. "adc r5, %[r]\n\t"
  42359. #endif
  42360. "uxth r7, %[b]\n\t"
  42361. #ifdef WOLFSSL_KEIL
  42362. "muls r6, r7, r6\n\t"
  42363. #elif defined(__clang__)
  42364. "muls r6, r7\n\t"
  42365. #else
  42366. "mul r6, r7\n\t"
  42367. #endif
  42368. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42369. "lsrs r7, r6, #16\n\t"
  42370. #else
  42371. "lsr r7, r6, #16\n\t"
  42372. #endif
  42373. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42374. "lsls r6, r6, #16\n\t"
  42375. #else
  42376. "lsl r6, r6, #16\n\t"
  42377. #endif
  42378. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42379. "adds r3, r3, r6\n\t"
  42380. #else
  42381. "add r3, r3, r6\n\t"
  42382. #endif
  42383. #ifdef WOLFSSL_KEIL
  42384. "adcs r4, r4, r7\n\t"
  42385. #elif defined(__clang__)
  42386. "adcs r4, r7\n\t"
  42387. #else
  42388. "adc r4, r7\n\t"
  42389. #endif
  42390. #ifdef WOLFSSL_KEIL
  42391. "adcs r5, r5, %[r]\n\t"
  42392. #elif defined(__clang__)
  42393. "adcs r5, %[r]\n\t"
  42394. #else
  42395. "adc r5, %[r]\n\t"
  42396. #endif
  42397. "# A[3] * B[9]\n\t"
  42398. "mov %[a], r9\n\t"
  42399. "mov %[b], r10\n\t"
  42400. "ldr %[a], [%[a], #12]\n\t"
  42401. "ldr %[b], [%[b], #36]\n\t"
  42402. "uxth r6, %[a]\n\t"
  42403. "uxth r7, %[b]\n\t"
  42404. #ifdef WOLFSSL_KEIL
  42405. "muls r7, r6, r7\n\t"
  42406. #elif defined(__clang__)
  42407. "muls r7, r6\n\t"
  42408. #else
  42409. "mul r7, r6\n\t"
  42410. #endif
  42411. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42412. "adds r3, r3, r7\n\t"
  42413. #else
  42414. "add r3, r3, r7\n\t"
  42415. #endif
  42416. #ifdef WOLFSSL_KEIL
  42417. "adcs r4, r4, %[r]\n\t"
  42418. #elif defined(__clang__)
  42419. "adcs r4, %[r]\n\t"
  42420. #else
  42421. "adc r4, %[r]\n\t"
  42422. #endif
  42423. #ifdef WOLFSSL_KEIL
  42424. "adcs r5, r5, %[r]\n\t"
  42425. #elif defined(__clang__)
  42426. "adcs r5, %[r]\n\t"
  42427. #else
  42428. "adc r5, %[r]\n\t"
  42429. #endif
  42430. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42431. "lsrs r7, %[b], #16\n\t"
  42432. #else
  42433. "lsr r7, %[b], #16\n\t"
  42434. #endif
  42435. #ifdef WOLFSSL_KEIL
  42436. "muls r6, r7, r6\n\t"
  42437. #elif defined(__clang__)
  42438. "muls r6, r7\n\t"
  42439. #else
  42440. "mul r6, r7\n\t"
  42441. #endif
  42442. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42443. "lsrs r7, r6, #16\n\t"
  42444. #else
  42445. "lsr r7, r6, #16\n\t"
  42446. #endif
  42447. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42448. "lsls r6, r6, #16\n\t"
  42449. #else
  42450. "lsl r6, r6, #16\n\t"
  42451. #endif
  42452. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42453. "adds r3, r3, r6\n\t"
  42454. #else
  42455. "add r3, r3, r6\n\t"
  42456. #endif
  42457. #ifdef WOLFSSL_KEIL
  42458. "adcs r4, r4, r7\n\t"
  42459. #elif defined(__clang__)
  42460. "adcs r4, r7\n\t"
  42461. #else
  42462. "adc r4, r7\n\t"
  42463. #endif
  42464. #ifdef WOLFSSL_KEIL
  42465. "adcs r5, r5, %[r]\n\t"
  42466. #elif defined(__clang__)
  42467. "adcs r5, %[r]\n\t"
  42468. #else
  42469. "adc r5, %[r]\n\t"
  42470. #endif
  42471. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42472. "lsrs r6, %[a], #16\n\t"
  42473. #else
  42474. "lsr r6, %[a], #16\n\t"
  42475. #endif
  42476. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42477. "lsrs r7, %[b], #16\n\t"
  42478. #else
  42479. "lsr r7, %[b], #16\n\t"
  42480. #endif
  42481. #ifdef WOLFSSL_KEIL
  42482. "muls r7, r6, r7\n\t"
  42483. #elif defined(__clang__)
  42484. "muls r7, r6\n\t"
  42485. #else
  42486. "mul r7, r6\n\t"
  42487. #endif
  42488. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42489. "adds r4, r4, r7\n\t"
  42490. #else
  42491. "add r4, r4, r7\n\t"
  42492. #endif
  42493. #ifdef WOLFSSL_KEIL
  42494. "adcs r5, r5, %[r]\n\t"
  42495. #elif defined(__clang__)
  42496. "adcs r5, %[r]\n\t"
  42497. #else
  42498. "adc r5, %[r]\n\t"
  42499. #endif
  42500. "uxth r7, %[b]\n\t"
  42501. #ifdef WOLFSSL_KEIL
  42502. "muls r6, r7, r6\n\t"
  42503. #elif defined(__clang__)
  42504. "muls r6, r7\n\t"
  42505. #else
  42506. "mul r6, r7\n\t"
  42507. #endif
  42508. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42509. "lsrs r7, r6, #16\n\t"
  42510. #else
  42511. "lsr r7, r6, #16\n\t"
  42512. #endif
  42513. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42514. "lsls r6, r6, #16\n\t"
  42515. #else
  42516. "lsl r6, r6, #16\n\t"
  42517. #endif
  42518. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42519. "adds r3, r3, r6\n\t"
  42520. #else
  42521. "add r3, r3, r6\n\t"
  42522. #endif
  42523. #ifdef WOLFSSL_KEIL
  42524. "adcs r4, r4, r7\n\t"
  42525. #elif defined(__clang__)
  42526. "adcs r4, r7\n\t"
  42527. #else
  42528. "adc r4, r7\n\t"
  42529. #endif
  42530. #ifdef WOLFSSL_KEIL
  42531. "adcs r5, r5, %[r]\n\t"
  42532. #elif defined(__clang__)
  42533. "adcs r5, %[r]\n\t"
  42534. #else
  42535. "adc r5, %[r]\n\t"
  42536. #endif
  42537. "# A[2] * B[10]\n\t"
  42538. "mov %[a], r9\n\t"
  42539. "mov %[b], r10\n\t"
  42540. "ldr %[a], [%[a], #8]\n\t"
  42541. "ldr %[b], [%[b], #40]\n\t"
  42542. "uxth r6, %[a]\n\t"
  42543. "uxth r7, %[b]\n\t"
  42544. #ifdef WOLFSSL_KEIL
  42545. "muls r7, r6, r7\n\t"
  42546. #elif defined(__clang__)
  42547. "muls r7, r6\n\t"
  42548. #else
  42549. "mul r7, r6\n\t"
  42550. #endif
  42551. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42552. "adds r3, r3, r7\n\t"
  42553. #else
  42554. "add r3, r3, r7\n\t"
  42555. #endif
  42556. #ifdef WOLFSSL_KEIL
  42557. "adcs r4, r4, %[r]\n\t"
  42558. #elif defined(__clang__)
  42559. "adcs r4, %[r]\n\t"
  42560. #else
  42561. "adc r4, %[r]\n\t"
  42562. #endif
  42563. #ifdef WOLFSSL_KEIL
  42564. "adcs r5, r5, %[r]\n\t"
  42565. #elif defined(__clang__)
  42566. "adcs r5, %[r]\n\t"
  42567. #else
  42568. "adc r5, %[r]\n\t"
  42569. #endif
  42570. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42571. "lsrs r7, %[b], #16\n\t"
  42572. #else
  42573. "lsr r7, %[b], #16\n\t"
  42574. #endif
  42575. #ifdef WOLFSSL_KEIL
  42576. "muls r6, r7, r6\n\t"
  42577. #elif defined(__clang__)
  42578. "muls r6, r7\n\t"
  42579. #else
  42580. "mul r6, r7\n\t"
  42581. #endif
  42582. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42583. "lsrs r7, r6, #16\n\t"
  42584. #else
  42585. "lsr r7, r6, #16\n\t"
  42586. #endif
  42587. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42588. "lsls r6, r6, #16\n\t"
  42589. #else
  42590. "lsl r6, r6, #16\n\t"
  42591. #endif
  42592. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42593. "adds r3, r3, r6\n\t"
  42594. #else
  42595. "add r3, r3, r6\n\t"
  42596. #endif
  42597. #ifdef WOLFSSL_KEIL
  42598. "adcs r4, r4, r7\n\t"
  42599. #elif defined(__clang__)
  42600. "adcs r4, r7\n\t"
  42601. #else
  42602. "adc r4, r7\n\t"
  42603. #endif
  42604. #ifdef WOLFSSL_KEIL
  42605. "adcs r5, r5, %[r]\n\t"
  42606. #elif defined(__clang__)
  42607. "adcs r5, %[r]\n\t"
  42608. #else
  42609. "adc r5, %[r]\n\t"
  42610. #endif
  42611. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42612. "lsrs r6, %[a], #16\n\t"
  42613. #else
  42614. "lsr r6, %[a], #16\n\t"
  42615. #endif
  42616. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42617. "lsrs r7, %[b], #16\n\t"
  42618. #else
  42619. "lsr r7, %[b], #16\n\t"
  42620. #endif
  42621. #ifdef WOLFSSL_KEIL
  42622. "muls r7, r6, r7\n\t"
  42623. #elif defined(__clang__)
  42624. "muls r7, r6\n\t"
  42625. #else
  42626. "mul r7, r6\n\t"
  42627. #endif
  42628. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42629. "adds r4, r4, r7\n\t"
  42630. #else
  42631. "add r4, r4, r7\n\t"
  42632. #endif
  42633. #ifdef WOLFSSL_KEIL
  42634. "adcs r5, r5, %[r]\n\t"
  42635. #elif defined(__clang__)
  42636. "adcs r5, %[r]\n\t"
  42637. #else
  42638. "adc r5, %[r]\n\t"
  42639. #endif
  42640. "uxth r7, %[b]\n\t"
  42641. #ifdef WOLFSSL_KEIL
  42642. "muls r6, r7, r6\n\t"
  42643. #elif defined(__clang__)
  42644. "muls r6, r7\n\t"
  42645. #else
  42646. "mul r6, r7\n\t"
  42647. #endif
  42648. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42649. "lsrs r7, r6, #16\n\t"
  42650. #else
  42651. "lsr r7, r6, #16\n\t"
  42652. #endif
  42653. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42654. "lsls r6, r6, #16\n\t"
  42655. #else
  42656. "lsl r6, r6, #16\n\t"
  42657. #endif
  42658. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42659. "adds r3, r3, r6\n\t"
  42660. #else
  42661. "add r3, r3, r6\n\t"
  42662. #endif
  42663. #ifdef WOLFSSL_KEIL
  42664. "adcs r4, r4, r7\n\t"
  42665. #elif defined(__clang__)
  42666. "adcs r4, r7\n\t"
  42667. #else
  42668. "adc r4, r7\n\t"
  42669. #endif
  42670. #ifdef WOLFSSL_KEIL
  42671. "adcs r5, r5, %[r]\n\t"
  42672. #elif defined(__clang__)
  42673. "adcs r5, %[r]\n\t"
  42674. #else
  42675. "adc r5, %[r]\n\t"
  42676. #endif
  42677. "# A[1] * B[11]\n\t"
  42678. "mov %[a], r9\n\t"
  42679. "mov %[b], r10\n\t"
  42680. "ldr %[a], [%[a], #4]\n\t"
  42681. "ldr %[b], [%[b], #44]\n\t"
  42682. "uxth r6, %[a]\n\t"
  42683. "uxth r7, %[b]\n\t"
  42684. #ifdef WOLFSSL_KEIL
  42685. "muls r7, r6, r7\n\t"
  42686. #elif defined(__clang__)
  42687. "muls r7, r6\n\t"
  42688. #else
  42689. "mul r7, r6\n\t"
  42690. #endif
  42691. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42692. "adds r3, r3, r7\n\t"
  42693. #else
  42694. "add r3, r3, r7\n\t"
  42695. #endif
  42696. #ifdef WOLFSSL_KEIL
  42697. "adcs r4, r4, %[r]\n\t"
  42698. #elif defined(__clang__)
  42699. "adcs r4, %[r]\n\t"
  42700. #else
  42701. "adc r4, %[r]\n\t"
  42702. #endif
  42703. #ifdef WOLFSSL_KEIL
  42704. "adcs r5, r5, %[r]\n\t"
  42705. #elif defined(__clang__)
  42706. "adcs r5, %[r]\n\t"
  42707. #else
  42708. "adc r5, %[r]\n\t"
  42709. #endif
  42710. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42711. "lsrs r7, %[b], #16\n\t"
  42712. #else
  42713. "lsr r7, %[b], #16\n\t"
  42714. #endif
  42715. #ifdef WOLFSSL_KEIL
  42716. "muls r6, r7, r6\n\t"
  42717. #elif defined(__clang__)
  42718. "muls r6, r7\n\t"
  42719. #else
  42720. "mul r6, r7\n\t"
  42721. #endif
  42722. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42723. "lsrs r7, r6, #16\n\t"
  42724. #else
  42725. "lsr r7, r6, #16\n\t"
  42726. #endif
  42727. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42728. "lsls r6, r6, #16\n\t"
  42729. #else
  42730. "lsl r6, r6, #16\n\t"
  42731. #endif
  42732. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42733. "adds r3, r3, r6\n\t"
  42734. #else
  42735. "add r3, r3, r6\n\t"
  42736. #endif
  42737. #ifdef WOLFSSL_KEIL
  42738. "adcs r4, r4, r7\n\t"
  42739. #elif defined(__clang__)
  42740. "adcs r4, r7\n\t"
  42741. #else
  42742. "adc r4, r7\n\t"
  42743. #endif
  42744. #ifdef WOLFSSL_KEIL
  42745. "adcs r5, r5, %[r]\n\t"
  42746. #elif defined(__clang__)
  42747. "adcs r5, %[r]\n\t"
  42748. #else
  42749. "adc r5, %[r]\n\t"
  42750. #endif
  42751. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42752. "lsrs r6, %[a], #16\n\t"
  42753. #else
  42754. "lsr r6, %[a], #16\n\t"
  42755. #endif
  42756. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42757. "lsrs r7, %[b], #16\n\t"
  42758. #else
  42759. "lsr r7, %[b], #16\n\t"
  42760. #endif
  42761. #ifdef WOLFSSL_KEIL
  42762. "muls r7, r6, r7\n\t"
  42763. #elif defined(__clang__)
  42764. "muls r7, r6\n\t"
  42765. #else
  42766. "mul r7, r6\n\t"
  42767. #endif
  42768. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42769. "adds r4, r4, r7\n\t"
  42770. #else
  42771. "add r4, r4, r7\n\t"
  42772. #endif
  42773. #ifdef WOLFSSL_KEIL
  42774. "adcs r5, r5, %[r]\n\t"
  42775. #elif defined(__clang__)
  42776. "adcs r5, %[r]\n\t"
  42777. #else
  42778. "adc r5, %[r]\n\t"
  42779. #endif
  42780. "uxth r7, %[b]\n\t"
  42781. #ifdef WOLFSSL_KEIL
  42782. "muls r6, r7, r6\n\t"
  42783. #elif defined(__clang__)
  42784. "muls r6, r7\n\t"
  42785. #else
  42786. "mul r6, r7\n\t"
  42787. #endif
  42788. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42789. "lsrs r7, r6, #16\n\t"
  42790. #else
  42791. "lsr r7, r6, #16\n\t"
  42792. #endif
  42793. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42794. "lsls r6, r6, #16\n\t"
  42795. #else
  42796. "lsl r6, r6, #16\n\t"
  42797. #endif
  42798. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42799. "adds r3, r3, r6\n\t"
  42800. #else
  42801. "add r3, r3, r6\n\t"
  42802. #endif
  42803. #ifdef WOLFSSL_KEIL
  42804. "adcs r4, r4, r7\n\t"
  42805. #elif defined(__clang__)
  42806. "adcs r4, r7\n\t"
  42807. #else
  42808. "adc r4, r7\n\t"
  42809. #endif
  42810. #ifdef WOLFSSL_KEIL
  42811. "adcs r5, r5, %[r]\n\t"
  42812. #elif defined(__clang__)
  42813. "adcs r5, %[r]\n\t"
  42814. #else
  42815. "adc r5, %[r]\n\t"
  42816. #endif
  42817. "mov %[r], r8\n\t"
  42818. "str r3, [%[r], #48]\n\t"
  42819. "movs %[r], #0\n\t"
  42820. "# A[2] * B[11]\n\t"
  42821. "movs r3, #0\n\t"
  42822. "mov %[a], r9\n\t"
  42823. "mov %[b], r10\n\t"
  42824. "ldr %[a], [%[a], #8]\n\t"
  42825. "ldr %[b], [%[b], #44]\n\t"
  42826. "uxth r6, %[a]\n\t"
  42827. "uxth r7, %[b]\n\t"
  42828. #ifdef WOLFSSL_KEIL
  42829. "muls r7, r6, r7\n\t"
  42830. #elif defined(__clang__)
  42831. "muls r7, r6\n\t"
  42832. #else
  42833. "mul r7, r6\n\t"
  42834. #endif
  42835. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42836. "adds r4, r4, r7\n\t"
  42837. #else
  42838. "add r4, r4, r7\n\t"
  42839. #endif
  42840. #ifdef WOLFSSL_KEIL
  42841. "adcs r5, r5, %[r]\n\t"
  42842. #elif defined(__clang__)
  42843. "adcs r5, %[r]\n\t"
  42844. #else
  42845. "adc r5, %[r]\n\t"
  42846. #endif
  42847. #ifdef WOLFSSL_KEIL
  42848. "adcs r3, r3, %[r]\n\t"
  42849. #elif defined(__clang__)
  42850. "adcs r3, %[r]\n\t"
  42851. #else
  42852. "adc r3, %[r]\n\t"
  42853. #endif
  42854. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42855. "lsrs r7, %[b], #16\n\t"
  42856. #else
  42857. "lsr r7, %[b], #16\n\t"
  42858. #endif
  42859. #ifdef WOLFSSL_KEIL
  42860. "muls r6, r7, r6\n\t"
  42861. #elif defined(__clang__)
  42862. "muls r6, r7\n\t"
  42863. #else
  42864. "mul r6, r7\n\t"
  42865. #endif
  42866. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42867. "lsrs r7, r6, #16\n\t"
  42868. #else
  42869. "lsr r7, r6, #16\n\t"
  42870. #endif
  42871. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42872. "lsls r6, r6, #16\n\t"
  42873. #else
  42874. "lsl r6, r6, #16\n\t"
  42875. #endif
  42876. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42877. "adds r4, r4, r6\n\t"
  42878. #else
  42879. "add r4, r4, r6\n\t"
  42880. #endif
  42881. #ifdef WOLFSSL_KEIL
  42882. "adcs r5, r5, r7\n\t"
  42883. #elif defined(__clang__)
  42884. "adcs r5, r7\n\t"
  42885. #else
  42886. "adc r5, r7\n\t"
  42887. #endif
  42888. #ifdef WOLFSSL_KEIL
  42889. "adcs r3, r3, %[r]\n\t"
  42890. #elif defined(__clang__)
  42891. "adcs r3, %[r]\n\t"
  42892. #else
  42893. "adc r3, %[r]\n\t"
  42894. #endif
  42895. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42896. "lsrs r6, %[a], #16\n\t"
  42897. #else
  42898. "lsr r6, %[a], #16\n\t"
  42899. #endif
  42900. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42901. "lsrs r7, %[b], #16\n\t"
  42902. #else
  42903. "lsr r7, %[b], #16\n\t"
  42904. #endif
  42905. #ifdef WOLFSSL_KEIL
  42906. "muls r7, r6, r7\n\t"
  42907. #elif defined(__clang__)
  42908. "muls r7, r6\n\t"
  42909. #else
  42910. "mul r7, r6\n\t"
  42911. #endif
  42912. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42913. "adds r5, r5, r7\n\t"
  42914. #else
  42915. "add r5, r5, r7\n\t"
  42916. #endif
  42917. #ifdef WOLFSSL_KEIL
  42918. "adcs r3, r3, %[r]\n\t"
  42919. #elif defined(__clang__)
  42920. "adcs r3, %[r]\n\t"
  42921. #else
  42922. "adc r3, %[r]\n\t"
  42923. #endif
  42924. "uxth r7, %[b]\n\t"
  42925. #ifdef WOLFSSL_KEIL
  42926. "muls r6, r7, r6\n\t"
  42927. #elif defined(__clang__)
  42928. "muls r6, r7\n\t"
  42929. #else
  42930. "mul r6, r7\n\t"
  42931. #endif
  42932. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42933. "lsrs r7, r6, #16\n\t"
  42934. #else
  42935. "lsr r7, r6, #16\n\t"
  42936. #endif
  42937. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42938. "lsls r6, r6, #16\n\t"
  42939. #else
  42940. "lsl r6, r6, #16\n\t"
  42941. #endif
  42942. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42943. "adds r4, r4, r6\n\t"
  42944. #else
  42945. "add r4, r4, r6\n\t"
  42946. #endif
  42947. #ifdef WOLFSSL_KEIL
  42948. "adcs r5, r5, r7\n\t"
  42949. #elif defined(__clang__)
  42950. "adcs r5, r7\n\t"
  42951. #else
  42952. "adc r5, r7\n\t"
  42953. #endif
  42954. #ifdef WOLFSSL_KEIL
  42955. "adcs r3, r3, %[r]\n\t"
  42956. #elif defined(__clang__)
  42957. "adcs r3, %[r]\n\t"
  42958. #else
  42959. "adc r3, %[r]\n\t"
  42960. #endif
  42961. "# A[3] * B[10]\n\t"
  42962. "mov %[a], r9\n\t"
  42963. "mov %[b], r10\n\t"
  42964. "ldr %[a], [%[a], #12]\n\t"
  42965. "ldr %[b], [%[b], #40]\n\t"
  42966. "uxth r6, %[a]\n\t"
  42967. "uxth r7, %[b]\n\t"
  42968. #ifdef WOLFSSL_KEIL
  42969. "muls r7, r6, r7\n\t"
  42970. #elif defined(__clang__)
  42971. "muls r7, r6\n\t"
  42972. #else
  42973. "mul r7, r6\n\t"
  42974. #endif
  42975. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42976. "adds r4, r4, r7\n\t"
  42977. #else
  42978. "add r4, r4, r7\n\t"
  42979. #endif
  42980. #ifdef WOLFSSL_KEIL
  42981. "adcs r5, r5, %[r]\n\t"
  42982. #elif defined(__clang__)
  42983. "adcs r5, %[r]\n\t"
  42984. #else
  42985. "adc r5, %[r]\n\t"
  42986. #endif
  42987. #ifdef WOLFSSL_KEIL
  42988. "adcs r3, r3, %[r]\n\t"
  42989. #elif defined(__clang__)
  42990. "adcs r3, %[r]\n\t"
  42991. #else
  42992. "adc r3, %[r]\n\t"
  42993. #endif
  42994. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42995. "lsrs r7, %[b], #16\n\t"
  42996. #else
  42997. "lsr r7, %[b], #16\n\t"
  42998. #endif
  42999. #ifdef WOLFSSL_KEIL
  43000. "muls r6, r7, r6\n\t"
  43001. #elif defined(__clang__)
  43002. "muls r6, r7\n\t"
  43003. #else
  43004. "mul r6, r7\n\t"
  43005. #endif
  43006. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43007. "lsrs r7, r6, #16\n\t"
  43008. #else
  43009. "lsr r7, r6, #16\n\t"
  43010. #endif
  43011. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43012. "lsls r6, r6, #16\n\t"
  43013. #else
  43014. "lsl r6, r6, #16\n\t"
  43015. #endif
  43016. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43017. "adds r4, r4, r6\n\t"
  43018. #else
  43019. "add r4, r4, r6\n\t"
  43020. #endif
  43021. #ifdef WOLFSSL_KEIL
  43022. "adcs r5, r5, r7\n\t"
  43023. #elif defined(__clang__)
  43024. "adcs r5, r7\n\t"
  43025. #else
  43026. "adc r5, r7\n\t"
  43027. #endif
  43028. #ifdef WOLFSSL_KEIL
  43029. "adcs r3, r3, %[r]\n\t"
  43030. #elif defined(__clang__)
  43031. "adcs r3, %[r]\n\t"
  43032. #else
  43033. "adc r3, %[r]\n\t"
  43034. #endif
  43035. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43036. "lsrs r6, %[a], #16\n\t"
  43037. #else
  43038. "lsr r6, %[a], #16\n\t"
  43039. #endif
  43040. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43041. "lsrs r7, %[b], #16\n\t"
  43042. #else
  43043. "lsr r7, %[b], #16\n\t"
  43044. #endif
  43045. #ifdef WOLFSSL_KEIL
  43046. "muls r7, r6, r7\n\t"
  43047. #elif defined(__clang__)
  43048. "muls r7, r6\n\t"
  43049. #else
  43050. "mul r7, r6\n\t"
  43051. #endif
  43052. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43053. "adds r5, r5, r7\n\t"
  43054. #else
  43055. "add r5, r5, r7\n\t"
  43056. #endif
  43057. #ifdef WOLFSSL_KEIL
  43058. "adcs r3, r3, %[r]\n\t"
  43059. #elif defined(__clang__)
  43060. "adcs r3, %[r]\n\t"
  43061. #else
  43062. "adc r3, %[r]\n\t"
  43063. #endif
  43064. "uxth r7, %[b]\n\t"
  43065. #ifdef WOLFSSL_KEIL
  43066. "muls r6, r7, r6\n\t"
  43067. #elif defined(__clang__)
  43068. "muls r6, r7\n\t"
  43069. #else
  43070. "mul r6, r7\n\t"
  43071. #endif
  43072. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43073. "lsrs r7, r6, #16\n\t"
  43074. #else
  43075. "lsr r7, r6, #16\n\t"
  43076. #endif
  43077. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43078. "lsls r6, r6, #16\n\t"
  43079. #else
  43080. "lsl r6, r6, #16\n\t"
  43081. #endif
  43082. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43083. "adds r4, r4, r6\n\t"
  43084. #else
  43085. "add r4, r4, r6\n\t"
  43086. #endif
  43087. #ifdef WOLFSSL_KEIL
  43088. "adcs r5, r5, r7\n\t"
  43089. #elif defined(__clang__)
  43090. "adcs r5, r7\n\t"
  43091. #else
  43092. "adc r5, r7\n\t"
  43093. #endif
  43094. #ifdef WOLFSSL_KEIL
  43095. "adcs r3, r3, %[r]\n\t"
  43096. #elif defined(__clang__)
  43097. "adcs r3, %[r]\n\t"
  43098. #else
  43099. "adc r3, %[r]\n\t"
  43100. #endif
  43101. "# A[4] * B[9]\n\t"
  43102. "mov %[a], r9\n\t"
  43103. "mov %[b], r10\n\t"
  43104. "ldr %[a], [%[a], #16]\n\t"
  43105. "ldr %[b], [%[b], #36]\n\t"
  43106. "uxth r6, %[a]\n\t"
  43107. "uxth r7, %[b]\n\t"
  43108. #ifdef WOLFSSL_KEIL
  43109. "muls r7, r6, r7\n\t"
  43110. #elif defined(__clang__)
  43111. "muls r7, r6\n\t"
  43112. #else
  43113. "mul r7, r6\n\t"
  43114. #endif
  43115. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43116. "adds r4, r4, r7\n\t"
  43117. #else
  43118. "add r4, r4, r7\n\t"
  43119. #endif
  43120. #ifdef WOLFSSL_KEIL
  43121. "adcs r5, r5, %[r]\n\t"
  43122. #elif defined(__clang__)
  43123. "adcs r5, %[r]\n\t"
  43124. #else
  43125. "adc r5, %[r]\n\t"
  43126. #endif
  43127. #ifdef WOLFSSL_KEIL
  43128. "adcs r3, r3, %[r]\n\t"
  43129. #elif defined(__clang__)
  43130. "adcs r3, %[r]\n\t"
  43131. #else
  43132. "adc r3, %[r]\n\t"
  43133. #endif
  43134. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43135. "lsrs r7, %[b], #16\n\t"
  43136. #else
  43137. "lsr r7, %[b], #16\n\t"
  43138. #endif
  43139. #ifdef WOLFSSL_KEIL
  43140. "muls r6, r7, r6\n\t"
  43141. #elif defined(__clang__)
  43142. "muls r6, r7\n\t"
  43143. #else
  43144. "mul r6, r7\n\t"
  43145. #endif
  43146. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43147. "lsrs r7, r6, #16\n\t"
  43148. #else
  43149. "lsr r7, r6, #16\n\t"
  43150. #endif
  43151. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43152. "lsls r6, r6, #16\n\t"
  43153. #else
  43154. "lsl r6, r6, #16\n\t"
  43155. #endif
  43156. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43157. "adds r4, r4, r6\n\t"
  43158. #else
  43159. "add r4, r4, r6\n\t"
  43160. #endif
  43161. #ifdef WOLFSSL_KEIL
  43162. "adcs r5, r5, r7\n\t"
  43163. #elif defined(__clang__)
  43164. "adcs r5, r7\n\t"
  43165. #else
  43166. "adc r5, r7\n\t"
  43167. #endif
  43168. #ifdef WOLFSSL_KEIL
  43169. "adcs r3, r3, %[r]\n\t"
  43170. #elif defined(__clang__)
  43171. "adcs r3, %[r]\n\t"
  43172. #else
  43173. "adc r3, %[r]\n\t"
  43174. #endif
  43175. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43176. "lsrs r6, %[a], #16\n\t"
  43177. #else
  43178. "lsr r6, %[a], #16\n\t"
  43179. #endif
  43180. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43181. "lsrs r7, %[b], #16\n\t"
  43182. #else
  43183. "lsr r7, %[b], #16\n\t"
  43184. #endif
  43185. #ifdef WOLFSSL_KEIL
  43186. "muls r7, r6, r7\n\t"
  43187. #elif defined(__clang__)
  43188. "muls r7, r6\n\t"
  43189. #else
  43190. "mul r7, r6\n\t"
  43191. #endif
  43192. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43193. "adds r5, r5, r7\n\t"
  43194. #else
  43195. "add r5, r5, r7\n\t"
  43196. #endif
  43197. #ifdef WOLFSSL_KEIL
  43198. "adcs r3, r3, %[r]\n\t"
  43199. #elif defined(__clang__)
  43200. "adcs r3, %[r]\n\t"
  43201. #else
  43202. "adc r3, %[r]\n\t"
  43203. #endif
  43204. "uxth r7, %[b]\n\t"
  43205. #ifdef WOLFSSL_KEIL
  43206. "muls r6, r7, r6\n\t"
  43207. #elif defined(__clang__)
  43208. "muls r6, r7\n\t"
  43209. #else
  43210. "mul r6, r7\n\t"
  43211. #endif
  43212. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43213. "lsrs r7, r6, #16\n\t"
  43214. #else
  43215. "lsr r7, r6, #16\n\t"
  43216. #endif
  43217. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43218. "lsls r6, r6, #16\n\t"
  43219. #else
  43220. "lsl r6, r6, #16\n\t"
  43221. #endif
  43222. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43223. "adds r4, r4, r6\n\t"
  43224. #else
  43225. "add r4, r4, r6\n\t"
  43226. #endif
  43227. #ifdef WOLFSSL_KEIL
  43228. "adcs r5, r5, r7\n\t"
  43229. #elif defined(__clang__)
  43230. "adcs r5, r7\n\t"
  43231. #else
  43232. "adc r5, r7\n\t"
  43233. #endif
  43234. #ifdef WOLFSSL_KEIL
  43235. "adcs r3, r3, %[r]\n\t"
  43236. #elif defined(__clang__)
  43237. "adcs r3, %[r]\n\t"
  43238. #else
  43239. "adc r3, %[r]\n\t"
  43240. #endif
  43241. "# A[5] * B[8]\n\t"
  43242. "mov %[a], r9\n\t"
  43243. "mov %[b], r10\n\t"
  43244. "ldr %[a], [%[a], #20]\n\t"
  43245. "ldr %[b], [%[b], #32]\n\t"
  43246. "uxth r6, %[a]\n\t"
  43247. "uxth r7, %[b]\n\t"
  43248. #ifdef WOLFSSL_KEIL
  43249. "muls r7, r6, r7\n\t"
  43250. #elif defined(__clang__)
  43251. "muls r7, r6\n\t"
  43252. #else
  43253. "mul r7, r6\n\t"
  43254. #endif
  43255. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43256. "adds r4, r4, r7\n\t"
  43257. #else
  43258. "add r4, r4, r7\n\t"
  43259. #endif
  43260. #ifdef WOLFSSL_KEIL
  43261. "adcs r5, r5, %[r]\n\t"
  43262. #elif defined(__clang__)
  43263. "adcs r5, %[r]\n\t"
  43264. #else
  43265. "adc r5, %[r]\n\t"
  43266. #endif
  43267. #ifdef WOLFSSL_KEIL
  43268. "adcs r3, r3, %[r]\n\t"
  43269. #elif defined(__clang__)
  43270. "adcs r3, %[r]\n\t"
  43271. #else
  43272. "adc r3, %[r]\n\t"
  43273. #endif
  43274. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43275. "lsrs r7, %[b], #16\n\t"
  43276. #else
  43277. "lsr r7, %[b], #16\n\t"
  43278. #endif
  43279. #ifdef WOLFSSL_KEIL
  43280. "muls r6, r7, r6\n\t"
  43281. #elif defined(__clang__)
  43282. "muls r6, r7\n\t"
  43283. #else
  43284. "mul r6, r7\n\t"
  43285. #endif
  43286. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43287. "lsrs r7, r6, #16\n\t"
  43288. #else
  43289. "lsr r7, r6, #16\n\t"
  43290. #endif
  43291. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43292. "lsls r6, r6, #16\n\t"
  43293. #else
  43294. "lsl r6, r6, #16\n\t"
  43295. #endif
  43296. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43297. "adds r4, r4, r6\n\t"
  43298. #else
  43299. "add r4, r4, r6\n\t"
  43300. #endif
  43301. #ifdef WOLFSSL_KEIL
  43302. "adcs r5, r5, r7\n\t"
  43303. #elif defined(__clang__)
  43304. "adcs r5, r7\n\t"
  43305. #else
  43306. "adc r5, r7\n\t"
  43307. #endif
  43308. #ifdef WOLFSSL_KEIL
  43309. "adcs r3, r3, %[r]\n\t"
  43310. #elif defined(__clang__)
  43311. "adcs r3, %[r]\n\t"
  43312. #else
  43313. "adc r3, %[r]\n\t"
  43314. #endif
  43315. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43316. "lsrs r6, %[a], #16\n\t"
  43317. #else
  43318. "lsr r6, %[a], #16\n\t"
  43319. #endif
  43320. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43321. "lsrs r7, %[b], #16\n\t"
  43322. #else
  43323. "lsr r7, %[b], #16\n\t"
  43324. #endif
  43325. #ifdef WOLFSSL_KEIL
  43326. "muls r7, r6, r7\n\t"
  43327. #elif defined(__clang__)
  43328. "muls r7, r6\n\t"
  43329. #else
  43330. "mul r7, r6\n\t"
  43331. #endif
  43332. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43333. "adds r5, r5, r7\n\t"
  43334. #else
  43335. "add r5, r5, r7\n\t"
  43336. #endif
  43337. #ifdef WOLFSSL_KEIL
  43338. "adcs r3, r3, %[r]\n\t"
  43339. #elif defined(__clang__)
  43340. "adcs r3, %[r]\n\t"
  43341. #else
  43342. "adc r3, %[r]\n\t"
  43343. #endif
  43344. "uxth r7, %[b]\n\t"
  43345. #ifdef WOLFSSL_KEIL
  43346. "muls r6, r7, r6\n\t"
  43347. #elif defined(__clang__)
  43348. "muls r6, r7\n\t"
  43349. #else
  43350. "mul r6, r7\n\t"
  43351. #endif
  43352. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43353. "lsrs r7, r6, #16\n\t"
  43354. #else
  43355. "lsr r7, r6, #16\n\t"
  43356. #endif
  43357. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43358. "lsls r6, r6, #16\n\t"
  43359. #else
  43360. "lsl r6, r6, #16\n\t"
  43361. #endif
  43362. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43363. "adds r4, r4, r6\n\t"
  43364. #else
  43365. "add r4, r4, r6\n\t"
  43366. #endif
  43367. #ifdef WOLFSSL_KEIL
  43368. "adcs r5, r5, r7\n\t"
  43369. #elif defined(__clang__)
  43370. "adcs r5, r7\n\t"
  43371. #else
  43372. "adc r5, r7\n\t"
  43373. #endif
  43374. #ifdef WOLFSSL_KEIL
  43375. "adcs r3, r3, %[r]\n\t"
  43376. #elif defined(__clang__)
  43377. "adcs r3, %[r]\n\t"
  43378. #else
  43379. "adc r3, %[r]\n\t"
  43380. #endif
  43381. "# A[6] * B[7]\n\t"
  43382. "mov %[a], r9\n\t"
  43383. "mov %[b], r10\n\t"
  43384. "ldr %[a], [%[a], #24]\n\t"
  43385. "ldr %[b], [%[b], #28]\n\t"
  43386. "uxth r6, %[a]\n\t"
  43387. "uxth r7, %[b]\n\t"
  43388. #ifdef WOLFSSL_KEIL
  43389. "muls r7, r6, r7\n\t"
  43390. #elif defined(__clang__)
  43391. "muls r7, r6\n\t"
  43392. #else
  43393. "mul r7, r6\n\t"
  43394. #endif
  43395. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43396. "adds r4, r4, r7\n\t"
  43397. #else
  43398. "add r4, r4, r7\n\t"
  43399. #endif
  43400. #ifdef WOLFSSL_KEIL
  43401. "adcs r5, r5, %[r]\n\t"
  43402. #elif defined(__clang__)
  43403. "adcs r5, %[r]\n\t"
  43404. #else
  43405. "adc r5, %[r]\n\t"
  43406. #endif
  43407. #ifdef WOLFSSL_KEIL
  43408. "adcs r3, r3, %[r]\n\t"
  43409. #elif defined(__clang__)
  43410. "adcs r3, %[r]\n\t"
  43411. #else
  43412. "adc r3, %[r]\n\t"
  43413. #endif
  43414. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43415. "lsrs r7, %[b], #16\n\t"
  43416. #else
  43417. "lsr r7, %[b], #16\n\t"
  43418. #endif
  43419. #ifdef WOLFSSL_KEIL
  43420. "muls r6, r7, r6\n\t"
  43421. #elif defined(__clang__)
  43422. "muls r6, r7\n\t"
  43423. #else
  43424. "mul r6, r7\n\t"
  43425. #endif
  43426. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43427. "lsrs r7, r6, #16\n\t"
  43428. #else
  43429. "lsr r7, r6, #16\n\t"
  43430. #endif
  43431. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43432. "lsls r6, r6, #16\n\t"
  43433. #else
  43434. "lsl r6, r6, #16\n\t"
  43435. #endif
  43436. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43437. "adds r4, r4, r6\n\t"
  43438. #else
  43439. "add r4, r4, r6\n\t"
  43440. #endif
  43441. #ifdef WOLFSSL_KEIL
  43442. "adcs r5, r5, r7\n\t"
  43443. #elif defined(__clang__)
  43444. "adcs r5, r7\n\t"
  43445. #else
  43446. "adc r5, r7\n\t"
  43447. #endif
  43448. #ifdef WOLFSSL_KEIL
  43449. "adcs r3, r3, %[r]\n\t"
  43450. #elif defined(__clang__)
  43451. "adcs r3, %[r]\n\t"
  43452. #else
  43453. "adc r3, %[r]\n\t"
  43454. #endif
  43455. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43456. "lsrs r6, %[a], #16\n\t"
  43457. #else
  43458. "lsr r6, %[a], #16\n\t"
  43459. #endif
  43460. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43461. "lsrs r7, %[b], #16\n\t"
  43462. #else
  43463. "lsr r7, %[b], #16\n\t"
  43464. #endif
  43465. #ifdef WOLFSSL_KEIL
  43466. "muls r7, r6, r7\n\t"
  43467. #elif defined(__clang__)
  43468. "muls r7, r6\n\t"
  43469. #else
  43470. "mul r7, r6\n\t"
  43471. #endif
  43472. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43473. "adds r5, r5, r7\n\t"
  43474. #else
  43475. "add r5, r5, r7\n\t"
  43476. #endif
  43477. #ifdef WOLFSSL_KEIL
  43478. "adcs r3, r3, %[r]\n\t"
  43479. #elif defined(__clang__)
  43480. "adcs r3, %[r]\n\t"
  43481. #else
  43482. "adc r3, %[r]\n\t"
  43483. #endif
  43484. "uxth r7, %[b]\n\t"
  43485. #ifdef WOLFSSL_KEIL
  43486. "muls r6, r7, r6\n\t"
  43487. #elif defined(__clang__)
  43488. "muls r6, r7\n\t"
  43489. #else
  43490. "mul r6, r7\n\t"
  43491. #endif
  43492. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43493. "lsrs r7, r6, #16\n\t"
  43494. #else
  43495. "lsr r7, r6, #16\n\t"
  43496. #endif
  43497. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43498. "lsls r6, r6, #16\n\t"
  43499. #else
  43500. "lsl r6, r6, #16\n\t"
  43501. #endif
  43502. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43503. "adds r4, r4, r6\n\t"
  43504. #else
  43505. "add r4, r4, r6\n\t"
  43506. #endif
  43507. #ifdef WOLFSSL_KEIL
  43508. "adcs r5, r5, r7\n\t"
  43509. #elif defined(__clang__)
  43510. "adcs r5, r7\n\t"
  43511. #else
  43512. "adc r5, r7\n\t"
  43513. #endif
  43514. #ifdef WOLFSSL_KEIL
  43515. "adcs r3, r3, %[r]\n\t"
  43516. #elif defined(__clang__)
  43517. "adcs r3, %[r]\n\t"
  43518. #else
  43519. "adc r3, %[r]\n\t"
  43520. #endif
  43521. "# A[7] * B[6]\n\t"
  43522. "mov %[a], r9\n\t"
  43523. "mov %[b], r10\n\t"
  43524. "ldr %[a], [%[a], #28]\n\t"
  43525. "ldr %[b], [%[b], #24]\n\t"
  43526. "uxth r6, %[a]\n\t"
  43527. "uxth r7, %[b]\n\t"
  43528. #ifdef WOLFSSL_KEIL
  43529. "muls r7, r6, r7\n\t"
  43530. #elif defined(__clang__)
  43531. "muls r7, r6\n\t"
  43532. #else
  43533. "mul r7, r6\n\t"
  43534. #endif
  43535. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43536. "adds r4, r4, r7\n\t"
  43537. #else
  43538. "add r4, r4, r7\n\t"
  43539. #endif
  43540. #ifdef WOLFSSL_KEIL
  43541. "adcs r5, r5, %[r]\n\t"
  43542. #elif defined(__clang__)
  43543. "adcs r5, %[r]\n\t"
  43544. #else
  43545. "adc r5, %[r]\n\t"
  43546. #endif
  43547. #ifdef WOLFSSL_KEIL
  43548. "adcs r3, r3, %[r]\n\t"
  43549. #elif defined(__clang__)
  43550. "adcs r3, %[r]\n\t"
  43551. #else
  43552. "adc r3, %[r]\n\t"
  43553. #endif
  43554. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43555. "lsrs r7, %[b], #16\n\t"
  43556. #else
  43557. "lsr r7, %[b], #16\n\t"
  43558. #endif
  43559. #ifdef WOLFSSL_KEIL
  43560. "muls r6, r7, r6\n\t"
  43561. #elif defined(__clang__)
  43562. "muls r6, r7\n\t"
  43563. #else
  43564. "mul r6, r7\n\t"
  43565. #endif
  43566. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43567. "lsrs r7, r6, #16\n\t"
  43568. #else
  43569. "lsr r7, r6, #16\n\t"
  43570. #endif
  43571. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43572. "lsls r6, r6, #16\n\t"
  43573. #else
  43574. "lsl r6, r6, #16\n\t"
  43575. #endif
  43576. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43577. "adds r4, r4, r6\n\t"
  43578. #else
  43579. "add r4, r4, r6\n\t"
  43580. #endif
  43581. #ifdef WOLFSSL_KEIL
  43582. "adcs r5, r5, r7\n\t"
  43583. #elif defined(__clang__)
  43584. "adcs r5, r7\n\t"
  43585. #else
  43586. "adc r5, r7\n\t"
  43587. #endif
  43588. #ifdef WOLFSSL_KEIL
  43589. "adcs r3, r3, %[r]\n\t"
  43590. #elif defined(__clang__)
  43591. "adcs r3, %[r]\n\t"
  43592. #else
  43593. "adc r3, %[r]\n\t"
  43594. #endif
  43595. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43596. "lsrs r6, %[a], #16\n\t"
  43597. #else
  43598. "lsr r6, %[a], #16\n\t"
  43599. #endif
  43600. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43601. "lsrs r7, %[b], #16\n\t"
  43602. #else
  43603. "lsr r7, %[b], #16\n\t"
  43604. #endif
  43605. #ifdef WOLFSSL_KEIL
  43606. "muls r7, r6, r7\n\t"
  43607. #elif defined(__clang__)
  43608. "muls r7, r6\n\t"
  43609. #else
  43610. "mul r7, r6\n\t"
  43611. #endif
  43612. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43613. "adds r5, r5, r7\n\t"
  43614. #else
  43615. "add r5, r5, r7\n\t"
  43616. #endif
  43617. #ifdef WOLFSSL_KEIL
  43618. "adcs r3, r3, %[r]\n\t"
  43619. #elif defined(__clang__)
  43620. "adcs r3, %[r]\n\t"
  43621. #else
  43622. "adc r3, %[r]\n\t"
  43623. #endif
  43624. "uxth r7, %[b]\n\t"
  43625. #ifdef WOLFSSL_KEIL
  43626. "muls r6, r7, r6\n\t"
  43627. #elif defined(__clang__)
  43628. "muls r6, r7\n\t"
  43629. #else
  43630. "mul r6, r7\n\t"
  43631. #endif
  43632. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43633. "lsrs r7, r6, #16\n\t"
  43634. #else
  43635. "lsr r7, r6, #16\n\t"
  43636. #endif
  43637. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43638. "lsls r6, r6, #16\n\t"
  43639. #else
  43640. "lsl r6, r6, #16\n\t"
  43641. #endif
  43642. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43643. "adds r4, r4, r6\n\t"
  43644. #else
  43645. "add r4, r4, r6\n\t"
  43646. #endif
  43647. #ifdef WOLFSSL_KEIL
  43648. "adcs r5, r5, r7\n\t"
  43649. #elif defined(__clang__)
  43650. "adcs r5, r7\n\t"
  43651. #else
  43652. "adc r5, r7\n\t"
  43653. #endif
  43654. #ifdef WOLFSSL_KEIL
  43655. "adcs r3, r3, %[r]\n\t"
  43656. #elif defined(__clang__)
  43657. "adcs r3, %[r]\n\t"
  43658. #else
  43659. "adc r3, %[r]\n\t"
  43660. #endif
  43661. "# A[8] * B[5]\n\t"
  43662. "mov %[a], r9\n\t"
  43663. "mov %[b], r10\n\t"
  43664. "ldr %[a], [%[a], #32]\n\t"
  43665. "ldr %[b], [%[b], #20]\n\t"
  43666. "uxth r6, %[a]\n\t"
  43667. "uxth r7, %[b]\n\t"
  43668. #ifdef WOLFSSL_KEIL
  43669. "muls r7, r6, r7\n\t"
  43670. #elif defined(__clang__)
  43671. "muls r7, r6\n\t"
  43672. #else
  43673. "mul r7, r6\n\t"
  43674. #endif
  43675. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43676. "adds r4, r4, r7\n\t"
  43677. #else
  43678. "add r4, r4, r7\n\t"
  43679. #endif
  43680. #ifdef WOLFSSL_KEIL
  43681. "adcs r5, r5, %[r]\n\t"
  43682. #elif defined(__clang__)
  43683. "adcs r5, %[r]\n\t"
  43684. #else
  43685. "adc r5, %[r]\n\t"
  43686. #endif
  43687. #ifdef WOLFSSL_KEIL
  43688. "adcs r3, r3, %[r]\n\t"
  43689. #elif defined(__clang__)
  43690. "adcs r3, %[r]\n\t"
  43691. #else
  43692. "adc r3, %[r]\n\t"
  43693. #endif
  43694. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43695. "lsrs r7, %[b], #16\n\t"
  43696. #else
  43697. "lsr r7, %[b], #16\n\t"
  43698. #endif
  43699. #ifdef WOLFSSL_KEIL
  43700. "muls r6, r7, r6\n\t"
  43701. #elif defined(__clang__)
  43702. "muls r6, r7\n\t"
  43703. #else
  43704. "mul r6, r7\n\t"
  43705. #endif
  43706. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43707. "lsrs r7, r6, #16\n\t"
  43708. #else
  43709. "lsr r7, r6, #16\n\t"
  43710. #endif
  43711. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43712. "lsls r6, r6, #16\n\t"
  43713. #else
  43714. "lsl r6, r6, #16\n\t"
  43715. #endif
  43716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43717. "adds r4, r4, r6\n\t"
  43718. #else
  43719. "add r4, r4, r6\n\t"
  43720. #endif
  43721. #ifdef WOLFSSL_KEIL
  43722. "adcs r5, r5, r7\n\t"
  43723. #elif defined(__clang__)
  43724. "adcs r5, r7\n\t"
  43725. #else
  43726. "adc r5, r7\n\t"
  43727. #endif
  43728. #ifdef WOLFSSL_KEIL
  43729. "adcs r3, r3, %[r]\n\t"
  43730. #elif defined(__clang__)
  43731. "adcs r3, %[r]\n\t"
  43732. #else
  43733. "adc r3, %[r]\n\t"
  43734. #endif
  43735. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43736. "lsrs r6, %[a], #16\n\t"
  43737. #else
  43738. "lsr r6, %[a], #16\n\t"
  43739. #endif
  43740. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43741. "lsrs r7, %[b], #16\n\t"
  43742. #else
  43743. "lsr r7, %[b], #16\n\t"
  43744. #endif
  43745. #ifdef WOLFSSL_KEIL
  43746. "muls r7, r6, r7\n\t"
  43747. #elif defined(__clang__)
  43748. "muls r7, r6\n\t"
  43749. #else
  43750. "mul r7, r6\n\t"
  43751. #endif
  43752. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43753. "adds r5, r5, r7\n\t"
  43754. #else
  43755. "add r5, r5, r7\n\t"
  43756. #endif
  43757. #ifdef WOLFSSL_KEIL
  43758. "adcs r3, r3, %[r]\n\t"
  43759. #elif defined(__clang__)
  43760. "adcs r3, %[r]\n\t"
  43761. #else
  43762. "adc r3, %[r]\n\t"
  43763. #endif
  43764. "uxth r7, %[b]\n\t"
  43765. #ifdef WOLFSSL_KEIL
  43766. "muls r6, r7, r6\n\t"
  43767. #elif defined(__clang__)
  43768. "muls r6, r7\n\t"
  43769. #else
  43770. "mul r6, r7\n\t"
  43771. #endif
  43772. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43773. "lsrs r7, r6, #16\n\t"
  43774. #else
  43775. "lsr r7, r6, #16\n\t"
  43776. #endif
  43777. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43778. "lsls r6, r6, #16\n\t"
  43779. #else
  43780. "lsl r6, r6, #16\n\t"
  43781. #endif
  43782. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43783. "adds r4, r4, r6\n\t"
  43784. #else
  43785. "add r4, r4, r6\n\t"
  43786. #endif
  43787. #ifdef WOLFSSL_KEIL
  43788. "adcs r5, r5, r7\n\t"
  43789. #elif defined(__clang__)
  43790. "adcs r5, r7\n\t"
  43791. #else
  43792. "adc r5, r7\n\t"
  43793. #endif
  43794. #ifdef WOLFSSL_KEIL
  43795. "adcs r3, r3, %[r]\n\t"
  43796. #elif defined(__clang__)
  43797. "adcs r3, %[r]\n\t"
  43798. #else
  43799. "adc r3, %[r]\n\t"
  43800. #endif
  43801. "# A[9] * B[4]\n\t"
  43802. "mov %[a], r9\n\t"
  43803. "mov %[b], r10\n\t"
  43804. "ldr %[a], [%[a], #36]\n\t"
  43805. "ldr %[b], [%[b], #16]\n\t"
  43806. "uxth r6, %[a]\n\t"
  43807. "uxth r7, %[b]\n\t"
  43808. #ifdef WOLFSSL_KEIL
  43809. "muls r7, r6, r7\n\t"
  43810. #elif defined(__clang__)
  43811. "muls r7, r6\n\t"
  43812. #else
  43813. "mul r7, r6\n\t"
  43814. #endif
  43815. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43816. "adds r4, r4, r7\n\t"
  43817. #else
  43818. "add r4, r4, r7\n\t"
  43819. #endif
  43820. #ifdef WOLFSSL_KEIL
  43821. "adcs r5, r5, %[r]\n\t"
  43822. #elif defined(__clang__)
  43823. "adcs r5, %[r]\n\t"
  43824. #else
  43825. "adc r5, %[r]\n\t"
  43826. #endif
  43827. #ifdef WOLFSSL_KEIL
  43828. "adcs r3, r3, %[r]\n\t"
  43829. #elif defined(__clang__)
  43830. "adcs r3, %[r]\n\t"
  43831. #else
  43832. "adc r3, %[r]\n\t"
  43833. #endif
  43834. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43835. "lsrs r7, %[b], #16\n\t"
  43836. #else
  43837. "lsr r7, %[b], #16\n\t"
  43838. #endif
  43839. #ifdef WOLFSSL_KEIL
  43840. "muls r6, r7, r6\n\t"
  43841. #elif defined(__clang__)
  43842. "muls r6, r7\n\t"
  43843. #else
  43844. "mul r6, r7\n\t"
  43845. #endif
  43846. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43847. "lsrs r7, r6, #16\n\t"
  43848. #else
  43849. "lsr r7, r6, #16\n\t"
  43850. #endif
  43851. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43852. "lsls r6, r6, #16\n\t"
  43853. #else
  43854. "lsl r6, r6, #16\n\t"
  43855. #endif
  43856. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43857. "adds r4, r4, r6\n\t"
  43858. #else
  43859. "add r4, r4, r6\n\t"
  43860. #endif
  43861. #ifdef WOLFSSL_KEIL
  43862. "adcs r5, r5, r7\n\t"
  43863. #elif defined(__clang__)
  43864. "adcs r5, r7\n\t"
  43865. #else
  43866. "adc r5, r7\n\t"
  43867. #endif
  43868. #ifdef WOLFSSL_KEIL
  43869. "adcs r3, r3, %[r]\n\t"
  43870. #elif defined(__clang__)
  43871. "adcs r3, %[r]\n\t"
  43872. #else
  43873. "adc r3, %[r]\n\t"
  43874. #endif
  43875. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43876. "lsrs r6, %[a], #16\n\t"
  43877. #else
  43878. "lsr r6, %[a], #16\n\t"
  43879. #endif
  43880. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43881. "lsrs r7, %[b], #16\n\t"
  43882. #else
  43883. "lsr r7, %[b], #16\n\t"
  43884. #endif
  43885. #ifdef WOLFSSL_KEIL
  43886. "muls r7, r6, r7\n\t"
  43887. #elif defined(__clang__)
  43888. "muls r7, r6\n\t"
  43889. #else
  43890. "mul r7, r6\n\t"
  43891. #endif
  43892. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43893. "adds r5, r5, r7\n\t"
  43894. #else
  43895. "add r5, r5, r7\n\t"
  43896. #endif
  43897. #ifdef WOLFSSL_KEIL
  43898. "adcs r3, r3, %[r]\n\t"
  43899. #elif defined(__clang__)
  43900. "adcs r3, %[r]\n\t"
  43901. #else
  43902. "adc r3, %[r]\n\t"
  43903. #endif
  43904. "uxth r7, %[b]\n\t"
  43905. #ifdef WOLFSSL_KEIL
  43906. "muls r6, r7, r6\n\t"
  43907. #elif defined(__clang__)
  43908. "muls r6, r7\n\t"
  43909. #else
  43910. "mul r6, r7\n\t"
  43911. #endif
  43912. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43913. "lsrs r7, r6, #16\n\t"
  43914. #else
  43915. "lsr r7, r6, #16\n\t"
  43916. #endif
  43917. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43918. "lsls r6, r6, #16\n\t"
  43919. #else
  43920. "lsl r6, r6, #16\n\t"
  43921. #endif
  43922. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43923. "adds r4, r4, r6\n\t"
  43924. #else
  43925. "add r4, r4, r6\n\t"
  43926. #endif
  43927. #ifdef WOLFSSL_KEIL
  43928. "adcs r5, r5, r7\n\t"
  43929. #elif defined(__clang__)
  43930. "adcs r5, r7\n\t"
  43931. #else
  43932. "adc r5, r7\n\t"
  43933. #endif
  43934. #ifdef WOLFSSL_KEIL
  43935. "adcs r3, r3, %[r]\n\t"
  43936. #elif defined(__clang__)
  43937. "adcs r3, %[r]\n\t"
  43938. #else
  43939. "adc r3, %[r]\n\t"
  43940. #endif
  43941. "# A[10] * B[3]\n\t"
  43942. "mov %[a], r9\n\t"
  43943. "mov %[b], r10\n\t"
  43944. "ldr %[a], [%[a], #40]\n\t"
  43945. "ldr %[b], [%[b], #12]\n\t"
  43946. "uxth r6, %[a]\n\t"
  43947. "uxth r7, %[b]\n\t"
  43948. #ifdef WOLFSSL_KEIL
  43949. "muls r7, r6, r7\n\t"
  43950. #elif defined(__clang__)
  43951. "muls r7, r6\n\t"
  43952. #else
  43953. "mul r7, r6\n\t"
  43954. #endif
  43955. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43956. "adds r4, r4, r7\n\t"
  43957. #else
  43958. "add r4, r4, r7\n\t"
  43959. #endif
  43960. #ifdef WOLFSSL_KEIL
  43961. "adcs r5, r5, %[r]\n\t"
  43962. #elif defined(__clang__)
  43963. "adcs r5, %[r]\n\t"
  43964. #else
  43965. "adc r5, %[r]\n\t"
  43966. #endif
  43967. #ifdef WOLFSSL_KEIL
  43968. "adcs r3, r3, %[r]\n\t"
  43969. #elif defined(__clang__)
  43970. "adcs r3, %[r]\n\t"
  43971. #else
  43972. "adc r3, %[r]\n\t"
  43973. #endif
  43974. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43975. "lsrs r7, %[b], #16\n\t"
  43976. #else
  43977. "lsr r7, %[b], #16\n\t"
  43978. #endif
  43979. #ifdef WOLFSSL_KEIL
  43980. "muls r6, r7, r6\n\t"
  43981. #elif defined(__clang__)
  43982. "muls r6, r7\n\t"
  43983. #else
  43984. "mul r6, r7\n\t"
  43985. #endif
  43986. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43987. "lsrs r7, r6, #16\n\t"
  43988. #else
  43989. "lsr r7, r6, #16\n\t"
  43990. #endif
  43991. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43992. "lsls r6, r6, #16\n\t"
  43993. #else
  43994. "lsl r6, r6, #16\n\t"
  43995. #endif
  43996. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43997. "adds r4, r4, r6\n\t"
  43998. #else
  43999. "add r4, r4, r6\n\t"
  44000. #endif
  44001. #ifdef WOLFSSL_KEIL
  44002. "adcs r5, r5, r7\n\t"
  44003. #elif defined(__clang__)
  44004. "adcs r5, r7\n\t"
  44005. #else
  44006. "adc r5, r7\n\t"
  44007. #endif
  44008. #ifdef WOLFSSL_KEIL
  44009. "adcs r3, r3, %[r]\n\t"
  44010. #elif defined(__clang__)
  44011. "adcs r3, %[r]\n\t"
  44012. #else
  44013. "adc r3, %[r]\n\t"
  44014. #endif
  44015. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44016. "lsrs r6, %[a], #16\n\t"
  44017. #else
  44018. "lsr r6, %[a], #16\n\t"
  44019. #endif
  44020. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44021. "lsrs r7, %[b], #16\n\t"
  44022. #else
  44023. "lsr r7, %[b], #16\n\t"
  44024. #endif
  44025. #ifdef WOLFSSL_KEIL
  44026. "muls r7, r6, r7\n\t"
  44027. #elif defined(__clang__)
  44028. "muls r7, r6\n\t"
  44029. #else
  44030. "mul r7, r6\n\t"
  44031. #endif
  44032. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44033. "adds r5, r5, r7\n\t"
  44034. #else
  44035. "add r5, r5, r7\n\t"
  44036. #endif
  44037. #ifdef WOLFSSL_KEIL
  44038. "adcs r3, r3, %[r]\n\t"
  44039. #elif defined(__clang__)
  44040. "adcs r3, %[r]\n\t"
  44041. #else
  44042. "adc r3, %[r]\n\t"
  44043. #endif
  44044. "uxth r7, %[b]\n\t"
  44045. #ifdef WOLFSSL_KEIL
  44046. "muls r6, r7, r6\n\t"
  44047. #elif defined(__clang__)
  44048. "muls r6, r7\n\t"
  44049. #else
  44050. "mul r6, r7\n\t"
  44051. #endif
  44052. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44053. "lsrs r7, r6, #16\n\t"
  44054. #else
  44055. "lsr r7, r6, #16\n\t"
  44056. #endif
  44057. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44058. "lsls r6, r6, #16\n\t"
  44059. #else
  44060. "lsl r6, r6, #16\n\t"
  44061. #endif
  44062. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44063. "adds r4, r4, r6\n\t"
  44064. #else
  44065. "add r4, r4, r6\n\t"
  44066. #endif
  44067. #ifdef WOLFSSL_KEIL
  44068. "adcs r5, r5, r7\n\t"
  44069. #elif defined(__clang__)
  44070. "adcs r5, r7\n\t"
  44071. #else
  44072. "adc r5, r7\n\t"
  44073. #endif
  44074. #ifdef WOLFSSL_KEIL
  44075. "adcs r3, r3, %[r]\n\t"
  44076. #elif defined(__clang__)
  44077. "adcs r3, %[r]\n\t"
  44078. #else
  44079. "adc r3, %[r]\n\t"
  44080. #endif
  44081. "# A[11] * B[2]\n\t"
  44082. "mov %[a], r9\n\t"
  44083. "mov %[b], r10\n\t"
  44084. "ldr %[a], [%[a], #44]\n\t"
  44085. "ldr %[b], [%[b], #8]\n\t"
  44086. "uxth r6, %[a]\n\t"
  44087. "uxth r7, %[b]\n\t"
  44088. #ifdef WOLFSSL_KEIL
  44089. "muls r7, r6, r7\n\t"
  44090. #elif defined(__clang__)
  44091. "muls r7, r6\n\t"
  44092. #else
  44093. "mul r7, r6\n\t"
  44094. #endif
  44095. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44096. "adds r4, r4, r7\n\t"
  44097. #else
  44098. "add r4, r4, r7\n\t"
  44099. #endif
  44100. #ifdef WOLFSSL_KEIL
  44101. "adcs r5, r5, %[r]\n\t"
  44102. #elif defined(__clang__)
  44103. "adcs r5, %[r]\n\t"
  44104. #else
  44105. "adc r5, %[r]\n\t"
  44106. #endif
  44107. #ifdef WOLFSSL_KEIL
  44108. "adcs r3, r3, %[r]\n\t"
  44109. #elif defined(__clang__)
  44110. "adcs r3, %[r]\n\t"
  44111. #else
  44112. "adc r3, %[r]\n\t"
  44113. #endif
  44114. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44115. "lsrs r7, %[b], #16\n\t"
  44116. #else
  44117. "lsr r7, %[b], #16\n\t"
  44118. #endif
  44119. #ifdef WOLFSSL_KEIL
  44120. "muls r6, r7, r6\n\t"
  44121. #elif defined(__clang__)
  44122. "muls r6, r7\n\t"
  44123. #else
  44124. "mul r6, r7\n\t"
  44125. #endif
  44126. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44127. "lsrs r7, r6, #16\n\t"
  44128. #else
  44129. "lsr r7, r6, #16\n\t"
  44130. #endif
  44131. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44132. "lsls r6, r6, #16\n\t"
  44133. #else
  44134. "lsl r6, r6, #16\n\t"
  44135. #endif
  44136. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44137. "adds r4, r4, r6\n\t"
  44138. #else
  44139. "add r4, r4, r6\n\t"
  44140. #endif
  44141. #ifdef WOLFSSL_KEIL
  44142. "adcs r5, r5, r7\n\t"
  44143. #elif defined(__clang__)
  44144. "adcs r5, r7\n\t"
  44145. #else
  44146. "adc r5, r7\n\t"
  44147. #endif
  44148. #ifdef WOLFSSL_KEIL
  44149. "adcs r3, r3, %[r]\n\t"
  44150. #elif defined(__clang__)
  44151. "adcs r3, %[r]\n\t"
  44152. #else
  44153. "adc r3, %[r]\n\t"
  44154. #endif
  44155. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44156. "lsrs r6, %[a], #16\n\t"
  44157. #else
  44158. "lsr r6, %[a], #16\n\t"
  44159. #endif
  44160. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44161. "lsrs r7, %[b], #16\n\t"
  44162. #else
  44163. "lsr r7, %[b], #16\n\t"
  44164. #endif
  44165. #ifdef WOLFSSL_KEIL
  44166. "muls r7, r6, r7\n\t"
  44167. #elif defined(__clang__)
  44168. "muls r7, r6\n\t"
  44169. #else
  44170. "mul r7, r6\n\t"
  44171. #endif
  44172. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44173. "adds r5, r5, r7\n\t"
  44174. #else
  44175. "add r5, r5, r7\n\t"
  44176. #endif
  44177. #ifdef WOLFSSL_KEIL
  44178. "adcs r3, r3, %[r]\n\t"
  44179. #elif defined(__clang__)
  44180. "adcs r3, %[r]\n\t"
  44181. #else
  44182. "adc r3, %[r]\n\t"
  44183. #endif
  44184. "uxth r7, %[b]\n\t"
  44185. #ifdef WOLFSSL_KEIL
  44186. "muls r6, r7, r6\n\t"
  44187. #elif defined(__clang__)
  44188. "muls r6, r7\n\t"
  44189. #else
  44190. "mul r6, r7\n\t"
  44191. #endif
  44192. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44193. "lsrs r7, r6, #16\n\t"
  44194. #else
  44195. "lsr r7, r6, #16\n\t"
  44196. #endif
  44197. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44198. "lsls r6, r6, #16\n\t"
  44199. #else
  44200. "lsl r6, r6, #16\n\t"
  44201. #endif
  44202. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44203. "adds r4, r4, r6\n\t"
  44204. #else
  44205. "add r4, r4, r6\n\t"
  44206. #endif
  44207. #ifdef WOLFSSL_KEIL
  44208. "adcs r5, r5, r7\n\t"
  44209. #elif defined(__clang__)
  44210. "adcs r5, r7\n\t"
  44211. #else
  44212. "adc r5, r7\n\t"
  44213. #endif
  44214. #ifdef WOLFSSL_KEIL
  44215. "adcs r3, r3, %[r]\n\t"
  44216. #elif defined(__clang__)
  44217. "adcs r3, %[r]\n\t"
  44218. #else
  44219. "adc r3, %[r]\n\t"
  44220. #endif
  44221. "mov %[r], r8\n\t"
  44222. "str r4, [%[r], #52]\n\t"
  44223. "movs %[r], #0\n\t"
  44224. "# A[11] * B[3]\n\t"
  44225. "movs r4, #0\n\t"
  44226. "mov %[a], r9\n\t"
  44227. "mov %[b], r10\n\t"
  44228. "ldr %[a], [%[a], #44]\n\t"
  44229. "ldr %[b], [%[b], #12]\n\t"
  44230. "uxth r6, %[a]\n\t"
  44231. "uxth r7, %[b]\n\t"
  44232. #ifdef WOLFSSL_KEIL
  44233. "muls r7, r6, r7\n\t"
  44234. #elif defined(__clang__)
  44235. "muls r7, r6\n\t"
  44236. #else
  44237. "mul r7, r6\n\t"
  44238. #endif
  44239. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44240. "adds r5, r5, r7\n\t"
  44241. #else
  44242. "add r5, r5, r7\n\t"
  44243. #endif
  44244. #ifdef WOLFSSL_KEIL
  44245. "adcs r3, r3, %[r]\n\t"
  44246. #elif defined(__clang__)
  44247. "adcs r3, %[r]\n\t"
  44248. #else
  44249. "adc r3, %[r]\n\t"
  44250. #endif
  44251. #ifdef WOLFSSL_KEIL
  44252. "adcs r4, r4, %[r]\n\t"
  44253. #elif defined(__clang__)
  44254. "adcs r4, %[r]\n\t"
  44255. #else
  44256. "adc r4, %[r]\n\t"
  44257. #endif
  44258. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44259. "lsrs r7, %[b], #16\n\t"
  44260. #else
  44261. "lsr r7, %[b], #16\n\t"
  44262. #endif
  44263. #ifdef WOLFSSL_KEIL
  44264. "muls r6, r7, r6\n\t"
  44265. #elif defined(__clang__)
  44266. "muls r6, r7\n\t"
  44267. #else
  44268. "mul r6, r7\n\t"
  44269. #endif
  44270. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44271. "lsrs r7, r6, #16\n\t"
  44272. #else
  44273. "lsr r7, r6, #16\n\t"
  44274. #endif
  44275. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44276. "lsls r6, r6, #16\n\t"
  44277. #else
  44278. "lsl r6, r6, #16\n\t"
  44279. #endif
  44280. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44281. "adds r5, r5, r6\n\t"
  44282. #else
  44283. "add r5, r5, r6\n\t"
  44284. #endif
  44285. #ifdef WOLFSSL_KEIL
  44286. "adcs r3, r3, r7\n\t"
  44287. #elif defined(__clang__)
  44288. "adcs r3, r7\n\t"
  44289. #else
  44290. "adc r3, r7\n\t"
  44291. #endif
  44292. #ifdef WOLFSSL_KEIL
  44293. "adcs r4, r4, %[r]\n\t"
  44294. #elif defined(__clang__)
  44295. "adcs r4, %[r]\n\t"
  44296. #else
  44297. "adc r4, %[r]\n\t"
  44298. #endif
  44299. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44300. "lsrs r6, %[a], #16\n\t"
  44301. #else
  44302. "lsr r6, %[a], #16\n\t"
  44303. #endif
  44304. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44305. "lsrs r7, %[b], #16\n\t"
  44306. #else
  44307. "lsr r7, %[b], #16\n\t"
  44308. #endif
  44309. #ifdef WOLFSSL_KEIL
  44310. "muls r7, r6, r7\n\t"
  44311. #elif defined(__clang__)
  44312. "muls r7, r6\n\t"
  44313. #else
  44314. "mul r7, r6\n\t"
  44315. #endif
  44316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44317. "adds r3, r3, r7\n\t"
  44318. #else
  44319. "add r3, r3, r7\n\t"
  44320. #endif
  44321. #ifdef WOLFSSL_KEIL
  44322. "adcs r4, r4, %[r]\n\t"
  44323. #elif defined(__clang__)
  44324. "adcs r4, %[r]\n\t"
  44325. #else
  44326. "adc r4, %[r]\n\t"
  44327. #endif
  44328. "uxth r7, %[b]\n\t"
  44329. #ifdef WOLFSSL_KEIL
  44330. "muls r6, r7, r6\n\t"
  44331. #elif defined(__clang__)
  44332. "muls r6, r7\n\t"
  44333. #else
  44334. "mul r6, r7\n\t"
  44335. #endif
  44336. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44337. "lsrs r7, r6, #16\n\t"
  44338. #else
  44339. "lsr r7, r6, #16\n\t"
  44340. #endif
  44341. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44342. "lsls r6, r6, #16\n\t"
  44343. #else
  44344. "lsl r6, r6, #16\n\t"
  44345. #endif
  44346. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44347. "adds r5, r5, r6\n\t"
  44348. #else
  44349. "add r5, r5, r6\n\t"
  44350. #endif
  44351. #ifdef WOLFSSL_KEIL
  44352. "adcs r3, r3, r7\n\t"
  44353. #elif defined(__clang__)
  44354. "adcs r3, r7\n\t"
  44355. #else
  44356. "adc r3, r7\n\t"
  44357. #endif
  44358. #ifdef WOLFSSL_KEIL
  44359. "adcs r4, r4, %[r]\n\t"
  44360. #elif defined(__clang__)
  44361. "adcs r4, %[r]\n\t"
  44362. #else
  44363. "adc r4, %[r]\n\t"
  44364. #endif
  44365. "# A[10] * B[4]\n\t"
  44366. "mov %[a], r9\n\t"
  44367. "mov %[b], r10\n\t"
  44368. "ldr %[a], [%[a], #40]\n\t"
  44369. "ldr %[b], [%[b], #16]\n\t"
  44370. "uxth r6, %[a]\n\t"
  44371. "uxth r7, %[b]\n\t"
  44372. #ifdef WOLFSSL_KEIL
  44373. "muls r7, r6, r7\n\t"
  44374. #elif defined(__clang__)
  44375. "muls r7, r6\n\t"
  44376. #else
  44377. "mul r7, r6\n\t"
  44378. #endif
  44379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44380. "adds r5, r5, r7\n\t"
  44381. #else
  44382. "add r5, r5, r7\n\t"
  44383. #endif
  44384. #ifdef WOLFSSL_KEIL
  44385. "adcs r3, r3, %[r]\n\t"
  44386. #elif defined(__clang__)
  44387. "adcs r3, %[r]\n\t"
  44388. #else
  44389. "adc r3, %[r]\n\t"
  44390. #endif
  44391. #ifdef WOLFSSL_KEIL
  44392. "adcs r4, r4, %[r]\n\t"
  44393. #elif defined(__clang__)
  44394. "adcs r4, %[r]\n\t"
  44395. #else
  44396. "adc r4, %[r]\n\t"
  44397. #endif
  44398. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44399. "lsrs r7, %[b], #16\n\t"
  44400. #else
  44401. "lsr r7, %[b], #16\n\t"
  44402. #endif
  44403. #ifdef WOLFSSL_KEIL
  44404. "muls r6, r7, r6\n\t"
  44405. #elif defined(__clang__)
  44406. "muls r6, r7\n\t"
  44407. #else
  44408. "mul r6, r7\n\t"
  44409. #endif
  44410. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44411. "lsrs r7, r6, #16\n\t"
  44412. #else
  44413. "lsr r7, r6, #16\n\t"
  44414. #endif
  44415. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44416. "lsls r6, r6, #16\n\t"
  44417. #else
  44418. "lsl r6, r6, #16\n\t"
  44419. #endif
  44420. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44421. "adds r5, r5, r6\n\t"
  44422. #else
  44423. "add r5, r5, r6\n\t"
  44424. #endif
  44425. #ifdef WOLFSSL_KEIL
  44426. "adcs r3, r3, r7\n\t"
  44427. #elif defined(__clang__)
  44428. "adcs r3, r7\n\t"
  44429. #else
  44430. "adc r3, r7\n\t"
  44431. #endif
  44432. #ifdef WOLFSSL_KEIL
  44433. "adcs r4, r4, %[r]\n\t"
  44434. #elif defined(__clang__)
  44435. "adcs r4, %[r]\n\t"
  44436. #else
  44437. "adc r4, %[r]\n\t"
  44438. #endif
  44439. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44440. "lsrs r6, %[a], #16\n\t"
  44441. #else
  44442. "lsr r6, %[a], #16\n\t"
  44443. #endif
  44444. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44445. "lsrs r7, %[b], #16\n\t"
  44446. #else
  44447. "lsr r7, %[b], #16\n\t"
  44448. #endif
  44449. #ifdef WOLFSSL_KEIL
  44450. "muls r7, r6, r7\n\t"
  44451. #elif defined(__clang__)
  44452. "muls r7, r6\n\t"
  44453. #else
  44454. "mul r7, r6\n\t"
  44455. #endif
  44456. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44457. "adds r3, r3, r7\n\t"
  44458. #else
  44459. "add r3, r3, r7\n\t"
  44460. #endif
  44461. #ifdef WOLFSSL_KEIL
  44462. "adcs r4, r4, %[r]\n\t"
  44463. #elif defined(__clang__)
  44464. "adcs r4, %[r]\n\t"
  44465. #else
  44466. "adc r4, %[r]\n\t"
  44467. #endif
  44468. "uxth r7, %[b]\n\t"
  44469. #ifdef WOLFSSL_KEIL
  44470. "muls r6, r7, r6\n\t"
  44471. #elif defined(__clang__)
  44472. "muls r6, r7\n\t"
  44473. #else
  44474. "mul r6, r7\n\t"
  44475. #endif
  44476. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44477. "lsrs r7, r6, #16\n\t"
  44478. #else
  44479. "lsr r7, r6, #16\n\t"
  44480. #endif
  44481. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44482. "lsls r6, r6, #16\n\t"
  44483. #else
  44484. "lsl r6, r6, #16\n\t"
  44485. #endif
  44486. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44487. "adds r5, r5, r6\n\t"
  44488. #else
  44489. "add r5, r5, r6\n\t"
  44490. #endif
  44491. #ifdef WOLFSSL_KEIL
  44492. "adcs r3, r3, r7\n\t"
  44493. #elif defined(__clang__)
  44494. "adcs r3, r7\n\t"
  44495. #else
  44496. "adc r3, r7\n\t"
  44497. #endif
  44498. #ifdef WOLFSSL_KEIL
  44499. "adcs r4, r4, %[r]\n\t"
  44500. #elif defined(__clang__)
  44501. "adcs r4, %[r]\n\t"
  44502. #else
  44503. "adc r4, %[r]\n\t"
  44504. #endif
  44505. "# A[9] * B[5]\n\t"
  44506. "mov %[a], r9\n\t"
  44507. "mov %[b], r10\n\t"
  44508. "ldr %[a], [%[a], #36]\n\t"
  44509. "ldr %[b], [%[b], #20]\n\t"
  44510. "uxth r6, %[a]\n\t"
  44511. "uxth r7, %[b]\n\t"
  44512. #ifdef WOLFSSL_KEIL
  44513. "muls r7, r6, r7\n\t"
  44514. #elif defined(__clang__)
  44515. "muls r7, r6\n\t"
  44516. #else
  44517. "mul r7, r6\n\t"
  44518. #endif
  44519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44520. "adds r5, r5, r7\n\t"
  44521. #else
  44522. "add r5, r5, r7\n\t"
  44523. #endif
  44524. #ifdef WOLFSSL_KEIL
  44525. "adcs r3, r3, %[r]\n\t"
  44526. #elif defined(__clang__)
  44527. "adcs r3, %[r]\n\t"
  44528. #else
  44529. "adc r3, %[r]\n\t"
  44530. #endif
  44531. #ifdef WOLFSSL_KEIL
  44532. "adcs r4, r4, %[r]\n\t"
  44533. #elif defined(__clang__)
  44534. "adcs r4, %[r]\n\t"
  44535. #else
  44536. "adc r4, %[r]\n\t"
  44537. #endif
  44538. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44539. "lsrs r7, %[b], #16\n\t"
  44540. #else
  44541. "lsr r7, %[b], #16\n\t"
  44542. #endif
  44543. #ifdef WOLFSSL_KEIL
  44544. "muls r6, r7, r6\n\t"
  44545. #elif defined(__clang__)
  44546. "muls r6, r7\n\t"
  44547. #else
  44548. "mul r6, r7\n\t"
  44549. #endif
  44550. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44551. "lsrs r7, r6, #16\n\t"
  44552. #else
  44553. "lsr r7, r6, #16\n\t"
  44554. #endif
  44555. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44556. "lsls r6, r6, #16\n\t"
  44557. #else
  44558. "lsl r6, r6, #16\n\t"
  44559. #endif
  44560. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44561. "adds r5, r5, r6\n\t"
  44562. #else
  44563. "add r5, r5, r6\n\t"
  44564. #endif
  44565. #ifdef WOLFSSL_KEIL
  44566. "adcs r3, r3, r7\n\t"
  44567. #elif defined(__clang__)
  44568. "adcs r3, r7\n\t"
  44569. #else
  44570. "adc r3, r7\n\t"
  44571. #endif
  44572. #ifdef WOLFSSL_KEIL
  44573. "adcs r4, r4, %[r]\n\t"
  44574. #elif defined(__clang__)
  44575. "adcs r4, %[r]\n\t"
  44576. #else
  44577. "adc r4, %[r]\n\t"
  44578. #endif
  44579. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44580. "lsrs r6, %[a], #16\n\t"
  44581. #else
  44582. "lsr r6, %[a], #16\n\t"
  44583. #endif
  44584. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44585. "lsrs r7, %[b], #16\n\t"
  44586. #else
  44587. "lsr r7, %[b], #16\n\t"
  44588. #endif
  44589. #ifdef WOLFSSL_KEIL
  44590. "muls r7, r6, r7\n\t"
  44591. #elif defined(__clang__)
  44592. "muls r7, r6\n\t"
  44593. #else
  44594. "mul r7, r6\n\t"
  44595. #endif
  44596. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44597. "adds r3, r3, r7\n\t"
  44598. #else
  44599. "add r3, r3, r7\n\t"
  44600. #endif
  44601. #ifdef WOLFSSL_KEIL
  44602. "adcs r4, r4, %[r]\n\t"
  44603. #elif defined(__clang__)
  44604. "adcs r4, %[r]\n\t"
  44605. #else
  44606. "adc r4, %[r]\n\t"
  44607. #endif
  44608. "uxth r7, %[b]\n\t"
  44609. #ifdef WOLFSSL_KEIL
  44610. "muls r6, r7, r6\n\t"
  44611. #elif defined(__clang__)
  44612. "muls r6, r7\n\t"
  44613. #else
  44614. "mul r6, r7\n\t"
  44615. #endif
  44616. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44617. "lsrs r7, r6, #16\n\t"
  44618. #else
  44619. "lsr r7, r6, #16\n\t"
  44620. #endif
  44621. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44622. "lsls r6, r6, #16\n\t"
  44623. #else
  44624. "lsl r6, r6, #16\n\t"
  44625. #endif
  44626. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44627. "adds r5, r5, r6\n\t"
  44628. #else
  44629. "add r5, r5, r6\n\t"
  44630. #endif
  44631. #ifdef WOLFSSL_KEIL
  44632. "adcs r3, r3, r7\n\t"
  44633. #elif defined(__clang__)
  44634. "adcs r3, r7\n\t"
  44635. #else
  44636. "adc r3, r7\n\t"
  44637. #endif
  44638. #ifdef WOLFSSL_KEIL
  44639. "adcs r4, r4, %[r]\n\t"
  44640. #elif defined(__clang__)
  44641. "adcs r4, %[r]\n\t"
  44642. #else
  44643. "adc r4, %[r]\n\t"
  44644. #endif
  44645. "# A[8] * B[6]\n\t"
  44646. "mov %[a], r9\n\t"
  44647. "mov %[b], r10\n\t"
  44648. "ldr %[a], [%[a], #32]\n\t"
  44649. "ldr %[b], [%[b], #24]\n\t"
  44650. "uxth r6, %[a]\n\t"
  44651. "uxth r7, %[b]\n\t"
  44652. #ifdef WOLFSSL_KEIL
  44653. "muls r7, r6, r7\n\t"
  44654. #elif defined(__clang__)
  44655. "muls r7, r6\n\t"
  44656. #else
  44657. "mul r7, r6\n\t"
  44658. #endif
  44659. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44660. "adds r5, r5, r7\n\t"
  44661. #else
  44662. "add r5, r5, r7\n\t"
  44663. #endif
  44664. #ifdef WOLFSSL_KEIL
  44665. "adcs r3, r3, %[r]\n\t"
  44666. #elif defined(__clang__)
  44667. "adcs r3, %[r]\n\t"
  44668. #else
  44669. "adc r3, %[r]\n\t"
  44670. #endif
  44671. #ifdef WOLFSSL_KEIL
  44672. "adcs r4, r4, %[r]\n\t"
  44673. #elif defined(__clang__)
  44674. "adcs r4, %[r]\n\t"
  44675. #else
  44676. "adc r4, %[r]\n\t"
  44677. #endif
  44678. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44679. "lsrs r7, %[b], #16\n\t"
  44680. #else
  44681. "lsr r7, %[b], #16\n\t"
  44682. #endif
  44683. #ifdef WOLFSSL_KEIL
  44684. "muls r6, r7, r6\n\t"
  44685. #elif defined(__clang__)
  44686. "muls r6, r7\n\t"
  44687. #else
  44688. "mul r6, r7\n\t"
  44689. #endif
  44690. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44691. "lsrs r7, r6, #16\n\t"
  44692. #else
  44693. "lsr r7, r6, #16\n\t"
  44694. #endif
  44695. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44696. "lsls r6, r6, #16\n\t"
  44697. #else
  44698. "lsl r6, r6, #16\n\t"
  44699. #endif
  44700. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44701. "adds r5, r5, r6\n\t"
  44702. #else
  44703. "add r5, r5, r6\n\t"
  44704. #endif
  44705. #ifdef WOLFSSL_KEIL
  44706. "adcs r3, r3, r7\n\t"
  44707. #elif defined(__clang__)
  44708. "adcs r3, r7\n\t"
  44709. #else
  44710. "adc r3, r7\n\t"
  44711. #endif
  44712. #ifdef WOLFSSL_KEIL
  44713. "adcs r4, r4, %[r]\n\t"
  44714. #elif defined(__clang__)
  44715. "adcs r4, %[r]\n\t"
  44716. #else
  44717. "adc r4, %[r]\n\t"
  44718. #endif
  44719. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44720. "lsrs r6, %[a], #16\n\t"
  44721. #else
  44722. "lsr r6, %[a], #16\n\t"
  44723. #endif
  44724. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44725. "lsrs r7, %[b], #16\n\t"
  44726. #else
  44727. "lsr r7, %[b], #16\n\t"
  44728. #endif
  44729. #ifdef WOLFSSL_KEIL
  44730. "muls r7, r6, r7\n\t"
  44731. #elif defined(__clang__)
  44732. "muls r7, r6\n\t"
  44733. #else
  44734. "mul r7, r6\n\t"
  44735. #endif
  44736. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44737. "adds r3, r3, r7\n\t"
  44738. #else
  44739. "add r3, r3, r7\n\t"
  44740. #endif
  44741. #ifdef WOLFSSL_KEIL
  44742. "adcs r4, r4, %[r]\n\t"
  44743. #elif defined(__clang__)
  44744. "adcs r4, %[r]\n\t"
  44745. #else
  44746. "adc r4, %[r]\n\t"
  44747. #endif
  44748. "uxth r7, %[b]\n\t"
  44749. #ifdef WOLFSSL_KEIL
  44750. "muls r6, r7, r6\n\t"
  44751. #elif defined(__clang__)
  44752. "muls r6, r7\n\t"
  44753. #else
  44754. "mul r6, r7\n\t"
  44755. #endif
  44756. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44757. "lsrs r7, r6, #16\n\t"
  44758. #else
  44759. "lsr r7, r6, #16\n\t"
  44760. #endif
  44761. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44762. "lsls r6, r6, #16\n\t"
  44763. #else
  44764. "lsl r6, r6, #16\n\t"
  44765. #endif
  44766. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44767. "adds r5, r5, r6\n\t"
  44768. #else
  44769. "add r5, r5, r6\n\t"
  44770. #endif
  44771. #ifdef WOLFSSL_KEIL
  44772. "adcs r3, r3, r7\n\t"
  44773. #elif defined(__clang__)
  44774. "adcs r3, r7\n\t"
  44775. #else
  44776. "adc r3, r7\n\t"
  44777. #endif
  44778. #ifdef WOLFSSL_KEIL
  44779. "adcs r4, r4, %[r]\n\t"
  44780. #elif defined(__clang__)
  44781. "adcs r4, %[r]\n\t"
  44782. #else
  44783. "adc r4, %[r]\n\t"
  44784. #endif
  44785. "# A[7] * B[7]\n\t"
  44786. "mov %[a], r9\n\t"
  44787. "mov %[b], r10\n\t"
  44788. "ldr %[a], [%[a], #28]\n\t"
  44789. "ldr %[b], [%[b], #28]\n\t"
  44790. "uxth r6, %[a]\n\t"
  44791. "uxth r7, %[b]\n\t"
  44792. #ifdef WOLFSSL_KEIL
  44793. "muls r7, r6, r7\n\t"
  44794. #elif defined(__clang__)
  44795. "muls r7, r6\n\t"
  44796. #else
  44797. "mul r7, r6\n\t"
  44798. #endif
  44799. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44800. "adds r5, r5, r7\n\t"
  44801. #else
  44802. "add r5, r5, r7\n\t"
  44803. #endif
  44804. #ifdef WOLFSSL_KEIL
  44805. "adcs r3, r3, %[r]\n\t"
  44806. #elif defined(__clang__)
  44807. "adcs r3, %[r]\n\t"
  44808. #else
  44809. "adc r3, %[r]\n\t"
  44810. #endif
  44811. #ifdef WOLFSSL_KEIL
  44812. "adcs r4, r4, %[r]\n\t"
  44813. #elif defined(__clang__)
  44814. "adcs r4, %[r]\n\t"
  44815. #else
  44816. "adc r4, %[r]\n\t"
  44817. #endif
  44818. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44819. "lsrs r7, %[b], #16\n\t"
  44820. #else
  44821. "lsr r7, %[b], #16\n\t"
  44822. #endif
  44823. #ifdef WOLFSSL_KEIL
  44824. "muls r6, r7, r6\n\t"
  44825. #elif defined(__clang__)
  44826. "muls r6, r7\n\t"
  44827. #else
  44828. "mul r6, r7\n\t"
  44829. #endif
  44830. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44831. "lsrs r7, r6, #16\n\t"
  44832. #else
  44833. "lsr r7, r6, #16\n\t"
  44834. #endif
  44835. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44836. "lsls r6, r6, #16\n\t"
  44837. #else
  44838. "lsl r6, r6, #16\n\t"
  44839. #endif
  44840. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44841. "adds r5, r5, r6\n\t"
  44842. #else
  44843. "add r5, r5, r6\n\t"
  44844. #endif
  44845. #ifdef WOLFSSL_KEIL
  44846. "adcs r3, r3, r7\n\t"
  44847. #elif defined(__clang__)
  44848. "adcs r3, r7\n\t"
  44849. #else
  44850. "adc r3, r7\n\t"
  44851. #endif
  44852. #ifdef WOLFSSL_KEIL
  44853. "adcs r4, r4, %[r]\n\t"
  44854. #elif defined(__clang__)
  44855. "adcs r4, %[r]\n\t"
  44856. #else
  44857. "adc r4, %[r]\n\t"
  44858. #endif
  44859. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44860. "lsrs r6, %[a], #16\n\t"
  44861. #else
  44862. "lsr r6, %[a], #16\n\t"
  44863. #endif
  44864. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44865. "lsrs r7, %[b], #16\n\t"
  44866. #else
  44867. "lsr r7, %[b], #16\n\t"
  44868. #endif
  44869. #ifdef WOLFSSL_KEIL
  44870. "muls r7, r6, r7\n\t"
  44871. #elif defined(__clang__)
  44872. "muls r7, r6\n\t"
  44873. #else
  44874. "mul r7, r6\n\t"
  44875. #endif
  44876. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44877. "adds r3, r3, r7\n\t"
  44878. #else
  44879. "add r3, r3, r7\n\t"
  44880. #endif
  44881. #ifdef WOLFSSL_KEIL
  44882. "adcs r4, r4, %[r]\n\t"
  44883. #elif defined(__clang__)
  44884. "adcs r4, %[r]\n\t"
  44885. #else
  44886. "adc r4, %[r]\n\t"
  44887. #endif
  44888. "uxth r7, %[b]\n\t"
  44889. #ifdef WOLFSSL_KEIL
  44890. "muls r6, r7, r6\n\t"
  44891. #elif defined(__clang__)
  44892. "muls r6, r7\n\t"
  44893. #else
  44894. "mul r6, r7\n\t"
  44895. #endif
  44896. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44897. "lsrs r7, r6, #16\n\t"
  44898. #else
  44899. "lsr r7, r6, #16\n\t"
  44900. #endif
  44901. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44902. "lsls r6, r6, #16\n\t"
  44903. #else
  44904. "lsl r6, r6, #16\n\t"
  44905. #endif
  44906. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44907. "adds r5, r5, r6\n\t"
  44908. #else
  44909. "add r5, r5, r6\n\t"
  44910. #endif
  44911. #ifdef WOLFSSL_KEIL
  44912. "adcs r3, r3, r7\n\t"
  44913. #elif defined(__clang__)
  44914. "adcs r3, r7\n\t"
  44915. #else
  44916. "adc r3, r7\n\t"
  44917. #endif
  44918. #ifdef WOLFSSL_KEIL
  44919. "adcs r4, r4, %[r]\n\t"
  44920. #elif defined(__clang__)
  44921. "adcs r4, %[r]\n\t"
  44922. #else
  44923. "adc r4, %[r]\n\t"
  44924. #endif
  44925. "# A[6] * B[8]\n\t"
  44926. "mov %[a], r9\n\t"
  44927. "mov %[b], r10\n\t"
  44928. "ldr %[a], [%[a], #24]\n\t"
  44929. "ldr %[b], [%[b], #32]\n\t"
  44930. "uxth r6, %[a]\n\t"
  44931. "uxth r7, %[b]\n\t"
  44932. #ifdef WOLFSSL_KEIL
  44933. "muls r7, r6, r7\n\t"
  44934. #elif defined(__clang__)
  44935. "muls r7, r6\n\t"
  44936. #else
  44937. "mul r7, r6\n\t"
  44938. #endif
  44939. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44940. "adds r5, r5, r7\n\t"
  44941. #else
  44942. "add r5, r5, r7\n\t"
  44943. #endif
  44944. #ifdef WOLFSSL_KEIL
  44945. "adcs r3, r3, %[r]\n\t"
  44946. #elif defined(__clang__)
  44947. "adcs r3, %[r]\n\t"
  44948. #else
  44949. "adc r3, %[r]\n\t"
  44950. #endif
  44951. #ifdef WOLFSSL_KEIL
  44952. "adcs r4, r4, %[r]\n\t"
  44953. #elif defined(__clang__)
  44954. "adcs r4, %[r]\n\t"
  44955. #else
  44956. "adc r4, %[r]\n\t"
  44957. #endif
  44958. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44959. "lsrs r7, %[b], #16\n\t"
  44960. #else
  44961. "lsr r7, %[b], #16\n\t"
  44962. #endif
  44963. #ifdef WOLFSSL_KEIL
  44964. "muls r6, r7, r6\n\t"
  44965. #elif defined(__clang__)
  44966. "muls r6, r7\n\t"
  44967. #else
  44968. "mul r6, r7\n\t"
  44969. #endif
  44970. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44971. "lsrs r7, r6, #16\n\t"
  44972. #else
  44973. "lsr r7, r6, #16\n\t"
  44974. #endif
  44975. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44976. "lsls r6, r6, #16\n\t"
  44977. #else
  44978. "lsl r6, r6, #16\n\t"
  44979. #endif
  44980. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44981. "adds r5, r5, r6\n\t"
  44982. #else
  44983. "add r5, r5, r6\n\t"
  44984. #endif
  44985. #ifdef WOLFSSL_KEIL
  44986. "adcs r3, r3, r7\n\t"
  44987. #elif defined(__clang__)
  44988. "adcs r3, r7\n\t"
  44989. #else
  44990. "adc r3, r7\n\t"
  44991. #endif
  44992. #ifdef WOLFSSL_KEIL
  44993. "adcs r4, r4, %[r]\n\t"
  44994. #elif defined(__clang__)
  44995. "adcs r4, %[r]\n\t"
  44996. #else
  44997. "adc r4, %[r]\n\t"
  44998. #endif
  44999. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45000. "lsrs r6, %[a], #16\n\t"
  45001. #else
  45002. "lsr r6, %[a], #16\n\t"
  45003. #endif
  45004. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45005. "lsrs r7, %[b], #16\n\t"
  45006. #else
  45007. "lsr r7, %[b], #16\n\t"
  45008. #endif
  45009. #ifdef WOLFSSL_KEIL
  45010. "muls r7, r6, r7\n\t"
  45011. #elif defined(__clang__)
  45012. "muls r7, r6\n\t"
  45013. #else
  45014. "mul r7, r6\n\t"
  45015. #endif
  45016. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45017. "adds r3, r3, r7\n\t"
  45018. #else
  45019. "add r3, r3, r7\n\t"
  45020. #endif
  45021. #ifdef WOLFSSL_KEIL
  45022. "adcs r4, r4, %[r]\n\t"
  45023. #elif defined(__clang__)
  45024. "adcs r4, %[r]\n\t"
  45025. #else
  45026. "adc r4, %[r]\n\t"
  45027. #endif
  45028. "uxth r7, %[b]\n\t"
  45029. #ifdef WOLFSSL_KEIL
  45030. "muls r6, r7, r6\n\t"
  45031. #elif defined(__clang__)
  45032. "muls r6, r7\n\t"
  45033. #else
  45034. "mul r6, r7\n\t"
  45035. #endif
  45036. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45037. "lsrs r7, r6, #16\n\t"
  45038. #else
  45039. "lsr r7, r6, #16\n\t"
  45040. #endif
  45041. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45042. "lsls r6, r6, #16\n\t"
  45043. #else
  45044. "lsl r6, r6, #16\n\t"
  45045. #endif
  45046. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45047. "adds r5, r5, r6\n\t"
  45048. #else
  45049. "add r5, r5, r6\n\t"
  45050. #endif
  45051. #ifdef WOLFSSL_KEIL
  45052. "adcs r3, r3, r7\n\t"
  45053. #elif defined(__clang__)
  45054. "adcs r3, r7\n\t"
  45055. #else
  45056. "adc r3, r7\n\t"
  45057. #endif
  45058. #ifdef WOLFSSL_KEIL
  45059. "adcs r4, r4, %[r]\n\t"
  45060. #elif defined(__clang__)
  45061. "adcs r4, %[r]\n\t"
  45062. #else
  45063. "adc r4, %[r]\n\t"
  45064. #endif
  45065. "# A[5] * B[9]\n\t"
  45066. "mov %[a], r9\n\t"
  45067. "mov %[b], r10\n\t"
  45068. "ldr %[a], [%[a], #20]\n\t"
  45069. "ldr %[b], [%[b], #36]\n\t"
  45070. "uxth r6, %[a]\n\t"
  45071. "uxth r7, %[b]\n\t"
  45072. #ifdef WOLFSSL_KEIL
  45073. "muls r7, r6, r7\n\t"
  45074. #elif defined(__clang__)
  45075. "muls r7, r6\n\t"
  45076. #else
  45077. "mul r7, r6\n\t"
  45078. #endif
  45079. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45080. "adds r5, r5, r7\n\t"
  45081. #else
  45082. "add r5, r5, r7\n\t"
  45083. #endif
  45084. #ifdef WOLFSSL_KEIL
  45085. "adcs r3, r3, %[r]\n\t"
  45086. #elif defined(__clang__)
  45087. "adcs r3, %[r]\n\t"
  45088. #else
  45089. "adc r3, %[r]\n\t"
  45090. #endif
  45091. #ifdef WOLFSSL_KEIL
  45092. "adcs r4, r4, %[r]\n\t"
  45093. #elif defined(__clang__)
  45094. "adcs r4, %[r]\n\t"
  45095. #else
  45096. "adc r4, %[r]\n\t"
  45097. #endif
  45098. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45099. "lsrs r7, %[b], #16\n\t"
  45100. #else
  45101. "lsr r7, %[b], #16\n\t"
  45102. #endif
  45103. #ifdef WOLFSSL_KEIL
  45104. "muls r6, r7, r6\n\t"
  45105. #elif defined(__clang__)
  45106. "muls r6, r7\n\t"
  45107. #else
  45108. "mul r6, r7\n\t"
  45109. #endif
  45110. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45111. "lsrs r7, r6, #16\n\t"
  45112. #else
  45113. "lsr r7, r6, #16\n\t"
  45114. #endif
  45115. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45116. "lsls r6, r6, #16\n\t"
  45117. #else
  45118. "lsl r6, r6, #16\n\t"
  45119. #endif
  45120. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45121. "adds r5, r5, r6\n\t"
  45122. #else
  45123. "add r5, r5, r6\n\t"
  45124. #endif
  45125. #ifdef WOLFSSL_KEIL
  45126. "adcs r3, r3, r7\n\t"
  45127. #elif defined(__clang__)
  45128. "adcs r3, r7\n\t"
  45129. #else
  45130. "adc r3, r7\n\t"
  45131. #endif
  45132. #ifdef WOLFSSL_KEIL
  45133. "adcs r4, r4, %[r]\n\t"
  45134. #elif defined(__clang__)
  45135. "adcs r4, %[r]\n\t"
  45136. #else
  45137. "adc r4, %[r]\n\t"
  45138. #endif
  45139. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45140. "lsrs r6, %[a], #16\n\t"
  45141. #else
  45142. "lsr r6, %[a], #16\n\t"
  45143. #endif
  45144. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45145. "lsrs r7, %[b], #16\n\t"
  45146. #else
  45147. "lsr r7, %[b], #16\n\t"
  45148. #endif
  45149. #ifdef WOLFSSL_KEIL
  45150. "muls r7, r6, r7\n\t"
  45151. #elif defined(__clang__)
  45152. "muls r7, r6\n\t"
  45153. #else
  45154. "mul r7, r6\n\t"
  45155. #endif
  45156. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45157. "adds r3, r3, r7\n\t"
  45158. #else
  45159. "add r3, r3, r7\n\t"
  45160. #endif
  45161. #ifdef WOLFSSL_KEIL
  45162. "adcs r4, r4, %[r]\n\t"
  45163. #elif defined(__clang__)
  45164. "adcs r4, %[r]\n\t"
  45165. #else
  45166. "adc r4, %[r]\n\t"
  45167. #endif
  45168. "uxth r7, %[b]\n\t"
  45169. #ifdef WOLFSSL_KEIL
  45170. "muls r6, r7, r6\n\t"
  45171. #elif defined(__clang__)
  45172. "muls r6, r7\n\t"
  45173. #else
  45174. "mul r6, r7\n\t"
  45175. #endif
  45176. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45177. "lsrs r7, r6, #16\n\t"
  45178. #else
  45179. "lsr r7, r6, #16\n\t"
  45180. #endif
  45181. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45182. "lsls r6, r6, #16\n\t"
  45183. #else
  45184. "lsl r6, r6, #16\n\t"
  45185. #endif
  45186. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45187. "adds r5, r5, r6\n\t"
  45188. #else
  45189. "add r5, r5, r6\n\t"
  45190. #endif
  45191. #ifdef WOLFSSL_KEIL
  45192. "adcs r3, r3, r7\n\t"
  45193. #elif defined(__clang__)
  45194. "adcs r3, r7\n\t"
  45195. #else
  45196. "adc r3, r7\n\t"
  45197. #endif
  45198. #ifdef WOLFSSL_KEIL
  45199. "adcs r4, r4, %[r]\n\t"
  45200. #elif defined(__clang__)
  45201. "adcs r4, %[r]\n\t"
  45202. #else
  45203. "adc r4, %[r]\n\t"
  45204. #endif
  45205. "# A[4] * B[10]\n\t"
  45206. "mov %[a], r9\n\t"
  45207. "mov %[b], r10\n\t"
  45208. "ldr %[a], [%[a], #16]\n\t"
  45209. "ldr %[b], [%[b], #40]\n\t"
  45210. "uxth r6, %[a]\n\t"
  45211. "uxth r7, %[b]\n\t"
  45212. #ifdef WOLFSSL_KEIL
  45213. "muls r7, r6, r7\n\t"
  45214. #elif defined(__clang__)
  45215. "muls r7, r6\n\t"
  45216. #else
  45217. "mul r7, r6\n\t"
  45218. #endif
  45219. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45220. "adds r5, r5, r7\n\t"
  45221. #else
  45222. "add r5, r5, r7\n\t"
  45223. #endif
  45224. #ifdef WOLFSSL_KEIL
  45225. "adcs r3, r3, %[r]\n\t"
  45226. #elif defined(__clang__)
  45227. "adcs r3, %[r]\n\t"
  45228. #else
  45229. "adc r3, %[r]\n\t"
  45230. #endif
  45231. #ifdef WOLFSSL_KEIL
  45232. "adcs r4, r4, %[r]\n\t"
  45233. #elif defined(__clang__)
  45234. "adcs r4, %[r]\n\t"
  45235. #else
  45236. "adc r4, %[r]\n\t"
  45237. #endif
  45238. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45239. "lsrs r7, %[b], #16\n\t"
  45240. #else
  45241. "lsr r7, %[b], #16\n\t"
  45242. #endif
  45243. #ifdef WOLFSSL_KEIL
  45244. "muls r6, r7, r6\n\t"
  45245. #elif defined(__clang__)
  45246. "muls r6, r7\n\t"
  45247. #else
  45248. "mul r6, r7\n\t"
  45249. #endif
  45250. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45251. "lsrs r7, r6, #16\n\t"
  45252. #else
  45253. "lsr r7, r6, #16\n\t"
  45254. #endif
  45255. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45256. "lsls r6, r6, #16\n\t"
  45257. #else
  45258. "lsl r6, r6, #16\n\t"
  45259. #endif
  45260. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45261. "adds r5, r5, r6\n\t"
  45262. #else
  45263. "add r5, r5, r6\n\t"
  45264. #endif
  45265. #ifdef WOLFSSL_KEIL
  45266. "adcs r3, r3, r7\n\t"
  45267. #elif defined(__clang__)
  45268. "adcs r3, r7\n\t"
  45269. #else
  45270. "adc r3, r7\n\t"
  45271. #endif
  45272. #ifdef WOLFSSL_KEIL
  45273. "adcs r4, r4, %[r]\n\t"
  45274. #elif defined(__clang__)
  45275. "adcs r4, %[r]\n\t"
  45276. #else
  45277. "adc r4, %[r]\n\t"
  45278. #endif
  45279. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45280. "lsrs r6, %[a], #16\n\t"
  45281. #else
  45282. "lsr r6, %[a], #16\n\t"
  45283. #endif
  45284. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45285. "lsrs r7, %[b], #16\n\t"
  45286. #else
  45287. "lsr r7, %[b], #16\n\t"
  45288. #endif
  45289. #ifdef WOLFSSL_KEIL
  45290. "muls r7, r6, r7\n\t"
  45291. #elif defined(__clang__)
  45292. "muls r7, r6\n\t"
  45293. #else
  45294. "mul r7, r6\n\t"
  45295. #endif
  45296. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45297. "adds r3, r3, r7\n\t"
  45298. #else
  45299. "add r3, r3, r7\n\t"
  45300. #endif
  45301. #ifdef WOLFSSL_KEIL
  45302. "adcs r4, r4, %[r]\n\t"
  45303. #elif defined(__clang__)
  45304. "adcs r4, %[r]\n\t"
  45305. #else
  45306. "adc r4, %[r]\n\t"
  45307. #endif
  45308. "uxth r7, %[b]\n\t"
  45309. #ifdef WOLFSSL_KEIL
  45310. "muls r6, r7, r6\n\t"
  45311. #elif defined(__clang__)
  45312. "muls r6, r7\n\t"
  45313. #else
  45314. "mul r6, r7\n\t"
  45315. #endif
  45316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45317. "lsrs r7, r6, #16\n\t"
  45318. #else
  45319. "lsr r7, r6, #16\n\t"
  45320. #endif
  45321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45322. "lsls r6, r6, #16\n\t"
  45323. #else
  45324. "lsl r6, r6, #16\n\t"
  45325. #endif
  45326. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45327. "adds r5, r5, r6\n\t"
  45328. #else
  45329. "add r5, r5, r6\n\t"
  45330. #endif
  45331. #ifdef WOLFSSL_KEIL
  45332. "adcs r3, r3, r7\n\t"
  45333. #elif defined(__clang__)
  45334. "adcs r3, r7\n\t"
  45335. #else
  45336. "adc r3, r7\n\t"
  45337. #endif
  45338. #ifdef WOLFSSL_KEIL
  45339. "adcs r4, r4, %[r]\n\t"
  45340. #elif defined(__clang__)
  45341. "adcs r4, %[r]\n\t"
  45342. #else
  45343. "adc r4, %[r]\n\t"
  45344. #endif
  45345. "# A[3] * B[11]\n\t"
  45346. "mov %[a], r9\n\t"
  45347. "mov %[b], r10\n\t"
  45348. "ldr %[a], [%[a], #12]\n\t"
  45349. "ldr %[b], [%[b], #44]\n\t"
  45350. "uxth r6, %[a]\n\t"
  45351. "uxth r7, %[b]\n\t"
  45352. #ifdef WOLFSSL_KEIL
  45353. "muls r7, r6, r7\n\t"
  45354. #elif defined(__clang__)
  45355. "muls r7, r6\n\t"
  45356. #else
  45357. "mul r7, r6\n\t"
  45358. #endif
  45359. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45360. "adds r5, r5, r7\n\t"
  45361. #else
  45362. "add r5, r5, r7\n\t"
  45363. #endif
  45364. #ifdef WOLFSSL_KEIL
  45365. "adcs r3, r3, %[r]\n\t"
  45366. #elif defined(__clang__)
  45367. "adcs r3, %[r]\n\t"
  45368. #else
  45369. "adc r3, %[r]\n\t"
  45370. #endif
  45371. #ifdef WOLFSSL_KEIL
  45372. "adcs r4, r4, %[r]\n\t"
  45373. #elif defined(__clang__)
  45374. "adcs r4, %[r]\n\t"
  45375. #else
  45376. "adc r4, %[r]\n\t"
  45377. #endif
  45378. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45379. "lsrs r7, %[b], #16\n\t"
  45380. #else
  45381. "lsr r7, %[b], #16\n\t"
  45382. #endif
  45383. #ifdef WOLFSSL_KEIL
  45384. "muls r6, r7, r6\n\t"
  45385. #elif defined(__clang__)
  45386. "muls r6, r7\n\t"
  45387. #else
  45388. "mul r6, r7\n\t"
  45389. #endif
  45390. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45391. "lsrs r7, r6, #16\n\t"
  45392. #else
  45393. "lsr r7, r6, #16\n\t"
  45394. #endif
  45395. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45396. "lsls r6, r6, #16\n\t"
  45397. #else
  45398. "lsl r6, r6, #16\n\t"
  45399. #endif
  45400. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45401. "adds r5, r5, r6\n\t"
  45402. #else
  45403. "add r5, r5, r6\n\t"
  45404. #endif
  45405. #ifdef WOLFSSL_KEIL
  45406. "adcs r3, r3, r7\n\t"
  45407. #elif defined(__clang__)
  45408. "adcs r3, r7\n\t"
  45409. #else
  45410. "adc r3, r7\n\t"
  45411. #endif
  45412. #ifdef WOLFSSL_KEIL
  45413. "adcs r4, r4, %[r]\n\t"
  45414. #elif defined(__clang__)
  45415. "adcs r4, %[r]\n\t"
  45416. #else
  45417. "adc r4, %[r]\n\t"
  45418. #endif
  45419. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45420. "lsrs r6, %[a], #16\n\t"
  45421. #else
  45422. "lsr r6, %[a], #16\n\t"
  45423. #endif
  45424. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45425. "lsrs r7, %[b], #16\n\t"
  45426. #else
  45427. "lsr r7, %[b], #16\n\t"
  45428. #endif
  45429. #ifdef WOLFSSL_KEIL
  45430. "muls r7, r6, r7\n\t"
  45431. #elif defined(__clang__)
  45432. "muls r7, r6\n\t"
  45433. #else
  45434. "mul r7, r6\n\t"
  45435. #endif
  45436. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45437. "adds r3, r3, r7\n\t"
  45438. #else
  45439. "add r3, r3, r7\n\t"
  45440. #endif
  45441. #ifdef WOLFSSL_KEIL
  45442. "adcs r4, r4, %[r]\n\t"
  45443. #elif defined(__clang__)
  45444. "adcs r4, %[r]\n\t"
  45445. #else
  45446. "adc r4, %[r]\n\t"
  45447. #endif
  45448. "uxth r7, %[b]\n\t"
  45449. #ifdef WOLFSSL_KEIL
  45450. "muls r6, r7, r6\n\t"
  45451. #elif defined(__clang__)
  45452. "muls r6, r7\n\t"
  45453. #else
  45454. "mul r6, r7\n\t"
  45455. #endif
  45456. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45457. "lsrs r7, r6, #16\n\t"
  45458. #else
  45459. "lsr r7, r6, #16\n\t"
  45460. #endif
  45461. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45462. "lsls r6, r6, #16\n\t"
  45463. #else
  45464. "lsl r6, r6, #16\n\t"
  45465. #endif
  45466. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45467. "adds r5, r5, r6\n\t"
  45468. #else
  45469. "add r5, r5, r6\n\t"
  45470. #endif
  45471. #ifdef WOLFSSL_KEIL
  45472. "adcs r3, r3, r7\n\t"
  45473. #elif defined(__clang__)
  45474. "adcs r3, r7\n\t"
  45475. #else
  45476. "adc r3, r7\n\t"
  45477. #endif
  45478. #ifdef WOLFSSL_KEIL
  45479. "adcs r4, r4, %[r]\n\t"
  45480. #elif defined(__clang__)
  45481. "adcs r4, %[r]\n\t"
  45482. #else
  45483. "adc r4, %[r]\n\t"
  45484. #endif
  45485. "mov %[r], r8\n\t"
  45486. "str r5, [%[r], #56]\n\t"
  45487. "movs %[r], #0\n\t"
  45488. "# A[4] * B[11]\n\t"
  45489. "movs r5, #0\n\t"
  45490. "mov %[a], r9\n\t"
  45491. "mov %[b], r10\n\t"
  45492. "ldr %[a], [%[a], #16]\n\t"
  45493. "ldr %[b], [%[b], #44]\n\t"
  45494. "uxth r6, %[a]\n\t"
  45495. "uxth r7, %[b]\n\t"
  45496. #ifdef WOLFSSL_KEIL
  45497. "muls r7, r6, r7\n\t"
  45498. #elif defined(__clang__)
  45499. "muls r7, r6\n\t"
  45500. #else
  45501. "mul r7, r6\n\t"
  45502. #endif
  45503. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45504. "adds r3, r3, r7\n\t"
  45505. #else
  45506. "add r3, r3, r7\n\t"
  45507. #endif
  45508. #ifdef WOLFSSL_KEIL
  45509. "adcs r4, r4, %[r]\n\t"
  45510. #elif defined(__clang__)
  45511. "adcs r4, %[r]\n\t"
  45512. #else
  45513. "adc r4, %[r]\n\t"
  45514. #endif
  45515. #ifdef WOLFSSL_KEIL
  45516. "adcs r5, r5, %[r]\n\t"
  45517. #elif defined(__clang__)
  45518. "adcs r5, %[r]\n\t"
  45519. #else
  45520. "adc r5, %[r]\n\t"
  45521. #endif
  45522. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45523. "lsrs r7, %[b], #16\n\t"
  45524. #else
  45525. "lsr r7, %[b], #16\n\t"
  45526. #endif
  45527. #ifdef WOLFSSL_KEIL
  45528. "muls r6, r7, r6\n\t"
  45529. #elif defined(__clang__)
  45530. "muls r6, r7\n\t"
  45531. #else
  45532. "mul r6, r7\n\t"
  45533. #endif
  45534. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45535. "lsrs r7, r6, #16\n\t"
  45536. #else
  45537. "lsr r7, r6, #16\n\t"
  45538. #endif
  45539. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45540. "lsls r6, r6, #16\n\t"
  45541. #else
  45542. "lsl r6, r6, #16\n\t"
  45543. #endif
  45544. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45545. "adds r3, r3, r6\n\t"
  45546. #else
  45547. "add r3, r3, r6\n\t"
  45548. #endif
  45549. #ifdef WOLFSSL_KEIL
  45550. "adcs r4, r4, r7\n\t"
  45551. #elif defined(__clang__)
  45552. "adcs r4, r7\n\t"
  45553. #else
  45554. "adc r4, r7\n\t"
  45555. #endif
  45556. #ifdef WOLFSSL_KEIL
  45557. "adcs r5, r5, %[r]\n\t"
  45558. #elif defined(__clang__)
  45559. "adcs r5, %[r]\n\t"
  45560. #else
  45561. "adc r5, %[r]\n\t"
  45562. #endif
  45563. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45564. "lsrs r6, %[a], #16\n\t"
  45565. #else
  45566. "lsr r6, %[a], #16\n\t"
  45567. #endif
  45568. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45569. "lsrs r7, %[b], #16\n\t"
  45570. #else
  45571. "lsr r7, %[b], #16\n\t"
  45572. #endif
  45573. #ifdef WOLFSSL_KEIL
  45574. "muls r7, r6, r7\n\t"
  45575. #elif defined(__clang__)
  45576. "muls r7, r6\n\t"
  45577. #else
  45578. "mul r7, r6\n\t"
  45579. #endif
  45580. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45581. "adds r4, r4, r7\n\t"
  45582. #else
  45583. "add r4, r4, r7\n\t"
  45584. #endif
  45585. #ifdef WOLFSSL_KEIL
  45586. "adcs r5, r5, %[r]\n\t"
  45587. #elif defined(__clang__)
  45588. "adcs r5, %[r]\n\t"
  45589. #else
  45590. "adc r5, %[r]\n\t"
  45591. #endif
  45592. "uxth r7, %[b]\n\t"
  45593. #ifdef WOLFSSL_KEIL
  45594. "muls r6, r7, r6\n\t"
  45595. #elif defined(__clang__)
  45596. "muls r6, r7\n\t"
  45597. #else
  45598. "mul r6, r7\n\t"
  45599. #endif
  45600. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45601. "lsrs r7, r6, #16\n\t"
  45602. #else
  45603. "lsr r7, r6, #16\n\t"
  45604. #endif
  45605. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45606. "lsls r6, r6, #16\n\t"
  45607. #else
  45608. "lsl r6, r6, #16\n\t"
  45609. #endif
  45610. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45611. "adds r3, r3, r6\n\t"
  45612. #else
  45613. "add r3, r3, r6\n\t"
  45614. #endif
  45615. #ifdef WOLFSSL_KEIL
  45616. "adcs r4, r4, r7\n\t"
  45617. #elif defined(__clang__)
  45618. "adcs r4, r7\n\t"
  45619. #else
  45620. "adc r4, r7\n\t"
  45621. #endif
  45622. #ifdef WOLFSSL_KEIL
  45623. "adcs r5, r5, %[r]\n\t"
  45624. #elif defined(__clang__)
  45625. "adcs r5, %[r]\n\t"
  45626. #else
  45627. "adc r5, %[r]\n\t"
  45628. #endif
  45629. "# A[5] * B[10]\n\t"
  45630. "mov %[a], r9\n\t"
  45631. "mov %[b], r10\n\t"
  45632. "ldr %[a], [%[a], #20]\n\t"
  45633. "ldr %[b], [%[b], #40]\n\t"
  45634. "uxth r6, %[a]\n\t"
  45635. "uxth r7, %[b]\n\t"
  45636. #ifdef WOLFSSL_KEIL
  45637. "muls r7, r6, r7\n\t"
  45638. #elif defined(__clang__)
  45639. "muls r7, r6\n\t"
  45640. #else
  45641. "mul r7, r6\n\t"
  45642. #endif
  45643. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45644. "adds r3, r3, r7\n\t"
  45645. #else
  45646. "add r3, r3, r7\n\t"
  45647. #endif
  45648. #ifdef WOLFSSL_KEIL
  45649. "adcs r4, r4, %[r]\n\t"
  45650. #elif defined(__clang__)
  45651. "adcs r4, %[r]\n\t"
  45652. #else
  45653. "adc r4, %[r]\n\t"
  45654. #endif
  45655. #ifdef WOLFSSL_KEIL
  45656. "adcs r5, r5, %[r]\n\t"
  45657. #elif defined(__clang__)
  45658. "adcs r5, %[r]\n\t"
  45659. #else
  45660. "adc r5, %[r]\n\t"
  45661. #endif
  45662. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45663. "lsrs r7, %[b], #16\n\t"
  45664. #else
  45665. "lsr r7, %[b], #16\n\t"
  45666. #endif
  45667. #ifdef WOLFSSL_KEIL
  45668. "muls r6, r7, r6\n\t"
  45669. #elif defined(__clang__)
  45670. "muls r6, r7\n\t"
  45671. #else
  45672. "mul r6, r7\n\t"
  45673. #endif
  45674. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45675. "lsrs r7, r6, #16\n\t"
  45676. #else
  45677. "lsr r7, r6, #16\n\t"
  45678. #endif
  45679. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45680. "lsls r6, r6, #16\n\t"
  45681. #else
  45682. "lsl r6, r6, #16\n\t"
  45683. #endif
  45684. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45685. "adds r3, r3, r6\n\t"
  45686. #else
  45687. "add r3, r3, r6\n\t"
  45688. #endif
  45689. #ifdef WOLFSSL_KEIL
  45690. "adcs r4, r4, r7\n\t"
  45691. #elif defined(__clang__)
  45692. "adcs r4, r7\n\t"
  45693. #else
  45694. "adc r4, r7\n\t"
  45695. #endif
  45696. #ifdef WOLFSSL_KEIL
  45697. "adcs r5, r5, %[r]\n\t"
  45698. #elif defined(__clang__)
  45699. "adcs r5, %[r]\n\t"
  45700. #else
  45701. "adc r5, %[r]\n\t"
  45702. #endif
  45703. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45704. "lsrs r6, %[a], #16\n\t"
  45705. #else
  45706. "lsr r6, %[a], #16\n\t"
  45707. #endif
  45708. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45709. "lsrs r7, %[b], #16\n\t"
  45710. #else
  45711. "lsr r7, %[b], #16\n\t"
  45712. #endif
  45713. #ifdef WOLFSSL_KEIL
  45714. "muls r7, r6, r7\n\t"
  45715. #elif defined(__clang__)
  45716. "muls r7, r6\n\t"
  45717. #else
  45718. "mul r7, r6\n\t"
  45719. #endif
  45720. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45721. "adds r4, r4, r7\n\t"
  45722. #else
  45723. "add r4, r4, r7\n\t"
  45724. #endif
  45725. #ifdef WOLFSSL_KEIL
  45726. "adcs r5, r5, %[r]\n\t"
  45727. #elif defined(__clang__)
  45728. "adcs r5, %[r]\n\t"
  45729. #else
  45730. "adc r5, %[r]\n\t"
  45731. #endif
  45732. "uxth r7, %[b]\n\t"
  45733. #ifdef WOLFSSL_KEIL
  45734. "muls r6, r7, r6\n\t"
  45735. #elif defined(__clang__)
  45736. "muls r6, r7\n\t"
  45737. #else
  45738. "mul r6, r7\n\t"
  45739. #endif
  45740. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45741. "lsrs r7, r6, #16\n\t"
  45742. #else
  45743. "lsr r7, r6, #16\n\t"
  45744. #endif
  45745. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45746. "lsls r6, r6, #16\n\t"
  45747. #else
  45748. "lsl r6, r6, #16\n\t"
  45749. #endif
  45750. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45751. "adds r3, r3, r6\n\t"
  45752. #else
  45753. "add r3, r3, r6\n\t"
  45754. #endif
  45755. #ifdef WOLFSSL_KEIL
  45756. "adcs r4, r4, r7\n\t"
  45757. #elif defined(__clang__)
  45758. "adcs r4, r7\n\t"
  45759. #else
  45760. "adc r4, r7\n\t"
  45761. #endif
  45762. #ifdef WOLFSSL_KEIL
  45763. "adcs r5, r5, %[r]\n\t"
  45764. #elif defined(__clang__)
  45765. "adcs r5, %[r]\n\t"
  45766. #else
  45767. "adc r5, %[r]\n\t"
  45768. #endif
  45769. "# A[6] * B[9]\n\t"
  45770. "mov %[a], r9\n\t"
  45771. "mov %[b], r10\n\t"
  45772. "ldr %[a], [%[a], #24]\n\t"
  45773. "ldr %[b], [%[b], #36]\n\t"
  45774. "uxth r6, %[a]\n\t"
  45775. "uxth r7, %[b]\n\t"
  45776. #ifdef WOLFSSL_KEIL
  45777. "muls r7, r6, r7\n\t"
  45778. #elif defined(__clang__)
  45779. "muls r7, r6\n\t"
  45780. #else
  45781. "mul r7, r6\n\t"
  45782. #endif
  45783. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45784. "adds r3, r3, r7\n\t"
  45785. #else
  45786. "add r3, r3, r7\n\t"
  45787. #endif
  45788. #ifdef WOLFSSL_KEIL
  45789. "adcs r4, r4, %[r]\n\t"
  45790. #elif defined(__clang__)
  45791. "adcs r4, %[r]\n\t"
  45792. #else
  45793. "adc r4, %[r]\n\t"
  45794. #endif
  45795. #ifdef WOLFSSL_KEIL
  45796. "adcs r5, r5, %[r]\n\t"
  45797. #elif defined(__clang__)
  45798. "adcs r5, %[r]\n\t"
  45799. #else
  45800. "adc r5, %[r]\n\t"
  45801. #endif
  45802. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45803. "lsrs r7, %[b], #16\n\t"
  45804. #else
  45805. "lsr r7, %[b], #16\n\t"
  45806. #endif
  45807. #ifdef WOLFSSL_KEIL
  45808. "muls r6, r7, r6\n\t"
  45809. #elif defined(__clang__)
  45810. "muls r6, r7\n\t"
  45811. #else
  45812. "mul r6, r7\n\t"
  45813. #endif
  45814. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45815. "lsrs r7, r6, #16\n\t"
  45816. #else
  45817. "lsr r7, r6, #16\n\t"
  45818. #endif
  45819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45820. "lsls r6, r6, #16\n\t"
  45821. #else
  45822. "lsl r6, r6, #16\n\t"
  45823. #endif
  45824. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45825. "adds r3, r3, r6\n\t"
  45826. #else
  45827. "add r3, r3, r6\n\t"
  45828. #endif
  45829. #ifdef WOLFSSL_KEIL
  45830. "adcs r4, r4, r7\n\t"
  45831. #elif defined(__clang__)
  45832. "adcs r4, r7\n\t"
  45833. #else
  45834. "adc r4, r7\n\t"
  45835. #endif
  45836. #ifdef WOLFSSL_KEIL
  45837. "adcs r5, r5, %[r]\n\t"
  45838. #elif defined(__clang__)
  45839. "adcs r5, %[r]\n\t"
  45840. #else
  45841. "adc r5, %[r]\n\t"
  45842. #endif
  45843. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45844. "lsrs r6, %[a], #16\n\t"
  45845. #else
  45846. "lsr r6, %[a], #16\n\t"
  45847. #endif
  45848. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45849. "lsrs r7, %[b], #16\n\t"
  45850. #else
  45851. "lsr r7, %[b], #16\n\t"
  45852. #endif
  45853. #ifdef WOLFSSL_KEIL
  45854. "muls r7, r6, r7\n\t"
  45855. #elif defined(__clang__)
  45856. "muls r7, r6\n\t"
  45857. #else
  45858. "mul r7, r6\n\t"
  45859. #endif
  45860. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45861. "adds r4, r4, r7\n\t"
  45862. #else
  45863. "add r4, r4, r7\n\t"
  45864. #endif
  45865. #ifdef WOLFSSL_KEIL
  45866. "adcs r5, r5, %[r]\n\t"
  45867. #elif defined(__clang__)
  45868. "adcs r5, %[r]\n\t"
  45869. #else
  45870. "adc r5, %[r]\n\t"
  45871. #endif
  45872. "uxth r7, %[b]\n\t"
  45873. #ifdef WOLFSSL_KEIL
  45874. "muls r6, r7, r6\n\t"
  45875. #elif defined(__clang__)
  45876. "muls r6, r7\n\t"
  45877. #else
  45878. "mul r6, r7\n\t"
  45879. #endif
  45880. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45881. "lsrs r7, r6, #16\n\t"
  45882. #else
  45883. "lsr r7, r6, #16\n\t"
  45884. #endif
  45885. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45886. "lsls r6, r6, #16\n\t"
  45887. #else
  45888. "lsl r6, r6, #16\n\t"
  45889. #endif
  45890. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45891. "adds r3, r3, r6\n\t"
  45892. #else
  45893. "add r3, r3, r6\n\t"
  45894. #endif
  45895. #ifdef WOLFSSL_KEIL
  45896. "adcs r4, r4, r7\n\t"
  45897. #elif defined(__clang__)
  45898. "adcs r4, r7\n\t"
  45899. #else
  45900. "adc r4, r7\n\t"
  45901. #endif
  45902. #ifdef WOLFSSL_KEIL
  45903. "adcs r5, r5, %[r]\n\t"
  45904. #elif defined(__clang__)
  45905. "adcs r5, %[r]\n\t"
  45906. #else
  45907. "adc r5, %[r]\n\t"
  45908. #endif
  45909. "# A[7] * B[8]\n\t"
  45910. "mov %[a], r9\n\t"
  45911. "mov %[b], r10\n\t"
  45912. "ldr %[a], [%[a], #28]\n\t"
  45913. "ldr %[b], [%[b], #32]\n\t"
  45914. "uxth r6, %[a]\n\t"
  45915. "uxth r7, %[b]\n\t"
  45916. #ifdef WOLFSSL_KEIL
  45917. "muls r7, r6, r7\n\t"
  45918. #elif defined(__clang__)
  45919. "muls r7, r6\n\t"
  45920. #else
  45921. "mul r7, r6\n\t"
  45922. #endif
  45923. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45924. "adds r3, r3, r7\n\t"
  45925. #else
  45926. "add r3, r3, r7\n\t"
  45927. #endif
  45928. #ifdef WOLFSSL_KEIL
  45929. "adcs r4, r4, %[r]\n\t"
  45930. #elif defined(__clang__)
  45931. "adcs r4, %[r]\n\t"
  45932. #else
  45933. "adc r4, %[r]\n\t"
  45934. #endif
  45935. #ifdef WOLFSSL_KEIL
  45936. "adcs r5, r5, %[r]\n\t"
  45937. #elif defined(__clang__)
  45938. "adcs r5, %[r]\n\t"
  45939. #else
  45940. "adc r5, %[r]\n\t"
  45941. #endif
  45942. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45943. "lsrs r7, %[b], #16\n\t"
  45944. #else
  45945. "lsr r7, %[b], #16\n\t"
  45946. #endif
  45947. #ifdef WOLFSSL_KEIL
  45948. "muls r6, r7, r6\n\t"
  45949. #elif defined(__clang__)
  45950. "muls r6, r7\n\t"
  45951. #else
  45952. "mul r6, r7\n\t"
  45953. #endif
  45954. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45955. "lsrs r7, r6, #16\n\t"
  45956. #else
  45957. "lsr r7, r6, #16\n\t"
  45958. #endif
  45959. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45960. "lsls r6, r6, #16\n\t"
  45961. #else
  45962. "lsl r6, r6, #16\n\t"
  45963. #endif
  45964. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45965. "adds r3, r3, r6\n\t"
  45966. #else
  45967. "add r3, r3, r6\n\t"
  45968. #endif
  45969. #ifdef WOLFSSL_KEIL
  45970. "adcs r4, r4, r7\n\t"
  45971. #elif defined(__clang__)
  45972. "adcs r4, r7\n\t"
  45973. #else
  45974. "adc r4, r7\n\t"
  45975. #endif
  45976. #ifdef WOLFSSL_KEIL
  45977. "adcs r5, r5, %[r]\n\t"
  45978. #elif defined(__clang__)
  45979. "adcs r5, %[r]\n\t"
  45980. #else
  45981. "adc r5, %[r]\n\t"
  45982. #endif
  45983. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45984. "lsrs r6, %[a], #16\n\t"
  45985. #else
  45986. "lsr r6, %[a], #16\n\t"
  45987. #endif
  45988. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45989. "lsrs r7, %[b], #16\n\t"
  45990. #else
  45991. "lsr r7, %[b], #16\n\t"
  45992. #endif
  45993. #ifdef WOLFSSL_KEIL
  45994. "muls r7, r6, r7\n\t"
  45995. #elif defined(__clang__)
  45996. "muls r7, r6\n\t"
  45997. #else
  45998. "mul r7, r6\n\t"
  45999. #endif
  46000. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46001. "adds r4, r4, r7\n\t"
  46002. #else
  46003. "add r4, r4, r7\n\t"
  46004. #endif
  46005. #ifdef WOLFSSL_KEIL
  46006. "adcs r5, r5, %[r]\n\t"
  46007. #elif defined(__clang__)
  46008. "adcs r5, %[r]\n\t"
  46009. #else
  46010. "adc r5, %[r]\n\t"
  46011. #endif
  46012. "uxth r7, %[b]\n\t"
  46013. #ifdef WOLFSSL_KEIL
  46014. "muls r6, r7, r6\n\t"
  46015. #elif defined(__clang__)
  46016. "muls r6, r7\n\t"
  46017. #else
  46018. "mul r6, r7\n\t"
  46019. #endif
  46020. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46021. "lsrs r7, r6, #16\n\t"
  46022. #else
  46023. "lsr r7, r6, #16\n\t"
  46024. #endif
  46025. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46026. "lsls r6, r6, #16\n\t"
  46027. #else
  46028. "lsl r6, r6, #16\n\t"
  46029. #endif
  46030. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46031. "adds r3, r3, r6\n\t"
  46032. #else
  46033. "add r3, r3, r6\n\t"
  46034. #endif
  46035. #ifdef WOLFSSL_KEIL
  46036. "adcs r4, r4, r7\n\t"
  46037. #elif defined(__clang__)
  46038. "adcs r4, r7\n\t"
  46039. #else
  46040. "adc r4, r7\n\t"
  46041. #endif
  46042. #ifdef WOLFSSL_KEIL
  46043. "adcs r5, r5, %[r]\n\t"
  46044. #elif defined(__clang__)
  46045. "adcs r5, %[r]\n\t"
  46046. #else
  46047. "adc r5, %[r]\n\t"
  46048. #endif
  46049. "# A[8] * B[7]\n\t"
  46050. "mov %[a], r9\n\t"
  46051. "mov %[b], r10\n\t"
  46052. "ldr %[a], [%[a], #32]\n\t"
  46053. "ldr %[b], [%[b], #28]\n\t"
  46054. "uxth r6, %[a]\n\t"
  46055. "uxth r7, %[b]\n\t"
  46056. #ifdef WOLFSSL_KEIL
  46057. "muls r7, r6, r7\n\t"
  46058. #elif defined(__clang__)
  46059. "muls r7, r6\n\t"
  46060. #else
  46061. "mul r7, r6\n\t"
  46062. #endif
  46063. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46064. "adds r3, r3, r7\n\t"
  46065. #else
  46066. "add r3, r3, r7\n\t"
  46067. #endif
  46068. #ifdef WOLFSSL_KEIL
  46069. "adcs r4, r4, %[r]\n\t"
  46070. #elif defined(__clang__)
  46071. "adcs r4, %[r]\n\t"
  46072. #else
  46073. "adc r4, %[r]\n\t"
  46074. #endif
  46075. #ifdef WOLFSSL_KEIL
  46076. "adcs r5, r5, %[r]\n\t"
  46077. #elif defined(__clang__)
  46078. "adcs r5, %[r]\n\t"
  46079. #else
  46080. "adc r5, %[r]\n\t"
  46081. #endif
  46082. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46083. "lsrs r7, %[b], #16\n\t"
  46084. #else
  46085. "lsr r7, %[b], #16\n\t"
  46086. #endif
  46087. #ifdef WOLFSSL_KEIL
  46088. "muls r6, r7, r6\n\t"
  46089. #elif defined(__clang__)
  46090. "muls r6, r7\n\t"
  46091. #else
  46092. "mul r6, r7\n\t"
  46093. #endif
  46094. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46095. "lsrs r7, r6, #16\n\t"
  46096. #else
  46097. "lsr r7, r6, #16\n\t"
  46098. #endif
  46099. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46100. "lsls r6, r6, #16\n\t"
  46101. #else
  46102. "lsl r6, r6, #16\n\t"
  46103. #endif
  46104. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46105. "adds r3, r3, r6\n\t"
  46106. #else
  46107. "add r3, r3, r6\n\t"
  46108. #endif
  46109. #ifdef WOLFSSL_KEIL
  46110. "adcs r4, r4, r7\n\t"
  46111. #elif defined(__clang__)
  46112. "adcs r4, r7\n\t"
  46113. #else
  46114. "adc r4, r7\n\t"
  46115. #endif
  46116. #ifdef WOLFSSL_KEIL
  46117. "adcs r5, r5, %[r]\n\t"
  46118. #elif defined(__clang__)
  46119. "adcs r5, %[r]\n\t"
  46120. #else
  46121. "adc r5, %[r]\n\t"
  46122. #endif
  46123. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46124. "lsrs r6, %[a], #16\n\t"
  46125. #else
  46126. "lsr r6, %[a], #16\n\t"
  46127. #endif
  46128. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46129. "lsrs r7, %[b], #16\n\t"
  46130. #else
  46131. "lsr r7, %[b], #16\n\t"
  46132. #endif
  46133. #ifdef WOLFSSL_KEIL
  46134. "muls r7, r6, r7\n\t"
  46135. #elif defined(__clang__)
  46136. "muls r7, r6\n\t"
  46137. #else
  46138. "mul r7, r6\n\t"
  46139. #endif
  46140. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46141. "adds r4, r4, r7\n\t"
  46142. #else
  46143. "add r4, r4, r7\n\t"
  46144. #endif
  46145. #ifdef WOLFSSL_KEIL
  46146. "adcs r5, r5, %[r]\n\t"
  46147. #elif defined(__clang__)
  46148. "adcs r5, %[r]\n\t"
  46149. #else
  46150. "adc r5, %[r]\n\t"
  46151. #endif
  46152. "uxth r7, %[b]\n\t"
  46153. #ifdef WOLFSSL_KEIL
  46154. "muls r6, r7, r6\n\t"
  46155. #elif defined(__clang__)
  46156. "muls r6, r7\n\t"
  46157. #else
  46158. "mul r6, r7\n\t"
  46159. #endif
  46160. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46161. "lsrs r7, r6, #16\n\t"
  46162. #else
  46163. "lsr r7, r6, #16\n\t"
  46164. #endif
  46165. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46166. "lsls r6, r6, #16\n\t"
  46167. #else
  46168. "lsl r6, r6, #16\n\t"
  46169. #endif
  46170. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46171. "adds r3, r3, r6\n\t"
  46172. #else
  46173. "add r3, r3, r6\n\t"
  46174. #endif
  46175. #ifdef WOLFSSL_KEIL
  46176. "adcs r4, r4, r7\n\t"
  46177. #elif defined(__clang__)
  46178. "adcs r4, r7\n\t"
  46179. #else
  46180. "adc r4, r7\n\t"
  46181. #endif
  46182. #ifdef WOLFSSL_KEIL
  46183. "adcs r5, r5, %[r]\n\t"
  46184. #elif defined(__clang__)
  46185. "adcs r5, %[r]\n\t"
  46186. #else
  46187. "adc r5, %[r]\n\t"
  46188. #endif
  46189. "# A[9] * B[6]\n\t"
  46190. "mov %[a], r9\n\t"
  46191. "mov %[b], r10\n\t"
  46192. "ldr %[a], [%[a], #36]\n\t"
  46193. "ldr %[b], [%[b], #24]\n\t"
  46194. "uxth r6, %[a]\n\t"
  46195. "uxth r7, %[b]\n\t"
  46196. #ifdef WOLFSSL_KEIL
  46197. "muls r7, r6, r7\n\t"
  46198. #elif defined(__clang__)
  46199. "muls r7, r6\n\t"
  46200. #else
  46201. "mul r7, r6\n\t"
  46202. #endif
  46203. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46204. "adds r3, r3, r7\n\t"
  46205. #else
  46206. "add r3, r3, r7\n\t"
  46207. #endif
  46208. #ifdef WOLFSSL_KEIL
  46209. "adcs r4, r4, %[r]\n\t"
  46210. #elif defined(__clang__)
  46211. "adcs r4, %[r]\n\t"
  46212. #else
  46213. "adc r4, %[r]\n\t"
  46214. #endif
  46215. #ifdef WOLFSSL_KEIL
  46216. "adcs r5, r5, %[r]\n\t"
  46217. #elif defined(__clang__)
  46218. "adcs r5, %[r]\n\t"
  46219. #else
  46220. "adc r5, %[r]\n\t"
  46221. #endif
  46222. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46223. "lsrs r7, %[b], #16\n\t"
  46224. #else
  46225. "lsr r7, %[b], #16\n\t"
  46226. #endif
  46227. #ifdef WOLFSSL_KEIL
  46228. "muls r6, r7, r6\n\t"
  46229. #elif defined(__clang__)
  46230. "muls r6, r7\n\t"
  46231. #else
  46232. "mul r6, r7\n\t"
  46233. #endif
  46234. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46235. "lsrs r7, r6, #16\n\t"
  46236. #else
  46237. "lsr r7, r6, #16\n\t"
  46238. #endif
  46239. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46240. "lsls r6, r6, #16\n\t"
  46241. #else
  46242. "lsl r6, r6, #16\n\t"
  46243. #endif
  46244. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46245. "adds r3, r3, r6\n\t"
  46246. #else
  46247. "add r3, r3, r6\n\t"
  46248. #endif
  46249. #ifdef WOLFSSL_KEIL
  46250. "adcs r4, r4, r7\n\t"
  46251. #elif defined(__clang__)
  46252. "adcs r4, r7\n\t"
  46253. #else
  46254. "adc r4, r7\n\t"
  46255. #endif
  46256. #ifdef WOLFSSL_KEIL
  46257. "adcs r5, r5, %[r]\n\t"
  46258. #elif defined(__clang__)
  46259. "adcs r5, %[r]\n\t"
  46260. #else
  46261. "adc r5, %[r]\n\t"
  46262. #endif
  46263. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46264. "lsrs r6, %[a], #16\n\t"
  46265. #else
  46266. "lsr r6, %[a], #16\n\t"
  46267. #endif
  46268. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46269. "lsrs r7, %[b], #16\n\t"
  46270. #else
  46271. "lsr r7, %[b], #16\n\t"
  46272. #endif
  46273. #ifdef WOLFSSL_KEIL
  46274. "muls r7, r6, r7\n\t"
  46275. #elif defined(__clang__)
  46276. "muls r7, r6\n\t"
  46277. #else
  46278. "mul r7, r6\n\t"
  46279. #endif
  46280. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46281. "adds r4, r4, r7\n\t"
  46282. #else
  46283. "add r4, r4, r7\n\t"
  46284. #endif
  46285. #ifdef WOLFSSL_KEIL
  46286. "adcs r5, r5, %[r]\n\t"
  46287. #elif defined(__clang__)
  46288. "adcs r5, %[r]\n\t"
  46289. #else
  46290. "adc r5, %[r]\n\t"
  46291. #endif
  46292. "uxth r7, %[b]\n\t"
  46293. #ifdef WOLFSSL_KEIL
  46294. "muls r6, r7, r6\n\t"
  46295. #elif defined(__clang__)
  46296. "muls r6, r7\n\t"
  46297. #else
  46298. "mul r6, r7\n\t"
  46299. #endif
  46300. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46301. "lsrs r7, r6, #16\n\t"
  46302. #else
  46303. "lsr r7, r6, #16\n\t"
  46304. #endif
  46305. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46306. "lsls r6, r6, #16\n\t"
  46307. #else
  46308. "lsl r6, r6, #16\n\t"
  46309. #endif
  46310. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46311. "adds r3, r3, r6\n\t"
  46312. #else
  46313. "add r3, r3, r6\n\t"
  46314. #endif
  46315. #ifdef WOLFSSL_KEIL
  46316. "adcs r4, r4, r7\n\t"
  46317. #elif defined(__clang__)
  46318. "adcs r4, r7\n\t"
  46319. #else
  46320. "adc r4, r7\n\t"
  46321. #endif
  46322. #ifdef WOLFSSL_KEIL
  46323. "adcs r5, r5, %[r]\n\t"
  46324. #elif defined(__clang__)
  46325. "adcs r5, %[r]\n\t"
  46326. #else
  46327. "adc r5, %[r]\n\t"
  46328. #endif
  46329. "# A[10] * B[5]\n\t"
  46330. "mov %[a], r9\n\t"
  46331. "mov %[b], r10\n\t"
  46332. "ldr %[a], [%[a], #40]\n\t"
  46333. "ldr %[b], [%[b], #20]\n\t"
  46334. "uxth r6, %[a]\n\t"
  46335. "uxth r7, %[b]\n\t"
  46336. #ifdef WOLFSSL_KEIL
  46337. "muls r7, r6, r7\n\t"
  46338. #elif defined(__clang__)
  46339. "muls r7, r6\n\t"
  46340. #else
  46341. "mul r7, r6\n\t"
  46342. #endif
  46343. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46344. "adds r3, r3, r7\n\t"
  46345. #else
  46346. "add r3, r3, r7\n\t"
  46347. #endif
  46348. #ifdef WOLFSSL_KEIL
  46349. "adcs r4, r4, %[r]\n\t"
  46350. #elif defined(__clang__)
  46351. "adcs r4, %[r]\n\t"
  46352. #else
  46353. "adc r4, %[r]\n\t"
  46354. #endif
  46355. #ifdef WOLFSSL_KEIL
  46356. "adcs r5, r5, %[r]\n\t"
  46357. #elif defined(__clang__)
  46358. "adcs r5, %[r]\n\t"
  46359. #else
  46360. "adc r5, %[r]\n\t"
  46361. #endif
  46362. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46363. "lsrs r7, %[b], #16\n\t"
  46364. #else
  46365. "lsr r7, %[b], #16\n\t"
  46366. #endif
  46367. #ifdef WOLFSSL_KEIL
  46368. "muls r6, r7, r6\n\t"
  46369. #elif defined(__clang__)
  46370. "muls r6, r7\n\t"
  46371. #else
  46372. "mul r6, r7\n\t"
  46373. #endif
  46374. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46375. "lsrs r7, r6, #16\n\t"
  46376. #else
  46377. "lsr r7, r6, #16\n\t"
  46378. #endif
  46379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46380. "lsls r6, r6, #16\n\t"
  46381. #else
  46382. "lsl r6, r6, #16\n\t"
  46383. #endif
  46384. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46385. "adds r3, r3, r6\n\t"
  46386. #else
  46387. "add r3, r3, r6\n\t"
  46388. #endif
  46389. #ifdef WOLFSSL_KEIL
  46390. "adcs r4, r4, r7\n\t"
  46391. #elif defined(__clang__)
  46392. "adcs r4, r7\n\t"
  46393. #else
  46394. "adc r4, r7\n\t"
  46395. #endif
  46396. #ifdef WOLFSSL_KEIL
  46397. "adcs r5, r5, %[r]\n\t"
  46398. #elif defined(__clang__)
  46399. "adcs r5, %[r]\n\t"
  46400. #else
  46401. "adc r5, %[r]\n\t"
  46402. #endif
  46403. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46404. "lsrs r6, %[a], #16\n\t"
  46405. #else
  46406. "lsr r6, %[a], #16\n\t"
  46407. #endif
  46408. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46409. "lsrs r7, %[b], #16\n\t"
  46410. #else
  46411. "lsr r7, %[b], #16\n\t"
  46412. #endif
  46413. #ifdef WOLFSSL_KEIL
  46414. "muls r7, r6, r7\n\t"
  46415. #elif defined(__clang__)
  46416. "muls r7, r6\n\t"
  46417. #else
  46418. "mul r7, r6\n\t"
  46419. #endif
  46420. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46421. "adds r4, r4, r7\n\t"
  46422. #else
  46423. "add r4, r4, r7\n\t"
  46424. #endif
  46425. #ifdef WOLFSSL_KEIL
  46426. "adcs r5, r5, %[r]\n\t"
  46427. #elif defined(__clang__)
  46428. "adcs r5, %[r]\n\t"
  46429. #else
  46430. "adc r5, %[r]\n\t"
  46431. #endif
  46432. "uxth r7, %[b]\n\t"
  46433. #ifdef WOLFSSL_KEIL
  46434. "muls r6, r7, r6\n\t"
  46435. #elif defined(__clang__)
  46436. "muls r6, r7\n\t"
  46437. #else
  46438. "mul r6, r7\n\t"
  46439. #endif
  46440. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46441. "lsrs r7, r6, #16\n\t"
  46442. #else
  46443. "lsr r7, r6, #16\n\t"
  46444. #endif
  46445. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46446. "lsls r6, r6, #16\n\t"
  46447. #else
  46448. "lsl r6, r6, #16\n\t"
  46449. #endif
  46450. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46451. "adds r3, r3, r6\n\t"
  46452. #else
  46453. "add r3, r3, r6\n\t"
  46454. #endif
  46455. #ifdef WOLFSSL_KEIL
  46456. "adcs r4, r4, r7\n\t"
  46457. #elif defined(__clang__)
  46458. "adcs r4, r7\n\t"
  46459. #else
  46460. "adc r4, r7\n\t"
  46461. #endif
  46462. #ifdef WOLFSSL_KEIL
  46463. "adcs r5, r5, %[r]\n\t"
  46464. #elif defined(__clang__)
  46465. "adcs r5, %[r]\n\t"
  46466. #else
  46467. "adc r5, %[r]\n\t"
  46468. #endif
  46469. "# A[11] * B[4]\n\t"
  46470. "mov %[a], r9\n\t"
  46471. "mov %[b], r10\n\t"
  46472. "ldr %[a], [%[a], #44]\n\t"
  46473. "ldr %[b], [%[b], #16]\n\t"
  46474. "uxth r6, %[a]\n\t"
  46475. "uxth r7, %[b]\n\t"
  46476. #ifdef WOLFSSL_KEIL
  46477. "muls r7, r6, r7\n\t"
  46478. #elif defined(__clang__)
  46479. "muls r7, r6\n\t"
  46480. #else
  46481. "mul r7, r6\n\t"
  46482. #endif
  46483. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46484. "adds r3, r3, r7\n\t"
  46485. #else
  46486. "add r3, r3, r7\n\t"
  46487. #endif
  46488. #ifdef WOLFSSL_KEIL
  46489. "adcs r4, r4, %[r]\n\t"
  46490. #elif defined(__clang__)
  46491. "adcs r4, %[r]\n\t"
  46492. #else
  46493. "adc r4, %[r]\n\t"
  46494. #endif
  46495. #ifdef WOLFSSL_KEIL
  46496. "adcs r5, r5, %[r]\n\t"
  46497. #elif defined(__clang__)
  46498. "adcs r5, %[r]\n\t"
  46499. #else
  46500. "adc r5, %[r]\n\t"
  46501. #endif
  46502. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46503. "lsrs r7, %[b], #16\n\t"
  46504. #else
  46505. "lsr r7, %[b], #16\n\t"
  46506. #endif
  46507. #ifdef WOLFSSL_KEIL
  46508. "muls r6, r7, r6\n\t"
  46509. #elif defined(__clang__)
  46510. "muls r6, r7\n\t"
  46511. #else
  46512. "mul r6, r7\n\t"
  46513. #endif
  46514. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46515. "lsrs r7, r6, #16\n\t"
  46516. #else
  46517. "lsr r7, r6, #16\n\t"
  46518. #endif
  46519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46520. "lsls r6, r6, #16\n\t"
  46521. #else
  46522. "lsl r6, r6, #16\n\t"
  46523. #endif
  46524. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46525. "adds r3, r3, r6\n\t"
  46526. #else
  46527. "add r3, r3, r6\n\t"
  46528. #endif
  46529. #ifdef WOLFSSL_KEIL
  46530. "adcs r4, r4, r7\n\t"
  46531. #elif defined(__clang__)
  46532. "adcs r4, r7\n\t"
  46533. #else
  46534. "adc r4, r7\n\t"
  46535. #endif
  46536. #ifdef WOLFSSL_KEIL
  46537. "adcs r5, r5, %[r]\n\t"
  46538. #elif defined(__clang__)
  46539. "adcs r5, %[r]\n\t"
  46540. #else
  46541. "adc r5, %[r]\n\t"
  46542. #endif
  46543. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46544. "lsrs r6, %[a], #16\n\t"
  46545. #else
  46546. "lsr r6, %[a], #16\n\t"
  46547. #endif
  46548. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46549. "lsrs r7, %[b], #16\n\t"
  46550. #else
  46551. "lsr r7, %[b], #16\n\t"
  46552. #endif
  46553. #ifdef WOLFSSL_KEIL
  46554. "muls r7, r6, r7\n\t"
  46555. #elif defined(__clang__)
  46556. "muls r7, r6\n\t"
  46557. #else
  46558. "mul r7, r6\n\t"
  46559. #endif
  46560. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46561. "adds r4, r4, r7\n\t"
  46562. #else
  46563. "add r4, r4, r7\n\t"
  46564. #endif
  46565. #ifdef WOLFSSL_KEIL
  46566. "adcs r5, r5, %[r]\n\t"
  46567. #elif defined(__clang__)
  46568. "adcs r5, %[r]\n\t"
  46569. #else
  46570. "adc r5, %[r]\n\t"
  46571. #endif
  46572. "uxth r7, %[b]\n\t"
  46573. #ifdef WOLFSSL_KEIL
  46574. "muls r6, r7, r6\n\t"
  46575. #elif defined(__clang__)
  46576. "muls r6, r7\n\t"
  46577. #else
  46578. "mul r6, r7\n\t"
  46579. #endif
  46580. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46581. "lsrs r7, r6, #16\n\t"
  46582. #else
  46583. "lsr r7, r6, #16\n\t"
  46584. #endif
  46585. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46586. "lsls r6, r6, #16\n\t"
  46587. #else
  46588. "lsl r6, r6, #16\n\t"
  46589. #endif
  46590. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46591. "adds r3, r3, r6\n\t"
  46592. #else
  46593. "add r3, r3, r6\n\t"
  46594. #endif
  46595. #ifdef WOLFSSL_KEIL
  46596. "adcs r4, r4, r7\n\t"
  46597. #elif defined(__clang__)
  46598. "adcs r4, r7\n\t"
  46599. #else
  46600. "adc r4, r7\n\t"
  46601. #endif
  46602. #ifdef WOLFSSL_KEIL
  46603. "adcs r5, r5, %[r]\n\t"
  46604. #elif defined(__clang__)
  46605. "adcs r5, %[r]\n\t"
  46606. #else
  46607. "adc r5, %[r]\n\t"
  46608. #endif
  46609. "mov %[r], r8\n\t"
  46610. "str r3, [%[r], #60]\n\t"
  46611. "movs %[r], #0\n\t"
  46612. "# A[11] * B[5]\n\t"
  46613. "movs r3, #0\n\t"
  46614. "mov %[a], r9\n\t"
  46615. "mov %[b], r10\n\t"
  46616. "ldr %[a], [%[a], #44]\n\t"
  46617. "ldr %[b], [%[b], #20]\n\t"
  46618. "uxth r6, %[a]\n\t"
  46619. "uxth r7, %[b]\n\t"
  46620. #ifdef WOLFSSL_KEIL
  46621. "muls r7, r6, r7\n\t"
  46622. #elif defined(__clang__)
  46623. "muls r7, r6\n\t"
  46624. #else
  46625. "mul r7, r6\n\t"
  46626. #endif
  46627. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46628. "adds r4, r4, r7\n\t"
  46629. #else
  46630. "add r4, r4, r7\n\t"
  46631. #endif
  46632. #ifdef WOLFSSL_KEIL
  46633. "adcs r5, r5, %[r]\n\t"
  46634. #elif defined(__clang__)
  46635. "adcs r5, %[r]\n\t"
  46636. #else
  46637. "adc r5, %[r]\n\t"
  46638. #endif
  46639. #ifdef WOLFSSL_KEIL
  46640. "adcs r3, r3, %[r]\n\t"
  46641. #elif defined(__clang__)
  46642. "adcs r3, %[r]\n\t"
  46643. #else
  46644. "adc r3, %[r]\n\t"
  46645. #endif
  46646. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46647. "lsrs r7, %[b], #16\n\t"
  46648. #else
  46649. "lsr r7, %[b], #16\n\t"
  46650. #endif
  46651. #ifdef WOLFSSL_KEIL
  46652. "muls r6, r7, r6\n\t"
  46653. #elif defined(__clang__)
  46654. "muls r6, r7\n\t"
  46655. #else
  46656. "mul r6, r7\n\t"
  46657. #endif
  46658. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46659. "lsrs r7, r6, #16\n\t"
  46660. #else
  46661. "lsr r7, r6, #16\n\t"
  46662. #endif
  46663. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46664. "lsls r6, r6, #16\n\t"
  46665. #else
  46666. "lsl r6, r6, #16\n\t"
  46667. #endif
  46668. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46669. "adds r4, r4, r6\n\t"
  46670. #else
  46671. "add r4, r4, r6\n\t"
  46672. #endif
  46673. #ifdef WOLFSSL_KEIL
  46674. "adcs r5, r5, r7\n\t"
  46675. #elif defined(__clang__)
  46676. "adcs r5, r7\n\t"
  46677. #else
  46678. "adc r5, r7\n\t"
  46679. #endif
  46680. #ifdef WOLFSSL_KEIL
  46681. "adcs r3, r3, %[r]\n\t"
  46682. #elif defined(__clang__)
  46683. "adcs r3, %[r]\n\t"
  46684. #else
  46685. "adc r3, %[r]\n\t"
  46686. #endif
  46687. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46688. "lsrs r6, %[a], #16\n\t"
  46689. #else
  46690. "lsr r6, %[a], #16\n\t"
  46691. #endif
  46692. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46693. "lsrs r7, %[b], #16\n\t"
  46694. #else
  46695. "lsr r7, %[b], #16\n\t"
  46696. #endif
  46697. #ifdef WOLFSSL_KEIL
  46698. "muls r7, r6, r7\n\t"
  46699. #elif defined(__clang__)
  46700. "muls r7, r6\n\t"
  46701. #else
  46702. "mul r7, r6\n\t"
  46703. #endif
  46704. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46705. "adds r5, r5, r7\n\t"
  46706. #else
  46707. "add r5, r5, r7\n\t"
  46708. #endif
  46709. #ifdef WOLFSSL_KEIL
  46710. "adcs r3, r3, %[r]\n\t"
  46711. #elif defined(__clang__)
  46712. "adcs r3, %[r]\n\t"
  46713. #else
  46714. "adc r3, %[r]\n\t"
  46715. #endif
  46716. "uxth r7, %[b]\n\t"
  46717. #ifdef WOLFSSL_KEIL
  46718. "muls r6, r7, r6\n\t"
  46719. #elif defined(__clang__)
  46720. "muls r6, r7\n\t"
  46721. #else
  46722. "mul r6, r7\n\t"
  46723. #endif
  46724. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46725. "lsrs r7, r6, #16\n\t"
  46726. #else
  46727. "lsr r7, r6, #16\n\t"
  46728. #endif
  46729. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46730. "lsls r6, r6, #16\n\t"
  46731. #else
  46732. "lsl r6, r6, #16\n\t"
  46733. #endif
  46734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46735. "adds r4, r4, r6\n\t"
  46736. #else
  46737. "add r4, r4, r6\n\t"
  46738. #endif
  46739. #ifdef WOLFSSL_KEIL
  46740. "adcs r5, r5, r7\n\t"
  46741. #elif defined(__clang__)
  46742. "adcs r5, r7\n\t"
  46743. #else
  46744. "adc r5, r7\n\t"
  46745. #endif
  46746. #ifdef WOLFSSL_KEIL
  46747. "adcs r3, r3, %[r]\n\t"
  46748. #elif defined(__clang__)
  46749. "adcs r3, %[r]\n\t"
  46750. #else
  46751. "adc r3, %[r]\n\t"
  46752. #endif
  46753. "# A[10] * B[6]\n\t"
  46754. "mov %[a], r9\n\t"
  46755. "mov %[b], r10\n\t"
  46756. "ldr %[a], [%[a], #40]\n\t"
  46757. "ldr %[b], [%[b], #24]\n\t"
  46758. "uxth r6, %[a]\n\t"
  46759. "uxth r7, %[b]\n\t"
  46760. #ifdef WOLFSSL_KEIL
  46761. "muls r7, r6, r7\n\t"
  46762. #elif defined(__clang__)
  46763. "muls r7, r6\n\t"
  46764. #else
  46765. "mul r7, r6\n\t"
  46766. #endif
  46767. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46768. "adds r4, r4, r7\n\t"
  46769. #else
  46770. "add r4, r4, r7\n\t"
  46771. #endif
  46772. #ifdef WOLFSSL_KEIL
  46773. "adcs r5, r5, %[r]\n\t"
  46774. #elif defined(__clang__)
  46775. "adcs r5, %[r]\n\t"
  46776. #else
  46777. "adc r5, %[r]\n\t"
  46778. #endif
  46779. #ifdef WOLFSSL_KEIL
  46780. "adcs r3, r3, %[r]\n\t"
  46781. #elif defined(__clang__)
  46782. "adcs r3, %[r]\n\t"
  46783. #else
  46784. "adc r3, %[r]\n\t"
  46785. #endif
  46786. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46787. "lsrs r7, %[b], #16\n\t"
  46788. #else
  46789. "lsr r7, %[b], #16\n\t"
  46790. #endif
  46791. #ifdef WOLFSSL_KEIL
  46792. "muls r6, r7, r6\n\t"
  46793. #elif defined(__clang__)
  46794. "muls r6, r7\n\t"
  46795. #else
  46796. "mul r6, r7\n\t"
  46797. #endif
  46798. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46799. "lsrs r7, r6, #16\n\t"
  46800. #else
  46801. "lsr r7, r6, #16\n\t"
  46802. #endif
  46803. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46804. "lsls r6, r6, #16\n\t"
  46805. #else
  46806. "lsl r6, r6, #16\n\t"
  46807. #endif
  46808. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46809. "adds r4, r4, r6\n\t"
  46810. #else
  46811. "add r4, r4, r6\n\t"
  46812. #endif
  46813. #ifdef WOLFSSL_KEIL
  46814. "adcs r5, r5, r7\n\t"
  46815. #elif defined(__clang__)
  46816. "adcs r5, r7\n\t"
  46817. #else
  46818. "adc r5, r7\n\t"
  46819. #endif
  46820. #ifdef WOLFSSL_KEIL
  46821. "adcs r3, r3, %[r]\n\t"
  46822. #elif defined(__clang__)
  46823. "adcs r3, %[r]\n\t"
  46824. #else
  46825. "adc r3, %[r]\n\t"
  46826. #endif
  46827. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46828. "lsrs r6, %[a], #16\n\t"
  46829. #else
  46830. "lsr r6, %[a], #16\n\t"
  46831. #endif
  46832. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46833. "lsrs r7, %[b], #16\n\t"
  46834. #else
  46835. "lsr r7, %[b], #16\n\t"
  46836. #endif
  46837. #ifdef WOLFSSL_KEIL
  46838. "muls r7, r6, r7\n\t"
  46839. #elif defined(__clang__)
  46840. "muls r7, r6\n\t"
  46841. #else
  46842. "mul r7, r6\n\t"
  46843. #endif
  46844. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46845. "adds r5, r5, r7\n\t"
  46846. #else
  46847. "add r5, r5, r7\n\t"
  46848. #endif
  46849. #ifdef WOLFSSL_KEIL
  46850. "adcs r3, r3, %[r]\n\t"
  46851. #elif defined(__clang__)
  46852. "adcs r3, %[r]\n\t"
  46853. #else
  46854. "adc r3, %[r]\n\t"
  46855. #endif
  46856. "uxth r7, %[b]\n\t"
  46857. #ifdef WOLFSSL_KEIL
  46858. "muls r6, r7, r6\n\t"
  46859. #elif defined(__clang__)
  46860. "muls r6, r7\n\t"
  46861. #else
  46862. "mul r6, r7\n\t"
  46863. #endif
  46864. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46865. "lsrs r7, r6, #16\n\t"
  46866. #else
  46867. "lsr r7, r6, #16\n\t"
  46868. #endif
  46869. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46870. "lsls r6, r6, #16\n\t"
  46871. #else
  46872. "lsl r6, r6, #16\n\t"
  46873. #endif
  46874. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46875. "adds r4, r4, r6\n\t"
  46876. #else
  46877. "add r4, r4, r6\n\t"
  46878. #endif
  46879. #ifdef WOLFSSL_KEIL
  46880. "adcs r5, r5, r7\n\t"
  46881. #elif defined(__clang__)
  46882. "adcs r5, r7\n\t"
  46883. #else
  46884. "adc r5, r7\n\t"
  46885. #endif
  46886. #ifdef WOLFSSL_KEIL
  46887. "adcs r3, r3, %[r]\n\t"
  46888. #elif defined(__clang__)
  46889. "adcs r3, %[r]\n\t"
  46890. #else
  46891. "adc r3, %[r]\n\t"
  46892. #endif
  46893. "# A[9] * B[7]\n\t"
  46894. "mov %[a], r9\n\t"
  46895. "mov %[b], r10\n\t"
  46896. "ldr %[a], [%[a], #36]\n\t"
  46897. "ldr %[b], [%[b], #28]\n\t"
  46898. "uxth r6, %[a]\n\t"
  46899. "uxth r7, %[b]\n\t"
  46900. #ifdef WOLFSSL_KEIL
  46901. "muls r7, r6, r7\n\t"
  46902. #elif defined(__clang__)
  46903. "muls r7, r6\n\t"
  46904. #else
  46905. "mul r7, r6\n\t"
  46906. #endif
  46907. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46908. "adds r4, r4, r7\n\t"
  46909. #else
  46910. "add r4, r4, r7\n\t"
  46911. #endif
  46912. #ifdef WOLFSSL_KEIL
  46913. "adcs r5, r5, %[r]\n\t"
  46914. #elif defined(__clang__)
  46915. "adcs r5, %[r]\n\t"
  46916. #else
  46917. "adc r5, %[r]\n\t"
  46918. #endif
  46919. #ifdef WOLFSSL_KEIL
  46920. "adcs r3, r3, %[r]\n\t"
  46921. #elif defined(__clang__)
  46922. "adcs r3, %[r]\n\t"
  46923. #else
  46924. "adc r3, %[r]\n\t"
  46925. #endif
  46926. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46927. "lsrs r7, %[b], #16\n\t"
  46928. #else
  46929. "lsr r7, %[b], #16\n\t"
  46930. #endif
  46931. #ifdef WOLFSSL_KEIL
  46932. "muls r6, r7, r6\n\t"
  46933. #elif defined(__clang__)
  46934. "muls r6, r7\n\t"
  46935. #else
  46936. "mul r6, r7\n\t"
  46937. #endif
  46938. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46939. "lsrs r7, r6, #16\n\t"
  46940. #else
  46941. "lsr r7, r6, #16\n\t"
  46942. #endif
  46943. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46944. "lsls r6, r6, #16\n\t"
  46945. #else
  46946. "lsl r6, r6, #16\n\t"
  46947. #endif
  46948. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46949. "adds r4, r4, r6\n\t"
  46950. #else
  46951. "add r4, r4, r6\n\t"
  46952. #endif
  46953. #ifdef WOLFSSL_KEIL
  46954. "adcs r5, r5, r7\n\t"
  46955. #elif defined(__clang__)
  46956. "adcs r5, r7\n\t"
  46957. #else
  46958. "adc r5, r7\n\t"
  46959. #endif
  46960. #ifdef WOLFSSL_KEIL
  46961. "adcs r3, r3, %[r]\n\t"
  46962. #elif defined(__clang__)
  46963. "adcs r3, %[r]\n\t"
  46964. #else
  46965. "adc r3, %[r]\n\t"
  46966. #endif
  46967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46968. "lsrs r6, %[a], #16\n\t"
  46969. #else
  46970. "lsr r6, %[a], #16\n\t"
  46971. #endif
  46972. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46973. "lsrs r7, %[b], #16\n\t"
  46974. #else
  46975. "lsr r7, %[b], #16\n\t"
  46976. #endif
  46977. #ifdef WOLFSSL_KEIL
  46978. "muls r7, r6, r7\n\t"
  46979. #elif defined(__clang__)
  46980. "muls r7, r6\n\t"
  46981. #else
  46982. "mul r7, r6\n\t"
  46983. #endif
  46984. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46985. "adds r5, r5, r7\n\t"
  46986. #else
  46987. "add r5, r5, r7\n\t"
  46988. #endif
  46989. #ifdef WOLFSSL_KEIL
  46990. "adcs r3, r3, %[r]\n\t"
  46991. #elif defined(__clang__)
  46992. "adcs r3, %[r]\n\t"
  46993. #else
  46994. "adc r3, %[r]\n\t"
  46995. #endif
  46996. "uxth r7, %[b]\n\t"
  46997. #ifdef WOLFSSL_KEIL
  46998. "muls r6, r7, r6\n\t"
  46999. #elif defined(__clang__)
  47000. "muls r6, r7\n\t"
  47001. #else
  47002. "mul r6, r7\n\t"
  47003. #endif
  47004. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47005. "lsrs r7, r6, #16\n\t"
  47006. #else
  47007. "lsr r7, r6, #16\n\t"
  47008. #endif
  47009. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47010. "lsls r6, r6, #16\n\t"
  47011. #else
  47012. "lsl r6, r6, #16\n\t"
  47013. #endif
  47014. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47015. "adds r4, r4, r6\n\t"
  47016. #else
  47017. "add r4, r4, r6\n\t"
  47018. #endif
  47019. #ifdef WOLFSSL_KEIL
  47020. "adcs r5, r5, r7\n\t"
  47021. #elif defined(__clang__)
  47022. "adcs r5, r7\n\t"
  47023. #else
  47024. "adc r5, r7\n\t"
  47025. #endif
  47026. #ifdef WOLFSSL_KEIL
  47027. "adcs r3, r3, %[r]\n\t"
  47028. #elif defined(__clang__)
  47029. "adcs r3, %[r]\n\t"
  47030. #else
  47031. "adc r3, %[r]\n\t"
  47032. #endif
  47033. "# A[8] * B[8]\n\t"
  47034. "mov %[a], r9\n\t"
  47035. "mov %[b], r10\n\t"
  47036. "ldr %[a], [%[a], #32]\n\t"
  47037. "ldr %[b], [%[b], #32]\n\t"
  47038. "uxth r6, %[a]\n\t"
  47039. "uxth r7, %[b]\n\t"
  47040. #ifdef WOLFSSL_KEIL
  47041. "muls r7, r6, r7\n\t"
  47042. #elif defined(__clang__)
  47043. "muls r7, r6\n\t"
  47044. #else
  47045. "mul r7, r6\n\t"
  47046. #endif
  47047. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47048. "adds r4, r4, r7\n\t"
  47049. #else
  47050. "add r4, r4, r7\n\t"
  47051. #endif
  47052. #ifdef WOLFSSL_KEIL
  47053. "adcs r5, r5, %[r]\n\t"
  47054. #elif defined(__clang__)
  47055. "adcs r5, %[r]\n\t"
  47056. #else
  47057. "adc r5, %[r]\n\t"
  47058. #endif
  47059. #ifdef WOLFSSL_KEIL
  47060. "adcs r3, r3, %[r]\n\t"
  47061. #elif defined(__clang__)
  47062. "adcs r3, %[r]\n\t"
  47063. #else
  47064. "adc r3, %[r]\n\t"
  47065. #endif
  47066. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47067. "lsrs r7, %[b], #16\n\t"
  47068. #else
  47069. "lsr r7, %[b], #16\n\t"
  47070. #endif
  47071. #ifdef WOLFSSL_KEIL
  47072. "muls r6, r7, r6\n\t"
  47073. #elif defined(__clang__)
  47074. "muls r6, r7\n\t"
  47075. #else
  47076. "mul r6, r7\n\t"
  47077. #endif
  47078. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47079. "lsrs r7, r6, #16\n\t"
  47080. #else
  47081. "lsr r7, r6, #16\n\t"
  47082. #endif
  47083. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47084. "lsls r6, r6, #16\n\t"
  47085. #else
  47086. "lsl r6, r6, #16\n\t"
  47087. #endif
  47088. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47089. "adds r4, r4, r6\n\t"
  47090. #else
  47091. "add r4, r4, r6\n\t"
  47092. #endif
  47093. #ifdef WOLFSSL_KEIL
  47094. "adcs r5, r5, r7\n\t"
  47095. #elif defined(__clang__)
  47096. "adcs r5, r7\n\t"
  47097. #else
  47098. "adc r5, r7\n\t"
  47099. #endif
  47100. #ifdef WOLFSSL_KEIL
  47101. "adcs r3, r3, %[r]\n\t"
  47102. #elif defined(__clang__)
  47103. "adcs r3, %[r]\n\t"
  47104. #else
  47105. "adc r3, %[r]\n\t"
  47106. #endif
  47107. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47108. "lsrs r6, %[a], #16\n\t"
  47109. #else
  47110. "lsr r6, %[a], #16\n\t"
  47111. #endif
  47112. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47113. "lsrs r7, %[b], #16\n\t"
  47114. #else
  47115. "lsr r7, %[b], #16\n\t"
  47116. #endif
  47117. #ifdef WOLFSSL_KEIL
  47118. "muls r7, r6, r7\n\t"
  47119. #elif defined(__clang__)
  47120. "muls r7, r6\n\t"
  47121. #else
  47122. "mul r7, r6\n\t"
  47123. #endif
  47124. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47125. "adds r5, r5, r7\n\t"
  47126. #else
  47127. "add r5, r5, r7\n\t"
  47128. #endif
  47129. #ifdef WOLFSSL_KEIL
  47130. "adcs r3, r3, %[r]\n\t"
  47131. #elif defined(__clang__)
  47132. "adcs r3, %[r]\n\t"
  47133. #else
  47134. "adc r3, %[r]\n\t"
  47135. #endif
  47136. "uxth r7, %[b]\n\t"
  47137. #ifdef WOLFSSL_KEIL
  47138. "muls r6, r7, r6\n\t"
  47139. #elif defined(__clang__)
  47140. "muls r6, r7\n\t"
  47141. #else
  47142. "mul r6, r7\n\t"
  47143. #endif
  47144. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47145. "lsrs r7, r6, #16\n\t"
  47146. #else
  47147. "lsr r7, r6, #16\n\t"
  47148. #endif
  47149. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47150. "lsls r6, r6, #16\n\t"
  47151. #else
  47152. "lsl r6, r6, #16\n\t"
  47153. #endif
  47154. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47155. "adds r4, r4, r6\n\t"
  47156. #else
  47157. "add r4, r4, r6\n\t"
  47158. #endif
  47159. #ifdef WOLFSSL_KEIL
  47160. "adcs r5, r5, r7\n\t"
  47161. #elif defined(__clang__)
  47162. "adcs r5, r7\n\t"
  47163. #else
  47164. "adc r5, r7\n\t"
  47165. #endif
  47166. #ifdef WOLFSSL_KEIL
  47167. "adcs r3, r3, %[r]\n\t"
  47168. #elif defined(__clang__)
  47169. "adcs r3, %[r]\n\t"
  47170. #else
  47171. "adc r3, %[r]\n\t"
  47172. #endif
  47173. "# A[7] * B[9]\n\t"
  47174. "mov %[a], r9\n\t"
  47175. "mov %[b], r10\n\t"
  47176. "ldr %[a], [%[a], #28]\n\t"
  47177. "ldr %[b], [%[b], #36]\n\t"
  47178. "uxth r6, %[a]\n\t"
  47179. "uxth r7, %[b]\n\t"
  47180. #ifdef WOLFSSL_KEIL
  47181. "muls r7, r6, r7\n\t"
  47182. #elif defined(__clang__)
  47183. "muls r7, r6\n\t"
  47184. #else
  47185. "mul r7, r6\n\t"
  47186. #endif
  47187. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47188. "adds r4, r4, r7\n\t"
  47189. #else
  47190. "add r4, r4, r7\n\t"
  47191. #endif
  47192. #ifdef WOLFSSL_KEIL
  47193. "adcs r5, r5, %[r]\n\t"
  47194. #elif defined(__clang__)
  47195. "adcs r5, %[r]\n\t"
  47196. #else
  47197. "adc r5, %[r]\n\t"
  47198. #endif
  47199. #ifdef WOLFSSL_KEIL
  47200. "adcs r3, r3, %[r]\n\t"
  47201. #elif defined(__clang__)
  47202. "adcs r3, %[r]\n\t"
  47203. #else
  47204. "adc r3, %[r]\n\t"
  47205. #endif
  47206. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47207. "lsrs r7, %[b], #16\n\t"
  47208. #else
  47209. "lsr r7, %[b], #16\n\t"
  47210. #endif
  47211. #ifdef WOLFSSL_KEIL
  47212. "muls r6, r7, r6\n\t"
  47213. #elif defined(__clang__)
  47214. "muls r6, r7\n\t"
  47215. #else
  47216. "mul r6, r7\n\t"
  47217. #endif
  47218. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47219. "lsrs r7, r6, #16\n\t"
  47220. #else
  47221. "lsr r7, r6, #16\n\t"
  47222. #endif
  47223. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47224. "lsls r6, r6, #16\n\t"
  47225. #else
  47226. "lsl r6, r6, #16\n\t"
  47227. #endif
  47228. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47229. "adds r4, r4, r6\n\t"
  47230. #else
  47231. "add r4, r4, r6\n\t"
  47232. #endif
  47233. #ifdef WOLFSSL_KEIL
  47234. "adcs r5, r5, r7\n\t"
  47235. #elif defined(__clang__)
  47236. "adcs r5, r7\n\t"
  47237. #else
  47238. "adc r5, r7\n\t"
  47239. #endif
  47240. #ifdef WOLFSSL_KEIL
  47241. "adcs r3, r3, %[r]\n\t"
  47242. #elif defined(__clang__)
  47243. "adcs r3, %[r]\n\t"
  47244. #else
  47245. "adc r3, %[r]\n\t"
  47246. #endif
  47247. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47248. "lsrs r6, %[a], #16\n\t"
  47249. #else
  47250. "lsr r6, %[a], #16\n\t"
  47251. #endif
  47252. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47253. "lsrs r7, %[b], #16\n\t"
  47254. #else
  47255. "lsr r7, %[b], #16\n\t"
  47256. #endif
  47257. #ifdef WOLFSSL_KEIL
  47258. "muls r7, r6, r7\n\t"
  47259. #elif defined(__clang__)
  47260. "muls r7, r6\n\t"
  47261. #else
  47262. "mul r7, r6\n\t"
  47263. #endif
  47264. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47265. "adds r5, r5, r7\n\t"
  47266. #else
  47267. "add r5, r5, r7\n\t"
  47268. #endif
  47269. #ifdef WOLFSSL_KEIL
  47270. "adcs r3, r3, %[r]\n\t"
  47271. #elif defined(__clang__)
  47272. "adcs r3, %[r]\n\t"
  47273. #else
  47274. "adc r3, %[r]\n\t"
  47275. #endif
  47276. "uxth r7, %[b]\n\t"
  47277. #ifdef WOLFSSL_KEIL
  47278. "muls r6, r7, r6\n\t"
  47279. #elif defined(__clang__)
  47280. "muls r6, r7\n\t"
  47281. #else
  47282. "mul r6, r7\n\t"
  47283. #endif
  47284. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47285. "lsrs r7, r6, #16\n\t"
  47286. #else
  47287. "lsr r7, r6, #16\n\t"
  47288. #endif
  47289. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47290. "lsls r6, r6, #16\n\t"
  47291. #else
  47292. "lsl r6, r6, #16\n\t"
  47293. #endif
  47294. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47295. "adds r4, r4, r6\n\t"
  47296. #else
  47297. "add r4, r4, r6\n\t"
  47298. #endif
  47299. #ifdef WOLFSSL_KEIL
  47300. "adcs r5, r5, r7\n\t"
  47301. #elif defined(__clang__)
  47302. "adcs r5, r7\n\t"
  47303. #else
  47304. "adc r5, r7\n\t"
  47305. #endif
  47306. #ifdef WOLFSSL_KEIL
  47307. "adcs r3, r3, %[r]\n\t"
  47308. #elif defined(__clang__)
  47309. "adcs r3, %[r]\n\t"
  47310. #else
  47311. "adc r3, %[r]\n\t"
  47312. #endif
  47313. "# A[6] * B[10]\n\t"
  47314. "mov %[a], r9\n\t"
  47315. "mov %[b], r10\n\t"
  47316. "ldr %[a], [%[a], #24]\n\t"
  47317. "ldr %[b], [%[b], #40]\n\t"
  47318. "uxth r6, %[a]\n\t"
  47319. "uxth r7, %[b]\n\t"
  47320. #ifdef WOLFSSL_KEIL
  47321. "muls r7, r6, r7\n\t"
  47322. #elif defined(__clang__)
  47323. "muls r7, r6\n\t"
  47324. #else
  47325. "mul r7, r6\n\t"
  47326. #endif
  47327. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47328. "adds r4, r4, r7\n\t"
  47329. #else
  47330. "add r4, r4, r7\n\t"
  47331. #endif
  47332. #ifdef WOLFSSL_KEIL
  47333. "adcs r5, r5, %[r]\n\t"
  47334. #elif defined(__clang__)
  47335. "adcs r5, %[r]\n\t"
  47336. #else
  47337. "adc r5, %[r]\n\t"
  47338. #endif
  47339. #ifdef WOLFSSL_KEIL
  47340. "adcs r3, r3, %[r]\n\t"
  47341. #elif defined(__clang__)
  47342. "adcs r3, %[r]\n\t"
  47343. #else
  47344. "adc r3, %[r]\n\t"
  47345. #endif
  47346. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47347. "lsrs r7, %[b], #16\n\t"
  47348. #else
  47349. "lsr r7, %[b], #16\n\t"
  47350. #endif
  47351. #ifdef WOLFSSL_KEIL
  47352. "muls r6, r7, r6\n\t"
  47353. #elif defined(__clang__)
  47354. "muls r6, r7\n\t"
  47355. #else
  47356. "mul r6, r7\n\t"
  47357. #endif
  47358. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47359. "lsrs r7, r6, #16\n\t"
  47360. #else
  47361. "lsr r7, r6, #16\n\t"
  47362. #endif
  47363. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47364. "lsls r6, r6, #16\n\t"
  47365. #else
  47366. "lsl r6, r6, #16\n\t"
  47367. #endif
  47368. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47369. "adds r4, r4, r6\n\t"
  47370. #else
  47371. "add r4, r4, r6\n\t"
  47372. #endif
  47373. #ifdef WOLFSSL_KEIL
  47374. "adcs r5, r5, r7\n\t"
  47375. #elif defined(__clang__)
  47376. "adcs r5, r7\n\t"
  47377. #else
  47378. "adc r5, r7\n\t"
  47379. #endif
  47380. #ifdef WOLFSSL_KEIL
  47381. "adcs r3, r3, %[r]\n\t"
  47382. #elif defined(__clang__)
  47383. "adcs r3, %[r]\n\t"
  47384. #else
  47385. "adc r3, %[r]\n\t"
  47386. #endif
  47387. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47388. "lsrs r6, %[a], #16\n\t"
  47389. #else
  47390. "lsr r6, %[a], #16\n\t"
  47391. #endif
  47392. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47393. "lsrs r7, %[b], #16\n\t"
  47394. #else
  47395. "lsr r7, %[b], #16\n\t"
  47396. #endif
  47397. #ifdef WOLFSSL_KEIL
  47398. "muls r7, r6, r7\n\t"
  47399. #elif defined(__clang__)
  47400. "muls r7, r6\n\t"
  47401. #else
  47402. "mul r7, r6\n\t"
  47403. #endif
  47404. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47405. "adds r5, r5, r7\n\t"
  47406. #else
  47407. "add r5, r5, r7\n\t"
  47408. #endif
  47409. #ifdef WOLFSSL_KEIL
  47410. "adcs r3, r3, %[r]\n\t"
  47411. #elif defined(__clang__)
  47412. "adcs r3, %[r]\n\t"
  47413. #else
  47414. "adc r3, %[r]\n\t"
  47415. #endif
  47416. "uxth r7, %[b]\n\t"
  47417. #ifdef WOLFSSL_KEIL
  47418. "muls r6, r7, r6\n\t"
  47419. #elif defined(__clang__)
  47420. "muls r6, r7\n\t"
  47421. #else
  47422. "mul r6, r7\n\t"
  47423. #endif
  47424. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47425. "lsrs r7, r6, #16\n\t"
  47426. #else
  47427. "lsr r7, r6, #16\n\t"
  47428. #endif
  47429. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47430. "lsls r6, r6, #16\n\t"
  47431. #else
  47432. "lsl r6, r6, #16\n\t"
  47433. #endif
  47434. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47435. "adds r4, r4, r6\n\t"
  47436. #else
  47437. "add r4, r4, r6\n\t"
  47438. #endif
  47439. #ifdef WOLFSSL_KEIL
  47440. "adcs r5, r5, r7\n\t"
  47441. #elif defined(__clang__)
  47442. "adcs r5, r7\n\t"
  47443. #else
  47444. "adc r5, r7\n\t"
  47445. #endif
  47446. #ifdef WOLFSSL_KEIL
  47447. "adcs r3, r3, %[r]\n\t"
  47448. #elif defined(__clang__)
  47449. "adcs r3, %[r]\n\t"
  47450. #else
  47451. "adc r3, %[r]\n\t"
  47452. #endif
  47453. "# A[5] * B[11]\n\t"
  47454. "mov %[a], r9\n\t"
  47455. "mov %[b], r10\n\t"
  47456. "ldr %[a], [%[a], #20]\n\t"
  47457. "ldr %[b], [%[b], #44]\n\t"
  47458. "uxth r6, %[a]\n\t"
  47459. "uxth r7, %[b]\n\t"
  47460. #ifdef WOLFSSL_KEIL
  47461. "muls r7, r6, r7\n\t"
  47462. #elif defined(__clang__)
  47463. "muls r7, r6\n\t"
  47464. #else
  47465. "mul r7, r6\n\t"
  47466. #endif
  47467. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47468. "adds r4, r4, r7\n\t"
  47469. #else
  47470. "add r4, r4, r7\n\t"
  47471. #endif
  47472. #ifdef WOLFSSL_KEIL
  47473. "adcs r5, r5, %[r]\n\t"
  47474. #elif defined(__clang__)
  47475. "adcs r5, %[r]\n\t"
  47476. #else
  47477. "adc r5, %[r]\n\t"
  47478. #endif
  47479. #ifdef WOLFSSL_KEIL
  47480. "adcs r3, r3, %[r]\n\t"
  47481. #elif defined(__clang__)
  47482. "adcs r3, %[r]\n\t"
  47483. #else
  47484. "adc r3, %[r]\n\t"
  47485. #endif
  47486. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47487. "lsrs r7, %[b], #16\n\t"
  47488. #else
  47489. "lsr r7, %[b], #16\n\t"
  47490. #endif
  47491. #ifdef WOLFSSL_KEIL
  47492. "muls r6, r7, r6\n\t"
  47493. #elif defined(__clang__)
  47494. "muls r6, r7\n\t"
  47495. #else
  47496. "mul r6, r7\n\t"
  47497. #endif
  47498. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47499. "lsrs r7, r6, #16\n\t"
  47500. #else
  47501. "lsr r7, r6, #16\n\t"
  47502. #endif
  47503. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47504. "lsls r6, r6, #16\n\t"
  47505. #else
  47506. "lsl r6, r6, #16\n\t"
  47507. #endif
  47508. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47509. "adds r4, r4, r6\n\t"
  47510. #else
  47511. "add r4, r4, r6\n\t"
  47512. #endif
  47513. #ifdef WOLFSSL_KEIL
  47514. "adcs r5, r5, r7\n\t"
  47515. #elif defined(__clang__)
  47516. "adcs r5, r7\n\t"
  47517. #else
  47518. "adc r5, r7\n\t"
  47519. #endif
  47520. #ifdef WOLFSSL_KEIL
  47521. "adcs r3, r3, %[r]\n\t"
  47522. #elif defined(__clang__)
  47523. "adcs r3, %[r]\n\t"
  47524. #else
  47525. "adc r3, %[r]\n\t"
  47526. #endif
  47527. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47528. "lsrs r6, %[a], #16\n\t"
  47529. #else
  47530. "lsr r6, %[a], #16\n\t"
  47531. #endif
  47532. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47533. "lsrs r7, %[b], #16\n\t"
  47534. #else
  47535. "lsr r7, %[b], #16\n\t"
  47536. #endif
  47537. #ifdef WOLFSSL_KEIL
  47538. "muls r7, r6, r7\n\t"
  47539. #elif defined(__clang__)
  47540. "muls r7, r6\n\t"
  47541. #else
  47542. "mul r7, r6\n\t"
  47543. #endif
  47544. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47545. "adds r5, r5, r7\n\t"
  47546. #else
  47547. "add r5, r5, r7\n\t"
  47548. #endif
  47549. #ifdef WOLFSSL_KEIL
  47550. "adcs r3, r3, %[r]\n\t"
  47551. #elif defined(__clang__)
  47552. "adcs r3, %[r]\n\t"
  47553. #else
  47554. "adc r3, %[r]\n\t"
  47555. #endif
  47556. "uxth r7, %[b]\n\t"
  47557. #ifdef WOLFSSL_KEIL
  47558. "muls r6, r7, r6\n\t"
  47559. #elif defined(__clang__)
  47560. "muls r6, r7\n\t"
  47561. #else
  47562. "mul r6, r7\n\t"
  47563. #endif
  47564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47565. "lsrs r7, r6, #16\n\t"
  47566. #else
  47567. "lsr r7, r6, #16\n\t"
  47568. #endif
  47569. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47570. "lsls r6, r6, #16\n\t"
  47571. #else
  47572. "lsl r6, r6, #16\n\t"
  47573. #endif
  47574. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47575. "adds r4, r4, r6\n\t"
  47576. #else
  47577. "add r4, r4, r6\n\t"
  47578. #endif
  47579. #ifdef WOLFSSL_KEIL
  47580. "adcs r5, r5, r7\n\t"
  47581. #elif defined(__clang__)
  47582. "adcs r5, r7\n\t"
  47583. #else
  47584. "adc r5, r7\n\t"
  47585. #endif
  47586. #ifdef WOLFSSL_KEIL
  47587. "adcs r3, r3, %[r]\n\t"
  47588. #elif defined(__clang__)
  47589. "adcs r3, %[r]\n\t"
  47590. #else
  47591. "adc r3, %[r]\n\t"
  47592. #endif
  47593. "mov %[r], r8\n\t"
  47594. "str r4, [%[r], #64]\n\t"
  47595. "movs %[r], #0\n\t"
  47596. "# A[6] * B[11]\n\t"
  47597. "movs r4, #0\n\t"
  47598. "mov %[a], r9\n\t"
  47599. "mov %[b], r10\n\t"
  47600. "ldr %[a], [%[a], #24]\n\t"
  47601. "ldr %[b], [%[b], #44]\n\t"
  47602. "uxth r6, %[a]\n\t"
  47603. "uxth r7, %[b]\n\t"
  47604. #ifdef WOLFSSL_KEIL
  47605. "muls r7, r6, r7\n\t"
  47606. #elif defined(__clang__)
  47607. "muls r7, r6\n\t"
  47608. #else
  47609. "mul r7, r6\n\t"
  47610. #endif
  47611. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47612. "adds r5, r5, r7\n\t"
  47613. #else
  47614. "add r5, r5, r7\n\t"
  47615. #endif
  47616. #ifdef WOLFSSL_KEIL
  47617. "adcs r3, r3, %[r]\n\t"
  47618. #elif defined(__clang__)
  47619. "adcs r3, %[r]\n\t"
  47620. #else
  47621. "adc r3, %[r]\n\t"
  47622. #endif
  47623. #ifdef WOLFSSL_KEIL
  47624. "adcs r4, r4, %[r]\n\t"
  47625. #elif defined(__clang__)
  47626. "adcs r4, %[r]\n\t"
  47627. #else
  47628. "adc r4, %[r]\n\t"
  47629. #endif
  47630. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47631. "lsrs r7, %[b], #16\n\t"
  47632. #else
  47633. "lsr r7, %[b], #16\n\t"
  47634. #endif
  47635. #ifdef WOLFSSL_KEIL
  47636. "muls r6, r7, r6\n\t"
  47637. #elif defined(__clang__)
  47638. "muls r6, r7\n\t"
  47639. #else
  47640. "mul r6, r7\n\t"
  47641. #endif
  47642. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47643. "lsrs r7, r6, #16\n\t"
  47644. #else
  47645. "lsr r7, r6, #16\n\t"
  47646. #endif
  47647. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47648. "lsls r6, r6, #16\n\t"
  47649. #else
  47650. "lsl r6, r6, #16\n\t"
  47651. #endif
  47652. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47653. "adds r5, r5, r6\n\t"
  47654. #else
  47655. "add r5, r5, r6\n\t"
  47656. #endif
  47657. #ifdef WOLFSSL_KEIL
  47658. "adcs r3, r3, r7\n\t"
  47659. #elif defined(__clang__)
  47660. "adcs r3, r7\n\t"
  47661. #else
  47662. "adc r3, r7\n\t"
  47663. #endif
  47664. #ifdef WOLFSSL_KEIL
  47665. "adcs r4, r4, %[r]\n\t"
  47666. #elif defined(__clang__)
  47667. "adcs r4, %[r]\n\t"
  47668. #else
  47669. "adc r4, %[r]\n\t"
  47670. #endif
  47671. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47672. "lsrs r6, %[a], #16\n\t"
  47673. #else
  47674. "lsr r6, %[a], #16\n\t"
  47675. #endif
  47676. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47677. "lsrs r7, %[b], #16\n\t"
  47678. #else
  47679. "lsr r7, %[b], #16\n\t"
  47680. #endif
  47681. #ifdef WOLFSSL_KEIL
  47682. "muls r7, r6, r7\n\t"
  47683. #elif defined(__clang__)
  47684. "muls r7, r6\n\t"
  47685. #else
  47686. "mul r7, r6\n\t"
  47687. #endif
  47688. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47689. "adds r3, r3, r7\n\t"
  47690. #else
  47691. "add r3, r3, r7\n\t"
  47692. #endif
  47693. #ifdef WOLFSSL_KEIL
  47694. "adcs r4, r4, %[r]\n\t"
  47695. #elif defined(__clang__)
  47696. "adcs r4, %[r]\n\t"
  47697. #else
  47698. "adc r4, %[r]\n\t"
  47699. #endif
  47700. "uxth r7, %[b]\n\t"
  47701. #ifdef WOLFSSL_KEIL
  47702. "muls r6, r7, r6\n\t"
  47703. #elif defined(__clang__)
  47704. "muls r6, r7\n\t"
  47705. #else
  47706. "mul r6, r7\n\t"
  47707. #endif
  47708. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47709. "lsrs r7, r6, #16\n\t"
  47710. #else
  47711. "lsr r7, r6, #16\n\t"
  47712. #endif
  47713. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47714. "lsls r6, r6, #16\n\t"
  47715. #else
  47716. "lsl r6, r6, #16\n\t"
  47717. #endif
  47718. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47719. "adds r5, r5, r6\n\t"
  47720. #else
  47721. "add r5, r5, r6\n\t"
  47722. #endif
  47723. #ifdef WOLFSSL_KEIL
  47724. "adcs r3, r3, r7\n\t"
  47725. #elif defined(__clang__)
  47726. "adcs r3, r7\n\t"
  47727. #else
  47728. "adc r3, r7\n\t"
  47729. #endif
  47730. #ifdef WOLFSSL_KEIL
  47731. "adcs r4, r4, %[r]\n\t"
  47732. #elif defined(__clang__)
  47733. "adcs r4, %[r]\n\t"
  47734. #else
  47735. "adc r4, %[r]\n\t"
  47736. #endif
  47737. "# A[7] * B[10]\n\t"
  47738. "mov %[a], r9\n\t"
  47739. "mov %[b], r10\n\t"
  47740. "ldr %[a], [%[a], #28]\n\t"
  47741. "ldr %[b], [%[b], #40]\n\t"
  47742. "uxth r6, %[a]\n\t"
  47743. "uxth r7, %[b]\n\t"
  47744. #ifdef WOLFSSL_KEIL
  47745. "muls r7, r6, r7\n\t"
  47746. #elif defined(__clang__)
  47747. "muls r7, r6\n\t"
  47748. #else
  47749. "mul r7, r6\n\t"
  47750. #endif
  47751. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47752. "adds r5, r5, r7\n\t"
  47753. #else
  47754. "add r5, r5, r7\n\t"
  47755. #endif
  47756. #ifdef WOLFSSL_KEIL
  47757. "adcs r3, r3, %[r]\n\t"
  47758. #elif defined(__clang__)
  47759. "adcs r3, %[r]\n\t"
  47760. #else
  47761. "adc r3, %[r]\n\t"
  47762. #endif
  47763. #ifdef WOLFSSL_KEIL
  47764. "adcs r4, r4, %[r]\n\t"
  47765. #elif defined(__clang__)
  47766. "adcs r4, %[r]\n\t"
  47767. #else
  47768. "adc r4, %[r]\n\t"
  47769. #endif
  47770. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47771. "lsrs r7, %[b], #16\n\t"
  47772. #else
  47773. "lsr r7, %[b], #16\n\t"
  47774. #endif
  47775. #ifdef WOLFSSL_KEIL
  47776. "muls r6, r7, r6\n\t"
  47777. #elif defined(__clang__)
  47778. "muls r6, r7\n\t"
  47779. #else
  47780. "mul r6, r7\n\t"
  47781. #endif
  47782. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47783. "lsrs r7, r6, #16\n\t"
  47784. #else
  47785. "lsr r7, r6, #16\n\t"
  47786. #endif
  47787. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47788. "lsls r6, r6, #16\n\t"
  47789. #else
  47790. "lsl r6, r6, #16\n\t"
  47791. #endif
  47792. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47793. "adds r5, r5, r6\n\t"
  47794. #else
  47795. "add r5, r5, r6\n\t"
  47796. #endif
  47797. #ifdef WOLFSSL_KEIL
  47798. "adcs r3, r3, r7\n\t"
  47799. #elif defined(__clang__)
  47800. "adcs r3, r7\n\t"
  47801. #else
  47802. "adc r3, r7\n\t"
  47803. #endif
  47804. #ifdef WOLFSSL_KEIL
  47805. "adcs r4, r4, %[r]\n\t"
  47806. #elif defined(__clang__)
  47807. "adcs r4, %[r]\n\t"
  47808. #else
  47809. "adc r4, %[r]\n\t"
  47810. #endif
  47811. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47812. "lsrs r6, %[a], #16\n\t"
  47813. #else
  47814. "lsr r6, %[a], #16\n\t"
  47815. #endif
  47816. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47817. "lsrs r7, %[b], #16\n\t"
  47818. #else
  47819. "lsr r7, %[b], #16\n\t"
  47820. #endif
  47821. #ifdef WOLFSSL_KEIL
  47822. "muls r7, r6, r7\n\t"
  47823. #elif defined(__clang__)
  47824. "muls r7, r6\n\t"
  47825. #else
  47826. "mul r7, r6\n\t"
  47827. #endif
  47828. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47829. "adds r3, r3, r7\n\t"
  47830. #else
  47831. "add r3, r3, r7\n\t"
  47832. #endif
  47833. #ifdef WOLFSSL_KEIL
  47834. "adcs r4, r4, %[r]\n\t"
  47835. #elif defined(__clang__)
  47836. "adcs r4, %[r]\n\t"
  47837. #else
  47838. "adc r4, %[r]\n\t"
  47839. #endif
  47840. "uxth r7, %[b]\n\t"
  47841. #ifdef WOLFSSL_KEIL
  47842. "muls r6, r7, r6\n\t"
  47843. #elif defined(__clang__)
  47844. "muls r6, r7\n\t"
  47845. #else
  47846. "mul r6, r7\n\t"
  47847. #endif
  47848. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47849. "lsrs r7, r6, #16\n\t"
  47850. #else
  47851. "lsr r7, r6, #16\n\t"
  47852. #endif
  47853. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47854. "lsls r6, r6, #16\n\t"
  47855. #else
  47856. "lsl r6, r6, #16\n\t"
  47857. #endif
  47858. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47859. "adds r5, r5, r6\n\t"
  47860. #else
  47861. "add r5, r5, r6\n\t"
  47862. #endif
  47863. #ifdef WOLFSSL_KEIL
  47864. "adcs r3, r3, r7\n\t"
  47865. #elif defined(__clang__)
  47866. "adcs r3, r7\n\t"
  47867. #else
  47868. "adc r3, r7\n\t"
  47869. #endif
  47870. #ifdef WOLFSSL_KEIL
  47871. "adcs r4, r4, %[r]\n\t"
  47872. #elif defined(__clang__)
  47873. "adcs r4, %[r]\n\t"
  47874. #else
  47875. "adc r4, %[r]\n\t"
  47876. #endif
  47877. "# A[8] * B[9]\n\t"
  47878. "mov %[a], r9\n\t"
  47879. "mov %[b], r10\n\t"
  47880. "ldr %[a], [%[a], #32]\n\t"
  47881. "ldr %[b], [%[b], #36]\n\t"
  47882. "uxth r6, %[a]\n\t"
  47883. "uxth r7, %[b]\n\t"
  47884. #ifdef WOLFSSL_KEIL
  47885. "muls r7, r6, r7\n\t"
  47886. #elif defined(__clang__)
  47887. "muls r7, r6\n\t"
  47888. #else
  47889. "mul r7, r6\n\t"
  47890. #endif
  47891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47892. "adds r5, r5, r7\n\t"
  47893. #else
  47894. "add r5, r5, r7\n\t"
  47895. #endif
  47896. #ifdef WOLFSSL_KEIL
  47897. "adcs r3, r3, %[r]\n\t"
  47898. #elif defined(__clang__)
  47899. "adcs r3, %[r]\n\t"
  47900. #else
  47901. "adc r3, %[r]\n\t"
  47902. #endif
  47903. #ifdef WOLFSSL_KEIL
  47904. "adcs r4, r4, %[r]\n\t"
  47905. #elif defined(__clang__)
  47906. "adcs r4, %[r]\n\t"
  47907. #else
  47908. "adc r4, %[r]\n\t"
  47909. #endif
  47910. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47911. "lsrs r7, %[b], #16\n\t"
  47912. #else
  47913. "lsr r7, %[b], #16\n\t"
  47914. #endif
  47915. #ifdef WOLFSSL_KEIL
  47916. "muls r6, r7, r6\n\t"
  47917. #elif defined(__clang__)
  47918. "muls r6, r7\n\t"
  47919. #else
  47920. "mul r6, r7\n\t"
  47921. #endif
  47922. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47923. "lsrs r7, r6, #16\n\t"
  47924. #else
  47925. "lsr r7, r6, #16\n\t"
  47926. #endif
  47927. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47928. "lsls r6, r6, #16\n\t"
  47929. #else
  47930. "lsl r6, r6, #16\n\t"
  47931. #endif
  47932. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47933. "adds r5, r5, r6\n\t"
  47934. #else
  47935. "add r5, r5, r6\n\t"
  47936. #endif
  47937. #ifdef WOLFSSL_KEIL
  47938. "adcs r3, r3, r7\n\t"
  47939. #elif defined(__clang__)
  47940. "adcs r3, r7\n\t"
  47941. #else
  47942. "adc r3, r7\n\t"
  47943. #endif
  47944. #ifdef WOLFSSL_KEIL
  47945. "adcs r4, r4, %[r]\n\t"
  47946. #elif defined(__clang__)
  47947. "adcs r4, %[r]\n\t"
  47948. #else
  47949. "adc r4, %[r]\n\t"
  47950. #endif
  47951. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47952. "lsrs r6, %[a], #16\n\t"
  47953. #else
  47954. "lsr r6, %[a], #16\n\t"
  47955. #endif
  47956. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47957. "lsrs r7, %[b], #16\n\t"
  47958. #else
  47959. "lsr r7, %[b], #16\n\t"
  47960. #endif
  47961. #ifdef WOLFSSL_KEIL
  47962. "muls r7, r6, r7\n\t"
  47963. #elif defined(__clang__)
  47964. "muls r7, r6\n\t"
  47965. #else
  47966. "mul r7, r6\n\t"
  47967. #endif
  47968. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47969. "adds r3, r3, r7\n\t"
  47970. #else
  47971. "add r3, r3, r7\n\t"
  47972. #endif
  47973. #ifdef WOLFSSL_KEIL
  47974. "adcs r4, r4, %[r]\n\t"
  47975. #elif defined(__clang__)
  47976. "adcs r4, %[r]\n\t"
  47977. #else
  47978. "adc r4, %[r]\n\t"
  47979. #endif
  47980. "uxth r7, %[b]\n\t"
  47981. #ifdef WOLFSSL_KEIL
  47982. "muls r6, r7, r6\n\t"
  47983. #elif defined(__clang__)
  47984. "muls r6, r7\n\t"
  47985. #else
  47986. "mul r6, r7\n\t"
  47987. #endif
  47988. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47989. "lsrs r7, r6, #16\n\t"
  47990. #else
  47991. "lsr r7, r6, #16\n\t"
  47992. #endif
  47993. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47994. "lsls r6, r6, #16\n\t"
  47995. #else
  47996. "lsl r6, r6, #16\n\t"
  47997. #endif
  47998. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47999. "adds r5, r5, r6\n\t"
  48000. #else
  48001. "add r5, r5, r6\n\t"
  48002. #endif
  48003. #ifdef WOLFSSL_KEIL
  48004. "adcs r3, r3, r7\n\t"
  48005. #elif defined(__clang__)
  48006. "adcs r3, r7\n\t"
  48007. #else
  48008. "adc r3, r7\n\t"
  48009. #endif
  48010. #ifdef WOLFSSL_KEIL
  48011. "adcs r4, r4, %[r]\n\t"
  48012. #elif defined(__clang__)
  48013. "adcs r4, %[r]\n\t"
  48014. #else
  48015. "adc r4, %[r]\n\t"
  48016. #endif
  48017. "# A[9] * B[8]\n\t"
  48018. "mov %[a], r9\n\t"
  48019. "mov %[b], r10\n\t"
  48020. "ldr %[a], [%[a], #36]\n\t"
  48021. "ldr %[b], [%[b], #32]\n\t"
  48022. "uxth r6, %[a]\n\t"
  48023. "uxth r7, %[b]\n\t"
  48024. #ifdef WOLFSSL_KEIL
  48025. "muls r7, r6, r7\n\t"
  48026. #elif defined(__clang__)
  48027. "muls r7, r6\n\t"
  48028. #else
  48029. "mul r7, r6\n\t"
  48030. #endif
  48031. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48032. "adds r5, r5, r7\n\t"
  48033. #else
  48034. "add r5, r5, r7\n\t"
  48035. #endif
  48036. #ifdef WOLFSSL_KEIL
  48037. "adcs r3, r3, %[r]\n\t"
  48038. #elif defined(__clang__)
  48039. "adcs r3, %[r]\n\t"
  48040. #else
  48041. "adc r3, %[r]\n\t"
  48042. #endif
  48043. #ifdef WOLFSSL_KEIL
  48044. "adcs r4, r4, %[r]\n\t"
  48045. #elif defined(__clang__)
  48046. "adcs r4, %[r]\n\t"
  48047. #else
  48048. "adc r4, %[r]\n\t"
  48049. #endif
  48050. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48051. "lsrs r7, %[b], #16\n\t"
  48052. #else
  48053. "lsr r7, %[b], #16\n\t"
  48054. #endif
  48055. #ifdef WOLFSSL_KEIL
  48056. "muls r6, r7, r6\n\t"
  48057. #elif defined(__clang__)
  48058. "muls r6, r7\n\t"
  48059. #else
  48060. "mul r6, r7\n\t"
  48061. #endif
  48062. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48063. "lsrs r7, r6, #16\n\t"
  48064. #else
  48065. "lsr r7, r6, #16\n\t"
  48066. #endif
  48067. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48068. "lsls r6, r6, #16\n\t"
  48069. #else
  48070. "lsl r6, r6, #16\n\t"
  48071. #endif
  48072. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48073. "adds r5, r5, r6\n\t"
  48074. #else
  48075. "add r5, r5, r6\n\t"
  48076. #endif
  48077. #ifdef WOLFSSL_KEIL
  48078. "adcs r3, r3, r7\n\t"
  48079. #elif defined(__clang__)
  48080. "adcs r3, r7\n\t"
  48081. #else
  48082. "adc r3, r7\n\t"
  48083. #endif
  48084. #ifdef WOLFSSL_KEIL
  48085. "adcs r4, r4, %[r]\n\t"
  48086. #elif defined(__clang__)
  48087. "adcs r4, %[r]\n\t"
  48088. #else
  48089. "adc r4, %[r]\n\t"
  48090. #endif
  48091. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48092. "lsrs r6, %[a], #16\n\t"
  48093. #else
  48094. "lsr r6, %[a], #16\n\t"
  48095. #endif
  48096. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48097. "lsrs r7, %[b], #16\n\t"
  48098. #else
  48099. "lsr r7, %[b], #16\n\t"
  48100. #endif
  48101. #ifdef WOLFSSL_KEIL
  48102. "muls r7, r6, r7\n\t"
  48103. #elif defined(__clang__)
  48104. "muls r7, r6\n\t"
  48105. #else
  48106. "mul r7, r6\n\t"
  48107. #endif
  48108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48109. "adds r3, r3, r7\n\t"
  48110. #else
  48111. "add r3, r3, r7\n\t"
  48112. #endif
  48113. #ifdef WOLFSSL_KEIL
  48114. "adcs r4, r4, %[r]\n\t"
  48115. #elif defined(__clang__)
  48116. "adcs r4, %[r]\n\t"
  48117. #else
  48118. "adc r4, %[r]\n\t"
  48119. #endif
  48120. "uxth r7, %[b]\n\t"
  48121. #ifdef WOLFSSL_KEIL
  48122. "muls r6, r7, r6\n\t"
  48123. #elif defined(__clang__)
  48124. "muls r6, r7\n\t"
  48125. #else
  48126. "mul r6, r7\n\t"
  48127. #endif
  48128. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48129. "lsrs r7, r6, #16\n\t"
  48130. #else
  48131. "lsr r7, r6, #16\n\t"
  48132. #endif
  48133. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48134. "lsls r6, r6, #16\n\t"
  48135. #else
  48136. "lsl r6, r6, #16\n\t"
  48137. #endif
  48138. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48139. "adds r5, r5, r6\n\t"
  48140. #else
  48141. "add r5, r5, r6\n\t"
  48142. #endif
  48143. #ifdef WOLFSSL_KEIL
  48144. "adcs r3, r3, r7\n\t"
  48145. #elif defined(__clang__)
  48146. "adcs r3, r7\n\t"
  48147. #else
  48148. "adc r3, r7\n\t"
  48149. #endif
  48150. #ifdef WOLFSSL_KEIL
  48151. "adcs r4, r4, %[r]\n\t"
  48152. #elif defined(__clang__)
  48153. "adcs r4, %[r]\n\t"
  48154. #else
  48155. "adc r4, %[r]\n\t"
  48156. #endif
  48157. "# A[10] * B[7]\n\t"
  48158. "mov %[a], r9\n\t"
  48159. "mov %[b], r10\n\t"
  48160. "ldr %[a], [%[a], #40]\n\t"
  48161. "ldr %[b], [%[b], #28]\n\t"
  48162. "uxth r6, %[a]\n\t"
  48163. "uxth r7, %[b]\n\t"
  48164. #ifdef WOLFSSL_KEIL
  48165. "muls r7, r6, r7\n\t"
  48166. #elif defined(__clang__)
  48167. "muls r7, r6\n\t"
  48168. #else
  48169. "mul r7, r6\n\t"
  48170. #endif
  48171. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48172. "adds r5, r5, r7\n\t"
  48173. #else
  48174. "add r5, r5, r7\n\t"
  48175. #endif
  48176. #ifdef WOLFSSL_KEIL
  48177. "adcs r3, r3, %[r]\n\t"
  48178. #elif defined(__clang__)
  48179. "adcs r3, %[r]\n\t"
  48180. #else
  48181. "adc r3, %[r]\n\t"
  48182. #endif
  48183. #ifdef WOLFSSL_KEIL
  48184. "adcs r4, r4, %[r]\n\t"
  48185. #elif defined(__clang__)
  48186. "adcs r4, %[r]\n\t"
  48187. #else
  48188. "adc r4, %[r]\n\t"
  48189. #endif
  48190. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48191. "lsrs r7, %[b], #16\n\t"
  48192. #else
  48193. "lsr r7, %[b], #16\n\t"
  48194. #endif
  48195. #ifdef WOLFSSL_KEIL
  48196. "muls r6, r7, r6\n\t"
  48197. #elif defined(__clang__)
  48198. "muls r6, r7\n\t"
  48199. #else
  48200. "mul r6, r7\n\t"
  48201. #endif
  48202. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48203. "lsrs r7, r6, #16\n\t"
  48204. #else
  48205. "lsr r7, r6, #16\n\t"
  48206. #endif
  48207. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48208. "lsls r6, r6, #16\n\t"
  48209. #else
  48210. "lsl r6, r6, #16\n\t"
  48211. #endif
  48212. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48213. "adds r5, r5, r6\n\t"
  48214. #else
  48215. "add r5, r5, r6\n\t"
  48216. #endif
  48217. #ifdef WOLFSSL_KEIL
  48218. "adcs r3, r3, r7\n\t"
  48219. #elif defined(__clang__)
  48220. "adcs r3, r7\n\t"
  48221. #else
  48222. "adc r3, r7\n\t"
  48223. #endif
  48224. #ifdef WOLFSSL_KEIL
  48225. "adcs r4, r4, %[r]\n\t"
  48226. #elif defined(__clang__)
  48227. "adcs r4, %[r]\n\t"
  48228. #else
  48229. "adc r4, %[r]\n\t"
  48230. #endif
  48231. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48232. "lsrs r6, %[a], #16\n\t"
  48233. #else
  48234. "lsr r6, %[a], #16\n\t"
  48235. #endif
  48236. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48237. "lsrs r7, %[b], #16\n\t"
  48238. #else
  48239. "lsr r7, %[b], #16\n\t"
  48240. #endif
  48241. #ifdef WOLFSSL_KEIL
  48242. "muls r7, r6, r7\n\t"
  48243. #elif defined(__clang__)
  48244. "muls r7, r6\n\t"
  48245. #else
  48246. "mul r7, r6\n\t"
  48247. #endif
  48248. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48249. "adds r3, r3, r7\n\t"
  48250. #else
  48251. "add r3, r3, r7\n\t"
  48252. #endif
  48253. #ifdef WOLFSSL_KEIL
  48254. "adcs r4, r4, %[r]\n\t"
  48255. #elif defined(__clang__)
  48256. "adcs r4, %[r]\n\t"
  48257. #else
  48258. "adc r4, %[r]\n\t"
  48259. #endif
  48260. "uxth r7, %[b]\n\t"
  48261. #ifdef WOLFSSL_KEIL
  48262. "muls r6, r7, r6\n\t"
  48263. #elif defined(__clang__)
  48264. "muls r6, r7\n\t"
  48265. #else
  48266. "mul r6, r7\n\t"
  48267. #endif
  48268. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48269. "lsrs r7, r6, #16\n\t"
  48270. #else
  48271. "lsr r7, r6, #16\n\t"
  48272. #endif
  48273. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48274. "lsls r6, r6, #16\n\t"
  48275. #else
  48276. "lsl r6, r6, #16\n\t"
  48277. #endif
  48278. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48279. "adds r5, r5, r6\n\t"
  48280. #else
  48281. "add r5, r5, r6\n\t"
  48282. #endif
  48283. #ifdef WOLFSSL_KEIL
  48284. "adcs r3, r3, r7\n\t"
  48285. #elif defined(__clang__)
  48286. "adcs r3, r7\n\t"
  48287. #else
  48288. "adc r3, r7\n\t"
  48289. #endif
  48290. #ifdef WOLFSSL_KEIL
  48291. "adcs r4, r4, %[r]\n\t"
  48292. #elif defined(__clang__)
  48293. "adcs r4, %[r]\n\t"
  48294. #else
  48295. "adc r4, %[r]\n\t"
  48296. #endif
  48297. "# A[11] * B[6]\n\t"
  48298. "mov %[a], r9\n\t"
  48299. "mov %[b], r10\n\t"
  48300. "ldr %[a], [%[a], #44]\n\t"
  48301. "ldr %[b], [%[b], #24]\n\t"
  48302. "uxth r6, %[a]\n\t"
  48303. "uxth r7, %[b]\n\t"
  48304. #ifdef WOLFSSL_KEIL
  48305. "muls r7, r6, r7\n\t"
  48306. #elif defined(__clang__)
  48307. "muls r7, r6\n\t"
  48308. #else
  48309. "mul r7, r6\n\t"
  48310. #endif
  48311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48312. "adds r5, r5, r7\n\t"
  48313. #else
  48314. "add r5, r5, r7\n\t"
  48315. #endif
  48316. #ifdef WOLFSSL_KEIL
  48317. "adcs r3, r3, %[r]\n\t"
  48318. #elif defined(__clang__)
  48319. "adcs r3, %[r]\n\t"
  48320. #else
  48321. "adc r3, %[r]\n\t"
  48322. #endif
  48323. #ifdef WOLFSSL_KEIL
  48324. "adcs r4, r4, %[r]\n\t"
  48325. #elif defined(__clang__)
  48326. "adcs r4, %[r]\n\t"
  48327. #else
  48328. "adc r4, %[r]\n\t"
  48329. #endif
  48330. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48331. "lsrs r7, %[b], #16\n\t"
  48332. #else
  48333. "lsr r7, %[b], #16\n\t"
  48334. #endif
  48335. #ifdef WOLFSSL_KEIL
  48336. "muls r6, r7, r6\n\t"
  48337. #elif defined(__clang__)
  48338. "muls r6, r7\n\t"
  48339. #else
  48340. "mul r6, r7\n\t"
  48341. #endif
  48342. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48343. "lsrs r7, r6, #16\n\t"
  48344. #else
  48345. "lsr r7, r6, #16\n\t"
  48346. #endif
  48347. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48348. "lsls r6, r6, #16\n\t"
  48349. #else
  48350. "lsl r6, r6, #16\n\t"
  48351. #endif
  48352. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48353. "adds r5, r5, r6\n\t"
  48354. #else
  48355. "add r5, r5, r6\n\t"
  48356. #endif
  48357. #ifdef WOLFSSL_KEIL
  48358. "adcs r3, r3, r7\n\t"
  48359. #elif defined(__clang__)
  48360. "adcs r3, r7\n\t"
  48361. #else
  48362. "adc r3, r7\n\t"
  48363. #endif
  48364. #ifdef WOLFSSL_KEIL
  48365. "adcs r4, r4, %[r]\n\t"
  48366. #elif defined(__clang__)
  48367. "adcs r4, %[r]\n\t"
  48368. #else
  48369. "adc r4, %[r]\n\t"
  48370. #endif
  48371. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48372. "lsrs r6, %[a], #16\n\t"
  48373. #else
  48374. "lsr r6, %[a], #16\n\t"
  48375. #endif
  48376. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48377. "lsrs r7, %[b], #16\n\t"
  48378. #else
  48379. "lsr r7, %[b], #16\n\t"
  48380. #endif
  48381. #ifdef WOLFSSL_KEIL
  48382. "muls r7, r6, r7\n\t"
  48383. #elif defined(__clang__)
  48384. "muls r7, r6\n\t"
  48385. #else
  48386. "mul r7, r6\n\t"
  48387. #endif
  48388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48389. "adds r3, r3, r7\n\t"
  48390. #else
  48391. "add r3, r3, r7\n\t"
  48392. #endif
  48393. #ifdef WOLFSSL_KEIL
  48394. "adcs r4, r4, %[r]\n\t"
  48395. #elif defined(__clang__)
  48396. "adcs r4, %[r]\n\t"
  48397. #else
  48398. "adc r4, %[r]\n\t"
  48399. #endif
  48400. "uxth r7, %[b]\n\t"
  48401. #ifdef WOLFSSL_KEIL
  48402. "muls r6, r7, r6\n\t"
  48403. #elif defined(__clang__)
  48404. "muls r6, r7\n\t"
  48405. #else
  48406. "mul r6, r7\n\t"
  48407. #endif
  48408. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48409. "lsrs r7, r6, #16\n\t"
  48410. #else
  48411. "lsr r7, r6, #16\n\t"
  48412. #endif
  48413. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48414. "lsls r6, r6, #16\n\t"
  48415. #else
  48416. "lsl r6, r6, #16\n\t"
  48417. #endif
  48418. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48419. "adds r5, r5, r6\n\t"
  48420. #else
  48421. "add r5, r5, r6\n\t"
  48422. #endif
  48423. #ifdef WOLFSSL_KEIL
  48424. "adcs r3, r3, r7\n\t"
  48425. #elif defined(__clang__)
  48426. "adcs r3, r7\n\t"
  48427. #else
  48428. "adc r3, r7\n\t"
  48429. #endif
  48430. #ifdef WOLFSSL_KEIL
  48431. "adcs r4, r4, %[r]\n\t"
  48432. #elif defined(__clang__)
  48433. "adcs r4, %[r]\n\t"
  48434. #else
  48435. "adc r4, %[r]\n\t"
  48436. #endif
  48437. "mov %[r], r8\n\t"
  48438. "str r5, [%[r], #68]\n\t"
  48439. "movs %[r], #0\n\t"
  48440. "# A[11] * B[7]\n\t"
  48441. "movs r5, #0\n\t"
  48442. "mov %[a], r9\n\t"
  48443. "mov %[b], r10\n\t"
  48444. "ldr %[a], [%[a], #44]\n\t"
  48445. "ldr %[b], [%[b], #28]\n\t"
  48446. "uxth r6, %[a]\n\t"
  48447. "uxth r7, %[b]\n\t"
  48448. #ifdef WOLFSSL_KEIL
  48449. "muls r7, r6, r7\n\t"
  48450. #elif defined(__clang__)
  48451. "muls r7, r6\n\t"
  48452. #else
  48453. "mul r7, r6\n\t"
  48454. #endif
  48455. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48456. "adds r3, r3, r7\n\t"
  48457. #else
  48458. "add r3, r3, r7\n\t"
  48459. #endif
  48460. #ifdef WOLFSSL_KEIL
  48461. "adcs r4, r4, %[r]\n\t"
  48462. #elif defined(__clang__)
  48463. "adcs r4, %[r]\n\t"
  48464. #else
  48465. "adc r4, %[r]\n\t"
  48466. #endif
  48467. #ifdef WOLFSSL_KEIL
  48468. "adcs r5, r5, %[r]\n\t"
  48469. #elif defined(__clang__)
  48470. "adcs r5, %[r]\n\t"
  48471. #else
  48472. "adc r5, %[r]\n\t"
  48473. #endif
  48474. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48475. "lsrs r7, %[b], #16\n\t"
  48476. #else
  48477. "lsr r7, %[b], #16\n\t"
  48478. #endif
  48479. #ifdef WOLFSSL_KEIL
  48480. "muls r6, r7, r6\n\t"
  48481. #elif defined(__clang__)
  48482. "muls r6, r7\n\t"
  48483. #else
  48484. "mul r6, r7\n\t"
  48485. #endif
  48486. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48487. "lsrs r7, r6, #16\n\t"
  48488. #else
  48489. "lsr r7, r6, #16\n\t"
  48490. #endif
  48491. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48492. "lsls r6, r6, #16\n\t"
  48493. #else
  48494. "lsl r6, r6, #16\n\t"
  48495. #endif
  48496. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48497. "adds r3, r3, r6\n\t"
  48498. #else
  48499. "add r3, r3, r6\n\t"
  48500. #endif
  48501. #ifdef WOLFSSL_KEIL
  48502. "adcs r4, r4, r7\n\t"
  48503. #elif defined(__clang__)
  48504. "adcs r4, r7\n\t"
  48505. #else
  48506. "adc r4, r7\n\t"
  48507. #endif
  48508. #ifdef WOLFSSL_KEIL
  48509. "adcs r5, r5, %[r]\n\t"
  48510. #elif defined(__clang__)
  48511. "adcs r5, %[r]\n\t"
  48512. #else
  48513. "adc r5, %[r]\n\t"
  48514. #endif
  48515. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48516. "lsrs r6, %[a], #16\n\t"
  48517. #else
  48518. "lsr r6, %[a], #16\n\t"
  48519. #endif
  48520. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48521. "lsrs r7, %[b], #16\n\t"
  48522. #else
  48523. "lsr r7, %[b], #16\n\t"
  48524. #endif
  48525. #ifdef WOLFSSL_KEIL
  48526. "muls r7, r6, r7\n\t"
  48527. #elif defined(__clang__)
  48528. "muls r7, r6\n\t"
  48529. #else
  48530. "mul r7, r6\n\t"
  48531. #endif
  48532. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48533. "adds r4, r4, r7\n\t"
  48534. #else
  48535. "add r4, r4, r7\n\t"
  48536. #endif
  48537. #ifdef WOLFSSL_KEIL
  48538. "adcs r5, r5, %[r]\n\t"
  48539. #elif defined(__clang__)
  48540. "adcs r5, %[r]\n\t"
  48541. #else
  48542. "adc r5, %[r]\n\t"
  48543. #endif
  48544. "uxth r7, %[b]\n\t"
  48545. #ifdef WOLFSSL_KEIL
  48546. "muls r6, r7, r6\n\t"
  48547. #elif defined(__clang__)
  48548. "muls r6, r7\n\t"
  48549. #else
  48550. "mul r6, r7\n\t"
  48551. #endif
  48552. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48553. "lsrs r7, r6, #16\n\t"
  48554. #else
  48555. "lsr r7, r6, #16\n\t"
  48556. #endif
  48557. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48558. "lsls r6, r6, #16\n\t"
  48559. #else
  48560. "lsl r6, r6, #16\n\t"
  48561. #endif
  48562. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48563. "adds r3, r3, r6\n\t"
  48564. #else
  48565. "add r3, r3, r6\n\t"
  48566. #endif
  48567. #ifdef WOLFSSL_KEIL
  48568. "adcs r4, r4, r7\n\t"
  48569. #elif defined(__clang__)
  48570. "adcs r4, r7\n\t"
  48571. #else
  48572. "adc r4, r7\n\t"
  48573. #endif
  48574. #ifdef WOLFSSL_KEIL
  48575. "adcs r5, r5, %[r]\n\t"
  48576. #elif defined(__clang__)
  48577. "adcs r5, %[r]\n\t"
  48578. #else
  48579. "adc r5, %[r]\n\t"
  48580. #endif
  48581. "# A[10] * B[8]\n\t"
  48582. "mov %[a], r9\n\t"
  48583. "mov %[b], r10\n\t"
  48584. "ldr %[a], [%[a], #40]\n\t"
  48585. "ldr %[b], [%[b], #32]\n\t"
  48586. "uxth r6, %[a]\n\t"
  48587. "uxth r7, %[b]\n\t"
  48588. #ifdef WOLFSSL_KEIL
  48589. "muls r7, r6, r7\n\t"
  48590. #elif defined(__clang__)
  48591. "muls r7, r6\n\t"
  48592. #else
  48593. "mul r7, r6\n\t"
  48594. #endif
  48595. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48596. "adds r3, r3, r7\n\t"
  48597. #else
  48598. "add r3, r3, r7\n\t"
  48599. #endif
  48600. #ifdef WOLFSSL_KEIL
  48601. "adcs r4, r4, %[r]\n\t"
  48602. #elif defined(__clang__)
  48603. "adcs r4, %[r]\n\t"
  48604. #else
  48605. "adc r4, %[r]\n\t"
  48606. #endif
  48607. #ifdef WOLFSSL_KEIL
  48608. "adcs r5, r5, %[r]\n\t"
  48609. #elif defined(__clang__)
  48610. "adcs r5, %[r]\n\t"
  48611. #else
  48612. "adc r5, %[r]\n\t"
  48613. #endif
  48614. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48615. "lsrs r7, %[b], #16\n\t"
  48616. #else
  48617. "lsr r7, %[b], #16\n\t"
  48618. #endif
  48619. #ifdef WOLFSSL_KEIL
  48620. "muls r6, r7, r6\n\t"
  48621. #elif defined(__clang__)
  48622. "muls r6, r7\n\t"
  48623. #else
  48624. "mul r6, r7\n\t"
  48625. #endif
  48626. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48627. "lsrs r7, r6, #16\n\t"
  48628. #else
  48629. "lsr r7, r6, #16\n\t"
  48630. #endif
  48631. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48632. "lsls r6, r6, #16\n\t"
  48633. #else
  48634. "lsl r6, r6, #16\n\t"
  48635. #endif
  48636. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48637. "adds r3, r3, r6\n\t"
  48638. #else
  48639. "add r3, r3, r6\n\t"
  48640. #endif
  48641. #ifdef WOLFSSL_KEIL
  48642. "adcs r4, r4, r7\n\t"
  48643. #elif defined(__clang__)
  48644. "adcs r4, r7\n\t"
  48645. #else
  48646. "adc r4, r7\n\t"
  48647. #endif
  48648. #ifdef WOLFSSL_KEIL
  48649. "adcs r5, r5, %[r]\n\t"
  48650. #elif defined(__clang__)
  48651. "adcs r5, %[r]\n\t"
  48652. #else
  48653. "adc r5, %[r]\n\t"
  48654. #endif
  48655. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48656. "lsrs r6, %[a], #16\n\t"
  48657. #else
  48658. "lsr r6, %[a], #16\n\t"
  48659. #endif
  48660. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48661. "lsrs r7, %[b], #16\n\t"
  48662. #else
  48663. "lsr r7, %[b], #16\n\t"
  48664. #endif
  48665. #ifdef WOLFSSL_KEIL
  48666. "muls r7, r6, r7\n\t"
  48667. #elif defined(__clang__)
  48668. "muls r7, r6\n\t"
  48669. #else
  48670. "mul r7, r6\n\t"
  48671. #endif
  48672. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48673. "adds r4, r4, r7\n\t"
  48674. #else
  48675. "add r4, r4, r7\n\t"
  48676. #endif
  48677. #ifdef WOLFSSL_KEIL
  48678. "adcs r5, r5, %[r]\n\t"
  48679. #elif defined(__clang__)
  48680. "adcs r5, %[r]\n\t"
  48681. #else
  48682. "adc r5, %[r]\n\t"
  48683. #endif
  48684. "uxth r7, %[b]\n\t"
  48685. #ifdef WOLFSSL_KEIL
  48686. "muls r6, r7, r6\n\t"
  48687. #elif defined(__clang__)
  48688. "muls r6, r7\n\t"
  48689. #else
  48690. "mul r6, r7\n\t"
  48691. #endif
  48692. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48693. "lsrs r7, r6, #16\n\t"
  48694. #else
  48695. "lsr r7, r6, #16\n\t"
  48696. #endif
  48697. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48698. "lsls r6, r6, #16\n\t"
  48699. #else
  48700. "lsl r6, r6, #16\n\t"
  48701. #endif
  48702. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48703. "adds r3, r3, r6\n\t"
  48704. #else
  48705. "add r3, r3, r6\n\t"
  48706. #endif
  48707. #ifdef WOLFSSL_KEIL
  48708. "adcs r4, r4, r7\n\t"
  48709. #elif defined(__clang__)
  48710. "adcs r4, r7\n\t"
  48711. #else
  48712. "adc r4, r7\n\t"
  48713. #endif
  48714. #ifdef WOLFSSL_KEIL
  48715. "adcs r5, r5, %[r]\n\t"
  48716. #elif defined(__clang__)
  48717. "adcs r5, %[r]\n\t"
  48718. #else
  48719. "adc r5, %[r]\n\t"
  48720. #endif
  48721. "# A[9] * B[9]\n\t"
  48722. "mov %[a], r9\n\t"
  48723. "mov %[b], r10\n\t"
  48724. "ldr %[a], [%[a], #36]\n\t"
  48725. "ldr %[b], [%[b], #36]\n\t"
  48726. "uxth r6, %[a]\n\t"
  48727. "uxth r7, %[b]\n\t"
  48728. #ifdef WOLFSSL_KEIL
  48729. "muls r7, r6, r7\n\t"
  48730. #elif defined(__clang__)
  48731. "muls r7, r6\n\t"
  48732. #else
  48733. "mul r7, r6\n\t"
  48734. #endif
  48735. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48736. "adds r3, r3, r7\n\t"
  48737. #else
  48738. "add r3, r3, r7\n\t"
  48739. #endif
  48740. #ifdef WOLFSSL_KEIL
  48741. "adcs r4, r4, %[r]\n\t"
  48742. #elif defined(__clang__)
  48743. "adcs r4, %[r]\n\t"
  48744. #else
  48745. "adc r4, %[r]\n\t"
  48746. #endif
  48747. #ifdef WOLFSSL_KEIL
  48748. "adcs r5, r5, %[r]\n\t"
  48749. #elif defined(__clang__)
  48750. "adcs r5, %[r]\n\t"
  48751. #else
  48752. "adc r5, %[r]\n\t"
  48753. #endif
  48754. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48755. "lsrs r7, %[b], #16\n\t"
  48756. #else
  48757. "lsr r7, %[b], #16\n\t"
  48758. #endif
  48759. #ifdef WOLFSSL_KEIL
  48760. "muls r6, r7, r6\n\t"
  48761. #elif defined(__clang__)
  48762. "muls r6, r7\n\t"
  48763. #else
  48764. "mul r6, r7\n\t"
  48765. #endif
  48766. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48767. "lsrs r7, r6, #16\n\t"
  48768. #else
  48769. "lsr r7, r6, #16\n\t"
  48770. #endif
  48771. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48772. "lsls r6, r6, #16\n\t"
  48773. #else
  48774. "lsl r6, r6, #16\n\t"
  48775. #endif
  48776. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48777. "adds r3, r3, r6\n\t"
  48778. #else
  48779. "add r3, r3, r6\n\t"
  48780. #endif
  48781. #ifdef WOLFSSL_KEIL
  48782. "adcs r4, r4, r7\n\t"
  48783. #elif defined(__clang__)
  48784. "adcs r4, r7\n\t"
  48785. #else
  48786. "adc r4, r7\n\t"
  48787. #endif
  48788. #ifdef WOLFSSL_KEIL
  48789. "adcs r5, r5, %[r]\n\t"
  48790. #elif defined(__clang__)
  48791. "adcs r5, %[r]\n\t"
  48792. #else
  48793. "adc r5, %[r]\n\t"
  48794. #endif
  48795. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48796. "lsrs r6, %[a], #16\n\t"
  48797. #else
  48798. "lsr r6, %[a], #16\n\t"
  48799. #endif
  48800. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48801. "lsrs r7, %[b], #16\n\t"
  48802. #else
  48803. "lsr r7, %[b], #16\n\t"
  48804. #endif
  48805. #ifdef WOLFSSL_KEIL
  48806. "muls r7, r6, r7\n\t"
  48807. #elif defined(__clang__)
  48808. "muls r7, r6\n\t"
  48809. #else
  48810. "mul r7, r6\n\t"
  48811. #endif
  48812. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48813. "adds r4, r4, r7\n\t"
  48814. #else
  48815. "add r4, r4, r7\n\t"
  48816. #endif
  48817. #ifdef WOLFSSL_KEIL
  48818. "adcs r5, r5, %[r]\n\t"
  48819. #elif defined(__clang__)
  48820. "adcs r5, %[r]\n\t"
  48821. #else
  48822. "adc r5, %[r]\n\t"
  48823. #endif
  48824. "uxth r7, %[b]\n\t"
  48825. #ifdef WOLFSSL_KEIL
  48826. "muls r6, r7, r6\n\t"
  48827. #elif defined(__clang__)
  48828. "muls r6, r7\n\t"
  48829. #else
  48830. "mul r6, r7\n\t"
  48831. #endif
  48832. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48833. "lsrs r7, r6, #16\n\t"
  48834. #else
  48835. "lsr r7, r6, #16\n\t"
  48836. #endif
  48837. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48838. "lsls r6, r6, #16\n\t"
  48839. #else
  48840. "lsl r6, r6, #16\n\t"
  48841. #endif
  48842. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48843. "adds r3, r3, r6\n\t"
  48844. #else
  48845. "add r3, r3, r6\n\t"
  48846. #endif
  48847. #ifdef WOLFSSL_KEIL
  48848. "adcs r4, r4, r7\n\t"
  48849. #elif defined(__clang__)
  48850. "adcs r4, r7\n\t"
  48851. #else
  48852. "adc r4, r7\n\t"
  48853. #endif
  48854. #ifdef WOLFSSL_KEIL
  48855. "adcs r5, r5, %[r]\n\t"
  48856. #elif defined(__clang__)
  48857. "adcs r5, %[r]\n\t"
  48858. #else
  48859. "adc r5, %[r]\n\t"
  48860. #endif
  48861. "# A[8] * B[10]\n\t"
  48862. "mov %[a], r9\n\t"
  48863. "mov %[b], r10\n\t"
  48864. "ldr %[a], [%[a], #32]\n\t"
  48865. "ldr %[b], [%[b], #40]\n\t"
  48866. "uxth r6, %[a]\n\t"
  48867. "uxth r7, %[b]\n\t"
  48868. #ifdef WOLFSSL_KEIL
  48869. "muls r7, r6, r7\n\t"
  48870. #elif defined(__clang__)
  48871. "muls r7, r6\n\t"
  48872. #else
  48873. "mul r7, r6\n\t"
  48874. #endif
  48875. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48876. "adds r3, r3, r7\n\t"
  48877. #else
  48878. "add r3, r3, r7\n\t"
  48879. #endif
  48880. #ifdef WOLFSSL_KEIL
  48881. "adcs r4, r4, %[r]\n\t"
  48882. #elif defined(__clang__)
  48883. "adcs r4, %[r]\n\t"
  48884. #else
  48885. "adc r4, %[r]\n\t"
  48886. #endif
  48887. #ifdef WOLFSSL_KEIL
  48888. "adcs r5, r5, %[r]\n\t"
  48889. #elif defined(__clang__)
  48890. "adcs r5, %[r]\n\t"
  48891. #else
  48892. "adc r5, %[r]\n\t"
  48893. #endif
  48894. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48895. "lsrs r7, %[b], #16\n\t"
  48896. #else
  48897. "lsr r7, %[b], #16\n\t"
  48898. #endif
  48899. #ifdef WOLFSSL_KEIL
  48900. "muls r6, r7, r6\n\t"
  48901. #elif defined(__clang__)
  48902. "muls r6, r7\n\t"
  48903. #else
  48904. "mul r6, r7\n\t"
  48905. #endif
  48906. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48907. "lsrs r7, r6, #16\n\t"
  48908. #else
  48909. "lsr r7, r6, #16\n\t"
  48910. #endif
  48911. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48912. "lsls r6, r6, #16\n\t"
  48913. #else
  48914. "lsl r6, r6, #16\n\t"
  48915. #endif
  48916. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48917. "adds r3, r3, r6\n\t"
  48918. #else
  48919. "add r3, r3, r6\n\t"
  48920. #endif
  48921. #ifdef WOLFSSL_KEIL
  48922. "adcs r4, r4, r7\n\t"
  48923. #elif defined(__clang__)
  48924. "adcs r4, r7\n\t"
  48925. #else
  48926. "adc r4, r7\n\t"
  48927. #endif
  48928. #ifdef WOLFSSL_KEIL
  48929. "adcs r5, r5, %[r]\n\t"
  48930. #elif defined(__clang__)
  48931. "adcs r5, %[r]\n\t"
  48932. #else
  48933. "adc r5, %[r]\n\t"
  48934. #endif
  48935. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48936. "lsrs r6, %[a], #16\n\t"
  48937. #else
  48938. "lsr r6, %[a], #16\n\t"
  48939. #endif
  48940. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48941. "lsrs r7, %[b], #16\n\t"
  48942. #else
  48943. "lsr r7, %[b], #16\n\t"
  48944. #endif
  48945. #ifdef WOLFSSL_KEIL
  48946. "muls r7, r6, r7\n\t"
  48947. #elif defined(__clang__)
  48948. "muls r7, r6\n\t"
  48949. #else
  48950. "mul r7, r6\n\t"
  48951. #endif
  48952. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48953. "adds r4, r4, r7\n\t"
  48954. #else
  48955. "add r4, r4, r7\n\t"
  48956. #endif
  48957. #ifdef WOLFSSL_KEIL
  48958. "adcs r5, r5, %[r]\n\t"
  48959. #elif defined(__clang__)
  48960. "adcs r5, %[r]\n\t"
  48961. #else
  48962. "adc r5, %[r]\n\t"
  48963. #endif
  48964. "uxth r7, %[b]\n\t"
  48965. #ifdef WOLFSSL_KEIL
  48966. "muls r6, r7, r6\n\t"
  48967. #elif defined(__clang__)
  48968. "muls r6, r7\n\t"
  48969. #else
  48970. "mul r6, r7\n\t"
  48971. #endif
  48972. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48973. "lsrs r7, r6, #16\n\t"
  48974. #else
  48975. "lsr r7, r6, #16\n\t"
  48976. #endif
  48977. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48978. "lsls r6, r6, #16\n\t"
  48979. #else
  48980. "lsl r6, r6, #16\n\t"
  48981. #endif
  48982. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48983. "adds r3, r3, r6\n\t"
  48984. #else
  48985. "add r3, r3, r6\n\t"
  48986. #endif
  48987. #ifdef WOLFSSL_KEIL
  48988. "adcs r4, r4, r7\n\t"
  48989. #elif defined(__clang__)
  48990. "adcs r4, r7\n\t"
  48991. #else
  48992. "adc r4, r7\n\t"
  48993. #endif
  48994. #ifdef WOLFSSL_KEIL
  48995. "adcs r5, r5, %[r]\n\t"
  48996. #elif defined(__clang__)
  48997. "adcs r5, %[r]\n\t"
  48998. #else
  48999. "adc r5, %[r]\n\t"
  49000. #endif
  49001. "# A[7] * B[11]\n\t"
  49002. "mov %[a], r9\n\t"
  49003. "mov %[b], r10\n\t"
  49004. "ldr %[a], [%[a], #28]\n\t"
  49005. "ldr %[b], [%[b], #44]\n\t"
  49006. "uxth r6, %[a]\n\t"
  49007. "uxth r7, %[b]\n\t"
  49008. #ifdef WOLFSSL_KEIL
  49009. "muls r7, r6, r7\n\t"
  49010. #elif defined(__clang__)
  49011. "muls r7, r6\n\t"
  49012. #else
  49013. "mul r7, r6\n\t"
  49014. #endif
  49015. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49016. "adds r3, r3, r7\n\t"
  49017. #else
  49018. "add r3, r3, r7\n\t"
  49019. #endif
  49020. #ifdef WOLFSSL_KEIL
  49021. "adcs r4, r4, %[r]\n\t"
  49022. #elif defined(__clang__)
  49023. "adcs r4, %[r]\n\t"
  49024. #else
  49025. "adc r4, %[r]\n\t"
  49026. #endif
  49027. #ifdef WOLFSSL_KEIL
  49028. "adcs r5, r5, %[r]\n\t"
  49029. #elif defined(__clang__)
  49030. "adcs r5, %[r]\n\t"
  49031. #else
  49032. "adc r5, %[r]\n\t"
  49033. #endif
  49034. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49035. "lsrs r7, %[b], #16\n\t"
  49036. #else
  49037. "lsr r7, %[b], #16\n\t"
  49038. #endif
  49039. #ifdef WOLFSSL_KEIL
  49040. "muls r6, r7, r6\n\t"
  49041. #elif defined(__clang__)
  49042. "muls r6, r7\n\t"
  49043. #else
  49044. "mul r6, r7\n\t"
  49045. #endif
  49046. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49047. "lsrs r7, r6, #16\n\t"
  49048. #else
  49049. "lsr r7, r6, #16\n\t"
  49050. #endif
  49051. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49052. "lsls r6, r6, #16\n\t"
  49053. #else
  49054. "lsl r6, r6, #16\n\t"
  49055. #endif
  49056. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49057. "adds r3, r3, r6\n\t"
  49058. #else
  49059. "add r3, r3, r6\n\t"
  49060. #endif
  49061. #ifdef WOLFSSL_KEIL
  49062. "adcs r4, r4, r7\n\t"
  49063. #elif defined(__clang__)
  49064. "adcs r4, r7\n\t"
  49065. #else
  49066. "adc r4, r7\n\t"
  49067. #endif
  49068. #ifdef WOLFSSL_KEIL
  49069. "adcs r5, r5, %[r]\n\t"
  49070. #elif defined(__clang__)
  49071. "adcs r5, %[r]\n\t"
  49072. #else
  49073. "adc r5, %[r]\n\t"
  49074. #endif
  49075. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49076. "lsrs r6, %[a], #16\n\t"
  49077. #else
  49078. "lsr r6, %[a], #16\n\t"
  49079. #endif
  49080. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49081. "lsrs r7, %[b], #16\n\t"
  49082. #else
  49083. "lsr r7, %[b], #16\n\t"
  49084. #endif
  49085. #ifdef WOLFSSL_KEIL
  49086. "muls r7, r6, r7\n\t"
  49087. #elif defined(__clang__)
  49088. "muls r7, r6\n\t"
  49089. #else
  49090. "mul r7, r6\n\t"
  49091. #endif
  49092. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49093. "adds r4, r4, r7\n\t"
  49094. #else
  49095. "add r4, r4, r7\n\t"
  49096. #endif
  49097. #ifdef WOLFSSL_KEIL
  49098. "adcs r5, r5, %[r]\n\t"
  49099. #elif defined(__clang__)
  49100. "adcs r5, %[r]\n\t"
  49101. #else
  49102. "adc r5, %[r]\n\t"
  49103. #endif
  49104. "uxth r7, %[b]\n\t"
  49105. #ifdef WOLFSSL_KEIL
  49106. "muls r6, r7, r6\n\t"
  49107. #elif defined(__clang__)
  49108. "muls r6, r7\n\t"
  49109. #else
  49110. "mul r6, r7\n\t"
  49111. #endif
  49112. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49113. "lsrs r7, r6, #16\n\t"
  49114. #else
  49115. "lsr r7, r6, #16\n\t"
  49116. #endif
  49117. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49118. "lsls r6, r6, #16\n\t"
  49119. #else
  49120. "lsl r6, r6, #16\n\t"
  49121. #endif
  49122. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49123. "adds r3, r3, r6\n\t"
  49124. #else
  49125. "add r3, r3, r6\n\t"
  49126. #endif
  49127. #ifdef WOLFSSL_KEIL
  49128. "adcs r4, r4, r7\n\t"
  49129. #elif defined(__clang__)
  49130. "adcs r4, r7\n\t"
  49131. #else
  49132. "adc r4, r7\n\t"
  49133. #endif
  49134. #ifdef WOLFSSL_KEIL
  49135. "adcs r5, r5, %[r]\n\t"
  49136. #elif defined(__clang__)
  49137. "adcs r5, %[r]\n\t"
  49138. #else
  49139. "adc r5, %[r]\n\t"
  49140. #endif
  49141. "mov %[r], r8\n\t"
  49142. "str r3, [%[r], #72]\n\t"
  49143. "movs %[r], #0\n\t"
  49144. "# A[8] * B[11]\n\t"
  49145. "movs r3, #0\n\t"
  49146. "mov %[a], r9\n\t"
  49147. "mov %[b], r10\n\t"
  49148. "ldr %[a], [%[a], #32]\n\t"
  49149. "ldr %[b], [%[b], #44]\n\t"
  49150. "uxth r6, %[a]\n\t"
  49151. "uxth r7, %[b]\n\t"
  49152. #ifdef WOLFSSL_KEIL
  49153. "muls r7, r6, r7\n\t"
  49154. #elif defined(__clang__)
  49155. "muls r7, r6\n\t"
  49156. #else
  49157. "mul r7, r6\n\t"
  49158. #endif
  49159. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49160. "adds r4, r4, r7\n\t"
  49161. #else
  49162. "add r4, r4, r7\n\t"
  49163. #endif
  49164. #ifdef WOLFSSL_KEIL
  49165. "adcs r5, r5, %[r]\n\t"
  49166. #elif defined(__clang__)
  49167. "adcs r5, %[r]\n\t"
  49168. #else
  49169. "adc r5, %[r]\n\t"
  49170. #endif
  49171. #ifdef WOLFSSL_KEIL
  49172. "adcs r3, r3, %[r]\n\t"
  49173. #elif defined(__clang__)
  49174. "adcs r3, %[r]\n\t"
  49175. #else
  49176. "adc r3, %[r]\n\t"
  49177. #endif
  49178. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49179. "lsrs r7, %[b], #16\n\t"
  49180. #else
  49181. "lsr r7, %[b], #16\n\t"
  49182. #endif
  49183. #ifdef WOLFSSL_KEIL
  49184. "muls r6, r7, r6\n\t"
  49185. #elif defined(__clang__)
  49186. "muls r6, r7\n\t"
  49187. #else
  49188. "mul r6, r7\n\t"
  49189. #endif
  49190. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49191. "lsrs r7, r6, #16\n\t"
  49192. #else
  49193. "lsr r7, r6, #16\n\t"
  49194. #endif
  49195. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49196. "lsls r6, r6, #16\n\t"
  49197. #else
  49198. "lsl r6, r6, #16\n\t"
  49199. #endif
  49200. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49201. "adds r4, r4, r6\n\t"
  49202. #else
  49203. "add r4, r4, r6\n\t"
  49204. #endif
  49205. #ifdef WOLFSSL_KEIL
  49206. "adcs r5, r5, r7\n\t"
  49207. #elif defined(__clang__)
  49208. "adcs r5, r7\n\t"
  49209. #else
  49210. "adc r5, r7\n\t"
  49211. #endif
  49212. #ifdef WOLFSSL_KEIL
  49213. "adcs r3, r3, %[r]\n\t"
  49214. #elif defined(__clang__)
  49215. "adcs r3, %[r]\n\t"
  49216. #else
  49217. "adc r3, %[r]\n\t"
  49218. #endif
  49219. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49220. "lsrs r6, %[a], #16\n\t"
  49221. #else
  49222. "lsr r6, %[a], #16\n\t"
  49223. #endif
  49224. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49225. "lsrs r7, %[b], #16\n\t"
  49226. #else
  49227. "lsr r7, %[b], #16\n\t"
  49228. #endif
  49229. #ifdef WOLFSSL_KEIL
  49230. "muls r7, r6, r7\n\t"
  49231. #elif defined(__clang__)
  49232. "muls r7, r6\n\t"
  49233. #else
  49234. "mul r7, r6\n\t"
  49235. #endif
  49236. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49237. "adds r5, r5, r7\n\t"
  49238. #else
  49239. "add r5, r5, r7\n\t"
  49240. #endif
  49241. #ifdef WOLFSSL_KEIL
  49242. "adcs r3, r3, %[r]\n\t"
  49243. #elif defined(__clang__)
  49244. "adcs r3, %[r]\n\t"
  49245. #else
  49246. "adc r3, %[r]\n\t"
  49247. #endif
  49248. "uxth r7, %[b]\n\t"
  49249. #ifdef WOLFSSL_KEIL
  49250. "muls r6, r7, r6\n\t"
  49251. #elif defined(__clang__)
  49252. "muls r6, r7\n\t"
  49253. #else
  49254. "mul r6, r7\n\t"
  49255. #endif
  49256. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49257. "lsrs r7, r6, #16\n\t"
  49258. #else
  49259. "lsr r7, r6, #16\n\t"
  49260. #endif
  49261. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49262. "lsls r6, r6, #16\n\t"
  49263. #else
  49264. "lsl r6, r6, #16\n\t"
  49265. #endif
  49266. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49267. "adds r4, r4, r6\n\t"
  49268. #else
  49269. "add r4, r4, r6\n\t"
  49270. #endif
  49271. #ifdef WOLFSSL_KEIL
  49272. "adcs r5, r5, r7\n\t"
  49273. #elif defined(__clang__)
  49274. "adcs r5, r7\n\t"
  49275. #else
  49276. "adc r5, r7\n\t"
  49277. #endif
  49278. #ifdef WOLFSSL_KEIL
  49279. "adcs r3, r3, %[r]\n\t"
  49280. #elif defined(__clang__)
  49281. "adcs r3, %[r]\n\t"
  49282. #else
  49283. "adc r3, %[r]\n\t"
  49284. #endif
  49285. "# A[9] * B[10]\n\t"
  49286. "mov %[a], r9\n\t"
  49287. "mov %[b], r10\n\t"
  49288. "ldr %[a], [%[a], #36]\n\t"
  49289. "ldr %[b], [%[b], #40]\n\t"
  49290. "uxth r6, %[a]\n\t"
  49291. "uxth r7, %[b]\n\t"
  49292. #ifdef WOLFSSL_KEIL
  49293. "muls r7, r6, r7\n\t"
  49294. #elif defined(__clang__)
  49295. "muls r7, r6\n\t"
  49296. #else
  49297. "mul r7, r6\n\t"
  49298. #endif
  49299. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49300. "adds r4, r4, r7\n\t"
  49301. #else
  49302. "add r4, r4, r7\n\t"
  49303. #endif
  49304. #ifdef WOLFSSL_KEIL
  49305. "adcs r5, r5, %[r]\n\t"
  49306. #elif defined(__clang__)
  49307. "adcs r5, %[r]\n\t"
  49308. #else
  49309. "adc r5, %[r]\n\t"
  49310. #endif
  49311. #ifdef WOLFSSL_KEIL
  49312. "adcs r3, r3, %[r]\n\t"
  49313. #elif defined(__clang__)
  49314. "adcs r3, %[r]\n\t"
  49315. #else
  49316. "adc r3, %[r]\n\t"
  49317. #endif
  49318. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49319. "lsrs r7, %[b], #16\n\t"
  49320. #else
  49321. "lsr r7, %[b], #16\n\t"
  49322. #endif
  49323. #ifdef WOLFSSL_KEIL
  49324. "muls r6, r7, r6\n\t"
  49325. #elif defined(__clang__)
  49326. "muls r6, r7\n\t"
  49327. #else
  49328. "mul r6, r7\n\t"
  49329. #endif
  49330. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49331. "lsrs r7, r6, #16\n\t"
  49332. #else
  49333. "lsr r7, r6, #16\n\t"
  49334. #endif
  49335. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49336. "lsls r6, r6, #16\n\t"
  49337. #else
  49338. "lsl r6, r6, #16\n\t"
  49339. #endif
  49340. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49341. "adds r4, r4, r6\n\t"
  49342. #else
  49343. "add r4, r4, r6\n\t"
  49344. #endif
  49345. #ifdef WOLFSSL_KEIL
  49346. "adcs r5, r5, r7\n\t"
  49347. #elif defined(__clang__)
  49348. "adcs r5, r7\n\t"
  49349. #else
  49350. "adc r5, r7\n\t"
  49351. #endif
  49352. #ifdef WOLFSSL_KEIL
  49353. "adcs r3, r3, %[r]\n\t"
  49354. #elif defined(__clang__)
  49355. "adcs r3, %[r]\n\t"
  49356. #else
  49357. "adc r3, %[r]\n\t"
  49358. #endif
  49359. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49360. "lsrs r6, %[a], #16\n\t"
  49361. #else
  49362. "lsr r6, %[a], #16\n\t"
  49363. #endif
  49364. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49365. "lsrs r7, %[b], #16\n\t"
  49366. #else
  49367. "lsr r7, %[b], #16\n\t"
  49368. #endif
  49369. #ifdef WOLFSSL_KEIL
  49370. "muls r7, r6, r7\n\t"
  49371. #elif defined(__clang__)
  49372. "muls r7, r6\n\t"
  49373. #else
  49374. "mul r7, r6\n\t"
  49375. #endif
  49376. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49377. "adds r5, r5, r7\n\t"
  49378. #else
  49379. "add r5, r5, r7\n\t"
  49380. #endif
  49381. #ifdef WOLFSSL_KEIL
  49382. "adcs r3, r3, %[r]\n\t"
  49383. #elif defined(__clang__)
  49384. "adcs r3, %[r]\n\t"
  49385. #else
  49386. "adc r3, %[r]\n\t"
  49387. #endif
  49388. "uxth r7, %[b]\n\t"
  49389. #ifdef WOLFSSL_KEIL
  49390. "muls r6, r7, r6\n\t"
  49391. #elif defined(__clang__)
  49392. "muls r6, r7\n\t"
  49393. #else
  49394. "mul r6, r7\n\t"
  49395. #endif
  49396. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49397. "lsrs r7, r6, #16\n\t"
  49398. #else
  49399. "lsr r7, r6, #16\n\t"
  49400. #endif
  49401. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49402. "lsls r6, r6, #16\n\t"
  49403. #else
  49404. "lsl r6, r6, #16\n\t"
  49405. #endif
  49406. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49407. "adds r4, r4, r6\n\t"
  49408. #else
  49409. "add r4, r4, r6\n\t"
  49410. #endif
  49411. #ifdef WOLFSSL_KEIL
  49412. "adcs r5, r5, r7\n\t"
  49413. #elif defined(__clang__)
  49414. "adcs r5, r7\n\t"
  49415. #else
  49416. "adc r5, r7\n\t"
  49417. #endif
  49418. #ifdef WOLFSSL_KEIL
  49419. "adcs r3, r3, %[r]\n\t"
  49420. #elif defined(__clang__)
  49421. "adcs r3, %[r]\n\t"
  49422. #else
  49423. "adc r3, %[r]\n\t"
  49424. #endif
  49425. "# A[10] * B[9]\n\t"
  49426. "mov %[a], r9\n\t"
  49427. "mov %[b], r10\n\t"
  49428. "ldr %[a], [%[a], #40]\n\t"
  49429. "ldr %[b], [%[b], #36]\n\t"
  49430. "uxth r6, %[a]\n\t"
  49431. "uxth r7, %[b]\n\t"
  49432. #ifdef WOLFSSL_KEIL
  49433. "muls r7, r6, r7\n\t"
  49434. #elif defined(__clang__)
  49435. "muls r7, r6\n\t"
  49436. #else
  49437. "mul r7, r6\n\t"
  49438. #endif
  49439. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49440. "adds r4, r4, r7\n\t"
  49441. #else
  49442. "add r4, r4, r7\n\t"
  49443. #endif
  49444. #ifdef WOLFSSL_KEIL
  49445. "adcs r5, r5, %[r]\n\t"
  49446. #elif defined(__clang__)
  49447. "adcs r5, %[r]\n\t"
  49448. #else
  49449. "adc r5, %[r]\n\t"
  49450. #endif
  49451. #ifdef WOLFSSL_KEIL
  49452. "adcs r3, r3, %[r]\n\t"
  49453. #elif defined(__clang__)
  49454. "adcs r3, %[r]\n\t"
  49455. #else
  49456. "adc r3, %[r]\n\t"
  49457. #endif
  49458. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49459. "lsrs r7, %[b], #16\n\t"
  49460. #else
  49461. "lsr r7, %[b], #16\n\t"
  49462. #endif
  49463. #ifdef WOLFSSL_KEIL
  49464. "muls r6, r7, r6\n\t"
  49465. #elif defined(__clang__)
  49466. "muls r6, r7\n\t"
  49467. #else
  49468. "mul r6, r7\n\t"
  49469. #endif
  49470. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49471. "lsrs r7, r6, #16\n\t"
  49472. #else
  49473. "lsr r7, r6, #16\n\t"
  49474. #endif
  49475. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49476. "lsls r6, r6, #16\n\t"
  49477. #else
  49478. "lsl r6, r6, #16\n\t"
  49479. #endif
  49480. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49481. "adds r4, r4, r6\n\t"
  49482. #else
  49483. "add r4, r4, r6\n\t"
  49484. #endif
  49485. #ifdef WOLFSSL_KEIL
  49486. "adcs r5, r5, r7\n\t"
  49487. #elif defined(__clang__)
  49488. "adcs r5, r7\n\t"
  49489. #else
  49490. "adc r5, r7\n\t"
  49491. #endif
  49492. #ifdef WOLFSSL_KEIL
  49493. "adcs r3, r3, %[r]\n\t"
  49494. #elif defined(__clang__)
  49495. "adcs r3, %[r]\n\t"
  49496. #else
  49497. "adc r3, %[r]\n\t"
  49498. #endif
  49499. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49500. "lsrs r6, %[a], #16\n\t"
  49501. #else
  49502. "lsr r6, %[a], #16\n\t"
  49503. #endif
  49504. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49505. "lsrs r7, %[b], #16\n\t"
  49506. #else
  49507. "lsr r7, %[b], #16\n\t"
  49508. #endif
  49509. #ifdef WOLFSSL_KEIL
  49510. "muls r7, r6, r7\n\t"
  49511. #elif defined(__clang__)
  49512. "muls r7, r6\n\t"
  49513. #else
  49514. "mul r7, r6\n\t"
  49515. #endif
  49516. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49517. "adds r5, r5, r7\n\t"
  49518. #else
  49519. "add r5, r5, r7\n\t"
  49520. #endif
  49521. #ifdef WOLFSSL_KEIL
  49522. "adcs r3, r3, %[r]\n\t"
  49523. #elif defined(__clang__)
  49524. "adcs r3, %[r]\n\t"
  49525. #else
  49526. "adc r3, %[r]\n\t"
  49527. #endif
  49528. "uxth r7, %[b]\n\t"
  49529. #ifdef WOLFSSL_KEIL
  49530. "muls r6, r7, r6\n\t"
  49531. #elif defined(__clang__)
  49532. "muls r6, r7\n\t"
  49533. #else
  49534. "mul r6, r7\n\t"
  49535. #endif
  49536. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49537. "lsrs r7, r6, #16\n\t"
  49538. #else
  49539. "lsr r7, r6, #16\n\t"
  49540. #endif
  49541. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49542. "lsls r6, r6, #16\n\t"
  49543. #else
  49544. "lsl r6, r6, #16\n\t"
  49545. #endif
  49546. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49547. "adds r4, r4, r6\n\t"
  49548. #else
  49549. "add r4, r4, r6\n\t"
  49550. #endif
  49551. #ifdef WOLFSSL_KEIL
  49552. "adcs r5, r5, r7\n\t"
  49553. #elif defined(__clang__)
  49554. "adcs r5, r7\n\t"
  49555. #else
  49556. "adc r5, r7\n\t"
  49557. #endif
  49558. #ifdef WOLFSSL_KEIL
  49559. "adcs r3, r3, %[r]\n\t"
  49560. #elif defined(__clang__)
  49561. "adcs r3, %[r]\n\t"
  49562. #else
  49563. "adc r3, %[r]\n\t"
  49564. #endif
  49565. "# A[11] * B[8]\n\t"
  49566. "mov %[a], r9\n\t"
  49567. "mov %[b], r10\n\t"
  49568. "ldr %[a], [%[a], #44]\n\t"
  49569. "ldr %[b], [%[b], #32]\n\t"
  49570. "uxth r6, %[a]\n\t"
  49571. "uxth r7, %[b]\n\t"
  49572. #ifdef WOLFSSL_KEIL
  49573. "muls r7, r6, r7\n\t"
  49574. #elif defined(__clang__)
  49575. "muls r7, r6\n\t"
  49576. #else
  49577. "mul r7, r6\n\t"
  49578. #endif
  49579. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49580. "adds r4, r4, r7\n\t"
  49581. #else
  49582. "add r4, r4, r7\n\t"
  49583. #endif
  49584. #ifdef WOLFSSL_KEIL
  49585. "adcs r5, r5, %[r]\n\t"
  49586. #elif defined(__clang__)
  49587. "adcs r5, %[r]\n\t"
  49588. #else
  49589. "adc r5, %[r]\n\t"
  49590. #endif
  49591. #ifdef WOLFSSL_KEIL
  49592. "adcs r3, r3, %[r]\n\t"
  49593. #elif defined(__clang__)
  49594. "adcs r3, %[r]\n\t"
  49595. #else
  49596. "adc r3, %[r]\n\t"
  49597. #endif
  49598. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49599. "lsrs r7, %[b], #16\n\t"
  49600. #else
  49601. "lsr r7, %[b], #16\n\t"
  49602. #endif
  49603. #ifdef WOLFSSL_KEIL
  49604. "muls r6, r7, r6\n\t"
  49605. #elif defined(__clang__)
  49606. "muls r6, r7\n\t"
  49607. #else
  49608. "mul r6, r7\n\t"
  49609. #endif
  49610. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49611. "lsrs r7, r6, #16\n\t"
  49612. #else
  49613. "lsr r7, r6, #16\n\t"
  49614. #endif
  49615. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49616. "lsls r6, r6, #16\n\t"
  49617. #else
  49618. "lsl r6, r6, #16\n\t"
  49619. #endif
  49620. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49621. "adds r4, r4, r6\n\t"
  49622. #else
  49623. "add r4, r4, r6\n\t"
  49624. #endif
  49625. #ifdef WOLFSSL_KEIL
  49626. "adcs r5, r5, r7\n\t"
  49627. #elif defined(__clang__)
  49628. "adcs r5, r7\n\t"
  49629. #else
  49630. "adc r5, r7\n\t"
  49631. #endif
  49632. #ifdef WOLFSSL_KEIL
  49633. "adcs r3, r3, %[r]\n\t"
  49634. #elif defined(__clang__)
  49635. "adcs r3, %[r]\n\t"
  49636. #else
  49637. "adc r3, %[r]\n\t"
  49638. #endif
  49639. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49640. "lsrs r6, %[a], #16\n\t"
  49641. #else
  49642. "lsr r6, %[a], #16\n\t"
  49643. #endif
  49644. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49645. "lsrs r7, %[b], #16\n\t"
  49646. #else
  49647. "lsr r7, %[b], #16\n\t"
  49648. #endif
  49649. #ifdef WOLFSSL_KEIL
  49650. "muls r7, r6, r7\n\t"
  49651. #elif defined(__clang__)
  49652. "muls r7, r6\n\t"
  49653. #else
  49654. "mul r7, r6\n\t"
  49655. #endif
  49656. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49657. "adds r5, r5, r7\n\t"
  49658. #else
  49659. "add r5, r5, r7\n\t"
  49660. #endif
  49661. #ifdef WOLFSSL_KEIL
  49662. "adcs r3, r3, %[r]\n\t"
  49663. #elif defined(__clang__)
  49664. "adcs r3, %[r]\n\t"
  49665. #else
  49666. "adc r3, %[r]\n\t"
  49667. #endif
  49668. "uxth r7, %[b]\n\t"
  49669. #ifdef WOLFSSL_KEIL
  49670. "muls r6, r7, r6\n\t"
  49671. #elif defined(__clang__)
  49672. "muls r6, r7\n\t"
  49673. #else
  49674. "mul r6, r7\n\t"
  49675. #endif
  49676. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49677. "lsrs r7, r6, #16\n\t"
  49678. #else
  49679. "lsr r7, r6, #16\n\t"
  49680. #endif
  49681. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49682. "lsls r6, r6, #16\n\t"
  49683. #else
  49684. "lsl r6, r6, #16\n\t"
  49685. #endif
  49686. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49687. "adds r4, r4, r6\n\t"
  49688. #else
  49689. "add r4, r4, r6\n\t"
  49690. #endif
  49691. #ifdef WOLFSSL_KEIL
  49692. "adcs r5, r5, r7\n\t"
  49693. #elif defined(__clang__)
  49694. "adcs r5, r7\n\t"
  49695. #else
  49696. "adc r5, r7\n\t"
  49697. #endif
  49698. #ifdef WOLFSSL_KEIL
  49699. "adcs r3, r3, %[r]\n\t"
  49700. #elif defined(__clang__)
  49701. "adcs r3, %[r]\n\t"
  49702. #else
  49703. "adc r3, %[r]\n\t"
  49704. #endif
  49705. "mov %[r], r8\n\t"
  49706. "str r4, [%[r], #76]\n\t"
  49707. "movs %[r], #0\n\t"
  49708. "# A[11] * B[9]\n\t"
  49709. "movs r4, #0\n\t"
  49710. "mov %[a], r9\n\t"
  49711. "mov %[b], r10\n\t"
  49712. "ldr %[a], [%[a], #44]\n\t"
  49713. "ldr %[b], [%[b], #36]\n\t"
  49714. "uxth r6, %[a]\n\t"
  49715. "uxth r7, %[b]\n\t"
  49716. #ifdef WOLFSSL_KEIL
  49717. "muls r7, r6, r7\n\t"
  49718. #elif defined(__clang__)
  49719. "muls r7, r6\n\t"
  49720. #else
  49721. "mul r7, r6\n\t"
  49722. #endif
  49723. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49724. "adds r5, r5, r7\n\t"
  49725. #else
  49726. "add r5, r5, r7\n\t"
  49727. #endif
  49728. #ifdef WOLFSSL_KEIL
  49729. "adcs r3, r3, %[r]\n\t"
  49730. #elif defined(__clang__)
  49731. "adcs r3, %[r]\n\t"
  49732. #else
  49733. "adc r3, %[r]\n\t"
  49734. #endif
  49735. #ifdef WOLFSSL_KEIL
  49736. "adcs r4, r4, %[r]\n\t"
  49737. #elif defined(__clang__)
  49738. "adcs r4, %[r]\n\t"
  49739. #else
  49740. "adc r4, %[r]\n\t"
  49741. #endif
  49742. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49743. "lsrs r7, %[b], #16\n\t"
  49744. #else
  49745. "lsr r7, %[b], #16\n\t"
  49746. #endif
  49747. #ifdef WOLFSSL_KEIL
  49748. "muls r6, r7, r6\n\t"
  49749. #elif defined(__clang__)
  49750. "muls r6, r7\n\t"
  49751. #else
  49752. "mul r6, r7\n\t"
  49753. #endif
  49754. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49755. "lsrs r7, r6, #16\n\t"
  49756. #else
  49757. "lsr r7, r6, #16\n\t"
  49758. #endif
  49759. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49760. "lsls r6, r6, #16\n\t"
  49761. #else
  49762. "lsl r6, r6, #16\n\t"
  49763. #endif
  49764. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49765. "adds r5, r5, r6\n\t"
  49766. #else
  49767. "add r5, r5, r6\n\t"
  49768. #endif
  49769. #ifdef WOLFSSL_KEIL
  49770. "adcs r3, r3, r7\n\t"
  49771. #elif defined(__clang__)
  49772. "adcs r3, r7\n\t"
  49773. #else
  49774. "adc r3, r7\n\t"
  49775. #endif
  49776. #ifdef WOLFSSL_KEIL
  49777. "adcs r4, r4, %[r]\n\t"
  49778. #elif defined(__clang__)
  49779. "adcs r4, %[r]\n\t"
  49780. #else
  49781. "adc r4, %[r]\n\t"
  49782. #endif
  49783. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49784. "lsrs r6, %[a], #16\n\t"
  49785. #else
  49786. "lsr r6, %[a], #16\n\t"
  49787. #endif
  49788. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49789. "lsrs r7, %[b], #16\n\t"
  49790. #else
  49791. "lsr r7, %[b], #16\n\t"
  49792. #endif
  49793. #ifdef WOLFSSL_KEIL
  49794. "muls r7, r6, r7\n\t"
  49795. #elif defined(__clang__)
  49796. "muls r7, r6\n\t"
  49797. #else
  49798. "mul r7, r6\n\t"
  49799. #endif
  49800. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49801. "adds r3, r3, r7\n\t"
  49802. #else
  49803. "add r3, r3, r7\n\t"
  49804. #endif
  49805. #ifdef WOLFSSL_KEIL
  49806. "adcs r4, r4, %[r]\n\t"
  49807. #elif defined(__clang__)
  49808. "adcs r4, %[r]\n\t"
  49809. #else
  49810. "adc r4, %[r]\n\t"
  49811. #endif
  49812. "uxth r7, %[b]\n\t"
  49813. #ifdef WOLFSSL_KEIL
  49814. "muls r6, r7, r6\n\t"
  49815. #elif defined(__clang__)
  49816. "muls r6, r7\n\t"
  49817. #else
  49818. "mul r6, r7\n\t"
  49819. #endif
  49820. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49821. "lsrs r7, r6, #16\n\t"
  49822. #else
  49823. "lsr r7, r6, #16\n\t"
  49824. #endif
  49825. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49826. "lsls r6, r6, #16\n\t"
  49827. #else
  49828. "lsl r6, r6, #16\n\t"
  49829. #endif
  49830. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49831. "adds r5, r5, r6\n\t"
  49832. #else
  49833. "add r5, r5, r6\n\t"
  49834. #endif
  49835. #ifdef WOLFSSL_KEIL
  49836. "adcs r3, r3, r7\n\t"
  49837. #elif defined(__clang__)
  49838. "adcs r3, r7\n\t"
  49839. #else
  49840. "adc r3, r7\n\t"
  49841. #endif
  49842. #ifdef WOLFSSL_KEIL
  49843. "adcs r4, r4, %[r]\n\t"
  49844. #elif defined(__clang__)
  49845. "adcs r4, %[r]\n\t"
  49846. #else
  49847. "adc r4, %[r]\n\t"
  49848. #endif
  49849. "# A[10] * B[10]\n\t"
  49850. "mov %[a], r9\n\t"
  49851. "mov %[b], r10\n\t"
  49852. "ldr %[a], [%[a], #40]\n\t"
  49853. "ldr %[b], [%[b], #40]\n\t"
  49854. "uxth r6, %[a]\n\t"
  49855. "uxth r7, %[b]\n\t"
  49856. #ifdef WOLFSSL_KEIL
  49857. "muls r7, r6, r7\n\t"
  49858. #elif defined(__clang__)
  49859. "muls r7, r6\n\t"
  49860. #else
  49861. "mul r7, r6\n\t"
  49862. #endif
  49863. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49864. "adds r5, r5, r7\n\t"
  49865. #else
  49866. "add r5, r5, r7\n\t"
  49867. #endif
  49868. #ifdef WOLFSSL_KEIL
  49869. "adcs r3, r3, %[r]\n\t"
  49870. #elif defined(__clang__)
  49871. "adcs r3, %[r]\n\t"
  49872. #else
  49873. "adc r3, %[r]\n\t"
  49874. #endif
  49875. #ifdef WOLFSSL_KEIL
  49876. "adcs r4, r4, %[r]\n\t"
  49877. #elif defined(__clang__)
  49878. "adcs r4, %[r]\n\t"
  49879. #else
  49880. "adc r4, %[r]\n\t"
  49881. #endif
  49882. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49883. "lsrs r7, %[b], #16\n\t"
  49884. #else
  49885. "lsr r7, %[b], #16\n\t"
  49886. #endif
  49887. #ifdef WOLFSSL_KEIL
  49888. "muls r6, r7, r6\n\t"
  49889. #elif defined(__clang__)
  49890. "muls r6, r7\n\t"
  49891. #else
  49892. "mul r6, r7\n\t"
  49893. #endif
  49894. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49895. "lsrs r7, r6, #16\n\t"
  49896. #else
  49897. "lsr r7, r6, #16\n\t"
  49898. #endif
  49899. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49900. "lsls r6, r6, #16\n\t"
  49901. #else
  49902. "lsl r6, r6, #16\n\t"
  49903. #endif
  49904. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49905. "adds r5, r5, r6\n\t"
  49906. #else
  49907. "add r5, r5, r6\n\t"
  49908. #endif
  49909. #ifdef WOLFSSL_KEIL
  49910. "adcs r3, r3, r7\n\t"
  49911. #elif defined(__clang__)
  49912. "adcs r3, r7\n\t"
  49913. #else
  49914. "adc r3, r7\n\t"
  49915. #endif
  49916. #ifdef WOLFSSL_KEIL
  49917. "adcs r4, r4, %[r]\n\t"
  49918. #elif defined(__clang__)
  49919. "adcs r4, %[r]\n\t"
  49920. #else
  49921. "adc r4, %[r]\n\t"
  49922. #endif
  49923. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49924. "lsrs r6, %[a], #16\n\t"
  49925. #else
  49926. "lsr r6, %[a], #16\n\t"
  49927. #endif
  49928. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49929. "lsrs r7, %[b], #16\n\t"
  49930. #else
  49931. "lsr r7, %[b], #16\n\t"
  49932. #endif
  49933. #ifdef WOLFSSL_KEIL
  49934. "muls r7, r6, r7\n\t"
  49935. #elif defined(__clang__)
  49936. "muls r7, r6\n\t"
  49937. #else
  49938. "mul r7, r6\n\t"
  49939. #endif
  49940. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49941. "adds r3, r3, r7\n\t"
  49942. #else
  49943. "add r3, r3, r7\n\t"
  49944. #endif
  49945. #ifdef WOLFSSL_KEIL
  49946. "adcs r4, r4, %[r]\n\t"
  49947. #elif defined(__clang__)
  49948. "adcs r4, %[r]\n\t"
  49949. #else
  49950. "adc r4, %[r]\n\t"
  49951. #endif
  49952. "uxth r7, %[b]\n\t"
  49953. #ifdef WOLFSSL_KEIL
  49954. "muls r6, r7, r6\n\t"
  49955. #elif defined(__clang__)
  49956. "muls r6, r7\n\t"
  49957. #else
  49958. "mul r6, r7\n\t"
  49959. #endif
  49960. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49961. "lsrs r7, r6, #16\n\t"
  49962. #else
  49963. "lsr r7, r6, #16\n\t"
  49964. #endif
  49965. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49966. "lsls r6, r6, #16\n\t"
  49967. #else
  49968. "lsl r6, r6, #16\n\t"
  49969. #endif
  49970. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49971. "adds r5, r5, r6\n\t"
  49972. #else
  49973. "add r5, r5, r6\n\t"
  49974. #endif
  49975. #ifdef WOLFSSL_KEIL
  49976. "adcs r3, r3, r7\n\t"
  49977. #elif defined(__clang__)
  49978. "adcs r3, r7\n\t"
  49979. #else
  49980. "adc r3, r7\n\t"
  49981. #endif
  49982. #ifdef WOLFSSL_KEIL
  49983. "adcs r4, r4, %[r]\n\t"
  49984. #elif defined(__clang__)
  49985. "adcs r4, %[r]\n\t"
  49986. #else
  49987. "adc r4, %[r]\n\t"
  49988. #endif
  49989. "# A[9] * B[11]\n\t"
  49990. "mov %[a], r9\n\t"
  49991. "mov %[b], r10\n\t"
  49992. "ldr %[a], [%[a], #36]\n\t"
  49993. "ldr %[b], [%[b], #44]\n\t"
  49994. "uxth r6, %[a]\n\t"
  49995. "uxth r7, %[b]\n\t"
  49996. #ifdef WOLFSSL_KEIL
  49997. "muls r7, r6, r7\n\t"
  49998. #elif defined(__clang__)
  49999. "muls r7, r6\n\t"
  50000. #else
  50001. "mul r7, r6\n\t"
  50002. #endif
  50003. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50004. "adds r5, r5, r7\n\t"
  50005. #else
  50006. "add r5, r5, r7\n\t"
  50007. #endif
  50008. #ifdef WOLFSSL_KEIL
  50009. "adcs r3, r3, %[r]\n\t"
  50010. #elif defined(__clang__)
  50011. "adcs r3, %[r]\n\t"
  50012. #else
  50013. "adc r3, %[r]\n\t"
  50014. #endif
  50015. #ifdef WOLFSSL_KEIL
  50016. "adcs r4, r4, %[r]\n\t"
  50017. #elif defined(__clang__)
  50018. "adcs r4, %[r]\n\t"
  50019. #else
  50020. "adc r4, %[r]\n\t"
  50021. #endif
  50022. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50023. "lsrs r7, %[b], #16\n\t"
  50024. #else
  50025. "lsr r7, %[b], #16\n\t"
  50026. #endif
  50027. #ifdef WOLFSSL_KEIL
  50028. "muls r6, r7, r6\n\t"
  50029. #elif defined(__clang__)
  50030. "muls r6, r7\n\t"
  50031. #else
  50032. "mul r6, r7\n\t"
  50033. #endif
  50034. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50035. "lsrs r7, r6, #16\n\t"
  50036. #else
  50037. "lsr r7, r6, #16\n\t"
  50038. #endif
  50039. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50040. "lsls r6, r6, #16\n\t"
  50041. #else
  50042. "lsl r6, r6, #16\n\t"
  50043. #endif
  50044. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50045. "adds r5, r5, r6\n\t"
  50046. #else
  50047. "add r5, r5, r6\n\t"
  50048. #endif
  50049. #ifdef WOLFSSL_KEIL
  50050. "adcs r3, r3, r7\n\t"
  50051. #elif defined(__clang__)
  50052. "adcs r3, r7\n\t"
  50053. #else
  50054. "adc r3, r7\n\t"
  50055. #endif
  50056. #ifdef WOLFSSL_KEIL
  50057. "adcs r4, r4, %[r]\n\t"
  50058. #elif defined(__clang__)
  50059. "adcs r4, %[r]\n\t"
  50060. #else
  50061. "adc r4, %[r]\n\t"
  50062. #endif
  50063. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50064. "lsrs r6, %[a], #16\n\t"
  50065. #else
  50066. "lsr r6, %[a], #16\n\t"
  50067. #endif
  50068. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50069. "lsrs r7, %[b], #16\n\t"
  50070. #else
  50071. "lsr r7, %[b], #16\n\t"
  50072. #endif
  50073. #ifdef WOLFSSL_KEIL
  50074. "muls r7, r6, r7\n\t"
  50075. #elif defined(__clang__)
  50076. "muls r7, r6\n\t"
  50077. #else
  50078. "mul r7, r6\n\t"
  50079. #endif
  50080. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50081. "adds r3, r3, r7\n\t"
  50082. #else
  50083. "add r3, r3, r7\n\t"
  50084. #endif
  50085. #ifdef WOLFSSL_KEIL
  50086. "adcs r4, r4, %[r]\n\t"
  50087. #elif defined(__clang__)
  50088. "adcs r4, %[r]\n\t"
  50089. #else
  50090. "adc r4, %[r]\n\t"
  50091. #endif
  50092. "uxth r7, %[b]\n\t"
  50093. #ifdef WOLFSSL_KEIL
  50094. "muls r6, r7, r6\n\t"
  50095. #elif defined(__clang__)
  50096. "muls r6, r7\n\t"
  50097. #else
  50098. "mul r6, r7\n\t"
  50099. #endif
  50100. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50101. "lsrs r7, r6, #16\n\t"
  50102. #else
  50103. "lsr r7, r6, #16\n\t"
  50104. #endif
  50105. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50106. "lsls r6, r6, #16\n\t"
  50107. #else
  50108. "lsl r6, r6, #16\n\t"
  50109. #endif
  50110. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50111. "adds r5, r5, r6\n\t"
  50112. #else
  50113. "add r5, r5, r6\n\t"
  50114. #endif
  50115. #ifdef WOLFSSL_KEIL
  50116. "adcs r3, r3, r7\n\t"
  50117. #elif defined(__clang__)
  50118. "adcs r3, r7\n\t"
  50119. #else
  50120. "adc r3, r7\n\t"
  50121. #endif
  50122. #ifdef WOLFSSL_KEIL
  50123. "adcs r4, r4, %[r]\n\t"
  50124. #elif defined(__clang__)
  50125. "adcs r4, %[r]\n\t"
  50126. #else
  50127. "adc r4, %[r]\n\t"
  50128. #endif
  50129. "mov %[r], r8\n\t"
  50130. "str r5, [%[r], #80]\n\t"
  50131. "movs %[r], #0\n\t"
  50132. "# A[10] * B[11]\n\t"
  50133. "movs r5, #0\n\t"
  50134. "mov %[a], r9\n\t"
  50135. "mov %[b], r10\n\t"
  50136. "ldr %[a], [%[a], #40]\n\t"
  50137. "ldr %[b], [%[b], #44]\n\t"
  50138. "uxth r6, %[a]\n\t"
  50139. "uxth r7, %[b]\n\t"
  50140. #ifdef WOLFSSL_KEIL
  50141. "muls r7, r6, r7\n\t"
  50142. #elif defined(__clang__)
  50143. "muls r7, r6\n\t"
  50144. #else
  50145. "mul r7, r6\n\t"
  50146. #endif
  50147. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50148. "adds r3, r3, r7\n\t"
  50149. #else
  50150. "add r3, r3, r7\n\t"
  50151. #endif
  50152. #ifdef WOLFSSL_KEIL
  50153. "adcs r4, r4, %[r]\n\t"
  50154. #elif defined(__clang__)
  50155. "adcs r4, %[r]\n\t"
  50156. #else
  50157. "adc r4, %[r]\n\t"
  50158. #endif
  50159. #ifdef WOLFSSL_KEIL
  50160. "adcs r5, r5, %[r]\n\t"
  50161. #elif defined(__clang__)
  50162. "adcs r5, %[r]\n\t"
  50163. #else
  50164. "adc r5, %[r]\n\t"
  50165. #endif
  50166. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50167. "lsrs r7, %[b], #16\n\t"
  50168. #else
  50169. "lsr r7, %[b], #16\n\t"
  50170. #endif
  50171. #ifdef WOLFSSL_KEIL
  50172. "muls r6, r7, r6\n\t"
  50173. #elif defined(__clang__)
  50174. "muls r6, r7\n\t"
  50175. #else
  50176. "mul r6, r7\n\t"
  50177. #endif
  50178. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50179. "lsrs r7, r6, #16\n\t"
  50180. #else
  50181. "lsr r7, r6, #16\n\t"
  50182. #endif
  50183. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50184. "lsls r6, r6, #16\n\t"
  50185. #else
  50186. "lsl r6, r6, #16\n\t"
  50187. #endif
  50188. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50189. "adds r3, r3, r6\n\t"
  50190. #else
  50191. "add r3, r3, r6\n\t"
  50192. #endif
  50193. #ifdef WOLFSSL_KEIL
  50194. "adcs r4, r4, r7\n\t"
  50195. #elif defined(__clang__)
  50196. "adcs r4, r7\n\t"
  50197. #else
  50198. "adc r4, r7\n\t"
  50199. #endif
  50200. #ifdef WOLFSSL_KEIL
  50201. "adcs r5, r5, %[r]\n\t"
  50202. #elif defined(__clang__)
  50203. "adcs r5, %[r]\n\t"
  50204. #else
  50205. "adc r5, %[r]\n\t"
  50206. #endif
  50207. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50208. "lsrs r6, %[a], #16\n\t"
  50209. #else
  50210. "lsr r6, %[a], #16\n\t"
  50211. #endif
  50212. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50213. "lsrs r7, %[b], #16\n\t"
  50214. #else
  50215. "lsr r7, %[b], #16\n\t"
  50216. #endif
  50217. #ifdef WOLFSSL_KEIL
  50218. "muls r7, r6, r7\n\t"
  50219. #elif defined(__clang__)
  50220. "muls r7, r6\n\t"
  50221. #else
  50222. "mul r7, r6\n\t"
  50223. #endif
  50224. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50225. "adds r4, r4, r7\n\t"
  50226. #else
  50227. "add r4, r4, r7\n\t"
  50228. #endif
  50229. #ifdef WOLFSSL_KEIL
  50230. "adcs r5, r5, %[r]\n\t"
  50231. #elif defined(__clang__)
  50232. "adcs r5, %[r]\n\t"
  50233. #else
  50234. "adc r5, %[r]\n\t"
  50235. #endif
  50236. "uxth r7, %[b]\n\t"
  50237. #ifdef WOLFSSL_KEIL
  50238. "muls r6, r7, r6\n\t"
  50239. #elif defined(__clang__)
  50240. "muls r6, r7\n\t"
  50241. #else
  50242. "mul r6, r7\n\t"
  50243. #endif
  50244. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50245. "lsrs r7, r6, #16\n\t"
  50246. #else
  50247. "lsr r7, r6, #16\n\t"
  50248. #endif
  50249. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50250. "lsls r6, r6, #16\n\t"
  50251. #else
  50252. "lsl r6, r6, #16\n\t"
  50253. #endif
  50254. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50255. "adds r3, r3, r6\n\t"
  50256. #else
  50257. "add r3, r3, r6\n\t"
  50258. #endif
  50259. #ifdef WOLFSSL_KEIL
  50260. "adcs r4, r4, r7\n\t"
  50261. #elif defined(__clang__)
  50262. "adcs r4, r7\n\t"
  50263. #else
  50264. "adc r4, r7\n\t"
  50265. #endif
  50266. #ifdef WOLFSSL_KEIL
  50267. "adcs r5, r5, %[r]\n\t"
  50268. #elif defined(__clang__)
  50269. "adcs r5, %[r]\n\t"
  50270. #else
  50271. "adc r5, %[r]\n\t"
  50272. #endif
  50273. "# A[11] * B[10]\n\t"
  50274. "mov %[a], r9\n\t"
  50275. "mov %[b], r10\n\t"
  50276. "ldr %[a], [%[a], #44]\n\t"
  50277. "ldr %[b], [%[b], #40]\n\t"
  50278. "uxth r6, %[a]\n\t"
  50279. "uxth r7, %[b]\n\t"
  50280. #ifdef WOLFSSL_KEIL
  50281. "muls r7, r6, r7\n\t"
  50282. #elif defined(__clang__)
  50283. "muls r7, r6\n\t"
  50284. #else
  50285. "mul r7, r6\n\t"
  50286. #endif
  50287. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50288. "adds r3, r3, r7\n\t"
  50289. #else
  50290. "add r3, r3, r7\n\t"
  50291. #endif
  50292. #ifdef WOLFSSL_KEIL
  50293. "adcs r4, r4, %[r]\n\t"
  50294. #elif defined(__clang__)
  50295. "adcs r4, %[r]\n\t"
  50296. #else
  50297. "adc r4, %[r]\n\t"
  50298. #endif
  50299. #ifdef WOLFSSL_KEIL
  50300. "adcs r5, r5, %[r]\n\t"
  50301. #elif defined(__clang__)
  50302. "adcs r5, %[r]\n\t"
  50303. #else
  50304. "adc r5, %[r]\n\t"
  50305. #endif
  50306. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50307. "lsrs r7, %[b], #16\n\t"
  50308. #else
  50309. "lsr r7, %[b], #16\n\t"
  50310. #endif
  50311. #ifdef WOLFSSL_KEIL
  50312. "muls r6, r7, r6\n\t"
  50313. #elif defined(__clang__)
  50314. "muls r6, r7\n\t"
  50315. #else
  50316. "mul r6, r7\n\t"
  50317. #endif
  50318. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50319. "lsrs r7, r6, #16\n\t"
  50320. #else
  50321. "lsr r7, r6, #16\n\t"
  50322. #endif
  50323. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50324. "lsls r6, r6, #16\n\t"
  50325. #else
  50326. "lsl r6, r6, #16\n\t"
  50327. #endif
  50328. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50329. "adds r3, r3, r6\n\t"
  50330. #else
  50331. "add r3, r3, r6\n\t"
  50332. #endif
  50333. #ifdef WOLFSSL_KEIL
  50334. "adcs r4, r4, r7\n\t"
  50335. #elif defined(__clang__)
  50336. "adcs r4, r7\n\t"
  50337. #else
  50338. "adc r4, r7\n\t"
  50339. #endif
  50340. #ifdef WOLFSSL_KEIL
  50341. "adcs r5, r5, %[r]\n\t"
  50342. #elif defined(__clang__)
  50343. "adcs r5, %[r]\n\t"
  50344. #else
  50345. "adc r5, %[r]\n\t"
  50346. #endif
  50347. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50348. "lsrs r6, %[a], #16\n\t"
  50349. #else
  50350. "lsr r6, %[a], #16\n\t"
  50351. #endif
  50352. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50353. "lsrs r7, %[b], #16\n\t"
  50354. #else
  50355. "lsr r7, %[b], #16\n\t"
  50356. #endif
  50357. #ifdef WOLFSSL_KEIL
  50358. "muls r7, r6, r7\n\t"
  50359. #elif defined(__clang__)
  50360. "muls r7, r6\n\t"
  50361. #else
  50362. "mul r7, r6\n\t"
  50363. #endif
  50364. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50365. "adds r4, r4, r7\n\t"
  50366. #else
  50367. "add r4, r4, r7\n\t"
  50368. #endif
  50369. #ifdef WOLFSSL_KEIL
  50370. "adcs r5, r5, %[r]\n\t"
  50371. #elif defined(__clang__)
  50372. "adcs r5, %[r]\n\t"
  50373. #else
  50374. "adc r5, %[r]\n\t"
  50375. #endif
  50376. "uxth r7, %[b]\n\t"
  50377. #ifdef WOLFSSL_KEIL
  50378. "muls r6, r7, r6\n\t"
  50379. #elif defined(__clang__)
  50380. "muls r6, r7\n\t"
  50381. #else
  50382. "mul r6, r7\n\t"
  50383. #endif
  50384. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50385. "lsrs r7, r6, #16\n\t"
  50386. #else
  50387. "lsr r7, r6, #16\n\t"
  50388. #endif
  50389. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50390. "lsls r6, r6, #16\n\t"
  50391. #else
  50392. "lsl r6, r6, #16\n\t"
  50393. #endif
  50394. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50395. "adds r3, r3, r6\n\t"
  50396. #else
  50397. "add r3, r3, r6\n\t"
  50398. #endif
  50399. #ifdef WOLFSSL_KEIL
  50400. "adcs r4, r4, r7\n\t"
  50401. #elif defined(__clang__)
  50402. "adcs r4, r7\n\t"
  50403. #else
  50404. "adc r4, r7\n\t"
  50405. #endif
  50406. #ifdef WOLFSSL_KEIL
  50407. "adcs r5, r5, %[r]\n\t"
  50408. #elif defined(__clang__)
  50409. "adcs r5, %[r]\n\t"
  50410. #else
  50411. "adc r5, %[r]\n\t"
  50412. #endif
  50413. "mov %[r], r8\n\t"
  50414. "str r3, [%[r], #84]\n\t"
  50415. "movs %[r], #0\n\t"
  50416. "# A[11] * B[11]\n\t"
  50417. "mov %[a], r9\n\t"
  50418. "mov %[b], r10\n\t"
  50419. "ldr %[a], [%[a], #44]\n\t"
  50420. "ldr %[b], [%[b], #44]\n\t"
  50421. "uxth r6, %[a]\n\t"
  50422. "uxth r7, %[b]\n\t"
  50423. #ifdef WOLFSSL_KEIL
  50424. "muls r7, r6, r7\n\t"
  50425. #elif defined(__clang__)
  50426. "muls r7, r6\n\t"
  50427. #else
  50428. "mul r7, r6\n\t"
  50429. #endif
  50430. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50431. "adds r4, r4, r7\n\t"
  50432. #else
  50433. "add r4, r4, r7\n\t"
  50434. #endif
  50435. #ifdef WOLFSSL_KEIL
  50436. "adcs r5, r5, %[r]\n\t"
  50437. #elif defined(__clang__)
  50438. "adcs r5, %[r]\n\t"
  50439. #else
  50440. "adc r5, %[r]\n\t"
  50441. #endif
  50442. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50443. "lsrs r7, %[b], #16\n\t"
  50444. #else
  50445. "lsr r7, %[b], #16\n\t"
  50446. #endif
  50447. #ifdef WOLFSSL_KEIL
  50448. "muls r6, r7, r6\n\t"
  50449. #elif defined(__clang__)
  50450. "muls r6, r7\n\t"
  50451. #else
  50452. "mul r6, r7\n\t"
  50453. #endif
  50454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50455. "lsrs r7, r6, #16\n\t"
  50456. #else
  50457. "lsr r7, r6, #16\n\t"
  50458. #endif
  50459. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50460. "lsls r6, r6, #16\n\t"
  50461. #else
  50462. "lsl r6, r6, #16\n\t"
  50463. #endif
  50464. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50465. "adds r4, r4, r6\n\t"
  50466. #else
  50467. "add r4, r4, r6\n\t"
  50468. #endif
  50469. #ifdef WOLFSSL_KEIL
  50470. "adcs r5, r5, r7\n\t"
  50471. #elif defined(__clang__)
  50472. "adcs r5, r7\n\t"
  50473. #else
  50474. "adc r5, r7\n\t"
  50475. #endif
  50476. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50477. "lsrs r6, %[a], #16\n\t"
  50478. #else
  50479. "lsr r6, %[a], #16\n\t"
  50480. #endif
  50481. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50482. "lsrs r7, %[b], #16\n\t"
  50483. #else
  50484. "lsr r7, %[b], #16\n\t"
  50485. #endif
  50486. #ifdef WOLFSSL_KEIL
  50487. "muls r7, r6, r7\n\t"
  50488. #elif defined(__clang__)
  50489. "muls r7, r6\n\t"
  50490. #else
  50491. "mul r7, r6\n\t"
  50492. #endif
  50493. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50494. "adds r5, r5, r7\n\t"
  50495. #else
  50496. "add r5, r5, r7\n\t"
  50497. #endif
  50498. "uxth r7, %[b]\n\t"
  50499. #ifdef WOLFSSL_KEIL
  50500. "muls r6, r7, r6\n\t"
  50501. #elif defined(__clang__)
  50502. "muls r6, r7\n\t"
  50503. #else
  50504. "mul r6, r7\n\t"
  50505. #endif
  50506. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50507. "lsrs r7, r6, #16\n\t"
  50508. #else
  50509. "lsr r7, r6, #16\n\t"
  50510. #endif
  50511. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50512. "lsls r6, r6, #16\n\t"
  50513. #else
  50514. "lsl r6, r6, #16\n\t"
  50515. #endif
  50516. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50517. "adds r4, r4, r6\n\t"
  50518. #else
  50519. "add r4, r4, r6\n\t"
  50520. #endif
  50521. #ifdef WOLFSSL_KEIL
  50522. "adcs r5, r5, r7\n\t"
  50523. #elif defined(__clang__)
  50524. "adcs r5, r7\n\t"
  50525. #else
  50526. "adc r5, r7\n\t"
  50527. #endif
  50528. "mov %[r], r8\n\t"
  50529. "str r4, [%[r], #88]\n\t"
  50530. "str r5, [%[r], #92]\n\t"
  50531. "pop {r3, r4, r5, r6}\n\t"
  50532. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  50533. "pop {r3, r4, r5, r6}\n\t"
  50534. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  50535. "pop {r3, r4, r5, r6}\n\t"
  50536. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  50537. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  50538. :
  50539. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10"
  50540. );
  50541. }
  50542. #endif /* !WOLFSSL_SP_LARGE_CODE */
  50543. /* Add b to a into r. (r = a + b)
  50544. *
  50545. * r A single precision integer.
  50546. * a A single precision integer.
  50547. * b A single precision integer.
  50548. */
  50549. SP_NOINLINE static sp_digit sp_3072_add_12(sp_digit* r, const sp_digit* a,
  50550. const sp_digit* b)
  50551. {
  50552. __asm__ __volatile__ (
  50553. "ldm %[b]!, {r5, r6}\n\t"
  50554. "ldm %[a]!, {r3, r4}\n\t"
  50555. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50556. "adds r3, r3, r5\n\t"
  50557. #else
  50558. "add r3, r3, r5\n\t"
  50559. #endif
  50560. #ifdef WOLFSSL_KEIL
  50561. "adcs r4, r4, r6\n\t"
  50562. #elif defined(__clang__)
  50563. "adcs r4, r6\n\t"
  50564. #else
  50565. "adc r4, r6\n\t"
  50566. #endif
  50567. "stm %[r]!, {r3, r4}\n\t"
  50568. "ldm %[b]!, {r5, r6}\n\t"
  50569. "ldm %[a]!, {r3, r4}\n\t"
  50570. #ifdef WOLFSSL_KEIL
  50571. "adcs r3, r3, r5\n\t"
  50572. #elif defined(__clang__)
  50573. "adcs r3, r5\n\t"
  50574. #else
  50575. "adc r3, r5\n\t"
  50576. #endif
  50577. #ifdef WOLFSSL_KEIL
  50578. "adcs r4, r4, r6\n\t"
  50579. #elif defined(__clang__)
  50580. "adcs r4, r6\n\t"
  50581. #else
  50582. "adc r4, r6\n\t"
  50583. #endif
  50584. "stm %[r]!, {r3, r4}\n\t"
  50585. "ldm %[b]!, {r5, r6}\n\t"
  50586. "ldm %[a]!, {r3, r4}\n\t"
  50587. #ifdef WOLFSSL_KEIL
  50588. "adcs r3, r3, r5\n\t"
  50589. #elif defined(__clang__)
  50590. "adcs r3, r5\n\t"
  50591. #else
  50592. "adc r3, r5\n\t"
  50593. #endif
  50594. #ifdef WOLFSSL_KEIL
  50595. "adcs r4, r4, r6\n\t"
  50596. #elif defined(__clang__)
  50597. "adcs r4, r6\n\t"
  50598. #else
  50599. "adc r4, r6\n\t"
  50600. #endif
  50601. "stm %[r]!, {r3, r4}\n\t"
  50602. "ldm %[b]!, {r5, r6}\n\t"
  50603. "ldm %[a]!, {r3, r4}\n\t"
  50604. #ifdef WOLFSSL_KEIL
  50605. "adcs r3, r3, r5\n\t"
  50606. #elif defined(__clang__)
  50607. "adcs r3, r5\n\t"
  50608. #else
  50609. "adc r3, r5\n\t"
  50610. #endif
  50611. #ifdef WOLFSSL_KEIL
  50612. "adcs r4, r4, r6\n\t"
  50613. #elif defined(__clang__)
  50614. "adcs r4, r6\n\t"
  50615. #else
  50616. "adc r4, r6\n\t"
  50617. #endif
  50618. "stm %[r]!, {r3, r4}\n\t"
  50619. "ldm %[b]!, {r5, r6}\n\t"
  50620. "ldm %[a]!, {r3, r4}\n\t"
  50621. #ifdef WOLFSSL_KEIL
  50622. "adcs r3, r3, r5\n\t"
  50623. #elif defined(__clang__)
  50624. "adcs r3, r5\n\t"
  50625. #else
  50626. "adc r3, r5\n\t"
  50627. #endif
  50628. #ifdef WOLFSSL_KEIL
  50629. "adcs r4, r4, r6\n\t"
  50630. #elif defined(__clang__)
  50631. "adcs r4, r6\n\t"
  50632. #else
  50633. "adc r4, r6\n\t"
  50634. #endif
  50635. "stm %[r]!, {r3, r4}\n\t"
  50636. "ldm %[b]!, {r5, r6}\n\t"
  50637. "ldm %[a]!, {r3, r4}\n\t"
  50638. #ifdef WOLFSSL_KEIL
  50639. "adcs r3, r3, r5\n\t"
  50640. #elif defined(__clang__)
  50641. "adcs r3, r5\n\t"
  50642. #else
  50643. "adc r3, r5\n\t"
  50644. #endif
  50645. #ifdef WOLFSSL_KEIL
  50646. "adcs r4, r4, r6\n\t"
  50647. #elif defined(__clang__)
  50648. "adcs r4, r6\n\t"
  50649. #else
  50650. "adc r4, r6\n\t"
  50651. #endif
  50652. "stm %[r]!, {r3, r4}\n\t"
  50653. "movs %[r], #0\n\t"
  50654. #ifdef WOLFSSL_KEIL
  50655. "adcs %[r], %[r], %[r]\n\t"
  50656. #elif defined(__clang__)
  50657. "adcs %[r], %[r]\n\t"
  50658. #else
  50659. "adc %[r], %[r]\n\t"
  50660. #endif
  50661. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  50662. :
  50663. : "memory", "r3", "r4", "r5", "r6"
  50664. );
  50665. return (uint32_t)(size_t)r;
  50666. }
  50667. /* Add b to a into r. (r = a + b)
  50668. *
  50669. * r A single precision integer.
  50670. * a A single precision integer.
  50671. * b A single precision integer.
  50672. */
  50673. SP_NOINLINE static sp_digit sp_3072_add_word_12(sp_digit* r, const sp_digit* a,
  50674. sp_digit b)
  50675. {
  50676. __asm__ __volatile__ (
  50677. "movs r5, #0\n\t"
  50678. "ldm %[a]!, {r3, r4}\n\t"
  50679. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50680. "adds r3, r3, %[b]\n\t"
  50681. #else
  50682. "add r3, r3, %[b]\n\t"
  50683. #endif
  50684. #ifdef WOLFSSL_KEIL
  50685. "adcs r4, r4, r5\n\t"
  50686. #elif defined(__clang__)
  50687. "adcs r4, r5\n\t"
  50688. #else
  50689. "adc r4, r5\n\t"
  50690. #endif
  50691. "stm %[r]!, {r3, r4}\n\t"
  50692. "ldm %[a]!, {r3, r4}\n\t"
  50693. #ifdef WOLFSSL_KEIL
  50694. "adcs r3, r3, r5\n\t"
  50695. #elif defined(__clang__)
  50696. "adcs r3, r5\n\t"
  50697. #else
  50698. "adc r3, r5\n\t"
  50699. #endif
  50700. #ifdef WOLFSSL_KEIL
  50701. "adcs r4, r4, r5\n\t"
  50702. #elif defined(__clang__)
  50703. "adcs r4, r5\n\t"
  50704. #else
  50705. "adc r4, r5\n\t"
  50706. #endif
  50707. "stm %[r]!, {r3, r4}\n\t"
  50708. "ldm %[a]!, {r3, r4}\n\t"
  50709. #ifdef WOLFSSL_KEIL
  50710. "adcs r3, r3, r5\n\t"
  50711. #elif defined(__clang__)
  50712. "adcs r3, r5\n\t"
  50713. #else
  50714. "adc r3, r5\n\t"
  50715. #endif
  50716. #ifdef WOLFSSL_KEIL
  50717. "adcs r4, r4, r5\n\t"
  50718. #elif defined(__clang__)
  50719. "adcs r4, r5\n\t"
  50720. #else
  50721. "adc r4, r5\n\t"
  50722. #endif
  50723. "stm %[r]!, {r3, r4}\n\t"
  50724. "ldm %[a]!, {r3, r4}\n\t"
  50725. #ifdef WOLFSSL_KEIL
  50726. "adcs r3, r3, r5\n\t"
  50727. #elif defined(__clang__)
  50728. "adcs r3, r5\n\t"
  50729. #else
  50730. "adc r3, r5\n\t"
  50731. #endif
  50732. #ifdef WOLFSSL_KEIL
  50733. "adcs r4, r4, r5\n\t"
  50734. #elif defined(__clang__)
  50735. "adcs r4, r5\n\t"
  50736. #else
  50737. "adc r4, r5\n\t"
  50738. #endif
  50739. "stm %[r]!, {r3, r4}\n\t"
  50740. "ldm %[a]!, {r3, r4}\n\t"
  50741. #ifdef WOLFSSL_KEIL
  50742. "adcs r3, r3, r5\n\t"
  50743. #elif defined(__clang__)
  50744. "adcs r3, r5\n\t"
  50745. #else
  50746. "adc r3, r5\n\t"
  50747. #endif
  50748. #ifdef WOLFSSL_KEIL
  50749. "adcs r4, r4, r5\n\t"
  50750. #elif defined(__clang__)
  50751. "adcs r4, r5\n\t"
  50752. #else
  50753. "adc r4, r5\n\t"
  50754. #endif
  50755. "stm %[r]!, {r3, r4}\n\t"
  50756. "ldm %[a]!, {r3, r4}\n\t"
  50757. #ifdef WOLFSSL_KEIL
  50758. "adcs r3, r3, r5\n\t"
  50759. #elif defined(__clang__)
  50760. "adcs r3, r5\n\t"
  50761. #else
  50762. "adc r3, r5\n\t"
  50763. #endif
  50764. #ifdef WOLFSSL_KEIL
  50765. "adcs r4, r4, r5\n\t"
  50766. #elif defined(__clang__)
  50767. "adcs r4, r5\n\t"
  50768. #else
  50769. "adc r4, r5\n\t"
  50770. #endif
  50771. "stm %[r]!, {r3, r4}\n\t"
  50772. "movs %[r], #0\n\t"
  50773. #ifdef WOLFSSL_KEIL
  50774. "adcs %[r], %[r], %[r]\n\t"
  50775. #elif defined(__clang__)
  50776. "adcs %[r], %[r]\n\t"
  50777. #else
  50778. "adc %[r], %[r]\n\t"
  50779. #endif
  50780. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  50781. :
  50782. : "memory", "r3", "r4", "r5"
  50783. );
  50784. return (uint32_t)(size_t)r;
  50785. }
  50786. /* Sub b from a into a. (a -= b)
  50787. *
  50788. * a A single precision integer.
  50789. * b A single precision integer.
  50790. */
  50791. SP_NOINLINE static sp_digit sp_3072_sub_in_place_24(sp_digit* a,
  50792. const sp_digit* b)
  50793. {
  50794. __asm__ __volatile__ (
  50795. "ldm %[b]!, {r4, r5}\n\t"
  50796. "ldr r2, [%[a]]\n\t"
  50797. "ldr r3, [%[a], #4]\n\t"
  50798. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50799. "subs r2, r2, r4\n\t"
  50800. #else
  50801. "sub r2, r2, r4\n\t"
  50802. #endif
  50803. #ifdef WOLFSSL_KEIL
  50804. "sbcs r3, r3, r5\n\t"
  50805. #elif defined(__clang__)
  50806. "sbcs r3, r5\n\t"
  50807. #else
  50808. "sbc r3, r5\n\t"
  50809. #endif
  50810. "stm %[a]!, {r2, r3}\n\t"
  50811. "ldm %[b]!, {r4, r5}\n\t"
  50812. "ldr r2, [%[a]]\n\t"
  50813. "ldr r3, [%[a], #4]\n\t"
  50814. #ifdef WOLFSSL_KEIL
  50815. "sbcs r2, r2, r4\n\t"
  50816. #elif defined(__clang__)
  50817. "sbcs r2, r4\n\t"
  50818. #else
  50819. "sbc r2, r4\n\t"
  50820. #endif
  50821. #ifdef WOLFSSL_KEIL
  50822. "sbcs r3, r3, r5\n\t"
  50823. #elif defined(__clang__)
  50824. "sbcs r3, r5\n\t"
  50825. #else
  50826. "sbc r3, r5\n\t"
  50827. #endif
  50828. "stm %[a]!, {r2, r3}\n\t"
  50829. "ldm %[b]!, {r4, r5}\n\t"
  50830. "ldr r2, [%[a]]\n\t"
  50831. "ldr r3, [%[a], #4]\n\t"
  50832. #ifdef WOLFSSL_KEIL
  50833. "sbcs r2, r2, r4\n\t"
  50834. #elif defined(__clang__)
  50835. "sbcs r2, r4\n\t"
  50836. #else
  50837. "sbc r2, r4\n\t"
  50838. #endif
  50839. #ifdef WOLFSSL_KEIL
  50840. "sbcs r3, r3, r5\n\t"
  50841. #elif defined(__clang__)
  50842. "sbcs r3, r5\n\t"
  50843. #else
  50844. "sbc r3, r5\n\t"
  50845. #endif
  50846. "stm %[a]!, {r2, r3}\n\t"
  50847. "ldm %[b]!, {r4, r5}\n\t"
  50848. "ldr r2, [%[a]]\n\t"
  50849. "ldr r3, [%[a], #4]\n\t"
  50850. #ifdef WOLFSSL_KEIL
  50851. "sbcs r2, r2, r4\n\t"
  50852. #elif defined(__clang__)
  50853. "sbcs r2, r4\n\t"
  50854. #else
  50855. "sbc r2, r4\n\t"
  50856. #endif
  50857. #ifdef WOLFSSL_KEIL
  50858. "sbcs r3, r3, r5\n\t"
  50859. #elif defined(__clang__)
  50860. "sbcs r3, r5\n\t"
  50861. #else
  50862. "sbc r3, r5\n\t"
  50863. #endif
  50864. "stm %[a]!, {r2, r3}\n\t"
  50865. "ldm %[b]!, {r4, r5}\n\t"
  50866. "ldr r2, [%[a]]\n\t"
  50867. "ldr r3, [%[a], #4]\n\t"
  50868. #ifdef WOLFSSL_KEIL
  50869. "sbcs r2, r2, r4\n\t"
  50870. #elif defined(__clang__)
  50871. "sbcs r2, r4\n\t"
  50872. #else
  50873. "sbc r2, r4\n\t"
  50874. #endif
  50875. #ifdef WOLFSSL_KEIL
  50876. "sbcs r3, r3, r5\n\t"
  50877. #elif defined(__clang__)
  50878. "sbcs r3, r5\n\t"
  50879. #else
  50880. "sbc r3, r5\n\t"
  50881. #endif
  50882. "stm %[a]!, {r2, r3}\n\t"
  50883. "ldm %[b]!, {r4, r5}\n\t"
  50884. "ldr r2, [%[a]]\n\t"
  50885. "ldr r3, [%[a], #4]\n\t"
  50886. #ifdef WOLFSSL_KEIL
  50887. "sbcs r2, r2, r4\n\t"
  50888. #elif defined(__clang__)
  50889. "sbcs r2, r4\n\t"
  50890. #else
  50891. "sbc r2, r4\n\t"
  50892. #endif
  50893. #ifdef WOLFSSL_KEIL
  50894. "sbcs r3, r3, r5\n\t"
  50895. #elif defined(__clang__)
  50896. "sbcs r3, r5\n\t"
  50897. #else
  50898. "sbc r3, r5\n\t"
  50899. #endif
  50900. "stm %[a]!, {r2, r3}\n\t"
  50901. "ldm %[b]!, {r4, r5}\n\t"
  50902. "ldr r2, [%[a]]\n\t"
  50903. "ldr r3, [%[a], #4]\n\t"
  50904. #ifdef WOLFSSL_KEIL
  50905. "sbcs r2, r2, r4\n\t"
  50906. #elif defined(__clang__)
  50907. "sbcs r2, r4\n\t"
  50908. #else
  50909. "sbc r2, r4\n\t"
  50910. #endif
  50911. #ifdef WOLFSSL_KEIL
  50912. "sbcs r3, r3, r5\n\t"
  50913. #elif defined(__clang__)
  50914. "sbcs r3, r5\n\t"
  50915. #else
  50916. "sbc r3, r5\n\t"
  50917. #endif
  50918. "stm %[a]!, {r2, r3}\n\t"
  50919. "ldm %[b]!, {r4, r5}\n\t"
  50920. "ldr r2, [%[a]]\n\t"
  50921. "ldr r3, [%[a], #4]\n\t"
  50922. #ifdef WOLFSSL_KEIL
  50923. "sbcs r2, r2, r4\n\t"
  50924. #elif defined(__clang__)
  50925. "sbcs r2, r4\n\t"
  50926. #else
  50927. "sbc r2, r4\n\t"
  50928. #endif
  50929. #ifdef WOLFSSL_KEIL
  50930. "sbcs r3, r3, r5\n\t"
  50931. #elif defined(__clang__)
  50932. "sbcs r3, r5\n\t"
  50933. #else
  50934. "sbc r3, r5\n\t"
  50935. #endif
  50936. "stm %[a]!, {r2, r3}\n\t"
  50937. "ldm %[b]!, {r4, r5}\n\t"
  50938. "ldr r2, [%[a]]\n\t"
  50939. "ldr r3, [%[a], #4]\n\t"
  50940. #ifdef WOLFSSL_KEIL
  50941. "sbcs r2, r2, r4\n\t"
  50942. #elif defined(__clang__)
  50943. "sbcs r2, r4\n\t"
  50944. #else
  50945. "sbc r2, r4\n\t"
  50946. #endif
  50947. #ifdef WOLFSSL_KEIL
  50948. "sbcs r3, r3, r5\n\t"
  50949. #elif defined(__clang__)
  50950. "sbcs r3, r5\n\t"
  50951. #else
  50952. "sbc r3, r5\n\t"
  50953. #endif
  50954. "stm %[a]!, {r2, r3}\n\t"
  50955. "ldm %[b]!, {r4, r5}\n\t"
  50956. "ldr r2, [%[a]]\n\t"
  50957. "ldr r3, [%[a], #4]\n\t"
  50958. #ifdef WOLFSSL_KEIL
  50959. "sbcs r2, r2, r4\n\t"
  50960. #elif defined(__clang__)
  50961. "sbcs r2, r4\n\t"
  50962. #else
  50963. "sbc r2, r4\n\t"
  50964. #endif
  50965. #ifdef WOLFSSL_KEIL
  50966. "sbcs r3, r3, r5\n\t"
  50967. #elif defined(__clang__)
  50968. "sbcs r3, r5\n\t"
  50969. #else
  50970. "sbc r3, r5\n\t"
  50971. #endif
  50972. "stm %[a]!, {r2, r3}\n\t"
  50973. "ldm %[b]!, {r4, r5}\n\t"
  50974. "ldr r2, [%[a]]\n\t"
  50975. "ldr r3, [%[a], #4]\n\t"
  50976. #ifdef WOLFSSL_KEIL
  50977. "sbcs r2, r2, r4\n\t"
  50978. #elif defined(__clang__)
  50979. "sbcs r2, r4\n\t"
  50980. #else
  50981. "sbc r2, r4\n\t"
  50982. #endif
  50983. #ifdef WOLFSSL_KEIL
  50984. "sbcs r3, r3, r5\n\t"
  50985. #elif defined(__clang__)
  50986. "sbcs r3, r5\n\t"
  50987. #else
  50988. "sbc r3, r5\n\t"
  50989. #endif
  50990. "stm %[a]!, {r2, r3}\n\t"
  50991. "ldm %[b]!, {r4, r5}\n\t"
  50992. "ldr r2, [%[a]]\n\t"
  50993. "ldr r3, [%[a], #4]\n\t"
  50994. #ifdef WOLFSSL_KEIL
  50995. "sbcs r2, r2, r4\n\t"
  50996. #elif defined(__clang__)
  50997. "sbcs r2, r4\n\t"
  50998. #else
  50999. "sbc r2, r4\n\t"
  51000. #endif
  51001. #ifdef WOLFSSL_KEIL
  51002. "sbcs r3, r3, r5\n\t"
  51003. #elif defined(__clang__)
  51004. "sbcs r3, r5\n\t"
  51005. #else
  51006. "sbc r3, r5\n\t"
  51007. #endif
  51008. "stm %[a]!, {r2, r3}\n\t"
  51009. #ifdef WOLFSSL_KEIL
  51010. "sbcs %[a], %[a], %[a]\n\t"
  51011. #elif defined(__clang__)
  51012. "sbcs %[a], %[a]\n\t"
  51013. #else
  51014. "sbc %[a], %[a]\n\t"
  51015. #endif
  51016. : [a] "+l" (a), [b] "+l" (b)
  51017. :
  51018. : "memory", "r2", "r3", "r4", "r5"
  51019. );
  51020. return (uint32_t)(size_t)a;
  51021. }
  51022. /* Add b to a into r. (r = a + b)
  51023. *
  51024. * r A single precision integer.
  51025. * a A single precision integer.
  51026. * b A single precision integer.
  51027. */
  51028. SP_NOINLINE static sp_digit sp_3072_add_24(sp_digit* r, const sp_digit* a,
  51029. const sp_digit* b)
  51030. {
  51031. __asm__ __volatile__ (
  51032. "ldm %[b]!, {r5, r6}\n\t"
  51033. "ldm %[a]!, {r3, r4}\n\t"
  51034. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51035. "adds r3, r3, r5\n\t"
  51036. #else
  51037. "add r3, r3, r5\n\t"
  51038. #endif
  51039. #ifdef WOLFSSL_KEIL
  51040. "adcs r4, r4, r6\n\t"
  51041. #elif defined(__clang__)
  51042. "adcs r4, r6\n\t"
  51043. #else
  51044. "adc r4, r6\n\t"
  51045. #endif
  51046. "stm %[r]!, {r3, r4}\n\t"
  51047. "ldm %[b]!, {r5, r6}\n\t"
  51048. "ldm %[a]!, {r3, r4}\n\t"
  51049. #ifdef WOLFSSL_KEIL
  51050. "adcs r3, r3, r5\n\t"
  51051. #elif defined(__clang__)
  51052. "adcs r3, r5\n\t"
  51053. #else
  51054. "adc r3, r5\n\t"
  51055. #endif
  51056. #ifdef WOLFSSL_KEIL
  51057. "adcs r4, r4, r6\n\t"
  51058. #elif defined(__clang__)
  51059. "adcs r4, r6\n\t"
  51060. #else
  51061. "adc r4, r6\n\t"
  51062. #endif
  51063. "stm %[r]!, {r3, r4}\n\t"
  51064. "ldm %[b]!, {r5, r6}\n\t"
  51065. "ldm %[a]!, {r3, r4}\n\t"
  51066. #ifdef WOLFSSL_KEIL
  51067. "adcs r3, r3, r5\n\t"
  51068. #elif defined(__clang__)
  51069. "adcs r3, r5\n\t"
  51070. #else
  51071. "adc r3, r5\n\t"
  51072. #endif
  51073. #ifdef WOLFSSL_KEIL
  51074. "adcs r4, r4, r6\n\t"
  51075. #elif defined(__clang__)
  51076. "adcs r4, r6\n\t"
  51077. #else
  51078. "adc r4, r6\n\t"
  51079. #endif
  51080. "stm %[r]!, {r3, r4}\n\t"
  51081. "ldm %[b]!, {r5, r6}\n\t"
  51082. "ldm %[a]!, {r3, r4}\n\t"
  51083. #ifdef WOLFSSL_KEIL
  51084. "adcs r3, r3, r5\n\t"
  51085. #elif defined(__clang__)
  51086. "adcs r3, r5\n\t"
  51087. #else
  51088. "adc r3, r5\n\t"
  51089. #endif
  51090. #ifdef WOLFSSL_KEIL
  51091. "adcs r4, r4, r6\n\t"
  51092. #elif defined(__clang__)
  51093. "adcs r4, r6\n\t"
  51094. #else
  51095. "adc r4, r6\n\t"
  51096. #endif
  51097. "stm %[r]!, {r3, r4}\n\t"
  51098. "ldm %[b]!, {r5, r6}\n\t"
  51099. "ldm %[a]!, {r3, r4}\n\t"
  51100. #ifdef WOLFSSL_KEIL
  51101. "adcs r3, r3, r5\n\t"
  51102. #elif defined(__clang__)
  51103. "adcs r3, r5\n\t"
  51104. #else
  51105. "adc r3, r5\n\t"
  51106. #endif
  51107. #ifdef WOLFSSL_KEIL
  51108. "adcs r4, r4, r6\n\t"
  51109. #elif defined(__clang__)
  51110. "adcs r4, r6\n\t"
  51111. #else
  51112. "adc r4, r6\n\t"
  51113. #endif
  51114. "stm %[r]!, {r3, r4}\n\t"
  51115. "ldm %[b]!, {r5, r6}\n\t"
  51116. "ldm %[a]!, {r3, r4}\n\t"
  51117. #ifdef WOLFSSL_KEIL
  51118. "adcs r3, r3, r5\n\t"
  51119. #elif defined(__clang__)
  51120. "adcs r3, r5\n\t"
  51121. #else
  51122. "adc r3, r5\n\t"
  51123. #endif
  51124. #ifdef WOLFSSL_KEIL
  51125. "adcs r4, r4, r6\n\t"
  51126. #elif defined(__clang__)
  51127. "adcs r4, r6\n\t"
  51128. #else
  51129. "adc r4, r6\n\t"
  51130. #endif
  51131. "stm %[r]!, {r3, r4}\n\t"
  51132. "ldm %[b]!, {r5, r6}\n\t"
  51133. "ldm %[a]!, {r3, r4}\n\t"
  51134. #ifdef WOLFSSL_KEIL
  51135. "adcs r3, r3, r5\n\t"
  51136. #elif defined(__clang__)
  51137. "adcs r3, r5\n\t"
  51138. #else
  51139. "adc r3, r5\n\t"
  51140. #endif
  51141. #ifdef WOLFSSL_KEIL
  51142. "adcs r4, r4, r6\n\t"
  51143. #elif defined(__clang__)
  51144. "adcs r4, r6\n\t"
  51145. #else
  51146. "adc r4, r6\n\t"
  51147. #endif
  51148. "stm %[r]!, {r3, r4}\n\t"
  51149. "ldm %[b]!, {r5, r6}\n\t"
  51150. "ldm %[a]!, {r3, r4}\n\t"
  51151. #ifdef WOLFSSL_KEIL
  51152. "adcs r3, r3, r5\n\t"
  51153. #elif defined(__clang__)
  51154. "adcs r3, r5\n\t"
  51155. #else
  51156. "adc r3, r5\n\t"
  51157. #endif
  51158. #ifdef WOLFSSL_KEIL
  51159. "adcs r4, r4, r6\n\t"
  51160. #elif defined(__clang__)
  51161. "adcs r4, r6\n\t"
  51162. #else
  51163. "adc r4, r6\n\t"
  51164. #endif
  51165. "stm %[r]!, {r3, r4}\n\t"
  51166. "ldm %[b]!, {r5, r6}\n\t"
  51167. "ldm %[a]!, {r3, r4}\n\t"
  51168. #ifdef WOLFSSL_KEIL
  51169. "adcs r3, r3, r5\n\t"
  51170. #elif defined(__clang__)
  51171. "adcs r3, r5\n\t"
  51172. #else
  51173. "adc r3, r5\n\t"
  51174. #endif
  51175. #ifdef WOLFSSL_KEIL
  51176. "adcs r4, r4, r6\n\t"
  51177. #elif defined(__clang__)
  51178. "adcs r4, r6\n\t"
  51179. #else
  51180. "adc r4, r6\n\t"
  51181. #endif
  51182. "stm %[r]!, {r3, r4}\n\t"
  51183. "ldm %[b]!, {r5, r6}\n\t"
  51184. "ldm %[a]!, {r3, r4}\n\t"
  51185. #ifdef WOLFSSL_KEIL
  51186. "adcs r3, r3, r5\n\t"
  51187. #elif defined(__clang__)
  51188. "adcs r3, r5\n\t"
  51189. #else
  51190. "adc r3, r5\n\t"
  51191. #endif
  51192. #ifdef WOLFSSL_KEIL
  51193. "adcs r4, r4, r6\n\t"
  51194. #elif defined(__clang__)
  51195. "adcs r4, r6\n\t"
  51196. #else
  51197. "adc r4, r6\n\t"
  51198. #endif
  51199. "stm %[r]!, {r3, r4}\n\t"
  51200. "ldm %[b]!, {r5, r6}\n\t"
  51201. "ldm %[a]!, {r3, r4}\n\t"
  51202. #ifdef WOLFSSL_KEIL
  51203. "adcs r3, r3, r5\n\t"
  51204. #elif defined(__clang__)
  51205. "adcs r3, r5\n\t"
  51206. #else
  51207. "adc r3, r5\n\t"
  51208. #endif
  51209. #ifdef WOLFSSL_KEIL
  51210. "adcs r4, r4, r6\n\t"
  51211. #elif defined(__clang__)
  51212. "adcs r4, r6\n\t"
  51213. #else
  51214. "adc r4, r6\n\t"
  51215. #endif
  51216. "stm %[r]!, {r3, r4}\n\t"
  51217. "ldm %[b]!, {r5, r6}\n\t"
  51218. "ldm %[a]!, {r3, r4}\n\t"
  51219. #ifdef WOLFSSL_KEIL
  51220. "adcs r3, r3, r5\n\t"
  51221. #elif defined(__clang__)
  51222. "adcs r3, r5\n\t"
  51223. #else
  51224. "adc r3, r5\n\t"
  51225. #endif
  51226. #ifdef WOLFSSL_KEIL
  51227. "adcs r4, r4, r6\n\t"
  51228. #elif defined(__clang__)
  51229. "adcs r4, r6\n\t"
  51230. #else
  51231. "adc r4, r6\n\t"
  51232. #endif
  51233. "stm %[r]!, {r3, r4}\n\t"
  51234. "movs %[r], #0\n\t"
  51235. #ifdef WOLFSSL_KEIL
  51236. "adcs %[r], %[r], %[r]\n\t"
  51237. #elif defined(__clang__)
  51238. "adcs %[r], %[r]\n\t"
  51239. #else
  51240. "adc %[r], %[r]\n\t"
  51241. #endif
  51242. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  51243. :
  51244. : "memory", "r3", "r4", "r5", "r6"
  51245. );
  51246. return (uint32_t)(size_t)r;
  51247. }
  51248. /* AND m into each word of a and store in r.
  51249. *
  51250. * r A single precision integer.
  51251. * a A single precision integer.
  51252. * m Mask to AND against each digit.
  51253. */
  51254. static void sp_3072_mask_12(sp_digit* r, const sp_digit* a, sp_digit m)
  51255. {
  51256. #ifdef WOLFSSL_SP_SMALL
  51257. int i;
  51258. for (i=0; i<12; i++) {
  51259. r[i] = a[i] & m;
  51260. }
  51261. #else
  51262. r[0] = a[0] & m;
  51263. r[1] = a[1] & m;
  51264. r[2] = a[2] & m;
  51265. r[3] = a[3] & m;
  51266. r[4] = a[4] & m;
  51267. r[5] = a[5] & m;
  51268. r[6] = a[6] & m;
  51269. r[7] = a[7] & m;
  51270. r[8] = a[8] & m;
  51271. r[9] = a[9] & m;
  51272. r[10] = a[10] & m;
  51273. r[11] = a[11] & m;
  51274. #endif
  51275. }
  51276. /* Multiply a and b into r. (r = a * b)
  51277. *
  51278. * r A single precision integer.
  51279. * a A single precision integer.
  51280. * b A single precision integer.
  51281. */
  51282. SP_NOINLINE static void sp_3072_mul_24(sp_digit* r, const sp_digit* a,
  51283. const sp_digit* b)
  51284. {
  51285. sp_digit* z0 = r;
  51286. sp_digit z1[24];
  51287. sp_digit a1[12];
  51288. sp_digit b1[12];
  51289. sp_digit* z2 = r + 24;
  51290. sp_digit u;
  51291. sp_digit ca;
  51292. sp_digit cb;
  51293. ca = sp_3072_add_12(a1, a, &a[12]);
  51294. cb = sp_3072_add_12(b1, b, &b[12]);
  51295. u = ca & cb;
  51296. sp_3072_mul_12(z2, &a[12], &b[12]);
  51297. sp_3072_mul_12(z0, a, b);
  51298. sp_3072_mul_12(z1, a1, b1);
  51299. u += sp_3072_sub_in_place_24(z1, z0);
  51300. u += sp_3072_sub_in_place_24(z1, z2);
  51301. sp_3072_mask_12(a1, a1, 0 - cb);
  51302. u += sp_3072_add_12(z1 + 12, z1 + 12, a1);
  51303. sp_3072_mask_12(b1, b1, 0 - ca);
  51304. u += sp_3072_add_12(z1 + 12, z1 + 12, b1);
  51305. u += sp_3072_add_24(r + 12, r + 12, z1);
  51306. (void)sp_3072_add_word_12(r + 36, r + 36, u);
  51307. }
  51308. /* Add b to a into r. (r = a + b)
  51309. *
  51310. * r A single precision integer.
  51311. * a A single precision integer.
  51312. * b A single precision integer.
  51313. */
  51314. SP_NOINLINE static sp_digit sp_3072_add_word_24(sp_digit* r, const sp_digit* a,
  51315. sp_digit b)
  51316. {
  51317. __asm__ __volatile__ (
  51318. "movs r5, #0\n\t"
  51319. "ldm %[a]!, {r3, r4}\n\t"
  51320. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51321. "adds r3, r3, %[b]\n\t"
  51322. #else
  51323. "add r3, r3, %[b]\n\t"
  51324. #endif
  51325. #ifdef WOLFSSL_KEIL
  51326. "adcs r4, r4, r5\n\t"
  51327. #elif defined(__clang__)
  51328. "adcs r4, r5\n\t"
  51329. #else
  51330. "adc r4, r5\n\t"
  51331. #endif
  51332. "stm %[r]!, {r3, r4}\n\t"
  51333. "ldm %[a]!, {r3, r4}\n\t"
  51334. #ifdef WOLFSSL_KEIL
  51335. "adcs r3, r3, r5\n\t"
  51336. #elif defined(__clang__)
  51337. "adcs r3, r5\n\t"
  51338. #else
  51339. "adc r3, r5\n\t"
  51340. #endif
  51341. #ifdef WOLFSSL_KEIL
  51342. "adcs r4, r4, r5\n\t"
  51343. #elif defined(__clang__)
  51344. "adcs r4, r5\n\t"
  51345. #else
  51346. "adc r4, r5\n\t"
  51347. #endif
  51348. "stm %[r]!, {r3, r4}\n\t"
  51349. "ldm %[a]!, {r3, r4}\n\t"
  51350. #ifdef WOLFSSL_KEIL
  51351. "adcs r3, r3, r5\n\t"
  51352. #elif defined(__clang__)
  51353. "adcs r3, r5\n\t"
  51354. #else
  51355. "adc r3, r5\n\t"
  51356. #endif
  51357. #ifdef WOLFSSL_KEIL
  51358. "adcs r4, r4, r5\n\t"
  51359. #elif defined(__clang__)
  51360. "adcs r4, r5\n\t"
  51361. #else
  51362. "adc r4, r5\n\t"
  51363. #endif
  51364. "stm %[r]!, {r3, r4}\n\t"
  51365. "ldm %[a]!, {r3, r4}\n\t"
  51366. #ifdef WOLFSSL_KEIL
  51367. "adcs r3, r3, r5\n\t"
  51368. #elif defined(__clang__)
  51369. "adcs r3, r5\n\t"
  51370. #else
  51371. "adc r3, r5\n\t"
  51372. #endif
  51373. #ifdef WOLFSSL_KEIL
  51374. "adcs r4, r4, r5\n\t"
  51375. #elif defined(__clang__)
  51376. "adcs r4, r5\n\t"
  51377. #else
  51378. "adc r4, r5\n\t"
  51379. #endif
  51380. "stm %[r]!, {r3, r4}\n\t"
  51381. "ldm %[a]!, {r3, r4}\n\t"
  51382. #ifdef WOLFSSL_KEIL
  51383. "adcs r3, r3, r5\n\t"
  51384. #elif defined(__clang__)
  51385. "adcs r3, r5\n\t"
  51386. #else
  51387. "adc r3, r5\n\t"
  51388. #endif
  51389. #ifdef WOLFSSL_KEIL
  51390. "adcs r4, r4, r5\n\t"
  51391. #elif defined(__clang__)
  51392. "adcs r4, r5\n\t"
  51393. #else
  51394. "adc r4, r5\n\t"
  51395. #endif
  51396. "stm %[r]!, {r3, r4}\n\t"
  51397. "ldm %[a]!, {r3, r4}\n\t"
  51398. #ifdef WOLFSSL_KEIL
  51399. "adcs r3, r3, r5\n\t"
  51400. #elif defined(__clang__)
  51401. "adcs r3, r5\n\t"
  51402. #else
  51403. "adc r3, r5\n\t"
  51404. #endif
  51405. #ifdef WOLFSSL_KEIL
  51406. "adcs r4, r4, r5\n\t"
  51407. #elif defined(__clang__)
  51408. "adcs r4, r5\n\t"
  51409. #else
  51410. "adc r4, r5\n\t"
  51411. #endif
  51412. "stm %[r]!, {r3, r4}\n\t"
  51413. "ldm %[a]!, {r3, r4}\n\t"
  51414. #ifdef WOLFSSL_KEIL
  51415. "adcs r3, r3, r5\n\t"
  51416. #elif defined(__clang__)
  51417. "adcs r3, r5\n\t"
  51418. #else
  51419. "adc r3, r5\n\t"
  51420. #endif
  51421. #ifdef WOLFSSL_KEIL
  51422. "adcs r4, r4, r5\n\t"
  51423. #elif defined(__clang__)
  51424. "adcs r4, r5\n\t"
  51425. #else
  51426. "adc r4, r5\n\t"
  51427. #endif
  51428. "stm %[r]!, {r3, r4}\n\t"
  51429. "ldm %[a]!, {r3, r4}\n\t"
  51430. #ifdef WOLFSSL_KEIL
  51431. "adcs r3, r3, r5\n\t"
  51432. #elif defined(__clang__)
  51433. "adcs r3, r5\n\t"
  51434. #else
  51435. "adc r3, r5\n\t"
  51436. #endif
  51437. #ifdef WOLFSSL_KEIL
  51438. "adcs r4, r4, r5\n\t"
  51439. #elif defined(__clang__)
  51440. "adcs r4, r5\n\t"
  51441. #else
  51442. "adc r4, r5\n\t"
  51443. #endif
  51444. "stm %[r]!, {r3, r4}\n\t"
  51445. "ldm %[a]!, {r3, r4}\n\t"
  51446. #ifdef WOLFSSL_KEIL
  51447. "adcs r3, r3, r5\n\t"
  51448. #elif defined(__clang__)
  51449. "adcs r3, r5\n\t"
  51450. #else
  51451. "adc r3, r5\n\t"
  51452. #endif
  51453. #ifdef WOLFSSL_KEIL
  51454. "adcs r4, r4, r5\n\t"
  51455. #elif defined(__clang__)
  51456. "adcs r4, r5\n\t"
  51457. #else
  51458. "adc r4, r5\n\t"
  51459. #endif
  51460. "stm %[r]!, {r3, r4}\n\t"
  51461. "ldm %[a]!, {r3, r4}\n\t"
  51462. #ifdef WOLFSSL_KEIL
  51463. "adcs r3, r3, r5\n\t"
  51464. #elif defined(__clang__)
  51465. "adcs r3, r5\n\t"
  51466. #else
  51467. "adc r3, r5\n\t"
  51468. #endif
  51469. #ifdef WOLFSSL_KEIL
  51470. "adcs r4, r4, r5\n\t"
  51471. #elif defined(__clang__)
  51472. "adcs r4, r5\n\t"
  51473. #else
  51474. "adc r4, r5\n\t"
  51475. #endif
  51476. "stm %[r]!, {r3, r4}\n\t"
  51477. "ldm %[a]!, {r3, r4}\n\t"
  51478. #ifdef WOLFSSL_KEIL
  51479. "adcs r3, r3, r5\n\t"
  51480. #elif defined(__clang__)
  51481. "adcs r3, r5\n\t"
  51482. #else
  51483. "adc r3, r5\n\t"
  51484. #endif
  51485. #ifdef WOLFSSL_KEIL
  51486. "adcs r4, r4, r5\n\t"
  51487. #elif defined(__clang__)
  51488. "adcs r4, r5\n\t"
  51489. #else
  51490. "adc r4, r5\n\t"
  51491. #endif
  51492. "stm %[r]!, {r3, r4}\n\t"
  51493. "ldm %[a]!, {r3, r4}\n\t"
  51494. #ifdef WOLFSSL_KEIL
  51495. "adcs r3, r3, r5\n\t"
  51496. #elif defined(__clang__)
  51497. "adcs r3, r5\n\t"
  51498. #else
  51499. "adc r3, r5\n\t"
  51500. #endif
  51501. #ifdef WOLFSSL_KEIL
  51502. "adcs r4, r4, r5\n\t"
  51503. #elif defined(__clang__)
  51504. "adcs r4, r5\n\t"
  51505. #else
  51506. "adc r4, r5\n\t"
  51507. #endif
  51508. "stm %[r]!, {r3, r4}\n\t"
  51509. "movs %[r], #0\n\t"
  51510. #ifdef WOLFSSL_KEIL
  51511. "adcs %[r], %[r], %[r]\n\t"
  51512. #elif defined(__clang__)
  51513. "adcs %[r], %[r]\n\t"
  51514. #else
  51515. "adc %[r], %[r]\n\t"
  51516. #endif
  51517. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  51518. :
  51519. : "memory", "r3", "r4", "r5"
  51520. );
  51521. return (uint32_t)(size_t)r;
  51522. }
  51523. /* Sub b from a into a. (a -= b)
  51524. *
  51525. * a A single precision integer.
  51526. * b A single precision integer.
  51527. */
  51528. SP_NOINLINE static sp_digit sp_3072_sub_in_place_48(sp_digit* a,
  51529. const sp_digit* b)
  51530. {
  51531. __asm__ __volatile__ (
  51532. "ldm %[b]!, {r4, r5}\n\t"
  51533. "ldr r2, [%[a]]\n\t"
  51534. "ldr r3, [%[a], #4]\n\t"
  51535. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51536. "subs r2, r2, r4\n\t"
  51537. #else
  51538. "sub r2, r2, r4\n\t"
  51539. #endif
  51540. #ifdef WOLFSSL_KEIL
  51541. "sbcs r3, r3, r5\n\t"
  51542. #elif defined(__clang__)
  51543. "sbcs r3, r5\n\t"
  51544. #else
  51545. "sbc r3, r5\n\t"
  51546. #endif
  51547. "stm %[a]!, {r2, r3}\n\t"
  51548. "ldm %[b]!, {r4, r5}\n\t"
  51549. "ldr r2, [%[a]]\n\t"
  51550. "ldr r3, [%[a], #4]\n\t"
  51551. #ifdef WOLFSSL_KEIL
  51552. "sbcs r2, r2, r4\n\t"
  51553. #elif defined(__clang__)
  51554. "sbcs r2, r4\n\t"
  51555. #else
  51556. "sbc r2, r4\n\t"
  51557. #endif
  51558. #ifdef WOLFSSL_KEIL
  51559. "sbcs r3, r3, r5\n\t"
  51560. #elif defined(__clang__)
  51561. "sbcs r3, r5\n\t"
  51562. #else
  51563. "sbc r3, r5\n\t"
  51564. #endif
  51565. "stm %[a]!, {r2, r3}\n\t"
  51566. "ldm %[b]!, {r4, r5}\n\t"
  51567. "ldr r2, [%[a]]\n\t"
  51568. "ldr r3, [%[a], #4]\n\t"
  51569. #ifdef WOLFSSL_KEIL
  51570. "sbcs r2, r2, r4\n\t"
  51571. #elif defined(__clang__)
  51572. "sbcs r2, r4\n\t"
  51573. #else
  51574. "sbc r2, r4\n\t"
  51575. #endif
  51576. #ifdef WOLFSSL_KEIL
  51577. "sbcs r3, r3, r5\n\t"
  51578. #elif defined(__clang__)
  51579. "sbcs r3, r5\n\t"
  51580. #else
  51581. "sbc r3, r5\n\t"
  51582. #endif
  51583. "stm %[a]!, {r2, r3}\n\t"
  51584. "ldm %[b]!, {r4, r5}\n\t"
  51585. "ldr r2, [%[a]]\n\t"
  51586. "ldr r3, [%[a], #4]\n\t"
  51587. #ifdef WOLFSSL_KEIL
  51588. "sbcs r2, r2, r4\n\t"
  51589. #elif defined(__clang__)
  51590. "sbcs r2, r4\n\t"
  51591. #else
  51592. "sbc r2, r4\n\t"
  51593. #endif
  51594. #ifdef WOLFSSL_KEIL
  51595. "sbcs r3, r3, r5\n\t"
  51596. #elif defined(__clang__)
  51597. "sbcs r3, r5\n\t"
  51598. #else
  51599. "sbc r3, r5\n\t"
  51600. #endif
  51601. "stm %[a]!, {r2, r3}\n\t"
  51602. "ldm %[b]!, {r4, r5}\n\t"
  51603. "ldr r2, [%[a]]\n\t"
  51604. "ldr r3, [%[a], #4]\n\t"
  51605. #ifdef WOLFSSL_KEIL
  51606. "sbcs r2, r2, r4\n\t"
  51607. #elif defined(__clang__)
  51608. "sbcs r2, r4\n\t"
  51609. #else
  51610. "sbc r2, r4\n\t"
  51611. #endif
  51612. #ifdef WOLFSSL_KEIL
  51613. "sbcs r3, r3, r5\n\t"
  51614. #elif defined(__clang__)
  51615. "sbcs r3, r5\n\t"
  51616. #else
  51617. "sbc r3, r5\n\t"
  51618. #endif
  51619. "stm %[a]!, {r2, r3}\n\t"
  51620. "ldm %[b]!, {r4, r5}\n\t"
  51621. "ldr r2, [%[a]]\n\t"
  51622. "ldr r3, [%[a], #4]\n\t"
  51623. #ifdef WOLFSSL_KEIL
  51624. "sbcs r2, r2, r4\n\t"
  51625. #elif defined(__clang__)
  51626. "sbcs r2, r4\n\t"
  51627. #else
  51628. "sbc r2, r4\n\t"
  51629. #endif
  51630. #ifdef WOLFSSL_KEIL
  51631. "sbcs r3, r3, r5\n\t"
  51632. #elif defined(__clang__)
  51633. "sbcs r3, r5\n\t"
  51634. #else
  51635. "sbc r3, r5\n\t"
  51636. #endif
  51637. "stm %[a]!, {r2, r3}\n\t"
  51638. "ldm %[b]!, {r4, r5}\n\t"
  51639. "ldr r2, [%[a]]\n\t"
  51640. "ldr r3, [%[a], #4]\n\t"
  51641. #ifdef WOLFSSL_KEIL
  51642. "sbcs r2, r2, r4\n\t"
  51643. #elif defined(__clang__)
  51644. "sbcs r2, r4\n\t"
  51645. #else
  51646. "sbc r2, r4\n\t"
  51647. #endif
  51648. #ifdef WOLFSSL_KEIL
  51649. "sbcs r3, r3, r5\n\t"
  51650. #elif defined(__clang__)
  51651. "sbcs r3, r5\n\t"
  51652. #else
  51653. "sbc r3, r5\n\t"
  51654. #endif
  51655. "stm %[a]!, {r2, r3}\n\t"
  51656. "ldm %[b]!, {r4, r5}\n\t"
  51657. "ldr r2, [%[a]]\n\t"
  51658. "ldr r3, [%[a], #4]\n\t"
  51659. #ifdef WOLFSSL_KEIL
  51660. "sbcs r2, r2, r4\n\t"
  51661. #elif defined(__clang__)
  51662. "sbcs r2, r4\n\t"
  51663. #else
  51664. "sbc r2, r4\n\t"
  51665. #endif
  51666. #ifdef WOLFSSL_KEIL
  51667. "sbcs r3, r3, r5\n\t"
  51668. #elif defined(__clang__)
  51669. "sbcs r3, r5\n\t"
  51670. #else
  51671. "sbc r3, r5\n\t"
  51672. #endif
  51673. "stm %[a]!, {r2, r3}\n\t"
  51674. "ldm %[b]!, {r4, r5}\n\t"
  51675. "ldr r2, [%[a]]\n\t"
  51676. "ldr r3, [%[a], #4]\n\t"
  51677. #ifdef WOLFSSL_KEIL
  51678. "sbcs r2, r2, r4\n\t"
  51679. #elif defined(__clang__)
  51680. "sbcs r2, r4\n\t"
  51681. #else
  51682. "sbc r2, r4\n\t"
  51683. #endif
  51684. #ifdef WOLFSSL_KEIL
  51685. "sbcs r3, r3, r5\n\t"
  51686. #elif defined(__clang__)
  51687. "sbcs r3, r5\n\t"
  51688. #else
  51689. "sbc r3, r5\n\t"
  51690. #endif
  51691. "stm %[a]!, {r2, r3}\n\t"
  51692. "ldm %[b]!, {r4, r5}\n\t"
  51693. "ldr r2, [%[a]]\n\t"
  51694. "ldr r3, [%[a], #4]\n\t"
  51695. #ifdef WOLFSSL_KEIL
  51696. "sbcs r2, r2, r4\n\t"
  51697. #elif defined(__clang__)
  51698. "sbcs r2, r4\n\t"
  51699. #else
  51700. "sbc r2, r4\n\t"
  51701. #endif
  51702. #ifdef WOLFSSL_KEIL
  51703. "sbcs r3, r3, r5\n\t"
  51704. #elif defined(__clang__)
  51705. "sbcs r3, r5\n\t"
  51706. #else
  51707. "sbc r3, r5\n\t"
  51708. #endif
  51709. "stm %[a]!, {r2, r3}\n\t"
  51710. "ldm %[b]!, {r4, r5}\n\t"
  51711. "ldr r2, [%[a]]\n\t"
  51712. "ldr r3, [%[a], #4]\n\t"
  51713. #ifdef WOLFSSL_KEIL
  51714. "sbcs r2, r2, r4\n\t"
  51715. #elif defined(__clang__)
  51716. "sbcs r2, r4\n\t"
  51717. #else
  51718. "sbc r2, r4\n\t"
  51719. #endif
  51720. #ifdef WOLFSSL_KEIL
  51721. "sbcs r3, r3, r5\n\t"
  51722. #elif defined(__clang__)
  51723. "sbcs r3, r5\n\t"
  51724. #else
  51725. "sbc r3, r5\n\t"
  51726. #endif
  51727. "stm %[a]!, {r2, r3}\n\t"
  51728. "ldm %[b]!, {r4, r5}\n\t"
  51729. "ldr r2, [%[a]]\n\t"
  51730. "ldr r3, [%[a], #4]\n\t"
  51731. #ifdef WOLFSSL_KEIL
  51732. "sbcs r2, r2, r4\n\t"
  51733. #elif defined(__clang__)
  51734. "sbcs r2, r4\n\t"
  51735. #else
  51736. "sbc r2, r4\n\t"
  51737. #endif
  51738. #ifdef WOLFSSL_KEIL
  51739. "sbcs r3, r3, r5\n\t"
  51740. #elif defined(__clang__)
  51741. "sbcs r3, r5\n\t"
  51742. #else
  51743. "sbc r3, r5\n\t"
  51744. #endif
  51745. "stm %[a]!, {r2, r3}\n\t"
  51746. "ldm %[b]!, {r4, r5}\n\t"
  51747. "ldr r2, [%[a]]\n\t"
  51748. "ldr r3, [%[a], #4]\n\t"
  51749. #ifdef WOLFSSL_KEIL
  51750. "sbcs r2, r2, r4\n\t"
  51751. #elif defined(__clang__)
  51752. "sbcs r2, r4\n\t"
  51753. #else
  51754. "sbc r2, r4\n\t"
  51755. #endif
  51756. #ifdef WOLFSSL_KEIL
  51757. "sbcs r3, r3, r5\n\t"
  51758. #elif defined(__clang__)
  51759. "sbcs r3, r5\n\t"
  51760. #else
  51761. "sbc r3, r5\n\t"
  51762. #endif
  51763. "stm %[a]!, {r2, r3}\n\t"
  51764. "ldm %[b]!, {r4, r5}\n\t"
  51765. "ldr r2, [%[a]]\n\t"
  51766. "ldr r3, [%[a], #4]\n\t"
  51767. #ifdef WOLFSSL_KEIL
  51768. "sbcs r2, r2, r4\n\t"
  51769. #elif defined(__clang__)
  51770. "sbcs r2, r4\n\t"
  51771. #else
  51772. "sbc r2, r4\n\t"
  51773. #endif
  51774. #ifdef WOLFSSL_KEIL
  51775. "sbcs r3, r3, r5\n\t"
  51776. #elif defined(__clang__)
  51777. "sbcs r3, r5\n\t"
  51778. #else
  51779. "sbc r3, r5\n\t"
  51780. #endif
  51781. "stm %[a]!, {r2, r3}\n\t"
  51782. "ldm %[b]!, {r4, r5}\n\t"
  51783. "ldr r2, [%[a]]\n\t"
  51784. "ldr r3, [%[a], #4]\n\t"
  51785. #ifdef WOLFSSL_KEIL
  51786. "sbcs r2, r2, r4\n\t"
  51787. #elif defined(__clang__)
  51788. "sbcs r2, r4\n\t"
  51789. #else
  51790. "sbc r2, r4\n\t"
  51791. #endif
  51792. #ifdef WOLFSSL_KEIL
  51793. "sbcs r3, r3, r5\n\t"
  51794. #elif defined(__clang__)
  51795. "sbcs r3, r5\n\t"
  51796. #else
  51797. "sbc r3, r5\n\t"
  51798. #endif
  51799. "stm %[a]!, {r2, r3}\n\t"
  51800. "ldm %[b]!, {r4, r5}\n\t"
  51801. "ldr r2, [%[a]]\n\t"
  51802. "ldr r3, [%[a], #4]\n\t"
  51803. #ifdef WOLFSSL_KEIL
  51804. "sbcs r2, r2, r4\n\t"
  51805. #elif defined(__clang__)
  51806. "sbcs r2, r4\n\t"
  51807. #else
  51808. "sbc r2, r4\n\t"
  51809. #endif
  51810. #ifdef WOLFSSL_KEIL
  51811. "sbcs r3, r3, r5\n\t"
  51812. #elif defined(__clang__)
  51813. "sbcs r3, r5\n\t"
  51814. #else
  51815. "sbc r3, r5\n\t"
  51816. #endif
  51817. "stm %[a]!, {r2, r3}\n\t"
  51818. "ldm %[b]!, {r4, r5}\n\t"
  51819. "ldr r2, [%[a]]\n\t"
  51820. "ldr r3, [%[a], #4]\n\t"
  51821. #ifdef WOLFSSL_KEIL
  51822. "sbcs r2, r2, r4\n\t"
  51823. #elif defined(__clang__)
  51824. "sbcs r2, r4\n\t"
  51825. #else
  51826. "sbc r2, r4\n\t"
  51827. #endif
  51828. #ifdef WOLFSSL_KEIL
  51829. "sbcs r3, r3, r5\n\t"
  51830. #elif defined(__clang__)
  51831. "sbcs r3, r5\n\t"
  51832. #else
  51833. "sbc r3, r5\n\t"
  51834. #endif
  51835. "stm %[a]!, {r2, r3}\n\t"
  51836. "ldm %[b]!, {r4, r5}\n\t"
  51837. "ldr r2, [%[a]]\n\t"
  51838. "ldr r3, [%[a], #4]\n\t"
  51839. #ifdef WOLFSSL_KEIL
  51840. "sbcs r2, r2, r4\n\t"
  51841. #elif defined(__clang__)
  51842. "sbcs r2, r4\n\t"
  51843. #else
  51844. "sbc r2, r4\n\t"
  51845. #endif
  51846. #ifdef WOLFSSL_KEIL
  51847. "sbcs r3, r3, r5\n\t"
  51848. #elif defined(__clang__)
  51849. "sbcs r3, r5\n\t"
  51850. #else
  51851. "sbc r3, r5\n\t"
  51852. #endif
  51853. "stm %[a]!, {r2, r3}\n\t"
  51854. "ldm %[b]!, {r4, r5}\n\t"
  51855. "ldr r2, [%[a]]\n\t"
  51856. "ldr r3, [%[a], #4]\n\t"
  51857. #ifdef WOLFSSL_KEIL
  51858. "sbcs r2, r2, r4\n\t"
  51859. #elif defined(__clang__)
  51860. "sbcs r2, r4\n\t"
  51861. #else
  51862. "sbc r2, r4\n\t"
  51863. #endif
  51864. #ifdef WOLFSSL_KEIL
  51865. "sbcs r3, r3, r5\n\t"
  51866. #elif defined(__clang__)
  51867. "sbcs r3, r5\n\t"
  51868. #else
  51869. "sbc r3, r5\n\t"
  51870. #endif
  51871. "stm %[a]!, {r2, r3}\n\t"
  51872. "ldm %[b]!, {r4, r5}\n\t"
  51873. "ldr r2, [%[a]]\n\t"
  51874. "ldr r3, [%[a], #4]\n\t"
  51875. #ifdef WOLFSSL_KEIL
  51876. "sbcs r2, r2, r4\n\t"
  51877. #elif defined(__clang__)
  51878. "sbcs r2, r4\n\t"
  51879. #else
  51880. "sbc r2, r4\n\t"
  51881. #endif
  51882. #ifdef WOLFSSL_KEIL
  51883. "sbcs r3, r3, r5\n\t"
  51884. #elif defined(__clang__)
  51885. "sbcs r3, r5\n\t"
  51886. #else
  51887. "sbc r3, r5\n\t"
  51888. #endif
  51889. "stm %[a]!, {r2, r3}\n\t"
  51890. "ldm %[b]!, {r4, r5}\n\t"
  51891. "ldr r2, [%[a]]\n\t"
  51892. "ldr r3, [%[a], #4]\n\t"
  51893. #ifdef WOLFSSL_KEIL
  51894. "sbcs r2, r2, r4\n\t"
  51895. #elif defined(__clang__)
  51896. "sbcs r2, r4\n\t"
  51897. #else
  51898. "sbc r2, r4\n\t"
  51899. #endif
  51900. #ifdef WOLFSSL_KEIL
  51901. "sbcs r3, r3, r5\n\t"
  51902. #elif defined(__clang__)
  51903. "sbcs r3, r5\n\t"
  51904. #else
  51905. "sbc r3, r5\n\t"
  51906. #endif
  51907. "stm %[a]!, {r2, r3}\n\t"
  51908. "ldm %[b]!, {r4, r5}\n\t"
  51909. "ldr r2, [%[a]]\n\t"
  51910. "ldr r3, [%[a], #4]\n\t"
  51911. #ifdef WOLFSSL_KEIL
  51912. "sbcs r2, r2, r4\n\t"
  51913. #elif defined(__clang__)
  51914. "sbcs r2, r4\n\t"
  51915. #else
  51916. "sbc r2, r4\n\t"
  51917. #endif
  51918. #ifdef WOLFSSL_KEIL
  51919. "sbcs r3, r3, r5\n\t"
  51920. #elif defined(__clang__)
  51921. "sbcs r3, r5\n\t"
  51922. #else
  51923. "sbc r3, r5\n\t"
  51924. #endif
  51925. "stm %[a]!, {r2, r3}\n\t"
  51926. "ldm %[b]!, {r4, r5}\n\t"
  51927. "ldr r2, [%[a]]\n\t"
  51928. "ldr r3, [%[a], #4]\n\t"
  51929. #ifdef WOLFSSL_KEIL
  51930. "sbcs r2, r2, r4\n\t"
  51931. #elif defined(__clang__)
  51932. "sbcs r2, r4\n\t"
  51933. #else
  51934. "sbc r2, r4\n\t"
  51935. #endif
  51936. #ifdef WOLFSSL_KEIL
  51937. "sbcs r3, r3, r5\n\t"
  51938. #elif defined(__clang__)
  51939. "sbcs r3, r5\n\t"
  51940. #else
  51941. "sbc r3, r5\n\t"
  51942. #endif
  51943. "stm %[a]!, {r2, r3}\n\t"
  51944. "ldm %[b]!, {r4, r5}\n\t"
  51945. "ldr r2, [%[a]]\n\t"
  51946. "ldr r3, [%[a], #4]\n\t"
  51947. #ifdef WOLFSSL_KEIL
  51948. "sbcs r2, r2, r4\n\t"
  51949. #elif defined(__clang__)
  51950. "sbcs r2, r4\n\t"
  51951. #else
  51952. "sbc r2, r4\n\t"
  51953. #endif
  51954. #ifdef WOLFSSL_KEIL
  51955. "sbcs r3, r3, r5\n\t"
  51956. #elif defined(__clang__)
  51957. "sbcs r3, r5\n\t"
  51958. #else
  51959. "sbc r3, r5\n\t"
  51960. #endif
  51961. "stm %[a]!, {r2, r3}\n\t"
  51962. #ifdef WOLFSSL_KEIL
  51963. "sbcs %[a], %[a], %[a]\n\t"
  51964. #elif defined(__clang__)
  51965. "sbcs %[a], %[a]\n\t"
  51966. #else
  51967. "sbc %[a], %[a]\n\t"
  51968. #endif
  51969. : [a] "+l" (a), [b] "+l" (b)
  51970. :
  51971. : "memory", "r2", "r3", "r4", "r5"
  51972. );
  51973. return (uint32_t)(size_t)a;
  51974. }
  51975. /* Add b to a into r. (r = a + b)
  51976. *
  51977. * r A single precision integer.
  51978. * a A single precision integer.
  51979. * b A single precision integer.
  51980. */
  51981. SP_NOINLINE static sp_digit sp_3072_add_48(sp_digit* r, const sp_digit* a,
  51982. const sp_digit* b)
  51983. {
  51984. __asm__ __volatile__ (
  51985. "ldm %[b]!, {r5, r6}\n\t"
  51986. "ldm %[a]!, {r3, r4}\n\t"
  51987. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51988. "adds r3, r3, r5\n\t"
  51989. #else
  51990. "add r3, r3, r5\n\t"
  51991. #endif
  51992. #ifdef WOLFSSL_KEIL
  51993. "adcs r4, r4, r6\n\t"
  51994. #elif defined(__clang__)
  51995. "adcs r4, r6\n\t"
  51996. #else
  51997. "adc r4, r6\n\t"
  51998. #endif
  51999. "stm %[r]!, {r3, r4}\n\t"
  52000. "ldm %[b]!, {r5, r6}\n\t"
  52001. "ldm %[a]!, {r3, r4}\n\t"
  52002. #ifdef WOLFSSL_KEIL
  52003. "adcs r3, r3, r5\n\t"
  52004. #elif defined(__clang__)
  52005. "adcs r3, r5\n\t"
  52006. #else
  52007. "adc r3, r5\n\t"
  52008. #endif
  52009. #ifdef WOLFSSL_KEIL
  52010. "adcs r4, r4, r6\n\t"
  52011. #elif defined(__clang__)
  52012. "adcs r4, r6\n\t"
  52013. #else
  52014. "adc r4, r6\n\t"
  52015. #endif
  52016. "stm %[r]!, {r3, r4}\n\t"
  52017. "ldm %[b]!, {r5, r6}\n\t"
  52018. "ldm %[a]!, {r3, r4}\n\t"
  52019. #ifdef WOLFSSL_KEIL
  52020. "adcs r3, r3, r5\n\t"
  52021. #elif defined(__clang__)
  52022. "adcs r3, r5\n\t"
  52023. #else
  52024. "adc r3, r5\n\t"
  52025. #endif
  52026. #ifdef WOLFSSL_KEIL
  52027. "adcs r4, r4, r6\n\t"
  52028. #elif defined(__clang__)
  52029. "adcs r4, r6\n\t"
  52030. #else
  52031. "adc r4, r6\n\t"
  52032. #endif
  52033. "stm %[r]!, {r3, r4}\n\t"
  52034. "ldm %[b]!, {r5, r6}\n\t"
  52035. "ldm %[a]!, {r3, r4}\n\t"
  52036. #ifdef WOLFSSL_KEIL
  52037. "adcs r3, r3, r5\n\t"
  52038. #elif defined(__clang__)
  52039. "adcs r3, r5\n\t"
  52040. #else
  52041. "adc r3, r5\n\t"
  52042. #endif
  52043. #ifdef WOLFSSL_KEIL
  52044. "adcs r4, r4, r6\n\t"
  52045. #elif defined(__clang__)
  52046. "adcs r4, r6\n\t"
  52047. #else
  52048. "adc r4, r6\n\t"
  52049. #endif
  52050. "stm %[r]!, {r3, r4}\n\t"
  52051. "ldm %[b]!, {r5, r6}\n\t"
  52052. "ldm %[a]!, {r3, r4}\n\t"
  52053. #ifdef WOLFSSL_KEIL
  52054. "adcs r3, r3, r5\n\t"
  52055. #elif defined(__clang__)
  52056. "adcs r3, r5\n\t"
  52057. #else
  52058. "adc r3, r5\n\t"
  52059. #endif
  52060. #ifdef WOLFSSL_KEIL
  52061. "adcs r4, r4, r6\n\t"
  52062. #elif defined(__clang__)
  52063. "adcs r4, r6\n\t"
  52064. #else
  52065. "adc r4, r6\n\t"
  52066. #endif
  52067. "stm %[r]!, {r3, r4}\n\t"
  52068. "ldm %[b]!, {r5, r6}\n\t"
  52069. "ldm %[a]!, {r3, r4}\n\t"
  52070. #ifdef WOLFSSL_KEIL
  52071. "adcs r3, r3, r5\n\t"
  52072. #elif defined(__clang__)
  52073. "adcs r3, r5\n\t"
  52074. #else
  52075. "adc r3, r5\n\t"
  52076. #endif
  52077. #ifdef WOLFSSL_KEIL
  52078. "adcs r4, r4, r6\n\t"
  52079. #elif defined(__clang__)
  52080. "adcs r4, r6\n\t"
  52081. #else
  52082. "adc r4, r6\n\t"
  52083. #endif
  52084. "stm %[r]!, {r3, r4}\n\t"
  52085. "ldm %[b]!, {r5, r6}\n\t"
  52086. "ldm %[a]!, {r3, r4}\n\t"
  52087. #ifdef WOLFSSL_KEIL
  52088. "adcs r3, r3, r5\n\t"
  52089. #elif defined(__clang__)
  52090. "adcs r3, r5\n\t"
  52091. #else
  52092. "adc r3, r5\n\t"
  52093. #endif
  52094. #ifdef WOLFSSL_KEIL
  52095. "adcs r4, r4, r6\n\t"
  52096. #elif defined(__clang__)
  52097. "adcs r4, r6\n\t"
  52098. #else
  52099. "adc r4, r6\n\t"
  52100. #endif
  52101. "stm %[r]!, {r3, r4}\n\t"
  52102. "ldm %[b]!, {r5, r6}\n\t"
  52103. "ldm %[a]!, {r3, r4}\n\t"
  52104. #ifdef WOLFSSL_KEIL
  52105. "adcs r3, r3, r5\n\t"
  52106. #elif defined(__clang__)
  52107. "adcs r3, r5\n\t"
  52108. #else
  52109. "adc r3, r5\n\t"
  52110. #endif
  52111. #ifdef WOLFSSL_KEIL
  52112. "adcs r4, r4, r6\n\t"
  52113. #elif defined(__clang__)
  52114. "adcs r4, r6\n\t"
  52115. #else
  52116. "adc r4, r6\n\t"
  52117. #endif
  52118. "stm %[r]!, {r3, r4}\n\t"
  52119. "ldm %[b]!, {r5, r6}\n\t"
  52120. "ldm %[a]!, {r3, r4}\n\t"
  52121. #ifdef WOLFSSL_KEIL
  52122. "adcs r3, r3, r5\n\t"
  52123. #elif defined(__clang__)
  52124. "adcs r3, r5\n\t"
  52125. #else
  52126. "adc r3, r5\n\t"
  52127. #endif
  52128. #ifdef WOLFSSL_KEIL
  52129. "adcs r4, r4, r6\n\t"
  52130. #elif defined(__clang__)
  52131. "adcs r4, r6\n\t"
  52132. #else
  52133. "adc r4, r6\n\t"
  52134. #endif
  52135. "stm %[r]!, {r3, r4}\n\t"
  52136. "ldm %[b]!, {r5, r6}\n\t"
  52137. "ldm %[a]!, {r3, r4}\n\t"
  52138. #ifdef WOLFSSL_KEIL
  52139. "adcs r3, r3, r5\n\t"
  52140. #elif defined(__clang__)
  52141. "adcs r3, r5\n\t"
  52142. #else
  52143. "adc r3, r5\n\t"
  52144. #endif
  52145. #ifdef WOLFSSL_KEIL
  52146. "adcs r4, r4, r6\n\t"
  52147. #elif defined(__clang__)
  52148. "adcs r4, r6\n\t"
  52149. #else
  52150. "adc r4, r6\n\t"
  52151. #endif
  52152. "stm %[r]!, {r3, r4}\n\t"
  52153. "ldm %[b]!, {r5, r6}\n\t"
  52154. "ldm %[a]!, {r3, r4}\n\t"
  52155. #ifdef WOLFSSL_KEIL
  52156. "adcs r3, r3, r5\n\t"
  52157. #elif defined(__clang__)
  52158. "adcs r3, r5\n\t"
  52159. #else
  52160. "adc r3, r5\n\t"
  52161. #endif
  52162. #ifdef WOLFSSL_KEIL
  52163. "adcs r4, r4, r6\n\t"
  52164. #elif defined(__clang__)
  52165. "adcs r4, r6\n\t"
  52166. #else
  52167. "adc r4, r6\n\t"
  52168. #endif
  52169. "stm %[r]!, {r3, r4}\n\t"
  52170. "ldm %[b]!, {r5, r6}\n\t"
  52171. "ldm %[a]!, {r3, r4}\n\t"
  52172. #ifdef WOLFSSL_KEIL
  52173. "adcs r3, r3, r5\n\t"
  52174. #elif defined(__clang__)
  52175. "adcs r3, r5\n\t"
  52176. #else
  52177. "adc r3, r5\n\t"
  52178. #endif
  52179. #ifdef WOLFSSL_KEIL
  52180. "adcs r4, r4, r6\n\t"
  52181. #elif defined(__clang__)
  52182. "adcs r4, r6\n\t"
  52183. #else
  52184. "adc r4, r6\n\t"
  52185. #endif
  52186. "stm %[r]!, {r3, r4}\n\t"
  52187. "ldm %[b]!, {r5, r6}\n\t"
  52188. "ldm %[a]!, {r3, r4}\n\t"
  52189. #ifdef WOLFSSL_KEIL
  52190. "adcs r3, r3, r5\n\t"
  52191. #elif defined(__clang__)
  52192. "adcs r3, r5\n\t"
  52193. #else
  52194. "adc r3, r5\n\t"
  52195. #endif
  52196. #ifdef WOLFSSL_KEIL
  52197. "adcs r4, r4, r6\n\t"
  52198. #elif defined(__clang__)
  52199. "adcs r4, r6\n\t"
  52200. #else
  52201. "adc r4, r6\n\t"
  52202. #endif
  52203. "stm %[r]!, {r3, r4}\n\t"
  52204. "ldm %[b]!, {r5, r6}\n\t"
  52205. "ldm %[a]!, {r3, r4}\n\t"
  52206. #ifdef WOLFSSL_KEIL
  52207. "adcs r3, r3, r5\n\t"
  52208. #elif defined(__clang__)
  52209. "adcs r3, r5\n\t"
  52210. #else
  52211. "adc r3, r5\n\t"
  52212. #endif
  52213. #ifdef WOLFSSL_KEIL
  52214. "adcs r4, r4, r6\n\t"
  52215. #elif defined(__clang__)
  52216. "adcs r4, r6\n\t"
  52217. #else
  52218. "adc r4, r6\n\t"
  52219. #endif
  52220. "stm %[r]!, {r3, r4}\n\t"
  52221. "ldm %[b]!, {r5, r6}\n\t"
  52222. "ldm %[a]!, {r3, r4}\n\t"
  52223. #ifdef WOLFSSL_KEIL
  52224. "adcs r3, r3, r5\n\t"
  52225. #elif defined(__clang__)
  52226. "adcs r3, r5\n\t"
  52227. #else
  52228. "adc r3, r5\n\t"
  52229. #endif
  52230. #ifdef WOLFSSL_KEIL
  52231. "adcs r4, r4, r6\n\t"
  52232. #elif defined(__clang__)
  52233. "adcs r4, r6\n\t"
  52234. #else
  52235. "adc r4, r6\n\t"
  52236. #endif
  52237. "stm %[r]!, {r3, r4}\n\t"
  52238. "ldm %[b]!, {r5, r6}\n\t"
  52239. "ldm %[a]!, {r3, r4}\n\t"
  52240. #ifdef WOLFSSL_KEIL
  52241. "adcs r3, r3, r5\n\t"
  52242. #elif defined(__clang__)
  52243. "adcs r3, r5\n\t"
  52244. #else
  52245. "adc r3, r5\n\t"
  52246. #endif
  52247. #ifdef WOLFSSL_KEIL
  52248. "adcs r4, r4, r6\n\t"
  52249. #elif defined(__clang__)
  52250. "adcs r4, r6\n\t"
  52251. #else
  52252. "adc r4, r6\n\t"
  52253. #endif
  52254. "stm %[r]!, {r3, r4}\n\t"
  52255. "ldm %[b]!, {r5, r6}\n\t"
  52256. "ldm %[a]!, {r3, r4}\n\t"
  52257. #ifdef WOLFSSL_KEIL
  52258. "adcs r3, r3, r5\n\t"
  52259. #elif defined(__clang__)
  52260. "adcs r3, r5\n\t"
  52261. #else
  52262. "adc r3, r5\n\t"
  52263. #endif
  52264. #ifdef WOLFSSL_KEIL
  52265. "adcs r4, r4, r6\n\t"
  52266. #elif defined(__clang__)
  52267. "adcs r4, r6\n\t"
  52268. #else
  52269. "adc r4, r6\n\t"
  52270. #endif
  52271. "stm %[r]!, {r3, r4}\n\t"
  52272. "ldm %[b]!, {r5, r6}\n\t"
  52273. "ldm %[a]!, {r3, r4}\n\t"
  52274. #ifdef WOLFSSL_KEIL
  52275. "adcs r3, r3, r5\n\t"
  52276. #elif defined(__clang__)
  52277. "adcs r3, r5\n\t"
  52278. #else
  52279. "adc r3, r5\n\t"
  52280. #endif
  52281. #ifdef WOLFSSL_KEIL
  52282. "adcs r4, r4, r6\n\t"
  52283. #elif defined(__clang__)
  52284. "adcs r4, r6\n\t"
  52285. #else
  52286. "adc r4, r6\n\t"
  52287. #endif
  52288. "stm %[r]!, {r3, r4}\n\t"
  52289. "ldm %[b]!, {r5, r6}\n\t"
  52290. "ldm %[a]!, {r3, r4}\n\t"
  52291. #ifdef WOLFSSL_KEIL
  52292. "adcs r3, r3, r5\n\t"
  52293. #elif defined(__clang__)
  52294. "adcs r3, r5\n\t"
  52295. #else
  52296. "adc r3, r5\n\t"
  52297. #endif
  52298. #ifdef WOLFSSL_KEIL
  52299. "adcs r4, r4, r6\n\t"
  52300. #elif defined(__clang__)
  52301. "adcs r4, r6\n\t"
  52302. #else
  52303. "adc r4, r6\n\t"
  52304. #endif
  52305. "stm %[r]!, {r3, r4}\n\t"
  52306. "ldm %[b]!, {r5, r6}\n\t"
  52307. "ldm %[a]!, {r3, r4}\n\t"
  52308. #ifdef WOLFSSL_KEIL
  52309. "adcs r3, r3, r5\n\t"
  52310. #elif defined(__clang__)
  52311. "adcs r3, r5\n\t"
  52312. #else
  52313. "adc r3, r5\n\t"
  52314. #endif
  52315. #ifdef WOLFSSL_KEIL
  52316. "adcs r4, r4, r6\n\t"
  52317. #elif defined(__clang__)
  52318. "adcs r4, r6\n\t"
  52319. #else
  52320. "adc r4, r6\n\t"
  52321. #endif
  52322. "stm %[r]!, {r3, r4}\n\t"
  52323. "ldm %[b]!, {r5, r6}\n\t"
  52324. "ldm %[a]!, {r3, r4}\n\t"
  52325. #ifdef WOLFSSL_KEIL
  52326. "adcs r3, r3, r5\n\t"
  52327. #elif defined(__clang__)
  52328. "adcs r3, r5\n\t"
  52329. #else
  52330. "adc r3, r5\n\t"
  52331. #endif
  52332. #ifdef WOLFSSL_KEIL
  52333. "adcs r4, r4, r6\n\t"
  52334. #elif defined(__clang__)
  52335. "adcs r4, r6\n\t"
  52336. #else
  52337. "adc r4, r6\n\t"
  52338. #endif
  52339. "stm %[r]!, {r3, r4}\n\t"
  52340. "ldm %[b]!, {r5, r6}\n\t"
  52341. "ldm %[a]!, {r3, r4}\n\t"
  52342. #ifdef WOLFSSL_KEIL
  52343. "adcs r3, r3, r5\n\t"
  52344. #elif defined(__clang__)
  52345. "adcs r3, r5\n\t"
  52346. #else
  52347. "adc r3, r5\n\t"
  52348. #endif
  52349. #ifdef WOLFSSL_KEIL
  52350. "adcs r4, r4, r6\n\t"
  52351. #elif defined(__clang__)
  52352. "adcs r4, r6\n\t"
  52353. #else
  52354. "adc r4, r6\n\t"
  52355. #endif
  52356. "stm %[r]!, {r3, r4}\n\t"
  52357. "ldm %[b]!, {r5, r6}\n\t"
  52358. "ldm %[a]!, {r3, r4}\n\t"
  52359. #ifdef WOLFSSL_KEIL
  52360. "adcs r3, r3, r5\n\t"
  52361. #elif defined(__clang__)
  52362. "adcs r3, r5\n\t"
  52363. #else
  52364. "adc r3, r5\n\t"
  52365. #endif
  52366. #ifdef WOLFSSL_KEIL
  52367. "adcs r4, r4, r6\n\t"
  52368. #elif defined(__clang__)
  52369. "adcs r4, r6\n\t"
  52370. #else
  52371. "adc r4, r6\n\t"
  52372. #endif
  52373. "stm %[r]!, {r3, r4}\n\t"
  52374. "ldm %[b]!, {r5, r6}\n\t"
  52375. "ldm %[a]!, {r3, r4}\n\t"
  52376. #ifdef WOLFSSL_KEIL
  52377. "adcs r3, r3, r5\n\t"
  52378. #elif defined(__clang__)
  52379. "adcs r3, r5\n\t"
  52380. #else
  52381. "adc r3, r5\n\t"
  52382. #endif
  52383. #ifdef WOLFSSL_KEIL
  52384. "adcs r4, r4, r6\n\t"
  52385. #elif defined(__clang__)
  52386. "adcs r4, r6\n\t"
  52387. #else
  52388. "adc r4, r6\n\t"
  52389. #endif
  52390. "stm %[r]!, {r3, r4}\n\t"
  52391. "movs %[r], #0\n\t"
  52392. #ifdef WOLFSSL_KEIL
  52393. "adcs %[r], %[r], %[r]\n\t"
  52394. #elif defined(__clang__)
  52395. "adcs %[r], %[r]\n\t"
  52396. #else
  52397. "adc %[r], %[r]\n\t"
  52398. #endif
  52399. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  52400. :
  52401. : "memory", "r3", "r4", "r5", "r6"
  52402. );
  52403. return (uint32_t)(size_t)r;
  52404. }
  52405. /* AND m into each word of a and store in r.
  52406. *
  52407. * r A single precision integer.
  52408. * a A single precision integer.
  52409. * m Mask to AND against each digit.
  52410. */
  52411. static void sp_3072_mask_24(sp_digit* r, const sp_digit* a, sp_digit m)
  52412. {
  52413. #ifdef WOLFSSL_SP_SMALL
  52414. int i;
  52415. for (i=0; i<24; i++) {
  52416. r[i] = a[i] & m;
  52417. }
  52418. #else
  52419. int i;
  52420. for (i = 0; i < 24; i += 8) {
  52421. r[i+0] = a[i+0] & m;
  52422. r[i+1] = a[i+1] & m;
  52423. r[i+2] = a[i+2] & m;
  52424. r[i+3] = a[i+3] & m;
  52425. r[i+4] = a[i+4] & m;
  52426. r[i+5] = a[i+5] & m;
  52427. r[i+6] = a[i+6] & m;
  52428. r[i+7] = a[i+7] & m;
  52429. }
  52430. #endif
  52431. }
  52432. /* Multiply a and b into r. (r = a * b)
  52433. *
  52434. * r A single precision integer.
  52435. * a A single precision integer.
  52436. * b A single precision integer.
  52437. */
  52438. SP_NOINLINE static void sp_3072_mul_48(sp_digit* r, const sp_digit* a,
  52439. const sp_digit* b)
  52440. {
  52441. sp_digit* z0 = r;
  52442. sp_digit z1[48];
  52443. sp_digit a1[24];
  52444. sp_digit b1[24];
  52445. sp_digit* z2 = r + 48;
  52446. sp_digit u;
  52447. sp_digit ca;
  52448. sp_digit cb;
  52449. ca = sp_3072_add_24(a1, a, &a[24]);
  52450. cb = sp_3072_add_24(b1, b, &b[24]);
  52451. u = ca & cb;
  52452. sp_3072_mul_24(z2, &a[24], &b[24]);
  52453. sp_3072_mul_24(z0, a, b);
  52454. sp_3072_mul_24(z1, a1, b1);
  52455. u += sp_3072_sub_in_place_48(z1, z0);
  52456. u += sp_3072_sub_in_place_48(z1, z2);
  52457. sp_3072_mask_24(a1, a1, 0 - cb);
  52458. u += sp_3072_add_24(z1 + 24, z1 + 24, a1);
  52459. sp_3072_mask_24(b1, b1, 0 - ca);
  52460. u += sp_3072_add_24(z1 + 24, z1 + 24, b1);
  52461. u += sp_3072_add_48(r + 24, r + 24, z1);
  52462. (void)sp_3072_add_word_24(r + 72, r + 72, u);
  52463. }
  52464. /* Add b to a into r. (r = a + b)
  52465. *
  52466. * r A single precision integer.
  52467. * a A single precision integer.
  52468. * b A single precision integer.
  52469. */
  52470. SP_NOINLINE static sp_digit sp_3072_add_word_48(sp_digit* r, const sp_digit* a,
  52471. sp_digit b)
  52472. {
  52473. __asm__ __volatile__ (
  52474. "movs r5, #0\n\t"
  52475. "ldm %[a]!, {r3, r4}\n\t"
  52476. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52477. "adds r3, r3, %[b]\n\t"
  52478. #else
  52479. "add r3, r3, %[b]\n\t"
  52480. #endif
  52481. #ifdef WOLFSSL_KEIL
  52482. "adcs r4, r4, r5\n\t"
  52483. #elif defined(__clang__)
  52484. "adcs r4, r5\n\t"
  52485. #else
  52486. "adc r4, r5\n\t"
  52487. #endif
  52488. "stm %[r]!, {r3, r4}\n\t"
  52489. "ldm %[a]!, {r3, r4}\n\t"
  52490. #ifdef WOLFSSL_KEIL
  52491. "adcs r3, r3, r5\n\t"
  52492. #elif defined(__clang__)
  52493. "adcs r3, r5\n\t"
  52494. #else
  52495. "adc r3, r5\n\t"
  52496. #endif
  52497. #ifdef WOLFSSL_KEIL
  52498. "adcs r4, r4, r5\n\t"
  52499. #elif defined(__clang__)
  52500. "adcs r4, r5\n\t"
  52501. #else
  52502. "adc r4, r5\n\t"
  52503. #endif
  52504. "stm %[r]!, {r3, r4}\n\t"
  52505. "ldm %[a]!, {r3, r4}\n\t"
  52506. #ifdef WOLFSSL_KEIL
  52507. "adcs r3, r3, r5\n\t"
  52508. #elif defined(__clang__)
  52509. "adcs r3, r5\n\t"
  52510. #else
  52511. "adc r3, r5\n\t"
  52512. #endif
  52513. #ifdef WOLFSSL_KEIL
  52514. "adcs r4, r4, r5\n\t"
  52515. #elif defined(__clang__)
  52516. "adcs r4, r5\n\t"
  52517. #else
  52518. "adc r4, r5\n\t"
  52519. #endif
  52520. "stm %[r]!, {r3, r4}\n\t"
  52521. "ldm %[a]!, {r3, r4}\n\t"
  52522. #ifdef WOLFSSL_KEIL
  52523. "adcs r3, r3, r5\n\t"
  52524. #elif defined(__clang__)
  52525. "adcs r3, r5\n\t"
  52526. #else
  52527. "adc r3, r5\n\t"
  52528. #endif
  52529. #ifdef WOLFSSL_KEIL
  52530. "adcs r4, r4, r5\n\t"
  52531. #elif defined(__clang__)
  52532. "adcs r4, r5\n\t"
  52533. #else
  52534. "adc r4, r5\n\t"
  52535. #endif
  52536. "stm %[r]!, {r3, r4}\n\t"
  52537. "ldm %[a]!, {r3, r4}\n\t"
  52538. #ifdef WOLFSSL_KEIL
  52539. "adcs r3, r3, r5\n\t"
  52540. #elif defined(__clang__)
  52541. "adcs r3, r5\n\t"
  52542. #else
  52543. "adc r3, r5\n\t"
  52544. #endif
  52545. #ifdef WOLFSSL_KEIL
  52546. "adcs r4, r4, r5\n\t"
  52547. #elif defined(__clang__)
  52548. "adcs r4, r5\n\t"
  52549. #else
  52550. "adc r4, r5\n\t"
  52551. #endif
  52552. "stm %[r]!, {r3, r4}\n\t"
  52553. "ldm %[a]!, {r3, r4}\n\t"
  52554. #ifdef WOLFSSL_KEIL
  52555. "adcs r3, r3, r5\n\t"
  52556. #elif defined(__clang__)
  52557. "adcs r3, r5\n\t"
  52558. #else
  52559. "adc r3, r5\n\t"
  52560. #endif
  52561. #ifdef WOLFSSL_KEIL
  52562. "adcs r4, r4, r5\n\t"
  52563. #elif defined(__clang__)
  52564. "adcs r4, r5\n\t"
  52565. #else
  52566. "adc r4, r5\n\t"
  52567. #endif
  52568. "stm %[r]!, {r3, r4}\n\t"
  52569. "ldm %[a]!, {r3, r4}\n\t"
  52570. #ifdef WOLFSSL_KEIL
  52571. "adcs r3, r3, r5\n\t"
  52572. #elif defined(__clang__)
  52573. "adcs r3, r5\n\t"
  52574. #else
  52575. "adc r3, r5\n\t"
  52576. #endif
  52577. #ifdef WOLFSSL_KEIL
  52578. "adcs r4, r4, r5\n\t"
  52579. #elif defined(__clang__)
  52580. "adcs r4, r5\n\t"
  52581. #else
  52582. "adc r4, r5\n\t"
  52583. #endif
  52584. "stm %[r]!, {r3, r4}\n\t"
  52585. "ldm %[a]!, {r3, r4}\n\t"
  52586. #ifdef WOLFSSL_KEIL
  52587. "adcs r3, r3, r5\n\t"
  52588. #elif defined(__clang__)
  52589. "adcs r3, r5\n\t"
  52590. #else
  52591. "adc r3, r5\n\t"
  52592. #endif
  52593. #ifdef WOLFSSL_KEIL
  52594. "adcs r4, r4, r5\n\t"
  52595. #elif defined(__clang__)
  52596. "adcs r4, r5\n\t"
  52597. #else
  52598. "adc r4, r5\n\t"
  52599. #endif
  52600. "stm %[r]!, {r3, r4}\n\t"
  52601. "ldm %[a]!, {r3, r4}\n\t"
  52602. #ifdef WOLFSSL_KEIL
  52603. "adcs r3, r3, r5\n\t"
  52604. #elif defined(__clang__)
  52605. "adcs r3, r5\n\t"
  52606. #else
  52607. "adc r3, r5\n\t"
  52608. #endif
  52609. #ifdef WOLFSSL_KEIL
  52610. "adcs r4, r4, r5\n\t"
  52611. #elif defined(__clang__)
  52612. "adcs r4, r5\n\t"
  52613. #else
  52614. "adc r4, r5\n\t"
  52615. #endif
  52616. "stm %[r]!, {r3, r4}\n\t"
  52617. "ldm %[a]!, {r3, r4}\n\t"
  52618. #ifdef WOLFSSL_KEIL
  52619. "adcs r3, r3, r5\n\t"
  52620. #elif defined(__clang__)
  52621. "adcs r3, r5\n\t"
  52622. #else
  52623. "adc r3, r5\n\t"
  52624. #endif
  52625. #ifdef WOLFSSL_KEIL
  52626. "adcs r4, r4, r5\n\t"
  52627. #elif defined(__clang__)
  52628. "adcs r4, r5\n\t"
  52629. #else
  52630. "adc r4, r5\n\t"
  52631. #endif
  52632. "stm %[r]!, {r3, r4}\n\t"
  52633. "ldm %[a]!, {r3, r4}\n\t"
  52634. #ifdef WOLFSSL_KEIL
  52635. "adcs r3, r3, r5\n\t"
  52636. #elif defined(__clang__)
  52637. "adcs r3, r5\n\t"
  52638. #else
  52639. "adc r3, r5\n\t"
  52640. #endif
  52641. #ifdef WOLFSSL_KEIL
  52642. "adcs r4, r4, r5\n\t"
  52643. #elif defined(__clang__)
  52644. "adcs r4, r5\n\t"
  52645. #else
  52646. "adc r4, r5\n\t"
  52647. #endif
  52648. "stm %[r]!, {r3, r4}\n\t"
  52649. "ldm %[a]!, {r3, r4}\n\t"
  52650. #ifdef WOLFSSL_KEIL
  52651. "adcs r3, r3, r5\n\t"
  52652. #elif defined(__clang__)
  52653. "adcs r3, r5\n\t"
  52654. #else
  52655. "adc r3, r5\n\t"
  52656. #endif
  52657. #ifdef WOLFSSL_KEIL
  52658. "adcs r4, r4, r5\n\t"
  52659. #elif defined(__clang__)
  52660. "adcs r4, r5\n\t"
  52661. #else
  52662. "adc r4, r5\n\t"
  52663. #endif
  52664. "stm %[r]!, {r3, r4}\n\t"
  52665. "ldm %[a]!, {r3, r4}\n\t"
  52666. #ifdef WOLFSSL_KEIL
  52667. "adcs r3, r3, r5\n\t"
  52668. #elif defined(__clang__)
  52669. "adcs r3, r5\n\t"
  52670. #else
  52671. "adc r3, r5\n\t"
  52672. #endif
  52673. #ifdef WOLFSSL_KEIL
  52674. "adcs r4, r4, r5\n\t"
  52675. #elif defined(__clang__)
  52676. "adcs r4, r5\n\t"
  52677. #else
  52678. "adc r4, r5\n\t"
  52679. #endif
  52680. "stm %[r]!, {r3, r4}\n\t"
  52681. "ldm %[a]!, {r3, r4}\n\t"
  52682. #ifdef WOLFSSL_KEIL
  52683. "adcs r3, r3, r5\n\t"
  52684. #elif defined(__clang__)
  52685. "adcs r3, r5\n\t"
  52686. #else
  52687. "adc r3, r5\n\t"
  52688. #endif
  52689. #ifdef WOLFSSL_KEIL
  52690. "adcs r4, r4, r5\n\t"
  52691. #elif defined(__clang__)
  52692. "adcs r4, r5\n\t"
  52693. #else
  52694. "adc r4, r5\n\t"
  52695. #endif
  52696. "stm %[r]!, {r3, r4}\n\t"
  52697. "ldm %[a]!, {r3, r4}\n\t"
  52698. #ifdef WOLFSSL_KEIL
  52699. "adcs r3, r3, r5\n\t"
  52700. #elif defined(__clang__)
  52701. "adcs r3, r5\n\t"
  52702. #else
  52703. "adc r3, r5\n\t"
  52704. #endif
  52705. #ifdef WOLFSSL_KEIL
  52706. "adcs r4, r4, r5\n\t"
  52707. #elif defined(__clang__)
  52708. "adcs r4, r5\n\t"
  52709. #else
  52710. "adc r4, r5\n\t"
  52711. #endif
  52712. "stm %[r]!, {r3, r4}\n\t"
  52713. "ldm %[a]!, {r3, r4}\n\t"
  52714. #ifdef WOLFSSL_KEIL
  52715. "adcs r3, r3, r5\n\t"
  52716. #elif defined(__clang__)
  52717. "adcs r3, r5\n\t"
  52718. #else
  52719. "adc r3, r5\n\t"
  52720. #endif
  52721. #ifdef WOLFSSL_KEIL
  52722. "adcs r4, r4, r5\n\t"
  52723. #elif defined(__clang__)
  52724. "adcs r4, r5\n\t"
  52725. #else
  52726. "adc r4, r5\n\t"
  52727. #endif
  52728. "stm %[r]!, {r3, r4}\n\t"
  52729. "ldm %[a]!, {r3, r4}\n\t"
  52730. #ifdef WOLFSSL_KEIL
  52731. "adcs r3, r3, r5\n\t"
  52732. #elif defined(__clang__)
  52733. "adcs r3, r5\n\t"
  52734. #else
  52735. "adc r3, r5\n\t"
  52736. #endif
  52737. #ifdef WOLFSSL_KEIL
  52738. "adcs r4, r4, r5\n\t"
  52739. #elif defined(__clang__)
  52740. "adcs r4, r5\n\t"
  52741. #else
  52742. "adc r4, r5\n\t"
  52743. #endif
  52744. "stm %[r]!, {r3, r4}\n\t"
  52745. "ldm %[a]!, {r3, r4}\n\t"
  52746. #ifdef WOLFSSL_KEIL
  52747. "adcs r3, r3, r5\n\t"
  52748. #elif defined(__clang__)
  52749. "adcs r3, r5\n\t"
  52750. #else
  52751. "adc r3, r5\n\t"
  52752. #endif
  52753. #ifdef WOLFSSL_KEIL
  52754. "adcs r4, r4, r5\n\t"
  52755. #elif defined(__clang__)
  52756. "adcs r4, r5\n\t"
  52757. #else
  52758. "adc r4, r5\n\t"
  52759. #endif
  52760. "stm %[r]!, {r3, r4}\n\t"
  52761. "ldm %[a]!, {r3, r4}\n\t"
  52762. #ifdef WOLFSSL_KEIL
  52763. "adcs r3, r3, r5\n\t"
  52764. #elif defined(__clang__)
  52765. "adcs r3, r5\n\t"
  52766. #else
  52767. "adc r3, r5\n\t"
  52768. #endif
  52769. #ifdef WOLFSSL_KEIL
  52770. "adcs r4, r4, r5\n\t"
  52771. #elif defined(__clang__)
  52772. "adcs r4, r5\n\t"
  52773. #else
  52774. "adc r4, r5\n\t"
  52775. #endif
  52776. "stm %[r]!, {r3, r4}\n\t"
  52777. "ldm %[a]!, {r3, r4}\n\t"
  52778. #ifdef WOLFSSL_KEIL
  52779. "adcs r3, r3, r5\n\t"
  52780. #elif defined(__clang__)
  52781. "adcs r3, r5\n\t"
  52782. #else
  52783. "adc r3, r5\n\t"
  52784. #endif
  52785. #ifdef WOLFSSL_KEIL
  52786. "adcs r4, r4, r5\n\t"
  52787. #elif defined(__clang__)
  52788. "adcs r4, r5\n\t"
  52789. #else
  52790. "adc r4, r5\n\t"
  52791. #endif
  52792. "stm %[r]!, {r3, r4}\n\t"
  52793. "ldm %[a]!, {r3, r4}\n\t"
  52794. #ifdef WOLFSSL_KEIL
  52795. "adcs r3, r3, r5\n\t"
  52796. #elif defined(__clang__)
  52797. "adcs r3, r5\n\t"
  52798. #else
  52799. "adc r3, r5\n\t"
  52800. #endif
  52801. #ifdef WOLFSSL_KEIL
  52802. "adcs r4, r4, r5\n\t"
  52803. #elif defined(__clang__)
  52804. "adcs r4, r5\n\t"
  52805. #else
  52806. "adc r4, r5\n\t"
  52807. #endif
  52808. "stm %[r]!, {r3, r4}\n\t"
  52809. "ldm %[a]!, {r3, r4}\n\t"
  52810. #ifdef WOLFSSL_KEIL
  52811. "adcs r3, r3, r5\n\t"
  52812. #elif defined(__clang__)
  52813. "adcs r3, r5\n\t"
  52814. #else
  52815. "adc r3, r5\n\t"
  52816. #endif
  52817. #ifdef WOLFSSL_KEIL
  52818. "adcs r4, r4, r5\n\t"
  52819. #elif defined(__clang__)
  52820. "adcs r4, r5\n\t"
  52821. #else
  52822. "adc r4, r5\n\t"
  52823. #endif
  52824. "stm %[r]!, {r3, r4}\n\t"
  52825. "ldm %[a]!, {r3, r4}\n\t"
  52826. #ifdef WOLFSSL_KEIL
  52827. "adcs r3, r3, r5\n\t"
  52828. #elif defined(__clang__)
  52829. "adcs r3, r5\n\t"
  52830. #else
  52831. "adc r3, r5\n\t"
  52832. #endif
  52833. #ifdef WOLFSSL_KEIL
  52834. "adcs r4, r4, r5\n\t"
  52835. #elif defined(__clang__)
  52836. "adcs r4, r5\n\t"
  52837. #else
  52838. "adc r4, r5\n\t"
  52839. #endif
  52840. "stm %[r]!, {r3, r4}\n\t"
  52841. "ldm %[a]!, {r3, r4}\n\t"
  52842. #ifdef WOLFSSL_KEIL
  52843. "adcs r3, r3, r5\n\t"
  52844. #elif defined(__clang__)
  52845. "adcs r3, r5\n\t"
  52846. #else
  52847. "adc r3, r5\n\t"
  52848. #endif
  52849. #ifdef WOLFSSL_KEIL
  52850. "adcs r4, r4, r5\n\t"
  52851. #elif defined(__clang__)
  52852. "adcs r4, r5\n\t"
  52853. #else
  52854. "adc r4, r5\n\t"
  52855. #endif
  52856. "stm %[r]!, {r3, r4}\n\t"
  52857. "movs %[r], #0\n\t"
  52858. #ifdef WOLFSSL_KEIL
  52859. "adcs %[r], %[r], %[r]\n\t"
  52860. #elif defined(__clang__)
  52861. "adcs %[r], %[r]\n\t"
  52862. #else
  52863. "adc %[r], %[r]\n\t"
  52864. #endif
  52865. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  52866. :
  52867. : "memory", "r3", "r4", "r5"
  52868. );
  52869. return (uint32_t)(size_t)r;
  52870. }
  52871. /* Sub b from a into a. (a -= b)
  52872. *
  52873. * a A single precision integer.
  52874. * b A single precision integer.
  52875. */
  52876. SP_NOINLINE static sp_digit sp_3072_sub_in_place_96(sp_digit* a,
  52877. const sp_digit* b)
  52878. {
  52879. __asm__ __volatile__ (
  52880. "ldm %[b]!, {r4, r5}\n\t"
  52881. "ldr r2, [%[a]]\n\t"
  52882. "ldr r3, [%[a], #4]\n\t"
  52883. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52884. "subs r2, r2, r4\n\t"
  52885. #else
  52886. "sub r2, r2, r4\n\t"
  52887. #endif
  52888. #ifdef WOLFSSL_KEIL
  52889. "sbcs r3, r3, r5\n\t"
  52890. #elif defined(__clang__)
  52891. "sbcs r3, r5\n\t"
  52892. #else
  52893. "sbc r3, r5\n\t"
  52894. #endif
  52895. "stm %[a]!, {r2, r3}\n\t"
  52896. "ldm %[b]!, {r4, r5}\n\t"
  52897. "ldr r2, [%[a]]\n\t"
  52898. "ldr r3, [%[a], #4]\n\t"
  52899. #ifdef WOLFSSL_KEIL
  52900. "sbcs r2, r2, r4\n\t"
  52901. #elif defined(__clang__)
  52902. "sbcs r2, r4\n\t"
  52903. #else
  52904. "sbc r2, r4\n\t"
  52905. #endif
  52906. #ifdef WOLFSSL_KEIL
  52907. "sbcs r3, r3, r5\n\t"
  52908. #elif defined(__clang__)
  52909. "sbcs r3, r5\n\t"
  52910. #else
  52911. "sbc r3, r5\n\t"
  52912. #endif
  52913. "stm %[a]!, {r2, r3}\n\t"
  52914. "ldm %[b]!, {r4, r5}\n\t"
  52915. "ldr r2, [%[a]]\n\t"
  52916. "ldr r3, [%[a], #4]\n\t"
  52917. #ifdef WOLFSSL_KEIL
  52918. "sbcs r2, r2, r4\n\t"
  52919. #elif defined(__clang__)
  52920. "sbcs r2, r4\n\t"
  52921. #else
  52922. "sbc r2, r4\n\t"
  52923. #endif
  52924. #ifdef WOLFSSL_KEIL
  52925. "sbcs r3, r3, r5\n\t"
  52926. #elif defined(__clang__)
  52927. "sbcs r3, r5\n\t"
  52928. #else
  52929. "sbc r3, r5\n\t"
  52930. #endif
  52931. "stm %[a]!, {r2, r3}\n\t"
  52932. "ldm %[b]!, {r4, r5}\n\t"
  52933. "ldr r2, [%[a]]\n\t"
  52934. "ldr r3, [%[a], #4]\n\t"
  52935. #ifdef WOLFSSL_KEIL
  52936. "sbcs r2, r2, r4\n\t"
  52937. #elif defined(__clang__)
  52938. "sbcs r2, r4\n\t"
  52939. #else
  52940. "sbc r2, r4\n\t"
  52941. #endif
  52942. #ifdef WOLFSSL_KEIL
  52943. "sbcs r3, r3, r5\n\t"
  52944. #elif defined(__clang__)
  52945. "sbcs r3, r5\n\t"
  52946. #else
  52947. "sbc r3, r5\n\t"
  52948. #endif
  52949. "stm %[a]!, {r2, r3}\n\t"
  52950. "ldm %[b]!, {r4, r5}\n\t"
  52951. "ldr r2, [%[a]]\n\t"
  52952. "ldr r3, [%[a], #4]\n\t"
  52953. #ifdef WOLFSSL_KEIL
  52954. "sbcs r2, r2, r4\n\t"
  52955. #elif defined(__clang__)
  52956. "sbcs r2, r4\n\t"
  52957. #else
  52958. "sbc r2, r4\n\t"
  52959. #endif
  52960. #ifdef WOLFSSL_KEIL
  52961. "sbcs r3, r3, r5\n\t"
  52962. #elif defined(__clang__)
  52963. "sbcs r3, r5\n\t"
  52964. #else
  52965. "sbc r3, r5\n\t"
  52966. #endif
  52967. "stm %[a]!, {r2, r3}\n\t"
  52968. "ldm %[b]!, {r4, r5}\n\t"
  52969. "ldr r2, [%[a]]\n\t"
  52970. "ldr r3, [%[a], #4]\n\t"
  52971. #ifdef WOLFSSL_KEIL
  52972. "sbcs r2, r2, r4\n\t"
  52973. #elif defined(__clang__)
  52974. "sbcs r2, r4\n\t"
  52975. #else
  52976. "sbc r2, r4\n\t"
  52977. #endif
  52978. #ifdef WOLFSSL_KEIL
  52979. "sbcs r3, r3, r5\n\t"
  52980. #elif defined(__clang__)
  52981. "sbcs r3, r5\n\t"
  52982. #else
  52983. "sbc r3, r5\n\t"
  52984. #endif
  52985. "stm %[a]!, {r2, r3}\n\t"
  52986. "ldm %[b]!, {r4, r5}\n\t"
  52987. "ldr r2, [%[a]]\n\t"
  52988. "ldr r3, [%[a], #4]\n\t"
  52989. #ifdef WOLFSSL_KEIL
  52990. "sbcs r2, r2, r4\n\t"
  52991. #elif defined(__clang__)
  52992. "sbcs r2, r4\n\t"
  52993. #else
  52994. "sbc r2, r4\n\t"
  52995. #endif
  52996. #ifdef WOLFSSL_KEIL
  52997. "sbcs r3, r3, r5\n\t"
  52998. #elif defined(__clang__)
  52999. "sbcs r3, r5\n\t"
  53000. #else
  53001. "sbc r3, r5\n\t"
  53002. #endif
  53003. "stm %[a]!, {r2, r3}\n\t"
  53004. "ldm %[b]!, {r4, r5}\n\t"
  53005. "ldr r2, [%[a]]\n\t"
  53006. "ldr r3, [%[a], #4]\n\t"
  53007. #ifdef WOLFSSL_KEIL
  53008. "sbcs r2, r2, r4\n\t"
  53009. #elif defined(__clang__)
  53010. "sbcs r2, r4\n\t"
  53011. #else
  53012. "sbc r2, r4\n\t"
  53013. #endif
  53014. #ifdef WOLFSSL_KEIL
  53015. "sbcs r3, r3, r5\n\t"
  53016. #elif defined(__clang__)
  53017. "sbcs r3, r5\n\t"
  53018. #else
  53019. "sbc r3, r5\n\t"
  53020. #endif
  53021. "stm %[a]!, {r2, r3}\n\t"
  53022. "ldm %[b]!, {r4, r5}\n\t"
  53023. "ldr r2, [%[a]]\n\t"
  53024. "ldr r3, [%[a], #4]\n\t"
  53025. #ifdef WOLFSSL_KEIL
  53026. "sbcs r2, r2, r4\n\t"
  53027. #elif defined(__clang__)
  53028. "sbcs r2, r4\n\t"
  53029. #else
  53030. "sbc r2, r4\n\t"
  53031. #endif
  53032. #ifdef WOLFSSL_KEIL
  53033. "sbcs r3, r3, r5\n\t"
  53034. #elif defined(__clang__)
  53035. "sbcs r3, r5\n\t"
  53036. #else
  53037. "sbc r3, r5\n\t"
  53038. #endif
  53039. "stm %[a]!, {r2, r3}\n\t"
  53040. "ldm %[b]!, {r4, r5}\n\t"
  53041. "ldr r2, [%[a]]\n\t"
  53042. "ldr r3, [%[a], #4]\n\t"
  53043. #ifdef WOLFSSL_KEIL
  53044. "sbcs r2, r2, r4\n\t"
  53045. #elif defined(__clang__)
  53046. "sbcs r2, r4\n\t"
  53047. #else
  53048. "sbc r2, r4\n\t"
  53049. #endif
  53050. #ifdef WOLFSSL_KEIL
  53051. "sbcs r3, r3, r5\n\t"
  53052. #elif defined(__clang__)
  53053. "sbcs r3, r5\n\t"
  53054. #else
  53055. "sbc r3, r5\n\t"
  53056. #endif
  53057. "stm %[a]!, {r2, r3}\n\t"
  53058. "ldm %[b]!, {r4, r5}\n\t"
  53059. "ldr r2, [%[a]]\n\t"
  53060. "ldr r3, [%[a], #4]\n\t"
  53061. #ifdef WOLFSSL_KEIL
  53062. "sbcs r2, r2, r4\n\t"
  53063. #elif defined(__clang__)
  53064. "sbcs r2, r4\n\t"
  53065. #else
  53066. "sbc r2, r4\n\t"
  53067. #endif
  53068. #ifdef WOLFSSL_KEIL
  53069. "sbcs r3, r3, r5\n\t"
  53070. #elif defined(__clang__)
  53071. "sbcs r3, r5\n\t"
  53072. #else
  53073. "sbc r3, r5\n\t"
  53074. #endif
  53075. "stm %[a]!, {r2, r3}\n\t"
  53076. "ldm %[b]!, {r4, r5}\n\t"
  53077. "ldr r2, [%[a]]\n\t"
  53078. "ldr r3, [%[a], #4]\n\t"
  53079. #ifdef WOLFSSL_KEIL
  53080. "sbcs r2, r2, r4\n\t"
  53081. #elif defined(__clang__)
  53082. "sbcs r2, r4\n\t"
  53083. #else
  53084. "sbc r2, r4\n\t"
  53085. #endif
  53086. #ifdef WOLFSSL_KEIL
  53087. "sbcs r3, r3, r5\n\t"
  53088. #elif defined(__clang__)
  53089. "sbcs r3, r5\n\t"
  53090. #else
  53091. "sbc r3, r5\n\t"
  53092. #endif
  53093. "stm %[a]!, {r2, r3}\n\t"
  53094. "ldm %[b]!, {r4, r5}\n\t"
  53095. "ldr r2, [%[a]]\n\t"
  53096. "ldr r3, [%[a], #4]\n\t"
  53097. #ifdef WOLFSSL_KEIL
  53098. "sbcs r2, r2, r4\n\t"
  53099. #elif defined(__clang__)
  53100. "sbcs r2, r4\n\t"
  53101. #else
  53102. "sbc r2, r4\n\t"
  53103. #endif
  53104. #ifdef WOLFSSL_KEIL
  53105. "sbcs r3, r3, r5\n\t"
  53106. #elif defined(__clang__)
  53107. "sbcs r3, r5\n\t"
  53108. #else
  53109. "sbc r3, r5\n\t"
  53110. #endif
  53111. "stm %[a]!, {r2, r3}\n\t"
  53112. "ldm %[b]!, {r4, r5}\n\t"
  53113. "ldr r2, [%[a]]\n\t"
  53114. "ldr r3, [%[a], #4]\n\t"
  53115. #ifdef WOLFSSL_KEIL
  53116. "sbcs r2, r2, r4\n\t"
  53117. #elif defined(__clang__)
  53118. "sbcs r2, r4\n\t"
  53119. #else
  53120. "sbc r2, r4\n\t"
  53121. #endif
  53122. #ifdef WOLFSSL_KEIL
  53123. "sbcs r3, r3, r5\n\t"
  53124. #elif defined(__clang__)
  53125. "sbcs r3, r5\n\t"
  53126. #else
  53127. "sbc r3, r5\n\t"
  53128. #endif
  53129. "stm %[a]!, {r2, r3}\n\t"
  53130. "ldm %[b]!, {r4, r5}\n\t"
  53131. "ldr r2, [%[a]]\n\t"
  53132. "ldr r3, [%[a], #4]\n\t"
  53133. #ifdef WOLFSSL_KEIL
  53134. "sbcs r2, r2, r4\n\t"
  53135. #elif defined(__clang__)
  53136. "sbcs r2, r4\n\t"
  53137. #else
  53138. "sbc r2, r4\n\t"
  53139. #endif
  53140. #ifdef WOLFSSL_KEIL
  53141. "sbcs r3, r3, r5\n\t"
  53142. #elif defined(__clang__)
  53143. "sbcs r3, r5\n\t"
  53144. #else
  53145. "sbc r3, r5\n\t"
  53146. #endif
  53147. "stm %[a]!, {r2, r3}\n\t"
  53148. "ldm %[b]!, {r4, r5}\n\t"
  53149. "ldr r2, [%[a]]\n\t"
  53150. "ldr r3, [%[a], #4]\n\t"
  53151. #ifdef WOLFSSL_KEIL
  53152. "sbcs r2, r2, r4\n\t"
  53153. #elif defined(__clang__)
  53154. "sbcs r2, r4\n\t"
  53155. #else
  53156. "sbc r2, r4\n\t"
  53157. #endif
  53158. #ifdef WOLFSSL_KEIL
  53159. "sbcs r3, r3, r5\n\t"
  53160. #elif defined(__clang__)
  53161. "sbcs r3, r5\n\t"
  53162. #else
  53163. "sbc r3, r5\n\t"
  53164. #endif
  53165. "stm %[a]!, {r2, r3}\n\t"
  53166. "ldm %[b]!, {r4, r5}\n\t"
  53167. "ldr r2, [%[a]]\n\t"
  53168. "ldr r3, [%[a], #4]\n\t"
  53169. #ifdef WOLFSSL_KEIL
  53170. "sbcs r2, r2, r4\n\t"
  53171. #elif defined(__clang__)
  53172. "sbcs r2, r4\n\t"
  53173. #else
  53174. "sbc r2, r4\n\t"
  53175. #endif
  53176. #ifdef WOLFSSL_KEIL
  53177. "sbcs r3, r3, r5\n\t"
  53178. #elif defined(__clang__)
  53179. "sbcs r3, r5\n\t"
  53180. #else
  53181. "sbc r3, r5\n\t"
  53182. #endif
  53183. "stm %[a]!, {r2, r3}\n\t"
  53184. "ldm %[b]!, {r4, r5}\n\t"
  53185. "ldr r2, [%[a]]\n\t"
  53186. "ldr r3, [%[a], #4]\n\t"
  53187. #ifdef WOLFSSL_KEIL
  53188. "sbcs r2, r2, r4\n\t"
  53189. #elif defined(__clang__)
  53190. "sbcs r2, r4\n\t"
  53191. #else
  53192. "sbc r2, r4\n\t"
  53193. #endif
  53194. #ifdef WOLFSSL_KEIL
  53195. "sbcs r3, r3, r5\n\t"
  53196. #elif defined(__clang__)
  53197. "sbcs r3, r5\n\t"
  53198. #else
  53199. "sbc r3, r5\n\t"
  53200. #endif
  53201. "stm %[a]!, {r2, r3}\n\t"
  53202. "ldm %[b]!, {r4, r5}\n\t"
  53203. "ldr r2, [%[a]]\n\t"
  53204. "ldr r3, [%[a], #4]\n\t"
  53205. #ifdef WOLFSSL_KEIL
  53206. "sbcs r2, r2, r4\n\t"
  53207. #elif defined(__clang__)
  53208. "sbcs r2, r4\n\t"
  53209. #else
  53210. "sbc r2, r4\n\t"
  53211. #endif
  53212. #ifdef WOLFSSL_KEIL
  53213. "sbcs r3, r3, r5\n\t"
  53214. #elif defined(__clang__)
  53215. "sbcs r3, r5\n\t"
  53216. #else
  53217. "sbc r3, r5\n\t"
  53218. #endif
  53219. "stm %[a]!, {r2, r3}\n\t"
  53220. "ldm %[b]!, {r4, r5}\n\t"
  53221. "ldr r2, [%[a]]\n\t"
  53222. "ldr r3, [%[a], #4]\n\t"
  53223. #ifdef WOLFSSL_KEIL
  53224. "sbcs r2, r2, r4\n\t"
  53225. #elif defined(__clang__)
  53226. "sbcs r2, r4\n\t"
  53227. #else
  53228. "sbc r2, r4\n\t"
  53229. #endif
  53230. #ifdef WOLFSSL_KEIL
  53231. "sbcs r3, r3, r5\n\t"
  53232. #elif defined(__clang__)
  53233. "sbcs r3, r5\n\t"
  53234. #else
  53235. "sbc r3, r5\n\t"
  53236. #endif
  53237. "stm %[a]!, {r2, r3}\n\t"
  53238. "ldm %[b]!, {r4, r5}\n\t"
  53239. "ldr r2, [%[a]]\n\t"
  53240. "ldr r3, [%[a], #4]\n\t"
  53241. #ifdef WOLFSSL_KEIL
  53242. "sbcs r2, r2, r4\n\t"
  53243. #elif defined(__clang__)
  53244. "sbcs r2, r4\n\t"
  53245. #else
  53246. "sbc r2, r4\n\t"
  53247. #endif
  53248. #ifdef WOLFSSL_KEIL
  53249. "sbcs r3, r3, r5\n\t"
  53250. #elif defined(__clang__)
  53251. "sbcs r3, r5\n\t"
  53252. #else
  53253. "sbc r3, r5\n\t"
  53254. #endif
  53255. "stm %[a]!, {r2, r3}\n\t"
  53256. "ldm %[b]!, {r4, r5}\n\t"
  53257. "ldr r2, [%[a]]\n\t"
  53258. "ldr r3, [%[a], #4]\n\t"
  53259. #ifdef WOLFSSL_KEIL
  53260. "sbcs r2, r2, r4\n\t"
  53261. #elif defined(__clang__)
  53262. "sbcs r2, r4\n\t"
  53263. #else
  53264. "sbc r2, r4\n\t"
  53265. #endif
  53266. #ifdef WOLFSSL_KEIL
  53267. "sbcs r3, r3, r5\n\t"
  53268. #elif defined(__clang__)
  53269. "sbcs r3, r5\n\t"
  53270. #else
  53271. "sbc r3, r5\n\t"
  53272. #endif
  53273. "stm %[a]!, {r2, r3}\n\t"
  53274. "ldm %[b]!, {r4, r5}\n\t"
  53275. "ldr r2, [%[a]]\n\t"
  53276. "ldr r3, [%[a], #4]\n\t"
  53277. #ifdef WOLFSSL_KEIL
  53278. "sbcs r2, r2, r4\n\t"
  53279. #elif defined(__clang__)
  53280. "sbcs r2, r4\n\t"
  53281. #else
  53282. "sbc r2, r4\n\t"
  53283. #endif
  53284. #ifdef WOLFSSL_KEIL
  53285. "sbcs r3, r3, r5\n\t"
  53286. #elif defined(__clang__)
  53287. "sbcs r3, r5\n\t"
  53288. #else
  53289. "sbc r3, r5\n\t"
  53290. #endif
  53291. "stm %[a]!, {r2, r3}\n\t"
  53292. "ldm %[b]!, {r4, r5}\n\t"
  53293. "ldr r2, [%[a]]\n\t"
  53294. "ldr r3, [%[a], #4]\n\t"
  53295. #ifdef WOLFSSL_KEIL
  53296. "sbcs r2, r2, r4\n\t"
  53297. #elif defined(__clang__)
  53298. "sbcs r2, r4\n\t"
  53299. #else
  53300. "sbc r2, r4\n\t"
  53301. #endif
  53302. #ifdef WOLFSSL_KEIL
  53303. "sbcs r3, r3, r5\n\t"
  53304. #elif defined(__clang__)
  53305. "sbcs r3, r5\n\t"
  53306. #else
  53307. "sbc r3, r5\n\t"
  53308. #endif
  53309. "stm %[a]!, {r2, r3}\n\t"
  53310. "ldm %[b]!, {r4, r5}\n\t"
  53311. "ldr r2, [%[a]]\n\t"
  53312. "ldr r3, [%[a], #4]\n\t"
  53313. #ifdef WOLFSSL_KEIL
  53314. "sbcs r2, r2, r4\n\t"
  53315. #elif defined(__clang__)
  53316. "sbcs r2, r4\n\t"
  53317. #else
  53318. "sbc r2, r4\n\t"
  53319. #endif
  53320. #ifdef WOLFSSL_KEIL
  53321. "sbcs r3, r3, r5\n\t"
  53322. #elif defined(__clang__)
  53323. "sbcs r3, r5\n\t"
  53324. #else
  53325. "sbc r3, r5\n\t"
  53326. #endif
  53327. "stm %[a]!, {r2, r3}\n\t"
  53328. "ldm %[b]!, {r4, r5}\n\t"
  53329. "ldr r2, [%[a]]\n\t"
  53330. "ldr r3, [%[a], #4]\n\t"
  53331. #ifdef WOLFSSL_KEIL
  53332. "sbcs r2, r2, r4\n\t"
  53333. #elif defined(__clang__)
  53334. "sbcs r2, r4\n\t"
  53335. #else
  53336. "sbc r2, r4\n\t"
  53337. #endif
  53338. #ifdef WOLFSSL_KEIL
  53339. "sbcs r3, r3, r5\n\t"
  53340. #elif defined(__clang__)
  53341. "sbcs r3, r5\n\t"
  53342. #else
  53343. "sbc r3, r5\n\t"
  53344. #endif
  53345. "stm %[a]!, {r2, r3}\n\t"
  53346. "ldm %[b]!, {r4, r5}\n\t"
  53347. "ldr r2, [%[a]]\n\t"
  53348. "ldr r3, [%[a], #4]\n\t"
  53349. #ifdef WOLFSSL_KEIL
  53350. "sbcs r2, r2, r4\n\t"
  53351. #elif defined(__clang__)
  53352. "sbcs r2, r4\n\t"
  53353. #else
  53354. "sbc r2, r4\n\t"
  53355. #endif
  53356. #ifdef WOLFSSL_KEIL
  53357. "sbcs r3, r3, r5\n\t"
  53358. #elif defined(__clang__)
  53359. "sbcs r3, r5\n\t"
  53360. #else
  53361. "sbc r3, r5\n\t"
  53362. #endif
  53363. "stm %[a]!, {r2, r3}\n\t"
  53364. "ldm %[b]!, {r4, r5}\n\t"
  53365. "ldr r2, [%[a]]\n\t"
  53366. "ldr r3, [%[a], #4]\n\t"
  53367. #ifdef WOLFSSL_KEIL
  53368. "sbcs r2, r2, r4\n\t"
  53369. #elif defined(__clang__)
  53370. "sbcs r2, r4\n\t"
  53371. #else
  53372. "sbc r2, r4\n\t"
  53373. #endif
  53374. #ifdef WOLFSSL_KEIL
  53375. "sbcs r3, r3, r5\n\t"
  53376. #elif defined(__clang__)
  53377. "sbcs r3, r5\n\t"
  53378. #else
  53379. "sbc r3, r5\n\t"
  53380. #endif
  53381. "stm %[a]!, {r2, r3}\n\t"
  53382. "ldm %[b]!, {r4, r5}\n\t"
  53383. "ldr r2, [%[a]]\n\t"
  53384. "ldr r3, [%[a], #4]\n\t"
  53385. #ifdef WOLFSSL_KEIL
  53386. "sbcs r2, r2, r4\n\t"
  53387. #elif defined(__clang__)
  53388. "sbcs r2, r4\n\t"
  53389. #else
  53390. "sbc r2, r4\n\t"
  53391. #endif
  53392. #ifdef WOLFSSL_KEIL
  53393. "sbcs r3, r3, r5\n\t"
  53394. #elif defined(__clang__)
  53395. "sbcs r3, r5\n\t"
  53396. #else
  53397. "sbc r3, r5\n\t"
  53398. #endif
  53399. "stm %[a]!, {r2, r3}\n\t"
  53400. "ldm %[b]!, {r4, r5}\n\t"
  53401. "ldr r2, [%[a]]\n\t"
  53402. "ldr r3, [%[a], #4]\n\t"
  53403. #ifdef WOLFSSL_KEIL
  53404. "sbcs r2, r2, r4\n\t"
  53405. #elif defined(__clang__)
  53406. "sbcs r2, r4\n\t"
  53407. #else
  53408. "sbc r2, r4\n\t"
  53409. #endif
  53410. #ifdef WOLFSSL_KEIL
  53411. "sbcs r3, r3, r5\n\t"
  53412. #elif defined(__clang__)
  53413. "sbcs r3, r5\n\t"
  53414. #else
  53415. "sbc r3, r5\n\t"
  53416. #endif
  53417. "stm %[a]!, {r2, r3}\n\t"
  53418. "ldm %[b]!, {r4, r5}\n\t"
  53419. "ldr r2, [%[a]]\n\t"
  53420. "ldr r3, [%[a], #4]\n\t"
  53421. #ifdef WOLFSSL_KEIL
  53422. "sbcs r2, r2, r4\n\t"
  53423. #elif defined(__clang__)
  53424. "sbcs r2, r4\n\t"
  53425. #else
  53426. "sbc r2, r4\n\t"
  53427. #endif
  53428. #ifdef WOLFSSL_KEIL
  53429. "sbcs r3, r3, r5\n\t"
  53430. #elif defined(__clang__)
  53431. "sbcs r3, r5\n\t"
  53432. #else
  53433. "sbc r3, r5\n\t"
  53434. #endif
  53435. "stm %[a]!, {r2, r3}\n\t"
  53436. "ldm %[b]!, {r4, r5}\n\t"
  53437. "ldr r2, [%[a]]\n\t"
  53438. "ldr r3, [%[a], #4]\n\t"
  53439. #ifdef WOLFSSL_KEIL
  53440. "sbcs r2, r2, r4\n\t"
  53441. #elif defined(__clang__)
  53442. "sbcs r2, r4\n\t"
  53443. #else
  53444. "sbc r2, r4\n\t"
  53445. #endif
  53446. #ifdef WOLFSSL_KEIL
  53447. "sbcs r3, r3, r5\n\t"
  53448. #elif defined(__clang__)
  53449. "sbcs r3, r5\n\t"
  53450. #else
  53451. "sbc r3, r5\n\t"
  53452. #endif
  53453. "stm %[a]!, {r2, r3}\n\t"
  53454. "ldm %[b]!, {r4, r5}\n\t"
  53455. "ldr r2, [%[a]]\n\t"
  53456. "ldr r3, [%[a], #4]\n\t"
  53457. #ifdef WOLFSSL_KEIL
  53458. "sbcs r2, r2, r4\n\t"
  53459. #elif defined(__clang__)
  53460. "sbcs r2, r4\n\t"
  53461. #else
  53462. "sbc r2, r4\n\t"
  53463. #endif
  53464. #ifdef WOLFSSL_KEIL
  53465. "sbcs r3, r3, r5\n\t"
  53466. #elif defined(__clang__)
  53467. "sbcs r3, r5\n\t"
  53468. #else
  53469. "sbc r3, r5\n\t"
  53470. #endif
  53471. "stm %[a]!, {r2, r3}\n\t"
  53472. "ldm %[b]!, {r4, r5}\n\t"
  53473. "ldr r2, [%[a]]\n\t"
  53474. "ldr r3, [%[a], #4]\n\t"
  53475. #ifdef WOLFSSL_KEIL
  53476. "sbcs r2, r2, r4\n\t"
  53477. #elif defined(__clang__)
  53478. "sbcs r2, r4\n\t"
  53479. #else
  53480. "sbc r2, r4\n\t"
  53481. #endif
  53482. #ifdef WOLFSSL_KEIL
  53483. "sbcs r3, r3, r5\n\t"
  53484. #elif defined(__clang__)
  53485. "sbcs r3, r5\n\t"
  53486. #else
  53487. "sbc r3, r5\n\t"
  53488. #endif
  53489. "stm %[a]!, {r2, r3}\n\t"
  53490. "ldm %[b]!, {r4, r5}\n\t"
  53491. "ldr r2, [%[a]]\n\t"
  53492. "ldr r3, [%[a], #4]\n\t"
  53493. #ifdef WOLFSSL_KEIL
  53494. "sbcs r2, r2, r4\n\t"
  53495. #elif defined(__clang__)
  53496. "sbcs r2, r4\n\t"
  53497. #else
  53498. "sbc r2, r4\n\t"
  53499. #endif
  53500. #ifdef WOLFSSL_KEIL
  53501. "sbcs r3, r3, r5\n\t"
  53502. #elif defined(__clang__)
  53503. "sbcs r3, r5\n\t"
  53504. #else
  53505. "sbc r3, r5\n\t"
  53506. #endif
  53507. "stm %[a]!, {r2, r3}\n\t"
  53508. "ldm %[b]!, {r4, r5}\n\t"
  53509. "ldr r2, [%[a]]\n\t"
  53510. "ldr r3, [%[a], #4]\n\t"
  53511. #ifdef WOLFSSL_KEIL
  53512. "sbcs r2, r2, r4\n\t"
  53513. #elif defined(__clang__)
  53514. "sbcs r2, r4\n\t"
  53515. #else
  53516. "sbc r2, r4\n\t"
  53517. #endif
  53518. #ifdef WOLFSSL_KEIL
  53519. "sbcs r3, r3, r5\n\t"
  53520. #elif defined(__clang__)
  53521. "sbcs r3, r5\n\t"
  53522. #else
  53523. "sbc r3, r5\n\t"
  53524. #endif
  53525. "stm %[a]!, {r2, r3}\n\t"
  53526. "ldm %[b]!, {r4, r5}\n\t"
  53527. "ldr r2, [%[a]]\n\t"
  53528. "ldr r3, [%[a], #4]\n\t"
  53529. #ifdef WOLFSSL_KEIL
  53530. "sbcs r2, r2, r4\n\t"
  53531. #elif defined(__clang__)
  53532. "sbcs r2, r4\n\t"
  53533. #else
  53534. "sbc r2, r4\n\t"
  53535. #endif
  53536. #ifdef WOLFSSL_KEIL
  53537. "sbcs r3, r3, r5\n\t"
  53538. #elif defined(__clang__)
  53539. "sbcs r3, r5\n\t"
  53540. #else
  53541. "sbc r3, r5\n\t"
  53542. #endif
  53543. "stm %[a]!, {r2, r3}\n\t"
  53544. "ldm %[b]!, {r4, r5}\n\t"
  53545. "ldr r2, [%[a]]\n\t"
  53546. "ldr r3, [%[a], #4]\n\t"
  53547. #ifdef WOLFSSL_KEIL
  53548. "sbcs r2, r2, r4\n\t"
  53549. #elif defined(__clang__)
  53550. "sbcs r2, r4\n\t"
  53551. #else
  53552. "sbc r2, r4\n\t"
  53553. #endif
  53554. #ifdef WOLFSSL_KEIL
  53555. "sbcs r3, r3, r5\n\t"
  53556. #elif defined(__clang__)
  53557. "sbcs r3, r5\n\t"
  53558. #else
  53559. "sbc r3, r5\n\t"
  53560. #endif
  53561. "stm %[a]!, {r2, r3}\n\t"
  53562. "ldm %[b]!, {r4, r5}\n\t"
  53563. "ldr r2, [%[a]]\n\t"
  53564. "ldr r3, [%[a], #4]\n\t"
  53565. #ifdef WOLFSSL_KEIL
  53566. "sbcs r2, r2, r4\n\t"
  53567. #elif defined(__clang__)
  53568. "sbcs r2, r4\n\t"
  53569. #else
  53570. "sbc r2, r4\n\t"
  53571. #endif
  53572. #ifdef WOLFSSL_KEIL
  53573. "sbcs r3, r3, r5\n\t"
  53574. #elif defined(__clang__)
  53575. "sbcs r3, r5\n\t"
  53576. #else
  53577. "sbc r3, r5\n\t"
  53578. #endif
  53579. "stm %[a]!, {r2, r3}\n\t"
  53580. "ldm %[b]!, {r4, r5}\n\t"
  53581. "ldr r2, [%[a]]\n\t"
  53582. "ldr r3, [%[a], #4]\n\t"
  53583. #ifdef WOLFSSL_KEIL
  53584. "sbcs r2, r2, r4\n\t"
  53585. #elif defined(__clang__)
  53586. "sbcs r2, r4\n\t"
  53587. #else
  53588. "sbc r2, r4\n\t"
  53589. #endif
  53590. #ifdef WOLFSSL_KEIL
  53591. "sbcs r3, r3, r5\n\t"
  53592. #elif defined(__clang__)
  53593. "sbcs r3, r5\n\t"
  53594. #else
  53595. "sbc r3, r5\n\t"
  53596. #endif
  53597. "stm %[a]!, {r2, r3}\n\t"
  53598. "ldm %[b]!, {r4, r5}\n\t"
  53599. "ldr r2, [%[a]]\n\t"
  53600. "ldr r3, [%[a], #4]\n\t"
  53601. #ifdef WOLFSSL_KEIL
  53602. "sbcs r2, r2, r4\n\t"
  53603. #elif defined(__clang__)
  53604. "sbcs r2, r4\n\t"
  53605. #else
  53606. "sbc r2, r4\n\t"
  53607. #endif
  53608. #ifdef WOLFSSL_KEIL
  53609. "sbcs r3, r3, r5\n\t"
  53610. #elif defined(__clang__)
  53611. "sbcs r3, r5\n\t"
  53612. #else
  53613. "sbc r3, r5\n\t"
  53614. #endif
  53615. "stm %[a]!, {r2, r3}\n\t"
  53616. "ldm %[b]!, {r4, r5}\n\t"
  53617. "ldr r2, [%[a]]\n\t"
  53618. "ldr r3, [%[a], #4]\n\t"
  53619. #ifdef WOLFSSL_KEIL
  53620. "sbcs r2, r2, r4\n\t"
  53621. #elif defined(__clang__)
  53622. "sbcs r2, r4\n\t"
  53623. #else
  53624. "sbc r2, r4\n\t"
  53625. #endif
  53626. #ifdef WOLFSSL_KEIL
  53627. "sbcs r3, r3, r5\n\t"
  53628. #elif defined(__clang__)
  53629. "sbcs r3, r5\n\t"
  53630. #else
  53631. "sbc r3, r5\n\t"
  53632. #endif
  53633. "stm %[a]!, {r2, r3}\n\t"
  53634. "ldm %[b]!, {r4, r5}\n\t"
  53635. "ldr r2, [%[a]]\n\t"
  53636. "ldr r3, [%[a], #4]\n\t"
  53637. #ifdef WOLFSSL_KEIL
  53638. "sbcs r2, r2, r4\n\t"
  53639. #elif defined(__clang__)
  53640. "sbcs r2, r4\n\t"
  53641. #else
  53642. "sbc r2, r4\n\t"
  53643. #endif
  53644. #ifdef WOLFSSL_KEIL
  53645. "sbcs r3, r3, r5\n\t"
  53646. #elif defined(__clang__)
  53647. "sbcs r3, r5\n\t"
  53648. #else
  53649. "sbc r3, r5\n\t"
  53650. #endif
  53651. "stm %[a]!, {r2, r3}\n\t"
  53652. "ldm %[b]!, {r4, r5}\n\t"
  53653. "ldr r2, [%[a]]\n\t"
  53654. "ldr r3, [%[a], #4]\n\t"
  53655. #ifdef WOLFSSL_KEIL
  53656. "sbcs r2, r2, r4\n\t"
  53657. #elif defined(__clang__)
  53658. "sbcs r2, r4\n\t"
  53659. #else
  53660. "sbc r2, r4\n\t"
  53661. #endif
  53662. #ifdef WOLFSSL_KEIL
  53663. "sbcs r3, r3, r5\n\t"
  53664. #elif defined(__clang__)
  53665. "sbcs r3, r5\n\t"
  53666. #else
  53667. "sbc r3, r5\n\t"
  53668. #endif
  53669. "stm %[a]!, {r2, r3}\n\t"
  53670. "ldm %[b]!, {r4, r5}\n\t"
  53671. "ldr r2, [%[a]]\n\t"
  53672. "ldr r3, [%[a], #4]\n\t"
  53673. #ifdef WOLFSSL_KEIL
  53674. "sbcs r2, r2, r4\n\t"
  53675. #elif defined(__clang__)
  53676. "sbcs r2, r4\n\t"
  53677. #else
  53678. "sbc r2, r4\n\t"
  53679. #endif
  53680. #ifdef WOLFSSL_KEIL
  53681. "sbcs r3, r3, r5\n\t"
  53682. #elif defined(__clang__)
  53683. "sbcs r3, r5\n\t"
  53684. #else
  53685. "sbc r3, r5\n\t"
  53686. #endif
  53687. "stm %[a]!, {r2, r3}\n\t"
  53688. "ldm %[b]!, {r4, r5}\n\t"
  53689. "ldr r2, [%[a]]\n\t"
  53690. "ldr r3, [%[a], #4]\n\t"
  53691. #ifdef WOLFSSL_KEIL
  53692. "sbcs r2, r2, r4\n\t"
  53693. #elif defined(__clang__)
  53694. "sbcs r2, r4\n\t"
  53695. #else
  53696. "sbc r2, r4\n\t"
  53697. #endif
  53698. #ifdef WOLFSSL_KEIL
  53699. "sbcs r3, r3, r5\n\t"
  53700. #elif defined(__clang__)
  53701. "sbcs r3, r5\n\t"
  53702. #else
  53703. "sbc r3, r5\n\t"
  53704. #endif
  53705. "stm %[a]!, {r2, r3}\n\t"
  53706. "ldm %[b]!, {r4, r5}\n\t"
  53707. "ldr r2, [%[a]]\n\t"
  53708. "ldr r3, [%[a], #4]\n\t"
  53709. #ifdef WOLFSSL_KEIL
  53710. "sbcs r2, r2, r4\n\t"
  53711. #elif defined(__clang__)
  53712. "sbcs r2, r4\n\t"
  53713. #else
  53714. "sbc r2, r4\n\t"
  53715. #endif
  53716. #ifdef WOLFSSL_KEIL
  53717. "sbcs r3, r3, r5\n\t"
  53718. #elif defined(__clang__)
  53719. "sbcs r3, r5\n\t"
  53720. #else
  53721. "sbc r3, r5\n\t"
  53722. #endif
  53723. "stm %[a]!, {r2, r3}\n\t"
  53724. "ldm %[b]!, {r4, r5}\n\t"
  53725. "ldr r2, [%[a]]\n\t"
  53726. "ldr r3, [%[a], #4]\n\t"
  53727. #ifdef WOLFSSL_KEIL
  53728. "sbcs r2, r2, r4\n\t"
  53729. #elif defined(__clang__)
  53730. "sbcs r2, r4\n\t"
  53731. #else
  53732. "sbc r2, r4\n\t"
  53733. #endif
  53734. #ifdef WOLFSSL_KEIL
  53735. "sbcs r3, r3, r5\n\t"
  53736. #elif defined(__clang__)
  53737. "sbcs r3, r5\n\t"
  53738. #else
  53739. "sbc r3, r5\n\t"
  53740. #endif
  53741. "stm %[a]!, {r2, r3}\n\t"
  53742. #ifdef WOLFSSL_KEIL
  53743. "sbcs %[a], %[a], %[a]\n\t"
  53744. #elif defined(__clang__)
  53745. "sbcs %[a], %[a]\n\t"
  53746. #else
  53747. "sbc %[a], %[a]\n\t"
  53748. #endif
  53749. : [a] "+l" (a), [b] "+l" (b)
  53750. :
  53751. : "memory", "r2", "r3", "r4", "r5"
  53752. );
  53753. return (uint32_t)(size_t)a;
  53754. }
  53755. /* Add b to a into r. (r = a + b)
  53756. *
  53757. * r A single precision integer.
  53758. * a A single precision integer.
  53759. * b A single precision integer.
  53760. */
  53761. SP_NOINLINE static sp_digit sp_3072_add_96(sp_digit* r, const sp_digit* a,
  53762. const sp_digit* b)
  53763. {
  53764. __asm__ __volatile__ (
  53765. "ldm %[b]!, {r5, r6}\n\t"
  53766. "ldm %[a]!, {r3, r4}\n\t"
  53767. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53768. "adds r3, r3, r5\n\t"
  53769. #else
  53770. "add r3, r3, r5\n\t"
  53771. #endif
  53772. #ifdef WOLFSSL_KEIL
  53773. "adcs r4, r4, r6\n\t"
  53774. #elif defined(__clang__)
  53775. "adcs r4, r6\n\t"
  53776. #else
  53777. "adc r4, r6\n\t"
  53778. #endif
  53779. "stm %[r]!, {r3, r4}\n\t"
  53780. "ldm %[b]!, {r5, r6}\n\t"
  53781. "ldm %[a]!, {r3, r4}\n\t"
  53782. #ifdef WOLFSSL_KEIL
  53783. "adcs r3, r3, r5\n\t"
  53784. #elif defined(__clang__)
  53785. "adcs r3, r5\n\t"
  53786. #else
  53787. "adc r3, r5\n\t"
  53788. #endif
  53789. #ifdef WOLFSSL_KEIL
  53790. "adcs r4, r4, r6\n\t"
  53791. #elif defined(__clang__)
  53792. "adcs r4, r6\n\t"
  53793. #else
  53794. "adc r4, r6\n\t"
  53795. #endif
  53796. "stm %[r]!, {r3, r4}\n\t"
  53797. "ldm %[b]!, {r5, r6}\n\t"
  53798. "ldm %[a]!, {r3, r4}\n\t"
  53799. #ifdef WOLFSSL_KEIL
  53800. "adcs r3, r3, r5\n\t"
  53801. #elif defined(__clang__)
  53802. "adcs r3, r5\n\t"
  53803. #else
  53804. "adc r3, r5\n\t"
  53805. #endif
  53806. #ifdef WOLFSSL_KEIL
  53807. "adcs r4, r4, r6\n\t"
  53808. #elif defined(__clang__)
  53809. "adcs r4, r6\n\t"
  53810. #else
  53811. "adc r4, r6\n\t"
  53812. #endif
  53813. "stm %[r]!, {r3, r4}\n\t"
  53814. "ldm %[b]!, {r5, r6}\n\t"
  53815. "ldm %[a]!, {r3, r4}\n\t"
  53816. #ifdef WOLFSSL_KEIL
  53817. "adcs r3, r3, r5\n\t"
  53818. #elif defined(__clang__)
  53819. "adcs r3, r5\n\t"
  53820. #else
  53821. "adc r3, r5\n\t"
  53822. #endif
  53823. #ifdef WOLFSSL_KEIL
  53824. "adcs r4, r4, r6\n\t"
  53825. #elif defined(__clang__)
  53826. "adcs r4, r6\n\t"
  53827. #else
  53828. "adc r4, r6\n\t"
  53829. #endif
  53830. "stm %[r]!, {r3, r4}\n\t"
  53831. "ldm %[b]!, {r5, r6}\n\t"
  53832. "ldm %[a]!, {r3, r4}\n\t"
  53833. #ifdef WOLFSSL_KEIL
  53834. "adcs r3, r3, r5\n\t"
  53835. #elif defined(__clang__)
  53836. "adcs r3, r5\n\t"
  53837. #else
  53838. "adc r3, r5\n\t"
  53839. #endif
  53840. #ifdef WOLFSSL_KEIL
  53841. "adcs r4, r4, r6\n\t"
  53842. #elif defined(__clang__)
  53843. "adcs r4, r6\n\t"
  53844. #else
  53845. "adc r4, r6\n\t"
  53846. #endif
  53847. "stm %[r]!, {r3, r4}\n\t"
  53848. "ldm %[b]!, {r5, r6}\n\t"
  53849. "ldm %[a]!, {r3, r4}\n\t"
  53850. #ifdef WOLFSSL_KEIL
  53851. "adcs r3, r3, r5\n\t"
  53852. #elif defined(__clang__)
  53853. "adcs r3, r5\n\t"
  53854. #else
  53855. "adc r3, r5\n\t"
  53856. #endif
  53857. #ifdef WOLFSSL_KEIL
  53858. "adcs r4, r4, r6\n\t"
  53859. #elif defined(__clang__)
  53860. "adcs r4, r6\n\t"
  53861. #else
  53862. "adc r4, r6\n\t"
  53863. #endif
  53864. "stm %[r]!, {r3, r4}\n\t"
  53865. "ldm %[b]!, {r5, r6}\n\t"
  53866. "ldm %[a]!, {r3, r4}\n\t"
  53867. #ifdef WOLFSSL_KEIL
  53868. "adcs r3, r3, r5\n\t"
  53869. #elif defined(__clang__)
  53870. "adcs r3, r5\n\t"
  53871. #else
  53872. "adc r3, r5\n\t"
  53873. #endif
  53874. #ifdef WOLFSSL_KEIL
  53875. "adcs r4, r4, r6\n\t"
  53876. #elif defined(__clang__)
  53877. "adcs r4, r6\n\t"
  53878. #else
  53879. "adc r4, r6\n\t"
  53880. #endif
  53881. "stm %[r]!, {r3, r4}\n\t"
  53882. "ldm %[b]!, {r5, r6}\n\t"
  53883. "ldm %[a]!, {r3, r4}\n\t"
  53884. #ifdef WOLFSSL_KEIL
  53885. "adcs r3, r3, r5\n\t"
  53886. #elif defined(__clang__)
  53887. "adcs r3, r5\n\t"
  53888. #else
  53889. "adc r3, r5\n\t"
  53890. #endif
  53891. #ifdef WOLFSSL_KEIL
  53892. "adcs r4, r4, r6\n\t"
  53893. #elif defined(__clang__)
  53894. "adcs r4, r6\n\t"
  53895. #else
  53896. "adc r4, r6\n\t"
  53897. #endif
  53898. "stm %[r]!, {r3, r4}\n\t"
  53899. "ldm %[b]!, {r5, r6}\n\t"
  53900. "ldm %[a]!, {r3, r4}\n\t"
  53901. #ifdef WOLFSSL_KEIL
  53902. "adcs r3, r3, r5\n\t"
  53903. #elif defined(__clang__)
  53904. "adcs r3, r5\n\t"
  53905. #else
  53906. "adc r3, r5\n\t"
  53907. #endif
  53908. #ifdef WOLFSSL_KEIL
  53909. "adcs r4, r4, r6\n\t"
  53910. #elif defined(__clang__)
  53911. "adcs r4, r6\n\t"
  53912. #else
  53913. "adc r4, r6\n\t"
  53914. #endif
  53915. "stm %[r]!, {r3, r4}\n\t"
  53916. "ldm %[b]!, {r5, r6}\n\t"
  53917. "ldm %[a]!, {r3, r4}\n\t"
  53918. #ifdef WOLFSSL_KEIL
  53919. "adcs r3, r3, r5\n\t"
  53920. #elif defined(__clang__)
  53921. "adcs r3, r5\n\t"
  53922. #else
  53923. "adc r3, r5\n\t"
  53924. #endif
  53925. #ifdef WOLFSSL_KEIL
  53926. "adcs r4, r4, r6\n\t"
  53927. #elif defined(__clang__)
  53928. "adcs r4, r6\n\t"
  53929. #else
  53930. "adc r4, r6\n\t"
  53931. #endif
  53932. "stm %[r]!, {r3, r4}\n\t"
  53933. "ldm %[b]!, {r5, r6}\n\t"
  53934. "ldm %[a]!, {r3, r4}\n\t"
  53935. #ifdef WOLFSSL_KEIL
  53936. "adcs r3, r3, r5\n\t"
  53937. #elif defined(__clang__)
  53938. "adcs r3, r5\n\t"
  53939. #else
  53940. "adc r3, r5\n\t"
  53941. #endif
  53942. #ifdef WOLFSSL_KEIL
  53943. "adcs r4, r4, r6\n\t"
  53944. #elif defined(__clang__)
  53945. "adcs r4, r6\n\t"
  53946. #else
  53947. "adc r4, r6\n\t"
  53948. #endif
  53949. "stm %[r]!, {r3, r4}\n\t"
  53950. "ldm %[b]!, {r5, r6}\n\t"
  53951. "ldm %[a]!, {r3, r4}\n\t"
  53952. #ifdef WOLFSSL_KEIL
  53953. "adcs r3, r3, r5\n\t"
  53954. #elif defined(__clang__)
  53955. "adcs r3, r5\n\t"
  53956. #else
  53957. "adc r3, r5\n\t"
  53958. #endif
  53959. #ifdef WOLFSSL_KEIL
  53960. "adcs r4, r4, r6\n\t"
  53961. #elif defined(__clang__)
  53962. "adcs r4, r6\n\t"
  53963. #else
  53964. "adc r4, r6\n\t"
  53965. #endif
  53966. "stm %[r]!, {r3, r4}\n\t"
  53967. "ldm %[b]!, {r5, r6}\n\t"
  53968. "ldm %[a]!, {r3, r4}\n\t"
  53969. #ifdef WOLFSSL_KEIL
  53970. "adcs r3, r3, r5\n\t"
  53971. #elif defined(__clang__)
  53972. "adcs r3, r5\n\t"
  53973. #else
  53974. "adc r3, r5\n\t"
  53975. #endif
  53976. #ifdef WOLFSSL_KEIL
  53977. "adcs r4, r4, r6\n\t"
  53978. #elif defined(__clang__)
  53979. "adcs r4, r6\n\t"
  53980. #else
  53981. "adc r4, r6\n\t"
  53982. #endif
  53983. "stm %[r]!, {r3, r4}\n\t"
  53984. "ldm %[b]!, {r5, r6}\n\t"
  53985. "ldm %[a]!, {r3, r4}\n\t"
  53986. #ifdef WOLFSSL_KEIL
  53987. "adcs r3, r3, r5\n\t"
  53988. #elif defined(__clang__)
  53989. "adcs r3, r5\n\t"
  53990. #else
  53991. "adc r3, r5\n\t"
  53992. #endif
  53993. #ifdef WOLFSSL_KEIL
  53994. "adcs r4, r4, r6\n\t"
  53995. #elif defined(__clang__)
  53996. "adcs r4, r6\n\t"
  53997. #else
  53998. "adc r4, r6\n\t"
  53999. #endif
  54000. "stm %[r]!, {r3, r4}\n\t"
  54001. "ldm %[b]!, {r5, r6}\n\t"
  54002. "ldm %[a]!, {r3, r4}\n\t"
  54003. #ifdef WOLFSSL_KEIL
  54004. "adcs r3, r3, r5\n\t"
  54005. #elif defined(__clang__)
  54006. "adcs r3, r5\n\t"
  54007. #else
  54008. "adc 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. "stm %[r]!, {r3, r4}\n\t"
  54018. "ldm %[b]!, {r5, r6}\n\t"
  54019. "ldm %[a]!, {r3, r4}\n\t"
  54020. #ifdef WOLFSSL_KEIL
  54021. "adcs r3, r3, r5\n\t"
  54022. #elif defined(__clang__)
  54023. "adcs r3, r5\n\t"
  54024. #else
  54025. "adc r3, r5\n\t"
  54026. #endif
  54027. #ifdef WOLFSSL_KEIL
  54028. "adcs r4, r4, r6\n\t"
  54029. #elif defined(__clang__)
  54030. "adcs r4, r6\n\t"
  54031. #else
  54032. "adc r4, r6\n\t"
  54033. #endif
  54034. "stm %[r]!, {r3, r4}\n\t"
  54035. "ldm %[b]!, {r5, r6}\n\t"
  54036. "ldm %[a]!, {r3, r4}\n\t"
  54037. #ifdef WOLFSSL_KEIL
  54038. "adcs r3, r3, r5\n\t"
  54039. #elif defined(__clang__)
  54040. "adcs r3, r5\n\t"
  54041. #else
  54042. "adc r3, r5\n\t"
  54043. #endif
  54044. #ifdef WOLFSSL_KEIL
  54045. "adcs r4, r4, r6\n\t"
  54046. #elif defined(__clang__)
  54047. "adcs r4, r6\n\t"
  54048. #else
  54049. "adc r4, r6\n\t"
  54050. #endif
  54051. "stm %[r]!, {r3, r4}\n\t"
  54052. "ldm %[b]!, {r5, r6}\n\t"
  54053. "ldm %[a]!, {r3, r4}\n\t"
  54054. #ifdef WOLFSSL_KEIL
  54055. "adcs r3, r3, r5\n\t"
  54056. #elif defined(__clang__)
  54057. "adcs r3, r5\n\t"
  54058. #else
  54059. "adc r3, r5\n\t"
  54060. #endif
  54061. #ifdef WOLFSSL_KEIL
  54062. "adcs r4, r4, r6\n\t"
  54063. #elif defined(__clang__)
  54064. "adcs r4, r6\n\t"
  54065. #else
  54066. "adc r4, r6\n\t"
  54067. #endif
  54068. "stm %[r]!, {r3, r4}\n\t"
  54069. "ldm %[b]!, {r5, r6}\n\t"
  54070. "ldm %[a]!, {r3, r4}\n\t"
  54071. #ifdef WOLFSSL_KEIL
  54072. "adcs r3, r3, r5\n\t"
  54073. #elif defined(__clang__)
  54074. "adcs r3, r5\n\t"
  54075. #else
  54076. "adc r3, r5\n\t"
  54077. #endif
  54078. #ifdef WOLFSSL_KEIL
  54079. "adcs r4, r4, r6\n\t"
  54080. #elif defined(__clang__)
  54081. "adcs r4, r6\n\t"
  54082. #else
  54083. "adc r4, r6\n\t"
  54084. #endif
  54085. "stm %[r]!, {r3, r4}\n\t"
  54086. "ldm %[b]!, {r5, r6}\n\t"
  54087. "ldm %[a]!, {r3, r4}\n\t"
  54088. #ifdef WOLFSSL_KEIL
  54089. "adcs r3, r3, r5\n\t"
  54090. #elif defined(__clang__)
  54091. "adcs r3, r5\n\t"
  54092. #else
  54093. "adc r3, r5\n\t"
  54094. #endif
  54095. #ifdef WOLFSSL_KEIL
  54096. "adcs r4, r4, r6\n\t"
  54097. #elif defined(__clang__)
  54098. "adcs r4, r6\n\t"
  54099. #else
  54100. "adc r4, r6\n\t"
  54101. #endif
  54102. "stm %[r]!, {r3, r4}\n\t"
  54103. "ldm %[b]!, {r5, r6}\n\t"
  54104. "ldm %[a]!, {r3, r4}\n\t"
  54105. #ifdef WOLFSSL_KEIL
  54106. "adcs r3, r3, r5\n\t"
  54107. #elif defined(__clang__)
  54108. "adcs r3, r5\n\t"
  54109. #else
  54110. "adc r3, r5\n\t"
  54111. #endif
  54112. #ifdef WOLFSSL_KEIL
  54113. "adcs r4, r4, r6\n\t"
  54114. #elif defined(__clang__)
  54115. "adcs r4, r6\n\t"
  54116. #else
  54117. "adc r4, r6\n\t"
  54118. #endif
  54119. "stm %[r]!, {r3, r4}\n\t"
  54120. "ldm %[b]!, {r5, r6}\n\t"
  54121. "ldm %[a]!, {r3, r4}\n\t"
  54122. #ifdef WOLFSSL_KEIL
  54123. "adcs r3, r3, r5\n\t"
  54124. #elif defined(__clang__)
  54125. "adcs r3, r5\n\t"
  54126. #else
  54127. "adc r3, r5\n\t"
  54128. #endif
  54129. #ifdef WOLFSSL_KEIL
  54130. "adcs r4, r4, r6\n\t"
  54131. #elif defined(__clang__)
  54132. "adcs r4, r6\n\t"
  54133. #else
  54134. "adc r4, r6\n\t"
  54135. #endif
  54136. "stm %[r]!, {r3, r4}\n\t"
  54137. "ldm %[b]!, {r5, r6}\n\t"
  54138. "ldm %[a]!, {r3, r4}\n\t"
  54139. #ifdef WOLFSSL_KEIL
  54140. "adcs r3, r3, r5\n\t"
  54141. #elif defined(__clang__)
  54142. "adcs r3, r5\n\t"
  54143. #else
  54144. "adc r3, r5\n\t"
  54145. #endif
  54146. #ifdef WOLFSSL_KEIL
  54147. "adcs r4, r4, r6\n\t"
  54148. #elif defined(__clang__)
  54149. "adcs r4, r6\n\t"
  54150. #else
  54151. "adc r4, r6\n\t"
  54152. #endif
  54153. "stm %[r]!, {r3, r4}\n\t"
  54154. "ldm %[b]!, {r5, r6}\n\t"
  54155. "ldm %[a]!, {r3, r4}\n\t"
  54156. #ifdef WOLFSSL_KEIL
  54157. "adcs r3, r3, r5\n\t"
  54158. #elif defined(__clang__)
  54159. "adcs r3, r5\n\t"
  54160. #else
  54161. "adc r3, r5\n\t"
  54162. #endif
  54163. #ifdef WOLFSSL_KEIL
  54164. "adcs r4, r4, r6\n\t"
  54165. #elif defined(__clang__)
  54166. "adcs r4, r6\n\t"
  54167. #else
  54168. "adc r4, r6\n\t"
  54169. #endif
  54170. "stm %[r]!, {r3, r4}\n\t"
  54171. "ldm %[b]!, {r5, r6}\n\t"
  54172. "ldm %[a]!, {r3, r4}\n\t"
  54173. #ifdef WOLFSSL_KEIL
  54174. "adcs r3, r3, r5\n\t"
  54175. #elif defined(__clang__)
  54176. "adcs r3, r5\n\t"
  54177. #else
  54178. "adc r3, r5\n\t"
  54179. #endif
  54180. #ifdef WOLFSSL_KEIL
  54181. "adcs r4, r4, r6\n\t"
  54182. #elif defined(__clang__)
  54183. "adcs r4, r6\n\t"
  54184. #else
  54185. "adc r4, r6\n\t"
  54186. #endif
  54187. "stm %[r]!, {r3, r4}\n\t"
  54188. "ldm %[b]!, {r5, r6}\n\t"
  54189. "ldm %[a]!, {r3, r4}\n\t"
  54190. #ifdef WOLFSSL_KEIL
  54191. "adcs r3, r3, r5\n\t"
  54192. #elif defined(__clang__)
  54193. "adcs r3, r5\n\t"
  54194. #else
  54195. "adc r3, r5\n\t"
  54196. #endif
  54197. #ifdef WOLFSSL_KEIL
  54198. "adcs r4, r4, r6\n\t"
  54199. #elif defined(__clang__)
  54200. "adcs r4, r6\n\t"
  54201. #else
  54202. "adc r4, r6\n\t"
  54203. #endif
  54204. "stm %[r]!, {r3, r4}\n\t"
  54205. "ldm %[b]!, {r5, r6}\n\t"
  54206. "ldm %[a]!, {r3, r4}\n\t"
  54207. #ifdef WOLFSSL_KEIL
  54208. "adcs r3, r3, r5\n\t"
  54209. #elif defined(__clang__)
  54210. "adcs r3, r5\n\t"
  54211. #else
  54212. "adc r3, r5\n\t"
  54213. #endif
  54214. #ifdef WOLFSSL_KEIL
  54215. "adcs r4, r4, r6\n\t"
  54216. #elif defined(__clang__)
  54217. "adcs r4, r6\n\t"
  54218. #else
  54219. "adc r4, r6\n\t"
  54220. #endif
  54221. "stm %[r]!, {r3, r4}\n\t"
  54222. "ldm %[b]!, {r5, r6}\n\t"
  54223. "ldm %[a]!, {r3, r4}\n\t"
  54224. #ifdef WOLFSSL_KEIL
  54225. "adcs r3, r3, r5\n\t"
  54226. #elif defined(__clang__)
  54227. "adcs r3, r5\n\t"
  54228. #else
  54229. "adc r3, r5\n\t"
  54230. #endif
  54231. #ifdef WOLFSSL_KEIL
  54232. "adcs r4, r4, r6\n\t"
  54233. #elif defined(__clang__)
  54234. "adcs r4, r6\n\t"
  54235. #else
  54236. "adc r4, r6\n\t"
  54237. #endif
  54238. "stm %[r]!, {r3, r4}\n\t"
  54239. "ldm %[b]!, {r5, r6}\n\t"
  54240. "ldm %[a]!, {r3, r4}\n\t"
  54241. #ifdef WOLFSSL_KEIL
  54242. "adcs r3, r3, r5\n\t"
  54243. #elif defined(__clang__)
  54244. "adcs r3, r5\n\t"
  54245. #else
  54246. "adc r3, r5\n\t"
  54247. #endif
  54248. #ifdef WOLFSSL_KEIL
  54249. "adcs r4, r4, r6\n\t"
  54250. #elif defined(__clang__)
  54251. "adcs r4, r6\n\t"
  54252. #else
  54253. "adc r4, r6\n\t"
  54254. #endif
  54255. "stm %[r]!, {r3, r4}\n\t"
  54256. "ldm %[b]!, {r5, r6}\n\t"
  54257. "ldm %[a]!, {r3, r4}\n\t"
  54258. #ifdef WOLFSSL_KEIL
  54259. "adcs r3, r3, r5\n\t"
  54260. #elif defined(__clang__)
  54261. "adcs r3, r5\n\t"
  54262. #else
  54263. "adc r3, r5\n\t"
  54264. #endif
  54265. #ifdef WOLFSSL_KEIL
  54266. "adcs r4, r4, r6\n\t"
  54267. #elif defined(__clang__)
  54268. "adcs r4, r6\n\t"
  54269. #else
  54270. "adc r4, r6\n\t"
  54271. #endif
  54272. "stm %[r]!, {r3, r4}\n\t"
  54273. "ldm %[b]!, {r5, r6}\n\t"
  54274. "ldm %[a]!, {r3, r4}\n\t"
  54275. #ifdef WOLFSSL_KEIL
  54276. "adcs r3, r3, r5\n\t"
  54277. #elif defined(__clang__)
  54278. "adcs r3, r5\n\t"
  54279. #else
  54280. "adc r3, r5\n\t"
  54281. #endif
  54282. #ifdef WOLFSSL_KEIL
  54283. "adcs r4, r4, r6\n\t"
  54284. #elif defined(__clang__)
  54285. "adcs r4, r6\n\t"
  54286. #else
  54287. "adc r4, r6\n\t"
  54288. #endif
  54289. "stm %[r]!, {r3, r4}\n\t"
  54290. "ldm %[b]!, {r5, r6}\n\t"
  54291. "ldm %[a]!, {r3, r4}\n\t"
  54292. #ifdef WOLFSSL_KEIL
  54293. "adcs r3, r3, r5\n\t"
  54294. #elif defined(__clang__)
  54295. "adcs r3, r5\n\t"
  54296. #else
  54297. "adc r3, r5\n\t"
  54298. #endif
  54299. #ifdef WOLFSSL_KEIL
  54300. "adcs r4, r4, r6\n\t"
  54301. #elif defined(__clang__)
  54302. "adcs r4, r6\n\t"
  54303. #else
  54304. "adc r4, r6\n\t"
  54305. #endif
  54306. "stm %[r]!, {r3, r4}\n\t"
  54307. "ldm %[b]!, {r5, r6}\n\t"
  54308. "ldm %[a]!, {r3, r4}\n\t"
  54309. #ifdef WOLFSSL_KEIL
  54310. "adcs r3, r3, r5\n\t"
  54311. #elif defined(__clang__)
  54312. "adcs r3, r5\n\t"
  54313. #else
  54314. "adc r3, r5\n\t"
  54315. #endif
  54316. #ifdef WOLFSSL_KEIL
  54317. "adcs r4, r4, r6\n\t"
  54318. #elif defined(__clang__)
  54319. "adcs r4, r6\n\t"
  54320. #else
  54321. "adc r4, r6\n\t"
  54322. #endif
  54323. "stm %[r]!, {r3, r4}\n\t"
  54324. "ldm %[b]!, {r5, r6}\n\t"
  54325. "ldm %[a]!, {r3, r4}\n\t"
  54326. #ifdef WOLFSSL_KEIL
  54327. "adcs r3, r3, r5\n\t"
  54328. #elif defined(__clang__)
  54329. "adcs r3, r5\n\t"
  54330. #else
  54331. "adc r3, r5\n\t"
  54332. #endif
  54333. #ifdef WOLFSSL_KEIL
  54334. "adcs r4, r4, r6\n\t"
  54335. #elif defined(__clang__)
  54336. "adcs r4, r6\n\t"
  54337. #else
  54338. "adc r4, r6\n\t"
  54339. #endif
  54340. "stm %[r]!, {r3, r4}\n\t"
  54341. "ldm %[b]!, {r5, r6}\n\t"
  54342. "ldm %[a]!, {r3, r4}\n\t"
  54343. #ifdef WOLFSSL_KEIL
  54344. "adcs r3, r3, r5\n\t"
  54345. #elif defined(__clang__)
  54346. "adcs r3, r5\n\t"
  54347. #else
  54348. "adc r3, r5\n\t"
  54349. #endif
  54350. #ifdef WOLFSSL_KEIL
  54351. "adcs r4, r4, r6\n\t"
  54352. #elif defined(__clang__)
  54353. "adcs r4, r6\n\t"
  54354. #else
  54355. "adc r4, r6\n\t"
  54356. #endif
  54357. "stm %[r]!, {r3, r4}\n\t"
  54358. "ldm %[b]!, {r5, r6}\n\t"
  54359. "ldm %[a]!, {r3, r4}\n\t"
  54360. #ifdef WOLFSSL_KEIL
  54361. "adcs r3, r3, r5\n\t"
  54362. #elif defined(__clang__)
  54363. "adcs r3, r5\n\t"
  54364. #else
  54365. "adc r3, r5\n\t"
  54366. #endif
  54367. #ifdef WOLFSSL_KEIL
  54368. "adcs r4, r4, r6\n\t"
  54369. #elif defined(__clang__)
  54370. "adcs r4, r6\n\t"
  54371. #else
  54372. "adc r4, r6\n\t"
  54373. #endif
  54374. "stm %[r]!, {r3, r4}\n\t"
  54375. "ldm %[b]!, {r5, r6}\n\t"
  54376. "ldm %[a]!, {r3, r4}\n\t"
  54377. #ifdef WOLFSSL_KEIL
  54378. "adcs r3, r3, r5\n\t"
  54379. #elif defined(__clang__)
  54380. "adcs r3, r5\n\t"
  54381. #else
  54382. "adc r3, r5\n\t"
  54383. #endif
  54384. #ifdef WOLFSSL_KEIL
  54385. "adcs r4, r4, r6\n\t"
  54386. #elif defined(__clang__)
  54387. "adcs r4, r6\n\t"
  54388. #else
  54389. "adc r4, r6\n\t"
  54390. #endif
  54391. "stm %[r]!, {r3, r4}\n\t"
  54392. "ldm %[b]!, {r5, r6}\n\t"
  54393. "ldm %[a]!, {r3, r4}\n\t"
  54394. #ifdef WOLFSSL_KEIL
  54395. "adcs r3, r3, r5\n\t"
  54396. #elif defined(__clang__)
  54397. "adcs r3, r5\n\t"
  54398. #else
  54399. "adc r3, r5\n\t"
  54400. #endif
  54401. #ifdef WOLFSSL_KEIL
  54402. "adcs r4, r4, r6\n\t"
  54403. #elif defined(__clang__)
  54404. "adcs r4, r6\n\t"
  54405. #else
  54406. "adc r4, r6\n\t"
  54407. #endif
  54408. "stm %[r]!, {r3, r4}\n\t"
  54409. "ldm %[b]!, {r5, r6}\n\t"
  54410. "ldm %[a]!, {r3, r4}\n\t"
  54411. #ifdef WOLFSSL_KEIL
  54412. "adcs r3, r3, r5\n\t"
  54413. #elif defined(__clang__)
  54414. "adcs r3, r5\n\t"
  54415. #else
  54416. "adc r3, r5\n\t"
  54417. #endif
  54418. #ifdef WOLFSSL_KEIL
  54419. "adcs r4, r4, r6\n\t"
  54420. #elif defined(__clang__)
  54421. "adcs r4, r6\n\t"
  54422. #else
  54423. "adc r4, r6\n\t"
  54424. #endif
  54425. "stm %[r]!, {r3, r4}\n\t"
  54426. "ldm %[b]!, {r5, r6}\n\t"
  54427. "ldm %[a]!, {r3, r4}\n\t"
  54428. #ifdef WOLFSSL_KEIL
  54429. "adcs r3, r3, r5\n\t"
  54430. #elif defined(__clang__)
  54431. "adcs r3, r5\n\t"
  54432. #else
  54433. "adc r3, r5\n\t"
  54434. #endif
  54435. #ifdef WOLFSSL_KEIL
  54436. "adcs r4, r4, r6\n\t"
  54437. #elif defined(__clang__)
  54438. "adcs r4, r6\n\t"
  54439. #else
  54440. "adc r4, r6\n\t"
  54441. #endif
  54442. "stm %[r]!, {r3, r4}\n\t"
  54443. "ldm %[b]!, {r5, r6}\n\t"
  54444. "ldm %[a]!, {r3, r4}\n\t"
  54445. #ifdef WOLFSSL_KEIL
  54446. "adcs r3, r3, r5\n\t"
  54447. #elif defined(__clang__)
  54448. "adcs r3, r5\n\t"
  54449. #else
  54450. "adc r3, r5\n\t"
  54451. #endif
  54452. #ifdef WOLFSSL_KEIL
  54453. "adcs r4, r4, r6\n\t"
  54454. #elif defined(__clang__)
  54455. "adcs r4, r6\n\t"
  54456. #else
  54457. "adc r4, r6\n\t"
  54458. #endif
  54459. "stm %[r]!, {r3, r4}\n\t"
  54460. "ldm %[b]!, {r5, r6}\n\t"
  54461. "ldm %[a]!, {r3, r4}\n\t"
  54462. #ifdef WOLFSSL_KEIL
  54463. "adcs r3, r3, r5\n\t"
  54464. #elif defined(__clang__)
  54465. "adcs r3, r5\n\t"
  54466. #else
  54467. "adc r3, r5\n\t"
  54468. #endif
  54469. #ifdef WOLFSSL_KEIL
  54470. "adcs r4, r4, r6\n\t"
  54471. #elif defined(__clang__)
  54472. "adcs r4, r6\n\t"
  54473. #else
  54474. "adc r4, r6\n\t"
  54475. #endif
  54476. "stm %[r]!, {r3, r4}\n\t"
  54477. "ldm %[b]!, {r5, r6}\n\t"
  54478. "ldm %[a]!, {r3, r4}\n\t"
  54479. #ifdef WOLFSSL_KEIL
  54480. "adcs r3, r3, r5\n\t"
  54481. #elif defined(__clang__)
  54482. "adcs r3, r5\n\t"
  54483. #else
  54484. "adc r3, r5\n\t"
  54485. #endif
  54486. #ifdef WOLFSSL_KEIL
  54487. "adcs r4, r4, r6\n\t"
  54488. #elif defined(__clang__)
  54489. "adcs r4, r6\n\t"
  54490. #else
  54491. "adc r4, r6\n\t"
  54492. #endif
  54493. "stm %[r]!, {r3, r4}\n\t"
  54494. "ldm %[b]!, {r5, r6}\n\t"
  54495. "ldm %[a]!, {r3, r4}\n\t"
  54496. #ifdef WOLFSSL_KEIL
  54497. "adcs r3, r3, r5\n\t"
  54498. #elif defined(__clang__)
  54499. "adcs r3, r5\n\t"
  54500. #else
  54501. "adc r3, r5\n\t"
  54502. #endif
  54503. #ifdef WOLFSSL_KEIL
  54504. "adcs r4, r4, r6\n\t"
  54505. #elif defined(__clang__)
  54506. "adcs r4, r6\n\t"
  54507. #else
  54508. "adc r4, r6\n\t"
  54509. #endif
  54510. "stm %[r]!, {r3, r4}\n\t"
  54511. "ldm %[b]!, {r5, r6}\n\t"
  54512. "ldm %[a]!, {r3, r4}\n\t"
  54513. #ifdef WOLFSSL_KEIL
  54514. "adcs r3, r3, r5\n\t"
  54515. #elif defined(__clang__)
  54516. "adcs r3, r5\n\t"
  54517. #else
  54518. "adc r3, r5\n\t"
  54519. #endif
  54520. #ifdef WOLFSSL_KEIL
  54521. "adcs r4, r4, r6\n\t"
  54522. #elif defined(__clang__)
  54523. "adcs r4, r6\n\t"
  54524. #else
  54525. "adc r4, r6\n\t"
  54526. #endif
  54527. "stm %[r]!, {r3, r4}\n\t"
  54528. "ldm %[b]!, {r5, r6}\n\t"
  54529. "ldm %[a]!, {r3, r4}\n\t"
  54530. #ifdef WOLFSSL_KEIL
  54531. "adcs r3, r3, r5\n\t"
  54532. #elif defined(__clang__)
  54533. "adcs r3, r5\n\t"
  54534. #else
  54535. "adc r3, r5\n\t"
  54536. #endif
  54537. #ifdef WOLFSSL_KEIL
  54538. "adcs r4, r4, r6\n\t"
  54539. #elif defined(__clang__)
  54540. "adcs r4, r6\n\t"
  54541. #else
  54542. "adc r4, r6\n\t"
  54543. #endif
  54544. "stm %[r]!, {r3, r4}\n\t"
  54545. "ldm %[b]!, {r5, r6}\n\t"
  54546. "ldm %[a]!, {r3, r4}\n\t"
  54547. #ifdef WOLFSSL_KEIL
  54548. "adcs r3, r3, r5\n\t"
  54549. #elif defined(__clang__)
  54550. "adcs r3, r5\n\t"
  54551. #else
  54552. "adc r3, r5\n\t"
  54553. #endif
  54554. #ifdef WOLFSSL_KEIL
  54555. "adcs r4, r4, r6\n\t"
  54556. #elif defined(__clang__)
  54557. "adcs r4, r6\n\t"
  54558. #else
  54559. "adc r4, r6\n\t"
  54560. #endif
  54561. "stm %[r]!, {r3, r4}\n\t"
  54562. "ldm %[b]!, {r5, r6}\n\t"
  54563. "ldm %[a]!, {r3, r4}\n\t"
  54564. #ifdef WOLFSSL_KEIL
  54565. "adcs r3, r3, r5\n\t"
  54566. #elif defined(__clang__)
  54567. "adcs r3, r5\n\t"
  54568. #else
  54569. "adc r3, r5\n\t"
  54570. #endif
  54571. #ifdef WOLFSSL_KEIL
  54572. "adcs r4, r4, r6\n\t"
  54573. #elif defined(__clang__)
  54574. "adcs r4, r6\n\t"
  54575. #else
  54576. "adc r4, r6\n\t"
  54577. #endif
  54578. "stm %[r]!, {r3, r4}\n\t"
  54579. "movs %[r], #0\n\t"
  54580. #ifdef WOLFSSL_KEIL
  54581. "adcs %[r], %[r], %[r]\n\t"
  54582. #elif defined(__clang__)
  54583. "adcs %[r], %[r]\n\t"
  54584. #else
  54585. "adc %[r], %[r]\n\t"
  54586. #endif
  54587. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  54588. :
  54589. : "memory", "r3", "r4", "r5", "r6"
  54590. );
  54591. return (uint32_t)(size_t)r;
  54592. }
  54593. /* AND m into each word of a and store in r.
  54594. *
  54595. * r A single precision integer.
  54596. * a A single precision integer.
  54597. * m Mask to AND against each digit.
  54598. */
  54599. static void sp_3072_mask_48(sp_digit* r, const sp_digit* a, sp_digit m)
  54600. {
  54601. #ifdef WOLFSSL_SP_SMALL
  54602. int i;
  54603. for (i=0; i<48; i++) {
  54604. r[i] = a[i] & m;
  54605. }
  54606. #else
  54607. int i;
  54608. for (i = 0; i < 48; i += 8) {
  54609. r[i+0] = a[i+0] & m;
  54610. r[i+1] = a[i+1] & m;
  54611. r[i+2] = a[i+2] & m;
  54612. r[i+3] = a[i+3] & m;
  54613. r[i+4] = a[i+4] & m;
  54614. r[i+5] = a[i+5] & m;
  54615. r[i+6] = a[i+6] & m;
  54616. r[i+7] = a[i+7] & m;
  54617. }
  54618. #endif
  54619. }
  54620. /* Multiply a and b into r. (r = a * b)
  54621. *
  54622. * r A single precision integer.
  54623. * a A single precision integer.
  54624. * b A single precision integer.
  54625. */
  54626. SP_NOINLINE static void sp_3072_mul_96(sp_digit* r, const sp_digit* a,
  54627. const sp_digit* b)
  54628. {
  54629. sp_digit* z0 = r;
  54630. sp_digit z1[96];
  54631. sp_digit a1[48];
  54632. sp_digit b1[48];
  54633. sp_digit* z2 = r + 96;
  54634. sp_digit u;
  54635. sp_digit ca;
  54636. sp_digit cb;
  54637. ca = sp_3072_add_48(a1, a, &a[48]);
  54638. cb = sp_3072_add_48(b1, b, &b[48]);
  54639. u = ca & cb;
  54640. sp_3072_mul_48(z2, &a[48], &b[48]);
  54641. sp_3072_mul_48(z0, a, b);
  54642. sp_3072_mul_48(z1, a1, b1);
  54643. u += sp_3072_sub_in_place_96(z1, z0);
  54644. u += sp_3072_sub_in_place_96(z1, z2);
  54645. sp_3072_mask_48(a1, a1, 0 - cb);
  54646. u += sp_3072_add_48(z1 + 48, z1 + 48, a1);
  54647. sp_3072_mask_48(b1, b1, 0 - ca);
  54648. u += sp_3072_add_48(z1 + 48, z1 + 48, b1);
  54649. u += sp_3072_add_96(r + 48, r + 48, z1);
  54650. (void)sp_3072_add_word_48(r + 144, r + 144, u);
  54651. }
  54652. #ifndef WOLFSSL_SP_LARGE_CODE
  54653. /* Square a and put result in r. (r = a * a)
  54654. *
  54655. * r A single precision integer.
  54656. * a A single precision integer.
  54657. */
  54658. SP_NOINLINE static void sp_3072_sqr_12(sp_digit* r, const sp_digit* a)
  54659. {
  54660. __asm__ __volatile__ (
  54661. "movs r3, #0\n\t"
  54662. "movs r4, #0\n\t"
  54663. "movs r5, #0\n\t"
  54664. "mov r8, r3\n\t"
  54665. "mov r11, %[r]\n\t"
  54666. "movs r6, #0x60\n\t"
  54667. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54668. "negs r6, r6\n\t"
  54669. #else
  54670. "neg r6, r6\n\t"
  54671. #endif
  54672. "add sp, sp, r6\n\t"
  54673. "mov r10, sp\n\t"
  54674. "mov r9, %[a]\n\t"
  54675. "\n"
  54676. "L_sp_3072_sqr_12_words_%=:\n\t"
  54677. "movs %[r], #0\n\t"
  54678. "movs r6, #44\n\t"
  54679. "mov %[a], r8\n\t"
  54680. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54681. "subs %[a], %[a], r6\n\t"
  54682. #else
  54683. "sub %[a], %[a], r6\n\t"
  54684. #endif
  54685. #ifdef WOLFSSL_KEIL
  54686. "sbcs r6, r6, r6\n\t"
  54687. #elif defined(__clang__)
  54688. "sbcs r6, r6\n\t"
  54689. #else
  54690. "sbc r6, r6\n\t"
  54691. #endif
  54692. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54693. "mvns r6, r6\n\t"
  54694. #else
  54695. "mvn r6, r6\n\t"
  54696. #endif
  54697. #ifdef WOLFSSL_KEIL
  54698. "ands %[a], %[a], r6\n\t"
  54699. #elif defined(__clang__)
  54700. "ands %[a], r6\n\t"
  54701. #else
  54702. "and %[a], r6\n\t"
  54703. #endif
  54704. "mov r2, r8\n\t"
  54705. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54706. "subs r2, r2, %[a]\n\t"
  54707. #else
  54708. "sub r2, r2, %[a]\n\t"
  54709. #endif
  54710. "add %[a], %[a], r9\n\t"
  54711. "add r2, r2, r9\n\t"
  54712. "\n"
  54713. "L_sp_3072_sqr_12_mul_%=:\n\t"
  54714. "cmp r2, %[a]\n\t"
  54715. "beq L_sp_3072_sqr_12_sqr_%=\n\t"
  54716. "# Multiply * 2: Start\n\t"
  54717. "ldrh r6, [%[a]]\n\t"
  54718. "ldrh r7, [r2]\n\t"
  54719. #ifdef WOLFSSL_KEIL
  54720. "muls r7, r6, r7\n\t"
  54721. #elif defined(__clang__)
  54722. "muls r7, r6\n\t"
  54723. #else
  54724. "mul r7, r6\n\t"
  54725. #endif
  54726. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54727. "adds r3, r3, r7\n\t"
  54728. #else
  54729. "add r3, r3, r7\n\t"
  54730. #endif
  54731. #ifdef WOLFSSL_KEIL
  54732. "adcs r4, r4, %[r]\n\t"
  54733. #elif defined(__clang__)
  54734. "adcs r4, %[r]\n\t"
  54735. #else
  54736. "adc r4, %[r]\n\t"
  54737. #endif
  54738. #ifdef WOLFSSL_KEIL
  54739. "adcs r5, r5, %[r]\n\t"
  54740. #elif defined(__clang__)
  54741. "adcs r5, %[r]\n\t"
  54742. #else
  54743. "adc r5, %[r]\n\t"
  54744. #endif
  54745. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54746. "adds r3, r3, r7\n\t"
  54747. #else
  54748. "add r3, r3, r7\n\t"
  54749. #endif
  54750. #ifdef WOLFSSL_KEIL
  54751. "adcs r4, r4, %[r]\n\t"
  54752. #elif defined(__clang__)
  54753. "adcs r4, %[r]\n\t"
  54754. #else
  54755. "adc r4, %[r]\n\t"
  54756. #endif
  54757. #ifdef WOLFSSL_KEIL
  54758. "adcs r5, r5, %[r]\n\t"
  54759. #elif defined(__clang__)
  54760. "adcs r5, %[r]\n\t"
  54761. #else
  54762. "adc r5, %[r]\n\t"
  54763. #endif
  54764. "ldr r7, [r2]\n\t"
  54765. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54766. "lsrs r7, r7, #16\n\t"
  54767. #else
  54768. "lsr r7, r7, #16\n\t"
  54769. #endif
  54770. #ifdef WOLFSSL_KEIL
  54771. "muls r6, r7, r6\n\t"
  54772. #elif defined(__clang__)
  54773. "muls r6, r7\n\t"
  54774. #else
  54775. "mul r6, r7\n\t"
  54776. #endif
  54777. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54778. "lsrs r7, r6, #16\n\t"
  54779. #else
  54780. "lsr r7, r6, #16\n\t"
  54781. #endif
  54782. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54783. "lsls r6, r6, #16\n\t"
  54784. #else
  54785. "lsl r6, r6, #16\n\t"
  54786. #endif
  54787. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54788. "adds r3, r3, r6\n\t"
  54789. #else
  54790. "add r3, r3, r6\n\t"
  54791. #endif
  54792. #ifdef WOLFSSL_KEIL
  54793. "adcs r4, r4, r7\n\t"
  54794. #elif defined(__clang__)
  54795. "adcs r4, r7\n\t"
  54796. #else
  54797. "adc r4, r7\n\t"
  54798. #endif
  54799. #ifdef WOLFSSL_KEIL
  54800. "adcs r5, r5, %[r]\n\t"
  54801. #elif defined(__clang__)
  54802. "adcs r5, %[r]\n\t"
  54803. #else
  54804. "adc r5, %[r]\n\t"
  54805. #endif
  54806. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54807. "adds r3, r3, r6\n\t"
  54808. #else
  54809. "add r3, r3, r6\n\t"
  54810. #endif
  54811. #ifdef WOLFSSL_KEIL
  54812. "adcs r4, r4, r7\n\t"
  54813. #elif defined(__clang__)
  54814. "adcs r4, r7\n\t"
  54815. #else
  54816. "adc r4, r7\n\t"
  54817. #endif
  54818. #ifdef WOLFSSL_KEIL
  54819. "adcs r5, r5, %[r]\n\t"
  54820. #elif defined(__clang__)
  54821. "adcs r5, %[r]\n\t"
  54822. #else
  54823. "adc r5, %[r]\n\t"
  54824. #endif
  54825. "ldr r6, [%[a]]\n\t"
  54826. "ldr r7, [r2]\n\t"
  54827. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54828. "lsrs r6, r6, #16\n\t"
  54829. #else
  54830. "lsr r6, r6, #16\n\t"
  54831. #endif
  54832. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54833. "lsrs r7, r7, #16\n\t"
  54834. #else
  54835. "lsr r7, r7, #16\n\t"
  54836. #endif
  54837. #ifdef WOLFSSL_KEIL
  54838. "muls r7, r6, r7\n\t"
  54839. #elif defined(__clang__)
  54840. "muls r7, r6\n\t"
  54841. #else
  54842. "mul r7, r6\n\t"
  54843. #endif
  54844. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54845. "adds r4, r4, r7\n\t"
  54846. #else
  54847. "add r4, r4, r7\n\t"
  54848. #endif
  54849. #ifdef WOLFSSL_KEIL
  54850. "adcs r5, r5, %[r]\n\t"
  54851. #elif defined(__clang__)
  54852. "adcs r5, %[r]\n\t"
  54853. #else
  54854. "adc r5, %[r]\n\t"
  54855. #endif
  54856. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54857. "adds r4, r4, r7\n\t"
  54858. #else
  54859. "add r4, r4, r7\n\t"
  54860. #endif
  54861. #ifdef WOLFSSL_KEIL
  54862. "adcs r5, r5, %[r]\n\t"
  54863. #elif defined(__clang__)
  54864. "adcs r5, %[r]\n\t"
  54865. #else
  54866. "adc r5, %[r]\n\t"
  54867. #endif
  54868. "ldrh r7, [r2]\n\t"
  54869. #ifdef WOLFSSL_KEIL
  54870. "muls r6, r7, r6\n\t"
  54871. #elif defined(__clang__)
  54872. "muls r6, r7\n\t"
  54873. #else
  54874. "mul r6, r7\n\t"
  54875. #endif
  54876. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54877. "lsrs r7, r6, #16\n\t"
  54878. #else
  54879. "lsr r7, r6, #16\n\t"
  54880. #endif
  54881. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54882. "lsls r6, r6, #16\n\t"
  54883. #else
  54884. "lsl r6, r6, #16\n\t"
  54885. #endif
  54886. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54887. "adds r3, r3, r6\n\t"
  54888. #else
  54889. "add r3, r3, r6\n\t"
  54890. #endif
  54891. #ifdef WOLFSSL_KEIL
  54892. "adcs r4, r4, r7\n\t"
  54893. #elif defined(__clang__)
  54894. "adcs r4, r7\n\t"
  54895. #else
  54896. "adc r4, r7\n\t"
  54897. #endif
  54898. #ifdef WOLFSSL_KEIL
  54899. "adcs r5, r5, %[r]\n\t"
  54900. #elif defined(__clang__)
  54901. "adcs r5, %[r]\n\t"
  54902. #else
  54903. "adc r5, %[r]\n\t"
  54904. #endif
  54905. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54906. "adds r3, r3, r6\n\t"
  54907. #else
  54908. "add r3, r3, r6\n\t"
  54909. #endif
  54910. #ifdef WOLFSSL_KEIL
  54911. "adcs r4, r4, r7\n\t"
  54912. #elif defined(__clang__)
  54913. "adcs r4, r7\n\t"
  54914. #else
  54915. "adc r4, r7\n\t"
  54916. #endif
  54917. #ifdef WOLFSSL_KEIL
  54918. "adcs r5, r5, %[r]\n\t"
  54919. #elif defined(__clang__)
  54920. "adcs r5, %[r]\n\t"
  54921. #else
  54922. "adc r5, %[r]\n\t"
  54923. #endif
  54924. "# Multiply * 2: Done\n\t"
  54925. "bal L_sp_3072_sqr_12_done_sqr_%=\n\t"
  54926. "\n"
  54927. "L_sp_3072_sqr_12_sqr_%=:\n\t"
  54928. "mov r12, r2\n\t"
  54929. "ldr r2, [%[a]]\n\t"
  54930. "# Square: Start\n\t"
  54931. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54932. "lsrs r7, r2, #16\n\t"
  54933. #else
  54934. "lsr r7, r2, #16\n\t"
  54935. #endif
  54936. "uxth r6, r2\n\t"
  54937. #ifdef WOLFSSL_KEIL
  54938. "muls r6, r6, r6\n\t"
  54939. #elif defined(__clang__)
  54940. "muls r6, r6\n\t"
  54941. #else
  54942. "mul r6, r6\n\t"
  54943. #endif
  54944. #ifdef WOLFSSL_KEIL
  54945. "muls r7, r7, r7\n\t"
  54946. #elif defined(__clang__)
  54947. "muls r7, r7\n\t"
  54948. #else
  54949. "mul r7, r7\n\t"
  54950. #endif
  54951. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54952. "adds r3, r3, r6\n\t"
  54953. #else
  54954. "add r3, r3, r6\n\t"
  54955. #endif
  54956. #ifdef WOLFSSL_KEIL
  54957. "adcs r4, r4, r7\n\t"
  54958. #elif defined(__clang__)
  54959. "adcs r4, r7\n\t"
  54960. #else
  54961. "adc r4, r7\n\t"
  54962. #endif
  54963. #ifdef WOLFSSL_KEIL
  54964. "adcs r5, r5, %[r]\n\t"
  54965. #elif defined(__clang__)
  54966. "adcs r5, %[r]\n\t"
  54967. #else
  54968. "adc r5, %[r]\n\t"
  54969. #endif
  54970. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54971. "lsrs r7, r2, #16\n\t"
  54972. #else
  54973. "lsr r7, r2, #16\n\t"
  54974. #endif
  54975. "uxth r6, r2\n\t"
  54976. #ifdef WOLFSSL_KEIL
  54977. "muls r6, r7, r6\n\t"
  54978. #elif defined(__clang__)
  54979. "muls r6, r7\n\t"
  54980. #else
  54981. "mul r6, r7\n\t"
  54982. #endif
  54983. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54984. "lsrs r7, r6, #15\n\t"
  54985. #else
  54986. "lsr r7, r6, #15\n\t"
  54987. #endif
  54988. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54989. "lsls r6, r6, #17\n\t"
  54990. #else
  54991. "lsl r6, r6, #17\n\t"
  54992. #endif
  54993. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54994. "adds r3, r3, r6\n\t"
  54995. #else
  54996. "add r3, r3, r6\n\t"
  54997. #endif
  54998. #ifdef WOLFSSL_KEIL
  54999. "adcs r4, r4, r7\n\t"
  55000. #elif defined(__clang__)
  55001. "adcs r4, r7\n\t"
  55002. #else
  55003. "adc r4, r7\n\t"
  55004. #endif
  55005. #ifdef WOLFSSL_KEIL
  55006. "adcs r5, r5, %[r]\n\t"
  55007. #elif defined(__clang__)
  55008. "adcs r5, %[r]\n\t"
  55009. #else
  55010. "adc r5, %[r]\n\t"
  55011. #endif
  55012. "# Square: Done\n\t"
  55013. "mov r2, r12\n\t"
  55014. "\n"
  55015. "L_sp_3072_sqr_12_done_sqr_%=:\n\t"
  55016. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55017. "adds %[a], %[a], #4\n\t"
  55018. #else
  55019. "add %[a], %[a], #4\n\t"
  55020. #endif
  55021. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55022. "subs r2, r2, #4\n\t"
  55023. #else
  55024. "sub r2, r2, #4\n\t"
  55025. #endif
  55026. "movs r6, #48\n\t"
  55027. "add r6, r6, r9\n\t"
  55028. "cmp %[a], r6\n\t"
  55029. "beq L_sp_3072_sqr_12_done_mul_%=\n\t"
  55030. "cmp %[a], r2\n\t"
  55031. "bgt L_sp_3072_sqr_12_done_mul_%=\n\t"
  55032. "mov r7, r8\n\t"
  55033. "add r7, r7, r9\n\t"
  55034. "cmp %[a], r7\n\t"
  55035. "ble L_sp_3072_sqr_12_mul_%=\n\t"
  55036. "\n"
  55037. "L_sp_3072_sqr_12_done_mul_%=:\n\t"
  55038. "mov %[r], r10\n\t"
  55039. "mov r7, r8\n\t"
  55040. "str r3, [%[r], r7]\n\t"
  55041. "movs r3, r4\n\t"
  55042. "movs r4, r5\n\t"
  55043. "movs r5, #0\n\t"
  55044. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55045. "adds r7, r7, #4\n\t"
  55046. #else
  55047. "add r7, r7, #4\n\t"
  55048. #endif
  55049. "mov r8, r7\n\t"
  55050. "movs r6, #0x58\n\t"
  55051. "cmp r7, r6\n\t"
  55052. "ble L_sp_3072_sqr_12_words_%=\n\t"
  55053. "mov %[a], r9\n\t"
  55054. "str r3, [%[r], r7]\n\t"
  55055. "mov %[r], r11\n\t"
  55056. "mov %[a], r10\n\t"
  55057. "movs r3, #0x5c\n\t"
  55058. "\n"
  55059. "L_sp_3072_sqr_12_store_%=:\n\t"
  55060. "ldr r6, [%[a], r3]\n\t"
  55061. "str r6, [%[r], r3]\n\t"
  55062. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55063. "subs r3, r3, #4\n\t"
  55064. #else
  55065. "sub r3, r3, #4\n\t"
  55066. #endif
  55067. "bge L_sp_3072_sqr_12_store_%=\n\t"
  55068. "movs r6, #0x60\n\t"
  55069. "add sp, sp, r6\n\t"
  55070. : [r] "+l" (r), [a] "+l" (a)
  55071. :
  55072. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  55073. );
  55074. }
  55075. #else
  55076. /* Square a and put result in r. (r = a * a)
  55077. *
  55078. * r A single precision integer.
  55079. * a A single precision integer.
  55080. */
  55081. SP_NOINLINE static void sp_3072_sqr_12(sp_digit* r, const sp_digit* a)
  55082. {
  55083. __asm__ __volatile__ (
  55084. "sub sp, sp, #48\n\t"
  55085. "mov r8, %[r]\n\t"
  55086. "mov r9, %[a]\n\t"
  55087. "movs %[r], #0\n\t"
  55088. "ldm %[a]!, {r2, r3, r4, r5}\n\t"
  55089. "mov r10, r2\n\t"
  55090. "mov r11, r3\n\t"
  55091. "mov r12, r4\n\t"
  55092. "mov lr, r5\n\t"
  55093. "mov %[a], r9\n\t"
  55094. "# A[0] * A[0]\n\t"
  55095. "movs r4, #0\n\t"
  55096. "mov r7, r10\n\t"
  55097. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55098. "lsrs r6, r7, #16\n\t"
  55099. #else
  55100. "lsr r6, r7, #16\n\t"
  55101. #endif
  55102. "uxth r5, r7\n\t"
  55103. "movs r2, r5\n\t"
  55104. "movs r3, r6\n\t"
  55105. #ifdef WOLFSSL_KEIL
  55106. "muls r2, r2, r2\n\t"
  55107. #elif defined(__clang__)
  55108. "muls r2, r2\n\t"
  55109. #else
  55110. "mul r2, r2\n\t"
  55111. #endif
  55112. #ifdef WOLFSSL_KEIL
  55113. "muls r3, r3, r3\n\t"
  55114. #elif defined(__clang__)
  55115. "muls r3, r3\n\t"
  55116. #else
  55117. "mul r3, r3\n\t"
  55118. #endif
  55119. #ifdef WOLFSSL_KEIL
  55120. "muls r5, r6, r5\n\t"
  55121. #elif defined(__clang__)
  55122. "muls r5, r6\n\t"
  55123. #else
  55124. "mul r5, r6\n\t"
  55125. #endif
  55126. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55127. "lsrs r6, r5, #15\n\t"
  55128. #else
  55129. "lsr r6, r5, #15\n\t"
  55130. #endif
  55131. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55132. "lsls r5, r5, #17\n\t"
  55133. #else
  55134. "lsl r5, r5, #17\n\t"
  55135. #endif
  55136. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55137. "adds r2, r2, r5\n\t"
  55138. #else
  55139. "add r2, r2, r5\n\t"
  55140. #endif
  55141. #ifdef WOLFSSL_KEIL
  55142. "adcs r3, r3, r6\n\t"
  55143. #elif defined(__clang__)
  55144. "adcs r3, r6\n\t"
  55145. #else
  55146. "adc r3, r6\n\t"
  55147. #endif
  55148. "str r2, [sp]\n\t"
  55149. "# A[1] * A[0]\n\t"
  55150. "movs r2, #0\n\t"
  55151. "mov %[a], r11\n\t"
  55152. "uxth r5, %[a]\n\t"
  55153. "uxth r6, r7\n\t"
  55154. #ifdef WOLFSSL_KEIL
  55155. "muls r6, r5, r6\n\t"
  55156. #elif defined(__clang__)
  55157. "muls r6, r5\n\t"
  55158. #else
  55159. "mul r6, r5\n\t"
  55160. #endif
  55161. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55162. "adds r3, r3, r6\n\t"
  55163. #else
  55164. "add r3, r3, r6\n\t"
  55165. #endif
  55166. #ifdef WOLFSSL_KEIL
  55167. "adcs r4, r4, %[r]\n\t"
  55168. #elif defined(__clang__)
  55169. "adcs r4, %[r]\n\t"
  55170. #else
  55171. "adc r4, %[r]\n\t"
  55172. #endif
  55173. #ifdef WOLFSSL_KEIL
  55174. "adcs r2, r2, %[r]\n\t"
  55175. #elif defined(__clang__)
  55176. "adcs r2, %[r]\n\t"
  55177. #else
  55178. "adc r2, %[r]\n\t"
  55179. #endif
  55180. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55181. "adds r3, r3, r6\n\t"
  55182. #else
  55183. "add r3, r3, r6\n\t"
  55184. #endif
  55185. #ifdef WOLFSSL_KEIL
  55186. "adcs r4, r4, %[r]\n\t"
  55187. #elif defined(__clang__)
  55188. "adcs r4, %[r]\n\t"
  55189. #else
  55190. "adc r4, %[r]\n\t"
  55191. #endif
  55192. #ifdef WOLFSSL_KEIL
  55193. "adcs r2, r2, %[r]\n\t"
  55194. #elif defined(__clang__)
  55195. "adcs r2, %[r]\n\t"
  55196. #else
  55197. "adc r2, %[r]\n\t"
  55198. #endif
  55199. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55200. "lsrs r6, r7, #16\n\t"
  55201. #else
  55202. "lsr r6, r7, #16\n\t"
  55203. #endif
  55204. #ifdef WOLFSSL_KEIL
  55205. "muls r5, r6, r5\n\t"
  55206. #elif defined(__clang__)
  55207. "muls r5, r6\n\t"
  55208. #else
  55209. "mul r5, r6\n\t"
  55210. #endif
  55211. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55212. "lsrs r6, r5, #16\n\t"
  55213. #else
  55214. "lsr r6, r5, #16\n\t"
  55215. #endif
  55216. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55217. "lsls r5, r5, #16\n\t"
  55218. #else
  55219. "lsl r5, r5, #16\n\t"
  55220. #endif
  55221. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55222. "adds r3, r3, r5\n\t"
  55223. #else
  55224. "add r3, r3, r5\n\t"
  55225. #endif
  55226. #ifdef WOLFSSL_KEIL
  55227. "adcs r4, r4, r6\n\t"
  55228. #elif defined(__clang__)
  55229. "adcs r4, r6\n\t"
  55230. #else
  55231. "adc r4, r6\n\t"
  55232. #endif
  55233. #ifdef WOLFSSL_KEIL
  55234. "adcs r2, r2, %[r]\n\t"
  55235. #elif defined(__clang__)
  55236. "adcs r2, %[r]\n\t"
  55237. #else
  55238. "adc r2, %[r]\n\t"
  55239. #endif
  55240. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55241. "adds r3, r3, r5\n\t"
  55242. #else
  55243. "add r3, r3, r5\n\t"
  55244. #endif
  55245. #ifdef WOLFSSL_KEIL
  55246. "adcs r4, r4, r6\n\t"
  55247. #elif defined(__clang__)
  55248. "adcs r4, r6\n\t"
  55249. #else
  55250. "adc r4, r6\n\t"
  55251. #endif
  55252. #ifdef WOLFSSL_KEIL
  55253. "adcs r2, r2, %[r]\n\t"
  55254. #elif defined(__clang__)
  55255. "adcs r2, %[r]\n\t"
  55256. #else
  55257. "adc r2, %[r]\n\t"
  55258. #endif
  55259. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55260. "lsrs r5, %[a], #16\n\t"
  55261. #else
  55262. "lsr r5, %[a], #16\n\t"
  55263. #endif
  55264. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55265. "lsrs r6, r7, #16\n\t"
  55266. #else
  55267. "lsr r6, r7, #16\n\t"
  55268. #endif
  55269. #ifdef WOLFSSL_KEIL
  55270. "muls r6, r5, r6\n\t"
  55271. #elif defined(__clang__)
  55272. "muls r6, r5\n\t"
  55273. #else
  55274. "mul r6, r5\n\t"
  55275. #endif
  55276. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55277. "adds r4, r4, r6\n\t"
  55278. #else
  55279. "add r4, r4, r6\n\t"
  55280. #endif
  55281. #ifdef WOLFSSL_KEIL
  55282. "adcs r2, r2, %[r]\n\t"
  55283. #elif defined(__clang__)
  55284. "adcs r2, %[r]\n\t"
  55285. #else
  55286. "adc r2, %[r]\n\t"
  55287. #endif
  55288. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55289. "adds r4, r4, r6\n\t"
  55290. #else
  55291. "add r4, r4, r6\n\t"
  55292. #endif
  55293. #ifdef WOLFSSL_KEIL
  55294. "adcs r2, r2, %[r]\n\t"
  55295. #elif defined(__clang__)
  55296. "adcs r2, %[r]\n\t"
  55297. #else
  55298. "adc r2, %[r]\n\t"
  55299. #endif
  55300. "uxth r6, r7\n\t"
  55301. #ifdef WOLFSSL_KEIL
  55302. "muls r5, r6, r5\n\t"
  55303. #elif defined(__clang__)
  55304. "muls r5, r6\n\t"
  55305. #else
  55306. "mul r5, r6\n\t"
  55307. #endif
  55308. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55309. "lsrs r6, r5, #16\n\t"
  55310. #else
  55311. "lsr r6, r5, #16\n\t"
  55312. #endif
  55313. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55314. "lsls r5, r5, #16\n\t"
  55315. #else
  55316. "lsl r5, r5, #16\n\t"
  55317. #endif
  55318. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55319. "adds r3, r3, r5\n\t"
  55320. #else
  55321. "add r3, r3, r5\n\t"
  55322. #endif
  55323. #ifdef WOLFSSL_KEIL
  55324. "adcs r4, r4, r6\n\t"
  55325. #elif defined(__clang__)
  55326. "adcs r4, r6\n\t"
  55327. #else
  55328. "adc r4, r6\n\t"
  55329. #endif
  55330. #ifdef WOLFSSL_KEIL
  55331. "adcs r2, r2, %[r]\n\t"
  55332. #elif defined(__clang__)
  55333. "adcs r2, %[r]\n\t"
  55334. #else
  55335. "adc r2, %[r]\n\t"
  55336. #endif
  55337. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55338. "adds r3, r3, r5\n\t"
  55339. #else
  55340. "add r3, r3, r5\n\t"
  55341. #endif
  55342. #ifdef WOLFSSL_KEIL
  55343. "adcs r4, r4, r6\n\t"
  55344. #elif defined(__clang__)
  55345. "adcs r4, r6\n\t"
  55346. #else
  55347. "adc r4, r6\n\t"
  55348. #endif
  55349. #ifdef WOLFSSL_KEIL
  55350. "adcs r2, r2, %[r]\n\t"
  55351. #elif defined(__clang__)
  55352. "adcs r2, %[r]\n\t"
  55353. #else
  55354. "adc r2, %[r]\n\t"
  55355. #endif
  55356. "str r3, [sp, #4]\n\t"
  55357. "# A[2] * A[0]\n\t"
  55358. "movs r3, #0\n\t"
  55359. "mov %[a], r9\n\t"
  55360. "mov %[a], r12\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 r4, r4, r6\n\t"
  55372. #else
  55373. "add r4, r4, r6\n\t"
  55374. #endif
  55375. #ifdef WOLFSSL_KEIL
  55376. "adcs r2, r2, %[r]\n\t"
  55377. #elif defined(__clang__)
  55378. "adcs r2, %[r]\n\t"
  55379. #else
  55380. "adc r2, %[r]\n\t"
  55381. #endif
  55382. #ifdef WOLFSSL_KEIL
  55383. "adcs r3, r3, %[r]\n\t"
  55384. #elif defined(__clang__)
  55385. "adcs r3, %[r]\n\t"
  55386. #else
  55387. "adc r3, %[r]\n\t"
  55388. #endif
  55389. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55390. "adds r4, r4, r6\n\t"
  55391. #else
  55392. "add r4, r4, r6\n\t"
  55393. #endif
  55394. #ifdef WOLFSSL_KEIL
  55395. "adcs r2, r2, %[r]\n\t"
  55396. #elif defined(__clang__)
  55397. "adcs r2, %[r]\n\t"
  55398. #else
  55399. "adc r2, %[r]\n\t"
  55400. #endif
  55401. #ifdef WOLFSSL_KEIL
  55402. "adcs r3, r3, %[r]\n\t"
  55403. #elif defined(__clang__)
  55404. "adcs r3, %[r]\n\t"
  55405. #else
  55406. "adc r3, %[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 r4, r4, r5\n\t"
  55432. #else
  55433. "add r4, r4, r5\n\t"
  55434. #endif
  55435. #ifdef WOLFSSL_KEIL
  55436. "adcs r2, r2, r6\n\t"
  55437. #elif defined(__clang__)
  55438. "adcs r2, r6\n\t"
  55439. #else
  55440. "adc r2, r6\n\t"
  55441. #endif
  55442. #ifdef WOLFSSL_KEIL
  55443. "adcs r3, r3, %[r]\n\t"
  55444. #elif defined(__clang__)
  55445. "adcs r3, %[r]\n\t"
  55446. #else
  55447. "adc r3, %[r]\n\t"
  55448. #endif
  55449. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55450. "adds r4, r4, r5\n\t"
  55451. #else
  55452. "add r4, r4, r5\n\t"
  55453. #endif
  55454. #ifdef WOLFSSL_KEIL
  55455. "adcs r2, r2, r6\n\t"
  55456. #elif defined(__clang__)
  55457. "adcs r2, r6\n\t"
  55458. #else
  55459. "adc r2, r6\n\t"
  55460. #endif
  55461. #ifdef WOLFSSL_KEIL
  55462. "adcs r3, r3, %[r]\n\t"
  55463. #elif defined(__clang__)
  55464. "adcs r3, %[r]\n\t"
  55465. #else
  55466. "adc r3, %[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 r2, r2, r6\n\t"
  55487. #else
  55488. "add r2, r2, r6\n\t"
  55489. #endif
  55490. #ifdef WOLFSSL_KEIL
  55491. "adcs r3, r3, %[r]\n\t"
  55492. #elif defined(__clang__)
  55493. "adcs r3, %[r]\n\t"
  55494. #else
  55495. "adc r3, %[r]\n\t"
  55496. #endif
  55497. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55498. "adds r2, r2, r6\n\t"
  55499. #else
  55500. "add r2, r2, r6\n\t"
  55501. #endif
  55502. #ifdef WOLFSSL_KEIL
  55503. "adcs r3, r3, %[r]\n\t"
  55504. #elif defined(__clang__)
  55505. "adcs r3, %[r]\n\t"
  55506. #else
  55507. "adc r3, %[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 r4, r4, r5\n\t"
  55529. #else
  55530. "add r4, r4, r5\n\t"
  55531. #endif
  55532. #ifdef WOLFSSL_KEIL
  55533. "adcs r2, r2, r6\n\t"
  55534. #elif defined(__clang__)
  55535. "adcs r2, r6\n\t"
  55536. #else
  55537. "adc r2, r6\n\t"
  55538. #endif
  55539. #ifdef WOLFSSL_KEIL
  55540. "adcs r3, r3, %[r]\n\t"
  55541. #elif defined(__clang__)
  55542. "adcs r3, %[r]\n\t"
  55543. #else
  55544. "adc r3, %[r]\n\t"
  55545. #endif
  55546. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55547. "adds r4, r4, r5\n\t"
  55548. #else
  55549. "add r4, r4, r5\n\t"
  55550. #endif
  55551. #ifdef WOLFSSL_KEIL
  55552. "adcs r2, r2, r6\n\t"
  55553. #elif defined(__clang__)
  55554. "adcs r2, r6\n\t"
  55555. #else
  55556. "adc r2, r6\n\t"
  55557. #endif
  55558. #ifdef WOLFSSL_KEIL
  55559. "adcs r3, r3, %[r]\n\t"
  55560. #elif defined(__clang__)
  55561. "adcs r3, %[r]\n\t"
  55562. #else
  55563. "adc r3, %[r]\n\t"
  55564. #endif
  55565. "# A[1] * A[1]\n\t"
  55566. "mov r7, r11\n\t"
  55567. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55568. "lsrs r6, r7, #16\n\t"
  55569. #else
  55570. "lsr r6, r7, #16\n\t"
  55571. #endif
  55572. "uxth r5, r7\n\t"
  55573. #ifdef WOLFSSL_KEIL
  55574. "muls r5, r5, r5\n\t"
  55575. #elif defined(__clang__)
  55576. "muls r5, r5\n\t"
  55577. #else
  55578. "mul r5, r5\n\t"
  55579. #endif
  55580. #ifdef WOLFSSL_KEIL
  55581. "muls r6, r6, r6\n\t"
  55582. #elif defined(__clang__)
  55583. "muls r6, r6\n\t"
  55584. #else
  55585. "mul r6, r6\n\t"
  55586. #endif
  55587. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55588. "adds r4, r4, r5\n\t"
  55589. #else
  55590. "add r4, r4, r5\n\t"
  55591. #endif
  55592. #ifdef WOLFSSL_KEIL
  55593. "adcs r2, r2, r6\n\t"
  55594. #elif defined(__clang__)
  55595. "adcs r2, r6\n\t"
  55596. #else
  55597. "adc r2, r6\n\t"
  55598. #endif
  55599. #ifdef WOLFSSL_KEIL
  55600. "adcs r3, r3, %[r]\n\t"
  55601. #elif defined(__clang__)
  55602. "adcs r3, %[r]\n\t"
  55603. #else
  55604. "adc r3, %[r]\n\t"
  55605. #endif
  55606. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55607. "lsrs r6, r7, #16\n\t"
  55608. #else
  55609. "lsr r6, r7, #16\n\t"
  55610. #endif
  55611. "uxth r5, r7\n\t"
  55612. #ifdef WOLFSSL_KEIL
  55613. "muls r5, r6, r5\n\t"
  55614. #elif defined(__clang__)
  55615. "muls r5, r6\n\t"
  55616. #else
  55617. "mul r5, r6\n\t"
  55618. #endif
  55619. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55620. "lsrs r6, r5, #15\n\t"
  55621. #else
  55622. "lsr r6, r5, #15\n\t"
  55623. #endif
  55624. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55625. "lsls r5, r5, #17\n\t"
  55626. #else
  55627. "lsl r5, r5, #17\n\t"
  55628. #endif
  55629. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55630. "adds r4, r4, r5\n\t"
  55631. #else
  55632. "add r4, r4, r5\n\t"
  55633. #endif
  55634. #ifdef WOLFSSL_KEIL
  55635. "adcs r2, r2, r6\n\t"
  55636. #elif defined(__clang__)
  55637. "adcs r2, r6\n\t"
  55638. #else
  55639. "adc r2, r6\n\t"
  55640. #endif
  55641. #ifdef WOLFSSL_KEIL
  55642. "adcs r3, r3, %[r]\n\t"
  55643. #elif defined(__clang__)
  55644. "adcs r3, %[r]\n\t"
  55645. #else
  55646. "adc r3, %[r]\n\t"
  55647. #endif
  55648. "str r4, [sp, #8]\n\t"
  55649. "# A[2] * A[1]\n\t"
  55650. "movs r4, #0\n\t"
  55651. "mov %[a], r9\n\t"
  55652. "mov %[a], r12\n\t"
  55653. "uxth r5, %[a]\n\t"
  55654. "uxth r6, r7\n\t"
  55655. #ifdef WOLFSSL_KEIL
  55656. "muls r6, r5, r6\n\t"
  55657. #elif defined(__clang__)
  55658. "muls r6, r5\n\t"
  55659. #else
  55660. "mul r6, r5\n\t"
  55661. #endif
  55662. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55663. "adds r2, r2, r6\n\t"
  55664. #else
  55665. "add r2, r2, r6\n\t"
  55666. #endif
  55667. #ifdef WOLFSSL_KEIL
  55668. "adcs r3, r3, %[r]\n\t"
  55669. #elif defined(__clang__)
  55670. "adcs r3, %[r]\n\t"
  55671. #else
  55672. "adc r3, %[r]\n\t"
  55673. #endif
  55674. #ifdef WOLFSSL_KEIL
  55675. "adcs r4, r4, %[r]\n\t"
  55676. #elif defined(__clang__)
  55677. "adcs r4, %[r]\n\t"
  55678. #else
  55679. "adc r4, %[r]\n\t"
  55680. #endif
  55681. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55682. "adds r2, r2, r6\n\t"
  55683. #else
  55684. "add r2, r2, r6\n\t"
  55685. #endif
  55686. #ifdef WOLFSSL_KEIL
  55687. "adcs r3, r3, %[r]\n\t"
  55688. #elif defined(__clang__)
  55689. "adcs r3, %[r]\n\t"
  55690. #else
  55691. "adc r3, %[r]\n\t"
  55692. #endif
  55693. #ifdef WOLFSSL_KEIL
  55694. "adcs r4, r4, %[r]\n\t"
  55695. #elif defined(__clang__)
  55696. "adcs r4, %[r]\n\t"
  55697. #else
  55698. "adc r4, %[r]\n\t"
  55699. #endif
  55700. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55701. "lsrs r6, r7, #16\n\t"
  55702. #else
  55703. "lsr r6, r7, #16\n\t"
  55704. #endif
  55705. #ifdef WOLFSSL_KEIL
  55706. "muls r5, r6, r5\n\t"
  55707. #elif defined(__clang__)
  55708. "muls r5, r6\n\t"
  55709. #else
  55710. "mul r5, r6\n\t"
  55711. #endif
  55712. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55713. "lsrs r6, r5, #16\n\t"
  55714. #else
  55715. "lsr r6, r5, #16\n\t"
  55716. #endif
  55717. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55718. "lsls r5, r5, #16\n\t"
  55719. #else
  55720. "lsl r5, r5, #16\n\t"
  55721. #endif
  55722. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55723. "adds r2, r2, r5\n\t"
  55724. #else
  55725. "add r2, r2, r5\n\t"
  55726. #endif
  55727. #ifdef WOLFSSL_KEIL
  55728. "adcs r3, r3, r6\n\t"
  55729. #elif defined(__clang__)
  55730. "adcs r3, r6\n\t"
  55731. #else
  55732. "adc r3, r6\n\t"
  55733. #endif
  55734. #ifdef WOLFSSL_KEIL
  55735. "adcs r4, r4, %[r]\n\t"
  55736. #elif defined(__clang__)
  55737. "adcs r4, %[r]\n\t"
  55738. #else
  55739. "adc r4, %[r]\n\t"
  55740. #endif
  55741. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55742. "adds r2, r2, r5\n\t"
  55743. #else
  55744. "add r2, r2, r5\n\t"
  55745. #endif
  55746. #ifdef WOLFSSL_KEIL
  55747. "adcs r3, r3, r6\n\t"
  55748. #elif defined(__clang__)
  55749. "adcs r3, r6\n\t"
  55750. #else
  55751. "adc r3, r6\n\t"
  55752. #endif
  55753. #ifdef WOLFSSL_KEIL
  55754. "adcs r4, r4, %[r]\n\t"
  55755. #elif defined(__clang__)
  55756. "adcs r4, %[r]\n\t"
  55757. #else
  55758. "adc r4, %[r]\n\t"
  55759. #endif
  55760. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55761. "lsrs r5, %[a], #16\n\t"
  55762. #else
  55763. "lsr r5, %[a], #16\n\t"
  55764. #endif
  55765. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55766. "lsrs r6, r7, #16\n\t"
  55767. #else
  55768. "lsr r6, r7, #16\n\t"
  55769. #endif
  55770. #ifdef WOLFSSL_KEIL
  55771. "muls r6, r5, r6\n\t"
  55772. #elif defined(__clang__)
  55773. "muls r6, r5\n\t"
  55774. #else
  55775. "mul r6, r5\n\t"
  55776. #endif
  55777. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55778. "adds r3, r3, r6\n\t"
  55779. #else
  55780. "add r3, r3, r6\n\t"
  55781. #endif
  55782. #ifdef WOLFSSL_KEIL
  55783. "adcs r4, r4, %[r]\n\t"
  55784. #elif defined(__clang__)
  55785. "adcs r4, %[r]\n\t"
  55786. #else
  55787. "adc r4, %[r]\n\t"
  55788. #endif
  55789. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55790. "adds r3, r3, r6\n\t"
  55791. #else
  55792. "add r3, r3, r6\n\t"
  55793. #endif
  55794. #ifdef WOLFSSL_KEIL
  55795. "adcs r4, r4, %[r]\n\t"
  55796. #elif defined(__clang__)
  55797. "adcs r4, %[r]\n\t"
  55798. #else
  55799. "adc r4, %[r]\n\t"
  55800. #endif
  55801. "uxth r6, r7\n\t"
  55802. #ifdef WOLFSSL_KEIL
  55803. "muls r5, r6, r5\n\t"
  55804. #elif defined(__clang__)
  55805. "muls r5, r6\n\t"
  55806. #else
  55807. "mul r5, r6\n\t"
  55808. #endif
  55809. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55810. "lsrs r6, r5, #16\n\t"
  55811. #else
  55812. "lsr r6, r5, #16\n\t"
  55813. #endif
  55814. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55815. "lsls r5, r5, #16\n\t"
  55816. #else
  55817. "lsl r5, r5, #16\n\t"
  55818. #endif
  55819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55820. "adds r2, r2, r5\n\t"
  55821. #else
  55822. "add r2, r2, r5\n\t"
  55823. #endif
  55824. #ifdef WOLFSSL_KEIL
  55825. "adcs r3, r3, r6\n\t"
  55826. #elif defined(__clang__)
  55827. "adcs r3, r6\n\t"
  55828. #else
  55829. "adc r3, r6\n\t"
  55830. #endif
  55831. #ifdef WOLFSSL_KEIL
  55832. "adcs r4, r4, %[r]\n\t"
  55833. #elif defined(__clang__)
  55834. "adcs r4, %[r]\n\t"
  55835. #else
  55836. "adc r4, %[r]\n\t"
  55837. #endif
  55838. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55839. "adds r2, r2, r5\n\t"
  55840. #else
  55841. "add r2, r2, r5\n\t"
  55842. #endif
  55843. #ifdef WOLFSSL_KEIL
  55844. "adcs r3, r3, r6\n\t"
  55845. #elif defined(__clang__)
  55846. "adcs r3, r6\n\t"
  55847. #else
  55848. "adc r3, r6\n\t"
  55849. #endif
  55850. #ifdef WOLFSSL_KEIL
  55851. "adcs r4, r4, %[r]\n\t"
  55852. #elif defined(__clang__)
  55853. "adcs r4, %[r]\n\t"
  55854. #else
  55855. "adc r4, %[r]\n\t"
  55856. #endif
  55857. "# A[3] * A[0]\n\t"
  55858. "mov %[a], r9\n\t"
  55859. "mov r7, r10\n\t"
  55860. "mov %[a], lr\n\t"
  55861. "uxth r5, %[a]\n\t"
  55862. "uxth r6, r7\n\t"
  55863. #ifdef WOLFSSL_KEIL
  55864. "muls r6, r5, r6\n\t"
  55865. #elif defined(__clang__)
  55866. "muls r6, r5\n\t"
  55867. #else
  55868. "mul r6, r5\n\t"
  55869. #endif
  55870. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55871. "adds r2, r2, r6\n\t"
  55872. #else
  55873. "add r2, r2, r6\n\t"
  55874. #endif
  55875. #ifdef WOLFSSL_KEIL
  55876. "adcs r3, r3, %[r]\n\t"
  55877. #elif defined(__clang__)
  55878. "adcs r3, %[r]\n\t"
  55879. #else
  55880. "adc r3, %[r]\n\t"
  55881. #endif
  55882. #ifdef WOLFSSL_KEIL
  55883. "adcs r4, r4, %[r]\n\t"
  55884. #elif defined(__clang__)
  55885. "adcs r4, %[r]\n\t"
  55886. #else
  55887. "adc r4, %[r]\n\t"
  55888. #endif
  55889. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55890. "adds r2, r2, r6\n\t"
  55891. #else
  55892. "add r2, r2, r6\n\t"
  55893. #endif
  55894. #ifdef WOLFSSL_KEIL
  55895. "adcs r3, r3, %[r]\n\t"
  55896. #elif defined(__clang__)
  55897. "adcs r3, %[r]\n\t"
  55898. #else
  55899. "adc r3, %[r]\n\t"
  55900. #endif
  55901. #ifdef WOLFSSL_KEIL
  55902. "adcs r4, r4, %[r]\n\t"
  55903. #elif defined(__clang__)
  55904. "adcs r4, %[r]\n\t"
  55905. #else
  55906. "adc r4, %[r]\n\t"
  55907. #endif
  55908. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55909. "lsrs r6, r7, #16\n\t"
  55910. #else
  55911. "lsr r6, r7, #16\n\t"
  55912. #endif
  55913. #ifdef WOLFSSL_KEIL
  55914. "muls r5, r6, r5\n\t"
  55915. #elif defined(__clang__)
  55916. "muls r5, r6\n\t"
  55917. #else
  55918. "mul r5, r6\n\t"
  55919. #endif
  55920. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55921. "lsrs r6, r5, #16\n\t"
  55922. #else
  55923. "lsr r6, r5, #16\n\t"
  55924. #endif
  55925. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55926. "lsls r5, r5, #16\n\t"
  55927. #else
  55928. "lsl r5, r5, #16\n\t"
  55929. #endif
  55930. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55931. "adds r2, r2, r5\n\t"
  55932. #else
  55933. "add r2, r2, r5\n\t"
  55934. #endif
  55935. #ifdef WOLFSSL_KEIL
  55936. "adcs r3, r3, r6\n\t"
  55937. #elif defined(__clang__)
  55938. "adcs r3, r6\n\t"
  55939. #else
  55940. "adc r3, r6\n\t"
  55941. #endif
  55942. #ifdef WOLFSSL_KEIL
  55943. "adcs r4, r4, %[r]\n\t"
  55944. #elif defined(__clang__)
  55945. "adcs r4, %[r]\n\t"
  55946. #else
  55947. "adc r4, %[r]\n\t"
  55948. #endif
  55949. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55950. "adds r2, r2, r5\n\t"
  55951. #else
  55952. "add r2, r2, r5\n\t"
  55953. #endif
  55954. #ifdef WOLFSSL_KEIL
  55955. "adcs r3, r3, r6\n\t"
  55956. #elif defined(__clang__)
  55957. "adcs r3, r6\n\t"
  55958. #else
  55959. "adc r3, r6\n\t"
  55960. #endif
  55961. #ifdef WOLFSSL_KEIL
  55962. "adcs r4, r4, %[r]\n\t"
  55963. #elif defined(__clang__)
  55964. "adcs r4, %[r]\n\t"
  55965. #else
  55966. "adc r4, %[r]\n\t"
  55967. #endif
  55968. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55969. "lsrs r5, %[a], #16\n\t"
  55970. #else
  55971. "lsr r5, %[a], #16\n\t"
  55972. #endif
  55973. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55974. "lsrs r6, r7, #16\n\t"
  55975. #else
  55976. "lsr r6, r7, #16\n\t"
  55977. #endif
  55978. #ifdef WOLFSSL_KEIL
  55979. "muls r6, r5, r6\n\t"
  55980. #elif defined(__clang__)
  55981. "muls r6, r5\n\t"
  55982. #else
  55983. "mul r6, r5\n\t"
  55984. #endif
  55985. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55986. "adds r3, r3, r6\n\t"
  55987. #else
  55988. "add r3, r3, r6\n\t"
  55989. #endif
  55990. #ifdef WOLFSSL_KEIL
  55991. "adcs r4, r4, %[r]\n\t"
  55992. #elif defined(__clang__)
  55993. "adcs r4, %[r]\n\t"
  55994. #else
  55995. "adc r4, %[r]\n\t"
  55996. #endif
  55997. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55998. "adds r3, r3, r6\n\t"
  55999. #else
  56000. "add r3, r3, r6\n\t"
  56001. #endif
  56002. #ifdef WOLFSSL_KEIL
  56003. "adcs r4, r4, %[r]\n\t"
  56004. #elif defined(__clang__)
  56005. "adcs r4, %[r]\n\t"
  56006. #else
  56007. "adc r4, %[r]\n\t"
  56008. #endif
  56009. "uxth r6, r7\n\t"
  56010. #ifdef WOLFSSL_KEIL
  56011. "muls r5, r6, r5\n\t"
  56012. #elif defined(__clang__)
  56013. "muls r5, r6\n\t"
  56014. #else
  56015. "mul r5, r6\n\t"
  56016. #endif
  56017. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56018. "lsrs r6, r5, #16\n\t"
  56019. #else
  56020. "lsr r6, r5, #16\n\t"
  56021. #endif
  56022. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56023. "lsls r5, r5, #16\n\t"
  56024. #else
  56025. "lsl r5, r5, #16\n\t"
  56026. #endif
  56027. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56028. "adds r2, r2, r5\n\t"
  56029. #else
  56030. "add r2, r2, r5\n\t"
  56031. #endif
  56032. #ifdef WOLFSSL_KEIL
  56033. "adcs r3, r3, r6\n\t"
  56034. #elif defined(__clang__)
  56035. "adcs r3, r6\n\t"
  56036. #else
  56037. "adc r3, r6\n\t"
  56038. #endif
  56039. #ifdef WOLFSSL_KEIL
  56040. "adcs r4, r4, %[r]\n\t"
  56041. #elif defined(__clang__)
  56042. "adcs r4, %[r]\n\t"
  56043. #else
  56044. "adc r4, %[r]\n\t"
  56045. #endif
  56046. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56047. "adds r2, r2, r5\n\t"
  56048. #else
  56049. "add r2, r2, r5\n\t"
  56050. #endif
  56051. #ifdef WOLFSSL_KEIL
  56052. "adcs r3, r3, r6\n\t"
  56053. #elif defined(__clang__)
  56054. "adcs r3, r6\n\t"
  56055. #else
  56056. "adc r3, r6\n\t"
  56057. #endif
  56058. #ifdef WOLFSSL_KEIL
  56059. "adcs r4, r4, %[r]\n\t"
  56060. #elif defined(__clang__)
  56061. "adcs r4, %[r]\n\t"
  56062. #else
  56063. "adc r4, %[r]\n\t"
  56064. #endif
  56065. "str r2, [sp, #12]\n\t"
  56066. "# A[4] * A[0]\n\t"
  56067. "movs r2, #0\n\t"
  56068. "mov %[a], r9\n\t"
  56069. "ldr %[a], [%[a], #16]\n\t"
  56070. "uxth r5, %[a]\n\t"
  56071. "uxth r6, r7\n\t"
  56072. #ifdef WOLFSSL_KEIL
  56073. "muls r6, r5, r6\n\t"
  56074. #elif defined(__clang__)
  56075. "muls r6, r5\n\t"
  56076. #else
  56077. "mul r6, r5\n\t"
  56078. #endif
  56079. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56080. "adds r3, r3, r6\n\t"
  56081. #else
  56082. "add r3, r3, r6\n\t"
  56083. #endif
  56084. #ifdef WOLFSSL_KEIL
  56085. "adcs r4, r4, %[r]\n\t"
  56086. #elif defined(__clang__)
  56087. "adcs r4, %[r]\n\t"
  56088. #else
  56089. "adc r4, %[r]\n\t"
  56090. #endif
  56091. #ifdef WOLFSSL_KEIL
  56092. "adcs r2, r2, %[r]\n\t"
  56093. #elif defined(__clang__)
  56094. "adcs r2, %[r]\n\t"
  56095. #else
  56096. "adc r2, %[r]\n\t"
  56097. #endif
  56098. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56099. "adds r3, r3, r6\n\t"
  56100. #else
  56101. "add r3, r3, r6\n\t"
  56102. #endif
  56103. #ifdef WOLFSSL_KEIL
  56104. "adcs r4, r4, %[r]\n\t"
  56105. #elif defined(__clang__)
  56106. "adcs r4, %[r]\n\t"
  56107. #else
  56108. "adc r4, %[r]\n\t"
  56109. #endif
  56110. #ifdef WOLFSSL_KEIL
  56111. "adcs r2, r2, %[r]\n\t"
  56112. #elif defined(__clang__)
  56113. "adcs r2, %[r]\n\t"
  56114. #else
  56115. "adc r2, %[r]\n\t"
  56116. #endif
  56117. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56118. "lsrs r6, r7, #16\n\t"
  56119. #else
  56120. "lsr r6, r7, #16\n\t"
  56121. #endif
  56122. #ifdef WOLFSSL_KEIL
  56123. "muls r5, r6, r5\n\t"
  56124. #elif defined(__clang__)
  56125. "muls r5, r6\n\t"
  56126. #else
  56127. "mul r5, r6\n\t"
  56128. #endif
  56129. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56130. "lsrs r6, r5, #16\n\t"
  56131. #else
  56132. "lsr r6, r5, #16\n\t"
  56133. #endif
  56134. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56135. "lsls r5, r5, #16\n\t"
  56136. #else
  56137. "lsl r5, r5, #16\n\t"
  56138. #endif
  56139. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56140. "adds r3, r3, r5\n\t"
  56141. #else
  56142. "add r3, r3, r5\n\t"
  56143. #endif
  56144. #ifdef WOLFSSL_KEIL
  56145. "adcs r4, r4, r6\n\t"
  56146. #elif defined(__clang__)
  56147. "adcs r4, r6\n\t"
  56148. #else
  56149. "adc r4, r6\n\t"
  56150. #endif
  56151. #ifdef WOLFSSL_KEIL
  56152. "adcs r2, r2, %[r]\n\t"
  56153. #elif defined(__clang__)
  56154. "adcs r2, %[r]\n\t"
  56155. #else
  56156. "adc r2, %[r]\n\t"
  56157. #endif
  56158. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56159. "adds r3, r3, r5\n\t"
  56160. #else
  56161. "add r3, r3, r5\n\t"
  56162. #endif
  56163. #ifdef WOLFSSL_KEIL
  56164. "adcs r4, r4, r6\n\t"
  56165. #elif defined(__clang__)
  56166. "adcs r4, r6\n\t"
  56167. #else
  56168. "adc r4, r6\n\t"
  56169. #endif
  56170. #ifdef WOLFSSL_KEIL
  56171. "adcs r2, r2, %[r]\n\t"
  56172. #elif defined(__clang__)
  56173. "adcs r2, %[r]\n\t"
  56174. #else
  56175. "adc r2, %[r]\n\t"
  56176. #endif
  56177. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56178. "lsrs r5, %[a], #16\n\t"
  56179. #else
  56180. "lsr r5, %[a], #16\n\t"
  56181. #endif
  56182. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56183. "lsrs r6, r7, #16\n\t"
  56184. #else
  56185. "lsr r6, r7, #16\n\t"
  56186. #endif
  56187. #ifdef WOLFSSL_KEIL
  56188. "muls r6, r5, r6\n\t"
  56189. #elif defined(__clang__)
  56190. "muls r6, r5\n\t"
  56191. #else
  56192. "mul r6, r5\n\t"
  56193. #endif
  56194. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56195. "adds r4, r4, r6\n\t"
  56196. #else
  56197. "add r4, r4, r6\n\t"
  56198. #endif
  56199. #ifdef WOLFSSL_KEIL
  56200. "adcs r2, r2, %[r]\n\t"
  56201. #elif defined(__clang__)
  56202. "adcs r2, %[r]\n\t"
  56203. #else
  56204. "adc r2, %[r]\n\t"
  56205. #endif
  56206. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56207. "adds r4, r4, r6\n\t"
  56208. #else
  56209. "add r4, r4, r6\n\t"
  56210. #endif
  56211. #ifdef WOLFSSL_KEIL
  56212. "adcs r2, r2, %[r]\n\t"
  56213. #elif defined(__clang__)
  56214. "adcs r2, %[r]\n\t"
  56215. #else
  56216. "adc r2, %[r]\n\t"
  56217. #endif
  56218. "uxth r6, r7\n\t"
  56219. #ifdef WOLFSSL_KEIL
  56220. "muls r5, r6, r5\n\t"
  56221. #elif defined(__clang__)
  56222. "muls r5, r6\n\t"
  56223. #else
  56224. "mul r5, r6\n\t"
  56225. #endif
  56226. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56227. "lsrs r6, r5, #16\n\t"
  56228. #else
  56229. "lsr r6, r5, #16\n\t"
  56230. #endif
  56231. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56232. "lsls r5, r5, #16\n\t"
  56233. #else
  56234. "lsl r5, r5, #16\n\t"
  56235. #endif
  56236. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56237. "adds r3, r3, r5\n\t"
  56238. #else
  56239. "add r3, r3, r5\n\t"
  56240. #endif
  56241. #ifdef WOLFSSL_KEIL
  56242. "adcs r4, r4, r6\n\t"
  56243. #elif defined(__clang__)
  56244. "adcs r4, r6\n\t"
  56245. #else
  56246. "adc r4, r6\n\t"
  56247. #endif
  56248. #ifdef WOLFSSL_KEIL
  56249. "adcs r2, r2, %[r]\n\t"
  56250. #elif defined(__clang__)
  56251. "adcs r2, %[r]\n\t"
  56252. #else
  56253. "adc r2, %[r]\n\t"
  56254. #endif
  56255. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56256. "adds r3, r3, r5\n\t"
  56257. #else
  56258. "add r3, r3, r5\n\t"
  56259. #endif
  56260. #ifdef WOLFSSL_KEIL
  56261. "adcs r4, r4, r6\n\t"
  56262. #elif defined(__clang__)
  56263. "adcs r4, r6\n\t"
  56264. #else
  56265. "adc r4, r6\n\t"
  56266. #endif
  56267. #ifdef WOLFSSL_KEIL
  56268. "adcs r2, r2, %[r]\n\t"
  56269. #elif defined(__clang__)
  56270. "adcs r2, %[r]\n\t"
  56271. #else
  56272. "adc r2, %[r]\n\t"
  56273. #endif
  56274. "# A[3] * A[1]\n\t"
  56275. "mov %[a], r9\n\t"
  56276. "mov r7, r11\n\t"
  56277. "mov %[a], lr\n\t"
  56278. "uxth r5, %[a]\n\t"
  56279. "uxth r6, r7\n\t"
  56280. #ifdef WOLFSSL_KEIL
  56281. "muls r6, r5, r6\n\t"
  56282. #elif defined(__clang__)
  56283. "muls r6, r5\n\t"
  56284. #else
  56285. "mul r6, r5\n\t"
  56286. #endif
  56287. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56288. "adds r3, r3, r6\n\t"
  56289. #else
  56290. "add r3, r3, r6\n\t"
  56291. #endif
  56292. #ifdef WOLFSSL_KEIL
  56293. "adcs r4, r4, %[r]\n\t"
  56294. #elif defined(__clang__)
  56295. "adcs r4, %[r]\n\t"
  56296. #else
  56297. "adc r4, %[r]\n\t"
  56298. #endif
  56299. #ifdef WOLFSSL_KEIL
  56300. "adcs r2, r2, %[r]\n\t"
  56301. #elif defined(__clang__)
  56302. "adcs r2, %[r]\n\t"
  56303. #else
  56304. "adc r2, %[r]\n\t"
  56305. #endif
  56306. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56307. "adds r3, r3, r6\n\t"
  56308. #else
  56309. "add r3, r3, r6\n\t"
  56310. #endif
  56311. #ifdef WOLFSSL_KEIL
  56312. "adcs r4, r4, %[r]\n\t"
  56313. #elif defined(__clang__)
  56314. "adcs r4, %[r]\n\t"
  56315. #else
  56316. "adc r4, %[r]\n\t"
  56317. #endif
  56318. #ifdef WOLFSSL_KEIL
  56319. "adcs r2, r2, %[r]\n\t"
  56320. #elif defined(__clang__)
  56321. "adcs r2, %[r]\n\t"
  56322. #else
  56323. "adc r2, %[r]\n\t"
  56324. #endif
  56325. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56326. "lsrs r6, r7, #16\n\t"
  56327. #else
  56328. "lsr r6, r7, #16\n\t"
  56329. #endif
  56330. #ifdef WOLFSSL_KEIL
  56331. "muls r5, r6, r5\n\t"
  56332. #elif defined(__clang__)
  56333. "muls r5, r6\n\t"
  56334. #else
  56335. "mul r5, r6\n\t"
  56336. #endif
  56337. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56338. "lsrs r6, r5, #16\n\t"
  56339. #else
  56340. "lsr r6, r5, #16\n\t"
  56341. #endif
  56342. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56343. "lsls r5, r5, #16\n\t"
  56344. #else
  56345. "lsl r5, r5, #16\n\t"
  56346. #endif
  56347. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56348. "adds r3, r3, r5\n\t"
  56349. #else
  56350. "add r3, r3, r5\n\t"
  56351. #endif
  56352. #ifdef WOLFSSL_KEIL
  56353. "adcs r4, r4, r6\n\t"
  56354. #elif defined(__clang__)
  56355. "adcs r4, r6\n\t"
  56356. #else
  56357. "adc r4, r6\n\t"
  56358. #endif
  56359. #ifdef WOLFSSL_KEIL
  56360. "adcs r2, r2, %[r]\n\t"
  56361. #elif defined(__clang__)
  56362. "adcs r2, %[r]\n\t"
  56363. #else
  56364. "adc r2, %[r]\n\t"
  56365. #endif
  56366. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56367. "adds r3, r3, r5\n\t"
  56368. #else
  56369. "add r3, r3, r5\n\t"
  56370. #endif
  56371. #ifdef WOLFSSL_KEIL
  56372. "adcs r4, r4, r6\n\t"
  56373. #elif defined(__clang__)
  56374. "adcs r4, r6\n\t"
  56375. #else
  56376. "adc r4, r6\n\t"
  56377. #endif
  56378. #ifdef WOLFSSL_KEIL
  56379. "adcs r2, r2, %[r]\n\t"
  56380. #elif defined(__clang__)
  56381. "adcs r2, %[r]\n\t"
  56382. #else
  56383. "adc r2, %[r]\n\t"
  56384. #endif
  56385. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56386. "lsrs r5, %[a], #16\n\t"
  56387. #else
  56388. "lsr r5, %[a], #16\n\t"
  56389. #endif
  56390. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56391. "lsrs r6, r7, #16\n\t"
  56392. #else
  56393. "lsr r6, r7, #16\n\t"
  56394. #endif
  56395. #ifdef WOLFSSL_KEIL
  56396. "muls r6, r5, r6\n\t"
  56397. #elif defined(__clang__)
  56398. "muls r6, r5\n\t"
  56399. #else
  56400. "mul r6, r5\n\t"
  56401. #endif
  56402. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56403. "adds r4, r4, r6\n\t"
  56404. #else
  56405. "add r4, r4, r6\n\t"
  56406. #endif
  56407. #ifdef WOLFSSL_KEIL
  56408. "adcs r2, r2, %[r]\n\t"
  56409. #elif defined(__clang__)
  56410. "adcs r2, %[r]\n\t"
  56411. #else
  56412. "adc r2, %[r]\n\t"
  56413. #endif
  56414. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56415. "adds r4, r4, r6\n\t"
  56416. #else
  56417. "add r4, r4, r6\n\t"
  56418. #endif
  56419. #ifdef WOLFSSL_KEIL
  56420. "adcs r2, r2, %[r]\n\t"
  56421. #elif defined(__clang__)
  56422. "adcs r2, %[r]\n\t"
  56423. #else
  56424. "adc r2, %[r]\n\t"
  56425. #endif
  56426. "uxth r6, r7\n\t"
  56427. #ifdef WOLFSSL_KEIL
  56428. "muls r5, r6, r5\n\t"
  56429. #elif defined(__clang__)
  56430. "muls r5, r6\n\t"
  56431. #else
  56432. "mul r5, r6\n\t"
  56433. #endif
  56434. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56435. "lsrs r6, r5, #16\n\t"
  56436. #else
  56437. "lsr r6, r5, #16\n\t"
  56438. #endif
  56439. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56440. "lsls r5, r5, #16\n\t"
  56441. #else
  56442. "lsl r5, r5, #16\n\t"
  56443. #endif
  56444. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56445. "adds r3, r3, r5\n\t"
  56446. #else
  56447. "add r3, r3, r5\n\t"
  56448. #endif
  56449. #ifdef WOLFSSL_KEIL
  56450. "adcs r4, r4, r6\n\t"
  56451. #elif defined(__clang__)
  56452. "adcs r4, r6\n\t"
  56453. #else
  56454. "adc r4, r6\n\t"
  56455. #endif
  56456. #ifdef WOLFSSL_KEIL
  56457. "adcs r2, r2, %[r]\n\t"
  56458. #elif defined(__clang__)
  56459. "adcs r2, %[r]\n\t"
  56460. #else
  56461. "adc r2, %[r]\n\t"
  56462. #endif
  56463. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56464. "adds r3, r3, r5\n\t"
  56465. #else
  56466. "add r3, r3, r5\n\t"
  56467. #endif
  56468. #ifdef WOLFSSL_KEIL
  56469. "adcs r4, r4, r6\n\t"
  56470. #elif defined(__clang__)
  56471. "adcs r4, r6\n\t"
  56472. #else
  56473. "adc r4, r6\n\t"
  56474. #endif
  56475. #ifdef WOLFSSL_KEIL
  56476. "adcs r2, r2, %[r]\n\t"
  56477. #elif defined(__clang__)
  56478. "adcs r2, %[r]\n\t"
  56479. #else
  56480. "adc r2, %[r]\n\t"
  56481. #endif
  56482. "# A[2] * A[2]\n\t"
  56483. "mov r7, r12\n\t"
  56484. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56485. "lsrs r6, r7, #16\n\t"
  56486. #else
  56487. "lsr r6, r7, #16\n\t"
  56488. #endif
  56489. "uxth r5, r7\n\t"
  56490. #ifdef WOLFSSL_KEIL
  56491. "muls r5, r5, r5\n\t"
  56492. #elif defined(__clang__)
  56493. "muls r5, r5\n\t"
  56494. #else
  56495. "mul r5, r5\n\t"
  56496. #endif
  56497. #ifdef WOLFSSL_KEIL
  56498. "muls r6, r6, r6\n\t"
  56499. #elif defined(__clang__)
  56500. "muls r6, r6\n\t"
  56501. #else
  56502. "mul r6, r6\n\t"
  56503. #endif
  56504. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56505. "adds r3, r3, r5\n\t"
  56506. #else
  56507. "add r3, r3, r5\n\t"
  56508. #endif
  56509. #ifdef WOLFSSL_KEIL
  56510. "adcs r4, r4, r6\n\t"
  56511. #elif defined(__clang__)
  56512. "adcs r4, r6\n\t"
  56513. #else
  56514. "adc r4, r6\n\t"
  56515. #endif
  56516. #ifdef WOLFSSL_KEIL
  56517. "adcs r2, r2, %[r]\n\t"
  56518. #elif defined(__clang__)
  56519. "adcs r2, %[r]\n\t"
  56520. #else
  56521. "adc r2, %[r]\n\t"
  56522. #endif
  56523. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56524. "lsrs r6, r7, #16\n\t"
  56525. #else
  56526. "lsr r6, r7, #16\n\t"
  56527. #endif
  56528. "uxth r5, r7\n\t"
  56529. #ifdef WOLFSSL_KEIL
  56530. "muls r5, r6, r5\n\t"
  56531. #elif defined(__clang__)
  56532. "muls r5, r6\n\t"
  56533. #else
  56534. "mul r5, r6\n\t"
  56535. #endif
  56536. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56537. "lsrs r6, r5, #15\n\t"
  56538. #else
  56539. "lsr r6, r5, #15\n\t"
  56540. #endif
  56541. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56542. "lsls r5, r5, #17\n\t"
  56543. #else
  56544. "lsl r5, r5, #17\n\t"
  56545. #endif
  56546. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56547. "adds r3, r3, r5\n\t"
  56548. #else
  56549. "add r3, r3, r5\n\t"
  56550. #endif
  56551. #ifdef WOLFSSL_KEIL
  56552. "adcs r4, r4, r6\n\t"
  56553. #elif defined(__clang__)
  56554. "adcs r4, r6\n\t"
  56555. #else
  56556. "adc r4, r6\n\t"
  56557. #endif
  56558. #ifdef WOLFSSL_KEIL
  56559. "adcs r2, r2, %[r]\n\t"
  56560. #elif defined(__clang__)
  56561. "adcs r2, %[r]\n\t"
  56562. #else
  56563. "adc r2, %[r]\n\t"
  56564. #endif
  56565. "str r3, [sp, #16]\n\t"
  56566. "# A[3] * A[2]\n\t"
  56567. "movs r3, #0\n\t"
  56568. "mov %[a], r9\n\t"
  56569. "mov %[a], lr\n\t"
  56570. "uxth r5, %[a]\n\t"
  56571. "uxth r6, r7\n\t"
  56572. #ifdef WOLFSSL_KEIL
  56573. "muls r6, r5, r6\n\t"
  56574. #elif defined(__clang__)
  56575. "muls r6, r5\n\t"
  56576. #else
  56577. "mul r6, r5\n\t"
  56578. #endif
  56579. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56580. "adds r4, r4, r6\n\t"
  56581. #else
  56582. "add r4, r4, r6\n\t"
  56583. #endif
  56584. #ifdef WOLFSSL_KEIL
  56585. "adcs r2, r2, %[r]\n\t"
  56586. #elif defined(__clang__)
  56587. "adcs r2, %[r]\n\t"
  56588. #else
  56589. "adc r2, %[r]\n\t"
  56590. #endif
  56591. #ifdef WOLFSSL_KEIL
  56592. "adcs r3, r3, %[r]\n\t"
  56593. #elif defined(__clang__)
  56594. "adcs r3, %[r]\n\t"
  56595. #else
  56596. "adc r3, %[r]\n\t"
  56597. #endif
  56598. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56599. "adds r4, r4, r6\n\t"
  56600. #else
  56601. "add r4, r4, r6\n\t"
  56602. #endif
  56603. #ifdef WOLFSSL_KEIL
  56604. "adcs r2, r2, %[r]\n\t"
  56605. #elif defined(__clang__)
  56606. "adcs r2, %[r]\n\t"
  56607. #else
  56608. "adc r2, %[r]\n\t"
  56609. #endif
  56610. #ifdef WOLFSSL_KEIL
  56611. "adcs r3, r3, %[r]\n\t"
  56612. #elif defined(__clang__)
  56613. "adcs r3, %[r]\n\t"
  56614. #else
  56615. "adc r3, %[r]\n\t"
  56616. #endif
  56617. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56618. "lsrs r6, r7, #16\n\t"
  56619. #else
  56620. "lsr r6, r7, #16\n\t"
  56621. #endif
  56622. #ifdef WOLFSSL_KEIL
  56623. "muls r5, r6, r5\n\t"
  56624. #elif defined(__clang__)
  56625. "muls r5, r6\n\t"
  56626. #else
  56627. "mul r5, r6\n\t"
  56628. #endif
  56629. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56630. "lsrs r6, r5, #16\n\t"
  56631. #else
  56632. "lsr r6, r5, #16\n\t"
  56633. #endif
  56634. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56635. "lsls r5, r5, #16\n\t"
  56636. #else
  56637. "lsl r5, r5, #16\n\t"
  56638. #endif
  56639. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56640. "adds r4, r4, r5\n\t"
  56641. #else
  56642. "add r4, r4, r5\n\t"
  56643. #endif
  56644. #ifdef WOLFSSL_KEIL
  56645. "adcs r2, r2, r6\n\t"
  56646. #elif defined(__clang__)
  56647. "adcs r2, r6\n\t"
  56648. #else
  56649. "adc r2, r6\n\t"
  56650. #endif
  56651. #ifdef WOLFSSL_KEIL
  56652. "adcs r3, r3, %[r]\n\t"
  56653. #elif defined(__clang__)
  56654. "adcs r3, %[r]\n\t"
  56655. #else
  56656. "adc r3, %[r]\n\t"
  56657. #endif
  56658. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56659. "adds r4, r4, r5\n\t"
  56660. #else
  56661. "add r4, r4, r5\n\t"
  56662. #endif
  56663. #ifdef WOLFSSL_KEIL
  56664. "adcs r2, r2, r6\n\t"
  56665. #elif defined(__clang__)
  56666. "adcs r2, r6\n\t"
  56667. #else
  56668. "adc r2, r6\n\t"
  56669. #endif
  56670. #ifdef WOLFSSL_KEIL
  56671. "adcs r3, r3, %[r]\n\t"
  56672. #elif defined(__clang__)
  56673. "adcs r3, %[r]\n\t"
  56674. #else
  56675. "adc r3, %[r]\n\t"
  56676. #endif
  56677. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56678. "lsrs r5, %[a], #16\n\t"
  56679. #else
  56680. "lsr r5, %[a], #16\n\t"
  56681. #endif
  56682. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56683. "lsrs r6, r7, #16\n\t"
  56684. #else
  56685. "lsr r6, r7, #16\n\t"
  56686. #endif
  56687. #ifdef WOLFSSL_KEIL
  56688. "muls r6, r5, r6\n\t"
  56689. #elif defined(__clang__)
  56690. "muls r6, r5\n\t"
  56691. #else
  56692. "mul r6, r5\n\t"
  56693. #endif
  56694. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56695. "adds r2, r2, r6\n\t"
  56696. #else
  56697. "add r2, r2, r6\n\t"
  56698. #endif
  56699. #ifdef WOLFSSL_KEIL
  56700. "adcs r3, r3, %[r]\n\t"
  56701. #elif defined(__clang__)
  56702. "adcs r3, %[r]\n\t"
  56703. #else
  56704. "adc r3, %[r]\n\t"
  56705. #endif
  56706. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56707. "adds r2, r2, r6\n\t"
  56708. #else
  56709. "add r2, r2, r6\n\t"
  56710. #endif
  56711. #ifdef WOLFSSL_KEIL
  56712. "adcs r3, r3, %[r]\n\t"
  56713. #elif defined(__clang__)
  56714. "adcs r3, %[r]\n\t"
  56715. #else
  56716. "adc r3, %[r]\n\t"
  56717. #endif
  56718. "uxth r6, r7\n\t"
  56719. #ifdef WOLFSSL_KEIL
  56720. "muls r5, r6, r5\n\t"
  56721. #elif defined(__clang__)
  56722. "muls r5, r6\n\t"
  56723. #else
  56724. "mul r5, r6\n\t"
  56725. #endif
  56726. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56727. "lsrs r6, r5, #16\n\t"
  56728. #else
  56729. "lsr r6, r5, #16\n\t"
  56730. #endif
  56731. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56732. "lsls r5, r5, #16\n\t"
  56733. #else
  56734. "lsl r5, r5, #16\n\t"
  56735. #endif
  56736. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56737. "adds r4, r4, r5\n\t"
  56738. #else
  56739. "add r4, r4, r5\n\t"
  56740. #endif
  56741. #ifdef WOLFSSL_KEIL
  56742. "adcs r2, r2, r6\n\t"
  56743. #elif defined(__clang__)
  56744. "adcs r2, r6\n\t"
  56745. #else
  56746. "adc r2, r6\n\t"
  56747. #endif
  56748. #ifdef WOLFSSL_KEIL
  56749. "adcs r3, r3, %[r]\n\t"
  56750. #elif defined(__clang__)
  56751. "adcs r3, %[r]\n\t"
  56752. #else
  56753. "adc r3, %[r]\n\t"
  56754. #endif
  56755. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56756. "adds r4, r4, r5\n\t"
  56757. #else
  56758. "add r4, r4, r5\n\t"
  56759. #endif
  56760. #ifdef WOLFSSL_KEIL
  56761. "adcs r2, r2, r6\n\t"
  56762. #elif defined(__clang__)
  56763. "adcs r2, r6\n\t"
  56764. #else
  56765. "adc r2, r6\n\t"
  56766. #endif
  56767. #ifdef WOLFSSL_KEIL
  56768. "adcs r3, r3, %[r]\n\t"
  56769. #elif defined(__clang__)
  56770. "adcs r3, %[r]\n\t"
  56771. #else
  56772. "adc r3, %[r]\n\t"
  56773. #endif
  56774. "# A[4] * A[1]\n\t"
  56775. "mov %[a], r9\n\t"
  56776. "mov r7, r11\n\t"
  56777. "ldr %[a], [%[a], #16]\n\t"
  56778. "uxth r5, %[a]\n\t"
  56779. "uxth r6, r7\n\t"
  56780. #ifdef WOLFSSL_KEIL
  56781. "muls r6, r5, r6\n\t"
  56782. #elif defined(__clang__)
  56783. "muls r6, r5\n\t"
  56784. #else
  56785. "mul r6, r5\n\t"
  56786. #endif
  56787. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56788. "adds r4, r4, r6\n\t"
  56789. #else
  56790. "add r4, r4, r6\n\t"
  56791. #endif
  56792. #ifdef WOLFSSL_KEIL
  56793. "adcs r2, r2, %[r]\n\t"
  56794. #elif defined(__clang__)
  56795. "adcs r2, %[r]\n\t"
  56796. #else
  56797. "adc r2, %[r]\n\t"
  56798. #endif
  56799. #ifdef WOLFSSL_KEIL
  56800. "adcs r3, r3, %[r]\n\t"
  56801. #elif defined(__clang__)
  56802. "adcs r3, %[r]\n\t"
  56803. #else
  56804. "adc r3, %[r]\n\t"
  56805. #endif
  56806. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56807. "adds r4, r4, r6\n\t"
  56808. #else
  56809. "add r4, r4, r6\n\t"
  56810. #endif
  56811. #ifdef WOLFSSL_KEIL
  56812. "adcs r2, r2, %[r]\n\t"
  56813. #elif defined(__clang__)
  56814. "adcs r2, %[r]\n\t"
  56815. #else
  56816. "adc r2, %[r]\n\t"
  56817. #endif
  56818. #ifdef WOLFSSL_KEIL
  56819. "adcs r3, r3, %[r]\n\t"
  56820. #elif defined(__clang__)
  56821. "adcs r3, %[r]\n\t"
  56822. #else
  56823. "adc r3, %[r]\n\t"
  56824. #endif
  56825. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56826. "lsrs r6, r7, #16\n\t"
  56827. #else
  56828. "lsr r6, r7, #16\n\t"
  56829. #endif
  56830. #ifdef WOLFSSL_KEIL
  56831. "muls r5, r6, r5\n\t"
  56832. #elif defined(__clang__)
  56833. "muls r5, r6\n\t"
  56834. #else
  56835. "mul r5, r6\n\t"
  56836. #endif
  56837. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56838. "lsrs r6, r5, #16\n\t"
  56839. #else
  56840. "lsr r6, r5, #16\n\t"
  56841. #endif
  56842. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56843. "lsls r5, r5, #16\n\t"
  56844. #else
  56845. "lsl r5, r5, #16\n\t"
  56846. #endif
  56847. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56848. "adds r4, r4, r5\n\t"
  56849. #else
  56850. "add r4, r4, r5\n\t"
  56851. #endif
  56852. #ifdef WOLFSSL_KEIL
  56853. "adcs r2, r2, r6\n\t"
  56854. #elif defined(__clang__)
  56855. "adcs r2, r6\n\t"
  56856. #else
  56857. "adc r2, r6\n\t"
  56858. #endif
  56859. #ifdef WOLFSSL_KEIL
  56860. "adcs r3, r3, %[r]\n\t"
  56861. #elif defined(__clang__)
  56862. "adcs r3, %[r]\n\t"
  56863. #else
  56864. "adc r3, %[r]\n\t"
  56865. #endif
  56866. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56867. "adds r4, r4, r5\n\t"
  56868. #else
  56869. "add r4, r4, r5\n\t"
  56870. #endif
  56871. #ifdef WOLFSSL_KEIL
  56872. "adcs r2, r2, r6\n\t"
  56873. #elif defined(__clang__)
  56874. "adcs r2, r6\n\t"
  56875. #else
  56876. "adc r2, r6\n\t"
  56877. #endif
  56878. #ifdef WOLFSSL_KEIL
  56879. "adcs r3, r3, %[r]\n\t"
  56880. #elif defined(__clang__)
  56881. "adcs r3, %[r]\n\t"
  56882. #else
  56883. "adc r3, %[r]\n\t"
  56884. #endif
  56885. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56886. "lsrs r5, %[a], #16\n\t"
  56887. #else
  56888. "lsr r5, %[a], #16\n\t"
  56889. #endif
  56890. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56891. "lsrs r6, r7, #16\n\t"
  56892. #else
  56893. "lsr r6, r7, #16\n\t"
  56894. #endif
  56895. #ifdef WOLFSSL_KEIL
  56896. "muls r6, r5, r6\n\t"
  56897. #elif defined(__clang__)
  56898. "muls r6, r5\n\t"
  56899. #else
  56900. "mul r6, r5\n\t"
  56901. #endif
  56902. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56903. "adds r2, r2, r6\n\t"
  56904. #else
  56905. "add r2, r2, r6\n\t"
  56906. #endif
  56907. #ifdef WOLFSSL_KEIL
  56908. "adcs r3, r3, %[r]\n\t"
  56909. #elif defined(__clang__)
  56910. "adcs r3, %[r]\n\t"
  56911. #else
  56912. "adc r3, %[r]\n\t"
  56913. #endif
  56914. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56915. "adds r2, r2, r6\n\t"
  56916. #else
  56917. "add r2, r2, r6\n\t"
  56918. #endif
  56919. #ifdef WOLFSSL_KEIL
  56920. "adcs r3, r3, %[r]\n\t"
  56921. #elif defined(__clang__)
  56922. "adcs r3, %[r]\n\t"
  56923. #else
  56924. "adc r3, %[r]\n\t"
  56925. #endif
  56926. "uxth r6, r7\n\t"
  56927. #ifdef WOLFSSL_KEIL
  56928. "muls r5, r6, r5\n\t"
  56929. #elif defined(__clang__)
  56930. "muls r5, r6\n\t"
  56931. #else
  56932. "mul r5, r6\n\t"
  56933. #endif
  56934. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56935. "lsrs r6, r5, #16\n\t"
  56936. #else
  56937. "lsr r6, r5, #16\n\t"
  56938. #endif
  56939. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56940. "lsls r5, r5, #16\n\t"
  56941. #else
  56942. "lsl r5, r5, #16\n\t"
  56943. #endif
  56944. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56945. "adds r4, r4, r5\n\t"
  56946. #else
  56947. "add r4, r4, r5\n\t"
  56948. #endif
  56949. #ifdef WOLFSSL_KEIL
  56950. "adcs r2, r2, r6\n\t"
  56951. #elif defined(__clang__)
  56952. "adcs r2, r6\n\t"
  56953. #else
  56954. "adc r2, r6\n\t"
  56955. #endif
  56956. #ifdef WOLFSSL_KEIL
  56957. "adcs r3, r3, %[r]\n\t"
  56958. #elif defined(__clang__)
  56959. "adcs r3, %[r]\n\t"
  56960. #else
  56961. "adc r3, %[r]\n\t"
  56962. #endif
  56963. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56964. "adds r4, r4, r5\n\t"
  56965. #else
  56966. "add r4, r4, r5\n\t"
  56967. #endif
  56968. #ifdef WOLFSSL_KEIL
  56969. "adcs r2, r2, r6\n\t"
  56970. #elif defined(__clang__)
  56971. "adcs r2, r6\n\t"
  56972. #else
  56973. "adc r2, r6\n\t"
  56974. #endif
  56975. #ifdef WOLFSSL_KEIL
  56976. "adcs r3, r3, %[r]\n\t"
  56977. #elif defined(__clang__)
  56978. "adcs r3, %[r]\n\t"
  56979. #else
  56980. "adc r3, %[r]\n\t"
  56981. #endif
  56982. "# A[5] * A[0]\n\t"
  56983. "mov %[a], r9\n\t"
  56984. "mov r7, r10\n\t"
  56985. "ldr %[a], [%[a], #20]\n\t"
  56986. "uxth r5, %[a]\n\t"
  56987. "uxth r6, r7\n\t"
  56988. #ifdef WOLFSSL_KEIL
  56989. "muls r6, r5, r6\n\t"
  56990. #elif defined(__clang__)
  56991. "muls r6, r5\n\t"
  56992. #else
  56993. "mul r6, r5\n\t"
  56994. #endif
  56995. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56996. "adds r4, r4, r6\n\t"
  56997. #else
  56998. "add r4, r4, r6\n\t"
  56999. #endif
  57000. #ifdef WOLFSSL_KEIL
  57001. "adcs r2, r2, %[r]\n\t"
  57002. #elif defined(__clang__)
  57003. "adcs r2, %[r]\n\t"
  57004. #else
  57005. "adc r2, %[r]\n\t"
  57006. #endif
  57007. #ifdef WOLFSSL_KEIL
  57008. "adcs r3, r3, %[r]\n\t"
  57009. #elif defined(__clang__)
  57010. "adcs r3, %[r]\n\t"
  57011. #else
  57012. "adc r3, %[r]\n\t"
  57013. #endif
  57014. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57015. "adds r4, r4, r6\n\t"
  57016. #else
  57017. "add r4, r4, r6\n\t"
  57018. #endif
  57019. #ifdef WOLFSSL_KEIL
  57020. "adcs r2, r2, %[r]\n\t"
  57021. #elif defined(__clang__)
  57022. "adcs r2, %[r]\n\t"
  57023. #else
  57024. "adc r2, %[r]\n\t"
  57025. #endif
  57026. #ifdef WOLFSSL_KEIL
  57027. "adcs r3, r3, %[r]\n\t"
  57028. #elif defined(__clang__)
  57029. "adcs r3, %[r]\n\t"
  57030. #else
  57031. "adc r3, %[r]\n\t"
  57032. #endif
  57033. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57034. "lsrs r6, r7, #16\n\t"
  57035. #else
  57036. "lsr r6, r7, #16\n\t"
  57037. #endif
  57038. #ifdef WOLFSSL_KEIL
  57039. "muls r5, r6, r5\n\t"
  57040. #elif defined(__clang__)
  57041. "muls r5, r6\n\t"
  57042. #else
  57043. "mul r5, r6\n\t"
  57044. #endif
  57045. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57046. "lsrs r6, r5, #16\n\t"
  57047. #else
  57048. "lsr r6, r5, #16\n\t"
  57049. #endif
  57050. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57051. "lsls r5, r5, #16\n\t"
  57052. #else
  57053. "lsl r5, r5, #16\n\t"
  57054. #endif
  57055. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57056. "adds r4, r4, r5\n\t"
  57057. #else
  57058. "add r4, r4, r5\n\t"
  57059. #endif
  57060. #ifdef WOLFSSL_KEIL
  57061. "adcs r2, r2, r6\n\t"
  57062. #elif defined(__clang__)
  57063. "adcs r2, r6\n\t"
  57064. #else
  57065. "adc r2, r6\n\t"
  57066. #endif
  57067. #ifdef WOLFSSL_KEIL
  57068. "adcs r3, r3, %[r]\n\t"
  57069. #elif defined(__clang__)
  57070. "adcs r3, %[r]\n\t"
  57071. #else
  57072. "adc r3, %[r]\n\t"
  57073. #endif
  57074. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57075. "adds r4, r4, r5\n\t"
  57076. #else
  57077. "add r4, r4, r5\n\t"
  57078. #endif
  57079. #ifdef WOLFSSL_KEIL
  57080. "adcs r2, r2, r6\n\t"
  57081. #elif defined(__clang__)
  57082. "adcs r2, r6\n\t"
  57083. #else
  57084. "adc r2, r6\n\t"
  57085. #endif
  57086. #ifdef WOLFSSL_KEIL
  57087. "adcs r3, r3, %[r]\n\t"
  57088. #elif defined(__clang__)
  57089. "adcs r3, %[r]\n\t"
  57090. #else
  57091. "adc r3, %[r]\n\t"
  57092. #endif
  57093. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57094. "lsrs r5, %[a], #16\n\t"
  57095. #else
  57096. "lsr r5, %[a], #16\n\t"
  57097. #endif
  57098. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57099. "lsrs r6, r7, #16\n\t"
  57100. #else
  57101. "lsr r6, r7, #16\n\t"
  57102. #endif
  57103. #ifdef WOLFSSL_KEIL
  57104. "muls r6, r5, r6\n\t"
  57105. #elif defined(__clang__)
  57106. "muls r6, r5\n\t"
  57107. #else
  57108. "mul r6, r5\n\t"
  57109. #endif
  57110. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57111. "adds r2, r2, r6\n\t"
  57112. #else
  57113. "add r2, r2, r6\n\t"
  57114. #endif
  57115. #ifdef WOLFSSL_KEIL
  57116. "adcs r3, r3, %[r]\n\t"
  57117. #elif defined(__clang__)
  57118. "adcs r3, %[r]\n\t"
  57119. #else
  57120. "adc r3, %[r]\n\t"
  57121. #endif
  57122. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57123. "adds r2, r2, r6\n\t"
  57124. #else
  57125. "add r2, r2, r6\n\t"
  57126. #endif
  57127. #ifdef WOLFSSL_KEIL
  57128. "adcs r3, r3, %[r]\n\t"
  57129. #elif defined(__clang__)
  57130. "adcs r3, %[r]\n\t"
  57131. #else
  57132. "adc r3, %[r]\n\t"
  57133. #endif
  57134. "uxth r6, r7\n\t"
  57135. #ifdef WOLFSSL_KEIL
  57136. "muls r5, r6, r5\n\t"
  57137. #elif defined(__clang__)
  57138. "muls r5, r6\n\t"
  57139. #else
  57140. "mul r5, r6\n\t"
  57141. #endif
  57142. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57143. "lsrs r6, r5, #16\n\t"
  57144. #else
  57145. "lsr r6, r5, #16\n\t"
  57146. #endif
  57147. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57148. "lsls r5, r5, #16\n\t"
  57149. #else
  57150. "lsl r5, r5, #16\n\t"
  57151. #endif
  57152. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57153. "adds r4, r4, r5\n\t"
  57154. #else
  57155. "add r4, r4, r5\n\t"
  57156. #endif
  57157. #ifdef WOLFSSL_KEIL
  57158. "adcs r2, r2, r6\n\t"
  57159. #elif defined(__clang__)
  57160. "adcs r2, r6\n\t"
  57161. #else
  57162. "adc r2, r6\n\t"
  57163. #endif
  57164. #ifdef WOLFSSL_KEIL
  57165. "adcs r3, r3, %[r]\n\t"
  57166. #elif defined(__clang__)
  57167. "adcs r3, %[r]\n\t"
  57168. #else
  57169. "adc r3, %[r]\n\t"
  57170. #endif
  57171. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57172. "adds r4, r4, r5\n\t"
  57173. #else
  57174. "add r4, r4, r5\n\t"
  57175. #endif
  57176. #ifdef WOLFSSL_KEIL
  57177. "adcs r2, r2, r6\n\t"
  57178. #elif defined(__clang__)
  57179. "adcs r2, r6\n\t"
  57180. #else
  57181. "adc r2, r6\n\t"
  57182. #endif
  57183. #ifdef WOLFSSL_KEIL
  57184. "adcs r3, r3, %[r]\n\t"
  57185. #elif defined(__clang__)
  57186. "adcs r3, %[r]\n\t"
  57187. #else
  57188. "adc r3, %[r]\n\t"
  57189. #endif
  57190. "str r4, [sp, #20]\n\t"
  57191. "# A[6] * A[0]\n\t"
  57192. "movs r4, #0\n\t"
  57193. "mov %[a], r9\n\t"
  57194. "ldr %[a], [%[a], #24]\n\t"
  57195. "uxth r5, %[a]\n\t"
  57196. "uxth r6, r7\n\t"
  57197. #ifdef WOLFSSL_KEIL
  57198. "muls r6, r5, r6\n\t"
  57199. #elif defined(__clang__)
  57200. "muls r6, r5\n\t"
  57201. #else
  57202. "mul r6, r5\n\t"
  57203. #endif
  57204. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57205. "adds r2, r2, r6\n\t"
  57206. #else
  57207. "add r2, r2, r6\n\t"
  57208. #endif
  57209. #ifdef WOLFSSL_KEIL
  57210. "adcs r3, r3, %[r]\n\t"
  57211. #elif defined(__clang__)
  57212. "adcs r3, %[r]\n\t"
  57213. #else
  57214. "adc r3, %[r]\n\t"
  57215. #endif
  57216. #ifdef WOLFSSL_KEIL
  57217. "adcs r4, r4, %[r]\n\t"
  57218. #elif defined(__clang__)
  57219. "adcs r4, %[r]\n\t"
  57220. #else
  57221. "adc r4, %[r]\n\t"
  57222. #endif
  57223. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57224. "adds r2, r2, r6\n\t"
  57225. #else
  57226. "add r2, r2, r6\n\t"
  57227. #endif
  57228. #ifdef WOLFSSL_KEIL
  57229. "adcs r3, r3, %[r]\n\t"
  57230. #elif defined(__clang__)
  57231. "adcs r3, %[r]\n\t"
  57232. #else
  57233. "adc r3, %[r]\n\t"
  57234. #endif
  57235. #ifdef WOLFSSL_KEIL
  57236. "adcs r4, r4, %[r]\n\t"
  57237. #elif defined(__clang__)
  57238. "adcs r4, %[r]\n\t"
  57239. #else
  57240. "adc r4, %[r]\n\t"
  57241. #endif
  57242. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57243. "lsrs r6, r7, #16\n\t"
  57244. #else
  57245. "lsr r6, r7, #16\n\t"
  57246. #endif
  57247. #ifdef WOLFSSL_KEIL
  57248. "muls r5, r6, r5\n\t"
  57249. #elif defined(__clang__)
  57250. "muls r5, r6\n\t"
  57251. #else
  57252. "mul r5, r6\n\t"
  57253. #endif
  57254. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57255. "lsrs r6, r5, #16\n\t"
  57256. #else
  57257. "lsr r6, r5, #16\n\t"
  57258. #endif
  57259. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57260. "lsls r5, r5, #16\n\t"
  57261. #else
  57262. "lsl r5, r5, #16\n\t"
  57263. #endif
  57264. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57265. "adds r2, r2, r5\n\t"
  57266. #else
  57267. "add r2, r2, r5\n\t"
  57268. #endif
  57269. #ifdef WOLFSSL_KEIL
  57270. "adcs r3, r3, r6\n\t"
  57271. #elif defined(__clang__)
  57272. "adcs r3, r6\n\t"
  57273. #else
  57274. "adc r3, r6\n\t"
  57275. #endif
  57276. #ifdef WOLFSSL_KEIL
  57277. "adcs r4, r4, %[r]\n\t"
  57278. #elif defined(__clang__)
  57279. "adcs r4, %[r]\n\t"
  57280. #else
  57281. "adc r4, %[r]\n\t"
  57282. #endif
  57283. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57284. "adds r2, r2, r5\n\t"
  57285. #else
  57286. "add r2, r2, r5\n\t"
  57287. #endif
  57288. #ifdef WOLFSSL_KEIL
  57289. "adcs r3, r3, r6\n\t"
  57290. #elif defined(__clang__)
  57291. "adcs r3, r6\n\t"
  57292. #else
  57293. "adc r3, r6\n\t"
  57294. #endif
  57295. #ifdef WOLFSSL_KEIL
  57296. "adcs r4, r4, %[r]\n\t"
  57297. #elif defined(__clang__)
  57298. "adcs r4, %[r]\n\t"
  57299. #else
  57300. "adc r4, %[r]\n\t"
  57301. #endif
  57302. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57303. "lsrs r5, %[a], #16\n\t"
  57304. #else
  57305. "lsr r5, %[a], #16\n\t"
  57306. #endif
  57307. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57308. "lsrs r6, r7, #16\n\t"
  57309. #else
  57310. "lsr r6, r7, #16\n\t"
  57311. #endif
  57312. #ifdef WOLFSSL_KEIL
  57313. "muls r6, r5, r6\n\t"
  57314. #elif defined(__clang__)
  57315. "muls r6, r5\n\t"
  57316. #else
  57317. "mul r6, r5\n\t"
  57318. #endif
  57319. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57320. "adds r3, r3, r6\n\t"
  57321. #else
  57322. "add r3, r3, r6\n\t"
  57323. #endif
  57324. #ifdef WOLFSSL_KEIL
  57325. "adcs r4, r4, %[r]\n\t"
  57326. #elif defined(__clang__)
  57327. "adcs r4, %[r]\n\t"
  57328. #else
  57329. "adc r4, %[r]\n\t"
  57330. #endif
  57331. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57332. "adds r3, r3, r6\n\t"
  57333. #else
  57334. "add r3, r3, r6\n\t"
  57335. #endif
  57336. #ifdef WOLFSSL_KEIL
  57337. "adcs r4, r4, %[r]\n\t"
  57338. #elif defined(__clang__)
  57339. "adcs r4, %[r]\n\t"
  57340. #else
  57341. "adc r4, %[r]\n\t"
  57342. #endif
  57343. "uxth r6, r7\n\t"
  57344. #ifdef WOLFSSL_KEIL
  57345. "muls r5, r6, r5\n\t"
  57346. #elif defined(__clang__)
  57347. "muls r5, r6\n\t"
  57348. #else
  57349. "mul r5, r6\n\t"
  57350. #endif
  57351. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57352. "lsrs r6, r5, #16\n\t"
  57353. #else
  57354. "lsr r6, r5, #16\n\t"
  57355. #endif
  57356. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57357. "lsls r5, r5, #16\n\t"
  57358. #else
  57359. "lsl r5, r5, #16\n\t"
  57360. #endif
  57361. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57362. "adds r2, r2, r5\n\t"
  57363. #else
  57364. "add r2, r2, r5\n\t"
  57365. #endif
  57366. #ifdef WOLFSSL_KEIL
  57367. "adcs r3, r3, r6\n\t"
  57368. #elif defined(__clang__)
  57369. "adcs r3, r6\n\t"
  57370. #else
  57371. "adc r3, r6\n\t"
  57372. #endif
  57373. #ifdef WOLFSSL_KEIL
  57374. "adcs r4, r4, %[r]\n\t"
  57375. #elif defined(__clang__)
  57376. "adcs r4, %[r]\n\t"
  57377. #else
  57378. "adc r4, %[r]\n\t"
  57379. #endif
  57380. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57381. "adds r2, r2, r5\n\t"
  57382. #else
  57383. "add r2, r2, r5\n\t"
  57384. #endif
  57385. #ifdef WOLFSSL_KEIL
  57386. "adcs r3, r3, r6\n\t"
  57387. #elif defined(__clang__)
  57388. "adcs r3, r6\n\t"
  57389. #else
  57390. "adc r3, r6\n\t"
  57391. #endif
  57392. #ifdef WOLFSSL_KEIL
  57393. "adcs r4, r4, %[r]\n\t"
  57394. #elif defined(__clang__)
  57395. "adcs r4, %[r]\n\t"
  57396. #else
  57397. "adc r4, %[r]\n\t"
  57398. #endif
  57399. "# A[5] * A[1]\n\t"
  57400. "mov %[a], r9\n\t"
  57401. "mov r7, r11\n\t"
  57402. "ldr %[a], [%[a], #20]\n\t"
  57403. "uxth r5, %[a]\n\t"
  57404. "uxth r6, r7\n\t"
  57405. #ifdef WOLFSSL_KEIL
  57406. "muls r6, r5, r6\n\t"
  57407. #elif defined(__clang__)
  57408. "muls r6, r5\n\t"
  57409. #else
  57410. "mul r6, r5\n\t"
  57411. #endif
  57412. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57413. "adds r2, r2, r6\n\t"
  57414. #else
  57415. "add r2, r2, r6\n\t"
  57416. #endif
  57417. #ifdef WOLFSSL_KEIL
  57418. "adcs r3, r3, %[r]\n\t"
  57419. #elif defined(__clang__)
  57420. "adcs r3, %[r]\n\t"
  57421. #else
  57422. "adc r3, %[r]\n\t"
  57423. #endif
  57424. #ifdef WOLFSSL_KEIL
  57425. "adcs r4, r4, %[r]\n\t"
  57426. #elif defined(__clang__)
  57427. "adcs r4, %[r]\n\t"
  57428. #else
  57429. "adc r4, %[r]\n\t"
  57430. #endif
  57431. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57432. "adds r2, r2, r6\n\t"
  57433. #else
  57434. "add r2, r2, r6\n\t"
  57435. #endif
  57436. #ifdef WOLFSSL_KEIL
  57437. "adcs r3, r3, %[r]\n\t"
  57438. #elif defined(__clang__)
  57439. "adcs r3, %[r]\n\t"
  57440. #else
  57441. "adc r3, %[r]\n\t"
  57442. #endif
  57443. #ifdef WOLFSSL_KEIL
  57444. "adcs r4, r4, %[r]\n\t"
  57445. #elif defined(__clang__)
  57446. "adcs r4, %[r]\n\t"
  57447. #else
  57448. "adc r4, %[r]\n\t"
  57449. #endif
  57450. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57451. "lsrs r6, r7, #16\n\t"
  57452. #else
  57453. "lsr r6, r7, #16\n\t"
  57454. #endif
  57455. #ifdef WOLFSSL_KEIL
  57456. "muls r5, r6, r5\n\t"
  57457. #elif defined(__clang__)
  57458. "muls r5, r6\n\t"
  57459. #else
  57460. "mul r5, r6\n\t"
  57461. #endif
  57462. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57463. "lsrs r6, r5, #16\n\t"
  57464. #else
  57465. "lsr r6, r5, #16\n\t"
  57466. #endif
  57467. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57468. "lsls r5, r5, #16\n\t"
  57469. #else
  57470. "lsl r5, r5, #16\n\t"
  57471. #endif
  57472. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57473. "adds r2, r2, r5\n\t"
  57474. #else
  57475. "add r2, r2, r5\n\t"
  57476. #endif
  57477. #ifdef WOLFSSL_KEIL
  57478. "adcs r3, r3, r6\n\t"
  57479. #elif defined(__clang__)
  57480. "adcs r3, r6\n\t"
  57481. #else
  57482. "adc r3, r6\n\t"
  57483. #endif
  57484. #ifdef WOLFSSL_KEIL
  57485. "adcs r4, r4, %[r]\n\t"
  57486. #elif defined(__clang__)
  57487. "adcs r4, %[r]\n\t"
  57488. #else
  57489. "adc r4, %[r]\n\t"
  57490. #endif
  57491. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57492. "adds r2, r2, r5\n\t"
  57493. #else
  57494. "add r2, r2, r5\n\t"
  57495. #endif
  57496. #ifdef WOLFSSL_KEIL
  57497. "adcs r3, r3, r6\n\t"
  57498. #elif defined(__clang__)
  57499. "adcs r3, r6\n\t"
  57500. #else
  57501. "adc r3, r6\n\t"
  57502. #endif
  57503. #ifdef WOLFSSL_KEIL
  57504. "adcs r4, r4, %[r]\n\t"
  57505. #elif defined(__clang__)
  57506. "adcs r4, %[r]\n\t"
  57507. #else
  57508. "adc r4, %[r]\n\t"
  57509. #endif
  57510. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57511. "lsrs r5, %[a], #16\n\t"
  57512. #else
  57513. "lsr r5, %[a], #16\n\t"
  57514. #endif
  57515. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57516. "lsrs r6, r7, #16\n\t"
  57517. #else
  57518. "lsr r6, r7, #16\n\t"
  57519. #endif
  57520. #ifdef WOLFSSL_KEIL
  57521. "muls r6, r5, r6\n\t"
  57522. #elif defined(__clang__)
  57523. "muls r6, r5\n\t"
  57524. #else
  57525. "mul r6, r5\n\t"
  57526. #endif
  57527. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57528. "adds r3, r3, r6\n\t"
  57529. #else
  57530. "add r3, r3, r6\n\t"
  57531. #endif
  57532. #ifdef WOLFSSL_KEIL
  57533. "adcs r4, r4, %[r]\n\t"
  57534. #elif defined(__clang__)
  57535. "adcs r4, %[r]\n\t"
  57536. #else
  57537. "adc r4, %[r]\n\t"
  57538. #endif
  57539. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57540. "adds r3, r3, r6\n\t"
  57541. #else
  57542. "add r3, r3, r6\n\t"
  57543. #endif
  57544. #ifdef WOLFSSL_KEIL
  57545. "adcs r4, r4, %[r]\n\t"
  57546. #elif defined(__clang__)
  57547. "adcs r4, %[r]\n\t"
  57548. #else
  57549. "adc r4, %[r]\n\t"
  57550. #endif
  57551. "uxth r6, r7\n\t"
  57552. #ifdef WOLFSSL_KEIL
  57553. "muls r5, r6, r5\n\t"
  57554. #elif defined(__clang__)
  57555. "muls r5, r6\n\t"
  57556. #else
  57557. "mul r5, r6\n\t"
  57558. #endif
  57559. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57560. "lsrs r6, r5, #16\n\t"
  57561. #else
  57562. "lsr r6, r5, #16\n\t"
  57563. #endif
  57564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57565. "lsls r5, r5, #16\n\t"
  57566. #else
  57567. "lsl r5, r5, #16\n\t"
  57568. #endif
  57569. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57570. "adds r2, r2, r5\n\t"
  57571. #else
  57572. "add r2, r2, r5\n\t"
  57573. #endif
  57574. #ifdef WOLFSSL_KEIL
  57575. "adcs r3, r3, r6\n\t"
  57576. #elif defined(__clang__)
  57577. "adcs r3, r6\n\t"
  57578. #else
  57579. "adc r3, r6\n\t"
  57580. #endif
  57581. #ifdef WOLFSSL_KEIL
  57582. "adcs r4, r4, %[r]\n\t"
  57583. #elif defined(__clang__)
  57584. "adcs r4, %[r]\n\t"
  57585. #else
  57586. "adc r4, %[r]\n\t"
  57587. #endif
  57588. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57589. "adds r2, r2, r5\n\t"
  57590. #else
  57591. "add r2, r2, r5\n\t"
  57592. #endif
  57593. #ifdef WOLFSSL_KEIL
  57594. "adcs r3, r3, r6\n\t"
  57595. #elif defined(__clang__)
  57596. "adcs r3, r6\n\t"
  57597. #else
  57598. "adc r3, r6\n\t"
  57599. #endif
  57600. #ifdef WOLFSSL_KEIL
  57601. "adcs r4, r4, %[r]\n\t"
  57602. #elif defined(__clang__)
  57603. "adcs r4, %[r]\n\t"
  57604. #else
  57605. "adc r4, %[r]\n\t"
  57606. #endif
  57607. "# A[4] * A[2]\n\t"
  57608. "mov %[a], r9\n\t"
  57609. "mov r7, r12\n\t"
  57610. "ldr %[a], [%[a], #16]\n\t"
  57611. "uxth r5, %[a]\n\t"
  57612. "uxth r6, r7\n\t"
  57613. #ifdef WOLFSSL_KEIL
  57614. "muls r6, r5, r6\n\t"
  57615. #elif defined(__clang__)
  57616. "muls r6, r5\n\t"
  57617. #else
  57618. "mul r6, r5\n\t"
  57619. #endif
  57620. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57621. "adds r2, r2, r6\n\t"
  57622. #else
  57623. "add r2, r2, r6\n\t"
  57624. #endif
  57625. #ifdef WOLFSSL_KEIL
  57626. "adcs r3, r3, %[r]\n\t"
  57627. #elif defined(__clang__)
  57628. "adcs r3, %[r]\n\t"
  57629. #else
  57630. "adc r3, %[r]\n\t"
  57631. #endif
  57632. #ifdef WOLFSSL_KEIL
  57633. "adcs r4, r4, %[r]\n\t"
  57634. #elif defined(__clang__)
  57635. "adcs r4, %[r]\n\t"
  57636. #else
  57637. "adc r4, %[r]\n\t"
  57638. #endif
  57639. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57640. "adds r2, r2, r6\n\t"
  57641. #else
  57642. "add r2, r2, r6\n\t"
  57643. #endif
  57644. #ifdef WOLFSSL_KEIL
  57645. "adcs r3, r3, %[r]\n\t"
  57646. #elif defined(__clang__)
  57647. "adcs r3, %[r]\n\t"
  57648. #else
  57649. "adc r3, %[r]\n\t"
  57650. #endif
  57651. #ifdef WOLFSSL_KEIL
  57652. "adcs r4, r4, %[r]\n\t"
  57653. #elif defined(__clang__)
  57654. "adcs r4, %[r]\n\t"
  57655. #else
  57656. "adc r4, %[r]\n\t"
  57657. #endif
  57658. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57659. "lsrs r6, r7, #16\n\t"
  57660. #else
  57661. "lsr r6, r7, #16\n\t"
  57662. #endif
  57663. #ifdef WOLFSSL_KEIL
  57664. "muls r5, r6, r5\n\t"
  57665. #elif defined(__clang__)
  57666. "muls r5, r6\n\t"
  57667. #else
  57668. "mul r5, r6\n\t"
  57669. #endif
  57670. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57671. "lsrs r6, r5, #16\n\t"
  57672. #else
  57673. "lsr r6, r5, #16\n\t"
  57674. #endif
  57675. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57676. "lsls r5, r5, #16\n\t"
  57677. #else
  57678. "lsl r5, r5, #16\n\t"
  57679. #endif
  57680. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57681. "adds r2, r2, r5\n\t"
  57682. #else
  57683. "add r2, r2, r5\n\t"
  57684. #endif
  57685. #ifdef WOLFSSL_KEIL
  57686. "adcs r3, r3, r6\n\t"
  57687. #elif defined(__clang__)
  57688. "adcs r3, r6\n\t"
  57689. #else
  57690. "adc r3, r6\n\t"
  57691. #endif
  57692. #ifdef WOLFSSL_KEIL
  57693. "adcs r4, r4, %[r]\n\t"
  57694. #elif defined(__clang__)
  57695. "adcs r4, %[r]\n\t"
  57696. #else
  57697. "adc r4, %[r]\n\t"
  57698. #endif
  57699. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57700. "adds r2, r2, r5\n\t"
  57701. #else
  57702. "add r2, r2, r5\n\t"
  57703. #endif
  57704. #ifdef WOLFSSL_KEIL
  57705. "adcs r3, r3, r6\n\t"
  57706. #elif defined(__clang__)
  57707. "adcs r3, r6\n\t"
  57708. #else
  57709. "adc r3, r6\n\t"
  57710. #endif
  57711. #ifdef WOLFSSL_KEIL
  57712. "adcs r4, r4, %[r]\n\t"
  57713. #elif defined(__clang__)
  57714. "adcs r4, %[r]\n\t"
  57715. #else
  57716. "adc r4, %[r]\n\t"
  57717. #endif
  57718. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57719. "lsrs r5, %[a], #16\n\t"
  57720. #else
  57721. "lsr r5, %[a], #16\n\t"
  57722. #endif
  57723. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57724. "lsrs r6, r7, #16\n\t"
  57725. #else
  57726. "lsr r6, r7, #16\n\t"
  57727. #endif
  57728. #ifdef WOLFSSL_KEIL
  57729. "muls r6, r5, r6\n\t"
  57730. #elif defined(__clang__)
  57731. "muls r6, r5\n\t"
  57732. #else
  57733. "mul r6, r5\n\t"
  57734. #endif
  57735. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57736. "adds r3, r3, r6\n\t"
  57737. #else
  57738. "add r3, r3, r6\n\t"
  57739. #endif
  57740. #ifdef WOLFSSL_KEIL
  57741. "adcs r4, r4, %[r]\n\t"
  57742. #elif defined(__clang__)
  57743. "adcs r4, %[r]\n\t"
  57744. #else
  57745. "adc r4, %[r]\n\t"
  57746. #endif
  57747. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57748. "adds r3, r3, r6\n\t"
  57749. #else
  57750. "add r3, r3, r6\n\t"
  57751. #endif
  57752. #ifdef WOLFSSL_KEIL
  57753. "adcs r4, r4, %[r]\n\t"
  57754. #elif defined(__clang__)
  57755. "adcs r4, %[r]\n\t"
  57756. #else
  57757. "adc r4, %[r]\n\t"
  57758. #endif
  57759. "uxth r6, r7\n\t"
  57760. #ifdef WOLFSSL_KEIL
  57761. "muls r5, r6, r5\n\t"
  57762. #elif defined(__clang__)
  57763. "muls r5, r6\n\t"
  57764. #else
  57765. "mul r5, r6\n\t"
  57766. #endif
  57767. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57768. "lsrs r6, r5, #16\n\t"
  57769. #else
  57770. "lsr r6, r5, #16\n\t"
  57771. #endif
  57772. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57773. "lsls r5, r5, #16\n\t"
  57774. #else
  57775. "lsl r5, r5, #16\n\t"
  57776. #endif
  57777. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57778. "adds r2, r2, r5\n\t"
  57779. #else
  57780. "add r2, r2, r5\n\t"
  57781. #endif
  57782. #ifdef WOLFSSL_KEIL
  57783. "adcs r3, r3, r6\n\t"
  57784. #elif defined(__clang__)
  57785. "adcs r3, r6\n\t"
  57786. #else
  57787. "adc r3, r6\n\t"
  57788. #endif
  57789. #ifdef WOLFSSL_KEIL
  57790. "adcs r4, r4, %[r]\n\t"
  57791. #elif defined(__clang__)
  57792. "adcs r4, %[r]\n\t"
  57793. #else
  57794. "adc r4, %[r]\n\t"
  57795. #endif
  57796. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57797. "adds r2, r2, r5\n\t"
  57798. #else
  57799. "add r2, r2, r5\n\t"
  57800. #endif
  57801. #ifdef WOLFSSL_KEIL
  57802. "adcs r3, r3, r6\n\t"
  57803. #elif defined(__clang__)
  57804. "adcs r3, r6\n\t"
  57805. #else
  57806. "adc r3, r6\n\t"
  57807. #endif
  57808. #ifdef WOLFSSL_KEIL
  57809. "adcs r4, r4, %[r]\n\t"
  57810. #elif defined(__clang__)
  57811. "adcs r4, %[r]\n\t"
  57812. #else
  57813. "adc r4, %[r]\n\t"
  57814. #endif
  57815. "# A[3] * A[3]\n\t"
  57816. "mov r7, lr\n\t"
  57817. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57818. "lsrs r6, r7, #16\n\t"
  57819. #else
  57820. "lsr r6, r7, #16\n\t"
  57821. #endif
  57822. "uxth r5, r7\n\t"
  57823. #ifdef WOLFSSL_KEIL
  57824. "muls r5, r5, r5\n\t"
  57825. #elif defined(__clang__)
  57826. "muls r5, r5\n\t"
  57827. #else
  57828. "mul r5, r5\n\t"
  57829. #endif
  57830. #ifdef WOLFSSL_KEIL
  57831. "muls r6, r6, r6\n\t"
  57832. #elif defined(__clang__)
  57833. "muls r6, r6\n\t"
  57834. #else
  57835. "mul r6, r6\n\t"
  57836. #endif
  57837. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57838. "adds r2, r2, r5\n\t"
  57839. #else
  57840. "add r2, r2, r5\n\t"
  57841. #endif
  57842. #ifdef WOLFSSL_KEIL
  57843. "adcs r3, r3, r6\n\t"
  57844. #elif defined(__clang__)
  57845. "adcs r3, r6\n\t"
  57846. #else
  57847. "adc r3, r6\n\t"
  57848. #endif
  57849. #ifdef WOLFSSL_KEIL
  57850. "adcs r4, r4, %[r]\n\t"
  57851. #elif defined(__clang__)
  57852. "adcs r4, %[r]\n\t"
  57853. #else
  57854. "adc r4, %[r]\n\t"
  57855. #endif
  57856. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57857. "lsrs r6, r7, #16\n\t"
  57858. #else
  57859. "lsr r6, r7, #16\n\t"
  57860. #endif
  57861. "uxth r5, r7\n\t"
  57862. #ifdef WOLFSSL_KEIL
  57863. "muls r5, r6, r5\n\t"
  57864. #elif defined(__clang__)
  57865. "muls r5, r6\n\t"
  57866. #else
  57867. "mul r5, r6\n\t"
  57868. #endif
  57869. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57870. "lsrs r6, r5, #15\n\t"
  57871. #else
  57872. "lsr r6, r5, #15\n\t"
  57873. #endif
  57874. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57875. "lsls r5, r5, #17\n\t"
  57876. #else
  57877. "lsl r5, r5, #17\n\t"
  57878. #endif
  57879. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57880. "adds r2, r2, r5\n\t"
  57881. #else
  57882. "add r2, r2, r5\n\t"
  57883. #endif
  57884. #ifdef WOLFSSL_KEIL
  57885. "adcs r3, r3, r6\n\t"
  57886. #elif defined(__clang__)
  57887. "adcs r3, r6\n\t"
  57888. #else
  57889. "adc r3, r6\n\t"
  57890. #endif
  57891. #ifdef WOLFSSL_KEIL
  57892. "adcs r4, r4, %[r]\n\t"
  57893. #elif defined(__clang__)
  57894. "adcs r4, %[r]\n\t"
  57895. #else
  57896. "adc r4, %[r]\n\t"
  57897. #endif
  57898. "str r2, [sp, #24]\n\t"
  57899. "# A[4] * A[3]\n\t"
  57900. "movs r2, #0\n\t"
  57901. "mov %[a], r9\n\t"
  57902. "ldr %[a], [%[a], #16]\n\t"
  57903. "uxth r5, %[a]\n\t"
  57904. "uxth r6, r7\n\t"
  57905. #ifdef WOLFSSL_KEIL
  57906. "muls r6, r5, r6\n\t"
  57907. #elif defined(__clang__)
  57908. "muls r6, r5\n\t"
  57909. #else
  57910. "mul r6, r5\n\t"
  57911. #endif
  57912. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57913. "adds r3, r3, r6\n\t"
  57914. #else
  57915. "add r3, r3, r6\n\t"
  57916. #endif
  57917. #ifdef WOLFSSL_KEIL
  57918. "adcs r4, r4, %[r]\n\t"
  57919. #elif defined(__clang__)
  57920. "adcs r4, %[r]\n\t"
  57921. #else
  57922. "adc r4, %[r]\n\t"
  57923. #endif
  57924. #ifdef WOLFSSL_KEIL
  57925. "adcs r2, r2, %[r]\n\t"
  57926. #elif defined(__clang__)
  57927. "adcs r2, %[r]\n\t"
  57928. #else
  57929. "adc r2, %[r]\n\t"
  57930. #endif
  57931. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57932. "adds r3, r3, r6\n\t"
  57933. #else
  57934. "add r3, r3, r6\n\t"
  57935. #endif
  57936. #ifdef WOLFSSL_KEIL
  57937. "adcs r4, r4, %[r]\n\t"
  57938. #elif defined(__clang__)
  57939. "adcs r4, %[r]\n\t"
  57940. #else
  57941. "adc r4, %[r]\n\t"
  57942. #endif
  57943. #ifdef WOLFSSL_KEIL
  57944. "adcs r2, r2, %[r]\n\t"
  57945. #elif defined(__clang__)
  57946. "adcs r2, %[r]\n\t"
  57947. #else
  57948. "adc r2, %[r]\n\t"
  57949. #endif
  57950. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57951. "lsrs r6, r7, #16\n\t"
  57952. #else
  57953. "lsr r6, r7, #16\n\t"
  57954. #endif
  57955. #ifdef WOLFSSL_KEIL
  57956. "muls r5, r6, r5\n\t"
  57957. #elif defined(__clang__)
  57958. "muls r5, r6\n\t"
  57959. #else
  57960. "mul r5, r6\n\t"
  57961. #endif
  57962. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57963. "lsrs r6, r5, #16\n\t"
  57964. #else
  57965. "lsr r6, r5, #16\n\t"
  57966. #endif
  57967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57968. "lsls r5, r5, #16\n\t"
  57969. #else
  57970. "lsl r5, r5, #16\n\t"
  57971. #endif
  57972. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57973. "adds r3, r3, r5\n\t"
  57974. #else
  57975. "add r3, r3, r5\n\t"
  57976. #endif
  57977. #ifdef WOLFSSL_KEIL
  57978. "adcs r4, r4, r6\n\t"
  57979. #elif defined(__clang__)
  57980. "adcs r4, r6\n\t"
  57981. #else
  57982. "adc r4, r6\n\t"
  57983. #endif
  57984. #ifdef WOLFSSL_KEIL
  57985. "adcs r2, r2, %[r]\n\t"
  57986. #elif defined(__clang__)
  57987. "adcs r2, %[r]\n\t"
  57988. #else
  57989. "adc r2, %[r]\n\t"
  57990. #endif
  57991. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57992. "adds r3, r3, r5\n\t"
  57993. #else
  57994. "add r3, r3, r5\n\t"
  57995. #endif
  57996. #ifdef WOLFSSL_KEIL
  57997. "adcs r4, r4, r6\n\t"
  57998. #elif defined(__clang__)
  57999. "adcs r4, r6\n\t"
  58000. #else
  58001. "adc r4, r6\n\t"
  58002. #endif
  58003. #ifdef WOLFSSL_KEIL
  58004. "adcs r2, r2, %[r]\n\t"
  58005. #elif defined(__clang__)
  58006. "adcs r2, %[r]\n\t"
  58007. #else
  58008. "adc r2, %[r]\n\t"
  58009. #endif
  58010. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58011. "lsrs r5, %[a], #16\n\t"
  58012. #else
  58013. "lsr r5, %[a], #16\n\t"
  58014. #endif
  58015. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58016. "lsrs r6, r7, #16\n\t"
  58017. #else
  58018. "lsr r6, r7, #16\n\t"
  58019. #endif
  58020. #ifdef WOLFSSL_KEIL
  58021. "muls r6, r5, r6\n\t"
  58022. #elif defined(__clang__)
  58023. "muls r6, r5\n\t"
  58024. #else
  58025. "mul r6, r5\n\t"
  58026. #endif
  58027. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58028. "adds r4, r4, r6\n\t"
  58029. #else
  58030. "add r4, r4, r6\n\t"
  58031. #endif
  58032. #ifdef WOLFSSL_KEIL
  58033. "adcs r2, r2, %[r]\n\t"
  58034. #elif defined(__clang__)
  58035. "adcs r2, %[r]\n\t"
  58036. #else
  58037. "adc r2, %[r]\n\t"
  58038. #endif
  58039. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58040. "adds r4, r4, r6\n\t"
  58041. #else
  58042. "add r4, r4, r6\n\t"
  58043. #endif
  58044. #ifdef WOLFSSL_KEIL
  58045. "adcs r2, r2, %[r]\n\t"
  58046. #elif defined(__clang__)
  58047. "adcs r2, %[r]\n\t"
  58048. #else
  58049. "adc r2, %[r]\n\t"
  58050. #endif
  58051. "uxth r6, r7\n\t"
  58052. #ifdef WOLFSSL_KEIL
  58053. "muls r5, r6, r5\n\t"
  58054. #elif defined(__clang__)
  58055. "muls r5, r6\n\t"
  58056. #else
  58057. "mul r5, r6\n\t"
  58058. #endif
  58059. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58060. "lsrs r6, r5, #16\n\t"
  58061. #else
  58062. "lsr r6, r5, #16\n\t"
  58063. #endif
  58064. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58065. "lsls r5, r5, #16\n\t"
  58066. #else
  58067. "lsl r5, r5, #16\n\t"
  58068. #endif
  58069. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58070. "adds r3, r3, r5\n\t"
  58071. #else
  58072. "add r3, r3, r5\n\t"
  58073. #endif
  58074. #ifdef WOLFSSL_KEIL
  58075. "adcs r4, r4, r6\n\t"
  58076. #elif defined(__clang__)
  58077. "adcs r4, r6\n\t"
  58078. #else
  58079. "adc r4, r6\n\t"
  58080. #endif
  58081. #ifdef WOLFSSL_KEIL
  58082. "adcs r2, r2, %[r]\n\t"
  58083. #elif defined(__clang__)
  58084. "adcs r2, %[r]\n\t"
  58085. #else
  58086. "adc r2, %[r]\n\t"
  58087. #endif
  58088. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58089. "adds r3, r3, r5\n\t"
  58090. #else
  58091. "add r3, r3, r5\n\t"
  58092. #endif
  58093. #ifdef WOLFSSL_KEIL
  58094. "adcs r4, r4, r6\n\t"
  58095. #elif defined(__clang__)
  58096. "adcs r4, r6\n\t"
  58097. #else
  58098. "adc r4, r6\n\t"
  58099. #endif
  58100. #ifdef WOLFSSL_KEIL
  58101. "adcs r2, r2, %[r]\n\t"
  58102. #elif defined(__clang__)
  58103. "adcs r2, %[r]\n\t"
  58104. #else
  58105. "adc r2, %[r]\n\t"
  58106. #endif
  58107. "# A[5] * A[2]\n\t"
  58108. "mov %[a], r9\n\t"
  58109. "mov r7, r12\n\t"
  58110. "ldr %[a], [%[a], #20]\n\t"
  58111. "uxth r5, %[a]\n\t"
  58112. "uxth r6, r7\n\t"
  58113. #ifdef WOLFSSL_KEIL
  58114. "muls r6, r5, r6\n\t"
  58115. #elif defined(__clang__)
  58116. "muls r6, r5\n\t"
  58117. #else
  58118. "mul r6, r5\n\t"
  58119. #endif
  58120. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58121. "adds r3, r3, r6\n\t"
  58122. #else
  58123. "add r3, r3, r6\n\t"
  58124. #endif
  58125. #ifdef WOLFSSL_KEIL
  58126. "adcs r4, r4, %[r]\n\t"
  58127. #elif defined(__clang__)
  58128. "adcs r4, %[r]\n\t"
  58129. #else
  58130. "adc r4, %[r]\n\t"
  58131. #endif
  58132. #ifdef WOLFSSL_KEIL
  58133. "adcs r2, r2, %[r]\n\t"
  58134. #elif defined(__clang__)
  58135. "adcs r2, %[r]\n\t"
  58136. #else
  58137. "adc r2, %[r]\n\t"
  58138. #endif
  58139. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58140. "adds r3, r3, r6\n\t"
  58141. #else
  58142. "add r3, r3, r6\n\t"
  58143. #endif
  58144. #ifdef WOLFSSL_KEIL
  58145. "adcs r4, r4, %[r]\n\t"
  58146. #elif defined(__clang__)
  58147. "adcs r4, %[r]\n\t"
  58148. #else
  58149. "adc r4, %[r]\n\t"
  58150. #endif
  58151. #ifdef WOLFSSL_KEIL
  58152. "adcs r2, r2, %[r]\n\t"
  58153. #elif defined(__clang__)
  58154. "adcs r2, %[r]\n\t"
  58155. #else
  58156. "adc r2, %[r]\n\t"
  58157. #endif
  58158. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58159. "lsrs r6, r7, #16\n\t"
  58160. #else
  58161. "lsr r6, r7, #16\n\t"
  58162. #endif
  58163. #ifdef WOLFSSL_KEIL
  58164. "muls r5, r6, r5\n\t"
  58165. #elif defined(__clang__)
  58166. "muls r5, r6\n\t"
  58167. #else
  58168. "mul r5, r6\n\t"
  58169. #endif
  58170. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58171. "lsrs r6, r5, #16\n\t"
  58172. #else
  58173. "lsr r6, r5, #16\n\t"
  58174. #endif
  58175. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58176. "lsls r5, r5, #16\n\t"
  58177. #else
  58178. "lsl r5, r5, #16\n\t"
  58179. #endif
  58180. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58181. "adds r3, r3, r5\n\t"
  58182. #else
  58183. "add r3, r3, r5\n\t"
  58184. #endif
  58185. #ifdef WOLFSSL_KEIL
  58186. "adcs r4, r4, r6\n\t"
  58187. #elif defined(__clang__)
  58188. "adcs r4, r6\n\t"
  58189. #else
  58190. "adc r4, r6\n\t"
  58191. #endif
  58192. #ifdef WOLFSSL_KEIL
  58193. "adcs r2, r2, %[r]\n\t"
  58194. #elif defined(__clang__)
  58195. "adcs r2, %[r]\n\t"
  58196. #else
  58197. "adc r2, %[r]\n\t"
  58198. #endif
  58199. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58200. "adds r3, r3, r5\n\t"
  58201. #else
  58202. "add r3, r3, r5\n\t"
  58203. #endif
  58204. #ifdef WOLFSSL_KEIL
  58205. "adcs r4, r4, r6\n\t"
  58206. #elif defined(__clang__)
  58207. "adcs r4, r6\n\t"
  58208. #else
  58209. "adc r4, r6\n\t"
  58210. #endif
  58211. #ifdef WOLFSSL_KEIL
  58212. "adcs r2, r2, %[r]\n\t"
  58213. #elif defined(__clang__)
  58214. "adcs r2, %[r]\n\t"
  58215. #else
  58216. "adc r2, %[r]\n\t"
  58217. #endif
  58218. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58219. "lsrs r5, %[a], #16\n\t"
  58220. #else
  58221. "lsr r5, %[a], #16\n\t"
  58222. #endif
  58223. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58224. "lsrs r6, r7, #16\n\t"
  58225. #else
  58226. "lsr r6, r7, #16\n\t"
  58227. #endif
  58228. #ifdef WOLFSSL_KEIL
  58229. "muls r6, r5, r6\n\t"
  58230. #elif defined(__clang__)
  58231. "muls r6, r5\n\t"
  58232. #else
  58233. "mul r6, r5\n\t"
  58234. #endif
  58235. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58236. "adds r4, r4, r6\n\t"
  58237. #else
  58238. "add r4, r4, r6\n\t"
  58239. #endif
  58240. #ifdef WOLFSSL_KEIL
  58241. "adcs r2, r2, %[r]\n\t"
  58242. #elif defined(__clang__)
  58243. "adcs r2, %[r]\n\t"
  58244. #else
  58245. "adc r2, %[r]\n\t"
  58246. #endif
  58247. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58248. "adds r4, r4, r6\n\t"
  58249. #else
  58250. "add r4, r4, r6\n\t"
  58251. #endif
  58252. #ifdef WOLFSSL_KEIL
  58253. "adcs r2, r2, %[r]\n\t"
  58254. #elif defined(__clang__)
  58255. "adcs r2, %[r]\n\t"
  58256. #else
  58257. "adc r2, %[r]\n\t"
  58258. #endif
  58259. "uxth r6, r7\n\t"
  58260. #ifdef WOLFSSL_KEIL
  58261. "muls r5, r6, r5\n\t"
  58262. #elif defined(__clang__)
  58263. "muls r5, r6\n\t"
  58264. #else
  58265. "mul r5, r6\n\t"
  58266. #endif
  58267. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58268. "lsrs r6, r5, #16\n\t"
  58269. #else
  58270. "lsr r6, r5, #16\n\t"
  58271. #endif
  58272. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58273. "lsls r5, r5, #16\n\t"
  58274. #else
  58275. "lsl r5, r5, #16\n\t"
  58276. #endif
  58277. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58278. "adds r3, r3, r5\n\t"
  58279. #else
  58280. "add r3, r3, r5\n\t"
  58281. #endif
  58282. #ifdef WOLFSSL_KEIL
  58283. "adcs r4, r4, r6\n\t"
  58284. #elif defined(__clang__)
  58285. "adcs r4, r6\n\t"
  58286. #else
  58287. "adc r4, r6\n\t"
  58288. #endif
  58289. #ifdef WOLFSSL_KEIL
  58290. "adcs r2, r2, %[r]\n\t"
  58291. #elif defined(__clang__)
  58292. "adcs r2, %[r]\n\t"
  58293. #else
  58294. "adc r2, %[r]\n\t"
  58295. #endif
  58296. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58297. "adds r3, r3, r5\n\t"
  58298. #else
  58299. "add r3, r3, r5\n\t"
  58300. #endif
  58301. #ifdef WOLFSSL_KEIL
  58302. "adcs r4, r4, r6\n\t"
  58303. #elif defined(__clang__)
  58304. "adcs r4, r6\n\t"
  58305. #else
  58306. "adc r4, r6\n\t"
  58307. #endif
  58308. #ifdef WOLFSSL_KEIL
  58309. "adcs r2, r2, %[r]\n\t"
  58310. #elif defined(__clang__)
  58311. "adcs r2, %[r]\n\t"
  58312. #else
  58313. "adc r2, %[r]\n\t"
  58314. #endif
  58315. "# A[6] * A[1]\n\t"
  58316. "mov %[a], r9\n\t"
  58317. "mov r7, r11\n\t"
  58318. "ldr %[a], [%[a], #24]\n\t"
  58319. "uxth r5, %[a]\n\t"
  58320. "uxth r6, r7\n\t"
  58321. #ifdef WOLFSSL_KEIL
  58322. "muls r6, r5, r6\n\t"
  58323. #elif defined(__clang__)
  58324. "muls r6, r5\n\t"
  58325. #else
  58326. "mul r6, r5\n\t"
  58327. #endif
  58328. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58329. "adds r3, r3, r6\n\t"
  58330. #else
  58331. "add r3, r3, r6\n\t"
  58332. #endif
  58333. #ifdef WOLFSSL_KEIL
  58334. "adcs r4, r4, %[r]\n\t"
  58335. #elif defined(__clang__)
  58336. "adcs r4, %[r]\n\t"
  58337. #else
  58338. "adc r4, %[r]\n\t"
  58339. #endif
  58340. #ifdef WOLFSSL_KEIL
  58341. "adcs r2, r2, %[r]\n\t"
  58342. #elif defined(__clang__)
  58343. "adcs r2, %[r]\n\t"
  58344. #else
  58345. "adc r2, %[r]\n\t"
  58346. #endif
  58347. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58348. "adds r3, r3, r6\n\t"
  58349. #else
  58350. "add r3, r3, r6\n\t"
  58351. #endif
  58352. #ifdef WOLFSSL_KEIL
  58353. "adcs r4, r4, %[r]\n\t"
  58354. #elif defined(__clang__)
  58355. "adcs r4, %[r]\n\t"
  58356. #else
  58357. "adc r4, %[r]\n\t"
  58358. #endif
  58359. #ifdef WOLFSSL_KEIL
  58360. "adcs r2, r2, %[r]\n\t"
  58361. #elif defined(__clang__)
  58362. "adcs r2, %[r]\n\t"
  58363. #else
  58364. "adc r2, %[r]\n\t"
  58365. #endif
  58366. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58367. "lsrs r6, r7, #16\n\t"
  58368. #else
  58369. "lsr r6, r7, #16\n\t"
  58370. #endif
  58371. #ifdef WOLFSSL_KEIL
  58372. "muls r5, r6, r5\n\t"
  58373. #elif defined(__clang__)
  58374. "muls r5, r6\n\t"
  58375. #else
  58376. "mul r5, r6\n\t"
  58377. #endif
  58378. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58379. "lsrs r6, r5, #16\n\t"
  58380. #else
  58381. "lsr r6, r5, #16\n\t"
  58382. #endif
  58383. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58384. "lsls r5, r5, #16\n\t"
  58385. #else
  58386. "lsl r5, r5, #16\n\t"
  58387. #endif
  58388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58389. "adds r3, r3, r5\n\t"
  58390. #else
  58391. "add r3, r3, r5\n\t"
  58392. #endif
  58393. #ifdef WOLFSSL_KEIL
  58394. "adcs r4, r4, r6\n\t"
  58395. #elif defined(__clang__)
  58396. "adcs r4, r6\n\t"
  58397. #else
  58398. "adc r4, r6\n\t"
  58399. #endif
  58400. #ifdef WOLFSSL_KEIL
  58401. "adcs r2, r2, %[r]\n\t"
  58402. #elif defined(__clang__)
  58403. "adcs r2, %[r]\n\t"
  58404. #else
  58405. "adc r2, %[r]\n\t"
  58406. #endif
  58407. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58408. "adds r3, r3, r5\n\t"
  58409. #else
  58410. "add r3, r3, r5\n\t"
  58411. #endif
  58412. #ifdef WOLFSSL_KEIL
  58413. "adcs r4, r4, r6\n\t"
  58414. #elif defined(__clang__)
  58415. "adcs r4, r6\n\t"
  58416. #else
  58417. "adc r4, r6\n\t"
  58418. #endif
  58419. #ifdef WOLFSSL_KEIL
  58420. "adcs r2, r2, %[r]\n\t"
  58421. #elif defined(__clang__)
  58422. "adcs r2, %[r]\n\t"
  58423. #else
  58424. "adc r2, %[r]\n\t"
  58425. #endif
  58426. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58427. "lsrs r5, %[a], #16\n\t"
  58428. #else
  58429. "lsr r5, %[a], #16\n\t"
  58430. #endif
  58431. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58432. "lsrs r6, r7, #16\n\t"
  58433. #else
  58434. "lsr r6, r7, #16\n\t"
  58435. #endif
  58436. #ifdef WOLFSSL_KEIL
  58437. "muls r6, r5, r6\n\t"
  58438. #elif defined(__clang__)
  58439. "muls r6, r5\n\t"
  58440. #else
  58441. "mul r6, r5\n\t"
  58442. #endif
  58443. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58444. "adds r4, r4, r6\n\t"
  58445. #else
  58446. "add r4, r4, r6\n\t"
  58447. #endif
  58448. #ifdef WOLFSSL_KEIL
  58449. "adcs r2, r2, %[r]\n\t"
  58450. #elif defined(__clang__)
  58451. "adcs r2, %[r]\n\t"
  58452. #else
  58453. "adc r2, %[r]\n\t"
  58454. #endif
  58455. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58456. "adds r4, r4, r6\n\t"
  58457. #else
  58458. "add r4, r4, r6\n\t"
  58459. #endif
  58460. #ifdef WOLFSSL_KEIL
  58461. "adcs r2, r2, %[r]\n\t"
  58462. #elif defined(__clang__)
  58463. "adcs r2, %[r]\n\t"
  58464. #else
  58465. "adc r2, %[r]\n\t"
  58466. #endif
  58467. "uxth r6, r7\n\t"
  58468. #ifdef WOLFSSL_KEIL
  58469. "muls r5, r6, r5\n\t"
  58470. #elif defined(__clang__)
  58471. "muls r5, r6\n\t"
  58472. #else
  58473. "mul r5, r6\n\t"
  58474. #endif
  58475. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58476. "lsrs r6, r5, #16\n\t"
  58477. #else
  58478. "lsr r6, r5, #16\n\t"
  58479. #endif
  58480. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58481. "lsls r5, r5, #16\n\t"
  58482. #else
  58483. "lsl r5, r5, #16\n\t"
  58484. #endif
  58485. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58486. "adds r3, r3, r5\n\t"
  58487. #else
  58488. "add r3, r3, r5\n\t"
  58489. #endif
  58490. #ifdef WOLFSSL_KEIL
  58491. "adcs r4, r4, r6\n\t"
  58492. #elif defined(__clang__)
  58493. "adcs r4, r6\n\t"
  58494. #else
  58495. "adc r4, r6\n\t"
  58496. #endif
  58497. #ifdef WOLFSSL_KEIL
  58498. "adcs r2, r2, %[r]\n\t"
  58499. #elif defined(__clang__)
  58500. "adcs r2, %[r]\n\t"
  58501. #else
  58502. "adc r2, %[r]\n\t"
  58503. #endif
  58504. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58505. "adds r3, r3, r5\n\t"
  58506. #else
  58507. "add r3, r3, r5\n\t"
  58508. #endif
  58509. #ifdef WOLFSSL_KEIL
  58510. "adcs r4, r4, r6\n\t"
  58511. #elif defined(__clang__)
  58512. "adcs r4, r6\n\t"
  58513. #else
  58514. "adc r4, r6\n\t"
  58515. #endif
  58516. #ifdef WOLFSSL_KEIL
  58517. "adcs r2, r2, %[r]\n\t"
  58518. #elif defined(__clang__)
  58519. "adcs r2, %[r]\n\t"
  58520. #else
  58521. "adc r2, %[r]\n\t"
  58522. #endif
  58523. "# A[7] * A[0]\n\t"
  58524. "mov %[a], r9\n\t"
  58525. "mov r7, r10\n\t"
  58526. "ldr %[a], [%[a], #28]\n\t"
  58527. "uxth r5, %[a]\n\t"
  58528. "uxth r6, r7\n\t"
  58529. #ifdef WOLFSSL_KEIL
  58530. "muls r6, r5, r6\n\t"
  58531. #elif defined(__clang__)
  58532. "muls r6, r5\n\t"
  58533. #else
  58534. "mul r6, r5\n\t"
  58535. #endif
  58536. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58537. "adds r3, r3, r6\n\t"
  58538. #else
  58539. "add r3, r3, r6\n\t"
  58540. #endif
  58541. #ifdef WOLFSSL_KEIL
  58542. "adcs r4, r4, %[r]\n\t"
  58543. #elif defined(__clang__)
  58544. "adcs r4, %[r]\n\t"
  58545. #else
  58546. "adc r4, %[r]\n\t"
  58547. #endif
  58548. #ifdef WOLFSSL_KEIL
  58549. "adcs r2, r2, %[r]\n\t"
  58550. #elif defined(__clang__)
  58551. "adcs r2, %[r]\n\t"
  58552. #else
  58553. "adc r2, %[r]\n\t"
  58554. #endif
  58555. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58556. "adds r3, r3, r6\n\t"
  58557. #else
  58558. "add r3, r3, r6\n\t"
  58559. #endif
  58560. #ifdef WOLFSSL_KEIL
  58561. "adcs r4, r4, %[r]\n\t"
  58562. #elif defined(__clang__)
  58563. "adcs r4, %[r]\n\t"
  58564. #else
  58565. "adc r4, %[r]\n\t"
  58566. #endif
  58567. #ifdef WOLFSSL_KEIL
  58568. "adcs r2, r2, %[r]\n\t"
  58569. #elif defined(__clang__)
  58570. "adcs r2, %[r]\n\t"
  58571. #else
  58572. "adc r2, %[r]\n\t"
  58573. #endif
  58574. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58575. "lsrs r6, r7, #16\n\t"
  58576. #else
  58577. "lsr r6, r7, #16\n\t"
  58578. #endif
  58579. #ifdef WOLFSSL_KEIL
  58580. "muls r5, r6, r5\n\t"
  58581. #elif defined(__clang__)
  58582. "muls r5, r6\n\t"
  58583. #else
  58584. "mul r5, r6\n\t"
  58585. #endif
  58586. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58587. "lsrs r6, r5, #16\n\t"
  58588. #else
  58589. "lsr r6, r5, #16\n\t"
  58590. #endif
  58591. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58592. "lsls r5, r5, #16\n\t"
  58593. #else
  58594. "lsl r5, r5, #16\n\t"
  58595. #endif
  58596. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58597. "adds r3, r3, r5\n\t"
  58598. #else
  58599. "add r3, r3, r5\n\t"
  58600. #endif
  58601. #ifdef WOLFSSL_KEIL
  58602. "adcs r4, r4, r6\n\t"
  58603. #elif defined(__clang__)
  58604. "adcs r4, r6\n\t"
  58605. #else
  58606. "adc r4, r6\n\t"
  58607. #endif
  58608. #ifdef WOLFSSL_KEIL
  58609. "adcs r2, r2, %[r]\n\t"
  58610. #elif defined(__clang__)
  58611. "adcs r2, %[r]\n\t"
  58612. #else
  58613. "adc r2, %[r]\n\t"
  58614. #endif
  58615. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58616. "adds r3, r3, r5\n\t"
  58617. #else
  58618. "add r3, r3, r5\n\t"
  58619. #endif
  58620. #ifdef WOLFSSL_KEIL
  58621. "adcs r4, r4, r6\n\t"
  58622. #elif defined(__clang__)
  58623. "adcs r4, r6\n\t"
  58624. #else
  58625. "adc r4, r6\n\t"
  58626. #endif
  58627. #ifdef WOLFSSL_KEIL
  58628. "adcs r2, r2, %[r]\n\t"
  58629. #elif defined(__clang__)
  58630. "adcs r2, %[r]\n\t"
  58631. #else
  58632. "adc r2, %[r]\n\t"
  58633. #endif
  58634. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58635. "lsrs r5, %[a], #16\n\t"
  58636. #else
  58637. "lsr r5, %[a], #16\n\t"
  58638. #endif
  58639. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58640. "lsrs r6, r7, #16\n\t"
  58641. #else
  58642. "lsr r6, r7, #16\n\t"
  58643. #endif
  58644. #ifdef WOLFSSL_KEIL
  58645. "muls r6, r5, r6\n\t"
  58646. #elif defined(__clang__)
  58647. "muls r6, r5\n\t"
  58648. #else
  58649. "mul r6, r5\n\t"
  58650. #endif
  58651. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58652. "adds r4, r4, r6\n\t"
  58653. #else
  58654. "add r4, r4, r6\n\t"
  58655. #endif
  58656. #ifdef WOLFSSL_KEIL
  58657. "adcs r2, r2, %[r]\n\t"
  58658. #elif defined(__clang__)
  58659. "adcs r2, %[r]\n\t"
  58660. #else
  58661. "adc r2, %[r]\n\t"
  58662. #endif
  58663. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58664. "adds r4, r4, r6\n\t"
  58665. #else
  58666. "add r4, r4, r6\n\t"
  58667. #endif
  58668. #ifdef WOLFSSL_KEIL
  58669. "adcs r2, r2, %[r]\n\t"
  58670. #elif defined(__clang__)
  58671. "adcs r2, %[r]\n\t"
  58672. #else
  58673. "adc r2, %[r]\n\t"
  58674. #endif
  58675. "uxth r6, r7\n\t"
  58676. #ifdef WOLFSSL_KEIL
  58677. "muls r5, r6, r5\n\t"
  58678. #elif defined(__clang__)
  58679. "muls r5, r6\n\t"
  58680. #else
  58681. "mul r5, r6\n\t"
  58682. #endif
  58683. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58684. "lsrs r6, r5, #16\n\t"
  58685. #else
  58686. "lsr r6, r5, #16\n\t"
  58687. #endif
  58688. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58689. "lsls r5, r5, #16\n\t"
  58690. #else
  58691. "lsl r5, r5, #16\n\t"
  58692. #endif
  58693. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58694. "adds r3, r3, r5\n\t"
  58695. #else
  58696. "add r3, r3, r5\n\t"
  58697. #endif
  58698. #ifdef WOLFSSL_KEIL
  58699. "adcs r4, r4, r6\n\t"
  58700. #elif defined(__clang__)
  58701. "adcs r4, r6\n\t"
  58702. #else
  58703. "adc r4, r6\n\t"
  58704. #endif
  58705. #ifdef WOLFSSL_KEIL
  58706. "adcs r2, r2, %[r]\n\t"
  58707. #elif defined(__clang__)
  58708. "adcs r2, %[r]\n\t"
  58709. #else
  58710. "adc r2, %[r]\n\t"
  58711. #endif
  58712. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58713. "adds r3, r3, r5\n\t"
  58714. #else
  58715. "add r3, r3, r5\n\t"
  58716. #endif
  58717. #ifdef WOLFSSL_KEIL
  58718. "adcs r4, r4, r6\n\t"
  58719. #elif defined(__clang__)
  58720. "adcs r4, r6\n\t"
  58721. #else
  58722. "adc r4, r6\n\t"
  58723. #endif
  58724. #ifdef WOLFSSL_KEIL
  58725. "adcs r2, r2, %[r]\n\t"
  58726. #elif defined(__clang__)
  58727. "adcs r2, %[r]\n\t"
  58728. #else
  58729. "adc r2, %[r]\n\t"
  58730. #endif
  58731. "str r3, [sp, #28]\n\t"
  58732. "# A[8] * A[0]\n\t"
  58733. "movs r3, #0\n\t"
  58734. "mov %[a], r9\n\t"
  58735. "ldr %[a], [%[a], #32]\n\t"
  58736. "uxth r5, %[a]\n\t"
  58737. "uxth r6, r7\n\t"
  58738. #ifdef WOLFSSL_KEIL
  58739. "muls r6, r5, r6\n\t"
  58740. #elif defined(__clang__)
  58741. "muls r6, r5\n\t"
  58742. #else
  58743. "mul r6, r5\n\t"
  58744. #endif
  58745. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58746. "adds r4, r4, r6\n\t"
  58747. #else
  58748. "add r4, r4, r6\n\t"
  58749. #endif
  58750. #ifdef WOLFSSL_KEIL
  58751. "adcs r2, r2, %[r]\n\t"
  58752. #elif defined(__clang__)
  58753. "adcs r2, %[r]\n\t"
  58754. #else
  58755. "adc r2, %[r]\n\t"
  58756. #endif
  58757. #ifdef WOLFSSL_KEIL
  58758. "adcs r3, r3, %[r]\n\t"
  58759. #elif defined(__clang__)
  58760. "adcs r3, %[r]\n\t"
  58761. #else
  58762. "adc r3, %[r]\n\t"
  58763. #endif
  58764. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58765. "adds r4, r4, r6\n\t"
  58766. #else
  58767. "add r4, r4, r6\n\t"
  58768. #endif
  58769. #ifdef WOLFSSL_KEIL
  58770. "adcs r2, r2, %[r]\n\t"
  58771. #elif defined(__clang__)
  58772. "adcs r2, %[r]\n\t"
  58773. #else
  58774. "adc r2, %[r]\n\t"
  58775. #endif
  58776. #ifdef WOLFSSL_KEIL
  58777. "adcs r3, r3, %[r]\n\t"
  58778. #elif defined(__clang__)
  58779. "adcs r3, %[r]\n\t"
  58780. #else
  58781. "adc r3, %[r]\n\t"
  58782. #endif
  58783. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58784. "lsrs r6, r7, #16\n\t"
  58785. #else
  58786. "lsr r6, r7, #16\n\t"
  58787. #endif
  58788. #ifdef WOLFSSL_KEIL
  58789. "muls r5, r6, r5\n\t"
  58790. #elif defined(__clang__)
  58791. "muls r5, r6\n\t"
  58792. #else
  58793. "mul r5, r6\n\t"
  58794. #endif
  58795. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58796. "lsrs r6, r5, #16\n\t"
  58797. #else
  58798. "lsr r6, r5, #16\n\t"
  58799. #endif
  58800. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58801. "lsls r5, r5, #16\n\t"
  58802. #else
  58803. "lsl r5, r5, #16\n\t"
  58804. #endif
  58805. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58806. "adds r4, r4, r5\n\t"
  58807. #else
  58808. "add r4, r4, r5\n\t"
  58809. #endif
  58810. #ifdef WOLFSSL_KEIL
  58811. "adcs r2, r2, r6\n\t"
  58812. #elif defined(__clang__)
  58813. "adcs r2, r6\n\t"
  58814. #else
  58815. "adc r2, r6\n\t"
  58816. #endif
  58817. #ifdef WOLFSSL_KEIL
  58818. "adcs r3, r3, %[r]\n\t"
  58819. #elif defined(__clang__)
  58820. "adcs r3, %[r]\n\t"
  58821. #else
  58822. "adc r3, %[r]\n\t"
  58823. #endif
  58824. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58825. "adds r4, r4, r5\n\t"
  58826. #else
  58827. "add r4, r4, r5\n\t"
  58828. #endif
  58829. #ifdef WOLFSSL_KEIL
  58830. "adcs r2, r2, r6\n\t"
  58831. #elif defined(__clang__)
  58832. "adcs r2, r6\n\t"
  58833. #else
  58834. "adc r2, r6\n\t"
  58835. #endif
  58836. #ifdef WOLFSSL_KEIL
  58837. "adcs r3, r3, %[r]\n\t"
  58838. #elif defined(__clang__)
  58839. "adcs r3, %[r]\n\t"
  58840. #else
  58841. "adc r3, %[r]\n\t"
  58842. #endif
  58843. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58844. "lsrs r5, %[a], #16\n\t"
  58845. #else
  58846. "lsr r5, %[a], #16\n\t"
  58847. #endif
  58848. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58849. "lsrs r6, r7, #16\n\t"
  58850. #else
  58851. "lsr r6, r7, #16\n\t"
  58852. #endif
  58853. #ifdef WOLFSSL_KEIL
  58854. "muls r6, r5, r6\n\t"
  58855. #elif defined(__clang__)
  58856. "muls r6, r5\n\t"
  58857. #else
  58858. "mul r6, r5\n\t"
  58859. #endif
  58860. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58861. "adds r2, r2, r6\n\t"
  58862. #else
  58863. "add r2, r2, r6\n\t"
  58864. #endif
  58865. #ifdef WOLFSSL_KEIL
  58866. "adcs r3, r3, %[r]\n\t"
  58867. #elif defined(__clang__)
  58868. "adcs r3, %[r]\n\t"
  58869. #else
  58870. "adc r3, %[r]\n\t"
  58871. #endif
  58872. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58873. "adds r2, r2, r6\n\t"
  58874. #else
  58875. "add r2, r2, r6\n\t"
  58876. #endif
  58877. #ifdef WOLFSSL_KEIL
  58878. "adcs r3, r3, %[r]\n\t"
  58879. #elif defined(__clang__)
  58880. "adcs r3, %[r]\n\t"
  58881. #else
  58882. "adc r3, %[r]\n\t"
  58883. #endif
  58884. "uxth r6, r7\n\t"
  58885. #ifdef WOLFSSL_KEIL
  58886. "muls r5, r6, r5\n\t"
  58887. #elif defined(__clang__)
  58888. "muls r5, r6\n\t"
  58889. #else
  58890. "mul r5, r6\n\t"
  58891. #endif
  58892. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58893. "lsrs r6, r5, #16\n\t"
  58894. #else
  58895. "lsr r6, r5, #16\n\t"
  58896. #endif
  58897. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58898. "lsls r5, r5, #16\n\t"
  58899. #else
  58900. "lsl r5, r5, #16\n\t"
  58901. #endif
  58902. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58903. "adds r4, r4, r5\n\t"
  58904. #else
  58905. "add r4, r4, r5\n\t"
  58906. #endif
  58907. #ifdef WOLFSSL_KEIL
  58908. "adcs r2, r2, r6\n\t"
  58909. #elif defined(__clang__)
  58910. "adcs r2, r6\n\t"
  58911. #else
  58912. "adc r2, r6\n\t"
  58913. #endif
  58914. #ifdef WOLFSSL_KEIL
  58915. "adcs r3, r3, %[r]\n\t"
  58916. #elif defined(__clang__)
  58917. "adcs r3, %[r]\n\t"
  58918. #else
  58919. "adc r3, %[r]\n\t"
  58920. #endif
  58921. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58922. "adds r4, r4, r5\n\t"
  58923. #else
  58924. "add r4, r4, r5\n\t"
  58925. #endif
  58926. #ifdef WOLFSSL_KEIL
  58927. "adcs r2, r2, r6\n\t"
  58928. #elif defined(__clang__)
  58929. "adcs r2, r6\n\t"
  58930. #else
  58931. "adc r2, r6\n\t"
  58932. #endif
  58933. #ifdef WOLFSSL_KEIL
  58934. "adcs r3, r3, %[r]\n\t"
  58935. #elif defined(__clang__)
  58936. "adcs r3, %[r]\n\t"
  58937. #else
  58938. "adc r3, %[r]\n\t"
  58939. #endif
  58940. "# A[7] * A[1]\n\t"
  58941. "mov %[a], r9\n\t"
  58942. "mov r7, r11\n\t"
  58943. "ldr %[a], [%[a], #28]\n\t"
  58944. "uxth r5, %[a]\n\t"
  58945. "uxth r6, r7\n\t"
  58946. #ifdef WOLFSSL_KEIL
  58947. "muls r6, r5, r6\n\t"
  58948. #elif defined(__clang__)
  58949. "muls r6, r5\n\t"
  58950. #else
  58951. "mul r6, r5\n\t"
  58952. #endif
  58953. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58954. "adds r4, r4, r6\n\t"
  58955. #else
  58956. "add r4, r4, r6\n\t"
  58957. #endif
  58958. #ifdef WOLFSSL_KEIL
  58959. "adcs r2, r2, %[r]\n\t"
  58960. #elif defined(__clang__)
  58961. "adcs r2, %[r]\n\t"
  58962. #else
  58963. "adc r2, %[r]\n\t"
  58964. #endif
  58965. #ifdef WOLFSSL_KEIL
  58966. "adcs r3, r3, %[r]\n\t"
  58967. #elif defined(__clang__)
  58968. "adcs r3, %[r]\n\t"
  58969. #else
  58970. "adc r3, %[r]\n\t"
  58971. #endif
  58972. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58973. "adds r4, r4, r6\n\t"
  58974. #else
  58975. "add r4, r4, r6\n\t"
  58976. #endif
  58977. #ifdef WOLFSSL_KEIL
  58978. "adcs r2, r2, %[r]\n\t"
  58979. #elif defined(__clang__)
  58980. "adcs r2, %[r]\n\t"
  58981. #else
  58982. "adc r2, %[r]\n\t"
  58983. #endif
  58984. #ifdef WOLFSSL_KEIL
  58985. "adcs r3, r3, %[r]\n\t"
  58986. #elif defined(__clang__)
  58987. "adcs r3, %[r]\n\t"
  58988. #else
  58989. "adc r3, %[r]\n\t"
  58990. #endif
  58991. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58992. "lsrs r6, r7, #16\n\t"
  58993. #else
  58994. "lsr r6, r7, #16\n\t"
  58995. #endif
  58996. #ifdef WOLFSSL_KEIL
  58997. "muls r5, r6, r5\n\t"
  58998. #elif defined(__clang__)
  58999. "muls r5, r6\n\t"
  59000. #else
  59001. "mul r5, r6\n\t"
  59002. #endif
  59003. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59004. "lsrs r6, r5, #16\n\t"
  59005. #else
  59006. "lsr r6, r5, #16\n\t"
  59007. #endif
  59008. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59009. "lsls r5, r5, #16\n\t"
  59010. #else
  59011. "lsl r5, r5, #16\n\t"
  59012. #endif
  59013. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59014. "adds r4, r4, r5\n\t"
  59015. #else
  59016. "add r4, r4, r5\n\t"
  59017. #endif
  59018. #ifdef WOLFSSL_KEIL
  59019. "adcs r2, r2, r6\n\t"
  59020. #elif defined(__clang__)
  59021. "adcs r2, r6\n\t"
  59022. #else
  59023. "adc r2, r6\n\t"
  59024. #endif
  59025. #ifdef WOLFSSL_KEIL
  59026. "adcs r3, r3, %[r]\n\t"
  59027. #elif defined(__clang__)
  59028. "adcs r3, %[r]\n\t"
  59029. #else
  59030. "adc r3, %[r]\n\t"
  59031. #endif
  59032. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59033. "adds r4, r4, r5\n\t"
  59034. #else
  59035. "add r4, r4, r5\n\t"
  59036. #endif
  59037. #ifdef WOLFSSL_KEIL
  59038. "adcs r2, r2, r6\n\t"
  59039. #elif defined(__clang__)
  59040. "adcs r2, r6\n\t"
  59041. #else
  59042. "adc r2, r6\n\t"
  59043. #endif
  59044. #ifdef WOLFSSL_KEIL
  59045. "adcs r3, r3, %[r]\n\t"
  59046. #elif defined(__clang__)
  59047. "adcs r3, %[r]\n\t"
  59048. #else
  59049. "adc r3, %[r]\n\t"
  59050. #endif
  59051. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59052. "lsrs r5, %[a], #16\n\t"
  59053. #else
  59054. "lsr r5, %[a], #16\n\t"
  59055. #endif
  59056. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59057. "lsrs r6, r7, #16\n\t"
  59058. #else
  59059. "lsr r6, r7, #16\n\t"
  59060. #endif
  59061. #ifdef WOLFSSL_KEIL
  59062. "muls r6, r5, r6\n\t"
  59063. #elif defined(__clang__)
  59064. "muls r6, r5\n\t"
  59065. #else
  59066. "mul r6, r5\n\t"
  59067. #endif
  59068. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59069. "adds r2, r2, r6\n\t"
  59070. #else
  59071. "add r2, r2, r6\n\t"
  59072. #endif
  59073. #ifdef WOLFSSL_KEIL
  59074. "adcs r3, r3, %[r]\n\t"
  59075. #elif defined(__clang__)
  59076. "adcs r3, %[r]\n\t"
  59077. #else
  59078. "adc r3, %[r]\n\t"
  59079. #endif
  59080. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59081. "adds r2, r2, r6\n\t"
  59082. #else
  59083. "add r2, r2, r6\n\t"
  59084. #endif
  59085. #ifdef WOLFSSL_KEIL
  59086. "adcs r3, r3, %[r]\n\t"
  59087. #elif defined(__clang__)
  59088. "adcs r3, %[r]\n\t"
  59089. #else
  59090. "adc r3, %[r]\n\t"
  59091. #endif
  59092. "uxth r6, r7\n\t"
  59093. #ifdef WOLFSSL_KEIL
  59094. "muls r5, r6, r5\n\t"
  59095. #elif defined(__clang__)
  59096. "muls r5, r6\n\t"
  59097. #else
  59098. "mul r5, r6\n\t"
  59099. #endif
  59100. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59101. "lsrs r6, r5, #16\n\t"
  59102. #else
  59103. "lsr r6, r5, #16\n\t"
  59104. #endif
  59105. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59106. "lsls r5, r5, #16\n\t"
  59107. #else
  59108. "lsl r5, r5, #16\n\t"
  59109. #endif
  59110. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59111. "adds r4, r4, r5\n\t"
  59112. #else
  59113. "add r4, r4, r5\n\t"
  59114. #endif
  59115. #ifdef WOLFSSL_KEIL
  59116. "adcs r2, r2, r6\n\t"
  59117. #elif defined(__clang__)
  59118. "adcs r2, r6\n\t"
  59119. #else
  59120. "adc r2, r6\n\t"
  59121. #endif
  59122. #ifdef WOLFSSL_KEIL
  59123. "adcs r3, r3, %[r]\n\t"
  59124. #elif defined(__clang__)
  59125. "adcs r3, %[r]\n\t"
  59126. #else
  59127. "adc r3, %[r]\n\t"
  59128. #endif
  59129. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59130. "adds r4, r4, r5\n\t"
  59131. #else
  59132. "add r4, r4, r5\n\t"
  59133. #endif
  59134. #ifdef WOLFSSL_KEIL
  59135. "adcs r2, r2, r6\n\t"
  59136. #elif defined(__clang__)
  59137. "adcs r2, r6\n\t"
  59138. #else
  59139. "adc r2, r6\n\t"
  59140. #endif
  59141. #ifdef WOLFSSL_KEIL
  59142. "adcs r3, r3, %[r]\n\t"
  59143. #elif defined(__clang__)
  59144. "adcs r3, %[r]\n\t"
  59145. #else
  59146. "adc r3, %[r]\n\t"
  59147. #endif
  59148. "# A[6] * A[2]\n\t"
  59149. "mov %[a], r9\n\t"
  59150. "mov r7, r12\n\t"
  59151. "ldr %[a], [%[a], #24]\n\t"
  59152. "uxth r5, %[a]\n\t"
  59153. "uxth r6, r7\n\t"
  59154. #ifdef WOLFSSL_KEIL
  59155. "muls r6, r5, r6\n\t"
  59156. #elif defined(__clang__)
  59157. "muls r6, r5\n\t"
  59158. #else
  59159. "mul r6, r5\n\t"
  59160. #endif
  59161. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59162. "adds r4, r4, r6\n\t"
  59163. #else
  59164. "add r4, r4, r6\n\t"
  59165. #endif
  59166. #ifdef WOLFSSL_KEIL
  59167. "adcs r2, r2, %[r]\n\t"
  59168. #elif defined(__clang__)
  59169. "adcs r2, %[r]\n\t"
  59170. #else
  59171. "adc r2, %[r]\n\t"
  59172. #endif
  59173. #ifdef WOLFSSL_KEIL
  59174. "adcs r3, r3, %[r]\n\t"
  59175. #elif defined(__clang__)
  59176. "adcs r3, %[r]\n\t"
  59177. #else
  59178. "adc r3, %[r]\n\t"
  59179. #endif
  59180. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59181. "adds r4, r4, r6\n\t"
  59182. #else
  59183. "add r4, r4, r6\n\t"
  59184. #endif
  59185. #ifdef WOLFSSL_KEIL
  59186. "adcs r2, r2, %[r]\n\t"
  59187. #elif defined(__clang__)
  59188. "adcs r2, %[r]\n\t"
  59189. #else
  59190. "adc r2, %[r]\n\t"
  59191. #endif
  59192. #ifdef WOLFSSL_KEIL
  59193. "adcs r3, r3, %[r]\n\t"
  59194. #elif defined(__clang__)
  59195. "adcs r3, %[r]\n\t"
  59196. #else
  59197. "adc r3, %[r]\n\t"
  59198. #endif
  59199. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59200. "lsrs r6, r7, #16\n\t"
  59201. #else
  59202. "lsr r6, r7, #16\n\t"
  59203. #endif
  59204. #ifdef WOLFSSL_KEIL
  59205. "muls r5, r6, r5\n\t"
  59206. #elif defined(__clang__)
  59207. "muls r5, r6\n\t"
  59208. #else
  59209. "mul r5, r6\n\t"
  59210. #endif
  59211. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59212. "lsrs r6, r5, #16\n\t"
  59213. #else
  59214. "lsr r6, r5, #16\n\t"
  59215. #endif
  59216. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59217. "lsls r5, r5, #16\n\t"
  59218. #else
  59219. "lsl r5, r5, #16\n\t"
  59220. #endif
  59221. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59222. "adds r4, r4, r5\n\t"
  59223. #else
  59224. "add r4, r4, r5\n\t"
  59225. #endif
  59226. #ifdef WOLFSSL_KEIL
  59227. "adcs r2, r2, r6\n\t"
  59228. #elif defined(__clang__)
  59229. "adcs r2, r6\n\t"
  59230. #else
  59231. "adc r2, r6\n\t"
  59232. #endif
  59233. #ifdef WOLFSSL_KEIL
  59234. "adcs r3, r3, %[r]\n\t"
  59235. #elif defined(__clang__)
  59236. "adcs r3, %[r]\n\t"
  59237. #else
  59238. "adc r3, %[r]\n\t"
  59239. #endif
  59240. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59241. "adds r4, r4, r5\n\t"
  59242. #else
  59243. "add r4, r4, r5\n\t"
  59244. #endif
  59245. #ifdef WOLFSSL_KEIL
  59246. "adcs r2, r2, r6\n\t"
  59247. #elif defined(__clang__)
  59248. "adcs r2, r6\n\t"
  59249. #else
  59250. "adc r2, r6\n\t"
  59251. #endif
  59252. #ifdef WOLFSSL_KEIL
  59253. "adcs r3, r3, %[r]\n\t"
  59254. #elif defined(__clang__)
  59255. "adcs r3, %[r]\n\t"
  59256. #else
  59257. "adc r3, %[r]\n\t"
  59258. #endif
  59259. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59260. "lsrs r5, %[a], #16\n\t"
  59261. #else
  59262. "lsr r5, %[a], #16\n\t"
  59263. #endif
  59264. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59265. "lsrs r6, r7, #16\n\t"
  59266. #else
  59267. "lsr r6, r7, #16\n\t"
  59268. #endif
  59269. #ifdef WOLFSSL_KEIL
  59270. "muls r6, r5, r6\n\t"
  59271. #elif defined(__clang__)
  59272. "muls r6, r5\n\t"
  59273. #else
  59274. "mul r6, r5\n\t"
  59275. #endif
  59276. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59277. "adds r2, r2, r6\n\t"
  59278. #else
  59279. "add r2, r2, r6\n\t"
  59280. #endif
  59281. #ifdef WOLFSSL_KEIL
  59282. "adcs r3, r3, %[r]\n\t"
  59283. #elif defined(__clang__)
  59284. "adcs r3, %[r]\n\t"
  59285. #else
  59286. "adc r3, %[r]\n\t"
  59287. #endif
  59288. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59289. "adds r2, r2, r6\n\t"
  59290. #else
  59291. "add r2, r2, r6\n\t"
  59292. #endif
  59293. #ifdef WOLFSSL_KEIL
  59294. "adcs r3, r3, %[r]\n\t"
  59295. #elif defined(__clang__)
  59296. "adcs r3, %[r]\n\t"
  59297. #else
  59298. "adc r3, %[r]\n\t"
  59299. #endif
  59300. "uxth r6, r7\n\t"
  59301. #ifdef WOLFSSL_KEIL
  59302. "muls r5, r6, r5\n\t"
  59303. #elif defined(__clang__)
  59304. "muls r5, r6\n\t"
  59305. #else
  59306. "mul r5, r6\n\t"
  59307. #endif
  59308. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59309. "lsrs r6, r5, #16\n\t"
  59310. #else
  59311. "lsr r6, r5, #16\n\t"
  59312. #endif
  59313. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59314. "lsls r5, r5, #16\n\t"
  59315. #else
  59316. "lsl r5, r5, #16\n\t"
  59317. #endif
  59318. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59319. "adds r4, r4, r5\n\t"
  59320. #else
  59321. "add r4, r4, r5\n\t"
  59322. #endif
  59323. #ifdef WOLFSSL_KEIL
  59324. "adcs r2, r2, r6\n\t"
  59325. #elif defined(__clang__)
  59326. "adcs r2, r6\n\t"
  59327. #else
  59328. "adc r2, r6\n\t"
  59329. #endif
  59330. #ifdef WOLFSSL_KEIL
  59331. "adcs r3, r3, %[r]\n\t"
  59332. #elif defined(__clang__)
  59333. "adcs r3, %[r]\n\t"
  59334. #else
  59335. "adc r3, %[r]\n\t"
  59336. #endif
  59337. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59338. "adds r4, r4, r5\n\t"
  59339. #else
  59340. "add r4, r4, r5\n\t"
  59341. #endif
  59342. #ifdef WOLFSSL_KEIL
  59343. "adcs r2, r2, r6\n\t"
  59344. #elif defined(__clang__)
  59345. "adcs r2, r6\n\t"
  59346. #else
  59347. "adc r2, r6\n\t"
  59348. #endif
  59349. #ifdef WOLFSSL_KEIL
  59350. "adcs r3, r3, %[r]\n\t"
  59351. #elif defined(__clang__)
  59352. "adcs r3, %[r]\n\t"
  59353. #else
  59354. "adc r3, %[r]\n\t"
  59355. #endif
  59356. "# A[5] * A[3]\n\t"
  59357. "mov %[a], r9\n\t"
  59358. "mov r7, lr\n\t"
  59359. "ldr %[a], [%[a], #20]\n\t"
  59360. "uxth r5, %[a]\n\t"
  59361. "uxth r6, r7\n\t"
  59362. #ifdef WOLFSSL_KEIL
  59363. "muls r6, r5, r6\n\t"
  59364. #elif defined(__clang__)
  59365. "muls r6, r5\n\t"
  59366. #else
  59367. "mul r6, r5\n\t"
  59368. #endif
  59369. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59370. "adds r4, r4, r6\n\t"
  59371. #else
  59372. "add r4, r4, r6\n\t"
  59373. #endif
  59374. #ifdef WOLFSSL_KEIL
  59375. "adcs r2, r2, %[r]\n\t"
  59376. #elif defined(__clang__)
  59377. "adcs r2, %[r]\n\t"
  59378. #else
  59379. "adc r2, %[r]\n\t"
  59380. #endif
  59381. #ifdef WOLFSSL_KEIL
  59382. "adcs r3, r3, %[r]\n\t"
  59383. #elif defined(__clang__)
  59384. "adcs r3, %[r]\n\t"
  59385. #else
  59386. "adc r3, %[r]\n\t"
  59387. #endif
  59388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59389. "adds r4, r4, r6\n\t"
  59390. #else
  59391. "add r4, r4, r6\n\t"
  59392. #endif
  59393. #ifdef WOLFSSL_KEIL
  59394. "adcs r2, r2, %[r]\n\t"
  59395. #elif defined(__clang__)
  59396. "adcs r2, %[r]\n\t"
  59397. #else
  59398. "adc r2, %[r]\n\t"
  59399. #endif
  59400. #ifdef WOLFSSL_KEIL
  59401. "adcs r3, r3, %[r]\n\t"
  59402. #elif defined(__clang__)
  59403. "adcs r3, %[r]\n\t"
  59404. #else
  59405. "adc r3, %[r]\n\t"
  59406. #endif
  59407. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59408. "lsrs r6, r7, #16\n\t"
  59409. #else
  59410. "lsr r6, r7, #16\n\t"
  59411. #endif
  59412. #ifdef WOLFSSL_KEIL
  59413. "muls r5, r6, r5\n\t"
  59414. #elif defined(__clang__)
  59415. "muls r5, r6\n\t"
  59416. #else
  59417. "mul r5, r6\n\t"
  59418. #endif
  59419. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59420. "lsrs r6, r5, #16\n\t"
  59421. #else
  59422. "lsr r6, r5, #16\n\t"
  59423. #endif
  59424. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59425. "lsls r5, r5, #16\n\t"
  59426. #else
  59427. "lsl r5, r5, #16\n\t"
  59428. #endif
  59429. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59430. "adds r4, r4, r5\n\t"
  59431. #else
  59432. "add r4, r4, r5\n\t"
  59433. #endif
  59434. #ifdef WOLFSSL_KEIL
  59435. "adcs r2, r2, r6\n\t"
  59436. #elif defined(__clang__)
  59437. "adcs r2, r6\n\t"
  59438. #else
  59439. "adc r2, r6\n\t"
  59440. #endif
  59441. #ifdef WOLFSSL_KEIL
  59442. "adcs r3, r3, %[r]\n\t"
  59443. #elif defined(__clang__)
  59444. "adcs r3, %[r]\n\t"
  59445. #else
  59446. "adc r3, %[r]\n\t"
  59447. #endif
  59448. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59449. "adds r4, r4, r5\n\t"
  59450. #else
  59451. "add r4, r4, r5\n\t"
  59452. #endif
  59453. #ifdef WOLFSSL_KEIL
  59454. "adcs r2, r2, r6\n\t"
  59455. #elif defined(__clang__)
  59456. "adcs r2, r6\n\t"
  59457. #else
  59458. "adc r2, r6\n\t"
  59459. #endif
  59460. #ifdef WOLFSSL_KEIL
  59461. "adcs r3, r3, %[r]\n\t"
  59462. #elif defined(__clang__)
  59463. "adcs r3, %[r]\n\t"
  59464. #else
  59465. "adc r3, %[r]\n\t"
  59466. #endif
  59467. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59468. "lsrs r5, %[a], #16\n\t"
  59469. #else
  59470. "lsr r5, %[a], #16\n\t"
  59471. #endif
  59472. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59473. "lsrs r6, r7, #16\n\t"
  59474. #else
  59475. "lsr r6, r7, #16\n\t"
  59476. #endif
  59477. #ifdef WOLFSSL_KEIL
  59478. "muls r6, r5, r6\n\t"
  59479. #elif defined(__clang__)
  59480. "muls r6, r5\n\t"
  59481. #else
  59482. "mul r6, r5\n\t"
  59483. #endif
  59484. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59485. "adds r2, r2, r6\n\t"
  59486. #else
  59487. "add r2, r2, r6\n\t"
  59488. #endif
  59489. #ifdef WOLFSSL_KEIL
  59490. "adcs r3, r3, %[r]\n\t"
  59491. #elif defined(__clang__)
  59492. "adcs r3, %[r]\n\t"
  59493. #else
  59494. "adc r3, %[r]\n\t"
  59495. #endif
  59496. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59497. "adds r2, r2, r6\n\t"
  59498. #else
  59499. "add r2, r2, r6\n\t"
  59500. #endif
  59501. #ifdef WOLFSSL_KEIL
  59502. "adcs r3, r3, %[r]\n\t"
  59503. #elif defined(__clang__)
  59504. "adcs r3, %[r]\n\t"
  59505. #else
  59506. "adc r3, %[r]\n\t"
  59507. #endif
  59508. "uxth r6, r7\n\t"
  59509. #ifdef WOLFSSL_KEIL
  59510. "muls r5, r6, r5\n\t"
  59511. #elif defined(__clang__)
  59512. "muls r5, r6\n\t"
  59513. #else
  59514. "mul r5, r6\n\t"
  59515. #endif
  59516. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59517. "lsrs r6, r5, #16\n\t"
  59518. #else
  59519. "lsr r6, r5, #16\n\t"
  59520. #endif
  59521. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59522. "lsls r5, r5, #16\n\t"
  59523. #else
  59524. "lsl r5, r5, #16\n\t"
  59525. #endif
  59526. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59527. "adds r4, r4, r5\n\t"
  59528. #else
  59529. "add r4, r4, r5\n\t"
  59530. #endif
  59531. #ifdef WOLFSSL_KEIL
  59532. "adcs r2, r2, r6\n\t"
  59533. #elif defined(__clang__)
  59534. "adcs r2, r6\n\t"
  59535. #else
  59536. "adc r2, r6\n\t"
  59537. #endif
  59538. #ifdef WOLFSSL_KEIL
  59539. "adcs r3, r3, %[r]\n\t"
  59540. #elif defined(__clang__)
  59541. "adcs r3, %[r]\n\t"
  59542. #else
  59543. "adc r3, %[r]\n\t"
  59544. #endif
  59545. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59546. "adds r4, r4, r5\n\t"
  59547. #else
  59548. "add r4, r4, r5\n\t"
  59549. #endif
  59550. #ifdef WOLFSSL_KEIL
  59551. "adcs r2, r2, r6\n\t"
  59552. #elif defined(__clang__)
  59553. "adcs r2, r6\n\t"
  59554. #else
  59555. "adc r2, r6\n\t"
  59556. #endif
  59557. #ifdef WOLFSSL_KEIL
  59558. "adcs r3, r3, %[r]\n\t"
  59559. #elif defined(__clang__)
  59560. "adcs r3, %[r]\n\t"
  59561. #else
  59562. "adc r3, %[r]\n\t"
  59563. #endif
  59564. "# A[4] * A[4]\n\t"
  59565. "mov %[a], r9\n\t"
  59566. "ldr r7, [%[a], #16]\n\t"
  59567. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59568. "lsrs r6, r7, #16\n\t"
  59569. #else
  59570. "lsr r6, r7, #16\n\t"
  59571. #endif
  59572. "uxth r5, r7\n\t"
  59573. #ifdef WOLFSSL_KEIL
  59574. "muls r5, r5, r5\n\t"
  59575. #elif defined(__clang__)
  59576. "muls r5, r5\n\t"
  59577. #else
  59578. "mul r5, r5\n\t"
  59579. #endif
  59580. #ifdef WOLFSSL_KEIL
  59581. "muls r6, r6, r6\n\t"
  59582. #elif defined(__clang__)
  59583. "muls r6, r6\n\t"
  59584. #else
  59585. "mul r6, r6\n\t"
  59586. #endif
  59587. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59588. "adds r4, r4, r5\n\t"
  59589. #else
  59590. "add r4, r4, r5\n\t"
  59591. #endif
  59592. #ifdef WOLFSSL_KEIL
  59593. "adcs r2, r2, r6\n\t"
  59594. #elif defined(__clang__)
  59595. "adcs r2, r6\n\t"
  59596. #else
  59597. "adc r2, r6\n\t"
  59598. #endif
  59599. #ifdef WOLFSSL_KEIL
  59600. "adcs r3, r3, %[r]\n\t"
  59601. #elif defined(__clang__)
  59602. "adcs r3, %[r]\n\t"
  59603. #else
  59604. "adc r3, %[r]\n\t"
  59605. #endif
  59606. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59607. "lsrs r6, r7, #16\n\t"
  59608. #else
  59609. "lsr r6, r7, #16\n\t"
  59610. #endif
  59611. "uxth r5, r7\n\t"
  59612. #ifdef WOLFSSL_KEIL
  59613. "muls r5, r6, r5\n\t"
  59614. #elif defined(__clang__)
  59615. "muls r5, r6\n\t"
  59616. #else
  59617. "mul r5, r6\n\t"
  59618. #endif
  59619. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59620. "lsrs r6, r5, #15\n\t"
  59621. #else
  59622. "lsr r6, r5, #15\n\t"
  59623. #endif
  59624. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59625. "lsls r5, r5, #17\n\t"
  59626. #else
  59627. "lsl r5, r5, #17\n\t"
  59628. #endif
  59629. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59630. "adds r4, r4, r5\n\t"
  59631. #else
  59632. "add r4, r4, r5\n\t"
  59633. #endif
  59634. #ifdef WOLFSSL_KEIL
  59635. "adcs r2, r2, r6\n\t"
  59636. #elif defined(__clang__)
  59637. "adcs r2, r6\n\t"
  59638. #else
  59639. "adc r2, r6\n\t"
  59640. #endif
  59641. #ifdef WOLFSSL_KEIL
  59642. "adcs r3, r3, %[r]\n\t"
  59643. #elif defined(__clang__)
  59644. "adcs r3, %[r]\n\t"
  59645. #else
  59646. "adc r3, %[r]\n\t"
  59647. #endif
  59648. "str r4, [sp, #32]\n\t"
  59649. "# A[5] * A[4]\n\t"
  59650. "movs r4, #0\n\t"
  59651. "ldr %[a], [%[a], #20]\n\t"
  59652. "uxth r5, %[a]\n\t"
  59653. "uxth r6, r7\n\t"
  59654. #ifdef WOLFSSL_KEIL
  59655. "muls r6, r5, r6\n\t"
  59656. #elif defined(__clang__)
  59657. "muls r6, r5\n\t"
  59658. #else
  59659. "mul r6, r5\n\t"
  59660. #endif
  59661. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59662. "adds r2, r2, r6\n\t"
  59663. #else
  59664. "add r2, r2, r6\n\t"
  59665. #endif
  59666. #ifdef WOLFSSL_KEIL
  59667. "adcs r3, r3, %[r]\n\t"
  59668. #elif defined(__clang__)
  59669. "adcs r3, %[r]\n\t"
  59670. #else
  59671. "adc r3, %[r]\n\t"
  59672. #endif
  59673. #ifdef WOLFSSL_KEIL
  59674. "adcs r4, r4, %[r]\n\t"
  59675. #elif defined(__clang__)
  59676. "adcs r4, %[r]\n\t"
  59677. #else
  59678. "adc r4, %[r]\n\t"
  59679. #endif
  59680. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59681. "adds r2, r2, r6\n\t"
  59682. #else
  59683. "add r2, r2, r6\n\t"
  59684. #endif
  59685. #ifdef WOLFSSL_KEIL
  59686. "adcs r3, r3, %[r]\n\t"
  59687. #elif defined(__clang__)
  59688. "adcs r3, %[r]\n\t"
  59689. #else
  59690. "adc r3, %[r]\n\t"
  59691. #endif
  59692. #ifdef WOLFSSL_KEIL
  59693. "adcs r4, r4, %[r]\n\t"
  59694. #elif defined(__clang__)
  59695. "adcs r4, %[r]\n\t"
  59696. #else
  59697. "adc r4, %[r]\n\t"
  59698. #endif
  59699. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59700. "lsrs r6, r7, #16\n\t"
  59701. #else
  59702. "lsr r6, r7, #16\n\t"
  59703. #endif
  59704. #ifdef WOLFSSL_KEIL
  59705. "muls r5, r6, r5\n\t"
  59706. #elif defined(__clang__)
  59707. "muls r5, r6\n\t"
  59708. #else
  59709. "mul r5, r6\n\t"
  59710. #endif
  59711. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59712. "lsrs r6, r5, #16\n\t"
  59713. #else
  59714. "lsr r6, r5, #16\n\t"
  59715. #endif
  59716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59717. "lsls r5, r5, #16\n\t"
  59718. #else
  59719. "lsl r5, r5, #16\n\t"
  59720. #endif
  59721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59722. "adds r2, r2, r5\n\t"
  59723. #else
  59724. "add r2, r2, r5\n\t"
  59725. #endif
  59726. #ifdef WOLFSSL_KEIL
  59727. "adcs r3, r3, r6\n\t"
  59728. #elif defined(__clang__)
  59729. "adcs r3, r6\n\t"
  59730. #else
  59731. "adc r3, r6\n\t"
  59732. #endif
  59733. #ifdef WOLFSSL_KEIL
  59734. "adcs r4, r4, %[r]\n\t"
  59735. #elif defined(__clang__)
  59736. "adcs r4, %[r]\n\t"
  59737. #else
  59738. "adc r4, %[r]\n\t"
  59739. #endif
  59740. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59741. "adds r2, r2, r5\n\t"
  59742. #else
  59743. "add r2, r2, r5\n\t"
  59744. #endif
  59745. #ifdef WOLFSSL_KEIL
  59746. "adcs r3, r3, r6\n\t"
  59747. #elif defined(__clang__)
  59748. "adcs r3, r6\n\t"
  59749. #else
  59750. "adc r3, r6\n\t"
  59751. #endif
  59752. #ifdef WOLFSSL_KEIL
  59753. "adcs r4, r4, %[r]\n\t"
  59754. #elif defined(__clang__)
  59755. "adcs r4, %[r]\n\t"
  59756. #else
  59757. "adc r4, %[r]\n\t"
  59758. #endif
  59759. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59760. "lsrs r5, %[a], #16\n\t"
  59761. #else
  59762. "lsr r5, %[a], #16\n\t"
  59763. #endif
  59764. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59765. "lsrs r6, r7, #16\n\t"
  59766. #else
  59767. "lsr r6, r7, #16\n\t"
  59768. #endif
  59769. #ifdef WOLFSSL_KEIL
  59770. "muls r6, r5, r6\n\t"
  59771. #elif defined(__clang__)
  59772. "muls r6, r5\n\t"
  59773. #else
  59774. "mul r6, r5\n\t"
  59775. #endif
  59776. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59777. "adds r3, r3, r6\n\t"
  59778. #else
  59779. "add r3, r3, r6\n\t"
  59780. #endif
  59781. #ifdef WOLFSSL_KEIL
  59782. "adcs r4, r4, %[r]\n\t"
  59783. #elif defined(__clang__)
  59784. "adcs r4, %[r]\n\t"
  59785. #else
  59786. "adc r4, %[r]\n\t"
  59787. #endif
  59788. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59789. "adds r3, r3, r6\n\t"
  59790. #else
  59791. "add r3, r3, r6\n\t"
  59792. #endif
  59793. #ifdef WOLFSSL_KEIL
  59794. "adcs r4, r4, %[r]\n\t"
  59795. #elif defined(__clang__)
  59796. "adcs r4, %[r]\n\t"
  59797. #else
  59798. "adc r4, %[r]\n\t"
  59799. #endif
  59800. "uxth r6, r7\n\t"
  59801. #ifdef WOLFSSL_KEIL
  59802. "muls r5, r6, r5\n\t"
  59803. #elif defined(__clang__)
  59804. "muls r5, r6\n\t"
  59805. #else
  59806. "mul r5, r6\n\t"
  59807. #endif
  59808. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59809. "lsrs r6, r5, #16\n\t"
  59810. #else
  59811. "lsr r6, r5, #16\n\t"
  59812. #endif
  59813. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59814. "lsls r5, r5, #16\n\t"
  59815. #else
  59816. "lsl r5, r5, #16\n\t"
  59817. #endif
  59818. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59819. "adds r2, r2, r5\n\t"
  59820. #else
  59821. "add r2, r2, r5\n\t"
  59822. #endif
  59823. #ifdef WOLFSSL_KEIL
  59824. "adcs r3, r3, r6\n\t"
  59825. #elif defined(__clang__)
  59826. "adcs r3, r6\n\t"
  59827. #else
  59828. "adc r3, r6\n\t"
  59829. #endif
  59830. #ifdef WOLFSSL_KEIL
  59831. "adcs r4, r4, %[r]\n\t"
  59832. #elif defined(__clang__)
  59833. "adcs r4, %[r]\n\t"
  59834. #else
  59835. "adc r4, %[r]\n\t"
  59836. #endif
  59837. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59838. "adds r2, r2, r5\n\t"
  59839. #else
  59840. "add r2, r2, r5\n\t"
  59841. #endif
  59842. #ifdef WOLFSSL_KEIL
  59843. "adcs r3, r3, r6\n\t"
  59844. #elif defined(__clang__)
  59845. "adcs r3, r6\n\t"
  59846. #else
  59847. "adc r3, r6\n\t"
  59848. #endif
  59849. #ifdef WOLFSSL_KEIL
  59850. "adcs r4, r4, %[r]\n\t"
  59851. #elif defined(__clang__)
  59852. "adcs r4, %[r]\n\t"
  59853. #else
  59854. "adc r4, %[r]\n\t"
  59855. #endif
  59856. "# A[6] * A[3]\n\t"
  59857. "mov %[a], r9\n\t"
  59858. "mov r7, lr\n\t"
  59859. "ldr %[a], [%[a], #24]\n\t"
  59860. "uxth r5, %[a]\n\t"
  59861. "uxth r6, r7\n\t"
  59862. #ifdef WOLFSSL_KEIL
  59863. "muls r6, r5, r6\n\t"
  59864. #elif defined(__clang__)
  59865. "muls r6, r5\n\t"
  59866. #else
  59867. "mul r6, r5\n\t"
  59868. #endif
  59869. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59870. "adds r2, r2, r6\n\t"
  59871. #else
  59872. "add r2, r2, r6\n\t"
  59873. #endif
  59874. #ifdef WOLFSSL_KEIL
  59875. "adcs r3, r3, %[r]\n\t"
  59876. #elif defined(__clang__)
  59877. "adcs r3, %[r]\n\t"
  59878. #else
  59879. "adc r3, %[r]\n\t"
  59880. #endif
  59881. #ifdef WOLFSSL_KEIL
  59882. "adcs r4, r4, %[r]\n\t"
  59883. #elif defined(__clang__)
  59884. "adcs r4, %[r]\n\t"
  59885. #else
  59886. "adc r4, %[r]\n\t"
  59887. #endif
  59888. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59889. "adds r2, r2, r6\n\t"
  59890. #else
  59891. "add r2, r2, r6\n\t"
  59892. #endif
  59893. #ifdef WOLFSSL_KEIL
  59894. "adcs r3, r3, %[r]\n\t"
  59895. #elif defined(__clang__)
  59896. "adcs r3, %[r]\n\t"
  59897. #else
  59898. "adc r3, %[r]\n\t"
  59899. #endif
  59900. #ifdef WOLFSSL_KEIL
  59901. "adcs r4, r4, %[r]\n\t"
  59902. #elif defined(__clang__)
  59903. "adcs r4, %[r]\n\t"
  59904. #else
  59905. "adc r4, %[r]\n\t"
  59906. #endif
  59907. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59908. "lsrs r6, r7, #16\n\t"
  59909. #else
  59910. "lsr r6, r7, #16\n\t"
  59911. #endif
  59912. #ifdef WOLFSSL_KEIL
  59913. "muls r5, r6, r5\n\t"
  59914. #elif defined(__clang__)
  59915. "muls r5, r6\n\t"
  59916. #else
  59917. "mul r5, r6\n\t"
  59918. #endif
  59919. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59920. "lsrs r6, r5, #16\n\t"
  59921. #else
  59922. "lsr r6, r5, #16\n\t"
  59923. #endif
  59924. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59925. "lsls r5, r5, #16\n\t"
  59926. #else
  59927. "lsl r5, r5, #16\n\t"
  59928. #endif
  59929. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59930. "adds r2, r2, r5\n\t"
  59931. #else
  59932. "add r2, r2, r5\n\t"
  59933. #endif
  59934. #ifdef WOLFSSL_KEIL
  59935. "adcs r3, r3, r6\n\t"
  59936. #elif defined(__clang__)
  59937. "adcs r3, r6\n\t"
  59938. #else
  59939. "adc r3, r6\n\t"
  59940. #endif
  59941. #ifdef WOLFSSL_KEIL
  59942. "adcs r4, r4, %[r]\n\t"
  59943. #elif defined(__clang__)
  59944. "adcs r4, %[r]\n\t"
  59945. #else
  59946. "adc r4, %[r]\n\t"
  59947. #endif
  59948. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59949. "adds r2, r2, r5\n\t"
  59950. #else
  59951. "add r2, r2, r5\n\t"
  59952. #endif
  59953. #ifdef WOLFSSL_KEIL
  59954. "adcs r3, r3, r6\n\t"
  59955. #elif defined(__clang__)
  59956. "adcs r3, r6\n\t"
  59957. #else
  59958. "adc r3, r6\n\t"
  59959. #endif
  59960. #ifdef WOLFSSL_KEIL
  59961. "adcs r4, r4, %[r]\n\t"
  59962. #elif defined(__clang__)
  59963. "adcs r4, %[r]\n\t"
  59964. #else
  59965. "adc r4, %[r]\n\t"
  59966. #endif
  59967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59968. "lsrs r5, %[a], #16\n\t"
  59969. #else
  59970. "lsr r5, %[a], #16\n\t"
  59971. #endif
  59972. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59973. "lsrs r6, r7, #16\n\t"
  59974. #else
  59975. "lsr r6, r7, #16\n\t"
  59976. #endif
  59977. #ifdef WOLFSSL_KEIL
  59978. "muls r6, r5, r6\n\t"
  59979. #elif defined(__clang__)
  59980. "muls r6, r5\n\t"
  59981. #else
  59982. "mul r6, r5\n\t"
  59983. #endif
  59984. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59985. "adds r3, r3, r6\n\t"
  59986. #else
  59987. "add r3, r3, r6\n\t"
  59988. #endif
  59989. #ifdef WOLFSSL_KEIL
  59990. "adcs r4, r4, %[r]\n\t"
  59991. #elif defined(__clang__)
  59992. "adcs r4, %[r]\n\t"
  59993. #else
  59994. "adc r4, %[r]\n\t"
  59995. #endif
  59996. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59997. "adds r3, r3, r6\n\t"
  59998. #else
  59999. "add r3, r3, r6\n\t"
  60000. #endif
  60001. #ifdef WOLFSSL_KEIL
  60002. "adcs r4, r4, %[r]\n\t"
  60003. #elif defined(__clang__)
  60004. "adcs r4, %[r]\n\t"
  60005. #else
  60006. "adc r4, %[r]\n\t"
  60007. #endif
  60008. "uxth r6, r7\n\t"
  60009. #ifdef WOLFSSL_KEIL
  60010. "muls r5, r6, r5\n\t"
  60011. #elif defined(__clang__)
  60012. "muls r5, r6\n\t"
  60013. #else
  60014. "mul r5, r6\n\t"
  60015. #endif
  60016. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60017. "lsrs r6, r5, #16\n\t"
  60018. #else
  60019. "lsr r6, r5, #16\n\t"
  60020. #endif
  60021. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60022. "lsls r5, r5, #16\n\t"
  60023. #else
  60024. "lsl r5, r5, #16\n\t"
  60025. #endif
  60026. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60027. "adds r2, r2, r5\n\t"
  60028. #else
  60029. "add r2, r2, r5\n\t"
  60030. #endif
  60031. #ifdef WOLFSSL_KEIL
  60032. "adcs r3, r3, r6\n\t"
  60033. #elif defined(__clang__)
  60034. "adcs r3, r6\n\t"
  60035. #else
  60036. "adc r3, r6\n\t"
  60037. #endif
  60038. #ifdef WOLFSSL_KEIL
  60039. "adcs r4, r4, %[r]\n\t"
  60040. #elif defined(__clang__)
  60041. "adcs r4, %[r]\n\t"
  60042. #else
  60043. "adc r4, %[r]\n\t"
  60044. #endif
  60045. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60046. "adds r2, r2, r5\n\t"
  60047. #else
  60048. "add r2, r2, r5\n\t"
  60049. #endif
  60050. #ifdef WOLFSSL_KEIL
  60051. "adcs r3, r3, r6\n\t"
  60052. #elif defined(__clang__)
  60053. "adcs r3, r6\n\t"
  60054. #else
  60055. "adc r3, r6\n\t"
  60056. #endif
  60057. #ifdef WOLFSSL_KEIL
  60058. "adcs r4, r4, %[r]\n\t"
  60059. #elif defined(__clang__)
  60060. "adcs r4, %[r]\n\t"
  60061. #else
  60062. "adc r4, %[r]\n\t"
  60063. #endif
  60064. "# A[7] * A[2]\n\t"
  60065. "mov %[a], r9\n\t"
  60066. "mov r7, r12\n\t"
  60067. "ldr %[a], [%[a], #28]\n\t"
  60068. "uxth r5, %[a]\n\t"
  60069. "uxth r6, r7\n\t"
  60070. #ifdef WOLFSSL_KEIL
  60071. "muls r6, r5, r6\n\t"
  60072. #elif defined(__clang__)
  60073. "muls r6, r5\n\t"
  60074. #else
  60075. "mul r6, r5\n\t"
  60076. #endif
  60077. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60078. "adds r2, r2, r6\n\t"
  60079. #else
  60080. "add r2, r2, r6\n\t"
  60081. #endif
  60082. #ifdef WOLFSSL_KEIL
  60083. "adcs r3, r3, %[r]\n\t"
  60084. #elif defined(__clang__)
  60085. "adcs r3, %[r]\n\t"
  60086. #else
  60087. "adc r3, %[r]\n\t"
  60088. #endif
  60089. #ifdef WOLFSSL_KEIL
  60090. "adcs r4, r4, %[r]\n\t"
  60091. #elif defined(__clang__)
  60092. "adcs r4, %[r]\n\t"
  60093. #else
  60094. "adc r4, %[r]\n\t"
  60095. #endif
  60096. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60097. "adds r2, r2, r6\n\t"
  60098. #else
  60099. "add r2, r2, r6\n\t"
  60100. #endif
  60101. #ifdef WOLFSSL_KEIL
  60102. "adcs r3, r3, %[r]\n\t"
  60103. #elif defined(__clang__)
  60104. "adcs r3, %[r]\n\t"
  60105. #else
  60106. "adc r3, %[r]\n\t"
  60107. #endif
  60108. #ifdef WOLFSSL_KEIL
  60109. "adcs r4, r4, %[r]\n\t"
  60110. #elif defined(__clang__)
  60111. "adcs r4, %[r]\n\t"
  60112. #else
  60113. "adc r4, %[r]\n\t"
  60114. #endif
  60115. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60116. "lsrs r6, r7, #16\n\t"
  60117. #else
  60118. "lsr r6, r7, #16\n\t"
  60119. #endif
  60120. #ifdef WOLFSSL_KEIL
  60121. "muls r5, r6, r5\n\t"
  60122. #elif defined(__clang__)
  60123. "muls r5, r6\n\t"
  60124. #else
  60125. "mul r5, r6\n\t"
  60126. #endif
  60127. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60128. "lsrs r6, r5, #16\n\t"
  60129. #else
  60130. "lsr r6, r5, #16\n\t"
  60131. #endif
  60132. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60133. "lsls r5, r5, #16\n\t"
  60134. #else
  60135. "lsl r5, r5, #16\n\t"
  60136. #endif
  60137. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60138. "adds r2, r2, r5\n\t"
  60139. #else
  60140. "add r2, r2, r5\n\t"
  60141. #endif
  60142. #ifdef WOLFSSL_KEIL
  60143. "adcs r3, r3, r6\n\t"
  60144. #elif defined(__clang__)
  60145. "adcs r3, r6\n\t"
  60146. #else
  60147. "adc r3, r6\n\t"
  60148. #endif
  60149. #ifdef WOLFSSL_KEIL
  60150. "adcs r4, r4, %[r]\n\t"
  60151. #elif defined(__clang__)
  60152. "adcs r4, %[r]\n\t"
  60153. #else
  60154. "adc r4, %[r]\n\t"
  60155. #endif
  60156. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60157. "adds r2, r2, r5\n\t"
  60158. #else
  60159. "add r2, r2, r5\n\t"
  60160. #endif
  60161. #ifdef WOLFSSL_KEIL
  60162. "adcs r3, r3, r6\n\t"
  60163. #elif defined(__clang__)
  60164. "adcs r3, r6\n\t"
  60165. #else
  60166. "adc r3, r6\n\t"
  60167. #endif
  60168. #ifdef WOLFSSL_KEIL
  60169. "adcs r4, r4, %[r]\n\t"
  60170. #elif defined(__clang__)
  60171. "adcs r4, %[r]\n\t"
  60172. #else
  60173. "adc r4, %[r]\n\t"
  60174. #endif
  60175. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60176. "lsrs r5, %[a], #16\n\t"
  60177. #else
  60178. "lsr r5, %[a], #16\n\t"
  60179. #endif
  60180. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60181. "lsrs r6, r7, #16\n\t"
  60182. #else
  60183. "lsr r6, r7, #16\n\t"
  60184. #endif
  60185. #ifdef WOLFSSL_KEIL
  60186. "muls r6, r5, r6\n\t"
  60187. #elif defined(__clang__)
  60188. "muls r6, r5\n\t"
  60189. #else
  60190. "mul r6, r5\n\t"
  60191. #endif
  60192. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60193. "adds r3, r3, r6\n\t"
  60194. #else
  60195. "add r3, r3, r6\n\t"
  60196. #endif
  60197. #ifdef WOLFSSL_KEIL
  60198. "adcs r4, r4, %[r]\n\t"
  60199. #elif defined(__clang__)
  60200. "adcs r4, %[r]\n\t"
  60201. #else
  60202. "adc r4, %[r]\n\t"
  60203. #endif
  60204. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60205. "adds r3, r3, r6\n\t"
  60206. #else
  60207. "add r3, r3, r6\n\t"
  60208. #endif
  60209. #ifdef WOLFSSL_KEIL
  60210. "adcs r4, r4, %[r]\n\t"
  60211. #elif defined(__clang__)
  60212. "adcs r4, %[r]\n\t"
  60213. #else
  60214. "adc r4, %[r]\n\t"
  60215. #endif
  60216. "uxth r6, r7\n\t"
  60217. #ifdef WOLFSSL_KEIL
  60218. "muls r5, r6, r5\n\t"
  60219. #elif defined(__clang__)
  60220. "muls r5, r6\n\t"
  60221. #else
  60222. "mul r5, r6\n\t"
  60223. #endif
  60224. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60225. "lsrs r6, r5, #16\n\t"
  60226. #else
  60227. "lsr r6, r5, #16\n\t"
  60228. #endif
  60229. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60230. "lsls r5, r5, #16\n\t"
  60231. #else
  60232. "lsl r5, r5, #16\n\t"
  60233. #endif
  60234. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60235. "adds r2, r2, r5\n\t"
  60236. #else
  60237. "add r2, r2, r5\n\t"
  60238. #endif
  60239. #ifdef WOLFSSL_KEIL
  60240. "adcs r3, r3, r6\n\t"
  60241. #elif defined(__clang__)
  60242. "adcs r3, r6\n\t"
  60243. #else
  60244. "adc r3, r6\n\t"
  60245. #endif
  60246. #ifdef WOLFSSL_KEIL
  60247. "adcs r4, r4, %[r]\n\t"
  60248. #elif defined(__clang__)
  60249. "adcs r4, %[r]\n\t"
  60250. #else
  60251. "adc r4, %[r]\n\t"
  60252. #endif
  60253. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60254. "adds r2, r2, r5\n\t"
  60255. #else
  60256. "add r2, r2, r5\n\t"
  60257. #endif
  60258. #ifdef WOLFSSL_KEIL
  60259. "adcs r3, r3, r6\n\t"
  60260. #elif defined(__clang__)
  60261. "adcs r3, r6\n\t"
  60262. #else
  60263. "adc r3, r6\n\t"
  60264. #endif
  60265. #ifdef WOLFSSL_KEIL
  60266. "adcs r4, r4, %[r]\n\t"
  60267. #elif defined(__clang__)
  60268. "adcs r4, %[r]\n\t"
  60269. #else
  60270. "adc r4, %[r]\n\t"
  60271. #endif
  60272. "# A[8] * A[1]\n\t"
  60273. "mov %[a], r9\n\t"
  60274. "mov r7, r11\n\t"
  60275. "ldr %[a], [%[a], #32]\n\t"
  60276. "uxth r5, %[a]\n\t"
  60277. "uxth r6, r7\n\t"
  60278. #ifdef WOLFSSL_KEIL
  60279. "muls r6, r5, r6\n\t"
  60280. #elif defined(__clang__)
  60281. "muls r6, r5\n\t"
  60282. #else
  60283. "mul r6, r5\n\t"
  60284. #endif
  60285. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60286. "adds r2, r2, r6\n\t"
  60287. #else
  60288. "add r2, r2, r6\n\t"
  60289. #endif
  60290. #ifdef WOLFSSL_KEIL
  60291. "adcs r3, r3, %[r]\n\t"
  60292. #elif defined(__clang__)
  60293. "adcs r3, %[r]\n\t"
  60294. #else
  60295. "adc r3, %[r]\n\t"
  60296. #endif
  60297. #ifdef WOLFSSL_KEIL
  60298. "adcs r4, r4, %[r]\n\t"
  60299. #elif defined(__clang__)
  60300. "adcs r4, %[r]\n\t"
  60301. #else
  60302. "adc r4, %[r]\n\t"
  60303. #endif
  60304. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60305. "adds r2, r2, r6\n\t"
  60306. #else
  60307. "add r2, r2, r6\n\t"
  60308. #endif
  60309. #ifdef WOLFSSL_KEIL
  60310. "adcs r3, r3, %[r]\n\t"
  60311. #elif defined(__clang__)
  60312. "adcs r3, %[r]\n\t"
  60313. #else
  60314. "adc r3, %[r]\n\t"
  60315. #endif
  60316. #ifdef WOLFSSL_KEIL
  60317. "adcs r4, r4, %[r]\n\t"
  60318. #elif defined(__clang__)
  60319. "adcs r4, %[r]\n\t"
  60320. #else
  60321. "adc r4, %[r]\n\t"
  60322. #endif
  60323. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60324. "lsrs r6, r7, #16\n\t"
  60325. #else
  60326. "lsr r6, r7, #16\n\t"
  60327. #endif
  60328. #ifdef WOLFSSL_KEIL
  60329. "muls r5, r6, r5\n\t"
  60330. #elif defined(__clang__)
  60331. "muls r5, r6\n\t"
  60332. #else
  60333. "mul r5, r6\n\t"
  60334. #endif
  60335. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60336. "lsrs r6, r5, #16\n\t"
  60337. #else
  60338. "lsr r6, r5, #16\n\t"
  60339. #endif
  60340. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60341. "lsls r5, r5, #16\n\t"
  60342. #else
  60343. "lsl r5, r5, #16\n\t"
  60344. #endif
  60345. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60346. "adds r2, r2, r5\n\t"
  60347. #else
  60348. "add r2, r2, r5\n\t"
  60349. #endif
  60350. #ifdef WOLFSSL_KEIL
  60351. "adcs r3, r3, r6\n\t"
  60352. #elif defined(__clang__)
  60353. "adcs r3, r6\n\t"
  60354. #else
  60355. "adc r3, r6\n\t"
  60356. #endif
  60357. #ifdef WOLFSSL_KEIL
  60358. "adcs r4, r4, %[r]\n\t"
  60359. #elif defined(__clang__)
  60360. "adcs r4, %[r]\n\t"
  60361. #else
  60362. "adc r4, %[r]\n\t"
  60363. #endif
  60364. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60365. "adds r2, r2, r5\n\t"
  60366. #else
  60367. "add r2, r2, r5\n\t"
  60368. #endif
  60369. #ifdef WOLFSSL_KEIL
  60370. "adcs r3, r3, r6\n\t"
  60371. #elif defined(__clang__)
  60372. "adcs r3, r6\n\t"
  60373. #else
  60374. "adc r3, r6\n\t"
  60375. #endif
  60376. #ifdef WOLFSSL_KEIL
  60377. "adcs r4, r4, %[r]\n\t"
  60378. #elif defined(__clang__)
  60379. "adcs r4, %[r]\n\t"
  60380. #else
  60381. "adc r4, %[r]\n\t"
  60382. #endif
  60383. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60384. "lsrs r5, %[a], #16\n\t"
  60385. #else
  60386. "lsr r5, %[a], #16\n\t"
  60387. #endif
  60388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60389. "lsrs r6, r7, #16\n\t"
  60390. #else
  60391. "lsr r6, r7, #16\n\t"
  60392. #endif
  60393. #ifdef WOLFSSL_KEIL
  60394. "muls r6, r5, r6\n\t"
  60395. #elif defined(__clang__)
  60396. "muls r6, r5\n\t"
  60397. #else
  60398. "mul r6, r5\n\t"
  60399. #endif
  60400. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60401. "adds r3, r3, r6\n\t"
  60402. #else
  60403. "add r3, r3, r6\n\t"
  60404. #endif
  60405. #ifdef WOLFSSL_KEIL
  60406. "adcs r4, r4, %[r]\n\t"
  60407. #elif defined(__clang__)
  60408. "adcs r4, %[r]\n\t"
  60409. #else
  60410. "adc r4, %[r]\n\t"
  60411. #endif
  60412. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60413. "adds r3, r3, r6\n\t"
  60414. #else
  60415. "add r3, r3, r6\n\t"
  60416. #endif
  60417. #ifdef WOLFSSL_KEIL
  60418. "adcs r4, r4, %[r]\n\t"
  60419. #elif defined(__clang__)
  60420. "adcs r4, %[r]\n\t"
  60421. #else
  60422. "adc r4, %[r]\n\t"
  60423. #endif
  60424. "uxth r6, r7\n\t"
  60425. #ifdef WOLFSSL_KEIL
  60426. "muls r5, r6, r5\n\t"
  60427. #elif defined(__clang__)
  60428. "muls r5, r6\n\t"
  60429. #else
  60430. "mul r5, r6\n\t"
  60431. #endif
  60432. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60433. "lsrs r6, r5, #16\n\t"
  60434. #else
  60435. "lsr r6, r5, #16\n\t"
  60436. #endif
  60437. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60438. "lsls r5, r5, #16\n\t"
  60439. #else
  60440. "lsl r5, r5, #16\n\t"
  60441. #endif
  60442. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60443. "adds r2, r2, r5\n\t"
  60444. #else
  60445. "add r2, r2, r5\n\t"
  60446. #endif
  60447. #ifdef WOLFSSL_KEIL
  60448. "adcs r3, r3, r6\n\t"
  60449. #elif defined(__clang__)
  60450. "adcs r3, r6\n\t"
  60451. #else
  60452. "adc r3, r6\n\t"
  60453. #endif
  60454. #ifdef WOLFSSL_KEIL
  60455. "adcs r4, r4, %[r]\n\t"
  60456. #elif defined(__clang__)
  60457. "adcs r4, %[r]\n\t"
  60458. #else
  60459. "adc r4, %[r]\n\t"
  60460. #endif
  60461. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60462. "adds r2, r2, r5\n\t"
  60463. #else
  60464. "add r2, r2, r5\n\t"
  60465. #endif
  60466. #ifdef WOLFSSL_KEIL
  60467. "adcs r3, r3, r6\n\t"
  60468. #elif defined(__clang__)
  60469. "adcs r3, r6\n\t"
  60470. #else
  60471. "adc r3, r6\n\t"
  60472. #endif
  60473. #ifdef WOLFSSL_KEIL
  60474. "adcs r4, r4, %[r]\n\t"
  60475. #elif defined(__clang__)
  60476. "adcs r4, %[r]\n\t"
  60477. #else
  60478. "adc r4, %[r]\n\t"
  60479. #endif
  60480. "# A[9] * A[0]\n\t"
  60481. "mov %[a], r9\n\t"
  60482. "mov r7, r10\n\t"
  60483. "ldr %[a], [%[a], #36]\n\t"
  60484. "uxth r5, %[a]\n\t"
  60485. "uxth r6, r7\n\t"
  60486. #ifdef WOLFSSL_KEIL
  60487. "muls r6, r5, r6\n\t"
  60488. #elif defined(__clang__)
  60489. "muls r6, r5\n\t"
  60490. #else
  60491. "mul r6, r5\n\t"
  60492. #endif
  60493. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60494. "adds r2, r2, r6\n\t"
  60495. #else
  60496. "add r2, r2, r6\n\t"
  60497. #endif
  60498. #ifdef WOLFSSL_KEIL
  60499. "adcs r3, r3, %[r]\n\t"
  60500. #elif defined(__clang__)
  60501. "adcs r3, %[r]\n\t"
  60502. #else
  60503. "adc r3, %[r]\n\t"
  60504. #endif
  60505. #ifdef WOLFSSL_KEIL
  60506. "adcs r4, r4, %[r]\n\t"
  60507. #elif defined(__clang__)
  60508. "adcs r4, %[r]\n\t"
  60509. #else
  60510. "adc r4, %[r]\n\t"
  60511. #endif
  60512. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60513. "adds r2, r2, r6\n\t"
  60514. #else
  60515. "add r2, r2, r6\n\t"
  60516. #endif
  60517. #ifdef WOLFSSL_KEIL
  60518. "adcs r3, r3, %[r]\n\t"
  60519. #elif defined(__clang__)
  60520. "adcs r3, %[r]\n\t"
  60521. #else
  60522. "adc r3, %[r]\n\t"
  60523. #endif
  60524. #ifdef WOLFSSL_KEIL
  60525. "adcs r4, r4, %[r]\n\t"
  60526. #elif defined(__clang__)
  60527. "adcs r4, %[r]\n\t"
  60528. #else
  60529. "adc r4, %[r]\n\t"
  60530. #endif
  60531. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60532. "lsrs r6, r7, #16\n\t"
  60533. #else
  60534. "lsr r6, r7, #16\n\t"
  60535. #endif
  60536. #ifdef WOLFSSL_KEIL
  60537. "muls r5, r6, r5\n\t"
  60538. #elif defined(__clang__)
  60539. "muls r5, r6\n\t"
  60540. #else
  60541. "mul r5, r6\n\t"
  60542. #endif
  60543. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60544. "lsrs r6, r5, #16\n\t"
  60545. #else
  60546. "lsr r6, r5, #16\n\t"
  60547. #endif
  60548. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60549. "lsls r5, r5, #16\n\t"
  60550. #else
  60551. "lsl r5, r5, #16\n\t"
  60552. #endif
  60553. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60554. "adds r2, r2, r5\n\t"
  60555. #else
  60556. "add r2, r2, r5\n\t"
  60557. #endif
  60558. #ifdef WOLFSSL_KEIL
  60559. "adcs r3, r3, r6\n\t"
  60560. #elif defined(__clang__)
  60561. "adcs r3, r6\n\t"
  60562. #else
  60563. "adc r3, r6\n\t"
  60564. #endif
  60565. #ifdef WOLFSSL_KEIL
  60566. "adcs r4, r4, %[r]\n\t"
  60567. #elif defined(__clang__)
  60568. "adcs r4, %[r]\n\t"
  60569. #else
  60570. "adc r4, %[r]\n\t"
  60571. #endif
  60572. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60573. "adds r2, r2, r5\n\t"
  60574. #else
  60575. "add r2, r2, r5\n\t"
  60576. #endif
  60577. #ifdef WOLFSSL_KEIL
  60578. "adcs r3, r3, r6\n\t"
  60579. #elif defined(__clang__)
  60580. "adcs r3, r6\n\t"
  60581. #else
  60582. "adc r3, r6\n\t"
  60583. #endif
  60584. #ifdef WOLFSSL_KEIL
  60585. "adcs r4, r4, %[r]\n\t"
  60586. #elif defined(__clang__)
  60587. "adcs r4, %[r]\n\t"
  60588. #else
  60589. "adc r4, %[r]\n\t"
  60590. #endif
  60591. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60592. "lsrs r5, %[a], #16\n\t"
  60593. #else
  60594. "lsr r5, %[a], #16\n\t"
  60595. #endif
  60596. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60597. "lsrs r6, r7, #16\n\t"
  60598. #else
  60599. "lsr r6, r7, #16\n\t"
  60600. #endif
  60601. #ifdef WOLFSSL_KEIL
  60602. "muls r6, r5, r6\n\t"
  60603. #elif defined(__clang__)
  60604. "muls r6, r5\n\t"
  60605. #else
  60606. "mul r6, r5\n\t"
  60607. #endif
  60608. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60609. "adds r3, r3, r6\n\t"
  60610. #else
  60611. "add r3, r3, r6\n\t"
  60612. #endif
  60613. #ifdef WOLFSSL_KEIL
  60614. "adcs r4, r4, %[r]\n\t"
  60615. #elif defined(__clang__)
  60616. "adcs r4, %[r]\n\t"
  60617. #else
  60618. "adc r4, %[r]\n\t"
  60619. #endif
  60620. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60621. "adds r3, r3, r6\n\t"
  60622. #else
  60623. "add r3, r3, r6\n\t"
  60624. #endif
  60625. #ifdef WOLFSSL_KEIL
  60626. "adcs r4, r4, %[r]\n\t"
  60627. #elif defined(__clang__)
  60628. "adcs r4, %[r]\n\t"
  60629. #else
  60630. "adc r4, %[r]\n\t"
  60631. #endif
  60632. "uxth r6, r7\n\t"
  60633. #ifdef WOLFSSL_KEIL
  60634. "muls r5, r6, r5\n\t"
  60635. #elif defined(__clang__)
  60636. "muls r5, r6\n\t"
  60637. #else
  60638. "mul r5, r6\n\t"
  60639. #endif
  60640. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60641. "lsrs r6, r5, #16\n\t"
  60642. #else
  60643. "lsr r6, r5, #16\n\t"
  60644. #endif
  60645. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60646. "lsls r5, r5, #16\n\t"
  60647. #else
  60648. "lsl r5, r5, #16\n\t"
  60649. #endif
  60650. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60651. "adds r2, r2, r5\n\t"
  60652. #else
  60653. "add r2, r2, r5\n\t"
  60654. #endif
  60655. #ifdef WOLFSSL_KEIL
  60656. "adcs r3, r3, r6\n\t"
  60657. #elif defined(__clang__)
  60658. "adcs r3, r6\n\t"
  60659. #else
  60660. "adc r3, r6\n\t"
  60661. #endif
  60662. #ifdef WOLFSSL_KEIL
  60663. "adcs r4, r4, %[r]\n\t"
  60664. #elif defined(__clang__)
  60665. "adcs r4, %[r]\n\t"
  60666. #else
  60667. "adc r4, %[r]\n\t"
  60668. #endif
  60669. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60670. "adds r2, r2, r5\n\t"
  60671. #else
  60672. "add r2, r2, r5\n\t"
  60673. #endif
  60674. #ifdef WOLFSSL_KEIL
  60675. "adcs r3, r3, r6\n\t"
  60676. #elif defined(__clang__)
  60677. "adcs r3, r6\n\t"
  60678. #else
  60679. "adc r3, r6\n\t"
  60680. #endif
  60681. #ifdef WOLFSSL_KEIL
  60682. "adcs r4, r4, %[r]\n\t"
  60683. #elif defined(__clang__)
  60684. "adcs r4, %[r]\n\t"
  60685. #else
  60686. "adc r4, %[r]\n\t"
  60687. #endif
  60688. "str r2, [sp, #36]\n\t"
  60689. "# A[10] * A[0]\n\t"
  60690. "movs r2, #0\n\t"
  60691. "mov %[a], r9\n\t"
  60692. "ldr %[a], [%[a], #40]\n\t"
  60693. "uxth r5, %[a]\n\t"
  60694. "uxth r6, r7\n\t"
  60695. #ifdef WOLFSSL_KEIL
  60696. "muls r6, r5, r6\n\t"
  60697. #elif defined(__clang__)
  60698. "muls r6, r5\n\t"
  60699. #else
  60700. "mul r6, r5\n\t"
  60701. #endif
  60702. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60703. "adds r3, r3, r6\n\t"
  60704. #else
  60705. "add r3, r3, r6\n\t"
  60706. #endif
  60707. #ifdef WOLFSSL_KEIL
  60708. "adcs r4, r4, %[r]\n\t"
  60709. #elif defined(__clang__)
  60710. "adcs r4, %[r]\n\t"
  60711. #else
  60712. "adc r4, %[r]\n\t"
  60713. #endif
  60714. #ifdef WOLFSSL_KEIL
  60715. "adcs r2, r2, %[r]\n\t"
  60716. #elif defined(__clang__)
  60717. "adcs r2, %[r]\n\t"
  60718. #else
  60719. "adc r2, %[r]\n\t"
  60720. #endif
  60721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60722. "adds r3, r3, r6\n\t"
  60723. #else
  60724. "add r3, r3, r6\n\t"
  60725. #endif
  60726. #ifdef WOLFSSL_KEIL
  60727. "adcs r4, r4, %[r]\n\t"
  60728. #elif defined(__clang__)
  60729. "adcs r4, %[r]\n\t"
  60730. #else
  60731. "adc r4, %[r]\n\t"
  60732. #endif
  60733. #ifdef WOLFSSL_KEIL
  60734. "adcs r2, r2, %[r]\n\t"
  60735. #elif defined(__clang__)
  60736. "adcs r2, %[r]\n\t"
  60737. #else
  60738. "adc r2, %[r]\n\t"
  60739. #endif
  60740. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60741. "lsrs r6, r7, #16\n\t"
  60742. #else
  60743. "lsr r6, r7, #16\n\t"
  60744. #endif
  60745. #ifdef WOLFSSL_KEIL
  60746. "muls r5, r6, r5\n\t"
  60747. #elif defined(__clang__)
  60748. "muls r5, r6\n\t"
  60749. #else
  60750. "mul r5, r6\n\t"
  60751. #endif
  60752. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60753. "lsrs r6, r5, #16\n\t"
  60754. #else
  60755. "lsr r6, r5, #16\n\t"
  60756. #endif
  60757. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60758. "lsls r5, r5, #16\n\t"
  60759. #else
  60760. "lsl r5, r5, #16\n\t"
  60761. #endif
  60762. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60763. "adds r3, r3, r5\n\t"
  60764. #else
  60765. "add r3, r3, r5\n\t"
  60766. #endif
  60767. #ifdef WOLFSSL_KEIL
  60768. "adcs r4, r4, r6\n\t"
  60769. #elif defined(__clang__)
  60770. "adcs r4, r6\n\t"
  60771. #else
  60772. "adc r4, r6\n\t"
  60773. #endif
  60774. #ifdef WOLFSSL_KEIL
  60775. "adcs r2, r2, %[r]\n\t"
  60776. #elif defined(__clang__)
  60777. "adcs r2, %[r]\n\t"
  60778. #else
  60779. "adc r2, %[r]\n\t"
  60780. #endif
  60781. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60782. "adds r3, r3, r5\n\t"
  60783. #else
  60784. "add r3, r3, r5\n\t"
  60785. #endif
  60786. #ifdef WOLFSSL_KEIL
  60787. "adcs r4, r4, r6\n\t"
  60788. #elif defined(__clang__)
  60789. "adcs r4, r6\n\t"
  60790. #else
  60791. "adc r4, r6\n\t"
  60792. #endif
  60793. #ifdef WOLFSSL_KEIL
  60794. "adcs r2, r2, %[r]\n\t"
  60795. #elif defined(__clang__)
  60796. "adcs r2, %[r]\n\t"
  60797. #else
  60798. "adc r2, %[r]\n\t"
  60799. #endif
  60800. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60801. "lsrs r5, %[a], #16\n\t"
  60802. #else
  60803. "lsr r5, %[a], #16\n\t"
  60804. #endif
  60805. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60806. "lsrs r6, r7, #16\n\t"
  60807. #else
  60808. "lsr r6, r7, #16\n\t"
  60809. #endif
  60810. #ifdef WOLFSSL_KEIL
  60811. "muls r6, r5, r6\n\t"
  60812. #elif defined(__clang__)
  60813. "muls r6, r5\n\t"
  60814. #else
  60815. "mul r6, r5\n\t"
  60816. #endif
  60817. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60818. "adds r4, r4, r6\n\t"
  60819. #else
  60820. "add r4, r4, r6\n\t"
  60821. #endif
  60822. #ifdef WOLFSSL_KEIL
  60823. "adcs r2, r2, %[r]\n\t"
  60824. #elif defined(__clang__)
  60825. "adcs r2, %[r]\n\t"
  60826. #else
  60827. "adc r2, %[r]\n\t"
  60828. #endif
  60829. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60830. "adds r4, r4, r6\n\t"
  60831. #else
  60832. "add r4, r4, r6\n\t"
  60833. #endif
  60834. #ifdef WOLFSSL_KEIL
  60835. "adcs r2, r2, %[r]\n\t"
  60836. #elif defined(__clang__)
  60837. "adcs r2, %[r]\n\t"
  60838. #else
  60839. "adc r2, %[r]\n\t"
  60840. #endif
  60841. "uxth r6, r7\n\t"
  60842. #ifdef WOLFSSL_KEIL
  60843. "muls r5, r6, r5\n\t"
  60844. #elif defined(__clang__)
  60845. "muls r5, r6\n\t"
  60846. #else
  60847. "mul r5, r6\n\t"
  60848. #endif
  60849. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60850. "lsrs r6, r5, #16\n\t"
  60851. #else
  60852. "lsr r6, r5, #16\n\t"
  60853. #endif
  60854. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60855. "lsls r5, r5, #16\n\t"
  60856. #else
  60857. "lsl r5, r5, #16\n\t"
  60858. #endif
  60859. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60860. "adds r3, r3, r5\n\t"
  60861. #else
  60862. "add r3, r3, r5\n\t"
  60863. #endif
  60864. #ifdef WOLFSSL_KEIL
  60865. "adcs r4, r4, r6\n\t"
  60866. #elif defined(__clang__)
  60867. "adcs r4, r6\n\t"
  60868. #else
  60869. "adc r4, r6\n\t"
  60870. #endif
  60871. #ifdef WOLFSSL_KEIL
  60872. "adcs r2, r2, %[r]\n\t"
  60873. #elif defined(__clang__)
  60874. "adcs r2, %[r]\n\t"
  60875. #else
  60876. "adc r2, %[r]\n\t"
  60877. #endif
  60878. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60879. "adds r3, r3, r5\n\t"
  60880. #else
  60881. "add r3, r3, r5\n\t"
  60882. #endif
  60883. #ifdef WOLFSSL_KEIL
  60884. "adcs r4, r4, r6\n\t"
  60885. #elif defined(__clang__)
  60886. "adcs r4, r6\n\t"
  60887. #else
  60888. "adc r4, r6\n\t"
  60889. #endif
  60890. #ifdef WOLFSSL_KEIL
  60891. "adcs r2, r2, %[r]\n\t"
  60892. #elif defined(__clang__)
  60893. "adcs r2, %[r]\n\t"
  60894. #else
  60895. "adc r2, %[r]\n\t"
  60896. #endif
  60897. "# A[9] * A[1]\n\t"
  60898. "mov %[a], r9\n\t"
  60899. "mov r7, r11\n\t"
  60900. "ldr %[a], [%[a], #36]\n\t"
  60901. "uxth r5, %[a]\n\t"
  60902. "uxth r6, r7\n\t"
  60903. #ifdef WOLFSSL_KEIL
  60904. "muls r6, r5, r6\n\t"
  60905. #elif defined(__clang__)
  60906. "muls r6, r5\n\t"
  60907. #else
  60908. "mul r6, r5\n\t"
  60909. #endif
  60910. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60911. "adds r3, r3, r6\n\t"
  60912. #else
  60913. "add r3, r3, r6\n\t"
  60914. #endif
  60915. #ifdef WOLFSSL_KEIL
  60916. "adcs r4, r4, %[r]\n\t"
  60917. #elif defined(__clang__)
  60918. "adcs r4, %[r]\n\t"
  60919. #else
  60920. "adc r4, %[r]\n\t"
  60921. #endif
  60922. #ifdef WOLFSSL_KEIL
  60923. "adcs r2, r2, %[r]\n\t"
  60924. #elif defined(__clang__)
  60925. "adcs r2, %[r]\n\t"
  60926. #else
  60927. "adc r2, %[r]\n\t"
  60928. #endif
  60929. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60930. "adds r3, r3, r6\n\t"
  60931. #else
  60932. "add r3, r3, r6\n\t"
  60933. #endif
  60934. #ifdef WOLFSSL_KEIL
  60935. "adcs r4, r4, %[r]\n\t"
  60936. #elif defined(__clang__)
  60937. "adcs r4, %[r]\n\t"
  60938. #else
  60939. "adc r4, %[r]\n\t"
  60940. #endif
  60941. #ifdef WOLFSSL_KEIL
  60942. "adcs r2, r2, %[r]\n\t"
  60943. #elif defined(__clang__)
  60944. "adcs r2, %[r]\n\t"
  60945. #else
  60946. "adc r2, %[r]\n\t"
  60947. #endif
  60948. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60949. "lsrs r6, r7, #16\n\t"
  60950. #else
  60951. "lsr r6, r7, #16\n\t"
  60952. #endif
  60953. #ifdef WOLFSSL_KEIL
  60954. "muls r5, r6, r5\n\t"
  60955. #elif defined(__clang__)
  60956. "muls r5, r6\n\t"
  60957. #else
  60958. "mul r5, r6\n\t"
  60959. #endif
  60960. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60961. "lsrs r6, r5, #16\n\t"
  60962. #else
  60963. "lsr r6, r5, #16\n\t"
  60964. #endif
  60965. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60966. "lsls r5, r5, #16\n\t"
  60967. #else
  60968. "lsl r5, r5, #16\n\t"
  60969. #endif
  60970. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60971. "adds r3, r3, r5\n\t"
  60972. #else
  60973. "add r3, r3, r5\n\t"
  60974. #endif
  60975. #ifdef WOLFSSL_KEIL
  60976. "adcs r4, r4, r6\n\t"
  60977. #elif defined(__clang__)
  60978. "adcs r4, r6\n\t"
  60979. #else
  60980. "adc r4, r6\n\t"
  60981. #endif
  60982. #ifdef WOLFSSL_KEIL
  60983. "adcs r2, r2, %[r]\n\t"
  60984. #elif defined(__clang__)
  60985. "adcs r2, %[r]\n\t"
  60986. #else
  60987. "adc r2, %[r]\n\t"
  60988. #endif
  60989. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60990. "adds r3, r3, r5\n\t"
  60991. #else
  60992. "add r3, r3, r5\n\t"
  60993. #endif
  60994. #ifdef WOLFSSL_KEIL
  60995. "adcs r4, r4, r6\n\t"
  60996. #elif defined(__clang__)
  60997. "adcs r4, r6\n\t"
  60998. #else
  60999. "adc r4, r6\n\t"
  61000. #endif
  61001. #ifdef WOLFSSL_KEIL
  61002. "adcs r2, r2, %[r]\n\t"
  61003. #elif defined(__clang__)
  61004. "adcs r2, %[r]\n\t"
  61005. #else
  61006. "adc r2, %[r]\n\t"
  61007. #endif
  61008. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61009. "lsrs r5, %[a], #16\n\t"
  61010. #else
  61011. "lsr r5, %[a], #16\n\t"
  61012. #endif
  61013. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61014. "lsrs r6, r7, #16\n\t"
  61015. #else
  61016. "lsr r6, r7, #16\n\t"
  61017. #endif
  61018. #ifdef WOLFSSL_KEIL
  61019. "muls r6, r5, r6\n\t"
  61020. #elif defined(__clang__)
  61021. "muls r6, r5\n\t"
  61022. #else
  61023. "mul r6, r5\n\t"
  61024. #endif
  61025. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61026. "adds r4, r4, r6\n\t"
  61027. #else
  61028. "add r4, r4, r6\n\t"
  61029. #endif
  61030. #ifdef WOLFSSL_KEIL
  61031. "adcs r2, r2, %[r]\n\t"
  61032. #elif defined(__clang__)
  61033. "adcs r2, %[r]\n\t"
  61034. #else
  61035. "adc r2, %[r]\n\t"
  61036. #endif
  61037. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61038. "adds r4, r4, r6\n\t"
  61039. #else
  61040. "add r4, r4, r6\n\t"
  61041. #endif
  61042. #ifdef WOLFSSL_KEIL
  61043. "adcs r2, r2, %[r]\n\t"
  61044. #elif defined(__clang__)
  61045. "adcs r2, %[r]\n\t"
  61046. #else
  61047. "adc r2, %[r]\n\t"
  61048. #endif
  61049. "uxth r6, r7\n\t"
  61050. #ifdef WOLFSSL_KEIL
  61051. "muls r5, r6, r5\n\t"
  61052. #elif defined(__clang__)
  61053. "muls r5, r6\n\t"
  61054. #else
  61055. "mul r5, r6\n\t"
  61056. #endif
  61057. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61058. "lsrs r6, r5, #16\n\t"
  61059. #else
  61060. "lsr r6, r5, #16\n\t"
  61061. #endif
  61062. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61063. "lsls r5, r5, #16\n\t"
  61064. #else
  61065. "lsl r5, r5, #16\n\t"
  61066. #endif
  61067. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61068. "adds r3, r3, r5\n\t"
  61069. #else
  61070. "add r3, r3, r5\n\t"
  61071. #endif
  61072. #ifdef WOLFSSL_KEIL
  61073. "adcs r4, r4, r6\n\t"
  61074. #elif defined(__clang__)
  61075. "adcs r4, r6\n\t"
  61076. #else
  61077. "adc r4, r6\n\t"
  61078. #endif
  61079. #ifdef WOLFSSL_KEIL
  61080. "adcs r2, r2, %[r]\n\t"
  61081. #elif defined(__clang__)
  61082. "adcs r2, %[r]\n\t"
  61083. #else
  61084. "adc r2, %[r]\n\t"
  61085. #endif
  61086. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61087. "adds r3, r3, r5\n\t"
  61088. #else
  61089. "add r3, r3, r5\n\t"
  61090. #endif
  61091. #ifdef WOLFSSL_KEIL
  61092. "adcs r4, r4, r6\n\t"
  61093. #elif defined(__clang__)
  61094. "adcs r4, r6\n\t"
  61095. #else
  61096. "adc r4, r6\n\t"
  61097. #endif
  61098. #ifdef WOLFSSL_KEIL
  61099. "adcs r2, r2, %[r]\n\t"
  61100. #elif defined(__clang__)
  61101. "adcs r2, %[r]\n\t"
  61102. #else
  61103. "adc r2, %[r]\n\t"
  61104. #endif
  61105. "# A[8] * A[2]\n\t"
  61106. "mov %[a], r9\n\t"
  61107. "mov r7, r12\n\t"
  61108. "ldr %[a], [%[a], #32]\n\t"
  61109. "uxth r5, %[a]\n\t"
  61110. "uxth r6, r7\n\t"
  61111. #ifdef WOLFSSL_KEIL
  61112. "muls r6, r5, r6\n\t"
  61113. #elif defined(__clang__)
  61114. "muls r6, r5\n\t"
  61115. #else
  61116. "mul r6, r5\n\t"
  61117. #endif
  61118. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61119. "adds r3, r3, r6\n\t"
  61120. #else
  61121. "add r3, r3, r6\n\t"
  61122. #endif
  61123. #ifdef WOLFSSL_KEIL
  61124. "adcs r4, r4, %[r]\n\t"
  61125. #elif defined(__clang__)
  61126. "adcs r4, %[r]\n\t"
  61127. #else
  61128. "adc r4, %[r]\n\t"
  61129. #endif
  61130. #ifdef WOLFSSL_KEIL
  61131. "adcs r2, r2, %[r]\n\t"
  61132. #elif defined(__clang__)
  61133. "adcs r2, %[r]\n\t"
  61134. #else
  61135. "adc r2, %[r]\n\t"
  61136. #endif
  61137. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61138. "adds r3, r3, r6\n\t"
  61139. #else
  61140. "add r3, r3, r6\n\t"
  61141. #endif
  61142. #ifdef WOLFSSL_KEIL
  61143. "adcs r4, r4, %[r]\n\t"
  61144. #elif defined(__clang__)
  61145. "adcs r4, %[r]\n\t"
  61146. #else
  61147. "adc r4, %[r]\n\t"
  61148. #endif
  61149. #ifdef WOLFSSL_KEIL
  61150. "adcs r2, r2, %[r]\n\t"
  61151. #elif defined(__clang__)
  61152. "adcs r2, %[r]\n\t"
  61153. #else
  61154. "adc r2, %[r]\n\t"
  61155. #endif
  61156. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61157. "lsrs r6, r7, #16\n\t"
  61158. #else
  61159. "lsr r6, r7, #16\n\t"
  61160. #endif
  61161. #ifdef WOLFSSL_KEIL
  61162. "muls r5, r6, r5\n\t"
  61163. #elif defined(__clang__)
  61164. "muls r5, r6\n\t"
  61165. #else
  61166. "mul r5, r6\n\t"
  61167. #endif
  61168. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61169. "lsrs r6, r5, #16\n\t"
  61170. #else
  61171. "lsr r6, r5, #16\n\t"
  61172. #endif
  61173. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61174. "lsls r5, r5, #16\n\t"
  61175. #else
  61176. "lsl r5, r5, #16\n\t"
  61177. #endif
  61178. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61179. "adds r3, r3, r5\n\t"
  61180. #else
  61181. "add r3, r3, r5\n\t"
  61182. #endif
  61183. #ifdef WOLFSSL_KEIL
  61184. "adcs r4, r4, r6\n\t"
  61185. #elif defined(__clang__)
  61186. "adcs r4, r6\n\t"
  61187. #else
  61188. "adc r4, r6\n\t"
  61189. #endif
  61190. #ifdef WOLFSSL_KEIL
  61191. "adcs r2, r2, %[r]\n\t"
  61192. #elif defined(__clang__)
  61193. "adcs r2, %[r]\n\t"
  61194. #else
  61195. "adc r2, %[r]\n\t"
  61196. #endif
  61197. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61198. "adds r3, r3, r5\n\t"
  61199. #else
  61200. "add r3, r3, r5\n\t"
  61201. #endif
  61202. #ifdef WOLFSSL_KEIL
  61203. "adcs r4, r4, r6\n\t"
  61204. #elif defined(__clang__)
  61205. "adcs r4, r6\n\t"
  61206. #else
  61207. "adc r4, r6\n\t"
  61208. #endif
  61209. #ifdef WOLFSSL_KEIL
  61210. "adcs r2, r2, %[r]\n\t"
  61211. #elif defined(__clang__)
  61212. "adcs r2, %[r]\n\t"
  61213. #else
  61214. "adc r2, %[r]\n\t"
  61215. #endif
  61216. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61217. "lsrs r5, %[a], #16\n\t"
  61218. #else
  61219. "lsr r5, %[a], #16\n\t"
  61220. #endif
  61221. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61222. "lsrs r6, r7, #16\n\t"
  61223. #else
  61224. "lsr r6, r7, #16\n\t"
  61225. #endif
  61226. #ifdef WOLFSSL_KEIL
  61227. "muls r6, r5, r6\n\t"
  61228. #elif defined(__clang__)
  61229. "muls r6, r5\n\t"
  61230. #else
  61231. "mul r6, r5\n\t"
  61232. #endif
  61233. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61234. "adds r4, r4, r6\n\t"
  61235. #else
  61236. "add r4, r4, r6\n\t"
  61237. #endif
  61238. #ifdef WOLFSSL_KEIL
  61239. "adcs r2, r2, %[r]\n\t"
  61240. #elif defined(__clang__)
  61241. "adcs r2, %[r]\n\t"
  61242. #else
  61243. "adc r2, %[r]\n\t"
  61244. #endif
  61245. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61246. "adds r4, r4, r6\n\t"
  61247. #else
  61248. "add r4, r4, r6\n\t"
  61249. #endif
  61250. #ifdef WOLFSSL_KEIL
  61251. "adcs r2, r2, %[r]\n\t"
  61252. #elif defined(__clang__)
  61253. "adcs r2, %[r]\n\t"
  61254. #else
  61255. "adc r2, %[r]\n\t"
  61256. #endif
  61257. "uxth r6, r7\n\t"
  61258. #ifdef WOLFSSL_KEIL
  61259. "muls r5, r6, r5\n\t"
  61260. #elif defined(__clang__)
  61261. "muls r5, r6\n\t"
  61262. #else
  61263. "mul r5, r6\n\t"
  61264. #endif
  61265. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61266. "lsrs r6, r5, #16\n\t"
  61267. #else
  61268. "lsr r6, r5, #16\n\t"
  61269. #endif
  61270. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61271. "lsls r5, r5, #16\n\t"
  61272. #else
  61273. "lsl r5, r5, #16\n\t"
  61274. #endif
  61275. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61276. "adds r3, r3, r5\n\t"
  61277. #else
  61278. "add r3, r3, r5\n\t"
  61279. #endif
  61280. #ifdef WOLFSSL_KEIL
  61281. "adcs r4, r4, r6\n\t"
  61282. #elif defined(__clang__)
  61283. "adcs r4, r6\n\t"
  61284. #else
  61285. "adc r4, r6\n\t"
  61286. #endif
  61287. #ifdef WOLFSSL_KEIL
  61288. "adcs r2, r2, %[r]\n\t"
  61289. #elif defined(__clang__)
  61290. "adcs r2, %[r]\n\t"
  61291. #else
  61292. "adc r2, %[r]\n\t"
  61293. #endif
  61294. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61295. "adds r3, r3, r5\n\t"
  61296. #else
  61297. "add r3, r3, r5\n\t"
  61298. #endif
  61299. #ifdef WOLFSSL_KEIL
  61300. "adcs r4, r4, r6\n\t"
  61301. #elif defined(__clang__)
  61302. "adcs r4, r6\n\t"
  61303. #else
  61304. "adc r4, r6\n\t"
  61305. #endif
  61306. #ifdef WOLFSSL_KEIL
  61307. "adcs r2, r2, %[r]\n\t"
  61308. #elif defined(__clang__)
  61309. "adcs r2, %[r]\n\t"
  61310. #else
  61311. "adc r2, %[r]\n\t"
  61312. #endif
  61313. "# A[7] * A[3]\n\t"
  61314. "mov %[a], r9\n\t"
  61315. "mov r7, lr\n\t"
  61316. "ldr %[a], [%[a], #28]\n\t"
  61317. "uxth r5, %[a]\n\t"
  61318. "uxth r6, r7\n\t"
  61319. #ifdef WOLFSSL_KEIL
  61320. "muls r6, r5, r6\n\t"
  61321. #elif defined(__clang__)
  61322. "muls r6, r5\n\t"
  61323. #else
  61324. "mul r6, r5\n\t"
  61325. #endif
  61326. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61327. "adds r3, r3, r6\n\t"
  61328. #else
  61329. "add r3, r3, r6\n\t"
  61330. #endif
  61331. #ifdef WOLFSSL_KEIL
  61332. "adcs r4, r4, %[r]\n\t"
  61333. #elif defined(__clang__)
  61334. "adcs r4, %[r]\n\t"
  61335. #else
  61336. "adc r4, %[r]\n\t"
  61337. #endif
  61338. #ifdef WOLFSSL_KEIL
  61339. "adcs r2, r2, %[r]\n\t"
  61340. #elif defined(__clang__)
  61341. "adcs r2, %[r]\n\t"
  61342. #else
  61343. "adc r2, %[r]\n\t"
  61344. #endif
  61345. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61346. "adds r3, r3, r6\n\t"
  61347. #else
  61348. "add r3, r3, r6\n\t"
  61349. #endif
  61350. #ifdef WOLFSSL_KEIL
  61351. "adcs r4, r4, %[r]\n\t"
  61352. #elif defined(__clang__)
  61353. "adcs r4, %[r]\n\t"
  61354. #else
  61355. "adc r4, %[r]\n\t"
  61356. #endif
  61357. #ifdef WOLFSSL_KEIL
  61358. "adcs r2, r2, %[r]\n\t"
  61359. #elif defined(__clang__)
  61360. "adcs r2, %[r]\n\t"
  61361. #else
  61362. "adc r2, %[r]\n\t"
  61363. #endif
  61364. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61365. "lsrs r6, r7, #16\n\t"
  61366. #else
  61367. "lsr r6, r7, #16\n\t"
  61368. #endif
  61369. #ifdef WOLFSSL_KEIL
  61370. "muls r5, r6, r5\n\t"
  61371. #elif defined(__clang__)
  61372. "muls r5, r6\n\t"
  61373. #else
  61374. "mul r5, r6\n\t"
  61375. #endif
  61376. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61377. "lsrs r6, r5, #16\n\t"
  61378. #else
  61379. "lsr r6, r5, #16\n\t"
  61380. #endif
  61381. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61382. "lsls r5, r5, #16\n\t"
  61383. #else
  61384. "lsl r5, r5, #16\n\t"
  61385. #endif
  61386. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61387. "adds r3, r3, r5\n\t"
  61388. #else
  61389. "add r3, r3, r5\n\t"
  61390. #endif
  61391. #ifdef WOLFSSL_KEIL
  61392. "adcs r4, r4, r6\n\t"
  61393. #elif defined(__clang__)
  61394. "adcs r4, r6\n\t"
  61395. #else
  61396. "adc r4, r6\n\t"
  61397. #endif
  61398. #ifdef WOLFSSL_KEIL
  61399. "adcs r2, r2, %[r]\n\t"
  61400. #elif defined(__clang__)
  61401. "adcs r2, %[r]\n\t"
  61402. #else
  61403. "adc r2, %[r]\n\t"
  61404. #endif
  61405. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61406. "adds r3, r3, r5\n\t"
  61407. #else
  61408. "add r3, r3, r5\n\t"
  61409. #endif
  61410. #ifdef WOLFSSL_KEIL
  61411. "adcs r4, r4, r6\n\t"
  61412. #elif defined(__clang__)
  61413. "adcs r4, r6\n\t"
  61414. #else
  61415. "adc r4, r6\n\t"
  61416. #endif
  61417. #ifdef WOLFSSL_KEIL
  61418. "adcs r2, r2, %[r]\n\t"
  61419. #elif defined(__clang__)
  61420. "adcs r2, %[r]\n\t"
  61421. #else
  61422. "adc r2, %[r]\n\t"
  61423. #endif
  61424. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61425. "lsrs r5, %[a], #16\n\t"
  61426. #else
  61427. "lsr r5, %[a], #16\n\t"
  61428. #endif
  61429. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61430. "lsrs r6, r7, #16\n\t"
  61431. #else
  61432. "lsr r6, r7, #16\n\t"
  61433. #endif
  61434. #ifdef WOLFSSL_KEIL
  61435. "muls r6, r5, r6\n\t"
  61436. #elif defined(__clang__)
  61437. "muls r6, r5\n\t"
  61438. #else
  61439. "mul r6, r5\n\t"
  61440. #endif
  61441. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61442. "adds r4, r4, r6\n\t"
  61443. #else
  61444. "add r4, r4, r6\n\t"
  61445. #endif
  61446. #ifdef WOLFSSL_KEIL
  61447. "adcs r2, r2, %[r]\n\t"
  61448. #elif defined(__clang__)
  61449. "adcs r2, %[r]\n\t"
  61450. #else
  61451. "adc r2, %[r]\n\t"
  61452. #endif
  61453. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61454. "adds r4, r4, r6\n\t"
  61455. #else
  61456. "add r4, r4, r6\n\t"
  61457. #endif
  61458. #ifdef WOLFSSL_KEIL
  61459. "adcs r2, r2, %[r]\n\t"
  61460. #elif defined(__clang__)
  61461. "adcs r2, %[r]\n\t"
  61462. #else
  61463. "adc r2, %[r]\n\t"
  61464. #endif
  61465. "uxth r6, r7\n\t"
  61466. #ifdef WOLFSSL_KEIL
  61467. "muls r5, r6, r5\n\t"
  61468. #elif defined(__clang__)
  61469. "muls r5, r6\n\t"
  61470. #else
  61471. "mul r5, r6\n\t"
  61472. #endif
  61473. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61474. "lsrs r6, r5, #16\n\t"
  61475. #else
  61476. "lsr r6, r5, #16\n\t"
  61477. #endif
  61478. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61479. "lsls r5, r5, #16\n\t"
  61480. #else
  61481. "lsl r5, r5, #16\n\t"
  61482. #endif
  61483. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61484. "adds r3, r3, r5\n\t"
  61485. #else
  61486. "add r3, r3, r5\n\t"
  61487. #endif
  61488. #ifdef WOLFSSL_KEIL
  61489. "adcs r4, r4, r6\n\t"
  61490. #elif defined(__clang__)
  61491. "adcs r4, r6\n\t"
  61492. #else
  61493. "adc r4, r6\n\t"
  61494. #endif
  61495. #ifdef WOLFSSL_KEIL
  61496. "adcs r2, r2, %[r]\n\t"
  61497. #elif defined(__clang__)
  61498. "adcs r2, %[r]\n\t"
  61499. #else
  61500. "adc r2, %[r]\n\t"
  61501. #endif
  61502. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61503. "adds r3, r3, r5\n\t"
  61504. #else
  61505. "add r3, r3, r5\n\t"
  61506. #endif
  61507. #ifdef WOLFSSL_KEIL
  61508. "adcs r4, r4, r6\n\t"
  61509. #elif defined(__clang__)
  61510. "adcs r4, r6\n\t"
  61511. #else
  61512. "adc r4, r6\n\t"
  61513. #endif
  61514. #ifdef WOLFSSL_KEIL
  61515. "adcs r2, r2, %[r]\n\t"
  61516. #elif defined(__clang__)
  61517. "adcs r2, %[r]\n\t"
  61518. #else
  61519. "adc r2, %[r]\n\t"
  61520. #endif
  61521. "# A[6] * A[4]\n\t"
  61522. "mov %[a], r9\n\t"
  61523. "ldr r7, [%[a], #16]\n\t"
  61524. "ldr %[a], [%[a], #24]\n\t"
  61525. "uxth r5, %[a]\n\t"
  61526. "uxth r6, r7\n\t"
  61527. #ifdef WOLFSSL_KEIL
  61528. "muls r6, r5, r6\n\t"
  61529. #elif defined(__clang__)
  61530. "muls r6, r5\n\t"
  61531. #else
  61532. "mul r6, r5\n\t"
  61533. #endif
  61534. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61535. "adds r3, r3, r6\n\t"
  61536. #else
  61537. "add r3, r3, r6\n\t"
  61538. #endif
  61539. #ifdef WOLFSSL_KEIL
  61540. "adcs r4, r4, %[r]\n\t"
  61541. #elif defined(__clang__)
  61542. "adcs r4, %[r]\n\t"
  61543. #else
  61544. "adc r4, %[r]\n\t"
  61545. #endif
  61546. #ifdef WOLFSSL_KEIL
  61547. "adcs r2, r2, %[r]\n\t"
  61548. #elif defined(__clang__)
  61549. "adcs r2, %[r]\n\t"
  61550. #else
  61551. "adc r2, %[r]\n\t"
  61552. #endif
  61553. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61554. "adds r3, r3, r6\n\t"
  61555. #else
  61556. "add r3, r3, r6\n\t"
  61557. #endif
  61558. #ifdef WOLFSSL_KEIL
  61559. "adcs r4, r4, %[r]\n\t"
  61560. #elif defined(__clang__)
  61561. "adcs r4, %[r]\n\t"
  61562. #else
  61563. "adc r4, %[r]\n\t"
  61564. #endif
  61565. #ifdef WOLFSSL_KEIL
  61566. "adcs r2, r2, %[r]\n\t"
  61567. #elif defined(__clang__)
  61568. "adcs r2, %[r]\n\t"
  61569. #else
  61570. "adc r2, %[r]\n\t"
  61571. #endif
  61572. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61573. "lsrs r6, r7, #16\n\t"
  61574. #else
  61575. "lsr r6, r7, #16\n\t"
  61576. #endif
  61577. #ifdef WOLFSSL_KEIL
  61578. "muls r5, r6, r5\n\t"
  61579. #elif defined(__clang__)
  61580. "muls r5, r6\n\t"
  61581. #else
  61582. "mul r5, r6\n\t"
  61583. #endif
  61584. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61585. "lsrs r6, r5, #16\n\t"
  61586. #else
  61587. "lsr r6, r5, #16\n\t"
  61588. #endif
  61589. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61590. "lsls r5, r5, #16\n\t"
  61591. #else
  61592. "lsl r5, r5, #16\n\t"
  61593. #endif
  61594. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61595. "adds r3, r3, r5\n\t"
  61596. #else
  61597. "add r3, r3, r5\n\t"
  61598. #endif
  61599. #ifdef WOLFSSL_KEIL
  61600. "adcs r4, r4, r6\n\t"
  61601. #elif defined(__clang__)
  61602. "adcs r4, r6\n\t"
  61603. #else
  61604. "adc r4, r6\n\t"
  61605. #endif
  61606. #ifdef WOLFSSL_KEIL
  61607. "adcs r2, r2, %[r]\n\t"
  61608. #elif defined(__clang__)
  61609. "adcs r2, %[r]\n\t"
  61610. #else
  61611. "adc r2, %[r]\n\t"
  61612. #endif
  61613. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61614. "adds r3, r3, r5\n\t"
  61615. #else
  61616. "add r3, r3, r5\n\t"
  61617. #endif
  61618. #ifdef WOLFSSL_KEIL
  61619. "adcs r4, r4, r6\n\t"
  61620. #elif defined(__clang__)
  61621. "adcs r4, r6\n\t"
  61622. #else
  61623. "adc r4, r6\n\t"
  61624. #endif
  61625. #ifdef WOLFSSL_KEIL
  61626. "adcs r2, r2, %[r]\n\t"
  61627. #elif defined(__clang__)
  61628. "adcs r2, %[r]\n\t"
  61629. #else
  61630. "adc r2, %[r]\n\t"
  61631. #endif
  61632. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61633. "lsrs r5, %[a], #16\n\t"
  61634. #else
  61635. "lsr r5, %[a], #16\n\t"
  61636. #endif
  61637. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61638. "lsrs r6, r7, #16\n\t"
  61639. #else
  61640. "lsr r6, r7, #16\n\t"
  61641. #endif
  61642. #ifdef WOLFSSL_KEIL
  61643. "muls r6, r5, r6\n\t"
  61644. #elif defined(__clang__)
  61645. "muls r6, r5\n\t"
  61646. #else
  61647. "mul r6, r5\n\t"
  61648. #endif
  61649. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61650. "adds r4, r4, r6\n\t"
  61651. #else
  61652. "add r4, r4, r6\n\t"
  61653. #endif
  61654. #ifdef WOLFSSL_KEIL
  61655. "adcs r2, r2, %[r]\n\t"
  61656. #elif defined(__clang__)
  61657. "adcs r2, %[r]\n\t"
  61658. #else
  61659. "adc r2, %[r]\n\t"
  61660. #endif
  61661. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61662. "adds r4, r4, r6\n\t"
  61663. #else
  61664. "add r4, r4, r6\n\t"
  61665. #endif
  61666. #ifdef WOLFSSL_KEIL
  61667. "adcs r2, r2, %[r]\n\t"
  61668. #elif defined(__clang__)
  61669. "adcs r2, %[r]\n\t"
  61670. #else
  61671. "adc r2, %[r]\n\t"
  61672. #endif
  61673. "uxth r6, r7\n\t"
  61674. #ifdef WOLFSSL_KEIL
  61675. "muls r5, r6, r5\n\t"
  61676. #elif defined(__clang__)
  61677. "muls r5, r6\n\t"
  61678. #else
  61679. "mul r5, r6\n\t"
  61680. #endif
  61681. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61682. "lsrs r6, r5, #16\n\t"
  61683. #else
  61684. "lsr r6, r5, #16\n\t"
  61685. #endif
  61686. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61687. "lsls r5, r5, #16\n\t"
  61688. #else
  61689. "lsl r5, r5, #16\n\t"
  61690. #endif
  61691. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61692. "adds r3, r3, r5\n\t"
  61693. #else
  61694. "add r3, r3, r5\n\t"
  61695. #endif
  61696. #ifdef WOLFSSL_KEIL
  61697. "adcs r4, r4, r6\n\t"
  61698. #elif defined(__clang__)
  61699. "adcs r4, r6\n\t"
  61700. #else
  61701. "adc r4, r6\n\t"
  61702. #endif
  61703. #ifdef WOLFSSL_KEIL
  61704. "adcs r2, r2, %[r]\n\t"
  61705. #elif defined(__clang__)
  61706. "adcs r2, %[r]\n\t"
  61707. #else
  61708. "adc r2, %[r]\n\t"
  61709. #endif
  61710. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61711. "adds r3, r3, r5\n\t"
  61712. #else
  61713. "add r3, r3, r5\n\t"
  61714. #endif
  61715. #ifdef WOLFSSL_KEIL
  61716. "adcs r4, r4, r6\n\t"
  61717. #elif defined(__clang__)
  61718. "adcs r4, r6\n\t"
  61719. #else
  61720. "adc r4, r6\n\t"
  61721. #endif
  61722. #ifdef WOLFSSL_KEIL
  61723. "adcs r2, r2, %[r]\n\t"
  61724. #elif defined(__clang__)
  61725. "adcs r2, %[r]\n\t"
  61726. #else
  61727. "adc r2, %[r]\n\t"
  61728. #endif
  61729. "# A[5] * A[5]\n\t"
  61730. "mov %[a], r9\n\t"
  61731. "ldr r7, [%[a], #20]\n\t"
  61732. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61733. "lsrs r6, r7, #16\n\t"
  61734. #else
  61735. "lsr r6, r7, #16\n\t"
  61736. #endif
  61737. "uxth r5, r7\n\t"
  61738. #ifdef WOLFSSL_KEIL
  61739. "muls r5, r5, r5\n\t"
  61740. #elif defined(__clang__)
  61741. "muls r5, r5\n\t"
  61742. #else
  61743. "mul r5, r5\n\t"
  61744. #endif
  61745. #ifdef WOLFSSL_KEIL
  61746. "muls r6, r6, r6\n\t"
  61747. #elif defined(__clang__)
  61748. "muls r6, r6\n\t"
  61749. #else
  61750. "mul r6, r6\n\t"
  61751. #endif
  61752. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61753. "adds r3, r3, r5\n\t"
  61754. #else
  61755. "add r3, r3, r5\n\t"
  61756. #endif
  61757. #ifdef WOLFSSL_KEIL
  61758. "adcs r4, r4, r6\n\t"
  61759. #elif defined(__clang__)
  61760. "adcs r4, r6\n\t"
  61761. #else
  61762. "adc r4, r6\n\t"
  61763. #endif
  61764. #ifdef WOLFSSL_KEIL
  61765. "adcs r2, r2, %[r]\n\t"
  61766. #elif defined(__clang__)
  61767. "adcs r2, %[r]\n\t"
  61768. #else
  61769. "adc r2, %[r]\n\t"
  61770. #endif
  61771. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61772. "lsrs r6, r7, #16\n\t"
  61773. #else
  61774. "lsr r6, r7, #16\n\t"
  61775. #endif
  61776. "uxth r5, r7\n\t"
  61777. #ifdef WOLFSSL_KEIL
  61778. "muls r5, r6, r5\n\t"
  61779. #elif defined(__clang__)
  61780. "muls r5, r6\n\t"
  61781. #else
  61782. "mul r5, r6\n\t"
  61783. #endif
  61784. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61785. "lsrs r6, r5, #15\n\t"
  61786. #else
  61787. "lsr r6, r5, #15\n\t"
  61788. #endif
  61789. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61790. "lsls r5, r5, #17\n\t"
  61791. #else
  61792. "lsl r5, r5, #17\n\t"
  61793. #endif
  61794. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61795. "adds r3, r3, r5\n\t"
  61796. #else
  61797. "add r3, r3, r5\n\t"
  61798. #endif
  61799. #ifdef WOLFSSL_KEIL
  61800. "adcs r4, r4, r6\n\t"
  61801. #elif defined(__clang__)
  61802. "adcs r4, r6\n\t"
  61803. #else
  61804. "adc r4, r6\n\t"
  61805. #endif
  61806. #ifdef WOLFSSL_KEIL
  61807. "adcs r2, r2, %[r]\n\t"
  61808. #elif defined(__clang__)
  61809. "adcs r2, %[r]\n\t"
  61810. #else
  61811. "adc r2, %[r]\n\t"
  61812. #endif
  61813. "str r3, [sp, #40]\n\t"
  61814. "# A[6] * A[5]\n\t"
  61815. "movs r3, #0\n\t"
  61816. "ldr %[a], [%[a], #24]\n\t"
  61817. "uxth r5, %[a]\n\t"
  61818. "uxth r6, r7\n\t"
  61819. #ifdef WOLFSSL_KEIL
  61820. "muls r6, r5, r6\n\t"
  61821. #elif defined(__clang__)
  61822. "muls r6, r5\n\t"
  61823. #else
  61824. "mul r6, r5\n\t"
  61825. #endif
  61826. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61827. "adds r4, r4, r6\n\t"
  61828. #else
  61829. "add r4, r4, r6\n\t"
  61830. #endif
  61831. #ifdef WOLFSSL_KEIL
  61832. "adcs r2, r2, %[r]\n\t"
  61833. #elif defined(__clang__)
  61834. "adcs r2, %[r]\n\t"
  61835. #else
  61836. "adc r2, %[r]\n\t"
  61837. #endif
  61838. #ifdef WOLFSSL_KEIL
  61839. "adcs r3, r3, %[r]\n\t"
  61840. #elif defined(__clang__)
  61841. "adcs r3, %[r]\n\t"
  61842. #else
  61843. "adc r3, %[r]\n\t"
  61844. #endif
  61845. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61846. "adds r4, r4, r6\n\t"
  61847. #else
  61848. "add r4, r4, r6\n\t"
  61849. #endif
  61850. #ifdef WOLFSSL_KEIL
  61851. "adcs r2, r2, %[r]\n\t"
  61852. #elif defined(__clang__)
  61853. "adcs r2, %[r]\n\t"
  61854. #else
  61855. "adc r2, %[r]\n\t"
  61856. #endif
  61857. #ifdef WOLFSSL_KEIL
  61858. "adcs r3, r3, %[r]\n\t"
  61859. #elif defined(__clang__)
  61860. "adcs r3, %[r]\n\t"
  61861. #else
  61862. "adc r3, %[r]\n\t"
  61863. #endif
  61864. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61865. "lsrs r6, r7, #16\n\t"
  61866. #else
  61867. "lsr r6, r7, #16\n\t"
  61868. #endif
  61869. #ifdef WOLFSSL_KEIL
  61870. "muls r5, r6, r5\n\t"
  61871. #elif defined(__clang__)
  61872. "muls r5, r6\n\t"
  61873. #else
  61874. "mul r5, r6\n\t"
  61875. #endif
  61876. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61877. "lsrs r6, r5, #16\n\t"
  61878. #else
  61879. "lsr r6, r5, #16\n\t"
  61880. #endif
  61881. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61882. "lsls r5, r5, #16\n\t"
  61883. #else
  61884. "lsl r5, r5, #16\n\t"
  61885. #endif
  61886. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61887. "adds r4, r4, r5\n\t"
  61888. #else
  61889. "add r4, r4, r5\n\t"
  61890. #endif
  61891. #ifdef WOLFSSL_KEIL
  61892. "adcs r2, r2, r6\n\t"
  61893. #elif defined(__clang__)
  61894. "adcs r2, r6\n\t"
  61895. #else
  61896. "adc r2, r6\n\t"
  61897. #endif
  61898. #ifdef WOLFSSL_KEIL
  61899. "adcs r3, r3, %[r]\n\t"
  61900. #elif defined(__clang__)
  61901. "adcs r3, %[r]\n\t"
  61902. #else
  61903. "adc r3, %[r]\n\t"
  61904. #endif
  61905. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61906. "adds r4, r4, r5\n\t"
  61907. #else
  61908. "add r4, r4, r5\n\t"
  61909. #endif
  61910. #ifdef WOLFSSL_KEIL
  61911. "adcs r2, r2, r6\n\t"
  61912. #elif defined(__clang__)
  61913. "adcs r2, r6\n\t"
  61914. #else
  61915. "adc r2, r6\n\t"
  61916. #endif
  61917. #ifdef WOLFSSL_KEIL
  61918. "adcs r3, r3, %[r]\n\t"
  61919. #elif defined(__clang__)
  61920. "adcs r3, %[r]\n\t"
  61921. #else
  61922. "adc r3, %[r]\n\t"
  61923. #endif
  61924. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61925. "lsrs r5, %[a], #16\n\t"
  61926. #else
  61927. "lsr r5, %[a], #16\n\t"
  61928. #endif
  61929. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61930. "lsrs r6, r7, #16\n\t"
  61931. #else
  61932. "lsr r6, r7, #16\n\t"
  61933. #endif
  61934. #ifdef WOLFSSL_KEIL
  61935. "muls r6, r5, r6\n\t"
  61936. #elif defined(__clang__)
  61937. "muls r6, r5\n\t"
  61938. #else
  61939. "mul r6, r5\n\t"
  61940. #endif
  61941. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61942. "adds r2, r2, r6\n\t"
  61943. #else
  61944. "add r2, r2, r6\n\t"
  61945. #endif
  61946. #ifdef WOLFSSL_KEIL
  61947. "adcs r3, r3, %[r]\n\t"
  61948. #elif defined(__clang__)
  61949. "adcs r3, %[r]\n\t"
  61950. #else
  61951. "adc r3, %[r]\n\t"
  61952. #endif
  61953. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61954. "adds r2, r2, r6\n\t"
  61955. #else
  61956. "add r2, r2, r6\n\t"
  61957. #endif
  61958. #ifdef WOLFSSL_KEIL
  61959. "adcs r3, r3, %[r]\n\t"
  61960. #elif defined(__clang__)
  61961. "adcs r3, %[r]\n\t"
  61962. #else
  61963. "adc r3, %[r]\n\t"
  61964. #endif
  61965. "uxth r6, r7\n\t"
  61966. #ifdef WOLFSSL_KEIL
  61967. "muls r5, r6, r5\n\t"
  61968. #elif defined(__clang__)
  61969. "muls r5, r6\n\t"
  61970. #else
  61971. "mul r5, r6\n\t"
  61972. #endif
  61973. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61974. "lsrs r6, r5, #16\n\t"
  61975. #else
  61976. "lsr r6, r5, #16\n\t"
  61977. #endif
  61978. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61979. "lsls r5, r5, #16\n\t"
  61980. #else
  61981. "lsl r5, r5, #16\n\t"
  61982. #endif
  61983. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61984. "adds r4, r4, r5\n\t"
  61985. #else
  61986. "add r4, r4, r5\n\t"
  61987. #endif
  61988. #ifdef WOLFSSL_KEIL
  61989. "adcs r2, r2, r6\n\t"
  61990. #elif defined(__clang__)
  61991. "adcs r2, r6\n\t"
  61992. #else
  61993. "adc r2, r6\n\t"
  61994. #endif
  61995. #ifdef WOLFSSL_KEIL
  61996. "adcs r3, r3, %[r]\n\t"
  61997. #elif defined(__clang__)
  61998. "adcs r3, %[r]\n\t"
  61999. #else
  62000. "adc r3, %[r]\n\t"
  62001. #endif
  62002. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62003. "adds r4, r4, r5\n\t"
  62004. #else
  62005. "add r4, r4, r5\n\t"
  62006. #endif
  62007. #ifdef WOLFSSL_KEIL
  62008. "adcs r2, r2, r6\n\t"
  62009. #elif defined(__clang__)
  62010. "adcs r2, r6\n\t"
  62011. #else
  62012. "adc r2, r6\n\t"
  62013. #endif
  62014. #ifdef WOLFSSL_KEIL
  62015. "adcs r3, r3, %[r]\n\t"
  62016. #elif defined(__clang__)
  62017. "adcs r3, %[r]\n\t"
  62018. #else
  62019. "adc r3, %[r]\n\t"
  62020. #endif
  62021. "# A[7] * A[4]\n\t"
  62022. "mov %[a], r9\n\t"
  62023. "ldr r7, [%[a], #16]\n\t"
  62024. "ldr %[a], [%[a], #28]\n\t"
  62025. "uxth r5, %[a]\n\t"
  62026. "uxth r6, r7\n\t"
  62027. #ifdef WOLFSSL_KEIL
  62028. "muls r6, r5, r6\n\t"
  62029. #elif defined(__clang__)
  62030. "muls r6, r5\n\t"
  62031. #else
  62032. "mul r6, r5\n\t"
  62033. #endif
  62034. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62035. "adds r4, r4, r6\n\t"
  62036. #else
  62037. "add r4, r4, r6\n\t"
  62038. #endif
  62039. #ifdef WOLFSSL_KEIL
  62040. "adcs r2, r2, %[r]\n\t"
  62041. #elif defined(__clang__)
  62042. "adcs r2, %[r]\n\t"
  62043. #else
  62044. "adc r2, %[r]\n\t"
  62045. #endif
  62046. #ifdef WOLFSSL_KEIL
  62047. "adcs r3, r3, %[r]\n\t"
  62048. #elif defined(__clang__)
  62049. "adcs r3, %[r]\n\t"
  62050. #else
  62051. "adc r3, %[r]\n\t"
  62052. #endif
  62053. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62054. "adds r4, r4, r6\n\t"
  62055. #else
  62056. "add r4, r4, r6\n\t"
  62057. #endif
  62058. #ifdef WOLFSSL_KEIL
  62059. "adcs r2, r2, %[r]\n\t"
  62060. #elif defined(__clang__)
  62061. "adcs r2, %[r]\n\t"
  62062. #else
  62063. "adc r2, %[r]\n\t"
  62064. #endif
  62065. #ifdef WOLFSSL_KEIL
  62066. "adcs r3, r3, %[r]\n\t"
  62067. #elif defined(__clang__)
  62068. "adcs r3, %[r]\n\t"
  62069. #else
  62070. "adc r3, %[r]\n\t"
  62071. #endif
  62072. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62073. "lsrs r6, r7, #16\n\t"
  62074. #else
  62075. "lsr r6, r7, #16\n\t"
  62076. #endif
  62077. #ifdef WOLFSSL_KEIL
  62078. "muls r5, r6, r5\n\t"
  62079. #elif defined(__clang__)
  62080. "muls r5, r6\n\t"
  62081. #else
  62082. "mul r5, r6\n\t"
  62083. #endif
  62084. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62085. "lsrs r6, r5, #16\n\t"
  62086. #else
  62087. "lsr r6, r5, #16\n\t"
  62088. #endif
  62089. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62090. "lsls r5, r5, #16\n\t"
  62091. #else
  62092. "lsl r5, r5, #16\n\t"
  62093. #endif
  62094. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62095. "adds r4, r4, r5\n\t"
  62096. #else
  62097. "add r4, r4, r5\n\t"
  62098. #endif
  62099. #ifdef WOLFSSL_KEIL
  62100. "adcs r2, r2, r6\n\t"
  62101. #elif defined(__clang__)
  62102. "adcs r2, r6\n\t"
  62103. #else
  62104. "adc r2, r6\n\t"
  62105. #endif
  62106. #ifdef WOLFSSL_KEIL
  62107. "adcs r3, r3, %[r]\n\t"
  62108. #elif defined(__clang__)
  62109. "adcs r3, %[r]\n\t"
  62110. #else
  62111. "adc r3, %[r]\n\t"
  62112. #endif
  62113. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62114. "adds r4, r4, r5\n\t"
  62115. #else
  62116. "add r4, r4, r5\n\t"
  62117. #endif
  62118. #ifdef WOLFSSL_KEIL
  62119. "adcs r2, r2, r6\n\t"
  62120. #elif defined(__clang__)
  62121. "adcs r2, r6\n\t"
  62122. #else
  62123. "adc r2, r6\n\t"
  62124. #endif
  62125. #ifdef WOLFSSL_KEIL
  62126. "adcs r3, r3, %[r]\n\t"
  62127. #elif defined(__clang__)
  62128. "adcs r3, %[r]\n\t"
  62129. #else
  62130. "adc r3, %[r]\n\t"
  62131. #endif
  62132. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62133. "lsrs r5, %[a], #16\n\t"
  62134. #else
  62135. "lsr r5, %[a], #16\n\t"
  62136. #endif
  62137. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62138. "lsrs r6, r7, #16\n\t"
  62139. #else
  62140. "lsr r6, r7, #16\n\t"
  62141. #endif
  62142. #ifdef WOLFSSL_KEIL
  62143. "muls r6, r5, r6\n\t"
  62144. #elif defined(__clang__)
  62145. "muls r6, r5\n\t"
  62146. #else
  62147. "mul r6, r5\n\t"
  62148. #endif
  62149. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62150. "adds r2, r2, r6\n\t"
  62151. #else
  62152. "add r2, r2, r6\n\t"
  62153. #endif
  62154. #ifdef WOLFSSL_KEIL
  62155. "adcs r3, r3, %[r]\n\t"
  62156. #elif defined(__clang__)
  62157. "adcs r3, %[r]\n\t"
  62158. #else
  62159. "adc r3, %[r]\n\t"
  62160. #endif
  62161. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62162. "adds r2, r2, r6\n\t"
  62163. #else
  62164. "add r2, r2, r6\n\t"
  62165. #endif
  62166. #ifdef WOLFSSL_KEIL
  62167. "adcs r3, r3, %[r]\n\t"
  62168. #elif defined(__clang__)
  62169. "adcs r3, %[r]\n\t"
  62170. #else
  62171. "adc r3, %[r]\n\t"
  62172. #endif
  62173. "uxth r6, r7\n\t"
  62174. #ifdef WOLFSSL_KEIL
  62175. "muls r5, r6, r5\n\t"
  62176. #elif defined(__clang__)
  62177. "muls r5, r6\n\t"
  62178. #else
  62179. "mul r5, r6\n\t"
  62180. #endif
  62181. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62182. "lsrs r6, r5, #16\n\t"
  62183. #else
  62184. "lsr r6, r5, #16\n\t"
  62185. #endif
  62186. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62187. "lsls r5, r5, #16\n\t"
  62188. #else
  62189. "lsl r5, r5, #16\n\t"
  62190. #endif
  62191. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62192. "adds r4, r4, r5\n\t"
  62193. #else
  62194. "add r4, r4, r5\n\t"
  62195. #endif
  62196. #ifdef WOLFSSL_KEIL
  62197. "adcs r2, r2, r6\n\t"
  62198. #elif defined(__clang__)
  62199. "adcs r2, r6\n\t"
  62200. #else
  62201. "adc r2, r6\n\t"
  62202. #endif
  62203. #ifdef WOLFSSL_KEIL
  62204. "adcs r3, r3, %[r]\n\t"
  62205. #elif defined(__clang__)
  62206. "adcs r3, %[r]\n\t"
  62207. #else
  62208. "adc r3, %[r]\n\t"
  62209. #endif
  62210. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62211. "adds r4, r4, r5\n\t"
  62212. #else
  62213. "add r4, r4, r5\n\t"
  62214. #endif
  62215. #ifdef WOLFSSL_KEIL
  62216. "adcs r2, r2, r6\n\t"
  62217. #elif defined(__clang__)
  62218. "adcs r2, r6\n\t"
  62219. #else
  62220. "adc r2, r6\n\t"
  62221. #endif
  62222. #ifdef WOLFSSL_KEIL
  62223. "adcs r3, r3, %[r]\n\t"
  62224. #elif defined(__clang__)
  62225. "adcs r3, %[r]\n\t"
  62226. #else
  62227. "adc r3, %[r]\n\t"
  62228. #endif
  62229. "# A[8] * A[3]\n\t"
  62230. "mov %[a], r9\n\t"
  62231. "mov r7, lr\n\t"
  62232. "ldr %[a], [%[a], #32]\n\t"
  62233. "uxth r5, %[a]\n\t"
  62234. "uxth r6, r7\n\t"
  62235. #ifdef WOLFSSL_KEIL
  62236. "muls r6, r5, r6\n\t"
  62237. #elif defined(__clang__)
  62238. "muls r6, r5\n\t"
  62239. #else
  62240. "mul r6, r5\n\t"
  62241. #endif
  62242. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62243. "adds r4, r4, r6\n\t"
  62244. #else
  62245. "add r4, r4, r6\n\t"
  62246. #endif
  62247. #ifdef WOLFSSL_KEIL
  62248. "adcs r2, r2, %[r]\n\t"
  62249. #elif defined(__clang__)
  62250. "adcs r2, %[r]\n\t"
  62251. #else
  62252. "adc r2, %[r]\n\t"
  62253. #endif
  62254. #ifdef WOLFSSL_KEIL
  62255. "adcs r3, r3, %[r]\n\t"
  62256. #elif defined(__clang__)
  62257. "adcs r3, %[r]\n\t"
  62258. #else
  62259. "adc r3, %[r]\n\t"
  62260. #endif
  62261. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62262. "adds r4, r4, r6\n\t"
  62263. #else
  62264. "add r4, r4, r6\n\t"
  62265. #endif
  62266. #ifdef WOLFSSL_KEIL
  62267. "adcs r2, r2, %[r]\n\t"
  62268. #elif defined(__clang__)
  62269. "adcs r2, %[r]\n\t"
  62270. #else
  62271. "adc r2, %[r]\n\t"
  62272. #endif
  62273. #ifdef WOLFSSL_KEIL
  62274. "adcs r3, r3, %[r]\n\t"
  62275. #elif defined(__clang__)
  62276. "adcs r3, %[r]\n\t"
  62277. #else
  62278. "adc r3, %[r]\n\t"
  62279. #endif
  62280. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62281. "lsrs r6, r7, #16\n\t"
  62282. #else
  62283. "lsr r6, r7, #16\n\t"
  62284. #endif
  62285. #ifdef WOLFSSL_KEIL
  62286. "muls r5, r6, r5\n\t"
  62287. #elif defined(__clang__)
  62288. "muls r5, r6\n\t"
  62289. #else
  62290. "mul r5, r6\n\t"
  62291. #endif
  62292. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62293. "lsrs r6, r5, #16\n\t"
  62294. #else
  62295. "lsr r6, r5, #16\n\t"
  62296. #endif
  62297. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62298. "lsls r5, r5, #16\n\t"
  62299. #else
  62300. "lsl r5, r5, #16\n\t"
  62301. #endif
  62302. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62303. "adds r4, r4, r5\n\t"
  62304. #else
  62305. "add r4, r4, r5\n\t"
  62306. #endif
  62307. #ifdef WOLFSSL_KEIL
  62308. "adcs r2, r2, r6\n\t"
  62309. #elif defined(__clang__)
  62310. "adcs r2, r6\n\t"
  62311. #else
  62312. "adc r2, r6\n\t"
  62313. #endif
  62314. #ifdef WOLFSSL_KEIL
  62315. "adcs r3, r3, %[r]\n\t"
  62316. #elif defined(__clang__)
  62317. "adcs r3, %[r]\n\t"
  62318. #else
  62319. "adc r3, %[r]\n\t"
  62320. #endif
  62321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62322. "adds r4, r4, r5\n\t"
  62323. #else
  62324. "add r4, r4, r5\n\t"
  62325. #endif
  62326. #ifdef WOLFSSL_KEIL
  62327. "adcs r2, r2, r6\n\t"
  62328. #elif defined(__clang__)
  62329. "adcs r2, r6\n\t"
  62330. #else
  62331. "adc r2, r6\n\t"
  62332. #endif
  62333. #ifdef WOLFSSL_KEIL
  62334. "adcs r3, r3, %[r]\n\t"
  62335. #elif defined(__clang__)
  62336. "adcs r3, %[r]\n\t"
  62337. #else
  62338. "adc r3, %[r]\n\t"
  62339. #endif
  62340. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62341. "lsrs r5, %[a], #16\n\t"
  62342. #else
  62343. "lsr r5, %[a], #16\n\t"
  62344. #endif
  62345. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62346. "lsrs r6, r7, #16\n\t"
  62347. #else
  62348. "lsr r6, r7, #16\n\t"
  62349. #endif
  62350. #ifdef WOLFSSL_KEIL
  62351. "muls r6, r5, r6\n\t"
  62352. #elif defined(__clang__)
  62353. "muls r6, r5\n\t"
  62354. #else
  62355. "mul r6, r5\n\t"
  62356. #endif
  62357. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62358. "adds r2, r2, r6\n\t"
  62359. #else
  62360. "add r2, r2, r6\n\t"
  62361. #endif
  62362. #ifdef WOLFSSL_KEIL
  62363. "adcs r3, r3, %[r]\n\t"
  62364. #elif defined(__clang__)
  62365. "adcs r3, %[r]\n\t"
  62366. #else
  62367. "adc r3, %[r]\n\t"
  62368. #endif
  62369. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62370. "adds r2, r2, r6\n\t"
  62371. #else
  62372. "add r2, r2, r6\n\t"
  62373. #endif
  62374. #ifdef WOLFSSL_KEIL
  62375. "adcs r3, r3, %[r]\n\t"
  62376. #elif defined(__clang__)
  62377. "adcs r3, %[r]\n\t"
  62378. #else
  62379. "adc r3, %[r]\n\t"
  62380. #endif
  62381. "uxth r6, r7\n\t"
  62382. #ifdef WOLFSSL_KEIL
  62383. "muls r5, r6, r5\n\t"
  62384. #elif defined(__clang__)
  62385. "muls r5, r6\n\t"
  62386. #else
  62387. "mul r5, r6\n\t"
  62388. #endif
  62389. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62390. "lsrs r6, r5, #16\n\t"
  62391. #else
  62392. "lsr r6, r5, #16\n\t"
  62393. #endif
  62394. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62395. "lsls r5, r5, #16\n\t"
  62396. #else
  62397. "lsl r5, r5, #16\n\t"
  62398. #endif
  62399. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62400. "adds r4, r4, r5\n\t"
  62401. #else
  62402. "add r4, r4, r5\n\t"
  62403. #endif
  62404. #ifdef WOLFSSL_KEIL
  62405. "adcs r2, r2, r6\n\t"
  62406. #elif defined(__clang__)
  62407. "adcs r2, r6\n\t"
  62408. #else
  62409. "adc r2, r6\n\t"
  62410. #endif
  62411. #ifdef WOLFSSL_KEIL
  62412. "adcs r3, r3, %[r]\n\t"
  62413. #elif defined(__clang__)
  62414. "adcs r3, %[r]\n\t"
  62415. #else
  62416. "adc r3, %[r]\n\t"
  62417. #endif
  62418. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62419. "adds r4, r4, r5\n\t"
  62420. #else
  62421. "add r4, r4, r5\n\t"
  62422. #endif
  62423. #ifdef WOLFSSL_KEIL
  62424. "adcs r2, r2, r6\n\t"
  62425. #elif defined(__clang__)
  62426. "adcs r2, r6\n\t"
  62427. #else
  62428. "adc r2, r6\n\t"
  62429. #endif
  62430. #ifdef WOLFSSL_KEIL
  62431. "adcs r3, r3, %[r]\n\t"
  62432. #elif defined(__clang__)
  62433. "adcs r3, %[r]\n\t"
  62434. #else
  62435. "adc r3, %[r]\n\t"
  62436. #endif
  62437. "# A[9] * A[2]\n\t"
  62438. "mov %[a], r9\n\t"
  62439. "mov r7, r12\n\t"
  62440. "ldr %[a], [%[a], #36]\n\t"
  62441. "uxth r5, %[a]\n\t"
  62442. "uxth r6, r7\n\t"
  62443. #ifdef WOLFSSL_KEIL
  62444. "muls r6, r5, r6\n\t"
  62445. #elif defined(__clang__)
  62446. "muls r6, r5\n\t"
  62447. #else
  62448. "mul r6, r5\n\t"
  62449. #endif
  62450. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62451. "adds r4, r4, r6\n\t"
  62452. #else
  62453. "add r4, r4, r6\n\t"
  62454. #endif
  62455. #ifdef WOLFSSL_KEIL
  62456. "adcs r2, r2, %[r]\n\t"
  62457. #elif defined(__clang__)
  62458. "adcs r2, %[r]\n\t"
  62459. #else
  62460. "adc r2, %[r]\n\t"
  62461. #endif
  62462. #ifdef WOLFSSL_KEIL
  62463. "adcs r3, r3, %[r]\n\t"
  62464. #elif defined(__clang__)
  62465. "adcs r3, %[r]\n\t"
  62466. #else
  62467. "adc r3, %[r]\n\t"
  62468. #endif
  62469. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62470. "adds r4, r4, r6\n\t"
  62471. #else
  62472. "add r4, r4, r6\n\t"
  62473. #endif
  62474. #ifdef WOLFSSL_KEIL
  62475. "adcs r2, r2, %[r]\n\t"
  62476. #elif defined(__clang__)
  62477. "adcs r2, %[r]\n\t"
  62478. #else
  62479. "adc r2, %[r]\n\t"
  62480. #endif
  62481. #ifdef WOLFSSL_KEIL
  62482. "adcs r3, r3, %[r]\n\t"
  62483. #elif defined(__clang__)
  62484. "adcs r3, %[r]\n\t"
  62485. #else
  62486. "adc r3, %[r]\n\t"
  62487. #endif
  62488. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62489. "lsrs r6, r7, #16\n\t"
  62490. #else
  62491. "lsr r6, r7, #16\n\t"
  62492. #endif
  62493. #ifdef WOLFSSL_KEIL
  62494. "muls r5, r6, r5\n\t"
  62495. #elif defined(__clang__)
  62496. "muls r5, r6\n\t"
  62497. #else
  62498. "mul r5, r6\n\t"
  62499. #endif
  62500. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62501. "lsrs r6, r5, #16\n\t"
  62502. #else
  62503. "lsr r6, r5, #16\n\t"
  62504. #endif
  62505. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62506. "lsls r5, r5, #16\n\t"
  62507. #else
  62508. "lsl r5, r5, #16\n\t"
  62509. #endif
  62510. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62511. "adds r4, r4, r5\n\t"
  62512. #else
  62513. "add r4, r4, r5\n\t"
  62514. #endif
  62515. #ifdef WOLFSSL_KEIL
  62516. "adcs r2, r2, r6\n\t"
  62517. #elif defined(__clang__)
  62518. "adcs r2, r6\n\t"
  62519. #else
  62520. "adc r2, r6\n\t"
  62521. #endif
  62522. #ifdef WOLFSSL_KEIL
  62523. "adcs r3, r3, %[r]\n\t"
  62524. #elif defined(__clang__)
  62525. "adcs r3, %[r]\n\t"
  62526. #else
  62527. "adc r3, %[r]\n\t"
  62528. #endif
  62529. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62530. "adds r4, r4, r5\n\t"
  62531. #else
  62532. "add r4, r4, r5\n\t"
  62533. #endif
  62534. #ifdef WOLFSSL_KEIL
  62535. "adcs r2, r2, r6\n\t"
  62536. #elif defined(__clang__)
  62537. "adcs r2, r6\n\t"
  62538. #else
  62539. "adc r2, r6\n\t"
  62540. #endif
  62541. #ifdef WOLFSSL_KEIL
  62542. "adcs r3, r3, %[r]\n\t"
  62543. #elif defined(__clang__)
  62544. "adcs r3, %[r]\n\t"
  62545. #else
  62546. "adc r3, %[r]\n\t"
  62547. #endif
  62548. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62549. "lsrs r5, %[a], #16\n\t"
  62550. #else
  62551. "lsr r5, %[a], #16\n\t"
  62552. #endif
  62553. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62554. "lsrs r6, r7, #16\n\t"
  62555. #else
  62556. "lsr r6, r7, #16\n\t"
  62557. #endif
  62558. #ifdef WOLFSSL_KEIL
  62559. "muls r6, r5, r6\n\t"
  62560. #elif defined(__clang__)
  62561. "muls r6, r5\n\t"
  62562. #else
  62563. "mul r6, r5\n\t"
  62564. #endif
  62565. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62566. "adds r2, r2, r6\n\t"
  62567. #else
  62568. "add r2, r2, r6\n\t"
  62569. #endif
  62570. #ifdef WOLFSSL_KEIL
  62571. "adcs r3, r3, %[r]\n\t"
  62572. #elif defined(__clang__)
  62573. "adcs r3, %[r]\n\t"
  62574. #else
  62575. "adc r3, %[r]\n\t"
  62576. #endif
  62577. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62578. "adds r2, r2, r6\n\t"
  62579. #else
  62580. "add r2, r2, r6\n\t"
  62581. #endif
  62582. #ifdef WOLFSSL_KEIL
  62583. "adcs r3, r3, %[r]\n\t"
  62584. #elif defined(__clang__)
  62585. "adcs r3, %[r]\n\t"
  62586. #else
  62587. "adc r3, %[r]\n\t"
  62588. #endif
  62589. "uxth r6, r7\n\t"
  62590. #ifdef WOLFSSL_KEIL
  62591. "muls r5, r6, r5\n\t"
  62592. #elif defined(__clang__)
  62593. "muls r5, r6\n\t"
  62594. #else
  62595. "mul r5, r6\n\t"
  62596. #endif
  62597. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62598. "lsrs r6, r5, #16\n\t"
  62599. #else
  62600. "lsr r6, r5, #16\n\t"
  62601. #endif
  62602. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62603. "lsls r5, r5, #16\n\t"
  62604. #else
  62605. "lsl r5, r5, #16\n\t"
  62606. #endif
  62607. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62608. "adds r4, r4, r5\n\t"
  62609. #else
  62610. "add r4, r4, r5\n\t"
  62611. #endif
  62612. #ifdef WOLFSSL_KEIL
  62613. "adcs r2, r2, r6\n\t"
  62614. #elif defined(__clang__)
  62615. "adcs r2, r6\n\t"
  62616. #else
  62617. "adc r2, r6\n\t"
  62618. #endif
  62619. #ifdef WOLFSSL_KEIL
  62620. "adcs r3, r3, %[r]\n\t"
  62621. #elif defined(__clang__)
  62622. "adcs r3, %[r]\n\t"
  62623. #else
  62624. "adc r3, %[r]\n\t"
  62625. #endif
  62626. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62627. "adds r4, r4, r5\n\t"
  62628. #else
  62629. "add r4, r4, r5\n\t"
  62630. #endif
  62631. #ifdef WOLFSSL_KEIL
  62632. "adcs r2, r2, r6\n\t"
  62633. #elif defined(__clang__)
  62634. "adcs r2, r6\n\t"
  62635. #else
  62636. "adc r2, r6\n\t"
  62637. #endif
  62638. #ifdef WOLFSSL_KEIL
  62639. "adcs r3, r3, %[r]\n\t"
  62640. #elif defined(__clang__)
  62641. "adcs r3, %[r]\n\t"
  62642. #else
  62643. "adc r3, %[r]\n\t"
  62644. #endif
  62645. "# A[10] * A[1]\n\t"
  62646. "mov %[a], r9\n\t"
  62647. "mov r7, r11\n\t"
  62648. "ldr %[a], [%[a], #40]\n\t"
  62649. "uxth r5, %[a]\n\t"
  62650. "uxth r6, r7\n\t"
  62651. #ifdef WOLFSSL_KEIL
  62652. "muls r6, r5, r6\n\t"
  62653. #elif defined(__clang__)
  62654. "muls r6, r5\n\t"
  62655. #else
  62656. "mul r6, r5\n\t"
  62657. #endif
  62658. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62659. "adds r4, r4, r6\n\t"
  62660. #else
  62661. "add r4, r4, r6\n\t"
  62662. #endif
  62663. #ifdef WOLFSSL_KEIL
  62664. "adcs r2, r2, %[r]\n\t"
  62665. #elif defined(__clang__)
  62666. "adcs r2, %[r]\n\t"
  62667. #else
  62668. "adc r2, %[r]\n\t"
  62669. #endif
  62670. #ifdef WOLFSSL_KEIL
  62671. "adcs r3, r3, %[r]\n\t"
  62672. #elif defined(__clang__)
  62673. "adcs r3, %[r]\n\t"
  62674. #else
  62675. "adc r3, %[r]\n\t"
  62676. #endif
  62677. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62678. "adds r4, r4, r6\n\t"
  62679. #else
  62680. "add r4, r4, r6\n\t"
  62681. #endif
  62682. #ifdef WOLFSSL_KEIL
  62683. "adcs r2, r2, %[r]\n\t"
  62684. #elif defined(__clang__)
  62685. "adcs r2, %[r]\n\t"
  62686. #else
  62687. "adc r2, %[r]\n\t"
  62688. #endif
  62689. #ifdef WOLFSSL_KEIL
  62690. "adcs r3, r3, %[r]\n\t"
  62691. #elif defined(__clang__)
  62692. "adcs r3, %[r]\n\t"
  62693. #else
  62694. "adc r3, %[r]\n\t"
  62695. #endif
  62696. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62697. "lsrs r6, r7, #16\n\t"
  62698. #else
  62699. "lsr r6, r7, #16\n\t"
  62700. #endif
  62701. #ifdef WOLFSSL_KEIL
  62702. "muls r5, r6, r5\n\t"
  62703. #elif defined(__clang__)
  62704. "muls r5, r6\n\t"
  62705. #else
  62706. "mul r5, r6\n\t"
  62707. #endif
  62708. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62709. "lsrs r6, r5, #16\n\t"
  62710. #else
  62711. "lsr r6, r5, #16\n\t"
  62712. #endif
  62713. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62714. "lsls r5, r5, #16\n\t"
  62715. #else
  62716. "lsl r5, r5, #16\n\t"
  62717. #endif
  62718. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62719. "adds r4, r4, r5\n\t"
  62720. #else
  62721. "add r4, r4, r5\n\t"
  62722. #endif
  62723. #ifdef WOLFSSL_KEIL
  62724. "adcs r2, r2, r6\n\t"
  62725. #elif defined(__clang__)
  62726. "adcs r2, r6\n\t"
  62727. #else
  62728. "adc r2, r6\n\t"
  62729. #endif
  62730. #ifdef WOLFSSL_KEIL
  62731. "adcs r3, r3, %[r]\n\t"
  62732. #elif defined(__clang__)
  62733. "adcs r3, %[r]\n\t"
  62734. #else
  62735. "adc r3, %[r]\n\t"
  62736. #endif
  62737. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62738. "adds r4, r4, r5\n\t"
  62739. #else
  62740. "add r4, r4, r5\n\t"
  62741. #endif
  62742. #ifdef WOLFSSL_KEIL
  62743. "adcs r2, r2, r6\n\t"
  62744. #elif defined(__clang__)
  62745. "adcs r2, r6\n\t"
  62746. #else
  62747. "adc r2, r6\n\t"
  62748. #endif
  62749. #ifdef WOLFSSL_KEIL
  62750. "adcs r3, r3, %[r]\n\t"
  62751. #elif defined(__clang__)
  62752. "adcs r3, %[r]\n\t"
  62753. #else
  62754. "adc r3, %[r]\n\t"
  62755. #endif
  62756. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62757. "lsrs r5, %[a], #16\n\t"
  62758. #else
  62759. "lsr r5, %[a], #16\n\t"
  62760. #endif
  62761. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62762. "lsrs r6, r7, #16\n\t"
  62763. #else
  62764. "lsr r6, r7, #16\n\t"
  62765. #endif
  62766. #ifdef WOLFSSL_KEIL
  62767. "muls r6, r5, r6\n\t"
  62768. #elif defined(__clang__)
  62769. "muls r6, r5\n\t"
  62770. #else
  62771. "mul r6, r5\n\t"
  62772. #endif
  62773. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62774. "adds r2, r2, r6\n\t"
  62775. #else
  62776. "add r2, r2, r6\n\t"
  62777. #endif
  62778. #ifdef WOLFSSL_KEIL
  62779. "adcs r3, r3, %[r]\n\t"
  62780. #elif defined(__clang__)
  62781. "adcs r3, %[r]\n\t"
  62782. #else
  62783. "adc r3, %[r]\n\t"
  62784. #endif
  62785. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62786. "adds r2, r2, r6\n\t"
  62787. #else
  62788. "add r2, r2, r6\n\t"
  62789. #endif
  62790. #ifdef WOLFSSL_KEIL
  62791. "adcs r3, r3, %[r]\n\t"
  62792. #elif defined(__clang__)
  62793. "adcs r3, %[r]\n\t"
  62794. #else
  62795. "adc r3, %[r]\n\t"
  62796. #endif
  62797. "uxth r6, r7\n\t"
  62798. #ifdef WOLFSSL_KEIL
  62799. "muls r5, r6, r5\n\t"
  62800. #elif defined(__clang__)
  62801. "muls r5, r6\n\t"
  62802. #else
  62803. "mul r5, r6\n\t"
  62804. #endif
  62805. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62806. "lsrs r6, r5, #16\n\t"
  62807. #else
  62808. "lsr r6, r5, #16\n\t"
  62809. #endif
  62810. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62811. "lsls r5, r5, #16\n\t"
  62812. #else
  62813. "lsl r5, r5, #16\n\t"
  62814. #endif
  62815. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62816. "adds r4, r4, r5\n\t"
  62817. #else
  62818. "add r4, r4, r5\n\t"
  62819. #endif
  62820. #ifdef WOLFSSL_KEIL
  62821. "adcs r2, r2, r6\n\t"
  62822. #elif defined(__clang__)
  62823. "adcs r2, r6\n\t"
  62824. #else
  62825. "adc r2, r6\n\t"
  62826. #endif
  62827. #ifdef WOLFSSL_KEIL
  62828. "adcs r3, r3, %[r]\n\t"
  62829. #elif defined(__clang__)
  62830. "adcs r3, %[r]\n\t"
  62831. #else
  62832. "adc r3, %[r]\n\t"
  62833. #endif
  62834. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62835. "adds r4, r4, r5\n\t"
  62836. #else
  62837. "add r4, r4, r5\n\t"
  62838. #endif
  62839. #ifdef WOLFSSL_KEIL
  62840. "adcs r2, r2, r6\n\t"
  62841. #elif defined(__clang__)
  62842. "adcs r2, r6\n\t"
  62843. #else
  62844. "adc r2, r6\n\t"
  62845. #endif
  62846. #ifdef WOLFSSL_KEIL
  62847. "adcs r3, r3, %[r]\n\t"
  62848. #elif defined(__clang__)
  62849. "adcs r3, %[r]\n\t"
  62850. #else
  62851. "adc r3, %[r]\n\t"
  62852. #endif
  62853. "# A[11] * A[0]\n\t"
  62854. "mov %[a], r9\n\t"
  62855. "mov r7, r10\n\t"
  62856. "ldr %[a], [%[a], #44]\n\t"
  62857. "uxth r5, %[a]\n\t"
  62858. "uxth r6, r7\n\t"
  62859. #ifdef WOLFSSL_KEIL
  62860. "muls r6, r5, r6\n\t"
  62861. #elif defined(__clang__)
  62862. "muls r6, r5\n\t"
  62863. #else
  62864. "mul r6, r5\n\t"
  62865. #endif
  62866. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62867. "adds r4, r4, r6\n\t"
  62868. #else
  62869. "add r4, r4, r6\n\t"
  62870. #endif
  62871. #ifdef WOLFSSL_KEIL
  62872. "adcs r2, r2, %[r]\n\t"
  62873. #elif defined(__clang__)
  62874. "adcs r2, %[r]\n\t"
  62875. #else
  62876. "adc r2, %[r]\n\t"
  62877. #endif
  62878. #ifdef WOLFSSL_KEIL
  62879. "adcs r3, r3, %[r]\n\t"
  62880. #elif defined(__clang__)
  62881. "adcs r3, %[r]\n\t"
  62882. #else
  62883. "adc r3, %[r]\n\t"
  62884. #endif
  62885. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62886. "adds r4, r4, r6\n\t"
  62887. #else
  62888. "add r4, r4, r6\n\t"
  62889. #endif
  62890. #ifdef WOLFSSL_KEIL
  62891. "adcs r2, r2, %[r]\n\t"
  62892. #elif defined(__clang__)
  62893. "adcs r2, %[r]\n\t"
  62894. #else
  62895. "adc r2, %[r]\n\t"
  62896. #endif
  62897. #ifdef WOLFSSL_KEIL
  62898. "adcs r3, r3, %[r]\n\t"
  62899. #elif defined(__clang__)
  62900. "adcs r3, %[r]\n\t"
  62901. #else
  62902. "adc r3, %[r]\n\t"
  62903. #endif
  62904. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62905. "lsrs r6, r7, #16\n\t"
  62906. #else
  62907. "lsr r6, r7, #16\n\t"
  62908. #endif
  62909. #ifdef WOLFSSL_KEIL
  62910. "muls r5, r6, r5\n\t"
  62911. #elif defined(__clang__)
  62912. "muls r5, r6\n\t"
  62913. #else
  62914. "mul r5, r6\n\t"
  62915. #endif
  62916. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62917. "lsrs r6, r5, #16\n\t"
  62918. #else
  62919. "lsr r6, r5, #16\n\t"
  62920. #endif
  62921. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62922. "lsls r5, r5, #16\n\t"
  62923. #else
  62924. "lsl r5, r5, #16\n\t"
  62925. #endif
  62926. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62927. "adds r4, r4, r5\n\t"
  62928. #else
  62929. "add r4, r4, r5\n\t"
  62930. #endif
  62931. #ifdef WOLFSSL_KEIL
  62932. "adcs r2, r2, r6\n\t"
  62933. #elif defined(__clang__)
  62934. "adcs r2, r6\n\t"
  62935. #else
  62936. "adc r2, r6\n\t"
  62937. #endif
  62938. #ifdef WOLFSSL_KEIL
  62939. "adcs r3, r3, %[r]\n\t"
  62940. #elif defined(__clang__)
  62941. "adcs r3, %[r]\n\t"
  62942. #else
  62943. "adc r3, %[r]\n\t"
  62944. #endif
  62945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62946. "adds r4, r4, r5\n\t"
  62947. #else
  62948. "add r4, r4, r5\n\t"
  62949. #endif
  62950. #ifdef WOLFSSL_KEIL
  62951. "adcs r2, r2, r6\n\t"
  62952. #elif defined(__clang__)
  62953. "adcs r2, r6\n\t"
  62954. #else
  62955. "adc r2, r6\n\t"
  62956. #endif
  62957. #ifdef WOLFSSL_KEIL
  62958. "adcs r3, r3, %[r]\n\t"
  62959. #elif defined(__clang__)
  62960. "adcs r3, %[r]\n\t"
  62961. #else
  62962. "adc r3, %[r]\n\t"
  62963. #endif
  62964. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62965. "lsrs r5, %[a], #16\n\t"
  62966. #else
  62967. "lsr r5, %[a], #16\n\t"
  62968. #endif
  62969. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62970. "lsrs r6, r7, #16\n\t"
  62971. #else
  62972. "lsr r6, r7, #16\n\t"
  62973. #endif
  62974. #ifdef WOLFSSL_KEIL
  62975. "muls r6, r5, r6\n\t"
  62976. #elif defined(__clang__)
  62977. "muls r6, r5\n\t"
  62978. #else
  62979. "mul r6, r5\n\t"
  62980. #endif
  62981. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62982. "adds r2, r2, r6\n\t"
  62983. #else
  62984. "add r2, r2, r6\n\t"
  62985. #endif
  62986. #ifdef WOLFSSL_KEIL
  62987. "adcs r3, r3, %[r]\n\t"
  62988. #elif defined(__clang__)
  62989. "adcs r3, %[r]\n\t"
  62990. #else
  62991. "adc r3, %[r]\n\t"
  62992. #endif
  62993. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62994. "adds r2, r2, r6\n\t"
  62995. #else
  62996. "add r2, r2, r6\n\t"
  62997. #endif
  62998. #ifdef WOLFSSL_KEIL
  62999. "adcs r3, r3, %[r]\n\t"
  63000. #elif defined(__clang__)
  63001. "adcs r3, %[r]\n\t"
  63002. #else
  63003. "adc r3, %[r]\n\t"
  63004. #endif
  63005. "uxth r6, r7\n\t"
  63006. #ifdef WOLFSSL_KEIL
  63007. "muls r5, r6, r5\n\t"
  63008. #elif defined(__clang__)
  63009. "muls r5, r6\n\t"
  63010. #else
  63011. "mul r5, r6\n\t"
  63012. #endif
  63013. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63014. "lsrs r6, r5, #16\n\t"
  63015. #else
  63016. "lsr r6, r5, #16\n\t"
  63017. #endif
  63018. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63019. "lsls r5, r5, #16\n\t"
  63020. #else
  63021. "lsl r5, r5, #16\n\t"
  63022. #endif
  63023. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63024. "adds r4, r4, r5\n\t"
  63025. #else
  63026. "add r4, r4, r5\n\t"
  63027. #endif
  63028. #ifdef WOLFSSL_KEIL
  63029. "adcs r2, r2, r6\n\t"
  63030. #elif defined(__clang__)
  63031. "adcs r2, r6\n\t"
  63032. #else
  63033. "adc r2, r6\n\t"
  63034. #endif
  63035. #ifdef WOLFSSL_KEIL
  63036. "adcs r3, r3, %[r]\n\t"
  63037. #elif defined(__clang__)
  63038. "adcs r3, %[r]\n\t"
  63039. #else
  63040. "adc r3, %[r]\n\t"
  63041. #endif
  63042. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63043. "adds r4, r4, r5\n\t"
  63044. #else
  63045. "add r4, r4, r5\n\t"
  63046. #endif
  63047. #ifdef WOLFSSL_KEIL
  63048. "adcs r2, r2, r6\n\t"
  63049. #elif defined(__clang__)
  63050. "adcs r2, r6\n\t"
  63051. #else
  63052. "adc r2, r6\n\t"
  63053. #endif
  63054. #ifdef WOLFSSL_KEIL
  63055. "adcs r3, r3, %[r]\n\t"
  63056. #elif defined(__clang__)
  63057. "adcs r3, %[r]\n\t"
  63058. #else
  63059. "adc r3, %[r]\n\t"
  63060. #endif
  63061. "str r4, [sp, #44]\n\t"
  63062. "# A[11] * A[1]\n\t"
  63063. "movs r4, #0\n\t"
  63064. "mov %[a], r9\n\t"
  63065. "mov r7, r11\n\t"
  63066. "ldr %[a], [%[a], #44]\n\t"
  63067. "uxth r5, %[a]\n\t"
  63068. "uxth r6, r7\n\t"
  63069. #ifdef WOLFSSL_KEIL
  63070. "muls r6, r5, r6\n\t"
  63071. #elif defined(__clang__)
  63072. "muls r6, r5\n\t"
  63073. #else
  63074. "mul r6, r5\n\t"
  63075. #endif
  63076. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63077. "adds r2, r2, r6\n\t"
  63078. #else
  63079. "add r2, r2, r6\n\t"
  63080. #endif
  63081. #ifdef WOLFSSL_KEIL
  63082. "adcs r3, r3, %[r]\n\t"
  63083. #elif defined(__clang__)
  63084. "adcs r3, %[r]\n\t"
  63085. #else
  63086. "adc r3, %[r]\n\t"
  63087. #endif
  63088. #ifdef WOLFSSL_KEIL
  63089. "adcs r4, r4, %[r]\n\t"
  63090. #elif defined(__clang__)
  63091. "adcs r4, %[r]\n\t"
  63092. #else
  63093. "adc r4, %[r]\n\t"
  63094. #endif
  63095. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63096. "adds r2, r2, r6\n\t"
  63097. #else
  63098. "add r2, r2, r6\n\t"
  63099. #endif
  63100. #ifdef WOLFSSL_KEIL
  63101. "adcs r3, r3, %[r]\n\t"
  63102. #elif defined(__clang__)
  63103. "adcs r3, %[r]\n\t"
  63104. #else
  63105. "adc r3, %[r]\n\t"
  63106. #endif
  63107. #ifdef WOLFSSL_KEIL
  63108. "adcs r4, r4, %[r]\n\t"
  63109. #elif defined(__clang__)
  63110. "adcs r4, %[r]\n\t"
  63111. #else
  63112. "adc r4, %[r]\n\t"
  63113. #endif
  63114. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63115. "lsrs r6, r7, #16\n\t"
  63116. #else
  63117. "lsr r6, r7, #16\n\t"
  63118. #endif
  63119. #ifdef WOLFSSL_KEIL
  63120. "muls r5, r6, r5\n\t"
  63121. #elif defined(__clang__)
  63122. "muls r5, r6\n\t"
  63123. #else
  63124. "mul r5, r6\n\t"
  63125. #endif
  63126. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63127. "lsrs r6, r5, #16\n\t"
  63128. #else
  63129. "lsr r6, r5, #16\n\t"
  63130. #endif
  63131. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63132. "lsls r5, r5, #16\n\t"
  63133. #else
  63134. "lsl r5, r5, #16\n\t"
  63135. #endif
  63136. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63137. "adds r2, r2, r5\n\t"
  63138. #else
  63139. "add r2, r2, r5\n\t"
  63140. #endif
  63141. #ifdef WOLFSSL_KEIL
  63142. "adcs r3, r3, r6\n\t"
  63143. #elif defined(__clang__)
  63144. "adcs r3, r6\n\t"
  63145. #else
  63146. "adc r3, r6\n\t"
  63147. #endif
  63148. #ifdef WOLFSSL_KEIL
  63149. "adcs r4, r4, %[r]\n\t"
  63150. #elif defined(__clang__)
  63151. "adcs r4, %[r]\n\t"
  63152. #else
  63153. "adc r4, %[r]\n\t"
  63154. #endif
  63155. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63156. "adds r2, r2, r5\n\t"
  63157. #else
  63158. "add r2, r2, r5\n\t"
  63159. #endif
  63160. #ifdef WOLFSSL_KEIL
  63161. "adcs r3, r3, r6\n\t"
  63162. #elif defined(__clang__)
  63163. "adcs r3, r6\n\t"
  63164. #else
  63165. "adc r3, r6\n\t"
  63166. #endif
  63167. #ifdef WOLFSSL_KEIL
  63168. "adcs r4, r4, %[r]\n\t"
  63169. #elif defined(__clang__)
  63170. "adcs r4, %[r]\n\t"
  63171. #else
  63172. "adc r4, %[r]\n\t"
  63173. #endif
  63174. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63175. "lsrs r5, %[a], #16\n\t"
  63176. #else
  63177. "lsr r5, %[a], #16\n\t"
  63178. #endif
  63179. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63180. "lsrs r6, r7, #16\n\t"
  63181. #else
  63182. "lsr r6, r7, #16\n\t"
  63183. #endif
  63184. #ifdef WOLFSSL_KEIL
  63185. "muls r6, r5, r6\n\t"
  63186. #elif defined(__clang__)
  63187. "muls r6, r5\n\t"
  63188. #else
  63189. "mul r6, r5\n\t"
  63190. #endif
  63191. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63192. "adds r3, r3, r6\n\t"
  63193. #else
  63194. "add r3, r3, r6\n\t"
  63195. #endif
  63196. #ifdef WOLFSSL_KEIL
  63197. "adcs r4, r4, %[r]\n\t"
  63198. #elif defined(__clang__)
  63199. "adcs r4, %[r]\n\t"
  63200. #else
  63201. "adc r4, %[r]\n\t"
  63202. #endif
  63203. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63204. "adds r3, r3, r6\n\t"
  63205. #else
  63206. "add r3, r3, r6\n\t"
  63207. #endif
  63208. #ifdef WOLFSSL_KEIL
  63209. "adcs r4, r4, %[r]\n\t"
  63210. #elif defined(__clang__)
  63211. "adcs r4, %[r]\n\t"
  63212. #else
  63213. "adc r4, %[r]\n\t"
  63214. #endif
  63215. "uxth r6, r7\n\t"
  63216. #ifdef WOLFSSL_KEIL
  63217. "muls r5, r6, r5\n\t"
  63218. #elif defined(__clang__)
  63219. "muls r5, r6\n\t"
  63220. #else
  63221. "mul r5, r6\n\t"
  63222. #endif
  63223. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63224. "lsrs r6, r5, #16\n\t"
  63225. #else
  63226. "lsr r6, r5, #16\n\t"
  63227. #endif
  63228. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63229. "lsls r5, r5, #16\n\t"
  63230. #else
  63231. "lsl r5, r5, #16\n\t"
  63232. #endif
  63233. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63234. "adds r2, r2, r5\n\t"
  63235. #else
  63236. "add r2, r2, r5\n\t"
  63237. #endif
  63238. #ifdef WOLFSSL_KEIL
  63239. "adcs r3, r3, r6\n\t"
  63240. #elif defined(__clang__)
  63241. "adcs r3, r6\n\t"
  63242. #else
  63243. "adc r3, r6\n\t"
  63244. #endif
  63245. #ifdef WOLFSSL_KEIL
  63246. "adcs r4, r4, %[r]\n\t"
  63247. #elif defined(__clang__)
  63248. "adcs r4, %[r]\n\t"
  63249. #else
  63250. "adc r4, %[r]\n\t"
  63251. #endif
  63252. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63253. "adds r2, r2, r5\n\t"
  63254. #else
  63255. "add r2, r2, r5\n\t"
  63256. #endif
  63257. #ifdef WOLFSSL_KEIL
  63258. "adcs r3, r3, r6\n\t"
  63259. #elif defined(__clang__)
  63260. "adcs r3, r6\n\t"
  63261. #else
  63262. "adc r3, r6\n\t"
  63263. #endif
  63264. #ifdef WOLFSSL_KEIL
  63265. "adcs r4, r4, %[r]\n\t"
  63266. #elif defined(__clang__)
  63267. "adcs r4, %[r]\n\t"
  63268. #else
  63269. "adc r4, %[r]\n\t"
  63270. #endif
  63271. "# A[10] * A[2]\n\t"
  63272. "mov %[a], r9\n\t"
  63273. "mov r7, r12\n\t"
  63274. "ldr %[a], [%[a], #40]\n\t"
  63275. "uxth r5, %[a]\n\t"
  63276. "uxth r6, r7\n\t"
  63277. #ifdef WOLFSSL_KEIL
  63278. "muls r6, r5, r6\n\t"
  63279. #elif defined(__clang__)
  63280. "muls r6, r5\n\t"
  63281. #else
  63282. "mul r6, r5\n\t"
  63283. #endif
  63284. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63285. "adds r2, r2, r6\n\t"
  63286. #else
  63287. "add r2, r2, r6\n\t"
  63288. #endif
  63289. #ifdef WOLFSSL_KEIL
  63290. "adcs r3, r3, %[r]\n\t"
  63291. #elif defined(__clang__)
  63292. "adcs r3, %[r]\n\t"
  63293. #else
  63294. "adc r3, %[r]\n\t"
  63295. #endif
  63296. #ifdef WOLFSSL_KEIL
  63297. "adcs r4, r4, %[r]\n\t"
  63298. #elif defined(__clang__)
  63299. "adcs r4, %[r]\n\t"
  63300. #else
  63301. "adc r4, %[r]\n\t"
  63302. #endif
  63303. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63304. "adds r2, r2, r6\n\t"
  63305. #else
  63306. "add r2, r2, r6\n\t"
  63307. #endif
  63308. #ifdef WOLFSSL_KEIL
  63309. "adcs r3, r3, %[r]\n\t"
  63310. #elif defined(__clang__)
  63311. "adcs r3, %[r]\n\t"
  63312. #else
  63313. "adc r3, %[r]\n\t"
  63314. #endif
  63315. #ifdef WOLFSSL_KEIL
  63316. "adcs r4, r4, %[r]\n\t"
  63317. #elif defined(__clang__)
  63318. "adcs r4, %[r]\n\t"
  63319. #else
  63320. "adc r4, %[r]\n\t"
  63321. #endif
  63322. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63323. "lsrs r6, r7, #16\n\t"
  63324. #else
  63325. "lsr r6, r7, #16\n\t"
  63326. #endif
  63327. #ifdef WOLFSSL_KEIL
  63328. "muls r5, r6, r5\n\t"
  63329. #elif defined(__clang__)
  63330. "muls r5, r6\n\t"
  63331. #else
  63332. "mul r5, r6\n\t"
  63333. #endif
  63334. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63335. "lsrs r6, r5, #16\n\t"
  63336. #else
  63337. "lsr r6, r5, #16\n\t"
  63338. #endif
  63339. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63340. "lsls r5, r5, #16\n\t"
  63341. #else
  63342. "lsl r5, r5, #16\n\t"
  63343. #endif
  63344. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63345. "adds r2, r2, r5\n\t"
  63346. #else
  63347. "add r2, r2, r5\n\t"
  63348. #endif
  63349. #ifdef WOLFSSL_KEIL
  63350. "adcs r3, r3, r6\n\t"
  63351. #elif defined(__clang__)
  63352. "adcs r3, r6\n\t"
  63353. #else
  63354. "adc r3, r6\n\t"
  63355. #endif
  63356. #ifdef WOLFSSL_KEIL
  63357. "adcs r4, r4, %[r]\n\t"
  63358. #elif defined(__clang__)
  63359. "adcs r4, %[r]\n\t"
  63360. #else
  63361. "adc r4, %[r]\n\t"
  63362. #endif
  63363. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63364. "adds r2, r2, r5\n\t"
  63365. #else
  63366. "add r2, r2, r5\n\t"
  63367. #endif
  63368. #ifdef WOLFSSL_KEIL
  63369. "adcs r3, r3, r6\n\t"
  63370. #elif defined(__clang__)
  63371. "adcs r3, r6\n\t"
  63372. #else
  63373. "adc r3, r6\n\t"
  63374. #endif
  63375. #ifdef WOLFSSL_KEIL
  63376. "adcs r4, r4, %[r]\n\t"
  63377. #elif defined(__clang__)
  63378. "adcs r4, %[r]\n\t"
  63379. #else
  63380. "adc r4, %[r]\n\t"
  63381. #endif
  63382. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63383. "lsrs r5, %[a], #16\n\t"
  63384. #else
  63385. "lsr r5, %[a], #16\n\t"
  63386. #endif
  63387. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63388. "lsrs r6, r7, #16\n\t"
  63389. #else
  63390. "lsr r6, r7, #16\n\t"
  63391. #endif
  63392. #ifdef WOLFSSL_KEIL
  63393. "muls r6, r5, r6\n\t"
  63394. #elif defined(__clang__)
  63395. "muls r6, r5\n\t"
  63396. #else
  63397. "mul r6, r5\n\t"
  63398. #endif
  63399. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63400. "adds r3, r3, r6\n\t"
  63401. #else
  63402. "add r3, r3, r6\n\t"
  63403. #endif
  63404. #ifdef WOLFSSL_KEIL
  63405. "adcs r4, r4, %[r]\n\t"
  63406. #elif defined(__clang__)
  63407. "adcs r4, %[r]\n\t"
  63408. #else
  63409. "adc r4, %[r]\n\t"
  63410. #endif
  63411. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63412. "adds r3, r3, r6\n\t"
  63413. #else
  63414. "add r3, r3, r6\n\t"
  63415. #endif
  63416. #ifdef WOLFSSL_KEIL
  63417. "adcs r4, r4, %[r]\n\t"
  63418. #elif defined(__clang__)
  63419. "adcs r4, %[r]\n\t"
  63420. #else
  63421. "adc r4, %[r]\n\t"
  63422. #endif
  63423. "uxth r6, r7\n\t"
  63424. #ifdef WOLFSSL_KEIL
  63425. "muls r5, r6, r5\n\t"
  63426. #elif defined(__clang__)
  63427. "muls r5, r6\n\t"
  63428. #else
  63429. "mul r5, r6\n\t"
  63430. #endif
  63431. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63432. "lsrs r6, r5, #16\n\t"
  63433. #else
  63434. "lsr r6, r5, #16\n\t"
  63435. #endif
  63436. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63437. "lsls r5, r5, #16\n\t"
  63438. #else
  63439. "lsl r5, r5, #16\n\t"
  63440. #endif
  63441. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63442. "adds r2, r2, r5\n\t"
  63443. #else
  63444. "add r2, r2, r5\n\t"
  63445. #endif
  63446. #ifdef WOLFSSL_KEIL
  63447. "adcs r3, r3, r6\n\t"
  63448. #elif defined(__clang__)
  63449. "adcs r3, r6\n\t"
  63450. #else
  63451. "adc r3, r6\n\t"
  63452. #endif
  63453. #ifdef WOLFSSL_KEIL
  63454. "adcs r4, r4, %[r]\n\t"
  63455. #elif defined(__clang__)
  63456. "adcs r4, %[r]\n\t"
  63457. #else
  63458. "adc r4, %[r]\n\t"
  63459. #endif
  63460. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63461. "adds r2, r2, r5\n\t"
  63462. #else
  63463. "add r2, r2, r5\n\t"
  63464. #endif
  63465. #ifdef WOLFSSL_KEIL
  63466. "adcs r3, r3, r6\n\t"
  63467. #elif defined(__clang__)
  63468. "adcs r3, r6\n\t"
  63469. #else
  63470. "adc r3, r6\n\t"
  63471. #endif
  63472. #ifdef WOLFSSL_KEIL
  63473. "adcs r4, r4, %[r]\n\t"
  63474. #elif defined(__clang__)
  63475. "adcs r4, %[r]\n\t"
  63476. #else
  63477. "adc r4, %[r]\n\t"
  63478. #endif
  63479. "# A[9] * A[3]\n\t"
  63480. "mov %[a], r9\n\t"
  63481. "mov r7, lr\n\t"
  63482. "ldr %[a], [%[a], #36]\n\t"
  63483. "uxth r5, %[a]\n\t"
  63484. "uxth r6, r7\n\t"
  63485. #ifdef WOLFSSL_KEIL
  63486. "muls r6, r5, r6\n\t"
  63487. #elif defined(__clang__)
  63488. "muls r6, r5\n\t"
  63489. #else
  63490. "mul r6, r5\n\t"
  63491. #endif
  63492. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63493. "adds r2, r2, r6\n\t"
  63494. #else
  63495. "add r2, r2, r6\n\t"
  63496. #endif
  63497. #ifdef WOLFSSL_KEIL
  63498. "adcs r3, r3, %[r]\n\t"
  63499. #elif defined(__clang__)
  63500. "adcs r3, %[r]\n\t"
  63501. #else
  63502. "adc r3, %[r]\n\t"
  63503. #endif
  63504. #ifdef WOLFSSL_KEIL
  63505. "adcs r4, r4, %[r]\n\t"
  63506. #elif defined(__clang__)
  63507. "adcs r4, %[r]\n\t"
  63508. #else
  63509. "adc r4, %[r]\n\t"
  63510. #endif
  63511. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63512. "adds r2, r2, r6\n\t"
  63513. #else
  63514. "add r2, r2, r6\n\t"
  63515. #endif
  63516. #ifdef WOLFSSL_KEIL
  63517. "adcs r3, r3, %[r]\n\t"
  63518. #elif defined(__clang__)
  63519. "adcs r3, %[r]\n\t"
  63520. #else
  63521. "adc r3, %[r]\n\t"
  63522. #endif
  63523. #ifdef WOLFSSL_KEIL
  63524. "adcs r4, r4, %[r]\n\t"
  63525. #elif defined(__clang__)
  63526. "adcs r4, %[r]\n\t"
  63527. #else
  63528. "adc r4, %[r]\n\t"
  63529. #endif
  63530. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63531. "lsrs r6, r7, #16\n\t"
  63532. #else
  63533. "lsr r6, r7, #16\n\t"
  63534. #endif
  63535. #ifdef WOLFSSL_KEIL
  63536. "muls r5, r6, r5\n\t"
  63537. #elif defined(__clang__)
  63538. "muls r5, r6\n\t"
  63539. #else
  63540. "mul r5, r6\n\t"
  63541. #endif
  63542. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63543. "lsrs r6, r5, #16\n\t"
  63544. #else
  63545. "lsr r6, r5, #16\n\t"
  63546. #endif
  63547. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63548. "lsls r5, r5, #16\n\t"
  63549. #else
  63550. "lsl r5, r5, #16\n\t"
  63551. #endif
  63552. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63553. "adds r2, r2, r5\n\t"
  63554. #else
  63555. "add r2, r2, r5\n\t"
  63556. #endif
  63557. #ifdef WOLFSSL_KEIL
  63558. "adcs r3, r3, r6\n\t"
  63559. #elif defined(__clang__)
  63560. "adcs r3, r6\n\t"
  63561. #else
  63562. "adc r3, r6\n\t"
  63563. #endif
  63564. #ifdef WOLFSSL_KEIL
  63565. "adcs r4, r4, %[r]\n\t"
  63566. #elif defined(__clang__)
  63567. "adcs r4, %[r]\n\t"
  63568. #else
  63569. "adc r4, %[r]\n\t"
  63570. #endif
  63571. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63572. "adds r2, r2, r5\n\t"
  63573. #else
  63574. "add r2, r2, r5\n\t"
  63575. #endif
  63576. #ifdef WOLFSSL_KEIL
  63577. "adcs r3, r3, r6\n\t"
  63578. #elif defined(__clang__)
  63579. "adcs r3, r6\n\t"
  63580. #else
  63581. "adc r3, r6\n\t"
  63582. #endif
  63583. #ifdef WOLFSSL_KEIL
  63584. "adcs r4, r4, %[r]\n\t"
  63585. #elif defined(__clang__)
  63586. "adcs r4, %[r]\n\t"
  63587. #else
  63588. "adc r4, %[r]\n\t"
  63589. #endif
  63590. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63591. "lsrs r5, %[a], #16\n\t"
  63592. #else
  63593. "lsr r5, %[a], #16\n\t"
  63594. #endif
  63595. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63596. "lsrs r6, r7, #16\n\t"
  63597. #else
  63598. "lsr r6, r7, #16\n\t"
  63599. #endif
  63600. #ifdef WOLFSSL_KEIL
  63601. "muls r6, r5, r6\n\t"
  63602. #elif defined(__clang__)
  63603. "muls r6, r5\n\t"
  63604. #else
  63605. "mul r6, r5\n\t"
  63606. #endif
  63607. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63608. "adds r3, r3, r6\n\t"
  63609. #else
  63610. "add r3, r3, r6\n\t"
  63611. #endif
  63612. #ifdef WOLFSSL_KEIL
  63613. "adcs r4, r4, %[r]\n\t"
  63614. #elif defined(__clang__)
  63615. "adcs r4, %[r]\n\t"
  63616. #else
  63617. "adc r4, %[r]\n\t"
  63618. #endif
  63619. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63620. "adds r3, r3, r6\n\t"
  63621. #else
  63622. "add r3, r3, r6\n\t"
  63623. #endif
  63624. #ifdef WOLFSSL_KEIL
  63625. "adcs r4, r4, %[r]\n\t"
  63626. #elif defined(__clang__)
  63627. "adcs r4, %[r]\n\t"
  63628. #else
  63629. "adc r4, %[r]\n\t"
  63630. #endif
  63631. "uxth r6, r7\n\t"
  63632. #ifdef WOLFSSL_KEIL
  63633. "muls r5, r6, r5\n\t"
  63634. #elif defined(__clang__)
  63635. "muls r5, r6\n\t"
  63636. #else
  63637. "mul r5, r6\n\t"
  63638. #endif
  63639. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63640. "lsrs r6, r5, #16\n\t"
  63641. #else
  63642. "lsr r6, r5, #16\n\t"
  63643. #endif
  63644. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63645. "lsls r5, r5, #16\n\t"
  63646. #else
  63647. "lsl r5, r5, #16\n\t"
  63648. #endif
  63649. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63650. "adds r2, r2, r5\n\t"
  63651. #else
  63652. "add r2, r2, r5\n\t"
  63653. #endif
  63654. #ifdef WOLFSSL_KEIL
  63655. "adcs r3, r3, r6\n\t"
  63656. #elif defined(__clang__)
  63657. "adcs r3, r6\n\t"
  63658. #else
  63659. "adc r3, r6\n\t"
  63660. #endif
  63661. #ifdef WOLFSSL_KEIL
  63662. "adcs r4, r4, %[r]\n\t"
  63663. #elif defined(__clang__)
  63664. "adcs r4, %[r]\n\t"
  63665. #else
  63666. "adc r4, %[r]\n\t"
  63667. #endif
  63668. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63669. "adds r2, r2, r5\n\t"
  63670. #else
  63671. "add r2, r2, r5\n\t"
  63672. #endif
  63673. #ifdef WOLFSSL_KEIL
  63674. "adcs r3, r3, r6\n\t"
  63675. #elif defined(__clang__)
  63676. "adcs r3, r6\n\t"
  63677. #else
  63678. "adc r3, r6\n\t"
  63679. #endif
  63680. #ifdef WOLFSSL_KEIL
  63681. "adcs r4, r4, %[r]\n\t"
  63682. #elif defined(__clang__)
  63683. "adcs r4, %[r]\n\t"
  63684. #else
  63685. "adc r4, %[r]\n\t"
  63686. #endif
  63687. "# A[8] * A[4]\n\t"
  63688. "mov %[a], r9\n\t"
  63689. "ldr r7, [%[a], #16]\n\t"
  63690. "ldr %[a], [%[a], #32]\n\t"
  63691. "uxth r5, %[a]\n\t"
  63692. "uxth r6, r7\n\t"
  63693. #ifdef WOLFSSL_KEIL
  63694. "muls r6, r5, r6\n\t"
  63695. #elif defined(__clang__)
  63696. "muls r6, r5\n\t"
  63697. #else
  63698. "mul r6, r5\n\t"
  63699. #endif
  63700. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63701. "adds r2, r2, r6\n\t"
  63702. #else
  63703. "add r2, r2, r6\n\t"
  63704. #endif
  63705. #ifdef WOLFSSL_KEIL
  63706. "adcs r3, r3, %[r]\n\t"
  63707. #elif defined(__clang__)
  63708. "adcs r3, %[r]\n\t"
  63709. #else
  63710. "adc r3, %[r]\n\t"
  63711. #endif
  63712. #ifdef WOLFSSL_KEIL
  63713. "adcs r4, r4, %[r]\n\t"
  63714. #elif defined(__clang__)
  63715. "adcs r4, %[r]\n\t"
  63716. #else
  63717. "adc r4, %[r]\n\t"
  63718. #endif
  63719. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63720. "adds r2, r2, r6\n\t"
  63721. #else
  63722. "add r2, r2, r6\n\t"
  63723. #endif
  63724. #ifdef WOLFSSL_KEIL
  63725. "adcs r3, r3, %[r]\n\t"
  63726. #elif defined(__clang__)
  63727. "adcs r3, %[r]\n\t"
  63728. #else
  63729. "adc r3, %[r]\n\t"
  63730. #endif
  63731. #ifdef WOLFSSL_KEIL
  63732. "adcs r4, r4, %[r]\n\t"
  63733. #elif defined(__clang__)
  63734. "adcs r4, %[r]\n\t"
  63735. #else
  63736. "adc r4, %[r]\n\t"
  63737. #endif
  63738. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63739. "lsrs r6, r7, #16\n\t"
  63740. #else
  63741. "lsr r6, r7, #16\n\t"
  63742. #endif
  63743. #ifdef WOLFSSL_KEIL
  63744. "muls r5, r6, r5\n\t"
  63745. #elif defined(__clang__)
  63746. "muls r5, r6\n\t"
  63747. #else
  63748. "mul r5, r6\n\t"
  63749. #endif
  63750. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63751. "lsrs r6, r5, #16\n\t"
  63752. #else
  63753. "lsr r6, r5, #16\n\t"
  63754. #endif
  63755. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63756. "lsls r5, r5, #16\n\t"
  63757. #else
  63758. "lsl r5, r5, #16\n\t"
  63759. #endif
  63760. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63761. "adds r2, r2, r5\n\t"
  63762. #else
  63763. "add r2, r2, r5\n\t"
  63764. #endif
  63765. #ifdef WOLFSSL_KEIL
  63766. "adcs r3, r3, r6\n\t"
  63767. #elif defined(__clang__)
  63768. "adcs r3, r6\n\t"
  63769. #else
  63770. "adc r3, r6\n\t"
  63771. #endif
  63772. #ifdef WOLFSSL_KEIL
  63773. "adcs r4, r4, %[r]\n\t"
  63774. #elif defined(__clang__)
  63775. "adcs r4, %[r]\n\t"
  63776. #else
  63777. "adc r4, %[r]\n\t"
  63778. #endif
  63779. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63780. "adds r2, r2, r5\n\t"
  63781. #else
  63782. "add r2, r2, r5\n\t"
  63783. #endif
  63784. #ifdef WOLFSSL_KEIL
  63785. "adcs r3, r3, r6\n\t"
  63786. #elif defined(__clang__)
  63787. "adcs r3, r6\n\t"
  63788. #else
  63789. "adc r3, r6\n\t"
  63790. #endif
  63791. #ifdef WOLFSSL_KEIL
  63792. "adcs r4, r4, %[r]\n\t"
  63793. #elif defined(__clang__)
  63794. "adcs r4, %[r]\n\t"
  63795. #else
  63796. "adc r4, %[r]\n\t"
  63797. #endif
  63798. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63799. "lsrs r5, %[a], #16\n\t"
  63800. #else
  63801. "lsr r5, %[a], #16\n\t"
  63802. #endif
  63803. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63804. "lsrs r6, r7, #16\n\t"
  63805. #else
  63806. "lsr r6, r7, #16\n\t"
  63807. #endif
  63808. #ifdef WOLFSSL_KEIL
  63809. "muls r6, r5, r6\n\t"
  63810. #elif defined(__clang__)
  63811. "muls r6, r5\n\t"
  63812. #else
  63813. "mul r6, r5\n\t"
  63814. #endif
  63815. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63816. "adds r3, r3, r6\n\t"
  63817. #else
  63818. "add r3, r3, r6\n\t"
  63819. #endif
  63820. #ifdef WOLFSSL_KEIL
  63821. "adcs r4, r4, %[r]\n\t"
  63822. #elif defined(__clang__)
  63823. "adcs r4, %[r]\n\t"
  63824. #else
  63825. "adc r4, %[r]\n\t"
  63826. #endif
  63827. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63828. "adds r3, r3, r6\n\t"
  63829. #else
  63830. "add r3, r3, r6\n\t"
  63831. #endif
  63832. #ifdef WOLFSSL_KEIL
  63833. "adcs r4, r4, %[r]\n\t"
  63834. #elif defined(__clang__)
  63835. "adcs r4, %[r]\n\t"
  63836. #else
  63837. "adc r4, %[r]\n\t"
  63838. #endif
  63839. "uxth r6, r7\n\t"
  63840. #ifdef WOLFSSL_KEIL
  63841. "muls r5, r6, r5\n\t"
  63842. #elif defined(__clang__)
  63843. "muls r5, r6\n\t"
  63844. #else
  63845. "mul r5, r6\n\t"
  63846. #endif
  63847. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63848. "lsrs r6, r5, #16\n\t"
  63849. #else
  63850. "lsr r6, r5, #16\n\t"
  63851. #endif
  63852. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63853. "lsls r5, r5, #16\n\t"
  63854. #else
  63855. "lsl r5, r5, #16\n\t"
  63856. #endif
  63857. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63858. "adds r2, r2, r5\n\t"
  63859. #else
  63860. "add r2, r2, r5\n\t"
  63861. #endif
  63862. #ifdef WOLFSSL_KEIL
  63863. "adcs r3, r3, r6\n\t"
  63864. #elif defined(__clang__)
  63865. "adcs r3, r6\n\t"
  63866. #else
  63867. "adc r3, r6\n\t"
  63868. #endif
  63869. #ifdef WOLFSSL_KEIL
  63870. "adcs r4, r4, %[r]\n\t"
  63871. #elif defined(__clang__)
  63872. "adcs r4, %[r]\n\t"
  63873. #else
  63874. "adc r4, %[r]\n\t"
  63875. #endif
  63876. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63877. "adds r2, r2, r5\n\t"
  63878. #else
  63879. "add r2, r2, r5\n\t"
  63880. #endif
  63881. #ifdef WOLFSSL_KEIL
  63882. "adcs r3, r3, r6\n\t"
  63883. #elif defined(__clang__)
  63884. "adcs r3, r6\n\t"
  63885. #else
  63886. "adc r3, r6\n\t"
  63887. #endif
  63888. #ifdef WOLFSSL_KEIL
  63889. "adcs r4, r4, %[r]\n\t"
  63890. #elif defined(__clang__)
  63891. "adcs r4, %[r]\n\t"
  63892. #else
  63893. "adc r4, %[r]\n\t"
  63894. #endif
  63895. "# A[7] * A[5]\n\t"
  63896. "mov %[a], r9\n\t"
  63897. "ldr r7, [%[a], #20]\n\t"
  63898. "ldr %[a], [%[a], #28]\n\t"
  63899. "uxth r5, %[a]\n\t"
  63900. "uxth r6, r7\n\t"
  63901. #ifdef WOLFSSL_KEIL
  63902. "muls r6, r5, r6\n\t"
  63903. #elif defined(__clang__)
  63904. "muls r6, r5\n\t"
  63905. #else
  63906. "mul r6, r5\n\t"
  63907. #endif
  63908. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63909. "adds r2, r2, r6\n\t"
  63910. #else
  63911. "add r2, r2, r6\n\t"
  63912. #endif
  63913. #ifdef WOLFSSL_KEIL
  63914. "adcs r3, r3, %[r]\n\t"
  63915. #elif defined(__clang__)
  63916. "adcs r3, %[r]\n\t"
  63917. #else
  63918. "adc r3, %[r]\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, r6\n\t"
  63929. #else
  63930. "add r2, r2, r6\n\t"
  63931. #endif
  63932. #ifdef WOLFSSL_KEIL
  63933. "adcs r3, r3, %[r]\n\t"
  63934. #elif defined(__clang__)
  63935. "adcs r3, %[r]\n\t"
  63936. #else
  63937. "adc r3, %[r]\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 r6, r7, #16\n\t"
  63948. #else
  63949. "lsr r6, r7, #16\n\t"
  63950. #endif
  63951. #ifdef WOLFSSL_KEIL
  63952. "muls r5, r6, r5\n\t"
  63953. #elif defined(__clang__)
  63954. "muls r5, r6\n\t"
  63955. #else
  63956. "mul r5, r6\n\t"
  63957. #endif
  63958. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63959. "lsrs r6, r5, #16\n\t"
  63960. #else
  63961. "lsr r6, r5, #16\n\t"
  63962. #endif
  63963. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63964. "lsls r5, r5, #16\n\t"
  63965. #else
  63966. "lsl r5, r5, #16\n\t"
  63967. #endif
  63968. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63969. "adds r2, r2, r5\n\t"
  63970. #else
  63971. "add r2, r2, r5\n\t"
  63972. #endif
  63973. #ifdef WOLFSSL_KEIL
  63974. "adcs r3, r3, r6\n\t"
  63975. #elif defined(__clang__)
  63976. "adcs r3, r6\n\t"
  63977. #else
  63978. "adc 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. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63988. "adds r2, r2, r5\n\t"
  63989. #else
  63990. "add r2, r2, r5\n\t"
  63991. #endif
  63992. #ifdef WOLFSSL_KEIL
  63993. "adcs r3, r3, r6\n\t"
  63994. #elif defined(__clang__)
  63995. "adcs r3, r6\n\t"
  63996. #else
  63997. "adc r3, r6\n\t"
  63998. #endif
  63999. #ifdef WOLFSSL_KEIL
  64000. "adcs r4, r4, %[r]\n\t"
  64001. #elif defined(__clang__)
  64002. "adcs r4, %[r]\n\t"
  64003. #else
  64004. "adc r4, %[r]\n\t"
  64005. #endif
  64006. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64007. "lsrs r5, %[a], #16\n\t"
  64008. #else
  64009. "lsr r5, %[a], #16\n\t"
  64010. #endif
  64011. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64012. "lsrs r6, r7, #16\n\t"
  64013. #else
  64014. "lsr r6, r7, #16\n\t"
  64015. #endif
  64016. #ifdef WOLFSSL_KEIL
  64017. "muls r6, r5, r6\n\t"
  64018. #elif defined(__clang__)
  64019. "muls r6, r5\n\t"
  64020. #else
  64021. "mul r6, r5\n\t"
  64022. #endif
  64023. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64024. "adds r3, r3, r6\n\t"
  64025. #else
  64026. "add r3, r3, r6\n\t"
  64027. #endif
  64028. #ifdef WOLFSSL_KEIL
  64029. "adcs r4, r4, %[r]\n\t"
  64030. #elif defined(__clang__)
  64031. "adcs r4, %[r]\n\t"
  64032. #else
  64033. "adc r4, %[r]\n\t"
  64034. #endif
  64035. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64036. "adds r3, r3, r6\n\t"
  64037. #else
  64038. "add r3, r3, r6\n\t"
  64039. #endif
  64040. #ifdef WOLFSSL_KEIL
  64041. "adcs r4, r4, %[r]\n\t"
  64042. #elif defined(__clang__)
  64043. "adcs r4, %[r]\n\t"
  64044. #else
  64045. "adc r4, %[r]\n\t"
  64046. #endif
  64047. "uxth r6, r7\n\t"
  64048. #ifdef WOLFSSL_KEIL
  64049. "muls r5, r6, r5\n\t"
  64050. #elif defined(__clang__)
  64051. "muls r5, r6\n\t"
  64052. #else
  64053. "mul r5, r6\n\t"
  64054. #endif
  64055. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64056. "lsrs r6, r5, #16\n\t"
  64057. #else
  64058. "lsr r6, r5, #16\n\t"
  64059. #endif
  64060. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64061. "lsls r5, r5, #16\n\t"
  64062. #else
  64063. "lsl r5, r5, #16\n\t"
  64064. #endif
  64065. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64066. "adds r2, r2, r5\n\t"
  64067. #else
  64068. "add r2, r2, r5\n\t"
  64069. #endif
  64070. #ifdef WOLFSSL_KEIL
  64071. "adcs r3, r3, r6\n\t"
  64072. #elif defined(__clang__)
  64073. "adcs r3, r6\n\t"
  64074. #else
  64075. "adc r3, r6\n\t"
  64076. #endif
  64077. #ifdef WOLFSSL_KEIL
  64078. "adcs r4, r4, %[r]\n\t"
  64079. #elif defined(__clang__)
  64080. "adcs r4, %[r]\n\t"
  64081. #else
  64082. "adc r4, %[r]\n\t"
  64083. #endif
  64084. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64085. "adds r2, r2, r5\n\t"
  64086. #else
  64087. "add r2, r2, r5\n\t"
  64088. #endif
  64089. #ifdef WOLFSSL_KEIL
  64090. "adcs r3, r3, r6\n\t"
  64091. #elif defined(__clang__)
  64092. "adcs r3, r6\n\t"
  64093. #else
  64094. "adc r3, r6\n\t"
  64095. #endif
  64096. #ifdef WOLFSSL_KEIL
  64097. "adcs r4, r4, %[r]\n\t"
  64098. #elif defined(__clang__)
  64099. "adcs r4, %[r]\n\t"
  64100. #else
  64101. "adc r4, %[r]\n\t"
  64102. #endif
  64103. "# A[6] * A[6]\n\t"
  64104. "mov %[a], r9\n\t"
  64105. "ldr r7, [%[a], #24]\n\t"
  64106. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64107. "lsrs r6, r7, #16\n\t"
  64108. #else
  64109. "lsr r6, r7, #16\n\t"
  64110. #endif
  64111. "uxth r5, r7\n\t"
  64112. #ifdef WOLFSSL_KEIL
  64113. "muls r5, r5, r5\n\t"
  64114. #elif defined(__clang__)
  64115. "muls r5, r5\n\t"
  64116. #else
  64117. "mul r5, r5\n\t"
  64118. #endif
  64119. #ifdef WOLFSSL_KEIL
  64120. "muls r6, r6, r6\n\t"
  64121. #elif defined(__clang__)
  64122. "muls r6, r6\n\t"
  64123. #else
  64124. "mul r6, r6\n\t"
  64125. #endif
  64126. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64127. "adds r2, r2, r5\n\t"
  64128. #else
  64129. "add r2, r2, r5\n\t"
  64130. #endif
  64131. #ifdef WOLFSSL_KEIL
  64132. "adcs r3, r3, r6\n\t"
  64133. #elif defined(__clang__)
  64134. "adcs r3, r6\n\t"
  64135. #else
  64136. "adc r3, r6\n\t"
  64137. #endif
  64138. #ifdef WOLFSSL_KEIL
  64139. "adcs r4, r4, %[r]\n\t"
  64140. #elif defined(__clang__)
  64141. "adcs r4, %[r]\n\t"
  64142. #else
  64143. "adc r4, %[r]\n\t"
  64144. #endif
  64145. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64146. "lsrs r6, r7, #16\n\t"
  64147. #else
  64148. "lsr r6, r7, #16\n\t"
  64149. #endif
  64150. "uxth r5, r7\n\t"
  64151. #ifdef WOLFSSL_KEIL
  64152. "muls r5, r6, r5\n\t"
  64153. #elif defined(__clang__)
  64154. "muls r5, r6\n\t"
  64155. #else
  64156. "mul r5, r6\n\t"
  64157. #endif
  64158. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64159. "lsrs r6, r5, #15\n\t"
  64160. #else
  64161. "lsr r6, r5, #15\n\t"
  64162. #endif
  64163. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64164. "lsls r5, r5, #17\n\t"
  64165. #else
  64166. "lsl r5, r5, #17\n\t"
  64167. #endif
  64168. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64169. "adds r2, r2, r5\n\t"
  64170. #else
  64171. "add r2, r2, r5\n\t"
  64172. #endif
  64173. #ifdef WOLFSSL_KEIL
  64174. "adcs r3, r3, r6\n\t"
  64175. #elif defined(__clang__)
  64176. "adcs r3, r6\n\t"
  64177. #else
  64178. "adc r3, r6\n\t"
  64179. #endif
  64180. #ifdef WOLFSSL_KEIL
  64181. "adcs r4, r4, %[r]\n\t"
  64182. #elif defined(__clang__)
  64183. "adcs r4, %[r]\n\t"
  64184. #else
  64185. "adc r4, %[r]\n\t"
  64186. #endif
  64187. "mov %[r], r8\n\t"
  64188. "str r2, [%[r], #48]\n\t"
  64189. "movs %[r], #0\n\t"
  64190. "movs %[a], #32\n\t"
  64191. "add %[a], %[a], r9\n\t"
  64192. "ldm %[a]!, {r5, r6}\n\t"
  64193. "mov r10, r5\n\t"
  64194. "mov r11, r6\n\t"
  64195. "ldm %[a]!, {r5, r6}\n\t"
  64196. "mov r12, r5\n\t"
  64197. "mov lr, r6\n\t"
  64198. "mov %[a], r9\n\t"
  64199. "# A[7] * A[6]\n\t"
  64200. "movs r2, #0\n\t"
  64201. "ldr %[a], [%[a], #28]\n\t"
  64202. "uxth r5, %[a]\n\t"
  64203. "uxth r6, r7\n\t"
  64204. #ifdef WOLFSSL_KEIL
  64205. "muls r6, r5, r6\n\t"
  64206. #elif defined(__clang__)
  64207. "muls r6, r5\n\t"
  64208. #else
  64209. "mul r6, r5\n\t"
  64210. #endif
  64211. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64212. "adds r3, r3, r6\n\t"
  64213. #else
  64214. "add r3, r3, r6\n\t"
  64215. #endif
  64216. #ifdef WOLFSSL_KEIL
  64217. "adcs r4, r4, %[r]\n\t"
  64218. #elif defined(__clang__)
  64219. "adcs r4, %[r]\n\t"
  64220. #else
  64221. "adc r4, %[r]\n\t"
  64222. #endif
  64223. #ifdef WOLFSSL_KEIL
  64224. "adcs r2, r2, %[r]\n\t"
  64225. #elif defined(__clang__)
  64226. "adcs r2, %[r]\n\t"
  64227. #else
  64228. "adc r2, %[r]\n\t"
  64229. #endif
  64230. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64231. "adds r3, r3, r6\n\t"
  64232. #else
  64233. "add r3, r3, r6\n\t"
  64234. #endif
  64235. #ifdef WOLFSSL_KEIL
  64236. "adcs r4, r4, %[r]\n\t"
  64237. #elif defined(__clang__)
  64238. "adcs r4, %[r]\n\t"
  64239. #else
  64240. "adc r4, %[r]\n\t"
  64241. #endif
  64242. #ifdef WOLFSSL_KEIL
  64243. "adcs r2, r2, %[r]\n\t"
  64244. #elif defined(__clang__)
  64245. "adcs r2, %[r]\n\t"
  64246. #else
  64247. "adc r2, %[r]\n\t"
  64248. #endif
  64249. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64250. "lsrs r6, r7, #16\n\t"
  64251. #else
  64252. "lsr r6, r7, #16\n\t"
  64253. #endif
  64254. #ifdef WOLFSSL_KEIL
  64255. "muls r5, r6, r5\n\t"
  64256. #elif defined(__clang__)
  64257. "muls r5, r6\n\t"
  64258. #else
  64259. "mul r5, r6\n\t"
  64260. #endif
  64261. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64262. "lsrs r6, r5, #16\n\t"
  64263. #else
  64264. "lsr r6, r5, #16\n\t"
  64265. #endif
  64266. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64267. "lsls r5, r5, #16\n\t"
  64268. #else
  64269. "lsl r5, r5, #16\n\t"
  64270. #endif
  64271. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64272. "adds r3, r3, r5\n\t"
  64273. #else
  64274. "add r3, r3, r5\n\t"
  64275. #endif
  64276. #ifdef WOLFSSL_KEIL
  64277. "adcs r4, r4, r6\n\t"
  64278. #elif defined(__clang__)
  64279. "adcs r4, r6\n\t"
  64280. #else
  64281. "adc r4, r6\n\t"
  64282. #endif
  64283. #ifdef WOLFSSL_KEIL
  64284. "adcs r2, r2, %[r]\n\t"
  64285. #elif defined(__clang__)
  64286. "adcs r2, %[r]\n\t"
  64287. #else
  64288. "adc r2, %[r]\n\t"
  64289. #endif
  64290. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64291. "adds r3, r3, r5\n\t"
  64292. #else
  64293. "add r3, r3, r5\n\t"
  64294. #endif
  64295. #ifdef WOLFSSL_KEIL
  64296. "adcs r4, r4, r6\n\t"
  64297. #elif defined(__clang__)
  64298. "adcs r4, r6\n\t"
  64299. #else
  64300. "adc r4, r6\n\t"
  64301. #endif
  64302. #ifdef WOLFSSL_KEIL
  64303. "adcs r2, r2, %[r]\n\t"
  64304. #elif defined(__clang__)
  64305. "adcs r2, %[r]\n\t"
  64306. #else
  64307. "adc r2, %[r]\n\t"
  64308. #endif
  64309. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64310. "lsrs r5, %[a], #16\n\t"
  64311. #else
  64312. "lsr r5, %[a], #16\n\t"
  64313. #endif
  64314. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64315. "lsrs r6, r7, #16\n\t"
  64316. #else
  64317. "lsr r6, r7, #16\n\t"
  64318. #endif
  64319. #ifdef WOLFSSL_KEIL
  64320. "muls r6, r5, r6\n\t"
  64321. #elif defined(__clang__)
  64322. "muls r6, r5\n\t"
  64323. #else
  64324. "mul r6, r5\n\t"
  64325. #endif
  64326. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64327. "adds r4, r4, r6\n\t"
  64328. #else
  64329. "add r4, r4, r6\n\t"
  64330. #endif
  64331. #ifdef WOLFSSL_KEIL
  64332. "adcs r2, r2, %[r]\n\t"
  64333. #elif defined(__clang__)
  64334. "adcs r2, %[r]\n\t"
  64335. #else
  64336. "adc r2, %[r]\n\t"
  64337. #endif
  64338. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64339. "adds r4, r4, r6\n\t"
  64340. #else
  64341. "add r4, r4, r6\n\t"
  64342. #endif
  64343. #ifdef WOLFSSL_KEIL
  64344. "adcs r2, r2, %[r]\n\t"
  64345. #elif defined(__clang__)
  64346. "adcs r2, %[r]\n\t"
  64347. #else
  64348. "adc r2, %[r]\n\t"
  64349. #endif
  64350. "uxth r6, r7\n\t"
  64351. #ifdef WOLFSSL_KEIL
  64352. "muls r5, r6, r5\n\t"
  64353. #elif defined(__clang__)
  64354. "muls r5, r6\n\t"
  64355. #else
  64356. "mul r5, r6\n\t"
  64357. #endif
  64358. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64359. "lsrs r6, r5, #16\n\t"
  64360. #else
  64361. "lsr r6, r5, #16\n\t"
  64362. #endif
  64363. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64364. "lsls r5, r5, #16\n\t"
  64365. #else
  64366. "lsl r5, r5, #16\n\t"
  64367. #endif
  64368. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64369. "adds r3, r3, r5\n\t"
  64370. #else
  64371. "add r3, r3, r5\n\t"
  64372. #endif
  64373. #ifdef WOLFSSL_KEIL
  64374. "adcs r4, r4, r6\n\t"
  64375. #elif defined(__clang__)
  64376. "adcs r4, r6\n\t"
  64377. #else
  64378. "adc r4, r6\n\t"
  64379. #endif
  64380. #ifdef WOLFSSL_KEIL
  64381. "adcs r2, r2, %[r]\n\t"
  64382. #elif defined(__clang__)
  64383. "adcs r2, %[r]\n\t"
  64384. #else
  64385. "adc r2, %[r]\n\t"
  64386. #endif
  64387. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64388. "adds r3, r3, r5\n\t"
  64389. #else
  64390. "add r3, r3, r5\n\t"
  64391. #endif
  64392. #ifdef WOLFSSL_KEIL
  64393. "adcs r4, r4, r6\n\t"
  64394. #elif defined(__clang__)
  64395. "adcs r4, r6\n\t"
  64396. #else
  64397. "adc r4, r6\n\t"
  64398. #endif
  64399. #ifdef WOLFSSL_KEIL
  64400. "adcs r2, r2, %[r]\n\t"
  64401. #elif defined(__clang__)
  64402. "adcs r2, %[r]\n\t"
  64403. #else
  64404. "adc r2, %[r]\n\t"
  64405. #endif
  64406. "# A[8] * A[5]\n\t"
  64407. "mov %[a], r9\n\t"
  64408. "ldr r7, [%[a], #20]\n\t"
  64409. "mov %[a], r10\n\t"
  64410. "uxth r5, %[a]\n\t"
  64411. "uxth r6, r7\n\t"
  64412. #ifdef WOLFSSL_KEIL
  64413. "muls r6, r5, r6\n\t"
  64414. #elif defined(__clang__)
  64415. "muls r6, r5\n\t"
  64416. #else
  64417. "mul r6, r5\n\t"
  64418. #endif
  64419. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64420. "adds r3, r3, r6\n\t"
  64421. #else
  64422. "add r3, r3, r6\n\t"
  64423. #endif
  64424. #ifdef WOLFSSL_KEIL
  64425. "adcs r4, r4, %[r]\n\t"
  64426. #elif defined(__clang__)
  64427. "adcs r4, %[r]\n\t"
  64428. #else
  64429. "adc r4, %[r]\n\t"
  64430. #endif
  64431. #ifdef WOLFSSL_KEIL
  64432. "adcs r2, r2, %[r]\n\t"
  64433. #elif defined(__clang__)
  64434. "adcs r2, %[r]\n\t"
  64435. #else
  64436. "adc r2, %[r]\n\t"
  64437. #endif
  64438. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64439. "adds r3, r3, r6\n\t"
  64440. #else
  64441. "add r3, r3, r6\n\t"
  64442. #endif
  64443. #ifdef WOLFSSL_KEIL
  64444. "adcs r4, r4, %[r]\n\t"
  64445. #elif defined(__clang__)
  64446. "adcs r4, %[r]\n\t"
  64447. #else
  64448. "adc r4, %[r]\n\t"
  64449. #endif
  64450. #ifdef WOLFSSL_KEIL
  64451. "adcs r2, r2, %[r]\n\t"
  64452. #elif defined(__clang__)
  64453. "adcs r2, %[r]\n\t"
  64454. #else
  64455. "adc r2, %[r]\n\t"
  64456. #endif
  64457. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64458. "lsrs r6, r7, #16\n\t"
  64459. #else
  64460. "lsr r6, r7, #16\n\t"
  64461. #endif
  64462. #ifdef WOLFSSL_KEIL
  64463. "muls r5, r6, r5\n\t"
  64464. #elif defined(__clang__)
  64465. "muls r5, r6\n\t"
  64466. #else
  64467. "mul r5, r6\n\t"
  64468. #endif
  64469. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64470. "lsrs r6, r5, #16\n\t"
  64471. #else
  64472. "lsr r6, r5, #16\n\t"
  64473. #endif
  64474. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64475. "lsls r5, r5, #16\n\t"
  64476. #else
  64477. "lsl r5, r5, #16\n\t"
  64478. #endif
  64479. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64480. "adds r3, r3, r5\n\t"
  64481. #else
  64482. "add r3, r3, r5\n\t"
  64483. #endif
  64484. #ifdef WOLFSSL_KEIL
  64485. "adcs r4, r4, r6\n\t"
  64486. #elif defined(__clang__)
  64487. "adcs r4, r6\n\t"
  64488. #else
  64489. "adc r4, r6\n\t"
  64490. #endif
  64491. #ifdef WOLFSSL_KEIL
  64492. "adcs r2, r2, %[r]\n\t"
  64493. #elif defined(__clang__)
  64494. "adcs r2, %[r]\n\t"
  64495. #else
  64496. "adc r2, %[r]\n\t"
  64497. #endif
  64498. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64499. "adds r3, r3, r5\n\t"
  64500. #else
  64501. "add r3, r3, r5\n\t"
  64502. #endif
  64503. #ifdef WOLFSSL_KEIL
  64504. "adcs r4, r4, r6\n\t"
  64505. #elif defined(__clang__)
  64506. "adcs r4, r6\n\t"
  64507. #else
  64508. "adc r4, r6\n\t"
  64509. #endif
  64510. #ifdef WOLFSSL_KEIL
  64511. "adcs r2, r2, %[r]\n\t"
  64512. #elif defined(__clang__)
  64513. "adcs r2, %[r]\n\t"
  64514. #else
  64515. "adc r2, %[r]\n\t"
  64516. #endif
  64517. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64518. "lsrs r5, %[a], #16\n\t"
  64519. #else
  64520. "lsr r5, %[a], #16\n\t"
  64521. #endif
  64522. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64523. "lsrs r6, r7, #16\n\t"
  64524. #else
  64525. "lsr r6, r7, #16\n\t"
  64526. #endif
  64527. #ifdef WOLFSSL_KEIL
  64528. "muls r6, r5, r6\n\t"
  64529. #elif defined(__clang__)
  64530. "muls r6, r5\n\t"
  64531. #else
  64532. "mul r6, r5\n\t"
  64533. #endif
  64534. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64535. "adds r4, r4, r6\n\t"
  64536. #else
  64537. "add r4, r4, r6\n\t"
  64538. #endif
  64539. #ifdef WOLFSSL_KEIL
  64540. "adcs r2, r2, %[r]\n\t"
  64541. #elif defined(__clang__)
  64542. "adcs r2, %[r]\n\t"
  64543. #else
  64544. "adc r2, %[r]\n\t"
  64545. #endif
  64546. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64547. "adds r4, r4, r6\n\t"
  64548. #else
  64549. "add r4, r4, r6\n\t"
  64550. #endif
  64551. #ifdef WOLFSSL_KEIL
  64552. "adcs r2, r2, %[r]\n\t"
  64553. #elif defined(__clang__)
  64554. "adcs r2, %[r]\n\t"
  64555. #else
  64556. "adc r2, %[r]\n\t"
  64557. #endif
  64558. "uxth r6, r7\n\t"
  64559. #ifdef WOLFSSL_KEIL
  64560. "muls r5, r6, r5\n\t"
  64561. #elif defined(__clang__)
  64562. "muls r5, r6\n\t"
  64563. #else
  64564. "mul r5, r6\n\t"
  64565. #endif
  64566. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64567. "lsrs r6, r5, #16\n\t"
  64568. #else
  64569. "lsr r6, r5, #16\n\t"
  64570. #endif
  64571. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64572. "lsls r5, r5, #16\n\t"
  64573. #else
  64574. "lsl r5, r5, #16\n\t"
  64575. #endif
  64576. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64577. "adds r3, r3, r5\n\t"
  64578. #else
  64579. "add r3, r3, r5\n\t"
  64580. #endif
  64581. #ifdef WOLFSSL_KEIL
  64582. "adcs r4, r4, r6\n\t"
  64583. #elif defined(__clang__)
  64584. "adcs r4, r6\n\t"
  64585. #else
  64586. "adc r4, r6\n\t"
  64587. #endif
  64588. #ifdef WOLFSSL_KEIL
  64589. "adcs r2, r2, %[r]\n\t"
  64590. #elif defined(__clang__)
  64591. "adcs r2, %[r]\n\t"
  64592. #else
  64593. "adc r2, %[r]\n\t"
  64594. #endif
  64595. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64596. "adds r3, r3, r5\n\t"
  64597. #else
  64598. "add r3, r3, r5\n\t"
  64599. #endif
  64600. #ifdef WOLFSSL_KEIL
  64601. "adcs r4, r4, r6\n\t"
  64602. #elif defined(__clang__)
  64603. "adcs r4, r6\n\t"
  64604. #else
  64605. "adc r4, r6\n\t"
  64606. #endif
  64607. #ifdef WOLFSSL_KEIL
  64608. "adcs r2, r2, %[r]\n\t"
  64609. #elif defined(__clang__)
  64610. "adcs r2, %[r]\n\t"
  64611. #else
  64612. "adc r2, %[r]\n\t"
  64613. #endif
  64614. "# A[9] * A[4]\n\t"
  64615. "mov %[a], r9\n\t"
  64616. "ldr r7, [%[a], #16]\n\t"
  64617. "mov %[a], r11\n\t"
  64618. "uxth r5, %[a]\n\t"
  64619. "uxth r6, r7\n\t"
  64620. #ifdef WOLFSSL_KEIL
  64621. "muls r6, r5, r6\n\t"
  64622. #elif defined(__clang__)
  64623. "muls r6, r5\n\t"
  64624. #else
  64625. "mul r6, r5\n\t"
  64626. #endif
  64627. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64628. "adds r3, r3, r6\n\t"
  64629. #else
  64630. "add r3, r3, r6\n\t"
  64631. #endif
  64632. #ifdef WOLFSSL_KEIL
  64633. "adcs r4, r4, %[r]\n\t"
  64634. #elif defined(__clang__)
  64635. "adcs r4, %[r]\n\t"
  64636. #else
  64637. "adc r4, %[r]\n\t"
  64638. #endif
  64639. #ifdef WOLFSSL_KEIL
  64640. "adcs r2, r2, %[r]\n\t"
  64641. #elif defined(__clang__)
  64642. "adcs r2, %[r]\n\t"
  64643. #else
  64644. "adc r2, %[r]\n\t"
  64645. #endif
  64646. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64647. "adds r3, r3, r6\n\t"
  64648. #else
  64649. "add r3, r3, r6\n\t"
  64650. #endif
  64651. #ifdef WOLFSSL_KEIL
  64652. "adcs r4, r4, %[r]\n\t"
  64653. #elif defined(__clang__)
  64654. "adcs r4, %[r]\n\t"
  64655. #else
  64656. "adc r4, %[r]\n\t"
  64657. #endif
  64658. #ifdef WOLFSSL_KEIL
  64659. "adcs r2, r2, %[r]\n\t"
  64660. #elif defined(__clang__)
  64661. "adcs r2, %[r]\n\t"
  64662. #else
  64663. "adc r2, %[r]\n\t"
  64664. #endif
  64665. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64666. "lsrs r6, r7, #16\n\t"
  64667. #else
  64668. "lsr r6, r7, #16\n\t"
  64669. #endif
  64670. #ifdef WOLFSSL_KEIL
  64671. "muls r5, r6, r5\n\t"
  64672. #elif defined(__clang__)
  64673. "muls r5, r6\n\t"
  64674. #else
  64675. "mul r5, r6\n\t"
  64676. #endif
  64677. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64678. "lsrs r6, r5, #16\n\t"
  64679. #else
  64680. "lsr r6, r5, #16\n\t"
  64681. #endif
  64682. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64683. "lsls r5, r5, #16\n\t"
  64684. #else
  64685. "lsl r5, r5, #16\n\t"
  64686. #endif
  64687. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64688. "adds r3, r3, r5\n\t"
  64689. #else
  64690. "add r3, r3, r5\n\t"
  64691. #endif
  64692. #ifdef WOLFSSL_KEIL
  64693. "adcs r4, r4, r6\n\t"
  64694. #elif defined(__clang__)
  64695. "adcs r4, r6\n\t"
  64696. #else
  64697. "adc r4, r6\n\t"
  64698. #endif
  64699. #ifdef WOLFSSL_KEIL
  64700. "adcs r2, r2, %[r]\n\t"
  64701. #elif defined(__clang__)
  64702. "adcs r2, %[r]\n\t"
  64703. #else
  64704. "adc r2, %[r]\n\t"
  64705. #endif
  64706. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64707. "adds r3, r3, r5\n\t"
  64708. #else
  64709. "add r3, r3, r5\n\t"
  64710. #endif
  64711. #ifdef WOLFSSL_KEIL
  64712. "adcs r4, r4, r6\n\t"
  64713. #elif defined(__clang__)
  64714. "adcs r4, r6\n\t"
  64715. #else
  64716. "adc r4, r6\n\t"
  64717. #endif
  64718. #ifdef WOLFSSL_KEIL
  64719. "adcs r2, r2, %[r]\n\t"
  64720. #elif defined(__clang__)
  64721. "adcs r2, %[r]\n\t"
  64722. #else
  64723. "adc r2, %[r]\n\t"
  64724. #endif
  64725. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64726. "lsrs r5, %[a], #16\n\t"
  64727. #else
  64728. "lsr r5, %[a], #16\n\t"
  64729. #endif
  64730. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64731. "lsrs r6, r7, #16\n\t"
  64732. #else
  64733. "lsr r6, r7, #16\n\t"
  64734. #endif
  64735. #ifdef WOLFSSL_KEIL
  64736. "muls r6, r5, r6\n\t"
  64737. #elif defined(__clang__)
  64738. "muls r6, r5\n\t"
  64739. #else
  64740. "mul r6, r5\n\t"
  64741. #endif
  64742. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64743. "adds r4, r4, r6\n\t"
  64744. #else
  64745. "add r4, r4, r6\n\t"
  64746. #endif
  64747. #ifdef WOLFSSL_KEIL
  64748. "adcs r2, r2, %[r]\n\t"
  64749. #elif defined(__clang__)
  64750. "adcs r2, %[r]\n\t"
  64751. #else
  64752. "adc r2, %[r]\n\t"
  64753. #endif
  64754. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64755. "adds r4, r4, r6\n\t"
  64756. #else
  64757. "add r4, r4, r6\n\t"
  64758. #endif
  64759. #ifdef WOLFSSL_KEIL
  64760. "adcs r2, r2, %[r]\n\t"
  64761. #elif defined(__clang__)
  64762. "adcs r2, %[r]\n\t"
  64763. #else
  64764. "adc r2, %[r]\n\t"
  64765. #endif
  64766. "uxth r6, r7\n\t"
  64767. #ifdef WOLFSSL_KEIL
  64768. "muls r5, r6, r5\n\t"
  64769. #elif defined(__clang__)
  64770. "muls r5, r6\n\t"
  64771. #else
  64772. "mul r5, r6\n\t"
  64773. #endif
  64774. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64775. "lsrs r6, r5, #16\n\t"
  64776. #else
  64777. "lsr r6, r5, #16\n\t"
  64778. #endif
  64779. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64780. "lsls r5, r5, #16\n\t"
  64781. #else
  64782. "lsl r5, r5, #16\n\t"
  64783. #endif
  64784. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64785. "adds r3, r3, r5\n\t"
  64786. #else
  64787. "add r3, r3, r5\n\t"
  64788. #endif
  64789. #ifdef WOLFSSL_KEIL
  64790. "adcs r4, r4, r6\n\t"
  64791. #elif defined(__clang__)
  64792. "adcs r4, r6\n\t"
  64793. #else
  64794. "adc r4, r6\n\t"
  64795. #endif
  64796. #ifdef WOLFSSL_KEIL
  64797. "adcs r2, r2, %[r]\n\t"
  64798. #elif defined(__clang__)
  64799. "adcs r2, %[r]\n\t"
  64800. #else
  64801. "adc r2, %[r]\n\t"
  64802. #endif
  64803. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64804. "adds r3, r3, r5\n\t"
  64805. #else
  64806. "add r3, r3, r5\n\t"
  64807. #endif
  64808. #ifdef WOLFSSL_KEIL
  64809. "adcs r4, r4, r6\n\t"
  64810. #elif defined(__clang__)
  64811. "adcs r4, r6\n\t"
  64812. #else
  64813. "adc r4, r6\n\t"
  64814. #endif
  64815. #ifdef WOLFSSL_KEIL
  64816. "adcs r2, r2, %[r]\n\t"
  64817. #elif defined(__clang__)
  64818. "adcs r2, %[r]\n\t"
  64819. #else
  64820. "adc r2, %[r]\n\t"
  64821. #endif
  64822. "# A[10] * A[3]\n\t"
  64823. "mov %[a], r9\n\t"
  64824. "ldr r7, [%[a], #12]\n\t"
  64825. "mov %[a], r12\n\t"
  64826. "uxth r5, %[a]\n\t"
  64827. "uxth r6, r7\n\t"
  64828. #ifdef WOLFSSL_KEIL
  64829. "muls r6, r5, r6\n\t"
  64830. #elif defined(__clang__)
  64831. "muls r6, r5\n\t"
  64832. #else
  64833. "mul r6, r5\n\t"
  64834. #endif
  64835. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64836. "adds r3, r3, r6\n\t"
  64837. #else
  64838. "add r3, r3, r6\n\t"
  64839. #endif
  64840. #ifdef WOLFSSL_KEIL
  64841. "adcs r4, r4, %[r]\n\t"
  64842. #elif defined(__clang__)
  64843. "adcs r4, %[r]\n\t"
  64844. #else
  64845. "adc r4, %[r]\n\t"
  64846. #endif
  64847. #ifdef WOLFSSL_KEIL
  64848. "adcs r2, r2, %[r]\n\t"
  64849. #elif defined(__clang__)
  64850. "adcs r2, %[r]\n\t"
  64851. #else
  64852. "adc r2, %[r]\n\t"
  64853. #endif
  64854. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64855. "adds r3, r3, r6\n\t"
  64856. #else
  64857. "add r3, r3, r6\n\t"
  64858. #endif
  64859. #ifdef WOLFSSL_KEIL
  64860. "adcs r4, r4, %[r]\n\t"
  64861. #elif defined(__clang__)
  64862. "adcs r4, %[r]\n\t"
  64863. #else
  64864. "adc r4, %[r]\n\t"
  64865. #endif
  64866. #ifdef WOLFSSL_KEIL
  64867. "adcs r2, r2, %[r]\n\t"
  64868. #elif defined(__clang__)
  64869. "adcs r2, %[r]\n\t"
  64870. #else
  64871. "adc r2, %[r]\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 r5, r6, r5\n\t"
  64880. #elif defined(__clang__)
  64881. "muls r5, r6\n\t"
  64882. #else
  64883. "mul r5, r6\n\t"
  64884. #endif
  64885. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64886. "lsrs r6, r5, #16\n\t"
  64887. #else
  64888. "lsr r6, r5, #16\n\t"
  64889. #endif
  64890. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64891. "lsls r5, r5, #16\n\t"
  64892. #else
  64893. "lsl r5, r5, #16\n\t"
  64894. #endif
  64895. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64896. "adds r3, r3, r5\n\t"
  64897. #else
  64898. "add r3, r3, r5\n\t"
  64899. #endif
  64900. #ifdef WOLFSSL_KEIL
  64901. "adcs r4, r4, r6\n\t"
  64902. #elif defined(__clang__)
  64903. "adcs r4, r6\n\t"
  64904. #else
  64905. "adc r4, r6\n\t"
  64906. #endif
  64907. #ifdef WOLFSSL_KEIL
  64908. "adcs r2, r2, %[r]\n\t"
  64909. #elif defined(__clang__)
  64910. "adcs r2, %[r]\n\t"
  64911. #else
  64912. "adc r2, %[r]\n\t"
  64913. #endif
  64914. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64915. "adds r3, r3, r5\n\t"
  64916. #else
  64917. "add r3, r3, r5\n\t"
  64918. #endif
  64919. #ifdef WOLFSSL_KEIL
  64920. "adcs r4, r4, r6\n\t"
  64921. #elif defined(__clang__)
  64922. "adcs r4, r6\n\t"
  64923. #else
  64924. "adc r4, r6\n\t"
  64925. #endif
  64926. #ifdef WOLFSSL_KEIL
  64927. "adcs r2, r2, %[r]\n\t"
  64928. #elif defined(__clang__)
  64929. "adcs r2, %[r]\n\t"
  64930. #else
  64931. "adc r2, %[r]\n\t"
  64932. #endif
  64933. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64934. "lsrs r5, %[a], #16\n\t"
  64935. #else
  64936. "lsr r5, %[a], #16\n\t"
  64937. #endif
  64938. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64939. "lsrs r6, r7, #16\n\t"
  64940. #else
  64941. "lsr r6, r7, #16\n\t"
  64942. #endif
  64943. #ifdef WOLFSSL_KEIL
  64944. "muls r6, r5, r6\n\t"
  64945. #elif defined(__clang__)
  64946. "muls r6, r5\n\t"
  64947. #else
  64948. "mul r6, r5\n\t"
  64949. #endif
  64950. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64951. "adds r4, r4, r6\n\t"
  64952. #else
  64953. "add r4, r4, r6\n\t"
  64954. #endif
  64955. #ifdef WOLFSSL_KEIL
  64956. "adcs r2, r2, %[r]\n\t"
  64957. #elif defined(__clang__)
  64958. "adcs r2, %[r]\n\t"
  64959. #else
  64960. "adc r2, %[r]\n\t"
  64961. #endif
  64962. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64963. "adds r4, r4, r6\n\t"
  64964. #else
  64965. "add r4, r4, r6\n\t"
  64966. #endif
  64967. #ifdef WOLFSSL_KEIL
  64968. "adcs r2, r2, %[r]\n\t"
  64969. #elif defined(__clang__)
  64970. "adcs r2, %[r]\n\t"
  64971. #else
  64972. "adc r2, %[r]\n\t"
  64973. #endif
  64974. "uxth r6, r7\n\t"
  64975. #ifdef WOLFSSL_KEIL
  64976. "muls r5, r6, r5\n\t"
  64977. #elif defined(__clang__)
  64978. "muls r5, r6\n\t"
  64979. #else
  64980. "mul r5, r6\n\t"
  64981. #endif
  64982. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64983. "lsrs r6, r5, #16\n\t"
  64984. #else
  64985. "lsr r6, r5, #16\n\t"
  64986. #endif
  64987. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64988. "lsls r5, r5, #16\n\t"
  64989. #else
  64990. "lsl r5, r5, #16\n\t"
  64991. #endif
  64992. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64993. "adds r3, r3, r5\n\t"
  64994. #else
  64995. "add r3, r3, r5\n\t"
  64996. #endif
  64997. #ifdef WOLFSSL_KEIL
  64998. "adcs r4, r4, r6\n\t"
  64999. #elif defined(__clang__)
  65000. "adcs r4, r6\n\t"
  65001. #else
  65002. "adc r4, r6\n\t"
  65003. #endif
  65004. #ifdef WOLFSSL_KEIL
  65005. "adcs r2, r2, %[r]\n\t"
  65006. #elif defined(__clang__)
  65007. "adcs r2, %[r]\n\t"
  65008. #else
  65009. "adc r2, %[r]\n\t"
  65010. #endif
  65011. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65012. "adds r3, r3, r5\n\t"
  65013. #else
  65014. "add r3, r3, r5\n\t"
  65015. #endif
  65016. #ifdef WOLFSSL_KEIL
  65017. "adcs r4, r4, r6\n\t"
  65018. #elif defined(__clang__)
  65019. "adcs r4, r6\n\t"
  65020. #else
  65021. "adc r4, r6\n\t"
  65022. #endif
  65023. #ifdef WOLFSSL_KEIL
  65024. "adcs r2, r2, %[r]\n\t"
  65025. #elif defined(__clang__)
  65026. "adcs r2, %[r]\n\t"
  65027. #else
  65028. "adc r2, %[r]\n\t"
  65029. #endif
  65030. "# A[11] * A[2]\n\t"
  65031. "mov %[a], r9\n\t"
  65032. "ldr r7, [%[a], #8]\n\t"
  65033. "mov %[a], lr\n\t"
  65034. "uxth r5, %[a]\n\t"
  65035. "uxth r6, r7\n\t"
  65036. #ifdef WOLFSSL_KEIL
  65037. "muls r6, r5, r6\n\t"
  65038. #elif defined(__clang__)
  65039. "muls r6, r5\n\t"
  65040. #else
  65041. "mul r6, r5\n\t"
  65042. #endif
  65043. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65044. "adds r3, r3, r6\n\t"
  65045. #else
  65046. "add r3, r3, r6\n\t"
  65047. #endif
  65048. #ifdef WOLFSSL_KEIL
  65049. "adcs r4, r4, %[r]\n\t"
  65050. #elif defined(__clang__)
  65051. "adcs r4, %[r]\n\t"
  65052. #else
  65053. "adc r4, %[r]\n\t"
  65054. #endif
  65055. #ifdef WOLFSSL_KEIL
  65056. "adcs r2, r2, %[r]\n\t"
  65057. #elif defined(__clang__)
  65058. "adcs r2, %[r]\n\t"
  65059. #else
  65060. "adc r2, %[r]\n\t"
  65061. #endif
  65062. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65063. "adds r3, r3, r6\n\t"
  65064. #else
  65065. "add r3, r3, r6\n\t"
  65066. #endif
  65067. #ifdef WOLFSSL_KEIL
  65068. "adcs r4, r4, %[r]\n\t"
  65069. #elif defined(__clang__)
  65070. "adcs r4, %[r]\n\t"
  65071. #else
  65072. "adc r4, %[r]\n\t"
  65073. #endif
  65074. #ifdef WOLFSSL_KEIL
  65075. "adcs r2, r2, %[r]\n\t"
  65076. #elif defined(__clang__)
  65077. "adcs r2, %[r]\n\t"
  65078. #else
  65079. "adc r2, %[r]\n\t"
  65080. #endif
  65081. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65082. "lsrs r6, r7, #16\n\t"
  65083. #else
  65084. "lsr r6, r7, #16\n\t"
  65085. #endif
  65086. #ifdef WOLFSSL_KEIL
  65087. "muls r5, r6, r5\n\t"
  65088. #elif defined(__clang__)
  65089. "muls r5, r6\n\t"
  65090. #else
  65091. "mul r5, r6\n\t"
  65092. #endif
  65093. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65094. "lsrs r6, r5, #16\n\t"
  65095. #else
  65096. "lsr r6, r5, #16\n\t"
  65097. #endif
  65098. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65099. "lsls r5, r5, #16\n\t"
  65100. #else
  65101. "lsl r5, r5, #16\n\t"
  65102. #endif
  65103. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65104. "adds r3, r3, r5\n\t"
  65105. #else
  65106. "add r3, r3, r5\n\t"
  65107. #endif
  65108. #ifdef WOLFSSL_KEIL
  65109. "adcs r4, r4, r6\n\t"
  65110. #elif defined(__clang__)
  65111. "adcs r4, r6\n\t"
  65112. #else
  65113. "adc r4, r6\n\t"
  65114. #endif
  65115. #ifdef WOLFSSL_KEIL
  65116. "adcs r2, r2, %[r]\n\t"
  65117. #elif defined(__clang__)
  65118. "adcs r2, %[r]\n\t"
  65119. #else
  65120. "adc r2, %[r]\n\t"
  65121. #endif
  65122. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65123. "adds r3, r3, r5\n\t"
  65124. #else
  65125. "add r3, r3, r5\n\t"
  65126. #endif
  65127. #ifdef WOLFSSL_KEIL
  65128. "adcs r4, r4, r6\n\t"
  65129. #elif defined(__clang__)
  65130. "adcs r4, r6\n\t"
  65131. #else
  65132. "adc r4, r6\n\t"
  65133. #endif
  65134. #ifdef WOLFSSL_KEIL
  65135. "adcs r2, r2, %[r]\n\t"
  65136. #elif defined(__clang__)
  65137. "adcs r2, %[r]\n\t"
  65138. #else
  65139. "adc r2, %[r]\n\t"
  65140. #endif
  65141. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65142. "lsrs r5, %[a], #16\n\t"
  65143. #else
  65144. "lsr r5, %[a], #16\n\t"
  65145. #endif
  65146. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65147. "lsrs r6, r7, #16\n\t"
  65148. #else
  65149. "lsr r6, r7, #16\n\t"
  65150. #endif
  65151. #ifdef WOLFSSL_KEIL
  65152. "muls r6, r5, r6\n\t"
  65153. #elif defined(__clang__)
  65154. "muls r6, r5\n\t"
  65155. #else
  65156. "mul r6, r5\n\t"
  65157. #endif
  65158. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65159. "adds r4, r4, r6\n\t"
  65160. #else
  65161. "add r4, r4, r6\n\t"
  65162. #endif
  65163. #ifdef WOLFSSL_KEIL
  65164. "adcs r2, r2, %[r]\n\t"
  65165. #elif defined(__clang__)
  65166. "adcs r2, %[r]\n\t"
  65167. #else
  65168. "adc r2, %[r]\n\t"
  65169. #endif
  65170. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65171. "adds r4, r4, r6\n\t"
  65172. #else
  65173. "add r4, r4, r6\n\t"
  65174. #endif
  65175. #ifdef WOLFSSL_KEIL
  65176. "adcs r2, r2, %[r]\n\t"
  65177. #elif defined(__clang__)
  65178. "adcs r2, %[r]\n\t"
  65179. #else
  65180. "adc r2, %[r]\n\t"
  65181. #endif
  65182. "uxth r6, r7\n\t"
  65183. #ifdef WOLFSSL_KEIL
  65184. "muls r5, r6, r5\n\t"
  65185. #elif defined(__clang__)
  65186. "muls r5, r6\n\t"
  65187. #else
  65188. "mul r5, r6\n\t"
  65189. #endif
  65190. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65191. "lsrs r6, r5, #16\n\t"
  65192. #else
  65193. "lsr r6, r5, #16\n\t"
  65194. #endif
  65195. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65196. "lsls r5, r5, #16\n\t"
  65197. #else
  65198. "lsl r5, r5, #16\n\t"
  65199. #endif
  65200. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65201. "adds r3, r3, r5\n\t"
  65202. #else
  65203. "add r3, r3, r5\n\t"
  65204. #endif
  65205. #ifdef WOLFSSL_KEIL
  65206. "adcs r4, r4, r6\n\t"
  65207. #elif defined(__clang__)
  65208. "adcs r4, r6\n\t"
  65209. #else
  65210. "adc r4, r6\n\t"
  65211. #endif
  65212. #ifdef WOLFSSL_KEIL
  65213. "adcs r2, r2, %[r]\n\t"
  65214. #elif defined(__clang__)
  65215. "adcs r2, %[r]\n\t"
  65216. #else
  65217. "adc r2, %[r]\n\t"
  65218. #endif
  65219. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65220. "adds r3, r3, r5\n\t"
  65221. #else
  65222. "add r3, r3, r5\n\t"
  65223. #endif
  65224. #ifdef WOLFSSL_KEIL
  65225. "adcs r4, r4, r6\n\t"
  65226. #elif defined(__clang__)
  65227. "adcs r4, r6\n\t"
  65228. #else
  65229. "adc r4, r6\n\t"
  65230. #endif
  65231. #ifdef WOLFSSL_KEIL
  65232. "adcs r2, r2, %[r]\n\t"
  65233. #elif defined(__clang__)
  65234. "adcs r2, %[r]\n\t"
  65235. #else
  65236. "adc r2, %[r]\n\t"
  65237. #endif
  65238. "mov %[r], r8\n\t"
  65239. "str r3, [%[r], #52]\n\t"
  65240. "movs %[r], #0\n\t"
  65241. "# A[11] * A[3]\n\t"
  65242. "movs r3, #0\n\t"
  65243. "mov %[a], r9\n\t"
  65244. "ldr r7, [%[a], #12]\n\t"
  65245. "mov %[a], lr\n\t"
  65246. "uxth r5, %[a]\n\t"
  65247. "uxth r6, r7\n\t"
  65248. #ifdef WOLFSSL_KEIL
  65249. "muls r6, r5, r6\n\t"
  65250. #elif defined(__clang__)
  65251. "muls r6, r5\n\t"
  65252. #else
  65253. "mul r6, r5\n\t"
  65254. #endif
  65255. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65256. "adds r4, r4, r6\n\t"
  65257. #else
  65258. "add r4, r4, r6\n\t"
  65259. #endif
  65260. #ifdef WOLFSSL_KEIL
  65261. "adcs r2, r2, %[r]\n\t"
  65262. #elif defined(__clang__)
  65263. "adcs r2, %[r]\n\t"
  65264. #else
  65265. "adc r2, %[r]\n\t"
  65266. #endif
  65267. #ifdef WOLFSSL_KEIL
  65268. "adcs r3, r3, %[r]\n\t"
  65269. #elif defined(__clang__)
  65270. "adcs r3, %[r]\n\t"
  65271. #else
  65272. "adc r3, %[r]\n\t"
  65273. #endif
  65274. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65275. "adds r4, r4, r6\n\t"
  65276. #else
  65277. "add r4, r4, r6\n\t"
  65278. #endif
  65279. #ifdef WOLFSSL_KEIL
  65280. "adcs r2, r2, %[r]\n\t"
  65281. #elif defined(__clang__)
  65282. "adcs r2, %[r]\n\t"
  65283. #else
  65284. "adc r2, %[r]\n\t"
  65285. #endif
  65286. #ifdef WOLFSSL_KEIL
  65287. "adcs r3, r3, %[r]\n\t"
  65288. #elif defined(__clang__)
  65289. "adcs r3, %[r]\n\t"
  65290. #else
  65291. "adc r3, %[r]\n\t"
  65292. #endif
  65293. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65294. "lsrs r6, r7, #16\n\t"
  65295. #else
  65296. "lsr r6, r7, #16\n\t"
  65297. #endif
  65298. #ifdef WOLFSSL_KEIL
  65299. "muls r5, r6, r5\n\t"
  65300. #elif defined(__clang__)
  65301. "muls r5, r6\n\t"
  65302. #else
  65303. "mul r5, r6\n\t"
  65304. #endif
  65305. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65306. "lsrs r6, r5, #16\n\t"
  65307. #else
  65308. "lsr r6, r5, #16\n\t"
  65309. #endif
  65310. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65311. "lsls r5, r5, #16\n\t"
  65312. #else
  65313. "lsl r5, r5, #16\n\t"
  65314. #endif
  65315. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65316. "adds r4, r4, r5\n\t"
  65317. #else
  65318. "add r4, r4, r5\n\t"
  65319. #endif
  65320. #ifdef WOLFSSL_KEIL
  65321. "adcs r2, r2, r6\n\t"
  65322. #elif defined(__clang__)
  65323. "adcs r2, r6\n\t"
  65324. #else
  65325. "adc r2, r6\n\t"
  65326. #endif
  65327. #ifdef WOLFSSL_KEIL
  65328. "adcs r3, r3, %[r]\n\t"
  65329. #elif defined(__clang__)
  65330. "adcs r3, %[r]\n\t"
  65331. #else
  65332. "adc r3, %[r]\n\t"
  65333. #endif
  65334. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65335. "adds r4, r4, r5\n\t"
  65336. #else
  65337. "add r4, r4, r5\n\t"
  65338. #endif
  65339. #ifdef WOLFSSL_KEIL
  65340. "adcs r2, r2, r6\n\t"
  65341. #elif defined(__clang__)
  65342. "adcs r2, r6\n\t"
  65343. #else
  65344. "adc r2, r6\n\t"
  65345. #endif
  65346. #ifdef WOLFSSL_KEIL
  65347. "adcs r3, r3, %[r]\n\t"
  65348. #elif defined(__clang__)
  65349. "adcs r3, %[r]\n\t"
  65350. #else
  65351. "adc r3, %[r]\n\t"
  65352. #endif
  65353. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65354. "lsrs r5, %[a], #16\n\t"
  65355. #else
  65356. "lsr r5, %[a], #16\n\t"
  65357. #endif
  65358. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65359. "lsrs r6, r7, #16\n\t"
  65360. #else
  65361. "lsr r6, r7, #16\n\t"
  65362. #endif
  65363. #ifdef WOLFSSL_KEIL
  65364. "muls r6, r5, r6\n\t"
  65365. #elif defined(__clang__)
  65366. "muls r6, r5\n\t"
  65367. #else
  65368. "mul r6, r5\n\t"
  65369. #endif
  65370. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65371. "adds r2, r2, r6\n\t"
  65372. #else
  65373. "add r2, r2, r6\n\t"
  65374. #endif
  65375. #ifdef WOLFSSL_KEIL
  65376. "adcs r3, r3, %[r]\n\t"
  65377. #elif defined(__clang__)
  65378. "adcs r3, %[r]\n\t"
  65379. #else
  65380. "adc r3, %[r]\n\t"
  65381. #endif
  65382. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65383. "adds r2, r2, r6\n\t"
  65384. #else
  65385. "add r2, r2, r6\n\t"
  65386. #endif
  65387. #ifdef WOLFSSL_KEIL
  65388. "adcs r3, r3, %[r]\n\t"
  65389. #elif defined(__clang__)
  65390. "adcs r3, %[r]\n\t"
  65391. #else
  65392. "adc r3, %[r]\n\t"
  65393. #endif
  65394. "uxth r6, r7\n\t"
  65395. #ifdef WOLFSSL_KEIL
  65396. "muls r5, r6, r5\n\t"
  65397. #elif defined(__clang__)
  65398. "muls r5, r6\n\t"
  65399. #else
  65400. "mul r5, r6\n\t"
  65401. #endif
  65402. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65403. "lsrs r6, r5, #16\n\t"
  65404. #else
  65405. "lsr r6, r5, #16\n\t"
  65406. #endif
  65407. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65408. "lsls r5, r5, #16\n\t"
  65409. #else
  65410. "lsl r5, r5, #16\n\t"
  65411. #endif
  65412. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65413. "adds r4, r4, r5\n\t"
  65414. #else
  65415. "add r4, r4, r5\n\t"
  65416. #endif
  65417. #ifdef WOLFSSL_KEIL
  65418. "adcs r2, r2, r6\n\t"
  65419. #elif defined(__clang__)
  65420. "adcs r2, r6\n\t"
  65421. #else
  65422. "adc r2, r6\n\t"
  65423. #endif
  65424. #ifdef WOLFSSL_KEIL
  65425. "adcs r3, r3, %[r]\n\t"
  65426. #elif defined(__clang__)
  65427. "adcs r3, %[r]\n\t"
  65428. #else
  65429. "adc r3, %[r]\n\t"
  65430. #endif
  65431. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65432. "adds r4, r4, r5\n\t"
  65433. #else
  65434. "add r4, r4, r5\n\t"
  65435. #endif
  65436. #ifdef WOLFSSL_KEIL
  65437. "adcs r2, r2, r6\n\t"
  65438. #elif defined(__clang__)
  65439. "adcs r2, r6\n\t"
  65440. #else
  65441. "adc r2, r6\n\t"
  65442. #endif
  65443. #ifdef WOLFSSL_KEIL
  65444. "adcs r3, r3, %[r]\n\t"
  65445. #elif defined(__clang__)
  65446. "adcs r3, %[r]\n\t"
  65447. #else
  65448. "adc r3, %[r]\n\t"
  65449. #endif
  65450. "# A[10] * A[4]\n\t"
  65451. "mov %[a], r9\n\t"
  65452. "ldr r7, [%[a], #16]\n\t"
  65453. "mov %[a], r12\n\t"
  65454. "uxth r5, %[a]\n\t"
  65455. "uxth r6, r7\n\t"
  65456. #ifdef WOLFSSL_KEIL
  65457. "muls r6, r5, r6\n\t"
  65458. #elif defined(__clang__)
  65459. "muls r6, r5\n\t"
  65460. #else
  65461. "mul r6, r5\n\t"
  65462. #endif
  65463. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65464. "adds r4, r4, r6\n\t"
  65465. #else
  65466. "add r4, r4, r6\n\t"
  65467. #endif
  65468. #ifdef WOLFSSL_KEIL
  65469. "adcs r2, r2, %[r]\n\t"
  65470. #elif defined(__clang__)
  65471. "adcs r2, %[r]\n\t"
  65472. #else
  65473. "adc r2, %[r]\n\t"
  65474. #endif
  65475. #ifdef WOLFSSL_KEIL
  65476. "adcs r3, r3, %[r]\n\t"
  65477. #elif defined(__clang__)
  65478. "adcs r3, %[r]\n\t"
  65479. #else
  65480. "adc r3, %[r]\n\t"
  65481. #endif
  65482. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65483. "adds r4, r4, r6\n\t"
  65484. #else
  65485. "add r4, r4, r6\n\t"
  65486. #endif
  65487. #ifdef WOLFSSL_KEIL
  65488. "adcs r2, r2, %[r]\n\t"
  65489. #elif defined(__clang__)
  65490. "adcs r2, %[r]\n\t"
  65491. #else
  65492. "adc r2, %[r]\n\t"
  65493. #endif
  65494. #ifdef WOLFSSL_KEIL
  65495. "adcs r3, r3, %[r]\n\t"
  65496. #elif defined(__clang__)
  65497. "adcs r3, %[r]\n\t"
  65498. #else
  65499. "adc r3, %[r]\n\t"
  65500. #endif
  65501. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65502. "lsrs r6, r7, #16\n\t"
  65503. #else
  65504. "lsr r6, r7, #16\n\t"
  65505. #endif
  65506. #ifdef WOLFSSL_KEIL
  65507. "muls r5, r6, r5\n\t"
  65508. #elif defined(__clang__)
  65509. "muls r5, r6\n\t"
  65510. #else
  65511. "mul r5, r6\n\t"
  65512. #endif
  65513. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65514. "lsrs r6, r5, #16\n\t"
  65515. #else
  65516. "lsr r6, r5, #16\n\t"
  65517. #endif
  65518. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65519. "lsls r5, r5, #16\n\t"
  65520. #else
  65521. "lsl r5, r5, #16\n\t"
  65522. #endif
  65523. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65524. "adds r4, r4, r5\n\t"
  65525. #else
  65526. "add r4, r4, r5\n\t"
  65527. #endif
  65528. #ifdef WOLFSSL_KEIL
  65529. "adcs r2, r2, r6\n\t"
  65530. #elif defined(__clang__)
  65531. "adcs r2, r6\n\t"
  65532. #else
  65533. "adc r2, r6\n\t"
  65534. #endif
  65535. #ifdef WOLFSSL_KEIL
  65536. "adcs r3, r3, %[r]\n\t"
  65537. #elif defined(__clang__)
  65538. "adcs r3, %[r]\n\t"
  65539. #else
  65540. "adc r3, %[r]\n\t"
  65541. #endif
  65542. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65543. "adds r4, r4, r5\n\t"
  65544. #else
  65545. "add r4, r4, r5\n\t"
  65546. #endif
  65547. #ifdef WOLFSSL_KEIL
  65548. "adcs r2, r2, r6\n\t"
  65549. #elif defined(__clang__)
  65550. "adcs r2, r6\n\t"
  65551. #else
  65552. "adc r2, r6\n\t"
  65553. #endif
  65554. #ifdef WOLFSSL_KEIL
  65555. "adcs r3, r3, %[r]\n\t"
  65556. #elif defined(__clang__)
  65557. "adcs r3, %[r]\n\t"
  65558. #else
  65559. "adc r3, %[r]\n\t"
  65560. #endif
  65561. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65562. "lsrs r5, %[a], #16\n\t"
  65563. #else
  65564. "lsr r5, %[a], #16\n\t"
  65565. #endif
  65566. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65567. "lsrs r6, r7, #16\n\t"
  65568. #else
  65569. "lsr r6, r7, #16\n\t"
  65570. #endif
  65571. #ifdef WOLFSSL_KEIL
  65572. "muls r6, r5, r6\n\t"
  65573. #elif defined(__clang__)
  65574. "muls r6, r5\n\t"
  65575. #else
  65576. "mul r6, r5\n\t"
  65577. #endif
  65578. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65579. "adds r2, r2, r6\n\t"
  65580. #else
  65581. "add r2, r2, r6\n\t"
  65582. #endif
  65583. #ifdef WOLFSSL_KEIL
  65584. "adcs r3, r3, %[r]\n\t"
  65585. #elif defined(__clang__)
  65586. "adcs r3, %[r]\n\t"
  65587. #else
  65588. "adc r3, %[r]\n\t"
  65589. #endif
  65590. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65591. "adds r2, r2, r6\n\t"
  65592. #else
  65593. "add r2, r2, r6\n\t"
  65594. #endif
  65595. #ifdef WOLFSSL_KEIL
  65596. "adcs r3, r3, %[r]\n\t"
  65597. #elif defined(__clang__)
  65598. "adcs r3, %[r]\n\t"
  65599. #else
  65600. "adc r3, %[r]\n\t"
  65601. #endif
  65602. "uxth r6, r7\n\t"
  65603. #ifdef WOLFSSL_KEIL
  65604. "muls r5, r6, r5\n\t"
  65605. #elif defined(__clang__)
  65606. "muls r5, r6\n\t"
  65607. #else
  65608. "mul r5, r6\n\t"
  65609. #endif
  65610. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65611. "lsrs r6, r5, #16\n\t"
  65612. #else
  65613. "lsr r6, r5, #16\n\t"
  65614. #endif
  65615. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65616. "lsls r5, r5, #16\n\t"
  65617. #else
  65618. "lsl r5, r5, #16\n\t"
  65619. #endif
  65620. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65621. "adds r4, r4, r5\n\t"
  65622. #else
  65623. "add r4, r4, r5\n\t"
  65624. #endif
  65625. #ifdef WOLFSSL_KEIL
  65626. "adcs r2, r2, r6\n\t"
  65627. #elif defined(__clang__)
  65628. "adcs r2, r6\n\t"
  65629. #else
  65630. "adc r2, r6\n\t"
  65631. #endif
  65632. #ifdef WOLFSSL_KEIL
  65633. "adcs r3, r3, %[r]\n\t"
  65634. #elif defined(__clang__)
  65635. "adcs r3, %[r]\n\t"
  65636. #else
  65637. "adc r3, %[r]\n\t"
  65638. #endif
  65639. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65640. "adds r4, r4, r5\n\t"
  65641. #else
  65642. "add r4, r4, r5\n\t"
  65643. #endif
  65644. #ifdef WOLFSSL_KEIL
  65645. "adcs r2, r2, r6\n\t"
  65646. #elif defined(__clang__)
  65647. "adcs r2, r6\n\t"
  65648. #else
  65649. "adc r2, r6\n\t"
  65650. #endif
  65651. #ifdef WOLFSSL_KEIL
  65652. "adcs r3, r3, %[r]\n\t"
  65653. #elif defined(__clang__)
  65654. "adcs r3, %[r]\n\t"
  65655. #else
  65656. "adc r3, %[r]\n\t"
  65657. #endif
  65658. "# A[9] * A[5]\n\t"
  65659. "mov %[a], r9\n\t"
  65660. "ldr r7, [%[a], #20]\n\t"
  65661. "mov %[a], r11\n\t"
  65662. "uxth r5, %[a]\n\t"
  65663. "uxth r6, r7\n\t"
  65664. #ifdef WOLFSSL_KEIL
  65665. "muls r6, r5, r6\n\t"
  65666. #elif defined(__clang__)
  65667. "muls r6, r5\n\t"
  65668. #else
  65669. "mul r6, r5\n\t"
  65670. #endif
  65671. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65672. "adds r4, r4, r6\n\t"
  65673. #else
  65674. "add r4, r4, r6\n\t"
  65675. #endif
  65676. #ifdef WOLFSSL_KEIL
  65677. "adcs r2, r2, %[r]\n\t"
  65678. #elif defined(__clang__)
  65679. "adcs r2, %[r]\n\t"
  65680. #else
  65681. "adc r2, %[r]\n\t"
  65682. #endif
  65683. #ifdef WOLFSSL_KEIL
  65684. "adcs r3, r3, %[r]\n\t"
  65685. #elif defined(__clang__)
  65686. "adcs r3, %[r]\n\t"
  65687. #else
  65688. "adc r3, %[r]\n\t"
  65689. #endif
  65690. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65691. "adds r4, r4, r6\n\t"
  65692. #else
  65693. "add r4, r4, r6\n\t"
  65694. #endif
  65695. #ifdef WOLFSSL_KEIL
  65696. "adcs r2, r2, %[r]\n\t"
  65697. #elif defined(__clang__)
  65698. "adcs r2, %[r]\n\t"
  65699. #else
  65700. "adc r2, %[r]\n\t"
  65701. #endif
  65702. #ifdef WOLFSSL_KEIL
  65703. "adcs r3, r3, %[r]\n\t"
  65704. #elif defined(__clang__)
  65705. "adcs r3, %[r]\n\t"
  65706. #else
  65707. "adc r3, %[r]\n\t"
  65708. #endif
  65709. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65710. "lsrs r6, r7, #16\n\t"
  65711. #else
  65712. "lsr r6, r7, #16\n\t"
  65713. #endif
  65714. #ifdef WOLFSSL_KEIL
  65715. "muls r5, r6, r5\n\t"
  65716. #elif defined(__clang__)
  65717. "muls r5, r6\n\t"
  65718. #else
  65719. "mul r5, r6\n\t"
  65720. #endif
  65721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65722. "lsrs r6, r5, #16\n\t"
  65723. #else
  65724. "lsr r6, r5, #16\n\t"
  65725. #endif
  65726. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65727. "lsls r5, r5, #16\n\t"
  65728. #else
  65729. "lsl r5, r5, #16\n\t"
  65730. #endif
  65731. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65732. "adds r4, r4, r5\n\t"
  65733. #else
  65734. "add r4, r4, r5\n\t"
  65735. #endif
  65736. #ifdef WOLFSSL_KEIL
  65737. "adcs r2, r2, r6\n\t"
  65738. #elif defined(__clang__)
  65739. "adcs r2, r6\n\t"
  65740. #else
  65741. "adc r2, r6\n\t"
  65742. #endif
  65743. #ifdef WOLFSSL_KEIL
  65744. "adcs r3, r3, %[r]\n\t"
  65745. #elif defined(__clang__)
  65746. "adcs r3, %[r]\n\t"
  65747. #else
  65748. "adc r3, %[r]\n\t"
  65749. #endif
  65750. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65751. "adds r4, r4, r5\n\t"
  65752. #else
  65753. "add r4, r4, r5\n\t"
  65754. #endif
  65755. #ifdef WOLFSSL_KEIL
  65756. "adcs r2, r2, r6\n\t"
  65757. #elif defined(__clang__)
  65758. "adcs r2, r6\n\t"
  65759. #else
  65760. "adc r2, r6\n\t"
  65761. #endif
  65762. #ifdef WOLFSSL_KEIL
  65763. "adcs r3, r3, %[r]\n\t"
  65764. #elif defined(__clang__)
  65765. "adcs r3, %[r]\n\t"
  65766. #else
  65767. "adc r3, %[r]\n\t"
  65768. #endif
  65769. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65770. "lsrs r5, %[a], #16\n\t"
  65771. #else
  65772. "lsr r5, %[a], #16\n\t"
  65773. #endif
  65774. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65775. "lsrs r6, r7, #16\n\t"
  65776. #else
  65777. "lsr r6, r7, #16\n\t"
  65778. #endif
  65779. #ifdef WOLFSSL_KEIL
  65780. "muls r6, r5, r6\n\t"
  65781. #elif defined(__clang__)
  65782. "muls r6, r5\n\t"
  65783. #else
  65784. "mul r6, r5\n\t"
  65785. #endif
  65786. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65787. "adds r2, r2, r6\n\t"
  65788. #else
  65789. "add r2, r2, r6\n\t"
  65790. #endif
  65791. #ifdef WOLFSSL_KEIL
  65792. "adcs r3, r3, %[r]\n\t"
  65793. #elif defined(__clang__)
  65794. "adcs r3, %[r]\n\t"
  65795. #else
  65796. "adc r3, %[r]\n\t"
  65797. #endif
  65798. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65799. "adds r2, r2, r6\n\t"
  65800. #else
  65801. "add r2, r2, r6\n\t"
  65802. #endif
  65803. #ifdef WOLFSSL_KEIL
  65804. "adcs r3, r3, %[r]\n\t"
  65805. #elif defined(__clang__)
  65806. "adcs r3, %[r]\n\t"
  65807. #else
  65808. "adc r3, %[r]\n\t"
  65809. #endif
  65810. "uxth r6, r7\n\t"
  65811. #ifdef WOLFSSL_KEIL
  65812. "muls r5, r6, r5\n\t"
  65813. #elif defined(__clang__)
  65814. "muls r5, r6\n\t"
  65815. #else
  65816. "mul r5, r6\n\t"
  65817. #endif
  65818. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65819. "lsrs r6, r5, #16\n\t"
  65820. #else
  65821. "lsr r6, r5, #16\n\t"
  65822. #endif
  65823. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65824. "lsls r5, r5, #16\n\t"
  65825. #else
  65826. "lsl r5, r5, #16\n\t"
  65827. #endif
  65828. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65829. "adds r4, r4, r5\n\t"
  65830. #else
  65831. "add r4, r4, r5\n\t"
  65832. #endif
  65833. #ifdef WOLFSSL_KEIL
  65834. "adcs r2, r2, r6\n\t"
  65835. #elif defined(__clang__)
  65836. "adcs r2, r6\n\t"
  65837. #else
  65838. "adc r2, r6\n\t"
  65839. #endif
  65840. #ifdef WOLFSSL_KEIL
  65841. "adcs r3, r3, %[r]\n\t"
  65842. #elif defined(__clang__)
  65843. "adcs r3, %[r]\n\t"
  65844. #else
  65845. "adc r3, %[r]\n\t"
  65846. #endif
  65847. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65848. "adds r4, r4, r5\n\t"
  65849. #else
  65850. "add r4, r4, r5\n\t"
  65851. #endif
  65852. #ifdef WOLFSSL_KEIL
  65853. "adcs r2, r2, r6\n\t"
  65854. #elif defined(__clang__)
  65855. "adcs r2, r6\n\t"
  65856. #else
  65857. "adc r2, r6\n\t"
  65858. #endif
  65859. #ifdef WOLFSSL_KEIL
  65860. "adcs r3, r3, %[r]\n\t"
  65861. #elif defined(__clang__)
  65862. "adcs r3, %[r]\n\t"
  65863. #else
  65864. "adc r3, %[r]\n\t"
  65865. #endif
  65866. "# A[8] * A[6]\n\t"
  65867. "mov %[a], r9\n\t"
  65868. "ldr r7, [%[a], #24]\n\t"
  65869. "mov %[a], r10\n\t"
  65870. "uxth r5, %[a]\n\t"
  65871. "uxth r6, r7\n\t"
  65872. #ifdef WOLFSSL_KEIL
  65873. "muls r6, r5, r6\n\t"
  65874. #elif defined(__clang__)
  65875. "muls r6, r5\n\t"
  65876. #else
  65877. "mul r6, r5\n\t"
  65878. #endif
  65879. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65880. "adds r4, r4, r6\n\t"
  65881. #else
  65882. "add r4, r4, r6\n\t"
  65883. #endif
  65884. #ifdef WOLFSSL_KEIL
  65885. "adcs r2, r2, %[r]\n\t"
  65886. #elif defined(__clang__)
  65887. "adcs r2, %[r]\n\t"
  65888. #else
  65889. "adc r2, %[r]\n\t"
  65890. #endif
  65891. #ifdef WOLFSSL_KEIL
  65892. "adcs r3, r3, %[r]\n\t"
  65893. #elif defined(__clang__)
  65894. "adcs r3, %[r]\n\t"
  65895. #else
  65896. "adc r3, %[r]\n\t"
  65897. #endif
  65898. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65899. "adds r4, r4, r6\n\t"
  65900. #else
  65901. "add r4, r4, r6\n\t"
  65902. #endif
  65903. #ifdef WOLFSSL_KEIL
  65904. "adcs r2, r2, %[r]\n\t"
  65905. #elif defined(__clang__)
  65906. "adcs r2, %[r]\n\t"
  65907. #else
  65908. "adc r2, %[r]\n\t"
  65909. #endif
  65910. #ifdef WOLFSSL_KEIL
  65911. "adcs r3, r3, %[r]\n\t"
  65912. #elif defined(__clang__)
  65913. "adcs r3, %[r]\n\t"
  65914. #else
  65915. "adc r3, %[r]\n\t"
  65916. #endif
  65917. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65918. "lsrs r6, r7, #16\n\t"
  65919. #else
  65920. "lsr r6, r7, #16\n\t"
  65921. #endif
  65922. #ifdef WOLFSSL_KEIL
  65923. "muls r5, r6, r5\n\t"
  65924. #elif defined(__clang__)
  65925. "muls r5, r6\n\t"
  65926. #else
  65927. "mul r5, r6\n\t"
  65928. #endif
  65929. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65930. "lsrs r6, r5, #16\n\t"
  65931. #else
  65932. "lsr r6, r5, #16\n\t"
  65933. #endif
  65934. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65935. "lsls r5, r5, #16\n\t"
  65936. #else
  65937. "lsl r5, r5, #16\n\t"
  65938. #endif
  65939. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65940. "adds r4, r4, r5\n\t"
  65941. #else
  65942. "add r4, r4, r5\n\t"
  65943. #endif
  65944. #ifdef WOLFSSL_KEIL
  65945. "adcs r2, r2, r6\n\t"
  65946. #elif defined(__clang__)
  65947. "adcs r2, r6\n\t"
  65948. #else
  65949. "adc r2, r6\n\t"
  65950. #endif
  65951. #ifdef WOLFSSL_KEIL
  65952. "adcs r3, r3, %[r]\n\t"
  65953. #elif defined(__clang__)
  65954. "adcs r3, %[r]\n\t"
  65955. #else
  65956. "adc r3, %[r]\n\t"
  65957. #endif
  65958. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65959. "adds r4, r4, r5\n\t"
  65960. #else
  65961. "add r4, r4, r5\n\t"
  65962. #endif
  65963. #ifdef WOLFSSL_KEIL
  65964. "adcs r2, r2, r6\n\t"
  65965. #elif defined(__clang__)
  65966. "adcs r2, r6\n\t"
  65967. #else
  65968. "adc r2, r6\n\t"
  65969. #endif
  65970. #ifdef WOLFSSL_KEIL
  65971. "adcs r3, r3, %[r]\n\t"
  65972. #elif defined(__clang__)
  65973. "adcs r3, %[r]\n\t"
  65974. #else
  65975. "adc r3, %[r]\n\t"
  65976. #endif
  65977. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65978. "lsrs r5, %[a], #16\n\t"
  65979. #else
  65980. "lsr r5, %[a], #16\n\t"
  65981. #endif
  65982. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65983. "lsrs r6, r7, #16\n\t"
  65984. #else
  65985. "lsr r6, r7, #16\n\t"
  65986. #endif
  65987. #ifdef WOLFSSL_KEIL
  65988. "muls r6, r5, r6\n\t"
  65989. #elif defined(__clang__)
  65990. "muls r6, r5\n\t"
  65991. #else
  65992. "mul r6, r5\n\t"
  65993. #endif
  65994. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65995. "adds r2, r2, r6\n\t"
  65996. #else
  65997. "add r2, r2, r6\n\t"
  65998. #endif
  65999. #ifdef WOLFSSL_KEIL
  66000. "adcs r3, r3, %[r]\n\t"
  66001. #elif defined(__clang__)
  66002. "adcs r3, %[r]\n\t"
  66003. #else
  66004. "adc r3, %[r]\n\t"
  66005. #endif
  66006. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66007. "adds r2, r2, r6\n\t"
  66008. #else
  66009. "add r2, r2, r6\n\t"
  66010. #endif
  66011. #ifdef WOLFSSL_KEIL
  66012. "adcs r3, r3, %[r]\n\t"
  66013. #elif defined(__clang__)
  66014. "adcs r3, %[r]\n\t"
  66015. #else
  66016. "adc r3, %[r]\n\t"
  66017. #endif
  66018. "uxth r6, r7\n\t"
  66019. #ifdef WOLFSSL_KEIL
  66020. "muls r5, r6, r5\n\t"
  66021. #elif defined(__clang__)
  66022. "muls r5, r6\n\t"
  66023. #else
  66024. "mul r5, r6\n\t"
  66025. #endif
  66026. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66027. "lsrs r6, r5, #16\n\t"
  66028. #else
  66029. "lsr r6, r5, #16\n\t"
  66030. #endif
  66031. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66032. "lsls r5, r5, #16\n\t"
  66033. #else
  66034. "lsl r5, r5, #16\n\t"
  66035. #endif
  66036. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66037. "adds r4, r4, r5\n\t"
  66038. #else
  66039. "add r4, r4, r5\n\t"
  66040. #endif
  66041. #ifdef WOLFSSL_KEIL
  66042. "adcs r2, r2, r6\n\t"
  66043. #elif defined(__clang__)
  66044. "adcs r2, r6\n\t"
  66045. #else
  66046. "adc r2, r6\n\t"
  66047. #endif
  66048. #ifdef WOLFSSL_KEIL
  66049. "adcs r3, r3, %[r]\n\t"
  66050. #elif defined(__clang__)
  66051. "adcs r3, %[r]\n\t"
  66052. #else
  66053. "adc r3, %[r]\n\t"
  66054. #endif
  66055. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66056. "adds r4, r4, r5\n\t"
  66057. #else
  66058. "add r4, r4, r5\n\t"
  66059. #endif
  66060. #ifdef WOLFSSL_KEIL
  66061. "adcs r2, r2, r6\n\t"
  66062. #elif defined(__clang__)
  66063. "adcs r2, r6\n\t"
  66064. #else
  66065. "adc r2, r6\n\t"
  66066. #endif
  66067. #ifdef WOLFSSL_KEIL
  66068. "adcs r3, r3, %[r]\n\t"
  66069. #elif defined(__clang__)
  66070. "adcs r3, %[r]\n\t"
  66071. #else
  66072. "adc r3, %[r]\n\t"
  66073. #endif
  66074. "# A[7] * A[7]\n\t"
  66075. "mov %[a], r9\n\t"
  66076. "ldr r7, [%[a], #28]\n\t"
  66077. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66078. "lsrs r6, r7, #16\n\t"
  66079. #else
  66080. "lsr r6, r7, #16\n\t"
  66081. #endif
  66082. "uxth r5, r7\n\t"
  66083. #ifdef WOLFSSL_KEIL
  66084. "muls r5, r5, r5\n\t"
  66085. #elif defined(__clang__)
  66086. "muls r5, r5\n\t"
  66087. #else
  66088. "mul r5, r5\n\t"
  66089. #endif
  66090. #ifdef WOLFSSL_KEIL
  66091. "muls r6, r6, r6\n\t"
  66092. #elif defined(__clang__)
  66093. "muls r6, r6\n\t"
  66094. #else
  66095. "mul r6, r6\n\t"
  66096. #endif
  66097. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66098. "adds r4, r4, r5\n\t"
  66099. #else
  66100. "add r4, r4, r5\n\t"
  66101. #endif
  66102. #ifdef WOLFSSL_KEIL
  66103. "adcs r2, r2, r6\n\t"
  66104. #elif defined(__clang__)
  66105. "adcs r2, r6\n\t"
  66106. #else
  66107. "adc r2, r6\n\t"
  66108. #endif
  66109. #ifdef WOLFSSL_KEIL
  66110. "adcs r3, r3, %[r]\n\t"
  66111. #elif defined(__clang__)
  66112. "adcs r3, %[r]\n\t"
  66113. #else
  66114. "adc r3, %[r]\n\t"
  66115. #endif
  66116. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66117. "lsrs r6, r7, #16\n\t"
  66118. #else
  66119. "lsr r6, r7, #16\n\t"
  66120. #endif
  66121. "uxth r5, r7\n\t"
  66122. #ifdef WOLFSSL_KEIL
  66123. "muls r5, r6, r5\n\t"
  66124. #elif defined(__clang__)
  66125. "muls r5, r6\n\t"
  66126. #else
  66127. "mul r5, r6\n\t"
  66128. #endif
  66129. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66130. "lsrs r6, r5, #15\n\t"
  66131. #else
  66132. "lsr r6, r5, #15\n\t"
  66133. #endif
  66134. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66135. "lsls r5, r5, #17\n\t"
  66136. #else
  66137. "lsl r5, r5, #17\n\t"
  66138. #endif
  66139. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66140. "adds r4, r4, r5\n\t"
  66141. #else
  66142. "add r4, r4, r5\n\t"
  66143. #endif
  66144. #ifdef WOLFSSL_KEIL
  66145. "adcs r2, r2, r6\n\t"
  66146. #elif defined(__clang__)
  66147. "adcs r2, r6\n\t"
  66148. #else
  66149. "adc r2, r6\n\t"
  66150. #endif
  66151. #ifdef WOLFSSL_KEIL
  66152. "adcs r3, r3, %[r]\n\t"
  66153. #elif defined(__clang__)
  66154. "adcs r3, %[r]\n\t"
  66155. #else
  66156. "adc r3, %[r]\n\t"
  66157. #endif
  66158. "mov %[r], r8\n\t"
  66159. "str r4, [%[r], #56]\n\t"
  66160. "movs %[r], #0\n\t"
  66161. "# A[8] * A[7]\n\t"
  66162. "movs r4, #0\n\t"
  66163. "mov %[a], r10\n\t"
  66164. "uxth r5, %[a]\n\t"
  66165. "uxth r6, r7\n\t"
  66166. #ifdef WOLFSSL_KEIL
  66167. "muls r6, r5, r6\n\t"
  66168. #elif defined(__clang__)
  66169. "muls r6, r5\n\t"
  66170. #else
  66171. "mul r6, r5\n\t"
  66172. #endif
  66173. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66174. "adds r2, r2, r6\n\t"
  66175. #else
  66176. "add r2, r2, r6\n\t"
  66177. #endif
  66178. #ifdef WOLFSSL_KEIL
  66179. "adcs r3, r3, %[r]\n\t"
  66180. #elif defined(__clang__)
  66181. "adcs r3, %[r]\n\t"
  66182. #else
  66183. "adc r3, %[r]\n\t"
  66184. #endif
  66185. #ifdef WOLFSSL_KEIL
  66186. "adcs r4, r4, %[r]\n\t"
  66187. #elif defined(__clang__)
  66188. "adcs r4, %[r]\n\t"
  66189. #else
  66190. "adc r4, %[r]\n\t"
  66191. #endif
  66192. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66193. "adds r2, r2, r6\n\t"
  66194. #else
  66195. "add r2, r2, r6\n\t"
  66196. #endif
  66197. #ifdef WOLFSSL_KEIL
  66198. "adcs r3, r3, %[r]\n\t"
  66199. #elif defined(__clang__)
  66200. "adcs r3, %[r]\n\t"
  66201. #else
  66202. "adc r3, %[r]\n\t"
  66203. #endif
  66204. #ifdef WOLFSSL_KEIL
  66205. "adcs r4, r4, %[r]\n\t"
  66206. #elif defined(__clang__)
  66207. "adcs r4, %[r]\n\t"
  66208. #else
  66209. "adc r4, %[r]\n\t"
  66210. #endif
  66211. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66212. "lsrs r6, r7, #16\n\t"
  66213. #else
  66214. "lsr r6, r7, #16\n\t"
  66215. #endif
  66216. #ifdef WOLFSSL_KEIL
  66217. "muls r5, r6, r5\n\t"
  66218. #elif defined(__clang__)
  66219. "muls r5, r6\n\t"
  66220. #else
  66221. "mul r5, r6\n\t"
  66222. #endif
  66223. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66224. "lsrs r6, r5, #16\n\t"
  66225. #else
  66226. "lsr r6, r5, #16\n\t"
  66227. #endif
  66228. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66229. "lsls r5, r5, #16\n\t"
  66230. #else
  66231. "lsl r5, r5, #16\n\t"
  66232. #endif
  66233. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66234. "adds r2, r2, r5\n\t"
  66235. #else
  66236. "add r2, r2, r5\n\t"
  66237. #endif
  66238. #ifdef WOLFSSL_KEIL
  66239. "adcs r3, r3, r6\n\t"
  66240. #elif defined(__clang__)
  66241. "adcs r3, r6\n\t"
  66242. #else
  66243. "adc r3, r6\n\t"
  66244. #endif
  66245. #ifdef WOLFSSL_KEIL
  66246. "adcs r4, r4, %[r]\n\t"
  66247. #elif defined(__clang__)
  66248. "adcs r4, %[r]\n\t"
  66249. #else
  66250. "adc r4, %[r]\n\t"
  66251. #endif
  66252. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66253. "adds r2, r2, r5\n\t"
  66254. #else
  66255. "add r2, r2, r5\n\t"
  66256. #endif
  66257. #ifdef WOLFSSL_KEIL
  66258. "adcs r3, r3, r6\n\t"
  66259. #elif defined(__clang__)
  66260. "adcs r3, r6\n\t"
  66261. #else
  66262. "adc r3, r6\n\t"
  66263. #endif
  66264. #ifdef WOLFSSL_KEIL
  66265. "adcs r4, r4, %[r]\n\t"
  66266. #elif defined(__clang__)
  66267. "adcs r4, %[r]\n\t"
  66268. #else
  66269. "adc r4, %[r]\n\t"
  66270. #endif
  66271. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66272. "lsrs r5, %[a], #16\n\t"
  66273. #else
  66274. "lsr r5, %[a], #16\n\t"
  66275. #endif
  66276. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66277. "lsrs r6, r7, #16\n\t"
  66278. #else
  66279. "lsr r6, r7, #16\n\t"
  66280. #endif
  66281. #ifdef WOLFSSL_KEIL
  66282. "muls r6, r5, r6\n\t"
  66283. #elif defined(__clang__)
  66284. "muls r6, r5\n\t"
  66285. #else
  66286. "mul r6, r5\n\t"
  66287. #endif
  66288. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66289. "adds r3, r3, r6\n\t"
  66290. #else
  66291. "add r3, r3, r6\n\t"
  66292. #endif
  66293. #ifdef WOLFSSL_KEIL
  66294. "adcs r4, r4, %[r]\n\t"
  66295. #elif defined(__clang__)
  66296. "adcs r4, %[r]\n\t"
  66297. #else
  66298. "adc r4, %[r]\n\t"
  66299. #endif
  66300. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66301. "adds r3, r3, r6\n\t"
  66302. #else
  66303. "add r3, r3, r6\n\t"
  66304. #endif
  66305. #ifdef WOLFSSL_KEIL
  66306. "adcs r4, r4, %[r]\n\t"
  66307. #elif defined(__clang__)
  66308. "adcs r4, %[r]\n\t"
  66309. #else
  66310. "adc r4, %[r]\n\t"
  66311. #endif
  66312. "uxth r6, r7\n\t"
  66313. #ifdef WOLFSSL_KEIL
  66314. "muls r5, r6, r5\n\t"
  66315. #elif defined(__clang__)
  66316. "muls r5, r6\n\t"
  66317. #else
  66318. "mul r5, r6\n\t"
  66319. #endif
  66320. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66321. "lsrs r6, r5, #16\n\t"
  66322. #else
  66323. "lsr r6, r5, #16\n\t"
  66324. #endif
  66325. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66326. "lsls r5, r5, #16\n\t"
  66327. #else
  66328. "lsl r5, r5, #16\n\t"
  66329. #endif
  66330. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66331. "adds r2, r2, r5\n\t"
  66332. #else
  66333. "add r2, r2, r5\n\t"
  66334. #endif
  66335. #ifdef WOLFSSL_KEIL
  66336. "adcs r3, r3, r6\n\t"
  66337. #elif defined(__clang__)
  66338. "adcs r3, r6\n\t"
  66339. #else
  66340. "adc r3, r6\n\t"
  66341. #endif
  66342. #ifdef WOLFSSL_KEIL
  66343. "adcs r4, r4, %[r]\n\t"
  66344. #elif defined(__clang__)
  66345. "adcs r4, %[r]\n\t"
  66346. #else
  66347. "adc r4, %[r]\n\t"
  66348. #endif
  66349. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66350. "adds r2, r2, r5\n\t"
  66351. #else
  66352. "add r2, r2, r5\n\t"
  66353. #endif
  66354. #ifdef WOLFSSL_KEIL
  66355. "adcs r3, r3, r6\n\t"
  66356. #elif defined(__clang__)
  66357. "adcs r3, r6\n\t"
  66358. #else
  66359. "adc r3, r6\n\t"
  66360. #endif
  66361. #ifdef WOLFSSL_KEIL
  66362. "adcs r4, r4, %[r]\n\t"
  66363. #elif defined(__clang__)
  66364. "adcs r4, %[r]\n\t"
  66365. #else
  66366. "adc r4, %[r]\n\t"
  66367. #endif
  66368. "# A[9] * A[6]\n\t"
  66369. "mov %[a], r9\n\t"
  66370. "ldr r7, [%[a], #24]\n\t"
  66371. "mov %[a], r11\n\t"
  66372. "uxth r5, %[a]\n\t"
  66373. "uxth r6, r7\n\t"
  66374. #ifdef WOLFSSL_KEIL
  66375. "muls r6, r5, r6\n\t"
  66376. #elif defined(__clang__)
  66377. "muls r6, r5\n\t"
  66378. #else
  66379. "mul r6, r5\n\t"
  66380. #endif
  66381. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66382. "adds r2, r2, r6\n\t"
  66383. #else
  66384. "add r2, r2, r6\n\t"
  66385. #endif
  66386. #ifdef WOLFSSL_KEIL
  66387. "adcs r3, r3, %[r]\n\t"
  66388. #elif defined(__clang__)
  66389. "adcs r3, %[r]\n\t"
  66390. #else
  66391. "adc r3, %[r]\n\t"
  66392. #endif
  66393. #ifdef WOLFSSL_KEIL
  66394. "adcs r4, r4, %[r]\n\t"
  66395. #elif defined(__clang__)
  66396. "adcs r4, %[r]\n\t"
  66397. #else
  66398. "adc r4, %[r]\n\t"
  66399. #endif
  66400. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66401. "adds r2, r2, r6\n\t"
  66402. #else
  66403. "add r2, r2, r6\n\t"
  66404. #endif
  66405. #ifdef WOLFSSL_KEIL
  66406. "adcs r3, r3, %[r]\n\t"
  66407. #elif defined(__clang__)
  66408. "adcs r3, %[r]\n\t"
  66409. #else
  66410. "adc r3, %[r]\n\t"
  66411. #endif
  66412. #ifdef WOLFSSL_KEIL
  66413. "adcs r4, r4, %[r]\n\t"
  66414. #elif defined(__clang__)
  66415. "adcs r4, %[r]\n\t"
  66416. #else
  66417. "adc r4, %[r]\n\t"
  66418. #endif
  66419. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66420. "lsrs r6, r7, #16\n\t"
  66421. #else
  66422. "lsr r6, r7, #16\n\t"
  66423. #endif
  66424. #ifdef WOLFSSL_KEIL
  66425. "muls r5, r6, r5\n\t"
  66426. #elif defined(__clang__)
  66427. "muls r5, r6\n\t"
  66428. #else
  66429. "mul r5, r6\n\t"
  66430. #endif
  66431. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66432. "lsrs r6, r5, #16\n\t"
  66433. #else
  66434. "lsr r6, r5, #16\n\t"
  66435. #endif
  66436. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66437. "lsls r5, r5, #16\n\t"
  66438. #else
  66439. "lsl r5, r5, #16\n\t"
  66440. #endif
  66441. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66442. "adds r2, r2, r5\n\t"
  66443. #else
  66444. "add r2, r2, r5\n\t"
  66445. #endif
  66446. #ifdef WOLFSSL_KEIL
  66447. "adcs r3, r3, r6\n\t"
  66448. #elif defined(__clang__)
  66449. "adcs r3, r6\n\t"
  66450. #else
  66451. "adc r3, r6\n\t"
  66452. #endif
  66453. #ifdef WOLFSSL_KEIL
  66454. "adcs r4, r4, %[r]\n\t"
  66455. #elif defined(__clang__)
  66456. "adcs r4, %[r]\n\t"
  66457. #else
  66458. "adc r4, %[r]\n\t"
  66459. #endif
  66460. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66461. "adds r2, r2, r5\n\t"
  66462. #else
  66463. "add r2, r2, r5\n\t"
  66464. #endif
  66465. #ifdef WOLFSSL_KEIL
  66466. "adcs r3, r3, r6\n\t"
  66467. #elif defined(__clang__)
  66468. "adcs r3, r6\n\t"
  66469. #else
  66470. "adc r3, r6\n\t"
  66471. #endif
  66472. #ifdef WOLFSSL_KEIL
  66473. "adcs r4, r4, %[r]\n\t"
  66474. #elif defined(__clang__)
  66475. "adcs r4, %[r]\n\t"
  66476. #else
  66477. "adc r4, %[r]\n\t"
  66478. #endif
  66479. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66480. "lsrs r5, %[a], #16\n\t"
  66481. #else
  66482. "lsr r5, %[a], #16\n\t"
  66483. #endif
  66484. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66485. "lsrs r6, r7, #16\n\t"
  66486. #else
  66487. "lsr r6, r7, #16\n\t"
  66488. #endif
  66489. #ifdef WOLFSSL_KEIL
  66490. "muls r6, r5, r6\n\t"
  66491. #elif defined(__clang__)
  66492. "muls r6, r5\n\t"
  66493. #else
  66494. "mul r6, r5\n\t"
  66495. #endif
  66496. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66497. "adds r3, r3, r6\n\t"
  66498. #else
  66499. "add r3, r3, r6\n\t"
  66500. #endif
  66501. #ifdef WOLFSSL_KEIL
  66502. "adcs r4, r4, %[r]\n\t"
  66503. #elif defined(__clang__)
  66504. "adcs r4, %[r]\n\t"
  66505. #else
  66506. "adc r4, %[r]\n\t"
  66507. #endif
  66508. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66509. "adds r3, r3, r6\n\t"
  66510. #else
  66511. "add r3, r3, r6\n\t"
  66512. #endif
  66513. #ifdef WOLFSSL_KEIL
  66514. "adcs r4, r4, %[r]\n\t"
  66515. #elif defined(__clang__)
  66516. "adcs r4, %[r]\n\t"
  66517. #else
  66518. "adc r4, %[r]\n\t"
  66519. #endif
  66520. "uxth r6, r7\n\t"
  66521. #ifdef WOLFSSL_KEIL
  66522. "muls r5, r6, r5\n\t"
  66523. #elif defined(__clang__)
  66524. "muls r5, r6\n\t"
  66525. #else
  66526. "mul r5, r6\n\t"
  66527. #endif
  66528. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66529. "lsrs r6, r5, #16\n\t"
  66530. #else
  66531. "lsr r6, r5, #16\n\t"
  66532. #endif
  66533. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66534. "lsls r5, r5, #16\n\t"
  66535. #else
  66536. "lsl r5, r5, #16\n\t"
  66537. #endif
  66538. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66539. "adds r2, r2, r5\n\t"
  66540. #else
  66541. "add r2, r2, r5\n\t"
  66542. #endif
  66543. #ifdef WOLFSSL_KEIL
  66544. "adcs r3, r3, r6\n\t"
  66545. #elif defined(__clang__)
  66546. "adcs r3, r6\n\t"
  66547. #else
  66548. "adc r3, r6\n\t"
  66549. #endif
  66550. #ifdef WOLFSSL_KEIL
  66551. "adcs r4, r4, %[r]\n\t"
  66552. #elif defined(__clang__)
  66553. "adcs r4, %[r]\n\t"
  66554. #else
  66555. "adc r4, %[r]\n\t"
  66556. #endif
  66557. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66558. "adds r2, r2, r5\n\t"
  66559. #else
  66560. "add r2, r2, r5\n\t"
  66561. #endif
  66562. #ifdef WOLFSSL_KEIL
  66563. "adcs r3, r3, r6\n\t"
  66564. #elif defined(__clang__)
  66565. "adcs r3, r6\n\t"
  66566. #else
  66567. "adc r3, r6\n\t"
  66568. #endif
  66569. #ifdef WOLFSSL_KEIL
  66570. "adcs r4, r4, %[r]\n\t"
  66571. #elif defined(__clang__)
  66572. "adcs r4, %[r]\n\t"
  66573. #else
  66574. "adc r4, %[r]\n\t"
  66575. #endif
  66576. "# A[10] * A[5]\n\t"
  66577. "mov %[a], r9\n\t"
  66578. "ldr r7, [%[a], #20]\n\t"
  66579. "mov %[a], r12\n\t"
  66580. "uxth r5, %[a]\n\t"
  66581. "uxth r6, r7\n\t"
  66582. #ifdef WOLFSSL_KEIL
  66583. "muls r6, r5, r6\n\t"
  66584. #elif defined(__clang__)
  66585. "muls r6, r5\n\t"
  66586. #else
  66587. "mul r6, r5\n\t"
  66588. #endif
  66589. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66590. "adds r2, r2, r6\n\t"
  66591. #else
  66592. "add r2, r2, r6\n\t"
  66593. #endif
  66594. #ifdef WOLFSSL_KEIL
  66595. "adcs r3, r3, %[r]\n\t"
  66596. #elif defined(__clang__)
  66597. "adcs r3, %[r]\n\t"
  66598. #else
  66599. "adc r3, %[r]\n\t"
  66600. #endif
  66601. #ifdef WOLFSSL_KEIL
  66602. "adcs r4, r4, %[r]\n\t"
  66603. #elif defined(__clang__)
  66604. "adcs r4, %[r]\n\t"
  66605. #else
  66606. "adc r4, %[r]\n\t"
  66607. #endif
  66608. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66609. "adds r2, r2, r6\n\t"
  66610. #else
  66611. "add r2, r2, r6\n\t"
  66612. #endif
  66613. #ifdef WOLFSSL_KEIL
  66614. "adcs r3, r3, %[r]\n\t"
  66615. #elif defined(__clang__)
  66616. "adcs r3, %[r]\n\t"
  66617. #else
  66618. "adc r3, %[r]\n\t"
  66619. #endif
  66620. #ifdef WOLFSSL_KEIL
  66621. "adcs r4, r4, %[r]\n\t"
  66622. #elif defined(__clang__)
  66623. "adcs r4, %[r]\n\t"
  66624. #else
  66625. "adc r4, %[r]\n\t"
  66626. #endif
  66627. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66628. "lsrs r6, r7, #16\n\t"
  66629. #else
  66630. "lsr r6, r7, #16\n\t"
  66631. #endif
  66632. #ifdef WOLFSSL_KEIL
  66633. "muls r5, r6, r5\n\t"
  66634. #elif defined(__clang__)
  66635. "muls r5, r6\n\t"
  66636. #else
  66637. "mul r5, r6\n\t"
  66638. #endif
  66639. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66640. "lsrs r6, r5, #16\n\t"
  66641. #else
  66642. "lsr r6, r5, #16\n\t"
  66643. #endif
  66644. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66645. "lsls r5, r5, #16\n\t"
  66646. #else
  66647. "lsl r5, r5, #16\n\t"
  66648. #endif
  66649. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66650. "adds r2, r2, r5\n\t"
  66651. #else
  66652. "add r2, r2, r5\n\t"
  66653. #endif
  66654. #ifdef WOLFSSL_KEIL
  66655. "adcs r3, r3, r6\n\t"
  66656. #elif defined(__clang__)
  66657. "adcs r3, r6\n\t"
  66658. #else
  66659. "adc r3, r6\n\t"
  66660. #endif
  66661. #ifdef WOLFSSL_KEIL
  66662. "adcs r4, r4, %[r]\n\t"
  66663. #elif defined(__clang__)
  66664. "adcs r4, %[r]\n\t"
  66665. #else
  66666. "adc r4, %[r]\n\t"
  66667. #endif
  66668. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66669. "adds r2, r2, r5\n\t"
  66670. #else
  66671. "add r2, r2, r5\n\t"
  66672. #endif
  66673. #ifdef WOLFSSL_KEIL
  66674. "adcs r3, r3, r6\n\t"
  66675. #elif defined(__clang__)
  66676. "adcs r3, r6\n\t"
  66677. #else
  66678. "adc r3, r6\n\t"
  66679. #endif
  66680. #ifdef WOLFSSL_KEIL
  66681. "adcs r4, r4, %[r]\n\t"
  66682. #elif defined(__clang__)
  66683. "adcs r4, %[r]\n\t"
  66684. #else
  66685. "adc r4, %[r]\n\t"
  66686. #endif
  66687. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66688. "lsrs r5, %[a], #16\n\t"
  66689. #else
  66690. "lsr r5, %[a], #16\n\t"
  66691. #endif
  66692. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66693. "lsrs r6, r7, #16\n\t"
  66694. #else
  66695. "lsr r6, r7, #16\n\t"
  66696. #endif
  66697. #ifdef WOLFSSL_KEIL
  66698. "muls r6, r5, r6\n\t"
  66699. #elif defined(__clang__)
  66700. "muls r6, r5\n\t"
  66701. #else
  66702. "mul r6, r5\n\t"
  66703. #endif
  66704. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66705. "adds r3, r3, r6\n\t"
  66706. #else
  66707. "add r3, r3, r6\n\t"
  66708. #endif
  66709. #ifdef WOLFSSL_KEIL
  66710. "adcs r4, r4, %[r]\n\t"
  66711. #elif defined(__clang__)
  66712. "adcs r4, %[r]\n\t"
  66713. #else
  66714. "adc r4, %[r]\n\t"
  66715. #endif
  66716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66717. "adds r3, r3, r6\n\t"
  66718. #else
  66719. "add r3, r3, r6\n\t"
  66720. #endif
  66721. #ifdef WOLFSSL_KEIL
  66722. "adcs r4, r4, %[r]\n\t"
  66723. #elif defined(__clang__)
  66724. "adcs r4, %[r]\n\t"
  66725. #else
  66726. "adc r4, %[r]\n\t"
  66727. #endif
  66728. "uxth r6, r7\n\t"
  66729. #ifdef WOLFSSL_KEIL
  66730. "muls r5, r6, r5\n\t"
  66731. #elif defined(__clang__)
  66732. "muls r5, r6\n\t"
  66733. #else
  66734. "mul r5, r6\n\t"
  66735. #endif
  66736. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66737. "lsrs r6, r5, #16\n\t"
  66738. #else
  66739. "lsr r6, r5, #16\n\t"
  66740. #endif
  66741. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66742. "lsls r5, r5, #16\n\t"
  66743. #else
  66744. "lsl r5, r5, #16\n\t"
  66745. #endif
  66746. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66747. "adds r2, r2, r5\n\t"
  66748. #else
  66749. "add r2, r2, r5\n\t"
  66750. #endif
  66751. #ifdef WOLFSSL_KEIL
  66752. "adcs r3, r3, r6\n\t"
  66753. #elif defined(__clang__)
  66754. "adcs r3, r6\n\t"
  66755. #else
  66756. "adc r3, r6\n\t"
  66757. #endif
  66758. #ifdef WOLFSSL_KEIL
  66759. "adcs r4, r4, %[r]\n\t"
  66760. #elif defined(__clang__)
  66761. "adcs r4, %[r]\n\t"
  66762. #else
  66763. "adc r4, %[r]\n\t"
  66764. #endif
  66765. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66766. "adds r2, r2, r5\n\t"
  66767. #else
  66768. "add r2, r2, r5\n\t"
  66769. #endif
  66770. #ifdef WOLFSSL_KEIL
  66771. "adcs r3, r3, r6\n\t"
  66772. #elif defined(__clang__)
  66773. "adcs r3, r6\n\t"
  66774. #else
  66775. "adc r3, r6\n\t"
  66776. #endif
  66777. #ifdef WOLFSSL_KEIL
  66778. "adcs r4, r4, %[r]\n\t"
  66779. #elif defined(__clang__)
  66780. "adcs r4, %[r]\n\t"
  66781. #else
  66782. "adc r4, %[r]\n\t"
  66783. #endif
  66784. "# A[11] * A[4]\n\t"
  66785. "mov %[a], r9\n\t"
  66786. "ldr r7, [%[a], #16]\n\t"
  66787. "mov %[a], lr\n\t"
  66788. "uxth r5, %[a]\n\t"
  66789. "uxth r6, r7\n\t"
  66790. #ifdef WOLFSSL_KEIL
  66791. "muls r6, r5, r6\n\t"
  66792. #elif defined(__clang__)
  66793. "muls r6, r5\n\t"
  66794. #else
  66795. "mul r6, r5\n\t"
  66796. #endif
  66797. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66798. "adds r2, r2, r6\n\t"
  66799. #else
  66800. "add r2, r2, r6\n\t"
  66801. #endif
  66802. #ifdef WOLFSSL_KEIL
  66803. "adcs r3, r3, %[r]\n\t"
  66804. #elif defined(__clang__)
  66805. "adcs r3, %[r]\n\t"
  66806. #else
  66807. "adc r3, %[r]\n\t"
  66808. #endif
  66809. #ifdef WOLFSSL_KEIL
  66810. "adcs r4, r4, %[r]\n\t"
  66811. #elif defined(__clang__)
  66812. "adcs r4, %[r]\n\t"
  66813. #else
  66814. "adc r4, %[r]\n\t"
  66815. #endif
  66816. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66817. "adds r2, r2, r6\n\t"
  66818. #else
  66819. "add r2, r2, r6\n\t"
  66820. #endif
  66821. #ifdef WOLFSSL_KEIL
  66822. "adcs r3, r3, %[r]\n\t"
  66823. #elif defined(__clang__)
  66824. "adcs r3, %[r]\n\t"
  66825. #else
  66826. "adc r3, %[r]\n\t"
  66827. #endif
  66828. #ifdef WOLFSSL_KEIL
  66829. "adcs r4, r4, %[r]\n\t"
  66830. #elif defined(__clang__)
  66831. "adcs r4, %[r]\n\t"
  66832. #else
  66833. "adc r4, %[r]\n\t"
  66834. #endif
  66835. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66836. "lsrs r6, r7, #16\n\t"
  66837. #else
  66838. "lsr r6, r7, #16\n\t"
  66839. #endif
  66840. #ifdef WOLFSSL_KEIL
  66841. "muls r5, r6, r5\n\t"
  66842. #elif defined(__clang__)
  66843. "muls r5, r6\n\t"
  66844. #else
  66845. "mul r5, r6\n\t"
  66846. #endif
  66847. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66848. "lsrs r6, r5, #16\n\t"
  66849. #else
  66850. "lsr r6, r5, #16\n\t"
  66851. #endif
  66852. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66853. "lsls r5, r5, #16\n\t"
  66854. #else
  66855. "lsl r5, r5, #16\n\t"
  66856. #endif
  66857. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66858. "adds r2, r2, r5\n\t"
  66859. #else
  66860. "add r2, r2, r5\n\t"
  66861. #endif
  66862. #ifdef WOLFSSL_KEIL
  66863. "adcs r3, r3, r6\n\t"
  66864. #elif defined(__clang__)
  66865. "adcs r3, r6\n\t"
  66866. #else
  66867. "adc r3, r6\n\t"
  66868. #endif
  66869. #ifdef WOLFSSL_KEIL
  66870. "adcs r4, r4, %[r]\n\t"
  66871. #elif defined(__clang__)
  66872. "adcs r4, %[r]\n\t"
  66873. #else
  66874. "adc r4, %[r]\n\t"
  66875. #endif
  66876. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66877. "adds r2, r2, r5\n\t"
  66878. #else
  66879. "add r2, r2, r5\n\t"
  66880. #endif
  66881. #ifdef WOLFSSL_KEIL
  66882. "adcs r3, r3, r6\n\t"
  66883. #elif defined(__clang__)
  66884. "adcs r3, r6\n\t"
  66885. #else
  66886. "adc r3, r6\n\t"
  66887. #endif
  66888. #ifdef WOLFSSL_KEIL
  66889. "adcs r4, r4, %[r]\n\t"
  66890. #elif defined(__clang__)
  66891. "adcs r4, %[r]\n\t"
  66892. #else
  66893. "adc r4, %[r]\n\t"
  66894. #endif
  66895. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66896. "lsrs r5, %[a], #16\n\t"
  66897. #else
  66898. "lsr r5, %[a], #16\n\t"
  66899. #endif
  66900. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66901. "lsrs r6, r7, #16\n\t"
  66902. #else
  66903. "lsr r6, r7, #16\n\t"
  66904. #endif
  66905. #ifdef WOLFSSL_KEIL
  66906. "muls r6, r5, r6\n\t"
  66907. #elif defined(__clang__)
  66908. "muls r6, r5\n\t"
  66909. #else
  66910. "mul r6, r5\n\t"
  66911. #endif
  66912. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66913. "adds r3, r3, r6\n\t"
  66914. #else
  66915. "add r3, r3, r6\n\t"
  66916. #endif
  66917. #ifdef WOLFSSL_KEIL
  66918. "adcs r4, r4, %[r]\n\t"
  66919. #elif defined(__clang__)
  66920. "adcs r4, %[r]\n\t"
  66921. #else
  66922. "adc r4, %[r]\n\t"
  66923. #endif
  66924. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66925. "adds r3, r3, r6\n\t"
  66926. #else
  66927. "add r3, r3, r6\n\t"
  66928. #endif
  66929. #ifdef WOLFSSL_KEIL
  66930. "adcs r4, r4, %[r]\n\t"
  66931. #elif defined(__clang__)
  66932. "adcs r4, %[r]\n\t"
  66933. #else
  66934. "adc r4, %[r]\n\t"
  66935. #endif
  66936. "uxth r6, r7\n\t"
  66937. #ifdef WOLFSSL_KEIL
  66938. "muls r5, r6, r5\n\t"
  66939. #elif defined(__clang__)
  66940. "muls r5, r6\n\t"
  66941. #else
  66942. "mul r5, r6\n\t"
  66943. #endif
  66944. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66945. "lsrs r6, r5, #16\n\t"
  66946. #else
  66947. "lsr r6, r5, #16\n\t"
  66948. #endif
  66949. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66950. "lsls r5, r5, #16\n\t"
  66951. #else
  66952. "lsl r5, r5, #16\n\t"
  66953. #endif
  66954. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66955. "adds r2, r2, r5\n\t"
  66956. #else
  66957. "add r2, r2, r5\n\t"
  66958. #endif
  66959. #ifdef WOLFSSL_KEIL
  66960. "adcs r3, r3, r6\n\t"
  66961. #elif defined(__clang__)
  66962. "adcs r3, r6\n\t"
  66963. #else
  66964. "adc r3, r6\n\t"
  66965. #endif
  66966. #ifdef WOLFSSL_KEIL
  66967. "adcs r4, r4, %[r]\n\t"
  66968. #elif defined(__clang__)
  66969. "adcs r4, %[r]\n\t"
  66970. #else
  66971. "adc r4, %[r]\n\t"
  66972. #endif
  66973. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66974. "adds r2, r2, r5\n\t"
  66975. #else
  66976. "add r2, r2, r5\n\t"
  66977. #endif
  66978. #ifdef WOLFSSL_KEIL
  66979. "adcs r3, r3, r6\n\t"
  66980. #elif defined(__clang__)
  66981. "adcs r3, r6\n\t"
  66982. #else
  66983. "adc r3, r6\n\t"
  66984. #endif
  66985. #ifdef WOLFSSL_KEIL
  66986. "adcs r4, r4, %[r]\n\t"
  66987. #elif defined(__clang__)
  66988. "adcs r4, %[r]\n\t"
  66989. #else
  66990. "adc r4, %[r]\n\t"
  66991. #endif
  66992. "mov %[r], r8\n\t"
  66993. "str r2, [%[r], #60]\n\t"
  66994. "movs %[r], #0\n\t"
  66995. "# A[11] * A[5]\n\t"
  66996. "movs r2, #0\n\t"
  66997. "mov %[a], r9\n\t"
  66998. "ldr r7, [%[a], #20]\n\t"
  66999. "mov %[a], lr\n\t"
  67000. "uxth r5, %[a]\n\t"
  67001. "uxth r6, r7\n\t"
  67002. #ifdef WOLFSSL_KEIL
  67003. "muls r6, r5, r6\n\t"
  67004. #elif defined(__clang__)
  67005. "muls r6, r5\n\t"
  67006. #else
  67007. "mul r6, r5\n\t"
  67008. #endif
  67009. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67010. "adds r3, r3, r6\n\t"
  67011. #else
  67012. "add r3, r3, r6\n\t"
  67013. #endif
  67014. #ifdef WOLFSSL_KEIL
  67015. "adcs r4, r4, %[r]\n\t"
  67016. #elif defined(__clang__)
  67017. "adcs r4, %[r]\n\t"
  67018. #else
  67019. "adc r4, %[r]\n\t"
  67020. #endif
  67021. #ifdef WOLFSSL_KEIL
  67022. "adcs r2, r2, %[r]\n\t"
  67023. #elif defined(__clang__)
  67024. "adcs r2, %[r]\n\t"
  67025. #else
  67026. "adc r2, %[r]\n\t"
  67027. #endif
  67028. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67029. "adds r3, r3, r6\n\t"
  67030. #else
  67031. "add r3, r3, r6\n\t"
  67032. #endif
  67033. #ifdef WOLFSSL_KEIL
  67034. "adcs r4, r4, %[r]\n\t"
  67035. #elif defined(__clang__)
  67036. "adcs r4, %[r]\n\t"
  67037. #else
  67038. "adc r4, %[r]\n\t"
  67039. #endif
  67040. #ifdef WOLFSSL_KEIL
  67041. "adcs r2, r2, %[r]\n\t"
  67042. #elif defined(__clang__)
  67043. "adcs r2, %[r]\n\t"
  67044. #else
  67045. "adc r2, %[r]\n\t"
  67046. #endif
  67047. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67048. "lsrs r6, r7, #16\n\t"
  67049. #else
  67050. "lsr r6, r7, #16\n\t"
  67051. #endif
  67052. #ifdef WOLFSSL_KEIL
  67053. "muls r5, r6, r5\n\t"
  67054. #elif defined(__clang__)
  67055. "muls r5, r6\n\t"
  67056. #else
  67057. "mul r5, r6\n\t"
  67058. #endif
  67059. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67060. "lsrs r6, r5, #16\n\t"
  67061. #else
  67062. "lsr r6, r5, #16\n\t"
  67063. #endif
  67064. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67065. "lsls r5, r5, #16\n\t"
  67066. #else
  67067. "lsl r5, r5, #16\n\t"
  67068. #endif
  67069. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67070. "adds r3, r3, r5\n\t"
  67071. #else
  67072. "add r3, r3, r5\n\t"
  67073. #endif
  67074. #ifdef WOLFSSL_KEIL
  67075. "adcs r4, r4, r6\n\t"
  67076. #elif defined(__clang__)
  67077. "adcs r4, r6\n\t"
  67078. #else
  67079. "adc r4, r6\n\t"
  67080. #endif
  67081. #ifdef WOLFSSL_KEIL
  67082. "adcs r2, r2, %[r]\n\t"
  67083. #elif defined(__clang__)
  67084. "adcs r2, %[r]\n\t"
  67085. #else
  67086. "adc r2, %[r]\n\t"
  67087. #endif
  67088. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67089. "adds r3, r3, r5\n\t"
  67090. #else
  67091. "add r3, r3, r5\n\t"
  67092. #endif
  67093. #ifdef WOLFSSL_KEIL
  67094. "adcs r4, r4, r6\n\t"
  67095. #elif defined(__clang__)
  67096. "adcs r4, r6\n\t"
  67097. #else
  67098. "adc r4, r6\n\t"
  67099. #endif
  67100. #ifdef WOLFSSL_KEIL
  67101. "adcs r2, r2, %[r]\n\t"
  67102. #elif defined(__clang__)
  67103. "adcs r2, %[r]\n\t"
  67104. #else
  67105. "adc r2, %[r]\n\t"
  67106. #endif
  67107. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67108. "lsrs r5, %[a], #16\n\t"
  67109. #else
  67110. "lsr r5, %[a], #16\n\t"
  67111. #endif
  67112. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67113. "lsrs r6, r7, #16\n\t"
  67114. #else
  67115. "lsr r6, r7, #16\n\t"
  67116. #endif
  67117. #ifdef WOLFSSL_KEIL
  67118. "muls r6, r5, r6\n\t"
  67119. #elif defined(__clang__)
  67120. "muls r6, r5\n\t"
  67121. #else
  67122. "mul r6, r5\n\t"
  67123. #endif
  67124. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67125. "adds r4, r4, r6\n\t"
  67126. #else
  67127. "add r4, r4, r6\n\t"
  67128. #endif
  67129. #ifdef WOLFSSL_KEIL
  67130. "adcs r2, r2, %[r]\n\t"
  67131. #elif defined(__clang__)
  67132. "adcs r2, %[r]\n\t"
  67133. #else
  67134. "adc r2, %[r]\n\t"
  67135. #endif
  67136. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67137. "adds r4, r4, r6\n\t"
  67138. #else
  67139. "add r4, r4, r6\n\t"
  67140. #endif
  67141. #ifdef WOLFSSL_KEIL
  67142. "adcs r2, r2, %[r]\n\t"
  67143. #elif defined(__clang__)
  67144. "adcs r2, %[r]\n\t"
  67145. #else
  67146. "adc r2, %[r]\n\t"
  67147. #endif
  67148. "uxth r6, r7\n\t"
  67149. #ifdef WOLFSSL_KEIL
  67150. "muls r5, r6, r5\n\t"
  67151. #elif defined(__clang__)
  67152. "muls r5, r6\n\t"
  67153. #else
  67154. "mul r5, r6\n\t"
  67155. #endif
  67156. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67157. "lsrs r6, r5, #16\n\t"
  67158. #else
  67159. "lsr r6, r5, #16\n\t"
  67160. #endif
  67161. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67162. "lsls r5, r5, #16\n\t"
  67163. #else
  67164. "lsl r5, r5, #16\n\t"
  67165. #endif
  67166. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67167. "adds r3, r3, r5\n\t"
  67168. #else
  67169. "add r3, r3, r5\n\t"
  67170. #endif
  67171. #ifdef WOLFSSL_KEIL
  67172. "adcs r4, r4, r6\n\t"
  67173. #elif defined(__clang__)
  67174. "adcs r4, r6\n\t"
  67175. #else
  67176. "adc r4, r6\n\t"
  67177. #endif
  67178. #ifdef WOLFSSL_KEIL
  67179. "adcs r2, r2, %[r]\n\t"
  67180. #elif defined(__clang__)
  67181. "adcs r2, %[r]\n\t"
  67182. #else
  67183. "adc r2, %[r]\n\t"
  67184. #endif
  67185. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67186. "adds r3, r3, r5\n\t"
  67187. #else
  67188. "add r3, r3, r5\n\t"
  67189. #endif
  67190. #ifdef WOLFSSL_KEIL
  67191. "adcs r4, r4, r6\n\t"
  67192. #elif defined(__clang__)
  67193. "adcs r4, r6\n\t"
  67194. #else
  67195. "adc r4, r6\n\t"
  67196. #endif
  67197. #ifdef WOLFSSL_KEIL
  67198. "adcs r2, r2, %[r]\n\t"
  67199. #elif defined(__clang__)
  67200. "adcs r2, %[r]\n\t"
  67201. #else
  67202. "adc r2, %[r]\n\t"
  67203. #endif
  67204. "# A[10] * A[6]\n\t"
  67205. "mov %[a], r9\n\t"
  67206. "ldr r7, [%[a], #24]\n\t"
  67207. "mov %[a], r12\n\t"
  67208. "uxth r5, %[a]\n\t"
  67209. "uxth r6, r7\n\t"
  67210. #ifdef WOLFSSL_KEIL
  67211. "muls r6, r5, r6\n\t"
  67212. #elif defined(__clang__)
  67213. "muls r6, r5\n\t"
  67214. #else
  67215. "mul r6, r5\n\t"
  67216. #endif
  67217. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67218. "adds r3, r3, r6\n\t"
  67219. #else
  67220. "add r3, r3, r6\n\t"
  67221. #endif
  67222. #ifdef WOLFSSL_KEIL
  67223. "adcs r4, r4, %[r]\n\t"
  67224. #elif defined(__clang__)
  67225. "adcs r4, %[r]\n\t"
  67226. #else
  67227. "adc r4, %[r]\n\t"
  67228. #endif
  67229. #ifdef WOLFSSL_KEIL
  67230. "adcs r2, r2, %[r]\n\t"
  67231. #elif defined(__clang__)
  67232. "adcs r2, %[r]\n\t"
  67233. #else
  67234. "adc r2, %[r]\n\t"
  67235. #endif
  67236. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67237. "adds r3, r3, r6\n\t"
  67238. #else
  67239. "add r3, r3, r6\n\t"
  67240. #endif
  67241. #ifdef WOLFSSL_KEIL
  67242. "adcs r4, r4, %[r]\n\t"
  67243. #elif defined(__clang__)
  67244. "adcs r4, %[r]\n\t"
  67245. #else
  67246. "adc r4, %[r]\n\t"
  67247. #endif
  67248. #ifdef WOLFSSL_KEIL
  67249. "adcs r2, r2, %[r]\n\t"
  67250. #elif defined(__clang__)
  67251. "adcs r2, %[r]\n\t"
  67252. #else
  67253. "adc r2, %[r]\n\t"
  67254. #endif
  67255. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67256. "lsrs r6, r7, #16\n\t"
  67257. #else
  67258. "lsr r6, r7, #16\n\t"
  67259. #endif
  67260. #ifdef WOLFSSL_KEIL
  67261. "muls r5, r6, r5\n\t"
  67262. #elif defined(__clang__)
  67263. "muls r5, r6\n\t"
  67264. #else
  67265. "mul r5, r6\n\t"
  67266. #endif
  67267. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67268. "lsrs r6, r5, #16\n\t"
  67269. #else
  67270. "lsr r6, r5, #16\n\t"
  67271. #endif
  67272. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67273. "lsls r5, r5, #16\n\t"
  67274. #else
  67275. "lsl r5, r5, #16\n\t"
  67276. #endif
  67277. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67278. "adds r3, r3, r5\n\t"
  67279. #else
  67280. "add r3, r3, r5\n\t"
  67281. #endif
  67282. #ifdef WOLFSSL_KEIL
  67283. "adcs r4, r4, r6\n\t"
  67284. #elif defined(__clang__)
  67285. "adcs r4, r6\n\t"
  67286. #else
  67287. "adc r4, r6\n\t"
  67288. #endif
  67289. #ifdef WOLFSSL_KEIL
  67290. "adcs r2, r2, %[r]\n\t"
  67291. #elif defined(__clang__)
  67292. "adcs r2, %[r]\n\t"
  67293. #else
  67294. "adc r2, %[r]\n\t"
  67295. #endif
  67296. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67297. "adds r3, r3, r5\n\t"
  67298. #else
  67299. "add r3, r3, r5\n\t"
  67300. #endif
  67301. #ifdef WOLFSSL_KEIL
  67302. "adcs r4, r4, r6\n\t"
  67303. #elif defined(__clang__)
  67304. "adcs r4, r6\n\t"
  67305. #else
  67306. "adc r4, r6\n\t"
  67307. #endif
  67308. #ifdef WOLFSSL_KEIL
  67309. "adcs r2, r2, %[r]\n\t"
  67310. #elif defined(__clang__)
  67311. "adcs r2, %[r]\n\t"
  67312. #else
  67313. "adc r2, %[r]\n\t"
  67314. #endif
  67315. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67316. "lsrs r5, %[a], #16\n\t"
  67317. #else
  67318. "lsr r5, %[a], #16\n\t"
  67319. #endif
  67320. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67321. "lsrs r6, r7, #16\n\t"
  67322. #else
  67323. "lsr r6, r7, #16\n\t"
  67324. #endif
  67325. #ifdef WOLFSSL_KEIL
  67326. "muls r6, r5, r6\n\t"
  67327. #elif defined(__clang__)
  67328. "muls r6, r5\n\t"
  67329. #else
  67330. "mul r6, r5\n\t"
  67331. #endif
  67332. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67333. "adds r4, r4, r6\n\t"
  67334. #else
  67335. "add r4, r4, r6\n\t"
  67336. #endif
  67337. #ifdef WOLFSSL_KEIL
  67338. "adcs r2, r2, %[r]\n\t"
  67339. #elif defined(__clang__)
  67340. "adcs r2, %[r]\n\t"
  67341. #else
  67342. "adc r2, %[r]\n\t"
  67343. #endif
  67344. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67345. "adds r4, r4, r6\n\t"
  67346. #else
  67347. "add r4, r4, r6\n\t"
  67348. #endif
  67349. #ifdef WOLFSSL_KEIL
  67350. "adcs r2, r2, %[r]\n\t"
  67351. #elif defined(__clang__)
  67352. "adcs r2, %[r]\n\t"
  67353. #else
  67354. "adc r2, %[r]\n\t"
  67355. #endif
  67356. "uxth r6, r7\n\t"
  67357. #ifdef WOLFSSL_KEIL
  67358. "muls r5, r6, r5\n\t"
  67359. #elif defined(__clang__)
  67360. "muls r5, r6\n\t"
  67361. #else
  67362. "mul r5, r6\n\t"
  67363. #endif
  67364. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67365. "lsrs r6, r5, #16\n\t"
  67366. #else
  67367. "lsr r6, r5, #16\n\t"
  67368. #endif
  67369. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67370. "lsls r5, r5, #16\n\t"
  67371. #else
  67372. "lsl r5, r5, #16\n\t"
  67373. #endif
  67374. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67375. "adds r3, r3, r5\n\t"
  67376. #else
  67377. "add r3, r3, r5\n\t"
  67378. #endif
  67379. #ifdef WOLFSSL_KEIL
  67380. "adcs r4, r4, r6\n\t"
  67381. #elif defined(__clang__)
  67382. "adcs r4, r6\n\t"
  67383. #else
  67384. "adc r4, r6\n\t"
  67385. #endif
  67386. #ifdef WOLFSSL_KEIL
  67387. "adcs r2, r2, %[r]\n\t"
  67388. #elif defined(__clang__)
  67389. "adcs r2, %[r]\n\t"
  67390. #else
  67391. "adc r2, %[r]\n\t"
  67392. #endif
  67393. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67394. "adds r3, r3, r5\n\t"
  67395. #else
  67396. "add r3, r3, r5\n\t"
  67397. #endif
  67398. #ifdef WOLFSSL_KEIL
  67399. "adcs r4, r4, r6\n\t"
  67400. #elif defined(__clang__)
  67401. "adcs r4, r6\n\t"
  67402. #else
  67403. "adc r4, r6\n\t"
  67404. #endif
  67405. #ifdef WOLFSSL_KEIL
  67406. "adcs r2, r2, %[r]\n\t"
  67407. #elif defined(__clang__)
  67408. "adcs r2, %[r]\n\t"
  67409. #else
  67410. "adc r2, %[r]\n\t"
  67411. #endif
  67412. "# A[9] * A[7]\n\t"
  67413. "mov %[a], r9\n\t"
  67414. "ldr r7, [%[a], #28]\n\t"
  67415. "mov %[a], r11\n\t"
  67416. "uxth r5, %[a]\n\t"
  67417. "uxth r6, r7\n\t"
  67418. #ifdef WOLFSSL_KEIL
  67419. "muls r6, r5, r6\n\t"
  67420. #elif defined(__clang__)
  67421. "muls r6, r5\n\t"
  67422. #else
  67423. "mul r6, r5\n\t"
  67424. #endif
  67425. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67426. "adds r3, r3, r6\n\t"
  67427. #else
  67428. "add r3, r3, r6\n\t"
  67429. #endif
  67430. #ifdef WOLFSSL_KEIL
  67431. "adcs r4, r4, %[r]\n\t"
  67432. #elif defined(__clang__)
  67433. "adcs r4, %[r]\n\t"
  67434. #else
  67435. "adc r4, %[r]\n\t"
  67436. #endif
  67437. #ifdef WOLFSSL_KEIL
  67438. "adcs r2, r2, %[r]\n\t"
  67439. #elif defined(__clang__)
  67440. "adcs r2, %[r]\n\t"
  67441. #else
  67442. "adc r2, %[r]\n\t"
  67443. #endif
  67444. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67445. "adds r3, r3, r6\n\t"
  67446. #else
  67447. "add r3, r3, r6\n\t"
  67448. #endif
  67449. #ifdef WOLFSSL_KEIL
  67450. "adcs r4, r4, %[r]\n\t"
  67451. #elif defined(__clang__)
  67452. "adcs r4, %[r]\n\t"
  67453. #else
  67454. "adc r4, %[r]\n\t"
  67455. #endif
  67456. #ifdef WOLFSSL_KEIL
  67457. "adcs r2, r2, %[r]\n\t"
  67458. #elif defined(__clang__)
  67459. "adcs r2, %[r]\n\t"
  67460. #else
  67461. "adc r2, %[r]\n\t"
  67462. #endif
  67463. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67464. "lsrs r6, r7, #16\n\t"
  67465. #else
  67466. "lsr r6, r7, #16\n\t"
  67467. #endif
  67468. #ifdef WOLFSSL_KEIL
  67469. "muls r5, r6, r5\n\t"
  67470. #elif defined(__clang__)
  67471. "muls r5, r6\n\t"
  67472. #else
  67473. "mul r5, r6\n\t"
  67474. #endif
  67475. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67476. "lsrs r6, r5, #16\n\t"
  67477. #else
  67478. "lsr r6, r5, #16\n\t"
  67479. #endif
  67480. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67481. "lsls r5, r5, #16\n\t"
  67482. #else
  67483. "lsl r5, r5, #16\n\t"
  67484. #endif
  67485. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67486. "adds r3, r3, r5\n\t"
  67487. #else
  67488. "add r3, r3, r5\n\t"
  67489. #endif
  67490. #ifdef WOLFSSL_KEIL
  67491. "adcs r4, r4, r6\n\t"
  67492. #elif defined(__clang__)
  67493. "adcs r4, r6\n\t"
  67494. #else
  67495. "adc r4, r6\n\t"
  67496. #endif
  67497. #ifdef WOLFSSL_KEIL
  67498. "adcs r2, r2, %[r]\n\t"
  67499. #elif defined(__clang__)
  67500. "adcs r2, %[r]\n\t"
  67501. #else
  67502. "adc r2, %[r]\n\t"
  67503. #endif
  67504. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67505. "adds r3, r3, r5\n\t"
  67506. #else
  67507. "add r3, r3, r5\n\t"
  67508. #endif
  67509. #ifdef WOLFSSL_KEIL
  67510. "adcs r4, r4, r6\n\t"
  67511. #elif defined(__clang__)
  67512. "adcs r4, r6\n\t"
  67513. #else
  67514. "adc r4, r6\n\t"
  67515. #endif
  67516. #ifdef WOLFSSL_KEIL
  67517. "adcs r2, r2, %[r]\n\t"
  67518. #elif defined(__clang__)
  67519. "adcs r2, %[r]\n\t"
  67520. #else
  67521. "adc r2, %[r]\n\t"
  67522. #endif
  67523. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67524. "lsrs r5, %[a], #16\n\t"
  67525. #else
  67526. "lsr r5, %[a], #16\n\t"
  67527. #endif
  67528. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67529. "lsrs r6, r7, #16\n\t"
  67530. #else
  67531. "lsr r6, r7, #16\n\t"
  67532. #endif
  67533. #ifdef WOLFSSL_KEIL
  67534. "muls r6, r5, r6\n\t"
  67535. #elif defined(__clang__)
  67536. "muls r6, r5\n\t"
  67537. #else
  67538. "mul r6, r5\n\t"
  67539. #endif
  67540. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67541. "adds r4, r4, r6\n\t"
  67542. #else
  67543. "add r4, r4, r6\n\t"
  67544. #endif
  67545. #ifdef WOLFSSL_KEIL
  67546. "adcs r2, r2, %[r]\n\t"
  67547. #elif defined(__clang__)
  67548. "adcs r2, %[r]\n\t"
  67549. #else
  67550. "adc r2, %[r]\n\t"
  67551. #endif
  67552. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67553. "adds r4, r4, r6\n\t"
  67554. #else
  67555. "add r4, r4, r6\n\t"
  67556. #endif
  67557. #ifdef WOLFSSL_KEIL
  67558. "adcs r2, r2, %[r]\n\t"
  67559. #elif defined(__clang__)
  67560. "adcs r2, %[r]\n\t"
  67561. #else
  67562. "adc r2, %[r]\n\t"
  67563. #endif
  67564. "uxth r6, r7\n\t"
  67565. #ifdef WOLFSSL_KEIL
  67566. "muls r5, r6, r5\n\t"
  67567. #elif defined(__clang__)
  67568. "muls r5, r6\n\t"
  67569. #else
  67570. "mul r5, r6\n\t"
  67571. #endif
  67572. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67573. "lsrs r6, r5, #16\n\t"
  67574. #else
  67575. "lsr r6, r5, #16\n\t"
  67576. #endif
  67577. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67578. "lsls r5, r5, #16\n\t"
  67579. #else
  67580. "lsl r5, r5, #16\n\t"
  67581. #endif
  67582. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67583. "adds r3, r3, r5\n\t"
  67584. #else
  67585. "add r3, r3, r5\n\t"
  67586. #endif
  67587. #ifdef WOLFSSL_KEIL
  67588. "adcs r4, r4, r6\n\t"
  67589. #elif defined(__clang__)
  67590. "adcs r4, r6\n\t"
  67591. #else
  67592. "adc r4, r6\n\t"
  67593. #endif
  67594. #ifdef WOLFSSL_KEIL
  67595. "adcs r2, r2, %[r]\n\t"
  67596. #elif defined(__clang__)
  67597. "adcs r2, %[r]\n\t"
  67598. #else
  67599. "adc r2, %[r]\n\t"
  67600. #endif
  67601. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67602. "adds r3, r3, r5\n\t"
  67603. #else
  67604. "add r3, r3, r5\n\t"
  67605. #endif
  67606. #ifdef WOLFSSL_KEIL
  67607. "adcs r4, r4, r6\n\t"
  67608. #elif defined(__clang__)
  67609. "adcs r4, r6\n\t"
  67610. #else
  67611. "adc r4, r6\n\t"
  67612. #endif
  67613. #ifdef WOLFSSL_KEIL
  67614. "adcs r2, r2, %[r]\n\t"
  67615. #elif defined(__clang__)
  67616. "adcs r2, %[r]\n\t"
  67617. #else
  67618. "adc r2, %[r]\n\t"
  67619. #endif
  67620. "# A[8] * A[8]\n\t"
  67621. "mov r7, r10\n\t"
  67622. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67623. "lsrs r6, r7, #16\n\t"
  67624. #else
  67625. "lsr r6, r7, #16\n\t"
  67626. #endif
  67627. "uxth r5, r7\n\t"
  67628. #ifdef WOLFSSL_KEIL
  67629. "muls r5, r5, r5\n\t"
  67630. #elif defined(__clang__)
  67631. "muls r5, r5\n\t"
  67632. #else
  67633. "mul r5, r5\n\t"
  67634. #endif
  67635. #ifdef WOLFSSL_KEIL
  67636. "muls r6, r6, r6\n\t"
  67637. #elif defined(__clang__)
  67638. "muls r6, r6\n\t"
  67639. #else
  67640. "mul r6, r6\n\t"
  67641. #endif
  67642. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67643. "adds r3, r3, r5\n\t"
  67644. #else
  67645. "add r3, r3, r5\n\t"
  67646. #endif
  67647. #ifdef WOLFSSL_KEIL
  67648. "adcs r4, r4, r6\n\t"
  67649. #elif defined(__clang__)
  67650. "adcs r4, r6\n\t"
  67651. #else
  67652. "adc r4, r6\n\t"
  67653. #endif
  67654. #ifdef WOLFSSL_KEIL
  67655. "adcs r2, r2, %[r]\n\t"
  67656. #elif defined(__clang__)
  67657. "adcs r2, %[r]\n\t"
  67658. #else
  67659. "adc r2, %[r]\n\t"
  67660. #endif
  67661. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67662. "lsrs r6, r7, #16\n\t"
  67663. #else
  67664. "lsr r6, r7, #16\n\t"
  67665. #endif
  67666. "uxth r5, r7\n\t"
  67667. #ifdef WOLFSSL_KEIL
  67668. "muls r5, r6, r5\n\t"
  67669. #elif defined(__clang__)
  67670. "muls r5, r6\n\t"
  67671. #else
  67672. "mul r5, r6\n\t"
  67673. #endif
  67674. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67675. "lsrs r6, r5, #15\n\t"
  67676. #else
  67677. "lsr r6, r5, #15\n\t"
  67678. #endif
  67679. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67680. "lsls r5, r5, #17\n\t"
  67681. #else
  67682. "lsl r5, r5, #17\n\t"
  67683. #endif
  67684. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67685. "adds r3, r3, r5\n\t"
  67686. #else
  67687. "add r3, r3, r5\n\t"
  67688. #endif
  67689. #ifdef WOLFSSL_KEIL
  67690. "adcs r4, r4, r6\n\t"
  67691. #elif defined(__clang__)
  67692. "adcs r4, r6\n\t"
  67693. #else
  67694. "adc r4, r6\n\t"
  67695. #endif
  67696. #ifdef WOLFSSL_KEIL
  67697. "adcs r2, r2, %[r]\n\t"
  67698. #elif defined(__clang__)
  67699. "adcs r2, %[r]\n\t"
  67700. #else
  67701. "adc r2, %[r]\n\t"
  67702. #endif
  67703. "mov %[r], r8\n\t"
  67704. "str r3, [%[r], #64]\n\t"
  67705. "movs %[r], #0\n\t"
  67706. "# A[9] * A[8]\n\t"
  67707. "movs r3, #0\n\t"
  67708. "mov %[a], r9\n\t"
  67709. "mov %[a], r11\n\t"
  67710. "uxth r5, %[a]\n\t"
  67711. "uxth r6, r7\n\t"
  67712. #ifdef WOLFSSL_KEIL
  67713. "muls r6, r5, r6\n\t"
  67714. #elif defined(__clang__)
  67715. "muls r6, r5\n\t"
  67716. #else
  67717. "mul r6, r5\n\t"
  67718. #endif
  67719. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67720. "adds r4, r4, r6\n\t"
  67721. #else
  67722. "add r4, r4, r6\n\t"
  67723. #endif
  67724. #ifdef WOLFSSL_KEIL
  67725. "adcs r2, r2, %[r]\n\t"
  67726. #elif defined(__clang__)
  67727. "adcs r2, %[r]\n\t"
  67728. #else
  67729. "adc r2, %[r]\n\t"
  67730. #endif
  67731. #ifdef WOLFSSL_KEIL
  67732. "adcs r3, r3, %[r]\n\t"
  67733. #elif defined(__clang__)
  67734. "adcs r3, %[r]\n\t"
  67735. #else
  67736. "adc r3, %[r]\n\t"
  67737. #endif
  67738. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67739. "adds r4, r4, r6\n\t"
  67740. #else
  67741. "add r4, r4, r6\n\t"
  67742. #endif
  67743. #ifdef WOLFSSL_KEIL
  67744. "adcs r2, r2, %[r]\n\t"
  67745. #elif defined(__clang__)
  67746. "adcs r2, %[r]\n\t"
  67747. #else
  67748. "adc r2, %[r]\n\t"
  67749. #endif
  67750. #ifdef WOLFSSL_KEIL
  67751. "adcs r3, r3, %[r]\n\t"
  67752. #elif defined(__clang__)
  67753. "adcs r3, %[r]\n\t"
  67754. #else
  67755. "adc r3, %[r]\n\t"
  67756. #endif
  67757. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67758. "lsrs r6, r7, #16\n\t"
  67759. #else
  67760. "lsr r6, r7, #16\n\t"
  67761. #endif
  67762. #ifdef WOLFSSL_KEIL
  67763. "muls r5, r6, r5\n\t"
  67764. #elif defined(__clang__)
  67765. "muls r5, r6\n\t"
  67766. #else
  67767. "mul r5, r6\n\t"
  67768. #endif
  67769. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67770. "lsrs r6, r5, #16\n\t"
  67771. #else
  67772. "lsr r6, r5, #16\n\t"
  67773. #endif
  67774. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67775. "lsls r5, r5, #16\n\t"
  67776. #else
  67777. "lsl r5, r5, #16\n\t"
  67778. #endif
  67779. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67780. "adds r4, r4, r5\n\t"
  67781. #else
  67782. "add r4, r4, r5\n\t"
  67783. #endif
  67784. #ifdef WOLFSSL_KEIL
  67785. "adcs r2, r2, r6\n\t"
  67786. #elif defined(__clang__)
  67787. "adcs r2, r6\n\t"
  67788. #else
  67789. "adc r2, r6\n\t"
  67790. #endif
  67791. #ifdef WOLFSSL_KEIL
  67792. "adcs r3, r3, %[r]\n\t"
  67793. #elif defined(__clang__)
  67794. "adcs r3, %[r]\n\t"
  67795. #else
  67796. "adc r3, %[r]\n\t"
  67797. #endif
  67798. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67799. "adds r4, r4, r5\n\t"
  67800. #else
  67801. "add r4, r4, r5\n\t"
  67802. #endif
  67803. #ifdef WOLFSSL_KEIL
  67804. "adcs r2, r2, r6\n\t"
  67805. #elif defined(__clang__)
  67806. "adcs r2, r6\n\t"
  67807. #else
  67808. "adc r2, r6\n\t"
  67809. #endif
  67810. #ifdef WOLFSSL_KEIL
  67811. "adcs r3, r3, %[r]\n\t"
  67812. #elif defined(__clang__)
  67813. "adcs r3, %[r]\n\t"
  67814. #else
  67815. "adc r3, %[r]\n\t"
  67816. #endif
  67817. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67818. "lsrs r5, %[a], #16\n\t"
  67819. #else
  67820. "lsr r5, %[a], #16\n\t"
  67821. #endif
  67822. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67823. "lsrs r6, r7, #16\n\t"
  67824. #else
  67825. "lsr r6, r7, #16\n\t"
  67826. #endif
  67827. #ifdef WOLFSSL_KEIL
  67828. "muls r6, r5, r6\n\t"
  67829. #elif defined(__clang__)
  67830. "muls r6, r5\n\t"
  67831. #else
  67832. "mul r6, r5\n\t"
  67833. #endif
  67834. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67835. "adds r2, r2, r6\n\t"
  67836. #else
  67837. "add r2, r2, r6\n\t"
  67838. #endif
  67839. #ifdef WOLFSSL_KEIL
  67840. "adcs r3, r3, %[r]\n\t"
  67841. #elif defined(__clang__)
  67842. "adcs r3, %[r]\n\t"
  67843. #else
  67844. "adc r3, %[r]\n\t"
  67845. #endif
  67846. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67847. "adds r2, r2, r6\n\t"
  67848. #else
  67849. "add r2, r2, r6\n\t"
  67850. #endif
  67851. #ifdef WOLFSSL_KEIL
  67852. "adcs r3, r3, %[r]\n\t"
  67853. #elif defined(__clang__)
  67854. "adcs r3, %[r]\n\t"
  67855. #else
  67856. "adc r3, %[r]\n\t"
  67857. #endif
  67858. "uxth r6, r7\n\t"
  67859. #ifdef WOLFSSL_KEIL
  67860. "muls r5, r6, r5\n\t"
  67861. #elif defined(__clang__)
  67862. "muls r5, r6\n\t"
  67863. #else
  67864. "mul r5, r6\n\t"
  67865. #endif
  67866. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67867. "lsrs r6, r5, #16\n\t"
  67868. #else
  67869. "lsr r6, r5, #16\n\t"
  67870. #endif
  67871. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67872. "lsls r5, r5, #16\n\t"
  67873. #else
  67874. "lsl r5, r5, #16\n\t"
  67875. #endif
  67876. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67877. "adds r4, r4, r5\n\t"
  67878. #else
  67879. "add r4, r4, r5\n\t"
  67880. #endif
  67881. #ifdef WOLFSSL_KEIL
  67882. "adcs r2, r2, r6\n\t"
  67883. #elif defined(__clang__)
  67884. "adcs r2, r6\n\t"
  67885. #else
  67886. "adc r2, r6\n\t"
  67887. #endif
  67888. #ifdef WOLFSSL_KEIL
  67889. "adcs r3, r3, %[r]\n\t"
  67890. #elif defined(__clang__)
  67891. "adcs r3, %[r]\n\t"
  67892. #else
  67893. "adc r3, %[r]\n\t"
  67894. #endif
  67895. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67896. "adds r4, r4, r5\n\t"
  67897. #else
  67898. "add r4, r4, r5\n\t"
  67899. #endif
  67900. #ifdef WOLFSSL_KEIL
  67901. "adcs r2, r2, r6\n\t"
  67902. #elif defined(__clang__)
  67903. "adcs r2, r6\n\t"
  67904. #else
  67905. "adc r2, r6\n\t"
  67906. #endif
  67907. #ifdef WOLFSSL_KEIL
  67908. "adcs r3, r3, %[r]\n\t"
  67909. #elif defined(__clang__)
  67910. "adcs r3, %[r]\n\t"
  67911. #else
  67912. "adc r3, %[r]\n\t"
  67913. #endif
  67914. "# A[10] * A[7]\n\t"
  67915. "mov %[a], r9\n\t"
  67916. "ldr r7, [%[a], #28]\n\t"
  67917. "mov %[a], r12\n\t"
  67918. "uxth r5, %[a]\n\t"
  67919. "uxth r6, r7\n\t"
  67920. #ifdef WOLFSSL_KEIL
  67921. "muls r6, r5, r6\n\t"
  67922. #elif defined(__clang__)
  67923. "muls r6, r5\n\t"
  67924. #else
  67925. "mul r6, r5\n\t"
  67926. #endif
  67927. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67928. "adds r4, r4, r6\n\t"
  67929. #else
  67930. "add r4, r4, r6\n\t"
  67931. #endif
  67932. #ifdef WOLFSSL_KEIL
  67933. "adcs r2, r2, %[r]\n\t"
  67934. #elif defined(__clang__)
  67935. "adcs r2, %[r]\n\t"
  67936. #else
  67937. "adc r2, %[r]\n\t"
  67938. #endif
  67939. #ifdef WOLFSSL_KEIL
  67940. "adcs r3, r3, %[r]\n\t"
  67941. #elif defined(__clang__)
  67942. "adcs r3, %[r]\n\t"
  67943. #else
  67944. "adc r3, %[r]\n\t"
  67945. #endif
  67946. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67947. "adds r4, r4, r6\n\t"
  67948. #else
  67949. "add r4, r4, r6\n\t"
  67950. #endif
  67951. #ifdef WOLFSSL_KEIL
  67952. "adcs r2, r2, %[r]\n\t"
  67953. #elif defined(__clang__)
  67954. "adcs r2, %[r]\n\t"
  67955. #else
  67956. "adc r2, %[r]\n\t"
  67957. #endif
  67958. #ifdef WOLFSSL_KEIL
  67959. "adcs r3, r3, %[r]\n\t"
  67960. #elif defined(__clang__)
  67961. "adcs r3, %[r]\n\t"
  67962. #else
  67963. "adc r3, %[r]\n\t"
  67964. #endif
  67965. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67966. "lsrs r6, r7, #16\n\t"
  67967. #else
  67968. "lsr r6, r7, #16\n\t"
  67969. #endif
  67970. #ifdef WOLFSSL_KEIL
  67971. "muls r5, r6, r5\n\t"
  67972. #elif defined(__clang__)
  67973. "muls r5, r6\n\t"
  67974. #else
  67975. "mul r5, r6\n\t"
  67976. #endif
  67977. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67978. "lsrs r6, r5, #16\n\t"
  67979. #else
  67980. "lsr r6, r5, #16\n\t"
  67981. #endif
  67982. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67983. "lsls r5, r5, #16\n\t"
  67984. #else
  67985. "lsl r5, r5, #16\n\t"
  67986. #endif
  67987. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67988. "adds r4, r4, r5\n\t"
  67989. #else
  67990. "add r4, r4, r5\n\t"
  67991. #endif
  67992. #ifdef WOLFSSL_KEIL
  67993. "adcs r2, r2, r6\n\t"
  67994. #elif defined(__clang__)
  67995. "adcs r2, r6\n\t"
  67996. #else
  67997. "adc r2, r6\n\t"
  67998. #endif
  67999. #ifdef WOLFSSL_KEIL
  68000. "adcs r3, r3, %[r]\n\t"
  68001. #elif defined(__clang__)
  68002. "adcs r3, %[r]\n\t"
  68003. #else
  68004. "adc r3, %[r]\n\t"
  68005. #endif
  68006. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68007. "adds r4, r4, r5\n\t"
  68008. #else
  68009. "add r4, r4, r5\n\t"
  68010. #endif
  68011. #ifdef WOLFSSL_KEIL
  68012. "adcs r2, r2, r6\n\t"
  68013. #elif defined(__clang__)
  68014. "adcs r2, r6\n\t"
  68015. #else
  68016. "adc r2, r6\n\t"
  68017. #endif
  68018. #ifdef WOLFSSL_KEIL
  68019. "adcs r3, r3, %[r]\n\t"
  68020. #elif defined(__clang__)
  68021. "adcs r3, %[r]\n\t"
  68022. #else
  68023. "adc r3, %[r]\n\t"
  68024. #endif
  68025. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68026. "lsrs r5, %[a], #16\n\t"
  68027. #else
  68028. "lsr r5, %[a], #16\n\t"
  68029. #endif
  68030. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68031. "lsrs r6, r7, #16\n\t"
  68032. #else
  68033. "lsr r6, r7, #16\n\t"
  68034. #endif
  68035. #ifdef WOLFSSL_KEIL
  68036. "muls r6, r5, r6\n\t"
  68037. #elif defined(__clang__)
  68038. "muls r6, r5\n\t"
  68039. #else
  68040. "mul r6, r5\n\t"
  68041. #endif
  68042. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68043. "adds r2, r2, r6\n\t"
  68044. #else
  68045. "add r2, r2, r6\n\t"
  68046. #endif
  68047. #ifdef WOLFSSL_KEIL
  68048. "adcs r3, r3, %[r]\n\t"
  68049. #elif defined(__clang__)
  68050. "adcs r3, %[r]\n\t"
  68051. #else
  68052. "adc r3, %[r]\n\t"
  68053. #endif
  68054. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68055. "adds r2, r2, r6\n\t"
  68056. #else
  68057. "add r2, r2, r6\n\t"
  68058. #endif
  68059. #ifdef WOLFSSL_KEIL
  68060. "adcs r3, r3, %[r]\n\t"
  68061. #elif defined(__clang__)
  68062. "adcs r3, %[r]\n\t"
  68063. #else
  68064. "adc r3, %[r]\n\t"
  68065. #endif
  68066. "uxth r6, r7\n\t"
  68067. #ifdef WOLFSSL_KEIL
  68068. "muls r5, r6, r5\n\t"
  68069. #elif defined(__clang__)
  68070. "muls r5, r6\n\t"
  68071. #else
  68072. "mul r5, r6\n\t"
  68073. #endif
  68074. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68075. "lsrs r6, r5, #16\n\t"
  68076. #else
  68077. "lsr r6, r5, #16\n\t"
  68078. #endif
  68079. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68080. "lsls r5, r5, #16\n\t"
  68081. #else
  68082. "lsl r5, r5, #16\n\t"
  68083. #endif
  68084. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68085. "adds r4, r4, r5\n\t"
  68086. #else
  68087. "add r4, r4, r5\n\t"
  68088. #endif
  68089. #ifdef WOLFSSL_KEIL
  68090. "adcs r2, r2, r6\n\t"
  68091. #elif defined(__clang__)
  68092. "adcs r2, r6\n\t"
  68093. #else
  68094. "adc r2, r6\n\t"
  68095. #endif
  68096. #ifdef WOLFSSL_KEIL
  68097. "adcs r3, r3, %[r]\n\t"
  68098. #elif defined(__clang__)
  68099. "adcs r3, %[r]\n\t"
  68100. #else
  68101. "adc r3, %[r]\n\t"
  68102. #endif
  68103. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68104. "adds r4, r4, r5\n\t"
  68105. #else
  68106. "add r4, r4, r5\n\t"
  68107. #endif
  68108. #ifdef WOLFSSL_KEIL
  68109. "adcs r2, r2, r6\n\t"
  68110. #elif defined(__clang__)
  68111. "adcs r2, r6\n\t"
  68112. #else
  68113. "adc r2, r6\n\t"
  68114. #endif
  68115. #ifdef WOLFSSL_KEIL
  68116. "adcs r3, r3, %[r]\n\t"
  68117. #elif defined(__clang__)
  68118. "adcs r3, %[r]\n\t"
  68119. #else
  68120. "adc r3, %[r]\n\t"
  68121. #endif
  68122. "# A[11] * A[6]\n\t"
  68123. "mov %[a], r9\n\t"
  68124. "ldr r7, [%[a], #24]\n\t"
  68125. "mov %[a], lr\n\t"
  68126. "uxth r5, %[a]\n\t"
  68127. "uxth r6, r7\n\t"
  68128. #ifdef WOLFSSL_KEIL
  68129. "muls r6, r5, r6\n\t"
  68130. #elif defined(__clang__)
  68131. "muls r6, r5\n\t"
  68132. #else
  68133. "mul r6, r5\n\t"
  68134. #endif
  68135. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68136. "adds r4, r4, r6\n\t"
  68137. #else
  68138. "add r4, r4, r6\n\t"
  68139. #endif
  68140. #ifdef WOLFSSL_KEIL
  68141. "adcs r2, r2, %[r]\n\t"
  68142. #elif defined(__clang__)
  68143. "adcs r2, %[r]\n\t"
  68144. #else
  68145. "adc r2, %[r]\n\t"
  68146. #endif
  68147. #ifdef WOLFSSL_KEIL
  68148. "adcs r3, r3, %[r]\n\t"
  68149. #elif defined(__clang__)
  68150. "adcs r3, %[r]\n\t"
  68151. #else
  68152. "adc r3, %[r]\n\t"
  68153. #endif
  68154. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68155. "adds r4, r4, r6\n\t"
  68156. #else
  68157. "add r4, r4, r6\n\t"
  68158. #endif
  68159. #ifdef WOLFSSL_KEIL
  68160. "adcs r2, r2, %[r]\n\t"
  68161. #elif defined(__clang__)
  68162. "adcs r2, %[r]\n\t"
  68163. #else
  68164. "adc r2, %[r]\n\t"
  68165. #endif
  68166. #ifdef WOLFSSL_KEIL
  68167. "adcs r3, r3, %[r]\n\t"
  68168. #elif defined(__clang__)
  68169. "adcs r3, %[r]\n\t"
  68170. #else
  68171. "adc r3, %[r]\n\t"
  68172. #endif
  68173. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68174. "lsrs r6, r7, #16\n\t"
  68175. #else
  68176. "lsr r6, r7, #16\n\t"
  68177. #endif
  68178. #ifdef WOLFSSL_KEIL
  68179. "muls r5, r6, r5\n\t"
  68180. #elif defined(__clang__)
  68181. "muls r5, r6\n\t"
  68182. #else
  68183. "mul r5, r6\n\t"
  68184. #endif
  68185. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68186. "lsrs r6, r5, #16\n\t"
  68187. #else
  68188. "lsr r6, r5, #16\n\t"
  68189. #endif
  68190. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68191. "lsls r5, r5, #16\n\t"
  68192. #else
  68193. "lsl r5, r5, #16\n\t"
  68194. #endif
  68195. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68196. "adds r4, r4, r5\n\t"
  68197. #else
  68198. "add r4, r4, r5\n\t"
  68199. #endif
  68200. #ifdef WOLFSSL_KEIL
  68201. "adcs r2, r2, r6\n\t"
  68202. #elif defined(__clang__)
  68203. "adcs r2, r6\n\t"
  68204. #else
  68205. "adc r2, r6\n\t"
  68206. #endif
  68207. #ifdef WOLFSSL_KEIL
  68208. "adcs r3, r3, %[r]\n\t"
  68209. #elif defined(__clang__)
  68210. "adcs r3, %[r]\n\t"
  68211. #else
  68212. "adc r3, %[r]\n\t"
  68213. #endif
  68214. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68215. "adds r4, r4, r5\n\t"
  68216. #else
  68217. "add r4, r4, r5\n\t"
  68218. #endif
  68219. #ifdef WOLFSSL_KEIL
  68220. "adcs r2, r2, r6\n\t"
  68221. #elif defined(__clang__)
  68222. "adcs r2, r6\n\t"
  68223. #else
  68224. "adc r2, r6\n\t"
  68225. #endif
  68226. #ifdef WOLFSSL_KEIL
  68227. "adcs r3, r3, %[r]\n\t"
  68228. #elif defined(__clang__)
  68229. "adcs r3, %[r]\n\t"
  68230. #else
  68231. "adc r3, %[r]\n\t"
  68232. #endif
  68233. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68234. "lsrs r5, %[a], #16\n\t"
  68235. #else
  68236. "lsr r5, %[a], #16\n\t"
  68237. #endif
  68238. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68239. "lsrs r6, r7, #16\n\t"
  68240. #else
  68241. "lsr r6, r7, #16\n\t"
  68242. #endif
  68243. #ifdef WOLFSSL_KEIL
  68244. "muls r6, r5, r6\n\t"
  68245. #elif defined(__clang__)
  68246. "muls r6, r5\n\t"
  68247. #else
  68248. "mul r6, r5\n\t"
  68249. #endif
  68250. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68251. "adds r2, r2, r6\n\t"
  68252. #else
  68253. "add r2, r2, r6\n\t"
  68254. #endif
  68255. #ifdef WOLFSSL_KEIL
  68256. "adcs r3, r3, %[r]\n\t"
  68257. #elif defined(__clang__)
  68258. "adcs r3, %[r]\n\t"
  68259. #else
  68260. "adc r3, %[r]\n\t"
  68261. #endif
  68262. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68263. "adds r2, r2, r6\n\t"
  68264. #else
  68265. "add r2, r2, r6\n\t"
  68266. #endif
  68267. #ifdef WOLFSSL_KEIL
  68268. "adcs r3, r3, %[r]\n\t"
  68269. #elif defined(__clang__)
  68270. "adcs r3, %[r]\n\t"
  68271. #else
  68272. "adc r3, %[r]\n\t"
  68273. #endif
  68274. "uxth r6, r7\n\t"
  68275. #ifdef WOLFSSL_KEIL
  68276. "muls r5, r6, r5\n\t"
  68277. #elif defined(__clang__)
  68278. "muls r5, r6\n\t"
  68279. #else
  68280. "mul r5, r6\n\t"
  68281. #endif
  68282. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68283. "lsrs r6, r5, #16\n\t"
  68284. #else
  68285. "lsr r6, r5, #16\n\t"
  68286. #endif
  68287. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68288. "lsls r5, r5, #16\n\t"
  68289. #else
  68290. "lsl r5, r5, #16\n\t"
  68291. #endif
  68292. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68293. "adds r4, r4, r5\n\t"
  68294. #else
  68295. "add r4, r4, r5\n\t"
  68296. #endif
  68297. #ifdef WOLFSSL_KEIL
  68298. "adcs r2, r2, r6\n\t"
  68299. #elif defined(__clang__)
  68300. "adcs r2, r6\n\t"
  68301. #else
  68302. "adc r2, r6\n\t"
  68303. #endif
  68304. #ifdef WOLFSSL_KEIL
  68305. "adcs r3, r3, %[r]\n\t"
  68306. #elif defined(__clang__)
  68307. "adcs r3, %[r]\n\t"
  68308. #else
  68309. "adc r3, %[r]\n\t"
  68310. #endif
  68311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68312. "adds r4, r4, r5\n\t"
  68313. #else
  68314. "add r4, r4, r5\n\t"
  68315. #endif
  68316. #ifdef WOLFSSL_KEIL
  68317. "adcs r2, r2, r6\n\t"
  68318. #elif defined(__clang__)
  68319. "adcs r2, r6\n\t"
  68320. #else
  68321. "adc r2, r6\n\t"
  68322. #endif
  68323. #ifdef WOLFSSL_KEIL
  68324. "adcs r3, r3, %[r]\n\t"
  68325. #elif defined(__clang__)
  68326. "adcs r3, %[r]\n\t"
  68327. #else
  68328. "adc r3, %[r]\n\t"
  68329. #endif
  68330. "mov %[r], r8\n\t"
  68331. "str r4, [%[r], #68]\n\t"
  68332. "movs %[r], #0\n\t"
  68333. "# A[11] * A[7]\n\t"
  68334. "movs r4, #0\n\t"
  68335. "mov %[a], r9\n\t"
  68336. "ldr r7, [%[a], #28]\n\t"
  68337. "mov %[a], lr\n\t"
  68338. "uxth r5, %[a]\n\t"
  68339. "uxth r6, r7\n\t"
  68340. #ifdef WOLFSSL_KEIL
  68341. "muls r6, r5, r6\n\t"
  68342. #elif defined(__clang__)
  68343. "muls r6, r5\n\t"
  68344. #else
  68345. "mul r6, r5\n\t"
  68346. #endif
  68347. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68348. "adds r2, r2, r6\n\t"
  68349. #else
  68350. "add r2, r2, r6\n\t"
  68351. #endif
  68352. #ifdef WOLFSSL_KEIL
  68353. "adcs r3, r3, %[r]\n\t"
  68354. #elif defined(__clang__)
  68355. "adcs r3, %[r]\n\t"
  68356. #else
  68357. "adc r3, %[r]\n\t"
  68358. #endif
  68359. #ifdef WOLFSSL_KEIL
  68360. "adcs r4, r4, %[r]\n\t"
  68361. #elif defined(__clang__)
  68362. "adcs r4, %[r]\n\t"
  68363. #else
  68364. "adc r4, %[r]\n\t"
  68365. #endif
  68366. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68367. "adds r2, r2, r6\n\t"
  68368. #else
  68369. "add r2, r2, r6\n\t"
  68370. #endif
  68371. #ifdef WOLFSSL_KEIL
  68372. "adcs r3, r3, %[r]\n\t"
  68373. #elif defined(__clang__)
  68374. "adcs r3, %[r]\n\t"
  68375. #else
  68376. "adc r3, %[r]\n\t"
  68377. #endif
  68378. #ifdef WOLFSSL_KEIL
  68379. "adcs r4, r4, %[r]\n\t"
  68380. #elif defined(__clang__)
  68381. "adcs r4, %[r]\n\t"
  68382. #else
  68383. "adc r4, %[r]\n\t"
  68384. #endif
  68385. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68386. "lsrs r6, r7, #16\n\t"
  68387. #else
  68388. "lsr r6, r7, #16\n\t"
  68389. #endif
  68390. #ifdef WOLFSSL_KEIL
  68391. "muls r5, r6, r5\n\t"
  68392. #elif defined(__clang__)
  68393. "muls r5, r6\n\t"
  68394. #else
  68395. "mul r5, r6\n\t"
  68396. #endif
  68397. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68398. "lsrs r6, r5, #16\n\t"
  68399. #else
  68400. "lsr r6, r5, #16\n\t"
  68401. #endif
  68402. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68403. "lsls r5, r5, #16\n\t"
  68404. #else
  68405. "lsl r5, r5, #16\n\t"
  68406. #endif
  68407. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68408. "adds r2, r2, r5\n\t"
  68409. #else
  68410. "add r2, r2, r5\n\t"
  68411. #endif
  68412. #ifdef WOLFSSL_KEIL
  68413. "adcs r3, r3, r6\n\t"
  68414. #elif defined(__clang__)
  68415. "adcs r3, r6\n\t"
  68416. #else
  68417. "adc r3, r6\n\t"
  68418. #endif
  68419. #ifdef WOLFSSL_KEIL
  68420. "adcs r4, r4, %[r]\n\t"
  68421. #elif defined(__clang__)
  68422. "adcs r4, %[r]\n\t"
  68423. #else
  68424. "adc r4, %[r]\n\t"
  68425. #endif
  68426. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68427. "adds r2, r2, r5\n\t"
  68428. #else
  68429. "add r2, r2, r5\n\t"
  68430. #endif
  68431. #ifdef WOLFSSL_KEIL
  68432. "adcs r3, r3, r6\n\t"
  68433. #elif defined(__clang__)
  68434. "adcs r3, r6\n\t"
  68435. #else
  68436. "adc r3, r6\n\t"
  68437. #endif
  68438. #ifdef WOLFSSL_KEIL
  68439. "adcs r4, r4, %[r]\n\t"
  68440. #elif defined(__clang__)
  68441. "adcs r4, %[r]\n\t"
  68442. #else
  68443. "adc r4, %[r]\n\t"
  68444. #endif
  68445. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68446. "lsrs r5, %[a], #16\n\t"
  68447. #else
  68448. "lsr r5, %[a], #16\n\t"
  68449. #endif
  68450. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68451. "lsrs r6, r7, #16\n\t"
  68452. #else
  68453. "lsr r6, r7, #16\n\t"
  68454. #endif
  68455. #ifdef WOLFSSL_KEIL
  68456. "muls r6, r5, r6\n\t"
  68457. #elif defined(__clang__)
  68458. "muls r6, r5\n\t"
  68459. #else
  68460. "mul r6, r5\n\t"
  68461. #endif
  68462. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68463. "adds r3, r3, r6\n\t"
  68464. #else
  68465. "add r3, r3, r6\n\t"
  68466. #endif
  68467. #ifdef WOLFSSL_KEIL
  68468. "adcs r4, r4, %[r]\n\t"
  68469. #elif defined(__clang__)
  68470. "adcs r4, %[r]\n\t"
  68471. #else
  68472. "adc r4, %[r]\n\t"
  68473. #endif
  68474. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68475. "adds r3, r3, r6\n\t"
  68476. #else
  68477. "add r3, r3, r6\n\t"
  68478. #endif
  68479. #ifdef WOLFSSL_KEIL
  68480. "adcs r4, r4, %[r]\n\t"
  68481. #elif defined(__clang__)
  68482. "adcs r4, %[r]\n\t"
  68483. #else
  68484. "adc r4, %[r]\n\t"
  68485. #endif
  68486. "uxth r6, r7\n\t"
  68487. #ifdef WOLFSSL_KEIL
  68488. "muls r5, r6, r5\n\t"
  68489. #elif defined(__clang__)
  68490. "muls r5, r6\n\t"
  68491. #else
  68492. "mul r5, r6\n\t"
  68493. #endif
  68494. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68495. "lsrs r6, r5, #16\n\t"
  68496. #else
  68497. "lsr r6, r5, #16\n\t"
  68498. #endif
  68499. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68500. "lsls r5, r5, #16\n\t"
  68501. #else
  68502. "lsl r5, r5, #16\n\t"
  68503. #endif
  68504. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68505. "adds r2, r2, r5\n\t"
  68506. #else
  68507. "add r2, r2, r5\n\t"
  68508. #endif
  68509. #ifdef WOLFSSL_KEIL
  68510. "adcs r3, r3, r6\n\t"
  68511. #elif defined(__clang__)
  68512. "adcs r3, r6\n\t"
  68513. #else
  68514. "adc r3, r6\n\t"
  68515. #endif
  68516. #ifdef WOLFSSL_KEIL
  68517. "adcs r4, r4, %[r]\n\t"
  68518. #elif defined(__clang__)
  68519. "adcs r4, %[r]\n\t"
  68520. #else
  68521. "adc r4, %[r]\n\t"
  68522. #endif
  68523. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68524. "adds r2, r2, r5\n\t"
  68525. #else
  68526. "add r2, r2, r5\n\t"
  68527. #endif
  68528. #ifdef WOLFSSL_KEIL
  68529. "adcs r3, r3, r6\n\t"
  68530. #elif defined(__clang__)
  68531. "adcs r3, r6\n\t"
  68532. #else
  68533. "adc r3, r6\n\t"
  68534. #endif
  68535. #ifdef WOLFSSL_KEIL
  68536. "adcs r4, r4, %[r]\n\t"
  68537. #elif defined(__clang__)
  68538. "adcs r4, %[r]\n\t"
  68539. #else
  68540. "adc r4, %[r]\n\t"
  68541. #endif
  68542. "# A[10] * A[8]\n\t"
  68543. "mov %[a], r9\n\t"
  68544. "mov r7, r10\n\t"
  68545. "mov %[a], r12\n\t"
  68546. "uxth r5, %[a]\n\t"
  68547. "uxth r6, r7\n\t"
  68548. #ifdef WOLFSSL_KEIL
  68549. "muls r6, r5, r6\n\t"
  68550. #elif defined(__clang__)
  68551. "muls r6, r5\n\t"
  68552. #else
  68553. "mul r6, r5\n\t"
  68554. #endif
  68555. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68556. "adds r2, r2, r6\n\t"
  68557. #else
  68558. "add r2, r2, r6\n\t"
  68559. #endif
  68560. #ifdef WOLFSSL_KEIL
  68561. "adcs r3, r3, %[r]\n\t"
  68562. #elif defined(__clang__)
  68563. "adcs r3, %[r]\n\t"
  68564. #else
  68565. "adc r3, %[r]\n\t"
  68566. #endif
  68567. #ifdef WOLFSSL_KEIL
  68568. "adcs r4, r4, %[r]\n\t"
  68569. #elif defined(__clang__)
  68570. "adcs r4, %[r]\n\t"
  68571. #else
  68572. "adc r4, %[r]\n\t"
  68573. #endif
  68574. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68575. "adds r2, r2, r6\n\t"
  68576. #else
  68577. "add r2, r2, r6\n\t"
  68578. #endif
  68579. #ifdef WOLFSSL_KEIL
  68580. "adcs r3, r3, %[r]\n\t"
  68581. #elif defined(__clang__)
  68582. "adcs r3, %[r]\n\t"
  68583. #else
  68584. "adc r3, %[r]\n\t"
  68585. #endif
  68586. #ifdef WOLFSSL_KEIL
  68587. "adcs r4, r4, %[r]\n\t"
  68588. #elif defined(__clang__)
  68589. "adcs r4, %[r]\n\t"
  68590. #else
  68591. "adc r4, %[r]\n\t"
  68592. #endif
  68593. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68594. "lsrs r6, r7, #16\n\t"
  68595. #else
  68596. "lsr r6, r7, #16\n\t"
  68597. #endif
  68598. #ifdef WOLFSSL_KEIL
  68599. "muls r5, r6, r5\n\t"
  68600. #elif defined(__clang__)
  68601. "muls r5, r6\n\t"
  68602. #else
  68603. "mul r5, r6\n\t"
  68604. #endif
  68605. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68606. "lsrs r6, r5, #16\n\t"
  68607. #else
  68608. "lsr r6, r5, #16\n\t"
  68609. #endif
  68610. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68611. "lsls r5, r5, #16\n\t"
  68612. #else
  68613. "lsl r5, r5, #16\n\t"
  68614. #endif
  68615. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68616. "adds r2, r2, r5\n\t"
  68617. #else
  68618. "add r2, r2, r5\n\t"
  68619. #endif
  68620. #ifdef WOLFSSL_KEIL
  68621. "adcs r3, r3, r6\n\t"
  68622. #elif defined(__clang__)
  68623. "adcs r3, r6\n\t"
  68624. #else
  68625. "adc r3, r6\n\t"
  68626. #endif
  68627. #ifdef WOLFSSL_KEIL
  68628. "adcs r4, r4, %[r]\n\t"
  68629. #elif defined(__clang__)
  68630. "adcs r4, %[r]\n\t"
  68631. #else
  68632. "adc r4, %[r]\n\t"
  68633. #endif
  68634. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68635. "adds r2, r2, r5\n\t"
  68636. #else
  68637. "add r2, r2, r5\n\t"
  68638. #endif
  68639. #ifdef WOLFSSL_KEIL
  68640. "adcs r3, r3, r6\n\t"
  68641. #elif defined(__clang__)
  68642. "adcs r3, r6\n\t"
  68643. #else
  68644. "adc r3, r6\n\t"
  68645. #endif
  68646. #ifdef WOLFSSL_KEIL
  68647. "adcs r4, r4, %[r]\n\t"
  68648. #elif defined(__clang__)
  68649. "adcs r4, %[r]\n\t"
  68650. #else
  68651. "adc r4, %[r]\n\t"
  68652. #endif
  68653. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68654. "lsrs r5, %[a], #16\n\t"
  68655. #else
  68656. "lsr r5, %[a], #16\n\t"
  68657. #endif
  68658. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68659. "lsrs r6, r7, #16\n\t"
  68660. #else
  68661. "lsr r6, r7, #16\n\t"
  68662. #endif
  68663. #ifdef WOLFSSL_KEIL
  68664. "muls r6, r5, r6\n\t"
  68665. #elif defined(__clang__)
  68666. "muls r6, r5\n\t"
  68667. #else
  68668. "mul r6, r5\n\t"
  68669. #endif
  68670. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68671. "adds r3, r3, r6\n\t"
  68672. #else
  68673. "add r3, r3, r6\n\t"
  68674. #endif
  68675. #ifdef WOLFSSL_KEIL
  68676. "adcs r4, r4, %[r]\n\t"
  68677. #elif defined(__clang__)
  68678. "adcs r4, %[r]\n\t"
  68679. #else
  68680. "adc r4, %[r]\n\t"
  68681. #endif
  68682. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68683. "adds r3, r3, r6\n\t"
  68684. #else
  68685. "add r3, r3, r6\n\t"
  68686. #endif
  68687. #ifdef WOLFSSL_KEIL
  68688. "adcs r4, r4, %[r]\n\t"
  68689. #elif defined(__clang__)
  68690. "adcs r4, %[r]\n\t"
  68691. #else
  68692. "adc r4, %[r]\n\t"
  68693. #endif
  68694. "uxth r6, r7\n\t"
  68695. #ifdef WOLFSSL_KEIL
  68696. "muls r5, r6, r5\n\t"
  68697. #elif defined(__clang__)
  68698. "muls r5, r6\n\t"
  68699. #else
  68700. "mul r5, r6\n\t"
  68701. #endif
  68702. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68703. "lsrs r6, r5, #16\n\t"
  68704. #else
  68705. "lsr r6, r5, #16\n\t"
  68706. #endif
  68707. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68708. "lsls r5, r5, #16\n\t"
  68709. #else
  68710. "lsl r5, r5, #16\n\t"
  68711. #endif
  68712. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68713. "adds r2, r2, r5\n\t"
  68714. #else
  68715. "add r2, r2, r5\n\t"
  68716. #endif
  68717. #ifdef WOLFSSL_KEIL
  68718. "adcs r3, r3, r6\n\t"
  68719. #elif defined(__clang__)
  68720. "adcs r3, r6\n\t"
  68721. #else
  68722. "adc r3, r6\n\t"
  68723. #endif
  68724. #ifdef WOLFSSL_KEIL
  68725. "adcs r4, r4, %[r]\n\t"
  68726. #elif defined(__clang__)
  68727. "adcs r4, %[r]\n\t"
  68728. #else
  68729. "adc r4, %[r]\n\t"
  68730. #endif
  68731. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68732. "adds r2, r2, r5\n\t"
  68733. #else
  68734. "add r2, r2, r5\n\t"
  68735. #endif
  68736. #ifdef WOLFSSL_KEIL
  68737. "adcs r3, r3, r6\n\t"
  68738. #elif defined(__clang__)
  68739. "adcs r3, r6\n\t"
  68740. #else
  68741. "adc r3, r6\n\t"
  68742. #endif
  68743. #ifdef WOLFSSL_KEIL
  68744. "adcs r4, r4, %[r]\n\t"
  68745. #elif defined(__clang__)
  68746. "adcs r4, %[r]\n\t"
  68747. #else
  68748. "adc r4, %[r]\n\t"
  68749. #endif
  68750. "# A[9] * A[9]\n\t"
  68751. "mov r7, r11\n\t"
  68752. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68753. "lsrs r6, r7, #16\n\t"
  68754. #else
  68755. "lsr r6, r7, #16\n\t"
  68756. #endif
  68757. "uxth r5, r7\n\t"
  68758. #ifdef WOLFSSL_KEIL
  68759. "muls r5, r5, r5\n\t"
  68760. #elif defined(__clang__)
  68761. "muls r5, r5\n\t"
  68762. #else
  68763. "mul r5, r5\n\t"
  68764. #endif
  68765. #ifdef WOLFSSL_KEIL
  68766. "muls r6, r6, r6\n\t"
  68767. #elif defined(__clang__)
  68768. "muls r6, r6\n\t"
  68769. #else
  68770. "mul r6, r6\n\t"
  68771. #endif
  68772. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68773. "adds r2, r2, r5\n\t"
  68774. #else
  68775. "add r2, r2, r5\n\t"
  68776. #endif
  68777. #ifdef WOLFSSL_KEIL
  68778. "adcs r3, r3, r6\n\t"
  68779. #elif defined(__clang__)
  68780. "adcs r3, r6\n\t"
  68781. #else
  68782. "adc r3, r6\n\t"
  68783. #endif
  68784. #ifdef WOLFSSL_KEIL
  68785. "adcs r4, r4, %[r]\n\t"
  68786. #elif defined(__clang__)
  68787. "adcs r4, %[r]\n\t"
  68788. #else
  68789. "adc r4, %[r]\n\t"
  68790. #endif
  68791. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68792. "lsrs r6, r7, #16\n\t"
  68793. #else
  68794. "lsr r6, r7, #16\n\t"
  68795. #endif
  68796. "uxth r5, r7\n\t"
  68797. #ifdef WOLFSSL_KEIL
  68798. "muls r5, r6, r5\n\t"
  68799. #elif defined(__clang__)
  68800. "muls r5, r6\n\t"
  68801. #else
  68802. "mul r5, r6\n\t"
  68803. #endif
  68804. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68805. "lsrs r6, r5, #15\n\t"
  68806. #else
  68807. "lsr r6, r5, #15\n\t"
  68808. #endif
  68809. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68810. "lsls r5, r5, #17\n\t"
  68811. #else
  68812. "lsl r5, r5, #17\n\t"
  68813. #endif
  68814. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68815. "adds r2, r2, r5\n\t"
  68816. #else
  68817. "add r2, r2, r5\n\t"
  68818. #endif
  68819. #ifdef WOLFSSL_KEIL
  68820. "adcs r3, r3, r6\n\t"
  68821. #elif defined(__clang__)
  68822. "adcs r3, r6\n\t"
  68823. #else
  68824. "adc r3, r6\n\t"
  68825. #endif
  68826. #ifdef WOLFSSL_KEIL
  68827. "adcs r4, r4, %[r]\n\t"
  68828. #elif defined(__clang__)
  68829. "adcs r4, %[r]\n\t"
  68830. #else
  68831. "adc r4, %[r]\n\t"
  68832. #endif
  68833. "mov %[r], r8\n\t"
  68834. "str r2, [%[r], #72]\n\t"
  68835. "movs %[r], #0\n\t"
  68836. "# A[10] * A[9]\n\t"
  68837. "movs r2, #0\n\t"
  68838. "mov %[a], r9\n\t"
  68839. "mov %[a], r12\n\t"
  68840. "uxth r5, %[a]\n\t"
  68841. "uxth r6, r7\n\t"
  68842. #ifdef WOLFSSL_KEIL
  68843. "muls r6, r5, r6\n\t"
  68844. #elif defined(__clang__)
  68845. "muls r6, r5\n\t"
  68846. #else
  68847. "mul r6, r5\n\t"
  68848. #endif
  68849. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68850. "adds r3, r3, r6\n\t"
  68851. #else
  68852. "add r3, r3, r6\n\t"
  68853. #endif
  68854. #ifdef WOLFSSL_KEIL
  68855. "adcs r4, r4, %[r]\n\t"
  68856. #elif defined(__clang__)
  68857. "adcs r4, %[r]\n\t"
  68858. #else
  68859. "adc r4, %[r]\n\t"
  68860. #endif
  68861. #ifdef WOLFSSL_KEIL
  68862. "adcs r2, r2, %[r]\n\t"
  68863. #elif defined(__clang__)
  68864. "adcs r2, %[r]\n\t"
  68865. #else
  68866. "adc r2, %[r]\n\t"
  68867. #endif
  68868. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68869. "adds r3, r3, r6\n\t"
  68870. #else
  68871. "add r3, r3, r6\n\t"
  68872. #endif
  68873. #ifdef WOLFSSL_KEIL
  68874. "adcs r4, r4, %[r]\n\t"
  68875. #elif defined(__clang__)
  68876. "adcs r4, %[r]\n\t"
  68877. #else
  68878. "adc r4, %[r]\n\t"
  68879. #endif
  68880. #ifdef WOLFSSL_KEIL
  68881. "adcs r2, r2, %[r]\n\t"
  68882. #elif defined(__clang__)
  68883. "adcs r2, %[r]\n\t"
  68884. #else
  68885. "adc r2, %[r]\n\t"
  68886. #endif
  68887. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68888. "lsrs r6, r7, #16\n\t"
  68889. #else
  68890. "lsr r6, r7, #16\n\t"
  68891. #endif
  68892. #ifdef WOLFSSL_KEIL
  68893. "muls r5, r6, r5\n\t"
  68894. #elif defined(__clang__)
  68895. "muls r5, r6\n\t"
  68896. #else
  68897. "mul r5, r6\n\t"
  68898. #endif
  68899. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68900. "lsrs r6, r5, #16\n\t"
  68901. #else
  68902. "lsr r6, r5, #16\n\t"
  68903. #endif
  68904. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68905. "lsls r5, r5, #16\n\t"
  68906. #else
  68907. "lsl r5, r5, #16\n\t"
  68908. #endif
  68909. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68910. "adds r3, r3, r5\n\t"
  68911. #else
  68912. "add r3, r3, r5\n\t"
  68913. #endif
  68914. #ifdef WOLFSSL_KEIL
  68915. "adcs r4, r4, r6\n\t"
  68916. #elif defined(__clang__)
  68917. "adcs r4, r6\n\t"
  68918. #else
  68919. "adc r4, r6\n\t"
  68920. #endif
  68921. #ifdef WOLFSSL_KEIL
  68922. "adcs r2, r2, %[r]\n\t"
  68923. #elif defined(__clang__)
  68924. "adcs r2, %[r]\n\t"
  68925. #else
  68926. "adc r2, %[r]\n\t"
  68927. #endif
  68928. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68929. "adds r3, r3, r5\n\t"
  68930. #else
  68931. "add r3, r3, r5\n\t"
  68932. #endif
  68933. #ifdef WOLFSSL_KEIL
  68934. "adcs r4, r4, r6\n\t"
  68935. #elif defined(__clang__)
  68936. "adcs r4, r6\n\t"
  68937. #else
  68938. "adc r4, r6\n\t"
  68939. #endif
  68940. #ifdef WOLFSSL_KEIL
  68941. "adcs r2, r2, %[r]\n\t"
  68942. #elif defined(__clang__)
  68943. "adcs r2, %[r]\n\t"
  68944. #else
  68945. "adc r2, %[r]\n\t"
  68946. #endif
  68947. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68948. "lsrs r5, %[a], #16\n\t"
  68949. #else
  68950. "lsr r5, %[a], #16\n\t"
  68951. #endif
  68952. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68953. "lsrs r6, r7, #16\n\t"
  68954. #else
  68955. "lsr r6, r7, #16\n\t"
  68956. #endif
  68957. #ifdef WOLFSSL_KEIL
  68958. "muls r6, r5, r6\n\t"
  68959. #elif defined(__clang__)
  68960. "muls r6, r5\n\t"
  68961. #else
  68962. "mul r6, r5\n\t"
  68963. #endif
  68964. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68965. "adds r4, r4, r6\n\t"
  68966. #else
  68967. "add r4, r4, r6\n\t"
  68968. #endif
  68969. #ifdef WOLFSSL_KEIL
  68970. "adcs r2, r2, %[r]\n\t"
  68971. #elif defined(__clang__)
  68972. "adcs r2, %[r]\n\t"
  68973. #else
  68974. "adc r2, %[r]\n\t"
  68975. #endif
  68976. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68977. "adds r4, r4, r6\n\t"
  68978. #else
  68979. "add r4, r4, r6\n\t"
  68980. #endif
  68981. #ifdef WOLFSSL_KEIL
  68982. "adcs r2, r2, %[r]\n\t"
  68983. #elif defined(__clang__)
  68984. "adcs r2, %[r]\n\t"
  68985. #else
  68986. "adc r2, %[r]\n\t"
  68987. #endif
  68988. "uxth r6, r7\n\t"
  68989. #ifdef WOLFSSL_KEIL
  68990. "muls r5, r6, r5\n\t"
  68991. #elif defined(__clang__)
  68992. "muls r5, r6\n\t"
  68993. #else
  68994. "mul r5, r6\n\t"
  68995. #endif
  68996. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68997. "lsrs r6, r5, #16\n\t"
  68998. #else
  68999. "lsr r6, r5, #16\n\t"
  69000. #endif
  69001. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69002. "lsls r5, r5, #16\n\t"
  69003. #else
  69004. "lsl r5, r5, #16\n\t"
  69005. #endif
  69006. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69007. "adds r3, r3, r5\n\t"
  69008. #else
  69009. "add r3, r3, r5\n\t"
  69010. #endif
  69011. #ifdef WOLFSSL_KEIL
  69012. "adcs r4, r4, r6\n\t"
  69013. #elif defined(__clang__)
  69014. "adcs r4, r6\n\t"
  69015. #else
  69016. "adc r4, r6\n\t"
  69017. #endif
  69018. #ifdef WOLFSSL_KEIL
  69019. "adcs r2, r2, %[r]\n\t"
  69020. #elif defined(__clang__)
  69021. "adcs r2, %[r]\n\t"
  69022. #else
  69023. "adc r2, %[r]\n\t"
  69024. #endif
  69025. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69026. "adds r3, r3, r5\n\t"
  69027. #else
  69028. "add r3, r3, r5\n\t"
  69029. #endif
  69030. #ifdef WOLFSSL_KEIL
  69031. "adcs r4, r4, r6\n\t"
  69032. #elif defined(__clang__)
  69033. "adcs r4, r6\n\t"
  69034. #else
  69035. "adc r4, r6\n\t"
  69036. #endif
  69037. #ifdef WOLFSSL_KEIL
  69038. "adcs r2, r2, %[r]\n\t"
  69039. #elif defined(__clang__)
  69040. "adcs r2, %[r]\n\t"
  69041. #else
  69042. "adc r2, %[r]\n\t"
  69043. #endif
  69044. "# A[11] * A[8]\n\t"
  69045. "mov %[a], r9\n\t"
  69046. "mov r7, r10\n\t"
  69047. "mov %[a], lr\n\t"
  69048. "uxth r5, %[a]\n\t"
  69049. "uxth r6, r7\n\t"
  69050. #ifdef WOLFSSL_KEIL
  69051. "muls r6, r5, r6\n\t"
  69052. #elif defined(__clang__)
  69053. "muls r6, r5\n\t"
  69054. #else
  69055. "mul r6, r5\n\t"
  69056. #endif
  69057. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69058. "adds r3, r3, r6\n\t"
  69059. #else
  69060. "add r3, r3, r6\n\t"
  69061. #endif
  69062. #ifdef WOLFSSL_KEIL
  69063. "adcs r4, r4, %[r]\n\t"
  69064. #elif defined(__clang__)
  69065. "adcs r4, %[r]\n\t"
  69066. #else
  69067. "adc r4, %[r]\n\t"
  69068. #endif
  69069. #ifdef WOLFSSL_KEIL
  69070. "adcs r2, r2, %[r]\n\t"
  69071. #elif defined(__clang__)
  69072. "adcs r2, %[r]\n\t"
  69073. #else
  69074. "adc r2, %[r]\n\t"
  69075. #endif
  69076. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69077. "adds r3, r3, r6\n\t"
  69078. #else
  69079. "add r3, r3, r6\n\t"
  69080. #endif
  69081. #ifdef WOLFSSL_KEIL
  69082. "adcs r4, r4, %[r]\n\t"
  69083. #elif defined(__clang__)
  69084. "adcs r4, %[r]\n\t"
  69085. #else
  69086. "adc r4, %[r]\n\t"
  69087. #endif
  69088. #ifdef WOLFSSL_KEIL
  69089. "adcs r2, r2, %[r]\n\t"
  69090. #elif defined(__clang__)
  69091. "adcs r2, %[r]\n\t"
  69092. #else
  69093. "adc r2, %[r]\n\t"
  69094. #endif
  69095. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69096. "lsrs r6, r7, #16\n\t"
  69097. #else
  69098. "lsr r6, r7, #16\n\t"
  69099. #endif
  69100. #ifdef WOLFSSL_KEIL
  69101. "muls r5, r6, r5\n\t"
  69102. #elif defined(__clang__)
  69103. "muls r5, r6\n\t"
  69104. #else
  69105. "mul r5, r6\n\t"
  69106. #endif
  69107. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69108. "lsrs r6, r5, #16\n\t"
  69109. #else
  69110. "lsr r6, r5, #16\n\t"
  69111. #endif
  69112. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69113. "lsls r5, r5, #16\n\t"
  69114. #else
  69115. "lsl r5, r5, #16\n\t"
  69116. #endif
  69117. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69118. "adds r3, r3, r5\n\t"
  69119. #else
  69120. "add r3, r3, r5\n\t"
  69121. #endif
  69122. #ifdef WOLFSSL_KEIL
  69123. "adcs r4, r4, r6\n\t"
  69124. #elif defined(__clang__)
  69125. "adcs r4, r6\n\t"
  69126. #else
  69127. "adc r4, r6\n\t"
  69128. #endif
  69129. #ifdef WOLFSSL_KEIL
  69130. "adcs r2, r2, %[r]\n\t"
  69131. #elif defined(__clang__)
  69132. "adcs r2, %[r]\n\t"
  69133. #else
  69134. "adc r2, %[r]\n\t"
  69135. #endif
  69136. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69137. "adds r3, r3, r5\n\t"
  69138. #else
  69139. "add r3, r3, r5\n\t"
  69140. #endif
  69141. #ifdef WOLFSSL_KEIL
  69142. "adcs r4, r4, r6\n\t"
  69143. #elif defined(__clang__)
  69144. "adcs r4, r6\n\t"
  69145. #else
  69146. "adc r4, r6\n\t"
  69147. #endif
  69148. #ifdef WOLFSSL_KEIL
  69149. "adcs r2, r2, %[r]\n\t"
  69150. #elif defined(__clang__)
  69151. "adcs r2, %[r]\n\t"
  69152. #else
  69153. "adc r2, %[r]\n\t"
  69154. #endif
  69155. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69156. "lsrs r5, %[a], #16\n\t"
  69157. #else
  69158. "lsr r5, %[a], #16\n\t"
  69159. #endif
  69160. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69161. "lsrs r6, r7, #16\n\t"
  69162. #else
  69163. "lsr r6, r7, #16\n\t"
  69164. #endif
  69165. #ifdef WOLFSSL_KEIL
  69166. "muls r6, r5, r6\n\t"
  69167. #elif defined(__clang__)
  69168. "muls r6, r5\n\t"
  69169. #else
  69170. "mul r6, r5\n\t"
  69171. #endif
  69172. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69173. "adds r4, r4, r6\n\t"
  69174. #else
  69175. "add r4, r4, r6\n\t"
  69176. #endif
  69177. #ifdef WOLFSSL_KEIL
  69178. "adcs r2, r2, %[r]\n\t"
  69179. #elif defined(__clang__)
  69180. "adcs r2, %[r]\n\t"
  69181. #else
  69182. "adc r2, %[r]\n\t"
  69183. #endif
  69184. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69185. "adds r4, r4, r6\n\t"
  69186. #else
  69187. "add r4, r4, r6\n\t"
  69188. #endif
  69189. #ifdef WOLFSSL_KEIL
  69190. "adcs r2, r2, %[r]\n\t"
  69191. #elif defined(__clang__)
  69192. "adcs r2, %[r]\n\t"
  69193. #else
  69194. "adc r2, %[r]\n\t"
  69195. #endif
  69196. "uxth r6, r7\n\t"
  69197. #ifdef WOLFSSL_KEIL
  69198. "muls r5, r6, r5\n\t"
  69199. #elif defined(__clang__)
  69200. "muls r5, r6\n\t"
  69201. #else
  69202. "mul r5, r6\n\t"
  69203. #endif
  69204. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69205. "lsrs r6, r5, #16\n\t"
  69206. #else
  69207. "lsr r6, r5, #16\n\t"
  69208. #endif
  69209. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69210. "lsls r5, r5, #16\n\t"
  69211. #else
  69212. "lsl r5, r5, #16\n\t"
  69213. #endif
  69214. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69215. "adds r3, r3, r5\n\t"
  69216. #else
  69217. "add r3, r3, r5\n\t"
  69218. #endif
  69219. #ifdef WOLFSSL_KEIL
  69220. "adcs r4, r4, r6\n\t"
  69221. #elif defined(__clang__)
  69222. "adcs r4, r6\n\t"
  69223. #else
  69224. "adc r4, r6\n\t"
  69225. #endif
  69226. #ifdef WOLFSSL_KEIL
  69227. "adcs r2, r2, %[r]\n\t"
  69228. #elif defined(__clang__)
  69229. "adcs r2, %[r]\n\t"
  69230. #else
  69231. "adc r2, %[r]\n\t"
  69232. #endif
  69233. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69234. "adds r3, r3, r5\n\t"
  69235. #else
  69236. "add r3, r3, r5\n\t"
  69237. #endif
  69238. #ifdef WOLFSSL_KEIL
  69239. "adcs r4, r4, r6\n\t"
  69240. #elif defined(__clang__)
  69241. "adcs r4, r6\n\t"
  69242. #else
  69243. "adc r4, r6\n\t"
  69244. #endif
  69245. #ifdef WOLFSSL_KEIL
  69246. "adcs r2, r2, %[r]\n\t"
  69247. #elif defined(__clang__)
  69248. "adcs r2, %[r]\n\t"
  69249. #else
  69250. "adc r2, %[r]\n\t"
  69251. #endif
  69252. "mov %[r], r8\n\t"
  69253. "str r3, [%[r], #76]\n\t"
  69254. "movs %[r], #0\n\t"
  69255. "# A[11] * A[9]\n\t"
  69256. "movs r3, #0\n\t"
  69257. "mov %[a], r9\n\t"
  69258. "mov r7, r11\n\t"
  69259. "mov %[a], lr\n\t"
  69260. "uxth r5, %[a]\n\t"
  69261. "uxth r6, r7\n\t"
  69262. #ifdef WOLFSSL_KEIL
  69263. "muls r6, r5, r6\n\t"
  69264. #elif defined(__clang__)
  69265. "muls r6, r5\n\t"
  69266. #else
  69267. "mul r6, r5\n\t"
  69268. #endif
  69269. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69270. "adds r4, r4, r6\n\t"
  69271. #else
  69272. "add r4, r4, r6\n\t"
  69273. #endif
  69274. #ifdef WOLFSSL_KEIL
  69275. "adcs r2, r2, %[r]\n\t"
  69276. #elif defined(__clang__)
  69277. "adcs r2, %[r]\n\t"
  69278. #else
  69279. "adc r2, %[r]\n\t"
  69280. #endif
  69281. #ifdef WOLFSSL_KEIL
  69282. "adcs r3, r3, %[r]\n\t"
  69283. #elif defined(__clang__)
  69284. "adcs r3, %[r]\n\t"
  69285. #else
  69286. "adc r3, %[r]\n\t"
  69287. #endif
  69288. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69289. "adds r4, r4, r6\n\t"
  69290. #else
  69291. "add r4, r4, r6\n\t"
  69292. #endif
  69293. #ifdef WOLFSSL_KEIL
  69294. "adcs r2, r2, %[r]\n\t"
  69295. #elif defined(__clang__)
  69296. "adcs r2, %[r]\n\t"
  69297. #else
  69298. "adc r2, %[r]\n\t"
  69299. #endif
  69300. #ifdef WOLFSSL_KEIL
  69301. "adcs r3, r3, %[r]\n\t"
  69302. #elif defined(__clang__)
  69303. "adcs r3, %[r]\n\t"
  69304. #else
  69305. "adc r3, %[r]\n\t"
  69306. #endif
  69307. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69308. "lsrs r6, r7, #16\n\t"
  69309. #else
  69310. "lsr r6, r7, #16\n\t"
  69311. #endif
  69312. #ifdef WOLFSSL_KEIL
  69313. "muls r5, r6, r5\n\t"
  69314. #elif defined(__clang__)
  69315. "muls r5, r6\n\t"
  69316. #else
  69317. "mul r5, r6\n\t"
  69318. #endif
  69319. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69320. "lsrs r6, r5, #16\n\t"
  69321. #else
  69322. "lsr r6, r5, #16\n\t"
  69323. #endif
  69324. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69325. "lsls r5, r5, #16\n\t"
  69326. #else
  69327. "lsl r5, r5, #16\n\t"
  69328. #endif
  69329. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69330. "adds r4, r4, r5\n\t"
  69331. #else
  69332. "add r4, r4, r5\n\t"
  69333. #endif
  69334. #ifdef WOLFSSL_KEIL
  69335. "adcs r2, r2, r6\n\t"
  69336. #elif defined(__clang__)
  69337. "adcs r2, r6\n\t"
  69338. #else
  69339. "adc r2, r6\n\t"
  69340. #endif
  69341. #ifdef WOLFSSL_KEIL
  69342. "adcs r3, r3, %[r]\n\t"
  69343. #elif defined(__clang__)
  69344. "adcs r3, %[r]\n\t"
  69345. #else
  69346. "adc r3, %[r]\n\t"
  69347. #endif
  69348. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69349. "adds r4, r4, r5\n\t"
  69350. #else
  69351. "add r4, r4, r5\n\t"
  69352. #endif
  69353. #ifdef WOLFSSL_KEIL
  69354. "adcs r2, r2, r6\n\t"
  69355. #elif defined(__clang__)
  69356. "adcs r2, r6\n\t"
  69357. #else
  69358. "adc r2, r6\n\t"
  69359. #endif
  69360. #ifdef WOLFSSL_KEIL
  69361. "adcs r3, r3, %[r]\n\t"
  69362. #elif defined(__clang__)
  69363. "adcs r3, %[r]\n\t"
  69364. #else
  69365. "adc r3, %[r]\n\t"
  69366. #endif
  69367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69368. "lsrs r5, %[a], #16\n\t"
  69369. #else
  69370. "lsr r5, %[a], #16\n\t"
  69371. #endif
  69372. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69373. "lsrs r6, r7, #16\n\t"
  69374. #else
  69375. "lsr r6, r7, #16\n\t"
  69376. #endif
  69377. #ifdef WOLFSSL_KEIL
  69378. "muls r6, r5, r6\n\t"
  69379. #elif defined(__clang__)
  69380. "muls r6, r5\n\t"
  69381. #else
  69382. "mul r6, r5\n\t"
  69383. #endif
  69384. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69385. "adds r2, r2, r6\n\t"
  69386. #else
  69387. "add r2, r2, r6\n\t"
  69388. #endif
  69389. #ifdef WOLFSSL_KEIL
  69390. "adcs r3, r3, %[r]\n\t"
  69391. #elif defined(__clang__)
  69392. "adcs r3, %[r]\n\t"
  69393. #else
  69394. "adc r3, %[r]\n\t"
  69395. #endif
  69396. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69397. "adds r2, r2, r6\n\t"
  69398. #else
  69399. "add r2, r2, r6\n\t"
  69400. #endif
  69401. #ifdef WOLFSSL_KEIL
  69402. "adcs r3, r3, %[r]\n\t"
  69403. #elif defined(__clang__)
  69404. "adcs r3, %[r]\n\t"
  69405. #else
  69406. "adc r3, %[r]\n\t"
  69407. #endif
  69408. "uxth r6, r7\n\t"
  69409. #ifdef WOLFSSL_KEIL
  69410. "muls r5, r6, r5\n\t"
  69411. #elif defined(__clang__)
  69412. "muls r5, r6\n\t"
  69413. #else
  69414. "mul r5, r6\n\t"
  69415. #endif
  69416. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69417. "lsrs r6, r5, #16\n\t"
  69418. #else
  69419. "lsr r6, r5, #16\n\t"
  69420. #endif
  69421. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69422. "lsls r5, r5, #16\n\t"
  69423. #else
  69424. "lsl r5, r5, #16\n\t"
  69425. #endif
  69426. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69427. "adds r4, r4, r5\n\t"
  69428. #else
  69429. "add r4, r4, r5\n\t"
  69430. #endif
  69431. #ifdef WOLFSSL_KEIL
  69432. "adcs r2, r2, r6\n\t"
  69433. #elif defined(__clang__)
  69434. "adcs r2, r6\n\t"
  69435. #else
  69436. "adc r2, r6\n\t"
  69437. #endif
  69438. #ifdef WOLFSSL_KEIL
  69439. "adcs r3, r3, %[r]\n\t"
  69440. #elif defined(__clang__)
  69441. "adcs r3, %[r]\n\t"
  69442. #else
  69443. "adc r3, %[r]\n\t"
  69444. #endif
  69445. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69446. "adds r4, r4, r5\n\t"
  69447. #else
  69448. "add r4, r4, r5\n\t"
  69449. #endif
  69450. #ifdef WOLFSSL_KEIL
  69451. "adcs r2, r2, r6\n\t"
  69452. #elif defined(__clang__)
  69453. "adcs r2, r6\n\t"
  69454. #else
  69455. "adc r2, r6\n\t"
  69456. #endif
  69457. #ifdef WOLFSSL_KEIL
  69458. "adcs r3, r3, %[r]\n\t"
  69459. #elif defined(__clang__)
  69460. "adcs r3, %[r]\n\t"
  69461. #else
  69462. "adc r3, %[r]\n\t"
  69463. #endif
  69464. "# A[10] * A[10]\n\t"
  69465. "mov r7, r12\n\t"
  69466. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69467. "lsrs r6, r7, #16\n\t"
  69468. #else
  69469. "lsr r6, r7, #16\n\t"
  69470. #endif
  69471. "uxth r5, r7\n\t"
  69472. #ifdef WOLFSSL_KEIL
  69473. "muls r5, r5, r5\n\t"
  69474. #elif defined(__clang__)
  69475. "muls r5, r5\n\t"
  69476. #else
  69477. "mul r5, r5\n\t"
  69478. #endif
  69479. #ifdef WOLFSSL_KEIL
  69480. "muls r6, r6, r6\n\t"
  69481. #elif defined(__clang__)
  69482. "muls r6, r6\n\t"
  69483. #else
  69484. "mul r6, r6\n\t"
  69485. #endif
  69486. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69487. "adds r4, r4, r5\n\t"
  69488. #else
  69489. "add r4, r4, r5\n\t"
  69490. #endif
  69491. #ifdef WOLFSSL_KEIL
  69492. "adcs r2, r2, r6\n\t"
  69493. #elif defined(__clang__)
  69494. "adcs r2, r6\n\t"
  69495. #else
  69496. "adc r2, r6\n\t"
  69497. #endif
  69498. #ifdef WOLFSSL_KEIL
  69499. "adcs r3, r3, %[r]\n\t"
  69500. #elif defined(__clang__)
  69501. "adcs r3, %[r]\n\t"
  69502. #else
  69503. "adc r3, %[r]\n\t"
  69504. #endif
  69505. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69506. "lsrs r6, r7, #16\n\t"
  69507. #else
  69508. "lsr r6, r7, #16\n\t"
  69509. #endif
  69510. "uxth r5, r7\n\t"
  69511. #ifdef WOLFSSL_KEIL
  69512. "muls r5, r6, r5\n\t"
  69513. #elif defined(__clang__)
  69514. "muls r5, r6\n\t"
  69515. #else
  69516. "mul r5, r6\n\t"
  69517. #endif
  69518. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69519. "lsrs r6, r5, #15\n\t"
  69520. #else
  69521. "lsr r6, r5, #15\n\t"
  69522. #endif
  69523. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69524. "lsls r5, r5, #17\n\t"
  69525. #else
  69526. "lsl r5, r5, #17\n\t"
  69527. #endif
  69528. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69529. "adds r4, r4, r5\n\t"
  69530. #else
  69531. "add r4, r4, r5\n\t"
  69532. #endif
  69533. #ifdef WOLFSSL_KEIL
  69534. "adcs r2, r2, r6\n\t"
  69535. #elif defined(__clang__)
  69536. "adcs r2, r6\n\t"
  69537. #else
  69538. "adc r2, r6\n\t"
  69539. #endif
  69540. #ifdef WOLFSSL_KEIL
  69541. "adcs r3, r3, %[r]\n\t"
  69542. #elif defined(__clang__)
  69543. "adcs r3, %[r]\n\t"
  69544. #else
  69545. "adc r3, %[r]\n\t"
  69546. #endif
  69547. "mov %[r], r8\n\t"
  69548. "str r4, [%[r], #80]\n\t"
  69549. "movs %[r], #0\n\t"
  69550. "# A[11] * A[10]\n\t"
  69551. "movs r4, #0\n\t"
  69552. "mov %[a], r9\n\t"
  69553. "mov %[a], lr\n\t"
  69554. "uxth r5, %[a]\n\t"
  69555. "uxth r6, r7\n\t"
  69556. #ifdef WOLFSSL_KEIL
  69557. "muls r6, r5, r6\n\t"
  69558. #elif defined(__clang__)
  69559. "muls r6, r5\n\t"
  69560. #else
  69561. "mul r6, r5\n\t"
  69562. #endif
  69563. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69564. "adds r2, r2, r6\n\t"
  69565. #else
  69566. "add r2, r2, r6\n\t"
  69567. #endif
  69568. #ifdef WOLFSSL_KEIL
  69569. "adcs r3, r3, %[r]\n\t"
  69570. #elif defined(__clang__)
  69571. "adcs r3, %[r]\n\t"
  69572. #else
  69573. "adc r3, %[r]\n\t"
  69574. #endif
  69575. #ifdef WOLFSSL_KEIL
  69576. "adcs r4, r4, %[r]\n\t"
  69577. #elif defined(__clang__)
  69578. "adcs r4, %[r]\n\t"
  69579. #else
  69580. "adc r4, %[r]\n\t"
  69581. #endif
  69582. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69583. "adds r2, r2, r6\n\t"
  69584. #else
  69585. "add r2, r2, r6\n\t"
  69586. #endif
  69587. #ifdef WOLFSSL_KEIL
  69588. "adcs r3, r3, %[r]\n\t"
  69589. #elif defined(__clang__)
  69590. "adcs r3, %[r]\n\t"
  69591. #else
  69592. "adc r3, %[r]\n\t"
  69593. #endif
  69594. #ifdef WOLFSSL_KEIL
  69595. "adcs r4, r4, %[r]\n\t"
  69596. #elif defined(__clang__)
  69597. "adcs r4, %[r]\n\t"
  69598. #else
  69599. "adc r4, %[r]\n\t"
  69600. #endif
  69601. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69602. "lsrs r6, r7, #16\n\t"
  69603. #else
  69604. "lsr r6, r7, #16\n\t"
  69605. #endif
  69606. #ifdef WOLFSSL_KEIL
  69607. "muls r5, r6, r5\n\t"
  69608. #elif defined(__clang__)
  69609. "muls r5, r6\n\t"
  69610. #else
  69611. "mul r5, r6\n\t"
  69612. #endif
  69613. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69614. "lsrs r6, r5, #16\n\t"
  69615. #else
  69616. "lsr r6, r5, #16\n\t"
  69617. #endif
  69618. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69619. "lsls r5, r5, #16\n\t"
  69620. #else
  69621. "lsl r5, r5, #16\n\t"
  69622. #endif
  69623. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69624. "adds r2, r2, r5\n\t"
  69625. #else
  69626. "add r2, r2, r5\n\t"
  69627. #endif
  69628. #ifdef WOLFSSL_KEIL
  69629. "adcs r3, r3, r6\n\t"
  69630. #elif defined(__clang__)
  69631. "adcs r3, r6\n\t"
  69632. #else
  69633. "adc r3, r6\n\t"
  69634. #endif
  69635. #ifdef WOLFSSL_KEIL
  69636. "adcs r4, r4, %[r]\n\t"
  69637. #elif defined(__clang__)
  69638. "adcs r4, %[r]\n\t"
  69639. #else
  69640. "adc r4, %[r]\n\t"
  69641. #endif
  69642. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69643. "adds r2, r2, r5\n\t"
  69644. #else
  69645. "add r2, r2, r5\n\t"
  69646. #endif
  69647. #ifdef WOLFSSL_KEIL
  69648. "adcs r3, r3, r6\n\t"
  69649. #elif defined(__clang__)
  69650. "adcs r3, r6\n\t"
  69651. #else
  69652. "adc r3, r6\n\t"
  69653. #endif
  69654. #ifdef WOLFSSL_KEIL
  69655. "adcs r4, r4, %[r]\n\t"
  69656. #elif defined(__clang__)
  69657. "adcs r4, %[r]\n\t"
  69658. #else
  69659. "adc r4, %[r]\n\t"
  69660. #endif
  69661. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69662. "lsrs r5, %[a], #16\n\t"
  69663. #else
  69664. "lsr r5, %[a], #16\n\t"
  69665. #endif
  69666. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69667. "lsrs r6, r7, #16\n\t"
  69668. #else
  69669. "lsr r6, r7, #16\n\t"
  69670. #endif
  69671. #ifdef WOLFSSL_KEIL
  69672. "muls r6, r5, r6\n\t"
  69673. #elif defined(__clang__)
  69674. "muls r6, r5\n\t"
  69675. #else
  69676. "mul r6, r5\n\t"
  69677. #endif
  69678. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69679. "adds r3, r3, r6\n\t"
  69680. #else
  69681. "add r3, r3, r6\n\t"
  69682. #endif
  69683. #ifdef WOLFSSL_KEIL
  69684. "adcs r4, r4, %[r]\n\t"
  69685. #elif defined(__clang__)
  69686. "adcs r4, %[r]\n\t"
  69687. #else
  69688. "adc r4, %[r]\n\t"
  69689. #endif
  69690. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69691. "adds r3, r3, r6\n\t"
  69692. #else
  69693. "add r3, r3, r6\n\t"
  69694. #endif
  69695. #ifdef WOLFSSL_KEIL
  69696. "adcs r4, r4, %[r]\n\t"
  69697. #elif defined(__clang__)
  69698. "adcs r4, %[r]\n\t"
  69699. #else
  69700. "adc r4, %[r]\n\t"
  69701. #endif
  69702. "uxth r6, r7\n\t"
  69703. #ifdef WOLFSSL_KEIL
  69704. "muls r5, r6, r5\n\t"
  69705. #elif defined(__clang__)
  69706. "muls r5, r6\n\t"
  69707. #else
  69708. "mul r5, r6\n\t"
  69709. #endif
  69710. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69711. "lsrs r6, r5, #16\n\t"
  69712. #else
  69713. "lsr r6, r5, #16\n\t"
  69714. #endif
  69715. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69716. "lsls r5, r5, #16\n\t"
  69717. #else
  69718. "lsl r5, r5, #16\n\t"
  69719. #endif
  69720. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69721. "adds r2, r2, r5\n\t"
  69722. #else
  69723. "add r2, r2, r5\n\t"
  69724. #endif
  69725. #ifdef WOLFSSL_KEIL
  69726. "adcs r3, r3, r6\n\t"
  69727. #elif defined(__clang__)
  69728. "adcs r3, r6\n\t"
  69729. #else
  69730. "adc r3, r6\n\t"
  69731. #endif
  69732. #ifdef WOLFSSL_KEIL
  69733. "adcs r4, r4, %[r]\n\t"
  69734. #elif defined(__clang__)
  69735. "adcs r4, %[r]\n\t"
  69736. #else
  69737. "adc r4, %[r]\n\t"
  69738. #endif
  69739. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69740. "adds r2, r2, r5\n\t"
  69741. #else
  69742. "add r2, r2, r5\n\t"
  69743. #endif
  69744. #ifdef WOLFSSL_KEIL
  69745. "adcs r3, r3, r6\n\t"
  69746. #elif defined(__clang__)
  69747. "adcs r3, r6\n\t"
  69748. #else
  69749. "adc r3, r6\n\t"
  69750. #endif
  69751. #ifdef WOLFSSL_KEIL
  69752. "adcs r4, r4, %[r]\n\t"
  69753. #elif defined(__clang__)
  69754. "adcs r4, %[r]\n\t"
  69755. #else
  69756. "adc r4, %[r]\n\t"
  69757. #endif
  69758. "mov %[r], r8\n\t"
  69759. "str r2, [%[r], #84]\n\t"
  69760. "movs %[r], #0\n\t"
  69761. "# A[11] * A[11]\n\t"
  69762. "mov %[a], r9\n\t"
  69763. "mov r7, lr\n\t"
  69764. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69765. "lsrs r6, r7, #16\n\t"
  69766. #else
  69767. "lsr r6, r7, #16\n\t"
  69768. #endif
  69769. "uxth r5, r7\n\t"
  69770. #ifdef WOLFSSL_KEIL
  69771. "muls r5, r5, r5\n\t"
  69772. #elif defined(__clang__)
  69773. "muls r5, r5\n\t"
  69774. #else
  69775. "mul r5, r5\n\t"
  69776. #endif
  69777. #ifdef WOLFSSL_KEIL
  69778. "muls r6, r6, r6\n\t"
  69779. #elif defined(__clang__)
  69780. "muls r6, r6\n\t"
  69781. #else
  69782. "mul r6, r6\n\t"
  69783. #endif
  69784. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69785. "adds r3, r3, r5\n\t"
  69786. #else
  69787. "add r3, r3, r5\n\t"
  69788. #endif
  69789. #ifdef WOLFSSL_KEIL
  69790. "adcs r4, r4, r6\n\t"
  69791. #elif defined(__clang__)
  69792. "adcs r4, r6\n\t"
  69793. #else
  69794. "adc r4, r6\n\t"
  69795. #endif
  69796. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69797. "lsrs r6, r7, #16\n\t"
  69798. #else
  69799. "lsr r6, r7, #16\n\t"
  69800. #endif
  69801. "uxth r5, r7\n\t"
  69802. #ifdef WOLFSSL_KEIL
  69803. "muls r5, r6, r5\n\t"
  69804. #elif defined(__clang__)
  69805. "muls r5, r6\n\t"
  69806. #else
  69807. "mul r5, r6\n\t"
  69808. #endif
  69809. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69810. "lsrs r6, r5, #15\n\t"
  69811. #else
  69812. "lsr r6, r5, #15\n\t"
  69813. #endif
  69814. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69815. "lsls r5, r5, #17\n\t"
  69816. #else
  69817. "lsl r5, r5, #17\n\t"
  69818. #endif
  69819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69820. "adds r3, r3, r5\n\t"
  69821. #else
  69822. "add r3, r3, r5\n\t"
  69823. #endif
  69824. #ifdef WOLFSSL_KEIL
  69825. "adcs r4, r4, r6\n\t"
  69826. #elif defined(__clang__)
  69827. "adcs r4, r6\n\t"
  69828. #else
  69829. "adc r4, r6\n\t"
  69830. #endif
  69831. "mov %[r], r8\n\t"
  69832. "str r3, [%[r], #88]\n\t"
  69833. "str r4, [%[r], #92]\n\t"
  69834. "pop {r2, r3, r4, r5}\n\t"
  69835. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  69836. "pop {r2, r3, r4, r5}\n\t"
  69837. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  69838. "pop {r2, r3, r4, r5}\n\t"
  69839. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  69840. : [r] "+l" (r), [a] "+l" (a)
  69841. :
  69842. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr"
  69843. );
  69844. }
  69845. #endif /* !WOLFSSL_SP_LARGE_CODE */
  69846. /* Sub b from a into r. (r = a - b)
  69847. *
  69848. * r A single precision integer.
  69849. * a A single precision integer.
  69850. * b A single precision integer.
  69851. */
  69852. SP_NOINLINE static sp_digit sp_3072_sub_12(sp_digit* r, const sp_digit* a,
  69853. const sp_digit* b)
  69854. {
  69855. __asm__ __volatile__ (
  69856. "ldm %[b]!, {r5, r6}\n\t"
  69857. "ldm %[a]!, {r3, r4}\n\t"
  69858. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69859. "subs r3, r3, r5\n\t"
  69860. #else
  69861. "sub r3, r3, r5\n\t"
  69862. #endif
  69863. #ifdef WOLFSSL_KEIL
  69864. "sbcs r4, r4, r6\n\t"
  69865. #elif defined(__clang__)
  69866. "sbcs r4, r6\n\t"
  69867. #else
  69868. "sbc r4, r6\n\t"
  69869. #endif
  69870. "stm %[r]!, {r3, r4}\n\t"
  69871. "ldm %[b]!, {r5, r6}\n\t"
  69872. "ldm %[a]!, {r3, r4}\n\t"
  69873. #ifdef WOLFSSL_KEIL
  69874. "sbcs r3, r3, r5\n\t"
  69875. #elif defined(__clang__)
  69876. "sbcs r3, r5\n\t"
  69877. #else
  69878. "sbc r3, r5\n\t"
  69879. #endif
  69880. #ifdef WOLFSSL_KEIL
  69881. "sbcs r4, r4, r6\n\t"
  69882. #elif defined(__clang__)
  69883. "sbcs r4, r6\n\t"
  69884. #else
  69885. "sbc r4, r6\n\t"
  69886. #endif
  69887. "stm %[r]!, {r3, r4}\n\t"
  69888. "ldm %[b]!, {r5, r6}\n\t"
  69889. "ldm %[a]!, {r3, r4}\n\t"
  69890. #ifdef WOLFSSL_KEIL
  69891. "sbcs r3, r3, r5\n\t"
  69892. #elif defined(__clang__)
  69893. "sbcs r3, r5\n\t"
  69894. #else
  69895. "sbc r3, r5\n\t"
  69896. #endif
  69897. #ifdef WOLFSSL_KEIL
  69898. "sbcs r4, r4, r6\n\t"
  69899. #elif defined(__clang__)
  69900. "sbcs r4, r6\n\t"
  69901. #else
  69902. "sbc r4, r6\n\t"
  69903. #endif
  69904. "stm %[r]!, {r3, r4}\n\t"
  69905. "ldm %[b]!, {r5, r6}\n\t"
  69906. "ldm %[a]!, {r3, r4}\n\t"
  69907. #ifdef WOLFSSL_KEIL
  69908. "sbcs r3, r3, r5\n\t"
  69909. #elif defined(__clang__)
  69910. "sbcs r3, r5\n\t"
  69911. #else
  69912. "sbc r3, r5\n\t"
  69913. #endif
  69914. #ifdef WOLFSSL_KEIL
  69915. "sbcs r4, r4, r6\n\t"
  69916. #elif defined(__clang__)
  69917. "sbcs r4, r6\n\t"
  69918. #else
  69919. "sbc r4, r6\n\t"
  69920. #endif
  69921. "stm %[r]!, {r3, r4}\n\t"
  69922. "ldm %[b]!, {r5, r6}\n\t"
  69923. "ldm %[a]!, {r3, r4}\n\t"
  69924. #ifdef WOLFSSL_KEIL
  69925. "sbcs r3, r3, r5\n\t"
  69926. #elif defined(__clang__)
  69927. "sbcs r3, r5\n\t"
  69928. #else
  69929. "sbc r3, r5\n\t"
  69930. #endif
  69931. #ifdef WOLFSSL_KEIL
  69932. "sbcs r4, r4, r6\n\t"
  69933. #elif defined(__clang__)
  69934. "sbcs r4, r6\n\t"
  69935. #else
  69936. "sbc r4, r6\n\t"
  69937. #endif
  69938. "stm %[r]!, {r3, r4}\n\t"
  69939. "ldm %[b]!, {r5, r6}\n\t"
  69940. "ldm %[a]!, {r3, r4}\n\t"
  69941. #ifdef WOLFSSL_KEIL
  69942. "sbcs r3, r3, r5\n\t"
  69943. #elif defined(__clang__)
  69944. "sbcs r3, r5\n\t"
  69945. #else
  69946. "sbc r3, r5\n\t"
  69947. #endif
  69948. #ifdef WOLFSSL_KEIL
  69949. "sbcs r4, r4, r6\n\t"
  69950. #elif defined(__clang__)
  69951. "sbcs r4, r6\n\t"
  69952. #else
  69953. "sbc r4, r6\n\t"
  69954. #endif
  69955. "stm %[r]!, {r3, r4}\n\t"
  69956. #ifdef WOLFSSL_KEIL
  69957. "sbcs %[r], %[r], %[r]\n\t"
  69958. #elif defined(__clang__)
  69959. "sbcs %[r], %[r]\n\t"
  69960. #else
  69961. "sbc %[r], %[r]\n\t"
  69962. #endif
  69963. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  69964. :
  69965. : "memory", "r3", "r4", "r5", "r6"
  69966. );
  69967. return (uint32_t)(size_t)r;
  69968. }
  69969. /* Square a and put result in r. (r = a * a)
  69970. *
  69971. * r A single precision integer.
  69972. * a A single precision integer.
  69973. */
  69974. SP_NOINLINE static void sp_3072_sqr_24(sp_digit* r, const sp_digit* a)
  69975. {
  69976. sp_digit* z0 = r;
  69977. sp_digit* z2 = r + 24;
  69978. sp_digit z1[24];
  69979. sp_digit* a1 = z1;
  69980. sp_digit* zero = z1 + 12;
  69981. sp_digit u;
  69982. sp_digit mask;
  69983. sp_digit* p1;
  69984. sp_digit* p2;
  69985. XMEMSET(zero, 0, sizeof(sp_digit) * 12);
  69986. mask = sp_3072_sub_12(a1, a, &a[12]);
  69987. p1 = (sp_digit*)(((sp_digit)zero & mask ) | ((sp_digit)a1 & (~mask)));
  69988. p2 = (sp_digit*)(((sp_digit)zero & (~mask)) | ((sp_digit)a1 & mask ));
  69989. (void)sp_3072_sub_12(a1, p1, p2);
  69990. sp_3072_sqr_12(z2, &a[12]);
  69991. sp_3072_sqr_12(z0, a);
  69992. sp_3072_sqr_12(z1, a1);
  69993. u = 0;
  69994. u -= sp_3072_sub_in_place_24(z1, z2);
  69995. u -= sp_3072_sub_in_place_24(z1, z0);
  69996. u += sp_3072_sub_in_place_24(r + 12, z1);
  69997. sp_3072_add_word_12(r + 36, r + 36, u);
  69998. }
  69999. /* Sub b from a into r. (r = a - b)
  70000. *
  70001. * r A single precision integer.
  70002. * a A single precision integer.
  70003. * b A single precision integer.
  70004. */
  70005. SP_NOINLINE static sp_digit sp_3072_sub_24(sp_digit* r, const sp_digit* a,
  70006. const sp_digit* b)
  70007. {
  70008. __asm__ __volatile__ (
  70009. "ldm %[b]!, {r5, r6}\n\t"
  70010. "ldm %[a]!, {r3, r4}\n\t"
  70011. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70012. "subs r3, r3, r5\n\t"
  70013. #else
  70014. "sub r3, r3, r5\n\t"
  70015. #endif
  70016. #ifdef WOLFSSL_KEIL
  70017. "sbcs r4, r4, r6\n\t"
  70018. #elif defined(__clang__)
  70019. "sbcs r4, r6\n\t"
  70020. #else
  70021. "sbc r4, r6\n\t"
  70022. #endif
  70023. "stm %[r]!, {r3, r4}\n\t"
  70024. "ldm %[b]!, {r5, r6}\n\t"
  70025. "ldm %[a]!, {r3, r4}\n\t"
  70026. #ifdef WOLFSSL_KEIL
  70027. "sbcs r3, r3, r5\n\t"
  70028. #elif defined(__clang__)
  70029. "sbcs r3, r5\n\t"
  70030. #else
  70031. "sbc r3, r5\n\t"
  70032. #endif
  70033. #ifdef WOLFSSL_KEIL
  70034. "sbcs r4, r4, r6\n\t"
  70035. #elif defined(__clang__)
  70036. "sbcs r4, r6\n\t"
  70037. #else
  70038. "sbc r4, r6\n\t"
  70039. #endif
  70040. "stm %[r]!, {r3, r4}\n\t"
  70041. "ldm %[b]!, {r5, r6}\n\t"
  70042. "ldm %[a]!, {r3, r4}\n\t"
  70043. #ifdef WOLFSSL_KEIL
  70044. "sbcs r3, r3, r5\n\t"
  70045. #elif defined(__clang__)
  70046. "sbcs r3, r5\n\t"
  70047. #else
  70048. "sbc r3, r5\n\t"
  70049. #endif
  70050. #ifdef WOLFSSL_KEIL
  70051. "sbcs r4, r4, r6\n\t"
  70052. #elif defined(__clang__)
  70053. "sbcs r4, r6\n\t"
  70054. #else
  70055. "sbc r4, r6\n\t"
  70056. #endif
  70057. "stm %[r]!, {r3, r4}\n\t"
  70058. "ldm %[b]!, {r5, r6}\n\t"
  70059. "ldm %[a]!, {r3, r4}\n\t"
  70060. #ifdef WOLFSSL_KEIL
  70061. "sbcs r3, r3, r5\n\t"
  70062. #elif defined(__clang__)
  70063. "sbcs r3, r5\n\t"
  70064. #else
  70065. "sbc r3, r5\n\t"
  70066. #endif
  70067. #ifdef WOLFSSL_KEIL
  70068. "sbcs r4, r4, r6\n\t"
  70069. #elif defined(__clang__)
  70070. "sbcs r4, r6\n\t"
  70071. #else
  70072. "sbc r4, r6\n\t"
  70073. #endif
  70074. "stm %[r]!, {r3, r4}\n\t"
  70075. "ldm %[b]!, {r5, r6}\n\t"
  70076. "ldm %[a]!, {r3, r4}\n\t"
  70077. #ifdef WOLFSSL_KEIL
  70078. "sbcs r3, r3, r5\n\t"
  70079. #elif defined(__clang__)
  70080. "sbcs r3, r5\n\t"
  70081. #else
  70082. "sbc r3, r5\n\t"
  70083. #endif
  70084. #ifdef WOLFSSL_KEIL
  70085. "sbcs r4, r4, r6\n\t"
  70086. #elif defined(__clang__)
  70087. "sbcs r4, r6\n\t"
  70088. #else
  70089. "sbc r4, r6\n\t"
  70090. #endif
  70091. "stm %[r]!, {r3, r4}\n\t"
  70092. "ldm %[b]!, {r5, r6}\n\t"
  70093. "ldm %[a]!, {r3, r4}\n\t"
  70094. #ifdef WOLFSSL_KEIL
  70095. "sbcs r3, r3, r5\n\t"
  70096. #elif defined(__clang__)
  70097. "sbcs r3, r5\n\t"
  70098. #else
  70099. "sbc r3, r5\n\t"
  70100. #endif
  70101. #ifdef WOLFSSL_KEIL
  70102. "sbcs r4, r4, r6\n\t"
  70103. #elif defined(__clang__)
  70104. "sbcs r4, r6\n\t"
  70105. #else
  70106. "sbc r4, r6\n\t"
  70107. #endif
  70108. "stm %[r]!, {r3, r4}\n\t"
  70109. "ldm %[b]!, {r5, r6}\n\t"
  70110. "ldm %[a]!, {r3, r4}\n\t"
  70111. #ifdef WOLFSSL_KEIL
  70112. "sbcs r3, r3, r5\n\t"
  70113. #elif defined(__clang__)
  70114. "sbcs r3, r5\n\t"
  70115. #else
  70116. "sbc r3, r5\n\t"
  70117. #endif
  70118. #ifdef WOLFSSL_KEIL
  70119. "sbcs r4, r4, r6\n\t"
  70120. #elif defined(__clang__)
  70121. "sbcs r4, r6\n\t"
  70122. #else
  70123. "sbc r4, r6\n\t"
  70124. #endif
  70125. "stm %[r]!, {r3, r4}\n\t"
  70126. "ldm %[b]!, {r5, r6}\n\t"
  70127. "ldm %[a]!, {r3, r4}\n\t"
  70128. #ifdef WOLFSSL_KEIL
  70129. "sbcs r3, r3, r5\n\t"
  70130. #elif defined(__clang__)
  70131. "sbcs r3, r5\n\t"
  70132. #else
  70133. "sbc r3, r5\n\t"
  70134. #endif
  70135. #ifdef WOLFSSL_KEIL
  70136. "sbcs r4, r4, r6\n\t"
  70137. #elif defined(__clang__)
  70138. "sbcs r4, r6\n\t"
  70139. #else
  70140. "sbc r4, r6\n\t"
  70141. #endif
  70142. "stm %[r]!, {r3, r4}\n\t"
  70143. "ldm %[b]!, {r5, r6}\n\t"
  70144. "ldm %[a]!, {r3, r4}\n\t"
  70145. #ifdef WOLFSSL_KEIL
  70146. "sbcs r3, r3, r5\n\t"
  70147. #elif defined(__clang__)
  70148. "sbcs r3, r5\n\t"
  70149. #else
  70150. "sbc r3, r5\n\t"
  70151. #endif
  70152. #ifdef WOLFSSL_KEIL
  70153. "sbcs r4, r4, r6\n\t"
  70154. #elif defined(__clang__)
  70155. "sbcs r4, r6\n\t"
  70156. #else
  70157. "sbc r4, r6\n\t"
  70158. #endif
  70159. "stm %[r]!, {r3, r4}\n\t"
  70160. "ldm %[b]!, {r5, r6}\n\t"
  70161. "ldm %[a]!, {r3, r4}\n\t"
  70162. #ifdef WOLFSSL_KEIL
  70163. "sbcs r3, r3, r5\n\t"
  70164. #elif defined(__clang__)
  70165. "sbcs r3, r5\n\t"
  70166. #else
  70167. "sbc r3, r5\n\t"
  70168. #endif
  70169. #ifdef WOLFSSL_KEIL
  70170. "sbcs r4, r4, r6\n\t"
  70171. #elif defined(__clang__)
  70172. "sbcs r4, r6\n\t"
  70173. #else
  70174. "sbc r4, r6\n\t"
  70175. #endif
  70176. "stm %[r]!, {r3, r4}\n\t"
  70177. "ldm %[b]!, {r5, r6}\n\t"
  70178. "ldm %[a]!, {r3, r4}\n\t"
  70179. #ifdef WOLFSSL_KEIL
  70180. "sbcs r3, r3, r5\n\t"
  70181. #elif defined(__clang__)
  70182. "sbcs r3, r5\n\t"
  70183. #else
  70184. "sbc r3, r5\n\t"
  70185. #endif
  70186. #ifdef WOLFSSL_KEIL
  70187. "sbcs r4, r4, r6\n\t"
  70188. #elif defined(__clang__)
  70189. "sbcs r4, r6\n\t"
  70190. #else
  70191. "sbc r4, r6\n\t"
  70192. #endif
  70193. "stm %[r]!, {r3, r4}\n\t"
  70194. "ldm %[b]!, {r5, r6}\n\t"
  70195. "ldm %[a]!, {r3, r4}\n\t"
  70196. #ifdef WOLFSSL_KEIL
  70197. "sbcs r3, r3, r5\n\t"
  70198. #elif defined(__clang__)
  70199. "sbcs r3, r5\n\t"
  70200. #else
  70201. "sbc r3, r5\n\t"
  70202. #endif
  70203. #ifdef WOLFSSL_KEIL
  70204. "sbcs r4, r4, r6\n\t"
  70205. #elif defined(__clang__)
  70206. "sbcs r4, r6\n\t"
  70207. #else
  70208. "sbc r4, r6\n\t"
  70209. #endif
  70210. "stm %[r]!, {r3, r4}\n\t"
  70211. #ifdef WOLFSSL_KEIL
  70212. "sbcs %[r], %[r], %[r]\n\t"
  70213. #elif defined(__clang__)
  70214. "sbcs %[r], %[r]\n\t"
  70215. #else
  70216. "sbc %[r], %[r]\n\t"
  70217. #endif
  70218. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  70219. :
  70220. : "memory", "r3", "r4", "r5", "r6"
  70221. );
  70222. return (uint32_t)(size_t)r;
  70223. }
  70224. /* Square a and put result in r. (r = a * a)
  70225. *
  70226. * r A single precision integer.
  70227. * a A single precision integer.
  70228. */
  70229. SP_NOINLINE static void sp_3072_sqr_48(sp_digit* r, const sp_digit* a)
  70230. {
  70231. sp_digit* z0 = r;
  70232. sp_digit* z2 = r + 48;
  70233. sp_digit z1[48];
  70234. sp_digit* a1 = z1;
  70235. sp_digit* zero = z1 + 24;
  70236. sp_digit u;
  70237. sp_digit mask;
  70238. sp_digit* p1;
  70239. sp_digit* p2;
  70240. XMEMSET(zero, 0, sizeof(sp_digit) * 24);
  70241. mask = sp_3072_sub_24(a1, a, &a[24]);
  70242. p1 = (sp_digit*)(((sp_digit)zero & mask ) | ((sp_digit)a1 & (~mask)));
  70243. p2 = (sp_digit*)(((sp_digit)zero & (~mask)) | ((sp_digit)a1 & mask ));
  70244. (void)sp_3072_sub_24(a1, p1, p2);
  70245. sp_3072_sqr_24(z2, &a[24]);
  70246. sp_3072_sqr_24(z0, a);
  70247. sp_3072_sqr_24(z1, a1);
  70248. u = 0;
  70249. u -= sp_3072_sub_in_place_48(z1, z2);
  70250. u -= sp_3072_sub_in_place_48(z1, z0);
  70251. u += sp_3072_sub_in_place_48(r + 24, z1);
  70252. sp_3072_add_word_24(r + 72, r + 72, u);
  70253. }
  70254. /* Sub b from a into r. (r = a - b)
  70255. *
  70256. * r A single precision integer.
  70257. * a A single precision integer.
  70258. * b A single precision integer.
  70259. */
  70260. SP_NOINLINE static sp_digit sp_3072_sub_48(sp_digit* r, const sp_digit* a,
  70261. const sp_digit* b)
  70262. {
  70263. __asm__ __volatile__ (
  70264. "ldm %[b]!, {r5, r6}\n\t"
  70265. "ldm %[a]!, {r3, r4}\n\t"
  70266. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70267. "subs r3, r3, r5\n\t"
  70268. #else
  70269. "sub r3, r3, r5\n\t"
  70270. #endif
  70271. #ifdef WOLFSSL_KEIL
  70272. "sbcs r4, r4, r6\n\t"
  70273. #elif defined(__clang__)
  70274. "sbcs r4, r6\n\t"
  70275. #else
  70276. "sbc r4, r6\n\t"
  70277. #endif
  70278. "stm %[r]!, {r3, r4}\n\t"
  70279. "ldm %[b]!, {r5, r6}\n\t"
  70280. "ldm %[a]!, {r3, r4}\n\t"
  70281. #ifdef WOLFSSL_KEIL
  70282. "sbcs r3, r3, r5\n\t"
  70283. #elif defined(__clang__)
  70284. "sbcs r3, r5\n\t"
  70285. #else
  70286. "sbc r3, r5\n\t"
  70287. #endif
  70288. #ifdef WOLFSSL_KEIL
  70289. "sbcs r4, r4, r6\n\t"
  70290. #elif defined(__clang__)
  70291. "sbcs r4, r6\n\t"
  70292. #else
  70293. "sbc r4, r6\n\t"
  70294. #endif
  70295. "stm %[r]!, {r3, r4}\n\t"
  70296. "ldm %[b]!, {r5, r6}\n\t"
  70297. "ldm %[a]!, {r3, r4}\n\t"
  70298. #ifdef WOLFSSL_KEIL
  70299. "sbcs r3, r3, r5\n\t"
  70300. #elif defined(__clang__)
  70301. "sbcs r3, r5\n\t"
  70302. #else
  70303. "sbc r3, r5\n\t"
  70304. #endif
  70305. #ifdef WOLFSSL_KEIL
  70306. "sbcs r4, r4, r6\n\t"
  70307. #elif defined(__clang__)
  70308. "sbcs r4, r6\n\t"
  70309. #else
  70310. "sbc r4, r6\n\t"
  70311. #endif
  70312. "stm %[r]!, {r3, r4}\n\t"
  70313. "ldm %[b]!, {r5, r6}\n\t"
  70314. "ldm %[a]!, {r3, r4}\n\t"
  70315. #ifdef WOLFSSL_KEIL
  70316. "sbcs r3, r3, r5\n\t"
  70317. #elif defined(__clang__)
  70318. "sbcs r3, r5\n\t"
  70319. #else
  70320. "sbc r3, r5\n\t"
  70321. #endif
  70322. #ifdef WOLFSSL_KEIL
  70323. "sbcs r4, r4, r6\n\t"
  70324. #elif defined(__clang__)
  70325. "sbcs r4, r6\n\t"
  70326. #else
  70327. "sbc r4, r6\n\t"
  70328. #endif
  70329. "stm %[r]!, {r3, r4}\n\t"
  70330. "ldm %[b]!, {r5, r6}\n\t"
  70331. "ldm %[a]!, {r3, r4}\n\t"
  70332. #ifdef WOLFSSL_KEIL
  70333. "sbcs r3, r3, r5\n\t"
  70334. #elif defined(__clang__)
  70335. "sbcs r3, r5\n\t"
  70336. #else
  70337. "sbc r3, r5\n\t"
  70338. #endif
  70339. #ifdef WOLFSSL_KEIL
  70340. "sbcs r4, r4, r6\n\t"
  70341. #elif defined(__clang__)
  70342. "sbcs r4, r6\n\t"
  70343. #else
  70344. "sbc r4, r6\n\t"
  70345. #endif
  70346. "stm %[r]!, {r3, r4}\n\t"
  70347. "ldm %[b]!, {r5, r6}\n\t"
  70348. "ldm %[a]!, {r3, r4}\n\t"
  70349. #ifdef WOLFSSL_KEIL
  70350. "sbcs r3, r3, r5\n\t"
  70351. #elif defined(__clang__)
  70352. "sbcs r3, r5\n\t"
  70353. #else
  70354. "sbc r3, r5\n\t"
  70355. #endif
  70356. #ifdef WOLFSSL_KEIL
  70357. "sbcs r4, r4, r6\n\t"
  70358. #elif defined(__clang__)
  70359. "sbcs r4, r6\n\t"
  70360. #else
  70361. "sbc r4, r6\n\t"
  70362. #endif
  70363. "stm %[r]!, {r3, r4}\n\t"
  70364. "ldm %[b]!, {r5, r6}\n\t"
  70365. "ldm %[a]!, {r3, r4}\n\t"
  70366. #ifdef WOLFSSL_KEIL
  70367. "sbcs r3, r3, r5\n\t"
  70368. #elif defined(__clang__)
  70369. "sbcs r3, r5\n\t"
  70370. #else
  70371. "sbc r3, r5\n\t"
  70372. #endif
  70373. #ifdef WOLFSSL_KEIL
  70374. "sbcs r4, r4, r6\n\t"
  70375. #elif defined(__clang__)
  70376. "sbcs r4, r6\n\t"
  70377. #else
  70378. "sbc r4, r6\n\t"
  70379. #endif
  70380. "stm %[r]!, {r3, r4}\n\t"
  70381. "ldm %[b]!, {r5, r6}\n\t"
  70382. "ldm %[a]!, {r3, r4}\n\t"
  70383. #ifdef WOLFSSL_KEIL
  70384. "sbcs r3, r3, r5\n\t"
  70385. #elif defined(__clang__)
  70386. "sbcs r3, r5\n\t"
  70387. #else
  70388. "sbc r3, r5\n\t"
  70389. #endif
  70390. #ifdef WOLFSSL_KEIL
  70391. "sbcs r4, r4, r6\n\t"
  70392. #elif defined(__clang__)
  70393. "sbcs r4, r6\n\t"
  70394. #else
  70395. "sbc r4, r6\n\t"
  70396. #endif
  70397. "stm %[r]!, {r3, r4}\n\t"
  70398. "ldm %[b]!, {r5, r6}\n\t"
  70399. "ldm %[a]!, {r3, r4}\n\t"
  70400. #ifdef WOLFSSL_KEIL
  70401. "sbcs r3, r3, r5\n\t"
  70402. #elif defined(__clang__)
  70403. "sbcs r3, r5\n\t"
  70404. #else
  70405. "sbc r3, r5\n\t"
  70406. #endif
  70407. #ifdef WOLFSSL_KEIL
  70408. "sbcs r4, r4, r6\n\t"
  70409. #elif defined(__clang__)
  70410. "sbcs r4, r6\n\t"
  70411. #else
  70412. "sbc r4, r6\n\t"
  70413. #endif
  70414. "stm %[r]!, {r3, r4}\n\t"
  70415. "ldm %[b]!, {r5, r6}\n\t"
  70416. "ldm %[a]!, {r3, r4}\n\t"
  70417. #ifdef WOLFSSL_KEIL
  70418. "sbcs r3, r3, r5\n\t"
  70419. #elif defined(__clang__)
  70420. "sbcs r3, r5\n\t"
  70421. #else
  70422. "sbc r3, r5\n\t"
  70423. #endif
  70424. #ifdef WOLFSSL_KEIL
  70425. "sbcs r4, r4, r6\n\t"
  70426. #elif defined(__clang__)
  70427. "sbcs r4, r6\n\t"
  70428. #else
  70429. "sbc r4, r6\n\t"
  70430. #endif
  70431. "stm %[r]!, {r3, r4}\n\t"
  70432. "ldm %[b]!, {r5, r6}\n\t"
  70433. "ldm %[a]!, {r3, r4}\n\t"
  70434. #ifdef WOLFSSL_KEIL
  70435. "sbcs r3, r3, r5\n\t"
  70436. #elif defined(__clang__)
  70437. "sbcs r3, r5\n\t"
  70438. #else
  70439. "sbc r3, r5\n\t"
  70440. #endif
  70441. #ifdef WOLFSSL_KEIL
  70442. "sbcs r4, r4, r6\n\t"
  70443. #elif defined(__clang__)
  70444. "sbcs r4, r6\n\t"
  70445. #else
  70446. "sbc r4, r6\n\t"
  70447. #endif
  70448. "stm %[r]!, {r3, r4}\n\t"
  70449. "ldm %[b]!, {r5, r6}\n\t"
  70450. "ldm %[a]!, {r3, r4}\n\t"
  70451. #ifdef WOLFSSL_KEIL
  70452. "sbcs r3, r3, r5\n\t"
  70453. #elif defined(__clang__)
  70454. "sbcs r3, r5\n\t"
  70455. #else
  70456. "sbc r3, r5\n\t"
  70457. #endif
  70458. #ifdef WOLFSSL_KEIL
  70459. "sbcs r4, r4, r6\n\t"
  70460. #elif defined(__clang__)
  70461. "sbcs r4, r6\n\t"
  70462. #else
  70463. "sbc r4, r6\n\t"
  70464. #endif
  70465. "stm %[r]!, {r3, r4}\n\t"
  70466. "ldm %[b]!, {r5, r6}\n\t"
  70467. "ldm %[a]!, {r3, r4}\n\t"
  70468. #ifdef WOLFSSL_KEIL
  70469. "sbcs r3, r3, r5\n\t"
  70470. #elif defined(__clang__)
  70471. "sbcs r3, r5\n\t"
  70472. #else
  70473. "sbc r3, r5\n\t"
  70474. #endif
  70475. #ifdef WOLFSSL_KEIL
  70476. "sbcs r4, r4, r6\n\t"
  70477. #elif defined(__clang__)
  70478. "sbcs r4, r6\n\t"
  70479. #else
  70480. "sbc r4, r6\n\t"
  70481. #endif
  70482. "stm %[r]!, {r3, r4}\n\t"
  70483. "ldm %[b]!, {r5, r6}\n\t"
  70484. "ldm %[a]!, {r3, r4}\n\t"
  70485. #ifdef WOLFSSL_KEIL
  70486. "sbcs r3, r3, r5\n\t"
  70487. #elif defined(__clang__)
  70488. "sbcs r3, r5\n\t"
  70489. #else
  70490. "sbc r3, r5\n\t"
  70491. #endif
  70492. #ifdef WOLFSSL_KEIL
  70493. "sbcs r4, r4, r6\n\t"
  70494. #elif defined(__clang__)
  70495. "sbcs r4, r6\n\t"
  70496. #else
  70497. "sbc r4, r6\n\t"
  70498. #endif
  70499. "stm %[r]!, {r3, r4}\n\t"
  70500. "ldm %[b]!, {r5, r6}\n\t"
  70501. "ldm %[a]!, {r3, r4}\n\t"
  70502. #ifdef WOLFSSL_KEIL
  70503. "sbcs r3, r3, r5\n\t"
  70504. #elif defined(__clang__)
  70505. "sbcs r3, r5\n\t"
  70506. #else
  70507. "sbc r3, r5\n\t"
  70508. #endif
  70509. #ifdef WOLFSSL_KEIL
  70510. "sbcs r4, r4, r6\n\t"
  70511. #elif defined(__clang__)
  70512. "sbcs r4, r6\n\t"
  70513. #else
  70514. "sbc r4, r6\n\t"
  70515. #endif
  70516. "stm %[r]!, {r3, r4}\n\t"
  70517. "ldm %[b]!, {r5, r6}\n\t"
  70518. "ldm %[a]!, {r3, r4}\n\t"
  70519. #ifdef WOLFSSL_KEIL
  70520. "sbcs r3, r3, r5\n\t"
  70521. #elif defined(__clang__)
  70522. "sbcs r3, r5\n\t"
  70523. #else
  70524. "sbc r3, r5\n\t"
  70525. #endif
  70526. #ifdef WOLFSSL_KEIL
  70527. "sbcs r4, r4, r6\n\t"
  70528. #elif defined(__clang__)
  70529. "sbcs r4, r6\n\t"
  70530. #else
  70531. "sbc r4, r6\n\t"
  70532. #endif
  70533. "stm %[r]!, {r3, r4}\n\t"
  70534. "ldm %[b]!, {r5, r6}\n\t"
  70535. "ldm %[a]!, {r3, r4}\n\t"
  70536. #ifdef WOLFSSL_KEIL
  70537. "sbcs r3, r3, r5\n\t"
  70538. #elif defined(__clang__)
  70539. "sbcs r3, r5\n\t"
  70540. #else
  70541. "sbc r3, r5\n\t"
  70542. #endif
  70543. #ifdef WOLFSSL_KEIL
  70544. "sbcs r4, r4, r6\n\t"
  70545. #elif defined(__clang__)
  70546. "sbcs r4, r6\n\t"
  70547. #else
  70548. "sbc r4, r6\n\t"
  70549. #endif
  70550. "stm %[r]!, {r3, r4}\n\t"
  70551. "ldm %[b]!, {r5, r6}\n\t"
  70552. "ldm %[a]!, {r3, r4}\n\t"
  70553. #ifdef WOLFSSL_KEIL
  70554. "sbcs r3, r3, r5\n\t"
  70555. #elif defined(__clang__)
  70556. "sbcs r3, r5\n\t"
  70557. #else
  70558. "sbc r3, r5\n\t"
  70559. #endif
  70560. #ifdef WOLFSSL_KEIL
  70561. "sbcs r4, r4, r6\n\t"
  70562. #elif defined(__clang__)
  70563. "sbcs r4, r6\n\t"
  70564. #else
  70565. "sbc r4, r6\n\t"
  70566. #endif
  70567. "stm %[r]!, {r3, r4}\n\t"
  70568. "ldm %[b]!, {r5, r6}\n\t"
  70569. "ldm %[a]!, {r3, r4}\n\t"
  70570. #ifdef WOLFSSL_KEIL
  70571. "sbcs r3, r3, r5\n\t"
  70572. #elif defined(__clang__)
  70573. "sbcs r3, r5\n\t"
  70574. #else
  70575. "sbc r3, r5\n\t"
  70576. #endif
  70577. #ifdef WOLFSSL_KEIL
  70578. "sbcs r4, r4, r6\n\t"
  70579. #elif defined(__clang__)
  70580. "sbcs r4, r6\n\t"
  70581. #else
  70582. "sbc r4, r6\n\t"
  70583. #endif
  70584. "stm %[r]!, {r3, r4}\n\t"
  70585. "ldm %[b]!, {r5, r6}\n\t"
  70586. "ldm %[a]!, {r3, r4}\n\t"
  70587. #ifdef WOLFSSL_KEIL
  70588. "sbcs r3, r3, r5\n\t"
  70589. #elif defined(__clang__)
  70590. "sbcs r3, r5\n\t"
  70591. #else
  70592. "sbc r3, r5\n\t"
  70593. #endif
  70594. #ifdef WOLFSSL_KEIL
  70595. "sbcs r4, r4, r6\n\t"
  70596. #elif defined(__clang__)
  70597. "sbcs r4, r6\n\t"
  70598. #else
  70599. "sbc r4, r6\n\t"
  70600. #endif
  70601. "stm %[r]!, {r3, r4}\n\t"
  70602. "ldm %[b]!, {r5, r6}\n\t"
  70603. "ldm %[a]!, {r3, r4}\n\t"
  70604. #ifdef WOLFSSL_KEIL
  70605. "sbcs r3, r3, r5\n\t"
  70606. #elif defined(__clang__)
  70607. "sbcs r3, r5\n\t"
  70608. #else
  70609. "sbc r3, r5\n\t"
  70610. #endif
  70611. #ifdef WOLFSSL_KEIL
  70612. "sbcs r4, r4, r6\n\t"
  70613. #elif defined(__clang__)
  70614. "sbcs r4, r6\n\t"
  70615. #else
  70616. "sbc r4, r6\n\t"
  70617. #endif
  70618. "stm %[r]!, {r3, r4}\n\t"
  70619. "ldm %[b]!, {r5, r6}\n\t"
  70620. "ldm %[a]!, {r3, r4}\n\t"
  70621. #ifdef WOLFSSL_KEIL
  70622. "sbcs r3, r3, r5\n\t"
  70623. #elif defined(__clang__)
  70624. "sbcs r3, r5\n\t"
  70625. #else
  70626. "sbc r3, r5\n\t"
  70627. #endif
  70628. #ifdef WOLFSSL_KEIL
  70629. "sbcs r4, r4, r6\n\t"
  70630. #elif defined(__clang__)
  70631. "sbcs r4, r6\n\t"
  70632. #else
  70633. "sbc r4, r6\n\t"
  70634. #endif
  70635. "stm %[r]!, {r3, r4}\n\t"
  70636. "ldm %[b]!, {r5, r6}\n\t"
  70637. "ldm %[a]!, {r3, r4}\n\t"
  70638. #ifdef WOLFSSL_KEIL
  70639. "sbcs r3, r3, r5\n\t"
  70640. #elif defined(__clang__)
  70641. "sbcs r3, r5\n\t"
  70642. #else
  70643. "sbc r3, r5\n\t"
  70644. #endif
  70645. #ifdef WOLFSSL_KEIL
  70646. "sbcs r4, r4, r6\n\t"
  70647. #elif defined(__clang__)
  70648. "sbcs r4, r6\n\t"
  70649. #else
  70650. "sbc r4, r6\n\t"
  70651. #endif
  70652. "stm %[r]!, {r3, r4}\n\t"
  70653. "ldm %[b]!, {r5, r6}\n\t"
  70654. "ldm %[a]!, {r3, r4}\n\t"
  70655. #ifdef WOLFSSL_KEIL
  70656. "sbcs r3, r3, r5\n\t"
  70657. #elif defined(__clang__)
  70658. "sbcs r3, r5\n\t"
  70659. #else
  70660. "sbc r3, r5\n\t"
  70661. #endif
  70662. #ifdef WOLFSSL_KEIL
  70663. "sbcs r4, r4, r6\n\t"
  70664. #elif defined(__clang__)
  70665. "sbcs r4, r6\n\t"
  70666. #else
  70667. "sbc r4, r6\n\t"
  70668. #endif
  70669. "stm %[r]!, {r3, r4}\n\t"
  70670. #ifdef WOLFSSL_KEIL
  70671. "sbcs %[r], %[r], %[r]\n\t"
  70672. #elif defined(__clang__)
  70673. "sbcs %[r], %[r]\n\t"
  70674. #else
  70675. "sbc %[r], %[r]\n\t"
  70676. #endif
  70677. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  70678. :
  70679. : "memory", "r3", "r4", "r5", "r6"
  70680. );
  70681. return (uint32_t)(size_t)r;
  70682. }
  70683. /* Square a and put result in r. (r = a * a)
  70684. *
  70685. * r A single precision integer.
  70686. * a A single precision integer.
  70687. */
  70688. SP_NOINLINE static void sp_3072_sqr_96(sp_digit* r, const sp_digit* a)
  70689. {
  70690. sp_digit* z0 = r;
  70691. sp_digit* z2 = r + 96;
  70692. sp_digit z1[96];
  70693. sp_digit* a1 = z1;
  70694. sp_digit* zero = z1 + 48;
  70695. sp_digit u;
  70696. sp_digit mask;
  70697. sp_digit* p1;
  70698. sp_digit* p2;
  70699. XMEMSET(zero, 0, sizeof(sp_digit) * 48);
  70700. mask = sp_3072_sub_48(a1, a, &a[48]);
  70701. p1 = (sp_digit*)(((sp_digit)zero & mask ) | ((sp_digit)a1 & (~mask)));
  70702. p2 = (sp_digit*)(((sp_digit)zero & (~mask)) | ((sp_digit)a1 & mask ));
  70703. (void)sp_3072_sub_48(a1, p1, p2);
  70704. sp_3072_sqr_48(z2, &a[48]);
  70705. sp_3072_sqr_48(z0, a);
  70706. sp_3072_sqr_48(z1, a1);
  70707. u = 0;
  70708. u -= sp_3072_sub_in_place_96(z1, z2);
  70709. u -= sp_3072_sub_in_place_96(z1, z0);
  70710. u += sp_3072_sub_in_place_96(r + 48, z1);
  70711. sp_3072_add_word_48(r + 144, r + 144, u);
  70712. }
  70713. #endif /* !WOLFSSL_SP_SMALL */
  70714. #ifdef WOLFSSL_SP_SMALL
  70715. /* Add b to a into r. (r = a + b)
  70716. *
  70717. * r A single precision integer.
  70718. * a A single precision integer.
  70719. * b A single precision integer.
  70720. */
  70721. SP_NOINLINE static sp_digit sp_3072_add_96(sp_digit* r, const sp_digit* a,
  70722. const sp_digit* b)
  70723. {
  70724. __asm__ __volatile__ (
  70725. "movs r6, %[a]\n\t"
  70726. "movs r7, #0\n\t"
  70727. "movs r3, #0\n\t"
  70728. "movs r4, #0xff\n\t"
  70729. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70730. "adds r4, r4, #0x81\n\t"
  70731. #else
  70732. "add r4, r4, #0x81\n\t"
  70733. #endif
  70734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70735. "subs r7, r7, #1\n\t"
  70736. #else
  70737. "sub r7, r7, #1\n\t"
  70738. #endif
  70739. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70740. "adds r6, r6, r4\n\t"
  70741. #else
  70742. "add r6, r6, r4\n\t"
  70743. #endif
  70744. "\n"
  70745. "L_sp_3072_add_96_word_%=:\n\t"
  70746. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70747. "adds r3, r3, r7\n\t"
  70748. #else
  70749. "add r3, r3, r7\n\t"
  70750. #endif
  70751. "ldr r4, [%[a]]\n\t"
  70752. "ldr r5, [%[b]]\n\t"
  70753. #ifdef WOLFSSL_KEIL
  70754. "adcs r4, r4, r5\n\t"
  70755. #elif defined(__clang__)
  70756. "adcs r4, r5\n\t"
  70757. #else
  70758. "adc r4, r5\n\t"
  70759. #endif
  70760. "str r4, [%[r]]\n\t"
  70761. "movs r3, #0\n\t"
  70762. #ifdef WOLFSSL_KEIL
  70763. "adcs r3, r3, r3\n\t"
  70764. #elif defined(__clang__)
  70765. "adcs r3, r3\n\t"
  70766. #else
  70767. "adc r3, r3\n\t"
  70768. #endif
  70769. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70770. "adds %[a], %[a], #4\n\t"
  70771. #else
  70772. "add %[a], %[a], #4\n\t"
  70773. #endif
  70774. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70775. "adds %[b], %[b], #4\n\t"
  70776. #else
  70777. "add %[b], %[b], #4\n\t"
  70778. #endif
  70779. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70780. "adds %[r], %[r], #4\n\t"
  70781. #else
  70782. "add %[r], %[r], #4\n\t"
  70783. #endif
  70784. "cmp %[a], r6\n\t"
  70785. "bne L_sp_3072_add_96_word_%=\n\t"
  70786. "movs %[r], r3\n\t"
  70787. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  70788. :
  70789. : "memory", "r3", "r4", "r5", "r6", "r7"
  70790. );
  70791. return (uint32_t)(size_t)r;
  70792. }
  70793. #endif /* WOLFSSL_SP_SMALL */
  70794. #ifdef WOLFSSL_SP_SMALL
  70795. /* Sub b from a into a. (a -= b)
  70796. *
  70797. * a A single precision integer.
  70798. * b A single precision integer.
  70799. */
  70800. SP_NOINLINE static sp_digit sp_3072_sub_in_place_96(sp_digit* a,
  70801. const sp_digit* b)
  70802. {
  70803. __asm__ __volatile__ (
  70804. "movs r7, %[a]\n\t"
  70805. "movs r2, #0\n\t"
  70806. "movs r5, #0xff\n\t"
  70807. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70808. "adds r5, r5, #0x81\n\t"
  70809. #else
  70810. "add r5, r5, #0x81\n\t"
  70811. #endif
  70812. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70813. "adds r7, r7, r5\n\t"
  70814. #else
  70815. "add r7, r7, r5\n\t"
  70816. #endif
  70817. "\n"
  70818. "L_sp_3072_sub_in_place_96_words_%=:\n\t"
  70819. "movs r5, #0\n\t"
  70820. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70821. "subs r5, r5, r2\n\t"
  70822. #else
  70823. "sub r5, r5, r2\n\t"
  70824. #endif
  70825. "ldr r3, [%[a]]\n\t"
  70826. "ldr r4, [%[a], #4]\n\t"
  70827. "ldr r5, [%[b]]\n\t"
  70828. "ldr r6, [%[b], #4]\n\t"
  70829. #ifdef WOLFSSL_KEIL
  70830. "sbcs r3, r3, r5\n\t"
  70831. #elif defined(__clang__)
  70832. "sbcs r3, r5\n\t"
  70833. #else
  70834. "sbc r3, r5\n\t"
  70835. #endif
  70836. #ifdef WOLFSSL_KEIL
  70837. "sbcs r4, r4, r6\n\t"
  70838. #elif defined(__clang__)
  70839. "sbcs r4, r6\n\t"
  70840. #else
  70841. "sbc r4, r6\n\t"
  70842. #endif
  70843. "str r3, [%[a]]\n\t"
  70844. "str r4, [%[a], #4]\n\t"
  70845. #ifdef WOLFSSL_KEIL
  70846. "sbcs r2, r2, r2\n\t"
  70847. #elif defined(__clang__)
  70848. "sbcs r2, r2\n\t"
  70849. #else
  70850. "sbc r2, r2\n\t"
  70851. #endif
  70852. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70853. "adds %[a], %[a], #8\n\t"
  70854. #else
  70855. "add %[a], %[a], #8\n\t"
  70856. #endif
  70857. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70858. "adds %[b], %[b], #8\n\t"
  70859. #else
  70860. "add %[b], %[b], #8\n\t"
  70861. #endif
  70862. "cmp %[a], r7\n\t"
  70863. "bne L_sp_3072_sub_in_place_96_words_%=\n\t"
  70864. "movs %[a], r2\n\t"
  70865. : [a] "+l" (a), [b] "+l" (b)
  70866. :
  70867. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  70868. );
  70869. return (uint32_t)(size_t)a;
  70870. }
  70871. #endif /* WOLFSSL_SP_SMALL */
  70872. #ifdef WOLFSSL_SP_SMALL
  70873. /* Multiply a and b into r. (r = a * b)
  70874. *
  70875. * r A single precision integer.
  70876. * a A single precision integer.
  70877. * b A single precision integer.
  70878. */
  70879. SP_NOINLINE static void sp_3072_mul_96(sp_digit* r, const sp_digit* a,
  70880. const sp_digit* b)
  70881. {
  70882. sp_digit t[96 * 2];
  70883. sp_digit* tmp = t;
  70884. __asm__ __volatile__ (
  70885. "movs r3, #0\n\t"
  70886. "movs r4, #0\n\t"
  70887. "mov r8, r3\n\t"
  70888. "mov r11, %[tmp]\n\t"
  70889. "mov r9, %[a]\n\t"
  70890. "mov r10, %[b]\n\t"
  70891. "movs r6, #0xff\n\t"
  70892. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70893. "adds r6, r6, #0x81\n\t"
  70894. #else
  70895. "add r6, r6, #0x81\n\t"
  70896. #endif
  70897. "add r6, r6, r9\n\t"
  70898. "mov r12, r6\n\t"
  70899. "\n"
  70900. "L_sp_3072_mul_96_words_%=:\n\t"
  70901. "movs %[tmp], #0\n\t"
  70902. "movs r5, #0\n\t"
  70903. "movs r6, #0xff\n\t"
  70904. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70905. "adds r6, r6, #0x7d\n\t"
  70906. #else
  70907. "add r6, r6, #0x7d\n\t"
  70908. #endif
  70909. "mov %[a], r8\n\t"
  70910. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70911. "subs %[a], %[a], r6\n\t"
  70912. #else
  70913. "sub %[a], %[a], r6\n\t"
  70914. #endif
  70915. #ifdef WOLFSSL_KEIL
  70916. "sbcs r6, r6, r6\n\t"
  70917. #elif defined(__clang__)
  70918. "sbcs r6, r6\n\t"
  70919. #else
  70920. "sbc r6, r6\n\t"
  70921. #endif
  70922. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70923. "mvns r6, r6\n\t"
  70924. #else
  70925. "mvn r6, r6\n\t"
  70926. #endif
  70927. #ifdef WOLFSSL_KEIL
  70928. "ands %[a], %[a], r6\n\t"
  70929. #elif defined(__clang__)
  70930. "ands %[a], r6\n\t"
  70931. #else
  70932. "and %[a], r6\n\t"
  70933. #endif
  70934. "mov %[b], r8\n\t"
  70935. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70936. "subs %[b], %[b], %[a]\n\t"
  70937. #else
  70938. "sub %[b], %[b], %[a]\n\t"
  70939. #endif
  70940. "add %[a], %[a], r9\n\t"
  70941. "add %[b], %[b], r10\n\t"
  70942. "\n"
  70943. "L_sp_3072_mul_96_mul_%=:\n\t"
  70944. "# Multiply Start\n\t"
  70945. "ldrh r6, [%[a]]\n\t"
  70946. "ldrh r7, [%[b]]\n\t"
  70947. #ifdef WOLFSSL_KEIL
  70948. "muls r7, r6, r7\n\t"
  70949. #elif defined(__clang__)
  70950. "muls r7, r6\n\t"
  70951. #else
  70952. "mul r7, r6\n\t"
  70953. #endif
  70954. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70955. "adds r3, r3, r7\n\t"
  70956. #else
  70957. "add r3, r3, r7\n\t"
  70958. #endif
  70959. #ifdef WOLFSSL_KEIL
  70960. "adcs r4, r4, %[tmp]\n\t"
  70961. #elif defined(__clang__)
  70962. "adcs r4, %[tmp]\n\t"
  70963. #else
  70964. "adc r4, %[tmp]\n\t"
  70965. #endif
  70966. #ifdef WOLFSSL_KEIL
  70967. "adcs r5, r5, %[tmp]\n\t"
  70968. #elif defined(__clang__)
  70969. "adcs r5, %[tmp]\n\t"
  70970. #else
  70971. "adc r5, %[tmp]\n\t"
  70972. #endif
  70973. "ldr r7, [%[b]]\n\t"
  70974. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70975. "lsrs r7, r7, #16\n\t"
  70976. #else
  70977. "lsr r7, r7, #16\n\t"
  70978. #endif
  70979. #ifdef WOLFSSL_KEIL
  70980. "muls r6, r7, r6\n\t"
  70981. #elif defined(__clang__)
  70982. "muls r6, r7\n\t"
  70983. #else
  70984. "mul r6, r7\n\t"
  70985. #endif
  70986. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70987. "lsrs r7, r6, #16\n\t"
  70988. #else
  70989. "lsr r7, r6, #16\n\t"
  70990. #endif
  70991. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70992. "lsls r6, r6, #16\n\t"
  70993. #else
  70994. "lsl r6, r6, #16\n\t"
  70995. #endif
  70996. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70997. "adds r3, r3, r6\n\t"
  70998. #else
  70999. "add r3, r3, r6\n\t"
  71000. #endif
  71001. #ifdef WOLFSSL_KEIL
  71002. "adcs r4, r4, r7\n\t"
  71003. #elif defined(__clang__)
  71004. "adcs r4, r7\n\t"
  71005. #else
  71006. "adc r4, r7\n\t"
  71007. #endif
  71008. #ifdef WOLFSSL_KEIL
  71009. "adcs r5, r5, %[tmp]\n\t"
  71010. #elif defined(__clang__)
  71011. "adcs r5, %[tmp]\n\t"
  71012. #else
  71013. "adc r5, %[tmp]\n\t"
  71014. #endif
  71015. "ldr r6, [%[a]]\n\t"
  71016. "ldr r7, [%[b]]\n\t"
  71017. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71018. "lsrs r6, r6, #16\n\t"
  71019. #else
  71020. "lsr r6, r6, #16\n\t"
  71021. #endif
  71022. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71023. "lsrs r7, r7, #16\n\t"
  71024. #else
  71025. "lsr r7, r7, #16\n\t"
  71026. #endif
  71027. #ifdef WOLFSSL_KEIL
  71028. "muls r7, r6, r7\n\t"
  71029. #elif defined(__clang__)
  71030. "muls r7, r6\n\t"
  71031. #else
  71032. "mul r7, r6\n\t"
  71033. #endif
  71034. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71035. "adds r4, r4, r7\n\t"
  71036. #else
  71037. "add r4, r4, r7\n\t"
  71038. #endif
  71039. #ifdef WOLFSSL_KEIL
  71040. "adcs r5, r5, %[tmp]\n\t"
  71041. #elif defined(__clang__)
  71042. "adcs r5, %[tmp]\n\t"
  71043. #else
  71044. "adc r5, %[tmp]\n\t"
  71045. #endif
  71046. "ldrh r7, [%[b]]\n\t"
  71047. #ifdef WOLFSSL_KEIL
  71048. "muls r6, r7, r6\n\t"
  71049. #elif defined(__clang__)
  71050. "muls r6, r7\n\t"
  71051. #else
  71052. "mul r6, r7\n\t"
  71053. #endif
  71054. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71055. "lsrs r7, r6, #16\n\t"
  71056. #else
  71057. "lsr r7, r6, #16\n\t"
  71058. #endif
  71059. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71060. "lsls r6, r6, #16\n\t"
  71061. #else
  71062. "lsl r6, r6, #16\n\t"
  71063. #endif
  71064. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71065. "adds r3, r3, r6\n\t"
  71066. #else
  71067. "add r3, r3, r6\n\t"
  71068. #endif
  71069. #ifdef WOLFSSL_KEIL
  71070. "adcs r4, r4, r7\n\t"
  71071. #elif defined(__clang__)
  71072. "adcs r4, r7\n\t"
  71073. #else
  71074. "adc r4, r7\n\t"
  71075. #endif
  71076. #ifdef WOLFSSL_KEIL
  71077. "adcs r5, r5, %[tmp]\n\t"
  71078. #elif defined(__clang__)
  71079. "adcs r5, %[tmp]\n\t"
  71080. #else
  71081. "adc r5, %[tmp]\n\t"
  71082. #endif
  71083. "# Multiply Done\n\t"
  71084. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71085. "adds %[a], %[a], #4\n\t"
  71086. #else
  71087. "add %[a], %[a], #4\n\t"
  71088. #endif
  71089. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71090. "subs %[b], %[b], #4\n\t"
  71091. #else
  71092. "sub %[b], %[b], #4\n\t"
  71093. #endif
  71094. "cmp %[a], r12\n\t"
  71095. "beq L_sp_3072_mul_96_done_mul_%=\n\t"
  71096. "mov r6, r8\n\t"
  71097. "add r6, r6, r9\n\t"
  71098. "cmp %[a], r6\n\t"
  71099. "ble L_sp_3072_mul_96_mul_%=\n\t"
  71100. "\n"
  71101. "L_sp_3072_mul_96_done_mul_%=:\n\t"
  71102. "mov %[tmp], r11\n\t"
  71103. "mov r7, r8\n\t"
  71104. "str r3, [%[tmp], r7]\n\t"
  71105. "movs r3, r4\n\t"
  71106. "movs r4, r5\n\t"
  71107. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71108. "adds r7, r7, #4\n\t"
  71109. #else
  71110. "add r7, r7, #4\n\t"
  71111. #endif
  71112. "mov r8, r7\n\t"
  71113. "movs r6, #2\n\t"
  71114. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71115. "lsls r6, r6, #8\n\t"
  71116. #else
  71117. "lsl r6, r6, #8\n\t"
  71118. #endif
  71119. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71120. "adds r6, r6, #0xf8\n\t"
  71121. #else
  71122. "add r6, r6, #0xf8\n\t"
  71123. #endif
  71124. "cmp r7, r6\n\t"
  71125. "ble L_sp_3072_mul_96_words_%=\n\t"
  71126. "str r3, [%[tmp], r7]\n\t"
  71127. "mov %[a], r9\n\t"
  71128. "mov %[b], r10\n\t"
  71129. : [a] "+l" (a), [b] "+l" (b), [tmp] "+l" (tmp)
  71130. :
  71131. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  71132. );
  71133. XMEMCPY(r, t, sizeof(t));
  71134. }
  71135. /* Square a and put result in r. (r = a * a)
  71136. *
  71137. * r A single precision integer.
  71138. * a A single precision integer.
  71139. */
  71140. SP_NOINLINE static void sp_3072_sqr_96(sp_digit* r, const sp_digit* a)
  71141. {
  71142. __asm__ __volatile__ (
  71143. "movs r3, #0\n\t"
  71144. "movs r4, #0\n\t"
  71145. "movs r5, #0\n\t"
  71146. "mov r8, r3\n\t"
  71147. "mov r11, %[r]\n\t"
  71148. "movs r6, #3\n\t"
  71149. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71150. "lsls r6, r6, #8\n\t"
  71151. #else
  71152. "lsl r6, r6, #8\n\t"
  71153. #endif
  71154. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71155. "negs r6, r6\n\t"
  71156. #else
  71157. "neg r6, r6\n\t"
  71158. #endif
  71159. "add sp, sp, r6\n\t"
  71160. "mov r10, sp\n\t"
  71161. "mov r9, %[a]\n\t"
  71162. "\n"
  71163. "L_sp_3072_sqr_96_words_%=:\n\t"
  71164. "movs %[r], #0\n\t"
  71165. "movs r6, #0xff\n\t"
  71166. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71167. "adds r6, r6, #0x7d\n\t"
  71168. #else
  71169. "add r6, r6, #0x7d\n\t"
  71170. #endif
  71171. "mov %[a], r8\n\t"
  71172. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71173. "subs %[a], %[a], r6\n\t"
  71174. #else
  71175. "sub %[a], %[a], r6\n\t"
  71176. #endif
  71177. #ifdef WOLFSSL_KEIL
  71178. "sbcs r6, r6, r6\n\t"
  71179. #elif defined(__clang__)
  71180. "sbcs r6, r6\n\t"
  71181. #else
  71182. "sbc r6, r6\n\t"
  71183. #endif
  71184. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71185. "mvns r6, r6\n\t"
  71186. #else
  71187. "mvn r6, r6\n\t"
  71188. #endif
  71189. #ifdef WOLFSSL_KEIL
  71190. "ands %[a], %[a], r6\n\t"
  71191. #elif defined(__clang__)
  71192. "ands %[a], r6\n\t"
  71193. #else
  71194. "and %[a], r6\n\t"
  71195. #endif
  71196. "mov r2, r8\n\t"
  71197. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71198. "subs r2, r2, %[a]\n\t"
  71199. #else
  71200. "sub r2, r2, %[a]\n\t"
  71201. #endif
  71202. "add %[a], %[a], r9\n\t"
  71203. "add r2, r2, r9\n\t"
  71204. "\n"
  71205. "L_sp_3072_sqr_96_mul_%=:\n\t"
  71206. "cmp r2, %[a]\n\t"
  71207. "beq L_sp_3072_sqr_96_sqr_%=\n\t"
  71208. "# Multiply * 2: Start\n\t"
  71209. "ldrh r6, [%[a]]\n\t"
  71210. "ldrh r7, [r2]\n\t"
  71211. #ifdef WOLFSSL_KEIL
  71212. "muls r7, r6, r7\n\t"
  71213. #elif defined(__clang__)
  71214. "muls r7, r6\n\t"
  71215. #else
  71216. "mul r7, r6\n\t"
  71217. #endif
  71218. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71219. "adds r3, r3, r7\n\t"
  71220. #else
  71221. "add r3, r3, r7\n\t"
  71222. #endif
  71223. #ifdef WOLFSSL_KEIL
  71224. "adcs r4, r4, %[r]\n\t"
  71225. #elif defined(__clang__)
  71226. "adcs r4, %[r]\n\t"
  71227. #else
  71228. "adc r4, %[r]\n\t"
  71229. #endif
  71230. #ifdef WOLFSSL_KEIL
  71231. "adcs r5, r5, %[r]\n\t"
  71232. #elif defined(__clang__)
  71233. "adcs r5, %[r]\n\t"
  71234. #else
  71235. "adc r5, %[r]\n\t"
  71236. #endif
  71237. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71238. "adds r3, r3, r7\n\t"
  71239. #else
  71240. "add r3, r3, r7\n\t"
  71241. #endif
  71242. #ifdef WOLFSSL_KEIL
  71243. "adcs r4, r4, %[r]\n\t"
  71244. #elif defined(__clang__)
  71245. "adcs r4, %[r]\n\t"
  71246. #else
  71247. "adc r4, %[r]\n\t"
  71248. #endif
  71249. #ifdef WOLFSSL_KEIL
  71250. "adcs r5, r5, %[r]\n\t"
  71251. #elif defined(__clang__)
  71252. "adcs r5, %[r]\n\t"
  71253. #else
  71254. "adc r5, %[r]\n\t"
  71255. #endif
  71256. "ldr r7, [r2]\n\t"
  71257. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71258. "lsrs r7, r7, #16\n\t"
  71259. #else
  71260. "lsr r7, r7, #16\n\t"
  71261. #endif
  71262. #ifdef WOLFSSL_KEIL
  71263. "muls r6, r7, r6\n\t"
  71264. #elif defined(__clang__)
  71265. "muls r6, r7\n\t"
  71266. #else
  71267. "mul r6, r7\n\t"
  71268. #endif
  71269. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71270. "lsrs r7, r6, #16\n\t"
  71271. #else
  71272. "lsr r7, r6, #16\n\t"
  71273. #endif
  71274. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71275. "lsls r6, r6, #16\n\t"
  71276. #else
  71277. "lsl r6, r6, #16\n\t"
  71278. #endif
  71279. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71280. "adds r3, r3, r6\n\t"
  71281. #else
  71282. "add r3, r3, r6\n\t"
  71283. #endif
  71284. #ifdef WOLFSSL_KEIL
  71285. "adcs r4, r4, r7\n\t"
  71286. #elif defined(__clang__)
  71287. "adcs r4, r7\n\t"
  71288. #else
  71289. "adc r4, r7\n\t"
  71290. #endif
  71291. #ifdef WOLFSSL_KEIL
  71292. "adcs r5, r5, %[r]\n\t"
  71293. #elif defined(__clang__)
  71294. "adcs r5, %[r]\n\t"
  71295. #else
  71296. "adc r5, %[r]\n\t"
  71297. #endif
  71298. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71299. "adds r3, r3, r6\n\t"
  71300. #else
  71301. "add r3, r3, r6\n\t"
  71302. #endif
  71303. #ifdef WOLFSSL_KEIL
  71304. "adcs r4, r4, r7\n\t"
  71305. #elif defined(__clang__)
  71306. "adcs r4, r7\n\t"
  71307. #else
  71308. "adc r4, r7\n\t"
  71309. #endif
  71310. #ifdef WOLFSSL_KEIL
  71311. "adcs r5, r5, %[r]\n\t"
  71312. #elif defined(__clang__)
  71313. "adcs r5, %[r]\n\t"
  71314. #else
  71315. "adc r5, %[r]\n\t"
  71316. #endif
  71317. "ldr r6, [%[a]]\n\t"
  71318. "ldr r7, [r2]\n\t"
  71319. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71320. "lsrs r6, r6, #16\n\t"
  71321. #else
  71322. "lsr r6, r6, #16\n\t"
  71323. #endif
  71324. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71325. "lsrs r7, r7, #16\n\t"
  71326. #else
  71327. "lsr r7, r7, #16\n\t"
  71328. #endif
  71329. #ifdef WOLFSSL_KEIL
  71330. "muls r7, r6, r7\n\t"
  71331. #elif defined(__clang__)
  71332. "muls r7, r6\n\t"
  71333. #else
  71334. "mul r7, r6\n\t"
  71335. #endif
  71336. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71337. "adds r4, r4, r7\n\t"
  71338. #else
  71339. "add r4, r4, r7\n\t"
  71340. #endif
  71341. #ifdef WOLFSSL_KEIL
  71342. "adcs r5, r5, %[r]\n\t"
  71343. #elif defined(__clang__)
  71344. "adcs r5, %[r]\n\t"
  71345. #else
  71346. "adc r5, %[r]\n\t"
  71347. #endif
  71348. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71349. "adds r4, r4, r7\n\t"
  71350. #else
  71351. "add r4, r4, r7\n\t"
  71352. #endif
  71353. #ifdef WOLFSSL_KEIL
  71354. "adcs r5, r5, %[r]\n\t"
  71355. #elif defined(__clang__)
  71356. "adcs r5, %[r]\n\t"
  71357. #else
  71358. "adc r5, %[r]\n\t"
  71359. #endif
  71360. "ldrh r7, [r2]\n\t"
  71361. #ifdef WOLFSSL_KEIL
  71362. "muls r6, r7, r6\n\t"
  71363. #elif defined(__clang__)
  71364. "muls r6, r7\n\t"
  71365. #else
  71366. "mul r6, r7\n\t"
  71367. #endif
  71368. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71369. "lsrs r7, r6, #16\n\t"
  71370. #else
  71371. "lsr r7, r6, #16\n\t"
  71372. #endif
  71373. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71374. "lsls r6, r6, #16\n\t"
  71375. #else
  71376. "lsl r6, r6, #16\n\t"
  71377. #endif
  71378. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71379. "adds r3, r3, r6\n\t"
  71380. #else
  71381. "add r3, r3, r6\n\t"
  71382. #endif
  71383. #ifdef WOLFSSL_KEIL
  71384. "adcs r4, r4, r7\n\t"
  71385. #elif defined(__clang__)
  71386. "adcs r4, r7\n\t"
  71387. #else
  71388. "adc r4, r7\n\t"
  71389. #endif
  71390. #ifdef WOLFSSL_KEIL
  71391. "adcs r5, r5, %[r]\n\t"
  71392. #elif defined(__clang__)
  71393. "adcs r5, %[r]\n\t"
  71394. #else
  71395. "adc r5, %[r]\n\t"
  71396. #endif
  71397. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71398. "adds r3, r3, r6\n\t"
  71399. #else
  71400. "add r3, r3, r6\n\t"
  71401. #endif
  71402. #ifdef WOLFSSL_KEIL
  71403. "adcs r4, r4, r7\n\t"
  71404. #elif defined(__clang__)
  71405. "adcs r4, r7\n\t"
  71406. #else
  71407. "adc r4, r7\n\t"
  71408. #endif
  71409. #ifdef WOLFSSL_KEIL
  71410. "adcs r5, r5, %[r]\n\t"
  71411. #elif defined(__clang__)
  71412. "adcs r5, %[r]\n\t"
  71413. #else
  71414. "adc r5, %[r]\n\t"
  71415. #endif
  71416. "# Multiply * 2: Done\n\t"
  71417. "bal L_sp_3072_sqr_96_done_sqr_%=\n\t"
  71418. "\n"
  71419. "L_sp_3072_sqr_96_sqr_%=:\n\t"
  71420. "mov r12, r2\n\t"
  71421. "ldr r2, [%[a]]\n\t"
  71422. "# Square: Start\n\t"
  71423. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71424. "lsrs r7, r2, #16\n\t"
  71425. #else
  71426. "lsr r7, r2, #16\n\t"
  71427. #endif
  71428. "uxth r6, r2\n\t"
  71429. #ifdef WOLFSSL_KEIL
  71430. "muls r6, r6, r6\n\t"
  71431. #elif defined(__clang__)
  71432. "muls r6, r6\n\t"
  71433. #else
  71434. "mul r6, r6\n\t"
  71435. #endif
  71436. #ifdef WOLFSSL_KEIL
  71437. "muls r7, r7, r7\n\t"
  71438. #elif defined(__clang__)
  71439. "muls r7, r7\n\t"
  71440. #else
  71441. "mul r7, r7\n\t"
  71442. #endif
  71443. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71444. "adds r3, r3, r6\n\t"
  71445. #else
  71446. "add r3, r3, r6\n\t"
  71447. #endif
  71448. #ifdef WOLFSSL_KEIL
  71449. "adcs r4, r4, r7\n\t"
  71450. #elif defined(__clang__)
  71451. "adcs r4, r7\n\t"
  71452. #else
  71453. "adc r4, r7\n\t"
  71454. #endif
  71455. #ifdef WOLFSSL_KEIL
  71456. "adcs r5, r5, %[r]\n\t"
  71457. #elif defined(__clang__)
  71458. "adcs r5, %[r]\n\t"
  71459. #else
  71460. "adc r5, %[r]\n\t"
  71461. #endif
  71462. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71463. "lsrs r7, r2, #16\n\t"
  71464. #else
  71465. "lsr r7, r2, #16\n\t"
  71466. #endif
  71467. "uxth r6, r2\n\t"
  71468. #ifdef WOLFSSL_KEIL
  71469. "muls r6, r7, r6\n\t"
  71470. #elif defined(__clang__)
  71471. "muls r6, r7\n\t"
  71472. #else
  71473. "mul r6, r7\n\t"
  71474. #endif
  71475. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71476. "lsrs r7, r6, #15\n\t"
  71477. #else
  71478. "lsr r7, r6, #15\n\t"
  71479. #endif
  71480. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71481. "lsls r6, r6, #17\n\t"
  71482. #else
  71483. "lsl r6, r6, #17\n\t"
  71484. #endif
  71485. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71486. "adds r3, r3, r6\n\t"
  71487. #else
  71488. "add r3, r3, r6\n\t"
  71489. #endif
  71490. #ifdef WOLFSSL_KEIL
  71491. "adcs r4, r4, r7\n\t"
  71492. #elif defined(__clang__)
  71493. "adcs r4, r7\n\t"
  71494. #else
  71495. "adc r4, r7\n\t"
  71496. #endif
  71497. #ifdef WOLFSSL_KEIL
  71498. "adcs r5, r5, %[r]\n\t"
  71499. #elif defined(__clang__)
  71500. "adcs r5, %[r]\n\t"
  71501. #else
  71502. "adc r5, %[r]\n\t"
  71503. #endif
  71504. "# Square: Done\n\t"
  71505. "mov r2, r12\n\t"
  71506. "\n"
  71507. "L_sp_3072_sqr_96_done_sqr_%=:\n\t"
  71508. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71509. "adds %[a], %[a], #4\n\t"
  71510. #else
  71511. "add %[a], %[a], #4\n\t"
  71512. #endif
  71513. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71514. "subs r2, r2, #4\n\t"
  71515. #else
  71516. "sub r2, r2, #4\n\t"
  71517. #endif
  71518. "movs r6, #0xff\n\t"
  71519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71520. "adds r6, r6, #0x81\n\t"
  71521. #else
  71522. "add r6, r6, #0x81\n\t"
  71523. #endif
  71524. "add r6, r6, r9\n\t"
  71525. "cmp %[a], r6\n\t"
  71526. "beq L_sp_3072_sqr_96_done_mul_%=\n\t"
  71527. "cmp %[a], r2\n\t"
  71528. "bgt L_sp_3072_sqr_96_done_mul_%=\n\t"
  71529. "mov r7, r8\n\t"
  71530. "add r7, r7, r9\n\t"
  71531. "cmp %[a], r7\n\t"
  71532. "ble L_sp_3072_sqr_96_mul_%=\n\t"
  71533. "\n"
  71534. "L_sp_3072_sqr_96_done_mul_%=:\n\t"
  71535. "mov %[r], r10\n\t"
  71536. "mov r7, r8\n\t"
  71537. "str r3, [%[r], r7]\n\t"
  71538. "movs r3, r4\n\t"
  71539. "movs r4, r5\n\t"
  71540. "movs r5, #0\n\t"
  71541. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71542. "adds r7, r7, #4\n\t"
  71543. #else
  71544. "add r7, r7, #4\n\t"
  71545. #endif
  71546. "mov r8, r7\n\t"
  71547. "movs r6, #2\n\t"
  71548. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71549. "lsls r6, r6, #8\n\t"
  71550. #else
  71551. "lsl r6, r6, #8\n\t"
  71552. #endif
  71553. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71554. "adds r6, r6, #0xf8\n\t"
  71555. #else
  71556. "add r6, r6, #0xf8\n\t"
  71557. #endif
  71558. "cmp r7, r6\n\t"
  71559. "ble L_sp_3072_sqr_96_words_%=\n\t"
  71560. "mov %[a], r9\n\t"
  71561. "str r3, [%[r], r7]\n\t"
  71562. "mov %[r], r11\n\t"
  71563. "mov %[a], r10\n\t"
  71564. "movs r3, #2\n\t"
  71565. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71566. "lsls r3, r3, #8\n\t"
  71567. #else
  71568. "lsl r3, r3, #8\n\t"
  71569. #endif
  71570. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71571. "adds r3, r3, #0xfc\n\t"
  71572. #else
  71573. "add r3, r3, #0xfc\n\t"
  71574. #endif
  71575. "\n"
  71576. "L_sp_3072_sqr_96_store_%=:\n\t"
  71577. "ldr r6, [%[a], r3]\n\t"
  71578. "str r6, [%[r], r3]\n\t"
  71579. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71580. "subs r3, r3, #4\n\t"
  71581. #else
  71582. "sub r3, r3, #4\n\t"
  71583. #endif
  71584. "bge L_sp_3072_sqr_96_store_%=\n\t"
  71585. "movs r6, #3\n\t"
  71586. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71587. "lsls r6, r6, #8\n\t"
  71588. #else
  71589. "lsl r6, r6, #8\n\t"
  71590. #endif
  71591. "add sp, sp, r6\n\t"
  71592. : [r] "+l" (r), [a] "+l" (a)
  71593. :
  71594. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  71595. );
  71596. }
  71597. #endif /* WOLFSSL_SP_SMALL */
  71598. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  71599. #ifdef WOLFSSL_SP_SMALL
  71600. /* AND m into each word of a and store in r.
  71601. *
  71602. * r A single precision integer.
  71603. * a A single precision integer.
  71604. * m Mask to AND against each digit.
  71605. */
  71606. static void sp_3072_mask_48(sp_digit* r, const sp_digit* a, sp_digit m)
  71607. {
  71608. int i;
  71609. for (i=0; i<48; i++) {
  71610. r[i] = a[i] & m;
  71611. }
  71612. }
  71613. #endif /* WOLFSSL_SP_SMALL */
  71614. #ifdef WOLFSSL_SP_SMALL
  71615. /* Add b to a into r. (r = a + b)
  71616. *
  71617. * r A single precision integer.
  71618. * a A single precision integer.
  71619. * b A single precision integer.
  71620. */
  71621. SP_NOINLINE static sp_digit sp_3072_add_48(sp_digit* r, const sp_digit* a,
  71622. const sp_digit* b)
  71623. {
  71624. __asm__ __volatile__ (
  71625. "movs r6, %[a]\n\t"
  71626. "movs r7, #0\n\t"
  71627. "movs r3, #0\n\t"
  71628. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71629. "adds r6, r6, #0xc0\n\t"
  71630. #else
  71631. "add r6, r6, #0xc0\n\t"
  71632. #endif
  71633. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71634. "subs r7, r7, #1\n\t"
  71635. #else
  71636. "sub r7, r7, #1\n\t"
  71637. #endif
  71638. "\n"
  71639. "L_sp_3072_add_48_word_%=:\n\t"
  71640. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71641. "adds r3, r3, r7\n\t"
  71642. #else
  71643. "add r3, r3, r7\n\t"
  71644. #endif
  71645. "ldr r4, [%[a]]\n\t"
  71646. "ldr r5, [%[b]]\n\t"
  71647. #ifdef WOLFSSL_KEIL
  71648. "adcs r4, r4, r5\n\t"
  71649. #elif defined(__clang__)
  71650. "adcs r4, r5\n\t"
  71651. #else
  71652. "adc r4, r5\n\t"
  71653. #endif
  71654. "str r4, [%[r]]\n\t"
  71655. "movs r3, #0\n\t"
  71656. #ifdef WOLFSSL_KEIL
  71657. "adcs r3, r3, r3\n\t"
  71658. #elif defined(__clang__)
  71659. "adcs r3, r3\n\t"
  71660. #else
  71661. "adc r3, r3\n\t"
  71662. #endif
  71663. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71664. "adds %[a], %[a], #4\n\t"
  71665. #else
  71666. "add %[a], %[a], #4\n\t"
  71667. #endif
  71668. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71669. "adds %[b], %[b], #4\n\t"
  71670. #else
  71671. "add %[b], %[b], #4\n\t"
  71672. #endif
  71673. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71674. "adds %[r], %[r], #4\n\t"
  71675. #else
  71676. "add %[r], %[r], #4\n\t"
  71677. #endif
  71678. "cmp %[a], r6\n\t"
  71679. "bne L_sp_3072_add_48_word_%=\n\t"
  71680. "movs %[r], r3\n\t"
  71681. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  71682. :
  71683. : "memory", "r3", "r4", "r5", "r6", "r7"
  71684. );
  71685. return (uint32_t)(size_t)r;
  71686. }
  71687. #endif /* WOLFSSL_SP_SMALL */
  71688. #ifdef WOLFSSL_SP_SMALL
  71689. /* Sub b from a into a. (a -= b)
  71690. *
  71691. * a A single precision integer.
  71692. * b A single precision integer.
  71693. */
  71694. SP_NOINLINE static sp_digit sp_3072_sub_in_place_48(sp_digit* a,
  71695. const sp_digit* b)
  71696. {
  71697. __asm__ __volatile__ (
  71698. "movs r7, %[a]\n\t"
  71699. "movs r2, #0\n\t"
  71700. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71701. "adds r7, r7, #0xc0\n\t"
  71702. #else
  71703. "add r7, r7, #0xc0\n\t"
  71704. #endif
  71705. "\n"
  71706. "L_sp_3072_sub_in_place_48_words_%=:\n\t"
  71707. "movs r5, #0\n\t"
  71708. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71709. "subs r5, r5, r2\n\t"
  71710. #else
  71711. "sub r5, r5, r2\n\t"
  71712. #endif
  71713. "ldr r3, [%[a]]\n\t"
  71714. "ldr r4, [%[a], #4]\n\t"
  71715. "ldr r5, [%[b]]\n\t"
  71716. "ldr r6, [%[b], #4]\n\t"
  71717. #ifdef WOLFSSL_KEIL
  71718. "sbcs r3, r3, r5\n\t"
  71719. #elif defined(__clang__)
  71720. "sbcs r3, r5\n\t"
  71721. #else
  71722. "sbc r3, r5\n\t"
  71723. #endif
  71724. #ifdef WOLFSSL_KEIL
  71725. "sbcs r4, r4, r6\n\t"
  71726. #elif defined(__clang__)
  71727. "sbcs r4, r6\n\t"
  71728. #else
  71729. "sbc r4, r6\n\t"
  71730. #endif
  71731. "str r3, [%[a]]\n\t"
  71732. "str r4, [%[a], #4]\n\t"
  71733. #ifdef WOLFSSL_KEIL
  71734. "sbcs r2, r2, r2\n\t"
  71735. #elif defined(__clang__)
  71736. "sbcs r2, r2\n\t"
  71737. #else
  71738. "sbc r2, r2\n\t"
  71739. #endif
  71740. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71741. "adds %[a], %[a], #8\n\t"
  71742. #else
  71743. "add %[a], %[a], #8\n\t"
  71744. #endif
  71745. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71746. "adds %[b], %[b], #8\n\t"
  71747. #else
  71748. "add %[b], %[b], #8\n\t"
  71749. #endif
  71750. "cmp %[a], r7\n\t"
  71751. "bne L_sp_3072_sub_in_place_48_words_%=\n\t"
  71752. "movs %[a], r2\n\t"
  71753. : [a] "+l" (a), [b] "+l" (b)
  71754. :
  71755. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  71756. );
  71757. return (uint32_t)(size_t)a;
  71758. }
  71759. #endif /* WOLFSSL_SP_SMALL */
  71760. #ifdef WOLFSSL_SP_SMALL
  71761. /* Multiply a and b into r. (r = a * b)
  71762. *
  71763. * r A single precision integer.
  71764. * a A single precision integer.
  71765. * b A single precision integer.
  71766. */
  71767. SP_NOINLINE static void sp_3072_mul_48(sp_digit* r, const sp_digit* a,
  71768. const sp_digit* b)
  71769. {
  71770. sp_digit t[48 * 2];
  71771. sp_digit* tmp = t;
  71772. __asm__ __volatile__ (
  71773. "movs r3, #0\n\t"
  71774. "movs r4, #0\n\t"
  71775. "mov r8, r3\n\t"
  71776. "mov r11, %[tmp]\n\t"
  71777. "mov r9, %[a]\n\t"
  71778. "mov r10, %[b]\n\t"
  71779. "movs r6, #0xc0\n\t"
  71780. "add r6, r6, r9\n\t"
  71781. "mov r12, r6\n\t"
  71782. "\n"
  71783. "L_sp_3072_mul_48_words_%=:\n\t"
  71784. "movs %[tmp], #0\n\t"
  71785. "movs r5, #0\n\t"
  71786. "movs r6, #0xbc\n\t"
  71787. "mov %[a], r8\n\t"
  71788. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71789. "subs %[a], %[a], r6\n\t"
  71790. #else
  71791. "sub %[a], %[a], r6\n\t"
  71792. #endif
  71793. #ifdef WOLFSSL_KEIL
  71794. "sbcs r6, r6, r6\n\t"
  71795. #elif defined(__clang__)
  71796. "sbcs r6, r6\n\t"
  71797. #else
  71798. "sbc r6, r6\n\t"
  71799. #endif
  71800. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71801. "mvns r6, r6\n\t"
  71802. #else
  71803. "mvn r6, r6\n\t"
  71804. #endif
  71805. #ifdef WOLFSSL_KEIL
  71806. "ands %[a], %[a], r6\n\t"
  71807. #elif defined(__clang__)
  71808. "ands %[a], r6\n\t"
  71809. #else
  71810. "and %[a], r6\n\t"
  71811. #endif
  71812. "mov %[b], r8\n\t"
  71813. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71814. "subs %[b], %[b], %[a]\n\t"
  71815. #else
  71816. "sub %[b], %[b], %[a]\n\t"
  71817. #endif
  71818. "add %[a], %[a], r9\n\t"
  71819. "add %[b], %[b], r10\n\t"
  71820. "\n"
  71821. "L_sp_3072_mul_48_mul_%=:\n\t"
  71822. "# Multiply Start\n\t"
  71823. "ldrh r6, [%[a]]\n\t"
  71824. "ldrh r7, [%[b]]\n\t"
  71825. #ifdef WOLFSSL_KEIL
  71826. "muls r7, r6, r7\n\t"
  71827. #elif defined(__clang__)
  71828. "muls r7, r6\n\t"
  71829. #else
  71830. "mul r7, r6\n\t"
  71831. #endif
  71832. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71833. "adds r3, r3, r7\n\t"
  71834. #else
  71835. "add r3, r3, r7\n\t"
  71836. #endif
  71837. #ifdef WOLFSSL_KEIL
  71838. "adcs r4, r4, %[tmp]\n\t"
  71839. #elif defined(__clang__)
  71840. "adcs r4, %[tmp]\n\t"
  71841. #else
  71842. "adc r4, %[tmp]\n\t"
  71843. #endif
  71844. #ifdef WOLFSSL_KEIL
  71845. "adcs r5, r5, %[tmp]\n\t"
  71846. #elif defined(__clang__)
  71847. "adcs r5, %[tmp]\n\t"
  71848. #else
  71849. "adc r5, %[tmp]\n\t"
  71850. #endif
  71851. "ldr r7, [%[b]]\n\t"
  71852. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71853. "lsrs r7, r7, #16\n\t"
  71854. #else
  71855. "lsr r7, r7, #16\n\t"
  71856. #endif
  71857. #ifdef WOLFSSL_KEIL
  71858. "muls r6, r7, r6\n\t"
  71859. #elif defined(__clang__)
  71860. "muls r6, r7\n\t"
  71861. #else
  71862. "mul r6, r7\n\t"
  71863. #endif
  71864. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71865. "lsrs r7, r6, #16\n\t"
  71866. #else
  71867. "lsr r7, r6, #16\n\t"
  71868. #endif
  71869. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71870. "lsls r6, r6, #16\n\t"
  71871. #else
  71872. "lsl r6, r6, #16\n\t"
  71873. #endif
  71874. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71875. "adds r3, r3, r6\n\t"
  71876. #else
  71877. "add r3, r3, r6\n\t"
  71878. #endif
  71879. #ifdef WOLFSSL_KEIL
  71880. "adcs r4, r4, r7\n\t"
  71881. #elif defined(__clang__)
  71882. "adcs r4, r7\n\t"
  71883. #else
  71884. "adc r4, r7\n\t"
  71885. #endif
  71886. #ifdef WOLFSSL_KEIL
  71887. "adcs r5, r5, %[tmp]\n\t"
  71888. #elif defined(__clang__)
  71889. "adcs r5, %[tmp]\n\t"
  71890. #else
  71891. "adc r5, %[tmp]\n\t"
  71892. #endif
  71893. "ldr r6, [%[a]]\n\t"
  71894. "ldr r7, [%[b]]\n\t"
  71895. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71896. "lsrs r6, r6, #16\n\t"
  71897. #else
  71898. "lsr r6, r6, #16\n\t"
  71899. #endif
  71900. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71901. "lsrs r7, r7, #16\n\t"
  71902. #else
  71903. "lsr r7, r7, #16\n\t"
  71904. #endif
  71905. #ifdef WOLFSSL_KEIL
  71906. "muls r7, r6, r7\n\t"
  71907. #elif defined(__clang__)
  71908. "muls r7, r6\n\t"
  71909. #else
  71910. "mul r7, r6\n\t"
  71911. #endif
  71912. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71913. "adds r4, r4, r7\n\t"
  71914. #else
  71915. "add r4, r4, r7\n\t"
  71916. #endif
  71917. #ifdef WOLFSSL_KEIL
  71918. "adcs r5, r5, %[tmp]\n\t"
  71919. #elif defined(__clang__)
  71920. "adcs r5, %[tmp]\n\t"
  71921. #else
  71922. "adc r5, %[tmp]\n\t"
  71923. #endif
  71924. "ldrh r7, [%[b]]\n\t"
  71925. #ifdef WOLFSSL_KEIL
  71926. "muls r6, r7, r6\n\t"
  71927. #elif defined(__clang__)
  71928. "muls r6, r7\n\t"
  71929. #else
  71930. "mul r6, r7\n\t"
  71931. #endif
  71932. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71933. "lsrs r7, r6, #16\n\t"
  71934. #else
  71935. "lsr r7, r6, #16\n\t"
  71936. #endif
  71937. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71938. "lsls r6, r6, #16\n\t"
  71939. #else
  71940. "lsl r6, r6, #16\n\t"
  71941. #endif
  71942. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71943. "adds r3, r3, r6\n\t"
  71944. #else
  71945. "add r3, r3, r6\n\t"
  71946. #endif
  71947. #ifdef WOLFSSL_KEIL
  71948. "adcs r4, r4, r7\n\t"
  71949. #elif defined(__clang__)
  71950. "adcs r4, r7\n\t"
  71951. #else
  71952. "adc r4, r7\n\t"
  71953. #endif
  71954. #ifdef WOLFSSL_KEIL
  71955. "adcs r5, r5, %[tmp]\n\t"
  71956. #elif defined(__clang__)
  71957. "adcs r5, %[tmp]\n\t"
  71958. #else
  71959. "adc r5, %[tmp]\n\t"
  71960. #endif
  71961. "# Multiply Done\n\t"
  71962. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71963. "adds %[a], %[a], #4\n\t"
  71964. #else
  71965. "add %[a], %[a], #4\n\t"
  71966. #endif
  71967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71968. "subs %[b], %[b], #4\n\t"
  71969. #else
  71970. "sub %[b], %[b], #4\n\t"
  71971. #endif
  71972. "cmp %[a], r12\n\t"
  71973. "beq L_sp_3072_mul_48_done_mul_%=\n\t"
  71974. "mov r6, r8\n\t"
  71975. "add r6, r6, r9\n\t"
  71976. "cmp %[a], r6\n\t"
  71977. "ble L_sp_3072_mul_48_mul_%=\n\t"
  71978. "\n"
  71979. "L_sp_3072_mul_48_done_mul_%=:\n\t"
  71980. "mov %[tmp], r11\n\t"
  71981. "mov r7, r8\n\t"
  71982. "str r3, [%[tmp], r7]\n\t"
  71983. "movs r3, r4\n\t"
  71984. "movs r4, r5\n\t"
  71985. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71986. "adds r7, r7, #4\n\t"
  71987. #else
  71988. "add r7, r7, #4\n\t"
  71989. #endif
  71990. "mov r8, r7\n\t"
  71991. "movs r6, #0xff\n\t"
  71992. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71993. "adds r6, r6, #0x79\n\t"
  71994. #else
  71995. "add r6, r6, #0x79\n\t"
  71996. #endif
  71997. "cmp r7, r6\n\t"
  71998. "ble L_sp_3072_mul_48_words_%=\n\t"
  71999. "str r3, [%[tmp], r7]\n\t"
  72000. "mov %[a], r9\n\t"
  72001. "mov %[b], r10\n\t"
  72002. : [a] "+l" (a), [b] "+l" (b), [tmp] "+l" (tmp)
  72003. :
  72004. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  72005. );
  72006. XMEMCPY(r, t, sizeof(t));
  72007. }
  72008. /* Square a and put result in r. (r = a * a)
  72009. *
  72010. * r A single precision integer.
  72011. * a A single precision integer.
  72012. */
  72013. SP_NOINLINE static void sp_3072_sqr_48(sp_digit* r, const sp_digit* a)
  72014. {
  72015. __asm__ __volatile__ (
  72016. "movs r3, #0\n\t"
  72017. "movs r4, #0\n\t"
  72018. "movs r5, #0\n\t"
  72019. "mov r8, r3\n\t"
  72020. "mov r11, %[r]\n\t"
  72021. "movs r6, #0xff\n\t"
  72022. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72023. "adds r6, r6, #0x81\n\t"
  72024. #else
  72025. "add r6, r6, #0x81\n\t"
  72026. #endif
  72027. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72028. "negs r6, r6\n\t"
  72029. #else
  72030. "neg r6, r6\n\t"
  72031. #endif
  72032. "add sp, sp, r6\n\t"
  72033. "mov r10, sp\n\t"
  72034. "mov r9, %[a]\n\t"
  72035. "\n"
  72036. "L_sp_3072_sqr_48_words_%=:\n\t"
  72037. "movs %[r], #0\n\t"
  72038. "movs r6, #0xbc\n\t"
  72039. "mov %[a], r8\n\t"
  72040. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72041. "subs %[a], %[a], r6\n\t"
  72042. #else
  72043. "sub %[a], %[a], r6\n\t"
  72044. #endif
  72045. #ifdef WOLFSSL_KEIL
  72046. "sbcs r6, r6, r6\n\t"
  72047. #elif defined(__clang__)
  72048. "sbcs r6, r6\n\t"
  72049. #else
  72050. "sbc r6, r6\n\t"
  72051. #endif
  72052. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72053. "mvns r6, r6\n\t"
  72054. #else
  72055. "mvn r6, r6\n\t"
  72056. #endif
  72057. #ifdef WOLFSSL_KEIL
  72058. "ands %[a], %[a], r6\n\t"
  72059. #elif defined(__clang__)
  72060. "ands %[a], r6\n\t"
  72061. #else
  72062. "and %[a], r6\n\t"
  72063. #endif
  72064. "mov r2, r8\n\t"
  72065. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72066. "subs r2, r2, %[a]\n\t"
  72067. #else
  72068. "sub r2, r2, %[a]\n\t"
  72069. #endif
  72070. "add %[a], %[a], r9\n\t"
  72071. "add r2, r2, r9\n\t"
  72072. "\n"
  72073. "L_sp_3072_sqr_48_mul_%=:\n\t"
  72074. "cmp r2, %[a]\n\t"
  72075. "beq L_sp_3072_sqr_48_sqr_%=\n\t"
  72076. "# Multiply * 2: Start\n\t"
  72077. "ldrh r6, [%[a]]\n\t"
  72078. "ldrh r7, [r2]\n\t"
  72079. #ifdef WOLFSSL_KEIL
  72080. "muls r7, r6, r7\n\t"
  72081. #elif defined(__clang__)
  72082. "muls r7, r6\n\t"
  72083. #else
  72084. "mul r7, r6\n\t"
  72085. #endif
  72086. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72087. "adds r3, r3, r7\n\t"
  72088. #else
  72089. "add r3, r3, r7\n\t"
  72090. #endif
  72091. #ifdef WOLFSSL_KEIL
  72092. "adcs r4, r4, %[r]\n\t"
  72093. #elif defined(__clang__)
  72094. "adcs r4, %[r]\n\t"
  72095. #else
  72096. "adc r4, %[r]\n\t"
  72097. #endif
  72098. #ifdef WOLFSSL_KEIL
  72099. "adcs r5, r5, %[r]\n\t"
  72100. #elif defined(__clang__)
  72101. "adcs r5, %[r]\n\t"
  72102. #else
  72103. "adc r5, %[r]\n\t"
  72104. #endif
  72105. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72106. "adds r3, r3, r7\n\t"
  72107. #else
  72108. "add r3, r3, r7\n\t"
  72109. #endif
  72110. #ifdef WOLFSSL_KEIL
  72111. "adcs r4, r4, %[r]\n\t"
  72112. #elif defined(__clang__)
  72113. "adcs r4, %[r]\n\t"
  72114. #else
  72115. "adc r4, %[r]\n\t"
  72116. #endif
  72117. #ifdef WOLFSSL_KEIL
  72118. "adcs r5, r5, %[r]\n\t"
  72119. #elif defined(__clang__)
  72120. "adcs r5, %[r]\n\t"
  72121. #else
  72122. "adc r5, %[r]\n\t"
  72123. #endif
  72124. "ldr r7, [r2]\n\t"
  72125. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72126. "lsrs r7, r7, #16\n\t"
  72127. #else
  72128. "lsr r7, r7, #16\n\t"
  72129. #endif
  72130. #ifdef WOLFSSL_KEIL
  72131. "muls r6, r7, r6\n\t"
  72132. #elif defined(__clang__)
  72133. "muls r6, r7\n\t"
  72134. #else
  72135. "mul r6, r7\n\t"
  72136. #endif
  72137. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72138. "lsrs r7, r6, #16\n\t"
  72139. #else
  72140. "lsr r7, r6, #16\n\t"
  72141. #endif
  72142. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72143. "lsls r6, r6, #16\n\t"
  72144. #else
  72145. "lsl r6, r6, #16\n\t"
  72146. #endif
  72147. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72148. "adds r3, r3, r6\n\t"
  72149. #else
  72150. "add r3, r3, r6\n\t"
  72151. #endif
  72152. #ifdef WOLFSSL_KEIL
  72153. "adcs r4, r4, r7\n\t"
  72154. #elif defined(__clang__)
  72155. "adcs r4, r7\n\t"
  72156. #else
  72157. "adc r4, r7\n\t"
  72158. #endif
  72159. #ifdef WOLFSSL_KEIL
  72160. "adcs r5, r5, %[r]\n\t"
  72161. #elif defined(__clang__)
  72162. "adcs r5, %[r]\n\t"
  72163. #else
  72164. "adc r5, %[r]\n\t"
  72165. #endif
  72166. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72167. "adds r3, r3, r6\n\t"
  72168. #else
  72169. "add r3, r3, r6\n\t"
  72170. #endif
  72171. #ifdef WOLFSSL_KEIL
  72172. "adcs r4, r4, r7\n\t"
  72173. #elif defined(__clang__)
  72174. "adcs r4, r7\n\t"
  72175. #else
  72176. "adc r4, r7\n\t"
  72177. #endif
  72178. #ifdef WOLFSSL_KEIL
  72179. "adcs r5, r5, %[r]\n\t"
  72180. #elif defined(__clang__)
  72181. "adcs r5, %[r]\n\t"
  72182. #else
  72183. "adc r5, %[r]\n\t"
  72184. #endif
  72185. "ldr r6, [%[a]]\n\t"
  72186. "ldr r7, [r2]\n\t"
  72187. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72188. "lsrs r6, r6, #16\n\t"
  72189. #else
  72190. "lsr r6, r6, #16\n\t"
  72191. #endif
  72192. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72193. "lsrs r7, r7, #16\n\t"
  72194. #else
  72195. "lsr r7, r7, #16\n\t"
  72196. #endif
  72197. #ifdef WOLFSSL_KEIL
  72198. "muls r7, r6, r7\n\t"
  72199. #elif defined(__clang__)
  72200. "muls r7, r6\n\t"
  72201. #else
  72202. "mul r7, r6\n\t"
  72203. #endif
  72204. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72205. "adds r4, r4, r7\n\t"
  72206. #else
  72207. "add r4, r4, r7\n\t"
  72208. #endif
  72209. #ifdef WOLFSSL_KEIL
  72210. "adcs r5, r5, %[r]\n\t"
  72211. #elif defined(__clang__)
  72212. "adcs r5, %[r]\n\t"
  72213. #else
  72214. "adc r5, %[r]\n\t"
  72215. #endif
  72216. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72217. "adds r4, r4, r7\n\t"
  72218. #else
  72219. "add r4, r4, r7\n\t"
  72220. #endif
  72221. #ifdef WOLFSSL_KEIL
  72222. "adcs r5, r5, %[r]\n\t"
  72223. #elif defined(__clang__)
  72224. "adcs r5, %[r]\n\t"
  72225. #else
  72226. "adc r5, %[r]\n\t"
  72227. #endif
  72228. "ldrh r7, [r2]\n\t"
  72229. #ifdef WOLFSSL_KEIL
  72230. "muls r6, r7, r6\n\t"
  72231. #elif defined(__clang__)
  72232. "muls r6, r7\n\t"
  72233. #else
  72234. "mul r6, r7\n\t"
  72235. #endif
  72236. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72237. "lsrs r7, r6, #16\n\t"
  72238. #else
  72239. "lsr r7, r6, #16\n\t"
  72240. #endif
  72241. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72242. "lsls r6, r6, #16\n\t"
  72243. #else
  72244. "lsl r6, r6, #16\n\t"
  72245. #endif
  72246. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72247. "adds r3, r3, r6\n\t"
  72248. #else
  72249. "add r3, r3, r6\n\t"
  72250. #endif
  72251. #ifdef WOLFSSL_KEIL
  72252. "adcs r4, r4, r7\n\t"
  72253. #elif defined(__clang__)
  72254. "adcs r4, r7\n\t"
  72255. #else
  72256. "adc r4, r7\n\t"
  72257. #endif
  72258. #ifdef WOLFSSL_KEIL
  72259. "adcs r5, r5, %[r]\n\t"
  72260. #elif defined(__clang__)
  72261. "adcs r5, %[r]\n\t"
  72262. #else
  72263. "adc r5, %[r]\n\t"
  72264. #endif
  72265. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72266. "adds r3, r3, r6\n\t"
  72267. #else
  72268. "add r3, r3, r6\n\t"
  72269. #endif
  72270. #ifdef WOLFSSL_KEIL
  72271. "adcs r4, r4, r7\n\t"
  72272. #elif defined(__clang__)
  72273. "adcs r4, r7\n\t"
  72274. #else
  72275. "adc r4, r7\n\t"
  72276. #endif
  72277. #ifdef WOLFSSL_KEIL
  72278. "adcs r5, r5, %[r]\n\t"
  72279. #elif defined(__clang__)
  72280. "adcs r5, %[r]\n\t"
  72281. #else
  72282. "adc r5, %[r]\n\t"
  72283. #endif
  72284. "# Multiply * 2: Done\n\t"
  72285. "bal L_sp_3072_sqr_48_done_sqr_%=\n\t"
  72286. "\n"
  72287. "L_sp_3072_sqr_48_sqr_%=:\n\t"
  72288. "mov r12, r2\n\t"
  72289. "ldr r2, [%[a]]\n\t"
  72290. "# Square: Start\n\t"
  72291. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72292. "lsrs r7, r2, #16\n\t"
  72293. #else
  72294. "lsr r7, r2, #16\n\t"
  72295. #endif
  72296. "uxth r6, r2\n\t"
  72297. #ifdef WOLFSSL_KEIL
  72298. "muls r6, r6, r6\n\t"
  72299. #elif defined(__clang__)
  72300. "muls r6, r6\n\t"
  72301. #else
  72302. "mul r6, r6\n\t"
  72303. #endif
  72304. #ifdef WOLFSSL_KEIL
  72305. "muls r7, r7, r7\n\t"
  72306. #elif defined(__clang__)
  72307. "muls r7, r7\n\t"
  72308. #else
  72309. "mul r7, r7\n\t"
  72310. #endif
  72311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72312. "adds r3, r3, r6\n\t"
  72313. #else
  72314. "add r3, r3, r6\n\t"
  72315. #endif
  72316. #ifdef WOLFSSL_KEIL
  72317. "adcs r4, r4, r7\n\t"
  72318. #elif defined(__clang__)
  72319. "adcs r4, r7\n\t"
  72320. #else
  72321. "adc r4, r7\n\t"
  72322. #endif
  72323. #ifdef WOLFSSL_KEIL
  72324. "adcs r5, r5, %[r]\n\t"
  72325. #elif defined(__clang__)
  72326. "adcs r5, %[r]\n\t"
  72327. #else
  72328. "adc r5, %[r]\n\t"
  72329. #endif
  72330. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72331. "lsrs r7, r2, #16\n\t"
  72332. #else
  72333. "lsr r7, r2, #16\n\t"
  72334. #endif
  72335. "uxth r6, r2\n\t"
  72336. #ifdef WOLFSSL_KEIL
  72337. "muls r6, r7, r6\n\t"
  72338. #elif defined(__clang__)
  72339. "muls r6, r7\n\t"
  72340. #else
  72341. "mul r6, r7\n\t"
  72342. #endif
  72343. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72344. "lsrs r7, r6, #15\n\t"
  72345. #else
  72346. "lsr r7, r6, #15\n\t"
  72347. #endif
  72348. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72349. "lsls r6, r6, #17\n\t"
  72350. #else
  72351. "lsl r6, r6, #17\n\t"
  72352. #endif
  72353. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72354. "adds r3, r3, r6\n\t"
  72355. #else
  72356. "add r3, r3, r6\n\t"
  72357. #endif
  72358. #ifdef WOLFSSL_KEIL
  72359. "adcs r4, r4, r7\n\t"
  72360. #elif defined(__clang__)
  72361. "adcs r4, r7\n\t"
  72362. #else
  72363. "adc r4, r7\n\t"
  72364. #endif
  72365. #ifdef WOLFSSL_KEIL
  72366. "adcs r5, r5, %[r]\n\t"
  72367. #elif defined(__clang__)
  72368. "adcs r5, %[r]\n\t"
  72369. #else
  72370. "adc r5, %[r]\n\t"
  72371. #endif
  72372. "# Square: Done\n\t"
  72373. "mov r2, r12\n\t"
  72374. "\n"
  72375. "L_sp_3072_sqr_48_done_sqr_%=:\n\t"
  72376. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72377. "adds %[a], %[a], #4\n\t"
  72378. #else
  72379. "add %[a], %[a], #4\n\t"
  72380. #endif
  72381. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72382. "subs r2, r2, #4\n\t"
  72383. #else
  72384. "sub r2, r2, #4\n\t"
  72385. #endif
  72386. "movs r6, #0xc0\n\t"
  72387. "add r6, r6, r9\n\t"
  72388. "cmp %[a], r6\n\t"
  72389. "beq L_sp_3072_sqr_48_done_mul_%=\n\t"
  72390. "cmp %[a], r2\n\t"
  72391. "bgt L_sp_3072_sqr_48_done_mul_%=\n\t"
  72392. "mov r7, r8\n\t"
  72393. "add r7, r7, r9\n\t"
  72394. "cmp %[a], r7\n\t"
  72395. "ble L_sp_3072_sqr_48_mul_%=\n\t"
  72396. "\n"
  72397. "L_sp_3072_sqr_48_done_mul_%=:\n\t"
  72398. "mov %[r], r10\n\t"
  72399. "mov r7, r8\n\t"
  72400. "str r3, [%[r], r7]\n\t"
  72401. "movs r3, r4\n\t"
  72402. "movs r4, r5\n\t"
  72403. "movs r5, #0\n\t"
  72404. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72405. "adds r7, r7, #4\n\t"
  72406. #else
  72407. "add r7, r7, #4\n\t"
  72408. #endif
  72409. "mov r8, r7\n\t"
  72410. "movs r6, #0xff\n\t"
  72411. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72412. "adds r6, r6, #0x79\n\t"
  72413. #else
  72414. "add r6, r6, #0x79\n\t"
  72415. #endif
  72416. "cmp r7, r6\n\t"
  72417. "ble L_sp_3072_sqr_48_words_%=\n\t"
  72418. "mov %[a], r9\n\t"
  72419. "str r3, [%[r], r7]\n\t"
  72420. "mov %[r], r11\n\t"
  72421. "mov %[a], r10\n\t"
  72422. "movs r3, #0xff\n\t"
  72423. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72424. "adds r3, r3, #0x7d\n\t"
  72425. #else
  72426. "add r3, r3, #0x7d\n\t"
  72427. #endif
  72428. "\n"
  72429. "L_sp_3072_sqr_48_store_%=:\n\t"
  72430. "ldr r6, [%[a], r3]\n\t"
  72431. "str r6, [%[r], r3]\n\t"
  72432. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72433. "subs r3, r3, #4\n\t"
  72434. #else
  72435. "sub r3, r3, #4\n\t"
  72436. #endif
  72437. "bge L_sp_3072_sqr_48_store_%=\n\t"
  72438. "movs r6, #0xff\n\t"
  72439. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72440. "adds r6, r6, #0x81\n\t"
  72441. #else
  72442. "add r6, r6, #0x81\n\t"
  72443. #endif
  72444. "add sp, sp, r6\n\t"
  72445. : [r] "+l" (r), [a] "+l" (a)
  72446. :
  72447. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  72448. );
  72449. }
  72450. #endif /* WOLFSSL_SP_SMALL */
  72451. #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */
  72452. /* Caclulate the bottom digit of -1/a mod 2^n.
  72453. *
  72454. * a A single precision number.
  72455. * rho Bottom word of inverse.
  72456. */
  72457. static void sp_3072_mont_setup(const sp_digit* a, sp_digit* rho)
  72458. {
  72459. sp_digit x;
  72460. sp_digit b;
  72461. b = a[0];
  72462. x = (((b + 2) & 4) << 1) + b; /* here x*a==1 mod 2**4 */
  72463. x *= 2 - b * x; /* here x*a==1 mod 2**8 */
  72464. x *= 2 - b * x; /* here x*a==1 mod 2**16 */
  72465. x *= 2 - b * x; /* here x*a==1 mod 2**32 */
  72466. /* rho = -1/m mod b */
  72467. *rho = (sp_digit)0 - x;
  72468. }
  72469. /* Mul a by digit b into r. (r = a * b)
  72470. *
  72471. * r A single precision integer.
  72472. * a A single precision integer.
  72473. * b A single precision digit.
  72474. */
  72475. SP_NOINLINE static void sp_3072_mul_d_96(sp_digit* r, const sp_digit* a,
  72476. sp_digit b)
  72477. {
  72478. __asm__ __volatile__ (
  72479. "movs r6, #0xff\n\t"
  72480. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72481. "adds r6, r6, #0x81\n\t"
  72482. #else
  72483. "add r6, r6, #0x81\n\t"
  72484. #endif
  72485. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72486. "adds r6, r6, %[a]\n\t"
  72487. #else
  72488. "add r6, r6, %[a]\n\t"
  72489. #endif
  72490. "mov r8, %[r]\n\t"
  72491. "mov r9, r6\n\t"
  72492. "movs r3, #0\n\t"
  72493. "movs r4, #0\n\t"
  72494. "\n"
  72495. "L_sp_3072_mul_d_96_%=:\n\t"
  72496. "movs %[r], #0\n\t"
  72497. "movs r5, #0\n\t"
  72498. "# A[] * B\n\t"
  72499. "ldrh r6, [%[a]]\n\t"
  72500. "uxth r7, %[b]\n\t"
  72501. #ifdef WOLFSSL_KEIL
  72502. "muls r7, r6, r7\n\t"
  72503. #elif defined(__clang__)
  72504. "muls r7, r6\n\t"
  72505. #else
  72506. "mul r7, r6\n\t"
  72507. #endif
  72508. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72509. "adds r3, r3, r7\n\t"
  72510. #else
  72511. "add r3, r3, r7\n\t"
  72512. #endif
  72513. #ifdef WOLFSSL_KEIL
  72514. "adcs r4, r4, %[r]\n\t"
  72515. #elif defined(__clang__)
  72516. "adcs r4, %[r]\n\t"
  72517. #else
  72518. "adc r4, %[r]\n\t"
  72519. #endif
  72520. #ifdef WOLFSSL_KEIL
  72521. "adcs r5, r5, %[r]\n\t"
  72522. #elif defined(__clang__)
  72523. "adcs r5, %[r]\n\t"
  72524. #else
  72525. "adc r5, %[r]\n\t"
  72526. #endif
  72527. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72528. "lsrs r7, %[b], #16\n\t"
  72529. #else
  72530. "lsr r7, %[b], #16\n\t"
  72531. #endif
  72532. #ifdef WOLFSSL_KEIL
  72533. "muls r6, r7, r6\n\t"
  72534. #elif defined(__clang__)
  72535. "muls r6, r7\n\t"
  72536. #else
  72537. "mul r6, r7\n\t"
  72538. #endif
  72539. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72540. "lsrs r7, r6, #16\n\t"
  72541. #else
  72542. "lsr r7, r6, #16\n\t"
  72543. #endif
  72544. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72545. "lsls r6, r6, #16\n\t"
  72546. #else
  72547. "lsl r6, r6, #16\n\t"
  72548. #endif
  72549. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72550. "adds r3, r3, r6\n\t"
  72551. #else
  72552. "add r3, r3, r6\n\t"
  72553. #endif
  72554. #ifdef WOLFSSL_KEIL
  72555. "adcs r4, r4, r7\n\t"
  72556. #elif defined(__clang__)
  72557. "adcs r4, r7\n\t"
  72558. #else
  72559. "adc r4, r7\n\t"
  72560. #endif
  72561. #ifdef WOLFSSL_KEIL
  72562. "adcs r5, r5, %[r]\n\t"
  72563. #elif defined(__clang__)
  72564. "adcs r5, %[r]\n\t"
  72565. #else
  72566. "adc r5, %[r]\n\t"
  72567. #endif
  72568. "ldr r6, [%[a]]\n\t"
  72569. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72570. "lsrs r6, r6, #16\n\t"
  72571. #else
  72572. "lsr r6, r6, #16\n\t"
  72573. #endif
  72574. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72575. "lsrs r7, %[b], #16\n\t"
  72576. #else
  72577. "lsr r7, %[b], #16\n\t"
  72578. #endif
  72579. #ifdef WOLFSSL_KEIL
  72580. "muls r7, r6, r7\n\t"
  72581. #elif defined(__clang__)
  72582. "muls r7, r6\n\t"
  72583. #else
  72584. "mul r7, r6\n\t"
  72585. #endif
  72586. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72587. "adds r4, r4, r7\n\t"
  72588. #else
  72589. "add r4, r4, r7\n\t"
  72590. #endif
  72591. #ifdef WOLFSSL_KEIL
  72592. "adcs r5, r5, %[r]\n\t"
  72593. #elif defined(__clang__)
  72594. "adcs r5, %[r]\n\t"
  72595. #else
  72596. "adc r5, %[r]\n\t"
  72597. #endif
  72598. "uxth r7, %[b]\n\t"
  72599. #ifdef WOLFSSL_KEIL
  72600. "muls r6, r7, r6\n\t"
  72601. #elif defined(__clang__)
  72602. "muls r6, r7\n\t"
  72603. #else
  72604. "mul r6, r7\n\t"
  72605. #endif
  72606. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72607. "lsrs r7, r6, #16\n\t"
  72608. #else
  72609. "lsr r7, r6, #16\n\t"
  72610. #endif
  72611. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72612. "lsls r6, r6, #16\n\t"
  72613. #else
  72614. "lsl r6, r6, #16\n\t"
  72615. #endif
  72616. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72617. "adds r3, r3, r6\n\t"
  72618. #else
  72619. "add r3, r3, r6\n\t"
  72620. #endif
  72621. #ifdef WOLFSSL_KEIL
  72622. "adcs r4, r4, r7\n\t"
  72623. #elif defined(__clang__)
  72624. "adcs r4, r7\n\t"
  72625. #else
  72626. "adc r4, r7\n\t"
  72627. #endif
  72628. #ifdef WOLFSSL_KEIL
  72629. "adcs r5, r5, %[r]\n\t"
  72630. #elif defined(__clang__)
  72631. "adcs r5, %[r]\n\t"
  72632. #else
  72633. "adc r5, %[r]\n\t"
  72634. #endif
  72635. "# A[] * B - Done\n\t"
  72636. "mov %[r], r8\n\t"
  72637. "str r3, [%[r]]\n\t"
  72638. "movs r3, r4\n\t"
  72639. "movs r4, r5\n\t"
  72640. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72641. "adds %[r], %[r], #4\n\t"
  72642. #else
  72643. "add %[r], %[r], #4\n\t"
  72644. #endif
  72645. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72646. "adds %[a], %[a], #4\n\t"
  72647. #else
  72648. "add %[a], %[a], #4\n\t"
  72649. #endif
  72650. "mov r8, %[r]\n\t"
  72651. "cmp %[a], r9\n\t"
  72652. "blt L_sp_3072_mul_d_96_%=\n\t"
  72653. "str r3, [%[r]]\n\t"
  72654. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  72655. :
  72656. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  72657. );
  72658. }
  72659. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  72660. /* r = 2^n mod m where n is the number of bits to reduce by.
  72661. * Given m must be 3072 bits, just need to subtract.
  72662. *
  72663. * r A single precision number.
  72664. * m A single precision number.
  72665. */
  72666. static void sp_3072_mont_norm_48(sp_digit* r, const sp_digit* m)
  72667. {
  72668. XMEMSET(r, 0, sizeof(sp_digit) * 48);
  72669. /* r = 2^n mod m */
  72670. sp_3072_sub_in_place_48(r, m);
  72671. }
  72672. /* Conditionally subtract b from a using the mask m.
  72673. * m is -1 to subtract and 0 when not copying.
  72674. *
  72675. * r A single precision number representing condition subtract result.
  72676. * a A single precision number to subtract from.
  72677. * b A single precision number to subtract.
  72678. * m Mask value to apply.
  72679. */
  72680. SP_NOINLINE static sp_digit sp_3072_cond_sub_48(sp_digit* r, const sp_digit* a,
  72681. const sp_digit* b, sp_digit m)
  72682. {
  72683. __asm__ __volatile__ (
  72684. "movs r4, #0\n\t"
  72685. "movs r5, #0xc0\n\t"
  72686. "mov r8, r5\n\t"
  72687. "movs r7, #0\n\t"
  72688. "\n"
  72689. "L_sp_3072_cond_sub_48_words_%=:\n\t"
  72690. "ldr r6, [%[b], r7]\n\t"
  72691. #ifdef WOLFSSL_KEIL
  72692. "ands r6, r6, %[m]\n\t"
  72693. #elif defined(__clang__)
  72694. "ands r6, %[m]\n\t"
  72695. #else
  72696. "and r6, %[m]\n\t"
  72697. #endif
  72698. "movs r5, #0\n\t"
  72699. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72700. "subs r5, r5, r4\n\t"
  72701. #else
  72702. "sub r5, r5, r4\n\t"
  72703. #endif
  72704. "ldr r5, [%[a], r7]\n\t"
  72705. #ifdef WOLFSSL_KEIL
  72706. "sbcs r5, r5, r6\n\t"
  72707. #elif defined(__clang__)
  72708. "sbcs r5, r6\n\t"
  72709. #else
  72710. "sbc r5, r6\n\t"
  72711. #endif
  72712. #ifdef WOLFSSL_KEIL
  72713. "sbcs r4, r4, r4\n\t"
  72714. #elif defined(__clang__)
  72715. "sbcs r4, r4\n\t"
  72716. #else
  72717. "sbc r4, r4\n\t"
  72718. #endif
  72719. "str r5, [%[r], r7]\n\t"
  72720. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72721. "adds r7, r7, #4\n\t"
  72722. #else
  72723. "add r7, r7, #4\n\t"
  72724. #endif
  72725. "cmp r7, r8\n\t"
  72726. "blt L_sp_3072_cond_sub_48_words_%=\n\t"
  72727. "movs %[r], r4\n\t"
  72728. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m)
  72729. :
  72730. : "memory", "r4", "r5", "r6", "r7", "r8"
  72731. );
  72732. return (uint32_t)(size_t)r;
  72733. }
  72734. /* Reduce the number back to 3072 bits using Montgomery reduction.
  72735. *
  72736. * a A single precision number to reduce in place.
  72737. * m The single precision number representing the modulus.
  72738. * mp The digit representing the negative inverse of m mod 2^n.
  72739. */
  72740. SP_NOINLINE static void sp_3072_mont_reduce_48(sp_digit* a, const sp_digit* m,
  72741. sp_digit mp)
  72742. {
  72743. __asm__ __volatile__ (
  72744. "movs r7, #0\n\t"
  72745. "mov r8, %[mp]\n\t"
  72746. "mov r12, r7\n\t"
  72747. "mov lr, %[m]\n\t"
  72748. "mov r9, %[a]\n\t"
  72749. "mov r11, %[a]\n\t"
  72750. "movs r5, #0xbc\n\t"
  72751. "movs r6, #0xc0\n\t"
  72752. "add r9, r9, r5\n\t"
  72753. "add r11, r11, r6\n\t"
  72754. "\n"
  72755. "L_sp_3072_mont_reduce_48_mod_%=:\n\t"
  72756. "movs r7, #0\n\t"
  72757. "movs r4, #0\n\t"
  72758. "# a[i] += m[0] * mu\n\t"
  72759. "ldm %[m]!, {%[mp]}\n\t"
  72760. "ldm %[a]!, {r3}\n\t"
  72761. "# mu = a[i] * mp\n\t"
  72762. "mov r5, r8\n\t"
  72763. #ifdef WOLFSSL_KEIL
  72764. "muls r5, r3, r5\n\t"
  72765. #elif defined(__clang__)
  72766. "muls r5, r3\n\t"
  72767. #else
  72768. "mul r5, r3\n\t"
  72769. #endif
  72770. "mov r10, r5\n\t"
  72771. "# Multiply m[0] and mu - Start\n\t"
  72772. "mov r5, r10\n\t"
  72773. "uxth r6, %[mp]\n\t"
  72774. "uxth r5, r5\n\t"
  72775. #ifdef WOLFSSL_KEIL
  72776. "muls r6, r5, r6\n\t"
  72777. #elif defined(__clang__)
  72778. "muls r6, r5\n\t"
  72779. #else
  72780. "mul r6, r5\n\t"
  72781. #endif
  72782. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72783. "adds r3, r3, r6\n\t"
  72784. #else
  72785. "add r3, r3, r6\n\t"
  72786. #endif
  72787. #ifdef WOLFSSL_KEIL
  72788. "adcs r4, r4, r7\n\t"
  72789. #elif defined(__clang__)
  72790. "adcs r4, r7\n\t"
  72791. #else
  72792. "adc r4, r7\n\t"
  72793. #endif
  72794. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72795. "lsrs r6, %[mp], #16\n\t"
  72796. #else
  72797. "lsr r6, %[mp], #16\n\t"
  72798. #endif
  72799. #ifdef WOLFSSL_KEIL
  72800. "muls r5, r6, r5\n\t"
  72801. #elif defined(__clang__)
  72802. "muls r5, r6\n\t"
  72803. #else
  72804. "mul r5, r6\n\t"
  72805. #endif
  72806. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72807. "lsrs r6, r5, #16\n\t"
  72808. #else
  72809. "lsr r6, r5, #16\n\t"
  72810. #endif
  72811. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72812. "lsls r5, r5, #16\n\t"
  72813. #else
  72814. "lsl r5, r5, #16\n\t"
  72815. #endif
  72816. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72817. "adds r3, r3, r5\n\t"
  72818. #else
  72819. "add r3, r3, r5\n\t"
  72820. #endif
  72821. #ifdef WOLFSSL_KEIL
  72822. "adcs r4, r4, r6\n\t"
  72823. #elif defined(__clang__)
  72824. "adcs r4, r6\n\t"
  72825. #else
  72826. "adc r4, r6\n\t"
  72827. #endif
  72828. "mov r5, r10\n\t"
  72829. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72830. "lsrs r6, %[mp], #16\n\t"
  72831. #else
  72832. "lsr r6, %[mp], #16\n\t"
  72833. #endif
  72834. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72835. "lsrs r5, r5, #16\n\t"
  72836. #else
  72837. "lsr r5, r5, #16\n\t"
  72838. #endif
  72839. #ifdef WOLFSSL_KEIL
  72840. "muls r6, r5, r6\n\t"
  72841. #elif defined(__clang__)
  72842. "muls r6, r5\n\t"
  72843. #else
  72844. "mul r6, r5\n\t"
  72845. #endif
  72846. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72847. "adds r4, r4, r6\n\t"
  72848. #else
  72849. "add r4, r4, r6\n\t"
  72850. #endif
  72851. "uxth r6, %[mp]\n\t"
  72852. #ifdef WOLFSSL_KEIL
  72853. "muls r5, r6, r5\n\t"
  72854. #elif defined(__clang__)
  72855. "muls r5, r6\n\t"
  72856. #else
  72857. "mul r5, r6\n\t"
  72858. #endif
  72859. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72860. "lsrs r6, r5, #16\n\t"
  72861. #else
  72862. "lsr r6, r5, #16\n\t"
  72863. #endif
  72864. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72865. "lsls r5, r5, #16\n\t"
  72866. #else
  72867. "lsl r5, r5, #16\n\t"
  72868. #endif
  72869. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72870. "adds r3, r3, r5\n\t"
  72871. #else
  72872. "add r3, r3, r5\n\t"
  72873. #endif
  72874. #ifdef WOLFSSL_KEIL
  72875. "adcs r4, r4, r6\n\t"
  72876. #elif defined(__clang__)
  72877. "adcs r4, r6\n\t"
  72878. #else
  72879. "adc r4, r6\n\t"
  72880. #endif
  72881. "# Multiply m[0] and mu - Done\n\t"
  72882. "\n"
  72883. "L_sp_3072_mont_reduce_48_word_%=:\n\t"
  72884. "# a[i+j] += m[j] * mu\n\t"
  72885. "ldr r3, [%[a]]\n\t"
  72886. "ldm %[m]!, {%[mp]}\n\t"
  72887. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72888. "adds r3, r3, r4\n\t"
  72889. #else
  72890. "add r3, r3, r4\n\t"
  72891. #endif
  72892. "movs r4, #0\n\t"
  72893. #ifdef WOLFSSL_KEIL
  72894. "adcs r4, r4, r7\n\t"
  72895. #elif defined(__clang__)
  72896. "adcs r4, r7\n\t"
  72897. #else
  72898. "adc r4, r7\n\t"
  72899. #endif
  72900. "# Multiply m[j] and mu - Start\n\t"
  72901. "mov r5, r10\n\t"
  72902. "uxth r6, %[mp]\n\t"
  72903. "uxth r5, r5\n\t"
  72904. #ifdef WOLFSSL_KEIL
  72905. "muls r6, r5, r6\n\t"
  72906. #elif defined(__clang__)
  72907. "muls r6, r5\n\t"
  72908. #else
  72909. "mul r6, r5\n\t"
  72910. #endif
  72911. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72912. "adds r3, r3, r6\n\t"
  72913. #else
  72914. "add r3, r3, r6\n\t"
  72915. #endif
  72916. #ifdef WOLFSSL_KEIL
  72917. "adcs r4, r4, r7\n\t"
  72918. #elif defined(__clang__)
  72919. "adcs r4, r7\n\t"
  72920. #else
  72921. "adc r4, r7\n\t"
  72922. #endif
  72923. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72924. "lsrs r6, %[mp], #16\n\t"
  72925. #else
  72926. "lsr r6, %[mp], #16\n\t"
  72927. #endif
  72928. #ifdef WOLFSSL_KEIL
  72929. "muls r5, r6, r5\n\t"
  72930. #elif defined(__clang__)
  72931. "muls r5, r6\n\t"
  72932. #else
  72933. "mul r5, r6\n\t"
  72934. #endif
  72935. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72936. "lsrs r6, r5, #16\n\t"
  72937. #else
  72938. "lsr r6, r5, #16\n\t"
  72939. #endif
  72940. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72941. "lsls r5, r5, #16\n\t"
  72942. #else
  72943. "lsl r5, r5, #16\n\t"
  72944. #endif
  72945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72946. "adds r3, r3, r5\n\t"
  72947. #else
  72948. "add r3, r3, r5\n\t"
  72949. #endif
  72950. #ifdef WOLFSSL_KEIL
  72951. "adcs r4, r4, r6\n\t"
  72952. #elif defined(__clang__)
  72953. "adcs r4, r6\n\t"
  72954. #else
  72955. "adc r4, r6\n\t"
  72956. #endif
  72957. "mov r5, r10\n\t"
  72958. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72959. "lsrs r6, %[mp], #16\n\t"
  72960. #else
  72961. "lsr r6, %[mp], #16\n\t"
  72962. #endif
  72963. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72964. "lsrs r5, r5, #16\n\t"
  72965. #else
  72966. "lsr r5, r5, #16\n\t"
  72967. #endif
  72968. #ifdef WOLFSSL_KEIL
  72969. "muls r6, r5, r6\n\t"
  72970. #elif defined(__clang__)
  72971. "muls r6, r5\n\t"
  72972. #else
  72973. "mul r6, r5\n\t"
  72974. #endif
  72975. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72976. "adds r4, r4, r6\n\t"
  72977. #else
  72978. "add r4, r4, r6\n\t"
  72979. #endif
  72980. "uxth r6, %[mp]\n\t"
  72981. #ifdef WOLFSSL_KEIL
  72982. "muls r5, r6, r5\n\t"
  72983. #elif defined(__clang__)
  72984. "muls r5, r6\n\t"
  72985. #else
  72986. "mul r5, r6\n\t"
  72987. #endif
  72988. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72989. "lsrs r6, r5, #16\n\t"
  72990. #else
  72991. "lsr r6, r5, #16\n\t"
  72992. #endif
  72993. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72994. "lsls r5, r5, #16\n\t"
  72995. #else
  72996. "lsl r5, r5, #16\n\t"
  72997. #endif
  72998. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72999. "adds r3, r3, r5\n\t"
  73000. #else
  73001. "add r3, r3, r5\n\t"
  73002. #endif
  73003. #ifdef WOLFSSL_KEIL
  73004. "adcs r4, r4, r6\n\t"
  73005. #elif defined(__clang__)
  73006. "adcs r4, r6\n\t"
  73007. #else
  73008. "adc r4, r6\n\t"
  73009. #endif
  73010. "# Multiply m[j] and mu - Done\n\t"
  73011. "stm %[a]!, {r3}\n\t"
  73012. "cmp %[a], r9\n\t"
  73013. "blt L_sp_3072_mont_reduce_48_word_%=\n\t"
  73014. "# a[i+47] += m[47] * mu\n\t"
  73015. "ldr %[mp], [%[m]]\n\t"
  73016. "mov r3, r12\n\t"
  73017. "# Multiply m[47] and mu - Start\n\t"
  73018. "mov r5, r10\n\t"
  73019. "uxth r6, %[mp]\n\t"
  73020. "uxth r5, r5\n\t"
  73021. #ifdef WOLFSSL_KEIL
  73022. "muls r6, r5, r6\n\t"
  73023. #elif defined(__clang__)
  73024. "muls r6, r5\n\t"
  73025. #else
  73026. "mul r6, r5\n\t"
  73027. #endif
  73028. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73029. "adds r4, r4, r6\n\t"
  73030. #else
  73031. "add r4, r4, r6\n\t"
  73032. #endif
  73033. #ifdef WOLFSSL_KEIL
  73034. "adcs r3, r3, r7\n\t"
  73035. #elif defined(__clang__)
  73036. "adcs r3, r7\n\t"
  73037. #else
  73038. "adc r3, r7\n\t"
  73039. #endif
  73040. #ifdef WOLFSSL_KEIL
  73041. "adcs r7, r7, r7\n\t"
  73042. #elif defined(__clang__)
  73043. "adcs r7, r7\n\t"
  73044. #else
  73045. "adc r7, r7\n\t"
  73046. #endif
  73047. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73048. "lsrs r6, %[mp], #16\n\t"
  73049. #else
  73050. "lsr r6, %[mp], #16\n\t"
  73051. #endif
  73052. #ifdef WOLFSSL_KEIL
  73053. "muls r5, r6, r5\n\t"
  73054. #elif defined(__clang__)
  73055. "muls r5, r6\n\t"
  73056. #else
  73057. "mul r5, r6\n\t"
  73058. #endif
  73059. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73060. "lsrs r6, r5, #16\n\t"
  73061. #else
  73062. "lsr r6, r5, #16\n\t"
  73063. #endif
  73064. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73065. "lsls r5, r5, #16\n\t"
  73066. #else
  73067. "lsl r5, r5, #16\n\t"
  73068. #endif
  73069. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73070. "adds r4, r4, r5\n\t"
  73071. #else
  73072. "add r4, r4, r5\n\t"
  73073. #endif
  73074. #ifdef WOLFSSL_KEIL
  73075. "adcs r3, r3, r6\n\t"
  73076. #elif defined(__clang__)
  73077. "adcs r3, r6\n\t"
  73078. #else
  73079. "adc r3, r6\n\t"
  73080. #endif
  73081. #ifdef WOLFSSL_KEIL
  73082. "adcs r7, r7, r7\n\t"
  73083. #elif defined(__clang__)
  73084. "adcs r7, r7\n\t"
  73085. #else
  73086. "adc r7, r7\n\t"
  73087. #endif
  73088. "mov r5, r10\n\t"
  73089. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73090. "lsrs r6, %[mp], #16\n\t"
  73091. #else
  73092. "lsr r6, %[mp], #16\n\t"
  73093. #endif
  73094. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73095. "lsrs r5, r5, #16\n\t"
  73096. #else
  73097. "lsr r5, r5, #16\n\t"
  73098. #endif
  73099. #ifdef WOLFSSL_KEIL
  73100. "muls r6, r5, r6\n\t"
  73101. #elif defined(__clang__)
  73102. "muls r6, r5\n\t"
  73103. #else
  73104. "mul r6, r5\n\t"
  73105. #endif
  73106. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73107. "adds r3, r3, r6\n\t"
  73108. #else
  73109. "add r3, r3, r6\n\t"
  73110. #endif
  73111. #ifdef WOLFSSL_KEIL
  73112. "adcs r7, r7, r7\n\t"
  73113. #elif defined(__clang__)
  73114. "adcs r7, r7\n\t"
  73115. #else
  73116. "adc r7, r7\n\t"
  73117. #endif
  73118. "uxth r6, %[mp]\n\t"
  73119. #ifdef WOLFSSL_KEIL
  73120. "muls r5, r6, r5\n\t"
  73121. #elif defined(__clang__)
  73122. "muls r5, r6\n\t"
  73123. #else
  73124. "mul r5, r6\n\t"
  73125. #endif
  73126. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73127. "lsrs r6, r5, #16\n\t"
  73128. #else
  73129. "lsr r6, r5, #16\n\t"
  73130. #endif
  73131. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73132. "lsls r5, r5, #16\n\t"
  73133. #else
  73134. "lsl r5, r5, #16\n\t"
  73135. #endif
  73136. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73137. "adds r4, r4, r5\n\t"
  73138. #else
  73139. "add r4, r4, r5\n\t"
  73140. #endif
  73141. #ifdef WOLFSSL_KEIL
  73142. "adcs r3, r3, r6\n\t"
  73143. #elif defined(__clang__)
  73144. "adcs r3, r6\n\t"
  73145. #else
  73146. "adc r3, r6\n\t"
  73147. #endif
  73148. #ifdef WOLFSSL_KEIL
  73149. "adcs r7, r7, r7\n\t"
  73150. #elif defined(__clang__)
  73151. "adcs r7, r7\n\t"
  73152. #else
  73153. "adc r7, r7\n\t"
  73154. #endif
  73155. "# Multiply m[47] and mu - Done\n\t"
  73156. "ldr r5, [%[a]]\n\t"
  73157. "ldr r6, [%[a], #4]\n\t"
  73158. "movs %[mp], #0\n\t"
  73159. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73160. "adds r5, r5, r4\n\t"
  73161. #else
  73162. "add r5, r5, r4\n\t"
  73163. #endif
  73164. #ifdef WOLFSSL_KEIL
  73165. "adcs r6, r6, r3\n\t"
  73166. #elif defined(__clang__)
  73167. "adcs r6, r3\n\t"
  73168. #else
  73169. "adc r6, r3\n\t"
  73170. #endif
  73171. #ifdef WOLFSSL_KEIL
  73172. "adcs r7, r7, %[mp]\n\t"
  73173. #elif defined(__clang__)
  73174. "adcs r7, %[mp]\n\t"
  73175. #else
  73176. "adc r7, %[mp]\n\t"
  73177. #endif
  73178. "stm %[a]!, {r5, r6}\n\t"
  73179. "# i += 1\n\t"
  73180. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73181. "subs %[a], %[a], #4\n\t"
  73182. #else
  73183. "sub %[a], %[a], #4\n\t"
  73184. #endif
  73185. "movs r3, #0xbc\n\t"
  73186. "mov r9, %[a]\n\t"
  73187. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73188. "subs %[a], %[a], r3\n\t"
  73189. #else
  73190. "sub %[a], %[a], r3\n\t"
  73191. #endif
  73192. "mov r12, r7\n\t"
  73193. "mov %[m], lr\n\t"
  73194. "cmp r11, %[a]\n\t"
  73195. "bgt L_sp_3072_mont_reduce_48_mod_%=\n\t"
  73196. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73197. "negs r7, r7\n\t"
  73198. #else
  73199. "neg r7, r7\n\t"
  73200. #endif
  73201. "# Subtract masked modulus\n\t"
  73202. "movs r4, #0xc0\n\t"
  73203. "movs %[mp], #0\n\t"
  73204. "movs r3, #0\n\t"
  73205. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73206. "subs %[a], %[a], r4\n\t"
  73207. #else
  73208. "sub %[a], %[a], r4\n\t"
  73209. #endif
  73210. #ifndef WOLFSSL_SP_LARGE_CODE
  73211. "\n"
  73212. "L_sp_3072_mont_reduce_48_sub_mask_%=:\n\t"
  73213. "ldm %[m]!, {r6}\n\t"
  73214. "movs r5, #0\n\t"
  73215. #ifdef WOLFSSL_KEIL
  73216. "ands r6, r6, r7\n\t"
  73217. #elif defined(__clang__)
  73218. "ands r6, r7\n\t"
  73219. #else
  73220. "and r6, r7\n\t"
  73221. #endif
  73222. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73223. "subs r5, r5, %[mp]\n\t"
  73224. #else
  73225. "sub r5, r5, %[mp]\n\t"
  73226. #endif
  73227. "ldr r5, [%[a], r4]\n\t"
  73228. #ifdef WOLFSSL_KEIL
  73229. "sbcs r5, r5, r6\n\t"
  73230. #elif defined(__clang__)
  73231. "sbcs r5, r6\n\t"
  73232. #else
  73233. "sbc r5, r6\n\t"
  73234. #endif
  73235. #ifdef WOLFSSL_KEIL
  73236. "sbcs %[mp], %[mp], %[mp]\n\t"
  73237. #elif defined(__clang__)
  73238. "sbcs %[mp], %[mp]\n\t"
  73239. #else
  73240. "sbc %[mp], %[mp]\n\t"
  73241. #endif
  73242. "stm %[a]!, {r5}\n\t"
  73243. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73244. "adds r3, r3, #4\n\t"
  73245. #else
  73246. "add r3, r3, #4\n\t"
  73247. #endif
  73248. "cmp r3, r4\n\t"
  73249. "blt L_sp_3072_mont_reduce_48_sub_mask_%=\n\t"
  73250. #else /* WOLFSSL_SP_LARGE_CODE */
  73251. "ldm %[m]!, {r6}\n\t"
  73252. #ifdef WOLFSSL_KEIL
  73253. "ands r6, r6, r7\n\t"
  73254. #elif defined(__clang__)
  73255. "ands r6, r7\n\t"
  73256. #else
  73257. "and r6, r7\n\t"
  73258. #endif
  73259. "ldr r5, [%[a], r4]\n\t"
  73260. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73261. "subs r5, r5, r6\n\t"
  73262. #else
  73263. "sub r5, r5, r6\n\t"
  73264. #endif
  73265. "stm %[a]!, {r5}\n\t"
  73266. "ldm %[m]!, {r6}\n\t"
  73267. #ifdef WOLFSSL_KEIL
  73268. "ands r6, r6, r7\n\t"
  73269. #elif defined(__clang__)
  73270. "ands r6, r7\n\t"
  73271. #else
  73272. "and r6, r7\n\t"
  73273. #endif
  73274. "ldr r5, [%[a], r4]\n\t"
  73275. #ifdef WOLFSSL_KEIL
  73276. "sbcs r5, r5, r6\n\t"
  73277. #elif defined(__clang__)
  73278. "sbcs r5, r6\n\t"
  73279. #else
  73280. "sbc r5, r6\n\t"
  73281. #endif
  73282. "stm %[a]!, {r5}\n\t"
  73283. "ldm %[m]!, {r6}\n\t"
  73284. #ifdef WOLFSSL_KEIL
  73285. "ands r6, r6, r7\n\t"
  73286. #elif defined(__clang__)
  73287. "ands r6, r7\n\t"
  73288. #else
  73289. "and r6, r7\n\t"
  73290. #endif
  73291. "ldr r5, [%[a], r4]\n\t"
  73292. #ifdef WOLFSSL_KEIL
  73293. "sbcs r5, r5, r6\n\t"
  73294. #elif defined(__clang__)
  73295. "sbcs r5, r6\n\t"
  73296. #else
  73297. "sbc r5, r6\n\t"
  73298. #endif
  73299. "stm %[a]!, {r5}\n\t"
  73300. "ldm %[m]!, {r6}\n\t"
  73301. #ifdef WOLFSSL_KEIL
  73302. "ands r6, r6, r7\n\t"
  73303. #elif defined(__clang__)
  73304. "ands r6, r7\n\t"
  73305. #else
  73306. "and r6, r7\n\t"
  73307. #endif
  73308. "ldr r5, [%[a], r4]\n\t"
  73309. #ifdef WOLFSSL_KEIL
  73310. "sbcs r5, r5, r6\n\t"
  73311. #elif defined(__clang__)
  73312. "sbcs r5, r6\n\t"
  73313. #else
  73314. "sbc r5, r6\n\t"
  73315. #endif
  73316. "stm %[a]!, {r5}\n\t"
  73317. "ldm %[m]!, {r6}\n\t"
  73318. #ifdef WOLFSSL_KEIL
  73319. "ands r6, r6, r7\n\t"
  73320. #elif defined(__clang__)
  73321. "ands r6, r7\n\t"
  73322. #else
  73323. "and r6, r7\n\t"
  73324. #endif
  73325. "ldr r5, [%[a], r4]\n\t"
  73326. #ifdef WOLFSSL_KEIL
  73327. "sbcs r5, r5, r6\n\t"
  73328. #elif defined(__clang__)
  73329. "sbcs r5, r6\n\t"
  73330. #else
  73331. "sbc r5, r6\n\t"
  73332. #endif
  73333. "stm %[a]!, {r5}\n\t"
  73334. "ldm %[m]!, {r6}\n\t"
  73335. #ifdef WOLFSSL_KEIL
  73336. "ands r6, r6, r7\n\t"
  73337. #elif defined(__clang__)
  73338. "ands r6, r7\n\t"
  73339. #else
  73340. "and r6, r7\n\t"
  73341. #endif
  73342. "ldr r5, [%[a], r4]\n\t"
  73343. #ifdef WOLFSSL_KEIL
  73344. "sbcs r5, r5, r6\n\t"
  73345. #elif defined(__clang__)
  73346. "sbcs r5, r6\n\t"
  73347. #else
  73348. "sbc r5, r6\n\t"
  73349. #endif
  73350. "stm %[a]!, {r5}\n\t"
  73351. "ldm %[m]!, {r6}\n\t"
  73352. #ifdef WOLFSSL_KEIL
  73353. "ands r6, r6, r7\n\t"
  73354. #elif defined(__clang__)
  73355. "ands r6, r7\n\t"
  73356. #else
  73357. "and r6, r7\n\t"
  73358. #endif
  73359. "ldr r5, [%[a], r4]\n\t"
  73360. #ifdef WOLFSSL_KEIL
  73361. "sbcs r5, r5, r6\n\t"
  73362. #elif defined(__clang__)
  73363. "sbcs r5, r6\n\t"
  73364. #else
  73365. "sbc r5, r6\n\t"
  73366. #endif
  73367. "stm %[a]!, {r5}\n\t"
  73368. "ldm %[m]!, {r6}\n\t"
  73369. #ifdef WOLFSSL_KEIL
  73370. "ands r6, r6, r7\n\t"
  73371. #elif defined(__clang__)
  73372. "ands r6, r7\n\t"
  73373. #else
  73374. "and r6, r7\n\t"
  73375. #endif
  73376. "ldr r5, [%[a], r4]\n\t"
  73377. #ifdef WOLFSSL_KEIL
  73378. "sbcs r5, r5, r6\n\t"
  73379. #elif defined(__clang__)
  73380. "sbcs r5, r6\n\t"
  73381. #else
  73382. "sbc r5, r6\n\t"
  73383. #endif
  73384. "stm %[a]!, {r5}\n\t"
  73385. "ldm %[m]!, {r6}\n\t"
  73386. #ifdef WOLFSSL_KEIL
  73387. "ands r6, r6, r7\n\t"
  73388. #elif defined(__clang__)
  73389. "ands r6, r7\n\t"
  73390. #else
  73391. "and r6, r7\n\t"
  73392. #endif
  73393. "ldr r5, [%[a], r4]\n\t"
  73394. #ifdef WOLFSSL_KEIL
  73395. "sbcs r5, r5, r6\n\t"
  73396. #elif defined(__clang__)
  73397. "sbcs r5, r6\n\t"
  73398. #else
  73399. "sbc r5, r6\n\t"
  73400. #endif
  73401. "stm %[a]!, {r5}\n\t"
  73402. "ldm %[m]!, {r6}\n\t"
  73403. #ifdef WOLFSSL_KEIL
  73404. "ands r6, r6, r7\n\t"
  73405. #elif defined(__clang__)
  73406. "ands r6, r7\n\t"
  73407. #else
  73408. "and r6, r7\n\t"
  73409. #endif
  73410. "ldr r5, [%[a], r4]\n\t"
  73411. #ifdef WOLFSSL_KEIL
  73412. "sbcs r5, r5, r6\n\t"
  73413. #elif defined(__clang__)
  73414. "sbcs r5, r6\n\t"
  73415. #else
  73416. "sbc r5, r6\n\t"
  73417. #endif
  73418. "stm %[a]!, {r5}\n\t"
  73419. "ldm %[m]!, {r6}\n\t"
  73420. #ifdef WOLFSSL_KEIL
  73421. "ands r6, r6, r7\n\t"
  73422. #elif defined(__clang__)
  73423. "ands r6, r7\n\t"
  73424. #else
  73425. "and r6, r7\n\t"
  73426. #endif
  73427. "ldr r5, [%[a], r4]\n\t"
  73428. #ifdef WOLFSSL_KEIL
  73429. "sbcs r5, r5, r6\n\t"
  73430. #elif defined(__clang__)
  73431. "sbcs r5, r6\n\t"
  73432. #else
  73433. "sbc r5, r6\n\t"
  73434. #endif
  73435. "stm %[a]!, {r5}\n\t"
  73436. "ldm %[m]!, {r6}\n\t"
  73437. #ifdef WOLFSSL_KEIL
  73438. "ands r6, r6, r7\n\t"
  73439. #elif defined(__clang__)
  73440. "ands r6, r7\n\t"
  73441. #else
  73442. "and r6, r7\n\t"
  73443. #endif
  73444. "ldr r5, [%[a], r4]\n\t"
  73445. #ifdef WOLFSSL_KEIL
  73446. "sbcs r5, r5, r6\n\t"
  73447. #elif defined(__clang__)
  73448. "sbcs r5, r6\n\t"
  73449. #else
  73450. "sbc r5, r6\n\t"
  73451. #endif
  73452. "stm %[a]!, {r5}\n\t"
  73453. "ldm %[m]!, {r6}\n\t"
  73454. #ifdef WOLFSSL_KEIL
  73455. "ands r6, r6, r7\n\t"
  73456. #elif defined(__clang__)
  73457. "ands r6, r7\n\t"
  73458. #else
  73459. "and r6, r7\n\t"
  73460. #endif
  73461. "ldr r5, [%[a], r4]\n\t"
  73462. #ifdef WOLFSSL_KEIL
  73463. "sbcs r5, r5, r6\n\t"
  73464. #elif defined(__clang__)
  73465. "sbcs r5, r6\n\t"
  73466. #else
  73467. "sbc r5, r6\n\t"
  73468. #endif
  73469. "stm %[a]!, {r5}\n\t"
  73470. "ldm %[m]!, {r6}\n\t"
  73471. #ifdef WOLFSSL_KEIL
  73472. "ands r6, r6, r7\n\t"
  73473. #elif defined(__clang__)
  73474. "ands r6, r7\n\t"
  73475. #else
  73476. "and r6, r7\n\t"
  73477. #endif
  73478. "ldr r5, [%[a], r4]\n\t"
  73479. #ifdef WOLFSSL_KEIL
  73480. "sbcs r5, r5, r6\n\t"
  73481. #elif defined(__clang__)
  73482. "sbcs r5, r6\n\t"
  73483. #else
  73484. "sbc r5, r6\n\t"
  73485. #endif
  73486. "stm %[a]!, {r5}\n\t"
  73487. "ldm %[m]!, {r6}\n\t"
  73488. #ifdef WOLFSSL_KEIL
  73489. "ands r6, r6, r7\n\t"
  73490. #elif defined(__clang__)
  73491. "ands r6, r7\n\t"
  73492. #else
  73493. "and r6, r7\n\t"
  73494. #endif
  73495. "ldr r5, [%[a], r4]\n\t"
  73496. #ifdef WOLFSSL_KEIL
  73497. "sbcs r5, r5, r6\n\t"
  73498. #elif defined(__clang__)
  73499. "sbcs r5, r6\n\t"
  73500. #else
  73501. "sbc r5, r6\n\t"
  73502. #endif
  73503. "stm %[a]!, {r5}\n\t"
  73504. "ldm %[m]!, {r6}\n\t"
  73505. #ifdef WOLFSSL_KEIL
  73506. "ands r6, r6, r7\n\t"
  73507. #elif defined(__clang__)
  73508. "ands r6, r7\n\t"
  73509. #else
  73510. "and r6, r7\n\t"
  73511. #endif
  73512. "ldr r5, [%[a], r4]\n\t"
  73513. #ifdef WOLFSSL_KEIL
  73514. "sbcs r5, r5, r6\n\t"
  73515. #elif defined(__clang__)
  73516. "sbcs r5, r6\n\t"
  73517. #else
  73518. "sbc r5, r6\n\t"
  73519. #endif
  73520. "stm %[a]!, {r5}\n\t"
  73521. "ldm %[m]!, {r6}\n\t"
  73522. #ifdef WOLFSSL_KEIL
  73523. "ands r6, r6, r7\n\t"
  73524. #elif defined(__clang__)
  73525. "ands r6, r7\n\t"
  73526. #else
  73527. "and r6, r7\n\t"
  73528. #endif
  73529. "ldr r5, [%[a], r4]\n\t"
  73530. #ifdef WOLFSSL_KEIL
  73531. "sbcs r5, r5, r6\n\t"
  73532. #elif defined(__clang__)
  73533. "sbcs r5, r6\n\t"
  73534. #else
  73535. "sbc r5, r6\n\t"
  73536. #endif
  73537. "stm %[a]!, {r5}\n\t"
  73538. "ldm %[m]!, {r6}\n\t"
  73539. #ifdef WOLFSSL_KEIL
  73540. "ands r6, r6, r7\n\t"
  73541. #elif defined(__clang__)
  73542. "ands r6, r7\n\t"
  73543. #else
  73544. "and r6, r7\n\t"
  73545. #endif
  73546. "ldr r5, [%[a], r4]\n\t"
  73547. #ifdef WOLFSSL_KEIL
  73548. "sbcs r5, r5, r6\n\t"
  73549. #elif defined(__clang__)
  73550. "sbcs r5, r6\n\t"
  73551. #else
  73552. "sbc r5, r6\n\t"
  73553. #endif
  73554. "stm %[a]!, {r5}\n\t"
  73555. "ldm %[m]!, {r6}\n\t"
  73556. #ifdef WOLFSSL_KEIL
  73557. "ands r6, r6, r7\n\t"
  73558. #elif defined(__clang__)
  73559. "ands r6, r7\n\t"
  73560. #else
  73561. "and r6, r7\n\t"
  73562. #endif
  73563. "ldr r5, [%[a], r4]\n\t"
  73564. #ifdef WOLFSSL_KEIL
  73565. "sbcs r5, r5, r6\n\t"
  73566. #elif defined(__clang__)
  73567. "sbcs r5, r6\n\t"
  73568. #else
  73569. "sbc r5, r6\n\t"
  73570. #endif
  73571. "stm %[a]!, {r5}\n\t"
  73572. "ldm %[m]!, {r6}\n\t"
  73573. #ifdef WOLFSSL_KEIL
  73574. "ands r6, r6, r7\n\t"
  73575. #elif defined(__clang__)
  73576. "ands r6, r7\n\t"
  73577. #else
  73578. "and r6, r7\n\t"
  73579. #endif
  73580. "ldr r5, [%[a], r4]\n\t"
  73581. #ifdef WOLFSSL_KEIL
  73582. "sbcs r5, r5, r6\n\t"
  73583. #elif defined(__clang__)
  73584. "sbcs r5, r6\n\t"
  73585. #else
  73586. "sbc r5, r6\n\t"
  73587. #endif
  73588. "stm %[a]!, {r5}\n\t"
  73589. "ldm %[m]!, {r6}\n\t"
  73590. #ifdef WOLFSSL_KEIL
  73591. "ands r6, r6, r7\n\t"
  73592. #elif defined(__clang__)
  73593. "ands r6, r7\n\t"
  73594. #else
  73595. "and r6, r7\n\t"
  73596. #endif
  73597. "ldr r5, [%[a], r4]\n\t"
  73598. #ifdef WOLFSSL_KEIL
  73599. "sbcs r5, r5, r6\n\t"
  73600. #elif defined(__clang__)
  73601. "sbcs r5, r6\n\t"
  73602. #else
  73603. "sbc r5, r6\n\t"
  73604. #endif
  73605. "stm %[a]!, {r5}\n\t"
  73606. "ldm %[m]!, {r6}\n\t"
  73607. #ifdef WOLFSSL_KEIL
  73608. "ands r6, r6, r7\n\t"
  73609. #elif defined(__clang__)
  73610. "ands r6, r7\n\t"
  73611. #else
  73612. "and r6, r7\n\t"
  73613. #endif
  73614. "ldr r5, [%[a], r4]\n\t"
  73615. #ifdef WOLFSSL_KEIL
  73616. "sbcs r5, r5, r6\n\t"
  73617. #elif defined(__clang__)
  73618. "sbcs r5, r6\n\t"
  73619. #else
  73620. "sbc r5, r6\n\t"
  73621. #endif
  73622. "stm %[a]!, {r5}\n\t"
  73623. "ldm %[m]!, {r6}\n\t"
  73624. #ifdef WOLFSSL_KEIL
  73625. "ands r6, r6, r7\n\t"
  73626. #elif defined(__clang__)
  73627. "ands r6, r7\n\t"
  73628. #else
  73629. "and r6, r7\n\t"
  73630. #endif
  73631. "ldr r5, [%[a], r4]\n\t"
  73632. #ifdef WOLFSSL_KEIL
  73633. "sbcs r5, r5, r6\n\t"
  73634. #elif defined(__clang__)
  73635. "sbcs r5, r6\n\t"
  73636. #else
  73637. "sbc r5, r6\n\t"
  73638. #endif
  73639. "stm %[a]!, {r5}\n\t"
  73640. "ldm %[m]!, {r6}\n\t"
  73641. #ifdef WOLFSSL_KEIL
  73642. "ands r6, r6, r7\n\t"
  73643. #elif defined(__clang__)
  73644. "ands r6, r7\n\t"
  73645. #else
  73646. "and r6, r7\n\t"
  73647. #endif
  73648. "ldr r5, [%[a], r4]\n\t"
  73649. #ifdef WOLFSSL_KEIL
  73650. "sbcs r5, r5, r6\n\t"
  73651. #elif defined(__clang__)
  73652. "sbcs r5, r6\n\t"
  73653. #else
  73654. "sbc r5, r6\n\t"
  73655. #endif
  73656. "stm %[a]!, {r5}\n\t"
  73657. "ldm %[m]!, {r6}\n\t"
  73658. #ifdef WOLFSSL_KEIL
  73659. "ands r6, r6, r7\n\t"
  73660. #elif defined(__clang__)
  73661. "ands r6, r7\n\t"
  73662. #else
  73663. "and r6, r7\n\t"
  73664. #endif
  73665. "ldr r5, [%[a], r4]\n\t"
  73666. #ifdef WOLFSSL_KEIL
  73667. "sbcs r5, r5, r6\n\t"
  73668. #elif defined(__clang__)
  73669. "sbcs r5, r6\n\t"
  73670. #else
  73671. "sbc r5, r6\n\t"
  73672. #endif
  73673. "stm %[a]!, {r5}\n\t"
  73674. "ldm %[m]!, {r6}\n\t"
  73675. #ifdef WOLFSSL_KEIL
  73676. "ands r6, r6, r7\n\t"
  73677. #elif defined(__clang__)
  73678. "ands r6, r7\n\t"
  73679. #else
  73680. "and r6, r7\n\t"
  73681. #endif
  73682. "ldr r5, [%[a], r4]\n\t"
  73683. #ifdef WOLFSSL_KEIL
  73684. "sbcs r5, r5, r6\n\t"
  73685. #elif defined(__clang__)
  73686. "sbcs r5, r6\n\t"
  73687. #else
  73688. "sbc r5, r6\n\t"
  73689. #endif
  73690. "stm %[a]!, {r5}\n\t"
  73691. "ldm %[m]!, {r6}\n\t"
  73692. #ifdef WOLFSSL_KEIL
  73693. "ands r6, r6, r7\n\t"
  73694. #elif defined(__clang__)
  73695. "ands r6, r7\n\t"
  73696. #else
  73697. "and r6, r7\n\t"
  73698. #endif
  73699. "ldr r5, [%[a], r4]\n\t"
  73700. #ifdef WOLFSSL_KEIL
  73701. "sbcs r5, r5, r6\n\t"
  73702. #elif defined(__clang__)
  73703. "sbcs r5, r6\n\t"
  73704. #else
  73705. "sbc r5, r6\n\t"
  73706. #endif
  73707. "stm %[a]!, {r5}\n\t"
  73708. "ldm %[m]!, {r6}\n\t"
  73709. #ifdef WOLFSSL_KEIL
  73710. "ands r6, r6, r7\n\t"
  73711. #elif defined(__clang__)
  73712. "ands r6, r7\n\t"
  73713. #else
  73714. "and r6, r7\n\t"
  73715. #endif
  73716. "ldr r5, [%[a], r4]\n\t"
  73717. #ifdef WOLFSSL_KEIL
  73718. "sbcs r5, r5, r6\n\t"
  73719. #elif defined(__clang__)
  73720. "sbcs r5, r6\n\t"
  73721. #else
  73722. "sbc r5, r6\n\t"
  73723. #endif
  73724. "stm %[a]!, {r5}\n\t"
  73725. "ldm %[m]!, {r6}\n\t"
  73726. #ifdef WOLFSSL_KEIL
  73727. "ands r6, r6, r7\n\t"
  73728. #elif defined(__clang__)
  73729. "ands r6, r7\n\t"
  73730. #else
  73731. "and r6, r7\n\t"
  73732. #endif
  73733. "ldr r5, [%[a], r4]\n\t"
  73734. #ifdef WOLFSSL_KEIL
  73735. "sbcs r5, r5, r6\n\t"
  73736. #elif defined(__clang__)
  73737. "sbcs r5, r6\n\t"
  73738. #else
  73739. "sbc r5, r6\n\t"
  73740. #endif
  73741. "stm %[a]!, {r5}\n\t"
  73742. "ldm %[m]!, {r6}\n\t"
  73743. #ifdef WOLFSSL_KEIL
  73744. "ands r6, r6, r7\n\t"
  73745. #elif defined(__clang__)
  73746. "ands r6, r7\n\t"
  73747. #else
  73748. "and r6, r7\n\t"
  73749. #endif
  73750. "ldr r5, [%[a], r4]\n\t"
  73751. #ifdef WOLFSSL_KEIL
  73752. "sbcs r5, r5, r6\n\t"
  73753. #elif defined(__clang__)
  73754. "sbcs r5, r6\n\t"
  73755. #else
  73756. "sbc r5, r6\n\t"
  73757. #endif
  73758. "stm %[a]!, {r5}\n\t"
  73759. "ldm %[m]!, {r6}\n\t"
  73760. #ifdef WOLFSSL_KEIL
  73761. "ands r6, r6, r7\n\t"
  73762. #elif defined(__clang__)
  73763. "ands r6, r7\n\t"
  73764. #else
  73765. "and r6, r7\n\t"
  73766. #endif
  73767. "ldr r5, [%[a], r4]\n\t"
  73768. #ifdef WOLFSSL_KEIL
  73769. "sbcs r5, r5, r6\n\t"
  73770. #elif defined(__clang__)
  73771. "sbcs r5, r6\n\t"
  73772. #else
  73773. "sbc r5, r6\n\t"
  73774. #endif
  73775. "stm %[a]!, {r5}\n\t"
  73776. "ldm %[m]!, {r6}\n\t"
  73777. #ifdef WOLFSSL_KEIL
  73778. "ands r6, r6, r7\n\t"
  73779. #elif defined(__clang__)
  73780. "ands r6, r7\n\t"
  73781. #else
  73782. "and r6, r7\n\t"
  73783. #endif
  73784. "ldr r5, [%[a], r4]\n\t"
  73785. #ifdef WOLFSSL_KEIL
  73786. "sbcs r5, r5, r6\n\t"
  73787. #elif defined(__clang__)
  73788. "sbcs r5, r6\n\t"
  73789. #else
  73790. "sbc r5, r6\n\t"
  73791. #endif
  73792. "stm %[a]!, {r5}\n\t"
  73793. "ldm %[m]!, {r6}\n\t"
  73794. #ifdef WOLFSSL_KEIL
  73795. "ands r6, r6, r7\n\t"
  73796. #elif defined(__clang__)
  73797. "ands r6, r7\n\t"
  73798. #else
  73799. "and r6, r7\n\t"
  73800. #endif
  73801. "ldr r5, [%[a], r4]\n\t"
  73802. #ifdef WOLFSSL_KEIL
  73803. "sbcs r5, r5, r6\n\t"
  73804. #elif defined(__clang__)
  73805. "sbcs r5, r6\n\t"
  73806. #else
  73807. "sbc r5, r6\n\t"
  73808. #endif
  73809. "stm %[a]!, {r5}\n\t"
  73810. "ldm %[m]!, {r6}\n\t"
  73811. #ifdef WOLFSSL_KEIL
  73812. "ands r6, r6, r7\n\t"
  73813. #elif defined(__clang__)
  73814. "ands r6, r7\n\t"
  73815. #else
  73816. "and r6, r7\n\t"
  73817. #endif
  73818. "ldr r5, [%[a], r4]\n\t"
  73819. #ifdef WOLFSSL_KEIL
  73820. "sbcs r5, r5, r6\n\t"
  73821. #elif defined(__clang__)
  73822. "sbcs r5, r6\n\t"
  73823. #else
  73824. "sbc r5, r6\n\t"
  73825. #endif
  73826. "stm %[a]!, {r5}\n\t"
  73827. "ldm %[m]!, {r6}\n\t"
  73828. #ifdef WOLFSSL_KEIL
  73829. "ands r6, r6, r7\n\t"
  73830. #elif defined(__clang__)
  73831. "ands r6, r7\n\t"
  73832. #else
  73833. "and r6, r7\n\t"
  73834. #endif
  73835. "ldr r5, [%[a], r4]\n\t"
  73836. #ifdef WOLFSSL_KEIL
  73837. "sbcs r5, r5, r6\n\t"
  73838. #elif defined(__clang__)
  73839. "sbcs r5, r6\n\t"
  73840. #else
  73841. "sbc r5, r6\n\t"
  73842. #endif
  73843. "stm %[a]!, {r5}\n\t"
  73844. "ldm %[m]!, {r6}\n\t"
  73845. #ifdef WOLFSSL_KEIL
  73846. "ands r6, r6, r7\n\t"
  73847. #elif defined(__clang__)
  73848. "ands r6, r7\n\t"
  73849. #else
  73850. "and r6, r7\n\t"
  73851. #endif
  73852. "ldr r5, [%[a], r4]\n\t"
  73853. #ifdef WOLFSSL_KEIL
  73854. "sbcs r5, r5, r6\n\t"
  73855. #elif defined(__clang__)
  73856. "sbcs r5, r6\n\t"
  73857. #else
  73858. "sbc r5, r6\n\t"
  73859. #endif
  73860. "stm %[a]!, {r5}\n\t"
  73861. "ldm %[m]!, {r6}\n\t"
  73862. #ifdef WOLFSSL_KEIL
  73863. "ands r6, r6, r7\n\t"
  73864. #elif defined(__clang__)
  73865. "ands r6, r7\n\t"
  73866. #else
  73867. "and r6, r7\n\t"
  73868. #endif
  73869. "ldr r5, [%[a], r4]\n\t"
  73870. #ifdef WOLFSSL_KEIL
  73871. "sbcs r5, r5, r6\n\t"
  73872. #elif defined(__clang__)
  73873. "sbcs r5, r6\n\t"
  73874. #else
  73875. "sbc r5, r6\n\t"
  73876. #endif
  73877. "stm %[a]!, {r5}\n\t"
  73878. "ldm %[m]!, {r6}\n\t"
  73879. #ifdef WOLFSSL_KEIL
  73880. "ands r6, r6, r7\n\t"
  73881. #elif defined(__clang__)
  73882. "ands r6, r7\n\t"
  73883. #else
  73884. "and r6, r7\n\t"
  73885. #endif
  73886. "ldr r5, [%[a], r4]\n\t"
  73887. #ifdef WOLFSSL_KEIL
  73888. "sbcs r5, r5, r6\n\t"
  73889. #elif defined(__clang__)
  73890. "sbcs r5, r6\n\t"
  73891. #else
  73892. "sbc r5, r6\n\t"
  73893. #endif
  73894. "stm %[a]!, {r5}\n\t"
  73895. "ldm %[m]!, {r6}\n\t"
  73896. #ifdef WOLFSSL_KEIL
  73897. "ands r6, r6, r7\n\t"
  73898. #elif defined(__clang__)
  73899. "ands r6, r7\n\t"
  73900. #else
  73901. "and r6, r7\n\t"
  73902. #endif
  73903. "ldr r5, [%[a], r4]\n\t"
  73904. #ifdef WOLFSSL_KEIL
  73905. "sbcs r5, r5, r6\n\t"
  73906. #elif defined(__clang__)
  73907. "sbcs r5, r6\n\t"
  73908. #else
  73909. "sbc r5, r6\n\t"
  73910. #endif
  73911. "stm %[a]!, {r5}\n\t"
  73912. "ldm %[m]!, {r6}\n\t"
  73913. #ifdef WOLFSSL_KEIL
  73914. "ands r6, r6, r7\n\t"
  73915. #elif defined(__clang__)
  73916. "ands r6, r7\n\t"
  73917. #else
  73918. "and r6, r7\n\t"
  73919. #endif
  73920. "ldr r5, [%[a], r4]\n\t"
  73921. #ifdef WOLFSSL_KEIL
  73922. "sbcs r5, r5, r6\n\t"
  73923. #elif defined(__clang__)
  73924. "sbcs r5, r6\n\t"
  73925. #else
  73926. "sbc r5, r6\n\t"
  73927. #endif
  73928. "stm %[a]!, {r5}\n\t"
  73929. "ldm %[m]!, {r6}\n\t"
  73930. #ifdef WOLFSSL_KEIL
  73931. "ands r6, r6, r7\n\t"
  73932. #elif defined(__clang__)
  73933. "ands r6, r7\n\t"
  73934. #else
  73935. "and r6, r7\n\t"
  73936. #endif
  73937. "ldr r5, [%[a], r4]\n\t"
  73938. #ifdef WOLFSSL_KEIL
  73939. "sbcs r5, r5, r6\n\t"
  73940. #elif defined(__clang__)
  73941. "sbcs r5, r6\n\t"
  73942. #else
  73943. "sbc r5, r6\n\t"
  73944. #endif
  73945. "stm %[a]!, {r5}\n\t"
  73946. "ldm %[m]!, {r6}\n\t"
  73947. #ifdef WOLFSSL_KEIL
  73948. "ands r6, r6, r7\n\t"
  73949. #elif defined(__clang__)
  73950. "ands r6, r7\n\t"
  73951. #else
  73952. "and r6, r7\n\t"
  73953. #endif
  73954. "ldr r5, [%[a], r4]\n\t"
  73955. #ifdef WOLFSSL_KEIL
  73956. "sbcs r5, r5, r6\n\t"
  73957. #elif defined(__clang__)
  73958. "sbcs r5, r6\n\t"
  73959. #else
  73960. "sbc r5, r6\n\t"
  73961. #endif
  73962. "stm %[a]!, {r5}\n\t"
  73963. "ldm %[m]!, {r6}\n\t"
  73964. #ifdef WOLFSSL_KEIL
  73965. "ands r6, r6, r7\n\t"
  73966. #elif defined(__clang__)
  73967. "ands r6, r7\n\t"
  73968. #else
  73969. "and r6, r7\n\t"
  73970. #endif
  73971. "ldr r5, [%[a], r4]\n\t"
  73972. #ifdef WOLFSSL_KEIL
  73973. "sbcs r5, r5, r6\n\t"
  73974. #elif defined(__clang__)
  73975. "sbcs r5, r6\n\t"
  73976. #else
  73977. "sbc r5, r6\n\t"
  73978. #endif
  73979. "stm %[a]!, {r5}\n\t"
  73980. "ldm %[m]!, {r6}\n\t"
  73981. #ifdef WOLFSSL_KEIL
  73982. "ands r6, r6, r7\n\t"
  73983. #elif defined(__clang__)
  73984. "ands r6, r7\n\t"
  73985. #else
  73986. "and r6, r7\n\t"
  73987. #endif
  73988. "ldr r5, [%[a], r4]\n\t"
  73989. #ifdef WOLFSSL_KEIL
  73990. "sbcs r5, r5, r6\n\t"
  73991. #elif defined(__clang__)
  73992. "sbcs r5, r6\n\t"
  73993. #else
  73994. "sbc r5, r6\n\t"
  73995. #endif
  73996. "stm %[a]!, {r5}\n\t"
  73997. "ldm %[m]!, {r6}\n\t"
  73998. #ifdef WOLFSSL_KEIL
  73999. "ands r6, r6, r7\n\t"
  74000. #elif defined(__clang__)
  74001. "ands r6, r7\n\t"
  74002. #else
  74003. "and r6, r7\n\t"
  74004. #endif
  74005. "ldr r5, [%[a], r4]\n\t"
  74006. #ifdef WOLFSSL_KEIL
  74007. "sbcs r5, r5, r6\n\t"
  74008. #elif defined(__clang__)
  74009. "sbcs r5, r6\n\t"
  74010. #else
  74011. "sbc r5, r6\n\t"
  74012. #endif
  74013. "stm %[a]!, {r5}\n\t"
  74014. "ldm %[m]!, {r6}\n\t"
  74015. #ifdef WOLFSSL_KEIL
  74016. "ands r6, r6, r7\n\t"
  74017. #elif defined(__clang__)
  74018. "ands r6, r7\n\t"
  74019. #else
  74020. "and r6, r7\n\t"
  74021. #endif
  74022. "ldr r5, [%[a], r4]\n\t"
  74023. #ifdef WOLFSSL_KEIL
  74024. "sbcs r5, r5, r6\n\t"
  74025. #elif defined(__clang__)
  74026. "sbcs r5, r6\n\t"
  74027. #else
  74028. "sbc r5, r6\n\t"
  74029. #endif
  74030. "stm %[a]!, {r5}\n\t"
  74031. "ldm %[m]!, {r6}\n\t"
  74032. #ifdef WOLFSSL_KEIL
  74033. "ands r6, r6, r7\n\t"
  74034. #elif defined(__clang__)
  74035. "ands r6, r7\n\t"
  74036. #else
  74037. "and r6, r7\n\t"
  74038. #endif
  74039. "ldr r5, [%[a], r4]\n\t"
  74040. #ifdef WOLFSSL_KEIL
  74041. "sbcs r5, r5, r6\n\t"
  74042. #elif defined(__clang__)
  74043. "sbcs r5, r6\n\t"
  74044. #else
  74045. "sbc r5, r6\n\t"
  74046. #endif
  74047. "stm %[a]!, {r5}\n\t"
  74048. "ldm %[m]!, {r6}\n\t"
  74049. #ifdef WOLFSSL_KEIL
  74050. "ands r6, r6, r7\n\t"
  74051. #elif defined(__clang__)
  74052. "ands r6, r7\n\t"
  74053. #else
  74054. "and r6, r7\n\t"
  74055. #endif
  74056. "ldr r5, [%[a], r4]\n\t"
  74057. #ifdef WOLFSSL_KEIL
  74058. "sbcs r5, r5, r6\n\t"
  74059. #elif defined(__clang__)
  74060. "sbcs r5, r6\n\t"
  74061. #else
  74062. "sbc r5, r6\n\t"
  74063. #endif
  74064. "stm %[a]!, {r5}\n\t"
  74065. #endif /* WOLFSSL_SP_LARGE_CODE */
  74066. : [a] "+l" (a), [m] "+l" (m), [mp] "+l" (mp)
  74067. :
  74068. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr"
  74069. );
  74070. }
  74071. /* Multiply two Montgomery form numbers mod the modulus (prime).
  74072. * (r = a * b mod m)
  74073. *
  74074. * r Result of multiplication.
  74075. * a First number to multiply in Montgomery form.
  74076. * b Second number to multiply in Montgomery form.
  74077. * m Modulus (prime).
  74078. * mp Montgomery mulitplier.
  74079. */
  74080. SP_NOINLINE static void sp_3072_mont_mul_48(sp_digit* r, const sp_digit* a,
  74081. const sp_digit* b, const sp_digit* m, sp_digit mp)
  74082. {
  74083. sp_3072_mul_48(r, a, b);
  74084. sp_3072_mont_reduce_48(r, m, mp);
  74085. }
  74086. /* Square the Montgomery form number. (r = a * a mod m)
  74087. *
  74088. * r Result of squaring.
  74089. * a Number to square in Montgomery form.
  74090. * m Modulus (prime).
  74091. * mp Montgomery mulitplier.
  74092. */
  74093. SP_NOINLINE static void sp_3072_mont_sqr_48(sp_digit* r, const sp_digit* a,
  74094. const sp_digit* m, sp_digit mp)
  74095. {
  74096. sp_3072_sqr_48(r, a);
  74097. sp_3072_mont_reduce_48(r, m, mp);
  74098. }
  74099. /* Mul a by digit b into r. (r = a * b)
  74100. *
  74101. * r A single precision integer.
  74102. * a A single precision integer.
  74103. * b A single precision digit.
  74104. */
  74105. SP_NOINLINE static void sp_3072_mul_d_48(sp_digit* r, const sp_digit* a,
  74106. sp_digit b)
  74107. {
  74108. __asm__ __volatile__ (
  74109. "movs r6, #0xc0\n\t"
  74110. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74111. "adds r6, r6, %[a]\n\t"
  74112. #else
  74113. "add r6, r6, %[a]\n\t"
  74114. #endif
  74115. "mov r8, %[r]\n\t"
  74116. "mov r9, r6\n\t"
  74117. "movs r3, #0\n\t"
  74118. "movs r4, #0\n\t"
  74119. "\n"
  74120. "L_sp_3072_mul_d_48_%=:\n\t"
  74121. "movs %[r], #0\n\t"
  74122. "movs r5, #0\n\t"
  74123. "# A[] * B\n\t"
  74124. "ldrh r6, [%[a]]\n\t"
  74125. "uxth r7, %[b]\n\t"
  74126. #ifdef WOLFSSL_KEIL
  74127. "muls r7, r6, r7\n\t"
  74128. #elif defined(__clang__)
  74129. "muls r7, r6\n\t"
  74130. #else
  74131. "mul r7, r6\n\t"
  74132. #endif
  74133. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74134. "adds r3, r3, r7\n\t"
  74135. #else
  74136. "add r3, r3, r7\n\t"
  74137. #endif
  74138. #ifdef WOLFSSL_KEIL
  74139. "adcs r4, r4, %[r]\n\t"
  74140. #elif defined(__clang__)
  74141. "adcs r4, %[r]\n\t"
  74142. #else
  74143. "adc r4, %[r]\n\t"
  74144. #endif
  74145. #ifdef WOLFSSL_KEIL
  74146. "adcs r5, r5, %[r]\n\t"
  74147. #elif defined(__clang__)
  74148. "adcs r5, %[r]\n\t"
  74149. #else
  74150. "adc r5, %[r]\n\t"
  74151. #endif
  74152. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74153. "lsrs r7, %[b], #16\n\t"
  74154. #else
  74155. "lsr r7, %[b], #16\n\t"
  74156. #endif
  74157. #ifdef WOLFSSL_KEIL
  74158. "muls r6, r7, r6\n\t"
  74159. #elif defined(__clang__)
  74160. "muls r6, r7\n\t"
  74161. #else
  74162. "mul r6, r7\n\t"
  74163. #endif
  74164. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74165. "lsrs r7, r6, #16\n\t"
  74166. #else
  74167. "lsr r7, r6, #16\n\t"
  74168. #endif
  74169. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74170. "lsls r6, r6, #16\n\t"
  74171. #else
  74172. "lsl r6, r6, #16\n\t"
  74173. #endif
  74174. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74175. "adds r3, r3, r6\n\t"
  74176. #else
  74177. "add r3, r3, r6\n\t"
  74178. #endif
  74179. #ifdef WOLFSSL_KEIL
  74180. "adcs r4, r4, r7\n\t"
  74181. #elif defined(__clang__)
  74182. "adcs r4, r7\n\t"
  74183. #else
  74184. "adc r4, r7\n\t"
  74185. #endif
  74186. #ifdef WOLFSSL_KEIL
  74187. "adcs r5, r5, %[r]\n\t"
  74188. #elif defined(__clang__)
  74189. "adcs r5, %[r]\n\t"
  74190. #else
  74191. "adc r5, %[r]\n\t"
  74192. #endif
  74193. "ldr r6, [%[a]]\n\t"
  74194. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74195. "lsrs r6, r6, #16\n\t"
  74196. #else
  74197. "lsr r6, r6, #16\n\t"
  74198. #endif
  74199. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74200. "lsrs r7, %[b], #16\n\t"
  74201. #else
  74202. "lsr r7, %[b], #16\n\t"
  74203. #endif
  74204. #ifdef WOLFSSL_KEIL
  74205. "muls r7, r6, r7\n\t"
  74206. #elif defined(__clang__)
  74207. "muls r7, r6\n\t"
  74208. #else
  74209. "mul r7, r6\n\t"
  74210. #endif
  74211. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74212. "adds r4, r4, r7\n\t"
  74213. #else
  74214. "add r4, r4, r7\n\t"
  74215. #endif
  74216. #ifdef WOLFSSL_KEIL
  74217. "adcs r5, r5, %[r]\n\t"
  74218. #elif defined(__clang__)
  74219. "adcs r5, %[r]\n\t"
  74220. #else
  74221. "adc r5, %[r]\n\t"
  74222. #endif
  74223. "uxth r7, %[b]\n\t"
  74224. #ifdef WOLFSSL_KEIL
  74225. "muls r6, r7, r6\n\t"
  74226. #elif defined(__clang__)
  74227. "muls r6, r7\n\t"
  74228. #else
  74229. "mul r6, r7\n\t"
  74230. #endif
  74231. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74232. "lsrs r7, r6, #16\n\t"
  74233. #else
  74234. "lsr r7, r6, #16\n\t"
  74235. #endif
  74236. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74237. "lsls r6, r6, #16\n\t"
  74238. #else
  74239. "lsl r6, r6, #16\n\t"
  74240. #endif
  74241. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74242. "adds r3, r3, r6\n\t"
  74243. #else
  74244. "add r3, r3, r6\n\t"
  74245. #endif
  74246. #ifdef WOLFSSL_KEIL
  74247. "adcs r4, r4, r7\n\t"
  74248. #elif defined(__clang__)
  74249. "adcs r4, r7\n\t"
  74250. #else
  74251. "adc r4, r7\n\t"
  74252. #endif
  74253. #ifdef WOLFSSL_KEIL
  74254. "adcs r5, r5, %[r]\n\t"
  74255. #elif defined(__clang__)
  74256. "adcs r5, %[r]\n\t"
  74257. #else
  74258. "adc r5, %[r]\n\t"
  74259. #endif
  74260. "# A[] * B - Done\n\t"
  74261. "mov %[r], r8\n\t"
  74262. "str r3, [%[r]]\n\t"
  74263. "movs r3, r4\n\t"
  74264. "movs r4, r5\n\t"
  74265. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74266. "adds %[r], %[r], #4\n\t"
  74267. #else
  74268. "add %[r], %[r], #4\n\t"
  74269. #endif
  74270. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74271. "adds %[a], %[a], #4\n\t"
  74272. #else
  74273. "add %[a], %[a], #4\n\t"
  74274. #endif
  74275. "mov r8, %[r]\n\t"
  74276. "cmp %[a], r9\n\t"
  74277. "blt L_sp_3072_mul_d_48_%=\n\t"
  74278. "str r3, [%[r]]\n\t"
  74279. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  74280. :
  74281. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  74282. );
  74283. }
  74284. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  74285. *
  74286. * d1 The high order half of the number to divide.
  74287. * d0 The low order half of the number to divide.
  74288. * div The divisor.
  74289. * returns the result of the division.
  74290. *
  74291. * Note that this is an approximate div. It may give an answer 1 larger.
  74292. */
  74293. SP_NOINLINE static sp_digit div_3072_word_48(sp_digit d1, sp_digit d0,
  74294. sp_digit div)
  74295. {
  74296. __asm__ __volatile__ (
  74297. "movs r3, #0\n\t"
  74298. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74299. "lsrs r5, %[div], #1\n\t"
  74300. #else
  74301. "lsr r5, %[div], #1\n\t"
  74302. #endif
  74303. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74304. "adds r5, r5, #1\n\t"
  74305. #else
  74306. "add r5, r5, #1\n\t"
  74307. #endif
  74308. "mov r8, %[d0]\n\t"
  74309. "mov r9, %[d1]\n\t"
  74310. "# Do top 32\n\t"
  74311. "movs r6, r5\n\t"
  74312. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74313. "subs r6, r6, %[d1]\n\t"
  74314. #else
  74315. "sub r6, r6, %[d1]\n\t"
  74316. #endif
  74317. #ifdef WOLFSSL_KEIL
  74318. "sbcs r6, r6, r6\n\t"
  74319. #elif defined(__clang__)
  74320. "sbcs r6, r6\n\t"
  74321. #else
  74322. "sbc r6, r6\n\t"
  74323. #endif
  74324. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74325. "adds r3, r3, r3\n\t"
  74326. #else
  74327. "add r3, r3, r3\n\t"
  74328. #endif
  74329. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74330. "subs r3, r3, r6\n\t"
  74331. #else
  74332. "sub r3, r3, r6\n\t"
  74333. #endif
  74334. #ifdef WOLFSSL_KEIL
  74335. "ands r6, r6, r5\n\t"
  74336. #elif defined(__clang__)
  74337. "ands r6, r5\n\t"
  74338. #else
  74339. "and r6, r5\n\t"
  74340. #endif
  74341. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74342. "subs %[d1], %[d1], r6\n\t"
  74343. #else
  74344. "sub %[d1], %[d1], r6\n\t"
  74345. #endif
  74346. "movs r4, #29\n\t"
  74347. "\n"
  74348. "L_div_3072_word_48_loop_%=:\n\t"
  74349. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74350. "lsls %[d0], %[d0], #1\n\t"
  74351. #else
  74352. "lsl %[d0], %[d0], #1\n\t"
  74353. #endif
  74354. #ifdef WOLFSSL_KEIL
  74355. "adcs %[d1], %[d1], %[d1]\n\t"
  74356. #elif defined(__clang__)
  74357. "adcs %[d1], %[d1]\n\t"
  74358. #else
  74359. "adc %[d1], %[d1]\n\t"
  74360. #endif
  74361. "movs r6, r5\n\t"
  74362. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74363. "subs r6, r6, %[d1]\n\t"
  74364. #else
  74365. "sub r6, r6, %[d1]\n\t"
  74366. #endif
  74367. #ifdef WOLFSSL_KEIL
  74368. "sbcs r6, r6, r6\n\t"
  74369. #elif defined(__clang__)
  74370. "sbcs r6, r6\n\t"
  74371. #else
  74372. "sbc r6, r6\n\t"
  74373. #endif
  74374. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74375. "adds r3, r3, r3\n\t"
  74376. #else
  74377. "add r3, r3, r3\n\t"
  74378. #endif
  74379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74380. "subs r3, r3, r6\n\t"
  74381. #else
  74382. "sub r3, r3, r6\n\t"
  74383. #endif
  74384. #ifdef WOLFSSL_KEIL
  74385. "ands r6, r6, r5\n\t"
  74386. #elif defined(__clang__)
  74387. "ands r6, r5\n\t"
  74388. #else
  74389. "and r6, r5\n\t"
  74390. #endif
  74391. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74392. "subs %[d1], %[d1], r6\n\t"
  74393. #else
  74394. "sub %[d1], %[d1], r6\n\t"
  74395. #endif
  74396. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74397. "subs r4, r4, #1\n\t"
  74398. #else
  74399. "sub r4, r4, #1\n\t"
  74400. #endif
  74401. "bpl L_div_3072_word_48_loop_%=\n\t"
  74402. "movs r7, #0\n\t"
  74403. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74404. "adds r3, r3, r3\n\t"
  74405. #else
  74406. "add r3, r3, r3\n\t"
  74407. #endif
  74408. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74409. "adds r3, r3, #1\n\t"
  74410. #else
  74411. "add r3, r3, #1\n\t"
  74412. #endif
  74413. "# r * div - Start\n\t"
  74414. "uxth %[d1], r3\n\t"
  74415. "uxth r4, %[div]\n\t"
  74416. #ifdef WOLFSSL_KEIL
  74417. "muls r4, %[d1], r4\n\t"
  74418. #elif defined(__clang__)
  74419. "muls r4, %[d1]\n\t"
  74420. #else
  74421. "mul r4, %[d1]\n\t"
  74422. #endif
  74423. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74424. "lsrs r6, %[div], #16\n\t"
  74425. #else
  74426. "lsr r6, %[div], #16\n\t"
  74427. #endif
  74428. #ifdef WOLFSSL_KEIL
  74429. "muls %[d1], r6, %[d1]\n\t"
  74430. #elif defined(__clang__)
  74431. "muls %[d1], r6\n\t"
  74432. #else
  74433. "mul %[d1], r6\n\t"
  74434. #endif
  74435. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74436. "lsrs r5, %[d1], #16\n\t"
  74437. #else
  74438. "lsr r5, %[d1], #16\n\t"
  74439. #endif
  74440. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74441. "lsls %[d1], %[d1], #16\n\t"
  74442. #else
  74443. "lsl %[d1], %[d1], #16\n\t"
  74444. #endif
  74445. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74446. "adds r4, r4, %[d1]\n\t"
  74447. #else
  74448. "add r4, r4, %[d1]\n\t"
  74449. #endif
  74450. #ifdef WOLFSSL_KEIL
  74451. "adcs r5, r5, r7\n\t"
  74452. #elif defined(__clang__)
  74453. "adcs r5, r7\n\t"
  74454. #else
  74455. "adc r5, r7\n\t"
  74456. #endif
  74457. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74458. "lsrs %[d1], r3, #16\n\t"
  74459. #else
  74460. "lsr %[d1], r3, #16\n\t"
  74461. #endif
  74462. #ifdef WOLFSSL_KEIL
  74463. "muls r6, %[d1], r6\n\t"
  74464. #elif defined(__clang__)
  74465. "muls r6, %[d1]\n\t"
  74466. #else
  74467. "mul r6, %[d1]\n\t"
  74468. #endif
  74469. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74470. "adds r5, r5, r6\n\t"
  74471. #else
  74472. "add r5, r5, r6\n\t"
  74473. #endif
  74474. "uxth r6, %[div]\n\t"
  74475. #ifdef WOLFSSL_KEIL
  74476. "muls %[d1], r6, %[d1]\n\t"
  74477. #elif defined(__clang__)
  74478. "muls %[d1], r6\n\t"
  74479. #else
  74480. "mul %[d1], r6\n\t"
  74481. #endif
  74482. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74483. "lsrs r6, %[d1], #16\n\t"
  74484. #else
  74485. "lsr r6, %[d1], #16\n\t"
  74486. #endif
  74487. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74488. "lsls %[d1], %[d1], #16\n\t"
  74489. #else
  74490. "lsl %[d1], %[d1], #16\n\t"
  74491. #endif
  74492. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74493. "adds r4, r4, %[d1]\n\t"
  74494. #else
  74495. "add r4, r4, %[d1]\n\t"
  74496. #endif
  74497. #ifdef WOLFSSL_KEIL
  74498. "adcs r5, r5, r6\n\t"
  74499. #elif defined(__clang__)
  74500. "adcs r5, r6\n\t"
  74501. #else
  74502. "adc r5, r6\n\t"
  74503. #endif
  74504. "# r * div - Done\n\t"
  74505. "mov %[d1], r8\n\t"
  74506. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74507. "subs %[d1], %[d1], r4\n\t"
  74508. #else
  74509. "sub %[d1], %[d1], r4\n\t"
  74510. #endif
  74511. "movs r4, %[d1]\n\t"
  74512. "mov %[d1], r9\n\t"
  74513. #ifdef WOLFSSL_KEIL
  74514. "sbcs %[d1], %[d1], r5\n\t"
  74515. #elif defined(__clang__)
  74516. "sbcs %[d1], r5\n\t"
  74517. #else
  74518. "sbc %[d1], r5\n\t"
  74519. #endif
  74520. "movs r5, %[d1]\n\t"
  74521. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74522. "adds r3, r3, r5\n\t"
  74523. #else
  74524. "add r3, r3, r5\n\t"
  74525. #endif
  74526. "# r * div - Start\n\t"
  74527. "uxth %[d1], r3\n\t"
  74528. "uxth r4, %[div]\n\t"
  74529. #ifdef WOLFSSL_KEIL
  74530. "muls r4, %[d1], r4\n\t"
  74531. #elif defined(__clang__)
  74532. "muls r4, %[d1]\n\t"
  74533. #else
  74534. "mul r4, %[d1]\n\t"
  74535. #endif
  74536. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74537. "lsrs r6, %[div], #16\n\t"
  74538. #else
  74539. "lsr r6, %[div], #16\n\t"
  74540. #endif
  74541. #ifdef WOLFSSL_KEIL
  74542. "muls %[d1], r6, %[d1]\n\t"
  74543. #elif defined(__clang__)
  74544. "muls %[d1], r6\n\t"
  74545. #else
  74546. "mul %[d1], r6\n\t"
  74547. #endif
  74548. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74549. "lsrs r5, %[d1], #16\n\t"
  74550. #else
  74551. "lsr r5, %[d1], #16\n\t"
  74552. #endif
  74553. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74554. "lsls %[d1], %[d1], #16\n\t"
  74555. #else
  74556. "lsl %[d1], %[d1], #16\n\t"
  74557. #endif
  74558. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74559. "adds r4, r4, %[d1]\n\t"
  74560. #else
  74561. "add r4, r4, %[d1]\n\t"
  74562. #endif
  74563. #ifdef WOLFSSL_KEIL
  74564. "adcs r5, r5, r7\n\t"
  74565. #elif defined(__clang__)
  74566. "adcs r5, r7\n\t"
  74567. #else
  74568. "adc r5, r7\n\t"
  74569. #endif
  74570. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74571. "lsrs %[d1], r3, #16\n\t"
  74572. #else
  74573. "lsr %[d1], r3, #16\n\t"
  74574. #endif
  74575. #ifdef WOLFSSL_KEIL
  74576. "muls r6, %[d1], r6\n\t"
  74577. #elif defined(__clang__)
  74578. "muls r6, %[d1]\n\t"
  74579. #else
  74580. "mul r6, %[d1]\n\t"
  74581. #endif
  74582. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74583. "adds r5, r5, r6\n\t"
  74584. #else
  74585. "add r5, r5, r6\n\t"
  74586. #endif
  74587. "uxth r6, %[div]\n\t"
  74588. #ifdef WOLFSSL_KEIL
  74589. "muls %[d1], r6, %[d1]\n\t"
  74590. #elif defined(__clang__)
  74591. "muls %[d1], r6\n\t"
  74592. #else
  74593. "mul %[d1], r6\n\t"
  74594. #endif
  74595. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74596. "lsrs r6, %[d1], #16\n\t"
  74597. #else
  74598. "lsr r6, %[d1], #16\n\t"
  74599. #endif
  74600. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74601. "lsls %[d1], %[d1], #16\n\t"
  74602. #else
  74603. "lsl %[d1], %[d1], #16\n\t"
  74604. #endif
  74605. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74606. "adds r4, r4, %[d1]\n\t"
  74607. #else
  74608. "add r4, r4, %[d1]\n\t"
  74609. #endif
  74610. #ifdef WOLFSSL_KEIL
  74611. "adcs r5, r5, r6\n\t"
  74612. #elif defined(__clang__)
  74613. "adcs r5, r6\n\t"
  74614. #else
  74615. "adc r5, r6\n\t"
  74616. #endif
  74617. "# r * div - Done\n\t"
  74618. "mov %[d1], r8\n\t"
  74619. "mov r6, r9\n\t"
  74620. #ifdef WOLFSSL_KEIL
  74621. "subs r4, %[d1], r4\n\t"
  74622. #else
  74623. #ifdef __clang__
  74624. "subs r4, %[d1], r4\n\t"
  74625. #else
  74626. "sub r4, %[d1], r4\n\t"
  74627. #endif
  74628. #endif
  74629. #ifdef WOLFSSL_KEIL
  74630. "sbcs r6, r6, r5\n\t"
  74631. #elif defined(__clang__)
  74632. "sbcs r6, r5\n\t"
  74633. #else
  74634. "sbc r6, r5\n\t"
  74635. #endif
  74636. "movs r5, r6\n\t"
  74637. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74638. "adds r3, r3, r5\n\t"
  74639. #else
  74640. "add r3, r3, r5\n\t"
  74641. #endif
  74642. "# r * div - Start\n\t"
  74643. "uxth %[d1], r3\n\t"
  74644. "uxth r4, %[div]\n\t"
  74645. #ifdef WOLFSSL_KEIL
  74646. "muls r4, %[d1], r4\n\t"
  74647. #elif defined(__clang__)
  74648. "muls r4, %[d1]\n\t"
  74649. #else
  74650. "mul r4, %[d1]\n\t"
  74651. #endif
  74652. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74653. "lsrs r6, %[div], #16\n\t"
  74654. #else
  74655. "lsr r6, %[div], #16\n\t"
  74656. #endif
  74657. #ifdef WOLFSSL_KEIL
  74658. "muls %[d1], r6, %[d1]\n\t"
  74659. #elif defined(__clang__)
  74660. "muls %[d1], r6\n\t"
  74661. #else
  74662. "mul %[d1], r6\n\t"
  74663. #endif
  74664. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74665. "lsrs r5, %[d1], #16\n\t"
  74666. #else
  74667. "lsr r5, %[d1], #16\n\t"
  74668. #endif
  74669. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74670. "lsls %[d1], %[d1], #16\n\t"
  74671. #else
  74672. "lsl %[d1], %[d1], #16\n\t"
  74673. #endif
  74674. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74675. "adds r4, r4, %[d1]\n\t"
  74676. #else
  74677. "add r4, r4, %[d1]\n\t"
  74678. #endif
  74679. #ifdef WOLFSSL_KEIL
  74680. "adcs r5, r5, r7\n\t"
  74681. #elif defined(__clang__)
  74682. "adcs r5, r7\n\t"
  74683. #else
  74684. "adc r5, r7\n\t"
  74685. #endif
  74686. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74687. "lsrs %[d1], r3, #16\n\t"
  74688. #else
  74689. "lsr %[d1], r3, #16\n\t"
  74690. #endif
  74691. #ifdef WOLFSSL_KEIL
  74692. "muls r6, %[d1], r6\n\t"
  74693. #elif defined(__clang__)
  74694. "muls r6, %[d1]\n\t"
  74695. #else
  74696. "mul r6, %[d1]\n\t"
  74697. #endif
  74698. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74699. "adds r5, r5, r6\n\t"
  74700. #else
  74701. "add r5, r5, r6\n\t"
  74702. #endif
  74703. "uxth r6, %[div]\n\t"
  74704. #ifdef WOLFSSL_KEIL
  74705. "muls %[d1], r6, %[d1]\n\t"
  74706. #elif defined(__clang__)
  74707. "muls %[d1], r6\n\t"
  74708. #else
  74709. "mul %[d1], r6\n\t"
  74710. #endif
  74711. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74712. "lsrs r6, %[d1], #16\n\t"
  74713. #else
  74714. "lsr r6, %[d1], #16\n\t"
  74715. #endif
  74716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74717. "lsls %[d1], %[d1], #16\n\t"
  74718. #else
  74719. "lsl %[d1], %[d1], #16\n\t"
  74720. #endif
  74721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74722. "adds r4, r4, %[d1]\n\t"
  74723. #else
  74724. "add r4, r4, %[d1]\n\t"
  74725. #endif
  74726. #ifdef WOLFSSL_KEIL
  74727. "adcs r5, r5, r6\n\t"
  74728. #elif defined(__clang__)
  74729. "adcs r5, r6\n\t"
  74730. #else
  74731. "adc r5, r6\n\t"
  74732. #endif
  74733. "# r * div - Done\n\t"
  74734. "mov %[d1], r8\n\t"
  74735. "mov r6, r9\n\t"
  74736. #ifdef WOLFSSL_KEIL
  74737. "subs r4, %[d1], r4\n\t"
  74738. #else
  74739. #ifdef __clang__
  74740. "subs r4, %[d1], r4\n\t"
  74741. #else
  74742. "sub r4, %[d1], r4\n\t"
  74743. #endif
  74744. #endif
  74745. #ifdef WOLFSSL_KEIL
  74746. "sbcs r6, r6, r5\n\t"
  74747. #elif defined(__clang__)
  74748. "sbcs r6, r5\n\t"
  74749. #else
  74750. "sbc r6, r5\n\t"
  74751. #endif
  74752. "movs r5, r6\n\t"
  74753. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74754. "adds r3, r3, r5\n\t"
  74755. #else
  74756. "add r3, r3, r5\n\t"
  74757. #endif
  74758. "# r * div - Start\n\t"
  74759. "uxth %[d1], r3\n\t"
  74760. "uxth r4, %[div]\n\t"
  74761. #ifdef WOLFSSL_KEIL
  74762. "muls r4, %[d1], r4\n\t"
  74763. #elif defined(__clang__)
  74764. "muls r4, %[d1]\n\t"
  74765. #else
  74766. "mul r4, %[d1]\n\t"
  74767. #endif
  74768. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74769. "lsrs r6, %[div], #16\n\t"
  74770. #else
  74771. "lsr r6, %[div], #16\n\t"
  74772. #endif
  74773. #ifdef WOLFSSL_KEIL
  74774. "muls %[d1], r6, %[d1]\n\t"
  74775. #elif defined(__clang__)
  74776. "muls %[d1], r6\n\t"
  74777. #else
  74778. "mul %[d1], r6\n\t"
  74779. #endif
  74780. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74781. "lsrs r5, %[d1], #16\n\t"
  74782. #else
  74783. "lsr r5, %[d1], #16\n\t"
  74784. #endif
  74785. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74786. "lsls %[d1], %[d1], #16\n\t"
  74787. #else
  74788. "lsl %[d1], %[d1], #16\n\t"
  74789. #endif
  74790. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74791. "adds r4, r4, %[d1]\n\t"
  74792. #else
  74793. "add r4, r4, %[d1]\n\t"
  74794. #endif
  74795. #ifdef WOLFSSL_KEIL
  74796. "adcs r5, r5, r7\n\t"
  74797. #elif defined(__clang__)
  74798. "adcs r5, r7\n\t"
  74799. #else
  74800. "adc r5, r7\n\t"
  74801. #endif
  74802. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74803. "lsrs %[d1], r3, #16\n\t"
  74804. #else
  74805. "lsr %[d1], r3, #16\n\t"
  74806. #endif
  74807. #ifdef WOLFSSL_KEIL
  74808. "muls r6, %[d1], r6\n\t"
  74809. #elif defined(__clang__)
  74810. "muls r6, %[d1]\n\t"
  74811. #else
  74812. "mul r6, %[d1]\n\t"
  74813. #endif
  74814. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74815. "adds r5, r5, r6\n\t"
  74816. #else
  74817. "add r5, r5, r6\n\t"
  74818. #endif
  74819. "uxth r6, %[div]\n\t"
  74820. #ifdef WOLFSSL_KEIL
  74821. "muls %[d1], r6, %[d1]\n\t"
  74822. #elif defined(__clang__)
  74823. "muls %[d1], r6\n\t"
  74824. #else
  74825. "mul %[d1], r6\n\t"
  74826. #endif
  74827. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74828. "lsrs r6, %[d1], #16\n\t"
  74829. #else
  74830. "lsr r6, %[d1], #16\n\t"
  74831. #endif
  74832. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74833. "lsls %[d1], %[d1], #16\n\t"
  74834. #else
  74835. "lsl %[d1], %[d1], #16\n\t"
  74836. #endif
  74837. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74838. "adds r4, r4, %[d1]\n\t"
  74839. #else
  74840. "add r4, r4, %[d1]\n\t"
  74841. #endif
  74842. #ifdef WOLFSSL_KEIL
  74843. "adcs r5, r5, r6\n\t"
  74844. #elif defined(__clang__)
  74845. "adcs r5, r6\n\t"
  74846. #else
  74847. "adc r5, r6\n\t"
  74848. #endif
  74849. "# r * div - Done\n\t"
  74850. "mov %[d1], r8\n\t"
  74851. "mov r6, r9\n\t"
  74852. #ifdef WOLFSSL_KEIL
  74853. "subs r4, %[d1], r4\n\t"
  74854. #else
  74855. #ifdef __clang__
  74856. "subs r4, %[d1], r4\n\t"
  74857. #else
  74858. "sub r4, %[d1], r4\n\t"
  74859. #endif
  74860. #endif
  74861. #ifdef WOLFSSL_KEIL
  74862. "sbcs r6, r6, r5\n\t"
  74863. #elif defined(__clang__)
  74864. "sbcs r6, r5\n\t"
  74865. #else
  74866. "sbc r6, r5\n\t"
  74867. #endif
  74868. "movs r5, r6\n\t"
  74869. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74870. "adds r3, r3, r5\n\t"
  74871. #else
  74872. "add r3, r3, r5\n\t"
  74873. #endif
  74874. "movs r6, %[div]\n\t"
  74875. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74876. "subs r6, r6, r4\n\t"
  74877. #else
  74878. "sub r6, r6, r4\n\t"
  74879. #endif
  74880. #ifdef WOLFSSL_KEIL
  74881. "sbcs r6, r6, r6\n\t"
  74882. #elif defined(__clang__)
  74883. "sbcs r6, r6\n\t"
  74884. #else
  74885. "sbc r6, r6\n\t"
  74886. #endif
  74887. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74888. "subs r3, r3, r6\n\t"
  74889. #else
  74890. "sub r3, r3, r6\n\t"
  74891. #endif
  74892. "movs %[d1], r3\n\t"
  74893. : [d1] "+l" (d1), [d0] "+l" (d0), [div] "+l" (div)
  74894. :
  74895. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  74896. );
  74897. return (uint32_t)(size_t)d1;
  74898. }
  74899. /* Compare a with b in constant time.
  74900. *
  74901. * a A single precision integer.
  74902. * b A single precision integer.
  74903. * return -ve, 0 or +ve if a is less than, equal to or greater than b
  74904. * respectively.
  74905. */
  74906. SP_NOINLINE static sp_int32 sp_3072_cmp_48(const sp_digit* a, const sp_digit* b)
  74907. {
  74908. __asm__ __volatile__ (
  74909. "movs r2, #0\n\t"
  74910. "movs r3, #0\n\t"
  74911. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74912. "mvns r3, r3\n\t"
  74913. #else
  74914. "mvn r3, r3\n\t"
  74915. #endif
  74916. "movs r6, #0xbc\n\t"
  74917. "\n"
  74918. "L_sp_3072_cmp_48_words_%=:\n\t"
  74919. "ldr r7, [%[a], r6]\n\t"
  74920. "ldr r5, [%[b], r6]\n\t"
  74921. #ifdef WOLFSSL_KEIL
  74922. "ands r7, r7, r3\n\t"
  74923. #elif defined(__clang__)
  74924. "ands r7, r3\n\t"
  74925. #else
  74926. "and r7, r3\n\t"
  74927. #endif
  74928. #ifdef WOLFSSL_KEIL
  74929. "ands r5, r5, r3\n\t"
  74930. #elif defined(__clang__)
  74931. "ands r5, r3\n\t"
  74932. #else
  74933. "and r5, r3\n\t"
  74934. #endif
  74935. "movs r4, r7\n\t"
  74936. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74937. "subs r7, r7, r5\n\t"
  74938. #else
  74939. "sub r7, r7, r5\n\t"
  74940. #endif
  74941. #ifdef WOLFSSL_KEIL
  74942. "sbcs r7, r7, r7\n\t"
  74943. #elif defined(__clang__)
  74944. "sbcs r7, r7\n\t"
  74945. #else
  74946. "sbc r7, r7\n\t"
  74947. #endif
  74948. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74949. "adds r2, r2, r7\n\t"
  74950. #else
  74951. "add r2, r2, r7\n\t"
  74952. #endif
  74953. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74954. "mvns r7, r7\n\t"
  74955. #else
  74956. "mvn r7, r7\n\t"
  74957. #endif
  74958. #ifdef WOLFSSL_KEIL
  74959. "ands r3, r3, r7\n\t"
  74960. #elif defined(__clang__)
  74961. "ands r3, r7\n\t"
  74962. #else
  74963. "and r3, r7\n\t"
  74964. #endif
  74965. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74966. "subs r5, r5, r4\n\t"
  74967. #else
  74968. "sub r5, r5, r4\n\t"
  74969. #endif
  74970. #ifdef WOLFSSL_KEIL
  74971. "sbcs r7, r7, r7\n\t"
  74972. #elif defined(__clang__)
  74973. "sbcs r7, r7\n\t"
  74974. #else
  74975. "sbc r7, r7\n\t"
  74976. #endif
  74977. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74978. "subs r2, r2, r7\n\t"
  74979. #else
  74980. "sub r2, r2, r7\n\t"
  74981. #endif
  74982. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74983. "mvns r7, r7\n\t"
  74984. #else
  74985. "mvn r7, r7\n\t"
  74986. #endif
  74987. #ifdef WOLFSSL_KEIL
  74988. "ands r3, r3, r7\n\t"
  74989. #elif defined(__clang__)
  74990. "ands r3, r7\n\t"
  74991. #else
  74992. "and r3, r7\n\t"
  74993. #endif
  74994. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74995. "subs r6, r6, #4\n\t"
  74996. #else
  74997. "sub r6, r6, #4\n\t"
  74998. #endif
  74999. "bge L_sp_3072_cmp_48_words_%=\n\t"
  75000. "movs %[a], r2\n\t"
  75001. : [a] "+l" (a), [b] "+l" (b)
  75002. :
  75003. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  75004. );
  75005. return (uint32_t)(size_t)a;
  75006. }
  75007. /* Divide d in a and put remainder into r (m*d + r = a)
  75008. * m is not calculated as it is not needed at this time.
  75009. *
  75010. * a Number to be divided.
  75011. * d Number to divide with.
  75012. * m Multiplier result.
  75013. * r Remainder from the division.
  75014. * returns MP_OKAY indicating success.
  75015. */
  75016. static WC_INLINE int sp_3072_div_48(const sp_digit* a, const sp_digit* d, sp_digit* m,
  75017. sp_digit* r)
  75018. {
  75019. sp_digit t1[96], t2[49];
  75020. sp_digit div, r1;
  75021. int i;
  75022. (void)m;
  75023. div = d[47];
  75024. XMEMCPY(t1, a, sizeof(*t1) * 2 * 48);
  75025. r1 = sp_3072_cmp_48(&t1[48], d) >= 0;
  75026. sp_3072_cond_sub_48(&t1[48], &t1[48], d, (sp_digit)0 - r1);
  75027. for (i = 47; i >= 0; i--) {
  75028. volatile sp_digit mask = (sp_digit)0 - (t1[48 + i] == div);
  75029. sp_digit hi = t1[48 + i] + mask;
  75030. r1 = div_3072_word_48(hi, t1[48 + i - 1], div);
  75031. r1 |= mask;
  75032. sp_3072_mul_d_48(t2, d, r1);
  75033. t1[48 + i] += sp_3072_sub_in_place_48(&t1[i], t2);
  75034. t1[48 + i] -= t2[48];
  75035. sp_3072_mask_48(t2, d, t1[48 + i]);
  75036. t1[48 + i] += sp_3072_add_48(&t1[i], &t1[i], t2);
  75037. sp_3072_mask_48(t2, d, t1[48 + i]);
  75038. t1[48 + i] += sp_3072_add_48(&t1[i], &t1[i], t2);
  75039. }
  75040. r1 = sp_3072_cmp_48(t1, d) >= 0;
  75041. sp_3072_cond_sub_48(r, t1, d, (sp_digit)0 - r1);
  75042. return MP_OKAY;
  75043. }
  75044. /* Reduce a modulo m into r. (r = a mod m)
  75045. *
  75046. * r A single precision number that is the reduced result.
  75047. * a A single precision number that is to be reduced.
  75048. * m A single precision number that is the modulus to reduce with.
  75049. * returns MP_OKAY indicating success.
  75050. */
  75051. static WC_INLINE int sp_3072_mod_48(sp_digit* r, const sp_digit* a, const sp_digit* m)
  75052. {
  75053. int ret;
  75054. ret = sp_3072_div_48(a, m, NULL, r);
  75055. return ret;
  75056. }
  75057. #ifdef WOLFSSL_SP_SMALL
  75058. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  75059. *
  75060. * r A single precision number that is the result of the operation.
  75061. * a A single precision number being exponentiated.
  75062. * e A single precision number that is the exponent.
  75063. * bits The number of bits in the exponent.
  75064. * m A single precision number that is the modulus.
  75065. * returns 0 on success.
  75066. * returns MEMORY_E on dynamic memory allocation failure.
  75067. * returns MP_VAL when base is even or exponent is 0.
  75068. */
  75069. static int sp_3072_mod_exp_48(sp_digit* r, const sp_digit* a, const sp_digit* e,
  75070. int bits, const sp_digit* m, int reduceA)
  75071. {
  75072. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  75073. sp_digit* td = NULL;
  75074. #else
  75075. sp_digit td[16 * 96];
  75076. #endif
  75077. sp_digit* t[16];
  75078. sp_digit* norm = NULL;
  75079. sp_digit mp = 1;
  75080. sp_digit n;
  75081. sp_digit mask;
  75082. int i;
  75083. int c;
  75084. byte y;
  75085. int err = MP_OKAY;
  75086. if (bits == 0) {
  75087. err = MP_VAL;
  75088. }
  75089. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  75090. if (err == MP_OKAY) {
  75091. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (16 * 96), NULL,
  75092. DYNAMIC_TYPE_TMP_BUFFER);
  75093. if (td == NULL)
  75094. err = MEMORY_E;
  75095. }
  75096. #endif
  75097. if (err == MP_OKAY) {
  75098. norm = td;
  75099. for (i=0; i<16; i++) {
  75100. t[i] = td + i * 96;
  75101. }
  75102. sp_3072_mont_setup(m, &mp);
  75103. sp_3072_mont_norm_48(norm, m);
  75104. XMEMSET(t[1], 0, sizeof(sp_digit) * 48U);
  75105. if (reduceA != 0) {
  75106. err = sp_3072_mod_48(t[1] + 48, a, m);
  75107. if (err == MP_OKAY) {
  75108. err = sp_3072_mod_48(t[1], t[1], m);
  75109. }
  75110. }
  75111. else {
  75112. XMEMCPY(t[1] + 48, a, sizeof(sp_digit) * 48);
  75113. err = sp_3072_mod_48(t[1], t[1], m);
  75114. }
  75115. }
  75116. if (err == MP_OKAY) {
  75117. sp_3072_mont_sqr_48(t[ 2], t[ 1], m, mp);
  75118. sp_3072_mont_mul_48(t[ 3], t[ 2], t[ 1], m, mp);
  75119. sp_3072_mont_sqr_48(t[ 4], t[ 2], m, mp);
  75120. sp_3072_mont_mul_48(t[ 5], t[ 3], t[ 2], m, mp);
  75121. sp_3072_mont_sqr_48(t[ 6], t[ 3], m, mp);
  75122. sp_3072_mont_mul_48(t[ 7], t[ 4], t[ 3], m, mp);
  75123. sp_3072_mont_sqr_48(t[ 8], t[ 4], m, mp);
  75124. sp_3072_mont_mul_48(t[ 9], t[ 5], t[ 4], m, mp);
  75125. sp_3072_mont_sqr_48(t[10], t[ 5], m, mp);
  75126. sp_3072_mont_mul_48(t[11], t[ 6], t[ 5], m, mp);
  75127. sp_3072_mont_sqr_48(t[12], t[ 6], m, mp);
  75128. sp_3072_mont_mul_48(t[13], t[ 7], t[ 6], m, mp);
  75129. sp_3072_mont_sqr_48(t[14], t[ 7], m, mp);
  75130. sp_3072_mont_mul_48(t[15], t[ 8], t[ 7], m, mp);
  75131. i = (bits - 1) / 32;
  75132. n = e[i--];
  75133. c = bits & 31;
  75134. if (c == 0) {
  75135. c = 32;
  75136. }
  75137. c -= bits % 4;
  75138. if (c == 32) {
  75139. c = 28;
  75140. }
  75141. if (c < 0) {
  75142. /* Number of bits in top word is less than number needed. */
  75143. c = -c;
  75144. y = (byte)(n << c);
  75145. n = e[i--];
  75146. y |= (byte)(n >> (64 - c));
  75147. n <<= c;
  75148. c = 64 - c;
  75149. }
  75150. else if (c == 0) {
  75151. /* All bits in top word used. */
  75152. y = (byte)n;
  75153. }
  75154. else {
  75155. y = (byte)(n >> c);
  75156. n <<= 32 - c;
  75157. }
  75158. XMEMCPY(r, t[y], sizeof(sp_digit) * 48);
  75159. for (; i>=0 || c>=4; ) {
  75160. if (c == 0) {
  75161. n = e[i--];
  75162. y = (byte)(n >> 28);
  75163. n <<= 4;
  75164. c = 28;
  75165. }
  75166. else if (c < 4) {
  75167. y = (byte)(n >> 28);
  75168. n = e[i--];
  75169. c = 4 - c;
  75170. y |= (byte)(n >> (32 - c));
  75171. n <<= c;
  75172. c = 32 - c;
  75173. }
  75174. else {
  75175. y = (byte)((n >> 28) & 0xf);
  75176. n <<= 4;
  75177. c -= 4;
  75178. }
  75179. sp_3072_mont_sqr_48(r, r, m, mp);
  75180. sp_3072_mont_sqr_48(r, r, m, mp);
  75181. sp_3072_mont_sqr_48(r, r, m, mp);
  75182. sp_3072_mont_sqr_48(r, r, m, mp);
  75183. sp_3072_mont_mul_48(r, r, t[y], m, mp);
  75184. }
  75185. XMEMSET(&r[48], 0, sizeof(sp_digit) * 48U);
  75186. sp_3072_mont_reduce_48(r, m, mp);
  75187. mask = 0 - (sp_3072_cmp_48(r, m) >= 0);
  75188. sp_3072_cond_sub_48(r, r, m, mask);
  75189. }
  75190. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  75191. if (td != NULL)
  75192. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  75193. #endif
  75194. return err;
  75195. }
  75196. #else
  75197. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  75198. *
  75199. * r A single precision number that is the result of the operation.
  75200. * a A single precision number being exponentiated.
  75201. * e A single precision number that is the exponent.
  75202. * bits The number of bits in the exponent.
  75203. * m A single precision number that is the modulus.
  75204. * returns 0 on success.
  75205. * returns MEMORY_E on dynamic memory allocation failure.
  75206. * returns MP_VAL when base is even or exponent is 0.
  75207. */
  75208. static int sp_3072_mod_exp_48(sp_digit* r, const sp_digit* a, const sp_digit* e,
  75209. int bits, const sp_digit* m, int reduceA)
  75210. {
  75211. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  75212. sp_digit* td = NULL;
  75213. #else
  75214. sp_digit td[32 * 96];
  75215. #endif
  75216. sp_digit* t[32];
  75217. sp_digit* norm = NULL;
  75218. sp_digit mp = 1;
  75219. sp_digit n;
  75220. sp_digit mask;
  75221. int i;
  75222. int c;
  75223. byte y;
  75224. int err = MP_OKAY;
  75225. if (bits == 0) {
  75226. err = MP_VAL;
  75227. }
  75228. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  75229. if (err == MP_OKAY) {
  75230. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (32 * 96), NULL,
  75231. DYNAMIC_TYPE_TMP_BUFFER);
  75232. if (td == NULL)
  75233. err = MEMORY_E;
  75234. }
  75235. #endif
  75236. if (err == MP_OKAY) {
  75237. norm = td;
  75238. for (i=0; i<32; i++) {
  75239. t[i] = td + i * 96;
  75240. }
  75241. sp_3072_mont_setup(m, &mp);
  75242. sp_3072_mont_norm_48(norm, m);
  75243. XMEMSET(t[1], 0, sizeof(sp_digit) * 48U);
  75244. if (reduceA != 0) {
  75245. err = sp_3072_mod_48(t[1] + 48, a, m);
  75246. if (err == MP_OKAY) {
  75247. err = sp_3072_mod_48(t[1], t[1], m);
  75248. }
  75249. }
  75250. else {
  75251. XMEMCPY(t[1] + 48, a, sizeof(sp_digit) * 48);
  75252. err = sp_3072_mod_48(t[1], t[1], m);
  75253. }
  75254. }
  75255. if (err == MP_OKAY) {
  75256. sp_3072_mont_sqr_48(t[ 2], t[ 1], m, mp);
  75257. sp_3072_mont_mul_48(t[ 3], t[ 2], t[ 1], m, mp);
  75258. sp_3072_mont_sqr_48(t[ 4], t[ 2], m, mp);
  75259. sp_3072_mont_mul_48(t[ 5], t[ 3], t[ 2], m, mp);
  75260. sp_3072_mont_sqr_48(t[ 6], t[ 3], m, mp);
  75261. sp_3072_mont_mul_48(t[ 7], t[ 4], t[ 3], m, mp);
  75262. sp_3072_mont_sqr_48(t[ 8], t[ 4], m, mp);
  75263. sp_3072_mont_mul_48(t[ 9], t[ 5], t[ 4], m, mp);
  75264. sp_3072_mont_sqr_48(t[10], t[ 5], m, mp);
  75265. sp_3072_mont_mul_48(t[11], t[ 6], t[ 5], m, mp);
  75266. sp_3072_mont_sqr_48(t[12], t[ 6], m, mp);
  75267. sp_3072_mont_mul_48(t[13], t[ 7], t[ 6], m, mp);
  75268. sp_3072_mont_sqr_48(t[14], t[ 7], m, mp);
  75269. sp_3072_mont_mul_48(t[15], t[ 8], t[ 7], m, mp);
  75270. sp_3072_mont_sqr_48(t[16], t[ 8], m, mp);
  75271. sp_3072_mont_mul_48(t[17], t[ 9], t[ 8], m, mp);
  75272. sp_3072_mont_sqr_48(t[18], t[ 9], m, mp);
  75273. sp_3072_mont_mul_48(t[19], t[10], t[ 9], m, mp);
  75274. sp_3072_mont_sqr_48(t[20], t[10], m, mp);
  75275. sp_3072_mont_mul_48(t[21], t[11], t[10], m, mp);
  75276. sp_3072_mont_sqr_48(t[22], t[11], m, mp);
  75277. sp_3072_mont_mul_48(t[23], t[12], t[11], m, mp);
  75278. sp_3072_mont_sqr_48(t[24], t[12], m, mp);
  75279. sp_3072_mont_mul_48(t[25], t[13], t[12], m, mp);
  75280. sp_3072_mont_sqr_48(t[26], t[13], m, mp);
  75281. sp_3072_mont_mul_48(t[27], t[14], t[13], m, mp);
  75282. sp_3072_mont_sqr_48(t[28], t[14], m, mp);
  75283. sp_3072_mont_mul_48(t[29], t[15], t[14], m, mp);
  75284. sp_3072_mont_sqr_48(t[30], t[15], m, mp);
  75285. sp_3072_mont_mul_48(t[31], t[16], t[15], m, mp);
  75286. i = (bits - 1) / 32;
  75287. n = e[i--];
  75288. c = bits & 31;
  75289. if (c == 0) {
  75290. c = 32;
  75291. }
  75292. c -= bits % 5;
  75293. if (c == 32) {
  75294. c = 27;
  75295. }
  75296. if (c < 0) {
  75297. /* Number of bits in top word is less than number needed. */
  75298. c = -c;
  75299. y = (byte)(n << c);
  75300. n = e[i--];
  75301. y |= (byte)(n >> (64 - c));
  75302. n <<= c;
  75303. c = 64 - c;
  75304. }
  75305. else if (c == 0) {
  75306. /* All bits in top word used. */
  75307. y = (byte)n;
  75308. }
  75309. else {
  75310. y = (byte)(n >> c);
  75311. n <<= 32 - c;
  75312. }
  75313. XMEMCPY(r, t[y], sizeof(sp_digit) * 48);
  75314. for (; i>=0 || c>=5; ) {
  75315. if (c == 0) {
  75316. n = e[i--];
  75317. y = (byte)(n >> 27);
  75318. n <<= 5;
  75319. c = 27;
  75320. }
  75321. else if (c < 5) {
  75322. y = (byte)(n >> 27);
  75323. n = e[i--];
  75324. c = 5 - c;
  75325. y |= (byte)(n >> (32 - c));
  75326. n <<= c;
  75327. c = 32 - c;
  75328. }
  75329. else {
  75330. y = (byte)((n >> 27) & 0x1f);
  75331. n <<= 5;
  75332. c -= 5;
  75333. }
  75334. sp_3072_mont_sqr_48(r, r, m, mp);
  75335. sp_3072_mont_sqr_48(r, r, m, mp);
  75336. sp_3072_mont_sqr_48(r, r, m, mp);
  75337. sp_3072_mont_sqr_48(r, r, m, mp);
  75338. sp_3072_mont_sqr_48(r, r, m, mp);
  75339. sp_3072_mont_mul_48(r, r, t[y], m, mp);
  75340. }
  75341. XMEMSET(&r[48], 0, sizeof(sp_digit) * 48U);
  75342. sp_3072_mont_reduce_48(r, m, mp);
  75343. mask = 0 - (sp_3072_cmp_48(r, m) >= 0);
  75344. sp_3072_cond_sub_48(r, r, m, mask);
  75345. }
  75346. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  75347. if (td != NULL)
  75348. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  75349. #endif
  75350. return err;
  75351. }
  75352. #endif /* WOLFSSL_SP_SMALL */
  75353. #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */
  75354. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  75355. /* r = 2^n mod m where n is the number of bits to reduce by.
  75356. * Given m must be 3072 bits, just need to subtract.
  75357. *
  75358. * r A single precision number.
  75359. * m A single precision number.
  75360. */
  75361. static void sp_3072_mont_norm_96(sp_digit* r, const sp_digit* m)
  75362. {
  75363. XMEMSET(r, 0, sizeof(sp_digit) * 96);
  75364. /* r = 2^n mod m */
  75365. sp_3072_sub_in_place_96(r, m);
  75366. }
  75367. #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */
  75368. /* Conditionally subtract b from a using the mask m.
  75369. * m is -1 to subtract and 0 when not copying.
  75370. *
  75371. * r A single precision number representing condition subtract result.
  75372. * a A single precision number to subtract from.
  75373. * b A single precision number to subtract.
  75374. * m Mask value to apply.
  75375. */
  75376. SP_NOINLINE static sp_digit sp_3072_cond_sub_96(sp_digit* r, const sp_digit* a,
  75377. const sp_digit* b, sp_digit m)
  75378. {
  75379. __asm__ __volatile__ (
  75380. "movs r4, #0\n\t"
  75381. "movs r5, #0xff\n\t"
  75382. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75383. "adds r5, r5, #0x81\n\t"
  75384. #else
  75385. "add r5, r5, #0x81\n\t"
  75386. #endif
  75387. "mov r8, r5\n\t"
  75388. "movs r7, #0\n\t"
  75389. "\n"
  75390. "L_sp_3072_cond_sub_96_words_%=:\n\t"
  75391. "ldr r6, [%[b], r7]\n\t"
  75392. #ifdef WOLFSSL_KEIL
  75393. "ands r6, r6, %[m]\n\t"
  75394. #elif defined(__clang__)
  75395. "ands r6, %[m]\n\t"
  75396. #else
  75397. "and r6, %[m]\n\t"
  75398. #endif
  75399. "movs r5, #0\n\t"
  75400. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75401. "subs r5, r5, r4\n\t"
  75402. #else
  75403. "sub r5, r5, r4\n\t"
  75404. #endif
  75405. "ldr r5, [%[a], r7]\n\t"
  75406. #ifdef WOLFSSL_KEIL
  75407. "sbcs r5, r5, r6\n\t"
  75408. #elif defined(__clang__)
  75409. "sbcs r5, r6\n\t"
  75410. #else
  75411. "sbc r5, r6\n\t"
  75412. #endif
  75413. #ifdef WOLFSSL_KEIL
  75414. "sbcs r4, r4, r4\n\t"
  75415. #elif defined(__clang__)
  75416. "sbcs r4, r4\n\t"
  75417. #else
  75418. "sbc r4, r4\n\t"
  75419. #endif
  75420. "str r5, [%[r], r7]\n\t"
  75421. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75422. "adds r7, r7, #4\n\t"
  75423. #else
  75424. "add r7, r7, #4\n\t"
  75425. #endif
  75426. "cmp r7, r8\n\t"
  75427. "blt L_sp_3072_cond_sub_96_words_%=\n\t"
  75428. "movs %[r], r4\n\t"
  75429. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m)
  75430. :
  75431. : "memory", "r4", "r5", "r6", "r7", "r8"
  75432. );
  75433. return (uint32_t)(size_t)r;
  75434. }
  75435. /* Reduce the number back to 3072 bits using Montgomery reduction.
  75436. *
  75437. * a A single precision number to reduce in place.
  75438. * m The single precision number representing the modulus.
  75439. * mp The digit representing the negative inverse of m mod 2^n.
  75440. */
  75441. SP_NOINLINE static void sp_3072_mont_reduce_96(sp_digit* a, const sp_digit* m,
  75442. sp_digit mp)
  75443. {
  75444. __asm__ __volatile__ (
  75445. "movs r7, #0\n\t"
  75446. "mov r8, %[mp]\n\t"
  75447. "mov r12, r7\n\t"
  75448. "mov lr, %[m]\n\t"
  75449. "mov r9, %[a]\n\t"
  75450. "mov r11, %[a]\n\t"
  75451. "movs r5, #0xff\n\t"
  75452. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75453. "adds r5, r5, #0x7d\n\t"
  75454. #else
  75455. "add r5, r5, #0x7d\n\t"
  75456. #endif
  75457. "movs r6, #0xff\n\t"
  75458. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75459. "adds r6, r6, #0x81\n\t"
  75460. #else
  75461. "add r6, r6, #0x81\n\t"
  75462. #endif
  75463. "add r9, r9, r5\n\t"
  75464. "add r11, r11, r6\n\t"
  75465. "\n"
  75466. "L_sp_3072_mont_reduce_96_mod_%=:\n\t"
  75467. "movs r7, #0\n\t"
  75468. "movs r4, #0\n\t"
  75469. "# a[i] += m[0] * mu\n\t"
  75470. "ldm %[m]!, {%[mp]}\n\t"
  75471. "ldm %[a]!, {r3}\n\t"
  75472. "# mu = a[i] * mp\n\t"
  75473. "mov r5, r8\n\t"
  75474. #ifdef WOLFSSL_KEIL
  75475. "muls r5, r3, r5\n\t"
  75476. #elif defined(__clang__)
  75477. "muls r5, r3\n\t"
  75478. #else
  75479. "mul r5, r3\n\t"
  75480. #endif
  75481. "mov r10, r5\n\t"
  75482. "# Multiply m[0] and mu - Start\n\t"
  75483. "mov r5, r10\n\t"
  75484. "uxth r6, %[mp]\n\t"
  75485. "uxth r5, r5\n\t"
  75486. #ifdef WOLFSSL_KEIL
  75487. "muls r6, r5, r6\n\t"
  75488. #elif defined(__clang__)
  75489. "muls r6, r5\n\t"
  75490. #else
  75491. "mul r6, r5\n\t"
  75492. #endif
  75493. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75494. "adds r3, r3, r6\n\t"
  75495. #else
  75496. "add r3, r3, r6\n\t"
  75497. #endif
  75498. #ifdef WOLFSSL_KEIL
  75499. "adcs r4, r4, r7\n\t"
  75500. #elif defined(__clang__)
  75501. "adcs r4, r7\n\t"
  75502. #else
  75503. "adc r4, r7\n\t"
  75504. #endif
  75505. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75506. "lsrs r6, %[mp], #16\n\t"
  75507. #else
  75508. "lsr r6, %[mp], #16\n\t"
  75509. #endif
  75510. #ifdef WOLFSSL_KEIL
  75511. "muls r5, r6, r5\n\t"
  75512. #elif defined(__clang__)
  75513. "muls r5, r6\n\t"
  75514. #else
  75515. "mul r5, r6\n\t"
  75516. #endif
  75517. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75518. "lsrs r6, r5, #16\n\t"
  75519. #else
  75520. "lsr r6, r5, #16\n\t"
  75521. #endif
  75522. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75523. "lsls r5, r5, #16\n\t"
  75524. #else
  75525. "lsl r5, r5, #16\n\t"
  75526. #endif
  75527. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75528. "adds r3, r3, r5\n\t"
  75529. #else
  75530. "add r3, r3, r5\n\t"
  75531. #endif
  75532. #ifdef WOLFSSL_KEIL
  75533. "adcs r4, r4, r6\n\t"
  75534. #elif defined(__clang__)
  75535. "adcs r4, r6\n\t"
  75536. #else
  75537. "adc r4, r6\n\t"
  75538. #endif
  75539. "mov r5, r10\n\t"
  75540. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75541. "lsrs r6, %[mp], #16\n\t"
  75542. #else
  75543. "lsr r6, %[mp], #16\n\t"
  75544. #endif
  75545. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75546. "lsrs r5, r5, #16\n\t"
  75547. #else
  75548. "lsr r5, r5, #16\n\t"
  75549. #endif
  75550. #ifdef WOLFSSL_KEIL
  75551. "muls r6, r5, r6\n\t"
  75552. #elif defined(__clang__)
  75553. "muls r6, r5\n\t"
  75554. #else
  75555. "mul r6, r5\n\t"
  75556. #endif
  75557. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75558. "adds r4, r4, r6\n\t"
  75559. #else
  75560. "add r4, r4, r6\n\t"
  75561. #endif
  75562. "uxth r6, %[mp]\n\t"
  75563. #ifdef WOLFSSL_KEIL
  75564. "muls r5, r6, r5\n\t"
  75565. #elif defined(__clang__)
  75566. "muls r5, r6\n\t"
  75567. #else
  75568. "mul r5, r6\n\t"
  75569. #endif
  75570. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75571. "lsrs r6, r5, #16\n\t"
  75572. #else
  75573. "lsr r6, r5, #16\n\t"
  75574. #endif
  75575. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75576. "lsls r5, r5, #16\n\t"
  75577. #else
  75578. "lsl r5, r5, #16\n\t"
  75579. #endif
  75580. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75581. "adds r3, r3, r5\n\t"
  75582. #else
  75583. "add r3, r3, r5\n\t"
  75584. #endif
  75585. #ifdef WOLFSSL_KEIL
  75586. "adcs r4, r4, r6\n\t"
  75587. #elif defined(__clang__)
  75588. "adcs r4, r6\n\t"
  75589. #else
  75590. "adc r4, r6\n\t"
  75591. #endif
  75592. "# Multiply m[0] and mu - Done\n\t"
  75593. "\n"
  75594. "L_sp_3072_mont_reduce_96_word_%=:\n\t"
  75595. "# a[i+j] += m[j] * mu\n\t"
  75596. "ldr r3, [%[a]]\n\t"
  75597. "ldm %[m]!, {%[mp]}\n\t"
  75598. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75599. "adds r3, r3, r4\n\t"
  75600. #else
  75601. "add r3, r3, r4\n\t"
  75602. #endif
  75603. "movs r4, #0\n\t"
  75604. #ifdef WOLFSSL_KEIL
  75605. "adcs r4, r4, r7\n\t"
  75606. #elif defined(__clang__)
  75607. "adcs r4, r7\n\t"
  75608. #else
  75609. "adc r4, r7\n\t"
  75610. #endif
  75611. "# Multiply m[j] and mu - Start\n\t"
  75612. "mov r5, r10\n\t"
  75613. "uxth r6, %[mp]\n\t"
  75614. "uxth r5, r5\n\t"
  75615. #ifdef WOLFSSL_KEIL
  75616. "muls r6, r5, r6\n\t"
  75617. #elif defined(__clang__)
  75618. "muls r6, r5\n\t"
  75619. #else
  75620. "mul r6, r5\n\t"
  75621. #endif
  75622. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75623. "adds r3, r3, r6\n\t"
  75624. #else
  75625. "add r3, r3, r6\n\t"
  75626. #endif
  75627. #ifdef WOLFSSL_KEIL
  75628. "adcs r4, r4, r7\n\t"
  75629. #elif defined(__clang__)
  75630. "adcs r4, r7\n\t"
  75631. #else
  75632. "adc r4, r7\n\t"
  75633. #endif
  75634. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75635. "lsrs r6, %[mp], #16\n\t"
  75636. #else
  75637. "lsr r6, %[mp], #16\n\t"
  75638. #endif
  75639. #ifdef WOLFSSL_KEIL
  75640. "muls r5, r6, r5\n\t"
  75641. #elif defined(__clang__)
  75642. "muls r5, r6\n\t"
  75643. #else
  75644. "mul r5, r6\n\t"
  75645. #endif
  75646. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75647. "lsrs r6, r5, #16\n\t"
  75648. #else
  75649. "lsr r6, r5, #16\n\t"
  75650. #endif
  75651. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75652. "lsls r5, r5, #16\n\t"
  75653. #else
  75654. "lsl r5, r5, #16\n\t"
  75655. #endif
  75656. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75657. "adds r3, r3, r5\n\t"
  75658. #else
  75659. "add r3, r3, r5\n\t"
  75660. #endif
  75661. #ifdef WOLFSSL_KEIL
  75662. "adcs r4, r4, r6\n\t"
  75663. #elif defined(__clang__)
  75664. "adcs r4, r6\n\t"
  75665. #else
  75666. "adc r4, r6\n\t"
  75667. #endif
  75668. "mov r5, r10\n\t"
  75669. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75670. "lsrs r6, %[mp], #16\n\t"
  75671. #else
  75672. "lsr r6, %[mp], #16\n\t"
  75673. #endif
  75674. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75675. "lsrs r5, r5, #16\n\t"
  75676. #else
  75677. "lsr r5, r5, #16\n\t"
  75678. #endif
  75679. #ifdef WOLFSSL_KEIL
  75680. "muls r6, r5, r6\n\t"
  75681. #elif defined(__clang__)
  75682. "muls r6, r5\n\t"
  75683. #else
  75684. "mul r6, r5\n\t"
  75685. #endif
  75686. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75687. "adds r4, r4, r6\n\t"
  75688. #else
  75689. "add r4, r4, r6\n\t"
  75690. #endif
  75691. "uxth r6, %[mp]\n\t"
  75692. #ifdef WOLFSSL_KEIL
  75693. "muls r5, r6, r5\n\t"
  75694. #elif defined(__clang__)
  75695. "muls r5, r6\n\t"
  75696. #else
  75697. "mul r5, r6\n\t"
  75698. #endif
  75699. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75700. "lsrs r6, r5, #16\n\t"
  75701. #else
  75702. "lsr r6, r5, #16\n\t"
  75703. #endif
  75704. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75705. "lsls r5, r5, #16\n\t"
  75706. #else
  75707. "lsl r5, r5, #16\n\t"
  75708. #endif
  75709. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75710. "adds r3, r3, r5\n\t"
  75711. #else
  75712. "add r3, r3, r5\n\t"
  75713. #endif
  75714. #ifdef WOLFSSL_KEIL
  75715. "adcs r4, r4, r6\n\t"
  75716. #elif defined(__clang__)
  75717. "adcs r4, r6\n\t"
  75718. #else
  75719. "adc r4, r6\n\t"
  75720. #endif
  75721. "# Multiply m[j] and mu - Done\n\t"
  75722. "stm %[a]!, {r3}\n\t"
  75723. "cmp %[a], r9\n\t"
  75724. "blt L_sp_3072_mont_reduce_96_word_%=\n\t"
  75725. "# a[i+95] += m[95] * mu\n\t"
  75726. "ldr %[mp], [%[m]]\n\t"
  75727. "mov r3, r12\n\t"
  75728. "# Multiply m[95] and mu - Start\n\t"
  75729. "mov r5, r10\n\t"
  75730. "uxth r6, %[mp]\n\t"
  75731. "uxth r5, r5\n\t"
  75732. #ifdef WOLFSSL_KEIL
  75733. "muls r6, r5, r6\n\t"
  75734. #elif defined(__clang__)
  75735. "muls r6, r5\n\t"
  75736. #else
  75737. "mul r6, r5\n\t"
  75738. #endif
  75739. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75740. "adds r4, r4, r6\n\t"
  75741. #else
  75742. "add r4, r4, r6\n\t"
  75743. #endif
  75744. #ifdef WOLFSSL_KEIL
  75745. "adcs r3, r3, r7\n\t"
  75746. #elif defined(__clang__)
  75747. "adcs r3, r7\n\t"
  75748. #else
  75749. "adc r3, r7\n\t"
  75750. #endif
  75751. #ifdef WOLFSSL_KEIL
  75752. "adcs r7, r7, r7\n\t"
  75753. #elif defined(__clang__)
  75754. "adcs r7, r7\n\t"
  75755. #else
  75756. "adc r7, r7\n\t"
  75757. #endif
  75758. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75759. "lsrs r6, %[mp], #16\n\t"
  75760. #else
  75761. "lsr r6, %[mp], #16\n\t"
  75762. #endif
  75763. #ifdef WOLFSSL_KEIL
  75764. "muls r5, r6, r5\n\t"
  75765. #elif defined(__clang__)
  75766. "muls r5, r6\n\t"
  75767. #else
  75768. "mul r5, r6\n\t"
  75769. #endif
  75770. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75771. "lsrs r6, r5, #16\n\t"
  75772. #else
  75773. "lsr r6, r5, #16\n\t"
  75774. #endif
  75775. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75776. "lsls r5, r5, #16\n\t"
  75777. #else
  75778. "lsl r5, r5, #16\n\t"
  75779. #endif
  75780. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75781. "adds r4, r4, r5\n\t"
  75782. #else
  75783. "add r4, r4, r5\n\t"
  75784. #endif
  75785. #ifdef WOLFSSL_KEIL
  75786. "adcs r3, r3, r6\n\t"
  75787. #elif defined(__clang__)
  75788. "adcs r3, r6\n\t"
  75789. #else
  75790. "adc r3, r6\n\t"
  75791. #endif
  75792. #ifdef WOLFSSL_KEIL
  75793. "adcs r7, r7, r7\n\t"
  75794. #elif defined(__clang__)
  75795. "adcs r7, r7\n\t"
  75796. #else
  75797. "adc r7, r7\n\t"
  75798. #endif
  75799. "mov r5, r10\n\t"
  75800. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75801. "lsrs r6, %[mp], #16\n\t"
  75802. #else
  75803. "lsr r6, %[mp], #16\n\t"
  75804. #endif
  75805. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75806. "lsrs r5, r5, #16\n\t"
  75807. #else
  75808. "lsr r5, r5, #16\n\t"
  75809. #endif
  75810. #ifdef WOLFSSL_KEIL
  75811. "muls r6, r5, r6\n\t"
  75812. #elif defined(__clang__)
  75813. "muls r6, r5\n\t"
  75814. #else
  75815. "mul r6, r5\n\t"
  75816. #endif
  75817. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75818. "adds r3, r3, r6\n\t"
  75819. #else
  75820. "add r3, r3, r6\n\t"
  75821. #endif
  75822. #ifdef WOLFSSL_KEIL
  75823. "adcs r7, r7, r7\n\t"
  75824. #elif defined(__clang__)
  75825. "adcs r7, r7\n\t"
  75826. #else
  75827. "adc r7, r7\n\t"
  75828. #endif
  75829. "uxth r6, %[mp]\n\t"
  75830. #ifdef WOLFSSL_KEIL
  75831. "muls r5, r6, r5\n\t"
  75832. #elif defined(__clang__)
  75833. "muls r5, r6\n\t"
  75834. #else
  75835. "mul r5, r6\n\t"
  75836. #endif
  75837. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75838. "lsrs r6, r5, #16\n\t"
  75839. #else
  75840. "lsr r6, r5, #16\n\t"
  75841. #endif
  75842. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75843. "lsls r5, r5, #16\n\t"
  75844. #else
  75845. "lsl r5, r5, #16\n\t"
  75846. #endif
  75847. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75848. "adds r4, r4, r5\n\t"
  75849. #else
  75850. "add r4, r4, r5\n\t"
  75851. #endif
  75852. #ifdef WOLFSSL_KEIL
  75853. "adcs r3, r3, r6\n\t"
  75854. #elif defined(__clang__)
  75855. "adcs r3, r6\n\t"
  75856. #else
  75857. "adc r3, r6\n\t"
  75858. #endif
  75859. #ifdef WOLFSSL_KEIL
  75860. "adcs r7, r7, r7\n\t"
  75861. #elif defined(__clang__)
  75862. "adcs r7, r7\n\t"
  75863. #else
  75864. "adc r7, r7\n\t"
  75865. #endif
  75866. "# Multiply m[95] and mu - Done\n\t"
  75867. "ldr r5, [%[a]]\n\t"
  75868. "ldr r6, [%[a], #4]\n\t"
  75869. "movs %[mp], #0\n\t"
  75870. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75871. "adds r5, r5, r4\n\t"
  75872. #else
  75873. "add r5, r5, r4\n\t"
  75874. #endif
  75875. #ifdef WOLFSSL_KEIL
  75876. "adcs r6, r6, r3\n\t"
  75877. #elif defined(__clang__)
  75878. "adcs r6, r3\n\t"
  75879. #else
  75880. "adc r6, r3\n\t"
  75881. #endif
  75882. #ifdef WOLFSSL_KEIL
  75883. "adcs r7, r7, %[mp]\n\t"
  75884. #elif defined(__clang__)
  75885. "adcs r7, %[mp]\n\t"
  75886. #else
  75887. "adc r7, %[mp]\n\t"
  75888. #endif
  75889. "stm %[a]!, {r5, r6}\n\t"
  75890. "# i += 1\n\t"
  75891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75892. "subs %[a], %[a], #4\n\t"
  75893. #else
  75894. "sub %[a], %[a], #4\n\t"
  75895. #endif
  75896. "movs r3, #0xff\n\t"
  75897. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75898. "adds r3, r3, #0x7d\n\t"
  75899. #else
  75900. "add r3, r3, #0x7d\n\t"
  75901. #endif
  75902. "mov r9, %[a]\n\t"
  75903. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75904. "subs %[a], %[a], r3\n\t"
  75905. #else
  75906. "sub %[a], %[a], r3\n\t"
  75907. #endif
  75908. "mov r12, r7\n\t"
  75909. "mov %[m], lr\n\t"
  75910. "cmp r11, %[a]\n\t"
  75911. "bgt L_sp_3072_mont_reduce_96_mod_%=\n\t"
  75912. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75913. "negs r7, r7\n\t"
  75914. #else
  75915. "neg r7, r7\n\t"
  75916. #endif
  75917. "# Subtract masked modulus\n\t"
  75918. "movs r4, #0xff\n\t"
  75919. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75920. "adds r4, r4, #0x81\n\t"
  75921. #else
  75922. "add r4, r4, #0x81\n\t"
  75923. #endif
  75924. "movs %[mp], #0\n\t"
  75925. "movs r3, #0\n\t"
  75926. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75927. "subs %[a], %[a], r4\n\t"
  75928. #else
  75929. "sub %[a], %[a], r4\n\t"
  75930. #endif
  75931. #ifndef WOLFSSL_SP_LARGE_CODE
  75932. "\n"
  75933. "L_sp_3072_mont_reduce_96_sub_mask_%=:\n\t"
  75934. "ldm %[m]!, {r6}\n\t"
  75935. "movs r5, #0\n\t"
  75936. #ifdef WOLFSSL_KEIL
  75937. "ands r6, r6, r7\n\t"
  75938. #elif defined(__clang__)
  75939. "ands r6, r7\n\t"
  75940. #else
  75941. "and r6, r7\n\t"
  75942. #endif
  75943. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75944. "subs r5, r5, %[mp]\n\t"
  75945. #else
  75946. "sub r5, r5, %[mp]\n\t"
  75947. #endif
  75948. "ldr r5, [%[a], r4]\n\t"
  75949. #ifdef WOLFSSL_KEIL
  75950. "sbcs r5, r5, r6\n\t"
  75951. #elif defined(__clang__)
  75952. "sbcs r5, r6\n\t"
  75953. #else
  75954. "sbc r5, r6\n\t"
  75955. #endif
  75956. #ifdef WOLFSSL_KEIL
  75957. "sbcs %[mp], %[mp], %[mp]\n\t"
  75958. #elif defined(__clang__)
  75959. "sbcs %[mp], %[mp]\n\t"
  75960. #else
  75961. "sbc %[mp], %[mp]\n\t"
  75962. #endif
  75963. "stm %[a]!, {r5}\n\t"
  75964. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75965. "adds r3, r3, #4\n\t"
  75966. #else
  75967. "add r3, r3, #4\n\t"
  75968. #endif
  75969. "cmp r3, r4\n\t"
  75970. "blt L_sp_3072_mont_reduce_96_sub_mask_%=\n\t"
  75971. #else /* WOLFSSL_SP_LARGE_CODE */
  75972. "ldm %[m]!, {r6}\n\t"
  75973. #ifdef WOLFSSL_KEIL
  75974. "ands r6, r6, r7\n\t"
  75975. #elif defined(__clang__)
  75976. "ands r6, r7\n\t"
  75977. #else
  75978. "and r6, r7\n\t"
  75979. #endif
  75980. "ldr r5, [%[a], r4]\n\t"
  75981. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75982. "subs r5, r5, r6\n\t"
  75983. #else
  75984. "sub r5, r5, r6\n\t"
  75985. #endif
  75986. "stm %[a]!, {r5}\n\t"
  75987. "ldm %[m]!, {r6}\n\t"
  75988. #ifdef WOLFSSL_KEIL
  75989. "ands r6, r6, r7\n\t"
  75990. #elif defined(__clang__)
  75991. "ands r6, r7\n\t"
  75992. #else
  75993. "and r6, r7\n\t"
  75994. #endif
  75995. "ldr r5, [%[a], r4]\n\t"
  75996. #ifdef WOLFSSL_KEIL
  75997. "sbcs r5, r5, r6\n\t"
  75998. #elif defined(__clang__)
  75999. "sbcs r5, r6\n\t"
  76000. #else
  76001. "sbc r5, r6\n\t"
  76002. #endif
  76003. "stm %[a]!, {r5}\n\t"
  76004. "ldm %[m]!, {r6}\n\t"
  76005. #ifdef WOLFSSL_KEIL
  76006. "ands r6, r6, r7\n\t"
  76007. #elif defined(__clang__)
  76008. "ands r6, r7\n\t"
  76009. #else
  76010. "and r6, r7\n\t"
  76011. #endif
  76012. "ldr r5, [%[a], r4]\n\t"
  76013. #ifdef WOLFSSL_KEIL
  76014. "sbcs r5, r5, r6\n\t"
  76015. #elif defined(__clang__)
  76016. "sbcs r5, r6\n\t"
  76017. #else
  76018. "sbc r5, r6\n\t"
  76019. #endif
  76020. "stm %[a]!, {r5}\n\t"
  76021. "ldm %[m]!, {r6}\n\t"
  76022. #ifdef WOLFSSL_KEIL
  76023. "ands r6, r6, r7\n\t"
  76024. #elif defined(__clang__)
  76025. "ands r6, r7\n\t"
  76026. #else
  76027. "and r6, r7\n\t"
  76028. #endif
  76029. "ldr r5, [%[a], r4]\n\t"
  76030. #ifdef WOLFSSL_KEIL
  76031. "sbcs r5, r5, r6\n\t"
  76032. #elif defined(__clang__)
  76033. "sbcs r5, r6\n\t"
  76034. #else
  76035. "sbc r5, r6\n\t"
  76036. #endif
  76037. "stm %[a]!, {r5}\n\t"
  76038. "ldm %[m]!, {r6}\n\t"
  76039. #ifdef WOLFSSL_KEIL
  76040. "ands r6, r6, r7\n\t"
  76041. #elif defined(__clang__)
  76042. "ands r6, r7\n\t"
  76043. #else
  76044. "and r6, r7\n\t"
  76045. #endif
  76046. "ldr r5, [%[a], r4]\n\t"
  76047. #ifdef WOLFSSL_KEIL
  76048. "sbcs r5, r5, r6\n\t"
  76049. #elif defined(__clang__)
  76050. "sbcs r5, r6\n\t"
  76051. #else
  76052. "sbc r5, r6\n\t"
  76053. #endif
  76054. "stm %[a]!, {r5}\n\t"
  76055. "ldm %[m]!, {r6}\n\t"
  76056. #ifdef WOLFSSL_KEIL
  76057. "ands r6, r6, r7\n\t"
  76058. #elif defined(__clang__)
  76059. "ands r6, r7\n\t"
  76060. #else
  76061. "and r6, r7\n\t"
  76062. #endif
  76063. "ldr r5, [%[a], r4]\n\t"
  76064. #ifdef WOLFSSL_KEIL
  76065. "sbcs r5, r5, r6\n\t"
  76066. #elif defined(__clang__)
  76067. "sbcs r5, r6\n\t"
  76068. #else
  76069. "sbc r5, r6\n\t"
  76070. #endif
  76071. "stm %[a]!, {r5}\n\t"
  76072. "ldm %[m]!, {r6}\n\t"
  76073. #ifdef WOLFSSL_KEIL
  76074. "ands r6, r6, r7\n\t"
  76075. #elif defined(__clang__)
  76076. "ands r6, r7\n\t"
  76077. #else
  76078. "and r6, r7\n\t"
  76079. #endif
  76080. "ldr r5, [%[a], r4]\n\t"
  76081. #ifdef WOLFSSL_KEIL
  76082. "sbcs r5, r5, r6\n\t"
  76083. #elif defined(__clang__)
  76084. "sbcs r5, r6\n\t"
  76085. #else
  76086. "sbc r5, r6\n\t"
  76087. #endif
  76088. "stm %[a]!, {r5}\n\t"
  76089. "ldm %[m]!, {r6}\n\t"
  76090. #ifdef WOLFSSL_KEIL
  76091. "ands r6, r6, r7\n\t"
  76092. #elif defined(__clang__)
  76093. "ands r6, r7\n\t"
  76094. #else
  76095. "and r6, r7\n\t"
  76096. #endif
  76097. "ldr r5, [%[a], r4]\n\t"
  76098. #ifdef WOLFSSL_KEIL
  76099. "sbcs r5, r5, r6\n\t"
  76100. #elif defined(__clang__)
  76101. "sbcs r5, r6\n\t"
  76102. #else
  76103. "sbc r5, r6\n\t"
  76104. #endif
  76105. "stm %[a]!, {r5}\n\t"
  76106. "ldm %[m]!, {r6}\n\t"
  76107. #ifdef WOLFSSL_KEIL
  76108. "ands r6, r6, r7\n\t"
  76109. #elif defined(__clang__)
  76110. "ands r6, r7\n\t"
  76111. #else
  76112. "and r6, r7\n\t"
  76113. #endif
  76114. "ldr r5, [%[a], r4]\n\t"
  76115. #ifdef WOLFSSL_KEIL
  76116. "sbcs r5, r5, r6\n\t"
  76117. #elif defined(__clang__)
  76118. "sbcs r5, r6\n\t"
  76119. #else
  76120. "sbc r5, r6\n\t"
  76121. #endif
  76122. "stm %[a]!, {r5}\n\t"
  76123. "ldm %[m]!, {r6}\n\t"
  76124. #ifdef WOLFSSL_KEIL
  76125. "ands r6, r6, r7\n\t"
  76126. #elif defined(__clang__)
  76127. "ands r6, r7\n\t"
  76128. #else
  76129. "and r6, r7\n\t"
  76130. #endif
  76131. "ldr r5, [%[a], r4]\n\t"
  76132. #ifdef WOLFSSL_KEIL
  76133. "sbcs r5, r5, r6\n\t"
  76134. #elif defined(__clang__)
  76135. "sbcs r5, r6\n\t"
  76136. #else
  76137. "sbc r5, r6\n\t"
  76138. #endif
  76139. "stm %[a]!, {r5}\n\t"
  76140. "ldm %[m]!, {r6}\n\t"
  76141. #ifdef WOLFSSL_KEIL
  76142. "ands r6, r6, r7\n\t"
  76143. #elif defined(__clang__)
  76144. "ands r6, r7\n\t"
  76145. #else
  76146. "and r6, r7\n\t"
  76147. #endif
  76148. "ldr r5, [%[a], r4]\n\t"
  76149. #ifdef WOLFSSL_KEIL
  76150. "sbcs r5, r5, r6\n\t"
  76151. #elif defined(__clang__)
  76152. "sbcs r5, r6\n\t"
  76153. #else
  76154. "sbc r5, r6\n\t"
  76155. #endif
  76156. "stm %[a]!, {r5}\n\t"
  76157. "ldm %[m]!, {r6}\n\t"
  76158. #ifdef WOLFSSL_KEIL
  76159. "ands r6, r6, r7\n\t"
  76160. #elif defined(__clang__)
  76161. "ands r6, r7\n\t"
  76162. #else
  76163. "and r6, r7\n\t"
  76164. #endif
  76165. "ldr r5, [%[a], r4]\n\t"
  76166. #ifdef WOLFSSL_KEIL
  76167. "sbcs r5, r5, r6\n\t"
  76168. #elif defined(__clang__)
  76169. "sbcs r5, r6\n\t"
  76170. #else
  76171. "sbc r5, r6\n\t"
  76172. #endif
  76173. "stm %[a]!, {r5}\n\t"
  76174. "ldm %[m]!, {r6}\n\t"
  76175. #ifdef WOLFSSL_KEIL
  76176. "ands r6, r6, r7\n\t"
  76177. #elif defined(__clang__)
  76178. "ands r6, r7\n\t"
  76179. #else
  76180. "and r6, r7\n\t"
  76181. #endif
  76182. "ldr r5, [%[a], r4]\n\t"
  76183. #ifdef WOLFSSL_KEIL
  76184. "sbcs r5, r5, r6\n\t"
  76185. #elif defined(__clang__)
  76186. "sbcs r5, r6\n\t"
  76187. #else
  76188. "sbc r5, r6\n\t"
  76189. #endif
  76190. "stm %[a]!, {r5}\n\t"
  76191. "ldm %[m]!, {r6}\n\t"
  76192. #ifdef WOLFSSL_KEIL
  76193. "ands r6, r6, r7\n\t"
  76194. #elif defined(__clang__)
  76195. "ands r6, r7\n\t"
  76196. #else
  76197. "and r6, r7\n\t"
  76198. #endif
  76199. "ldr r5, [%[a], r4]\n\t"
  76200. #ifdef WOLFSSL_KEIL
  76201. "sbcs r5, r5, r6\n\t"
  76202. #elif defined(__clang__)
  76203. "sbcs r5, r6\n\t"
  76204. #else
  76205. "sbc r5, r6\n\t"
  76206. #endif
  76207. "stm %[a]!, {r5}\n\t"
  76208. "ldm %[m]!, {r6}\n\t"
  76209. #ifdef WOLFSSL_KEIL
  76210. "ands r6, r6, r7\n\t"
  76211. #elif defined(__clang__)
  76212. "ands r6, r7\n\t"
  76213. #else
  76214. "and r6, r7\n\t"
  76215. #endif
  76216. "ldr r5, [%[a], r4]\n\t"
  76217. #ifdef WOLFSSL_KEIL
  76218. "sbcs r5, r5, r6\n\t"
  76219. #elif defined(__clang__)
  76220. "sbcs r5, r6\n\t"
  76221. #else
  76222. "sbc r5, r6\n\t"
  76223. #endif
  76224. "stm %[a]!, {r5}\n\t"
  76225. "ldm %[m]!, {r6}\n\t"
  76226. #ifdef WOLFSSL_KEIL
  76227. "ands r6, r6, r7\n\t"
  76228. #elif defined(__clang__)
  76229. "ands r6, r7\n\t"
  76230. #else
  76231. "and r6, r7\n\t"
  76232. #endif
  76233. "ldr r5, [%[a], r4]\n\t"
  76234. #ifdef WOLFSSL_KEIL
  76235. "sbcs r5, r5, r6\n\t"
  76236. #elif defined(__clang__)
  76237. "sbcs r5, r6\n\t"
  76238. #else
  76239. "sbc r5, r6\n\t"
  76240. #endif
  76241. "stm %[a]!, {r5}\n\t"
  76242. "ldm %[m]!, {r6}\n\t"
  76243. #ifdef WOLFSSL_KEIL
  76244. "ands r6, r6, r7\n\t"
  76245. #elif defined(__clang__)
  76246. "ands r6, r7\n\t"
  76247. #else
  76248. "and r6, r7\n\t"
  76249. #endif
  76250. "ldr r5, [%[a], r4]\n\t"
  76251. #ifdef WOLFSSL_KEIL
  76252. "sbcs r5, r5, r6\n\t"
  76253. #elif defined(__clang__)
  76254. "sbcs r5, r6\n\t"
  76255. #else
  76256. "sbc r5, r6\n\t"
  76257. #endif
  76258. "stm %[a]!, {r5}\n\t"
  76259. "ldm %[m]!, {r6}\n\t"
  76260. #ifdef WOLFSSL_KEIL
  76261. "ands r6, r6, r7\n\t"
  76262. #elif defined(__clang__)
  76263. "ands r6, r7\n\t"
  76264. #else
  76265. "and r6, r7\n\t"
  76266. #endif
  76267. "ldr r5, [%[a], r4]\n\t"
  76268. #ifdef WOLFSSL_KEIL
  76269. "sbcs r5, r5, r6\n\t"
  76270. #elif defined(__clang__)
  76271. "sbcs r5, r6\n\t"
  76272. #else
  76273. "sbc r5, r6\n\t"
  76274. #endif
  76275. "stm %[a]!, {r5}\n\t"
  76276. "ldm %[m]!, {r6}\n\t"
  76277. #ifdef WOLFSSL_KEIL
  76278. "ands r6, r6, r7\n\t"
  76279. #elif defined(__clang__)
  76280. "ands r6, r7\n\t"
  76281. #else
  76282. "and r6, r7\n\t"
  76283. #endif
  76284. "ldr r5, [%[a], r4]\n\t"
  76285. #ifdef WOLFSSL_KEIL
  76286. "sbcs r5, r5, r6\n\t"
  76287. #elif defined(__clang__)
  76288. "sbcs r5, r6\n\t"
  76289. #else
  76290. "sbc r5, r6\n\t"
  76291. #endif
  76292. "stm %[a]!, {r5}\n\t"
  76293. "ldm %[m]!, {r6}\n\t"
  76294. #ifdef WOLFSSL_KEIL
  76295. "ands r6, r6, r7\n\t"
  76296. #elif defined(__clang__)
  76297. "ands r6, r7\n\t"
  76298. #else
  76299. "and r6, r7\n\t"
  76300. #endif
  76301. "ldr r5, [%[a], r4]\n\t"
  76302. #ifdef WOLFSSL_KEIL
  76303. "sbcs r5, r5, r6\n\t"
  76304. #elif defined(__clang__)
  76305. "sbcs r5, r6\n\t"
  76306. #else
  76307. "sbc r5, r6\n\t"
  76308. #endif
  76309. "stm %[a]!, {r5}\n\t"
  76310. "ldm %[m]!, {r6}\n\t"
  76311. #ifdef WOLFSSL_KEIL
  76312. "ands r6, r6, r7\n\t"
  76313. #elif defined(__clang__)
  76314. "ands r6, r7\n\t"
  76315. #else
  76316. "and r6, r7\n\t"
  76317. #endif
  76318. "ldr r5, [%[a], r4]\n\t"
  76319. #ifdef WOLFSSL_KEIL
  76320. "sbcs r5, r5, r6\n\t"
  76321. #elif defined(__clang__)
  76322. "sbcs r5, r6\n\t"
  76323. #else
  76324. "sbc r5, r6\n\t"
  76325. #endif
  76326. "stm %[a]!, {r5}\n\t"
  76327. "ldm %[m]!, {r6}\n\t"
  76328. #ifdef WOLFSSL_KEIL
  76329. "ands r6, r6, r7\n\t"
  76330. #elif defined(__clang__)
  76331. "ands r6, r7\n\t"
  76332. #else
  76333. "and r6, r7\n\t"
  76334. #endif
  76335. "ldr r5, [%[a], r4]\n\t"
  76336. #ifdef WOLFSSL_KEIL
  76337. "sbcs r5, r5, r6\n\t"
  76338. #elif defined(__clang__)
  76339. "sbcs r5, r6\n\t"
  76340. #else
  76341. "sbc r5, r6\n\t"
  76342. #endif
  76343. "stm %[a]!, {r5}\n\t"
  76344. "ldm %[m]!, {r6}\n\t"
  76345. #ifdef WOLFSSL_KEIL
  76346. "ands r6, r6, r7\n\t"
  76347. #elif defined(__clang__)
  76348. "ands r6, r7\n\t"
  76349. #else
  76350. "and r6, r7\n\t"
  76351. #endif
  76352. "ldr r5, [%[a], r4]\n\t"
  76353. #ifdef WOLFSSL_KEIL
  76354. "sbcs r5, r5, r6\n\t"
  76355. #elif defined(__clang__)
  76356. "sbcs r5, r6\n\t"
  76357. #else
  76358. "sbc r5, r6\n\t"
  76359. #endif
  76360. "stm %[a]!, {r5}\n\t"
  76361. "ldm %[m]!, {r6}\n\t"
  76362. #ifdef WOLFSSL_KEIL
  76363. "ands r6, r6, r7\n\t"
  76364. #elif defined(__clang__)
  76365. "ands r6, r7\n\t"
  76366. #else
  76367. "and r6, r7\n\t"
  76368. #endif
  76369. "ldr r5, [%[a], r4]\n\t"
  76370. #ifdef WOLFSSL_KEIL
  76371. "sbcs r5, r5, r6\n\t"
  76372. #elif defined(__clang__)
  76373. "sbcs r5, r6\n\t"
  76374. #else
  76375. "sbc r5, r6\n\t"
  76376. #endif
  76377. "stm %[a]!, {r5}\n\t"
  76378. "ldm %[m]!, {r6}\n\t"
  76379. #ifdef WOLFSSL_KEIL
  76380. "ands r6, r6, r7\n\t"
  76381. #elif defined(__clang__)
  76382. "ands r6, r7\n\t"
  76383. #else
  76384. "and r6, r7\n\t"
  76385. #endif
  76386. "ldr r5, [%[a], r4]\n\t"
  76387. #ifdef WOLFSSL_KEIL
  76388. "sbcs r5, r5, r6\n\t"
  76389. #elif defined(__clang__)
  76390. "sbcs r5, r6\n\t"
  76391. #else
  76392. "sbc r5, r6\n\t"
  76393. #endif
  76394. "stm %[a]!, {r5}\n\t"
  76395. "ldm %[m]!, {r6}\n\t"
  76396. #ifdef WOLFSSL_KEIL
  76397. "ands r6, r6, r7\n\t"
  76398. #elif defined(__clang__)
  76399. "ands r6, r7\n\t"
  76400. #else
  76401. "and r6, r7\n\t"
  76402. #endif
  76403. "ldr r5, [%[a], r4]\n\t"
  76404. #ifdef WOLFSSL_KEIL
  76405. "sbcs r5, r5, r6\n\t"
  76406. #elif defined(__clang__)
  76407. "sbcs r5, r6\n\t"
  76408. #else
  76409. "sbc r5, r6\n\t"
  76410. #endif
  76411. "stm %[a]!, {r5}\n\t"
  76412. "ldm %[m]!, {r6}\n\t"
  76413. #ifdef WOLFSSL_KEIL
  76414. "ands r6, r6, r7\n\t"
  76415. #elif defined(__clang__)
  76416. "ands r6, r7\n\t"
  76417. #else
  76418. "and r6, r7\n\t"
  76419. #endif
  76420. "ldr r5, [%[a], r4]\n\t"
  76421. #ifdef WOLFSSL_KEIL
  76422. "sbcs r5, r5, r6\n\t"
  76423. #elif defined(__clang__)
  76424. "sbcs r5, r6\n\t"
  76425. #else
  76426. "sbc r5, r6\n\t"
  76427. #endif
  76428. "stm %[a]!, {r5}\n\t"
  76429. "ldm %[m]!, {r6}\n\t"
  76430. #ifdef WOLFSSL_KEIL
  76431. "ands r6, r6, r7\n\t"
  76432. #elif defined(__clang__)
  76433. "ands r6, r7\n\t"
  76434. #else
  76435. "and r6, r7\n\t"
  76436. #endif
  76437. "ldr r5, [%[a], r4]\n\t"
  76438. #ifdef WOLFSSL_KEIL
  76439. "sbcs r5, r5, r6\n\t"
  76440. #elif defined(__clang__)
  76441. "sbcs r5, r6\n\t"
  76442. #else
  76443. "sbc r5, r6\n\t"
  76444. #endif
  76445. "stm %[a]!, {r5}\n\t"
  76446. "ldm %[m]!, {r6}\n\t"
  76447. #ifdef WOLFSSL_KEIL
  76448. "ands r6, r6, r7\n\t"
  76449. #elif defined(__clang__)
  76450. "ands r6, r7\n\t"
  76451. #else
  76452. "and r6, r7\n\t"
  76453. #endif
  76454. "ldr r5, [%[a], r4]\n\t"
  76455. #ifdef WOLFSSL_KEIL
  76456. "sbcs r5, r5, r6\n\t"
  76457. #elif defined(__clang__)
  76458. "sbcs r5, r6\n\t"
  76459. #else
  76460. "sbc r5, r6\n\t"
  76461. #endif
  76462. "stm %[a]!, {r5}\n\t"
  76463. "ldm %[m]!, {r6}\n\t"
  76464. #ifdef WOLFSSL_KEIL
  76465. "ands r6, r6, r7\n\t"
  76466. #elif defined(__clang__)
  76467. "ands r6, r7\n\t"
  76468. #else
  76469. "and r6, r7\n\t"
  76470. #endif
  76471. "ldr r5, [%[a], r4]\n\t"
  76472. #ifdef WOLFSSL_KEIL
  76473. "sbcs r5, r5, r6\n\t"
  76474. #elif defined(__clang__)
  76475. "sbcs r5, r6\n\t"
  76476. #else
  76477. "sbc r5, r6\n\t"
  76478. #endif
  76479. "stm %[a]!, {r5}\n\t"
  76480. "ldm %[m]!, {r6}\n\t"
  76481. #ifdef WOLFSSL_KEIL
  76482. "ands r6, r6, r7\n\t"
  76483. #elif defined(__clang__)
  76484. "ands r6, r7\n\t"
  76485. #else
  76486. "and r6, r7\n\t"
  76487. #endif
  76488. "ldr r5, [%[a], r4]\n\t"
  76489. #ifdef WOLFSSL_KEIL
  76490. "sbcs r5, r5, r6\n\t"
  76491. #elif defined(__clang__)
  76492. "sbcs r5, r6\n\t"
  76493. #else
  76494. "sbc r5, r6\n\t"
  76495. #endif
  76496. "stm %[a]!, {r5}\n\t"
  76497. "ldm %[m]!, {r6}\n\t"
  76498. #ifdef WOLFSSL_KEIL
  76499. "ands r6, r6, r7\n\t"
  76500. #elif defined(__clang__)
  76501. "ands r6, r7\n\t"
  76502. #else
  76503. "and r6, r7\n\t"
  76504. #endif
  76505. "ldr r5, [%[a], r4]\n\t"
  76506. #ifdef WOLFSSL_KEIL
  76507. "sbcs r5, r5, r6\n\t"
  76508. #elif defined(__clang__)
  76509. "sbcs r5, r6\n\t"
  76510. #else
  76511. "sbc r5, r6\n\t"
  76512. #endif
  76513. "stm %[a]!, {r5}\n\t"
  76514. "ldm %[m]!, {r6}\n\t"
  76515. #ifdef WOLFSSL_KEIL
  76516. "ands r6, r6, r7\n\t"
  76517. #elif defined(__clang__)
  76518. "ands r6, r7\n\t"
  76519. #else
  76520. "and r6, r7\n\t"
  76521. #endif
  76522. "ldr r5, [%[a], r4]\n\t"
  76523. #ifdef WOLFSSL_KEIL
  76524. "sbcs r5, r5, r6\n\t"
  76525. #elif defined(__clang__)
  76526. "sbcs r5, r6\n\t"
  76527. #else
  76528. "sbc r5, r6\n\t"
  76529. #endif
  76530. "stm %[a]!, {r5}\n\t"
  76531. "ldm %[m]!, {r6}\n\t"
  76532. #ifdef WOLFSSL_KEIL
  76533. "ands r6, r6, r7\n\t"
  76534. #elif defined(__clang__)
  76535. "ands r6, r7\n\t"
  76536. #else
  76537. "and r6, r7\n\t"
  76538. #endif
  76539. "ldr r5, [%[a], r4]\n\t"
  76540. #ifdef WOLFSSL_KEIL
  76541. "sbcs r5, r5, r6\n\t"
  76542. #elif defined(__clang__)
  76543. "sbcs r5, r6\n\t"
  76544. #else
  76545. "sbc r5, r6\n\t"
  76546. #endif
  76547. "stm %[a]!, {r5}\n\t"
  76548. "ldm %[m]!, {r6}\n\t"
  76549. #ifdef WOLFSSL_KEIL
  76550. "ands r6, r6, r7\n\t"
  76551. #elif defined(__clang__)
  76552. "ands r6, r7\n\t"
  76553. #else
  76554. "and r6, r7\n\t"
  76555. #endif
  76556. "ldr r5, [%[a], r4]\n\t"
  76557. #ifdef WOLFSSL_KEIL
  76558. "sbcs r5, r5, r6\n\t"
  76559. #elif defined(__clang__)
  76560. "sbcs r5, r6\n\t"
  76561. #else
  76562. "sbc r5, r6\n\t"
  76563. #endif
  76564. "stm %[a]!, {r5}\n\t"
  76565. "ldm %[m]!, {r6}\n\t"
  76566. #ifdef WOLFSSL_KEIL
  76567. "ands r6, r6, r7\n\t"
  76568. #elif defined(__clang__)
  76569. "ands r6, r7\n\t"
  76570. #else
  76571. "and r6, r7\n\t"
  76572. #endif
  76573. "ldr r5, [%[a], r4]\n\t"
  76574. #ifdef WOLFSSL_KEIL
  76575. "sbcs r5, r5, r6\n\t"
  76576. #elif defined(__clang__)
  76577. "sbcs r5, r6\n\t"
  76578. #else
  76579. "sbc r5, r6\n\t"
  76580. #endif
  76581. "stm %[a]!, {r5}\n\t"
  76582. "ldm %[m]!, {r6}\n\t"
  76583. #ifdef WOLFSSL_KEIL
  76584. "ands r6, r6, r7\n\t"
  76585. #elif defined(__clang__)
  76586. "ands r6, r7\n\t"
  76587. #else
  76588. "and r6, r7\n\t"
  76589. #endif
  76590. "ldr r5, [%[a], r4]\n\t"
  76591. #ifdef WOLFSSL_KEIL
  76592. "sbcs r5, r5, r6\n\t"
  76593. #elif defined(__clang__)
  76594. "sbcs r5, r6\n\t"
  76595. #else
  76596. "sbc r5, r6\n\t"
  76597. #endif
  76598. "stm %[a]!, {r5}\n\t"
  76599. "ldm %[m]!, {r6}\n\t"
  76600. #ifdef WOLFSSL_KEIL
  76601. "ands r6, r6, r7\n\t"
  76602. #elif defined(__clang__)
  76603. "ands r6, r7\n\t"
  76604. #else
  76605. "and r6, r7\n\t"
  76606. #endif
  76607. "ldr r5, [%[a], r4]\n\t"
  76608. #ifdef WOLFSSL_KEIL
  76609. "sbcs r5, r5, r6\n\t"
  76610. #elif defined(__clang__)
  76611. "sbcs r5, r6\n\t"
  76612. #else
  76613. "sbc r5, r6\n\t"
  76614. #endif
  76615. "stm %[a]!, {r5}\n\t"
  76616. "ldm %[m]!, {r6}\n\t"
  76617. #ifdef WOLFSSL_KEIL
  76618. "ands r6, r6, r7\n\t"
  76619. #elif defined(__clang__)
  76620. "ands r6, r7\n\t"
  76621. #else
  76622. "and r6, r7\n\t"
  76623. #endif
  76624. "ldr r5, [%[a], r4]\n\t"
  76625. #ifdef WOLFSSL_KEIL
  76626. "sbcs r5, r5, r6\n\t"
  76627. #elif defined(__clang__)
  76628. "sbcs r5, r6\n\t"
  76629. #else
  76630. "sbc r5, r6\n\t"
  76631. #endif
  76632. "stm %[a]!, {r5}\n\t"
  76633. "ldm %[m]!, {r6}\n\t"
  76634. #ifdef WOLFSSL_KEIL
  76635. "ands r6, r6, r7\n\t"
  76636. #elif defined(__clang__)
  76637. "ands r6, r7\n\t"
  76638. #else
  76639. "and r6, r7\n\t"
  76640. #endif
  76641. "ldr r5, [%[a], r4]\n\t"
  76642. #ifdef WOLFSSL_KEIL
  76643. "sbcs r5, r5, r6\n\t"
  76644. #elif defined(__clang__)
  76645. "sbcs r5, r6\n\t"
  76646. #else
  76647. "sbc r5, r6\n\t"
  76648. #endif
  76649. "stm %[a]!, {r5}\n\t"
  76650. "ldm %[m]!, {r6}\n\t"
  76651. #ifdef WOLFSSL_KEIL
  76652. "ands r6, r6, r7\n\t"
  76653. #elif defined(__clang__)
  76654. "ands r6, r7\n\t"
  76655. #else
  76656. "and r6, r7\n\t"
  76657. #endif
  76658. "ldr r5, [%[a], r4]\n\t"
  76659. #ifdef WOLFSSL_KEIL
  76660. "sbcs r5, r5, r6\n\t"
  76661. #elif defined(__clang__)
  76662. "sbcs r5, r6\n\t"
  76663. #else
  76664. "sbc r5, r6\n\t"
  76665. #endif
  76666. "stm %[a]!, {r5}\n\t"
  76667. "ldm %[m]!, {r6}\n\t"
  76668. #ifdef WOLFSSL_KEIL
  76669. "ands r6, r6, r7\n\t"
  76670. #elif defined(__clang__)
  76671. "ands r6, r7\n\t"
  76672. #else
  76673. "and r6, r7\n\t"
  76674. #endif
  76675. "ldr r5, [%[a], r4]\n\t"
  76676. #ifdef WOLFSSL_KEIL
  76677. "sbcs r5, r5, r6\n\t"
  76678. #elif defined(__clang__)
  76679. "sbcs r5, r6\n\t"
  76680. #else
  76681. "sbc r5, r6\n\t"
  76682. #endif
  76683. "stm %[a]!, {r5}\n\t"
  76684. "ldm %[m]!, {r6}\n\t"
  76685. #ifdef WOLFSSL_KEIL
  76686. "ands r6, r6, r7\n\t"
  76687. #elif defined(__clang__)
  76688. "ands r6, r7\n\t"
  76689. #else
  76690. "and r6, r7\n\t"
  76691. #endif
  76692. "ldr r5, [%[a], r4]\n\t"
  76693. #ifdef WOLFSSL_KEIL
  76694. "sbcs r5, r5, r6\n\t"
  76695. #elif defined(__clang__)
  76696. "sbcs r5, r6\n\t"
  76697. #else
  76698. "sbc r5, r6\n\t"
  76699. #endif
  76700. "stm %[a]!, {r5}\n\t"
  76701. "ldm %[m]!, {r6}\n\t"
  76702. #ifdef WOLFSSL_KEIL
  76703. "ands r6, r6, r7\n\t"
  76704. #elif defined(__clang__)
  76705. "ands r6, r7\n\t"
  76706. #else
  76707. "and r6, r7\n\t"
  76708. #endif
  76709. "ldr r5, [%[a], r4]\n\t"
  76710. #ifdef WOLFSSL_KEIL
  76711. "sbcs r5, r5, r6\n\t"
  76712. #elif defined(__clang__)
  76713. "sbcs r5, r6\n\t"
  76714. #else
  76715. "sbc r5, r6\n\t"
  76716. #endif
  76717. "stm %[a]!, {r5}\n\t"
  76718. "ldm %[m]!, {r6}\n\t"
  76719. #ifdef WOLFSSL_KEIL
  76720. "ands r6, r6, r7\n\t"
  76721. #elif defined(__clang__)
  76722. "ands r6, r7\n\t"
  76723. #else
  76724. "and r6, r7\n\t"
  76725. #endif
  76726. "ldr r5, [%[a], r4]\n\t"
  76727. #ifdef WOLFSSL_KEIL
  76728. "sbcs r5, r5, r6\n\t"
  76729. #elif defined(__clang__)
  76730. "sbcs r5, r6\n\t"
  76731. #else
  76732. "sbc r5, r6\n\t"
  76733. #endif
  76734. "stm %[a]!, {r5}\n\t"
  76735. "ldm %[m]!, {r6}\n\t"
  76736. #ifdef WOLFSSL_KEIL
  76737. "ands r6, r6, r7\n\t"
  76738. #elif defined(__clang__)
  76739. "ands r6, r7\n\t"
  76740. #else
  76741. "and r6, r7\n\t"
  76742. #endif
  76743. "ldr r5, [%[a], r4]\n\t"
  76744. #ifdef WOLFSSL_KEIL
  76745. "sbcs r5, r5, r6\n\t"
  76746. #elif defined(__clang__)
  76747. "sbcs r5, r6\n\t"
  76748. #else
  76749. "sbc r5, r6\n\t"
  76750. #endif
  76751. "stm %[a]!, {r5}\n\t"
  76752. "ldm %[m]!, {r6}\n\t"
  76753. #ifdef WOLFSSL_KEIL
  76754. "ands r6, r6, r7\n\t"
  76755. #elif defined(__clang__)
  76756. "ands r6, r7\n\t"
  76757. #else
  76758. "and r6, r7\n\t"
  76759. #endif
  76760. "ldr r5, [%[a], r4]\n\t"
  76761. #ifdef WOLFSSL_KEIL
  76762. "sbcs r5, r5, r6\n\t"
  76763. #elif defined(__clang__)
  76764. "sbcs r5, r6\n\t"
  76765. #else
  76766. "sbc r5, r6\n\t"
  76767. #endif
  76768. "stm %[a]!, {r5}\n\t"
  76769. "ldm %[m]!, {r6}\n\t"
  76770. #ifdef WOLFSSL_KEIL
  76771. "ands r6, r6, r7\n\t"
  76772. #elif defined(__clang__)
  76773. "ands r6, r7\n\t"
  76774. #else
  76775. "and r6, r7\n\t"
  76776. #endif
  76777. "ldr r5, [%[a], r4]\n\t"
  76778. #ifdef WOLFSSL_KEIL
  76779. "sbcs r5, r5, r6\n\t"
  76780. #elif defined(__clang__)
  76781. "sbcs r5, r6\n\t"
  76782. #else
  76783. "sbc r5, r6\n\t"
  76784. #endif
  76785. "stm %[a]!, {r5}\n\t"
  76786. "ldm %[m]!, {r6}\n\t"
  76787. #ifdef WOLFSSL_KEIL
  76788. "ands r6, r6, r7\n\t"
  76789. #elif defined(__clang__)
  76790. "ands r6, r7\n\t"
  76791. #else
  76792. "and r6, r7\n\t"
  76793. #endif
  76794. "ldr r5, [%[a], r4]\n\t"
  76795. #ifdef WOLFSSL_KEIL
  76796. "sbcs r5, r5, r6\n\t"
  76797. #elif defined(__clang__)
  76798. "sbcs r5, r6\n\t"
  76799. #else
  76800. "sbc r5, r6\n\t"
  76801. #endif
  76802. "stm %[a]!, {r5}\n\t"
  76803. "ldm %[m]!, {r6}\n\t"
  76804. #ifdef WOLFSSL_KEIL
  76805. "ands r6, r6, r7\n\t"
  76806. #elif defined(__clang__)
  76807. "ands r6, r7\n\t"
  76808. #else
  76809. "and r6, r7\n\t"
  76810. #endif
  76811. "ldr r5, [%[a], r4]\n\t"
  76812. #ifdef WOLFSSL_KEIL
  76813. "sbcs r5, r5, r6\n\t"
  76814. #elif defined(__clang__)
  76815. "sbcs r5, r6\n\t"
  76816. #else
  76817. "sbc r5, r6\n\t"
  76818. #endif
  76819. "stm %[a]!, {r5}\n\t"
  76820. "ldm %[m]!, {r6}\n\t"
  76821. #ifdef WOLFSSL_KEIL
  76822. "ands r6, r6, r7\n\t"
  76823. #elif defined(__clang__)
  76824. "ands r6, r7\n\t"
  76825. #else
  76826. "and r6, r7\n\t"
  76827. #endif
  76828. "ldr r5, [%[a], r4]\n\t"
  76829. #ifdef WOLFSSL_KEIL
  76830. "sbcs r5, r5, r6\n\t"
  76831. #elif defined(__clang__)
  76832. "sbcs r5, r6\n\t"
  76833. #else
  76834. "sbc r5, r6\n\t"
  76835. #endif
  76836. "stm %[a]!, {r5}\n\t"
  76837. "ldm %[m]!, {r6}\n\t"
  76838. #ifdef WOLFSSL_KEIL
  76839. "ands r6, r6, r7\n\t"
  76840. #elif defined(__clang__)
  76841. "ands r6, r7\n\t"
  76842. #else
  76843. "and r6, r7\n\t"
  76844. #endif
  76845. "ldr r5, [%[a], r4]\n\t"
  76846. #ifdef WOLFSSL_KEIL
  76847. "sbcs r5, r5, r6\n\t"
  76848. #elif defined(__clang__)
  76849. "sbcs r5, r6\n\t"
  76850. #else
  76851. "sbc r5, r6\n\t"
  76852. #endif
  76853. "stm %[a]!, {r5}\n\t"
  76854. "ldm %[m]!, {r6}\n\t"
  76855. #ifdef WOLFSSL_KEIL
  76856. "ands r6, r6, r7\n\t"
  76857. #elif defined(__clang__)
  76858. "ands r6, r7\n\t"
  76859. #else
  76860. "and r6, r7\n\t"
  76861. #endif
  76862. "ldr r5, [%[a], r4]\n\t"
  76863. #ifdef WOLFSSL_KEIL
  76864. "sbcs r5, r5, r6\n\t"
  76865. #elif defined(__clang__)
  76866. "sbcs r5, r6\n\t"
  76867. #else
  76868. "sbc r5, r6\n\t"
  76869. #endif
  76870. "stm %[a]!, {r5}\n\t"
  76871. "ldm %[m]!, {r6}\n\t"
  76872. #ifdef WOLFSSL_KEIL
  76873. "ands r6, r6, r7\n\t"
  76874. #elif defined(__clang__)
  76875. "ands r6, r7\n\t"
  76876. #else
  76877. "and r6, r7\n\t"
  76878. #endif
  76879. "ldr r5, [%[a], r4]\n\t"
  76880. #ifdef WOLFSSL_KEIL
  76881. "sbcs r5, r5, r6\n\t"
  76882. #elif defined(__clang__)
  76883. "sbcs r5, r6\n\t"
  76884. #else
  76885. "sbc r5, r6\n\t"
  76886. #endif
  76887. "stm %[a]!, {r5}\n\t"
  76888. "ldm %[m]!, {r6}\n\t"
  76889. #ifdef WOLFSSL_KEIL
  76890. "ands r6, r6, r7\n\t"
  76891. #elif defined(__clang__)
  76892. "ands r6, r7\n\t"
  76893. #else
  76894. "and r6, r7\n\t"
  76895. #endif
  76896. "ldr r5, [%[a], r4]\n\t"
  76897. #ifdef WOLFSSL_KEIL
  76898. "sbcs r5, r5, r6\n\t"
  76899. #elif defined(__clang__)
  76900. "sbcs r5, r6\n\t"
  76901. #else
  76902. "sbc r5, r6\n\t"
  76903. #endif
  76904. "stm %[a]!, {r5}\n\t"
  76905. "ldm %[m]!, {r6}\n\t"
  76906. #ifdef WOLFSSL_KEIL
  76907. "ands r6, r6, r7\n\t"
  76908. #elif defined(__clang__)
  76909. "ands r6, r7\n\t"
  76910. #else
  76911. "and r6, r7\n\t"
  76912. #endif
  76913. "ldr r5, [%[a], r4]\n\t"
  76914. #ifdef WOLFSSL_KEIL
  76915. "sbcs r5, r5, r6\n\t"
  76916. #elif defined(__clang__)
  76917. "sbcs r5, r6\n\t"
  76918. #else
  76919. "sbc r5, r6\n\t"
  76920. #endif
  76921. "stm %[a]!, {r5}\n\t"
  76922. "ldm %[m]!, {r6}\n\t"
  76923. #ifdef WOLFSSL_KEIL
  76924. "ands r6, r6, r7\n\t"
  76925. #elif defined(__clang__)
  76926. "ands r6, r7\n\t"
  76927. #else
  76928. "and r6, r7\n\t"
  76929. #endif
  76930. "ldr r5, [%[a], r4]\n\t"
  76931. #ifdef WOLFSSL_KEIL
  76932. "sbcs r5, r5, r6\n\t"
  76933. #elif defined(__clang__)
  76934. "sbcs r5, r6\n\t"
  76935. #else
  76936. "sbc r5, r6\n\t"
  76937. #endif
  76938. "stm %[a]!, {r5}\n\t"
  76939. "ldm %[m]!, {r6}\n\t"
  76940. #ifdef WOLFSSL_KEIL
  76941. "ands r6, r6, r7\n\t"
  76942. #elif defined(__clang__)
  76943. "ands r6, r7\n\t"
  76944. #else
  76945. "and r6, r7\n\t"
  76946. #endif
  76947. "ldr r5, [%[a], r4]\n\t"
  76948. #ifdef WOLFSSL_KEIL
  76949. "sbcs r5, r5, r6\n\t"
  76950. #elif defined(__clang__)
  76951. "sbcs r5, r6\n\t"
  76952. #else
  76953. "sbc r5, r6\n\t"
  76954. #endif
  76955. "stm %[a]!, {r5}\n\t"
  76956. "ldm %[m]!, {r6}\n\t"
  76957. #ifdef WOLFSSL_KEIL
  76958. "ands r6, r6, r7\n\t"
  76959. #elif defined(__clang__)
  76960. "ands r6, r7\n\t"
  76961. #else
  76962. "and r6, r7\n\t"
  76963. #endif
  76964. "ldr r5, [%[a], r4]\n\t"
  76965. #ifdef WOLFSSL_KEIL
  76966. "sbcs r5, r5, r6\n\t"
  76967. #elif defined(__clang__)
  76968. "sbcs r5, r6\n\t"
  76969. #else
  76970. "sbc r5, r6\n\t"
  76971. #endif
  76972. "stm %[a]!, {r5}\n\t"
  76973. "ldm %[m]!, {r6}\n\t"
  76974. #ifdef WOLFSSL_KEIL
  76975. "ands r6, r6, r7\n\t"
  76976. #elif defined(__clang__)
  76977. "ands r6, r7\n\t"
  76978. #else
  76979. "and r6, r7\n\t"
  76980. #endif
  76981. "ldr r5, [%[a], r4]\n\t"
  76982. #ifdef WOLFSSL_KEIL
  76983. "sbcs r5, r5, r6\n\t"
  76984. #elif defined(__clang__)
  76985. "sbcs r5, r6\n\t"
  76986. #else
  76987. "sbc r5, r6\n\t"
  76988. #endif
  76989. "stm %[a]!, {r5}\n\t"
  76990. "ldm %[m]!, {r6}\n\t"
  76991. #ifdef WOLFSSL_KEIL
  76992. "ands r6, r6, r7\n\t"
  76993. #elif defined(__clang__)
  76994. "ands r6, r7\n\t"
  76995. #else
  76996. "and r6, r7\n\t"
  76997. #endif
  76998. "ldr r5, [%[a], r4]\n\t"
  76999. #ifdef WOLFSSL_KEIL
  77000. "sbcs r5, r5, r6\n\t"
  77001. #elif defined(__clang__)
  77002. "sbcs r5, r6\n\t"
  77003. #else
  77004. "sbc r5, r6\n\t"
  77005. #endif
  77006. "stm %[a]!, {r5}\n\t"
  77007. "ldm %[m]!, {r6}\n\t"
  77008. #ifdef WOLFSSL_KEIL
  77009. "ands r6, r6, r7\n\t"
  77010. #elif defined(__clang__)
  77011. "ands r6, r7\n\t"
  77012. #else
  77013. "and r6, r7\n\t"
  77014. #endif
  77015. "ldr r5, [%[a], r4]\n\t"
  77016. #ifdef WOLFSSL_KEIL
  77017. "sbcs r5, r5, r6\n\t"
  77018. #elif defined(__clang__)
  77019. "sbcs r5, r6\n\t"
  77020. #else
  77021. "sbc r5, r6\n\t"
  77022. #endif
  77023. "stm %[a]!, {r5}\n\t"
  77024. "ldm %[m]!, {r6}\n\t"
  77025. #ifdef WOLFSSL_KEIL
  77026. "ands r6, r6, r7\n\t"
  77027. #elif defined(__clang__)
  77028. "ands r6, r7\n\t"
  77029. #else
  77030. "and r6, r7\n\t"
  77031. #endif
  77032. "ldr r5, [%[a], r4]\n\t"
  77033. #ifdef WOLFSSL_KEIL
  77034. "sbcs r5, r5, r6\n\t"
  77035. #elif defined(__clang__)
  77036. "sbcs r5, r6\n\t"
  77037. #else
  77038. "sbc r5, r6\n\t"
  77039. #endif
  77040. "stm %[a]!, {r5}\n\t"
  77041. "ldm %[m]!, {r6}\n\t"
  77042. #ifdef WOLFSSL_KEIL
  77043. "ands r6, r6, r7\n\t"
  77044. #elif defined(__clang__)
  77045. "ands r6, r7\n\t"
  77046. #else
  77047. "and r6, r7\n\t"
  77048. #endif
  77049. "ldr r5, [%[a], r4]\n\t"
  77050. #ifdef WOLFSSL_KEIL
  77051. "sbcs r5, r5, r6\n\t"
  77052. #elif defined(__clang__)
  77053. "sbcs r5, r6\n\t"
  77054. #else
  77055. "sbc r5, r6\n\t"
  77056. #endif
  77057. "stm %[a]!, {r5}\n\t"
  77058. "ldm %[m]!, {r6}\n\t"
  77059. #ifdef WOLFSSL_KEIL
  77060. "ands r6, r6, r7\n\t"
  77061. #elif defined(__clang__)
  77062. "ands r6, r7\n\t"
  77063. #else
  77064. "and r6, r7\n\t"
  77065. #endif
  77066. "ldr r5, [%[a], r4]\n\t"
  77067. #ifdef WOLFSSL_KEIL
  77068. "sbcs r5, r5, r6\n\t"
  77069. #elif defined(__clang__)
  77070. "sbcs r5, r6\n\t"
  77071. #else
  77072. "sbc r5, r6\n\t"
  77073. #endif
  77074. "stm %[a]!, {r5}\n\t"
  77075. "ldm %[m]!, {r6}\n\t"
  77076. #ifdef WOLFSSL_KEIL
  77077. "ands r6, r6, r7\n\t"
  77078. #elif defined(__clang__)
  77079. "ands r6, r7\n\t"
  77080. #else
  77081. "and r6, r7\n\t"
  77082. #endif
  77083. "ldr r5, [%[a], r4]\n\t"
  77084. #ifdef WOLFSSL_KEIL
  77085. "sbcs r5, r5, r6\n\t"
  77086. #elif defined(__clang__)
  77087. "sbcs r5, r6\n\t"
  77088. #else
  77089. "sbc r5, r6\n\t"
  77090. #endif
  77091. "stm %[a]!, {r5}\n\t"
  77092. "ldm %[m]!, {r6}\n\t"
  77093. #ifdef WOLFSSL_KEIL
  77094. "ands r6, r6, r7\n\t"
  77095. #elif defined(__clang__)
  77096. "ands r6, r7\n\t"
  77097. #else
  77098. "and r6, r7\n\t"
  77099. #endif
  77100. "ldr r5, [%[a], r4]\n\t"
  77101. #ifdef WOLFSSL_KEIL
  77102. "sbcs r5, r5, r6\n\t"
  77103. #elif defined(__clang__)
  77104. "sbcs r5, r6\n\t"
  77105. #else
  77106. "sbc r5, r6\n\t"
  77107. #endif
  77108. "stm %[a]!, {r5}\n\t"
  77109. "ldm %[m]!, {r6}\n\t"
  77110. #ifdef WOLFSSL_KEIL
  77111. "ands r6, r6, r7\n\t"
  77112. #elif defined(__clang__)
  77113. "ands r6, r7\n\t"
  77114. #else
  77115. "and r6, r7\n\t"
  77116. #endif
  77117. "ldr r5, [%[a], r4]\n\t"
  77118. #ifdef WOLFSSL_KEIL
  77119. "sbcs r5, r5, r6\n\t"
  77120. #elif defined(__clang__)
  77121. "sbcs r5, r6\n\t"
  77122. #else
  77123. "sbc r5, r6\n\t"
  77124. #endif
  77125. "stm %[a]!, {r5}\n\t"
  77126. "ldm %[m]!, {r6}\n\t"
  77127. #ifdef WOLFSSL_KEIL
  77128. "ands r6, r6, r7\n\t"
  77129. #elif defined(__clang__)
  77130. "ands r6, r7\n\t"
  77131. #else
  77132. "and r6, r7\n\t"
  77133. #endif
  77134. "ldr r5, [%[a], r4]\n\t"
  77135. #ifdef WOLFSSL_KEIL
  77136. "sbcs r5, r5, r6\n\t"
  77137. #elif defined(__clang__)
  77138. "sbcs r5, r6\n\t"
  77139. #else
  77140. "sbc r5, r6\n\t"
  77141. #endif
  77142. "stm %[a]!, {r5}\n\t"
  77143. "ldm %[m]!, {r6}\n\t"
  77144. #ifdef WOLFSSL_KEIL
  77145. "ands r6, r6, r7\n\t"
  77146. #elif defined(__clang__)
  77147. "ands r6, r7\n\t"
  77148. #else
  77149. "and r6, r7\n\t"
  77150. #endif
  77151. "ldr r5, [%[a], r4]\n\t"
  77152. #ifdef WOLFSSL_KEIL
  77153. "sbcs r5, r5, r6\n\t"
  77154. #elif defined(__clang__)
  77155. "sbcs r5, r6\n\t"
  77156. #else
  77157. "sbc r5, r6\n\t"
  77158. #endif
  77159. "stm %[a]!, {r5}\n\t"
  77160. "ldm %[m]!, {r6}\n\t"
  77161. #ifdef WOLFSSL_KEIL
  77162. "ands r6, r6, r7\n\t"
  77163. #elif defined(__clang__)
  77164. "ands r6, r7\n\t"
  77165. #else
  77166. "and r6, r7\n\t"
  77167. #endif
  77168. "ldr r5, [%[a], r4]\n\t"
  77169. #ifdef WOLFSSL_KEIL
  77170. "sbcs r5, r5, r6\n\t"
  77171. #elif defined(__clang__)
  77172. "sbcs r5, r6\n\t"
  77173. #else
  77174. "sbc r5, r6\n\t"
  77175. #endif
  77176. "stm %[a]!, {r5}\n\t"
  77177. "ldm %[m]!, {r6}\n\t"
  77178. #ifdef WOLFSSL_KEIL
  77179. "ands r6, r6, r7\n\t"
  77180. #elif defined(__clang__)
  77181. "ands r6, r7\n\t"
  77182. #else
  77183. "and r6, r7\n\t"
  77184. #endif
  77185. "ldr r5, [%[a], r4]\n\t"
  77186. #ifdef WOLFSSL_KEIL
  77187. "sbcs r5, r5, r6\n\t"
  77188. #elif defined(__clang__)
  77189. "sbcs r5, r6\n\t"
  77190. #else
  77191. "sbc r5, r6\n\t"
  77192. #endif
  77193. "stm %[a]!, {r5}\n\t"
  77194. "ldm %[m]!, {r6}\n\t"
  77195. #ifdef WOLFSSL_KEIL
  77196. "ands r6, r6, r7\n\t"
  77197. #elif defined(__clang__)
  77198. "ands r6, r7\n\t"
  77199. #else
  77200. "and r6, r7\n\t"
  77201. #endif
  77202. "ldr r5, [%[a], r4]\n\t"
  77203. #ifdef WOLFSSL_KEIL
  77204. "sbcs r5, r5, r6\n\t"
  77205. #elif defined(__clang__)
  77206. "sbcs r5, r6\n\t"
  77207. #else
  77208. "sbc r5, r6\n\t"
  77209. #endif
  77210. "stm %[a]!, {r5}\n\t"
  77211. "ldm %[m]!, {r6}\n\t"
  77212. #ifdef WOLFSSL_KEIL
  77213. "ands r6, r6, r7\n\t"
  77214. #elif defined(__clang__)
  77215. "ands r6, r7\n\t"
  77216. #else
  77217. "and r6, r7\n\t"
  77218. #endif
  77219. "ldr r5, [%[a], r4]\n\t"
  77220. #ifdef WOLFSSL_KEIL
  77221. "sbcs r5, r5, r6\n\t"
  77222. #elif defined(__clang__)
  77223. "sbcs r5, r6\n\t"
  77224. #else
  77225. "sbc r5, r6\n\t"
  77226. #endif
  77227. "stm %[a]!, {r5}\n\t"
  77228. "ldm %[m]!, {r6}\n\t"
  77229. #ifdef WOLFSSL_KEIL
  77230. "ands r6, r6, r7\n\t"
  77231. #elif defined(__clang__)
  77232. "ands r6, r7\n\t"
  77233. #else
  77234. "and r6, r7\n\t"
  77235. #endif
  77236. "ldr r5, [%[a], r4]\n\t"
  77237. #ifdef WOLFSSL_KEIL
  77238. "sbcs r5, r5, r6\n\t"
  77239. #elif defined(__clang__)
  77240. "sbcs r5, r6\n\t"
  77241. #else
  77242. "sbc r5, r6\n\t"
  77243. #endif
  77244. "stm %[a]!, {r5}\n\t"
  77245. "ldm %[m]!, {r6}\n\t"
  77246. #ifdef WOLFSSL_KEIL
  77247. "ands r6, r6, r7\n\t"
  77248. #elif defined(__clang__)
  77249. "ands r6, r7\n\t"
  77250. #else
  77251. "and r6, r7\n\t"
  77252. #endif
  77253. "ldr r5, [%[a], r4]\n\t"
  77254. #ifdef WOLFSSL_KEIL
  77255. "sbcs r5, r5, r6\n\t"
  77256. #elif defined(__clang__)
  77257. "sbcs r5, r6\n\t"
  77258. #else
  77259. "sbc r5, r6\n\t"
  77260. #endif
  77261. "stm %[a]!, {r5}\n\t"
  77262. "ldm %[m]!, {r6}\n\t"
  77263. #ifdef WOLFSSL_KEIL
  77264. "ands r6, r6, r7\n\t"
  77265. #elif defined(__clang__)
  77266. "ands r6, r7\n\t"
  77267. #else
  77268. "and r6, r7\n\t"
  77269. #endif
  77270. "ldr r5, [%[a], r4]\n\t"
  77271. #ifdef WOLFSSL_KEIL
  77272. "sbcs r5, r5, r6\n\t"
  77273. #elif defined(__clang__)
  77274. "sbcs r5, r6\n\t"
  77275. #else
  77276. "sbc r5, r6\n\t"
  77277. #endif
  77278. "stm %[a]!, {r5}\n\t"
  77279. "ldm %[m]!, {r6}\n\t"
  77280. #ifdef WOLFSSL_KEIL
  77281. "ands r6, r6, r7\n\t"
  77282. #elif defined(__clang__)
  77283. "ands r6, r7\n\t"
  77284. #else
  77285. "and r6, r7\n\t"
  77286. #endif
  77287. "ldr r5, [%[a], r4]\n\t"
  77288. #ifdef WOLFSSL_KEIL
  77289. "sbcs r5, r5, r6\n\t"
  77290. #elif defined(__clang__)
  77291. "sbcs r5, r6\n\t"
  77292. #else
  77293. "sbc r5, r6\n\t"
  77294. #endif
  77295. "stm %[a]!, {r5}\n\t"
  77296. "ldm %[m]!, {r6}\n\t"
  77297. #ifdef WOLFSSL_KEIL
  77298. "ands r6, r6, r7\n\t"
  77299. #elif defined(__clang__)
  77300. "ands r6, r7\n\t"
  77301. #else
  77302. "and r6, r7\n\t"
  77303. #endif
  77304. "ldr r5, [%[a], r4]\n\t"
  77305. #ifdef WOLFSSL_KEIL
  77306. "sbcs r5, r5, r6\n\t"
  77307. #elif defined(__clang__)
  77308. "sbcs r5, r6\n\t"
  77309. #else
  77310. "sbc r5, r6\n\t"
  77311. #endif
  77312. "stm %[a]!, {r5}\n\t"
  77313. "ldm %[m]!, {r6}\n\t"
  77314. #ifdef WOLFSSL_KEIL
  77315. "ands r6, r6, r7\n\t"
  77316. #elif defined(__clang__)
  77317. "ands r6, r7\n\t"
  77318. #else
  77319. "and r6, r7\n\t"
  77320. #endif
  77321. "ldr r5, [%[a], r4]\n\t"
  77322. #ifdef WOLFSSL_KEIL
  77323. "sbcs r5, r5, r6\n\t"
  77324. #elif defined(__clang__)
  77325. "sbcs r5, r6\n\t"
  77326. #else
  77327. "sbc r5, r6\n\t"
  77328. #endif
  77329. "stm %[a]!, {r5}\n\t"
  77330. "ldm %[m]!, {r6}\n\t"
  77331. #ifdef WOLFSSL_KEIL
  77332. "ands r6, r6, r7\n\t"
  77333. #elif defined(__clang__)
  77334. "ands r6, r7\n\t"
  77335. #else
  77336. "and r6, r7\n\t"
  77337. #endif
  77338. "ldr r5, [%[a], r4]\n\t"
  77339. #ifdef WOLFSSL_KEIL
  77340. "sbcs r5, r5, r6\n\t"
  77341. #elif defined(__clang__)
  77342. "sbcs r5, r6\n\t"
  77343. #else
  77344. "sbc r5, r6\n\t"
  77345. #endif
  77346. "stm %[a]!, {r5}\n\t"
  77347. "ldm %[m]!, {r6}\n\t"
  77348. #ifdef WOLFSSL_KEIL
  77349. "ands r6, r6, r7\n\t"
  77350. #elif defined(__clang__)
  77351. "ands r6, r7\n\t"
  77352. #else
  77353. "and r6, r7\n\t"
  77354. #endif
  77355. "ldr r5, [%[a], r4]\n\t"
  77356. #ifdef WOLFSSL_KEIL
  77357. "sbcs r5, r5, r6\n\t"
  77358. #elif defined(__clang__)
  77359. "sbcs r5, r6\n\t"
  77360. #else
  77361. "sbc r5, r6\n\t"
  77362. #endif
  77363. "stm %[a]!, {r5}\n\t"
  77364. "ldm %[m]!, {r6}\n\t"
  77365. #ifdef WOLFSSL_KEIL
  77366. "ands r6, r6, r7\n\t"
  77367. #elif defined(__clang__)
  77368. "ands r6, r7\n\t"
  77369. #else
  77370. "and r6, r7\n\t"
  77371. #endif
  77372. "ldr r5, [%[a], r4]\n\t"
  77373. #ifdef WOLFSSL_KEIL
  77374. "sbcs r5, r5, r6\n\t"
  77375. #elif defined(__clang__)
  77376. "sbcs r5, r6\n\t"
  77377. #else
  77378. "sbc r5, r6\n\t"
  77379. #endif
  77380. "stm %[a]!, {r5}\n\t"
  77381. "ldm %[m]!, {r6}\n\t"
  77382. #ifdef WOLFSSL_KEIL
  77383. "ands r6, r6, r7\n\t"
  77384. #elif defined(__clang__)
  77385. "ands r6, r7\n\t"
  77386. #else
  77387. "and r6, r7\n\t"
  77388. #endif
  77389. "ldr r5, [%[a], r4]\n\t"
  77390. #ifdef WOLFSSL_KEIL
  77391. "sbcs r5, r5, r6\n\t"
  77392. #elif defined(__clang__)
  77393. "sbcs r5, r6\n\t"
  77394. #else
  77395. "sbc r5, r6\n\t"
  77396. #endif
  77397. "stm %[a]!, {r5}\n\t"
  77398. "ldm %[m]!, {r6}\n\t"
  77399. #ifdef WOLFSSL_KEIL
  77400. "ands r6, r6, r7\n\t"
  77401. #elif defined(__clang__)
  77402. "ands r6, r7\n\t"
  77403. #else
  77404. "and r6, r7\n\t"
  77405. #endif
  77406. "ldr r5, [%[a], r4]\n\t"
  77407. #ifdef WOLFSSL_KEIL
  77408. "sbcs r5, r5, r6\n\t"
  77409. #elif defined(__clang__)
  77410. "sbcs r5, r6\n\t"
  77411. #else
  77412. "sbc r5, r6\n\t"
  77413. #endif
  77414. "stm %[a]!, {r5}\n\t"
  77415. "ldm %[m]!, {r6}\n\t"
  77416. #ifdef WOLFSSL_KEIL
  77417. "ands r6, r6, r7\n\t"
  77418. #elif defined(__clang__)
  77419. "ands r6, r7\n\t"
  77420. #else
  77421. "and r6, r7\n\t"
  77422. #endif
  77423. "ldr r5, [%[a], r4]\n\t"
  77424. #ifdef WOLFSSL_KEIL
  77425. "sbcs r5, r5, r6\n\t"
  77426. #elif defined(__clang__)
  77427. "sbcs r5, r6\n\t"
  77428. #else
  77429. "sbc r5, r6\n\t"
  77430. #endif
  77431. "stm %[a]!, {r5}\n\t"
  77432. "ldm %[m]!, {r6}\n\t"
  77433. #ifdef WOLFSSL_KEIL
  77434. "ands r6, r6, r7\n\t"
  77435. #elif defined(__clang__)
  77436. "ands r6, r7\n\t"
  77437. #else
  77438. "and r6, r7\n\t"
  77439. #endif
  77440. "ldr r5, [%[a], r4]\n\t"
  77441. #ifdef WOLFSSL_KEIL
  77442. "sbcs r5, r5, r6\n\t"
  77443. #elif defined(__clang__)
  77444. "sbcs r5, r6\n\t"
  77445. #else
  77446. "sbc r5, r6\n\t"
  77447. #endif
  77448. "stm %[a]!, {r5}\n\t"
  77449. "ldm %[m]!, {r6}\n\t"
  77450. #ifdef WOLFSSL_KEIL
  77451. "ands r6, r6, r7\n\t"
  77452. #elif defined(__clang__)
  77453. "ands r6, r7\n\t"
  77454. #else
  77455. "and r6, r7\n\t"
  77456. #endif
  77457. "ldr r5, [%[a], r4]\n\t"
  77458. #ifdef WOLFSSL_KEIL
  77459. "sbcs r5, r5, r6\n\t"
  77460. #elif defined(__clang__)
  77461. "sbcs r5, r6\n\t"
  77462. #else
  77463. "sbc r5, r6\n\t"
  77464. #endif
  77465. "stm %[a]!, {r5}\n\t"
  77466. "ldm %[m]!, {r6}\n\t"
  77467. #ifdef WOLFSSL_KEIL
  77468. "ands r6, r6, r7\n\t"
  77469. #elif defined(__clang__)
  77470. "ands r6, r7\n\t"
  77471. #else
  77472. "and r6, r7\n\t"
  77473. #endif
  77474. "ldr r5, [%[a], r4]\n\t"
  77475. #ifdef WOLFSSL_KEIL
  77476. "sbcs r5, r5, r6\n\t"
  77477. #elif defined(__clang__)
  77478. "sbcs r5, r6\n\t"
  77479. #else
  77480. "sbc r5, r6\n\t"
  77481. #endif
  77482. "stm %[a]!, {r5}\n\t"
  77483. "ldm %[m]!, {r6}\n\t"
  77484. #ifdef WOLFSSL_KEIL
  77485. "ands r6, r6, r7\n\t"
  77486. #elif defined(__clang__)
  77487. "ands r6, r7\n\t"
  77488. #else
  77489. "and r6, r7\n\t"
  77490. #endif
  77491. "ldr r5, [%[a], r4]\n\t"
  77492. #ifdef WOLFSSL_KEIL
  77493. "sbcs r5, r5, r6\n\t"
  77494. #elif defined(__clang__)
  77495. "sbcs r5, r6\n\t"
  77496. #else
  77497. "sbc r5, r6\n\t"
  77498. #endif
  77499. "stm %[a]!, {r5}\n\t"
  77500. "ldm %[m]!, {r6}\n\t"
  77501. #ifdef WOLFSSL_KEIL
  77502. "ands r6, r6, r7\n\t"
  77503. #elif defined(__clang__)
  77504. "ands r6, r7\n\t"
  77505. #else
  77506. "and r6, r7\n\t"
  77507. #endif
  77508. "ldr r5, [%[a], r4]\n\t"
  77509. #ifdef WOLFSSL_KEIL
  77510. "sbcs r5, r5, r6\n\t"
  77511. #elif defined(__clang__)
  77512. "sbcs r5, r6\n\t"
  77513. #else
  77514. "sbc r5, r6\n\t"
  77515. #endif
  77516. "stm %[a]!, {r5}\n\t"
  77517. "ldm %[m]!, {r6}\n\t"
  77518. #ifdef WOLFSSL_KEIL
  77519. "ands r6, r6, r7\n\t"
  77520. #elif defined(__clang__)
  77521. "ands r6, r7\n\t"
  77522. #else
  77523. "and r6, r7\n\t"
  77524. #endif
  77525. "ldr r5, [%[a], r4]\n\t"
  77526. #ifdef WOLFSSL_KEIL
  77527. "sbcs r5, r5, r6\n\t"
  77528. #elif defined(__clang__)
  77529. "sbcs r5, r6\n\t"
  77530. #else
  77531. "sbc r5, r6\n\t"
  77532. #endif
  77533. "stm %[a]!, {r5}\n\t"
  77534. "ldm %[m]!, {r6}\n\t"
  77535. #ifdef WOLFSSL_KEIL
  77536. "ands r6, r6, r7\n\t"
  77537. #elif defined(__clang__)
  77538. "ands r6, r7\n\t"
  77539. #else
  77540. "and r6, r7\n\t"
  77541. #endif
  77542. "ldr r5, [%[a], r4]\n\t"
  77543. #ifdef WOLFSSL_KEIL
  77544. "sbcs r5, r5, r6\n\t"
  77545. #elif defined(__clang__)
  77546. "sbcs r5, r6\n\t"
  77547. #else
  77548. "sbc r5, r6\n\t"
  77549. #endif
  77550. "stm %[a]!, {r5}\n\t"
  77551. "ldm %[m]!, {r6}\n\t"
  77552. #ifdef WOLFSSL_KEIL
  77553. "ands r6, r6, r7\n\t"
  77554. #elif defined(__clang__)
  77555. "ands r6, r7\n\t"
  77556. #else
  77557. "and r6, r7\n\t"
  77558. #endif
  77559. "ldr r5, [%[a], r4]\n\t"
  77560. #ifdef WOLFSSL_KEIL
  77561. "sbcs r5, r5, r6\n\t"
  77562. #elif defined(__clang__)
  77563. "sbcs r5, r6\n\t"
  77564. #else
  77565. "sbc r5, r6\n\t"
  77566. #endif
  77567. "stm %[a]!, {r5}\n\t"
  77568. "ldm %[m]!, {r6}\n\t"
  77569. #ifdef WOLFSSL_KEIL
  77570. "ands r6, r6, r7\n\t"
  77571. #elif defined(__clang__)
  77572. "ands r6, r7\n\t"
  77573. #else
  77574. "and r6, r7\n\t"
  77575. #endif
  77576. "ldr r5, [%[a], r4]\n\t"
  77577. #ifdef WOLFSSL_KEIL
  77578. "sbcs r5, r5, r6\n\t"
  77579. #elif defined(__clang__)
  77580. "sbcs r5, r6\n\t"
  77581. #else
  77582. "sbc r5, r6\n\t"
  77583. #endif
  77584. "stm %[a]!, {r5}\n\t"
  77585. "ldm %[m]!, {r6}\n\t"
  77586. #ifdef WOLFSSL_KEIL
  77587. "ands r6, r6, r7\n\t"
  77588. #elif defined(__clang__)
  77589. "ands r6, r7\n\t"
  77590. #else
  77591. "and r6, r7\n\t"
  77592. #endif
  77593. "ldr r5, [%[a], r4]\n\t"
  77594. #ifdef WOLFSSL_KEIL
  77595. "sbcs r5, r5, r6\n\t"
  77596. #elif defined(__clang__)
  77597. "sbcs r5, r6\n\t"
  77598. #else
  77599. "sbc r5, r6\n\t"
  77600. #endif
  77601. "stm %[a]!, {r5}\n\t"
  77602. #endif /* WOLFSSL_SP_LARGE_CODE */
  77603. : [a] "+l" (a), [m] "+l" (m), [mp] "+l" (mp)
  77604. :
  77605. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr"
  77606. );
  77607. }
  77608. /* Multiply two Montgomery form numbers mod the modulus (prime).
  77609. * (r = a * b mod m)
  77610. *
  77611. * r Result of multiplication.
  77612. * a First number to multiply in Montgomery form.
  77613. * b Second number to multiply in Montgomery form.
  77614. * m Modulus (prime).
  77615. * mp Montgomery mulitplier.
  77616. */
  77617. SP_NOINLINE static void sp_3072_mont_mul_96(sp_digit* r, const sp_digit* a,
  77618. const sp_digit* b, const sp_digit* m, sp_digit mp)
  77619. {
  77620. sp_3072_mul_96(r, a, b);
  77621. sp_3072_mont_reduce_96(r, m, mp);
  77622. }
  77623. /* Square the Montgomery form number. (r = a * a mod m)
  77624. *
  77625. * r Result of squaring.
  77626. * a Number to square in Montgomery form.
  77627. * m Modulus (prime).
  77628. * mp Montgomery mulitplier.
  77629. */
  77630. SP_NOINLINE static void sp_3072_mont_sqr_96(sp_digit* r, const sp_digit* a,
  77631. const sp_digit* m, sp_digit mp)
  77632. {
  77633. sp_3072_sqr_96(r, a);
  77634. sp_3072_mont_reduce_96(r, m, mp);
  77635. }
  77636. #ifdef WOLFSSL_SP_SMALL
  77637. /* Sub b from a into r. (r = a - b)
  77638. *
  77639. * r A single precision integer.
  77640. * a A single precision integer.
  77641. * b A single precision integer.
  77642. */
  77643. SP_NOINLINE static sp_digit sp_3072_sub_96(sp_digit* r, const sp_digit* a,
  77644. const sp_digit* b)
  77645. {
  77646. __asm__ __volatile__ (
  77647. "movs r6, %[a]\n\t"
  77648. "movs r3, #0\n\t"
  77649. "movs r5, #0xff\n\t"
  77650. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  77651. "adds r5, r5, #0x81\n\t"
  77652. #else
  77653. "add r5, r5, #0x81\n\t"
  77654. #endif
  77655. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  77656. "adds r6, r6, r5\n\t"
  77657. #else
  77658. "add r6, r6, r5\n\t"
  77659. #endif
  77660. "\n"
  77661. "L_sp_3072_sub_96_word_%=:\n\t"
  77662. "movs r5, #0\n\t"
  77663. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  77664. "subs r5, r5, r3\n\t"
  77665. #else
  77666. "sub r5, r5, r3\n\t"
  77667. #endif
  77668. "ldr r4, [%[a]]\n\t"
  77669. "ldr r5, [%[b]]\n\t"
  77670. #ifdef WOLFSSL_KEIL
  77671. "sbcs r4, r4, r5\n\t"
  77672. #elif defined(__clang__)
  77673. "sbcs r4, r5\n\t"
  77674. #else
  77675. "sbc r4, r5\n\t"
  77676. #endif
  77677. "str r4, [%[r]]\n\t"
  77678. #ifdef WOLFSSL_KEIL
  77679. "sbcs r3, r3, r3\n\t"
  77680. #elif defined(__clang__)
  77681. "sbcs r3, r3\n\t"
  77682. #else
  77683. "sbc r3, r3\n\t"
  77684. #endif
  77685. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  77686. "adds %[a], %[a], #4\n\t"
  77687. #else
  77688. "add %[a], %[a], #4\n\t"
  77689. #endif
  77690. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  77691. "adds %[b], %[b], #4\n\t"
  77692. #else
  77693. "add %[b], %[b], #4\n\t"
  77694. #endif
  77695. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  77696. "adds %[r], %[r], #4\n\t"
  77697. #else
  77698. "add %[r], %[r], #4\n\t"
  77699. #endif
  77700. "cmp %[a], r6\n\t"
  77701. "bne L_sp_3072_sub_96_word_%=\n\t"
  77702. "movs %[r], r3\n\t"
  77703. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  77704. :
  77705. : "memory", "r3", "r4", "r5", "r6"
  77706. );
  77707. return (uint32_t)(size_t)r;
  77708. }
  77709. #else
  77710. /* Sub b from a into r. (r = a - b)
  77711. *
  77712. * r A single precision integer.
  77713. * a A single precision integer.
  77714. * b A single precision integer.
  77715. */
  77716. SP_NOINLINE static sp_digit sp_3072_sub_96(sp_digit* r, const sp_digit* a,
  77717. const sp_digit* b)
  77718. {
  77719. __asm__ __volatile__ (
  77720. "ldm %[b]!, {r5, r6}\n\t"
  77721. "ldm %[a]!, {r3, r4}\n\t"
  77722. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  77723. "subs r3, r3, r5\n\t"
  77724. #else
  77725. "sub r3, r3, r5\n\t"
  77726. #endif
  77727. #ifdef WOLFSSL_KEIL
  77728. "sbcs r4, r4, r6\n\t"
  77729. #elif defined(__clang__)
  77730. "sbcs r4, r6\n\t"
  77731. #else
  77732. "sbc r4, r6\n\t"
  77733. #endif
  77734. "stm %[r]!, {r3, r4}\n\t"
  77735. "ldm %[b]!, {r5, r6}\n\t"
  77736. "ldm %[a]!, {r3, r4}\n\t"
  77737. #ifdef WOLFSSL_KEIL
  77738. "sbcs r3, r3, r5\n\t"
  77739. #elif defined(__clang__)
  77740. "sbcs r3, r5\n\t"
  77741. #else
  77742. "sbc r3, r5\n\t"
  77743. #endif
  77744. #ifdef WOLFSSL_KEIL
  77745. "sbcs r4, r4, r6\n\t"
  77746. #elif defined(__clang__)
  77747. "sbcs r4, r6\n\t"
  77748. #else
  77749. "sbc r4, r6\n\t"
  77750. #endif
  77751. "stm %[r]!, {r3, r4}\n\t"
  77752. "ldm %[b]!, {r5, r6}\n\t"
  77753. "ldm %[a]!, {r3, r4}\n\t"
  77754. #ifdef WOLFSSL_KEIL
  77755. "sbcs r3, r3, r5\n\t"
  77756. #elif defined(__clang__)
  77757. "sbcs r3, r5\n\t"
  77758. #else
  77759. "sbc r3, r5\n\t"
  77760. #endif
  77761. #ifdef WOLFSSL_KEIL
  77762. "sbcs r4, r4, r6\n\t"
  77763. #elif defined(__clang__)
  77764. "sbcs r4, r6\n\t"
  77765. #else
  77766. "sbc r4, r6\n\t"
  77767. #endif
  77768. "stm %[r]!, {r3, r4}\n\t"
  77769. "ldm %[b]!, {r5, r6}\n\t"
  77770. "ldm %[a]!, {r3, r4}\n\t"
  77771. #ifdef WOLFSSL_KEIL
  77772. "sbcs r3, r3, r5\n\t"
  77773. #elif defined(__clang__)
  77774. "sbcs r3, r5\n\t"
  77775. #else
  77776. "sbc r3, r5\n\t"
  77777. #endif
  77778. #ifdef WOLFSSL_KEIL
  77779. "sbcs r4, r4, r6\n\t"
  77780. #elif defined(__clang__)
  77781. "sbcs r4, r6\n\t"
  77782. #else
  77783. "sbc r4, r6\n\t"
  77784. #endif
  77785. "stm %[r]!, {r3, r4}\n\t"
  77786. "ldm %[b]!, {r5, r6}\n\t"
  77787. "ldm %[a]!, {r3, r4}\n\t"
  77788. #ifdef WOLFSSL_KEIL
  77789. "sbcs r3, r3, r5\n\t"
  77790. #elif defined(__clang__)
  77791. "sbcs r3, r5\n\t"
  77792. #else
  77793. "sbc r3, r5\n\t"
  77794. #endif
  77795. #ifdef WOLFSSL_KEIL
  77796. "sbcs r4, r4, r6\n\t"
  77797. #elif defined(__clang__)
  77798. "sbcs r4, r6\n\t"
  77799. #else
  77800. "sbc r4, r6\n\t"
  77801. #endif
  77802. "stm %[r]!, {r3, r4}\n\t"
  77803. "ldm %[b]!, {r5, r6}\n\t"
  77804. "ldm %[a]!, {r3, r4}\n\t"
  77805. #ifdef WOLFSSL_KEIL
  77806. "sbcs r3, r3, r5\n\t"
  77807. #elif defined(__clang__)
  77808. "sbcs r3, r5\n\t"
  77809. #else
  77810. "sbc r3, r5\n\t"
  77811. #endif
  77812. #ifdef WOLFSSL_KEIL
  77813. "sbcs r4, r4, r6\n\t"
  77814. #elif defined(__clang__)
  77815. "sbcs r4, r6\n\t"
  77816. #else
  77817. "sbc r4, r6\n\t"
  77818. #endif
  77819. "stm %[r]!, {r3, r4}\n\t"
  77820. "ldm %[b]!, {r5, r6}\n\t"
  77821. "ldm %[a]!, {r3, r4}\n\t"
  77822. #ifdef WOLFSSL_KEIL
  77823. "sbcs r3, r3, r5\n\t"
  77824. #elif defined(__clang__)
  77825. "sbcs r3, r5\n\t"
  77826. #else
  77827. "sbc r3, r5\n\t"
  77828. #endif
  77829. #ifdef WOLFSSL_KEIL
  77830. "sbcs r4, r4, r6\n\t"
  77831. #elif defined(__clang__)
  77832. "sbcs r4, r6\n\t"
  77833. #else
  77834. "sbc r4, r6\n\t"
  77835. #endif
  77836. "stm %[r]!, {r3, r4}\n\t"
  77837. "ldm %[b]!, {r5, r6}\n\t"
  77838. "ldm %[a]!, {r3, r4}\n\t"
  77839. #ifdef WOLFSSL_KEIL
  77840. "sbcs r3, r3, r5\n\t"
  77841. #elif defined(__clang__)
  77842. "sbcs r3, r5\n\t"
  77843. #else
  77844. "sbc r3, r5\n\t"
  77845. #endif
  77846. #ifdef WOLFSSL_KEIL
  77847. "sbcs r4, r4, r6\n\t"
  77848. #elif defined(__clang__)
  77849. "sbcs r4, r6\n\t"
  77850. #else
  77851. "sbc r4, r6\n\t"
  77852. #endif
  77853. "stm %[r]!, {r3, r4}\n\t"
  77854. "ldm %[b]!, {r5, r6}\n\t"
  77855. "ldm %[a]!, {r3, r4}\n\t"
  77856. #ifdef WOLFSSL_KEIL
  77857. "sbcs r3, r3, r5\n\t"
  77858. #elif defined(__clang__)
  77859. "sbcs r3, r5\n\t"
  77860. #else
  77861. "sbc r3, r5\n\t"
  77862. #endif
  77863. #ifdef WOLFSSL_KEIL
  77864. "sbcs r4, r4, r6\n\t"
  77865. #elif defined(__clang__)
  77866. "sbcs r4, r6\n\t"
  77867. #else
  77868. "sbc r4, r6\n\t"
  77869. #endif
  77870. "stm %[r]!, {r3, r4}\n\t"
  77871. "ldm %[b]!, {r5, r6}\n\t"
  77872. "ldm %[a]!, {r3, r4}\n\t"
  77873. #ifdef WOLFSSL_KEIL
  77874. "sbcs r3, r3, r5\n\t"
  77875. #elif defined(__clang__)
  77876. "sbcs r3, r5\n\t"
  77877. #else
  77878. "sbc r3, r5\n\t"
  77879. #endif
  77880. #ifdef WOLFSSL_KEIL
  77881. "sbcs r4, r4, r6\n\t"
  77882. #elif defined(__clang__)
  77883. "sbcs r4, r6\n\t"
  77884. #else
  77885. "sbc r4, r6\n\t"
  77886. #endif
  77887. "stm %[r]!, {r3, r4}\n\t"
  77888. "ldm %[b]!, {r5, r6}\n\t"
  77889. "ldm %[a]!, {r3, r4}\n\t"
  77890. #ifdef WOLFSSL_KEIL
  77891. "sbcs r3, r3, r5\n\t"
  77892. #elif defined(__clang__)
  77893. "sbcs r3, r5\n\t"
  77894. #else
  77895. "sbc r3, r5\n\t"
  77896. #endif
  77897. #ifdef WOLFSSL_KEIL
  77898. "sbcs r4, r4, r6\n\t"
  77899. #elif defined(__clang__)
  77900. "sbcs r4, r6\n\t"
  77901. #else
  77902. "sbc r4, r6\n\t"
  77903. #endif
  77904. "stm %[r]!, {r3, r4}\n\t"
  77905. "ldm %[b]!, {r5, r6}\n\t"
  77906. "ldm %[a]!, {r3, r4}\n\t"
  77907. #ifdef WOLFSSL_KEIL
  77908. "sbcs r3, r3, r5\n\t"
  77909. #elif defined(__clang__)
  77910. "sbcs r3, r5\n\t"
  77911. #else
  77912. "sbc r3, r5\n\t"
  77913. #endif
  77914. #ifdef WOLFSSL_KEIL
  77915. "sbcs r4, r4, r6\n\t"
  77916. #elif defined(__clang__)
  77917. "sbcs r4, r6\n\t"
  77918. #else
  77919. "sbc r4, r6\n\t"
  77920. #endif
  77921. "stm %[r]!, {r3, r4}\n\t"
  77922. "ldm %[b]!, {r5, r6}\n\t"
  77923. "ldm %[a]!, {r3, r4}\n\t"
  77924. #ifdef WOLFSSL_KEIL
  77925. "sbcs r3, r3, r5\n\t"
  77926. #elif defined(__clang__)
  77927. "sbcs r3, r5\n\t"
  77928. #else
  77929. "sbc r3, r5\n\t"
  77930. #endif
  77931. #ifdef WOLFSSL_KEIL
  77932. "sbcs r4, r4, r6\n\t"
  77933. #elif defined(__clang__)
  77934. "sbcs r4, r6\n\t"
  77935. #else
  77936. "sbc r4, r6\n\t"
  77937. #endif
  77938. "stm %[r]!, {r3, r4}\n\t"
  77939. "ldm %[b]!, {r5, r6}\n\t"
  77940. "ldm %[a]!, {r3, r4}\n\t"
  77941. #ifdef WOLFSSL_KEIL
  77942. "sbcs r3, r3, r5\n\t"
  77943. #elif defined(__clang__)
  77944. "sbcs r3, r5\n\t"
  77945. #else
  77946. "sbc r3, r5\n\t"
  77947. #endif
  77948. #ifdef WOLFSSL_KEIL
  77949. "sbcs r4, r4, r6\n\t"
  77950. #elif defined(__clang__)
  77951. "sbcs r4, r6\n\t"
  77952. #else
  77953. "sbc r4, r6\n\t"
  77954. #endif
  77955. "stm %[r]!, {r3, r4}\n\t"
  77956. "ldm %[b]!, {r5, r6}\n\t"
  77957. "ldm %[a]!, {r3, r4}\n\t"
  77958. #ifdef WOLFSSL_KEIL
  77959. "sbcs r3, r3, r5\n\t"
  77960. #elif defined(__clang__)
  77961. "sbcs r3, r5\n\t"
  77962. #else
  77963. "sbc r3, r5\n\t"
  77964. #endif
  77965. #ifdef WOLFSSL_KEIL
  77966. "sbcs r4, r4, r6\n\t"
  77967. #elif defined(__clang__)
  77968. "sbcs r4, r6\n\t"
  77969. #else
  77970. "sbc r4, r6\n\t"
  77971. #endif
  77972. "stm %[r]!, {r3, r4}\n\t"
  77973. "ldm %[b]!, {r5, r6}\n\t"
  77974. "ldm %[a]!, {r3, r4}\n\t"
  77975. #ifdef WOLFSSL_KEIL
  77976. "sbcs r3, r3, r5\n\t"
  77977. #elif defined(__clang__)
  77978. "sbcs r3, r5\n\t"
  77979. #else
  77980. "sbc r3, r5\n\t"
  77981. #endif
  77982. #ifdef WOLFSSL_KEIL
  77983. "sbcs r4, r4, r6\n\t"
  77984. #elif defined(__clang__)
  77985. "sbcs r4, r6\n\t"
  77986. #else
  77987. "sbc r4, r6\n\t"
  77988. #endif
  77989. "stm %[r]!, {r3, r4}\n\t"
  77990. "ldm %[b]!, {r5, r6}\n\t"
  77991. "ldm %[a]!, {r3, r4}\n\t"
  77992. #ifdef WOLFSSL_KEIL
  77993. "sbcs r3, r3, r5\n\t"
  77994. #elif defined(__clang__)
  77995. "sbcs r3, r5\n\t"
  77996. #else
  77997. "sbc r3, r5\n\t"
  77998. #endif
  77999. #ifdef WOLFSSL_KEIL
  78000. "sbcs r4, r4, r6\n\t"
  78001. #elif defined(__clang__)
  78002. "sbcs r4, r6\n\t"
  78003. #else
  78004. "sbc r4, r6\n\t"
  78005. #endif
  78006. "stm %[r]!, {r3, r4}\n\t"
  78007. "ldm %[b]!, {r5, r6}\n\t"
  78008. "ldm %[a]!, {r3, r4}\n\t"
  78009. #ifdef WOLFSSL_KEIL
  78010. "sbcs r3, r3, r5\n\t"
  78011. #elif defined(__clang__)
  78012. "sbcs r3, r5\n\t"
  78013. #else
  78014. "sbc r3, r5\n\t"
  78015. #endif
  78016. #ifdef WOLFSSL_KEIL
  78017. "sbcs r4, r4, r6\n\t"
  78018. #elif defined(__clang__)
  78019. "sbcs r4, r6\n\t"
  78020. #else
  78021. "sbc r4, r6\n\t"
  78022. #endif
  78023. "stm %[r]!, {r3, r4}\n\t"
  78024. "ldm %[b]!, {r5, r6}\n\t"
  78025. "ldm %[a]!, {r3, r4}\n\t"
  78026. #ifdef WOLFSSL_KEIL
  78027. "sbcs r3, r3, r5\n\t"
  78028. #elif defined(__clang__)
  78029. "sbcs r3, r5\n\t"
  78030. #else
  78031. "sbc r3, r5\n\t"
  78032. #endif
  78033. #ifdef WOLFSSL_KEIL
  78034. "sbcs r4, r4, r6\n\t"
  78035. #elif defined(__clang__)
  78036. "sbcs r4, r6\n\t"
  78037. #else
  78038. "sbc r4, r6\n\t"
  78039. #endif
  78040. "stm %[r]!, {r3, r4}\n\t"
  78041. "ldm %[b]!, {r5, r6}\n\t"
  78042. "ldm %[a]!, {r3, r4}\n\t"
  78043. #ifdef WOLFSSL_KEIL
  78044. "sbcs r3, r3, r5\n\t"
  78045. #elif defined(__clang__)
  78046. "sbcs r3, r5\n\t"
  78047. #else
  78048. "sbc r3, r5\n\t"
  78049. #endif
  78050. #ifdef WOLFSSL_KEIL
  78051. "sbcs r4, r4, r6\n\t"
  78052. #elif defined(__clang__)
  78053. "sbcs r4, r6\n\t"
  78054. #else
  78055. "sbc r4, r6\n\t"
  78056. #endif
  78057. "stm %[r]!, {r3, r4}\n\t"
  78058. "ldm %[b]!, {r5, r6}\n\t"
  78059. "ldm %[a]!, {r3, r4}\n\t"
  78060. #ifdef WOLFSSL_KEIL
  78061. "sbcs r3, r3, r5\n\t"
  78062. #elif defined(__clang__)
  78063. "sbcs r3, r5\n\t"
  78064. #else
  78065. "sbc r3, r5\n\t"
  78066. #endif
  78067. #ifdef WOLFSSL_KEIL
  78068. "sbcs r4, r4, r6\n\t"
  78069. #elif defined(__clang__)
  78070. "sbcs r4, r6\n\t"
  78071. #else
  78072. "sbc r4, r6\n\t"
  78073. #endif
  78074. "stm %[r]!, {r3, r4}\n\t"
  78075. "ldm %[b]!, {r5, r6}\n\t"
  78076. "ldm %[a]!, {r3, r4}\n\t"
  78077. #ifdef WOLFSSL_KEIL
  78078. "sbcs r3, r3, r5\n\t"
  78079. #elif defined(__clang__)
  78080. "sbcs r3, r5\n\t"
  78081. #else
  78082. "sbc r3, r5\n\t"
  78083. #endif
  78084. #ifdef WOLFSSL_KEIL
  78085. "sbcs r4, r4, r6\n\t"
  78086. #elif defined(__clang__)
  78087. "sbcs r4, r6\n\t"
  78088. #else
  78089. "sbc r4, r6\n\t"
  78090. #endif
  78091. "stm %[r]!, {r3, r4}\n\t"
  78092. "ldm %[b]!, {r5, r6}\n\t"
  78093. "ldm %[a]!, {r3, r4}\n\t"
  78094. #ifdef WOLFSSL_KEIL
  78095. "sbcs r3, r3, r5\n\t"
  78096. #elif defined(__clang__)
  78097. "sbcs r3, r5\n\t"
  78098. #else
  78099. "sbc r3, r5\n\t"
  78100. #endif
  78101. #ifdef WOLFSSL_KEIL
  78102. "sbcs r4, r4, r6\n\t"
  78103. #elif defined(__clang__)
  78104. "sbcs r4, r6\n\t"
  78105. #else
  78106. "sbc r4, r6\n\t"
  78107. #endif
  78108. "stm %[r]!, {r3, r4}\n\t"
  78109. "ldm %[b]!, {r5, r6}\n\t"
  78110. "ldm %[a]!, {r3, r4}\n\t"
  78111. #ifdef WOLFSSL_KEIL
  78112. "sbcs r3, r3, r5\n\t"
  78113. #elif defined(__clang__)
  78114. "sbcs r3, r5\n\t"
  78115. #else
  78116. "sbc r3, r5\n\t"
  78117. #endif
  78118. #ifdef WOLFSSL_KEIL
  78119. "sbcs r4, r4, r6\n\t"
  78120. #elif defined(__clang__)
  78121. "sbcs r4, r6\n\t"
  78122. #else
  78123. "sbc r4, r6\n\t"
  78124. #endif
  78125. "stm %[r]!, {r3, r4}\n\t"
  78126. "ldm %[b]!, {r5, r6}\n\t"
  78127. "ldm %[a]!, {r3, r4}\n\t"
  78128. #ifdef WOLFSSL_KEIL
  78129. "sbcs r3, r3, r5\n\t"
  78130. #elif defined(__clang__)
  78131. "sbcs r3, r5\n\t"
  78132. #else
  78133. "sbc r3, r5\n\t"
  78134. #endif
  78135. #ifdef WOLFSSL_KEIL
  78136. "sbcs r4, r4, r6\n\t"
  78137. #elif defined(__clang__)
  78138. "sbcs r4, r6\n\t"
  78139. #else
  78140. "sbc r4, r6\n\t"
  78141. #endif
  78142. "stm %[r]!, {r3, r4}\n\t"
  78143. "ldm %[b]!, {r5, r6}\n\t"
  78144. "ldm %[a]!, {r3, r4}\n\t"
  78145. #ifdef WOLFSSL_KEIL
  78146. "sbcs r3, r3, r5\n\t"
  78147. #elif defined(__clang__)
  78148. "sbcs r3, r5\n\t"
  78149. #else
  78150. "sbc r3, r5\n\t"
  78151. #endif
  78152. #ifdef WOLFSSL_KEIL
  78153. "sbcs r4, r4, r6\n\t"
  78154. #elif defined(__clang__)
  78155. "sbcs r4, r6\n\t"
  78156. #else
  78157. "sbc r4, r6\n\t"
  78158. #endif
  78159. "stm %[r]!, {r3, r4}\n\t"
  78160. "ldm %[b]!, {r5, r6}\n\t"
  78161. "ldm %[a]!, {r3, r4}\n\t"
  78162. #ifdef WOLFSSL_KEIL
  78163. "sbcs r3, r3, r5\n\t"
  78164. #elif defined(__clang__)
  78165. "sbcs r3, r5\n\t"
  78166. #else
  78167. "sbc r3, r5\n\t"
  78168. #endif
  78169. #ifdef WOLFSSL_KEIL
  78170. "sbcs r4, r4, r6\n\t"
  78171. #elif defined(__clang__)
  78172. "sbcs r4, r6\n\t"
  78173. #else
  78174. "sbc r4, r6\n\t"
  78175. #endif
  78176. "stm %[r]!, {r3, r4}\n\t"
  78177. "ldm %[b]!, {r5, r6}\n\t"
  78178. "ldm %[a]!, {r3, r4}\n\t"
  78179. #ifdef WOLFSSL_KEIL
  78180. "sbcs r3, r3, r5\n\t"
  78181. #elif defined(__clang__)
  78182. "sbcs r3, r5\n\t"
  78183. #else
  78184. "sbc r3, r5\n\t"
  78185. #endif
  78186. #ifdef WOLFSSL_KEIL
  78187. "sbcs r4, r4, r6\n\t"
  78188. #elif defined(__clang__)
  78189. "sbcs r4, r6\n\t"
  78190. #else
  78191. "sbc r4, r6\n\t"
  78192. #endif
  78193. "stm %[r]!, {r3, r4}\n\t"
  78194. "ldm %[b]!, {r5, r6}\n\t"
  78195. "ldm %[a]!, {r3, r4}\n\t"
  78196. #ifdef WOLFSSL_KEIL
  78197. "sbcs r3, r3, r5\n\t"
  78198. #elif defined(__clang__)
  78199. "sbcs r3, r5\n\t"
  78200. #else
  78201. "sbc r3, r5\n\t"
  78202. #endif
  78203. #ifdef WOLFSSL_KEIL
  78204. "sbcs r4, r4, r6\n\t"
  78205. #elif defined(__clang__)
  78206. "sbcs r4, r6\n\t"
  78207. #else
  78208. "sbc r4, r6\n\t"
  78209. #endif
  78210. "stm %[r]!, {r3, r4}\n\t"
  78211. "ldm %[b]!, {r5, r6}\n\t"
  78212. "ldm %[a]!, {r3, r4}\n\t"
  78213. #ifdef WOLFSSL_KEIL
  78214. "sbcs r3, r3, r5\n\t"
  78215. #elif defined(__clang__)
  78216. "sbcs r3, r5\n\t"
  78217. #else
  78218. "sbc r3, r5\n\t"
  78219. #endif
  78220. #ifdef WOLFSSL_KEIL
  78221. "sbcs r4, r4, r6\n\t"
  78222. #elif defined(__clang__)
  78223. "sbcs r4, r6\n\t"
  78224. #else
  78225. "sbc r4, r6\n\t"
  78226. #endif
  78227. "stm %[r]!, {r3, r4}\n\t"
  78228. "ldm %[b]!, {r5, r6}\n\t"
  78229. "ldm %[a]!, {r3, r4}\n\t"
  78230. #ifdef WOLFSSL_KEIL
  78231. "sbcs r3, r3, r5\n\t"
  78232. #elif defined(__clang__)
  78233. "sbcs r3, r5\n\t"
  78234. #else
  78235. "sbc r3, r5\n\t"
  78236. #endif
  78237. #ifdef WOLFSSL_KEIL
  78238. "sbcs r4, r4, r6\n\t"
  78239. #elif defined(__clang__)
  78240. "sbcs r4, r6\n\t"
  78241. #else
  78242. "sbc r4, r6\n\t"
  78243. #endif
  78244. "stm %[r]!, {r3, r4}\n\t"
  78245. "ldm %[b]!, {r5, r6}\n\t"
  78246. "ldm %[a]!, {r3, r4}\n\t"
  78247. #ifdef WOLFSSL_KEIL
  78248. "sbcs r3, r3, r5\n\t"
  78249. #elif defined(__clang__)
  78250. "sbcs r3, r5\n\t"
  78251. #else
  78252. "sbc r3, r5\n\t"
  78253. #endif
  78254. #ifdef WOLFSSL_KEIL
  78255. "sbcs r4, r4, r6\n\t"
  78256. #elif defined(__clang__)
  78257. "sbcs r4, r6\n\t"
  78258. #else
  78259. "sbc r4, r6\n\t"
  78260. #endif
  78261. "stm %[r]!, {r3, r4}\n\t"
  78262. "ldm %[b]!, {r5, r6}\n\t"
  78263. "ldm %[a]!, {r3, r4}\n\t"
  78264. #ifdef WOLFSSL_KEIL
  78265. "sbcs r3, r3, r5\n\t"
  78266. #elif defined(__clang__)
  78267. "sbcs r3, r5\n\t"
  78268. #else
  78269. "sbc r3, r5\n\t"
  78270. #endif
  78271. #ifdef WOLFSSL_KEIL
  78272. "sbcs r4, r4, r6\n\t"
  78273. #elif defined(__clang__)
  78274. "sbcs r4, r6\n\t"
  78275. #else
  78276. "sbc r4, r6\n\t"
  78277. #endif
  78278. "stm %[r]!, {r3, r4}\n\t"
  78279. "ldm %[b]!, {r5, r6}\n\t"
  78280. "ldm %[a]!, {r3, r4}\n\t"
  78281. #ifdef WOLFSSL_KEIL
  78282. "sbcs r3, r3, r5\n\t"
  78283. #elif defined(__clang__)
  78284. "sbcs r3, r5\n\t"
  78285. #else
  78286. "sbc r3, r5\n\t"
  78287. #endif
  78288. #ifdef WOLFSSL_KEIL
  78289. "sbcs r4, r4, r6\n\t"
  78290. #elif defined(__clang__)
  78291. "sbcs r4, r6\n\t"
  78292. #else
  78293. "sbc r4, r6\n\t"
  78294. #endif
  78295. "stm %[r]!, {r3, r4}\n\t"
  78296. "ldm %[b]!, {r5, r6}\n\t"
  78297. "ldm %[a]!, {r3, r4}\n\t"
  78298. #ifdef WOLFSSL_KEIL
  78299. "sbcs r3, r3, r5\n\t"
  78300. #elif defined(__clang__)
  78301. "sbcs r3, r5\n\t"
  78302. #else
  78303. "sbc r3, r5\n\t"
  78304. #endif
  78305. #ifdef WOLFSSL_KEIL
  78306. "sbcs r4, r4, r6\n\t"
  78307. #elif defined(__clang__)
  78308. "sbcs r4, r6\n\t"
  78309. #else
  78310. "sbc r4, r6\n\t"
  78311. #endif
  78312. "stm %[r]!, {r3, r4}\n\t"
  78313. "ldm %[b]!, {r5, r6}\n\t"
  78314. "ldm %[a]!, {r3, r4}\n\t"
  78315. #ifdef WOLFSSL_KEIL
  78316. "sbcs r3, r3, r5\n\t"
  78317. #elif defined(__clang__)
  78318. "sbcs r3, r5\n\t"
  78319. #else
  78320. "sbc r3, r5\n\t"
  78321. #endif
  78322. #ifdef WOLFSSL_KEIL
  78323. "sbcs r4, r4, r6\n\t"
  78324. #elif defined(__clang__)
  78325. "sbcs r4, r6\n\t"
  78326. #else
  78327. "sbc r4, r6\n\t"
  78328. #endif
  78329. "stm %[r]!, {r3, r4}\n\t"
  78330. "ldm %[b]!, {r5, r6}\n\t"
  78331. "ldm %[a]!, {r3, r4}\n\t"
  78332. #ifdef WOLFSSL_KEIL
  78333. "sbcs r3, r3, r5\n\t"
  78334. #elif defined(__clang__)
  78335. "sbcs r3, r5\n\t"
  78336. #else
  78337. "sbc r3, r5\n\t"
  78338. #endif
  78339. #ifdef WOLFSSL_KEIL
  78340. "sbcs r4, r4, r6\n\t"
  78341. #elif defined(__clang__)
  78342. "sbcs r4, r6\n\t"
  78343. #else
  78344. "sbc r4, r6\n\t"
  78345. #endif
  78346. "stm %[r]!, {r3, r4}\n\t"
  78347. "ldm %[b]!, {r5, r6}\n\t"
  78348. "ldm %[a]!, {r3, r4}\n\t"
  78349. #ifdef WOLFSSL_KEIL
  78350. "sbcs r3, r3, r5\n\t"
  78351. #elif defined(__clang__)
  78352. "sbcs r3, r5\n\t"
  78353. #else
  78354. "sbc r3, r5\n\t"
  78355. #endif
  78356. #ifdef WOLFSSL_KEIL
  78357. "sbcs r4, r4, r6\n\t"
  78358. #elif defined(__clang__)
  78359. "sbcs r4, r6\n\t"
  78360. #else
  78361. "sbc r4, r6\n\t"
  78362. #endif
  78363. "stm %[r]!, {r3, r4}\n\t"
  78364. "ldm %[b]!, {r5, r6}\n\t"
  78365. "ldm %[a]!, {r3, r4}\n\t"
  78366. #ifdef WOLFSSL_KEIL
  78367. "sbcs r3, r3, r5\n\t"
  78368. #elif defined(__clang__)
  78369. "sbcs r3, r5\n\t"
  78370. #else
  78371. "sbc r3, r5\n\t"
  78372. #endif
  78373. #ifdef WOLFSSL_KEIL
  78374. "sbcs r4, r4, r6\n\t"
  78375. #elif defined(__clang__)
  78376. "sbcs r4, r6\n\t"
  78377. #else
  78378. "sbc r4, r6\n\t"
  78379. #endif
  78380. "stm %[r]!, {r3, r4}\n\t"
  78381. "ldm %[b]!, {r5, r6}\n\t"
  78382. "ldm %[a]!, {r3, r4}\n\t"
  78383. #ifdef WOLFSSL_KEIL
  78384. "sbcs r3, r3, r5\n\t"
  78385. #elif defined(__clang__)
  78386. "sbcs r3, r5\n\t"
  78387. #else
  78388. "sbc r3, r5\n\t"
  78389. #endif
  78390. #ifdef WOLFSSL_KEIL
  78391. "sbcs r4, r4, r6\n\t"
  78392. #elif defined(__clang__)
  78393. "sbcs r4, r6\n\t"
  78394. #else
  78395. "sbc r4, r6\n\t"
  78396. #endif
  78397. "stm %[r]!, {r3, r4}\n\t"
  78398. "ldm %[b]!, {r5, r6}\n\t"
  78399. "ldm %[a]!, {r3, r4}\n\t"
  78400. #ifdef WOLFSSL_KEIL
  78401. "sbcs r3, r3, r5\n\t"
  78402. #elif defined(__clang__)
  78403. "sbcs r3, r5\n\t"
  78404. #else
  78405. "sbc r3, r5\n\t"
  78406. #endif
  78407. #ifdef WOLFSSL_KEIL
  78408. "sbcs r4, r4, r6\n\t"
  78409. #elif defined(__clang__)
  78410. "sbcs r4, r6\n\t"
  78411. #else
  78412. "sbc r4, r6\n\t"
  78413. #endif
  78414. "stm %[r]!, {r3, r4}\n\t"
  78415. "ldm %[b]!, {r5, r6}\n\t"
  78416. "ldm %[a]!, {r3, r4}\n\t"
  78417. #ifdef WOLFSSL_KEIL
  78418. "sbcs r3, r3, r5\n\t"
  78419. #elif defined(__clang__)
  78420. "sbcs r3, r5\n\t"
  78421. #else
  78422. "sbc r3, r5\n\t"
  78423. #endif
  78424. #ifdef WOLFSSL_KEIL
  78425. "sbcs r4, r4, r6\n\t"
  78426. #elif defined(__clang__)
  78427. "sbcs r4, r6\n\t"
  78428. #else
  78429. "sbc r4, r6\n\t"
  78430. #endif
  78431. "stm %[r]!, {r3, r4}\n\t"
  78432. "ldm %[b]!, {r5, r6}\n\t"
  78433. "ldm %[a]!, {r3, r4}\n\t"
  78434. #ifdef WOLFSSL_KEIL
  78435. "sbcs r3, r3, r5\n\t"
  78436. #elif defined(__clang__)
  78437. "sbcs r3, r5\n\t"
  78438. #else
  78439. "sbc r3, r5\n\t"
  78440. #endif
  78441. #ifdef WOLFSSL_KEIL
  78442. "sbcs r4, r4, r6\n\t"
  78443. #elif defined(__clang__)
  78444. "sbcs r4, r6\n\t"
  78445. #else
  78446. "sbc r4, r6\n\t"
  78447. #endif
  78448. "stm %[r]!, {r3, r4}\n\t"
  78449. "ldm %[b]!, {r5, r6}\n\t"
  78450. "ldm %[a]!, {r3, r4}\n\t"
  78451. #ifdef WOLFSSL_KEIL
  78452. "sbcs r3, r3, r5\n\t"
  78453. #elif defined(__clang__)
  78454. "sbcs r3, r5\n\t"
  78455. #else
  78456. "sbc r3, r5\n\t"
  78457. #endif
  78458. #ifdef WOLFSSL_KEIL
  78459. "sbcs r4, r4, r6\n\t"
  78460. #elif defined(__clang__)
  78461. "sbcs r4, r6\n\t"
  78462. #else
  78463. "sbc r4, r6\n\t"
  78464. #endif
  78465. "stm %[r]!, {r3, r4}\n\t"
  78466. "ldm %[b]!, {r5, r6}\n\t"
  78467. "ldm %[a]!, {r3, r4}\n\t"
  78468. #ifdef WOLFSSL_KEIL
  78469. "sbcs r3, r3, r5\n\t"
  78470. #elif defined(__clang__)
  78471. "sbcs r3, r5\n\t"
  78472. #else
  78473. "sbc r3, r5\n\t"
  78474. #endif
  78475. #ifdef WOLFSSL_KEIL
  78476. "sbcs r4, r4, r6\n\t"
  78477. #elif defined(__clang__)
  78478. "sbcs r4, r6\n\t"
  78479. #else
  78480. "sbc r4, r6\n\t"
  78481. #endif
  78482. "stm %[r]!, {r3, r4}\n\t"
  78483. "ldm %[b]!, {r5, r6}\n\t"
  78484. "ldm %[a]!, {r3, r4}\n\t"
  78485. #ifdef WOLFSSL_KEIL
  78486. "sbcs r3, r3, r5\n\t"
  78487. #elif defined(__clang__)
  78488. "sbcs r3, r5\n\t"
  78489. #else
  78490. "sbc r3, r5\n\t"
  78491. #endif
  78492. #ifdef WOLFSSL_KEIL
  78493. "sbcs r4, r4, r6\n\t"
  78494. #elif defined(__clang__)
  78495. "sbcs r4, r6\n\t"
  78496. #else
  78497. "sbc r4, r6\n\t"
  78498. #endif
  78499. "stm %[r]!, {r3, r4}\n\t"
  78500. "ldm %[b]!, {r5, r6}\n\t"
  78501. "ldm %[a]!, {r3, r4}\n\t"
  78502. #ifdef WOLFSSL_KEIL
  78503. "sbcs r3, r3, r5\n\t"
  78504. #elif defined(__clang__)
  78505. "sbcs r3, r5\n\t"
  78506. #else
  78507. "sbc r3, r5\n\t"
  78508. #endif
  78509. #ifdef WOLFSSL_KEIL
  78510. "sbcs r4, r4, r6\n\t"
  78511. #elif defined(__clang__)
  78512. "sbcs r4, r6\n\t"
  78513. #else
  78514. "sbc r4, r6\n\t"
  78515. #endif
  78516. "stm %[r]!, {r3, r4}\n\t"
  78517. "ldm %[b]!, {r5, r6}\n\t"
  78518. "ldm %[a]!, {r3, r4}\n\t"
  78519. #ifdef WOLFSSL_KEIL
  78520. "sbcs r3, r3, r5\n\t"
  78521. #elif defined(__clang__)
  78522. "sbcs r3, r5\n\t"
  78523. #else
  78524. "sbc r3, r5\n\t"
  78525. #endif
  78526. #ifdef WOLFSSL_KEIL
  78527. "sbcs r4, r4, r6\n\t"
  78528. #elif defined(__clang__)
  78529. "sbcs r4, r6\n\t"
  78530. #else
  78531. "sbc r4, r6\n\t"
  78532. #endif
  78533. "stm %[r]!, {r3, r4}\n\t"
  78534. #ifdef WOLFSSL_KEIL
  78535. "sbcs %[r], %[r], %[r]\n\t"
  78536. #elif defined(__clang__)
  78537. "sbcs %[r], %[r]\n\t"
  78538. #else
  78539. "sbc %[r], %[r]\n\t"
  78540. #endif
  78541. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  78542. :
  78543. : "memory", "r3", "r4", "r5", "r6"
  78544. );
  78545. return (uint32_t)(size_t)r;
  78546. }
  78547. #endif /* WOLFSSL_SP_SMALL */
  78548. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  78549. *
  78550. * d1 The high order half of the number to divide.
  78551. * d0 The low order half of the number to divide.
  78552. * div The divisor.
  78553. * returns the result of the division.
  78554. *
  78555. * Note that this is an approximate div. It may give an answer 1 larger.
  78556. */
  78557. SP_NOINLINE static sp_digit div_3072_word_96(sp_digit d1, sp_digit d0,
  78558. sp_digit div)
  78559. {
  78560. __asm__ __volatile__ (
  78561. "movs r3, #0\n\t"
  78562. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78563. "lsrs r5, %[div], #1\n\t"
  78564. #else
  78565. "lsr r5, %[div], #1\n\t"
  78566. #endif
  78567. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78568. "adds r5, r5, #1\n\t"
  78569. #else
  78570. "add r5, r5, #1\n\t"
  78571. #endif
  78572. "mov r8, %[d0]\n\t"
  78573. "mov r9, %[d1]\n\t"
  78574. "# Do top 32\n\t"
  78575. "movs r6, r5\n\t"
  78576. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78577. "subs r6, r6, %[d1]\n\t"
  78578. #else
  78579. "sub r6, r6, %[d1]\n\t"
  78580. #endif
  78581. #ifdef WOLFSSL_KEIL
  78582. "sbcs r6, r6, r6\n\t"
  78583. #elif defined(__clang__)
  78584. "sbcs r6, r6\n\t"
  78585. #else
  78586. "sbc r6, r6\n\t"
  78587. #endif
  78588. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78589. "adds r3, r3, r3\n\t"
  78590. #else
  78591. "add r3, r3, r3\n\t"
  78592. #endif
  78593. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78594. "subs r3, r3, r6\n\t"
  78595. #else
  78596. "sub r3, r3, r6\n\t"
  78597. #endif
  78598. #ifdef WOLFSSL_KEIL
  78599. "ands r6, r6, r5\n\t"
  78600. #elif defined(__clang__)
  78601. "ands r6, r5\n\t"
  78602. #else
  78603. "and r6, r5\n\t"
  78604. #endif
  78605. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78606. "subs %[d1], %[d1], r6\n\t"
  78607. #else
  78608. "sub %[d1], %[d1], r6\n\t"
  78609. #endif
  78610. "movs r4, #29\n\t"
  78611. "\n"
  78612. "L_div_3072_word_96_loop_%=:\n\t"
  78613. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78614. "lsls %[d0], %[d0], #1\n\t"
  78615. #else
  78616. "lsl %[d0], %[d0], #1\n\t"
  78617. #endif
  78618. #ifdef WOLFSSL_KEIL
  78619. "adcs %[d1], %[d1], %[d1]\n\t"
  78620. #elif defined(__clang__)
  78621. "adcs %[d1], %[d1]\n\t"
  78622. #else
  78623. "adc %[d1], %[d1]\n\t"
  78624. #endif
  78625. "movs r6, r5\n\t"
  78626. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78627. "subs r6, r6, %[d1]\n\t"
  78628. #else
  78629. "sub r6, r6, %[d1]\n\t"
  78630. #endif
  78631. #ifdef WOLFSSL_KEIL
  78632. "sbcs r6, r6, r6\n\t"
  78633. #elif defined(__clang__)
  78634. "sbcs r6, r6\n\t"
  78635. #else
  78636. "sbc r6, r6\n\t"
  78637. #endif
  78638. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78639. "adds r3, r3, r3\n\t"
  78640. #else
  78641. "add r3, r3, r3\n\t"
  78642. #endif
  78643. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78644. "subs r3, r3, r6\n\t"
  78645. #else
  78646. "sub r3, r3, r6\n\t"
  78647. #endif
  78648. #ifdef WOLFSSL_KEIL
  78649. "ands r6, r6, r5\n\t"
  78650. #elif defined(__clang__)
  78651. "ands r6, r5\n\t"
  78652. #else
  78653. "and r6, r5\n\t"
  78654. #endif
  78655. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78656. "subs %[d1], %[d1], r6\n\t"
  78657. #else
  78658. "sub %[d1], %[d1], r6\n\t"
  78659. #endif
  78660. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78661. "subs r4, r4, #1\n\t"
  78662. #else
  78663. "sub r4, r4, #1\n\t"
  78664. #endif
  78665. "bpl L_div_3072_word_96_loop_%=\n\t"
  78666. "movs r7, #0\n\t"
  78667. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78668. "adds r3, r3, r3\n\t"
  78669. #else
  78670. "add r3, r3, r3\n\t"
  78671. #endif
  78672. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78673. "adds r3, r3, #1\n\t"
  78674. #else
  78675. "add r3, r3, #1\n\t"
  78676. #endif
  78677. "# r * div - Start\n\t"
  78678. "uxth %[d1], r3\n\t"
  78679. "uxth r4, %[div]\n\t"
  78680. #ifdef WOLFSSL_KEIL
  78681. "muls r4, %[d1], r4\n\t"
  78682. #elif defined(__clang__)
  78683. "muls r4, %[d1]\n\t"
  78684. #else
  78685. "mul r4, %[d1]\n\t"
  78686. #endif
  78687. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78688. "lsrs r6, %[div], #16\n\t"
  78689. #else
  78690. "lsr r6, %[div], #16\n\t"
  78691. #endif
  78692. #ifdef WOLFSSL_KEIL
  78693. "muls %[d1], r6, %[d1]\n\t"
  78694. #elif defined(__clang__)
  78695. "muls %[d1], r6\n\t"
  78696. #else
  78697. "mul %[d1], r6\n\t"
  78698. #endif
  78699. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78700. "lsrs r5, %[d1], #16\n\t"
  78701. #else
  78702. "lsr r5, %[d1], #16\n\t"
  78703. #endif
  78704. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78705. "lsls %[d1], %[d1], #16\n\t"
  78706. #else
  78707. "lsl %[d1], %[d1], #16\n\t"
  78708. #endif
  78709. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78710. "adds r4, r4, %[d1]\n\t"
  78711. #else
  78712. "add r4, r4, %[d1]\n\t"
  78713. #endif
  78714. #ifdef WOLFSSL_KEIL
  78715. "adcs r5, r5, r7\n\t"
  78716. #elif defined(__clang__)
  78717. "adcs r5, r7\n\t"
  78718. #else
  78719. "adc r5, r7\n\t"
  78720. #endif
  78721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78722. "lsrs %[d1], r3, #16\n\t"
  78723. #else
  78724. "lsr %[d1], r3, #16\n\t"
  78725. #endif
  78726. #ifdef WOLFSSL_KEIL
  78727. "muls r6, %[d1], r6\n\t"
  78728. #elif defined(__clang__)
  78729. "muls r6, %[d1]\n\t"
  78730. #else
  78731. "mul r6, %[d1]\n\t"
  78732. #endif
  78733. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78734. "adds r5, r5, r6\n\t"
  78735. #else
  78736. "add r5, r5, r6\n\t"
  78737. #endif
  78738. "uxth r6, %[div]\n\t"
  78739. #ifdef WOLFSSL_KEIL
  78740. "muls %[d1], r6, %[d1]\n\t"
  78741. #elif defined(__clang__)
  78742. "muls %[d1], r6\n\t"
  78743. #else
  78744. "mul %[d1], r6\n\t"
  78745. #endif
  78746. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78747. "lsrs r6, %[d1], #16\n\t"
  78748. #else
  78749. "lsr r6, %[d1], #16\n\t"
  78750. #endif
  78751. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78752. "lsls %[d1], %[d1], #16\n\t"
  78753. #else
  78754. "lsl %[d1], %[d1], #16\n\t"
  78755. #endif
  78756. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78757. "adds r4, r4, %[d1]\n\t"
  78758. #else
  78759. "add r4, r4, %[d1]\n\t"
  78760. #endif
  78761. #ifdef WOLFSSL_KEIL
  78762. "adcs r5, r5, r6\n\t"
  78763. #elif defined(__clang__)
  78764. "adcs r5, r6\n\t"
  78765. #else
  78766. "adc r5, r6\n\t"
  78767. #endif
  78768. "# r * div - Done\n\t"
  78769. "mov %[d1], r8\n\t"
  78770. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78771. "subs %[d1], %[d1], r4\n\t"
  78772. #else
  78773. "sub %[d1], %[d1], r4\n\t"
  78774. #endif
  78775. "movs r4, %[d1]\n\t"
  78776. "mov %[d1], r9\n\t"
  78777. #ifdef WOLFSSL_KEIL
  78778. "sbcs %[d1], %[d1], r5\n\t"
  78779. #elif defined(__clang__)
  78780. "sbcs %[d1], r5\n\t"
  78781. #else
  78782. "sbc %[d1], r5\n\t"
  78783. #endif
  78784. "movs r5, %[d1]\n\t"
  78785. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78786. "adds r3, r3, r5\n\t"
  78787. #else
  78788. "add r3, r3, r5\n\t"
  78789. #endif
  78790. "# r * div - Start\n\t"
  78791. "uxth %[d1], r3\n\t"
  78792. "uxth r4, %[div]\n\t"
  78793. #ifdef WOLFSSL_KEIL
  78794. "muls r4, %[d1], r4\n\t"
  78795. #elif defined(__clang__)
  78796. "muls r4, %[d1]\n\t"
  78797. #else
  78798. "mul r4, %[d1]\n\t"
  78799. #endif
  78800. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78801. "lsrs r6, %[div], #16\n\t"
  78802. #else
  78803. "lsr r6, %[div], #16\n\t"
  78804. #endif
  78805. #ifdef WOLFSSL_KEIL
  78806. "muls %[d1], r6, %[d1]\n\t"
  78807. #elif defined(__clang__)
  78808. "muls %[d1], r6\n\t"
  78809. #else
  78810. "mul %[d1], r6\n\t"
  78811. #endif
  78812. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78813. "lsrs r5, %[d1], #16\n\t"
  78814. #else
  78815. "lsr r5, %[d1], #16\n\t"
  78816. #endif
  78817. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78818. "lsls %[d1], %[d1], #16\n\t"
  78819. #else
  78820. "lsl %[d1], %[d1], #16\n\t"
  78821. #endif
  78822. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78823. "adds r4, r4, %[d1]\n\t"
  78824. #else
  78825. "add r4, r4, %[d1]\n\t"
  78826. #endif
  78827. #ifdef WOLFSSL_KEIL
  78828. "adcs r5, r5, r7\n\t"
  78829. #elif defined(__clang__)
  78830. "adcs r5, r7\n\t"
  78831. #else
  78832. "adc r5, r7\n\t"
  78833. #endif
  78834. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78835. "lsrs %[d1], r3, #16\n\t"
  78836. #else
  78837. "lsr %[d1], r3, #16\n\t"
  78838. #endif
  78839. #ifdef WOLFSSL_KEIL
  78840. "muls r6, %[d1], r6\n\t"
  78841. #elif defined(__clang__)
  78842. "muls r6, %[d1]\n\t"
  78843. #else
  78844. "mul r6, %[d1]\n\t"
  78845. #endif
  78846. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78847. "adds r5, r5, r6\n\t"
  78848. #else
  78849. "add r5, r5, r6\n\t"
  78850. #endif
  78851. "uxth r6, %[div]\n\t"
  78852. #ifdef WOLFSSL_KEIL
  78853. "muls %[d1], r6, %[d1]\n\t"
  78854. #elif defined(__clang__)
  78855. "muls %[d1], r6\n\t"
  78856. #else
  78857. "mul %[d1], r6\n\t"
  78858. #endif
  78859. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78860. "lsrs r6, %[d1], #16\n\t"
  78861. #else
  78862. "lsr r6, %[d1], #16\n\t"
  78863. #endif
  78864. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78865. "lsls %[d1], %[d1], #16\n\t"
  78866. #else
  78867. "lsl %[d1], %[d1], #16\n\t"
  78868. #endif
  78869. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78870. "adds r4, r4, %[d1]\n\t"
  78871. #else
  78872. "add r4, r4, %[d1]\n\t"
  78873. #endif
  78874. #ifdef WOLFSSL_KEIL
  78875. "adcs r5, r5, r6\n\t"
  78876. #elif defined(__clang__)
  78877. "adcs r5, r6\n\t"
  78878. #else
  78879. "adc r5, r6\n\t"
  78880. #endif
  78881. "# r * div - Done\n\t"
  78882. "mov %[d1], r8\n\t"
  78883. "mov r6, r9\n\t"
  78884. #ifdef WOLFSSL_KEIL
  78885. "subs r4, %[d1], r4\n\t"
  78886. #else
  78887. #ifdef __clang__
  78888. "subs r4, %[d1], r4\n\t"
  78889. #else
  78890. "sub r4, %[d1], r4\n\t"
  78891. #endif
  78892. #endif
  78893. #ifdef WOLFSSL_KEIL
  78894. "sbcs r6, r6, r5\n\t"
  78895. #elif defined(__clang__)
  78896. "sbcs r6, r5\n\t"
  78897. #else
  78898. "sbc r6, r5\n\t"
  78899. #endif
  78900. "movs r5, r6\n\t"
  78901. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78902. "adds r3, r3, r5\n\t"
  78903. #else
  78904. "add r3, r3, r5\n\t"
  78905. #endif
  78906. "# r * div - Start\n\t"
  78907. "uxth %[d1], r3\n\t"
  78908. "uxth r4, %[div]\n\t"
  78909. #ifdef WOLFSSL_KEIL
  78910. "muls r4, %[d1], r4\n\t"
  78911. #elif defined(__clang__)
  78912. "muls r4, %[d1]\n\t"
  78913. #else
  78914. "mul r4, %[d1]\n\t"
  78915. #endif
  78916. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78917. "lsrs r6, %[div], #16\n\t"
  78918. #else
  78919. "lsr r6, %[div], #16\n\t"
  78920. #endif
  78921. #ifdef WOLFSSL_KEIL
  78922. "muls %[d1], r6, %[d1]\n\t"
  78923. #elif defined(__clang__)
  78924. "muls %[d1], r6\n\t"
  78925. #else
  78926. "mul %[d1], r6\n\t"
  78927. #endif
  78928. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78929. "lsrs r5, %[d1], #16\n\t"
  78930. #else
  78931. "lsr r5, %[d1], #16\n\t"
  78932. #endif
  78933. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78934. "lsls %[d1], %[d1], #16\n\t"
  78935. #else
  78936. "lsl %[d1], %[d1], #16\n\t"
  78937. #endif
  78938. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78939. "adds r4, r4, %[d1]\n\t"
  78940. #else
  78941. "add r4, r4, %[d1]\n\t"
  78942. #endif
  78943. #ifdef WOLFSSL_KEIL
  78944. "adcs r5, r5, r7\n\t"
  78945. #elif defined(__clang__)
  78946. "adcs r5, r7\n\t"
  78947. #else
  78948. "adc r5, r7\n\t"
  78949. #endif
  78950. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78951. "lsrs %[d1], r3, #16\n\t"
  78952. #else
  78953. "lsr %[d1], r3, #16\n\t"
  78954. #endif
  78955. #ifdef WOLFSSL_KEIL
  78956. "muls r6, %[d1], r6\n\t"
  78957. #elif defined(__clang__)
  78958. "muls r6, %[d1]\n\t"
  78959. #else
  78960. "mul r6, %[d1]\n\t"
  78961. #endif
  78962. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78963. "adds r5, r5, r6\n\t"
  78964. #else
  78965. "add r5, r5, r6\n\t"
  78966. #endif
  78967. "uxth r6, %[div]\n\t"
  78968. #ifdef WOLFSSL_KEIL
  78969. "muls %[d1], r6, %[d1]\n\t"
  78970. #elif defined(__clang__)
  78971. "muls %[d1], r6\n\t"
  78972. #else
  78973. "mul %[d1], r6\n\t"
  78974. #endif
  78975. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78976. "lsrs r6, %[d1], #16\n\t"
  78977. #else
  78978. "lsr r6, %[d1], #16\n\t"
  78979. #endif
  78980. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78981. "lsls %[d1], %[d1], #16\n\t"
  78982. #else
  78983. "lsl %[d1], %[d1], #16\n\t"
  78984. #endif
  78985. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78986. "adds r4, r4, %[d1]\n\t"
  78987. #else
  78988. "add r4, r4, %[d1]\n\t"
  78989. #endif
  78990. #ifdef WOLFSSL_KEIL
  78991. "adcs r5, r5, r6\n\t"
  78992. #elif defined(__clang__)
  78993. "adcs r5, r6\n\t"
  78994. #else
  78995. "adc r5, r6\n\t"
  78996. #endif
  78997. "# r * div - Done\n\t"
  78998. "mov %[d1], r8\n\t"
  78999. "mov r6, r9\n\t"
  79000. #ifdef WOLFSSL_KEIL
  79001. "subs r4, %[d1], r4\n\t"
  79002. #else
  79003. #ifdef __clang__
  79004. "subs r4, %[d1], r4\n\t"
  79005. #else
  79006. "sub r4, %[d1], r4\n\t"
  79007. #endif
  79008. #endif
  79009. #ifdef WOLFSSL_KEIL
  79010. "sbcs r6, r6, r5\n\t"
  79011. #elif defined(__clang__)
  79012. "sbcs r6, r5\n\t"
  79013. #else
  79014. "sbc r6, r5\n\t"
  79015. #endif
  79016. "movs r5, r6\n\t"
  79017. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79018. "adds r3, r3, r5\n\t"
  79019. #else
  79020. "add r3, r3, r5\n\t"
  79021. #endif
  79022. "# r * div - Start\n\t"
  79023. "uxth %[d1], r3\n\t"
  79024. "uxth r4, %[div]\n\t"
  79025. #ifdef WOLFSSL_KEIL
  79026. "muls r4, %[d1], r4\n\t"
  79027. #elif defined(__clang__)
  79028. "muls r4, %[d1]\n\t"
  79029. #else
  79030. "mul r4, %[d1]\n\t"
  79031. #endif
  79032. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79033. "lsrs r6, %[div], #16\n\t"
  79034. #else
  79035. "lsr r6, %[div], #16\n\t"
  79036. #endif
  79037. #ifdef WOLFSSL_KEIL
  79038. "muls %[d1], r6, %[d1]\n\t"
  79039. #elif defined(__clang__)
  79040. "muls %[d1], r6\n\t"
  79041. #else
  79042. "mul %[d1], r6\n\t"
  79043. #endif
  79044. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79045. "lsrs r5, %[d1], #16\n\t"
  79046. #else
  79047. "lsr r5, %[d1], #16\n\t"
  79048. #endif
  79049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79050. "lsls %[d1], %[d1], #16\n\t"
  79051. #else
  79052. "lsl %[d1], %[d1], #16\n\t"
  79053. #endif
  79054. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79055. "adds r4, r4, %[d1]\n\t"
  79056. #else
  79057. "add r4, r4, %[d1]\n\t"
  79058. #endif
  79059. #ifdef WOLFSSL_KEIL
  79060. "adcs r5, r5, r7\n\t"
  79061. #elif defined(__clang__)
  79062. "adcs r5, r7\n\t"
  79063. #else
  79064. "adc r5, r7\n\t"
  79065. #endif
  79066. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79067. "lsrs %[d1], r3, #16\n\t"
  79068. #else
  79069. "lsr %[d1], r3, #16\n\t"
  79070. #endif
  79071. #ifdef WOLFSSL_KEIL
  79072. "muls r6, %[d1], r6\n\t"
  79073. #elif defined(__clang__)
  79074. "muls r6, %[d1]\n\t"
  79075. #else
  79076. "mul r6, %[d1]\n\t"
  79077. #endif
  79078. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79079. "adds r5, r5, r6\n\t"
  79080. #else
  79081. "add r5, r5, r6\n\t"
  79082. #endif
  79083. "uxth r6, %[div]\n\t"
  79084. #ifdef WOLFSSL_KEIL
  79085. "muls %[d1], r6, %[d1]\n\t"
  79086. #elif defined(__clang__)
  79087. "muls %[d1], r6\n\t"
  79088. #else
  79089. "mul %[d1], r6\n\t"
  79090. #endif
  79091. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79092. "lsrs r6, %[d1], #16\n\t"
  79093. #else
  79094. "lsr r6, %[d1], #16\n\t"
  79095. #endif
  79096. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79097. "lsls %[d1], %[d1], #16\n\t"
  79098. #else
  79099. "lsl %[d1], %[d1], #16\n\t"
  79100. #endif
  79101. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79102. "adds r4, r4, %[d1]\n\t"
  79103. #else
  79104. "add r4, r4, %[d1]\n\t"
  79105. #endif
  79106. #ifdef WOLFSSL_KEIL
  79107. "adcs r5, r5, r6\n\t"
  79108. #elif defined(__clang__)
  79109. "adcs r5, r6\n\t"
  79110. #else
  79111. "adc r5, r6\n\t"
  79112. #endif
  79113. "# r * div - Done\n\t"
  79114. "mov %[d1], r8\n\t"
  79115. "mov r6, r9\n\t"
  79116. #ifdef WOLFSSL_KEIL
  79117. "subs r4, %[d1], r4\n\t"
  79118. #else
  79119. #ifdef __clang__
  79120. "subs r4, %[d1], r4\n\t"
  79121. #else
  79122. "sub r4, %[d1], r4\n\t"
  79123. #endif
  79124. #endif
  79125. #ifdef WOLFSSL_KEIL
  79126. "sbcs r6, r6, r5\n\t"
  79127. #elif defined(__clang__)
  79128. "sbcs r6, r5\n\t"
  79129. #else
  79130. "sbc r6, r5\n\t"
  79131. #endif
  79132. "movs r5, r6\n\t"
  79133. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79134. "adds r3, r3, r5\n\t"
  79135. #else
  79136. "add r3, r3, r5\n\t"
  79137. #endif
  79138. "movs r6, %[div]\n\t"
  79139. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79140. "subs r6, r6, r4\n\t"
  79141. #else
  79142. "sub r6, r6, r4\n\t"
  79143. #endif
  79144. #ifdef WOLFSSL_KEIL
  79145. "sbcs r6, r6, r6\n\t"
  79146. #elif defined(__clang__)
  79147. "sbcs r6, r6\n\t"
  79148. #else
  79149. "sbc r6, r6\n\t"
  79150. #endif
  79151. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79152. "subs r3, r3, r6\n\t"
  79153. #else
  79154. "sub r3, r3, r6\n\t"
  79155. #endif
  79156. "movs %[d1], r3\n\t"
  79157. : [d1] "+l" (d1), [d0] "+l" (d0), [div] "+l" (div)
  79158. :
  79159. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  79160. );
  79161. return (uint32_t)(size_t)d1;
  79162. }
  79163. /* Divide d in a and put remainder into r (m*d + r = a)
  79164. * m is not calculated as it is not needed at this time.
  79165. *
  79166. * a Number to be divided.
  79167. * d Number to divide with.
  79168. * m Multiplier result.
  79169. * r Remainder from the division.
  79170. * returns MP_OKAY indicating success.
  79171. */
  79172. static WC_INLINE int sp_3072_div_96_cond(const sp_digit* a, const sp_digit* d, sp_digit* m,
  79173. sp_digit* r)
  79174. {
  79175. sp_digit t1[192], t2[97];
  79176. sp_digit div, r1;
  79177. int i;
  79178. (void)m;
  79179. div = d[95];
  79180. XMEMCPY(t1, a, sizeof(*t1) * 2 * 96);
  79181. for (i = 95; i > 0; i--) {
  79182. if (t1[i + 96] != d[i])
  79183. break;
  79184. }
  79185. if (t1[i + 96] >= d[i]) {
  79186. sp_3072_sub_in_place_96(&t1[96], d);
  79187. }
  79188. for (i = 95; i >= 0; i--) {
  79189. if (t1[96 + i] == div) {
  79190. r1 = SP_DIGIT_MAX;
  79191. }
  79192. else {
  79193. r1 = div_3072_word_96(t1[96 + i], t1[96 + i - 1], div);
  79194. }
  79195. sp_3072_mul_d_96(t2, d, r1);
  79196. t1[96 + i] += sp_3072_sub_in_place_96(&t1[i], t2);
  79197. t1[96 + i] -= t2[96];
  79198. if (t1[96 + i] != 0) {
  79199. t1[96 + i] += sp_3072_add_96(&t1[i], &t1[i], d);
  79200. if (t1[96 + i] != 0)
  79201. t1[96 + i] += sp_3072_add_96(&t1[i], &t1[i], d);
  79202. }
  79203. }
  79204. for (i = 95; i > 0; i--) {
  79205. if (t1[i] != d[i])
  79206. break;
  79207. }
  79208. if (t1[i] >= d[i]) {
  79209. sp_3072_sub_96(r, t1, d);
  79210. }
  79211. else {
  79212. XMEMCPY(r, t1, sizeof(*t1) * 96);
  79213. }
  79214. return MP_OKAY;
  79215. }
  79216. /* Reduce a modulo m into r. (r = a mod m)
  79217. *
  79218. * r A single precision number that is the reduced result.
  79219. * a A single precision number that is to be reduced.
  79220. * m A single precision number that is the modulus to reduce with.
  79221. * returns MP_OKAY indicating success.
  79222. */
  79223. static WC_INLINE int sp_3072_mod_96_cond(sp_digit* r, const sp_digit* a, const sp_digit* m)
  79224. {
  79225. int ret;
  79226. ret = sp_3072_div_96_cond(a, m, NULL, r);
  79227. return ret;
  79228. }
  79229. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  79230. /* AND m into each word of a and store in r.
  79231. *
  79232. * r A single precision integer.
  79233. * a A single precision integer.
  79234. * m Mask to AND against each digit.
  79235. */
  79236. static void sp_3072_mask_96(sp_digit* r, const sp_digit* a, sp_digit m)
  79237. {
  79238. #ifdef WOLFSSL_SP_SMALL
  79239. int i;
  79240. for (i=0; i<96; i++) {
  79241. r[i] = a[i] & m;
  79242. }
  79243. #else
  79244. int i;
  79245. for (i = 0; i < 96; i += 8) {
  79246. r[i+0] = a[i+0] & m;
  79247. r[i+1] = a[i+1] & m;
  79248. r[i+2] = a[i+2] & m;
  79249. r[i+3] = a[i+3] & m;
  79250. r[i+4] = a[i+4] & m;
  79251. r[i+5] = a[i+5] & m;
  79252. r[i+6] = a[i+6] & m;
  79253. r[i+7] = a[i+7] & m;
  79254. }
  79255. #endif
  79256. }
  79257. /* Compare a with b in constant time.
  79258. *
  79259. * a A single precision integer.
  79260. * b A single precision integer.
  79261. * return -ve, 0 or +ve if a is less than, equal to or greater than b
  79262. * respectively.
  79263. */
  79264. SP_NOINLINE static sp_int32 sp_3072_cmp_96(const sp_digit* a, const sp_digit* b)
  79265. {
  79266. __asm__ __volatile__ (
  79267. "movs r2, #0\n\t"
  79268. "movs r3, #0\n\t"
  79269. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79270. "mvns r3, r3\n\t"
  79271. #else
  79272. "mvn r3, r3\n\t"
  79273. #endif
  79274. "movs r6, #0xff\n\t"
  79275. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79276. "adds r6, r6, #0x7d\n\t"
  79277. #else
  79278. "add r6, r6, #0x7d\n\t"
  79279. #endif
  79280. "\n"
  79281. "L_sp_3072_cmp_96_words_%=:\n\t"
  79282. "ldr r7, [%[a], r6]\n\t"
  79283. "ldr r5, [%[b], r6]\n\t"
  79284. #ifdef WOLFSSL_KEIL
  79285. "ands r7, r7, r3\n\t"
  79286. #elif defined(__clang__)
  79287. "ands r7, r3\n\t"
  79288. #else
  79289. "and r7, r3\n\t"
  79290. #endif
  79291. #ifdef WOLFSSL_KEIL
  79292. "ands r5, r5, r3\n\t"
  79293. #elif defined(__clang__)
  79294. "ands r5, r3\n\t"
  79295. #else
  79296. "and r5, r3\n\t"
  79297. #endif
  79298. "movs r4, r7\n\t"
  79299. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79300. "subs r7, r7, r5\n\t"
  79301. #else
  79302. "sub r7, r7, r5\n\t"
  79303. #endif
  79304. #ifdef WOLFSSL_KEIL
  79305. "sbcs r7, r7, r7\n\t"
  79306. #elif defined(__clang__)
  79307. "sbcs r7, r7\n\t"
  79308. #else
  79309. "sbc r7, r7\n\t"
  79310. #endif
  79311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79312. "adds r2, r2, r7\n\t"
  79313. #else
  79314. "add r2, r2, r7\n\t"
  79315. #endif
  79316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79317. "mvns r7, r7\n\t"
  79318. #else
  79319. "mvn r7, r7\n\t"
  79320. #endif
  79321. #ifdef WOLFSSL_KEIL
  79322. "ands r3, r3, r7\n\t"
  79323. #elif defined(__clang__)
  79324. "ands r3, r7\n\t"
  79325. #else
  79326. "and r3, r7\n\t"
  79327. #endif
  79328. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79329. "subs r5, r5, r4\n\t"
  79330. #else
  79331. "sub r5, r5, r4\n\t"
  79332. #endif
  79333. #ifdef WOLFSSL_KEIL
  79334. "sbcs r7, r7, r7\n\t"
  79335. #elif defined(__clang__)
  79336. "sbcs r7, r7\n\t"
  79337. #else
  79338. "sbc r7, r7\n\t"
  79339. #endif
  79340. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79341. "subs r2, r2, r7\n\t"
  79342. #else
  79343. "sub r2, r2, r7\n\t"
  79344. #endif
  79345. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79346. "mvns r7, r7\n\t"
  79347. #else
  79348. "mvn r7, r7\n\t"
  79349. #endif
  79350. #ifdef WOLFSSL_KEIL
  79351. "ands r3, r3, r7\n\t"
  79352. #elif defined(__clang__)
  79353. "ands r3, r7\n\t"
  79354. #else
  79355. "and r3, r7\n\t"
  79356. #endif
  79357. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79358. "subs r6, r6, #4\n\t"
  79359. #else
  79360. "sub r6, r6, #4\n\t"
  79361. #endif
  79362. "bge L_sp_3072_cmp_96_words_%=\n\t"
  79363. "movs %[a], r2\n\t"
  79364. : [a] "+l" (a), [b] "+l" (b)
  79365. :
  79366. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  79367. );
  79368. return (uint32_t)(size_t)a;
  79369. }
  79370. /* Divide d in a and put remainder into r (m*d + r = a)
  79371. * m is not calculated as it is not needed at this time.
  79372. *
  79373. * a Number to be divided.
  79374. * d Number to divide with.
  79375. * m Multiplier result.
  79376. * r Remainder from the division.
  79377. * returns MP_OKAY indicating success.
  79378. */
  79379. static WC_INLINE int sp_3072_div_96(const sp_digit* a, const sp_digit* d, sp_digit* m,
  79380. sp_digit* r)
  79381. {
  79382. sp_digit t1[192], t2[97];
  79383. sp_digit div, r1;
  79384. int i;
  79385. (void)m;
  79386. div = d[95];
  79387. XMEMCPY(t1, a, sizeof(*t1) * 2 * 96);
  79388. r1 = sp_3072_cmp_96(&t1[96], d) >= 0;
  79389. sp_3072_cond_sub_96(&t1[96], &t1[96], d, (sp_digit)0 - r1);
  79390. for (i = 95; i >= 0; i--) {
  79391. volatile sp_digit mask = (sp_digit)0 - (t1[96 + i] == div);
  79392. sp_digit hi = t1[96 + i] + mask;
  79393. r1 = div_3072_word_96(hi, t1[96 + i - 1], div);
  79394. r1 |= mask;
  79395. sp_3072_mul_d_96(t2, d, r1);
  79396. t1[96 + i] += sp_3072_sub_in_place_96(&t1[i], t2);
  79397. t1[96 + i] -= t2[96];
  79398. sp_3072_mask_96(t2, d, t1[96 + i]);
  79399. t1[96 + i] += sp_3072_add_96(&t1[i], &t1[i], t2);
  79400. sp_3072_mask_96(t2, d, t1[96 + i]);
  79401. t1[96 + i] += sp_3072_add_96(&t1[i], &t1[i], t2);
  79402. }
  79403. r1 = sp_3072_cmp_96(t1, d) >= 0;
  79404. sp_3072_cond_sub_96(r, t1, d, (sp_digit)0 - r1);
  79405. return MP_OKAY;
  79406. }
  79407. /* Reduce a modulo m into r. (r = a mod m)
  79408. *
  79409. * r A single precision number that is the reduced result.
  79410. * a A single precision number that is to be reduced.
  79411. * m A single precision number that is the modulus to reduce with.
  79412. * returns MP_OKAY indicating success.
  79413. */
  79414. static WC_INLINE int sp_3072_mod_96(sp_digit* r, const sp_digit* a, const sp_digit* m)
  79415. {
  79416. int ret;
  79417. ret = sp_3072_div_96(a, m, NULL, r);
  79418. return ret;
  79419. }
  79420. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || \
  79421. defined(WOLFSSL_HAVE_SP_DH)
  79422. #ifdef WOLFSSL_SP_SMALL
  79423. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  79424. *
  79425. * r A single precision number that is the result of the operation.
  79426. * a A single precision number being exponentiated.
  79427. * e A single precision number that is the exponent.
  79428. * bits The number of bits in the exponent.
  79429. * m A single precision number that is the modulus.
  79430. * returns 0 on success.
  79431. * returns MEMORY_E on dynamic memory allocation failure.
  79432. * returns MP_VAL when base is even or exponent is 0.
  79433. */
  79434. static int sp_3072_mod_exp_96(sp_digit* r, const sp_digit* a, const sp_digit* e,
  79435. int bits, const sp_digit* m, int reduceA)
  79436. {
  79437. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  79438. sp_digit* td = NULL;
  79439. #else
  79440. sp_digit td[8 * 192];
  79441. #endif
  79442. sp_digit* t[8];
  79443. sp_digit* norm = NULL;
  79444. sp_digit mp = 1;
  79445. sp_digit n;
  79446. sp_digit mask;
  79447. int i;
  79448. int c;
  79449. byte y;
  79450. int err = MP_OKAY;
  79451. if (bits == 0) {
  79452. err = MP_VAL;
  79453. }
  79454. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  79455. if (err == MP_OKAY) {
  79456. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (8 * 192), NULL,
  79457. DYNAMIC_TYPE_TMP_BUFFER);
  79458. if (td == NULL)
  79459. err = MEMORY_E;
  79460. }
  79461. #endif
  79462. if (err == MP_OKAY) {
  79463. norm = td;
  79464. for (i=0; i<8; i++) {
  79465. t[i] = td + i * 192;
  79466. }
  79467. sp_3072_mont_setup(m, &mp);
  79468. sp_3072_mont_norm_96(norm, m);
  79469. XMEMSET(t[1], 0, sizeof(sp_digit) * 96U);
  79470. if (reduceA != 0) {
  79471. err = sp_3072_mod_96(t[1] + 96, a, m);
  79472. if (err == MP_OKAY) {
  79473. err = sp_3072_mod_96(t[1], t[1], m);
  79474. }
  79475. }
  79476. else {
  79477. XMEMCPY(t[1] + 96, a, sizeof(sp_digit) * 96);
  79478. err = sp_3072_mod_96(t[1], t[1], m);
  79479. }
  79480. }
  79481. if (err == MP_OKAY) {
  79482. sp_3072_mont_sqr_96(t[ 2], t[ 1], m, mp);
  79483. sp_3072_mont_mul_96(t[ 3], t[ 2], t[ 1], m, mp);
  79484. sp_3072_mont_sqr_96(t[ 4], t[ 2], m, mp);
  79485. sp_3072_mont_mul_96(t[ 5], t[ 3], t[ 2], m, mp);
  79486. sp_3072_mont_sqr_96(t[ 6], t[ 3], m, mp);
  79487. sp_3072_mont_mul_96(t[ 7], t[ 4], t[ 3], m, mp);
  79488. i = (bits - 1) / 32;
  79489. n = e[i--];
  79490. c = bits & 31;
  79491. if (c == 0) {
  79492. c = 32;
  79493. }
  79494. c -= bits % 3;
  79495. if (c == 32) {
  79496. c = 29;
  79497. }
  79498. if (c < 0) {
  79499. /* Number of bits in top word is less than number needed. */
  79500. c = -c;
  79501. y = (byte)(n << c);
  79502. n = e[i--];
  79503. y |= (byte)(n >> (64 - c));
  79504. n <<= c;
  79505. c = 64 - c;
  79506. }
  79507. else if (c == 0) {
  79508. /* All bits in top word used. */
  79509. y = (byte)n;
  79510. }
  79511. else {
  79512. y = (byte)(n >> c);
  79513. n <<= 32 - c;
  79514. }
  79515. XMEMCPY(r, t[y], sizeof(sp_digit) * 96);
  79516. for (; i>=0 || c>=3; ) {
  79517. if (c == 0) {
  79518. n = e[i--];
  79519. y = (byte)(n >> 29);
  79520. n <<= 3;
  79521. c = 29;
  79522. }
  79523. else if (c < 3) {
  79524. y = (byte)(n >> 29);
  79525. n = e[i--];
  79526. c = 3 - c;
  79527. y |= (byte)(n >> (32 - c));
  79528. n <<= c;
  79529. c = 32 - c;
  79530. }
  79531. else {
  79532. y = (byte)((n >> 29) & 0x7);
  79533. n <<= 3;
  79534. c -= 3;
  79535. }
  79536. sp_3072_mont_sqr_96(r, r, m, mp);
  79537. sp_3072_mont_sqr_96(r, r, m, mp);
  79538. sp_3072_mont_sqr_96(r, r, m, mp);
  79539. sp_3072_mont_mul_96(r, r, t[y], m, mp);
  79540. }
  79541. XMEMSET(&r[96], 0, sizeof(sp_digit) * 96U);
  79542. sp_3072_mont_reduce_96(r, m, mp);
  79543. mask = 0 - (sp_3072_cmp_96(r, m) >= 0);
  79544. sp_3072_cond_sub_96(r, r, m, mask);
  79545. }
  79546. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  79547. if (td != NULL)
  79548. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  79549. #endif
  79550. return err;
  79551. }
  79552. #else
  79553. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  79554. *
  79555. * r A single precision number that is the result of the operation.
  79556. * a A single precision number being exponentiated.
  79557. * e A single precision number that is the exponent.
  79558. * bits The number of bits in the exponent.
  79559. * m A single precision number that is the modulus.
  79560. * returns 0 on success.
  79561. * returns MEMORY_E on dynamic memory allocation failure.
  79562. * returns MP_VAL when base is even or exponent is 0.
  79563. */
  79564. static int sp_3072_mod_exp_96(sp_digit* r, const sp_digit* a, const sp_digit* e,
  79565. int bits, const sp_digit* m, int reduceA)
  79566. {
  79567. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  79568. sp_digit* td = NULL;
  79569. #else
  79570. sp_digit td[16 * 192];
  79571. #endif
  79572. sp_digit* t[16];
  79573. sp_digit* norm = NULL;
  79574. sp_digit mp = 1;
  79575. sp_digit n;
  79576. sp_digit mask;
  79577. int i;
  79578. int c;
  79579. byte y;
  79580. int err = MP_OKAY;
  79581. if (bits == 0) {
  79582. err = MP_VAL;
  79583. }
  79584. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  79585. if (err == MP_OKAY) {
  79586. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (16 * 192), NULL,
  79587. DYNAMIC_TYPE_TMP_BUFFER);
  79588. if (td == NULL)
  79589. err = MEMORY_E;
  79590. }
  79591. #endif
  79592. if (err == MP_OKAY) {
  79593. norm = td;
  79594. for (i=0; i<16; i++) {
  79595. t[i] = td + i * 192;
  79596. }
  79597. sp_3072_mont_setup(m, &mp);
  79598. sp_3072_mont_norm_96(norm, m);
  79599. XMEMSET(t[1], 0, sizeof(sp_digit) * 96U);
  79600. if (reduceA != 0) {
  79601. err = sp_3072_mod_96(t[1] + 96, a, m);
  79602. if (err == MP_OKAY) {
  79603. err = sp_3072_mod_96(t[1], t[1], m);
  79604. }
  79605. }
  79606. else {
  79607. XMEMCPY(t[1] + 96, a, sizeof(sp_digit) * 96);
  79608. err = sp_3072_mod_96(t[1], t[1], m);
  79609. }
  79610. }
  79611. if (err == MP_OKAY) {
  79612. sp_3072_mont_sqr_96(t[ 2], t[ 1], m, mp);
  79613. sp_3072_mont_mul_96(t[ 3], t[ 2], t[ 1], m, mp);
  79614. sp_3072_mont_sqr_96(t[ 4], t[ 2], m, mp);
  79615. sp_3072_mont_mul_96(t[ 5], t[ 3], t[ 2], m, mp);
  79616. sp_3072_mont_sqr_96(t[ 6], t[ 3], m, mp);
  79617. sp_3072_mont_mul_96(t[ 7], t[ 4], t[ 3], m, mp);
  79618. sp_3072_mont_sqr_96(t[ 8], t[ 4], m, mp);
  79619. sp_3072_mont_mul_96(t[ 9], t[ 5], t[ 4], m, mp);
  79620. sp_3072_mont_sqr_96(t[10], t[ 5], m, mp);
  79621. sp_3072_mont_mul_96(t[11], t[ 6], t[ 5], m, mp);
  79622. sp_3072_mont_sqr_96(t[12], t[ 6], m, mp);
  79623. sp_3072_mont_mul_96(t[13], t[ 7], t[ 6], m, mp);
  79624. sp_3072_mont_sqr_96(t[14], t[ 7], m, mp);
  79625. sp_3072_mont_mul_96(t[15], t[ 8], t[ 7], m, mp);
  79626. i = (bits - 1) / 32;
  79627. n = e[i--];
  79628. c = bits & 31;
  79629. if (c == 0) {
  79630. c = 32;
  79631. }
  79632. c -= bits % 4;
  79633. if (c == 32) {
  79634. c = 28;
  79635. }
  79636. if (c < 0) {
  79637. /* Number of bits in top word is less than number needed. */
  79638. c = -c;
  79639. y = (byte)(n << c);
  79640. n = e[i--];
  79641. y |= (byte)(n >> (64 - c));
  79642. n <<= c;
  79643. c = 64 - c;
  79644. }
  79645. else if (c == 0) {
  79646. /* All bits in top word used. */
  79647. y = (byte)n;
  79648. }
  79649. else {
  79650. y = (byte)(n >> c);
  79651. n <<= 32 - c;
  79652. }
  79653. XMEMCPY(r, t[y], sizeof(sp_digit) * 96);
  79654. for (; i>=0 || c>=4; ) {
  79655. if (c == 0) {
  79656. n = e[i--];
  79657. y = (byte)(n >> 28);
  79658. n <<= 4;
  79659. c = 28;
  79660. }
  79661. else if (c < 4) {
  79662. y = (byte)(n >> 28);
  79663. n = e[i--];
  79664. c = 4 - c;
  79665. y |= (byte)(n >> (32 - c));
  79666. n <<= c;
  79667. c = 32 - c;
  79668. }
  79669. else {
  79670. y = (byte)((n >> 28) & 0xf);
  79671. n <<= 4;
  79672. c -= 4;
  79673. }
  79674. sp_3072_mont_sqr_96(r, r, m, mp);
  79675. sp_3072_mont_sqr_96(r, r, m, mp);
  79676. sp_3072_mont_sqr_96(r, r, m, mp);
  79677. sp_3072_mont_sqr_96(r, r, m, mp);
  79678. sp_3072_mont_mul_96(r, r, t[y], m, mp);
  79679. }
  79680. XMEMSET(&r[96], 0, sizeof(sp_digit) * 96U);
  79681. sp_3072_mont_reduce_96(r, m, mp);
  79682. mask = 0 - (sp_3072_cmp_96(r, m) >= 0);
  79683. sp_3072_cond_sub_96(r, r, m, mask);
  79684. }
  79685. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  79686. if (td != NULL)
  79687. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  79688. #endif
  79689. return err;
  79690. }
  79691. #endif /* WOLFSSL_SP_SMALL */
  79692. #endif /* (WOLFSSL_HAVE_SP_RSA && !WOLFSSL_RSA_PUBLIC_ONLY) || WOLFSSL_HAVE_SP_DH */
  79693. #endif /* (WOLFSSL_HAVE_SP_RSA && !WOLFSSL_RSA_PUBLIC_ONLY) || WOLFSSL_HAVE_SP_DH */
  79694. #ifdef WOLFSSL_HAVE_SP_RSA
  79695. /* RSA public key operation.
  79696. *
  79697. * in Array of bytes representing the number to exponentiate, base.
  79698. * inLen Number of bytes in base.
  79699. * em Public exponent.
  79700. * mm Modulus.
  79701. * out Buffer to hold big-endian bytes of exponentiation result.
  79702. * Must be at least 384 bytes long.
  79703. * outLen Number of bytes in result.
  79704. * returns 0 on success, MP_TO_E when the outLen is too small, MP_READ_E when
  79705. * an array is too long and MEMORY_E when dynamic memory allocation fails.
  79706. */
  79707. int sp_RsaPublic_3072(const byte* in, word32 inLen, const mp_int* em,
  79708. const mp_int* mm, byte* out, word32* outLen)
  79709. {
  79710. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  79711. sp_digit* a = NULL;
  79712. #else
  79713. sp_digit a[96 * 5];
  79714. #endif
  79715. sp_digit* m = NULL;
  79716. sp_digit* r = NULL;
  79717. sp_digit *ah = NULL;
  79718. sp_digit e[1] = {0};
  79719. int err = MP_OKAY;
  79720. if (*outLen < 384) {
  79721. err = MP_TO_E;
  79722. }
  79723. else if (mp_count_bits(em) > 32 || inLen > 384 ||
  79724. mp_count_bits(mm) != 3072) {
  79725. err = MP_READ_E;
  79726. }
  79727. else if (mp_iseven(mm)) {
  79728. err = MP_VAL;
  79729. }
  79730. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  79731. if (err == MP_OKAY) {
  79732. a = (sp_digit*)XMALLOC(sizeof(sp_digit) * 96 * 5, NULL,
  79733. DYNAMIC_TYPE_RSA);
  79734. if (a == NULL)
  79735. err = MEMORY_E;
  79736. }
  79737. #endif
  79738. if (err == MP_OKAY) {
  79739. ah = a + 96;
  79740. r = a + 96 * 2;
  79741. m = r + 96 * 2;
  79742. sp_3072_from_bin(ah, 96, in, inLen);
  79743. #if DIGIT_BIT >= 32
  79744. e[0] = em->dp[0];
  79745. #else
  79746. e[0] = em->dp[0];
  79747. if (em->used > 1) {
  79748. e[0] |= ((sp_digit)em->dp[1]) << DIGIT_BIT;
  79749. }
  79750. #endif
  79751. if (e[0] == 0) {
  79752. err = MP_EXPTMOD_E;
  79753. }
  79754. }
  79755. if (err == MP_OKAY) {
  79756. sp_3072_from_mp(m, 96, mm);
  79757. if (e[0] == 0x10001) {
  79758. int i;
  79759. sp_digit mp;
  79760. sp_3072_mont_setup(m, &mp);
  79761. /* Convert to Montgomery form. */
  79762. XMEMSET(a, 0, sizeof(sp_digit) * 96);
  79763. err = sp_3072_mod_96_cond(r, a, m);
  79764. /* Montgomery form: r = a.R mod m */
  79765. if (err == MP_OKAY) {
  79766. /* r = a ^ 0x10000 => r = a squared 16 times */
  79767. for (i = 15; i >= 0; i--) {
  79768. sp_3072_mont_sqr_96(r, r, m, mp);
  79769. }
  79770. /* mont_red(r.R.R) = (r.R.R / R) mod m = r.R mod m
  79771. * mont_red(r.R * a) = (r.R.a / R) mod m = r.a mod m
  79772. */
  79773. sp_3072_mont_mul_96(r, r, ah, m, mp);
  79774. for (i = 95; i > 0; i--) {
  79775. if (r[i] != m[i]) {
  79776. break;
  79777. }
  79778. }
  79779. if (r[i] >= m[i]) {
  79780. sp_3072_sub_in_place_96(r, m);
  79781. }
  79782. }
  79783. }
  79784. else if (e[0] == 0x3) {
  79785. if (err == MP_OKAY) {
  79786. sp_3072_sqr_96(r, ah);
  79787. err = sp_3072_mod_96_cond(r, r, m);
  79788. }
  79789. if (err == MP_OKAY) {
  79790. sp_3072_mul_96(r, ah, r);
  79791. err = sp_3072_mod_96_cond(r, r, m);
  79792. }
  79793. }
  79794. else {
  79795. int i;
  79796. sp_digit mp;
  79797. sp_3072_mont_setup(m, &mp);
  79798. /* Convert to Montgomery form. */
  79799. XMEMSET(a, 0, sizeof(sp_digit) * 96);
  79800. err = sp_3072_mod_96_cond(a, a, m);
  79801. if (err == MP_OKAY) {
  79802. for (i = 31; i >= 0; i--) {
  79803. if (e[0] >> i) {
  79804. break;
  79805. }
  79806. }
  79807. XMEMCPY(r, a, sizeof(sp_digit) * 96);
  79808. for (i--; i >= 0; i--) {
  79809. sp_3072_mont_sqr_96(r, r, m, mp);
  79810. if (((e[0] >> i) & 1) == 1) {
  79811. sp_3072_mont_mul_96(r, r, a, m, mp);
  79812. }
  79813. }
  79814. XMEMSET(&r[96], 0, sizeof(sp_digit) * 96);
  79815. sp_3072_mont_reduce_96(r, m, mp);
  79816. for (i = 95; i > 0; i--) {
  79817. if (r[i] != m[i]) {
  79818. break;
  79819. }
  79820. }
  79821. if (r[i] >= m[i]) {
  79822. sp_3072_sub_in_place_96(r, m);
  79823. }
  79824. }
  79825. }
  79826. }
  79827. if (err == MP_OKAY) {
  79828. sp_3072_to_bin_96(r, out);
  79829. *outLen = 384;
  79830. }
  79831. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  79832. if (a != NULL)
  79833. XFREE(a, NULL, DYNAMIC_TYPE_RSA);
  79834. #endif
  79835. return err;
  79836. }
  79837. #ifndef WOLFSSL_RSA_PUBLIC_ONLY
  79838. /* Conditionally add a and b using the mask m.
  79839. * m is -1 to add and 0 when not.
  79840. *
  79841. * r A single precision number representing conditional add result.
  79842. * a A single precision number to add with.
  79843. * b A single precision number to add.
  79844. * m Mask value to apply.
  79845. */
  79846. SP_NOINLINE static sp_digit sp_3072_cond_add_48(sp_digit* r, const sp_digit* a,
  79847. const sp_digit* b, sp_digit m)
  79848. {
  79849. __asm__ __volatile__ (
  79850. "movs r4, #0\n\t"
  79851. "movs r5, #0xc0\n\t"
  79852. "mov r8, r5\n\t"
  79853. "movs r7, #0\n\t"
  79854. "\n"
  79855. "L_sp_3072_cond_add_48_words_%=:\n\t"
  79856. "ldr r6, [%[b], r7]\n\t"
  79857. #ifdef WOLFSSL_KEIL
  79858. "ands r6, r6, %[m]\n\t"
  79859. #elif defined(__clang__)
  79860. "ands r6, %[m]\n\t"
  79861. #else
  79862. "and r6, %[m]\n\t"
  79863. #endif
  79864. "movs r5, #0\n\t"
  79865. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79866. "subs r5, r5, #1\n\t"
  79867. #else
  79868. "sub r5, r5, #1\n\t"
  79869. #endif
  79870. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79871. "adds r5, r5, r4\n\t"
  79872. #else
  79873. "add r5, r5, r4\n\t"
  79874. #endif
  79875. "ldr r5, [%[a], r7]\n\t"
  79876. #ifdef WOLFSSL_KEIL
  79877. "adcs r5, r5, r6\n\t"
  79878. #elif defined(__clang__)
  79879. "adcs r5, r6\n\t"
  79880. #else
  79881. "adc r5, r6\n\t"
  79882. #endif
  79883. "movs r4, #0\n\t"
  79884. #ifdef WOLFSSL_KEIL
  79885. "adcs r4, r4, r4\n\t"
  79886. #elif defined(__clang__)
  79887. "adcs r4, r4\n\t"
  79888. #else
  79889. "adc r4, r4\n\t"
  79890. #endif
  79891. "str r5, [%[r], r7]\n\t"
  79892. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79893. "adds r7, r7, #4\n\t"
  79894. #else
  79895. "add r7, r7, #4\n\t"
  79896. #endif
  79897. "cmp r7, r8\n\t"
  79898. "blt L_sp_3072_cond_add_48_words_%=\n\t"
  79899. "movs %[r], r4\n\t"
  79900. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m)
  79901. :
  79902. : "memory", "r4", "r5", "r6", "r7", "r8"
  79903. );
  79904. return (uint32_t)(size_t)r;
  79905. }
  79906. /* RSA private key operation.
  79907. *
  79908. * in Array of bytes representing the number to exponentiate, base.
  79909. * inLen Number of bytes in base.
  79910. * dm Private exponent.
  79911. * pm First prime.
  79912. * qm Second prime.
  79913. * dpm First prime's CRT exponent.
  79914. * dqm Second prime's CRT exponent.
  79915. * qim Inverse of second prime mod p.
  79916. * mm Modulus.
  79917. * out Buffer to hold big-endian bytes of exponentiation result.
  79918. * Must be at least 384 bytes long.
  79919. * outLen Number of bytes in result.
  79920. * returns 0 on success, MP_TO_E when the outLen is too small, MP_READ_E when
  79921. * an array is too long and MEMORY_E when dynamic memory allocation fails.
  79922. */
  79923. int sp_RsaPrivate_3072(const byte* in, word32 inLen, const mp_int* dm,
  79924. const mp_int* pm, const mp_int* qm, const mp_int* dpm, const mp_int* dqm,
  79925. const mp_int* qim, const mp_int* mm, byte* out, word32* outLen)
  79926. {
  79927. #if defined(SP_RSA_PRIVATE_EXP_D) || defined(RSA_LOW_MEM)
  79928. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  79929. sp_digit* d = NULL;
  79930. #else
  79931. sp_digit d[96 * 4];
  79932. #endif
  79933. sp_digit* a = NULL;
  79934. sp_digit* m = NULL;
  79935. sp_digit* r = NULL;
  79936. int err = MP_OKAY;
  79937. (void)pm;
  79938. (void)qm;
  79939. (void)dpm;
  79940. (void)dqm;
  79941. (void)qim;
  79942. if (*outLen < 384U) {
  79943. err = MP_TO_E;
  79944. }
  79945. if (err == MP_OKAY) {
  79946. if (mp_count_bits(dm) > 3072) {
  79947. err = MP_READ_E;
  79948. }
  79949. else if (inLen > 384) {
  79950. err = MP_READ_E;
  79951. }
  79952. else if (mp_count_bits(mm) != 3072) {
  79953. err = MP_READ_E;
  79954. }
  79955. else if (mp_iseven(mm)) {
  79956. err = MP_VAL;
  79957. }
  79958. }
  79959. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  79960. if (err == MP_OKAY) {
  79961. d = (sp_digit*)XMALLOC(sizeof(sp_digit) * 96 * 4, NULL,
  79962. DYNAMIC_TYPE_RSA);
  79963. if (d == NULL)
  79964. err = MEMORY_E;
  79965. }
  79966. #endif
  79967. if (err == MP_OKAY) {
  79968. a = d + 96;
  79969. m = a + 192;
  79970. r = a;
  79971. sp_3072_from_bin(a, 96, in, inLen);
  79972. sp_3072_from_mp(d, 96, dm);
  79973. sp_3072_from_mp(m, 96, mm);
  79974. err = sp_3072_mod_exp_96(r, a, d, 3072, m, 0);
  79975. }
  79976. if (err == MP_OKAY) {
  79977. sp_3072_to_bin_96(r, out);
  79978. *outLen = 384;
  79979. }
  79980. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  79981. if (d != NULL)
  79982. #endif
  79983. {
  79984. /* only "a" and "r" are sensitive and need zeroized (same pointer) */
  79985. if (a != NULL)
  79986. ForceZero(a, sizeof(sp_digit) * 96);
  79987. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  79988. XFREE(d, NULL, DYNAMIC_TYPE_RSA);
  79989. #endif
  79990. }
  79991. return err;
  79992. #else
  79993. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  79994. sp_digit* a = NULL;
  79995. #else
  79996. sp_digit a[48 * 11];
  79997. #endif
  79998. sp_digit* p = NULL;
  79999. sp_digit* q = NULL;
  80000. sp_digit* dp = NULL;
  80001. sp_digit* tmpa = NULL;
  80002. sp_digit* tmpb = NULL;
  80003. sp_digit* r = NULL;
  80004. sp_digit* qi = NULL;
  80005. sp_digit* dq = NULL;
  80006. sp_digit c;
  80007. int err = MP_OKAY;
  80008. (void)dm;
  80009. (void)mm;
  80010. if (*outLen < 384) {
  80011. err = MP_TO_E;
  80012. }
  80013. else if (inLen > 384 || mp_count_bits(mm) != 3072) {
  80014. err = MP_READ_E;
  80015. }
  80016. else if (mp_iseven(mm)) {
  80017. err = MP_VAL;
  80018. }
  80019. else if (mp_iseven(pm)) {
  80020. err = MP_VAL;
  80021. }
  80022. else if (mp_iseven(qm)) {
  80023. err = MP_VAL;
  80024. }
  80025. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  80026. if (err == MP_OKAY) {
  80027. a = (sp_digit*)XMALLOC(sizeof(sp_digit) * 48 * 11, NULL,
  80028. DYNAMIC_TYPE_RSA);
  80029. if (a == NULL)
  80030. err = MEMORY_E;
  80031. }
  80032. #endif
  80033. if (err == MP_OKAY) {
  80034. p = a + 96 * 2;
  80035. q = p + 48;
  80036. qi = dq = dp = q + 48;
  80037. tmpa = qi + 48;
  80038. tmpb = tmpa + 96;
  80039. r = a;
  80040. sp_3072_from_bin(a, 96, in, inLen);
  80041. sp_3072_from_mp(p, 48, pm);
  80042. sp_3072_from_mp(q, 48, qm);
  80043. sp_3072_from_mp(dp, 48, dpm);
  80044. err = sp_3072_mod_exp_48(tmpa, a, dp, 1536, p, 1);
  80045. }
  80046. if (err == MP_OKAY) {
  80047. sp_3072_from_mp(dq, 48, dqm);
  80048. err = sp_3072_mod_exp_48(tmpb, a, dq, 1536, q, 1);
  80049. }
  80050. if (err == MP_OKAY) {
  80051. c = sp_3072_sub_in_place_48(tmpa, tmpb);
  80052. c += sp_3072_cond_add_48(tmpa, tmpa, p, c);
  80053. sp_3072_cond_add_48(tmpa, tmpa, p, c);
  80054. sp_3072_from_mp(qi, 48, qim);
  80055. sp_3072_mul_48(tmpa, tmpa, qi);
  80056. err = sp_3072_mod_48(tmpa, tmpa, p);
  80057. }
  80058. if (err == MP_OKAY) {
  80059. sp_3072_mul_48(tmpa, q, tmpa);
  80060. XMEMSET(&tmpb[48], 0, sizeof(sp_digit) * 48);
  80061. sp_3072_add_96(r, tmpb, tmpa);
  80062. sp_3072_to_bin_96(r, out);
  80063. *outLen = 384;
  80064. }
  80065. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  80066. if (a != NULL)
  80067. #endif
  80068. {
  80069. ForceZero(a, sizeof(sp_digit) * 48 * 11);
  80070. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  80071. XFREE(a, NULL, DYNAMIC_TYPE_RSA);
  80072. #endif
  80073. }
  80074. #endif /* SP_RSA_PRIVATE_EXP_D || RSA_LOW_MEM */
  80075. return err;
  80076. }
  80077. #endif /* WOLFSSL_RSA_PUBLIC_ONLY */
  80078. #endif /* WOLFSSL_HAVE_SP_RSA */
  80079. #if defined(WOLFSSL_HAVE_SP_DH) || (defined(WOLFSSL_HAVE_SP_RSA) && \
  80080. !defined(WOLFSSL_RSA_PUBLIC_ONLY))
  80081. /* Convert an array of sp_digit to an mp_int.
  80082. *
  80083. * a A single precision integer.
  80084. * r A multi-precision integer.
  80085. */
  80086. static int sp_3072_to_mp(const sp_digit* a, mp_int* r)
  80087. {
  80088. int err;
  80089. err = mp_grow(r, (3072 + DIGIT_BIT - 1) / DIGIT_BIT);
  80090. if (err == MP_OKAY) { /*lint !e774 case where err is always MP_OKAY*/
  80091. #if DIGIT_BIT == 32
  80092. XMEMCPY(r->dp, a, sizeof(sp_digit) * 96);
  80093. r->used = 96;
  80094. mp_clamp(r);
  80095. #elif DIGIT_BIT < 32
  80096. int i;
  80097. int j = 0;
  80098. int s = 0;
  80099. r->dp[0] = 0;
  80100. for (i = 0; i < 96; i++) {
  80101. r->dp[j] |= (mp_digit)(a[i] << s);
  80102. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  80103. s = DIGIT_BIT - s;
  80104. r->dp[++j] = (mp_digit)(a[i] >> s);
  80105. while (s + DIGIT_BIT <= 32) {
  80106. s += DIGIT_BIT;
  80107. r->dp[j++] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  80108. if (s == SP_WORD_SIZE) {
  80109. r->dp[j] = 0;
  80110. }
  80111. else {
  80112. r->dp[j] = (mp_digit)(a[i] >> s);
  80113. }
  80114. }
  80115. s = 32 - s;
  80116. }
  80117. r->used = (3072 + DIGIT_BIT - 1) / DIGIT_BIT;
  80118. mp_clamp(r);
  80119. #else
  80120. int i;
  80121. int j = 0;
  80122. int s = 0;
  80123. r->dp[0] = 0;
  80124. for (i = 0; i < 96; i++) {
  80125. r->dp[j] |= ((mp_digit)a[i]) << s;
  80126. if (s + 32 >= DIGIT_BIT) {
  80127. #if DIGIT_BIT != 32 && DIGIT_BIT != 64
  80128. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  80129. #endif
  80130. s = DIGIT_BIT - s;
  80131. r->dp[++j] = a[i] >> s;
  80132. s = 32 - s;
  80133. }
  80134. else {
  80135. s += 32;
  80136. }
  80137. }
  80138. r->used = (3072 + DIGIT_BIT - 1) / DIGIT_BIT;
  80139. mp_clamp(r);
  80140. #endif
  80141. }
  80142. return err;
  80143. }
  80144. /* Perform the modular exponentiation for Diffie-Hellman.
  80145. *
  80146. * base Base. MP integer.
  80147. * exp Exponent. MP integer.
  80148. * mod Modulus. MP integer.
  80149. * res Result. MP integer.
  80150. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  80151. * and MEMORY_E if memory allocation fails.
  80152. */
  80153. int sp_ModExp_3072(const mp_int* base, const mp_int* exp, const mp_int* mod,
  80154. mp_int* res)
  80155. {
  80156. int err = MP_OKAY;
  80157. sp_digit b[192];
  80158. sp_digit e[96];
  80159. sp_digit m[96];
  80160. sp_digit* r = b;
  80161. int expBits = mp_count_bits(exp);
  80162. if (mp_count_bits(base) > 3072) {
  80163. err = MP_READ_E;
  80164. }
  80165. else if (expBits > 3072) {
  80166. err = MP_READ_E;
  80167. }
  80168. else if (mp_count_bits(mod) != 3072) {
  80169. err = MP_READ_E;
  80170. }
  80171. else if (mp_iseven(mod)) {
  80172. err = MP_VAL;
  80173. }
  80174. if (err == MP_OKAY) {
  80175. sp_3072_from_mp(b, 96, base);
  80176. sp_3072_from_mp(e, 96, exp);
  80177. sp_3072_from_mp(m, 96, mod);
  80178. err = sp_3072_mod_exp_96(r, b, e, expBits, m, 0);
  80179. }
  80180. if (err == MP_OKAY) {
  80181. err = sp_3072_to_mp(r, res);
  80182. }
  80183. XMEMSET(e, 0, sizeof(e));
  80184. return err;
  80185. }
  80186. #ifdef WOLFSSL_HAVE_SP_DH
  80187. #ifdef HAVE_FFDHE_3072
  80188. /* Lefy shift a by n bits into r. (r = a << n)
  80189. *
  80190. * r A single precision integer.
  80191. * a A single precision integer.
  80192. * n Integer representing number of bits to shift.
  80193. */
  80194. static void sp_3072_lshift_96(sp_digit* r, const sp_digit* a, byte n)
  80195. {
  80196. __asm__ __volatile__ (
  80197. "movs r7, #31\n\t"
  80198. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80199. "subs r7, r7, %[n]\n\t"
  80200. #else
  80201. "sub r7, r7, %[n]\n\t"
  80202. #endif
  80203. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80204. "adds %[a], %[a], #0xff\n\t"
  80205. #else
  80206. "add %[a], %[a], #0xff\n\t"
  80207. #endif
  80208. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80209. "adds %[r], %[r], #0xff\n\t"
  80210. #else
  80211. "add %[r], %[r], #0xff\n\t"
  80212. #endif
  80213. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80214. "adds %[a], %[a], #0x41\n\t"
  80215. #else
  80216. "add %[a], %[a], #0x41\n\t"
  80217. #endif
  80218. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80219. "adds %[r], %[r], #0x41\n\t"
  80220. #else
  80221. "add %[r], %[r], #0x41\n\t"
  80222. #endif
  80223. "ldr r4, [%[a], #60]\n\t"
  80224. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80225. "lsrs r5, r4, #1\n\t"
  80226. #else
  80227. "lsr r5, r4, #1\n\t"
  80228. #endif
  80229. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80230. "lsls r4, r4, %[n]\n\t"
  80231. #else
  80232. "lsl r4, r4, %[n]\n\t"
  80233. #endif
  80234. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80235. "lsrs r5, r5, r7\n\t"
  80236. #else
  80237. "lsr r5, r5, r7\n\t"
  80238. #endif
  80239. "ldr r3, [%[a], #56]\n\t"
  80240. "str r5, [%[r], #64]\n\t"
  80241. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80242. "lsrs r6, r3, #1\n\t"
  80243. #else
  80244. "lsr r6, r3, #1\n\t"
  80245. #endif
  80246. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80247. "lsls r3, r3, %[n]\n\t"
  80248. #else
  80249. "lsl r3, r3, %[n]\n\t"
  80250. #endif
  80251. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80252. "lsrs r6, r6, r7\n\t"
  80253. #else
  80254. "lsr r6, r6, r7\n\t"
  80255. #endif
  80256. #ifdef WOLFSSL_KEIL
  80257. "orrs r4, r4, r6\n\t"
  80258. #elif defined(__clang__)
  80259. "orrs r4, r6\n\t"
  80260. #else
  80261. "orr r4, r6\n\t"
  80262. #endif
  80263. "ldr r5, [%[a], #52]\n\t"
  80264. "str r4, [%[r], #60]\n\t"
  80265. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80266. "lsrs r6, r5, #1\n\t"
  80267. #else
  80268. "lsr r6, r5, #1\n\t"
  80269. #endif
  80270. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80271. "lsls r5, r5, %[n]\n\t"
  80272. #else
  80273. "lsl r5, r5, %[n]\n\t"
  80274. #endif
  80275. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80276. "lsrs r6, r6, r7\n\t"
  80277. #else
  80278. "lsr r6, r6, r7\n\t"
  80279. #endif
  80280. #ifdef WOLFSSL_KEIL
  80281. "orrs r3, r3, r6\n\t"
  80282. #elif defined(__clang__)
  80283. "orrs r3, r6\n\t"
  80284. #else
  80285. "orr r3, r6\n\t"
  80286. #endif
  80287. "ldr r4, [%[a], #48]\n\t"
  80288. "str r3, [%[r], #56]\n\t"
  80289. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80290. "lsrs r6, r4, #1\n\t"
  80291. #else
  80292. "lsr r6, r4, #1\n\t"
  80293. #endif
  80294. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80295. "lsls r4, r4, %[n]\n\t"
  80296. #else
  80297. "lsl r4, r4, %[n]\n\t"
  80298. #endif
  80299. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80300. "lsrs r6, r6, r7\n\t"
  80301. #else
  80302. "lsr r6, r6, r7\n\t"
  80303. #endif
  80304. #ifdef WOLFSSL_KEIL
  80305. "orrs r5, r5, r6\n\t"
  80306. #elif defined(__clang__)
  80307. "orrs r5, r6\n\t"
  80308. #else
  80309. "orr r5, r6\n\t"
  80310. #endif
  80311. "ldr r3, [%[a], #44]\n\t"
  80312. "str r5, [%[r], #52]\n\t"
  80313. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80314. "lsrs r6, r3, #1\n\t"
  80315. #else
  80316. "lsr r6, r3, #1\n\t"
  80317. #endif
  80318. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80319. "lsls r3, r3, %[n]\n\t"
  80320. #else
  80321. "lsl r3, r3, %[n]\n\t"
  80322. #endif
  80323. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80324. "lsrs r6, r6, r7\n\t"
  80325. #else
  80326. "lsr r6, r6, r7\n\t"
  80327. #endif
  80328. #ifdef WOLFSSL_KEIL
  80329. "orrs r4, r4, r6\n\t"
  80330. #elif defined(__clang__)
  80331. "orrs r4, r6\n\t"
  80332. #else
  80333. "orr r4, r6\n\t"
  80334. #endif
  80335. "ldr r5, [%[a], #40]\n\t"
  80336. "str r4, [%[r], #48]\n\t"
  80337. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80338. "lsrs r6, r5, #1\n\t"
  80339. #else
  80340. "lsr r6, r5, #1\n\t"
  80341. #endif
  80342. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80343. "lsls r5, r5, %[n]\n\t"
  80344. #else
  80345. "lsl r5, r5, %[n]\n\t"
  80346. #endif
  80347. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80348. "lsrs r6, r6, r7\n\t"
  80349. #else
  80350. "lsr r6, r6, r7\n\t"
  80351. #endif
  80352. #ifdef WOLFSSL_KEIL
  80353. "orrs r3, r3, r6\n\t"
  80354. #elif defined(__clang__)
  80355. "orrs r3, r6\n\t"
  80356. #else
  80357. "orr r3, r6\n\t"
  80358. #endif
  80359. "ldr r4, [%[a], #36]\n\t"
  80360. "str r3, [%[r], #44]\n\t"
  80361. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80362. "lsrs r6, r4, #1\n\t"
  80363. #else
  80364. "lsr r6, r4, #1\n\t"
  80365. #endif
  80366. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80367. "lsls r4, r4, %[n]\n\t"
  80368. #else
  80369. "lsl r4, r4, %[n]\n\t"
  80370. #endif
  80371. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80372. "lsrs r6, r6, r7\n\t"
  80373. #else
  80374. "lsr r6, r6, r7\n\t"
  80375. #endif
  80376. #ifdef WOLFSSL_KEIL
  80377. "orrs r5, r5, r6\n\t"
  80378. #elif defined(__clang__)
  80379. "orrs r5, r6\n\t"
  80380. #else
  80381. "orr r5, r6\n\t"
  80382. #endif
  80383. "ldr r3, [%[a], #32]\n\t"
  80384. "str r5, [%[r], #40]\n\t"
  80385. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80386. "lsrs r6, r3, #1\n\t"
  80387. #else
  80388. "lsr r6, r3, #1\n\t"
  80389. #endif
  80390. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80391. "lsls r3, r3, %[n]\n\t"
  80392. #else
  80393. "lsl r3, r3, %[n]\n\t"
  80394. #endif
  80395. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80396. "lsrs r6, r6, r7\n\t"
  80397. #else
  80398. "lsr r6, r6, r7\n\t"
  80399. #endif
  80400. #ifdef WOLFSSL_KEIL
  80401. "orrs r4, r4, r6\n\t"
  80402. #elif defined(__clang__)
  80403. "orrs r4, r6\n\t"
  80404. #else
  80405. "orr r4, r6\n\t"
  80406. #endif
  80407. "ldr r5, [%[a], #28]\n\t"
  80408. "str r4, [%[r], #36]\n\t"
  80409. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80410. "lsrs r6, r5, #1\n\t"
  80411. #else
  80412. "lsr r6, r5, #1\n\t"
  80413. #endif
  80414. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80415. "lsls r5, r5, %[n]\n\t"
  80416. #else
  80417. "lsl r5, r5, %[n]\n\t"
  80418. #endif
  80419. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80420. "lsrs r6, r6, r7\n\t"
  80421. #else
  80422. "lsr r6, r6, r7\n\t"
  80423. #endif
  80424. #ifdef WOLFSSL_KEIL
  80425. "orrs r3, r3, r6\n\t"
  80426. #elif defined(__clang__)
  80427. "orrs r3, r6\n\t"
  80428. #else
  80429. "orr r3, r6\n\t"
  80430. #endif
  80431. "ldr r4, [%[a], #24]\n\t"
  80432. "str r3, [%[r], #32]\n\t"
  80433. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80434. "lsrs r6, r4, #1\n\t"
  80435. #else
  80436. "lsr r6, r4, #1\n\t"
  80437. #endif
  80438. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80439. "lsls r4, r4, %[n]\n\t"
  80440. #else
  80441. "lsl r4, r4, %[n]\n\t"
  80442. #endif
  80443. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80444. "lsrs r6, r6, r7\n\t"
  80445. #else
  80446. "lsr r6, r6, r7\n\t"
  80447. #endif
  80448. #ifdef WOLFSSL_KEIL
  80449. "orrs r5, r5, r6\n\t"
  80450. #elif defined(__clang__)
  80451. "orrs r5, r6\n\t"
  80452. #else
  80453. "orr r5, r6\n\t"
  80454. #endif
  80455. "ldr r3, [%[a], #20]\n\t"
  80456. "str r5, [%[r], #28]\n\t"
  80457. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80458. "lsrs r6, r3, #1\n\t"
  80459. #else
  80460. "lsr r6, r3, #1\n\t"
  80461. #endif
  80462. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80463. "lsls r3, r3, %[n]\n\t"
  80464. #else
  80465. "lsl r3, r3, %[n]\n\t"
  80466. #endif
  80467. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80468. "lsrs r6, r6, r7\n\t"
  80469. #else
  80470. "lsr r6, r6, r7\n\t"
  80471. #endif
  80472. #ifdef WOLFSSL_KEIL
  80473. "orrs r4, r4, r6\n\t"
  80474. #elif defined(__clang__)
  80475. "orrs r4, r6\n\t"
  80476. #else
  80477. "orr r4, r6\n\t"
  80478. #endif
  80479. "ldr r5, [%[a], #16]\n\t"
  80480. "str r4, [%[r], #24]\n\t"
  80481. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80482. "lsrs r6, r5, #1\n\t"
  80483. #else
  80484. "lsr r6, r5, #1\n\t"
  80485. #endif
  80486. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80487. "lsls r5, r5, %[n]\n\t"
  80488. #else
  80489. "lsl r5, r5, %[n]\n\t"
  80490. #endif
  80491. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80492. "lsrs r6, r6, r7\n\t"
  80493. #else
  80494. "lsr r6, r6, r7\n\t"
  80495. #endif
  80496. #ifdef WOLFSSL_KEIL
  80497. "orrs r3, r3, r6\n\t"
  80498. #elif defined(__clang__)
  80499. "orrs r3, r6\n\t"
  80500. #else
  80501. "orr r3, r6\n\t"
  80502. #endif
  80503. "ldr r4, [%[a], #12]\n\t"
  80504. "str r3, [%[r], #20]\n\t"
  80505. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80506. "lsrs r6, r4, #1\n\t"
  80507. #else
  80508. "lsr r6, r4, #1\n\t"
  80509. #endif
  80510. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80511. "lsls r4, r4, %[n]\n\t"
  80512. #else
  80513. "lsl r4, r4, %[n]\n\t"
  80514. #endif
  80515. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80516. "lsrs r6, r6, r7\n\t"
  80517. #else
  80518. "lsr r6, r6, r7\n\t"
  80519. #endif
  80520. #ifdef WOLFSSL_KEIL
  80521. "orrs r5, r5, r6\n\t"
  80522. #elif defined(__clang__)
  80523. "orrs r5, r6\n\t"
  80524. #else
  80525. "orr r5, r6\n\t"
  80526. #endif
  80527. "ldr r3, [%[a], #8]\n\t"
  80528. "str r5, [%[r], #16]\n\t"
  80529. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80530. "lsrs r6, r3, #1\n\t"
  80531. #else
  80532. "lsr r6, r3, #1\n\t"
  80533. #endif
  80534. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80535. "lsls r3, r3, %[n]\n\t"
  80536. #else
  80537. "lsl r3, r3, %[n]\n\t"
  80538. #endif
  80539. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80540. "lsrs r6, r6, r7\n\t"
  80541. #else
  80542. "lsr r6, r6, r7\n\t"
  80543. #endif
  80544. #ifdef WOLFSSL_KEIL
  80545. "orrs r4, r4, r6\n\t"
  80546. #elif defined(__clang__)
  80547. "orrs r4, r6\n\t"
  80548. #else
  80549. "orr r4, r6\n\t"
  80550. #endif
  80551. "ldr r5, [%[a], #4]\n\t"
  80552. "str r4, [%[r], #12]\n\t"
  80553. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80554. "lsrs r6, r5, #1\n\t"
  80555. #else
  80556. "lsr r6, r5, #1\n\t"
  80557. #endif
  80558. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80559. "lsls r5, r5, %[n]\n\t"
  80560. #else
  80561. "lsl r5, r5, %[n]\n\t"
  80562. #endif
  80563. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80564. "lsrs r6, r6, r7\n\t"
  80565. #else
  80566. "lsr r6, r6, r7\n\t"
  80567. #endif
  80568. #ifdef WOLFSSL_KEIL
  80569. "orrs r3, r3, r6\n\t"
  80570. #elif defined(__clang__)
  80571. "orrs r3, r6\n\t"
  80572. #else
  80573. "orr r3, r6\n\t"
  80574. #endif
  80575. "ldr r4, [%[a]]\n\t"
  80576. "str r3, [%[r], #8]\n\t"
  80577. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80578. "lsrs r6, r4, #1\n\t"
  80579. #else
  80580. "lsr r6, r4, #1\n\t"
  80581. #endif
  80582. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80583. "lsls r4, r4, %[n]\n\t"
  80584. #else
  80585. "lsl r4, r4, %[n]\n\t"
  80586. #endif
  80587. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80588. "lsrs r6, r6, r7\n\t"
  80589. #else
  80590. "lsr r6, r6, r7\n\t"
  80591. #endif
  80592. #ifdef WOLFSSL_KEIL
  80593. "orrs r5, r5, r6\n\t"
  80594. #elif defined(__clang__)
  80595. "orrs r5, r6\n\t"
  80596. #else
  80597. "orr r5, r6\n\t"
  80598. #endif
  80599. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80600. "subs %[a], %[a], #0x40\n\t"
  80601. #else
  80602. "sub %[a], %[a], #0x40\n\t"
  80603. #endif
  80604. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80605. "subs %[r], %[r], #0x40\n\t"
  80606. #else
  80607. "sub %[r], %[r], #0x40\n\t"
  80608. #endif
  80609. "ldr r3, [%[a], #60]\n\t"
  80610. "str r5, [%[r], #68]\n\t"
  80611. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80612. "lsrs r6, r3, #1\n\t"
  80613. #else
  80614. "lsr r6, r3, #1\n\t"
  80615. #endif
  80616. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80617. "lsls r3, r3, %[n]\n\t"
  80618. #else
  80619. "lsl r3, r3, %[n]\n\t"
  80620. #endif
  80621. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80622. "lsrs r6, r6, r7\n\t"
  80623. #else
  80624. "lsr r6, r6, r7\n\t"
  80625. #endif
  80626. #ifdef WOLFSSL_KEIL
  80627. "orrs r4, r4, r6\n\t"
  80628. #elif defined(__clang__)
  80629. "orrs r4, r6\n\t"
  80630. #else
  80631. "orr r4, r6\n\t"
  80632. #endif
  80633. "ldr r5, [%[a], #56]\n\t"
  80634. "str r4, [%[r], #64]\n\t"
  80635. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80636. "lsrs r6, r5, #1\n\t"
  80637. #else
  80638. "lsr r6, r5, #1\n\t"
  80639. #endif
  80640. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80641. "lsls r5, r5, %[n]\n\t"
  80642. #else
  80643. "lsl r5, r5, %[n]\n\t"
  80644. #endif
  80645. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80646. "lsrs r6, r6, r7\n\t"
  80647. #else
  80648. "lsr r6, r6, r7\n\t"
  80649. #endif
  80650. #ifdef WOLFSSL_KEIL
  80651. "orrs r3, r3, r6\n\t"
  80652. #elif defined(__clang__)
  80653. "orrs r3, r6\n\t"
  80654. #else
  80655. "orr r3, r6\n\t"
  80656. #endif
  80657. "ldr r4, [%[a], #52]\n\t"
  80658. "str r3, [%[r], #60]\n\t"
  80659. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80660. "lsrs r6, r4, #1\n\t"
  80661. #else
  80662. "lsr r6, r4, #1\n\t"
  80663. #endif
  80664. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80665. "lsls r4, r4, %[n]\n\t"
  80666. #else
  80667. "lsl r4, r4, %[n]\n\t"
  80668. #endif
  80669. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80670. "lsrs r6, r6, r7\n\t"
  80671. #else
  80672. "lsr r6, r6, r7\n\t"
  80673. #endif
  80674. #ifdef WOLFSSL_KEIL
  80675. "orrs r5, r5, r6\n\t"
  80676. #elif defined(__clang__)
  80677. "orrs r5, r6\n\t"
  80678. #else
  80679. "orr r5, r6\n\t"
  80680. #endif
  80681. "ldr r3, [%[a], #48]\n\t"
  80682. "str r5, [%[r], #56]\n\t"
  80683. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80684. "lsrs r6, r3, #1\n\t"
  80685. #else
  80686. "lsr r6, r3, #1\n\t"
  80687. #endif
  80688. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80689. "lsls r3, r3, %[n]\n\t"
  80690. #else
  80691. "lsl r3, r3, %[n]\n\t"
  80692. #endif
  80693. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80694. "lsrs r6, r6, r7\n\t"
  80695. #else
  80696. "lsr r6, r6, r7\n\t"
  80697. #endif
  80698. #ifdef WOLFSSL_KEIL
  80699. "orrs r4, r4, r6\n\t"
  80700. #elif defined(__clang__)
  80701. "orrs r4, r6\n\t"
  80702. #else
  80703. "orr r4, r6\n\t"
  80704. #endif
  80705. "ldr r5, [%[a], #44]\n\t"
  80706. "str r4, [%[r], #52]\n\t"
  80707. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80708. "lsrs r6, r5, #1\n\t"
  80709. #else
  80710. "lsr r6, r5, #1\n\t"
  80711. #endif
  80712. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80713. "lsls r5, r5, %[n]\n\t"
  80714. #else
  80715. "lsl r5, r5, %[n]\n\t"
  80716. #endif
  80717. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80718. "lsrs r6, r6, r7\n\t"
  80719. #else
  80720. "lsr r6, r6, r7\n\t"
  80721. #endif
  80722. #ifdef WOLFSSL_KEIL
  80723. "orrs r3, r3, r6\n\t"
  80724. #elif defined(__clang__)
  80725. "orrs r3, r6\n\t"
  80726. #else
  80727. "orr r3, r6\n\t"
  80728. #endif
  80729. "ldr r4, [%[a], #40]\n\t"
  80730. "str r3, [%[r], #48]\n\t"
  80731. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80732. "lsrs r6, r4, #1\n\t"
  80733. #else
  80734. "lsr r6, r4, #1\n\t"
  80735. #endif
  80736. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80737. "lsls r4, r4, %[n]\n\t"
  80738. #else
  80739. "lsl r4, r4, %[n]\n\t"
  80740. #endif
  80741. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80742. "lsrs r6, r6, r7\n\t"
  80743. #else
  80744. "lsr r6, r6, r7\n\t"
  80745. #endif
  80746. #ifdef WOLFSSL_KEIL
  80747. "orrs r5, r5, r6\n\t"
  80748. #elif defined(__clang__)
  80749. "orrs r5, r6\n\t"
  80750. #else
  80751. "orr r5, r6\n\t"
  80752. #endif
  80753. "ldr r3, [%[a], #36]\n\t"
  80754. "str r5, [%[r], #44]\n\t"
  80755. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80756. "lsrs r6, r3, #1\n\t"
  80757. #else
  80758. "lsr r6, r3, #1\n\t"
  80759. #endif
  80760. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80761. "lsls r3, r3, %[n]\n\t"
  80762. #else
  80763. "lsl r3, r3, %[n]\n\t"
  80764. #endif
  80765. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80766. "lsrs r6, r6, r7\n\t"
  80767. #else
  80768. "lsr r6, r6, r7\n\t"
  80769. #endif
  80770. #ifdef WOLFSSL_KEIL
  80771. "orrs r4, r4, r6\n\t"
  80772. #elif defined(__clang__)
  80773. "orrs r4, r6\n\t"
  80774. #else
  80775. "orr r4, r6\n\t"
  80776. #endif
  80777. "ldr r5, [%[a], #32]\n\t"
  80778. "str r4, [%[r], #40]\n\t"
  80779. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80780. "lsrs r6, r5, #1\n\t"
  80781. #else
  80782. "lsr r6, r5, #1\n\t"
  80783. #endif
  80784. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80785. "lsls r5, r5, %[n]\n\t"
  80786. #else
  80787. "lsl r5, r5, %[n]\n\t"
  80788. #endif
  80789. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80790. "lsrs r6, r6, r7\n\t"
  80791. #else
  80792. "lsr r6, r6, r7\n\t"
  80793. #endif
  80794. #ifdef WOLFSSL_KEIL
  80795. "orrs r3, r3, r6\n\t"
  80796. #elif defined(__clang__)
  80797. "orrs r3, r6\n\t"
  80798. #else
  80799. "orr r3, r6\n\t"
  80800. #endif
  80801. "ldr r4, [%[a], #28]\n\t"
  80802. "str r3, [%[r], #36]\n\t"
  80803. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80804. "lsrs r6, r4, #1\n\t"
  80805. #else
  80806. "lsr r6, r4, #1\n\t"
  80807. #endif
  80808. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80809. "lsls r4, r4, %[n]\n\t"
  80810. #else
  80811. "lsl r4, r4, %[n]\n\t"
  80812. #endif
  80813. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80814. "lsrs r6, r6, r7\n\t"
  80815. #else
  80816. "lsr r6, r6, r7\n\t"
  80817. #endif
  80818. #ifdef WOLFSSL_KEIL
  80819. "orrs r5, r5, r6\n\t"
  80820. #elif defined(__clang__)
  80821. "orrs r5, r6\n\t"
  80822. #else
  80823. "orr r5, r6\n\t"
  80824. #endif
  80825. "ldr r3, [%[a], #24]\n\t"
  80826. "str r5, [%[r], #32]\n\t"
  80827. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80828. "lsrs r6, r3, #1\n\t"
  80829. #else
  80830. "lsr r6, r3, #1\n\t"
  80831. #endif
  80832. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80833. "lsls r3, r3, %[n]\n\t"
  80834. #else
  80835. "lsl r3, r3, %[n]\n\t"
  80836. #endif
  80837. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80838. "lsrs r6, r6, r7\n\t"
  80839. #else
  80840. "lsr r6, r6, r7\n\t"
  80841. #endif
  80842. #ifdef WOLFSSL_KEIL
  80843. "orrs r4, r4, r6\n\t"
  80844. #elif defined(__clang__)
  80845. "orrs r4, r6\n\t"
  80846. #else
  80847. "orr r4, r6\n\t"
  80848. #endif
  80849. "ldr r5, [%[a], #20]\n\t"
  80850. "str r4, [%[r], #28]\n\t"
  80851. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80852. "lsrs r6, r5, #1\n\t"
  80853. #else
  80854. "lsr r6, r5, #1\n\t"
  80855. #endif
  80856. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80857. "lsls r5, r5, %[n]\n\t"
  80858. #else
  80859. "lsl r5, r5, %[n]\n\t"
  80860. #endif
  80861. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80862. "lsrs r6, r6, r7\n\t"
  80863. #else
  80864. "lsr r6, r6, r7\n\t"
  80865. #endif
  80866. #ifdef WOLFSSL_KEIL
  80867. "orrs r3, r3, r6\n\t"
  80868. #elif defined(__clang__)
  80869. "orrs r3, r6\n\t"
  80870. #else
  80871. "orr r3, r6\n\t"
  80872. #endif
  80873. "ldr r4, [%[a], #16]\n\t"
  80874. "str r3, [%[r], #24]\n\t"
  80875. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80876. "lsrs r6, r4, #1\n\t"
  80877. #else
  80878. "lsr r6, r4, #1\n\t"
  80879. #endif
  80880. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80881. "lsls r4, r4, %[n]\n\t"
  80882. #else
  80883. "lsl r4, r4, %[n]\n\t"
  80884. #endif
  80885. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80886. "lsrs r6, r6, r7\n\t"
  80887. #else
  80888. "lsr r6, r6, r7\n\t"
  80889. #endif
  80890. #ifdef WOLFSSL_KEIL
  80891. "orrs r5, r5, r6\n\t"
  80892. #elif defined(__clang__)
  80893. "orrs r5, r6\n\t"
  80894. #else
  80895. "orr r5, r6\n\t"
  80896. #endif
  80897. "ldr r3, [%[a], #12]\n\t"
  80898. "str r5, [%[r], #20]\n\t"
  80899. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80900. "lsrs r6, r3, #1\n\t"
  80901. #else
  80902. "lsr r6, r3, #1\n\t"
  80903. #endif
  80904. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80905. "lsls r3, r3, %[n]\n\t"
  80906. #else
  80907. "lsl r3, r3, %[n]\n\t"
  80908. #endif
  80909. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80910. "lsrs r6, r6, r7\n\t"
  80911. #else
  80912. "lsr r6, r6, r7\n\t"
  80913. #endif
  80914. #ifdef WOLFSSL_KEIL
  80915. "orrs r4, r4, r6\n\t"
  80916. #elif defined(__clang__)
  80917. "orrs r4, r6\n\t"
  80918. #else
  80919. "orr r4, r6\n\t"
  80920. #endif
  80921. "ldr r5, [%[a], #8]\n\t"
  80922. "str r4, [%[r], #16]\n\t"
  80923. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80924. "lsrs r6, r5, #1\n\t"
  80925. #else
  80926. "lsr r6, r5, #1\n\t"
  80927. #endif
  80928. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80929. "lsls r5, r5, %[n]\n\t"
  80930. #else
  80931. "lsl r5, r5, %[n]\n\t"
  80932. #endif
  80933. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80934. "lsrs r6, r6, r7\n\t"
  80935. #else
  80936. "lsr r6, r6, r7\n\t"
  80937. #endif
  80938. #ifdef WOLFSSL_KEIL
  80939. "orrs r3, r3, r6\n\t"
  80940. #elif defined(__clang__)
  80941. "orrs r3, r6\n\t"
  80942. #else
  80943. "orr r3, r6\n\t"
  80944. #endif
  80945. "ldr r4, [%[a], #4]\n\t"
  80946. "str r3, [%[r], #12]\n\t"
  80947. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80948. "lsrs r6, r4, #1\n\t"
  80949. #else
  80950. "lsr r6, r4, #1\n\t"
  80951. #endif
  80952. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80953. "lsls r4, r4, %[n]\n\t"
  80954. #else
  80955. "lsl r4, r4, %[n]\n\t"
  80956. #endif
  80957. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80958. "lsrs r6, r6, r7\n\t"
  80959. #else
  80960. "lsr r6, r6, r7\n\t"
  80961. #endif
  80962. #ifdef WOLFSSL_KEIL
  80963. "orrs r5, r5, r6\n\t"
  80964. #elif defined(__clang__)
  80965. "orrs r5, r6\n\t"
  80966. #else
  80967. "orr r5, r6\n\t"
  80968. #endif
  80969. "ldr r3, [%[a]]\n\t"
  80970. "str r5, [%[r], #8]\n\t"
  80971. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80972. "lsrs r6, r3, #1\n\t"
  80973. #else
  80974. "lsr r6, r3, #1\n\t"
  80975. #endif
  80976. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80977. "lsls r3, r3, %[n]\n\t"
  80978. #else
  80979. "lsl r3, r3, %[n]\n\t"
  80980. #endif
  80981. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80982. "lsrs r6, r6, r7\n\t"
  80983. #else
  80984. "lsr r6, r6, r7\n\t"
  80985. #endif
  80986. #ifdef WOLFSSL_KEIL
  80987. "orrs r4, r4, r6\n\t"
  80988. #elif defined(__clang__)
  80989. "orrs r4, r6\n\t"
  80990. #else
  80991. "orr r4, r6\n\t"
  80992. #endif
  80993. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80994. "subs %[a], %[a], #0x40\n\t"
  80995. #else
  80996. "sub %[a], %[a], #0x40\n\t"
  80997. #endif
  80998. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80999. "subs %[r], %[r], #0x40\n\t"
  81000. #else
  81001. "sub %[r], %[r], #0x40\n\t"
  81002. #endif
  81003. "ldr r5, [%[a], #60]\n\t"
  81004. "str r4, [%[r], #68]\n\t"
  81005. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81006. "lsrs r6, r5, #1\n\t"
  81007. #else
  81008. "lsr r6, r5, #1\n\t"
  81009. #endif
  81010. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81011. "lsls r5, r5, %[n]\n\t"
  81012. #else
  81013. "lsl r5, r5, %[n]\n\t"
  81014. #endif
  81015. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81016. "lsrs r6, r6, r7\n\t"
  81017. #else
  81018. "lsr r6, r6, r7\n\t"
  81019. #endif
  81020. #ifdef WOLFSSL_KEIL
  81021. "orrs r3, r3, r6\n\t"
  81022. #elif defined(__clang__)
  81023. "orrs r3, r6\n\t"
  81024. #else
  81025. "orr r3, r6\n\t"
  81026. #endif
  81027. "ldr r4, [%[a], #56]\n\t"
  81028. "str r3, [%[r], #64]\n\t"
  81029. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81030. "lsrs r6, r4, #1\n\t"
  81031. #else
  81032. "lsr r6, r4, #1\n\t"
  81033. #endif
  81034. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81035. "lsls r4, r4, %[n]\n\t"
  81036. #else
  81037. "lsl r4, r4, %[n]\n\t"
  81038. #endif
  81039. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81040. "lsrs r6, r6, r7\n\t"
  81041. #else
  81042. "lsr r6, r6, r7\n\t"
  81043. #endif
  81044. #ifdef WOLFSSL_KEIL
  81045. "orrs r5, r5, r6\n\t"
  81046. #elif defined(__clang__)
  81047. "orrs r5, r6\n\t"
  81048. #else
  81049. "orr r5, r6\n\t"
  81050. #endif
  81051. "ldr r3, [%[a], #52]\n\t"
  81052. "str r5, [%[r], #60]\n\t"
  81053. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81054. "lsrs r6, r3, #1\n\t"
  81055. #else
  81056. "lsr r6, r3, #1\n\t"
  81057. #endif
  81058. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81059. "lsls r3, r3, %[n]\n\t"
  81060. #else
  81061. "lsl r3, r3, %[n]\n\t"
  81062. #endif
  81063. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81064. "lsrs r6, r6, r7\n\t"
  81065. #else
  81066. "lsr r6, r6, r7\n\t"
  81067. #endif
  81068. #ifdef WOLFSSL_KEIL
  81069. "orrs r4, r4, r6\n\t"
  81070. #elif defined(__clang__)
  81071. "orrs r4, r6\n\t"
  81072. #else
  81073. "orr r4, r6\n\t"
  81074. #endif
  81075. "ldr r5, [%[a], #48]\n\t"
  81076. "str r4, [%[r], #56]\n\t"
  81077. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81078. "lsrs r6, r5, #1\n\t"
  81079. #else
  81080. "lsr r6, r5, #1\n\t"
  81081. #endif
  81082. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81083. "lsls r5, r5, %[n]\n\t"
  81084. #else
  81085. "lsl r5, r5, %[n]\n\t"
  81086. #endif
  81087. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81088. "lsrs r6, r6, r7\n\t"
  81089. #else
  81090. "lsr r6, r6, r7\n\t"
  81091. #endif
  81092. #ifdef WOLFSSL_KEIL
  81093. "orrs r3, r3, r6\n\t"
  81094. #elif defined(__clang__)
  81095. "orrs r3, r6\n\t"
  81096. #else
  81097. "orr r3, r6\n\t"
  81098. #endif
  81099. "ldr r4, [%[a], #44]\n\t"
  81100. "str r3, [%[r], #52]\n\t"
  81101. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81102. "lsrs r6, r4, #1\n\t"
  81103. #else
  81104. "lsr r6, r4, #1\n\t"
  81105. #endif
  81106. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81107. "lsls r4, r4, %[n]\n\t"
  81108. #else
  81109. "lsl r4, r4, %[n]\n\t"
  81110. #endif
  81111. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81112. "lsrs r6, r6, r7\n\t"
  81113. #else
  81114. "lsr r6, r6, r7\n\t"
  81115. #endif
  81116. #ifdef WOLFSSL_KEIL
  81117. "orrs r5, r5, r6\n\t"
  81118. #elif defined(__clang__)
  81119. "orrs r5, r6\n\t"
  81120. #else
  81121. "orr r5, r6\n\t"
  81122. #endif
  81123. "ldr r3, [%[a], #40]\n\t"
  81124. "str r5, [%[r], #48]\n\t"
  81125. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81126. "lsrs r6, r3, #1\n\t"
  81127. #else
  81128. "lsr r6, r3, #1\n\t"
  81129. #endif
  81130. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81131. "lsls r3, r3, %[n]\n\t"
  81132. #else
  81133. "lsl r3, r3, %[n]\n\t"
  81134. #endif
  81135. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81136. "lsrs r6, r6, r7\n\t"
  81137. #else
  81138. "lsr r6, r6, r7\n\t"
  81139. #endif
  81140. #ifdef WOLFSSL_KEIL
  81141. "orrs r4, r4, r6\n\t"
  81142. #elif defined(__clang__)
  81143. "orrs r4, r6\n\t"
  81144. #else
  81145. "orr r4, r6\n\t"
  81146. #endif
  81147. "ldr r5, [%[a], #36]\n\t"
  81148. "str r4, [%[r], #44]\n\t"
  81149. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81150. "lsrs r6, r5, #1\n\t"
  81151. #else
  81152. "lsr r6, r5, #1\n\t"
  81153. #endif
  81154. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81155. "lsls r5, r5, %[n]\n\t"
  81156. #else
  81157. "lsl r5, r5, %[n]\n\t"
  81158. #endif
  81159. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81160. "lsrs r6, r6, r7\n\t"
  81161. #else
  81162. "lsr r6, r6, r7\n\t"
  81163. #endif
  81164. #ifdef WOLFSSL_KEIL
  81165. "orrs r3, r3, r6\n\t"
  81166. #elif defined(__clang__)
  81167. "orrs r3, r6\n\t"
  81168. #else
  81169. "orr r3, r6\n\t"
  81170. #endif
  81171. "ldr r4, [%[a], #32]\n\t"
  81172. "str r3, [%[r], #40]\n\t"
  81173. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81174. "lsrs r6, r4, #1\n\t"
  81175. #else
  81176. "lsr r6, r4, #1\n\t"
  81177. #endif
  81178. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81179. "lsls r4, r4, %[n]\n\t"
  81180. #else
  81181. "lsl r4, r4, %[n]\n\t"
  81182. #endif
  81183. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81184. "lsrs r6, r6, r7\n\t"
  81185. #else
  81186. "lsr r6, r6, r7\n\t"
  81187. #endif
  81188. #ifdef WOLFSSL_KEIL
  81189. "orrs r5, r5, r6\n\t"
  81190. #elif defined(__clang__)
  81191. "orrs r5, r6\n\t"
  81192. #else
  81193. "orr r5, r6\n\t"
  81194. #endif
  81195. "ldr r3, [%[a], #28]\n\t"
  81196. "str r5, [%[r], #36]\n\t"
  81197. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81198. "lsrs r6, r3, #1\n\t"
  81199. #else
  81200. "lsr r6, r3, #1\n\t"
  81201. #endif
  81202. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81203. "lsls r3, r3, %[n]\n\t"
  81204. #else
  81205. "lsl r3, r3, %[n]\n\t"
  81206. #endif
  81207. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81208. "lsrs r6, r6, r7\n\t"
  81209. #else
  81210. "lsr r6, r6, r7\n\t"
  81211. #endif
  81212. #ifdef WOLFSSL_KEIL
  81213. "orrs r4, r4, r6\n\t"
  81214. #elif defined(__clang__)
  81215. "orrs r4, r6\n\t"
  81216. #else
  81217. "orr r4, r6\n\t"
  81218. #endif
  81219. "ldr r5, [%[a], #24]\n\t"
  81220. "str r4, [%[r], #32]\n\t"
  81221. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81222. "lsrs r6, r5, #1\n\t"
  81223. #else
  81224. "lsr r6, r5, #1\n\t"
  81225. #endif
  81226. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81227. "lsls r5, r5, %[n]\n\t"
  81228. #else
  81229. "lsl r5, r5, %[n]\n\t"
  81230. #endif
  81231. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81232. "lsrs r6, r6, r7\n\t"
  81233. #else
  81234. "lsr r6, r6, r7\n\t"
  81235. #endif
  81236. #ifdef WOLFSSL_KEIL
  81237. "orrs r3, r3, r6\n\t"
  81238. #elif defined(__clang__)
  81239. "orrs r3, r6\n\t"
  81240. #else
  81241. "orr r3, r6\n\t"
  81242. #endif
  81243. "ldr r4, [%[a], #20]\n\t"
  81244. "str r3, [%[r], #28]\n\t"
  81245. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81246. "lsrs r6, r4, #1\n\t"
  81247. #else
  81248. "lsr r6, r4, #1\n\t"
  81249. #endif
  81250. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81251. "lsls r4, r4, %[n]\n\t"
  81252. #else
  81253. "lsl r4, r4, %[n]\n\t"
  81254. #endif
  81255. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81256. "lsrs r6, r6, r7\n\t"
  81257. #else
  81258. "lsr r6, r6, r7\n\t"
  81259. #endif
  81260. #ifdef WOLFSSL_KEIL
  81261. "orrs r5, r5, r6\n\t"
  81262. #elif defined(__clang__)
  81263. "orrs r5, r6\n\t"
  81264. #else
  81265. "orr r5, r6\n\t"
  81266. #endif
  81267. "ldr r3, [%[a], #16]\n\t"
  81268. "str r5, [%[r], #24]\n\t"
  81269. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81270. "lsrs r6, r3, #1\n\t"
  81271. #else
  81272. "lsr r6, r3, #1\n\t"
  81273. #endif
  81274. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81275. "lsls r3, r3, %[n]\n\t"
  81276. #else
  81277. "lsl r3, r3, %[n]\n\t"
  81278. #endif
  81279. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81280. "lsrs r6, r6, r7\n\t"
  81281. #else
  81282. "lsr r6, r6, r7\n\t"
  81283. #endif
  81284. #ifdef WOLFSSL_KEIL
  81285. "orrs r4, r4, r6\n\t"
  81286. #elif defined(__clang__)
  81287. "orrs r4, r6\n\t"
  81288. #else
  81289. "orr r4, r6\n\t"
  81290. #endif
  81291. "ldr r5, [%[a], #12]\n\t"
  81292. "str r4, [%[r], #20]\n\t"
  81293. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81294. "lsrs r6, r5, #1\n\t"
  81295. #else
  81296. "lsr r6, r5, #1\n\t"
  81297. #endif
  81298. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81299. "lsls r5, r5, %[n]\n\t"
  81300. #else
  81301. "lsl r5, r5, %[n]\n\t"
  81302. #endif
  81303. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81304. "lsrs r6, r6, r7\n\t"
  81305. #else
  81306. "lsr r6, r6, r7\n\t"
  81307. #endif
  81308. #ifdef WOLFSSL_KEIL
  81309. "orrs r3, r3, r6\n\t"
  81310. #elif defined(__clang__)
  81311. "orrs r3, r6\n\t"
  81312. #else
  81313. "orr r3, r6\n\t"
  81314. #endif
  81315. "ldr r4, [%[a], #8]\n\t"
  81316. "str r3, [%[r], #16]\n\t"
  81317. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81318. "lsrs r6, r4, #1\n\t"
  81319. #else
  81320. "lsr r6, r4, #1\n\t"
  81321. #endif
  81322. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81323. "lsls r4, r4, %[n]\n\t"
  81324. #else
  81325. "lsl r4, r4, %[n]\n\t"
  81326. #endif
  81327. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81328. "lsrs r6, r6, r7\n\t"
  81329. #else
  81330. "lsr r6, r6, r7\n\t"
  81331. #endif
  81332. #ifdef WOLFSSL_KEIL
  81333. "orrs r5, r5, r6\n\t"
  81334. #elif defined(__clang__)
  81335. "orrs r5, r6\n\t"
  81336. #else
  81337. "orr r5, r6\n\t"
  81338. #endif
  81339. "ldr r3, [%[a], #4]\n\t"
  81340. "str r5, [%[r], #12]\n\t"
  81341. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81342. "lsrs r6, r3, #1\n\t"
  81343. #else
  81344. "lsr r6, r3, #1\n\t"
  81345. #endif
  81346. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81347. "lsls r3, r3, %[n]\n\t"
  81348. #else
  81349. "lsl r3, r3, %[n]\n\t"
  81350. #endif
  81351. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81352. "lsrs r6, r6, r7\n\t"
  81353. #else
  81354. "lsr r6, r6, r7\n\t"
  81355. #endif
  81356. #ifdef WOLFSSL_KEIL
  81357. "orrs r4, r4, r6\n\t"
  81358. #elif defined(__clang__)
  81359. "orrs r4, r6\n\t"
  81360. #else
  81361. "orr r4, r6\n\t"
  81362. #endif
  81363. "ldr r5, [%[a]]\n\t"
  81364. "str r4, [%[r], #8]\n\t"
  81365. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81366. "lsrs r6, r5, #1\n\t"
  81367. #else
  81368. "lsr r6, r5, #1\n\t"
  81369. #endif
  81370. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81371. "lsls r5, r5, %[n]\n\t"
  81372. #else
  81373. "lsl r5, r5, %[n]\n\t"
  81374. #endif
  81375. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81376. "lsrs r6, r6, r7\n\t"
  81377. #else
  81378. "lsr r6, r6, r7\n\t"
  81379. #endif
  81380. #ifdef WOLFSSL_KEIL
  81381. "orrs r3, r3, r6\n\t"
  81382. #elif defined(__clang__)
  81383. "orrs r3, r6\n\t"
  81384. #else
  81385. "orr r3, r6\n\t"
  81386. #endif
  81387. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81388. "subs %[a], %[a], #0x40\n\t"
  81389. #else
  81390. "sub %[a], %[a], #0x40\n\t"
  81391. #endif
  81392. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81393. "subs %[r], %[r], #0x40\n\t"
  81394. #else
  81395. "sub %[r], %[r], #0x40\n\t"
  81396. #endif
  81397. "ldr r4, [%[a], #60]\n\t"
  81398. "str r3, [%[r], #68]\n\t"
  81399. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81400. "lsrs r6, r4, #1\n\t"
  81401. #else
  81402. "lsr r6, r4, #1\n\t"
  81403. #endif
  81404. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81405. "lsls r4, r4, %[n]\n\t"
  81406. #else
  81407. "lsl r4, r4, %[n]\n\t"
  81408. #endif
  81409. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81410. "lsrs r6, r6, r7\n\t"
  81411. #else
  81412. "lsr r6, r6, r7\n\t"
  81413. #endif
  81414. #ifdef WOLFSSL_KEIL
  81415. "orrs r5, r5, r6\n\t"
  81416. #elif defined(__clang__)
  81417. "orrs r5, r6\n\t"
  81418. #else
  81419. "orr r5, r6\n\t"
  81420. #endif
  81421. "ldr r3, [%[a], #56]\n\t"
  81422. "str r5, [%[r], #64]\n\t"
  81423. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81424. "lsrs r6, r3, #1\n\t"
  81425. #else
  81426. "lsr r6, r3, #1\n\t"
  81427. #endif
  81428. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81429. "lsls r3, r3, %[n]\n\t"
  81430. #else
  81431. "lsl r3, r3, %[n]\n\t"
  81432. #endif
  81433. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81434. "lsrs r6, r6, r7\n\t"
  81435. #else
  81436. "lsr r6, r6, r7\n\t"
  81437. #endif
  81438. #ifdef WOLFSSL_KEIL
  81439. "orrs r4, r4, r6\n\t"
  81440. #elif defined(__clang__)
  81441. "orrs r4, r6\n\t"
  81442. #else
  81443. "orr r4, r6\n\t"
  81444. #endif
  81445. "ldr r5, [%[a], #52]\n\t"
  81446. "str r4, [%[r], #60]\n\t"
  81447. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81448. "lsrs r6, r5, #1\n\t"
  81449. #else
  81450. "lsr r6, r5, #1\n\t"
  81451. #endif
  81452. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81453. "lsls r5, r5, %[n]\n\t"
  81454. #else
  81455. "lsl r5, r5, %[n]\n\t"
  81456. #endif
  81457. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81458. "lsrs r6, r6, r7\n\t"
  81459. #else
  81460. "lsr r6, r6, r7\n\t"
  81461. #endif
  81462. #ifdef WOLFSSL_KEIL
  81463. "orrs r3, r3, r6\n\t"
  81464. #elif defined(__clang__)
  81465. "orrs r3, r6\n\t"
  81466. #else
  81467. "orr r3, r6\n\t"
  81468. #endif
  81469. "ldr r4, [%[a], #48]\n\t"
  81470. "str r3, [%[r], #56]\n\t"
  81471. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81472. "lsrs r6, r4, #1\n\t"
  81473. #else
  81474. "lsr r6, r4, #1\n\t"
  81475. #endif
  81476. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81477. "lsls r4, r4, %[n]\n\t"
  81478. #else
  81479. "lsl r4, r4, %[n]\n\t"
  81480. #endif
  81481. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81482. "lsrs r6, r6, r7\n\t"
  81483. #else
  81484. "lsr r6, r6, r7\n\t"
  81485. #endif
  81486. #ifdef WOLFSSL_KEIL
  81487. "orrs r5, r5, r6\n\t"
  81488. #elif defined(__clang__)
  81489. "orrs r5, r6\n\t"
  81490. #else
  81491. "orr r5, r6\n\t"
  81492. #endif
  81493. "ldr r3, [%[a], #44]\n\t"
  81494. "str r5, [%[r], #52]\n\t"
  81495. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81496. "lsrs r6, r3, #1\n\t"
  81497. #else
  81498. "lsr r6, r3, #1\n\t"
  81499. #endif
  81500. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81501. "lsls r3, r3, %[n]\n\t"
  81502. #else
  81503. "lsl r3, r3, %[n]\n\t"
  81504. #endif
  81505. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81506. "lsrs r6, r6, r7\n\t"
  81507. #else
  81508. "lsr r6, r6, r7\n\t"
  81509. #endif
  81510. #ifdef WOLFSSL_KEIL
  81511. "orrs r4, r4, r6\n\t"
  81512. #elif defined(__clang__)
  81513. "orrs r4, r6\n\t"
  81514. #else
  81515. "orr r4, r6\n\t"
  81516. #endif
  81517. "ldr r5, [%[a], #40]\n\t"
  81518. "str r4, [%[r], #48]\n\t"
  81519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81520. "lsrs r6, r5, #1\n\t"
  81521. #else
  81522. "lsr r6, r5, #1\n\t"
  81523. #endif
  81524. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81525. "lsls r5, r5, %[n]\n\t"
  81526. #else
  81527. "lsl r5, r5, %[n]\n\t"
  81528. #endif
  81529. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81530. "lsrs r6, r6, r7\n\t"
  81531. #else
  81532. "lsr r6, r6, r7\n\t"
  81533. #endif
  81534. #ifdef WOLFSSL_KEIL
  81535. "orrs r3, r3, r6\n\t"
  81536. #elif defined(__clang__)
  81537. "orrs r3, r6\n\t"
  81538. #else
  81539. "orr r3, r6\n\t"
  81540. #endif
  81541. "ldr r4, [%[a], #36]\n\t"
  81542. "str r3, [%[r], #44]\n\t"
  81543. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81544. "lsrs r6, r4, #1\n\t"
  81545. #else
  81546. "lsr r6, r4, #1\n\t"
  81547. #endif
  81548. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81549. "lsls r4, r4, %[n]\n\t"
  81550. #else
  81551. "lsl r4, r4, %[n]\n\t"
  81552. #endif
  81553. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81554. "lsrs r6, r6, r7\n\t"
  81555. #else
  81556. "lsr r6, r6, r7\n\t"
  81557. #endif
  81558. #ifdef WOLFSSL_KEIL
  81559. "orrs r5, r5, r6\n\t"
  81560. #elif defined(__clang__)
  81561. "orrs r5, r6\n\t"
  81562. #else
  81563. "orr r5, r6\n\t"
  81564. #endif
  81565. "ldr r3, [%[a], #32]\n\t"
  81566. "str r5, [%[r], #40]\n\t"
  81567. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81568. "lsrs r6, r3, #1\n\t"
  81569. #else
  81570. "lsr r6, r3, #1\n\t"
  81571. #endif
  81572. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81573. "lsls r3, r3, %[n]\n\t"
  81574. #else
  81575. "lsl r3, r3, %[n]\n\t"
  81576. #endif
  81577. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81578. "lsrs r6, r6, r7\n\t"
  81579. #else
  81580. "lsr r6, r6, r7\n\t"
  81581. #endif
  81582. #ifdef WOLFSSL_KEIL
  81583. "orrs r4, r4, r6\n\t"
  81584. #elif defined(__clang__)
  81585. "orrs r4, r6\n\t"
  81586. #else
  81587. "orr r4, r6\n\t"
  81588. #endif
  81589. "ldr r5, [%[a], #28]\n\t"
  81590. "str r4, [%[r], #36]\n\t"
  81591. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81592. "lsrs r6, r5, #1\n\t"
  81593. #else
  81594. "lsr r6, r5, #1\n\t"
  81595. #endif
  81596. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81597. "lsls r5, r5, %[n]\n\t"
  81598. #else
  81599. "lsl r5, r5, %[n]\n\t"
  81600. #endif
  81601. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81602. "lsrs r6, r6, r7\n\t"
  81603. #else
  81604. "lsr r6, r6, r7\n\t"
  81605. #endif
  81606. #ifdef WOLFSSL_KEIL
  81607. "orrs r3, r3, r6\n\t"
  81608. #elif defined(__clang__)
  81609. "orrs r3, r6\n\t"
  81610. #else
  81611. "orr r3, r6\n\t"
  81612. #endif
  81613. "ldr r4, [%[a], #24]\n\t"
  81614. "str r3, [%[r], #32]\n\t"
  81615. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81616. "lsrs r6, r4, #1\n\t"
  81617. #else
  81618. "lsr r6, r4, #1\n\t"
  81619. #endif
  81620. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81621. "lsls r4, r4, %[n]\n\t"
  81622. #else
  81623. "lsl r4, r4, %[n]\n\t"
  81624. #endif
  81625. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81626. "lsrs r6, r6, r7\n\t"
  81627. #else
  81628. "lsr r6, r6, r7\n\t"
  81629. #endif
  81630. #ifdef WOLFSSL_KEIL
  81631. "orrs r5, r5, r6\n\t"
  81632. #elif defined(__clang__)
  81633. "orrs r5, r6\n\t"
  81634. #else
  81635. "orr r5, r6\n\t"
  81636. #endif
  81637. "ldr r3, [%[a], #20]\n\t"
  81638. "str r5, [%[r], #28]\n\t"
  81639. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81640. "lsrs r6, r3, #1\n\t"
  81641. #else
  81642. "lsr r6, r3, #1\n\t"
  81643. #endif
  81644. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81645. "lsls r3, r3, %[n]\n\t"
  81646. #else
  81647. "lsl r3, r3, %[n]\n\t"
  81648. #endif
  81649. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81650. "lsrs r6, r6, r7\n\t"
  81651. #else
  81652. "lsr r6, r6, r7\n\t"
  81653. #endif
  81654. #ifdef WOLFSSL_KEIL
  81655. "orrs r4, r4, r6\n\t"
  81656. #elif defined(__clang__)
  81657. "orrs r4, r6\n\t"
  81658. #else
  81659. "orr r4, r6\n\t"
  81660. #endif
  81661. "ldr r5, [%[a], #16]\n\t"
  81662. "str r4, [%[r], #24]\n\t"
  81663. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81664. "lsrs r6, r5, #1\n\t"
  81665. #else
  81666. "lsr r6, r5, #1\n\t"
  81667. #endif
  81668. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81669. "lsls r5, r5, %[n]\n\t"
  81670. #else
  81671. "lsl r5, r5, %[n]\n\t"
  81672. #endif
  81673. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81674. "lsrs r6, r6, r7\n\t"
  81675. #else
  81676. "lsr r6, r6, r7\n\t"
  81677. #endif
  81678. #ifdef WOLFSSL_KEIL
  81679. "orrs r3, r3, r6\n\t"
  81680. #elif defined(__clang__)
  81681. "orrs r3, r6\n\t"
  81682. #else
  81683. "orr r3, r6\n\t"
  81684. #endif
  81685. "ldr r4, [%[a], #12]\n\t"
  81686. "str r3, [%[r], #20]\n\t"
  81687. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81688. "lsrs r6, r4, #1\n\t"
  81689. #else
  81690. "lsr r6, r4, #1\n\t"
  81691. #endif
  81692. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81693. "lsls r4, r4, %[n]\n\t"
  81694. #else
  81695. "lsl r4, r4, %[n]\n\t"
  81696. #endif
  81697. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81698. "lsrs r6, r6, r7\n\t"
  81699. #else
  81700. "lsr r6, r6, r7\n\t"
  81701. #endif
  81702. #ifdef WOLFSSL_KEIL
  81703. "orrs r5, r5, r6\n\t"
  81704. #elif defined(__clang__)
  81705. "orrs r5, r6\n\t"
  81706. #else
  81707. "orr r5, r6\n\t"
  81708. #endif
  81709. "ldr r3, [%[a], #8]\n\t"
  81710. "str r5, [%[r], #16]\n\t"
  81711. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81712. "lsrs r6, r3, #1\n\t"
  81713. #else
  81714. "lsr r6, r3, #1\n\t"
  81715. #endif
  81716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81717. "lsls r3, r3, %[n]\n\t"
  81718. #else
  81719. "lsl r3, r3, %[n]\n\t"
  81720. #endif
  81721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81722. "lsrs r6, r6, r7\n\t"
  81723. #else
  81724. "lsr r6, r6, r7\n\t"
  81725. #endif
  81726. #ifdef WOLFSSL_KEIL
  81727. "orrs r4, r4, r6\n\t"
  81728. #elif defined(__clang__)
  81729. "orrs r4, r6\n\t"
  81730. #else
  81731. "orr r4, r6\n\t"
  81732. #endif
  81733. "ldr r5, [%[a], #4]\n\t"
  81734. "str r4, [%[r], #12]\n\t"
  81735. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81736. "lsrs r6, r5, #1\n\t"
  81737. #else
  81738. "lsr r6, r5, #1\n\t"
  81739. #endif
  81740. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81741. "lsls r5, r5, %[n]\n\t"
  81742. #else
  81743. "lsl r5, r5, %[n]\n\t"
  81744. #endif
  81745. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81746. "lsrs r6, r6, r7\n\t"
  81747. #else
  81748. "lsr r6, r6, r7\n\t"
  81749. #endif
  81750. #ifdef WOLFSSL_KEIL
  81751. "orrs r3, r3, r6\n\t"
  81752. #elif defined(__clang__)
  81753. "orrs r3, r6\n\t"
  81754. #else
  81755. "orr r3, r6\n\t"
  81756. #endif
  81757. "ldr r4, [%[a]]\n\t"
  81758. "str r3, [%[r], #8]\n\t"
  81759. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81760. "lsrs r6, r4, #1\n\t"
  81761. #else
  81762. "lsr r6, r4, #1\n\t"
  81763. #endif
  81764. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81765. "lsls r4, r4, %[n]\n\t"
  81766. #else
  81767. "lsl r4, r4, %[n]\n\t"
  81768. #endif
  81769. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81770. "lsrs r6, r6, r7\n\t"
  81771. #else
  81772. "lsr r6, r6, r7\n\t"
  81773. #endif
  81774. #ifdef WOLFSSL_KEIL
  81775. "orrs r5, r5, r6\n\t"
  81776. #elif defined(__clang__)
  81777. "orrs r5, r6\n\t"
  81778. #else
  81779. "orr r5, r6\n\t"
  81780. #endif
  81781. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81782. "subs %[a], %[a], #0x40\n\t"
  81783. #else
  81784. "sub %[a], %[a], #0x40\n\t"
  81785. #endif
  81786. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81787. "subs %[r], %[r], #0x40\n\t"
  81788. #else
  81789. "sub %[r], %[r], #0x40\n\t"
  81790. #endif
  81791. "ldr r3, [%[a], #60]\n\t"
  81792. "str r5, [%[r], #68]\n\t"
  81793. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81794. "lsrs r6, r3, #1\n\t"
  81795. #else
  81796. "lsr r6, r3, #1\n\t"
  81797. #endif
  81798. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81799. "lsls r3, r3, %[n]\n\t"
  81800. #else
  81801. "lsl r3, r3, %[n]\n\t"
  81802. #endif
  81803. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81804. "lsrs r6, r6, r7\n\t"
  81805. #else
  81806. "lsr r6, r6, r7\n\t"
  81807. #endif
  81808. #ifdef WOLFSSL_KEIL
  81809. "orrs r4, r4, r6\n\t"
  81810. #elif defined(__clang__)
  81811. "orrs r4, r6\n\t"
  81812. #else
  81813. "orr r4, r6\n\t"
  81814. #endif
  81815. "ldr r5, [%[a], #56]\n\t"
  81816. "str r4, [%[r], #64]\n\t"
  81817. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81818. "lsrs r6, r5, #1\n\t"
  81819. #else
  81820. "lsr r6, r5, #1\n\t"
  81821. #endif
  81822. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81823. "lsls r5, r5, %[n]\n\t"
  81824. #else
  81825. "lsl r5, r5, %[n]\n\t"
  81826. #endif
  81827. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81828. "lsrs r6, r6, r7\n\t"
  81829. #else
  81830. "lsr r6, r6, r7\n\t"
  81831. #endif
  81832. #ifdef WOLFSSL_KEIL
  81833. "orrs r3, r3, r6\n\t"
  81834. #elif defined(__clang__)
  81835. "orrs r3, r6\n\t"
  81836. #else
  81837. "orr r3, r6\n\t"
  81838. #endif
  81839. "ldr r4, [%[a], #52]\n\t"
  81840. "str r3, [%[r], #60]\n\t"
  81841. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81842. "lsrs r6, r4, #1\n\t"
  81843. #else
  81844. "lsr r6, r4, #1\n\t"
  81845. #endif
  81846. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81847. "lsls r4, r4, %[n]\n\t"
  81848. #else
  81849. "lsl r4, r4, %[n]\n\t"
  81850. #endif
  81851. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81852. "lsrs r6, r6, r7\n\t"
  81853. #else
  81854. "lsr r6, r6, r7\n\t"
  81855. #endif
  81856. #ifdef WOLFSSL_KEIL
  81857. "orrs r5, r5, r6\n\t"
  81858. #elif defined(__clang__)
  81859. "orrs r5, r6\n\t"
  81860. #else
  81861. "orr r5, r6\n\t"
  81862. #endif
  81863. "ldr r3, [%[a], #48]\n\t"
  81864. "str r5, [%[r], #56]\n\t"
  81865. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81866. "lsrs r6, r3, #1\n\t"
  81867. #else
  81868. "lsr r6, r3, #1\n\t"
  81869. #endif
  81870. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81871. "lsls r3, r3, %[n]\n\t"
  81872. #else
  81873. "lsl r3, r3, %[n]\n\t"
  81874. #endif
  81875. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81876. "lsrs r6, r6, r7\n\t"
  81877. #else
  81878. "lsr r6, r6, r7\n\t"
  81879. #endif
  81880. #ifdef WOLFSSL_KEIL
  81881. "orrs r4, r4, r6\n\t"
  81882. #elif defined(__clang__)
  81883. "orrs r4, r6\n\t"
  81884. #else
  81885. "orr r4, r6\n\t"
  81886. #endif
  81887. "ldr r5, [%[a], #44]\n\t"
  81888. "str r4, [%[r], #52]\n\t"
  81889. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81890. "lsrs r6, r5, #1\n\t"
  81891. #else
  81892. "lsr r6, r5, #1\n\t"
  81893. #endif
  81894. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81895. "lsls r5, r5, %[n]\n\t"
  81896. #else
  81897. "lsl r5, r5, %[n]\n\t"
  81898. #endif
  81899. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81900. "lsrs r6, r6, r7\n\t"
  81901. #else
  81902. "lsr r6, r6, r7\n\t"
  81903. #endif
  81904. #ifdef WOLFSSL_KEIL
  81905. "orrs r3, r3, r6\n\t"
  81906. #elif defined(__clang__)
  81907. "orrs r3, r6\n\t"
  81908. #else
  81909. "orr r3, r6\n\t"
  81910. #endif
  81911. "ldr r4, [%[a], #40]\n\t"
  81912. "str r3, [%[r], #48]\n\t"
  81913. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81914. "lsrs r6, r4, #1\n\t"
  81915. #else
  81916. "lsr r6, r4, #1\n\t"
  81917. #endif
  81918. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81919. "lsls r4, r4, %[n]\n\t"
  81920. #else
  81921. "lsl r4, r4, %[n]\n\t"
  81922. #endif
  81923. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81924. "lsrs r6, r6, r7\n\t"
  81925. #else
  81926. "lsr r6, r6, r7\n\t"
  81927. #endif
  81928. #ifdef WOLFSSL_KEIL
  81929. "orrs r5, r5, r6\n\t"
  81930. #elif defined(__clang__)
  81931. "orrs r5, r6\n\t"
  81932. #else
  81933. "orr r5, r6\n\t"
  81934. #endif
  81935. "ldr r3, [%[a], #36]\n\t"
  81936. "str r5, [%[r], #44]\n\t"
  81937. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81938. "lsrs r6, r3, #1\n\t"
  81939. #else
  81940. "lsr r6, r3, #1\n\t"
  81941. #endif
  81942. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81943. "lsls r3, r3, %[n]\n\t"
  81944. #else
  81945. "lsl r3, r3, %[n]\n\t"
  81946. #endif
  81947. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81948. "lsrs r6, r6, r7\n\t"
  81949. #else
  81950. "lsr r6, r6, r7\n\t"
  81951. #endif
  81952. #ifdef WOLFSSL_KEIL
  81953. "orrs r4, r4, r6\n\t"
  81954. #elif defined(__clang__)
  81955. "orrs r4, r6\n\t"
  81956. #else
  81957. "orr r4, r6\n\t"
  81958. #endif
  81959. "ldr r5, [%[a], #32]\n\t"
  81960. "str r4, [%[r], #40]\n\t"
  81961. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81962. "lsrs r6, r5, #1\n\t"
  81963. #else
  81964. "lsr r6, r5, #1\n\t"
  81965. #endif
  81966. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81967. "lsls r5, r5, %[n]\n\t"
  81968. #else
  81969. "lsl r5, r5, %[n]\n\t"
  81970. #endif
  81971. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81972. "lsrs r6, r6, r7\n\t"
  81973. #else
  81974. "lsr r6, r6, r7\n\t"
  81975. #endif
  81976. #ifdef WOLFSSL_KEIL
  81977. "orrs r3, r3, r6\n\t"
  81978. #elif defined(__clang__)
  81979. "orrs r3, r6\n\t"
  81980. #else
  81981. "orr r3, r6\n\t"
  81982. #endif
  81983. "ldr r4, [%[a], #28]\n\t"
  81984. "str r3, [%[r], #36]\n\t"
  81985. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81986. "lsrs r6, r4, #1\n\t"
  81987. #else
  81988. "lsr r6, r4, #1\n\t"
  81989. #endif
  81990. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81991. "lsls r4, r4, %[n]\n\t"
  81992. #else
  81993. "lsl r4, r4, %[n]\n\t"
  81994. #endif
  81995. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81996. "lsrs r6, r6, r7\n\t"
  81997. #else
  81998. "lsr r6, r6, r7\n\t"
  81999. #endif
  82000. #ifdef WOLFSSL_KEIL
  82001. "orrs r5, r5, r6\n\t"
  82002. #elif defined(__clang__)
  82003. "orrs r5, r6\n\t"
  82004. #else
  82005. "orr r5, r6\n\t"
  82006. #endif
  82007. "ldr r3, [%[a], #24]\n\t"
  82008. "str r5, [%[r], #32]\n\t"
  82009. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82010. "lsrs r6, r3, #1\n\t"
  82011. #else
  82012. "lsr r6, r3, #1\n\t"
  82013. #endif
  82014. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82015. "lsls r3, r3, %[n]\n\t"
  82016. #else
  82017. "lsl r3, r3, %[n]\n\t"
  82018. #endif
  82019. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82020. "lsrs r6, r6, r7\n\t"
  82021. #else
  82022. "lsr r6, r6, r7\n\t"
  82023. #endif
  82024. #ifdef WOLFSSL_KEIL
  82025. "orrs r4, r4, r6\n\t"
  82026. #elif defined(__clang__)
  82027. "orrs r4, r6\n\t"
  82028. #else
  82029. "orr r4, r6\n\t"
  82030. #endif
  82031. "ldr r5, [%[a], #20]\n\t"
  82032. "str r4, [%[r], #28]\n\t"
  82033. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82034. "lsrs r6, r5, #1\n\t"
  82035. #else
  82036. "lsr r6, r5, #1\n\t"
  82037. #endif
  82038. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82039. "lsls r5, r5, %[n]\n\t"
  82040. #else
  82041. "lsl r5, r5, %[n]\n\t"
  82042. #endif
  82043. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82044. "lsrs r6, r6, r7\n\t"
  82045. #else
  82046. "lsr r6, r6, r7\n\t"
  82047. #endif
  82048. #ifdef WOLFSSL_KEIL
  82049. "orrs r3, r3, r6\n\t"
  82050. #elif defined(__clang__)
  82051. "orrs r3, r6\n\t"
  82052. #else
  82053. "orr r3, r6\n\t"
  82054. #endif
  82055. "ldr r4, [%[a], #16]\n\t"
  82056. "str r3, [%[r], #24]\n\t"
  82057. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82058. "lsrs r6, r4, #1\n\t"
  82059. #else
  82060. "lsr r6, r4, #1\n\t"
  82061. #endif
  82062. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82063. "lsls r4, r4, %[n]\n\t"
  82064. #else
  82065. "lsl r4, r4, %[n]\n\t"
  82066. #endif
  82067. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82068. "lsrs r6, r6, r7\n\t"
  82069. #else
  82070. "lsr r6, r6, r7\n\t"
  82071. #endif
  82072. #ifdef WOLFSSL_KEIL
  82073. "orrs r5, r5, r6\n\t"
  82074. #elif defined(__clang__)
  82075. "orrs r5, r6\n\t"
  82076. #else
  82077. "orr r5, r6\n\t"
  82078. #endif
  82079. "ldr r3, [%[a], #12]\n\t"
  82080. "str r5, [%[r], #20]\n\t"
  82081. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82082. "lsrs r6, r3, #1\n\t"
  82083. #else
  82084. "lsr r6, r3, #1\n\t"
  82085. #endif
  82086. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82087. "lsls r3, r3, %[n]\n\t"
  82088. #else
  82089. "lsl r3, r3, %[n]\n\t"
  82090. #endif
  82091. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82092. "lsrs r6, r6, r7\n\t"
  82093. #else
  82094. "lsr r6, r6, r7\n\t"
  82095. #endif
  82096. #ifdef WOLFSSL_KEIL
  82097. "orrs r4, r4, r6\n\t"
  82098. #elif defined(__clang__)
  82099. "orrs r4, r6\n\t"
  82100. #else
  82101. "orr r4, r6\n\t"
  82102. #endif
  82103. "ldr r5, [%[a], #8]\n\t"
  82104. "str r4, [%[r], #16]\n\t"
  82105. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82106. "lsrs r6, r5, #1\n\t"
  82107. #else
  82108. "lsr r6, r5, #1\n\t"
  82109. #endif
  82110. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82111. "lsls r5, r5, %[n]\n\t"
  82112. #else
  82113. "lsl r5, r5, %[n]\n\t"
  82114. #endif
  82115. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82116. "lsrs r6, r6, r7\n\t"
  82117. #else
  82118. "lsr r6, r6, r7\n\t"
  82119. #endif
  82120. #ifdef WOLFSSL_KEIL
  82121. "orrs r3, r3, r6\n\t"
  82122. #elif defined(__clang__)
  82123. "orrs r3, r6\n\t"
  82124. #else
  82125. "orr r3, r6\n\t"
  82126. #endif
  82127. "ldr r4, [%[a], #4]\n\t"
  82128. "str r3, [%[r], #12]\n\t"
  82129. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82130. "lsrs r6, r4, #1\n\t"
  82131. #else
  82132. "lsr r6, r4, #1\n\t"
  82133. #endif
  82134. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82135. "lsls r4, r4, %[n]\n\t"
  82136. #else
  82137. "lsl r4, r4, %[n]\n\t"
  82138. #endif
  82139. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82140. "lsrs r6, r6, r7\n\t"
  82141. #else
  82142. "lsr r6, r6, r7\n\t"
  82143. #endif
  82144. #ifdef WOLFSSL_KEIL
  82145. "orrs r5, r5, r6\n\t"
  82146. #elif defined(__clang__)
  82147. "orrs r5, r6\n\t"
  82148. #else
  82149. "orr r5, r6\n\t"
  82150. #endif
  82151. "ldr r3, [%[a]]\n\t"
  82152. "str r5, [%[r], #8]\n\t"
  82153. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82154. "lsrs r6, r3, #1\n\t"
  82155. #else
  82156. "lsr r6, r3, #1\n\t"
  82157. #endif
  82158. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82159. "lsls r3, r3, %[n]\n\t"
  82160. #else
  82161. "lsl r3, r3, %[n]\n\t"
  82162. #endif
  82163. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82164. "lsrs r6, r6, r7\n\t"
  82165. #else
  82166. "lsr r6, r6, r7\n\t"
  82167. #endif
  82168. #ifdef WOLFSSL_KEIL
  82169. "orrs r4, r4, r6\n\t"
  82170. #elif defined(__clang__)
  82171. "orrs r4, r6\n\t"
  82172. #else
  82173. "orr r4, r6\n\t"
  82174. #endif
  82175. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82176. "subs %[a], %[a], #0x40\n\t"
  82177. #else
  82178. "sub %[a], %[a], #0x40\n\t"
  82179. #endif
  82180. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82181. "subs %[r], %[r], #0x40\n\t"
  82182. #else
  82183. "sub %[r], %[r], #0x40\n\t"
  82184. #endif
  82185. "ldr r5, [%[a], #60]\n\t"
  82186. "str r4, [%[r], #68]\n\t"
  82187. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82188. "lsrs r6, r5, #1\n\t"
  82189. #else
  82190. "lsr r6, r5, #1\n\t"
  82191. #endif
  82192. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82193. "lsls r5, r5, %[n]\n\t"
  82194. #else
  82195. "lsl r5, r5, %[n]\n\t"
  82196. #endif
  82197. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82198. "lsrs r6, r6, r7\n\t"
  82199. #else
  82200. "lsr r6, r6, r7\n\t"
  82201. #endif
  82202. #ifdef WOLFSSL_KEIL
  82203. "orrs r3, r3, r6\n\t"
  82204. #elif defined(__clang__)
  82205. "orrs r3, r6\n\t"
  82206. #else
  82207. "orr r3, r6\n\t"
  82208. #endif
  82209. "ldr r4, [%[a], #56]\n\t"
  82210. "str r3, [%[r], #64]\n\t"
  82211. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82212. "lsrs r6, r4, #1\n\t"
  82213. #else
  82214. "lsr r6, r4, #1\n\t"
  82215. #endif
  82216. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82217. "lsls r4, r4, %[n]\n\t"
  82218. #else
  82219. "lsl r4, r4, %[n]\n\t"
  82220. #endif
  82221. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82222. "lsrs r6, r6, r7\n\t"
  82223. #else
  82224. "lsr r6, r6, r7\n\t"
  82225. #endif
  82226. #ifdef WOLFSSL_KEIL
  82227. "orrs r5, r5, r6\n\t"
  82228. #elif defined(__clang__)
  82229. "orrs r5, r6\n\t"
  82230. #else
  82231. "orr r5, r6\n\t"
  82232. #endif
  82233. "ldr r3, [%[a], #52]\n\t"
  82234. "str r5, [%[r], #60]\n\t"
  82235. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82236. "lsrs r6, r3, #1\n\t"
  82237. #else
  82238. "lsr r6, r3, #1\n\t"
  82239. #endif
  82240. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82241. "lsls r3, r3, %[n]\n\t"
  82242. #else
  82243. "lsl r3, r3, %[n]\n\t"
  82244. #endif
  82245. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82246. "lsrs r6, r6, r7\n\t"
  82247. #else
  82248. "lsr r6, r6, r7\n\t"
  82249. #endif
  82250. #ifdef WOLFSSL_KEIL
  82251. "orrs r4, r4, r6\n\t"
  82252. #elif defined(__clang__)
  82253. "orrs r4, r6\n\t"
  82254. #else
  82255. "orr r4, r6\n\t"
  82256. #endif
  82257. "ldr r5, [%[a], #48]\n\t"
  82258. "str r4, [%[r], #56]\n\t"
  82259. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82260. "lsrs r6, r5, #1\n\t"
  82261. #else
  82262. "lsr r6, r5, #1\n\t"
  82263. #endif
  82264. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82265. "lsls r5, r5, %[n]\n\t"
  82266. #else
  82267. "lsl r5, r5, %[n]\n\t"
  82268. #endif
  82269. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82270. "lsrs r6, r6, r7\n\t"
  82271. #else
  82272. "lsr r6, r6, r7\n\t"
  82273. #endif
  82274. #ifdef WOLFSSL_KEIL
  82275. "orrs r3, r3, r6\n\t"
  82276. #elif defined(__clang__)
  82277. "orrs r3, r6\n\t"
  82278. #else
  82279. "orr r3, r6\n\t"
  82280. #endif
  82281. "ldr r4, [%[a], #44]\n\t"
  82282. "str r3, [%[r], #52]\n\t"
  82283. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82284. "lsrs r6, r4, #1\n\t"
  82285. #else
  82286. "lsr r6, r4, #1\n\t"
  82287. #endif
  82288. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82289. "lsls r4, r4, %[n]\n\t"
  82290. #else
  82291. "lsl r4, r4, %[n]\n\t"
  82292. #endif
  82293. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82294. "lsrs r6, r6, r7\n\t"
  82295. #else
  82296. "lsr r6, r6, r7\n\t"
  82297. #endif
  82298. #ifdef WOLFSSL_KEIL
  82299. "orrs r5, r5, r6\n\t"
  82300. #elif defined(__clang__)
  82301. "orrs r5, r6\n\t"
  82302. #else
  82303. "orr r5, r6\n\t"
  82304. #endif
  82305. "ldr r3, [%[a], #40]\n\t"
  82306. "str r5, [%[r], #48]\n\t"
  82307. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82308. "lsrs r6, r3, #1\n\t"
  82309. #else
  82310. "lsr r6, r3, #1\n\t"
  82311. #endif
  82312. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82313. "lsls r3, r3, %[n]\n\t"
  82314. #else
  82315. "lsl r3, r3, %[n]\n\t"
  82316. #endif
  82317. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82318. "lsrs r6, r6, r7\n\t"
  82319. #else
  82320. "lsr r6, r6, r7\n\t"
  82321. #endif
  82322. #ifdef WOLFSSL_KEIL
  82323. "orrs r4, r4, r6\n\t"
  82324. #elif defined(__clang__)
  82325. "orrs r4, r6\n\t"
  82326. #else
  82327. "orr r4, r6\n\t"
  82328. #endif
  82329. "ldr r5, [%[a], #36]\n\t"
  82330. "str r4, [%[r], #44]\n\t"
  82331. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82332. "lsrs r6, r5, #1\n\t"
  82333. #else
  82334. "lsr r6, r5, #1\n\t"
  82335. #endif
  82336. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82337. "lsls r5, r5, %[n]\n\t"
  82338. #else
  82339. "lsl r5, r5, %[n]\n\t"
  82340. #endif
  82341. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82342. "lsrs r6, r6, r7\n\t"
  82343. #else
  82344. "lsr r6, r6, r7\n\t"
  82345. #endif
  82346. #ifdef WOLFSSL_KEIL
  82347. "orrs r3, r3, r6\n\t"
  82348. #elif defined(__clang__)
  82349. "orrs r3, r6\n\t"
  82350. #else
  82351. "orr r3, r6\n\t"
  82352. #endif
  82353. "ldr r4, [%[a], #32]\n\t"
  82354. "str r3, [%[r], #40]\n\t"
  82355. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82356. "lsrs r6, r4, #1\n\t"
  82357. #else
  82358. "lsr r6, r4, #1\n\t"
  82359. #endif
  82360. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82361. "lsls r4, r4, %[n]\n\t"
  82362. #else
  82363. "lsl r4, r4, %[n]\n\t"
  82364. #endif
  82365. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82366. "lsrs r6, r6, r7\n\t"
  82367. #else
  82368. "lsr r6, r6, r7\n\t"
  82369. #endif
  82370. #ifdef WOLFSSL_KEIL
  82371. "orrs r5, r5, r6\n\t"
  82372. #elif defined(__clang__)
  82373. "orrs r5, r6\n\t"
  82374. #else
  82375. "orr r5, r6\n\t"
  82376. #endif
  82377. "ldr r3, [%[a], #28]\n\t"
  82378. "str r5, [%[r], #36]\n\t"
  82379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82380. "lsrs r6, r3, #1\n\t"
  82381. #else
  82382. "lsr r6, r3, #1\n\t"
  82383. #endif
  82384. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82385. "lsls r3, r3, %[n]\n\t"
  82386. #else
  82387. "lsl r3, r3, %[n]\n\t"
  82388. #endif
  82389. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82390. "lsrs r6, r6, r7\n\t"
  82391. #else
  82392. "lsr r6, r6, r7\n\t"
  82393. #endif
  82394. #ifdef WOLFSSL_KEIL
  82395. "orrs r4, r4, r6\n\t"
  82396. #elif defined(__clang__)
  82397. "orrs r4, r6\n\t"
  82398. #else
  82399. "orr r4, r6\n\t"
  82400. #endif
  82401. "ldr r5, [%[a], #24]\n\t"
  82402. "str r4, [%[r], #32]\n\t"
  82403. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82404. "lsrs r6, r5, #1\n\t"
  82405. #else
  82406. "lsr r6, r5, #1\n\t"
  82407. #endif
  82408. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82409. "lsls r5, r5, %[n]\n\t"
  82410. #else
  82411. "lsl r5, r5, %[n]\n\t"
  82412. #endif
  82413. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82414. "lsrs r6, r6, r7\n\t"
  82415. #else
  82416. "lsr r6, r6, r7\n\t"
  82417. #endif
  82418. #ifdef WOLFSSL_KEIL
  82419. "orrs r3, r3, r6\n\t"
  82420. #elif defined(__clang__)
  82421. "orrs r3, r6\n\t"
  82422. #else
  82423. "orr r3, r6\n\t"
  82424. #endif
  82425. "ldr r4, [%[a], #20]\n\t"
  82426. "str r3, [%[r], #28]\n\t"
  82427. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82428. "lsrs r6, r4, #1\n\t"
  82429. #else
  82430. "lsr r6, r4, #1\n\t"
  82431. #endif
  82432. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82433. "lsls r4, r4, %[n]\n\t"
  82434. #else
  82435. "lsl r4, r4, %[n]\n\t"
  82436. #endif
  82437. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82438. "lsrs r6, r6, r7\n\t"
  82439. #else
  82440. "lsr r6, r6, r7\n\t"
  82441. #endif
  82442. #ifdef WOLFSSL_KEIL
  82443. "orrs r5, r5, r6\n\t"
  82444. #elif defined(__clang__)
  82445. "orrs r5, r6\n\t"
  82446. #else
  82447. "orr r5, r6\n\t"
  82448. #endif
  82449. "ldr r3, [%[a], #16]\n\t"
  82450. "str r5, [%[r], #24]\n\t"
  82451. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82452. "lsrs r6, r3, #1\n\t"
  82453. #else
  82454. "lsr r6, r3, #1\n\t"
  82455. #endif
  82456. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82457. "lsls r3, r3, %[n]\n\t"
  82458. #else
  82459. "lsl r3, r3, %[n]\n\t"
  82460. #endif
  82461. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82462. "lsrs r6, r6, r7\n\t"
  82463. #else
  82464. "lsr r6, r6, r7\n\t"
  82465. #endif
  82466. #ifdef WOLFSSL_KEIL
  82467. "orrs r4, r4, r6\n\t"
  82468. #elif defined(__clang__)
  82469. "orrs r4, r6\n\t"
  82470. #else
  82471. "orr r4, r6\n\t"
  82472. #endif
  82473. "ldr r5, [%[a], #12]\n\t"
  82474. "str r4, [%[r], #20]\n\t"
  82475. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82476. "lsrs r6, r5, #1\n\t"
  82477. #else
  82478. "lsr r6, r5, #1\n\t"
  82479. #endif
  82480. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82481. "lsls r5, r5, %[n]\n\t"
  82482. #else
  82483. "lsl r5, r5, %[n]\n\t"
  82484. #endif
  82485. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82486. "lsrs r6, r6, r7\n\t"
  82487. #else
  82488. "lsr r6, r6, r7\n\t"
  82489. #endif
  82490. #ifdef WOLFSSL_KEIL
  82491. "orrs r3, r3, r6\n\t"
  82492. #elif defined(__clang__)
  82493. "orrs r3, r6\n\t"
  82494. #else
  82495. "orr r3, r6\n\t"
  82496. #endif
  82497. "ldr r4, [%[a], #8]\n\t"
  82498. "str r3, [%[r], #16]\n\t"
  82499. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82500. "lsrs r6, r4, #1\n\t"
  82501. #else
  82502. "lsr r6, r4, #1\n\t"
  82503. #endif
  82504. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82505. "lsls r4, r4, %[n]\n\t"
  82506. #else
  82507. "lsl r4, r4, %[n]\n\t"
  82508. #endif
  82509. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82510. "lsrs r6, r6, r7\n\t"
  82511. #else
  82512. "lsr r6, r6, r7\n\t"
  82513. #endif
  82514. #ifdef WOLFSSL_KEIL
  82515. "orrs r5, r5, r6\n\t"
  82516. #elif defined(__clang__)
  82517. "orrs r5, r6\n\t"
  82518. #else
  82519. "orr r5, r6\n\t"
  82520. #endif
  82521. "ldr r3, [%[a], #4]\n\t"
  82522. "str r5, [%[r], #12]\n\t"
  82523. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82524. "lsrs r6, r3, #1\n\t"
  82525. #else
  82526. "lsr r6, r3, #1\n\t"
  82527. #endif
  82528. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82529. "lsls r3, r3, %[n]\n\t"
  82530. #else
  82531. "lsl r3, r3, %[n]\n\t"
  82532. #endif
  82533. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82534. "lsrs r6, r6, r7\n\t"
  82535. #else
  82536. "lsr r6, r6, r7\n\t"
  82537. #endif
  82538. #ifdef WOLFSSL_KEIL
  82539. "orrs r4, r4, r6\n\t"
  82540. #elif defined(__clang__)
  82541. "orrs r4, r6\n\t"
  82542. #else
  82543. "orr r4, r6\n\t"
  82544. #endif
  82545. "ldr r5, [%[a]]\n\t"
  82546. "str r4, [%[r], #8]\n\t"
  82547. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82548. "lsrs r6, r5, #1\n\t"
  82549. #else
  82550. "lsr r6, r5, #1\n\t"
  82551. #endif
  82552. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82553. "lsls r5, r5, %[n]\n\t"
  82554. #else
  82555. "lsl r5, r5, %[n]\n\t"
  82556. #endif
  82557. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82558. "lsrs r6, r6, r7\n\t"
  82559. #else
  82560. "lsr r6, r6, r7\n\t"
  82561. #endif
  82562. #ifdef WOLFSSL_KEIL
  82563. "orrs r3, r3, r6\n\t"
  82564. #elif defined(__clang__)
  82565. "orrs r3, r6\n\t"
  82566. #else
  82567. "orr r3, r6\n\t"
  82568. #endif
  82569. "str r5, [%[r]]\n\t"
  82570. "str r3, [%[r], #4]\n\t"
  82571. : [r] "+l" (r), [a] "+l" (a), [n] "+l" (n)
  82572. :
  82573. : "memory", "r3", "r4", "r5", "r6", "r7"
  82574. );
  82575. }
  82576. /* Modular exponentiate 2 to the e mod m. (r = 2^e mod m)
  82577. *
  82578. * r A single precision number that is the result of the operation.
  82579. * e A single precision number that is the exponent.
  82580. * bits The number of bits in the exponent.
  82581. * m A single precision number that is the modulus.
  82582. * returns 0 on success.
  82583. * returns MEMORY_E on dynamic memory allocation failure.
  82584. * returns MP_VAL when base is even.
  82585. */
  82586. static int sp_3072_mod_exp_2_96(sp_digit* r, const sp_digit* e, int bits,
  82587. const sp_digit* m)
  82588. {
  82589. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  82590. sp_digit* td = NULL;
  82591. #else
  82592. sp_digit td[289];
  82593. #endif
  82594. sp_digit* norm = NULL;
  82595. sp_digit* tmp = NULL;
  82596. sp_digit mp = 1;
  82597. sp_digit n;
  82598. sp_digit o;
  82599. sp_digit mask;
  82600. int i;
  82601. int c;
  82602. byte y;
  82603. int err = MP_OKAY;
  82604. if (bits == 0) {
  82605. err = MP_VAL;
  82606. }
  82607. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  82608. if (err == MP_OKAY) {
  82609. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 289, NULL,
  82610. DYNAMIC_TYPE_TMP_BUFFER);
  82611. if (td == NULL)
  82612. err = MEMORY_E;
  82613. }
  82614. #endif
  82615. if (err == MP_OKAY) {
  82616. norm = td;
  82617. tmp = td + 192;
  82618. sp_3072_mont_setup(m, &mp);
  82619. sp_3072_mont_norm_96(norm, m);
  82620. i = (bits - 1) / 32;
  82621. n = e[i--];
  82622. c = bits & 31;
  82623. if (c == 0) {
  82624. c = 32;
  82625. }
  82626. c -= bits % 5;
  82627. if (c == 32) {
  82628. c = 27;
  82629. }
  82630. if (c < 0) {
  82631. /* Number of bits in top word is less than number needed. */
  82632. c = -c;
  82633. y = (byte)(n << c);
  82634. n = e[i--];
  82635. y |= (byte)(n >> (64 - c));
  82636. n <<= c;
  82637. c = 64 - c;
  82638. }
  82639. else if (c == 0) {
  82640. /* All bits in top word used. */
  82641. y = (byte)n;
  82642. }
  82643. else {
  82644. y = (byte)(n >> c);
  82645. n <<= 32 - c;
  82646. }
  82647. sp_3072_lshift_96(r, norm, y);
  82648. for (; i>=0 || c>=5; ) {
  82649. if (c == 0) {
  82650. n = e[i--];
  82651. y = (byte)(n >> 27);
  82652. n <<= 5;
  82653. c = 27;
  82654. }
  82655. else if (c < 5) {
  82656. y = (byte)(n >> 27);
  82657. n = e[i--];
  82658. c = 5 - c;
  82659. y |= (byte)(n >> (32 - c));
  82660. n <<= c;
  82661. c = 32 - c;
  82662. }
  82663. else {
  82664. y = (byte)((n >> 27) & 0x1f);
  82665. n <<= 5;
  82666. c -= 5;
  82667. }
  82668. sp_3072_mont_sqr_96(r, r, m, mp);
  82669. sp_3072_mont_sqr_96(r, r, m, mp);
  82670. sp_3072_mont_sqr_96(r, r, m, mp);
  82671. sp_3072_mont_sqr_96(r, r, m, mp);
  82672. sp_3072_mont_sqr_96(r, r, m, mp);
  82673. sp_3072_lshift_96(r, r, y);
  82674. sp_3072_mul_d_96(tmp, norm, r[96]);
  82675. r[96] = 0;
  82676. o = sp_3072_add_96(r, r, tmp);
  82677. sp_3072_cond_sub_96(r, r, m, (sp_digit)0 - o);
  82678. }
  82679. XMEMSET(&r[96], 0, sizeof(sp_digit) * 96U);
  82680. sp_3072_mont_reduce_96(r, m, mp);
  82681. mask = 0 - (sp_3072_cmp_96(r, m) >= 0);
  82682. sp_3072_cond_sub_96(r, r, m, mask);
  82683. }
  82684. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  82685. if (td != NULL)
  82686. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  82687. #endif
  82688. return err;
  82689. }
  82690. #endif /* HAVE_FFDHE_3072 */
  82691. /* Perform the modular exponentiation for Diffie-Hellman.
  82692. *
  82693. * base Base.
  82694. * exp Array of bytes that is the exponent.
  82695. * expLen Length of data, in bytes, in exponent.
  82696. * mod Modulus.
  82697. * out Buffer to hold big-endian bytes of exponentiation result.
  82698. * Must be at least 384 bytes long.
  82699. * outLen Length, in bytes, of exponentiation result.
  82700. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  82701. * and MEMORY_E if memory allocation fails.
  82702. */
  82703. int sp_DhExp_3072(const mp_int* base, const byte* exp, word32 expLen,
  82704. const mp_int* mod, byte* out, word32* outLen)
  82705. {
  82706. int err = MP_OKAY;
  82707. sp_digit b[192];
  82708. sp_digit e[96];
  82709. sp_digit m[96];
  82710. sp_digit* r = b;
  82711. word32 i;
  82712. if (mp_count_bits(base) > 3072) {
  82713. err = MP_READ_E;
  82714. }
  82715. else if (expLen > 384) {
  82716. err = MP_READ_E;
  82717. }
  82718. else if (mp_count_bits(mod) != 3072) {
  82719. err = MP_READ_E;
  82720. }
  82721. else if (mp_iseven(mod)) {
  82722. err = MP_VAL;
  82723. }
  82724. if (err == MP_OKAY) {
  82725. sp_3072_from_mp(b, 96, base);
  82726. sp_3072_from_bin(e, 96, exp, expLen);
  82727. sp_3072_from_mp(m, 96, mod);
  82728. #ifdef HAVE_FFDHE_3072
  82729. if (base->used == 1 && base->dp[0] == 2 && m[95] == (sp_digit)-1)
  82730. err = sp_3072_mod_exp_2_96(r, e, expLen * 8, m);
  82731. else
  82732. #endif
  82733. err = sp_3072_mod_exp_96(r, b, e, expLen * 8, m, 0);
  82734. }
  82735. if (err == MP_OKAY) {
  82736. sp_3072_to_bin_96(r, out);
  82737. *outLen = 384;
  82738. for (i=0; i<384 && out[i] == 0; i++) {
  82739. /* Search for first non-zero. */
  82740. }
  82741. *outLen -= i;
  82742. XMEMMOVE(out, out + i, *outLen);
  82743. }
  82744. XMEMSET(e, 0, sizeof(e));
  82745. return err;
  82746. }
  82747. #endif /* WOLFSSL_HAVE_SP_DH */
  82748. /* Perform the modular exponentiation for Diffie-Hellman.
  82749. *
  82750. * base Base. MP integer.
  82751. * exp Exponent. MP integer.
  82752. * mod Modulus. MP integer.
  82753. * res Result. MP integer.
  82754. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  82755. * and MEMORY_E if memory allocation fails.
  82756. */
  82757. int sp_ModExp_1536(const mp_int* base, const mp_int* exp, const mp_int* mod,
  82758. mp_int* res)
  82759. {
  82760. int err = MP_OKAY;
  82761. sp_digit b[96];
  82762. sp_digit e[48];
  82763. sp_digit m[48];
  82764. sp_digit* r = b;
  82765. int expBits = mp_count_bits(exp);
  82766. if (mp_count_bits(base) > 1536) {
  82767. err = MP_READ_E;
  82768. }
  82769. else if (expBits > 1536) {
  82770. err = MP_READ_E;
  82771. }
  82772. else if (mp_count_bits(mod) != 1536) {
  82773. err = MP_READ_E;
  82774. }
  82775. else if (mp_iseven(mod)) {
  82776. err = MP_VAL;
  82777. }
  82778. if (err == MP_OKAY) {
  82779. sp_3072_from_mp(b, 48, base);
  82780. sp_3072_from_mp(e, 48, exp);
  82781. sp_3072_from_mp(m, 48, mod);
  82782. err = sp_3072_mod_exp_48(r, b, e, expBits, m, 0);
  82783. }
  82784. if (err == MP_OKAY) {
  82785. XMEMSET(r + 48, 0, sizeof(*r) * 48U);
  82786. err = sp_3072_to_mp(r, res);
  82787. res->used = mod->used;
  82788. mp_clamp(res);
  82789. }
  82790. XMEMSET(e, 0, sizeof(e));
  82791. return err;
  82792. }
  82793. #endif /* WOLFSSL_HAVE_SP_DH | (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) */
  82794. #endif /* !WOLFSSL_SP_NO_3072 */
  82795. #ifdef WOLFSSL_SP_4096
  82796. /* Read big endian unsigned byte array into r.
  82797. *
  82798. * r A single precision integer.
  82799. * size Maximum number of bytes to convert
  82800. * a Byte array.
  82801. * n Number of bytes in array to read.
  82802. */
  82803. static void sp_4096_from_bin(sp_digit* r, int size, const byte* a, int n)
  82804. {
  82805. int i;
  82806. int j;
  82807. byte* d;
  82808. for (i = n - 1,j = 0; i >= 3; i -= 4) {
  82809. r[j] = ((sp_digit)a[i - 0] << 0) |
  82810. ((sp_digit)a[i - 1] << 8) |
  82811. ((sp_digit)a[i - 2] << 16) |
  82812. ((sp_digit)a[i - 3] << 24);
  82813. j++;
  82814. }
  82815. if (i >= 0) {
  82816. r[j] = 0;
  82817. d = (byte*)r;
  82818. switch (i) {
  82819. case 2: d[n - 1 - 2] = a[2]; //fallthrough
  82820. case 1: d[n - 1 - 1] = a[1]; //fallthrough
  82821. case 0: d[n - 1 - 0] = a[0]; //fallthrough
  82822. }
  82823. j++;
  82824. }
  82825. for (; j < size; j++) {
  82826. r[j] = 0;
  82827. }
  82828. }
  82829. /* Convert an mp_int to an array of sp_digit.
  82830. *
  82831. * r A single precision integer.
  82832. * size Maximum number of bytes to convert
  82833. * a A multi-precision integer.
  82834. */
  82835. static void sp_4096_from_mp(sp_digit* r, int size, const mp_int* a)
  82836. {
  82837. #if DIGIT_BIT == 32
  82838. int i;
  82839. int j = 0;
  82840. for (i = 0; i < size; i++) {
  82841. sp_digit mask =
  82842. (((sp_digit)(a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1;
  82843. r[i] = a->dp[j] & mask;
  82844. j += (int)(((sp_digit)1) -
  82845. (((sp_digit)(a->used - i - 2)) >> (SP_WORD_SIZE - 1)));
  82846. }
  82847. #elif DIGIT_BIT > 32
  82848. int i;
  82849. int j = 0;
  82850. word32 s = 0;
  82851. r[0] = 0;
  82852. for (i = 0; i < a->used && j < size; i++) {
  82853. r[j] |= ((sp_digit)a->dp[i] << s);
  82854. r[j] &= 0xffffffff;
  82855. s = 32U - s;
  82856. if (j + 1 >= size) {
  82857. break;
  82858. }
  82859. /* lint allow cast of mismatch word32 and mp_digit */
  82860. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  82861. while ((s + 32U) <= (word32)DIGIT_BIT) {
  82862. s += 32U;
  82863. r[j] &= 0xffffffff;
  82864. if (j + 1 >= size) {
  82865. break;
  82866. }
  82867. if (s < (word32)DIGIT_BIT) {
  82868. /* lint allow cast of mismatch word32 and mp_digit */
  82869. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  82870. }
  82871. else {
  82872. r[++j] = (sp_digit)0;
  82873. }
  82874. }
  82875. s = (word32)DIGIT_BIT - s;
  82876. }
  82877. for (j++; j < size; j++) {
  82878. r[j] = 0;
  82879. }
  82880. #else
  82881. int i;
  82882. int j = 0;
  82883. int s = 0;
  82884. r[0] = 0;
  82885. for (i = 0; i < a->used && j < size; i++) {
  82886. r[j] |= ((sp_digit)a->dp[i]) << s;
  82887. if (s + DIGIT_BIT >= 32) {
  82888. r[j] &= 0xffffffff;
  82889. if (j + 1 >= size) {
  82890. break;
  82891. }
  82892. s = 32 - s;
  82893. if (s == DIGIT_BIT) {
  82894. r[++j] = 0;
  82895. s = 0;
  82896. }
  82897. else {
  82898. r[++j] = a->dp[i] >> s;
  82899. s = DIGIT_BIT - s;
  82900. }
  82901. }
  82902. else {
  82903. s += DIGIT_BIT;
  82904. }
  82905. }
  82906. for (j++; j < size; j++) {
  82907. r[j] = 0;
  82908. }
  82909. #endif
  82910. }
  82911. /* Write r as big endian to byte array.
  82912. * Fixed length number of bytes written: 512
  82913. *
  82914. * r A single precision integer.
  82915. * a Byte array.
  82916. */
  82917. static void sp_4096_to_bin_128(sp_digit* r, byte* a)
  82918. {
  82919. int i;
  82920. int j = 0;
  82921. for (i = 127; i >= 0; i--) {
  82922. a[j++] = r[i] >> 24;
  82923. a[j++] = r[i] >> 16;
  82924. a[j++] = r[i] >> 8;
  82925. a[j++] = r[i] >> 0;
  82926. }
  82927. }
  82928. #if (defined(WOLFSSL_HAVE_SP_RSA) && (!defined(WOLFSSL_RSA_PUBLIC_ONLY) || !defined(WOLFSSL_SP_SMALL))) || defined(WOLFSSL_HAVE_SP_DH)
  82929. /* Normalize the values in each word to 32.
  82930. *
  82931. * a Array of sp_digit to normalize.
  82932. */
  82933. #define sp_4096_norm_128(a)
  82934. #endif /* (WOLFSSL_HAVE_SP_RSA && (!WOLFSSL_RSA_PUBLIC_ONLY || !WOLFSSL_SP_SMALL)) || WOLFSSL_HAVE_SP_DH */
  82935. /* Normalize the values in each word to 32.
  82936. *
  82937. * a Array of sp_digit to normalize.
  82938. */
  82939. #define sp_4096_norm_128(a)
  82940. #ifndef WOLFSSL_SP_SMALL
  82941. /* Add b to a into r. (r = a + b)
  82942. *
  82943. * r A single precision integer.
  82944. * a A single precision integer.
  82945. * b A single precision integer.
  82946. */
  82947. SP_NOINLINE static sp_digit sp_4096_add_word_64(sp_digit* r, const sp_digit* a,
  82948. sp_digit b)
  82949. {
  82950. __asm__ __volatile__ (
  82951. "movs r5, #0\n\t"
  82952. "ldm %[a]!, {r3, r4}\n\t"
  82953. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82954. "adds r3, r3, %[b]\n\t"
  82955. #else
  82956. "add r3, r3, %[b]\n\t"
  82957. #endif
  82958. #ifdef WOLFSSL_KEIL
  82959. "adcs r4, r4, r5\n\t"
  82960. #elif defined(__clang__)
  82961. "adcs r4, r5\n\t"
  82962. #else
  82963. "adc r4, r5\n\t"
  82964. #endif
  82965. "stm %[r]!, {r3, r4}\n\t"
  82966. "ldm %[a]!, {r3, r4}\n\t"
  82967. #ifdef WOLFSSL_KEIL
  82968. "adcs r3, r3, r5\n\t"
  82969. #elif defined(__clang__)
  82970. "adcs r3, r5\n\t"
  82971. #else
  82972. "adc r3, r5\n\t"
  82973. #endif
  82974. #ifdef WOLFSSL_KEIL
  82975. "adcs r4, r4, r5\n\t"
  82976. #elif defined(__clang__)
  82977. "adcs r4, r5\n\t"
  82978. #else
  82979. "adc r4, r5\n\t"
  82980. #endif
  82981. "stm %[r]!, {r3, r4}\n\t"
  82982. "ldm %[a]!, {r3, r4}\n\t"
  82983. #ifdef WOLFSSL_KEIL
  82984. "adcs r3, r3, r5\n\t"
  82985. #elif defined(__clang__)
  82986. "adcs r3, r5\n\t"
  82987. #else
  82988. "adc r3, r5\n\t"
  82989. #endif
  82990. #ifdef WOLFSSL_KEIL
  82991. "adcs r4, r4, r5\n\t"
  82992. #elif defined(__clang__)
  82993. "adcs r4, r5\n\t"
  82994. #else
  82995. "adc r4, r5\n\t"
  82996. #endif
  82997. "stm %[r]!, {r3, r4}\n\t"
  82998. "ldm %[a]!, {r3, r4}\n\t"
  82999. #ifdef WOLFSSL_KEIL
  83000. "adcs r3, r3, r5\n\t"
  83001. #elif defined(__clang__)
  83002. "adcs r3, r5\n\t"
  83003. #else
  83004. "adc r3, r5\n\t"
  83005. #endif
  83006. #ifdef WOLFSSL_KEIL
  83007. "adcs r4, r4, r5\n\t"
  83008. #elif defined(__clang__)
  83009. "adcs r4, r5\n\t"
  83010. #else
  83011. "adc r4, r5\n\t"
  83012. #endif
  83013. "stm %[r]!, {r3, r4}\n\t"
  83014. "ldm %[a]!, {r3, r4}\n\t"
  83015. #ifdef WOLFSSL_KEIL
  83016. "adcs r3, r3, r5\n\t"
  83017. #elif defined(__clang__)
  83018. "adcs r3, r5\n\t"
  83019. #else
  83020. "adc r3, r5\n\t"
  83021. #endif
  83022. #ifdef WOLFSSL_KEIL
  83023. "adcs r4, r4, r5\n\t"
  83024. #elif defined(__clang__)
  83025. "adcs r4, r5\n\t"
  83026. #else
  83027. "adc r4, r5\n\t"
  83028. #endif
  83029. "stm %[r]!, {r3, r4}\n\t"
  83030. "ldm %[a]!, {r3, r4}\n\t"
  83031. #ifdef WOLFSSL_KEIL
  83032. "adcs r3, r3, r5\n\t"
  83033. #elif defined(__clang__)
  83034. "adcs r3, r5\n\t"
  83035. #else
  83036. "adc r3, r5\n\t"
  83037. #endif
  83038. #ifdef WOLFSSL_KEIL
  83039. "adcs r4, r4, r5\n\t"
  83040. #elif defined(__clang__)
  83041. "adcs r4, r5\n\t"
  83042. #else
  83043. "adc r4, r5\n\t"
  83044. #endif
  83045. "stm %[r]!, {r3, r4}\n\t"
  83046. "ldm %[a]!, {r3, r4}\n\t"
  83047. #ifdef WOLFSSL_KEIL
  83048. "adcs r3, r3, r5\n\t"
  83049. #elif defined(__clang__)
  83050. "adcs r3, r5\n\t"
  83051. #else
  83052. "adc r3, r5\n\t"
  83053. #endif
  83054. #ifdef WOLFSSL_KEIL
  83055. "adcs r4, r4, r5\n\t"
  83056. #elif defined(__clang__)
  83057. "adcs r4, r5\n\t"
  83058. #else
  83059. "adc r4, r5\n\t"
  83060. #endif
  83061. "stm %[r]!, {r3, r4}\n\t"
  83062. "ldm %[a]!, {r3, r4}\n\t"
  83063. #ifdef WOLFSSL_KEIL
  83064. "adcs r3, r3, r5\n\t"
  83065. #elif defined(__clang__)
  83066. "adcs r3, r5\n\t"
  83067. #else
  83068. "adc r3, r5\n\t"
  83069. #endif
  83070. #ifdef WOLFSSL_KEIL
  83071. "adcs r4, r4, r5\n\t"
  83072. #elif defined(__clang__)
  83073. "adcs r4, r5\n\t"
  83074. #else
  83075. "adc r4, r5\n\t"
  83076. #endif
  83077. "stm %[r]!, {r3, r4}\n\t"
  83078. "ldm %[a]!, {r3, r4}\n\t"
  83079. #ifdef WOLFSSL_KEIL
  83080. "adcs r3, r3, r5\n\t"
  83081. #elif defined(__clang__)
  83082. "adcs r3, r5\n\t"
  83083. #else
  83084. "adc r3, r5\n\t"
  83085. #endif
  83086. #ifdef WOLFSSL_KEIL
  83087. "adcs r4, r4, r5\n\t"
  83088. #elif defined(__clang__)
  83089. "adcs r4, r5\n\t"
  83090. #else
  83091. "adc r4, r5\n\t"
  83092. #endif
  83093. "stm %[r]!, {r3, r4}\n\t"
  83094. "ldm %[a]!, {r3, r4}\n\t"
  83095. #ifdef WOLFSSL_KEIL
  83096. "adcs r3, r3, r5\n\t"
  83097. #elif defined(__clang__)
  83098. "adcs r3, r5\n\t"
  83099. #else
  83100. "adc r3, r5\n\t"
  83101. #endif
  83102. #ifdef WOLFSSL_KEIL
  83103. "adcs r4, r4, r5\n\t"
  83104. #elif defined(__clang__)
  83105. "adcs r4, r5\n\t"
  83106. #else
  83107. "adc r4, r5\n\t"
  83108. #endif
  83109. "stm %[r]!, {r3, r4}\n\t"
  83110. "ldm %[a]!, {r3, r4}\n\t"
  83111. #ifdef WOLFSSL_KEIL
  83112. "adcs r3, r3, r5\n\t"
  83113. #elif defined(__clang__)
  83114. "adcs r3, r5\n\t"
  83115. #else
  83116. "adc r3, r5\n\t"
  83117. #endif
  83118. #ifdef WOLFSSL_KEIL
  83119. "adcs r4, r4, r5\n\t"
  83120. #elif defined(__clang__)
  83121. "adcs r4, r5\n\t"
  83122. #else
  83123. "adc r4, r5\n\t"
  83124. #endif
  83125. "stm %[r]!, {r3, r4}\n\t"
  83126. "ldm %[a]!, {r3, r4}\n\t"
  83127. #ifdef WOLFSSL_KEIL
  83128. "adcs r3, r3, r5\n\t"
  83129. #elif defined(__clang__)
  83130. "adcs r3, r5\n\t"
  83131. #else
  83132. "adc r3, r5\n\t"
  83133. #endif
  83134. #ifdef WOLFSSL_KEIL
  83135. "adcs r4, r4, r5\n\t"
  83136. #elif defined(__clang__)
  83137. "adcs r4, r5\n\t"
  83138. #else
  83139. "adc r4, r5\n\t"
  83140. #endif
  83141. "stm %[r]!, {r3, r4}\n\t"
  83142. "ldm %[a]!, {r3, r4}\n\t"
  83143. #ifdef WOLFSSL_KEIL
  83144. "adcs r3, r3, r5\n\t"
  83145. #elif defined(__clang__)
  83146. "adcs r3, r5\n\t"
  83147. #else
  83148. "adc r3, r5\n\t"
  83149. #endif
  83150. #ifdef WOLFSSL_KEIL
  83151. "adcs r4, r4, r5\n\t"
  83152. #elif defined(__clang__)
  83153. "adcs r4, r5\n\t"
  83154. #else
  83155. "adc r4, r5\n\t"
  83156. #endif
  83157. "stm %[r]!, {r3, r4}\n\t"
  83158. "ldm %[a]!, {r3, r4}\n\t"
  83159. #ifdef WOLFSSL_KEIL
  83160. "adcs r3, r3, r5\n\t"
  83161. #elif defined(__clang__)
  83162. "adcs r3, r5\n\t"
  83163. #else
  83164. "adc r3, r5\n\t"
  83165. #endif
  83166. #ifdef WOLFSSL_KEIL
  83167. "adcs r4, r4, r5\n\t"
  83168. #elif defined(__clang__)
  83169. "adcs r4, r5\n\t"
  83170. #else
  83171. "adc r4, r5\n\t"
  83172. #endif
  83173. "stm %[r]!, {r3, r4}\n\t"
  83174. "ldm %[a]!, {r3, r4}\n\t"
  83175. #ifdef WOLFSSL_KEIL
  83176. "adcs r3, r3, r5\n\t"
  83177. #elif defined(__clang__)
  83178. "adcs r3, r5\n\t"
  83179. #else
  83180. "adc r3, r5\n\t"
  83181. #endif
  83182. #ifdef WOLFSSL_KEIL
  83183. "adcs r4, r4, r5\n\t"
  83184. #elif defined(__clang__)
  83185. "adcs r4, r5\n\t"
  83186. #else
  83187. "adc r4, r5\n\t"
  83188. #endif
  83189. "stm %[r]!, {r3, r4}\n\t"
  83190. "ldm %[a]!, {r3, r4}\n\t"
  83191. #ifdef WOLFSSL_KEIL
  83192. "adcs r3, r3, r5\n\t"
  83193. #elif defined(__clang__)
  83194. "adcs r3, r5\n\t"
  83195. #else
  83196. "adc r3, r5\n\t"
  83197. #endif
  83198. #ifdef WOLFSSL_KEIL
  83199. "adcs r4, r4, r5\n\t"
  83200. #elif defined(__clang__)
  83201. "adcs r4, r5\n\t"
  83202. #else
  83203. "adc r4, r5\n\t"
  83204. #endif
  83205. "stm %[r]!, {r3, r4}\n\t"
  83206. "ldm %[a]!, {r3, r4}\n\t"
  83207. #ifdef WOLFSSL_KEIL
  83208. "adcs r3, r3, r5\n\t"
  83209. #elif defined(__clang__)
  83210. "adcs r3, r5\n\t"
  83211. #else
  83212. "adc r3, r5\n\t"
  83213. #endif
  83214. #ifdef WOLFSSL_KEIL
  83215. "adcs r4, r4, r5\n\t"
  83216. #elif defined(__clang__)
  83217. "adcs r4, r5\n\t"
  83218. #else
  83219. "adc r4, r5\n\t"
  83220. #endif
  83221. "stm %[r]!, {r3, r4}\n\t"
  83222. "ldm %[a]!, {r3, r4}\n\t"
  83223. #ifdef WOLFSSL_KEIL
  83224. "adcs r3, r3, r5\n\t"
  83225. #elif defined(__clang__)
  83226. "adcs r3, r5\n\t"
  83227. #else
  83228. "adc r3, r5\n\t"
  83229. #endif
  83230. #ifdef WOLFSSL_KEIL
  83231. "adcs r4, r4, r5\n\t"
  83232. #elif defined(__clang__)
  83233. "adcs r4, r5\n\t"
  83234. #else
  83235. "adc r4, r5\n\t"
  83236. #endif
  83237. "stm %[r]!, {r3, r4}\n\t"
  83238. "ldm %[a]!, {r3, r4}\n\t"
  83239. #ifdef WOLFSSL_KEIL
  83240. "adcs r3, r3, r5\n\t"
  83241. #elif defined(__clang__)
  83242. "adcs r3, r5\n\t"
  83243. #else
  83244. "adc r3, r5\n\t"
  83245. #endif
  83246. #ifdef WOLFSSL_KEIL
  83247. "adcs r4, r4, r5\n\t"
  83248. #elif defined(__clang__)
  83249. "adcs r4, r5\n\t"
  83250. #else
  83251. "adc r4, r5\n\t"
  83252. #endif
  83253. "stm %[r]!, {r3, r4}\n\t"
  83254. "ldm %[a]!, {r3, r4}\n\t"
  83255. #ifdef WOLFSSL_KEIL
  83256. "adcs r3, r3, r5\n\t"
  83257. #elif defined(__clang__)
  83258. "adcs r3, r5\n\t"
  83259. #else
  83260. "adc r3, r5\n\t"
  83261. #endif
  83262. #ifdef WOLFSSL_KEIL
  83263. "adcs r4, r4, r5\n\t"
  83264. #elif defined(__clang__)
  83265. "adcs r4, r5\n\t"
  83266. #else
  83267. "adc r4, r5\n\t"
  83268. #endif
  83269. "stm %[r]!, {r3, r4}\n\t"
  83270. "ldm %[a]!, {r3, r4}\n\t"
  83271. #ifdef WOLFSSL_KEIL
  83272. "adcs r3, r3, r5\n\t"
  83273. #elif defined(__clang__)
  83274. "adcs r3, r5\n\t"
  83275. #else
  83276. "adc r3, r5\n\t"
  83277. #endif
  83278. #ifdef WOLFSSL_KEIL
  83279. "adcs r4, r4, r5\n\t"
  83280. #elif defined(__clang__)
  83281. "adcs r4, r5\n\t"
  83282. #else
  83283. "adc r4, r5\n\t"
  83284. #endif
  83285. "stm %[r]!, {r3, r4}\n\t"
  83286. "ldm %[a]!, {r3, r4}\n\t"
  83287. #ifdef WOLFSSL_KEIL
  83288. "adcs r3, r3, r5\n\t"
  83289. #elif defined(__clang__)
  83290. "adcs r3, r5\n\t"
  83291. #else
  83292. "adc r3, r5\n\t"
  83293. #endif
  83294. #ifdef WOLFSSL_KEIL
  83295. "adcs r4, r4, r5\n\t"
  83296. #elif defined(__clang__)
  83297. "adcs r4, r5\n\t"
  83298. #else
  83299. "adc r4, r5\n\t"
  83300. #endif
  83301. "stm %[r]!, {r3, r4}\n\t"
  83302. "ldm %[a]!, {r3, r4}\n\t"
  83303. #ifdef WOLFSSL_KEIL
  83304. "adcs r3, r3, r5\n\t"
  83305. #elif defined(__clang__)
  83306. "adcs r3, r5\n\t"
  83307. #else
  83308. "adc r3, r5\n\t"
  83309. #endif
  83310. #ifdef WOLFSSL_KEIL
  83311. "adcs r4, r4, r5\n\t"
  83312. #elif defined(__clang__)
  83313. "adcs r4, r5\n\t"
  83314. #else
  83315. "adc r4, r5\n\t"
  83316. #endif
  83317. "stm %[r]!, {r3, r4}\n\t"
  83318. "ldm %[a]!, {r3, r4}\n\t"
  83319. #ifdef WOLFSSL_KEIL
  83320. "adcs r3, r3, r5\n\t"
  83321. #elif defined(__clang__)
  83322. "adcs r3, r5\n\t"
  83323. #else
  83324. "adc r3, r5\n\t"
  83325. #endif
  83326. #ifdef WOLFSSL_KEIL
  83327. "adcs r4, r4, r5\n\t"
  83328. #elif defined(__clang__)
  83329. "adcs r4, r5\n\t"
  83330. #else
  83331. "adc r4, r5\n\t"
  83332. #endif
  83333. "stm %[r]!, {r3, r4}\n\t"
  83334. "ldm %[a]!, {r3, r4}\n\t"
  83335. #ifdef WOLFSSL_KEIL
  83336. "adcs r3, r3, r5\n\t"
  83337. #elif defined(__clang__)
  83338. "adcs r3, r5\n\t"
  83339. #else
  83340. "adc r3, r5\n\t"
  83341. #endif
  83342. #ifdef WOLFSSL_KEIL
  83343. "adcs r4, r4, r5\n\t"
  83344. #elif defined(__clang__)
  83345. "adcs r4, r5\n\t"
  83346. #else
  83347. "adc r4, r5\n\t"
  83348. #endif
  83349. "stm %[r]!, {r3, r4}\n\t"
  83350. "ldm %[a]!, {r3, r4}\n\t"
  83351. #ifdef WOLFSSL_KEIL
  83352. "adcs r3, r3, r5\n\t"
  83353. #elif defined(__clang__)
  83354. "adcs r3, r5\n\t"
  83355. #else
  83356. "adc r3, r5\n\t"
  83357. #endif
  83358. #ifdef WOLFSSL_KEIL
  83359. "adcs r4, r4, r5\n\t"
  83360. #elif defined(__clang__)
  83361. "adcs r4, r5\n\t"
  83362. #else
  83363. "adc r4, r5\n\t"
  83364. #endif
  83365. "stm %[r]!, {r3, r4}\n\t"
  83366. "ldm %[a]!, {r3, r4}\n\t"
  83367. #ifdef WOLFSSL_KEIL
  83368. "adcs r3, r3, r5\n\t"
  83369. #elif defined(__clang__)
  83370. "adcs r3, r5\n\t"
  83371. #else
  83372. "adc r3, r5\n\t"
  83373. #endif
  83374. #ifdef WOLFSSL_KEIL
  83375. "adcs r4, r4, r5\n\t"
  83376. #elif defined(__clang__)
  83377. "adcs r4, r5\n\t"
  83378. #else
  83379. "adc r4, r5\n\t"
  83380. #endif
  83381. "stm %[r]!, {r3, r4}\n\t"
  83382. "ldm %[a]!, {r3, r4}\n\t"
  83383. #ifdef WOLFSSL_KEIL
  83384. "adcs r3, r3, r5\n\t"
  83385. #elif defined(__clang__)
  83386. "adcs r3, r5\n\t"
  83387. #else
  83388. "adc r3, r5\n\t"
  83389. #endif
  83390. #ifdef WOLFSSL_KEIL
  83391. "adcs r4, r4, r5\n\t"
  83392. #elif defined(__clang__)
  83393. "adcs r4, r5\n\t"
  83394. #else
  83395. "adc r4, r5\n\t"
  83396. #endif
  83397. "stm %[r]!, {r3, r4}\n\t"
  83398. "ldm %[a]!, {r3, r4}\n\t"
  83399. #ifdef WOLFSSL_KEIL
  83400. "adcs r3, r3, r5\n\t"
  83401. #elif defined(__clang__)
  83402. "adcs r3, r5\n\t"
  83403. #else
  83404. "adc r3, r5\n\t"
  83405. #endif
  83406. #ifdef WOLFSSL_KEIL
  83407. "adcs r4, r4, r5\n\t"
  83408. #elif defined(__clang__)
  83409. "adcs r4, r5\n\t"
  83410. #else
  83411. "adc r4, r5\n\t"
  83412. #endif
  83413. "stm %[r]!, {r3, r4}\n\t"
  83414. "ldm %[a]!, {r3, r4}\n\t"
  83415. #ifdef WOLFSSL_KEIL
  83416. "adcs r3, r3, r5\n\t"
  83417. #elif defined(__clang__)
  83418. "adcs r3, r5\n\t"
  83419. #else
  83420. "adc r3, r5\n\t"
  83421. #endif
  83422. #ifdef WOLFSSL_KEIL
  83423. "adcs r4, r4, r5\n\t"
  83424. #elif defined(__clang__)
  83425. "adcs r4, r5\n\t"
  83426. #else
  83427. "adc r4, r5\n\t"
  83428. #endif
  83429. "stm %[r]!, {r3, r4}\n\t"
  83430. "ldm %[a]!, {r3, r4}\n\t"
  83431. #ifdef WOLFSSL_KEIL
  83432. "adcs r3, r3, r5\n\t"
  83433. #elif defined(__clang__)
  83434. "adcs r3, r5\n\t"
  83435. #else
  83436. "adc r3, r5\n\t"
  83437. #endif
  83438. #ifdef WOLFSSL_KEIL
  83439. "adcs r4, r4, r5\n\t"
  83440. #elif defined(__clang__)
  83441. "adcs r4, r5\n\t"
  83442. #else
  83443. "adc r4, r5\n\t"
  83444. #endif
  83445. "stm %[r]!, {r3, r4}\n\t"
  83446. "ldm %[a]!, {r3, r4}\n\t"
  83447. #ifdef WOLFSSL_KEIL
  83448. "adcs r3, r3, r5\n\t"
  83449. #elif defined(__clang__)
  83450. "adcs r3, r5\n\t"
  83451. #else
  83452. "adc r3, r5\n\t"
  83453. #endif
  83454. #ifdef WOLFSSL_KEIL
  83455. "adcs r4, r4, r5\n\t"
  83456. #elif defined(__clang__)
  83457. "adcs r4, r5\n\t"
  83458. #else
  83459. "adc r4, r5\n\t"
  83460. #endif
  83461. "stm %[r]!, {r3, r4}\n\t"
  83462. "movs %[r], #0\n\t"
  83463. #ifdef WOLFSSL_KEIL
  83464. "adcs %[r], %[r], %[r]\n\t"
  83465. #elif defined(__clang__)
  83466. "adcs %[r], %[r]\n\t"
  83467. #else
  83468. "adc %[r], %[r]\n\t"
  83469. #endif
  83470. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  83471. :
  83472. : "memory", "r3", "r4", "r5"
  83473. );
  83474. return (uint32_t)(size_t)r;
  83475. }
  83476. /* Sub b from a into a. (a -= b)
  83477. *
  83478. * a A single precision integer.
  83479. * b A single precision integer.
  83480. */
  83481. SP_NOINLINE static sp_digit sp_4096_sub_in_place_128(sp_digit* a,
  83482. const sp_digit* b)
  83483. {
  83484. __asm__ __volatile__ (
  83485. "ldm %[b]!, {r4, r5}\n\t"
  83486. "ldr r2, [%[a]]\n\t"
  83487. "ldr r3, [%[a], #4]\n\t"
  83488. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  83489. "subs r2, r2, r4\n\t"
  83490. #else
  83491. "sub r2, r2, r4\n\t"
  83492. #endif
  83493. #ifdef WOLFSSL_KEIL
  83494. "sbcs r3, r3, r5\n\t"
  83495. #elif defined(__clang__)
  83496. "sbcs r3, r5\n\t"
  83497. #else
  83498. "sbc r3, r5\n\t"
  83499. #endif
  83500. "stm %[a]!, {r2, r3}\n\t"
  83501. "ldm %[b]!, {r4, r5}\n\t"
  83502. "ldr r2, [%[a]]\n\t"
  83503. "ldr r3, [%[a], #4]\n\t"
  83504. #ifdef WOLFSSL_KEIL
  83505. "sbcs r2, r2, r4\n\t"
  83506. #elif defined(__clang__)
  83507. "sbcs r2, r4\n\t"
  83508. #else
  83509. "sbc r2, r4\n\t"
  83510. #endif
  83511. #ifdef WOLFSSL_KEIL
  83512. "sbcs r3, r3, r5\n\t"
  83513. #elif defined(__clang__)
  83514. "sbcs r3, r5\n\t"
  83515. #else
  83516. "sbc r3, r5\n\t"
  83517. #endif
  83518. "stm %[a]!, {r2, r3}\n\t"
  83519. "ldm %[b]!, {r4, r5}\n\t"
  83520. "ldr r2, [%[a]]\n\t"
  83521. "ldr r3, [%[a], #4]\n\t"
  83522. #ifdef WOLFSSL_KEIL
  83523. "sbcs r2, r2, r4\n\t"
  83524. #elif defined(__clang__)
  83525. "sbcs r2, r4\n\t"
  83526. #else
  83527. "sbc r2, r4\n\t"
  83528. #endif
  83529. #ifdef WOLFSSL_KEIL
  83530. "sbcs r3, r3, r5\n\t"
  83531. #elif defined(__clang__)
  83532. "sbcs r3, r5\n\t"
  83533. #else
  83534. "sbc r3, r5\n\t"
  83535. #endif
  83536. "stm %[a]!, {r2, r3}\n\t"
  83537. "ldm %[b]!, {r4, r5}\n\t"
  83538. "ldr r2, [%[a]]\n\t"
  83539. "ldr r3, [%[a], #4]\n\t"
  83540. #ifdef WOLFSSL_KEIL
  83541. "sbcs r2, r2, r4\n\t"
  83542. #elif defined(__clang__)
  83543. "sbcs r2, r4\n\t"
  83544. #else
  83545. "sbc r2, r4\n\t"
  83546. #endif
  83547. #ifdef WOLFSSL_KEIL
  83548. "sbcs r3, r3, r5\n\t"
  83549. #elif defined(__clang__)
  83550. "sbcs r3, r5\n\t"
  83551. #else
  83552. "sbc r3, r5\n\t"
  83553. #endif
  83554. "stm %[a]!, {r2, r3}\n\t"
  83555. "ldm %[b]!, {r4, r5}\n\t"
  83556. "ldr r2, [%[a]]\n\t"
  83557. "ldr r3, [%[a], #4]\n\t"
  83558. #ifdef WOLFSSL_KEIL
  83559. "sbcs r2, r2, r4\n\t"
  83560. #elif defined(__clang__)
  83561. "sbcs r2, r4\n\t"
  83562. #else
  83563. "sbc r2, r4\n\t"
  83564. #endif
  83565. #ifdef WOLFSSL_KEIL
  83566. "sbcs r3, r3, r5\n\t"
  83567. #elif defined(__clang__)
  83568. "sbcs r3, r5\n\t"
  83569. #else
  83570. "sbc r3, r5\n\t"
  83571. #endif
  83572. "stm %[a]!, {r2, r3}\n\t"
  83573. "ldm %[b]!, {r4, r5}\n\t"
  83574. "ldr r2, [%[a]]\n\t"
  83575. "ldr r3, [%[a], #4]\n\t"
  83576. #ifdef WOLFSSL_KEIL
  83577. "sbcs r2, r2, r4\n\t"
  83578. #elif defined(__clang__)
  83579. "sbcs r2, r4\n\t"
  83580. #else
  83581. "sbc r2, r4\n\t"
  83582. #endif
  83583. #ifdef WOLFSSL_KEIL
  83584. "sbcs r3, r3, r5\n\t"
  83585. #elif defined(__clang__)
  83586. "sbcs r3, r5\n\t"
  83587. #else
  83588. "sbc r3, r5\n\t"
  83589. #endif
  83590. "stm %[a]!, {r2, r3}\n\t"
  83591. "ldm %[b]!, {r4, r5}\n\t"
  83592. "ldr r2, [%[a]]\n\t"
  83593. "ldr r3, [%[a], #4]\n\t"
  83594. #ifdef WOLFSSL_KEIL
  83595. "sbcs r2, r2, r4\n\t"
  83596. #elif defined(__clang__)
  83597. "sbcs r2, r4\n\t"
  83598. #else
  83599. "sbc r2, r4\n\t"
  83600. #endif
  83601. #ifdef WOLFSSL_KEIL
  83602. "sbcs r3, r3, r5\n\t"
  83603. #elif defined(__clang__)
  83604. "sbcs r3, r5\n\t"
  83605. #else
  83606. "sbc r3, r5\n\t"
  83607. #endif
  83608. "stm %[a]!, {r2, r3}\n\t"
  83609. "ldm %[b]!, {r4, r5}\n\t"
  83610. "ldr r2, [%[a]]\n\t"
  83611. "ldr r3, [%[a], #4]\n\t"
  83612. #ifdef WOLFSSL_KEIL
  83613. "sbcs r2, r2, r4\n\t"
  83614. #elif defined(__clang__)
  83615. "sbcs r2, r4\n\t"
  83616. #else
  83617. "sbc r2, r4\n\t"
  83618. #endif
  83619. #ifdef WOLFSSL_KEIL
  83620. "sbcs r3, r3, r5\n\t"
  83621. #elif defined(__clang__)
  83622. "sbcs r3, r5\n\t"
  83623. #else
  83624. "sbc r3, r5\n\t"
  83625. #endif
  83626. "stm %[a]!, {r2, r3}\n\t"
  83627. "ldm %[b]!, {r4, r5}\n\t"
  83628. "ldr r2, [%[a]]\n\t"
  83629. "ldr r3, [%[a], #4]\n\t"
  83630. #ifdef WOLFSSL_KEIL
  83631. "sbcs r2, r2, r4\n\t"
  83632. #elif defined(__clang__)
  83633. "sbcs r2, r4\n\t"
  83634. #else
  83635. "sbc r2, r4\n\t"
  83636. #endif
  83637. #ifdef WOLFSSL_KEIL
  83638. "sbcs r3, r3, r5\n\t"
  83639. #elif defined(__clang__)
  83640. "sbcs r3, r5\n\t"
  83641. #else
  83642. "sbc r3, r5\n\t"
  83643. #endif
  83644. "stm %[a]!, {r2, r3}\n\t"
  83645. "ldm %[b]!, {r4, r5}\n\t"
  83646. "ldr r2, [%[a]]\n\t"
  83647. "ldr r3, [%[a], #4]\n\t"
  83648. #ifdef WOLFSSL_KEIL
  83649. "sbcs r2, r2, r4\n\t"
  83650. #elif defined(__clang__)
  83651. "sbcs r2, r4\n\t"
  83652. #else
  83653. "sbc r2, r4\n\t"
  83654. #endif
  83655. #ifdef WOLFSSL_KEIL
  83656. "sbcs r3, r3, r5\n\t"
  83657. #elif defined(__clang__)
  83658. "sbcs r3, r5\n\t"
  83659. #else
  83660. "sbc r3, r5\n\t"
  83661. #endif
  83662. "stm %[a]!, {r2, r3}\n\t"
  83663. "ldm %[b]!, {r4, r5}\n\t"
  83664. "ldr r2, [%[a]]\n\t"
  83665. "ldr r3, [%[a], #4]\n\t"
  83666. #ifdef WOLFSSL_KEIL
  83667. "sbcs r2, r2, r4\n\t"
  83668. #elif defined(__clang__)
  83669. "sbcs r2, r4\n\t"
  83670. #else
  83671. "sbc r2, r4\n\t"
  83672. #endif
  83673. #ifdef WOLFSSL_KEIL
  83674. "sbcs r3, r3, r5\n\t"
  83675. #elif defined(__clang__)
  83676. "sbcs r3, r5\n\t"
  83677. #else
  83678. "sbc r3, r5\n\t"
  83679. #endif
  83680. "stm %[a]!, {r2, r3}\n\t"
  83681. "ldm %[b]!, {r4, r5}\n\t"
  83682. "ldr r2, [%[a]]\n\t"
  83683. "ldr r3, [%[a], #4]\n\t"
  83684. #ifdef WOLFSSL_KEIL
  83685. "sbcs r2, r2, r4\n\t"
  83686. #elif defined(__clang__)
  83687. "sbcs r2, r4\n\t"
  83688. #else
  83689. "sbc r2, r4\n\t"
  83690. #endif
  83691. #ifdef WOLFSSL_KEIL
  83692. "sbcs r3, r3, r5\n\t"
  83693. #elif defined(__clang__)
  83694. "sbcs r3, r5\n\t"
  83695. #else
  83696. "sbc r3, r5\n\t"
  83697. #endif
  83698. "stm %[a]!, {r2, r3}\n\t"
  83699. "ldm %[b]!, {r4, r5}\n\t"
  83700. "ldr r2, [%[a]]\n\t"
  83701. "ldr r3, [%[a], #4]\n\t"
  83702. #ifdef WOLFSSL_KEIL
  83703. "sbcs r2, r2, r4\n\t"
  83704. #elif defined(__clang__)
  83705. "sbcs r2, r4\n\t"
  83706. #else
  83707. "sbc r2, r4\n\t"
  83708. #endif
  83709. #ifdef WOLFSSL_KEIL
  83710. "sbcs r3, r3, r5\n\t"
  83711. #elif defined(__clang__)
  83712. "sbcs r3, r5\n\t"
  83713. #else
  83714. "sbc r3, r5\n\t"
  83715. #endif
  83716. "stm %[a]!, {r2, r3}\n\t"
  83717. "ldm %[b]!, {r4, r5}\n\t"
  83718. "ldr r2, [%[a]]\n\t"
  83719. "ldr r3, [%[a], #4]\n\t"
  83720. #ifdef WOLFSSL_KEIL
  83721. "sbcs r2, r2, r4\n\t"
  83722. #elif defined(__clang__)
  83723. "sbcs r2, r4\n\t"
  83724. #else
  83725. "sbc r2, r4\n\t"
  83726. #endif
  83727. #ifdef WOLFSSL_KEIL
  83728. "sbcs r3, r3, r5\n\t"
  83729. #elif defined(__clang__)
  83730. "sbcs r3, r5\n\t"
  83731. #else
  83732. "sbc r3, r5\n\t"
  83733. #endif
  83734. "stm %[a]!, {r2, r3}\n\t"
  83735. "ldm %[b]!, {r4, r5}\n\t"
  83736. "ldr r2, [%[a]]\n\t"
  83737. "ldr r3, [%[a], #4]\n\t"
  83738. #ifdef WOLFSSL_KEIL
  83739. "sbcs r2, r2, r4\n\t"
  83740. #elif defined(__clang__)
  83741. "sbcs r2, r4\n\t"
  83742. #else
  83743. "sbc r2, r4\n\t"
  83744. #endif
  83745. #ifdef WOLFSSL_KEIL
  83746. "sbcs r3, r3, r5\n\t"
  83747. #elif defined(__clang__)
  83748. "sbcs r3, r5\n\t"
  83749. #else
  83750. "sbc r3, r5\n\t"
  83751. #endif
  83752. "stm %[a]!, {r2, r3}\n\t"
  83753. "ldm %[b]!, {r4, r5}\n\t"
  83754. "ldr r2, [%[a]]\n\t"
  83755. "ldr r3, [%[a], #4]\n\t"
  83756. #ifdef WOLFSSL_KEIL
  83757. "sbcs r2, r2, r4\n\t"
  83758. #elif defined(__clang__)
  83759. "sbcs r2, r4\n\t"
  83760. #else
  83761. "sbc r2, r4\n\t"
  83762. #endif
  83763. #ifdef WOLFSSL_KEIL
  83764. "sbcs r3, r3, r5\n\t"
  83765. #elif defined(__clang__)
  83766. "sbcs r3, r5\n\t"
  83767. #else
  83768. "sbc r3, r5\n\t"
  83769. #endif
  83770. "stm %[a]!, {r2, r3}\n\t"
  83771. "ldm %[b]!, {r4, r5}\n\t"
  83772. "ldr r2, [%[a]]\n\t"
  83773. "ldr r3, [%[a], #4]\n\t"
  83774. #ifdef WOLFSSL_KEIL
  83775. "sbcs r2, r2, r4\n\t"
  83776. #elif defined(__clang__)
  83777. "sbcs r2, r4\n\t"
  83778. #else
  83779. "sbc r2, r4\n\t"
  83780. #endif
  83781. #ifdef WOLFSSL_KEIL
  83782. "sbcs r3, r3, r5\n\t"
  83783. #elif defined(__clang__)
  83784. "sbcs r3, r5\n\t"
  83785. #else
  83786. "sbc r3, r5\n\t"
  83787. #endif
  83788. "stm %[a]!, {r2, r3}\n\t"
  83789. "ldm %[b]!, {r4, r5}\n\t"
  83790. "ldr r2, [%[a]]\n\t"
  83791. "ldr r3, [%[a], #4]\n\t"
  83792. #ifdef WOLFSSL_KEIL
  83793. "sbcs r2, r2, r4\n\t"
  83794. #elif defined(__clang__)
  83795. "sbcs r2, r4\n\t"
  83796. #else
  83797. "sbc r2, r4\n\t"
  83798. #endif
  83799. #ifdef WOLFSSL_KEIL
  83800. "sbcs r3, r3, r5\n\t"
  83801. #elif defined(__clang__)
  83802. "sbcs r3, r5\n\t"
  83803. #else
  83804. "sbc r3, r5\n\t"
  83805. #endif
  83806. "stm %[a]!, {r2, r3}\n\t"
  83807. "ldm %[b]!, {r4, r5}\n\t"
  83808. "ldr r2, [%[a]]\n\t"
  83809. "ldr r3, [%[a], #4]\n\t"
  83810. #ifdef WOLFSSL_KEIL
  83811. "sbcs r2, r2, r4\n\t"
  83812. #elif defined(__clang__)
  83813. "sbcs r2, r4\n\t"
  83814. #else
  83815. "sbc r2, r4\n\t"
  83816. #endif
  83817. #ifdef WOLFSSL_KEIL
  83818. "sbcs r3, r3, r5\n\t"
  83819. #elif defined(__clang__)
  83820. "sbcs r3, r5\n\t"
  83821. #else
  83822. "sbc r3, r5\n\t"
  83823. #endif
  83824. "stm %[a]!, {r2, r3}\n\t"
  83825. "ldm %[b]!, {r4, r5}\n\t"
  83826. "ldr r2, [%[a]]\n\t"
  83827. "ldr r3, [%[a], #4]\n\t"
  83828. #ifdef WOLFSSL_KEIL
  83829. "sbcs r2, r2, r4\n\t"
  83830. #elif defined(__clang__)
  83831. "sbcs r2, r4\n\t"
  83832. #else
  83833. "sbc r2, r4\n\t"
  83834. #endif
  83835. #ifdef WOLFSSL_KEIL
  83836. "sbcs r3, r3, r5\n\t"
  83837. #elif defined(__clang__)
  83838. "sbcs r3, r5\n\t"
  83839. #else
  83840. "sbc r3, r5\n\t"
  83841. #endif
  83842. "stm %[a]!, {r2, r3}\n\t"
  83843. "ldm %[b]!, {r4, r5}\n\t"
  83844. "ldr r2, [%[a]]\n\t"
  83845. "ldr r3, [%[a], #4]\n\t"
  83846. #ifdef WOLFSSL_KEIL
  83847. "sbcs r2, r2, r4\n\t"
  83848. #elif defined(__clang__)
  83849. "sbcs r2, r4\n\t"
  83850. #else
  83851. "sbc r2, r4\n\t"
  83852. #endif
  83853. #ifdef WOLFSSL_KEIL
  83854. "sbcs r3, r3, r5\n\t"
  83855. #elif defined(__clang__)
  83856. "sbcs r3, r5\n\t"
  83857. #else
  83858. "sbc r3, r5\n\t"
  83859. #endif
  83860. "stm %[a]!, {r2, r3}\n\t"
  83861. "ldm %[b]!, {r4, r5}\n\t"
  83862. "ldr r2, [%[a]]\n\t"
  83863. "ldr r3, [%[a], #4]\n\t"
  83864. #ifdef WOLFSSL_KEIL
  83865. "sbcs r2, r2, r4\n\t"
  83866. #elif defined(__clang__)
  83867. "sbcs r2, r4\n\t"
  83868. #else
  83869. "sbc r2, r4\n\t"
  83870. #endif
  83871. #ifdef WOLFSSL_KEIL
  83872. "sbcs r3, r3, r5\n\t"
  83873. #elif defined(__clang__)
  83874. "sbcs r3, r5\n\t"
  83875. #else
  83876. "sbc r3, r5\n\t"
  83877. #endif
  83878. "stm %[a]!, {r2, r3}\n\t"
  83879. "ldm %[b]!, {r4, r5}\n\t"
  83880. "ldr r2, [%[a]]\n\t"
  83881. "ldr r3, [%[a], #4]\n\t"
  83882. #ifdef WOLFSSL_KEIL
  83883. "sbcs r2, r2, r4\n\t"
  83884. #elif defined(__clang__)
  83885. "sbcs r2, r4\n\t"
  83886. #else
  83887. "sbc r2, r4\n\t"
  83888. #endif
  83889. #ifdef WOLFSSL_KEIL
  83890. "sbcs r3, r3, r5\n\t"
  83891. #elif defined(__clang__)
  83892. "sbcs r3, r5\n\t"
  83893. #else
  83894. "sbc r3, r5\n\t"
  83895. #endif
  83896. "stm %[a]!, {r2, r3}\n\t"
  83897. "ldm %[b]!, {r4, r5}\n\t"
  83898. "ldr r2, [%[a]]\n\t"
  83899. "ldr r3, [%[a], #4]\n\t"
  83900. #ifdef WOLFSSL_KEIL
  83901. "sbcs r2, r2, r4\n\t"
  83902. #elif defined(__clang__)
  83903. "sbcs r2, r4\n\t"
  83904. #else
  83905. "sbc r2, r4\n\t"
  83906. #endif
  83907. #ifdef WOLFSSL_KEIL
  83908. "sbcs r3, r3, r5\n\t"
  83909. #elif defined(__clang__)
  83910. "sbcs r3, r5\n\t"
  83911. #else
  83912. "sbc r3, r5\n\t"
  83913. #endif
  83914. "stm %[a]!, {r2, r3}\n\t"
  83915. "ldm %[b]!, {r4, r5}\n\t"
  83916. "ldr r2, [%[a]]\n\t"
  83917. "ldr r3, [%[a], #4]\n\t"
  83918. #ifdef WOLFSSL_KEIL
  83919. "sbcs r2, r2, r4\n\t"
  83920. #elif defined(__clang__)
  83921. "sbcs r2, r4\n\t"
  83922. #else
  83923. "sbc r2, r4\n\t"
  83924. #endif
  83925. #ifdef WOLFSSL_KEIL
  83926. "sbcs r3, r3, r5\n\t"
  83927. #elif defined(__clang__)
  83928. "sbcs r3, r5\n\t"
  83929. #else
  83930. "sbc r3, r5\n\t"
  83931. #endif
  83932. "stm %[a]!, {r2, r3}\n\t"
  83933. "ldm %[b]!, {r4, r5}\n\t"
  83934. "ldr r2, [%[a]]\n\t"
  83935. "ldr r3, [%[a], #4]\n\t"
  83936. #ifdef WOLFSSL_KEIL
  83937. "sbcs r2, r2, r4\n\t"
  83938. #elif defined(__clang__)
  83939. "sbcs r2, r4\n\t"
  83940. #else
  83941. "sbc r2, r4\n\t"
  83942. #endif
  83943. #ifdef WOLFSSL_KEIL
  83944. "sbcs r3, r3, r5\n\t"
  83945. #elif defined(__clang__)
  83946. "sbcs r3, r5\n\t"
  83947. #else
  83948. "sbc r3, r5\n\t"
  83949. #endif
  83950. "stm %[a]!, {r2, r3}\n\t"
  83951. "ldm %[b]!, {r4, r5}\n\t"
  83952. "ldr r2, [%[a]]\n\t"
  83953. "ldr r3, [%[a], #4]\n\t"
  83954. #ifdef WOLFSSL_KEIL
  83955. "sbcs r2, r2, r4\n\t"
  83956. #elif defined(__clang__)
  83957. "sbcs r2, r4\n\t"
  83958. #else
  83959. "sbc r2, r4\n\t"
  83960. #endif
  83961. #ifdef WOLFSSL_KEIL
  83962. "sbcs r3, r3, r5\n\t"
  83963. #elif defined(__clang__)
  83964. "sbcs r3, r5\n\t"
  83965. #else
  83966. "sbc r3, r5\n\t"
  83967. #endif
  83968. "stm %[a]!, {r2, r3}\n\t"
  83969. "ldm %[b]!, {r4, r5}\n\t"
  83970. "ldr r2, [%[a]]\n\t"
  83971. "ldr r3, [%[a], #4]\n\t"
  83972. #ifdef WOLFSSL_KEIL
  83973. "sbcs r2, r2, r4\n\t"
  83974. #elif defined(__clang__)
  83975. "sbcs r2, r4\n\t"
  83976. #else
  83977. "sbc r2, r4\n\t"
  83978. #endif
  83979. #ifdef WOLFSSL_KEIL
  83980. "sbcs r3, r3, r5\n\t"
  83981. #elif defined(__clang__)
  83982. "sbcs r3, r5\n\t"
  83983. #else
  83984. "sbc r3, r5\n\t"
  83985. #endif
  83986. "stm %[a]!, {r2, r3}\n\t"
  83987. "ldm %[b]!, {r4, r5}\n\t"
  83988. "ldr r2, [%[a]]\n\t"
  83989. "ldr r3, [%[a], #4]\n\t"
  83990. #ifdef WOLFSSL_KEIL
  83991. "sbcs r2, r2, r4\n\t"
  83992. #elif defined(__clang__)
  83993. "sbcs r2, r4\n\t"
  83994. #else
  83995. "sbc r2, r4\n\t"
  83996. #endif
  83997. #ifdef WOLFSSL_KEIL
  83998. "sbcs r3, r3, r5\n\t"
  83999. #elif defined(__clang__)
  84000. "sbcs r3, r5\n\t"
  84001. #else
  84002. "sbc r3, r5\n\t"
  84003. #endif
  84004. "stm %[a]!, {r2, r3}\n\t"
  84005. "ldm %[b]!, {r4, r5}\n\t"
  84006. "ldr r2, [%[a]]\n\t"
  84007. "ldr r3, [%[a], #4]\n\t"
  84008. #ifdef WOLFSSL_KEIL
  84009. "sbcs r2, r2, r4\n\t"
  84010. #elif defined(__clang__)
  84011. "sbcs r2, r4\n\t"
  84012. #else
  84013. "sbc r2, r4\n\t"
  84014. #endif
  84015. #ifdef WOLFSSL_KEIL
  84016. "sbcs r3, r3, r5\n\t"
  84017. #elif defined(__clang__)
  84018. "sbcs r3, r5\n\t"
  84019. #else
  84020. "sbc r3, r5\n\t"
  84021. #endif
  84022. "stm %[a]!, {r2, r3}\n\t"
  84023. "ldm %[b]!, {r4, r5}\n\t"
  84024. "ldr r2, [%[a]]\n\t"
  84025. "ldr r3, [%[a], #4]\n\t"
  84026. #ifdef WOLFSSL_KEIL
  84027. "sbcs r2, r2, r4\n\t"
  84028. #elif defined(__clang__)
  84029. "sbcs r2, r4\n\t"
  84030. #else
  84031. "sbc r2, r4\n\t"
  84032. #endif
  84033. #ifdef WOLFSSL_KEIL
  84034. "sbcs r3, r3, r5\n\t"
  84035. #elif defined(__clang__)
  84036. "sbcs r3, r5\n\t"
  84037. #else
  84038. "sbc r3, r5\n\t"
  84039. #endif
  84040. "stm %[a]!, {r2, r3}\n\t"
  84041. "ldm %[b]!, {r4, r5}\n\t"
  84042. "ldr r2, [%[a]]\n\t"
  84043. "ldr r3, [%[a], #4]\n\t"
  84044. #ifdef WOLFSSL_KEIL
  84045. "sbcs r2, r2, r4\n\t"
  84046. #elif defined(__clang__)
  84047. "sbcs r2, r4\n\t"
  84048. #else
  84049. "sbc r2, r4\n\t"
  84050. #endif
  84051. #ifdef WOLFSSL_KEIL
  84052. "sbcs r3, r3, r5\n\t"
  84053. #elif defined(__clang__)
  84054. "sbcs r3, r5\n\t"
  84055. #else
  84056. "sbc r3, r5\n\t"
  84057. #endif
  84058. "stm %[a]!, {r2, r3}\n\t"
  84059. "ldm %[b]!, {r4, r5}\n\t"
  84060. "ldr r2, [%[a]]\n\t"
  84061. "ldr r3, [%[a], #4]\n\t"
  84062. #ifdef WOLFSSL_KEIL
  84063. "sbcs r2, r2, r4\n\t"
  84064. #elif defined(__clang__)
  84065. "sbcs r2, r4\n\t"
  84066. #else
  84067. "sbc r2, r4\n\t"
  84068. #endif
  84069. #ifdef WOLFSSL_KEIL
  84070. "sbcs r3, r3, r5\n\t"
  84071. #elif defined(__clang__)
  84072. "sbcs r3, r5\n\t"
  84073. #else
  84074. "sbc r3, r5\n\t"
  84075. #endif
  84076. "stm %[a]!, {r2, r3}\n\t"
  84077. "ldm %[b]!, {r4, r5}\n\t"
  84078. "ldr r2, [%[a]]\n\t"
  84079. "ldr r3, [%[a], #4]\n\t"
  84080. #ifdef WOLFSSL_KEIL
  84081. "sbcs r2, r2, r4\n\t"
  84082. #elif defined(__clang__)
  84083. "sbcs r2, r4\n\t"
  84084. #else
  84085. "sbc r2, r4\n\t"
  84086. #endif
  84087. #ifdef WOLFSSL_KEIL
  84088. "sbcs r3, r3, r5\n\t"
  84089. #elif defined(__clang__)
  84090. "sbcs r3, r5\n\t"
  84091. #else
  84092. "sbc r3, r5\n\t"
  84093. #endif
  84094. "stm %[a]!, {r2, r3}\n\t"
  84095. "ldm %[b]!, {r4, r5}\n\t"
  84096. "ldr r2, [%[a]]\n\t"
  84097. "ldr r3, [%[a], #4]\n\t"
  84098. #ifdef WOLFSSL_KEIL
  84099. "sbcs r2, r2, r4\n\t"
  84100. #elif defined(__clang__)
  84101. "sbcs r2, r4\n\t"
  84102. #else
  84103. "sbc r2, r4\n\t"
  84104. #endif
  84105. #ifdef WOLFSSL_KEIL
  84106. "sbcs r3, r3, r5\n\t"
  84107. #elif defined(__clang__)
  84108. "sbcs r3, r5\n\t"
  84109. #else
  84110. "sbc r3, r5\n\t"
  84111. #endif
  84112. "stm %[a]!, {r2, r3}\n\t"
  84113. "ldm %[b]!, {r4, r5}\n\t"
  84114. "ldr r2, [%[a]]\n\t"
  84115. "ldr r3, [%[a], #4]\n\t"
  84116. #ifdef WOLFSSL_KEIL
  84117. "sbcs r2, r2, r4\n\t"
  84118. #elif defined(__clang__)
  84119. "sbcs r2, r4\n\t"
  84120. #else
  84121. "sbc r2, r4\n\t"
  84122. #endif
  84123. #ifdef WOLFSSL_KEIL
  84124. "sbcs r3, r3, r5\n\t"
  84125. #elif defined(__clang__)
  84126. "sbcs r3, r5\n\t"
  84127. #else
  84128. "sbc r3, r5\n\t"
  84129. #endif
  84130. "stm %[a]!, {r2, r3}\n\t"
  84131. "ldm %[b]!, {r4, r5}\n\t"
  84132. "ldr r2, [%[a]]\n\t"
  84133. "ldr r3, [%[a], #4]\n\t"
  84134. #ifdef WOLFSSL_KEIL
  84135. "sbcs r2, r2, r4\n\t"
  84136. #elif defined(__clang__)
  84137. "sbcs r2, r4\n\t"
  84138. #else
  84139. "sbc r2, r4\n\t"
  84140. #endif
  84141. #ifdef WOLFSSL_KEIL
  84142. "sbcs r3, r3, r5\n\t"
  84143. #elif defined(__clang__)
  84144. "sbcs r3, r5\n\t"
  84145. #else
  84146. "sbc r3, r5\n\t"
  84147. #endif
  84148. "stm %[a]!, {r2, r3}\n\t"
  84149. "ldm %[b]!, {r4, r5}\n\t"
  84150. "ldr r2, [%[a]]\n\t"
  84151. "ldr r3, [%[a], #4]\n\t"
  84152. #ifdef WOLFSSL_KEIL
  84153. "sbcs r2, r2, r4\n\t"
  84154. #elif defined(__clang__)
  84155. "sbcs r2, r4\n\t"
  84156. #else
  84157. "sbc r2, r4\n\t"
  84158. #endif
  84159. #ifdef WOLFSSL_KEIL
  84160. "sbcs r3, r3, r5\n\t"
  84161. #elif defined(__clang__)
  84162. "sbcs r3, r5\n\t"
  84163. #else
  84164. "sbc r3, r5\n\t"
  84165. #endif
  84166. "stm %[a]!, {r2, r3}\n\t"
  84167. "ldm %[b]!, {r4, r5}\n\t"
  84168. "ldr r2, [%[a]]\n\t"
  84169. "ldr r3, [%[a], #4]\n\t"
  84170. #ifdef WOLFSSL_KEIL
  84171. "sbcs r2, r2, r4\n\t"
  84172. #elif defined(__clang__)
  84173. "sbcs r2, r4\n\t"
  84174. #else
  84175. "sbc r2, r4\n\t"
  84176. #endif
  84177. #ifdef WOLFSSL_KEIL
  84178. "sbcs r3, r3, r5\n\t"
  84179. #elif defined(__clang__)
  84180. "sbcs r3, r5\n\t"
  84181. #else
  84182. "sbc r3, r5\n\t"
  84183. #endif
  84184. "stm %[a]!, {r2, r3}\n\t"
  84185. "ldm %[b]!, {r4, r5}\n\t"
  84186. "ldr r2, [%[a]]\n\t"
  84187. "ldr r3, [%[a], #4]\n\t"
  84188. #ifdef WOLFSSL_KEIL
  84189. "sbcs r2, r2, r4\n\t"
  84190. #elif defined(__clang__)
  84191. "sbcs r2, r4\n\t"
  84192. #else
  84193. "sbc r2, r4\n\t"
  84194. #endif
  84195. #ifdef WOLFSSL_KEIL
  84196. "sbcs r3, r3, r5\n\t"
  84197. #elif defined(__clang__)
  84198. "sbcs r3, r5\n\t"
  84199. #else
  84200. "sbc r3, r5\n\t"
  84201. #endif
  84202. "stm %[a]!, {r2, r3}\n\t"
  84203. "ldm %[b]!, {r4, r5}\n\t"
  84204. "ldr r2, [%[a]]\n\t"
  84205. "ldr r3, [%[a], #4]\n\t"
  84206. #ifdef WOLFSSL_KEIL
  84207. "sbcs r2, r2, r4\n\t"
  84208. #elif defined(__clang__)
  84209. "sbcs r2, r4\n\t"
  84210. #else
  84211. "sbc r2, r4\n\t"
  84212. #endif
  84213. #ifdef WOLFSSL_KEIL
  84214. "sbcs r3, r3, r5\n\t"
  84215. #elif defined(__clang__)
  84216. "sbcs r3, r5\n\t"
  84217. #else
  84218. "sbc r3, r5\n\t"
  84219. #endif
  84220. "stm %[a]!, {r2, r3}\n\t"
  84221. "ldm %[b]!, {r4, r5}\n\t"
  84222. "ldr r2, [%[a]]\n\t"
  84223. "ldr r3, [%[a], #4]\n\t"
  84224. #ifdef WOLFSSL_KEIL
  84225. "sbcs r2, r2, r4\n\t"
  84226. #elif defined(__clang__)
  84227. "sbcs r2, r4\n\t"
  84228. #else
  84229. "sbc r2, r4\n\t"
  84230. #endif
  84231. #ifdef WOLFSSL_KEIL
  84232. "sbcs r3, r3, r5\n\t"
  84233. #elif defined(__clang__)
  84234. "sbcs r3, r5\n\t"
  84235. #else
  84236. "sbc r3, r5\n\t"
  84237. #endif
  84238. "stm %[a]!, {r2, r3}\n\t"
  84239. "ldm %[b]!, {r4, r5}\n\t"
  84240. "ldr r2, [%[a]]\n\t"
  84241. "ldr r3, [%[a], #4]\n\t"
  84242. #ifdef WOLFSSL_KEIL
  84243. "sbcs r2, r2, r4\n\t"
  84244. #elif defined(__clang__)
  84245. "sbcs r2, r4\n\t"
  84246. #else
  84247. "sbc r2, r4\n\t"
  84248. #endif
  84249. #ifdef WOLFSSL_KEIL
  84250. "sbcs r3, r3, r5\n\t"
  84251. #elif defined(__clang__)
  84252. "sbcs r3, r5\n\t"
  84253. #else
  84254. "sbc r3, r5\n\t"
  84255. #endif
  84256. "stm %[a]!, {r2, r3}\n\t"
  84257. "ldm %[b]!, {r4, r5}\n\t"
  84258. "ldr r2, [%[a]]\n\t"
  84259. "ldr r3, [%[a], #4]\n\t"
  84260. #ifdef WOLFSSL_KEIL
  84261. "sbcs r2, r2, r4\n\t"
  84262. #elif defined(__clang__)
  84263. "sbcs r2, r4\n\t"
  84264. #else
  84265. "sbc r2, r4\n\t"
  84266. #endif
  84267. #ifdef WOLFSSL_KEIL
  84268. "sbcs r3, r3, r5\n\t"
  84269. #elif defined(__clang__)
  84270. "sbcs r3, r5\n\t"
  84271. #else
  84272. "sbc r3, r5\n\t"
  84273. #endif
  84274. "stm %[a]!, {r2, r3}\n\t"
  84275. "ldm %[b]!, {r4, r5}\n\t"
  84276. "ldr r2, [%[a]]\n\t"
  84277. "ldr r3, [%[a], #4]\n\t"
  84278. #ifdef WOLFSSL_KEIL
  84279. "sbcs r2, r2, r4\n\t"
  84280. #elif defined(__clang__)
  84281. "sbcs r2, r4\n\t"
  84282. #else
  84283. "sbc r2, r4\n\t"
  84284. #endif
  84285. #ifdef WOLFSSL_KEIL
  84286. "sbcs r3, r3, r5\n\t"
  84287. #elif defined(__clang__)
  84288. "sbcs r3, r5\n\t"
  84289. #else
  84290. "sbc r3, r5\n\t"
  84291. #endif
  84292. "stm %[a]!, {r2, r3}\n\t"
  84293. "ldm %[b]!, {r4, r5}\n\t"
  84294. "ldr r2, [%[a]]\n\t"
  84295. "ldr r3, [%[a], #4]\n\t"
  84296. #ifdef WOLFSSL_KEIL
  84297. "sbcs r2, r2, r4\n\t"
  84298. #elif defined(__clang__)
  84299. "sbcs r2, r4\n\t"
  84300. #else
  84301. "sbc r2, r4\n\t"
  84302. #endif
  84303. #ifdef WOLFSSL_KEIL
  84304. "sbcs r3, r3, r5\n\t"
  84305. #elif defined(__clang__)
  84306. "sbcs r3, r5\n\t"
  84307. #else
  84308. "sbc r3, r5\n\t"
  84309. #endif
  84310. "stm %[a]!, {r2, r3}\n\t"
  84311. "ldm %[b]!, {r4, r5}\n\t"
  84312. "ldr r2, [%[a]]\n\t"
  84313. "ldr r3, [%[a], #4]\n\t"
  84314. #ifdef WOLFSSL_KEIL
  84315. "sbcs r2, r2, r4\n\t"
  84316. #elif defined(__clang__)
  84317. "sbcs r2, r4\n\t"
  84318. #else
  84319. "sbc r2, r4\n\t"
  84320. #endif
  84321. #ifdef WOLFSSL_KEIL
  84322. "sbcs r3, r3, r5\n\t"
  84323. #elif defined(__clang__)
  84324. "sbcs r3, r5\n\t"
  84325. #else
  84326. "sbc r3, r5\n\t"
  84327. #endif
  84328. "stm %[a]!, {r2, r3}\n\t"
  84329. "ldm %[b]!, {r4, r5}\n\t"
  84330. "ldr r2, [%[a]]\n\t"
  84331. "ldr r3, [%[a], #4]\n\t"
  84332. #ifdef WOLFSSL_KEIL
  84333. "sbcs r2, r2, r4\n\t"
  84334. #elif defined(__clang__)
  84335. "sbcs r2, r4\n\t"
  84336. #else
  84337. "sbc r2, r4\n\t"
  84338. #endif
  84339. #ifdef WOLFSSL_KEIL
  84340. "sbcs r3, r3, r5\n\t"
  84341. #elif defined(__clang__)
  84342. "sbcs r3, r5\n\t"
  84343. #else
  84344. "sbc r3, r5\n\t"
  84345. #endif
  84346. "stm %[a]!, {r2, r3}\n\t"
  84347. "ldm %[b]!, {r4, r5}\n\t"
  84348. "ldr r2, [%[a]]\n\t"
  84349. "ldr r3, [%[a], #4]\n\t"
  84350. #ifdef WOLFSSL_KEIL
  84351. "sbcs r2, r2, r4\n\t"
  84352. #elif defined(__clang__)
  84353. "sbcs r2, r4\n\t"
  84354. #else
  84355. "sbc r2, r4\n\t"
  84356. #endif
  84357. #ifdef WOLFSSL_KEIL
  84358. "sbcs r3, r3, r5\n\t"
  84359. #elif defined(__clang__)
  84360. "sbcs r3, r5\n\t"
  84361. #else
  84362. "sbc r3, r5\n\t"
  84363. #endif
  84364. "stm %[a]!, {r2, r3}\n\t"
  84365. "ldm %[b]!, {r4, r5}\n\t"
  84366. "ldr r2, [%[a]]\n\t"
  84367. "ldr r3, [%[a], #4]\n\t"
  84368. #ifdef WOLFSSL_KEIL
  84369. "sbcs r2, r2, r4\n\t"
  84370. #elif defined(__clang__)
  84371. "sbcs r2, r4\n\t"
  84372. #else
  84373. "sbc r2, r4\n\t"
  84374. #endif
  84375. #ifdef WOLFSSL_KEIL
  84376. "sbcs r3, r3, r5\n\t"
  84377. #elif defined(__clang__)
  84378. "sbcs r3, r5\n\t"
  84379. #else
  84380. "sbc r3, r5\n\t"
  84381. #endif
  84382. "stm %[a]!, {r2, r3}\n\t"
  84383. "ldm %[b]!, {r4, r5}\n\t"
  84384. "ldr r2, [%[a]]\n\t"
  84385. "ldr r3, [%[a], #4]\n\t"
  84386. #ifdef WOLFSSL_KEIL
  84387. "sbcs r2, r2, r4\n\t"
  84388. #elif defined(__clang__)
  84389. "sbcs r2, r4\n\t"
  84390. #else
  84391. "sbc r2, r4\n\t"
  84392. #endif
  84393. #ifdef WOLFSSL_KEIL
  84394. "sbcs r3, r3, r5\n\t"
  84395. #elif defined(__clang__)
  84396. "sbcs r3, r5\n\t"
  84397. #else
  84398. "sbc r3, r5\n\t"
  84399. #endif
  84400. "stm %[a]!, {r2, r3}\n\t"
  84401. "ldm %[b]!, {r4, r5}\n\t"
  84402. "ldr r2, [%[a]]\n\t"
  84403. "ldr r3, [%[a], #4]\n\t"
  84404. #ifdef WOLFSSL_KEIL
  84405. "sbcs r2, r2, r4\n\t"
  84406. #elif defined(__clang__)
  84407. "sbcs r2, r4\n\t"
  84408. #else
  84409. "sbc r2, r4\n\t"
  84410. #endif
  84411. #ifdef WOLFSSL_KEIL
  84412. "sbcs r3, r3, r5\n\t"
  84413. #elif defined(__clang__)
  84414. "sbcs r3, r5\n\t"
  84415. #else
  84416. "sbc r3, r5\n\t"
  84417. #endif
  84418. "stm %[a]!, {r2, r3}\n\t"
  84419. "ldm %[b]!, {r4, r5}\n\t"
  84420. "ldr r2, [%[a]]\n\t"
  84421. "ldr r3, [%[a], #4]\n\t"
  84422. #ifdef WOLFSSL_KEIL
  84423. "sbcs r2, r2, r4\n\t"
  84424. #elif defined(__clang__)
  84425. "sbcs r2, r4\n\t"
  84426. #else
  84427. "sbc r2, r4\n\t"
  84428. #endif
  84429. #ifdef WOLFSSL_KEIL
  84430. "sbcs r3, r3, r5\n\t"
  84431. #elif defined(__clang__)
  84432. "sbcs r3, r5\n\t"
  84433. #else
  84434. "sbc r3, r5\n\t"
  84435. #endif
  84436. "stm %[a]!, {r2, r3}\n\t"
  84437. "ldm %[b]!, {r4, r5}\n\t"
  84438. "ldr r2, [%[a]]\n\t"
  84439. "ldr r3, [%[a], #4]\n\t"
  84440. #ifdef WOLFSSL_KEIL
  84441. "sbcs r2, r2, r4\n\t"
  84442. #elif defined(__clang__)
  84443. "sbcs r2, r4\n\t"
  84444. #else
  84445. "sbc r2, r4\n\t"
  84446. #endif
  84447. #ifdef WOLFSSL_KEIL
  84448. "sbcs r3, r3, r5\n\t"
  84449. #elif defined(__clang__)
  84450. "sbcs r3, r5\n\t"
  84451. #else
  84452. "sbc r3, r5\n\t"
  84453. #endif
  84454. "stm %[a]!, {r2, r3}\n\t"
  84455. "ldm %[b]!, {r4, r5}\n\t"
  84456. "ldr r2, [%[a]]\n\t"
  84457. "ldr r3, [%[a], #4]\n\t"
  84458. #ifdef WOLFSSL_KEIL
  84459. "sbcs r2, r2, r4\n\t"
  84460. #elif defined(__clang__)
  84461. "sbcs r2, r4\n\t"
  84462. #else
  84463. "sbc r2, r4\n\t"
  84464. #endif
  84465. #ifdef WOLFSSL_KEIL
  84466. "sbcs r3, r3, r5\n\t"
  84467. #elif defined(__clang__)
  84468. "sbcs r3, r5\n\t"
  84469. #else
  84470. "sbc r3, r5\n\t"
  84471. #endif
  84472. "stm %[a]!, {r2, r3}\n\t"
  84473. "ldm %[b]!, {r4, r5}\n\t"
  84474. "ldr r2, [%[a]]\n\t"
  84475. "ldr r3, [%[a], #4]\n\t"
  84476. #ifdef WOLFSSL_KEIL
  84477. "sbcs r2, r2, r4\n\t"
  84478. #elif defined(__clang__)
  84479. "sbcs r2, r4\n\t"
  84480. #else
  84481. "sbc r2, r4\n\t"
  84482. #endif
  84483. #ifdef WOLFSSL_KEIL
  84484. "sbcs r3, r3, r5\n\t"
  84485. #elif defined(__clang__)
  84486. "sbcs r3, r5\n\t"
  84487. #else
  84488. "sbc r3, r5\n\t"
  84489. #endif
  84490. "stm %[a]!, {r2, r3}\n\t"
  84491. "ldm %[b]!, {r4, r5}\n\t"
  84492. "ldr r2, [%[a]]\n\t"
  84493. "ldr r3, [%[a], #4]\n\t"
  84494. #ifdef WOLFSSL_KEIL
  84495. "sbcs r2, r2, r4\n\t"
  84496. #elif defined(__clang__)
  84497. "sbcs r2, r4\n\t"
  84498. #else
  84499. "sbc r2, r4\n\t"
  84500. #endif
  84501. #ifdef WOLFSSL_KEIL
  84502. "sbcs r3, r3, r5\n\t"
  84503. #elif defined(__clang__)
  84504. "sbcs r3, r5\n\t"
  84505. #else
  84506. "sbc r3, r5\n\t"
  84507. #endif
  84508. "stm %[a]!, {r2, r3}\n\t"
  84509. "ldm %[b]!, {r4, r5}\n\t"
  84510. "ldr r2, [%[a]]\n\t"
  84511. "ldr r3, [%[a], #4]\n\t"
  84512. #ifdef WOLFSSL_KEIL
  84513. "sbcs r2, r2, r4\n\t"
  84514. #elif defined(__clang__)
  84515. "sbcs r2, r4\n\t"
  84516. #else
  84517. "sbc r2, r4\n\t"
  84518. #endif
  84519. #ifdef WOLFSSL_KEIL
  84520. "sbcs r3, r3, r5\n\t"
  84521. #elif defined(__clang__)
  84522. "sbcs r3, r5\n\t"
  84523. #else
  84524. "sbc r3, r5\n\t"
  84525. #endif
  84526. "stm %[a]!, {r2, r3}\n\t"
  84527. "ldm %[b]!, {r4, r5}\n\t"
  84528. "ldr r2, [%[a]]\n\t"
  84529. "ldr r3, [%[a], #4]\n\t"
  84530. #ifdef WOLFSSL_KEIL
  84531. "sbcs r2, r2, r4\n\t"
  84532. #elif defined(__clang__)
  84533. "sbcs r2, r4\n\t"
  84534. #else
  84535. "sbc r2, r4\n\t"
  84536. #endif
  84537. #ifdef WOLFSSL_KEIL
  84538. "sbcs r3, r3, r5\n\t"
  84539. #elif defined(__clang__)
  84540. "sbcs r3, r5\n\t"
  84541. #else
  84542. "sbc r3, r5\n\t"
  84543. #endif
  84544. "stm %[a]!, {r2, r3}\n\t"
  84545. "ldm %[b]!, {r4, r5}\n\t"
  84546. "ldr r2, [%[a]]\n\t"
  84547. "ldr r3, [%[a], #4]\n\t"
  84548. #ifdef WOLFSSL_KEIL
  84549. "sbcs r2, r2, r4\n\t"
  84550. #elif defined(__clang__)
  84551. "sbcs r2, r4\n\t"
  84552. #else
  84553. "sbc r2, r4\n\t"
  84554. #endif
  84555. #ifdef WOLFSSL_KEIL
  84556. "sbcs r3, r3, r5\n\t"
  84557. #elif defined(__clang__)
  84558. "sbcs r3, r5\n\t"
  84559. #else
  84560. "sbc r3, r5\n\t"
  84561. #endif
  84562. "stm %[a]!, {r2, r3}\n\t"
  84563. "ldm %[b]!, {r4, r5}\n\t"
  84564. "ldr r2, [%[a]]\n\t"
  84565. "ldr r3, [%[a], #4]\n\t"
  84566. #ifdef WOLFSSL_KEIL
  84567. "sbcs r2, r2, r4\n\t"
  84568. #elif defined(__clang__)
  84569. "sbcs r2, r4\n\t"
  84570. #else
  84571. "sbc r2, r4\n\t"
  84572. #endif
  84573. #ifdef WOLFSSL_KEIL
  84574. "sbcs r3, r3, r5\n\t"
  84575. #elif defined(__clang__)
  84576. "sbcs r3, r5\n\t"
  84577. #else
  84578. "sbc r3, r5\n\t"
  84579. #endif
  84580. "stm %[a]!, {r2, r3}\n\t"
  84581. "ldm %[b]!, {r4, r5}\n\t"
  84582. "ldr r2, [%[a]]\n\t"
  84583. "ldr r3, [%[a], #4]\n\t"
  84584. #ifdef WOLFSSL_KEIL
  84585. "sbcs r2, r2, r4\n\t"
  84586. #elif defined(__clang__)
  84587. "sbcs r2, r4\n\t"
  84588. #else
  84589. "sbc r2, r4\n\t"
  84590. #endif
  84591. #ifdef WOLFSSL_KEIL
  84592. "sbcs r3, r3, r5\n\t"
  84593. #elif defined(__clang__)
  84594. "sbcs r3, r5\n\t"
  84595. #else
  84596. "sbc r3, r5\n\t"
  84597. #endif
  84598. "stm %[a]!, {r2, r3}\n\t"
  84599. "ldm %[b]!, {r4, r5}\n\t"
  84600. "ldr r2, [%[a]]\n\t"
  84601. "ldr r3, [%[a], #4]\n\t"
  84602. #ifdef WOLFSSL_KEIL
  84603. "sbcs r2, r2, r4\n\t"
  84604. #elif defined(__clang__)
  84605. "sbcs r2, r4\n\t"
  84606. #else
  84607. "sbc r2, r4\n\t"
  84608. #endif
  84609. #ifdef WOLFSSL_KEIL
  84610. "sbcs r3, r3, r5\n\t"
  84611. #elif defined(__clang__)
  84612. "sbcs r3, r5\n\t"
  84613. #else
  84614. "sbc r3, r5\n\t"
  84615. #endif
  84616. "stm %[a]!, {r2, r3}\n\t"
  84617. "ldm %[b]!, {r4, r5}\n\t"
  84618. "ldr r2, [%[a]]\n\t"
  84619. "ldr r3, [%[a], #4]\n\t"
  84620. #ifdef WOLFSSL_KEIL
  84621. "sbcs r2, r2, r4\n\t"
  84622. #elif defined(__clang__)
  84623. "sbcs r2, r4\n\t"
  84624. #else
  84625. "sbc r2, r4\n\t"
  84626. #endif
  84627. #ifdef WOLFSSL_KEIL
  84628. "sbcs r3, r3, r5\n\t"
  84629. #elif defined(__clang__)
  84630. "sbcs r3, r5\n\t"
  84631. #else
  84632. "sbc r3, r5\n\t"
  84633. #endif
  84634. "stm %[a]!, {r2, r3}\n\t"
  84635. #ifdef WOLFSSL_KEIL
  84636. "sbcs %[a], %[a], %[a]\n\t"
  84637. #elif defined(__clang__)
  84638. "sbcs %[a], %[a]\n\t"
  84639. #else
  84640. "sbc %[a], %[a]\n\t"
  84641. #endif
  84642. : [a] "+l" (a), [b] "+l" (b)
  84643. :
  84644. : "memory", "r2", "r3", "r4", "r5"
  84645. );
  84646. return (uint32_t)(size_t)a;
  84647. }
  84648. /* Add b to a into r. (r = a + b)
  84649. *
  84650. * r A single precision integer.
  84651. * a A single precision integer.
  84652. * b A single precision integer.
  84653. */
  84654. SP_NOINLINE static sp_digit sp_4096_add_128(sp_digit* r, const sp_digit* a,
  84655. const sp_digit* b)
  84656. {
  84657. __asm__ __volatile__ (
  84658. "ldm %[b]!, {r5, r6}\n\t"
  84659. "ldm %[a]!, {r3, r4}\n\t"
  84660. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  84661. "adds r3, r3, r5\n\t"
  84662. #else
  84663. "add r3, r3, r5\n\t"
  84664. #endif
  84665. #ifdef WOLFSSL_KEIL
  84666. "adcs r4, r4, r6\n\t"
  84667. #elif defined(__clang__)
  84668. "adcs r4, r6\n\t"
  84669. #else
  84670. "adc r4, r6\n\t"
  84671. #endif
  84672. "stm %[r]!, {r3, r4}\n\t"
  84673. "ldm %[b]!, {r5, r6}\n\t"
  84674. "ldm %[a]!, {r3, r4}\n\t"
  84675. #ifdef WOLFSSL_KEIL
  84676. "adcs r3, r3, r5\n\t"
  84677. #elif defined(__clang__)
  84678. "adcs r3, r5\n\t"
  84679. #else
  84680. "adc r3, r5\n\t"
  84681. #endif
  84682. #ifdef WOLFSSL_KEIL
  84683. "adcs r4, r4, r6\n\t"
  84684. #elif defined(__clang__)
  84685. "adcs r4, r6\n\t"
  84686. #else
  84687. "adc r4, r6\n\t"
  84688. #endif
  84689. "stm %[r]!, {r3, r4}\n\t"
  84690. "ldm %[b]!, {r5, r6}\n\t"
  84691. "ldm %[a]!, {r3, r4}\n\t"
  84692. #ifdef WOLFSSL_KEIL
  84693. "adcs r3, r3, r5\n\t"
  84694. #elif defined(__clang__)
  84695. "adcs r3, r5\n\t"
  84696. #else
  84697. "adc r3, r5\n\t"
  84698. #endif
  84699. #ifdef WOLFSSL_KEIL
  84700. "adcs r4, r4, r6\n\t"
  84701. #elif defined(__clang__)
  84702. "adcs r4, r6\n\t"
  84703. #else
  84704. "adc r4, r6\n\t"
  84705. #endif
  84706. "stm %[r]!, {r3, r4}\n\t"
  84707. "ldm %[b]!, {r5, r6}\n\t"
  84708. "ldm %[a]!, {r3, r4}\n\t"
  84709. #ifdef WOLFSSL_KEIL
  84710. "adcs r3, r3, r5\n\t"
  84711. #elif defined(__clang__)
  84712. "adcs r3, r5\n\t"
  84713. #else
  84714. "adc r3, r5\n\t"
  84715. #endif
  84716. #ifdef WOLFSSL_KEIL
  84717. "adcs r4, r4, r6\n\t"
  84718. #elif defined(__clang__)
  84719. "adcs r4, r6\n\t"
  84720. #else
  84721. "adc r4, r6\n\t"
  84722. #endif
  84723. "stm %[r]!, {r3, r4}\n\t"
  84724. "ldm %[b]!, {r5, r6}\n\t"
  84725. "ldm %[a]!, {r3, r4}\n\t"
  84726. #ifdef WOLFSSL_KEIL
  84727. "adcs r3, r3, r5\n\t"
  84728. #elif defined(__clang__)
  84729. "adcs r3, r5\n\t"
  84730. #else
  84731. "adc r3, r5\n\t"
  84732. #endif
  84733. #ifdef WOLFSSL_KEIL
  84734. "adcs r4, r4, r6\n\t"
  84735. #elif defined(__clang__)
  84736. "adcs r4, r6\n\t"
  84737. #else
  84738. "adc r4, r6\n\t"
  84739. #endif
  84740. "stm %[r]!, {r3, r4}\n\t"
  84741. "ldm %[b]!, {r5, r6}\n\t"
  84742. "ldm %[a]!, {r3, r4}\n\t"
  84743. #ifdef WOLFSSL_KEIL
  84744. "adcs r3, r3, r5\n\t"
  84745. #elif defined(__clang__)
  84746. "adcs r3, r5\n\t"
  84747. #else
  84748. "adc r3, r5\n\t"
  84749. #endif
  84750. #ifdef WOLFSSL_KEIL
  84751. "adcs r4, r4, r6\n\t"
  84752. #elif defined(__clang__)
  84753. "adcs r4, r6\n\t"
  84754. #else
  84755. "adc r4, r6\n\t"
  84756. #endif
  84757. "stm %[r]!, {r3, r4}\n\t"
  84758. "ldm %[b]!, {r5, r6}\n\t"
  84759. "ldm %[a]!, {r3, r4}\n\t"
  84760. #ifdef WOLFSSL_KEIL
  84761. "adcs r3, r3, r5\n\t"
  84762. #elif defined(__clang__)
  84763. "adcs r3, r5\n\t"
  84764. #else
  84765. "adc r3, r5\n\t"
  84766. #endif
  84767. #ifdef WOLFSSL_KEIL
  84768. "adcs r4, r4, r6\n\t"
  84769. #elif defined(__clang__)
  84770. "adcs r4, r6\n\t"
  84771. #else
  84772. "adc r4, r6\n\t"
  84773. #endif
  84774. "stm %[r]!, {r3, r4}\n\t"
  84775. "ldm %[b]!, {r5, r6}\n\t"
  84776. "ldm %[a]!, {r3, r4}\n\t"
  84777. #ifdef WOLFSSL_KEIL
  84778. "adcs r3, r3, r5\n\t"
  84779. #elif defined(__clang__)
  84780. "adcs r3, r5\n\t"
  84781. #else
  84782. "adc r3, r5\n\t"
  84783. #endif
  84784. #ifdef WOLFSSL_KEIL
  84785. "adcs r4, r4, r6\n\t"
  84786. #elif defined(__clang__)
  84787. "adcs r4, r6\n\t"
  84788. #else
  84789. "adc r4, r6\n\t"
  84790. #endif
  84791. "stm %[r]!, {r3, r4}\n\t"
  84792. "ldm %[b]!, {r5, r6}\n\t"
  84793. "ldm %[a]!, {r3, r4}\n\t"
  84794. #ifdef WOLFSSL_KEIL
  84795. "adcs r3, r3, r5\n\t"
  84796. #elif defined(__clang__)
  84797. "adcs r3, r5\n\t"
  84798. #else
  84799. "adc r3, r5\n\t"
  84800. #endif
  84801. #ifdef WOLFSSL_KEIL
  84802. "adcs r4, r4, r6\n\t"
  84803. #elif defined(__clang__)
  84804. "adcs r4, r6\n\t"
  84805. #else
  84806. "adc r4, r6\n\t"
  84807. #endif
  84808. "stm %[r]!, {r3, r4}\n\t"
  84809. "ldm %[b]!, {r5, r6}\n\t"
  84810. "ldm %[a]!, {r3, r4}\n\t"
  84811. #ifdef WOLFSSL_KEIL
  84812. "adcs r3, r3, r5\n\t"
  84813. #elif defined(__clang__)
  84814. "adcs r3, r5\n\t"
  84815. #else
  84816. "adc r3, r5\n\t"
  84817. #endif
  84818. #ifdef WOLFSSL_KEIL
  84819. "adcs r4, r4, r6\n\t"
  84820. #elif defined(__clang__)
  84821. "adcs r4, r6\n\t"
  84822. #else
  84823. "adc r4, r6\n\t"
  84824. #endif
  84825. "stm %[r]!, {r3, r4}\n\t"
  84826. "ldm %[b]!, {r5, r6}\n\t"
  84827. "ldm %[a]!, {r3, r4}\n\t"
  84828. #ifdef WOLFSSL_KEIL
  84829. "adcs r3, r3, r5\n\t"
  84830. #elif defined(__clang__)
  84831. "adcs r3, r5\n\t"
  84832. #else
  84833. "adc r3, r5\n\t"
  84834. #endif
  84835. #ifdef WOLFSSL_KEIL
  84836. "adcs r4, r4, r6\n\t"
  84837. #elif defined(__clang__)
  84838. "adcs r4, r6\n\t"
  84839. #else
  84840. "adc r4, r6\n\t"
  84841. #endif
  84842. "stm %[r]!, {r3, r4}\n\t"
  84843. "ldm %[b]!, {r5, r6}\n\t"
  84844. "ldm %[a]!, {r3, r4}\n\t"
  84845. #ifdef WOLFSSL_KEIL
  84846. "adcs r3, r3, r5\n\t"
  84847. #elif defined(__clang__)
  84848. "adcs r3, r5\n\t"
  84849. #else
  84850. "adc r3, r5\n\t"
  84851. #endif
  84852. #ifdef WOLFSSL_KEIL
  84853. "adcs r4, r4, r6\n\t"
  84854. #elif defined(__clang__)
  84855. "adcs r4, r6\n\t"
  84856. #else
  84857. "adc r4, r6\n\t"
  84858. #endif
  84859. "stm %[r]!, {r3, r4}\n\t"
  84860. "ldm %[b]!, {r5, r6}\n\t"
  84861. "ldm %[a]!, {r3, r4}\n\t"
  84862. #ifdef WOLFSSL_KEIL
  84863. "adcs r3, r3, r5\n\t"
  84864. #elif defined(__clang__)
  84865. "adcs r3, r5\n\t"
  84866. #else
  84867. "adc r3, r5\n\t"
  84868. #endif
  84869. #ifdef WOLFSSL_KEIL
  84870. "adcs r4, r4, r6\n\t"
  84871. #elif defined(__clang__)
  84872. "adcs r4, r6\n\t"
  84873. #else
  84874. "adc r4, r6\n\t"
  84875. #endif
  84876. "stm %[r]!, {r3, r4}\n\t"
  84877. "ldm %[b]!, {r5, r6}\n\t"
  84878. "ldm %[a]!, {r3, r4}\n\t"
  84879. #ifdef WOLFSSL_KEIL
  84880. "adcs r3, r3, r5\n\t"
  84881. #elif defined(__clang__)
  84882. "adcs r3, r5\n\t"
  84883. #else
  84884. "adc r3, r5\n\t"
  84885. #endif
  84886. #ifdef WOLFSSL_KEIL
  84887. "adcs r4, r4, r6\n\t"
  84888. #elif defined(__clang__)
  84889. "adcs r4, r6\n\t"
  84890. #else
  84891. "adc r4, r6\n\t"
  84892. #endif
  84893. "stm %[r]!, {r3, r4}\n\t"
  84894. "ldm %[b]!, {r5, r6}\n\t"
  84895. "ldm %[a]!, {r3, r4}\n\t"
  84896. #ifdef WOLFSSL_KEIL
  84897. "adcs r3, r3, r5\n\t"
  84898. #elif defined(__clang__)
  84899. "adcs r3, r5\n\t"
  84900. #else
  84901. "adc r3, r5\n\t"
  84902. #endif
  84903. #ifdef WOLFSSL_KEIL
  84904. "adcs r4, r4, r6\n\t"
  84905. #elif defined(__clang__)
  84906. "adcs r4, r6\n\t"
  84907. #else
  84908. "adc r4, r6\n\t"
  84909. #endif
  84910. "stm %[r]!, {r3, r4}\n\t"
  84911. "ldm %[b]!, {r5, r6}\n\t"
  84912. "ldm %[a]!, {r3, r4}\n\t"
  84913. #ifdef WOLFSSL_KEIL
  84914. "adcs r3, r3, r5\n\t"
  84915. #elif defined(__clang__)
  84916. "adcs r3, r5\n\t"
  84917. #else
  84918. "adc r3, r5\n\t"
  84919. #endif
  84920. #ifdef WOLFSSL_KEIL
  84921. "adcs r4, r4, r6\n\t"
  84922. #elif defined(__clang__)
  84923. "adcs r4, r6\n\t"
  84924. #else
  84925. "adc r4, r6\n\t"
  84926. #endif
  84927. "stm %[r]!, {r3, r4}\n\t"
  84928. "ldm %[b]!, {r5, r6}\n\t"
  84929. "ldm %[a]!, {r3, r4}\n\t"
  84930. #ifdef WOLFSSL_KEIL
  84931. "adcs r3, r3, r5\n\t"
  84932. #elif defined(__clang__)
  84933. "adcs r3, r5\n\t"
  84934. #else
  84935. "adc r3, r5\n\t"
  84936. #endif
  84937. #ifdef WOLFSSL_KEIL
  84938. "adcs r4, r4, r6\n\t"
  84939. #elif defined(__clang__)
  84940. "adcs r4, r6\n\t"
  84941. #else
  84942. "adc r4, r6\n\t"
  84943. #endif
  84944. "stm %[r]!, {r3, r4}\n\t"
  84945. "ldm %[b]!, {r5, r6}\n\t"
  84946. "ldm %[a]!, {r3, r4}\n\t"
  84947. #ifdef WOLFSSL_KEIL
  84948. "adcs r3, r3, r5\n\t"
  84949. #elif defined(__clang__)
  84950. "adcs r3, r5\n\t"
  84951. #else
  84952. "adc r3, r5\n\t"
  84953. #endif
  84954. #ifdef WOLFSSL_KEIL
  84955. "adcs r4, r4, r6\n\t"
  84956. #elif defined(__clang__)
  84957. "adcs r4, r6\n\t"
  84958. #else
  84959. "adc r4, r6\n\t"
  84960. #endif
  84961. "stm %[r]!, {r3, r4}\n\t"
  84962. "ldm %[b]!, {r5, r6}\n\t"
  84963. "ldm %[a]!, {r3, r4}\n\t"
  84964. #ifdef WOLFSSL_KEIL
  84965. "adcs r3, r3, r5\n\t"
  84966. #elif defined(__clang__)
  84967. "adcs r3, r5\n\t"
  84968. #else
  84969. "adc r3, r5\n\t"
  84970. #endif
  84971. #ifdef WOLFSSL_KEIL
  84972. "adcs r4, r4, r6\n\t"
  84973. #elif defined(__clang__)
  84974. "adcs r4, r6\n\t"
  84975. #else
  84976. "adc r4, r6\n\t"
  84977. #endif
  84978. "stm %[r]!, {r3, r4}\n\t"
  84979. "ldm %[b]!, {r5, r6}\n\t"
  84980. "ldm %[a]!, {r3, r4}\n\t"
  84981. #ifdef WOLFSSL_KEIL
  84982. "adcs r3, r3, r5\n\t"
  84983. #elif defined(__clang__)
  84984. "adcs r3, r5\n\t"
  84985. #else
  84986. "adc r3, r5\n\t"
  84987. #endif
  84988. #ifdef WOLFSSL_KEIL
  84989. "adcs r4, r4, r6\n\t"
  84990. #elif defined(__clang__)
  84991. "adcs r4, r6\n\t"
  84992. #else
  84993. "adc r4, r6\n\t"
  84994. #endif
  84995. "stm %[r]!, {r3, r4}\n\t"
  84996. "ldm %[b]!, {r5, r6}\n\t"
  84997. "ldm %[a]!, {r3, r4}\n\t"
  84998. #ifdef WOLFSSL_KEIL
  84999. "adcs r3, r3, r5\n\t"
  85000. #elif defined(__clang__)
  85001. "adcs r3, r5\n\t"
  85002. #else
  85003. "adc r3, r5\n\t"
  85004. #endif
  85005. #ifdef WOLFSSL_KEIL
  85006. "adcs r4, r4, r6\n\t"
  85007. #elif defined(__clang__)
  85008. "adcs r4, r6\n\t"
  85009. #else
  85010. "adc r4, r6\n\t"
  85011. #endif
  85012. "stm %[r]!, {r3, r4}\n\t"
  85013. "ldm %[b]!, {r5, r6}\n\t"
  85014. "ldm %[a]!, {r3, r4}\n\t"
  85015. #ifdef WOLFSSL_KEIL
  85016. "adcs r3, r3, r5\n\t"
  85017. #elif defined(__clang__)
  85018. "adcs r3, r5\n\t"
  85019. #else
  85020. "adc r3, r5\n\t"
  85021. #endif
  85022. #ifdef WOLFSSL_KEIL
  85023. "adcs r4, r4, r6\n\t"
  85024. #elif defined(__clang__)
  85025. "adcs r4, r6\n\t"
  85026. #else
  85027. "adc r4, r6\n\t"
  85028. #endif
  85029. "stm %[r]!, {r3, r4}\n\t"
  85030. "ldm %[b]!, {r5, r6}\n\t"
  85031. "ldm %[a]!, {r3, r4}\n\t"
  85032. #ifdef WOLFSSL_KEIL
  85033. "adcs r3, r3, r5\n\t"
  85034. #elif defined(__clang__)
  85035. "adcs r3, r5\n\t"
  85036. #else
  85037. "adc r3, r5\n\t"
  85038. #endif
  85039. #ifdef WOLFSSL_KEIL
  85040. "adcs r4, r4, r6\n\t"
  85041. #elif defined(__clang__)
  85042. "adcs r4, r6\n\t"
  85043. #else
  85044. "adc r4, r6\n\t"
  85045. #endif
  85046. "stm %[r]!, {r3, r4}\n\t"
  85047. "ldm %[b]!, {r5, r6}\n\t"
  85048. "ldm %[a]!, {r3, r4}\n\t"
  85049. #ifdef WOLFSSL_KEIL
  85050. "adcs r3, r3, r5\n\t"
  85051. #elif defined(__clang__)
  85052. "adcs r3, r5\n\t"
  85053. #else
  85054. "adc r3, r5\n\t"
  85055. #endif
  85056. #ifdef WOLFSSL_KEIL
  85057. "adcs r4, r4, r6\n\t"
  85058. #elif defined(__clang__)
  85059. "adcs r4, r6\n\t"
  85060. #else
  85061. "adc r4, r6\n\t"
  85062. #endif
  85063. "stm %[r]!, {r3, r4}\n\t"
  85064. "ldm %[b]!, {r5, r6}\n\t"
  85065. "ldm %[a]!, {r3, r4}\n\t"
  85066. #ifdef WOLFSSL_KEIL
  85067. "adcs r3, r3, r5\n\t"
  85068. #elif defined(__clang__)
  85069. "adcs r3, r5\n\t"
  85070. #else
  85071. "adc r3, r5\n\t"
  85072. #endif
  85073. #ifdef WOLFSSL_KEIL
  85074. "adcs r4, r4, r6\n\t"
  85075. #elif defined(__clang__)
  85076. "adcs r4, r6\n\t"
  85077. #else
  85078. "adc r4, r6\n\t"
  85079. #endif
  85080. "stm %[r]!, {r3, r4}\n\t"
  85081. "ldm %[b]!, {r5, r6}\n\t"
  85082. "ldm %[a]!, {r3, r4}\n\t"
  85083. #ifdef WOLFSSL_KEIL
  85084. "adcs r3, r3, r5\n\t"
  85085. #elif defined(__clang__)
  85086. "adcs r3, r5\n\t"
  85087. #else
  85088. "adc r3, r5\n\t"
  85089. #endif
  85090. #ifdef WOLFSSL_KEIL
  85091. "adcs r4, r4, r6\n\t"
  85092. #elif defined(__clang__)
  85093. "adcs r4, r6\n\t"
  85094. #else
  85095. "adc r4, r6\n\t"
  85096. #endif
  85097. "stm %[r]!, {r3, r4}\n\t"
  85098. "ldm %[b]!, {r5, r6}\n\t"
  85099. "ldm %[a]!, {r3, r4}\n\t"
  85100. #ifdef WOLFSSL_KEIL
  85101. "adcs r3, r3, r5\n\t"
  85102. #elif defined(__clang__)
  85103. "adcs r3, r5\n\t"
  85104. #else
  85105. "adc r3, r5\n\t"
  85106. #endif
  85107. #ifdef WOLFSSL_KEIL
  85108. "adcs r4, r4, r6\n\t"
  85109. #elif defined(__clang__)
  85110. "adcs r4, r6\n\t"
  85111. #else
  85112. "adc r4, r6\n\t"
  85113. #endif
  85114. "stm %[r]!, {r3, r4}\n\t"
  85115. "ldm %[b]!, {r5, r6}\n\t"
  85116. "ldm %[a]!, {r3, r4}\n\t"
  85117. #ifdef WOLFSSL_KEIL
  85118. "adcs r3, r3, r5\n\t"
  85119. #elif defined(__clang__)
  85120. "adcs r3, r5\n\t"
  85121. #else
  85122. "adc r3, r5\n\t"
  85123. #endif
  85124. #ifdef WOLFSSL_KEIL
  85125. "adcs r4, r4, r6\n\t"
  85126. #elif defined(__clang__)
  85127. "adcs r4, r6\n\t"
  85128. #else
  85129. "adc r4, r6\n\t"
  85130. #endif
  85131. "stm %[r]!, {r3, r4}\n\t"
  85132. "ldm %[b]!, {r5, r6}\n\t"
  85133. "ldm %[a]!, {r3, r4}\n\t"
  85134. #ifdef WOLFSSL_KEIL
  85135. "adcs r3, r3, r5\n\t"
  85136. #elif defined(__clang__)
  85137. "adcs r3, r5\n\t"
  85138. #else
  85139. "adc r3, r5\n\t"
  85140. #endif
  85141. #ifdef WOLFSSL_KEIL
  85142. "adcs r4, r4, r6\n\t"
  85143. #elif defined(__clang__)
  85144. "adcs r4, r6\n\t"
  85145. #else
  85146. "adc r4, r6\n\t"
  85147. #endif
  85148. "stm %[r]!, {r3, r4}\n\t"
  85149. "ldm %[b]!, {r5, r6}\n\t"
  85150. "ldm %[a]!, {r3, r4}\n\t"
  85151. #ifdef WOLFSSL_KEIL
  85152. "adcs r3, r3, r5\n\t"
  85153. #elif defined(__clang__)
  85154. "adcs r3, r5\n\t"
  85155. #else
  85156. "adc r3, r5\n\t"
  85157. #endif
  85158. #ifdef WOLFSSL_KEIL
  85159. "adcs r4, r4, r6\n\t"
  85160. #elif defined(__clang__)
  85161. "adcs r4, r6\n\t"
  85162. #else
  85163. "adc r4, r6\n\t"
  85164. #endif
  85165. "stm %[r]!, {r3, r4}\n\t"
  85166. "ldm %[b]!, {r5, r6}\n\t"
  85167. "ldm %[a]!, {r3, r4}\n\t"
  85168. #ifdef WOLFSSL_KEIL
  85169. "adcs r3, r3, r5\n\t"
  85170. #elif defined(__clang__)
  85171. "adcs r3, r5\n\t"
  85172. #else
  85173. "adc r3, r5\n\t"
  85174. #endif
  85175. #ifdef WOLFSSL_KEIL
  85176. "adcs r4, r4, r6\n\t"
  85177. #elif defined(__clang__)
  85178. "adcs r4, r6\n\t"
  85179. #else
  85180. "adc r4, r6\n\t"
  85181. #endif
  85182. "stm %[r]!, {r3, r4}\n\t"
  85183. "ldm %[b]!, {r5, r6}\n\t"
  85184. "ldm %[a]!, {r3, r4}\n\t"
  85185. #ifdef WOLFSSL_KEIL
  85186. "adcs r3, r3, r5\n\t"
  85187. #elif defined(__clang__)
  85188. "adcs r3, r5\n\t"
  85189. #else
  85190. "adc r3, r5\n\t"
  85191. #endif
  85192. #ifdef WOLFSSL_KEIL
  85193. "adcs r4, r4, r6\n\t"
  85194. #elif defined(__clang__)
  85195. "adcs r4, r6\n\t"
  85196. #else
  85197. "adc r4, r6\n\t"
  85198. #endif
  85199. "stm %[r]!, {r3, r4}\n\t"
  85200. "ldm %[b]!, {r5, r6}\n\t"
  85201. "ldm %[a]!, {r3, r4}\n\t"
  85202. #ifdef WOLFSSL_KEIL
  85203. "adcs r3, r3, r5\n\t"
  85204. #elif defined(__clang__)
  85205. "adcs r3, r5\n\t"
  85206. #else
  85207. "adc r3, r5\n\t"
  85208. #endif
  85209. #ifdef WOLFSSL_KEIL
  85210. "adcs r4, r4, r6\n\t"
  85211. #elif defined(__clang__)
  85212. "adcs r4, r6\n\t"
  85213. #else
  85214. "adc r4, r6\n\t"
  85215. #endif
  85216. "stm %[r]!, {r3, r4}\n\t"
  85217. "ldm %[b]!, {r5, r6}\n\t"
  85218. "ldm %[a]!, {r3, r4}\n\t"
  85219. #ifdef WOLFSSL_KEIL
  85220. "adcs r3, r3, r5\n\t"
  85221. #elif defined(__clang__)
  85222. "adcs r3, r5\n\t"
  85223. #else
  85224. "adc r3, r5\n\t"
  85225. #endif
  85226. #ifdef WOLFSSL_KEIL
  85227. "adcs r4, r4, r6\n\t"
  85228. #elif defined(__clang__)
  85229. "adcs r4, r6\n\t"
  85230. #else
  85231. "adc r4, r6\n\t"
  85232. #endif
  85233. "stm %[r]!, {r3, r4}\n\t"
  85234. "ldm %[b]!, {r5, r6}\n\t"
  85235. "ldm %[a]!, {r3, r4}\n\t"
  85236. #ifdef WOLFSSL_KEIL
  85237. "adcs r3, r3, r5\n\t"
  85238. #elif defined(__clang__)
  85239. "adcs r3, r5\n\t"
  85240. #else
  85241. "adc r3, r5\n\t"
  85242. #endif
  85243. #ifdef WOLFSSL_KEIL
  85244. "adcs r4, r4, r6\n\t"
  85245. #elif defined(__clang__)
  85246. "adcs r4, r6\n\t"
  85247. #else
  85248. "adc r4, r6\n\t"
  85249. #endif
  85250. "stm %[r]!, {r3, r4}\n\t"
  85251. "ldm %[b]!, {r5, r6}\n\t"
  85252. "ldm %[a]!, {r3, r4}\n\t"
  85253. #ifdef WOLFSSL_KEIL
  85254. "adcs r3, r3, r5\n\t"
  85255. #elif defined(__clang__)
  85256. "adcs r3, r5\n\t"
  85257. #else
  85258. "adc r3, r5\n\t"
  85259. #endif
  85260. #ifdef WOLFSSL_KEIL
  85261. "adcs r4, r4, r6\n\t"
  85262. #elif defined(__clang__)
  85263. "adcs r4, r6\n\t"
  85264. #else
  85265. "adc r4, r6\n\t"
  85266. #endif
  85267. "stm %[r]!, {r3, r4}\n\t"
  85268. "ldm %[b]!, {r5, r6}\n\t"
  85269. "ldm %[a]!, {r3, r4}\n\t"
  85270. #ifdef WOLFSSL_KEIL
  85271. "adcs r3, r3, r5\n\t"
  85272. #elif defined(__clang__)
  85273. "adcs r3, r5\n\t"
  85274. #else
  85275. "adc r3, r5\n\t"
  85276. #endif
  85277. #ifdef WOLFSSL_KEIL
  85278. "adcs r4, r4, r6\n\t"
  85279. #elif defined(__clang__)
  85280. "adcs r4, r6\n\t"
  85281. #else
  85282. "adc r4, r6\n\t"
  85283. #endif
  85284. "stm %[r]!, {r3, r4}\n\t"
  85285. "ldm %[b]!, {r5, r6}\n\t"
  85286. "ldm %[a]!, {r3, r4}\n\t"
  85287. #ifdef WOLFSSL_KEIL
  85288. "adcs r3, r3, r5\n\t"
  85289. #elif defined(__clang__)
  85290. "adcs r3, r5\n\t"
  85291. #else
  85292. "adc r3, r5\n\t"
  85293. #endif
  85294. #ifdef WOLFSSL_KEIL
  85295. "adcs r4, r4, r6\n\t"
  85296. #elif defined(__clang__)
  85297. "adcs r4, r6\n\t"
  85298. #else
  85299. "adc r4, r6\n\t"
  85300. #endif
  85301. "stm %[r]!, {r3, r4}\n\t"
  85302. "ldm %[b]!, {r5, r6}\n\t"
  85303. "ldm %[a]!, {r3, r4}\n\t"
  85304. #ifdef WOLFSSL_KEIL
  85305. "adcs r3, r3, r5\n\t"
  85306. #elif defined(__clang__)
  85307. "adcs r3, r5\n\t"
  85308. #else
  85309. "adc r3, r5\n\t"
  85310. #endif
  85311. #ifdef WOLFSSL_KEIL
  85312. "adcs r4, r4, r6\n\t"
  85313. #elif defined(__clang__)
  85314. "adcs r4, r6\n\t"
  85315. #else
  85316. "adc r4, r6\n\t"
  85317. #endif
  85318. "stm %[r]!, {r3, r4}\n\t"
  85319. "ldm %[b]!, {r5, r6}\n\t"
  85320. "ldm %[a]!, {r3, r4}\n\t"
  85321. #ifdef WOLFSSL_KEIL
  85322. "adcs r3, r3, r5\n\t"
  85323. #elif defined(__clang__)
  85324. "adcs r3, r5\n\t"
  85325. #else
  85326. "adc r3, r5\n\t"
  85327. #endif
  85328. #ifdef WOLFSSL_KEIL
  85329. "adcs r4, r4, r6\n\t"
  85330. #elif defined(__clang__)
  85331. "adcs r4, r6\n\t"
  85332. #else
  85333. "adc r4, r6\n\t"
  85334. #endif
  85335. "stm %[r]!, {r3, r4}\n\t"
  85336. "ldm %[b]!, {r5, r6}\n\t"
  85337. "ldm %[a]!, {r3, r4}\n\t"
  85338. #ifdef WOLFSSL_KEIL
  85339. "adcs r3, r3, r5\n\t"
  85340. #elif defined(__clang__)
  85341. "adcs r3, r5\n\t"
  85342. #else
  85343. "adc r3, r5\n\t"
  85344. #endif
  85345. #ifdef WOLFSSL_KEIL
  85346. "adcs r4, r4, r6\n\t"
  85347. #elif defined(__clang__)
  85348. "adcs r4, r6\n\t"
  85349. #else
  85350. "adc r4, r6\n\t"
  85351. #endif
  85352. "stm %[r]!, {r3, r4}\n\t"
  85353. "ldm %[b]!, {r5, r6}\n\t"
  85354. "ldm %[a]!, {r3, r4}\n\t"
  85355. #ifdef WOLFSSL_KEIL
  85356. "adcs r3, r3, r5\n\t"
  85357. #elif defined(__clang__)
  85358. "adcs r3, r5\n\t"
  85359. #else
  85360. "adc r3, r5\n\t"
  85361. #endif
  85362. #ifdef WOLFSSL_KEIL
  85363. "adcs r4, r4, r6\n\t"
  85364. #elif defined(__clang__)
  85365. "adcs r4, r6\n\t"
  85366. #else
  85367. "adc r4, r6\n\t"
  85368. #endif
  85369. "stm %[r]!, {r3, r4}\n\t"
  85370. "ldm %[b]!, {r5, r6}\n\t"
  85371. "ldm %[a]!, {r3, r4}\n\t"
  85372. #ifdef WOLFSSL_KEIL
  85373. "adcs r3, r3, r5\n\t"
  85374. #elif defined(__clang__)
  85375. "adcs r3, r5\n\t"
  85376. #else
  85377. "adc r3, r5\n\t"
  85378. #endif
  85379. #ifdef WOLFSSL_KEIL
  85380. "adcs r4, r4, r6\n\t"
  85381. #elif defined(__clang__)
  85382. "adcs r4, r6\n\t"
  85383. #else
  85384. "adc r4, r6\n\t"
  85385. #endif
  85386. "stm %[r]!, {r3, r4}\n\t"
  85387. "ldm %[b]!, {r5, r6}\n\t"
  85388. "ldm %[a]!, {r3, r4}\n\t"
  85389. #ifdef WOLFSSL_KEIL
  85390. "adcs r3, r3, r5\n\t"
  85391. #elif defined(__clang__)
  85392. "adcs r3, r5\n\t"
  85393. #else
  85394. "adc r3, r5\n\t"
  85395. #endif
  85396. #ifdef WOLFSSL_KEIL
  85397. "adcs r4, r4, r6\n\t"
  85398. #elif defined(__clang__)
  85399. "adcs r4, r6\n\t"
  85400. #else
  85401. "adc r4, r6\n\t"
  85402. #endif
  85403. "stm %[r]!, {r3, r4}\n\t"
  85404. "ldm %[b]!, {r5, r6}\n\t"
  85405. "ldm %[a]!, {r3, r4}\n\t"
  85406. #ifdef WOLFSSL_KEIL
  85407. "adcs r3, r3, r5\n\t"
  85408. #elif defined(__clang__)
  85409. "adcs r3, r5\n\t"
  85410. #else
  85411. "adc r3, r5\n\t"
  85412. #endif
  85413. #ifdef WOLFSSL_KEIL
  85414. "adcs r4, r4, r6\n\t"
  85415. #elif defined(__clang__)
  85416. "adcs r4, r6\n\t"
  85417. #else
  85418. "adc r4, r6\n\t"
  85419. #endif
  85420. "stm %[r]!, {r3, r4}\n\t"
  85421. "ldm %[b]!, {r5, r6}\n\t"
  85422. "ldm %[a]!, {r3, r4}\n\t"
  85423. #ifdef WOLFSSL_KEIL
  85424. "adcs r3, r3, r5\n\t"
  85425. #elif defined(__clang__)
  85426. "adcs r3, r5\n\t"
  85427. #else
  85428. "adc r3, r5\n\t"
  85429. #endif
  85430. #ifdef WOLFSSL_KEIL
  85431. "adcs r4, r4, r6\n\t"
  85432. #elif defined(__clang__)
  85433. "adcs r4, r6\n\t"
  85434. #else
  85435. "adc r4, r6\n\t"
  85436. #endif
  85437. "stm %[r]!, {r3, r4}\n\t"
  85438. "ldm %[b]!, {r5, r6}\n\t"
  85439. "ldm %[a]!, {r3, r4}\n\t"
  85440. #ifdef WOLFSSL_KEIL
  85441. "adcs r3, r3, r5\n\t"
  85442. #elif defined(__clang__)
  85443. "adcs r3, r5\n\t"
  85444. #else
  85445. "adc r3, r5\n\t"
  85446. #endif
  85447. #ifdef WOLFSSL_KEIL
  85448. "adcs r4, r4, r6\n\t"
  85449. #elif defined(__clang__)
  85450. "adcs r4, r6\n\t"
  85451. #else
  85452. "adc r4, r6\n\t"
  85453. #endif
  85454. "stm %[r]!, {r3, r4}\n\t"
  85455. "ldm %[b]!, {r5, r6}\n\t"
  85456. "ldm %[a]!, {r3, r4}\n\t"
  85457. #ifdef WOLFSSL_KEIL
  85458. "adcs r3, r3, r5\n\t"
  85459. #elif defined(__clang__)
  85460. "adcs r3, r5\n\t"
  85461. #else
  85462. "adc r3, r5\n\t"
  85463. #endif
  85464. #ifdef WOLFSSL_KEIL
  85465. "adcs r4, r4, r6\n\t"
  85466. #elif defined(__clang__)
  85467. "adcs r4, r6\n\t"
  85468. #else
  85469. "adc r4, r6\n\t"
  85470. #endif
  85471. "stm %[r]!, {r3, r4}\n\t"
  85472. "ldm %[b]!, {r5, r6}\n\t"
  85473. "ldm %[a]!, {r3, r4}\n\t"
  85474. #ifdef WOLFSSL_KEIL
  85475. "adcs r3, r3, r5\n\t"
  85476. #elif defined(__clang__)
  85477. "adcs r3, r5\n\t"
  85478. #else
  85479. "adc r3, r5\n\t"
  85480. #endif
  85481. #ifdef WOLFSSL_KEIL
  85482. "adcs r4, r4, r6\n\t"
  85483. #elif defined(__clang__)
  85484. "adcs r4, r6\n\t"
  85485. #else
  85486. "adc r4, r6\n\t"
  85487. #endif
  85488. "stm %[r]!, {r3, r4}\n\t"
  85489. "ldm %[b]!, {r5, r6}\n\t"
  85490. "ldm %[a]!, {r3, r4}\n\t"
  85491. #ifdef WOLFSSL_KEIL
  85492. "adcs r3, r3, r5\n\t"
  85493. #elif defined(__clang__)
  85494. "adcs r3, r5\n\t"
  85495. #else
  85496. "adc r3, r5\n\t"
  85497. #endif
  85498. #ifdef WOLFSSL_KEIL
  85499. "adcs r4, r4, r6\n\t"
  85500. #elif defined(__clang__)
  85501. "adcs r4, r6\n\t"
  85502. #else
  85503. "adc r4, r6\n\t"
  85504. #endif
  85505. "stm %[r]!, {r3, r4}\n\t"
  85506. "ldm %[b]!, {r5, r6}\n\t"
  85507. "ldm %[a]!, {r3, r4}\n\t"
  85508. #ifdef WOLFSSL_KEIL
  85509. "adcs r3, r3, r5\n\t"
  85510. #elif defined(__clang__)
  85511. "adcs r3, r5\n\t"
  85512. #else
  85513. "adc r3, r5\n\t"
  85514. #endif
  85515. #ifdef WOLFSSL_KEIL
  85516. "adcs r4, r4, r6\n\t"
  85517. #elif defined(__clang__)
  85518. "adcs r4, r6\n\t"
  85519. #else
  85520. "adc r4, r6\n\t"
  85521. #endif
  85522. "stm %[r]!, {r3, r4}\n\t"
  85523. "ldm %[b]!, {r5, r6}\n\t"
  85524. "ldm %[a]!, {r3, r4}\n\t"
  85525. #ifdef WOLFSSL_KEIL
  85526. "adcs r3, r3, r5\n\t"
  85527. #elif defined(__clang__)
  85528. "adcs r3, r5\n\t"
  85529. #else
  85530. "adc r3, r5\n\t"
  85531. #endif
  85532. #ifdef WOLFSSL_KEIL
  85533. "adcs r4, r4, r6\n\t"
  85534. #elif defined(__clang__)
  85535. "adcs r4, r6\n\t"
  85536. #else
  85537. "adc r4, r6\n\t"
  85538. #endif
  85539. "stm %[r]!, {r3, r4}\n\t"
  85540. "ldm %[b]!, {r5, r6}\n\t"
  85541. "ldm %[a]!, {r3, r4}\n\t"
  85542. #ifdef WOLFSSL_KEIL
  85543. "adcs r3, r3, r5\n\t"
  85544. #elif defined(__clang__)
  85545. "adcs r3, r5\n\t"
  85546. #else
  85547. "adc r3, r5\n\t"
  85548. #endif
  85549. #ifdef WOLFSSL_KEIL
  85550. "adcs r4, r4, r6\n\t"
  85551. #elif defined(__clang__)
  85552. "adcs r4, r6\n\t"
  85553. #else
  85554. "adc r4, r6\n\t"
  85555. #endif
  85556. "stm %[r]!, {r3, r4}\n\t"
  85557. "ldm %[b]!, {r5, r6}\n\t"
  85558. "ldm %[a]!, {r3, r4}\n\t"
  85559. #ifdef WOLFSSL_KEIL
  85560. "adcs r3, r3, r5\n\t"
  85561. #elif defined(__clang__)
  85562. "adcs r3, r5\n\t"
  85563. #else
  85564. "adc r3, r5\n\t"
  85565. #endif
  85566. #ifdef WOLFSSL_KEIL
  85567. "adcs r4, r4, r6\n\t"
  85568. #elif defined(__clang__)
  85569. "adcs r4, r6\n\t"
  85570. #else
  85571. "adc r4, r6\n\t"
  85572. #endif
  85573. "stm %[r]!, {r3, r4}\n\t"
  85574. "ldm %[b]!, {r5, r6}\n\t"
  85575. "ldm %[a]!, {r3, r4}\n\t"
  85576. #ifdef WOLFSSL_KEIL
  85577. "adcs r3, r3, r5\n\t"
  85578. #elif defined(__clang__)
  85579. "adcs r3, r5\n\t"
  85580. #else
  85581. "adc r3, r5\n\t"
  85582. #endif
  85583. #ifdef WOLFSSL_KEIL
  85584. "adcs r4, r4, r6\n\t"
  85585. #elif defined(__clang__)
  85586. "adcs r4, r6\n\t"
  85587. #else
  85588. "adc r4, r6\n\t"
  85589. #endif
  85590. "stm %[r]!, {r3, r4}\n\t"
  85591. "ldm %[b]!, {r5, r6}\n\t"
  85592. "ldm %[a]!, {r3, r4}\n\t"
  85593. #ifdef WOLFSSL_KEIL
  85594. "adcs r3, r3, r5\n\t"
  85595. #elif defined(__clang__)
  85596. "adcs r3, r5\n\t"
  85597. #else
  85598. "adc r3, r5\n\t"
  85599. #endif
  85600. #ifdef WOLFSSL_KEIL
  85601. "adcs r4, r4, r6\n\t"
  85602. #elif defined(__clang__)
  85603. "adcs r4, r6\n\t"
  85604. #else
  85605. "adc r4, r6\n\t"
  85606. #endif
  85607. "stm %[r]!, {r3, r4}\n\t"
  85608. "ldm %[b]!, {r5, r6}\n\t"
  85609. "ldm %[a]!, {r3, r4}\n\t"
  85610. #ifdef WOLFSSL_KEIL
  85611. "adcs r3, r3, r5\n\t"
  85612. #elif defined(__clang__)
  85613. "adcs r3, r5\n\t"
  85614. #else
  85615. "adc r3, r5\n\t"
  85616. #endif
  85617. #ifdef WOLFSSL_KEIL
  85618. "adcs r4, r4, r6\n\t"
  85619. #elif defined(__clang__)
  85620. "adcs r4, r6\n\t"
  85621. #else
  85622. "adc r4, r6\n\t"
  85623. #endif
  85624. "stm %[r]!, {r3, r4}\n\t"
  85625. "ldm %[b]!, {r5, r6}\n\t"
  85626. "ldm %[a]!, {r3, r4}\n\t"
  85627. #ifdef WOLFSSL_KEIL
  85628. "adcs r3, r3, r5\n\t"
  85629. #elif defined(__clang__)
  85630. "adcs r3, r5\n\t"
  85631. #else
  85632. "adc r3, r5\n\t"
  85633. #endif
  85634. #ifdef WOLFSSL_KEIL
  85635. "adcs r4, r4, r6\n\t"
  85636. #elif defined(__clang__)
  85637. "adcs r4, r6\n\t"
  85638. #else
  85639. "adc r4, r6\n\t"
  85640. #endif
  85641. "stm %[r]!, {r3, r4}\n\t"
  85642. "ldm %[b]!, {r5, r6}\n\t"
  85643. "ldm %[a]!, {r3, r4}\n\t"
  85644. #ifdef WOLFSSL_KEIL
  85645. "adcs r3, r3, r5\n\t"
  85646. #elif defined(__clang__)
  85647. "adcs r3, r5\n\t"
  85648. #else
  85649. "adc r3, r5\n\t"
  85650. #endif
  85651. #ifdef WOLFSSL_KEIL
  85652. "adcs r4, r4, r6\n\t"
  85653. #elif defined(__clang__)
  85654. "adcs r4, r6\n\t"
  85655. #else
  85656. "adc r4, r6\n\t"
  85657. #endif
  85658. "stm %[r]!, {r3, r4}\n\t"
  85659. "ldm %[b]!, {r5, r6}\n\t"
  85660. "ldm %[a]!, {r3, r4}\n\t"
  85661. #ifdef WOLFSSL_KEIL
  85662. "adcs r3, r3, r5\n\t"
  85663. #elif defined(__clang__)
  85664. "adcs r3, r5\n\t"
  85665. #else
  85666. "adc r3, r5\n\t"
  85667. #endif
  85668. #ifdef WOLFSSL_KEIL
  85669. "adcs r4, r4, r6\n\t"
  85670. #elif defined(__clang__)
  85671. "adcs r4, r6\n\t"
  85672. #else
  85673. "adc r4, r6\n\t"
  85674. #endif
  85675. "stm %[r]!, {r3, r4}\n\t"
  85676. "ldm %[b]!, {r5, r6}\n\t"
  85677. "ldm %[a]!, {r3, r4}\n\t"
  85678. #ifdef WOLFSSL_KEIL
  85679. "adcs r3, r3, r5\n\t"
  85680. #elif defined(__clang__)
  85681. "adcs r3, r5\n\t"
  85682. #else
  85683. "adc r3, r5\n\t"
  85684. #endif
  85685. #ifdef WOLFSSL_KEIL
  85686. "adcs r4, r4, r6\n\t"
  85687. #elif defined(__clang__)
  85688. "adcs r4, r6\n\t"
  85689. #else
  85690. "adc r4, r6\n\t"
  85691. #endif
  85692. "stm %[r]!, {r3, r4}\n\t"
  85693. "ldm %[b]!, {r5, r6}\n\t"
  85694. "ldm %[a]!, {r3, r4}\n\t"
  85695. #ifdef WOLFSSL_KEIL
  85696. "adcs r3, r3, r5\n\t"
  85697. #elif defined(__clang__)
  85698. "adcs r3, r5\n\t"
  85699. #else
  85700. "adc r3, r5\n\t"
  85701. #endif
  85702. #ifdef WOLFSSL_KEIL
  85703. "adcs r4, r4, r6\n\t"
  85704. #elif defined(__clang__)
  85705. "adcs r4, r6\n\t"
  85706. #else
  85707. "adc r4, r6\n\t"
  85708. #endif
  85709. "stm %[r]!, {r3, r4}\n\t"
  85710. "ldm %[b]!, {r5, r6}\n\t"
  85711. "ldm %[a]!, {r3, r4}\n\t"
  85712. #ifdef WOLFSSL_KEIL
  85713. "adcs r3, r3, r5\n\t"
  85714. #elif defined(__clang__)
  85715. "adcs r3, r5\n\t"
  85716. #else
  85717. "adc r3, r5\n\t"
  85718. #endif
  85719. #ifdef WOLFSSL_KEIL
  85720. "adcs r4, r4, r6\n\t"
  85721. #elif defined(__clang__)
  85722. "adcs r4, r6\n\t"
  85723. #else
  85724. "adc r4, r6\n\t"
  85725. #endif
  85726. "stm %[r]!, {r3, r4}\n\t"
  85727. "ldm %[b]!, {r5, r6}\n\t"
  85728. "ldm %[a]!, {r3, r4}\n\t"
  85729. #ifdef WOLFSSL_KEIL
  85730. "adcs r3, r3, r5\n\t"
  85731. #elif defined(__clang__)
  85732. "adcs r3, r5\n\t"
  85733. #else
  85734. "adc r3, r5\n\t"
  85735. #endif
  85736. #ifdef WOLFSSL_KEIL
  85737. "adcs r4, r4, r6\n\t"
  85738. #elif defined(__clang__)
  85739. "adcs r4, r6\n\t"
  85740. #else
  85741. "adc r4, r6\n\t"
  85742. #endif
  85743. "stm %[r]!, {r3, r4}\n\t"
  85744. "movs %[r], #0\n\t"
  85745. #ifdef WOLFSSL_KEIL
  85746. "adcs %[r], %[r], %[r]\n\t"
  85747. #elif defined(__clang__)
  85748. "adcs %[r], %[r]\n\t"
  85749. #else
  85750. "adc %[r], %[r]\n\t"
  85751. #endif
  85752. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  85753. :
  85754. : "memory", "r3", "r4", "r5", "r6"
  85755. );
  85756. return (uint32_t)(size_t)r;
  85757. }
  85758. /* Multiply a and b into r. (r = a * b)
  85759. *
  85760. * r A single precision integer.
  85761. * a A single precision integer.
  85762. * b A single precision integer.
  85763. */
  85764. SP_NOINLINE static void sp_4096_mul_128(sp_digit* r, const sp_digit* a,
  85765. const sp_digit* b)
  85766. {
  85767. sp_digit* z0 = r;
  85768. sp_digit z1[128];
  85769. sp_digit a1[64];
  85770. sp_digit b1[64];
  85771. sp_digit* z2 = r + 128;
  85772. sp_digit u;
  85773. sp_digit ca;
  85774. sp_digit cb;
  85775. ca = sp_2048_add_64(a1, a, &a[64]);
  85776. cb = sp_2048_add_64(b1, b, &b[64]);
  85777. u = ca & cb;
  85778. sp_2048_mul_64(z2, &a[64], &b[64]);
  85779. sp_2048_mul_64(z0, a, b);
  85780. sp_2048_mul_64(z1, a1, b1);
  85781. u += sp_4096_sub_in_place_128(z1, z0);
  85782. u += sp_4096_sub_in_place_128(z1, z2);
  85783. sp_2048_mask_64(a1, a1, 0 - cb);
  85784. u += sp_2048_add_64(z1 + 64, z1 + 64, a1);
  85785. sp_2048_mask_64(b1, b1, 0 - ca);
  85786. u += sp_2048_add_64(z1 + 64, z1 + 64, b1);
  85787. u += sp_4096_add_128(r + 64, r + 64, z1);
  85788. (void)sp_4096_add_word_64(r + 192, r + 192, u);
  85789. }
  85790. /* Square a and put result in r. (r = a * a)
  85791. *
  85792. * r A single precision integer.
  85793. * a A single precision integer.
  85794. */
  85795. SP_NOINLINE static void sp_4096_sqr_128(sp_digit* r, const sp_digit* a)
  85796. {
  85797. sp_digit* z0 = r;
  85798. sp_digit* z2 = r + 128;
  85799. sp_digit z1[128];
  85800. sp_digit* a1 = z1;
  85801. sp_digit* zero = z1 + 64;
  85802. sp_digit u;
  85803. sp_digit mask;
  85804. sp_digit* p1;
  85805. sp_digit* p2;
  85806. XMEMSET(zero, 0, sizeof(sp_digit) * 64);
  85807. mask = sp_2048_sub_64(a1, a, &a[64]);
  85808. p1 = (sp_digit*)(((sp_digit)zero & mask ) | ((sp_digit)a1 & (~mask)));
  85809. p2 = (sp_digit*)(((sp_digit)zero & (~mask)) | ((sp_digit)a1 & mask ));
  85810. (void)sp_2048_sub_64(a1, p1, p2);
  85811. sp_2048_sqr_64(z2, &a[64]);
  85812. sp_2048_sqr_64(z0, a);
  85813. sp_2048_sqr_64(z1, a1);
  85814. u = 0;
  85815. u -= sp_4096_sub_in_place_128(z1, z2);
  85816. u -= sp_4096_sub_in_place_128(z1, z0);
  85817. u += sp_4096_sub_in_place_128(r + 64, z1);
  85818. sp_4096_add_word_64(r + 192, r + 192, u);
  85819. }
  85820. #endif /* !WOLFSSL_SP_SMALL */
  85821. #ifdef WOLFSSL_SP_SMALL
  85822. /* Add b to a into r. (r = a + b)
  85823. *
  85824. * r A single precision integer.
  85825. * a A single precision integer.
  85826. * b A single precision integer.
  85827. */
  85828. SP_NOINLINE static sp_digit sp_4096_add_128(sp_digit* r, const sp_digit* a,
  85829. const sp_digit* b)
  85830. {
  85831. __asm__ __volatile__ (
  85832. "movs r6, %[a]\n\t"
  85833. "movs r7, #0\n\t"
  85834. "movs r3, #0\n\t"
  85835. "movs r4, #2\n\t"
  85836. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85837. "lsls r4, r4, #8\n\t"
  85838. #else
  85839. "lsl r4, r4, #8\n\t"
  85840. #endif
  85841. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85842. "subs r7, r7, #1\n\t"
  85843. #else
  85844. "sub r7, r7, #1\n\t"
  85845. #endif
  85846. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85847. "adds r6, r6, r4\n\t"
  85848. #else
  85849. "add r6, r6, r4\n\t"
  85850. #endif
  85851. "\n"
  85852. "L_sp_4096_add_128_word_%=:\n\t"
  85853. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85854. "adds r3, r3, r7\n\t"
  85855. #else
  85856. "add r3, r3, r7\n\t"
  85857. #endif
  85858. "ldr r4, [%[a]]\n\t"
  85859. "ldr r5, [%[b]]\n\t"
  85860. #ifdef WOLFSSL_KEIL
  85861. "adcs r4, r4, r5\n\t"
  85862. #elif defined(__clang__)
  85863. "adcs r4, r5\n\t"
  85864. #else
  85865. "adc r4, r5\n\t"
  85866. #endif
  85867. "str r4, [%[r]]\n\t"
  85868. "movs r3, #0\n\t"
  85869. #ifdef WOLFSSL_KEIL
  85870. "adcs r3, r3, r3\n\t"
  85871. #elif defined(__clang__)
  85872. "adcs r3, r3\n\t"
  85873. #else
  85874. "adc r3, r3\n\t"
  85875. #endif
  85876. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85877. "adds %[a], %[a], #4\n\t"
  85878. #else
  85879. "add %[a], %[a], #4\n\t"
  85880. #endif
  85881. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85882. "adds %[b], %[b], #4\n\t"
  85883. #else
  85884. "add %[b], %[b], #4\n\t"
  85885. #endif
  85886. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85887. "adds %[r], %[r], #4\n\t"
  85888. #else
  85889. "add %[r], %[r], #4\n\t"
  85890. #endif
  85891. "cmp %[a], r6\n\t"
  85892. "bne L_sp_4096_add_128_word_%=\n\t"
  85893. "movs %[r], r3\n\t"
  85894. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  85895. :
  85896. : "memory", "r3", "r4", "r5", "r6", "r7"
  85897. );
  85898. return (uint32_t)(size_t)r;
  85899. }
  85900. #endif /* WOLFSSL_SP_SMALL */
  85901. #ifdef WOLFSSL_SP_SMALL
  85902. /* Sub b from a into a. (a -= b)
  85903. *
  85904. * a A single precision integer.
  85905. * b A single precision integer.
  85906. */
  85907. SP_NOINLINE static sp_digit sp_4096_sub_in_place_128(sp_digit* a,
  85908. const sp_digit* b)
  85909. {
  85910. __asm__ __volatile__ (
  85911. "movs r7, %[a]\n\t"
  85912. "movs r2, #0\n\t"
  85913. "movs r5, #2\n\t"
  85914. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85915. "lsls r5, r5, #8\n\t"
  85916. #else
  85917. "lsl r5, r5, #8\n\t"
  85918. #endif
  85919. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85920. "adds r7, r7, r5\n\t"
  85921. #else
  85922. "add r7, r7, r5\n\t"
  85923. #endif
  85924. "\n"
  85925. "L_sp_4096_sub_in_place_128_words_%=:\n\t"
  85926. "movs r5, #0\n\t"
  85927. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85928. "subs r5, r5, r2\n\t"
  85929. #else
  85930. "sub r5, r5, r2\n\t"
  85931. #endif
  85932. "ldr r3, [%[a]]\n\t"
  85933. "ldr r4, [%[a], #4]\n\t"
  85934. "ldr r5, [%[b]]\n\t"
  85935. "ldr r6, [%[b], #4]\n\t"
  85936. #ifdef WOLFSSL_KEIL
  85937. "sbcs r3, r3, r5\n\t"
  85938. #elif defined(__clang__)
  85939. "sbcs r3, r5\n\t"
  85940. #else
  85941. "sbc r3, r5\n\t"
  85942. #endif
  85943. #ifdef WOLFSSL_KEIL
  85944. "sbcs r4, r4, r6\n\t"
  85945. #elif defined(__clang__)
  85946. "sbcs r4, r6\n\t"
  85947. #else
  85948. "sbc r4, r6\n\t"
  85949. #endif
  85950. "str r3, [%[a]]\n\t"
  85951. "str r4, [%[a], #4]\n\t"
  85952. #ifdef WOLFSSL_KEIL
  85953. "sbcs r2, r2, r2\n\t"
  85954. #elif defined(__clang__)
  85955. "sbcs r2, r2\n\t"
  85956. #else
  85957. "sbc r2, r2\n\t"
  85958. #endif
  85959. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85960. "adds %[a], %[a], #8\n\t"
  85961. #else
  85962. "add %[a], %[a], #8\n\t"
  85963. #endif
  85964. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85965. "adds %[b], %[b], #8\n\t"
  85966. #else
  85967. "add %[b], %[b], #8\n\t"
  85968. #endif
  85969. "cmp %[a], r7\n\t"
  85970. "bne L_sp_4096_sub_in_place_128_words_%=\n\t"
  85971. "movs %[a], r2\n\t"
  85972. : [a] "+l" (a), [b] "+l" (b)
  85973. :
  85974. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  85975. );
  85976. return (uint32_t)(size_t)a;
  85977. }
  85978. #endif /* WOLFSSL_SP_SMALL */
  85979. #ifdef WOLFSSL_SP_SMALL
  85980. /* Multiply a and b into r. (r = a * b)
  85981. *
  85982. * r A single precision integer.
  85983. * a A single precision integer.
  85984. * b A single precision integer.
  85985. */
  85986. SP_NOINLINE static void sp_4096_mul_128(sp_digit* r, const sp_digit* a,
  85987. const sp_digit* b)
  85988. {
  85989. sp_digit t[128 * 2];
  85990. sp_digit* tmp = t;
  85991. __asm__ __volatile__ (
  85992. "movs r3, #0\n\t"
  85993. "movs r4, #0\n\t"
  85994. "mov r8, r3\n\t"
  85995. "mov r11, %[tmp]\n\t"
  85996. "mov r9, %[a]\n\t"
  85997. "mov r10, %[b]\n\t"
  85998. "movs r6, #2\n\t"
  85999. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86000. "lsls r6, r6, #8\n\t"
  86001. #else
  86002. "lsl r6, r6, #8\n\t"
  86003. #endif
  86004. "add r6, r6, r9\n\t"
  86005. "mov r12, r6\n\t"
  86006. "\n"
  86007. "L_sp_4096_mul_128_words_%=:\n\t"
  86008. "movs %[tmp], #0\n\t"
  86009. "movs r5, #0\n\t"
  86010. "movs r6, #0xff\n\t"
  86011. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86012. "adds r6, r6, #0xfd\n\t"
  86013. #else
  86014. "add r6, r6, #0xfd\n\t"
  86015. #endif
  86016. "mov %[a], r8\n\t"
  86017. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86018. "subs %[a], %[a], r6\n\t"
  86019. #else
  86020. "sub %[a], %[a], r6\n\t"
  86021. #endif
  86022. #ifdef WOLFSSL_KEIL
  86023. "sbcs r6, r6, r6\n\t"
  86024. #elif defined(__clang__)
  86025. "sbcs r6, r6\n\t"
  86026. #else
  86027. "sbc r6, r6\n\t"
  86028. #endif
  86029. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86030. "mvns r6, r6\n\t"
  86031. #else
  86032. "mvn r6, r6\n\t"
  86033. #endif
  86034. #ifdef WOLFSSL_KEIL
  86035. "ands %[a], %[a], r6\n\t"
  86036. #elif defined(__clang__)
  86037. "ands %[a], r6\n\t"
  86038. #else
  86039. "and %[a], r6\n\t"
  86040. #endif
  86041. "mov %[b], r8\n\t"
  86042. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86043. "subs %[b], %[b], %[a]\n\t"
  86044. #else
  86045. "sub %[b], %[b], %[a]\n\t"
  86046. #endif
  86047. "add %[a], %[a], r9\n\t"
  86048. "add %[b], %[b], r10\n\t"
  86049. "\n"
  86050. "L_sp_4096_mul_128_mul_%=:\n\t"
  86051. "# Multiply Start\n\t"
  86052. "ldrh r6, [%[a]]\n\t"
  86053. "ldrh r7, [%[b]]\n\t"
  86054. #ifdef WOLFSSL_KEIL
  86055. "muls r7, r6, r7\n\t"
  86056. #elif defined(__clang__)
  86057. "muls r7, r6\n\t"
  86058. #else
  86059. "mul r7, r6\n\t"
  86060. #endif
  86061. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86062. "adds r3, r3, r7\n\t"
  86063. #else
  86064. "add r3, r3, r7\n\t"
  86065. #endif
  86066. #ifdef WOLFSSL_KEIL
  86067. "adcs r4, r4, %[tmp]\n\t"
  86068. #elif defined(__clang__)
  86069. "adcs r4, %[tmp]\n\t"
  86070. #else
  86071. "adc r4, %[tmp]\n\t"
  86072. #endif
  86073. #ifdef WOLFSSL_KEIL
  86074. "adcs r5, r5, %[tmp]\n\t"
  86075. #elif defined(__clang__)
  86076. "adcs r5, %[tmp]\n\t"
  86077. #else
  86078. "adc r5, %[tmp]\n\t"
  86079. #endif
  86080. "ldr r7, [%[b]]\n\t"
  86081. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86082. "lsrs r7, r7, #16\n\t"
  86083. #else
  86084. "lsr r7, r7, #16\n\t"
  86085. #endif
  86086. #ifdef WOLFSSL_KEIL
  86087. "muls r6, r7, r6\n\t"
  86088. #elif defined(__clang__)
  86089. "muls r6, r7\n\t"
  86090. #else
  86091. "mul r6, r7\n\t"
  86092. #endif
  86093. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86094. "lsrs r7, r6, #16\n\t"
  86095. #else
  86096. "lsr r7, r6, #16\n\t"
  86097. #endif
  86098. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86099. "lsls r6, r6, #16\n\t"
  86100. #else
  86101. "lsl r6, r6, #16\n\t"
  86102. #endif
  86103. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86104. "adds r3, r3, r6\n\t"
  86105. #else
  86106. "add r3, r3, r6\n\t"
  86107. #endif
  86108. #ifdef WOLFSSL_KEIL
  86109. "adcs r4, r4, r7\n\t"
  86110. #elif defined(__clang__)
  86111. "adcs r4, r7\n\t"
  86112. #else
  86113. "adc r4, r7\n\t"
  86114. #endif
  86115. #ifdef WOLFSSL_KEIL
  86116. "adcs r5, r5, %[tmp]\n\t"
  86117. #elif defined(__clang__)
  86118. "adcs r5, %[tmp]\n\t"
  86119. #else
  86120. "adc r5, %[tmp]\n\t"
  86121. #endif
  86122. "ldr r6, [%[a]]\n\t"
  86123. "ldr r7, [%[b]]\n\t"
  86124. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86125. "lsrs r6, r6, #16\n\t"
  86126. #else
  86127. "lsr r6, r6, #16\n\t"
  86128. #endif
  86129. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86130. "lsrs r7, r7, #16\n\t"
  86131. #else
  86132. "lsr r7, r7, #16\n\t"
  86133. #endif
  86134. #ifdef WOLFSSL_KEIL
  86135. "muls r7, r6, r7\n\t"
  86136. #elif defined(__clang__)
  86137. "muls r7, r6\n\t"
  86138. #else
  86139. "mul r7, r6\n\t"
  86140. #endif
  86141. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86142. "adds r4, r4, r7\n\t"
  86143. #else
  86144. "add r4, r4, r7\n\t"
  86145. #endif
  86146. #ifdef WOLFSSL_KEIL
  86147. "adcs r5, r5, %[tmp]\n\t"
  86148. #elif defined(__clang__)
  86149. "adcs r5, %[tmp]\n\t"
  86150. #else
  86151. "adc r5, %[tmp]\n\t"
  86152. #endif
  86153. "ldrh r7, [%[b]]\n\t"
  86154. #ifdef WOLFSSL_KEIL
  86155. "muls r6, r7, r6\n\t"
  86156. #elif defined(__clang__)
  86157. "muls r6, r7\n\t"
  86158. #else
  86159. "mul r6, r7\n\t"
  86160. #endif
  86161. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86162. "lsrs r7, r6, #16\n\t"
  86163. #else
  86164. "lsr r7, r6, #16\n\t"
  86165. #endif
  86166. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86167. "lsls r6, r6, #16\n\t"
  86168. #else
  86169. "lsl r6, r6, #16\n\t"
  86170. #endif
  86171. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86172. "adds r3, r3, r6\n\t"
  86173. #else
  86174. "add r3, r3, r6\n\t"
  86175. #endif
  86176. #ifdef WOLFSSL_KEIL
  86177. "adcs r4, r4, r7\n\t"
  86178. #elif defined(__clang__)
  86179. "adcs r4, r7\n\t"
  86180. #else
  86181. "adc r4, r7\n\t"
  86182. #endif
  86183. #ifdef WOLFSSL_KEIL
  86184. "adcs r5, r5, %[tmp]\n\t"
  86185. #elif defined(__clang__)
  86186. "adcs r5, %[tmp]\n\t"
  86187. #else
  86188. "adc r5, %[tmp]\n\t"
  86189. #endif
  86190. "# Multiply Done\n\t"
  86191. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86192. "adds %[a], %[a], #4\n\t"
  86193. #else
  86194. "add %[a], %[a], #4\n\t"
  86195. #endif
  86196. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86197. "subs %[b], %[b], #4\n\t"
  86198. #else
  86199. "sub %[b], %[b], #4\n\t"
  86200. #endif
  86201. "cmp %[a], r12\n\t"
  86202. "beq L_sp_4096_mul_128_done_mul_%=\n\t"
  86203. "mov r6, r8\n\t"
  86204. "add r6, r6, r9\n\t"
  86205. "cmp %[a], r6\n\t"
  86206. "ble L_sp_4096_mul_128_mul_%=\n\t"
  86207. "\n"
  86208. "L_sp_4096_mul_128_done_mul_%=:\n\t"
  86209. "mov %[tmp], r11\n\t"
  86210. "mov r7, r8\n\t"
  86211. "str r3, [%[tmp], r7]\n\t"
  86212. "movs r3, r4\n\t"
  86213. "movs r4, r5\n\t"
  86214. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86215. "adds r7, r7, #4\n\t"
  86216. #else
  86217. "add r7, r7, #4\n\t"
  86218. #endif
  86219. "mov r8, r7\n\t"
  86220. "movs r6, #3\n\t"
  86221. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86222. "lsls r6, r6, #8\n\t"
  86223. #else
  86224. "lsl r6, r6, #8\n\t"
  86225. #endif
  86226. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86227. "adds r6, r6, #0xf8\n\t"
  86228. #else
  86229. "add r6, r6, #0xf8\n\t"
  86230. #endif
  86231. "cmp r7, r6\n\t"
  86232. "ble L_sp_4096_mul_128_words_%=\n\t"
  86233. "str r3, [%[tmp], r7]\n\t"
  86234. "mov %[a], r9\n\t"
  86235. "mov %[b], r10\n\t"
  86236. : [a] "+l" (a), [b] "+l" (b), [tmp] "+l" (tmp)
  86237. :
  86238. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  86239. );
  86240. XMEMCPY(r, t, sizeof(t));
  86241. }
  86242. /* Square a and put result in r. (r = a * a)
  86243. *
  86244. * r A single precision integer.
  86245. * a A single precision integer.
  86246. */
  86247. SP_NOINLINE static void sp_4096_sqr_128(sp_digit* r, const sp_digit* a)
  86248. {
  86249. __asm__ __volatile__ (
  86250. "movs r3, #0\n\t"
  86251. "movs r4, #0\n\t"
  86252. "movs r5, #0\n\t"
  86253. "mov r8, r3\n\t"
  86254. "mov r11, %[r]\n\t"
  86255. "movs r6, #4\n\t"
  86256. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86257. "lsls r6, r6, #8\n\t"
  86258. #else
  86259. "lsl r6, r6, #8\n\t"
  86260. #endif
  86261. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86262. "negs r6, r6\n\t"
  86263. #else
  86264. "neg r6, r6\n\t"
  86265. #endif
  86266. "add sp, sp, r6\n\t"
  86267. "mov r10, sp\n\t"
  86268. "mov r9, %[a]\n\t"
  86269. "\n"
  86270. "L_sp_4096_sqr_128_words_%=:\n\t"
  86271. "movs %[r], #0\n\t"
  86272. "movs r6, #0xff\n\t"
  86273. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86274. "adds r6, r6, #0xfd\n\t"
  86275. #else
  86276. "add r6, r6, #0xfd\n\t"
  86277. #endif
  86278. "mov %[a], r8\n\t"
  86279. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86280. "subs %[a], %[a], r6\n\t"
  86281. #else
  86282. "sub %[a], %[a], r6\n\t"
  86283. #endif
  86284. #ifdef WOLFSSL_KEIL
  86285. "sbcs r6, r6, r6\n\t"
  86286. #elif defined(__clang__)
  86287. "sbcs r6, r6\n\t"
  86288. #else
  86289. "sbc r6, r6\n\t"
  86290. #endif
  86291. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86292. "mvns r6, r6\n\t"
  86293. #else
  86294. "mvn r6, r6\n\t"
  86295. #endif
  86296. #ifdef WOLFSSL_KEIL
  86297. "ands %[a], %[a], r6\n\t"
  86298. #elif defined(__clang__)
  86299. "ands %[a], r6\n\t"
  86300. #else
  86301. "and %[a], r6\n\t"
  86302. #endif
  86303. "mov r2, r8\n\t"
  86304. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86305. "subs r2, r2, %[a]\n\t"
  86306. #else
  86307. "sub r2, r2, %[a]\n\t"
  86308. #endif
  86309. "add %[a], %[a], r9\n\t"
  86310. "add r2, r2, r9\n\t"
  86311. "\n"
  86312. "L_sp_4096_sqr_128_mul_%=:\n\t"
  86313. "cmp r2, %[a]\n\t"
  86314. "beq L_sp_4096_sqr_128_sqr_%=\n\t"
  86315. "# Multiply * 2: Start\n\t"
  86316. "ldrh r6, [%[a]]\n\t"
  86317. "ldrh r7, [r2]\n\t"
  86318. #ifdef WOLFSSL_KEIL
  86319. "muls r7, r6, r7\n\t"
  86320. #elif defined(__clang__)
  86321. "muls r7, r6\n\t"
  86322. #else
  86323. "mul r7, r6\n\t"
  86324. #endif
  86325. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86326. "adds r3, r3, r7\n\t"
  86327. #else
  86328. "add r3, r3, r7\n\t"
  86329. #endif
  86330. #ifdef WOLFSSL_KEIL
  86331. "adcs r4, r4, %[r]\n\t"
  86332. #elif defined(__clang__)
  86333. "adcs r4, %[r]\n\t"
  86334. #else
  86335. "adc r4, %[r]\n\t"
  86336. #endif
  86337. #ifdef WOLFSSL_KEIL
  86338. "adcs r5, r5, %[r]\n\t"
  86339. #elif defined(__clang__)
  86340. "adcs r5, %[r]\n\t"
  86341. #else
  86342. "adc r5, %[r]\n\t"
  86343. #endif
  86344. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86345. "adds r3, r3, r7\n\t"
  86346. #else
  86347. "add r3, r3, r7\n\t"
  86348. #endif
  86349. #ifdef WOLFSSL_KEIL
  86350. "adcs r4, r4, %[r]\n\t"
  86351. #elif defined(__clang__)
  86352. "adcs r4, %[r]\n\t"
  86353. #else
  86354. "adc r4, %[r]\n\t"
  86355. #endif
  86356. #ifdef WOLFSSL_KEIL
  86357. "adcs r5, r5, %[r]\n\t"
  86358. #elif defined(__clang__)
  86359. "adcs r5, %[r]\n\t"
  86360. #else
  86361. "adc r5, %[r]\n\t"
  86362. #endif
  86363. "ldr r7, [r2]\n\t"
  86364. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86365. "lsrs r7, r7, #16\n\t"
  86366. #else
  86367. "lsr r7, r7, #16\n\t"
  86368. #endif
  86369. #ifdef WOLFSSL_KEIL
  86370. "muls r6, r7, r6\n\t"
  86371. #elif defined(__clang__)
  86372. "muls r6, r7\n\t"
  86373. #else
  86374. "mul r6, r7\n\t"
  86375. #endif
  86376. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86377. "lsrs r7, r6, #16\n\t"
  86378. #else
  86379. "lsr r7, r6, #16\n\t"
  86380. #endif
  86381. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86382. "lsls r6, r6, #16\n\t"
  86383. #else
  86384. "lsl r6, r6, #16\n\t"
  86385. #endif
  86386. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86387. "adds r3, r3, r6\n\t"
  86388. #else
  86389. "add r3, r3, r6\n\t"
  86390. #endif
  86391. #ifdef WOLFSSL_KEIL
  86392. "adcs r4, r4, r7\n\t"
  86393. #elif defined(__clang__)
  86394. "adcs r4, r7\n\t"
  86395. #else
  86396. "adc r4, r7\n\t"
  86397. #endif
  86398. #ifdef WOLFSSL_KEIL
  86399. "adcs r5, r5, %[r]\n\t"
  86400. #elif defined(__clang__)
  86401. "adcs r5, %[r]\n\t"
  86402. #else
  86403. "adc r5, %[r]\n\t"
  86404. #endif
  86405. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86406. "adds r3, r3, r6\n\t"
  86407. #else
  86408. "add r3, r3, r6\n\t"
  86409. #endif
  86410. #ifdef WOLFSSL_KEIL
  86411. "adcs r4, r4, r7\n\t"
  86412. #elif defined(__clang__)
  86413. "adcs r4, r7\n\t"
  86414. #else
  86415. "adc r4, r7\n\t"
  86416. #endif
  86417. #ifdef WOLFSSL_KEIL
  86418. "adcs r5, r5, %[r]\n\t"
  86419. #elif defined(__clang__)
  86420. "adcs r5, %[r]\n\t"
  86421. #else
  86422. "adc r5, %[r]\n\t"
  86423. #endif
  86424. "ldr r6, [%[a]]\n\t"
  86425. "ldr r7, [r2]\n\t"
  86426. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86427. "lsrs r6, r6, #16\n\t"
  86428. #else
  86429. "lsr r6, r6, #16\n\t"
  86430. #endif
  86431. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86432. "lsrs r7, r7, #16\n\t"
  86433. #else
  86434. "lsr r7, r7, #16\n\t"
  86435. #endif
  86436. #ifdef WOLFSSL_KEIL
  86437. "muls r7, r6, r7\n\t"
  86438. #elif defined(__clang__)
  86439. "muls r7, r6\n\t"
  86440. #else
  86441. "mul r7, r6\n\t"
  86442. #endif
  86443. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86444. "adds r4, r4, r7\n\t"
  86445. #else
  86446. "add r4, r4, r7\n\t"
  86447. #endif
  86448. #ifdef WOLFSSL_KEIL
  86449. "adcs r5, r5, %[r]\n\t"
  86450. #elif defined(__clang__)
  86451. "adcs r5, %[r]\n\t"
  86452. #else
  86453. "adc r5, %[r]\n\t"
  86454. #endif
  86455. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86456. "adds r4, r4, r7\n\t"
  86457. #else
  86458. "add r4, r4, r7\n\t"
  86459. #endif
  86460. #ifdef WOLFSSL_KEIL
  86461. "adcs r5, r5, %[r]\n\t"
  86462. #elif defined(__clang__)
  86463. "adcs r5, %[r]\n\t"
  86464. #else
  86465. "adc r5, %[r]\n\t"
  86466. #endif
  86467. "ldrh r7, [r2]\n\t"
  86468. #ifdef WOLFSSL_KEIL
  86469. "muls r6, r7, r6\n\t"
  86470. #elif defined(__clang__)
  86471. "muls r6, r7\n\t"
  86472. #else
  86473. "mul r6, r7\n\t"
  86474. #endif
  86475. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86476. "lsrs r7, r6, #16\n\t"
  86477. #else
  86478. "lsr r7, r6, #16\n\t"
  86479. #endif
  86480. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86481. "lsls r6, r6, #16\n\t"
  86482. #else
  86483. "lsl r6, r6, #16\n\t"
  86484. #endif
  86485. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86486. "adds r3, r3, r6\n\t"
  86487. #else
  86488. "add r3, r3, r6\n\t"
  86489. #endif
  86490. #ifdef WOLFSSL_KEIL
  86491. "adcs r4, r4, r7\n\t"
  86492. #elif defined(__clang__)
  86493. "adcs r4, r7\n\t"
  86494. #else
  86495. "adc r4, r7\n\t"
  86496. #endif
  86497. #ifdef WOLFSSL_KEIL
  86498. "adcs r5, r5, %[r]\n\t"
  86499. #elif defined(__clang__)
  86500. "adcs r5, %[r]\n\t"
  86501. #else
  86502. "adc r5, %[r]\n\t"
  86503. #endif
  86504. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86505. "adds r3, r3, r6\n\t"
  86506. #else
  86507. "add r3, r3, r6\n\t"
  86508. #endif
  86509. #ifdef WOLFSSL_KEIL
  86510. "adcs r4, r4, r7\n\t"
  86511. #elif defined(__clang__)
  86512. "adcs r4, r7\n\t"
  86513. #else
  86514. "adc r4, r7\n\t"
  86515. #endif
  86516. #ifdef WOLFSSL_KEIL
  86517. "adcs r5, r5, %[r]\n\t"
  86518. #elif defined(__clang__)
  86519. "adcs r5, %[r]\n\t"
  86520. #else
  86521. "adc r5, %[r]\n\t"
  86522. #endif
  86523. "# Multiply * 2: Done\n\t"
  86524. "bal L_sp_4096_sqr_128_done_sqr_%=\n\t"
  86525. "\n"
  86526. "L_sp_4096_sqr_128_sqr_%=:\n\t"
  86527. "mov r12, r2\n\t"
  86528. "ldr r2, [%[a]]\n\t"
  86529. "# Square: Start\n\t"
  86530. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86531. "lsrs r7, r2, #16\n\t"
  86532. #else
  86533. "lsr r7, r2, #16\n\t"
  86534. #endif
  86535. "uxth r6, r2\n\t"
  86536. #ifdef WOLFSSL_KEIL
  86537. "muls r6, r6, r6\n\t"
  86538. #elif defined(__clang__)
  86539. "muls r6, r6\n\t"
  86540. #else
  86541. "mul r6, r6\n\t"
  86542. #endif
  86543. #ifdef WOLFSSL_KEIL
  86544. "muls r7, r7, r7\n\t"
  86545. #elif defined(__clang__)
  86546. "muls r7, r7\n\t"
  86547. #else
  86548. "mul r7, r7\n\t"
  86549. #endif
  86550. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86551. "adds r3, r3, r6\n\t"
  86552. #else
  86553. "add r3, r3, r6\n\t"
  86554. #endif
  86555. #ifdef WOLFSSL_KEIL
  86556. "adcs r4, r4, r7\n\t"
  86557. #elif defined(__clang__)
  86558. "adcs r4, r7\n\t"
  86559. #else
  86560. "adc r4, r7\n\t"
  86561. #endif
  86562. #ifdef WOLFSSL_KEIL
  86563. "adcs r5, r5, %[r]\n\t"
  86564. #elif defined(__clang__)
  86565. "adcs r5, %[r]\n\t"
  86566. #else
  86567. "adc r5, %[r]\n\t"
  86568. #endif
  86569. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86570. "lsrs r7, r2, #16\n\t"
  86571. #else
  86572. "lsr r7, r2, #16\n\t"
  86573. #endif
  86574. "uxth r6, r2\n\t"
  86575. #ifdef WOLFSSL_KEIL
  86576. "muls r6, r7, r6\n\t"
  86577. #elif defined(__clang__)
  86578. "muls r6, r7\n\t"
  86579. #else
  86580. "mul r6, r7\n\t"
  86581. #endif
  86582. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86583. "lsrs r7, r6, #15\n\t"
  86584. #else
  86585. "lsr r7, r6, #15\n\t"
  86586. #endif
  86587. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86588. "lsls r6, r6, #17\n\t"
  86589. #else
  86590. "lsl r6, r6, #17\n\t"
  86591. #endif
  86592. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86593. "adds r3, r3, r6\n\t"
  86594. #else
  86595. "add r3, r3, r6\n\t"
  86596. #endif
  86597. #ifdef WOLFSSL_KEIL
  86598. "adcs r4, r4, r7\n\t"
  86599. #elif defined(__clang__)
  86600. "adcs r4, r7\n\t"
  86601. #else
  86602. "adc r4, r7\n\t"
  86603. #endif
  86604. #ifdef WOLFSSL_KEIL
  86605. "adcs r5, r5, %[r]\n\t"
  86606. #elif defined(__clang__)
  86607. "adcs r5, %[r]\n\t"
  86608. #else
  86609. "adc r5, %[r]\n\t"
  86610. #endif
  86611. "# Square: Done\n\t"
  86612. "mov r2, r12\n\t"
  86613. "\n"
  86614. "L_sp_4096_sqr_128_done_sqr_%=:\n\t"
  86615. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86616. "adds %[a], %[a], #4\n\t"
  86617. #else
  86618. "add %[a], %[a], #4\n\t"
  86619. #endif
  86620. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86621. "subs r2, r2, #4\n\t"
  86622. #else
  86623. "sub r2, r2, #4\n\t"
  86624. #endif
  86625. "movs r6, #2\n\t"
  86626. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86627. "lsls r6, r6, #8\n\t"
  86628. #else
  86629. "lsl r6, r6, #8\n\t"
  86630. #endif
  86631. "add r6, r6, r9\n\t"
  86632. "cmp %[a], r6\n\t"
  86633. "beq L_sp_4096_sqr_128_done_mul_%=\n\t"
  86634. "cmp %[a], r2\n\t"
  86635. "bgt L_sp_4096_sqr_128_done_mul_%=\n\t"
  86636. "mov r7, r8\n\t"
  86637. "add r7, r7, r9\n\t"
  86638. "cmp %[a], r7\n\t"
  86639. "ble L_sp_4096_sqr_128_mul_%=\n\t"
  86640. "\n"
  86641. "L_sp_4096_sqr_128_done_mul_%=:\n\t"
  86642. "mov %[r], r10\n\t"
  86643. "mov r7, r8\n\t"
  86644. "str r3, [%[r], r7]\n\t"
  86645. "movs r3, r4\n\t"
  86646. "movs r4, r5\n\t"
  86647. "movs r5, #0\n\t"
  86648. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86649. "adds r7, r7, #4\n\t"
  86650. #else
  86651. "add r7, r7, #4\n\t"
  86652. #endif
  86653. "mov r8, r7\n\t"
  86654. "movs r6, #3\n\t"
  86655. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86656. "lsls r6, r6, #8\n\t"
  86657. #else
  86658. "lsl r6, r6, #8\n\t"
  86659. #endif
  86660. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86661. "adds r6, r6, #0xf8\n\t"
  86662. #else
  86663. "add r6, r6, #0xf8\n\t"
  86664. #endif
  86665. "cmp r7, r6\n\t"
  86666. "ble L_sp_4096_sqr_128_words_%=\n\t"
  86667. "mov %[a], r9\n\t"
  86668. "str r3, [%[r], r7]\n\t"
  86669. "mov %[r], r11\n\t"
  86670. "mov %[a], r10\n\t"
  86671. "movs r3, #3\n\t"
  86672. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86673. "lsls r3, r3, #8\n\t"
  86674. #else
  86675. "lsl r3, r3, #8\n\t"
  86676. #endif
  86677. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86678. "adds r3, r3, #0xfc\n\t"
  86679. #else
  86680. "add r3, r3, #0xfc\n\t"
  86681. #endif
  86682. "\n"
  86683. "L_sp_4096_sqr_128_store_%=:\n\t"
  86684. "ldr r6, [%[a], r3]\n\t"
  86685. "str r6, [%[r], r3]\n\t"
  86686. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86687. "subs r3, r3, #4\n\t"
  86688. #else
  86689. "sub r3, r3, #4\n\t"
  86690. #endif
  86691. "bge L_sp_4096_sqr_128_store_%=\n\t"
  86692. "movs r6, #4\n\t"
  86693. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86694. "lsls r6, r6, #8\n\t"
  86695. #else
  86696. "lsl r6, r6, #8\n\t"
  86697. #endif
  86698. "add sp, sp, r6\n\t"
  86699. : [r] "+l" (r), [a] "+l" (a)
  86700. :
  86701. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  86702. );
  86703. }
  86704. #endif /* WOLFSSL_SP_SMALL */
  86705. /* Caclulate the bottom digit of -1/a mod 2^n.
  86706. *
  86707. * a A single precision number.
  86708. * rho Bottom word of inverse.
  86709. */
  86710. static void sp_4096_mont_setup(const sp_digit* a, sp_digit* rho)
  86711. {
  86712. sp_digit x;
  86713. sp_digit b;
  86714. b = a[0];
  86715. x = (((b + 2) & 4) << 1) + b; /* here x*a==1 mod 2**4 */
  86716. x *= 2 - b * x; /* here x*a==1 mod 2**8 */
  86717. x *= 2 - b * x; /* here x*a==1 mod 2**16 */
  86718. x *= 2 - b * x; /* here x*a==1 mod 2**32 */
  86719. /* rho = -1/m mod b */
  86720. *rho = (sp_digit)0 - x;
  86721. }
  86722. /* Mul a by digit b into r. (r = a * b)
  86723. *
  86724. * r A single precision integer.
  86725. * a A single precision integer.
  86726. * b A single precision digit.
  86727. */
  86728. SP_NOINLINE static void sp_4096_mul_d_128(sp_digit* r, const sp_digit* a,
  86729. sp_digit b)
  86730. {
  86731. __asm__ __volatile__ (
  86732. "movs r6, #2\n\t"
  86733. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86734. "lsls r6, r6, #8\n\t"
  86735. #else
  86736. "lsl r6, r6, #8\n\t"
  86737. #endif
  86738. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86739. "adds r6, r6, %[a]\n\t"
  86740. #else
  86741. "add r6, r6, %[a]\n\t"
  86742. #endif
  86743. "mov r8, %[r]\n\t"
  86744. "mov r9, r6\n\t"
  86745. "movs r3, #0\n\t"
  86746. "movs r4, #0\n\t"
  86747. "\n"
  86748. "L_sp_4096_mul_d_128_%=:\n\t"
  86749. "movs %[r], #0\n\t"
  86750. "movs r5, #0\n\t"
  86751. "# A[] * B\n\t"
  86752. "ldrh r6, [%[a]]\n\t"
  86753. "uxth r7, %[b]\n\t"
  86754. #ifdef WOLFSSL_KEIL
  86755. "muls r7, r6, r7\n\t"
  86756. #elif defined(__clang__)
  86757. "muls r7, r6\n\t"
  86758. #else
  86759. "mul r7, r6\n\t"
  86760. #endif
  86761. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86762. "adds r3, r3, r7\n\t"
  86763. #else
  86764. "add r3, r3, r7\n\t"
  86765. #endif
  86766. #ifdef WOLFSSL_KEIL
  86767. "adcs r4, r4, %[r]\n\t"
  86768. #elif defined(__clang__)
  86769. "adcs r4, %[r]\n\t"
  86770. #else
  86771. "adc r4, %[r]\n\t"
  86772. #endif
  86773. #ifdef WOLFSSL_KEIL
  86774. "adcs r5, r5, %[r]\n\t"
  86775. #elif defined(__clang__)
  86776. "adcs r5, %[r]\n\t"
  86777. #else
  86778. "adc r5, %[r]\n\t"
  86779. #endif
  86780. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86781. "lsrs r7, %[b], #16\n\t"
  86782. #else
  86783. "lsr r7, %[b], #16\n\t"
  86784. #endif
  86785. #ifdef WOLFSSL_KEIL
  86786. "muls r6, r7, r6\n\t"
  86787. #elif defined(__clang__)
  86788. "muls r6, r7\n\t"
  86789. #else
  86790. "mul r6, r7\n\t"
  86791. #endif
  86792. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86793. "lsrs r7, r6, #16\n\t"
  86794. #else
  86795. "lsr r7, r6, #16\n\t"
  86796. #endif
  86797. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86798. "lsls r6, r6, #16\n\t"
  86799. #else
  86800. "lsl r6, r6, #16\n\t"
  86801. #endif
  86802. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86803. "adds r3, r3, r6\n\t"
  86804. #else
  86805. "add r3, r3, r6\n\t"
  86806. #endif
  86807. #ifdef WOLFSSL_KEIL
  86808. "adcs r4, r4, r7\n\t"
  86809. #elif defined(__clang__)
  86810. "adcs r4, r7\n\t"
  86811. #else
  86812. "adc r4, r7\n\t"
  86813. #endif
  86814. #ifdef WOLFSSL_KEIL
  86815. "adcs r5, r5, %[r]\n\t"
  86816. #elif defined(__clang__)
  86817. "adcs r5, %[r]\n\t"
  86818. #else
  86819. "adc r5, %[r]\n\t"
  86820. #endif
  86821. "ldr r6, [%[a]]\n\t"
  86822. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86823. "lsrs r6, r6, #16\n\t"
  86824. #else
  86825. "lsr r6, r6, #16\n\t"
  86826. #endif
  86827. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86828. "lsrs r7, %[b], #16\n\t"
  86829. #else
  86830. "lsr r7, %[b], #16\n\t"
  86831. #endif
  86832. #ifdef WOLFSSL_KEIL
  86833. "muls r7, r6, r7\n\t"
  86834. #elif defined(__clang__)
  86835. "muls r7, r6\n\t"
  86836. #else
  86837. "mul r7, r6\n\t"
  86838. #endif
  86839. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86840. "adds r4, r4, r7\n\t"
  86841. #else
  86842. "add r4, r4, r7\n\t"
  86843. #endif
  86844. #ifdef WOLFSSL_KEIL
  86845. "adcs r5, r5, %[r]\n\t"
  86846. #elif defined(__clang__)
  86847. "adcs r5, %[r]\n\t"
  86848. #else
  86849. "adc r5, %[r]\n\t"
  86850. #endif
  86851. "uxth r7, %[b]\n\t"
  86852. #ifdef WOLFSSL_KEIL
  86853. "muls r6, r7, r6\n\t"
  86854. #elif defined(__clang__)
  86855. "muls r6, r7\n\t"
  86856. #else
  86857. "mul r6, r7\n\t"
  86858. #endif
  86859. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86860. "lsrs r7, r6, #16\n\t"
  86861. #else
  86862. "lsr r7, r6, #16\n\t"
  86863. #endif
  86864. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86865. "lsls r6, r6, #16\n\t"
  86866. #else
  86867. "lsl r6, r6, #16\n\t"
  86868. #endif
  86869. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86870. "adds r3, r3, r6\n\t"
  86871. #else
  86872. "add r3, r3, r6\n\t"
  86873. #endif
  86874. #ifdef WOLFSSL_KEIL
  86875. "adcs r4, r4, r7\n\t"
  86876. #elif defined(__clang__)
  86877. "adcs r4, r7\n\t"
  86878. #else
  86879. "adc r4, r7\n\t"
  86880. #endif
  86881. #ifdef WOLFSSL_KEIL
  86882. "adcs r5, r5, %[r]\n\t"
  86883. #elif defined(__clang__)
  86884. "adcs r5, %[r]\n\t"
  86885. #else
  86886. "adc r5, %[r]\n\t"
  86887. #endif
  86888. "# A[] * B - Done\n\t"
  86889. "mov %[r], r8\n\t"
  86890. "str r3, [%[r]]\n\t"
  86891. "movs r3, r4\n\t"
  86892. "movs r4, r5\n\t"
  86893. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86894. "adds %[r], %[r], #4\n\t"
  86895. #else
  86896. "add %[r], %[r], #4\n\t"
  86897. #endif
  86898. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86899. "adds %[a], %[a], #4\n\t"
  86900. #else
  86901. "add %[a], %[a], #4\n\t"
  86902. #endif
  86903. "mov r8, %[r]\n\t"
  86904. "cmp %[a], r9\n\t"
  86905. "blt L_sp_4096_mul_d_128_%=\n\t"
  86906. "str r3, [%[r]]\n\t"
  86907. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  86908. :
  86909. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  86910. );
  86911. }
  86912. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  86913. /* r = 2^n mod m where n is the number of bits to reduce by.
  86914. * Given m must be 4096 bits, just need to subtract.
  86915. *
  86916. * r A single precision number.
  86917. * m A single precision number.
  86918. */
  86919. static void sp_4096_mont_norm_128(sp_digit* r, const sp_digit* m)
  86920. {
  86921. XMEMSET(r, 0, sizeof(sp_digit) * 128);
  86922. /* r = 2^n mod m */
  86923. sp_4096_sub_in_place_128(r, m);
  86924. }
  86925. #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */
  86926. /* Conditionally subtract b from a using the mask m.
  86927. * m is -1 to subtract and 0 when not copying.
  86928. *
  86929. * r A single precision number representing condition subtract result.
  86930. * a A single precision number to subtract from.
  86931. * b A single precision number to subtract.
  86932. * m Mask value to apply.
  86933. */
  86934. SP_NOINLINE static sp_digit sp_4096_cond_sub_128(sp_digit* r, const sp_digit* a,
  86935. const sp_digit* b, sp_digit m)
  86936. {
  86937. __asm__ __volatile__ (
  86938. "movs r4, #0\n\t"
  86939. "movs r5, #2\n\t"
  86940. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86941. "lsls r5, r5, #8\n\t"
  86942. #else
  86943. "lsl r5, r5, #8\n\t"
  86944. #endif
  86945. "mov r8, r5\n\t"
  86946. "movs r7, #0\n\t"
  86947. "\n"
  86948. "L_sp_4096_cond_sub_128_words_%=:\n\t"
  86949. "ldr r6, [%[b], r7]\n\t"
  86950. #ifdef WOLFSSL_KEIL
  86951. "ands r6, r6, %[m]\n\t"
  86952. #elif defined(__clang__)
  86953. "ands r6, %[m]\n\t"
  86954. #else
  86955. "and r6, %[m]\n\t"
  86956. #endif
  86957. "movs r5, #0\n\t"
  86958. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86959. "subs r5, r5, r4\n\t"
  86960. #else
  86961. "sub r5, r5, r4\n\t"
  86962. #endif
  86963. "ldr r5, [%[a], r7]\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. #ifdef WOLFSSL_KEIL
  86972. "sbcs r4, r4, r4\n\t"
  86973. #elif defined(__clang__)
  86974. "sbcs r4, r4\n\t"
  86975. #else
  86976. "sbc r4, r4\n\t"
  86977. #endif
  86978. "str r5, [%[r], r7]\n\t"
  86979. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86980. "adds r7, r7, #4\n\t"
  86981. #else
  86982. "add r7, r7, #4\n\t"
  86983. #endif
  86984. "cmp r7, r8\n\t"
  86985. "blt L_sp_4096_cond_sub_128_words_%=\n\t"
  86986. "movs %[r], r4\n\t"
  86987. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m)
  86988. :
  86989. : "memory", "r4", "r5", "r6", "r7", "r8"
  86990. );
  86991. return (uint32_t)(size_t)r;
  86992. }
  86993. /* Reduce the number back to 4096 bits using Montgomery reduction.
  86994. *
  86995. * a A single precision number to reduce in place.
  86996. * m The single precision number representing the modulus.
  86997. * mp The digit representing the negative inverse of m mod 2^n.
  86998. */
  86999. SP_NOINLINE static void sp_4096_mont_reduce_128(sp_digit* a, const sp_digit* m,
  87000. sp_digit mp)
  87001. {
  87002. __asm__ __volatile__ (
  87003. "movs r7, #0\n\t"
  87004. "mov r8, %[mp]\n\t"
  87005. "mov r12, r7\n\t"
  87006. "mov lr, %[m]\n\t"
  87007. "mov r9, %[a]\n\t"
  87008. "mov r11, %[a]\n\t"
  87009. "movs r5, #0xff\n\t"
  87010. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87011. "adds r5, r5, #0xfd\n\t"
  87012. #else
  87013. "add r5, r5, #0xfd\n\t"
  87014. #endif
  87015. "movs r6, #2\n\t"
  87016. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87017. "lsls r6, r6, #8\n\t"
  87018. #else
  87019. "lsl r6, r6, #8\n\t"
  87020. #endif
  87021. "add r9, r9, r5\n\t"
  87022. "add r11, r11, r6\n\t"
  87023. "\n"
  87024. "L_sp_4096_mont_reduce_128_mod_%=:\n\t"
  87025. "movs r7, #0\n\t"
  87026. "movs r4, #0\n\t"
  87027. "# a[i] += m[0] * mu\n\t"
  87028. "ldm %[m]!, {%[mp]}\n\t"
  87029. "ldm %[a]!, {r3}\n\t"
  87030. "# mu = a[i] * mp\n\t"
  87031. "mov r5, r8\n\t"
  87032. #ifdef WOLFSSL_KEIL
  87033. "muls r5, r3, r5\n\t"
  87034. #elif defined(__clang__)
  87035. "muls r5, r3\n\t"
  87036. #else
  87037. "mul r5, r3\n\t"
  87038. #endif
  87039. "mov r10, r5\n\t"
  87040. "# Multiply m[0] and mu - Start\n\t"
  87041. "mov r5, r10\n\t"
  87042. "uxth r6, %[mp]\n\t"
  87043. "uxth r5, r5\n\t"
  87044. #ifdef WOLFSSL_KEIL
  87045. "muls r6, r5, r6\n\t"
  87046. #elif defined(__clang__)
  87047. "muls r6, r5\n\t"
  87048. #else
  87049. "mul r6, r5\n\t"
  87050. #endif
  87051. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87052. "adds r3, r3, r6\n\t"
  87053. #else
  87054. "add r3, r3, r6\n\t"
  87055. #endif
  87056. #ifdef WOLFSSL_KEIL
  87057. "adcs r4, r4, r7\n\t"
  87058. #elif defined(__clang__)
  87059. "adcs r4, r7\n\t"
  87060. #else
  87061. "adc r4, r7\n\t"
  87062. #endif
  87063. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87064. "lsrs r6, %[mp], #16\n\t"
  87065. #else
  87066. "lsr r6, %[mp], #16\n\t"
  87067. #endif
  87068. #ifdef WOLFSSL_KEIL
  87069. "muls r5, r6, r5\n\t"
  87070. #elif defined(__clang__)
  87071. "muls r5, r6\n\t"
  87072. #else
  87073. "mul r5, r6\n\t"
  87074. #endif
  87075. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87076. "lsrs r6, r5, #16\n\t"
  87077. #else
  87078. "lsr r6, r5, #16\n\t"
  87079. #endif
  87080. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87081. "lsls r5, r5, #16\n\t"
  87082. #else
  87083. "lsl r5, r5, #16\n\t"
  87084. #endif
  87085. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87086. "adds r3, r3, r5\n\t"
  87087. #else
  87088. "add r3, r3, r5\n\t"
  87089. #endif
  87090. #ifdef WOLFSSL_KEIL
  87091. "adcs r4, r4, r6\n\t"
  87092. #elif defined(__clang__)
  87093. "adcs r4, r6\n\t"
  87094. #else
  87095. "adc r4, r6\n\t"
  87096. #endif
  87097. "mov r5, r10\n\t"
  87098. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87099. "lsrs r6, %[mp], #16\n\t"
  87100. #else
  87101. "lsr r6, %[mp], #16\n\t"
  87102. #endif
  87103. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87104. "lsrs r5, r5, #16\n\t"
  87105. #else
  87106. "lsr r5, r5, #16\n\t"
  87107. #endif
  87108. #ifdef WOLFSSL_KEIL
  87109. "muls r6, r5, r6\n\t"
  87110. #elif defined(__clang__)
  87111. "muls r6, r5\n\t"
  87112. #else
  87113. "mul r6, r5\n\t"
  87114. #endif
  87115. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87116. "adds r4, r4, r6\n\t"
  87117. #else
  87118. "add r4, r4, r6\n\t"
  87119. #endif
  87120. "uxth r6, %[mp]\n\t"
  87121. #ifdef WOLFSSL_KEIL
  87122. "muls r5, r6, r5\n\t"
  87123. #elif defined(__clang__)
  87124. "muls r5, r6\n\t"
  87125. #else
  87126. "mul r5, r6\n\t"
  87127. #endif
  87128. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87129. "lsrs r6, r5, #16\n\t"
  87130. #else
  87131. "lsr r6, r5, #16\n\t"
  87132. #endif
  87133. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87134. "lsls r5, r5, #16\n\t"
  87135. #else
  87136. "lsl r5, r5, #16\n\t"
  87137. #endif
  87138. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87139. "adds r3, r3, r5\n\t"
  87140. #else
  87141. "add r3, r3, r5\n\t"
  87142. #endif
  87143. #ifdef WOLFSSL_KEIL
  87144. "adcs r4, r4, r6\n\t"
  87145. #elif defined(__clang__)
  87146. "adcs r4, r6\n\t"
  87147. #else
  87148. "adc r4, r6\n\t"
  87149. #endif
  87150. "# Multiply m[0] and mu - Done\n\t"
  87151. "\n"
  87152. "L_sp_4096_mont_reduce_128_word_%=:\n\t"
  87153. "# a[i+j] += m[j] * mu\n\t"
  87154. "ldr r3, [%[a]]\n\t"
  87155. "ldm %[m]!, {%[mp]}\n\t"
  87156. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87157. "adds r3, r3, r4\n\t"
  87158. #else
  87159. "add r3, r3, r4\n\t"
  87160. #endif
  87161. "movs r4, #0\n\t"
  87162. #ifdef WOLFSSL_KEIL
  87163. "adcs r4, r4, r7\n\t"
  87164. #elif defined(__clang__)
  87165. "adcs r4, r7\n\t"
  87166. #else
  87167. "adc r4, r7\n\t"
  87168. #endif
  87169. "# Multiply m[j] and mu - Start\n\t"
  87170. "mov r5, r10\n\t"
  87171. "uxth r6, %[mp]\n\t"
  87172. "uxth r5, r5\n\t"
  87173. #ifdef WOLFSSL_KEIL
  87174. "muls r6, r5, r6\n\t"
  87175. #elif defined(__clang__)
  87176. "muls r6, r5\n\t"
  87177. #else
  87178. "mul r6, r5\n\t"
  87179. #endif
  87180. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87181. "adds r3, r3, r6\n\t"
  87182. #else
  87183. "add r3, r3, r6\n\t"
  87184. #endif
  87185. #ifdef WOLFSSL_KEIL
  87186. "adcs r4, r4, r7\n\t"
  87187. #elif defined(__clang__)
  87188. "adcs r4, r7\n\t"
  87189. #else
  87190. "adc r4, r7\n\t"
  87191. #endif
  87192. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87193. "lsrs r6, %[mp], #16\n\t"
  87194. #else
  87195. "lsr r6, %[mp], #16\n\t"
  87196. #endif
  87197. #ifdef WOLFSSL_KEIL
  87198. "muls r5, r6, r5\n\t"
  87199. #elif defined(__clang__)
  87200. "muls r5, r6\n\t"
  87201. #else
  87202. "mul r5, r6\n\t"
  87203. #endif
  87204. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87205. "lsrs r6, r5, #16\n\t"
  87206. #else
  87207. "lsr r6, r5, #16\n\t"
  87208. #endif
  87209. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87210. "lsls r5, r5, #16\n\t"
  87211. #else
  87212. "lsl r5, r5, #16\n\t"
  87213. #endif
  87214. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87215. "adds r3, r3, r5\n\t"
  87216. #else
  87217. "add r3, r3, r5\n\t"
  87218. #endif
  87219. #ifdef WOLFSSL_KEIL
  87220. "adcs r4, r4, r6\n\t"
  87221. #elif defined(__clang__)
  87222. "adcs r4, r6\n\t"
  87223. #else
  87224. "adc r4, r6\n\t"
  87225. #endif
  87226. "mov r5, r10\n\t"
  87227. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87228. "lsrs r6, %[mp], #16\n\t"
  87229. #else
  87230. "lsr r6, %[mp], #16\n\t"
  87231. #endif
  87232. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87233. "lsrs r5, r5, #16\n\t"
  87234. #else
  87235. "lsr r5, r5, #16\n\t"
  87236. #endif
  87237. #ifdef WOLFSSL_KEIL
  87238. "muls r6, r5, r6\n\t"
  87239. #elif defined(__clang__)
  87240. "muls r6, r5\n\t"
  87241. #else
  87242. "mul r6, r5\n\t"
  87243. #endif
  87244. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87245. "adds r4, r4, r6\n\t"
  87246. #else
  87247. "add r4, r4, r6\n\t"
  87248. #endif
  87249. "uxth r6, %[mp]\n\t"
  87250. #ifdef WOLFSSL_KEIL
  87251. "muls r5, r6, r5\n\t"
  87252. #elif defined(__clang__)
  87253. "muls r5, r6\n\t"
  87254. #else
  87255. "mul r5, r6\n\t"
  87256. #endif
  87257. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87258. "lsrs r6, r5, #16\n\t"
  87259. #else
  87260. "lsr r6, r5, #16\n\t"
  87261. #endif
  87262. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87263. "lsls r5, r5, #16\n\t"
  87264. #else
  87265. "lsl r5, r5, #16\n\t"
  87266. #endif
  87267. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87268. "adds r3, r3, r5\n\t"
  87269. #else
  87270. "add r3, r3, r5\n\t"
  87271. #endif
  87272. #ifdef WOLFSSL_KEIL
  87273. "adcs r4, r4, r6\n\t"
  87274. #elif defined(__clang__)
  87275. "adcs r4, r6\n\t"
  87276. #else
  87277. "adc r4, r6\n\t"
  87278. #endif
  87279. "# Multiply m[j] and mu - Done\n\t"
  87280. "stm %[a]!, {r3}\n\t"
  87281. "cmp %[a], r9\n\t"
  87282. "blt L_sp_4096_mont_reduce_128_word_%=\n\t"
  87283. "# a[i+127] += m[127] * mu\n\t"
  87284. "ldr %[mp], [%[m]]\n\t"
  87285. "mov r3, r12\n\t"
  87286. "# Multiply m[127] and mu - Start\n\t"
  87287. "mov r5, r10\n\t"
  87288. "uxth r6, %[mp]\n\t"
  87289. "uxth r5, r5\n\t"
  87290. #ifdef WOLFSSL_KEIL
  87291. "muls r6, r5, r6\n\t"
  87292. #elif defined(__clang__)
  87293. "muls r6, r5\n\t"
  87294. #else
  87295. "mul r6, r5\n\t"
  87296. #endif
  87297. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87298. "adds r4, r4, r6\n\t"
  87299. #else
  87300. "add r4, r4, r6\n\t"
  87301. #endif
  87302. #ifdef WOLFSSL_KEIL
  87303. "adcs r3, r3, r7\n\t"
  87304. #elif defined(__clang__)
  87305. "adcs r3, r7\n\t"
  87306. #else
  87307. "adc r3, r7\n\t"
  87308. #endif
  87309. #ifdef WOLFSSL_KEIL
  87310. "adcs r7, r7, r7\n\t"
  87311. #elif defined(__clang__)
  87312. "adcs r7, r7\n\t"
  87313. #else
  87314. "adc r7, r7\n\t"
  87315. #endif
  87316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87317. "lsrs r6, %[mp], #16\n\t"
  87318. #else
  87319. "lsr r6, %[mp], #16\n\t"
  87320. #endif
  87321. #ifdef WOLFSSL_KEIL
  87322. "muls r5, r6, r5\n\t"
  87323. #elif defined(__clang__)
  87324. "muls r5, r6\n\t"
  87325. #else
  87326. "mul r5, r6\n\t"
  87327. #endif
  87328. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87329. "lsrs r6, r5, #16\n\t"
  87330. #else
  87331. "lsr r6, r5, #16\n\t"
  87332. #endif
  87333. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87334. "lsls r5, r5, #16\n\t"
  87335. #else
  87336. "lsl r5, r5, #16\n\t"
  87337. #endif
  87338. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87339. "adds r4, r4, r5\n\t"
  87340. #else
  87341. "add r4, r4, r5\n\t"
  87342. #endif
  87343. #ifdef WOLFSSL_KEIL
  87344. "adcs r3, r3, r6\n\t"
  87345. #elif defined(__clang__)
  87346. "adcs r3, r6\n\t"
  87347. #else
  87348. "adc r3, r6\n\t"
  87349. #endif
  87350. #ifdef WOLFSSL_KEIL
  87351. "adcs r7, r7, r7\n\t"
  87352. #elif defined(__clang__)
  87353. "adcs r7, r7\n\t"
  87354. #else
  87355. "adc r7, r7\n\t"
  87356. #endif
  87357. "mov r5, r10\n\t"
  87358. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87359. "lsrs r6, %[mp], #16\n\t"
  87360. #else
  87361. "lsr r6, %[mp], #16\n\t"
  87362. #endif
  87363. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87364. "lsrs r5, r5, #16\n\t"
  87365. #else
  87366. "lsr r5, r5, #16\n\t"
  87367. #endif
  87368. #ifdef WOLFSSL_KEIL
  87369. "muls r6, r5, r6\n\t"
  87370. #elif defined(__clang__)
  87371. "muls r6, r5\n\t"
  87372. #else
  87373. "mul r6, r5\n\t"
  87374. #endif
  87375. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87376. "adds r3, r3, r6\n\t"
  87377. #else
  87378. "add r3, r3, r6\n\t"
  87379. #endif
  87380. #ifdef WOLFSSL_KEIL
  87381. "adcs r7, r7, r7\n\t"
  87382. #elif defined(__clang__)
  87383. "adcs r7, r7\n\t"
  87384. #else
  87385. "adc r7, r7\n\t"
  87386. #endif
  87387. "uxth r6, %[mp]\n\t"
  87388. #ifdef WOLFSSL_KEIL
  87389. "muls r5, r6, r5\n\t"
  87390. #elif defined(__clang__)
  87391. "muls r5, r6\n\t"
  87392. #else
  87393. "mul r5, r6\n\t"
  87394. #endif
  87395. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87396. "lsrs r6, r5, #16\n\t"
  87397. #else
  87398. "lsr r6, r5, #16\n\t"
  87399. #endif
  87400. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87401. "lsls r5, r5, #16\n\t"
  87402. #else
  87403. "lsl r5, r5, #16\n\t"
  87404. #endif
  87405. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87406. "adds r4, r4, r5\n\t"
  87407. #else
  87408. "add r4, r4, r5\n\t"
  87409. #endif
  87410. #ifdef WOLFSSL_KEIL
  87411. "adcs r3, r3, r6\n\t"
  87412. #elif defined(__clang__)
  87413. "adcs r3, r6\n\t"
  87414. #else
  87415. "adc r3, r6\n\t"
  87416. #endif
  87417. #ifdef WOLFSSL_KEIL
  87418. "adcs r7, r7, r7\n\t"
  87419. #elif defined(__clang__)
  87420. "adcs r7, r7\n\t"
  87421. #else
  87422. "adc r7, r7\n\t"
  87423. #endif
  87424. "# Multiply m[127] and mu - Done\n\t"
  87425. "ldr r5, [%[a]]\n\t"
  87426. "ldr r6, [%[a], #4]\n\t"
  87427. "movs %[mp], #0\n\t"
  87428. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87429. "adds r5, r5, r4\n\t"
  87430. #else
  87431. "add r5, r5, r4\n\t"
  87432. #endif
  87433. #ifdef WOLFSSL_KEIL
  87434. "adcs r6, r6, r3\n\t"
  87435. #elif defined(__clang__)
  87436. "adcs r6, r3\n\t"
  87437. #else
  87438. "adc r6, r3\n\t"
  87439. #endif
  87440. #ifdef WOLFSSL_KEIL
  87441. "adcs r7, r7, %[mp]\n\t"
  87442. #elif defined(__clang__)
  87443. "adcs r7, %[mp]\n\t"
  87444. #else
  87445. "adc r7, %[mp]\n\t"
  87446. #endif
  87447. "stm %[a]!, {r5, r6}\n\t"
  87448. "# i += 1\n\t"
  87449. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87450. "subs %[a], %[a], #4\n\t"
  87451. #else
  87452. "sub %[a], %[a], #4\n\t"
  87453. #endif
  87454. "movs r3, #0xff\n\t"
  87455. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87456. "adds r3, r3, #0xfd\n\t"
  87457. #else
  87458. "add r3, r3, #0xfd\n\t"
  87459. #endif
  87460. "mov r9, %[a]\n\t"
  87461. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87462. "subs %[a], %[a], r3\n\t"
  87463. #else
  87464. "sub %[a], %[a], r3\n\t"
  87465. #endif
  87466. "mov r12, r7\n\t"
  87467. "mov %[m], lr\n\t"
  87468. "cmp r11, %[a]\n\t"
  87469. "bgt L_sp_4096_mont_reduce_128_mod_%=\n\t"
  87470. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87471. "negs r7, r7\n\t"
  87472. #else
  87473. "neg r7, r7\n\t"
  87474. #endif
  87475. "# Subtract masked modulus\n\t"
  87476. "movs r4, #2\n\t"
  87477. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87478. "lsls r4, r4, #8\n\t"
  87479. #else
  87480. "lsl r4, r4, #8\n\t"
  87481. #endif
  87482. "movs %[mp], #0\n\t"
  87483. "movs r3, #0\n\t"
  87484. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87485. "subs %[a], %[a], r4\n\t"
  87486. #else
  87487. "sub %[a], %[a], r4\n\t"
  87488. #endif
  87489. #ifndef WOLFSSL_SP_LARGE_CODE
  87490. "\n"
  87491. "L_sp_4096_mont_reduce_128_sub_mask_%=:\n\t"
  87492. "ldm %[m]!, {r6}\n\t"
  87493. "movs r5, #0\n\t"
  87494. #ifdef WOLFSSL_KEIL
  87495. "ands r6, r6, r7\n\t"
  87496. #elif defined(__clang__)
  87497. "ands r6, r7\n\t"
  87498. #else
  87499. "and r6, r7\n\t"
  87500. #endif
  87501. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87502. "subs r5, r5, %[mp]\n\t"
  87503. #else
  87504. "sub r5, r5, %[mp]\n\t"
  87505. #endif
  87506. "ldr r5, [%[a], r4]\n\t"
  87507. #ifdef WOLFSSL_KEIL
  87508. "sbcs r5, r5, r6\n\t"
  87509. #elif defined(__clang__)
  87510. "sbcs r5, r6\n\t"
  87511. #else
  87512. "sbc r5, r6\n\t"
  87513. #endif
  87514. #ifdef WOLFSSL_KEIL
  87515. "sbcs %[mp], %[mp], %[mp]\n\t"
  87516. #elif defined(__clang__)
  87517. "sbcs %[mp], %[mp]\n\t"
  87518. #else
  87519. "sbc %[mp], %[mp]\n\t"
  87520. #endif
  87521. "stm %[a]!, {r5}\n\t"
  87522. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87523. "adds r3, r3, #4\n\t"
  87524. #else
  87525. "add r3, r3, #4\n\t"
  87526. #endif
  87527. "cmp r3, r4\n\t"
  87528. "blt L_sp_4096_mont_reduce_128_sub_mask_%=\n\t"
  87529. #else /* WOLFSSL_SP_LARGE_CODE */
  87530. "ldm %[m]!, {r6}\n\t"
  87531. #ifdef WOLFSSL_KEIL
  87532. "ands r6, r6, r7\n\t"
  87533. #elif defined(__clang__)
  87534. "ands r6, r7\n\t"
  87535. #else
  87536. "and r6, r7\n\t"
  87537. #endif
  87538. "ldr r5, [%[a], r4]\n\t"
  87539. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87540. "subs r5, r5, r6\n\t"
  87541. #else
  87542. "sub r5, r5, r6\n\t"
  87543. #endif
  87544. "stm %[a]!, {r5}\n\t"
  87545. "ldm %[m]!, {r6}\n\t"
  87546. #ifdef WOLFSSL_KEIL
  87547. "ands r6, r6, r7\n\t"
  87548. #elif defined(__clang__)
  87549. "ands r6, r7\n\t"
  87550. #else
  87551. "and r6, r7\n\t"
  87552. #endif
  87553. "ldr r5, [%[a], r4]\n\t"
  87554. #ifdef WOLFSSL_KEIL
  87555. "sbcs r5, r5, r6\n\t"
  87556. #elif defined(__clang__)
  87557. "sbcs r5, r6\n\t"
  87558. #else
  87559. "sbc r5, r6\n\t"
  87560. #endif
  87561. "stm %[a]!, {r5}\n\t"
  87562. "ldm %[m]!, {r6}\n\t"
  87563. #ifdef WOLFSSL_KEIL
  87564. "ands r6, r6, r7\n\t"
  87565. #elif defined(__clang__)
  87566. "ands r6, r7\n\t"
  87567. #else
  87568. "and r6, r7\n\t"
  87569. #endif
  87570. "ldr r5, [%[a], r4]\n\t"
  87571. #ifdef WOLFSSL_KEIL
  87572. "sbcs r5, r5, r6\n\t"
  87573. #elif defined(__clang__)
  87574. "sbcs r5, r6\n\t"
  87575. #else
  87576. "sbc r5, r6\n\t"
  87577. #endif
  87578. "stm %[a]!, {r5}\n\t"
  87579. "ldm %[m]!, {r6}\n\t"
  87580. #ifdef WOLFSSL_KEIL
  87581. "ands r6, r6, r7\n\t"
  87582. #elif defined(__clang__)
  87583. "ands r6, r7\n\t"
  87584. #else
  87585. "and r6, r7\n\t"
  87586. #endif
  87587. "ldr r5, [%[a], r4]\n\t"
  87588. #ifdef WOLFSSL_KEIL
  87589. "sbcs r5, r5, r6\n\t"
  87590. #elif defined(__clang__)
  87591. "sbcs r5, r6\n\t"
  87592. #else
  87593. "sbc r5, r6\n\t"
  87594. #endif
  87595. "stm %[a]!, {r5}\n\t"
  87596. "ldm %[m]!, {r6}\n\t"
  87597. #ifdef WOLFSSL_KEIL
  87598. "ands r6, r6, r7\n\t"
  87599. #elif defined(__clang__)
  87600. "ands r6, r7\n\t"
  87601. #else
  87602. "and r6, r7\n\t"
  87603. #endif
  87604. "ldr r5, [%[a], r4]\n\t"
  87605. #ifdef WOLFSSL_KEIL
  87606. "sbcs r5, r5, r6\n\t"
  87607. #elif defined(__clang__)
  87608. "sbcs r5, r6\n\t"
  87609. #else
  87610. "sbc r5, r6\n\t"
  87611. #endif
  87612. "stm %[a]!, {r5}\n\t"
  87613. "ldm %[m]!, {r6}\n\t"
  87614. #ifdef WOLFSSL_KEIL
  87615. "ands r6, r6, r7\n\t"
  87616. #elif defined(__clang__)
  87617. "ands r6, r7\n\t"
  87618. #else
  87619. "and r6, r7\n\t"
  87620. #endif
  87621. "ldr r5, [%[a], r4]\n\t"
  87622. #ifdef WOLFSSL_KEIL
  87623. "sbcs r5, r5, r6\n\t"
  87624. #elif defined(__clang__)
  87625. "sbcs r5, r6\n\t"
  87626. #else
  87627. "sbc r5, r6\n\t"
  87628. #endif
  87629. "stm %[a]!, {r5}\n\t"
  87630. "ldm %[m]!, {r6}\n\t"
  87631. #ifdef WOLFSSL_KEIL
  87632. "ands r6, r6, r7\n\t"
  87633. #elif defined(__clang__)
  87634. "ands r6, r7\n\t"
  87635. #else
  87636. "and r6, r7\n\t"
  87637. #endif
  87638. "ldr r5, [%[a], r4]\n\t"
  87639. #ifdef WOLFSSL_KEIL
  87640. "sbcs r5, r5, r6\n\t"
  87641. #elif defined(__clang__)
  87642. "sbcs r5, r6\n\t"
  87643. #else
  87644. "sbc r5, r6\n\t"
  87645. #endif
  87646. "stm %[a]!, {r5}\n\t"
  87647. "ldm %[m]!, {r6}\n\t"
  87648. #ifdef WOLFSSL_KEIL
  87649. "ands r6, r6, r7\n\t"
  87650. #elif defined(__clang__)
  87651. "ands r6, r7\n\t"
  87652. #else
  87653. "and r6, r7\n\t"
  87654. #endif
  87655. "ldr r5, [%[a], r4]\n\t"
  87656. #ifdef WOLFSSL_KEIL
  87657. "sbcs r5, r5, r6\n\t"
  87658. #elif defined(__clang__)
  87659. "sbcs r5, r6\n\t"
  87660. #else
  87661. "sbc r5, r6\n\t"
  87662. #endif
  87663. "stm %[a]!, {r5}\n\t"
  87664. "ldm %[m]!, {r6}\n\t"
  87665. #ifdef WOLFSSL_KEIL
  87666. "ands r6, r6, r7\n\t"
  87667. #elif defined(__clang__)
  87668. "ands r6, r7\n\t"
  87669. #else
  87670. "and r6, r7\n\t"
  87671. #endif
  87672. "ldr r5, [%[a], r4]\n\t"
  87673. #ifdef WOLFSSL_KEIL
  87674. "sbcs r5, r5, r6\n\t"
  87675. #elif defined(__clang__)
  87676. "sbcs r5, r6\n\t"
  87677. #else
  87678. "sbc r5, r6\n\t"
  87679. #endif
  87680. "stm %[a]!, {r5}\n\t"
  87681. "ldm %[m]!, {r6}\n\t"
  87682. #ifdef WOLFSSL_KEIL
  87683. "ands r6, r6, r7\n\t"
  87684. #elif defined(__clang__)
  87685. "ands r6, r7\n\t"
  87686. #else
  87687. "and r6, r7\n\t"
  87688. #endif
  87689. "ldr r5, [%[a], r4]\n\t"
  87690. #ifdef WOLFSSL_KEIL
  87691. "sbcs r5, r5, r6\n\t"
  87692. #elif defined(__clang__)
  87693. "sbcs r5, r6\n\t"
  87694. #else
  87695. "sbc r5, r6\n\t"
  87696. #endif
  87697. "stm %[a]!, {r5}\n\t"
  87698. "ldm %[m]!, {r6}\n\t"
  87699. #ifdef WOLFSSL_KEIL
  87700. "ands r6, r6, r7\n\t"
  87701. #elif defined(__clang__)
  87702. "ands r6, r7\n\t"
  87703. #else
  87704. "and r6, r7\n\t"
  87705. #endif
  87706. "ldr r5, [%[a], r4]\n\t"
  87707. #ifdef WOLFSSL_KEIL
  87708. "sbcs r5, r5, r6\n\t"
  87709. #elif defined(__clang__)
  87710. "sbcs r5, r6\n\t"
  87711. #else
  87712. "sbc r5, r6\n\t"
  87713. #endif
  87714. "stm %[a]!, {r5}\n\t"
  87715. "ldm %[m]!, {r6}\n\t"
  87716. #ifdef WOLFSSL_KEIL
  87717. "ands r6, r6, r7\n\t"
  87718. #elif defined(__clang__)
  87719. "ands r6, r7\n\t"
  87720. #else
  87721. "and r6, r7\n\t"
  87722. #endif
  87723. "ldr r5, [%[a], r4]\n\t"
  87724. #ifdef WOLFSSL_KEIL
  87725. "sbcs r5, r5, r6\n\t"
  87726. #elif defined(__clang__)
  87727. "sbcs r5, r6\n\t"
  87728. #else
  87729. "sbc r5, r6\n\t"
  87730. #endif
  87731. "stm %[a]!, {r5}\n\t"
  87732. "ldm %[m]!, {r6}\n\t"
  87733. #ifdef WOLFSSL_KEIL
  87734. "ands r6, r6, r7\n\t"
  87735. #elif defined(__clang__)
  87736. "ands r6, r7\n\t"
  87737. #else
  87738. "and r6, r7\n\t"
  87739. #endif
  87740. "ldr r5, [%[a], r4]\n\t"
  87741. #ifdef WOLFSSL_KEIL
  87742. "sbcs r5, r5, r6\n\t"
  87743. #elif defined(__clang__)
  87744. "sbcs r5, r6\n\t"
  87745. #else
  87746. "sbc r5, r6\n\t"
  87747. #endif
  87748. "stm %[a]!, {r5}\n\t"
  87749. "ldm %[m]!, {r6}\n\t"
  87750. #ifdef WOLFSSL_KEIL
  87751. "ands r6, r6, r7\n\t"
  87752. #elif defined(__clang__)
  87753. "ands r6, r7\n\t"
  87754. #else
  87755. "and r6, r7\n\t"
  87756. #endif
  87757. "ldr r5, [%[a], r4]\n\t"
  87758. #ifdef WOLFSSL_KEIL
  87759. "sbcs r5, r5, r6\n\t"
  87760. #elif defined(__clang__)
  87761. "sbcs r5, r6\n\t"
  87762. #else
  87763. "sbc r5, r6\n\t"
  87764. #endif
  87765. "stm %[a]!, {r5}\n\t"
  87766. "ldm %[m]!, {r6}\n\t"
  87767. #ifdef WOLFSSL_KEIL
  87768. "ands r6, r6, r7\n\t"
  87769. #elif defined(__clang__)
  87770. "ands r6, r7\n\t"
  87771. #else
  87772. "and r6, r7\n\t"
  87773. #endif
  87774. "ldr r5, [%[a], r4]\n\t"
  87775. #ifdef WOLFSSL_KEIL
  87776. "sbcs r5, r5, r6\n\t"
  87777. #elif defined(__clang__)
  87778. "sbcs r5, r6\n\t"
  87779. #else
  87780. "sbc r5, r6\n\t"
  87781. #endif
  87782. "stm %[a]!, {r5}\n\t"
  87783. "ldm %[m]!, {r6}\n\t"
  87784. #ifdef WOLFSSL_KEIL
  87785. "ands r6, r6, r7\n\t"
  87786. #elif defined(__clang__)
  87787. "ands r6, r7\n\t"
  87788. #else
  87789. "and r6, r7\n\t"
  87790. #endif
  87791. "ldr r5, [%[a], r4]\n\t"
  87792. #ifdef WOLFSSL_KEIL
  87793. "sbcs r5, r5, r6\n\t"
  87794. #elif defined(__clang__)
  87795. "sbcs r5, r6\n\t"
  87796. #else
  87797. "sbc r5, r6\n\t"
  87798. #endif
  87799. "stm %[a]!, {r5}\n\t"
  87800. "ldm %[m]!, {r6}\n\t"
  87801. #ifdef WOLFSSL_KEIL
  87802. "ands r6, r6, r7\n\t"
  87803. #elif defined(__clang__)
  87804. "ands r6, r7\n\t"
  87805. #else
  87806. "and r6, r7\n\t"
  87807. #endif
  87808. "ldr r5, [%[a], r4]\n\t"
  87809. #ifdef WOLFSSL_KEIL
  87810. "sbcs r5, r5, r6\n\t"
  87811. #elif defined(__clang__)
  87812. "sbcs r5, r6\n\t"
  87813. #else
  87814. "sbc r5, r6\n\t"
  87815. #endif
  87816. "stm %[a]!, {r5}\n\t"
  87817. "ldm %[m]!, {r6}\n\t"
  87818. #ifdef WOLFSSL_KEIL
  87819. "ands r6, r6, r7\n\t"
  87820. #elif defined(__clang__)
  87821. "ands r6, r7\n\t"
  87822. #else
  87823. "and r6, r7\n\t"
  87824. #endif
  87825. "ldr r5, [%[a], r4]\n\t"
  87826. #ifdef WOLFSSL_KEIL
  87827. "sbcs r5, r5, r6\n\t"
  87828. #elif defined(__clang__)
  87829. "sbcs r5, r6\n\t"
  87830. #else
  87831. "sbc r5, r6\n\t"
  87832. #endif
  87833. "stm %[a]!, {r5}\n\t"
  87834. "ldm %[m]!, {r6}\n\t"
  87835. #ifdef WOLFSSL_KEIL
  87836. "ands r6, r6, r7\n\t"
  87837. #elif defined(__clang__)
  87838. "ands r6, r7\n\t"
  87839. #else
  87840. "and r6, r7\n\t"
  87841. #endif
  87842. "ldr r5, [%[a], r4]\n\t"
  87843. #ifdef WOLFSSL_KEIL
  87844. "sbcs r5, r5, r6\n\t"
  87845. #elif defined(__clang__)
  87846. "sbcs r5, r6\n\t"
  87847. #else
  87848. "sbc r5, r6\n\t"
  87849. #endif
  87850. "stm %[a]!, {r5}\n\t"
  87851. "ldm %[m]!, {r6}\n\t"
  87852. #ifdef WOLFSSL_KEIL
  87853. "ands r6, r6, r7\n\t"
  87854. #elif defined(__clang__)
  87855. "ands r6, r7\n\t"
  87856. #else
  87857. "and r6, r7\n\t"
  87858. #endif
  87859. "ldr r5, [%[a], r4]\n\t"
  87860. #ifdef WOLFSSL_KEIL
  87861. "sbcs r5, r5, r6\n\t"
  87862. #elif defined(__clang__)
  87863. "sbcs r5, r6\n\t"
  87864. #else
  87865. "sbc r5, r6\n\t"
  87866. #endif
  87867. "stm %[a]!, {r5}\n\t"
  87868. "ldm %[m]!, {r6}\n\t"
  87869. #ifdef WOLFSSL_KEIL
  87870. "ands r6, r6, r7\n\t"
  87871. #elif defined(__clang__)
  87872. "ands r6, r7\n\t"
  87873. #else
  87874. "and r6, r7\n\t"
  87875. #endif
  87876. "ldr r5, [%[a], r4]\n\t"
  87877. #ifdef WOLFSSL_KEIL
  87878. "sbcs r5, r5, r6\n\t"
  87879. #elif defined(__clang__)
  87880. "sbcs r5, r6\n\t"
  87881. #else
  87882. "sbc r5, r6\n\t"
  87883. #endif
  87884. "stm %[a]!, {r5}\n\t"
  87885. "ldm %[m]!, {r6}\n\t"
  87886. #ifdef WOLFSSL_KEIL
  87887. "ands r6, r6, r7\n\t"
  87888. #elif defined(__clang__)
  87889. "ands r6, r7\n\t"
  87890. #else
  87891. "and r6, r7\n\t"
  87892. #endif
  87893. "ldr r5, [%[a], r4]\n\t"
  87894. #ifdef WOLFSSL_KEIL
  87895. "sbcs r5, r5, r6\n\t"
  87896. #elif defined(__clang__)
  87897. "sbcs r5, r6\n\t"
  87898. #else
  87899. "sbc r5, r6\n\t"
  87900. #endif
  87901. "stm %[a]!, {r5}\n\t"
  87902. "ldm %[m]!, {r6}\n\t"
  87903. #ifdef WOLFSSL_KEIL
  87904. "ands r6, r6, r7\n\t"
  87905. #elif defined(__clang__)
  87906. "ands r6, r7\n\t"
  87907. #else
  87908. "and r6, r7\n\t"
  87909. #endif
  87910. "ldr r5, [%[a], r4]\n\t"
  87911. #ifdef WOLFSSL_KEIL
  87912. "sbcs r5, r5, r6\n\t"
  87913. #elif defined(__clang__)
  87914. "sbcs r5, r6\n\t"
  87915. #else
  87916. "sbc r5, r6\n\t"
  87917. #endif
  87918. "stm %[a]!, {r5}\n\t"
  87919. "ldm %[m]!, {r6}\n\t"
  87920. #ifdef WOLFSSL_KEIL
  87921. "ands r6, r6, r7\n\t"
  87922. #elif defined(__clang__)
  87923. "ands r6, r7\n\t"
  87924. #else
  87925. "and r6, r7\n\t"
  87926. #endif
  87927. "ldr r5, [%[a], r4]\n\t"
  87928. #ifdef WOLFSSL_KEIL
  87929. "sbcs r5, r5, r6\n\t"
  87930. #elif defined(__clang__)
  87931. "sbcs r5, r6\n\t"
  87932. #else
  87933. "sbc r5, r6\n\t"
  87934. #endif
  87935. "stm %[a]!, {r5}\n\t"
  87936. "ldm %[m]!, {r6}\n\t"
  87937. #ifdef WOLFSSL_KEIL
  87938. "ands r6, r6, r7\n\t"
  87939. #elif defined(__clang__)
  87940. "ands r6, r7\n\t"
  87941. #else
  87942. "and r6, r7\n\t"
  87943. #endif
  87944. "ldr r5, [%[a], r4]\n\t"
  87945. #ifdef WOLFSSL_KEIL
  87946. "sbcs r5, r5, r6\n\t"
  87947. #elif defined(__clang__)
  87948. "sbcs r5, r6\n\t"
  87949. #else
  87950. "sbc r5, r6\n\t"
  87951. #endif
  87952. "stm %[a]!, {r5}\n\t"
  87953. "ldm %[m]!, {r6}\n\t"
  87954. #ifdef WOLFSSL_KEIL
  87955. "ands r6, r6, r7\n\t"
  87956. #elif defined(__clang__)
  87957. "ands r6, r7\n\t"
  87958. #else
  87959. "and r6, r7\n\t"
  87960. #endif
  87961. "ldr r5, [%[a], r4]\n\t"
  87962. #ifdef WOLFSSL_KEIL
  87963. "sbcs r5, r5, r6\n\t"
  87964. #elif defined(__clang__)
  87965. "sbcs r5, r6\n\t"
  87966. #else
  87967. "sbc r5, r6\n\t"
  87968. #endif
  87969. "stm %[a]!, {r5}\n\t"
  87970. "ldm %[m]!, {r6}\n\t"
  87971. #ifdef WOLFSSL_KEIL
  87972. "ands r6, r6, r7\n\t"
  87973. #elif defined(__clang__)
  87974. "ands r6, r7\n\t"
  87975. #else
  87976. "and r6, r7\n\t"
  87977. #endif
  87978. "ldr r5, [%[a], r4]\n\t"
  87979. #ifdef WOLFSSL_KEIL
  87980. "sbcs r5, r5, r6\n\t"
  87981. #elif defined(__clang__)
  87982. "sbcs r5, r6\n\t"
  87983. #else
  87984. "sbc r5, r6\n\t"
  87985. #endif
  87986. "stm %[a]!, {r5}\n\t"
  87987. "ldm %[m]!, {r6}\n\t"
  87988. #ifdef WOLFSSL_KEIL
  87989. "ands r6, r6, r7\n\t"
  87990. #elif defined(__clang__)
  87991. "ands r6, r7\n\t"
  87992. #else
  87993. "and r6, r7\n\t"
  87994. #endif
  87995. "ldr r5, [%[a], r4]\n\t"
  87996. #ifdef WOLFSSL_KEIL
  87997. "sbcs r5, r5, r6\n\t"
  87998. #elif defined(__clang__)
  87999. "sbcs r5, r6\n\t"
  88000. #else
  88001. "sbc r5, r6\n\t"
  88002. #endif
  88003. "stm %[a]!, {r5}\n\t"
  88004. "ldm %[m]!, {r6}\n\t"
  88005. #ifdef WOLFSSL_KEIL
  88006. "ands r6, r6, r7\n\t"
  88007. #elif defined(__clang__)
  88008. "ands r6, r7\n\t"
  88009. #else
  88010. "and r6, r7\n\t"
  88011. #endif
  88012. "ldr r5, [%[a], r4]\n\t"
  88013. #ifdef WOLFSSL_KEIL
  88014. "sbcs r5, r5, r6\n\t"
  88015. #elif defined(__clang__)
  88016. "sbcs r5, r6\n\t"
  88017. #else
  88018. "sbc r5, r6\n\t"
  88019. #endif
  88020. "stm %[a]!, {r5}\n\t"
  88021. "ldm %[m]!, {r6}\n\t"
  88022. #ifdef WOLFSSL_KEIL
  88023. "ands r6, r6, r7\n\t"
  88024. #elif defined(__clang__)
  88025. "ands r6, r7\n\t"
  88026. #else
  88027. "and r6, r7\n\t"
  88028. #endif
  88029. "ldr r5, [%[a], r4]\n\t"
  88030. #ifdef WOLFSSL_KEIL
  88031. "sbcs r5, r5, r6\n\t"
  88032. #elif defined(__clang__)
  88033. "sbcs r5, r6\n\t"
  88034. #else
  88035. "sbc r5, r6\n\t"
  88036. #endif
  88037. "stm %[a]!, {r5}\n\t"
  88038. "ldm %[m]!, {r6}\n\t"
  88039. #ifdef WOLFSSL_KEIL
  88040. "ands r6, r6, r7\n\t"
  88041. #elif defined(__clang__)
  88042. "ands r6, r7\n\t"
  88043. #else
  88044. "and r6, r7\n\t"
  88045. #endif
  88046. "ldr r5, [%[a], r4]\n\t"
  88047. #ifdef WOLFSSL_KEIL
  88048. "sbcs r5, r5, r6\n\t"
  88049. #elif defined(__clang__)
  88050. "sbcs r5, r6\n\t"
  88051. #else
  88052. "sbc r5, r6\n\t"
  88053. #endif
  88054. "stm %[a]!, {r5}\n\t"
  88055. "ldm %[m]!, {r6}\n\t"
  88056. #ifdef WOLFSSL_KEIL
  88057. "ands r6, r6, r7\n\t"
  88058. #elif defined(__clang__)
  88059. "ands r6, r7\n\t"
  88060. #else
  88061. "and r6, r7\n\t"
  88062. #endif
  88063. "ldr r5, [%[a], r4]\n\t"
  88064. #ifdef WOLFSSL_KEIL
  88065. "sbcs r5, r5, r6\n\t"
  88066. #elif defined(__clang__)
  88067. "sbcs r5, r6\n\t"
  88068. #else
  88069. "sbc r5, r6\n\t"
  88070. #endif
  88071. "stm %[a]!, {r5}\n\t"
  88072. "ldm %[m]!, {r6}\n\t"
  88073. #ifdef WOLFSSL_KEIL
  88074. "ands r6, r6, r7\n\t"
  88075. #elif defined(__clang__)
  88076. "ands r6, r7\n\t"
  88077. #else
  88078. "and r6, r7\n\t"
  88079. #endif
  88080. "ldr r5, [%[a], r4]\n\t"
  88081. #ifdef WOLFSSL_KEIL
  88082. "sbcs r5, r5, r6\n\t"
  88083. #elif defined(__clang__)
  88084. "sbcs r5, r6\n\t"
  88085. #else
  88086. "sbc r5, r6\n\t"
  88087. #endif
  88088. "stm %[a]!, {r5}\n\t"
  88089. "ldm %[m]!, {r6}\n\t"
  88090. #ifdef WOLFSSL_KEIL
  88091. "ands r6, r6, r7\n\t"
  88092. #elif defined(__clang__)
  88093. "ands r6, r7\n\t"
  88094. #else
  88095. "and r6, r7\n\t"
  88096. #endif
  88097. "ldr r5, [%[a], r4]\n\t"
  88098. #ifdef WOLFSSL_KEIL
  88099. "sbcs r5, r5, r6\n\t"
  88100. #elif defined(__clang__)
  88101. "sbcs r5, r6\n\t"
  88102. #else
  88103. "sbc r5, r6\n\t"
  88104. #endif
  88105. "stm %[a]!, {r5}\n\t"
  88106. "ldm %[m]!, {r6}\n\t"
  88107. #ifdef WOLFSSL_KEIL
  88108. "ands r6, r6, r7\n\t"
  88109. #elif defined(__clang__)
  88110. "ands r6, r7\n\t"
  88111. #else
  88112. "and r6, r7\n\t"
  88113. #endif
  88114. "ldr r5, [%[a], r4]\n\t"
  88115. #ifdef WOLFSSL_KEIL
  88116. "sbcs r5, r5, r6\n\t"
  88117. #elif defined(__clang__)
  88118. "sbcs r5, r6\n\t"
  88119. #else
  88120. "sbc r5, r6\n\t"
  88121. #endif
  88122. "stm %[a]!, {r5}\n\t"
  88123. "ldm %[m]!, {r6}\n\t"
  88124. #ifdef WOLFSSL_KEIL
  88125. "ands r6, r6, r7\n\t"
  88126. #elif defined(__clang__)
  88127. "ands r6, r7\n\t"
  88128. #else
  88129. "and r6, r7\n\t"
  88130. #endif
  88131. "ldr r5, [%[a], r4]\n\t"
  88132. #ifdef WOLFSSL_KEIL
  88133. "sbcs r5, r5, r6\n\t"
  88134. #elif defined(__clang__)
  88135. "sbcs r5, r6\n\t"
  88136. #else
  88137. "sbc r5, r6\n\t"
  88138. #endif
  88139. "stm %[a]!, {r5}\n\t"
  88140. "ldm %[m]!, {r6}\n\t"
  88141. #ifdef WOLFSSL_KEIL
  88142. "ands r6, r6, r7\n\t"
  88143. #elif defined(__clang__)
  88144. "ands r6, r7\n\t"
  88145. #else
  88146. "and r6, r7\n\t"
  88147. #endif
  88148. "ldr r5, [%[a], r4]\n\t"
  88149. #ifdef WOLFSSL_KEIL
  88150. "sbcs r5, r5, r6\n\t"
  88151. #elif defined(__clang__)
  88152. "sbcs r5, r6\n\t"
  88153. #else
  88154. "sbc r5, r6\n\t"
  88155. #endif
  88156. "stm %[a]!, {r5}\n\t"
  88157. "ldm %[m]!, {r6}\n\t"
  88158. #ifdef WOLFSSL_KEIL
  88159. "ands r6, r6, r7\n\t"
  88160. #elif defined(__clang__)
  88161. "ands r6, r7\n\t"
  88162. #else
  88163. "and r6, r7\n\t"
  88164. #endif
  88165. "ldr r5, [%[a], r4]\n\t"
  88166. #ifdef WOLFSSL_KEIL
  88167. "sbcs r5, r5, r6\n\t"
  88168. #elif defined(__clang__)
  88169. "sbcs r5, r6\n\t"
  88170. #else
  88171. "sbc r5, r6\n\t"
  88172. #endif
  88173. "stm %[a]!, {r5}\n\t"
  88174. "ldm %[m]!, {r6}\n\t"
  88175. #ifdef WOLFSSL_KEIL
  88176. "ands r6, r6, r7\n\t"
  88177. #elif defined(__clang__)
  88178. "ands r6, r7\n\t"
  88179. #else
  88180. "and r6, r7\n\t"
  88181. #endif
  88182. "ldr r5, [%[a], r4]\n\t"
  88183. #ifdef WOLFSSL_KEIL
  88184. "sbcs r5, r5, r6\n\t"
  88185. #elif defined(__clang__)
  88186. "sbcs r5, r6\n\t"
  88187. #else
  88188. "sbc r5, r6\n\t"
  88189. #endif
  88190. "stm %[a]!, {r5}\n\t"
  88191. "ldm %[m]!, {r6}\n\t"
  88192. #ifdef WOLFSSL_KEIL
  88193. "ands r6, r6, r7\n\t"
  88194. #elif defined(__clang__)
  88195. "ands r6, r7\n\t"
  88196. #else
  88197. "and r6, r7\n\t"
  88198. #endif
  88199. "ldr r5, [%[a], r4]\n\t"
  88200. #ifdef WOLFSSL_KEIL
  88201. "sbcs r5, r5, r6\n\t"
  88202. #elif defined(__clang__)
  88203. "sbcs r5, r6\n\t"
  88204. #else
  88205. "sbc r5, r6\n\t"
  88206. #endif
  88207. "stm %[a]!, {r5}\n\t"
  88208. "ldm %[m]!, {r6}\n\t"
  88209. #ifdef WOLFSSL_KEIL
  88210. "ands r6, r6, r7\n\t"
  88211. #elif defined(__clang__)
  88212. "ands r6, r7\n\t"
  88213. #else
  88214. "and r6, r7\n\t"
  88215. #endif
  88216. "ldr r5, [%[a], r4]\n\t"
  88217. #ifdef WOLFSSL_KEIL
  88218. "sbcs r5, r5, r6\n\t"
  88219. #elif defined(__clang__)
  88220. "sbcs r5, r6\n\t"
  88221. #else
  88222. "sbc r5, r6\n\t"
  88223. #endif
  88224. "stm %[a]!, {r5}\n\t"
  88225. "ldm %[m]!, {r6}\n\t"
  88226. #ifdef WOLFSSL_KEIL
  88227. "ands r6, r6, r7\n\t"
  88228. #elif defined(__clang__)
  88229. "ands r6, r7\n\t"
  88230. #else
  88231. "and r6, r7\n\t"
  88232. #endif
  88233. "ldr r5, [%[a], r4]\n\t"
  88234. #ifdef WOLFSSL_KEIL
  88235. "sbcs r5, r5, r6\n\t"
  88236. #elif defined(__clang__)
  88237. "sbcs r5, r6\n\t"
  88238. #else
  88239. "sbc r5, r6\n\t"
  88240. #endif
  88241. "stm %[a]!, {r5}\n\t"
  88242. "ldm %[m]!, {r6}\n\t"
  88243. #ifdef WOLFSSL_KEIL
  88244. "ands r6, r6, r7\n\t"
  88245. #elif defined(__clang__)
  88246. "ands r6, r7\n\t"
  88247. #else
  88248. "and r6, r7\n\t"
  88249. #endif
  88250. "ldr r5, [%[a], r4]\n\t"
  88251. #ifdef WOLFSSL_KEIL
  88252. "sbcs r5, r5, r6\n\t"
  88253. #elif defined(__clang__)
  88254. "sbcs r5, r6\n\t"
  88255. #else
  88256. "sbc r5, r6\n\t"
  88257. #endif
  88258. "stm %[a]!, {r5}\n\t"
  88259. "ldm %[m]!, {r6}\n\t"
  88260. #ifdef WOLFSSL_KEIL
  88261. "ands r6, r6, r7\n\t"
  88262. #elif defined(__clang__)
  88263. "ands r6, r7\n\t"
  88264. #else
  88265. "and r6, r7\n\t"
  88266. #endif
  88267. "ldr r5, [%[a], r4]\n\t"
  88268. #ifdef WOLFSSL_KEIL
  88269. "sbcs r5, r5, r6\n\t"
  88270. #elif defined(__clang__)
  88271. "sbcs r5, r6\n\t"
  88272. #else
  88273. "sbc r5, r6\n\t"
  88274. #endif
  88275. "stm %[a]!, {r5}\n\t"
  88276. "ldm %[m]!, {r6}\n\t"
  88277. #ifdef WOLFSSL_KEIL
  88278. "ands r6, r6, r7\n\t"
  88279. #elif defined(__clang__)
  88280. "ands r6, r7\n\t"
  88281. #else
  88282. "and r6, r7\n\t"
  88283. #endif
  88284. "ldr r5, [%[a], r4]\n\t"
  88285. #ifdef WOLFSSL_KEIL
  88286. "sbcs r5, r5, r6\n\t"
  88287. #elif defined(__clang__)
  88288. "sbcs r5, r6\n\t"
  88289. #else
  88290. "sbc r5, r6\n\t"
  88291. #endif
  88292. "stm %[a]!, {r5}\n\t"
  88293. "ldm %[m]!, {r6}\n\t"
  88294. #ifdef WOLFSSL_KEIL
  88295. "ands r6, r6, r7\n\t"
  88296. #elif defined(__clang__)
  88297. "ands r6, r7\n\t"
  88298. #else
  88299. "and r6, r7\n\t"
  88300. #endif
  88301. "ldr r5, [%[a], r4]\n\t"
  88302. #ifdef WOLFSSL_KEIL
  88303. "sbcs r5, r5, r6\n\t"
  88304. #elif defined(__clang__)
  88305. "sbcs r5, r6\n\t"
  88306. #else
  88307. "sbc r5, r6\n\t"
  88308. #endif
  88309. "stm %[a]!, {r5}\n\t"
  88310. "ldm %[m]!, {r6}\n\t"
  88311. #ifdef WOLFSSL_KEIL
  88312. "ands r6, r6, r7\n\t"
  88313. #elif defined(__clang__)
  88314. "ands r6, r7\n\t"
  88315. #else
  88316. "and r6, r7\n\t"
  88317. #endif
  88318. "ldr r5, [%[a], r4]\n\t"
  88319. #ifdef WOLFSSL_KEIL
  88320. "sbcs r5, r5, r6\n\t"
  88321. #elif defined(__clang__)
  88322. "sbcs r5, r6\n\t"
  88323. #else
  88324. "sbc r5, r6\n\t"
  88325. #endif
  88326. "stm %[a]!, {r5}\n\t"
  88327. "ldm %[m]!, {r6}\n\t"
  88328. #ifdef WOLFSSL_KEIL
  88329. "ands r6, r6, r7\n\t"
  88330. #elif defined(__clang__)
  88331. "ands r6, r7\n\t"
  88332. #else
  88333. "and r6, r7\n\t"
  88334. #endif
  88335. "ldr r5, [%[a], r4]\n\t"
  88336. #ifdef WOLFSSL_KEIL
  88337. "sbcs r5, r5, r6\n\t"
  88338. #elif defined(__clang__)
  88339. "sbcs r5, r6\n\t"
  88340. #else
  88341. "sbc r5, r6\n\t"
  88342. #endif
  88343. "stm %[a]!, {r5}\n\t"
  88344. "ldm %[m]!, {r6}\n\t"
  88345. #ifdef WOLFSSL_KEIL
  88346. "ands r6, r6, r7\n\t"
  88347. #elif defined(__clang__)
  88348. "ands r6, r7\n\t"
  88349. #else
  88350. "and r6, r7\n\t"
  88351. #endif
  88352. "ldr r5, [%[a], r4]\n\t"
  88353. #ifdef WOLFSSL_KEIL
  88354. "sbcs r5, r5, r6\n\t"
  88355. #elif defined(__clang__)
  88356. "sbcs r5, r6\n\t"
  88357. #else
  88358. "sbc r5, r6\n\t"
  88359. #endif
  88360. "stm %[a]!, {r5}\n\t"
  88361. "ldm %[m]!, {r6}\n\t"
  88362. #ifdef WOLFSSL_KEIL
  88363. "ands r6, r6, r7\n\t"
  88364. #elif defined(__clang__)
  88365. "ands r6, r7\n\t"
  88366. #else
  88367. "and r6, r7\n\t"
  88368. #endif
  88369. "ldr r5, [%[a], r4]\n\t"
  88370. #ifdef WOLFSSL_KEIL
  88371. "sbcs r5, r5, r6\n\t"
  88372. #elif defined(__clang__)
  88373. "sbcs r5, r6\n\t"
  88374. #else
  88375. "sbc r5, r6\n\t"
  88376. #endif
  88377. "stm %[a]!, {r5}\n\t"
  88378. "ldm %[m]!, {r6}\n\t"
  88379. #ifdef WOLFSSL_KEIL
  88380. "ands r6, r6, r7\n\t"
  88381. #elif defined(__clang__)
  88382. "ands r6, r7\n\t"
  88383. #else
  88384. "and r6, r7\n\t"
  88385. #endif
  88386. "ldr r5, [%[a], r4]\n\t"
  88387. #ifdef WOLFSSL_KEIL
  88388. "sbcs r5, r5, r6\n\t"
  88389. #elif defined(__clang__)
  88390. "sbcs r5, r6\n\t"
  88391. #else
  88392. "sbc r5, r6\n\t"
  88393. #endif
  88394. "stm %[a]!, {r5}\n\t"
  88395. "ldm %[m]!, {r6}\n\t"
  88396. #ifdef WOLFSSL_KEIL
  88397. "ands r6, r6, r7\n\t"
  88398. #elif defined(__clang__)
  88399. "ands r6, r7\n\t"
  88400. #else
  88401. "and r6, r7\n\t"
  88402. #endif
  88403. "ldr r5, [%[a], r4]\n\t"
  88404. #ifdef WOLFSSL_KEIL
  88405. "sbcs r5, r5, r6\n\t"
  88406. #elif defined(__clang__)
  88407. "sbcs r5, r6\n\t"
  88408. #else
  88409. "sbc r5, r6\n\t"
  88410. #endif
  88411. "stm %[a]!, {r5}\n\t"
  88412. "ldm %[m]!, {r6}\n\t"
  88413. #ifdef WOLFSSL_KEIL
  88414. "ands r6, r6, r7\n\t"
  88415. #elif defined(__clang__)
  88416. "ands r6, r7\n\t"
  88417. #else
  88418. "and r6, r7\n\t"
  88419. #endif
  88420. "ldr r5, [%[a], r4]\n\t"
  88421. #ifdef WOLFSSL_KEIL
  88422. "sbcs r5, r5, r6\n\t"
  88423. #elif defined(__clang__)
  88424. "sbcs r5, r6\n\t"
  88425. #else
  88426. "sbc r5, r6\n\t"
  88427. #endif
  88428. "stm %[a]!, {r5}\n\t"
  88429. "ldm %[m]!, {r6}\n\t"
  88430. #ifdef WOLFSSL_KEIL
  88431. "ands r6, r6, r7\n\t"
  88432. #elif defined(__clang__)
  88433. "ands r6, r7\n\t"
  88434. #else
  88435. "and r6, r7\n\t"
  88436. #endif
  88437. "ldr r5, [%[a], r4]\n\t"
  88438. #ifdef WOLFSSL_KEIL
  88439. "sbcs r5, r5, r6\n\t"
  88440. #elif defined(__clang__)
  88441. "sbcs r5, r6\n\t"
  88442. #else
  88443. "sbc r5, r6\n\t"
  88444. #endif
  88445. "stm %[a]!, {r5}\n\t"
  88446. "ldm %[m]!, {r6}\n\t"
  88447. #ifdef WOLFSSL_KEIL
  88448. "ands r6, r6, r7\n\t"
  88449. #elif defined(__clang__)
  88450. "ands r6, r7\n\t"
  88451. #else
  88452. "and r6, r7\n\t"
  88453. #endif
  88454. "ldr r5, [%[a], r4]\n\t"
  88455. #ifdef WOLFSSL_KEIL
  88456. "sbcs r5, r5, r6\n\t"
  88457. #elif defined(__clang__)
  88458. "sbcs r5, r6\n\t"
  88459. #else
  88460. "sbc r5, r6\n\t"
  88461. #endif
  88462. "stm %[a]!, {r5}\n\t"
  88463. "ldm %[m]!, {r6}\n\t"
  88464. #ifdef WOLFSSL_KEIL
  88465. "ands r6, r6, r7\n\t"
  88466. #elif defined(__clang__)
  88467. "ands r6, r7\n\t"
  88468. #else
  88469. "and r6, r7\n\t"
  88470. #endif
  88471. "ldr r5, [%[a], r4]\n\t"
  88472. #ifdef WOLFSSL_KEIL
  88473. "sbcs r5, r5, r6\n\t"
  88474. #elif defined(__clang__)
  88475. "sbcs r5, r6\n\t"
  88476. #else
  88477. "sbc r5, r6\n\t"
  88478. #endif
  88479. "stm %[a]!, {r5}\n\t"
  88480. "ldm %[m]!, {r6}\n\t"
  88481. #ifdef WOLFSSL_KEIL
  88482. "ands r6, r6, r7\n\t"
  88483. #elif defined(__clang__)
  88484. "ands r6, r7\n\t"
  88485. #else
  88486. "and r6, r7\n\t"
  88487. #endif
  88488. "ldr r5, [%[a], r4]\n\t"
  88489. #ifdef WOLFSSL_KEIL
  88490. "sbcs r5, r5, r6\n\t"
  88491. #elif defined(__clang__)
  88492. "sbcs r5, r6\n\t"
  88493. #else
  88494. "sbc r5, r6\n\t"
  88495. #endif
  88496. "stm %[a]!, {r5}\n\t"
  88497. "ldm %[m]!, {r6}\n\t"
  88498. #ifdef WOLFSSL_KEIL
  88499. "ands r6, r6, r7\n\t"
  88500. #elif defined(__clang__)
  88501. "ands r6, r7\n\t"
  88502. #else
  88503. "and r6, r7\n\t"
  88504. #endif
  88505. "ldr r5, [%[a], r4]\n\t"
  88506. #ifdef WOLFSSL_KEIL
  88507. "sbcs r5, r5, r6\n\t"
  88508. #elif defined(__clang__)
  88509. "sbcs r5, r6\n\t"
  88510. #else
  88511. "sbc r5, r6\n\t"
  88512. #endif
  88513. "stm %[a]!, {r5}\n\t"
  88514. "ldm %[m]!, {r6}\n\t"
  88515. #ifdef WOLFSSL_KEIL
  88516. "ands r6, r6, r7\n\t"
  88517. #elif defined(__clang__)
  88518. "ands r6, r7\n\t"
  88519. #else
  88520. "and r6, r7\n\t"
  88521. #endif
  88522. "ldr r5, [%[a], r4]\n\t"
  88523. #ifdef WOLFSSL_KEIL
  88524. "sbcs r5, r5, r6\n\t"
  88525. #elif defined(__clang__)
  88526. "sbcs r5, r6\n\t"
  88527. #else
  88528. "sbc r5, r6\n\t"
  88529. #endif
  88530. "stm %[a]!, {r5}\n\t"
  88531. "ldm %[m]!, {r6}\n\t"
  88532. #ifdef WOLFSSL_KEIL
  88533. "ands r6, r6, r7\n\t"
  88534. #elif defined(__clang__)
  88535. "ands r6, r7\n\t"
  88536. #else
  88537. "and r6, r7\n\t"
  88538. #endif
  88539. "ldr r5, [%[a], r4]\n\t"
  88540. #ifdef WOLFSSL_KEIL
  88541. "sbcs r5, r5, r6\n\t"
  88542. #elif defined(__clang__)
  88543. "sbcs r5, r6\n\t"
  88544. #else
  88545. "sbc r5, r6\n\t"
  88546. #endif
  88547. "stm %[a]!, {r5}\n\t"
  88548. "ldm %[m]!, {r6}\n\t"
  88549. #ifdef WOLFSSL_KEIL
  88550. "ands r6, r6, r7\n\t"
  88551. #elif defined(__clang__)
  88552. "ands r6, r7\n\t"
  88553. #else
  88554. "and r6, r7\n\t"
  88555. #endif
  88556. "ldr r5, [%[a], r4]\n\t"
  88557. #ifdef WOLFSSL_KEIL
  88558. "sbcs r5, r5, r6\n\t"
  88559. #elif defined(__clang__)
  88560. "sbcs r5, r6\n\t"
  88561. #else
  88562. "sbc r5, r6\n\t"
  88563. #endif
  88564. "stm %[a]!, {r5}\n\t"
  88565. "ldm %[m]!, {r6}\n\t"
  88566. #ifdef WOLFSSL_KEIL
  88567. "ands r6, r6, r7\n\t"
  88568. #elif defined(__clang__)
  88569. "ands r6, r7\n\t"
  88570. #else
  88571. "and r6, r7\n\t"
  88572. #endif
  88573. "ldr r5, [%[a], r4]\n\t"
  88574. #ifdef WOLFSSL_KEIL
  88575. "sbcs r5, r5, r6\n\t"
  88576. #elif defined(__clang__)
  88577. "sbcs r5, r6\n\t"
  88578. #else
  88579. "sbc r5, r6\n\t"
  88580. #endif
  88581. "stm %[a]!, {r5}\n\t"
  88582. "ldm %[m]!, {r6}\n\t"
  88583. #ifdef WOLFSSL_KEIL
  88584. "ands r6, r6, r7\n\t"
  88585. #elif defined(__clang__)
  88586. "ands r6, r7\n\t"
  88587. #else
  88588. "and r6, r7\n\t"
  88589. #endif
  88590. "ldr r5, [%[a], r4]\n\t"
  88591. #ifdef WOLFSSL_KEIL
  88592. "sbcs r5, r5, r6\n\t"
  88593. #elif defined(__clang__)
  88594. "sbcs r5, r6\n\t"
  88595. #else
  88596. "sbc r5, r6\n\t"
  88597. #endif
  88598. "stm %[a]!, {r5}\n\t"
  88599. "ldm %[m]!, {r6}\n\t"
  88600. #ifdef WOLFSSL_KEIL
  88601. "ands r6, r6, r7\n\t"
  88602. #elif defined(__clang__)
  88603. "ands r6, r7\n\t"
  88604. #else
  88605. "and r6, r7\n\t"
  88606. #endif
  88607. "ldr r5, [%[a], r4]\n\t"
  88608. #ifdef WOLFSSL_KEIL
  88609. "sbcs r5, r5, r6\n\t"
  88610. #elif defined(__clang__)
  88611. "sbcs r5, r6\n\t"
  88612. #else
  88613. "sbc r5, r6\n\t"
  88614. #endif
  88615. "stm %[a]!, {r5}\n\t"
  88616. "ldm %[m]!, {r6}\n\t"
  88617. #ifdef WOLFSSL_KEIL
  88618. "ands r6, r6, r7\n\t"
  88619. #elif defined(__clang__)
  88620. "ands r6, r7\n\t"
  88621. #else
  88622. "and r6, r7\n\t"
  88623. #endif
  88624. "ldr r5, [%[a], r4]\n\t"
  88625. #ifdef WOLFSSL_KEIL
  88626. "sbcs r5, r5, r6\n\t"
  88627. #elif defined(__clang__)
  88628. "sbcs r5, r6\n\t"
  88629. #else
  88630. "sbc r5, r6\n\t"
  88631. #endif
  88632. "stm %[a]!, {r5}\n\t"
  88633. "ldm %[m]!, {r6}\n\t"
  88634. #ifdef WOLFSSL_KEIL
  88635. "ands r6, r6, r7\n\t"
  88636. #elif defined(__clang__)
  88637. "ands r6, r7\n\t"
  88638. #else
  88639. "and r6, r7\n\t"
  88640. #endif
  88641. "ldr r5, [%[a], r4]\n\t"
  88642. #ifdef WOLFSSL_KEIL
  88643. "sbcs r5, r5, r6\n\t"
  88644. #elif defined(__clang__)
  88645. "sbcs r5, r6\n\t"
  88646. #else
  88647. "sbc r5, r6\n\t"
  88648. #endif
  88649. "stm %[a]!, {r5}\n\t"
  88650. "ldm %[m]!, {r6}\n\t"
  88651. #ifdef WOLFSSL_KEIL
  88652. "ands r6, r6, r7\n\t"
  88653. #elif defined(__clang__)
  88654. "ands r6, r7\n\t"
  88655. #else
  88656. "and r6, r7\n\t"
  88657. #endif
  88658. "ldr r5, [%[a], r4]\n\t"
  88659. #ifdef WOLFSSL_KEIL
  88660. "sbcs r5, r5, r6\n\t"
  88661. #elif defined(__clang__)
  88662. "sbcs r5, r6\n\t"
  88663. #else
  88664. "sbc r5, r6\n\t"
  88665. #endif
  88666. "stm %[a]!, {r5}\n\t"
  88667. "ldm %[m]!, {r6}\n\t"
  88668. #ifdef WOLFSSL_KEIL
  88669. "ands r6, r6, r7\n\t"
  88670. #elif defined(__clang__)
  88671. "ands r6, r7\n\t"
  88672. #else
  88673. "and r6, r7\n\t"
  88674. #endif
  88675. "ldr r5, [%[a], r4]\n\t"
  88676. #ifdef WOLFSSL_KEIL
  88677. "sbcs r5, r5, r6\n\t"
  88678. #elif defined(__clang__)
  88679. "sbcs r5, r6\n\t"
  88680. #else
  88681. "sbc r5, r6\n\t"
  88682. #endif
  88683. "stm %[a]!, {r5}\n\t"
  88684. "ldm %[m]!, {r6}\n\t"
  88685. #ifdef WOLFSSL_KEIL
  88686. "ands r6, r6, r7\n\t"
  88687. #elif defined(__clang__)
  88688. "ands r6, r7\n\t"
  88689. #else
  88690. "and r6, r7\n\t"
  88691. #endif
  88692. "ldr r5, [%[a], r4]\n\t"
  88693. #ifdef WOLFSSL_KEIL
  88694. "sbcs r5, r5, r6\n\t"
  88695. #elif defined(__clang__)
  88696. "sbcs r5, r6\n\t"
  88697. #else
  88698. "sbc r5, r6\n\t"
  88699. #endif
  88700. "stm %[a]!, {r5}\n\t"
  88701. "ldm %[m]!, {r6}\n\t"
  88702. #ifdef WOLFSSL_KEIL
  88703. "ands r6, r6, r7\n\t"
  88704. #elif defined(__clang__)
  88705. "ands r6, r7\n\t"
  88706. #else
  88707. "and r6, r7\n\t"
  88708. #endif
  88709. "ldr r5, [%[a], r4]\n\t"
  88710. #ifdef WOLFSSL_KEIL
  88711. "sbcs r5, r5, r6\n\t"
  88712. #elif defined(__clang__)
  88713. "sbcs r5, r6\n\t"
  88714. #else
  88715. "sbc r5, r6\n\t"
  88716. #endif
  88717. "stm %[a]!, {r5}\n\t"
  88718. "ldm %[m]!, {r6}\n\t"
  88719. #ifdef WOLFSSL_KEIL
  88720. "ands r6, r6, r7\n\t"
  88721. #elif defined(__clang__)
  88722. "ands r6, r7\n\t"
  88723. #else
  88724. "and r6, r7\n\t"
  88725. #endif
  88726. "ldr r5, [%[a], r4]\n\t"
  88727. #ifdef WOLFSSL_KEIL
  88728. "sbcs r5, r5, r6\n\t"
  88729. #elif defined(__clang__)
  88730. "sbcs r5, r6\n\t"
  88731. #else
  88732. "sbc r5, r6\n\t"
  88733. #endif
  88734. "stm %[a]!, {r5}\n\t"
  88735. "ldm %[m]!, {r6}\n\t"
  88736. #ifdef WOLFSSL_KEIL
  88737. "ands r6, r6, r7\n\t"
  88738. #elif defined(__clang__)
  88739. "ands r6, r7\n\t"
  88740. #else
  88741. "and r6, r7\n\t"
  88742. #endif
  88743. "ldr r5, [%[a], r4]\n\t"
  88744. #ifdef WOLFSSL_KEIL
  88745. "sbcs r5, r5, r6\n\t"
  88746. #elif defined(__clang__)
  88747. "sbcs r5, r6\n\t"
  88748. #else
  88749. "sbc r5, r6\n\t"
  88750. #endif
  88751. "stm %[a]!, {r5}\n\t"
  88752. "ldm %[m]!, {r6}\n\t"
  88753. #ifdef WOLFSSL_KEIL
  88754. "ands r6, r6, r7\n\t"
  88755. #elif defined(__clang__)
  88756. "ands r6, r7\n\t"
  88757. #else
  88758. "and r6, r7\n\t"
  88759. #endif
  88760. "ldr r5, [%[a], r4]\n\t"
  88761. #ifdef WOLFSSL_KEIL
  88762. "sbcs r5, r5, r6\n\t"
  88763. #elif defined(__clang__)
  88764. "sbcs r5, r6\n\t"
  88765. #else
  88766. "sbc r5, r6\n\t"
  88767. #endif
  88768. "stm %[a]!, {r5}\n\t"
  88769. "ldm %[m]!, {r6}\n\t"
  88770. #ifdef WOLFSSL_KEIL
  88771. "ands r6, r6, r7\n\t"
  88772. #elif defined(__clang__)
  88773. "ands r6, r7\n\t"
  88774. #else
  88775. "and r6, r7\n\t"
  88776. #endif
  88777. "ldr r5, [%[a], r4]\n\t"
  88778. #ifdef WOLFSSL_KEIL
  88779. "sbcs r5, r5, r6\n\t"
  88780. #elif defined(__clang__)
  88781. "sbcs r5, r6\n\t"
  88782. #else
  88783. "sbc r5, r6\n\t"
  88784. #endif
  88785. "stm %[a]!, {r5}\n\t"
  88786. "ldm %[m]!, {r6}\n\t"
  88787. #ifdef WOLFSSL_KEIL
  88788. "ands r6, r6, r7\n\t"
  88789. #elif defined(__clang__)
  88790. "ands r6, r7\n\t"
  88791. #else
  88792. "and r6, r7\n\t"
  88793. #endif
  88794. "ldr r5, [%[a], r4]\n\t"
  88795. #ifdef WOLFSSL_KEIL
  88796. "sbcs r5, r5, r6\n\t"
  88797. #elif defined(__clang__)
  88798. "sbcs r5, r6\n\t"
  88799. #else
  88800. "sbc r5, r6\n\t"
  88801. #endif
  88802. "stm %[a]!, {r5}\n\t"
  88803. "ldm %[m]!, {r6}\n\t"
  88804. #ifdef WOLFSSL_KEIL
  88805. "ands r6, r6, r7\n\t"
  88806. #elif defined(__clang__)
  88807. "ands r6, r7\n\t"
  88808. #else
  88809. "and r6, r7\n\t"
  88810. #endif
  88811. "ldr r5, [%[a], r4]\n\t"
  88812. #ifdef WOLFSSL_KEIL
  88813. "sbcs r5, r5, r6\n\t"
  88814. #elif defined(__clang__)
  88815. "sbcs r5, r6\n\t"
  88816. #else
  88817. "sbc r5, r6\n\t"
  88818. #endif
  88819. "stm %[a]!, {r5}\n\t"
  88820. "ldm %[m]!, {r6}\n\t"
  88821. #ifdef WOLFSSL_KEIL
  88822. "ands r6, r6, r7\n\t"
  88823. #elif defined(__clang__)
  88824. "ands r6, r7\n\t"
  88825. #else
  88826. "and r6, r7\n\t"
  88827. #endif
  88828. "ldr r5, [%[a], r4]\n\t"
  88829. #ifdef WOLFSSL_KEIL
  88830. "sbcs r5, r5, r6\n\t"
  88831. #elif defined(__clang__)
  88832. "sbcs r5, r6\n\t"
  88833. #else
  88834. "sbc r5, r6\n\t"
  88835. #endif
  88836. "stm %[a]!, {r5}\n\t"
  88837. "ldm %[m]!, {r6}\n\t"
  88838. #ifdef WOLFSSL_KEIL
  88839. "ands r6, r6, r7\n\t"
  88840. #elif defined(__clang__)
  88841. "ands r6, r7\n\t"
  88842. #else
  88843. "and r6, r7\n\t"
  88844. #endif
  88845. "ldr r5, [%[a], r4]\n\t"
  88846. #ifdef WOLFSSL_KEIL
  88847. "sbcs r5, r5, r6\n\t"
  88848. #elif defined(__clang__)
  88849. "sbcs r5, r6\n\t"
  88850. #else
  88851. "sbc r5, r6\n\t"
  88852. #endif
  88853. "stm %[a]!, {r5}\n\t"
  88854. "ldm %[m]!, {r6}\n\t"
  88855. #ifdef WOLFSSL_KEIL
  88856. "ands r6, r6, r7\n\t"
  88857. #elif defined(__clang__)
  88858. "ands r6, r7\n\t"
  88859. #else
  88860. "and r6, r7\n\t"
  88861. #endif
  88862. "ldr r5, [%[a], r4]\n\t"
  88863. #ifdef WOLFSSL_KEIL
  88864. "sbcs r5, r5, r6\n\t"
  88865. #elif defined(__clang__)
  88866. "sbcs r5, r6\n\t"
  88867. #else
  88868. "sbc r5, r6\n\t"
  88869. #endif
  88870. "stm %[a]!, {r5}\n\t"
  88871. "ldm %[m]!, {r6}\n\t"
  88872. #ifdef WOLFSSL_KEIL
  88873. "ands r6, r6, r7\n\t"
  88874. #elif defined(__clang__)
  88875. "ands r6, r7\n\t"
  88876. #else
  88877. "and r6, r7\n\t"
  88878. #endif
  88879. "ldr r5, [%[a], r4]\n\t"
  88880. #ifdef WOLFSSL_KEIL
  88881. "sbcs r5, r5, r6\n\t"
  88882. #elif defined(__clang__)
  88883. "sbcs r5, r6\n\t"
  88884. #else
  88885. "sbc r5, r6\n\t"
  88886. #endif
  88887. "stm %[a]!, {r5}\n\t"
  88888. "ldm %[m]!, {r6}\n\t"
  88889. #ifdef WOLFSSL_KEIL
  88890. "ands r6, r6, r7\n\t"
  88891. #elif defined(__clang__)
  88892. "ands r6, r7\n\t"
  88893. #else
  88894. "and r6, r7\n\t"
  88895. #endif
  88896. "ldr r5, [%[a], r4]\n\t"
  88897. #ifdef WOLFSSL_KEIL
  88898. "sbcs r5, r5, r6\n\t"
  88899. #elif defined(__clang__)
  88900. "sbcs r5, r6\n\t"
  88901. #else
  88902. "sbc r5, r6\n\t"
  88903. #endif
  88904. "stm %[a]!, {r5}\n\t"
  88905. "ldm %[m]!, {r6}\n\t"
  88906. #ifdef WOLFSSL_KEIL
  88907. "ands r6, r6, r7\n\t"
  88908. #elif defined(__clang__)
  88909. "ands r6, r7\n\t"
  88910. #else
  88911. "and r6, r7\n\t"
  88912. #endif
  88913. "ldr r5, [%[a], r4]\n\t"
  88914. #ifdef WOLFSSL_KEIL
  88915. "sbcs r5, r5, r6\n\t"
  88916. #elif defined(__clang__)
  88917. "sbcs r5, r6\n\t"
  88918. #else
  88919. "sbc r5, r6\n\t"
  88920. #endif
  88921. "stm %[a]!, {r5}\n\t"
  88922. "ldm %[m]!, {r6}\n\t"
  88923. #ifdef WOLFSSL_KEIL
  88924. "ands r6, r6, r7\n\t"
  88925. #elif defined(__clang__)
  88926. "ands r6, r7\n\t"
  88927. #else
  88928. "and r6, r7\n\t"
  88929. #endif
  88930. "ldr r5, [%[a], r4]\n\t"
  88931. #ifdef WOLFSSL_KEIL
  88932. "sbcs r5, r5, r6\n\t"
  88933. #elif defined(__clang__)
  88934. "sbcs r5, r6\n\t"
  88935. #else
  88936. "sbc r5, r6\n\t"
  88937. #endif
  88938. "stm %[a]!, {r5}\n\t"
  88939. "ldm %[m]!, {r6}\n\t"
  88940. #ifdef WOLFSSL_KEIL
  88941. "ands r6, r6, r7\n\t"
  88942. #elif defined(__clang__)
  88943. "ands r6, r7\n\t"
  88944. #else
  88945. "and r6, r7\n\t"
  88946. #endif
  88947. "ldr r5, [%[a], r4]\n\t"
  88948. #ifdef WOLFSSL_KEIL
  88949. "sbcs r5, r5, r6\n\t"
  88950. #elif defined(__clang__)
  88951. "sbcs r5, r6\n\t"
  88952. #else
  88953. "sbc r5, r6\n\t"
  88954. #endif
  88955. "stm %[a]!, {r5}\n\t"
  88956. "ldm %[m]!, {r6}\n\t"
  88957. #ifdef WOLFSSL_KEIL
  88958. "ands r6, r6, r7\n\t"
  88959. #elif defined(__clang__)
  88960. "ands r6, r7\n\t"
  88961. #else
  88962. "and r6, r7\n\t"
  88963. #endif
  88964. "ldr r5, [%[a], r4]\n\t"
  88965. #ifdef WOLFSSL_KEIL
  88966. "sbcs r5, r5, r6\n\t"
  88967. #elif defined(__clang__)
  88968. "sbcs r5, r6\n\t"
  88969. #else
  88970. "sbc r5, r6\n\t"
  88971. #endif
  88972. "stm %[a]!, {r5}\n\t"
  88973. "ldm %[m]!, {r6}\n\t"
  88974. #ifdef WOLFSSL_KEIL
  88975. "ands r6, r6, r7\n\t"
  88976. #elif defined(__clang__)
  88977. "ands r6, r7\n\t"
  88978. #else
  88979. "and r6, r7\n\t"
  88980. #endif
  88981. "ldr r5, [%[a], r4]\n\t"
  88982. #ifdef WOLFSSL_KEIL
  88983. "sbcs r5, r5, r6\n\t"
  88984. #elif defined(__clang__)
  88985. "sbcs r5, r6\n\t"
  88986. #else
  88987. "sbc r5, r6\n\t"
  88988. #endif
  88989. "stm %[a]!, {r5}\n\t"
  88990. "ldm %[m]!, {r6}\n\t"
  88991. #ifdef WOLFSSL_KEIL
  88992. "ands r6, r6, r7\n\t"
  88993. #elif defined(__clang__)
  88994. "ands r6, r7\n\t"
  88995. #else
  88996. "and r6, r7\n\t"
  88997. #endif
  88998. "ldr r5, [%[a], r4]\n\t"
  88999. #ifdef WOLFSSL_KEIL
  89000. "sbcs r5, r5, r6\n\t"
  89001. #elif defined(__clang__)
  89002. "sbcs r5, r6\n\t"
  89003. #else
  89004. "sbc r5, r6\n\t"
  89005. #endif
  89006. "stm %[a]!, {r5}\n\t"
  89007. "ldm %[m]!, {r6}\n\t"
  89008. #ifdef WOLFSSL_KEIL
  89009. "ands r6, r6, r7\n\t"
  89010. #elif defined(__clang__)
  89011. "ands r6, r7\n\t"
  89012. #else
  89013. "and r6, r7\n\t"
  89014. #endif
  89015. "ldr r5, [%[a], r4]\n\t"
  89016. #ifdef WOLFSSL_KEIL
  89017. "sbcs r5, r5, r6\n\t"
  89018. #elif defined(__clang__)
  89019. "sbcs r5, r6\n\t"
  89020. #else
  89021. "sbc r5, r6\n\t"
  89022. #endif
  89023. "stm %[a]!, {r5}\n\t"
  89024. "ldm %[m]!, {r6}\n\t"
  89025. #ifdef WOLFSSL_KEIL
  89026. "ands r6, r6, r7\n\t"
  89027. #elif defined(__clang__)
  89028. "ands r6, r7\n\t"
  89029. #else
  89030. "and r6, r7\n\t"
  89031. #endif
  89032. "ldr r5, [%[a], r4]\n\t"
  89033. #ifdef WOLFSSL_KEIL
  89034. "sbcs r5, r5, r6\n\t"
  89035. #elif defined(__clang__)
  89036. "sbcs r5, r6\n\t"
  89037. #else
  89038. "sbc r5, r6\n\t"
  89039. #endif
  89040. "stm %[a]!, {r5}\n\t"
  89041. "ldm %[m]!, {r6}\n\t"
  89042. #ifdef WOLFSSL_KEIL
  89043. "ands r6, r6, r7\n\t"
  89044. #elif defined(__clang__)
  89045. "ands r6, r7\n\t"
  89046. #else
  89047. "and r6, r7\n\t"
  89048. #endif
  89049. "ldr r5, [%[a], r4]\n\t"
  89050. #ifdef WOLFSSL_KEIL
  89051. "sbcs r5, r5, r6\n\t"
  89052. #elif defined(__clang__)
  89053. "sbcs r5, r6\n\t"
  89054. #else
  89055. "sbc r5, r6\n\t"
  89056. #endif
  89057. "stm %[a]!, {r5}\n\t"
  89058. "ldm %[m]!, {r6}\n\t"
  89059. #ifdef WOLFSSL_KEIL
  89060. "ands r6, r6, r7\n\t"
  89061. #elif defined(__clang__)
  89062. "ands r6, r7\n\t"
  89063. #else
  89064. "and r6, r7\n\t"
  89065. #endif
  89066. "ldr r5, [%[a], r4]\n\t"
  89067. #ifdef WOLFSSL_KEIL
  89068. "sbcs r5, r5, r6\n\t"
  89069. #elif defined(__clang__)
  89070. "sbcs r5, r6\n\t"
  89071. #else
  89072. "sbc r5, r6\n\t"
  89073. #endif
  89074. "stm %[a]!, {r5}\n\t"
  89075. "ldm %[m]!, {r6}\n\t"
  89076. #ifdef WOLFSSL_KEIL
  89077. "ands r6, r6, r7\n\t"
  89078. #elif defined(__clang__)
  89079. "ands r6, r7\n\t"
  89080. #else
  89081. "and r6, r7\n\t"
  89082. #endif
  89083. "ldr r5, [%[a], r4]\n\t"
  89084. #ifdef WOLFSSL_KEIL
  89085. "sbcs r5, r5, r6\n\t"
  89086. #elif defined(__clang__)
  89087. "sbcs r5, r6\n\t"
  89088. #else
  89089. "sbc r5, r6\n\t"
  89090. #endif
  89091. "stm %[a]!, {r5}\n\t"
  89092. "ldm %[m]!, {r6}\n\t"
  89093. #ifdef WOLFSSL_KEIL
  89094. "ands r6, r6, r7\n\t"
  89095. #elif defined(__clang__)
  89096. "ands r6, r7\n\t"
  89097. #else
  89098. "and r6, r7\n\t"
  89099. #endif
  89100. "ldr r5, [%[a], r4]\n\t"
  89101. #ifdef WOLFSSL_KEIL
  89102. "sbcs r5, r5, r6\n\t"
  89103. #elif defined(__clang__)
  89104. "sbcs r5, r6\n\t"
  89105. #else
  89106. "sbc r5, r6\n\t"
  89107. #endif
  89108. "stm %[a]!, {r5}\n\t"
  89109. "ldm %[m]!, {r6}\n\t"
  89110. #ifdef WOLFSSL_KEIL
  89111. "ands r6, r6, r7\n\t"
  89112. #elif defined(__clang__)
  89113. "ands r6, r7\n\t"
  89114. #else
  89115. "and r6, r7\n\t"
  89116. #endif
  89117. "ldr r5, [%[a], r4]\n\t"
  89118. #ifdef WOLFSSL_KEIL
  89119. "sbcs r5, r5, r6\n\t"
  89120. #elif defined(__clang__)
  89121. "sbcs r5, r6\n\t"
  89122. #else
  89123. "sbc r5, r6\n\t"
  89124. #endif
  89125. "stm %[a]!, {r5}\n\t"
  89126. "ldm %[m]!, {r6}\n\t"
  89127. #ifdef WOLFSSL_KEIL
  89128. "ands r6, r6, r7\n\t"
  89129. #elif defined(__clang__)
  89130. "ands r6, r7\n\t"
  89131. #else
  89132. "and r6, r7\n\t"
  89133. #endif
  89134. "ldr r5, [%[a], r4]\n\t"
  89135. #ifdef WOLFSSL_KEIL
  89136. "sbcs r5, r5, r6\n\t"
  89137. #elif defined(__clang__)
  89138. "sbcs r5, r6\n\t"
  89139. #else
  89140. "sbc r5, r6\n\t"
  89141. #endif
  89142. "stm %[a]!, {r5}\n\t"
  89143. "ldm %[m]!, {r6}\n\t"
  89144. #ifdef WOLFSSL_KEIL
  89145. "ands r6, r6, r7\n\t"
  89146. #elif defined(__clang__)
  89147. "ands r6, r7\n\t"
  89148. #else
  89149. "and r6, r7\n\t"
  89150. #endif
  89151. "ldr r5, [%[a], r4]\n\t"
  89152. #ifdef WOLFSSL_KEIL
  89153. "sbcs r5, r5, r6\n\t"
  89154. #elif defined(__clang__)
  89155. "sbcs r5, r6\n\t"
  89156. #else
  89157. "sbc r5, r6\n\t"
  89158. #endif
  89159. "stm %[a]!, {r5}\n\t"
  89160. "ldm %[m]!, {r6}\n\t"
  89161. #ifdef WOLFSSL_KEIL
  89162. "ands r6, r6, r7\n\t"
  89163. #elif defined(__clang__)
  89164. "ands r6, r7\n\t"
  89165. #else
  89166. "and r6, r7\n\t"
  89167. #endif
  89168. "ldr r5, [%[a], r4]\n\t"
  89169. #ifdef WOLFSSL_KEIL
  89170. "sbcs r5, r5, r6\n\t"
  89171. #elif defined(__clang__)
  89172. "sbcs r5, r6\n\t"
  89173. #else
  89174. "sbc r5, r6\n\t"
  89175. #endif
  89176. "stm %[a]!, {r5}\n\t"
  89177. "ldm %[m]!, {r6}\n\t"
  89178. #ifdef WOLFSSL_KEIL
  89179. "ands r6, r6, r7\n\t"
  89180. #elif defined(__clang__)
  89181. "ands r6, r7\n\t"
  89182. #else
  89183. "and r6, r7\n\t"
  89184. #endif
  89185. "ldr r5, [%[a], r4]\n\t"
  89186. #ifdef WOLFSSL_KEIL
  89187. "sbcs r5, r5, r6\n\t"
  89188. #elif defined(__clang__)
  89189. "sbcs r5, r6\n\t"
  89190. #else
  89191. "sbc r5, r6\n\t"
  89192. #endif
  89193. "stm %[a]!, {r5}\n\t"
  89194. "ldm %[m]!, {r6}\n\t"
  89195. #ifdef WOLFSSL_KEIL
  89196. "ands r6, r6, r7\n\t"
  89197. #elif defined(__clang__)
  89198. "ands r6, r7\n\t"
  89199. #else
  89200. "and r6, r7\n\t"
  89201. #endif
  89202. "ldr r5, [%[a], r4]\n\t"
  89203. #ifdef WOLFSSL_KEIL
  89204. "sbcs r5, r5, r6\n\t"
  89205. #elif defined(__clang__)
  89206. "sbcs r5, r6\n\t"
  89207. #else
  89208. "sbc r5, r6\n\t"
  89209. #endif
  89210. "stm %[a]!, {r5}\n\t"
  89211. "ldm %[m]!, {r6}\n\t"
  89212. #ifdef WOLFSSL_KEIL
  89213. "ands r6, r6, r7\n\t"
  89214. #elif defined(__clang__)
  89215. "ands r6, r7\n\t"
  89216. #else
  89217. "and r6, r7\n\t"
  89218. #endif
  89219. "ldr r5, [%[a], r4]\n\t"
  89220. #ifdef WOLFSSL_KEIL
  89221. "sbcs r5, r5, r6\n\t"
  89222. #elif defined(__clang__)
  89223. "sbcs r5, r6\n\t"
  89224. #else
  89225. "sbc r5, r6\n\t"
  89226. #endif
  89227. "stm %[a]!, {r5}\n\t"
  89228. "ldm %[m]!, {r6}\n\t"
  89229. #ifdef WOLFSSL_KEIL
  89230. "ands r6, r6, r7\n\t"
  89231. #elif defined(__clang__)
  89232. "ands r6, r7\n\t"
  89233. #else
  89234. "and r6, r7\n\t"
  89235. #endif
  89236. "ldr r5, [%[a], r4]\n\t"
  89237. #ifdef WOLFSSL_KEIL
  89238. "sbcs r5, r5, r6\n\t"
  89239. #elif defined(__clang__)
  89240. "sbcs r5, r6\n\t"
  89241. #else
  89242. "sbc r5, r6\n\t"
  89243. #endif
  89244. "stm %[a]!, {r5}\n\t"
  89245. "ldm %[m]!, {r6}\n\t"
  89246. #ifdef WOLFSSL_KEIL
  89247. "ands r6, r6, r7\n\t"
  89248. #elif defined(__clang__)
  89249. "ands r6, r7\n\t"
  89250. #else
  89251. "and r6, r7\n\t"
  89252. #endif
  89253. "ldr r5, [%[a], r4]\n\t"
  89254. #ifdef WOLFSSL_KEIL
  89255. "sbcs r5, r5, r6\n\t"
  89256. #elif defined(__clang__)
  89257. "sbcs r5, r6\n\t"
  89258. #else
  89259. "sbc r5, r6\n\t"
  89260. #endif
  89261. "stm %[a]!, {r5}\n\t"
  89262. "ldm %[m]!, {r6}\n\t"
  89263. #ifdef WOLFSSL_KEIL
  89264. "ands r6, r6, r7\n\t"
  89265. #elif defined(__clang__)
  89266. "ands r6, r7\n\t"
  89267. #else
  89268. "and r6, r7\n\t"
  89269. #endif
  89270. "ldr r5, [%[a], r4]\n\t"
  89271. #ifdef WOLFSSL_KEIL
  89272. "sbcs r5, r5, r6\n\t"
  89273. #elif defined(__clang__)
  89274. "sbcs r5, r6\n\t"
  89275. #else
  89276. "sbc r5, r6\n\t"
  89277. #endif
  89278. "stm %[a]!, {r5}\n\t"
  89279. "ldm %[m]!, {r6}\n\t"
  89280. #ifdef WOLFSSL_KEIL
  89281. "ands r6, r6, r7\n\t"
  89282. #elif defined(__clang__)
  89283. "ands r6, r7\n\t"
  89284. #else
  89285. "and r6, r7\n\t"
  89286. #endif
  89287. "ldr r5, [%[a], r4]\n\t"
  89288. #ifdef WOLFSSL_KEIL
  89289. "sbcs r5, r5, r6\n\t"
  89290. #elif defined(__clang__)
  89291. "sbcs r5, r6\n\t"
  89292. #else
  89293. "sbc r5, r6\n\t"
  89294. #endif
  89295. "stm %[a]!, {r5}\n\t"
  89296. "ldm %[m]!, {r6}\n\t"
  89297. #ifdef WOLFSSL_KEIL
  89298. "ands r6, r6, r7\n\t"
  89299. #elif defined(__clang__)
  89300. "ands r6, r7\n\t"
  89301. #else
  89302. "and r6, r7\n\t"
  89303. #endif
  89304. "ldr r5, [%[a], r4]\n\t"
  89305. #ifdef WOLFSSL_KEIL
  89306. "sbcs r5, r5, r6\n\t"
  89307. #elif defined(__clang__)
  89308. "sbcs r5, r6\n\t"
  89309. #else
  89310. "sbc r5, r6\n\t"
  89311. #endif
  89312. "stm %[a]!, {r5}\n\t"
  89313. "ldm %[m]!, {r6}\n\t"
  89314. #ifdef WOLFSSL_KEIL
  89315. "ands r6, r6, r7\n\t"
  89316. #elif defined(__clang__)
  89317. "ands r6, r7\n\t"
  89318. #else
  89319. "and r6, r7\n\t"
  89320. #endif
  89321. "ldr r5, [%[a], r4]\n\t"
  89322. #ifdef WOLFSSL_KEIL
  89323. "sbcs r5, r5, r6\n\t"
  89324. #elif defined(__clang__)
  89325. "sbcs r5, r6\n\t"
  89326. #else
  89327. "sbc r5, r6\n\t"
  89328. #endif
  89329. "stm %[a]!, {r5}\n\t"
  89330. "ldm %[m]!, {r6}\n\t"
  89331. #ifdef WOLFSSL_KEIL
  89332. "ands r6, r6, r7\n\t"
  89333. #elif defined(__clang__)
  89334. "ands r6, r7\n\t"
  89335. #else
  89336. "and r6, r7\n\t"
  89337. #endif
  89338. "ldr r5, [%[a], r4]\n\t"
  89339. #ifdef WOLFSSL_KEIL
  89340. "sbcs r5, r5, r6\n\t"
  89341. #elif defined(__clang__)
  89342. "sbcs r5, r6\n\t"
  89343. #else
  89344. "sbc r5, r6\n\t"
  89345. #endif
  89346. "stm %[a]!, {r5}\n\t"
  89347. "ldm %[m]!, {r6}\n\t"
  89348. #ifdef WOLFSSL_KEIL
  89349. "ands r6, r6, r7\n\t"
  89350. #elif defined(__clang__)
  89351. "ands r6, r7\n\t"
  89352. #else
  89353. "and r6, r7\n\t"
  89354. #endif
  89355. "ldr r5, [%[a], r4]\n\t"
  89356. #ifdef WOLFSSL_KEIL
  89357. "sbcs r5, r5, r6\n\t"
  89358. #elif defined(__clang__)
  89359. "sbcs r5, r6\n\t"
  89360. #else
  89361. "sbc r5, r6\n\t"
  89362. #endif
  89363. "stm %[a]!, {r5}\n\t"
  89364. "ldm %[m]!, {r6}\n\t"
  89365. #ifdef WOLFSSL_KEIL
  89366. "ands r6, r6, r7\n\t"
  89367. #elif defined(__clang__)
  89368. "ands r6, r7\n\t"
  89369. #else
  89370. "and r6, r7\n\t"
  89371. #endif
  89372. "ldr r5, [%[a], r4]\n\t"
  89373. #ifdef WOLFSSL_KEIL
  89374. "sbcs r5, r5, r6\n\t"
  89375. #elif defined(__clang__)
  89376. "sbcs r5, r6\n\t"
  89377. #else
  89378. "sbc r5, r6\n\t"
  89379. #endif
  89380. "stm %[a]!, {r5}\n\t"
  89381. "ldm %[m]!, {r6}\n\t"
  89382. #ifdef WOLFSSL_KEIL
  89383. "ands r6, r6, r7\n\t"
  89384. #elif defined(__clang__)
  89385. "ands r6, r7\n\t"
  89386. #else
  89387. "and r6, r7\n\t"
  89388. #endif
  89389. "ldr r5, [%[a], r4]\n\t"
  89390. #ifdef WOLFSSL_KEIL
  89391. "sbcs r5, r5, r6\n\t"
  89392. #elif defined(__clang__)
  89393. "sbcs r5, r6\n\t"
  89394. #else
  89395. "sbc r5, r6\n\t"
  89396. #endif
  89397. "stm %[a]!, {r5}\n\t"
  89398. "ldm %[m]!, {r6}\n\t"
  89399. #ifdef WOLFSSL_KEIL
  89400. "ands r6, r6, r7\n\t"
  89401. #elif defined(__clang__)
  89402. "ands r6, r7\n\t"
  89403. #else
  89404. "and r6, r7\n\t"
  89405. #endif
  89406. "ldr r5, [%[a], r4]\n\t"
  89407. #ifdef WOLFSSL_KEIL
  89408. "sbcs r5, r5, r6\n\t"
  89409. #elif defined(__clang__)
  89410. "sbcs r5, r6\n\t"
  89411. #else
  89412. "sbc r5, r6\n\t"
  89413. #endif
  89414. "stm %[a]!, {r5}\n\t"
  89415. "ldm %[m]!, {r6}\n\t"
  89416. #ifdef WOLFSSL_KEIL
  89417. "ands r6, r6, r7\n\t"
  89418. #elif defined(__clang__)
  89419. "ands r6, r7\n\t"
  89420. #else
  89421. "and r6, r7\n\t"
  89422. #endif
  89423. "ldr r5, [%[a], r4]\n\t"
  89424. #ifdef WOLFSSL_KEIL
  89425. "sbcs r5, r5, r6\n\t"
  89426. #elif defined(__clang__)
  89427. "sbcs r5, r6\n\t"
  89428. #else
  89429. "sbc r5, r6\n\t"
  89430. #endif
  89431. "stm %[a]!, {r5}\n\t"
  89432. "ldm %[m]!, {r6}\n\t"
  89433. #ifdef WOLFSSL_KEIL
  89434. "ands r6, r6, r7\n\t"
  89435. #elif defined(__clang__)
  89436. "ands r6, r7\n\t"
  89437. #else
  89438. "and r6, r7\n\t"
  89439. #endif
  89440. "ldr r5, [%[a], r4]\n\t"
  89441. #ifdef WOLFSSL_KEIL
  89442. "sbcs r5, r5, r6\n\t"
  89443. #elif defined(__clang__)
  89444. "sbcs r5, r6\n\t"
  89445. #else
  89446. "sbc r5, r6\n\t"
  89447. #endif
  89448. "stm %[a]!, {r5}\n\t"
  89449. "ldm %[m]!, {r6}\n\t"
  89450. #ifdef WOLFSSL_KEIL
  89451. "ands r6, r6, r7\n\t"
  89452. #elif defined(__clang__)
  89453. "ands r6, r7\n\t"
  89454. #else
  89455. "and r6, r7\n\t"
  89456. #endif
  89457. "ldr r5, [%[a], r4]\n\t"
  89458. #ifdef WOLFSSL_KEIL
  89459. "sbcs r5, r5, r6\n\t"
  89460. #elif defined(__clang__)
  89461. "sbcs r5, r6\n\t"
  89462. #else
  89463. "sbc r5, r6\n\t"
  89464. #endif
  89465. "stm %[a]!, {r5}\n\t"
  89466. "ldm %[m]!, {r6}\n\t"
  89467. #ifdef WOLFSSL_KEIL
  89468. "ands r6, r6, r7\n\t"
  89469. #elif defined(__clang__)
  89470. "ands r6, r7\n\t"
  89471. #else
  89472. "and r6, r7\n\t"
  89473. #endif
  89474. "ldr r5, [%[a], r4]\n\t"
  89475. #ifdef WOLFSSL_KEIL
  89476. "sbcs r5, r5, r6\n\t"
  89477. #elif defined(__clang__)
  89478. "sbcs r5, r6\n\t"
  89479. #else
  89480. "sbc r5, r6\n\t"
  89481. #endif
  89482. "stm %[a]!, {r5}\n\t"
  89483. "ldm %[m]!, {r6}\n\t"
  89484. #ifdef WOLFSSL_KEIL
  89485. "ands r6, r6, r7\n\t"
  89486. #elif defined(__clang__)
  89487. "ands r6, r7\n\t"
  89488. #else
  89489. "and r6, r7\n\t"
  89490. #endif
  89491. "ldr r5, [%[a], r4]\n\t"
  89492. #ifdef WOLFSSL_KEIL
  89493. "sbcs r5, r5, r6\n\t"
  89494. #elif defined(__clang__)
  89495. "sbcs r5, r6\n\t"
  89496. #else
  89497. "sbc r5, r6\n\t"
  89498. #endif
  89499. "stm %[a]!, {r5}\n\t"
  89500. "ldm %[m]!, {r6}\n\t"
  89501. #ifdef WOLFSSL_KEIL
  89502. "ands r6, r6, r7\n\t"
  89503. #elif defined(__clang__)
  89504. "ands r6, r7\n\t"
  89505. #else
  89506. "and r6, r7\n\t"
  89507. #endif
  89508. "ldr r5, [%[a], r4]\n\t"
  89509. #ifdef WOLFSSL_KEIL
  89510. "sbcs r5, r5, r6\n\t"
  89511. #elif defined(__clang__)
  89512. "sbcs r5, r6\n\t"
  89513. #else
  89514. "sbc r5, r6\n\t"
  89515. #endif
  89516. "stm %[a]!, {r5}\n\t"
  89517. "ldm %[m]!, {r6}\n\t"
  89518. #ifdef WOLFSSL_KEIL
  89519. "ands r6, r6, r7\n\t"
  89520. #elif defined(__clang__)
  89521. "ands r6, r7\n\t"
  89522. #else
  89523. "and r6, r7\n\t"
  89524. #endif
  89525. "ldr r5, [%[a], r4]\n\t"
  89526. #ifdef WOLFSSL_KEIL
  89527. "sbcs r5, r5, r6\n\t"
  89528. #elif defined(__clang__)
  89529. "sbcs r5, r6\n\t"
  89530. #else
  89531. "sbc r5, r6\n\t"
  89532. #endif
  89533. "stm %[a]!, {r5}\n\t"
  89534. "ldm %[m]!, {r6}\n\t"
  89535. #ifdef WOLFSSL_KEIL
  89536. "ands r6, r6, r7\n\t"
  89537. #elif defined(__clang__)
  89538. "ands r6, r7\n\t"
  89539. #else
  89540. "and r6, r7\n\t"
  89541. #endif
  89542. "ldr r5, [%[a], r4]\n\t"
  89543. #ifdef WOLFSSL_KEIL
  89544. "sbcs r5, r5, r6\n\t"
  89545. #elif defined(__clang__)
  89546. "sbcs r5, r6\n\t"
  89547. #else
  89548. "sbc r5, r6\n\t"
  89549. #endif
  89550. "stm %[a]!, {r5}\n\t"
  89551. "ldm %[m]!, {r6}\n\t"
  89552. #ifdef WOLFSSL_KEIL
  89553. "ands r6, r6, r7\n\t"
  89554. #elif defined(__clang__)
  89555. "ands r6, r7\n\t"
  89556. #else
  89557. "and r6, r7\n\t"
  89558. #endif
  89559. "ldr r5, [%[a], r4]\n\t"
  89560. #ifdef WOLFSSL_KEIL
  89561. "sbcs r5, r5, r6\n\t"
  89562. #elif defined(__clang__)
  89563. "sbcs r5, r6\n\t"
  89564. #else
  89565. "sbc r5, r6\n\t"
  89566. #endif
  89567. "stm %[a]!, {r5}\n\t"
  89568. "ldm %[m]!, {r6}\n\t"
  89569. #ifdef WOLFSSL_KEIL
  89570. "ands r6, r6, r7\n\t"
  89571. #elif defined(__clang__)
  89572. "ands r6, r7\n\t"
  89573. #else
  89574. "and r6, r7\n\t"
  89575. #endif
  89576. "ldr r5, [%[a], r4]\n\t"
  89577. #ifdef WOLFSSL_KEIL
  89578. "sbcs r5, r5, r6\n\t"
  89579. #elif defined(__clang__)
  89580. "sbcs r5, r6\n\t"
  89581. #else
  89582. "sbc r5, r6\n\t"
  89583. #endif
  89584. "stm %[a]!, {r5}\n\t"
  89585. "ldm %[m]!, {r6}\n\t"
  89586. #ifdef WOLFSSL_KEIL
  89587. "ands r6, r6, r7\n\t"
  89588. #elif defined(__clang__)
  89589. "ands r6, r7\n\t"
  89590. #else
  89591. "and r6, r7\n\t"
  89592. #endif
  89593. "ldr r5, [%[a], r4]\n\t"
  89594. #ifdef WOLFSSL_KEIL
  89595. "sbcs r5, r5, r6\n\t"
  89596. #elif defined(__clang__)
  89597. "sbcs r5, r6\n\t"
  89598. #else
  89599. "sbc r5, r6\n\t"
  89600. #endif
  89601. "stm %[a]!, {r5}\n\t"
  89602. "ldm %[m]!, {r6}\n\t"
  89603. #ifdef WOLFSSL_KEIL
  89604. "ands r6, r6, r7\n\t"
  89605. #elif defined(__clang__)
  89606. "ands r6, r7\n\t"
  89607. #else
  89608. "and r6, r7\n\t"
  89609. #endif
  89610. "ldr r5, [%[a], r4]\n\t"
  89611. #ifdef WOLFSSL_KEIL
  89612. "sbcs r5, r5, r6\n\t"
  89613. #elif defined(__clang__)
  89614. "sbcs r5, r6\n\t"
  89615. #else
  89616. "sbc r5, r6\n\t"
  89617. #endif
  89618. "stm %[a]!, {r5}\n\t"
  89619. "ldm %[m]!, {r6}\n\t"
  89620. #ifdef WOLFSSL_KEIL
  89621. "ands r6, r6, r7\n\t"
  89622. #elif defined(__clang__)
  89623. "ands r6, r7\n\t"
  89624. #else
  89625. "and r6, r7\n\t"
  89626. #endif
  89627. "ldr r5, [%[a], r4]\n\t"
  89628. #ifdef WOLFSSL_KEIL
  89629. "sbcs r5, r5, r6\n\t"
  89630. #elif defined(__clang__)
  89631. "sbcs r5, r6\n\t"
  89632. #else
  89633. "sbc r5, r6\n\t"
  89634. #endif
  89635. "stm %[a]!, {r5}\n\t"
  89636. "ldm %[m]!, {r6}\n\t"
  89637. #ifdef WOLFSSL_KEIL
  89638. "ands r6, r6, r7\n\t"
  89639. #elif defined(__clang__)
  89640. "ands r6, r7\n\t"
  89641. #else
  89642. "and r6, r7\n\t"
  89643. #endif
  89644. "ldr r5, [%[a], r4]\n\t"
  89645. #ifdef WOLFSSL_KEIL
  89646. "sbcs r5, r5, r6\n\t"
  89647. #elif defined(__clang__)
  89648. "sbcs r5, r6\n\t"
  89649. #else
  89650. "sbc r5, r6\n\t"
  89651. #endif
  89652. "stm %[a]!, {r5}\n\t"
  89653. "ldm %[m]!, {r6}\n\t"
  89654. #ifdef WOLFSSL_KEIL
  89655. "ands r6, r6, r7\n\t"
  89656. #elif defined(__clang__)
  89657. "ands r6, r7\n\t"
  89658. #else
  89659. "and r6, r7\n\t"
  89660. #endif
  89661. "ldr r5, [%[a], r4]\n\t"
  89662. #ifdef WOLFSSL_KEIL
  89663. "sbcs r5, r5, r6\n\t"
  89664. #elif defined(__clang__)
  89665. "sbcs r5, r6\n\t"
  89666. #else
  89667. "sbc r5, r6\n\t"
  89668. #endif
  89669. "stm %[a]!, {r5}\n\t"
  89670. "ldm %[m]!, {r6}\n\t"
  89671. #ifdef WOLFSSL_KEIL
  89672. "ands r6, r6, r7\n\t"
  89673. #elif defined(__clang__)
  89674. "ands r6, r7\n\t"
  89675. #else
  89676. "and r6, r7\n\t"
  89677. #endif
  89678. "ldr r5, [%[a], r4]\n\t"
  89679. #ifdef WOLFSSL_KEIL
  89680. "sbcs r5, r5, r6\n\t"
  89681. #elif defined(__clang__)
  89682. "sbcs r5, r6\n\t"
  89683. #else
  89684. "sbc r5, r6\n\t"
  89685. #endif
  89686. "stm %[a]!, {r5}\n\t"
  89687. "ldm %[m]!, {r6}\n\t"
  89688. #ifdef WOLFSSL_KEIL
  89689. "ands r6, r6, r7\n\t"
  89690. #elif defined(__clang__)
  89691. "ands r6, r7\n\t"
  89692. #else
  89693. "and r6, r7\n\t"
  89694. #endif
  89695. "ldr r5, [%[a], r4]\n\t"
  89696. #ifdef WOLFSSL_KEIL
  89697. "sbcs r5, r5, r6\n\t"
  89698. #elif defined(__clang__)
  89699. "sbcs r5, r6\n\t"
  89700. #else
  89701. "sbc r5, r6\n\t"
  89702. #endif
  89703. "stm %[a]!, {r5}\n\t"
  89704. #endif /* WOLFSSL_SP_LARGE_CODE */
  89705. : [a] "+l" (a), [m] "+l" (m), [mp] "+l" (mp)
  89706. :
  89707. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr"
  89708. );
  89709. }
  89710. /* Multiply two Montgomery form numbers mod the modulus (prime).
  89711. * (r = a * b mod m)
  89712. *
  89713. * r Result of multiplication.
  89714. * a First number to multiply in Montgomery form.
  89715. * b Second number to multiply in Montgomery form.
  89716. * m Modulus (prime).
  89717. * mp Montgomery mulitplier.
  89718. */
  89719. SP_NOINLINE static void sp_4096_mont_mul_128(sp_digit* r, const sp_digit* a,
  89720. const sp_digit* b, const sp_digit* m, sp_digit mp)
  89721. {
  89722. sp_4096_mul_128(r, a, b);
  89723. sp_4096_mont_reduce_128(r, m, mp);
  89724. }
  89725. /* Square the Montgomery form number. (r = a * a mod m)
  89726. *
  89727. * r Result of squaring.
  89728. * a Number to square in Montgomery form.
  89729. * m Modulus (prime).
  89730. * mp Montgomery mulitplier.
  89731. */
  89732. SP_NOINLINE static void sp_4096_mont_sqr_128(sp_digit* r, const sp_digit* a,
  89733. const sp_digit* m, sp_digit mp)
  89734. {
  89735. sp_4096_sqr_128(r, a);
  89736. sp_4096_mont_reduce_128(r, m, mp);
  89737. }
  89738. #ifdef WOLFSSL_SP_SMALL
  89739. /* Sub b from a into r. (r = a - b)
  89740. *
  89741. * r A single precision integer.
  89742. * a A single precision integer.
  89743. * b A single precision integer.
  89744. */
  89745. SP_NOINLINE static sp_digit sp_4096_sub_128(sp_digit* r, const sp_digit* a,
  89746. const sp_digit* b)
  89747. {
  89748. __asm__ __volatile__ (
  89749. "movs r6, %[a]\n\t"
  89750. "movs r3, #0\n\t"
  89751. "movs r5, #2\n\t"
  89752. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  89753. "lsls r5, r5, #8\n\t"
  89754. #else
  89755. "lsl r5, r5, #8\n\t"
  89756. #endif
  89757. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  89758. "adds r6, r6, r5\n\t"
  89759. #else
  89760. "add r6, r6, r5\n\t"
  89761. #endif
  89762. "\n"
  89763. "L_sp_4096_sub_128_word_%=:\n\t"
  89764. "movs r5, #0\n\t"
  89765. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  89766. "subs r5, r5, r3\n\t"
  89767. #else
  89768. "sub r5, r5, r3\n\t"
  89769. #endif
  89770. "ldr r4, [%[a]]\n\t"
  89771. "ldr r5, [%[b]]\n\t"
  89772. #ifdef WOLFSSL_KEIL
  89773. "sbcs r4, r4, r5\n\t"
  89774. #elif defined(__clang__)
  89775. "sbcs r4, r5\n\t"
  89776. #else
  89777. "sbc r4, r5\n\t"
  89778. #endif
  89779. "str r4, [%[r]]\n\t"
  89780. #ifdef WOLFSSL_KEIL
  89781. "sbcs r3, r3, r3\n\t"
  89782. #elif defined(__clang__)
  89783. "sbcs r3, r3\n\t"
  89784. #else
  89785. "sbc r3, r3\n\t"
  89786. #endif
  89787. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  89788. "adds %[a], %[a], #4\n\t"
  89789. #else
  89790. "add %[a], %[a], #4\n\t"
  89791. #endif
  89792. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  89793. "adds %[b], %[b], #4\n\t"
  89794. #else
  89795. "add %[b], %[b], #4\n\t"
  89796. #endif
  89797. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  89798. "adds %[r], %[r], #4\n\t"
  89799. #else
  89800. "add %[r], %[r], #4\n\t"
  89801. #endif
  89802. "cmp %[a], r6\n\t"
  89803. "bne L_sp_4096_sub_128_word_%=\n\t"
  89804. "movs %[r], r3\n\t"
  89805. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  89806. :
  89807. : "memory", "r3", "r4", "r5", "r6"
  89808. );
  89809. return (uint32_t)(size_t)r;
  89810. }
  89811. #else
  89812. /* Sub b from a into r. (r = a - b)
  89813. *
  89814. * r A single precision integer.
  89815. * a A single precision integer.
  89816. * b A single precision integer.
  89817. */
  89818. SP_NOINLINE static sp_digit sp_4096_sub_128(sp_digit* r, const sp_digit* a,
  89819. const sp_digit* b)
  89820. {
  89821. __asm__ __volatile__ (
  89822. "ldm %[b]!, {r5, r6}\n\t"
  89823. "ldm %[a]!, {r3, r4}\n\t"
  89824. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  89825. "subs r3, r3, r5\n\t"
  89826. #else
  89827. "sub r3, r3, r5\n\t"
  89828. #endif
  89829. #ifdef WOLFSSL_KEIL
  89830. "sbcs r4, r4, r6\n\t"
  89831. #elif defined(__clang__)
  89832. "sbcs r4, r6\n\t"
  89833. #else
  89834. "sbc r4, r6\n\t"
  89835. #endif
  89836. "stm %[r]!, {r3, r4}\n\t"
  89837. "ldm %[b]!, {r5, r6}\n\t"
  89838. "ldm %[a]!, {r3, r4}\n\t"
  89839. #ifdef WOLFSSL_KEIL
  89840. "sbcs r3, r3, r5\n\t"
  89841. #elif defined(__clang__)
  89842. "sbcs r3, r5\n\t"
  89843. #else
  89844. "sbc r3, r5\n\t"
  89845. #endif
  89846. #ifdef WOLFSSL_KEIL
  89847. "sbcs r4, r4, r6\n\t"
  89848. #elif defined(__clang__)
  89849. "sbcs r4, r6\n\t"
  89850. #else
  89851. "sbc r4, r6\n\t"
  89852. #endif
  89853. "stm %[r]!, {r3, r4}\n\t"
  89854. "ldm %[b]!, {r5, r6}\n\t"
  89855. "ldm %[a]!, {r3, r4}\n\t"
  89856. #ifdef WOLFSSL_KEIL
  89857. "sbcs r3, r3, r5\n\t"
  89858. #elif defined(__clang__)
  89859. "sbcs r3, r5\n\t"
  89860. #else
  89861. "sbc r3, r5\n\t"
  89862. #endif
  89863. #ifdef WOLFSSL_KEIL
  89864. "sbcs r4, r4, r6\n\t"
  89865. #elif defined(__clang__)
  89866. "sbcs r4, r6\n\t"
  89867. #else
  89868. "sbc r4, r6\n\t"
  89869. #endif
  89870. "stm %[r]!, {r3, r4}\n\t"
  89871. "ldm %[b]!, {r5, r6}\n\t"
  89872. "ldm %[a]!, {r3, r4}\n\t"
  89873. #ifdef WOLFSSL_KEIL
  89874. "sbcs r3, r3, r5\n\t"
  89875. #elif defined(__clang__)
  89876. "sbcs r3, r5\n\t"
  89877. #else
  89878. "sbc r3, r5\n\t"
  89879. #endif
  89880. #ifdef WOLFSSL_KEIL
  89881. "sbcs r4, r4, r6\n\t"
  89882. #elif defined(__clang__)
  89883. "sbcs r4, r6\n\t"
  89884. #else
  89885. "sbc r4, r6\n\t"
  89886. #endif
  89887. "stm %[r]!, {r3, r4}\n\t"
  89888. "ldm %[b]!, {r5, r6}\n\t"
  89889. "ldm %[a]!, {r3, r4}\n\t"
  89890. #ifdef WOLFSSL_KEIL
  89891. "sbcs r3, r3, r5\n\t"
  89892. #elif defined(__clang__)
  89893. "sbcs r3, r5\n\t"
  89894. #else
  89895. "sbc r3, r5\n\t"
  89896. #endif
  89897. #ifdef WOLFSSL_KEIL
  89898. "sbcs r4, r4, r6\n\t"
  89899. #elif defined(__clang__)
  89900. "sbcs r4, r6\n\t"
  89901. #else
  89902. "sbc r4, r6\n\t"
  89903. #endif
  89904. "stm %[r]!, {r3, r4}\n\t"
  89905. "ldm %[b]!, {r5, r6}\n\t"
  89906. "ldm %[a]!, {r3, r4}\n\t"
  89907. #ifdef WOLFSSL_KEIL
  89908. "sbcs r3, r3, r5\n\t"
  89909. #elif defined(__clang__)
  89910. "sbcs r3, r5\n\t"
  89911. #else
  89912. "sbc r3, r5\n\t"
  89913. #endif
  89914. #ifdef WOLFSSL_KEIL
  89915. "sbcs r4, r4, r6\n\t"
  89916. #elif defined(__clang__)
  89917. "sbcs r4, r6\n\t"
  89918. #else
  89919. "sbc r4, r6\n\t"
  89920. #endif
  89921. "stm %[r]!, {r3, r4}\n\t"
  89922. "ldm %[b]!, {r5, r6}\n\t"
  89923. "ldm %[a]!, {r3, r4}\n\t"
  89924. #ifdef WOLFSSL_KEIL
  89925. "sbcs r3, r3, r5\n\t"
  89926. #elif defined(__clang__)
  89927. "sbcs r3, r5\n\t"
  89928. #else
  89929. "sbc r3, r5\n\t"
  89930. #endif
  89931. #ifdef WOLFSSL_KEIL
  89932. "sbcs r4, r4, r6\n\t"
  89933. #elif defined(__clang__)
  89934. "sbcs r4, r6\n\t"
  89935. #else
  89936. "sbc r4, r6\n\t"
  89937. #endif
  89938. "stm %[r]!, {r3, r4}\n\t"
  89939. "ldm %[b]!, {r5, r6}\n\t"
  89940. "ldm %[a]!, {r3, r4}\n\t"
  89941. #ifdef WOLFSSL_KEIL
  89942. "sbcs r3, r3, r5\n\t"
  89943. #elif defined(__clang__)
  89944. "sbcs r3, r5\n\t"
  89945. #else
  89946. "sbc r3, r5\n\t"
  89947. #endif
  89948. #ifdef WOLFSSL_KEIL
  89949. "sbcs r4, r4, r6\n\t"
  89950. #elif defined(__clang__)
  89951. "sbcs r4, r6\n\t"
  89952. #else
  89953. "sbc r4, r6\n\t"
  89954. #endif
  89955. "stm %[r]!, {r3, r4}\n\t"
  89956. "ldm %[b]!, {r5, r6}\n\t"
  89957. "ldm %[a]!, {r3, r4}\n\t"
  89958. #ifdef WOLFSSL_KEIL
  89959. "sbcs r3, r3, r5\n\t"
  89960. #elif defined(__clang__)
  89961. "sbcs r3, r5\n\t"
  89962. #else
  89963. "sbc r3, r5\n\t"
  89964. #endif
  89965. #ifdef WOLFSSL_KEIL
  89966. "sbcs r4, r4, r6\n\t"
  89967. #elif defined(__clang__)
  89968. "sbcs r4, r6\n\t"
  89969. #else
  89970. "sbc r4, r6\n\t"
  89971. #endif
  89972. "stm %[r]!, {r3, r4}\n\t"
  89973. "ldm %[b]!, {r5, r6}\n\t"
  89974. "ldm %[a]!, {r3, r4}\n\t"
  89975. #ifdef WOLFSSL_KEIL
  89976. "sbcs r3, r3, r5\n\t"
  89977. #elif defined(__clang__)
  89978. "sbcs r3, r5\n\t"
  89979. #else
  89980. "sbc r3, r5\n\t"
  89981. #endif
  89982. #ifdef WOLFSSL_KEIL
  89983. "sbcs r4, r4, r6\n\t"
  89984. #elif defined(__clang__)
  89985. "sbcs r4, r6\n\t"
  89986. #else
  89987. "sbc r4, r6\n\t"
  89988. #endif
  89989. "stm %[r]!, {r3, r4}\n\t"
  89990. "ldm %[b]!, {r5, r6}\n\t"
  89991. "ldm %[a]!, {r3, r4}\n\t"
  89992. #ifdef WOLFSSL_KEIL
  89993. "sbcs r3, r3, r5\n\t"
  89994. #elif defined(__clang__)
  89995. "sbcs r3, r5\n\t"
  89996. #else
  89997. "sbc r3, r5\n\t"
  89998. #endif
  89999. #ifdef WOLFSSL_KEIL
  90000. "sbcs r4, r4, r6\n\t"
  90001. #elif defined(__clang__)
  90002. "sbcs r4, r6\n\t"
  90003. #else
  90004. "sbc r4, r6\n\t"
  90005. #endif
  90006. "stm %[r]!, {r3, r4}\n\t"
  90007. "ldm %[b]!, {r5, r6}\n\t"
  90008. "ldm %[a]!, {r3, r4}\n\t"
  90009. #ifdef WOLFSSL_KEIL
  90010. "sbcs r3, r3, r5\n\t"
  90011. #elif defined(__clang__)
  90012. "sbcs r3, r5\n\t"
  90013. #else
  90014. "sbc r3, r5\n\t"
  90015. #endif
  90016. #ifdef WOLFSSL_KEIL
  90017. "sbcs r4, r4, r6\n\t"
  90018. #elif defined(__clang__)
  90019. "sbcs r4, r6\n\t"
  90020. #else
  90021. "sbc r4, r6\n\t"
  90022. #endif
  90023. "stm %[r]!, {r3, r4}\n\t"
  90024. "ldm %[b]!, {r5, r6}\n\t"
  90025. "ldm %[a]!, {r3, r4}\n\t"
  90026. #ifdef WOLFSSL_KEIL
  90027. "sbcs r3, r3, r5\n\t"
  90028. #elif defined(__clang__)
  90029. "sbcs r3, r5\n\t"
  90030. #else
  90031. "sbc r3, r5\n\t"
  90032. #endif
  90033. #ifdef WOLFSSL_KEIL
  90034. "sbcs r4, r4, r6\n\t"
  90035. #elif defined(__clang__)
  90036. "sbcs r4, r6\n\t"
  90037. #else
  90038. "sbc r4, r6\n\t"
  90039. #endif
  90040. "stm %[r]!, {r3, r4}\n\t"
  90041. "ldm %[b]!, {r5, r6}\n\t"
  90042. "ldm %[a]!, {r3, r4}\n\t"
  90043. #ifdef WOLFSSL_KEIL
  90044. "sbcs r3, r3, r5\n\t"
  90045. #elif defined(__clang__)
  90046. "sbcs r3, r5\n\t"
  90047. #else
  90048. "sbc r3, r5\n\t"
  90049. #endif
  90050. #ifdef WOLFSSL_KEIL
  90051. "sbcs r4, r4, r6\n\t"
  90052. #elif defined(__clang__)
  90053. "sbcs r4, r6\n\t"
  90054. #else
  90055. "sbc r4, r6\n\t"
  90056. #endif
  90057. "stm %[r]!, {r3, r4}\n\t"
  90058. "ldm %[b]!, {r5, r6}\n\t"
  90059. "ldm %[a]!, {r3, r4}\n\t"
  90060. #ifdef WOLFSSL_KEIL
  90061. "sbcs r3, r3, r5\n\t"
  90062. #elif defined(__clang__)
  90063. "sbcs r3, r5\n\t"
  90064. #else
  90065. "sbc r3, r5\n\t"
  90066. #endif
  90067. #ifdef WOLFSSL_KEIL
  90068. "sbcs r4, r4, r6\n\t"
  90069. #elif defined(__clang__)
  90070. "sbcs r4, r6\n\t"
  90071. #else
  90072. "sbc r4, r6\n\t"
  90073. #endif
  90074. "stm %[r]!, {r3, r4}\n\t"
  90075. "ldm %[b]!, {r5, r6}\n\t"
  90076. "ldm %[a]!, {r3, r4}\n\t"
  90077. #ifdef WOLFSSL_KEIL
  90078. "sbcs r3, r3, r5\n\t"
  90079. #elif defined(__clang__)
  90080. "sbcs r3, r5\n\t"
  90081. #else
  90082. "sbc r3, r5\n\t"
  90083. #endif
  90084. #ifdef WOLFSSL_KEIL
  90085. "sbcs r4, r4, r6\n\t"
  90086. #elif defined(__clang__)
  90087. "sbcs r4, r6\n\t"
  90088. #else
  90089. "sbc r4, r6\n\t"
  90090. #endif
  90091. "stm %[r]!, {r3, r4}\n\t"
  90092. "ldm %[b]!, {r5, r6}\n\t"
  90093. "ldm %[a]!, {r3, r4}\n\t"
  90094. #ifdef WOLFSSL_KEIL
  90095. "sbcs r3, r3, r5\n\t"
  90096. #elif defined(__clang__)
  90097. "sbcs r3, r5\n\t"
  90098. #else
  90099. "sbc r3, r5\n\t"
  90100. #endif
  90101. #ifdef WOLFSSL_KEIL
  90102. "sbcs r4, r4, r6\n\t"
  90103. #elif defined(__clang__)
  90104. "sbcs r4, r6\n\t"
  90105. #else
  90106. "sbc r4, r6\n\t"
  90107. #endif
  90108. "stm %[r]!, {r3, r4}\n\t"
  90109. "ldm %[b]!, {r5, r6}\n\t"
  90110. "ldm %[a]!, {r3, r4}\n\t"
  90111. #ifdef WOLFSSL_KEIL
  90112. "sbcs r3, r3, r5\n\t"
  90113. #elif defined(__clang__)
  90114. "sbcs r3, r5\n\t"
  90115. #else
  90116. "sbc r3, r5\n\t"
  90117. #endif
  90118. #ifdef WOLFSSL_KEIL
  90119. "sbcs r4, r4, r6\n\t"
  90120. #elif defined(__clang__)
  90121. "sbcs r4, r6\n\t"
  90122. #else
  90123. "sbc r4, r6\n\t"
  90124. #endif
  90125. "stm %[r]!, {r3, r4}\n\t"
  90126. "ldm %[b]!, {r5, r6}\n\t"
  90127. "ldm %[a]!, {r3, r4}\n\t"
  90128. #ifdef WOLFSSL_KEIL
  90129. "sbcs r3, r3, r5\n\t"
  90130. #elif defined(__clang__)
  90131. "sbcs r3, r5\n\t"
  90132. #else
  90133. "sbc r3, r5\n\t"
  90134. #endif
  90135. #ifdef WOLFSSL_KEIL
  90136. "sbcs r4, r4, r6\n\t"
  90137. #elif defined(__clang__)
  90138. "sbcs r4, r6\n\t"
  90139. #else
  90140. "sbc r4, r6\n\t"
  90141. #endif
  90142. "stm %[r]!, {r3, r4}\n\t"
  90143. "ldm %[b]!, {r5, r6}\n\t"
  90144. "ldm %[a]!, {r3, r4}\n\t"
  90145. #ifdef WOLFSSL_KEIL
  90146. "sbcs r3, r3, r5\n\t"
  90147. #elif defined(__clang__)
  90148. "sbcs r3, r5\n\t"
  90149. #else
  90150. "sbc r3, r5\n\t"
  90151. #endif
  90152. #ifdef WOLFSSL_KEIL
  90153. "sbcs r4, r4, r6\n\t"
  90154. #elif defined(__clang__)
  90155. "sbcs r4, r6\n\t"
  90156. #else
  90157. "sbc r4, r6\n\t"
  90158. #endif
  90159. "stm %[r]!, {r3, r4}\n\t"
  90160. "ldm %[b]!, {r5, r6}\n\t"
  90161. "ldm %[a]!, {r3, r4}\n\t"
  90162. #ifdef WOLFSSL_KEIL
  90163. "sbcs r3, r3, r5\n\t"
  90164. #elif defined(__clang__)
  90165. "sbcs r3, r5\n\t"
  90166. #else
  90167. "sbc r3, r5\n\t"
  90168. #endif
  90169. #ifdef WOLFSSL_KEIL
  90170. "sbcs r4, r4, r6\n\t"
  90171. #elif defined(__clang__)
  90172. "sbcs r4, r6\n\t"
  90173. #else
  90174. "sbc r4, r6\n\t"
  90175. #endif
  90176. "stm %[r]!, {r3, r4}\n\t"
  90177. "ldm %[b]!, {r5, r6}\n\t"
  90178. "ldm %[a]!, {r3, r4}\n\t"
  90179. #ifdef WOLFSSL_KEIL
  90180. "sbcs r3, r3, r5\n\t"
  90181. #elif defined(__clang__)
  90182. "sbcs r3, r5\n\t"
  90183. #else
  90184. "sbc r3, r5\n\t"
  90185. #endif
  90186. #ifdef WOLFSSL_KEIL
  90187. "sbcs r4, r4, r6\n\t"
  90188. #elif defined(__clang__)
  90189. "sbcs r4, r6\n\t"
  90190. #else
  90191. "sbc r4, r6\n\t"
  90192. #endif
  90193. "stm %[r]!, {r3, r4}\n\t"
  90194. "ldm %[b]!, {r5, r6}\n\t"
  90195. "ldm %[a]!, {r3, r4}\n\t"
  90196. #ifdef WOLFSSL_KEIL
  90197. "sbcs r3, r3, r5\n\t"
  90198. #elif defined(__clang__)
  90199. "sbcs r3, r5\n\t"
  90200. #else
  90201. "sbc r3, r5\n\t"
  90202. #endif
  90203. #ifdef WOLFSSL_KEIL
  90204. "sbcs r4, r4, r6\n\t"
  90205. #elif defined(__clang__)
  90206. "sbcs r4, r6\n\t"
  90207. #else
  90208. "sbc r4, r6\n\t"
  90209. #endif
  90210. "stm %[r]!, {r3, r4}\n\t"
  90211. "ldm %[b]!, {r5, r6}\n\t"
  90212. "ldm %[a]!, {r3, r4}\n\t"
  90213. #ifdef WOLFSSL_KEIL
  90214. "sbcs r3, r3, r5\n\t"
  90215. #elif defined(__clang__)
  90216. "sbcs r3, r5\n\t"
  90217. #else
  90218. "sbc r3, r5\n\t"
  90219. #endif
  90220. #ifdef WOLFSSL_KEIL
  90221. "sbcs r4, r4, r6\n\t"
  90222. #elif defined(__clang__)
  90223. "sbcs r4, r6\n\t"
  90224. #else
  90225. "sbc r4, r6\n\t"
  90226. #endif
  90227. "stm %[r]!, {r3, r4}\n\t"
  90228. "ldm %[b]!, {r5, r6}\n\t"
  90229. "ldm %[a]!, {r3, r4}\n\t"
  90230. #ifdef WOLFSSL_KEIL
  90231. "sbcs r3, r3, r5\n\t"
  90232. #elif defined(__clang__)
  90233. "sbcs r3, r5\n\t"
  90234. #else
  90235. "sbc r3, r5\n\t"
  90236. #endif
  90237. #ifdef WOLFSSL_KEIL
  90238. "sbcs r4, r4, r6\n\t"
  90239. #elif defined(__clang__)
  90240. "sbcs r4, r6\n\t"
  90241. #else
  90242. "sbc r4, r6\n\t"
  90243. #endif
  90244. "stm %[r]!, {r3, r4}\n\t"
  90245. "ldm %[b]!, {r5, r6}\n\t"
  90246. "ldm %[a]!, {r3, r4}\n\t"
  90247. #ifdef WOLFSSL_KEIL
  90248. "sbcs r3, r3, r5\n\t"
  90249. #elif defined(__clang__)
  90250. "sbcs r3, r5\n\t"
  90251. #else
  90252. "sbc r3, r5\n\t"
  90253. #endif
  90254. #ifdef WOLFSSL_KEIL
  90255. "sbcs r4, r4, r6\n\t"
  90256. #elif defined(__clang__)
  90257. "sbcs r4, r6\n\t"
  90258. #else
  90259. "sbc r4, r6\n\t"
  90260. #endif
  90261. "stm %[r]!, {r3, r4}\n\t"
  90262. "ldm %[b]!, {r5, r6}\n\t"
  90263. "ldm %[a]!, {r3, r4}\n\t"
  90264. #ifdef WOLFSSL_KEIL
  90265. "sbcs r3, r3, r5\n\t"
  90266. #elif defined(__clang__)
  90267. "sbcs r3, r5\n\t"
  90268. #else
  90269. "sbc r3, r5\n\t"
  90270. #endif
  90271. #ifdef WOLFSSL_KEIL
  90272. "sbcs r4, r4, r6\n\t"
  90273. #elif defined(__clang__)
  90274. "sbcs r4, r6\n\t"
  90275. #else
  90276. "sbc r4, r6\n\t"
  90277. #endif
  90278. "stm %[r]!, {r3, r4}\n\t"
  90279. "ldm %[b]!, {r5, r6}\n\t"
  90280. "ldm %[a]!, {r3, r4}\n\t"
  90281. #ifdef WOLFSSL_KEIL
  90282. "sbcs r3, r3, r5\n\t"
  90283. #elif defined(__clang__)
  90284. "sbcs r3, r5\n\t"
  90285. #else
  90286. "sbc r3, r5\n\t"
  90287. #endif
  90288. #ifdef WOLFSSL_KEIL
  90289. "sbcs r4, r4, r6\n\t"
  90290. #elif defined(__clang__)
  90291. "sbcs r4, r6\n\t"
  90292. #else
  90293. "sbc r4, r6\n\t"
  90294. #endif
  90295. "stm %[r]!, {r3, r4}\n\t"
  90296. "ldm %[b]!, {r5, r6}\n\t"
  90297. "ldm %[a]!, {r3, r4}\n\t"
  90298. #ifdef WOLFSSL_KEIL
  90299. "sbcs r3, r3, r5\n\t"
  90300. #elif defined(__clang__)
  90301. "sbcs r3, r5\n\t"
  90302. #else
  90303. "sbc r3, r5\n\t"
  90304. #endif
  90305. #ifdef WOLFSSL_KEIL
  90306. "sbcs r4, r4, r6\n\t"
  90307. #elif defined(__clang__)
  90308. "sbcs r4, r6\n\t"
  90309. #else
  90310. "sbc r4, r6\n\t"
  90311. #endif
  90312. "stm %[r]!, {r3, r4}\n\t"
  90313. "ldm %[b]!, {r5, r6}\n\t"
  90314. "ldm %[a]!, {r3, r4}\n\t"
  90315. #ifdef WOLFSSL_KEIL
  90316. "sbcs r3, r3, r5\n\t"
  90317. #elif defined(__clang__)
  90318. "sbcs r3, r5\n\t"
  90319. #else
  90320. "sbc r3, r5\n\t"
  90321. #endif
  90322. #ifdef WOLFSSL_KEIL
  90323. "sbcs r4, r4, r6\n\t"
  90324. #elif defined(__clang__)
  90325. "sbcs r4, r6\n\t"
  90326. #else
  90327. "sbc r4, r6\n\t"
  90328. #endif
  90329. "stm %[r]!, {r3, r4}\n\t"
  90330. "ldm %[b]!, {r5, r6}\n\t"
  90331. "ldm %[a]!, {r3, r4}\n\t"
  90332. #ifdef WOLFSSL_KEIL
  90333. "sbcs r3, r3, r5\n\t"
  90334. #elif defined(__clang__)
  90335. "sbcs r3, r5\n\t"
  90336. #else
  90337. "sbc r3, r5\n\t"
  90338. #endif
  90339. #ifdef WOLFSSL_KEIL
  90340. "sbcs r4, r4, r6\n\t"
  90341. #elif defined(__clang__)
  90342. "sbcs r4, r6\n\t"
  90343. #else
  90344. "sbc r4, r6\n\t"
  90345. #endif
  90346. "stm %[r]!, {r3, r4}\n\t"
  90347. "ldm %[b]!, {r5, r6}\n\t"
  90348. "ldm %[a]!, {r3, r4}\n\t"
  90349. #ifdef WOLFSSL_KEIL
  90350. "sbcs r3, r3, r5\n\t"
  90351. #elif defined(__clang__)
  90352. "sbcs r3, r5\n\t"
  90353. #else
  90354. "sbc r3, r5\n\t"
  90355. #endif
  90356. #ifdef WOLFSSL_KEIL
  90357. "sbcs r4, r4, r6\n\t"
  90358. #elif defined(__clang__)
  90359. "sbcs r4, r6\n\t"
  90360. #else
  90361. "sbc r4, r6\n\t"
  90362. #endif
  90363. "stm %[r]!, {r3, r4}\n\t"
  90364. "ldm %[b]!, {r5, r6}\n\t"
  90365. "ldm %[a]!, {r3, r4}\n\t"
  90366. #ifdef WOLFSSL_KEIL
  90367. "sbcs r3, r3, r5\n\t"
  90368. #elif defined(__clang__)
  90369. "sbcs r3, r5\n\t"
  90370. #else
  90371. "sbc r3, r5\n\t"
  90372. #endif
  90373. #ifdef WOLFSSL_KEIL
  90374. "sbcs r4, r4, r6\n\t"
  90375. #elif defined(__clang__)
  90376. "sbcs r4, r6\n\t"
  90377. #else
  90378. "sbc r4, r6\n\t"
  90379. #endif
  90380. "stm %[r]!, {r3, r4}\n\t"
  90381. "ldm %[b]!, {r5, r6}\n\t"
  90382. "ldm %[a]!, {r3, r4}\n\t"
  90383. #ifdef WOLFSSL_KEIL
  90384. "sbcs r3, r3, r5\n\t"
  90385. #elif defined(__clang__)
  90386. "sbcs r3, r5\n\t"
  90387. #else
  90388. "sbc r3, r5\n\t"
  90389. #endif
  90390. #ifdef WOLFSSL_KEIL
  90391. "sbcs r4, r4, r6\n\t"
  90392. #elif defined(__clang__)
  90393. "sbcs r4, r6\n\t"
  90394. #else
  90395. "sbc r4, r6\n\t"
  90396. #endif
  90397. "stm %[r]!, {r3, r4}\n\t"
  90398. "ldm %[b]!, {r5, r6}\n\t"
  90399. "ldm %[a]!, {r3, r4}\n\t"
  90400. #ifdef WOLFSSL_KEIL
  90401. "sbcs r3, r3, r5\n\t"
  90402. #elif defined(__clang__)
  90403. "sbcs r3, r5\n\t"
  90404. #else
  90405. "sbc r3, r5\n\t"
  90406. #endif
  90407. #ifdef WOLFSSL_KEIL
  90408. "sbcs r4, r4, r6\n\t"
  90409. #elif defined(__clang__)
  90410. "sbcs r4, r6\n\t"
  90411. #else
  90412. "sbc r4, r6\n\t"
  90413. #endif
  90414. "stm %[r]!, {r3, r4}\n\t"
  90415. "ldm %[b]!, {r5, r6}\n\t"
  90416. "ldm %[a]!, {r3, r4}\n\t"
  90417. #ifdef WOLFSSL_KEIL
  90418. "sbcs r3, r3, r5\n\t"
  90419. #elif defined(__clang__)
  90420. "sbcs r3, r5\n\t"
  90421. #else
  90422. "sbc r3, r5\n\t"
  90423. #endif
  90424. #ifdef WOLFSSL_KEIL
  90425. "sbcs r4, r4, r6\n\t"
  90426. #elif defined(__clang__)
  90427. "sbcs r4, r6\n\t"
  90428. #else
  90429. "sbc r4, r6\n\t"
  90430. #endif
  90431. "stm %[r]!, {r3, r4}\n\t"
  90432. "ldm %[b]!, {r5, r6}\n\t"
  90433. "ldm %[a]!, {r3, r4}\n\t"
  90434. #ifdef WOLFSSL_KEIL
  90435. "sbcs r3, r3, r5\n\t"
  90436. #elif defined(__clang__)
  90437. "sbcs r3, r5\n\t"
  90438. #else
  90439. "sbc r3, r5\n\t"
  90440. #endif
  90441. #ifdef WOLFSSL_KEIL
  90442. "sbcs r4, r4, r6\n\t"
  90443. #elif defined(__clang__)
  90444. "sbcs r4, r6\n\t"
  90445. #else
  90446. "sbc r4, r6\n\t"
  90447. #endif
  90448. "stm %[r]!, {r3, r4}\n\t"
  90449. "ldm %[b]!, {r5, r6}\n\t"
  90450. "ldm %[a]!, {r3, r4}\n\t"
  90451. #ifdef WOLFSSL_KEIL
  90452. "sbcs r3, r3, r5\n\t"
  90453. #elif defined(__clang__)
  90454. "sbcs r3, r5\n\t"
  90455. #else
  90456. "sbc r3, r5\n\t"
  90457. #endif
  90458. #ifdef WOLFSSL_KEIL
  90459. "sbcs r4, r4, r6\n\t"
  90460. #elif defined(__clang__)
  90461. "sbcs r4, r6\n\t"
  90462. #else
  90463. "sbc r4, r6\n\t"
  90464. #endif
  90465. "stm %[r]!, {r3, r4}\n\t"
  90466. "ldm %[b]!, {r5, r6}\n\t"
  90467. "ldm %[a]!, {r3, r4}\n\t"
  90468. #ifdef WOLFSSL_KEIL
  90469. "sbcs r3, r3, r5\n\t"
  90470. #elif defined(__clang__)
  90471. "sbcs r3, r5\n\t"
  90472. #else
  90473. "sbc r3, r5\n\t"
  90474. #endif
  90475. #ifdef WOLFSSL_KEIL
  90476. "sbcs r4, r4, r6\n\t"
  90477. #elif defined(__clang__)
  90478. "sbcs r4, r6\n\t"
  90479. #else
  90480. "sbc r4, r6\n\t"
  90481. #endif
  90482. "stm %[r]!, {r3, r4}\n\t"
  90483. "ldm %[b]!, {r5, r6}\n\t"
  90484. "ldm %[a]!, {r3, r4}\n\t"
  90485. #ifdef WOLFSSL_KEIL
  90486. "sbcs r3, r3, r5\n\t"
  90487. #elif defined(__clang__)
  90488. "sbcs r3, r5\n\t"
  90489. #else
  90490. "sbc r3, r5\n\t"
  90491. #endif
  90492. #ifdef WOLFSSL_KEIL
  90493. "sbcs r4, r4, r6\n\t"
  90494. #elif defined(__clang__)
  90495. "sbcs r4, r6\n\t"
  90496. #else
  90497. "sbc r4, r6\n\t"
  90498. #endif
  90499. "stm %[r]!, {r3, r4}\n\t"
  90500. "ldm %[b]!, {r5, r6}\n\t"
  90501. "ldm %[a]!, {r3, r4}\n\t"
  90502. #ifdef WOLFSSL_KEIL
  90503. "sbcs r3, r3, r5\n\t"
  90504. #elif defined(__clang__)
  90505. "sbcs r3, r5\n\t"
  90506. #else
  90507. "sbc r3, r5\n\t"
  90508. #endif
  90509. #ifdef WOLFSSL_KEIL
  90510. "sbcs r4, r4, r6\n\t"
  90511. #elif defined(__clang__)
  90512. "sbcs r4, r6\n\t"
  90513. #else
  90514. "sbc r4, r6\n\t"
  90515. #endif
  90516. "stm %[r]!, {r3, r4}\n\t"
  90517. "ldm %[b]!, {r5, r6}\n\t"
  90518. "ldm %[a]!, {r3, r4}\n\t"
  90519. #ifdef WOLFSSL_KEIL
  90520. "sbcs r3, r3, r5\n\t"
  90521. #elif defined(__clang__)
  90522. "sbcs r3, r5\n\t"
  90523. #else
  90524. "sbc r3, r5\n\t"
  90525. #endif
  90526. #ifdef WOLFSSL_KEIL
  90527. "sbcs r4, r4, r6\n\t"
  90528. #elif defined(__clang__)
  90529. "sbcs r4, r6\n\t"
  90530. #else
  90531. "sbc r4, r6\n\t"
  90532. #endif
  90533. "stm %[r]!, {r3, r4}\n\t"
  90534. "ldm %[b]!, {r5, r6}\n\t"
  90535. "ldm %[a]!, {r3, r4}\n\t"
  90536. #ifdef WOLFSSL_KEIL
  90537. "sbcs r3, r3, r5\n\t"
  90538. #elif defined(__clang__)
  90539. "sbcs r3, r5\n\t"
  90540. #else
  90541. "sbc r3, r5\n\t"
  90542. #endif
  90543. #ifdef WOLFSSL_KEIL
  90544. "sbcs r4, r4, r6\n\t"
  90545. #elif defined(__clang__)
  90546. "sbcs r4, r6\n\t"
  90547. #else
  90548. "sbc r4, r6\n\t"
  90549. #endif
  90550. "stm %[r]!, {r3, r4}\n\t"
  90551. "ldm %[b]!, {r5, r6}\n\t"
  90552. "ldm %[a]!, {r3, r4}\n\t"
  90553. #ifdef WOLFSSL_KEIL
  90554. "sbcs r3, r3, r5\n\t"
  90555. #elif defined(__clang__)
  90556. "sbcs r3, r5\n\t"
  90557. #else
  90558. "sbc r3, r5\n\t"
  90559. #endif
  90560. #ifdef WOLFSSL_KEIL
  90561. "sbcs r4, r4, r6\n\t"
  90562. #elif defined(__clang__)
  90563. "sbcs r4, r6\n\t"
  90564. #else
  90565. "sbc r4, r6\n\t"
  90566. #endif
  90567. "stm %[r]!, {r3, r4}\n\t"
  90568. "ldm %[b]!, {r5, r6}\n\t"
  90569. "ldm %[a]!, {r3, r4}\n\t"
  90570. #ifdef WOLFSSL_KEIL
  90571. "sbcs r3, r3, r5\n\t"
  90572. #elif defined(__clang__)
  90573. "sbcs r3, r5\n\t"
  90574. #else
  90575. "sbc r3, r5\n\t"
  90576. #endif
  90577. #ifdef WOLFSSL_KEIL
  90578. "sbcs r4, r4, r6\n\t"
  90579. #elif defined(__clang__)
  90580. "sbcs r4, r6\n\t"
  90581. #else
  90582. "sbc r4, r6\n\t"
  90583. #endif
  90584. "stm %[r]!, {r3, r4}\n\t"
  90585. "ldm %[b]!, {r5, r6}\n\t"
  90586. "ldm %[a]!, {r3, r4}\n\t"
  90587. #ifdef WOLFSSL_KEIL
  90588. "sbcs r3, r3, r5\n\t"
  90589. #elif defined(__clang__)
  90590. "sbcs r3, r5\n\t"
  90591. #else
  90592. "sbc r3, r5\n\t"
  90593. #endif
  90594. #ifdef WOLFSSL_KEIL
  90595. "sbcs r4, r4, r6\n\t"
  90596. #elif defined(__clang__)
  90597. "sbcs r4, r6\n\t"
  90598. #else
  90599. "sbc r4, r6\n\t"
  90600. #endif
  90601. "stm %[r]!, {r3, r4}\n\t"
  90602. "ldm %[b]!, {r5, r6}\n\t"
  90603. "ldm %[a]!, {r3, r4}\n\t"
  90604. #ifdef WOLFSSL_KEIL
  90605. "sbcs r3, r3, r5\n\t"
  90606. #elif defined(__clang__)
  90607. "sbcs r3, r5\n\t"
  90608. #else
  90609. "sbc r3, r5\n\t"
  90610. #endif
  90611. #ifdef WOLFSSL_KEIL
  90612. "sbcs r4, r4, r6\n\t"
  90613. #elif defined(__clang__)
  90614. "sbcs r4, r6\n\t"
  90615. #else
  90616. "sbc r4, r6\n\t"
  90617. #endif
  90618. "stm %[r]!, {r3, r4}\n\t"
  90619. "ldm %[b]!, {r5, r6}\n\t"
  90620. "ldm %[a]!, {r3, r4}\n\t"
  90621. #ifdef WOLFSSL_KEIL
  90622. "sbcs r3, r3, r5\n\t"
  90623. #elif defined(__clang__)
  90624. "sbcs r3, r5\n\t"
  90625. #else
  90626. "sbc r3, r5\n\t"
  90627. #endif
  90628. #ifdef WOLFSSL_KEIL
  90629. "sbcs r4, r4, r6\n\t"
  90630. #elif defined(__clang__)
  90631. "sbcs r4, r6\n\t"
  90632. #else
  90633. "sbc r4, r6\n\t"
  90634. #endif
  90635. "stm %[r]!, {r3, r4}\n\t"
  90636. "ldm %[b]!, {r5, r6}\n\t"
  90637. "ldm %[a]!, {r3, r4}\n\t"
  90638. #ifdef WOLFSSL_KEIL
  90639. "sbcs r3, r3, r5\n\t"
  90640. #elif defined(__clang__)
  90641. "sbcs r3, r5\n\t"
  90642. #else
  90643. "sbc r3, r5\n\t"
  90644. #endif
  90645. #ifdef WOLFSSL_KEIL
  90646. "sbcs r4, r4, r6\n\t"
  90647. #elif defined(__clang__)
  90648. "sbcs r4, r6\n\t"
  90649. #else
  90650. "sbc r4, r6\n\t"
  90651. #endif
  90652. "stm %[r]!, {r3, r4}\n\t"
  90653. "ldm %[b]!, {r5, r6}\n\t"
  90654. "ldm %[a]!, {r3, r4}\n\t"
  90655. #ifdef WOLFSSL_KEIL
  90656. "sbcs r3, r3, r5\n\t"
  90657. #elif defined(__clang__)
  90658. "sbcs r3, r5\n\t"
  90659. #else
  90660. "sbc r3, r5\n\t"
  90661. #endif
  90662. #ifdef WOLFSSL_KEIL
  90663. "sbcs r4, r4, r6\n\t"
  90664. #elif defined(__clang__)
  90665. "sbcs r4, r6\n\t"
  90666. #else
  90667. "sbc r4, r6\n\t"
  90668. #endif
  90669. "stm %[r]!, {r3, r4}\n\t"
  90670. "ldm %[b]!, {r5, r6}\n\t"
  90671. "ldm %[a]!, {r3, r4}\n\t"
  90672. #ifdef WOLFSSL_KEIL
  90673. "sbcs r3, r3, r5\n\t"
  90674. #elif defined(__clang__)
  90675. "sbcs r3, r5\n\t"
  90676. #else
  90677. "sbc r3, r5\n\t"
  90678. #endif
  90679. #ifdef WOLFSSL_KEIL
  90680. "sbcs r4, r4, r6\n\t"
  90681. #elif defined(__clang__)
  90682. "sbcs r4, r6\n\t"
  90683. #else
  90684. "sbc r4, r6\n\t"
  90685. #endif
  90686. "stm %[r]!, {r3, r4}\n\t"
  90687. "ldm %[b]!, {r5, r6}\n\t"
  90688. "ldm %[a]!, {r3, r4}\n\t"
  90689. #ifdef WOLFSSL_KEIL
  90690. "sbcs r3, r3, r5\n\t"
  90691. #elif defined(__clang__)
  90692. "sbcs r3, r5\n\t"
  90693. #else
  90694. "sbc r3, r5\n\t"
  90695. #endif
  90696. #ifdef WOLFSSL_KEIL
  90697. "sbcs r4, r4, r6\n\t"
  90698. #elif defined(__clang__)
  90699. "sbcs r4, r6\n\t"
  90700. #else
  90701. "sbc r4, r6\n\t"
  90702. #endif
  90703. "stm %[r]!, {r3, r4}\n\t"
  90704. "ldm %[b]!, {r5, r6}\n\t"
  90705. "ldm %[a]!, {r3, r4}\n\t"
  90706. #ifdef WOLFSSL_KEIL
  90707. "sbcs r3, r3, r5\n\t"
  90708. #elif defined(__clang__)
  90709. "sbcs r3, r5\n\t"
  90710. #else
  90711. "sbc r3, r5\n\t"
  90712. #endif
  90713. #ifdef WOLFSSL_KEIL
  90714. "sbcs r4, r4, r6\n\t"
  90715. #elif defined(__clang__)
  90716. "sbcs r4, r6\n\t"
  90717. #else
  90718. "sbc r4, r6\n\t"
  90719. #endif
  90720. "stm %[r]!, {r3, r4}\n\t"
  90721. "ldm %[b]!, {r5, r6}\n\t"
  90722. "ldm %[a]!, {r3, r4}\n\t"
  90723. #ifdef WOLFSSL_KEIL
  90724. "sbcs r3, r3, r5\n\t"
  90725. #elif defined(__clang__)
  90726. "sbcs r3, r5\n\t"
  90727. #else
  90728. "sbc r3, r5\n\t"
  90729. #endif
  90730. #ifdef WOLFSSL_KEIL
  90731. "sbcs r4, r4, r6\n\t"
  90732. #elif defined(__clang__)
  90733. "sbcs r4, r6\n\t"
  90734. #else
  90735. "sbc r4, r6\n\t"
  90736. #endif
  90737. "stm %[r]!, {r3, r4}\n\t"
  90738. "ldm %[b]!, {r5, r6}\n\t"
  90739. "ldm %[a]!, {r3, r4}\n\t"
  90740. #ifdef WOLFSSL_KEIL
  90741. "sbcs r3, r3, r5\n\t"
  90742. #elif defined(__clang__)
  90743. "sbcs r3, r5\n\t"
  90744. #else
  90745. "sbc r3, r5\n\t"
  90746. #endif
  90747. #ifdef WOLFSSL_KEIL
  90748. "sbcs r4, r4, r6\n\t"
  90749. #elif defined(__clang__)
  90750. "sbcs r4, r6\n\t"
  90751. #else
  90752. "sbc r4, r6\n\t"
  90753. #endif
  90754. "stm %[r]!, {r3, r4}\n\t"
  90755. "ldm %[b]!, {r5, r6}\n\t"
  90756. "ldm %[a]!, {r3, r4}\n\t"
  90757. #ifdef WOLFSSL_KEIL
  90758. "sbcs r3, r3, r5\n\t"
  90759. #elif defined(__clang__)
  90760. "sbcs r3, r5\n\t"
  90761. #else
  90762. "sbc r3, r5\n\t"
  90763. #endif
  90764. #ifdef WOLFSSL_KEIL
  90765. "sbcs r4, r4, r6\n\t"
  90766. #elif defined(__clang__)
  90767. "sbcs r4, r6\n\t"
  90768. #else
  90769. "sbc r4, r6\n\t"
  90770. #endif
  90771. "stm %[r]!, {r3, r4}\n\t"
  90772. "ldm %[b]!, {r5, r6}\n\t"
  90773. "ldm %[a]!, {r3, r4}\n\t"
  90774. #ifdef WOLFSSL_KEIL
  90775. "sbcs r3, r3, r5\n\t"
  90776. #elif defined(__clang__)
  90777. "sbcs r3, r5\n\t"
  90778. #else
  90779. "sbc r3, r5\n\t"
  90780. #endif
  90781. #ifdef WOLFSSL_KEIL
  90782. "sbcs r4, r4, r6\n\t"
  90783. #elif defined(__clang__)
  90784. "sbcs r4, r6\n\t"
  90785. #else
  90786. "sbc r4, r6\n\t"
  90787. #endif
  90788. "stm %[r]!, {r3, r4}\n\t"
  90789. "ldm %[b]!, {r5, r6}\n\t"
  90790. "ldm %[a]!, {r3, r4}\n\t"
  90791. #ifdef WOLFSSL_KEIL
  90792. "sbcs r3, r3, r5\n\t"
  90793. #elif defined(__clang__)
  90794. "sbcs r3, r5\n\t"
  90795. #else
  90796. "sbc r3, r5\n\t"
  90797. #endif
  90798. #ifdef WOLFSSL_KEIL
  90799. "sbcs r4, r4, r6\n\t"
  90800. #elif defined(__clang__)
  90801. "sbcs r4, r6\n\t"
  90802. #else
  90803. "sbc r4, r6\n\t"
  90804. #endif
  90805. "stm %[r]!, {r3, r4}\n\t"
  90806. "ldm %[b]!, {r5, r6}\n\t"
  90807. "ldm %[a]!, {r3, r4}\n\t"
  90808. #ifdef WOLFSSL_KEIL
  90809. "sbcs r3, r3, r5\n\t"
  90810. #elif defined(__clang__)
  90811. "sbcs r3, r5\n\t"
  90812. #else
  90813. "sbc r3, r5\n\t"
  90814. #endif
  90815. #ifdef WOLFSSL_KEIL
  90816. "sbcs r4, r4, r6\n\t"
  90817. #elif defined(__clang__)
  90818. "sbcs r4, r6\n\t"
  90819. #else
  90820. "sbc r4, r6\n\t"
  90821. #endif
  90822. "stm %[r]!, {r3, r4}\n\t"
  90823. "ldm %[b]!, {r5, r6}\n\t"
  90824. "ldm %[a]!, {r3, r4}\n\t"
  90825. #ifdef WOLFSSL_KEIL
  90826. "sbcs r3, r3, r5\n\t"
  90827. #elif defined(__clang__)
  90828. "sbcs r3, r5\n\t"
  90829. #else
  90830. "sbc r3, r5\n\t"
  90831. #endif
  90832. #ifdef WOLFSSL_KEIL
  90833. "sbcs r4, r4, r6\n\t"
  90834. #elif defined(__clang__)
  90835. "sbcs r4, r6\n\t"
  90836. #else
  90837. "sbc r4, r6\n\t"
  90838. #endif
  90839. "stm %[r]!, {r3, r4}\n\t"
  90840. "ldm %[b]!, {r5, r6}\n\t"
  90841. "ldm %[a]!, {r3, r4}\n\t"
  90842. #ifdef WOLFSSL_KEIL
  90843. "sbcs r3, r3, r5\n\t"
  90844. #elif defined(__clang__)
  90845. "sbcs r3, r5\n\t"
  90846. #else
  90847. "sbc r3, r5\n\t"
  90848. #endif
  90849. #ifdef WOLFSSL_KEIL
  90850. "sbcs r4, r4, r6\n\t"
  90851. #elif defined(__clang__)
  90852. "sbcs r4, r6\n\t"
  90853. #else
  90854. "sbc r4, r6\n\t"
  90855. #endif
  90856. "stm %[r]!, {r3, r4}\n\t"
  90857. "ldm %[b]!, {r5, r6}\n\t"
  90858. "ldm %[a]!, {r3, r4}\n\t"
  90859. #ifdef WOLFSSL_KEIL
  90860. "sbcs r3, r3, r5\n\t"
  90861. #elif defined(__clang__)
  90862. "sbcs r3, r5\n\t"
  90863. #else
  90864. "sbc r3, r5\n\t"
  90865. #endif
  90866. #ifdef WOLFSSL_KEIL
  90867. "sbcs r4, r4, r6\n\t"
  90868. #elif defined(__clang__)
  90869. "sbcs r4, r6\n\t"
  90870. #else
  90871. "sbc r4, r6\n\t"
  90872. #endif
  90873. "stm %[r]!, {r3, r4}\n\t"
  90874. "ldm %[b]!, {r5, r6}\n\t"
  90875. "ldm %[a]!, {r3, r4}\n\t"
  90876. #ifdef WOLFSSL_KEIL
  90877. "sbcs r3, r3, r5\n\t"
  90878. #elif defined(__clang__)
  90879. "sbcs r3, r5\n\t"
  90880. #else
  90881. "sbc r3, r5\n\t"
  90882. #endif
  90883. #ifdef WOLFSSL_KEIL
  90884. "sbcs r4, r4, r6\n\t"
  90885. #elif defined(__clang__)
  90886. "sbcs r4, r6\n\t"
  90887. #else
  90888. "sbc r4, r6\n\t"
  90889. #endif
  90890. "stm %[r]!, {r3, r4}\n\t"
  90891. "ldm %[b]!, {r5, r6}\n\t"
  90892. "ldm %[a]!, {r3, r4}\n\t"
  90893. #ifdef WOLFSSL_KEIL
  90894. "sbcs r3, r3, r5\n\t"
  90895. #elif defined(__clang__)
  90896. "sbcs r3, r5\n\t"
  90897. #else
  90898. "sbc r3, r5\n\t"
  90899. #endif
  90900. #ifdef WOLFSSL_KEIL
  90901. "sbcs r4, r4, r6\n\t"
  90902. #elif defined(__clang__)
  90903. "sbcs r4, r6\n\t"
  90904. #else
  90905. "sbc r4, r6\n\t"
  90906. #endif
  90907. "stm %[r]!, {r3, r4}\n\t"
  90908. #ifdef WOLFSSL_KEIL
  90909. "sbcs %[r], %[r], %[r]\n\t"
  90910. #elif defined(__clang__)
  90911. "sbcs %[r], %[r]\n\t"
  90912. #else
  90913. "sbc %[r], %[r]\n\t"
  90914. #endif
  90915. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  90916. :
  90917. : "memory", "r3", "r4", "r5", "r6"
  90918. );
  90919. return (uint32_t)(size_t)r;
  90920. }
  90921. #endif /* WOLFSSL_SP_SMALL */
  90922. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  90923. *
  90924. * d1 The high order half of the number to divide.
  90925. * d0 The low order half of the number to divide.
  90926. * div The divisor.
  90927. * returns the result of the division.
  90928. *
  90929. * Note that this is an approximate div. It may give an answer 1 larger.
  90930. */
  90931. SP_NOINLINE static sp_digit div_4096_word_128(sp_digit d1, sp_digit d0,
  90932. sp_digit div)
  90933. {
  90934. __asm__ __volatile__ (
  90935. "movs r3, #0\n\t"
  90936. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90937. "lsrs r5, %[div], #1\n\t"
  90938. #else
  90939. "lsr r5, %[div], #1\n\t"
  90940. #endif
  90941. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90942. "adds r5, r5, #1\n\t"
  90943. #else
  90944. "add r5, r5, #1\n\t"
  90945. #endif
  90946. "mov r8, %[d0]\n\t"
  90947. "mov r9, %[d1]\n\t"
  90948. "# Do top 32\n\t"
  90949. "movs r6, r5\n\t"
  90950. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90951. "subs r6, r6, %[d1]\n\t"
  90952. #else
  90953. "sub r6, r6, %[d1]\n\t"
  90954. #endif
  90955. #ifdef WOLFSSL_KEIL
  90956. "sbcs r6, r6, r6\n\t"
  90957. #elif defined(__clang__)
  90958. "sbcs r6, r6\n\t"
  90959. #else
  90960. "sbc r6, r6\n\t"
  90961. #endif
  90962. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90963. "adds r3, r3, r3\n\t"
  90964. #else
  90965. "add r3, r3, r3\n\t"
  90966. #endif
  90967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90968. "subs r3, r3, r6\n\t"
  90969. #else
  90970. "sub r3, r3, r6\n\t"
  90971. #endif
  90972. #ifdef WOLFSSL_KEIL
  90973. "ands r6, r6, r5\n\t"
  90974. #elif defined(__clang__)
  90975. "ands r6, r5\n\t"
  90976. #else
  90977. "and r6, r5\n\t"
  90978. #endif
  90979. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90980. "subs %[d1], %[d1], r6\n\t"
  90981. #else
  90982. "sub %[d1], %[d1], r6\n\t"
  90983. #endif
  90984. "movs r4, #29\n\t"
  90985. "\n"
  90986. "L_div_4096_word_128_loop_%=:\n\t"
  90987. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90988. "lsls %[d0], %[d0], #1\n\t"
  90989. #else
  90990. "lsl %[d0], %[d0], #1\n\t"
  90991. #endif
  90992. #ifdef WOLFSSL_KEIL
  90993. "adcs %[d1], %[d1], %[d1]\n\t"
  90994. #elif defined(__clang__)
  90995. "adcs %[d1], %[d1]\n\t"
  90996. #else
  90997. "adc %[d1], %[d1]\n\t"
  90998. #endif
  90999. "movs r6, r5\n\t"
  91000. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91001. "subs r6, r6, %[d1]\n\t"
  91002. #else
  91003. "sub r6, r6, %[d1]\n\t"
  91004. #endif
  91005. #ifdef WOLFSSL_KEIL
  91006. "sbcs r6, r6, r6\n\t"
  91007. #elif defined(__clang__)
  91008. "sbcs r6, r6\n\t"
  91009. #else
  91010. "sbc r6, r6\n\t"
  91011. #endif
  91012. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91013. "adds r3, r3, r3\n\t"
  91014. #else
  91015. "add r3, r3, r3\n\t"
  91016. #endif
  91017. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91018. "subs r3, r3, r6\n\t"
  91019. #else
  91020. "sub r3, r3, r6\n\t"
  91021. #endif
  91022. #ifdef WOLFSSL_KEIL
  91023. "ands r6, r6, r5\n\t"
  91024. #elif defined(__clang__)
  91025. "ands r6, r5\n\t"
  91026. #else
  91027. "and r6, r5\n\t"
  91028. #endif
  91029. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91030. "subs %[d1], %[d1], r6\n\t"
  91031. #else
  91032. "sub %[d1], %[d1], r6\n\t"
  91033. #endif
  91034. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91035. "subs r4, r4, #1\n\t"
  91036. #else
  91037. "sub r4, r4, #1\n\t"
  91038. #endif
  91039. "bpl L_div_4096_word_128_loop_%=\n\t"
  91040. "movs r7, #0\n\t"
  91041. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91042. "adds r3, r3, r3\n\t"
  91043. #else
  91044. "add r3, r3, r3\n\t"
  91045. #endif
  91046. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91047. "adds r3, r3, #1\n\t"
  91048. #else
  91049. "add r3, r3, #1\n\t"
  91050. #endif
  91051. "# r * div - Start\n\t"
  91052. "uxth %[d1], r3\n\t"
  91053. "uxth r4, %[div]\n\t"
  91054. #ifdef WOLFSSL_KEIL
  91055. "muls r4, %[d1], r4\n\t"
  91056. #elif defined(__clang__)
  91057. "muls r4, %[d1]\n\t"
  91058. #else
  91059. "mul r4, %[d1]\n\t"
  91060. #endif
  91061. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91062. "lsrs r6, %[div], #16\n\t"
  91063. #else
  91064. "lsr r6, %[div], #16\n\t"
  91065. #endif
  91066. #ifdef WOLFSSL_KEIL
  91067. "muls %[d1], r6, %[d1]\n\t"
  91068. #elif defined(__clang__)
  91069. "muls %[d1], r6\n\t"
  91070. #else
  91071. "mul %[d1], r6\n\t"
  91072. #endif
  91073. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91074. "lsrs r5, %[d1], #16\n\t"
  91075. #else
  91076. "lsr r5, %[d1], #16\n\t"
  91077. #endif
  91078. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91079. "lsls %[d1], %[d1], #16\n\t"
  91080. #else
  91081. "lsl %[d1], %[d1], #16\n\t"
  91082. #endif
  91083. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91084. "adds r4, r4, %[d1]\n\t"
  91085. #else
  91086. "add r4, r4, %[d1]\n\t"
  91087. #endif
  91088. #ifdef WOLFSSL_KEIL
  91089. "adcs r5, r5, r7\n\t"
  91090. #elif defined(__clang__)
  91091. "adcs r5, r7\n\t"
  91092. #else
  91093. "adc r5, r7\n\t"
  91094. #endif
  91095. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91096. "lsrs %[d1], r3, #16\n\t"
  91097. #else
  91098. "lsr %[d1], r3, #16\n\t"
  91099. #endif
  91100. #ifdef WOLFSSL_KEIL
  91101. "muls r6, %[d1], r6\n\t"
  91102. #elif defined(__clang__)
  91103. "muls r6, %[d1]\n\t"
  91104. #else
  91105. "mul r6, %[d1]\n\t"
  91106. #endif
  91107. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91108. "adds r5, r5, r6\n\t"
  91109. #else
  91110. "add r5, r5, r6\n\t"
  91111. #endif
  91112. "uxth r6, %[div]\n\t"
  91113. #ifdef WOLFSSL_KEIL
  91114. "muls %[d1], r6, %[d1]\n\t"
  91115. #elif defined(__clang__)
  91116. "muls %[d1], r6\n\t"
  91117. #else
  91118. "mul %[d1], r6\n\t"
  91119. #endif
  91120. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91121. "lsrs r6, %[d1], #16\n\t"
  91122. #else
  91123. "lsr r6, %[d1], #16\n\t"
  91124. #endif
  91125. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91126. "lsls %[d1], %[d1], #16\n\t"
  91127. #else
  91128. "lsl %[d1], %[d1], #16\n\t"
  91129. #endif
  91130. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91131. "adds r4, r4, %[d1]\n\t"
  91132. #else
  91133. "add r4, r4, %[d1]\n\t"
  91134. #endif
  91135. #ifdef WOLFSSL_KEIL
  91136. "adcs r5, r5, r6\n\t"
  91137. #elif defined(__clang__)
  91138. "adcs r5, r6\n\t"
  91139. #else
  91140. "adc r5, r6\n\t"
  91141. #endif
  91142. "# r * div - Done\n\t"
  91143. "mov %[d1], r8\n\t"
  91144. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91145. "subs %[d1], %[d1], r4\n\t"
  91146. #else
  91147. "sub %[d1], %[d1], r4\n\t"
  91148. #endif
  91149. "movs r4, %[d1]\n\t"
  91150. "mov %[d1], r9\n\t"
  91151. #ifdef WOLFSSL_KEIL
  91152. "sbcs %[d1], %[d1], r5\n\t"
  91153. #elif defined(__clang__)
  91154. "sbcs %[d1], r5\n\t"
  91155. #else
  91156. "sbc %[d1], r5\n\t"
  91157. #endif
  91158. "movs r5, %[d1]\n\t"
  91159. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91160. "adds r3, r3, r5\n\t"
  91161. #else
  91162. "add r3, r3, r5\n\t"
  91163. #endif
  91164. "# r * div - Start\n\t"
  91165. "uxth %[d1], r3\n\t"
  91166. "uxth r4, %[div]\n\t"
  91167. #ifdef WOLFSSL_KEIL
  91168. "muls r4, %[d1], r4\n\t"
  91169. #elif defined(__clang__)
  91170. "muls r4, %[d1]\n\t"
  91171. #else
  91172. "mul r4, %[d1]\n\t"
  91173. #endif
  91174. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91175. "lsrs r6, %[div], #16\n\t"
  91176. #else
  91177. "lsr r6, %[div], #16\n\t"
  91178. #endif
  91179. #ifdef WOLFSSL_KEIL
  91180. "muls %[d1], r6, %[d1]\n\t"
  91181. #elif defined(__clang__)
  91182. "muls %[d1], r6\n\t"
  91183. #else
  91184. "mul %[d1], r6\n\t"
  91185. #endif
  91186. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91187. "lsrs r5, %[d1], #16\n\t"
  91188. #else
  91189. "lsr r5, %[d1], #16\n\t"
  91190. #endif
  91191. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91192. "lsls %[d1], %[d1], #16\n\t"
  91193. #else
  91194. "lsl %[d1], %[d1], #16\n\t"
  91195. #endif
  91196. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91197. "adds r4, r4, %[d1]\n\t"
  91198. #else
  91199. "add r4, r4, %[d1]\n\t"
  91200. #endif
  91201. #ifdef WOLFSSL_KEIL
  91202. "adcs r5, r5, r7\n\t"
  91203. #elif defined(__clang__)
  91204. "adcs r5, r7\n\t"
  91205. #else
  91206. "adc r5, r7\n\t"
  91207. #endif
  91208. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91209. "lsrs %[d1], r3, #16\n\t"
  91210. #else
  91211. "lsr %[d1], r3, #16\n\t"
  91212. #endif
  91213. #ifdef WOLFSSL_KEIL
  91214. "muls r6, %[d1], r6\n\t"
  91215. #elif defined(__clang__)
  91216. "muls r6, %[d1]\n\t"
  91217. #else
  91218. "mul r6, %[d1]\n\t"
  91219. #endif
  91220. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91221. "adds r5, r5, r6\n\t"
  91222. #else
  91223. "add r5, r5, r6\n\t"
  91224. #endif
  91225. "uxth r6, %[div]\n\t"
  91226. #ifdef WOLFSSL_KEIL
  91227. "muls %[d1], r6, %[d1]\n\t"
  91228. #elif defined(__clang__)
  91229. "muls %[d1], r6\n\t"
  91230. #else
  91231. "mul %[d1], r6\n\t"
  91232. #endif
  91233. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91234. "lsrs r6, %[d1], #16\n\t"
  91235. #else
  91236. "lsr r6, %[d1], #16\n\t"
  91237. #endif
  91238. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91239. "lsls %[d1], %[d1], #16\n\t"
  91240. #else
  91241. "lsl %[d1], %[d1], #16\n\t"
  91242. #endif
  91243. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91244. "adds r4, r4, %[d1]\n\t"
  91245. #else
  91246. "add r4, r4, %[d1]\n\t"
  91247. #endif
  91248. #ifdef WOLFSSL_KEIL
  91249. "adcs r5, r5, r6\n\t"
  91250. #elif defined(__clang__)
  91251. "adcs r5, r6\n\t"
  91252. #else
  91253. "adc r5, r6\n\t"
  91254. #endif
  91255. "# r * div - Done\n\t"
  91256. "mov %[d1], r8\n\t"
  91257. "mov r6, r9\n\t"
  91258. #ifdef WOLFSSL_KEIL
  91259. "subs r4, %[d1], r4\n\t"
  91260. #else
  91261. #ifdef __clang__
  91262. "subs r4, %[d1], r4\n\t"
  91263. #else
  91264. "sub r4, %[d1], r4\n\t"
  91265. #endif
  91266. #endif
  91267. #ifdef WOLFSSL_KEIL
  91268. "sbcs r6, r6, r5\n\t"
  91269. #elif defined(__clang__)
  91270. "sbcs r6, r5\n\t"
  91271. #else
  91272. "sbc r6, r5\n\t"
  91273. #endif
  91274. "movs r5, r6\n\t"
  91275. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91276. "adds r3, r3, r5\n\t"
  91277. #else
  91278. "add r3, r3, r5\n\t"
  91279. #endif
  91280. "# r * div - Start\n\t"
  91281. "uxth %[d1], r3\n\t"
  91282. "uxth r4, %[div]\n\t"
  91283. #ifdef WOLFSSL_KEIL
  91284. "muls r4, %[d1], r4\n\t"
  91285. #elif defined(__clang__)
  91286. "muls r4, %[d1]\n\t"
  91287. #else
  91288. "mul r4, %[d1]\n\t"
  91289. #endif
  91290. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91291. "lsrs r6, %[div], #16\n\t"
  91292. #else
  91293. "lsr r6, %[div], #16\n\t"
  91294. #endif
  91295. #ifdef WOLFSSL_KEIL
  91296. "muls %[d1], r6, %[d1]\n\t"
  91297. #elif defined(__clang__)
  91298. "muls %[d1], r6\n\t"
  91299. #else
  91300. "mul %[d1], r6\n\t"
  91301. #endif
  91302. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91303. "lsrs r5, %[d1], #16\n\t"
  91304. #else
  91305. "lsr r5, %[d1], #16\n\t"
  91306. #endif
  91307. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91308. "lsls %[d1], %[d1], #16\n\t"
  91309. #else
  91310. "lsl %[d1], %[d1], #16\n\t"
  91311. #endif
  91312. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91313. "adds r4, r4, %[d1]\n\t"
  91314. #else
  91315. "add r4, r4, %[d1]\n\t"
  91316. #endif
  91317. #ifdef WOLFSSL_KEIL
  91318. "adcs r5, r5, r7\n\t"
  91319. #elif defined(__clang__)
  91320. "adcs r5, r7\n\t"
  91321. #else
  91322. "adc r5, r7\n\t"
  91323. #endif
  91324. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91325. "lsrs %[d1], r3, #16\n\t"
  91326. #else
  91327. "lsr %[d1], r3, #16\n\t"
  91328. #endif
  91329. #ifdef WOLFSSL_KEIL
  91330. "muls r6, %[d1], r6\n\t"
  91331. #elif defined(__clang__)
  91332. "muls r6, %[d1]\n\t"
  91333. #else
  91334. "mul r6, %[d1]\n\t"
  91335. #endif
  91336. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91337. "adds r5, r5, r6\n\t"
  91338. #else
  91339. "add r5, r5, r6\n\t"
  91340. #endif
  91341. "uxth r6, %[div]\n\t"
  91342. #ifdef WOLFSSL_KEIL
  91343. "muls %[d1], r6, %[d1]\n\t"
  91344. #elif defined(__clang__)
  91345. "muls %[d1], r6\n\t"
  91346. #else
  91347. "mul %[d1], r6\n\t"
  91348. #endif
  91349. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91350. "lsrs r6, %[d1], #16\n\t"
  91351. #else
  91352. "lsr r6, %[d1], #16\n\t"
  91353. #endif
  91354. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91355. "lsls %[d1], %[d1], #16\n\t"
  91356. #else
  91357. "lsl %[d1], %[d1], #16\n\t"
  91358. #endif
  91359. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91360. "adds r4, r4, %[d1]\n\t"
  91361. #else
  91362. "add r4, r4, %[d1]\n\t"
  91363. #endif
  91364. #ifdef WOLFSSL_KEIL
  91365. "adcs r5, r5, r6\n\t"
  91366. #elif defined(__clang__)
  91367. "adcs r5, r6\n\t"
  91368. #else
  91369. "adc r5, r6\n\t"
  91370. #endif
  91371. "# r * div - Done\n\t"
  91372. "mov %[d1], r8\n\t"
  91373. "mov r6, r9\n\t"
  91374. #ifdef WOLFSSL_KEIL
  91375. "subs r4, %[d1], r4\n\t"
  91376. #else
  91377. #ifdef __clang__
  91378. "subs r4, %[d1], r4\n\t"
  91379. #else
  91380. "sub r4, %[d1], r4\n\t"
  91381. #endif
  91382. #endif
  91383. #ifdef WOLFSSL_KEIL
  91384. "sbcs r6, r6, r5\n\t"
  91385. #elif defined(__clang__)
  91386. "sbcs r6, r5\n\t"
  91387. #else
  91388. "sbc r6, r5\n\t"
  91389. #endif
  91390. "movs r5, r6\n\t"
  91391. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91392. "adds r3, r3, r5\n\t"
  91393. #else
  91394. "add r3, r3, r5\n\t"
  91395. #endif
  91396. "# r * div - Start\n\t"
  91397. "uxth %[d1], r3\n\t"
  91398. "uxth r4, %[div]\n\t"
  91399. #ifdef WOLFSSL_KEIL
  91400. "muls r4, %[d1], r4\n\t"
  91401. #elif defined(__clang__)
  91402. "muls r4, %[d1]\n\t"
  91403. #else
  91404. "mul r4, %[d1]\n\t"
  91405. #endif
  91406. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91407. "lsrs r6, %[div], #16\n\t"
  91408. #else
  91409. "lsr r6, %[div], #16\n\t"
  91410. #endif
  91411. #ifdef WOLFSSL_KEIL
  91412. "muls %[d1], r6, %[d1]\n\t"
  91413. #elif defined(__clang__)
  91414. "muls %[d1], r6\n\t"
  91415. #else
  91416. "mul %[d1], r6\n\t"
  91417. #endif
  91418. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91419. "lsrs r5, %[d1], #16\n\t"
  91420. #else
  91421. "lsr r5, %[d1], #16\n\t"
  91422. #endif
  91423. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91424. "lsls %[d1], %[d1], #16\n\t"
  91425. #else
  91426. "lsl %[d1], %[d1], #16\n\t"
  91427. #endif
  91428. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91429. "adds r4, r4, %[d1]\n\t"
  91430. #else
  91431. "add r4, r4, %[d1]\n\t"
  91432. #endif
  91433. #ifdef WOLFSSL_KEIL
  91434. "adcs r5, r5, r7\n\t"
  91435. #elif defined(__clang__)
  91436. "adcs r5, r7\n\t"
  91437. #else
  91438. "adc r5, r7\n\t"
  91439. #endif
  91440. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91441. "lsrs %[d1], r3, #16\n\t"
  91442. #else
  91443. "lsr %[d1], r3, #16\n\t"
  91444. #endif
  91445. #ifdef WOLFSSL_KEIL
  91446. "muls r6, %[d1], r6\n\t"
  91447. #elif defined(__clang__)
  91448. "muls r6, %[d1]\n\t"
  91449. #else
  91450. "mul r6, %[d1]\n\t"
  91451. #endif
  91452. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91453. "adds r5, r5, r6\n\t"
  91454. #else
  91455. "add r5, r5, r6\n\t"
  91456. #endif
  91457. "uxth r6, %[div]\n\t"
  91458. #ifdef WOLFSSL_KEIL
  91459. "muls %[d1], r6, %[d1]\n\t"
  91460. #elif defined(__clang__)
  91461. "muls %[d1], r6\n\t"
  91462. #else
  91463. "mul %[d1], r6\n\t"
  91464. #endif
  91465. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91466. "lsrs r6, %[d1], #16\n\t"
  91467. #else
  91468. "lsr r6, %[d1], #16\n\t"
  91469. #endif
  91470. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91471. "lsls %[d1], %[d1], #16\n\t"
  91472. #else
  91473. "lsl %[d1], %[d1], #16\n\t"
  91474. #endif
  91475. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91476. "adds r4, r4, %[d1]\n\t"
  91477. #else
  91478. "add r4, r4, %[d1]\n\t"
  91479. #endif
  91480. #ifdef WOLFSSL_KEIL
  91481. "adcs r5, r5, r6\n\t"
  91482. #elif defined(__clang__)
  91483. "adcs r5, r6\n\t"
  91484. #else
  91485. "adc r5, r6\n\t"
  91486. #endif
  91487. "# r * div - Done\n\t"
  91488. "mov %[d1], r8\n\t"
  91489. "mov r6, r9\n\t"
  91490. #ifdef WOLFSSL_KEIL
  91491. "subs r4, %[d1], r4\n\t"
  91492. #else
  91493. #ifdef __clang__
  91494. "subs r4, %[d1], r4\n\t"
  91495. #else
  91496. "sub r4, %[d1], r4\n\t"
  91497. #endif
  91498. #endif
  91499. #ifdef WOLFSSL_KEIL
  91500. "sbcs r6, r6, r5\n\t"
  91501. #elif defined(__clang__)
  91502. "sbcs r6, r5\n\t"
  91503. #else
  91504. "sbc r6, r5\n\t"
  91505. #endif
  91506. "movs r5, r6\n\t"
  91507. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91508. "adds r3, r3, r5\n\t"
  91509. #else
  91510. "add r3, r3, r5\n\t"
  91511. #endif
  91512. "movs r6, %[div]\n\t"
  91513. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91514. "subs r6, r6, r4\n\t"
  91515. #else
  91516. "sub r6, r6, r4\n\t"
  91517. #endif
  91518. #ifdef WOLFSSL_KEIL
  91519. "sbcs r6, r6, r6\n\t"
  91520. #elif defined(__clang__)
  91521. "sbcs r6, r6\n\t"
  91522. #else
  91523. "sbc r6, r6\n\t"
  91524. #endif
  91525. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91526. "subs r3, r3, r6\n\t"
  91527. #else
  91528. "sub r3, r3, r6\n\t"
  91529. #endif
  91530. "movs %[d1], r3\n\t"
  91531. : [d1] "+l" (d1), [d0] "+l" (d0), [div] "+l" (div)
  91532. :
  91533. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  91534. );
  91535. return (uint32_t)(size_t)d1;
  91536. }
  91537. /* Divide d in a and put remainder into r (m*d + r = a)
  91538. * m is not calculated as it is not needed at this time.
  91539. *
  91540. * a Number to be divided.
  91541. * d Number to divide with.
  91542. * m Multiplier result.
  91543. * r Remainder from the division.
  91544. * returns MP_OKAY indicating success.
  91545. */
  91546. static WC_INLINE int sp_4096_div_128_cond(const sp_digit* a, const sp_digit* d, sp_digit* m,
  91547. sp_digit* r)
  91548. {
  91549. sp_digit t1[256], t2[129];
  91550. sp_digit div, r1;
  91551. int i;
  91552. (void)m;
  91553. div = d[127];
  91554. XMEMCPY(t1, a, sizeof(*t1) * 2 * 128);
  91555. for (i = 127; i > 0; i--) {
  91556. if (t1[i + 128] != d[i])
  91557. break;
  91558. }
  91559. if (t1[i + 128] >= d[i]) {
  91560. sp_4096_sub_in_place_128(&t1[128], d);
  91561. }
  91562. for (i = 127; i >= 0; i--) {
  91563. if (t1[128 + i] == div) {
  91564. r1 = SP_DIGIT_MAX;
  91565. }
  91566. else {
  91567. r1 = div_4096_word_128(t1[128 + i], t1[128 + i - 1], div);
  91568. }
  91569. sp_4096_mul_d_128(t2, d, r1);
  91570. t1[128 + i] += sp_4096_sub_in_place_128(&t1[i], t2);
  91571. t1[128 + i] -= t2[128];
  91572. if (t1[128 + i] != 0) {
  91573. t1[128 + i] += sp_4096_add_128(&t1[i], &t1[i], d);
  91574. if (t1[128 + i] != 0)
  91575. t1[128 + i] += sp_4096_add_128(&t1[i], &t1[i], d);
  91576. }
  91577. }
  91578. for (i = 127; i > 0; i--) {
  91579. if (t1[i] != d[i])
  91580. break;
  91581. }
  91582. if (t1[i] >= d[i]) {
  91583. sp_4096_sub_128(r, t1, d);
  91584. }
  91585. else {
  91586. XMEMCPY(r, t1, sizeof(*t1) * 128);
  91587. }
  91588. return MP_OKAY;
  91589. }
  91590. /* Reduce a modulo m into r. (r = a mod m)
  91591. *
  91592. * r A single precision number that is the reduced result.
  91593. * a A single precision number that is to be reduced.
  91594. * m A single precision number that is the modulus to reduce with.
  91595. * returns MP_OKAY indicating success.
  91596. */
  91597. static WC_INLINE int sp_4096_mod_128_cond(sp_digit* r, const sp_digit* a, const sp_digit* m)
  91598. {
  91599. int ret;
  91600. ret = sp_4096_div_128_cond(a, m, NULL, r);
  91601. return ret;
  91602. }
  91603. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  91604. /* AND m into each word of a and store in r.
  91605. *
  91606. * r A single precision integer.
  91607. * a A single precision integer.
  91608. * m Mask to AND against each digit.
  91609. */
  91610. static void sp_4096_mask_128(sp_digit* r, const sp_digit* a, sp_digit m)
  91611. {
  91612. #ifdef WOLFSSL_SP_SMALL
  91613. int i;
  91614. for (i=0; i<128; i++) {
  91615. r[i] = a[i] & m;
  91616. }
  91617. #else
  91618. int i;
  91619. for (i = 0; i < 128; i += 8) {
  91620. r[i+0] = a[i+0] & m;
  91621. r[i+1] = a[i+1] & m;
  91622. r[i+2] = a[i+2] & m;
  91623. r[i+3] = a[i+3] & m;
  91624. r[i+4] = a[i+4] & m;
  91625. r[i+5] = a[i+5] & m;
  91626. r[i+6] = a[i+6] & m;
  91627. r[i+7] = a[i+7] & m;
  91628. }
  91629. #endif
  91630. }
  91631. /* Compare a with b in constant time.
  91632. *
  91633. * a A single precision integer.
  91634. * b A single precision integer.
  91635. * return -ve, 0 or +ve if a is less than, equal to or greater than b
  91636. * respectively.
  91637. */
  91638. SP_NOINLINE static sp_int32 sp_4096_cmp_128(const sp_digit* a,
  91639. const sp_digit* b)
  91640. {
  91641. __asm__ __volatile__ (
  91642. "movs r2, #0\n\t"
  91643. "movs r3, #0\n\t"
  91644. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91645. "mvns r3, r3\n\t"
  91646. #else
  91647. "mvn r3, r3\n\t"
  91648. #endif
  91649. "movs r6, #0xff\n\t"
  91650. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91651. "adds r6, r6, #0xfd\n\t"
  91652. #else
  91653. "add r6, r6, #0xfd\n\t"
  91654. #endif
  91655. "\n"
  91656. "L_sp_4096_cmp_128_words_%=:\n\t"
  91657. "ldr r7, [%[a], r6]\n\t"
  91658. "ldr r5, [%[b], r6]\n\t"
  91659. #ifdef WOLFSSL_KEIL
  91660. "ands r7, r7, r3\n\t"
  91661. #elif defined(__clang__)
  91662. "ands r7, r3\n\t"
  91663. #else
  91664. "and r7, r3\n\t"
  91665. #endif
  91666. #ifdef WOLFSSL_KEIL
  91667. "ands r5, r5, r3\n\t"
  91668. #elif defined(__clang__)
  91669. "ands r5, r3\n\t"
  91670. #else
  91671. "and r5, r3\n\t"
  91672. #endif
  91673. "movs r4, r7\n\t"
  91674. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91675. "subs r7, r7, r5\n\t"
  91676. #else
  91677. "sub r7, r7, r5\n\t"
  91678. #endif
  91679. #ifdef WOLFSSL_KEIL
  91680. "sbcs r7, r7, r7\n\t"
  91681. #elif defined(__clang__)
  91682. "sbcs r7, r7\n\t"
  91683. #else
  91684. "sbc r7, r7\n\t"
  91685. #endif
  91686. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91687. "adds r2, r2, r7\n\t"
  91688. #else
  91689. "add r2, r2, r7\n\t"
  91690. #endif
  91691. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91692. "mvns r7, r7\n\t"
  91693. #else
  91694. "mvn r7, r7\n\t"
  91695. #endif
  91696. #ifdef WOLFSSL_KEIL
  91697. "ands r3, r3, r7\n\t"
  91698. #elif defined(__clang__)
  91699. "ands r3, r7\n\t"
  91700. #else
  91701. "and r3, r7\n\t"
  91702. #endif
  91703. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91704. "subs r5, r5, r4\n\t"
  91705. #else
  91706. "sub r5, r5, r4\n\t"
  91707. #endif
  91708. #ifdef WOLFSSL_KEIL
  91709. "sbcs r7, r7, r7\n\t"
  91710. #elif defined(__clang__)
  91711. "sbcs r7, r7\n\t"
  91712. #else
  91713. "sbc r7, r7\n\t"
  91714. #endif
  91715. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91716. "subs r2, r2, r7\n\t"
  91717. #else
  91718. "sub r2, r2, r7\n\t"
  91719. #endif
  91720. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91721. "mvns r7, r7\n\t"
  91722. #else
  91723. "mvn r7, r7\n\t"
  91724. #endif
  91725. #ifdef WOLFSSL_KEIL
  91726. "ands r3, r3, r7\n\t"
  91727. #elif defined(__clang__)
  91728. "ands r3, r7\n\t"
  91729. #else
  91730. "and r3, r7\n\t"
  91731. #endif
  91732. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91733. "subs r6, r6, #4\n\t"
  91734. #else
  91735. "sub r6, r6, #4\n\t"
  91736. #endif
  91737. "bge L_sp_4096_cmp_128_words_%=\n\t"
  91738. "movs %[a], r2\n\t"
  91739. : [a] "+l" (a), [b] "+l" (b)
  91740. :
  91741. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  91742. );
  91743. return (uint32_t)(size_t)a;
  91744. }
  91745. /* Divide d in a and put remainder into r (m*d + r = a)
  91746. * m is not calculated as it is not needed at this time.
  91747. *
  91748. * a Number to be divided.
  91749. * d Number to divide with.
  91750. * m Multiplier result.
  91751. * r Remainder from the division.
  91752. * returns MP_OKAY indicating success.
  91753. */
  91754. static WC_INLINE int sp_4096_div_128(const sp_digit* a, const sp_digit* d, sp_digit* m,
  91755. sp_digit* r)
  91756. {
  91757. sp_digit t1[256], t2[129];
  91758. sp_digit div, r1;
  91759. int i;
  91760. (void)m;
  91761. div = d[127];
  91762. XMEMCPY(t1, a, sizeof(*t1) * 2 * 128);
  91763. r1 = sp_4096_cmp_128(&t1[128], d) >= 0;
  91764. sp_4096_cond_sub_128(&t1[128], &t1[128], d, (sp_digit)0 - r1);
  91765. for (i = 127; i >= 0; i--) {
  91766. volatile sp_digit mask = (sp_digit)0 - (t1[128 + i] == div);
  91767. sp_digit hi = t1[128 + i] + mask;
  91768. r1 = div_4096_word_128(hi, t1[128 + i - 1], div);
  91769. r1 |= mask;
  91770. sp_4096_mul_d_128(t2, d, r1);
  91771. t1[128 + i] += sp_4096_sub_in_place_128(&t1[i], t2);
  91772. t1[128 + i] -= t2[128];
  91773. sp_4096_mask_128(t2, d, t1[128 + i]);
  91774. t1[128 + i] += sp_4096_add_128(&t1[i], &t1[i], t2);
  91775. sp_4096_mask_128(t2, d, t1[128 + i]);
  91776. t1[128 + i] += sp_4096_add_128(&t1[i], &t1[i], t2);
  91777. }
  91778. r1 = sp_4096_cmp_128(t1, d) >= 0;
  91779. sp_4096_cond_sub_128(r, t1, d, (sp_digit)0 - r1);
  91780. return MP_OKAY;
  91781. }
  91782. /* Reduce a modulo m into r. (r = a mod m)
  91783. *
  91784. * r A single precision number that is the reduced result.
  91785. * a A single precision number that is to be reduced.
  91786. * m A single precision number that is the modulus to reduce with.
  91787. * returns MP_OKAY indicating success.
  91788. */
  91789. static WC_INLINE int sp_4096_mod_128(sp_digit* r, const sp_digit* a, const sp_digit* m)
  91790. {
  91791. int ret;
  91792. ret = sp_4096_div_128(a, m, NULL, r);
  91793. return ret;
  91794. }
  91795. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || \
  91796. defined(WOLFSSL_HAVE_SP_DH)
  91797. #ifdef WOLFSSL_SP_SMALL
  91798. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  91799. *
  91800. * r A single precision number that is the result of the operation.
  91801. * a A single precision number being exponentiated.
  91802. * e A single precision number that is the exponent.
  91803. * bits The number of bits in the exponent.
  91804. * m A single precision number that is the modulus.
  91805. * returns 0 on success.
  91806. * returns MEMORY_E on dynamic memory allocation failure.
  91807. * returns MP_VAL when base is even or exponent is 0.
  91808. */
  91809. static int sp_4096_mod_exp_128(sp_digit* r, const sp_digit* a, const sp_digit* e,
  91810. int bits, const sp_digit* m, int reduceA)
  91811. {
  91812. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  91813. sp_digit* td = NULL;
  91814. #else
  91815. sp_digit td[8 * 256];
  91816. #endif
  91817. sp_digit* t[8];
  91818. sp_digit* norm = NULL;
  91819. sp_digit mp = 1;
  91820. sp_digit n;
  91821. sp_digit mask;
  91822. int i;
  91823. int c;
  91824. byte y;
  91825. int err = MP_OKAY;
  91826. if (bits == 0) {
  91827. err = MP_VAL;
  91828. }
  91829. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  91830. if (err == MP_OKAY) {
  91831. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (8 * 256), NULL,
  91832. DYNAMIC_TYPE_TMP_BUFFER);
  91833. if (td == NULL)
  91834. err = MEMORY_E;
  91835. }
  91836. #endif
  91837. if (err == MP_OKAY) {
  91838. norm = td;
  91839. for (i=0; i<8; i++) {
  91840. t[i] = td + i * 256;
  91841. }
  91842. sp_4096_mont_setup(m, &mp);
  91843. sp_4096_mont_norm_128(norm, m);
  91844. XMEMSET(t[1], 0, sizeof(sp_digit) * 128U);
  91845. if (reduceA != 0) {
  91846. err = sp_4096_mod_128(t[1] + 128, a, m);
  91847. if (err == MP_OKAY) {
  91848. err = sp_4096_mod_128(t[1], t[1], m);
  91849. }
  91850. }
  91851. else {
  91852. XMEMCPY(t[1] + 128, a, sizeof(sp_digit) * 128);
  91853. err = sp_4096_mod_128(t[1], t[1], m);
  91854. }
  91855. }
  91856. if (err == MP_OKAY) {
  91857. sp_4096_mont_sqr_128(t[ 2], t[ 1], m, mp);
  91858. sp_4096_mont_mul_128(t[ 3], t[ 2], t[ 1], m, mp);
  91859. sp_4096_mont_sqr_128(t[ 4], t[ 2], m, mp);
  91860. sp_4096_mont_mul_128(t[ 5], t[ 3], t[ 2], m, mp);
  91861. sp_4096_mont_sqr_128(t[ 6], t[ 3], m, mp);
  91862. sp_4096_mont_mul_128(t[ 7], t[ 4], t[ 3], m, mp);
  91863. i = (bits - 1) / 32;
  91864. n = e[i--];
  91865. c = bits & 31;
  91866. if (c == 0) {
  91867. c = 32;
  91868. }
  91869. c -= bits % 3;
  91870. if (c == 32) {
  91871. c = 29;
  91872. }
  91873. if (c < 0) {
  91874. /* Number of bits in top word is less than number needed. */
  91875. c = -c;
  91876. y = (byte)(n << c);
  91877. n = e[i--];
  91878. y |= (byte)(n >> (64 - c));
  91879. n <<= c;
  91880. c = 64 - c;
  91881. }
  91882. else if (c == 0) {
  91883. /* All bits in top word used. */
  91884. y = (byte)n;
  91885. }
  91886. else {
  91887. y = (byte)(n >> c);
  91888. n <<= 32 - c;
  91889. }
  91890. XMEMCPY(r, t[y], sizeof(sp_digit) * 128);
  91891. for (; i>=0 || c>=3; ) {
  91892. if (c == 0) {
  91893. n = e[i--];
  91894. y = (byte)(n >> 29);
  91895. n <<= 3;
  91896. c = 29;
  91897. }
  91898. else if (c < 3) {
  91899. y = (byte)(n >> 29);
  91900. n = e[i--];
  91901. c = 3 - c;
  91902. y |= (byte)(n >> (32 - c));
  91903. n <<= c;
  91904. c = 32 - c;
  91905. }
  91906. else {
  91907. y = (byte)((n >> 29) & 0x7);
  91908. n <<= 3;
  91909. c -= 3;
  91910. }
  91911. sp_4096_mont_sqr_128(r, r, m, mp);
  91912. sp_4096_mont_sqr_128(r, r, m, mp);
  91913. sp_4096_mont_sqr_128(r, r, m, mp);
  91914. sp_4096_mont_mul_128(r, r, t[y], m, mp);
  91915. }
  91916. XMEMSET(&r[128], 0, sizeof(sp_digit) * 128U);
  91917. sp_4096_mont_reduce_128(r, m, mp);
  91918. mask = 0 - (sp_4096_cmp_128(r, m) >= 0);
  91919. sp_4096_cond_sub_128(r, r, m, mask);
  91920. }
  91921. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  91922. if (td != NULL)
  91923. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  91924. #endif
  91925. return err;
  91926. }
  91927. #else
  91928. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  91929. *
  91930. * r A single precision number that is the result of the operation.
  91931. * a A single precision number being exponentiated.
  91932. * e A single precision number that is the exponent.
  91933. * bits The number of bits in the exponent.
  91934. * m A single precision number that is the modulus.
  91935. * returns 0 on success.
  91936. * returns MEMORY_E on dynamic memory allocation failure.
  91937. * returns MP_VAL when base is even or exponent is 0.
  91938. */
  91939. static int sp_4096_mod_exp_128(sp_digit* r, const sp_digit* a, const sp_digit* e,
  91940. int bits, const sp_digit* m, int reduceA)
  91941. {
  91942. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  91943. sp_digit* td = NULL;
  91944. #else
  91945. sp_digit td[16 * 256];
  91946. #endif
  91947. sp_digit* t[16];
  91948. sp_digit* norm = NULL;
  91949. sp_digit mp = 1;
  91950. sp_digit n;
  91951. sp_digit mask;
  91952. int i;
  91953. int c;
  91954. byte y;
  91955. int err = MP_OKAY;
  91956. if (bits == 0) {
  91957. err = MP_VAL;
  91958. }
  91959. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  91960. if (err == MP_OKAY) {
  91961. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (16 * 256), NULL,
  91962. DYNAMIC_TYPE_TMP_BUFFER);
  91963. if (td == NULL)
  91964. err = MEMORY_E;
  91965. }
  91966. #endif
  91967. if (err == MP_OKAY) {
  91968. norm = td;
  91969. for (i=0; i<16; i++) {
  91970. t[i] = td + i * 256;
  91971. }
  91972. sp_4096_mont_setup(m, &mp);
  91973. sp_4096_mont_norm_128(norm, m);
  91974. XMEMSET(t[1], 0, sizeof(sp_digit) * 128U);
  91975. if (reduceA != 0) {
  91976. err = sp_4096_mod_128(t[1] + 128, a, m);
  91977. if (err == MP_OKAY) {
  91978. err = sp_4096_mod_128(t[1], t[1], m);
  91979. }
  91980. }
  91981. else {
  91982. XMEMCPY(t[1] + 128, a, sizeof(sp_digit) * 128);
  91983. err = sp_4096_mod_128(t[1], t[1], m);
  91984. }
  91985. }
  91986. if (err == MP_OKAY) {
  91987. sp_4096_mont_sqr_128(t[ 2], t[ 1], m, mp);
  91988. sp_4096_mont_mul_128(t[ 3], t[ 2], t[ 1], m, mp);
  91989. sp_4096_mont_sqr_128(t[ 4], t[ 2], m, mp);
  91990. sp_4096_mont_mul_128(t[ 5], t[ 3], t[ 2], m, mp);
  91991. sp_4096_mont_sqr_128(t[ 6], t[ 3], m, mp);
  91992. sp_4096_mont_mul_128(t[ 7], t[ 4], t[ 3], m, mp);
  91993. sp_4096_mont_sqr_128(t[ 8], t[ 4], m, mp);
  91994. sp_4096_mont_mul_128(t[ 9], t[ 5], t[ 4], m, mp);
  91995. sp_4096_mont_sqr_128(t[10], t[ 5], m, mp);
  91996. sp_4096_mont_mul_128(t[11], t[ 6], t[ 5], m, mp);
  91997. sp_4096_mont_sqr_128(t[12], t[ 6], m, mp);
  91998. sp_4096_mont_mul_128(t[13], t[ 7], t[ 6], m, mp);
  91999. sp_4096_mont_sqr_128(t[14], t[ 7], m, mp);
  92000. sp_4096_mont_mul_128(t[15], t[ 8], t[ 7], m, mp);
  92001. i = (bits - 1) / 32;
  92002. n = e[i--];
  92003. c = bits & 31;
  92004. if (c == 0) {
  92005. c = 32;
  92006. }
  92007. c -= bits % 4;
  92008. if (c == 32) {
  92009. c = 28;
  92010. }
  92011. if (c < 0) {
  92012. /* Number of bits in top word is less than number needed. */
  92013. c = -c;
  92014. y = (byte)(n << c);
  92015. n = e[i--];
  92016. y |= (byte)(n >> (64 - c));
  92017. n <<= c;
  92018. c = 64 - c;
  92019. }
  92020. else if (c == 0) {
  92021. /* All bits in top word used. */
  92022. y = (byte)n;
  92023. }
  92024. else {
  92025. y = (byte)(n >> c);
  92026. n <<= 32 - c;
  92027. }
  92028. XMEMCPY(r, t[y], sizeof(sp_digit) * 128);
  92029. for (; i>=0 || c>=4; ) {
  92030. if (c == 0) {
  92031. n = e[i--];
  92032. y = (byte)(n >> 28);
  92033. n <<= 4;
  92034. c = 28;
  92035. }
  92036. else if (c < 4) {
  92037. y = (byte)(n >> 28);
  92038. n = e[i--];
  92039. c = 4 - c;
  92040. y |= (byte)(n >> (32 - c));
  92041. n <<= c;
  92042. c = 32 - c;
  92043. }
  92044. else {
  92045. y = (byte)((n >> 28) & 0xf);
  92046. n <<= 4;
  92047. c -= 4;
  92048. }
  92049. sp_4096_mont_sqr_128(r, r, m, mp);
  92050. sp_4096_mont_sqr_128(r, r, m, mp);
  92051. sp_4096_mont_sqr_128(r, r, m, mp);
  92052. sp_4096_mont_sqr_128(r, r, m, mp);
  92053. sp_4096_mont_mul_128(r, r, t[y], m, mp);
  92054. }
  92055. XMEMSET(&r[128], 0, sizeof(sp_digit) * 128U);
  92056. sp_4096_mont_reduce_128(r, m, mp);
  92057. mask = 0 - (sp_4096_cmp_128(r, m) >= 0);
  92058. sp_4096_cond_sub_128(r, r, m, mask);
  92059. }
  92060. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  92061. if (td != NULL)
  92062. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  92063. #endif
  92064. return err;
  92065. }
  92066. #endif /* WOLFSSL_SP_SMALL */
  92067. #endif /* (WOLFSSL_HAVE_SP_RSA && !WOLFSSL_RSA_PUBLIC_ONLY) || WOLFSSL_HAVE_SP_DH */
  92068. #endif /* (WOLFSSL_HAVE_SP_RSA && !WOLFSSL_RSA_PUBLIC_ONLY) || WOLFSSL_HAVE_SP_DH */
  92069. #ifdef WOLFSSL_HAVE_SP_RSA
  92070. /* RSA public key operation.
  92071. *
  92072. * in Array of bytes representing the number to exponentiate, base.
  92073. * inLen Number of bytes in base.
  92074. * em Public exponent.
  92075. * mm Modulus.
  92076. * out Buffer to hold big-endian bytes of exponentiation result.
  92077. * Must be at least 512 bytes long.
  92078. * outLen Number of bytes in result.
  92079. * returns 0 on success, MP_TO_E when the outLen is too small, MP_READ_E when
  92080. * an array is too long and MEMORY_E when dynamic memory allocation fails.
  92081. */
  92082. int sp_RsaPublic_4096(const byte* in, word32 inLen, const mp_int* em,
  92083. const mp_int* mm, byte* out, word32* outLen)
  92084. {
  92085. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  92086. sp_digit* a = NULL;
  92087. #else
  92088. sp_digit a[128 * 5];
  92089. #endif
  92090. sp_digit* m = NULL;
  92091. sp_digit* r = NULL;
  92092. sp_digit *ah = NULL;
  92093. sp_digit e[1] = {0};
  92094. int err = MP_OKAY;
  92095. if (*outLen < 512) {
  92096. err = MP_TO_E;
  92097. }
  92098. else if (mp_count_bits(em) > 32 || inLen > 512 ||
  92099. mp_count_bits(mm) != 4096) {
  92100. err = MP_READ_E;
  92101. }
  92102. else if (mp_iseven(mm)) {
  92103. err = MP_VAL;
  92104. }
  92105. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  92106. if (err == MP_OKAY) {
  92107. a = (sp_digit*)XMALLOC(sizeof(sp_digit) * 128 * 5, NULL,
  92108. DYNAMIC_TYPE_RSA);
  92109. if (a == NULL)
  92110. err = MEMORY_E;
  92111. }
  92112. #endif
  92113. if (err == MP_OKAY) {
  92114. ah = a + 128;
  92115. r = a + 128 * 2;
  92116. m = r + 128 * 2;
  92117. sp_4096_from_bin(ah, 128, in, inLen);
  92118. #if DIGIT_BIT >= 32
  92119. e[0] = em->dp[0];
  92120. #else
  92121. e[0] = em->dp[0];
  92122. if (em->used > 1) {
  92123. e[0] |= ((sp_digit)em->dp[1]) << DIGIT_BIT;
  92124. }
  92125. #endif
  92126. if (e[0] == 0) {
  92127. err = MP_EXPTMOD_E;
  92128. }
  92129. }
  92130. if (err == MP_OKAY) {
  92131. sp_4096_from_mp(m, 128, mm);
  92132. if (e[0] == 0x10001) {
  92133. int i;
  92134. sp_digit mp;
  92135. sp_4096_mont_setup(m, &mp);
  92136. /* Convert to Montgomery form. */
  92137. XMEMSET(a, 0, sizeof(sp_digit) * 128);
  92138. err = sp_4096_mod_128_cond(r, a, m);
  92139. /* Montgomery form: r = a.R mod m */
  92140. if (err == MP_OKAY) {
  92141. /* r = a ^ 0x10000 => r = a squared 16 times */
  92142. for (i = 15; i >= 0; i--) {
  92143. sp_4096_mont_sqr_128(r, r, m, mp);
  92144. }
  92145. /* mont_red(r.R.R) = (r.R.R / R) mod m = r.R mod m
  92146. * mont_red(r.R * a) = (r.R.a / R) mod m = r.a mod m
  92147. */
  92148. sp_4096_mont_mul_128(r, r, ah, m, mp);
  92149. for (i = 127; i > 0; i--) {
  92150. if (r[i] != m[i]) {
  92151. break;
  92152. }
  92153. }
  92154. if (r[i] >= m[i]) {
  92155. sp_4096_sub_in_place_128(r, m);
  92156. }
  92157. }
  92158. }
  92159. else if (e[0] == 0x3) {
  92160. if (err == MP_OKAY) {
  92161. sp_4096_sqr_128(r, ah);
  92162. err = sp_4096_mod_128_cond(r, r, m);
  92163. }
  92164. if (err == MP_OKAY) {
  92165. sp_4096_mul_128(r, ah, r);
  92166. err = sp_4096_mod_128_cond(r, r, m);
  92167. }
  92168. }
  92169. else {
  92170. int i;
  92171. sp_digit mp;
  92172. sp_4096_mont_setup(m, &mp);
  92173. /* Convert to Montgomery form. */
  92174. XMEMSET(a, 0, sizeof(sp_digit) * 128);
  92175. err = sp_4096_mod_128_cond(a, a, m);
  92176. if (err == MP_OKAY) {
  92177. for (i = 31; i >= 0; i--) {
  92178. if (e[0] >> i) {
  92179. break;
  92180. }
  92181. }
  92182. XMEMCPY(r, a, sizeof(sp_digit) * 128);
  92183. for (i--; i >= 0; i--) {
  92184. sp_4096_mont_sqr_128(r, r, m, mp);
  92185. if (((e[0] >> i) & 1) == 1) {
  92186. sp_4096_mont_mul_128(r, r, a, m, mp);
  92187. }
  92188. }
  92189. XMEMSET(&r[128], 0, sizeof(sp_digit) * 128);
  92190. sp_4096_mont_reduce_128(r, m, mp);
  92191. for (i = 127; i > 0; i--) {
  92192. if (r[i] != m[i]) {
  92193. break;
  92194. }
  92195. }
  92196. if (r[i] >= m[i]) {
  92197. sp_4096_sub_in_place_128(r, m);
  92198. }
  92199. }
  92200. }
  92201. }
  92202. if (err == MP_OKAY) {
  92203. sp_4096_to_bin_128(r, out);
  92204. *outLen = 512;
  92205. }
  92206. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  92207. if (a != NULL)
  92208. XFREE(a, NULL, DYNAMIC_TYPE_RSA);
  92209. #endif
  92210. return err;
  92211. }
  92212. #ifndef WOLFSSL_RSA_PUBLIC_ONLY
  92213. /* Conditionally add a and b using the mask m.
  92214. * m is -1 to add and 0 when not.
  92215. *
  92216. * r A single precision number representing conditional add result.
  92217. * a A single precision number to add with.
  92218. * b A single precision number to add.
  92219. * m Mask value to apply.
  92220. */
  92221. SP_NOINLINE static sp_digit sp_4096_cond_add_64(sp_digit* r, const sp_digit* a,
  92222. const sp_digit* b, sp_digit m)
  92223. {
  92224. __asm__ __volatile__ (
  92225. "movs r4, #0\n\t"
  92226. "movs r5, #0xff\n\t"
  92227. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92228. "adds r5, r5, #1\n\t"
  92229. #else
  92230. "add r5, r5, #1\n\t"
  92231. #endif
  92232. "mov r8, r5\n\t"
  92233. "movs r7, #0\n\t"
  92234. "\n"
  92235. "L_sp_4096_cond_add_64_words_%=:\n\t"
  92236. "ldr r6, [%[b], r7]\n\t"
  92237. #ifdef WOLFSSL_KEIL
  92238. "ands r6, r6, %[m]\n\t"
  92239. #elif defined(__clang__)
  92240. "ands r6, %[m]\n\t"
  92241. #else
  92242. "and r6, %[m]\n\t"
  92243. #endif
  92244. "movs r5, #0\n\t"
  92245. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92246. "subs r5, r5, #1\n\t"
  92247. #else
  92248. "sub r5, r5, #1\n\t"
  92249. #endif
  92250. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92251. "adds r5, r5, r4\n\t"
  92252. #else
  92253. "add r5, r5, r4\n\t"
  92254. #endif
  92255. "ldr r5, [%[a], r7]\n\t"
  92256. #ifdef WOLFSSL_KEIL
  92257. "adcs r5, r5, r6\n\t"
  92258. #elif defined(__clang__)
  92259. "adcs r5, r6\n\t"
  92260. #else
  92261. "adc r5, r6\n\t"
  92262. #endif
  92263. "movs r4, #0\n\t"
  92264. #ifdef WOLFSSL_KEIL
  92265. "adcs r4, r4, r4\n\t"
  92266. #elif defined(__clang__)
  92267. "adcs r4, r4\n\t"
  92268. #else
  92269. "adc r4, r4\n\t"
  92270. #endif
  92271. "str r5, [%[r], r7]\n\t"
  92272. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92273. "adds r7, r7, #4\n\t"
  92274. #else
  92275. "add r7, r7, #4\n\t"
  92276. #endif
  92277. "cmp r7, r8\n\t"
  92278. "blt L_sp_4096_cond_add_64_words_%=\n\t"
  92279. "movs %[r], r4\n\t"
  92280. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m)
  92281. :
  92282. : "memory", "r4", "r5", "r6", "r7", "r8"
  92283. );
  92284. return (uint32_t)(size_t)r;
  92285. }
  92286. /* RSA private key operation.
  92287. *
  92288. * in Array of bytes representing the number to exponentiate, base.
  92289. * inLen Number of bytes in base.
  92290. * dm Private exponent.
  92291. * pm First prime.
  92292. * qm Second prime.
  92293. * dpm First prime's CRT exponent.
  92294. * dqm Second prime's CRT exponent.
  92295. * qim Inverse of second prime mod p.
  92296. * mm Modulus.
  92297. * out Buffer to hold big-endian bytes of exponentiation result.
  92298. * Must be at least 512 bytes long.
  92299. * outLen Number of bytes in result.
  92300. * returns 0 on success, MP_TO_E when the outLen is too small, MP_READ_E when
  92301. * an array is too long and MEMORY_E when dynamic memory allocation fails.
  92302. */
  92303. int sp_RsaPrivate_4096(const byte* in, word32 inLen, const mp_int* dm,
  92304. const mp_int* pm, const mp_int* qm, const mp_int* dpm, const mp_int* dqm,
  92305. const mp_int* qim, const mp_int* mm, byte* out, word32* outLen)
  92306. {
  92307. #if defined(SP_RSA_PRIVATE_EXP_D) || defined(RSA_LOW_MEM)
  92308. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  92309. sp_digit* d = NULL;
  92310. #else
  92311. sp_digit d[128 * 4];
  92312. #endif
  92313. sp_digit* a = NULL;
  92314. sp_digit* m = NULL;
  92315. sp_digit* r = NULL;
  92316. int err = MP_OKAY;
  92317. (void)pm;
  92318. (void)qm;
  92319. (void)dpm;
  92320. (void)dqm;
  92321. (void)qim;
  92322. if (*outLen < 512U) {
  92323. err = MP_TO_E;
  92324. }
  92325. if (err == MP_OKAY) {
  92326. if (mp_count_bits(dm) > 4096) {
  92327. err = MP_READ_E;
  92328. }
  92329. else if (inLen > 512) {
  92330. err = MP_READ_E;
  92331. }
  92332. else if (mp_count_bits(mm) != 4096) {
  92333. err = MP_READ_E;
  92334. }
  92335. else if (mp_iseven(mm)) {
  92336. err = MP_VAL;
  92337. }
  92338. }
  92339. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  92340. if (err == MP_OKAY) {
  92341. d = (sp_digit*)XMALLOC(sizeof(sp_digit) * 128 * 4, NULL,
  92342. DYNAMIC_TYPE_RSA);
  92343. if (d == NULL)
  92344. err = MEMORY_E;
  92345. }
  92346. #endif
  92347. if (err == MP_OKAY) {
  92348. a = d + 128;
  92349. m = a + 256;
  92350. r = a;
  92351. sp_4096_from_bin(a, 128, in, inLen);
  92352. sp_4096_from_mp(d, 128, dm);
  92353. sp_4096_from_mp(m, 128, mm);
  92354. err = sp_4096_mod_exp_128(r, a, d, 4096, m, 0);
  92355. }
  92356. if (err == MP_OKAY) {
  92357. sp_4096_to_bin_128(r, out);
  92358. *outLen = 512;
  92359. }
  92360. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  92361. if (d != NULL)
  92362. #endif
  92363. {
  92364. /* only "a" and "r" are sensitive and need zeroized (same pointer) */
  92365. if (a != NULL)
  92366. ForceZero(a, sizeof(sp_digit) * 128);
  92367. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  92368. XFREE(d, NULL, DYNAMIC_TYPE_RSA);
  92369. #endif
  92370. }
  92371. return err;
  92372. #else
  92373. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  92374. sp_digit* a = NULL;
  92375. #else
  92376. sp_digit a[64 * 11];
  92377. #endif
  92378. sp_digit* p = NULL;
  92379. sp_digit* q = NULL;
  92380. sp_digit* dp = NULL;
  92381. sp_digit* tmpa = NULL;
  92382. sp_digit* tmpb = NULL;
  92383. sp_digit* r = NULL;
  92384. sp_digit* qi = NULL;
  92385. sp_digit* dq = NULL;
  92386. sp_digit c;
  92387. int err = MP_OKAY;
  92388. (void)dm;
  92389. (void)mm;
  92390. if (*outLen < 512) {
  92391. err = MP_TO_E;
  92392. }
  92393. else if (inLen > 512 || mp_count_bits(mm) != 4096) {
  92394. err = MP_READ_E;
  92395. }
  92396. else if (mp_iseven(mm)) {
  92397. err = MP_VAL;
  92398. }
  92399. else if (mp_iseven(pm)) {
  92400. err = MP_VAL;
  92401. }
  92402. else if (mp_iseven(qm)) {
  92403. err = MP_VAL;
  92404. }
  92405. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  92406. if (err == MP_OKAY) {
  92407. a = (sp_digit*)XMALLOC(sizeof(sp_digit) * 64 * 11, NULL,
  92408. DYNAMIC_TYPE_RSA);
  92409. if (a == NULL)
  92410. err = MEMORY_E;
  92411. }
  92412. #endif
  92413. if (err == MP_OKAY) {
  92414. p = a + 128 * 2;
  92415. q = p + 64;
  92416. qi = dq = dp = q + 64;
  92417. tmpa = qi + 64;
  92418. tmpb = tmpa + 128;
  92419. r = a;
  92420. sp_4096_from_bin(a, 128, in, inLen);
  92421. sp_4096_from_mp(p, 64, pm);
  92422. sp_4096_from_mp(q, 64, qm);
  92423. sp_4096_from_mp(dp, 64, dpm);
  92424. err = sp_2048_mod_exp_64(tmpa, a, dp, 2048, p, 1);
  92425. }
  92426. if (err == MP_OKAY) {
  92427. sp_4096_from_mp(dq, 64, dqm);
  92428. err = sp_2048_mod_exp_64(tmpb, a, dq, 2048, q, 1);
  92429. }
  92430. if (err == MP_OKAY) {
  92431. c = sp_2048_sub_in_place_64(tmpa, tmpb);
  92432. c += sp_4096_cond_add_64(tmpa, tmpa, p, c);
  92433. sp_4096_cond_add_64(tmpa, tmpa, p, c);
  92434. sp_2048_from_mp(qi, 64, qim);
  92435. sp_2048_mul_64(tmpa, tmpa, qi);
  92436. err = sp_2048_mod_64(tmpa, tmpa, p);
  92437. }
  92438. if (err == MP_OKAY) {
  92439. sp_2048_mul_64(tmpa, q, tmpa);
  92440. XMEMSET(&tmpb[64], 0, sizeof(sp_digit) * 64);
  92441. sp_4096_add_128(r, tmpb, tmpa);
  92442. sp_4096_to_bin_128(r, out);
  92443. *outLen = 512;
  92444. }
  92445. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  92446. if (a != NULL)
  92447. #endif
  92448. {
  92449. ForceZero(a, sizeof(sp_digit) * 64 * 11);
  92450. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  92451. XFREE(a, NULL, DYNAMIC_TYPE_RSA);
  92452. #endif
  92453. }
  92454. #endif /* SP_RSA_PRIVATE_EXP_D || RSA_LOW_MEM */
  92455. return err;
  92456. }
  92457. #endif /* WOLFSSL_RSA_PUBLIC_ONLY */
  92458. #endif /* WOLFSSL_HAVE_SP_RSA */
  92459. #if defined(WOLFSSL_HAVE_SP_DH) || (defined(WOLFSSL_HAVE_SP_RSA) && \
  92460. !defined(WOLFSSL_RSA_PUBLIC_ONLY))
  92461. /* Convert an array of sp_digit to an mp_int.
  92462. *
  92463. * a A single precision integer.
  92464. * r A multi-precision integer.
  92465. */
  92466. static int sp_4096_to_mp(const sp_digit* a, mp_int* r)
  92467. {
  92468. int err;
  92469. err = mp_grow(r, (4096 + DIGIT_BIT - 1) / DIGIT_BIT);
  92470. if (err == MP_OKAY) { /*lint !e774 case where err is always MP_OKAY*/
  92471. #if DIGIT_BIT == 32
  92472. XMEMCPY(r->dp, a, sizeof(sp_digit) * 128);
  92473. r->used = 128;
  92474. mp_clamp(r);
  92475. #elif DIGIT_BIT < 32
  92476. int i;
  92477. int j = 0;
  92478. int s = 0;
  92479. r->dp[0] = 0;
  92480. for (i = 0; i < 128; i++) {
  92481. r->dp[j] |= (mp_digit)(a[i] << s);
  92482. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  92483. s = DIGIT_BIT - s;
  92484. r->dp[++j] = (mp_digit)(a[i] >> s);
  92485. while (s + DIGIT_BIT <= 32) {
  92486. s += DIGIT_BIT;
  92487. r->dp[j++] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  92488. if (s == SP_WORD_SIZE) {
  92489. r->dp[j] = 0;
  92490. }
  92491. else {
  92492. r->dp[j] = (mp_digit)(a[i] >> s);
  92493. }
  92494. }
  92495. s = 32 - s;
  92496. }
  92497. r->used = (4096 + DIGIT_BIT - 1) / DIGIT_BIT;
  92498. mp_clamp(r);
  92499. #else
  92500. int i;
  92501. int j = 0;
  92502. int s = 0;
  92503. r->dp[0] = 0;
  92504. for (i = 0; i < 128; i++) {
  92505. r->dp[j] |= ((mp_digit)a[i]) << s;
  92506. if (s + 32 >= DIGIT_BIT) {
  92507. #if DIGIT_BIT != 32 && DIGIT_BIT != 64
  92508. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  92509. #endif
  92510. s = DIGIT_BIT - s;
  92511. r->dp[++j] = a[i] >> s;
  92512. s = 32 - s;
  92513. }
  92514. else {
  92515. s += 32;
  92516. }
  92517. }
  92518. r->used = (4096 + DIGIT_BIT - 1) / DIGIT_BIT;
  92519. mp_clamp(r);
  92520. #endif
  92521. }
  92522. return err;
  92523. }
  92524. /* Perform the modular exponentiation for Diffie-Hellman.
  92525. *
  92526. * base Base. MP integer.
  92527. * exp Exponent. MP integer.
  92528. * mod Modulus. MP integer.
  92529. * res Result. MP integer.
  92530. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  92531. * and MEMORY_E if memory allocation fails.
  92532. */
  92533. int sp_ModExp_4096(const mp_int* base, const mp_int* exp, const mp_int* mod,
  92534. mp_int* res)
  92535. {
  92536. int err = MP_OKAY;
  92537. sp_digit b[256];
  92538. sp_digit e[128];
  92539. sp_digit m[128];
  92540. sp_digit* r = b;
  92541. int expBits = mp_count_bits(exp);
  92542. if (mp_count_bits(base) > 4096) {
  92543. err = MP_READ_E;
  92544. }
  92545. else if (expBits > 4096) {
  92546. err = MP_READ_E;
  92547. }
  92548. else if (mp_count_bits(mod) != 4096) {
  92549. err = MP_READ_E;
  92550. }
  92551. else if (mp_iseven(mod)) {
  92552. err = MP_VAL;
  92553. }
  92554. if (err == MP_OKAY) {
  92555. sp_4096_from_mp(b, 128, base);
  92556. sp_4096_from_mp(e, 128, exp);
  92557. sp_4096_from_mp(m, 128, mod);
  92558. err = sp_4096_mod_exp_128(r, b, e, expBits, m, 0);
  92559. }
  92560. if (err == MP_OKAY) {
  92561. err = sp_4096_to_mp(r, res);
  92562. }
  92563. XMEMSET(e, 0, sizeof(e));
  92564. return err;
  92565. }
  92566. #ifdef WOLFSSL_HAVE_SP_DH
  92567. #ifdef HAVE_FFDHE_4096
  92568. /* Lefy shift a by n bits into r. (r = a << n)
  92569. *
  92570. * r A single precision integer.
  92571. * a A single precision integer.
  92572. * n Integer representing number of bits to shift.
  92573. */
  92574. static void sp_4096_lshift_128(sp_digit* r, const sp_digit* a, byte n)
  92575. {
  92576. __asm__ __volatile__ (
  92577. "movs r7, #31\n\t"
  92578. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92579. "subs r7, r7, %[n]\n\t"
  92580. #else
  92581. "sub r7, r7, %[n]\n\t"
  92582. #endif
  92583. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92584. "adds %[a], %[a], #0xff\n\t"
  92585. #else
  92586. "add %[a], %[a], #0xff\n\t"
  92587. #endif
  92588. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92589. "adds %[r], %[r], #0xff\n\t"
  92590. #else
  92591. "add %[r], %[r], #0xff\n\t"
  92592. #endif
  92593. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92594. "adds %[a], %[a], #0xc1\n\t"
  92595. #else
  92596. "add %[a], %[a], #0xc1\n\t"
  92597. #endif
  92598. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92599. "adds %[r], %[r], #0xc1\n\t"
  92600. #else
  92601. "add %[r], %[r], #0xc1\n\t"
  92602. #endif
  92603. "ldr r4, [%[a], #60]\n\t"
  92604. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92605. "lsrs r5, r4, #1\n\t"
  92606. #else
  92607. "lsr r5, r4, #1\n\t"
  92608. #endif
  92609. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92610. "lsls r4, r4, %[n]\n\t"
  92611. #else
  92612. "lsl r4, r4, %[n]\n\t"
  92613. #endif
  92614. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92615. "lsrs r5, r5, r7\n\t"
  92616. #else
  92617. "lsr r5, r5, r7\n\t"
  92618. #endif
  92619. "ldr r3, [%[a], #56]\n\t"
  92620. "str r5, [%[r], #64]\n\t"
  92621. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92622. "lsrs r6, r3, #1\n\t"
  92623. #else
  92624. "lsr r6, r3, #1\n\t"
  92625. #endif
  92626. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92627. "lsls r3, r3, %[n]\n\t"
  92628. #else
  92629. "lsl r3, r3, %[n]\n\t"
  92630. #endif
  92631. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92632. "lsrs r6, r6, r7\n\t"
  92633. #else
  92634. "lsr r6, r6, r7\n\t"
  92635. #endif
  92636. #ifdef WOLFSSL_KEIL
  92637. "orrs r4, r4, r6\n\t"
  92638. #elif defined(__clang__)
  92639. "orrs r4, r6\n\t"
  92640. #else
  92641. "orr r4, r6\n\t"
  92642. #endif
  92643. "ldr r5, [%[a], #52]\n\t"
  92644. "str r4, [%[r], #60]\n\t"
  92645. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92646. "lsrs r6, r5, #1\n\t"
  92647. #else
  92648. "lsr r6, r5, #1\n\t"
  92649. #endif
  92650. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92651. "lsls r5, r5, %[n]\n\t"
  92652. #else
  92653. "lsl r5, r5, %[n]\n\t"
  92654. #endif
  92655. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92656. "lsrs r6, r6, r7\n\t"
  92657. #else
  92658. "lsr r6, r6, r7\n\t"
  92659. #endif
  92660. #ifdef WOLFSSL_KEIL
  92661. "orrs r3, r3, r6\n\t"
  92662. #elif defined(__clang__)
  92663. "orrs r3, r6\n\t"
  92664. #else
  92665. "orr r3, r6\n\t"
  92666. #endif
  92667. "ldr r4, [%[a], #48]\n\t"
  92668. "str r3, [%[r], #56]\n\t"
  92669. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92670. "lsrs r6, r4, #1\n\t"
  92671. #else
  92672. "lsr r6, r4, #1\n\t"
  92673. #endif
  92674. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92675. "lsls r4, r4, %[n]\n\t"
  92676. #else
  92677. "lsl r4, r4, %[n]\n\t"
  92678. #endif
  92679. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92680. "lsrs r6, r6, r7\n\t"
  92681. #else
  92682. "lsr r6, r6, r7\n\t"
  92683. #endif
  92684. #ifdef WOLFSSL_KEIL
  92685. "orrs r5, r5, r6\n\t"
  92686. #elif defined(__clang__)
  92687. "orrs r5, r6\n\t"
  92688. #else
  92689. "orr r5, r6\n\t"
  92690. #endif
  92691. "ldr r3, [%[a], #44]\n\t"
  92692. "str r5, [%[r], #52]\n\t"
  92693. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92694. "lsrs r6, r3, #1\n\t"
  92695. #else
  92696. "lsr r6, r3, #1\n\t"
  92697. #endif
  92698. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92699. "lsls r3, r3, %[n]\n\t"
  92700. #else
  92701. "lsl r3, r3, %[n]\n\t"
  92702. #endif
  92703. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92704. "lsrs r6, r6, r7\n\t"
  92705. #else
  92706. "lsr r6, r6, r7\n\t"
  92707. #endif
  92708. #ifdef WOLFSSL_KEIL
  92709. "orrs r4, r4, r6\n\t"
  92710. #elif defined(__clang__)
  92711. "orrs r4, r6\n\t"
  92712. #else
  92713. "orr r4, r6\n\t"
  92714. #endif
  92715. "ldr r5, [%[a], #40]\n\t"
  92716. "str r4, [%[r], #48]\n\t"
  92717. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92718. "lsrs r6, r5, #1\n\t"
  92719. #else
  92720. "lsr r6, r5, #1\n\t"
  92721. #endif
  92722. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92723. "lsls r5, r5, %[n]\n\t"
  92724. #else
  92725. "lsl r5, r5, %[n]\n\t"
  92726. #endif
  92727. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92728. "lsrs r6, r6, r7\n\t"
  92729. #else
  92730. "lsr r6, r6, r7\n\t"
  92731. #endif
  92732. #ifdef WOLFSSL_KEIL
  92733. "orrs r3, r3, r6\n\t"
  92734. #elif defined(__clang__)
  92735. "orrs r3, r6\n\t"
  92736. #else
  92737. "orr r3, r6\n\t"
  92738. #endif
  92739. "ldr r4, [%[a], #36]\n\t"
  92740. "str r3, [%[r], #44]\n\t"
  92741. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92742. "lsrs r6, r4, #1\n\t"
  92743. #else
  92744. "lsr r6, r4, #1\n\t"
  92745. #endif
  92746. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92747. "lsls r4, r4, %[n]\n\t"
  92748. #else
  92749. "lsl r4, r4, %[n]\n\t"
  92750. #endif
  92751. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92752. "lsrs r6, r6, r7\n\t"
  92753. #else
  92754. "lsr r6, r6, r7\n\t"
  92755. #endif
  92756. #ifdef WOLFSSL_KEIL
  92757. "orrs r5, r5, r6\n\t"
  92758. #elif defined(__clang__)
  92759. "orrs r5, r6\n\t"
  92760. #else
  92761. "orr r5, r6\n\t"
  92762. #endif
  92763. "ldr r3, [%[a], #32]\n\t"
  92764. "str r5, [%[r], #40]\n\t"
  92765. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92766. "lsrs r6, r3, #1\n\t"
  92767. #else
  92768. "lsr r6, r3, #1\n\t"
  92769. #endif
  92770. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92771. "lsls r3, r3, %[n]\n\t"
  92772. #else
  92773. "lsl r3, r3, %[n]\n\t"
  92774. #endif
  92775. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92776. "lsrs r6, r6, r7\n\t"
  92777. #else
  92778. "lsr r6, r6, r7\n\t"
  92779. #endif
  92780. #ifdef WOLFSSL_KEIL
  92781. "orrs r4, r4, r6\n\t"
  92782. #elif defined(__clang__)
  92783. "orrs r4, r6\n\t"
  92784. #else
  92785. "orr r4, r6\n\t"
  92786. #endif
  92787. "ldr r5, [%[a], #28]\n\t"
  92788. "str r4, [%[r], #36]\n\t"
  92789. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92790. "lsrs r6, r5, #1\n\t"
  92791. #else
  92792. "lsr r6, r5, #1\n\t"
  92793. #endif
  92794. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92795. "lsls r5, r5, %[n]\n\t"
  92796. #else
  92797. "lsl r5, r5, %[n]\n\t"
  92798. #endif
  92799. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92800. "lsrs r6, r6, r7\n\t"
  92801. #else
  92802. "lsr r6, r6, r7\n\t"
  92803. #endif
  92804. #ifdef WOLFSSL_KEIL
  92805. "orrs r3, r3, r6\n\t"
  92806. #elif defined(__clang__)
  92807. "orrs r3, r6\n\t"
  92808. #else
  92809. "orr r3, r6\n\t"
  92810. #endif
  92811. "ldr r4, [%[a], #24]\n\t"
  92812. "str r3, [%[r], #32]\n\t"
  92813. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92814. "lsrs r6, r4, #1\n\t"
  92815. #else
  92816. "lsr r6, r4, #1\n\t"
  92817. #endif
  92818. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92819. "lsls r4, r4, %[n]\n\t"
  92820. #else
  92821. "lsl r4, r4, %[n]\n\t"
  92822. #endif
  92823. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92824. "lsrs r6, r6, r7\n\t"
  92825. #else
  92826. "lsr r6, r6, r7\n\t"
  92827. #endif
  92828. #ifdef WOLFSSL_KEIL
  92829. "orrs r5, r5, r6\n\t"
  92830. #elif defined(__clang__)
  92831. "orrs r5, r6\n\t"
  92832. #else
  92833. "orr r5, r6\n\t"
  92834. #endif
  92835. "ldr r3, [%[a], #20]\n\t"
  92836. "str r5, [%[r], #28]\n\t"
  92837. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92838. "lsrs r6, r3, #1\n\t"
  92839. #else
  92840. "lsr r6, r3, #1\n\t"
  92841. #endif
  92842. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92843. "lsls r3, r3, %[n]\n\t"
  92844. #else
  92845. "lsl r3, r3, %[n]\n\t"
  92846. #endif
  92847. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92848. "lsrs r6, r6, r7\n\t"
  92849. #else
  92850. "lsr r6, r6, r7\n\t"
  92851. #endif
  92852. #ifdef WOLFSSL_KEIL
  92853. "orrs r4, r4, r6\n\t"
  92854. #elif defined(__clang__)
  92855. "orrs r4, r6\n\t"
  92856. #else
  92857. "orr r4, r6\n\t"
  92858. #endif
  92859. "ldr r5, [%[a], #16]\n\t"
  92860. "str r4, [%[r], #24]\n\t"
  92861. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92862. "lsrs r6, r5, #1\n\t"
  92863. #else
  92864. "lsr r6, r5, #1\n\t"
  92865. #endif
  92866. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92867. "lsls r5, r5, %[n]\n\t"
  92868. #else
  92869. "lsl r5, r5, %[n]\n\t"
  92870. #endif
  92871. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92872. "lsrs r6, r6, r7\n\t"
  92873. #else
  92874. "lsr r6, r6, r7\n\t"
  92875. #endif
  92876. #ifdef WOLFSSL_KEIL
  92877. "orrs r3, r3, r6\n\t"
  92878. #elif defined(__clang__)
  92879. "orrs r3, r6\n\t"
  92880. #else
  92881. "orr r3, r6\n\t"
  92882. #endif
  92883. "ldr r4, [%[a], #12]\n\t"
  92884. "str r3, [%[r], #20]\n\t"
  92885. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92886. "lsrs r6, r4, #1\n\t"
  92887. #else
  92888. "lsr r6, r4, #1\n\t"
  92889. #endif
  92890. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92891. "lsls r4, r4, %[n]\n\t"
  92892. #else
  92893. "lsl r4, r4, %[n]\n\t"
  92894. #endif
  92895. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92896. "lsrs r6, r6, r7\n\t"
  92897. #else
  92898. "lsr r6, r6, r7\n\t"
  92899. #endif
  92900. #ifdef WOLFSSL_KEIL
  92901. "orrs r5, r5, r6\n\t"
  92902. #elif defined(__clang__)
  92903. "orrs r5, r6\n\t"
  92904. #else
  92905. "orr r5, r6\n\t"
  92906. #endif
  92907. "ldr r3, [%[a], #8]\n\t"
  92908. "str r5, [%[r], #16]\n\t"
  92909. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92910. "lsrs r6, r3, #1\n\t"
  92911. #else
  92912. "lsr r6, r3, #1\n\t"
  92913. #endif
  92914. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92915. "lsls r3, r3, %[n]\n\t"
  92916. #else
  92917. "lsl r3, r3, %[n]\n\t"
  92918. #endif
  92919. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92920. "lsrs r6, r6, r7\n\t"
  92921. #else
  92922. "lsr r6, r6, r7\n\t"
  92923. #endif
  92924. #ifdef WOLFSSL_KEIL
  92925. "orrs r4, r4, r6\n\t"
  92926. #elif defined(__clang__)
  92927. "orrs r4, r6\n\t"
  92928. #else
  92929. "orr r4, r6\n\t"
  92930. #endif
  92931. "ldr r5, [%[a], #4]\n\t"
  92932. "str r4, [%[r], #12]\n\t"
  92933. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92934. "lsrs r6, r5, #1\n\t"
  92935. #else
  92936. "lsr r6, r5, #1\n\t"
  92937. #endif
  92938. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92939. "lsls r5, r5, %[n]\n\t"
  92940. #else
  92941. "lsl r5, r5, %[n]\n\t"
  92942. #endif
  92943. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92944. "lsrs r6, r6, r7\n\t"
  92945. #else
  92946. "lsr r6, r6, r7\n\t"
  92947. #endif
  92948. #ifdef WOLFSSL_KEIL
  92949. "orrs r3, r3, r6\n\t"
  92950. #elif defined(__clang__)
  92951. "orrs r3, r6\n\t"
  92952. #else
  92953. "orr r3, r6\n\t"
  92954. #endif
  92955. "ldr r4, [%[a]]\n\t"
  92956. "str r3, [%[r], #8]\n\t"
  92957. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92958. "lsrs r6, r4, #1\n\t"
  92959. #else
  92960. "lsr r6, r4, #1\n\t"
  92961. #endif
  92962. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92963. "lsls r4, r4, %[n]\n\t"
  92964. #else
  92965. "lsl r4, r4, %[n]\n\t"
  92966. #endif
  92967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92968. "lsrs r6, r6, r7\n\t"
  92969. #else
  92970. "lsr r6, r6, r7\n\t"
  92971. #endif
  92972. #ifdef WOLFSSL_KEIL
  92973. "orrs r5, r5, r6\n\t"
  92974. #elif defined(__clang__)
  92975. "orrs r5, r6\n\t"
  92976. #else
  92977. "orr r5, r6\n\t"
  92978. #endif
  92979. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92980. "subs %[a], %[a], #0x40\n\t"
  92981. #else
  92982. "sub %[a], %[a], #0x40\n\t"
  92983. #endif
  92984. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92985. "subs %[r], %[r], #0x40\n\t"
  92986. #else
  92987. "sub %[r], %[r], #0x40\n\t"
  92988. #endif
  92989. "ldr r3, [%[a], #60]\n\t"
  92990. "str r5, [%[r], #68]\n\t"
  92991. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92992. "lsrs r6, r3, #1\n\t"
  92993. #else
  92994. "lsr r6, r3, #1\n\t"
  92995. #endif
  92996. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92997. "lsls r3, r3, %[n]\n\t"
  92998. #else
  92999. "lsl r3, r3, %[n]\n\t"
  93000. #endif
  93001. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93002. "lsrs r6, r6, r7\n\t"
  93003. #else
  93004. "lsr r6, r6, r7\n\t"
  93005. #endif
  93006. #ifdef WOLFSSL_KEIL
  93007. "orrs r4, r4, r6\n\t"
  93008. #elif defined(__clang__)
  93009. "orrs r4, r6\n\t"
  93010. #else
  93011. "orr r4, r6\n\t"
  93012. #endif
  93013. "ldr r5, [%[a], #56]\n\t"
  93014. "str r4, [%[r], #64]\n\t"
  93015. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93016. "lsrs r6, r5, #1\n\t"
  93017. #else
  93018. "lsr r6, r5, #1\n\t"
  93019. #endif
  93020. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93021. "lsls r5, r5, %[n]\n\t"
  93022. #else
  93023. "lsl r5, r5, %[n]\n\t"
  93024. #endif
  93025. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93026. "lsrs r6, r6, r7\n\t"
  93027. #else
  93028. "lsr r6, r6, r7\n\t"
  93029. #endif
  93030. #ifdef WOLFSSL_KEIL
  93031. "orrs r3, r3, r6\n\t"
  93032. #elif defined(__clang__)
  93033. "orrs r3, r6\n\t"
  93034. #else
  93035. "orr r3, r6\n\t"
  93036. #endif
  93037. "ldr r4, [%[a], #52]\n\t"
  93038. "str r3, [%[r], #60]\n\t"
  93039. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93040. "lsrs r6, r4, #1\n\t"
  93041. #else
  93042. "lsr r6, r4, #1\n\t"
  93043. #endif
  93044. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93045. "lsls r4, r4, %[n]\n\t"
  93046. #else
  93047. "lsl r4, r4, %[n]\n\t"
  93048. #endif
  93049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93050. "lsrs r6, r6, r7\n\t"
  93051. #else
  93052. "lsr r6, r6, r7\n\t"
  93053. #endif
  93054. #ifdef WOLFSSL_KEIL
  93055. "orrs r5, r5, r6\n\t"
  93056. #elif defined(__clang__)
  93057. "orrs r5, r6\n\t"
  93058. #else
  93059. "orr r5, r6\n\t"
  93060. #endif
  93061. "ldr r3, [%[a], #48]\n\t"
  93062. "str r5, [%[r], #56]\n\t"
  93063. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93064. "lsrs r6, r3, #1\n\t"
  93065. #else
  93066. "lsr r6, r3, #1\n\t"
  93067. #endif
  93068. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93069. "lsls r3, r3, %[n]\n\t"
  93070. #else
  93071. "lsl r3, r3, %[n]\n\t"
  93072. #endif
  93073. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93074. "lsrs r6, r6, r7\n\t"
  93075. #else
  93076. "lsr r6, r6, r7\n\t"
  93077. #endif
  93078. #ifdef WOLFSSL_KEIL
  93079. "orrs r4, r4, r6\n\t"
  93080. #elif defined(__clang__)
  93081. "orrs r4, r6\n\t"
  93082. #else
  93083. "orr r4, r6\n\t"
  93084. #endif
  93085. "ldr r5, [%[a], #44]\n\t"
  93086. "str r4, [%[r], #52]\n\t"
  93087. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93088. "lsrs r6, r5, #1\n\t"
  93089. #else
  93090. "lsr r6, r5, #1\n\t"
  93091. #endif
  93092. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93093. "lsls r5, r5, %[n]\n\t"
  93094. #else
  93095. "lsl r5, r5, %[n]\n\t"
  93096. #endif
  93097. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93098. "lsrs r6, r6, r7\n\t"
  93099. #else
  93100. "lsr r6, r6, r7\n\t"
  93101. #endif
  93102. #ifdef WOLFSSL_KEIL
  93103. "orrs r3, r3, r6\n\t"
  93104. #elif defined(__clang__)
  93105. "orrs r3, r6\n\t"
  93106. #else
  93107. "orr r3, r6\n\t"
  93108. #endif
  93109. "ldr r4, [%[a], #40]\n\t"
  93110. "str r3, [%[r], #48]\n\t"
  93111. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93112. "lsrs r6, r4, #1\n\t"
  93113. #else
  93114. "lsr r6, r4, #1\n\t"
  93115. #endif
  93116. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93117. "lsls r4, r4, %[n]\n\t"
  93118. #else
  93119. "lsl r4, r4, %[n]\n\t"
  93120. #endif
  93121. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93122. "lsrs r6, r6, r7\n\t"
  93123. #else
  93124. "lsr r6, r6, r7\n\t"
  93125. #endif
  93126. #ifdef WOLFSSL_KEIL
  93127. "orrs r5, r5, r6\n\t"
  93128. #elif defined(__clang__)
  93129. "orrs r5, r6\n\t"
  93130. #else
  93131. "orr r5, r6\n\t"
  93132. #endif
  93133. "ldr r3, [%[a], #36]\n\t"
  93134. "str r5, [%[r], #44]\n\t"
  93135. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93136. "lsrs r6, r3, #1\n\t"
  93137. #else
  93138. "lsr r6, r3, #1\n\t"
  93139. #endif
  93140. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93141. "lsls r3, r3, %[n]\n\t"
  93142. #else
  93143. "lsl r3, r3, %[n]\n\t"
  93144. #endif
  93145. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93146. "lsrs r6, r6, r7\n\t"
  93147. #else
  93148. "lsr r6, r6, r7\n\t"
  93149. #endif
  93150. #ifdef WOLFSSL_KEIL
  93151. "orrs r4, r4, r6\n\t"
  93152. #elif defined(__clang__)
  93153. "orrs r4, r6\n\t"
  93154. #else
  93155. "orr r4, r6\n\t"
  93156. #endif
  93157. "ldr r5, [%[a], #32]\n\t"
  93158. "str r4, [%[r], #40]\n\t"
  93159. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93160. "lsrs r6, r5, #1\n\t"
  93161. #else
  93162. "lsr r6, r5, #1\n\t"
  93163. #endif
  93164. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93165. "lsls r5, r5, %[n]\n\t"
  93166. #else
  93167. "lsl r5, r5, %[n]\n\t"
  93168. #endif
  93169. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93170. "lsrs r6, r6, r7\n\t"
  93171. #else
  93172. "lsr r6, r6, r7\n\t"
  93173. #endif
  93174. #ifdef WOLFSSL_KEIL
  93175. "orrs r3, r3, r6\n\t"
  93176. #elif defined(__clang__)
  93177. "orrs r3, r6\n\t"
  93178. #else
  93179. "orr r3, r6\n\t"
  93180. #endif
  93181. "ldr r4, [%[a], #28]\n\t"
  93182. "str r3, [%[r], #36]\n\t"
  93183. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93184. "lsrs r6, r4, #1\n\t"
  93185. #else
  93186. "lsr r6, r4, #1\n\t"
  93187. #endif
  93188. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93189. "lsls r4, r4, %[n]\n\t"
  93190. #else
  93191. "lsl r4, r4, %[n]\n\t"
  93192. #endif
  93193. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93194. "lsrs r6, r6, r7\n\t"
  93195. #else
  93196. "lsr r6, r6, r7\n\t"
  93197. #endif
  93198. #ifdef WOLFSSL_KEIL
  93199. "orrs r5, r5, r6\n\t"
  93200. #elif defined(__clang__)
  93201. "orrs r5, r6\n\t"
  93202. #else
  93203. "orr r5, r6\n\t"
  93204. #endif
  93205. "ldr r3, [%[a], #24]\n\t"
  93206. "str r5, [%[r], #32]\n\t"
  93207. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93208. "lsrs r6, r3, #1\n\t"
  93209. #else
  93210. "lsr r6, r3, #1\n\t"
  93211. #endif
  93212. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93213. "lsls r3, r3, %[n]\n\t"
  93214. #else
  93215. "lsl r3, r3, %[n]\n\t"
  93216. #endif
  93217. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93218. "lsrs r6, r6, r7\n\t"
  93219. #else
  93220. "lsr r6, r6, r7\n\t"
  93221. #endif
  93222. #ifdef WOLFSSL_KEIL
  93223. "orrs r4, r4, r6\n\t"
  93224. #elif defined(__clang__)
  93225. "orrs r4, r6\n\t"
  93226. #else
  93227. "orr r4, r6\n\t"
  93228. #endif
  93229. "ldr r5, [%[a], #20]\n\t"
  93230. "str r4, [%[r], #28]\n\t"
  93231. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93232. "lsrs r6, r5, #1\n\t"
  93233. #else
  93234. "lsr r6, r5, #1\n\t"
  93235. #endif
  93236. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93237. "lsls r5, r5, %[n]\n\t"
  93238. #else
  93239. "lsl r5, r5, %[n]\n\t"
  93240. #endif
  93241. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93242. "lsrs r6, r6, r7\n\t"
  93243. #else
  93244. "lsr r6, r6, r7\n\t"
  93245. #endif
  93246. #ifdef WOLFSSL_KEIL
  93247. "orrs r3, r3, r6\n\t"
  93248. #elif defined(__clang__)
  93249. "orrs r3, r6\n\t"
  93250. #else
  93251. "orr r3, r6\n\t"
  93252. #endif
  93253. "ldr r4, [%[a], #16]\n\t"
  93254. "str r3, [%[r], #24]\n\t"
  93255. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93256. "lsrs r6, r4, #1\n\t"
  93257. #else
  93258. "lsr r6, r4, #1\n\t"
  93259. #endif
  93260. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93261. "lsls r4, r4, %[n]\n\t"
  93262. #else
  93263. "lsl r4, r4, %[n]\n\t"
  93264. #endif
  93265. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93266. "lsrs r6, r6, r7\n\t"
  93267. #else
  93268. "lsr r6, r6, r7\n\t"
  93269. #endif
  93270. #ifdef WOLFSSL_KEIL
  93271. "orrs r5, r5, r6\n\t"
  93272. #elif defined(__clang__)
  93273. "orrs r5, r6\n\t"
  93274. #else
  93275. "orr r5, r6\n\t"
  93276. #endif
  93277. "ldr r3, [%[a], #12]\n\t"
  93278. "str r5, [%[r], #20]\n\t"
  93279. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93280. "lsrs r6, r3, #1\n\t"
  93281. #else
  93282. "lsr r6, r3, #1\n\t"
  93283. #endif
  93284. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93285. "lsls r3, r3, %[n]\n\t"
  93286. #else
  93287. "lsl r3, r3, %[n]\n\t"
  93288. #endif
  93289. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93290. "lsrs r6, r6, r7\n\t"
  93291. #else
  93292. "lsr r6, r6, r7\n\t"
  93293. #endif
  93294. #ifdef WOLFSSL_KEIL
  93295. "orrs r4, r4, r6\n\t"
  93296. #elif defined(__clang__)
  93297. "orrs r4, r6\n\t"
  93298. #else
  93299. "orr r4, r6\n\t"
  93300. #endif
  93301. "ldr r5, [%[a], #8]\n\t"
  93302. "str r4, [%[r], #16]\n\t"
  93303. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93304. "lsrs r6, r5, #1\n\t"
  93305. #else
  93306. "lsr r6, r5, #1\n\t"
  93307. #endif
  93308. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93309. "lsls r5, r5, %[n]\n\t"
  93310. #else
  93311. "lsl r5, r5, %[n]\n\t"
  93312. #endif
  93313. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93314. "lsrs r6, r6, r7\n\t"
  93315. #else
  93316. "lsr r6, r6, r7\n\t"
  93317. #endif
  93318. #ifdef WOLFSSL_KEIL
  93319. "orrs r3, r3, r6\n\t"
  93320. #elif defined(__clang__)
  93321. "orrs r3, r6\n\t"
  93322. #else
  93323. "orr r3, r6\n\t"
  93324. #endif
  93325. "ldr r4, [%[a], #4]\n\t"
  93326. "str r3, [%[r], #12]\n\t"
  93327. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93328. "lsrs r6, r4, #1\n\t"
  93329. #else
  93330. "lsr r6, r4, #1\n\t"
  93331. #endif
  93332. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93333. "lsls r4, r4, %[n]\n\t"
  93334. #else
  93335. "lsl r4, r4, %[n]\n\t"
  93336. #endif
  93337. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93338. "lsrs r6, r6, r7\n\t"
  93339. #else
  93340. "lsr r6, r6, r7\n\t"
  93341. #endif
  93342. #ifdef WOLFSSL_KEIL
  93343. "orrs r5, r5, r6\n\t"
  93344. #elif defined(__clang__)
  93345. "orrs r5, r6\n\t"
  93346. #else
  93347. "orr r5, r6\n\t"
  93348. #endif
  93349. "ldr r3, [%[a]]\n\t"
  93350. "str r5, [%[r], #8]\n\t"
  93351. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93352. "lsrs r6, r3, #1\n\t"
  93353. #else
  93354. "lsr r6, r3, #1\n\t"
  93355. #endif
  93356. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93357. "lsls r3, r3, %[n]\n\t"
  93358. #else
  93359. "lsl r3, r3, %[n]\n\t"
  93360. #endif
  93361. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93362. "lsrs r6, r6, r7\n\t"
  93363. #else
  93364. "lsr r6, r6, r7\n\t"
  93365. #endif
  93366. #ifdef WOLFSSL_KEIL
  93367. "orrs r4, r4, r6\n\t"
  93368. #elif defined(__clang__)
  93369. "orrs r4, r6\n\t"
  93370. #else
  93371. "orr r4, r6\n\t"
  93372. #endif
  93373. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93374. "subs %[a], %[a], #0x40\n\t"
  93375. #else
  93376. "sub %[a], %[a], #0x40\n\t"
  93377. #endif
  93378. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93379. "subs %[r], %[r], #0x40\n\t"
  93380. #else
  93381. "sub %[r], %[r], #0x40\n\t"
  93382. #endif
  93383. "ldr r5, [%[a], #60]\n\t"
  93384. "str r4, [%[r], #68]\n\t"
  93385. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93386. "lsrs r6, r5, #1\n\t"
  93387. #else
  93388. "lsr r6, r5, #1\n\t"
  93389. #endif
  93390. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93391. "lsls r5, r5, %[n]\n\t"
  93392. #else
  93393. "lsl r5, r5, %[n]\n\t"
  93394. #endif
  93395. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93396. "lsrs r6, r6, r7\n\t"
  93397. #else
  93398. "lsr r6, r6, r7\n\t"
  93399. #endif
  93400. #ifdef WOLFSSL_KEIL
  93401. "orrs r3, r3, r6\n\t"
  93402. #elif defined(__clang__)
  93403. "orrs r3, r6\n\t"
  93404. #else
  93405. "orr r3, r6\n\t"
  93406. #endif
  93407. "ldr r4, [%[a], #56]\n\t"
  93408. "str r3, [%[r], #64]\n\t"
  93409. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93410. "lsrs r6, r4, #1\n\t"
  93411. #else
  93412. "lsr r6, r4, #1\n\t"
  93413. #endif
  93414. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93415. "lsls r4, r4, %[n]\n\t"
  93416. #else
  93417. "lsl r4, r4, %[n]\n\t"
  93418. #endif
  93419. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93420. "lsrs r6, r6, r7\n\t"
  93421. #else
  93422. "lsr r6, r6, r7\n\t"
  93423. #endif
  93424. #ifdef WOLFSSL_KEIL
  93425. "orrs r5, r5, r6\n\t"
  93426. #elif defined(__clang__)
  93427. "orrs r5, r6\n\t"
  93428. #else
  93429. "orr r5, r6\n\t"
  93430. #endif
  93431. "ldr r3, [%[a], #52]\n\t"
  93432. "str r5, [%[r], #60]\n\t"
  93433. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93434. "lsrs r6, r3, #1\n\t"
  93435. #else
  93436. "lsr r6, r3, #1\n\t"
  93437. #endif
  93438. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93439. "lsls r3, r3, %[n]\n\t"
  93440. #else
  93441. "lsl r3, r3, %[n]\n\t"
  93442. #endif
  93443. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93444. "lsrs r6, r6, r7\n\t"
  93445. #else
  93446. "lsr r6, r6, r7\n\t"
  93447. #endif
  93448. #ifdef WOLFSSL_KEIL
  93449. "orrs r4, r4, r6\n\t"
  93450. #elif defined(__clang__)
  93451. "orrs r4, r6\n\t"
  93452. #else
  93453. "orr r4, r6\n\t"
  93454. #endif
  93455. "ldr r5, [%[a], #48]\n\t"
  93456. "str r4, [%[r], #56]\n\t"
  93457. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93458. "lsrs r6, r5, #1\n\t"
  93459. #else
  93460. "lsr r6, r5, #1\n\t"
  93461. #endif
  93462. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93463. "lsls r5, r5, %[n]\n\t"
  93464. #else
  93465. "lsl r5, r5, %[n]\n\t"
  93466. #endif
  93467. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93468. "lsrs r6, r6, r7\n\t"
  93469. #else
  93470. "lsr r6, r6, r7\n\t"
  93471. #endif
  93472. #ifdef WOLFSSL_KEIL
  93473. "orrs r3, r3, r6\n\t"
  93474. #elif defined(__clang__)
  93475. "orrs r3, r6\n\t"
  93476. #else
  93477. "orr r3, r6\n\t"
  93478. #endif
  93479. "ldr r4, [%[a], #44]\n\t"
  93480. "str r3, [%[r], #52]\n\t"
  93481. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93482. "lsrs r6, r4, #1\n\t"
  93483. #else
  93484. "lsr r6, r4, #1\n\t"
  93485. #endif
  93486. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93487. "lsls r4, r4, %[n]\n\t"
  93488. #else
  93489. "lsl r4, r4, %[n]\n\t"
  93490. #endif
  93491. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93492. "lsrs r6, r6, r7\n\t"
  93493. #else
  93494. "lsr r6, r6, r7\n\t"
  93495. #endif
  93496. #ifdef WOLFSSL_KEIL
  93497. "orrs r5, r5, r6\n\t"
  93498. #elif defined(__clang__)
  93499. "orrs r5, r6\n\t"
  93500. #else
  93501. "orr r5, r6\n\t"
  93502. #endif
  93503. "ldr r3, [%[a], #40]\n\t"
  93504. "str r5, [%[r], #48]\n\t"
  93505. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93506. "lsrs r6, r3, #1\n\t"
  93507. #else
  93508. "lsr r6, r3, #1\n\t"
  93509. #endif
  93510. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93511. "lsls r3, r3, %[n]\n\t"
  93512. #else
  93513. "lsl r3, r3, %[n]\n\t"
  93514. #endif
  93515. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93516. "lsrs r6, r6, r7\n\t"
  93517. #else
  93518. "lsr r6, r6, r7\n\t"
  93519. #endif
  93520. #ifdef WOLFSSL_KEIL
  93521. "orrs r4, r4, r6\n\t"
  93522. #elif defined(__clang__)
  93523. "orrs r4, r6\n\t"
  93524. #else
  93525. "orr r4, r6\n\t"
  93526. #endif
  93527. "ldr r5, [%[a], #36]\n\t"
  93528. "str r4, [%[r], #44]\n\t"
  93529. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93530. "lsrs r6, r5, #1\n\t"
  93531. #else
  93532. "lsr r6, r5, #1\n\t"
  93533. #endif
  93534. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93535. "lsls r5, r5, %[n]\n\t"
  93536. #else
  93537. "lsl r5, r5, %[n]\n\t"
  93538. #endif
  93539. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93540. "lsrs r6, r6, r7\n\t"
  93541. #else
  93542. "lsr r6, r6, r7\n\t"
  93543. #endif
  93544. #ifdef WOLFSSL_KEIL
  93545. "orrs r3, r3, r6\n\t"
  93546. #elif defined(__clang__)
  93547. "orrs r3, r6\n\t"
  93548. #else
  93549. "orr r3, r6\n\t"
  93550. #endif
  93551. "ldr r4, [%[a], #32]\n\t"
  93552. "str r3, [%[r], #40]\n\t"
  93553. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93554. "lsrs r6, r4, #1\n\t"
  93555. #else
  93556. "lsr r6, r4, #1\n\t"
  93557. #endif
  93558. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93559. "lsls r4, r4, %[n]\n\t"
  93560. #else
  93561. "lsl r4, r4, %[n]\n\t"
  93562. #endif
  93563. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93564. "lsrs r6, r6, r7\n\t"
  93565. #else
  93566. "lsr r6, r6, r7\n\t"
  93567. #endif
  93568. #ifdef WOLFSSL_KEIL
  93569. "orrs r5, r5, r6\n\t"
  93570. #elif defined(__clang__)
  93571. "orrs r5, r6\n\t"
  93572. #else
  93573. "orr r5, r6\n\t"
  93574. #endif
  93575. "ldr r3, [%[a], #28]\n\t"
  93576. "str r5, [%[r], #36]\n\t"
  93577. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93578. "lsrs r6, r3, #1\n\t"
  93579. #else
  93580. "lsr r6, r3, #1\n\t"
  93581. #endif
  93582. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93583. "lsls r3, r3, %[n]\n\t"
  93584. #else
  93585. "lsl r3, r3, %[n]\n\t"
  93586. #endif
  93587. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93588. "lsrs r6, r6, r7\n\t"
  93589. #else
  93590. "lsr r6, r6, r7\n\t"
  93591. #endif
  93592. #ifdef WOLFSSL_KEIL
  93593. "orrs r4, r4, r6\n\t"
  93594. #elif defined(__clang__)
  93595. "orrs r4, r6\n\t"
  93596. #else
  93597. "orr r4, r6\n\t"
  93598. #endif
  93599. "ldr r5, [%[a], #24]\n\t"
  93600. "str r4, [%[r], #32]\n\t"
  93601. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93602. "lsrs r6, r5, #1\n\t"
  93603. #else
  93604. "lsr r6, r5, #1\n\t"
  93605. #endif
  93606. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93607. "lsls r5, r5, %[n]\n\t"
  93608. #else
  93609. "lsl r5, r5, %[n]\n\t"
  93610. #endif
  93611. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93612. "lsrs r6, r6, r7\n\t"
  93613. #else
  93614. "lsr r6, r6, r7\n\t"
  93615. #endif
  93616. #ifdef WOLFSSL_KEIL
  93617. "orrs r3, r3, r6\n\t"
  93618. #elif defined(__clang__)
  93619. "orrs r3, r6\n\t"
  93620. #else
  93621. "orr r3, r6\n\t"
  93622. #endif
  93623. "ldr r4, [%[a], #20]\n\t"
  93624. "str r3, [%[r], #28]\n\t"
  93625. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93626. "lsrs r6, r4, #1\n\t"
  93627. #else
  93628. "lsr r6, r4, #1\n\t"
  93629. #endif
  93630. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93631. "lsls r4, r4, %[n]\n\t"
  93632. #else
  93633. "lsl r4, r4, %[n]\n\t"
  93634. #endif
  93635. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93636. "lsrs r6, r6, r7\n\t"
  93637. #else
  93638. "lsr r6, r6, r7\n\t"
  93639. #endif
  93640. #ifdef WOLFSSL_KEIL
  93641. "orrs r5, r5, r6\n\t"
  93642. #elif defined(__clang__)
  93643. "orrs r5, r6\n\t"
  93644. #else
  93645. "orr r5, r6\n\t"
  93646. #endif
  93647. "ldr r3, [%[a], #16]\n\t"
  93648. "str r5, [%[r], #24]\n\t"
  93649. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93650. "lsrs r6, r3, #1\n\t"
  93651. #else
  93652. "lsr r6, r3, #1\n\t"
  93653. #endif
  93654. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93655. "lsls r3, r3, %[n]\n\t"
  93656. #else
  93657. "lsl r3, r3, %[n]\n\t"
  93658. #endif
  93659. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93660. "lsrs r6, r6, r7\n\t"
  93661. #else
  93662. "lsr r6, r6, r7\n\t"
  93663. #endif
  93664. #ifdef WOLFSSL_KEIL
  93665. "orrs r4, r4, r6\n\t"
  93666. #elif defined(__clang__)
  93667. "orrs r4, r6\n\t"
  93668. #else
  93669. "orr r4, r6\n\t"
  93670. #endif
  93671. "ldr r5, [%[a], #12]\n\t"
  93672. "str r4, [%[r], #20]\n\t"
  93673. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93674. "lsrs r6, r5, #1\n\t"
  93675. #else
  93676. "lsr r6, r5, #1\n\t"
  93677. #endif
  93678. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93679. "lsls r5, r5, %[n]\n\t"
  93680. #else
  93681. "lsl r5, r5, %[n]\n\t"
  93682. #endif
  93683. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93684. "lsrs r6, r6, r7\n\t"
  93685. #else
  93686. "lsr r6, r6, r7\n\t"
  93687. #endif
  93688. #ifdef WOLFSSL_KEIL
  93689. "orrs r3, r3, r6\n\t"
  93690. #elif defined(__clang__)
  93691. "orrs r3, r6\n\t"
  93692. #else
  93693. "orr r3, r6\n\t"
  93694. #endif
  93695. "ldr r4, [%[a], #8]\n\t"
  93696. "str r3, [%[r], #16]\n\t"
  93697. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93698. "lsrs r6, r4, #1\n\t"
  93699. #else
  93700. "lsr r6, r4, #1\n\t"
  93701. #endif
  93702. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93703. "lsls r4, r4, %[n]\n\t"
  93704. #else
  93705. "lsl r4, r4, %[n]\n\t"
  93706. #endif
  93707. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93708. "lsrs r6, r6, r7\n\t"
  93709. #else
  93710. "lsr r6, r6, r7\n\t"
  93711. #endif
  93712. #ifdef WOLFSSL_KEIL
  93713. "orrs r5, r5, r6\n\t"
  93714. #elif defined(__clang__)
  93715. "orrs r5, r6\n\t"
  93716. #else
  93717. "orr r5, r6\n\t"
  93718. #endif
  93719. "ldr r3, [%[a], #4]\n\t"
  93720. "str r5, [%[r], #12]\n\t"
  93721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93722. "lsrs r6, r3, #1\n\t"
  93723. #else
  93724. "lsr r6, r3, #1\n\t"
  93725. #endif
  93726. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93727. "lsls r3, r3, %[n]\n\t"
  93728. #else
  93729. "lsl r3, r3, %[n]\n\t"
  93730. #endif
  93731. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93732. "lsrs r6, r6, r7\n\t"
  93733. #else
  93734. "lsr r6, r6, r7\n\t"
  93735. #endif
  93736. #ifdef WOLFSSL_KEIL
  93737. "orrs r4, r4, r6\n\t"
  93738. #elif defined(__clang__)
  93739. "orrs r4, r6\n\t"
  93740. #else
  93741. "orr r4, r6\n\t"
  93742. #endif
  93743. "ldr r5, [%[a]]\n\t"
  93744. "str r4, [%[r], #8]\n\t"
  93745. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93746. "lsrs r6, r5, #1\n\t"
  93747. #else
  93748. "lsr r6, r5, #1\n\t"
  93749. #endif
  93750. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93751. "lsls r5, r5, %[n]\n\t"
  93752. #else
  93753. "lsl r5, r5, %[n]\n\t"
  93754. #endif
  93755. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93756. "lsrs r6, r6, r7\n\t"
  93757. #else
  93758. "lsr r6, r6, r7\n\t"
  93759. #endif
  93760. #ifdef WOLFSSL_KEIL
  93761. "orrs r3, r3, r6\n\t"
  93762. #elif defined(__clang__)
  93763. "orrs r3, r6\n\t"
  93764. #else
  93765. "orr r3, r6\n\t"
  93766. #endif
  93767. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93768. "subs %[a], %[a], #0x40\n\t"
  93769. #else
  93770. "sub %[a], %[a], #0x40\n\t"
  93771. #endif
  93772. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93773. "subs %[r], %[r], #0x40\n\t"
  93774. #else
  93775. "sub %[r], %[r], #0x40\n\t"
  93776. #endif
  93777. "ldr r4, [%[a], #60]\n\t"
  93778. "str r3, [%[r], #68]\n\t"
  93779. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93780. "lsrs r6, r4, #1\n\t"
  93781. #else
  93782. "lsr r6, r4, #1\n\t"
  93783. #endif
  93784. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93785. "lsls r4, r4, %[n]\n\t"
  93786. #else
  93787. "lsl r4, r4, %[n]\n\t"
  93788. #endif
  93789. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93790. "lsrs r6, r6, r7\n\t"
  93791. #else
  93792. "lsr r6, r6, r7\n\t"
  93793. #endif
  93794. #ifdef WOLFSSL_KEIL
  93795. "orrs r5, r5, r6\n\t"
  93796. #elif defined(__clang__)
  93797. "orrs r5, r6\n\t"
  93798. #else
  93799. "orr r5, r6\n\t"
  93800. #endif
  93801. "ldr r3, [%[a], #56]\n\t"
  93802. "str r5, [%[r], #64]\n\t"
  93803. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93804. "lsrs r6, r3, #1\n\t"
  93805. #else
  93806. "lsr r6, r3, #1\n\t"
  93807. #endif
  93808. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93809. "lsls r3, r3, %[n]\n\t"
  93810. #else
  93811. "lsl r3, r3, %[n]\n\t"
  93812. #endif
  93813. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93814. "lsrs r6, r6, r7\n\t"
  93815. #else
  93816. "lsr r6, r6, r7\n\t"
  93817. #endif
  93818. #ifdef WOLFSSL_KEIL
  93819. "orrs r4, r4, r6\n\t"
  93820. #elif defined(__clang__)
  93821. "orrs r4, r6\n\t"
  93822. #else
  93823. "orr r4, r6\n\t"
  93824. #endif
  93825. "ldr r5, [%[a], #52]\n\t"
  93826. "str r4, [%[r], #60]\n\t"
  93827. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93828. "lsrs r6, r5, #1\n\t"
  93829. #else
  93830. "lsr r6, r5, #1\n\t"
  93831. #endif
  93832. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93833. "lsls r5, r5, %[n]\n\t"
  93834. #else
  93835. "lsl r5, r5, %[n]\n\t"
  93836. #endif
  93837. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93838. "lsrs r6, r6, r7\n\t"
  93839. #else
  93840. "lsr r6, r6, r7\n\t"
  93841. #endif
  93842. #ifdef WOLFSSL_KEIL
  93843. "orrs r3, r3, r6\n\t"
  93844. #elif defined(__clang__)
  93845. "orrs r3, r6\n\t"
  93846. #else
  93847. "orr r3, r6\n\t"
  93848. #endif
  93849. "ldr r4, [%[a], #48]\n\t"
  93850. "str r3, [%[r], #56]\n\t"
  93851. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93852. "lsrs r6, r4, #1\n\t"
  93853. #else
  93854. "lsr r6, r4, #1\n\t"
  93855. #endif
  93856. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93857. "lsls r4, r4, %[n]\n\t"
  93858. #else
  93859. "lsl r4, r4, %[n]\n\t"
  93860. #endif
  93861. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93862. "lsrs r6, r6, r7\n\t"
  93863. #else
  93864. "lsr r6, r6, r7\n\t"
  93865. #endif
  93866. #ifdef WOLFSSL_KEIL
  93867. "orrs r5, r5, r6\n\t"
  93868. #elif defined(__clang__)
  93869. "orrs r5, r6\n\t"
  93870. #else
  93871. "orr r5, r6\n\t"
  93872. #endif
  93873. "ldr r3, [%[a], #44]\n\t"
  93874. "str r5, [%[r], #52]\n\t"
  93875. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93876. "lsrs r6, r3, #1\n\t"
  93877. #else
  93878. "lsr r6, r3, #1\n\t"
  93879. #endif
  93880. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93881. "lsls r3, r3, %[n]\n\t"
  93882. #else
  93883. "lsl r3, r3, %[n]\n\t"
  93884. #endif
  93885. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93886. "lsrs r6, r6, r7\n\t"
  93887. #else
  93888. "lsr r6, r6, r7\n\t"
  93889. #endif
  93890. #ifdef WOLFSSL_KEIL
  93891. "orrs r4, r4, r6\n\t"
  93892. #elif defined(__clang__)
  93893. "orrs r4, r6\n\t"
  93894. #else
  93895. "orr r4, r6\n\t"
  93896. #endif
  93897. "ldr r5, [%[a], #40]\n\t"
  93898. "str r4, [%[r], #48]\n\t"
  93899. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93900. "lsrs r6, r5, #1\n\t"
  93901. #else
  93902. "lsr r6, r5, #1\n\t"
  93903. #endif
  93904. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93905. "lsls r5, r5, %[n]\n\t"
  93906. #else
  93907. "lsl r5, r5, %[n]\n\t"
  93908. #endif
  93909. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93910. "lsrs r6, r6, r7\n\t"
  93911. #else
  93912. "lsr r6, r6, r7\n\t"
  93913. #endif
  93914. #ifdef WOLFSSL_KEIL
  93915. "orrs r3, r3, r6\n\t"
  93916. #elif defined(__clang__)
  93917. "orrs r3, r6\n\t"
  93918. #else
  93919. "orr r3, r6\n\t"
  93920. #endif
  93921. "ldr r4, [%[a], #36]\n\t"
  93922. "str r3, [%[r], #44]\n\t"
  93923. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93924. "lsrs r6, r4, #1\n\t"
  93925. #else
  93926. "lsr r6, r4, #1\n\t"
  93927. #endif
  93928. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93929. "lsls r4, r4, %[n]\n\t"
  93930. #else
  93931. "lsl r4, r4, %[n]\n\t"
  93932. #endif
  93933. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93934. "lsrs r6, r6, r7\n\t"
  93935. #else
  93936. "lsr r6, r6, r7\n\t"
  93937. #endif
  93938. #ifdef WOLFSSL_KEIL
  93939. "orrs r5, r5, r6\n\t"
  93940. #elif defined(__clang__)
  93941. "orrs r5, r6\n\t"
  93942. #else
  93943. "orr r5, r6\n\t"
  93944. #endif
  93945. "ldr r3, [%[a], #32]\n\t"
  93946. "str r5, [%[r], #40]\n\t"
  93947. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93948. "lsrs r6, r3, #1\n\t"
  93949. #else
  93950. "lsr r6, r3, #1\n\t"
  93951. #endif
  93952. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93953. "lsls r3, r3, %[n]\n\t"
  93954. #else
  93955. "lsl r3, r3, %[n]\n\t"
  93956. #endif
  93957. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93958. "lsrs r6, r6, r7\n\t"
  93959. #else
  93960. "lsr r6, r6, r7\n\t"
  93961. #endif
  93962. #ifdef WOLFSSL_KEIL
  93963. "orrs r4, r4, r6\n\t"
  93964. #elif defined(__clang__)
  93965. "orrs r4, r6\n\t"
  93966. #else
  93967. "orr r4, r6\n\t"
  93968. #endif
  93969. "ldr r5, [%[a], #28]\n\t"
  93970. "str r4, [%[r], #36]\n\t"
  93971. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93972. "lsrs r6, r5, #1\n\t"
  93973. #else
  93974. "lsr r6, r5, #1\n\t"
  93975. #endif
  93976. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93977. "lsls r5, r5, %[n]\n\t"
  93978. #else
  93979. "lsl r5, r5, %[n]\n\t"
  93980. #endif
  93981. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93982. "lsrs r6, r6, r7\n\t"
  93983. #else
  93984. "lsr r6, r6, r7\n\t"
  93985. #endif
  93986. #ifdef WOLFSSL_KEIL
  93987. "orrs r3, r3, r6\n\t"
  93988. #elif defined(__clang__)
  93989. "orrs r3, r6\n\t"
  93990. #else
  93991. "orr r3, r6\n\t"
  93992. #endif
  93993. "ldr r4, [%[a], #24]\n\t"
  93994. "str r3, [%[r], #32]\n\t"
  93995. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93996. "lsrs r6, r4, #1\n\t"
  93997. #else
  93998. "lsr r6, r4, #1\n\t"
  93999. #endif
  94000. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94001. "lsls r4, r4, %[n]\n\t"
  94002. #else
  94003. "lsl r4, r4, %[n]\n\t"
  94004. #endif
  94005. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94006. "lsrs r6, r6, r7\n\t"
  94007. #else
  94008. "lsr r6, r6, r7\n\t"
  94009. #endif
  94010. #ifdef WOLFSSL_KEIL
  94011. "orrs r5, r5, r6\n\t"
  94012. #elif defined(__clang__)
  94013. "orrs r5, r6\n\t"
  94014. #else
  94015. "orr r5, r6\n\t"
  94016. #endif
  94017. "ldr r3, [%[a], #20]\n\t"
  94018. "str r5, [%[r], #28]\n\t"
  94019. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94020. "lsrs r6, r3, #1\n\t"
  94021. #else
  94022. "lsr r6, r3, #1\n\t"
  94023. #endif
  94024. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94025. "lsls r3, r3, %[n]\n\t"
  94026. #else
  94027. "lsl r3, r3, %[n]\n\t"
  94028. #endif
  94029. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94030. "lsrs r6, r6, r7\n\t"
  94031. #else
  94032. "lsr r6, r6, r7\n\t"
  94033. #endif
  94034. #ifdef WOLFSSL_KEIL
  94035. "orrs r4, r4, r6\n\t"
  94036. #elif defined(__clang__)
  94037. "orrs r4, r6\n\t"
  94038. #else
  94039. "orr r4, r6\n\t"
  94040. #endif
  94041. "ldr r5, [%[a], #16]\n\t"
  94042. "str r4, [%[r], #24]\n\t"
  94043. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94044. "lsrs r6, r5, #1\n\t"
  94045. #else
  94046. "lsr r6, r5, #1\n\t"
  94047. #endif
  94048. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94049. "lsls r5, r5, %[n]\n\t"
  94050. #else
  94051. "lsl r5, r5, %[n]\n\t"
  94052. #endif
  94053. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94054. "lsrs r6, r6, r7\n\t"
  94055. #else
  94056. "lsr r6, r6, r7\n\t"
  94057. #endif
  94058. #ifdef WOLFSSL_KEIL
  94059. "orrs r3, r3, r6\n\t"
  94060. #elif defined(__clang__)
  94061. "orrs r3, r6\n\t"
  94062. #else
  94063. "orr r3, r6\n\t"
  94064. #endif
  94065. "ldr r4, [%[a], #12]\n\t"
  94066. "str r3, [%[r], #20]\n\t"
  94067. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94068. "lsrs r6, r4, #1\n\t"
  94069. #else
  94070. "lsr r6, r4, #1\n\t"
  94071. #endif
  94072. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94073. "lsls r4, r4, %[n]\n\t"
  94074. #else
  94075. "lsl r4, r4, %[n]\n\t"
  94076. #endif
  94077. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94078. "lsrs r6, r6, r7\n\t"
  94079. #else
  94080. "lsr r6, r6, r7\n\t"
  94081. #endif
  94082. #ifdef WOLFSSL_KEIL
  94083. "orrs r5, r5, r6\n\t"
  94084. #elif defined(__clang__)
  94085. "orrs r5, r6\n\t"
  94086. #else
  94087. "orr r5, r6\n\t"
  94088. #endif
  94089. "ldr r3, [%[a], #8]\n\t"
  94090. "str r5, [%[r], #16]\n\t"
  94091. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94092. "lsrs r6, r3, #1\n\t"
  94093. #else
  94094. "lsr r6, r3, #1\n\t"
  94095. #endif
  94096. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94097. "lsls r3, r3, %[n]\n\t"
  94098. #else
  94099. "lsl r3, r3, %[n]\n\t"
  94100. #endif
  94101. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94102. "lsrs r6, r6, r7\n\t"
  94103. #else
  94104. "lsr r6, r6, r7\n\t"
  94105. #endif
  94106. #ifdef WOLFSSL_KEIL
  94107. "orrs r4, r4, r6\n\t"
  94108. #elif defined(__clang__)
  94109. "orrs r4, r6\n\t"
  94110. #else
  94111. "orr r4, r6\n\t"
  94112. #endif
  94113. "ldr r5, [%[a], #4]\n\t"
  94114. "str r4, [%[r], #12]\n\t"
  94115. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94116. "lsrs r6, r5, #1\n\t"
  94117. #else
  94118. "lsr r6, r5, #1\n\t"
  94119. #endif
  94120. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94121. "lsls r5, r5, %[n]\n\t"
  94122. #else
  94123. "lsl r5, r5, %[n]\n\t"
  94124. #endif
  94125. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94126. "lsrs r6, r6, r7\n\t"
  94127. #else
  94128. "lsr r6, r6, r7\n\t"
  94129. #endif
  94130. #ifdef WOLFSSL_KEIL
  94131. "orrs r3, r3, r6\n\t"
  94132. #elif defined(__clang__)
  94133. "orrs r3, r6\n\t"
  94134. #else
  94135. "orr r3, r6\n\t"
  94136. #endif
  94137. "ldr r4, [%[a]]\n\t"
  94138. "str r3, [%[r], #8]\n\t"
  94139. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94140. "lsrs r6, r4, #1\n\t"
  94141. #else
  94142. "lsr r6, r4, #1\n\t"
  94143. #endif
  94144. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94145. "lsls r4, r4, %[n]\n\t"
  94146. #else
  94147. "lsl r4, r4, %[n]\n\t"
  94148. #endif
  94149. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94150. "lsrs r6, r6, r7\n\t"
  94151. #else
  94152. "lsr r6, r6, r7\n\t"
  94153. #endif
  94154. #ifdef WOLFSSL_KEIL
  94155. "orrs r5, r5, r6\n\t"
  94156. #elif defined(__clang__)
  94157. "orrs r5, r6\n\t"
  94158. #else
  94159. "orr r5, r6\n\t"
  94160. #endif
  94161. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94162. "subs %[a], %[a], #0x40\n\t"
  94163. #else
  94164. "sub %[a], %[a], #0x40\n\t"
  94165. #endif
  94166. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94167. "subs %[r], %[r], #0x40\n\t"
  94168. #else
  94169. "sub %[r], %[r], #0x40\n\t"
  94170. #endif
  94171. "ldr r3, [%[a], #60]\n\t"
  94172. "str r5, [%[r], #68]\n\t"
  94173. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94174. "lsrs r6, r3, #1\n\t"
  94175. #else
  94176. "lsr r6, r3, #1\n\t"
  94177. #endif
  94178. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94179. "lsls r3, r3, %[n]\n\t"
  94180. #else
  94181. "lsl r3, r3, %[n]\n\t"
  94182. #endif
  94183. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94184. "lsrs r6, r6, r7\n\t"
  94185. #else
  94186. "lsr r6, r6, r7\n\t"
  94187. #endif
  94188. #ifdef WOLFSSL_KEIL
  94189. "orrs r4, r4, r6\n\t"
  94190. #elif defined(__clang__)
  94191. "orrs r4, r6\n\t"
  94192. #else
  94193. "orr r4, r6\n\t"
  94194. #endif
  94195. "ldr r5, [%[a], #56]\n\t"
  94196. "str r4, [%[r], #64]\n\t"
  94197. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94198. "lsrs r6, r5, #1\n\t"
  94199. #else
  94200. "lsr r6, r5, #1\n\t"
  94201. #endif
  94202. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94203. "lsls r5, r5, %[n]\n\t"
  94204. #else
  94205. "lsl r5, r5, %[n]\n\t"
  94206. #endif
  94207. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94208. "lsrs r6, r6, r7\n\t"
  94209. #else
  94210. "lsr r6, r6, r7\n\t"
  94211. #endif
  94212. #ifdef WOLFSSL_KEIL
  94213. "orrs r3, r3, r6\n\t"
  94214. #elif defined(__clang__)
  94215. "orrs r3, r6\n\t"
  94216. #else
  94217. "orr r3, r6\n\t"
  94218. #endif
  94219. "ldr r4, [%[a], #52]\n\t"
  94220. "str r3, [%[r], #60]\n\t"
  94221. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94222. "lsrs r6, r4, #1\n\t"
  94223. #else
  94224. "lsr r6, r4, #1\n\t"
  94225. #endif
  94226. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94227. "lsls r4, r4, %[n]\n\t"
  94228. #else
  94229. "lsl r4, r4, %[n]\n\t"
  94230. #endif
  94231. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94232. "lsrs r6, r6, r7\n\t"
  94233. #else
  94234. "lsr r6, r6, r7\n\t"
  94235. #endif
  94236. #ifdef WOLFSSL_KEIL
  94237. "orrs r5, r5, r6\n\t"
  94238. #elif defined(__clang__)
  94239. "orrs r5, r6\n\t"
  94240. #else
  94241. "orr r5, r6\n\t"
  94242. #endif
  94243. "ldr r3, [%[a], #48]\n\t"
  94244. "str r5, [%[r], #56]\n\t"
  94245. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94246. "lsrs r6, r3, #1\n\t"
  94247. #else
  94248. "lsr r6, r3, #1\n\t"
  94249. #endif
  94250. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94251. "lsls r3, r3, %[n]\n\t"
  94252. #else
  94253. "lsl r3, r3, %[n]\n\t"
  94254. #endif
  94255. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94256. "lsrs r6, r6, r7\n\t"
  94257. #else
  94258. "lsr r6, r6, r7\n\t"
  94259. #endif
  94260. #ifdef WOLFSSL_KEIL
  94261. "orrs r4, r4, r6\n\t"
  94262. #elif defined(__clang__)
  94263. "orrs r4, r6\n\t"
  94264. #else
  94265. "orr r4, r6\n\t"
  94266. #endif
  94267. "ldr r5, [%[a], #44]\n\t"
  94268. "str r4, [%[r], #52]\n\t"
  94269. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94270. "lsrs r6, r5, #1\n\t"
  94271. #else
  94272. "lsr r6, r5, #1\n\t"
  94273. #endif
  94274. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94275. "lsls r5, r5, %[n]\n\t"
  94276. #else
  94277. "lsl r5, r5, %[n]\n\t"
  94278. #endif
  94279. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94280. "lsrs r6, r6, r7\n\t"
  94281. #else
  94282. "lsr r6, r6, r7\n\t"
  94283. #endif
  94284. #ifdef WOLFSSL_KEIL
  94285. "orrs r3, r3, r6\n\t"
  94286. #elif defined(__clang__)
  94287. "orrs r3, r6\n\t"
  94288. #else
  94289. "orr r3, r6\n\t"
  94290. #endif
  94291. "ldr r4, [%[a], #40]\n\t"
  94292. "str r3, [%[r], #48]\n\t"
  94293. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94294. "lsrs r6, r4, #1\n\t"
  94295. #else
  94296. "lsr r6, r4, #1\n\t"
  94297. #endif
  94298. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94299. "lsls r4, r4, %[n]\n\t"
  94300. #else
  94301. "lsl r4, r4, %[n]\n\t"
  94302. #endif
  94303. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94304. "lsrs r6, r6, r7\n\t"
  94305. #else
  94306. "lsr r6, r6, r7\n\t"
  94307. #endif
  94308. #ifdef WOLFSSL_KEIL
  94309. "orrs r5, r5, r6\n\t"
  94310. #elif defined(__clang__)
  94311. "orrs r5, r6\n\t"
  94312. #else
  94313. "orr r5, r6\n\t"
  94314. #endif
  94315. "ldr r3, [%[a], #36]\n\t"
  94316. "str r5, [%[r], #44]\n\t"
  94317. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94318. "lsrs r6, r3, #1\n\t"
  94319. #else
  94320. "lsr r6, r3, #1\n\t"
  94321. #endif
  94322. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94323. "lsls r3, r3, %[n]\n\t"
  94324. #else
  94325. "lsl r3, r3, %[n]\n\t"
  94326. #endif
  94327. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94328. "lsrs r6, r6, r7\n\t"
  94329. #else
  94330. "lsr r6, r6, r7\n\t"
  94331. #endif
  94332. #ifdef WOLFSSL_KEIL
  94333. "orrs r4, r4, r6\n\t"
  94334. #elif defined(__clang__)
  94335. "orrs r4, r6\n\t"
  94336. #else
  94337. "orr r4, r6\n\t"
  94338. #endif
  94339. "ldr r5, [%[a], #32]\n\t"
  94340. "str r4, [%[r], #40]\n\t"
  94341. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94342. "lsrs r6, r5, #1\n\t"
  94343. #else
  94344. "lsr r6, r5, #1\n\t"
  94345. #endif
  94346. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94347. "lsls r5, r5, %[n]\n\t"
  94348. #else
  94349. "lsl r5, r5, %[n]\n\t"
  94350. #endif
  94351. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94352. "lsrs r6, r6, r7\n\t"
  94353. #else
  94354. "lsr r6, r6, r7\n\t"
  94355. #endif
  94356. #ifdef WOLFSSL_KEIL
  94357. "orrs r3, r3, r6\n\t"
  94358. #elif defined(__clang__)
  94359. "orrs r3, r6\n\t"
  94360. #else
  94361. "orr r3, r6\n\t"
  94362. #endif
  94363. "ldr r4, [%[a], #28]\n\t"
  94364. "str r3, [%[r], #36]\n\t"
  94365. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94366. "lsrs r6, r4, #1\n\t"
  94367. #else
  94368. "lsr r6, r4, #1\n\t"
  94369. #endif
  94370. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94371. "lsls r4, r4, %[n]\n\t"
  94372. #else
  94373. "lsl r4, r4, %[n]\n\t"
  94374. #endif
  94375. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94376. "lsrs r6, r6, r7\n\t"
  94377. #else
  94378. "lsr r6, r6, r7\n\t"
  94379. #endif
  94380. #ifdef WOLFSSL_KEIL
  94381. "orrs r5, r5, r6\n\t"
  94382. #elif defined(__clang__)
  94383. "orrs r5, r6\n\t"
  94384. #else
  94385. "orr r5, r6\n\t"
  94386. #endif
  94387. "ldr r3, [%[a], #24]\n\t"
  94388. "str r5, [%[r], #32]\n\t"
  94389. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94390. "lsrs r6, r3, #1\n\t"
  94391. #else
  94392. "lsr r6, r3, #1\n\t"
  94393. #endif
  94394. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94395. "lsls r3, r3, %[n]\n\t"
  94396. #else
  94397. "lsl r3, r3, %[n]\n\t"
  94398. #endif
  94399. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94400. "lsrs r6, r6, r7\n\t"
  94401. #else
  94402. "lsr r6, r6, r7\n\t"
  94403. #endif
  94404. #ifdef WOLFSSL_KEIL
  94405. "orrs r4, r4, r6\n\t"
  94406. #elif defined(__clang__)
  94407. "orrs r4, r6\n\t"
  94408. #else
  94409. "orr r4, r6\n\t"
  94410. #endif
  94411. "ldr r5, [%[a], #20]\n\t"
  94412. "str r4, [%[r], #28]\n\t"
  94413. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94414. "lsrs r6, r5, #1\n\t"
  94415. #else
  94416. "lsr r6, r5, #1\n\t"
  94417. #endif
  94418. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94419. "lsls r5, r5, %[n]\n\t"
  94420. #else
  94421. "lsl r5, r5, %[n]\n\t"
  94422. #endif
  94423. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94424. "lsrs r6, r6, r7\n\t"
  94425. #else
  94426. "lsr r6, r6, r7\n\t"
  94427. #endif
  94428. #ifdef WOLFSSL_KEIL
  94429. "orrs r3, r3, r6\n\t"
  94430. #elif defined(__clang__)
  94431. "orrs r3, r6\n\t"
  94432. #else
  94433. "orr r3, r6\n\t"
  94434. #endif
  94435. "ldr r4, [%[a], #16]\n\t"
  94436. "str r3, [%[r], #24]\n\t"
  94437. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94438. "lsrs r6, r4, #1\n\t"
  94439. #else
  94440. "lsr r6, r4, #1\n\t"
  94441. #endif
  94442. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94443. "lsls r4, r4, %[n]\n\t"
  94444. #else
  94445. "lsl r4, r4, %[n]\n\t"
  94446. #endif
  94447. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94448. "lsrs r6, r6, r7\n\t"
  94449. #else
  94450. "lsr r6, r6, r7\n\t"
  94451. #endif
  94452. #ifdef WOLFSSL_KEIL
  94453. "orrs r5, r5, r6\n\t"
  94454. #elif defined(__clang__)
  94455. "orrs r5, r6\n\t"
  94456. #else
  94457. "orr r5, r6\n\t"
  94458. #endif
  94459. "ldr r3, [%[a], #12]\n\t"
  94460. "str r5, [%[r], #20]\n\t"
  94461. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94462. "lsrs r6, r3, #1\n\t"
  94463. #else
  94464. "lsr r6, r3, #1\n\t"
  94465. #endif
  94466. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94467. "lsls r3, r3, %[n]\n\t"
  94468. #else
  94469. "lsl r3, r3, %[n]\n\t"
  94470. #endif
  94471. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94472. "lsrs r6, r6, r7\n\t"
  94473. #else
  94474. "lsr r6, r6, r7\n\t"
  94475. #endif
  94476. #ifdef WOLFSSL_KEIL
  94477. "orrs r4, r4, r6\n\t"
  94478. #elif defined(__clang__)
  94479. "orrs r4, r6\n\t"
  94480. #else
  94481. "orr r4, r6\n\t"
  94482. #endif
  94483. "ldr r5, [%[a], #8]\n\t"
  94484. "str r4, [%[r], #16]\n\t"
  94485. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94486. "lsrs r6, r5, #1\n\t"
  94487. #else
  94488. "lsr r6, r5, #1\n\t"
  94489. #endif
  94490. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94491. "lsls r5, r5, %[n]\n\t"
  94492. #else
  94493. "lsl r5, r5, %[n]\n\t"
  94494. #endif
  94495. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94496. "lsrs r6, r6, r7\n\t"
  94497. #else
  94498. "lsr r6, r6, r7\n\t"
  94499. #endif
  94500. #ifdef WOLFSSL_KEIL
  94501. "orrs r3, r3, r6\n\t"
  94502. #elif defined(__clang__)
  94503. "orrs r3, r6\n\t"
  94504. #else
  94505. "orr r3, r6\n\t"
  94506. #endif
  94507. "ldr r4, [%[a], #4]\n\t"
  94508. "str r3, [%[r], #12]\n\t"
  94509. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94510. "lsrs r6, r4, #1\n\t"
  94511. #else
  94512. "lsr r6, r4, #1\n\t"
  94513. #endif
  94514. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94515. "lsls r4, r4, %[n]\n\t"
  94516. #else
  94517. "lsl r4, r4, %[n]\n\t"
  94518. #endif
  94519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94520. "lsrs r6, r6, r7\n\t"
  94521. #else
  94522. "lsr r6, r6, r7\n\t"
  94523. #endif
  94524. #ifdef WOLFSSL_KEIL
  94525. "orrs r5, r5, r6\n\t"
  94526. #elif defined(__clang__)
  94527. "orrs r5, r6\n\t"
  94528. #else
  94529. "orr r5, r6\n\t"
  94530. #endif
  94531. "ldr r3, [%[a]]\n\t"
  94532. "str r5, [%[r], #8]\n\t"
  94533. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94534. "lsrs r6, r3, #1\n\t"
  94535. #else
  94536. "lsr r6, r3, #1\n\t"
  94537. #endif
  94538. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94539. "lsls r3, r3, %[n]\n\t"
  94540. #else
  94541. "lsl r3, r3, %[n]\n\t"
  94542. #endif
  94543. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94544. "lsrs r6, r6, r7\n\t"
  94545. #else
  94546. "lsr r6, r6, r7\n\t"
  94547. #endif
  94548. #ifdef WOLFSSL_KEIL
  94549. "orrs r4, r4, r6\n\t"
  94550. #elif defined(__clang__)
  94551. "orrs r4, r6\n\t"
  94552. #else
  94553. "orr r4, r6\n\t"
  94554. #endif
  94555. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94556. "subs %[a], %[a], #0x40\n\t"
  94557. #else
  94558. "sub %[a], %[a], #0x40\n\t"
  94559. #endif
  94560. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94561. "subs %[r], %[r], #0x40\n\t"
  94562. #else
  94563. "sub %[r], %[r], #0x40\n\t"
  94564. #endif
  94565. "ldr r5, [%[a], #60]\n\t"
  94566. "str r4, [%[r], #68]\n\t"
  94567. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94568. "lsrs r6, r5, #1\n\t"
  94569. #else
  94570. "lsr r6, r5, #1\n\t"
  94571. #endif
  94572. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94573. "lsls r5, r5, %[n]\n\t"
  94574. #else
  94575. "lsl r5, r5, %[n]\n\t"
  94576. #endif
  94577. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94578. "lsrs r6, r6, r7\n\t"
  94579. #else
  94580. "lsr r6, r6, r7\n\t"
  94581. #endif
  94582. #ifdef WOLFSSL_KEIL
  94583. "orrs r3, r3, r6\n\t"
  94584. #elif defined(__clang__)
  94585. "orrs r3, r6\n\t"
  94586. #else
  94587. "orr r3, r6\n\t"
  94588. #endif
  94589. "ldr r4, [%[a], #56]\n\t"
  94590. "str r3, [%[r], #64]\n\t"
  94591. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94592. "lsrs r6, r4, #1\n\t"
  94593. #else
  94594. "lsr r6, r4, #1\n\t"
  94595. #endif
  94596. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94597. "lsls r4, r4, %[n]\n\t"
  94598. #else
  94599. "lsl r4, r4, %[n]\n\t"
  94600. #endif
  94601. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94602. "lsrs r6, r6, r7\n\t"
  94603. #else
  94604. "lsr r6, r6, r7\n\t"
  94605. #endif
  94606. #ifdef WOLFSSL_KEIL
  94607. "orrs r5, r5, r6\n\t"
  94608. #elif defined(__clang__)
  94609. "orrs r5, r6\n\t"
  94610. #else
  94611. "orr r5, r6\n\t"
  94612. #endif
  94613. "ldr r3, [%[a], #52]\n\t"
  94614. "str r5, [%[r], #60]\n\t"
  94615. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94616. "lsrs r6, r3, #1\n\t"
  94617. #else
  94618. "lsr r6, r3, #1\n\t"
  94619. #endif
  94620. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94621. "lsls r3, r3, %[n]\n\t"
  94622. #else
  94623. "lsl r3, r3, %[n]\n\t"
  94624. #endif
  94625. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94626. "lsrs r6, r6, r7\n\t"
  94627. #else
  94628. "lsr r6, r6, r7\n\t"
  94629. #endif
  94630. #ifdef WOLFSSL_KEIL
  94631. "orrs r4, r4, r6\n\t"
  94632. #elif defined(__clang__)
  94633. "orrs r4, r6\n\t"
  94634. #else
  94635. "orr r4, r6\n\t"
  94636. #endif
  94637. "ldr r5, [%[a], #48]\n\t"
  94638. "str r4, [%[r], #56]\n\t"
  94639. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94640. "lsrs r6, r5, #1\n\t"
  94641. #else
  94642. "lsr r6, r5, #1\n\t"
  94643. #endif
  94644. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94645. "lsls r5, r5, %[n]\n\t"
  94646. #else
  94647. "lsl r5, r5, %[n]\n\t"
  94648. #endif
  94649. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94650. "lsrs r6, r6, r7\n\t"
  94651. #else
  94652. "lsr r6, r6, r7\n\t"
  94653. #endif
  94654. #ifdef WOLFSSL_KEIL
  94655. "orrs r3, r3, r6\n\t"
  94656. #elif defined(__clang__)
  94657. "orrs r3, r6\n\t"
  94658. #else
  94659. "orr r3, r6\n\t"
  94660. #endif
  94661. "ldr r4, [%[a], #44]\n\t"
  94662. "str r3, [%[r], #52]\n\t"
  94663. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94664. "lsrs r6, r4, #1\n\t"
  94665. #else
  94666. "lsr r6, r4, #1\n\t"
  94667. #endif
  94668. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94669. "lsls r4, r4, %[n]\n\t"
  94670. #else
  94671. "lsl r4, r4, %[n]\n\t"
  94672. #endif
  94673. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94674. "lsrs r6, r6, r7\n\t"
  94675. #else
  94676. "lsr r6, r6, r7\n\t"
  94677. #endif
  94678. #ifdef WOLFSSL_KEIL
  94679. "orrs r5, r5, r6\n\t"
  94680. #elif defined(__clang__)
  94681. "orrs r5, r6\n\t"
  94682. #else
  94683. "orr r5, r6\n\t"
  94684. #endif
  94685. "ldr r3, [%[a], #40]\n\t"
  94686. "str r5, [%[r], #48]\n\t"
  94687. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94688. "lsrs r6, r3, #1\n\t"
  94689. #else
  94690. "lsr r6, r3, #1\n\t"
  94691. #endif
  94692. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94693. "lsls r3, r3, %[n]\n\t"
  94694. #else
  94695. "lsl r3, r3, %[n]\n\t"
  94696. #endif
  94697. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94698. "lsrs r6, r6, r7\n\t"
  94699. #else
  94700. "lsr r6, r6, r7\n\t"
  94701. #endif
  94702. #ifdef WOLFSSL_KEIL
  94703. "orrs r4, r4, r6\n\t"
  94704. #elif defined(__clang__)
  94705. "orrs r4, r6\n\t"
  94706. #else
  94707. "orr r4, r6\n\t"
  94708. #endif
  94709. "ldr r5, [%[a], #36]\n\t"
  94710. "str r4, [%[r], #44]\n\t"
  94711. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94712. "lsrs r6, r5, #1\n\t"
  94713. #else
  94714. "lsr r6, r5, #1\n\t"
  94715. #endif
  94716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94717. "lsls r5, r5, %[n]\n\t"
  94718. #else
  94719. "lsl r5, r5, %[n]\n\t"
  94720. #endif
  94721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94722. "lsrs r6, r6, r7\n\t"
  94723. #else
  94724. "lsr r6, r6, r7\n\t"
  94725. #endif
  94726. #ifdef WOLFSSL_KEIL
  94727. "orrs r3, r3, r6\n\t"
  94728. #elif defined(__clang__)
  94729. "orrs r3, r6\n\t"
  94730. #else
  94731. "orr r3, r6\n\t"
  94732. #endif
  94733. "ldr r4, [%[a], #32]\n\t"
  94734. "str r3, [%[r], #40]\n\t"
  94735. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94736. "lsrs r6, r4, #1\n\t"
  94737. #else
  94738. "lsr r6, r4, #1\n\t"
  94739. #endif
  94740. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94741. "lsls r4, r4, %[n]\n\t"
  94742. #else
  94743. "lsl r4, r4, %[n]\n\t"
  94744. #endif
  94745. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94746. "lsrs r6, r6, r7\n\t"
  94747. #else
  94748. "lsr r6, r6, r7\n\t"
  94749. #endif
  94750. #ifdef WOLFSSL_KEIL
  94751. "orrs r5, r5, r6\n\t"
  94752. #elif defined(__clang__)
  94753. "orrs r5, r6\n\t"
  94754. #else
  94755. "orr r5, r6\n\t"
  94756. #endif
  94757. "ldr r3, [%[a], #28]\n\t"
  94758. "str r5, [%[r], #36]\n\t"
  94759. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94760. "lsrs r6, r3, #1\n\t"
  94761. #else
  94762. "lsr r6, r3, #1\n\t"
  94763. #endif
  94764. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94765. "lsls r3, r3, %[n]\n\t"
  94766. #else
  94767. "lsl r3, r3, %[n]\n\t"
  94768. #endif
  94769. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94770. "lsrs r6, r6, r7\n\t"
  94771. #else
  94772. "lsr r6, r6, r7\n\t"
  94773. #endif
  94774. #ifdef WOLFSSL_KEIL
  94775. "orrs r4, r4, r6\n\t"
  94776. #elif defined(__clang__)
  94777. "orrs r4, r6\n\t"
  94778. #else
  94779. "orr r4, r6\n\t"
  94780. #endif
  94781. "ldr r5, [%[a], #24]\n\t"
  94782. "str r4, [%[r], #32]\n\t"
  94783. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94784. "lsrs r6, r5, #1\n\t"
  94785. #else
  94786. "lsr r6, r5, #1\n\t"
  94787. #endif
  94788. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94789. "lsls r5, r5, %[n]\n\t"
  94790. #else
  94791. "lsl r5, r5, %[n]\n\t"
  94792. #endif
  94793. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94794. "lsrs r6, r6, r7\n\t"
  94795. #else
  94796. "lsr r6, r6, r7\n\t"
  94797. #endif
  94798. #ifdef WOLFSSL_KEIL
  94799. "orrs r3, r3, r6\n\t"
  94800. #elif defined(__clang__)
  94801. "orrs r3, r6\n\t"
  94802. #else
  94803. "orr r3, r6\n\t"
  94804. #endif
  94805. "ldr r4, [%[a], #20]\n\t"
  94806. "str r3, [%[r], #28]\n\t"
  94807. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94808. "lsrs r6, r4, #1\n\t"
  94809. #else
  94810. "lsr r6, r4, #1\n\t"
  94811. #endif
  94812. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94813. "lsls r4, r4, %[n]\n\t"
  94814. #else
  94815. "lsl r4, r4, %[n]\n\t"
  94816. #endif
  94817. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94818. "lsrs r6, r6, r7\n\t"
  94819. #else
  94820. "lsr r6, r6, r7\n\t"
  94821. #endif
  94822. #ifdef WOLFSSL_KEIL
  94823. "orrs r5, r5, r6\n\t"
  94824. #elif defined(__clang__)
  94825. "orrs r5, r6\n\t"
  94826. #else
  94827. "orr r5, r6\n\t"
  94828. #endif
  94829. "ldr r3, [%[a], #16]\n\t"
  94830. "str r5, [%[r], #24]\n\t"
  94831. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94832. "lsrs r6, r3, #1\n\t"
  94833. #else
  94834. "lsr r6, r3, #1\n\t"
  94835. #endif
  94836. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94837. "lsls r3, r3, %[n]\n\t"
  94838. #else
  94839. "lsl r3, r3, %[n]\n\t"
  94840. #endif
  94841. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94842. "lsrs r6, r6, r7\n\t"
  94843. #else
  94844. "lsr r6, r6, r7\n\t"
  94845. #endif
  94846. #ifdef WOLFSSL_KEIL
  94847. "orrs r4, r4, r6\n\t"
  94848. #elif defined(__clang__)
  94849. "orrs r4, r6\n\t"
  94850. #else
  94851. "orr r4, r6\n\t"
  94852. #endif
  94853. "ldr r5, [%[a], #12]\n\t"
  94854. "str r4, [%[r], #20]\n\t"
  94855. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94856. "lsrs r6, r5, #1\n\t"
  94857. #else
  94858. "lsr r6, r5, #1\n\t"
  94859. #endif
  94860. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94861. "lsls r5, r5, %[n]\n\t"
  94862. #else
  94863. "lsl r5, r5, %[n]\n\t"
  94864. #endif
  94865. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94866. "lsrs r6, r6, r7\n\t"
  94867. #else
  94868. "lsr r6, r6, r7\n\t"
  94869. #endif
  94870. #ifdef WOLFSSL_KEIL
  94871. "orrs r3, r3, r6\n\t"
  94872. #elif defined(__clang__)
  94873. "orrs r3, r6\n\t"
  94874. #else
  94875. "orr r3, r6\n\t"
  94876. #endif
  94877. "ldr r4, [%[a], #8]\n\t"
  94878. "str r3, [%[r], #16]\n\t"
  94879. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94880. "lsrs r6, r4, #1\n\t"
  94881. #else
  94882. "lsr r6, r4, #1\n\t"
  94883. #endif
  94884. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94885. "lsls r4, r4, %[n]\n\t"
  94886. #else
  94887. "lsl r4, r4, %[n]\n\t"
  94888. #endif
  94889. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94890. "lsrs r6, r6, r7\n\t"
  94891. #else
  94892. "lsr r6, r6, r7\n\t"
  94893. #endif
  94894. #ifdef WOLFSSL_KEIL
  94895. "orrs r5, r5, r6\n\t"
  94896. #elif defined(__clang__)
  94897. "orrs r5, r6\n\t"
  94898. #else
  94899. "orr r5, r6\n\t"
  94900. #endif
  94901. "ldr r3, [%[a], #4]\n\t"
  94902. "str r5, [%[r], #12]\n\t"
  94903. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94904. "lsrs r6, r3, #1\n\t"
  94905. #else
  94906. "lsr r6, r3, #1\n\t"
  94907. #endif
  94908. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94909. "lsls r3, r3, %[n]\n\t"
  94910. #else
  94911. "lsl r3, r3, %[n]\n\t"
  94912. #endif
  94913. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94914. "lsrs r6, r6, r7\n\t"
  94915. #else
  94916. "lsr r6, r6, r7\n\t"
  94917. #endif
  94918. #ifdef WOLFSSL_KEIL
  94919. "orrs r4, r4, r6\n\t"
  94920. #elif defined(__clang__)
  94921. "orrs r4, r6\n\t"
  94922. #else
  94923. "orr r4, r6\n\t"
  94924. #endif
  94925. "ldr r5, [%[a]]\n\t"
  94926. "str r4, [%[r], #8]\n\t"
  94927. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94928. "lsrs r6, r5, #1\n\t"
  94929. #else
  94930. "lsr r6, r5, #1\n\t"
  94931. #endif
  94932. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94933. "lsls r5, r5, %[n]\n\t"
  94934. #else
  94935. "lsl r5, r5, %[n]\n\t"
  94936. #endif
  94937. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94938. "lsrs r6, r6, r7\n\t"
  94939. #else
  94940. "lsr r6, r6, r7\n\t"
  94941. #endif
  94942. #ifdef WOLFSSL_KEIL
  94943. "orrs r3, r3, r6\n\t"
  94944. #elif defined(__clang__)
  94945. "orrs r3, r6\n\t"
  94946. #else
  94947. "orr r3, r6\n\t"
  94948. #endif
  94949. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94950. "subs %[a], %[a], #0x40\n\t"
  94951. #else
  94952. "sub %[a], %[a], #0x40\n\t"
  94953. #endif
  94954. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94955. "subs %[r], %[r], #0x40\n\t"
  94956. #else
  94957. "sub %[r], %[r], #0x40\n\t"
  94958. #endif
  94959. "ldr r4, [%[a], #60]\n\t"
  94960. "str r3, [%[r], #68]\n\t"
  94961. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94962. "lsrs r6, r4, #1\n\t"
  94963. #else
  94964. "lsr r6, r4, #1\n\t"
  94965. #endif
  94966. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94967. "lsls r4, r4, %[n]\n\t"
  94968. #else
  94969. "lsl r4, r4, %[n]\n\t"
  94970. #endif
  94971. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94972. "lsrs r6, r6, r7\n\t"
  94973. #else
  94974. "lsr r6, r6, r7\n\t"
  94975. #endif
  94976. #ifdef WOLFSSL_KEIL
  94977. "orrs r5, r5, r6\n\t"
  94978. #elif defined(__clang__)
  94979. "orrs r5, r6\n\t"
  94980. #else
  94981. "orr r5, r6\n\t"
  94982. #endif
  94983. "ldr r3, [%[a], #56]\n\t"
  94984. "str r5, [%[r], #64]\n\t"
  94985. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94986. "lsrs r6, r3, #1\n\t"
  94987. #else
  94988. "lsr r6, r3, #1\n\t"
  94989. #endif
  94990. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94991. "lsls r3, r3, %[n]\n\t"
  94992. #else
  94993. "lsl r3, r3, %[n]\n\t"
  94994. #endif
  94995. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94996. "lsrs r6, r6, r7\n\t"
  94997. #else
  94998. "lsr r6, r6, r7\n\t"
  94999. #endif
  95000. #ifdef WOLFSSL_KEIL
  95001. "orrs r4, r4, r6\n\t"
  95002. #elif defined(__clang__)
  95003. "orrs r4, r6\n\t"
  95004. #else
  95005. "orr r4, r6\n\t"
  95006. #endif
  95007. "ldr r5, [%[a], #52]\n\t"
  95008. "str r4, [%[r], #60]\n\t"
  95009. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95010. "lsrs r6, r5, #1\n\t"
  95011. #else
  95012. "lsr r6, r5, #1\n\t"
  95013. #endif
  95014. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95015. "lsls r5, r5, %[n]\n\t"
  95016. #else
  95017. "lsl r5, r5, %[n]\n\t"
  95018. #endif
  95019. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95020. "lsrs r6, r6, r7\n\t"
  95021. #else
  95022. "lsr r6, r6, r7\n\t"
  95023. #endif
  95024. #ifdef WOLFSSL_KEIL
  95025. "orrs r3, r3, r6\n\t"
  95026. #elif defined(__clang__)
  95027. "orrs r3, r6\n\t"
  95028. #else
  95029. "orr r3, r6\n\t"
  95030. #endif
  95031. "ldr r4, [%[a], #48]\n\t"
  95032. "str r3, [%[r], #56]\n\t"
  95033. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95034. "lsrs r6, r4, #1\n\t"
  95035. #else
  95036. "lsr r6, r4, #1\n\t"
  95037. #endif
  95038. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95039. "lsls r4, r4, %[n]\n\t"
  95040. #else
  95041. "lsl r4, r4, %[n]\n\t"
  95042. #endif
  95043. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95044. "lsrs r6, r6, r7\n\t"
  95045. #else
  95046. "lsr r6, r6, r7\n\t"
  95047. #endif
  95048. #ifdef WOLFSSL_KEIL
  95049. "orrs r5, r5, r6\n\t"
  95050. #elif defined(__clang__)
  95051. "orrs r5, r6\n\t"
  95052. #else
  95053. "orr r5, r6\n\t"
  95054. #endif
  95055. "ldr r3, [%[a], #44]\n\t"
  95056. "str r5, [%[r], #52]\n\t"
  95057. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95058. "lsrs r6, r3, #1\n\t"
  95059. #else
  95060. "lsr r6, r3, #1\n\t"
  95061. #endif
  95062. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95063. "lsls r3, r3, %[n]\n\t"
  95064. #else
  95065. "lsl r3, r3, %[n]\n\t"
  95066. #endif
  95067. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95068. "lsrs r6, r6, r7\n\t"
  95069. #else
  95070. "lsr r6, r6, r7\n\t"
  95071. #endif
  95072. #ifdef WOLFSSL_KEIL
  95073. "orrs r4, r4, r6\n\t"
  95074. #elif defined(__clang__)
  95075. "orrs r4, r6\n\t"
  95076. #else
  95077. "orr r4, r6\n\t"
  95078. #endif
  95079. "ldr r5, [%[a], #40]\n\t"
  95080. "str r4, [%[r], #48]\n\t"
  95081. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95082. "lsrs r6, r5, #1\n\t"
  95083. #else
  95084. "lsr r6, r5, #1\n\t"
  95085. #endif
  95086. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95087. "lsls r5, r5, %[n]\n\t"
  95088. #else
  95089. "lsl r5, r5, %[n]\n\t"
  95090. #endif
  95091. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95092. "lsrs r6, r6, r7\n\t"
  95093. #else
  95094. "lsr r6, r6, r7\n\t"
  95095. #endif
  95096. #ifdef WOLFSSL_KEIL
  95097. "orrs r3, r3, r6\n\t"
  95098. #elif defined(__clang__)
  95099. "orrs r3, r6\n\t"
  95100. #else
  95101. "orr r3, r6\n\t"
  95102. #endif
  95103. "ldr r4, [%[a], #36]\n\t"
  95104. "str r3, [%[r], #44]\n\t"
  95105. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95106. "lsrs r6, r4, #1\n\t"
  95107. #else
  95108. "lsr r6, r4, #1\n\t"
  95109. #endif
  95110. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95111. "lsls r4, r4, %[n]\n\t"
  95112. #else
  95113. "lsl r4, r4, %[n]\n\t"
  95114. #endif
  95115. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95116. "lsrs r6, r6, r7\n\t"
  95117. #else
  95118. "lsr r6, r6, r7\n\t"
  95119. #endif
  95120. #ifdef WOLFSSL_KEIL
  95121. "orrs r5, r5, r6\n\t"
  95122. #elif defined(__clang__)
  95123. "orrs r5, r6\n\t"
  95124. #else
  95125. "orr r5, r6\n\t"
  95126. #endif
  95127. "ldr r3, [%[a], #32]\n\t"
  95128. "str r5, [%[r], #40]\n\t"
  95129. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95130. "lsrs r6, r3, #1\n\t"
  95131. #else
  95132. "lsr r6, r3, #1\n\t"
  95133. #endif
  95134. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95135. "lsls r3, r3, %[n]\n\t"
  95136. #else
  95137. "lsl r3, r3, %[n]\n\t"
  95138. #endif
  95139. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95140. "lsrs r6, r6, r7\n\t"
  95141. #else
  95142. "lsr r6, r6, r7\n\t"
  95143. #endif
  95144. #ifdef WOLFSSL_KEIL
  95145. "orrs r4, r4, r6\n\t"
  95146. #elif defined(__clang__)
  95147. "orrs r4, r6\n\t"
  95148. #else
  95149. "orr r4, r6\n\t"
  95150. #endif
  95151. "ldr r5, [%[a], #28]\n\t"
  95152. "str r4, [%[r], #36]\n\t"
  95153. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95154. "lsrs r6, r5, #1\n\t"
  95155. #else
  95156. "lsr r6, r5, #1\n\t"
  95157. #endif
  95158. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95159. "lsls r5, r5, %[n]\n\t"
  95160. #else
  95161. "lsl r5, r5, %[n]\n\t"
  95162. #endif
  95163. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95164. "lsrs r6, r6, r7\n\t"
  95165. #else
  95166. "lsr r6, r6, r7\n\t"
  95167. #endif
  95168. #ifdef WOLFSSL_KEIL
  95169. "orrs r3, r3, r6\n\t"
  95170. #elif defined(__clang__)
  95171. "orrs r3, r6\n\t"
  95172. #else
  95173. "orr r3, r6\n\t"
  95174. #endif
  95175. "ldr r4, [%[a], #24]\n\t"
  95176. "str r3, [%[r], #32]\n\t"
  95177. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95178. "lsrs r6, r4, #1\n\t"
  95179. #else
  95180. "lsr r6, r4, #1\n\t"
  95181. #endif
  95182. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95183. "lsls r4, r4, %[n]\n\t"
  95184. #else
  95185. "lsl r4, r4, %[n]\n\t"
  95186. #endif
  95187. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95188. "lsrs r6, r6, r7\n\t"
  95189. #else
  95190. "lsr r6, r6, r7\n\t"
  95191. #endif
  95192. #ifdef WOLFSSL_KEIL
  95193. "orrs r5, r5, r6\n\t"
  95194. #elif defined(__clang__)
  95195. "orrs r5, r6\n\t"
  95196. #else
  95197. "orr r5, r6\n\t"
  95198. #endif
  95199. "ldr r3, [%[a], #20]\n\t"
  95200. "str r5, [%[r], #28]\n\t"
  95201. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95202. "lsrs r6, r3, #1\n\t"
  95203. #else
  95204. "lsr r6, r3, #1\n\t"
  95205. #endif
  95206. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95207. "lsls r3, r3, %[n]\n\t"
  95208. #else
  95209. "lsl r3, r3, %[n]\n\t"
  95210. #endif
  95211. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95212. "lsrs r6, r6, r7\n\t"
  95213. #else
  95214. "lsr r6, r6, r7\n\t"
  95215. #endif
  95216. #ifdef WOLFSSL_KEIL
  95217. "orrs r4, r4, r6\n\t"
  95218. #elif defined(__clang__)
  95219. "orrs r4, r6\n\t"
  95220. #else
  95221. "orr r4, r6\n\t"
  95222. #endif
  95223. "ldr r5, [%[a], #16]\n\t"
  95224. "str r4, [%[r], #24]\n\t"
  95225. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95226. "lsrs r6, r5, #1\n\t"
  95227. #else
  95228. "lsr r6, r5, #1\n\t"
  95229. #endif
  95230. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95231. "lsls r5, r5, %[n]\n\t"
  95232. #else
  95233. "lsl r5, r5, %[n]\n\t"
  95234. #endif
  95235. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95236. "lsrs r6, r6, r7\n\t"
  95237. #else
  95238. "lsr r6, r6, r7\n\t"
  95239. #endif
  95240. #ifdef WOLFSSL_KEIL
  95241. "orrs r3, r3, r6\n\t"
  95242. #elif defined(__clang__)
  95243. "orrs r3, r6\n\t"
  95244. #else
  95245. "orr r3, r6\n\t"
  95246. #endif
  95247. "ldr r4, [%[a], #12]\n\t"
  95248. "str r3, [%[r], #20]\n\t"
  95249. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95250. "lsrs r6, r4, #1\n\t"
  95251. #else
  95252. "lsr r6, r4, #1\n\t"
  95253. #endif
  95254. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95255. "lsls r4, r4, %[n]\n\t"
  95256. #else
  95257. "lsl r4, r4, %[n]\n\t"
  95258. #endif
  95259. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95260. "lsrs r6, r6, r7\n\t"
  95261. #else
  95262. "lsr r6, r6, r7\n\t"
  95263. #endif
  95264. #ifdef WOLFSSL_KEIL
  95265. "orrs r5, r5, r6\n\t"
  95266. #elif defined(__clang__)
  95267. "orrs r5, r6\n\t"
  95268. #else
  95269. "orr r5, r6\n\t"
  95270. #endif
  95271. "ldr r3, [%[a], #8]\n\t"
  95272. "str r5, [%[r], #16]\n\t"
  95273. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95274. "lsrs r6, r3, #1\n\t"
  95275. #else
  95276. "lsr r6, r3, #1\n\t"
  95277. #endif
  95278. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95279. "lsls r3, r3, %[n]\n\t"
  95280. #else
  95281. "lsl r3, r3, %[n]\n\t"
  95282. #endif
  95283. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95284. "lsrs r6, r6, r7\n\t"
  95285. #else
  95286. "lsr r6, r6, r7\n\t"
  95287. #endif
  95288. #ifdef WOLFSSL_KEIL
  95289. "orrs r4, r4, r6\n\t"
  95290. #elif defined(__clang__)
  95291. "orrs r4, r6\n\t"
  95292. #else
  95293. "orr r4, r6\n\t"
  95294. #endif
  95295. "ldr r5, [%[a], #4]\n\t"
  95296. "str r4, [%[r], #12]\n\t"
  95297. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95298. "lsrs r6, r5, #1\n\t"
  95299. #else
  95300. "lsr r6, r5, #1\n\t"
  95301. #endif
  95302. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95303. "lsls r5, r5, %[n]\n\t"
  95304. #else
  95305. "lsl r5, r5, %[n]\n\t"
  95306. #endif
  95307. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95308. "lsrs r6, r6, r7\n\t"
  95309. #else
  95310. "lsr r6, r6, r7\n\t"
  95311. #endif
  95312. #ifdef WOLFSSL_KEIL
  95313. "orrs r3, r3, r6\n\t"
  95314. #elif defined(__clang__)
  95315. "orrs r3, r6\n\t"
  95316. #else
  95317. "orr r3, r6\n\t"
  95318. #endif
  95319. "ldr r4, [%[a]]\n\t"
  95320. "str r3, [%[r], #8]\n\t"
  95321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95322. "lsrs r6, r4, #1\n\t"
  95323. #else
  95324. "lsr r6, r4, #1\n\t"
  95325. #endif
  95326. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95327. "lsls r4, r4, %[n]\n\t"
  95328. #else
  95329. "lsl r4, r4, %[n]\n\t"
  95330. #endif
  95331. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95332. "lsrs r6, r6, r7\n\t"
  95333. #else
  95334. "lsr r6, r6, r7\n\t"
  95335. #endif
  95336. #ifdef WOLFSSL_KEIL
  95337. "orrs r5, r5, r6\n\t"
  95338. #elif defined(__clang__)
  95339. "orrs r5, r6\n\t"
  95340. #else
  95341. "orr r5, r6\n\t"
  95342. #endif
  95343. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95344. "subs %[a], %[a], #0x40\n\t"
  95345. #else
  95346. "sub %[a], %[a], #0x40\n\t"
  95347. #endif
  95348. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95349. "subs %[r], %[r], #0x40\n\t"
  95350. #else
  95351. "sub %[r], %[r], #0x40\n\t"
  95352. #endif
  95353. "ldr r3, [%[a], #60]\n\t"
  95354. "str r5, [%[r], #68]\n\t"
  95355. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95356. "lsrs r6, r3, #1\n\t"
  95357. #else
  95358. "lsr r6, r3, #1\n\t"
  95359. #endif
  95360. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95361. "lsls r3, r3, %[n]\n\t"
  95362. #else
  95363. "lsl r3, r3, %[n]\n\t"
  95364. #endif
  95365. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95366. "lsrs r6, r6, r7\n\t"
  95367. #else
  95368. "lsr r6, r6, r7\n\t"
  95369. #endif
  95370. #ifdef WOLFSSL_KEIL
  95371. "orrs r4, r4, r6\n\t"
  95372. #elif defined(__clang__)
  95373. "orrs r4, r6\n\t"
  95374. #else
  95375. "orr r4, r6\n\t"
  95376. #endif
  95377. "ldr r5, [%[a], #56]\n\t"
  95378. "str r4, [%[r], #64]\n\t"
  95379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95380. "lsrs r6, r5, #1\n\t"
  95381. #else
  95382. "lsr r6, r5, #1\n\t"
  95383. #endif
  95384. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95385. "lsls r5, r5, %[n]\n\t"
  95386. #else
  95387. "lsl r5, r5, %[n]\n\t"
  95388. #endif
  95389. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95390. "lsrs r6, r6, r7\n\t"
  95391. #else
  95392. "lsr r6, r6, r7\n\t"
  95393. #endif
  95394. #ifdef WOLFSSL_KEIL
  95395. "orrs r3, r3, r6\n\t"
  95396. #elif defined(__clang__)
  95397. "orrs r3, r6\n\t"
  95398. #else
  95399. "orr r3, r6\n\t"
  95400. #endif
  95401. "ldr r4, [%[a], #52]\n\t"
  95402. "str r3, [%[r], #60]\n\t"
  95403. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95404. "lsrs r6, r4, #1\n\t"
  95405. #else
  95406. "lsr r6, r4, #1\n\t"
  95407. #endif
  95408. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95409. "lsls r4, r4, %[n]\n\t"
  95410. #else
  95411. "lsl r4, r4, %[n]\n\t"
  95412. #endif
  95413. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95414. "lsrs r6, r6, r7\n\t"
  95415. #else
  95416. "lsr r6, r6, r7\n\t"
  95417. #endif
  95418. #ifdef WOLFSSL_KEIL
  95419. "orrs r5, r5, r6\n\t"
  95420. #elif defined(__clang__)
  95421. "orrs r5, r6\n\t"
  95422. #else
  95423. "orr r5, r6\n\t"
  95424. #endif
  95425. "ldr r3, [%[a], #48]\n\t"
  95426. "str r5, [%[r], #56]\n\t"
  95427. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95428. "lsrs r6, r3, #1\n\t"
  95429. #else
  95430. "lsr r6, r3, #1\n\t"
  95431. #endif
  95432. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95433. "lsls r3, r3, %[n]\n\t"
  95434. #else
  95435. "lsl r3, r3, %[n]\n\t"
  95436. #endif
  95437. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95438. "lsrs r6, r6, r7\n\t"
  95439. #else
  95440. "lsr r6, r6, r7\n\t"
  95441. #endif
  95442. #ifdef WOLFSSL_KEIL
  95443. "orrs r4, r4, r6\n\t"
  95444. #elif defined(__clang__)
  95445. "orrs r4, r6\n\t"
  95446. #else
  95447. "orr r4, r6\n\t"
  95448. #endif
  95449. "ldr r5, [%[a], #44]\n\t"
  95450. "str r4, [%[r], #52]\n\t"
  95451. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95452. "lsrs r6, r5, #1\n\t"
  95453. #else
  95454. "lsr r6, r5, #1\n\t"
  95455. #endif
  95456. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95457. "lsls r5, r5, %[n]\n\t"
  95458. #else
  95459. "lsl r5, r5, %[n]\n\t"
  95460. #endif
  95461. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95462. "lsrs r6, r6, r7\n\t"
  95463. #else
  95464. "lsr r6, r6, r7\n\t"
  95465. #endif
  95466. #ifdef WOLFSSL_KEIL
  95467. "orrs r3, r3, r6\n\t"
  95468. #elif defined(__clang__)
  95469. "orrs r3, r6\n\t"
  95470. #else
  95471. "orr r3, r6\n\t"
  95472. #endif
  95473. "ldr r4, [%[a], #40]\n\t"
  95474. "str r3, [%[r], #48]\n\t"
  95475. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95476. "lsrs r6, r4, #1\n\t"
  95477. #else
  95478. "lsr r6, r4, #1\n\t"
  95479. #endif
  95480. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95481. "lsls r4, r4, %[n]\n\t"
  95482. #else
  95483. "lsl r4, r4, %[n]\n\t"
  95484. #endif
  95485. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95486. "lsrs r6, r6, r7\n\t"
  95487. #else
  95488. "lsr r6, r6, r7\n\t"
  95489. #endif
  95490. #ifdef WOLFSSL_KEIL
  95491. "orrs r5, r5, r6\n\t"
  95492. #elif defined(__clang__)
  95493. "orrs r5, r6\n\t"
  95494. #else
  95495. "orr r5, r6\n\t"
  95496. #endif
  95497. "ldr r3, [%[a], #36]\n\t"
  95498. "str r5, [%[r], #44]\n\t"
  95499. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95500. "lsrs r6, r3, #1\n\t"
  95501. #else
  95502. "lsr r6, r3, #1\n\t"
  95503. #endif
  95504. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95505. "lsls r3, r3, %[n]\n\t"
  95506. #else
  95507. "lsl r3, r3, %[n]\n\t"
  95508. #endif
  95509. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95510. "lsrs r6, r6, r7\n\t"
  95511. #else
  95512. "lsr r6, r6, r7\n\t"
  95513. #endif
  95514. #ifdef WOLFSSL_KEIL
  95515. "orrs r4, r4, r6\n\t"
  95516. #elif defined(__clang__)
  95517. "orrs r4, r6\n\t"
  95518. #else
  95519. "orr r4, r6\n\t"
  95520. #endif
  95521. "ldr r5, [%[a], #32]\n\t"
  95522. "str r4, [%[r], #40]\n\t"
  95523. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95524. "lsrs r6, r5, #1\n\t"
  95525. #else
  95526. "lsr r6, r5, #1\n\t"
  95527. #endif
  95528. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95529. "lsls r5, r5, %[n]\n\t"
  95530. #else
  95531. "lsl r5, r5, %[n]\n\t"
  95532. #endif
  95533. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95534. "lsrs r6, r6, r7\n\t"
  95535. #else
  95536. "lsr r6, r6, r7\n\t"
  95537. #endif
  95538. #ifdef WOLFSSL_KEIL
  95539. "orrs r3, r3, r6\n\t"
  95540. #elif defined(__clang__)
  95541. "orrs r3, r6\n\t"
  95542. #else
  95543. "orr r3, r6\n\t"
  95544. #endif
  95545. "ldr r4, [%[a], #28]\n\t"
  95546. "str r3, [%[r], #36]\n\t"
  95547. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95548. "lsrs r6, r4, #1\n\t"
  95549. #else
  95550. "lsr r6, r4, #1\n\t"
  95551. #endif
  95552. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95553. "lsls r4, r4, %[n]\n\t"
  95554. #else
  95555. "lsl r4, r4, %[n]\n\t"
  95556. #endif
  95557. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95558. "lsrs r6, r6, r7\n\t"
  95559. #else
  95560. "lsr r6, r6, r7\n\t"
  95561. #endif
  95562. #ifdef WOLFSSL_KEIL
  95563. "orrs r5, r5, r6\n\t"
  95564. #elif defined(__clang__)
  95565. "orrs r5, r6\n\t"
  95566. #else
  95567. "orr r5, r6\n\t"
  95568. #endif
  95569. "ldr r3, [%[a], #24]\n\t"
  95570. "str r5, [%[r], #32]\n\t"
  95571. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95572. "lsrs r6, r3, #1\n\t"
  95573. #else
  95574. "lsr r6, r3, #1\n\t"
  95575. #endif
  95576. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95577. "lsls r3, r3, %[n]\n\t"
  95578. #else
  95579. "lsl r3, r3, %[n]\n\t"
  95580. #endif
  95581. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95582. "lsrs r6, r6, r7\n\t"
  95583. #else
  95584. "lsr r6, r6, r7\n\t"
  95585. #endif
  95586. #ifdef WOLFSSL_KEIL
  95587. "orrs r4, r4, r6\n\t"
  95588. #elif defined(__clang__)
  95589. "orrs r4, r6\n\t"
  95590. #else
  95591. "orr r4, r6\n\t"
  95592. #endif
  95593. "ldr r5, [%[a], #20]\n\t"
  95594. "str r4, [%[r], #28]\n\t"
  95595. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95596. "lsrs r6, r5, #1\n\t"
  95597. #else
  95598. "lsr r6, r5, #1\n\t"
  95599. #endif
  95600. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95601. "lsls r5, r5, %[n]\n\t"
  95602. #else
  95603. "lsl r5, r5, %[n]\n\t"
  95604. #endif
  95605. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95606. "lsrs r6, r6, r7\n\t"
  95607. #else
  95608. "lsr r6, r6, r7\n\t"
  95609. #endif
  95610. #ifdef WOLFSSL_KEIL
  95611. "orrs r3, r3, r6\n\t"
  95612. #elif defined(__clang__)
  95613. "orrs r3, r6\n\t"
  95614. #else
  95615. "orr r3, r6\n\t"
  95616. #endif
  95617. "ldr r4, [%[a], #16]\n\t"
  95618. "str r3, [%[r], #24]\n\t"
  95619. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95620. "lsrs r6, r4, #1\n\t"
  95621. #else
  95622. "lsr r6, r4, #1\n\t"
  95623. #endif
  95624. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95625. "lsls r4, r4, %[n]\n\t"
  95626. #else
  95627. "lsl r4, r4, %[n]\n\t"
  95628. #endif
  95629. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95630. "lsrs r6, r6, r7\n\t"
  95631. #else
  95632. "lsr r6, r6, r7\n\t"
  95633. #endif
  95634. #ifdef WOLFSSL_KEIL
  95635. "orrs r5, r5, r6\n\t"
  95636. #elif defined(__clang__)
  95637. "orrs r5, r6\n\t"
  95638. #else
  95639. "orr r5, r6\n\t"
  95640. #endif
  95641. "ldr r3, [%[a], #12]\n\t"
  95642. "str r5, [%[r], #20]\n\t"
  95643. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95644. "lsrs r6, r3, #1\n\t"
  95645. #else
  95646. "lsr r6, r3, #1\n\t"
  95647. #endif
  95648. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95649. "lsls r3, r3, %[n]\n\t"
  95650. #else
  95651. "lsl r3, r3, %[n]\n\t"
  95652. #endif
  95653. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95654. "lsrs r6, r6, r7\n\t"
  95655. #else
  95656. "lsr r6, r6, r7\n\t"
  95657. #endif
  95658. #ifdef WOLFSSL_KEIL
  95659. "orrs r4, r4, r6\n\t"
  95660. #elif defined(__clang__)
  95661. "orrs r4, r6\n\t"
  95662. #else
  95663. "orr r4, r6\n\t"
  95664. #endif
  95665. "ldr r5, [%[a], #8]\n\t"
  95666. "str r4, [%[r], #16]\n\t"
  95667. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95668. "lsrs r6, r5, #1\n\t"
  95669. #else
  95670. "lsr r6, r5, #1\n\t"
  95671. #endif
  95672. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95673. "lsls r5, r5, %[n]\n\t"
  95674. #else
  95675. "lsl r5, r5, %[n]\n\t"
  95676. #endif
  95677. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95678. "lsrs r6, r6, r7\n\t"
  95679. #else
  95680. "lsr r6, r6, r7\n\t"
  95681. #endif
  95682. #ifdef WOLFSSL_KEIL
  95683. "orrs r3, r3, r6\n\t"
  95684. #elif defined(__clang__)
  95685. "orrs r3, r6\n\t"
  95686. #else
  95687. "orr r3, r6\n\t"
  95688. #endif
  95689. "ldr r4, [%[a], #4]\n\t"
  95690. "str r3, [%[r], #12]\n\t"
  95691. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95692. "lsrs r6, r4, #1\n\t"
  95693. #else
  95694. "lsr r6, r4, #1\n\t"
  95695. #endif
  95696. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95697. "lsls r4, r4, %[n]\n\t"
  95698. #else
  95699. "lsl r4, r4, %[n]\n\t"
  95700. #endif
  95701. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95702. "lsrs r6, r6, r7\n\t"
  95703. #else
  95704. "lsr r6, r6, r7\n\t"
  95705. #endif
  95706. #ifdef WOLFSSL_KEIL
  95707. "orrs r5, r5, r6\n\t"
  95708. #elif defined(__clang__)
  95709. "orrs r5, r6\n\t"
  95710. #else
  95711. "orr r5, r6\n\t"
  95712. #endif
  95713. "ldr r3, [%[a]]\n\t"
  95714. "str r5, [%[r], #8]\n\t"
  95715. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95716. "lsrs r6, r3, #1\n\t"
  95717. #else
  95718. "lsr r6, r3, #1\n\t"
  95719. #endif
  95720. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95721. "lsls r3, r3, %[n]\n\t"
  95722. #else
  95723. "lsl r3, r3, %[n]\n\t"
  95724. #endif
  95725. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95726. "lsrs r6, r6, r7\n\t"
  95727. #else
  95728. "lsr r6, r6, r7\n\t"
  95729. #endif
  95730. #ifdef WOLFSSL_KEIL
  95731. "orrs r4, r4, r6\n\t"
  95732. #elif defined(__clang__)
  95733. "orrs r4, r6\n\t"
  95734. #else
  95735. "orr r4, r6\n\t"
  95736. #endif
  95737. "str r3, [%[r]]\n\t"
  95738. "str r4, [%[r], #4]\n\t"
  95739. : [r] "+l" (r), [a] "+l" (a), [n] "+l" (n)
  95740. :
  95741. : "memory", "r3", "r4", "r5", "r6", "r7"
  95742. );
  95743. }
  95744. /* Modular exponentiate 2 to the e mod m. (r = 2^e mod m)
  95745. *
  95746. * r A single precision number that is the result of the operation.
  95747. * e A single precision number that is the exponent.
  95748. * bits The number of bits in the exponent.
  95749. * m A single precision number that is the modulus.
  95750. * returns 0 on success.
  95751. * returns MEMORY_E on dynamic memory allocation failure.
  95752. * returns MP_VAL when base is even.
  95753. */
  95754. static int sp_4096_mod_exp_2_128(sp_digit* r, const sp_digit* e, int bits,
  95755. const sp_digit* m)
  95756. {
  95757. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  95758. sp_digit* td = NULL;
  95759. #else
  95760. sp_digit td[385];
  95761. #endif
  95762. sp_digit* norm = NULL;
  95763. sp_digit* tmp = NULL;
  95764. sp_digit mp = 1;
  95765. sp_digit n;
  95766. sp_digit o;
  95767. sp_digit mask;
  95768. int i;
  95769. int c;
  95770. byte y;
  95771. int err = MP_OKAY;
  95772. if (bits == 0) {
  95773. err = MP_VAL;
  95774. }
  95775. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  95776. if (err == MP_OKAY) {
  95777. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 385, NULL,
  95778. DYNAMIC_TYPE_TMP_BUFFER);
  95779. if (td == NULL)
  95780. err = MEMORY_E;
  95781. }
  95782. #endif
  95783. if (err == MP_OKAY) {
  95784. norm = td;
  95785. tmp = td + 256;
  95786. sp_4096_mont_setup(m, &mp);
  95787. sp_4096_mont_norm_128(norm, m);
  95788. i = (bits - 1) / 32;
  95789. n = e[i--];
  95790. c = bits & 31;
  95791. if (c == 0) {
  95792. c = 32;
  95793. }
  95794. c -= bits % 5;
  95795. if (c == 32) {
  95796. c = 27;
  95797. }
  95798. if (c < 0) {
  95799. /* Number of bits in top word is less than number needed. */
  95800. c = -c;
  95801. y = (byte)(n << c);
  95802. n = e[i--];
  95803. y |= (byte)(n >> (64 - c));
  95804. n <<= c;
  95805. c = 64 - c;
  95806. }
  95807. else if (c == 0) {
  95808. /* All bits in top word used. */
  95809. y = (byte)n;
  95810. }
  95811. else {
  95812. y = (byte)(n >> c);
  95813. n <<= 32 - c;
  95814. }
  95815. sp_4096_lshift_128(r, norm, y);
  95816. for (; i>=0 || c>=5; ) {
  95817. if (c == 0) {
  95818. n = e[i--];
  95819. y = (byte)(n >> 27);
  95820. n <<= 5;
  95821. c = 27;
  95822. }
  95823. else if (c < 5) {
  95824. y = (byte)(n >> 27);
  95825. n = e[i--];
  95826. c = 5 - c;
  95827. y |= (byte)(n >> (32 - c));
  95828. n <<= c;
  95829. c = 32 - c;
  95830. }
  95831. else {
  95832. y = (byte)((n >> 27) & 0x1f);
  95833. n <<= 5;
  95834. c -= 5;
  95835. }
  95836. sp_4096_mont_sqr_128(r, r, m, mp);
  95837. sp_4096_mont_sqr_128(r, r, m, mp);
  95838. sp_4096_mont_sqr_128(r, r, m, mp);
  95839. sp_4096_mont_sqr_128(r, r, m, mp);
  95840. sp_4096_mont_sqr_128(r, r, m, mp);
  95841. sp_4096_lshift_128(r, r, y);
  95842. sp_4096_mul_d_128(tmp, norm, r[128]);
  95843. r[128] = 0;
  95844. o = sp_4096_add_128(r, r, tmp);
  95845. sp_4096_cond_sub_128(r, r, m, (sp_digit)0 - o);
  95846. }
  95847. XMEMSET(&r[128], 0, sizeof(sp_digit) * 128U);
  95848. sp_4096_mont_reduce_128(r, m, mp);
  95849. mask = 0 - (sp_4096_cmp_128(r, m) >= 0);
  95850. sp_4096_cond_sub_128(r, r, m, mask);
  95851. }
  95852. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  95853. if (td != NULL)
  95854. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  95855. #endif
  95856. return err;
  95857. }
  95858. #endif /* HAVE_FFDHE_4096 */
  95859. /* Perform the modular exponentiation for Diffie-Hellman.
  95860. *
  95861. * base Base.
  95862. * exp Array of bytes that is the exponent.
  95863. * expLen Length of data, in bytes, in exponent.
  95864. * mod Modulus.
  95865. * out Buffer to hold big-endian bytes of exponentiation result.
  95866. * Must be at least 512 bytes long.
  95867. * outLen Length, in bytes, of exponentiation result.
  95868. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  95869. * and MEMORY_E if memory allocation fails.
  95870. */
  95871. int sp_DhExp_4096(const mp_int* base, const byte* exp, word32 expLen,
  95872. const mp_int* mod, byte* out, word32* outLen)
  95873. {
  95874. int err = MP_OKAY;
  95875. sp_digit b[256];
  95876. sp_digit e[128];
  95877. sp_digit m[128];
  95878. sp_digit* r = b;
  95879. word32 i;
  95880. if (mp_count_bits(base) > 4096) {
  95881. err = MP_READ_E;
  95882. }
  95883. else if (expLen > 512) {
  95884. err = MP_READ_E;
  95885. }
  95886. else if (mp_count_bits(mod) != 4096) {
  95887. err = MP_READ_E;
  95888. }
  95889. else if (mp_iseven(mod)) {
  95890. err = MP_VAL;
  95891. }
  95892. if (err == MP_OKAY) {
  95893. sp_4096_from_mp(b, 128, base);
  95894. sp_4096_from_bin(e, 128, exp, expLen);
  95895. sp_4096_from_mp(m, 128, mod);
  95896. #ifdef HAVE_FFDHE_4096
  95897. if (base->used == 1 && base->dp[0] == 2 && m[127] == (sp_digit)-1)
  95898. err = sp_4096_mod_exp_2_128(r, e, expLen * 8, m);
  95899. else
  95900. #endif
  95901. err = sp_4096_mod_exp_128(r, b, e, expLen * 8, m, 0);
  95902. }
  95903. if (err == MP_OKAY) {
  95904. sp_4096_to_bin_128(r, out);
  95905. *outLen = 512;
  95906. for (i=0; i<512 && out[i] == 0; i++) {
  95907. /* Search for first non-zero. */
  95908. }
  95909. *outLen -= i;
  95910. XMEMMOVE(out, out + i, *outLen);
  95911. }
  95912. XMEMSET(e, 0, sizeof(e));
  95913. return err;
  95914. }
  95915. #endif /* WOLFSSL_HAVE_SP_DH */
  95916. #endif /* WOLFSSL_HAVE_SP_DH | (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) */
  95917. #endif /* WOLFSSL_SP_4096 */
  95918. #endif /* WOLFSSL_HAVE_SP_RSA | WOLFSSL_HAVE_SP_DH */
  95919. #ifdef WOLFSSL_HAVE_SP_ECC
  95920. #ifndef WOLFSSL_SP_NO_256
  95921. /* Point structure to use. */
  95922. typedef struct sp_point_256 {
  95923. /* X ordinate of point. */
  95924. sp_digit x[2 * 8];
  95925. /* Y ordinate of point. */
  95926. sp_digit y[2 * 8];
  95927. /* Z ordinate of point. */
  95928. sp_digit z[2 * 8];
  95929. /* Indicates point is at infinity. */
  95930. int infinity;
  95931. } sp_point_256;
  95932. /* The modulus (prime) of the curve P256. */
  95933. static const sp_digit p256_mod[8] = {
  95934. 0xffffffff,0xffffffff,0xffffffff,0x00000000,0x00000000,0x00000000,
  95935. 0x00000001,0xffffffff
  95936. };
  95937. /* The Montgomery normalizer for modulus of the curve P256. */
  95938. static const sp_digit p256_norm_mod[8] = {
  95939. 0x00000001,0x00000000,0x00000000,0xffffffff,0xffffffff,0xffffffff,
  95940. 0xfffffffe,0x00000000
  95941. };
  95942. /* The Montgomery multiplier for modulus of the curve P256. */
  95943. static const sp_digit p256_mp_mod = 0x00000001;
  95944. #if defined(WOLFSSL_VALIDATE_ECC_KEYGEN) || defined(HAVE_ECC_SIGN) || \
  95945. defined(HAVE_ECC_VERIFY)
  95946. /* The order of the curve P256. */
  95947. static const sp_digit p256_order[8] = {
  95948. 0xfc632551,0xf3b9cac2,0xa7179e84,0xbce6faad,0xffffffff,0xffffffff,
  95949. 0x00000000,0xffffffff
  95950. };
  95951. #endif
  95952. /* The order of the curve P256 minus 2. */
  95953. static const sp_digit p256_order2[8] = {
  95954. 0xfc63254f,0xf3b9cac2,0xa7179e84,0xbce6faad,0xffffffff,0xffffffff,
  95955. 0x00000000,0xffffffff
  95956. };
  95957. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  95958. /* The Montgomery normalizer for order of the curve P256. */
  95959. static const sp_digit p256_norm_order[8] = {
  95960. 0x039cdaaf,0x0c46353d,0x58e8617b,0x43190552,0x00000000,0x00000000,
  95961. 0xffffffff,0x00000000
  95962. };
  95963. #endif
  95964. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  95965. /* The Montgomery multiplier for order of the curve P256. */
  95966. static const sp_digit p256_mp_order = 0xee00bc4f;
  95967. #endif
  95968. /* The base point of curve P256. */
  95969. static const sp_point_256 p256_base = {
  95970. /* X ordinate */
  95971. {
  95972. 0xd898c296,0xf4a13945,0x2deb33a0,0x77037d81,0x63a440f2,0xf8bce6e5,
  95973. 0xe12c4247,0x6b17d1f2,
  95974. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  95975. (sp_digit)0, (sp_digit)0, (sp_digit)0
  95976. },
  95977. /* Y ordinate */
  95978. {
  95979. 0x37bf51f5,0xcbb64068,0x6b315ece,0x2bce3357,0x7c0f9e16,0x8ee7eb4a,
  95980. 0xfe1a7f9b,0x4fe342e2,
  95981. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  95982. (sp_digit)0, (sp_digit)0, (sp_digit)0
  95983. },
  95984. /* Z ordinate */
  95985. {
  95986. 0x00000001,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  95987. 0x00000000,0x00000000,
  95988. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  95989. (sp_digit)0, (sp_digit)0, (sp_digit)0
  95990. },
  95991. /* infinity */
  95992. 0
  95993. };
  95994. #if defined(HAVE_ECC_CHECK_KEY) || defined(HAVE_COMP_KEY)
  95995. static const sp_digit p256_b[8] = {
  95996. 0x27d2604b,0x3bce3c3e,0xcc53b0f6,0x651d06b0,0x769886bc,0xb3ebbd55,
  95997. 0xaa3a93e7,0x5ac635d8
  95998. };
  95999. #endif
  96000. /* Multiply a and b into r. (r = a * b)
  96001. *
  96002. * r A single precision integer.
  96003. * a A single precision integer.
  96004. * b A single precision integer.
  96005. */
  96006. SP_NOINLINE static void sp_256_mul_8(sp_digit* r, const sp_digit* a,
  96007. const sp_digit* b)
  96008. {
  96009. sp_digit t[8 * 2];
  96010. sp_digit* tmp = t;
  96011. __asm__ __volatile__ (
  96012. "movs r3, #0\n\t"
  96013. "movs r4, #0\n\t"
  96014. "mov r8, r3\n\t"
  96015. "mov r11, %[tmp]\n\t"
  96016. "mov r9, %[a]\n\t"
  96017. "mov r10, %[b]\n\t"
  96018. "movs r6, #32\n\t"
  96019. "add r6, r6, r9\n\t"
  96020. "mov r12, r6\n\t"
  96021. "\n"
  96022. "L_sp_256_mul_8_words_%=:\n\t"
  96023. "movs %[tmp], #0\n\t"
  96024. "movs r5, #0\n\t"
  96025. "movs r6, #28\n\t"
  96026. "mov %[a], r8\n\t"
  96027. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96028. "subs %[a], %[a], r6\n\t"
  96029. #else
  96030. "sub %[a], %[a], r6\n\t"
  96031. #endif
  96032. #ifdef WOLFSSL_KEIL
  96033. "sbcs r6, r6, r6\n\t"
  96034. #elif defined(__clang__)
  96035. "sbcs r6, r6\n\t"
  96036. #else
  96037. "sbc r6, r6\n\t"
  96038. #endif
  96039. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96040. "mvns r6, r6\n\t"
  96041. #else
  96042. "mvn r6, r6\n\t"
  96043. #endif
  96044. #ifdef WOLFSSL_KEIL
  96045. "ands %[a], %[a], r6\n\t"
  96046. #elif defined(__clang__)
  96047. "ands %[a], r6\n\t"
  96048. #else
  96049. "and %[a], r6\n\t"
  96050. #endif
  96051. "mov %[b], r8\n\t"
  96052. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96053. "subs %[b], %[b], %[a]\n\t"
  96054. #else
  96055. "sub %[b], %[b], %[a]\n\t"
  96056. #endif
  96057. "add %[a], %[a], r9\n\t"
  96058. "add %[b], %[b], r10\n\t"
  96059. "\n"
  96060. "L_sp_256_mul_8_mul_%=:\n\t"
  96061. "# Multiply Start\n\t"
  96062. "ldrh r6, [%[a]]\n\t"
  96063. "ldrh r7, [%[b]]\n\t"
  96064. #ifdef WOLFSSL_KEIL
  96065. "muls r7, r6, r7\n\t"
  96066. #elif defined(__clang__)
  96067. "muls r7, r6\n\t"
  96068. #else
  96069. "mul r7, r6\n\t"
  96070. #endif
  96071. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96072. "adds r3, r3, r7\n\t"
  96073. #else
  96074. "add r3, r3, r7\n\t"
  96075. #endif
  96076. #ifdef WOLFSSL_KEIL
  96077. "adcs r4, r4, %[tmp]\n\t"
  96078. #elif defined(__clang__)
  96079. "adcs r4, %[tmp]\n\t"
  96080. #else
  96081. "adc r4, %[tmp]\n\t"
  96082. #endif
  96083. #ifdef WOLFSSL_KEIL
  96084. "adcs r5, r5, %[tmp]\n\t"
  96085. #elif defined(__clang__)
  96086. "adcs r5, %[tmp]\n\t"
  96087. #else
  96088. "adc r5, %[tmp]\n\t"
  96089. #endif
  96090. "ldr r7, [%[b]]\n\t"
  96091. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96092. "lsrs r7, r7, #16\n\t"
  96093. #else
  96094. "lsr r7, r7, #16\n\t"
  96095. #endif
  96096. #ifdef WOLFSSL_KEIL
  96097. "muls r6, r7, r6\n\t"
  96098. #elif defined(__clang__)
  96099. "muls r6, r7\n\t"
  96100. #else
  96101. "mul r6, r7\n\t"
  96102. #endif
  96103. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96104. "lsrs r7, r6, #16\n\t"
  96105. #else
  96106. "lsr r7, r6, #16\n\t"
  96107. #endif
  96108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96109. "lsls r6, r6, #16\n\t"
  96110. #else
  96111. "lsl r6, r6, #16\n\t"
  96112. #endif
  96113. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96114. "adds r3, r3, r6\n\t"
  96115. #else
  96116. "add r3, r3, r6\n\t"
  96117. #endif
  96118. #ifdef WOLFSSL_KEIL
  96119. "adcs r4, r4, r7\n\t"
  96120. #elif defined(__clang__)
  96121. "adcs r4, r7\n\t"
  96122. #else
  96123. "adc r4, r7\n\t"
  96124. #endif
  96125. #ifdef WOLFSSL_KEIL
  96126. "adcs r5, r5, %[tmp]\n\t"
  96127. #elif defined(__clang__)
  96128. "adcs r5, %[tmp]\n\t"
  96129. #else
  96130. "adc r5, %[tmp]\n\t"
  96131. #endif
  96132. "ldr r6, [%[a]]\n\t"
  96133. "ldr r7, [%[b]]\n\t"
  96134. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96135. "lsrs r6, r6, #16\n\t"
  96136. #else
  96137. "lsr r6, r6, #16\n\t"
  96138. #endif
  96139. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96140. "lsrs r7, r7, #16\n\t"
  96141. #else
  96142. "lsr r7, r7, #16\n\t"
  96143. #endif
  96144. #ifdef WOLFSSL_KEIL
  96145. "muls r7, r6, r7\n\t"
  96146. #elif defined(__clang__)
  96147. "muls r7, r6\n\t"
  96148. #else
  96149. "mul r7, r6\n\t"
  96150. #endif
  96151. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96152. "adds r4, r4, r7\n\t"
  96153. #else
  96154. "add r4, r4, r7\n\t"
  96155. #endif
  96156. #ifdef WOLFSSL_KEIL
  96157. "adcs r5, r5, %[tmp]\n\t"
  96158. #elif defined(__clang__)
  96159. "adcs r5, %[tmp]\n\t"
  96160. #else
  96161. "adc r5, %[tmp]\n\t"
  96162. #endif
  96163. "ldrh r7, [%[b]]\n\t"
  96164. #ifdef WOLFSSL_KEIL
  96165. "muls r6, r7, r6\n\t"
  96166. #elif defined(__clang__)
  96167. "muls r6, r7\n\t"
  96168. #else
  96169. "mul r6, r7\n\t"
  96170. #endif
  96171. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96172. "lsrs r7, r6, #16\n\t"
  96173. #else
  96174. "lsr r7, r6, #16\n\t"
  96175. #endif
  96176. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96177. "lsls r6, r6, #16\n\t"
  96178. #else
  96179. "lsl r6, r6, #16\n\t"
  96180. #endif
  96181. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96182. "adds r3, r3, r6\n\t"
  96183. #else
  96184. "add r3, r3, r6\n\t"
  96185. #endif
  96186. #ifdef WOLFSSL_KEIL
  96187. "adcs r4, r4, r7\n\t"
  96188. #elif defined(__clang__)
  96189. "adcs r4, r7\n\t"
  96190. #else
  96191. "adc r4, r7\n\t"
  96192. #endif
  96193. #ifdef WOLFSSL_KEIL
  96194. "adcs r5, r5, %[tmp]\n\t"
  96195. #elif defined(__clang__)
  96196. "adcs r5, %[tmp]\n\t"
  96197. #else
  96198. "adc r5, %[tmp]\n\t"
  96199. #endif
  96200. "# Multiply Done\n\t"
  96201. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96202. "adds %[a], %[a], #4\n\t"
  96203. #else
  96204. "add %[a], %[a], #4\n\t"
  96205. #endif
  96206. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96207. "subs %[b], %[b], #4\n\t"
  96208. #else
  96209. "sub %[b], %[b], #4\n\t"
  96210. #endif
  96211. "cmp %[a], r12\n\t"
  96212. "beq L_sp_256_mul_8_done_mul_%=\n\t"
  96213. "mov r6, r8\n\t"
  96214. "add r6, r6, r9\n\t"
  96215. "cmp %[a], r6\n\t"
  96216. "ble L_sp_256_mul_8_mul_%=\n\t"
  96217. "\n"
  96218. "L_sp_256_mul_8_done_mul_%=:\n\t"
  96219. "mov %[tmp], r11\n\t"
  96220. "mov r7, r8\n\t"
  96221. "str r3, [%[tmp], r7]\n\t"
  96222. "movs r3, r4\n\t"
  96223. "movs r4, r5\n\t"
  96224. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96225. "adds r7, r7, #4\n\t"
  96226. #else
  96227. "add r7, r7, #4\n\t"
  96228. #endif
  96229. "mov r8, r7\n\t"
  96230. "movs r6, #56\n\t"
  96231. "cmp r7, r6\n\t"
  96232. "ble L_sp_256_mul_8_words_%=\n\t"
  96233. "str r3, [%[tmp], r7]\n\t"
  96234. "mov %[a], r9\n\t"
  96235. "mov %[b], r10\n\t"
  96236. : [a] "+l" (a), [b] "+l" (b), [tmp] "+l" (tmp)
  96237. :
  96238. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  96239. );
  96240. XMEMCPY(r, t, sizeof(t));
  96241. }
  96242. /* Square a and put result in r. (r = a * a)
  96243. *
  96244. * r A single precision integer.
  96245. * a A single precision integer.
  96246. */
  96247. SP_NOINLINE static void sp_256_sqr_8(sp_digit* r, const sp_digit* a)
  96248. {
  96249. __asm__ __volatile__ (
  96250. "movs r3, #0\n\t"
  96251. "movs r4, #0\n\t"
  96252. "movs r5, #0\n\t"
  96253. "mov r8, r3\n\t"
  96254. "mov r11, %[r]\n\t"
  96255. "movs r6, #0x40\n\t"
  96256. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96257. "negs r6, r6\n\t"
  96258. #else
  96259. "neg r6, r6\n\t"
  96260. #endif
  96261. "add sp, sp, r6\n\t"
  96262. "mov r10, sp\n\t"
  96263. "mov r9, %[a]\n\t"
  96264. "\n"
  96265. "L_sp_256_sqr_8_words_%=:\n\t"
  96266. "movs %[r], #0\n\t"
  96267. "movs r6, #28\n\t"
  96268. "mov %[a], r8\n\t"
  96269. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96270. "subs %[a], %[a], r6\n\t"
  96271. #else
  96272. "sub %[a], %[a], r6\n\t"
  96273. #endif
  96274. #ifdef WOLFSSL_KEIL
  96275. "sbcs r6, r6, r6\n\t"
  96276. #elif defined(__clang__)
  96277. "sbcs r6, r6\n\t"
  96278. #else
  96279. "sbc r6, r6\n\t"
  96280. #endif
  96281. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96282. "mvns r6, r6\n\t"
  96283. #else
  96284. "mvn r6, r6\n\t"
  96285. #endif
  96286. #ifdef WOLFSSL_KEIL
  96287. "ands %[a], %[a], r6\n\t"
  96288. #elif defined(__clang__)
  96289. "ands %[a], r6\n\t"
  96290. #else
  96291. "and %[a], r6\n\t"
  96292. #endif
  96293. "mov r2, r8\n\t"
  96294. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96295. "subs r2, r2, %[a]\n\t"
  96296. #else
  96297. "sub r2, r2, %[a]\n\t"
  96298. #endif
  96299. "add %[a], %[a], r9\n\t"
  96300. "add r2, r2, r9\n\t"
  96301. "\n"
  96302. "L_sp_256_sqr_8_mul_%=:\n\t"
  96303. "cmp r2, %[a]\n\t"
  96304. "beq L_sp_256_sqr_8_sqr_%=\n\t"
  96305. "# Multiply * 2: Start\n\t"
  96306. "ldrh r6, [%[a]]\n\t"
  96307. "ldrh r7, [r2]\n\t"
  96308. #ifdef WOLFSSL_KEIL
  96309. "muls r7, r6, r7\n\t"
  96310. #elif defined(__clang__)
  96311. "muls r7, r6\n\t"
  96312. #else
  96313. "mul r7, r6\n\t"
  96314. #endif
  96315. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96316. "adds r3, r3, r7\n\t"
  96317. #else
  96318. "add r3, r3, r7\n\t"
  96319. #endif
  96320. #ifdef WOLFSSL_KEIL
  96321. "adcs r4, r4, %[r]\n\t"
  96322. #elif defined(__clang__)
  96323. "adcs r4, %[r]\n\t"
  96324. #else
  96325. "adc r4, %[r]\n\t"
  96326. #endif
  96327. #ifdef WOLFSSL_KEIL
  96328. "adcs r5, r5, %[r]\n\t"
  96329. #elif defined(__clang__)
  96330. "adcs r5, %[r]\n\t"
  96331. #else
  96332. "adc r5, %[r]\n\t"
  96333. #endif
  96334. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96335. "adds r3, r3, r7\n\t"
  96336. #else
  96337. "add r3, r3, r7\n\t"
  96338. #endif
  96339. #ifdef WOLFSSL_KEIL
  96340. "adcs r4, r4, %[r]\n\t"
  96341. #elif defined(__clang__)
  96342. "adcs r4, %[r]\n\t"
  96343. #else
  96344. "adc r4, %[r]\n\t"
  96345. #endif
  96346. #ifdef WOLFSSL_KEIL
  96347. "adcs r5, r5, %[r]\n\t"
  96348. #elif defined(__clang__)
  96349. "adcs r5, %[r]\n\t"
  96350. #else
  96351. "adc r5, %[r]\n\t"
  96352. #endif
  96353. "ldr r7, [r2]\n\t"
  96354. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96355. "lsrs r7, r7, #16\n\t"
  96356. #else
  96357. "lsr r7, r7, #16\n\t"
  96358. #endif
  96359. #ifdef WOLFSSL_KEIL
  96360. "muls r6, r7, r6\n\t"
  96361. #elif defined(__clang__)
  96362. "muls r6, r7\n\t"
  96363. #else
  96364. "mul r6, r7\n\t"
  96365. #endif
  96366. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96367. "lsrs r7, r6, #16\n\t"
  96368. #else
  96369. "lsr r7, r6, #16\n\t"
  96370. #endif
  96371. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96372. "lsls r6, r6, #16\n\t"
  96373. #else
  96374. "lsl r6, r6, #16\n\t"
  96375. #endif
  96376. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96377. "adds r3, r3, r6\n\t"
  96378. #else
  96379. "add r3, r3, r6\n\t"
  96380. #endif
  96381. #ifdef WOLFSSL_KEIL
  96382. "adcs r4, r4, r7\n\t"
  96383. #elif defined(__clang__)
  96384. "adcs r4, r7\n\t"
  96385. #else
  96386. "adc r4, r7\n\t"
  96387. #endif
  96388. #ifdef WOLFSSL_KEIL
  96389. "adcs r5, r5, %[r]\n\t"
  96390. #elif defined(__clang__)
  96391. "adcs r5, %[r]\n\t"
  96392. #else
  96393. "adc r5, %[r]\n\t"
  96394. #endif
  96395. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96396. "adds r3, r3, r6\n\t"
  96397. #else
  96398. "add r3, r3, r6\n\t"
  96399. #endif
  96400. #ifdef WOLFSSL_KEIL
  96401. "adcs r4, r4, r7\n\t"
  96402. #elif defined(__clang__)
  96403. "adcs r4, r7\n\t"
  96404. #else
  96405. "adc r4, r7\n\t"
  96406. #endif
  96407. #ifdef WOLFSSL_KEIL
  96408. "adcs r5, r5, %[r]\n\t"
  96409. #elif defined(__clang__)
  96410. "adcs r5, %[r]\n\t"
  96411. #else
  96412. "adc r5, %[r]\n\t"
  96413. #endif
  96414. "ldr r6, [%[a]]\n\t"
  96415. "ldr r7, [r2]\n\t"
  96416. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96417. "lsrs r6, r6, #16\n\t"
  96418. #else
  96419. "lsr r6, r6, #16\n\t"
  96420. #endif
  96421. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96422. "lsrs r7, r7, #16\n\t"
  96423. #else
  96424. "lsr r7, r7, #16\n\t"
  96425. #endif
  96426. #ifdef WOLFSSL_KEIL
  96427. "muls r7, r6, r7\n\t"
  96428. #elif defined(__clang__)
  96429. "muls r7, r6\n\t"
  96430. #else
  96431. "mul r7, r6\n\t"
  96432. #endif
  96433. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96434. "adds r4, r4, r7\n\t"
  96435. #else
  96436. "add r4, r4, r7\n\t"
  96437. #endif
  96438. #ifdef WOLFSSL_KEIL
  96439. "adcs r5, r5, %[r]\n\t"
  96440. #elif defined(__clang__)
  96441. "adcs r5, %[r]\n\t"
  96442. #else
  96443. "adc r5, %[r]\n\t"
  96444. #endif
  96445. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96446. "adds r4, r4, r7\n\t"
  96447. #else
  96448. "add r4, r4, r7\n\t"
  96449. #endif
  96450. #ifdef WOLFSSL_KEIL
  96451. "adcs r5, r5, %[r]\n\t"
  96452. #elif defined(__clang__)
  96453. "adcs r5, %[r]\n\t"
  96454. #else
  96455. "adc r5, %[r]\n\t"
  96456. #endif
  96457. "ldrh r7, [r2]\n\t"
  96458. #ifdef WOLFSSL_KEIL
  96459. "muls r6, r7, r6\n\t"
  96460. #elif defined(__clang__)
  96461. "muls r6, r7\n\t"
  96462. #else
  96463. "mul r6, r7\n\t"
  96464. #endif
  96465. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96466. "lsrs r7, r6, #16\n\t"
  96467. #else
  96468. "lsr r7, r6, #16\n\t"
  96469. #endif
  96470. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96471. "lsls r6, r6, #16\n\t"
  96472. #else
  96473. "lsl r6, r6, #16\n\t"
  96474. #endif
  96475. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96476. "adds r3, r3, r6\n\t"
  96477. #else
  96478. "add r3, r3, r6\n\t"
  96479. #endif
  96480. #ifdef WOLFSSL_KEIL
  96481. "adcs r4, r4, r7\n\t"
  96482. #elif defined(__clang__)
  96483. "adcs r4, r7\n\t"
  96484. #else
  96485. "adc r4, r7\n\t"
  96486. #endif
  96487. #ifdef WOLFSSL_KEIL
  96488. "adcs r5, r5, %[r]\n\t"
  96489. #elif defined(__clang__)
  96490. "adcs r5, %[r]\n\t"
  96491. #else
  96492. "adc r5, %[r]\n\t"
  96493. #endif
  96494. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96495. "adds r3, r3, r6\n\t"
  96496. #else
  96497. "add r3, r3, r6\n\t"
  96498. #endif
  96499. #ifdef WOLFSSL_KEIL
  96500. "adcs r4, r4, r7\n\t"
  96501. #elif defined(__clang__)
  96502. "adcs r4, r7\n\t"
  96503. #else
  96504. "adc r4, r7\n\t"
  96505. #endif
  96506. #ifdef WOLFSSL_KEIL
  96507. "adcs r5, r5, %[r]\n\t"
  96508. #elif defined(__clang__)
  96509. "adcs r5, %[r]\n\t"
  96510. #else
  96511. "adc r5, %[r]\n\t"
  96512. #endif
  96513. "# Multiply * 2: Done\n\t"
  96514. "bal L_sp_256_sqr_8_done_sqr_%=\n\t"
  96515. "\n"
  96516. "L_sp_256_sqr_8_sqr_%=:\n\t"
  96517. "mov r12, r2\n\t"
  96518. "ldr r2, [%[a]]\n\t"
  96519. "# Square: Start\n\t"
  96520. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96521. "lsrs r7, r2, #16\n\t"
  96522. #else
  96523. "lsr r7, r2, #16\n\t"
  96524. #endif
  96525. "uxth r6, r2\n\t"
  96526. #ifdef WOLFSSL_KEIL
  96527. "muls r6, r6, r6\n\t"
  96528. #elif defined(__clang__)
  96529. "muls r6, r6\n\t"
  96530. #else
  96531. "mul r6, r6\n\t"
  96532. #endif
  96533. #ifdef WOLFSSL_KEIL
  96534. "muls r7, r7, r7\n\t"
  96535. #elif defined(__clang__)
  96536. "muls r7, r7\n\t"
  96537. #else
  96538. "mul r7, r7\n\t"
  96539. #endif
  96540. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96541. "adds r3, r3, r6\n\t"
  96542. #else
  96543. "add r3, r3, r6\n\t"
  96544. #endif
  96545. #ifdef WOLFSSL_KEIL
  96546. "adcs r4, r4, r7\n\t"
  96547. #elif defined(__clang__)
  96548. "adcs r4, r7\n\t"
  96549. #else
  96550. "adc r4, r7\n\t"
  96551. #endif
  96552. #ifdef WOLFSSL_KEIL
  96553. "adcs r5, r5, %[r]\n\t"
  96554. #elif defined(__clang__)
  96555. "adcs r5, %[r]\n\t"
  96556. #else
  96557. "adc r5, %[r]\n\t"
  96558. #endif
  96559. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96560. "lsrs r7, r2, #16\n\t"
  96561. #else
  96562. "lsr r7, r2, #16\n\t"
  96563. #endif
  96564. "uxth r6, r2\n\t"
  96565. #ifdef WOLFSSL_KEIL
  96566. "muls r6, r7, r6\n\t"
  96567. #elif defined(__clang__)
  96568. "muls r6, r7\n\t"
  96569. #else
  96570. "mul r6, r7\n\t"
  96571. #endif
  96572. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96573. "lsrs r7, r6, #15\n\t"
  96574. #else
  96575. "lsr r7, r6, #15\n\t"
  96576. #endif
  96577. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96578. "lsls r6, r6, #17\n\t"
  96579. #else
  96580. "lsl r6, r6, #17\n\t"
  96581. #endif
  96582. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96583. "adds r3, r3, r6\n\t"
  96584. #else
  96585. "add r3, r3, r6\n\t"
  96586. #endif
  96587. #ifdef WOLFSSL_KEIL
  96588. "adcs r4, r4, r7\n\t"
  96589. #elif defined(__clang__)
  96590. "adcs r4, r7\n\t"
  96591. #else
  96592. "adc r4, r7\n\t"
  96593. #endif
  96594. #ifdef WOLFSSL_KEIL
  96595. "adcs r5, r5, %[r]\n\t"
  96596. #elif defined(__clang__)
  96597. "adcs r5, %[r]\n\t"
  96598. #else
  96599. "adc r5, %[r]\n\t"
  96600. #endif
  96601. "# Square: Done\n\t"
  96602. "mov r2, r12\n\t"
  96603. "\n"
  96604. "L_sp_256_sqr_8_done_sqr_%=:\n\t"
  96605. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96606. "adds %[a], %[a], #4\n\t"
  96607. #else
  96608. "add %[a], %[a], #4\n\t"
  96609. #endif
  96610. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96611. "subs r2, r2, #4\n\t"
  96612. #else
  96613. "sub r2, r2, #4\n\t"
  96614. #endif
  96615. "movs r6, #32\n\t"
  96616. "add r6, r6, r9\n\t"
  96617. "cmp %[a], r6\n\t"
  96618. "beq L_sp_256_sqr_8_done_mul_%=\n\t"
  96619. "cmp %[a], r2\n\t"
  96620. "bgt L_sp_256_sqr_8_done_mul_%=\n\t"
  96621. "mov r7, r8\n\t"
  96622. "add r7, r7, r9\n\t"
  96623. "cmp %[a], r7\n\t"
  96624. "ble L_sp_256_sqr_8_mul_%=\n\t"
  96625. "\n"
  96626. "L_sp_256_sqr_8_done_mul_%=:\n\t"
  96627. "mov %[r], r10\n\t"
  96628. "mov r7, r8\n\t"
  96629. "str r3, [%[r], r7]\n\t"
  96630. "movs r3, r4\n\t"
  96631. "movs r4, r5\n\t"
  96632. "movs r5, #0\n\t"
  96633. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96634. "adds r7, r7, #4\n\t"
  96635. #else
  96636. "add r7, r7, #4\n\t"
  96637. #endif
  96638. "mov r8, r7\n\t"
  96639. "movs r6, #56\n\t"
  96640. "cmp r7, r6\n\t"
  96641. "ble L_sp_256_sqr_8_words_%=\n\t"
  96642. "mov %[a], r9\n\t"
  96643. "str r3, [%[r], r7]\n\t"
  96644. "mov %[r], r11\n\t"
  96645. "mov %[a], r10\n\t"
  96646. "movs r3, #60\n\t"
  96647. "\n"
  96648. "L_sp_256_sqr_8_store_%=:\n\t"
  96649. "ldr r6, [%[a], r3]\n\t"
  96650. "str r6, [%[r], r3]\n\t"
  96651. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96652. "subs r3, r3, #4\n\t"
  96653. #else
  96654. "sub r3, r3, #4\n\t"
  96655. #endif
  96656. "bge L_sp_256_sqr_8_store_%=\n\t"
  96657. "movs r6, #0x40\n\t"
  96658. "add sp, sp, r6\n\t"
  96659. : [r] "+l" (r), [a] "+l" (a)
  96660. :
  96661. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  96662. );
  96663. }
  96664. #ifdef WOLFSSL_SP_SMALL
  96665. /* Add b to a into r. (r = a + b)
  96666. *
  96667. * r A single precision integer.
  96668. * a A single precision integer.
  96669. * b A single precision integer.
  96670. */
  96671. SP_NOINLINE static sp_digit sp_256_add_8(sp_digit* r, const sp_digit* a,
  96672. const sp_digit* b)
  96673. {
  96674. __asm__ __volatile__ (
  96675. "movs r6, %[a]\n\t"
  96676. "movs r7, #0\n\t"
  96677. "movs r3, #0\n\t"
  96678. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96679. "adds r6, r6, #32\n\t"
  96680. #else
  96681. "add r6, r6, #32\n\t"
  96682. #endif
  96683. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96684. "subs r7, r7, #1\n\t"
  96685. #else
  96686. "sub r7, r7, #1\n\t"
  96687. #endif
  96688. "\n"
  96689. "L_sp_256_add_8_word_%=:\n\t"
  96690. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96691. "adds r3, r3, r7\n\t"
  96692. #else
  96693. "add r3, r3, r7\n\t"
  96694. #endif
  96695. "ldr r4, [%[a]]\n\t"
  96696. "ldr r5, [%[b]]\n\t"
  96697. #ifdef WOLFSSL_KEIL
  96698. "adcs r4, r4, r5\n\t"
  96699. #elif defined(__clang__)
  96700. "adcs r4, r5\n\t"
  96701. #else
  96702. "adc r4, r5\n\t"
  96703. #endif
  96704. "str r4, [%[r]]\n\t"
  96705. "movs r3, #0\n\t"
  96706. #ifdef WOLFSSL_KEIL
  96707. "adcs r3, r3, r3\n\t"
  96708. #elif defined(__clang__)
  96709. "adcs r3, r3\n\t"
  96710. #else
  96711. "adc r3, r3\n\t"
  96712. #endif
  96713. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96714. "adds %[a], %[a], #4\n\t"
  96715. #else
  96716. "add %[a], %[a], #4\n\t"
  96717. #endif
  96718. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96719. "adds %[b], %[b], #4\n\t"
  96720. #else
  96721. "add %[b], %[b], #4\n\t"
  96722. #endif
  96723. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96724. "adds %[r], %[r], #4\n\t"
  96725. #else
  96726. "add %[r], %[r], #4\n\t"
  96727. #endif
  96728. "cmp %[a], r6\n\t"
  96729. "bne L_sp_256_add_8_word_%=\n\t"
  96730. "movs %[r], r3\n\t"
  96731. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  96732. :
  96733. : "memory", "r3", "r4", "r5", "r6", "r7"
  96734. );
  96735. return (uint32_t)(size_t)r;
  96736. }
  96737. #else
  96738. /* Add b to a into r. (r = a + b)
  96739. *
  96740. * r A single precision integer.
  96741. * a A single precision integer.
  96742. * b A single precision integer.
  96743. */
  96744. SP_NOINLINE static sp_digit sp_256_add_8(sp_digit* r, const sp_digit* a,
  96745. const sp_digit* b)
  96746. {
  96747. __asm__ __volatile__ (
  96748. "ldm %[b]!, {r5, r6}\n\t"
  96749. "ldm %[a]!, {r3, r4}\n\t"
  96750. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96751. "adds r3, r3, r5\n\t"
  96752. #else
  96753. "add r3, r3, r5\n\t"
  96754. #endif
  96755. #ifdef WOLFSSL_KEIL
  96756. "adcs r4, r4, r6\n\t"
  96757. #elif defined(__clang__)
  96758. "adcs r4, r6\n\t"
  96759. #else
  96760. "adc r4, r6\n\t"
  96761. #endif
  96762. "stm %[r]!, {r3, r4}\n\t"
  96763. "ldm %[b]!, {r5, r6}\n\t"
  96764. "ldm %[a]!, {r3, r4}\n\t"
  96765. #ifdef WOLFSSL_KEIL
  96766. "adcs r3, r3, r5\n\t"
  96767. #elif defined(__clang__)
  96768. "adcs r3, r5\n\t"
  96769. #else
  96770. "adc r3, r5\n\t"
  96771. #endif
  96772. #ifdef WOLFSSL_KEIL
  96773. "adcs r4, r4, r6\n\t"
  96774. #elif defined(__clang__)
  96775. "adcs r4, r6\n\t"
  96776. #else
  96777. "adc r4, r6\n\t"
  96778. #endif
  96779. "stm %[r]!, {r3, r4}\n\t"
  96780. "ldm %[b]!, {r5, r6}\n\t"
  96781. "ldm %[a]!, {r3, r4}\n\t"
  96782. #ifdef WOLFSSL_KEIL
  96783. "adcs r3, r3, r5\n\t"
  96784. #elif defined(__clang__)
  96785. "adcs r3, r5\n\t"
  96786. #else
  96787. "adc r3, r5\n\t"
  96788. #endif
  96789. #ifdef WOLFSSL_KEIL
  96790. "adcs r4, r4, r6\n\t"
  96791. #elif defined(__clang__)
  96792. "adcs r4, r6\n\t"
  96793. #else
  96794. "adc r4, r6\n\t"
  96795. #endif
  96796. "stm %[r]!, {r3, r4}\n\t"
  96797. "ldm %[b]!, {r5, r6}\n\t"
  96798. "ldm %[a]!, {r3, r4}\n\t"
  96799. #ifdef WOLFSSL_KEIL
  96800. "adcs r3, r3, r5\n\t"
  96801. #elif defined(__clang__)
  96802. "adcs r3, r5\n\t"
  96803. #else
  96804. "adc r3, r5\n\t"
  96805. #endif
  96806. #ifdef WOLFSSL_KEIL
  96807. "adcs r4, r4, r6\n\t"
  96808. #elif defined(__clang__)
  96809. "adcs r4, r6\n\t"
  96810. #else
  96811. "adc r4, r6\n\t"
  96812. #endif
  96813. "stm %[r]!, {r3, r4}\n\t"
  96814. "movs %[r], #0\n\t"
  96815. #ifdef WOLFSSL_KEIL
  96816. "adcs %[r], %[r], %[r]\n\t"
  96817. #elif defined(__clang__)
  96818. "adcs %[r], %[r]\n\t"
  96819. #else
  96820. "adc %[r], %[r]\n\t"
  96821. #endif
  96822. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  96823. :
  96824. : "memory", "r3", "r4", "r5", "r6"
  96825. );
  96826. return (uint32_t)(size_t)r;
  96827. }
  96828. #endif /* WOLFSSL_SP_SMALL */
  96829. #ifdef WOLFSSL_SP_SMALL
  96830. /* Sub b from a into r. (r = a - b)
  96831. *
  96832. * r A single precision integer.
  96833. * a A single precision integer.
  96834. * b A single precision integer.
  96835. */
  96836. SP_NOINLINE static sp_digit sp_256_sub_8(sp_digit* r, const sp_digit* a,
  96837. const sp_digit* b)
  96838. {
  96839. __asm__ __volatile__ (
  96840. "movs r6, %[a]\n\t"
  96841. "movs r3, #0\n\t"
  96842. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96843. "adds r6, r6, #32\n\t"
  96844. #else
  96845. "add r6, r6, #32\n\t"
  96846. #endif
  96847. "\n"
  96848. "L_sp_256_sub_8_word_%=:\n\t"
  96849. "movs r5, #0\n\t"
  96850. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96851. "subs r5, r5, r3\n\t"
  96852. #else
  96853. "sub r5, r5, r3\n\t"
  96854. #endif
  96855. "ldr r4, [%[a]]\n\t"
  96856. "ldr r5, [%[b]]\n\t"
  96857. #ifdef WOLFSSL_KEIL
  96858. "sbcs r4, r4, r5\n\t"
  96859. #elif defined(__clang__)
  96860. "sbcs r4, r5\n\t"
  96861. #else
  96862. "sbc r4, r5\n\t"
  96863. #endif
  96864. "str r4, [%[r]]\n\t"
  96865. #ifdef WOLFSSL_KEIL
  96866. "sbcs r3, r3, r3\n\t"
  96867. #elif defined(__clang__)
  96868. "sbcs r3, r3\n\t"
  96869. #else
  96870. "sbc r3, r3\n\t"
  96871. #endif
  96872. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96873. "adds %[a], %[a], #4\n\t"
  96874. #else
  96875. "add %[a], %[a], #4\n\t"
  96876. #endif
  96877. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96878. "adds %[b], %[b], #4\n\t"
  96879. #else
  96880. "add %[b], %[b], #4\n\t"
  96881. #endif
  96882. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96883. "adds %[r], %[r], #4\n\t"
  96884. #else
  96885. "add %[r], %[r], #4\n\t"
  96886. #endif
  96887. "cmp %[a], r6\n\t"
  96888. "bne L_sp_256_sub_8_word_%=\n\t"
  96889. "movs %[r], r3\n\t"
  96890. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  96891. :
  96892. : "memory", "r3", "r4", "r5", "r6"
  96893. );
  96894. return (uint32_t)(size_t)r;
  96895. }
  96896. #else
  96897. /* Sub b from a into r. (r = a - b)
  96898. *
  96899. * r A single precision integer.
  96900. * a A single precision integer.
  96901. * b A single precision integer.
  96902. */
  96903. SP_NOINLINE static sp_digit sp_256_sub_8(sp_digit* r, const sp_digit* a,
  96904. const sp_digit* b)
  96905. {
  96906. __asm__ __volatile__ (
  96907. "ldm %[b]!, {r5, r6}\n\t"
  96908. "ldm %[a]!, {r3, r4}\n\t"
  96909. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96910. "subs r3, r3, r5\n\t"
  96911. #else
  96912. "sub r3, r3, r5\n\t"
  96913. #endif
  96914. #ifdef WOLFSSL_KEIL
  96915. "sbcs r4, r4, r6\n\t"
  96916. #elif defined(__clang__)
  96917. "sbcs r4, r6\n\t"
  96918. #else
  96919. "sbc r4, r6\n\t"
  96920. #endif
  96921. "stm %[r]!, {r3, r4}\n\t"
  96922. "ldm %[b]!, {r5, r6}\n\t"
  96923. "ldm %[a]!, {r3, r4}\n\t"
  96924. #ifdef WOLFSSL_KEIL
  96925. "sbcs r3, r3, r5\n\t"
  96926. #elif defined(__clang__)
  96927. "sbcs r3, r5\n\t"
  96928. #else
  96929. "sbc r3, r5\n\t"
  96930. #endif
  96931. #ifdef WOLFSSL_KEIL
  96932. "sbcs r4, r4, r6\n\t"
  96933. #elif defined(__clang__)
  96934. "sbcs r4, r6\n\t"
  96935. #else
  96936. "sbc r4, r6\n\t"
  96937. #endif
  96938. "stm %[r]!, {r3, r4}\n\t"
  96939. "ldm %[b]!, {r5, r6}\n\t"
  96940. "ldm %[a]!, {r3, r4}\n\t"
  96941. #ifdef WOLFSSL_KEIL
  96942. "sbcs r3, r3, r5\n\t"
  96943. #elif defined(__clang__)
  96944. "sbcs r3, r5\n\t"
  96945. #else
  96946. "sbc r3, r5\n\t"
  96947. #endif
  96948. #ifdef WOLFSSL_KEIL
  96949. "sbcs r4, r4, r6\n\t"
  96950. #elif defined(__clang__)
  96951. "sbcs r4, r6\n\t"
  96952. #else
  96953. "sbc r4, r6\n\t"
  96954. #endif
  96955. "stm %[r]!, {r3, r4}\n\t"
  96956. "ldm %[b]!, {r5, r6}\n\t"
  96957. "ldm %[a]!, {r3, r4}\n\t"
  96958. #ifdef WOLFSSL_KEIL
  96959. "sbcs r3, r3, r5\n\t"
  96960. #elif defined(__clang__)
  96961. "sbcs r3, r5\n\t"
  96962. #else
  96963. "sbc r3, r5\n\t"
  96964. #endif
  96965. #ifdef WOLFSSL_KEIL
  96966. "sbcs r4, r4, r6\n\t"
  96967. #elif defined(__clang__)
  96968. "sbcs r4, r6\n\t"
  96969. #else
  96970. "sbc r4, r6\n\t"
  96971. #endif
  96972. "stm %[r]!, {r3, r4}\n\t"
  96973. #ifdef WOLFSSL_KEIL
  96974. "sbcs %[r], %[r], %[r]\n\t"
  96975. #elif defined(__clang__)
  96976. "sbcs %[r], %[r]\n\t"
  96977. #else
  96978. "sbc %[r], %[r]\n\t"
  96979. #endif
  96980. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  96981. :
  96982. : "memory", "r3", "r4", "r5", "r6"
  96983. );
  96984. return (uint32_t)(size_t)r;
  96985. }
  96986. #endif /* WOLFSSL_SP_SMALL */
  96987. /* Multiply a number by Montgomery normalizer mod modulus (prime).
  96988. *
  96989. * r The resulting Montgomery form number.
  96990. * a The number to convert.
  96991. * m The modulus (prime).
  96992. */
  96993. static int sp_256_mod_mul_norm_8(sp_digit* r, const sp_digit* a, const sp_digit* m)
  96994. {
  96995. int64_t t[8];
  96996. int64_t a64[8];
  96997. int64_t o;
  96998. (void)m;
  96999. a64[0] = a[0];
  97000. a64[1] = a[1];
  97001. a64[2] = a[2];
  97002. a64[3] = a[3];
  97003. a64[4] = a[4];
  97004. a64[5] = a[5];
  97005. a64[6] = a[6];
  97006. a64[7] = a[7];
  97007. /* 1 1 0 -1 -1 -1 -1 0 */
  97008. t[0] = 0 + a64[0] + a64[1] - a64[3] - a64[4] - a64[5] - a64[6];
  97009. /* 0 1 1 0 -1 -1 -1 -1 */
  97010. t[1] = 0 + a64[1] + a64[2] - a64[4] - a64[5] - a64[6] - a64[7];
  97011. /* 0 0 1 1 0 -1 -1 -1 */
  97012. t[2] = 0 + a64[2] + a64[3] - a64[5] - a64[6] - a64[7];
  97013. /* -1 -1 0 2 2 1 0 -1 */
  97014. t[3] = 0 - a64[0] - a64[1] + 2 * a64[3] + 2 * a64[4] + a64[5] - a64[7];
  97015. /* 0 -1 -1 0 2 2 1 0 */
  97016. t[4] = 0 - a64[1] - a64[2] + 2 * a64[4] + 2 * a64[5] + a64[6];
  97017. /* 0 0 -1 -1 0 2 2 1 */
  97018. t[5] = 0 - a64[2] - a64[3] + 2 * a64[5] + 2 * a64[6] + a64[7];
  97019. /* -1 -1 0 0 0 1 3 2 */
  97020. t[6] = 0 - a64[0] - a64[1] + a64[5] + 3 * a64[6] + 2 * a64[7];
  97021. /* 1 0 -1 -1 -1 -1 0 3 */
  97022. t[7] = 0 + a64[0] - a64[2] - a64[3] - a64[4] - a64[5] + 3 * a64[7];
  97023. t[1] += t[0] >> 32; t[0] &= 0xffffffff;
  97024. t[2] += t[1] >> 32; t[1] &= 0xffffffff;
  97025. t[3] += t[2] >> 32; t[2] &= 0xffffffff;
  97026. t[4] += t[3] >> 32; t[3] &= 0xffffffff;
  97027. t[5] += t[4] >> 32; t[4] &= 0xffffffff;
  97028. t[6] += t[5] >> 32; t[5] &= 0xffffffff;
  97029. t[7] += t[6] >> 32; t[6] &= 0xffffffff;
  97030. o = t[7] >> 32; t[7] &= 0xffffffff;
  97031. t[0] += o;
  97032. t[3] -= o;
  97033. t[6] -= o;
  97034. t[7] += o;
  97035. t[1] += t[0] >> 32; t[0] &= 0xffffffff;
  97036. t[2] += t[1] >> 32; t[1] &= 0xffffffff;
  97037. t[3] += t[2] >> 32; t[2] &= 0xffffffff;
  97038. t[4] += t[3] >> 32; t[3] &= 0xffffffff;
  97039. t[5] += t[4] >> 32; t[4] &= 0xffffffff;
  97040. t[6] += t[5] >> 32; t[5] &= 0xffffffff;
  97041. t[7] += t[6] >> 32; t[6] &= 0xffffffff;
  97042. r[0] = (sp_digit)t[0];
  97043. r[1] = (sp_digit)t[1];
  97044. r[2] = (sp_digit)t[2];
  97045. r[3] = (sp_digit)t[3];
  97046. r[4] = (sp_digit)t[4];
  97047. r[5] = (sp_digit)t[5];
  97048. r[6] = (sp_digit)t[6];
  97049. r[7] = (sp_digit)t[7];
  97050. return MP_OKAY;
  97051. }
  97052. /* Convert an mp_int to an array of sp_digit.
  97053. *
  97054. * r A single precision integer.
  97055. * size Maximum number of bytes to convert
  97056. * a A multi-precision integer.
  97057. */
  97058. static void sp_256_from_mp(sp_digit* r, int size, const mp_int* a)
  97059. {
  97060. #if DIGIT_BIT == 32
  97061. int i;
  97062. int j = 0;
  97063. for (i = 0; i < size; i++) {
  97064. sp_digit mask =
  97065. (((sp_digit)(a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1;
  97066. r[i] = a->dp[j] & mask;
  97067. j += (int)(((sp_digit)1) -
  97068. (((sp_digit)(a->used - i - 2)) >> (SP_WORD_SIZE - 1)));
  97069. }
  97070. #elif DIGIT_BIT > 32
  97071. int i;
  97072. int j = 0;
  97073. word32 s = 0;
  97074. r[0] = 0;
  97075. for (i = 0; i < a->used && j < size; i++) {
  97076. r[j] |= ((sp_digit)a->dp[i] << s);
  97077. r[j] &= 0xffffffff;
  97078. s = 32U - s;
  97079. if (j + 1 >= size) {
  97080. break;
  97081. }
  97082. /* lint allow cast of mismatch word32 and mp_digit */
  97083. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  97084. while ((s + 32U) <= (word32)DIGIT_BIT) {
  97085. s += 32U;
  97086. r[j] &= 0xffffffff;
  97087. if (j + 1 >= size) {
  97088. break;
  97089. }
  97090. if (s < (word32)DIGIT_BIT) {
  97091. /* lint allow cast of mismatch word32 and mp_digit */
  97092. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  97093. }
  97094. else {
  97095. r[++j] = (sp_digit)0;
  97096. }
  97097. }
  97098. s = (word32)DIGIT_BIT - s;
  97099. }
  97100. for (j++; j < size; j++) {
  97101. r[j] = 0;
  97102. }
  97103. #else
  97104. int i;
  97105. int j = 0;
  97106. int s = 0;
  97107. r[0] = 0;
  97108. for (i = 0; i < a->used && j < size; i++) {
  97109. r[j] |= ((sp_digit)a->dp[i]) << s;
  97110. if (s + DIGIT_BIT >= 32) {
  97111. r[j] &= 0xffffffff;
  97112. if (j + 1 >= size) {
  97113. break;
  97114. }
  97115. s = 32 - s;
  97116. if (s == DIGIT_BIT) {
  97117. r[++j] = 0;
  97118. s = 0;
  97119. }
  97120. else {
  97121. r[++j] = a->dp[i] >> s;
  97122. s = DIGIT_BIT - s;
  97123. }
  97124. }
  97125. else {
  97126. s += DIGIT_BIT;
  97127. }
  97128. }
  97129. for (j++; j < size; j++) {
  97130. r[j] = 0;
  97131. }
  97132. #endif
  97133. }
  97134. /* Convert a point of type ecc_point to type sp_point_256.
  97135. *
  97136. * p Point of type sp_point_256 (result).
  97137. * pm Point of type ecc_point.
  97138. */
  97139. static void sp_256_point_from_ecc_point_8(sp_point_256* p,
  97140. const ecc_point* pm)
  97141. {
  97142. XMEMSET(p->x, 0, sizeof(p->x));
  97143. XMEMSET(p->y, 0, sizeof(p->y));
  97144. XMEMSET(p->z, 0, sizeof(p->z));
  97145. sp_256_from_mp(p->x, 8, pm->x);
  97146. sp_256_from_mp(p->y, 8, pm->y);
  97147. sp_256_from_mp(p->z, 8, pm->z);
  97148. p->infinity = 0;
  97149. }
  97150. /* Convert an array of sp_digit to an mp_int.
  97151. *
  97152. * a A single precision integer.
  97153. * r A multi-precision integer.
  97154. */
  97155. static int sp_256_to_mp(const sp_digit* a, mp_int* r)
  97156. {
  97157. int err;
  97158. err = mp_grow(r, (256 + DIGIT_BIT - 1) / DIGIT_BIT);
  97159. if (err == MP_OKAY) { /*lint !e774 case where err is always MP_OKAY*/
  97160. #if DIGIT_BIT == 32
  97161. XMEMCPY(r->dp, a, sizeof(sp_digit) * 8);
  97162. r->used = 8;
  97163. mp_clamp(r);
  97164. #elif DIGIT_BIT < 32
  97165. int i;
  97166. int j = 0;
  97167. int s = 0;
  97168. r->dp[0] = 0;
  97169. for (i = 0; i < 8; i++) {
  97170. r->dp[j] |= (mp_digit)(a[i] << s);
  97171. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  97172. s = DIGIT_BIT - s;
  97173. r->dp[++j] = (mp_digit)(a[i] >> s);
  97174. while (s + DIGIT_BIT <= 32) {
  97175. s += DIGIT_BIT;
  97176. r->dp[j++] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  97177. if (s == SP_WORD_SIZE) {
  97178. r->dp[j] = 0;
  97179. }
  97180. else {
  97181. r->dp[j] = (mp_digit)(a[i] >> s);
  97182. }
  97183. }
  97184. s = 32 - s;
  97185. }
  97186. r->used = (256 + DIGIT_BIT - 1) / DIGIT_BIT;
  97187. mp_clamp(r);
  97188. #else
  97189. int i;
  97190. int j = 0;
  97191. int s = 0;
  97192. r->dp[0] = 0;
  97193. for (i = 0; i < 8; i++) {
  97194. r->dp[j] |= ((mp_digit)a[i]) << s;
  97195. if (s + 32 >= DIGIT_BIT) {
  97196. #if DIGIT_BIT != 32 && DIGIT_BIT != 64
  97197. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  97198. #endif
  97199. s = DIGIT_BIT - s;
  97200. r->dp[++j] = a[i] >> s;
  97201. s = 32 - s;
  97202. }
  97203. else {
  97204. s += 32;
  97205. }
  97206. }
  97207. r->used = (256 + DIGIT_BIT - 1) / DIGIT_BIT;
  97208. mp_clamp(r);
  97209. #endif
  97210. }
  97211. return err;
  97212. }
  97213. /* Convert a point of type sp_point_256 to type ecc_point.
  97214. *
  97215. * p Point of type sp_point_256.
  97216. * pm Point of type ecc_point (result).
  97217. * returns MEMORY_E when allocation of memory in ecc_point fails otherwise
  97218. * MP_OKAY.
  97219. */
  97220. static int sp_256_point_to_ecc_point_8(const sp_point_256* p, ecc_point* pm)
  97221. {
  97222. int err;
  97223. err = sp_256_to_mp(p->x, pm->x);
  97224. if (err == MP_OKAY) {
  97225. err = sp_256_to_mp(p->y, pm->y);
  97226. }
  97227. if (err == MP_OKAY) {
  97228. err = sp_256_to_mp(p->z, pm->z);
  97229. }
  97230. return err;
  97231. }
  97232. /* Conditionally subtract b from a using the mask m.
  97233. * m is -1 to subtract and 0 when not copying.
  97234. *
  97235. * r A single precision number representing condition subtract result.
  97236. * a A single precision number to subtract from.
  97237. * b A single precision number to subtract.
  97238. * m Mask value to apply.
  97239. */
  97240. SP_NOINLINE static sp_digit sp_256_cond_sub_8(sp_digit* r, const sp_digit* a,
  97241. const sp_digit* b, sp_digit m)
  97242. {
  97243. __asm__ __volatile__ (
  97244. "movs r4, #0\n\t"
  97245. "movs r5, #32\n\t"
  97246. "mov r8, r5\n\t"
  97247. "movs r7, #0\n\t"
  97248. "\n"
  97249. "L_sp_256_cond_sub_8_words_%=:\n\t"
  97250. "ldr r6, [%[b], r7]\n\t"
  97251. #ifdef WOLFSSL_KEIL
  97252. "ands r6, r6, %[m]\n\t"
  97253. #elif defined(__clang__)
  97254. "ands r6, %[m]\n\t"
  97255. #else
  97256. "and r6, %[m]\n\t"
  97257. #endif
  97258. "movs r5, #0\n\t"
  97259. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97260. "subs r5, r5, r4\n\t"
  97261. #else
  97262. "sub r5, r5, r4\n\t"
  97263. #endif
  97264. "ldr r5, [%[a], r7]\n\t"
  97265. #ifdef WOLFSSL_KEIL
  97266. "sbcs r5, r5, r6\n\t"
  97267. #elif defined(__clang__)
  97268. "sbcs r5, r6\n\t"
  97269. #else
  97270. "sbc r5, r6\n\t"
  97271. #endif
  97272. #ifdef WOLFSSL_KEIL
  97273. "sbcs r4, r4, r4\n\t"
  97274. #elif defined(__clang__)
  97275. "sbcs r4, r4\n\t"
  97276. #else
  97277. "sbc r4, r4\n\t"
  97278. #endif
  97279. "str r5, [%[r], r7]\n\t"
  97280. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97281. "adds r7, r7, #4\n\t"
  97282. #else
  97283. "add r7, r7, #4\n\t"
  97284. #endif
  97285. "cmp r7, r8\n\t"
  97286. "blt L_sp_256_cond_sub_8_words_%=\n\t"
  97287. "movs %[r], r4\n\t"
  97288. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m)
  97289. :
  97290. : "memory", "r4", "r5", "r6", "r7", "r8"
  97291. );
  97292. return (uint32_t)(size_t)r;
  97293. }
  97294. /* Reduce the number back to 256 bits using Montgomery reduction.
  97295. *
  97296. * a A single precision number to reduce in place.
  97297. * m The single precision number representing the modulus.
  97298. * mp The digit representing the negative inverse of m mod 2^n.
  97299. */
  97300. SP_NOINLINE static void sp_256_mont_reduce_8(sp_digit* a, const sp_digit* m,
  97301. sp_digit mp)
  97302. {
  97303. (void)mp;
  97304. (void)m;
  97305. __asm__ __volatile__ (
  97306. "movs r2, #0\n\t"
  97307. "movs r1, #0\n\t"
  97308. "# i = 0\n\t"
  97309. "mov r8, r2\n\t"
  97310. "\n"
  97311. "L_sp_256_mont_reduce_8_mod_%=:\n\t"
  97312. "movs r4, #0\n\t"
  97313. "# mu = a[i] * 1 (mp) = a[i]\n\t"
  97314. "ldr r3, [%[a]]\n\t"
  97315. "# a[i+0] += -1 * mu\n\t"
  97316. "movs r5, r3\n\t"
  97317. "str r4, [%[a]]\n\t"
  97318. "# a[i+1] += -1 * mu\n\t"
  97319. "ldr r6, [%[a], #4]\n\t"
  97320. "movs r4, r3\n\t"
  97321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97322. "subs r5, r5, r3\n\t"
  97323. #else
  97324. "sub r5, r5, r3\n\t"
  97325. #endif
  97326. #ifdef WOLFSSL_KEIL
  97327. "sbcs r4, r4, r2\n\t"
  97328. #elif defined(__clang__)
  97329. "sbcs r4, r2\n\t"
  97330. #else
  97331. "sbc r4, r2\n\t"
  97332. #endif
  97333. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97334. "adds r5, r5, r6\n\t"
  97335. #else
  97336. "add r5, r5, r6\n\t"
  97337. #endif
  97338. #ifdef WOLFSSL_KEIL
  97339. "adcs r4, r4, r2\n\t"
  97340. #elif defined(__clang__)
  97341. "adcs r4, r2\n\t"
  97342. #else
  97343. "adc r4, r2\n\t"
  97344. #endif
  97345. "str r5, [%[a], #4]\n\t"
  97346. "# a[i+2] += -1 * mu\n\t"
  97347. "ldr r6, [%[a], #8]\n\t"
  97348. "movs r5, r3\n\t"
  97349. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97350. "subs r4, r4, r3\n\t"
  97351. #else
  97352. "sub r4, r4, r3\n\t"
  97353. #endif
  97354. #ifdef WOLFSSL_KEIL
  97355. "sbcs r5, r5, r2\n\t"
  97356. #elif defined(__clang__)
  97357. "sbcs r5, r2\n\t"
  97358. #else
  97359. "sbc r5, r2\n\t"
  97360. #endif
  97361. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97362. "adds r4, r4, r6\n\t"
  97363. #else
  97364. "add r4, r4, r6\n\t"
  97365. #endif
  97366. #ifdef WOLFSSL_KEIL
  97367. "adcs r5, r5, r2\n\t"
  97368. #elif defined(__clang__)
  97369. "adcs r5, r2\n\t"
  97370. #else
  97371. "adc r5, r2\n\t"
  97372. #endif
  97373. "str r4, [%[a], #8]\n\t"
  97374. "# a[i+3] += 0 * mu\n\t"
  97375. "ldr r6, [%[a], #12]\n\t"
  97376. "movs r4, #0\n\t"
  97377. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97378. "adds r5, r5, r6\n\t"
  97379. #else
  97380. "add r5, r5, r6\n\t"
  97381. #endif
  97382. #ifdef WOLFSSL_KEIL
  97383. "adcs r4, r4, r2\n\t"
  97384. #elif defined(__clang__)
  97385. "adcs r4, r2\n\t"
  97386. #else
  97387. "adc r4, r2\n\t"
  97388. #endif
  97389. "str r5, [%[a], #12]\n\t"
  97390. "# a[i+4] += 0 * mu\n\t"
  97391. "ldr r6, [%[a], #16]\n\t"
  97392. "movs r5, #0\n\t"
  97393. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97394. "adds r4, r4, r6\n\t"
  97395. #else
  97396. "add r4, r4, r6\n\t"
  97397. #endif
  97398. #ifdef WOLFSSL_KEIL
  97399. "adcs r5, r5, r2\n\t"
  97400. #elif defined(__clang__)
  97401. "adcs r5, r2\n\t"
  97402. #else
  97403. "adc r5, r2\n\t"
  97404. #endif
  97405. "str r4, [%[a], #16]\n\t"
  97406. "# a[i+5] += 0 * mu\n\t"
  97407. "ldr r6, [%[a], #20]\n\t"
  97408. "movs r4, #0\n\t"
  97409. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97410. "adds r5, r5, r6\n\t"
  97411. #else
  97412. "add r5, r5, r6\n\t"
  97413. #endif
  97414. #ifdef WOLFSSL_KEIL
  97415. "adcs r4, r4, r2\n\t"
  97416. #elif defined(__clang__)
  97417. "adcs r4, r2\n\t"
  97418. #else
  97419. "adc r4, r2\n\t"
  97420. #endif
  97421. "str r5, [%[a], #20]\n\t"
  97422. "# a[i+6] += 1 * mu\n\t"
  97423. "ldr r6, [%[a], #24]\n\t"
  97424. "movs r5, #0\n\t"
  97425. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97426. "adds r4, r4, r3\n\t"
  97427. #else
  97428. "add r4, r4, r3\n\t"
  97429. #endif
  97430. #ifdef WOLFSSL_KEIL
  97431. "adcs r5, r5, r2\n\t"
  97432. #elif defined(__clang__)
  97433. "adcs r5, r2\n\t"
  97434. #else
  97435. "adc r5, r2\n\t"
  97436. #endif
  97437. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97438. "adds r4, r4, r6\n\t"
  97439. #else
  97440. "add r4, r4, r6\n\t"
  97441. #endif
  97442. #ifdef WOLFSSL_KEIL
  97443. "adcs r5, r5, r2\n\t"
  97444. #elif defined(__clang__)
  97445. "adcs r5, r2\n\t"
  97446. #else
  97447. "adc r5, r2\n\t"
  97448. #endif
  97449. "str r4, [%[a], #24]\n\t"
  97450. "# a[i+7] += -1 * mu\n\t"
  97451. "ldr r6, [%[a], #28]\n\t"
  97452. "ldr r7, [%[a], #32]\n\t"
  97453. #ifdef WOLFSSL_KEIL
  97454. "adds r4, r1, r3\n\t"
  97455. #else
  97456. #ifdef __clang__
  97457. "adds r4, r1, r3\n\t"
  97458. #else
  97459. "add r4, r1, r3\n\t"
  97460. #endif
  97461. #endif
  97462. "movs r1, #0\n\t"
  97463. #ifdef WOLFSSL_KEIL
  97464. "adcs r1, r1, r2\n\t"
  97465. #elif defined(__clang__)
  97466. "adcs r1, r2\n\t"
  97467. #else
  97468. "adc r1, r2\n\t"
  97469. #endif
  97470. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97471. "subs r5, r5, r3\n\t"
  97472. #else
  97473. "sub r5, r5, r3\n\t"
  97474. #endif
  97475. #ifdef WOLFSSL_KEIL
  97476. "sbcs r4, r4, r2\n\t"
  97477. #elif defined(__clang__)
  97478. "sbcs r4, r2\n\t"
  97479. #else
  97480. "sbc r4, r2\n\t"
  97481. #endif
  97482. #ifdef WOLFSSL_KEIL
  97483. "sbcs r1, r1, r2\n\t"
  97484. #elif defined(__clang__)
  97485. "sbcs r1, r2\n\t"
  97486. #else
  97487. "sbc r1, r2\n\t"
  97488. #endif
  97489. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97490. "adds r5, r5, r6\n\t"
  97491. #else
  97492. "add r5, r5, r6\n\t"
  97493. #endif
  97494. #ifdef WOLFSSL_KEIL
  97495. "adcs r4, r4, r7\n\t"
  97496. #elif defined(__clang__)
  97497. "adcs r4, r7\n\t"
  97498. #else
  97499. "adc r4, r7\n\t"
  97500. #endif
  97501. #ifdef WOLFSSL_KEIL
  97502. "adcs r1, r1, r2\n\t"
  97503. #elif defined(__clang__)
  97504. "adcs r1, r2\n\t"
  97505. #else
  97506. "adc r1, r2\n\t"
  97507. #endif
  97508. "str r5, [%[a], #28]\n\t"
  97509. "str r4, [%[a], #32]\n\t"
  97510. "# i += 1\n\t"
  97511. "movs r6, #4\n\t"
  97512. "add r8, r8, r6\n\t"
  97513. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97514. "adds %[a], %[a], #4\n\t"
  97515. #else
  97516. "add %[a], %[a], #4\n\t"
  97517. #endif
  97518. "movs r6, #32\n\t"
  97519. "cmp r8, r6\n\t"
  97520. "blt L_sp_256_mont_reduce_8_mod_%=\n\t"
  97521. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97522. "subs %[a], %[a], #32\n\t"
  97523. #else
  97524. "sub %[a], %[a], #32\n\t"
  97525. #endif
  97526. "movs r3, r1\n\t"
  97527. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97528. "subs r1, r1, #1\n\t"
  97529. #else
  97530. "sub r1, r1, #1\n\t"
  97531. #endif
  97532. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97533. "mvns r1, r1\n\t"
  97534. #else
  97535. "mvn r1, r1\n\t"
  97536. #endif
  97537. "ldr r5, [%[a], #32]\n\t"
  97538. "ldr r4, [%[a], #36]\n\t"
  97539. "ldr r6, [%[a], #40]\n\t"
  97540. "ldr r7, [%[a], #44]\n\t"
  97541. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97542. "subs r5, r5, r1\n\t"
  97543. #else
  97544. "sub r5, r5, r1\n\t"
  97545. #endif
  97546. #ifdef WOLFSSL_KEIL
  97547. "sbcs r4, r4, r1\n\t"
  97548. #elif defined(__clang__)
  97549. "sbcs r4, r1\n\t"
  97550. #else
  97551. "sbc r4, r1\n\t"
  97552. #endif
  97553. #ifdef WOLFSSL_KEIL
  97554. "sbcs r6, r6, r1\n\t"
  97555. #elif defined(__clang__)
  97556. "sbcs r6, r1\n\t"
  97557. #else
  97558. "sbc r6, r1\n\t"
  97559. #endif
  97560. #ifdef WOLFSSL_KEIL
  97561. "sbcs r7, r7, r2\n\t"
  97562. #elif defined(__clang__)
  97563. "sbcs r7, r2\n\t"
  97564. #else
  97565. "sbc r7, r2\n\t"
  97566. #endif
  97567. "str r5, [%[a]]\n\t"
  97568. "str r4, [%[a], #4]\n\t"
  97569. "str r6, [%[a], #8]\n\t"
  97570. "str r7, [%[a], #12]\n\t"
  97571. "ldr r5, [%[a], #48]\n\t"
  97572. "ldr r4, [%[a], #52]\n\t"
  97573. "ldr r6, [%[a], #56]\n\t"
  97574. "ldr r7, [%[a], #60]\n\t"
  97575. #ifdef WOLFSSL_KEIL
  97576. "sbcs r5, r5, r2\n\t"
  97577. #elif defined(__clang__)
  97578. "sbcs r5, r2\n\t"
  97579. #else
  97580. "sbc r5, r2\n\t"
  97581. #endif
  97582. #ifdef WOLFSSL_KEIL
  97583. "sbcs r4, r4, r2\n\t"
  97584. #elif defined(__clang__)
  97585. "sbcs r4, r2\n\t"
  97586. #else
  97587. "sbc r4, r2\n\t"
  97588. #endif
  97589. #ifdef WOLFSSL_KEIL
  97590. "sbcs r6, r6, r3\n\t"
  97591. #elif defined(__clang__)
  97592. "sbcs r6, r3\n\t"
  97593. #else
  97594. "sbc r6, r3\n\t"
  97595. #endif
  97596. #ifdef WOLFSSL_KEIL
  97597. "sbcs r7, r7, r1\n\t"
  97598. #elif defined(__clang__)
  97599. "sbcs r7, r1\n\t"
  97600. #else
  97601. "sbc r7, r1\n\t"
  97602. #endif
  97603. "str r5, [%[a], #16]\n\t"
  97604. "str r4, [%[a], #20]\n\t"
  97605. "str r6, [%[a], #24]\n\t"
  97606. "str r7, [%[a], #28]\n\t"
  97607. : [a] "+l" (a)
  97608. :
  97609. : "memory", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8"
  97610. );
  97611. }
  97612. /* Reduce the number back to 256 bits using Montgomery reduction.
  97613. *
  97614. * a A single precision number to reduce in place.
  97615. * m The single precision number representing the modulus.
  97616. * mp The digit representing the negative inverse of m mod 2^n.
  97617. */
  97618. SP_NOINLINE static void sp_256_mont_reduce_order_8(sp_digit* a,
  97619. const sp_digit* m, sp_digit mp)
  97620. {
  97621. __asm__ __volatile__ (
  97622. "movs r7, #0\n\t"
  97623. "mov r8, %[mp]\n\t"
  97624. "mov r12, r7\n\t"
  97625. "mov lr, %[m]\n\t"
  97626. "mov r9, %[a]\n\t"
  97627. "mov r11, %[a]\n\t"
  97628. "movs r5, #28\n\t"
  97629. "movs r6, #32\n\t"
  97630. "add r9, r9, r5\n\t"
  97631. "add r11, r11, r6\n\t"
  97632. "\n"
  97633. "L_sp_256_mont_reduce_order_8_mod_%=:\n\t"
  97634. "movs r7, #0\n\t"
  97635. "movs r4, #0\n\t"
  97636. "# a[i] += m[0] * mu\n\t"
  97637. "ldm %[m]!, {%[mp]}\n\t"
  97638. "ldm %[a]!, {r3}\n\t"
  97639. "# mu = a[i] * mp\n\t"
  97640. "mov r5, r8\n\t"
  97641. #ifdef WOLFSSL_KEIL
  97642. "muls r5, r3, r5\n\t"
  97643. #elif defined(__clang__)
  97644. "muls r5, r3\n\t"
  97645. #else
  97646. "mul r5, r3\n\t"
  97647. #endif
  97648. "mov r10, r5\n\t"
  97649. "# Multiply m[0] and mu - Start\n\t"
  97650. "mov r5, r10\n\t"
  97651. "uxth r6, %[mp]\n\t"
  97652. "uxth r5, r5\n\t"
  97653. #ifdef WOLFSSL_KEIL
  97654. "muls r6, r5, r6\n\t"
  97655. #elif defined(__clang__)
  97656. "muls r6, r5\n\t"
  97657. #else
  97658. "mul r6, r5\n\t"
  97659. #endif
  97660. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97661. "adds r3, r3, r6\n\t"
  97662. #else
  97663. "add r3, r3, r6\n\t"
  97664. #endif
  97665. #ifdef WOLFSSL_KEIL
  97666. "adcs r4, r4, r7\n\t"
  97667. #elif defined(__clang__)
  97668. "adcs r4, r7\n\t"
  97669. #else
  97670. "adc r4, r7\n\t"
  97671. #endif
  97672. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97673. "lsrs r6, %[mp], #16\n\t"
  97674. #else
  97675. "lsr r6, %[mp], #16\n\t"
  97676. #endif
  97677. #ifdef WOLFSSL_KEIL
  97678. "muls r5, r6, r5\n\t"
  97679. #elif defined(__clang__)
  97680. "muls r5, r6\n\t"
  97681. #else
  97682. "mul r5, r6\n\t"
  97683. #endif
  97684. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97685. "lsrs r6, r5, #16\n\t"
  97686. #else
  97687. "lsr r6, r5, #16\n\t"
  97688. #endif
  97689. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97690. "lsls r5, r5, #16\n\t"
  97691. #else
  97692. "lsl r5, r5, #16\n\t"
  97693. #endif
  97694. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97695. "adds r3, r3, r5\n\t"
  97696. #else
  97697. "add r3, r3, r5\n\t"
  97698. #endif
  97699. #ifdef WOLFSSL_KEIL
  97700. "adcs r4, r4, r6\n\t"
  97701. #elif defined(__clang__)
  97702. "adcs r4, r6\n\t"
  97703. #else
  97704. "adc r4, r6\n\t"
  97705. #endif
  97706. "mov r5, r10\n\t"
  97707. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97708. "lsrs r6, %[mp], #16\n\t"
  97709. #else
  97710. "lsr r6, %[mp], #16\n\t"
  97711. #endif
  97712. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97713. "lsrs r5, r5, #16\n\t"
  97714. #else
  97715. "lsr r5, r5, #16\n\t"
  97716. #endif
  97717. #ifdef WOLFSSL_KEIL
  97718. "muls r6, r5, r6\n\t"
  97719. #elif defined(__clang__)
  97720. "muls r6, r5\n\t"
  97721. #else
  97722. "mul r6, r5\n\t"
  97723. #endif
  97724. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97725. "adds r4, r4, r6\n\t"
  97726. #else
  97727. "add r4, r4, r6\n\t"
  97728. #endif
  97729. "uxth r6, %[mp]\n\t"
  97730. #ifdef WOLFSSL_KEIL
  97731. "muls r5, r6, r5\n\t"
  97732. #elif defined(__clang__)
  97733. "muls r5, r6\n\t"
  97734. #else
  97735. "mul r5, r6\n\t"
  97736. #endif
  97737. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97738. "lsrs r6, r5, #16\n\t"
  97739. #else
  97740. "lsr r6, r5, #16\n\t"
  97741. #endif
  97742. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97743. "lsls r5, r5, #16\n\t"
  97744. #else
  97745. "lsl r5, r5, #16\n\t"
  97746. #endif
  97747. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97748. "adds r3, r3, r5\n\t"
  97749. #else
  97750. "add r3, r3, r5\n\t"
  97751. #endif
  97752. #ifdef WOLFSSL_KEIL
  97753. "adcs r4, r4, r6\n\t"
  97754. #elif defined(__clang__)
  97755. "adcs r4, r6\n\t"
  97756. #else
  97757. "adc r4, r6\n\t"
  97758. #endif
  97759. "# Multiply m[0] and mu - Done\n\t"
  97760. "\n"
  97761. "L_sp_256_mont_reduce_order_8_word_%=:\n\t"
  97762. "# a[i+j] += m[j] * mu\n\t"
  97763. "ldr r3, [%[a]]\n\t"
  97764. "ldm %[m]!, {%[mp]}\n\t"
  97765. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97766. "adds r3, r3, r4\n\t"
  97767. #else
  97768. "add r3, r3, r4\n\t"
  97769. #endif
  97770. "movs r4, #0\n\t"
  97771. #ifdef WOLFSSL_KEIL
  97772. "adcs r4, r4, r7\n\t"
  97773. #elif defined(__clang__)
  97774. "adcs r4, r7\n\t"
  97775. #else
  97776. "adc r4, r7\n\t"
  97777. #endif
  97778. "# Multiply m[j] and mu - Start\n\t"
  97779. "mov r5, r10\n\t"
  97780. "uxth r6, %[mp]\n\t"
  97781. "uxth r5, r5\n\t"
  97782. #ifdef WOLFSSL_KEIL
  97783. "muls r6, r5, r6\n\t"
  97784. #elif defined(__clang__)
  97785. "muls r6, r5\n\t"
  97786. #else
  97787. "mul r6, r5\n\t"
  97788. #endif
  97789. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97790. "adds r3, r3, r6\n\t"
  97791. #else
  97792. "add r3, r3, r6\n\t"
  97793. #endif
  97794. #ifdef WOLFSSL_KEIL
  97795. "adcs r4, r4, r7\n\t"
  97796. #elif defined(__clang__)
  97797. "adcs r4, r7\n\t"
  97798. #else
  97799. "adc r4, r7\n\t"
  97800. #endif
  97801. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97802. "lsrs r6, %[mp], #16\n\t"
  97803. #else
  97804. "lsr r6, %[mp], #16\n\t"
  97805. #endif
  97806. #ifdef WOLFSSL_KEIL
  97807. "muls r5, r6, r5\n\t"
  97808. #elif defined(__clang__)
  97809. "muls r5, r6\n\t"
  97810. #else
  97811. "mul r5, r6\n\t"
  97812. #endif
  97813. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97814. "lsrs r6, r5, #16\n\t"
  97815. #else
  97816. "lsr r6, r5, #16\n\t"
  97817. #endif
  97818. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97819. "lsls r5, r5, #16\n\t"
  97820. #else
  97821. "lsl r5, r5, #16\n\t"
  97822. #endif
  97823. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97824. "adds r3, r3, r5\n\t"
  97825. #else
  97826. "add r3, r3, r5\n\t"
  97827. #endif
  97828. #ifdef WOLFSSL_KEIL
  97829. "adcs r4, r4, r6\n\t"
  97830. #elif defined(__clang__)
  97831. "adcs r4, r6\n\t"
  97832. #else
  97833. "adc r4, r6\n\t"
  97834. #endif
  97835. "mov r5, r10\n\t"
  97836. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97837. "lsrs r6, %[mp], #16\n\t"
  97838. #else
  97839. "lsr r6, %[mp], #16\n\t"
  97840. #endif
  97841. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97842. "lsrs r5, r5, #16\n\t"
  97843. #else
  97844. "lsr r5, r5, #16\n\t"
  97845. #endif
  97846. #ifdef WOLFSSL_KEIL
  97847. "muls r6, r5, r6\n\t"
  97848. #elif defined(__clang__)
  97849. "muls r6, r5\n\t"
  97850. #else
  97851. "mul r6, r5\n\t"
  97852. #endif
  97853. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97854. "adds r4, r4, r6\n\t"
  97855. #else
  97856. "add r4, r4, r6\n\t"
  97857. #endif
  97858. "uxth r6, %[mp]\n\t"
  97859. #ifdef WOLFSSL_KEIL
  97860. "muls r5, r6, r5\n\t"
  97861. #elif defined(__clang__)
  97862. "muls r5, r6\n\t"
  97863. #else
  97864. "mul r5, r6\n\t"
  97865. #endif
  97866. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97867. "lsrs r6, r5, #16\n\t"
  97868. #else
  97869. "lsr r6, r5, #16\n\t"
  97870. #endif
  97871. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97872. "lsls r5, r5, #16\n\t"
  97873. #else
  97874. "lsl r5, r5, #16\n\t"
  97875. #endif
  97876. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97877. "adds r3, r3, r5\n\t"
  97878. #else
  97879. "add r3, r3, r5\n\t"
  97880. #endif
  97881. #ifdef WOLFSSL_KEIL
  97882. "adcs r4, r4, r6\n\t"
  97883. #elif defined(__clang__)
  97884. "adcs r4, r6\n\t"
  97885. #else
  97886. "adc r4, r6\n\t"
  97887. #endif
  97888. "# Multiply m[j] and mu - Done\n\t"
  97889. "stm %[a]!, {r3}\n\t"
  97890. "cmp %[a], r9\n\t"
  97891. "blt L_sp_256_mont_reduce_order_8_word_%=\n\t"
  97892. "# a[i+7] += m[7] * mu\n\t"
  97893. "ldr %[mp], [%[m]]\n\t"
  97894. "mov r3, r12\n\t"
  97895. "# Multiply m[7] and mu - Start\n\t"
  97896. "mov r5, r10\n\t"
  97897. "uxth r6, %[mp]\n\t"
  97898. "uxth r5, r5\n\t"
  97899. #ifdef WOLFSSL_KEIL
  97900. "muls r6, r5, r6\n\t"
  97901. #elif defined(__clang__)
  97902. "muls r6, r5\n\t"
  97903. #else
  97904. "mul r6, r5\n\t"
  97905. #endif
  97906. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97907. "adds r4, r4, r6\n\t"
  97908. #else
  97909. "add r4, r4, r6\n\t"
  97910. #endif
  97911. #ifdef WOLFSSL_KEIL
  97912. "adcs r3, r3, r7\n\t"
  97913. #elif defined(__clang__)
  97914. "adcs r3, r7\n\t"
  97915. #else
  97916. "adc r3, r7\n\t"
  97917. #endif
  97918. #ifdef WOLFSSL_KEIL
  97919. "adcs r7, r7, r7\n\t"
  97920. #elif defined(__clang__)
  97921. "adcs r7, r7\n\t"
  97922. #else
  97923. "adc r7, r7\n\t"
  97924. #endif
  97925. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97926. "lsrs r6, %[mp], #16\n\t"
  97927. #else
  97928. "lsr r6, %[mp], #16\n\t"
  97929. #endif
  97930. #ifdef WOLFSSL_KEIL
  97931. "muls r5, r6, r5\n\t"
  97932. #elif defined(__clang__)
  97933. "muls r5, r6\n\t"
  97934. #else
  97935. "mul r5, r6\n\t"
  97936. #endif
  97937. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97938. "lsrs r6, r5, #16\n\t"
  97939. #else
  97940. "lsr r6, r5, #16\n\t"
  97941. #endif
  97942. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97943. "lsls r5, r5, #16\n\t"
  97944. #else
  97945. "lsl r5, r5, #16\n\t"
  97946. #endif
  97947. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97948. "adds r4, r4, r5\n\t"
  97949. #else
  97950. "add r4, r4, r5\n\t"
  97951. #endif
  97952. #ifdef WOLFSSL_KEIL
  97953. "adcs r3, r3, r6\n\t"
  97954. #elif defined(__clang__)
  97955. "adcs r3, r6\n\t"
  97956. #else
  97957. "adc r3, r6\n\t"
  97958. #endif
  97959. #ifdef WOLFSSL_KEIL
  97960. "adcs r7, r7, r7\n\t"
  97961. #elif defined(__clang__)
  97962. "adcs r7, r7\n\t"
  97963. #else
  97964. "adc r7, r7\n\t"
  97965. #endif
  97966. "mov r5, r10\n\t"
  97967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97968. "lsrs r6, %[mp], #16\n\t"
  97969. #else
  97970. "lsr r6, %[mp], #16\n\t"
  97971. #endif
  97972. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97973. "lsrs r5, r5, #16\n\t"
  97974. #else
  97975. "lsr r5, r5, #16\n\t"
  97976. #endif
  97977. #ifdef WOLFSSL_KEIL
  97978. "muls r6, r5, r6\n\t"
  97979. #elif defined(__clang__)
  97980. "muls r6, r5\n\t"
  97981. #else
  97982. "mul r6, r5\n\t"
  97983. #endif
  97984. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97985. "adds r3, r3, r6\n\t"
  97986. #else
  97987. "add r3, r3, r6\n\t"
  97988. #endif
  97989. #ifdef WOLFSSL_KEIL
  97990. "adcs r7, r7, r7\n\t"
  97991. #elif defined(__clang__)
  97992. "adcs r7, r7\n\t"
  97993. #else
  97994. "adc r7, r7\n\t"
  97995. #endif
  97996. "uxth r6, %[mp]\n\t"
  97997. #ifdef WOLFSSL_KEIL
  97998. "muls r5, r6, r5\n\t"
  97999. #elif defined(__clang__)
  98000. "muls r5, r6\n\t"
  98001. #else
  98002. "mul r5, r6\n\t"
  98003. #endif
  98004. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98005. "lsrs r6, r5, #16\n\t"
  98006. #else
  98007. "lsr r6, r5, #16\n\t"
  98008. #endif
  98009. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98010. "lsls r5, r5, #16\n\t"
  98011. #else
  98012. "lsl r5, r5, #16\n\t"
  98013. #endif
  98014. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98015. "adds r4, r4, r5\n\t"
  98016. #else
  98017. "add r4, r4, r5\n\t"
  98018. #endif
  98019. #ifdef WOLFSSL_KEIL
  98020. "adcs r3, r3, r6\n\t"
  98021. #elif defined(__clang__)
  98022. "adcs r3, r6\n\t"
  98023. #else
  98024. "adc r3, r6\n\t"
  98025. #endif
  98026. #ifdef WOLFSSL_KEIL
  98027. "adcs r7, r7, r7\n\t"
  98028. #elif defined(__clang__)
  98029. "adcs r7, r7\n\t"
  98030. #else
  98031. "adc r7, r7\n\t"
  98032. #endif
  98033. "# Multiply m[7] and mu - Done\n\t"
  98034. "ldr r5, [%[a]]\n\t"
  98035. "ldr r6, [%[a], #4]\n\t"
  98036. "movs %[mp], #0\n\t"
  98037. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98038. "adds r5, r5, r4\n\t"
  98039. #else
  98040. "add r5, r5, r4\n\t"
  98041. #endif
  98042. #ifdef WOLFSSL_KEIL
  98043. "adcs r6, r6, r3\n\t"
  98044. #elif defined(__clang__)
  98045. "adcs r6, r3\n\t"
  98046. #else
  98047. "adc r6, r3\n\t"
  98048. #endif
  98049. #ifdef WOLFSSL_KEIL
  98050. "adcs r7, r7, %[mp]\n\t"
  98051. #elif defined(__clang__)
  98052. "adcs r7, %[mp]\n\t"
  98053. #else
  98054. "adc r7, %[mp]\n\t"
  98055. #endif
  98056. "stm %[a]!, {r5, r6}\n\t"
  98057. "# i += 1\n\t"
  98058. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98059. "subs %[a], %[a], #4\n\t"
  98060. #else
  98061. "sub %[a], %[a], #4\n\t"
  98062. #endif
  98063. "movs r3, #28\n\t"
  98064. "mov r9, %[a]\n\t"
  98065. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98066. "subs %[a], %[a], r3\n\t"
  98067. #else
  98068. "sub %[a], %[a], r3\n\t"
  98069. #endif
  98070. "mov r12, r7\n\t"
  98071. "mov %[m], lr\n\t"
  98072. "cmp r11, %[a]\n\t"
  98073. "bgt L_sp_256_mont_reduce_order_8_mod_%=\n\t"
  98074. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98075. "negs r7, r7\n\t"
  98076. #else
  98077. "neg r7, r7\n\t"
  98078. #endif
  98079. "# Subtract masked modulus\n\t"
  98080. "movs r4, #32\n\t"
  98081. "movs %[mp], #0\n\t"
  98082. "movs r3, #0\n\t"
  98083. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98084. "subs %[a], %[a], r4\n\t"
  98085. #else
  98086. "sub %[a], %[a], r4\n\t"
  98087. #endif
  98088. #ifndef WOLFSSL_SP_LARGE_CODE
  98089. "\n"
  98090. "L_sp_256_mont_reduce_order_8_sub_mask_%=:\n\t"
  98091. "ldm %[m]!, {r6}\n\t"
  98092. "movs r5, #0\n\t"
  98093. #ifdef WOLFSSL_KEIL
  98094. "ands r6, r6, r7\n\t"
  98095. #elif defined(__clang__)
  98096. "ands r6, r7\n\t"
  98097. #else
  98098. "and r6, r7\n\t"
  98099. #endif
  98100. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98101. "subs r5, r5, %[mp]\n\t"
  98102. #else
  98103. "sub r5, r5, %[mp]\n\t"
  98104. #endif
  98105. "ldr r5, [%[a], r4]\n\t"
  98106. #ifdef WOLFSSL_KEIL
  98107. "sbcs r5, r5, r6\n\t"
  98108. #elif defined(__clang__)
  98109. "sbcs r5, r6\n\t"
  98110. #else
  98111. "sbc r5, r6\n\t"
  98112. #endif
  98113. #ifdef WOLFSSL_KEIL
  98114. "sbcs %[mp], %[mp], %[mp]\n\t"
  98115. #elif defined(__clang__)
  98116. "sbcs %[mp], %[mp]\n\t"
  98117. #else
  98118. "sbc %[mp], %[mp]\n\t"
  98119. #endif
  98120. "stm %[a]!, {r5}\n\t"
  98121. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98122. "adds r3, r3, #4\n\t"
  98123. #else
  98124. "add r3, r3, #4\n\t"
  98125. #endif
  98126. "cmp r3, r4\n\t"
  98127. "blt L_sp_256_mont_reduce_order_8_sub_mask_%=\n\t"
  98128. #else /* WOLFSSL_SP_LARGE_CODE */
  98129. "ldm %[m]!, {r6}\n\t"
  98130. #ifdef WOLFSSL_KEIL
  98131. "ands r6, r6, r7\n\t"
  98132. #elif defined(__clang__)
  98133. "ands r6, r7\n\t"
  98134. #else
  98135. "and r6, r7\n\t"
  98136. #endif
  98137. "ldr r5, [%[a], r4]\n\t"
  98138. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98139. "subs r5, r5, r6\n\t"
  98140. #else
  98141. "sub r5, r5, r6\n\t"
  98142. #endif
  98143. "stm %[a]!, {r5}\n\t"
  98144. "ldm %[m]!, {r6}\n\t"
  98145. #ifdef WOLFSSL_KEIL
  98146. "ands r6, r6, r7\n\t"
  98147. #elif defined(__clang__)
  98148. "ands r6, r7\n\t"
  98149. #else
  98150. "and r6, r7\n\t"
  98151. #endif
  98152. "ldr r5, [%[a], r4]\n\t"
  98153. #ifdef WOLFSSL_KEIL
  98154. "sbcs r5, r5, r6\n\t"
  98155. #elif defined(__clang__)
  98156. "sbcs r5, r6\n\t"
  98157. #else
  98158. "sbc r5, r6\n\t"
  98159. #endif
  98160. "stm %[a]!, {r5}\n\t"
  98161. "ldm %[m]!, {r6}\n\t"
  98162. #ifdef WOLFSSL_KEIL
  98163. "ands r6, r6, r7\n\t"
  98164. #elif defined(__clang__)
  98165. "ands r6, r7\n\t"
  98166. #else
  98167. "and r6, r7\n\t"
  98168. #endif
  98169. "ldr r5, [%[a], r4]\n\t"
  98170. #ifdef WOLFSSL_KEIL
  98171. "sbcs r5, r5, r6\n\t"
  98172. #elif defined(__clang__)
  98173. "sbcs r5, r6\n\t"
  98174. #else
  98175. "sbc r5, r6\n\t"
  98176. #endif
  98177. "stm %[a]!, {r5}\n\t"
  98178. "ldm %[m]!, {r6}\n\t"
  98179. #ifdef WOLFSSL_KEIL
  98180. "ands r6, r6, r7\n\t"
  98181. #elif defined(__clang__)
  98182. "ands r6, r7\n\t"
  98183. #else
  98184. "and r6, r7\n\t"
  98185. #endif
  98186. "ldr r5, [%[a], r4]\n\t"
  98187. #ifdef WOLFSSL_KEIL
  98188. "sbcs r5, r5, r6\n\t"
  98189. #elif defined(__clang__)
  98190. "sbcs r5, r6\n\t"
  98191. #else
  98192. "sbc r5, r6\n\t"
  98193. #endif
  98194. "stm %[a]!, {r5}\n\t"
  98195. "ldm %[m]!, {r6}\n\t"
  98196. #ifdef WOLFSSL_KEIL
  98197. "ands r6, r6, r7\n\t"
  98198. #elif defined(__clang__)
  98199. "ands r6, r7\n\t"
  98200. #else
  98201. "and r6, r7\n\t"
  98202. #endif
  98203. "ldr r5, [%[a], r4]\n\t"
  98204. #ifdef WOLFSSL_KEIL
  98205. "sbcs r5, r5, r6\n\t"
  98206. #elif defined(__clang__)
  98207. "sbcs r5, r6\n\t"
  98208. #else
  98209. "sbc r5, r6\n\t"
  98210. #endif
  98211. "stm %[a]!, {r5}\n\t"
  98212. "ldm %[m]!, {r6}\n\t"
  98213. #ifdef WOLFSSL_KEIL
  98214. "ands r6, r6, r7\n\t"
  98215. #elif defined(__clang__)
  98216. "ands r6, r7\n\t"
  98217. #else
  98218. "and r6, r7\n\t"
  98219. #endif
  98220. "ldr r5, [%[a], r4]\n\t"
  98221. #ifdef WOLFSSL_KEIL
  98222. "sbcs r5, r5, r6\n\t"
  98223. #elif defined(__clang__)
  98224. "sbcs r5, r6\n\t"
  98225. #else
  98226. "sbc r5, r6\n\t"
  98227. #endif
  98228. "stm %[a]!, {r5}\n\t"
  98229. "ldm %[m]!, {r6}\n\t"
  98230. #ifdef WOLFSSL_KEIL
  98231. "ands r6, r6, r7\n\t"
  98232. #elif defined(__clang__)
  98233. "ands r6, r7\n\t"
  98234. #else
  98235. "and r6, r7\n\t"
  98236. #endif
  98237. "ldr r5, [%[a], r4]\n\t"
  98238. #ifdef WOLFSSL_KEIL
  98239. "sbcs r5, r5, r6\n\t"
  98240. #elif defined(__clang__)
  98241. "sbcs r5, r6\n\t"
  98242. #else
  98243. "sbc r5, r6\n\t"
  98244. #endif
  98245. "stm %[a]!, {r5}\n\t"
  98246. "ldm %[m]!, {r6}\n\t"
  98247. #ifdef WOLFSSL_KEIL
  98248. "ands r6, r6, r7\n\t"
  98249. #elif defined(__clang__)
  98250. "ands r6, r7\n\t"
  98251. #else
  98252. "and r6, r7\n\t"
  98253. #endif
  98254. "ldr r5, [%[a], r4]\n\t"
  98255. #ifdef WOLFSSL_KEIL
  98256. "sbcs r5, r5, r6\n\t"
  98257. #elif defined(__clang__)
  98258. "sbcs r5, r6\n\t"
  98259. #else
  98260. "sbc r5, r6\n\t"
  98261. #endif
  98262. "stm %[a]!, {r5}\n\t"
  98263. #endif /* WOLFSSL_SP_LARGE_CODE */
  98264. : [a] "+l" (a), [m] "+l" (m), [mp] "+l" (mp)
  98265. :
  98266. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr"
  98267. );
  98268. }
  98269. /* Multiply two Montgomery form numbers mod the modulus (prime).
  98270. * (r = a * b mod m)
  98271. *
  98272. * r Result of multiplication.
  98273. * a First number to multiply in Montgomery form.
  98274. * b Second number to multiply in Montgomery form.
  98275. * m Modulus (prime).
  98276. * mp Montgomery mulitplier.
  98277. */
  98278. SP_NOINLINE static void sp_256_mont_mul_8(sp_digit* r, const sp_digit* a,
  98279. const sp_digit* b, const sp_digit* m, sp_digit mp)
  98280. {
  98281. sp_256_mul_8(r, a, b);
  98282. sp_256_mont_reduce_8(r, m, mp);
  98283. }
  98284. /* Square the Montgomery form number. (r = a * a mod m)
  98285. *
  98286. * r Result of squaring.
  98287. * a Number to square in Montgomery form.
  98288. * m Modulus (prime).
  98289. * mp Montgomery mulitplier.
  98290. */
  98291. SP_NOINLINE static void sp_256_mont_sqr_8(sp_digit* r, const sp_digit* a,
  98292. const sp_digit* m, sp_digit mp)
  98293. {
  98294. sp_256_sqr_8(r, a);
  98295. sp_256_mont_reduce_8(r, m, mp);
  98296. }
  98297. #if !defined(WOLFSSL_SP_SMALL) || defined(HAVE_COMP_KEY)
  98298. /* Square the Montgomery form number a number of times. (r = a ^ n mod m)
  98299. *
  98300. * r Result of squaring.
  98301. * a Number to square in Montgomery form.
  98302. * n Number of times to square.
  98303. * m Modulus (prime).
  98304. * mp Montgomery mulitplier.
  98305. */
  98306. static void sp_256_mont_sqr_n_8(sp_digit* r, const sp_digit* a, int n,
  98307. const sp_digit* m, sp_digit mp)
  98308. {
  98309. sp_256_mont_sqr_8(r, a, m, mp);
  98310. for (; n > 1; n--) {
  98311. sp_256_mont_sqr_8(r, r, m, mp);
  98312. }
  98313. }
  98314. #endif /* !WOLFSSL_SP_SMALL || HAVE_COMP_KEY */
  98315. #ifdef WOLFSSL_SP_SMALL
  98316. /* Mod-2 for the P256 curve. */
  98317. static const uint32_t p256_mod_minus_2[8] = {
  98318. 0xfffffffdU,0xffffffffU,0xffffffffU,0x00000000U,0x00000000U,0x00000000U,
  98319. 0x00000001U,0xffffffffU
  98320. };
  98321. #endif /* !WOLFSSL_SP_SMALL */
  98322. /* Invert the number, in Montgomery form, modulo the modulus (prime) of the
  98323. * P256 curve. (r = 1 / a mod m)
  98324. *
  98325. * r Inverse result.
  98326. * a Number to invert.
  98327. * td Temporary data.
  98328. */
  98329. static void sp_256_mont_inv_8(sp_digit* r, const sp_digit* a, sp_digit* td)
  98330. {
  98331. #ifdef WOLFSSL_SP_SMALL
  98332. sp_digit* t = td;
  98333. int i;
  98334. XMEMCPY(t, a, sizeof(sp_digit) * 8);
  98335. for (i=254; i>=0; i--) {
  98336. sp_256_mont_sqr_8(t, t, p256_mod, p256_mp_mod);
  98337. if (p256_mod_minus_2[i / 32] & ((sp_digit)1 << (i % 32)))
  98338. sp_256_mont_mul_8(t, t, a, p256_mod, p256_mp_mod);
  98339. }
  98340. XMEMCPY(r, t, sizeof(sp_digit) * 8);
  98341. #else
  98342. sp_digit* t1 = td;
  98343. sp_digit* t2 = td + 2 * 8;
  98344. sp_digit* t3 = td + 4 * 8;
  98345. /* 0x2 */
  98346. sp_256_mont_sqr_8(t1, a, p256_mod, p256_mp_mod);
  98347. /* 0x3 */
  98348. sp_256_mont_mul_8(t2, t1, a, p256_mod, p256_mp_mod);
  98349. /* 0xc */
  98350. sp_256_mont_sqr_n_8(t1, t2, 2, p256_mod, p256_mp_mod);
  98351. /* 0xd */
  98352. sp_256_mont_mul_8(t3, t1, a, p256_mod, p256_mp_mod);
  98353. /* 0xf */
  98354. sp_256_mont_mul_8(t2, t2, t1, p256_mod, p256_mp_mod);
  98355. /* 0xf0 */
  98356. sp_256_mont_sqr_n_8(t1, t2, 4, p256_mod, p256_mp_mod);
  98357. /* 0xfd */
  98358. sp_256_mont_mul_8(t3, t3, t1, p256_mod, p256_mp_mod);
  98359. /* 0xff */
  98360. sp_256_mont_mul_8(t2, t2, t1, p256_mod, p256_mp_mod);
  98361. /* 0xff00 */
  98362. sp_256_mont_sqr_n_8(t1, t2, 8, p256_mod, p256_mp_mod);
  98363. /* 0xfffd */
  98364. sp_256_mont_mul_8(t3, t3, t1, p256_mod, p256_mp_mod);
  98365. /* 0xffff */
  98366. sp_256_mont_mul_8(t2, t2, t1, p256_mod, p256_mp_mod);
  98367. /* 0xffff0000 */
  98368. sp_256_mont_sqr_n_8(t1, t2, 16, p256_mod, p256_mp_mod);
  98369. /* 0xfffffffd */
  98370. sp_256_mont_mul_8(t3, t3, t1, p256_mod, p256_mp_mod);
  98371. /* 0xffffffff */
  98372. sp_256_mont_mul_8(t2, t2, t1, p256_mod, p256_mp_mod);
  98373. /* 0xffffffff00000000 */
  98374. sp_256_mont_sqr_n_8(t1, t2, 32, p256_mod, p256_mp_mod);
  98375. /* 0xffffffffffffffff */
  98376. sp_256_mont_mul_8(t2, t2, t1, p256_mod, p256_mp_mod);
  98377. /* 0xffffffff00000001 */
  98378. sp_256_mont_mul_8(r, t1, a, p256_mod, p256_mp_mod);
  98379. /* 0xffffffff000000010000000000000000000000000000000000000000 */
  98380. sp_256_mont_sqr_n_8(r, r, 160, p256_mod, p256_mp_mod);
  98381. /* 0xffffffff00000001000000000000000000000000ffffffffffffffff */
  98382. sp_256_mont_mul_8(r, r, t2, p256_mod, p256_mp_mod);
  98383. /* 0xffffffff00000001000000000000000000000000ffffffffffffffff00000000 */
  98384. sp_256_mont_sqr_n_8(r, r, 32, p256_mod, p256_mp_mod);
  98385. /* 0xffffffff00000001000000000000000000000000fffffffffffffffffffffffd */
  98386. sp_256_mont_mul_8(r, r, t3, p256_mod, p256_mp_mod);
  98387. #endif /* WOLFSSL_SP_SMALL */
  98388. }
  98389. /* Compare a with b in constant time.
  98390. *
  98391. * a A single precision integer.
  98392. * b A single precision integer.
  98393. * return -ve, 0 or +ve if a is less than, equal to or greater than b
  98394. * respectively.
  98395. */
  98396. SP_NOINLINE static sp_int32 sp_256_cmp_8(const sp_digit* a, const sp_digit* b)
  98397. {
  98398. __asm__ __volatile__ (
  98399. "movs r2, #0\n\t"
  98400. "movs r3, #0\n\t"
  98401. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98402. "mvns r3, r3\n\t"
  98403. #else
  98404. "mvn r3, r3\n\t"
  98405. #endif
  98406. "movs r6, #28\n\t"
  98407. "\n"
  98408. "L_sp_256_cmp_8_words_%=:\n\t"
  98409. "ldr r7, [%[a], r6]\n\t"
  98410. "ldr r5, [%[b], r6]\n\t"
  98411. #ifdef WOLFSSL_KEIL
  98412. "ands r7, r7, r3\n\t"
  98413. #elif defined(__clang__)
  98414. "ands r7, r3\n\t"
  98415. #else
  98416. "and r7, r3\n\t"
  98417. #endif
  98418. #ifdef WOLFSSL_KEIL
  98419. "ands r5, r5, r3\n\t"
  98420. #elif defined(__clang__)
  98421. "ands r5, r3\n\t"
  98422. #else
  98423. "and r5, r3\n\t"
  98424. #endif
  98425. "movs r4, r7\n\t"
  98426. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98427. "subs r7, r7, r5\n\t"
  98428. #else
  98429. "sub r7, r7, r5\n\t"
  98430. #endif
  98431. #ifdef WOLFSSL_KEIL
  98432. "sbcs r7, r7, r7\n\t"
  98433. #elif defined(__clang__)
  98434. "sbcs r7, r7\n\t"
  98435. #else
  98436. "sbc r7, r7\n\t"
  98437. #endif
  98438. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98439. "adds r2, r2, r7\n\t"
  98440. #else
  98441. "add r2, r2, r7\n\t"
  98442. #endif
  98443. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98444. "mvns r7, r7\n\t"
  98445. #else
  98446. "mvn r7, r7\n\t"
  98447. #endif
  98448. #ifdef WOLFSSL_KEIL
  98449. "ands r3, r3, r7\n\t"
  98450. #elif defined(__clang__)
  98451. "ands r3, r7\n\t"
  98452. #else
  98453. "and r3, r7\n\t"
  98454. #endif
  98455. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98456. "subs r5, r5, r4\n\t"
  98457. #else
  98458. "sub r5, r5, r4\n\t"
  98459. #endif
  98460. #ifdef WOLFSSL_KEIL
  98461. "sbcs r7, r7, r7\n\t"
  98462. #elif defined(__clang__)
  98463. "sbcs r7, r7\n\t"
  98464. #else
  98465. "sbc r7, r7\n\t"
  98466. #endif
  98467. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98468. "subs r2, r2, r7\n\t"
  98469. #else
  98470. "sub r2, r2, r7\n\t"
  98471. #endif
  98472. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98473. "mvns r7, r7\n\t"
  98474. #else
  98475. "mvn r7, r7\n\t"
  98476. #endif
  98477. #ifdef WOLFSSL_KEIL
  98478. "ands r3, r3, r7\n\t"
  98479. #elif defined(__clang__)
  98480. "ands r3, r7\n\t"
  98481. #else
  98482. "and r3, r7\n\t"
  98483. #endif
  98484. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98485. "subs r6, r6, #4\n\t"
  98486. #else
  98487. "sub r6, r6, #4\n\t"
  98488. #endif
  98489. "bge L_sp_256_cmp_8_words_%=\n\t"
  98490. "movs %[a], r2\n\t"
  98491. : [a] "+l" (a), [b] "+l" (b)
  98492. :
  98493. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  98494. );
  98495. return (uint32_t)(size_t)a;
  98496. }
  98497. /* Normalize the values in each word to 32.
  98498. *
  98499. * a Array of sp_digit to normalize.
  98500. */
  98501. #define sp_256_norm_8(a)
  98502. /* Map the Montgomery form projective coordinate point to an affine point.
  98503. *
  98504. * r Resulting affine coordinate point.
  98505. * p Montgomery form projective coordinate point.
  98506. * t Temporary ordinate data.
  98507. */
  98508. static void sp_256_map_8(sp_point_256* r, const sp_point_256* p,
  98509. sp_digit* t)
  98510. {
  98511. sp_digit* t1 = t;
  98512. sp_digit* t2 = t + 2*8;
  98513. sp_int32 n;
  98514. sp_256_mont_inv_8(t1, p->z, t + 2*8);
  98515. sp_256_mont_sqr_8(t2, t1, p256_mod, p256_mp_mod);
  98516. sp_256_mont_mul_8(t1, t2, t1, p256_mod, p256_mp_mod);
  98517. /* x /= z^2 */
  98518. sp_256_mont_mul_8(r->x, p->x, t2, p256_mod, p256_mp_mod);
  98519. XMEMSET(r->x + 8, 0, sizeof(r->x) / 2U);
  98520. sp_256_mont_reduce_8(r->x, p256_mod, p256_mp_mod);
  98521. /* Reduce x to less than modulus */
  98522. n = sp_256_cmp_8(r->x, p256_mod);
  98523. sp_256_cond_sub_8(r->x, r->x, p256_mod, ~(n >> 31));
  98524. sp_256_norm_8(r->x);
  98525. /* y /= z^3 */
  98526. sp_256_mont_mul_8(r->y, p->y, t1, p256_mod, p256_mp_mod);
  98527. XMEMSET(r->y + 8, 0, sizeof(r->y) / 2U);
  98528. sp_256_mont_reduce_8(r->y, p256_mod, p256_mp_mod);
  98529. /* Reduce y to less than modulus */
  98530. n = sp_256_cmp_8(r->y, p256_mod);
  98531. sp_256_cond_sub_8(r->y, r->y, p256_mod, ~(n >> 31));
  98532. sp_256_norm_8(r->y);
  98533. XMEMSET(r->z, 0, sizeof(r->z) / 2);
  98534. r->z[0] = 1;
  98535. }
  98536. /* Add two Montgomery form numbers (r = a + b % m).
  98537. *
  98538. * r Result of addition.
  98539. * a First number to add in Montgomery form.
  98540. * b Second number to add in Montgomery form.
  98541. * m Modulus (prime).
  98542. */
  98543. SP_NOINLINE static void sp_256_mont_add_8(sp_digit* r, const sp_digit* a,
  98544. const sp_digit* b, const sp_digit* m)
  98545. {
  98546. (void)m;
  98547. __asm__ __volatile__ (
  98548. "movs r3, #0\n\t"
  98549. "ldr r4, [%[a]]\n\t"
  98550. "ldr r5, [%[a], #4]\n\t"
  98551. "ldr r6, [%[b]]\n\t"
  98552. "ldr r7, [%[b], #4]\n\t"
  98553. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98554. "adds r4, r4, r6\n\t"
  98555. #else
  98556. "add r4, r4, r6\n\t"
  98557. #endif
  98558. #ifdef WOLFSSL_KEIL
  98559. "adcs r5, r5, r7\n\t"
  98560. #elif defined(__clang__)
  98561. "adcs r5, r7\n\t"
  98562. #else
  98563. "adc r5, r7\n\t"
  98564. #endif
  98565. "str r4, [%[r]]\n\t"
  98566. "str r5, [%[r], #4]\n\t"
  98567. "ldr r4, [%[a], #8]\n\t"
  98568. "ldr r5, [%[a], #12]\n\t"
  98569. "ldr r6, [%[b], #8]\n\t"
  98570. "ldr r7, [%[b], #12]\n\t"
  98571. #ifdef WOLFSSL_KEIL
  98572. "adcs r4, r4, r6\n\t"
  98573. #elif defined(__clang__)
  98574. "adcs r4, r6\n\t"
  98575. #else
  98576. "adc r4, r6\n\t"
  98577. #endif
  98578. #ifdef WOLFSSL_KEIL
  98579. "adcs r5, r5, r7\n\t"
  98580. #elif defined(__clang__)
  98581. "adcs r5, r7\n\t"
  98582. #else
  98583. "adc r5, r7\n\t"
  98584. #endif
  98585. "str r4, [%[r], #8]\n\t"
  98586. "str r5, [%[r], #12]\n\t"
  98587. "ldr r4, [%[a], #16]\n\t"
  98588. "ldr r5, [%[a], #20]\n\t"
  98589. "ldr r6, [%[b], #16]\n\t"
  98590. "ldr r7, [%[b], #20]\n\t"
  98591. #ifdef WOLFSSL_KEIL
  98592. "adcs r4, r4, r6\n\t"
  98593. #elif defined(__clang__)
  98594. "adcs r4, r6\n\t"
  98595. #else
  98596. "adc r4, r6\n\t"
  98597. #endif
  98598. #ifdef WOLFSSL_KEIL
  98599. "adcs r5, r5, r7\n\t"
  98600. #elif defined(__clang__)
  98601. "adcs r5, r7\n\t"
  98602. #else
  98603. "adc r5, r7\n\t"
  98604. #endif
  98605. "mov r8, r4\n\t"
  98606. "mov r9, r5\n\t"
  98607. "ldr r4, [%[a], #24]\n\t"
  98608. "ldr r5, [%[a], #28]\n\t"
  98609. "ldr r6, [%[b], #24]\n\t"
  98610. "ldr r7, [%[b], #28]\n\t"
  98611. #ifdef WOLFSSL_KEIL
  98612. "adcs r4, r4, r6\n\t"
  98613. #elif defined(__clang__)
  98614. "adcs r4, r6\n\t"
  98615. #else
  98616. "adc r4, r6\n\t"
  98617. #endif
  98618. #ifdef WOLFSSL_KEIL
  98619. "adcs r5, r5, r7\n\t"
  98620. #elif defined(__clang__)
  98621. "adcs r5, r7\n\t"
  98622. #else
  98623. "adc r5, r7\n\t"
  98624. #endif
  98625. "mov r10, r4\n\t"
  98626. "mov r11, r5\n\t"
  98627. #ifdef WOLFSSL_KEIL
  98628. "adcs r3, r3, r3\n\t"
  98629. #elif defined(__clang__)
  98630. "adcs r3, r3\n\t"
  98631. #else
  98632. "adc r3, r3\n\t"
  98633. #endif
  98634. "movs r6, r3\n\t"
  98635. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98636. "subs r3, r3, #1\n\t"
  98637. #else
  98638. "sub r3, r3, #1\n\t"
  98639. #endif
  98640. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98641. "mvns r3, r3\n\t"
  98642. #else
  98643. "mvn r3, r3\n\t"
  98644. #endif
  98645. "movs r7, #0\n\t"
  98646. "ldr r4, [%[r]]\n\t"
  98647. "ldr r5, [%[r], #4]\n\t"
  98648. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98649. "subs r4, r4, r3\n\t"
  98650. #else
  98651. "sub r4, r4, r3\n\t"
  98652. #endif
  98653. #ifdef WOLFSSL_KEIL
  98654. "sbcs r5, r5, r3\n\t"
  98655. #elif defined(__clang__)
  98656. "sbcs r5, r3\n\t"
  98657. #else
  98658. "sbc r5, r3\n\t"
  98659. #endif
  98660. "str r4, [%[r]]\n\t"
  98661. "str r5, [%[r], #4]\n\t"
  98662. "ldr r4, [%[r], #8]\n\t"
  98663. "ldr r5, [%[r], #12]\n\t"
  98664. #ifdef WOLFSSL_KEIL
  98665. "sbcs r4, r4, r3\n\t"
  98666. #elif defined(__clang__)
  98667. "sbcs r4, r3\n\t"
  98668. #else
  98669. "sbc r4, r3\n\t"
  98670. #endif
  98671. #ifdef WOLFSSL_KEIL
  98672. "sbcs r5, r5, r7\n\t"
  98673. #elif defined(__clang__)
  98674. "sbcs r5, r7\n\t"
  98675. #else
  98676. "sbc r5, r7\n\t"
  98677. #endif
  98678. "str r4, [%[r], #8]\n\t"
  98679. "str r5, [%[r], #12]\n\t"
  98680. "mov r4, r8\n\t"
  98681. "mov r5, r9\n\t"
  98682. #ifdef WOLFSSL_KEIL
  98683. "sbcs r4, r4, r7\n\t"
  98684. #elif defined(__clang__)
  98685. "sbcs r4, r7\n\t"
  98686. #else
  98687. "sbc r4, r7\n\t"
  98688. #endif
  98689. #ifdef WOLFSSL_KEIL
  98690. "sbcs r5, r5, r7\n\t"
  98691. #elif defined(__clang__)
  98692. "sbcs r5, r7\n\t"
  98693. #else
  98694. "sbc r5, r7\n\t"
  98695. #endif
  98696. "str r4, [%[r], #16]\n\t"
  98697. "str r5, [%[r], #20]\n\t"
  98698. "mov r4, r10\n\t"
  98699. "mov r5, r11\n\t"
  98700. #ifdef WOLFSSL_KEIL
  98701. "sbcs r4, r4, r6\n\t"
  98702. #elif defined(__clang__)
  98703. "sbcs r4, r6\n\t"
  98704. #else
  98705. "sbc r4, r6\n\t"
  98706. #endif
  98707. #ifdef WOLFSSL_KEIL
  98708. "sbcs r5, r5, r3\n\t"
  98709. #elif defined(__clang__)
  98710. "sbcs r5, r3\n\t"
  98711. #else
  98712. "sbc r5, r3\n\t"
  98713. #endif
  98714. "str r4, [%[r], #24]\n\t"
  98715. "str r5, [%[r], #28]\n\t"
  98716. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  98717. :
  98718. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11"
  98719. );
  98720. }
  98721. /* Double a Montgomery form number (r = a + a % m).
  98722. *
  98723. * r Result of doubling.
  98724. * a Number to double in Montgomery form.
  98725. * m Modulus (prime).
  98726. */
  98727. SP_NOINLINE static void sp_256_mont_dbl_8(sp_digit* r, const sp_digit* a,
  98728. const sp_digit* m)
  98729. {
  98730. (void)m;
  98731. __asm__ __volatile__ (
  98732. "ldr r4, [%[a]]\n\t"
  98733. "ldr r5, [%[a], #4]\n\t"
  98734. "ldr r6, [%[a], #8]\n\t"
  98735. "ldr r7, [%[a], #12]\n\t"
  98736. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98737. "adds r4, r4, r4\n\t"
  98738. #else
  98739. "add r4, r4, r4\n\t"
  98740. #endif
  98741. #ifdef WOLFSSL_KEIL
  98742. "adcs r5, r5, r5\n\t"
  98743. #elif defined(__clang__)
  98744. "adcs r5, r5\n\t"
  98745. #else
  98746. "adc r5, r5\n\t"
  98747. #endif
  98748. #ifdef WOLFSSL_KEIL
  98749. "adcs r6, r6, r6\n\t"
  98750. #elif defined(__clang__)
  98751. "adcs r6, r6\n\t"
  98752. #else
  98753. "adc r6, r6\n\t"
  98754. #endif
  98755. #ifdef WOLFSSL_KEIL
  98756. "adcs r7, r7, r7\n\t"
  98757. #elif defined(__clang__)
  98758. "adcs r7, r7\n\t"
  98759. #else
  98760. "adc r7, r7\n\t"
  98761. #endif
  98762. "str r4, [%[r]]\n\t"
  98763. "str r5, [%[r], #4]\n\t"
  98764. "str r6, [%[r], #8]\n\t"
  98765. "str r7, [%[r], #12]\n\t"
  98766. "ldr r4, [%[a], #16]\n\t"
  98767. "ldr r5, [%[a], #20]\n\t"
  98768. "ldr r6, [%[a], #24]\n\t"
  98769. "ldr r7, [%[a], #28]\n\t"
  98770. #ifdef WOLFSSL_KEIL
  98771. "adcs r4, r4, r4\n\t"
  98772. #elif defined(__clang__)
  98773. "adcs r4, r4\n\t"
  98774. #else
  98775. "adc r4, r4\n\t"
  98776. #endif
  98777. #ifdef WOLFSSL_KEIL
  98778. "adcs r5, r5, r5\n\t"
  98779. #elif defined(__clang__)
  98780. "adcs r5, r5\n\t"
  98781. #else
  98782. "adc r5, r5\n\t"
  98783. #endif
  98784. #ifdef WOLFSSL_KEIL
  98785. "adcs r6, r6, r6\n\t"
  98786. #elif defined(__clang__)
  98787. "adcs r6, r6\n\t"
  98788. #else
  98789. "adc r6, r6\n\t"
  98790. #endif
  98791. #ifdef WOLFSSL_KEIL
  98792. "adcs r7, r7, r7\n\t"
  98793. #elif defined(__clang__)
  98794. "adcs r7, r7\n\t"
  98795. #else
  98796. "adc r7, r7\n\t"
  98797. #endif
  98798. "mov r8, r4\n\t"
  98799. "mov r9, r5\n\t"
  98800. "mov r10, r6\n\t"
  98801. "mov r11, r7\n\t"
  98802. "movs r3, #0\n\t"
  98803. "movs r7, #0\n\t"
  98804. #ifdef WOLFSSL_KEIL
  98805. "adcs r3, r3, r3\n\t"
  98806. #elif defined(__clang__)
  98807. "adcs r3, r3\n\t"
  98808. #else
  98809. "adc r3, r3\n\t"
  98810. #endif
  98811. "movs r2, r3\n\t"
  98812. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98813. "subs r3, r3, #1\n\t"
  98814. #else
  98815. "sub r3, r3, #1\n\t"
  98816. #endif
  98817. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98818. "mvns r3, r3\n\t"
  98819. #else
  98820. "mvn r3, r3\n\t"
  98821. #endif
  98822. "ldr r4, [%[r]]\n\t"
  98823. "ldr r5, [%[r], #4]\n\t"
  98824. "ldr r6, [%[r], #8]\n\t"
  98825. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98826. "subs r4, r4, r3\n\t"
  98827. #else
  98828. "sub r4, r4, r3\n\t"
  98829. #endif
  98830. #ifdef WOLFSSL_KEIL
  98831. "sbcs r5, r5, r3\n\t"
  98832. #elif defined(__clang__)
  98833. "sbcs r5, r3\n\t"
  98834. #else
  98835. "sbc r5, r3\n\t"
  98836. #endif
  98837. #ifdef WOLFSSL_KEIL
  98838. "sbcs r6, r6, r3\n\t"
  98839. #elif defined(__clang__)
  98840. "sbcs r6, r3\n\t"
  98841. #else
  98842. "sbc r6, r3\n\t"
  98843. #endif
  98844. "str r4, [%[r]]\n\t"
  98845. "str r5, [%[r], #4]\n\t"
  98846. "str r6, [%[r], #8]\n\t"
  98847. "ldr r4, [%[r], #12]\n\t"
  98848. "mov r5, r8\n\t"
  98849. "mov r6, r9\n\t"
  98850. #ifdef WOLFSSL_KEIL
  98851. "sbcs r4, r4, r7\n\t"
  98852. #elif defined(__clang__)
  98853. "sbcs r4, r7\n\t"
  98854. #else
  98855. "sbc r4, r7\n\t"
  98856. #endif
  98857. #ifdef WOLFSSL_KEIL
  98858. "sbcs r5, r5, r7\n\t"
  98859. #elif defined(__clang__)
  98860. "sbcs r5, r7\n\t"
  98861. #else
  98862. "sbc r5, r7\n\t"
  98863. #endif
  98864. #ifdef WOLFSSL_KEIL
  98865. "sbcs r6, r6, r7\n\t"
  98866. #elif defined(__clang__)
  98867. "sbcs r6, r7\n\t"
  98868. #else
  98869. "sbc r6, r7\n\t"
  98870. #endif
  98871. "str r4, [%[r], #12]\n\t"
  98872. "str r5, [%[r], #16]\n\t"
  98873. "str r6, [%[r], #20]\n\t"
  98874. "mov r4, r10\n\t"
  98875. "mov r5, r11\n\t"
  98876. #ifdef WOLFSSL_KEIL
  98877. "sbcs r4, r4, r2\n\t"
  98878. #elif defined(__clang__)
  98879. "sbcs r4, r2\n\t"
  98880. #else
  98881. "sbc r4, r2\n\t"
  98882. #endif
  98883. #ifdef WOLFSSL_KEIL
  98884. "sbcs r5, r5, r3\n\t"
  98885. #elif defined(__clang__)
  98886. "sbcs r5, r3\n\t"
  98887. #else
  98888. "sbc r5, r3\n\t"
  98889. #endif
  98890. "str r4, [%[r], #24]\n\t"
  98891. "str r5, [%[r], #28]\n\t"
  98892. : [r] "+l" (r), [a] "+l" (a)
  98893. :
  98894. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11"
  98895. );
  98896. }
  98897. /* Triple a Montgomery form number (r = a + a + a % m).
  98898. *
  98899. * r Result of Tripling.
  98900. * a Number to triple in Montgomery form.
  98901. * m Modulus (prime).
  98902. */
  98903. SP_NOINLINE static void sp_256_mont_tpl_8(sp_digit* r, const sp_digit* a,
  98904. const sp_digit* m)
  98905. {
  98906. (void)m;
  98907. __asm__ __volatile__ (
  98908. "ldr r6, [%[a]]\n\t"
  98909. "ldr r7, [%[a], #4]\n\t"
  98910. "ldr r4, [%[a], #8]\n\t"
  98911. "ldr r5, [%[a], #12]\n\t"
  98912. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98913. "adds r6, r6, r6\n\t"
  98914. #else
  98915. "add r6, r6, r6\n\t"
  98916. #endif
  98917. #ifdef WOLFSSL_KEIL
  98918. "adcs r7, r7, r7\n\t"
  98919. #elif defined(__clang__)
  98920. "adcs r7, r7\n\t"
  98921. #else
  98922. "adc r7, r7\n\t"
  98923. #endif
  98924. #ifdef WOLFSSL_KEIL
  98925. "adcs r4, r4, r4\n\t"
  98926. #elif defined(__clang__)
  98927. "adcs r4, r4\n\t"
  98928. #else
  98929. "adc r4, r4\n\t"
  98930. #endif
  98931. #ifdef WOLFSSL_KEIL
  98932. "adcs r5, r5, r5\n\t"
  98933. #elif defined(__clang__)
  98934. "adcs r5, r5\n\t"
  98935. #else
  98936. "adc r5, r5\n\t"
  98937. #endif
  98938. "mov r8, r4\n\t"
  98939. "mov r9, r5\n\t"
  98940. "ldr r2, [%[a], #16]\n\t"
  98941. "ldr r3, [%[a], #20]\n\t"
  98942. "ldr r4, [%[a], #24]\n\t"
  98943. "ldr r5, [%[a], #28]\n\t"
  98944. #ifdef WOLFSSL_KEIL
  98945. "adcs r2, r2, r2\n\t"
  98946. #elif defined(__clang__)
  98947. "adcs r2, r2\n\t"
  98948. #else
  98949. "adc r2, r2\n\t"
  98950. #endif
  98951. #ifdef WOLFSSL_KEIL
  98952. "adcs r3, r3, r3\n\t"
  98953. #elif defined(__clang__)
  98954. "adcs r3, r3\n\t"
  98955. #else
  98956. "adc r3, r3\n\t"
  98957. #endif
  98958. #ifdef WOLFSSL_KEIL
  98959. "adcs r4, r4, r4\n\t"
  98960. #elif defined(__clang__)
  98961. "adcs r4, r4\n\t"
  98962. #else
  98963. "adc r4, r4\n\t"
  98964. #endif
  98965. #ifdef WOLFSSL_KEIL
  98966. "adcs r5, r5, r5\n\t"
  98967. #elif defined(__clang__)
  98968. "adcs r5, r5\n\t"
  98969. #else
  98970. "adc r5, r5\n\t"
  98971. #endif
  98972. "mov r10, r2\n\t"
  98973. "mov r11, r3\n\t"
  98974. "mov r12, r4\n\t"
  98975. "mov lr, r5\n\t"
  98976. "movs r3, #0\n\t"
  98977. "movs r5, #0\n\t"
  98978. #ifdef WOLFSSL_KEIL
  98979. "adcs r3, r3, r3\n\t"
  98980. #elif defined(__clang__)
  98981. "adcs r3, r3\n\t"
  98982. #else
  98983. "adc r3, r3\n\t"
  98984. #endif
  98985. "movs r4, r3\n\t"
  98986. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98987. "subs r3, r3, #1\n\t"
  98988. #else
  98989. "sub r3, r3, #1\n\t"
  98990. #endif
  98991. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98992. "mvns r3, r3\n\t"
  98993. #else
  98994. "mvn r3, r3\n\t"
  98995. #endif
  98996. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98997. "subs r6, r6, r3\n\t"
  98998. #else
  98999. "sub r6, r6, r3\n\t"
  99000. #endif
  99001. #ifdef WOLFSSL_KEIL
  99002. "sbcs r7, r7, r3\n\t"
  99003. #elif defined(__clang__)
  99004. "sbcs r7, r3\n\t"
  99005. #else
  99006. "sbc r7, r3\n\t"
  99007. #endif
  99008. "mov r2, r8\n\t"
  99009. #ifdef WOLFSSL_KEIL
  99010. "sbcs r2, r2, r3\n\t"
  99011. #elif defined(__clang__)
  99012. "sbcs r2, r3\n\t"
  99013. #else
  99014. "sbc r2, r3\n\t"
  99015. #endif
  99016. "mov r8, r2\n\t"
  99017. "mov r2, r9\n\t"
  99018. #ifdef WOLFSSL_KEIL
  99019. "sbcs r2, r2, r5\n\t"
  99020. #elif defined(__clang__)
  99021. "sbcs r2, r5\n\t"
  99022. #else
  99023. "sbc r2, r5\n\t"
  99024. #endif
  99025. "mov r9, r2\n\t"
  99026. "mov r2, r10\n\t"
  99027. #ifdef WOLFSSL_KEIL
  99028. "sbcs r2, r2, r5\n\t"
  99029. #elif defined(__clang__)
  99030. "sbcs r2, r5\n\t"
  99031. #else
  99032. "sbc r2, r5\n\t"
  99033. #endif
  99034. "mov r10, r2\n\t"
  99035. "mov r2, r11\n\t"
  99036. #ifdef WOLFSSL_KEIL
  99037. "sbcs r2, r2, r5\n\t"
  99038. #elif defined(__clang__)
  99039. "sbcs r2, r5\n\t"
  99040. #else
  99041. "sbc r2, r5\n\t"
  99042. #endif
  99043. "mov r11, r2\n\t"
  99044. "mov r2, r12\n\t"
  99045. #ifdef WOLFSSL_KEIL
  99046. "sbcs r2, r2, r4\n\t"
  99047. #elif defined(__clang__)
  99048. "sbcs r2, r4\n\t"
  99049. #else
  99050. "sbc r2, r4\n\t"
  99051. #endif
  99052. "mov r12, r2\n\t"
  99053. "mov r2, lr\n\t"
  99054. #ifdef WOLFSSL_KEIL
  99055. "sbcs r2, r2, r3\n\t"
  99056. #elif defined(__clang__)
  99057. "sbcs r2, r3\n\t"
  99058. #else
  99059. "sbc r2, r3\n\t"
  99060. #endif
  99061. "mov lr, r2\n\t"
  99062. "ldr r2, [%[a]]\n\t"
  99063. "ldr r3, [%[a], #4]\n\t"
  99064. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99065. "adds r6, r6, r2\n\t"
  99066. #else
  99067. "add r6, r6, r2\n\t"
  99068. #endif
  99069. #ifdef WOLFSSL_KEIL
  99070. "adcs r7, r7, r3\n\t"
  99071. #elif defined(__clang__)
  99072. "adcs r7, r3\n\t"
  99073. #else
  99074. "adc r7, r3\n\t"
  99075. #endif
  99076. "ldr r2, [%[a], #8]\n\t"
  99077. "ldr r3, [%[a], #12]\n\t"
  99078. "mov r4, r8\n\t"
  99079. "mov r5, r9\n\t"
  99080. #ifdef WOLFSSL_KEIL
  99081. "adcs r2, r2, r4\n\t"
  99082. #elif defined(__clang__)
  99083. "adcs r2, r4\n\t"
  99084. #else
  99085. "adc r2, r4\n\t"
  99086. #endif
  99087. #ifdef WOLFSSL_KEIL
  99088. "adcs r3, r3, r5\n\t"
  99089. #elif defined(__clang__)
  99090. "adcs r3, r5\n\t"
  99091. #else
  99092. "adc r3, r5\n\t"
  99093. #endif
  99094. "mov r8, r2\n\t"
  99095. "mov r9, r3\n\t"
  99096. "ldr r2, [%[a], #16]\n\t"
  99097. "ldr r3, [%[a], #20]\n\t"
  99098. "mov r4, r10\n\t"
  99099. "mov r5, r11\n\t"
  99100. #ifdef WOLFSSL_KEIL
  99101. "adcs r2, r2, r4\n\t"
  99102. #elif defined(__clang__)
  99103. "adcs r2, r4\n\t"
  99104. #else
  99105. "adc r2, r4\n\t"
  99106. #endif
  99107. #ifdef WOLFSSL_KEIL
  99108. "adcs r3, r3, r5\n\t"
  99109. #elif defined(__clang__)
  99110. "adcs r3, r5\n\t"
  99111. #else
  99112. "adc r3, r5\n\t"
  99113. #endif
  99114. "mov r10, r2\n\t"
  99115. "mov r11, r3\n\t"
  99116. "ldr r2, [%[a], #24]\n\t"
  99117. "ldr r3, [%[a], #28]\n\t"
  99118. "mov r4, r12\n\t"
  99119. "mov r5, lr\n\t"
  99120. #ifdef WOLFSSL_KEIL
  99121. "adcs r2, r2, r4\n\t"
  99122. #elif defined(__clang__)
  99123. "adcs r2, r4\n\t"
  99124. #else
  99125. "adc r2, r4\n\t"
  99126. #endif
  99127. #ifdef WOLFSSL_KEIL
  99128. "adcs r3, r3, r5\n\t"
  99129. #elif defined(__clang__)
  99130. "adcs r3, r5\n\t"
  99131. #else
  99132. "adc r3, r5\n\t"
  99133. #endif
  99134. "mov r12, r2\n\t"
  99135. "mov lr, r3\n\t"
  99136. "movs r3, #0\n\t"
  99137. "movs r5, #0\n\t"
  99138. #ifdef WOLFSSL_KEIL
  99139. "adcs r3, r3, r3\n\t"
  99140. #elif defined(__clang__)
  99141. "adcs r3, r3\n\t"
  99142. #else
  99143. "adc r3, r3\n\t"
  99144. #endif
  99145. "movs r4, r3\n\t"
  99146. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99147. "subs r3, r3, #1\n\t"
  99148. #else
  99149. "sub r3, r3, #1\n\t"
  99150. #endif
  99151. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99152. "mvns r3, r3\n\t"
  99153. #else
  99154. "mvn r3, r3\n\t"
  99155. #endif
  99156. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99157. "subs r6, r6, r3\n\t"
  99158. #else
  99159. "sub r6, r6, r3\n\t"
  99160. #endif
  99161. "str r6, [%[r]]\n\t"
  99162. #ifdef WOLFSSL_KEIL
  99163. "sbcs r7, r7, r3\n\t"
  99164. #elif defined(__clang__)
  99165. "sbcs r7, r3\n\t"
  99166. #else
  99167. "sbc r7, r3\n\t"
  99168. #endif
  99169. "str r7, [%[r], #4]\n\t"
  99170. "mov r2, r8\n\t"
  99171. #ifdef WOLFSSL_KEIL
  99172. "sbcs r2, r2, r3\n\t"
  99173. #elif defined(__clang__)
  99174. "sbcs r2, r3\n\t"
  99175. #else
  99176. "sbc r2, r3\n\t"
  99177. #endif
  99178. "str r2, [%[r], #8]\n\t"
  99179. "mov r2, r9\n\t"
  99180. #ifdef WOLFSSL_KEIL
  99181. "sbcs r2, r2, r5\n\t"
  99182. #elif defined(__clang__)
  99183. "sbcs r2, r5\n\t"
  99184. #else
  99185. "sbc r2, r5\n\t"
  99186. #endif
  99187. "str r2, [%[r], #12]\n\t"
  99188. "mov r2, r10\n\t"
  99189. #ifdef WOLFSSL_KEIL
  99190. "sbcs r2, r2, r5\n\t"
  99191. #elif defined(__clang__)
  99192. "sbcs r2, r5\n\t"
  99193. #else
  99194. "sbc r2, r5\n\t"
  99195. #endif
  99196. "str r2, [%[r], #16]\n\t"
  99197. "mov r2, r11\n\t"
  99198. #ifdef WOLFSSL_KEIL
  99199. "sbcs r2, r2, r5\n\t"
  99200. #elif defined(__clang__)
  99201. "sbcs r2, r5\n\t"
  99202. #else
  99203. "sbc r2, r5\n\t"
  99204. #endif
  99205. "str r2, [%[r], #20]\n\t"
  99206. "mov r2, r12\n\t"
  99207. #ifdef WOLFSSL_KEIL
  99208. "sbcs r2, r2, r4\n\t"
  99209. #elif defined(__clang__)
  99210. "sbcs r2, r4\n\t"
  99211. #else
  99212. "sbc r2, r4\n\t"
  99213. #endif
  99214. "str r2, [%[r], #24]\n\t"
  99215. "mov r2, lr\n\t"
  99216. #ifdef WOLFSSL_KEIL
  99217. "sbcs r2, r2, r3\n\t"
  99218. #elif defined(__clang__)
  99219. "sbcs r2, r3\n\t"
  99220. #else
  99221. "sbc r2, r3\n\t"
  99222. #endif
  99223. "str r2, [%[r], #28]\n\t"
  99224. : [r] "+l" (r), [a] "+l" (a)
  99225. :
  99226. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr"
  99227. );
  99228. }
  99229. /* Subtract two Montgomery form numbers (r = a - b % m).
  99230. *
  99231. * r Result of subtration.
  99232. * a Number to subtract from in Montgomery form.
  99233. * b Number to subtract with in Montgomery form.
  99234. * m Modulus (prime).
  99235. */
  99236. SP_NOINLINE static void sp_256_mont_sub_8(sp_digit* r, const sp_digit* a,
  99237. const sp_digit* b, const sp_digit* m)
  99238. {
  99239. (void)m;
  99240. __asm__ __volatile__ (
  99241. "ldr r4, [%[a]]\n\t"
  99242. "ldr r5, [%[a], #4]\n\t"
  99243. "ldr r6, [%[b]]\n\t"
  99244. "ldr r7, [%[b], #4]\n\t"
  99245. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99246. "subs r4, r4, r6\n\t"
  99247. #else
  99248. "sub r4, r4, r6\n\t"
  99249. #endif
  99250. #ifdef WOLFSSL_KEIL
  99251. "sbcs r5, r5, r7\n\t"
  99252. #elif defined(__clang__)
  99253. "sbcs r5, r7\n\t"
  99254. #else
  99255. "sbc r5, r7\n\t"
  99256. #endif
  99257. "str r4, [%[r]]\n\t"
  99258. "str r5, [%[r], #4]\n\t"
  99259. "ldr r4, [%[a], #8]\n\t"
  99260. "ldr r5, [%[a], #12]\n\t"
  99261. "ldr r6, [%[b], #8]\n\t"
  99262. "ldr r7, [%[b], #12]\n\t"
  99263. #ifdef WOLFSSL_KEIL
  99264. "sbcs r4, r4, r6\n\t"
  99265. #elif defined(__clang__)
  99266. "sbcs r4, r6\n\t"
  99267. #else
  99268. "sbc r4, r6\n\t"
  99269. #endif
  99270. #ifdef WOLFSSL_KEIL
  99271. "sbcs r5, r5, r7\n\t"
  99272. #elif defined(__clang__)
  99273. "sbcs r5, r7\n\t"
  99274. #else
  99275. "sbc r5, r7\n\t"
  99276. #endif
  99277. "str r4, [%[r], #8]\n\t"
  99278. "str r5, [%[r], #12]\n\t"
  99279. "ldr r4, [%[a], #16]\n\t"
  99280. "ldr r5, [%[a], #20]\n\t"
  99281. "ldr r6, [%[b], #16]\n\t"
  99282. "ldr r7, [%[b], #20]\n\t"
  99283. #ifdef WOLFSSL_KEIL
  99284. "sbcs r4, r4, r6\n\t"
  99285. #elif defined(__clang__)
  99286. "sbcs r4, r6\n\t"
  99287. #else
  99288. "sbc r4, r6\n\t"
  99289. #endif
  99290. #ifdef WOLFSSL_KEIL
  99291. "sbcs r5, r5, r7\n\t"
  99292. #elif defined(__clang__)
  99293. "sbcs r5, r7\n\t"
  99294. #else
  99295. "sbc r5, r7\n\t"
  99296. #endif
  99297. "mov r8, r4\n\t"
  99298. "mov r9, r5\n\t"
  99299. "ldr r4, [%[a], #24]\n\t"
  99300. "ldr r5, [%[a], #28]\n\t"
  99301. "ldr r6, [%[b], #24]\n\t"
  99302. "ldr r7, [%[b], #28]\n\t"
  99303. #ifdef WOLFSSL_KEIL
  99304. "sbcs r4, r4, r6\n\t"
  99305. #elif defined(__clang__)
  99306. "sbcs r4, r6\n\t"
  99307. #else
  99308. "sbc r4, r6\n\t"
  99309. #endif
  99310. #ifdef WOLFSSL_KEIL
  99311. "sbcs r5, r5, r7\n\t"
  99312. #elif defined(__clang__)
  99313. "sbcs r5, r7\n\t"
  99314. #else
  99315. "sbc r5, r7\n\t"
  99316. #endif
  99317. "mov r10, r4\n\t"
  99318. "mov r11, r5\n\t"
  99319. #ifdef WOLFSSL_KEIL
  99320. "sbcs r3, r3, r3\n\t"
  99321. #elif defined(__clang__)
  99322. "sbcs r3, r3\n\t"
  99323. #else
  99324. "sbc r3, r3\n\t"
  99325. #endif
  99326. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99327. "lsrs r7, r3, #31\n\t"
  99328. #else
  99329. "lsr r7, r3, #31\n\t"
  99330. #endif
  99331. "movs r6, #0\n\t"
  99332. "ldr r4, [%[r]]\n\t"
  99333. "ldr r5, [%[r], #4]\n\t"
  99334. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99335. "adds r4, r4, r3\n\t"
  99336. #else
  99337. "add r4, r4, r3\n\t"
  99338. #endif
  99339. #ifdef WOLFSSL_KEIL
  99340. "adcs r5, r5, r3\n\t"
  99341. #elif defined(__clang__)
  99342. "adcs r5, r3\n\t"
  99343. #else
  99344. "adc r5, r3\n\t"
  99345. #endif
  99346. "str r4, [%[r]]\n\t"
  99347. "str r5, [%[r], #4]\n\t"
  99348. "ldr r4, [%[r], #8]\n\t"
  99349. "ldr r5, [%[r], #12]\n\t"
  99350. #ifdef WOLFSSL_KEIL
  99351. "adcs r4, r4, r3\n\t"
  99352. #elif defined(__clang__)
  99353. "adcs r4, r3\n\t"
  99354. #else
  99355. "adc r4, r3\n\t"
  99356. #endif
  99357. #ifdef WOLFSSL_KEIL
  99358. "adcs r5, r5, r6\n\t"
  99359. #elif defined(__clang__)
  99360. "adcs r5, r6\n\t"
  99361. #else
  99362. "adc r5, r6\n\t"
  99363. #endif
  99364. "str r4, [%[r], #8]\n\t"
  99365. "str r5, [%[r], #12]\n\t"
  99366. "mov r4, r8\n\t"
  99367. "mov r5, r9\n\t"
  99368. #ifdef WOLFSSL_KEIL
  99369. "adcs r4, r4, r6\n\t"
  99370. #elif defined(__clang__)
  99371. "adcs r4, r6\n\t"
  99372. #else
  99373. "adc r4, r6\n\t"
  99374. #endif
  99375. #ifdef WOLFSSL_KEIL
  99376. "adcs r5, r5, r6\n\t"
  99377. #elif defined(__clang__)
  99378. "adcs r5, r6\n\t"
  99379. #else
  99380. "adc r5, r6\n\t"
  99381. #endif
  99382. "str r4, [%[r], #16]\n\t"
  99383. "str r5, [%[r], #20]\n\t"
  99384. "mov r4, r10\n\t"
  99385. "mov r5, r11\n\t"
  99386. #ifdef WOLFSSL_KEIL
  99387. "adcs r4, r4, r7\n\t"
  99388. #elif defined(__clang__)
  99389. "adcs r4, r7\n\t"
  99390. #else
  99391. "adc r4, r7\n\t"
  99392. #endif
  99393. #ifdef WOLFSSL_KEIL
  99394. "adcs r5, r5, r3\n\t"
  99395. #elif defined(__clang__)
  99396. "adcs r5, r3\n\t"
  99397. #else
  99398. "adc r5, r3\n\t"
  99399. #endif
  99400. "str r4, [%[r], #24]\n\t"
  99401. "str r5, [%[r], #28]\n\t"
  99402. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  99403. :
  99404. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11"
  99405. );
  99406. }
  99407. #define sp_256_mont_sub_lower_8 sp_256_mont_sub_8
  99408. /* Divide the number by 2 mod the modulus (prime). (r = a / 2 % m)
  99409. *
  99410. * r Result of division by 2.
  99411. * a Number to divide.
  99412. * m Modulus (prime).
  99413. */
  99414. SP_NOINLINE static void sp_256_div2_8(sp_digit* r, const sp_digit* a,
  99415. const sp_digit* m)
  99416. {
  99417. (void)m;
  99418. __asm__ __volatile__ (
  99419. "ldr r6, [%[a]]\n\t"
  99420. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99421. "lsls r6, r6, #31\n\t"
  99422. #else
  99423. "lsl r6, r6, #31\n\t"
  99424. #endif
  99425. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99426. "lsrs r6, r6, #31\n\t"
  99427. #else
  99428. "lsr r6, r6, #31\n\t"
  99429. #endif
  99430. "movs r4, #0\n\t"
  99431. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99432. "subs r4, r4, r6\n\t"
  99433. #else
  99434. "sub r4, r4, r6\n\t"
  99435. #endif
  99436. "movs r6, #0\n\t"
  99437. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99438. "lsls r5, r4, #31\n\t"
  99439. #else
  99440. "lsl r5, r4, #31\n\t"
  99441. #endif
  99442. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99443. "lsrs r5, r5, #31\n\t"
  99444. #else
  99445. "lsr r5, r5, #31\n\t"
  99446. #endif
  99447. "ldr r2, [%[a]]\n\t"
  99448. "ldr r3, [%[a], #4]\n\t"
  99449. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99450. "adds r2, r2, r4\n\t"
  99451. #else
  99452. "add r2, r2, r4\n\t"
  99453. #endif
  99454. #ifdef WOLFSSL_KEIL
  99455. "adcs r3, r3, r4\n\t"
  99456. #elif defined(__clang__)
  99457. "adcs r3, r4\n\t"
  99458. #else
  99459. "adc r3, r4\n\t"
  99460. #endif
  99461. "str r2, [%[r]]\n\t"
  99462. "str r3, [%[r], #4]\n\t"
  99463. "ldr r2, [%[a], #8]\n\t"
  99464. "ldr r3, [%[a], #12]\n\t"
  99465. #ifdef WOLFSSL_KEIL
  99466. "adcs r2, r2, r4\n\t"
  99467. #elif defined(__clang__)
  99468. "adcs r2, r4\n\t"
  99469. #else
  99470. "adc r2, r4\n\t"
  99471. #endif
  99472. #ifdef WOLFSSL_KEIL
  99473. "adcs r3, r3, r6\n\t"
  99474. #elif defined(__clang__)
  99475. "adcs r3, r6\n\t"
  99476. #else
  99477. "adc r3, r6\n\t"
  99478. #endif
  99479. "str r2, [%[r], #8]\n\t"
  99480. "str r3, [%[r], #12]\n\t"
  99481. "ldr r2, [%[a], #16]\n\t"
  99482. "ldr r3, [%[a], #20]\n\t"
  99483. #ifdef WOLFSSL_KEIL
  99484. "adcs r2, r2, r6\n\t"
  99485. #elif defined(__clang__)
  99486. "adcs r2, r6\n\t"
  99487. #else
  99488. "adc r2, r6\n\t"
  99489. #endif
  99490. #ifdef WOLFSSL_KEIL
  99491. "adcs r3, r3, r6\n\t"
  99492. #elif defined(__clang__)
  99493. "adcs r3, r6\n\t"
  99494. #else
  99495. "adc r3, r6\n\t"
  99496. #endif
  99497. "str r2, [%[r], #16]\n\t"
  99498. "str r3, [%[r], #20]\n\t"
  99499. "ldr r2, [%[a], #24]\n\t"
  99500. "ldr r3, [%[a], #28]\n\t"
  99501. #ifdef WOLFSSL_KEIL
  99502. "adcs r2, r2, r5\n\t"
  99503. #elif defined(__clang__)
  99504. "adcs r2, r5\n\t"
  99505. #else
  99506. "adc r2, r5\n\t"
  99507. #endif
  99508. #ifdef WOLFSSL_KEIL
  99509. "adcs r3, r3, r4\n\t"
  99510. #elif defined(__clang__)
  99511. "adcs r3, r4\n\t"
  99512. #else
  99513. "adc r3, r4\n\t"
  99514. #endif
  99515. #ifdef WOLFSSL_KEIL
  99516. "adcs r6, r6, r6\n\t"
  99517. #elif defined(__clang__)
  99518. "adcs r6, r6\n\t"
  99519. #else
  99520. "adc r6, r6\n\t"
  99521. #endif
  99522. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99523. "lsls r6, r6, #31\n\t"
  99524. #else
  99525. "lsl r6, r6, #31\n\t"
  99526. #endif
  99527. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99528. "lsrs r4, r2, #1\n\t"
  99529. #else
  99530. "lsr r4, r2, #1\n\t"
  99531. #endif
  99532. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99533. "lsls r2, r2, #31\n\t"
  99534. #else
  99535. "lsl r2, r2, #31\n\t"
  99536. #endif
  99537. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99538. "lsrs r5, r3, #1\n\t"
  99539. #else
  99540. "lsr r5, r3, #1\n\t"
  99541. #endif
  99542. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99543. "lsls r3, r3, #31\n\t"
  99544. #else
  99545. "lsl r3, r3, #31\n\t"
  99546. #endif
  99547. #ifdef WOLFSSL_KEIL
  99548. "orrs r4, r4, r3\n\t"
  99549. #elif defined(__clang__)
  99550. "orrs r4, r3\n\t"
  99551. #else
  99552. "orr r4, r3\n\t"
  99553. #endif
  99554. #ifdef WOLFSSL_KEIL
  99555. "orrs r5, r5, r6\n\t"
  99556. #elif defined(__clang__)
  99557. "orrs r5, r6\n\t"
  99558. #else
  99559. "orr r5, r6\n\t"
  99560. #endif
  99561. "movs r6, r2\n\t"
  99562. "str r4, [%[r], #24]\n\t"
  99563. "str r5, [%[r], #28]\n\t"
  99564. "ldr r2, [%[r], #16]\n\t"
  99565. "ldr r3, [%[r], #20]\n\t"
  99566. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99567. "lsrs r4, r2, #1\n\t"
  99568. #else
  99569. "lsr r4, r2, #1\n\t"
  99570. #endif
  99571. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99572. "lsls r2, r2, #31\n\t"
  99573. #else
  99574. "lsl r2, r2, #31\n\t"
  99575. #endif
  99576. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99577. "lsrs r5, r3, #1\n\t"
  99578. #else
  99579. "lsr r5, r3, #1\n\t"
  99580. #endif
  99581. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99582. "lsls r3, r3, #31\n\t"
  99583. #else
  99584. "lsl r3, r3, #31\n\t"
  99585. #endif
  99586. #ifdef WOLFSSL_KEIL
  99587. "orrs r4, r4, r3\n\t"
  99588. #elif defined(__clang__)
  99589. "orrs r4, r3\n\t"
  99590. #else
  99591. "orr r4, r3\n\t"
  99592. #endif
  99593. #ifdef WOLFSSL_KEIL
  99594. "orrs r5, r5, r6\n\t"
  99595. #elif defined(__clang__)
  99596. "orrs r5, r6\n\t"
  99597. #else
  99598. "orr r5, r6\n\t"
  99599. #endif
  99600. "movs r6, r2\n\t"
  99601. "str r4, [%[r], #16]\n\t"
  99602. "str r5, [%[r], #20]\n\t"
  99603. "ldr r2, [%[r], #8]\n\t"
  99604. "ldr r3, [%[r], #12]\n\t"
  99605. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99606. "lsrs r4, r2, #1\n\t"
  99607. #else
  99608. "lsr r4, r2, #1\n\t"
  99609. #endif
  99610. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99611. "lsls r2, r2, #31\n\t"
  99612. #else
  99613. "lsl r2, r2, #31\n\t"
  99614. #endif
  99615. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99616. "lsrs r5, r3, #1\n\t"
  99617. #else
  99618. "lsr r5, r3, #1\n\t"
  99619. #endif
  99620. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99621. "lsls r3, r3, #31\n\t"
  99622. #else
  99623. "lsl r3, r3, #31\n\t"
  99624. #endif
  99625. #ifdef WOLFSSL_KEIL
  99626. "orrs r4, r4, r3\n\t"
  99627. #elif defined(__clang__)
  99628. "orrs r4, r3\n\t"
  99629. #else
  99630. "orr r4, r3\n\t"
  99631. #endif
  99632. #ifdef WOLFSSL_KEIL
  99633. "orrs r5, r5, r6\n\t"
  99634. #elif defined(__clang__)
  99635. "orrs r5, r6\n\t"
  99636. #else
  99637. "orr r5, r6\n\t"
  99638. #endif
  99639. "movs r6, r2\n\t"
  99640. "str r4, [%[r], #8]\n\t"
  99641. "str r5, [%[r], #12]\n\t"
  99642. "ldr r2, [%[r]]\n\t"
  99643. "ldr r3, [%[r], #4]\n\t"
  99644. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99645. "lsrs r4, r2, #1\n\t"
  99646. #else
  99647. "lsr r4, r2, #1\n\t"
  99648. #endif
  99649. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99650. "lsrs r5, r3, #1\n\t"
  99651. #else
  99652. "lsr r5, r3, #1\n\t"
  99653. #endif
  99654. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99655. "lsls r3, r3, #31\n\t"
  99656. #else
  99657. "lsl r3, r3, #31\n\t"
  99658. #endif
  99659. #ifdef WOLFSSL_KEIL
  99660. "orrs r4, r4, r3\n\t"
  99661. #elif defined(__clang__)
  99662. "orrs r4, r3\n\t"
  99663. #else
  99664. "orr r4, r3\n\t"
  99665. #endif
  99666. #ifdef WOLFSSL_KEIL
  99667. "orrs r5, r5, r6\n\t"
  99668. #elif defined(__clang__)
  99669. "orrs r5, r6\n\t"
  99670. #else
  99671. "orr r5, r6\n\t"
  99672. #endif
  99673. "str r4, [%[r]]\n\t"
  99674. "str r5, [%[r], #4]\n\t"
  99675. : [r] "+l" (r), [a] "+l" (a)
  99676. :
  99677. : "memory", "r2", "r3", "r4", "r5", "r6"
  99678. );
  99679. }
  99680. /* Double the Montgomery form projective point p.
  99681. *
  99682. * r Result of doubling point.
  99683. * p Point to double.
  99684. * t Temporary ordinate data.
  99685. */
  99686. #ifdef WOLFSSL_SP_NONBLOCK
  99687. typedef struct sp_256_proj_point_dbl_8_ctx {
  99688. int state;
  99689. sp_digit* t1;
  99690. sp_digit* t2;
  99691. sp_digit* x;
  99692. sp_digit* y;
  99693. sp_digit* z;
  99694. } sp_256_proj_point_dbl_8_ctx;
  99695. 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)
  99696. {
  99697. int err = FP_WOULDBLOCK;
  99698. sp_256_proj_point_dbl_8_ctx* ctx = (sp_256_proj_point_dbl_8_ctx*)sp_ctx->data;
  99699. typedef char ctx_size_test[sizeof(sp_256_proj_point_dbl_8_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  99700. (void)sizeof(ctx_size_test);
  99701. switch (ctx->state) {
  99702. case 0:
  99703. ctx->t1 = t;
  99704. ctx->t2 = t + 2*8;
  99705. ctx->x = r->x;
  99706. ctx->y = r->y;
  99707. ctx->z = r->z;
  99708. /* Put infinity into result. */
  99709. if (r != p) {
  99710. r->infinity = p->infinity;
  99711. }
  99712. ctx->state = 1;
  99713. break;
  99714. case 1:
  99715. /* T1 = Z * Z */
  99716. sp_256_mont_sqr_8(ctx->t1, p->z, p256_mod, p256_mp_mod);
  99717. ctx->state = 2;
  99718. break;
  99719. case 2:
  99720. /* Z = Y * Z */
  99721. sp_256_mont_mul_8(ctx->z, p->y, p->z, p256_mod, p256_mp_mod);
  99722. ctx->state = 3;
  99723. break;
  99724. case 3:
  99725. /* Z = 2Z */
  99726. sp_256_mont_dbl_8(ctx->z, ctx->z, p256_mod);
  99727. ctx->state = 4;
  99728. break;
  99729. case 4:
  99730. /* T2 = X - T1 */
  99731. sp_256_mont_sub_8(ctx->t2, p->x, ctx->t1, p256_mod);
  99732. ctx->state = 5;
  99733. break;
  99734. case 5:
  99735. /* T1 = X + T1 */
  99736. sp_256_mont_add_8(ctx->t1, p->x, ctx->t1, p256_mod);
  99737. ctx->state = 6;
  99738. break;
  99739. case 6:
  99740. /* T2 = T1 * T2 */
  99741. sp_256_mont_mul_8(ctx->t2, ctx->t1, ctx->t2, p256_mod, p256_mp_mod);
  99742. ctx->state = 7;
  99743. break;
  99744. case 7:
  99745. /* T1 = 3T2 */
  99746. sp_256_mont_tpl_8(ctx->t1, ctx->t2, p256_mod);
  99747. ctx->state = 8;
  99748. break;
  99749. case 8:
  99750. /* Y = 2Y */
  99751. sp_256_mont_dbl_8(ctx->y, p->y, p256_mod);
  99752. ctx->state = 9;
  99753. break;
  99754. case 9:
  99755. /* Y = Y * Y */
  99756. sp_256_mont_sqr_8(ctx->y, ctx->y, p256_mod, p256_mp_mod);
  99757. ctx->state = 10;
  99758. break;
  99759. case 10:
  99760. /* T2 = Y * Y */
  99761. sp_256_mont_sqr_8(ctx->t2, ctx->y, p256_mod, p256_mp_mod);
  99762. ctx->state = 11;
  99763. break;
  99764. case 11:
  99765. /* T2 = T2/2 */
  99766. sp_256_div2_8(ctx->t2, ctx->t2, p256_mod);
  99767. ctx->state = 12;
  99768. break;
  99769. case 12:
  99770. /* Y = Y * X */
  99771. sp_256_mont_mul_8(ctx->y, ctx->y, p->x, p256_mod, p256_mp_mod);
  99772. ctx->state = 13;
  99773. break;
  99774. case 13:
  99775. /* X = T1 * T1 */
  99776. sp_256_mont_sqr_8(ctx->x, ctx->t1, p256_mod, p256_mp_mod);
  99777. ctx->state = 14;
  99778. break;
  99779. case 14:
  99780. /* X = X - Y */
  99781. sp_256_mont_sub_8(ctx->x, ctx->x, ctx->y, p256_mod);
  99782. ctx->state = 15;
  99783. break;
  99784. case 15:
  99785. /* X = X - Y */
  99786. sp_256_mont_sub_8(ctx->x, ctx->x, ctx->y, p256_mod);
  99787. ctx->state = 16;
  99788. break;
  99789. case 16:
  99790. /* Y = Y - X */
  99791. sp_256_mont_sub_lower_8(ctx->y, ctx->y, ctx->x, p256_mod);
  99792. ctx->state = 17;
  99793. break;
  99794. case 17:
  99795. /* Y = Y * T1 */
  99796. sp_256_mont_mul_8(ctx->y, ctx->y, ctx->t1, p256_mod, p256_mp_mod);
  99797. ctx->state = 18;
  99798. break;
  99799. case 18:
  99800. /* Y = Y - T2 */
  99801. sp_256_mont_sub_8(ctx->y, ctx->y, ctx->t2, p256_mod);
  99802. ctx->state = 19;
  99803. /* fall-through */
  99804. case 19:
  99805. err = MP_OKAY;
  99806. break;
  99807. }
  99808. if (err == MP_OKAY && ctx->state != 19) {
  99809. err = FP_WOULDBLOCK;
  99810. }
  99811. return err;
  99812. }
  99813. #endif /* WOLFSSL_SP_NONBLOCK */
  99814. static void sp_256_proj_point_dbl_8(sp_point_256* r, const sp_point_256* p,
  99815. sp_digit* t)
  99816. {
  99817. sp_digit* t1 = t;
  99818. sp_digit* t2 = t + 2*8;
  99819. sp_digit* x;
  99820. sp_digit* y;
  99821. sp_digit* z;
  99822. x = r->x;
  99823. y = r->y;
  99824. z = r->z;
  99825. /* Put infinity into result. */
  99826. if (r != p) {
  99827. r->infinity = p->infinity;
  99828. }
  99829. /* T1 = Z * Z */
  99830. sp_256_mont_sqr_8(t1, p->z, p256_mod, p256_mp_mod);
  99831. /* Z = Y * Z */
  99832. sp_256_mont_mul_8(z, p->y, p->z, p256_mod, p256_mp_mod);
  99833. /* Z = 2Z */
  99834. sp_256_mont_dbl_8(z, z, p256_mod);
  99835. /* T2 = X - T1 */
  99836. sp_256_mont_sub_8(t2, p->x, t1, p256_mod);
  99837. /* T1 = X + T1 */
  99838. sp_256_mont_add_8(t1, p->x, t1, p256_mod);
  99839. /* T2 = T1 * T2 */
  99840. sp_256_mont_mul_8(t2, t1, t2, p256_mod, p256_mp_mod);
  99841. /* T1 = 3T2 */
  99842. sp_256_mont_tpl_8(t1, t2, p256_mod);
  99843. /* Y = 2Y */
  99844. sp_256_mont_dbl_8(y, p->y, p256_mod);
  99845. /* Y = Y * Y */
  99846. sp_256_mont_sqr_8(y, y, p256_mod, p256_mp_mod);
  99847. /* T2 = Y * Y */
  99848. sp_256_mont_sqr_8(t2, y, p256_mod, p256_mp_mod);
  99849. /* T2 = T2/2 */
  99850. sp_256_div2_8(t2, t2, p256_mod);
  99851. /* Y = Y * X */
  99852. sp_256_mont_mul_8(y, y, p->x, p256_mod, p256_mp_mod);
  99853. /* X = T1 * T1 */
  99854. sp_256_mont_sqr_8(x, t1, p256_mod, p256_mp_mod);
  99855. /* X = X - Y */
  99856. sp_256_mont_sub_8(x, x, y, p256_mod);
  99857. /* X = X - Y */
  99858. sp_256_mont_sub_8(x, x, y, p256_mod);
  99859. /* Y = Y - X */
  99860. sp_256_mont_sub_lower_8(y, y, x, p256_mod);
  99861. /* Y = Y * T1 */
  99862. sp_256_mont_mul_8(y, y, t1, p256_mod, p256_mp_mod);
  99863. /* Y = Y - T2 */
  99864. sp_256_mont_sub_8(y, y, t2, p256_mod);
  99865. }
  99866. /* Compare two numbers to determine if they are equal.
  99867. * Constant time implementation.
  99868. *
  99869. * a First number to compare.
  99870. * b Second number to compare.
  99871. * returns 1 when equal and 0 otherwise.
  99872. */
  99873. static int sp_256_cmp_equal_8(const sp_digit* a, const sp_digit* b)
  99874. {
  99875. return ((a[0] ^ b[0]) | (a[1] ^ b[1]) | (a[2] ^ b[2]) |
  99876. (a[3] ^ b[3]) | (a[4] ^ b[4]) | (a[5] ^ b[5]) |
  99877. (a[6] ^ b[6]) | (a[7] ^ b[7])) == 0;
  99878. }
  99879. /* Returns 1 if the number of zero.
  99880. * Implementation is constant time.
  99881. *
  99882. * a Number to check.
  99883. * returns 1 if the number is zero and 0 otherwise.
  99884. */
  99885. static int sp_256_iszero_8(const sp_digit* a)
  99886. {
  99887. return (a[0] | a[1] | a[2] | a[3] | a[4] | a[5] | a[6] | a[7]) == 0;
  99888. }
  99889. /* Add two Montgomery form projective points.
  99890. *
  99891. * r Result of addition.
  99892. * p First point to add.
  99893. * q Second point to add.
  99894. * t Temporary ordinate data.
  99895. */
  99896. #ifdef WOLFSSL_SP_NONBLOCK
  99897. typedef struct sp_256_proj_point_add_8_ctx {
  99898. int state;
  99899. sp_256_proj_point_dbl_8_ctx dbl_ctx;
  99900. const sp_point_256* ap[2];
  99901. sp_point_256* rp[2];
  99902. sp_digit* t1;
  99903. sp_digit* t2;
  99904. sp_digit* t3;
  99905. sp_digit* t4;
  99906. sp_digit* t5;
  99907. sp_digit* t6;
  99908. sp_digit* x;
  99909. sp_digit* y;
  99910. sp_digit* z;
  99911. } sp_256_proj_point_add_8_ctx;
  99912. static int sp_256_proj_point_add_8_nb(sp_ecc_ctx_t* sp_ctx, sp_point_256* r,
  99913. const sp_point_256* p, const sp_point_256* q, sp_digit* t)
  99914. {
  99915. int err = FP_WOULDBLOCK;
  99916. sp_256_proj_point_add_8_ctx* ctx = (sp_256_proj_point_add_8_ctx*)sp_ctx->data;
  99917. /* Ensure only the first point is the same as the result. */
  99918. if (q == r) {
  99919. const sp_point_256* a = p;
  99920. p = q;
  99921. q = a;
  99922. }
  99923. typedef char ctx_size_test[sizeof(sp_256_proj_point_add_8_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  99924. (void)sizeof(ctx_size_test);
  99925. switch (ctx->state) {
  99926. case 0: /* INIT */
  99927. ctx->t1 = t;
  99928. ctx->t2 = t + 2*8;
  99929. ctx->t3 = t + 4*8;
  99930. ctx->t4 = t + 6*8;
  99931. ctx->t5 = t + 8*8;
  99932. ctx->t6 = t + 10*8;
  99933. ctx->x = ctx->t6;
  99934. ctx->y = ctx->t1;
  99935. ctx->z = ctx->t2;
  99936. ctx->state = 1;
  99937. break;
  99938. case 1:
  99939. /* Check double */
  99940. (void)sp_256_sub_8(ctx->t1, p256_mod, q->y);
  99941. sp_256_norm_8(ctx->t1);
  99942. if ((~p->infinity & ~q->infinity &
  99943. sp_256_cmp_equal_8(p->x, q->x) & sp_256_cmp_equal_8(p->z, q->z) &
  99944. (sp_256_cmp_equal_8(p->y, q->y) | sp_256_cmp_equal_8(p->y, ctx->t1))) != 0)
  99945. {
  99946. XMEMSET(&ctx->dbl_ctx, 0, sizeof(ctx->dbl_ctx));
  99947. ctx->state = 2;
  99948. }
  99949. else {
  99950. ctx->state = 3;
  99951. }
  99952. break;
  99953. case 2:
  99954. err = sp_256_proj_point_dbl_8_nb((sp_ecc_ctx_t*)&ctx->dbl_ctx, r, p, t);
  99955. if (err == MP_OKAY)
  99956. ctx->state = 27; /* done */
  99957. break;
  99958. case 3:
  99959. {
  99960. ctx->state = 4;
  99961. break;
  99962. }
  99963. case 4:
  99964. /* U1 = X1*Z2^2 */
  99965. sp_256_mont_sqr_8(ctx->t1, q->z, p256_mod, p256_mp_mod);
  99966. ctx->state = 5;
  99967. break;
  99968. case 5:
  99969. sp_256_mont_mul_8(ctx->t3, ctx->t1, q->z, p256_mod, p256_mp_mod);
  99970. ctx->state = 6;
  99971. break;
  99972. case 6:
  99973. sp_256_mont_mul_8(ctx->t1, ctx->t1, p->x, p256_mod, p256_mp_mod);
  99974. ctx->state = 7;
  99975. break;
  99976. case 7:
  99977. /* U2 = X2*Z1^2 */
  99978. sp_256_mont_sqr_8(ctx->t2, p->z, p256_mod, p256_mp_mod);
  99979. ctx->state = 8;
  99980. break;
  99981. case 8:
  99982. sp_256_mont_mul_8(ctx->t4, ctx->t2, p->z, p256_mod, p256_mp_mod);
  99983. ctx->state = 9;
  99984. break;
  99985. case 9:
  99986. sp_256_mont_mul_8(ctx->t2, ctx->t2, q->x, p256_mod, p256_mp_mod);
  99987. ctx->state = 10;
  99988. break;
  99989. case 10:
  99990. /* S1 = Y1*Z2^3 */
  99991. sp_256_mont_mul_8(ctx->t3, ctx->t3, p->y, p256_mod, p256_mp_mod);
  99992. ctx->state = 11;
  99993. break;
  99994. case 11:
  99995. /* S2 = Y2*Z1^3 */
  99996. sp_256_mont_mul_8(ctx->t4, ctx->t4, q->y, p256_mod, p256_mp_mod);
  99997. ctx->state = 12;
  99998. break;
  99999. case 12:
  100000. /* H = U2 - U1 */
  100001. sp_256_mont_sub_8(ctx->t2, ctx->t2, ctx->t1, p256_mod);
  100002. ctx->state = 13;
  100003. break;
  100004. case 13:
  100005. /* R = S2 - S1 */
  100006. sp_256_mont_sub_8(ctx->t4, ctx->t4, ctx->t3, p256_mod);
  100007. ctx->state = 14;
  100008. break;
  100009. case 14:
  100010. /* X3 = R^2 - H^3 - 2*U1*H^2 */
  100011. sp_256_mont_sqr_8(ctx->t5, ctx->t2, p256_mod, p256_mp_mod);
  100012. ctx->state = 15;
  100013. break;
  100014. case 15:
  100015. sp_256_mont_mul_8(ctx->y, ctx->t1, ctx->t5, p256_mod, p256_mp_mod);
  100016. ctx->state = 16;
  100017. break;
  100018. case 16:
  100019. sp_256_mont_mul_8(ctx->t5, ctx->t5, ctx->t2, p256_mod, p256_mp_mod);
  100020. ctx->state = 17;
  100021. break;
  100022. case 17:
  100023. /* Z3 = H*Z1*Z2 */
  100024. sp_256_mont_mul_8(ctx->z, p->z, ctx->t2, p256_mod, p256_mp_mod);
  100025. ctx->state = 18;
  100026. break;
  100027. case 18:
  100028. sp_256_mont_mul_8(ctx->z, ctx->z, q->z, p256_mod, p256_mp_mod);
  100029. ctx->state = 19;
  100030. break;
  100031. case 19:
  100032. sp_256_mont_sqr_8(ctx->x, ctx->t4, p256_mod, p256_mp_mod);
  100033. ctx->state = 20;
  100034. break;
  100035. case 20:
  100036. sp_256_mont_sub_8(ctx->x, ctx->x, ctx->t5, p256_mod);
  100037. ctx->state = 21;
  100038. break;
  100039. case 21:
  100040. sp_256_mont_mul_8(ctx->t5, ctx->t5, ctx->t3, p256_mod, p256_mp_mod);
  100041. ctx->state = 22;
  100042. break;
  100043. case 22:
  100044. sp_256_mont_dbl_8(ctx->t3, ctx->y, p256_mod);
  100045. ctx->state = 23;
  100046. break;
  100047. case 23:
  100048. sp_256_mont_sub_8(ctx->x, ctx->x, ctx->t3, p256_mod);
  100049. ctx->state = 24;
  100050. break;
  100051. case 24:
  100052. /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
  100053. sp_256_mont_sub_lower_8(ctx->y, ctx->y, ctx->x, p256_mod);
  100054. ctx->state = 25;
  100055. break;
  100056. case 25:
  100057. sp_256_mont_mul_8(ctx->y, ctx->y, ctx->t4, p256_mod, p256_mp_mod);
  100058. ctx->state = 26;
  100059. break;
  100060. case 26:
  100061. sp_256_mont_sub_8(ctx->y, ctx->y, ctx->t5, p256_mod);
  100062. ctx->state = 27;
  100063. /* fall-through */
  100064. case 27:
  100065. {
  100066. int i;
  100067. sp_digit maskp = 0 - (q->infinity & (!p->infinity));
  100068. sp_digit maskq = 0 - (p->infinity & (!q->infinity));
  100069. sp_digit maskt = ~(maskp | maskq);
  100070. for (i = 0; i < 8; i++) {
  100071. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) |
  100072. (ctx->x[i] & maskt);
  100073. }
  100074. for (i = 0; i < 8; i++) {
  100075. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) |
  100076. (ctx->y[i] & maskt);
  100077. }
  100078. for (i = 0; i < 8; i++) {
  100079. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) |
  100080. (ctx->z[i] & maskt);
  100081. }
  100082. r->z[0] |= p->infinity & q->infinity;
  100083. r->infinity = p->infinity & q->infinity;
  100084. err = MP_OKAY;
  100085. break;
  100086. }
  100087. }
  100088. if (err == MP_OKAY && ctx->state != 27) {
  100089. err = FP_WOULDBLOCK;
  100090. }
  100091. return err;
  100092. }
  100093. #endif /* WOLFSSL_SP_NONBLOCK */
  100094. static void sp_256_proj_point_add_8(sp_point_256* r,
  100095. const sp_point_256* p, const sp_point_256* q, sp_digit* t)
  100096. {
  100097. sp_digit* t1 = t;
  100098. sp_digit* t2 = t + 2*8;
  100099. sp_digit* t3 = t + 4*8;
  100100. sp_digit* t4 = t + 6*8;
  100101. sp_digit* t5 = t + 8*8;
  100102. sp_digit* t6 = t + 10*8;
  100103. /* Check double */
  100104. (void)sp_256_sub_8(t1, p256_mod, q->y);
  100105. sp_256_norm_8(t1);
  100106. if ((~p->infinity & ~q->infinity &
  100107. sp_256_cmp_equal_8(p->x, q->x) & sp_256_cmp_equal_8(p->z, q->z) &
  100108. (sp_256_cmp_equal_8(p->y, q->y) | sp_256_cmp_equal_8(p->y, t1))) != 0) {
  100109. sp_256_proj_point_dbl_8(r, p, t);
  100110. }
  100111. else {
  100112. sp_digit maskp;
  100113. sp_digit maskq;
  100114. sp_digit maskt;
  100115. sp_digit* x = t6;
  100116. sp_digit* y = t1;
  100117. sp_digit* z = t2;
  100118. int i;
  100119. maskp = 0 - (q->infinity & (!p->infinity));
  100120. maskq = 0 - (p->infinity & (!q->infinity));
  100121. maskt = ~(maskp | maskq);
  100122. /* U1 = X1*Z2^2 */
  100123. sp_256_mont_sqr_8(t1, q->z, p256_mod, p256_mp_mod);
  100124. sp_256_mont_mul_8(t3, t1, q->z, p256_mod, p256_mp_mod);
  100125. sp_256_mont_mul_8(t1, t1, p->x, p256_mod, p256_mp_mod);
  100126. /* U2 = X2*Z1^2 */
  100127. sp_256_mont_sqr_8(t2, p->z, p256_mod, p256_mp_mod);
  100128. sp_256_mont_mul_8(t4, t2, p->z, p256_mod, p256_mp_mod);
  100129. sp_256_mont_mul_8(t2, t2, q->x, p256_mod, p256_mp_mod);
  100130. /* S1 = Y1*Z2^3 */
  100131. sp_256_mont_mul_8(t3, t3, p->y, p256_mod, p256_mp_mod);
  100132. /* S2 = Y2*Z1^3 */
  100133. sp_256_mont_mul_8(t4, t4, q->y, p256_mod, p256_mp_mod);
  100134. /* H = U2 - U1 */
  100135. sp_256_mont_sub_8(t2, t2, t1, p256_mod);
  100136. /* R = S2 - S1 */
  100137. sp_256_mont_sub_8(t4, t4, t3, p256_mod);
  100138. if (~p->infinity & ~q->infinity &
  100139. sp_256_iszero_8(t2) & sp_256_iszero_8(t4) & maskt) {
  100140. sp_256_proj_point_dbl_8(r, p, t);
  100141. }
  100142. else {
  100143. /* X3 = R^2 - H^3 - 2*U1*H^2 */
  100144. sp_256_mont_sqr_8(t5, t2, p256_mod, p256_mp_mod);
  100145. sp_256_mont_mul_8(y, t1, t5, p256_mod, p256_mp_mod);
  100146. sp_256_mont_mul_8(t5, t5, t2, p256_mod, p256_mp_mod);
  100147. /* Z3 = H*Z1*Z2 */
  100148. sp_256_mont_mul_8(z, p->z, t2, p256_mod, p256_mp_mod);
  100149. sp_256_mont_mul_8(z, z, q->z, p256_mod, p256_mp_mod);
  100150. sp_256_mont_sqr_8(x, t4, p256_mod, p256_mp_mod);
  100151. sp_256_mont_sub_8(x, x, t5, p256_mod);
  100152. sp_256_mont_mul_8(t5, t5, t3, p256_mod, p256_mp_mod);
  100153. sp_256_mont_dbl_8(t3, y, p256_mod);
  100154. sp_256_mont_sub_8(x, x, t3, p256_mod);
  100155. /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
  100156. sp_256_mont_sub_lower_8(y, y, x, p256_mod);
  100157. sp_256_mont_mul_8(y, y, t4, p256_mod, p256_mp_mod);
  100158. sp_256_mont_sub_8(y, y, t5, p256_mod);
  100159. for (i = 0; i < 8; i++) {
  100160. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) |
  100161. (x[i] & maskt);
  100162. }
  100163. for (i = 0; i < 8; i++) {
  100164. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) |
  100165. (y[i] & maskt);
  100166. }
  100167. for (i = 0; i < 8; i++) {
  100168. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) |
  100169. (z[i] & maskt);
  100170. }
  100171. r->z[0] |= p->infinity & q->infinity;
  100172. r->infinity = p->infinity & q->infinity;
  100173. }
  100174. }
  100175. }
  100176. #ifndef WC_NO_CACHE_RESISTANT
  100177. /* Touch each possible point that could be being copied.
  100178. *
  100179. * r Point to copy into.
  100180. * table Table - start of the entires to access
  100181. * idx Index of entry to retrieve.
  100182. */
  100183. static void sp_256_get_point_16_8(sp_point_256* r, const sp_point_256* table,
  100184. int idx)
  100185. {
  100186. int i;
  100187. sp_digit mask;
  100188. r->x[0] = 0;
  100189. r->x[1] = 0;
  100190. r->x[2] = 0;
  100191. r->x[3] = 0;
  100192. r->x[4] = 0;
  100193. r->x[5] = 0;
  100194. r->x[6] = 0;
  100195. r->x[7] = 0;
  100196. r->y[0] = 0;
  100197. r->y[1] = 0;
  100198. r->y[2] = 0;
  100199. r->y[3] = 0;
  100200. r->y[4] = 0;
  100201. r->y[5] = 0;
  100202. r->y[6] = 0;
  100203. r->y[7] = 0;
  100204. r->z[0] = 0;
  100205. r->z[1] = 0;
  100206. r->z[2] = 0;
  100207. r->z[3] = 0;
  100208. r->z[4] = 0;
  100209. r->z[5] = 0;
  100210. r->z[6] = 0;
  100211. r->z[7] = 0;
  100212. for (i = 1; i < 16; i++) {
  100213. mask = 0 - (i == idx);
  100214. r->x[0] |= mask & table[i].x[0];
  100215. r->x[1] |= mask & table[i].x[1];
  100216. r->x[2] |= mask & table[i].x[2];
  100217. r->x[3] |= mask & table[i].x[3];
  100218. r->x[4] |= mask & table[i].x[4];
  100219. r->x[5] |= mask & table[i].x[5];
  100220. r->x[6] |= mask & table[i].x[6];
  100221. r->x[7] |= mask & table[i].x[7];
  100222. r->y[0] |= mask & table[i].y[0];
  100223. r->y[1] |= mask & table[i].y[1];
  100224. r->y[2] |= mask & table[i].y[2];
  100225. r->y[3] |= mask & table[i].y[3];
  100226. r->y[4] |= mask & table[i].y[4];
  100227. r->y[5] |= mask & table[i].y[5];
  100228. r->y[6] |= mask & table[i].y[6];
  100229. r->y[7] |= mask & table[i].y[7];
  100230. r->z[0] |= mask & table[i].z[0];
  100231. r->z[1] |= mask & table[i].z[1];
  100232. r->z[2] |= mask & table[i].z[2];
  100233. r->z[3] |= mask & table[i].z[3];
  100234. r->z[4] |= mask & table[i].z[4];
  100235. r->z[5] |= mask & table[i].z[5];
  100236. r->z[6] |= mask & table[i].z[6];
  100237. r->z[7] |= mask & table[i].z[7];
  100238. }
  100239. }
  100240. #endif /* !WC_NO_CACHE_RESISTANT */
  100241. /* Multiply the point by the scalar and return the result.
  100242. * If map is true then convert result to affine coordinates.
  100243. *
  100244. * Fast implementation that generates a pre-computation table.
  100245. * 4 bits of window (no sliding!).
  100246. * Uses add and double for calculating table.
  100247. * 256 doubles.
  100248. * 76 adds.
  100249. *
  100250. * r Resulting point.
  100251. * g Point to multiply.
  100252. * k Scalar to multiply by.
  100253. * map Indicates whether to convert result to affine.
  100254. * ct Constant time required.
  100255. * heap Heap to use for allocation.
  100256. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  100257. */
  100258. static int sp_256_ecc_mulmod_fast_8(sp_point_256* r, const sp_point_256* g, const sp_digit* k,
  100259. int map, int ct, void* heap)
  100260. {
  100261. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  100262. sp_point_256* t = NULL;
  100263. sp_digit* tmp = NULL;
  100264. #else
  100265. sp_point_256 t[16 + 1];
  100266. sp_digit tmp[2 * 8 * 6];
  100267. #endif
  100268. sp_point_256* rt = NULL;
  100269. #ifndef WC_NO_CACHE_RESISTANT
  100270. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  100271. sp_point_256* p = NULL;
  100272. #else
  100273. sp_point_256 p[1];
  100274. #endif
  100275. #endif /* !WC_NO_CACHE_RESISTANT */
  100276. sp_digit n;
  100277. int i;
  100278. int c;
  100279. int y;
  100280. int err = MP_OKAY;
  100281. /* Constant time used for cache attack resistance implementation. */
  100282. (void)ct;
  100283. (void)heap;
  100284. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  100285. t = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * (16 + 1),
  100286. heap, DYNAMIC_TYPE_ECC);
  100287. if (t == NULL)
  100288. err = MEMORY_E;
  100289. #ifndef WC_NO_CACHE_RESISTANT
  100290. if (err == MP_OKAY) {
  100291. p = (sp_point_256*)XMALLOC(sizeof(sp_point_256),
  100292. heap, DYNAMIC_TYPE_ECC);
  100293. if (p == NULL)
  100294. err = MEMORY_E;
  100295. }
  100296. #endif
  100297. if (err == MP_OKAY) {
  100298. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 8 * 6, heap,
  100299. DYNAMIC_TYPE_ECC);
  100300. if (tmp == NULL)
  100301. err = MEMORY_E;
  100302. }
  100303. #endif
  100304. if (err == MP_OKAY) {
  100305. rt = t + 16;
  100306. /* t[0] = {0, 0, 1} * norm */
  100307. XMEMSET(&t[0], 0, sizeof(t[0]));
  100308. t[0].infinity = 1;
  100309. /* t[1] = {g->x, g->y, g->z} * norm */
  100310. (void)sp_256_mod_mul_norm_8(t[1].x, g->x, p256_mod);
  100311. (void)sp_256_mod_mul_norm_8(t[1].y, g->y, p256_mod);
  100312. (void)sp_256_mod_mul_norm_8(t[1].z, g->z, p256_mod);
  100313. t[1].infinity = 0;
  100314. sp_256_proj_point_dbl_8(&t[ 2], &t[ 1], tmp);
  100315. t[ 2].infinity = 0;
  100316. sp_256_proj_point_add_8(&t[ 3], &t[ 2], &t[ 1], tmp);
  100317. t[ 3].infinity = 0;
  100318. sp_256_proj_point_dbl_8(&t[ 4], &t[ 2], tmp);
  100319. t[ 4].infinity = 0;
  100320. sp_256_proj_point_add_8(&t[ 5], &t[ 3], &t[ 2], tmp);
  100321. t[ 5].infinity = 0;
  100322. sp_256_proj_point_dbl_8(&t[ 6], &t[ 3], tmp);
  100323. t[ 6].infinity = 0;
  100324. sp_256_proj_point_add_8(&t[ 7], &t[ 4], &t[ 3], tmp);
  100325. t[ 7].infinity = 0;
  100326. sp_256_proj_point_dbl_8(&t[ 8], &t[ 4], tmp);
  100327. t[ 8].infinity = 0;
  100328. sp_256_proj_point_add_8(&t[ 9], &t[ 5], &t[ 4], tmp);
  100329. t[ 9].infinity = 0;
  100330. sp_256_proj_point_dbl_8(&t[10], &t[ 5], tmp);
  100331. t[10].infinity = 0;
  100332. sp_256_proj_point_add_8(&t[11], &t[ 6], &t[ 5], tmp);
  100333. t[11].infinity = 0;
  100334. sp_256_proj_point_dbl_8(&t[12], &t[ 6], tmp);
  100335. t[12].infinity = 0;
  100336. sp_256_proj_point_add_8(&t[13], &t[ 7], &t[ 6], tmp);
  100337. t[13].infinity = 0;
  100338. sp_256_proj_point_dbl_8(&t[14], &t[ 7], tmp);
  100339. t[14].infinity = 0;
  100340. sp_256_proj_point_add_8(&t[15], &t[ 8], &t[ 7], tmp);
  100341. t[15].infinity = 0;
  100342. i = 6;
  100343. n = k[i+1] << 0;
  100344. c = 28;
  100345. y = (int)(n >> 28);
  100346. #ifndef WC_NO_CACHE_RESISTANT
  100347. if (ct) {
  100348. sp_256_get_point_16_8(rt, t, y);
  100349. rt->infinity = !y;
  100350. }
  100351. else
  100352. #endif
  100353. {
  100354. XMEMCPY(rt, &t[y], sizeof(sp_point_256));
  100355. }
  100356. n <<= 4;
  100357. for (; i>=0 || c>=4; ) {
  100358. if (c < 4) {
  100359. n |= k[i--];
  100360. c += 32;
  100361. }
  100362. y = (n >> 28) & 0xf;
  100363. n <<= 4;
  100364. c -= 4;
  100365. sp_256_proj_point_dbl_8(rt, rt, tmp);
  100366. sp_256_proj_point_dbl_8(rt, rt, tmp);
  100367. sp_256_proj_point_dbl_8(rt, rt, tmp);
  100368. sp_256_proj_point_dbl_8(rt, rt, tmp);
  100369. #ifndef WC_NO_CACHE_RESISTANT
  100370. if (ct) {
  100371. sp_256_get_point_16_8(p, t, y);
  100372. p->infinity = !y;
  100373. sp_256_proj_point_add_8(rt, rt, p, tmp);
  100374. }
  100375. else
  100376. #endif
  100377. {
  100378. sp_256_proj_point_add_8(rt, rt, &t[y], tmp);
  100379. }
  100380. }
  100381. if (map != 0) {
  100382. sp_256_map_8(r, rt, tmp);
  100383. }
  100384. else {
  100385. XMEMCPY(r, rt, sizeof(sp_point_256));
  100386. }
  100387. }
  100388. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  100389. if (tmp != NULL)
  100390. #endif
  100391. {
  100392. ForceZero(tmp, sizeof(sp_digit) * 2 * 8 * 6);
  100393. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  100394. XFREE(tmp, heap, DYNAMIC_TYPE_ECC);
  100395. #endif
  100396. }
  100397. #ifndef WC_NO_CACHE_RESISTANT
  100398. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  100399. if (p != NULL)
  100400. #endif
  100401. {
  100402. ForceZero(p, sizeof(sp_point_256));
  100403. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  100404. XFREE(p, heap, DYNAMIC_TYPE_ECC);
  100405. #endif
  100406. }
  100407. #endif /* !WC_NO_CACHE_RESISTANT */
  100408. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  100409. if (t != NULL)
  100410. #endif
  100411. {
  100412. ForceZero(t, sizeof(sp_point_256) * 17);
  100413. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  100414. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  100415. #endif
  100416. }
  100417. return err;
  100418. }
  100419. #ifdef FP_ECC
  100420. #define sp_256_mont_dbl_lower_8 sp_256_mont_dbl_8
  100421. #define sp_256_mont_tpl_lower_8 sp_256_mont_tpl_8
  100422. /* Double the Montgomery form projective point p a number of times.
  100423. *
  100424. * r Result of repeated doubling of point.
  100425. * p Point to double.
  100426. * n Number of times to double
  100427. * t Temporary ordinate data.
  100428. */
  100429. static void sp_256_proj_point_dbl_n_8(sp_point_256* p, int i,
  100430. sp_digit* t)
  100431. {
  100432. sp_digit* w = t;
  100433. sp_digit* a = t + 2*8;
  100434. sp_digit* b = t + 4*8;
  100435. sp_digit* t1 = t + 6*8;
  100436. sp_digit* t2 = t + 8*8;
  100437. sp_digit* x;
  100438. sp_digit* y;
  100439. sp_digit* z;
  100440. volatile int n = i;
  100441. x = p->x;
  100442. y = p->y;
  100443. z = p->z;
  100444. /* Y = 2*Y */
  100445. sp_256_mont_dbl_8(y, y, p256_mod);
  100446. /* W = Z^4 */
  100447. sp_256_mont_sqr_8(w, z, p256_mod, p256_mp_mod);
  100448. sp_256_mont_sqr_8(w, w, p256_mod, p256_mp_mod);
  100449. #ifndef WOLFSSL_SP_SMALL
  100450. while (--n > 0)
  100451. #else
  100452. while (--n >= 0)
  100453. #endif
  100454. {
  100455. /* A = 3*(X^2 - W) */
  100456. sp_256_mont_sqr_8(t1, x, p256_mod, p256_mp_mod);
  100457. sp_256_mont_sub_8(t1, t1, w, p256_mod);
  100458. sp_256_mont_tpl_lower_8(a, t1, p256_mod);
  100459. /* B = X*Y^2 */
  100460. sp_256_mont_sqr_8(t1, y, p256_mod, p256_mp_mod);
  100461. sp_256_mont_mul_8(b, t1, x, p256_mod, p256_mp_mod);
  100462. /* X = A^2 - 2B */
  100463. sp_256_mont_sqr_8(x, a, p256_mod, p256_mp_mod);
  100464. sp_256_mont_dbl_8(t2, b, p256_mod);
  100465. sp_256_mont_sub_8(x, x, t2, p256_mod);
  100466. /* b = 2.(B - X) */
  100467. sp_256_mont_sub_lower_8(t2, b, x, p256_mod);
  100468. sp_256_mont_dbl_lower_8(b, t2, p256_mod);
  100469. /* Z = Z*Y */
  100470. sp_256_mont_mul_8(z, z, y, p256_mod, p256_mp_mod);
  100471. /* t1 = Y^4 */
  100472. sp_256_mont_sqr_8(t1, t1, p256_mod, p256_mp_mod);
  100473. #ifdef WOLFSSL_SP_SMALL
  100474. if (n != 0)
  100475. #endif
  100476. {
  100477. /* W = W*Y^4 */
  100478. sp_256_mont_mul_8(w, w, t1, p256_mod, p256_mp_mod);
  100479. }
  100480. /* y = 2*A*(B - X) - Y^4 */
  100481. sp_256_mont_mul_8(y, b, a, p256_mod, p256_mp_mod);
  100482. sp_256_mont_sub_8(y, y, t1, p256_mod);
  100483. }
  100484. #ifndef WOLFSSL_SP_SMALL
  100485. /* A = 3*(X^2 - W) */
  100486. sp_256_mont_sqr_8(t1, x, p256_mod, p256_mp_mod);
  100487. sp_256_mont_sub_8(t1, t1, w, p256_mod);
  100488. sp_256_mont_tpl_lower_8(a, t1, p256_mod);
  100489. /* B = X*Y^2 */
  100490. sp_256_mont_sqr_8(t1, y, p256_mod, p256_mp_mod);
  100491. sp_256_mont_mul_8(b, t1, x, p256_mod, p256_mp_mod);
  100492. /* X = A^2 - 2B */
  100493. sp_256_mont_sqr_8(x, a, p256_mod, p256_mp_mod);
  100494. sp_256_mont_dbl_8(t2, b, p256_mod);
  100495. sp_256_mont_sub_8(x, x, t2, p256_mod);
  100496. /* b = 2.(B - X) */
  100497. sp_256_mont_sub_lower_8(t2, b, x, p256_mod);
  100498. sp_256_mont_dbl_lower_8(b, t2, p256_mod);
  100499. /* Z = Z*Y */
  100500. sp_256_mont_mul_8(z, z, y, p256_mod, p256_mp_mod);
  100501. /* t1 = Y^4 */
  100502. sp_256_mont_sqr_8(t1, t1, p256_mod, p256_mp_mod);
  100503. /* y = 2*A*(B - X) - Y^4 */
  100504. sp_256_mont_mul_8(y, b, a, p256_mod, p256_mp_mod);
  100505. sp_256_mont_sub_8(y, y, t1, p256_mod);
  100506. #endif
  100507. /* Y = Y/2 */
  100508. sp_256_div2_8(y, y, p256_mod);
  100509. }
  100510. /* Convert the projective point to affine.
  100511. * Ordinates are in Montgomery form.
  100512. *
  100513. * a Point to convert.
  100514. * t Temporary data.
  100515. */
  100516. static void sp_256_proj_to_affine_8(sp_point_256* a, sp_digit* t)
  100517. {
  100518. sp_digit* t1 = t;
  100519. sp_digit* t2 = t + 2 * 8;
  100520. sp_digit* tmp = t + 4 * 8;
  100521. sp_256_mont_inv_8(t1, a->z, tmp);
  100522. sp_256_mont_sqr_8(t2, t1, p256_mod, p256_mp_mod);
  100523. sp_256_mont_mul_8(t1, t2, t1, p256_mod, p256_mp_mod);
  100524. sp_256_mont_mul_8(a->x, a->x, t2, p256_mod, p256_mp_mod);
  100525. sp_256_mont_mul_8(a->y, a->y, t1, p256_mod, p256_mp_mod);
  100526. XMEMCPY(a->z, p256_norm_mod, sizeof(p256_norm_mod));
  100527. }
  100528. #endif /* FP_ECC */
  100529. /* A table entry for pre-computed points. */
  100530. typedef struct sp_table_entry_256 {
  100531. sp_digit x[8];
  100532. sp_digit y[8];
  100533. } sp_table_entry_256;
  100534. #ifdef FP_ECC
  100535. #endif /* FP_ECC */
  100536. /* Add two Montgomery form projective points. The second point has a q value of
  100537. * one.
  100538. * Only the first point can be the same pointer as the result point.
  100539. *
  100540. * r Result of addition.
  100541. * p First point to add.
  100542. * q Second point to add.
  100543. * t Temporary ordinate data.
  100544. */
  100545. static void sp_256_proj_point_add_qz1_8(sp_point_256* r, const sp_point_256* p,
  100546. const sp_point_256* q, sp_digit* t)
  100547. {
  100548. sp_digit* t1 = t;
  100549. sp_digit* t2 = t + 2*8;
  100550. sp_digit* t3 = t + 4*8;
  100551. sp_digit* t4 = t + 6*8;
  100552. sp_digit* t5 = t + 8*8;
  100553. sp_digit* t6 = t + 10*8;
  100554. /* Check double */
  100555. (void)sp_256_sub_8(t1, p256_mod, q->y);
  100556. sp_256_norm_8(t1);
  100557. if ((~p->infinity & ~q->infinity &
  100558. sp_256_cmp_equal_8(p->x, q->x) & sp_256_cmp_equal_8(p->z, q->z) &
  100559. (sp_256_cmp_equal_8(p->y, q->y) | sp_256_cmp_equal_8(p->y, t1))) != 0) {
  100560. sp_256_proj_point_dbl_8(r, p, t);
  100561. }
  100562. else {
  100563. sp_digit maskp;
  100564. sp_digit maskq;
  100565. sp_digit maskt;
  100566. sp_digit* x = t2;
  100567. sp_digit* y = t5;
  100568. sp_digit* z = t6;
  100569. int i;
  100570. /* U2 = X2*Z1^2 */
  100571. sp_256_mont_sqr_8(t2, p->z, p256_mod, p256_mp_mod);
  100572. sp_256_mont_mul_8(t4, t2, p->z, p256_mod, p256_mp_mod);
  100573. sp_256_mont_mul_8(t2, t2, q->x, p256_mod, p256_mp_mod);
  100574. /* S2 = Y2*Z1^3 */
  100575. sp_256_mont_mul_8(t4, t4, q->y, p256_mod, p256_mp_mod);
  100576. /* H = U2 - X1 */
  100577. sp_256_mont_sub_8(t2, t2, p->x, p256_mod);
  100578. /* R = S2 - Y1 */
  100579. sp_256_mont_sub_8(t4, t4, p->y, p256_mod);
  100580. /* Z3 = H*Z1 */
  100581. sp_256_mont_mul_8(z, p->z, t2, p256_mod, p256_mp_mod);
  100582. /* X3 = R^2 - H^3 - 2*X1*H^2 */
  100583. sp_256_mont_sqr_8(t1, t4, p256_mod, p256_mp_mod);
  100584. sp_256_mont_sqr_8(t5, t2, p256_mod, p256_mp_mod);
  100585. sp_256_mont_mul_8(t3, p->x, t5, p256_mod, p256_mp_mod);
  100586. sp_256_mont_mul_8(t5, t5, t2, p256_mod, p256_mp_mod);
  100587. sp_256_mont_sub_8(x, t1, t5, p256_mod);
  100588. sp_256_mont_dbl_8(t1, t3, p256_mod);
  100589. sp_256_mont_sub_8(x, x, t1, p256_mod);
  100590. /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */
  100591. sp_256_mont_sub_lower_8(t3, t3, x, p256_mod);
  100592. sp_256_mont_mul_8(t3, t3, t4, p256_mod, p256_mp_mod);
  100593. sp_256_mont_mul_8(t5, t5, p->y, p256_mod, p256_mp_mod);
  100594. sp_256_mont_sub_8(y, t3, t5, p256_mod);
  100595. maskp = 0 - (q->infinity & (!p->infinity));
  100596. maskq = 0 - (p->infinity & (!q->infinity));
  100597. maskt = ~(maskp | maskq);
  100598. for (i = 0; i < 8; i++) {
  100599. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt);
  100600. }
  100601. for (i = 0; i < 8; i++) {
  100602. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt);
  100603. }
  100604. for (i = 0; i < 8; i++) {
  100605. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt);
  100606. }
  100607. r->z[0] |= p->infinity & q->infinity;
  100608. r->infinity = p->infinity & q->infinity;
  100609. }
  100610. }
  100611. #ifdef WOLFSSL_SP_SMALL
  100612. #ifdef FP_ECC
  100613. /* Generate the pre-computed table of points for the base point.
  100614. *
  100615. * width = 4
  100616. * 16 entries
  100617. * 64 bits between
  100618. *
  100619. * a The base point.
  100620. * table Place to store generated point data.
  100621. * tmp Temporary data.
  100622. * heap Heap to use for allocation.
  100623. */
  100624. static int sp_256_gen_stripe_table_8(const sp_point_256* a,
  100625. sp_table_entry_256* table, sp_digit* tmp, void* heap)
  100626. {
  100627. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  100628. sp_point_256* t = NULL;
  100629. #else
  100630. sp_point_256 t[3];
  100631. #endif
  100632. sp_point_256* s1 = NULL;
  100633. sp_point_256* s2 = NULL;
  100634. int i;
  100635. int j;
  100636. int err = MP_OKAY;
  100637. (void)heap;
  100638. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  100639. t = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 3, heap,
  100640. DYNAMIC_TYPE_ECC);
  100641. if (t == NULL)
  100642. err = MEMORY_E;
  100643. #endif
  100644. if (err == MP_OKAY) {
  100645. s1 = t + 1;
  100646. s2 = t + 2;
  100647. err = sp_256_mod_mul_norm_8(t->x, a->x, p256_mod);
  100648. }
  100649. if (err == MP_OKAY) {
  100650. err = sp_256_mod_mul_norm_8(t->y, a->y, p256_mod);
  100651. }
  100652. if (err == MP_OKAY) {
  100653. err = sp_256_mod_mul_norm_8(t->z, a->z, p256_mod);
  100654. }
  100655. if (err == MP_OKAY) {
  100656. t->infinity = 0;
  100657. sp_256_proj_to_affine_8(t, tmp);
  100658. XMEMCPY(s1->z, p256_norm_mod, sizeof(p256_norm_mod));
  100659. s1->infinity = 0;
  100660. XMEMCPY(s2->z, p256_norm_mod, sizeof(p256_norm_mod));
  100661. s2->infinity = 0;
  100662. /* table[0] = {0, 0, infinity} */
  100663. XMEMSET(&table[0], 0, sizeof(sp_table_entry_256));
  100664. /* table[1] = Affine version of 'a' in Montgomery form */
  100665. XMEMCPY(table[1].x, t->x, sizeof(table->x));
  100666. XMEMCPY(table[1].y, t->y, sizeof(table->y));
  100667. for (i=1; i<4; i++) {
  100668. sp_256_proj_point_dbl_n_8(t, 64, tmp);
  100669. sp_256_proj_to_affine_8(t, tmp);
  100670. XMEMCPY(table[1<<i].x, t->x, sizeof(table->x));
  100671. XMEMCPY(table[1<<i].y, t->y, sizeof(table->y));
  100672. }
  100673. for (i=1; i<4; i++) {
  100674. XMEMCPY(s1->x, table[1<<i].x, sizeof(table->x));
  100675. XMEMCPY(s1->y, table[1<<i].y, sizeof(table->y));
  100676. for (j=(1<<i)+1; j<(1<<(i+1)); j++) {
  100677. XMEMCPY(s2->x, table[j-(1<<i)].x, sizeof(table->x));
  100678. XMEMCPY(s2->y, table[j-(1<<i)].y, sizeof(table->y));
  100679. sp_256_proj_point_add_qz1_8(t, s1, s2, tmp);
  100680. sp_256_proj_to_affine_8(t, tmp);
  100681. XMEMCPY(table[j].x, t->x, sizeof(table->x));
  100682. XMEMCPY(table[j].y, t->y, sizeof(table->y));
  100683. }
  100684. }
  100685. }
  100686. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  100687. if (t != NULL)
  100688. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  100689. #endif
  100690. return err;
  100691. }
  100692. #endif /* FP_ECC */
  100693. #ifndef WC_NO_CACHE_RESISTANT
  100694. /* Touch each possible entry that could be being copied.
  100695. *
  100696. * r Point to copy into.
  100697. * table Table - start of the entires to access
  100698. * idx Index of entry to retrieve.
  100699. */
  100700. static void sp_256_get_entry_16_8(sp_point_256* r,
  100701. const sp_table_entry_256* table, int idx)
  100702. {
  100703. int i;
  100704. sp_digit mask;
  100705. r->x[0] = 0;
  100706. r->x[1] = 0;
  100707. r->x[2] = 0;
  100708. r->x[3] = 0;
  100709. r->x[4] = 0;
  100710. r->x[5] = 0;
  100711. r->x[6] = 0;
  100712. r->x[7] = 0;
  100713. r->y[0] = 0;
  100714. r->y[1] = 0;
  100715. r->y[2] = 0;
  100716. r->y[3] = 0;
  100717. r->y[4] = 0;
  100718. r->y[5] = 0;
  100719. r->y[6] = 0;
  100720. r->y[7] = 0;
  100721. for (i = 1; i < 16; i++) {
  100722. mask = 0 - (i == idx);
  100723. r->x[0] |= mask & table[i].x[0];
  100724. r->x[1] |= mask & table[i].x[1];
  100725. r->x[2] |= mask & table[i].x[2];
  100726. r->x[3] |= mask & table[i].x[3];
  100727. r->x[4] |= mask & table[i].x[4];
  100728. r->x[5] |= mask & table[i].x[5];
  100729. r->x[6] |= mask & table[i].x[6];
  100730. r->x[7] |= mask & table[i].x[7];
  100731. r->y[0] |= mask & table[i].y[0];
  100732. r->y[1] |= mask & table[i].y[1];
  100733. r->y[2] |= mask & table[i].y[2];
  100734. r->y[3] |= mask & table[i].y[3];
  100735. r->y[4] |= mask & table[i].y[4];
  100736. r->y[5] |= mask & table[i].y[5];
  100737. r->y[6] |= mask & table[i].y[6];
  100738. r->y[7] |= mask & table[i].y[7];
  100739. }
  100740. }
  100741. #endif /* !WC_NO_CACHE_RESISTANT */
  100742. /* Multiply the point by the scalar and return the result.
  100743. * If map is true then convert result to affine coordinates.
  100744. *
  100745. * Stripe implementation.
  100746. * Pre-generated: 2^0, 2^64, ...
  100747. * Pre-generated: products of all combinations of above.
  100748. * 4 doubles and adds (with qz=1)
  100749. *
  100750. * r Resulting point.
  100751. * k Scalar to multiply by.
  100752. * table Pre-computed table.
  100753. * map Indicates whether to convert result to affine.
  100754. * ct Constant time required.
  100755. * heap Heap to use for allocation.
  100756. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  100757. */
  100758. static int sp_256_ecc_mulmod_stripe_8(sp_point_256* r, const sp_point_256* g,
  100759. const sp_table_entry_256* table, const sp_digit* k, int map,
  100760. int ct, void* heap)
  100761. {
  100762. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  100763. sp_point_256* rt = NULL;
  100764. sp_digit* t = NULL;
  100765. #else
  100766. sp_point_256 rt[2];
  100767. sp_digit t[2 * 8 * 6];
  100768. #endif
  100769. sp_point_256* p = NULL;
  100770. int i;
  100771. int j;
  100772. int y;
  100773. int x;
  100774. int err = MP_OKAY;
  100775. (void)g;
  100776. /* Constant time used for cache attack resistance implementation. */
  100777. (void)ct;
  100778. (void)heap;
  100779. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  100780. rt = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap,
  100781. DYNAMIC_TYPE_ECC);
  100782. if (rt == NULL)
  100783. err = MEMORY_E;
  100784. if (err == MP_OKAY) {
  100785. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 8 * 6, heap,
  100786. DYNAMIC_TYPE_ECC);
  100787. if (t == NULL)
  100788. err = MEMORY_E;
  100789. }
  100790. #endif
  100791. if (err == MP_OKAY) {
  100792. p = rt + 1;
  100793. XMEMCPY(p->z, p256_norm_mod, sizeof(p256_norm_mod));
  100794. XMEMCPY(rt->z, p256_norm_mod, sizeof(p256_norm_mod));
  100795. y = 0;
  100796. x = 63;
  100797. for (j=0; j<4; j++) {
  100798. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  100799. x += 64;
  100800. }
  100801. #ifndef WC_NO_CACHE_RESISTANT
  100802. if (ct) {
  100803. sp_256_get_entry_16_8(rt, table, y);
  100804. } else
  100805. #endif
  100806. {
  100807. XMEMCPY(rt->x, table[y].x, sizeof(table[y].x));
  100808. XMEMCPY(rt->y, table[y].y, sizeof(table[y].y));
  100809. }
  100810. rt->infinity = !y;
  100811. for (i=62; i>=0; i--) {
  100812. y = 0;
  100813. x = i;
  100814. for (j=0; j<4; j++) {
  100815. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  100816. x += 64;
  100817. }
  100818. sp_256_proj_point_dbl_8(rt, rt, t);
  100819. #ifndef WC_NO_CACHE_RESISTANT
  100820. if (ct) {
  100821. sp_256_get_entry_16_8(p, table, y);
  100822. }
  100823. else
  100824. #endif
  100825. {
  100826. XMEMCPY(p->x, table[y].x, sizeof(table[y].x));
  100827. XMEMCPY(p->y, table[y].y, sizeof(table[y].y));
  100828. }
  100829. p->infinity = !y;
  100830. sp_256_proj_point_add_qz1_8(rt, rt, p, t);
  100831. }
  100832. if (map != 0) {
  100833. sp_256_map_8(r, rt, t);
  100834. }
  100835. else {
  100836. XMEMCPY(r, rt, sizeof(sp_point_256));
  100837. }
  100838. }
  100839. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  100840. if (t != NULL)
  100841. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  100842. if (rt != NULL)
  100843. XFREE(rt, heap, DYNAMIC_TYPE_ECC);
  100844. #endif
  100845. return err;
  100846. }
  100847. #ifdef FP_ECC
  100848. #ifndef FP_ENTRIES
  100849. #define FP_ENTRIES 16
  100850. #endif
  100851. /* Cache entry - holds precomputation tables for a point. */
  100852. typedef struct sp_cache_256_t {
  100853. /* X ordinate of point that table was generated from. */
  100854. sp_digit x[8];
  100855. /* Y ordinate of point that table was generated from. */
  100856. sp_digit y[8];
  100857. /* Precomputation table for point. */
  100858. sp_table_entry_256 table[16];
  100859. /* Count of entries in table. */
  100860. uint32_t cnt;
  100861. /* Point and table set in entry. */
  100862. int set;
  100863. } sp_cache_256_t;
  100864. /* Cache of tables. */
  100865. static THREAD_LS_T sp_cache_256_t sp_cache_256[FP_ENTRIES];
  100866. /* Index of last entry in cache. */
  100867. static THREAD_LS_T int sp_cache_256_last = -1;
  100868. /* Cache has been initialized. */
  100869. static THREAD_LS_T int sp_cache_256_inited = 0;
  100870. #ifndef HAVE_THREAD_LS
  100871. static volatile int initCacheMutex_256 = 0;
  100872. static wolfSSL_Mutex sp_cache_256_lock;
  100873. #endif
  100874. /* Get the cache entry for the point.
  100875. *
  100876. * g [in] Point scalar multipling.
  100877. * cache [out] Cache table to use.
  100878. */
  100879. static void sp_ecc_get_cache_256(const sp_point_256* g, sp_cache_256_t** cache)
  100880. {
  100881. int i;
  100882. int j;
  100883. uint32_t least;
  100884. if (sp_cache_256_inited == 0) {
  100885. for (i=0; i<FP_ENTRIES; i++) {
  100886. sp_cache_256[i].set = 0;
  100887. }
  100888. sp_cache_256_inited = 1;
  100889. }
  100890. /* Compare point with those in cache. */
  100891. for (i=0; i<FP_ENTRIES; i++) {
  100892. if (!sp_cache_256[i].set)
  100893. continue;
  100894. if (sp_256_cmp_equal_8(g->x, sp_cache_256[i].x) &
  100895. sp_256_cmp_equal_8(g->y, sp_cache_256[i].y)) {
  100896. sp_cache_256[i].cnt++;
  100897. break;
  100898. }
  100899. }
  100900. /* No match. */
  100901. if (i == FP_ENTRIES) {
  100902. /* Find empty entry. */
  100903. i = (sp_cache_256_last + 1) % FP_ENTRIES;
  100904. for (; i != sp_cache_256_last; i=(i+1)%FP_ENTRIES) {
  100905. if (!sp_cache_256[i].set) {
  100906. break;
  100907. }
  100908. }
  100909. /* Evict least used. */
  100910. if (i == sp_cache_256_last) {
  100911. least = sp_cache_256[0].cnt;
  100912. for (j=1; j<FP_ENTRIES; j++) {
  100913. if (sp_cache_256[j].cnt < least) {
  100914. i = j;
  100915. least = sp_cache_256[i].cnt;
  100916. }
  100917. }
  100918. }
  100919. XMEMCPY(sp_cache_256[i].x, g->x, sizeof(sp_cache_256[i].x));
  100920. XMEMCPY(sp_cache_256[i].y, g->y, sizeof(sp_cache_256[i].y));
  100921. sp_cache_256[i].set = 1;
  100922. sp_cache_256[i].cnt = 1;
  100923. }
  100924. *cache = &sp_cache_256[i];
  100925. sp_cache_256_last = i;
  100926. }
  100927. #endif /* FP_ECC */
  100928. /* Multiply the base point of P256 by the scalar and return the result.
  100929. * If map is true then convert result to affine coordinates.
  100930. *
  100931. * r Resulting point.
  100932. * g Point to multiply.
  100933. * k Scalar to multiply by.
  100934. * map Indicates whether to convert result to affine.
  100935. * ct Constant time required.
  100936. * heap Heap to use for allocation.
  100937. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  100938. */
  100939. static int sp_256_ecc_mulmod_8(sp_point_256* r, const sp_point_256* g, const sp_digit* k,
  100940. int map, int ct, void* heap)
  100941. {
  100942. #ifndef FP_ECC
  100943. return sp_256_ecc_mulmod_fast_8(r, g, k, map, ct, heap);
  100944. #else
  100945. sp_digit tmp[2 * 8 * 6];
  100946. sp_cache_256_t* cache;
  100947. int err = MP_OKAY;
  100948. #ifndef HAVE_THREAD_LS
  100949. if (initCacheMutex_256 == 0) {
  100950. wc_InitMutex(&sp_cache_256_lock);
  100951. initCacheMutex_256 = 1;
  100952. }
  100953. if (wc_LockMutex(&sp_cache_256_lock) != 0)
  100954. err = BAD_MUTEX_E;
  100955. #endif /* HAVE_THREAD_LS */
  100956. if (err == MP_OKAY) {
  100957. sp_ecc_get_cache_256(g, &cache);
  100958. if (cache->cnt == 2)
  100959. sp_256_gen_stripe_table_8(g, cache->table, tmp, heap);
  100960. #ifndef HAVE_THREAD_LS
  100961. wc_UnLockMutex(&sp_cache_256_lock);
  100962. #endif /* HAVE_THREAD_LS */
  100963. if (cache->cnt < 2) {
  100964. err = sp_256_ecc_mulmod_fast_8(r, g, k, map, ct, heap);
  100965. }
  100966. else {
  100967. err = sp_256_ecc_mulmod_stripe_8(r, g, cache->table, k,
  100968. map, ct, heap);
  100969. }
  100970. }
  100971. return err;
  100972. #endif
  100973. }
  100974. #else
  100975. #ifdef FP_ECC
  100976. /* Generate the pre-computed table of points for the base point.
  100977. *
  100978. * width = 8
  100979. * 256 entries
  100980. * 32 bits between
  100981. *
  100982. * a The base point.
  100983. * table Place to store generated point data.
  100984. * tmp Temporary data.
  100985. * heap Heap to use for allocation.
  100986. */
  100987. static int sp_256_gen_stripe_table_8(const sp_point_256* a,
  100988. sp_table_entry_256* table, sp_digit* tmp, void* heap)
  100989. {
  100990. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  100991. sp_point_256* t = NULL;
  100992. #else
  100993. sp_point_256 t[3];
  100994. #endif
  100995. sp_point_256* s1 = NULL;
  100996. sp_point_256* s2 = NULL;
  100997. int i;
  100998. int j;
  100999. int err = MP_OKAY;
  101000. (void)heap;
  101001. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  101002. t = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 3, heap,
  101003. DYNAMIC_TYPE_ECC);
  101004. if (t == NULL)
  101005. err = MEMORY_E;
  101006. #endif
  101007. if (err == MP_OKAY) {
  101008. s1 = t + 1;
  101009. s2 = t + 2;
  101010. err = sp_256_mod_mul_norm_8(t->x, a->x, p256_mod);
  101011. }
  101012. if (err == MP_OKAY) {
  101013. err = sp_256_mod_mul_norm_8(t->y, a->y, p256_mod);
  101014. }
  101015. if (err == MP_OKAY) {
  101016. err = sp_256_mod_mul_norm_8(t->z, a->z, p256_mod);
  101017. }
  101018. if (err == MP_OKAY) {
  101019. t->infinity = 0;
  101020. sp_256_proj_to_affine_8(t, tmp);
  101021. XMEMCPY(s1->z, p256_norm_mod, sizeof(p256_norm_mod));
  101022. s1->infinity = 0;
  101023. XMEMCPY(s2->z, p256_norm_mod, sizeof(p256_norm_mod));
  101024. s2->infinity = 0;
  101025. /* table[0] = {0, 0, infinity} */
  101026. XMEMSET(&table[0], 0, sizeof(sp_table_entry_256));
  101027. /* table[1] = Affine version of 'a' in Montgomery form */
  101028. XMEMCPY(table[1].x, t->x, sizeof(table->x));
  101029. XMEMCPY(table[1].y, t->y, sizeof(table->y));
  101030. for (i=1; i<8; i++) {
  101031. sp_256_proj_point_dbl_n_8(t, 32, tmp);
  101032. sp_256_proj_to_affine_8(t, tmp);
  101033. XMEMCPY(table[1<<i].x, t->x, sizeof(table->x));
  101034. XMEMCPY(table[1<<i].y, t->y, sizeof(table->y));
  101035. }
  101036. for (i=1; i<8; i++) {
  101037. XMEMCPY(s1->x, table[1<<i].x, sizeof(table->x));
  101038. XMEMCPY(s1->y, table[1<<i].y, sizeof(table->y));
  101039. for (j=(1<<i)+1; j<(1<<(i+1)); j++) {
  101040. XMEMCPY(s2->x, table[j-(1<<i)].x, sizeof(table->x));
  101041. XMEMCPY(s2->y, table[j-(1<<i)].y, sizeof(table->y));
  101042. sp_256_proj_point_add_qz1_8(t, s1, s2, tmp);
  101043. sp_256_proj_to_affine_8(t, tmp);
  101044. XMEMCPY(table[j].x, t->x, sizeof(table->x));
  101045. XMEMCPY(table[j].y, t->y, sizeof(table->y));
  101046. }
  101047. }
  101048. }
  101049. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  101050. if (t != NULL)
  101051. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  101052. #endif
  101053. return err;
  101054. }
  101055. #endif /* FP_ECC */
  101056. #ifndef WC_NO_CACHE_RESISTANT
  101057. /* Touch each possible entry that could be being copied.
  101058. *
  101059. * r Point to copy into.
  101060. * table Table - start of the entires to access
  101061. * idx Index of entry to retrieve.
  101062. */
  101063. static void sp_256_get_entry_256_8(sp_point_256* r,
  101064. const sp_table_entry_256* table, int idx)
  101065. {
  101066. int i;
  101067. sp_digit mask;
  101068. r->x[0] = 0;
  101069. r->x[1] = 0;
  101070. r->x[2] = 0;
  101071. r->x[3] = 0;
  101072. r->x[4] = 0;
  101073. r->x[5] = 0;
  101074. r->x[6] = 0;
  101075. r->x[7] = 0;
  101076. r->y[0] = 0;
  101077. r->y[1] = 0;
  101078. r->y[2] = 0;
  101079. r->y[3] = 0;
  101080. r->y[4] = 0;
  101081. r->y[5] = 0;
  101082. r->y[6] = 0;
  101083. r->y[7] = 0;
  101084. for (i = 1; i < 256; i++) {
  101085. mask = 0 - (i == idx);
  101086. r->x[0] |= mask & table[i].x[0];
  101087. r->x[1] |= mask & table[i].x[1];
  101088. r->x[2] |= mask & table[i].x[2];
  101089. r->x[3] |= mask & table[i].x[3];
  101090. r->x[4] |= mask & table[i].x[4];
  101091. r->x[5] |= mask & table[i].x[5];
  101092. r->x[6] |= mask & table[i].x[6];
  101093. r->x[7] |= mask & table[i].x[7];
  101094. r->y[0] |= mask & table[i].y[0];
  101095. r->y[1] |= mask & table[i].y[1];
  101096. r->y[2] |= mask & table[i].y[2];
  101097. r->y[3] |= mask & table[i].y[3];
  101098. r->y[4] |= mask & table[i].y[4];
  101099. r->y[5] |= mask & table[i].y[5];
  101100. r->y[6] |= mask & table[i].y[6];
  101101. r->y[7] |= mask & table[i].y[7];
  101102. }
  101103. }
  101104. #endif /* !WC_NO_CACHE_RESISTANT */
  101105. /* Multiply the point by the scalar and return the result.
  101106. * If map is true then convert result to affine coordinates.
  101107. *
  101108. * Stripe implementation.
  101109. * Pre-generated: 2^0, 2^32, ...
  101110. * Pre-generated: products of all combinations of above.
  101111. * 8 doubles and adds (with qz=1)
  101112. *
  101113. * r Resulting point.
  101114. * k Scalar to multiply by.
  101115. * table Pre-computed table.
  101116. * map Indicates whether to convert result to affine.
  101117. * ct Constant time required.
  101118. * heap Heap to use for allocation.
  101119. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  101120. */
  101121. static int sp_256_ecc_mulmod_stripe_8(sp_point_256* r, const sp_point_256* g,
  101122. const sp_table_entry_256* table, const sp_digit* k, int map,
  101123. int ct, void* heap)
  101124. {
  101125. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  101126. sp_point_256* rt = NULL;
  101127. sp_digit* t = NULL;
  101128. #else
  101129. sp_point_256 rt[2];
  101130. sp_digit t[2 * 8 * 6];
  101131. #endif
  101132. sp_point_256* p = NULL;
  101133. int i;
  101134. int j;
  101135. int y;
  101136. int x;
  101137. int err = MP_OKAY;
  101138. (void)g;
  101139. /* Constant time used for cache attack resistance implementation. */
  101140. (void)ct;
  101141. (void)heap;
  101142. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  101143. rt = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap,
  101144. DYNAMIC_TYPE_ECC);
  101145. if (rt == NULL)
  101146. err = MEMORY_E;
  101147. if (err == MP_OKAY) {
  101148. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 8 * 6, heap,
  101149. DYNAMIC_TYPE_ECC);
  101150. if (t == NULL)
  101151. err = MEMORY_E;
  101152. }
  101153. #endif
  101154. if (err == MP_OKAY) {
  101155. p = rt + 1;
  101156. XMEMCPY(p->z, p256_norm_mod, sizeof(p256_norm_mod));
  101157. XMEMCPY(rt->z, p256_norm_mod, sizeof(p256_norm_mod));
  101158. y = 0;
  101159. x = 31;
  101160. for (j=0; j<8; j++) {
  101161. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  101162. x += 32;
  101163. }
  101164. #ifndef WC_NO_CACHE_RESISTANT
  101165. if (ct) {
  101166. sp_256_get_entry_256_8(rt, table, y);
  101167. } else
  101168. #endif
  101169. {
  101170. XMEMCPY(rt->x, table[y].x, sizeof(table[y].x));
  101171. XMEMCPY(rt->y, table[y].y, sizeof(table[y].y));
  101172. }
  101173. rt->infinity = !y;
  101174. for (i=30; i>=0; i--) {
  101175. y = 0;
  101176. x = i;
  101177. for (j=0; j<8; j++) {
  101178. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  101179. x += 32;
  101180. }
  101181. sp_256_proj_point_dbl_8(rt, rt, t);
  101182. #ifndef WC_NO_CACHE_RESISTANT
  101183. if (ct) {
  101184. sp_256_get_entry_256_8(p, table, y);
  101185. }
  101186. else
  101187. #endif
  101188. {
  101189. XMEMCPY(p->x, table[y].x, sizeof(table[y].x));
  101190. XMEMCPY(p->y, table[y].y, sizeof(table[y].y));
  101191. }
  101192. p->infinity = !y;
  101193. sp_256_proj_point_add_qz1_8(rt, rt, p, t);
  101194. }
  101195. if (map != 0) {
  101196. sp_256_map_8(r, rt, t);
  101197. }
  101198. else {
  101199. XMEMCPY(r, rt, sizeof(sp_point_256));
  101200. }
  101201. }
  101202. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  101203. if (t != NULL)
  101204. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  101205. if (rt != NULL)
  101206. XFREE(rt, heap, DYNAMIC_TYPE_ECC);
  101207. #endif
  101208. return err;
  101209. }
  101210. #ifdef FP_ECC
  101211. #ifndef FP_ENTRIES
  101212. #define FP_ENTRIES 16
  101213. #endif
  101214. /* Cache entry - holds precomputation tables for a point. */
  101215. typedef struct sp_cache_256_t {
  101216. /* X ordinate of point that table was generated from. */
  101217. sp_digit x[8];
  101218. /* Y ordinate of point that table was generated from. */
  101219. sp_digit y[8];
  101220. /* Precomputation table for point. */
  101221. sp_table_entry_256 table[256];
  101222. /* Count of entries in table. */
  101223. uint32_t cnt;
  101224. /* Point and table set in entry. */
  101225. int set;
  101226. } sp_cache_256_t;
  101227. /* Cache of tables. */
  101228. static THREAD_LS_T sp_cache_256_t sp_cache_256[FP_ENTRIES];
  101229. /* Index of last entry in cache. */
  101230. static THREAD_LS_T int sp_cache_256_last = -1;
  101231. /* Cache has been initialized. */
  101232. static THREAD_LS_T int sp_cache_256_inited = 0;
  101233. #ifndef HAVE_THREAD_LS
  101234. static volatile int initCacheMutex_256 = 0;
  101235. static wolfSSL_Mutex sp_cache_256_lock;
  101236. #endif
  101237. /* Get the cache entry for the point.
  101238. *
  101239. * g [in] Point scalar multipling.
  101240. * cache [out] Cache table to use.
  101241. */
  101242. static void sp_ecc_get_cache_256(const sp_point_256* g, sp_cache_256_t** cache)
  101243. {
  101244. int i;
  101245. int j;
  101246. uint32_t least;
  101247. if (sp_cache_256_inited == 0) {
  101248. for (i=0; i<FP_ENTRIES; i++) {
  101249. sp_cache_256[i].set = 0;
  101250. }
  101251. sp_cache_256_inited = 1;
  101252. }
  101253. /* Compare point with those in cache. */
  101254. for (i=0; i<FP_ENTRIES; i++) {
  101255. if (!sp_cache_256[i].set)
  101256. continue;
  101257. if (sp_256_cmp_equal_8(g->x, sp_cache_256[i].x) &
  101258. sp_256_cmp_equal_8(g->y, sp_cache_256[i].y)) {
  101259. sp_cache_256[i].cnt++;
  101260. break;
  101261. }
  101262. }
  101263. /* No match. */
  101264. if (i == FP_ENTRIES) {
  101265. /* Find empty entry. */
  101266. i = (sp_cache_256_last + 1) % FP_ENTRIES;
  101267. for (; i != sp_cache_256_last; i=(i+1)%FP_ENTRIES) {
  101268. if (!sp_cache_256[i].set) {
  101269. break;
  101270. }
  101271. }
  101272. /* Evict least used. */
  101273. if (i == sp_cache_256_last) {
  101274. least = sp_cache_256[0].cnt;
  101275. for (j=1; j<FP_ENTRIES; j++) {
  101276. if (sp_cache_256[j].cnt < least) {
  101277. i = j;
  101278. least = sp_cache_256[i].cnt;
  101279. }
  101280. }
  101281. }
  101282. XMEMCPY(sp_cache_256[i].x, g->x, sizeof(sp_cache_256[i].x));
  101283. XMEMCPY(sp_cache_256[i].y, g->y, sizeof(sp_cache_256[i].y));
  101284. sp_cache_256[i].set = 1;
  101285. sp_cache_256[i].cnt = 1;
  101286. }
  101287. *cache = &sp_cache_256[i];
  101288. sp_cache_256_last = i;
  101289. }
  101290. #endif /* FP_ECC */
  101291. /* Multiply the base point of P256 by the scalar and return the result.
  101292. * If map is true then convert result to affine coordinates.
  101293. *
  101294. * r Resulting point.
  101295. * g Point to multiply.
  101296. * k Scalar to multiply by.
  101297. * map Indicates whether to convert result to affine.
  101298. * ct Constant time required.
  101299. * heap Heap to use for allocation.
  101300. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  101301. */
  101302. static int sp_256_ecc_mulmod_8(sp_point_256* r, const sp_point_256* g, const sp_digit* k,
  101303. int map, int ct, void* heap)
  101304. {
  101305. #ifndef FP_ECC
  101306. return sp_256_ecc_mulmod_fast_8(r, g, k, map, ct, heap);
  101307. #else
  101308. sp_digit tmp[2 * 8 * 6];
  101309. sp_cache_256_t* cache;
  101310. int err = MP_OKAY;
  101311. #ifndef HAVE_THREAD_LS
  101312. if (initCacheMutex_256 == 0) {
  101313. wc_InitMutex(&sp_cache_256_lock);
  101314. initCacheMutex_256 = 1;
  101315. }
  101316. if (wc_LockMutex(&sp_cache_256_lock) != 0)
  101317. err = BAD_MUTEX_E;
  101318. #endif /* HAVE_THREAD_LS */
  101319. if (err == MP_OKAY) {
  101320. sp_ecc_get_cache_256(g, &cache);
  101321. if (cache->cnt == 2)
  101322. sp_256_gen_stripe_table_8(g, cache->table, tmp, heap);
  101323. #ifndef HAVE_THREAD_LS
  101324. wc_UnLockMutex(&sp_cache_256_lock);
  101325. #endif /* HAVE_THREAD_LS */
  101326. if (cache->cnt < 2) {
  101327. err = sp_256_ecc_mulmod_fast_8(r, g, k, map, ct, heap);
  101328. }
  101329. else {
  101330. err = sp_256_ecc_mulmod_stripe_8(r, g, cache->table, k,
  101331. map, ct, heap);
  101332. }
  101333. }
  101334. return err;
  101335. #endif
  101336. }
  101337. #endif /* WOLFSSL_SP_SMALL */
  101338. /* Multiply the point by the scalar and return the result.
  101339. * If map is true then convert result to affine coordinates.
  101340. *
  101341. * km Scalar to multiply by.
  101342. * p Point to multiply.
  101343. * r Resulting point.
  101344. * map Indicates whether to convert result to affine.
  101345. * heap Heap to use for allocation.
  101346. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  101347. */
  101348. int sp_ecc_mulmod_256(const mp_int* km, const ecc_point* gm, ecc_point* r,
  101349. int map, void* heap)
  101350. {
  101351. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  101352. sp_point_256* point = NULL;
  101353. sp_digit* k = NULL;
  101354. #else
  101355. sp_point_256 point[1];
  101356. sp_digit k[8];
  101357. #endif
  101358. int err = MP_OKAY;
  101359. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  101360. point = (sp_point_256*)XMALLOC(sizeof(sp_point_256), heap,
  101361. DYNAMIC_TYPE_ECC);
  101362. if (point == NULL)
  101363. err = MEMORY_E;
  101364. if (err == MP_OKAY) {
  101365. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 8, heap,
  101366. DYNAMIC_TYPE_ECC);
  101367. if (k == NULL)
  101368. err = MEMORY_E;
  101369. }
  101370. #endif
  101371. if (err == MP_OKAY) {
  101372. sp_256_from_mp(k, 8, km);
  101373. sp_256_point_from_ecc_point_8(point, gm);
  101374. err = sp_256_ecc_mulmod_8(point, point, k, map, 1, heap);
  101375. }
  101376. if (err == MP_OKAY) {
  101377. err = sp_256_point_to_ecc_point_8(point, r);
  101378. }
  101379. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  101380. if (k != NULL)
  101381. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  101382. if (point != NULL)
  101383. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  101384. #endif
  101385. return err;
  101386. }
  101387. /* Multiply the point by the scalar, add point a and return the result.
  101388. * If map is true then convert result to affine coordinates.
  101389. *
  101390. * km Scalar to multiply by.
  101391. * p Point to multiply.
  101392. * am Point to add to scalar mulitply result.
  101393. * inMont Point to add is in montgomery form.
  101394. * r Resulting point.
  101395. * map Indicates whether to convert result to affine.
  101396. * heap Heap to use for allocation.
  101397. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  101398. */
  101399. int sp_ecc_mulmod_add_256(const mp_int* km, const ecc_point* gm,
  101400. const ecc_point* am, int inMont, ecc_point* r, int map, void* heap)
  101401. {
  101402. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  101403. sp_point_256* point = NULL;
  101404. sp_digit* k = NULL;
  101405. #else
  101406. sp_point_256 point[2];
  101407. sp_digit k[8 + 8 * 2 * 6];
  101408. #endif
  101409. sp_point_256* addP = NULL;
  101410. sp_digit* tmp = NULL;
  101411. int err = MP_OKAY;
  101412. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  101413. point = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap,
  101414. DYNAMIC_TYPE_ECC);
  101415. if (point == NULL)
  101416. err = MEMORY_E;
  101417. if (err == MP_OKAY) {
  101418. k = (sp_digit*)XMALLOC(
  101419. sizeof(sp_digit) * (8 + 8 * 2 * 6), heap,
  101420. DYNAMIC_TYPE_ECC);
  101421. if (k == NULL)
  101422. err = MEMORY_E;
  101423. }
  101424. #endif
  101425. if (err == MP_OKAY) {
  101426. addP = point + 1;
  101427. tmp = k + 8;
  101428. sp_256_from_mp(k, 8, km);
  101429. sp_256_point_from_ecc_point_8(point, gm);
  101430. sp_256_point_from_ecc_point_8(addP, am);
  101431. }
  101432. if ((err == MP_OKAY) && (!inMont)) {
  101433. err = sp_256_mod_mul_norm_8(addP->x, addP->x, p256_mod);
  101434. }
  101435. if ((err == MP_OKAY) && (!inMont)) {
  101436. err = sp_256_mod_mul_norm_8(addP->y, addP->y, p256_mod);
  101437. }
  101438. if ((err == MP_OKAY) && (!inMont)) {
  101439. err = sp_256_mod_mul_norm_8(addP->z, addP->z, p256_mod);
  101440. }
  101441. if (err == MP_OKAY) {
  101442. err = sp_256_ecc_mulmod_8(point, point, k, 0, 0, heap);
  101443. }
  101444. if (err == MP_OKAY) {
  101445. sp_256_proj_point_add_8(point, point, addP, tmp);
  101446. if (map) {
  101447. sp_256_map_8(point, point, tmp);
  101448. }
  101449. err = sp_256_point_to_ecc_point_8(point, r);
  101450. }
  101451. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  101452. if (k != NULL)
  101453. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  101454. if (point != NULL)
  101455. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  101456. #endif
  101457. return err;
  101458. }
  101459. #ifdef WOLFSSL_SP_SMALL
  101460. /* Striping precomputation table.
  101461. * 4 points combined into a table of 16 points.
  101462. * Distance of 64 between points.
  101463. */
  101464. static const sp_table_entry_256 p256_table[16] = {
  101465. /* 0 */
  101466. { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  101467. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
  101468. /* 1 */
  101469. { { 0x18a9143c,0x79e730d4,0x5fedb601,0x75ba95fc,0x77622510,0x79fb732b,
  101470. 0xa53755c6,0x18905f76 },
  101471. { 0xce95560a,0xddf25357,0xba19e45c,0x8b4ab8e4,0xdd21f325,0xd2e88688,
  101472. 0x25885d85,0x8571ff18 } },
  101473. /* 2 */
  101474. { { 0x16a0d2bb,0x4f922fc5,0x1a623499,0x0d5cc16c,0x57c62c8b,0x9241cf3a,
  101475. 0xfd1b667f,0x2f5e6961 },
  101476. { 0xf5a01797,0x5c15c70b,0x60956192,0x3d20b44d,0x071fdb52,0x04911b37,
  101477. 0x8d6f0f7b,0xf648f916 } },
  101478. /* 3 */
  101479. { { 0xe137bbbc,0x9e566847,0x8a6a0bec,0xe434469e,0x79d73463,0xb1c42761,
  101480. 0x133d0015,0x5abe0285 },
  101481. { 0xc04c7dab,0x92aa837c,0x43260c07,0x573d9f4c,0x78e6cc37,0x0c931562,
  101482. 0x6b6f7383,0x94bb725b } },
  101483. /* 4 */
  101484. { { 0xbfe20925,0x62a8c244,0x8fdce867,0x91c19ac3,0xdd387063,0x5a96a5d5,
  101485. 0x21d324f6,0x61d587d4 },
  101486. { 0xa37173ea,0xe87673a2,0x53778b65,0x23848008,0x05bab43e,0x10f8441e,
  101487. 0x4621efbe,0xfa11fe12 } },
  101488. /* 5 */
  101489. { { 0x2cb19ffd,0x1c891f2b,0xb1923c23,0x01ba8d5b,0x8ac5ca8e,0xb6d03d67,
  101490. 0x1f13bedc,0x586eb04c },
  101491. { 0x27e8ed09,0x0c35c6e5,0x1819ede2,0x1e81a33c,0x56c652fa,0x278fd6c0,
  101492. 0x70864f11,0x19d5ac08 } },
  101493. /* 6 */
  101494. { { 0xd2b533d5,0x62577734,0xa1bdddc0,0x673b8af6,0xa79ec293,0x577e7c9a,
  101495. 0xc3b266b1,0xbb6de651 },
  101496. { 0xb65259b3,0xe7e9303a,0xd03a7480,0xd6a0afd3,0x9b3cfc27,0xc5ac83d1,
  101497. 0x5d18b99b,0x60b4619a } },
  101498. /* 7 */
  101499. { { 0x1ae5aa1c,0xbd6a38e1,0x49e73658,0xb8b7652b,0xee5f87ed,0x0b130014,
  101500. 0xaeebffcd,0x9d0f27b2 },
  101501. { 0x7a730a55,0xca924631,0xddbbc83a,0x9c955b2f,0xac019a71,0x07c1dfe0,
  101502. 0x356ec48d,0x244a566d } },
  101503. /* 8 */
  101504. { { 0xf4f8b16a,0x56f8410e,0xc47b266a,0x97241afe,0x6d9c87c1,0x0a406b8e,
  101505. 0xcd42ab1b,0x803f3e02 },
  101506. { 0x04dbec69,0x7f0309a8,0x3bbad05f,0xa83b85f7,0xad8e197f,0xc6097273,
  101507. 0x5067adc1,0xc097440e } },
  101508. /* 9 */
  101509. { { 0xc379ab34,0x846a56f2,0x841df8d1,0xa8ee068b,0x176c68ef,0x20314459,
  101510. 0x915f1f30,0xf1af32d5 },
  101511. { 0x5d75bd50,0x99c37531,0xf72f67bc,0x837cffba,0x48d7723f,0x0613a418,
  101512. 0xe2d41c8b,0x23d0f130 } },
  101513. /* 10 */
  101514. { { 0xd5be5a2b,0xed93e225,0x5934f3c6,0x6fe79983,0x22626ffc,0x43140926,
  101515. 0x7990216a,0x50bbb4d9 },
  101516. { 0xe57ec63e,0x378191c6,0x181dcdb2,0x65422c40,0x0236e0f6,0x41a8099b,
  101517. 0x01fe49c3,0x2b100118 } },
  101518. /* 11 */
  101519. { { 0x9b391593,0xfc68b5c5,0x598270fc,0xc385f5a2,0xd19adcbb,0x7144f3aa,
  101520. 0x83fbae0c,0xdd558999 },
  101521. { 0x74b82ff4,0x93b88b8e,0x71e734c9,0xd2e03c40,0x43c0322a,0x9a7a9eaf,
  101522. 0x149d6041,0xe6e4c551 } },
  101523. /* 12 */
  101524. { { 0x80ec21fe,0x5fe14bfe,0xc255be82,0xf6ce116a,0x2f4a5d67,0x98bc5a07,
  101525. 0xdb7e63af,0xfad27148 },
  101526. { 0x29ab05b3,0x90c0b6ac,0x4e251ae6,0x37a9a83c,0xc2aade7d,0x0a7dc875,
  101527. 0x9f0e1a84,0x77387de3 } },
  101528. /* 13 */
  101529. { { 0xa56c0dd7,0x1e9ecc49,0x46086c74,0xa5cffcd8,0xf505aece,0x8f7a1408,
  101530. 0xbef0c47e,0xb37b85c0 },
  101531. { 0xcc0e6a8f,0x3596b6e4,0x6b388f23,0xfd6d4bbf,0xc39cef4e,0xaba453fa,
  101532. 0xf9f628d5,0x9c135ac8 } },
  101533. /* 14 */
  101534. { { 0x95c8f8be,0x0a1c7294,0x3bf362bf,0x2961c480,0xdf63d4ac,0x9e418403,
  101535. 0x91ece900,0xc109f9cb },
  101536. { 0x58945705,0xc2d095d0,0xddeb85c0,0xb9083d96,0x7a40449b,0x84692b8d,
  101537. 0x2eee1ee1,0x9bc3344f } },
  101538. /* 15 */
  101539. { { 0x42913074,0x0d5ae356,0x48a542b1,0x55491b27,0xb310732a,0x469ca665,
  101540. 0x5f1a4cc1,0x29591d52 },
  101541. { 0xb84f983f,0xe76f5b6b,0x9f5f84e1,0xbe7eef41,0x80baa189,0x1200d496,
  101542. 0x18ef332c,0x6376551f } },
  101543. };
  101544. /* Multiply the base point of P256 by the scalar and return the result.
  101545. * If map is true then convert result to affine coordinates.
  101546. *
  101547. * Stripe implementation.
  101548. * Pre-generated: 2^0, 2^64, ...
  101549. * Pre-generated: products of all combinations of above.
  101550. * 4 doubles and adds (with qz=1)
  101551. *
  101552. * r Resulting point.
  101553. * k Scalar to multiply by.
  101554. * map Indicates whether to convert result to affine.
  101555. * ct Constant time required.
  101556. * heap Heap to use for allocation.
  101557. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  101558. */
  101559. static int sp_256_ecc_mulmod_base_8(sp_point_256* r, const sp_digit* k,
  101560. int map, int ct, void* heap)
  101561. {
  101562. return sp_256_ecc_mulmod_stripe_8(r, &p256_base, p256_table,
  101563. k, map, ct, heap);
  101564. }
  101565. #else
  101566. /* Striping precomputation table.
  101567. * 8 points combined into a table of 256 points.
  101568. * Distance of 32 between points.
  101569. */
  101570. static const sp_table_entry_256 p256_table[256] = {
  101571. /* 0 */
  101572. { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  101573. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
  101574. /* 1 */
  101575. { { 0x18a9143c,0x79e730d4,0x5fedb601,0x75ba95fc,0x77622510,0x79fb732b,
  101576. 0xa53755c6,0x18905f76 },
  101577. { 0xce95560a,0xddf25357,0xba19e45c,0x8b4ab8e4,0xdd21f325,0xd2e88688,
  101578. 0x25885d85,0x8571ff18 } },
  101579. /* 2 */
  101580. { { 0x4147519a,0x20288602,0x26b372f0,0xd0981eac,0xa785ebc8,0xa9d4a7ca,
  101581. 0xdbdf58e9,0xd953c50d },
  101582. { 0xfd590f8f,0x9d6361cc,0x44e6c917,0x72e9626b,0x22eb64cf,0x7fd96110,
  101583. 0x9eb288f3,0x863ebb7e } },
  101584. /* 3 */
  101585. { { 0x5cdb6485,0x7856b623,0x2f0a2f97,0x808f0ea2,0x4f7e300b,0x3e68d954,
  101586. 0xb5ff80a0,0x00076055 },
  101587. { 0x838d2010,0x7634eb9b,0x3243708a,0x54014fbb,0x842a6606,0xe0e47d39,
  101588. 0x34373ee0,0x83087761 } },
  101589. /* 4 */
  101590. { { 0x16a0d2bb,0x4f922fc5,0x1a623499,0x0d5cc16c,0x57c62c8b,0x9241cf3a,
  101591. 0xfd1b667f,0x2f5e6961 },
  101592. { 0xf5a01797,0x5c15c70b,0x60956192,0x3d20b44d,0x071fdb52,0x04911b37,
  101593. 0x8d6f0f7b,0xf648f916 } },
  101594. /* 5 */
  101595. { { 0xe137bbbc,0x9e566847,0x8a6a0bec,0xe434469e,0x79d73463,0xb1c42761,
  101596. 0x133d0015,0x5abe0285 },
  101597. { 0xc04c7dab,0x92aa837c,0x43260c07,0x573d9f4c,0x78e6cc37,0x0c931562,
  101598. 0x6b6f7383,0x94bb725b } },
  101599. /* 6 */
  101600. { { 0x720f141c,0xbbf9b48f,0x2df5bc74,0x6199b3cd,0x411045c4,0xdc3f6129,
  101601. 0x2f7dc4ef,0xcdd6bbcb },
  101602. { 0xeaf436fd,0xcca6700b,0xb99326be,0x6f647f6d,0x014f2522,0x0c0fa792,
  101603. 0x4bdae5f6,0xa361bebd } },
  101604. /* 7 */
  101605. { { 0x597c13c7,0x28aa2558,0x50b7c3e1,0xc38d635f,0xf3c09d1d,0x07039aec,
  101606. 0xc4b5292c,0xba12ca09 },
  101607. { 0x59f91dfd,0x9e408fa4,0xceea07fb,0x3af43b66,0x9d780b29,0x1eceb089,
  101608. 0x701fef4b,0x53ebb99d } },
  101609. /* 8 */
  101610. { { 0xb0e63d34,0x4fe7ee31,0xa9e54fab,0xf4600572,0xd5e7b5a4,0xc0493334,
  101611. 0x06d54831,0x8589fb92 },
  101612. { 0x6583553a,0xaa70f5cc,0xe25649e5,0x0879094a,0x10044652,0xcc904507,
  101613. 0x02541c4f,0xebb0696d } },
  101614. /* 9 */
  101615. { { 0xac1647c5,0x4616ca15,0xc4cf5799,0xb8127d47,0x764dfbac,0xdc666aa3,
  101616. 0xd1b27da3,0xeb2820cb },
  101617. { 0x6a87e008,0x9406f8d8,0x922378f3,0xd87dfa9d,0x80ccecb2,0x56ed2e42,
  101618. 0x55a7da1d,0x1f28289b } },
  101619. /* 10 */
  101620. { { 0x3b89da99,0xabbaa0c0,0xb8284022,0xa6f2d79e,0xb81c05e8,0x27847862,
  101621. 0x05e54d63,0x337a4b59 },
  101622. { 0x21f7794a,0x3c67500d,0x7d6d7f61,0x207005b7,0x04cfd6e8,0x0a5a3781,
  101623. 0xf4c2fbd6,0x0d65e0d5 } },
  101624. /* 11 */
  101625. { { 0xb5275d38,0xd9d09bbe,0x0be0a358,0x4268a745,0x973eb265,0xf0762ff4,
  101626. 0x52f4a232,0xc23da242 },
  101627. { 0x0b94520c,0x5da1b84f,0xb05bd78e,0x09666763,0x94d29ea1,0x3a4dcb86,
  101628. 0xc790cff1,0x19de3b8c } },
  101629. /* 12 */
  101630. { { 0x26c5fe04,0x183a716c,0x3bba1bdb,0x3b28de0b,0xa4cb712c,0x7432c586,
  101631. 0x91fccbfd,0xe34dcbd4 },
  101632. { 0xaaa58403,0xb408d46b,0x82e97a53,0x9a697486,0x36aaa8af,0x9e390127,
  101633. 0x7b4e0f7f,0xe7641f44 } },
  101634. /* 13 */
  101635. { { 0xdf64ba59,0x7d753941,0x0b0242fc,0xd33f10ec,0xa1581859,0x4f06dfc6,
  101636. 0x052a57bf,0x4a12df57 },
  101637. { 0x9439dbd0,0xbfa6338f,0xbde53e1f,0xd3c24bd4,0x21f1b314,0xfd5e4ffa,
  101638. 0xbb5bea46,0x6af5aa93 } },
  101639. /* 14 */
  101640. { { 0x10c91999,0xda10b699,0x2a580491,0x0a24b440,0xb8cc2090,0x3e0094b4,
  101641. 0x66a44013,0x5fe3475a },
  101642. { 0xf93e7b4b,0xb0f8cabd,0x7c23f91a,0x292b501a,0xcd1e6263,0x42e889ae,
  101643. 0xecfea916,0xb544e308 } },
  101644. /* 15 */
  101645. { { 0x16ddfdce,0x6478c6e9,0xf89179e6,0x2c329166,0x4d4e67e1,0x4e8d6e76,
  101646. 0xa6b0c20b,0xe0b6b2bd },
  101647. { 0xbb7efb57,0x0d312df2,0x790c4007,0x1aac0dde,0x679bc944,0xf90336ad,
  101648. 0x25a63774,0x71c023de } },
  101649. /* 16 */
  101650. { { 0xbfe20925,0x62a8c244,0x8fdce867,0x91c19ac3,0xdd387063,0x5a96a5d5,
  101651. 0x21d324f6,0x61d587d4 },
  101652. { 0xa37173ea,0xe87673a2,0x53778b65,0x23848008,0x05bab43e,0x10f8441e,
  101653. 0x4621efbe,0xfa11fe12 } },
  101654. /* 17 */
  101655. { { 0x2cb19ffd,0x1c891f2b,0xb1923c23,0x01ba8d5b,0x8ac5ca8e,0xb6d03d67,
  101656. 0x1f13bedc,0x586eb04c },
  101657. { 0x27e8ed09,0x0c35c6e5,0x1819ede2,0x1e81a33c,0x56c652fa,0x278fd6c0,
  101658. 0x70864f11,0x19d5ac08 } },
  101659. /* 18 */
  101660. { { 0x309a4e1f,0x1e99f581,0xe9270074,0xab7de71b,0xefd28d20,0x26a5ef0b,
  101661. 0x7f9c563f,0xe7c0073f },
  101662. { 0x0ef59f76,0x1f6d663a,0x20fcb050,0x669b3b54,0x7a6602d4,0xc08c1f7a,
  101663. 0xc65b3c0a,0xe08504fe } },
  101664. /* 19 */
  101665. { { 0xa031b3ca,0xf098f68d,0xe6da6d66,0x6d1cab9e,0x94f246e8,0x5bfd81fa,
  101666. 0x5b0996b4,0x78f01882 },
  101667. { 0x3a25787f,0xb7eefde4,0x1dccac9b,0x8016f80d,0xb35bfc36,0x0cea4877,
  101668. 0x7e94747a,0x43a773b8 } },
  101669. /* 20 */
  101670. { { 0xd2b533d5,0x62577734,0xa1bdddc0,0x673b8af6,0xa79ec293,0x577e7c9a,
  101671. 0xc3b266b1,0xbb6de651 },
  101672. { 0xb65259b3,0xe7e9303a,0xd03a7480,0xd6a0afd3,0x9b3cfc27,0xc5ac83d1,
  101673. 0x5d18b99b,0x60b4619a } },
  101674. /* 21 */
  101675. { { 0x1ae5aa1c,0xbd6a38e1,0x49e73658,0xb8b7652b,0xee5f87ed,0x0b130014,
  101676. 0xaeebffcd,0x9d0f27b2 },
  101677. { 0x7a730a55,0xca924631,0xddbbc83a,0x9c955b2f,0xac019a71,0x07c1dfe0,
  101678. 0x356ec48d,0x244a566d } },
  101679. /* 22 */
  101680. { { 0xeacf1f96,0x6db0394a,0x024c271c,0x9f2122a9,0x82cbd3b9,0x2626ac1b,
  101681. 0x3581ef69,0x45e58c87 },
  101682. { 0xa38f9dbc,0xd3ff479d,0xe888a040,0xa8aaf146,0x46e0bed7,0x945adfb2,
  101683. 0xc1e4b7a4,0xc040e21c } },
  101684. /* 23 */
  101685. { { 0x6f8117b6,0x847af000,0x73a35433,0x651969ff,0x1d9475eb,0x482b3576,
  101686. 0x682c6ec7,0x1cdf5c97 },
  101687. { 0x11f04839,0x7db775b4,0x48de1698,0x7dbeacf4,0xb70b3219,0xb2921dd1,
  101688. 0xa92dff3d,0x046755f8 } },
  101689. /* 24 */
  101690. { { 0xbce8ffcd,0xcc8ac5d2,0x2fe61a82,0x0d53c48b,0x7202d6c7,0xf6f16172,
  101691. 0x3b83a5f3,0x046e5e11 },
  101692. { 0xd8007f01,0xe7b8ff64,0x5af43183,0x7fb1ef12,0x35e1a03c,0x045c5ea6,
  101693. 0x303d005b,0x6e0106c3 } },
  101694. /* 25 */
  101695. { { 0x88dd73b1,0x48c73584,0x995ed0d9,0x7670708f,0xc56a2ab7,0x38385ea8,
  101696. 0xe901cf1f,0x442594ed },
  101697. { 0x12d4b65b,0xf8faa2c9,0x96c90c37,0x94c2343b,0x5e978d1f,0xd326e4a1,
  101698. 0x4c2ee68e,0xa796fa51 } },
  101699. /* 26 */
  101700. { { 0x823addd7,0x359fb604,0xe56693b3,0x9e2a6183,0x3cbf3c80,0xf885b78e,
  101701. 0xc69766e9,0xe4ad2da9 },
  101702. { 0x8e048a61,0x357f7f42,0xc092d9a0,0x082d198c,0xc03ed8ef,0xfc3a1af4,
  101703. 0xc37b5143,0xc5e94046 } },
  101704. /* 27 */
  101705. { { 0x2be75f9e,0x476a538c,0xcb123a78,0x6fd1a9e8,0xb109c04b,0xd85e4df0,
  101706. 0xdb464747,0x63283daf },
  101707. { 0xbaf2df15,0xce728cf7,0x0ad9a7f4,0xe592c455,0xe834bcc3,0xfab226ad,
  101708. 0x1981a938,0x68bd19ab } },
  101709. /* 28 */
  101710. { { 0x1887d659,0xc08ead51,0xb359305a,0x3374d5f4,0xcfe74fe3,0x96986981,
  101711. 0x3c6fdfd6,0x495292f5 },
  101712. { 0x1acec896,0x4a878c9e,0xec5b4484,0xd964b210,0x664d60a7,0x6696f7e2,
  101713. 0x26036837,0x0ec7530d } },
  101714. /* 29 */
  101715. { { 0xad2687bb,0x2da13a05,0xf32e21fa,0xa1f83b6a,0x1dd4607b,0x390f5ef5,
  101716. 0x64863f0b,0x0f6207a6 },
  101717. { 0x0f138233,0xbd67e3bb,0x272aa718,0xdd66b96c,0x26ec88ae,0x8ed00407,
  101718. 0x08ed6dcf,0xff0db072 } },
  101719. /* 30 */
  101720. { { 0x4c95d553,0x749fa101,0x5d680a8a,0xa44052fd,0xff3b566f,0x183b4317,
  101721. 0x88740ea3,0x313b513c },
  101722. { 0x08d11549,0xb402e2ac,0xb4dee21c,0x071ee10b,0x47f2320e,0x26b987dd,
  101723. 0x86f19f81,0x2d3abcf9 } },
  101724. /* 31 */
  101725. { { 0x815581a2,0x4c288501,0x632211af,0x9a0a6d56,0x0cab2e99,0x19ba7a0f,
  101726. 0xded98cdf,0xc036fa10 },
  101727. { 0xc1fbd009,0x29ae08ba,0x06d15816,0x0b68b190,0x9b9e0d8f,0xc2eb3277,
  101728. 0xb6d40194,0xa6b2a2c4 } },
  101729. /* 32 */
  101730. { { 0x6d3549cf,0xd433e50f,0xfacd665e,0x6f33696f,0xce11fcb4,0x695bfdac,
  101731. 0xaf7c9860,0x810ee252 },
  101732. { 0x7159bb2c,0x65450fe1,0x758b357b,0xf7dfbebe,0xd69fea72,0x2b057e74,
  101733. 0x92731745,0xd485717a } },
  101734. /* 33 */
  101735. { { 0xf0cb5a98,0x11741a8a,0x1f3110bf,0xd3da8f93,0xab382adf,0x1994e2cb,
  101736. 0x2f9a604e,0x6a6045a7 },
  101737. { 0xa2b2411d,0x170c0d3f,0x510e96e0,0xbe0eb83e,0x8865b3cc,0x3bcc9f73,
  101738. 0xf9e15790,0xd3e45cfa } },
  101739. /* 34 */
  101740. { { 0xe83f7669,0xce1f69bb,0x72877d6b,0x09f8ae82,0x3244278d,0x9548ae54,
  101741. 0xe3c2c19c,0x207755de },
  101742. { 0x6fef1945,0x87bd61d9,0xb12d28c3,0x18813cef,0x72df64aa,0x9fbcd1d6,
  101743. 0x7154b00d,0x48dc5ee5 } },
  101744. /* 35 */
  101745. { { 0xf7e5a199,0x123790bf,0x989ccbb7,0xe0efb8cf,0x0a519c79,0xc27a2bfe,
  101746. 0xdff6f445,0xf2fb0aed },
  101747. { 0xf0b5025f,0x41c09575,0x40fa9f22,0x550543d7,0x380bfbd0,0x8fa3c8ad,
  101748. 0xdb28d525,0xa13e9015 } },
  101749. /* 36 */
  101750. { { 0xa2b65cbc,0xf9f7a350,0x2a464226,0x0b04b972,0xe23f07a1,0x265ce241,
  101751. 0x1497526f,0x2bf0d6b0 },
  101752. { 0x4b216fb7,0xd3d4dd3f,0xfbdda26a,0xf7d7b867,0x6708505c,0xaeb7b83f,
  101753. 0x162fe89f,0x42a94a5a } },
  101754. /* 37 */
  101755. { { 0xeaadf191,0x5846ad0b,0x25a268d7,0x0f8a4890,0x494dc1f6,0xe8603050,
  101756. 0xc65ede3d,0x2c2dd969 },
  101757. { 0x93849c17,0x6d02171d,0x1da250dd,0x460488ba,0x3c3a5485,0x4810c706,
  101758. 0x42c56dbc,0xf437fa1f } },
  101759. /* 38 */
  101760. { { 0x4a0f7dab,0x6aa0d714,0x1776e9ac,0x0f049793,0xf5f39786,0x52c0a050,
  101761. 0x54707aa8,0xaaf45b33 },
  101762. { 0xc18d364a,0x85e37c33,0x3e497165,0xd40b9b06,0x15ec5444,0xf4171681,
  101763. 0xf4f272bc,0xcdf6310d } },
  101764. /* 39 */
  101765. { { 0x8ea8b7ef,0x7473c623,0x85bc2287,0x08e93518,0x2bda8e34,0x41956772,
  101766. 0xda9e2ff2,0xf0d008ba },
  101767. { 0x2414d3b1,0x2912671d,0xb019ea76,0xb3754985,0x453bcbdb,0x5c61b96d,
  101768. 0xca887b8b,0x5bd5c2f5 } },
  101769. /* 40 */
  101770. { { 0xf49a3154,0xef0f469e,0x6e2b2e9a,0x3e85a595,0xaa924a9c,0x45aaec1e,
  101771. 0xa09e4719,0xaa12dfc8 },
  101772. { 0x4df69f1d,0x26f27227,0xa2ff5e73,0xe0e4c82c,0xb7a9dd44,0xb9d8ce73,
  101773. 0xe48ca901,0x6c036e73 } },
  101774. /* 41 */
  101775. { { 0x0f6e3138,0x5cfae12a,0x25ad345a,0x6966ef00,0x45672bc5,0x8993c64b,
  101776. 0x96afbe24,0x292ff658 },
  101777. { 0x5e213402,0xd5250d44,0x4392c9fe,0xf6580e27,0xda1c72e8,0x097b397f,
  101778. 0x311b7276,0x644e0c90 } },
  101779. /* 42 */
  101780. { { 0xa47153f0,0xe1e421e1,0x920418c9,0xb86c3b79,0x705d7672,0x93bdce87,
  101781. 0xcab79a77,0xf25ae793 },
  101782. { 0x6d869d0c,0x1f3194a3,0x4986c264,0x9d55c882,0x096e945e,0x49fb5ea3,
  101783. 0x13db0a3e,0x39b8e653 } },
  101784. /* 43 */
  101785. { { 0xb6fd2e59,0x37754200,0x9255c98f,0x35e2c066,0x0e2a5739,0xd9dab21a,
  101786. 0x0f19db06,0x39122f2f },
  101787. { 0x03cad53c,0xcfbce1e0,0xe65c17e3,0x225b2c0f,0x9aa13877,0x72baf1d2,
  101788. 0xce80ff8d,0x8de80af8 } },
  101789. /* 44 */
  101790. { { 0x207bbb76,0xafbea8d9,0x21782758,0x921c7e7c,0x1c0436b1,0xdfa2b74b,
  101791. 0x2e368c04,0x87194906 },
  101792. { 0xa3993df5,0xb5f928bb,0xf3b3d26a,0x639d75b5,0x85b55050,0x011aa78a,
  101793. 0x5b74fde1,0xfc315e6a } },
  101794. /* 45 */
  101795. { { 0xe8d6ecfa,0x561fd41a,0x1aec7f86,0x5f8c44f6,0x4924741d,0x98452a7b,
  101796. 0xee389088,0xe6d4a7ad },
  101797. { 0x4593c75d,0x60552ed1,0xdd271162,0x70a70da4,0x7ba2c7db,0xd2aede93,
  101798. 0x9be2ae57,0x35dfaf9a } },
  101799. /* 46 */
  101800. { { 0xaa736636,0x6b956fcd,0xae2cab7e,0x09f51d97,0x0f349966,0xfb10bf41,
  101801. 0x1c830d2b,0x1da5c7d7 },
  101802. { 0x3cce6825,0x5c41e483,0xf9573c3b,0x15ad118f,0xf23036b8,0xa28552c7,
  101803. 0xdbf4b9d6,0x7077c0fd } },
  101804. /* 47 */
  101805. { { 0x46b9661c,0xbf63ff8d,0x0d2cfd71,0xa1dfd36b,0xa847f8f7,0x0373e140,
  101806. 0xe50efe44,0x53a8632e },
  101807. { 0x696d8051,0x0976ff68,0xc74f468a,0xdaec0c95,0x5e4e26bd,0x62994dc3,
  101808. 0x34e1fcc1,0x028ca76d } },
  101809. /* 48 */
  101810. { { 0xfc9877ee,0xd11d47dc,0x801d0002,0xc8b36210,0x54c260b6,0xd002c117,
  101811. 0x6962f046,0x04c17cd8 },
  101812. { 0xb0daddf5,0x6d9bd094,0x24ce55c0,0xbea23575,0x72da03b5,0x663356e6,
  101813. 0xfed97474,0xf7ba4de9 } },
  101814. /* 49 */
  101815. { { 0xebe1263f,0xd0dbfa34,0x71ae7ce6,0x55763735,0x82a6f523,0xd2440553,
  101816. 0x52131c41,0xe31f9600 },
  101817. { 0xea6b6ec6,0xd1bb9216,0x73c2fc44,0x37a1d12e,0x89d0a294,0xc10e7eac,
  101818. 0xce34d47b,0xaa3a6259 } },
  101819. /* 50 */
  101820. { { 0x36f3dcd3,0xfbcf9df5,0xd2bf7360,0x6ceded50,0xdf504f5b,0x491710fa,
  101821. 0x7e79daee,0x2398dd62 },
  101822. { 0x6d09569e,0xcf4705a3,0x5149f769,0xea0619bb,0x35f6034c,0xff9c0377,
  101823. 0x1c046210,0x5717f5b2 } },
  101824. /* 51 */
  101825. { { 0x21dd895e,0x9fe229c9,0x40c28451,0x8e518500,0x1d637ecd,0xfa13d239,
  101826. 0x0e3c28de,0x660a2c56 },
  101827. { 0xd67fcbd0,0x9cca88ae,0x0ea9f096,0xc8472478,0x72e92b4d,0x32b2f481,
  101828. 0x4f522453,0x624ee54c } },
  101829. /* 52 */
  101830. { { 0xd897eccc,0x09549ce4,0x3f9880aa,0x4d49d1d9,0x043a7c20,0x723c2423,
  101831. 0x92bdfbc0,0x4f392afb },
  101832. { 0x7de44fd9,0x6969f8fa,0x57b32156,0xb66cfbe4,0x368ebc3c,0xdb2fa803,
  101833. 0xccdb399c,0x8a3e7977 } },
  101834. /* 53 */
  101835. { { 0x06c4b125,0xdde1881f,0xf6e3ca8c,0xae34e300,0x5c7a13e9,0xef6999de,
  101836. 0x70c24404,0x3888d023 },
  101837. { 0x44f91081,0x76280356,0x5f015504,0x3d9fcf61,0x632cd36e,0x1827edc8,
  101838. 0x18102336,0xa5e62e47 } },
  101839. /* 54 */
  101840. { { 0x2facd6c8,0x1a825ee3,0x54bcbc66,0x699c6354,0x98df9931,0x0ce3edf7,
  101841. 0x466a5adc,0x2c4768e6 },
  101842. { 0x90a64bc9,0xb346ff8c,0xe4779f5c,0x630a6020,0xbc05e884,0xd949d064,
  101843. 0xf9e652a0,0x7b5e6441 } },
  101844. /* 55 */
  101845. { { 0x1d28444a,0x2169422c,0xbe136a39,0xe996c5d8,0xfb0c7fce,0x2387afe5,
  101846. 0x0c8d744a,0xb8af73cb },
  101847. { 0x338b86fd,0x5fde83aa,0xa58a5cff,0xfee3f158,0x20ac9433,0xc9ee8f6f,
  101848. 0x7f3f0895,0xa036395f } },
  101849. /* 56 */
  101850. { { 0xa10f7770,0x8c73c6bb,0xa12a0e24,0xa6f16d81,0x51bc2b9f,0x100df682,
  101851. 0x875fb533,0x4be36b01 },
  101852. { 0x9fb56dbb,0x9226086e,0x07e7a4f8,0x306fef8b,0x66d52f20,0xeeaccc05,
  101853. 0x1bdc00c0,0x8cbc9a87 } },
  101854. /* 57 */
  101855. { { 0xc0dac4ab,0xe131895c,0x712ff112,0xa874a440,0x6a1cee57,0x6332ae7c,
  101856. 0x0c0835f8,0x44e7553e },
  101857. { 0x7734002d,0x6d503fff,0x0b34425c,0x9d35cb8b,0x0e8738b5,0x95f70276,
  101858. 0x5eb8fc18,0x470a683a } },
  101859. /* 58 */
  101860. { { 0x90513482,0x81b761dc,0x01e9276a,0x0287202a,0x0ce73083,0xcda441ee,
  101861. 0xc63dc6ef,0x16410690 },
  101862. { 0x6d06a2ed,0xf5034a06,0x189b100b,0xdd4d7745,0xab8218c9,0xd914ae72,
  101863. 0x7abcbb4f,0xd73479fd } },
  101864. /* 59 */
  101865. { { 0x5ad4c6e5,0x7edefb16,0x5b06d04d,0x262cf08f,0x8575cb14,0x12ed5bb1,
  101866. 0x0771666b,0x816469e3 },
  101867. { 0x561e291e,0xd7ab9d79,0xc1de1661,0xeb9daf22,0x135e0513,0xf49827eb,
  101868. 0xf0dd3f9c,0x0a36dd23 } },
  101869. /* 60 */
  101870. { { 0x41d5533c,0x098d32c7,0x8684628f,0x7c5f5a9e,0xe349bd11,0x39a228ad,
  101871. 0xfdbab118,0xe331dfd6 },
  101872. { 0x6bcc6ed8,0x5100ab68,0xef7a260e,0x7160c3bd,0xbce850d7,0x9063d9a7,
  101873. 0x492e3389,0xd3b4782a } },
  101874. /* 61 */
  101875. { { 0xf3821f90,0xa149b6e8,0x66eb7aad,0x92edd9ed,0x1a013116,0x0bb66953,
  101876. 0x4c86a5bd,0x7281275a },
  101877. { 0xd3ff47e5,0x503858f7,0x61016441,0x5e1616bc,0x7dfd9bb1,0x62b0f11a,
  101878. 0xce145059,0x2c062e7e } },
  101879. /* 62 */
  101880. { { 0x0159ac2e,0xa76f996f,0xcbdb2713,0x281e7736,0x08e46047,0x2ad6d288,
  101881. 0x2c4e7ef1,0x282a35f9 },
  101882. { 0xc0ce5cd2,0x9c354b1e,0x1379c229,0xcf99efc9,0x3e82c11e,0x992caf38,
  101883. 0x554d2abd,0xc71cd513 } },
  101884. /* 63 */
  101885. { { 0x09b578f4,0x4885de9c,0xe3affa7a,0x1884e258,0x59182f1f,0x8f76b1b7,
  101886. 0xcf47f3a3,0xc50f6740 },
  101887. { 0x374b68ea,0xa9c4adf3,0x69965fe2,0xa406f323,0x85a53050,0x2f86a222,
  101888. 0x212958dc,0xb9ecb3a7 } },
  101889. /* 64 */
  101890. { { 0xf4f8b16a,0x56f8410e,0xc47b266a,0x97241afe,0x6d9c87c1,0x0a406b8e,
  101891. 0xcd42ab1b,0x803f3e02 },
  101892. { 0x04dbec69,0x7f0309a8,0x3bbad05f,0xa83b85f7,0xad8e197f,0xc6097273,
  101893. 0x5067adc1,0xc097440e } },
  101894. /* 65 */
  101895. { { 0xc379ab34,0x846a56f2,0x841df8d1,0xa8ee068b,0x176c68ef,0x20314459,
  101896. 0x915f1f30,0xf1af32d5 },
  101897. { 0x5d75bd50,0x99c37531,0xf72f67bc,0x837cffba,0x48d7723f,0x0613a418,
  101898. 0xe2d41c8b,0x23d0f130 } },
  101899. /* 66 */
  101900. { { 0xf41500d9,0x857ab6ed,0xfcbeada8,0x0d890ae5,0x89725951,0x52fe8648,
  101901. 0xc0a3fadd,0xb0288dd6 },
  101902. { 0x650bcb08,0x85320f30,0x695d6e16,0x71af6313,0xb989aa76,0x31f520a7,
  101903. 0xf408c8d2,0xffd3724f } },
  101904. /* 67 */
  101905. { { 0xb458e6cb,0x53968e64,0x317a5d28,0x992dad20,0x7aa75f56,0x3814ae0b,
  101906. 0xd78c26df,0xf5590f4a },
  101907. { 0xcf0ba55a,0x0fc24bd3,0x0c778bae,0x0fc4724a,0x683b674a,0x1ce9864f,
  101908. 0xf6f74a20,0x18d6da54 } },
  101909. /* 68 */
  101910. { { 0xd5be5a2b,0xed93e225,0x5934f3c6,0x6fe79983,0x22626ffc,0x43140926,
  101911. 0x7990216a,0x50bbb4d9 },
  101912. { 0xe57ec63e,0x378191c6,0x181dcdb2,0x65422c40,0x0236e0f6,0x41a8099b,
  101913. 0x01fe49c3,0x2b100118 } },
  101914. /* 69 */
  101915. { { 0x9b391593,0xfc68b5c5,0x598270fc,0xc385f5a2,0xd19adcbb,0x7144f3aa,
  101916. 0x83fbae0c,0xdd558999 },
  101917. { 0x74b82ff4,0x93b88b8e,0x71e734c9,0xd2e03c40,0x43c0322a,0x9a7a9eaf,
  101918. 0x149d6041,0xe6e4c551 } },
  101919. /* 70 */
  101920. { { 0x1e9af288,0x55f655bb,0xf7ada931,0x647e1a64,0xcb2820e5,0x43697e4b,
  101921. 0x07ed56ff,0x51e00db1 },
  101922. { 0x771c327e,0x43d169b8,0x4a96c2ad,0x29cdb20b,0x3deb4779,0xc07d51f5,
  101923. 0x49829177,0xe22f4241 } },
  101924. /* 71 */
  101925. { { 0x635f1abb,0xcd45e8f4,0x68538874,0x7edc0cb5,0xb5a8034d,0xc9472c1f,
  101926. 0x52dc48c9,0xf709373d },
  101927. { 0xa8af30d6,0x401966bb,0xf137b69c,0x95bf5f4a,0x9361c47e,0x3966162a,
  101928. 0xe7275b11,0xbd52d288 } },
  101929. /* 72 */
  101930. { { 0x9c5fa877,0xab155c7a,0x7d3a3d48,0x17dad672,0x73d189d8,0x43f43f9e,
  101931. 0xc8aa77a6,0xa0d0f8e4 },
  101932. { 0xcc94f92d,0x0bbeafd8,0x0c4ddb3a,0xd818c8be,0xb82eba14,0x22cc65f8,
  101933. 0x946d6a00,0xa56c78c7 } },
  101934. /* 73 */
  101935. { { 0x0dd09529,0x2962391b,0x3daddfcf,0x803e0ea6,0x5b5bf481,0x2c77351f,
  101936. 0x731a367a,0xd8befdf8 },
  101937. { 0xfc0157f4,0xab919d42,0xfec8e650,0xf51caed7,0x02d48b0a,0xcdf9cb40,
  101938. 0xce9f6478,0x854a68a5 } },
  101939. /* 74 */
  101940. { { 0x63506ea5,0xdc35f67b,0xa4fe0d66,0x9286c489,0xfe95cd4d,0x3f101d3b,
  101941. 0x98846a95,0x5cacea0b },
  101942. { 0x9ceac44d,0xa90df60c,0x354d1c3a,0x3db29af4,0xad5dbabe,0x08dd3de8,
  101943. 0x35e4efa9,0xe4982d12 } },
  101944. /* 75 */
  101945. { { 0xc34cd55e,0x23104a22,0x2680d132,0x58695bb3,0x1fa1d943,0xfb345afa,
  101946. 0x16b20499,0x8046b7f6 },
  101947. { 0x38e7d098,0xb533581e,0xf46f0b70,0xd7f61e8d,0x44cb78c4,0x30dea9ea,
  101948. 0x9082af55,0xeb17ca7b } },
  101949. /* 76 */
  101950. { { 0x76a145b9,0x1751b598,0xc1bc71ec,0xa5cf6b0f,0x392715bb,0xd3e03565,
  101951. 0xfab5e131,0x097b00ba },
  101952. { 0x565f69e1,0xaa66c8e9,0xb5be5199,0x77e8f75a,0xda4fd984,0x6033ba11,
  101953. 0xafdbcc9e,0xf95c747b } },
  101954. /* 77 */
  101955. { { 0xbebae45e,0x558f01d3,0xc4bc6955,0xa8ebe9f0,0xdbc64fc6,0xaeb705b1,
  101956. 0x566ed837,0x3512601e },
  101957. { 0xfa1161cd,0x9336f1e1,0x4c65ef87,0x328ab8d5,0x724f21e5,0x4757eee2,
  101958. 0x6068ab6b,0x0ef97123 } },
  101959. /* 78 */
  101960. { { 0x54ca4226,0x02598cf7,0xf8642c8e,0x5eede138,0x468e1790,0x48963f74,
  101961. 0x3b4fbc95,0xfc16d933 },
  101962. { 0xe7c800ca,0xbe96fb31,0x2678adaa,0x13806331,0x6ff3e8b5,0x3d624497,
  101963. 0xb95d7a17,0x14ca4af1 } },
  101964. /* 79 */
  101965. { { 0xbd2f81d5,0x7a4771ba,0x01f7d196,0x1a5f9d69,0xcad9c907,0xd898bef7,
  101966. 0xf59c231d,0x4057b063 },
  101967. { 0x89c05c0a,0xbffd82fe,0x1dc0df85,0xe4911c6f,0xa35a16db,0x3befccae,
  101968. 0xf1330b13,0x1c3b5d64 } },
  101969. /* 80 */
  101970. { { 0x80ec21fe,0x5fe14bfe,0xc255be82,0xf6ce116a,0x2f4a5d67,0x98bc5a07,
  101971. 0xdb7e63af,0xfad27148 },
  101972. { 0x29ab05b3,0x90c0b6ac,0x4e251ae6,0x37a9a83c,0xc2aade7d,0x0a7dc875,
  101973. 0x9f0e1a84,0x77387de3 } },
  101974. /* 81 */
  101975. { { 0xa56c0dd7,0x1e9ecc49,0x46086c74,0xa5cffcd8,0xf505aece,0x8f7a1408,
  101976. 0xbef0c47e,0xb37b85c0 },
  101977. { 0xcc0e6a8f,0x3596b6e4,0x6b388f23,0xfd6d4bbf,0xc39cef4e,0xaba453fa,
  101978. 0xf9f628d5,0x9c135ac8 } },
  101979. /* 82 */
  101980. { { 0x84e35743,0x32aa3202,0x85a3cdef,0x320d6ab1,0x1df19819,0xb821b176,
  101981. 0xc433851f,0x5721361f },
  101982. { 0x71fc9168,0x1f0db36a,0x5e5c403c,0x5f98ba73,0x37bcd8f5,0xf64ca87e,
  101983. 0xe6bb11bd,0xdcbac3c9 } },
  101984. /* 83 */
  101985. { { 0x4518cbe2,0xf01d9968,0x9c9eb04e,0xd242fc18,0xe47feebf,0x727663c7,
  101986. 0x2d626862,0xb8c1c89e },
  101987. { 0xc8e1d569,0x51a58bdd,0xb7d88cd0,0x563809c8,0xf11f31eb,0x26c27fd9,
  101988. 0x2f9422d4,0x5d23bbda } },
  101989. /* 84 */
  101990. { { 0x95c8f8be,0x0a1c7294,0x3bf362bf,0x2961c480,0xdf63d4ac,0x9e418403,
  101991. 0x91ece900,0xc109f9cb },
  101992. { 0x58945705,0xc2d095d0,0xddeb85c0,0xb9083d96,0x7a40449b,0x84692b8d,
  101993. 0x2eee1ee1,0x9bc3344f } },
  101994. /* 85 */
  101995. { { 0x42913074,0x0d5ae356,0x48a542b1,0x55491b27,0xb310732a,0x469ca665,
  101996. 0x5f1a4cc1,0x29591d52 },
  101997. { 0xb84f983f,0xe76f5b6b,0x9f5f84e1,0xbe7eef41,0x80baa189,0x1200d496,
  101998. 0x18ef332c,0x6376551f } },
  101999. /* 86 */
  102000. { { 0x562976cc,0xbda5f14e,0x0ef12c38,0x22bca3e6,0x6cca9852,0xbbfa3064,
  102001. 0x08e2987a,0xbdb79dc8 },
  102002. { 0xcb06a772,0xfd2cb5c9,0xfe536dce,0x38f475aa,0x7c2b5db8,0xc2a3e022,
  102003. 0xadd3c14a,0x8ee86001 } },
  102004. /* 87 */
  102005. { { 0xa4ade873,0xcbe96981,0xc4fba48c,0x7ee9aa4d,0x5a054ba5,0x2cee2899,
  102006. 0x6f77aa4b,0x92e51d7a },
  102007. { 0x7190a34d,0x948bafa8,0xf6bd1ed1,0xd698f75b,0x0caf1144,0xd00ee6e3,
  102008. 0x0a56aaaa,0x5182f86f } },
  102009. /* 88 */
  102010. { { 0x7a4cc99c,0xfba6212c,0x3e6d9ca1,0xff609b68,0x5ac98c5a,0x5dbb27cb,
  102011. 0x4073a6f2,0x91dcab5d },
  102012. { 0x5f575a70,0x01b6cc3d,0x6f8d87fa,0x0cb36139,0x89981736,0x165d4e8c,
  102013. 0x97974f2b,0x17a0cedb } },
  102014. /* 89 */
  102015. { { 0x076c8d3a,0x38861e2a,0x210f924b,0x701aad39,0x13a835d9,0x94d0eae4,
  102016. 0x7f4cdf41,0x2e8ce36c },
  102017. { 0x037a862b,0x91273dab,0x60e4c8fa,0x01ba9bb7,0x33baf2dd,0xf9645388,
  102018. 0x34f668f3,0xf4ccc6cb } },
  102019. /* 90 */
  102020. { { 0xf1f79687,0x44ef525c,0x92efa815,0x7c595495,0xa5c78d29,0xe1231741,
  102021. 0x9a0df3c9,0xac0db488 },
  102022. { 0xdf01747f,0x86bfc711,0xef17df13,0x592b9358,0x5ccb6bb5,0xe5880e4f,
  102023. 0x94c974a2,0x95a64a61 } },
  102024. /* 91 */
  102025. { { 0xc15a4c93,0x72c1efda,0x82585141,0x40269b73,0x16cb0bad,0x6a8dfb1c,
  102026. 0x29210677,0x231e54ba },
  102027. { 0x8ae6d2dc,0xa70df917,0x39112918,0x4d6aa63f,0x5e5b7223,0xf627726b,
  102028. 0xd8a731e1,0xab0be032 } },
  102029. /* 92 */
  102030. { { 0x8d131f2d,0x097ad0e9,0x3b04f101,0x637f09e3,0xd5e9a748,0x1ac86196,
  102031. 0x2cf6a679,0xf1bcc880 },
  102032. { 0xe8daacb4,0x25c69140,0x60f65009,0x3c4e4055,0x477937a6,0x591cc8fc,
  102033. 0x5aebb271,0x85169469 } },
  102034. /* 93 */
  102035. { { 0xf1dcf593,0xde35c143,0xb018be3b,0x78202b29,0x9bdd9d3d,0xe9cdadc2,
  102036. 0xdaad55d8,0x8f67d9d2 },
  102037. { 0x7481ea5f,0x84111656,0xe34c590c,0xe7d2dde9,0x05053fa8,0xffdd43f4,
  102038. 0xc0728b5d,0xf84572b9 } },
  102039. /* 94 */
  102040. { { 0x97af71c9,0x5e1a7a71,0x7a736565,0xa1449444,0x0e1d5063,0xa1b4ae07,
  102041. 0x616b2c19,0xedee2710 },
  102042. { 0x11734121,0xb2f034f5,0x4a25e9f0,0x1cac6e55,0xa40c2ecf,0x8dc148f3,
  102043. 0x44ebd7f4,0x9fd27e9b } },
  102044. /* 95 */
  102045. { { 0xf6e2cb16,0x3cc7658a,0xfe5919b6,0xe3eb7d2c,0x168d5583,0x5a8c5816,
  102046. 0x958ff387,0xa40c2fb6 },
  102047. { 0xfedcc158,0x8c9ec560,0x55f23056,0x7ad804c6,0x9a307e12,0xd9396704,
  102048. 0x7dc6decf,0x99bc9bb8 } },
  102049. /* 96 */
  102050. { { 0x927dafc6,0x84a9521d,0x5c09cd19,0x52c1fb69,0xf9366dde,0x9d9581a0,
  102051. 0xa16d7e64,0x9abe210b },
  102052. { 0x48915220,0x480af84a,0x4dd816c6,0xfa73176a,0x1681ca5a,0xc7d53987,
  102053. 0x87f344b0,0x7881c257 } },
  102054. /* 97 */
  102055. { { 0xe0bcf3ff,0x93399b51,0x127f74f6,0x0d02cbc5,0xdd01d968,0x8fb465a2,
  102056. 0xa30e8940,0x15e6e319 },
  102057. { 0x3e0e05f4,0x646d6e0d,0x43588404,0xfad7bddc,0xc4f850d3,0xbe61c7d1,
  102058. 0x191172ce,0x0e55facf } },
  102059. /* 98 */
  102060. { { 0xf8787564,0x7e9d9806,0x31e85ce6,0x1a331721,0xb819e8d6,0x6b0158ca,
  102061. 0x6fe96577,0xd73d0976 },
  102062. { 0x1eb7206e,0x42483425,0xc618bb42,0xa519290f,0x5e30a520,0x5dcbb859,
  102063. 0x8f15a50b,0x9250a374 } },
  102064. /* 99 */
  102065. { { 0xbe577410,0xcaff08f8,0x5077a8c6,0xfd408a03,0xec0a63a4,0xf1f63289,
  102066. 0xc1cc8c0b,0x77414082 },
  102067. { 0xeb0991cd,0x05a40fa6,0x49fdc296,0xc1ca0866,0xb324fd40,0x3a68a3c7,
  102068. 0x12eb20b9,0x8cb04f4d } },
  102069. /* 100 */
  102070. { { 0x6906171c,0xb1c2d055,0xb0240c3f,0x9073e9cd,0xd8906841,0xdb8e6b4f,
  102071. 0x47123b51,0xe4e429ef },
  102072. { 0x38ec36f4,0x0b8dd53c,0xff4b6a27,0xf9d2dc01,0x879a9a48,0x5d066e07,
  102073. 0x3c6e6552,0x37bca2ff } },
  102074. /* 101 */
  102075. { { 0xdf562470,0x4cd2e3c7,0xc0964ac9,0x44f272a2,0x80c793be,0x7c6d5df9,
  102076. 0x3002b22a,0x59913edc },
  102077. { 0x5750592a,0x7a139a83,0xe783de02,0x99e01d80,0xea05d64f,0xcf8c0375,
  102078. 0xb013e226,0x43786e4a } },
  102079. /* 102 */
  102080. { { 0x9e56b5a6,0xff32b0ed,0xd9fc68f9,0x0750d9a6,0x597846a7,0xec15e845,
  102081. 0xb7e79e7a,0x8638ca98 },
  102082. { 0x0afc24b2,0x2f5ae096,0x4dace8f2,0x05398eaf,0xaecba78f,0x3b765dd0,
  102083. 0x7b3aa6f0,0x1ecdd36a } },
  102084. /* 103 */
  102085. { { 0x6c5ff2f3,0x5d3acd62,0x2873a978,0xa2d516c0,0xd2110d54,0xad94c9fa,
  102086. 0xd459f32d,0xd85d0f85 },
  102087. { 0x10b11da3,0x9f700b8d,0xa78318c4,0xd2c22c30,0x9208decd,0x556988f4,
  102088. 0xb4ed3c62,0xa04f19c3 } },
  102089. /* 104 */
  102090. { { 0xed7f93bd,0x087924c8,0x392f51f6,0xcb64ac5d,0x821b71af,0x7cae330a,
  102091. 0x5c0950b0,0x92b2eeea },
  102092. { 0x85b6e235,0x85ac4c94,0x2936c0f0,0xab2ca4a9,0xe0508891,0x80faa6b3,
  102093. 0x5834276c,0x1ee78221 } },
  102094. /* 105 */
  102095. { { 0xe63e79f7,0xa60a2e00,0xf399d906,0xf590e7b2,0x6607c09d,0x9021054a,
  102096. 0x57a6e150,0xf3f2ced8 },
  102097. { 0xf10d9b55,0x200510f3,0xd8642648,0x9d2fcfac,0xe8bd0e7c,0xe5631aa7,
  102098. 0x3da3e210,0x0f56a454 } },
  102099. /* 106 */
  102100. { { 0x1043e0df,0x5b21bffa,0x9c007e6d,0x6c74b6cc,0xd4a8517a,0x1a656ec0,
  102101. 0x1969e263,0xbd8f1741 },
  102102. { 0xbeb7494a,0x8a9bbb86,0x45f3b838,0x1567d46f,0xa4e5a79a,0xdf7a12a7,
  102103. 0x30ccfa09,0x2d1a1c35 } },
  102104. /* 107 */
  102105. { { 0x506508da,0x192e3813,0xa1d795a7,0x336180c4,0x7a9944b3,0xcddb5949,
  102106. 0xb91fba46,0xa107a65e },
  102107. { 0x0f94d639,0xe6d1d1c5,0x8a58b7d7,0x8b4af375,0xbd37ca1c,0x1a7c5584,
  102108. 0xf87a9af2,0x183d760a } },
  102109. /* 108 */
  102110. { { 0x0dde59a4,0x29d69711,0x0e8bef87,0xf1ad8d07,0x4f2ebe78,0x229b4963,
  102111. 0xc269d754,0x1d44179d },
  102112. { 0x8390d30e,0xb32dc0cf,0x0de8110c,0x0a3b2753,0x2bc0339a,0x31af1dc5,
  102113. 0x9606d262,0x771f9cc2 } },
  102114. /* 109 */
  102115. { { 0x85040739,0x99993e77,0x8026a939,0x44539db9,0xf5f8fc26,0xcf40f6f2,
  102116. 0x0362718e,0x64427a31 },
  102117. { 0x85428aa8,0x4f4f2d87,0xebfb49a8,0x7b7adc3f,0xf23d01ac,0x201b2c6d,
  102118. 0x6ae90d6d,0x49d9b749 } },
  102119. /* 110 */
  102120. { { 0x435d1099,0xcc78d8bc,0x8e8d1a08,0x2adbcd4e,0x2cb68a41,0x02c2e2a0,
  102121. 0x3f605445,0x9037d81b },
  102122. { 0x074c7b61,0x7cdbac27,0x57bfd72e,0xfe2031ab,0x596d5352,0x61ccec96,
  102123. 0x7cc0639c,0x08c3de6a } },
  102124. /* 111 */
  102125. { { 0xf6d552ab,0x20fdd020,0x05cd81f1,0x56baff98,0x91351291,0x06fb7c3e,
  102126. 0x45796b2f,0xc6909442 },
  102127. { 0x41231bd1,0x17b3ae9c,0x5cc58205,0x1eac6e87,0xf9d6a122,0x208837ab,
  102128. 0xcafe3ac0,0x3fa3db02 } },
  102129. /* 112 */
  102130. { { 0x05058880,0xd75a3e65,0x643943f2,0x7da365ef,0xfab24925,0x4147861c,
  102131. 0xfdb808ff,0xc5c4bdb0 },
  102132. { 0xb272b56b,0x73513e34,0x11b9043a,0xc8327e95,0xf8844969,0xfd8ce37d,
  102133. 0x46c2b6b5,0x2d56db94 } },
  102134. /* 113 */
  102135. { { 0xff46ac6b,0x2461782f,0x07a2e425,0xd19f7926,0x09a48de1,0xfafea3c4,
  102136. 0xe503ba42,0x0f56bd9d },
  102137. { 0x345cda49,0x137d4ed1,0x816f299d,0x821158fc,0xaeb43402,0xe7c6a54a,
  102138. 0x1173b5f1,0x4003bb9d } },
  102139. /* 114 */
  102140. { { 0xa0803387,0x3b8e8189,0x39cbd404,0xece115f5,0xd2877f21,0x4297208d,
  102141. 0xa07f2f9e,0x53765522 },
  102142. { 0xa8a4182d,0xa4980a21,0x3219df79,0xa2bbd07a,0x1a19a2d4,0x674d0a2e,
  102143. 0x6c5d4549,0x7a056f58 } },
  102144. /* 115 */
  102145. { { 0x9d8a2a47,0x646b2558,0xc3df2773,0x5b582948,0xabf0d539,0x51ec000e,
  102146. 0x7a1a2675,0x77d482f1 },
  102147. { 0x87853948,0xb8a1bd95,0x6cfbffee,0xa6f817bd,0x80681e47,0xab6ec057,
  102148. 0x2b38b0e4,0x4115012b } },
  102149. /* 116 */
  102150. { { 0x6de28ced,0x3c73f0f4,0x9b13ec47,0x1d5da760,0x6e5c6392,0x61b8ce9e,
  102151. 0xfbea0946,0xcdf04572 },
  102152. { 0x6c53c3b0,0x1cb3c58b,0x447b843c,0x97fe3c10,0x2cb9780e,0xfb2b8ae1,
  102153. 0x97383109,0xee703dda } },
  102154. /* 117 */
  102155. { { 0xff57e43a,0x34515140,0xb1b811b8,0xd44660d3,0x8f42b986,0x2b3b5dff,
  102156. 0xa162ce21,0x2a0ad89d },
  102157. { 0x6bc277ba,0x64e4a694,0xc141c276,0xc788c954,0xcabf6274,0x141aa64c,
  102158. 0xac2b4659,0xd62d0b67 } },
  102159. /* 118 */
  102160. { { 0x2c054ac4,0x39c5d87b,0xf27df788,0x57005859,0xb18128d6,0xedf7cbf3,
  102161. 0x991c2426,0xb39a23f2 },
  102162. { 0xf0b16ae5,0x95284a15,0xa136f51b,0x0c6a05b1,0xf2700783,0x1d63c137,
  102163. 0xc0674cc5,0x04ed0092 } },
  102164. /* 119 */
  102165. { { 0x9ae90393,0x1f4185d1,0x4a3d64e6,0x3047b429,0x9854fc14,0xae0001a6,
  102166. 0x0177c387,0xa0a91fc1 },
  102167. { 0xae2c831e,0xff0a3f01,0x2b727e16,0xbb76ae82,0x5a3075b4,0x8f12c8a1,
  102168. 0x9ed20c41,0x084cf988 } },
  102169. /* 120 */
  102170. { { 0xfca6becf,0xd98509de,0x7dffb328,0x2fceae80,0x4778e8b9,0x5d8a15c4,
  102171. 0x73abf77e,0xd57955b2 },
  102172. { 0x31b5d4f1,0x210da79e,0x3cfa7a1c,0xaa52f04b,0xdc27c20b,0xd4d12089,
  102173. 0x02d141f1,0x8e14ea42 } },
  102174. /* 121 */
  102175. { { 0xf2897042,0xeed50345,0x43402c4a,0x8d05331f,0xc8bdfb21,0xc8d9c194,
  102176. 0x2aa4d158,0x597e1a37 },
  102177. { 0xcf0bd68c,0x0327ec1a,0xab024945,0x6d4be0dc,0xc9fe3e84,0x5b9c8d7a,
  102178. 0x199b4dea,0xca3f0236 } },
  102179. /* 122 */
  102180. { { 0x6170bd20,0x592a10b5,0x6d3f5de7,0x0ea897f1,0x44b2ade2,0xa3363ff1,
  102181. 0x309c07e4,0xbde7fd7e },
  102182. { 0xb8f5432c,0x516bb6d2,0xe043444b,0x210dc1cb,0xf8f95b5a,0x3db01e6f,
  102183. 0x0a7dd198,0xb623ad0e } },
  102184. /* 123 */
  102185. { { 0x60c7b65b,0xa75bd675,0x23a4a289,0xab8c5590,0xd7b26795,0xf8220fd0,
  102186. 0x58ec137b,0xd6aa2e46 },
  102187. { 0x5138bb85,0x10abc00b,0xd833a95c,0x8c31d121,0x1702a32e,0xb24ff00b,
  102188. 0x2dcc513a,0x111662e0 } },
  102189. /* 124 */
  102190. { { 0xefb42b87,0x78114015,0x1b6c4dff,0xbd9f5d70,0xa7d7c129,0x66ecccd7,
  102191. 0x94b750f8,0xdb3ee1cb },
  102192. { 0xf34837cf,0xb26f3db0,0xb9578d4f,0xe7eed18b,0x7c56657d,0x5d2cdf93,
  102193. 0x52206a59,0x886a6442 } },
  102194. /* 125 */
  102195. { { 0x65b569ea,0x3c234cfb,0xf72119c1,0x20011141,0xa15a619e,0x8badc85d,
  102196. 0x018a17bc,0xa70cf4eb },
  102197. { 0x8c4a6a65,0x224f97ae,0x0134378f,0x36e5cf27,0x4f7e0960,0xbe3a609e,
  102198. 0xd1747b77,0xaa4772ab } },
  102199. /* 126 */
  102200. { { 0x7aa60cc0,0x67676131,0x0368115f,0xc7916361,0xbbc1bb5a,0xded98bb4,
  102201. 0x30faf974,0x611a6ddc },
  102202. { 0xc15ee47a,0x30e78cbc,0x4e0d96a5,0x2e896282,0x3dd9ed88,0x36f35adf,
  102203. 0x16429c88,0x5cfffaf8 } },
  102204. /* 127 */
  102205. { { 0x9b7a99cd,0xc0d54cff,0x843c45a1,0x7bf3b99d,0x62c739e1,0x038a908f,
  102206. 0x7dc1994c,0x6e5a6b23 },
  102207. { 0x0ba5db77,0xef8b454e,0xacf60d63,0xb7b8807f,0x76608378,0xe591c0c6,
  102208. 0x242dabcc,0x481a238d } },
  102209. /* 128 */
  102210. { { 0x35d0b34a,0xe3417bc0,0x8327c0a7,0x440b386b,0xac0362d1,0x8fb7262d,
  102211. 0xe0cdf943,0x2c41114c },
  102212. { 0xad95a0b1,0x2ba5cef1,0x67d54362,0xc09b37a8,0x01e486c9,0x26d6cdd2,
  102213. 0x42ff9297,0x20477abf } },
  102214. /* 129 */
  102215. { { 0x18d65dbf,0x2f75173c,0x339edad8,0x77bf940e,0xdcf1001c,0x7022d26b,
  102216. 0xc77396b6,0xac66409a },
  102217. { 0xc6261cc3,0x8b0bb36f,0x190e7e90,0x213f7bc9,0xa45e6c10,0x6541ceba,
  102218. 0xcc122f85,0xce8e6975 } },
  102219. /* 130 */
  102220. { { 0xbc0a67d2,0x0f121b41,0x444d248a,0x62d4760a,0x659b4737,0x0e044f1d,
  102221. 0x250bb4a8,0x08fde365 },
  102222. { 0x848bf287,0xaceec3da,0xd3369d6e,0xc2a62182,0x92449482,0x3582dfdc,
  102223. 0x565d6cd7,0x2f7e2fd2 } },
  102224. /* 131 */
  102225. { { 0xc3770fa7,0xae4b92db,0x379043f9,0x095e8d5c,0x17761171,0x54f34e9d,
  102226. 0x907702ae,0xc65be92e },
  102227. { 0xf6fd0a40,0x2758a303,0xbcce784b,0xe7d822e3,0x4f9767bf,0x7ae4f585,
  102228. 0xd1193b3a,0x4bff8e47 } },
  102229. /* 132 */
  102230. { { 0x00ff1480,0xcd41d21f,0x0754db16,0x2ab8fb7d,0xbbe0f3ea,0xac81d2ef,
  102231. 0x5772967d,0x3e4e4ae6 },
  102232. { 0x3c5303e6,0x7e18f36d,0x92262397,0x3bd9994b,0x1324c3c0,0x9ed70e26,
  102233. 0x58ec6028,0x5388aefd } },
  102234. /* 133 */
  102235. { { 0x5e5d7713,0xad1317eb,0x75de49da,0x09b985ee,0xc74fb261,0x32f5bc4f,
  102236. 0x4f75be0e,0x5cf908d1 },
  102237. { 0x8e657b12,0x76043510,0xb96ed9e6,0xbfd421a5,0x8970ccc2,0x0e29f51f,
  102238. 0x60f00ce2,0xa698ba40 } },
  102239. /* 134 */
  102240. { { 0xef748fec,0x73db1686,0x7e9d2cf9,0xe6e755a2,0xce265eff,0x630b6544,
  102241. 0x7aebad8d,0xb142ef8a },
  102242. { 0x17d5770a,0xad31af9f,0x2cb3412f,0x66af3b67,0xdf3359de,0x6bd60d1b,
  102243. 0x58515075,0xd1896a96 } },
  102244. /* 135 */
  102245. { { 0x33c41c08,0xec5957ab,0x5468e2e1,0x87de94ac,0xac472f6c,0x18816b73,
  102246. 0x7981da39,0x267b0e0b },
  102247. { 0x8e62b988,0x6e554e5d,0x116d21e7,0xd8ddc755,0x3d2a6f99,0x4610faf0,
  102248. 0xa1119393,0xb54e287a } },
  102249. /* 136 */
  102250. { { 0x178a876b,0x0a0122b5,0x085104b4,0x51ff96ff,0x14f29f76,0x050b31ab,
  102251. 0x5f87d4e6,0x84abb28b },
  102252. { 0x8270790a,0xd5ed439f,0x85e3f46b,0x2d6cb59d,0x6c1e2212,0x75f55c1b,
  102253. 0x17655640,0xe5436f67 } },
  102254. /* 137 */
  102255. { { 0x2286e8d5,0x53f9025e,0x864453be,0x353c95b4,0xe408e3a0,0xd832f5bd,
  102256. 0x5b9ce99e,0x0404f68b },
  102257. { 0xa781e8e5,0xcad33bde,0x163c2f5b,0x3cdf5018,0x0119caa3,0x57576960,
  102258. 0x0ac1c701,0x3a4263df } },
  102259. /* 138 */
  102260. { { 0x9aeb596d,0xc2965ecc,0x023c92b4,0x01ea03e7,0x2e013961,0x4704b4b6,
  102261. 0x905ea367,0x0ca8fd3f },
  102262. { 0x551b2b61,0x92523a42,0x390fcd06,0x1eb7a89c,0x0392a63e,0xe7f1d2be,
  102263. 0x4ddb0c33,0x96dca264 } },
  102264. /* 139 */
  102265. { { 0x387510af,0x203bb43a,0xa9a36a01,0x846feaa8,0x2f950378,0xd23a5770,
  102266. 0x3aad59dc,0x4363e212 },
  102267. { 0x40246a47,0xca43a1c7,0xe55dd24d,0xb362b8d2,0x5d8faf96,0xf9b08604,
  102268. 0xd8bb98c4,0x840e115c } },
  102269. /* 140 */
  102270. { { 0x1023e8a7,0xf12205e2,0xd8dc7a0b,0xc808a8cd,0x163a5ddf,0xe292a272,
  102271. 0x30ded6d4,0x5e0d6abd },
  102272. { 0x7cfc0f64,0x07a721c2,0x0e55ed88,0x42eec01d,0x1d1f9db2,0x26a7bef9,
  102273. 0x2945a25a,0x7dea48f4 } },
  102274. /* 141 */
  102275. { { 0xe5060a81,0xabdf6f1c,0xf8f95615,0xe79f9c72,0x06ac268b,0xcfd36c54,
  102276. 0xebfd16d1,0xabc2a2be },
  102277. { 0xd3e2eac7,0x8ac66f91,0xd2dd0466,0x6f10ba63,0x0282d31b,0x6790e377,
  102278. 0x6c7eefc1,0x4ea35394 } },
  102279. /* 142 */
  102280. { { 0x5266309d,0xed8a2f8d,0x81945a3e,0x0a51c6c0,0x578c5dc1,0xcecaf45a,
  102281. 0x1c94ffc3,0x3a76e689 },
  102282. { 0x7d7b0d0f,0x9aace8a4,0x8f584a5f,0x963ace96,0x4e697fbe,0x51a30c72,
  102283. 0x465e6464,0x8212a10a } },
  102284. /* 143 */
  102285. { { 0xcfab8caa,0xef7c61c3,0x0e142390,0x18eb8e84,0x7e9733ca,0xcd1dff67,
  102286. 0x599cb164,0xaa7cab71 },
  102287. { 0xbc837bd1,0x02fc9273,0xc36af5d7,0xc06407d0,0xf423da49,0x17621292,
  102288. 0xfe0617c3,0x40e38073 } },
  102289. /* 144 */
  102290. { { 0xa7bf9b7c,0xf4f80824,0x3fbe30d0,0x365d2320,0x97cf9ce3,0xbfbe5320,
  102291. 0xb3055526,0xe3604700 },
  102292. { 0x6cc6c2c7,0x4dcb9911,0xba4cbee6,0x72683708,0x637ad9ec,0xdcded434,
  102293. 0xa3dee15f,0x6542d677 } },
  102294. /* 145 */
  102295. { { 0x7b6c377a,0x3f32b6d0,0x903448be,0x6cb03847,0x20da8af7,0xd6fdd3a8,
  102296. 0x09bb6f21,0xa6534aee },
  102297. { 0x1035facf,0x30a1780d,0x9dcb47e6,0x35e55a33,0xc447f393,0x6ea50fe1,
  102298. 0xdc9aef22,0xf3cb672f } },
  102299. /* 146 */
  102300. { { 0x3b55fd83,0xeb3719fe,0x875ddd10,0xe0d7a46c,0x05cea784,0x33ac9fa9,
  102301. 0xaae870e7,0x7cafaa2e },
  102302. { 0x1d53b338,0x9b814d04,0xef87e6c6,0xe0acc0a0,0x11672b0f,0xfb93d108,
  102303. 0xb9bd522e,0x0aab13c1 } },
  102304. /* 147 */
  102305. { { 0xd2681297,0xddcce278,0xb509546a,0xcb350eb1,0x7661aaf2,0x2dc43173,
  102306. 0x847012e9,0x4b91a602 },
  102307. { 0x72f8ddcf,0xdcff1095,0x9a911af4,0x08ebf61e,0xc372430e,0x48f4360a,
  102308. 0x72321cab,0x49534c53 } },
  102309. /* 148 */
  102310. { { 0xf07b7e9d,0x83df7d71,0x13cd516f,0xa478efa3,0x6c047ee3,0x78ef264b,
  102311. 0xd65ac5ee,0xcaf46c4f },
  102312. { 0x92aa8266,0xa04d0c77,0x913684bb,0xedf45466,0xae4b16b0,0x56e65168,
  102313. 0x04c6770f,0x14ce9e57 } },
  102314. /* 149 */
  102315. { { 0x965e8f91,0x99445e3e,0xcb0f2492,0xd3aca1ba,0x90c8a0a0,0xd31cc70f,
  102316. 0x3e4c9a71,0x1bb708a5 },
  102317. { 0x558bdd7a,0xd5ca9e69,0x018a26b1,0x734a0508,0x4c9cf1ec,0xb093aa71,
  102318. 0xda300102,0xf9d126f2 } },
  102319. /* 150 */
  102320. { { 0xaff9563e,0x749bca7a,0xb49914a0,0xdd077afe,0xbf5f1671,0xe27a0311,
  102321. 0x729ecc69,0x807afcb9 },
  102322. { 0xc9b08b77,0x7f8a9337,0x443c7e38,0x86c3a785,0x476fd8ba,0x85fafa59,
  102323. 0x6568cd8c,0x751adcd1 } },
  102324. /* 151 */
  102325. { { 0x10715c0d,0x8aea38b4,0x8f7697f7,0xd113ea71,0x93fbf06d,0x665eab14,
  102326. 0x2537743f,0x29ec4468 },
  102327. { 0xb50bebbc,0x3d94719c,0xe4505422,0x399ee5bf,0x8d2dedb1,0x90cd5b3a,
  102328. 0x92a4077d,0xff9370e3 } },
  102329. /* 152 */
  102330. { { 0xc6b75b65,0x59a2d69b,0x266651c5,0x4188f8d5,0x3de9d7d2,0x28a9f33e,
  102331. 0xa2a9d01a,0x9776478b },
  102332. { 0x929af2c7,0x8852622d,0x4e690923,0x334f5d6d,0xa89a51e9,0xce6cc7e5,
  102333. 0xac2f82fa,0x74a6313f } },
  102334. /* 153 */
  102335. { { 0xb75f079c,0xb2f4dfdd,0x18e36fbb,0x85b07c95,0xe7cd36dd,0x1b6cfcf0,
  102336. 0x0ff4863d,0xab75be15 },
  102337. { 0x173fc9b7,0x81b367c0,0xd2594fd0,0xb90a7420,0xc4091236,0x15fdbf03,
  102338. 0x0b4459f6,0x4ebeac2e } },
  102339. /* 154 */
  102340. { { 0x5c9f2c53,0xeb6c5fe7,0x8eae9411,0xd2522011,0xf95ac5d8,0xc8887633,
  102341. 0x2c1baffc,0xdf99887b },
  102342. { 0x850aaecb,0xbb78eed2,0x01d6a272,0x9d49181b,0xb1cdbcac,0x978dd511,
  102343. 0x779f4058,0x27b040a7 } },
  102344. /* 155 */
  102345. { { 0xf73b2eb2,0x90405db7,0x8e1b2118,0xe0df8508,0x5962327e,0x501b7152,
  102346. 0xe4cfa3f5,0xb393dd37 },
  102347. { 0x3fd75165,0xa1230e7b,0xbcd33554,0xd66344c2,0x0f7b5022,0x6c36f1be,
  102348. 0xd0463419,0x09588c12 } },
  102349. /* 156 */
  102350. { { 0x02601c3b,0xe086093f,0xcf5c335f,0xfb0252f8,0x894aff28,0x955cf280,
  102351. 0xdb9f648b,0x81c879a9 },
  102352. { 0xc6f56c51,0x040e687c,0x3f17618c,0xfed47169,0x9059353b,0x44f88a41,
  102353. 0x5fc11bc4,0xfa0d48f5 } },
  102354. /* 157 */
  102355. { { 0xe1608e4d,0xbc6e1c9d,0x3582822c,0x010dda11,0x157ec2d7,0xf6b7ddc1,
  102356. 0xb6a367d6,0x8ea0e156 },
  102357. { 0x2383b3b4,0xa354e02f,0x3f01f53c,0x69966b94,0x2de03ca5,0x4ff6632b,
  102358. 0xfa00b5ac,0x3f5ab924 } },
  102359. /* 158 */
  102360. { { 0x59739efb,0x337bb0d9,0xe7ebec0d,0xc751b0f4,0x411a67d1,0x2da52dd6,
  102361. 0x2b74256e,0x8bc76887 },
  102362. { 0x82d3d253,0xa5be3b72,0xf58d779f,0xa9f679a1,0xe16767bb,0xa1cac168,
  102363. 0x60fcf34f,0xb386f190 } },
  102364. /* 159 */
  102365. { { 0x2fedcfc2,0x31f3c135,0x62f8af0d,0x5396bf62,0xe57288c2,0x9a02b4ea,
  102366. 0x1b069c4d,0x4cb460f7 },
  102367. { 0x5b8095ea,0xae67b4d3,0x6fc07603,0x92bbf859,0xb614a165,0xe1475f66,
  102368. 0x95ef5223,0x52c0d508 } },
  102369. /* 160 */
  102370. { { 0x15339848,0x231c210e,0x70778c8d,0xe87a28e8,0x6956e170,0x9d1de661,
  102371. 0x2bb09c0b,0x4ac3c938 },
  102372. { 0x6998987d,0x19be0551,0xae09f4d6,0x8b2376c4,0x1a3f933d,0x1de0b765,
  102373. 0xe39705f4,0x380d94c7 } },
  102374. /* 161 */
  102375. { { 0x81542e75,0x01a355aa,0xee01b9b7,0x96c724a1,0x624d7087,0x6b3a2977,
  102376. 0xde2637af,0x2ce3e171 },
  102377. { 0xf5d5bc1a,0xcfefeb49,0x2777e2b5,0xa655607e,0x9513756c,0x4feaac2f,
  102378. 0x0b624e4d,0x2e6cd852 } },
  102379. /* 162 */
  102380. { { 0x8c31c31d,0x3685954b,0x5bf21a0c,0x68533d00,0x75c79ec9,0x0bd7626e,
  102381. 0x42c69d54,0xca177547 },
  102382. { 0xf6d2dbb2,0xcc6edaff,0x174a9d18,0xfd0d8cbd,0xaa4578e8,0x875e8793,
  102383. 0x9cab2ce6,0xa976a713 } },
  102384. /* 163 */
  102385. { { 0x93fb353d,0x0a651f1b,0x57fcfa72,0xd75cab8b,0x31b15281,0xaa88cfa7,
  102386. 0x0a1f4999,0x8720a717 },
  102387. { 0x693e1b90,0x8c3e8d37,0x16f6dfc3,0xd345dc0b,0xb52a8742,0x8ea8d00a,
  102388. 0xc769893c,0x9719ef29 } },
  102389. /* 164 */
  102390. { { 0x58e35909,0x820eed8d,0x33ddc116,0x9366d8dc,0x6e205026,0xd7f999d0,
  102391. 0xe15704c1,0xa5072976 },
  102392. { 0xc4e70b2e,0x002a37ea,0x6890aa8a,0x84dcf657,0x645b2a5c,0xcd71bf18,
  102393. 0xf7b77725,0x99389c9d } },
  102394. /* 165 */
  102395. { { 0x7ada7a4b,0x238c08f2,0xfd389366,0x3abe9d03,0x766f512c,0x6b672e89,
  102396. 0x202c82e4,0xa88806aa },
  102397. { 0xd380184e,0x6602044a,0x126a8b85,0xa8cb78c4,0xad844f17,0x79d670c0,
  102398. 0x4738dcfe,0x0043bffb } },
  102399. /* 166 */
  102400. { { 0x36d5192e,0x8d59b5dc,0x4590b2af,0xacf885d3,0x11601781,0x83566d0a,
  102401. 0xba6c4866,0x52f3ef01 },
  102402. { 0x0edcb64d,0x3986732a,0x8068379f,0x0a482c23,0x7040f309,0x16cbe5fa,
  102403. 0x9ef27e75,0x3296bd89 } },
  102404. /* 167 */
  102405. { { 0x454d81d7,0x476aba89,0x51eb9b3c,0x9eade7ef,0x81c57986,0x619a21cd,
  102406. 0xaee571e9,0x3b90febf },
  102407. { 0x5496f7cb,0x9393023e,0x7fb51bc4,0x55be41d8,0x99beb5ce,0x03f1dd48,
  102408. 0x9f810b18,0x6e88069d } },
  102409. /* 168 */
  102410. { { 0xb43ea1db,0xce37ab11,0x5259d292,0x0a7ff1a9,0x8f84f186,0x851b0221,
  102411. 0xdefaad13,0xa7222bea },
  102412. { 0x2b0a9144,0xa2ac78ec,0xf2fa59c5,0x5a024051,0x6147ce38,0x91d1eca5,
  102413. 0xbc2ac690,0xbe94d523 } },
  102414. /* 169 */
  102415. { { 0x0b226ce7,0x72f4945e,0x967e8b70,0xb8afd747,0x85a6c63e,0xedea46f1,
  102416. 0x9be8c766,0x7782defe },
  102417. { 0x3db38626,0x760d2aa4,0x76f67ad1,0x460ae787,0x54499cdb,0x341b86fc,
  102418. 0xa2892e4b,0x03838567 } },
  102419. /* 170 */
  102420. { { 0x79ec1a0f,0x2d8daefd,0xceb39c97,0x3bbcd6fd,0x58f61a95,0xf5575ffc,
  102421. 0xadf7b420,0xdbd986c4 },
  102422. { 0x15f39eb7,0x81aa8814,0xb98d976c,0x6ee2fcf5,0xcf2f717d,0x5465475d,
  102423. 0x6860bbd0,0x8e24d3c4 } },
  102424. /* 171 */
  102425. { { 0x9a587390,0x749d8e54,0x0cbec588,0x12bb194f,0xb25983c6,0x46e07da4,
  102426. 0x407bafc8,0x541a99c4 },
  102427. { 0x624c8842,0xdb241692,0xd86c05ff,0x6044c12a,0x4f7fcf62,0xc59d14b4,
  102428. 0xf57d35d1,0xc0092c49 } },
  102429. /* 172 */
  102430. { { 0xdf2e61ef,0xd3cc75c3,0x2e1b35ca,0x7e8841c8,0x909f29f4,0xc62d30d1,
  102431. 0x7286944d,0x75e40634 },
  102432. { 0xbbc237d0,0xe7d41fc5,0xec4f01c9,0xc9537bf0,0x282bd534,0x91c51a16,
  102433. 0xc7848586,0x5b7cb658 } },
  102434. /* 173 */
  102435. { { 0x8a28ead1,0x964a7084,0xfd3b47f6,0x802dc508,0x767e5b39,0x9ae4bfd1,
  102436. 0x8df097a1,0x7ae13eba },
  102437. { 0xeadd384e,0xfd216ef8,0xb6b2ff06,0x0361a2d9,0x4bcdb5f3,0x204b9878,
  102438. 0xe2a8e3fd,0x787d8074 } },
  102439. /* 174 */
  102440. { { 0x757fbb1c,0xc5e25d6b,0xca201deb,0xe47bddb2,0x6d2233ff,0x4a55e9a3,
  102441. 0x9ef28484,0x5c222819 },
  102442. { 0x88315250,0x773d4a85,0x827097c1,0x21b21a2b,0xdef5d33f,0xab7c4ea1,
  102443. 0xbaf0f2b0,0xe45d37ab } },
  102444. /* 175 */
  102445. { { 0x28511c8a,0xd2df1e34,0xbdca6cd3,0xebb229c8,0x627c39a7,0x578a71a7,
  102446. 0x84dfb9d3,0xed7bc122 },
  102447. { 0x93dea561,0xcf22a6df,0xd48f0ed1,0x5443f18d,0x5bad23e8,0xd8b86140,
  102448. 0x45ca6d27,0xaac97cc9 } },
  102449. /* 176 */
  102450. { { 0xa16bd00a,0xeb54ea74,0xf5c0bcc1,0xd839e9ad,0x1f9bfc06,0x092bb7f1,
  102451. 0x1163dc4e,0x318f97b3 },
  102452. { 0xc30d7138,0xecc0c5be,0xabc30220,0x44e8df23,0xb0223606,0x2bb7972f,
  102453. 0x9a84ff4d,0xfa41faa1 } },
  102454. /* 177 */
  102455. { { 0xa6642269,0x4402d974,0x9bb783bd,0xc81814ce,0x7941e60b,0x398d38e4,
  102456. 0x1d26e9e2,0x38bb6b2c },
  102457. { 0x6a577f87,0xc64e4a25,0xdc11fe1c,0x8b52d253,0x62280728,0xff336abf,
  102458. 0xce7601a5,0x94dd0905 } },
  102459. /* 178 */
  102460. { { 0xde93f92a,0x156cf7dc,0x89b5f315,0xa01333cb,0xc995e750,0x02404df9,
  102461. 0xd25c2ae9,0x92077867 },
  102462. { 0x0bf39d44,0xe2471e01,0x96bb53d7,0x5f2c9020,0x5c9c3d8f,0x4c44b7b3,
  102463. 0xd29beb51,0x81e8428b } },
  102464. /* 179 */
  102465. { { 0xc477199f,0x6dd9c2ba,0x6b5ecdd9,0x8cb8eeee,0xee40fd0e,0x8af7db3f,
  102466. 0xdbbfa4b1,0x1b94ab62 },
  102467. { 0xce47f143,0x44f0d8b3,0x63f46163,0x51e623fc,0xcc599383,0xf18f270f,
  102468. 0x055590ee,0x06a38e28 } },
  102469. /* 180 */
  102470. { { 0xb3355b49,0x2e5b0139,0xb4ebf99b,0x20e26560,0xd269f3dc,0xc08ffa6b,
  102471. 0x83d9d4f8,0xa7b36c20 },
  102472. { 0x1b3e8830,0x64d15c3a,0xa89f9c0b,0xd5fceae1,0xe2d16930,0xcfeee4a2,
  102473. 0xa2822a20,0xbe54c6b4 } },
  102474. /* 181 */
  102475. { { 0x8d91167c,0xd6cdb3df,0xe7a6625e,0x517c3f79,0x346ac7f4,0x7105648f,
  102476. 0xeae022bb,0xbf30a5ab },
  102477. { 0x93828a68,0x8e7785be,0x7f3ef036,0x5161c332,0x592146b2,0xe11b5feb,
  102478. 0x2732d13a,0xd1c820de } },
  102479. /* 182 */
  102480. { { 0x9038b363,0x043e1347,0x6b05e519,0x58c11f54,0x6026cad1,0x4fe57abe,
  102481. 0x68a18da3,0xb7d17bed },
  102482. { 0xe29c2559,0x44ca5891,0x5bfffd84,0x4f7a0376,0x74e46948,0x498de4af,
  102483. 0x6412cc64,0x3997fd5e } },
  102484. /* 183 */
  102485. { { 0x8bd61507,0xf2074682,0x34a64d2a,0x29e132d5,0x8a8a15e3,0xffeddfb0,
  102486. 0x3c6c13e8,0x0eeb8929 },
  102487. { 0xa7e259f8,0xe9b69a3e,0xd13e7e67,0xce1db7e6,0xad1fa685,0x277318f6,
  102488. 0xc922b6ef,0x228916f8 } },
  102489. /* 184 */
  102490. { { 0x0a12ab5b,0x959ae25b,0x957bc136,0xcc11171f,0xd16e2b0c,0x8058429e,
  102491. 0x6e93097e,0xec05ad1d },
  102492. { 0xac3f3708,0x157ba5be,0x30b59d77,0x31baf935,0x118234e5,0x47b55237,
  102493. 0x7ff11b37,0x7d314156 } },
  102494. /* 185 */
  102495. { { 0xf6dfefab,0x7bd9c05c,0xdcb37707,0xbe2f2268,0x3a38bb95,0xe53ead97,
  102496. 0x9bc1d7a3,0xe9ce66fc },
  102497. { 0x6f6a02a1,0x75aa1576,0x60e600ed,0x38c087df,0x68cdc1b9,0xf8947f34,
  102498. 0x72280651,0xd9650b01 } },
  102499. /* 186 */
  102500. { { 0x5a057e60,0x504b4c4a,0x8def25e4,0xcbccc3be,0x17c1ccbd,0xa6353208,
  102501. 0x804eb7a2,0x14d6699a },
  102502. { 0xdb1f411a,0x2c8a8415,0xf80d769c,0x09fbaf0b,0x1c2f77ad,0xb4deef90,
  102503. 0x0d43598a,0x6f4c6841 } },
  102504. /* 187 */
  102505. { { 0x96c24a96,0x8726df4e,0xfcbd99a3,0x534dbc85,0x8b2ae30a,0x3c466ef2,
  102506. 0x61189abb,0x4c4350fd },
  102507. { 0xf855b8da,0x2967f716,0x463c38a1,0x41a42394,0xeae93343,0xc37e1413,
  102508. 0x5a3118b5,0xa726d242 } },
  102509. /* 188 */
  102510. { { 0x948c1086,0xdae6b3ee,0xcbd3a2e1,0xf1de503d,0x03d022f3,0x3f35ed3f,
  102511. 0xcc6cf392,0x13639e82 },
  102512. { 0xcdafaa86,0x9ac938fb,0x2654a258,0xf45bc5fb,0x45051329,0x1963b26e,
  102513. 0xc1a335a3,0xca9365e1 } },
  102514. /* 189 */
  102515. { { 0x4c3b2d20,0x3615ac75,0x904e241b,0x742a5417,0xcc9d071d,0xb08521c4,
  102516. 0x970b72a5,0x9ce29c34 },
  102517. { 0x6d3e0ad6,0x8cc81f73,0xf2f8434c,0x8060da9e,0x6ce862d9,0x35ed1d1a,
  102518. 0xab42af98,0x48c4abd7 } },
  102519. /* 190 */
  102520. { { 0x40c7485a,0xd221b0cc,0xe5274dbf,0xead455bb,0x9263d2e8,0x493c7698,
  102521. 0xf67b33cb,0x78017c32 },
  102522. { 0x930cb5ee,0xb9d35769,0x0c408ed2,0xc0d14e94,0x272f1a4d,0xf8b7bf55,
  102523. 0xde5c1c04,0x53cd0454 } },
  102524. /* 191 */
  102525. { { 0x5d28ccac,0xbcd585fa,0x005b746e,0x5f823e56,0xcd0123aa,0x7c79f0a1,
  102526. 0xd3d7fa8f,0xeea465c1 },
  102527. { 0x0551803b,0x7810659f,0x7ce6af70,0x6c0b599f,0x29288e70,0x4195a770,
  102528. 0x7ae69193,0x1b6e42a4 } },
  102529. /* 192 */
  102530. { { 0xf67d04c3,0x2e80937c,0x89eeb811,0x1e312be2,0x92594d60,0x56b5d887,
  102531. 0x187fbd3d,0x0224da14 },
  102532. { 0x0c5fe36f,0x87abb863,0x4ef51f5f,0x580f3c60,0xb3b429ec,0x964fb1bf,
  102533. 0x42bfff33,0x60838ef0 } },
  102534. /* 193 */
  102535. { { 0x7e0bbe99,0x432cb2f2,0x04aa39ee,0x7bda44f3,0x9fa93903,0x5f497c7a,
  102536. 0x2d331643,0x636eb202 },
  102537. { 0x93ae00aa,0xfcfd0e61,0x31ae6d2f,0x875a00fe,0x9f93901c,0xf43658a2,
  102538. 0x39218bac,0x8844eeb6 } },
  102539. /* 194 */
  102540. { { 0x6b3bae58,0x114171d2,0x17e39f3e,0x7db3df71,0x81a8eada,0xcd37bc7f,
  102541. 0x51fb789e,0x27ba83dc },
  102542. { 0xfbf54de5,0xa7df439f,0xb5fe1a71,0x7277030b,0xdb297a48,0x42ee8e35,
  102543. 0x87f3a4ab,0xadb62d34 } },
  102544. /* 195 */
  102545. { { 0xa175df2a,0x9b1168a2,0x618c32e9,0x082aa04f,0x146b0916,0xc9e4f2e7,
  102546. 0x75e7c8b2,0xb990fd76 },
  102547. { 0x4df37313,0x0829d96b,0xd0b40789,0x1c205579,0x78087711,0x66c9ae4a,
  102548. 0x4d10d18d,0x81707ef9 } },
  102549. /* 196 */
  102550. { { 0x03d6ff96,0x97d7cab2,0x0d843360,0x5b851bfc,0xd042db4b,0x268823c4,
  102551. 0xd5a8aa5c,0x3792daea },
  102552. { 0x941afa0b,0x52818865,0x42d83671,0xf3e9e741,0x5be4e0a7,0x17c82527,
  102553. 0x94b001ba,0x5abd635e } },
  102554. /* 197 */
  102555. { { 0x0ac4927c,0x727fa84e,0xa7c8cf23,0xe3886035,0x4adca0df,0xa4bcd5ea,
  102556. 0x846ab610,0x5995bf21 },
  102557. { 0x829dfa33,0xe90f860b,0x958fc18b,0xcaafe2ae,0x78630366,0x9b3baf44,
  102558. 0xd483411e,0x44c32ca2 } },
  102559. /* 198 */
  102560. { { 0xe40ed80c,0xa74a97f1,0x31d2ca82,0x5f938cb1,0x7c2d6ad9,0x53f2124b,
  102561. 0x8082a54c,0x1f2162fb },
  102562. { 0x720b173e,0x7e467cc5,0x085f12f9,0x40e8a666,0x4c9d65dc,0x8cebc20e,
  102563. 0xc3e907c9,0x8f1d402b } },
  102564. /* 199 */
  102565. { { 0xfbc4058a,0x4f592f9c,0x292f5670,0xb15e14b6,0xbc1d8c57,0xc55cfe37,
  102566. 0x926edbf9,0xb1980f43 },
  102567. { 0x32c76b09,0x98c33e09,0x33b07f78,0x1df5279d,0x863bb461,0x6f08ead4,
  102568. 0x37448e45,0x2828ad9b } },
  102569. /* 200 */
  102570. { { 0xc4cf4ac5,0x696722c4,0xdde64afb,0xf5ac1a3f,0xe0890832,0x0551baa2,
  102571. 0x5a14b390,0x4973f127 },
  102572. { 0x322eac5d,0xe59d8335,0x0bd9b568,0x5e07eef5,0xa2588393,0xab36720f,
  102573. 0xdb168ac7,0x6dac8ed0 } },
  102574. /* 201 */
  102575. { { 0xeda835ef,0xf7b545ae,0x1d10ed51,0x4aa113d2,0x13741b09,0x035a65e0,
  102576. 0x20b9de4c,0x4b23ef59 },
  102577. { 0x3c4c7341,0xe82bb680,0x3f58bc37,0xd457706d,0xa51e3ee8,0x73527863,
  102578. 0xddf49a4e,0x4dd71534 } },
  102579. /* 202 */
  102580. { { 0x95476cd9,0xbf944672,0xe31a725b,0x648d072f,0xfc4b67e0,0x1441c8b8,
  102581. 0x2f4a4dbb,0xfd317000 },
  102582. { 0x8995d0e1,0x1cb43ff4,0x0ef729aa,0x76e695d1,0x41798982,0xe0d5f976,
  102583. 0x9569f365,0x14fac58c } },
  102584. /* 203 */
  102585. { { 0xf312ae18,0xad9a0065,0xfcc93fc9,0x51958dc0,0x8a7d2846,0xd9a14240,
  102586. 0x36abda50,0xed7c7651 },
  102587. { 0x25d4abbc,0x46270f1a,0xf1a113ea,0x9b5dd8f3,0x5b51952f,0xc609b075,
  102588. 0x4d2e9f53,0xfefcb7f7 } },
  102589. /* 204 */
  102590. { { 0xba119185,0xbd09497a,0xaac45ba4,0xd54e8c30,0xaa521179,0x492479de,
  102591. 0x87e0d80b,0x1801a57e },
  102592. { 0xfcafffb0,0x073d3f8d,0xae255240,0x6cf33c0b,0x5b5fdfbc,0x781d763b,
  102593. 0x1ead1064,0x9f8fc11e } },
  102594. /* 205 */
  102595. { { 0x5e69544c,0x1583a171,0xf04b7813,0x0eaf8567,0x278a4c32,0x1e22a8fd,
  102596. 0x3d3a69a9,0xa9d3809d },
  102597. { 0x59a2da3b,0x936c2c2c,0x1895c847,0x38ccbcf6,0x63d50869,0x5e65244e,
  102598. 0xe1178ef7,0x3006b9ae } },
  102599. /* 206 */
  102600. { { 0xc9eead28,0x0bb1f2b0,0x89f4dfbc,0x7eef635d,0xb2ce8939,0x074757fd,
  102601. 0x45f8f761,0x0ab85fd7 },
  102602. { 0x3e5b4549,0xecda7c93,0x97922f21,0x4be2bb5c,0xb43b8040,0x261a1274,
  102603. 0x11e942c2,0xb122d675 } },
  102604. /* 207 */
  102605. { { 0x66a5ae7a,0x3be607be,0x76adcbe3,0x01e703fa,0x4eb6e5c5,0xaf904301,
  102606. 0x097dbaec,0x9f599dc1 },
  102607. { 0x0ff250ed,0x6d75b718,0x349a20dc,0x8eb91574,0x10b227a3,0x425605a4,
  102608. 0x8a294b78,0x7d5528e0 } },
  102609. /* 208 */
  102610. { { 0x20c26def,0xf0f58f66,0x582b2d1e,0x025585ea,0x01ce3881,0xfbe7d79b,
  102611. 0x303f1730,0x28ccea01 },
  102612. { 0x79644ba5,0xd1dabcd1,0x06fff0b8,0x1fc643e8,0x66b3e17b,0xa60a76fc,
  102613. 0xa1d013bf,0xc18baf48 } },
  102614. /* 209 */
  102615. { { 0x5dc4216d,0x34e638c8,0x206142ac,0x00c01067,0x95f5064a,0xd453a171,
  102616. 0xb7a9596b,0x9def809d },
  102617. { 0x67ab8d2c,0x41e8642e,0x6237a2b6,0xb4240433,0x64c4218b,0x7d506a6d,
  102618. 0x68808ce5,0x0357f8b0 } },
  102619. /* 210 */
  102620. { { 0x4cd2cc88,0x8e9dbe64,0xf0b8f39d,0xcc61c28d,0xcd30a0c8,0x4a309874,
  102621. 0x1b489887,0xe4a01add },
  102622. { 0xf57cd8f9,0x2ed1eeac,0xbd594c48,0x1b767d3e,0x7bd2f787,0xa7295c71,
  102623. 0xce10cc30,0x466d7d79 } },
  102624. /* 211 */
  102625. { { 0x9dada2c7,0x47d31892,0x8f9aa27d,0x4fa0a6c3,0x820a59e1,0x90e4fd28,
  102626. 0x451ead1a,0xc672a522 },
  102627. { 0x5d86b655,0x30607cc8,0xf9ad4af1,0xf0235d3b,0x571172a6,0x99a08680,
  102628. 0xf2a67513,0x5e3d64fa } },
  102629. /* 212 */
  102630. { { 0x9b3b4416,0xaa6410c7,0xeab26d99,0xcd8fcf85,0xdb656a74,0x5ebff74a,
  102631. 0xeb8e42fc,0x6c8a7a95 },
  102632. { 0xb02a63bd,0x10c60ba7,0x8b8f0047,0x6b2f2303,0x312d90b0,0x8c6c3738,
  102633. 0xad82ca91,0x348ae422 } },
  102634. /* 213 */
  102635. { { 0x5ccda2fb,0x7f474663,0x8e0726d2,0x22accaa1,0x492b1f20,0x85adf782,
  102636. 0xd9ef2d2e,0xc1074de0 },
  102637. { 0xae9a65b3,0xfcf3ce44,0x05d7151b,0xfd71e4ac,0xce6a9788,0xd4711f50,
  102638. 0xc9e54ffc,0xfbadfbdb } },
  102639. /* 214 */
  102640. { { 0x20a99363,0x1713f1cd,0x6cf22775,0xb915658f,0x24d359b2,0x968175cd,
  102641. 0x83716fcd,0xb7f976b4 },
  102642. { 0x5d6dbf74,0x5758e24d,0x71c3af36,0x8d23bafd,0x0243dfe3,0x48f47760,
  102643. 0xcafcc805,0xf4d41b2e } },
  102644. /* 215 */
  102645. { { 0xfdabd48d,0x51f1cf28,0x32c078a4,0xce81be36,0x117146e9,0x6ace2974,
  102646. 0xe0160f10,0x180824ea },
  102647. { 0x66e58358,0x0387698b,0xce6ca358,0x63568752,0x5e41e6c5,0x82380e34,
  102648. 0x83cf6d25,0x67e5f639 } },
  102649. /* 216 */
  102650. { { 0xcf4899ef,0xf89ccb8d,0x9ebb44c0,0x949015f0,0xb2598ec9,0x546f9276,
  102651. 0x04c11fc6,0x9fef789a },
  102652. { 0x53d2a071,0x6d367ecf,0xa4519b09,0xb10e1a7f,0x611e2eef,0xca6b3fb0,
  102653. 0xa99c4e20,0xbc80c181 } },
  102654. /* 217 */
  102655. { { 0xe5eb82e6,0x972536f8,0xf56cb920,0x1a484fc7,0x50b5da5e,0xc78e2171,
  102656. 0x9f8cdf10,0x49270e62 },
  102657. { 0xea6b50ad,0x1a39b7bb,0xa2388ffc,0x9a0284c1,0x8107197b,0x5403eb17,
  102658. 0x61372f7f,0xd2ee52f9 } },
  102659. /* 218 */
  102660. { { 0x88e0362a,0xd37cd285,0x8fa5d94d,0x442fa8a7,0xa434a526,0xaff836e5,
  102661. 0xe5abb733,0xdfb478be },
  102662. { 0x673eede6,0xa91f1ce7,0x2b5b2f04,0xa5390ad4,0x5530da2f,0x5e66f7bf,
  102663. 0x08df473a,0xd9a140b4 } },
  102664. /* 219 */
  102665. { { 0x6e8ea498,0x0e0221b5,0x3563ee09,0x62347829,0x335d2ade,0xe06b8391,
  102666. 0x623f4b1a,0x760c058d },
  102667. { 0xc198aa79,0x0b89b58c,0xf07aba7f,0xf74890d2,0xfde2556a,0x4e204110,
  102668. 0x8f190409,0x7141982d } },
  102669. /* 220 */
  102670. { { 0x4d4b0f45,0x6f0a0e33,0x392a94e1,0xd9280b38,0xb3c61d5e,0x3af324c6,
  102671. 0x89d54e47,0x3af9d1ce },
  102672. { 0x20930371,0xfd8f7981,0x21c17097,0xeda2664c,0xdc42309b,0x0e9545dc,
  102673. 0x73957dd6,0xb1f815c3 } },
  102674. /* 221 */
  102675. { { 0x89fec44a,0x84faa78e,0x3caa4caf,0xc8c2ae47,0xc1b6a624,0x691c807d,
  102676. 0x1543f052,0xa41aed14 },
  102677. { 0x7d5ffe04,0x42435399,0x625b6e20,0x8bacb2df,0x87817775,0x85d660be,
  102678. 0x86fb60ef,0xd6e9c1dd } },
  102679. /* 222 */
  102680. { { 0xc6853264,0x3aa2e97e,0xe2304a0b,0x771533b7,0xb8eae9be,0x1b912bb7,
  102681. 0xae9bf8c2,0x9c9c6e10 },
  102682. { 0xe030b74c,0xa2309a59,0x6a631e90,0x4ed7494d,0xa49b79f2,0x89f44b23,
  102683. 0x40fa61b6,0x566bd596 } },
  102684. /* 223 */
  102685. { { 0xc18061f3,0x066c0118,0x7c83fc70,0x190b25d3,0x27273245,0xf05fc8e0,
  102686. 0xf525345e,0xcf2c7390 },
  102687. { 0x10eb30cf,0xa09bceb4,0x0d77703a,0xcfd2ebba,0x150ff255,0xe842c43a,
  102688. 0x8aa20979,0x02f51755 } },
  102689. /* 224 */
  102690. { { 0xaddb7d07,0x396ef794,0x24455500,0x0b4fc742,0xc78aa3ce,0xfaff8eac,
  102691. 0xe8d4d97d,0x14e9ada5 },
  102692. { 0x2f7079e2,0xdaa480a1,0xe4b0800e,0x45baa3cd,0x7838157d,0x01765e2d,
  102693. 0x8e9d9ae8,0xa0ad4fab } },
  102694. /* 225 */
  102695. { { 0x4a653618,0x0bfb7621,0x31eaaa5f,0x1872813c,0x44949d5e,0x1553e737,
  102696. 0x6e56ed1e,0xbcd530b8 },
  102697. { 0x32e9c47b,0x169be853,0xb50059ab,0xdc2776fe,0x192bfbb4,0xcdba9761,
  102698. 0x6979341d,0x909283cf } },
  102699. /* 226 */
  102700. { { 0x76e81a13,0x67b00324,0x62171239,0x9bee1a99,0xd32e19d6,0x08ed361b,
  102701. 0xace1549a,0x35eeb7c9 },
  102702. { 0x7e4e5bdc,0x1280ae5a,0xb6ceec6e,0x2dcd2cd3,0x6e266bc1,0x52e4224c,
  102703. 0x448ae864,0x9a8b2cf4 } },
  102704. /* 227 */
  102705. { { 0x09d03b59,0xf6471bf2,0xb65af2ab,0xc90e62a3,0xebd5eec9,0xff7ff168,
  102706. 0xd4491379,0x6bdb60f4 },
  102707. { 0x8a55bc30,0xdadafebc,0x10097fe0,0xc79ead16,0x4c1e3bdd,0x42e19741,
  102708. 0x94ba08a9,0x01ec3cfd } },
  102709. /* 228 */
  102710. { { 0xdc9485c2,0xba6277eb,0x22fb10c7,0x48cc9a79,0x70a28d8a,0x4f61d60f,
  102711. 0x475464f6,0xd1acb1c0 },
  102712. { 0x26f36612,0xd26902b1,0xe0618d8b,0x59c3a44e,0x308357ee,0x4df8a813,
  102713. 0x405626c2,0x7dcd079d } },
  102714. /* 229 */
  102715. { { 0xf05a4b48,0x5ce7d4d3,0x37230772,0xadcd2952,0x812a915a,0xd18f7971,
  102716. 0x377d19b8,0x0bf53589 },
  102717. { 0x6c68ea73,0x35ecd95a,0x823a584d,0xc7f3bbca,0xf473a723,0x9fb674c6,
  102718. 0xe16686fc,0xd28be4d9 } },
  102719. /* 230 */
  102720. { { 0x38fa8e4b,0x5d2b9906,0x893fd8fc,0x559f186e,0x436fb6fc,0x3a6de2aa,
  102721. 0x510f88ce,0xd76007aa },
  102722. { 0x523a4988,0x2d10aab6,0x74dd0273,0xb455cf44,0xa3407278,0x7f467082,
  102723. 0xb303bb01,0xf2b52f68 } },
  102724. /* 231 */
  102725. { { 0x9835b4ca,0x0d57eafa,0xbb669cbc,0x2d2232fc,0xc6643198,0x8eeeb680,
  102726. 0xcc5aed3a,0xd8dbe98e },
  102727. { 0xc5a02709,0xcba9be3f,0xf5ba1fa8,0x30be68e5,0xf10ea852,0xfebd43cd,
  102728. 0xee559705,0xe01593a3 } },
  102729. /* 232 */
  102730. { { 0xea75a0a6,0xd3e5af50,0x57858033,0x512226ac,0xd0176406,0x6fe6d50f,
  102731. 0xaeb8ef06,0xafec07b1 },
  102732. { 0x80bb0a31,0x7fb99567,0x37309aae,0x6f1af3cc,0x01abf389,0x9153a15a,
  102733. 0x6e2dbfdd,0xa71b9354 } },
  102734. /* 233 */
  102735. { { 0x18f593d2,0xbf8e12e0,0xa078122b,0xd1a90428,0x0ba4f2ad,0x150505db,
  102736. 0x628523d9,0x53a2005c },
  102737. { 0xe7f2b935,0x07c8b639,0xc182961a,0x2bff975a,0x7518ca2c,0x86bceea7,
  102738. 0x3d588e3d,0xbf47d19b } },
  102739. /* 234 */
  102740. { { 0xdd7665d5,0x672967a7,0x2f2f4de5,0x4e303057,0x80d4903f,0x144005ae,
  102741. 0x39c9a1b6,0x001c2c7f },
  102742. { 0x69efc6d6,0x143a8014,0x7bc7a724,0xc810bdaa,0xa78150a4,0x5f65670b,
  102743. 0x86ffb99b,0xfdadf8e7 } },
  102744. /* 235 */
  102745. { { 0xffc00785,0xfd38cb88,0x3b48eb67,0x77fa7591,0xbf368fbc,0x0454d055,
  102746. 0x5aa43c94,0x3a838e4d },
  102747. { 0x3e97bb9a,0x56166329,0x441d94d9,0x9eb93363,0x0adb2a83,0x515591a6,
  102748. 0x873e1da3,0x3cdb8257 } },
  102749. /* 236 */
  102750. { { 0x7de77eab,0x137140a9,0x41648109,0xf7e1c50d,0xceb1d0df,0x762dcad2,
  102751. 0xf1f57fba,0x5a60cc89 },
  102752. { 0x40d45673,0x80b36382,0x5913c655,0x1b82be19,0xdd64b741,0x057284b8,
  102753. 0xdbfd8fc0,0x922ff56f } },
  102754. /* 237 */
  102755. { { 0xc9a129a1,0x1b265dee,0xcc284e04,0xa5b1ce57,0xcebfbe3c,0x04380c46,
  102756. 0xf6c5cd62,0x72919a7d },
  102757. { 0x8fb90f9a,0x298f453a,0x88e4031b,0xd719c00b,0x796f1856,0xe32c0e77,
  102758. 0x3624089a,0x5e791780 } },
  102759. /* 238 */
  102760. { { 0x7f63cdfb,0x5c16ec55,0xf1cae4fd,0x8e6a3571,0x560597ca,0xfce26bea,
  102761. 0xe24c2fab,0x4e0a5371 },
  102762. { 0xa5765357,0x276a40d3,0x0d73a2b4,0x3c89af44,0x41d11a32,0xb8f370ae,
  102763. 0xd56604ee,0xf5ff7818 } },
  102764. /* 239 */
  102765. { { 0x1a09df21,0xfbf3e3fe,0xe66e8e47,0x26d5d28e,0x29c89015,0x2096bd0a,
  102766. 0x533f5e64,0xe41df0e9 },
  102767. { 0xb3ba9e3f,0x305fda40,0x2604d895,0xf2340ceb,0x7f0367c7,0x0866e192,
  102768. 0xac4f155f,0x8edd7d6e } },
  102769. /* 240 */
  102770. { { 0x0bfc8ff3,0xc9a1dc0e,0xe936f42f,0x14efd82b,0xcca381ef,0x67016f7c,
  102771. 0xed8aee96,0x1432c1ca },
  102772. { 0x70b23c26,0xec684829,0x0735b273,0xa64fe873,0xeaef0f5a,0xe389f6e5,
  102773. 0x5ac8d2c6,0xcaef480b } },
  102774. /* 241 */
  102775. { { 0x75315922,0x5245c978,0x3063cca5,0xd8295171,0xb64ef2cb,0xf3ce60d0,
  102776. 0x8efae236,0xd0ba177e },
  102777. { 0xb1b3af60,0x53a9ae8f,0x3d2da20e,0x1a796ae5,0xdf9eef28,0x01d63605,
  102778. 0x1c54ae16,0xf31c957c } },
  102779. /* 242 */
  102780. { { 0x49cc4597,0xc0f58d52,0xbae0a028,0xdc5015b0,0x734a814a,0xefc5fc55,
  102781. 0x96e17c3a,0x013404cb },
  102782. { 0xc9a824bf,0xb29e2585,0x001eaed7,0xd593185e,0x61ef68ac,0x8d6ee682,
  102783. 0x91933e6c,0x6f377c4b } },
  102784. /* 243 */
  102785. { { 0xa8333fd2,0x9f93bad1,0x5a2a95b8,0xa8930202,0xeaf75ace,0x211e5037,
  102786. 0xd2d09506,0x6dba3e4e },
  102787. { 0xd04399cd,0xa48ef98c,0xe6b73ade,0x1811c66e,0xc17ecaf3,0x72f60752,
  102788. 0x3becf4a7,0xf13cf342 } },
  102789. /* 244 */
  102790. { { 0xa919e2eb,0xceeb9ec0,0xf62c0f68,0x83a9a195,0x7aba2299,0xcfba3bb6,
  102791. 0x274bbad3,0xc83fa9a9 },
  102792. { 0x62fa1ce0,0x0d7d1b0b,0x3418efbf,0xe58b60f5,0x52706f04,0xbfa8ef9e,
  102793. 0x5d702683,0xb49d70f4 } },
  102794. /* 245 */
  102795. { { 0xfad5513b,0x914c7510,0xb1751e2d,0x05f32eec,0xd9fb9d59,0x6d850418,
  102796. 0x0c30f1cf,0x59cfadbb },
  102797. { 0x55cb7fd6,0xe167ac23,0x820426a3,0x249367b8,0x90a78864,0xeaeec58c,
  102798. 0x354a4b67,0x5babf362 } },
  102799. /* 246 */
  102800. { { 0xee424865,0x37c981d1,0xf2e5577f,0x8b002878,0xb9e0c058,0x702970f1,
  102801. 0x9026c8f0,0x6188c6a7 },
  102802. { 0xd0f244da,0x06f9a19b,0xfb080873,0x1ecced5c,0x9f213637,0x35470f9b,
  102803. 0xdf50b9d9,0x993fe475 } },
  102804. /* 247 */
  102805. { { 0x9b2c3609,0x68e31cdf,0x2c46d4ea,0x84eb19c0,0x9a775101,0x7ac9ec1a,
  102806. 0x4c80616b,0x81f76466 },
  102807. { 0x75fbe978,0x1d7c2a5a,0xf183b356,0x6743fed3,0x501dd2bf,0x838d1f04,
  102808. 0x5fe9060d,0x564a812a } },
  102809. /* 248 */
  102810. { { 0xfa817d1d,0x7a5a64f4,0xbea82e0f,0x55f96844,0xcd57f9aa,0xb5ff5a0f,
  102811. 0x00e51d6c,0x226bf3cf },
  102812. { 0x2f2833cf,0xd6d1a9f9,0x4f4f89a8,0x20a0a35a,0x8f3f7f77,0x11536c49,
  102813. 0xff257836,0x68779f47 } },
  102814. /* 249 */
  102815. { { 0x73043d08,0x79b0c1c1,0x1fc020fa,0xa5446774,0x9a6d26d0,0xd3767e28,
  102816. 0xeb092e0b,0x97bcb0d1 },
  102817. { 0xf32ed3c3,0x2ab6eaa8,0xb281bc48,0xc8a4f151,0xbfa178f3,0x4d1bf4f3,
  102818. 0x0a784655,0xa872ffe8 } },
  102819. /* 250 */
  102820. { { 0xa32b2086,0xb1ab7935,0x8160f486,0xe1eb710e,0x3b6ae6be,0x9bd0cd91,
  102821. 0xb732a36a,0x02812bfc },
  102822. { 0xcf605318,0xa63fd7ca,0xfdfd6d1d,0x646e5d50,0x2102d619,0xa1d68398,
  102823. 0xfe5396af,0x07391cc9 } },
  102824. /* 251 */
  102825. { { 0x8b80d02b,0xc50157f0,0x62877f7f,0x6b8333d1,0x78d542ae,0x7aca1af8,
  102826. 0x7e6d2a08,0x355d2adc },
  102827. { 0x287386e1,0xb41f335a,0xf8e43275,0xfd272a94,0xe79989ea,0x286ca2cd,
  102828. 0x7c2a3a79,0x3dc2b1e3 } },
  102829. /* 252 */
  102830. { { 0x04581352,0xd689d21c,0x376782be,0x0a00c825,0x9fed701f,0x203bd590,
  102831. 0x3ccd846b,0xc4786910 },
  102832. { 0x24c768ed,0x5dba7708,0x6841f657,0x72feea02,0x6accce0e,0x73313ed5,
  102833. 0xd5bb4d32,0xccc42968 } },
  102834. /* 253 */
  102835. { { 0x3d7620b9,0x94e50de1,0x5992a56a,0xd89a5c8a,0x675487c9,0xdc007640,
  102836. 0xaa4871cf,0xe147eb42 },
  102837. { 0xacf3ae46,0x274ab4ee,0x50350fbe,0xfd4936fb,0x48c840ea,0xdf2afe47,
  102838. 0x080e96e3,0x239ac047 } },
  102839. /* 254 */
  102840. { { 0x2bfee8d4,0x481d1f35,0xfa7b0fec,0xce80b5cf,0x2ce9af3c,0x105c4c9e,
  102841. 0xf5f7e59d,0xc55fa1a3 },
  102842. { 0x8257c227,0x3186f14e,0x342be00b,0xc5b1653f,0xaa904fb2,0x09afc998,
  102843. 0xd4f4b699,0x094cd99c } },
  102844. /* 255 */
  102845. { { 0xd703beba,0x8a981c84,0x32ceb291,0x8631d150,0xe3bd49ec,0xa445f2c9,
  102846. 0x42abad33,0xb90a30b6 },
  102847. { 0xb4a5abf9,0xb465404f,0x75db7603,0x004750c3,0xca35d89f,0x6f9a42cc,
  102848. 0x1b7924f7,0x019f8b9a } },
  102849. };
  102850. /* Multiply the base point of P256 by the scalar and return the result.
  102851. * If map is true then convert result to affine coordinates.
  102852. *
  102853. * Stripe implementation.
  102854. * Pre-generated: 2^0, 2^32, ...
  102855. * Pre-generated: products of all combinations of above.
  102856. * 8 doubles and adds (with qz=1)
  102857. *
  102858. * r Resulting point.
  102859. * k Scalar to multiply by.
  102860. * map Indicates whether to convert result to affine.
  102861. * ct Constant time required.
  102862. * heap Heap to use for allocation.
  102863. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  102864. */
  102865. static int sp_256_ecc_mulmod_base_8(sp_point_256* r, const sp_digit* k,
  102866. int map, int ct, void* heap)
  102867. {
  102868. return sp_256_ecc_mulmod_stripe_8(r, &p256_base, p256_table,
  102869. k, map, ct, heap);
  102870. }
  102871. #endif
  102872. /* Multiply the base point of P256 by the scalar and return the result.
  102873. * If map is true then convert result to affine coordinates.
  102874. *
  102875. * km Scalar to multiply by.
  102876. * r Resulting point.
  102877. * map Indicates whether to convert result to affine.
  102878. * heap Heap to use for allocation.
  102879. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  102880. */
  102881. int sp_ecc_mulmod_base_256(const mp_int* km, ecc_point* r, int map, void* heap)
  102882. {
  102883. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  102884. sp_point_256* point = NULL;
  102885. sp_digit* k = NULL;
  102886. #else
  102887. sp_point_256 point[1];
  102888. sp_digit k[8];
  102889. #endif
  102890. int err = MP_OKAY;
  102891. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  102892. point = (sp_point_256*)XMALLOC(sizeof(sp_point_256), heap,
  102893. DYNAMIC_TYPE_ECC);
  102894. if (point == NULL)
  102895. err = MEMORY_E;
  102896. if (err == MP_OKAY) {
  102897. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 8, heap,
  102898. DYNAMIC_TYPE_ECC);
  102899. if (k == NULL)
  102900. err = MEMORY_E;
  102901. }
  102902. #endif
  102903. if (err == MP_OKAY) {
  102904. sp_256_from_mp(k, 8, km);
  102905. err = sp_256_ecc_mulmod_base_8(point, k, map, 1, heap);
  102906. }
  102907. if (err == MP_OKAY) {
  102908. err = sp_256_point_to_ecc_point_8(point, r);
  102909. }
  102910. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  102911. if (k != NULL)
  102912. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  102913. if (point != NULL)
  102914. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  102915. #endif
  102916. return err;
  102917. }
  102918. /* Multiply the base point of P256 by the scalar, add point a and return
  102919. * the result. If map is true then convert result to affine coordinates.
  102920. *
  102921. * km Scalar to multiply by.
  102922. * am Point to add to scalar mulitply result.
  102923. * inMont Point to add is in montgomery form.
  102924. * r Resulting point.
  102925. * map Indicates whether to convert result to affine.
  102926. * heap Heap to use for allocation.
  102927. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  102928. */
  102929. int sp_ecc_mulmod_base_add_256(const mp_int* km, const ecc_point* am,
  102930. int inMont, ecc_point* r, int map, void* heap)
  102931. {
  102932. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  102933. sp_point_256* point = NULL;
  102934. sp_digit* k = NULL;
  102935. #else
  102936. sp_point_256 point[2];
  102937. sp_digit k[8 + 8 * 2 * 6];
  102938. #endif
  102939. sp_point_256* addP = NULL;
  102940. sp_digit* tmp = NULL;
  102941. int err = MP_OKAY;
  102942. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  102943. point = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap,
  102944. DYNAMIC_TYPE_ECC);
  102945. if (point == NULL)
  102946. err = MEMORY_E;
  102947. if (err == MP_OKAY) {
  102948. k = (sp_digit*)XMALLOC(
  102949. sizeof(sp_digit) * (8 + 8 * 2 * 6),
  102950. heap, DYNAMIC_TYPE_ECC);
  102951. if (k == NULL)
  102952. err = MEMORY_E;
  102953. }
  102954. #endif
  102955. if (err == MP_OKAY) {
  102956. addP = point + 1;
  102957. tmp = k + 8;
  102958. sp_256_from_mp(k, 8, km);
  102959. sp_256_point_from_ecc_point_8(addP, am);
  102960. }
  102961. if ((err == MP_OKAY) && (!inMont)) {
  102962. err = sp_256_mod_mul_norm_8(addP->x, addP->x, p256_mod);
  102963. }
  102964. if ((err == MP_OKAY) && (!inMont)) {
  102965. err = sp_256_mod_mul_norm_8(addP->y, addP->y, p256_mod);
  102966. }
  102967. if ((err == MP_OKAY) && (!inMont)) {
  102968. err = sp_256_mod_mul_norm_8(addP->z, addP->z, p256_mod);
  102969. }
  102970. if (err == MP_OKAY) {
  102971. err = sp_256_ecc_mulmod_base_8(point, k, 0, 0, heap);
  102972. }
  102973. if (err == MP_OKAY) {
  102974. sp_256_proj_point_add_8(point, point, addP, tmp);
  102975. if (map) {
  102976. sp_256_map_8(point, point, tmp);
  102977. }
  102978. err = sp_256_point_to_ecc_point_8(point, r);
  102979. }
  102980. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  102981. if (k != NULL)
  102982. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  102983. if (point)
  102984. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  102985. #endif
  102986. return err;
  102987. }
  102988. #if defined(WOLFSSL_VALIDATE_ECC_KEYGEN) || defined(HAVE_ECC_SIGN) || \
  102989. defined(HAVE_ECC_VERIFY)
  102990. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN | HAVE_ECC_SIGN | HAVE_ECC_VERIFY */
  102991. /* Add 1 to a. (a = a + 1)
  102992. *
  102993. * a A single precision integer.
  102994. */
  102995. SP_NOINLINE static void sp_256_add_one_8(sp_digit* a)
  102996. {
  102997. __asm__ __volatile__ (
  102998. "movs r2, #1\n\t"
  102999. "ldr r1, [%[a]]\n\t"
  103000. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103001. "adds r1, r1, r2\n\t"
  103002. #else
  103003. "add r1, r1, r2\n\t"
  103004. #endif
  103005. "movs r2, #0\n\t"
  103006. "str r1, [%[a]]\n\t"
  103007. "ldr r1, [%[a], #4]\n\t"
  103008. #ifdef WOLFSSL_KEIL
  103009. "adcs r1, r1, r2\n\t"
  103010. #elif defined(__clang__)
  103011. "adcs r1, r2\n\t"
  103012. #else
  103013. "adc r1, r2\n\t"
  103014. #endif
  103015. "str r1, [%[a], #4]\n\t"
  103016. "ldr r1, [%[a], #8]\n\t"
  103017. #ifdef WOLFSSL_KEIL
  103018. "adcs r1, r1, r2\n\t"
  103019. #elif defined(__clang__)
  103020. "adcs r1, r2\n\t"
  103021. #else
  103022. "adc r1, r2\n\t"
  103023. #endif
  103024. "str r1, [%[a], #8]\n\t"
  103025. "ldr r1, [%[a], #12]\n\t"
  103026. #ifdef WOLFSSL_KEIL
  103027. "adcs r1, r1, r2\n\t"
  103028. #elif defined(__clang__)
  103029. "adcs r1, r2\n\t"
  103030. #else
  103031. "adc r1, r2\n\t"
  103032. #endif
  103033. "str r1, [%[a], #12]\n\t"
  103034. "ldr r1, [%[a], #16]\n\t"
  103035. #ifdef WOLFSSL_KEIL
  103036. "adcs r1, r1, r2\n\t"
  103037. #elif defined(__clang__)
  103038. "adcs r1, r2\n\t"
  103039. #else
  103040. "adc r1, r2\n\t"
  103041. #endif
  103042. "str r1, [%[a], #16]\n\t"
  103043. "ldr r1, [%[a], #20]\n\t"
  103044. #ifdef WOLFSSL_KEIL
  103045. "adcs r1, r1, r2\n\t"
  103046. #elif defined(__clang__)
  103047. "adcs r1, r2\n\t"
  103048. #else
  103049. "adc r1, r2\n\t"
  103050. #endif
  103051. "str r1, [%[a], #20]\n\t"
  103052. "ldr r1, [%[a], #24]\n\t"
  103053. #ifdef WOLFSSL_KEIL
  103054. "adcs r1, r1, r2\n\t"
  103055. #elif defined(__clang__)
  103056. "adcs r1, r2\n\t"
  103057. #else
  103058. "adc r1, r2\n\t"
  103059. #endif
  103060. "str r1, [%[a], #24]\n\t"
  103061. "ldr r1, [%[a], #28]\n\t"
  103062. #ifdef WOLFSSL_KEIL
  103063. "adcs r1, r1, r2\n\t"
  103064. #elif defined(__clang__)
  103065. "adcs r1, r2\n\t"
  103066. #else
  103067. "adc r1, r2\n\t"
  103068. #endif
  103069. "str r1, [%[a], #28]\n\t"
  103070. : [a] "+l" (a)
  103071. :
  103072. : "memory", "r1", "r2"
  103073. );
  103074. }
  103075. /* Read big endian unsigned byte array into r.
  103076. *
  103077. * r A single precision integer.
  103078. * size Maximum number of bytes to convert
  103079. * a Byte array.
  103080. * n Number of bytes in array to read.
  103081. */
  103082. static void sp_256_from_bin(sp_digit* r, int size, const byte* a, int n)
  103083. {
  103084. int i;
  103085. int j;
  103086. byte* d;
  103087. for (i = n - 1,j = 0; i >= 3; i -= 4) {
  103088. r[j] = ((sp_digit)a[i - 0] << 0) |
  103089. ((sp_digit)a[i - 1] << 8) |
  103090. ((sp_digit)a[i - 2] << 16) |
  103091. ((sp_digit)a[i - 3] << 24);
  103092. j++;
  103093. }
  103094. if (i >= 0) {
  103095. r[j] = 0;
  103096. d = (byte*)r;
  103097. switch (i) {
  103098. case 2: d[n - 1 - 2] = a[2]; //fallthrough
  103099. case 1: d[n - 1 - 1] = a[1]; //fallthrough
  103100. case 0: d[n - 1 - 0] = a[0]; //fallthrough
  103101. }
  103102. j++;
  103103. }
  103104. for (; j < size; j++) {
  103105. r[j] = 0;
  103106. }
  103107. }
  103108. /* Generates a scalar that is in the range 1..order-1.
  103109. *
  103110. * rng Random number generator.
  103111. * k Scalar value.
  103112. * returns RNG failures, MEMORY_E when memory allocation fails and
  103113. * MP_OKAY on success.
  103114. */
  103115. static int sp_256_ecc_gen_k_8(WC_RNG* rng, sp_digit* k)
  103116. {
  103117. int err;
  103118. byte buf[32];
  103119. do {
  103120. err = wc_RNG_GenerateBlock(rng, buf, sizeof(buf));
  103121. if (err == 0) {
  103122. sp_256_from_bin(k, 8, buf, (int)sizeof(buf));
  103123. if (sp_256_cmp_8(k, p256_order2) <= 0) {
  103124. sp_256_add_one_8(k);
  103125. break;
  103126. }
  103127. }
  103128. }
  103129. while (err == 0);
  103130. return err;
  103131. }
  103132. /* Makes a random EC key pair.
  103133. *
  103134. * rng Random number generator.
  103135. * priv Generated private value.
  103136. * pub Generated public point.
  103137. * heap Heap to use for allocation.
  103138. * returns ECC_INF_E when the point does not have the correct order, RNG
  103139. * failures, MEMORY_E when memory allocation fails and MP_OKAY on success.
  103140. */
  103141. int sp_ecc_make_key_256(WC_RNG* rng, mp_int* priv, ecc_point* pub, void* heap)
  103142. {
  103143. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  103144. sp_point_256* point = NULL;
  103145. sp_digit* k = NULL;
  103146. #else
  103147. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  103148. sp_point_256 point[2];
  103149. #else
  103150. sp_point_256 point[1];
  103151. #endif
  103152. sp_digit k[8];
  103153. #endif
  103154. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  103155. sp_point_256* infinity = NULL;
  103156. #endif
  103157. int err = MP_OKAY;
  103158. (void)heap;
  103159. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  103160. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  103161. point = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap, DYNAMIC_TYPE_ECC);
  103162. #else
  103163. point = (sp_point_256*)XMALLOC(sizeof(sp_point_256), heap, DYNAMIC_TYPE_ECC);
  103164. #endif
  103165. if (point == NULL)
  103166. err = MEMORY_E;
  103167. if (err == MP_OKAY) {
  103168. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 8, heap,
  103169. DYNAMIC_TYPE_ECC);
  103170. if (k == NULL)
  103171. err = MEMORY_E;
  103172. }
  103173. #endif
  103174. if (err == MP_OKAY) {
  103175. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  103176. infinity = point + 1;
  103177. #endif
  103178. err = sp_256_ecc_gen_k_8(rng, k);
  103179. }
  103180. if (err == MP_OKAY) {
  103181. err = sp_256_ecc_mulmod_base_8(point, k, 1, 1, NULL);
  103182. }
  103183. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  103184. if (err == MP_OKAY) {
  103185. err = sp_256_ecc_mulmod_8(infinity, point, p256_order, 1, 1, NULL);
  103186. }
  103187. if (err == MP_OKAY) {
  103188. if (sp_256_iszero_8(point->x) || sp_256_iszero_8(point->y)) {
  103189. err = ECC_INF_E;
  103190. }
  103191. }
  103192. #endif
  103193. if (err == MP_OKAY) {
  103194. err = sp_256_to_mp(k, priv);
  103195. }
  103196. if (err == MP_OKAY) {
  103197. err = sp_256_point_to_ecc_point_8(point, pub);
  103198. }
  103199. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  103200. if (k != NULL)
  103201. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  103202. if (point != NULL) {
  103203. /* point is not sensitive, so no need to zeroize */
  103204. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  103205. }
  103206. #endif
  103207. return err;
  103208. }
  103209. #ifdef WOLFSSL_SP_NONBLOCK
  103210. typedef struct sp_ecc_key_gen_256_ctx {
  103211. int state;
  103212. sp_256_ecc_mulmod_8_ctx mulmod_ctx;
  103213. sp_digit k[8];
  103214. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  103215. sp_point_256 point[2];
  103216. #else
  103217. sp_point_256 point[1];
  103218. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN */
  103219. } sp_ecc_key_gen_256_ctx;
  103220. int sp_ecc_make_key_256_nb(sp_ecc_ctx_t* sp_ctx, WC_RNG* rng, mp_int* priv,
  103221. ecc_point* pub, void* heap)
  103222. {
  103223. int err = FP_WOULDBLOCK;
  103224. sp_ecc_key_gen_256_ctx* ctx = (sp_ecc_key_gen_256_ctx*)sp_ctx->data;
  103225. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  103226. sp_point_256* infinity = ctx->point + 1;
  103227. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN */
  103228. typedef char ctx_size_test[sizeof(sp_ecc_key_gen_256_ctx)
  103229. >= sizeof(*sp_ctx) ? -1 : 1];
  103230. (void)sizeof(ctx_size_test);
  103231. switch (ctx->state) {
  103232. case 0:
  103233. err = sp_256_ecc_gen_k_8(rng, ctx->k);
  103234. if (err == MP_OKAY) {
  103235. err = FP_WOULDBLOCK;
  103236. ctx->state = 1;
  103237. }
  103238. break;
  103239. case 1:
  103240. err = sp_256_ecc_mulmod_base_8_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  103241. ctx->point, ctx->k, 1, 1, heap);
  103242. if (err == MP_OKAY) {
  103243. err = FP_WOULDBLOCK;
  103244. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  103245. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  103246. ctx->state = 2;
  103247. #else
  103248. ctx->state = 3;
  103249. #endif
  103250. }
  103251. break;
  103252. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  103253. case 2:
  103254. err = sp_256_ecc_mulmod_8_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  103255. infinity, ctx->point, p256_order, 1, 1);
  103256. if (err == MP_OKAY) {
  103257. if (sp_256_iszero_8(ctx->point->x) ||
  103258. sp_256_iszero_8(ctx->point->y)) {
  103259. err = ECC_INF_E;
  103260. }
  103261. else {
  103262. err = FP_WOULDBLOCK;
  103263. ctx->state = 3;
  103264. }
  103265. }
  103266. break;
  103267. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN */
  103268. case 3:
  103269. err = sp_256_to_mp(ctx->k, priv);
  103270. if (err == MP_OKAY) {
  103271. err = sp_256_point_to_ecc_point_8(ctx->point, pub);
  103272. }
  103273. break;
  103274. }
  103275. if (err != FP_WOULDBLOCK) {
  103276. XMEMSET(ctx, 0, sizeof(sp_ecc_key_gen_256_ctx));
  103277. }
  103278. return err;
  103279. }
  103280. #endif /* WOLFSSL_SP_NONBLOCK */
  103281. #ifdef HAVE_ECC_DHE
  103282. /* Write r as big endian to byte array.
  103283. * Fixed length number of bytes written: 32
  103284. *
  103285. * r A single precision integer.
  103286. * a Byte array.
  103287. */
  103288. static void sp_256_to_bin_8(sp_digit* r, byte* a)
  103289. {
  103290. int i;
  103291. int j = 0;
  103292. for (i = 7; i >= 0; i--) {
  103293. a[j++] = r[i] >> 24;
  103294. a[j++] = r[i] >> 16;
  103295. a[j++] = r[i] >> 8;
  103296. a[j++] = r[i] >> 0;
  103297. }
  103298. }
  103299. /* Multiply the point by the scalar and serialize the X ordinate.
  103300. * The number is 0 padded to maximum size on output.
  103301. *
  103302. * priv Scalar to multiply the point by.
  103303. * pub Point to multiply.
  103304. * out Buffer to hold X ordinate.
  103305. * outLen On entry, size of the buffer in bytes.
  103306. * On exit, length of data in buffer in bytes.
  103307. * heap Heap to use for allocation.
  103308. * returns BUFFER_E if the buffer is to small for output size,
  103309. * MEMORY_E when memory allocation fails and MP_OKAY on success.
  103310. */
  103311. int sp_ecc_secret_gen_256(const mp_int* priv, const ecc_point* pub, byte* out,
  103312. word32* outLen, void* heap)
  103313. {
  103314. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  103315. sp_point_256* point = NULL;
  103316. sp_digit* k = NULL;
  103317. #else
  103318. sp_point_256 point[1];
  103319. sp_digit k[8];
  103320. #endif
  103321. int err = MP_OKAY;
  103322. if (*outLen < 32U) {
  103323. err = BUFFER_E;
  103324. }
  103325. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  103326. if (err == MP_OKAY) {
  103327. point = (sp_point_256*)XMALLOC(sizeof(sp_point_256), heap,
  103328. DYNAMIC_TYPE_ECC);
  103329. if (point == NULL)
  103330. err = MEMORY_E;
  103331. }
  103332. if (err == MP_OKAY) {
  103333. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 8, heap,
  103334. DYNAMIC_TYPE_ECC);
  103335. if (k == NULL)
  103336. err = MEMORY_E;
  103337. }
  103338. #endif
  103339. if (err == MP_OKAY) {
  103340. sp_256_from_mp(k, 8, priv);
  103341. sp_256_point_from_ecc_point_8(point, pub);
  103342. err = sp_256_ecc_mulmod_8(point, point, k, 1, 1, heap);
  103343. }
  103344. if (err == MP_OKAY) {
  103345. sp_256_to_bin_8(point->x, out);
  103346. *outLen = 32;
  103347. }
  103348. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  103349. if (k != NULL)
  103350. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  103351. if (point != NULL)
  103352. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  103353. #endif
  103354. return err;
  103355. }
  103356. #ifdef WOLFSSL_SP_NONBLOCK
  103357. typedef struct sp_ecc_sec_gen_256_ctx {
  103358. int state;
  103359. union {
  103360. sp_256_ecc_mulmod_8_ctx mulmod_ctx;
  103361. };
  103362. sp_digit k[8];
  103363. sp_point_256 point;
  103364. } sp_ecc_sec_gen_256_ctx;
  103365. int sp_ecc_secret_gen_256_nb(sp_ecc_ctx_t* sp_ctx, const mp_int* priv,
  103366. const ecc_point* pub, byte* out, word32* outLen, void* heap)
  103367. {
  103368. int err = FP_WOULDBLOCK;
  103369. sp_ecc_sec_gen_256_ctx* ctx = (sp_ecc_sec_gen_256_ctx*)sp_ctx->data;
  103370. typedef char ctx_size_test[sizeof(sp_ecc_sec_gen_256_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  103371. (void)sizeof(ctx_size_test);
  103372. if (*outLen < 32U) {
  103373. err = BUFFER_E;
  103374. }
  103375. switch (ctx->state) {
  103376. case 0:
  103377. sp_256_from_mp(ctx->k, 8, priv);
  103378. sp_256_point_from_ecc_point_8(&ctx->point, pub);
  103379. ctx->state = 1;
  103380. break;
  103381. case 1:
  103382. err = sp_256_ecc_mulmod_8_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  103383. &ctx->point, &ctx->point, ctx->k, 1, 1, heap);
  103384. if (err == MP_OKAY) {
  103385. sp_256_to_bin_8(ctx->point.x, out);
  103386. *outLen = 32;
  103387. }
  103388. break;
  103389. }
  103390. if (err == MP_OKAY && ctx->state != 1) {
  103391. err = FP_WOULDBLOCK;
  103392. }
  103393. if (err != FP_WOULDBLOCK) {
  103394. XMEMSET(ctx, 0, sizeof(sp_ecc_sec_gen_256_ctx));
  103395. }
  103396. return err;
  103397. }
  103398. #endif /* WOLFSSL_SP_NONBLOCK */
  103399. #endif /* HAVE_ECC_DHE */
  103400. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  103401. #endif
  103402. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  103403. #endif
  103404. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  103405. #ifdef WOLFSSL_SP_SMALL
  103406. /* Sub b from a into a. (a -= b)
  103407. *
  103408. * a A single precision integer.
  103409. * b A single precision integer.
  103410. */
  103411. SP_NOINLINE static sp_digit sp_256_sub_in_place_8(sp_digit* a,
  103412. const sp_digit* b)
  103413. {
  103414. __asm__ __volatile__ (
  103415. "movs r7, %[a]\n\t"
  103416. "movs r2, #0\n\t"
  103417. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103418. "adds r7, r7, #32\n\t"
  103419. #else
  103420. "add r7, r7, #32\n\t"
  103421. #endif
  103422. "\n"
  103423. "L_sp_256_sub_in_place_8_words_%=:\n\t"
  103424. "movs r5, #0\n\t"
  103425. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103426. "subs r5, r5, r2\n\t"
  103427. #else
  103428. "sub r5, r5, r2\n\t"
  103429. #endif
  103430. "ldr r3, [%[a]]\n\t"
  103431. "ldr r4, [%[a], #4]\n\t"
  103432. "ldr r5, [%[b]]\n\t"
  103433. "ldr r6, [%[b], #4]\n\t"
  103434. #ifdef WOLFSSL_KEIL
  103435. "sbcs r3, r3, r5\n\t"
  103436. #elif defined(__clang__)
  103437. "sbcs r3, r5\n\t"
  103438. #else
  103439. "sbc r3, r5\n\t"
  103440. #endif
  103441. #ifdef WOLFSSL_KEIL
  103442. "sbcs r4, r4, r6\n\t"
  103443. #elif defined(__clang__)
  103444. "sbcs r4, r6\n\t"
  103445. #else
  103446. "sbc r4, r6\n\t"
  103447. #endif
  103448. "str r3, [%[a]]\n\t"
  103449. "str r4, [%[a], #4]\n\t"
  103450. #ifdef WOLFSSL_KEIL
  103451. "sbcs r2, r2, r2\n\t"
  103452. #elif defined(__clang__)
  103453. "sbcs r2, r2\n\t"
  103454. #else
  103455. "sbc r2, r2\n\t"
  103456. #endif
  103457. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103458. "adds %[a], %[a], #8\n\t"
  103459. #else
  103460. "add %[a], %[a], #8\n\t"
  103461. #endif
  103462. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103463. "adds %[b], %[b], #8\n\t"
  103464. #else
  103465. "add %[b], %[b], #8\n\t"
  103466. #endif
  103467. "cmp %[a], r7\n\t"
  103468. "bne L_sp_256_sub_in_place_8_words_%=\n\t"
  103469. "movs %[a], r2\n\t"
  103470. : [a] "+l" (a), [b] "+l" (b)
  103471. :
  103472. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  103473. );
  103474. return (uint32_t)(size_t)a;
  103475. }
  103476. #else
  103477. /* Sub b from a into a. (a -= b)
  103478. *
  103479. * a A single precision integer.
  103480. * b A single precision integer.
  103481. */
  103482. SP_NOINLINE static sp_digit sp_256_sub_in_place_8(sp_digit* a,
  103483. const sp_digit* b)
  103484. {
  103485. __asm__ __volatile__ (
  103486. "ldm %[b]!, {r4, r5}\n\t"
  103487. "ldr r2, [%[a]]\n\t"
  103488. "ldr r3, [%[a], #4]\n\t"
  103489. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103490. "subs r2, r2, r4\n\t"
  103491. #else
  103492. "sub r2, r2, r4\n\t"
  103493. #endif
  103494. #ifdef WOLFSSL_KEIL
  103495. "sbcs r3, r3, r5\n\t"
  103496. #elif defined(__clang__)
  103497. "sbcs r3, r5\n\t"
  103498. #else
  103499. "sbc r3, r5\n\t"
  103500. #endif
  103501. "stm %[a]!, {r2, r3}\n\t"
  103502. "ldm %[b]!, {r4, r5}\n\t"
  103503. "ldr r2, [%[a]]\n\t"
  103504. "ldr r3, [%[a], #4]\n\t"
  103505. #ifdef WOLFSSL_KEIL
  103506. "sbcs r2, r2, r4\n\t"
  103507. #elif defined(__clang__)
  103508. "sbcs r2, r4\n\t"
  103509. #else
  103510. "sbc r2, r4\n\t"
  103511. #endif
  103512. #ifdef WOLFSSL_KEIL
  103513. "sbcs r3, r3, r5\n\t"
  103514. #elif defined(__clang__)
  103515. "sbcs r3, r5\n\t"
  103516. #else
  103517. "sbc r3, r5\n\t"
  103518. #endif
  103519. "stm %[a]!, {r2, r3}\n\t"
  103520. "ldm %[b]!, {r4, r5}\n\t"
  103521. "ldr r2, [%[a]]\n\t"
  103522. "ldr r3, [%[a], #4]\n\t"
  103523. #ifdef WOLFSSL_KEIL
  103524. "sbcs r2, r2, r4\n\t"
  103525. #elif defined(__clang__)
  103526. "sbcs r2, r4\n\t"
  103527. #else
  103528. "sbc r2, r4\n\t"
  103529. #endif
  103530. #ifdef WOLFSSL_KEIL
  103531. "sbcs r3, r3, r5\n\t"
  103532. #elif defined(__clang__)
  103533. "sbcs r3, r5\n\t"
  103534. #else
  103535. "sbc r3, r5\n\t"
  103536. #endif
  103537. "stm %[a]!, {r2, r3}\n\t"
  103538. "ldm %[b]!, {r4, r5}\n\t"
  103539. "ldr r2, [%[a]]\n\t"
  103540. "ldr r3, [%[a], #4]\n\t"
  103541. #ifdef WOLFSSL_KEIL
  103542. "sbcs r2, r2, r4\n\t"
  103543. #elif defined(__clang__)
  103544. "sbcs r2, r4\n\t"
  103545. #else
  103546. "sbc r2, r4\n\t"
  103547. #endif
  103548. #ifdef WOLFSSL_KEIL
  103549. "sbcs r3, r3, r5\n\t"
  103550. #elif defined(__clang__)
  103551. "sbcs r3, r5\n\t"
  103552. #else
  103553. "sbc r3, r5\n\t"
  103554. #endif
  103555. "stm %[a]!, {r2, r3}\n\t"
  103556. #ifdef WOLFSSL_KEIL
  103557. "sbcs %[a], %[a], %[a]\n\t"
  103558. #elif defined(__clang__)
  103559. "sbcs %[a], %[a]\n\t"
  103560. #else
  103561. "sbc %[a], %[a]\n\t"
  103562. #endif
  103563. : [a] "+l" (a), [b] "+l" (b)
  103564. :
  103565. : "memory", "r2", "r3", "r4", "r5"
  103566. );
  103567. return (uint32_t)(size_t)a;
  103568. }
  103569. #endif /* WOLFSSL_SP_SMALL */
  103570. /* Mul a by digit b into r. (r = a * b)
  103571. *
  103572. * r A single precision integer.
  103573. * a A single precision integer.
  103574. * b A single precision digit.
  103575. */
  103576. SP_NOINLINE static void sp_256_mul_d_8(sp_digit* r, const sp_digit* a,
  103577. sp_digit b)
  103578. {
  103579. __asm__ __volatile__ (
  103580. "movs r6, #32\n\t"
  103581. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103582. "adds r6, r6, %[a]\n\t"
  103583. #else
  103584. "add r6, r6, %[a]\n\t"
  103585. #endif
  103586. "mov r8, %[r]\n\t"
  103587. "mov r9, r6\n\t"
  103588. "movs r3, #0\n\t"
  103589. "movs r4, #0\n\t"
  103590. "\n"
  103591. "L_sp_256_mul_d_8_%=:\n\t"
  103592. "movs %[r], #0\n\t"
  103593. "movs r5, #0\n\t"
  103594. "# A[] * B\n\t"
  103595. "ldrh r6, [%[a]]\n\t"
  103596. "uxth r7, %[b]\n\t"
  103597. #ifdef WOLFSSL_KEIL
  103598. "muls r7, r6, r7\n\t"
  103599. #elif defined(__clang__)
  103600. "muls r7, r6\n\t"
  103601. #else
  103602. "mul r7, r6\n\t"
  103603. #endif
  103604. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103605. "adds r3, r3, r7\n\t"
  103606. #else
  103607. "add r3, r3, r7\n\t"
  103608. #endif
  103609. #ifdef WOLFSSL_KEIL
  103610. "adcs r4, r4, %[r]\n\t"
  103611. #elif defined(__clang__)
  103612. "adcs r4, %[r]\n\t"
  103613. #else
  103614. "adc r4, %[r]\n\t"
  103615. #endif
  103616. #ifdef WOLFSSL_KEIL
  103617. "adcs r5, r5, %[r]\n\t"
  103618. #elif defined(__clang__)
  103619. "adcs r5, %[r]\n\t"
  103620. #else
  103621. "adc r5, %[r]\n\t"
  103622. #endif
  103623. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103624. "lsrs r7, %[b], #16\n\t"
  103625. #else
  103626. "lsr r7, %[b], #16\n\t"
  103627. #endif
  103628. #ifdef WOLFSSL_KEIL
  103629. "muls r6, r7, r6\n\t"
  103630. #elif defined(__clang__)
  103631. "muls r6, r7\n\t"
  103632. #else
  103633. "mul r6, r7\n\t"
  103634. #endif
  103635. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103636. "lsrs r7, r6, #16\n\t"
  103637. #else
  103638. "lsr r7, r6, #16\n\t"
  103639. #endif
  103640. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103641. "lsls r6, r6, #16\n\t"
  103642. #else
  103643. "lsl r6, r6, #16\n\t"
  103644. #endif
  103645. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103646. "adds r3, r3, r6\n\t"
  103647. #else
  103648. "add r3, r3, r6\n\t"
  103649. #endif
  103650. #ifdef WOLFSSL_KEIL
  103651. "adcs r4, r4, r7\n\t"
  103652. #elif defined(__clang__)
  103653. "adcs r4, r7\n\t"
  103654. #else
  103655. "adc r4, r7\n\t"
  103656. #endif
  103657. #ifdef WOLFSSL_KEIL
  103658. "adcs r5, r5, %[r]\n\t"
  103659. #elif defined(__clang__)
  103660. "adcs r5, %[r]\n\t"
  103661. #else
  103662. "adc r5, %[r]\n\t"
  103663. #endif
  103664. "ldr r6, [%[a]]\n\t"
  103665. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103666. "lsrs r6, r6, #16\n\t"
  103667. #else
  103668. "lsr r6, r6, #16\n\t"
  103669. #endif
  103670. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103671. "lsrs r7, %[b], #16\n\t"
  103672. #else
  103673. "lsr r7, %[b], #16\n\t"
  103674. #endif
  103675. #ifdef WOLFSSL_KEIL
  103676. "muls r7, r6, r7\n\t"
  103677. #elif defined(__clang__)
  103678. "muls r7, r6\n\t"
  103679. #else
  103680. "mul r7, r6\n\t"
  103681. #endif
  103682. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103683. "adds r4, r4, r7\n\t"
  103684. #else
  103685. "add r4, r4, r7\n\t"
  103686. #endif
  103687. #ifdef WOLFSSL_KEIL
  103688. "adcs r5, r5, %[r]\n\t"
  103689. #elif defined(__clang__)
  103690. "adcs r5, %[r]\n\t"
  103691. #else
  103692. "adc r5, %[r]\n\t"
  103693. #endif
  103694. "uxth r7, %[b]\n\t"
  103695. #ifdef WOLFSSL_KEIL
  103696. "muls r6, r7, r6\n\t"
  103697. #elif defined(__clang__)
  103698. "muls r6, r7\n\t"
  103699. #else
  103700. "mul r6, r7\n\t"
  103701. #endif
  103702. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103703. "lsrs r7, r6, #16\n\t"
  103704. #else
  103705. "lsr r7, r6, #16\n\t"
  103706. #endif
  103707. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103708. "lsls r6, r6, #16\n\t"
  103709. #else
  103710. "lsl r6, r6, #16\n\t"
  103711. #endif
  103712. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103713. "adds r3, r3, r6\n\t"
  103714. #else
  103715. "add r3, r3, r6\n\t"
  103716. #endif
  103717. #ifdef WOLFSSL_KEIL
  103718. "adcs r4, r4, r7\n\t"
  103719. #elif defined(__clang__)
  103720. "adcs r4, r7\n\t"
  103721. #else
  103722. "adc r4, r7\n\t"
  103723. #endif
  103724. #ifdef WOLFSSL_KEIL
  103725. "adcs r5, r5, %[r]\n\t"
  103726. #elif defined(__clang__)
  103727. "adcs r5, %[r]\n\t"
  103728. #else
  103729. "adc r5, %[r]\n\t"
  103730. #endif
  103731. "# A[] * B - Done\n\t"
  103732. "mov %[r], r8\n\t"
  103733. "str r3, [%[r]]\n\t"
  103734. "movs r3, r4\n\t"
  103735. "movs r4, r5\n\t"
  103736. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103737. "adds %[r], %[r], #4\n\t"
  103738. #else
  103739. "add %[r], %[r], #4\n\t"
  103740. #endif
  103741. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103742. "adds %[a], %[a], #4\n\t"
  103743. #else
  103744. "add %[a], %[a], #4\n\t"
  103745. #endif
  103746. "mov r8, %[r]\n\t"
  103747. "cmp %[a], r9\n\t"
  103748. "blt L_sp_256_mul_d_8_%=\n\t"
  103749. "str r3, [%[r]]\n\t"
  103750. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  103751. :
  103752. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  103753. );
  103754. }
  103755. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  103756. *
  103757. * d1 The high order half of the number to divide.
  103758. * d0 The low order half of the number to divide.
  103759. * div The divisor.
  103760. * returns the result of the division.
  103761. *
  103762. * Note that this is an approximate div. It may give an answer 1 larger.
  103763. */
  103764. SP_NOINLINE static sp_digit div_256_word_8(sp_digit d1, sp_digit d0,
  103765. sp_digit div)
  103766. {
  103767. __asm__ __volatile__ (
  103768. "movs r3, #0\n\t"
  103769. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103770. "lsrs r5, %[div], #1\n\t"
  103771. #else
  103772. "lsr r5, %[div], #1\n\t"
  103773. #endif
  103774. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103775. "adds r5, r5, #1\n\t"
  103776. #else
  103777. "add r5, r5, #1\n\t"
  103778. #endif
  103779. "mov r8, %[d0]\n\t"
  103780. "mov r9, %[d1]\n\t"
  103781. "# Do top 32\n\t"
  103782. "movs r6, r5\n\t"
  103783. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103784. "subs r6, r6, %[d1]\n\t"
  103785. #else
  103786. "sub r6, r6, %[d1]\n\t"
  103787. #endif
  103788. #ifdef WOLFSSL_KEIL
  103789. "sbcs r6, r6, r6\n\t"
  103790. #elif defined(__clang__)
  103791. "sbcs r6, r6\n\t"
  103792. #else
  103793. "sbc r6, r6\n\t"
  103794. #endif
  103795. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103796. "adds r3, r3, r3\n\t"
  103797. #else
  103798. "add r3, r3, r3\n\t"
  103799. #endif
  103800. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103801. "subs r3, r3, r6\n\t"
  103802. #else
  103803. "sub r3, r3, r6\n\t"
  103804. #endif
  103805. #ifdef WOLFSSL_KEIL
  103806. "ands r6, r6, r5\n\t"
  103807. #elif defined(__clang__)
  103808. "ands r6, r5\n\t"
  103809. #else
  103810. "and r6, r5\n\t"
  103811. #endif
  103812. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103813. "subs %[d1], %[d1], r6\n\t"
  103814. #else
  103815. "sub %[d1], %[d1], r6\n\t"
  103816. #endif
  103817. "movs r4, #29\n\t"
  103818. "\n"
  103819. "L_div_256_word_8_loop_%=:\n\t"
  103820. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103821. "lsls %[d0], %[d0], #1\n\t"
  103822. #else
  103823. "lsl %[d0], %[d0], #1\n\t"
  103824. #endif
  103825. #ifdef WOLFSSL_KEIL
  103826. "adcs %[d1], %[d1], %[d1]\n\t"
  103827. #elif defined(__clang__)
  103828. "adcs %[d1], %[d1]\n\t"
  103829. #else
  103830. "adc %[d1], %[d1]\n\t"
  103831. #endif
  103832. "movs r6, r5\n\t"
  103833. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103834. "subs r6, r6, %[d1]\n\t"
  103835. #else
  103836. "sub r6, r6, %[d1]\n\t"
  103837. #endif
  103838. #ifdef WOLFSSL_KEIL
  103839. "sbcs r6, r6, r6\n\t"
  103840. #elif defined(__clang__)
  103841. "sbcs r6, r6\n\t"
  103842. #else
  103843. "sbc r6, r6\n\t"
  103844. #endif
  103845. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103846. "adds r3, r3, r3\n\t"
  103847. #else
  103848. "add r3, r3, r3\n\t"
  103849. #endif
  103850. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103851. "subs r3, r3, r6\n\t"
  103852. #else
  103853. "sub r3, r3, r6\n\t"
  103854. #endif
  103855. #ifdef WOLFSSL_KEIL
  103856. "ands r6, r6, r5\n\t"
  103857. #elif defined(__clang__)
  103858. "ands r6, r5\n\t"
  103859. #else
  103860. "and r6, r5\n\t"
  103861. #endif
  103862. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103863. "subs %[d1], %[d1], r6\n\t"
  103864. #else
  103865. "sub %[d1], %[d1], r6\n\t"
  103866. #endif
  103867. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103868. "subs r4, r4, #1\n\t"
  103869. #else
  103870. "sub r4, r4, #1\n\t"
  103871. #endif
  103872. "bpl L_div_256_word_8_loop_%=\n\t"
  103873. "movs r7, #0\n\t"
  103874. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103875. "adds r3, r3, r3\n\t"
  103876. #else
  103877. "add r3, r3, r3\n\t"
  103878. #endif
  103879. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103880. "adds r3, r3, #1\n\t"
  103881. #else
  103882. "add r3, r3, #1\n\t"
  103883. #endif
  103884. "# r * div - Start\n\t"
  103885. "uxth %[d1], r3\n\t"
  103886. "uxth r4, %[div]\n\t"
  103887. #ifdef WOLFSSL_KEIL
  103888. "muls r4, %[d1], r4\n\t"
  103889. #elif defined(__clang__)
  103890. "muls r4, %[d1]\n\t"
  103891. #else
  103892. "mul r4, %[d1]\n\t"
  103893. #endif
  103894. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103895. "lsrs r6, %[div], #16\n\t"
  103896. #else
  103897. "lsr r6, %[div], #16\n\t"
  103898. #endif
  103899. #ifdef WOLFSSL_KEIL
  103900. "muls %[d1], r6, %[d1]\n\t"
  103901. #elif defined(__clang__)
  103902. "muls %[d1], r6\n\t"
  103903. #else
  103904. "mul %[d1], r6\n\t"
  103905. #endif
  103906. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103907. "lsrs r5, %[d1], #16\n\t"
  103908. #else
  103909. "lsr r5, %[d1], #16\n\t"
  103910. #endif
  103911. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103912. "lsls %[d1], %[d1], #16\n\t"
  103913. #else
  103914. "lsl %[d1], %[d1], #16\n\t"
  103915. #endif
  103916. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103917. "adds r4, r4, %[d1]\n\t"
  103918. #else
  103919. "add r4, r4, %[d1]\n\t"
  103920. #endif
  103921. #ifdef WOLFSSL_KEIL
  103922. "adcs r5, r5, r7\n\t"
  103923. #elif defined(__clang__)
  103924. "adcs r5, r7\n\t"
  103925. #else
  103926. "adc r5, r7\n\t"
  103927. #endif
  103928. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103929. "lsrs %[d1], r3, #16\n\t"
  103930. #else
  103931. "lsr %[d1], r3, #16\n\t"
  103932. #endif
  103933. #ifdef WOLFSSL_KEIL
  103934. "muls r6, %[d1], r6\n\t"
  103935. #elif defined(__clang__)
  103936. "muls r6, %[d1]\n\t"
  103937. #else
  103938. "mul r6, %[d1]\n\t"
  103939. #endif
  103940. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103941. "adds r5, r5, r6\n\t"
  103942. #else
  103943. "add r5, r5, r6\n\t"
  103944. #endif
  103945. "uxth r6, %[div]\n\t"
  103946. #ifdef WOLFSSL_KEIL
  103947. "muls %[d1], r6, %[d1]\n\t"
  103948. #elif defined(__clang__)
  103949. "muls %[d1], r6\n\t"
  103950. #else
  103951. "mul %[d1], r6\n\t"
  103952. #endif
  103953. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103954. "lsrs r6, %[d1], #16\n\t"
  103955. #else
  103956. "lsr r6, %[d1], #16\n\t"
  103957. #endif
  103958. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103959. "lsls %[d1], %[d1], #16\n\t"
  103960. #else
  103961. "lsl %[d1], %[d1], #16\n\t"
  103962. #endif
  103963. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103964. "adds r4, r4, %[d1]\n\t"
  103965. #else
  103966. "add r4, r4, %[d1]\n\t"
  103967. #endif
  103968. #ifdef WOLFSSL_KEIL
  103969. "adcs r5, r5, r6\n\t"
  103970. #elif defined(__clang__)
  103971. "adcs r5, r6\n\t"
  103972. #else
  103973. "adc r5, r6\n\t"
  103974. #endif
  103975. "# r * div - Done\n\t"
  103976. "mov %[d1], r8\n\t"
  103977. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103978. "subs %[d1], %[d1], r4\n\t"
  103979. #else
  103980. "sub %[d1], %[d1], r4\n\t"
  103981. #endif
  103982. "movs r4, %[d1]\n\t"
  103983. "mov %[d1], r9\n\t"
  103984. #ifdef WOLFSSL_KEIL
  103985. "sbcs %[d1], %[d1], r5\n\t"
  103986. #elif defined(__clang__)
  103987. "sbcs %[d1], r5\n\t"
  103988. #else
  103989. "sbc %[d1], r5\n\t"
  103990. #endif
  103991. "movs r5, %[d1]\n\t"
  103992. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103993. "adds r3, r3, r5\n\t"
  103994. #else
  103995. "add r3, r3, r5\n\t"
  103996. #endif
  103997. "# r * div - Start\n\t"
  103998. "uxth %[d1], r3\n\t"
  103999. "uxth r4, %[div]\n\t"
  104000. #ifdef WOLFSSL_KEIL
  104001. "muls r4, %[d1], r4\n\t"
  104002. #elif defined(__clang__)
  104003. "muls r4, %[d1]\n\t"
  104004. #else
  104005. "mul r4, %[d1]\n\t"
  104006. #endif
  104007. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104008. "lsrs r6, %[div], #16\n\t"
  104009. #else
  104010. "lsr r6, %[div], #16\n\t"
  104011. #endif
  104012. #ifdef WOLFSSL_KEIL
  104013. "muls %[d1], r6, %[d1]\n\t"
  104014. #elif defined(__clang__)
  104015. "muls %[d1], r6\n\t"
  104016. #else
  104017. "mul %[d1], r6\n\t"
  104018. #endif
  104019. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104020. "lsrs r5, %[d1], #16\n\t"
  104021. #else
  104022. "lsr r5, %[d1], #16\n\t"
  104023. #endif
  104024. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104025. "lsls %[d1], %[d1], #16\n\t"
  104026. #else
  104027. "lsl %[d1], %[d1], #16\n\t"
  104028. #endif
  104029. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104030. "adds r4, r4, %[d1]\n\t"
  104031. #else
  104032. "add r4, r4, %[d1]\n\t"
  104033. #endif
  104034. #ifdef WOLFSSL_KEIL
  104035. "adcs r5, r5, r7\n\t"
  104036. #elif defined(__clang__)
  104037. "adcs r5, r7\n\t"
  104038. #else
  104039. "adc r5, r7\n\t"
  104040. #endif
  104041. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104042. "lsrs %[d1], r3, #16\n\t"
  104043. #else
  104044. "lsr %[d1], r3, #16\n\t"
  104045. #endif
  104046. #ifdef WOLFSSL_KEIL
  104047. "muls r6, %[d1], r6\n\t"
  104048. #elif defined(__clang__)
  104049. "muls r6, %[d1]\n\t"
  104050. #else
  104051. "mul r6, %[d1]\n\t"
  104052. #endif
  104053. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104054. "adds r5, r5, r6\n\t"
  104055. #else
  104056. "add r5, r5, r6\n\t"
  104057. #endif
  104058. "uxth r6, %[div]\n\t"
  104059. #ifdef WOLFSSL_KEIL
  104060. "muls %[d1], r6, %[d1]\n\t"
  104061. #elif defined(__clang__)
  104062. "muls %[d1], r6\n\t"
  104063. #else
  104064. "mul %[d1], r6\n\t"
  104065. #endif
  104066. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104067. "lsrs r6, %[d1], #16\n\t"
  104068. #else
  104069. "lsr r6, %[d1], #16\n\t"
  104070. #endif
  104071. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104072. "lsls %[d1], %[d1], #16\n\t"
  104073. #else
  104074. "lsl %[d1], %[d1], #16\n\t"
  104075. #endif
  104076. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104077. "adds r4, r4, %[d1]\n\t"
  104078. #else
  104079. "add r4, r4, %[d1]\n\t"
  104080. #endif
  104081. #ifdef WOLFSSL_KEIL
  104082. "adcs r5, r5, r6\n\t"
  104083. #elif defined(__clang__)
  104084. "adcs r5, r6\n\t"
  104085. #else
  104086. "adc r5, r6\n\t"
  104087. #endif
  104088. "# r * div - Done\n\t"
  104089. "mov %[d1], r8\n\t"
  104090. "mov r6, r9\n\t"
  104091. #ifdef WOLFSSL_KEIL
  104092. "subs r4, %[d1], r4\n\t"
  104093. #else
  104094. #ifdef __clang__
  104095. "subs r4, %[d1], r4\n\t"
  104096. #else
  104097. "sub r4, %[d1], r4\n\t"
  104098. #endif
  104099. #endif
  104100. #ifdef WOLFSSL_KEIL
  104101. "sbcs r6, r6, r5\n\t"
  104102. #elif defined(__clang__)
  104103. "sbcs r6, r5\n\t"
  104104. #else
  104105. "sbc r6, r5\n\t"
  104106. #endif
  104107. "movs r5, r6\n\t"
  104108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104109. "adds r3, r3, r5\n\t"
  104110. #else
  104111. "add r3, r3, r5\n\t"
  104112. #endif
  104113. "# r * div - Start\n\t"
  104114. "uxth %[d1], r3\n\t"
  104115. "uxth r4, %[div]\n\t"
  104116. #ifdef WOLFSSL_KEIL
  104117. "muls r4, %[d1], r4\n\t"
  104118. #elif defined(__clang__)
  104119. "muls r4, %[d1]\n\t"
  104120. #else
  104121. "mul r4, %[d1]\n\t"
  104122. #endif
  104123. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104124. "lsrs r6, %[div], #16\n\t"
  104125. #else
  104126. "lsr r6, %[div], #16\n\t"
  104127. #endif
  104128. #ifdef WOLFSSL_KEIL
  104129. "muls %[d1], r6, %[d1]\n\t"
  104130. #elif defined(__clang__)
  104131. "muls %[d1], r6\n\t"
  104132. #else
  104133. "mul %[d1], r6\n\t"
  104134. #endif
  104135. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104136. "lsrs r5, %[d1], #16\n\t"
  104137. #else
  104138. "lsr r5, %[d1], #16\n\t"
  104139. #endif
  104140. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104141. "lsls %[d1], %[d1], #16\n\t"
  104142. #else
  104143. "lsl %[d1], %[d1], #16\n\t"
  104144. #endif
  104145. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104146. "adds r4, r4, %[d1]\n\t"
  104147. #else
  104148. "add r4, r4, %[d1]\n\t"
  104149. #endif
  104150. #ifdef WOLFSSL_KEIL
  104151. "adcs r5, r5, r7\n\t"
  104152. #elif defined(__clang__)
  104153. "adcs r5, r7\n\t"
  104154. #else
  104155. "adc r5, r7\n\t"
  104156. #endif
  104157. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104158. "lsrs %[d1], r3, #16\n\t"
  104159. #else
  104160. "lsr %[d1], r3, #16\n\t"
  104161. #endif
  104162. #ifdef WOLFSSL_KEIL
  104163. "muls r6, %[d1], r6\n\t"
  104164. #elif defined(__clang__)
  104165. "muls r6, %[d1]\n\t"
  104166. #else
  104167. "mul r6, %[d1]\n\t"
  104168. #endif
  104169. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104170. "adds r5, r5, r6\n\t"
  104171. #else
  104172. "add r5, r5, r6\n\t"
  104173. #endif
  104174. "uxth r6, %[div]\n\t"
  104175. #ifdef WOLFSSL_KEIL
  104176. "muls %[d1], r6, %[d1]\n\t"
  104177. #elif defined(__clang__)
  104178. "muls %[d1], r6\n\t"
  104179. #else
  104180. "mul %[d1], r6\n\t"
  104181. #endif
  104182. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104183. "lsrs r6, %[d1], #16\n\t"
  104184. #else
  104185. "lsr r6, %[d1], #16\n\t"
  104186. #endif
  104187. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104188. "lsls %[d1], %[d1], #16\n\t"
  104189. #else
  104190. "lsl %[d1], %[d1], #16\n\t"
  104191. #endif
  104192. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104193. "adds r4, r4, %[d1]\n\t"
  104194. #else
  104195. "add r4, r4, %[d1]\n\t"
  104196. #endif
  104197. #ifdef WOLFSSL_KEIL
  104198. "adcs r5, r5, r6\n\t"
  104199. #elif defined(__clang__)
  104200. "adcs r5, r6\n\t"
  104201. #else
  104202. "adc r5, r6\n\t"
  104203. #endif
  104204. "# r * div - Done\n\t"
  104205. "mov %[d1], r8\n\t"
  104206. "mov r6, r9\n\t"
  104207. #ifdef WOLFSSL_KEIL
  104208. "subs r4, %[d1], r4\n\t"
  104209. #else
  104210. #ifdef __clang__
  104211. "subs r4, %[d1], r4\n\t"
  104212. #else
  104213. "sub r4, %[d1], r4\n\t"
  104214. #endif
  104215. #endif
  104216. #ifdef WOLFSSL_KEIL
  104217. "sbcs r6, r6, r5\n\t"
  104218. #elif defined(__clang__)
  104219. "sbcs r6, r5\n\t"
  104220. #else
  104221. "sbc r6, r5\n\t"
  104222. #endif
  104223. "movs r5, r6\n\t"
  104224. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104225. "adds r3, r3, r5\n\t"
  104226. #else
  104227. "add r3, r3, r5\n\t"
  104228. #endif
  104229. "# r * div - Start\n\t"
  104230. "uxth %[d1], r3\n\t"
  104231. "uxth r4, %[div]\n\t"
  104232. #ifdef WOLFSSL_KEIL
  104233. "muls r4, %[d1], r4\n\t"
  104234. #elif defined(__clang__)
  104235. "muls r4, %[d1]\n\t"
  104236. #else
  104237. "mul r4, %[d1]\n\t"
  104238. #endif
  104239. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104240. "lsrs r6, %[div], #16\n\t"
  104241. #else
  104242. "lsr r6, %[div], #16\n\t"
  104243. #endif
  104244. #ifdef WOLFSSL_KEIL
  104245. "muls %[d1], r6, %[d1]\n\t"
  104246. #elif defined(__clang__)
  104247. "muls %[d1], r6\n\t"
  104248. #else
  104249. "mul %[d1], r6\n\t"
  104250. #endif
  104251. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104252. "lsrs r5, %[d1], #16\n\t"
  104253. #else
  104254. "lsr r5, %[d1], #16\n\t"
  104255. #endif
  104256. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104257. "lsls %[d1], %[d1], #16\n\t"
  104258. #else
  104259. "lsl %[d1], %[d1], #16\n\t"
  104260. #endif
  104261. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104262. "adds r4, r4, %[d1]\n\t"
  104263. #else
  104264. "add r4, r4, %[d1]\n\t"
  104265. #endif
  104266. #ifdef WOLFSSL_KEIL
  104267. "adcs r5, r5, r7\n\t"
  104268. #elif defined(__clang__)
  104269. "adcs r5, r7\n\t"
  104270. #else
  104271. "adc r5, r7\n\t"
  104272. #endif
  104273. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104274. "lsrs %[d1], r3, #16\n\t"
  104275. #else
  104276. "lsr %[d1], r3, #16\n\t"
  104277. #endif
  104278. #ifdef WOLFSSL_KEIL
  104279. "muls r6, %[d1], r6\n\t"
  104280. #elif defined(__clang__)
  104281. "muls r6, %[d1]\n\t"
  104282. #else
  104283. "mul r6, %[d1]\n\t"
  104284. #endif
  104285. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104286. "adds r5, r5, r6\n\t"
  104287. #else
  104288. "add r5, r5, r6\n\t"
  104289. #endif
  104290. "uxth r6, %[div]\n\t"
  104291. #ifdef WOLFSSL_KEIL
  104292. "muls %[d1], r6, %[d1]\n\t"
  104293. #elif defined(__clang__)
  104294. "muls %[d1], r6\n\t"
  104295. #else
  104296. "mul %[d1], r6\n\t"
  104297. #endif
  104298. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104299. "lsrs r6, %[d1], #16\n\t"
  104300. #else
  104301. "lsr r6, %[d1], #16\n\t"
  104302. #endif
  104303. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104304. "lsls %[d1], %[d1], #16\n\t"
  104305. #else
  104306. "lsl %[d1], %[d1], #16\n\t"
  104307. #endif
  104308. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104309. "adds r4, r4, %[d1]\n\t"
  104310. #else
  104311. "add r4, r4, %[d1]\n\t"
  104312. #endif
  104313. #ifdef WOLFSSL_KEIL
  104314. "adcs r5, r5, r6\n\t"
  104315. #elif defined(__clang__)
  104316. "adcs r5, r6\n\t"
  104317. #else
  104318. "adc r5, r6\n\t"
  104319. #endif
  104320. "# r * div - Done\n\t"
  104321. "mov %[d1], r8\n\t"
  104322. "mov r6, r9\n\t"
  104323. #ifdef WOLFSSL_KEIL
  104324. "subs r4, %[d1], r4\n\t"
  104325. #else
  104326. #ifdef __clang__
  104327. "subs r4, %[d1], r4\n\t"
  104328. #else
  104329. "sub r4, %[d1], r4\n\t"
  104330. #endif
  104331. #endif
  104332. #ifdef WOLFSSL_KEIL
  104333. "sbcs r6, r6, r5\n\t"
  104334. #elif defined(__clang__)
  104335. "sbcs r6, r5\n\t"
  104336. #else
  104337. "sbc r6, r5\n\t"
  104338. #endif
  104339. "movs r5, r6\n\t"
  104340. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104341. "adds r3, r3, r5\n\t"
  104342. #else
  104343. "add r3, r3, r5\n\t"
  104344. #endif
  104345. "movs r6, %[div]\n\t"
  104346. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104347. "subs r6, r6, r4\n\t"
  104348. #else
  104349. "sub r6, r6, r4\n\t"
  104350. #endif
  104351. #ifdef WOLFSSL_KEIL
  104352. "sbcs r6, r6, r6\n\t"
  104353. #elif defined(__clang__)
  104354. "sbcs r6, r6\n\t"
  104355. #else
  104356. "sbc r6, r6\n\t"
  104357. #endif
  104358. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104359. "subs r3, r3, r6\n\t"
  104360. #else
  104361. "sub r3, r3, r6\n\t"
  104362. #endif
  104363. "movs %[d1], r3\n\t"
  104364. : [d1] "+l" (d1), [d0] "+l" (d0), [div] "+l" (div)
  104365. :
  104366. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  104367. );
  104368. return (uint32_t)(size_t)d1;
  104369. }
  104370. /* AND m into each word of a and store in r.
  104371. *
  104372. * r A single precision integer.
  104373. * a A single precision integer.
  104374. * m Mask to AND against each digit.
  104375. */
  104376. static void sp_256_mask_8(sp_digit* r, const sp_digit* a, sp_digit m)
  104377. {
  104378. #ifdef WOLFSSL_SP_SMALL
  104379. int i;
  104380. for (i=0; i<8; i++) {
  104381. r[i] = a[i] & m;
  104382. }
  104383. #else
  104384. r[0] = a[0] & m;
  104385. r[1] = a[1] & m;
  104386. r[2] = a[2] & m;
  104387. r[3] = a[3] & m;
  104388. r[4] = a[4] & m;
  104389. r[5] = a[5] & m;
  104390. r[6] = a[6] & m;
  104391. r[7] = a[7] & m;
  104392. #endif
  104393. }
  104394. /* Divide d in a and put remainder into r (m*d + r = a)
  104395. * m is not calculated as it is not needed at this time.
  104396. *
  104397. * a Number to be divided.
  104398. * d Number to divide with.
  104399. * m Multiplier result.
  104400. * r Remainder from the division.
  104401. * returns MP_OKAY indicating success.
  104402. */
  104403. static WC_INLINE int sp_256_div_8(const sp_digit* a, const sp_digit* d, sp_digit* m,
  104404. sp_digit* r)
  104405. {
  104406. sp_digit t1[16], t2[9];
  104407. sp_digit div, r1;
  104408. int i;
  104409. (void)m;
  104410. div = d[7];
  104411. XMEMCPY(t1, a, sizeof(*t1) * 2 * 8);
  104412. r1 = sp_256_cmp_8(&t1[8], d) >= 0;
  104413. sp_256_cond_sub_8(&t1[8], &t1[8], d, (sp_digit)0 - r1);
  104414. for (i = 7; i >= 0; i--) {
  104415. volatile sp_digit mask = (sp_digit)0 - (t1[8 + i] == div);
  104416. sp_digit hi = t1[8 + i] + mask;
  104417. r1 = div_256_word_8(hi, t1[8 + i - 1], div);
  104418. r1 |= mask;
  104419. sp_256_mul_d_8(t2, d, r1);
  104420. t1[8 + i] += sp_256_sub_in_place_8(&t1[i], t2);
  104421. t1[8 + i] -= t2[8];
  104422. sp_256_mask_8(t2, d, t1[8 + i]);
  104423. t1[8 + i] += sp_256_add_8(&t1[i], &t1[i], t2);
  104424. sp_256_mask_8(t2, d, t1[8 + i]);
  104425. t1[8 + i] += sp_256_add_8(&t1[i], &t1[i], t2);
  104426. }
  104427. r1 = sp_256_cmp_8(t1, d) >= 0;
  104428. sp_256_cond_sub_8(r, t1, d, (sp_digit)0 - r1);
  104429. return MP_OKAY;
  104430. }
  104431. /* Reduce a modulo m into r. (r = a mod m)
  104432. *
  104433. * r A single precision number that is the reduced result.
  104434. * a A single precision number that is to be reduced.
  104435. * m A single precision number that is the modulus to reduce with.
  104436. * returns MP_OKAY indicating success.
  104437. */
  104438. static WC_INLINE int sp_256_mod_8(sp_digit* r, const sp_digit* a, const sp_digit* m)
  104439. {
  104440. int ret;
  104441. ret = sp_256_div_8(a, m, NULL, r);
  104442. return ret;
  104443. }
  104444. #endif
  104445. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  104446. /* Multiply two number mod the order of P256 curve. (r = a * b mod order)
  104447. *
  104448. * r Result of the multiplication.
  104449. * a First operand of the multiplication.
  104450. * b Second operand of the multiplication.
  104451. */
  104452. static void sp_256_mont_mul_order_8(sp_digit* r, const sp_digit* a, const sp_digit* b)
  104453. {
  104454. sp_256_mul_8(r, a, b);
  104455. sp_256_mont_reduce_order_8(r, p256_order, p256_mp_order);
  104456. }
  104457. #if defined(HAVE_ECC_SIGN) || (defined(HAVE_ECC_VERIFY) && defined(WOLFSSL_SP_SMALL))
  104458. #ifdef WOLFSSL_SP_SMALL
  104459. /* Order-2 for the P256 curve. */
  104460. static const uint32_t p256_order_minus_2[8] = {
  104461. 0xfc63254fU,0xf3b9cac2U,0xa7179e84U,0xbce6faadU,0xffffffffU,0xffffffffU,
  104462. 0x00000000U,0xffffffffU
  104463. };
  104464. #else
  104465. /* The low half of the order-2 of the P256 curve. */
  104466. static const sp_int_digit p256_order_low[4] = {
  104467. 0xfc63254fU,0xf3b9cac2U,0xa7179e84U,0xbce6faadU
  104468. };
  104469. #endif /* WOLFSSL_SP_SMALL */
  104470. /* Square number mod the order of P256 curve. (r = a * a mod order)
  104471. *
  104472. * r Result of the squaring.
  104473. * a Number to square.
  104474. */
  104475. static void sp_256_mont_sqr_order_8(sp_digit* r, const sp_digit* a)
  104476. {
  104477. sp_256_sqr_8(r, a);
  104478. sp_256_mont_reduce_order_8(r, p256_order, p256_mp_order);
  104479. }
  104480. #ifndef WOLFSSL_SP_SMALL
  104481. /* Square number mod the order of P256 curve a number of times.
  104482. * (r = a ^ n mod order)
  104483. *
  104484. * r Result of the squaring.
  104485. * a Number to square.
  104486. */
  104487. static void sp_256_mont_sqr_n_order_8(sp_digit* r, const sp_digit* a, int n)
  104488. {
  104489. int i;
  104490. sp_256_mont_sqr_order_8(r, a);
  104491. for (i=1; i<n; i++) {
  104492. sp_256_mont_sqr_order_8(r, r);
  104493. }
  104494. }
  104495. #endif /* !WOLFSSL_SP_SMALL */
  104496. /* Invert the number, in Montgomery form, modulo the order of the P256 curve.
  104497. * (r = 1 / a mod order)
  104498. *
  104499. * r Inverse result.
  104500. * a Number to invert.
  104501. * td Temporary data.
  104502. */
  104503. #ifdef WOLFSSL_SP_NONBLOCK
  104504. typedef struct sp_256_mont_inv_order_8_ctx {
  104505. int state;
  104506. int i;
  104507. } sp_256_mont_inv_order_8_ctx;
  104508. static int sp_256_mont_inv_order_8_nb(sp_ecc_ctx_t* sp_ctx, sp_digit* r, const sp_digit* a,
  104509. sp_digit* t)
  104510. {
  104511. int err = FP_WOULDBLOCK;
  104512. sp_256_mont_inv_order_8_ctx* ctx = (sp_256_mont_inv_order_8_ctx*)sp_ctx;
  104513. typedef char ctx_size_test[sizeof(sp_256_mont_inv_order_8_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  104514. (void)sizeof(ctx_size_test);
  104515. switch (ctx->state) {
  104516. case 0:
  104517. XMEMCPY(t, a, sizeof(sp_digit) * 8);
  104518. ctx->i = 254;
  104519. ctx->state = 1;
  104520. break;
  104521. case 1:
  104522. sp_256_mont_sqr_order_8(t, t);
  104523. ctx->state = 2;
  104524. break;
  104525. case 2:
  104526. if ((p256_order_minus_2[ctx->i / 32] & ((sp_int_digit)1 << (ctx->i % 32))) != 0) {
  104527. sp_256_mont_mul_order_8(t, t, a);
  104528. }
  104529. ctx->i--;
  104530. ctx->state = (ctx->i == 0) ? 3 : 1;
  104531. break;
  104532. case 3:
  104533. XMEMCPY(r, t, sizeof(sp_digit) * 8U);
  104534. err = MP_OKAY;
  104535. break;
  104536. }
  104537. return err;
  104538. }
  104539. #endif /* WOLFSSL_SP_NONBLOCK */
  104540. static void sp_256_mont_inv_order_8(sp_digit* r, const sp_digit* a,
  104541. sp_digit* td)
  104542. {
  104543. #ifdef WOLFSSL_SP_SMALL
  104544. sp_digit* t = td;
  104545. int i;
  104546. XMEMCPY(t, a, sizeof(sp_digit) * 8);
  104547. for (i=254; i>=0; i--) {
  104548. sp_256_mont_sqr_order_8(t, t);
  104549. if ((p256_order_minus_2[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
  104550. sp_256_mont_mul_order_8(t, t, a);
  104551. }
  104552. }
  104553. XMEMCPY(r, t, sizeof(sp_digit) * 8U);
  104554. #else
  104555. sp_digit* t = td;
  104556. sp_digit* t2 = td + 2 * 8;
  104557. sp_digit* t3 = td + 4 * 8;
  104558. int i;
  104559. /* t = a^2 */
  104560. sp_256_mont_sqr_order_8(t, a);
  104561. /* t = a^3 = t * a */
  104562. sp_256_mont_mul_order_8(t, t, a);
  104563. /* t2= a^c = t ^ 2 ^ 2 */
  104564. sp_256_mont_sqr_n_order_8(t2, t, 2);
  104565. /* t3= a^f = t2 * t */
  104566. sp_256_mont_mul_order_8(t3, t2, t);
  104567. /* t2= a^f0 = t3 ^ 2 ^ 4 */
  104568. sp_256_mont_sqr_n_order_8(t2, t3, 4);
  104569. /* t = a^ff = t2 * t3 */
  104570. sp_256_mont_mul_order_8(t, t2, t3);
  104571. /* t3= a^ff00 = t ^ 2 ^ 8 */
  104572. sp_256_mont_sqr_n_order_8(t2, t, 8);
  104573. /* t = a^ffff = t2 * t */
  104574. sp_256_mont_mul_order_8(t, t2, t);
  104575. /* t2= a^ffff0000 = t ^ 2 ^ 16 */
  104576. sp_256_mont_sqr_n_order_8(t2, t, 16);
  104577. /* t = a^ffffffff = t2 * t */
  104578. sp_256_mont_mul_order_8(t, t2, t);
  104579. /* t2= a^ffffffff0000000000000000 = t ^ 2 ^ 64 */
  104580. sp_256_mont_sqr_n_order_8(t2, t, 64);
  104581. /* t2= a^ffffffff00000000ffffffff = t2 * t */
  104582. sp_256_mont_mul_order_8(t2, t2, t);
  104583. /* t2= a^ffffffff00000000ffffffff00000000 = t2 ^ 2 ^ 32 */
  104584. sp_256_mont_sqr_n_order_8(t2, t2, 32);
  104585. /* t2= a^ffffffff00000000ffffffffffffffff = t2 * t */
  104586. sp_256_mont_mul_order_8(t2, t2, t);
  104587. /* t2= a^ffffffff00000000ffffffffffffffffbce6 */
  104588. for (i=127; i>=112; i--) {
  104589. sp_256_mont_sqr_order_8(t2, t2);
  104590. if ((p256_order_low[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
  104591. sp_256_mont_mul_order_8(t2, t2, a);
  104592. }
  104593. }
  104594. /* t2= a^ffffffff00000000ffffffffffffffffbce6f */
  104595. sp_256_mont_sqr_n_order_8(t2, t2, 4);
  104596. sp_256_mont_mul_order_8(t2, t2, t3);
  104597. /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84 */
  104598. for (i=107; i>=64; i--) {
  104599. sp_256_mont_sqr_order_8(t2, t2);
  104600. if ((p256_order_low[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
  104601. sp_256_mont_mul_order_8(t2, t2, a);
  104602. }
  104603. }
  104604. /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f */
  104605. sp_256_mont_sqr_n_order_8(t2, t2, 4);
  104606. sp_256_mont_mul_order_8(t2, t2, t3);
  104607. /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2 */
  104608. for (i=59; i>=32; i--) {
  104609. sp_256_mont_sqr_order_8(t2, t2);
  104610. if ((p256_order_low[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
  104611. sp_256_mont_mul_order_8(t2, t2, a);
  104612. }
  104613. }
  104614. /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2f */
  104615. sp_256_mont_sqr_n_order_8(t2, t2, 4);
  104616. sp_256_mont_mul_order_8(t2, t2, t3);
  104617. /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254 */
  104618. for (i=27; i>=0; i--) {
  104619. sp_256_mont_sqr_order_8(t2, t2);
  104620. if ((p256_order_low[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
  104621. sp_256_mont_mul_order_8(t2, t2, a);
  104622. }
  104623. }
  104624. /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632540 */
  104625. sp_256_mont_sqr_n_order_8(t2, t2, 4);
  104626. /* r = a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f */
  104627. sp_256_mont_mul_order_8(r, t2, t3);
  104628. #endif /* WOLFSSL_SP_SMALL */
  104629. }
  104630. #endif /* HAVE_ECC_SIGN || (HAVE_ECC_VERIFY && WOLFSSL_SP_SMALL) */
  104631. #endif /* HAVE_ECC_SIGN | HAVE_ECC_VERIFY */
  104632. #ifdef HAVE_ECC_SIGN
  104633. #ifndef SP_ECC_MAX_SIG_GEN
  104634. #define SP_ECC_MAX_SIG_GEN 64
  104635. #endif
  104636. /* Calculate second signature value S from R, k and private value.
  104637. *
  104638. * s = (r * x + e) / k
  104639. *
  104640. * s Signature value.
  104641. * r First signature value.
  104642. * k Ephemeral private key.
  104643. * x Private key as a number.
  104644. * e Hash of message as a number.
  104645. * tmp Temporary storage for intermediate numbers.
  104646. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  104647. */
  104648. static int sp_256_calc_s_8(sp_digit* s, const sp_digit* r, sp_digit* k,
  104649. sp_digit* x, const sp_digit* e, sp_digit* tmp)
  104650. {
  104651. int err;
  104652. sp_digit carry;
  104653. sp_int32 c;
  104654. sp_digit* kInv = k;
  104655. /* Conv k to Montgomery form (mod order) */
  104656. sp_256_mul_8(k, k, p256_norm_order);
  104657. err = sp_256_mod_8(k, k, p256_order);
  104658. if (err == MP_OKAY) {
  104659. sp_256_norm_8(k);
  104660. /* kInv = 1/k mod order */
  104661. sp_256_mont_inv_order_8(kInv, k, tmp);
  104662. sp_256_norm_8(kInv);
  104663. /* s = r * x + e */
  104664. sp_256_mul_8(x, x, r);
  104665. err = sp_256_mod_8(x, x, p256_order);
  104666. }
  104667. if (err == MP_OKAY) {
  104668. sp_256_norm_8(x);
  104669. carry = sp_256_add_8(s, e, x);
  104670. sp_256_cond_sub_8(s, s, p256_order, 0 - carry);
  104671. sp_256_norm_8(s);
  104672. c = sp_256_cmp_8(s, p256_order);
  104673. sp_256_cond_sub_8(s, s, p256_order,
  104674. (sp_digit)0 - (sp_digit)(c >= 0));
  104675. sp_256_norm_8(s);
  104676. /* s = s * k^-1 mod order */
  104677. sp_256_mont_mul_order_8(s, s, kInv);
  104678. sp_256_norm_8(s);
  104679. }
  104680. return err;
  104681. }
  104682. /* Sign the hash using the private key.
  104683. * e = [hash, 256 bits] from binary
  104684. * r = (k.G)->x mod order
  104685. * s = (r * x + e) / k mod order
  104686. * The hash is truncated to the first 256 bits.
  104687. *
  104688. * hash Hash to sign.
  104689. * hashLen Length of the hash data.
  104690. * rng Random number generator.
  104691. * priv Private part of key - scalar.
  104692. * rm First part of result as an mp_int.
  104693. * sm Sirst part of result as an mp_int.
  104694. * heap Heap to use for allocation.
  104695. * returns RNG failures, MEMORY_E when memory allocation fails and
  104696. * MP_OKAY on success.
  104697. */
  104698. int sp_ecc_sign_256(const byte* hash, word32 hashLen, WC_RNG* rng,
  104699. const mp_int* priv, mp_int* rm, mp_int* sm, mp_int* km, void* heap)
  104700. {
  104701. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  104702. sp_digit* e = NULL;
  104703. sp_point_256* point = NULL;
  104704. #else
  104705. sp_digit e[7 * 2 * 8];
  104706. sp_point_256 point[1];
  104707. #endif
  104708. sp_digit* x = NULL;
  104709. sp_digit* k = NULL;
  104710. sp_digit* r = NULL;
  104711. sp_digit* tmp = NULL;
  104712. sp_digit* s = NULL;
  104713. sp_int32 c;
  104714. int err = MP_OKAY;
  104715. int i;
  104716. (void)heap;
  104717. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  104718. if (err == MP_OKAY) {
  104719. point = (sp_point_256*)XMALLOC(sizeof(sp_point_256), heap,
  104720. DYNAMIC_TYPE_ECC);
  104721. if (point == NULL)
  104722. err = MEMORY_E;
  104723. }
  104724. if (err == MP_OKAY) {
  104725. e = (sp_digit*)XMALLOC(sizeof(sp_digit) * 7 * 2 * 8, heap,
  104726. DYNAMIC_TYPE_ECC);
  104727. if (e == NULL)
  104728. err = MEMORY_E;
  104729. }
  104730. #endif
  104731. if (err == MP_OKAY) {
  104732. x = e + 2 * 8;
  104733. k = e + 4 * 8;
  104734. r = e + 6 * 8;
  104735. tmp = e + 8 * 8;
  104736. s = e;
  104737. if (hashLen > 32U) {
  104738. hashLen = 32U;
  104739. }
  104740. }
  104741. for (i = SP_ECC_MAX_SIG_GEN; err == MP_OKAY && i > 0; i--) {
  104742. /* New random point. */
  104743. if (km == NULL || mp_iszero(km)) {
  104744. err = sp_256_ecc_gen_k_8(rng, k);
  104745. }
  104746. else {
  104747. sp_256_from_mp(k, 8, km);
  104748. mp_zero(km);
  104749. }
  104750. if (err == MP_OKAY) {
  104751. err = sp_256_ecc_mulmod_base_8(point, k, 1, 1, heap);
  104752. }
  104753. if (err == MP_OKAY) {
  104754. /* r = point->x mod order */
  104755. XMEMCPY(r, point->x, sizeof(sp_digit) * 8U);
  104756. sp_256_norm_8(r);
  104757. c = sp_256_cmp_8(r, p256_order);
  104758. sp_256_cond_sub_8(r, r, p256_order,
  104759. (sp_digit)0 - (sp_digit)(c >= 0));
  104760. sp_256_norm_8(r);
  104761. sp_256_from_mp(x, 8, priv);
  104762. sp_256_from_bin(e, 8, hash, (int)hashLen);
  104763. err = sp_256_calc_s_8(s, r, k, x, e, tmp);
  104764. }
  104765. /* Check that signature is usable. */
  104766. if ((err == MP_OKAY) && (sp_256_iszero_8(s) == 0)) {
  104767. break;
  104768. }
  104769. #ifdef WOLFSSL_ECDSA_SET_K_ONE_LOOP
  104770. i = 1;
  104771. #endif
  104772. }
  104773. if (i == 0) {
  104774. err = RNG_FAILURE_E;
  104775. }
  104776. if (err == MP_OKAY) {
  104777. err = sp_256_to_mp(r, rm);
  104778. }
  104779. if (err == MP_OKAY) {
  104780. err = sp_256_to_mp(s, sm);
  104781. }
  104782. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  104783. if (e != NULL)
  104784. #endif
  104785. {
  104786. ForceZero(e, sizeof(sp_digit) * 7 * 2 * 8);
  104787. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  104788. XFREE(e, heap, DYNAMIC_TYPE_ECC);
  104789. #endif
  104790. }
  104791. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  104792. if (point != NULL)
  104793. #endif
  104794. {
  104795. ForceZero(point, sizeof(sp_point_256));
  104796. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  104797. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  104798. #endif
  104799. }
  104800. return err;
  104801. }
  104802. #ifdef WOLFSSL_SP_NONBLOCK
  104803. typedef struct sp_ecc_sign_256_ctx {
  104804. int state;
  104805. union {
  104806. sp_256_ecc_mulmod_8_ctx mulmod_ctx;
  104807. sp_256_mont_inv_order_8_ctx mont_inv_order_ctx;
  104808. };
  104809. sp_digit e[2*8];
  104810. sp_digit x[2*8];
  104811. sp_digit k[2*8];
  104812. sp_digit r[2*8];
  104813. sp_digit tmp[3 * 2*8];
  104814. sp_point_256 point;
  104815. sp_digit* s;
  104816. sp_digit* kInv;
  104817. int i;
  104818. } sp_ecc_sign_256_ctx;
  104819. int sp_ecc_sign_256_nb(sp_ecc_ctx_t* sp_ctx, const byte* hash, word32 hashLen, WC_RNG* rng,
  104820. mp_int* priv, mp_int* rm, mp_int* sm, mp_int* km, void* heap)
  104821. {
  104822. int err = FP_WOULDBLOCK;
  104823. sp_ecc_sign_256_ctx* ctx = (sp_ecc_sign_256_ctx*)sp_ctx->data;
  104824. typedef char ctx_size_test[sizeof(sp_ecc_sign_256_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  104825. (void)sizeof(ctx_size_test);
  104826. switch (ctx->state) {
  104827. case 0: /* INIT */
  104828. ctx->s = ctx->e;
  104829. ctx->kInv = ctx->k;
  104830. ctx->i = SP_ECC_MAX_SIG_GEN;
  104831. ctx->state = 1;
  104832. break;
  104833. case 1: /* GEN */
  104834. /* New random point. */
  104835. if (km == NULL || mp_iszero(km)) {
  104836. err = sp_256_ecc_gen_k_8(rng, ctx->k);
  104837. }
  104838. else {
  104839. sp_256_from_mp(ctx->k, 8, km);
  104840. mp_zero(km);
  104841. }
  104842. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  104843. ctx->state = 2;
  104844. break;
  104845. case 2: /* MULMOD */
  104846. err = sp_256_ecc_mulmod_8_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  104847. &ctx->point, &p256_base, ctx->k, 1, 1, heap);
  104848. if (err == MP_OKAY) {
  104849. ctx->state = 3;
  104850. }
  104851. break;
  104852. case 3: /* MODORDER */
  104853. {
  104854. sp_int32 c;
  104855. /* r = point->x mod order */
  104856. XMEMCPY(ctx->r, ctx->point.x, sizeof(sp_digit) * 8U);
  104857. sp_256_norm_8(ctx->r);
  104858. c = sp_256_cmp_8(ctx->r, p256_order);
  104859. sp_256_cond_sub_8(ctx->r, ctx->r, p256_order,
  104860. (sp_digit)0 - (sp_digit)(c >= 0));
  104861. sp_256_norm_8(ctx->r);
  104862. if (hashLen > 32U) {
  104863. hashLen = 32U;
  104864. }
  104865. sp_256_from_mp(ctx->x, 8, priv);
  104866. sp_256_from_bin(ctx->e, 8, hash, (int)hashLen);
  104867. ctx->state = 4;
  104868. break;
  104869. }
  104870. case 4: /* KMODORDER */
  104871. /* Conv k to Montgomery form (mod order) */
  104872. sp_256_mul_8(ctx->k, ctx->k, p256_norm_order);
  104873. err = sp_256_mod_8(ctx->k, ctx->k, p256_order);
  104874. if (err == MP_OKAY) {
  104875. sp_256_norm_8(ctx->k);
  104876. XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
  104877. ctx->state = 5;
  104878. }
  104879. break;
  104880. case 5: /* KINV */
  104881. /* kInv = 1/k mod order */
  104882. err = sp_256_mont_inv_order_8_nb((sp_ecc_ctx_t*)&ctx->mont_inv_order_ctx, ctx->kInv, ctx->k, ctx->tmp);
  104883. if (err == MP_OKAY) {
  104884. XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
  104885. ctx->state = 6;
  104886. }
  104887. break;
  104888. case 6: /* KINVNORM */
  104889. sp_256_norm_8(ctx->kInv);
  104890. ctx->state = 7;
  104891. break;
  104892. case 7: /* R */
  104893. /* s = r * x + e */
  104894. sp_256_mul_8(ctx->x, ctx->x, ctx->r);
  104895. ctx->state = 8;
  104896. break;
  104897. case 8: /* S1 */
  104898. err = sp_256_mod_8(ctx->x, ctx->x, p256_order);
  104899. if (err == MP_OKAY)
  104900. ctx->state = 9;
  104901. break;
  104902. case 9: /* S2 */
  104903. {
  104904. sp_digit carry;
  104905. sp_int32 c;
  104906. sp_256_norm_8(ctx->x);
  104907. carry = sp_256_add_8(ctx->s, ctx->e, ctx->x);
  104908. sp_256_cond_sub_8(ctx->s, ctx->s,
  104909. p256_order, 0 - carry);
  104910. sp_256_norm_8(ctx->s);
  104911. c = sp_256_cmp_8(ctx->s, p256_order);
  104912. sp_256_cond_sub_8(ctx->s, ctx->s, p256_order,
  104913. (sp_digit)0 - (sp_digit)(c >= 0));
  104914. sp_256_norm_8(ctx->s);
  104915. /* s = s * k^-1 mod order */
  104916. sp_256_mont_mul_order_8(ctx->s, ctx->s, ctx->kInv);
  104917. sp_256_norm_8(ctx->s);
  104918. /* Check that signature is usable. */
  104919. if (sp_256_iszero_8(ctx->s) == 0) {
  104920. ctx->state = 10;
  104921. break;
  104922. }
  104923. #ifdef WOLFSSL_ECDSA_SET_K_ONE_LOOP
  104924. ctx->i = 1;
  104925. #endif
  104926. /* not usable gen, try again */
  104927. ctx->i--;
  104928. if (ctx->i == 0) {
  104929. err = RNG_FAILURE_E;
  104930. }
  104931. ctx->state = 1;
  104932. break;
  104933. }
  104934. case 10: /* RES */
  104935. err = sp_256_to_mp(ctx->r, rm);
  104936. if (err == MP_OKAY) {
  104937. err = sp_256_to_mp(ctx->s, sm);
  104938. }
  104939. break;
  104940. }
  104941. if (err == MP_OKAY && ctx->state != 10) {
  104942. err = FP_WOULDBLOCK;
  104943. }
  104944. if (err != FP_WOULDBLOCK) {
  104945. XMEMSET(ctx->e, 0, sizeof(sp_digit) * 2U * 8U);
  104946. XMEMSET(ctx->x, 0, sizeof(sp_digit) * 2U * 8U);
  104947. XMEMSET(ctx->k, 0, sizeof(sp_digit) * 2U * 8U);
  104948. XMEMSET(ctx->r, 0, sizeof(sp_digit) * 2U * 8U);
  104949. XMEMSET(ctx->tmp, 0, sizeof(sp_digit) * 3U * 2U * 8U);
  104950. }
  104951. return err;
  104952. }
  104953. #endif /* WOLFSSL_SP_NONBLOCK */
  104954. #endif /* HAVE_ECC_SIGN */
  104955. #ifndef WOLFSSL_SP_SMALL
  104956. /* Right shift a by 1 bit into r. (r = a >> 1)
  104957. *
  104958. * r A single precision integer.
  104959. * a A single precision integer.
  104960. */
  104961. static void sp_256_rshift1_8(sp_digit* r, const sp_digit* a)
  104962. {
  104963. __asm__ __volatile__ (
  104964. "ldr r2, [%[a]]\n\t"
  104965. "ldr r3, [%[a], #4]\n\t"
  104966. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104967. "lsrs r2, r2, #1\n\t"
  104968. #else
  104969. "lsr r2, r2, #1\n\t"
  104970. #endif
  104971. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104972. "lsls r5, r3, #31\n\t"
  104973. #else
  104974. "lsl r5, r3, #31\n\t"
  104975. #endif
  104976. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104977. "lsrs r3, r3, #1\n\t"
  104978. #else
  104979. "lsr r3, r3, #1\n\t"
  104980. #endif
  104981. #ifdef WOLFSSL_KEIL
  104982. "orrs r2, r2, r5\n\t"
  104983. #elif defined(__clang__)
  104984. "orrs r2, r5\n\t"
  104985. #else
  104986. "orr r2, r5\n\t"
  104987. #endif
  104988. "ldr r4, [%[a], #8]\n\t"
  104989. "str r2, [%[r]]\n\t"
  104990. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104991. "lsls r5, r4, #31\n\t"
  104992. #else
  104993. "lsl r5, r4, #31\n\t"
  104994. #endif
  104995. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104996. "lsrs r4, r4, #1\n\t"
  104997. #else
  104998. "lsr r4, r4, #1\n\t"
  104999. #endif
  105000. #ifdef WOLFSSL_KEIL
  105001. "orrs r3, r3, r5\n\t"
  105002. #elif defined(__clang__)
  105003. "orrs r3, r5\n\t"
  105004. #else
  105005. "orr r3, r5\n\t"
  105006. #endif
  105007. "ldr r2, [%[a], #12]\n\t"
  105008. "str r3, [%[r], #4]\n\t"
  105009. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105010. "lsls r5, r2, #31\n\t"
  105011. #else
  105012. "lsl r5, r2, #31\n\t"
  105013. #endif
  105014. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105015. "lsrs r2, r2, #1\n\t"
  105016. #else
  105017. "lsr r2, r2, #1\n\t"
  105018. #endif
  105019. #ifdef WOLFSSL_KEIL
  105020. "orrs r4, r4, r5\n\t"
  105021. #elif defined(__clang__)
  105022. "orrs r4, r5\n\t"
  105023. #else
  105024. "orr r4, r5\n\t"
  105025. #endif
  105026. "ldr r3, [%[a], #16]\n\t"
  105027. "str r4, [%[r], #8]\n\t"
  105028. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105029. "lsls r5, r3, #31\n\t"
  105030. #else
  105031. "lsl r5, r3, #31\n\t"
  105032. #endif
  105033. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105034. "lsrs r3, r3, #1\n\t"
  105035. #else
  105036. "lsr r3, r3, #1\n\t"
  105037. #endif
  105038. #ifdef WOLFSSL_KEIL
  105039. "orrs r2, r2, r5\n\t"
  105040. #elif defined(__clang__)
  105041. "orrs r2, r5\n\t"
  105042. #else
  105043. "orr r2, r5\n\t"
  105044. #endif
  105045. "ldr r4, [%[a], #20]\n\t"
  105046. "str r2, [%[r], #12]\n\t"
  105047. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105048. "lsls r5, r4, #31\n\t"
  105049. #else
  105050. "lsl r5, r4, #31\n\t"
  105051. #endif
  105052. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105053. "lsrs r4, r4, #1\n\t"
  105054. #else
  105055. "lsr r4, r4, #1\n\t"
  105056. #endif
  105057. #ifdef WOLFSSL_KEIL
  105058. "orrs r3, r3, r5\n\t"
  105059. #elif defined(__clang__)
  105060. "orrs r3, r5\n\t"
  105061. #else
  105062. "orr r3, r5\n\t"
  105063. #endif
  105064. "ldr r2, [%[a], #24]\n\t"
  105065. "str r3, [%[r], #16]\n\t"
  105066. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105067. "lsls r5, r2, #31\n\t"
  105068. #else
  105069. "lsl r5, r2, #31\n\t"
  105070. #endif
  105071. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105072. "lsrs r2, r2, #1\n\t"
  105073. #else
  105074. "lsr r2, r2, #1\n\t"
  105075. #endif
  105076. #ifdef WOLFSSL_KEIL
  105077. "orrs r4, r4, r5\n\t"
  105078. #elif defined(__clang__)
  105079. "orrs r4, r5\n\t"
  105080. #else
  105081. "orr r4, r5\n\t"
  105082. #endif
  105083. "ldr r3, [%[a], #28]\n\t"
  105084. "str r4, [%[r], #20]\n\t"
  105085. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105086. "lsls r5, r3, #31\n\t"
  105087. #else
  105088. "lsl r5, r3, #31\n\t"
  105089. #endif
  105090. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105091. "lsrs r3, r3, #1\n\t"
  105092. #else
  105093. "lsr r3, r3, #1\n\t"
  105094. #endif
  105095. #ifdef WOLFSSL_KEIL
  105096. "orrs r2, r2, r5\n\t"
  105097. #elif defined(__clang__)
  105098. "orrs r2, r5\n\t"
  105099. #else
  105100. "orr r2, r5\n\t"
  105101. #endif
  105102. "str r2, [%[r], #24]\n\t"
  105103. "str r3, [%[r], #28]\n\t"
  105104. : [r] "+l" (r), [a] "+l" (a)
  105105. :
  105106. : "memory", "r2", "r3", "r4", "r5"
  105107. );
  105108. }
  105109. /* Divide the number by 2 mod the modulus. (r = a / 2 % m)
  105110. *
  105111. * r Result of division by 2.
  105112. * a Number to divide.
  105113. * m Modulus.
  105114. */
  105115. static void sp_256_div2_mod_8(sp_digit* r, const sp_digit* a, const sp_digit* m)
  105116. {
  105117. __asm__ __volatile__ (
  105118. "ldr r7, [%[a]]\n\t"
  105119. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105120. "lsls r7, r7, #31\n\t"
  105121. #else
  105122. "lsl r7, r7, #31\n\t"
  105123. #endif
  105124. "beq L_sp_256_div2_mod_8_no_add_%=\n\t"
  105125. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105126. "lsrs r7, r7, #31\n\t"
  105127. #else
  105128. "lsr r7, r7, #31\n\t"
  105129. #endif
  105130. "ldr r5, [%[m]]\n\t"
  105131. "ldr r6, [%[m], #4]\n\t"
  105132. "ldr r3, [%[a]]\n\t"
  105133. "ldr r4, [%[a], #4]\n\t"
  105134. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105135. "adds r3, r3, r5\n\t"
  105136. #else
  105137. "add r3, r3, r5\n\t"
  105138. #endif
  105139. #ifdef WOLFSSL_KEIL
  105140. "adcs r4, r4, r6\n\t"
  105141. #elif defined(__clang__)
  105142. "adcs r4, r6\n\t"
  105143. #else
  105144. "adc r4, r6\n\t"
  105145. #endif
  105146. "str r3, [%[r]]\n\t"
  105147. "str r4, [%[r], #4]\n\t"
  105148. "ldr r5, [%[m], #8]\n\t"
  105149. "ldr r6, [%[m], #12]\n\t"
  105150. "ldr r3, [%[a], #8]\n\t"
  105151. "ldr r4, [%[a], #12]\n\t"
  105152. #ifdef WOLFSSL_KEIL
  105153. "adcs r3, r3, r5\n\t"
  105154. #elif defined(__clang__)
  105155. "adcs r3, r5\n\t"
  105156. #else
  105157. "adc r3, r5\n\t"
  105158. #endif
  105159. #ifdef WOLFSSL_KEIL
  105160. "adcs r4, r4, r6\n\t"
  105161. #elif defined(__clang__)
  105162. "adcs r4, r6\n\t"
  105163. #else
  105164. "adc r4, r6\n\t"
  105165. #endif
  105166. "str r3, [%[r], #8]\n\t"
  105167. "str r4, [%[r], #12]\n\t"
  105168. "ldr r5, [%[m], #16]\n\t"
  105169. "ldr r6, [%[m], #20]\n\t"
  105170. "ldr r3, [%[a], #16]\n\t"
  105171. "ldr r4, [%[a], #20]\n\t"
  105172. #ifdef WOLFSSL_KEIL
  105173. "adcs r3, r3, r5\n\t"
  105174. #elif defined(__clang__)
  105175. "adcs r3, r5\n\t"
  105176. #else
  105177. "adc r3, r5\n\t"
  105178. #endif
  105179. #ifdef WOLFSSL_KEIL
  105180. "adcs r4, r4, r6\n\t"
  105181. #elif defined(__clang__)
  105182. "adcs r4, r6\n\t"
  105183. #else
  105184. "adc r4, r6\n\t"
  105185. #endif
  105186. "str r3, [%[r], #16]\n\t"
  105187. "str r4, [%[r], #20]\n\t"
  105188. "ldr r5, [%[m], #24]\n\t"
  105189. "ldr r6, [%[m], #28]\n\t"
  105190. "ldr r3, [%[a], #24]\n\t"
  105191. "ldr r4, [%[a], #28]\n\t"
  105192. #ifdef WOLFSSL_KEIL
  105193. "adcs r3, r3, r5\n\t"
  105194. #elif defined(__clang__)
  105195. "adcs r3, r5\n\t"
  105196. #else
  105197. "adc r3, r5\n\t"
  105198. #endif
  105199. #ifdef WOLFSSL_KEIL
  105200. "adcs r4, r4, r6\n\t"
  105201. #elif defined(__clang__)
  105202. "adcs r4, r6\n\t"
  105203. #else
  105204. "adc r4, r6\n\t"
  105205. #endif
  105206. "movs r7, #0\n\t"
  105207. #ifdef WOLFSSL_KEIL
  105208. "adcs r7, r7, r7\n\t"
  105209. #elif defined(__clang__)
  105210. "adcs r7, r7\n\t"
  105211. #else
  105212. "adc r7, r7\n\t"
  105213. #endif
  105214. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105215. "lsls r7, r7, #31\n\t"
  105216. #else
  105217. "lsl r7, r7, #31\n\t"
  105218. #endif
  105219. "b L_sp_256_div2_mod_8_div2_%=\n\t"
  105220. "\n"
  105221. "L_sp_256_div2_mod_8_no_add_%=:\n\t"
  105222. "ldr r3, [%[a], #24]\n\t"
  105223. "ldr r4, [%[a], #28]\n\t"
  105224. "\n"
  105225. "L_sp_256_div2_mod_8_div2_%=:\n\t"
  105226. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105227. "lsrs r5, r3, #1\n\t"
  105228. #else
  105229. "lsr r5, r3, #1\n\t"
  105230. #endif
  105231. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105232. "lsls r3, r3, #31\n\t"
  105233. #else
  105234. "lsl r3, r3, #31\n\t"
  105235. #endif
  105236. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105237. "lsrs r6, r4, #1\n\t"
  105238. #else
  105239. "lsr r6, r4, #1\n\t"
  105240. #endif
  105241. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105242. "lsls r4, r4, #31\n\t"
  105243. #else
  105244. "lsl r4, r4, #31\n\t"
  105245. #endif
  105246. #ifdef WOLFSSL_KEIL
  105247. "orrs r5, r5, r4\n\t"
  105248. #elif defined(__clang__)
  105249. "orrs r5, r4\n\t"
  105250. #else
  105251. "orr r5, r4\n\t"
  105252. #endif
  105253. #ifdef WOLFSSL_KEIL
  105254. "orrs r6, r6, r7\n\t"
  105255. #elif defined(__clang__)
  105256. "orrs r6, r7\n\t"
  105257. #else
  105258. "orr r6, r7\n\t"
  105259. #endif
  105260. "movs r7, r3\n\t"
  105261. "str r5, [%[r], #24]\n\t"
  105262. "str r6, [%[r], #28]\n\t"
  105263. "ldr r3, [%[a], #16]\n\t"
  105264. "ldr r4, [%[a], #20]\n\t"
  105265. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105266. "lsrs r5, r3, #1\n\t"
  105267. #else
  105268. "lsr r5, r3, #1\n\t"
  105269. #endif
  105270. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105271. "lsls r3, r3, #31\n\t"
  105272. #else
  105273. "lsl r3, r3, #31\n\t"
  105274. #endif
  105275. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105276. "lsrs r6, r4, #1\n\t"
  105277. #else
  105278. "lsr r6, r4, #1\n\t"
  105279. #endif
  105280. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105281. "lsls r4, r4, #31\n\t"
  105282. #else
  105283. "lsl r4, r4, #31\n\t"
  105284. #endif
  105285. #ifdef WOLFSSL_KEIL
  105286. "orrs r5, r5, r4\n\t"
  105287. #elif defined(__clang__)
  105288. "orrs r5, r4\n\t"
  105289. #else
  105290. "orr r5, r4\n\t"
  105291. #endif
  105292. #ifdef WOLFSSL_KEIL
  105293. "orrs r6, r6, r7\n\t"
  105294. #elif defined(__clang__)
  105295. "orrs r6, r7\n\t"
  105296. #else
  105297. "orr r6, r7\n\t"
  105298. #endif
  105299. "movs r7, r3\n\t"
  105300. "str r5, [%[r], #16]\n\t"
  105301. "str r6, [%[r], #20]\n\t"
  105302. "ldr r3, [%[a], #8]\n\t"
  105303. "ldr r4, [%[a], #12]\n\t"
  105304. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105305. "lsrs r5, r3, #1\n\t"
  105306. #else
  105307. "lsr r5, r3, #1\n\t"
  105308. #endif
  105309. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105310. "lsls r3, r3, #31\n\t"
  105311. #else
  105312. "lsl r3, r3, #31\n\t"
  105313. #endif
  105314. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105315. "lsrs r6, r4, #1\n\t"
  105316. #else
  105317. "lsr r6, r4, #1\n\t"
  105318. #endif
  105319. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105320. "lsls r4, r4, #31\n\t"
  105321. #else
  105322. "lsl r4, r4, #31\n\t"
  105323. #endif
  105324. #ifdef WOLFSSL_KEIL
  105325. "orrs r5, r5, r4\n\t"
  105326. #elif defined(__clang__)
  105327. "orrs r5, r4\n\t"
  105328. #else
  105329. "orr r5, r4\n\t"
  105330. #endif
  105331. #ifdef WOLFSSL_KEIL
  105332. "orrs r6, r6, r7\n\t"
  105333. #elif defined(__clang__)
  105334. "orrs r6, r7\n\t"
  105335. #else
  105336. "orr r6, r7\n\t"
  105337. #endif
  105338. "movs r7, r3\n\t"
  105339. "str r5, [%[r], #8]\n\t"
  105340. "str r6, [%[r], #12]\n\t"
  105341. "ldr r3, [%[r]]\n\t"
  105342. "ldr r4, [%[r], #4]\n\t"
  105343. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105344. "lsrs r5, r3, #1\n\t"
  105345. #else
  105346. "lsr r5, r3, #1\n\t"
  105347. #endif
  105348. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105349. "lsrs r6, r4, #1\n\t"
  105350. #else
  105351. "lsr r6, r4, #1\n\t"
  105352. #endif
  105353. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105354. "lsls r4, r4, #31\n\t"
  105355. #else
  105356. "lsl r4, r4, #31\n\t"
  105357. #endif
  105358. #ifdef WOLFSSL_KEIL
  105359. "orrs r5, r5, r4\n\t"
  105360. #elif defined(__clang__)
  105361. "orrs r5, r4\n\t"
  105362. #else
  105363. "orr r5, r4\n\t"
  105364. #endif
  105365. #ifdef WOLFSSL_KEIL
  105366. "orrs r6, r6, r7\n\t"
  105367. #elif defined(__clang__)
  105368. "orrs r6, r7\n\t"
  105369. #else
  105370. "orr r6, r7\n\t"
  105371. #endif
  105372. "str r5, [%[r]]\n\t"
  105373. "str r6, [%[r], #4]\n\t"
  105374. : [r] "+l" (r), [a] "+l" (a), [m] "+l" (m)
  105375. :
  105376. : "memory", "r3", "r4", "r5", "r6", "r7", "r8"
  105377. );
  105378. }
  105379. static int sp_256_num_bits_8(sp_digit* a)
  105380. {
  105381. static const byte sp_num_bits_table[256] = {
  105382. 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
  105383. 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
  105384. 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
  105385. 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
  105386. 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
  105387. 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
  105388. 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
  105389. 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
  105390. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  105391. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  105392. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  105393. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  105394. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  105395. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  105396. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  105397. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  105398. };
  105399. const byte* table = sp_num_bits_table;
  105400. __asm__ __volatile__ (
  105401. "movs r6, #0xff\n\t"
  105402. "ldr r3, [%[a], #28]\n\t"
  105403. "cmp r3, #0\n\t"
  105404. "beq L_sp_256_num_bits_8_7_%=\n\t"
  105405. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105406. "lsrs r5, r3, #24\n\t"
  105407. #else
  105408. "lsr r5, r3, #24\n\t"
  105409. #endif
  105410. "cmp r5, #0\n\t"
  105411. "beq L_sp_256_num_bits_8_93_%=\n\t"
  105412. "movs r2, #0xf8\n\t"
  105413. "ldrb r4, [%[table], r5]\n\t"
  105414. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105415. "adds r2, r2, r4\n\t"
  105416. #else
  105417. "add r2, r2, r4\n\t"
  105418. #endif
  105419. "b L_sp_256_num_bits_8_9_%=\n\t"
  105420. "\n"
  105421. "L_sp_256_num_bits_8_93_%=:\n\t"
  105422. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105423. "lsrs r5, r3, #16\n\t"
  105424. #else
  105425. "lsr r5, r3, #16\n\t"
  105426. #endif
  105427. #ifdef WOLFSSL_KEIL
  105428. "ands r5, r5, r6\n\t"
  105429. #elif defined(__clang__)
  105430. "ands r5, r6\n\t"
  105431. #else
  105432. "and r5, r6\n\t"
  105433. #endif
  105434. "cmp r5, #0\n\t"
  105435. "beq L_sp_256_num_bits_8_92_%=\n\t"
  105436. "movs r2, #0xf0\n\t"
  105437. "ldrb r4, [%[table], r5]\n\t"
  105438. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105439. "adds r2, r2, r4\n\t"
  105440. #else
  105441. "add r2, r2, r4\n\t"
  105442. #endif
  105443. "b L_sp_256_num_bits_8_9_%=\n\t"
  105444. "\n"
  105445. "L_sp_256_num_bits_8_92_%=:\n\t"
  105446. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105447. "lsrs r5, r3, #8\n\t"
  105448. #else
  105449. "lsr r5, r3, #8\n\t"
  105450. #endif
  105451. #ifdef WOLFSSL_KEIL
  105452. "ands r5, r5, r6\n\t"
  105453. #elif defined(__clang__)
  105454. "ands r5, r6\n\t"
  105455. #else
  105456. "and r5, r6\n\t"
  105457. #endif
  105458. "cmp r5, #0\n\t"
  105459. "beq L_sp_256_num_bits_8_91_%=\n\t"
  105460. "movs r2, #0xe8\n\t"
  105461. "ldrb r4, [%[table], r5]\n\t"
  105462. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105463. "adds r2, r2, r4\n\t"
  105464. #else
  105465. "add r2, r2, r4\n\t"
  105466. #endif
  105467. "b L_sp_256_num_bits_8_9_%=\n\t"
  105468. "\n"
  105469. "L_sp_256_num_bits_8_91_%=:\n\t"
  105470. "movs r5, r3\n\t"
  105471. #ifdef WOLFSSL_KEIL
  105472. "ands r5, r5, r6\n\t"
  105473. #elif defined(__clang__)
  105474. "ands r5, r6\n\t"
  105475. #else
  105476. "and r5, r6\n\t"
  105477. #endif
  105478. "cmp r5, #0\n\t"
  105479. "beq L_sp_256_num_bits_8_90_%=\n\t"
  105480. "movs r2, #0xe0\n\t"
  105481. "ldrb r4, [%[table], r5]\n\t"
  105482. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105483. "adds r2, r2, r4\n\t"
  105484. #else
  105485. "add r2, r2, r4\n\t"
  105486. #endif
  105487. "b L_sp_256_num_bits_8_9_%=\n\t"
  105488. "\n"
  105489. "L_sp_256_num_bits_8_90_%=:\n\t"
  105490. "b L_sp_256_num_bits_8_9_%=\n\t"
  105491. "\n"
  105492. "L_sp_256_num_bits_8_7_%=:\n\t"
  105493. "ldr r3, [%[a], #24]\n\t"
  105494. "cmp r3, #0\n\t"
  105495. "beq L_sp_256_num_bits_8_6_%=\n\t"
  105496. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105497. "lsrs r5, r3, #24\n\t"
  105498. #else
  105499. "lsr r5, r3, #24\n\t"
  105500. #endif
  105501. "cmp r5, #0\n\t"
  105502. "beq L_sp_256_num_bits_8_83_%=\n\t"
  105503. "movs r2, #0xd8\n\t"
  105504. "ldrb r4, [%[table], r5]\n\t"
  105505. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105506. "adds r2, r2, r4\n\t"
  105507. #else
  105508. "add r2, r2, r4\n\t"
  105509. #endif
  105510. "b L_sp_256_num_bits_8_9_%=\n\t"
  105511. "\n"
  105512. "L_sp_256_num_bits_8_83_%=:\n\t"
  105513. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105514. "lsrs r5, r3, #16\n\t"
  105515. #else
  105516. "lsr r5, r3, #16\n\t"
  105517. #endif
  105518. #ifdef WOLFSSL_KEIL
  105519. "ands r5, r5, r6\n\t"
  105520. #elif defined(__clang__)
  105521. "ands r5, r6\n\t"
  105522. #else
  105523. "and r5, r6\n\t"
  105524. #endif
  105525. "cmp r5, #0\n\t"
  105526. "beq L_sp_256_num_bits_8_82_%=\n\t"
  105527. "movs r2, #0xd0\n\t"
  105528. "ldrb r4, [%[table], r5]\n\t"
  105529. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105530. "adds r2, r2, r4\n\t"
  105531. #else
  105532. "add r2, r2, r4\n\t"
  105533. #endif
  105534. "b L_sp_256_num_bits_8_9_%=\n\t"
  105535. "\n"
  105536. "L_sp_256_num_bits_8_82_%=:\n\t"
  105537. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105538. "lsrs r5, r3, #8\n\t"
  105539. #else
  105540. "lsr r5, r3, #8\n\t"
  105541. #endif
  105542. #ifdef WOLFSSL_KEIL
  105543. "ands r5, r5, r6\n\t"
  105544. #elif defined(__clang__)
  105545. "ands r5, r6\n\t"
  105546. #else
  105547. "and r5, r6\n\t"
  105548. #endif
  105549. "cmp r5, #0\n\t"
  105550. "beq L_sp_256_num_bits_8_81_%=\n\t"
  105551. "movs r2, #0xc8\n\t"
  105552. "ldrb r4, [%[table], r5]\n\t"
  105553. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105554. "adds r2, r2, r4\n\t"
  105555. #else
  105556. "add r2, r2, r4\n\t"
  105557. #endif
  105558. "b L_sp_256_num_bits_8_9_%=\n\t"
  105559. "\n"
  105560. "L_sp_256_num_bits_8_81_%=:\n\t"
  105561. "movs r5, r3\n\t"
  105562. #ifdef WOLFSSL_KEIL
  105563. "ands r5, r5, r6\n\t"
  105564. #elif defined(__clang__)
  105565. "ands r5, r6\n\t"
  105566. #else
  105567. "and r5, r6\n\t"
  105568. #endif
  105569. "cmp r5, #0\n\t"
  105570. "beq L_sp_256_num_bits_8_80_%=\n\t"
  105571. "movs r2, #0xc0\n\t"
  105572. "ldrb r4, [%[table], r5]\n\t"
  105573. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105574. "adds r2, r2, r4\n\t"
  105575. #else
  105576. "add r2, r2, r4\n\t"
  105577. #endif
  105578. "b L_sp_256_num_bits_8_9_%=\n\t"
  105579. "\n"
  105580. "L_sp_256_num_bits_8_80_%=:\n\t"
  105581. "b L_sp_256_num_bits_8_9_%=\n\t"
  105582. "\n"
  105583. "L_sp_256_num_bits_8_6_%=:\n\t"
  105584. "ldr r3, [%[a], #20]\n\t"
  105585. "cmp r3, #0\n\t"
  105586. "beq L_sp_256_num_bits_8_5_%=\n\t"
  105587. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105588. "lsrs r5, r3, #24\n\t"
  105589. #else
  105590. "lsr r5, r3, #24\n\t"
  105591. #endif
  105592. "cmp r5, #0\n\t"
  105593. "beq L_sp_256_num_bits_8_73_%=\n\t"
  105594. "movs r2, #0xb8\n\t"
  105595. "ldrb r4, [%[table], r5]\n\t"
  105596. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105597. "adds r2, r2, r4\n\t"
  105598. #else
  105599. "add r2, r2, r4\n\t"
  105600. #endif
  105601. "b L_sp_256_num_bits_8_9_%=\n\t"
  105602. "\n"
  105603. "L_sp_256_num_bits_8_73_%=:\n\t"
  105604. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105605. "lsrs r5, r3, #16\n\t"
  105606. #else
  105607. "lsr r5, r3, #16\n\t"
  105608. #endif
  105609. #ifdef WOLFSSL_KEIL
  105610. "ands r5, r5, r6\n\t"
  105611. #elif defined(__clang__)
  105612. "ands r5, r6\n\t"
  105613. #else
  105614. "and r5, r6\n\t"
  105615. #endif
  105616. "cmp r5, #0\n\t"
  105617. "beq L_sp_256_num_bits_8_72_%=\n\t"
  105618. "movs r2, #0xb0\n\t"
  105619. "ldrb r4, [%[table], r5]\n\t"
  105620. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105621. "adds r2, r2, r4\n\t"
  105622. #else
  105623. "add r2, r2, r4\n\t"
  105624. #endif
  105625. "b L_sp_256_num_bits_8_9_%=\n\t"
  105626. "\n"
  105627. "L_sp_256_num_bits_8_72_%=:\n\t"
  105628. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105629. "lsrs r5, r3, #8\n\t"
  105630. #else
  105631. "lsr r5, r3, #8\n\t"
  105632. #endif
  105633. #ifdef WOLFSSL_KEIL
  105634. "ands r5, r5, r6\n\t"
  105635. #elif defined(__clang__)
  105636. "ands r5, r6\n\t"
  105637. #else
  105638. "and r5, r6\n\t"
  105639. #endif
  105640. "cmp r5, #0\n\t"
  105641. "beq L_sp_256_num_bits_8_71_%=\n\t"
  105642. "movs r2, #0xa8\n\t"
  105643. "ldrb r4, [%[table], r5]\n\t"
  105644. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105645. "adds r2, r2, r4\n\t"
  105646. #else
  105647. "add r2, r2, r4\n\t"
  105648. #endif
  105649. "b L_sp_256_num_bits_8_9_%=\n\t"
  105650. "\n"
  105651. "L_sp_256_num_bits_8_71_%=:\n\t"
  105652. "movs r5, r3\n\t"
  105653. #ifdef WOLFSSL_KEIL
  105654. "ands r5, r5, r6\n\t"
  105655. #elif defined(__clang__)
  105656. "ands r5, r6\n\t"
  105657. #else
  105658. "and r5, r6\n\t"
  105659. #endif
  105660. "cmp r5, #0\n\t"
  105661. "beq L_sp_256_num_bits_8_70_%=\n\t"
  105662. "movs r2, #0xa0\n\t"
  105663. "ldrb r4, [%[table], r5]\n\t"
  105664. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105665. "adds r2, r2, r4\n\t"
  105666. #else
  105667. "add r2, r2, r4\n\t"
  105668. #endif
  105669. "b L_sp_256_num_bits_8_9_%=\n\t"
  105670. "\n"
  105671. "L_sp_256_num_bits_8_70_%=:\n\t"
  105672. "b L_sp_256_num_bits_8_9_%=\n\t"
  105673. "\n"
  105674. "L_sp_256_num_bits_8_5_%=:\n\t"
  105675. "ldr r3, [%[a], #16]\n\t"
  105676. "cmp r3, #0\n\t"
  105677. "beq L_sp_256_num_bits_8_4_%=\n\t"
  105678. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105679. "lsrs r5, r3, #24\n\t"
  105680. #else
  105681. "lsr r5, r3, #24\n\t"
  105682. #endif
  105683. "cmp r5, #0\n\t"
  105684. "beq L_sp_256_num_bits_8_63_%=\n\t"
  105685. "movs r2, #0x98\n\t"
  105686. "ldrb r4, [%[table], r5]\n\t"
  105687. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105688. "adds r2, r2, r4\n\t"
  105689. #else
  105690. "add r2, r2, r4\n\t"
  105691. #endif
  105692. "b L_sp_256_num_bits_8_9_%=\n\t"
  105693. "\n"
  105694. "L_sp_256_num_bits_8_63_%=:\n\t"
  105695. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105696. "lsrs r5, r3, #16\n\t"
  105697. #else
  105698. "lsr r5, r3, #16\n\t"
  105699. #endif
  105700. #ifdef WOLFSSL_KEIL
  105701. "ands r5, r5, r6\n\t"
  105702. #elif defined(__clang__)
  105703. "ands r5, r6\n\t"
  105704. #else
  105705. "and r5, r6\n\t"
  105706. #endif
  105707. "cmp r5, #0\n\t"
  105708. "beq L_sp_256_num_bits_8_62_%=\n\t"
  105709. "movs r2, #0x90\n\t"
  105710. "ldrb r4, [%[table], r5]\n\t"
  105711. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105712. "adds r2, r2, r4\n\t"
  105713. #else
  105714. "add r2, r2, r4\n\t"
  105715. #endif
  105716. "b L_sp_256_num_bits_8_9_%=\n\t"
  105717. "\n"
  105718. "L_sp_256_num_bits_8_62_%=:\n\t"
  105719. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105720. "lsrs r5, r3, #8\n\t"
  105721. #else
  105722. "lsr r5, r3, #8\n\t"
  105723. #endif
  105724. #ifdef WOLFSSL_KEIL
  105725. "ands r5, r5, r6\n\t"
  105726. #elif defined(__clang__)
  105727. "ands r5, r6\n\t"
  105728. #else
  105729. "and r5, r6\n\t"
  105730. #endif
  105731. "cmp r5, #0\n\t"
  105732. "beq L_sp_256_num_bits_8_61_%=\n\t"
  105733. "movs r2, #0x88\n\t"
  105734. "ldrb r4, [%[table], r5]\n\t"
  105735. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105736. "adds r2, r2, r4\n\t"
  105737. #else
  105738. "add r2, r2, r4\n\t"
  105739. #endif
  105740. "b L_sp_256_num_bits_8_9_%=\n\t"
  105741. "\n"
  105742. "L_sp_256_num_bits_8_61_%=:\n\t"
  105743. "movs r5, r3\n\t"
  105744. #ifdef WOLFSSL_KEIL
  105745. "ands r5, r5, r6\n\t"
  105746. #elif defined(__clang__)
  105747. "ands r5, r6\n\t"
  105748. #else
  105749. "and r5, r6\n\t"
  105750. #endif
  105751. "cmp r5, #0\n\t"
  105752. "beq L_sp_256_num_bits_8_60_%=\n\t"
  105753. "movs r2, #0x80\n\t"
  105754. "ldrb r4, [%[table], r5]\n\t"
  105755. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105756. "adds r2, r2, r4\n\t"
  105757. #else
  105758. "add r2, r2, r4\n\t"
  105759. #endif
  105760. "b L_sp_256_num_bits_8_9_%=\n\t"
  105761. "\n"
  105762. "L_sp_256_num_bits_8_60_%=:\n\t"
  105763. "b L_sp_256_num_bits_8_9_%=\n\t"
  105764. "\n"
  105765. "L_sp_256_num_bits_8_4_%=:\n\t"
  105766. "ldr r3, [%[a], #12]\n\t"
  105767. "cmp r3, #0\n\t"
  105768. "beq L_sp_256_num_bits_8_3_%=\n\t"
  105769. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105770. "lsrs r5, r3, #24\n\t"
  105771. #else
  105772. "lsr r5, r3, #24\n\t"
  105773. #endif
  105774. "cmp r5, #0\n\t"
  105775. "beq L_sp_256_num_bits_8_53_%=\n\t"
  105776. "movs r2, #0x78\n\t"
  105777. "ldrb r4, [%[table], r5]\n\t"
  105778. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105779. "adds r2, r2, r4\n\t"
  105780. #else
  105781. "add r2, r2, r4\n\t"
  105782. #endif
  105783. "b L_sp_256_num_bits_8_9_%=\n\t"
  105784. "\n"
  105785. "L_sp_256_num_bits_8_53_%=:\n\t"
  105786. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105787. "lsrs r5, r3, #16\n\t"
  105788. #else
  105789. "lsr r5, r3, #16\n\t"
  105790. #endif
  105791. #ifdef WOLFSSL_KEIL
  105792. "ands r5, r5, r6\n\t"
  105793. #elif defined(__clang__)
  105794. "ands r5, r6\n\t"
  105795. #else
  105796. "and r5, r6\n\t"
  105797. #endif
  105798. "cmp r5, #0\n\t"
  105799. "beq L_sp_256_num_bits_8_52_%=\n\t"
  105800. "movs r2, #0x70\n\t"
  105801. "ldrb r4, [%[table], r5]\n\t"
  105802. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105803. "adds r2, r2, r4\n\t"
  105804. #else
  105805. "add r2, r2, r4\n\t"
  105806. #endif
  105807. "b L_sp_256_num_bits_8_9_%=\n\t"
  105808. "\n"
  105809. "L_sp_256_num_bits_8_52_%=:\n\t"
  105810. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105811. "lsrs r5, r3, #8\n\t"
  105812. #else
  105813. "lsr r5, r3, #8\n\t"
  105814. #endif
  105815. #ifdef WOLFSSL_KEIL
  105816. "ands r5, r5, r6\n\t"
  105817. #elif defined(__clang__)
  105818. "ands r5, r6\n\t"
  105819. #else
  105820. "and r5, r6\n\t"
  105821. #endif
  105822. "cmp r5, #0\n\t"
  105823. "beq L_sp_256_num_bits_8_51_%=\n\t"
  105824. "movs r2, #0x68\n\t"
  105825. "ldrb r4, [%[table], r5]\n\t"
  105826. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105827. "adds r2, r2, r4\n\t"
  105828. #else
  105829. "add r2, r2, r4\n\t"
  105830. #endif
  105831. "b L_sp_256_num_bits_8_9_%=\n\t"
  105832. "\n"
  105833. "L_sp_256_num_bits_8_51_%=:\n\t"
  105834. "movs r5, r3\n\t"
  105835. #ifdef WOLFSSL_KEIL
  105836. "ands r5, r5, r6\n\t"
  105837. #elif defined(__clang__)
  105838. "ands r5, r6\n\t"
  105839. #else
  105840. "and r5, r6\n\t"
  105841. #endif
  105842. "cmp r5, #0\n\t"
  105843. "beq L_sp_256_num_bits_8_50_%=\n\t"
  105844. "movs r2, #0x60\n\t"
  105845. "ldrb r4, [%[table], r5]\n\t"
  105846. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105847. "adds r2, r2, r4\n\t"
  105848. #else
  105849. "add r2, r2, r4\n\t"
  105850. #endif
  105851. "b L_sp_256_num_bits_8_9_%=\n\t"
  105852. "\n"
  105853. "L_sp_256_num_bits_8_50_%=:\n\t"
  105854. "b L_sp_256_num_bits_8_9_%=\n\t"
  105855. "\n"
  105856. "L_sp_256_num_bits_8_3_%=:\n\t"
  105857. "ldr r3, [%[a], #8]\n\t"
  105858. "cmp r3, #0\n\t"
  105859. "beq L_sp_256_num_bits_8_2_%=\n\t"
  105860. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105861. "lsrs r5, r3, #24\n\t"
  105862. #else
  105863. "lsr r5, r3, #24\n\t"
  105864. #endif
  105865. "cmp r5, #0\n\t"
  105866. "beq L_sp_256_num_bits_8_43_%=\n\t"
  105867. "movs r2, #0x58\n\t"
  105868. "ldrb r4, [%[table], r5]\n\t"
  105869. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105870. "adds r2, r2, r4\n\t"
  105871. #else
  105872. "add r2, r2, r4\n\t"
  105873. #endif
  105874. "b L_sp_256_num_bits_8_9_%=\n\t"
  105875. "\n"
  105876. "L_sp_256_num_bits_8_43_%=:\n\t"
  105877. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105878. "lsrs r5, r3, #16\n\t"
  105879. #else
  105880. "lsr r5, r3, #16\n\t"
  105881. #endif
  105882. #ifdef WOLFSSL_KEIL
  105883. "ands r5, r5, r6\n\t"
  105884. #elif defined(__clang__)
  105885. "ands r5, r6\n\t"
  105886. #else
  105887. "and r5, r6\n\t"
  105888. #endif
  105889. "cmp r5, #0\n\t"
  105890. "beq L_sp_256_num_bits_8_42_%=\n\t"
  105891. "movs r2, #0x50\n\t"
  105892. "ldrb r4, [%[table], r5]\n\t"
  105893. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105894. "adds r2, r2, r4\n\t"
  105895. #else
  105896. "add r2, r2, r4\n\t"
  105897. #endif
  105898. "b L_sp_256_num_bits_8_9_%=\n\t"
  105899. "\n"
  105900. "L_sp_256_num_bits_8_42_%=:\n\t"
  105901. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105902. "lsrs r5, r3, #8\n\t"
  105903. #else
  105904. "lsr r5, r3, #8\n\t"
  105905. #endif
  105906. #ifdef WOLFSSL_KEIL
  105907. "ands r5, r5, r6\n\t"
  105908. #elif defined(__clang__)
  105909. "ands r5, r6\n\t"
  105910. #else
  105911. "and r5, r6\n\t"
  105912. #endif
  105913. "cmp r5, #0\n\t"
  105914. "beq L_sp_256_num_bits_8_41_%=\n\t"
  105915. "movs r2, #0x48\n\t"
  105916. "ldrb r4, [%[table], r5]\n\t"
  105917. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105918. "adds r2, r2, r4\n\t"
  105919. #else
  105920. "add r2, r2, r4\n\t"
  105921. #endif
  105922. "b L_sp_256_num_bits_8_9_%=\n\t"
  105923. "\n"
  105924. "L_sp_256_num_bits_8_41_%=:\n\t"
  105925. "movs r5, r3\n\t"
  105926. #ifdef WOLFSSL_KEIL
  105927. "ands r5, r5, r6\n\t"
  105928. #elif defined(__clang__)
  105929. "ands r5, r6\n\t"
  105930. #else
  105931. "and r5, r6\n\t"
  105932. #endif
  105933. "cmp r5, #0\n\t"
  105934. "beq L_sp_256_num_bits_8_40_%=\n\t"
  105935. "movs r2, #0x40\n\t"
  105936. "ldrb r4, [%[table], r5]\n\t"
  105937. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105938. "adds r2, r2, r4\n\t"
  105939. #else
  105940. "add r2, r2, r4\n\t"
  105941. #endif
  105942. "b L_sp_256_num_bits_8_9_%=\n\t"
  105943. "\n"
  105944. "L_sp_256_num_bits_8_40_%=:\n\t"
  105945. "b L_sp_256_num_bits_8_9_%=\n\t"
  105946. "\n"
  105947. "L_sp_256_num_bits_8_2_%=:\n\t"
  105948. "ldr r3, [%[a], #4]\n\t"
  105949. "cmp r3, #0\n\t"
  105950. "beq L_sp_256_num_bits_8_1_%=\n\t"
  105951. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105952. "lsrs r5, r3, #24\n\t"
  105953. #else
  105954. "lsr r5, r3, #24\n\t"
  105955. #endif
  105956. "cmp r5, #0\n\t"
  105957. "beq L_sp_256_num_bits_8_33_%=\n\t"
  105958. "movs r2, #56\n\t"
  105959. "ldrb r4, [%[table], r5]\n\t"
  105960. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105961. "adds r2, r2, r4\n\t"
  105962. #else
  105963. "add r2, r2, r4\n\t"
  105964. #endif
  105965. "b L_sp_256_num_bits_8_9_%=\n\t"
  105966. "\n"
  105967. "L_sp_256_num_bits_8_33_%=:\n\t"
  105968. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105969. "lsrs r5, r3, #16\n\t"
  105970. #else
  105971. "lsr r5, r3, #16\n\t"
  105972. #endif
  105973. #ifdef WOLFSSL_KEIL
  105974. "ands r5, r5, r6\n\t"
  105975. #elif defined(__clang__)
  105976. "ands r5, r6\n\t"
  105977. #else
  105978. "and r5, r6\n\t"
  105979. #endif
  105980. "cmp r5, #0\n\t"
  105981. "beq L_sp_256_num_bits_8_32_%=\n\t"
  105982. "movs r2, #48\n\t"
  105983. "ldrb r4, [%[table], r5]\n\t"
  105984. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105985. "adds r2, r2, r4\n\t"
  105986. #else
  105987. "add r2, r2, r4\n\t"
  105988. #endif
  105989. "b L_sp_256_num_bits_8_9_%=\n\t"
  105990. "\n"
  105991. "L_sp_256_num_bits_8_32_%=:\n\t"
  105992. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105993. "lsrs r5, r3, #8\n\t"
  105994. #else
  105995. "lsr r5, r3, #8\n\t"
  105996. #endif
  105997. #ifdef WOLFSSL_KEIL
  105998. "ands r5, r5, r6\n\t"
  105999. #elif defined(__clang__)
  106000. "ands r5, r6\n\t"
  106001. #else
  106002. "and r5, r6\n\t"
  106003. #endif
  106004. "cmp r5, #0\n\t"
  106005. "beq L_sp_256_num_bits_8_31_%=\n\t"
  106006. "movs r2, #40\n\t"
  106007. "ldrb r4, [%[table], r5]\n\t"
  106008. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106009. "adds r2, r2, r4\n\t"
  106010. #else
  106011. "add r2, r2, r4\n\t"
  106012. #endif
  106013. "b L_sp_256_num_bits_8_9_%=\n\t"
  106014. "\n"
  106015. "L_sp_256_num_bits_8_31_%=:\n\t"
  106016. "movs r5, r3\n\t"
  106017. #ifdef WOLFSSL_KEIL
  106018. "ands r5, r5, r6\n\t"
  106019. #elif defined(__clang__)
  106020. "ands r5, r6\n\t"
  106021. #else
  106022. "and r5, r6\n\t"
  106023. #endif
  106024. "cmp r5, #0\n\t"
  106025. "beq L_sp_256_num_bits_8_30_%=\n\t"
  106026. "movs r2, #32\n\t"
  106027. "ldrb r4, [%[table], r5]\n\t"
  106028. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106029. "adds r2, r2, r4\n\t"
  106030. #else
  106031. "add r2, r2, r4\n\t"
  106032. #endif
  106033. "b L_sp_256_num_bits_8_9_%=\n\t"
  106034. "\n"
  106035. "L_sp_256_num_bits_8_30_%=:\n\t"
  106036. "b L_sp_256_num_bits_8_9_%=\n\t"
  106037. "\n"
  106038. "L_sp_256_num_bits_8_1_%=:\n\t"
  106039. "ldr r3, [%[a]]\n\t"
  106040. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106041. "lsrs r5, r3, #24\n\t"
  106042. #else
  106043. "lsr r5, r3, #24\n\t"
  106044. #endif
  106045. "cmp r5, #0\n\t"
  106046. "beq L_sp_256_num_bits_8_23_%=\n\t"
  106047. "movs r2, #24\n\t"
  106048. "ldrb r4, [%[table], r5]\n\t"
  106049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106050. "adds r2, r2, r4\n\t"
  106051. #else
  106052. "add r2, r2, r4\n\t"
  106053. #endif
  106054. "b L_sp_256_num_bits_8_9_%=\n\t"
  106055. "\n"
  106056. "L_sp_256_num_bits_8_23_%=:\n\t"
  106057. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106058. "lsrs r5, r3, #16\n\t"
  106059. #else
  106060. "lsr r5, r3, #16\n\t"
  106061. #endif
  106062. #ifdef WOLFSSL_KEIL
  106063. "ands r5, r5, r6\n\t"
  106064. #elif defined(__clang__)
  106065. "ands r5, r6\n\t"
  106066. #else
  106067. "and r5, r6\n\t"
  106068. #endif
  106069. "cmp r5, #0\n\t"
  106070. "beq L_sp_256_num_bits_8_22_%=\n\t"
  106071. "movs r2, #16\n\t"
  106072. "ldrb r4, [%[table], r5]\n\t"
  106073. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106074. "adds r2, r2, r4\n\t"
  106075. #else
  106076. "add r2, r2, r4\n\t"
  106077. #endif
  106078. "b L_sp_256_num_bits_8_9_%=\n\t"
  106079. "\n"
  106080. "L_sp_256_num_bits_8_22_%=:\n\t"
  106081. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106082. "lsrs r5, r3, #8\n\t"
  106083. #else
  106084. "lsr r5, r3, #8\n\t"
  106085. #endif
  106086. #ifdef WOLFSSL_KEIL
  106087. "ands r5, r5, r6\n\t"
  106088. #elif defined(__clang__)
  106089. "ands r5, r6\n\t"
  106090. #else
  106091. "and r5, r6\n\t"
  106092. #endif
  106093. "cmp r5, #0\n\t"
  106094. "beq L_sp_256_num_bits_8_21_%=\n\t"
  106095. "movs r2, #8\n\t"
  106096. "ldrb r4, [%[table], r5]\n\t"
  106097. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106098. "adds r2, r2, r4\n\t"
  106099. #else
  106100. "add r2, r2, r4\n\t"
  106101. #endif
  106102. "b L_sp_256_num_bits_8_9_%=\n\t"
  106103. "\n"
  106104. "L_sp_256_num_bits_8_21_%=:\n\t"
  106105. "movs r5, r3\n\t"
  106106. #ifdef WOLFSSL_KEIL
  106107. "ands r5, r5, r6\n\t"
  106108. #elif defined(__clang__)
  106109. "ands r5, r6\n\t"
  106110. #else
  106111. "and r5, r6\n\t"
  106112. #endif
  106113. "cmp r5, #0\n\t"
  106114. "beq L_sp_256_num_bits_8_20_%=\n\t"
  106115. "movs r2, #0\n\t"
  106116. "ldrb r4, [%[table], r5]\n\t"
  106117. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106118. "adds r2, r2, r4\n\t"
  106119. #else
  106120. "add r2, r2, r4\n\t"
  106121. #endif
  106122. "b L_sp_256_num_bits_8_9_%=\n\t"
  106123. "\n"
  106124. "L_sp_256_num_bits_8_20_%=:\n\t"
  106125. "\n"
  106126. "L_sp_256_num_bits_8_9_%=:\n\t"
  106127. "movs %[a], r2\n\t"
  106128. : [a] "+l" (a), [table] "+l" (table)
  106129. :
  106130. : "memory", "r2", "r3", "r4", "r5", "r6"
  106131. );
  106132. return (uint32_t)(size_t)a;
  106133. }
  106134. /* Non-constant time modular inversion.
  106135. *
  106136. * @param [out] r Resulting number.
  106137. * @param [in] a Number to invert.
  106138. * @param [in] m Modulus.
  106139. * @return MP_OKAY on success.
  106140. */
  106141. static int sp_256_mod_inv_8(sp_digit* r, const sp_digit* a, const sp_digit* m)
  106142. {
  106143. sp_digit u[8];
  106144. sp_digit v[8];
  106145. sp_digit b[8];
  106146. sp_digit d[8];
  106147. int ut, vt;
  106148. sp_digit o;
  106149. XMEMCPY(u, m, sizeof(u));
  106150. XMEMCPY(v, a, sizeof(v));
  106151. ut = sp_256_num_bits_8(u);
  106152. vt = sp_256_num_bits_8(v);
  106153. XMEMSET(b, 0, sizeof(b));
  106154. if ((v[0] & 1) == 0) {
  106155. sp_256_rshift1_8(v, v);
  106156. XMEMCPY(d, m, sizeof(u));
  106157. d[0] += 1;
  106158. sp_256_rshift1_8(d, d);
  106159. vt--;
  106160. while ((v[0] & 1) == 0) {
  106161. sp_256_rshift1_8(v, v);
  106162. sp_256_div2_mod_8(d, d, m);
  106163. vt--;
  106164. }
  106165. }
  106166. else {
  106167. XMEMSET(d+1, 0, sizeof(d)-sizeof(sp_digit));
  106168. d[0] = 1;
  106169. }
  106170. while (ut > 1 && vt > 1) {
  106171. if (ut > vt || (ut == vt && sp_256_cmp_8(u, v) >= 0)) {
  106172. sp_256_sub_8(u, u, v);
  106173. o = sp_256_sub_8(b, b, d);
  106174. if (o != 0)
  106175. sp_256_add_8(b, b, m);
  106176. ut = sp_256_num_bits_8(u);
  106177. do {
  106178. sp_256_rshift1_8(u, u);
  106179. sp_256_div2_mod_8(b, b, m);
  106180. ut--;
  106181. }
  106182. while (ut > 0 && (u[0] & 1) == 0);
  106183. }
  106184. else {
  106185. sp_256_sub_8(v, v, u);
  106186. o = sp_256_sub_8(d, d, b);
  106187. if (o != 0)
  106188. sp_256_add_8(d, d, m);
  106189. vt = sp_256_num_bits_8(v);
  106190. do {
  106191. sp_256_rshift1_8(v, v);
  106192. sp_256_div2_mod_8(d, d, m);
  106193. vt--;
  106194. }
  106195. while (vt > 0 && (v[0] & 1) == 0);
  106196. }
  106197. }
  106198. if (ut == 1)
  106199. XMEMCPY(r, b, sizeof(b));
  106200. else
  106201. XMEMCPY(r, d, sizeof(d));
  106202. return MP_OKAY;
  106203. }
  106204. #endif /* WOLFSSL_SP_SMALL */
  106205. /* Add point p1 into point p2. Handles p1 == p2 and result at infinity.
  106206. *
  106207. * p1 First point to add and holds result.
  106208. * p2 Second point to add.
  106209. * tmp Temporary storage for intermediate numbers.
  106210. */
  106211. static void sp_256_add_points_8(sp_point_256* p1, const sp_point_256* p2,
  106212. sp_digit* tmp)
  106213. {
  106214. sp_256_proj_point_add_8(p1, p1, p2, tmp);
  106215. if (sp_256_iszero_8(p1->z)) {
  106216. if (sp_256_iszero_8(p1->x) && sp_256_iszero_8(p1->y)) {
  106217. sp_256_proj_point_dbl_8(p1, p2, tmp);
  106218. }
  106219. else {
  106220. /* Y ordinate is not used from here - don't set. */
  106221. p1->x[0] = 0;
  106222. p1->x[1] = 0;
  106223. p1->x[2] = 0;
  106224. p1->x[3] = 0;
  106225. p1->x[4] = 0;
  106226. p1->x[5] = 0;
  106227. p1->x[6] = 0;
  106228. p1->x[7] = 0;
  106229. XMEMCPY(p1->z, p256_norm_mod, sizeof(p256_norm_mod));
  106230. }
  106231. }
  106232. }
  106233. /* Calculate the verification point: [e/s]G + [r/s]Q
  106234. *
  106235. * p1 Calculated point.
  106236. * p2 Public point and temporary.
  106237. * s Second part of signature as a number.
  106238. * u1 Temporary number.
  106239. * u2 Temproray number.
  106240. * heap Heap to use for allocation.
  106241. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  106242. */
  106243. static int sp_256_calc_vfy_point_8(sp_point_256* p1, sp_point_256* p2,
  106244. sp_digit* s, sp_digit* u1, sp_digit* u2, sp_digit* tmp, void* heap)
  106245. {
  106246. int err;
  106247. #ifndef WOLFSSL_SP_SMALL
  106248. err = sp_256_mod_inv_8(s, s, p256_order);
  106249. if (err == MP_OKAY)
  106250. #endif /* !WOLFSSL_SP_SMALL */
  106251. {
  106252. sp_256_mul_8(s, s, p256_norm_order);
  106253. err = sp_256_mod_8(s, s, p256_order);
  106254. }
  106255. if (err == MP_OKAY) {
  106256. sp_256_norm_8(s);
  106257. #ifdef WOLFSSL_SP_SMALL
  106258. {
  106259. sp_256_mont_inv_order_8(s, s, tmp);
  106260. sp_256_mont_mul_order_8(u1, u1, s);
  106261. sp_256_mont_mul_order_8(u2, u2, s);
  106262. }
  106263. #else
  106264. {
  106265. sp_256_mont_mul_order_8(u1, u1, s);
  106266. sp_256_mont_mul_order_8(u2, u2, s);
  106267. }
  106268. #endif /* WOLFSSL_SP_SMALL */
  106269. {
  106270. err = sp_256_ecc_mulmod_base_8(p1, u1, 0, 0, heap);
  106271. }
  106272. }
  106273. if ((err == MP_OKAY) && sp_256_iszero_8(p1->z)) {
  106274. p1->infinity = 1;
  106275. }
  106276. if (err == MP_OKAY) {
  106277. err = sp_256_ecc_mulmod_8(p2, p2, u2, 0, 0, heap);
  106278. }
  106279. if ((err == MP_OKAY) && sp_256_iszero_8(p2->z)) {
  106280. p2->infinity = 1;
  106281. }
  106282. if (err == MP_OKAY) {
  106283. sp_256_add_points_8(p1, p2, tmp);
  106284. }
  106285. return err;
  106286. }
  106287. #ifdef HAVE_ECC_VERIFY
  106288. /* Verify the signature values with the hash and public key.
  106289. * e = Truncate(hash, 256)
  106290. * u1 = e/s mod order
  106291. * u2 = r/s mod order
  106292. * r == (u1.G + u2.Q)->x mod order
  106293. * Optimization: Leave point in projective form.
  106294. * (x, y, 1) == (x' / z'*z', y' / z'*z'*z', z' / z')
  106295. * (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x'
  106296. * The hash is truncated to the first 256 bits.
  106297. *
  106298. * hash Hash to sign.
  106299. * hashLen Length of the hash data.
  106300. * rng Random number generator.
  106301. * priv Private part of key - scalar.
  106302. * rm First part of result as an mp_int.
  106303. * sm Sirst part of result as an mp_int.
  106304. * heap Heap to use for allocation.
  106305. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  106306. */
  106307. int sp_ecc_verify_256(const byte* hash, word32 hashLen, const mp_int* pX,
  106308. const mp_int* pY, const mp_int* pZ, const mp_int* rm, const mp_int* sm,
  106309. int* res, void* heap)
  106310. {
  106311. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  106312. sp_digit* u1 = NULL;
  106313. sp_point_256* p1 = NULL;
  106314. #else
  106315. sp_digit u1[18 * 8];
  106316. sp_point_256 p1[2];
  106317. #endif
  106318. sp_digit* u2 = NULL;
  106319. sp_digit* s = NULL;
  106320. sp_digit* tmp = NULL;
  106321. sp_point_256* p2 = NULL;
  106322. sp_digit carry;
  106323. sp_int32 c = 0;
  106324. int err = MP_OKAY;
  106325. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  106326. if (err == MP_OKAY) {
  106327. p1 = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap,
  106328. DYNAMIC_TYPE_ECC);
  106329. if (p1 == NULL)
  106330. err = MEMORY_E;
  106331. }
  106332. if (err == MP_OKAY) {
  106333. u1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 18 * 8, heap,
  106334. DYNAMIC_TYPE_ECC);
  106335. if (u1 == NULL)
  106336. err = MEMORY_E;
  106337. }
  106338. #endif
  106339. if (err == MP_OKAY) {
  106340. u2 = u1 + 2 * 8;
  106341. s = u1 + 4 * 8;
  106342. tmp = u1 + 6 * 8;
  106343. p2 = p1 + 1;
  106344. if (hashLen > 32U) {
  106345. hashLen = 32U;
  106346. }
  106347. sp_256_from_bin(u1, 8, hash, (int)hashLen);
  106348. sp_256_from_mp(u2, 8, rm);
  106349. sp_256_from_mp(s, 8, sm);
  106350. sp_256_from_mp(p2->x, 8, pX);
  106351. sp_256_from_mp(p2->y, 8, pY);
  106352. sp_256_from_mp(p2->z, 8, pZ);
  106353. err = sp_256_calc_vfy_point_8(p1, p2, s, u1, u2, tmp, heap);
  106354. }
  106355. if (err == MP_OKAY) {
  106356. /* (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x' */
  106357. /* Reload r and convert to Montgomery form. */
  106358. sp_256_from_mp(u2, 8, rm);
  106359. err = sp_256_mod_mul_norm_8(u2, u2, p256_mod);
  106360. }
  106361. if (err == MP_OKAY) {
  106362. /* u1 = r.z'.z' mod prime */
  106363. sp_256_mont_sqr_8(p1->z, p1->z, p256_mod, p256_mp_mod);
  106364. sp_256_mont_mul_8(u1, u2, p1->z, p256_mod, p256_mp_mod);
  106365. *res = (int)(sp_256_cmp_8(p1->x, u1) == 0);
  106366. if (*res == 0) {
  106367. /* Reload r and add order. */
  106368. sp_256_from_mp(u2, 8, rm);
  106369. carry = sp_256_add_8(u2, u2, p256_order);
  106370. /* Carry means result is greater than mod and is not valid. */
  106371. if (carry == 0) {
  106372. sp_256_norm_8(u2);
  106373. /* Compare with mod and if greater or equal then not valid. */
  106374. c = sp_256_cmp_8(u2, p256_mod);
  106375. }
  106376. }
  106377. if ((*res == 0) && (c < 0)) {
  106378. /* Convert to Montogomery form */
  106379. err = sp_256_mod_mul_norm_8(u2, u2, p256_mod);
  106380. if (err == MP_OKAY) {
  106381. /* u1 = (r + 1*order).z'.z' mod prime */
  106382. {
  106383. sp_256_mont_mul_8(u1, u2, p1->z, p256_mod, p256_mp_mod);
  106384. }
  106385. *res = (sp_256_cmp_8(p1->x, u1) == 0);
  106386. }
  106387. }
  106388. }
  106389. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  106390. if (u1 != NULL)
  106391. XFREE(u1, heap, DYNAMIC_TYPE_ECC);
  106392. if (p1 != NULL)
  106393. XFREE(p1, heap, DYNAMIC_TYPE_ECC);
  106394. #endif
  106395. return err;
  106396. }
  106397. #ifdef WOLFSSL_SP_NONBLOCK
  106398. typedef struct sp_ecc_verify_256_ctx {
  106399. int state;
  106400. union {
  106401. sp_256_ecc_mulmod_8_ctx mulmod_ctx;
  106402. sp_256_mont_inv_order_8_ctx mont_inv_order_ctx;
  106403. sp_256_proj_point_dbl_8_ctx dbl_ctx;
  106404. sp_256_proj_point_add_8_ctx add_ctx;
  106405. };
  106406. sp_digit u1[2*8];
  106407. sp_digit u2[2*8];
  106408. sp_digit s[2*8];
  106409. sp_digit tmp[2*8 * 6];
  106410. sp_point_256 p1;
  106411. sp_point_256 p2;
  106412. } sp_ecc_verify_256_ctx;
  106413. int sp_ecc_verify_256_nb(sp_ecc_ctx_t* sp_ctx, const byte* hash,
  106414. word32 hashLen, const mp_int* pX, const mp_int* pY, const mp_int* pZ,
  106415. const mp_int* rm, const mp_int* sm, int* res, void* heap)
  106416. {
  106417. int err = FP_WOULDBLOCK;
  106418. sp_ecc_verify_256_ctx* ctx = (sp_ecc_verify_256_ctx*)sp_ctx->data;
  106419. typedef char ctx_size_test[sizeof(sp_ecc_verify_256_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  106420. (void)sizeof(ctx_size_test);
  106421. switch (ctx->state) {
  106422. case 0: /* INIT */
  106423. if (hashLen > 32U) {
  106424. hashLen = 32U;
  106425. }
  106426. sp_256_from_bin(ctx->u1, 8, hash, (int)hashLen);
  106427. sp_256_from_mp(ctx->u2, 8, rm);
  106428. sp_256_from_mp(ctx->s, 8, sm);
  106429. sp_256_from_mp(ctx->p2.x, 8, pX);
  106430. sp_256_from_mp(ctx->p2.y, 8, pY);
  106431. sp_256_from_mp(ctx->p2.z, 8, pZ);
  106432. ctx->state = 1;
  106433. break;
  106434. case 1: /* NORMS0 */
  106435. sp_256_mul_8(ctx->s, ctx->s, p256_norm_order);
  106436. err = sp_256_mod_8(ctx->s, ctx->s, p256_order);
  106437. if (err == MP_OKAY)
  106438. ctx->state = 2;
  106439. break;
  106440. case 2: /* NORMS1 */
  106441. sp_256_norm_8(ctx->s);
  106442. XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
  106443. ctx->state = 3;
  106444. break;
  106445. case 3: /* NORMS2 */
  106446. err = sp_256_mont_inv_order_8_nb((sp_ecc_ctx_t*)&ctx->mont_inv_order_ctx, ctx->s, ctx->s, ctx->tmp);
  106447. if (err == MP_OKAY) {
  106448. ctx->state = 4;
  106449. }
  106450. break;
  106451. case 4: /* NORMS3 */
  106452. sp_256_mont_mul_order_8(ctx->u1, ctx->u1, ctx->s);
  106453. ctx->state = 5;
  106454. break;
  106455. case 5: /* NORMS4 */
  106456. sp_256_mont_mul_order_8(ctx->u2, ctx->u2, ctx->s);
  106457. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  106458. ctx->state = 6;
  106459. break;
  106460. case 6: /* MULBASE */
  106461. err = sp_256_ecc_mulmod_8_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx, &ctx->p1, &p256_base, ctx->u1, 0, 0, heap);
  106462. if (err == MP_OKAY) {
  106463. if (sp_256_iszero_8(ctx->p1.z)) {
  106464. ctx->p1.infinity = 1;
  106465. }
  106466. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  106467. ctx->state = 7;
  106468. }
  106469. break;
  106470. case 7: /* MULMOD */
  106471. err = sp_256_ecc_mulmod_8_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx, &ctx->p2, &ctx->p2, ctx->u2, 0, 0, heap);
  106472. if (err == MP_OKAY) {
  106473. if (sp_256_iszero_8(ctx->p2.z)) {
  106474. ctx->p2.infinity = 1;
  106475. }
  106476. XMEMSET(&ctx->add_ctx, 0, sizeof(ctx->add_ctx));
  106477. ctx->state = 8;
  106478. }
  106479. break;
  106480. case 8: /* ADD */
  106481. err = sp_256_proj_point_add_8_nb((sp_ecc_ctx_t*)&ctx->add_ctx, &ctx->p1, &ctx->p1, &ctx->p2, ctx->tmp);
  106482. if (err == MP_OKAY)
  106483. ctx->state = 9;
  106484. break;
  106485. case 9: /* MONT */
  106486. /* (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x' */
  106487. /* Reload r and convert to Montgomery form. */
  106488. sp_256_from_mp(ctx->u2, 8, rm);
  106489. err = sp_256_mod_mul_norm_8(ctx->u2, ctx->u2, p256_mod);
  106490. if (err == MP_OKAY)
  106491. ctx->state = 10;
  106492. break;
  106493. case 10: /* SQR */
  106494. /* u1 = r.z'.z' mod prime */
  106495. sp_256_mont_sqr_8(ctx->p1.z, ctx->p1.z, p256_mod, p256_mp_mod);
  106496. ctx->state = 11;
  106497. break;
  106498. case 11: /* MUL */
  106499. sp_256_mont_mul_8(ctx->u1, ctx->u2, ctx->p1.z, p256_mod, p256_mp_mod);
  106500. ctx->state = 12;
  106501. break;
  106502. case 12: /* RES */
  106503. {
  106504. sp_int32 c = 0;
  106505. err = MP_OKAY; /* math okay, now check result */
  106506. *res = (int)(sp_256_cmp_8(ctx->p1.x, ctx->u1) == 0);
  106507. if (*res == 0) {
  106508. sp_digit carry;
  106509. /* Reload r and add order. */
  106510. sp_256_from_mp(ctx->u2, 8, rm);
  106511. carry = sp_256_add_8(ctx->u2, ctx->u2, p256_order);
  106512. /* Carry means result is greater than mod and is not valid. */
  106513. if (carry == 0) {
  106514. sp_256_norm_8(ctx->u2);
  106515. /* Compare with mod and if greater or equal then not valid. */
  106516. c = sp_256_cmp_8(ctx->u2, p256_mod);
  106517. }
  106518. }
  106519. if ((*res == 0) && (c < 0)) {
  106520. /* Convert to Montogomery form */
  106521. err = sp_256_mod_mul_norm_8(ctx->u2, ctx->u2, p256_mod);
  106522. if (err == MP_OKAY) {
  106523. /* u1 = (r + 1*order).z'.z' mod prime */
  106524. sp_256_mont_mul_8(ctx->u1, ctx->u2, ctx->p1.z, p256_mod,
  106525. p256_mp_mod);
  106526. *res = (int)(sp_256_cmp_8(ctx->p1.x, ctx->u1) == 0);
  106527. }
  106528. }
  106529. break;
  106530. }
  106531. } /* switch */
  106532. if (err == MP_OKAY && ctx->state != 12) {
  106533. err = FP_WOULDBLOCK;
  106534. }
  106535. return err;
  106536. }
  106537. #endif /* WOLFSSL_SP_NONBLOCK */
  106538. #endif /* HAVE_ECC_VERIFY */
  106539. #ifdef HAVE_ECC_CHECK_KEY
  106540. /* Check that the x and y oridinates are a valid point on the curve.
  106541. *
  106542. * point EC point.
  106543. * heap Heap to use if dynamically allocating.
  106544. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  106545. * not on the curve and MP_OKAY otherwise.
  106546. */
  106547. static int sp_256_ecc_is_point_8(const sp_point_256* point,
  106548. void* heap)
  106549. {
  106550. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  106551. sp_digit* t1 = NULL;
  106552. #else
  106553. sp_digit t1[8 * 4];
  106554. #endif
  106555. sp_digit* t2 = NULL;
  106556. int err = MP_OKAY;
  106557. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  106558. t1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 8 * 4, heap, DYNAMIC_TYPE_ECC);
  106559. if (t1 == NULL)
  106560. err = MEMORY_E;
  106561. #endif
  106562. (void)heap;
  106563. if (err == MP_OKAY) {
  106564. t2 = t1 + 2 * 8;
  106565. sp_256_sqr_8(t1, point->y);
  106566. (void)sp_256_mod_8(t1, t1, p256_mod);
  106567. sp_256_sqr_8(t2, point->x);
  106568. (void)sp_256_mod_8(t2, t2, p256_mod);
  106569. sp_256_mul_8(t2, t2, point->x);
  106570. (void)sp_256_mod_8(t2, t2, p256_mod);
  106571. (void)sp_256_sub_8(t2, p256_mod, t2);
  106572. sp_256_mont_add_8(t1, t1, t2, p256_mod);
  106573. sp_256_mont_add_8(t1, t1, point->x, p256_mod);
  106574. sp_256_mont_add_8(t1, t1, point->x, p256_mod);
  106575. sp_256_mont_add_8(t1, t1, point->x, p256_mod);
  106576. if (sp_256_cmp_8(t1, p256_b) != 0) {
  106577. err = MP_VAL;
  106578. }
  106579. }
  106580. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  106581. if (t1 != NULL)
  106582. XFREE(t1, heap, DYNAMIC_TYPE_ECC);
  106583. #endif
  106584. return err;
  106585. }
  106586. /* Check that the x and y oridinates are a valid point on the curve.
  106587. *
  106588. * pX X ordinate of EC point.
  106589. * pY Y ordinate of EC point.
  106590. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  106591. * not on the curve and MP_OKAY otherwise.
  106592. */
  106593. int sp_ecc_is_point_256(const mp_int* pX, const mp_int* pY)
  106594. {
  106595. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  106596. sp_point_256* pub = NULL;
  106597. #else
  106598. sp_point_256 pub[1];
  106599. #endif
  106600. const byte one[1] = { 1 };
  106601. int err = MP_OKAY;
  106602. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  106603. pub = (sp_point_256*)XMALLOC(sizeof(sp_point_256), NULL,
  106604. DYNAMIC_TYPE_ECC);
  106605. if (pub == NULL)
  106606. err = MEMORY_E;
  106607. #endif
  106608. if (err == MP_OKAY) {
  106609. sp_256_from_mp(pub->x, 8, pX);
  106610. sp_256_from_mp(pub->y, 8, pY);
  106611. sp_256_from_bin(pub->z, 8, one, (int)sizeof(one));
  106612. err = sp_256_ecc_is_point_8(pub, NULL);
  106613. }
  106614. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  106615. if (pub != NULL)
  106616. XFREE(pub, NULL, DYNAMIC_TYPE_ECC);
  106617. #endif
  106618. return err;
  106619. }
  106620. /* Check that the private scalar generates the EC point (px, py), the point is
  106621. * on the curve and the point has the correct order.
  106622. *
  106623. * pX X ordinate of EC point.
  106624. * pY Y ordinate of EC point.
  106625. * privm Private scalar that generates EC point.
  106626. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  106627. * not on the curve, ECC_INF_E if the point does not have the correct order,
  106628. * ECC_PRIV_KEY_E when the private scalar doesn't generate the EC point and
  106629. * MP_OKAY otherwise.
  106630. */
  106631. int sp_ecc_check_key_256(const mp_int* pX, const mp_int* pY,
  106632. const mp_int* privm, void* heap)
  106633. {
  106634. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  106635. sp_digit* priv = NULL;
  106636. sp_point_256* pub = NULL;
  106637. #else
  106638. sp_digit priv[8];
  106639. sp_point_256 pub[2];
  106640. #endif
  106641. sp_point_256* p = NULL;
  106642. const byte one[1] = { 1 };
  106643. int err = MP_OKAY;
  106644. /* Quick check the lengs of public key ordinates and private key are in
  106645. * range. Proper check later.
  106646. */
  106647. if (((mp_count_bits(pX) > 256) ||
  106648. (mp_count_bits(pY) > 256) ||
  106649. ((privm != NULL) && (mp_count_bits(privm) > 256)))) {
  106650. err = ECC_OUT_OF_RANGE_E;
  106651. }
  106652. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  106653. if (err == MP_OKAY) {
  106654. pub = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap,
  106655. DYNAMIC_TYPE_ECC);
  106656. if (pub == NULL)
  106657. err = MEMORY_E;
  106658. }
  106659. if (err == MP_OKAY && privm) {
  106660. priv = (sp_digit*)XMALLOC(sizeof(sp_digit) * 8, heap,
  106661. DYNAMIC_TYPE_ECC);
  106662. if (priv == NULL)
  106663. err = MEMORY_E;
  106664. }
  106665. #endif
  106666. if (err == MP_OKAY) {
  106667. p = pub + 1;
  106668. sp_256_from_mp(pub->x, 8, pX);
  106669. sp_256_from_mp(pub->y, 8, pY);
  106670. sp_256_from_bin(pub->z, 8, one, (int)sizeof(one));
  106671. if (privm)
  106672. sp_256_from_mp(priv, 8, privm);
  106673. /* Check point at infinitiy. */
  106674. if ((sp_256_iszero_8(pub->x) != 0) &&
  106675. (sp_256_iszero_8(pub->y) != 0)) {
  106676. err = ECC_INF_E;
  106677. }
  106678. }
  106679. /* Check range of X and Y */
  106680. if ((err == MP_OKAY) &&
  106681. ((sp_256_cmp_8(pub->x, p256_mod) >= 0) ||
  106682. (sp_256_cmp_8(pub->y, p256_mod) >= 0))) {
  106683. err = ECC_OUT_OF_RANGE_E;
  106684. }
  106685. if (err == MP_OKAY) {
  106686. /* Check point is on curve */
  106687. err = sp_256_ecc_is_point_8(pub, heap);
  106688. }
  106689. if (err == MP_OKAY) {
  106690. /* Point * order = infinity */
  106691. err = sp_256_ecc_mulmod_8(p, pub, p256_order, 1, 1, heap);
  106692. }
  106693. /* Check result is infinity */
  106694. if ((err == MP_OKAY) && ((sp_256_iszero_8(p->x) == 0) ||
  106695. (sp_256_iszero_8(p->y) == 0))) {
  106696. err = ECC_INF_E;
  106697. }
  106698. if (privm) {
  106699. if (err == MP_OKAY) {
  106700. /* Base * private = point */
  106701. err = sp_256_ecc_mulmod_base_8(p, priv, 1, 1, heap);
  106702. }
  106703. /* Check result is public key */
  106704. if ((err == MP_OKAY) &&
  106705. ((sp_256_cmp_8(p->x, pub->x) != 0) ||
  106706. (sp_256_cmp_8(p->y, pub->y) != 0))) {
  106707. err = ECC_PRIV_KEY_E;
  106708. }
  106709. }
  106710. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  106711. if (pub != NULL)
  106712. XFREE(pub, heap, DYNAMIC_TYPE_ECC);
  106713. if (priv != NULL)
  106714. XFREE(priv, heap, DYNAMIC_TYPE_ECC);
  106715. #endif
  106716. return err;
  106717. }
  106718. #endif
  106719. #ifdef WOLFSSL_PUBLIC_ECC_ADD_DBL
  106720. /* Add two projective EC points together.
  106721. * (pX, pY, pZ) + (qX, qY, qZ) = (rX, rY, rZ)
  106722. *
  106723. * pX First EC point's X ordinate.
  106724. * pY First EC point's Y ordinate.
  106725. * pZ First EC point's Z ordinate.
  106726. * qX Second EC point's X ordinate.
  106727. * qY Second EC point's Y ordinate.
  106728. * qZ Second EC point's Z ordinate.
  106729. * rX Resultant EC point's X ordinate.
  106730. * rY Resultant EC point's Y ordinate.
  106731. * rZ Resultant EC point's Z ordinate.
  106732. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  106733. */
  106734. int sp_ecc_proj_add_point_256(mp_int* pX, mp_int* pY, mp_int* pZ,
  106735. mp_int* qX, mp_int* qY, mp_int* qZ,
  106736. mp_int* rX, mp_int* rY, mp_int* rZ)
  106737. {
  106738. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  106739. sp_digit* tmp = NULL;
  106740. sp_point_256* p = NULL;
  106741. #else
  106742. sp_digit tmp[2 * 8 * 6];
  106743. sp_point_256 p[2];
  106744. #endif
  106745. sp_point_256* q = NULL;
  106746. int err = MP_OKAY;
  106747. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  106748. if (err == MP_OKAY) {
  106749. p = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, NULL,
  106750. DYNAMIC_TYPE_ECC);
  106751. if (p == NULL)
  106752. err = MEMORY_E;
  106753. }
  106754. if (err == MP_OKAY) {
  106755. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 8 * 6, NULL,
  106756. DYNAMIC_TYPE_ECC);
  106757. if (tmp == NULL) {
  106758. err = MEMORY_E;
  106759. }
  106760. }
  106761. #endif
  106762. if (err == MP_OKAY) {
  106763. q = p + 1;
  106764. sp_256_from_mp(p->x, 8, pX);
  106765. sp_256_from_mp(p->y, 8, pY);
  106766. sp_256_from_mp(p->z, 8, pZ);
  106767. sp_256_from_mp(q->x, 8, qX);
  106768. sp_256_from_mp(q->y, 8, qY);
  106769. sp_256_from_mp(q->z, 8, qZ);
  106770. p->infinity = sp_256_iszero_8(p->x) &
  106771. sp_256_iszero_8(p->y);
  106772. q->infinity = sp_256_iszero_8(q->x) &
  106773. sp_256_iszero_8(q->y);
  106774. sp_256_proj_point_add_8(p, p, q, tmp);
  106775. }
  106776. if (err == MP_OKAY) {
  106777. err = sp_256_to_mp(p->x, rX);
  106778. }
  106779. if (err == MP_OKAY) {
  106780. err = sp_256_to_mp(p->y, rY);
  106781. }
  106782. if (err == MP_OKAY) {
  106783. err = sp_256_to_mp(p->z, rZ);
  106784. }
  106785. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  106786. if (tmp != NULL)
  106787. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
  106788. if (p != NULL)
  106789. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  106790. #endif
  106791. return err;
  106792. }
  106793. /* Double a projective EC point.
  106794. * (pX, pY, pZ) + (pX, pY, pZ) = (rX, rY, rZ)
  106795. *
  106796. * pX EC point's X ordinate.
  106797. * pY EC point's Y ordinate.
  106798. * pZ EC point's Z ordinate.
  106799. * rX Resultant EC point's X ordinate.
  106800. * rY Resultant EC point's Y ordinate.
  106801. * rZ Resultant EC point's Z ordinate.
  106802. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  106803. */
  106804. int sp_ecc_proj_dbl_point_256(mp_int* pX, mp_int* pY, mp_int* pZ,
  106805. mp_int* rX, mp_int* rY, mp_int* rZ)
  106806. {
  106807. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  106808. sp_digit* tmp = NULL;
  106809. sp_point_256* p = NULL;
  106810. #else
  106811. sp_digit tmp[2 * 8 * 2];
  106812. sp_point_256 p[1];
  106813. #endif
  106814. int err = MP_OKAY;
  106815. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  106816. if (err == MP_OKAY) {
  106817. p = (sp_point_256*)XMALLOC(sizeof(sp_point_256), NULL,
  106818. DYNAMIC_TYPE_ECC);
  106819. if (p == NULL)
  106820. err = MEMORY_E;
  106821. }
  106822. if (err == MP_OKAY) {
  106823. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 8 * 2, NULL,
  106824. DYNAMIC_TYPE_ECC);
  106825. if (tmp == NULL)
  106826. err = MEMORY_E;
  106827. }
  106828. #endif
  106829. if (err == MP_OKAY) {
  106830. sp_256_from_mp(p->x, 8, pX);
  106831. sp_256_from_mp(p->y, 8, pY);
  106832. sp_256_from_mp(p->z, 8, pZ);
  106833. p->infinity = sp_256_iszero_8(p->x) &
  106834. sp_256_iszero_8(p->y);
  106835. sp_256_proj_point_dbl_8(p, p, tmp);
  106836. }
  106837. if (err == MP_OKAY) {
  106838. err = sp_256_to_mp(p->x, rX);
  106839. }
  106840. if (err == MP_OKAY) {
  106841. err = sp_256_to_mp(p->y, rY);
  106842. }
  106843. if (err == MP_OKAY) {
  106844. err = sp_256_to_mp(p->z, rZ);
  106845. }
  106846. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  106847. if (tmp != NULL)
  106848. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
  106849. if (p != NULL)
  106850. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  106851. #endif
  106852. return err;
  106853. }
  106854. /* Map a projective EC point to affine in place.
  106855. * pZ will be one.
  106856. *
  106857. * pX EC point's X ordinate.
  106858. * pY EC point's Y ordinate.
  106859. * pZ EC point's Z ordinate.
  106860. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  106861. */
  106862. int sp_ecc_map_256(mp_int* pX, mp_int* pY, mp_int* pZ)
  106863. {
  106864. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  106865. sp_digit* tmp = NULL;
  106866. sp_point_256* p = NULL;
  106867. #else
  106868. sp_digit tmp[2 * 8 * 4];
  106869. sp_point_256 p[1];
  106870. #endif
  106871. int err = MP_OKAY;
  106872. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  106873. if (err == MP_OKAY) {
  106874. p = (sp_point_256*)XMALLOC(sizeof(sp_point_256), NULL,
  106875. DYNAMIC_TYPE_ECC);
  106876. if (p == NULL)
  106877. err = MEMORY_E;
  106878. }
  106879. if (err == MP_OKAY) {
  106880. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 8 * 4, NULL,
  106881. DYNAMIC_TYPE_ECC);
  106882. if (tmp == NULL)
  106883. err = MEMORY_E;
  106884. }
  106885. #endif
  106886. if (err == MP_OKAY) {
  106887. sp_256_from_mp(p->x, 8, pX);
  106888. sp_256_from_mp(p->y, 8, pY);
  106889. sp_256_from_mp(p->z, 8, pZ);
  106890. p->infinity = sp_256_iszero_8(p->x) &
  106891. sp_256_iszero_8(p->y);
  106892. sp_256_map_8(p, p, tmp);
  106893. }
  106894. if (err == MP_OKAY) {
  106895. err = sp_256_to_mp(p->x, pX);
  106896. }
  106897. if (err == MP_OKAY) {
  106898. err = sp_256_to_mp(p->y, pY);
  106899. }
  106900. if (err == MP_OKAY) {
  106901. err = sp_256_to_mp(p->z, pZ);
  106902. }
  106903. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  106904. if (tmp != NULL)
  106905. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
  106906. if (p != NULL)
  106907. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  106908. #endif
  106909. return err;
  106910. }
  106911. #endif /* WOLFSSL_PUBLIC_ECC_ADD_DBL */
  106912. #ifdef HAVE_COMP_KEY
  106913. /* Find the square root of a number mod the prime of the curve.
  106914. *
  106915. * y The number to operate on and the result.
  106916. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  106917. */
  106918. static int sp_256_mont_sqrt_8(sp_digit* y)
  106919. {
  106920. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  106921. sp_digit* t1 = NULL;
  106922. #else
  106923. sp_digit t1[4 * 8];
  106924. #endif
  106925. sp_digit* t2 = NULL;
  106926. int err = MP_OKAY;
  106927. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  106928. t1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 4 * 8, NULL, DYNAMIC_TYPE_ECC);
  106929. if (t1 == NULL) {
  106930. err = MEMORY_E;
  106931. }
  106932. #endif
  106933. if (err == MP_OKAY) {
  106934. t2 = t1 + 2 * 8;
  106935. {
  106936. /* t2 = y ^ 0x2 */
  106937. sp_256_mont_sqr_8(t2, y, p256_mod, p256_mp_mod);
  106938. /* t1 = y ^ 0x3 */
  106939. sp_256_mont_mul_8(t1, t2, y, p256_mod, p256_mp_mod);
  106940. /* t2 = y ^ 0xc */
  106941. sp_256_mont_sqr_n_8(t2, t1, 2, p256_mod, p256_mp_mod);
  106942. /* t1 = y ^ 0xf */
  106943. sp_256_mont_mul_8(t1, t1, t2, p256_mod, p256_mp_mod);
  106944. /* t2 = y ^ 0xf0 */
  106945. sp_256_mont_sqr_n_8(t2, t1, 4, p256_mod, p256_mp_mod);
  106946. /* t1 = y ^ 0xff */
  106947. sp_256_mont_mul_8(t1, t1, t2, p256_mod, p256_mp_mod);
  106948. /* t2 = y ^ 0xff00 */
  106949. sp_256_mont_sqr_n_8(t2, t1, 8, p256_mod, p256_mp_mod);
  106950. /* t1 = y ^ 0xffff */
  106951. sp_256_mont_mul_8(t1, t1, t2, p256_mod, p256_mp_mod);
  106952. /* t2 = y ^ 0xffff0000 */
  106953. sp_256_mont_sqr_n_8(t2, t1, 16, p256_mod, p256_mp_mod);
  106954. /* t1 = y ^ 0xffffffff */
  106955. sp_256_mont_mul_8(t1, t1, t2, p256_mod, p256_mp_mod);
  106956. /* t1 = y ^ 0xffffffff00000000 */
  106957. sp_256_mont_sqr_n_8(t1, t1, 32, p256_mod, p256_mp_mod);
  106958. /* t1 = y ^ 0xffffffff00000001 */
  106959. sp_256_mont_mul_8(t1, t1, y, p256_mod, p256_mp_mod);
  106960. /* t1 = y ^ 0xffffffff00000001000000000000000000000000 */
  106961. sp_256_mont_sqr_n_8(t1, t1, 96, p256_mod, p256_mp_mod);
  106962. /* t1 = y ^ 0xffffffff00000001000000000000000000000001 */
  106963. sp_256_mont_mul_8(t1, t1, y, p256_mod, p256_mp_mod);
  106964. sp_256_mont_sqr_n_8(y, t1, 94, p256_mod, p256_mp_mod);
  106965. }
  106966. }
  106967. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  106968. if (t1 != NULL)
  106969. XFREE(t1, NULL, DYNAMIC_TYPE_ECC);
  106970. #endif
  106971. return err;
  106972. }
  106973. /* Uncompress the point given the X ordinate.
  106974. *
  106975. * xm X ordinate.
  106976. * odd Whether the Y ordinate is odd.
  106977. * ym Calculated Y ordinate.
  106978. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  106979. */
  106980. int sp_ecc_uncompress_256(mp_int* xm, int odd, mp_int* ym)
  106981. {
  106982. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  106983. sp_digit* x = NULL;
  106984. #else
  106985. sp_digit x[4 * 8];
  106986. #endif
  106987. sp_digit* y = NULL;
  106988. int err = MP_OKAY;
  106989. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  106990. x = (sp_digit*)XMALLOC(sizeof(sp_digit) * 4 * 8, NULL, DYNAMIC_TYPE_ECC);
  106991. if (x == NULL)
  106992. err = MEMORY_E;
  106993. #endif
  106994. if (err == MP_OKAY) {
  106995. y = x + 2 * 8;
  106996. sp_256_from_mp(x, 8, xm);
  106997. err = sp_256_mod_mul_norm_8(x, x, p256_mod);
  106998. }
  106999. if (err == MP_OKAY) {
  107000. /* y = x^3 */
  107001. {
  107002. sp_256_mont_sqr_8(y, x, p256_mod, p256_mp_mod);
  107003. sp_256_mont_mul_8(y, y, x, p256_mod, p256_mp_mod);
  107004. }
  107005. /* y = x^3 - 3x */
  107006. sp_256_mont_sub_8(y, y, x, p256_mod);
  107007. sp_256_mont_sub_8(y, y, x, p256_mod);
  107008. sp_256_mont_sub_8(y, y, x, p256_mod);
  107009. /* y = x^3 - 3x + b */
  107010. err = sp_256_mod_mul_norm_8(x, p256_b, p256_mod);
  107011. }
  107012. if (err == MP_OKAY) {
  107013. sp_256_mont_add_8(y, y, x, p256_mod);
  107014. /* y = sqrt(x^3 - 3x + b) */
  107015. err = sp_256_mont_sqrt_8(y);
  107016. }
  107017. if (err == MP_OKAY) {
  107018. XMEMSET(y + 8, 0, 8U * sizeof(sp_digit));
  107019. sp_256_mont_reduce_8(y, p256_mod, p256_mp_mod);
  107020. if ((((word32)y[0] ^ (word32)odd) & 1U) != 0U) {
  107021. sp_256_mont_sub_8(y, p256_mod, y, p256_mod);
  107022. }
  107023. err = sp_256_to_mp(y, ym);
  107024. }
  107025. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  107026. if (x != NULL)
  107027. XFREE(x, NULL, DYNAMIC_TYPE_ECC);
  107028. #endif
  107029. return err;
  107030. }
  107031. #endif
  107032. #endif /* !WOLFSSL_SP_NO_256 */
  107033. #ifdef WOLFSSL_SP_384
  107034. /* Point structure to use. */
  107035. typedef struct sp_point_384 {
  107036. /* X ordinate of point. */
  107037. sp_digit x[2 * 12];
  107038. /* Y ordinate of point. */
  107039. sp_digit y[2 * 12];
  107040. /* Z ordinate of point. */
  107041. sp_digit z[2 * 12];
  107042. /* Indicates point is at infinity. */
  107043. int infinity;
  107044. } sp_point_384;
  107045. /* The modulus (prime) of the curve P384. */
  107046. static const sp_digit p384_mod[12] = {
  107047. 0xffffffff,0x00000000,0x00000000,0xffffffff,0xfffffffe,0xffffffff,
  107048. 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff
  107049. };
  107050. /* The Montgomery normalizer for modulus of the curve P384. */
  107051. static const sp_digit p384_norm_mod[12] = {
  107052. 0x00000001,0xffffffff,0xffffffff,0x00000000,0x00000001,0x00000000,
  107053. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000
  107054. };
  107055. /* The Montgomery multiplier for modulus of the curve P384. */
  107056. static sp_digit p384_mp_mod = 0x00000001;
  107057. #if defined(WOLFSSL_VALIDATE_ECC_KEYGEN) || defined(HAVE_ECC_SIGN) || \
  107058. defined(HAVE_ECC_VERIFY)
  107059. /* The order of the curve P384. */
  107060. static const sp_digit p384_order[12] = {
  107061. 0xccc52973,0xecec196a,0x48b0a77a,0x581a0db2,0xf4372ddf,0xc7634d81,
  107062. 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff
  107063. };
  107064. #endif
  107065. /* The order of the curve P384 minus 2. */
  107066. static const sp_digit p384_order2[12] = {
  107067. 0xccc52971,0xecec196a,0x48b0a77a,0x581a0db2,0xf4372ddf,0xc7634d81,
  107068. 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff
  107069. };
  107070. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  107071. /* The Montgomery normalizer for order of the curve P384. */
  107072. static const sp_digit p384_norm_order[12] = {
  107073. 0x333ad68d,0x1313e695,0xb74f5885,0xa7e5f24d,0x0bc8d220,0x389cb27e,
  107074. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000
  107075. };
  107076. #endif
  107077. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  107078. /* The Montgomery multiplier for order of the curve P384. */
  107079. static sp_digit p384_mp_order = 0xe88fdc45;
  107080. #endif
  107081. /* The base point of curve P384. */
  107082. static const sp_point_384 p384_base = {
  107083. /* X ordinate */
  107084. {
  107085. 0x72760ab7,0x3a545e38,0xbf55296c,0x5502f25d,0x82542a38,0x59f741e0,
  107086. 0x8ba79b98,0x6e1d3b62,0xf320ad74,0x8eb1c71e,0xbe8b0537,0xaa87ca22,
  107087. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  107088. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  107089. (sp_digit)0, (sp_digit)0
  107090. },
  107091. /* Y ordinate */
  107092. {
  107093. 0x90ea0e5f,0x7a431d7c,0x1d7e819d,0x0a60b1ce,0xb5f0b8c0,0xe9da3113,
  107094. 0x289a147c,0xf8f41dbd,0x9292dc29,0x5d9e98bf,0x96262c6f,0x3617de4a,
  107095. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  107096. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  107097. (sp_digit)0, (sp_digit)0
  107098. },
  107099. /* Z ordinate */
  107100. {
  107101. 0x00000001,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  107102. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  107103. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  107104. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  107105. (sp_digit)0, (sp_digit)0
  107106. },
  107107. /* infinity */
  107108. 0
  107109. };
  107110. #if defined(HAVE_ECC_CHECK_KEY) || defined(HAVE_COMP_KEY)
  107111. static const sp_digit p384_b[12] = {
  107112. 0xd3ec2aef,0x2a85c8ed,0x8a2ed19d,0xc656398d,0x5013875a,0x0314088f,
  107113. 0xfe814112,0x181d9c6e,0xe3f82d19,0x988e056b,0xe23ee7e4,0xb3312fa7
  107114. };
  107115. #endif
  107116. /* Multiply a and b into r. (r = a * b)
  107117. *
  107118. * r A single precision integer.
  107119. * a A single precision integer.
  107120. * b A single precision integer.
  107121. */
  107122. SP_NOINLINE static void sp_384_mul_12(sp_digit* r, const sp_digit* a,
  107123. const sp_digit* b)
  107124. {
  107125. sp_digit t[12 * 2];
  107126. sp_digit* tmp = t;
  107127. __asm__ __volatile__ (
  107128. "movs r3, #0\n\t"
  107129. "movs r4, #0\n\t"
  107130. "mov r8, r3\n\t"
  107131. "mov r11, %[tmp]\n\t"
  107132. "mov r9, %[a]\n\t"
  107133. "mov r10, %[b]\n\t"
  107134. "movs r6, #48\n\t"
  107135. "add r6, r6, r9\n\t"
  107136. "mov r12, r6\n\t"
  107137. "\n"
  107138. "L_sp_384_mul_12_words_%=:\n\t"
  107139. "movs %[tmp], #0\n\t"
  107140. "movs r5, #0\n\t"
  107141. "movs r6, #44\n\t"
  107142. "mov %[a], r8\n\t"
  107143. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107144. "subs %[a], %[a], r6\n\t"
  107145. #else
  107146. "sub %[a], %[a], r6\n\t"
  107147. #endif
  107148. #ifdef WOLFSSL_KEIL
  107149. "sbcs r6, r6, r6\n\t"
  107150. #elif defined(__clang__)
  107151. "sbcs r6, r6\n\t"
  107152. #else
  107153. "sbc r6, r6\n\t"
  107154. #endif
  107155. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107156. "mvns r6, r6\n\t"
  107157. #else
  107158. "mvn r6, r6\n\t"
  107159. #endif
  107160. #ifdef WOLFSSL_KEIL
  107161. "ands %[a], %[a], r6\n\t"
  107162. #elif defined(__clang__)
  107163. "ands %[a], r6\n\t"
  107164. #else
  107165. "and %[a], r6\n\t"
  107166. #endif
  107167. "mov %[b], r8\n\t"
  107168. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107169. "subs %[b], %[b], %[a]\n\t"
  107170. #else
  107171. "sub %[b], %[b], %[a]\n\t"
  107172. #endif
  107173. "add %[a], %[a], r9\n\t"
  107174. "add %[b], %[b], r10\n\t"
  107175. "\n"
  107176. "L_sp_384_mul_12_mul_%=:\n\t"
  107177. "# Multiply Start\n\t"
  107178. "ldrh r6, [%[a]]\n\t"
  107179. "ldrh r7, [%[b]]\n\t"
  107180. #ifdef WOLFSSL_KEIL
  107181. "muls r7, r6, r7\n\t"
  107182. #elif defined(__clang__)
  107183. "muls r7, r6\n\t"
  107184. #else
  107185. "mul r7, r6\n\t"
  107186. #endif
  107187. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107188. "adds r3, r3, r7\n\t"
  107189. #else
  107190. "add r3, r3, r7\n\t"
  107191. #endif
  107192. #ifdef WOLFSSL_KEIL
  107193. "adcs r4, r4, %[tmp]\n\t"
  107194. #elif defined(__clang__)
  107195. "adcs r4, %[tmp]\n\t"
  107196. #else
  107197. "adc r4, %[tmp]\n\t"
  107198. #endif
  107199. #ifdef WOLFSSL_KEIL
  107200. "adcs r5, r5, %[tmp]\n\t"
  107201. #elif defined(__clang__)
  107202. "adcs r5, %[tmp]\n\t"
  107203. #else
  107204. "adc r5, %[tmp]\n\t"
  107205. #endif
  107206. "ldr r7, [%[b]]\n\t"
  107207. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107208. "lsrs r7, r7, #16\n\t"
  107209. #else
  107210. "lsr r7, r7, #16\n\t"
  107211. #endif
  107212. #ifdef WOLFSSL_KEIL
  107213. "muls r6, r7, r6\n\t"
  107214. #elif defined(__clang__)
  107215. "muls r6, r7\n\t"
  107216. #else
  107217. "mul r6, r7\n\t"
  107218. #endif
  107219. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107220. "lsrs r7, r6, #16\n\t"
  107221. #else
  107222. "lsr r7, r6, #16\n\t"
  107223. #endif
  107224. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107225. "lsls r6, r6, #16\n\t"
  107226. #else
  107227. "lsl r6, r6, #16\n\t"
  107228. #endif
  107229. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107230. "adds r3, r3, r6\n\t"
  107231. #else
  107232. "add r3, r3, r6\n\t"
  107233. #endif
  107234. #ifdef WOLFSSL_KEIL
  107235. "adcs r4, r4, r7\n\t"
  107236. #elif defined(__clang__)
  107237. "adcs r4, r7\n\t"
  107238. #else
  107239. "adc r4, r7\n\t"
  107240. #endif
  107241. #ifdef WOLFSSL_KEIL
  107242. "adcs r5, r5, %[tmp]\n\t"
  107243. #elif defined(__clang__)
  107244. "adcs r5, %[tmp]\n\t"
  107245. #else
  107246. "adc r5, %[tmp]\n\t"
  107247. #endif
  107248. "ldr r6, [%[a]]\n\t"
  107249. "ldr r7, [%[b]]\n\t"
  107250. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107251. "lsrs r6, r6, #16\n\t"
  107252. #else
  107253. "lsr r6, r6, #16\n\t"
  107254. #endif
  107255. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107256. "lsrs r7, r7, #16\n\t"
  107257. #else
  107258. "lsr r7, r7, #16\n\t"
  107259. #endif
  107260. #ifdef WOLFSSL_KEIL
  107261. "muls r7, r6, r7\n\t"
  107262. #elif defined(__clang__)
  107263. "muls r7, r6\n\t"
  107264. #else
  107265. "mul r7, r6\n\t"
  107266. #endif
  107267. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107268. "adds r4, r4, r7\n\t"
  107269. #else
  107270. "add r4, r4, r7\n\t"
  107271. #endif
  107272. #ifdef WOLFSSL_KEIL
  107273. "adcs r5, r5, %[tmp]\n\t"
  107274. #elif defined(__clang__)
  107275. "adcs r5, %[tmp]\n\t"
  107276. #else
  107277. "adc r5, %[tmp]\n\t"
  107278. #endif
  107279. "ldrh r7, [%[b]]\n\t"
  107280. #ifdef WOLFSSL_KEIL
  107281. "muls r6, r7, r6\n\t"
  107282. #elif defined(__clang__)
  107283. "muls r6, r7\n\t"
  107284. #else
  107285. "mul r6, r7\n\t"
  107286. #endif
  107287. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107288. "lsrs r7, r6, #16\n\t"
  107289. #else
  107290. "lsr r7, r6, #16\n\t"
  107291. #endif
  107292. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107293. "lsls r6, r6, #16\n\t"
  107294. #else
  107295. "lsl r6, r6, #16\n\t"
  107296. #endif
  107297. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107298. "adds r3, r3, r6\n\t"
  107299. #else
  107300. "add r3, r3, r6\n\t"
  107301. #endif
  107302. #ifdef WOLFSSL_KEIL
  107303. "adcs r4, r4, r7\n\t"
  107304. #elif defined(__clang__)
  107305. "adcs r4, r7\n\t"
  107306. #else
  107307. "adc r4, r7\n\t"
  107308. #endif
  107309. #ifdef WOLFSSL_KEIL
  107310. "adcs r5, r5, %[tmp]\n\t"
  107311. #elif defined(__clang__)
  107312. "adcs r5, %[tmp]\n\t"
  107313. #else
  107314. "adc r5, %[tmp]\n\t"
  107315. #endif
  107316. "# Multiply Done\n\t"
  107317. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107318. "adds %[a], %[a], #4\n\t"
  107319. #else
  107320. "add %[a], %[a], #4\n\t"
  107321. #endif
  107322. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107323. "subs %[b], %[b], #4\n\t"
  107324. #else
  107325. "sub %[b], %[b], #4\n\t"
  107326. #endif
  107327. "cmp %[a], r12\n\t"
  107328. "beq L_sp_384_mul_12_done_mul_%=\n\t"
  107329. "mov r6, r8\n\t"
  107330. "add r6, r6, r9\n\t"
  107331. "cmp %[a], r6\n\t"
  107332. "ble L_sp_384_mul_12_mul_%=\n\t"
  107333. "\n"
  107334. "L_sp_384_mul_12_done_mul_%=:\n\t"
  107335. "mov %[tmp], r11\n\t"
  107336. "mov r7, r8\n\t"
  107337. "str r3, [%[tmp], r7]\n\t"
  107338. "movs r3, r4\n\t"
  107339. "movs r4, r5\n\t"
  107340. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107341. "adds r7, r7, #4\n\t"
  107342. #else
  107343. "add r7, r7, #4\n\t"
  107344. #endif
  107345. "mov r8, r7\n\t"
  107346. "movs r6, #0x58\n\t"
  107347. "cmp r7, r6\n\t"
  107348. "ble L_sp_384_mul_12_words_%=\n\t"
  107349. "str r3, [%[tmp], r7]\n\t"
  107350. "mov %[a], r9\n\t"
  107351. "mov %[b], r10\n\t"
  107352. : [a] "+l" (a), [b] "+l" (b), [tmp] "+l" (tmp)
  107353. :
  107354. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  107355. );
  107356. XMEMCPY(r, t, sizeof(t));
  107357. }
  107358. /* Square a and put result in r. (r = a * a)
  107359. *
  107360. * r A single precision integer.
  107361. * a A single precision integer.
  107362. */
  107363. SP_NOINLINE static void sp_384_sqr_12(sp_digit* r, const sp_digit* a)
  107364. {
  107365. __asm__ __volatile__ (
  107366. "movs r3, #0\n\t"
  107367. "movs r4, #0\n\t"
  107368. "movs r5, #0\n\t"
  107369. "mov r8, r3\n\t"
  107370. "mov r11, %[r]\n\t"
  107371. "movs r6, #0x60\n\t"
  107372. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107373. "negs r6, r6\n\t"
  107374. #else
  107375. "neg r6, r6\n\t"
  107376. #endif
  107377. "add sp, sp, r6\n\t"
  107378. "mov r10, sp\n\t"
  107379. "mov r9, %[a]\n\t"
  107380. "\n"
  107381. "L_sp_384_sqr_12_words_%=:\n\t"
  107382. "movs %[r], #0\n\t"
  107383. "movs r6, #44\n\t"
  107384. "mov %[a], r8\n\t"
  107385. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107386. "subs %[a], %[a], r6\n\t"
  107387. #else
  107388. "sub %[a], %[a], r6\n\t"
  107389. #endif
  107390. #ifdef WOLFSSL_KEIL
  107391. "sbcs r6, r6, r6\n\t"
  107392. #elif defined(__clang__)
  107393. "sbcs r6, r6\n\t"
  107394. #else
  107395. "sbc r6, r6\n\t"
  107396. #endif
  107397. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107398. "mvns r6, r6\n\t"
  107399. #else
  107400. "mvn r6, r6\n\t"
  107401. #endif
  107402. #ifdef WOLFSSL_KEIL
  107403. "ands %[a], %[a], r6\n\t"
  107404. #elif defined(__clang__)
  107405. "ands %[a], r6\n\t"
  107406. #else
  107407. "and %[a], r6\n\t"
  107408. #endif
  107409. "mov r2, r8\n\t"
  107410. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107411. "subs r2, r2, %[a]\n\t"
  107412. #else
  107413. "sub r2, r2, %[a]\n\t"
  107414. #endif
  107415. "add %[a], %[a], r9\n\t"
  107416. "add r2, r2, r9\n\t"
  107417. "\n"
  107418. "L_sp_384_sqr_12_mul_%=:\n\t"
  107419. "cmp r2, %[a]\n\t"
  107420. "beq L_sp_384_sqr_12_sqr_%=\n\t"
  107421. "# Multiply * 2: Start\n\t"
  107422. "ldrh r6, [%[a]]\n\t"
  107423. "ldrh r7, [r2]\n\t"
  107424. #ifdef WOLFSSL_KEIL
  107425. "muls r7, r6, r7\n\t"
  107426. #elif defined(__clang__)
  107427. "muls r7, r6\n\t"
  107428. #else
  107429. "mul r7, r6\n\t"
  107430. #endif
  107431. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107432. "adds r3, r3, r7\n\t"
  107433. #else
  107434. "add r3, r3, r7\n\t"
  107435. #endif
  107436. #ifdef WOLFSSL_KEIL
  107437. "adcs r4, r4, %[r]\n\t"
  107438. #elif defined(__clang__)
  107439. "adcs r4, %[r]\n\t"
  107440. #else
  107441. "adc r4, %[r]\n\t"
  107442. #endif
  107443. #ifdef WOLFSSL_KEIL
  107444. "adcs r5, r5, %[r]\n\t"
  107445. #elif defined(__clang__)
  107446. "adcs r5, %[r]\n\t"
  107447. #else
  107448. "adc r5, %[r]\n\t"
  107449. #endif
  107450. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107451. "adds r3, r3, r7\n\t"
  107452. #else
  107453. "add r3, r3, r7\n\t"
  107454. #endif
  107455. #ifdef WOLFSSL_KEIL
  107456. "adcs r4, r4, %[r]\n\t"
  107457. #elif defined(__clang__)
  107458. "adcs r4, %[r]\n\t"
  107459. #else
  107460. "adc r4, %[r]\n\t"
  107461. #endif
  107462. #ifdef WOLFSSL_KEIL
  107463. "adcs r5, r5, %[r]\n\t"
  107464. #elif defined(__clang__)
  107465. "adcs r5, %[r]\n\t"
  107466. #else
  107467. "adc r5, %[r]\n\t"
  107468. #endif
  107469. "ldr r7, [r2]\n\t"
  107470. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107471. "lsrs r7, r7, #16\n\t"
  107472. #else
  107473. "lsr r7, r7, #16\n\t"
  107474. #endif
  107475. #ifdef WOLFSSL_KEIL
  107476. "muls r6, r7, r6\n\t"
  107477. #elif defined(__clang__)
  107478. "muls r6, r7\n\t"
  107479. #else
  107480. "mul r6, r7\n\t"
  107481. #endif
  107482. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107483. "lsrs r7, r6, #16\n\t"
  107484. #else
  107485. "lsr r7, r6, #16\n\t"
  107486. #endif
  107487. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107488. "lsls r6, r6, #16\n\t"
  107489. #else
  107490. "lsl r6, r6, #16\n\t"
  107491. #endif
  107492. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107493. "adds r3, r3, r6\n\t"
  107494. #else
  107495. "add r3, r3, r6\n\t"
  107496. #endif
  107497. #ifdef WOLFSSL_KEIL
  107498. "adcs r4, r4, r7\n\t"
  107499. #elif defined(__clang__)
  107500. "adcs r4, r7\n\t"
  107501. #else
  107502. "adc r4, r7\n\t"
  107503. #endif
  107504. #ifdef WOLFSSL_KEIL
  107505. "adcs r5, r5, %[r]\n\t"
  107506. #elif defined(__clang__)
  107507. "adcs r5, %[r]\n\t"
  107508. #else
  107509. "adc r5, %[r]\n\t"
  107510. #endif
  107511. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107512. "adds r3, r3, r6\n\t"
  107513. #else
  107514. "add r3, r3, r6\n\t"
  107515. #endif
  107516. #ifdef WOLFSSL_KEIL
  107517. "adcs r4, r4, r7\n\t"
  107518. #elif defined(__clang__)
  107519. "adcs r4, r7\n\t"
  107520. #else
  107521. "adc r4, r7\n\t"
  107522. #endif
  107523. #ifdef WOLFSSL_KEIL
  107524. "adcs r5, r5, %[r]\n\t"
  107525. #elif defined(__clang__)
  107526. "adcs r5, %[r]\n\t"
  107527. #else
  107528. "adc r5, %[r]\n\t"
  107529. #endif
  107530. "ldr r6, [%[a]]\n\t"
  107531. "ldr r7, [r2]\n\t"
  107532. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107533. "lsrs r6, r6, #16\n\t"
  107534. #else
  107535. "lsr r6, r6, #16\n\t"
  107536. #endif
  107537. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107538. "lsrs r7, r7, #16\n\t"
  107539. #else
  107540. "lsr r7, r7, #16\n\t"
  107541. #endif
  107542. #ifdef WOLFSSL_KEIL
  107543. "muls r7, r6, r7\n\t"
  107544. #elif defined(__clang__)
  107545. "muls r7, r6\n\t"
  107546. #else
  107547. "mul r7, r6\n\t"
  107548. #endif
  107549. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107550. "adds r4, r4, r7\n\t"
  107551. #else
  107552. "add r4, r4, r7\n\t"
  107553. #endif
  107554. #ifdef WOLFSSL_KEIL
  107555. "adcs r5, r5, %[r]\n\t"
  107556. #elif defined(__clang__)
  107557. "adcs r5, %[r]\n\t"
  107558. #else
  107559. "adc r5, %[r]\n\t"
  107560. #endif
  107561. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107562. "adds r4, r4, r7\n\t"
  107563. #else
  107564. "add r4, r4, r7\n\t"
  107565. #endif
  107566. #ifdef WOLFSSL_KEIL
  107567. "adcs r5, r5, %[r]\n\t"
  107568. #elif defined(__clang__)
  107569. "adcs r5, %[r]\n\t"
  107570. #else
  107571. "adc r5, %[r]\n\t"
  107572. #endif
  107573. "ldrh r7, [r2]\n\t"
  107574. #ifdef WOLFSSL_KEIL
  107575. "muls r6, r7, r6\n\t"
  107576. #elif defined(__clang__)
  107577. "muls r6, r7\n\t"
  107578. #else
  107579. "mul r6, r7\n\t"
  107580. #endif
  107581. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107582. "lsrs r7, r6, #16\n\t"
  107583. #else
  107584. "lsr r7, r6, #16\n\t"
  107585. #endif
  107586. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107587. "lsls r6, r6, #16\n\t"
  107588. #else
  107589. "lsl r6, r6, #16\n\t"
  107590. #endif
  107591. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107592. "adds r3, r3, r6\n\t"
  107593. #else
  107594. "add r3, r3, r6\n\t"
  107595. #endif
  107596. #ifdef WOLFSSL_KEIL
  107597. "adcs r4, r4, r7\n\t"
  107598. #elif defined(__clang__)
  107599. "adcs r4, r7\n\t"
  107600. #else
  107601. "adc r4, r7\n\t"
  107602. #endif
  107603. #ifdef WOLFSSL_KEIL
  107604. "adcs r5, r5, %[r]\n\t"
  107605. #elif defined(__clang__)
  107606. "adcs r5, %[r]\n\t"
  107607. #else
  107608. "adc r5, %[r]\n\t"
  107609. #endif
  107610. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107611. "adds r3, r3, r6\n\t"
  107612. #else
  107613. "add r3, r3, r6\n\t"
  107614. #endif
  107615. #ifdef WOLFSSL_KEIL
  107616. "adcs r4, r4, r7\n\t"
  107617. #elif defined(__clang__)
  107618. "adcs r4, r7\n\t"
  107619. #else
  107620. "adc r4, r7\n\t"
  107621. #endif
  107622. #ifdef WOLFSSL_KEIL
  107623. "adcs r5, r5, %[r]\n\t"
  107624. #elif defined(__clang__)
  107625. "adcs r5, %[r]\n\t"
  107626. #else
  107627. "adc r5, %[r]\n\t"
  107628. #endif
  107629. "# Multiply * 2: Done\n\t"
  107630. "bal L_sp_384_sqr_12_done_sqr_%=\n\t"
  107631. "\n"
  107632. "L_sp_384_sqr_12_sqr_%=:\n\t"
  107633. "mov r12, r2\n\t"
  107634. "ldr r2, [%[a]]\n\t"
  107635. "# Square: Start\n\t"
  107636. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107637. "lsrs r7, r2, #16\n\t"
  107638. #else
  107639. "lsr r7, r2, #16\n\t"
  107640. #endif
  107641. "uxth r6, r2\n\t"
  107642. #ifdef WOLFSSL_KEIL
  107643. "muls r6, r6, r6\n\t"
  107644. #elif defined(__clang__)
  107645. "muls r6, r6\n\t"
  107646. #else
  107647. "mul r6, r6\n\t"
  107648. #endif
  107649. #ifdef WOLFSSL_KEIL
  107650. "muls r7, r7, r7\n\t"
  107651. #elif defined(__clang__)
  107652. "muls r7, r7\n\t"
  107653. #else
  107654. "mul r7, r7\n\t"
  107655. #endif
  107656. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107657. "adds r3, r3, r6\n\t"
  107658. #else
  107659. "add r3, r3, r6\n\t"
  107660. #endif
  107661. #ifdef WOLFSSL_KEIL
  107662. "adcs r4, r4, r7\n\t"
  107663. #elif defined(__clang__)
  107664. "adcs r4, r7\n\t"
  107665. #else
  107666. "adc r4, r7\n\t"
  107667. #endif
  107668. #ifdef WOLFSSL_KEIL
  107669. "adcs r5, r5, %[r]\n\t"
  107670. #elif defined(__clang__)
  107671. "adcs r5, %[r]\n\t"
  107672. #else
  107673. "adc r5, %[r]\n\t"
  107674. #endif
  107675. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107676. "lsrs r7, r2, #16\n\t"
  107677. #else
  107678. "lsr r7, r2, #16\n\t"
  107679. #endif
  107680. "uxth r6, r2\n\t"
  107681. #ifdef WOLFSSL_KEIL
  107682. "muls r6, r7, r6\n\t"
  107683. #elif defined(__clang__)
  107684. "muls r6, r7\n\t"
  107685. #else
  107686. "mul r6, r7\n\t"
  107687. #endif
  107688. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107689. "lsrs r7, r6, #15\n\t"
  107690. #else
  107691. "lsr r7, r6, #15\n\t"
  107692. #endif
  107693. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107694. "lsls r6, r6, #17\n\t"
  107695. #else
  107696. "lsl r6, r6, #17\n\t"
  107697. #endif
  107698. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107699. "adds r3, r3, r6\n\t"
  107700. #else
  107701. "add r3, r3, r6\n\t"
  107702. #endif
  107703. #ifdef WOLFSSL_KEIL
  107704. "adcs r4, r4, r7\n\t"
  107705. #elif defined(__clang__)
  107706. "adcs r4, r7\n\t"
  107707. #else
  107708. "adc r4, r7\n\t"
  107709. #endif
  107710. #ifdef WOLFSSL_KEIL
  107711. "adcs r5, r5, %[r]\n\t"
  107712. #elif defined(__clang__)
  107713. "adcs r5, %[r]\n\t"
  107714. #else
  107715. "adc r5, %[r]\n\t"
  107716. #endif
  107717. "# Square: Done\n\t"
  107718. "mov r2, r12\n\t"
  107719. "\n"
  107720. "L_sp_384_sqr_12_done_sqr_%=:\n\t"
  107721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107722. "adds %[a], %[a], #4\n\t"
  107723. #else
  107724. "add %[a], %[a], #4\n\t"
  107725. #endif
  107726. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107727. "subs r2, r2, #4\n\t"
  107728. #else
  107729. "sub r2, r2, #4\n\t"
  107730. #endif
  107731. "movs r6, #48\n\t"
  107732. "add r6, r6, r9\n\t"
  107733. "cmp %[a], r6\n\t"
  107734. "beq L_sp_384_sqr_12_done_mul_%=\n\t"
  107735. "cmp %[a], r2\n\t"
  107736. "bgt L_sp_384_sqr_12_done_mul_%=\n\t"
  107737. "mov r7, r8\n\t"
  107738. "add r7, r7, r9\n\t"
  107739. "cmp %[a], r7\n\t"
  107740. "ble L_sp_384_sqr_12_mul_%=\n\t"
  107741. "\n"
  107742. "L_sp_384_sqr_12_done_mul_%=:\n\t"
  107743. "mov %[r], r10\n\t"
  107744. "mov r7, r8\n\t"
  107745. "str r3, [%[r], r7]\n\t"
  107746. "movs r3, r4\n\t"
  107747. "movs r4, r5\n\t"
  107748. "movs r5, #0\n\t"
  107749. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107750. "adds r7, r7, #4\n\t"
  107751. #else
  107752. "add r7, r7, #4\n\t"
  107753. #endif
  107754. "mov r8, r7\n\t"
  107755. "movs r6, #0x58\n\t"
  107756. "cmp r7, r6\n\t"
  107757. "ble L_sp_384_sqr_12_words_%=\n\t"
  107758. "mov %[a], r9\n\t"
  107759. "str r3, [%[r], r7]\n\t"
  107760. "mov %[r], r11\n\t"
  107761. "mov %[a], r10\n\t"
  107762. "movs r3, #0x5c\n\t"
  107763. "\n"
  107764. "L_sp_384_sqr_12_store_%=:\n\t"
  107765. "ldr r6, [%[a], r3]\n\t"
  107766. "str r6, [%[r], r3]\n\t"
  107767. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107768. "subs r3, r3, #4\n\t"
  107769. #else
  107770. "sub r3, r3, #4\n\t"
  107771. #endif
  107772. "bge L_sp_384_sqr_12_store_%=\n\t"
  107773. "movs r6, #0x60\n\t"
  107774. "add sp, sp, r6\n\t"
  107775. : [r] "+l" (r), [a] "+l" (a)
  107776. :
  107777. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  107778. );
  107779. }
  107780. #ifdef WOLFSSL_SP_SMALL
  107781. /* Add b to a into r. (r = a + b)
  107782. *
  107783. * r A single precision integer.
  107784. * a A single precision integer.
  107785. * b A single precision integer.
  107786. */
  107787. SP_NOINLINE static sp_digit sp_384_add_12(sp_digit* r, const sp_digit* a,
  107788. const sp_digit* b)
  107789. {
  107790. __asm__ __volatile__ (
  107791. "movs r6, %[a]\n\t"
  107792. "movs r7, #0\n\t"
  107793. "movs r3, #0\n\t"
  107794. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107795. "adds r6, r6, #48\n\t"
  107796. #else
  107797. "add r6, r6, #48\n\t"
  107798. #endif
  107799. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107800. "subs r7, r7, #1\n\t"
  107801. #else
  107802. "sub r7, r7, #1\n\t"
  107803. #endif
  107804. "\n"
  107805. "L_sp_384_add_12_word_%=:\n\t"
  107806. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107807. "adds r3, r3, r7\n\t"
  107808. #else
  107809. "add r3, r3, r7\n\t"
  107810. #endif
  107811. "ldr r4, [%[a]]\n\t"
  107812. "ldr r5, [%[b]]\n\t"
  107813. #ifdef WOLFSSL_KEIL
  107814. "adcs r4, r4, r5\n\t"
  107815. #elif defined(__clang__)
  107816. "adcs r4, r5\n\t"
  107817. #else
  107818. "adc r4, r5\n\t"
  107819. #endif
  107820. "str r4, [%[r]]\n\t"
  107821. "movs r3, #0\n\t"
  107822. #ifdef WOLFSSL_KEIL
  107823. "adcs r3, r3, r3\n\t"
  107824. #elif defined(__clang__)
  107825. "adcs r3, r3\n\t"
  107826. #else
  107827. "adc r3, r3\n\t"
  107828. #endif
  107829. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107830. "adds %[a], %[a], #4\n\t"
  107831. #else
  107832. "add %[a], %[a], #4\n\t"
  107833. #endif
  107834. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107835. "adds %[b], %[b], #4\n\t"
  107836. #else
  107837. "add %[b], %[b], #4\n\t"
  107838. #endif
  107839. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107840. "adds %[r], %[r], #4\n\t"
  107841. #else
  107842. "add %[r], %[r], #4\n\t"
  107843. #endif
  107844. "cmp %[a], r6\n\t"
  107845. "bne L_sp_384_add_12_word_%=\n\t"
  107846. "movs %[r], r3\n\t"
  107847. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  107848. :
  107849. : "memory", "r3", "r4", "r5", "r6", "r7"
  107850. );
  107851. return (uint32_t)(size_t)r;
  107852. }
  107853. #else
  107854. /* Add b to a into r. (r = a + b)
  107855. *
  107856. * r A single precision integer.
  107857. * a A single precision integer.
  107858. * b A single precision integer.
  107859. */
  107860. SP_NOINLINE static sp_digit sp_384_add_12(sp_digit* r, const sp_digit* a,
  107861. const sp_digit* b)
  107862. {
  107863. __asm__ __volatile__ (
  107864. "ldm %[b]!, {r5, r6}\n\t"
  107865. "ldm %[a]!, {r3, r4}\n\t"
  107866. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107867. "adds r3, r3, r5\n\t"
  107868. #else
  107869. "add r3, r3, r5\n\t"
  107870. #endif
  107871. #ifdef WOLFSSL_KEIL
  107872. "adcs r4, r4, r6\n\t"
  107873. #elif defined(__clang__)
  107874. "adcs r4, r6\n\t"
  107875. #else
  107876. "adc r4, r6\n\t"
  107877. #endif
  107878. "stm %[r]!, {r3, r4}\n\t"
  107879. "ldm %[b]!, {r5, r6}\n\t"
  107880. "ldm %[a]!, {r3, r4}\n\t"
  107881. #ifdef WOLFSSL_KEIL
  107882. "adcs r3, r3, r5\n\t"
  107883. #elif defined(__clang__)
  107884. "adcs r3, r5\n\t"
  107885. #else
  107886. "adc r3, r5\n\t"
  107887. #endif
  107888. #ifdef WOLFSSL_KEIL
  107889. "adcs r4, r4, r6\n\t"
  107890. #elif defined(__clang__)
  107891. "adcs r4, r6\n\t"
  107892. #else
  107893. "adc r4, r6\n\t"
  107894. #endif
  107895. "stm %[r]!, {r3, r4}\n\t"
  107896. "ldm %[b]!, {r5, r6}\n\t"
  107897. "ldm %[a]!, {r3, r4}\n\t"
  107898. #ifdef WOLFSSL_KEIL
  107899. "adcs r3, r3, r5\n\t"
  107900. #elif defined(__clang__)
  107901. "adcs r3, r5\n\t"
  107902. #else
  107903. "adc r3, r5\n\t"
  107904. #endif
  107905. #ifdef WOLFSSL_KEIL
  107906. "adcs r4, r4, r6\n\t"
  107907. #elif defined(__clang__)
  107908. "adcs r4, r6\n\t"
  107909. #else
  107910. "adc r4, r6\n\t"
  107911. #endif
  107912. "stm %[r]!, {r3, r4}\n\t"
  107913. "ldm %[b]!, {r5, r6}\n\t"
  107914. "ldm %[a]!, {r3, r4}\n\t"
  107915. #ifdef WOLFSSL_KEIL
  107916. "adcs r3, r3, r5\n\t"
  107917. #elif defined(__clang__)
  107918. "adcs r3, r5\n\t"
  107919. #else
  107920. "adc r3, r5\n\t"
  107921. #endif
  107922. #ifdef WOLFSSL_KEIL
  107923. "adcs r4, r4, r6\n\t"
  107924. #elif defined(__clang__)
  107925. "adcs r4, r6\n\t"
  107926. #else
  107927. "adc r4, r6\n\t"
  107928. #endif
  107929. "stm %[r]!, {r3, r4}\n\t"
  107930. "ldm %[b]!, {r5, r6}\n\t"
  107931. "ldm %[a]!, {r3, r4}\n\t"
  107932. #ifdef WOLFSSL_KEIL
  107933. "adcs r3, r3, r5\n\t"
  107934. #elif defined(__clang__)
  107935. "adcs r3, r5\n\t"
  107936. #else
  107937. "adc r3, r5\n\t"
  107938. #endif
  107939. #ifdef WOLFSSL_KEIL
  107940. "adcs r4, r4, r6\n\t"
  107941. #elif defined(__clang__)
  107942. "adcs r4, r6\n\t"
  107943. #else
  107944. "adc r4, r6\n\t"
  107945. #endif
  107946. "stm %[r]!, {r3, r4}\n\t"
  107947. "ldm %[b]!, {r5, r6}\n\t"
  107948. "ldm %[a]!, {r3, r4}\n\t"
  107949. #ifdef WOLFSSL_KEIL
  107950. "adcs r3, r3, r5\n\t"
  107951. #elif defined(__clang__)
  107952. "adcs r3, r5\n\t"
  107953. #else
  107954. "adc r3, r5\n\t"
  107955. #endif
  107956. #ifdef WOLFSSL_KEIL
  107957. "adcs r4, r4, r6\n\t"
  107958. #elif defined(__clang__)
  107959. "adcs r4, r6\n\t"
  107960. #else
  107961. "adc r4, r6\n\t"
  107962. #endif
  107963. "stm %[r]!, {r3, r4}\n\t"
  107964. "movs %[r], #0\n\t"
  107965. #ifdef WOLFSSL_KEIL
  107966. "adcs %[r], %[r], %[r]\n\t"
  107967. #elif defined(__clang__)
  107968. "adcs %[r], %[r]\n\t"
  107969. #else
  107970. "adc %[r], %[r]\n\t"
  107971. #endif
  107972. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  107973. :
  107974. : "memory", "r3", "r4", "r5", "r6"
  107975. );
  107976. return (uint32_t)(size_t)r;
  107977. }
  107978. #endif /* WOLFSSL_SP_SMALL */
  107979. #ifdef WOLFSSL_SP_SMALL
  107980. /* Sub b from a into r. (r = a - b)
  107981. *
  107982. * r A single precision integer.
  107983. * a A single precision integer.
  107984. * b A single precision integer.
  107985. */
  107986. SP_NOINLINE static sp_digit sp_384_sub_12(sp_digit* r, const sp_digit* a,
  107987. const sp_digit* b)
  107988. {
  107989. __asm__ __volatile__ (
  107990. "movs r6, %[a]\n\t"
  107991. "movs r3, #0\n\t"
  107992. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107993. "adds r6, r6, #48\n\t"
  107994. #else
  107995. "add r6, r6, #48\n\t"
  107996. #endif
  107997. "\n"
  107998. "L_sp_384_sub_12_word_%=:\n\t"
  107999. "movs r5, #0\n\t"
  108000. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108001. "subs r5, r5, r3\n\t"
  108002. #else
  108003. "sub r5, r5, r3\n\t"
  108004. #endif
  108005. "ldr r4, [%[a]]\n\t"
  108006. "ldr r5, [%[b]]\n\t"
  108007. #ifdef WOLFSSL_KEIL
  108008. "sbcs r4, r4, r5\n\t"
  108009. #elif defined(__clang__)
  108010. "sbcs r4, r5\n\t"
  108011. #else
  108012. "sbc r4, r5\n\t"
  108013. #endif
  108014. "str r4, [%[r]]\n\t"
  108015. #ifdef WOLFSSL_KEIL
  108016. "sbcs r3, r3, r3\n\t"
  108017. #elif defined(__clang__)
  108018. "sbcs r3, r3\n\t"
  108019. #else
  108020. "sbc r3, r3\n\t"
  108021. #endif
  108022. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108023. "adds %[a], %[a], #4\n\t"
  108024. #else
  108025. "add %[a], %[a], #4\n\t"
  108026. #endif
  108027. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108028. "adds %[b], %[b], #4\n\t"
  108029. #else
  108030. "add %[b], %[b], #4\n\t"
  108031. #endif
  108032. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108033. "adds %[r], %[r], #4\n\t"
  108034. #else
  108035. "add %[r], %[r], #4\n\t"
  108036. #endif
  108037. "cmp %[a], r6\n\t"
  108038. "bne L_sp_384_sub_12_word_%=\n\t"
  108039. "movs %[r], r3\n\t"
  108040. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  108041. :
  108042. : "memory", "r3", "r4", "r5", "r6"
  108043. );
  108044. return (uint32_t)(size_t)r;
  108045. }
  108046. #else
  108047. /* Sub b from a into r. (r = a - b)
  108048. *
  108049. * r A single precision integer.
  108050. * a A single precision integer.
  108051. * b A single precision integer.
  108052. */
  108053. SP_NOINLINE static sp_digit sp_384_sub_12(sp_digit* r, const sp_digit* a,
  108054. const sp_digit* b)
  108055. {
  108056. __asm__ __volatile__ (
  108057. "ldm %[b]!, {r5, r6}\n\t"
  108058. "ldm %[a]!, {r3, r4}\n\t"
  108059. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108060. "subs r3, r3, r5\n\t"
  108061. #else
  108062. "sub r3, r3, r5\n\t"
  108063. #endif
  108064. #ifdef WOLFSSL_KEIL
  108065. "sbcs r4, r4, r6\n\t"
  108066. #elif defined(__clang__)
  108067. "sbcs r4, r6\n\t"
  108068. #else
  108069. "sbc r4, r6\n\t"
  108070. #endif
  108071. "stm %[r]!, {r3, r4}\n\t"
  108072. "ldm %[b]!, {r5, r6}\n\t"
  108073. "ldm %[a]!, {r3, r4}\n\t"
  108074. #ifdef WOLFSSL_KEIL
  108075. "sbcs r3, r3, r5\n\t"
  108076. #elif defined(__clang__)
  108077. "sbcs r3, r5\n\t"
  108078. #else
  108079. "sbc r3, r5\n\t"
  108080. #endif
  108081. #ifdef WOLFSSL_KEIL
  108082. "sbcs r4, r4, r6\n\t"
  108083. #elif defined(__clang__)
  108084. "sbcs r4, r6\n\t"
  108085. #else
  108086. "sbc r4, r6\n\t"
  108087. #endif
  108088. "stm %[r]!, {r3, r4}\n\t"
  108089. "ldm %[b]!, {r5, r6}\n\t"
  108090. "ldm %[a]!, {r3, r4}\n\t"
  108091. #ifdef WOLFSSL_KEIL
  108092. "sbcs r3, r3, r5\n\t"
  108093. #elif defined(__clang__)
  108094. "sbcs r3, r5\n\t"
  108095. #else
  108096. "sbc r3, r5\n\t"
  108097. #endif
  108098. #ifdef WOLFSSL_KEIL
  108099. "sbcs r4, r4, r6\n\t"
  108100. #elif defined(__clang__)
  108101. "sbcs r4, r6\n\t"
  108102. #else
  108103. "sbc r4, r6\n\t"
  108104. #endif
  108105. "stm %[r]!, {r3, r4}\n\t"
  108106. "ldm %[b]!, {r5, r6}\n\t"
  108107. "ldm %[a]!, {r3, r4}\n\t"
  108108. #ifdef WOLFSSL_KEIL
  108109. "sbcs r3, r3, r5\n\t"
  108110. #elif defined(__clang__)
  108111. "sbcs r3, r5\n\t"
  108112. #else
  108113. "sbc r3, r5\n\t"
  108114. #endif
  108115. #ifdef WOLFSSL_KEIL
  108116. "sbcs r4, r4, r6\n\t"
  108117. #elif defined(__clang__)
  108118. "sbcs r4, r6\n\t"
  108119. #else
  108120. "sbc r4, r6\n\t"
  108121. #endif
  108122. "stm %[r]!, {r3, r4}\n\t"
  108123. "ldm %[b]!, {r5, r6}\n\t"
  108124. "ldm %[a]!, {r3, r4}\n\t"
  108125. #ifdef WOLFSSL_KEIL
  108126. "sbcs r3, r3, r5\n\t"
  108127. #elif defined(__clang__)
  108128. "sbcs r3, r5\n\t"
  108129. #else
  108130. "sbc r3, r5\n\t"
  108131. #endif
  108132. #ifdef WOLFSSL_KEIL
  108133. "sbcs r4, r4, r6\n\t"
  108134. #elif defined(__clang__)
  108135. "sbcs r4, r6\n\t"
  108136. #else
  108137. "sbc r4, r6\n\t"
  108138. #endif
  108139. "stm %[r]!, {r3, r4}\n\t"
  108140. "ldm %[b]!, {r5, r6}\n\t"
  108141. "ldm %[a]!, {r3, r4}\n\t"
  108142. #ifdef WOLFSSL_KEIL
  108143. "sbcs r3, r3, r5\n\t"
  108144. #elif defined(__clang__)
  108145. "sbcs r3, r5\n\t"
  108146. #else
  108147. "sbc r3, r5\n\t"
  108148. #endif
  108149. #ifdef WOLFSSL_KEIL
  108150. "sbcs r4, r4, r6\n\t"
  108151. #elif defined(__clang__)
  108152. "sbcs r4, r6\n\t"
  108153. #else
  108154. "sbc r4, r6\n\t"
  108155. #endif
  108156. "stm %[r]!, {r3, r4}\n\t"
  108157. #ifdef WOLFSSL_KEIL
  108158. "sbcs %[r], %[r], %[r]\n\t"
  108159. #elif defined(__clang__)
  108160. "sbcs %[r], %[r]\n\t"
  108161. #else
  108162. "sbc %[r], %[r]\n\t"
  108163. #endif
  108164. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  108165. :
  108166. : "memory", "r3", "r4", "r5", "r6"
  108167. );
  108168. return (uint32_t)(size_t)r;
  108169. }
  108170. #endif /* WOLFSSL_SP_SMALL */
  108171. /* Multiply a number by Montgomery normalizer mod modulus (prime).
  108172. *
  108173. * r The resulting Montgomery form number.
  108174. * a The number to convert.
  108175. * m The modulus (prime).
  108176. * returns MEMORY_E when memory allocation fails and MP_OKAY otherwise.
  108177. */
  108178. static int sp_384_mod_mul_norm_12(sp_digit* r, const sp_digit* a, const sp_digit* m)
  108179. {
  108180. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  108181. int64_t* t = NULL;
  108182. #else
  108183. int64_t t[12];
  108184. #endif
  108185. int64_t o;
  108186. int err = MP_OKAY;
  108187. (void)m;
  108188. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  108189. t = (int64_t*)XMALLOC(sizeof(int64_t) * 12, NULL, DYNAMIC_TYPE_ECC);
  108190. if (t == NULL) {
  108191. err = MEMORY_E;
  108192. }
  108193. #endif
  108194. if (err == MP_OKAY) {
  108195. /* 1 0 0 0 0 0 0 0 1 1 0 -1 */
  108196. t[0] = 0 + (int64_t)a[0] + (int64_t)a[8] + (int64_t)a[9] - (int64_t)a[11];
  108197. /* -1 1 0 0 0 0 0 0 -1 0 1 1 */
  108198. t[1] = 0 - (int64_t)a[0] + (int64_t)a[1] - (int64_t)a[8] + (int64_t)a[10] + (int64_t)a[11];
  108199. /* 0 -1 1 0 0 0 0 0 0 -1 0 1 */
  108200. t[2] = 0 - (int64_t)a[1] + (int64_t)a[2] - (int64_t)a[9] + (int64_t)a[11];
  108201. /* 1 0 -1 1 0 0 0 0 1 1 -1 -1 */
  108202. 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];
  108203. /* 1 1 0 -1 1 0 0 0 1 2 1 -2 */
  108204. 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];
  108205. /* 0 1 1 0 -1 1 0 0 0 1 2 1 */
  108206. 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];
  108207. /* 0 0 1 1 0 -1 1 0 0 0 1 2 */
  108208. 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];
  108209. /* 0 0 0 1 1 0 -1 1 0 0 0 1 */
  108210. t[7] = 0 + (int64_t)a[3] + (int64_t)a[4] - (int64_t)a[6] + (int64_t)a[7] + (int64_t)a[11];
  108211. /* 0 0 0 0 1 1 0 -1 1 0 0 0 */
  108212. t[8] = 0 + (int64_t)a[4] + (int64_t)a[5] - (int64_t)a[7] + (int64_t)a[8];
  108213. /* 0 0 0 0 0 1 1 0 -1 1 0 0 */
  108214. t[9] = 0 + (int64_t)a[5] + (int64_t)a[6] - (int64_t)a[8] + (int64_t)a[9];
  108215. /* 0 0 0 0 0 0 1 1 0 -1 1 0 */
  108216. t[10] = 0 + (int64_t)a[6] + (int64_t)a[7] - (int64_t)a[9] + (int64_t)a[10];
  108217. /* 0 0 0 0 0 0 0 1 1 0 -1 1 */
  108218. t[11] = 0 + (int64_t)a[7] + (int64_t)a[8] - (int64_t)a[10] + (int64_t)a[11];
  108219. t[1] += t[0] >> 32; t[0] &= 0xffffffff;
  108220. t[2] += t[1] >> 32; t[1] &= 0xffffffff;
  108221. t[3] += t[2] >> 32; t[2] &= 0xffffffff;
  108222. t[4] += t[3] >> 32; t[3] &= 0xffffffff;
  108223. t[5] += t[4] >> 32; t[4] &= 0xffffffff;
  108224. t[6] += t[5] >> 32; t[5] &= 0xffffffff;
  108225. t[7] += t[6] >> 32; t[6] &= 0xffffffff;
  108226. t[8] += t[7] >> 32; t[7] &= 0xffffffff;
  108227. t[9] += t[8] >> 32; t[8] &= 0xffffffff;
  108228. t[10] += t[9] >> 32; t[9] &= 0xffffffff;
  108229. t[11] += t[10] >> 32; t[10] &= 0xffffffff;
  108230. o = t[11] >> 32; t[11] &= 0xffffffff;
  108231. t[0] += o;
  108232. t[1] -= o;
  108233. t[3] += o;
  108234. t[4] += o;
  108235. t[1] += t[0] >> 32; t[0] &= 0xffffffff;
  108236. t[2] += t[1] >> 32; t[1] &= 0xffffffff;
  108237. t[3] += t[2] >> 32; t[2] &= 0xffffffff;
  108238. t[4] += t[3] >> 32; t[3] &= 0xffffffff;
  108239. t[5] += t[4] >> 32; t[4] &= 0xffffffff;
  108240. t[6] += t[5] >> 32; t[5] &= 0xffffffff;
  108241. t[7] += t[6] >> 32; t[6] &= 0xffffffff;
  108242. t[8] += t[7] >> 32; t[7] &= 0xffffffff;
  108243. t[9] += t[8] >> 32; t[8] &= 0xffffffff;
  108244. t[10] += t[9] >> 32; t[9] &= 0xffffffff;
  108245. t[11] += t[10] >> 32; t[10] &= 0xffffffff;
  108246. r[0] = t[0];
  108247. r[1] = t[1];
  108248. r[2] = t[2];
  108249. r[3] = t[3];
  108250. r[4] = t[4];
  108251. r[5] = t[5];
  108252. r[6] = t[6];
  108253. r[7] = t[7];
  108254. r[8] = t[8];
  108255. r[9] = t[9];
  108256. r[10] = t[10];
  108257. r[11] = t[11];
  108258. }
  108259. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  108260. if (t != NULL)
  108261. XFREE(t, NULL, DYNAMIC_TYPE_ECC);
  108262. #endif
  108263. return err;
  108264. }
  108265. /* Convert an mp_int to an array of sp_digit.
  108266. *
  108267. * r A single precision integer.
  108268. * size Maximum number of bytes to convert
  108269. * a A multi-precision integer.
  108270. */
  108271. static void sp_384_from_mp(sp_digit* r, int size, const mp_int* a)
  108272. {
  108273. #if DIGIT_BIT == 32
  108274. int i;
  108275. int j = 0;
  108276. for (i = 0; i < size; i++) {
  108277. sp_digit mask =
  108278. (((sp_digit)(a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1;
  108279. r[i] = a->dp[j] & mask;
  108280. j += (int)(((sp_digit)1) -
  108281. (((sp_digit)(a->used - i - 2)) >> (SP_WORD_SIZE - 1)));
  108282. }
  108283. #elif DIGIT_BIT > 32
  108284. int i;
  108285. int j = 0;
  108286. word32 s = 0;
  108287. r[0] = 0;
  108288. for (i = 0; i < a->used && j < size; i++) {
  108289. r[j] |= ((sp_digit)a->dp[i] << s);
  108290. r[j] &= 0xffffffff;
  108291. s = 32U - s;
  108292. if (j + 1 >= size) {
  108293. break;
  108294. }
  108295. /* lint allow cast of mismatch word32 and mp_digit */
  108296. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  108297. while ((s + 32U) <= (word32)DIGIT_BIT) {
  108298. s += 32U;
  108299. r[j] &= 0xffffffff;
  108300. if (j + 1 >= size) {
  108301. break;
  108302. }
  108303. if (s < (word32)DIGIT_BIT) {
  108304. /* lint allow cast of mismatch word32 and mp_digit */
  108305. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  108306. }
  108307. else {
  108308. r[++j] = (sp_digit)0;
  108309. }
  108310. }
  108311. s = (word32)DIGIT_BIT - s;
  108312. }
  108313. for (j++; j < size; j++) {
  108314. r[j] = 0;
  108315. }
  108316. #else
  108317. int i;
  108318. int j = 0;
  108319. int s = 0;
  108320. r[0] = 0;
  108321. for (i = 0; i < a->used && j < size; i++) {
  108322. r[j] |= ((sp_digit)a->dp[i]) << s;
  108323. if (s + DIGIT_BIT >= 32) {
  108324. r[j] &= 0xffffffff;
  108325. if (j + 1 >= size) {
  108326. break;
  108327. }
  108328. s = 32 - s;
  108329. if (s == DIGIT_BIT) {
  108330. r[++j] = 0;
  108331. s = 0;
  108332. }
  108333. else {
  108334. r[++j] = a->dp[i] >> s;
  108335. s = DIGIT_BIT - s;
  108336. }
  108337. }
  108338. else {
  108339. s += DIGIT_BIT;
  108340. }
  108341. }
  108342. for (j++; j < size; j++) {
  108343. r[j] = 0;
  108344. }
  108345. #endif
  108346. }
  108347. /* Convert a point of type ecc_point to type sp_point_384.
  108348. *
  108349. * p Point of type sp_point_384 (result).
  108350. * pm Point of type ecc_point.
  108351. */
  108352. static void sp_384_point_from_ecc_point_12(sp_point_384* p,
  108353. const ecc_point* pm)
  108354. {
  108355. XMEMSET(p->x, 0, sizeof(p->x));
  108356. XMEMSET(p->y, 0, sizeof(p->y));
  108357. XMEMSET(p->z, 0, sizeof(p->z));
  108358. sp_384_from_mp(p->x, 12, pm->x);
  108359. sp_384_from_mp(p->y, 12, pm->y);
  108360. sp_384_from_mp(p->z, 12, pm->z);
  108361. p->infinity = 0;
  108362. }
  108363. /* Convert an array of sp_digit to an mp_int.
  108364. *
  108365. * a A single precision integer.
  108366. * r A multi-precision integer.
  108367. */
  108368. static int sp_384_to_mp(const sp_digit* a, mp_int* r)
  108369. {
  108370. int err;
  108371. err = mp_grow(r, (384 + DIGIT_BIT - 1) / DIGIT_BIT);
  108372. if (err == MP_OKAY) { /*lint !e774 case where err is always MP_OKAY*/
  108373. #if DIGIT_BIT == 32
  108374. XMEMCPY(r->dp, a, sizeof(sp_digit) * 12);
  108375. r->used = 12;
  108376. mp_clamp(r);
  108377. #elif DIGIT_BIT < 32
  108378. int i;
  108379. int j = 0;
  108380. int s = 0;
  108381. r->dp[0] = 0;
  108382. for (i = 0; i < 12; i++) {
  108383. r->dp[j] |= (mp_digit)(a[i] << s);
  108384. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  108385. s = DIGIT_BIT - s;
  108386. r->dp[++j] = (mp_digit)(a[i] >> s);
  108387. while (s + DIGIT_BIT <= 32) {
  108388. s += DIGIT_BIT;
  108389. r->dp[j++] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  108390. if (s == SP_WORD_SIZE) {
  108391. r->dp[j] = 0;
  108392. }
  108393. else {
  108394. r->dp[j] = (mp_digit)(a[i] >> s);
  108395. }
  108396. }
  108397. s = 32 - s;
  108398. }
  108399. r->used = (384 + DIGIT_BIT - 1) / DIGIT_BIT;
  108400. mp_clamp(r);
  108401. #else
  108402. int i;
  108403. int j = 0;
  108404. int s = 0;
  108405. r->dp[0] = 0;
  108406. for (i = 0; i < 12; i++) {
  108407. r->dp[j] |= ((mp_digit)a[i]) << s;
  108408. if (s + 32 >= DIGIT_BIT) {
  108409. #if DIGIT_BIT != 32 && DIGIT_BIT != 64
  108410. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  108411. #endif
  108412. s = DIGIT_BIT - s;
  108413. r->dp[++j] = a[i] >> s;
  108414. s = 32 - s;
  108415. }
  108416. else {
  108417. s += 32;
  108418. }
  108419. }
  108420. r->used = (384 + DIGIT_BIT - 1) / DIGIT_BIT;
  108421. mp_clamp(r);
  108422. #endif
  108423. }
  108424. return err;
  108425. }
  108426. /* Convert a point of type sp_point_384 to type ecc_point.
  108427. *
  108428. * p Point of type sp_point_384.
  108429. * pm Point of type ecc_point (result).
  108430. * returns MEMORY_E when allocation of memory in ecc_point fails otherwise
  108431. * MP_OKAY.
  108432. */
  108433. static int sp_384_point_to_ecc_point_12(const sp_point_384* p, ecc_point* pm)
  108434. {
  108435. int err;
  108436. err = sp_384_to_mp(p->x, pm->x);
  108437. if (err == MP_OKAY) {
  108438. err = sp_384_to_mp(p->y, pm->y);
  108439. }
  108440. if (err == MP_OKAY) {
  108441. err = sp_384_to_mp(p->z, pm->z);
  108442. }
  108443. return err;
  108444. }
  108445. /* Conditionally subtract b from a using the mask m.
  108446. * m is -1 to subtract and 0 when not copying.
  108447. *
  108448. * r A single precision number representing condition subtract result.
  108449. * a A single precision number to subtract from.
  108450. * b A single precision number to subtract.
  108451. * m Mask value to apply.
  108452. */
  108453. SP_NOINLINE static sp_digit sp_384_cond_sub_12(sp_digit* r, const sp_digit* a,
  108454. const sp_digit* b, sp_digit m)
  108455. {
  108456. __asm__ __volatile__ (
  108457. "movs r4, #0\n\t"
  108458. "movs r5, #48\n\t"
  108459. "mov r8, r5\n\t"
  108460. "movs r7, #0\n\t"
  108461. "\n"
  108462. "L_sp_384_cond_sub_12_words_%=:\n\t"
  108463. "ldr r6, [%[b], r7]\n\t"
  108464. #ifdef WOLFSSL_KEIL
  108465. "ands r6, r6, %[m]\n\t"
  108466. #elif defined(__clang__)
  108467. "ands r6, %[m]\n\t"
  108468. #else
  108469. "and r6, %[m]\n\t"
  108470. #endif
  108471. "movs r5, #0\n\t"
  108472. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108473. "subs r5, r5, r4\n\t"
  108474. #else
  108475. "sub r5, r5, r4\n\t"
  108476. #endif
  108477. "ldr r5, [%[a], r7]\n\t"
  108478. #ifdef WOLFSSL_KEIL
  108479. "sbcs r5, r5, r6\n\t"
  108480. #elif defined(__clang__)
  108481. "sbcs r5, r6\n\t"
  108482. #else
  108483. "sbc r5, r6\n\t"
  108484. #endif
  108485. #ifdef WOLFSSL_KEIL
  108486. "sbcs r4, r4, r4\n\t"
  108487. #elif defined(__clang__)
  108488. "sbcs r4, r4\n\t"
  108489. #else
  108490. "sbc r4, r4\n\t"
  108491. #endif
  108492. "str r5, [%[r], r7]\n\t"
  108493. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108494. "adds r7, r7, #4\n\t"
  108495. #else
  108496. "add r7, r7, #4\n\t"
  108497. #endif
  108498. "cmp r7, r8\n\t"
  108499. "blt L_sp_384_cond_sub_12_words_%=\n\t"
  108500. "movs %[r], r4\n\t"
  108501. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m)
  108502. :
  108503. : "memory", "r4", "r5", "r6", "r7", "r8"
  108504. );
  108505. return (uint32_t)(size_t)r;
  108506. }
  108507. #define sp_384_mont_reduce_order_12 sp_384_mont_reduce_12
  108508. /* Reduce the number back to 384 bits using Montgomery reduction.
  108509. *
  108510. * a A single precision number to reduce in place.
  108511. * m The single precision number representing the modulus.
  108512. * mp The digit representing the negative inverse of m mod 2^n.
  108513. */
  108514. SP_NOINLINE static void sp_384_mont_reduce_12(sp_digit* a, const sp_digit* m,
  108515. sp_digit mp)
  108516. {
  108517. __asm__ __volatile__ (
  108518. "movs r7, #0\n\t"
  108519. "mov r8, %[mp]\n\t"
  108520. "mov r12, r7\n\t"
  108521. "mov lr, %[m]\n\t"
  108522. "mov r9, %[a]\n\t"
  108523. "mov r11, %[a]\n\t"
  108524. "movs r5, #44\n\t"
  108525. "movs r6, #48\n\t"
  108526. "add r9, r9, r5\n\t"
  108527. "add r11, r11, r6\n\t"
  108528. "\n"
  108529. "L_sp_384_mont_reduce_12_mod_%=:\n\t"
  108530. "movs r7, #0\n\t"
  108531. "movs r4, #0\n\t"
  108532. "# a[i] += m[0] * mu\n\t"
  108533. "ldm %[m]!, {%[mp]}\n\t"
  108534. "ldm %[a]!, {r3}\n\t"
  108535. "# mu = a[i] * mp\n\t"
  108536. "mov r5, r8\n\t"
  108537. #ifdef WOLFSSL_KEIL
  108538. "muls r5, r3, r5\n\t"
  108539. #elif defined(__clang__)
  108540. "muls r5, r3\n\t"
  108541. #else
  108542. "mul r5, r3\n\t"
  108543. #endif
  108544. "mov r10, r5\n\t"
  108545. "# Multiply m[0] and mu - Start\n\t"
  108546. "mov r5, r10\n\t"
  108547. "uxth r6, %[mp]\n\t"
  108548. "uxth r5, r5\n\t"
  108549. #ifdef WOLFSSL_KEIL
  108550. "muls r6, r5, r6\n\t"
  108551. #elif defined(__clang__)
  108552. "muls r6, r5\n\t"
  108553. #else
  108554. "mul r6, r5\n\t"
  108555. #endif
  108556. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108557. "adds r3, r3, r6\n\t"
  108558. #else
  108559. "add r3, r3, r6\n\t"
  108560. #endif
  108561. #ifdef WOLFSSL_KEIL
  108562. "adcs r4, r4, r7\n\t"
  108563. #elif defined(__clang__)
  108564. "adcs r4, r7\n\t"
  108565. #else
  108566. "adc r4, r7\n\t"
  108567. #endif
  108568. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108569. "lsrs r6, %[mp], #16\n\t"
  108570. #else
  108571. "lsr r6, %[mp], #16\n\t"
  108572. #endif
  108573. #ifdef WOLFSSL_KEIL
  108574. "muls r5, r6, r5\n\t"
  108575. #elif defined(__clang__)
  108576. "muls r5, r6\n\t"
  108577. #else
  108578. "mul r5, r6\n\t"
  108579. #endif
  108580. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108581. "lsrs r6, r5, #16\n\t"
  108582. #else
  108583. "lsr r6, r5, #16\n\t"
  108584. #endif
  108585. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108586. "lsls r5, r5, #16\n\t"
  108587. #else
  108588. "lsl r5, r5, #16\n\t"
  108589. #endif
  108590. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108591. "adds r3, r3, r5\n\t"
  108592. #else
  108593. "add r3, r3, r5\n\t"
  108594. #endif
  108595. #ifdef WOLFSSL_KEIL
  108596. "adcs r4, r4, r6\n\t"
  108597. #elif defined(__clang__)
  108598. "adcs r4, r6\n\t"
  108599. #else
  108600. "adc r4, r6\n\t"
  108601. #endif
  108602. "mov r5, r10\n\t"
  108603. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108604. "lsrs r6, %[mp], #16\n\t"
  108605. #else
  108606. "lsr r6, %[mp], #16\n\t"
  108607. #endif
  108608. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108609. "lsrs r5, r5, #16\n\t"
  108610. #else
  108611. "lsr r5, r5, #16\n\t"
  108612. #endif
  108613. #ifdef WOLFSSL_KEIL
  108614. "muls r6, r5, r6\n\t"
  108615. #elif defined(__clang__)
  108616. "muls r6, r5\n\t"
  108617. #else
  108618. "mul r6, r5\n\t"
  108619. #endif
  108620. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108621. "adds r4, r4, r6\n\t"
  108622. #else
  108623. "add r4, r4, r6\n\t"
  108624. #endif
  108625. "uxth r6, %[mp]\n\t"
  108626. #ifdef WOLFSSL_KEIL
  108627. "muls r5, r6, r5\n\t"
  108628. #elif defined(__clang__)
  108629. "muls r5, r6\n\t"
  108630. #else
  108631. "mul r5, r6\n\t"
  108632. #endif
  108633. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108634. "lsrs r6, r5, #16\n\t"
  108635. #else
  108636. "lsr r6, r5, #16\n\t"
  108637. #endif
  108638. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108639. "lsls r5, r5, #16\n\t"
  108640. #else
  108641. "lsl r5, r5, #16\n\t"
  108642. #endif
  108643. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108644. "adds r3, r3, r5\n\t"
  108645. #else
  108646. "add r3, r3, r5\n\t"
  108647. #endif
  108648. #ifdef WOLFSSL_KEIL
  108649. "adcs r4, r4, r6\n\t"
  108650. #elif defined(__clang__)
  108651. "adcs r4, r6\n\t"
  108652. #else
  108653. "adc r4, r6\n\t"
  108654. #endif
  108655. "# Multiply m[0] and mu - Done\n\t"
  108656. "\n"
  108657. "L_sp_384_mont_reduce_12_word_%=:\n\t"
  108658. "# a[i+j] += m[j] * mu\n\t"
  108659. "ldr r3, [%[a]]\n\t"
  108660. "ldm %[m]!, {%[mp]}\n\t"
  108661. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108662. "adds r3, r3, r4\n\t"
  108663. #else
  108664. "add r3, r3, r4\n\t"
  108665. #endif
  108666. "movs r4, #0\n\t"
  108667. #ifdef WOLFSSL_KEIL
  108668. "adcs r4, r4, r7\n\t"
  108669. #elif defined(__clang__)
  108670. "adcs r4, r7\n\t"
  108671. #else
  108672. "adc r4, r7\n\t"
  108673. #endif
  108674. "# Multiply m[j] and mu - Start\n\t"
  108675. "mov r5, r10\n\t"
  108676. "uxth r6, %[mp]\n\t"
  108677. "uxth r5, r5\n\t"
  108678. #ifdef WOLFSSL_KEIL
  108679. "muls r6, r5, r6\n\t"
  108680. #elif defined(__clang__)
  108681. "muls r6, r5\n\t"
  108682. #else
  108683. "mul r6, r5\n\t"
  108684. #endif
  108685. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108686. "adds r3, r3, r6\n\t"
  108687. #else
  108688. "add r3, r3, r6\n\t"
  108689. #endif
  108690. #ifdef WOLFSSL_KEIL
  108691. "adcs r4, r4, r7\n\t"
  108692. #elif defined(__clang__)
  108693. "adcs r4, r7\n\t"
  108694. #else
  108695. "adc r4, r7\n\t"
  108696. #endif
  108697. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108698. "lsrs r6, %[mp], #16\n\t"
  108699. #else
  108700. "lsr r6, %[mp], #16\n\t"
  108701. #endif
  108702. #ifdef WOLFSSL_KEIL
  108703. "muls r5, r6, r5\n\t"
  108704. #elif defined(__clang__)
  108705. "muls r5, r6\n\t"
  108706. #else
  108707. "mul r5, r6\n\t"
  108708. #endif
  108709. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108710. "lsrs r6, r5, #16\n\t"
  108711. #else
  108712. "lsr r6, r5, #16\n\t"
  108713. #endif
  108714. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108715. "lsls r5, r5, #16\n\t"
  108716. #else
  108717. "lsl r5, r5, #16\n\t"
  108718. #endif
  108719. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108720. "adds r3, r3, r5\n\t"
  108721. #else
  108722. "add r3, r3, r5\n\t"
  108723. #endif
  108724. #ifdef WOLFSSL_KEIL
  108725. "adcs r4, r4, r6\n\t"
  108726. #elif defined(__clang__)
  108727. "adcs r4, r6\n\t"
  108728. #else
  108729. "adc r4, r6\n\t"
  108730. #endif
  108731. "mov r5, r10\n\t"
  108732. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108733. "lsrs r6, %[mp], #16\n\t"
  108734. #else
  108735. "lsr r6, %[mp], #16\n\t"
  108736. #endif
  108737. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108738. "lsrs r5, r5, #16\n\t"
  108739. #else
  108740. "lsr r5, r5, #16\n\t"
  108741. #endif
  108742. #ifdef WOLFSSL_KEIL
  108743. "muls r6, r5, r6\n\t"
  108744. #elif defined(__clang__)
  108745. "muls r6, r5\n\t"
  108746. #else
  108747. "mul r6, r5\n\t"
  108748. #endif
  108749. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108750. "adds r4, r4, r6\n\t"
  108751. #else
  108752. "add r4, r4, r6\n\t"
  108753. #endif
  108754. "uxth r6, %[mp]\n\t"
  108755. #ifdef WOLFSSL_KEIL
  108756. "muls r5, r6, r5\n\t"
  108757. #elif defined(__clang__)
  108758. "muls r5, r6\n\t"
  108759. #else
  108760. "mul r5, r6\n\t"
  108761. #endif
  108762. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108763. "lsrs r6, r5, #16\n\t"
  108764. #else
  108765. "lsr r6, r5, #16\n\t"
  108766. #endif
  108767. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108768. "lsls r5, r5, #16\n\t"
  108769. #else
  108770. "lsl r5, r5, #16\n\t"
  108771. #endif
  108772. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108773. "adds r3, r3, r5\n\t"
  108774. #else
  108775. "add r3, r3, r5\n\t"
  108776. #endif
  108777. #ifdef WOLFSSL_KEIL
  108778. "adcs r4, r4, r6\n\t"
  108779. #elif defined(__clang__)
  108780. "adcs r4, r6\n\t"
  108781. #else
  108782. "adc r4, r6\n\t"
  108783. #endif
  108784. "# Multiply m[j] and mu - Done\n\t"
  108785. "stm %[a]!, {r3}\n\t"
  108786. "cmp %[a], r9\n\t"
  108787. "blt L_sp_384_mont_reduce_12_word_%=\n\t"
  108788. "# a[i+11] += m[11] * mu\n\t"
  108789. "ldr %[mp], [%[m]]\n\t"
  108790. "mov r3, r12\n\t"
  108791. "# Multiply m[11] and mu - Start\n\t"
  108792. "mov r5, r10\n\t"
  108793. "uxth r6, %[mp]\n\t"
  108794. "uxth r5, r5\n\t"
  108795. #ifdef WOLFSSL_KEIL
  108796. "muls r6, r5, r6\n\t"
  108797. #elif defined(__clang__)
  108798. "muls r6, r5\n\t"
  108799. #else
  108800. "mul r6, r5\n\t"
  108801. #endif
  108802. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108803. "adds r4, r4, r6\n\t"
  108804. #else
  108805. "add r4, r4, r6\n\t"
  108806. #endif
  108807. #ifdef WOLFSSL_KEIL
  108808. "adcs r3, r3, r7\n\t"
  108809. #elif defined(__clang__)
  108810. "adcs r3, r7\n\t"
  108811. #else
  108812. "adc r3, r7\n\t"
  108813. #endif
  108814. #ifdef WOLFSSL_KEIL
  108815. "adcs r7, r7, r7\n\t"
  108816. #elif defined(__clang__)
  108817. "adcs r7, r7\n\t"
  108818. #else
  108819. "adc r7, r7\n\t"
  108820. #endif
  108821. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108822. "lsrs r6, %[mp], #16\n\t"
  108823. #else
  108824. "lsr r6, %[mp], #16\n\t"
  108825. #endif
  108826. #ifdef WOLFSSL_KEIL
  108827. "muls r5, r6, r5\n\t"
  108828. #elif defined(__clang__)
  108829. "muls r5, r6\n\t"
  108830. #else
  108831. "mul r5, r6\n\t"
  108832. #endif
  108833. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108834. "lsrs r6, r5, #16\n\t"
  108835. #else
  108836. "lsr r6, r5, #16\n\t"
  108837. #endif
  108838. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108839. "lsls r5, r5, #16\n\t"
  108840. #else
  108841. "lsl r5, r5, #16\n\t"
  108842. #endif
  108843. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108844. "adds r4, r4, r5\n\t"
  108845. #else
  108846. "add r4, r4, r5\n\t"
  108847. #endif
  108848. #ifdef WOLFSSL_KEIL
  108849. "adcs r3, r3, r6\n\t"
  108850. #elif defined(__clang__)
  108851. "adcs r3, r6\n\t"
  108852. #else
  108853. "adc r3, r6\n\t"
  108854. #endif
  108855. #ifdef WOLFSSL_KEIL
  108856. "adcs r7, r7, r7\n\t"
  108857. #elif defined(__clang__)
  108858. "adcs r7, r7\n\t"
  108859. #else
  108860. "adc r7, r7\n\t"
  108861. #endif
  108862. "mov r5, r10\n\t"
  108863. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108864. "lsrs r6, %[mp], #16\n\t"
  108865. #else
  108866. "lsr r6, %[mp], #16\n\t"
  108867. #endif
  108868. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108869. "lsrs r5, r5, #16\n\t"
  108870. #else
  108871. "lsr r5, r5, #16\n\t"
  108872. #endif
  108873. #ifdef WOLFSSL_KEIL
  108874. "muls r6, r5, r6\n\t"
  108875. #elif defined(__clang__)
  108876. "muls r6, r5\n\t"
  108877. #else
  108878. "mul r6, r5\n\t"
  108879. #endif
  108880. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108881. "adds r3, r3, r6\n\t"
  108882. #else
  108883. "add r3, r3, r6\n\t"
  108884. #endif
  108885. #ifdef WOLFSSL_KEIL
  108886. "adcs r7, r7, r7\n\t"
  108887. #elif defined(__clang__)
  108888. "adcs r7, r7\n\t"
  108889. #else
  108890. "adc r7, r7\n\t"
  108891. #endif
  108892. "uxth r6, %[mp]\n\t"
  108893. #ifdef WOLFSSL_KEIL
  108894. "muls r5, r6, r5\n\t"
  108895. #elif defined(__clang__)
  108896. "muls r5, r6\n\t"
  108897. #else
  108898. "mul r5, r6\n\t"
  108899. #endif
  108900. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108901. "lsrs r6, r5, #16\n\t"
  108902. #else
  108903. "lsr r6, r5, #16\n\t"
  108904. #endif
  108905. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108906. "lsls r5, r5, #16\n\t"
  108907. #else
  108908. "lsl r5, r5, #16\n\t"
  108909. #endif
  108910. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108911. "adds r4, r4, r5\n\t"
  108912. #else
  108913. "add r4, r4, r5\n\t"
  108914. #endif
  108915. #ifdef WOLFSSL_KEIL
  108916. "adcs r3, r3, r6\n\t"
  108917. #elif defined(__clang__)
  108918. "adcs r3, r6\n\t"
  108919. #else
  108920. "adc r3, r6\n\t"
  108921. #endif
  108922. #ifdef WOLFSSL_KEIL
  108923. "adcs r7, r7, r7\n\t"
  108924. #elif defined(__clang__)
  108925. "adcs r7, r7\n\t"
  108926. #else
  108927. "adc r7, r7\n\t"
  108928. #endif
  108929. "# Multiply m[11] and mu - Done\n\t"
  108930. "ldr r5, [%[a]]\n\t"
  108931. "ldr r6, [%[a], #4]\n\t"
  108932. "movs %[mp], #0\n\t"
  108933. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108934. "adds r5, r5, r4\n\t"
  108935. #else
  108936. "add r5, r5, r4\n\t"
  108937. #endif
  108938. #ifdef WOLFSSL_KEIL
  108939. "adcs r6, r6, r3\n\t"
  108940. #elif defined(__clang__)
  108941. "adcs r6, r3\n\t"
  108942. #else
  108943. "adc r6, r3\n\t"
  108944. #endif
  108945. #ifdef WOLFSSL_KEIL
  108946. "adcs r7, r7, %[mp]\n\t"
  108947. #elif defined(__clang__)
  108948. "adcs r7, %[mp]\n\t"
  108949. #else
  108950. "adc r7, %[mp]\n\t"
  108951. #endif
  108952. "stm %[a]!, {r5, r6}\n\t"
  108953. "# i += 1\n\t"
  108954. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108955. "subs %[a], %[a], #4\n\t"
  108956. #else
  108957. "sub %[a], %[a], #4\n\t"
  108958. #endif
  108959. "movs r3, #44\n\t"
  108960. "mov r9, %[a]\n\t"
  108961. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108962. "subs %[a], %[a], r3\n\t"
  108963. #else
  108964. "sub %[a], %[a], r3\n\t"
  108965. #endif
  108966. "mov r12, r7\n\t"
  108967. "mov %[m], lr\n\t"
  108968. "cmp r11, %[a]\n\t"
  108969. "bgt L_sp_384_mont_reduce_12_mod_%=\n\t"
  108970. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108971. "negs r7, r7\n\t"
  108972. #else
  108973. "neg r7, r7\n\t"
  108974. #endif
  108975. "# Subtract masked modulus\n\t"
  108976. "movs r4, #48\n\t"
  108977. "movs %[mp], #0\n\t"
  108978. "movs r3, #0\n\t"
  108979. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108980. "subs %[a], %[a], r4\n\t"
  108981. #else
  108982. "sub %[a], %[a], r4\n\t"
  108983. #endif
  108984. #ifndef WOLFSSL_SP_LARGE_CODE
  108985. "\n"
  108986. "L_sp_384_mont_reduce_12_sub_mask_%=:\n\t"
  108987. "ldm %[m]!, {r6}\n\t"
  108988. "movs r5, #0\n\t"
  108989. #ifdef WOLFSSL_KEIL
  108990. "ands r6, r6, r7\n\t"
  108991. #elif defined(__clang__)
  108992. "ands r6, r7\n\t"
  108993. #else
  108994. "and r6, r7\n\t"
  108995. #endif
  108996. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108997. "subs r5, r5, %[mp]\n\t"
  108998. #else
  108999. "sub r5, r5, %[mp]\n\t"
  109000. #endif
  109001. "ldr r5, [%[a], r4]\n\t"
  109002. #ifdef WOLFSSL_KEIL
  109003. "sbcs r5, r5, r6\n\t"
  109004. #elif defined(__clang__)
  109005. "sbcs r5, r6\n\t"
  109006. #else
  109007. "sbc r5, r6\n\t"
  109008. #endif
  109009. #ifdef WOLFSSL_KEIL
  109010. "sbcs %[mp], %[mp], %[mp]\n\t"
  109011. #elif defined(__clang__)
  109012. "sbcs %[mp], %[mp]\n\t"
  109013. #else
  109014. "sbc %[mp], %[mp]\n\t"
  109015. #endif
  109016. "stm %[a]!, {r5}\n\t"
  109017. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109018. "adds r3, r3, #4\n\t"
  109019. #else
  109020. "add r3, r3, #4\n\t"
  109021. #endif
  109022. "cmp r3, r4\n\t"
  109023. "blt L_sp_384_mont_reduce_12_sub_mask_%=\n\t"
  109024. #else /* WOLFSSL_SP_LARGE_CODE */
  109025. "ldm %[m]!, {r6}\n\t"
  109026. #ifdef WOLFSSL_KEIL
  109027. "ands r6, r6, r7\n\t"
  109028. #elif defined(__clang__)
  109029. "ands r6, r7\n\t"
  109030. #else
  109031. "and r6, r7\n\t"
  109032. #endif
  109033. "ldr r5, [%[a], r4]\n\t"
  109034. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109035. "subs r5, r5, r6\n\t"
  109036. #else
  109037. "sub r5, r5, r6\n\t"
  109038. #endif
  109039. "stm %[a]!, {r5}\n\t"
  109040. "ldm %[m]!, {r6}\n\t"
  109041. #ifdef WOLFSSL_KEIL
  109042. "ands r6, r6, r7\n\t"
  109043. #elif defined(__clang__)
  109044. "ands r6, r7\n\t"
  109045. #else
  109046. "and r6, r7\n\t"
  109047. #endif
  109048. "ldr r5, [%[a], r4]\n\t"
  109049. #ifdef WOLFSSL_KEIL
  109050. "sbcs r5, r5, r6\n\t"
  109051. #elif defined(__clang__)
  109052. "sbcs r5, r6\n\t"
  109053. #else
  109054. "sbc r5, r6\n\t"
  109055. #endif
  109056. "stm %[a]!, {r5}\n\t"
  109057. "ldm %[m]!, {r6}\n\t"
  109058. #ifdef WOLFSSL_KEIL
  109059. "ands r6, r6, r7\n\t"
  109060. #elif defined(__clang__)
  109061. "ands r6, r7\n\t"
  109062. #else
  109063. "and r6, r7\n\t"
  109064. #endif
  109065. "ldr r5, [%[a], r4]\n\t"
  109066. #ifdef WOLFSSL_KEIL
  109067. "sbcs r5, r5, r6\n\t"
  109068. #elif defined(__clang__)
  109069. "sbcs r5, r6\n\t"
  109070. #else
  109071. "sbc r5, r6\n\t"
  109072. #endif
  109073. "stm %[a]!, {r5}\n\t"
  109074. "ldm %[m]!, {r6}\n\t"
  109075. #ifdef WOLFSSL_KEIL
  109076. "ands r6, r6, r7\n\t"
  109077. #elif defined(__clang__)
  109078. "ands r6, r7\n\t"
  109079. #else
  109080. "and r6, r7\n\t"
  109081. #endif
  109082. "ldr r5, [%[a], r4]\n\t"
  109083. #ifdef WOLFSSL_KEIL
  109084. "sbcs r5, r5, r6\n\t"
  109085. #elif defined(__clang__)
  109086. "sbcs r5, r6\n\t"
  109087. #else
  109088. "sbc r5, r6\n\t"
  109089. #endif
  109090. "stm %[a]!, {r5}\n\t"
  109091. "ldm %[m]!, {r6}\n\t"
  109092. #ifdef WOLFSSL_KEIL
  109093. "ands r6, r6, r7\n\t"
  109094. #elif defined(__clang__)
  109095. "ands r6, r7\n\t"
  109096. #else
  109097. "and r6, r7\n\t"
  109098. #endif
  109099. "ldr r5, [%[a], r4]\n\t"
  109100. #ifdef WOLFSSL_KEIL
  109101. "sbcs r5, r5, r6\n\t"
  109102. #elif defined(__clang__)
  109103. "sbcs r5, r6\n\t"
  109104. #else
  109105. "sbc r5, r6\n\t"
  109106. #endif
  109107. "stm %[a]!, {r5}\n\t"
  109108. "ldm %[m]!, {r6}\n\t"
  109109. #ifdef WOLFSSL_KEIL
  109110. "ands r6, r6, r7\n\t"
  109111. #elif defined(__clang__)
  109112. "ands r6, r7\n\t"
  109113. #else
  109114. "and r6, r7\n\t"
  109115. #endif
  109116. "ldr r5, [%[a], r4]\n\t"
  109117. #ifdef WOLFSSL_KEIL
  109118. "sbcs r5, r5, r6\n\t"
  109119. #elif defined(__clang__)
  109120. "sbcs r5, r6\n\t"
  109121. #else
  109122. "sbc r5, r6\n\t"
  109123. #endif
  109124. "stm %[a]!, {r5}\n\t"
  109125. "ldm %[m]!, {r6}\n\t"
  109126. #ifdef WOLFSSL_KEIL
  109127. "ands r6, r6, r7\n\t"
  109128. #elif defined(__clang__)
  109129. "ands r6, r7\n\t"
  109130. #else
  109131. "and r6, r7\n\t"
  109132. #endif
  109133. "ldr r5, [%[a], r4]\n\t"
  109134. #ifdef WOLFSSL_KEIL
  109135. "sbcs r5, r5, r6\n\t"
  109136. #elif defined(__clang__)
  109137. "sbcs r5, r6\n\t"
  109138. #else
  109139. "sbc r5, r6\n\t"
  109140. #endif
  109141. "stm %[a]!, {r5}\n\t"
  109142. "ldm %[m]!, {r6}\n\t"
  109143. #ifdef WOLFSSL_KEIL
  109144. "ands r6, r6, r7\n\t"
  109145. #elif defined(__clang__)
  109146. "ands r6, r7\n\t"
  109147. #else
  109148. "and r6, r7\n\t"
  109149. #endif
  109150. "ldr r5, [%[a], r4]\n\t"
  109151. #ifdef WOLFSSL_KEIL
  109152. "sbcs r5, r5, r6\n\t"
  109153. #elif defined(__clang__)
  109154. "sbcs r5, r6\n\t"
  109155. #else
  109156. "sbc r5, r6\n\t"
  109157. #endif
  109158. "stm %[a]!, {r5}\n\t"
  109159. "ldm %[m]!, {r6}\n\t"
  109160. #ifdef WOLFSSL_KEIL
  109161. "ands r6, r6, r7\n\t"
  109162. #elif defined(__clang__)
  109163. "ands r6, r7\n\t"
  109164. #else
  109165. "and r6, r7\n\t"
  109166. #endif
  109167. "ldr r5, [%[a], r4]\n\t"
  109168. #ifdef WOLFSSL_KEIL
  109169. "sbcs r5, r5, r6\n\t"
  109170. #elif defined(__clang__)
  109171. "sbcs r5, r6\n\t"
  109172. #else
  109173. "sbc r5, r6\n\t"
  109174. #endif
  109175. "stm %[a]!, {r5}\n\t"
  109176. "ldm %[m]!, {r6}\n\t"
  109177. #ifdef WOLFSSL_KEIL
  109178. "ands r6, r6, r7\n\t"
  109179. #elif defined(__clang__)
  109180. "ands r6, r7\n\t"
  109181. #else
  109182. "and r6, r7\n\t"
  109183. #endif
  109184. "ldr r5, [%[a], r4]\n\t"
  109185. #ifdef WOLFSSL_KEIL
  109186. "sbcs r5, r5, r6\n\t"
  109187. #elif defined(__clang__)
  109188. "sbcs r5, r6\n\t"
  109189. #else
  109190. "sbc r5, r6\n\t"
  109191. #endif
  109192. "stm %[a]!, {r5}\n\t"
  109193. "ldm %[m]!, {r6}\n\t"
  109194. #ifdef WOLFSSL_KEIL
  109195. "ands r6, r6, r7\n\t"
  109196. #elif defined(__clang__)
  109197. "ands r6, r7\n\t"
  109198. #else
  109199. "and r6, r7\n\t"
  109200. #endif
  109201. "ldr r5, [%[a], r4]\n\t"
  109202. #ifdef WOLFSSL_KEIL
  109203. "sbcs r5, r5, r6\n\t"
  109204. #elif defined(__clang__)
  109205. "sbcs r5, r6\n\t"
  109206. #else
  109207. "sbc r5, r6\n\t"
  109208. #endif
  109209. "stm %[a]!, {r5}\n\t"
  109210. "ldm %[m]!, {r6}\n\t"
  109211. #ifdef WOLFSSL_KEIL
  109212. "ands r6, r6, r7\n\t"
  109213. #elif defined(__clang__)
  109214. "ands r6, r7\n\t"
  109215. #else
  109216. "and r6, r7\n\t"
  109217. #endif
  109218. "ldr r5, [%[a], r4]\n\t"
  109219. #ifdef WOLFSSL_KEIL
  109220. "sbcs r5, r5, r6\n\t"
  109221. #elif defined(__clang__)
  109222. "sbcs r5, r6\n\t"
  109223. #else
  109224. "sbc r5, r6\n\t"
  109225. #endif
  109226. "stm %[a]!, {r5}\n\t"
  109227. #endif /* WOLFSSL_SP_LARGE_CODE */
  109228. : [a] "+l" (a), [m] "+l" (m), [mp] "+l" (mp)
  109229. :
  109230. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr"
  109231. );
  109232. }
  109233. /* Multiply two Montgomery form numbers mod the modulus (prime).
  109234. * (r = a * b mod m)
  109235. *
  109236. * r Result of multiplication.
  109237. * a First number to multiply in Montgomery form.
  109238. * b Second number to multiply in Montgomery form.
  109239. * m Modulus (prime).
  109240. * mp Montgomery mulitplier.
  109241. */
  109242. SP_NOINLINE static void sp_384_mont_mul_12(sp_digit* r, const sp_digit* a,
  109243. const sp_digit* b, const sp_digit* m, sp_digit mp)
  109244. {
  109245. sp_384_mul_12(r, a, b);
  109246. sp_384_mont_reduce_12(r, m, mp);
  109247. }
  109248. /* Square the Montgomery form number. (r = a * a mod m)
  109249. *
  109250. * r Result of squaring.
  109251. * a Number to square in Montgomery form.
  109252. * m Modulus (prime).
  109253. * mp Montgomery mulitplier.
  109254. */
  109255. SP_NOINLINE static void sp_384_mont_sqr_12(sp_digit* r, const sp_digit* a,
  109256. const sp_digit* m, sp_digit mp)
  109257. {
  109258. sp_384_sqr_12(r, a);
  109259. sp_384_mont_reduce_12(r, m, mp);
  109260. }
  109261. #if !defined(WOLFSSL_SP_SMALL) || defined(HAVE_COMP_KEY)
  109262. /* Square the Montgomery form number a number of times. (r = a ^ n mod m)
  109263. *
  109264. * r Result of squaring.
  109265. * a Number to square in Montgomery form.
  109266. * n Number of times to square.
  109267. * m Modulus (prime).
  109268. * mp Montgomery mulitplier.
  109269. */
  109270. static void sp_384_mont_sqr_n_12(sp_digit* r, const sp_digit* a, int n,
  109271. const sp_digit* m, sp_digit mp)
  109272. {
  109273. sp_384_mont_sqr_12(r, a, m, mp);
  109274. for (; n > 1; n--) {
  109275. sp_384_mont_sqr_12(r, r, m, mp);
  109276. }
  109277. }
  109278. #endif /* !WOLFSSL_SP_SMALL || HAVE_COMP_KEY */
  109279. #ifdef WOLFSSL_SP_SMALL
  109280. /* Mod-2 for the P384 curve. */
  109281. static const uint32_t p384_mod_minus_2[12] = {
  109282. 0xfffffffdU,0x00000000U,0x00000000U,0xffffffffU,0xfffffffeU,0xffffffffU,
  109283. 0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU
  109284. };
  109285. #endif /* !WOLFSSL_SP_SMALL */
  109286. /* Invert the number, in Montgomery form, modulo the modulus (prime) of the
  109287. * P384 curve. (r = 1 / a mod m)
  109288. *
  109289. * r Inverse result.
  109290. * a Number to invert.
  109291. * td Temporary data.
  109292. */
  109293. static void sp_384_mont_inv_12(sp_digit* r, const sp_digit* a, sp_digit* td)
  109294. {
  109295. #ifdef WOLFSSL_SP_SMALL
  109296. sp_digit* t = td;
  109297. int i;
  109298. XMEMCPY(t, a, sizeof(sp_digit) * 12);
  109299. for (i=382; i>=0; i--) {
  109300. sp_384_mont_sqr_12(t, t, p384_mod, p384_mp_mod);
  109301. if (p384_mod_minus_2[i / 32] & ((sp_digit)1 << (i % 32)))
  109302. sp_384_mont_mul_12(t, t, a, p384_mod, p384_mp_mod);
  109303. }
  109304. XMEMCPY(r, t, sizeof(sp_digit) * 12);
  109305. #else
  109306. sp_digit* t1 = td;
  109307. sp_digit* t2 = td + 2 * 12;
  109308. sp_digit* t3 = td + 4 * 12;
  109309. sp_digit* t4 = td + 6 * 12;
  109310. sp_digit* t5 = td + 8 * 12;
  109311. /* 0x2 */
  109312. sp_384_mont_sqr_12(t1, a, p384_mod, p384_mp_mod);
  109313. /* 0x3 */
  109314. sp_384_mont_mul_12(t5, t1, a, p384_mod, p384_mp_mod);
  109315. /* 0xc */
  109316. sp_384_mont_sqr_n_12(t1, t5, 2, p384_mod, p384_mp_mod);
  109317. /* 0xf */
  109318. sp_384_mont_mul_12(t2, t5, t1, p384_mod, p384_mp_mod);
  109319. /* 0x1e */
  109320. sp_384_mont_sqr_12(t1, t2, p384_mod, p384_mp_mod);
  109321. /* 0x1f */
  109322. sp_384_mont_mul_12(t4, t1, a, p384_mod, p384_mp_mod);
  109323. /* 0x3e0 */
  109324. sp_384_mont_sqr_n_12(t1, t4, 5, p384_mod, p384_mp_mod);
  109325. /* 0x3ff */
  109326. sp_384_mont_mul_12(t2, t4, t1, p384_mod, p384_mp_mod);
  109327. /* 0x7fe0 */
  109328. sp_384_mont_sqr_n_12(t1, t2, 5, p384_mod, p384_mp_mod);
  109329. /* 0x7fff */
  109330. sp_384_mont_mul_12(t4, t4, t1, p384_mod, p384_mp_mod);
  109331. /* 0x3fff8000 */
  109332. sp_384_mont_sqr_n_12(t1, t4, 15, p384_mod, p384_mp_mod);
  109333. /* 0x3fffffff */
  109334. sp_384_mont_mul_12(t2, t4, t1, p384_mod, p384_mp_mod);
  109335. /* 0xfffffffc */
  109336. sp_384_mont_sqr_n_12(t3, t2, 2, p384_mod, p384_mp_mod);
  109337. /* 0xfffffffd */
  109338. sp_384_mont_mul_12(r, t3, a, p384_mod, p384_mp_mod);
  109339. /* 0xffffffff */
  109340. sp_384_mont_mul_12(t3, t5, t3, p384_mod, p384_mp_mod);
  109341. /* 0xfffffffc0000000 */
  109342. sp_384_mont_sqr_n_12(t1, t2, 30, p384_mod, p384_mp_mod);
  109343. /* 0xfffffffffffffff */
  109344. sp_384_mont_mul_12(t2, t2, t1, p384_mod, p384_mp_mod);
  109345. /* 0xfffffffffffffff000000000000000 */
  109346. sp_384_mont_sqr_n_12(t1, t2, 60, p384_mod, p384_mp_mod);
  109347. /* 0xffffffffffffffffffffffffffffff */
  109348. sp_384_mont_mul_12(t2, t2, t1, p384_mod, p384_mp_mod);
  109349. /* 0xffffffffffffffffffffffffffffff000000000000000000000000000000 */
  109350. sp_384_mont_sqr_n_12(t1, t2, 120, p384_mod, p384_mp_mod);
  109351. /* 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff */
  109352. sp_384_mont_mul_12(t2, t2, t1, p384_mod, p384_mp_mod);
  109353. /* 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000 */
  109354. sp_384_mont_sqr_n_12(t1, t2, 15, p384_mod, p384_mp_mod);
  109355. /* 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff */
  109356. sp_384_mont_mul_12(t2, t4, t1, p384_mod, p384_mp_mod);
  109357. /* 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00000000 */
  109358. sp_384_mont_sqr_n_12(t1, t2, 33, p384_mod, p384_mp_mod);
  109359. /* 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff */
  109360. sp_384_mont_mul_12(t2, t3, t1, p384_mod, p384_mp_mod);
  109361. /* 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000000000000 */
  109362. sp_384_mont_sqr_n_12(t1, t2, 96, p384_mod, p384_mp_mod);
  109363. /* 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffd */
  109364. sp_384_mont_mul_12(r, r, t1, p384_mod, p384_mp_mod);
  109365. #endif /* WOLFSSL_SP_SMALL */
  109366. }
  109367. /* Compare a with b in constant time.
  109368. *
  109369. * a A single precision integer.
  109370. * b A single precision integer.
  109371. * return -ve, 0 or +ve if a is less than, equal to or greater than b
  109372. * respectively.
  109373. */
  109374. SP_NOINLINE static sp_int32 sp_384_cmp_12(const sp_digit* a, const sp_digit* b)
  109375. {
  109376. __asm__ __volatile__ (
  109377. "movs r2, #0\n\t"
  109378. "movs r3, #0\n\t"
  109379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109380. "mvns r3, r3\n\t"
  109381. #else
  109382. "mvn r3, r3\n\t"
  109383. #endif
  109384. "movs r6, #44\n\t"
  109385. "\n"
  109386. "L_sp_384_cmp_12_words_%=:\n\t"
  109387. "ldr r7, [%[a], r6]\n\t"
  109388. "ldr r5, [%[b], r6]\n\t"
  109389. #ifdef WOLFSSL_KEIL
  109390. "ands r7, r7, r3\n\t"
  109391. #elif defined(__clang__)
  109392. "ands r7, r3\n\t"
  109393. #else
  109394. "and r7, r3\n\t"
  109395. #endif
  109396. #ifdef WOLFSSL_KEIL
  109397. "ands r5, r5, r3\n\t"
  109398. #elif defined(__clang__)
  109399. "ands r5, r3\n\t"
  109400. #else
  109401. "and r5, r3\n\t"
  109402. #endif
  109403. "movs r4, r7\n\t"
  109404. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109405. "subs r7, r7, r5\n\t"
  109406. #else
  109407. "sub r7, r7, r5\n\t"
  109408. #endif
  109409. #ifdef WOLFSSL_KEIL
  109410. "sbcs r7, r7, r7\n\t"
  109411. #elif defined(__clang__)
  109412. "sbcs r7, r7\n\t"
  109413. #else
  109414. "sbc r7, r7\n\t"
  109415. #endif
  109416. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109417. "adds r2, r2, r7\n\t"
  109418. #else
  109419. "add r2, r2, r7\n\t"
  109420. #endif
  109421. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109422. "mvns r7, r7\n\t"
  109423. #else
  109424. "mvn r7, r7\n\t"
  109425. #endif
  109426. #ifdef WOLFSSL_KEIL
  109427. "ands r3, r3, r7\n\t"
  109428. #elif defined(__clang__)
  109429. "ands r3, r7\n\t"
  109430. #else
  109431. "and r3, r7\n\t"
  109432. #endif
  109433. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109434. "subs r5, r5, r4\n\t"
  109435. #else
  109436. "sub r5, r5, r4\n\t"
  109437. #endif
  109438. #ifdef WOLFSSL_KEIL
  109439. "sbcs r7, r7, r7\n\t"
  109440. #elif defined(__clang__)
  109441. "sbcs r7, r7\n\t"
  109442. #else
  109443. "sbc r7, r7\n\t"
  109444. #endif
  109445. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109446. "subs r2, r2, r7\n\t"
  109447. #else
  109448. "sub r2, r2, r7\n\t"
  109449. #endif
  109450. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109451. "mvns r7, r7\n\t"
  109452. #else
  109453. "mvn r7, r7\n\t"
  109454. #endif
  109455. #ifdef WOLFSSL_KEIL
  109456. "ands r3, r3, r7\n\t"
  109457. #elif defined(__clang__)
  109458. "ands r3, r7\n\t"
  109459. #else
  109460. "and r3, r7\n\t"
  109461. #endif
  109462. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109463. "subs r6, r6, #4\n\t"
  109464. #else
  109465. "sub r6, r6, #4\n\t"
  109466. #endif
  109467. "bge L_sp_384_cmp_12_words_%=\n\t"
  109468. "movs %[a], r2\n\t"
  109469. : [a] "+l" (a), [b] "+l" (b)
  109470. :
  109471. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  109472. );
  109473. return (uint32_t)(size_t)a;
  109474. }
  109475. /* Normalize the values in each word to 32.
  109476. *
  109477. * a Array of sp_digit to normalize.
  109478. */
  109479. #define sp_384_norm_12(a)
  109480. /* Map the Montgomery form projective coordinate point to an affine point.
  109481. *
  109482. * r Resulting affine coordinate point.
  109483. * p Montgomery form projective coordinate point.
  109484. * t Temporary ordinate data.
  109485. */
  109486. static void sp_384_map_12(sp_point_384* r, const sp_point_384* p,
  109487. sp_digit* t)
  109488. {
  109489. sp_digit* t1 = t;
  109490. sp_digit* t2 = t + 2*12;
  109491. sp_int32 n;
  109492. sp_384_mont_inv_12(t1, p->z, t + 2*12);
  109493. sp_384_mont_sqr_12(t2, t1, p384_mod, p384_mp_mod);
  109494. sp_384_mont_mul_12(t1, t2, t1, p384_mod, p384_mp_mod);
  109495. /* x /= z^2 */
  109496. sp_384_mont_mul_12(r->x, p->x, t2, p384_mod, p384_mp_mod);
  109497. XMEMSET(r->x + 12, 0, sizeof(r->x) / 2U);
  109498. sp_384_mont_reduce_12(r->x, p384_mod, p384_mp_mod);
  109499. /* Reduce x to less than modulus */
  109500. n = sp_384_cmp_12(r->x, p384_mod);
  109501. sp_384_cond_sub_12(r->x, r->x, p384_mod, ~(n >> 31));
  109502. sp_384_norm_12(r->x);
  109503. /* y /= z^3 */
  109504. sp_384_mont_mul_12(r->y, p->y, t1, p384_mod, p384_mp_mod);
  109505. XMEMSET(r->y + 12, 0, sizeof(r->y) / 2U);
  109506. sp_384_mont_reduce_12(r->y, p384_mod, p384_mp_mod);
  109507. /* Reduce y to less than modulus */
  109508. n = sp_384_cmp_12(r->y, p384_mod);
  109509. sp_384_cond_sub_12(r->y, r->y, p384_mod, ~(n >> 31));
  109510. sp_384_norm_12(r->y);
  109511. XMEMSET(r->z, 0, sizeof(r->z) / 2);
  109512. r->z[0] = 1;
  109513. }
  109514. /* Add two Montgomery form numbers (r = a + b % m).
  109515. *
  109516. * r Result of addition.
  109517. * a First number to add in Montgomery form.
  109518. * b Second number to add in Montgomery form.
  109519. * m Modulus (prime).
  109520. */
  109521. SP_NOINLINE static void sp_384_mont_add_12(sp_digit* r, const sp_digit* a,
  109522. const sp_digit* b, const sp_digit* m)
  109523. {
  109524. sp_digit o;
  109525. o = sp_384_add_12(r, a, b);
  109526. sp_384_cond_sub_12(r, r, m, 0 - o);
  109527. }
  109528. /* Double a Montgomery form number (r = a + a % m).
  109529. *
  109530. * r Result of doubling.
  109531. * a Number to double in Montgomery form.
  109532. * m Modulus (prime).
  109533. */
  109534. SP_NOINLINE static void sp_384_mont_dbl_12(sp_digit* r, const sp_digit* a,
  109535. const sp_digit* m)
  109536. {
  109537. sp_digit o;
  109538. o = sp_384_add_12(r, a, a);
  109539. sp_384_cond_sub_12(r, r, m, 0 - o);
  109540. }
  109541. /* Triple a Montgomery form number (r = a + a + a % m).
  109542. *
  109543. * r Result of Tripling.
  109544. * a Number to triple in Montgomery form.
  109545. * m Modulus (prime).
  109546. */
  109547. SP_NOINLINE static void sp_384_mont_tpl_12(sp_digit* r, const sp_digit* a,
  109548. const sp_digit* m)
  109549. {
  109550. sp_digit o;
  109551. o = sp_384_add_12(r, a, a);
  109552. sp_384_cond_sub_12(r, r, m, 0 - o);
  109553. o = sp_384_add_12(r, r, a);
  109554. sp_384_cond_sub_12(r, r, m, 0 - o);
  109555. }
  109556. /* Conditionally add a and b using the mask m.
  109557. * m is -1 to add and 0 when not.
  109558. *
  109559. * r A single precision number representing conditional add result.
  109560. * a A single precision number to add with.
  109561. * b A single precision number to add.
  109562. * m Mask value to apply.
  109563. */
  109564. SP_NOINLINE static sp_digit sp_384_cond_add_12(sp_digit* r, const sp_digit* a,
  109565. const sp_digit* b, sp_digit m)
  109566. {
  109567. __asm__ __volatile__ (
  109568. "movs r4, #0\n\t"
  109569. "movs r5, #48\n\t"
  109570. "mov r8, r5\n\t"
  109571. "movs r7, #0\n\t"
  109572. "\n"
  109573. "L_sp_384_cond_add_12_words_%=:\n\t"
  109574. "ldr r6, [%[b], r7]\n\t"
  109575. #ifdef WOLFSSL_KEIL
  109576. "ands r6, r6, %[m]\n\t"
  109577. #elif defined(__clang__)
  109578. "ands r6, %[m]\n\t"
  109579. #else
  109580. "and r6, %[m]\n\t"
  109581. #endif
  109582. "movs r5, #0\n\t"
  109583. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109584. "subs r5, r5, #1\n\t"
  109585. #else
  109586. "sub r5, r5, #1\n\t"
  109587. #endif
  109588. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109589. "adds r5, r5, r4\n\t"
  109590. #else
  109591. "add r5, r5, r4\n\t"
  109592. #endif
  109593. "ldr r5, [%[a], r7]\n\t"
  109594. #ifdef WOLFSSL_KEIL
  109595. "adcs r5, r5, r6\n\t"
  109596. #elif defined(__clang__)
  109597. "adcs r5, r6\n\t"
  109598. #else
  109599. "adc r5, r6\n\t"
  109600. #endif
  109601. "movs r4, #0\n\t"
  109602. #ifdef WOLFSSL_KEIL
  109603. "adcs r4, r4, r4\n\t"
  109604. #elif defined(__clang__)
  109605. "adcs r4, r4\n\t"
  109606. #else
  109607. "adc r4, r4\n\t"
  109608. #endif
  109609. "str r5, [%[r], r7]\n\t"
  109610. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109611. "adds r7, r7, #4\n\t"
  109612. #else
  109613. "add r7, r7, #4\n\t"
  109614. #endif
  109615. "cmp r7, r8\n\t"
  109616. "blt L_sp_384_cond_add_12_words_%=\n\t"
  109617. "movs %[r], r4\n\t"
  109618. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m)
  109619. :
  109620. : "memory", "r4", "r5", "r6", "r7", "r8"
  109621. );
  109622. return (uint32_t)(size_t)r;
  109623. }
  109624. /* Subtract two Montgomery form numbers (r = a - b % m).
  109625. *
  109626. * r Result of subtration.
  109627. * a Number to subtract from in Montgomery form.
  109628. * b Number to subtract with in Montgomery form.
  109629. * m Modulus (prime).
  109630. */
  109631. SP_NOINLINE static void sp_384_mont_sub_12(sp_digit* r, const sp_digit* a,
  109632. const sp_digit* b, const sp_digit* m)
  109633. {
  109634. sp_digit o;
  109635. o = sp_384_sub_12(r, a, b);
  109636. sp_384_cond_add_12(r, r, m, o);
  109637. }
  109638. #define sp_384_mont_sub_lower_12 sp_384_mont_sub_12
  109639. /* Right shift a by 1 bit into r. (r = a >> 1)
  109640. *
  109641. * r A single precision integer.
  109642. * a A single precision integer.
  109643. */
  109644. static void sp_384_rshift1_12(sp_digit* r, const sp_digit* a)
  109645. {
  109646. __asm__ __volatile__ (
  109647. "ldr r2, [%[a]]\n\t"
  109648. "ldr r3, [%[a], #4]\n\t"
  109649. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109650. "lsrs r2, r2, #1\n\t"
  109651. #else
  109652. "lsr r2, r2, #1\n\t"
  109653. #endif
  109654. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109655. "lsls r5, r3, #31\n\t"
  109656. #else
  109657. "lsl r5, r3, #31\n\t"
  109658. #endif
  109659. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109660. "lsrs r3, r3, #1\n\t"
  109661. #else
  109662. "lsr r3, r3, #1\n\t"
  109663. #endif
  109664. #ifdef WOLFSSL_KEIL
  109665. "orrs r2, r2, r5\n\t"
  109666. #elif defined(__clang__)
  109667. "orrs r2, r5\n\t"
  109668. #else
  109669. "orr r2, r5\n\t"
  109670. #endif
  109671. "ldr r4, [%[a], #8]\n\t"
  109672. "str r2, [%[r]]\n\t"
  109673. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109674. "lsls r5, r4, #31\n\t"
  109675. #else
  109676. "lsl r5, r4, #31\n\t"
  109677. #endif
  109678. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109679. "lsrs r4, r4, #1\n\t"
  109680. #else
  109681. "lsr r4, r4, #1\n\t"
  109682. #endif
  109683. #ifdef WOLFSSL_KEIL
  109684. "orrs r3, r3, r5\n\t"
  109685. #elif defined(__clang__)
  109686. "orrs r3, r5\n\t"
  109687. #else
  109688. "orr r3, r5\n\t"
  109689. #endif
  109690. "ldr r2, [%[a], #12]\n\t"
  109691. "str r3, [%[r], #4]\n\t"
  109692. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109693. "lsls r5, r2, #31\n\t"
  109694. #else
  109695. "lsl r5, r2, #31\n\t"
  109696. #endif
  109697. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109698. "lsrs r2, r2, #1\n\t"
  109699. #else
  109700. "lsr r2, r2, #1\n\t"
  109701. #endif
  109702. #ifdef WOLFSSL_KEIL
  109703. "orrs r4, r4, r5\n\t"
  109704. #elif defined(__clang__)
  109705. "orrs r4, r5\n\t"
  109706. #else
  109707. "orr r4, r5\n\t"
  109708. #endif
  109709. "ldr r3, [%[a], #16]\n\t"
  109710. "str r4, [%[r], #8]\n\t"
  109711. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109712. "lsls r5, r3, #31\n\t"
  109713. #else
  109714. "lsl r5, r3, #31\n\t"
  109715. #endif
  109716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109717. "lsrs r3, r3, #1\n\t"
  109718. #else
  109719. "lsr r3, r3, #1\n\t"
  109720. #endif
  109721. #ifdef WOLFSSL_KEIL
  109722. "orrs r2, r2, r5\n\t"
  109723. #elif defined(__clang__)
  109724. "orrs r2, r5\n\t"
  109725. #else
  109726. "orr r2, r5\n\t"
  109727. #endif
  109728. "ldr r4, [%[a], #20]\n\t"
  109729. "str r2, [%[r], #12]\n\t"
  109730. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109731. "lsls r5, r4, #31\n\t"
  109732. #else
  109733. "lsl r5, r4, #31\n\t"
  109734. #endif
  109735. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109736. "lsrs r4, r4, #1\n\t"
  109737. #else
  109738. "lsr r4, r4, #1\n\t"
  109739. #endif
  109740. #ifdef WOLFSSL_KEIL
  109741. "orrs r3, r3, r5\n\t"
  109742. #elif defined(__clang__)
  109743. "orrs r3, r5\n\t"
  109744. #else
  109745. "orr r3, r5\n\t"
  109746. #endif
  109747. "ldr r2, [%[a], #24]\n\t"
  109748. "str r3, [%[r], #16]\n\t"
  109749. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109750. "lsls r5, r2, #31\n\t"
  109751. #else
  109752. "lsl r5, r2, #31\n\t"
  109753. #endif
  109754. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109755. "lsrs r2, r2, #1\n\t"
  109756. #else
  109757. "lsr r2, r2, #1\n\t"
  109758. #endif
  109759. #ifdef WOLFSSL_KEIL
  109760. "orrs r4, r4, r5\n\t"
  109761. #elif defined(__clang__)
  109762. "orrs r4, r5\n\t"
  109763. #else
  109764. "orr r4, r5\n\t"
  109765. #endif
  109766. "ldr r3, [%[a], #28]\n\t"
  109767. "str r4, [%[r], #20]\n\t"
  109768. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109769. "lsls r5, r3, #31\n\t"
  109770. #else
  109771. "lsl r5, r3, #31\n\t"
  109772. #endif
  109773. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109774. "lsrs r3, r3, #1\n\t"
  109775. #else
  109776. "lsr r3, r3, #1\n\t"
  109777. #endif
  109778. #ifdef WOLFSSL_KEIL
  109779. "orrs r2, r2, r5\n\t"
  109780. #elif defined(__clang__)
  109781. "orrs r2, r5\n\t"
  109782. #else
  109783. "orr r2, r5\n\t"
  109784. #endif
  109785. "ldr r4, [%[a], #32]\n\t"
  109786. "str r2, [%[r], #24]\n\t"
  109787. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109788. "lsls r5, r4, #31\n\t"
  109789. #else
  109790. "lsl r5, r4, #31\n\t"
  109791. #endif
  109792. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109793. "lsrs r4, r4, #1\n\t"
  109794. #else
  109795. "lsr r4, r4, #1\n\t"
  109796. #endif
  109797. #ifdef WOLFSSL_KEIL
  109798. "orrs r3, r3, r5\n\t"
  109799. #elif defined(__clang__)
  109800. "orrs r3, r5\n\t"
  109801. #else
  109802. "orr r3, r5\n\t"
  109803. #endif
  109804. "ldr r2, [%[a], #36]\n\t"
  109805. "str r3, [%[r], #28]\n\t"
  109806. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109807. "lsls r5, r2, #31\n\t"
  109808. #else
  109809. "lsl r5, r2, #31\n\t"
  109810. #endif
  109811. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109812. "lsrs r2, r2, #1\n\t"
  109813. #else
  109814. "lsr r2, r2, #1\n\t"
  109815. #endif
  109816. #ifdef WOLFSSL_KEIL
  109817. "orrs r4, r4, r5\n\t"
  109818. #elif defined(__clang__)
  109819. "orrs r4, r5\n\t"
  109820. #else
  109821. "orr r4, r5\n\t"
  109822. #endif
  109823. "ldr r3, [%[a], #40]\n\t"
  109824. "str r4, [%[r], #32]\n\t"
  109825. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109826. "lsls r5, r3, #31\n\t"
  109827. #else
  109828. "lsl r5, r3, #31\n\t"
  109829. #endif
  109830. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109831. "lsrs r3, r3, #1\n\t"
  109832. #else
  109833. "lsr r3, r3, #1\n\t"
  109834. #endif
  109835. #ifdef WOLFSSL_KEIL
  109836. "orrs r2, r2, r5\n\t"
  109837. #elif defined(__clang__)
  109838. "orrs r2, r5\n\t"
  109839. #else
  109840. "orr r2, r5\n\t"
  109841. #endif
  109842. "ldr r4, [%[a], #44]\n\t"
  109843. "str r2, [%[r], #36]\n\t"
  109844. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109845. "lsls r5, r4, #31\n\t"
  109846. #else
  109847. "lsl r5, r4, #31\n\t"
  109848. #endif
  109849. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109850. "lsrs r4, r4, #1\n\t"
  109851. #else
  109852. "lsr r4, r4, #1\n\t"
  109853. #endif
  109854. #ifdef WOLFSSL_KEIL
  109855. "orrs r3, r3, r5\n\t"
  109856. #elif defined(__clang__)
  109857. "orrs r3, r5\n\t"
  109858. #else
  109859. "orr r3, r5\n\t"
  109860. #endif
  109861. "str r3, [%[r], #40]\n\t"
  109862. "str r4, [%[r], #44]\n\t"
  109863. : [r] "+l" (r), [a] "+l" (a)
  109864. :
  109865. : "memory", "r2", "r3", "r4", "r5"
  109866. );
  109867. }
  109868. /* Divide the number by 2 mod the modulus (prime). (r = a / 2 % m)
  109869. *
  109870. * r Result of division by 2.
  109871. * a Number to divide.
  109872. * m Modulus (prime).
  109873. */
  109874. SP_NOINLINE static void sp_384_div2_12(sp_digit* r, const sp_digit* a,
  109875. const sp_digit* m)
  109876. {
  109877. sp_digit o;
  109878. o = sp_384_cond_add_12(r, a, m, 0 - (a[0] & 1));
  109879. sp_384_rshift1_12(r, r);
  109880. r[11] |= o << 31;
  109881. }
  109882. /* Double the Montgomery form projective point p.
  109883. *
  109884. * r Result of doubling point.
  109885. * p Point to double.
  109886. * t Temporary ordinate data.
  109887. */
  109888. #ifdef WOLFSSL_SP_NONBLOCK
  109889. typedef struct sp_384_proj_point_dbl_12_ctx {
  109890. int state;
  109891. sp_digit* t1;
  109892. sp_digit* t2;
  109893. sp_digit* x;
  109894. sp_digit* y;
  109895. sp_digit* z;
  109896. } sp_384_proj_point_dbl_12_ctx;
  109897. 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)
  109898. {
  109899. int err = FP_WOULDBLOCK;
  109900. sp_384_proj_point_dbl_12_ctx* ctx = (sp_384_proj_point_dbl_12_ctx*)sp_ctx->data;
  109901. typedef char ctx_size_test[sizeof(sp_384_proj_point_dbl_12_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  109902. (void)sizeof(ctx_size_test);
  109903. switch (ctx->state) {
  109904. case 0:
  109905. ctx->t1 = t;
  109906. ctx->t2 = t + 2*12;
  109907. ctx->x = r->x;
  109908. ctx->y = r->y;
  109909. ctx->z = r->z;
  109910. /* Put infinity into result. */
  109911. if (r != p) {
  109912. r->infinity = p->infinity;
  109913. }
  109914. ctx->state = 1;
  109915. break;
  109916. case 1:
  109917. /* T1 = Z * Z */
  109918. sp_384_mont_sqr_12(ctx->t1, p->z, p384_mod, p384_mp_mod);
  109919. ctx->state = 2;
  109920. break;
  109921. case 2:
  109922. /* Z = Y * Z */
  109923. sp_384_mont_mul_12(ctx->z, p->y, p->z, p384_mod, p384_mp_mod);
  109924. ctx->state = 3;
  109925. break;
  109926. case 3:
  109927. /* Z = 2Z */
  109928. sp_384_mont_dbl_12(ctx->z, ctx->z, p384_mod);
  109929. ctx->state = 4;
  109930. break;
  109931. case 4:
  109932. /* T2 = X - T1 */
  109933. sp_384_mont_sub_12(ctx->t2, p->x, ctx->t1, p384_mod);
  109934. ctx->state = 5;
  109935. break;
  109936. case 5:
  109937. /* T1 = X + T1 */
  109938. sp_384_mont_add_12(ctx->t1, p->x, ctx->t1, p384_mod);
  109939. ctx->state = 6;
  109940. break;
  109941. case 6:
  109942. /* T2 = T1 * T2 */
  109943. sp_384_mont_mul_12(ctx->t2, ctx->t1, ctx->t2, p384_mod, p384_mp_mod);
  109944. ctx->state = 7;
  109945. break;
  109946. case 7:
  109947. /* T1 = 3T2 */
  109948. sp_384_mont_tpl_12(ctx->t1, ctx->t2, p384_mod);
  109949. ctx->state = 8;
  109950. break;
  109951. case 8:
  109952. /* Y = 2Y */
  109953. sp_384_mont_dbl_12(ctx->y, p->y, p384_mod);
  109954. ctx->state = 9;
  109955. break;
  109956. case 9:
  109957. /* Y = Y * Y */
  109958. sp_384_mont_sqr_12(ctx->y, ctx->y, p384_mod, p384_mp_mod);
  109959. ctx->state = 10;
  109960. break;
  109961. case 10:
  109962. /* T2 = Y * Y */
  109963. sp_384_mont_sqr_12(ctx->t2, ctx->y, p384_mod, p384_mp_mod);
  109964. ctx->state = 11;
  109965. break;
  109966. case 11:
  109967. /* T2 = T2/2 */
  109968. sp_384_div2_12(ctx->t2, ctx->t2, p384_mod);
  109969. ctx->state = 12;
  109970. break;
  109971. case 12:
  109972. /* Y = Y * X */
  109973. sp_384_mont_mul_12(ctx->y, ctx->y, p->x, p384_mod, p384_mp_mod);
  109974. ctx->state = 13;
  109975. break;
  109976. case 13:
  109977. /* X = T1 * T1 */
  109978. sp_384_mont_sqr_12(ctx->x, ctx->t1, p384_mod, p384_mp_mod);
  109979. ctx->state = 14;
  109980. break;
  109981. case 14:
  109982. /* X = X - Y */
  109983. sp_384_mont_sub_12(ctx->x, ctx->x, ctx->y, p384_mod);
  109984. ctx->state = 15;
  109985. break;
  109986. case 15:
  109987. /* X = X - Y */
  109988. sp_384_mont_sub_12(ctx->x, ctx->x, ctx->y, p384_mod);
  109989. ctx->state = 16;
  109990. break;
  109991. case 16:
  109992. /* Y = Y - X */
  109993. sp_384_mont_sub_lower_12(ctx->y, ctx->y, ctx->x, p384_mod);
  109994. ctx->state = 17;
  109995. break;
  109996. case 17:
  109997. /* Y = Y * T1 */
  109998. sp_384_mont_mul_12(ctx->y, ctx->y, ctx->t1, p384_mod, p384_mp_mod);
  109999. ctx->state = 18;
  110000. break;
  110001. case 18:
  110002. /* Y = Y - T2 */
  110003. sp_384_mont_sub_12(ctx->y, ctx->y, ctx->t2, p384_mod);
  110004. ctx->state = 19;
  110005. /* fall-through */
  110006. case 19:
  110007. err = MP_OKAY;
  110008. break;
  110009. }
  110010. if (err == MP_OKAY && ctx->state != 19) {
  110011. err = FP_WOULDBLOCK;
  110012. }
  110013. return err;
  110014. }
  110015. #endif /* WOLFSSL_SP_NONBLOCK */
  110016. static void sp_384_proj_point_dbl_12(sp_point_384* r, const sp_point_384* p,
  110017. sp_digit* t)
  110018. {
  110019. sp_digit* t1 = t;
  110020. sp_digit* t2 = t + 2*12;
  110021. sp_digit* x;
  110022. sp_digit* y;
  110023. sp_digit* z;
  110024. x = r->x;
  110025. y = r->y;
  110026. z = r->z;
  110027. /* Put infinity into result. */
  110028. if (r != p) {
  110029. r->infinity = p->infinity;
  110030. }
  110031. /* T1 = Z * Z */
  110032. sp_384_mont_sqr_12(t1, p->z, p384_mod, p384_mp_mod);
  110033. /* Z = Y * Z */
  110034. sp_384_mont_mul_12(z, p->y, p->z, p384_mod, p384_mp_mod);
  110035. /* Z = 2Z */
  110036. sp_384_mont_dbl_12(z, z, p384_mod);
  110037. /* T2 = X - T1 */
  110038. sp_384_mont_sub_12(t2, p->x, t1, p384_mod);
  110039. /* T1 = X + T1 */
  110040. sp_384_mont_add_12(t1, p->x, t1, p384_mod);
  110041. /* T2 = T1 * T2 */
  110042. sp_384_mont_mul_12(t2, t1, t2, p384_mod, p384_mp_mod);
  110043. /* T1 = 3T2 */
  110044. sp_384_mont_tpl_12(t1, t2, p384_mod);
  110045. /* Y = 2Y */
  110046. sp_384_mont_dbl_12(y, p->y, p384_mod);
  110047. /* Y = Y * Y */
  110048. sp_384_mont_sqr_12(y, y, p384_mod, p384_mp_mod);
  110049. /* T2 = Y * Y */
  110050. sp_384_mont_sqr_12(t2, y, p384_mod, p384_mp_mod);
  110051. /* T2 = T2/2 */
  110052. sp_384_div2_12(t2, t2, p384_mod);
  110053. /* Y = Y * X */
  110054. sp_384_mont_mul_12(y, y, p->x, p384_mod, p384_mp_mod);
  110055. /* X = T1 * T1 */
  110056. sp_384_mont_sqr_12(x, t1, p384_mod, p384_mp_mod);
  110057. /* X = X - Y */
  110058. sp_384_mont_sub_12(x, x, y, p384_mod);
  110059. /* X = X - Y */
  110060. sp_384_mont_sub_12(x, x, y, p384_mod);
  110061. /* Y = Y - X */
  110062. sp_384_mont_sub_lower_12(y, y, x, p384_mod);
  110063. /* Y = Y * T1 */
  110064. sp_384_mont_mul_12(y, y, t1, p384_mod, p384_mp_mod);
  110065. /* Y = Y - T2 */
  110066. sp_384_mont_sub_12(y, y, t2, p384_mod);
  110067. }
  110068. /* Compare two numbers to determine if they are equal.
  110069. * Constant time implementation.
  110070. *
  110071. * a First number to compare.
  110072. * b Second number to compare.
  110073. * returns 1 when equal and 0 otherwise.
  110074. */
  110075. static int sp_384_cmp_equal_12(const sp_digit* a, const sp_digit* b)
  110076. {
  110077. return ((a[0] ^ b[0]) | (a[1] ^ b[1]) | (a[2] ^ b[2]) |
  110078. (a[3] ^ b[3]) | (a[4] ^ b[4]) | (a[5] ^ b[5]) |
  110079. (a[6] ^ b[6]) | (a[7] ^ b[7]) | (a[8] ^ b[8]) |
  110080. (a[9] ^ b[9]) | (a[10] ^ b[10]) | (a[11] ^ b[11])) == 0;
  110081. }
  110082. /* Returns 1 if the number of zero.
  110083. * Implementation is constant time.
  110084. *
  110085. * a Number to check.
  110086. * returns 1 if the number is zero and 0 otherwise.
  110087. */
  110088. static int sp_384_iszero_12(const sp_digit* a)
  110089. {
  110090. return (a[0] | a[1] | a[2] | a[3] | a[4] | a[5] | a[6] | a[7] |
  110091. a[8] | a[9] | a[10] | a[11]) == 0;
  110092. }
  110093. /* Add two Montgomery form projective points.
  110094. *
  110095. * r Result of addition.
  110096. * p First point to add.
  110097. * q Second point to add.
  110098. * t Temporary ordinate data.
  110099. */
  110100. #ifdef WOLFSSL_SP_NONBLOCK
  110101. typedef struct sp_384_proj_point_add_12_ctx {
  110102. int state;
  110103. sp_384_proj_point_dbl_12_ctx dbl_ctx;
  110104. const sp_point_384* ap[2];
  110105. sp_point_384* rp[2];
  110106. sp_digit* t1;
  110107. sp_digit* t2;
  110108. sp_digit* t3;
  110109. sp_digit* t4;
  110110. sp_digit* t5;
  110111. sp_digit* t6;
  110112. sp_digit* x;
  110113. sp_digit* y;
  110114. sp_digit* z;
  110115. } sp_384_proj_point_add_12_ctx;
  110116. static int sp_384_proj_point_add_12_nb(sp_ecc_ctx_t* sp_ctx, sp_point_384* r,
  110117. const sp_point_384* p, const sp_point_384* q, sp_digit* t)
  110118. {
  110119. int err = FP_WOULDBLOCK;
  110120. sp_384_proj_point_add_12_ctx* ctx = (sp_384_proj_point_add_12_ctx*)sp_ctx->data;
  110121. /* Ensure only the first point is the same as the result. */
  110122. if (q == r) {
  110123. const sp_point_384* a = p;
  110124. p = q;
  110125. q = a;
  110126. }
  110127. typedef char ctx_size_test[sizeof(sp_384_proj_point_add_12_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  110128. (void)sizeof(ctx_size_test);
  110129. switch (ctx->state) {
  110130. case 0: /* INIT */
  110131. ctx->t1 = t;
  110132. ctx->t2 = t + 2*12;
  110133. ctx->t3 = t + 4*12;
  110134. ctx->t4 = t + 6*12;
  110135. ctx->t5 = t + 8*12;
  110136. ctx->t6 = t + 10*12;
  110137. ctx->x = ctx->t6;
  110138. ctx->y = ctx->t1;
  110139. ctx->z = ctx->t2;
  110140. ctx->state = 1;
  110141. break;
  110142. case 1:
  110143. /* Check double */
  110144. (void)sp_384_sub_12(ctx->t1, p384_mod, q->y);
  110145. sp_384_norm_12(ctx->t1);
  110146. if ((~p->infinity & ~q->infinity &
  110147. sp_384_cmp_equal_12(p->x, q->x) & sp_384_cmp_equal_12(p->z, q->z) &
  110148. (sp_384_cmp_equal_12(p->y, q->y) | sp_384_cmp_equal_12(p->y, ctx->t1))) != 0)
  110149. {
  110150. XMEMSET(&ctx->dbl_ctx, 0, sizeof(ctx->dbl_ctx));
  110151. ctx->state = 2;
  110152. }
  110153. else {
  110154. ctx->state = 3;
  110155. }
  110156. break;
  110157. case 2:
  110158. err = sp_384_proj_point_dbl_12_nb((sp_ecc_ctx_t*)&ctx->dbl_ctx, r, p, t);
  110159. if (err == MP_OKAY)
  110160. ctx->state = 27; /* done */
  110161. break;
  110162. case 3:
  110163. {
  110164. ctx->state = 4;
  110165. break;
  110166. }
  110167. case 4:
  110168. /* U1 = X1*Z2^2 */
  110169. sp_384_mont_sqr_12(ctx->t1, q->z, p384_mod, p384_mp_mod);
  110170. ctx->state = 5;
  110171. break;
  110172. case 5:
  110173. sp_384_mont_mul_12(ctx->t3, ctx->t1, q->z, p384_mod, p384_mp_mod);
  110174. ctx->state = 6;
  110175. break;
  110176. case 6:
  110177. sp_384_mont_mul_12(ctx->t1, ctx->t1, p->x, p384_mod, p384_mp_mod);
  110178. ctx->state = 7;
  110179. break;
  110180. case 7:
  110181. /* U2 = X2*Z1^2 */
  110182. sp_384_mont_sqr_12(ctx->t2, p->z, p384_mod, p384_mp_mod);
  110183. ctx->state = 8;
  110184. break;
  110185. case 8:
  110186. sp_384_mont_mul_12(ctx->t4, ctx->t2, p->z, p384_mod, p384_mp_mod);
  110187. ctx->state = 9;
  110188. break;
  110189. case 9:
  110190. sp_384_mont_mul_12(ctx->t2, ctx->t2, q->x, p384_mod, p384_mp_mod);
  110191. ctx->state = 10;
  110192. break;
  110193. case 10:
  110194. /* S1 = Y1*Z2^3 */
  110195. sp_384_mont_mul_12(ctx->t3, ctx->t3, p->y, p384_mod, p384_mp_mod);
  110196. ctx->state = 11;
  110197. break;
  110198. case 11:
  110199. /* S2 = Y2*Z1^3 */
  110200. sp_384_mont_mul_12(ctx->t4, ctx->t4, q->y, p384_mod, p384_mp_mod);
  110201. ctx->state = 12;
  110202. break;
  110203. case 12:
  110204. /* H = U2 - U1 */
  110205. sp_384_mont_sub_12(ctx->t2, ctx->t2, ctx->t1, p384_mod);
  110206. ctx->state = 13;
  110207. break;
  110208. case 13:
  110209. /* R = S2 - S1 */
  110210. sp_384_mont_sub_12(ctx->t4, ctx->t4, ctx->t3, p384_mod);
  110211. ctx->state = 14;
  110212. break;
  110213. case 14:
  110214. /* X3 = R^2 - H^3 - 2*U1*H^2 */
  110215. sp_384_mont_sqr_12(ctx->t5, ctx->t2, p384_mod, p384_mp_mod);
  110216. ctx->state = 15;
  110217. break;
  110218. case 15:
  110219. sp_384_mont_mul_12(ctx->y, ctx->t1, ctx->t5, p384_mod, p384_mp_mod);
  110220. ctx->state = 16;
  110221. break;
  110222. case 16:
  110223. sp_384_mont_mul_12(ctx->t5, ctx->t5, ctx->t2, p384_mod, p384_mp_mod);
  110224. ctx->state = 17;
  110225. break;
  110226. case 17:
  110227. /* Z3 = H*Z1*Z2 */
  110228. sp_384_mont_mul_12(ctx->z, p->z, ctx->t2, p384_mod, p384_mp_mod);
  110229. ctx->state = 18;
  110230. break;
  110231. case 18:
  110232. sp_384_mont_mul_12(ctx->z, ctx->z, q->z, p384_mod, p384_mp_mod);
  110233. ctx->state = 19;
  110234. break;
  110235. case 19:
  110236. sp_384_mont_sqr_12(ctx->x, ctx->t4, p384_mod, p384_mp_mod);
  110237. ctx->state = 20;
  110238. break;
  110239. case 20:
  110240. sp_384_mont_sub_12(ctx->x, ctx->x, ctx->t5, p384_mod);
  110241. ctx->state = 21;
  110242. break;
  110243. case 21:
  110244. sp_384_mont_mul_12(ctx->t5, ctx->t5, ctx->t3, p384_mod, p384_mp_mod);
  110245. ctx->state = 22;
  110246. break;
  110247. case 22:
  110248. sp_384_mont_dbl_12(ctx->t3, ctx->y, p384_mod);
  110249. ctx->state = 23;
  110250. break;
  110251. case 23:
  110252. sp_384_mont_sub_12(ctx->x, ctx->x, ctx->t3, p384_mod);
  110253. ctx->state = 24;
  110254. break;
  110255. case 24:
  110256. /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
  110257. sp_384_mont_sub_lower_12(ctx->y, ctx->y, ctx->x, p384_mod);
  110258. ctx->state = 25;
  110259. break;
  110260. case 25:
  110261. sp_384_mont_mul_12(ctx->y, ctx->y, ctx->t4, p384_mod, p384_mp_mod);
  110262. ctx->state = 26;
  110263. break;
  110264. case 26:
  110265. sp_384_mont_sub_12(ctx->y, ctx->y, ctx->t5, p384_mod);
  110266. ctx->state = 27;
  110267. /* fall-through */
  110268. case 27:
  110269. {
  110270. int i;
  110271. sp_digit maskp = 0 - (q->infinity & (!p->infinity));
  110272. sp_digit maskq = 0 - (p->infinity & (!q->infinity));
  110273. sp_digit maskt = ~(maskp | maskq);
  110274. for (i = 0; i < 12; i++) {
  110275. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) |
  110276. (ctx->x[i] & maskt);
  110277. }
  110278. for (i = 0; i < 12; i++) {
  110279. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) |
  110280. (ctx->y[i] & maskt);
  110281. }
  110282. for (i = 0; i < 12; i++) {
  110283. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) |
  110284. (ctx->z[i] & maskt);
  110285. }
  110286. r->z[0] |= p->infinity & q->infinity;
  110287. r->infinity = p->infinity & q->infinity;
  110288. err = MP_OKAY;
  110289. break;
  110290. }
  110291. }
  110292. if (err == MP_OKAY && ctx->state != 27) {
  110293. err = FP_WOULDBLOCK;
  110294. }
  110295. return err;
  110296. }
  110297. #endif /* WOLFSSL_SP_NONBLOCK */
  110298. static void sp_384_proj_point_add_12(sp_point_384* r,
  110299. const sp_point_384* p, const sp_point_384* q, sp_digit* t)
  110300. {
  110301. sp_digit* t1 = t;
  110302. sp_digit* t2 = t + 2*12;
  110303. sp_digit* t3 = t + 4*12;
  110304. sp_digit* t4 = t + 6*12;
  110305. sp_digit* t5 = t + 8*12;
  110306. sp_digit* t6 = t + 10*12;
  110307. /* Check double */
  110308. (void)sp_384_sub_12(t1, p384_mod, q->y);
  110309. sp_384_norm_12(t1);
  110310. if ((~p->infinity & ~q->infinity &
  110311. sp_384_cmp_equal_12(p->x, q->x) & sp_384_cmp_equal_12(p->z, q->z) &
  110312. (sp_384_cmp_equal_12(p->y, q->y) | sp_384_cmp_equal_12(p->y, t1))) != 0) {
  110313. sp_384_proj_point_dbl_12(r, p, t);
  110314. }
  110315. else {
  110316. sp_digit maskp;
  110317. sp_digit maskq;
  110318. sp_digit maskt;
  110319. sp_digit* x = t6;
  110320. sp_digit* y = t1;
  110321. sp_digit* z = t2;
  110322. int i;
  110323. maskp = 0 - (q->infinity & (!p->infinity));
  110324. maskq = 0 - (p->infinity & (!q->infinity));
  110325. maskt = ~(maskp | maskq);
  110326. /* U1 = X1*Z2^2 */
  110327. sp_384_mont_sqr_12(t1, q->z, p384_mod, p384_mp_mod);
  110328. sp_384_mont_mul_12(t3, t1, q->z, p384_mod, p384_mp_mod);
  110329. sp_384_mont_mul_12(t1, t1, p->x, p384_mod, p384_mp_mod);
  110330. /* U2 = X2*Z1^2 */
  110331. sp_384_mont_sqr_12(t2, p->z, p384_mod, p384_mp_mod);
  110332. sp_384_mont_mul_12(t4, t2, p->z, p384_mod, p384_mp_mod);
  110333. sp_384_mont_mul_12(t2, t2, q->x, p384_mod, p384_mp_mod);
  110334. /* S1 = Y1*Z2^3 */
  110335. sp_384_mont_mul_12(t3, t3, p->y, p384_mod, p384_mp_mod);
  110336. /* S2 = Y2*Z1^3 */
  110337. sp_384_mont_mul_12(t4, t4, q->y, p384_mod, p384_mp_mod);
  110338. /* H = U2 - U1 */
  110339. sp_384_mont_sub_12(t2, t2, t1, p384_mod);
  110340. /* R = S2 - S1 */
  110341. sp_384_mont_sub_12(t4, t4, t3, p384_mod);
  110342. if (~p->infinity & ~q->infinity &
  110343. sp_384_iszero_12(t2) & sp_384_iszero_12(t4) & maskt) {
  110344. sp_384_proj_point_dbl_12(r, p, t);
  110345. }
  110346. else {
  110347. /* X3 = R^2 - H^3 - 2*U1*H^2 */
  110348. sp_384_mont_sqr_12(t5, t2, p384_mod, p384_mp_mod);
  110349. sp_384_mont_mul_12(y, t1, t5, p384_mod, p384_mp_mod);
  110350. sp_384_mont_mul_12(t5, t5, t2, p384_mod, p384_mp_mod);
  110351. /* Z3 = H*Z1*Z2 */
  110352. sp_384_mont_mul_12(z, p->z, t2, p384_mod, p384_mp_mod);
  110353. sp_384_mont_mul_12(z, z, q->z, p384_mod, p384_mp_mod);
  110354. sp_384_mont_sqr_12(x, t4, p384_mod, p384_mp_mod);
  110355. sp_384_mont_sub_12(x, x, t5, p384_mod);
  110356. sp_384_mont_mul_12(t5, t5, t3, p384_mod, p384_mp_mod);
  110357. sp_384_mont_dbl_12(t3, y, p384_mod);
  110358. sp_384_mont_sub_12(x, x, t3, p384_mod);
  110359. /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
  110360. sp_384_mont_sub_lower_12(y, y, x, p384_mod);
  110361. sp_384_mont_mul_12(y, y, t4, p384_mod, p384_mp_mod);
  110362. sp_384_mont_sub_12(y, y, t5, p384_mod);
  110363. for (i = 0; i < 12; i++) {
  110364. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) |
  110365. (x[i] & maskt);
  110366. }
  110367. for (i = 0; i < 12; i++) {
  110368. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) |
  110369. (y[i] & maskt);
  110370. }
  110371. for (i = 0; i < 12; i++) {
  110372. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) |
  110373. (z[i] & maskt);
  110374. }
  110375. r->z[0] |= p->infinity & q->infinity;
  110376. r->infinity = p->infinity & q->infinity;
  110377. }
  110378. }
  110379. }
  110380. #ifndef WC_NO_CACHE_RESISTANT
  110381. /* Touch each possible point that could be being copied.
  110382. *
  110383. * r Point to copy into.
  110384. * table Table - start of the entires to access
  110385. * idx Index of entry to retrieve.
  110386. */
  110387. static void sp_384_get_point_16_12(sp_point_384* r, const sp_point_384* table,
  110388. int idx)
  110389. {
  110390. int i;
  110391. sp_digit mask;
  110392. r->x[0] = 0;
  110393. r->x[1] = 0;
  110394. r->x[2] = 0;
  110395. r->x[3] = 0;
  110396. r->x[4] = 0;
  110397. r->x[5] = 0;
  110398. r->x[6] = 0;
  110399. r->x[7] = 0;
  110400. r->x[8] = 0;
  110401. r->x[9] = 0;
  110402. r->x[10] = 0;
  110403. r->x[11] = 0;
  110404. r->y[0] = 0;
  110405. r->y[1] = 0;
  110406. r->y[2] = 0;
  110407. r->y[3] = 0;
  110408. r->y[4] = 0;
  110409. r->y[5] = 0;
  110410. r->y[6] = 0;
  110411. r->y[7] = 0;
  110412. r->y[8] = 0;
  110413. r->y[9] = 0;
  110414. r->y[10] = 0;
  110415. r->y[11] = 0;
  110416. r->z[0] = 0;
  110417. r->z[1] = 0;
  110418. r->z[2] = 0;
  110419. r->z[3] = 0;
  110420. r->z[4] = 0;
  110421. r->z[5] = 0;
  110422. r->z[6] = 0;
  110423. r->z[7] = 0;
  110424. r->z[8] = 0;
  110425. r->z[9] = 0;
  110426. r->z[10] = 0;
  110427. r->z[11] = 0;
  110428. for (i = 1; i < 16; i++) {
  110429. mask = 0 - (i == idx);
  110430. r->x[0] |= mask & table[i].x[0];
  110431. r->x[1] |= mask & table[i].x[1];
  110432. r->x[2] |= mask & table[i].x[2];
  110433. r->x[3] |= mask & table[i].x[3];
  110434. r->x[4] |= mask & table[i].x[4];
  110435. r->x[5] |= mask & table[i].x[5];
  110436. r->x[6] |= mask & table[i].x[6];
  110437. r->x[7] |= mask & table[i].x[7];
  110438. r->x[8] |= mask & table[i].x[8];
  110439. r->x[9] |= mask & table[i].x[9];
  110440. r->x[10] |= mask & table[i].x[10];
  110441. r->x[11] |= mask & table[i].x[11];
  110442. r->y[0] |= mask & table[i].y[0];
  110443. r->y[1] |= mask & table[i].y[1];
  110444. r->y[2] |= mask & table[i].y[2];
  110445. r->y[3] |= mask & table[i].y[3];
  110446. r->y[4] |= mask & table[i].y[4];
  110447. r->y[5] |= mask & table[i].y[5];
  110448. r->y[6] |= mask & table[i].y[6];
  110449. r->y[7] |= mask & table[i].y[7];
  110450. r->y[8] |= mask & table[i].y[8];
  110451. r->y[9] |= mask & table[i].y[9];
  110452. r->y[10] |= mask & table[i].y[10];
  110453. r->y[11] |= mask & table[i].y[11];
  110454. r->z[0] |= mask & table[i].z[0];
  110455. r->z[1] |= mask & table[i].z[1];
  110456. r->z[2] |= mask & table[i].z[2];
  110457. r->z[3] |= mask & table[i].z[3];
  110458. r->z[4] |= mask & table[i].z[4];
  110459. r->z[5] |= mask & table[i].z[5];
  110460. r->z[6] |= mask & table[i].z[6];
  110461. r->z[7] |= mask & table[i].z[7];
  110462. r->z[8] |= mask & table[i].z[8];
  110463. r->z[9] |= mask & table[i].z[9];
  110464. r->z[10] |= mask & table[i].z[10];
  110465. r->z[11] |= mask & table[i].z[11];
  110466. }
  110467. }
  110468. #endif /* !WC_NO_CACHE_RESISTANT */
  110469. /* Multiply the point by the scalar and return the result.
  110470. * If map is true then convert result to affine coordinates.
  110471. *
  110472. * Fast implementation that generates a pre-computation table.
  110473. * 4 bits of window (no sliding!).
  110474. * Uses add and double for calculating table.
  110475. * 384 doubles.
  110476. * 108 adds.
  110477. *
  110478. * r Resulting point.
  110479. * g Point to multiply.
  110480. * k Scalar to multiply by.
  110481. * map Indicates whether to convert result to affine.
  110482. * ct Constant time required.
  110483. * heap Heap to use for allocation.
  110484. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  110485. */
  110486. static int sp_384_ecc_mulmod_fast_12(sp_point_384* r, const sp_point_384* g, const sp_digit* k,
  110487. int map, int ct, void* heap)
  110488. {
  110489. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  110490. sp_point_384* t = NULL;
  110491. sp_digit* tmp = NULL;
  110492. #else
  110493. sp_point_384 t[16 + 1];
  110494. sp_digit tmp[2 * 12 * 6];
  110495. #endif
  110496. sp_point_384* rt = NULL;
  110497. #ifndef WC_NO_CACHE_RESISTANT
  110498. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  110499. sp_point_384* p = NULL;
  110500. #else
  110501. sp_point_384 p[1];
  110502. #endif
  110503. #endif /* !WC_NO_CACHE_RESISTANT */
  110504. sp_digit n;
  110505. int i;
  110506. int c;
  110507. int y;
  110508. int err = MP_OKAY;
  110509. /* Constant time used for cache attack resistance implementation. */
  110510. (void)ct;
  110511. (void)heap;
  110512. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  110513. t = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * (16 + 1),
  110514. heap, DYNAMIC_TYPE_ECC);
  110515. if (t == NULL)
  110516. err = MEMORY_E;
  110517. #ifndef WC_NO_CACHE_RESISTANT
  110518. if (err == MP_OKAY) {
  110519. p = (sp_point_384*)XMALLOC(sizeof(sp_point_384),
  110520. heap, DYNAMIC_TYPE_ECC);
  110521. if (p == NULL)
  110522. err = MEMORY_E;
  110523. }
  110524. #endif
  110525. if (err == MP_OKAY) {
  110526. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 12 * 6, heap,
  110527. DYNAMIC_TYPE_ECC);
  110528. if (tmp == NULL)
  110529. err = MEMORY_E;
  110530. }
  110531. #endif
  110532. if (err == MP_OKAY) {
  110533. rt = t + 16;
  110534. /* t[0] = {0, 0, 1} * norm */
  110535. XMEMSET(&t[0], 0, sizeof(t[0]));
  110536. t[0].infinity = 1;
  110537. /* t[1] = {g->x, g->y, g->z} * norm */
  110538. (void)sp_384_mod_mul_norm_12(t[1].x, g->x, p384_mod);
  110539. (void)sp_384_mod_mul_norm_12(t[1].y, g->y, p384_mod);
  110540. (void)sp_384_mod_mul_norm_12(t[1].z, g->z, p384_mod);
  110541. t[1].infinity = 0;
  110542. sp_384_proj_point_dbl_12(&t[ 2], &t[ 1], tmp);
  110543. t[ 2].infinity = 0;
  110544. sp_384_proj_point_add_12(&t[ 3], &t[ 2], &t[ 1], tmp);
  110545. t[ 3].infinity = 0;
  110546. sp_384_proj_point_dbl_12(&t[ 4], &t[ 2], tmp);
  110547. t[ 4].infinity = 0;
  110548. sp_384_proj_point_add_12(&t[ 5], &t[ 3], &t[ 2], tmp);
  110549. t[ 5].infinity = 0;
  110550. sp_384_proj_point_dbl_12(&t[ 6], &t[ 3], tmp);
  110551. t[ 6].infinity = 0;
  110552. sp_384_proj_point_add_12(&t[ 7], &t[ 4], &t[ 3], tmp);
  110553. t[ 7].infinity = 0;
  110554. sp_384_proj_point_dbl_12(&t[ 8], &t[ 4], tmp);
  110555. t[ 8].infinity = 0;
  110556. sp_384_proj_point_add_12(&t[ 9], &t[ 5], &t[ 4], tmp);
  110557. t[ 9].infinity = 0;
  110558. sp_384_proj_point_dbl_12(&t[10], &t[ 5], tmp);
  110559. t[10].infinity = 0;
  110560. sp_384_proj_point_add_12(&t[11], &t[ 6], &t[ 5], tmp);
  110561. t[11].infinity = 0;
  110562. sp_384_proj_point_dbl_12(&t[12], &t[ 6], tmp);
  110563. t[12].infinity = 0;
  110564. sp_384_proj_point_add_12(&t[13], &t[ 7], &t[ 6], tmp);
  110565. t[13].infinity = 0;
  110566. sp_384_proj_point_dbl_12(&t[14], &t[ 7], tmp);
  110567. t[14].infinity = 0;
  110568. sp_384_proj_point_add_12(&t[15], &t[ 8], &t[ 7], tmp);
  110569. t[15].infinity = 0;
  110570. i = 10;
  110571. n = k[i+1] << 0;
  110572. c = 28;
  110573. y = (int)(n >> 28);
  110574. #ifndef WC_NO_CACHE_RESISTANT
  110575. if (ct) {
  110576. sp_384_get_point_16_12(rt, t, y);
  110577. rt->infinity = !y;
  110578. }
  110579. else
  110580. #endif
  110581. {
  110582. XMEMCPY(rt, &t[y], sizeof(sp_point_384));
  110583. }
  110584. n <<= 4;
  110585. for (; i>=0 || c>=4; ) {
  110586. if (c < 4) {
  110587. n |= k[i--];
  110588. c += 32;
  110589. }
  110590. y = (n >> 28) & 0xf;
  110591. n <<= 4;
  110592. c -= 4;
  110593. sp_384_proj_point_dbl_12(rt, rt, tmp);
  110594. sp_384_proj_point_dbl_12(rt, rt, tmp);
  110595. sp_384_proj_point_dbl_12(rt, rt, tmp);
  110596. sp_384_proj_point_dbl_12(rt, rt, tmp);
  110597. #ifndef WC_NO_CACHE_RESISTANT
  110598. if (ct) {
  110599. sp_384_get_point_16_12(p, t, y);
  110600. p->infinity = !y;
  110601. sp_384_proj_point_add_12(rt, rt, p, tmp);
  110602. }
  110603. else
  110604. #endif
  110605. {
  110606. sp_384_proj_point_add_12(rt, rt, &t[y], tmp);
  110607. }
  110608. }
  110609. if (map != 0) {
  110610. sp_384_map_12(r, rt, tmp);
  110611. }
  110612. else {
  110613. XMEMCPY(r, rt, sizeof(sp_point_384));
  110614. }
  110615. }
  110616. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  110617. if (tmp != NULL)
  110618. #endif
  110619. {
  110620. ForceZero(tmp, sizeof(sp_digit) * 2 * 12 * 6);
  110621. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  110622. XFREE(tmp, heap, DYNAMIC_TYPE_ECC);
  110623. #endif
  110624. }
  110625. #ifndef WC_NO_CACHE_RESISTANT
  110626. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  110627. if (p != NULL)
  110628. #endif
  110629. {
  110630. ForceZero(p, sizeof(sp_point_384));
  110631. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  110632. XFREE(p, heap, DYNAMIC_TYPE_ECC);
  110633. #endif
  110634. }
  110635. #endif /* !WC_NO_CACHE_RESISTANT */
  110636. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  110637. if (t != NULL)
  110638. #endif
  110639. {
  110640. ForceZero(t, sizeof(sp_point_384) * 17);
  110641. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  110642. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  110643. #endif
  110644. }
  110645. return err;
  110646. }
  110647. #ifdef FP_ECC
  110648. #define sp_384_mont_dbl_lower_12 sp_384_mont_dbl_12
  110649. #define sp_384_mont_tpl_lower_12 sp_384_mont_tpl_12
  110650. /* Double the Montgomery form projective point p a number of times.
  110651. *
  110652. * r Result of repeated doubling of point.
  110653. * p Point to double.
  110654. * n Number of times to double
  110655. * t Temporary ordinate data.
  110656. */
  110657. static void sp_384_proj_point_dbl_n_12(sp_point_384* p, int i,
  110658. sp_digit* t)
  110659. {
  110660. sp_digit* w = t;
  110661. sp_digit* a = t + 2*12;
  110662. sp_digit* b = t + 4*12;
  110663. sp_digit* t1 = t + 6*12;
  110664. sp_digit* t2 = t + 8*12;
  110665. sp_digit* x;
  110666. sp_digit* y;
  110667. sp_digit* z;
  110668. volatile int n = i;
  110669. x = p->x;
  110670. y = p->y;
  110671. z = p->z;
  110672. /* Y = 2*Y */
  110673. sp_384_mont_dbl_12(y, y, p384_mod);
  110674. /* W = Z^4 */
  110675. sp_384_mont_sqr_12(w, z, p384_mod, p384_mp_mod);
  110676. sp_384_mont_sqr_12(w, w, p384_mod, p384_mp_mod);
  110677. #ifndef WOLFSSL_SP_SMALL
  110678. while (--n > 0)
  110679. #else
  110680. while (--n >= 0)
  110681. #endif
  110682. {
  110683. /* A = 3*(X^2 - W) */
  110684. sp_384_mont_sqr_12(t1, x, p384_mod, p384_mp_mod);
  110685. sp_384_mont_sub_12(t1, t1, w, p384_mod);
  110686. sp_384_mont_tpl_lower_12(a, t1, p384_mod);
  110687. /* B = X*Y^2 */
  110688. sp_384_mont_sqr_12(t1, y, p384_mod, p384_mp_mod);
  110689. sp_384_mont_mul_12(b, t1, x, p384_mod, p384_mp_mod);
  110690. /* X = A^2 - 2B */
  110691. sp_384_mont_sqr_12(x, a, p384_mod, p384_mp_mod);
  110692. sp_384_mont_dbl_12(t2, b, p384_mod);
  110693. sp_384_mont_sub_12(x, x, t2, p384_mod);
  110694. /* b = 2.(B - X) */
  110695. sp_384_mont_sub_lower_12(t2, b, x, p384_mod);
  110696. sp_384_mont_dbl_lower_12(b, t2, p384_mod);
  110697. /* Z = Z*Y */
  110698. sp_384_mont_mul_12(z, z, y, p384_mod, p384_mp_mod);
  110699. /* t1 = Y^4 */
  110700. sp_384_mont_sqr_12(t1, t1, p384_mod, p384_mp_mod);
  110701. #ifdef WOLFSSL_SP_SMALL
  110702. if (n != 0)
  110703. #endif
  110704. {
  110705. /* W = W*Y^4 */
  110706. sp_384_mont_mul_12(w, w, t1, p384_mod, p384_mp_mod);
  110707. }
  110708. /* y = 2*A*(B - X) - Y^4 */
  110709. sp_384_mont_mul_12(y, b, a, p384_mod, p384_mp_mod);
  110710. sp_384_mont_sub_12(y, y, t1, p384_mod);
  110711. }
  110712. #ifndef WOLFSSL_SP_SMALL
  110713. /* A = 3*(X^2 - W) */
  110714. sp_384_mont_sqr_12(t1, x, p384_mod, p384_mp_mod);
  110715. sp_384_mont_sub_12(t1, t1, w, p384_mod);
  110716. sp_384_mont_tpl_lower_12(a, t1, p384_mod);
  110717. /* B = X*Y^2 */
  110718. sp_384_mont_sqr_12(t1, y, p384_mod, p384_mp_mod);
  110719. sp_384_mont_mul_12(b, t1, x, p384_mod, p384_mp_mod);
  110720. /* X = A^2 - 2B */
  110721. sp_384_mont_sqr_12(x, a, p384_mod, p384_mp_mod);
  110722. sp_384_mont_dbl_12(t2, b, p384_mod);
  110723. sp_384_mont_sub_12(x, x, t2, p384_mod);
  110724. /* b = 2.(B - X) */
  110725. sp_384_mont_sub_lower_12(t2, b, x, p384_mod);
  110726. sp_384_mont_dbl_lower_12(b, t2, p384_mod);
  110727. /* Z = Z*Y */
  110728. sp_384_mont_mul_12(z, z, y, p384_mod, p384_mp_mod);
  110729. /* t1 = Y^4 */
  110730. sp_384_mont_sqr_12(t1, t1, p384_mod, p384_mp_mod);
  110731. /* y = 2*A*(B - X) - Y^4 */
  110732. sp_384_mont_mul_12(y, b, a, p384_mod, p384_mp_mod);
  110733. sp_384_mont_sub_12(y, y, t1, p384_mod);
  110734. #endif
  110735. /* Y = Y/2 */
  110736. sp_384_div2_12(y, y, p384_mod);
  110737. }
  110738. /* Convert the projective point to affine.
  110739. * Ordinates are in Montgomery form.
  110740. *
  110741. * a Point to convert.
  110742. * t Temporary data.
  110743. */
  110744. static void sp_384_proj_to_affine_12(sp_point_384* a, sp_digit* t)
  110745. {
  110746. sp_digit* t1 = t;
  110747. sp_digit* t2 = t + 2 * 12;
  110748. sp_digit* tmp = t + 4 * 12;
  110749. sp_384_mont_inv_12(t1, a->z, tmp);
  110750. sp_384_mont_sqr_12(t2, t1, p384_mod, p384_mp_mod);
  110751. sp_384_mont_mul_12(t1, t2, t1, p384_mod, p384_mp_mod);
  110752. sp_384_mont_mul_12(a->x, a->x, t2, p384_mod, p384_mp_mod);
  110753. sp_384_mont_mul_12(a->y, a->y, t1, p384_mod, p384_mp_mod);
  110754. XMEMCPY(a->z, p384_norm_mod, sizeof(p384_norm_mod));
  110755. }
  110756. #endif /* FP_ECC */
  110757. /* A table entry for pre-computed points. */
  110758. typedef struct sp_table_entry_384 {
  110759. sp_digit x[12];
  110760. sp_digit y[12];
  110761. } sp_table_entry_384;
  110762. #ifdef FP_ECC
  110763. #endif /* FP_ECC */
  110764. /* Add two Montgomery form projective points. The second point has a q value of
  110765. * one.
  110766. * Only the first point can be the same pointer as the result point.
  110767. *
  110768. * r Result of addition.
  110769. * p First point to add.
  110770. * q Second point to add.
  110771. * t Temporary ordinate data.
  110772. */
  110773. static void sp_384_proj_point_add_qz1_12(sp_point_384* r, const sp_point_384* p,
  110774. const sp_point_384* q, sp_digit* t)
  110775. {
  110776. sp_digit* t1 = t;
  110777. sp_digit* t2 = t + 2*12;
  110778. sp_digit* t3 = t + 4*12;
  110779. sp_digit* t4 = t + 6*12;
  110780. sp_digit* t5 = t + 8*12;
  110781. sp_digit* t6 = t + 10*12;
  110782. /* Check double */
  110783. (void)sp_384_sub_12(t1, p384_mod, q->y);
  110784. sp_384_norm_12(t1);
  110785. if ((~p->infinity & ~q->infinity &
  110786. sp_384_cmp_equal_12(p->x, q->x) & sp_384_cmp_equal_12(p->z, q->z) &
  110787. (sp_384_cmp_equal_12(p->y, q->y) | sp_384_cmp_equal_12(p->y, t1))) != 0) {
  110788. sp_384_proj_point_dbl_12(r, p, t);
  110789. }
  110790. else {
  110791. sp_digit maskp;
  110792. sp_digit maskq;
  110793. sp_digit maskt;
  110794. sp_digit* x = t2;
  110795. sp_digit* y = t5;
  110796. sp_digit* z = t6;
  110797. int i;
  110798. /* U2 = X2*Z1^2 */
  110799. sp_384_mont_sqr_12(t2, p->z, p384_mod, p384_mp_mod);
  110800. sp_384_mont_mul_12(t4, t2, p->z, p384_mod, p384_mp_mod);
  110801. sp_384_mont_mul_12(t2, t2, q->x, p384_mod, p384_mp_mod);
  110802. /* S2 = Y2*Z1^3 */
  110803. sp_384_mont_mul_12(t4, t4, q->y, p384_mod, p384_mp_mod);
  110804. /* H = U2 - X1 */
  110805. sp_384_mont_sub_12(t2, t2, p->x, p384_mod);
  110806. /* R = S2 - Y1 */
  110807. sp_384_mont_sub_12(t4, t4, p->y, p384_mod);
  110808. /* Z3 = H*Z1 */
  110809. sp_384_mont_mul_12(z, p->z, t2, p384_mod, p384_mp_mod);
  110810. /* X3 = R^2 - H^3 - 2*X1*H^2 */
  110811. sp_384_mont_sqr_12(t1, t4, p384_mod, p384_mp_mod);
  110812. sp_384_mont_sqr_12(t5, t2, p384_mod, p384_mp_mod);
  110813. sp_384_mont_mul_12(t3, p->x, t5, p384_mod, p384_mp_mod);
  110814. sp_384_mont_mul_12(t5, t5, t2, p384_mod, p384_mp_mod);
  110815. sp_384_mont_sub_12(x, t1, t5, p384_mod);
  110816. sp_384_mont_dbl_12(t1, t3, p384_mod);
  110817. sp_384_mont_sub_12(x, x, t1, p384_mod);
  110818. /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */
  110819. sp_384_mont_sub_lower_12(t3, t3, x, p384_mod);
  110820. sp_384_mont_mul_12(t3, t3, t4, p384_mod, p384_mp_mod);
  110821. sp_384_mont_mul_12(t5, t5, p->y, p384_mod, p384_mp_mod);
  110822. sp_384_mont_sub_12(y, t3, t5, p384_mod);
  110823. maskp = 0 - (q->infinity & (!p->infinity));
  110824. maskq = 0 - (p->infinity & (!q->infinity));
  110825. maskt = ~(maskp | maskq);
  110826. for (i = 0; i < 12; i++) {
  110827. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt);
  110828. }
  110829. for (i = 0; i < 12; i++) {
  110830. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt);
  110831. }
  110832. for (i = 0; i < 12; i++) {
  110833. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt);
  110834. }
  110835. r->z[0] |= p->infinity & q->infinity;
  110836. r->infinity = p->infinity & q->infinity;
  110837. }
  110838. }
  110839. #ifdef WOLFSSL_SP_SMALL
  110840. #ifdef FP_ECC
  110841. /* Generate the pre-computed table of points for the base point.
  110842. *
  110843. * width = 4
  110844. * 16 entries
  110845. * 96 bits between
  110846. *
  110847. * a The base point.
  110848. * table Place to store generated point data.
  110849. * tmp Temporary data.
  110850. * heap Heap to use for allocation.
  110851. */
  110852. static int sp_384_gen_stripe_table_12(const sp_point_384* a,
  110853. sp_table_entry_384* table, sp_digit* tmp, void* heap)
  110854. {
  110855. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  110856. sp_point_384* t = NULL;
  110857. #else
  110858. sp_point_384 t[3];
  110859. #endif
  110860. sp_point_384* s1 = NULL;
  110861. sp_point_384* s2 = NULL;
  110862. int i;
  110863. int j;
  110864. int err = MP_OKAY;
  110865. (void)heap;
  110866. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  110867. t = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 3, heap,
  110868. DYNAMIC_TYPE_ECC);
  110869. if (t == NULL)
  110870. err = MEMORY_E;
  110871. #endif
  110872. if (err == MP_OKAY) {
  110873. s1 = t + 1;
  110874. s2 = t + 2;
  110875. err = sp_384_mod_mul_norm_12(t->x, a->x, p384_mod);
  110876. }
  110877. if (err == MP_OKAY) {
  110878. err = sp_384_mod_mul_norm_12(t->y, a->y, p384_mod);
  110879. }
  110880. if (err == MP_OKAY) {
  110881. err = sp_384_mod_mul_norm_12(t->z, a->z, p384_mod);
  110882. }
  110883. if (err == MP_OKAY) {
  110884. t->infinity = 0;
  110885. sp_384_proj_to_affine_12(t, tmp);
  110886. XMEMCPY(s1->z, p384_norm_mod, sizeof(p384_norm_mod));
  110887. s1->infinity = 0;
  110888. XMEMCPY(s2->z, p384_norm_mod, sizeof(p384_norm_mod));
  110889. s2->infinity = 0;
  110890. /* table[0] = {0, 0, infinity} */
  110891. XMEMSET(&table[0], 0, sizeof(sp_table_entry_384));
  110892. /* table[1] = Affine version of 'a' in Montgomery form */
  110893. XMEMCPY(table[1].x, t->x, sizeof(table->x));
  110894. XMEMCPY(table[1].y, t->y, sizeof(table->y));
  110895. for (i=1; i<4; i++) {
  110896. sp_384_proj_point_dbl_n_12(t, 96, tmp);
  110897. sp_384_proj_to_affine_12(t, tmp);
  110898. XMEMCPY(table[1<<i].x, t->x, sizeof(table->x));
  110899. XMEMCPY(table[1<<i].y, t->y, sizeof(table->y));
  110900. }
  110901. for (i=1; i<4; i++) {
  110902. XMEMCPY(s1->x, table[1<<i].x, sizeof(table->x));
  110903. XMEMCPY(s1->y, table[1<<i].y, sizeof(table->y));
  110904. for (j=(1<<i)+1; j<(1<<(i+1)); j++) {
  110905. XMEMCPY(s2->x, table[j-(1<<i)].x, sizeof(table->x));
  110906. XMEMCPY(s2->y, table[j-(1<<i)].y, sizeof(table->y));
  110907. sp_384_proj_point_add_qz1_12(t, s1, s2, tmp);
  110908. sp_384_proj_to_affine_12(t, tmp);
  110909. XMEMCPY(table[j].x, t->x, sizeof(table->x));
  110910. XMEMCPY(table[j].y, t->y, sizeof(table->y));
  110911. }
  110912. }
  110913. }
  110914. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  110915. if (t != NULL)
  110916. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  110917. #endif
  110918. return err;
  110919. }
  110920. #endif /* FP_ECC */
  110921. #ifndef WC_NO_CACHE_RESISTANT
  110922. /* Touch each possible entry that could be being copied.
  110923. *
  110924. * r Point to copy into.
  110925. * table Table - start of the entires to access
  110926. * idx Index of entry to retrieve.
  110927. */
  110928. static void sp_384_get_entry_16_12(sp_point_384* r,
  110929. const sp_table_entry_384* table, int idx)
  110930. {
  110931. int i;
  110932. sp_digit mask;
  110933. r->x[0] = 0;
  110934. r->x[1] = 0;
  110935. r->x[2] = 0;
  110936. r->x[3] = 0;
  110937. r->x[4] = 0;
  110938. r->x[5] = 0;
  110939. r->x[6] = 0;
  110940. r->x[7] = 0;
  110941. r->x[8] = 0;
  110942. r->x[9] = 0;
  110943. r->x[10] = 0;
  110944. r->x[11] = 0;
  110945. r->y[0] = 0;
  110946. r->y[1] = 0;
  110947. r->y[2] = 0;
  110948. r->y[3] = 0;
  110949. r->y[4] = 0;
  110950. r->y[5] = 0;
  110951. r->y[6] = 0;
  110952. r->y[7] = 0;
  110953. r->y[8] = 0;
  110954. r->y[9] = 0;
  110955. r->y[10] = 0;
  110956. r->y[11] = 0;
  110957. for (i = 1; i < 16; i++) {
  110958. mask = 0 - (i == idx);
  110959. r->x[0] |= mask & table[i].x[0];
  110960. r->x[1] |= mask & table[i].x[1];
  110961. r->x[2] |= mask & table[i].x[2];
  110962. r->x[3] |= mask & table[i].x[3];
  110963. r->x[4] |= mask & table[i].x[4];
  110964. r->x[5] |= mask & table[i].x[5];
  110965. r->x[6] |= mask & table[i].x[6];
  110966. r->x[7] |= mask & table[i].x[7];
  110967. r->x[8] |= mask & table[i].x[8];
  110968. r->x[9] |= mask & table[i].x[9];
  110969. r->x[10] |= mask & table[i].x[10];
  110970. r->x[11] |= mask & table[i].x[11];
  110971. r->y[0] |= mask & table[i].y[0];
  110972. r->y[1] |= mask & table[i].y[1];
  110973. r->y[2] |= mask & table[i].y[2];
  110974. r->y[3] |= mask & table[i].y[3];
  110975. r->y[4] |= mask & table[i].y[4];
  110976. r->y[5] |= mask & table[i].y[5];
  110977. r->y[6] |= mask & table[i].y[6];
  110978. r->y[7] |= mask & table[i].y[7];
  110979. r->y[8] |= mask & table[i].y[8];
  110980. r->y[9] |= mask & table[i].y[9];
  110981. r->y[10] |= mask & table[i].y[10];
  110982. r->y[11] |= mask & table[i].y[11];
  110983. }
  110984. }
  110985. #endif /* !WC_NO_CACHE_RESISTANT */
  110986. /* Multiply the point by the scalar and return the result.
  110987. * If map is true then convert result to affine coordinates.
  110988. *
  110989. * Stripe implementation.
  110990. * Pre-generated: 2^0, 2^96, ...
  110991. * Pre-generated: products of all combinations of above.
  110992. * 4 doubles and adds (with qz=1)
  110993. *
  110994. * r Resulting point.
  110995. * k Scalar to multiply by.
  110996. * table Pre-computed table.
  110997. * map Indicates whether to convert result to affine.
  110998. * ct Constant time required.
  110999. * heap Heap to use for allocation.
  111000. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  111001. */
  111002. static int sp_384_ecc_mulmod_stripe_12(sp_point_384* r, const sp_point_384* g,
  111003. const sp_table_entry_384* table, const sp_digit* k, int map,
  111004. int ct, void* heap)
  111005. {
  111006. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  111007. sp_point_384* rt = NULL;
  111008. sp_digit* t = NULL;
  111009. #else
  111010. sp_point_384 rt[2];
  111011. sp_digit t[2 * 12 * 6];
  111012. #endif
  111013. sp_point_384* p = NULL;
  111014. int i;
  111015. int j;
  111016. int y;
  111017. int x;
  111018. int err = MP_OKAY;
  111019. (void)g;
  111020. /* Constant time used for cache attack resistance implementation. */
  111021. (void)ct;
  111022. (void)heap;
  111023. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  111024. rt = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap,
  111025. DYNAMIC_TYPE_ECC);
  111026. if (rt == NULL)
  111027. err = MEMORY_E;
  111028. if (err == MP_OKAY) {
  111029. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 12 * 6, heap,
  111030. DYNAMIC_TYPE_ECC);
  111031. if (t == NULL)
  111032. err = MEMORY_E;
  111033. }
  111034. #endif
  111035. if (err == MP_OKAY) {
  111036. p = rt + 1;
  111037. XMEMCPY(p->z, p384_norm_mod, sizeof(p384_norm_mod));
  111038. XMEMCPY(rt->z, p384_norm_mod, sizeof(p384_norm_mod));
  111039. y = 0;
  111040. x = 95;
  111041. for (j=0; j<4; j++) {
  111042. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  111043. x += 96;
  111044. }
  111045. #ifndef WC_NO_CACHE_RESISTANT
  111046. if (ct) {
  111047. sp_384_get_entry_16_12(rt, table, y);
  111048. } else
  111049. #endif
  111050. {
  111051. XMEMCPY(rt->x, table[y].x, sizeof(table[y].x));
  111052. XMEMCPY(rt->y, table[y].y, sizeof(table[y].y));
  111053. }
  111054. rt->infinity = !y;
  111055. for (i=94; i>=0; i--) {
  111056. y = 0;
  111057. x = i;
  111058. for (j=0; j<4; j++) {
  111059. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  111060. x += 96;
  111061. }
  111062. sp_384_proj_point_dbl_12(rt, rt, t);
  111063. #ifndef WC_NO_CACHE_RESISTANT
  111064. if (ct) {
  111065. sp_384_get_entry_16_12(p, table, y);
  111066. }
  111067. else
  111068. #endif
  111069. {
  111070. XMEMCPY(p->x, table[y].x, sizeof(table[y].x));
  111071. XMEMCPY(p->y, table[y].y, sizeof(table[y].y));
  111072. }
  111073. p->infinity = !y;
  111074. sp_384_proj_point_add_qz1_12(rt, rt, p, t);
  111075. }
  111076. if (map != 0) {
  111077. sp_384_map_12(r, rt, t);
  111078. }
  111079. else {
  111080. XMEMCPY(r, rt, sizeof(sp_point_384));
  111081. }
  111082. }
  111083. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  111084. if (t != NULL)
  111085. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  111086. if (rt != NULL)
  111087. XFREE(rt, heap, DYNAMIC_TYPE_ECC);
  111088. #endif
  111089. return err;
  111090. }
  111091. #ifdef FP_ECC
  111092. #ifndef FP_ENTRIES
  111093. #define FP_ENTRIES 16
  111094. #endif
  111095. /* Cache entry - holds precomputation tables for a point. */
  111096. typedef struct sp_cache_384_t {
  111097. /* X ordinate of point that table was generated from. */
  111098. sp_digit x[12];
  111099. /* Y ordinate of point that table was generated from. */
  111100. sp_digit y[12];
  111101. /* Precomputation table for point. */
  111102. sp_table_entry_384 table[16];
  111103. /* Count of entries in table. */
  111104. uint32_t cnt;
  111105. /* Point and table set in entry. */
  111106. int set;
  111107. } sp_cache_384_t;
  111108. /* Cache of tables. */
  111109. static THREAD_LS_T sp_cache_384_t sp_cache_384[FP_ENTRIES];
  111110. /* Index of last entry in cache. */
  111111. static THREAD_LS_T int sp_cache_384_last = -1;
  111112. /* Cache has been initialized. */
  111113. static THREAD_LS_T int sp_cache_384_inited = 0;
  111114. #ifndef HAVE_THREAD_LS
  111115. static volatile int initCacheMutex_384 = 0;
  111116. static wolfSSL_Mutex sp_cache_384_lock;
  111117. #endif
  111118. /* Get the cache entry for the point.
  111119. *
  111120. * g [in] Point scalar multipling.
  111121. * cache [out] Cache table to use.
  111122. */
  111123. static void sp_ecc_get_cache_384(const sp_point_384* g, sp_cache_384_t** cache)
  111124. {
  111125. int i;
  111126. int j;
  111127. uint32_t least;
  111128. if (sp_cache_384_inited == 0) {
  111129. for (i=0; i<FP_ENTRIES; i++) {
  111130. sp_cache_384[i].set = 0;
  111131. }
  111132. sp_cache_384_inited = 1;
  111133. }
  111134. /* Compare point with those in cache. */
  111135. for (i=0; i<FP_ENTRIES; i++) {
  111136. if (!sp_cache_384[i].set)
  111137. continue;
  111138. if (sp_384_cmp_equal_12(g->x, sp_cache_384[i].x) &
  111139. sp_384_cmp_equal_12(g->y, sp_cache_384[i].y)) {
  111140. sp_cache_384[i].cnt++;
  111141. break;
  111142. }
  111143. }
  111144. /* No match. */
  111145. if (i == FP_ENTRIES) {
  111146. /* Find empty entry. */
  111147. i = (sp_cache_384_last + 1) % FP_ENTRIES;
  111148. for (; i != sp_cache_384_last; i=(i+1)%FP_ENTRIES) {
  111149. if (!sp_cache_384[i].set) {
  111150. break;
  111151. }
  111152. }
  111153. /* Evict least used. */
  111154. if (i == sp_cache_384_last) {
  111155. least = sp_cache_384[0].cnt;
  111156. for (j=1; j<FP_ENTRIES; j++) {
  111157. if (sp_cache_384[j].cnt < least) {
  111158. i = j;
  111159. least = sp_cache_384[i].cnt;
  111160. }
  111161. }
  111162. }
  111163. XMEMCPY(sp_cache_384[i].x, g->x, sizeof(sp_cache_384[i].x));
  111164. XMEMCPY(sp_cache_384[i].y, g->y, sizeof(sp_cache_384[i].y));
  111165. sp_cache_384[i].set = 1;
  111166. sp_cache_384[i].cnt = 1;
  111167. }
  111168. *cache = &sp_cache_384[i];
  111169. sp_cache_384_last = i;
  111170. }
  111171. #endif /* FP_ECC */
  111172. /* Multiply the base point of P384 by the scalar and return the result.
  111173. * If map is true then convert result to affine coordinates.
  111174. *
  111175. * r Resulting point.
  111176. * g Point to multiply.
  111177. * k Scalar to multiply by.
  111178. * map Indicates whether to convert result to affine.
  111179. * ct Constant time required.
  111180. * heap Heap to use for allocation.
  111181. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  111182. */
  111183. static int sp_384_ecc_mulmod_12(sp_point_384* r, const sp_point_384* g, const sp_digit* k,
  111184. int map, int ct, void* heap)
  111185. {
  111186. #ifndef FP_ECC
  111187. return sp_384_ecc_mulmod_fast_12(r, g, k, map, ct, heap);
  111188. #else
  111189. sp_digit tmp[2 * 12 * 7];
  111190. sp_cache_384_t* cache;
  111191. int err = MP_OKAY;
  111192. #ifndef HAVE_THREAD_LS
  111193. if (initCacheMutex_384 == 0) {
  111194. wc_InitMutex(&sp_cache_384_lock);
  111195. initCacheMutex_384 = 1;
  111196. }
  111197. if (wc_LockMutex(&sp_cache_384_lock) != 0)
  111198. err = BAD_MUTEX_E;
  111199. #endif /* HAVE_THREAD_LS */
  111200. if (err == MP_OKAY) {
  111201. sp_ecc_get_cache_384(g, &cache);
  111202. if (cache->cnt == 2)
  111203. sp_384_gen_stripe_table_12(g, cache->table, tmp, heap);
  111204. #ifndef HAVE_THREAD_LS
  111205. wc_UnLockMutex(&sp_cache_384_lock);
  111206. #endif /* HAVE_THREAD_LS */
  111207. if (cache->cnt < 2) {
  111208. err = sp_384_ecc_mulmod_fast_12(r, g, k, map, ct, heap);
  111209. }
  111210. else {
  111211. err = sp_384_ecc_mulmod_stripe_12(r, g, cache->table, k,
  111212. map, ct, heap);
  111213. }
  111214. }
  111215. return err;
  111216. #endif
  111217. }
  111218. #else
  111219. #ifdef FP_ECC
  111220. /* Generate the pre-computed table of points for the base point.
  111221. *
  111222. * width = 8
  111223. * 256 entries
  111224. * 48 bits between
  111225. *
  111226. * a The base point.
  111227. * table Place to store generated point data.
  111228. * tmp Temporary data.
  111229. * heap Heap to use for allocation.
  111230. */
  111231. static int sp_384_gen_stripe_table_12(const sp_point_384* a,
  111232. sp_table_entry_384* table, sp_digit* tmp, void* heap)
  111233. {
  111234. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  111235. sp_point_384* t = NULL;
  111236. #else
  111237. sp_point_384 t[3];
  111238. #endif
  111239. sp_point_384* s1 = NULL;
  111240. sp_point_384* s2 = NULL;
  111241. int i;
  111242. int j;
  111243. int err = MP_OKAY;
  111244. (void)heap;
  111245. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  111246. t = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 3, heap,
  111247. DYNAMIC_TYPE_ECC);
  111248. if (t == NULL)
  111249. err = MEMORY_E;
  111250. #endif
  111251. if (err == MP_OKAY) {
  111252. s1 = t + 1;
  111253. s2 = t + 2;
  111254. err = sp_384_mod_mul_norm_12(t->x, a->x, p384_mod);
  111255. }
  111256. if (err == MP_OKAY) {
  111257. err = sp_384_mod_mul_norm_12(t->y, a->y, p384_mod);
  111258. }
  111259. if (err == MP_OKAY) {
  111260. err = sp_384_mod_mul_norm_12(t->z, a->z, p384_mod);
  111261. }
  111262. if (err == MP_OKAY) {
  111263. t->infinity = 0;
  111264. sp_384_proj_to_affine_12(t, tmp);
  111265. XMEMCPY(s1->z, p384_norm_mod, sizeof(p384_norm_mod));
  111266. s1->infinity = 0;
  111267. XMEMCPY(s2->z, p384_norm_mod, sizeof(p384_norm_mod));
  111268. s2->infinity = 0;
  111269. /* table[0] = {0, 0, infinity} */
  111270. XMEMSET(&table[0], 0, sizeof(sp_table_entry_384));
  111271. /* table[1] = Affine version of 'a' in Montgomery form */
  111272. XMEMCPY(table[1].x, t->x, sizeof(table->x));
  111273. XMEMCPY(table[1].y, t->y, sizeof(table->y));
  111274. for (i=1; i<8; i++) {
  111275. sp_384_proj_point_dbl_n_12(t, 48, tmp);
  111276. sp_384_proj_to_affine_12(t, tmp);
  111277. XMEMCPY(table[1<<i].x, t->x, sizeof(table->x));
  111278. XMEMCPY(table[1<<i].y, t->y, sizeof(table->y));
  111279. }
  111280. for (i=1; i<8; i++) {
  111281. XMEMCPY(s1->x, table[1<<i].x, sizeof(table->x));
  111282. XMEMCPY(s1->y, table[1<<i].y, sizeof(table->y));
  111283. for (j=(1<<i)+1; j<(1<<(i+1)); j++) {
  111284. XMEMCPY(s2->x, table[j-(1<<i)].x, sizeof(table->x));
  111285. XMEMCPY(s2->y, table[j-(1<<i)].y, sizeof(table->y));
  111286. sp_384_proj_point_add_qz1_12(t, s1, s2, tmp);
  111287. sp_384_proj_to_affine_12(t, tmp);
  111288. XMEMCPY(table[j].x, t->x, sizeof(table->x));
  111289. XMEMCPY(table[j].y, t->y, sizeof(table->y));
  111290. }
  111291. }
  111292. }
  111293. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  111294. if (t != NULL)
  111295. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  111296. #endif
  111297. return err;
  111298. }
  111299. #endif /* FP_ECC */
  111300. #ifndef WC_NO_CACHE_RESISTANT
  111301. /* Touch each possible entry that could be being copied.
  111302. *
  111303. * r Point to copy into.
  111304. * table Table - start of the entires to access
  111305. * idx Index of entry to retrieve.
  111306. */
  111307. static void sp_384_get_entry_256_12(sp_point_384* r,
  111308. const sp_table_entry_384* table, int idx)
  111309. {
  111310. int i;
  111311. sp_digit mask;
  111312. r->x[0] = 0;
  111313. r->x[1] = 0;
  111314. r->x[2] = 0;
  111315. r->x[3] = 0;
  111316. r->x[4] = 0;
  111317. r->x[5] = 0;
  111318. r->x[6] = 0;
  111319. r->x[7] = 0;
  111320. r->x[8] = 0;
  111321. r->x[9] = 0;
  111322. r->x[10] = 0;
  111323. r->x[11] = 0;
  111324. r->y[0] = 0;
  111325. r->y[1] = 0;
  111326. r->y[2] = 0;
  111327. r->y[3] = 0;
  111328. r->y[4] = 0;
  111329. r->y[5] = 0;
  111330. r->y[6] = 0;
  111331. r->y[7] = 0;
  111332. r->y[8] = 0;
  111333. r->y[9] = 0;
  111334. r->y[10] = 0;
  111335. r->y[11] = 0;
  111336. for (i = 1; i < 256; i++) {
  111337. mask = 0 - (i == idx);
  111338. r->x[0] |= mask & table[i].x[0];
  111339. r->x[1] |= mask & table[i].x[1];
  111340. r->x[2] |= mask & table[i].x[2];
  111341. r->x[3] |= mask & table[i].x[3];
  111342. r->x[4] |= mask & table[i].x[4];
  111343. r->x[5] |= mask & table[i].x[5];
  111344. r->x[6] |= mask & table[i].x[6];
  111345. r->x[7] |= mask & table[i].x[7];
  111346. r->x[8] |= mask & table[i].x[8];
  111347. r->x[9] |= mask & table[i].x[9];
  111348. r->x[10] |= mask & table[i].x[10];
  111349. r->x[11] |= mask & table[i].x[11];
  111350. r->y[0] |= mask & table[i].y[0];
  111351. r->y[1] |= mask & table[i].y[1];
  111352. r->y[2] |= mask & table[i].y[2];
  111353. r->y[3] |= mask & table[i].y[3];
  111354. r->y[4] |= mask & table[i].y[4];
  111355. r->y[5] |= mask & table[i].y[5];
  111356. r->y[6] |= mask & table[i].y[6];
  111357. r->y[7] |= mask & table[i].y[7];
  111358. r->y[8] |= mask & table[i].y[8];
  111359. r->y[9] |= mask & table[i].y[9];
  111360. r->y[10] |= mask & table[i].y[10];
  111361. r->y[11] |= mask & table[i].y[11];
  111362. }
  111363. }
  111364. #endif /* !WC_NO_CACHE_RESISTANT */
  111365. /* Multiply the point by the scalar and return the result.
  111366. * If map is true then convert result to affine coordinates.
  111367. *
  111368. * Stripe implementation.
  111369. * Pre-generated: 2^0, 2^48, ...
  111370. * Pre-generated: products of all combinations of above.
  111371. * 8 doubles and adds (with qz=1)
  111372. *
  111373. * r Resulting point.
  111374. * k Scalar to multiply by.
  111375. * table Pre-computed table.
  111376. * map Indicates whether to convert result to affine.
  111377. * ct Constant time required.
  111378. * heap Heap to use for allocation.
  111379. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  111380. */
  111381. static int sp_384_ecc_mulmod_stripe_12(sp_point_384* r, const sp_point_384* g,
  111382. const sp_table_entry_384* table, const sp_digit* k, int map,
  111383. int ct, void* heap)
  111384. {
  111385. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  111386. sp_point_384* rt = NULL;
  111387. sp_digit* t = NULL;
  111388. #else
  111389. sp_point_384 rt[2];
  111390. sp_digit t[2 * 12 * 6];
  111391. #endif
  111392. sp_point_384* p = NULL;
  111393. int i;
  111394. int j;
  111395. int y;
  111396. int x;
  111397. int err = MP_OKAY;
  111398. (void)g;
  111399. /* Constant time used for cache attack resistance implementation. */
  111400. (void)ct;
  111401. (void)heap;
  111402. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  111403. rt = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap,
  111404. DYNAMIC_TYPE_ECC);
  111405. if (rt == NULL)
  111406. err = MEMORY_E;
  111407. if (err == MP_OKAY) {
  111408. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 12 * 6, heap,
  111409. DYNAMIC_TYPE_ECC);
  111410. if (t == NULL)
  111411. err = MEMORY_E;
  111412. }
  111413. #endif
  111414. if (err == MP_OKAY) {
  111415. p = rt + 1;
  111416. XMEMCPY(p->z, p384_norm_mod, sizeof(p384_norm_mod));
  111417. XMEMCPY(rt->z, p384_norm_mod, sizeof(p384_norm_mod));
  111418. y = 0;
  111419. x = 47;
  111420. for (j=0; j<8; j++) {
  111421. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  111422. x += 48;
  111423. }
  111424. #ifndef WC_NO_CACHE_RESISTANT
  111425. if (ct) {
  111426. sp_384_get_entry_256_12(rt, table, y);
  111427. } else
  111428. #endif
  111429. {
  111430. XMEMCPY(rt->x, table[y].x, sizeof(table[y].x));
  111431. XMEMCPY(rt->y, table[y].y, sizeof(table[y].y));
  111432. }
  111433. rt->infinity = !y;
  111434. for (i=46; i>=0; i--) {
  111435. y = 0;
  111436. x = i;
  111437. for (j=0; j<8; j++) {
  111438. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  111439. x += 48;
  111440. }
  111441. sp_384_proj_point_dbl_12(rt, rt, t);
  111442. #ifndef WC_NO_CACHE_RESISTANT
  111443. if (ct) {
  111444. sp_384_get_entry_256_12(p, table, y);
  111445. }
  111446. else
  111447. #endif
  111448. {
  111449. XMEMCPY(p->x, table[y].x, sizeof(table[y].x));
  111450. XMEMCPY(p->y, table[y].y, sizeof(table[y].y));
  111451. }
  111452. p->infinity = !y;
  111453. sp_384_proj_point_add_qz1_12(rt, rt, p, t);
  111454. }
  111455. if (map != 0) {
  111456. sp_384_map_12(r, rt, t);
  111457. }
  111458. else {
  111459. XMEMCPY(r, rt, sizeof(sp_point_384));
  111460. }
  111461. }
  111462. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  111463. if (t != NULL)
  111464. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  111465. if (rt != NULL)
  111466. XFREE(rt, heap, DYNAMIC_TYPE_ECC);
  111467. #endif
  111468. return err;
  111469. }
  111470. #ifdef FP_ECC
  111471. #ifndef FP_ENTRIES
  111472. #define FP_ENTRIES 16
  111473. #endif
  111474. /* Cache entry - holds precomputation tables for a point. */
  111475. typedef struct sp_cache_384_t {
  111476. /* X ordinate of point that table was generated from. */
  111477. sp_digit x[12];
  111478. /* Y ordinate of point that table was generated from. */
  111479. sp_digit y[12];
  111480. /* Precomputation table for point. */
  111481. sp_table_entry_384 table[256];
  111482. /* Count of entries in table. */
  111483. uint32_t cnt;
  111484. /* Point and table set in entry. */
  111485. int set;
  111486. } sp_cache_384_t;
  111487. /* Cache of tables. */
  111488. static THREAD_LS_T sp_cache_384_t sp_cache_384[FP_ENTRIES];
  111489. /* Index of last entry in cache. */
  111490. static THREAD_LS_T int sp_cache_384_last = -1;
  111491. /* Cache has been initialized. */
  111492. static THREAD_LS_T int sp_cache_384_inited = 0;
  111493. #ifndef HAVE_THREAD_LS
  111494. static volatile int initCacheMutex_384 = 0;
  111495. static wolfSSL_Mutex sp_cache_384_lock;
  111496. #endif
  111497. /* Get the cache entry for the point.
  111498. *
  111499. * g [in] Point scalar multipling.
  111500. * cache [out] Cache table to use.
  111501. */
  111502. static void sp_ecc_get_cache_384(const sp_point_384* g, sp_cache_384_t** cache)
  111503. {
  111504. int i;
  111505. int j;
  111506. uint32_t least;
  111507. if (sp_cache_384_inited == 0) {
  111508. for (i=0; i<FP_ENTRIES; i++) {
  111509. sp_cache_384[i].set = 0;
  111510. }
  111511. sp_cache_384_inited = 1;
  111512. }
  111513. /* Compare point with those in cache. */
  111514. for (i=0; i<FP_ENTRIES; i++) {
  111515. if (!sp_cache_384[i].set)
  111516. continue;
  111517. if (sp_384_cmp_equal_12(g->x, sp_cache_384[i].x) &
  111518. sp_384_cmp_equal_12(g->y, sp_cache_384[i].y)) {
  111519. sp_cache_384[i].cnt++;
  111520. break;
  111521. }
  111522. }
  111523. /* No match. */
  111524. if (i == FP_ENTRIES) {
  111525. /* Find empty entry. */
  111526. i = (sp_cache_384_last + 1) % FP_ENTRIES;
  111527. for (; i != sp_cache_384_last; i=(i+1)%FP_ENTRIES) {
  111528. if (!sp_cache_384[i].set) {
  111529. break;
  111530. }
  111531. }
  111532. /* Evict least used. */
  111533. if (i == sp_cache_384_last) {
  111534. least = sp_cache_384[0].cnt;
  111535. for (j=1; j<FP_ENTRIES; j++) {
  111536. if (sp_cache_384[j].cnt < least) {
  111537. i = j;
  111538. least = sp_cache_384[i].cnt;
  111539. }
  111540. }
  111541. }
  111542. XMEMCPY(sp_cache_384[i].x, g->x, sizeof(sp_cache_384[i].x));
  111543. XMEMCPY(sp_cache_384[i].y, g->y, sizeof(sp_cache_384[i].y));
  111544. sp_cache_384[i].set = 1;
  111545. sp_cache_384[i].cnt = 1;
  111546. }
  111547. *cache = &sp_cache_384[i];
  111548. sp_cache_384_last = i;
  111549. }
  111550. #endif /* FP_ECC */
  111551. /* Multiply the base point of P384 by the scalar and return the result.
  111552. * If map is true then convert result to affine coordinates.
  111553. *
  111554. * r Resulting point.
  111555. * g Point to multiply.
  111556. * k Scalar to multiply by.
  111557. * map Indicates whether to convert result to affine.
  111558. * ct Constant time required.
  111559. * heap Heap to use for allocation.
  111560. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  111561. */
  111562. static int sp_384_ecc_mulmod_12(sp_point_384* r, const sp_point_384* g, const sp_digit* k,
  111563. int map, int ct, void* heap)
  111564. {
  111565. #ifndef FP_ECC
  111566. return sp_384_ecc_mulmod_fast_12(r, g, k, map, ct, heap);
  111567. #else
  111568. sp_digit tmp[2 * 12 * 7];
  111569. sp_cache_384_t* cache;
  111570. int err = MP_OKAY;
  111571. #ifndef HAVE_THREAD_LS
  111572. if (initCacheMutex_384 == 0) {
  111573. wc_InitMutex(&sp_cache_384_lock);
  111574. initCacheMutex_384 = 1;
  111575. }
  111576. if (wc_LockMutex(&sp_cache_384_lock) != 0)
  111577. err = BAD_MUTEX_E;
  111578. #endif /* HAVE_THREAD_LS */
  111579. if (err == MP_OKAY) {
  111580. sp_ecc_get_cache_384(g, &cache);
  111581. if (cache->cnt == 2)
  111582. sp_384_gen_stripe_table_12(g, cache->table, tmp, heap);
  111583. #ifndef HAVE_THREAD_LS
  111584. wc_UnLockMutex(&sp_cache_384_lock);
  111585. #endif /* HAVE_THREAD_LS */
  111586. if (cache->cnt < 2) {
  111587. err = sp_384_ecc_mulmod_fast_12(r, g, k, map, ct, heap);
  111588. }
  111589. else {
  111590. err = sp_384_ecc_mulmod_stripe_12(r, g, cache->table, k,
  111591. map, ct, heap);
  111592. }
  111593. }
  111594. return err;
  111595. #endif
  111596. }
  111597. #endif /* WOLFSSL_SP_SMALL */
  111598. /* Multiply the point by the scalar and return the result.
  111599. * If map is true then convert result to affine coordinates.
  111600. *
  111601. * km Scalar to multiply by.
  111602. * p Point to multiply.
  111603. * r Resulting point.
  111604. * map Indicates whether to convert result to affine.
  111605. * heap Heap to use for allocation.
  111606. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  111607. */
  111608. int sp_ecc_mulmod_384(const mp_int* km, const ecc_point* gm, ecc_point* r,
  111609. int map, void* heap)
  111610. {
  111611. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  111612. sp_point_384* point = NULL;
  111613. sp_digit* k = NULL;
  111614. #else
  111615. sp_point_384 point[1];
  111616. sp_digit k[12];
  111617. #endif
  111618. int err = MP_OKAY;
  111619. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  111620. point = (sp_point_384*)XMALLOC(sizeof(sp_point_384), heap,
  111621. DYNAMIC_TYPE_ECC);
  111622. if (point == NULL)
  111623. err = MEMORY_E;
  111624. if (err == MP_OKAY) {
  111625. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 12, heap,
  111626. DYNAMIC_TYPE_ECC);
  111627. if (k == NULL)
  111628. err = MEMORY_E;
  111629. }
  111630. #endif
  111631. if (err == MP_OKAY) {
  111632. sp_384_from_mp(k, 12, km);
  111633. sp_384_point_from_ecc_point_12(point, gm);
  111634. err = sp_384_ecc_mulmod_12(point, point, k, map, 1, heap);
  111635. }
  111636. if (err == MP_OKAY) {
  111637. err = sp_384_point_to_ecc_point_12(point, r);
  111638. }
  111639. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  111640. if (k != NULL)
  111641. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  111642. if (point != NULL)
  111643. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  111644. #endif
  111645. return err;
  111646. }
  111647. /* Multiply the point by the scalar, add point a and return the result.
  111648. * If map is true then convert result to affine coordinates.
  111649. *
  111650. * km Scalar to multiply by.
  111651. * p Point to multiply.
  111652. * am Point to add to scalar mulitply result.
  111653. * inMont Point to add is in montgomery form.
  111654. * r Resulting point.
  111655. * map Indicates whether to convert result to affine.
  111656. * heap Heap to use for allocation.
  111657. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  111658. */
  111659. int sp_ecc_mulmod_add_384(const mp_int* km, const ecc_point* gm,
  111660. const ecc_point* am, int inMont, ecc_point* r, int map, void* heap)
  111661. {
  111662. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  111663. sp_point_384* point = NULL;
  111664. sp_digit* k = NULL;
  111665. #else
  111666. sp_point_384 point[2];
  111667. sp_digit k[12 + 12 * 2 * 6];
  111668. #endif
  111669. sp_point_384* addP = NULL;
  111670. sp_digit* tmp = NULL;
  111671. int err = MP_OKAY;
  111672. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  111673. point = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap,
  111674. DYNAMIC_TYPE_ECC);
  111675. if (point == NULL)
  111676. err = MEMORY_E;
  111677. if (err == MP_OKAY) {
  111678. k = (sp_digit*)XMALLOC(
  111679. sizeof(sp_digit) * (12 + 12 * 2 * 6), heap,
  111680. DYNAMIC_TYPE_ECC);
  111681. if (k == NULL)
  111682. err = MEMORY_E;
  111683. }
  111684. #endif
  111685. if (err == MP_OKAY) {
  111686. addP = point + 1;
  111687. tmp = k + 12;
  111688. sp_384_from_mp(k, 12, km);
  111689. sp_384_point_from_ecc_point_12(point, gm);
  111690. sp_384_point_from_ecc_point_12(addP, am);
  111691. }
  111692. if ((err == MP_OKAY) && (!inMont)) {
  111693. err = sp_384_mod_mul_norm_12(addP->x, addP->x, p384_mod);
  111694. }
  111695. if ((err == MP_OKAY) && (!inMont)) {
  111696. err = sp_384_mod_mul_norm_12(addP->y, addP->y, p384_mod);
  111697. }
  111698. if ((err == MP_OKAY) && (!inMont)) {
  111699. err = sp_384_mod_mul_norm_12(addP->z, addP->z, p384_mod);
  111700. }
  111701. if (err == MP_OKAY) {
  111702. err = sp_384_ecc_mulmod_12(point, point, k, 0, 0, heap);
  111703. }
  111704. if (err == MP_OKAY) {
  111705. sp_384_proj_point_add_12(point, point, addP, tmp);
  111706. if (map) {
  111707. sp_384_map_12(point, point, tmp);
  111708. }
  111709. err = sp_384_point_to_ecc_point_12(point, r);
  111710. }
  111711. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  111712. if (k != NULL)
  111713. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  111714. if (point != NULL)
  111715. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  111716. #endif
  111717. return err;
  111718. }
  111719. #ifdef WOLFSSL_SP_SMALL
  111720. /* Striping precomputation table.
  111721. * 4 points combined into a table of 16 points.
  111722. * Distance of 96 between points.
  111723. */
  111724. static const sp_table_entry_384 p384_table[16] = {
  111725. /* 0 */
  111726. { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  111727. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
  111728. /* 1 */
  111729. { { 0x49c0b528,0x3dd07566,0xa0d6ce38,0x20e378e2,0x541b4d6e,0x879c3afc,
  111730. 0x59a30eff,0x64548684,0x614ede2b,0x812ff723,0x299e1513,0x4d3aadc2 },
  111731. { 0x4b03a4fe,0x23043dad,0x7bb4a9ac,0xa1bfa8bf,0x2e83b050,0x8bade756,
  111732. 0x68f4ffd9,0xc6c35219,0x3969a840,0xdd800226,0x5a15c5e9,0x2b78abc2 } },
  111733. /* 2 */
  111734. { { 0xf26feef9,0x24480c57,0x3a0e1240,0xc31a2694,0x273e2bc7,0x735002c3,
  111735. 0x3ef1ed4c,0x8c42e9c5,0x7f4948e8,0x028babf6,0x8a978632,0x6a502f43 },
  111736. { 0xb74536fe,0xf5f13a46,0xd8a9f0eb,0x1d218bab,0x37232768,0x30f36bcc,
  111737. 0x576e8c18,0xc5317b31,0x9bbcb766,0xef1d57a6,0xb3e3d4dc,0x917c4930 } },
  111738. /* 3 */
  111739. { { 0xe349ddd0,0x11426e2e,0x9b2fc250,0x9f117ef9,0xec0174a6,0xff36b480,
  111740. 0x18458466,0x4f4bde76,0x05806049,0x2f2edb6d,0x19dfca92,0x8adc75d1 },
  111741. { 0xb7d5a7ce,0xa619d097,0xa34411e9,0x874275e5,0x0da4b4ef,0x5403e047,
  111742. 0x77901d8f,0x2ebaafd9,0xa747170f,0x5e63ebce,0x7f9d8036,0x12a36944 } },
  111743. /* 4 */
  111744. { { 0x2f9fbe67,0x378205de,0x7f728e44,0xc4afcb83,0x682e00f1,0xdbcec06c,
  111745. 0x114d5423,0xf2a145c3,0x7a52463e,0xa01d9874,0x7d717b0a,0xfc0935b1 },
  111746. { 0xd4d01f95,0x9653bc4f,0x9560ad34,0x9aa83ea8,0xaf8e3f3f,0xf77943dc,
  111747. 0xe86fe16e,0x70774a10,0xbf9ffdcf,0x6b62e6f1,0x588745c9,0x8a72f39e } },
  111748. /* 5 */
  111749. { { 0x2341c342,0x73ade4da,0xea704422,0xdd326e54,0x3741cef3,0x336c7d98,
  111750. 0x59e61549,0x1eafa00d,0xbd9a3efd,0xcd3ed892,0xc5c6c7e4,0x03faf26c },
  111751. { 0x3045f8ac,0x087e2fcf,0x174f1e73,0x14a65532,0xfe0af9a7,0x2cf84f28,
  111752. 0x2cdc935b,0xddfd7a84,0x6929c895,0x4c0f117b,0x4c8bcfcc,0x356572d6 } },
  111753. /* 6 */
  111754. { { 0x3f3b236f,0xfab08607,0x81e221da,0x19e9d41d,0x3927b428,0xf3f6571e,
  111755. 0x7550f1f6,0x4348a933,0xa85e62f0,0x7167b996,0x7f5452bf,0x62d43759 },
  111756. { 0xf2955926,0xd85feb9e,0x6df78353,0x440a561f,0x9ca36b59,0x389668ec,
  111757. 0xa22da016,0x052bf1a1,0xf6093254,0xbdfbff72,0xe22209f3,0x94e50f28 } },
  111758. /* 7 */
  111759. { { 0x3062e8af,0x90b2e5b3,0xe8a3d369,0xa8572375,0x201db7b1,0x3fe1b00b,
  111760. 0xee651aa2,0xe926def0,0xb9b10ad7,0x6542c9be,0xa2fcbe74,0x098e309b },
  111761. { 0xfff1d63f,0x779deeb3,0x20bfd374,0x23d0e80a,0x8768f797,0x8452bb3b,
  111762. 0x1f952856,0xcf75bb4d,0x29ea3faa,0x8fe6b400,0x81373a53,0x12bd3e40 } },
  111763. /* 8 */
  111764. { { 0x16973cf4,0x070d34e1,0x7e4f34f7,0x20aee08b,0x5eb8ad29,0x269af9b9,
  111765. 0xa6a45dda,0xdde0a036,0x63df41e0,0xa18b528e,0xa260df2a,0x03cc71b2 },
  111766. { 0xa06b1dd7,0x24a6770a,0x9d2675d3,0x5bfa9c11,0x96844432,0x73c1e2a1,
  111767. 0x131a6cf0,0x3660558d,0x2ee79454,0xb0289c83,0xc6d8ddcd,0xa6aefb01 } },
  111768. /* 9 */
  111769. { { 0x01ab5245,0xba1464b4,0xc48d93ff,0x9b8d0b6d,0x93ad272c,0x939867dc,
  111770. 0xae9fdc77,0xbebe085e,0x894ea8bd,0x73ae5103,0x39ac22e1,0x740fc89a },
  111771. { 0x28e23b23,0x5e28b0a3,0xe13104d0,0x2352722e,0xb0a2640d,0xf4667a18,
  111772. 0x49bb37c3,0xac74a72e,0xe81e183a,0x79f734f0,0x3fd9c0eb,0xbffe5b6c } },
  111773. /* 10 */
  111774. { { 0x00623f3b,0x03cf2922,0x5f29ebff,0x095c7111,0x80aa6823,0x42d72247,
  111775. 0x7458c0b0,0x044c7ba1,0x0959ec20,0xca62f7ef,0xf8ca929f,0x40ae2ab7 },
  111776. { 0xa927b102,0xb8c5377a,0xdc031771,0x398a86a0,0xc216a406,0x04908f9d,
  111777. 0x918d3300,0xb423a73a,0xe0b94739,0x634b0ff1,0x2d69f697,0xe29de725 } },
  111778. /* 11 */
  111779. { { 0x8435af04,0x744d1400,0xfec192da,0x5f255b1d,0x336dc542,0x1f17dc12,
  111780. 0x636a68a8,0x5c90c2a7,0x7704ca1e,0x960c9eb7,0x6fb3d65a,0x9de8cf1e },
  111781. { 0x511d3d06,0xc60fee0d,0xf9eb52c7,0x466e2313,0x206b0914,0x743c0f5f,
  111782. 0x2191aa4d,0x42f55bac,0xffebdbc2,0xcefc7c8f,0xe6e8ed1c,0xd4fa6081 } },
  111783. /* 12 */
  111784. { { 0x98683186,0x867db639,0xddcc4ea9,0xfb5cf424,0xd4f0e7bd,0xcc9a7ffe,
  111785. 0x7a779f7e,0x7c57f71c,0xd6b25ef2,0x90774079,0xb4081680,0x90eae903 },
  111786. { 0x0ee1fceb,0xdf2aae5e,0xe86c1a1f,0x3ff1da24,0xca193edf,0x80f587d6,
  111787. 0xdc9b9d6a,0xa5695523,0x85920303,0x7b840900,0xba6dbdef,0x1efa4dfc } },
  111788. /* 13 */
  111789. { { 0xe0540015,0xfbd838f9,0xc39077dc,0x2c323946,0xad619124,0x8b1fb9e6,
  111790. 0x0ca62ea8,0x9612440c,0x2dbe00ff,0x9ad9b52c,0xae197643,0xf52abaa1 },
  111791. { 0x2cac32ad,0xd0e89894,0x62a98f91,0xdfb79e42,0x276f55cb,0x65452ecf,
  111792. 0x7ad23e12,0xdb1ac0d2,0xde4986f0,0xf68c5f6a,0x82ce327d,0x389ac37b } },
  111793. /* 14 */
  111794. { { 0xb8a9e8c9,0xcd96866d,0x5bb8091e,0xa11963b8,0x045b3cd2,0xc7f90d53,
  111795. 0x80f36504,0x755a72b5,0x21d3751c,0x46f8b399,0x53c193de,0x4bffdc91 },
  111796. { 0xb89554e7,0xcd15c049,0xf7a26be6,0x353c6754,0xbd41d970,0x79602370,
  111797. 0x12b176c0,0xde16470b,0x40c8809d,0x56ba1175,0xe435fb1e,0xe2db35c3 } },
  111798. /* 15 */
  111799. { { 0x6328e33f,0xd71e4aab,0xaf8136d1,0x5486782b,0x86d57231,0x07a4995f,
  111800. 0x1651a968,0xf1f0a5bd,0x76803b6d,0xa5dc5b24,0x42dda935,0x5c587cbc },
  111801. { 0xbae8b4c0,0x2b6cdb32,0xb1331138,0x66d1598b,0x5d7e9614,0x4a23b2d2,
  111802. 0x74a8c05d,0x93e402a6,0xda7ce82e,0x45ac94e6,0xe463d465,0xeb9f8281 } },
  111803. };
  111804. /* Multiply the base point of P384 by the scalar and return the result.
  111805. * If map is true then convert result to affine coordinates.
  111806. *
  111807. * Stripe implementation.
  111808. * Pre-generated: 2^0, 2^96, ...
  111809. * Pre-generated: products of all combinations of above.
  111810. * 4 doubles and adds (with qz=1)
  111811. *
  111812. * r Resulting point.
  111813. * k Scalar to multiply by.
  111814. * map Indicates whether to convert result to affine.
  111815. * ct Constant time required.
  111816. * heap Heap to use for allocation.
  111817. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  111818. */
  111819. static int sp_384_ecc_mulmod_base_12(sp_point_384* r, const sp_digit* k,
  111820. int map, int ct, void* heap)
  111821. {
  111822. return sp_384_ecc_mulmod_stripe_12(r, &p384_base, p384_table,
  111823. k, map, ct, heap);
  111824. }
  111825. #else
  111826. /* Striping precomputation table.
  111827. * 8 points combined into a table of 256 points.
  111828. * Distance of 48 between points.
  111829. */
  111830. static const sp_table_entry_384 p384_table[256] = {
  111831. /* 0 */
  111832. { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  111833. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
  111834. /* 1 */
  111835. { { 0x49c0b528,0x3dd07566,0xa0d6ce38,0x20e378e2,0x541b4d6e,0x879c3afc,
  111836. 0x59a30eff,0x64548684,0x614ede2b,0x812ff723,0x299e1513,0x4d3aadc2 },
  111837. { 0x4b03a4fe,0x23043dad,0x7bb4a9ac,0xa1bfa8bf,0x2e83b050,0x8bade756,
  111838. 0x68f4ffd9,0xc6c35219,0x3969a840,0xdd800226,0x5a15c5e9,0x2b78abc2 } },
  111839. /* 2 */
  111840. { { 0x2b0c535b,0x29864753,0x70506296,0x90dd6953,0x216ab9ac,0x038cd6b4,
  111841. 0xbe12d76a,0x3df9b7b7,0x5f347bdb,0x13f4d978,0x13e94489,0x222c5c9c },
  111842. { 0x2680dc64,0x5f8e796f,0x58352417,0x120e7cb7,0xd10740b8,0x254b5d8a,
  111843. 0x5337dee6,0xc38b8efb,0x94f02247,0xf688c2e1,0x6c25bc4c,0x7b5c75f3 } },
  111844. /* 3 */
  111845. { { 0x9edffea5,0xe26a3cc3,0x37d7e9fc,0x35bbfd1c,0x9bde3ef6,0xf0e7700d,
  111846. 0x1a538f5a,0x0380eb47,0x05bf9eb3,0x2e9da8bb,0x1a460c3e,0xdbb93c73 },
  111847. { 0xf526b605,0x37dba260,0xfd785537,0x95d4978e,0xed72a04a,0x24ed793a,
  111848. 0x76005b1a,0x26948377,0x9e681f82,0x99f557b9,0xd64954ef,0xae5f9557 } },
  111849. /* 4 */
  111850. { { 0xf26feef9,0x24480c57,0x3a0e1240,0xc31a2694,0x273e2bc7,0x735002c3,
  111851. 0x3ef1ed4c,0x8c42e9c5,0x7f4948e8,0x028babf6,0x8a978632,0x6a502f43 },
  111852. { 0xb74536fe,0xf5f13a46,0xd8a9f0eb,0x1d218bab,0x37232768,0x30f36bcc,
  111853. 0x576e8c18,0xc5317b31,0x9bbcb766,0xef1d57a6,0xb3e3d4dc,0x917c4930 } },
  111854. /* 5 */
  111855. { { 0xe349ddd0,0x11426e2e,0x9b2fc250,0x9f117ef9,0xec0174a6,0xff36b480,
  111856. 0x18458466,0x4f4bde76,0x05806049,0x2f2edb6d,0x19dfca92,0x8adc75d1 },
  111857. { 0xb7d5a7ce,0xa619d097,0xa34411e9,0x874275e5,0x0da4b4ef,0x5403e047,
  111858. 0x77901d8f,0x2ebaafd9,0xa747170f,0x5e63ebce,0x7f9d8036,0x12a36944 } },
  111859. /* 6 */
  111860. { { 0x4fc52870,0x28f9c07a,0x1a53a961,0xce0b3748,0x0e1828d9,0xd550fa18,
  111861. 0x6adb225a,0xa24abaf7,0x6e58a348,0xd11ed0a5,0x948acb62,0xf3d811e6 },
  111862. { 0x4c61ed22,0x8618dd77,0x80b47c9d,0x0bb747f9,0xde6b8559,0x22bf796f,
  111863. 0x680a21e9,0xfdfd1c6d,0x2af2c9dd,0xc0db1577,0xc1e90f3d,0xa09379e6 } },
  111864. /* 7 */
  111865. { { 0xe085c629,0x386c66ef,0x095bc89a,0x5fc2a461,0x203f4b41,0x1353d631,
  111866. 0x7e4bd8f5,0x7ca1972b,0xa7df8ce9,0xb077380a,0xee7e4ea3,0xd8a90389 },
  111867. { 0xe7b14461,0x1bc74dc7,0x0c9c4f78,0xdc2cb014,0x84ef0a10,0x52b4b3a6,
  111868. 0x20327fe2,0xbde6ea5d,0x660f9615,0xb71ec435,0xb8ad8173,0xeede5a04 } },
  111869. /* 8 */
  111870. { { 0x893b9a2d,0x5584cbb3,0x00850c5d,0x820c660b,0x7df2d43d,0x4126d826,
  111871. 0x0109e801,0xdd5bbbf0,0x38172f1c,0x85b92ee3,0xf31430d9,0x609d4f93 },
  111872. { 0xeadaf9d6,0x1e059a07,0x0f125fb0,0x70e6536c,0x560f20e7,0xd6220751,
  111873. 0x7aaf3a9a,0xa59489ae,0x64bae14e,0x7b70e2f6,0x76d08249,0x0dd03701 } },
  111874. /* 9 */
  111875. { { 0x8510521f,0x4cc13be8,0xf724cc17,0x87315ba9,0x353dc263,0xb49d83bb,
  111876. 0x0c279257,0x8b677efe,0xc93c9537,0x510a1c1c,0xa4702c99,0x33e30cd8 },
  111877. { 0x2208353f,0xf0ffc89d,0xced42b2b,0x0170fa8d,0x26e2a5f5,0x090851ed,
  111878. 0xecb52c96,0x81276455,0x7fe1adf4,0x0646c4e1,0xb0868eab,0x513f047e } },
  111879. /* 10 */
  111880. { { 0xdf5bdf53,0xc07611f4,0x58b11a6d,0x45d331a7,0x1c4ee394,0x58965daf,
  111881. 0x5a5878d1,0xba8bebe7,0x82dd3025,0xaecc0a18,0xa923eb8b,0xcf2a3899 },
  111882. { 0xd24fd048,0xf98c9281,0x8bbb025d,0x841bfb59,0xc9ab9d53,0xb8ddf8ce,
  111883. 0x7fef044e,0x538a4cb6,0x23236662,0x092ac21f,0x0b66f065,0xa919d385 } },
  111884. /* 11 */
  111885. { { 0x85d480d8,0x3db03b40,0x1b287a7d,0x8cd9f479,0x4a8f3bae,0x8f24dc75,
  111886. 0x3db41892,0x482eb800,0x9c56e0f5,0x38bf9eb3,0x9a91dc6f,0x8b977320 },
  111887. { 0x7209cfc2,0xa31b05b2,0x05b2db70,0x4c49bf85,0xd619527b,0x56462498,
  111888. 0x1fac51ba,0x3fe51039,0xab4b8342,0xfb04f55e,0x04c6eabf,0xc07c10dc } },
  111889. /* 12 */
  111890. { { 0xdb32f048,0xad22fe4c,0x475ed6df,0x5f23bf91,0xaa66b6cb,0xa50ce0c0,
  111891. 0xf03405c0,0xdf627a89,0xf95e2d6a,0x3674837d,0xba42e64e,0x081c95b6 },
  111892. { 0xe71d6ceb,0xeba3e036,0x6c6b0271,0xb45bcccf,0x0684701d,0x67b47e63,
  111893. 0xe712523f,0x60f8f942,0x5cd47adc,0x82423472,0x87649cbb,0x83027d79 } },
  111894. /* 13 */
  111895. { { 0x3615b0b8,0xb3929ea6,0xa54dac41,0xb41441fd,0xb5b6a368,0x8995d556,
  111896. 0x167ef05e,0xa80d4529,0x6d25a27f,0xf6bcb4a1,0x7bd55b68,0x210d6a4c },
  111897. { 0x25351130,0xf3804abb,0x903e37eb,0x1d2df699,0x084c25c8,0x5f201efc,
  111898. 0xa1c68e91,0x31a28c87,0x563f62a5,0x81dad253,0xd6c415d4,0x5dd6de70 } },
  111899. /* 14 */
  111900. { { 0x846612ce,0x29f470fd,0xda18d997,0x986f3eec,0x2f34af86,0x6b84c161,
  111901. 0x46ddaf8b,0x5ef0a408,0xe49e795f,0x14405a00,0xaa2f7a37,0x5f491b16 },
  111902. { 0xdb41b38d,0xc7f07ae4,0x18fbfcaa,0xef7d119e,0x14443b19,0x3a18e076,
  111903. 0x79a19926,0x4356841a,0xe2226fbe,0x91f4a91c,0x3cc88721,0xdc77248c } },
  111904. /* 15 */
  111905. { { 0xe4b1ec9d,0xd570ff1a,0xe7eef706,0x21d23e0e,0xca19e086,0x3cde40f4,
  111906. 0xcd4bb270,0x7d6523c4,0xbf13aa6c,0x16c1f06c,0xd14c4b60,0x5aa7245a },
  111907. { 0x44b74de8,0x37f81467,0x620a934e,0x839e7a17,0xde8b1aa1,0xf74d14e8,
  111908. 0xf30d75e2,0x8789fa51,0xc81c261e,0x09b24052,0x33c565ee,0x654e2678 } },
  111909. /* 16 */
  111910. { { 0x2f9fbe67,0x378205de,0x7f728e44,0xc4afcb83,0x682e00f1,0xdbcec06c,
  111911. 0x114d5423,0xf2a145c3,0x7a52463e,0xa01d9874,0x7d717b0a,0xfc0935b1 },
  111912. { 0xd4d01f95,0x9653bc4f,0x9560ad34,0x9aa83ea8,0xaf8e3f3f,0xf77943dc,
  111913. 0xe86fe16e,0x70774a10,0xbf9ffdcf,0x6b62e6f1,0x588745c9,0x8a72f39e } },
  111914. /* 17 */
  111915. { { 0x2341c342,0x73ade4da,0xea704422,0xdd326e54,0x3741cef3,0x336c7d98,
  111916. 0x59e61549,0x1eafa00d,0xbd9a3efd,0xcd3ed892,0xc5c6c7e4,0x03faf26c },
  111917. { 0x3045f8ac,0x087e2fcf,0x174f1e73,0x14a65532,0xfe0af9a7,0x2cf84f28,
  111918. 0x2cdc935b,0xddfd7a84,0x6929c895,0x4c0f117b,0x4c8bcfcc,0x356572d6 } },
  111919. /* 18 */
  111920. { { 0x7d8c1bba,0x7ecbac01,0x90b0f3d5,0x6058f9c3,0xf6197d0f,0xaee116e3,
  111921. 0x4033b128,0xc4dd7068,0xc209b983,0xf084dba6,0x831dbc4a,0x97c7c2cf },
  111922. { 0xf96010e8,0x2f4e61dd,0x529faa17,0xd97e4e20,0x69d37f20,0x4ee66660,
  111923. 0x3d366d72,0xccc139ed,0x13488e0f,0x690b6ee2,0xf3a6d533,0x7cad1dc5 } },
  111924. /* 19 */
  111925. { { 0xda57a41f,0x660a9a81,0xec0039b6,0xe74a0412,0x5e1dad15,0x42343c6b,
  111926. 0x46681d4c,0x284f3ff5,0x63749e89,0xb51087f1,0x6f9f2f13,0x070f23cc },
  111927. { 0x5d186e14,0x542211da,0xfddb0dff,0x84748f37,0xdb1f4180,0x41a3aab4,
  111928. 0xa6402d0e,0x25ed667b,0x02f58355,0x2f2924a9,0xfa44a689,0x5844ee7c } },
  111929. /* 20 */
  111930. { { 0x3f3b236f,0xfab08607,0x81e221da,0x19e9d41d,0x3927b428,0xf3f6571e,
  111931. 0x7550f1f6,0x4348a933,0xa85e62f0,0x7167b996,0x7f5452bf,0x62d43759 },
  111932. { 0xf2955926,0xd85feb9e,0x6df78353,0x440a561f,0x9ca36b59,0x389668ec,
  111933. 0xa22da016,0x052bf1a1,0xf6093254,0xbdfbff72,0xe22209f3,0x94e50f28 } },
  111934. /* 21 */
  111935. { { 0x3062e8af,0x90b2e5b3,0xe8a3d369,0xa8572375,0x201db7b1,0x3fe1b00b,
  111936. 0xee651aa2,0xe926def0,0xb9b10ad7,0x6542c9be,0xa2fcbe74,0x098e309b },
  111937. { 0xfff1d63f,0x779deeb3,0x20bfd374,0x23d0e80a,0x8768f797,0x8452bb3b,
  111938. 0x1f952856,0xcf75bb4d,0x29ea3faa,0x8fe6b400,0x81373a53,0x12bd3e40 } },
  111939. /* 22 */
  111940. { { 0x104cbba5,0xc023780d,0xfa35dd4c,0x6207e747,0x1ca9b6a3,0x35c23928,
  111941. 0x97987b10,0x4ff19be8,0x8022eee8,0xb8476bbf,0xd3bbe74d,0xaa0a4a14 },
  111942. { 0x187d4543,0x20f94331,0x79f6e066,0x32153870,0xac7e82e1,0x83b0f74e,
  111943. 0x828f06ab,0xa7748ba2,0xc26ef35f,0xc5f0298a,0x8e9a7dbd,0x0f0c5070 } },
  111944. /* 23 */
  111945. { { 0xdef029dd,0x0c5c244c,0x850661b8,0x3dabc687,0xfe11d981,0x9992b865,
  111946. 0x6274dbad,0xe9801b8f,0x098da242,0xe54e6319,0x91a53d08,0x9929a91a },
  111947. { 0x35285887,0x37bffd72,0xf1418102,0xbc759425,0xfd2e6e20,0x9280cc35,
  111948. 0xfbc42ee5,0x735c600c,0x8837619a,0xb7ad2864,0xa778c57b,0xa3627231 } },
  111949. /* 24 */
  111950. { { 0x91361ed8,0xae799b5c,0x6c63366c,0x47d71b75,0x1b265a6a,0x54cdd521,
  111951. 0x98d77b74,0xe0215a59,0xbab29db0,0x4424d9b7,0x7fd9e536,0x8b0ffacc },
  111952. { 0x37b5d9ef,0x46d85d12,0xbfa91747,0x5b106d62,0x5f99ba2d,0xed0479f8,
  111953. 0x1d104de4,0x0e6f3923,0x25e8983f,0x83a84c84,0xf8105a70,0xa9507e0a } },
  111954. /* 25 */
  111955. { { 0x14cf381c,0xf6c68a6e,0xc22e31cc,0xaf9d27bd,0xaa8a5ccb,0x23568d4d,
  111956. 0xe338e4d2,0xe431eec0,0x8f52ad1f,0xf1a828fe,0xe86acd80,0xdb6a0579 },
  111957. { 0x4507832a,0x2885672e,0x887e5289,0x73fc275f,0x05610d08,0x65f80278,
  111958. 0x075ff5b0,0x8d9b4554,0x09f712b5,0x3a8e8fb1,0x2ebe9cf2,0x39f0ac86 } },
  111959. /* 26 */
  111960. { { 0x4c52edf5,0xd8fabf78,0xa589ae53,0xdcd737e5,0xd791ab17,0x94918bf0,
  111961. 0xbcff06c9,0xb5fbd956,0xdca46d45,0xf6d3032e,0x41a3e486,0x2cdff7e1 },
  111962. { 0x61f47ec8,0x6674b3ba,0xeef84608,0x8a882163,0x4c687f90,0xa257c705,
  111963. 0xf6cdf227,0xe30cb2ed,0x7f6ea846,0x2c4c64ca,0xcc6bcd3c,0x186fa17c } },
  111964. /* 27 */
  111965. { { 0x1dfcb91e,0x48a3f536,0x646d358a,0x83595e13,0x91128798,0xbd15827b,
  111966. 0x2187757a,0x3ce612b8,0x61bd7372,0x873150a1,0xb662f568,0xf4684530 },
  111967. { 0x401896f6,0x8833950b,0x77f3e090,0xe11cb89a,0x48e7f4a5,0xb2f12cac,
  111968. 0xf606677e,0x313dd769,0x16579f93,0xfdcf08b3,0x46b8f22b,0x6429cec9 } },
  111969. /* 28 */
  111970. { { 0xbb75f9a4,0x4984dd54,0x29d3b570,0x4aef06b9,0x3d6e4c1e,0xb5f84ca2,
  111971. 0xb083ef35,0x24c61c11,0x392ca9ff,0xce4a7392,0x6730a800,0x865d6517 },
  111972. { 0x722b4a2b,0xca3dfe76,0x7b083e0e,0x12c04bf9,0x1b86b8a5,0x803ce5b5,
  111973. 0x6a7e3e0c,0x3fc7632d,0xc81adbe4,0xc89970c2,0x120e16b1,0x3cbcd3ad } },
  111974. /* 29 */
  111975. { { 0xec30ce93,0xfbfb4cc7,0xb72720a2,0x10ed6c7d,0x47b55500,0xec675bf7,
  111976. 0x333ff7c3,0x90725903,0x5075bfc0,0xc7c3973e,0x07acf31b,0xb049ecb0 },
  111977. { 0x4f58839c,0xb4076eaf,0xa2b05e4f,0x101896da,0xab40c66e,0x3f6033b0,
  111978. 0xc8d864ba,0x19ee9eeb,0x47bf6d2a,0xeb6cf155,0xf826477d,0x8e5a9663 } },
  111979. /* 30 */
  111980. { { 0xf7fbd5e1,0x69e62fdd,0x76912b1d,0x38ecfe54,0xd1da3bfb,0x845a3d56,
  111981. 0x1c86f0d4,0x0494950e,0x3bc36ce8,0x83cadbf9,0x4fccc8d1,0x41fce572 },
  111982. { 0x8332c144,0x05f939c2,0x0871e46e,0xb17f248b,0x66e8aff6,0x3d8534e2,
  111983. 0x3b85c629,0x1d06f1dc,0xa3131b73,0xdb06a32e,0x8b3f64e5,0xf295184d } },
  111984. /* 31 */
  111985. { { 0x36ddc103,0xd9653ff7,0x95ef606f,0x25f43e37,0xfe06dce8,0x09e301fc,
  111986. 0x30b6eebf,0x85af2341,0x0ff56b20,0x79b12b53,0xfe9a3c6b,0x9b4fb499 },
  111987. { 0x51d27ac2,0x0154f892,0x56ca5389,0xd33167e3,0xafc065a6,0x7828ec1f,
  111988. 0x7f746c9b,0x0959a258,0x0c44f837,0xb18f1be3,0xc4132fdb,0xa7946117 } },
  111989. /* 32 */
  111990. { { 0x5e3c647b,0xc0426b77,0x8cf05348,0xbfcbd939,0x172c0d3d,0x31d312e3,
  111991. 0xee754737,0x5f49fde6,0x6da7ee61,0x895530f0,0xe8b3a5fb,0xcf281b0a },
  111992. { 0x41b8a543,0xfd149735,0x3080dd30,0x41a625a7,0x653908cf,0xe2baae07,
  111993. 0xba02a278,0xc3d01436,0x7b21b8f8,0xa0d0222e,0xd7ec1297,0xfdc270e9 } },
  111994. /* 33 */
  111995. { { 0xbc7f41d6,0x00873c0c,0x1b7ad641,0xd976113e,0x238443fb,0x2a536ff4,
  111996. 0x41e62e45,0x030d00e2,0x5f545fc6,0x532e9867,0x8e91208c,0xcd033108 },
  111997. { 0x9797612c,0xd1a04c99,0xeea674e2,0xd4393e02,0xe19742a1,0xd56fa69e,
  111998. 0x85f0590e,0xdd2ab480,0x48a2243d,0xa5cefc52,0x54383f41,0x48cc67b6 } },
  111999. /* 34 */
  112000. { { 0xfc14ab48,0x4e50430e,0x26706a74,0x195b7f4f,0xcc881ff6,0x2fe8a228,
  112001. 0xd945013d,0xb1b968e2,0x4b92162b,0x936aa579,0x364e754a,0x4fb766b7 },
  112002. { 0x31e1ff7f,0x13f93bca,0xce4f2691,0x696eb5ca,0xa2b09e02,0xff754bf8,
  112003. 0xe58e3ff8,0x58f13c9c,0x1678c0b0,0xb757346f,0xa86692b3,0xd54200db } },
  112004. /* 35 */
  112005. { { 0x6dda1265,0x9a030bbd,0xe89718dd,0xf7b4f3fc,0x936065b8,0xa6a4931f,
  112006. 0x5f72241c,0xbce72d87,0x65775857,0x6cbb51cb,0x4e993675,0xc7161815 },
  112007. { 0x2ee32189,0xe81a0f79,0x277dc0b2,0xef2fab26,0xb71f469f,0x9e64f6fe,
  112008. 0xdfdaf859,0xb448ce33,0xbe6b5df1,0x3f5c1c4c,0x1de45f7b,0xfb8dfb00 } },
  112009. /* 36 */
  112010. { { 0x4d5bb921,0xc7345fa7,0x4d2b667e,0x5c7e04be,0x282d7a3e,0x47ed3a80,
  112011. 0x7e47b2a4,0x5c2777f8,0x08488e2e,0x89b3b100,0xb2eb5b45,0x9aad77c2 },
  112012. { 0xdaac34ae,0xd681bca7,0x26afb326,0x2452e4e5,0x41a1ee14,0x0c887924,
  112013. 0xc2407ade,0x743b04d4,0xfc17a2ac,0xcb5e999b,0x4a701a06,0x4dca2f82 } },
  112014. /* 37 */
  112015. { { 0x1127bc1a,0x68e31ca6,0x17ead3be,0xa3edd59b,0xe25f5a15,0x67b6b645,
  112016. 0xa420e15e,0x76221794,0x4b1e872e,0x794fd83b,0xb2dece1b,0x7cab3f03 },
  112017. { 0xca9b3586,0x7119bf15,0x4d250bd7,0xa5545924,0xcc6bcf24,0x173633ea,
  112018. 0xb1b6f884,0x9bd308c2,0x447d38c3,0x3bae06f5,0xf341fe1c,0x54dcc135 } },
  112019. /* 38 */
  112020. { { 0x943caf0d,0x56d3598d,0x225ff133,0xce044ea9,0x563fadea,0x9edf6a7c,
  112021. 0x73e8dc27,0x632eb944,0x3190dcab,0x814b467e,0x6dbb1e31,0x2d4f4f31 },
  112022. { 0xa143b7ca,0x8d69811c,0xde7cf950,0x4ec1ac32,0x37b5fe82,0x223ab5fd,
  112023. 0x9390f1d9,0xe82616e4,0x75804610,0xabff4b20,0x875b08f0,0x11b9be15 } },
  112024. /* 39 */
  112025. { { 0x3bbe682c,0x4ae31a3d,0x74eef2dd,0xbc7c5d26,0x3c47dd40,0x92afd10a,
  112026. 0xc14ab9e1,0xec7e0a3b,0xb2e495e4,0x6a6c3dd1,0x309bcd85,0x085ee5e9 },
  112027. { 0x8c2e67fd,0xf381a908,0xe261eaf2,0x32083a80,0x96deee15,0x0fcd6a49,
  112028. 0x5e524c79,0xe3b8fb03,0x1d5b08b9,0x8dc360d9,0x7f26719f,0x3a06e2c8 } },
  112029. /* 40 */
  112030. { { 0x7237cac0,0x5cd9f5a8,0x43586794,0x93f0b59d,0xe94f6c4e,0x4384a764,
  112031. 0xb62782d3,0x8304ed2b,0xcde06015,0x0b8db8b3,0x5dbe190f,0x4336dd53 },
  112032. { 0x92ab473a,0x57443553,0xbe5ed046,0x031c7275,0x21909aa4,0x3e78678c,
  112033. 0x99202ddb,0x4ab7e04f,0x6977e635,0x2648d206,0x093198be,0xd427d184 } },
  112034. /* 41 */
  112035. { { 0x0f9b5a31,0x822848f5,0xbaadb62a,0xbb003468,0x3357559c,0x233a0472,
  112036. 0x79aee843,0x49ef6880,0xaeb9e1e3,0xa89867a0,0x1f6f9a55,0xc151931b },
  112037. { 0xad74251e,0xd264eb0b,0x4abf295e,0x37b9b263,0x04960d10,0xb600921b,
  112038. 0x4da77dc0,0x0de53dbc,0xd2b18697,0x01d9bab3,0xf7156ddf,0xad54ec7a } },
  112039. /* 42 */
  112040. { { 0x79efdc58,0x8e74dc35,0x4ff68ddb,0x456bd369,0xd32096a5,0x724e74cc,
  112041. 0x386783d0,0xe41cff42,0x7c70d8a4,0xa04c7f21,0xe61a19a2,0x41199d2f },
  112042. { 0x29c05dd2,0xd389a3e0,0xe7e3fda9,0x535f2a6b,0x7c2b4df8,0x26ecf72d,
  112043. 0xfe745294,0x678275f4,0x9d23f519,0x6319c9cc,0x88048fc4,0x1e05a02d } },
  112044. /* 43 */
  112045. { { 0xd4d5ffe8,0x75cc8e2e,0xdbea17f2,0xf8bb4896,0xcee3cb4a,0x35059790,
  112046. 0xa47c6165,0x4c06ee85,0x92935d2f,0xf98fff25,0x32ffd7c7,0x34c4a572 },
  112047. { 0xea0376a2,0xc4b14806,0x4f115e02,0x2ea5e750,0x1e55d7c0,0x532d76e2,
  112048. 0xf31044da,0x68dc9411,0x71b77993,0x9272e465,0x93a8cfd5,0xadaa38bb } },
  112049. /* 44 */
  112050. { { 0x7d4ed72a,0x4bf0c712,0xba1f79a3,0xda0e9264,0xf4c39ea4,0x48c0258b,
  112051. 0x2a715138,0xa5394ed8,0xbf06c660,0x4af511ce,0xec5c37cd,0xfcebceef },
  112052. { 0x779ae8c1,0xf23b75aa,0xad1e606e,0xdeff59cc,0x22755c82,0xf3f526fd,
  112053. 0xbb32cefd,0x64c5ab44,0x915bdefd,0xa96e11a2,0x1143813e,0xab19746a } },
  112054. /* 45 */
  112055. { { 0xec837d7d,0x43c78585,0xb8ee0ba4,0xca5b6fbc,0xd5dbb5ee,0x34e924d9,
  112056. 0xbb4f1ca5,0x3f4fa104,0x398640f7,0x15458b72,0xd7f407ea,0x4231faa9 },
  112057. { 0xf96e6896,0x53e0661e,0xd03b0f9d,0x554e4c69,0x9c7858d1,0xd4fcb07b,
  112058. 0x52cb04fa,0x7e952793,0x8974e7f7,0x5f5f1574,0x6b6d57c8,0x2e3fa558 } },
  112059. /* 46 */
  112060. { { 0x6a9951a8,0x42cd4803,0x42792ad0,0xa8b15b88,0xabb29a73,0x18e8bcf9,
  112061. 0x409933e8,0xbfd9a092,0xefb88dc4,0x760a3594,0x40724458,0x14418863 },
  112062. { 0x99caedc7,0x162a56ee,0x91d101c9,0x8fb12ecd,0x393202da,0xea671967,
  112063. 0xa4ccd796,0x1aac8c4a,0x1cf185a8,0x7db05036,0x8cfd095a,0x0c9f86cd } },
  112064. /* 47 */
  112065. { { 0x10b2a556,0x9a728147,0x327b70b2,0x767ca964,0x5e3799b7,0x04ed9e12,
  112066. 0x22a3eb2a,0x6781d2dc,0x0d9450ac,0x5bd116eb,0xa7ebe08a,0xeccac1fc },
  112067. { 0xdc2d6e94,0xde68444f,0x35ecf21b,0x3621f429,0x29e03a2c,0x14e2d543,
  112068. 0x7d3e7f0a,0x53e42cd5,0x73ed00b9,0xbba26c09,0xc57d2272,0x00297c39 } },
  112069. /* 48 */
  112070. { { 0xb8243a7d,0x3aaaab10,0x8fa58c5b,0x6eeef93e,0x9ae7f764,0xf866fca3,
  112071. 0x61ab04d3,0x64105a26,0x03945d66,0xa3578d8a,0x791b848c,0xb08cd3e4 },
  112072. { 0x756d2411,0x45edc5f8,0xa755128c,0xd4a790d9,0x49e5f6a0,0xc2cf0963,
  112073. 0xf649beaa,0xc66d267d,0x8467039e,0x3ce6d968,0x42f7816f,0x50046c6b } },
  112074. /* 49 */
  112075. { { 0x66425043,0x92ae1602,0xf08db890,0x1ff66afd,0x8f162ce5,0x386f5a7f,
  112076. 0xfcf5598f,0x18d2dea0,0x1a8ca18e,0x78372b3a,0x8cd0e6f7,0xdf0d20eb },
  112077. { 0x75bb4045,0x7edd5e1d,0xb96d94b7,0x252a47ce,0x2c626776,0xbdb29358,
  112078. 0x40dd1031,0x853c3943,0x7d5f47fd,0x9dc9becf,0xbae4044a,0x27c2302f } },
  112079. /* 50 */
  112080. { { 0x8f2d49ce,0x2d1d208a,0x162df0a2,0x0d91aa02,0x09a07f65,0x9c5cce87,
  112081. 0x84339012,0xdf07238b,0x419442cd,0x5028e2c8,0x72062aba,0x2dcbd358 },
  112082. { 0xe4680967,0xb5fbc3cb,0x9f92d72c,0x2a7bc645,0x116c369d,0x806c76e1,
  112083. 0x3177e8d8,0x5c50677a,0x4569df57,0x753739eb,0x36c3f40b,0x2d481ef6 } },
  112084. /* 51 */
  112085. { { 0xfea1103e,0x1a2d39fd,0x95f81b17,0xeaae5592,0xf59b264a,0xdbd0aa18,
  112086. 0xcb592ee0,0x90c39c1a,0x9750cca3,0xdf62f80d,0xdf97cc6c,0xda4d8283 },
  112087. { 0x1e201067,0x0a6dd346,0x69fb1f6b,0x1531f859,0x1d60121f,0x4895e552,
  112088. 0x4c041c91,0x0b21aab0,0xbcc1ccf8,0x9d896c46,0x3141bde7,0xd24da3b3 } },
  112089. /* 52 */
  112090. { { 0x53b0a354,0x575a0537,0x0c6ddcd8,0x392ff2f4,0x56157b94,0x0b8e8cff,
  112091. 0x3b1b80d1,0x073e57bd,0x3fedee15,0x2a75e0f0,0xaa8e6f19,0x752380e4 },
  112092. { 0x6558ffe9,0x1f4e227c,0x19ec5415,0x3a348618,0xf7997085,0xab382d5e,
  112093. 0xddc46ac2,0x5e6deaff,0xfc8d094c,0xe5144078,0xf60e37c6,0xf674fe51 } },
  112094. /* 53 */
  112095. { { 0xaf63408f,0x6fb87ae5,0xcd75a737,0xa39c36a9,0xcf4c618d,0x7833313f,
  112096. 0xf034c88d,0xfbcd4482,0x39b35288,0x4469a761,0x66b5d9c9,0x77a711c5 },
  112097. { 0x944f8d65,0x4a695dc7,0x161aaba8,0xe6da5f65,0x24601669,0x8654e9c3,
  112098. 0x28ae7491,0xbc8b93f5,0x8f5580d8,0x5f1d1e83,0xcea32cc8,0x8ccf9a1a } },
  112099. /* 54 */
  112100. { { 0x7196fee2,0x28ab110c,0x874c8945,0x75799d63,0x29aedadd,0xa2629348,
  112101. 0x2be88ff4,0x9714cc7b,0xd58d60d6,0xf71293cf,0x32a564e9,0xda6b6cb3 },
  112102. { 0x3dd821c2,0xf43fddb1,0x90dd323d,0xf2f2785f,0x048489f8,0x91246419,
  112103. 0xd24c6749,0x61660f26,0xc803c15c,0x961d9e8c,0xfaadc4c9,0x631c6158 } },
  112104. /* 55 */
  112105. { { 0xfd752366,0xacf2ebe0,0x139be88b,0xb93c340e,0x0f20179e,0x98f66485,
  112106. 0xff1da785,0x14820254,0x4f85c16e,0x5278e276,0x7aab1913,0xa246ee45 },
  112107. { 0x53763b33,0x43861eb4,0x45c0bc0d,0xc49f03fc,0xad6b1ea1,0xafff16bc,
  112108. 0x6fd49c99,0xce33908b,0xf7fde8c3,0x5c51e9bf,0xff142c5e,0x076a7a39 } },
  112109. /* 56 */
  112110. { { 0x9e338d10,0x04639dfe,0xf42b411b,0x8ee6996f,0xa875cef2,0x960461d1,
  112111. 0x95b4d0ba,0x1057b6d6,0xa906e0bc,0x27639252,0xe1c20f8a,0x2c19f09a },
  112112. { 0xeef4c43d,0x5b8fc3f0,0x07a84aa9,0xe2e1b1a8,0x835d2bdb,0x5f455528,
  112113. 0x207132dd,0x0f4aee4d,0x3907f675,0xe9f8338c,0x0e0531f0,0x7a874dc9 } },
  112114. /* 57 */
  112115. { { 0x97c27050,0x84b22d45,0x59e70bf8,0xbd0b8df7,0x79738b9b,0xb4d67405,
  112116. 0xcd917c4f,0x47f4d5f5,0x13ce6e33,0x9099c4ce,0x521d0f8b,0x942bfd39 },
  112117. { 0xa43b566d,0x5028f0f6,0x21bff7de,0xaf6e8669,0xc44232cd,0x83f6f856,
  112118. 0xf915069a,0x65680579,0xecfecb85,0xd12095a2,0xdb01ba16,0xcf7f06ae } },
  112119. /* 58 */
  112120. { { 0x8ef96c80,0x0f56e3c4,0x3ddb609c,0xd521f2b3,0x7dc1450d,0x2be94102,
  112121. 0x02a91fe2,0x2d21a071,0x1efa37de,0x2e6f74fa,0x156c28a1,0x9a9a90b8 },
  112122. { 0x9dc7dfcb,0xc54ea9ea,0x2c2c1d62,0xc74e66fc,0x49d3e067,0x9f23f967,
  112123. 0x54dd38ad,0x1c7c3a46,0x5946cee3,0xc7005884,0x45cc045d,0x89856368 } },
  112124. /* 59 */
  112125. { { 0xfce73946,0x29da7cd4,0x23168563,0x8f697db5,0xcba92ec6,0x8e235e9c,
  112126. 0x9f91d3ea,0x55d4655f,0xaa50a6cd,0xf3689f23,0x21e6a1a0,0xdcf21c26 },
  112127. { 0x61b818bf,0xcffbc82e,0xda47a243,0xc74a2f96,0x8bc1a0cf,0x234e980a,
  112128. 0x7929cb6d,0xf35fd6b5,0xefe17d6c,0x81468e12,0x58b2dafb,0xddea6ae5 } },
  112129. /* 60 */
  112130. { { 0x7e787b2e,0x294de887,0x39a9310d,0x258acc1f,0xac14265d,0x92d9714a,
  112131. 0x708b48a0,0x18b5591c,0xe1abbf71,0x27cc6bb0,0x568307b9,0xc0581fa3 },
  112132. { 0xf24d4d58,0x9e0f58a3,0xe0ce2327,0xfebe9bb8,0x9d1be702,0x91fd6a41,
  112133. 0xfacac993,0x9a7d8a45,0x9e50d66d,0xabc0a08c,0x06498201,0x02c342f7 } },
  112134. /* 61 */
  112135. { { 0x157bdbc2,0xccd71407,0xad0e1605,0x72fa89c6,0xb92a015f,0xb1d3da2b,
  112136. 0xa0a3fe56,0x8ad9e7cd,0x24f06737,0x160edcbd,0x61275be6,0x79d4db33 },
  112137. { 0x5f3497c4,0xd3d31fd9,0x04192fb0,0x8cafeaee,0x13a50af3,0xe13ca745,
  112138. 0x8c85aae5,0x18826167,0x9eb556ff,0xce06cea8,0xbdb549f3,0x2eef1995 } },
  112139. /* 62 */
  112140. { { 0x50596edc,0x8ed7d3eb,0x905243a2,0xaa359362,0xa4b6d02b,0xa212c2c2,
  112141. 0xc4fbec68,0x611fd727,0xb84f733d,0x8a0b8ff7,0x5f0daf0e,0xd85a6b90 },
  112142. { 0xd4091cf7,0x60e899f5,0x2eff2768,0x4fef2b67,0x10c33964,0xc1f195cb,
  112143. 0x93626a8f,0x8275d369,0x0d6c840a,0xc77904f4,0x7a868acd,0x88d8b7fd } },
  112144. /* 63 */
  112145. { { 0x7bd98425,0x85f23723,0xc70b154e,0xd4463992,0x96687a2e,0xcbb00ee2,
  112146. 0xc83214fd,0x905fdbf7,0x13593684,0x2019d293,0xef51218e,0x0428c393 },
  112147. { 0x981e909a,0x40c7623f,0x7be192da,0x92513385,0x4010907e,0x48fe480f,
  112148. 0x3120b459,0xdd7a187c,0xa1fd8f3c,0xc9d7702d,0xe358efc5,0x66e4753b } },
  112149. /* 64 */
  112150. { { 0x16973cf4,0x070d34e1,0x7e4f34f7,0x20aee08b,0x5eb8ad29,0x269af9b9,
  112151. 0xa6a45dda,0xdde0a036,0x63df41e0,0xa18b528e,0xa260df2a,0x03cc71b2 },
  112152. { 0xa06b1dd7,0x24a6770a,0x9d2675d3,0x5bfa9c11,0x96844432,0x73c1e2a1,
  112153. 0x131a6cf0,0x3660558d,0x2ee79454,0xb0289c83,0xc6d8ddcd,0xa6aefb01 } },
  112154. /* 65 */
  112155. { { 0x01ab5245,0xba1464b4,0xc48d93ff,0x9b8d0b6d,0x93ad272c,0x939867dc,
  112156. 0xae9fdc77,0xbebe085e,0x894ea8bd,0x73ae5103,0x39ac22e1,0x740fc89a },
  112157. { 0x28e23b23,0x5e28b0a3,0xe13104d0,0x2352722e,0xb0a2640d,0xf4667a18,
  112158. 0x49bb37c3,0xac74a72e,0xe81e183a,0x79f734f0,0x3fd9c0eb,0xbffe5b6c } },
  112159. /* 66 */
  112160. { { 0xc6a2123f,0xb1a358f5,0xfe28df6d,0x927b2d95,0xf199d2f9,0x89702753,
  112161. 0x1a3f82dc,0x0a73754c,0x777affe1,0x063d029d,0xdae6d34d,0x5439817e },
  112162. { 0x6b8b83c4,0xf7979eef,0x9d945682,0x615cb214,0xc5e57eae,0x8f0e4fac,
  112163. 0x113047dd,0x042b89b8,0x93f36508,0x888356dc,0x5fd1f32f,0xbf008d18 } },
  112164. /* 67 */
  112165. { { 0x4e8068db,0x8012aa24,0xa5729a47,0xc72cc641,0x43f0691d,0x3c33df2c,
  112166. 0x1d92145f,0xfa057347,0xb97f7946,0xaefc0f2f,0x2f8121bf,0x813d75cb },
  112167. { 0x4383bba6,0x05613c72,0xa4224b3f,0xa924ce70,0x5f2179a6,0xe59cecbe,
  112168. 0x79f62b61,0x78e2e8aa,0x53ad8079,0x3ac2cc3b,0xd8f4fa96,0x55518d71 } },
  112169. /* 68 */
  112170. { { 0x00623f3b,0x03cf2922,0x5f29ebff,0x095c7111,0x80aa6823,0x42d72247,
  112171. 0x7458c0b0,0x044c7ba1,0x0959ec20,0xca62f7ef,0xf8ca929f,0x40ae2ab7 },
  112172. { 0xa927b102,0xb8c5377a,0xdc031771,0x398a86a0,0xc216a406,0x04908f9d,
  112173. 0x918d3300,0xb423a73a,0xe0b94739,0x634b0ff1,0x2d69f697,0xe29de725 } },
  112174. /* 69 */
  112175. { { 0x8435af04,0x744d1400,0xfec192da,0x5f255b1d,0x336dc542,0x1f17dc12,
  112176. 0x636a68a8,0x5c90c2a7,0x7704ca1e,0x960c9eb7,0x6fb3d65a,0x9de8cf1e },
  112177. { 0x511d3d06,0xc60fee0d,0xf9eb52c7,0x466e2313,0x206b0914,0x743c0f5f,
  112178. 0x2191aa4d,0x42f55bac,0xffebdbc2,0xcefc7c8f,0xe6e8ed1c,0xd4fa6081 } },
  112179. /* 70 */
  112180. { { 0xb0ab9645,0xb5e405d3,0xd5f1f711,0xaeec7f98,0x585c2a6e,0x8ad42311,
  112181. 0x512c6944,0x045acb9e,0xa90db1c6,0xae106c4e,0x898e6563,0xb89f33d5 },
  112182. { 0x7fed2ce4,0x43b07cd9,0xdd815b20,0xf9934e17,0x0a81a349,0x6778d4d5,
  112183. 0x52918061,0x9e616ade,0xd7e67112,0xfa06db06,0x88488091,0x1da23cf1 } },
  112184. /* 71 */
  112185. { { 0x42f2c4b5,0x821c46b3,0x66059e47,0x931513ef,0x66f50cd1,0x7030ae43,
  112186. 0x43e7b127,0x43b536c9,0x5fca5360,0x006258cf,0x6b557abf,0xe4e3ee79 },
  112187. { 0x24c8b22f,0xbb6b3900,0xfcbf1054,0x2eb5e2c1,0x567492af,0x937b18c9,
  112188. 0xacf53957,0xf09432e4,0x1dbf3a56,0x585f5a9d,0xbe0887cf,0xf86751fd } },
  112189. /* 72 */
  112190. { { 0x9d10e0b2,0x157399cb,0x60dc51b7,0x1c0d5956,0x1f583090,0x1d496b8a,
  112191. 0x88590484,0x6658bc26,0x03213f28,0x88c08ab7,0x7ae58de4,0x8d2e0f73 },
  112192. { 0x486cfee6,0x9b79bc95,0xe9e5bc57,0x036a26c7,0xcd8ae97a,0x1ad03601,
  112193. 0xff3a0494,0x06907f87,0x2c7eb584,0x078f4bbf,0x7e8d0a5a,0xe3731bf5 } },
  112194. /* 73 */
  112195. { { 0xe1cd0abe,0x72f2282b,0x87efefa2,0xd4f9015e,0x6c3834bd,0x9d189806,
  112196. 0xb8a29ced,0x9c8cdcc1,0xfee82ebc,0x0601b9f4,0x7206a756,0x371052bc },
  112197. { 0x46f32562,0x76fa1092,0x17351bb4,0xdaad534c,0xb3636bb5,0xc3d64c37,
  112198. 0x45d54e00,0x038a8c51,0x32c09e7c,0x301e6180,0x95735151,0x9764eae7 } },
  112199. /* 74 */
  112200. { { 0xcbd5256a,0x8791b19f,0x6ca13a3b,0x4007e0f2,0x4cf06904,0x03b79460,
  112201. 0xb6c17589,0xb18a9c22,0x81d45908,0xa1cb7d7d,0x21bb68f1,0x6e13fa9d },
  112202. { 0xa71e6e16,0x47183c62,0xe18749ed,0x5cf0ef8e,0x2e5ed409,0x2c9c7f9b,
  112203. 0xe6e117e1,0x042eeacc,0x13fb5a7f,0xb86d4816,0xc9e5feb1,0xea1cf0ed } },
  112204. /* 75 */
  112205. { { 0xcea4cc9b,0x6e6573c9,0xafcec8f3,0x5417961d,0xa438b6f6,0x804bf02a,
  112206. 0xdcd4ea88,0xb894b03c,0x3799571f,0xd0f807e9,0x862156e8,0x3466a7f5 },
  112207. { 0x56515664,0x51e59acd,0xa3c5eb0b,0x55b0f93c,0x6a4279db,0x84a06b02,
  112208. 0xc5fae08e,0x5c850579,0xa663a1a2,0xcf07b8db,0xf46ffc8d,0x49a36bbc } },
  112209. /* 76 */
  112210. { { 0x46d93106,0xe47f5acc,0xaa897c9c,0x65b7ade0,0x12d7e4be,0x37cf4c94,
  112211. 0xd4b2caa9,0xa2ae9b80,0xe60357a3,0x5e7ce09c,0xc8ecd5f9,0x29f77667 },
  112212. { 0xa8a0b1c5,0xdf6868f5,0x62978ad8,0x240858cf,0xdc0002a1,0x0f7ac101,
  112213. 0xffe9aa05,0x1d28a9d7,0x5b962c97,0x744984d6,0x3d28c8b2,0xa8a7c00b } },
  112214. /* 77 */
  112215. { { 0xae11a338,0x7c58a852,0xd1af96e7,0xa78613f1,0x5355cc73,0x7e9767d2,
  112216. 0x792a2de6,0x6ba37009,0x124386b2,0x7d60f618,0x11157674,0xab09b531 },
  112217. { 0x98eb9dd0,0x95a04841,0x15070328,0xe6c17acc,0x489c6e49,0xafc6da45,
  112218. 0xbb211530,0xab45a60a,0x7d7ea933,0xc58d6592,0x095642c6,0xa3ef3c65 } },
  112219. /* 78 */
  112220. { { 0xdf010879,0x89d420e9,0x39576179,0x9d25255d,0xe39513b6,0x9cdefd50,
  112221. 0xd5d1c313,0xe4efe45b,0x3f7af771,0xc0149de7,0x340ab06b,0x55a6b4f4 },
  112222. { 0xebeaf771,0xf1325251,0x878d4288,0x2ab44128,0x18e05afe,0xfcd5832e,
  112223. 0xcc1fb62b,0xef52a348,0xc1c4792a,0x2bd08274,0x877c6dc7,0x345c5846 } },
  112224. /* 79 */
  112225. { { 0xbea65e90,0xde15ceb0,0x2416d99c,0x0987f72b,0xfd863dec,0x44db578d,
  112226. 0xac6a3578,0xf617b74b,0xdb48e999,0x9e62bd7a,0xeab1a1be,0x877cae61 },
  112227. { 0x3a358610,0x23adddaa,0x325e2b07,0x2fc4d6d1,0x1585754e,0x897198f5,
  112228. 0xb392b584,0xf741852c,0xb55f7de1,0x9927804c,0x1aa8efae,0xe9e6c4ed } },
  112229. /* 80 */
  112230. { { 0x98683186,0x867db639,0xddcc4ea9,0xfb5cf424,0xd4f0e7bd,0xcc9a7ffe,
  112231. 0x7a779f7e,0x7c57f71c,0xd6b25ef2,0x90774079,0xb4081680,0x90eae903 },
  112232. { 0x0ee1fceb,0xdf2aae5e,0xe86c1a1f,0x3ff1da24,0xca193edf,0x80f587d6,
  112233. 0xdc9b9d6a,0xa5695523,0x85920303,0x7b840900,0xba6dbdef,0x1efa4dfc } },
  112234. /* 81 */
  112235. { { 0xe0540015,0xfbd838f9,0xc39077dc,0x2c323946,0xad619124,0x8b1fb9e6,
  112236. 0x0ca62ea8,0x9612440c,0x2dbe00ff,0x9ad9b52c,0xae197643,0xf52abaa1 },
  112237. { 0x2cac32ad,0xd0e89894,0x62a98f91,0xdfb79e42,0x276f55cb,0x65452ecf,
  112238. 0x7ad23e12,0xdb1ac0d2,0xde4986f0,0xf68c5f6a,0x82ce327d,0x389ac37b } },
  112239. /* 82 */
  112240. { { 0xf8e60f5b,0x511188b4,0x48aa2ada,0x7fe67015,0x381abca2,0xdb333cb8,
  112241. 0xdaf3fc97,0xb15e6d9d,0x36aabc03,0x4b24f6eb,0x72a748b4,0xc59789df },
  112242. { 0x29cf5279,0x26fcb8a5,0x01ad9a6c,0x7a3c6bfc,0x4b8bac9b,0x866cf88d,
  112243. 0x9c80d041,0xf4c89989,0x70add148,0xf0a04241,0x45d81a41,0x5a02f479 } },
  112244. /* 83 */
  112245. { { 0xc1c90202,0xfa5c877c,0xf8ac7570,0xd099d440,0xd17881f7,0x428a5b1b,
  112246. 0x5b2501d7,0x61e267db,0xf2e4465b,0xf889bf04,0x76aa4cb8,0x4da3ae08 },
  112247. { 0xe3e66861,0x3ef0fe26,0x3318b86d,0x5e772953,0x747396df,0xc3c35fbc,
  112248. 0x439ffd37,0x5115a29c,0xb2d70374,0xbfc4bd97,0x56246b9d,0x088630ea } },
  112249. /* 84 */
  112250. { { 0xb8a9e8c9,0xcd96866d,0x5bb8091e,0xa11963b8,0x045b3cd2,0xc7f90d53,
  112251. 0x80f36504,0x755a72b5,0x21d3751c,0x46f8b399,0x53c193de,0x4bffdc91 },
  112252. { 0xb89554e7,0xcd15c049,0xf7a26be6,0x353c6754,0xbd41d970,0x79602370,
  112253. 0x12b176c0,0xde16470b,0x40c8809d,0x56ba1175,0xe435fb1e,0xe2db35c3 } },
  112254. /* 85 */
  112255. { { 0x6328e33f,0xd71e4aab,0xaf8136d1,0x5486782b,0x86d57231,0x07a4995f,
  112256. 0x1651a968,0xf1f0a5bd,0x76803b6d,0xa5dc5b24,0x42dda935,0x5c587cbc },
  112257. { 0xbae8b4c0,0x2b6cdb32,0xb1331138,0x66d1598b,0x5d7e9614,0x4a23b2d2,
  112258. 0x74a8c05d,0x93e402a6,0xda7ce82e,0x45ac94e6,0xe463d465,0xeb9f8281 } },
  112259. /* 86 */
  112260. { { 0xfecf5b9b,0x34e0f9d1,0xf206966a,0xa115b12b,0x1eaa0534,0x5591cf3b,
  112261. 0xfb1558f9,0x5f0293cb,0x1bc703a5,0x1c8507a4,0x862c1f81,0x92e6b81c },
  112262. { 0xcdaf24e3,0xcc9ebc66,0x72fcfc70,0x68917ecd,0x8157ba48,0x6dc9a930,
  112263. 0xb06ab2b2,0x5d425c08,0x36e929c4,0x362f8ce7,0x62e89324,0x09f6f57c } },
  112264. /* 87 */
  112265. { { 0xd29375fb,0x1c7d6b78,0xe35d1157,0xfabd851e,0x4243ea47,0xf6f62dcd,
  112266. 0x8fe30b0f,0x1dd92460,0xffc6e709,0x08166dfa,0x0881e6a7,0xc6c4c693 },
  112267. { 0xd6a53fb0,0x20368f87,0x9eb4d1f9,0x38718e9f,0xafd7e790,0x03f08acd,
  112268. 0x72fe2a1c,0x0835eb44,0x88076e5d,0x7e050903,0xa638e731,0x538f765e } },
  112269. /* 88 */
  112270. { { 0xc2663b4b,0x0e0249d9,0x47cd38dd,0xe700ab5b,0x2c46559f,0xb192559d,
  112271. 0x4bcde66d,0x8f9f74a8,0x3e2aced5,0xad161523,0x3dd03a5b,0xc155c047 },
  112272. { 0x3be454eb,0x346a8799,0x83b7dccd,0x66ee94db,0xab9d2abe,0x1f6d8378,
  112273. 0x7733f355,0x4a396dd2,0xf53553c2,0x419bd40a,0x731dd943,0xd0ead98d } },
  112274. /* 89 */
  112275. { { 0xec142408,0x908e0b0e,0x4114b310,0x98943cb9,0x1742b1d7,0x03dbf7d8,
  112276. 0x693412f4,0xd270df6b,0x8f69e20c,0xc5065494,0x697e43a1,0xa76a90c3 },
  112277. { 0x4624825a,0xe0fa3384,0x8acc34c2,0x82e48c0b,0xe9a14f2b,0x7b24bd14,
  112278. 0x4db30803,0x4f5dd5e2,0x932da0a3,0x0c77a9e7,0x74c653dc,0x20db90f2 } },
  112279. /* 90 */
  112280. { { 0x0e6c5fd9,0x261179b7,0x6c982eea,0xf8bec123,0xd4957b7e,0x47683338,
  112281. 0x0a72f66a,0xcc47e664,0x1bad9350,0xbd54bf6a,0xf454e95a,0xdfbf4c6a },
  112282. { 0x6907f4fa,0x3f7a7afa,0x865ca735,0x7311fae0,0x2a496ada,0x24737ab8,
  112283. 0x15feb79b,0x13e425f1,0xa1b93c21,0xe9e97c50,0x4ddd3eb5,0xb26b6eac } },
  112284. /* 91 */
  112285. { { 0x2a2e5f2b,0x81cab9f5,0xbf385ac4,0xf93caf29,0xc909963a,0xf4bf35c3,
  112286. 0x74c9143c,0x081e7300,0xc281b4c5,0x3ea57fa8,0x9b340741,0xe497905c },
  112287. { 0x55ab3cfb,0xf556dd8a,0x518db6ad,0xd444b96b,0x5ef4b955,0x34f5425a,
  112288. 0xecd26aa3,0xdda7a3ac,0xda655e97,0xb57da11b,0xc2024c70,0x02da3eff } },
  112289. /* 92 */
  112290. { { 0x6481d0d9,0xe24b0036,0x818fdfe2,0x3740dbe5,0x190fda00,0xc1fc1f45,
  112291. 0x3cf27fde,0x329c9280,0x6934f43e,0x7435cb53,0x7884e8fe,0x2b505a5d },
  112292. { 0x711adcc9,0x6cfcc6a6,0x531e21e1,0xf034325c,0x9b2a8a99,0xa2f4a967,
  112293. 0x3c21bdff,0x9d5f3842,0x31b57d66,0xb25c7811,0x0b8093b9,0xdb5344d8 } },
  112294. /* 93 */
  112295. { { 0xae50a2f5,0x0d72e667,0xe4a861d1,0x9b7f8d8a,0x330df1cb,0xa129f70f,
  112296. 0xe04fefc3,0xe90aa5d7,0xe72c3ae1,0xff561ecb,0xcdb955fa,0x0d8fb428 },
  112297. { 0xd7663784,0xd2235f73,0x7e2c456a,0xc05baec6,0x2adbfccc,0xe5c292e4,
  112298. 0xefb110d5,0x4fd17988,0xd19d49f3,0x27e57734,0x84f679fe,0x188ac4ce } },
  112299. /* 94 */
  112300. { { 0xa796c53e,0x7ee344cf,0x0868009b,0xbbf6074d,0x474a1295,0x1f1594f7,
  112301. 0xac11632d,0x66776edc,0x04e2fa5a,0x1862278b,0xc854a89a,0x52665cf2 },
  112302. { 0x8104ab58,0x7e376464,0x7204fd6d,0x16775913,0x44ea1199,0x86ca06a5,
  112303. 0x1c9240dd,0xaa3f765b,0x24746149,0x5f8501a9,0xdcd251d7,0x7b982e30 } },
  112304. /* 95 */
  112305. { { 0xc15f3060,0xe44e9efc,0xa87ebbe6,0x5ad62f2e,0xc79500d4,0x36499d41,
  112306. 0x336fa9d1,0xa66d6dc0,0x5afd3b1f,0xf8afc495,0xe5c9822b,0x1d8ccb24 },
  112307. { 0x79d7584b,0x4031422b,0xea3f20dd,0xc54a0580,0x958468c5,0x3f837c8f,
  112308. 0xfbea7735,0x3d82f110,0x7dffe2fc,0x679a8778,0x20704803,0x48eba63b } },
  112309. /* 96 */
  112310. { { 0xdf46e2f6,0x89b10d41,0x19514367,0x13ab57f8,0x1d469c87,0x067372b9,
  112311. 0x4f6c5798,0x0c195afa,0x272c9acf,0xea43a12a,0x678abdac,0x9dadd8cb },
  112312. { 0xe182579a,0xcce56c6b,0x2d26c2d8,0x86febadb,0x2a44745c,0x1c668ee1,
  112313. 0x98dc047a,0x580acd86,0x51b9ec2d,0x5a2b79cc,0x4054f6a0,0x007da608 } },
  112314. /* 97 */
  112315. { { 0x17b00dd0,0x9e3ca352,0x0e81a7a6,0x046779cb,0xd482d871,0xb999fef3,
  112316. 0xd9233fbc,0xe6f38134,0xf48cd0e0,0x112c3001,0x3c6c66ae,0x934e7576 },
  112317. { 0xd73234dc,0xb44d4fc3,0x864eafc1,0xfcae2062,0x26bef21a,0x843afe25,
  112318. 0xf3b75fdf,0x61355107,0x794c2e6b,0x8367a5aa,0x8548a372,0x3d2629b1 } },
  112319. /* 98 */
  112320. { { 0x437cfaf8,0x6230618f,0x2032c299,0x5b8742cb,0x2293643a,0x949f7247,
  112321. 0x09464f79,0xb8040f1a,0x4f254143,0x049462d2,0x366c7e76,0xabd6b522 },
  112322. { 0xd5338f55,0x119b392b,0x01495a0c,0x1a80a9ce,0xf8d7537e,0xf3118ca7,
  112323. 0x6bf4b762,0xb715adc2,0xa8482b6c,0x24506165,0x96a7c84d,0xd958d7c6 } },
  112324. /* 99 */
  112325. { { 0xbdc21f31,0x9ad8aa87,0x8063e58c,0xadb3cab4,0xb07dd7b8,0xefd86283,
  112326. 0x1be7c6b4,0xc7b9b762,0x015582de,0x2ef58741,0x299addf3,0xc970c52e },
  112327. { 0x22f24d66,0x78f02e2a,0x74cc100a,0xefec1d10,0x09316e1a,0xaf2a6a39,
  112328. 0x5849dd49,0xce7c2205,0x96bffc4c,0x9c1fe75c,0x7ba06ec0,0xcad98fd2 } },
  112329. /* 100 */
  112330. { { 0xb648b73e,0xed76e2d0,0x1cfd285e,0xa9f92ce5,0x2ed13de1,0xa8c86c06,
  112331. 0xa5191a93,0x1d3a574e,0x1ad1b8bf,0x385cdf8b,0x47d2cfe3,0xbbecc28a },
  112332. { 0x69cec548,0x98d326c0,0xf240a0b2,0x4f5bc1dd,0x29057236,0x241a7062,
  112333. 0xc68294a4,0x0fc6e9c5,0xa319f17a,0x4d04838b,0x9ffc1c6f,0x8b612cf1 } },
  112334. /* 101 */
  112335. { { 0x4c3830eb,0x9bb0b501,0x8ee0d0c5,0x3d08f83c,0x79ba9389,0xa4a62642,
  112336. 0x9cbc2914,0x5d5d4044,0x074c46f0,0xae9eb83e,0x74ead7d6,0x63bb758f },
  112337. { 0xc6bb29e0,0x1c40d2ea,0x4b02f41e,0x95aa2d87,0x53cb199a,0x92989175,
  112338. 0x51584f6d,0xdd91bafe,0x31a1aaec,0x3715efb9,0x46780f9e,0xc1b6ae5b } },
  112339. /* 102 */
  112340. { { 0x42772f41,0xcded3e4b,0x3bcb79d1,0x3a700d5d,0x80feee60,0x4430d50e,
  112341. 0xf5e5d4bb,0x444ef1fc,0xe6e358ff,0xc660194f,0x6a91b43c,0xe68a2f32 },
  112342. { 0x977fe4d2,0x5842775c,0x7e2a41eb,0x78fdef5c,0xff8df00e,0x5f3bec02,
  112343. 0x5852525d,0xf4b840cd,0x4e6988bd,0x0870483a,0xcc64b837,0x39499e39 } },
  112344. /* 103 */
  112345. { { 0xb08df5fe,0xfc05de80,0x63ba0362,0x0c12957c,0xd5cf1428,0xea379414,
  112346. 0x54ef6216,0xc559132a,0xb9e65cf8,0x33d5f12f,0x1695d663,0x09c60278 },
  112347. { 0x61f7a2fb,0x3ac1ced4,0xd4f5eeb8,0xdd838444,0x8318fcad,0x82a38c6c,
  112348. 0xe9f1a864,0x315be2e5,0x442daf47,0x317b5771,0x95aa5f9e,0x81b5904a } },
  112349. /* 104 */
  112350. { { 0x8b21d232,0x6b6b1c50,0x8c2cba75,0x87f3dbc0,0xae9f0faf,0xa7e74b46,
  112351. 0xbb7b8079,0x036a0985,0x8d974a25,0x4f185b90,0xd9af5ec9,0x5aa7cef0 },
  112352. { 0x57dcfffc,0xe0566a70,0xb8453225,0x6ea311da,0x23368aa9,0x72ea1a8d,
  112353. 0x48cd552d,0xed9b2083,0xc80ea435,0xb987967c,0x6c104173,0xad735c75 } },
  112354. /* 105 */
  112355. { { 0xcee76ef4,0xaea85ab3,0xaf1d2b93,0x44997444,0xeacb923f,0x0851929b,
  112356. 0x51e3bc0c,0xb080b590,0x59be68a2,0xc4ee1d86,0x64b26cda,0xf00de219 },
  112357. { 0xf2e90d4d,0x8d7fb5c0,0x77d9ec64,0x00e219a7,0x5d1c491c,0xc4e6febd,
  112358. 0x1a8f4585,0x080e3754,0x48d2af9c,0x4a9b86c8,0xb6679851,0x2ed70db6 } },
  112359. /* 106 */
  112360. { { 0x586f25cb,0xaee44116,0xa0fcf70f,0xf7b6861f,0x18a350e8,0x55d2cd20,
  112361. 0x92dc286f,0x861bf3e5,0x6226aba7,0x9ab18ffa,0xa9857b03,0xd15827be },
  112362. { 0x92e6acef,0x26c1f547,0xac1fbac3,0x422c63c8,0xfcbfd71d,0xa2d8760d,
  112363. 0xb2511224,0x35f6a539,0x048d1a21,0xbaa88fa1,0xebf999db,0x49f1abe9 } },
  112364. /* 107 */
  112365. { { 0xf7492b73,0x16f9f4f4,0xcb392b1a,0xcf28ec1e,0x69ca6ffc,0x45b130d4,
  112366. 0xb72efa58,0x28ba8d40,0x5ca066f5,0xace987c7,0x4ad022eb,0x3e399246 },
  112367. { 0x752555bb,0x63a2d84e,0x9c2ae394,0xaaa93b4a,0xc89539ca,0xcd80424e,
  112368. 0xaa119a99,0x6d6b5a6d,0x379f2629,0xbd50334c,0xef3cc7d3,0x899e925e } },
  112369. /* 108 */
  112370. { { 0xbf825dc4,0xb7ff3651,0x40b9c462,0x0f741cc4,0x5cc4fb5b,0x771ff5a9,
  112371. 0x47fd56fe,0xcb9e9c9b,0x5626c0d3,0xbdf053db,0xf7e14098,0xa97ce675 },
  112372. { 0x6c934f5e,0x68afe5a3,0xccefc46f,0x6cd5e148,0xd7a88586,0xc7758570,
  112373. 0xdd558d40,0x49978f5e,0x64ae00c1,0xa1d5088a,0xf1d65bb2,0x58f2a720 } },
  112374. /* 109 */
  112375. { { 0x3e4daedb,0x66fdda4a,0x65d1b052,0x38318c12,0x4c4bbf5c,0x28d910a2,
  112376. 0x78a9cd14,0x762fe5c4,0xd2cc0aee,0x08e5ebaa,0xca0c654c,0xd2cdf257 },
  112377. { 0x08b717d2,0x48f7c58b,0x386cd07a,0x3807184a,0xae7d0112,0x3240f626,
  112378. 0xc43917b0,0x03e9361b,0x20aea018,0xf261a876,0x7e1e6372,0x53f556a4 } },
  112379. /* 110 */
  112380. { { 0x2f512a90,0xc84cee56,0x1b0ea9f1,0x24b3c004,0xe26cc1ea,0x0ee15d2d,
  112381. 0xf0c9ef7d,0xd848762c,0xd5341435,0x1026e9c5,0xfdb16b31,0x8f5b73dc },
  112382. { 0xd2c75d95,0x1f69bef2,0xbe064dda,0x8d33d581,0x57ed35e6,0x8c024c12,
  112383. 0xc309c281,0xf8d435f9,0xd6960193,0xfd295061,0xe9e49541,0x66618d78 } },
  112384. /* 111 */
  112385. { { 0x8ce382de,0x571cfd45,0xde900dde,0x175806ee,0x34aba3b5,0x61849965,
  112386. 0xde7aec95,0xe899778a,0xff4aa97f,0xe8f00f6e,0x010b0c6d,0xae971cb5 },
  112387. { 0x3af788f1,0x1827eebc,0xe413fe2d,0xd46229ff,0x4741c9b4,0x8a15455b,
  112388. 0xf8e424eb,0x5f02e690,0xdae87712,0x40a1202e,0x64944f6d,0x49b3bda2 } },
  112389. /* 112 */
  112390. { { 0x035b2d69,0xd63c6067,0x6bed91b0,0xb507150d,0x7afb39b2,0x1f35f82f,
  112391. 0x16012b66,0xb9bd9c01,0xed0a5f50,0x00d97960,0x2716f7c9,0xed705451 },
  112392. { 0x127abdb4,0x1576eff4,0xf01e701c,0x6850d698,0x3fc87e2f,0x9fa7d749,
  112393. 0xb0ce3e48,0x0b6bcc6f,0xf7d8c1c0,0xf4fbe1f5,0x02719cc6,0xcf75230e } },
  112394. /* 113 */
  112395. { { 0x722d94ed,0x6761d6c2,0x3718820e,0xd1ec3f21,0x25d0e7c6,0x65a40b70,
  112396. 0xbaf3cf31,0xd67f830e,0xb93ea430,0x633b3807,0x0bc96c69,0x17faa0ea },
  112397. { 0xdf866b98,0xe6bf3482,0xa9db52d4,0x205c1ee9,0xff9ab869,0x51ef9bbd,
  112398. 0x75eeb985,0x3863dad1,0xd3cf442a,0xef216c3b,0xf9c8e321,0x3fb228e3 } },
  112399. /* 114 */
  112400. { { 0x0760ac07,0x94f9b70c,0x9d79bf4d,0xf3c9ccae,0xc5ffc83d,0x73cea084,
  112401. 0xdc49c38e,0xef50f943,0xbc9e7330,0xf467a2ae,0x44ea7fba,0x5ee534b6 },
  112402. { 0x03609e7f,0x20cb6272,0x62fdc9f0,0x09844355,0x0f1457f7,0xaf5c8e58,
  112403. 0xb4b25941,0xd1f50a6c,0x2ec82395,0x77cb247c,0xda3dca33,0xa5f3e1e5 } },
  112404. /* 115 */
  112405. { { 0x7d85fa94,0x023489d6,0x2db9ce47,0x0ba40537,0xaed7aad1,0x0fdf7a1f,
  112406. 0x9a4ccb40,0xa57b0d73,0x5b18967c,0x48fcec99,0xb7274d24,0xf30b5b6e },
  112407. { 0xc81c5338,0x7ccb4773,0xa3ed6bd0,0xb85639e6,0x1d56eada,0x7d9df95f,
  112408. 0x0a1607ad,0xe256d57f,0x957574d6,0x6da7ffdc,0x01c7a8c4,0x65f84046 } },
  112409. /* 116 */
  112410. { { 0xcba1e7f1,0x8d45d0cb,0x02b55f64,0xef0a08c0,0x17e19892,0x771ca31b,
  112411. 0x4885907e,0xe1843ecb,0x364ce16a,0x67797ebc,0x8df4b338,0x816d2b2d },
  112412. { 0x39aa8671,0xe870b0e5,0xc102b5f5,0x9f0db3e4,0x1720c697,0x34296659,
  112413. 0x613c0d2a,0x0ad4c89e,0x418ddd61,0x1af900b2,0xd336e20e,0xe087ca72 } },
  112414. /* 117 */
  112415. { { 0xaba10079,0x222831ff,0x6d64fff2,0x0dc5f87b,0x3e8cb330,0x44547907,
  112416. 0x702a33fb,0xe815aaa2,0x5fba3215,0x338d6b2e,0x79f549c8,0x0f7535cb },
  112417. { 0x2ee95923,0x471ecd97,0xc6d1c09f,0x1e868b37,0xc666ef4e,0x2bc7b8ec,
  112418. 0x808a4bfc,0xf5416589,0x3fbc4d2e,0xf23e9ee2,0x2d75125b,0x4357236c } },
  112419. /* 118 */
  112420. { { 0xba9cdb1b,0xfe176d95,0x2f82791e,0x45a1ca01,0x4de4cca2,0x97654af2,
  112421. 0x5cc4bcb9,0xbdbf9d0e,0xad97ac0a,0xf6a7df50,0x61359fd6,0xc52112b0 },
  112422. { 0x4f05eae3,0x696d9ce3,0xe943ac2b,0x903adc02,0x0848be17,0xa9075347,
  112423. 0x2a3973e5,0x1e20f170,0x6feb67e9,0xe1aacc1c,0xe16bc6b9,0x2ca0ac32 } },
  112424. /* 119 */
  112425. { { 0xef871eb5,0xffea12e4,0xa8bf0a7a,0x94c2f25d,0x78134eaa,0x4d1e4c2a,
  112426. 0x0360fb10,0x11ed16fb,0x85fc11be,0x4029b6db,0xf4d390fa,0x5e9f7ab7 },
  112427. { 0x30646612,0x5076d72f,0xdda1d0d8,0xa0afed1d,0x85a1d103,0x29022257,
  112428. 0x4e276bcd,0xcb499e17,0x51246c3d,0x16d1da71,0x589a0443,0xc72d56d3 } },
  112429. /* 120 */
  112430. { { 0xdae5bb45,0xdf5ffc74,0x261bd6dc,0x99068c4a,0xaa98ec7b,0xdc0afa7a,
  112431. 0xf121e96d,0xedd2ee00,0x1414045c,0x163cc7be,0x335af50e,0xb0b1bbce },
  112432. { 0x01a06293,0xd440d785,0x6552e644,0xcdebab7c,0x8c757e46,0x48cb8dbc,
  112433. 0x3cabe3cb,0x81f9cf78,0xb123f59a,0xddd02611,0xeeb3784d,0x3dc7b88e } },
  112434. /* 121 */
  112435. { { 0xc4741456,0xe1b8d398,0x6032a121,0xa9dfa902,0x1263245b,0x1cbfc86d,
  112436. 0x5244718c,0xf411c762,0x05b0fc54,0x96521d54,0xdbaa4985,0x1afab46e },
  112437. { 0x8674b4ad,0xa75902ba,0x5ad87d12,0x486b43ad,0x36e0d099,0x72b1c736,
  112438. 0xbb6cd6d6,0x39890e07,0x59bace4e,0x8128999c,0x7b535e33,0xd8da430b } },
  112439. /* 122 */
  112440. { { 0xc6b75791,0x39f65642,0x21806bfb,0x050947a6,0x1362ef84,0x0ca3e370,
  112441. 0x8c3d2391,0x9bc60aed,0x732e1ddc,0x9b488671,0xa98ee077,0x12d10d9e },
  112442. { 0x3651b7dc,0xb6f2822d,0x80abd138,0x6345a5ba,0x472d3c84,0x62033262,
  112443. 0xacc57527,0xd54a1d40,0x424447cb,0x6ea46b3a,0x2fb1a496,0x5bc41057 } },
  112444. /* 123 */
  112445. { { 0xa751cd0e,0xe70c57a3,0xeba3c7d6,0x190d8419,0x9d47d55a,0xb1c3bee7,
  112446. 0xf912c6d8,0xda941266,0x407a6ad6,0x12e9aacc,0x6e838911,0xd6ce5f11 },
  112447. { 0x70e1f2ce,0x063ca97b,0x8213d434,0xa3e47c72,0x84df810a,0xa016e241,
  112448. 0xdfd881a4,0x688ad7b0,0xa89bf0ad,0xa37d99fc,0xa23c2d23,0xd8e3f339 } },
  112449. /* 124 */
  112450. { { 0x750bed6f,0xbdf53163,0x83e68b0a,0x808abc32,0x5bb08a33,0x85a36627,
  112451. 0x6b0e4abe,0xf72a3a0f,0xfaf0c6ad,0xf7716d19,0x5379b25f,0x22dcc020 },
  112452. { 0xf9a56e11,0x7400bf8d,0x56a47f21,0x6cb8bad7,0x7a6eb644,0x7c97176f,
  112453. 0xd1f5b646,0xe8fd84f7,0x44ddb054,0x98320a94,0x1dde86f5,0x07071ba3 } },
  112454. /* 125 */
  112455. { { 0x98f8fcb9,0x6fdfa0e5,0x94d0d70c,0x89cec8e0,0x106d20a8,0xa0899397,
  112456. 0xba8acc9c,0x915bfb9a,0x5507e01c,0x1370c94b,0x8a821ffb,0x83246a60 },
  112457. { 0xbe3c378f,0xa8273a9f,0x35a25be9,0x7e544789,0x4dd929d7,0x6cfa4972,
  112458. 0x365bd878,0x987fed9d,0x5c29a7ae,0x4982ac94,0x5ddd7ec5,0x4589a5d7 } },
  112459. /* 126 */
  112460. { { 0xa95540a9,0x9fabb174,0x0162c5b0,0x7cfb886f,0xea3dee18,0x17be766b,
  112461. 0xe88e624c,0xff7da41f,0x8b919c38,0xad0b71eb,0xf31ff9a9,0x86a522e0 },
  112462. { 0x868bc259,0xbc8e6f72,0x3ccef9e4,0x6130c638,0x9a466555,0x09f1f454,
  112463. 0x19b2bfb4,0x8e6c0f09,0x0ca7bb22,0x945c46c9,0x4dafb67b,0xacd87168 } },
  112464. /* 127 */
  112465. { { 0x10c53841,0x090c72ca,0x55a4fced,0xc20ae01b,0xe10234ad,0x03f7ebd5,
  112466. 0x85892064,0xb3f42a6a,0xb4a14722,0xbdbc30c0,0x8ca124cc,0x971bc437 },
  112467. { 0x517ff2ff,0x6f79f46d,0xecba947b,0x6a9c96e2,0x62925122,0x5e79f2f4,
  112468. 0x6a4e91f1,0x30a96bb1,0x2d4c72da,0x1147c923,0x5811e4df,0x65bc311f } },
  112469. /* 128 */
  112470. { { 0x139b3239,0x87c7dd7d,0x4d833bae,0x8b57824e,0x9fff0015,0xbcbc4878,
  112471. 0x909eaf1a,0x8ffcef8b,0xf1443a78,0x9905f4ee,0xe15cbfed,0x020dd4a2 },
  112472. { 0xa306d695,0xca2969ec,0xb93caf60,0xdf940cad,0x87ea6e39,0x67f7fab7,
  112473. 0xf98c4fe5,0x0d0ee10f,0xc19cb91e,0xc646879a,0x7d1d7ab4,0x4b4ea50c } },
  112474. /* 129 */
  112475. { { 0x7a0db57e,0x19e40945,0x9a8c9702,0xe6017cad,0x1be5cff9,0xdbf739e5,
  112476. 0xa7a938a2,0x3646b3cd,0x68350dfc,0x04511085,0x56e098b5,0xad3bd6f3 },
  112477. { 0xee2e3e3e,0x935ebabf,0x473926cb,0xfbd01702,0x9e9fb5aa,0x7c735b02,
  112478. 0x2e3feff0,0xc52a1b85,0x046b405a,0x9199abd3,0x39039971,0xe306fcec } },
  112479. /* 130 */
  112480. { { 0x23e4712c,0xd6d9aec8,0xc3c198ee,0x7ca8376c,0x31bebd8a,0xe6d83187,
  112481. 0xd88bfef3,0xed57aff3,0xcf44edc7,0x72a645ee,0x5cbb1517,0xd4e63d0b },
  112482. { 0xceee0ecf,0x98ce7a1c,0x5383ee8e,0x8f012633,0xa6b455e8,0x3b879078,
  112483. 0xc7658c06,0xcbcd3d96,0x0783336a,0x721d6fe7,0x5a677136,0xf21a7263 } },
  112484. /* 131 */
  112485. { { 0x9586ba11,0x19d8b3cd,0x8a5c0480,0xd9e0aeb2,0x2230ef5c,0xe4261dbf,
  112486. 0x02e6bf09,0x095a9dee,0x80dc7784,0x8963723c,0x145157b1,0x5c97dbaf },
  112487. { 0x4bc4503e,0x97e74434,0x85a6b370,0x0fb1cb31,0xcd205d4b,0x3e8df2be,
  112488. 0xf8f765da,0x497dd1bc,0x6c988a1a,0x92ef95c7,0x64dc4cfa,0x3f924baa } },
  112489. /* 132 */
  112490. { { 0x7268b448,0x6bf1b8dd,0xefd79b94,0xd4c28ba1,0xe4e3551f,0x2fa1f8c8,
  112491. 0x5c9187a9,0x769e3ad4,0x40326c0d,0x28843b4d,0x50d5d669,0xfefc8094 },
  112492. { 0x90339366,0x30c85bfd,0x5ccf6c3a,0x4eeb56f1,0x28ccd1dc,0x0e72b149,
  112493. 0xf2ce978e,0x73ee85b5,0x3165bb23,0xcdeb2bf3,0x4e410abf,0x8106c923 } },
  112494. /* 133 */
  112495. { { 0x7d02f4ee,0xc8df0161,0x18e21225,0x8a781547,0x6acf9e40,0x4ea895eb,
  112496. 0x6e5a633d,0x8b000cb5,0x7e981ffb,0xf31d86d5,0x4475bc32,0xf5c8029c },
  112497. { 0x1b568973,0x764561ce,0xa62996ec,0x2f809b81,0xda085408,0x9e513d64,
  112498. 0xe61ce309,0xc27d815d,0x272999e0,0x0da6ff99,0xfead73f7,0xbd284779 } },
  112499. /* 134 */
  112500. { { 0x9b1cdf2b,0x6033c2f9,0xbc5fa151,0x2a99cf06,0x12177b3b,0x7d27d259,
  112501. 0xc4485483,0xb1f15273,0x102e2297,0x5fd57d81,0xc7f6acb7,0x3d43e017 },
  112502. { 0x3a70eb28,0x41a8bb0b,0x3e80b06b,0x67de2d8e,0x70c28de5,0x09245a41,
  112503. 0xa7b26023,0xad7dbcb1,0x2cbc6c1e,0x70b08a35,0x9b33041f,0xb504fb66 } },
  112504. /* 135 */
  112505. { { 0xf97a27c2,0xa8e85ab5,0xc10a011b,0x6ac5ec8b,0xffbcf161,0x55745533,
  112506. 0x65790a60,0x01780e85,0x99ee75b0,0xe451bf85,0x39c29881,0x8907a63b },
  112507. { 0x260189ed,0x76d46738,0x47bd35cb,0x284a4436,0x20cab61e,0xd74e8c40,
  112508. 0x416cf20a,0x6264bf8c,0x5fd820ce,0xfa5a6c95,0xf24bb5fc,0xfa7154d0 } },
  112509. /* 136 */
  112510. { { 0x9b3f5034,0x18482cec,0xcd9e68fd,0x962d445a,0x95746f23,0x266fb1d6,
  112511. 0x58c94a4b,0xc66ade5a,0xed68a5b6,0xdbbda826,0x7ab0d6ae,0x05664a4d },
  112512. { 0x025e32fc,0xbcd4fe51,0xa96df252,0x61a5aebf,0x31592a31,0xd88a07e2,
  112513. 0x98905517,0x5d9d94de,0x5fd440e7,0x96bb4010,0xe807db4c,0x1b0c47a2 } },
  112514. /* 137 */
  112515. { { 0x08223878,0x5c2a6ac8,0xe65a5558,0xba08c269,0x9bbc27fd,0xd22b1b9b,
  112516. 0x72b9607d,0x919171bf,0xe588dc58,0x9ab455f9,0x23662d93,0x6d54916e },
  112517. { 0x3b1de0c1,0x8da8e938,0x804f278f,0xa84d186a,0xd3461695,0xbf4988cc,
  112518. 0xe10eb0cb,0xf5eae3be,0xbf2a66ed,0x1ff8b68f,0xc305b570,0xa68daf67 } },
  112519. /* 138 */
  112520. { { 0x44b2e045,0xc1004cff,0x4b1c05d4,0x91b5e136,0x88a48a07,0x53ae4090,
  112521. 0xea11bb1a,0x73fb2995,0x3d93a4ea,0x32048570,0x3bfc8a5f,0xcce45de8 },
  112522. { 0xc2b3106e,0xaff4a97e,0xb6848b4f,0x9069c630,0xed76241c,0xeda837a6,
  112523. 0x6cc3f6cf,0x8a0daf13,0x3da018a8,0x199d049d,0xd9093ba3,0xf867c6b1 } },
  112524. /* 139 */
  112525. { { 0x56527296,0xe4d42a56,0xce71178d,0xae26c73d,0x6c251664,0x70a0adac,
  112526. 0x5dc0ae1d,0x813483ae,0xdaab2daf,0x7574eacd,0xc2d55f4f,0xc56b52dc },
  112527. { 0x95f32923,0x872bc167,0x5bdd2a89,0x4be17581,0xa7699f00,0x9b57f1e7,
  112528. 0x3ac2de02,0x5fcd9c72,0x92377739,0x83af3ba1,0xfc50b97f,0xa64d4e2b } },
  112529. /* 140 */
  112530. { { 0x0e552b40,0x2172dae2,0xd34d52e8,0x62f49725,0x07958f98,0x7930ee40,
  112531. 0x751fdd74,0x56da2a90,0xf53e48c3,0xf1192834,0x8e53c343,0x34d2ac26 },
  112532. { 0x13111286,0x1073c218,0xda9d9827,0x201dac14,0xee95d378,0xec2c29db,
  112533. 0x1f3ee0b1,0x9316f119,0x544ce71c,0x7890c9f0,0x27612127,0xd77138af } },
  112534. /* 141 */
  112535. { { 0x3b4ad1cd,0x78045e6d,0x4aa49bc1,0xcd86b94e,0xfd677a16,0x57e51f1d,
  112536. 0xfa613697,0xd9290935,0x34f4d893,0x7a3f9593,0x5d5fcf9b,0x8c9c248b },
  112537. { 0x6f70d4e9,0x9f23a482,0x63190ae9,0x17273454,0x5b081a48,0x4bdd7c13,
  112538. 0x28d65271,0x1e2de389,0xe5841d1f,0x0bbaaa25,0x746772e5,0xc4c18a79 } },
  112539. /* 142 */
  112540. { { 0x593375ac,0x10ee2681,0x7dd5e113,0x4f3288be,0x240f3538,0x9a97b2fb,
  112541. 0x1de6b1e2,0xfa11089f,0x1351bc58,0x516da562,0x2dfa85b5,0x573b6119 },
  112542. { 0x6cba7df5,0x89e96683,0x8c28ab40,0xf299be15,0xad43fcbf,0xe91c9348,
  112543. 0x9a1cefb3,0xe9bbc7cc,0x738b2775,0xc8add876,0x775eaa01,0x6e3b1f2e } },
  112544. /* 143 */
  112545. { { 0xb677788b,0x0365a888,0x3fd6173c,0x634ae8c4,0x9e498dbe,0x30498761,
  112546. 0xc8f779ab,0x08c43e6d,0x4c09aca9,0x068ae384,0x2018d170,0x2380c70b },
  112547. { 0xa297c5ec,0xcf77fbc3,0xca457948,0xdacbc853,0x336bec7e,0x3690de04,
  112548. 0x14eec461,0x26bbac64,0x1f713abf,0xd1c23c7e,0xe6fd569e,0xf08bbfcd } },
  112549. /* 144 */
  112550. { { 0x84770ee3,0x5f8163f4,0x744a1706,0x0e0c7f94,0xe1b2d46d,0x9c8f05f7,
  112551. 0xd01fd99a,0x417eafe7,0x11440e5b,0x2ba15df5,0x91a6fbcf,0xdc5c552a },
  112552. { 0xa270f721,0x86271d74,0xa004485b,0x32c0a075,0x8defa075,0x9d1a87e3,
  112553. 0xbf0d20fe,0xb590a7ac,0x8feda1f5,0x430c41c2,0x58f6ec24,0x454d2879 } },
  112554. /* 145 */
  112555. { { 0x7c525435,0x52b7a635,0x37c4bdbc,0x3d9ef57f,0xdffcc475,0x2bb93e9e,
  112556. 0x7710f3be,0xf7b8ba98,0x21b727de,0x42ee86da,0x2e490d01,0x55ac3f19 },
  112557. { 0xc0c1c390,0x487e3a6e,0x446cde7b,0x036fb345,0x496ae951,0x089eb276,
  112558. 0x71ed1234,0xedfed4d9,0x900f0b46,0x661b0dd5,0x8582f0d3,0x11bd6f1b } },
  112559. /* 146 */
  112560. { { 0x076bc9d1,0x5cf9350f,0xcf3cd2c3,0x15d903be,0x25af031c,0x21cfc8c2,
  112561. 0x8b1cc657,0xe0ad3248,0x70014e87,0xdd9fb963,0x297f1658,0xf0f3a5a1 },
  112562. { 0xf1f703aa,0xbb908fba,0x2f6760ba,0x2f9cc420,0x66a38b51,0x00ceec66,
  112563. 0x05d645da,0x4deda330,0xf7de3394,0xb9cf5c72,0x1ad4c906,0xaeef6502 } },
  112564. /* 147 */
  112565. { { 0x7a19045d,0x0583c8b1,0xd052824c,0xae7c3102,0xff6cfa58,0x2a234979,
  112566. 0x62c733c0,0xfe9dffc9,0x9c0c4b09,0x3a7fa250,0x4fe21805,0x516437bb },
  112567. { 0xc2a23ddb,0x9454e3d5,0x289c104e,0x0726d887,0x4fd15243,0x8977d918,
  112568. 0x6d7790ba,0xc559e73f,0x465af85f,0x8fd3e87d,0x5feee46b,0xa2615c74 } },
  112569. /* 148 */
  112570. { { 0x4335167d,0xc8d607a8,0xe0f5c887,0x8b42d804,0x398d11f9,0x5f9f13df,
  112571. 0x20740c67,0x5aaa5087,0xa3d9234b,0x83da9a6a,0x2a54bad1,0xbd3a5c4e },
  112572. { 0x2db0f658,0xdd13914c,0x5a3f373a,0x29dcb66e,0x5245a72b,0xbfd62df5,
  112573. 0x91e40847,0x19d18023,0xb136b1ae,0xd9df74db,0x3f93bc5b,0x72a06b6b } },
  112574. /* 149 */
  112575. { { 0xad19d96f,0x6da19ec3,0xfb2a4099,0xb342daa4,0x662271ea,0x0e61633a,
  112576. 0xce8c054b,0x3bcece81,0x8bd62dc6,0x7cc8e061,0xee578d8b,0xae189e19 },
  112577. { 0xdced1eed,0x73e7a25d,0x7875d3ab,0xc1257f0a,0x1cfef026,0x2cb2d5a2,
  112578. 0xb1fdf61c,0xd98ef39b,0x24e83e6c,0xcd8e6f69,0xc7b7088b,0xd71e7076 } },
  112579. /* 150 */
  112580. { { 0x9d4245bf,0x33936830,0x2ac2953b,0x22d96217,0x56c3c3cd,0xb3bf5a82,
  112581. 0x0d0699e8,0x50c9be91,0x8f366459,0xec094463,0x513b7c35,0x6c056dba },
  112582. { 0x045ab0e3,0x687a6a83,0x445c9295,0x8d40b57f,0xa16f5954,0x0f345048,
  112583. 0x3d8f0a87,0x64b5c639,0x9f71c5e2,0x106353a2,0x874f0dd4,0xdd58b475 } },
  112584. /* 151 */
  112585. { { 0x62230c72,0x67ec084f,0x481385e3,0xf14f6cca,0x4cda7774,0xf58bb407,
  112586. 0xaa2dbb6b,0xe15011b1,0x0c035ab1,0xd488369d,0x8245f2fd,0xef83c24a },
  112587. { 0x9fdc2538,0xfb57328f,0x191fe46a,0x79808293,0x32ede548,0xe28f5c44,
  112588. 0xea1a022c,0x1b3cda99,0x3df2ec7f,0x39e639b7,0x760e9a18,0x77b6272b } },
  112589. /* 152 */
  112590. { { 0xa65d56d5,0x2b1d51bd,0x7ea696e0,0x3a9b71f9,0x9904f4c4,0x95250ecc,
  112591. 0xe75774b7,0x8bc4d6eb,0xeaeeb9aa,0x0e343f8a,0x930e04cb,0xc473c1d1 },
  112592. { 0x064cd8ae,0x282321b1,0x5562221c,0xf4b4371e,0xd1bf1221,0xc1cc81ec,
  112593. 0xe2c8082f,0xa52a07a9,0xba64a958,0x350d8e59,0x6fb32c9a,0x29e4f3de } },
  112594. /* 153 */
  112595. { { 0xba89aaa5,0x0aa9d56c,0xc4c6059e,0xf0208ac0,0xbd6ddca4,0x7400d9c6,
  112596. 0xf2c2f74a,0xb384e475,0xb1562dd3,0x4c1061fc,0x2e153b8d,0x3924e248 },
  112597. { 0x849808ab,0xf38b8d98,0xa491aa36,0x29bf3260,0x88220ede,0x85159ada,
  112598. 0xbe5bc422,0x8b47915b,0xd7300967,0xa934d72e,0x2e515d0d,0xc4f30398 } },
  112599. /* 154 */
  112600. { { 0x1b1de38b,0xe3e9ee42,0x42636760,0xa124e25a,0x90165b1a,0x90bf73c0,
  112601. 0x146434c5,0x21802a34,0x2e1fa109,0x54aa83f2,0xed9c51e9,0x1d4bd03c },
  112602. { 0x798751e6,0xc2d96a38,0x8c3507f5,0xed27235f,0xc8c24f88,0xb5fb80e2,
  112603. 0xd37f4f78,0xf873eefa,0xf224ba96,0x7229fd74,0x9edd7149,0x9dcd9199 } },
  112604. /* 155 */
  112605. { { 0x4e94f22a,0xee9f81a6,0xf71ec341,0xe5609892,0xa998284e,0x6c818ddd,
  112606. 0x3b54b098,0x9fd47295,0x0e8a7cc9,0x47a6ac03,0xb207a382,0xde684e5e },
  112607. { 0x2b6b956b,0x4bdd1ecd,0xf01b3583,0x09084414,0x55233b14,0xe2f80b32,
  112608. 0xef5ebc5e,0x5a0fec54,0xbf8b29a2,0x74cf25e6,0x7f29e014,0x1c757fa0 } },
  112609. /* 156 */
  112610. { { 0xeb0fdfe4,0x1bcb5c4a,0xf0899367,0xd7c649b3,0x05bc083b,0xaef68e3f,
  112611. 0xa78aa607,0x57a06e46,0x21223a44,0xa2136ecc,0x52f5a50b,0x89bd6484 },
  112612. { 0x4455f15a,0x724411b9,0x08a9c0fd,0x23dfa970,0x6db63bef,0x7b0da4d1,
  112613. 0xfb162443,0x6f8a7ec1,0xe98284fb,0xc1ac9cee,0x33566022,0x085a582b } },
  112614. /* 157 */
  112615. { { 0xec1f138a,0x15cb61f9,0x668f0c28,0x11c9a230,0xdf93f38f,0xac829729,
  112616. 0x4048848d,0xcef25698,0x2bba8fbf,0x3f686da0,0x111c619a,0xed5fea78 },
  112617. { 0xd6d1c833,0x9b4f73bc,0x86e7bf80,0x50951606,0x042b1d51,0xa2a73508,
  112618. 0x5fb89ec2,0x9ef6ea49,0x5ef8b892,0xf1008ce9,0x9ae8568b,0x78a7e684 } },
  112619. /* 158 */
  112620. { { 0x10470cd8,0x3fe83a7c,0xf86df000,0x92734682,0xda9409b5,0xb5dac06b,
  112621. 0x94939c5f,0x1e7a9660,0x5cc116dc,0xdec6c150,0x66bac8cc,0x1a52b408 },
  112622. { 0x6e864045,0x5303a365,0x9139efc1,0x45eae72a,0x6f31d54f,0x83bec646,
  112623. 0x6e958a6d,0x2fb4a86f,0x4ff44030,0x6760718e,0xe91ae0df,0x008117e3 } },
  112624. /* 159 */
  112625. { { 0x384310a2,0x5d5833ba,0x1fd6c9fc,0xbdfb4edc,0x849c4fb8,0xb9a4f102,
  112626. 0x581c1e1f,0xe5fb239a,0xd0a9746d,0xba44b2e7,0x3bd942b9,0x78f7b768 },
  112627. { 0xc87607ae,0x076c8ca1,0xd5caaa7e,0x82b23c2e,0x2763e461,0x6a581f39,
  112628. 0x3886df11,0xca8a5e4a,0x264e7f22,0xc87e90cf,0x215cfcfc,0x04f74870 } },
  112629. /* 160 */
  112630. { { 0x141d161c,0x5285d116,0x93c4ed17,0x67cd2e0e,0x7c36187e,0x12c62a64,
  112631. 0xed2584ca,0xf5329539,0x42fbbd69,0xc4c777c4,0x1bdfc50a,0x107de776 },
  112632. { 0xe96beebd,0x9976dcc5,0xa865a151,0xbe2aff95,0x9d8872af,0x0e0a9da1,
  112633. 0xa63c17cc,0x5e357a3d,0xe15cc67c,0xd31fdfd8,0x7970c6d8,0xc44bbefd } },
  112634. /* 161 */
  112635. { { 0x4c0c62f1,0x703f83e2,0x4e195572,0x9b1e28ee,0xfe26cced,0x6a82858b,
  112636. 0xc43638fa,0xd381c84b,0xa5ba43d8,0x94f72867,0x10b82743,0x3b4a783d },
  112637. { 0x7576451e,0xee1ad7b5,0x14b6b5c8,0xc3d0b597,0xfcacc1b8,0x3dc30954,
  112638. 0x472c9d7b,0x55df110e,0x02f8a328,0x97c86ed7,0x88dc098f,0xd0433413 } },
  112639. /* 162 */
  112640. { { 0x2ca8f2fe,0x1a60d152,0x491bd41f,0x61640948,0x58dfe035,0x6dae29a5,
  112641. 0x278e4863,0x9a615bea,0x9ad7c8e5,0xbbdb4477,0x2ceac2fc,0x1c706630 },
  112642. { 0x99699b4b,0x5e2b54c6,0x239e17e8,0xb509ca6d,0xea063a82,0x728165fe,
  112643. 0xb6a22e02,0x6b5e609d,0xb26ee1df,0x12813905,0x439491fa,0x07b9f722 } },
  112644. /* 163 */
  112645. { { 0x48ff4e49,0x1592ec14,0x6d644129,0x3e4e9f17,0x1156acc0,0x7acf8288,
  112646. 0xbb092b0b,0x5aa34ba8,0x7d38393d,0xcd0f9022,0xea4f8187,0x416724dd },
  112647. { 0xc0139e73,0x3c4e641c,0x91e4d87d,0xe0fe46cf,0xcab61f8a,0xedb3c792,
  112648. 0xd3868753,0x4cb46de4,0x20f1098a,0xe449c21d,0xf5b8ea6e,0x5e5fd059 } },
  112649. /* 164 */
  112650. { { 0x75856031,0x7fcadd46,0xeaf2fbd0,0x89c7a4cd,0x7a87c480,0x1af523ce,
  112651. 0x61d9ae90,0xe5fc1095,0xbcdb95f5,0x3fb5864f,0xbb5b2c7d,0xbeb5188e },
  112652. { 0x3ae65825,0x3d1563c3,0x0e57d641,0x116854c4,0x1942ebd3,0x11f73d34,
  112653. 0xc06955b3,0x24dc5904,0x995a0a62,0x8a0d4c83,0x5d577b7d,0xfb26b86d } },
  112654. /* 165 */
  112655. { { 0xc686ae17,0xc53108e7,0xd1c1da56,0x9090d739,0x9aec50ae,0x4583b013,
  112656. 0xa49a6ab2,0xdd9a088b,0xf382f850,0x28192eea,0xf5fe910e,0xcc8df756 },
  112657. { 0x9cab7630,0x877823a3,0xfb8e7fc1,0x64984a9a,0x364bfc16,0x5448ef9c,
  112658. 0xc44e2a9a,0xbbb4f871,0x435c95e9,0x901a41ab,0xaaa50a06,0xc6c23e5f } },
  112659. /* 166 */
  112660. { { 0x9034d8dd,0xb78016c1,0x0b13e79b,0x856bb44b,0xb3241a05,0x85c6409a,
  112661. 0x2d78ed21,0x8d2fe19a,0x726eddf2,0xdcc7c26d,0x25104f04,0x3ccaff5f },
  112662. { 0x6b21f843,0x397d7edc,0xe975de4c,0xda88e4dd,0x4f5ab69e,0x5273d396,
  112663. 0x9aae6cc0,0x537680e3,0x3e6f9461,0xf749cce5,0x957bffd3,0x021ddbd9 } },
  112664. /* 167 */
  112665. { { 0x777233cf,0x7b64585f,0x0942a6f0,0xfe6771f6,0xdfe6eef0,0x636aba7a,
  112666. 0x86038029,0x63bbeb56,0xde8fcf36,0xacee5842,0xd4a20524,0x48d9aa99 },
  112667. { 0x0da5e57a,0xcff7a74c,0xe549d6c9,0xc232593c,0xf0f2287b,0x68504bcc,
  112668. 0xbc8360b5,0x6d7d098d,0x5b402f41,0xeac5f149,0xb87d1bf1,0x61936f11 } },
  112669. /* 168 */
  112670. { { 0xb8153a9d,0xaa9da167,0x9e83ecf0,0xa49fe3ac,0x1b661384,0x14c18f8e,
  112671. 0x38434de1,0x61c24dab,0x283dae96,0x3d973c3a,0x82754fc9,0xc99baa01 },
  112672. { 0x4c26b1e3,0x477d198f,0xa7516202,0x12e8e186,0x362addfa,0x386e52f6,
  112673. 0xc3962853,0x31e8f695,0x6aaedb60,0xdec2af13,0x29cf74ac,0xfcfdb4c6 } },
  112674. /* 169 */
  112675. { { 0xcca40298,0x6b3ee958,0xf2f5d195,0xc3878153,0xed2eae5b,0x0c565630,
  112676. 0x3a697cf2,0xd089b37e,0xad5029ea,0xc2ed2ac7,0x0f0dda6a,0x7e5cdfad },
  112677. { 0xd9b86202,0xf98426df,0x4335e054,0xed1960b1,0x3f14639e,0x1fdb0246,
  112678. 0x0db6c670,0x17f709c3,0x773421e1,0xbfc687ae,0x26c1a8ac,0x13fefc4a } },
  112679. /* 170 */
  112680. { { 0x7ffa0a5f,0xe361a198,0xc63fe109,0xf4b26102,0x6c74e111,0x264acbc5,
  112681. 0x77abebaf,0x4af445fa,0x24cddb75,0x448c4fdd,0x44506eea,0x0b13157d },
  112682. { 0x72e9993d,0x22a6b159,0x85e5ecbe,0x2c3c57e4,0xfd83e1a1,0xa673560b,
  112683. 0xc3b8c83b,0x6be23f82,0x40bbe38e,0x40b13a96,0xad17399b,0x66eea033 } },
  112684. /* 171 */
  112685. { { 0xb4c6c693,0x49fc6e95,0x36af7d38,0xefc735de,0x35fe42fc,0xe053343d,
  112686. 0x6a9ab7c3,0xf0aa427c,0x4a0fcb24,0xc79f0436,0x93ebbc50,0x16287243 },
  112687. { 0x16927e1e,0x5c3d6bd0,0x673b984c,0x40158ed2,0x4cd48b9a,0xa7f86fc8,
  112688. 0x60ea282d,0x1643eda6,0xe2a1beed,0x45b393ea,0x19571a94,0x664c839e } },
  112689. /* 172 */
  112690. { { 0x27eeaf94,0x57745750,0xea99e1e7,0x2875c925,0x5086adea,0xc127e7ba,
  112691. 0x86fe424f,0x765252a0,0x2b6c0281,0x1143cc6c,0xd671312d,0xc9bb2989 },
  112692. { 0x51acb0a5,0x880c337c,0xd3c60f78,0xa3710915,0x9262b6ed,0x496113c0,
  112693. 0x9ce48182,0x5d25d9f8,0xb3813586,0x53b6ad72,0x4c0e159c,0x0ea3bebc } },
  112694. /* 173 */
  112695. { { 0xc5e49bea,0xcaba450a,0x7c05da59,0x684e5415,0xde7ac36c,0xa2e9cab9,
  112696. 0x2e6f957b,0x4ca79b5f,0x09b817b1,0xef7b0247,0x7d89df0f,0xeb304990 },
  112697. { 0x46fe5096,0x508f7307,0x2e04eaaf,0x695810e8,0x3512f76c,0x88ef1bd9,
  112698. 0x3ebca06b,0x77661351,0xccf158b7,0xf7d4863a,0x94ee57da,0xb2a81e44 } },
  112699. /* 174 */
  112700. { { 0x6d53e6ba,0xff288e5b,0x14484ea2,0xa90de1a9,0xed33c8ec,0x2fadb60c,
  112701. 0x28b66a40,0x579d6ef3,0xec24372d,0x4f2dd6dd,0x1d66ec7d,0xe9e33fc9 },
  112702. { 0x039eab6e,0x110899d2,0x3e97bb5e,0xa31a667a,0xcfdce68e,0x6200166d,
  112703. 0x5137d54b,0xbe83ebae,0x4800acdf,0x085f7d87,0x0c6f8c86,0xcf4ab133 } },
  112704. /* 175 */
  112705. { { 0x931e08fb,0x03f65845,0x1506e2c0,0x6438551e,0x9c36961f,0x5791f0dc,
  112706. 0xe3dcc916,0x68107b29,0xf495d2ca,0x83242374,0x6ee5895b,0xd8cfb663 },
  112707. { 0xa0349b1b,0x525e0f16,0x4a0fab86,0x33cd2c6c,0x2af8dda9,0x46c12ee8,
  112708. 0x71e97ad3,0x7cc424ba,0x37621eb0,0x69766ddf,0xa5f0d390,0x95565f56 } },
  112709. /* 176 */
  112710. { { 0x1a0f5e94,0xe0e7bbf2,0x1d82d327,0xf771e115,0xceb111fa,0x10033e3d,
  112711. 0xd3426638,0xd269744d,0x00d01ef6,0xbdf2d9da,0xa049ceaf,0x1cb80c71 },
  112712. { 0x9e21c677,0x17f18328,0x19c8f98b,0x6452af05,0x80b67997,0x35b9c5f7,
  112713. 0x40f8f3d4,0x5c2e1cbe,0x66d667ca,0x43f91656,0xcf9d6e79,0x9faaa059 } },
  112714. /* 177 */
  112715. { { 0x0a078fe6,0x8ad24618,0x464fd1dd,0xf6cc73e6,0xc3e37448,0x4d2ce34d,
  112716. 0xe3271b5f,0x624950c5,0xefc5af72,0x62910f5e,0xaa132bc6,0x8b585bf8 },
  112717. { 0xa839327f,0x11723985,0x4aac252f,0x34e2d27d,0x6296cc4e,0x402f59ef,
  112718. 0x47053de9,0x00ae055c,0x28b4f09b,0xfc22a972,0xfa0c180e,0xa9e86264 } },
  112719. /* 178 */
  112720. { { 0xbc310ecc,0x0b7b6224,0x67fa14ed,0x8a1a74f1,0x7214395c,0x87dd0960,
  112721. 0xf5c91128,0xdf1b3d09,0x86b264a8,0x39ff23c6,0x3e58d4c5,0xdc2d49d0 },
  112722. { 0xa9d6f501,0x2152b7d3,0xc04094f7,0xf4c32e24,0xd938990f,0xc6366596,
  112723. 0x94fb207f,0x084d078f,0x328594cb,0xfd99f1d7,0xcb2d96b3,0x36defa64 } },
  112724. /* 179 */
  112725. { { 0x13ed7cbe,0x4619b781,0x9784bd0e,0x95e50015,0x2c7705fe,0x2a32251c,
  112726. 0x5f0dd083,0xa376af99,0x0361a45b,0x55425c6c,0x1f291e7b,0x812d2cef },
  112727. { 0x5fd94972,0xccf581a0,0xe56dc383,0x26e20e39,0x63dbfbf0,0x0093685d,
  112728. 0x36b8c575,0x1fc164cc,0x390ef5e7,0xb9c5ab81,0x26908c66,0x40086beb } },
  112729. /* 180 */
  112730. { { 0x37e3c115,0xe5e54f79,0xc1445a8a,0x69b8ee8c,0xb7659709,0x79aedff2,
  112731. 0x1b46fbe6,0xe288e163,0xd18d7bb7,0xdb4844f0,0x48aa6424,0xe0ea23d0 },
  112732. { 0xf3d80a73,0x714c0e4e,0x3bd64f98,0x87a0aa9e,0x2ec63080,0x8844b8a8,
  112733. 0x255d81a3,0xe0ac9c30,0x455397fc,0x86151237,0x2f820155,0x0b979464 } },
  112734. /* 181 */
  112735. { { 0x4ae03080,0x127a255a,0x580a89fb,0x232306b4,0x6416f539,0x04e8cd6a,
  112736. 0x13b02a0e,0xaeb70dee,0x4c09684a,0xa3038cf8,0x28e433ee,0xa710ec3c },
  112737. { 0x681b1f7d,0x77a72567,0x2fc28170,0x86fbce95,0xf5735ac8,0xd3408683,
  112738. 0x6bd68e93,0x3a324e2a,0xc027d155,0x7ec74353,0xd4427177,0xab60354c } },
  112739. /* 182 */
  112740. { { 0xef4c209d,0x32a5342a,0x08d62704,0x2ba75274,0xc825d5fe,0x4bb4af6f,
  112741. 0xd28e7ff1,0x1c3919ce,0xde0340f6,0x1dfc2fdc,0x29f33ba9,0xc6580baf },
  112742. { 0x41d442cb,0xae121e75,0x3a4724e4,0x4c7727fd,0x524f3474,0xe556d6a4,
  112743. 0x785642a2,0x87e13cc7,0xa17845fd,0x182efbb1,0x4e144857,0xdcec0cf1 } },
  112744. /* 183 */
  112745. { { 0xe9539819,0x1cb89541,0x9d94dbf1,0xc8cb3b4f,0x417da578,0x1d353f63,
  112746. 0x8053a09e,0xb7a697fb,0xc35d8b78,0x8d841731,0xb656a7a9,0x85748d6f },
  112747. { 0xc1859c5d,0x1fd03947,0x535d22a2,0x6ce965c1,0x0ca3aadc,0x1966a13e,
  112748. 0x4fb14eff,0x9802e41d,0x76dd3fcd,0xa9048cbb,0xe9455bba,0x89b182b5 } },
  112749. /* 184 */
  112750. { { 0x43360710,0xd777ad6a,0x55e9936b,0x841287ef,0x04a21b24,0xbaf5c670,
  112751. 0x35ad86f1,0xf2c0725f,0xc707e72e,0x338fa650,0xd8883e52,0x2bf8ed2e },
  112752. { 0xb56e0d6a,0xb0212cf4,0x6843290c,0x50537e12,0x98b3dc6f,0xd8b184a1,
  112753. 0x0210b722,0xd2be9a35,0x559781ee,0x407406db,0x0bc18534,0x5a78d591 } },
  112754. /* 185 */
  112755. { { 0xd748b02c,0x4d57aa2a,0xa12b3b95,0xbe5b3451,0x64711258,0xadca7a45,
  112756. 0x322153db,0x597e091a,0x32eb1eab,0xf3271006,0x2873f301,0xbd9adcba },
  112757. { 0x38543f7f,0xd1dc79d1,0x921b1fef,0x00022092,0x1e5df8ed,0x86db3ef5,
  112758. 0x9e6b944a,0x888cae04,0x791a32b4,0x71bd29ec,0xa6d1c13e,0xd3516206 } },
  112759. /* 186 */
  112760. { { 0x55924f43,0x2ef6b952,0x4f9de8d5,0xd2f401ae,0xadc68042,0xfc73e8d7,
  112761. 0x0d9d1bb4,0x627ea70c,0xbbf35679,0xc3bb3e3e,0xd882dee4,0x7e8a254a },
  112762. { 0xb5924407,0x08906f50,0xa1ad444a,0xf14a0e61,0x65f3738e,0xaa0efa21,
  112763. 0xae71f161,0xd60c7dd6,0xf175894d,0x9e8390fa,0x149f4c00,0xd115cd20 } },
  112764. /* 187 */
  112765. { { 0xa52abf77,0x2f2e2c1d,0x54232568,0xc2a0dca5,0x54966dcc,0xed423ea2,
  112766. 0xcd0dd039,0xe48c93c7,0x176405c7,0x1e54a225,0x70d58f2e,0x1efb5b16 },
  112767. { 0x94fb1471,0xa751f9d9,0x67d2941d,0xfdb31e1f,0x53733698,0xa6c74eb2,
  112768. 0x89a0f64a,0xd3155d11,0xa4b8d2b6,0x4414cfe4,0xf7a8e9e3,0x8d5a4be8 } },
  112769. /* 188 */
  112770. { { 0x52669e98,0x5c96b4d4,0x8fd42a03,0x4547f922,0xd285174e,0xcf5c1319,
  112771. 0x064bffa0,0x805cd1ae,0x246d27e7,0x50e8bc4f,0xd5781e11,0xf89ef98f },
  112772. { 0xdee0b63f,0xb4ff95f6,0x222663a4,0xad850047,0x4d23ce9c,0x02691860,
  112773. 0x50019f59,0x3e5309ce,0x69a508ae,0x27e6f722,0x267ba52c,0xe9376652 } },
  112774. /* 189 */
  112775. { { 0xc0368708,0xa04d289c,0x5e306e1d,0xc458872f,0x33112fea,0x76fa23de,
  112776. 0x6efde42e,0x718e3974,0x1d206091,0xf0c98cdc,0x14a71987,0x5fa3ca62 },
  112777. { 0xdcaa9f2a,0xeee8188b,0x589a860d,0x312cc732,0xc63aeb1f,0xf9808dd6,
  112778. 0x4ea62b53,0x70fd43db,0x890b6e97,0x2c2bfe34,0xfa426aa6,0x105f863c } },
  112779. /* 190 */
  112780. { { 0xb38059ad,0x0b29795d,0x90647ea0,0x5686b77e,0xdb473a3e,0xeff0470e,
  112781. 0xf9b6d1e2,0x278d2340,0xbd594ec7,0xebbff95b,0xd3a7f23d,0xf4b72334 },
  112782. { 0xa5a83f0b,0x2a285980,0x9716a8b3,0x0786c41a,0x22511812,0x138901bd,
  112783. 0xe2fede6e,0xd1b55221,0xdf4eb590,0x0806e264,0x762e462e,0x6c4c897e } },
  112784. /* 191 */
  112785. { { 0xb4b41d9d,0xd10b905f,0x4523a65b,0x826ca466,0xb699fa37,0x535bbd13,
  112786. 0x73bc8f90,0x5b9933d7,0xcd2118ad,0x9332d61f,0xd4a65fd0,0x158c693e },
  112787. { 0xe6806e63,0x4ddfb2a8,0xb5de651b,0xe31ed3ec,0x819bc69a,0xf9460e51,
  112788. 0x2c76b1f8,0x6229c0d6,0x901970a3,0xbb78f231,0x9cee72b8,0x31f3820f } },
  112789. /* 192 */
  112790. { { 0xc09e1c72,0xe931caf2,0x12990cf4,0x0715f298,0x943262d8,0x33aad81d,
  112791. 0x73048d3f,0x5d292b7a,0xdc7415f6,0xb152aaa4,0x0fd19587,0xc3d10fd9 },
  112792. { 0x75ddadd0,0xf76b35c5,0x1e7b694c,0x9f5f4a51,0xc0663025,0x2f1ab7eb,
  112793. 0x920260b0,0x01c9cc87,0x05d39da6,0xc4b1f61a,0xeb4a9c4e,0x6dcd76c4 } },
  112794. /* 193 */
  112795. { { 0xfdc83f01,0x0ba0916f,0x9553e4f9,0x354c8b44,0xffc5e622,0xa6cc511a,
  112796. 0xe95be787,0xb954726a,0x75b41a62,0xcb048115,0xebfde989,0xfa2ae6cd },
  112797. { 0x0f24659a,0x6376bbc7,0x4c289c43,0x13a999fd,0xec9abd8b,0xc7134184,
  112798. 0xa789ab04,0x28c02bf6,0xd3e526ec,0xff841ebc,0x640893a8,0x442b191e } },
  112799. /* 194 */
  112800. { { 0xfa2b6e20,0x4cac6c62,0xf6d69861,0x97f29e9b,0xbc96d12d,0x228ab1db,
  112801. 0x5e8e108d,0x6eb91327,0x40771245,0xd4b3d4d1,0xca8a803a,0x61b20623 },
  112802. { 0xa6a560b1,0x2c2f3b41,0x3859fcf4,0x879e1d40,0x024dbfc3,0x7cdb5145,
  112803. 0x3bfa5315,0x55d08f15,0xaa93823a,0x2f57d773,0xc6a2c9a2,0xa97f259c } },
  112804. /* 195 */
  112805. { { 0xe58edbbb,0xc306317b,0x79dfdf13,0x25ade51c,0x16d83dd6,0x6b5beaf1,
  112806. 0x1dd8f925,0xe8038a44,0xb2a87b6b,0x7f00143c,0xf5b438de,0xa885d00d },
  112807. { 0xcf9e48bd,0xe9f76790,0xa5162768,0xf0bdf9f0,0xad7b57cb,0x0436709f,
  112808. 0xf7c15db7,0x7e151c12,0x5d90ee3b,0x3514f022,0x2c361a8d,0x2e84e803 } },
  112809. /* 196 */
  112810. { { 0x563ec8d8,0x2277607d,0xe3934cb7,0xa661811f,0xf58fd5de,0x3ca72e7a,
  112811. 0x62294c6a,0x7989da04,0xf6bbefe9,0x88b3708b,0x53ed7c82,0x0d524cf7 },
  112812. { 0x2f30c073,0x69f699ca,0x9dc1dcf3,0xf0fa264b,0x05f0aaf6,0x44ca4568,
  112813. 0xd19b9baf,0x0f5b23c7,0xeabd1107,0x39193f41,0x2a7c9b83,0x9e3e10ad } },
  112814. /* 197 */
  112815. { { 0xd4ae972f,0xa90824f0,0xc6e846e7,0x43eef02b,0x29d2160a,0x7e460612,
  112816. 0xfe604e91,0x29a178ac,0x4eb184b2,0x23056f04,0xeb54cdf4,0x4fcad55f },
  112817. { 0xae728d15,0xa0ff96f3,0xc6a00331,0x8a2680c6,0x7ee52556,0x5f84cae0,
  112818. 0xc5a65dad,0x5e462c3a,0xe2d23f4f,0x5d2b81df,0xc5b1eb07,0x6e47301b } },
  112819. /* 198 */
  112820. { { 0xaf8219b9,0x77411d68,0x51b1907a,0xcb883ce6,0x101383b5,0x25c87e57,
  112821. 0x982f970d,0x9c7d9859,0x118305d2,0xaa6abca5,0x9013a5db,0x725fed2f },
  112822. { 0xababd109,0x487cdbaf,0x87586528,0xc0f8cf56,0x8ad58254,0xa02591e6,
  112823. 0xdebbd526,0xc071b1d1,0x961e7e31,0x927dfe8b,0x9263dfe1,0x55f895f9 } },
  112824. /* 199 */
  112825. { { 0xb175645b,0xf899b00d,0xb65b4b92,0x51f3a627,0xb67399ef,0xa2f3ac8d,
  112826. 0xe400bc20,0xe717867f,0x1967b952,0x42cc9020,0x3ecd1de1,0x3d596751 },
  112827. { 0xdb979775,0xd41ebcde,0x6a2e7e88,0x99ba61bc,0x321504f2,0x039149a5,
  112828. 0x27ba2fad,0xe7dc2314,0xb57d8368,0x9f556308,0x57da80a7,0x2b6d16c9 } },
  112829. /* 200 */
  112830. { { 0x279ad982,0x84af5e76,0x9c8b81a6,0x9bb4c92d,0x0e698e67,0xd79ad44e,
  112831. 0x265fc167,0xe8be9048,0x0c3a4ccc,0xf135f7e6,0xb8863a33,0xa0a10d38 },
  112832. { 0xd386efd9,0xe197247c,0xb52346c2,0x0eefd3f9,0x78607bc8,0xc22415f9,
  112833. 0x508674ce,0xa2a8f862,0xc8c9d607,0xa72ad09e,0x50fa764f,0xcd9f0ede } },
  112834. /* 201 */
  112835. { { 0xd1a46d4d,0x063391c7,0x9eb01693,0x2df51c11,0x849e83de,0xc5849800,
  112836. 0x8ad08382,0x48fd09aa,0xaa742736,0xa405d873,0xe1f9600c,0xee49e61e },
  112837. { 0x48c76f73,0xd76676be,0x01274b2a,0xd9c100f6,0x83f8718d,0x110bb67c,
  112838. 0x02fc0d73,0xec85a420,0x744656ad,0xc0449e1e,0x37d9939b,0x28ce7376 } },
  112839. /* 202 */
  112840. { { 0x44544ac7,0x97e9af72,0xba010426,0xf2c658d5,0xfb3adfbd,0x732dec39,
  112841. 0xa2df0b07,0xd12faf91,0x2171e208,0x8ac26725,0x5b24fa54,0xf820cdc8 },
  112842. { 0x94f4cf77,0x307a6eea,0x944a33c6,0x18c783d2,0x0b741ac5,0x4b939d4c,
  112843. 0x3ffbb6e4,0x1d7acd15,0x7a255e44,0x06a24858,0xce336d50,0x14fbc494 } },
  112844. /* 203 */
  112845. { { 0x51584e3c,0x9b920c0c,0xf7e54027,0xc7733c59,0x88422bbe,0xe24ce139,
  112846. 0x523bd6ab,0x11ada812,0xb88e6def,0xde068800,0xfe8c582d,0x7b872671 },
  112847. { 0x7de53510,0x4e746f28,0xf7971968,0x492f8b99,0x7d928ac2,0x1ec80bc7,
  112848. 0x432eb1b5,0xb3913e48,0x32028f6e,0xad084866,0x8fc2f38b,0x122bb835 } },
  112849. /* 204 */
  112850. { { 0x3b0b29c3,0x0a9f3b1e,0x4fa44151,0x837b6432,0x17b28ea7,0xb9905c92,
  112851. 0x98451750,0xf39bc937,0xce8b6da1,0xcd383c24,0x010620b2,0x299f57db },
  112852. { 0x58afdce3,0x7b6ac396,0x3d05ef47,0xa15206b3,0xb9bb02ff,0xa0ae37e2,
  112853. 0x9db3964c,0x107760ab,0x67954bea,0xe29de9a0,0x431c3f82,0x446a1ad8 } },
  112854. /* 205 */
  112855. { { 0x5c6b8195,0xc6fecea0,0xf49e71b9,0xd744a7c5,0x177a7ae7,0xa8e96acc,
  112856. 0x358773a7,0x1a05746c,0x37567369,0xa4162146,0x87d1c971,0xaa0217f7 },
  112857. { 0x77fd3226,0x61e9d158,0xe4f600be,0x0f6f2304,0x7a6dff07,0xa9c4cebc,
  112858. 0x09f12a24,0xd15afa01,0x8c863ee9,0x2bbadb22,0xe5eb8c78,0xa28290e4 } },
  112859. /* 206 */
  112860. { { 0x3e9de330,0x55b87fa0,0x195c145b,0x12b26066,0xa920bef0,0xe08536e0,
  112861. 0x4d195adc,0x7bff6f2c,0x945f4187,0x7f319e9d,0xf892ce47,0xf9848863 },
  112862. { 0x4fe37657,0xd0efc1d3,0x5cf0e45a,0x3c58de82,0x8b0ccbbe,0x626ad21a,
  112863. 0xaf952fc5,0xd2a31208,0xeb437357,0x81791995,0x98e95d4f,0x5f19d30f } },
  112864. /* 207 */
  112865. { { 0x0e6865bb,0x72e83d9a,0xf63456a6,0x22f5af3b,0x463c8d9e,0x409e9c73,
  112866. 0xdfe6970e,0x40e9e578,0x711b91ca,0x876b6efa,0x942625a3,0x895512cf },
  112867. { 0xcb4e462b,0x84c8eda8,0x4412e7c8,0x84c0154a,0xceb7b71f,0x04325db1,
  112868. 0x66f70877,0x1537dde3,0x1992b9ac,0xf3a09399,0xd498ae77,0xa7316606 } },
  112869. /* 208 */
  112870. { { 0xcad260f5,0x13990d2f,0xeec0e8c0,0x76c3be29,0x0f7bd7d5,0x7dc5bee0,
  112871. 0xefebda4b,0x9be167d2,0x9122b87e,0xcce3dde6,0x82b5415c,0x75a28b09 },
  112872. { 0xe84607a6,0xf6810bcd,0x6f4dbf0d,0xc6d58128,0x1b4dafeb,0xfead577d,
  112873. 0x066b28eb,0x9bc440b2,0x8b17e84b,0x53f1da97,0xcda9a575,0x0459504b } },
  112874. /* 209 */
  112875. { { 0x329e5836,0x13e39a02,0xf717269d,0x2c9e7d51,0xf26c963b,0xc5ac58d6,
  112876. 0x79967bf5,0x3b0c6c43,0x55908d9d,0x60bbea3f,0xf07c9ad1,0xd84811e7 },
  112877. { 0x5bd20e4a,0xfe7609a7,0x0a70baa8,0xe4325dd2,0xb3600386,0x3711f370,
  112878. 0xd0924302,0x97f9562f,0x4acc4436,0x040dc0c3,0xde79cdd4,0xfd6d725c } },
  112879. /* 210 */
  112880. { { 0xcf13eafb,0xb3efd0e3,0x5aa0ae5f,0x21009cbb,0x79022279,0xe480c553,
  112881. 0xb2fc9a6d,0x755cf334,0x07096ae7,0x8564a5bf,0xbd238139,0xddd649d0 },
  112882. { 0x8a045041,0xd0de10b1,0xc957d572,0x6e05b413,0x4e0fb25c,0x5c5ff806,
  112883. 0x641162fb,0xd933179b,0xe57439f9,0x42d48485,0x8a8d72aa,0x70c5bd0a } },
  112884. /* 211 */
  112885. { { 0x97bdf646,0xa7671738,0xab329f7c,0xaa1485b4,0xf8f25fdf,0xce3e11d6,
  112886. 0xc6221824,0x76a3fc7e,0xf3924740,0x045f281f,0x96d13a9a,0x24557d4e },
  112887. { 0xdd4c27cd,0x875c804b,0x0f5c7fea,0x11c5f0f4,0xdc55ff7e,0xac8c880b,
  112888. 0x1103f101,0x2acddec5,0xf99faa89,0x38341a21,0xce9d6b57,0xc7b67a2c } },
  112889. /* 212 */
  112890. { { 0x8e357586,0x9a0d724f,0xdf648da0,0x1d7f4ff5,0xfdee62a5,0x9c3e6c9b,
  112891. 0x0389b372,0x0499cef0,0x98eab879,0xe904050d,0x6c051617,0xe8eef1b6 },
  112892. { 0xc37e3ca9,0xebf5bfeb,0xa4e0b91d,0x7c5e946d,0x2c4bea28,0x79097314,
  112893. 0xee67b2b7,0x81f6c109,0xdafc5ede,0xaf237d9b,0x2abb04c7,0xd2e60201 } },
  112894. /* 213 */
  112895. { { 0x8a4f57bf,0x6156060c,0xff11182a,0xf9758696,0x6296ef00,0x8336773c,
  112896. 0xff666899,0x9c054bce,0x719cd11c,0xd6a11611,0xdbe1acfa,0x9824a641 },
  112897. { 0xba89fd01,0x0b7b7a5f,0x889f79d8,0xf8d3b809,0xf578285c,0xc5e1ea08,
  112898. 0xae6d8288,0x7ac74536,0x7521ef5f,0x5d37a200,0xb260a25d,0x5ecc4184 } },
  112899. /* 214 */
  112900. { { 0xa708c8d3,0xddcebb19,0xc63f81ec,0xe63ed04f,0x11873f95,0xd045f5a0,
  112901. 0x79f276d5,0x3b5ad544,0x425ae5b3,0x81272a3d,0x10ce1605,0x8bfeb501 },
  112902. { 0x888228bf,0x4233809c,0xb2aff7df,0x4bd82acf,0x0cbd4a7f,0x9c68f180,
  112903. 0x6b44323d,0xfcd77124,0x891db957,0x60c0fcf6,0x04da8f7f,0xcfbb4d89 } },
  112904. /* 215 */
  112905. { { 0x3b26139a,0x9a6a5df9,0xb2cc7eb8,0x3e076a83,0x5a964bcd,0x47a8e82d,
  112906. 0xb9278d6b,0x8a4e2a39,0xe4443549,0x93506c98,0xf1e0d566,0x06497a8f },
  112907. { 0x2b1efa05,0x3dee8d99,0x45393e33,0x2da63ca8,0xcf0579ad,0xa4af7277,
  112908. 0x3236d8ea,0xaf4b4639,0x32b617f5,0x6ccad95b,0xb88bb124,0xce76d8b8 } },
  112909. /* 216 */
  112910. { { 0x083843dc,0x63d2537a,0x1e4153b4,0x89eb3514,0xea9afc94,0x5175ebc4,
  112911. 0x8ed1aed7,0x7a652580,0xd85e8297,0x67295611,0xb584b73d,0x8dd2d68b },
  112912. { 0x0133c3a4,0x237139e6,0x4bd278ea,0x9de838ab,0xc062fcd9,0xe829b072,
  112913. 0x63ba8706,0x70730d4f,0xd3cd05ec,0x6080483f,0x0c85f84d,0x872ab5b8 } },
  112914. /* 217 */
  112915. { { 0x999d4d49,0xfc0776d3,0xec3f45e7,0xa3eb59de,0x0dae1fc1,0xbc990e44,
  112916. 0xa15371ff,0x33596b1e,0x9bc7ab25,0xd447dcb2,0x35979582,0xcd5b63e9 },
  112917. { 0x77d1ff11,0xae3366fa,0xedee6903,0x59f28f05,0xa4433bf2,0x6f43fed1,
  112918. 0xdf9ce00e,0x15409c9b,0xaca9c5dc,0x21b5cded,0x82d7bdb4,0xf9f33595 } },
  112919. /* 218 */
  112920. { { 0x9422c792,0x95944378,0xc958b8bf,0x239ea923,0xdf076541,0x4b61a247,
  112921. 0xbb9fc544,0x4d29ce85,0x0b424559,0x9a692a67,0x0e486900,0x6e0ca5a0 },
  112922. { 0x85b3bece,0x6b79a782,0xc61f9892,0x41f35e39,0xae747f82,0xff82099a,
  112923. 0xd0ca59d6,0x58c8ae3f,0x99406b5f,0x4ac930e2,0x9df24243,0x2ce04eb9 } },
  112924. /* 219 */
  112925. { { 0x1ac37b82,0x4366b994,0x25b04d83,0xff0c728d,0x19c47b7c,0x1f551361,
  112926. 0xbeff13e7,0xdbf2d5ed,0xe12a683d,0xf78efd51,0x989cf9c4,0x82cd85b9 },
  112927. { 0xe0cb5d37,0xe23c6db6,0x72ee1a15,0x818aeebd,0x28771b14,0x8212aafd,
  112928. 0x1def817d,0x7bc221d9,0x9445c51f,0xdac403a2,0x12c3746b,0x711b0517 } },
  112929. /* 220 */
  112930. { { 0x5ea99ecc,0x0ed9ed48,0xb8cab5e1,0xf799500d,0xb570cbdc,0xa8ec87dc,
  112931. 0xd35dfaec,0x52cfb2c2,0x6e4d80a4,0x8d31fae2,0xdcdeabe5,0xe6a37dc9 },
  112932. { 0x1deca452,0x5d365a34,0x0d68b44e,0x09a5f8a5,0xa60744b1,0x59238ea5,
  112933. 0xbb4249e9,0xf2fedc0d,0xa909b2e3,0xe395c74e,0x39388250,0xe156d1a5 } },
  112934. /* 221 */
  112935. { { 0x47181ae9,0xd796b3d0,0x44197808,0xbaf44ba8,0x34cf3fac,0xe6933094,
  112936. 0xc3bd5c46,0x41aa6ade,0xeed947c6,0x4fda75d8,0x9ea5a525,0xacd9d412 },
  112937. { 0xd430301b,0x65cc55a3,0x7b52ea49,0x3c9a5bcf,0x159507f0,0x22d319cf,
  112938. 0xde74a8dd,0x2ee0b9b5,0x877ac2b6,0x20c26a1e,0x92e7c314,0x387d73da } },
  112939. /* 222 */
  112940. { { 0x8cd3fdac,0x13c4833e,0x332e5b8e,0x76fcd473,0xe2fe1fd3,0xff671b4b,
  112941. 0x5d98d8ec,0x4d734e8b,0x514bbc11,0xb1ead3c6,0x7b390494,0xd14ca858 },
  112942. { 0x5d2d37e9,0x95a443af,0x00464622,0x73c6ea73,0x15755044,0xa44aeb4b,
  112943. 0xfab58fee,0xba3f8575,0xdc680a6f,0x9779dbc9,0x7b37ddfc,0xe1ee5f5a } },
  112944. /* 223 */
  112945. { { 0x12d29f46,0xcd0b4648,0x0ed53137,0x93295b0b,0x80bef6c9,0xbfe26094,
  112946. 0x54248b00,0xa6565788,0x80e7f9c4,0x69c43fca,0xbe141ea1,0x2190837b },
  112947. { 0xa1b26cfb,0x875e159a,0x7affe852,0x90ca9f87,0x92ca598e,0x15e6550d,
  112948. 0x1938ad11,0xe3e0945d,0x366ef937,0xef7636bb,0xb39869e5,0xb6034d0b } },
  112949. /* 224 */
  112950. { { 0x26d8356e,0x4d255e30,0xd314626f,0xf83666ed,0xd0c8ed64,0x421ddf61,
  112951. 0x26677b61,0x96e473c5,0x9e9b18b3,0xdad4af7e,0xa9393f75,0xfceffd4a },
  112952. { 0x11c731d5,0x843138a1,0xb2f141d9,0x05bcb3a1,0x617b7671,0x20e1fa95,
  112953. 0x88ccec7b,0xbefce812,0x90f1b568,0x582073dc,0x1f055cb7,0xf572261a } },
  112954. /* 225 */
  112955. { { 0x36973088,0xf3148277,0x86a9f980,0xc008e708,0xe046c261,0x1b795947,
  112956. 0xca76bca0,0xdf1e6a7d,0x71acddf0,0xabafd886,0x1364d8f4,0xff7054d9 },
  112957. { 0xe2260594,0x2cf63547,0xd73b277e,0x468a5372,0xef9bd35e,0xc7419e24,
  112958. 0x24043cc3,0x2b4a1c20,0x890b39cd,0xa28f047a,0x46f9a2e3,0xdca2cea1 } },
  112959. /* 226 */
  112960. { { 0x53277538,0xab788736,0xcf697738,0xa734e225,0x6b22e2c1,0x66ee1d1e,
  112961. 0xebe1d212,0x2c615389,0x02bb0766,0xf36cad40,0x3e64f207,0x120885c3 },
  112962. { 0x90fbfec2,0x59e77d56,0xd7a574ae,0xf9e781aa,0x5d045e53,0x801410b0,
  112963. 0xa91b5f0e,0xd3b5f0aa,0x7fbb3521,0xb3d1df00,0xc72bee9a,0x11c4b33e } },
  112964. /* 227 */
  112965. { { 0x83c3a7f3,0xd32b9832,0x88d8a354,0x8083abcf,0x50f4ec5a,0xdeb16404,
  112966. 0x641e2907,0x18d747f0,0xf1bbf03e,0x4e8978ae,0x88a0cd89,0x932447dc },
  112967. { 0xcf3d5897,0x561e0feb,0x13600e6d,0xfc3a682f,0xd16a6b73,0xc78b9d73,
  112968. 0xd29bf580,0xe713fede,0x08d69e5c,0x0a225223,0x1ff7fda4,0x3a924a57 } },
  112969. /* 228 */
  112970. { { 0xb4093bee,0xfb64554c,0xa58c6ec0,0xa6d65a25,0x43d0ed37,0x4126994d,
  112971. 0x55152d44,0xa5689a51,0x284caa8d,0xb8e5ea8c,0xd1f25538,0x33f05d4f },
  112972. { 0x1b615d6e,0xe0fdfe09,0x705507da,0x2ded7e8f,0x17bbcc80,0xdd5631e5,
  112973. 0x267fd11f,0x4f87453e,0xff89d62d,0xc6da723f,0xe3cda21d,0x55cbcae2 } },
  112974. /* 229 */
  112975. { { 0x6b4e84f3,0x336bc94e,0x4ef72c35,0x72863031,0xeeb57f99,0x6d85fdee,
  112976. 0xa42ece1b,0x7f4e3272,0x36f0320a,0x7f86cbb5,0x923331e6,0xf09b6a2b },
  112977. { 0x56778435,0x21d3ecf1,0x8323b2d2,0x2977ba99,0x1704bc0f,0x6a1b57fb,
  112978. 0x389f048a,0xd777cf8b,0xac6b42cd,0x9ce2174f,0x09e6c55a,0x404e2bff } },
  112979. /* 230 */
  112980. { { 0x204c5ddb,0x9b9b135e,0x3eff550e,0x9dbfe044,0xec3be0f6,0x35eab4bf,
  112981. 0x0a43e56f,0x8b4c3f0d,0x0e73f9b3,0x4c1c6673,0x2c78c905,0x92ed38bd },
  112982. { 0xa386e27c,0xc7003f6a,0xaced8507,0xb9c4f46f,0x59df5464,0xea024ec8,
  112983. 0x429572ea,0x4af96152,0xe1fc1194,0x279cd5e2,0x281e358c,0xaa376a03 } },
  112984. /* 231 */
  112985. { { 0x3cdbc95c,0x07859223,0xef2e337a,0xaae1aa6a,0x472a8544,0xc040108d,
  112986. 0x8d037b7d,0x80c853e6,0x8c7eee24,0xd221315c,0x8ee47752,0x195d3856 },
  112987. { 0xdacd7fbe,0xd4b1ba03,0xd3e0c52b,0x4b5ac61e,0x6aab7b52,0x68d3c052,
  112988. 0x660e3fea,0xf0d7248c,0x3145efb4,0xafdb3f89,0x8f40936d,0xa73fd9a3 } },
  112989. /* 232 */
  112990. { { 0xbb1b17ce,0x891b9ef3,0xc6127f31,0x14023667,0x305521fd,0x12b2e58d,
  112991. 0xe3508088,0x3a47e449,0xff751507,0xe49fc84b,0x5310d16e,0x4023f722 },
  112992. { 0xb73399fa,0xa608e5ed,0xd532aa3e,0xf12632d8,0x845e8415,0x13a2758e,
  112993. 0x1fc2d861,0xae4b6f85,0x339d02f2,0x3879f5b1,0x80d99ebd,0x446d22a6 } },
  112994. /* 233 */
  112995. { { 0x4be164f1,0x0f502302,0x88b81920,0x8d09d2d6,0x984aceff,0x514056f1,
  112996. 0x75e9e80d,0xa5c4ddf0,0xdf496a93,0x38cb47e6,0x38df6bf7,0x899e1d6b },
  112997. { 0xb59eb2a6,0x69e87e88,0x9b47f38b,0x280d9d63,0x3654e955,0x599411ea,
  112998. 0x969aa581,0xcf8dd4fd,0x530742a7,0xff5c2baf,0x1a373085,0xa4391536 } },
  112999. /* 234 */
  113000. { { 0xa8a4bdd2,0x6ace72a3,0xb68ef702,0xc656cdd1,0x90c4dad8,0xd4a33e7e,
  113001. 0x9d951c50,0x4aece08a,0x085d68e6,0xea8005ae,0x6f7502b8,0xfdd7a7d7 },
  113002. { 0x98d6fa45,0xce6fb0a6,0x1104eb8c,0x228f8672,0xda09d7dc,0xd23d8787,
  113003. 0x2ae93065,0x5521428b,0xea56c366,0x95faba3d,0x0a88aca5,0xedbe5039 } },
  113004. /* 235 */
  113005. { { 0xbfb26c82,0xd64da0ad,0x952c2f9c,0xe5d70b3c,0xf7e77f68,0xf5e8f365,
  113006. 0x08f2d695,0x7234e002,0xd12e7be6,0xfaf900ee,0x4acf734e,0x27dc6934 },
  113007. { 0xc260a46a,0x80e4ff5e,0x2dc31c28,0x7da5ebce,0xca69f552,0x485c5d73,
  113008. 0x69cc84c2,0xcdfb6b29,0xed6d4eca,0x031c5afe,0x22247637,0xc7bbf4c8 } },
  113009. /* 236 */
  113010. { { 0x49fe01b2,0x9d5b72c7,0x793a91b8,0x34785186,0xcf460438,0xa3ba3c54,
  113011. 0x3ab21b6f,0x73e8e43d,0xbe57b8ab,0x50cde8e0,0xdd204264,0x6488b3a7 },
  113012. { 0xdddc4582,0xa9e398b3,0x5bec46fe,0x1698c1a9,0x156d3843,0x7f1446ef,
  113013. 0x770329a2,0x3fd25dd8,0x2c710668,0x05b1221a,0xa72ee6cf,0x65b2dc2a } },
  113014. /* 237 */
  113015. { { 0xcd021d63,0x21a885f7,0xfea61f08,0x3f344b15,0xc5cf73e6,0xad5ba6dd,
  113016. 0x227a8b23,0x154d0d8f,0xdc559311,0x9b74373c,0x98620fa1,0x4feab715 },
  113017. { 0x7d9ec924,0x5098938e,0x6d47e550,0x84d54a5e,0x1b617506,0x1a2d1bdc,
  113018. 0x615868a4,0x99fe1782,0x3005a924,0x171da780,0x7d8f79b6,0xa70bf5ed } },
  113019. /* 238 */
  113020. { { 0xfe2216c5,0x0bc1250d,0x7601b351,0x2c37e250,0xd6f06b7e,0xb6300175,
  113021. 0x8bfeb9b7,0x4dde8ca1,0xb82f843d,0x4f210432,0xb1ac0afd,0x8d70e2f9 },
  113022. { 0xaae91abb,0x25c73b78,0x863028f2,0x0230dca3,0xe5cf30b7,0x8b923ecf,
  113023. 0x5506f265,0xed754ec2,0x729a5e39,0x8e41b88c,0xbabf889b,0xee67cec2 } },
  113024. /* 239 */
  113025. { { 0x1be46c65,0xe183acf5,0xe7565d7a,0x9789538f,0xd9627b4e,0x87873391,
  113026. 0x9f1d9187,0xbf4ac4c1,0x4691f5c8,0x5db99f63,0x74a1fb98,0xa68df803 },
  113027. { 0xbf92b5fa,0x3c448ed1,0x3e0bdc32,0xa098c841,0x79bf016c,0x8e74cd55,
  113028. 0x115e244d,0x5df0d09c,0x3410b66e,0x9418ad01,0x17a02130,0x8b6124cb } },
  113029. /* 240 */
  113030. { { 0xc26e3392,0x425ec3af,0xa1722e00,0xc07f8470,0xe2356b43,0xdcc28190,
  113031. 0xb1ef59a6,0x4ed97dff,0xc63028c1,0xc22b3ad1,0x68c18988,0x070723c2 },
  113032. { 0x4cf49e7d,0x70da302f,0x3f12a522,0xc5e87c93,0x18594148,0x74acdd1d,
  113033. 0xca74124c,0xad5f73ab,0xd69fd478,0xe72e4a3e,0x7b117cc3,0x61593868 } },
  113034. /* 241 */
  113035. { { 0xa9aa0486,0x7b7b9577,0xa063d557,0x6e41fb35,0xda9047d7,0xb017d5c7,
  113036. 0x68a87ba9,0x8c748280,0xdf08ad93,0xab45fa5c,0x4c288a28,0xcd9fb217 },
  113037. { 0x5747843d,0x59544642,0xa56111e3,0x34d64c6c,0x4bfce8d5,0x12e47ea1,
  113038. 0x6169267f,0x17740e05,0xeed03fb5,0x5c49438e,0x4fc3f513,0x9da30add } },
  113039. /* 242 */
  113040. { { 0xccfa5200,0xc4e85282,0x6a19b13d,0x2707608f,0xf5726e2f,0xdcb9a53d,
  113041. 0xe9427de5,0x612407c9,0xd54d582a,0x3e5a17e1,0x655ae118,0xb99877de },
  113042. { 0x015254de,0x6f0e972b,0xf0a6f7c5,0x92a56db1,0xa656f8b2,0xd297e4e1,
  113043. 0xad981983,0x99fe0052,0x07cfed84,0xd3652d2f,0x843c1738,0xc784352e } },
  113044. /* 243 */
  113045. { { 0x7e9b2d8a,0x6ee90af0,0x57cf1964,0xac8d7018,0x71f28efc,0xf6ed9031,
  113046. 0x6812b20e,0x7f70d5a9,0xf1c61eee,0x27b557f4,0xc6263758,0xf1c9bd57 },
  113047. { 0x2a1a6194,0x5cf7d014,0x1890ab84,0xdd614e0b,0x0e93c2a6,0x3ef9de10,
  113048. 0xe0cd91c5,0xf98cf575,0x14befc32,0x504ec0c6,0x6279d68c,0xd0513a66 } },
  113049. /* 244 */
  113050. { { 0xa859fb6a,0xa8eadbad,0xdb283666,0xcf8346e7,0x3e22e355,0x7b35e61a,
  113051. 0x99639c6b,0x293ece2c,0x56f241c8,0xfa0162e2,0xbf7a1dda,0xd2e6c7b9 },
  113052. { 0x40075e63,0xd0de6253,0xf9ec8286,0x2405aa61,0x8fe45494,0x2237830a,
  113053. 0x364e9c8c,0x4fd01ac7,0x904ba750,0x4d9c3d21,0xaf1b520b,0xd589be14 } },
  113054. /* 245 */
  113055. { { 0x4662e53b,0x13576a4f,0xf9077676,0x35ec2f51,0x97c0af97,0x66297d13,
  113056. 0x9e598b58,0xed3201fe,0x5e70f604,0x49bc752a,0xbb12d951,0xb54af535 },
  113057. { 0x212c1c76,0x36ea4c2b,0xeb250dfd,0x18f5bbc7,0x9a0a1a46,0xa0d466cc,
  113058. 0xdac2d917,0x52564da4,0x8e95fab5,0x206559f4,0x9ca67a33,0x7487c190 } },
  113059. /* 246 */
  113060. { { 0xdde98e9c,0x75abfe37,0x2a411199,0x99b90b26,0xdcdb1f7c,0x1b410996,
  113061. 0x8b3b5675,0xab346f11,0xf1f8ae1e,0x04852193,0x6b8b98c1,0x1ec4d227 },
  113062. { 0x45452baa,0xba3bc926,0xacc4a572,0x387d1858,0xe51f171e,0x9478eff6,
  113063. 0x931e1c00,0xf357077d,0xe54c8ca8,0xffee77cd,0x551dc9a4,0xfb4892ff } },
  113064. /* 247 */
  113065. { { 0x2db8dff8,0x5b1bdad0,0x5a2285a2,0xd462f4fd,0xda00b461,0x1d6aad8e,
  113066. 0x41306d1b,0x43fbefcf,0x6a13fe19,0x428e86f3,0x17f89404,0xc8b2f118 },
  113067. { 0xf0d51afb,0x762528aa,0x549b1d06,0xa3e2fea4,0xea3ddf66,0x86fad8f2,
  113068. 0x4fbdd206,0x0d9ccc4b,0xc189ff5a,0xcde97d4c,0x199f19a6,0xc36793d6 } },
  113069. /* 248 */
  113070. { { 0x51b85197,0xea38909b,0xb4c92895,0xffb17dd0,0x1ddb3f3f,0x0eb0878b,
  113071. 0xc57cf0f2,0xb05d28ff,0x1abd57e2,0xd8bde2e7,0xc40c1b20,0x7f2be28d },
  113072. { 0x299a2d48,0x6554dca2,0x8377982d,0x5130ba2e,0x1071971a,0x8863205f,
  113073. 0x7cf2825d,0x15ee6282,0x03748f2b,0xd4b6c57f,0x430385a0,0xa9e3f4da } },
  113074. /* 249 */
  113075. { { 0x83fbc9c6,0x33eb7cec,0x4541777e,0x24a311c7,0x4f0767fc,0xc81377f7,
  113076. 0x4ab702da,0x12adae36,0x2a779696,0xb7fcb6db,0x01cea6ad,0x4a6fb284 },
  113077. { 0xcdfc73de,0x5e8b1d2a,0x1b02fd32,0xd0efae8d,0xd81d8519,0x3f99c190,
  113078. 0xfc808971,0x3c18f7fa,0x51b7ae7b,0x41f713e7,0xf07fc3f8,0x0a4b3435 } },
  113079. /* 250 */
  113080. { { 0x019b7d2e,0x7dda3c4c,0xd4dc4b89,0x631c8d1a,0x1cdb313c,0x5489cd6e,
  113081. 0x4c07bb06,0xd44aed10,0x75f000d1,0x8f97e13a,0xdda5df4d,0x0e9ee64f },
  113082. { 0x3e346910,0xeaa99f3b,0xfa294ad7,0x622f6921,0x0d0b2fe9,0x22aaa20d,
  113083. 0x1e5881ba,0x4fed2f99,0xc1571802,0x9af3b2d6,0xdc7ee17c,0x919e67a8 } },
  113084. /* 251 */
  113085. { { 0x76250533,0xc724fe4c,0x7d817ef8,0x8a2080e5,0x172c9751,0xa2afb0f4,
  113086. 0x17c0702e,0x9b10cdeb,0xc9b7e3e9,0xbf3975e3,0x1cd0cdc5,0x206117df },
  113087. { 0xbe05ebd5,0xfb049e61,0x16c782c0,0xeb0bb55c,0xab7fed09,0x13a331b8,
  113088. 0x632863f0,0xf6c58b1d,0x4d3b6195,0x6264ef6e,0x9a53f116,0x92c51b63 } },
  113089. /* 252 */
  113090. { { 0x288b364d,0xa57c7bc8,0x7b41e5c4,0x4a562e08,0x698a9a11,0x699d21c6,
  113091. 0xf3f849b9,0xa4ed9581,0x9eb726ba,0xa223eef3,0xcc2884f9,0x13159c23 },
  113092. { 0x3a3f4963,0x73931e58,0x0ada6a81,0x96500389,0x5ab2950b,0x3ee8a1c6,
  113093. 0x775fab52,0xeedf4949,0x4f2671b6,0x63d652e1,0x3c4e2f55,0xfed4491c } },
  113094. /* 253 */
  113095. { { 0xf4eb453e,0x335eadc3,0xcadd1a5b,0x5ff74b63,0x5d84a91a,0x6933d0d7,
  113096. 0xb49ba337,0x9ca3eeb9,0xc04c15b8,0x1f6facce,0xdc09a7e4,0x4ef19326 },
  113097. { 0x3dca3233,0x53d2d324,0xa2259d4b,0x0ee40590,0x5546f002,0x18c22edb,
  113098. 0x09ea6b71,0x92429801,0xb0e91e61,0xaada0add,0x99963c50,0x5fe53ef4 } },
  113099. /* 254 */
  113100. { { 0x90c28c65,0x372dd06b,0x119ce47d,0x1765242c,0x6b22fc82,0xc041fb80,
  113101. 0xb0a7ccc1,0x667edf07,0x1261bece,0xc79599e7,0x19cff22a,0xbc69d9ba },
  113102. { 0x13c06819,0x009d77cd,0xe282b79d,0x635a66ae,0x225b1be8,0x4edac4a6,
  113103. 0x524008f9,0x57d4f4e4,0xb056af84,0xee299ac5,0x3a0bc386,0xcc38444c } },
  113104. /* 255 */
  113105. { { 0xcd4c2356,0x490643b1,0x750547be,0x740a4851,0xd4944c04,0x643eaf29,
  113106. 0x299a98a0,0xba572479,0xee05fdf9,0x48b29f16,0x089b2d7b,0x33fb4f61 },
  113107. { 0xa950f955,0x86704902,0xfedc3ddf,0x97e1034d,0x05fbb6a2,0x211320b6,
  113108. 0x432299bb,0x23d7b93f,0x8590e4a3,0x1fe1a057,0xf58c0ce6,0x8e1d0586 } },
  113109. };
  113110. /* Multiply the base point of P384 by the scalar and return the result.
  113111. * If map is true then convert result to affine coordinates.
  113112. *
  113113. * Stripe implementation.
  113114. * Pre-generated: 2^0, 2^48, ...
  113115. * Pre-generated: products of all combinations of above.
  113116. * 8 doubles and adds (with qz=1)
  113117. *
  113118. * r Resulting point.
  113119. * k Scalar to multiply by.
  113120. * map Indicates whether to convert result to affine.
  113121. * ct Constant time required.
  113122. * heap Heap to use for allocation.
  113123. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  113124. */
  113125. static int sp_384_ecc_mulmod_base_12(sp_point_384* r, const sp_digit* k,
  113126. int map, int ct, void* heap)
  113127. {
  113128. return sp_384_ecc_mulmod_stripe_12(r, &p384_base, p384_table,
  113129. k, map, ct, heap);
  113130. }
  113131. #endif
  113132. /* Multiply the base point of P384 by the scalar and return the result.
  113133. * If map is true then convert result to affine coordinates.
  113134. *
  113135. * km Scalar to multiply by.
  113136. * r Resulting point.
  113137. * map Indicates whether to convert result to affine.
  113138. * heap Heap to use for allocation.
  113139. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  113140. */
  113141. int sp_ecc_mulmod_base_384(const mp_int* km, ecc_point* r, int map, void* heap)
  113142. {
  113143. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  113144. sp_point_384* point = NULL;
  113145. sp_digit* k = NULL;
  113146. #else
  113147. sp_point_384 point[1];
  113148. sp_digit k[12];
  113149. #endif
  113150. int err = MP_OKAY;
  113151. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  113152. point = (sp_point_384*)XMALLOC(sizeof(sp_point_384), heap,
  113153. DYNAMIC_TYPE_ECC);
  113154. if (point == NULL)
  113155. err = MEMORY_E;
  113156. if (err == MP_OKAY) {
  113157. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 12, heap,
  113158. DYNAMIC_TYPE_ECC);
  113159. if (k == NULL)
  113160. err = MEMORY_E;
  113161. }
  113162. #endif
  113163. if (err == MP_OKAY) {
  113164. sp_384_from_mp(k, 12, km);
  113165. err = sp_384_ecc_mulmod_base_12(point, k, map, 1, heap);
  113166. }
  113167. if (err == MP_OKAY) {
  113168. err = sp_384_point_to_ecc_point_12(point, r);
  113169. }
  113170. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  113171. if (k != NULL)
  113172. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  113173. if (point != NULL)
  113174. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  113175. #endif
  113176. return err;
  113177. }
  113178. /* Multiply the base point of P384 by the scalar, add point a and return
  113179. * the result. If map is true then convert result to affine coordinates.
  113180. *
  113181. * km Scalar to multiply by.
  113182. * am Point to add to scalar mulitply result.
  113183. * inMont Point to add is in montgomery form.
  113184. * r Resulting point.
  113185. * map Indicates whether to convert result to affine.
  113186. * heap Heap to use for allocation.
  113187. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  113188. */
  113189. int sp_ecc_mulmod_base_add_384(const mp_int* km, const ecc_point* am,
  113190. int inMont, ecc_point* r, int map, void* heap)
  113191. {
  113192. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  113193. sp_point_384* point = NULL;
  113194. sp_digit* k = NULL;
  113195. #else
  113196. sp_point_384 point[2];
  113197. sp_digit k[12 + 12 * 2 * 6];
  113198. #endif
  113199. sp_point_384* addP = NULL;
  113200. sp_digit* tmp = NULL;
  113201. int err = MP_OKAY;
  113202. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  113203. point = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap,
  113204. DYNAMIC_TYPE_ECC);
  113205. if (point == NULL)
  113206. err = MEMORY_E;
  113207. if (err == MP_OKAY) {
  113208. k = (sp_digit*)XMALLOC(
  113209. sizeof(sp_digit) * (12 + 12 * 2 * 6),
  113210. heap, DYNAMIC_TYPE_ECC);
  113211. if (k == NULL)
  113212. err = MEMORY_E;
  113213. }
  113214. #endif
  113215. if (err == MP_OKAY) {
  113216. addP = point + 1;
  113217. tmp = k + 12;
  113218. sp_384_from_mp(k, 12, km);
  113219. sp_384_point_from_ecc_point_12(addP, am);
  113220. }
  113221. if ((err == MP_OKAY) && (!inMont)) {
  113222. err = sp_384_mod_mul_norm_12(addP->x, addP->x, p384_mod);
  113223. }
  113224. if ((err == MP_OKAY) && (!inMont)) {
  113225. err = sp_384_mod_mul_norm_12(addP->y, addP->y, p384_mod);
  113226. }
  113227. if ((err == MP_OKAY) && (!inMont)) {
  113228. err = sp_384_mod_mul_norm_12(addP->z, addP->z, p384_mod);
  113229. }
  113230. if (err == MP_OKAY) {
  113231. err = sp_384_ecc_mulmod_base_12(point, k, 0, 0, heap);
  113232. }
  113233. if (err == MP_OKAY) {
  113234. sp_384_proj_point_add_12(point, point, addP, tmp);
  113235. if (map) {
  113236. sp_384_map_12(point, point, tmp);
  113237. }
  113238. err = sp_384_point_to_ecc_point_12(point, r);
  113239. }
  113240. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  113241. if (k != NULL)
  113242. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  113243. if (point)
  113244. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  113245. #endif
  113246. return err;
  113247. }
  113248. #if defined(WOLFSSL_VALIDATE_ECC_KEYGEN) || defined(HAVE_ECC_SIGN) || \
  113249. defined(HAVE_ECC_VERIFY)
  113250. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN | HAVE_ECC_SIGN | HAVE_ECC_VERIFY */
  113251. /* Add 1 to a. (a = a + 1)
  113252. *
  113253. * a A single precision integer.
  113254. */
  113255. SP_NOINLINE static void sp_384_add_one_12(sp_digit* a)
  113256. {
  113257. __asm__ __volatile__ (
  113258. "movs r2, #1\n\t"
  113259. "ldr r1, [%[a]]\n\t"
  113260. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113261. "adds r1, r1, r2\n\t"
  113262. #else
  113263. "add r1, r1, r2\n\t"
  113264. #endif
  113265. "movs r2, #0\n\t"
  113266. "str r1, [%[a]]\n\t"
  113267. "ldr r1, [%[a], #4]\n\t"
  113268. #ifdef WOLFSSL_KEIL
  113269. "adcs r1, r1, r2\n\t"
  113270. #elif defined(__clang__)
  113271. "adcs r1, r2\n\t"
  113272. #else
  113273. "adc r1, r2\n\t"
  113274. #endif
  113275. "str r1, [%[a], #4]\n\t"
  113276. "ldr r1, [%[a], #8]\n\t"
  113277. #ifdef WOLFSSL_KEIL
  113278. "adcs r1, r1, r2\n\t"
  113279. #elif defined(__clang__)
  113280. "adcs r1, r2\n\t"
  113281. #else
  113282. "adc r1, r2\n\t"
  113283. #endif
  113284. "str r1, [%[a], #8]\n\t"
  113285. "ldr r1, [%[a], #12]\n\t"
  113286. #ifdef WOLFSSL_KEIL
  113287. "adcs r1, r1, r2\n\t"
  113288. #elif defined(__clang__)
  113289. "adcs r1, r2\n\t"
  113290. #else
  113291. "adc r1, r2\n\t"
  113292. #endif
  113293. "str r1, [%[a], #12]\n\t"
  113294. "ldr r1, [%[a], #16]\n\t"
  113295. #ifdef WOLFSSL_KEIL
  113296. "adcs r1, r1, r2\n\t"
  113297. #elif defined(__clang__)
  113298. "adcs r1, r2\n\t"
  113299. #else
  113300. "adc r1, r2\n\t"
  113301. #endif
  113302. "str r1, [%[a], #16]\n\t"
  113303. "ldr r1, [%[a], #20]\n\t"
  113304. #ifdef WOLFSSL_KEIL
  113305. "adcs r1, r1, r2\n\t"
  113306. #elif defined(__clang__)
  113307. "adcs r1, r2\n\t"
  113308. #else
  113309. "adc r1, r2\n\t"
  113310. #endif
  113311. "str r1, [%[a], #20]\n\t"
  113312. "ldr r1, [%[a], #24]\n\t"
  113313. #ifdef WOLFSSL_KEIL
  113314. "adcs r1, r1, r2\n\t"
  113315. #elif defined(__clang__)
  113316. "adcs r1, r2\n\t"
  113317. #else
  113318. "adc r1, r2\n\t"
  113319. #endif
  113320. "str r1, [%[a], #24]\n\t"
  113321. "ldr r1, [%[a], #28]\n\t"
  113322. #ifdef WOLFSSL_KEIL
  113323. "adcs r1, r1, r2\n\t"
  113324. #elif defined(__clang__)
  113325. "adcs r1, r2\n\t"
  113326. #else
  113327. "adc r1, r2\n\t"
  113328. #endif
  113329. "str r1, [%[a], #28]\n\t"
  113330. "ldr r1, [%[a], #32]\n\t"
  113331. #ifdef WOLFSSL_KEIL
  113332. "adcs r1, r1, r2\n\t"
  113333. #elif defined(__clang__)
  113334. "adcs r1, r2\n\t"
  113335. #else
  113336. "adc r1, r2\n\t"
  113337. #endif
  113338. "str r1, [%[a], #32]\n\t"
  113339. "ldr r1, [%[a], #36]\n\t"
  113340. #ifdef WOLFSSL_KEIL
  113341. "adcs r1, r1, r2\n\t"
  113342. #elif defined(__clang__)
  113343. "adcs r1, r2\n\t"
  113344. #else
  113345. "adc r1, r2\n\t"
  113346. #endif
  113347. "str r1, [%[a], #36]\n\t"
  113348. "ldr r1, [%[a], #40]\n\t"
  113349. #ifdef WOLFSSL_KEIL
  113350. "adcs r1, r1, r2\n\t"
  113351. #elif defined(__clang__)
  113352. "adcs r1, r2\n\t"
  113353. #else
  113354. "adc r1, r2\n\t"
  113355. #endif
  113356. "str r1, [%[a], #40]\n\t"
  113357. "ldr r1, [%[a], #44]\n\t"
  113358. #ifdef WOLFSSL_KEIL
  113359. "adcs r1, r1, r2\n\t"
  113360. #elif defined(__clang__)
  113361. "adcs r1, r2\n\t"
  113362. #else
  113363. "adc r1, r2\n\t"
  113364. #endif
  113365. "str r1, [%[a], #44]\n\t"
  113366. : [a] "+l" (a)
  113367. :
  113368. : "memory", "r1", "r2"
  113369. );
  113370. }
  113371. /* Read big endian unsigned byte array into r.
  113372. *
  113373. * r A single precision integer.
  113374. * size Maximum number of bytes to convert
  113375. * a Byte array.
  113376. * n Number of bytes in array to read.
  113377. */
  113378. static void sp_384_from_bin(sp_digit* r, int size, const byte* a, int n)
  113379. {
  113380. int i;
  113381. int j;
  113382. byte* d;
  113383. for (i = n - 1,j = 0; i >= 3; i -= 4) {
  113384. r[j] = ((sp_digit)a[i - 0] << 0) |
  113385. ((sp_digit)a[i - 1] << 8) |
  113386. ((sp_digit)a[i - 2] << 16) |
  113387. ((sp_digit)a[i - 3] << 24);
  113388. j++;
  113389. }
  113390. if (i >= 0) {
  113391. r[j] = 0;
  113392. d = (byte*)r;
  113393. switch (i) {
  113394. case 2: d[n - 1 - 2] = a[2]; //fallthrough
  113395. case 1: d[n - 1 - 1] = a[1]; //fallthrough
  113396. case 0: d[n - 1 - 0] = a[0]; //fallthrough
  113397. }
  113398. j++;
  113399. }
  113400. for (; j < size; j++) {
  113401. r[j] = 0;
  113402. }
  113403. }
  113404. /* Generates a scalar that is in the range 1..order-1.
  113405. *
  113406. * rng Random number generator.
  113407. * k Scalar value.
  113408. * returns RNG failures, MEMORY_E when memory allocation fails and
  113409. * MP_OKAY on success.
  113410. */
  113411. static int sp_384_ecc_gen_k_12(WC_RNG* rng, sp_digit* k)
  113412. {
  113413. int err;
  113414. byte buf[48];
  113415. do {
  113416. err = wc_RNG_GenerateBlock(rng, buf, sizeof(buf));
  113417. if (err == 0) {
  113418. sp_384_from_bin(k, 12, buf, (int)sizeof(buf));
  113419. if (sp_384_cmp_12(k, p384_order2) <= 0) {
  113420. sp_384_add_one_12(k);
  113421. break;
  113422. }
  113423. }
  113424. }
  113425. while (err == 0);
  113426. return err;
  113427. }
  113428. /* Makes a random EC key pair.
  113429. *
  113430. * rng Random number generator.
  113431. * priv Generated private value.
  113432. * pub Generated public point.
  113433. * heap Heap to use for allocation.
  113434. * returns ECC_INF_E when the point does not have the correct order, RNG
  113435. * failures, MEMORY_E when memory allocation fails and MP_OKAY on success.
  113436. */
  113437. int sp_ecc_make_key_384(WC_RNG* rng, mp_int* priv, ecc_point* pub, void* heap)
  113438. {
  113439. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  113440. sp_point_384* point = NULL;
  113441. sp_digit* k = NULL;
  113442. #else
  113443. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  113444. sp_point_384 point[2];
  113445. #else
  113446. sp_point_384 point[1];
  113447. #endif
  113448. sp_digit k[12];
  113449. #endif
  113450. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  113451. sp_point_384* infinity = NULL;
  113452. #endif
  113453. int err = MP_OKAY;
  113454. (void)heap;
  113455. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  113456. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  113457. point = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap, DYNAMIC_TYPE_ECC);
  113458. #else
  113459. point = (sp_point_384*)XMALLOC(sizeof(sp_point_384), heap, DYNAMIC_TYPE_ECC);
  113460. #endif
  113461. if (point == NULL)
  113462. err = MEMORY_E;
  113463. if (err == MP_OKAY) {
  113464. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 12, heap,
  113465. DYNAMIC_TYPE_ECC);
  113466. if (k == NULL)
  113467. err = MEMORY_E;
  113468. }
  113469. #endif
  113470. if (err == MP_OKAY) {
  113471. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  113472. infinity = point + 1;
  113473. #endif
  113474. err = sp_384_ecc_gen_k_12(rng, k);
  113475. }
  113476. if (err == MP_OKAY) {
  113477. err = sp_384_ecc_mulmod_base_12(point, k, 1, 1, NULL);
  113478. }
  113479. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  113480. if (err == MP_OKAY) {
  113481. err = sp_384_ecc_mulmod_12(infinity, point, p384_order, 1, 1, NULL);
  113482. }
  113483. if (err == MP_OKAY) {
  113484. if (sp_384_iszero_12(point->x) || sp_384_iszero_12(point->y)) {
  113485. err = ECC_INF_E;
  113486. }
  113487. }
  113488. #endif
  113489. if (err == MP_OKAY) {
  113490. err = sp_384_to_mp(k, priv);
  113491. }
  113492. if (err == MP_OKAY) {
  113493. err = sp_384_point_to_ecc_point_12(point, pub);
  113494. }
  113495. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  113496. if (k != NULL)
  113497. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  113498. if (point != NULL) {
  113499. /* point is not sensitive, so no need to zeroize */
  113500. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  113501. }
  113502. #endif
  113503. return err;
  113504. }
  113505. #ifdef WOLFSSL_SP_NONBLOCK
  113506. typedef struct sp_ecc_key_gen_384_ctx {
  113507. int state;
  113508. sp_384_ecc_mulmod_12_ctx mulmod_ctx;
  113509. sp_digit k[12];
  113510. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  113511. sp_point_384 point[2];
  113512. #else
  113513. sp_point_384 point[1];
  113514. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN */
  113515. } sp_ecc_key_gen_384_ctx;
  113516. int sp_ecc_make_key_384_nb(sp_ecc_ctx_t* sp_ctx, WC_RNG* rng, mp_int* priv,
  113517. ecc_point* pub, void* heap)
  113518. {
  113519. int err = FP_WOULDBLOCK;
  113520. sp_ecc_key_gen_384_ctx* ctx = (sp_ecc_key_gen_384_ctx*)sp_ctx->data;
  113521. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  113522. sp_point_384* infinity = ctx->point + 1;
  113523. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN */
  113524. typedef char ctx_size_test[sizeof(sp_ecc_key_gen_384_ctx)
  113525. >= sizeof(*sp_ctx) ? -1 : 1];
  113526. (void)sizeof(ctx_size_test);
  113527. switch (ctx->state) {
  113528. case 0:
  113529. err = sp_384_ecc_gen_k_12(rng, ctx->k);
  113530. if (err == MP_OKAY) {
  113531. err = FP_WOULDBLOCK;
  113532. ctx->state = 1;
  113533. }
  113534. break;
  113535. case 1:
  113536. err = sp_384_ecc_mulmod_base_12_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  113537. ctx->point, ctx->k, 1, 1, heap);
  113538. if (err == MP_OKAY) {
  113539. err = FP_WOULDBLOCK;
  113540. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  113541. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  113542. ctx->state = 2;
  113543. #else
  113544. ctx->state = 3;
  113545. #endif
  113546. }
  113547. break;
  113548. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  113549. case 2:
  113550. err = sp_384_ecc_mulmod_12_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  113551. infinity, ctx->point, p384_order, 1, 1);
  113552. if (err == MP_OKAY) {
  113553. if (sp_384_iszero_12(ctx->point->x) ||
  113554. sp_384_iszero_12(ctx->point->y)) {
  113555. err = ECC_INF_E;
  113556. }
  113557. else {
  113558. err = FP_WOULDBLOCK;
  113559. ctx->state = 3;
  113560. }
  113561. }
  113562. break;
  113563. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN */
  113564. case 3:
  113565. err = sp_384_to_mp(ctx->k, priv);
  113566. if (err == MP_OKAY) {
  113567. err = sp_384_point_to_ecc_point_12(ctx->point, pub);
  113568. }
  113569. break;
  113570. }
  113571. if (err != FP_WOULDBLOCK) {
  113572. XMEMSET(ctx, 0, sizeof(sp_ecc_key_gen_384_ctx));
  113573. }
  113574. return err;
  113575. }
  113576. #endif /* WOLFSSL_SP_NONBLOCK */
  113577. #ifdef HAVE_ECC_DHE
  113578. /* Write r as big endian to byte array.
  113579. * Fixed length number of bytes written: 48
  113580. *
  113581. * r A single precision integer.
  113582. * a Byte array.
  113583. */
  113584. static void sp_384_to_bin_12(sp_digit* r, byte* a)
  113585. {
  113586. int i;
  113587. int j = 0;
  113588. for (i = 11; i >= 0; i--) {
  113589. a[j++] = r[i] >> 24;
  113590. a[j++] = r[i] >> 16;
  113591. a[j++] = r[i] >> 8;
  113592. a[j++] = r[i] >> 0;
  113593. }
  113594. }
  113595. /* Multiply the point by the scalar and serialize the X ordinate.
  113596. * The number is 0 padded to maximum size on output.
  113597. *
  113598. * priv Scalar to multiply the point by.
  113599. * pub Point to multiply.
  113600. * out Buffer to hold X ordinate.
  113601. * outLen On entry, size of the buffer in bytes.
  113602. * On exit, length of data in buffer in bytes.
  113603. * heap Heap to use for allocation.
  113604. * returns BUFFER_E if the buffer is to small for output size,
  113605. * MEMORY_E when memory allocation fails and MP_OKAY on success.
  113606. */
  113607. int sp_ecc_secret_gen_384(const mp_int* priv, const ecc_point* pub, byte* out,
  113608. word32* outLen, void* heap)
  113609. {
  113610. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  113611. sp_point_384* point = NULL;
  113612. sp_digit* k = NULL;
  113613. #else
  113614. sp_point_384 point[1];
  113615. sp_digit k[12];
  113616. #endif
  113617. int err = MP_OKAY;
  113618. if (*outLen < 48U) {
  113619. err = BUFFER_E;
  113620. }
  113621. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  113622. if (err == MP_OKAY) {
  113623. point = (sp_point_384*)XMALLOC(sizeof(sp_point_384), heap,
  113624. DYNAMIC_TYPE_ECC);
  113625. if (point == NULL)
  113626. err = MEMORY_E;
  113627. }
  113628. if (err == MP_OKAY) {
  113629. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 12, heap,
  113630. DYNAMIC_TYPE_ECC);
  113631. if (k == NULL)
  113632. err = MEMORY_E;
  113633. }
  113634. #endif
  113635. if (err == MP_OKAY) {
  113636. sp_384_from_mp(k, 12, priv);
  113637. sp_384_point_from_ecc_point_12(point, pub);
  113638. err = sp_384_ecc_mulmod_12(point, point, k, 1, 1, heap);
  113639. }
  113640. if (err == MP_OKAY) {
  113641. sp_384_to_bin_12(point->x, out);
  113642. *outLen = 48;
  113643. }
  113644. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  113645. if (k != NULL)
  113646. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  113647. if (point != NULL)
  113648. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  113649. #endif
  113650. return err;
  113651. }
  113652. #ifdef WOLFSSL_SP_NONBLOCK
  113653. typedef struct sp_ecc_sec_gen_384_ctx {
  113654. int state;
  113655. union {
  113656. sp_384_ecc_mulmod_12_ctx mulmod_ctx;
  113657. };
  113658. sp_digit k[12];
  113659. sp_point_384 point;
  113660. } sp_ecc_sec_gen_384_ctx;
  113661. int sp_ecc_secret_gen_384_nb(sp_ecc_ctx_t* sp_ctx, const mp_int* priv,
  113662. const ecc_point* pub, byte* out, word32* outLen, void* heap)
  113663. {
  113664. int err = FP_WOULDBLOCK;
  113665. sp_ecc_sec_gen_384_ctx* ctx = (sp_ecc_sec_gen_384_ctx*)sp_ctx->data;
  113666. typedef char ctx_size_test[sizeof(sp_ecc_sec_gen_384_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  113667. (void)sizeof(ctx_size_test);
  113668. if (*outLen < 32U) {
  113669. err = BUFFER_E;
  113670. }
  113671. switch (ctx->state) {
  113672. case 0:
  113673. sp_384_from_mp(ctx->k, 12, priv);
  113674. sp_384_point_from_ecc_point_12(&ctx->point, pub);
  113675. ctx->state = 1;
  113676. break;
  113677. case 1:
  113678. err = sp_384_ecc_mulmod_12_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  113679. &ctx->point, &ctx->point, ctx->k, 1, 1, heap);
  113680. if (err == MP_OKAY) {
  113681. sp_384_to_bin_12(ctx->point.x, out);
  113682. *outLen = 48;
  113683. }
  113684. break;
  113685. }
  113686. if (err == MP_OKAY && ctx->state != 1) {
  113687. err = FP_WOULDBLOCK;
  113688. }
  113689. if (err != FP_WOULDBLOCK) {
  113690. XMEMSET(ctx, 0, sizeof(sp_ecc_sec_gen_384_ctx));
  113691. }
  113692. return err;
  113693. }
  113694. #endif /* WOLFSSL_SP_NONBLOCK */
  113695. #endif /* HAVE_ECC_DHE */
  113696. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  113697. #endif
  113698. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  113699. #endif
  113700. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  113701. #ifdef WOLFSSL_SP_SMALL
  113702. /* Sub b from a into a. (a -= b)
  113703. *
  113704. * a A single precision integer.
  113705. * b A single precision integer.
  113706. */
  113707. SP_NOINLINE static sp_digit sp_384_sub_in_place_12(sp_digit* a,
  113708. const sp_digit* b)
  113709. {
  113710. __asm__ __volatile__ (
  113711. "movs r7, %[a]\n\t"
  113712. "movs r2, #0\n\t"
  113713. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113714. "adds r7, r7, #48\n\t"
  113715. #else
  113716. "add r7, r7, #48\n\t"
  113717. #endif
  113718. "\n"
  113719. "L_sp_384_sub_in_place_12_words_%=:\n\t"
  113720. "movs r5, #0\n\t"
  113721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113722. "subs r5, r5, r2\n\t"
  113723. #else
  113724. "sub r5, r5, r2\n\t"
  113725. #endif
  113726. "ldr r3, [%[a]]\n\t"
  113727. "ldr r4, [%[a], #4]\n\t"
  113728. "ldr r5, [%[b]]\n\t"
  113729. "ldr r6, [%[b], #4]\n\t"
  113730. #ifdef WOLFSSL_KEIL
  113731. "sbcs r3, r3, r5\n\t"
  113732. #elif defined(__clang__)
  113733. "sbcs r3, r5\n\t"
  113734. #else
  113735. "sbc r3, r5\n\t"
  113736. #endif
  113737. #ifdef WOLFSSL_KEIL
  113738. "sbcs r4, r4, r6\n\t"
  113739. #elif defined(__clang__)
  113740. "sbcs r4, r6\n\t"
  113741. #else
  113742. "sbc r4, r6\n\t"
  113743. #endif
  113744. "str r3, [%[a]]\n\t"
  113745. "str r4, [%[a], #4]\n\t"
  113746. #ifdef WOLFSSL_KEIL
  113747. "sbcs r2, r2, r2\n\t"
  113748. #elif defined(__clang__)
  113749. "sbcs r2, r2\n\t"
  113750. #else
  113751. "sbc r2, r2\n\t"
  113752. #endif
  113753. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113754. "adds %[a], %[a], #8\n\t"
  113755. #else
  113756. "add %[a], %[a], #8\n\t"
  113757. #endif
  113758. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113759. "adds %[b], %[b], #8\n\t"
  113760. #else
  113761. "add %[b], %[b], #8\n\t"
  113762. #endif
  113763. "cmp %[a], r7\n\t"
  113764. "bne L_sp_384_sub_in_place_12_words_%=\n\t"
  113765. "movs %[a], r2\n\t"
  113766. : [a] "+l" (a), [b] "+l" (b)
  113767. :
  113768. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  113769. );
  113770. return (uint32_t)(size_t)a;
  113771. }
  113772. #else
  113773. /* Sub b from a into a. (a -= b)
  113774. *
  113775. * a A single precision integer.
  113776. * b A single precision integer.
  113777. */
  113778. SP_NOINLINE static sp_digit sp_384_sub_in_place_12(sp_digit* a,
  113779. const sp_digit* b)
  113780. {
  113781. __asm__ __volatile__ (
  113782. "ldm %[b]!, {r4, r5}\n\t"
  113783. "ldr r2, [%[a]]\n\t"
  113784. "ldr r3, [%[a], #4]\n\t"
  113785. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113786. "subs r2, r2, r4\n\t"
  113787. #else
  113788. "sub r2, r2, r4\n\t"
  113789. #endif
  113790. #ifdef WOLFSSL_KEIL
  113791. "sbcs r3, r3, r5\n\t"
  113792. #elif defined(__clang__)
  113793. "sbcs r3, r5\n\t"
  113794. #else
  113795. "sbc r3, r5\n\t"
  113796. #endif
  113797. "stm %[a]!, {r2, r3}\n\t"
  113798. "ldm %[b]!, {r4, r5}\n\t"
  113799. "ldr r2, [%[a]]\n\t"
  113800. "ldr r3, [%[a], #4]\n\t"
  113801. #ifdef WOLFSSL_KEIL
  113802. "sbcs r2, r2, r4\n\t"
  113803. #elif defined(__clang__)
  113804. "sbcs r2, r4\n\t"
  113805. #else
  113806. "sbc r2, r4\n\t"
  113807. #endif
  113808. #ifdef WOLFSSL_KEIL
  113809. "sbcs r3, r3, r5\n\t"
  113810. #elif defined(__clang__)
  113811. "sbcs r3, r5\n\t"
  113812. #else
  113813. "sbc r3, r5\n\t"
  113814. #endif
  113815. "stm %[a]!, {r2, r3}\n\t"
  113816. "ldm %[b]!, {r4, r5}\n\t"
  113817. "ldr r2, [%[a]]\n\t"
  113818. "ldr r3, [%[a], #4]\n\t"
  113819. #ifdef WOLFSSL_KEIL
  113820. "sbcs r2, r2, r4\n\t"
  113821. #elif defined(__clang__)
  113822. "sbcs r2, r4\n\t"
  113823. #else
  113824. "sbc r2, r4\n\t"
  113825. #endif
  113826. #ifdef WOLFSSL_KEIL
  113827. "sbcs r3, r3, r5\n\t"
  113828. #elif defined(__clang__)
  113829. "sbcs r3, r5\n\t"
  113830. #else
  113831. "sbc r3, r5\n\t"
  113832. #endif
  113833. "stm %[a]!, {r2, r3}\n\t"
  113834. "ldm %[b]!, {r4, r5}\n\t"
  113835. "ldr r2, [%[a]]\n\t"
  113836. "ldr r3, [%[a], #4]\n\t"
  113837. #ifdef WOLFSSL_KEIL
  113838. "sbcs r2, r2, r4\n\t"
  113839. #elif defined(__clang__)
  113840. "sbcs r2, r4\n\t"
  113841. #else
  113842. "sbc r2, r4\n\t"
  113843. #endif
  113844. #ifdef WOLFSSL_KEIL
  113845. "sbcs r3, r3, r5\n\t"
  113846. #elif defined(__clang__)
  113847. "sbcs r3, r5\n\t"
  113848. #else
  113849. "sbc r3, r5\n\t"
  113850. #endif
  113851. "stm %[a]!, {r2, r3}\n\t"
  113852. "ldm %[b]!, {r4, r5}\n\t"
  113853. "ldr r2, [%[a]]\n\t"
  113854. "ldr r3, [%[a], #4]\n\t"
  113855. #ifdef WOLFSSL_KEIL
  113856. "sbcs r2, r2, r4\n\t"
  113857. #elif defined(__clang__)
  113858. "sbcs r2, r4\n\t"
  113859. #else
  113860. "sbc r2, r4\n\t"
  113861. #endif
  113862. #ifdef WOLFSSL_KEIL
  113863. "sbcs r3, r3, r5\n\t"
  113864. #elif defined(__clang__)
  113865. "sbcs r3, r5\n\t"
  113866. #else
  113867. "sbc r3, r5\n\t"
  113868. #endif
  113869. "stm %[a]!, {r2, r3}\n\t"
  113870. "ldm %[b]!, {r4, r5}\n\t"
  113871. "ldr r2, [%[a]]\n\t"
  113872. "ldr r3, [%[a], #4]\n\t"
  113873. #ifdef WOLFSSL_KEIL
  113874. "sbcs r2, r2, r4\n\t"
  113875. #elif defined(__clang__)
  113876. "sbcs r2, r4\n\t"
  113877. #else
  113878. "sbc r2, r4\n\t"
  113879. #endif
  113880. #ifdef WOLFSSL_KEIL
  113881. "sbcs r3, r3, r5\n\t"
  113882. #elif defined(__clang__)
  113883. "sbcs r3, r5\n\t"
  113884. #else
  113885. "sbc r3, r5\n\t"
  113886. #endif
  113887. "stm %[a]!, {r2, r3}\n\t"
  113888. #ifdef WOLFSSL_KEIL
  113889. "sbcs %[a], %[a], %[a]\n\t"
  113890. #elif defined(__clang__)
  113891. "sbcs %[a], %[a]\n\t"
  113892. #else
  113893. "sbc %[a], %[a]\n\t"
  113894. #endif
  113895. : [a] "+l" (a), [b] "+l" (b)
  113896. :
  113897. : "memory", "r2", "r3", "r4", "r5"
  113898. );
  113899. return (uint32_t)(size_t)a;
  113900. }
  113901. #endif /* WOLFSSL_SP_SMALL */
  113902. /* Mul a by digit b into r. (r = a * b)
  113903. *
  113904. * r A single precision integer.
  113905. * a A single precision integer.
  113906. * b A single precision digit.
  113907. */
  113908. SP_NOINLINE static void sp_384_mul_d_12(sp_digit* r, const sp_digit* a,
  113909. sp_digit b)
  113910. {
  113911. __asm__ __volatile__ (
  113912. "movs r6, #48\n\t"
  113913. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113914. "adds r6, r6, %[a]\n\t"
  113915. #else
  113916. "add r6, r6, %[a]\n\t"
  113917. #endif
  113918. "mov r8, %[r]\n\t"
  113919. "mov r9, r6\n\t"
  113920. "movs r3, #0\n\t"
  113921. "movs r4, #0\n\t"
  113922. "\n"
  113923. "L_sp_384_mul_d_12_%=:\n\t"
  113924. "movs %[r], #0\n\t"
  113925. "movs r5, #0\n\t"
  113926. "# A[] * B\n\t"
  113927. "ldrh r6, [%[a]]\n\t"
  113928. "uxth r7, %[b]\n\t"
  113929. #ifdef WOLFSSL_KEIL
  113930. "muls r7, r6, r7\n\t"
  113931. #elif defined(__clang__)
  113932. "muls r7, r6\n\t"
  113933. #else
  113934. "mul r7, r6\n\t"
  113935. #endif
  113936. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113937. "adds r3, r3, r7\n\t"
  113938. #else
  113939. "add r3, r3, r7\n\t"
  113940. #endif
  113941. #ifdef WOLFSSL_KEIL
  113942. "adcs r4, r4, %[r]\n\t"
  113943. #elif defined(__clang__)
  113944. "adcs r4, %[r]\n\t"
  113945. #else
  113946. "adc r4, %[r]\n\t"
  113947. #endif
  113948. #ifdef WOLFSSL_KEIL
  113949. "adcs r5, r5, %[r]\n\t"
  113950. #elif defined(__clang__)
  113951. "adcs r5, %[r]\n\t"
  113952. #else
  113953. "adc r5, %[r]\n\t"
  113954. #endif
  113955. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113956. "lsrs r7, %[b], #16\n\t"
  113957. #else
  113958. "lsr r7, %[b], #16\n\t"
  113959. #endif
  113960. #ifdef WOLFSSL_KEIL
  113961. "muls r6, r7, r6\n\t"
  113962. #elif defined(__clang__)
  113963. "muls r6, r7\n\t"
  113964. #else
  113965. "mul r6, r7\n\t"
  113966. #endif
  113967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113968. "lsrs r7, r6, #16\n\t"
  113969. #else
  113970. "lsr r7, r6, #16\n\t"
  113971. #endif
  113972. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113973. "lsls r6, r6, #16\n\t"
  113974. #else
  113975. "lsl r6, r6, #16\n\t"
  113976. #endif
  113977. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113978. "adds r3, r3, r6\n\t"
  113979. #else
  113980. "add r3, r3, r6\n\t"
  113981. #endif
  113982. #ifdef WOLFSSL_KEIL
  113983. "adcs r4, r4, r7\n\t"
  113984. #elif defined(__clang__)
  113985. "adcs r4, r7\n\t"
  113986. #else
  113987. "adc r4, r7\n\t"
  113988. #endif
  113989. #ifdef WOLFSSL_KEIL
  113990. "adcs r5, r5, %[r]\n\t"
  113991. #elif defined(__clang__)
  113992. "adcs r5, %[r]\n\t"
  113993. #else
  113994. "adc r5, %[r]\n\t"
  113995. #endif
  113996. "ldr r6, [%[a]]\n\t"
  113997. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113998. "lsrs r6, r6, #16\n\t"
  113999. #else
  114000. "lsr r6, r6, #16\n\t"
  114001. #endif
  114002. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114003. "lsrs r7, %[b], #16\n\t"
  114004. #else
  114005. "lsr r7, %[b], #16\n\t"
  114006. #endif
  114007. #ifdef WOLFSSL_KEIL
  114008. "muls r7, r6, r7\n\t"
  114009. #elif defined(__clang__)
  114010. "muls r7, r6\n\t"
  114011. #else
  114012. "mul r7, r6\n\t"
  114013. #endif
  114014. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114015. "adds r4, r4, r7\n\t"
  114016. #else
  114017. "add r4, r4, r7\n\t"
  114018. #endif
  114019. #ifdef WOLFSSL_KEIL
  114020. "adcs r5, r5, %[r]\n\t"
  114021. #elif defined(__clang__)
  114022. "adcs r5, %[r]\n\t"
  114023. #else
  114024. "adc r5, %[r]\n\t"
  114025. #endif
  114026. "uxth r7, %[b]\n\t"
  114027. #ifdef WOLFSSL_KEIL
  114028. "muls r6, r7, r6\n\t"
  114029. #elif defined(__clang__)
  114030. "muls r6, r7\n\t"
  114031. #else
  114032. "mul r6, r7\n\t"
  114033. #endif
  114034. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114035. "lsrs r7, r6, #16\n\t"
  114036. #else
  114037. "lsr r7, r6, #16\n\t"
  114038. #endif
  114039. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114040. "lsls r6, r6, #16\n\t"
  114041. #else
  114042. "lsl r6, r6, #16\n\t"
  114043. #endif
  114044. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114045. "adds r3, r3, r6\n\t"
  114046. #else
  114047. "add r3, r3, r6\n\t"
  114048. #endif
  114049. #ifdef WOLFSSL_KEIL
  114050. "adcs r4, r4, r7\n\t"
  114051. #elif defined(__clang__)
  114052. "adcs r4, r7\n\t"
  114053. #else
  114054. "adc r4, r7\n\t"
  114055. #endif
  114056. #ifdef WOLFSSL_KEIL
  114057. "adcs r5, r5, %[r]\n\t"
  114058. #elif defined(__clang__)
  114059. "adcs r5, %[r]\n\t"
  114060. #else
  114061. "adc r5, %[r]\n\t"
  114062. #endif
  114063. "# A[] * B - Done\n\t"
  114064. "mov %[r], r8\n\t"
  114065. "str r3, [%[r]]\n\t"
  114066. "movs r3, r4\n\t"
  114067. "movs r4, r5\n\t"
  114068. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114069. "adds %[r], %[r], #4\n\t"
  114070. #else
  114071. "add %[r], %[r], #4\n\t"
  114072. #endif
  114073. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114074. "adds %[a], %[a], #4\n\t"
  114075. #else
  114076. "add %[a], %[a], #4\n\t"
  114077. #endif
  114078. "mov r8, %[r]\n\t"
  114079. "cmp %[a], r9\n\t"
  114080. "blt L_sp_384_mul_d_12_%=\n\t"
  114081. "str r3, [%[r]]\n\t"
  114082. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  114083. :
  114084. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  114085. );
  114086. }
  114087. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  114088. *
  114089. * d1 The high order half of the number to divide.
  114090. * d0 The low order half of the number to divide.
  114091. * div The divisor.
  114092. * returns the result of the division.
  114093. *
  114094. * Note that this is an approximate div. It may give an answer 1 larger.
  114095. */
  114096. SP_NOINLINE static sp_digit div_384_word_12(sp_digit d1, sp_digit d0,
  114097. sp_digit div)
  114098. {
  114099. __asm__ __volatile__ (
  114100. "movs r3, #0\n\t"
  114101. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114102. "lsrs r5, %[div], #1\n\t"
  114103. #else
  114104. "lsr r5, %[div], #1\n\t"
  114105. #endif
  114106. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114107. "adds r5, r5, #1\n\t"
  114108. #else
  114109. "add r5, r5, #1\n\t"
  114110. #endif
  114111. "mov r8, %[d0]\n\t"
  114112. "mov r9, %[d1]\n\t"
  114113. "# Do top 32\n\t"
  114114. "movs r6, r5\n\t"
  114115. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114116. "subs r6, r6, %[d1]\n\t"
  114117. #else
  114118. "sub r6, r6, %[d1]\n\t"
  114119. #endif
  114120. #ifdef WOLFSSL_KEIL
  114121. "sbcs r6, r6, r6\n\t"
  114122. #elif defined(__clang__)
  114123. "sbcs r6, r6\n\t"
  114124. #else
  114125. "sbc r6, r6\n\t"
  114126. #endif
  114127. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114128. "adds r3, r3, r3\n\t"
  114129. #else
  114130. "add r3, r3, r3\n\t"
  114131. #endif
  114132. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114133. "subs r3, r3, r6\n\t"
  114134. #else
  114135. "sub r3, r3, r6\n\t"
  114136. #endif
  114137. #ifdef WOLFSSL_KEIL
  114138. "ands r6, r6, r5\n\t"
  114139. #elif defined(__clang__)
  114140. "ands r6, r5\n\t"
  114141. #else
  114142. "and r6, r5\n\t"
  114143. #endif
  114144. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114145. "subs %[d1], %[d1], r6\n\t"
  114146. #else
  114147. "sub %[d1], %[d1], r6\n\t"
  114148. #endif
  114149. "movs r4, #29\n\t"
  114150. "\n"
  114151. "L_div_384_word_12_loop_%=:\n\t"
  114152. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114153. "lsls %[d0], %[d0], #1\n\t"
  114154. #else
  114155. "lsl %[d0], %[d0], #1\n\t"
  114156. #endif
  114157. #ifdef WOLFSSL_KEIL
  114158. "adcs %[d1], %[d1], %[d1]\n\t"
  114159. #elif defined(__clang__)
  114160. "adcs %[d1], %[d1]\n\t"
  114161. #else
  114162. "adc %[d1], %[d1]\n\t"
  114163. #endif
  114164. "movs r6, r5\n\t"
  114165. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114166. "subs r6, r6, %[d1]\n\t"
  114167. #else
  114168. "sub r6, r6, %[d1]\n\t"
  114169. #endif
  114170. #ifdef WOLFSSL_KEIL
  114171. "sbcs r6, r6, r6\n\t"
  114172. #elif defined(__clang__)
  114173. "sbcs r6, r6\n\t"
  114174. #else
  114175. "sbc r6, r6\n\t"
  114176. #endif
  114177. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114178. "adds r3, r3, r3\n\t"
  114179. #else
  114180. "add r3, r3, r3\n\t"
  114181. #endif
  114182. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114183. "subs r3, r3, r6\n\t"
  114184. #else
  114185. "sub r3, r3, r6\n\t"
  114186. #endif
  114187. #ifdef WOLFSSL_KEIL
  114188. "ands r6, r6, r5\n\t"
  114189. #elif defined(__clang__)
  114190. "ands r6, r5\n\t"
  114191. #else
  114192. "and r6, r5\n\t"
  114193. #endif
  114194. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114195. "subs %[d1], %[d1], r6\n\t"
  114196. #else
  114197. "sub %[d1], %[d1], r6\n\t"
  114198. #endif
  114199. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114200. "subs r4, r4, #1\n\t"
  114201. #else
  114202. "sub r4, r4, #1\n\t"
  114203. #endif
  114204. "bpl L_div_384_word_12_loop_%=\n\t"
  114205. "movs r7, #0\n\t"
  114206. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114207. "adds r3, r3, r3\n\t"
  114208. #else
  114209. "add r3, r3, r3\n\t"
  114210. #endif
  114211. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114212. "adds r3, r3, #1\n\t"
  114213. #else
  114214. "add r3, r3, #1\n\t"
  114215. #endif
  114216. "# r * div - Start\n\t"
  114217. "uxth %[d1], r3\n\t"
  114218. "uxth r4, %[div]\n\t"
  114219. #ifdef WOLFSSL_KEIL
  114220. "muls r4, %[d1], r4\n\t"
  114221. #elif defined(__clang__)
  114222. "muls r4, %[d1]\n\t"
  114223. #else
  114224. "mul r4, %[d1]\n\t"
  114225. #endif
  114226. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114227. "lsrs r6, %[div], #16\n\t"
  114228. #else
  114229. "lsr r6, %[div], #16\n\t"
  114230. #endif
  114231. #ifdef WOLFSSL_KEIL
  114232. "muls %[d1], r6, %[d1]\n\t"
  114233. #elif defined(__clang__)
  114234. "muls %[d1], r6\n\t"
  114235. #else
  114236. "mul %[d1], r6\n\t"
  114237. #endif
  114238. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114239. "lsrs r5, %[d1], #16\n\t"
  114240. #else
  114241. "lsr r5, %[d1], #16\n\t"
  114242. #endif
  114243. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114244. "lsls %[d1], %[d1], #16\n\t"
  114245. #else
  114246. "lsl %[d1], %[d1], #16\n\t"
  114247. #endif
  114248. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114249. "adds r4, r4, %[d1]\n\t"
  114250. #else
  114251. "add r4, r4, %[d1]\n\t"
  114252. #endif
  114253. #ifdef WOLFSSL_KEIL
  114254. "adcs r5, r5, r7\n\t"
  114255. #elif defined(__clang__)
  114256. "adcs r5, r7\n\t"
  114257. #else
  114258. "adc r5, r7\n\t"
  114259. #endif
  114260. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114261. "lsrs %[d1], r3, #16\n\t"
  114262. #else
  114263. "lsr %[d1], r3, #16\n\t"
  114264. #endif
  114265. #ifdef WOLFSSL_KEIL
  114266. "muls r6, %[d1], r6\n\t"
  114267. #elif defined(__clang__)
  114268. "muls r6, %[d1]\n\t"
  114269. #else
  114270. "mul r6, %[d1]\n\t"
  114271. #endif
  114272. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114273. "adds r5, r5, r6\n\t"
  114274. #else
  114275. "add r5, r5, r6\n\t"
  114276. #endif
  114277. "uxth r6, %[div]\n\t"
  114278. #ifdef WOLFSSL_KEIL
  114279. "muls %[d1], r6, %[d1]\n\t"
  114280. #elif defined(__clang__)
  114281. "muls %[d1], r6\n\t"
  114282. #else
  114283. "mul %[d1], r6\n\t"
  114284. #endif
  114285. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114286. "lsrs r6, %[d1], #16\n\t"
  114287. #else
  114288. "lsr r6, %[d1], #16\n\t"
  114289. #endif
  114290. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114291. "lsls %[d1], %[d1], #16\n\t"
  114292. #else
  114293. "lsl %[d1], %[d1], #16\n\t"
  114294. #endif
  114295. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114296. "adds r4, r4, %[d1]\n\t"
  114297. #else
  114298. "add r4, r4, %[d1]\n\t"
  114299. #endif
  114300. #ifdef WOLFSSL_KEIL
  114301. "adcs r5, r5, r6\n\t"
  114302. #elif defined(__clang__)
  114303. "adcs r5, r6\n\t"
  114304. #else
  114305. "adc r5, r6\n\t"
  114306. #endif
  114307. "# r * div - Done\n\t"
  114308. "mov %[d1], r8\n\t"
  114309. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114310. "subs %[d1], %[d1], r4\n\t"
  114311. #else
  114312. "sub %[d1], %[d1], r4\n\t"
  114313. #endif
  114314. "movs r4, %[d1]\n\t"
  114315. "mov %[d1], r9\n\t"
  114316. #ifdef WOLFSSL_KEIL
  114317. "sbcs %[d1], %[d1], r5\n\t"
  114318. #elif defined(__clang__)
  114319. "sbcs %[d1], r5\n\t"
  114320. #else
  114321. "sbc %[d1], r5\n\t"
  114322. #endif
  114323. "movs r5, %[d1]\n\t"
  114324. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114325. "adds r3, r3, r5\n\t"
  114326. #else
  114327. "add r3, r3, r5\n\t"
  114328. #endif
  114329. "# r * div - Start\n\t"
  114330. "uxth %[d1], r3\n\t"
  114331. "uxth r4, %[div]\n\t"
  114332. #ifdef WOLFSSL_KEIL
  114333. "muls r4, %[d1], r4\n\t"
  114334. #elif defined(__clang__)
  114335. "muls r4, %[d1]\n\t"
  114336. #else
  114337. "mul r4, %[d1]\n\t"
  114338. #endif
  114339. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114340. "lsrs r6, %[div], #16\n\t"
  114341. #else
  114342. "lsr r6, %[div], #16\n\t"
  114343. #endif
  114344. #ifdef WOLFSSL_KEIL
  114345. "muls %[d1], r6, %[d1]\n\t"
  114346. #elif defined(__clang__)
  114347. "muls %[d1], r6\n\t"
  114348. #else
  114349. "mul %[d1], r6\n\t"
  114350. #endif
  114351. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114352. "lsrs r5, %[d1], #16\n\t"
  114353. #else
  114354. "lsr r5, %[d1], #16\n\t"
  114355. #endif
  114356. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114357. "lsls %[d1], %[d1], #16\n\t"
  114358. #else
  114359. "lsl %[d1], %[d1], #16\n\t"
  114360. #endif
  114361. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114362. "adds r4, r4, %[d1]\n\t"
  114363. #else
  114364. "add r4, r4, %[d1]\n\t"
  114365. #endif
  114366. #ifdef WOLFSSL_KEIL
  114367. "adcs r5, r5, r7\n\t"
  114368. #elif defined(__clang__)
  114369. "adcs r5, r7\n\t"
  114370. #else
  114371. "adc r5, r7\n\t"
  114372. #endif
  114373. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114374. "lsrs %[d1], r3, #16\n\t"
  114375. #else
  114376. "lsr %[d1], r3, #16\n\t"
  114377. #endif
  114378. #ifdef WOLFSSL_KEIL
  114379. "muls r6, %[d1], r6\n\t"
  114380. #elif defined(__clang__)
  114381. "muls r6, %[d1]\n\t"
  114382. #else
  114383. "mul r6, %[d1]\n\t"
  114384. #endif
  114385. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114386. "adds r5, r5, r6\n\t"
  114387. #else
  114388. "add r5, r5, r6\n\t"
  114389. #endif
  114390. "uxth r6, %[div]\n\t"
  114391. #ifdef WOLFSSL_KEIL
  114392. "muls %[d1], r6, %[d1]\n\t"
  114393. #elif defined(__clang__)
  114394. "muls %[d1], r6\n\t"
  114395. #else
  114396. "mul %[d1], r6\n\t"
  114397. #endif
  114398. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114399. "lsrs r6, %[d1], #16\n\t"
  114400. #else
  114401. "lsr r6, %[d1], #16\n\t"
  114402. #endif
  114403. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114404. "lsls %[d1], %[d1], #16\n\t"
  114405. #else
  114406. "lsl %[d1], %[d1], #16\n\t"
  114407. #endif
  114408. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114409. "adds r4, r4, %[d1]\n\t"
  114410. #else
  114411. "add r4, r4, %[d1]\n\t"
  114412. #endif
  114413. #ifdef WOLFSSL_KEIL
  114414. "adcs r5, r5, r6\n\t"
  114415. #elif defined(__clang__)
  114416. "adcs r5, r6\n\t"
  114417. #else
  114418. "adc r5, r6\n\t"
  114419. #endif
  114420. "# r * div - Done\n\t"
  114421. "mov %[d1], r8\n\t"
  114422. "mov r6, r9\n\t"
  114423. #ifdef WOLFSSL_KEIL
  114424. "subs r4, %[d1], r4\n\t"
  114425. #else
  114426. #ifdef __clang__
  114427. "subs r4, %[d1], r4\n\t"
  114428. #else
  114429. "sub r4, %[d1], r4\n\t"
  114430. #endif
  114431. #endif
  114432. #ifdef WOLFSSL_KEIL
  114433. "sbcs r6, r6, r5\n\t"
  114434. #elif defined(__clang__)
  114435. "sbcs r6, r5\n\t"
  114436. #else
  114437. "sbc r6, r5\n\t"
  114438. #endif
  114439. "movs r5, r6\n\t"
  114440. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114441. "adds r3, r3, r5\n\t"
  114442. #else
  114443. "add r3, r3, r5\n\t"
  114444. #endif
  114445. "# r * div - Start\n\t"
  114446. "uxth %[d1], r3\n\t"
  114447. "uxth r4, %[div]\n\t"
  114448. #ifdef WOLFSSL_KEIL
  114449. "muls r4, %[d1], r4\n\t"
  114450. #elif defined(__clang__)
  114451. "muls r4, %[d1]\n\t"
  114452. #else
  114453. "mul r4, %[d1]\n\t"
  114454. #endif
  114455. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114456. "lsrs r6, %[div], #16\n\t"
  114457. #else
  114458. "lsr r6, %[div], #16\n\t"
  114459. #endif
  114460. #ifdef WOLFSSL_KEIL
  114461. "muls %[d1], r6, %[d1]\n\t"
  114462. #elif defined(__clang__)
  114463. "muls %[d1], r6\n\t"
  114464. #else
  114465. "mul %[d1], r6\n\t"
  114466. #endif
  114467. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114468. "lsrs r5, %[d1], #16\n\t"
  114469. #else
  114470. "lsr r5, %[d1], #16\n\t"
  114471. #endif
  114472. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114473. "lsls %[d1], %[d1], #16\n\t"
  114474. #else
  114475. "lsl %[d1], %[d1], #16\n\t"
  114476. #endif
  114477. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114478. "adds r4, r4, %[d1]\n\t"
  114479. #else
  114480. "add r4, r4, %[d1]\n\t"
  114481. #endif
  114482. #ifdef WOLFSSL_KEIL
  114483. "adcs r5, r5, r7\n\t"
  114484. #elif defined(__clang__)
  114485. "adcs r5, r7\n\t"
  114486. #else
  114487. "adc r5, r7\n\t"
  114488. #endif
  114489. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114490. "lsrs %[d1], r3, #16\n\t"
  114491. #else
  114492. "lsr %[d1], r3, #16\n\t"
  114493. #endif
  114494. #ifdef WOLFSSL_KEIL
  114495. "muls r6, %[d1], r6\n\t"
  114496. #elif defined(__clang__)
  114497. "muls r6, %[d1]\n\t"
  114498. #else
  114499. "mul r6, %[d1]\n\t"
  114500. #endif
  114501. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114502. "adds r5, r5, r6\n\t"
  114503. #else
  114504. "add r5, r5, r6\n\t"
  114505. #endif
  114506. "uxth r6, %[div]\n\t"
  114507. #ifdef WOLFSSL_KEIL
  114508. "muls %[d1], r6, %[d1]\n\t"
  114509. #elif defined(__clang__)
  114510. "muls %[d1], r6\n\t"
  114511. #else
  114512. "mul %[d1], r6\n\t"
  114513. #endif
  114514. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114515. "lsrs r6, %[d1], #16\n\t"
  114516. #else
  114517. "lsr r6, %[d1], #16\n\t"
  114518. #endif
  114519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114520. "lsls %[d1], %[d1], #16\n\t"
  114521. #else
  114522. "lsl %[d1], %[d1], #16\n\t"
  114523. #endif
  114524. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114525. "adds r4, r4, %[d1]\n\t"
  114526. #else
  114527. "add r4, r4, %[d1]\n\t"
  114528. #endif
  114529. #ifdef WOLFSSL_KEIL
  114530. "adcs r5, r5, r6\n\t"
  114531. #elif defined(__clang__)
  114532. "adcs r5, r6\n\t"
  114533. #else
  114534. "adc r5, r6\n\t"
  114535. #endif
  114536. "# r * div - Done\n\t"
  114537. "mov %[d1], r8\n\t"
  114538. "mov r6, r9\n\t"
  114539. #ifdef WOLFSSL_KEIL
  114540. "subs r4, %[d1], r4\n\t"
  114541. #else
  114542. #ifdef __clang__
  114543. "subs r4, %[d1], r4\n\t"
  114544. #else
  114545. "sub r4, %[d1], r4\n\t"
  114546. #endif
  114547. #endif
  114548. #ifdef WOLFSSL_KEIL
  114549. "sbcs r6, r6, r5\n\t"
  114550. #elif defined(__clang__)
  114551. "sbcs r6, r5\n\t"
  114552. #else
  114553. "sbc r6, r5\n\t"
  114554. #endif
  114555. "movs r5, r6\n\t"
  114556. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114557. "adds r3, r3, r5\n\t"
  114558. #else
  114559. "add r3, r3, r5\n\t"
  114560. #endif
  114561. "# r * div - Start\n\t"
  114562. "uxth %[d1], r3\n\t"
  114563. "uxth r4, %[div]\n\t"
  114564. #ifdef WOLFSSL_KEIL
  114565. "muls r4, %[d1], r4\n\t"
  114566. #elif defined(__clang__)
  114567. "muls r4, %[d1]\n\t"
  114568. #else
  114569. "mul r4, %[d1]\n\t"
  114570. #endif
  114571. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114572. "lsrs r6, %[div], #16\n\t"
  114573. #else
  114574. "lsr r6, %[div], #16\n\t"
  114575. #endif
  114576. #ifdef WOLFSSL_KEIL
  114577. "muls %[d1], r6, %[d1]\n\t"
  114578. #elif defined(__clang__)
  114579. "muls %[d1], r6\n\t"
  114580. #else
  114581. "mul %[d1], r6\n\t"
  114582. #endif
  114583. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114584. "lsrs r5, %[d1], #16\n\t"
  114585. #else
  114586. "lsr r5, %[d1], #16\n\t"
  114587. #endif
  114588. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114589. "lsls %[d1], %[d1], #16\n\t"
  114590. #else
  114591. "lsl %[d1], %[d1], #16\n\t"
  114592. #endif
  114593. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114594. "adds r4, r4, %[d1]\n\t"
  114595. #else
  114596. "add r4, r4, %[d1]\n\t"
  114597. #endif
  114598. #ifdef WOLFSSL_KEIL
  114599. "adcs r5, r5, r7\n\t"
  114600. #elif defined(__clang__)
  114601. "adcs r5, r7\n\t"
  114602. #else
  114603. "adc r5, r7\n\t"
  114604. #endif
  114605. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114606. "lsrs %[d1], r3, #16\n\t"
  114607. #else
  114608. "lsr %[d1], r3, #16\n\t"
  114609. #endif
  114610. #ifdef WOLFSSL_KEIL
  114611. "muls r6, %[d1], r6\n\t"
  114612. #elif defined(__clang__)
  114613. "muls r6, %[d1]\n\t"
  114614. #else
  114615. "mul r6, %[d1]\n\t"
  114616. #endif
  114617. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114618. "adds r5, r5, r6\n\t"
  114619. #else
  114620. "add r5, r5, r6\n\t"
  114621. #endif
  114622. "uxth r6, %[div]\n\t"
  114623. #ifdef WOLFSSL_KEIL
  114624. "muls %[d1], r6, %[d1]\n\t"
  114625. #elif defined(__clang__)
  114626. "muls %[d1], r6\n\t"
  114627. #else
  114628. "mul %[d1], r6\n\t"
  114629. #endif
  114630. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114631. "lsrs r6, %[d1], #16\n\t"
  114632. #else
  114633. "lsr r6, %[d1], #16\n\t"
  114634. #endif
  114635. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114636. "lsls %[d1], %[d1], #16\n\t"
  114637. #else
  114638. "lsl %[d1], %[d1], #16\n\t"
  114639. #endif
  114640. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114641. "adds r4, r4, %[d1]\n\t"
  114642. #else
  114643. "add r4, r4, %[d1]\n\t"
  114644. #endif
  114645. #ifdef WOLFSSL_KEIL
  114646. "adcs r5, r5, r6\n\t"
  114647. #elif defined(__clang__)
  114648. "adcs r5, r6\n\t"
  114649. #else
  114650. "adc r5, r6\n\t"
  114651. #endif
  114652. "# r * div - Done\n\t"
  114653. "mov %[d1], r8\n\t"
  114654. "mov r6, r9\n\t"
  114655. #ifdef WOLFSSL_KEIL
  114656. "subs r4, %[d1], r4\n\t"
  114657. #else
  114658. #ifdef __clang__
  114659. "subs r4, %[d1], r4\n\t"
  114660. #else
  114661. "sub r4, %[d1], r4\n\t"
  114662. #endif
  114663. #endif
  114664. #ifdef WOLFSSL_KEIL
  114665. "sbcs r6, r6, r5\n\t"
  114666. #elif defined(__clang__)
  114667. "sbcs r6, r5\n\t"
  114668. #else
  114669. "sbc r6, r5\n\t"
  114670. #endif
  114671. "movs r5, r6\n\t"
  114672. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114673. "adds r3, r3, r5\n\t"
  114674. #else
  114675. "add r3, r3, r5\n\t"
  114676. #endif
  114677. "movs r6, %[div]\n\t"
  114678. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114679. "subs r6, r6, r4\n\t"
  114680. #else
  114681. "sub r6, r6, r4\n\t"
  114682. #endif
  114683. #ifdef WOLFSSL_KEIL
  114684. "sbcs r6, r6, r6\n\t"
  114685. #elif defined(__clang__)
  114686. "sbcs r6, r6\n\t"
  114687. #else
  114688. "sbc r6, r6\n\t"
  114689. #endif
  114690. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114691. "subs r3, r3, r6\n\t"
  114692. #else
  114693. "sub r3, r3, r6\n\t"
  114694. #endif
  114695. "movs %[d1], r3\n\t"
  114696. : [d1] "+l" (d1), [d0] "+l" (d0), [div] "+l" (div)
  114697. :
  114698. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  114699. );
  114700. return (uint32_t)(size_t)d1;
  114701. }
  114702. /* AND m into each word of a and store in r.
  114703. *
  114704. * r A single precision integer.
  114705. * a A single precision integer.
  114706. * m Mask to AND against each digit.
  114707. */
  114708. static void sp_384_mask_12(sp_digit* r, const sp_digit* a, sp_digit m)
  114709. {
  114710. #ifdef WOLFSSL_SP_SMALL
  114711. int i;
  114712. for (i=0; i<12; i++) {
  114713. r[i] = a[i] & m;
  114714. }
  114715. #else
  114716. r[0] = a[0] & m;
  114717. r[1] = a[1] & m;
  114718. r[2] = a[2] & m;
  114719. r[3] = a[3] & m;
  114720. r[4] = a[4] & m;
  114721. r[5] = a[5] & m;
  114722. r[6] = a[6] & m;
  114723. r[7] = a[7] & m;
  114724. r[8] = a[8] & m;
  114725. r[9] = a[9] & m;
  114726. r[10] = a[10] & m;
  114727. r[11] = a[11] & m;
  114728. #endif
  114729. }
  114730. /* Divide d in a and put remainder into r (m*d + r = a)
  114731. * m is not calculated as it is not needed at this time.
  114732. *
  114733. * a Number to be divided.
  114734. * d Number to divide with.
  114735. * m Multiplier result.
  114736. * r Remainder from the division.
  114737. * returns MP_OKAY indicating success.
  114738. */
  114739. static WC_INLINE int sp_384_div_12(const sp_digit* a, const sp_digit* d, sp_digit* m,
  114740. sp_digit* r)
  114741. {
  114742. sp_digit t1[24], t2[13];
  114743. sp_digit div, r1;
  114744. int i;
  114745. (void)m;
  114746. div = d[11];
  114747. XMEMCPY(t1, a, sizeof(*t1) * 2 * 12);
  114748. r1 = sp_384_cmp_12(&t1[12], d) >= 0;
  114749. sp_384_cond_sub_12(&t1[12], &t1[12], d, (sp_digit)0 - r1);
  114750. for (i = 11; i >= 0; i--) {
  114751. volatile sp_digit mask = (sp_digit)0 - (t1[12 + i] == div);
  114752. sp_digit hi = t1[12 + i] + mask;
  114753. r1 = div_384_word_12(hi, t1[12 + i - 1], div);
  114754. r1 |= mask;
  114755. sp_384_mul_d_12(t2, d, r1);
  114756. t1[12 + i] += sp_384_sub_in_place_12(&t1[i], t2);
  114757. t1[12 + i] -= t2[12];
  114758. sp_384_mask_12(t2, d, t1[12 + i]);
  114759. t1[12 + i] += sp_384_add_12(&t1[i], &t1[i], t2);
  114760. sp_384_mask_12(t2, d, t1[12 + i]);
  114761. t1[12 + i] += sp_384_add_12(&t1[i], &t1[i], t2);
  114762. }
  114763. r1 = sp_384_cmp_12(t1, d) >= 0;
  114764. sp_384_cond_sub_12(r, t1, d, (sp_digit)0 - r1);
  114765. return MP_OKAY;
  114766. }
  114767. /* Reduce a modulo m into r. (r = a mod m)
  114768. *
  114769. * r A single precision number that is the reduced result.
  114770. * a A single precision number that is to be reduced.
  114771. * m A single precision number that is the modulus to reduce with.
  114772. * returns MP_OKAY indicating success.
  114773. */
  114774. static WC_INLINE int sp_384_mod_12(sp_digit* r, const sp_digit* a, const sp_digit* m)
  114775. {
  114776. int ret;
  114777. ret = sp_384_div_12(a, m, NULL, r);
  114778. return ret;
  114779. }
  114780. #endif
  114781. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  114782. /* Multiply two number mod the order of P384 curve. (r = a * b mod order)
  114783. *
  114784. * r Result of the multiplication.
  114785. * a First operand of the multiplication.
  114786. * b Second operand of the multiplication.
  114787. */
  114788. static void sp_384_mont_mul_order_12(sp_digit* r, const sp_digit* a, const sp_digit* b)
  114789. {
  114790. sp_384_mul_12(r, a, b);
  114791. sp_384_mont_reduce_order_12(r, p384_order, p384_mp_order);
  114792. }
  114793. #if defined(HAVE_ECC_SIGN) || (defined(HAVE_ECC_VERIFY) && defined(WOLFSSL_SP_SMALL))
  114794. #ifdef WOLFSSL_SP_SMALL
  114795. /* Order-2 for the P384 curve. */
  114796. static const uint32_t p384_order_minus_2[12] = {
  114797. 0xccc52971U,0xecec196aU,0x48b0a77aU,0x581a0db2U,0xf4372ddfU,0xc7634d81U,
  114798. 0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU
  114799. };
  114800. #else
  114801. /* The low half of the order-2 of the P384 curve. */
  114802. static const uint32_t p384_order_low[6] = {
  114803. 0xccc52971U,0xecec196aU,0x48b0a77aU,0x581a0db2U,0xf4372ddfU,0xc7634d81U
  114804. };
  114805. #endif /* WOLFSSL_SP_SMALL */
  114806. /* Square number mod the order of P384 curve. (r = a * a mod order)
  114807. *
  114808. * r Result of the squaring.
  114809. * a Number to square.
  114810. */
  114811. static void sp_384_mont_sqr_order_12(sp_digit* r, const sp_digit* a)
  114812. {
  114813. sp_384_sqr_12(r, a);
  114814. sp_384_mont_reduce_order_12(r, p384_order, p384_mp_order);
  114815. }
  114816. #ifndef WOLFSSL_SP_SMALL
  114817. /* Square number mod the order of P384 curve a number of times.
  114818. * (r = a ^ n mod order)
  114819. *
  114820. * r Result of the squaring.
  114821. * a Number to square.
  114822. */
  114823. static void sp_384_mont_sqr_n_order_12(sp_digit* r, const sp_digit* a, int n)
  114824. {
  114825. int i;
  114826. sp_384_mont_sqr_order_12(r, a);
  114827. for (i=1; i<n; i++) {
  114828. sp_384_mont_sqr_order_12(r, r);
  114829. }
  114830. }
  114831. #endif /* !WOLFSSL_SP_SMALL */
  114832. /* Invert the number, in Montgomery form, modulo the order of the P384 curve.
  114833. * (r = 1 / a mod order)
  114834. *
  114835. * r Inverse result.
  114836. * a Number to invert.
  114837. * td Temporary data.
  114838. */
  114839. #ifdef WOLFSSL_SP_NONBLOCK
  114840. typedef struct sp_384_mont_inv_order_12_ctx {
  114841. int state;
  114842. int i;
  114843. } sp_384_mont_inv_order_12_ctx;
  114844. static int sp_384_mont_inv_order_12_nb(sp_ecc_ctx_t* sp_ctx, sp_digit* r, const sp_digit* a,
  114845. sp_digit* t)
  114846. {
  114847. int err = FP_WOULDBLOCK;
  114848. sp_384_mont_inv_order_12_ctx* ctx = (sp_384_mont_inv_order_12_ctx*)sp_ctx;
  114849. typedef char ctx_size_test[sizeof(sp_384_mont_inv_order_12_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  114850. (void)sizeof(ctx_size_test);
  114851. switch (ctx->state) {
  114852. case 0:
  114853. XMEMCPY(t, a, sizeof(sp_digit) * 12);
  114854. ctx->i = 382;
  114855. ctx->state = 1;
  114856. break;
  114857. case 1:
  114858. sp_384_mont_sqr_order_12(t, t);
  114859. ctx->state = 2;
  114860. break;
  114861. case 2:
  114862. if ((p384_order_minus_2[ctx->i / 32] & ((sp_int_digit)1 << (ctx->i % 32))) != 0) {
  114863. sp_384_mont_mul_order_12(t, t, a);
  114864. }
  114865. ctx->i--;
  114866. ctx->state = (ctx->i == 0) ? 3 : 1;
  114867. break;
  114868. case 3:
  114869. XMEMCPY(r, t, sizeof(sp_digit) * 12U);
  114870. err = MP_OKAY;
  114871. break;
  114872. }
  114873. return err;
  114874. }
  114875. #endif /* WOLFSSL_SP_NONBLOCK */
  114876. static void sp_384_mont_inv_order_12(sp_digit* r, const sp_digit* a,
  114877. sp_digit* td)
  114878. {
  114879. #ifdef WOLFSSL_SP_SMALL
  114880. sp_digit* t = td;
  114881. int i;
  114882. XMEMCPY(t, a, sizeof(sp_digit) * 12);
  114883. for (i=382; i>=0; i--) {
  114884. sp_384_mont_sqr_order_12(t, t);
  114885. if ((p384_order_minus_2[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
  114886. sp_384_mont_mul_order_12(t, t, a);
  114887. }
  114888. }
  114889. XMEMCPY(r, t, sizeof(sp_digit) * 12U);
  114890. #else
  114891. sp_digit* t = td;
  114892. sp_digit* t2 = td + 2 * 12;
  114893. sp_digit* t3 = td + 4 * 12;
  114894. int i;
  114895. /* t = a^2 */
  114896. sp_384_mont_sqr_order_12(t, a);
  114897. /* t = a^3 = t * a */
  114898. sp_384_mont_mul_order_12(t, t, a);
  114899. /* t2= a^c = t ^ 2 ^ 2 */
  114900. sp_384_mont_sqr_n_order_12(t2, t, 2);
  114901. /* t = a^f = t2 * t */
  114902. sp_384_mont_mul_order_12(t, t2, t);
  114903. /* t2= a^f0 = t ^ 2 ^ 4 */
  114904. sp_384_mont_sqr_n_order_12(t2, t, 4);
  114905. /* t = a^ff = t2 * t */
  114906. sp_384_mont_mul_order_12(t, t2, t);
  114907. /* t2= a^ff00 = t ^ 2 ^ 8 */
  114908. sp_384_mont_sqr_n_order_12(t2, t, 8);
  114909. /* t3= a^ffff = t2 * t */
  114910. sp_384_mont_mul_order_12(t3, t2, t);
  114911. /* t2= a^ffff0000 = t3 ^ 2 ^ 16 */
  114912. sp_384_mont_sqr_n_order_12(t2, t3, 16);
  114913. /* t = a^ffffffff = t2 * t3 */
  114914. sp_384_mont_mul_order_12(t, t2, t3);
  114915. /* t2= a^ffffffff0000 = t ^ 2 ^ 16 */
  114916. sp_384_mont_sqr_n_order_12(t2, t, 16);
  114917. /* t = a^ffffffffffff = t2 * t3 */
  114918. sp_384_mont_mul_order_12(t, t2, t3);
  114919. /* t2= a^ffffffffffff000000000000 = t ^ 2 ^ 48 */
  114920. sp_384_mont_sqr_n_order_12(t2, t, 48);
  114921. /* t= a^fffffffffffffffffffffffff = t2 * t */
  114922. sp_384_mont_mul_order_12(t, t2, t);
  114923. /* t2= a^ffffffffffffffffffffffff000000000000000000000000 */
  114924. sp_384_mont_sqr_n_order_12(t2, t, 96);
  114925. /* t2= a^ffffffffffffffffffffffffffffffffffffffffffffffff = t2 * t */
  114926. sp_384_mont_mul_order_12(t2, t2, t);
  114927. for (i=191; i>=1; i--) {
  114928. sp_384_mont_sqr_order_12(t2, t2);
  114929. if ((p384_order_low[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
  114930. sp_384_mont_mul_order_12(t2, t2, a);
  114931. }
  114932. }
  114933. sp_384_mont_sqr_order_12(t2, t2);
  114934. sp_384_mont_mul_order_12(r, t2, a);
  114935. #endif /* WOLFSSL_SP_SMALL */
  114936. }
  114937. #endif /* HAVE_ECC_SIGN || (HAVE_ECC_VERIFY && WOLFSSL_SP_SMALL) */
  114938. #endif /* HAVE_ECC_SIGN | HAVE_ECC_VERIFY */
  114939. #ifdef HAVE_ECC_SIGN
  114940. #ifndef SP_ECC_MAX_SIG_GEN
  114941. #define SP_ECC_MAX_SIG_GEN 64
  114942. #endif
  114943. /* Calculate second signature value S from R, k and private value.
  114944. *
  114945. * s = (r * x + e) / k
  114946. *
  114947. * s Signature value.
  114948. * r First signature value.
  114949. * k Ephemeral private key.
  114950. * x Private key as a number.
  114951. * e Hash of message as a number.
  114952. * tmp Temporary storage for intermediate numbers.
  114953. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  114954. */
  114955. static int sp_384_calc_s_12(sp_digit* s, const sp_digit* r, sp_digit* k,
  114956. sp_digit* x, const sp_digit* e, sp_digit* tmp)
  114957. {
  114958. int err;
  114959. sp_digit carry;
  114960. sp_int32 c;
  114961. sp_digit* kInv = k;
  114962. /* Conv k to Montgomery form (mod order) */
  114963. sp_384_mul_12(k, k, p384_norm_order);
  114964. err = sp_384_mod_12(k, k, p384_order);
  114965. if (err == MP_OKAY) {
  114966. sp_384_norm_12(k);
  114967. /* kInv = 1/k mod order */
  114968. sp_384_mont_inv_order_12(kInv, k, tmp);
  114969. sp_384_norm_12(kInv);
  114970. /* s = r * x + e */
  114971. sp_384_mul_12(x, x, r);
  114972. err = sp_384_mod_12(x, x, p384_order);
  114973. }
  114974. if (err == MP_OKAY) {
  114975. sp_384_norm_12(x);
  114976. carry = sp_384_add_12(s, e, x);
  114977. sp_384_cond_sub_12(s, s, p384_order, 0 - carry);
  114978. sp_384_norm_12(s);
  114979. c = sp_384_cmp_12(s, p384_order);
  114980. sp_384_cond_sub_12(s, s, p384_order,
  114981. (sp_digit)0 - (sp_digit)(c >= 0));
  114982. sp_384_norm_12(s);
  114983. /* s = s * k^-1 mod order */
  114984. sp_384_mont_mul_order_12(s, s, kInv);
  114985. sp_384_norm_12(s);
  114986. }
  114987. return err;
  114988. }
  114989. /* Sign the hash using the private key.
  114990. * e = [hash, 384 bits] from binary
  114991. * r = (k.G)->x mod order
  114992. * s = (r * x + e) / k mod order
  114993. * The hash is truncated to the first 384 bits.
  114994. *
  114995. * hash Hash to sign.
  114996. * hashLen Length of the hash data.
  114997. * rng Random number generator.
  114998. * priv Private part of key - scalar.
  114999. * rm First part of result as an mp_int.
  115000. * sm Sirst part of result as an mp_int.
  115001. * heap Heap to use for allocation.
  115002. * returns RNG failures, MEMORY_E when memory allocation fails and
  115003. * MP_OKAY on success.
  115004. */
  115005. int sp_ecc_sign_384(const byte* hash, word32 hashLen, WC_RNG* rng,
  115006. const mp_int* priv, mp_int* rm, mp_int* sm, mp_int* km, void* heap)
  115007. {
  115008. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  115009. sp_digit* e = NULL;
  115010. sp_point_384* point = NULL;
  115011. #else
  115012. sp_digit e[7 * 2 * 12];
  115013. sp_point_384 point[1];
  115014. #endif
  115015. sp_digit* x = NULL;
  115016. sp_digit* k = NULL;
  115017. sp_digit* r = NULL;
  115018. sp_digit* tmp = NULL;
  115019. sp_digit* s = NULL;
  115020. sp_int32 c;
  115021. int err = MP_OKAY;
  115022. int i;
  115023. (void)heap;
  115024. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  115025. if (err == MP_OKAY) {
  115026. point = (sp_point_384*)XMALLOC(sizeof(sp_point_384), heap,
  115027. DYNAMIC_TYPE_ECC);
  115028. if (point == NULL)
  115029. err = MEMORY_E;
  115030. }
  115031. if (err == MP_OKAY) {
  115032. e = (sp_digit*)XMALLOC(sizeof(sp_digit) * 7 * 2 * 12, heap,
  115033. DYNAMIC_TYPE_ECC);
  115034. if (e == NULL)
  115035. err = MEMORY_E;
  115036. }
  115037. #endif
  115038. if (err == MP_OKAY) {
  115039. x = e + 2 * 12;
  115040. k = e + 4 * 12;
  115041. r = e + 6 * 12;
  115042. tmp = e + 8 * 12;
  115043. s = e;
  115044. if (hashLen > 48U) {
  115045. hashLen = 48U;
  115046. }
  115047. }
  115048. for (i = SP_ECC_MAX_SIG_GEN; err == MP_OKAY && i > 0; i--) {
  115049. /* New random point. */
  115050. if (km == NULL || mp_iszero(km)) {
  115051. err = sp_384_ecc_gen_k_12(rng, k);
  115052. }
  115053. else {
  115054. sp_384_from_mp(k, 12, km);
  115055. mp_zero(km);
  115056. }
  115057. if (err == MP_OKAY) {
  115058. err = sp_384_ecc_mulmod_base_12(point, k, 1, 1, heap);
  115059. }
  115060. if (err == MP_OKAY) {
  115061. /* r = point->x mod order */
  115062. XMEMCPY(r, point->x, sizeof(sp_digit) * 12U);
  115063. sp_384_norm_12(r);
  115064. c = sp_384_cmp_12(r, p384_order);
  115065. sp_384_cond_sub_12(r, r, p384_order,
  115066. (sp_digit)0 - (sp_digit)(c >= 0));
  115067. sp_384_norm_12(r);
  115068. sp_384_from_mp(x, 12, priv);
  115069. sp_384_from_bin(e, 12, hash, (int)hashLen);
  115070. err = sp_384_calc_s_12(s, r, k, x, e, tmp);
  115071. }
  115072. /* Check that signature is usable. */
  115073. if ((err == MP_OKAY) && (sp_384_iszero_12(s) == 0)) {
  115074. break;
  115075. }
  115076. #ifdef WOLFSSL_ECDSA_SET_K_ONE_LOOP
  115077. i = 1;
  115078. #endif
  115079. }
  115080. if (i == 0) {
  115081. err = RNG_FAILURE_E;
  115082. }
  115083. if (err == MP_OKAY) {
  115084. err = sp_384_to_mp(r, rm);
  115085. }
  115086. if (err == MP_OKAY) {
  115087. err = sp_384_to_mp(s, sm);
  115088. }
  115089. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  115090. if (e != NULL)
  115091. #endif
  115092. {
  115093. ForceZero(e, sizeof(sp_digit) * 7 * 2 * 12);
  115094. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  115095. XFREE(e, heap, DYNAMIC_TYPE_ECC);
  115096. #endif
  115097. }
  115098. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  115099. if (point != NULL)
  115100. #endif
  115101. {
  115102. ForceZero(point, sizeof(sp_point_384));
  115103. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  115104. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  115105. #endif
  115106. }
  115107. return err;
  115108. }
  115109. #ifdef WOLFSSL_SP_NONBLOCK
  115110. typedef struct sp_ecc_sign_384_ctx {
  115111. int state;
  115112. union {
  115113. sp_384_ecc_mulmod_12_ctx mulmod_ctx;
  115114. sp_384_mont_inv_order_12_ctx mont_inv_order_ctx;
  115115. };
  115116. sp_digit e[2*12];
  115117. sp_digit x[2*12];
  115118. sp_digit k[2*12];
  115119. sp_digit r[2*12];
  115120. sp_digit tmp[3 * 2*12];
  115121. sp_point_384 point;
  115122. sp_digit* s;
  115123. sp_digit* kInv;
  115124. int i;
  115125. } sp_ecc_sign_384_ctx;
  115126. int sp_ecc_sign_384_nb(sp_ecc_ctx_t* sp_ctx, const byte* hash, word32 hashLen, WC_RNG* rng,
  115127. mp_int* priv, mp_int* rm, mp_int* sm, mp_int* km, void* heap)
  115128. {
  115129. int err = FP_WOULDBLOCK;
  115130. sp_ecc_sign_384_ctx* ctx = (sp_ecc_sign_384_ctx*)sp_ctx->data;
  115131. typedef char ctx_size_test[sizeof(sp_ecc_sign_384_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  115132. (void)sizeof(ctx_size_test);
  115133. switch (ctx->state) {
  115134. case 0: /* INIT */
  115135. ctx->s = ctx->e;
  115136. ctx->kInv = ctx->k;
  115137. ctx->i = SP_ECC_MAX_SIG_GEN;
  115138. ctx->state = 1;
  115139. break;
  115140. case 1: /* GEN */
  115141. /* New random point. */
  115142. if (km == NULL || mp_iszero(km)) {
  115143. err = sp_384_ecc_gen_k_12(rng, ctx->k);
  115144. }
  115145. else {
  115146. sp_384_from_mp(ctx->k, 12, km);
  115147. mp_zero(km);
  115148. }
  115149. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  115150. ctx->state = 2;
  115151. break;
  115152. case 2: /* MULMOD */
  115153. err = sp_384_ecc_mulmod_12_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  115154. &ctx->point, &p384_base, ctx->k, 1, 1, heap);
  115155. if (err == MP_OKAY) {
  115156. ctx->state = 3;
  115157. }
  115158. break;
  115159. case 3: /* MODORDER */
  115160. {
  115161. sp_int32 c;
  115162. /* r = point->x mod order */
  115163. XMEMCPY(ctx->r, ctx->point.x, sizeof(sp_digit) * 12U);
  115164. sp_384_norm_12(ctx->r);
  115165. c = sp_384_cmp_12(ctx->r, p384_order);
  115166. sp_384_cond_sub_12(ctx->r, ctx->r, p384_order,
  115167. (sp_digit)0 - (sp_digit)(c >= 0));
  115168. sp_384_norm_12(ctx->r);
  115169. if (hashLen > 48U) {
  115170. hashLen = 48U;
  115171. }
  115172. sp_384_from_mp(ctx->x, 12, priv);
  115173. sp_384_from_bin(ctx->e, 12, hash, (int)hashLen);
  115174. ctx->state = 4;
  115175. break;
  115176. }
  115177. case 4: /* KMODORDER */
  115178. /* Conv k to Montgomery form (mod order) */
  115179. sp_384_mul_12(ctx->k, ctx->k, p384_norm_order);
  115180. err = sp_384_mod_12(ctx->k, ctx->k, p384_order);
  115181. if (err == MP_OKAY) {
  115182. sp_384_norm_12(ctx->k);
  115183. XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
  115184. ctx->state = 5;
  115185. }
  115186. break;
  115187. case 5: /* KINV */
  115188. /* kInv = 1/k mod order */
  115189. err = sp_384_mont_inv_order_12_nb((sp_ecc_ctx_t*)&ctx->mont_inv_order_ctx, ctx->kInv, ctx->k, ctx->tmp);
  115190. if (err == MP_OKAY) {
  115191. XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
  115192. ctx->state = 6;
  115193. }
  115194. break;
  115195. case 6: /* KINVNORM */
  115196. sp_384_norm_12(ctx->kInv);
  115197. ctx->state = 7;
  115198. break;
  115199. case 7: /* R */
  115200. /* s = r * x + e */
  115201. sp_384_mul_12(ctx->x, ctx->x, ctx->r);
  115202. ctx->state = 8;
  115203. break;
  115204. case 8: /* S1 */
  115205. err = sp_384_mod_12(ctx->x, ctx->x, p384_order);
  115206. if (err == MP_OKAY)
  115207. ctx->state = 9;
  115208. break;
  115209. case 9: /* S2 */
  115210. {
  115211. sp_digit carry;
  115212. sp_int32 c;
  115213. sp_384_norm_12(ctx->x);
  115214. carry = sp_384_add_12(ctx->s, ctx->e, ctx->x);
  115215. sp_384_cond_sub_12(ctx->s, ctx->s,
  115216. p384_order, 0 - carry);
  115217. sp_384_norm_12(ctx->s);
  115218. c = sp_384_cmp_12(ctx->s, p384_order);
  115219. sp_384_cond_sub_12(ctx->s, ctx->s, p384_order,
  115220. (sp_digit)0 - (sp_digit)(c >= 0));
  115221. sp_384_norm_12(ctx->s);
  115222. /* s = s * k^-1 mod order */
  115223. sp_384_mont_mul_order_12(ctx->s, ctx->s, ctx->kInv);
  115224. sp_384_norm_12(ctx->s);
  115225. /* Check that signature is usable. */
  115226. if (sp_384_iszero_12(ctx->s) == 0) {
  115227. ctx->state = 10;
  115228. break;
  115229. }
  115230. #ifdef WOLFSSL_ECDSA_SET_K_ONE_LOOP
  115231. ctx->i = 1;
  115232. #endif
  115233. /* not usable gen, try again */
  115234. ctx->i--;
  115235. if (ctx->i == 0) {
  115236. err = RNG_FAILURE_E;
  115237. }
  115238. ctx->state = 1;
  115239. break;
  115240. }
  115241. case 10: /* RES */
  115242. err = sp_384_to_mp(ctx->r, rm);
  115243. if (err == MP_OKAY) {
  115244. err = sp_384_to_mp(ctx->s, sm);
  115245. }
  115246. break;
  115247. }
  115248. if (err == MP_OKAY && ctx->state != 10) {
  115249. err = FP_WOULDBLOCK;
  115250. }
  115251. if (err != FP_WOULDBLOCK) {
  115252. XMEMSET(ctx->e, 0, sizeof(sp_digit) * 2U * 12U);
  115253. XMEMSET(ctx->x, 0, sizeof(sp_digit) * 2U * 12U);
  115254. XMEMSET(ctx->k, 0, sizeof(sp_digit) * 2U * 12U);
  115255. XMEMSET(ctx->r, 0, sizeof(sp_digit) * 2U * 12U);
  115256. XMEMSET(ctx->tmp, 0, sizeof(sp_digit) * 3U * 2U * 12U);
  115257. }
  115258. return err;
  115259. }
  115260. #endif /* WOLFSSL_SP_NONBLOCK */
  115261. #endif /* HAVE_ECC_SIGN */
  115262. #ifndef WOLFSSL_SP_SMALL
  115263. /* Divide the number by 2 mod the modulus. (r = a / 2 % m)
  115264. *
  115265. * r Result of division by 2.
  115266. * a Number to divide.
  115267. * m Modulus.
  115268. */
  115269. static void sp_384_div2_mod_12(sp_digit* r, const sp_digit* a,
  115270. const sp_digit* m)
  115271. {
  115272. __asm__ __volatile__ (
  115273. "ldr r3, [%[a]]\n\t"
  115274. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115275. "lsls r3, r3, #31\n\t"
  115276. #else
  115277. "lsl r3, r3, #31\n\t"
  115278. #endif
  115279. "beq L_sp_384_div2_mod_12_no_add_%=\n\t"
  115280. "ldr r4, [%[a]]\n\t"
  115281. "ldr r5, [%[a], #4]\n\t"
  115282. "ldr r6, [%[m]]\n\t"
  115283. "ldr r7, [%[m], #4]\n\t"
  115284. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115285. "adds r4, r4, r6\n\t"
  115286. #else
  115287. "add r4, r4, r6\n\t"
  115288. #endif
  115289. #ifdef WOLFSSL_KEIL
  115290. "adcs r5, r5, r7\n\t"
  115291. #elif defined(__clang__)
  115292. "adcs r5, r7\n\t"
  115293. #else
  115294. "adc r5, r7\n\t"
  115295. #endif
  115296. "str r4, [%[r]]\n\t"
  115297. "str r5, [%[r], #4]\n\t"
  115298. "ldr r4, [%[a], #8]\n\t"
  115299. "ldr r5, [%[a], #12]\n\t"
  115300. "ldr r6, [%[m], #8]\n\t"
  115301. "ldr r7, [%[m], #12]\n\t"
  115302. #ifdef WOLFSSL_KEIL
  115303. "adcs r4, r4, r6\n\t"
  115304. #elif defined(__clang__)
  115305. "adcs r4, r6\n\t"
  115306. #else
  115307. "adc r4, r6\n\t"
  115308. #endif
  115309. #ifdef WOLFSSL_KEIL
  115310. "adcs r5, r5, r7\n\t"
  115311. #elif defined(__clang__)
  115312. "adcs r5, r7\n\t"
  115313. #else
  115314. "adc r5, r7\n\t"
  115315. #endif
  115316. "str r4, [%[r], #8]\n\t"
  115317. "str r5, [%[r], #12]\n\t"
  115318. "ldr r4, [%[a], #16]\n\t"
  115319. "ldr r5, [%[a], #20]\n\t"
  115320. "ldr r6, [%[m], #16]\n\t"
  115321. "ldr r7, [%[m], #20]\n\t"
  115322. #ifdef WOLFSSL_KEIL
  115323. "adcs r4, r4, r6\n\t"
  115324. #elif defined(__clang__)
  115325. "adcs r4, r6\n\t"
  115326. #else
  115327. "adc r4, r6\n\t"
  115328. #endif
  115329. #ifdef WOLFSSL_KEIL
  115330. "adcs r5, r5, r7\n\t"
  115331. #elif defined(__clang__)
  115332. "adcs r5, r7\n\t"
  115333. #else
  115334. "adc r5, r7\n\t"
  115335. #endif
  115336. "str r4, [%[r], #16]\n\t"
  115337. "str r5, [%[r], #20]\n\t"
  115338. "ldr r4, [%[a], #24]\n\t"
  115339. "ldr r5, [%[a], #28]\n\t"
  115340. "ldr r6, [%[m], #24]\n\t"
  115341. "ldr r7, [%[m], #28]\n\t"
  115342. #ifdef WOLFSSL_KEIL
  115343. "adcs r4, r4, r6\n\t"
  115344. #elif defined(__clang__)
  115345. "adcs r4, r6\n\t"
  115346. #else
  115347. "adc r4, r6\n\t"
  115348. #endif
  115349. #ifdef WOLFSSL_KEIL
  115350. "adcs r5, r5, r7\n\t"
  115351. #elif defined(__clang__)
  115352. "adcs r5, r7\n\t"
  115353. #else
  115354. "adc r5, r7\n\t"
  115355. #endif
  115356. "str r4, [%[r], #24]\n\t"
  115357. "str r5, [%[r], #28]\n\t"
  115358. "ldr r4, [%[a], #32]\n\t"
  115359. "ldr r5, [%[a], #36]\n\t"
  115360. "ldr r6, [%[m], #32]\n\t"
  115361. "ldr r7, [%[m], #36]\n\t"
  115362. #ifdef WOLFSSL_KEIL
  115363. "adcs r4, r4, r6\n\t"
  115364. #elif defined(__clang__)
  115365. "adcs r4, r6\n\t"
  115366. #else
  115367. "adc r4, r6\n\t"
  115368. #endif
  115369. #ifdef WOLFSSL_KEIL
  115370. "adcs r5, r5, r7\n\t"
  115371. #elif defined(__clang__)
  115372. "adcs r5, r7\n\t"
  115373. #else
  115374. "adc r5, r7\n\t"
  115375. #endif
  115376. "str r4, [%[r], #32]\n\t"
  115377. "str r5, [%[r], #36]\n\t"
  115378. "ldr r4, [%[a], #40]\n\t"
  115379. "ldr r5, [%[a], #44]\n\t"
  115380. "ldr r6, [%[m], #40]\n\t"
  115381. "ldr r7, [%[m], #44]\n\t"
  115382. #ifdef WOLFSSL_KEIL
  115383. "adcs r4, r4, r6\n\t"
  115384. #elif defined(__clang__)
  115385. "adcs r4, r6\n\t"
  115386. #else
  115387. "adc r4, r6\n\t"
  115388. #endif
  115389. #ifdef WOLFSSL_KEIL
  115390. "adcs r5, r5, r7\n\t"
  115391. #elif defined(__clang__)
  115392. "adcs r5, r7\n\t"
  115393. #else
  115394. "adc r5, r7\n\t"
  115395. #endif
  115396. "str r4, [%[r], #40]\n\t"
  115397. "str r5, [%[r], #44]\n\t"
  115398. "movs r3, #0\n\t"
  115399. #ifdef WOLFSSL_KEIL
  115400. "adcs r3, r3, r3\n\t"
  115401. #elif defined(__clang__)
  115402. "adcs r3, r3\n\t"
  115403. #else
  115404. "adc r3, r3\n\t"
  115405. #endif
  115406. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115407. "lsls r3, r3, #31\n\t"
  115408. #else
  115409. "lsl r3, r3, #31\n\t"
  115410. #endif
  115411. "b L_sp_384_div2_mod_12_div2_%=\n\t"
  115412. "\n"
  115413. "L_sp_384_div2_mod_12_no_add_%=:\n\t"
  115414. "ldr r4, [%[a]]\n\t"
  115415. "ldr r5, [%[a], #4]\n\t"
  115416. "str r4, [%[r]]\n\t"
  115417. "str r5, [%[r], #4]\n\t"
  115418. "ldr r4, [%[a], #8]\n\t"
  115419. "ldr r5, [%[a], #12]\n\t"
  115420. "str r4, [%[r], #8]\n\t"
  115421. "str r5, [%[r], #12]\n\t"
  115422. "ldr r4, [%[a], #16]\n\t"
  115423. "ldr r5, [%[a], #20]\n\t"
  115424. "str r4, [%[r], #16]\n\t"
  115425. "str r5, [%[r], #20]\n\t"
  115426. "ldr r4, [%[a], #24]\n\t"
  115427. "ldr r5, [%[a], #28]\n\t"
  115428. "str r4, [%[r], #24]\n\t"
  115429. "str r5, [%[r], #28]\n\t"
  115430. "ldr r4, [%[a], #32]\n\t"
  115431. "ldr r5, [%[a], #36]\n\t"
  115432. "str r4, [%[r], #32]\n\t"
  115433. "str r5, [%[r], #36]\n\t"
  115434. "ldr r4, [%[a], #40]\n\t"
  115435. "ldr r5, [%[a], #44]\n\t"
  115436. "str r4, [%[r], #40]\n\t"
  115437. "str r5, [%[r], #44]\n\t"
  115438. "\n"
  115439. "L_sp_384_div2_mod_12_div2_%=:\n\t"
  115440. "ldr r4, [%[r]]\n\t"
  115441. "ldr r5, [%[r], #4]\n\t"
  115442. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115443. "lsrs r4, r4, #1\n\t"
  115444. #else
  115445. "lsr r4, r4, #1\n\t"
  115446. #endif
  115447. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115448. "lsls r6, r5, #31\n\t"
  115449. #else
  115450. "lsl r6, r5, #31\n\t"
  115451. #endif
  115452. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115453. "lsrs r5, r5, #1\n\t"
  115454. #else
  115455. "lsr r5, r5, #1\n\t"
  115456. #endif
  115457. #ifdef WOLFSSL_KEIL
  115458. "orrs r4, r4, r6\n\t"
  115459. #elif defined(__clang__)
  115460. "orrs r4, r6\n\t"
  115461. #else
  115462. "orr r4, r6\n\t"
  115463. #endif
  115464. "ldr r7, [%[r], #8]\n\t"
  115465. "str r4, [%[r]]\n\t"
  115466. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115467. "lsls r6, r7, #31\n\t"
  115468. #else
  115469. "lsl r6, r7, #31\n\t"
  115470. #endif
  115471. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115472. "lsrs r7, r7, #1\n\t"
  115473. #else
  115474. "lsr r7, r7, #1\n\t"
  115475. #endif
  115476. #ifdef WOLFSSL_KEIL
  115477. "orrs r5, r5, r6\n\t"
  115478. #elif defined(__clang__)
  115479. "orrs r5, r6\n\t"
  115480. #else
  115481. "orr r5, r6\n\t"
  115482. #endif
  115483. "ldr r4, [%[r], #12]\n\t"
  115484. "str r5, [%[r], #4]\n\t"
  115485. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115486. "lsls r6, r4, #31\n\t"
  115487. #else
  115488. "lsl r6, r4, #31\n\t"
  115489. #endif
  115490. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115491. "lsrs r4, r4, #1\n\t"
  115492. #else
  115493. "lsr r4, r4, #1\n\t"
  115494. #endif
  115495. #ifdef WOLFSSL_KEIL
  115496. "orrs r7, r7, r6\n\t"
  115497. #elif defined(__clang__)
  115498. "orrs r7, r6\n\t"
  115499. #else
  115500. "orr r7, r6\n\t"
  115501. #endif
  115502. "ldr r5, [%[r], #16]\n\t"
  115503. "str r7, [%[r], #8]\n\t"
  115504. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115505. "lsls r6, r5, #31\n\t"
  115506. #else
  115507. "lsl r6, r5, #31\n\t"
  115508. #endif
  115509. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115510. "lsrs r5, r5, #1\n\t"
  115511. #else
  115512. "lsr r5, r5, #1\n\t"
  115513. #endif
  115514. #ifdef WOLFSSL_KEIL
  115515. "orrs r4, r4, r6\n\t"
  115516. #elif defined(__clang__)
  115517. "orrs r4, r6\n\t"
  115518. #else
  115519. "orr r4, r6\n\t"
  115520. #endif
  115521. "ldr r7, [%[r], #20]\n\t"
  115522. "str r4, [%[r], #12]\n\t"
  115523. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115524. "lsls r6, r7, #31\n\t"
  115525. #else
  115526. "lsl r6, r7, #31\n\t"
  115527. #endif
  115528. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115529. "lsrs r7, r7, #1\n\t"
  115530. #else
  115531. "lsr r7, r7, #1\n\t"
  115532. #endif
  115533. #ifdef WOLFSSL_KEIL
  115534. "orrs r5, r5, r6\n\t"
  115535. #elif defined(__clang__)
  115536. "orrs r5, r6\n\t"
  115537. #else
  115538. "orr r5, r6\n\t"
  115539. #endif
  115540. "ldr r4, [%[r], #24]\n\t"
  115541. "str r5, [%[r], #16]\n\t"
  115542. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115543. "lsls r6, r4, #31\n\t"
  115544. #else
  115545. "lsl r6, r4, #31\n\t"
  115546. #endif
  115547. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115548. "lsrs r4, r4, #1\n\t"
  115549. #else
  115550. "lsr r4, r4, #1\n\t"
  115551. #endif
  115552. #ifdef WOLFSSL_KEIL
  115553. "orrs r7, r7, r6\n\t"
  115554. #elif defined(__clang__)
  115555. "orrs r7, r6\n\t"
  115556. #else
  115557. "orr r7, r6\n\t"
  115558. #endif
  115559. "ldr r5, [%[r], #28]\n\t"
  115560. "str r7, [%[r], #20]\n\t"
  115561. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115562. "lsls r6, r5, #31\n\t"
  115563. #else
  115564. "lsl r6, r5, #31\n\t"
  115565. #endif
  115566. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115567. "lsrs r5, r5, #1\n\t"
  115568. #else
  115569. "lsr r5, r5, #1\n\t"
  115570. #endif
  115571. #ifdef WOLFSSL_KEIL
  115572. "orrs r4, r4, r6\n\t"
  115573. #elif defined(__clang__)
  115574. "orrs r4, r6\n\t"
  115575. #else
  115576. "orr r4, r6\n\t"
  115577. #endif
  115578. "ldr r7, [%[r], #32]\n\t"
  115579. "str r4, [%[r], #24]\n\t"
  115580. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115581. "lsls r6, r7, #31\n\t"
  115582. #else
  115583. "lsl r6, r7, #31\n\t"
  115584. #endif
  115585. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115586. "lsrs r7, r7, #1\n\t"
  115587. #else
  115588. "lsr r7, r7, #1\n\t"
  115589. #endif
  115590. #ifdef WOLFSSL_KEIL
  115591. "orrs r5, r5, r6\n\t"
  115592. #elif defined(__clang__)
  115593. "orrs r5, r6\n\t"
  115594. #else
  115595. "orr r5, r6\n\t"
  115596. #endif
  115597. "ldr r4, [%[r], #36]\n\t"
  115598. "str r5, [%[r], #28]\n\t"
  115599. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115600. "lsls r6, r4, #31\n\t"
  115601. #else
  115602. "lsl r6, r4, #31\n\t"
  115603. #endif
  115604. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115605. "lsrs r4, r4, #1\n\t"
  115606. #else
  115607. "lsr r4, r4, #1\n\t"
  115608. #endif
  115609. #ifdef WOLFSSL_KEIL
  115610. "orrs r7, r7, r6\n\t"
  115611. #elif defined(__clang__)
  115612. "orrs r7, r6\n\t"
  115613. #else
  115614. "orr r7, r6\n\t"
  115615. #endif
  115616. "ldr r5, [%[r], #40]\n\t"
  115617. "str r7, [%[r], #32]\n\t"
  115618. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115619. "lsls r6, r5, #31\n\t"
  115620. #else
  115621. "lsl r6, r5, #31\n\t"
  115622. #endif
  115623. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115624. "lsrs r5, r5, #1\n\t"
  115625. #else
  115626. "lsr r5, r5, #1\n\t"
  115627. #endif
  115628. #ifdef WOLFSSL_KEIL
  115629. "orrs r4, r4, r6\n\t"
  115630. #elif defined(__clang__)
  115631. "orrs r4, r6\n\t"
  115632. #else
  115633. "orr r4, r6\n\t"
  115634. #endif
  115635. "ldr r7, [%[r], #44]\n\t"
  115636. "str r4, [%[r], #36]\n\t"
  115637. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115638. "lsls r6, r7, #31\n\t"
  115639. #else
  115640. "lsl r6, r7, #31\n\t"
  115641. #endif
  115642. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115643. "lsrs r7, r7, #1\n\t"
  115644. #else
  115645. "lsr r7, r7, #1\n\t"
  115646. #endif
  115647. #ifdef WOLFSSL_KEIL
  115648. "orrs r5, r5, r6\n\t"
  115649. #elif defined(__clang__)
  115650. "orrs r5, r6\n\t"
  115651. #else
  115652. "orr r5, r6\n\t"
  115653. #endif
  115654. #ifdef WOLFSSL_KEIL
  115655. "orrs r7, r7, r3\n\t"
  115656. #elif defined(__clang__)
  115657. "orrs r7, r3\n\t"
  115658. #else
  115659. "orr r7, r3\n\t"
  115660. #endif
  115661. "str r5, [%[r], #40]\n\t"
  115662. "str r7, [%[r], #44]\n\t"
  115663. : [r] "+l" (r), [a] "+l" (a), [m] "+l" (m)
  115664. :
  115665. : "memory", "r3", "r4", "r5", "r6", "r7"
  115666. );
  115667. }
  115668. static int sp_384_num_bits_12(sp_digit* a)
  115669. {
  115670. static const byte sp_num_bits_table[256] = {
  115671. 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
  115672. 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
  115673. 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
  115674. 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
  115675. 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
  115676. 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
  115677. 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
  115678. 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
  115679. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  115680. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  115681. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  115682. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  115683. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  115684. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  115685. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  115686. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  115687. };
  115688. const byte* table = sp_num_bits_table;
  115689. __asm__ __volatile__ (
  115690. "movs r6, #0xff\n\t"
  115691. "ldr r3, [%[a], #44]\n\t"
  115692. "cmp r3, #0\n\t"
  115693. "beq L_sp_384_num_bits_12_11_%=\n\t"
  115694. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115695. "lsrs r5, r3, #24\n\t"
  115696. #else
  115697. "lsr r5, r3, #24\n\t"
  115698. #endif
  115699. "cmp r5, #0\n\t"
  115700. "beq L_sp_384_num_bits_12_133_%=\n\t"
  115701. "movs r2, #0xff\n\t"
  115702. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115703. "adds r2, r2, #0x79\n\t"
  115704. #else
  115705. "add r2, r2, #0x79\n\t"
  115706. #endif
  115707. "ldrb r4, [%[table], r5]\n\t"
  115708. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115709. "adds r2, r2, r4\n\t"
  115710. #else
  115711. "add r2, r2, r4\n\t"
  115712. #endif
  115713. "b L_sp_384_num_bits_12_13_%=\n\t"
  115714. "\n"
  115715. "L_sp_384_num_bits_12_133_%=:\n\t"
  115716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115717. "lsrs r5, r3, #16\n\t"
  115718. #else
  115719. "lsr r5, r3, #16\n\t"
  115720. #endif
  115721. #ifdef WOLFSSL_KEIL
  115722. "ands r5, r5, r6\n\t"
  115723. #elif defined(__clang__)
  115724. "ands r5, r6\n\t"
  115725. #else
  115726. "and r5, r6\n\t"
  115727. #endif
  115728. "cmp r5, #0\n\t"
  115729. "beq L_sp_384_num_bits_12_132_%=\n\t"
  115730. "movs r2, #0xff\n\t"
  115731. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115732. "adds r2, r2, #0x71\n\t"
  115733. #else
  115734. "add r2, r2, #0x71\n\t"
  115735. #endif
  115736. "ldrb r4, [%[table], r5]\n\t"
  115737. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115738. "adds r2, r2, r4\n\t"
  115739. #else
  115740. "add r2, r2, r4\n\t"
  115741. #endif
  115742. "b L_sp_384_num_bits_12_13_%=\n\t"
  115743. "\n"
  115744. "L_sp_384_num_bits_12_132_%=:\n\t"
  115745. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115746. "lsrs r5, r3, #8\n\t"
  115747. #else
  115748. "lsr r5, r3, #8\n\t"
  115749. #endif
  115750. #ifdef WOLFSSL_KEIL
  115751. "ands r5, r5, r6\n\t"
  115752. #elif defined(__clang__)
  115753. "ands r5, r6\n\t"
  115754. #else
  115755. "and r5, r6\n\t"
  115756. #endif
  115757. "cmp r5, #0\n\t"
  115758. "beq L_sp_384_num_bits_12_131_%=\n\t"
  115759. "movs r2, #0xff\n\t"
  115760. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115761. "adds r2, r2, #0x69\n\t"
  115762. #else
  115763. "add r2, r2, #0x69\n\t"
  115764. #endif
  115765. "ldrb r4, [%[table], r5]\n\t"
  115766. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115767. "adds r2, r2, r4\n\t"
  115768. #else
  115769. "add r2, r2, r4\n\t"
  115770. #endif
  115771. "b L_sp_384_num_bits_12_13_%=\n\t"
  115772. "\n"
  115773. "L_sp_384_num_bits_12_131_%=:\n\t"
  115774. "movs r5, r3\n\t"
  115775. #ifdef WOLFSSL_KEIL
  115776. "ands r5, r5, r6\n\t"
  115777. #elif defined(__clang__)
  115778. "ands r5, r6\n\t"
  115779. #else
  115780. "and r5, r6\n\t"
  115781. #endif
  115782. "cmp r5, #0\n\t"
  115783. "beq L_sp_384_num_bits_12_130_%=\n\t"
  115784. "movs r2, #0xff\n\t"
  115785. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115786. "adds r2, r2, #0x61\n\t"
  115787. #else
  115788. "add r2, r2, #0x61\n\t"
  115789. #endif
  115790. "ldrb r4, [%[table], r5]\n\t"
  115791. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115792. "adds r2, r2, r4\n\t"
  115793. #else
  115794. "add r2, r2, r4\n\t"
  115795. #endif
  115796. "b L_sp_384_num_bits_12_13_%=\n\t"
  115797. "\n"
  115798. "L_sp_384_num_bits_12_130_%=:\n\t"
  115799. "b L_sp_384_num_bits_12_13_%=\n\t"
  115800. "\n"
  115801. "L_sp_384_num_bits_12_11_%=:\n\t"
  115802. "ldr r3, [%[a], #40]\n\t"
  115803. "cmp r3, #0\n\t"
  115804. "beq L_sp_384_num_bits_12_10_%=\n\t"
  115805. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115806. "lsrs r5, r3, #24\n\t"
  115807. #else
  115808. "lsr r5, r3, #24\n\t"
  115809. #endif
  115810. "cmp r5, #0\n\t"
  115811. "beq L_sp_384_num_bits_12_123_%=\n\t"
  115812. "movs r2, #0xff\n\t"
  115813. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115814. "adds r2, r2, #0x59\n\t"
  115815. #else
  115816. "add r2, r2, #0x59\n\t"
  115817. #endif
  115818. "ldrb r4, [%[table], r5]\n\t"
  115819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115820. "adds r2, r2, r4\n\t"
  115821. #else
  115822. "add r2, r2, r4\n\t"
  115823. #endif
  115824. "b L_sp_384_num_bits_12_13_%=\n\t"
  115825. "\n"
  115826. "L_sp_384_num_bits_12_123_%=:\n\t"
  115827. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115828. "lsrs r5, r3, #16\n\t"
  115829. #else
  115830. "lsr r5, r3, #16\n\t"
  115831. #endif
  115832. #ifdef WOLFSSL_KEIL
  115833. "ands r5, r5, r6\n\t"
  115834. #elif defined(__clang__)
  115835. "ands r5, r6\n\t"
  115836. #else
  115837. "and r5, r6\n\t"
  115838. #endif
  115839. "cmp r5, #0\n\t"
  115840. "beq L_sp_384_num_bits_12_122_%=\n\t"
  115841. "movs r2, #0xff\n\t"
  115842. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115843. "adds r2, r2, #0x51\n\t"
  115844. #else
  115845. "add r2, r2, #0x51\n\t"
  115846. #endif
  115847. "ldrb r4, [%[table], r5]\n\t"
  115848. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115849. "adds r2, r2, r4\n\t"
  115850. #else
  115851. "add r2, r2, r4\n\t"
  115852. #endif
  115853. "b L_sp_384_num_bits_12_13_%=\n\t"
  115854. "\n"
  115855. "L_sp_384_num_bits_12_122_%=:\n\t"
  115856. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115857. "lsrs r5, r3, #8\n\t"
  115858. #else
  115859. "lsr r5, r3, #8\n\t"
  115860. #endif
  115861. #ifdef WOLFSSL_KEIL
  115862. "ands r5, r5, r6\n\t"
  115863. #elif defined(__clang__)
  115864. "ands r5, r6\n\t"
  115865. #else
  115866. "and r5, r6\n\t"
  115867. #endif
  115868. "cmp r5, #0\n\t"
  115869. "beq L_sp_384_num_bits_12_121_%=\n\t"
  115870. "movs r2, #0xff\n\t"
  115871. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115872. "adds r2, r2, #0x49\n\t"
  115873. #else
  115874. "add r2, r2, #0x49\n\t"
  115875. #endif
  115876. "ldrb r4, [%[table], r5]\n\t"
  115877. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115878. "adds r2, r2, r4\n\t"
  115879. #else
  115880. "add r2, r2, r4\n\t"
  115881. #endif
  115882. "b L_sp_384_num_bits_12_13_%=\n\t"
  115883. "\n"
  115884. "L_sp_384_num_bits_12_121_%=:\n\t"
  115885. "movs r5, r3\n\t"
  115886. #ifdef WOLFSSL_KEIL
  115887. "ands r5, r5, r6\n\t"
  115888. #elif defined(__clang__)
  115889. "ands r5, r6\n\t"
  115890. #else
  115891. "and r5, r6\n\t"
  115892. #endif
  115893. "cmp r5, #0\n\t"
  115894. "beq L_sp_384_num_bits_12_120_%=\n\t"
  115895. "movs r2, #0xff\n\t"
  115896. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115897. "adds r2, r2, #0x41\n\t"
  115898. #else
  115899. "add r2, r2, #0x41\n\t"
  115900. #endif
  115901. "ldrb r4, [%[table], r5]\n\t"
  115902. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115903. "adds r2, r2, r4\n\t"
  115904. #else
  115905. "add r2, r2, r4\n\t"
  115906. #endif
  115907. "b L_sp_384_num_bits_12_13_%=\n\t"
  115908. "\n"
  115909. "L_sp_384_num_bits_12_120_%=:\n\t"
  115910. "b L_sp_384_num_bits_12_13_%=\n\t"
  115911. "\n"
  115912. "L_sp_384_num_bits_12_10_%=:\n\t"
  115913. "ldr r3, [%[a], #36]\n\t"
  115914. "cmp r3, #0\n\t"
  115915. "beq L_sp_384_num_bits_12_9_%=\n\t"
  115916. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115917. "lsrs r5, r3, #24\n\t"
  115918. #else
  115919. "lsr r5, r3, #24\n\t"
  115920. #endif
  115921. "cmp r5, #0\n\t"
  115922. "beq L_sp_384_num_bits_12_113_%=\n\t"
  115923. "movs r2, #0xff\n\t"
  115924. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115925. "adds r2, r2, #57\n\t"
  115926. #else
  115927. "add r2, r2, #57\n\t"
  115928. #endif
  115929. "ldrb r4, [%[table], r5]\n\t"
  115930. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115931. "adds r2, r2, r4\n\t"
  115932. #else
  115933. "add r2, r2, r4\n\t"
  115934. #endif
  115935. "b L_sp_384_num_bits_12_13_%=\n\t"
  115936. "\n"
  115937. "L_sp_384_num_bits_12_113_%=:\n\t"
  115938. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115939. "lsrs r5, r3, #16\n\t"
  115940. #else
  115941. "lsr r5, r3, #16\n\t"
  115942. #endif
  115943. #ifdef WOLFSSL_KEIL
  115944. "ands r5, r5, r6\n\t"
  115945. #elif defined(__clang__)
  115946. "ands r5, r6\n\t"
  115947. #else
  115948. "and r5, r6\n\t"
  115949. #endif
  115950. "cmp r5, #0\n\t"
  115951. "beq L_sp_384_num_bits_12_112_%=\n\t"
  115952. "movs r2, #0xff\n\t"
  115953. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115954. "adds r2, r2, #49\n\t"
  115955. #else
  115956. "add r2, r2, #49\n\t"
  115957. #endif
  115958. "ldrb r4, [%[table], r5]\n\t"
  115959. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115960. "adds r2, r2, r4\n\t"
  115961. #else
  115962. "add r2, r2, r4\n\t"
  115963. #endif
  115964. "b L_sp_384_num_bits_12_13_%=\n\t"
  115965. "\n"
  115966. "L_sp_384_num_bits_12_112_%=:\n\t"
  115967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115968. "lsrs r5, r3, #8\n\t"
  115969. #else
  115970. "lsr r5, r3, #8\n\t"
  115971. #endif
  115972. #ifdef WOLFSSL_KEIL
  115973. "ands r5, r5, r6\n\t"
  115974. #elif defined(__clang__)
  115975. "ands r5, r6\n\t"
  115976. #else
  115977. "and r5, r6\n\t"
  115978. #endif
  115979. "cmp r5, #0\n\t"
  115980. "beq L_sp_384_num_bits_12_111_%=\n\t"
  115981. "movs r2, #0xff\n\t"
  115982. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115983. "adds r2, r2, #41\n\t"
  115984. #else
  115985. "add r2, r2, #41\n\t"
  115986. #endif
  115987. "ldrb r4, [%[table], r5]\n\t"
  115988. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115989. "adds r2, r2, r4\n\t"
  115990. #else
  115991. "add r2, r2, r4\n\t"
  115992. #endif
  115993. "b L_sp_384_num_bits_12_13_%=\n\t"
  115994. "\n"
  115995. "L_sp_384_num_bits_12_111_%=:\n\t"
  115996. "movs r5, r3\n\t"
  115997. #ifdef WOLFSSL_KEIL
  115998. "ands r5, r5, r6\n\t"
  115999. #elif defined(__clang__)
  116000. "ands r5, r6\n\t"
  116001. #else
  116002. "and r5, r6\n\t"
  116003. #endif
  116004. "cmp r5, #0\n\t"
  116005. "beq L_sp_384_num_bits_12_110_%=\n\t"
  116006. "movs r2, #0xff\n\t"
  116007. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116008. "adds r2, r2, #33\n\t"
  116009. #else
  116010. "add r2, r2, #33\n\t"
  116011. #endif
  116012. "ldrb r4, [%[table], r5]\n\t"
  116013. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116014. "adds r2, r2, r4\n\t"
  116015. #else
  116016. "add r2, r2, r4\n\t"
  116017. #endif
  116018. "b L_sp_384_num_bits_12_13_%=\n\t"
  116019. "\n"
  116020. "L_sp_384_num_bits_12_110_%=:\n\t"
  116021. "b L_sp_384_num_bits_12_13_%=\n\t"
  116022. "\n"
  116023. "L_sp_384_num_bits_12_9_%=:\n\t"
  116024. "ldr r3, [%[a], #32]\n\t"
  116025. "cmp r3, #0\n\t"
  116026. "beq L_sp_384_num_bits_12_8_%=\n\t"
  116027. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116028. "lsrs r5, r3, #24\n\t"
  116029. #else
  116030. "lsr r5, r3, #24\n\t"
  116031. #endif
  116032. "cmp r5, #0\n\t"
  116033. "beq L_sp_384_num_bits_12_103_%=\n\t"
  116034. "movs r2, #0xff\n\t"
  116035. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116036. "adds r2, r2, #25\n\t"
  116037. #else
  116038. "add r2, r2, #25\n\t"
  116039. #endif
  116040. "ldrb r4, [%[table], r5]\n\t"
  116041. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116042. "adds r2, r2, r4\n\t"
  116043. #else
  116044. "add r2, r2, r4\n\t"
  116045. #endif
  116046. "b L_sp_384_num_bits_12_13_%=\n\t"
  116047. "\n"
  116048. "L_sp_384_num_bits_12_103_%=:\n\t"
  116049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116050. "lsrs r5, r3, #16\n\t"
  116051. #else
  116052. "lsr r5, r3, #16\n\t"
  116053. #endif
  116054. #ifdef WOLFSSL_KEIL
  116055. "ands r5, r5, r6\n\t"
  116056. #elif defined(__clang__)
  116057. "ands r5, r6\n\t"
  116058. #else
  116059. "and r5, r6\n\t"
  116060. #endif
  116061. "cmp r5, #0\n\t"
  116062. "beq L_sp_384_num_bits_12_102_%=\n\t"
  116063. "movs r2, #0xff\n\t"
  116064. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116065. "adds r2, r2, #17\n\t"
  116066. #else
  116067. "add r2, r2, #17\n\t"
  116068. #endif
  116069. "ldrb r4, [%[table], r5]\n\t"
  116070. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116071. "adds r2, r2, r4\n\t"
  116072. #else
  116073. "add r2, r2, r4\n\t"
  116074. #endif
  116075. "b L_sp_384_num_bits_12_13_%=\n\t"
  116076. "\n"
  116077. "L_sp_384_num_bits_12_102_%=:\n\t"
  116078. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116079. "lsrs r5, r3, #8\n\t"
  116080. #else
  116081. "lsr r5, r3, #8\n\t"
  116082. #endif
  116083. #ifdef WOLFSSL_KEIL
  116084. "ands r5, r5, r6\n\t"
  116085. #elif defined(__clang__)
  116086. "ands r5, r6\n\t"
  116087. #else
  116088. "and r5, r6\n\t"
  116089. #endif
  116090. "cmp r5, #0\n\t"
  116091. "beq L_sp_384_num_bits_12_101_%=\n\t"
  116092. "movs r2, #0xff\n\t"
  116093. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116094. "adds r2, r2, #9\n\t"
  116095. #else
  116096. "add r2, r2, #9\n\t"
  116097. #endif
  116098. "ldrb r4, [%[table], r5]\n\t"
  116099. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116100. "adds r2, r2, r4\n\t"
  116101. #else
  116102. "add r2, r2, r4\n\t"
  116103. #endif
  116104. "b L_sp_384_num_bits_12_13_%=\n\t"
  116105. "\n"
  116106. "L_sp_384_num_bits_12_101_%=:\n\t"
  116107. "movs r5, r3\n\t"
  116108. #ifdef WOLFSSL_KEIL
  116109. "ands r5, r5, r6\n\t"
  116110. #elif defined(__clang__)
  116111. "ands r5, r6\n\t"
  116112. #else
  116113. "and r5, r6\n\t"
  116114. #endif
  116115. "cmp r5, #0\n\t"
  116116. "beq L_sp_384_num_bits_12_100_%=\n\t"
  116117. "movs r2, #0xff\n\t"
  116118. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116119. "adds r2, r2, #1\n\t"
  116120. #else
  116121. "add r2, r2, #1\n\t"
  116122. #endif
  116123. "ldrb r4, [%[table], r5]\n\t"
  116124. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116125. "adds r2, r2, r4\n\t"
  116126. #else
  116127. "add r2, r2, r4\n\t"
  116128. #endif
  116129. "b L_sp_384_num_bits_12_13_%=\n\t"
  116130. "\n"
  116131. "L_sp_384_num_bits_12_100_%=:\n\t"
  116132. "b L_sp_384_num_bits_12_13_%=\n\t"
  116133. "\n"
  116134. "L_sp_384_num_bits_12_8_%=:\n\t"
  116135. "ldr r3, [%[a], #28]\n\t"
  116136. "cmp r3, #0\n\t"
  116137. "beq L_sp_384_num_bits_12_7_%=\n\t"
  116138. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116139. "lsrs r5, r3, #24\n\t"
  116140. #else
  116141. "lsr r5, r3, #24\n\t"
  116142. #endif
  116143. "cmp r5, #0\n\t"
  116144. "beq L_sp_384_num_bits_12_93_%=\n\t"
  116145. "movs r2, #0xf8\n\t"
  116146. "ldrb r4, [%[table], r5]\n\t"
  116147. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116148. "adds r2, r2, r4\n\t"
  116149. #else
  116150. "add r2, r2, r4\n\t"
  116151. #endif
  116152. "b L_sp_384_num_bits_12_13_%=\n\t"
  116153. "\n"
  116154. "L_sp_384_num_bits_12_93_%=:\n\t"
  116155. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116156. "lsrs r5, r3, #16\n\t"
  116157. #else
  116158. "lsr r5, r3, #16\n\t"
  116159. #endif
  116160. #ifdef WOLFSSL_KEIL
  116161. "ands r5, r5, r6\n\t"
  116162. #elif defined(__clang__)
  116163. "ands r5, r6\n\t"
  116164. #else
  116165. "and r5, r6\n\t"
  116166. #endif
  116167. "cmp r5, #0\n\t"
  116168. "beq L_sp_384_num_bits_12_92_%=\n\t"
  116169. "movs r2, #0xf0\n\t"
  116170. "ldrb r4, [%[table], r5]\n\t"
  116171. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116172. "adds r2, r2, r4\n\t"
  116173. #else
  116174. "add r2, r2, r4\n\t"
  116175. #endif
  116176. "b L_sp_384_num_bits_12_13_%=\n\t"
  116177. "\n"
  116178. "L_sp_384_num_bits_12_92_%=:\n\t"
  116179. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116180. "lsrs r5, r3, #8\n\t"
  116181. #else
  116182. "lsr r5, r3, #8\n\t"
  116183. #endif
  116184. #ifdef WOLFSSL_KEIL
  116185. "ands r5, r5, r6\n\t"
  116186. #elif defined(__clang__)
  116187. "ands r5, r6\n\t"
  116188. #else
  116189. "and r5, r6\n\t"
  116190. #endif
  116191. "cmp r5, #0\n\t"
  116192. "beq L_sp_384_num_bits_12_91_%=\n\t"
  116193. "movs r2, #0xe8\n\t"
  116194. "ldrb r4, [%[table], r5]\n\t"
  116195. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116196. "adds r2, r2, r4\n\t"
  116197. #else
  116198. "add r2, r2, r4\n\t"
  116199. #endif
  116200. "b L_sp_384_num_bits_12_13_%=\n\t"
  116201. "\n"
  116202. "L_sp_384_num_bits_12_91_%=:\n\t"
  116203. "movs r5, r3\n\t"
  116204. #ifdef WOLFSSL_KEIL
  116205. "ands r5, r5, r6\n\t"
  116206. #elif defined(__clang__)
  116207. "ands r5, r6\n\t"
  116208. #else
  116209. "and r5, r6\n\t"
  116210. #endif
  116211. "cmp r5, #0\n\t"
  116212. "beq L_sp_384_num_bits_12_90_%=\n\t"
  116213. "movs r2, #0xe0\n\t"
  116214. "ldrb r4, [%[table], r5]\n\t"
  116215. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116216. "adds r2, r2, r4\n\t"
  116217. #else
  116218. "add r2, r2, r4\n\t"
  116219. #endif
  116220. "b L_sp_384_num_bits_12_13_%=\n\t"
  116221. "\n"
  116222. "L_sp_384_num_bits_12_90_%=:\n\t"
  116223. "b L_sp_384_num_bits_12_13_%=\n\t"
  116224. "\n"
  116225. "L_sp_384_num_bits_12_7_%=:\n\t"
  116226. "ldr r3, [%[a], #24]\n\t"
  116227. "cmp r3, #0\n\t"
  116228. "beq L_sp_384_num_bits_12_6_%=\n\t"
  116229. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116230. "lsrs r5, r3, #24\n\t"
  116231. #else
  116232. "lsr r5, r3, #24\n\t"
  116233. #endif
  116234. "cmp r5, #0\n\t"
  116235. "beq L_sp_384_num_bits_12_83_%=\n\t"
  116236. "movs r2, #0xd8\n\t"
  116237. "ldrb r4, [%[table], r5]\n\t"
  116238. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116239. "adds r2, r2, r4\n\t"
  116240. #else
  116241. "add r2, r2, r4\n\t"
  116242. #endif
  116243. "b L_sp_384_num_bits_12_13_%=\n\t"
  116244. "\n"
  116245. "L_sp_384_num_bits_12_83_%=:\n\t"
  116246. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116247. "lsrs r5, r3, #16\n\t"
  116248. #else
  116249. "lsr r5, r3, #16\n\t"
  116250. #endif
  116251. #ifdef WOLFSSL_KEIL
  116252. "ands r5, r5, r6\n\t"
  116253. #elif defined(__clang__)
  116254. "ands r5, r6\n\t"
  116255. #else
  116256. "and r5, r6\n\t"
  116257. #endif
  116258. "cmp r5, #0\n\t"
  116259. "beq L_sp_384_num_bits_12_82_%=\n\t"
  116260. "movs r2, #0xd0\n\t"
  116261. "ldrb r4, [%[table], r5]\n\t"
  116262. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116263. "adds r2, r2, r4\n\t"
  116264. #else
  116265. "add r2, r2, r4\n\t"
  116266. #endif
  116267. "b L_sp_384_num_bits_12_13_%=\n\t"
  116268. "\n"
  116269. "L_sp_384_num_bits_12_82_%=:\n\t"
  116270. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116271. "lsrs r5, r3, #8\n\t"
  116272. #else
  116273. "lsr r5, r3, #8\n\t"
  116274. #endif
  116275. #ifdef WOLFSSL_KEIL
  116276. "ands r5, r5, r6\n\t"
  116277. #elif defined(__clang__)
  116278. "ands r5, r6\n\t"
  116279. #else
  116280. "and r5, r6\n\t"
  116281. #endif
  116282. "cmp r5, #0\n\t"
  116283. "beq L_sp_384_num_bits_12_81_%=\n\t"
  116284. "movs r2, #0xc8\n\t"
  116285. "ldrb r4, [%[table], r5]\n\t"
  116286. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116287. "adds r2, r2, r4\n\t"
  116288. #else
  116289. "add r2, r2, r4\n\t"
  116290. #endif
  116291. "b L_sp_384_num_bits_12_13_%=\n\t"
  116292. "\n"
  116293. "L_sp_384_num_bits_12_81_%=:\n\t"
  116294. "movs r5, r3\n\t"
  116295. #ifdef WOLFSSL_KEIL
  116296. "ands r5, r5, r6\n\t"
  116297. #elif defined(__clang__)
  116298. "ands r5, r6\n\t"
  116299. #else
  116300. "and r5, r6\n\t"
  116301. #endif
  116302. "cmp r5, #0\n\t"
  116303. "beq L_sp_384_num_bits_12_80_%=\n\t"
  116304. "movs r2, #0xc0\n\t"
  116305. "ldrb r4, [%[table], r5]\n\t"
  116306. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116307. "adds r2, r2, r4\n\t"
  116308. #else
  116309. "add r2, r2, r4\n\t"
  116310. #endif
  116311. "b L_sp_384_num_bits_12_13_%=\n\t"
  116312. "\n"
  116313. "L_sp_384_num_bits_12_80_%=:\n\t"
  116314. "b L_sp_384_num_bits_12_13_%=\n\t"
  116315. "\n"
  116316. "L_sp_384_num_bits_12_6_%=:\n\t"
  116317. "ldr r3, [%[a], #20]\n\t"
  116318. "cmp r3, #0\n\t"
  116319. "beq L_sp_384_num_bits_12_5_%=\n\t"
  116320. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116321. "lsrs r5, r3, #24\n\t"
  116322. #else
  116323. "lsr r5, r3, #24\n\t"
  116324. #endif
  116325. "cmp r5, #0\n\t"
  116326. "beq L_sp_384_num_bits_12_73_%=\n\t"
  116327. "movs r2, #0xb8\n\t"
  116328. "ldrb r4, [%[table], r5]\n\t"
  116329. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116330. "adds r2, r2, r4\n\t"
  116331. #else
  116332. "add r2, r2, r4\n\t"
  116333. #endif
  116334. "b L_sp_384_num_bits_12_13_%=\n\t"
  116335. "\n"
  116336. "L_sp_384_num_bits_12_73_%=:\n\t"
  116337. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116338. "lsrs r5, r3, #16\n\t"
  116339. #else
  116340. "lsr r5, r3, #16\n\t"
  116341. #endif
  116342. #ifdef WOLFSSL_KEIL
  116343. "ands r5, r5, r6\n\t"
  116344. #elif defined(__clang__)
  116345. "ands r5, r6\n\t"
  116346. #else
  116347. "and r5, r6\n\t"
  116348. #endif
  116349. "cmp r5, #0\n\t"
  116350. "beq L_sp_384_num_bits_12_72_%=\n\t"
  116351. "movs r2, #0xb0\n\t"
  116352. "ldrb r4, [%[table], r5]\n\t"
  116353. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116354. "adds r2, r2, r4\n\t"
  116355. #else
  116356. "add r2, r2, r4\n\t"
  116357. #endif
  116358. "b L_sp_384_num_bits_12_13_%=\n\t"
  116359. "\n"
  116360. "L_sp_384_num_bits_12_72_%=:\n\t"
  116361. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116362. "lsrs r5, r3, #8\n\t"
  116363. #else
  116364. "lsr r5, r3, #8\n\t"
  116365. #endif
  116366. #ifdef WOLFSSL_KEIL
  116367. "ands r5, r5, r6\n\t"
  116368. #elif defined(__clang__)
  116369. "ands r5, r6\n\t"
  116370. #else
  116371. "and r5, r6\n\t"
  116372. #endif
  116373. "cmp r5, #0\n\t"
  116374. "beq L_sp_384_num_bits_12_71_%=\n\t"
  116375. "movs r2, #0xa8\n\t"
  116376. "ldrb r4, [%[table], r5]\n\t"
  116377. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116378. "adds r2, r2, r4\n\t"
  116379. #else
  116380. "add r2, r2, r4\n\t"
  116381. #endif
  116382. "b L_sp_384_num_bits_12_13_%=\n\t"
  116383. "\n"
  116384. "L_sp_384_num_bits_12_71_%=:\n\t"
  116385. "movs r5, r3\n\t"
  116386. #ifdef WOLFSSL_KEIL
  116387. "ands r5, r5, r6\n\t"
  116388. #elif defined(__clang__)
  116389. "ands r5, r6\n\t"
  116390. #else
  116391. "and r5, r6\n\t"
  116392. #endif
  116393. "cmp r5, #0\n\t"
  116394. "beq L_sp_384_num_bits_12_70_%=\n\t"
  116395. "movs r2, #0xa0\n\t"
  116396. "ldrb r4, [%[table], r5]\n\t"
  116397. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116398. "adds r2, r2, r4\n\t"
  116399. #else
  116400. "add r2, r2, r4\n\t"
  116401. #endif
  116402. "b L_sp_384_num_bits_12_13_%=\n\t"
  116403. "\n"
  116404. "L_sp_384_num_bits_12_70_%=:\n\t"
  116405. "b L_sp_384_num_bits_12_13_%=\n\t"
  116406. "\n"
  116407. "L_sp_384_num_bits_12_5_%=:\n\t"
  116408. "ldr r3, [%[a], #16]\n\t"
  116409. "cmp r3, #0\n\t"
  116410. "beq L_sp_384_num_bits_12_4_%=\n\t"
  116411. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116412. "lsrs r5, r3, #24\n\t"
  116413. #else
  116414. "lsr r5, r3, #24\n\t"
  116415. #endif
  116416. "cmp r5, #0\n\t"
  116417. "beq L_sp_384_num_bits_12_63_%=\n\t"
  116418. "movs r2, #0x98\n\t"
  116419. "ldrb r4, [%[table], r5]\n\t"
  116420. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116421. "adds r2, r2, r4\n\t"
  116422. #else
  116423. "add r2, r2, r4\n\t"
  116424. #endif
  116425. "b L_sp_384_num_bits_12_13_%=\n\t"
  116426. "\n"
  116427. "L_sp_384_num_bits_12_63_%=:\n\t"
  116428. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116429. "lsrs r5, r3, #16\n\t"
  116430. #else
  116431. "lsr r5, r3, #16\n\t"
  116432. #endif
  116433. #ifdef WOLFSSL_KEIL
  116434. "ands r5, r5, r6\n\t"
  116435. #elif defined(__clang__)
  116436. "ands r5, r6\n\t"
  116437. #else
  116438. "and r5, r6\n\t"
  116439. #endif
  116440. "cmp r5, #0\n\t"
  116441. "beq L_sp_384_num_bits_12_62_%=\n\t"
  116442. "movs r2, #0x90\n\t"
  116443. "ldrb r4, [%[table], r5]\n\t"
  116444. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116445. "adds r2, r2, r4\n\t"
  116446. #else
  116447. "add r2, r2, r4\n\t"
  116448. #endif
  116449. "b L_sp_384_num_bits_12_13_%=\n\t"
  116450. "\n"
  116451. "L_sp_384_num_bits_12_62_%=:\n\t"
  116452. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116453. "lsrs r5, r3, #8\n\t"
  116454. #else
  116455. "lsr r5, r3, #8\n\t"
  116456. #endif
  116457. #ifdef WOLFSSL_KEIL
  116458. "ands r5, r5, r6\n\t"
  116459. #elif defined(__clang__)
  116460. "ands r5, r6\n\t"
  116461. #else
  116462. "and r5, r6\n\t"
  116463. #endif
  116464. "cmp r5, #0\n\t"
  116465. "beq L_sp_384_num_bits_12_61_%=\n\t"
  116466. "movs r2, #0x88\n\t"
  116467. "ldrb r4, [%[table], r5]\n\t"
  116468. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116469. "adds r2, r2, r4\n\t"
  116470. #else
  116471. "add r2, r2, r4\n\t"
  116472. #endif
  116473. "b L_sp_384_num_bits_12_13_%=\n\t"
  116474. "\n"
  116475. "L_sp_384_num_bits_12_61_%=:\n\t"
  116476. "movs r5, r3\n\t"
  116477. #ifdef WOLFSSL_KEIL
  116478. "ands r5, r5, r6\n\t"
  116479. #elif defined(__clang__)
  116480. "ands r5, r6\n\t"
  116481. #else
  116482. "and r5, r6\n\t"
  116483. #endif
  116484. "cmp r5, #0\n\t"
  116485. "beq L_sp_384_num_bits_12_60_%=\n\t"
  116486. "movs r2, #0x80\n\t"
  116487. "ldrb r4, [%[table], r5]\n\t"
  116488. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116489. "adds r2, r2, r4\n\t"
  116490. #else
  116491. "add r2, r2, r4\n\t"
  116492. #endif
  116493. "b L_sp_384_num_bits_12_13_%=\n\t"
  116494. "\n"
  116495. "L_sp_384_num_bits_12_60_%=:\n\t"
  116496. "b L_sp_384_num_bits_12_13_%=\n\t"
  116497. "\n"
  116498. "L_sp_384_num_bits_12_4_%=:\n\t"
  116499. "ldr r3, [%[a], #12]\n\t"
  116500. "cmp r3, #0\n\t"
  116501. "beq L_sp_384_num_bits_12_3_%=\n\t"
  116502. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116503. "lsrs r5, r3, #24\n\t"
  116504. #else
  116505. "lsr r5, r3, #24\n\t"
  116506. #endif
  116507. "cmp r5, #0\n\t"
  116508. "beq L_sp_384_num_bits_12_53_%=\n\t"
  116509. "movs r2, #0x78\n\t"
  116510. "ldrb r4, [%[table], r5]\n\t"
  116511. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116512. "adds r2, r2, r4\n\t"
  116513. #else
  116514. "add r2, r2, r4\n\t"
  116515. #endif
  116516. "b L_sp_384_num_bits_12_13_%=\n\t"
  116517. "\n"
  116518. "L_sp_384_num_bits_12_53_%=:\n\t"
  116519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116520. "lsrs r5, r3, #16\n\t"
  116521. #else
  116522. "lsr r5, r3, #16\n\t"
  116523. #endif
  116524. #ifdef WOLFSSL_KEIL
  116525. "ands r5, r5, r6\n\t"
  116526. #elif defined(__clang__)
  116527. "ands r5, r6\n\t"
  116528. #else
  116529. "and r5, r6\n\t"
  116530. #endif
  116531. "cmp r5, #0\n\t"
  116532. "beq L_sp_384_num_bits_12_52_%=\n\t"
  116533. "movs r2, #0x70\n\t"
  116534. "ldrb r4, [%[table], r5]\n\t"
  116535. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116536. "adds r2, r2, r4\n\t"
  116537. #else
  116538. "add r2, r2, r4\n\t"
  116539. #endif
  116540. "b L_sp_384_num_bits_12_13_%=\n\t"
  116541. "\n"
  116542. "L_sp_384_num_bits_12_52_%=:\n\t"
  116543. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116544. "lsrs r5, r3, #8\n\t"
  116545. #else
  116546. "lsr r5, r3, #8\n\t"
  116547. #endif
  116548. #ifdef WOLFSSL_KEIL
  116549. "ands r5, r5, r6\n\t"
  116550. #elif defined(__clang__)
  116551. "ands r5, r6\n\t"
  116552. #else
  116553. "and r5, r6\n\t"
  116554. #endif
  116555. "cmp r5, #0\n\t"
  116556. "beq L_sp_384_num_bits_12_51_%=\n\t"
  116557. "movs r2, #0x68\n\t"
  116558. "ldrb r4, [%[table], r5]\n\t"
  116559. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116560. "adds r2, r2, r4\n\t"
  116561. #else
  116562. "add r2, r2, r4\n\t"
  116563. #endif
  116564. "b L_sp_384_num_bits_12_13_%=\n\t"
  116565. "\n"
  116566. "L_sp_384_num_bits_12_51_%=:\n\t"
  116567. "movs r5, r3\n\t"
  116568. #ifdef WOLFSSL_KEIL
  116569. "ands r5, r5, r6\n\t"
  116570. #elif defined(__clang__)
  116571. "ands r5, r6\n\t"
  116572. #else
  116573. "and r5, r6\n\t"
  116574. #endif
  116575. "cmp r5, #0\n\t"
  116576. "beq L_sp_384_num_bits_12_50_%=\n\t"
  116577. "movs r2, #0x60\n\t"
  116578. "ldrb r4, [%[table], r5]\n\t"
  116579. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116580. "adds r2, r2, r4\n\t"
  116581. #else
  116582. "add r2, r2, r4\n\t"
  116583. #endif
  116584. "b L_sp_384_num_bits_12_13_%=\n\t"
  116585. "\n"
  116586. "L_sp_384_num_bits_12_50_%=:\n\t"
  116587. "b L_sp_384_num_bits_12_13_%=\n\t"
  116588. "\n"
  116589. "L_sp_384_num_bits_12_3_%=:\n\t"
  116590. "ldr r3, [%[a], #8]\n\t"
  116591. "cmp r3, #0\n\t"
  116592. "beq L_sp_384_num_bits_12_2_%=\n\t"
  116593. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116594. "lsrs r5, r3, #24\n\t"
  116595. #else
  116596. "lsr r5, r3, #24\n\t"
  116597. #endif
  116598. "cmp r5, #0\n\t"
  116599. "beq L_sp_384_num_bits_12_43_%=\n\t"
  116600. "movs r2, #0x58\n\t"
  116601. "ldrb r4, [%[table], r5]\n\t"
  116602. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116603. "adds r2, r2, r4\n\t"
  116604. #else
  116605. "add r2, r2, r4\n\t"
  116606. #endif
  116607. "b L_sp_384_num_bits_12_13_%=\n\t"
  116608. "\n"
  116609. "L_sp_384_num_bits_12_43_%=:\n\t"
  116610. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116611. "lsrs r5, r3, #16\n\t"
  116612. #else
  116613. "lsr r5, r3, #16\n\t"
  116614. #endif
  116615. #ifdef WOLFSSL_KEIL
  116616. "ands r5, r5, r6\n\t"
  116617. #elif defined(__clang__)
  116618. "ands r5, r6\n\t"
  116619. #else
  116620. "and r5, r6\n\t"
  116621. #endif
  116622. "cmp r5, #0\n\t"
  116623. "beq L_sp_384_num_bits_12_42_%=\n\t"
  116624. "movs r2, #0x50\n\t"
  116625. "ldrb r4, [%[table], r5]\n\t"
  116626. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116627. "adds r2, r2, r4\n\t"
  116628. #else
  116629. "add r2, r2, r4\n\t"
  116630. #endif
  116631. "b L_sp_384_num_bits_12_13_%=\n\t"
  116632. "\n"
  116633. "L_sp_384_num_bits_12_42_%=:\n\t"
  116634. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116635. "lsrs r5, r3, #8\n\t"
  116636. #else
  116637. "lsr r5, r3, #8\n\t"
  116638. #endif
  116639. #ifdef WOLFSSL_KEIL
  116640. "ands r5, r5, r6\n\t"
  116641. #elif defined(__clang__)
  116642. "ands r5, r6\n\t"
  116643. #else
  116644. "and r5, r6\n\t"
  116645. #endif
  116646. "cmp r5, #0\n\t"
  116647. "beq L_sp_384_num_bits_12_41_%=\n\t"
  116648. "movs r2, #0x48\n\t"
  116649. "ldrb r4, [%[table], r5]\n\t"
  116650. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116651. "adds r2, r2, r4\n\t"
  116652. #else
  116653. "add r2, r2, r4\n\t"
  116654. #endif
  116655. "b L_sp_384_num_bits_12_13_%=\n\t"
  116656. "\n"
  116657. "L_sp_384_num_bits_12_41_%=:\n\t"
  116658. "movs r5, r3\n\t"
  116659. #ifdef WOLFSSL_KEIL
  116660. "ands r5, r5, r6\n\t"
  116661. #elif defined(__clang__)
  116662. "ands r5, r6\n\t"
  116663. #else
  116664. "and r5, r6\n\t"
  116665. #endif
  116666. "cmp r5, #0\n\t"
  116667. "beq L_sp_384_num_bits_12_40_%=\n\t"
  116668. "movs r2, #0x40\n\t"
  116669. "ldrb r4, [%[table], r5]\n\t"
  116670. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116671. "adds r2, r2, r4\n\t"
  116672. #else
  116673. "add r2, r2, r4\n\t"
  116674. #endif
  116675. "b L_sp_384_num_bits_12_13_%=\n\t"
  116676. "\n"
  116677. "L_sp_384_num_bits_12_40_%=:\n\t"
  116678. "b L_sp_384_num_bits_12_13_%=\n\t"
  116679. "\n"
  116680. "L_sp_384_num_bits_12_2_%=:\n\t"
  116681. "ldr r3, [%[a], #4]\n\t"
  116682. "cmp r3, #0\n\t"
  116683. "beq L_sp_384_num_bits_12_1_%=\n\t"
  116684. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116685. "lsrs r5, r3, #24\n\t"
  116686. #else
  116687. "lsr r5, r3, #24\n\t"
  116688. #endif
  116689. "cmp r5, #0\n\t"
  116690. "beq L_sp_384_num_bits_12_33_%=\n\t"
  116691. "movs r2, #56\n\t"
  116692. "ldrb r4, [%[table], r5]\n\t"
  116693. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116694. "adds r2, r2, r4\n\t"
  116695. #else
  116696. "add r2, r2, r4\n\t"
  116697. #endif
  116698. "b L_sp_384_num_bits_12_13_%=\n\t"
  116699. "\n"
  116700. "L_sp_384_num_bits_12_33_%=:\n\t"
  116701. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116702. "lsrs r5, r3, #16\n\t"
  116703. #else
  116704. "lsr r5, r3, #16\n\t"
  116705. #endif
  116706. #ifdef WOLFSSL_KEIL
  116707. "ands r5, r5, r6\n\t"
  116708. #elif defined(__clang__)
  116709. "ands r5, r6\n\t"
  116710. #else
  116711. "and r5, r6\n\t"
  116712. #endif
  116713. "cmp r5, #0\n\t"
  116714. "beq L_sp_384_num_bits_12_32_%=\n\t"
  116715. "movs r2, #48\n\t"
  116716. "ldrb r4, [%[table], r5]\n\t"
  116717. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116718. "adds r2, r2, r4\n\t"
  116719. #else
  116720. "add r2, r2, r4\n\t"
  116721. #endif
  116722. "b L_sp_384_num_bits_12_13_%=\n\t"
  116723. "\n"
  116724. "L_sp_384_num_bits_12_32_%=:\n\t"
  116725. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116726. "lsrs r5, r3, #8\n\t"
  116727. #else
  116728. "lsr r5, r3, #8\n\t"
  116729. #endif
  116730. #ifdef WOLFSSL_KEIL
  116731. "ands r5, r5, r6\n\t"
  116732. #elif defined(__clang__)
  116733. "ands r5, r6\n\t"
  116734. #else
  116735. "and r5, r6\n\t"
  116736. #endif
  116737. "cmp r5, #0\n\t"
  116738. "beq L_sp_384_num_bits_12_31_%=\n\t"
  116739. "movs r2, #40\n\t"
  116740. "ldrb r4, [%[table], r5]\n\t"
  116741. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116742. "adds r2, r2, r4\n\t"
  116743. #else
  116744. "add r2, r2, r4\n\t"
  116745. #endif
  116746. "b L_sp_384_num_bits_12_13_%=\n\t"
  116747. "\n"
  116748. "L_sp_384_num_bits_12_31_%=:\n\t"
  116749. "movs r5, r3\n\t"
  116750. #ifdef WOLFSSL_KEIL
  116751. "ands r5, r5, r6\n\t"
  116752. #elif defined(__clang__)
  116753. "ands r5, r6\n\t"
  116754. #else
  116755. "and r5, r6\n\t"
  116756. #endif
  116757. "cmp r5, #0\n\t"
  116758. "beq L_sp_384_num_bits_12_30_%=\n\t"
  116759. "movs r2, #32\n\t"
  116760. "ldrb r4, [%[table], r5]\n\t"
  116761. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116762. "adds r2, r2, r4\n\t"
  116763. #else
  116764. "add r2, r2, r4\n\t"
  116765. #endif
  116766. "b L_sp_384_num_bits_12_13_%=\n\t"
  116767. "\n"
  116768. "L_sp_384_num_bits_12_30_%=:\n\t"
  116769. "b L_sp_384_num_bits_12_13_%=\n\t"
  116770. "\n"
  116771. "L_sp_384_num_bits_12_1_%=:\n\t"
  116772. "ldr r3, [%[a]]\n\t"
  116773. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116774. "lsrs r5, r3, #24\n\t"
  116775. #else
  116776. "lsr r5, r3, #24\n\t"
  116777. #endif
  116778. "cmp r5, #0\n\t"
  116779. "beq L_sp_384_num_bits_12_23_%=\n\t"
  116780. "movs r2, #24\n\t"
  116781. "ldrb r4, [%[table], r5]\n\t"
  116782. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116783. "adds r2, r2, r4\n\t"
  116784. #else
  116785. "add r2, r2, r4\n\t"
  116786. #endif
  116787. "b L_sp_384_num_bits_12_13_%=\n\t"
  116788. "\n"
  116789. "L_sp_384_num_bits_12_23_%=:\n\t"
  116790. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116791. "lsrs r5, r3, #16\n\t"
  116792. #else
  116793. "lsr r5, r3, #16\n\t"
  116794. #endif
  116795. #ifdef WOLFSSL_KEIL
  116796. "ands r5, r5, r6\n\t"
  116797. #elif defined(__clang__)
  116798. "ands r5, r6\n\t"
  116799. #else
  116800. "and r5, r6\n\t"
  116801. #endif
  116802. "cmp r5, #0\n\t"
  116803. "beq L_sp_384_num_bits_12_22_%=\n\t"
  116804. "movs r2, #16\n\t"
  116805. "ldrb r4, [%[table], r5]\n\t"
  116806. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116807. "adds r2, r2, r4\n\t"
  116808. #else
  116809. "add r2, r2, r4\n\t"
  116810. #endif
  116811. "b L_sp_384_num_bits_12_13_%=\n\t"
  116812. "\n"
  116813. "L_sp_384_num_bits_12_22_%=:\n\t"
  116814. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116815. "lsrs r5, r3, #8\n\t"
  116816. #else
  116817. "lsr r5, r3, #8\n\t"
  116818. #endif
  116819. #ifdef WOLFSSL_KEIL
  116820. "ands r5, r5, r6\n\t"
  116821. #elif defined(__clang__)
  116822. "ands r5, r6\n\t"
  116823. #else
  116824. "and r5, r6\n\t"
  116825. #endif
  116826. "cmp r5, #0\n\t"
  116827. "beq L_sp_384_num_bits_12_21_%=\n\t"
  116828. "movs r2, #8\n\t"
  116829. "ldrb r4, [%[table], r5]\n\t"
  116830. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116831. "adds r2, r2, r4\n\t"
  116832. #else
  116833. "add r2, r2, r4\n\t"
  116834. #endif
  116835. "b L_sp_384_num_bits_12_13_%=\n\t"
  116836. "\n"
  116837. "L_sp_384_num_bits_12_21_%=:\n\t"
  116838. "movs r5, r3\n\t"
  116839. #ifdef WOLFSSL_KEIL
  116840. "ands r5, r5, r6\n\t"
  116841. #elif defined(__clang__)
  116842. "ands r5, r6\n\t"
  116843. #else
  116844. "and r5, r6\n\t"
  116845. #endif
  116846. "cmp r5, #0\n\t"
  116847. "beq L_sp_384_num_bits_12_20_%=\n\t"
  116848. "movs r2, #0\n\t"
  116849. "ldrb r4, [%[table], r5]\n\t"
  116850. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116851. "adds r2, r2, r4\n\t"
  116852. #else
  116853. "add r2, r2, r4\n\t"
  116854. #endif
  116855. "b L_sp_384_num_bits_12_13_%=\n\t"
  116856. "\n"
  116857. "L_sp_384_num_bits_12_20_%=:\n\t"
  116858. "\n"
  116859. "L_sp_384_num_bits_12_13_%=:\n\t"
  116860. "movs %[a], r2\n\t"
  116861. : [a] "+l" (a), [table] "+l" (table)
  116862. :
  116863. : "memory", "r2", "r3", "r4", "r5", "r6"
  116864. );
  116865. return (uint32_t)(size_t)a;
  116866. }
  116867. /* Non-constant time modular inversion.
  116868. *
  116869. * @param [out] r Resulting number.
  116870. * @param [in] a Number to invert.
  116871. * @param [in] m Modulus.
  116872. * @return MP_OKAY on success.
  116873. */
  116874. static int sp_384_mod_inv_12(sp_digit* r, const sp_digit* a, const sp_digit* m)
  116875. {
  116876. sp_digit u[12];
  116877. sp_digit v[12];
  116878. sp_digit b[12];
  116879. sp_digit d[12];
  116880. int ut, vt;
  116881. sp_digit o;
  116882. XMEMCPY(u, m, sizeof(u));
  116883. XMEMCPY(v, a, sizeof(v));
  116884. ut = sp_384_num_bits_12(u);
  116885. vt = sp_384_num_bits_12(v);
  116886. XMEMSET(b, 0, sizeof(b));
  116887. if ((v[0] & 1) == 0) {
  116888. sp_384_rshift1_12(v, v);
  116889. XMEMCPY(d, m, sizeof(u));
  116890. d[0] += 1;
  116891. sp_384_rshift1_12(d, d);
  116892. vt--;
  116893. while ((v[0] & 1) == 0) {
  116894. sp_384_rshift1_12(v, v);
  116895. sp_384_div2_mod_12(d, d, m);
  116896. vt--;
  116897. }
  116898. }
  116899. else {
  116900. XMEMSET(d+1, 0, sizeof(d)-sizeof(sp_digit));
  116901. d[0] = 1;
  116902. }
  116903. while (ut > 1 && vt > 1) {
  116904. if (ut > vt || (ut == vt && sp_384_cmp_12(u, v) >= 0)) {
  116905. sp_384_sub_12(u, u, v);
  116906. o = sp_384_sub_12(b, b, d);
  116907. if (o != 0)
  116908. sp_384_add_12(b, b, m);
  116909. ut = sp_384_num_bits_12(u);
  116910. do {
  116911. sp_384_rshift1_12(u, u);
  116912. sp_384_div2_mod_12(b, b, m);
  116913. ut--;
  116914. }
  116915. while (ut > 0 && (u[0] & 1) == 0);
  116916. }
  116917. else {
  116918. sp_384_sub_12(v, v, u);
  116919. o = sp_384_sub_12(d, d, b);
  116920. if (o != 0)
  116921. sp_384_add_12(d, d, m);
  116922. vt = sp_384_num_bits_12(v);
  116923. do {
  116924. sp_384_rshift1_12(v, v);
  116925. sp_384_div2_mod_12(d, d, m);
  116926. vt--;
  116927. }
  116928. while (vt > 0 && (v[0] & 1) == 0);
  116929. }
  116930. }
  116931. if (ut == 1)
  116932. XMEMCPY(r, b, sizeof(b));
  116933. else
  116934. XMEMCPY(r, d, sizeof(d));
  116935. return MP_OKAY;
  116936. }
  116937. #endif /* WOLFSSL_SP_SMALL */
  116938. /* Add point p1 into point p2. Handles p1 == p2 and result at infinity.
  116939. *
  116940. * p1 First point to add and holds result.
  116941. * p2 Second point to add.
  116942. * tmp Temporary storage for intermediate numbers.
  116943. */
  116944. static void sp_384_add_points_12(sp_point_384* p1, const sp_point_384* p2,
  116945. sp_digit* tmp)
  116946. {
  116947. sp_384_proj_point_add_12(p1, p1, p2, tmp);
  116948. if (sp_384_iszero_12(p1->z)) {
  116949. if (sp_384_iszero_12(p1->x) && sp_384_iszero_12(p1->y)) {
  116950. sp_384_proj_point_dbl_12(p1, p2, tmp);
  116951. }
  116952. else {
  116953. /* Y ordinate is not used from here - don't set. */
  116954. p1->x[0] = 0;
  116955. p1->x[1] = 0;
  116956. p1->x[2] = 0;
  116957. p1->x[3] = 0;
  116958. p1->x[4] = 0;
  116959. p1->x[5] = 0;
  116960. p1->x[6] = 0;
  116961. p1->x[7] = 0;
  116962. p1->x[8] = 0;
  116963. p1->x[9] = 0;
  116964. p1->x[10] = 0;
  116965. p1->x[11] = 0;
  116966. XMEMCPY(p1->z, p384_norm_mod, sizeof(p384_norm_mod));
  116967. }
  116968. }
  116969. }
  116970. /* Calculate the verification point: [e/s]G + [r/s]Q
  116971. *
  116972. * p1 Calculated point.
  116973. * p2 Public point and temporary.
  116974. * s Second part of signature as a number.
  116975. * u1 Temporary number.
  116976. * u2 Temproray number.
  116977. * heap Heap to use for allocation.
  116978. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  116979. */
  116980. static int sp_384_calc_vfy_point_12(sp_point_384* p1, sp_point_384* p2,
  116981. sp_digit* s, sp_digit* u1, sp_digit* u2, sp_digit* tmp, void* heap)
  116982. {
  116983. int err;
  116984. #ifndef WOLFSSL_SP_SMALL
  116985. err = sp_384_mod_inv_12(s, s, p384_order);
  116986. if (err == MP_OKAY)
  116987. #endif /* !WOLFSSL_SP_SMALL */
  116988. {
  116989. sp_384_mul_12(s, s, p384_norm_order);
  116990. err = sp_384_mod_12(s, s, p384_order);
  116991. }
  116992. if (err == MP_OKAY) {
  116993. sp_384_norm_12(s);
  116994. #ifdef WOLFSSL_SP_SMALL
  116995. {
  116996. sp_384_mont_inv_order_12(s, s, tmp);
  116997. sp_384_mont_mul_order_12(u1, u1, s);
  116998. sp_384_mont_mul_order_12(u2, u2, s);
  116999. }
  117000. #else
  117001. {
  117002. sp_384_mont_mul_order_12(u1, u1, s);
  117003. sp_384_mont_mul_order_12(u2, u2, s);
  117004. }
  117005. #endif /* WOLFSSL_SP_SMALL */
  117006. {
  117007. err = sp_384_ecc_mulmod_base_12(p1, u1, 0, 0, heap);
  117008. }
  117009. }
  117010. if ((err == MP_OKAY) && sp_384_iszero_12(p1->z)) {
  117011. p1->infinity = 1;
  117012. }
  117013. if (err == MP_OKAY) {
  117014. err = sp_384_ecc_mulmod_12(p2, p2, u2, 0, 0, heap);
  117015. }
  117016. if ((err == MP_OKAY) && sp_384_iszero_12(p2->z)) {
  117017. p2->infinity = 1;
  117018. }
  117019. if (err == MP_OKAY) {
  117020. sp_384_add_points_12(p1, p2, tmp);
  117021. }
  117022. return err;
  117023. }
  117024. #ifdef HAVE_ECC_VERIFY
  117025. /* Verify the signature values with the hash and public key.
  117026. * e = Truncate(hash, 384)
  117027. * u1 = e/s mod order
  117028. * u2 = r/s mod order
  117029. * r == (u1.G + u2.Q)->x mod order
  117030. * Optimization: Leave point in projective form.
  117031. * (x, y, 1) == (x' / z'*z', y' / z'*z'*z', z' / z')
  117032. * (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x'
  117033. * The hash is truncated to the first 384 bits.
  117034. *
  117035. * hash Hash to sign.
  117036. * hashLen Length of the hash data.
  117037. * rng Random number generator.
  117038. * priv Private part of key - scalar.
  117039. * rm First part of result as an mp_int.
  117040. * sm Sirst part of result as an mp_int.
  117041. * heap Heap to use for allocation.
  117042. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  117043. */
  117044. int sp_ecc_verify_384(const byte* hash, word32 hashLen, const mp_int* pX,
  117045. const mp_int* pY, const mp_int* pZ, const mp_int* rm, const mp_int* sm,
  117046. int* res, void* heap)
  117047. {
  117048. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117049. sp_digit* u1 = NULL;
  117050. sp_point_384* p1 = NULL;
  117051. #else
  117052. sp_digit u1[18 * 12];
  117053. sp_point_384 p1[2];
  117054. #endif
  117055. sp_digit* u2 = NULL;
  117056. sp_digit* s = NULL;
  117057. sp_digit* tmp = NULL;
  117058. sp_point_384* p2 = NULL;
  117059. sp_digit carry;
  117060. sp_int32 c = 0;
  117061. int err = MP_OKAY;
  117062. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117063. if (err == MP_OKAY) {
  117064. p1 = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap,
  117065. DYNAMIC_TYPE_ECC);
  117066. if (p1 == NULL)
  117067. err = MEMORY_E;
  117068. }
  117069. if (err == MP_OKAY) {
  117070. u1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 18 * 12, heap,
  117071. DYNAMIC_TYPE_ECC);
  117072. if (u1 == NULL)
  117073. err = MEMORY_E;
  117074. }
  117075. #endif
  117076. if (err == MP_OKAY) {
  117077. u2 = u1 + 2 * 12;
  117078. s = u1 + 4 * 12;
  117079. tmp = u1 + 6 * 12;
  117080. p2 = p1 + 1;
  117081. if (hashLen > 48U) {
  117082. hashLen = 48U;
  117083. }
  117084. sp_384_from_bin(u1, 12, hash, (int)hashLen);
  117085. sp_384_from_mp(u2, 12, rm);
  117086. sp_384_from_mp(s, 12, sm);
  117087. sp_384_from_mp(p2->x, 12, pX);
  117088. sp_384_from_mp(p2->y, 12, pY);
  117089. sp_384_from_mp(p2->z, 12, pZ);
  117090. err = sp_384_calc_vfy_point_12(p1, p2, s, u1, u2, tmp, heap);
  117091. }
  117092. if (err == MP_OKAY) {
  117093. /* (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x' */
  117094. /* Reload r and convert to Montgomery form. */
  117095. sp_384_from_mp(u2, 12, rm);
  117096. err = sp_384_mod_mul_norm_12(u2, u2, p384_mod);
  117097. }
  117098. if (err == MP_OKAY) {
  117099. /* u1 = r.z'.z' mod prime */
  117100. sp_384_mont_sqr_12(p1->z, p1->z, p384_mod, p384_mp_mod);
  117101. sp_384_mont_mul_12(u1, u2, p1->z, p384_mod, p384_mp_mod);
  117102. *res = (int)(sp_384_cmp_12(p1->x, u1) == 0);
  117103. if (*res == 0) {
  117104. /* Reload r and add order. */
  117105. sp_384_from_mp(u2, 12, rm);
  117106. carry = sp_384_add_12(u2, u2, p384_order);
  117107. /* Carry means result is greater than mod and is not valid. */
  117108. if (carry == 0) {
  117109. sp_384_norm_12(u2);
  117110. /* Compare with mod and if greater or equal then not valid. */
  117111. c = sp_384_cmp_12(u2, p384_mod);
  117112. }
  117113. }
  117114. if ((*res == 0) && (c < 0)) {
  117115. /* Convert to Montogomery form */
  117116. err = sp_384_mod_mul_norm_12(u2, u2, p384_mod);
  117117. if (err == MP_OKAY) {
  117118. /* u1 = (r + 1*order).z'.z' mod prime */
  117119. {
  117120. sp_384_mont_mul_12(u1, u2, p1->z, p384_mod, p384_mp_mod);
  117121. }
  117122. *res = (sp_384_cmp_12(p1->x, u1) == 0);
  117123. }
  117124. }
  117125. }
  117126. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117127. if (u1 != NULL)
  117128. XFREE(u1, heap, DYNAMIC_TYPE_ECC);
  117129. if (p1 != NULL)
  117130. XFREE(p1, heap, DYNAMIC_TYPE_ECC);
  117131. #endif
  117132. return err;
  117133. }
  117134. #ifdef WOLFSSL_SP_NONBLOCK
  117135. typedef struct sp_ecc_verify_384_ctx {
  117136. int state;
  117137. union {
  117138. sp_384_ecc_mulmod_12_ctx mulmod_ctx;
  117139. sp_384_mont_inv_order_12_ctx mont_inv_order_ctx;
  117140. sp_384_proj_point_dbl_12_ctx dbl_ctx;
  117141. sp_384_proj_point_add_12_ctx add_ctx;
  117142. };
  117143. sp_digit u1[2*12];
  117144. sp_digit u2[2*12];
  117145. sp_digit s[2*12];
  117146. sp_digit tmp[2*12 * 6];
  117147. sp_point_384 p1;
  117148. sp_point_384 p2;
  117149. } sp_ecc_verify_384_ctx;
  117150. int sp_ecc_verify_384_nb(sp_ecc_ctx_t* sp_ctx, const byte* hash,
  117151. word32 hashLen, const mp_int* pX, const mp_int* pY, const mp_int* pZ,
  117152. const mp_int* rm, const mp_int* sm, int* res, void* heap)
  117153. {
  117154. int err = FP_WOULDBLOCK;
  117155. sp_ecc_verify_384_ctx* ctx = (sp_ecc_verify_384_ctx*)sp_ctx->data;
  117156. typedef char ctx_size_test[sizeof(sp_ecc_verify_384_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  117157. (void)sizeof(ctx_size_test);
  117158. switch (ctx->state) {
  117159. case 0: /* INIT */
  117160. if (hashLen > 48U) {
  117161. hashLen = 48U;
  117162. }
  117163. sp_384_from_bin(ctx->u1, 12, hash, (int)hashLen);
  117164. sp_384_from_mp(ctx->u2, 12, rm);
  117165. sp_384_from_mp(ctx->s, 12, sm);
  117166. sp_384_from_mp(ctx->p2.x, 12, pX);
  117167. sp_384_from_mp(ctx->p2.y, 12, pY);
  117168. sp_384_from_mp(ctx->p2.z, 12, pZ);
  117169. ctx->state = 1;
  117170. break;
  117171. case 1: /* NORMS0 */
  117172. sp_384_mul_12(ctx->s, ctx->s, p384_norm_order);
  117173. err = sp_384_mod_12(ctx->s, ctx->s, p384_order);
  117174. if (err == MP_OKAY)
  117175. ctx->state = 2;
  117176. break;
  117177. case 2: /* NORMS1 */
  117178. sp_384_norm_12(ctx->s);
  117179. XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
  117180. ctx->state = 3;
  117181. break;
  117182. case 3: /* NORMS2 */
  117183. err = sp_384_mont_inv_order_12_nb((sp_ecc_ctx_t*)&ctx->mont_inv_order_ctx, ctx->s, ctx->s, ctx->tmp);
  117184. if (err == MP_OKAY) {
  117185. ctx->state = 4;
  117186. }
  117187. break;
  117188. case 4: /* NORMS3 */
  117189. sp_384_mont_mul_order_12(ctx->u1, ctx->u1, ctx->s);
  117190. ctx->state = 5;
  117191. break;
  117192. case 5: /* NORMS4 */
  117193. sp_384_mont_mul_order_12(ctx->u2, ctx->u2, ctx->s);
  117194. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  117195. ctx->state = 6;
  117196. break;
  117197. case 6: /* MULBASE */
  117198. err = sp_384_ecc_mulmod_12_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx, &ctx->p1, &p384_base, ctx->u1, 0, 0, heap);
  117199. if (err == MP_OKAY) {
  117200. if (sp_384_iszero_12(ctx->p1.z)) {
  117201. ctx->p1.infinity = 1;
  117202. }
  117203. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  117204. ctx->state = 7;
  117205. }
  117206. break;
  117207. case 7: /* MULMOD */
  117208. err = sp_384_ecc_mulmod_12_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx, &ctx->p2, &ctx->p2, ctx->u2, 0, 0, heap);
  117209. if (err == MP_OKAY) {
  117210. if (sp_384_iszero_12(ctx->p2.z)) {
  117211. ctx->p2.infinity = 1;
  117212. }
  117213. XMEMSET(&ctx->add_ctx, 0, sizeof(ctx->add_ctx));
  117214. ctx->state = 8;
  117215. }
  117216. break;
  117217. case 8: /* ADD */
  117218. err = sp_384_proj_point_add_12_nb((sp_ecc_ctx_t*)&ctx->add_ctx, &ctx->p1, &ctx->p1, &ctx->p2, ctx->tmp);
  117219. if (err == MP_OKAY)
  117220. ctx->state = 9;
  117221. break;
  117222. case 9: /* MONT */
  117223. /* (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x' */
  117224. /* Reload r and convert to Montgomery form. */
  117225. sp_384_from_mp(ctx->u2, 12, rm);
  117226. err = sp_384_mod_mul_norm_12(ctx->u2, ctx->u2, p384_mod);
  117227. if (err == MP_OKAY)
  117228. ctx->state = 10;
  117229. break;
  117230. case 10: /* SQR */
  117231. /* u1 = r.z'.z' mod prime */
  117232. sp_384_mont_sqr_12(ctx->p1.z, ctx->p1.z, p384_mod, p384_mp_mod);
  117233. ctx->state = 11;
  117234. break;
  117235. case 11: /* MUL */
  117236. sp_384_mont_mul_12(ctx->u1, ctx->u2, ctx->p1.z, p384_mod, p384_mp_mod);
  117237. ctx->state = 12;
  117238. break;
  117239. case 12: /* RES */
  117240. {
  117241. sp_int32 c = 0;
  117242. err = MP_OKAY; /* math okay, now check result */
  117243. *res = (int)(sp_384_cmp_12(ctx->p1.x, ctx->u1) == 0);
  117244. if (*res == 0) {
  117245. sp_digit carry;
  117246. /* Reload r and add order. */
  117247. sp_384_from_mp(ctx->u2, 12, rm);
  117248. carry = sp_384_add_12(ctx->u2, ctx->u2, p384_order);
  117249. /* Carry means result is greater than mod and is not valid. */
  117250. if (carry == 0) {
  117251. sp_384_norm_12(ctx->u2);
  117252. /* Compare with mod and if greater or equal then not valid. */
  117253. c = sp_384_cmp_12(ctx->u2, p384_mod);
  117254. }
  117255. }
  117256. if ((*res == 0) && (c < 0)) {
  117257. /* Convert to Montogomery form */
  117258. err = sp_384_mod_mul_norm_12(ctx->u2, ctx->u2, p384_mod);
  117259. if (err == MP_OKAY) {
  117260. /* u1 = (r + 1*order).z'.z' mod prime */
  117261. sp_384_mont_mul_12(ctx->u1, ctx->u2, ctx->p1.z, p384_mod,
  117262. p384_mp_mod);
  117263. *res = (int)(sp_384_cmp_12(ctx->p1.x, ctx->u1) == 0);
  117264. }
  117265. }
  117266. break;
  117267. }
  117268. } /* switch */
  117269. if (err == MP_OKAY && ctx->state != 12) {
  117270. err = FP_WOULDBLOCK;
  117271. }
  117272. return err;
  117273. }
  117274. #endif /* WOLFSSL_SP_NONBLOCK */
  117275. #endif /* HAVE_ECC_VERIFY */
  117276. #ifdef HAVE_ECC_CHECK_KEY
  117277. /* Check that the x and y oridinates are a valid point on the curve.
  117278. *
  117279. * point EC point.
  117280. * heap Heap to use if dynamically allocating.
  117281. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  117282. * not on the curve and MP_OKAY otherwise.
  117283. */
  117284. static int sp_384_ecc_is_point_12(const sp_point_384* point,
  117285. void* heap)
  117286. {
  117287. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117288. sp_digit* t1 = NULL;
  117289. #else
  117290. sp_digit t1[12 * 4];
  117291. #endif
  117292. sp_digit* t2 = NULL;
  117293. int err = MP_OKAY;
  117294. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117295. t1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 12 * 4, heap, DYNAMIC_TYPE_ECC);
  117296. if (t1 == NULL)
  117297. err = MEMORY_E;
  117298. #endif
  117299. (void)heap;
  117300. if (err == MP_OKAY) {
  117301. t2 = t1 + 2 * 12;
  117302. sp_384_sqr_12(t1, point->y);
  117303. (void)sp_384_mod_12(t1, t1, p384_mod);
  117304. sp_384_sqr_12(t2, point->x);
  117305. (void)sp_384_mod_12(t2, t2, p384_mod);
  117306. sp_384_mul_12(t2, t2, point->x);
  117307. (void)sp_384_mod_12(t2, t2, p384_mod);
  117308. (void)sp_384_sub_12(t2, p384_mod, t2);
  117309. sp_384_mont_add_12(t1, t1, t2, p384_mod);
  117310. sp_384_mont_add_12(t1, t1, point->x, p384_mod);
  117311. sp_384_mont_add_12(t1, t1, point->x, p384_mod);
  117312. sp_384_mont_add_12(t1, t1, point->x, p384_mod);
  117313. if (sp_384_cmp_12(t1, p384_b) != 0) {
  117314. err = MP_VAL;
  117315. }
  117316. }
  117317. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117318. if (t1 != NULL)
  117319. XFREE(t1, heap, DYNAMIC_TYPE_ECC);
  117320. #endif
  117321. return err;
  117322. }
  117323. /* Check that the x and y oridinates are a valid point on the curve.
  117324. *
  117325. * pX X ordinate of EC point.
  117326. * pY Y ordinate of EC point.
  117327. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  117328. * not on the curve and MP_OKAY otherwise.
  117329. */
  117330. int sp_ecc_is_point_384(const mp_int* pX, const mp_int* pY)
  117331. {
  117332. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117333. sp_point_384* pub = NULL;
  117334. #else
  117335. sp_point_384 pub[1];
  117336. #endif
  117337. const byte one[1] = { 1 };
  117338. int err = MP_OKAY;
  117339. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117340. pub = (sp_point_384*)XMALLOC(sizeof(sp_point_384), NULL,
  117341. DYNAMIC_TYPE_ECC);
  117342. if (pub == NULL)
  117343. err = MEMORY_E;
  117344. #endif
  117345. if (err == MP_OKAY) {
  117346. sp_384_from_mp(pub->x, 12, pX);
  117347. sp_384_from_mp(pub->y, 12, pY);
  117348. sp_384_from_bin(pub->z, 12, one, (int)sizeof(one));
  117349. err = sp_384_ecc_is_point_12(pub, NULL);
  117350. }
  117351. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117352. if (pub != NULL)
  117353. XFREE(pub, NULL, DYNAMIC_TYPE_ECC);
  117354. #endif
  117355. return err;
  117356. }
  117357. /* Check that the private scalar generates the EC point (px, py), the point is
  117358. * on the curve and the point has the correct order.
  117359. *
  117360. * pX X ordinate of EC point.
  117361. * pY Y ordinate of EC point.
  117362. * privm Private scalar that generates EC point.
  117363. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  117364. * not on the curve, ECC_INF_E if the point does not have the correct order,
  117365. * ECC_PRIV_KEY_E when the private scalar doesn't generate the EC point and
  117366. * MP_OKAY otherwise.
  117367. */
  117368. int sp_ecc_check_key_384(const mp_int* pX, const mp_int* pY,
  117369. const mp_int* privm, void* heap)
  117370. {
  117371. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117372. sp_digit* priv = NULL;
  117373. sp_point_384* pub = NULL;
  117374. #else
  117375. sp_digit priv[12];
  117376. sp_point_384 pub[2];
  117377. #endif
  117378. sp_point_384* p = NULL;
  117379. const byte one[1] = { 1 };
  117380. int err = MP_OKAY;
  117381. /* Quick check the lengs of public key ordinates and private key are in
  117382. * range. Proper check later.
  117383. */
  117384. if (((mp_count_bits(pX) > 384) ||
  117385. (mp_count_bits(pY) > 384) ||
  117386. ((privm != NULL) && (mp_count_bits(privm) > 384)))) {
  117387. err = ECC_OUT_OF_RANGE_E;
  117388. }
  117389. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117390. if (err == MP_OKAY) {
  117391. pub = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap,
  117392. DYNAMIC_TYPE_ECC);
  117393. if (pub == NULL)
  117394. err = MEMORY_E;
  117395. }
  117396. if (err == MP_OKAY && privm) {
  117397. priv = (sp_digit*)XMALLOC(sizeof(sp_digit) * 12, heap,
  117398. DYNAMIC_TYPE_ECC);
  117399. if (priv == NULL)
  117400. err = MEMORY_E;
  117401. }
  117402. #endif
  117403. if (err == MP_OKAY) {
  117404. p = pub + 1;
  117405. sp_384_from_mp(pub->x, 12, pX);
  117406. sp_384_from_mp(pub->y, 12, pY);
  117407. sp_384_from_bin(pub->z, 12, one, (int)sizeof(one));
  117408. if (privm)
  117409. sp_384_from_mp(priv, 12, privm);
  117410. /* Check point at infinitiy. */
  117411. if ((sp_384_iszero_12(pub->x) != 0) &&
  117412. (sp_384_iszero_12(pub->y) != 0)) {
  117413. err = ECC_INF_E;
  117414. }
  117415. }
  117416. /* Check range of X and Y */
  117417. if ((err == MP_OKAY) &&
  117418. ((sp_384_cmp_12(pub->x, p384_mod) >= 0) ||
  117419. (sp_384_cmp_12(pub->y, p384_mod) >= 0))) {
  117420. err = ECC_OUT_OF_RANGE_E;
  117421. }
  117422. if (err == MP_OKAY) {
  117423. /* Check point is on curve */
  117424. err = sp_384_ecc_is_point_12(pub, heap);
  117425. }
  117426. if (err == MP_OKAY) {
  117427. /* Point * order = infinity */
  117428. err = sp_384_ecc_mulmod_12(p, pub, p384_order, 1, 1, heap);
  117429. }
  117430. /* Check result is infinity */
  117431. if ((err == MP_OKAY) && ((sp_384_iszero_12(p->x) == 0) ||
  117432. (sp_384_iszero_12(p->y) == 0))) {
  117433. err = ECC_INF_E;
  117434. }
  117435. if (privm) {
  117436. if (err == MP_OKAY) {
  117437. /* Base * private = point */
  117438. err = sp_384_ecc_mulmod_base_12(p, priv, 1, 1, heap);
  117439. }
  117440. /* Check result is public key */
  117441. if ((err == MP_OKAY) &&
  117442. ((sp_384_cmp_12(p->x, pub->x) != 0) ||
  117443. (sp_384_cmp_12(p->y, pub->y) != 0))) {
  117444. err = ECC_PRIV_KEY_E;
  117445. }
  117446. }
  117447. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117448. if (pub != NULL)
  117449. XFREE(pub, heap, DYNAMIC_TYPE_ECC);
  117450. if (priv != NULL)
  117451. XFREE(priv, heap, DYNAMIC_TYPE_ECC);
  117452. #endif
  117453. return err;
  117454. }
  117455. #endif
  117456. #ifdef WOLFSSL_PUBLIC_ECC_ADD_DBL
  117457. /* Add two projective EC points together.
  117458. * (pX, pY, pZ) + (qX, qY, qZ) = (rX, rY, rZ)
  117459. *
  117460. * pX First EC point's X ordinate.
  117461. * pY First EC point's Y ordinate.
  117462. * pZ First EC point's Z ordinate.
  117463. * qX Second EC point's X ordinate.
  117464. * qY Second EC point's Y ordinate.
  117465. * qZ Second EC point's Z ordinate.
  117466. * rX Resultant EC point's X ordinate.
  117467. * rY Resultant EC point's Y ordinate.
  117468. * rZ Resultant EC point's Z ordinate.
  117469. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  117470. */
  117471. int sp_ecc_proj_add_point_384(mp_int* pX, mp_int* pY, mp_int* pZ,
  117472. mp_int* qX, mp_int* qY, mp_int* qZ,
  117473. mp_int* rX, mp_int* rY, mp_int* rZ)
  117474. {
  117475. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117476. sp_digit* tmp = NULL;
  117477. sp_point_384* p = NULL;
  117478. #else
  117479. sp_digit tmp[2 * 12 * 6];
  117480. sp_point_384 p[2];
  117481. #endif
  117482. sp_point_384* q = NULL;
  117483. int err = MP_OKAY;
  117484. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117485. if (err == MP_OKAY) {
  117486. p = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, NULL,
  117487. DYNAMIC_TYPE_ECC);
  117488. if (p == NULL)
  117489. err = MEMORY_E;
  117490. }
  117491. if (err == MP_OKAY) {
  117492. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 12 * 6, NULL,
  117493. DYNAMIC_TYPE_ECC);
  117494. if (tmp == NULL) {
  117495. err = MEMORY_E;
  117496. }
  117497. }
  117498. #endif
  117499. if (err == MP_OKAY) {
  117500. q = p + 1;
  117501. sp_384_from_mp(p->x, 12, pX);
  117502. sp_384_from_mp(p->y, 12, pY);
  117503. sp_384_from_mp(p->z, 12, pZ);
  117504. sp_384_from_mp(q->x, 12, qX);
  117505. sp_384_from_mp(q->y, 12, qY);
  117506. sp_384_from_mp(q->z, 12, qZ);
  117507. p->infinity = sp_384_iszero_12(p->x) &
  117508. sp_384_iszero_12(p->y);
  117509. q->infinity = sp_384_iszero_12(q->x) &
  117510. sp_384_iszero_12(q->y);
  117511. sp_384_proj_point_add_12(p, p, q, tmp);
  117512. }
  117513. if (err == MP_OKAY) {
  117514. err = sp_384_to_mp(p->x, rX);
  117515. }
  117516. if (err == MP_OKAY) {
  117517. err = sp_384_to_mp(p->y, rY);
  117518. }
  117519. if (err == MP_OKAY) {
  117520. err = sp_384_to_mp(p->z, rZ);
  117521. }
  117522. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117523. if (tmp != NULL)
  117524. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
  117525. if (p != NULL)
  117526. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  117527. #endif
  117528. return err;
  117529. }
  117530. /* Double a projective EC point.
  117531. * (pX, pY, pZ) + (pX, pY, pZ) = (rX, rY, rZ)
  117532. *
  117533. * pX EC point's X ordinate.
  117534. * pY EC point's Y ordinate.
  117535. * pZ EC point's Z ordinate.
  117536. * rX Resultant EC point's X ordinate.
  117537. * rY Resultant EC point's Y ordinate.
  117538. * rZ Resultant EC point's Z ordinate.
  117539. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  117540. */
  117541. int sp_ecc_proj_dbl_point_384(mp_int* pX, mp_int* pY, mp_int* pZ,
  117542. mp_int* rX, mp_int* rY, mp_int* rZ)
  117543. {
  117544. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117545. sp_digit* tmp = NULL;
  117546. sp_point_384* p = NULL;
  117547. #else
  117548. sp_digit tmp[2 * 12 * 2];
  117549. sp_point_384 p[1];
  117550. #endif
  117551. int err = MP_OKAY;
  117552. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117553. if (err == MP_OKAY) {
  117554. p = (sp_point_384*)XMALLOC(sizeof(sp_point_384), NULL,
  117555. DYNAMIC_TYPE_ECC);
  117556. if (p == NULL)
  117557. err = MEMORY_E;
  117558. }
  117559. if (err == MP_OKAY) {
  117560. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 12 * 2, NULL,
  117561. DYNAMIC_TYPE_ECC);
  117562. if (tmp == NULL)
  117563. err = MEMORY_E;
  117564. }
  117565. #endif
  117566. if (err == MP_OKAY) {
  117567. sp_384_from_mp(p->x, 12, pX);
  117568. sp_384_from_mp(p->y, 12, pY);
  117569. sp_384_from_mp(p->z, 12, pZ);
  117570. p->infinity = sp_384_iszero_12(p->x) &
  117571. sp_384_iszero_12(p->y);
  117572. sp_384_proj_point_dbl_12(p, p, tmp);
  117573. }
  117574. if (err == MP_OKAY) {
  117575. err = sp_384_to_mp(p->x, rX);
  117576. }
  117577. if (err == MP_OKAY) {
  117578. err = sp_384_to_mp(p->y, rY);
  117579. }
  117580. if (err == MP_OKAY) {
  117581. err = sp_384_to_mp(p->z, rZ);
  117582. }
  117583. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117584. if (tmp != NULL)
  117585. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
  117586. if (p != NULL)
  117587. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  117588. #endif
  117589. return err;
  117590. }
  117591. /* Map a projective EC point to affine in place.
  117592. * pZ will be one.
  117593. *
  117594. * pX EC point's X ordinate.
  117595. * pY EC point's Y ordinate.
  117596. * pZ EC point's Z ordinate.
  117597. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  117598. */
  117599. int sp_ecc_map_384(mp_int* pX, mp_int* pY, mp_int* pZ)
  117600. {
  117601. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117602. sp_digit* tmp = NULL;
  117603. sp_point_384* p = NULL;
  117604. #else
  117605. sp_digit tmp[2 * 12 * 6];
  117606. sp_point_384 p[1];
  117607. #endif
  117608. int err = MP_OKAY;
  117609. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117610. if (err == MP_OKAY) {
  117611. p = (sp_point_384*)XMALLOC(sizeof(sp_point_384), NULL,
  117612. DYNAMIC_TYPE_ECC);
  117613. if (p == NULL)
  117614. err = MEMORY_E;
  117615. }
  117616. if (err == MP_OKAY) {
  117617. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 12 * 6, NULL,
  117618. DYNAMIC_TYPE_ECC);
  117619. if (tmp == NULL)
  117620. err = MEMORY_E;
  117621. }
  117622. #endif
  117623. if (err == MP_OKAY) {
  117624. sp_384_from_mp(p->x, 12, pX);
  117625. sp_384_from_mp(p->y, 12, pY);
  117626. sp_384_from_mp(p->z, 12, pZ);
  117627. p->infinity = sp_384_iszero_12(p->x) &
  117628. sp_384_iszero_12(p->y);
  117629. sp_384_map_12(p, p, tmp);
  117630. }
  117631. if (err == MP_OKAY) {
  117632. err = sp_384_to_mp(p->x, pX);
  117633. }
  117634. if (err == MP_OKAY) {
  117635. err = sp_384_to_mp(p->y, pY);
  117636. }
  117637. if (err == MP_OKAY) {
  117638. err = sp_384_to_mp(p->z, pZ);
  117639. }
  117640. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117641. if (tmp != NULL)
  117642. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
  117643. if (p != NULL)
  117644. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  117645. #endif
  117646. return err;
  117647. }
  117648. #endif /* WOLFSSL_PUBLIC_ECC_ADD_DBL */
  117649. #ifdef HAVE_COMP_KEY
  117650. /* Find the square root of a number mod the prime of the curve.
  117651. *
  117652. * y The number to operate on and the result.
  117653. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  117654. */
  117655. static int sp_384_mont_sqrt_12(sp_digit* y)
  117656. {
  117657. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117658. sp_digit* t1 = NULL;
  117659. #else
  117660. sp_digit t1[5 * 2 * 12];
  117661. #endif
  117662. sp_digit* t2 = NULL;
  117663. sp_digit* t3 = NULL;
  117664. sp_digit* t4 = NULL;
  117665. sp_digit* t5 = NULL;
  117666. int err = MP_OKAY;
  117667. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117668. t1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 5 * 2 * 12, NULL, DYNAMIC_TYPE_ECC);
  117669. if (t1 == NULL)
  117670. err = MEMORY_E;
  117671. #endif
  117672. if (err == MP_OKAY) {
  117673. t2 = t1 + 2 * 12;
  117674. t3 = t1 + 4 * 12;
  117675. t4 = t1 + 6 * 12;
  117676. t5 = t1 + 8 * 12;
  117677. {
  117678. /* t2 = y ^ 0x2 */
  117679. sp_384_mont_sqr_12(t2, y, p384_mod, p384_mp_mod);
  117680. /* t1 = y ^ 0x3 */
  117681. sp_384_mont_mul_12(t1, t2, y, p384_mod, p384_mp_mod);
  117682. /* t5 = y ^ 0xc */
  117683. sp_384_mont_sqr_n_12(t5, t1, 2, p384_mod, p384_mp_mod);
  117684. /* t1 = y ^ 0xf */
  117685. sp_384_mont_mul_12(t1, t1, t5, p384_mod, p384_mp_mod);
  117686. /* t2 = y ^ 0x1e */
  117687. sp_384_mont_sqr_12(t2, t1, p384_mod, p384_mp_mod);
  117688. /* t3 = y ^ 0x1f */
  117689. sp_384_mont_mul_12(t3, t2, y, p384_mod, p384_mp_mod);
  117690. /* t2 = y ^ 0x3e0 */
  117691. sp_384_mont_sqr_n_12(t2, t3, 5, p384_mod, p384_mp_mod);
  117692. /* t1 = y ^ 0x3ff */
  117693. sp_384_mont_mul_12(t1, t3, t2, p384_mod, p384_mp_mod);
  117694. /* t2 = y ^ 0x7fe0 */
  117695. sp_384_mont_sqr_n_12(t2, t1, 5, p384_mod, p384_mp_mod);
  117696. /* t3 = y ^ 0x7fff */
  117697. sp_384_mont_mul_12(t3, t3, t2, p384_mod, p384_mp_mod);
  117698. /* t2 = y ^ 0x3fff800 */
  117699. sp_384_mont_sqr_n_12(t2, t3, 15, p384_mod, p384_mp_mod);
  117700. /* t4 = y ^ 0x3ffffff */
  117701. sp_384_mont_mul_12(t4, t3, t2, p384_mod, p384_mp_mod);
  117702. /* t2 = y ^ 0xffffffc000000 */
  117703. sp_384_mont_sqr_n_12(t2, t4, 30, p384_mod, p384_mp_mod);
  117704. /* t1 = y ^ 0xfffffffffffff */
  117705. sp_384_mont_mul_12(t1, t4, t2, p384_mod, p384_mp_mod);
  117706. /* t2 = y ^ 0xfffffffffffffff000000000000000 */
  117707. sp_384_mont_sqr_n_12(t2, t1, 60, p384_mod, p384_mp_mod);
  117708. /* t1 = y ^ 0xffffffffffffffffffffffffffffff */
  117709. sp_384_mont_mul_12(t1, t1, t2, p384_mod, p384_mp_mod);
  117710. /* t2 = y ^ 0xffffffffffffffffffffffffffffff000000000000000000000000000000 */
  117711. sp_384_mont_sqr_n_12(t2, t1, 120, p384_mod, p384_mp_mod);
  117712. /* t1 = y ^ 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff */
  117713. sp_384_mont_mul_12(t1, t1, t2, p384_mod, p384_mp_mod);
  117714. /* t2 = y ^ 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000 */
  117715. sp_384_mont_sqr_n_12(t2, t1, 15, p384_mod, p384_mp_mod);
  117716. /* t1 = y ^ 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff */
  117717. sp_384_mont_mul_12(t1, t3, t2, p384_mod, p384_mp_mod);
  117718. /* t2 = y ^ 0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80000000 */
  117719. sp_384_mont_sqr_n_12(t2, t1, 31, p384_mod, p384_mp_mod);
  117720. /* t1 = y ^ 0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffffff */
  117721. sp_384_mont_mul_12(t1, t4, t2, p384_mod, p384_mp_mod);
  117722. /* t2 = y ^ 0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffffff0 */
  117723. sp_384_mont_sqr_n_12(t2, t1, 4, p384_mod, p384_mp_mod);
  117724. /* t1 = y ^ 0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffffffc */
  117725. sp_384_mont_mul_12(t1, t5, t2, p384_mod, p384_mp_mod);
  117726. /* t2 = y ^ 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000 */
  117727. sp_384_mont_sqr_n_12(t2, t1, 62, p384_mod, p384_mp_mod);
  117728. /* t1 = y ^ 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000001 */
  117729. sp_384_mont_mul_12(t1, y, t2, p384_mod, p384_mp_mod);
  117730. /* t2 = y ^ 0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffffffc00000000000000040000000 */
  117731. sp_384_mont_sqr_n_12(y, t1, 30, p384_mod, p384_mp_mod);
  117732. }
  117733. }
  117734. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117735. if (t1 != NULL)
  117736. XFREE(t1, NULL, DYNAMIC_TYPE_ECC);
  117737. #endif
  117738. return err;
  117739. }
  117740. /* Uncompress the point given the X ordinate.
  117741. *
  117742. * xm X ordinate.
  117743. * odd Whether the Y ordinate is odd.
  117744. * ym Calculated Y ordinate.
  117745. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  117746. */
  117747. int sp_ecc_uncompress_384(mp_int* xm, int odd, mp_int* ym)
  117748. {
  117749. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117750. sp_digit* x = NULL;
  117751. #else
  117752. sp_digit x[4 * 12];
  117753. #endif
  117754. sp_digit* y = NULL;
  117755. int err = MP_OKAY;
  117756. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117757. x = (sp_digit*)XMALLOC(sizeof(sp_digit) * 4 * 12, NULL, DYNAMIC_TYPE_ECC);
  117758. if (x == NULL)
  117759. err = MEMORY_E;
  117760. #endif
  117761. if (err == MP_OKAY) {
  117762. y = x + 2 * 12;
  117763. sp_384_from_mp(x, 12, xm);
  117764. err = sp_384_mod_mul_norm_12(x, x, p384_mod);
  117765. }
  117766. if (err == MP_OKAY) {
  117767. /* y = x^3 */
  117768. {
  117769. sp_384_mont_sqr_12(y, x, p384_mod, p384_mp_mod);
  117770. sp_384_mont_mul_12(y, y, x, p384_mod, p384_mp_mod);
  117771. }
  117772. /* y = x^3 - 3x */
  117773. sp_384_mont_sub_12(y, y, x, p384_mod);
  117774. sp_384_mont_sub_12(y, y, x, p384_mod);
  117775. sp_384_mont_sub_12(y, y, x, p384_mod);
  117776. /* y = x^3 - 3x + b */
  117777. err = sp_384_mod_mul_norm_12(x, p384_b, p384_mod);
  117778. }
  117779. if (err == MP_OKAY) {
  117780. sp_384_mont_add_12(y, y, x, p384_mod);
  117781. /* y = sqrt(x^3 - 3x + b) */
  117782. err = sp_384_mont_sqrt_12(y);
  117783. }
  117784. if (err == MP_OKAY) {
  117785. XMEMSET(y + 12, 0, 12U * sizeof(sp_digit));
  117786. sp_384_mont_reduce_12(y, p384_mod, p384_mp_mod);
  117787. if ((((word32)y[0] ^ (word32)odd) & 1U) != 0U) {
  117788. sp_384_mont_sub_12(y, p384_mod, y, p384_mod);
  117789. }
  117790. err = sp_384_to_mp(y, ym);
  117791. }
  117792. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117793. if (x != NULL)
  117794. XFREE(x, NULL, DYNAMIC_TYPE_ECC);
  117795. #endif
  117796. return err;
  117797. }
  117798. #endif
  117799. #endif /* WOLFSSL_SP_384 */
  117800. #ifdef WOLFSSL_SP_521
  117801. /* Point structure to use. */
  117802. typedef struct sp_point_521 {
  117803. /* X ordinate of point. */
  117804. sp_digit x[2 * 17];
  117805. /* Y ordinate of point. */
  117806. sp_digit y[2 * 17];
  117807. /* Z ordinate of point. */
  117808. sp_digit z[2 * 17];
  117809. /* Indicates point is at infinity. */
  117810. int infinity;
  117811. } sp_point_521;
  117812. /* The modulus (prime) of the curve P521. */
  117813. static const sp_digit p521_mod[17] = {
  117814. 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,
  117815. 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,
  117816. 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0x000001ff
  117817. };
  117818. /* The Montgomery normalizer for modulus of the curve P521. */
  117819. static const sp_digit p521_norm_mod[17] = {
  117820. 0x00000001,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  117821. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  117822. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000
  117823. };
  117824. /* The Montgomery multiplier for modulus of the curve P521. */
  117825. static sp_digit p521_mp_mod = 0x00000001;
  117826. #if defined(WOLFSSL_VALIDATE_ECC_KEYGEN) || defined(HAVE_ECC_SIGN) || \
  117827. defined(HAVE_ECC_VERIFY)
  117828. /* The order of the curve P521. */
  117829. static const sp_digit p521_order[17] = {
  117830. 0x91386409,0xbb6fb71e,0x899c47ae,0x3bb5c9b8,0xf709a5d0,0x7fcc0148,
  117831. 0xbf2f966b,0x51868783,0xfffffffa,0xffffffff,0xffffffff,0xffffffff,
  117832. 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0x000001ff
  117833. };
  117834. #endif
  117835. /* The order of the curve P521 minus 2. */
  117836. static const sp_digit p521_order2[17] = {
  117837. 0x91386407,0xbb6fb71e,0x899c47ae,0x3bb5c9b8,0xf709a5d0,0x7fcc0148,
  117838. 0xbf2f966b,0x51868783,0xfffffffa,0xffffffff,0xffffffff,0xffffffff,
  117839. 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0x000001ff
  117840. };
  117841. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  117842. /* The Montgomery normalizer for order of the curve P521. */
  117843. static const sp_digit p521_norm_order[17] = {
  117844. 0x6ec79bf7,0x449048e1,0x7663b851,0xc44a3647,0x08f65a2f,0x8033feb7,
  117845. 0x40d06994,0xae79787c,0x00000005,0x00000000,0x00000000,0x00000000,
  117846. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000
  117847. };
  117848. #endif
  117849. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  117850. /* The Montgomery multiplier for order of the curve P521. */
  117851. static sp_digit p521_mp_order = 0x79a995c7;
  117852. #endif
  117853. /* The base point of curve P521. */
  117854. static const sp_point_521 p521_base = {
  117855. /* X ordinate */
  117856. {
  117857. 0xc2e5bd66,0xf97e7e31,0x856a429b,0x3348b3c1,0xa2ffa8de,0xfe1dc127,
  117858. 0xefe75928,0xa14b5e77,0x6b4d3dba,0xf828af60,0x053fb521,0x9c648139,
  117859. 0x2395b442,0x9e3ecb66,0x0404e9cd,0x858e06b7,0x000000c6,
  117860. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  117861. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  117862. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  117863. (sp_digit)0, (sp_digit)0
  117864. },
  117865. /* Y ordinate */
  117866. {
  117867. 0x9fd16650,0x88be9476,0xa272c240,0x353c7086,0x3fad0761,0xc550b901,
  117868. 0x5ef42640,0x97ee7299,0x273e662c,0x17afbd17,0x579b4468,0x98f54449,
  117869. 0x2c7d1bd9,0x5c8a5fb4,0x9a3bc004,0x39296a78,0x00000118,
  117870. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  117871. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  117872. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  117873. (sp_digit)0, (sp_digit)0
  117874. },
  117875. /* Z ordinate */
  117876. {
  117877. 0x00000001,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  117878. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  117879. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  117880. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  117881. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  117882. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  117883. (sp_digit)0, (sp_digit)0
  117884. },
  117885. /* infinity */
  117886. 0
  117887. };
  117888. #if defined(HAVE_ECC_CHECK_KEY) || defined(HAVE_COMP_KEY)
  117889. static const sp_digit p521_b[17] = {
  117890. 0x6b503f00,0xef451fd4,0x3d2c34f1,0x3573df88,0x3bb1bf07,0x1652c0bd,
  117891. 0xec7e937b,0x56193951,0x8ef109e1,0xb8b48991,0x99b315f3,0xa2da725b,
  117892. 0xb68540ee,0x929a21a0,0x8e1c9a1f,0x953eb961,0x00000051
  117893. };
  117894. #endif
  117895. /* Multiply a and b into r. (r = a * b)
  117896. *
  117897. * r A single precision integer.
  117898. * a A single precision integer.
  117899. * b A single precision integer.
  117900. */
  117901. SP_NOINLINE static void sp_521_mul_17(sp_digit* r, const sp_digit* a,
  117902. const sp_digit* b)
  117903. {
  117904. sp_digit t[17 * 2];
  117905. sp_digit* tmp = t;
  117906. __asm__ __volatile__ (
  117907. "movs r3, #0\n\t"
  117908. "movs r4, #0\n\t"
  117909. "mov r8, r3\n\t"
  117910. "mov r11, %[tmp]\n\t"
  117911. "mov r9, %[a]\n\t"
  117912. "mov r10, %[b]\n\t"
  117913. "movs r6, #0x44\n\t"
  117914. "add r6, r6, r9\n\t"
  117915. "mov r12, r6\n\t"
  117916. "\n"
  117917. "L_sp_521_mul_17_words_%=:\n\t"
  117918. "movs %[tmp], #0\n\t"
  117919. "movs r5, #0\n\t"
  117920. "movs r6, #0x40\n\t"
  117921. "mov %[a], r8\n\t"
  117922. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117923. "subs %[a], %[a], r6\n\t"
  117924. #else
  117925. "sub %[a], %[a], r6\n\t"
  117926. #endif
  117927. #ifdef WOLFSSL_KEIL
  117928. "sbcs r6, r6, r6\n\t"
  117929. #elif defined(__clang__)
  117930. "sbcs r6, r6\n\t"
  117931. #else
  117932. "sbc r6, r6\n\t"
  117933. #endif
  117934. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117935. "mvns r6, r6\n\t"
  117936. #else
  117937. "mvn r6, r6\n\t"
  117938. #endif
  117939. #ifdef WOLFSSL_KEIL
  117940. "ands %[a], %[a], r6\n\t"
  117941. #elif defined(__clang__)
  117942. "ands %[a], r6\n\t"
  117943. #else
  117944. "and %[a], r6\n\t"
  117945. #endif
  117946. "mov %[b], r8\n\t"
  117947. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117948. "subs %[b], %[b], %[a]\n\t"
  117949. #else
  117950. "sub %[b], %[b], %[a]\n\t"
  117951. #endif
  117952. "add %[a], %[a], r9\n\t"
  117953. "add %[b], %[b], r10\n\t"
  117954. "\n"
  117955. "L_sp_521_mul_17_mul_%=:\n\t"
  117956. "# Multiply Start\n\t"
  117957. "ldrh r6, [%[a]]\n\t"
  117958. "ldrh r7, [%[b]]\n\t"
  117959. #ifdef WOLFSSL_KEIL
  117960. "muls r7, r6, r7\n\t"
  117961. #elif defined(__clang__)
  117962. "muls r7, r6\n\t"
  117963. #else
  117964. "mul r7, r6\n\t"
  117965. #endif
  117966. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117967. "adds r3, r3, r7\n\t"
  117968. #else
  117969. "add r3, r3, r7\n\t"
  117970. #endif
  117971. #ifdef WOLFSSL_KEIL
  117972. "adcs r4, r4, %[tmp]\n\t"
  117973. #elif defined(__clang__)
  117974. "adcs r4, %[tmp]\n\t"
  117975. #else
  117976. "adc r4, %[tmp]\n\t"
  117977. #endif
  117978. #ifdef WOLFSSL_KEIL
  117979. "adcs r5, r5, %[tmp]\n\t"
  117980. #elif defined(__clang__)
  117981. "adcs r5, %[tmp]\n\t"
  117982. #else
  117983. "adc r5, %[tmp]\n\t"
  117984. #endif
  117985. "ldr r7, [%[b]]\n\t"
  117986. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117987. "lsrs r7, r7, #16\n\t"
  117988. #else
  117989. "lsr r7, r7, #16\n\t"
  117990. #endif
  117991. #ifdef WOLFSSL_KEIL
  117992. "muls r6, r7, r6\n\t"
  117993. #elif defined(__clang__)
  117994. "muls r6, r7\n\t"
  117995. #else
  117996. "mul r6, r7\n\t"
  117997. #endif
  117998. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117999. "lsrs r7, r6, #16\n\t"
  118000. #else
  118001. "lsr r7, r6, #16\n\t"
  118002. #endif
  118003. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118004. "lsls r6, r6, #16\n\t"
  118005. #else
  118006. "lsl r6, r6, #16\n\t"
  118007. #endif
  118008. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118009. "adds r3, r3, r6\n\t"
  118010. #else
  118011. "add r3, r3, r6\n\t"
  118012. #endif
  118013. #ifdef WOLFSSL_KEIL
  118014. "adcs r4, r4, r7\n\t"
  118015. #elif defined(__clang__)
  118016. "adcs r4, r7\n\t"
  118017. #else
  118018. "adc r4, r7\n\t"
  118019. #endif
  118020. #ifdef WOLFSSL_KEIL
  118021. "adcs r5, r5, %[tmp]\n\t"
  118022. #elif defined(__clang__)
  118023. "adcs r5, %[tmp]\n\t"
  118024. #else
  118025. "adc r5, %[tmp]\n\t"
  118026. #endif
  118027. "ldr r6, [%[a]]\n\t"
  118028. "ldr r7, [%[b]]\n\t"
  118029. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118030. "lsrs r6, r6, #16\n\t"
  118031. #else
  118032. "lsr r6, r6, #16\n\t"
  118033. #endif
  118034. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118035. "lsrs r7, r7, #16\n\t"
  118036. #else
  118037. "lsr r7, r7, #16\n\t"
  118038. #endif
  118039. #ifdef WOLFSSL_KEIL
  118040. "muls r7, r6, r7\n\t"
  118041. #elif defined(__clang__)
  118042. "muls r7, r6\n\t"
  118043. #else
  118044. "mul r7, r6\n\t"
  118045. #endif
  118046. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118047. "adds r4, r4, r7\n\t"
  118048. #else
  118049. "add r4, r4, r7\n\t"
  118050. #endif
  118051. #ifdef WOLFSSL_KEIL
  118052. "adcs r5, r5, %[tmp]\n\t"
  118053. #elif defined(__clang__)
  118054. "adcs r5, %[tmp]\n\t"
  118055. #else
  118056. "adc r5, %[tmp]\n\t"
  118057. #endif
  118058. "ldrh r7, [%[b]]\n\t"
  118059. #ifdef WOLFSSL_KEIL
  118060. "muls r6, r7, r6\n\t"
  118061. #elif defined(__clang__)
  118062. "muls r6, r7\n\t"
  118063. #else
  118064. "mul r6, r7\n\t"
  118065. #endif
  118066. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118067. "lsrs r7, r6, #16\n\t"
  118068. #else
  118069. "lsr r7, r6, #16\n\t"
  118070. #endif
  118071. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118072. "lsls r6, r6, #16\n\t"
  118073. #else
  118074. "lsl r6, r6, #16\n\t"
  118075. #endif
  118076. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118077. "adds r3, r3, r6\n\t"
  118078. #else
  118079. "add r3, r3, r6\n\t"
  118080. #endif
  118081. #ifdef WOLFSSL_KEIL
  118082. "adcs r4, r4, r7\n\t"
  118083. #elif defined(__clang__)
  118084. "adcs r4, r7\n\t"
  118085. #else
  118086. "adc r4, r7\n\t"
  118087. #endif
  118088. #ifdef WOLFSSL_KEIL
  118089. "adcs r5, r5, %[tmp]\n\t"
  118090. #elif defined(__clang__)
  118091. "adcs r5, %[tmp]\n\t"
  118092. #else
  118093. "adc r5, %[tmp]\n\t"
  118094. #endif
  118095. "# Multiply Done\n\t"
  118096. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118097. "adds %[a], %[a], #4\n\t"
  118098. #else
  118099. "add %[a], %[a], #4\n\t"
  118100. #endif
  118101. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118102. "subs %[b], %[b], #4\n\t"
  118103. #else
  118104. "sub %[b], %[b], #4\n\t"
  118105. #endif
  118106. "cmp %[a], r12\n\t"
  118107. "beq L_sp_521_mul_17_done_mul_%=\n\t"
  118108. "mov r6, r8\n\t"
  118109. "add r6, r6, r9\n\t"
  118110. "cmp %[a], r6\n\t"
  118111. "ble L_sp_521_mul_17_mul_%=\n\t"
  118112. "\n"
  118113. "L_sp_521_mul_17_done_mul_%=:\n\t"
  118114. "mov %[tmp], r11\n\t"
  118115. "mov r7, r8\n\t"
  118116. "str r3, [%[tmp], r7]\n\t"
  118117. "movs r3, r4\n\t"
  118118. "movs r4, r5\n\t"
  118119. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118120. "adds r7, r7, #4\n\t"
  118121. #else
  118122. "add r7, r7, #4\n\t"
  118123. #endif
  118124. "mov r8, r7\n\t"
  118125. "movs r6, #0x80\n\t"
  118126. "cmp r7, r6\n\t"
  118127. "ble L_sp_521_mul_17_words_%=\n\t"
  118128. "str r3, [%[tmp], r7]\n\t"
  118129. "mov %[a], r9\n\t"
  118130. "mov %[b], r10\n\t"
  118131. : [a] "+l" (a), [b] "+l" (b), [tmp] "+l" (tmp)
  118132. :
  118133. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  118134. );
  118135. XMEMCPY(r, t, sizeof(t));
  118136. }
  118137. /* Square a and put result in r. (r = a * a)
  118138. *
  118139. * r A single precision integer.
  118140. * a A single precision integer.
  118141. */
  118142. SP_NOINLINE static void sp_521_sqr_17(sp_digit* r, const sp_digit* a)
  118143. {
  118144. __asm__ __volatile__ (
  118145. "movs r3, #0\n\t"
  118146. "movs r4, #0\n\t"
  118147. "movs r5, #0\n\t"
  118148. "mov r8, r3\n\t"
  118149. "mov r11, %[r]\n\t"
  118150. "movs r6, #0x88\n\t"
  118151. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118152. "negs r6, r6\n\t"
  118153. #else
  118154. "neg r6, r6\n\t"
  118155. #endif
  118156. "add sp, sp, r6\n\t"
  118157. "mov r10, sp\n\t"
  118158. "mov r9, %[a]\n\t"
  118159. "\n"
  118160. "L_sp_521_sqr_17_words_%=:\n\t"
  118161. "movs %[r], #0\n\t"
  118162. "movs r6, #0x40\n\t"
  118163. "mov %[a], r8\n\t"
  118164. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118165. "subs %[a], %[a], r6\n\t"
  118166. #else
  118167. "sub %[a], %[a], r6\n\t"
  118168. #endif
  118169. #ifdef WOLFSSL_KEIL
  118170. "sbcs r6, r6, r6\n\t"
  118171. #elif defined(__clang__)
  118172. "sbcs r6, r6\n\t"
  118173. #else
  118174. "sbc r6, r6\n\t"
  118175. #endif
  118176. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118177. "mvns r6, r6\n\t"
  118178. #else
  118179. "mvn r6, r6\n\t"
  118180. #endif
  118181. #ifdef WOLFSSL_KEIL
  118182. "ands %[a], %[a], r6\n\t"
  118183. #elif defined(__clang__)
  118184. "ands %[a], r6\n\t"
  118185. #else
  118186. "and %[a], r6\n\t"
  118187. #endif
  118188. "mov r2, r8\n\t"
  118189. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118190. "subs r2, r2, %[a]\n\t"
  118191. #else
  118192. "sub r2, r2, %[a]\n\t"
  118193. #endif
  118194. "add %[a], %[a], r9\n\t"
  118195. "add r2, r2, r9\n\t"
  118196. "\n"
  118197. "L_sp_521_sqr_17_mul_%=:\n\t"
  118198. "cmp r2, %[a]\n\t"
  118199. "beq L_sp_521_sqr_17_sqr_%=\n\t"
  118200. "# Multiply * 2: Start\n\t"
  118201. "ldrh r6, [%[a]]\n\t"
  118202. "ldrh r7, [r2]\n\t"
  118203. #ifdef WOLFSSL_KEIL
  118204. "muls r7, r6, r7\n\t"
  118205. #elif defined(__clang__)
  118206. "muls r7, r6\n\t"
  118207. #else
  118208. "mul r7, r6\n\t"
  118209. #endif
  118210. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118211. "adds r3, r3, r7\n\t"
  118212. #else
  118213. "add r3, r3, r7\n\t"
  118214. #endif
  118215. #ifdef WOLFSSL_KEIL
  118216. "adcs r4, r4, %[r]\n\t"
  118217. #elif defined(__clang__)
  118218. "adcs r4, %[r]\n\t"
  118219. #else
  118220. "adc r4, %[r]\n\t"
  118221. #endif
  118222. #ifdef WOLFSSL_KEIL
  118223. "adcs r5, r5, %[r]\n\t"
  118224. #elif defined(__clang__)
  118225. "adcs r5, %[r]\n\t"
  118226. #else
  118227. "adc r5, %[r]\n\t"
  118228. #endif
  118229. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118230. "adds r3, r3, r7\n\t"
  118231. #else
  118232. "add r3, r3, r7\n\t"
  118233. #endif
  118234. #ifdef WOLFSSL_KEIL
  118235. "adcs r4, r4, %[r]\n\t"
  118236. #elif defined(__clang__)
  118237. "adcs r4, %[r]\n\t"
  118238. #else
  118239. "adc r4, %[r]\n\t"
  118240. #endif
  118241. #ifdef WOLFSSL_KEIL
  118242. "adcs r5, r5, %[r]\n\t"
  118243. #elif defined(__clang__)
  118244. "adcs r5, %[r]\n\t"
  118245. #else
  118246. "adc r5, %[r]\n\t"
  118247. #endif
  118248. "ldr r7, [r2]\n\t"
  118249. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118250. "lsrs r7, r7, #16\n\t"
  118251. #else
  118252. "lsr r7, r7, #16\n\t"
  118253. #endif
  118254. #ifdef WOLFSSL_KEIL
  118255. "muls r6, r7, r6\n\t"
  118256. #elif defined(__clang__)
  118257. "muls r6, r7\n\t"
  118258. #else
  118259. "mul r6, r7\n\t"
  118260. #endif
  118261. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118262. "lsrs r7, r6, #16\n\t"
  118263. #else
  118264. "lsr r7, r6, #16\n\t"
  118265. #endif
  118266. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118267. "lsls r6, r6, #16\n\t"
  118268. #else
  118269. "lsl r6, r6, #16\n\t"
  118270. #endif
  118271. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118272. "adds r3, r3, r6\n\t"
  118273. #else
  118274. "add r3, r3, r6\n\t"
  118275. #endif
  118276. #ifdef WOLFSSL_KEIL
  118277. "adcs r4, r4, r7\n\t"
  118278. #elif defined(__clang__)
  118279. "adcs r4, r7\n\t"
  118280. #else
  118281. "adc r4, r7\n\t"
  118282. #endif
  118283. #ifdef WOLFSSL_KEIL
  118284. "adcs r5, r5, %[r]\n\t"
  118285. #elif defined(__clang__)
  118286. "adcs r5, %[r]\n\t"
  118287. #else
  118288. "adc r5, %[r]\n\t"
  118289. #endif
  118290. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118291. "adds r3, r3, r6\n\t"
  118292. #else
  118293. "add r3, r3, r6\n\t"
  118294. #endif
  118295. #ifdef WOLFSSL_KEIL
  118296. "adcs r4, r4, r7\n\t"
  118297. #elif defined(__clang__)
  118298. "adcs r4, r7\n\t"
  118299. #else
  118300. "adc r4, r7\n\t"
  118301. #endif
  118302. #ifdef WOLFSSL_KEIL
  118303. "adcs r5, r5, %[r]\n\t"
  118304. #elif defined(__clang__)
  118305. "adcs r5, %[r]\n\t"
  118306. #else
  118307. "adc r5, %[r]\n\t"
  118308. #endif
  118309. "ldr r6, [%[a]]\n\t"
  118310. "ldr r7, [r2]\n\t"
  118311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118312. "lsrs r6, r6, #16\n\t"
  118313. #else
  118314. "lsr r6, r6, #16\n\t"
  118315. #endif
  118316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118317. "lsrs r7, r7, #16\n\t"
  118318. #else
  118319. "lsr r7, r7, #16\n\t"
  118320. #endif
  118321. #ifdef WOLFSSL_KEIL
  118322. "muls r7, r6, r7\n\t"
  118323. #elif defined(__clang__)
  118324. "muls r7, r6\n\t"
  118325. #else
  118326. "mul r7, r6\n\t"
  118327. #endif
  118328. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118329. "adds r4, r4, r7\n\t"
  118330. #else
  118331. "add r4, r4, r7\n\t"
  118332. #endif
  118333. #ifdef WOLFSSL_KEIL
  118334. "adcs r5, r5, %[r]\n\t"
  118335. #elif defined(__clang__)
  118336. "adcs r5, %[r]\n\t"
  118337. #else
  118338. "adc r5, %[r]\n\t"
  118339. #endif
  118340. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118341. "adds r4, r4, r7\n\t"
  118342. #else
  118343. "add r4, r4, r7\n\t"
  118344. #endif
  118345. #ifdef WOLFSSL_KEIL
  118346. "adcs r5, r5, %[r]\n\t"
  118347. #elif defined(__clang__)
  118348. "adcs r5, %[r]\n\t"
  118349. #else
  118350. "adc r5, %[r]\n\t"
  118351. #endif
  118352. "ldrh r7, [r2]\n\t"
  118353. #ifdef WOLFSSL_KEIL
  118354. "muls r6, r7, r6\n\t"
  118355. #elif defined(__clang__)
  118356. "muls r6, r7\n\t"
  118357. #else
  118358. "mul r6, r7\n\t"
  118359. #endif
  118360. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118361. "lsrs r7, r6, #16\n\t"
  118362. #else
  118363. "lsr r7, r6, #16\n\t"
  118364. #endif
  118365. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118366. "lsls r6, r6, #16\n\t"
  118367. #else
  118368. "lsl r6, r6, #16\n\t"
  118369. #endif
  118370. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118371. "adds r3, r3, r6\n\t"
  118372. #else
  118373. "add r3, r3, r6\n\t"
  118374. #endif
  118375. #ifdef WOLFSSL_KEIL
  118376. "adcs r4, r4, r7\n\t"
  118377. #elif defined(__clang__)
  118378. "adcs r4, r7\n\t"
  118379. #else
  118380. "adc r4, r7\n\t"
  118381. #endif
  118382. #ifdef WOLFSSL_KEIL
  118383. "adcs r5, r5, %[r]\n\t"
  118384. #elif defined(__clang__)
  118385. "adcs r5, %[r]\n\t"
  118386. #else
  118387. "adc r5, %[r]\n\t"
  118388. #endif
  118389. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118390. "adds r3, r3, r6\n\t"
  118391. #else
  118392. "add r3, r3, r6\n\t"
  118393. #endif
  118394. #ifdef WOLFSSL_KEIL
  118395. "adcs r4, r4, r7\n\t"
  118396. #elif defined(__clang__)
  118397. "adcs r4, r7\n\t"
  118398. #else
  118399. "adc r4, r7\n\t"
  118400. #endif
  118401. #ifdef WOLFSSL_KEIL
  118402. "adcs r5, r5, %[r]\n\t"
  118403. #elif defined(__clang__)
  118404. "adcs r5, %[r]\n\t"
  118405. #else
  118406. "adc r5, %[r]\n\t"
  118407. #endif
  118408. "# Multiply * 2: Done\n\t"
  118409. "bal L_sp_521_sqr_17_done_sqr_%=\n\t"
  118410. "\n"
  118411. "L_sp_521_sqr_17_sqr_%=:\n\t"
  118412. "mov r12, r2\n\t"
  118413. "ldr r2, [%[a]]\n\t"
  118414. "# Square: Start\n\t"
  118415. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118416. "lsrs r7, r2, #16\n\t"
  118417. #else
  118418. "lsr r7, r2, #16\n\t"
  118419. #endif
  118420. "uxth r6, r2\n\t"
  118421. #ifdef WOLFSSL_KEIL
  118422. "muls r6, r6, r6\n\t"
  118423. #elif defined(__clang__)
  118424. "muls r6, r6\n\t"
  118425. #else
  118426. "mul r6, r6\n\t"
  118427. #endif
  118428. #ifdef WOLFSSL_KEIL
  118429. "muls r7, r7, r7\n\t"
  118430. #elif defined(__clang__)
  118431. "muls r7, r7\n\t"
  118432. #else
  118433. "mul r7, r7\n\t"
  118434. #endif
  118435. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118436. "adds r3, r3, r6\n\t"
  118437. #else
  118438. "add r3, r3, r6\n\t"
  118439. #endif
  118440. #ifdef WOLFSSL_KEIL
  118441. "adcs r4, r4, r7\n\t"
  118442. #elif defined(__clang__)
  118443. "adcs r4, r7\n\t"
  118444. #else
  118445. "adc r4, r7\n\t"
  118446. #endif
  118447. #ifdef WOLFSSL_KEIL
  118448. "adcs r5, r5, %[r]\n\t"
  118449. #elif defined(__clang__)
  118450. "adcs r5, %[r]\n\t"
  118451. #else
  118452. "adc r5, %[r]\n\t"
  118453. #endif
  118454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118455. "lsrs r7, r2, #16\n\t"
  118456. #else
  118457. "lsr r7, r2, #16\n\t"
  118458. #endif
  118459. "uxth r6, r2\n\t"
  118460. #ifdef WOLFSSL_KEIL
  118461. "muls r6, r7, r6\n\t"
  118462. #elif defined(__clang__)
  118463. "muls r6, r7\n\t"
  118464. #else
  118465. "mul r6, r7\n\t"
  118466. #endif
  118467. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118468. "lsrs r7, r6, #15\n\t"
  118469. #else
  118470. "lsr r7, r6, #15\n\t"
  118471. #endif
  118472. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118473. "lsls r6, r6, #17\n\t"
  118474. #else
  118475. "lsl r6, r6, #17\n\t"
  118476. #endif
  118477. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118478. "adds r3, r3, r6\n\t"
  118479. #else
  118480. "add r3, r3, r6\n\t"
  118481. #endif
  118482. #ifdef WOLFSSL_KEIL
  118483. "adcs r4, r4, r7\n\t"
  118484. #elif defined(__clang__)
  118485. "adcs r4, r7\n\t"
  118486. #else
  118487. "adc r4, r7\n\t"
  118488. #endif
  118489. #ifdef WOLFSSL_KEIL
  118490. "adcs r5, r5, %[r]\n\t"
  118491. #elif defined(__clang__)
  118492. "adcs r5, %[r]\n\t"
  118493. #else
  118494. "adc r5, %[r]\n\t"
  118495. #endif
  118496. "# Square: Done\n\t"
  118497. "mov r2, r12\n\t"
  118498. "\n"
  118499. "L_sp_521_sqr_17_done_sqr_%=:\n\t"
  118500. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118501. "adds %[a], %[a], #4\n\t"
  118502. #else
  118503. "add %[a], %[a], #4\n\t"
  118504. #endif
  118505. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118506. "subs r2, r2, #4\n\t"
  118507. #else
  118508. "sub r2, r2, #4\n\t"
  118509. #endif
  118510. "movs r6, #0x44\n\t"
  118511. "add r6, r6, r9\n\t"
  118512. "cmp %[a], r6\n\t"
  118513. "beq L_sp_521_sqr_17_done_mul_%=\n\t"
  118514. "cmp %[a], r2\n\t"
  118515. "bgt L_sp_521_sqr_17_done_mul_%=\n\t"
  118516. "mov r7, r8\n\t"
  118517. "add r7, r7, r9\n\t"
  118518. "cmp %[a], r7\n\t"
  118519. "ble L_sp_521_sqr_17_mul_%=\n\t"
  118520. "\n"
  118521. "L_sp_521_sqr_17_done_mul_%=:\n\t"
  118522. "mov %[r], r10\n\t"
  118523. "mov r7, r8\n\t"
  118524. "str r3, [%[r], r7]\n\t"
  118525. "movs r3, r4\n\t"
  118526. "movs r4, r5\n\t"
  118527. "movs r5, #0\n\t"
  118528. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118529. "adds r7, r7, #4\n\t"
  118530. #else
  118531. "add r7, r7, #4\n\t"
  118532. #endif
  118533. "mov r8, r7\n\t"
  118534. "movs r6, #0x80\n\t"
  118535. "cmp r7, r6\n\t"
  118536. "ble L_sp_521_sqr_17_words_%=\n\t"
  118537. "mov %[a], r9\n\t"
  118538. "str r3, [%[r], r7]\n\t"
  118539. "mov %[r], r11\n\t"
  118540. "mov %[a], r10\n\t"
  118541. "movs r3, #0x84\n\t"
  118542. "\n"
  118543. "L_sp_521_sqr_17_store_%=:\n\t"
  118544. "ldr r6, [%[a], r3]\n\t"
  118545. "str r6, [%[r], r3]\n\t"
  118546. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118547. "subs r3, r3, #4\n\t"
  118548. #else
  118549. "sub r3, r3, #4\n\t"
  118550. #endif
  118551. "bge L_sp_521_sqr_17_store_%=\n\t"
  118552. "movs r6, #0x88\n\t"
  118553. "add sp, sp, r6\n\t"
  118554. : [r] "+l" (r), [a] "+l" (a)
  118555. :
  118556. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  118557. );
  118558. }
  118559. #ifdef WOLFSSL_SP_SMALL
  118560. /* Add b to a into r. (r = a + b)
  118561. *
  118562. * r A single precision integer.
  118563. * a A single precision integer.
  118564. * b A single precision integer.
  118565. */
  118566. SP_NOINLINE static sp_digit sp_521_add_17(sp_digit* r, const sp_digit* a,
  118567. const sp_digit* b)
  118568. {
  118569. __asm__ __volatile__ (
  118570. "movs r6, %[a]\n\t"
  118571. "movs r7, #0\n\t"
  118572. "movs r3, #0\n\t"
  118573. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118574. "adds r6, r6, #0x44\n\t"
  118575. #else
  118576. "add r6, r6, #0x44\n\t"
  118577. #endif
  118578. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118579. "subs r7, r7, #1\n\t"
  118580. #else
  118581. "sub r7, r7, #1\n\t"
  118582. #endif
  118583. "\n"
  118584. "L_sp_521_add_17_word_%=:\n\t"
  118585. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118586. "adds r3, r3, r7\n\t"
  118587. #else
  118588. "add r3, r3, r7\n\t"
  118589. #endif
  118590. "ldr r4, [%[a]]\n\t"
  118591. "ldr r5, [%[b]]\n\t"
  118592. #ifdef WOLFSSL_KEIL
  118593. "adcs r4, r4, r5\n\t"
  118594. #elif defined(__clang__)
  118595. "adcs r4, r5\n\t"
  118596. #else
  118597. "adc r4, r5\n\t"
  118598. #endif
  118599. "str r4, [%[r]]\n\t"
  118600. "movs r3, #0\n\t"
  118601. #ifdef WOLFSSL_KEIL
  118602. "adcs r3, r3, r3\n\t"
  118603. #elif defined(__clang__)
  118604. "adcs r3, r3\n\t"
  118605. #else
  118606. "adc r3, r3\n\t"
  118607. #endif
  118608. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118609. "adds %[a], %[a], #4\n\t"
  118610. #else
  118611. "add %[a], %[a], #4\n\t"
  118612. #endif
  118613. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118614. "adds %[b], %[b], #4\n\t"
  118615. #else
  118616. "add %[b], %[b], #4\n\t"
  118617. #endif
  118618. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118619. "adds %[r], %[r], #4\n\t"
  118620. #else
  118621. "add %[r], %[r], #4\n\t"
  118622. #endif
  118623. "cmp %[a], r6\n\t"
  118624. "bne L_sp_521_add_17_word_%=\n\t"
  118625. "movs %[r], r3\n\t"
  118626. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  118627. :
  118628. : "memory", "r3", "r4", "r5", "r6", "r7"
  118629. );
  118630. return (uint32_t)(size_t)r;
  118631. }
  118632. #else
  118633. /* Add b to a into r. (r = a + b)
  118634. *
  118635. * r A single precision integer.
  118636. * a A single precision integer.
  118637. * b A single precision integer.
  118638. */
  118639. SP_NOINLINE static sp_digit sp_521_add_17(sp_digit* r, const sp_digit* a,
  118640. const sp_digit* b)
  118641. {
  118642. __asm__ __volatile__ (
  118643. "ldm %[b]!, {r5, r6}\n\t"
  118644. "ldm %[a]!, {r3, r4}\n\t"
  118645. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118646. "adds r3, r3, r5\n\t"
  118647. #else
  118648. "add r3, r3, r5\n\t"
  118649. #endif
  118650. #ifdef WOLFSSL_KEIL
  118651. "adcs r4, r4, r6\n\t"
  118652. #elif defined(__clang__)
  118653. "adcs r4, r6\n\t"
  118654. #else
  118655. "adc r4, r6\n\t"
  118656. #endif
  118657. "stm %[r]!, {r3, r4}\n\t"
  118658. "ldm %[b]!, {r5, r6}\n\t"
  118659. "ldm %[a]!, {r3, r4}\n\t"
  118660. #ifdef WOLFSSL_KEIL
  118661. "adcs r3, r3, r5\n\t"
  118662. #elif defined(__clang__)
  118663. "adcs r3, r5\n\t"
  118664. #else
  118665. "adc r3, r5\n\t"
  118666. #endif
  118667. #ifdef WOLFSSL_KEIL
  118668. "adcs r4, r4, r6\n\t"
  118669. #elif defined(__clang__)
  118670. "adcs r4, r6\n\t"
  118671. #else
  118672. "adc r4, r6\n\t"
  118673. #endif
  118674. "stm %[r]!, {r3, r4}\n\t"
  118675. "ldm %[b]!, {r5, r6}\n\t"
  118676. "ldm %[a]!, {r3, r4}\n\t"
  118677. #ifdef WOLFSSL_KEIL
  118678. "adcs r3, r3, r5\n\t"
  118679. #elif defined(__clang__)
  118680. "adcs r3, r5\n\t"
  118681. #else
  118682. "adc r3, r5\n\t"
  118683. #endif
  118684. #ifdef WOLFSSL_KEIL
  118685. "adcs r4, r4, r6\n\t"
  118686. #elif defined(__clang__)
  118687. "adcs r4, r6\n\t"
  118688. #else
  118689. "adc r4, r6\n\t"
  118690. #endif
  118691. "stm %[r]!, {r3, r4}\n\t"
  118692. "ldm %[b]!, {r5, r6}\n\t"
  118693. "ldm %[a]!, {r3, r4}\n\t"
  118694. #ifdef WOLFSSL_KEIL
  118695. "adcs r3, r3, r5\n\t"
  118696. #elif defined(__clang__)
  118697. "adcs r3, r5\n\t"
  118698. #else
  118699. "adc r3, r5\n\t"
  118700. #endif
  118701. #ifdef WOLFSSL_KEIL
  118702. "adcs r4, r4, r6\n\t"
  118703. #elif defined(__clang__)
  118704. "adcs r4, r6\n\t"
  118705. #else
  118706. "adc r4, r6\n\t"
  118707. #endif
  118708. "stm %[r]!, {r3, r4}\n\t"
  118709. "ldm %[b]!, {r5, r6}\n\t"
  118710. "ldm %[a]!, {r3, r4}\n\t"
  118711. #ifdef WOLFSSL_KEIL
  118712. "adcs r3, r3, r5\n\t"
  118713. #elif defined(__clang__)
  118714. "adcs r3, r5\n\t"
  118715. #else
  118716. "adc r3, r5\n\t"
  118717. #endif
  118718. #ifdef WOLFSSL_KEIL
  118719. "adcs r4, r4, r6\n\t"
  118720. #elif defined(__clang__)
  118721. "adcs r4, r6\n\t"
  118722. #else
  118723. "adc r4, r6\n\t"
  118724. #endif
  118725. "stm %[r]!, {r3, r4}\n\t"
  118726. "ldm %[b]!, {r5, r6}\n\t"
  118727. "ldm %[a]!, {r3, r4}\n\t"
  118728. #ifdef WOLFSSL_KEIL
  118729. "adcs r3, r3, r5\n\t"
  118730. #elif defined(__clang__)
  118731. "adcs r3, r5\n\t"
  118732. #else
  118733. "adc r3, r5\n\t"
  118734. #endif
  118735. #ifdef WOLFSSL_KEIL
  118736. "adcs r4, r4, r6\n\t"
  118737. #elif defined(__clang__)
  118738. "adcs r4, r6\n\t"
  118739. #else
  118740. "adc r4, r6\n\t"
  118741. #endif
  118742. "stm %[r]!, {r3, r4}\n\t"
  118743. "ldm %[b]!, {r5, r6}\n\t"
  118744. "ldm %[a]!, {r3, r4}\n\t"
  118745. #ifdef WOLFSSL_KEIL
  118746. "adcs r3, r3, r5\n\t"
  118747. #elif defined(__clang__)
  118748. "adcs r3, r5\n\t"
  118749. #else
  118750. "adc r3, r5\n\t"
  118751. #endif
  118752. #ifdef WOLFSSL_KEIL
  118753. "adcs r4, r4, r6\n\t"
  118754. #elif defined(__clang__)
  118755. "adcs r4, r6\n\t"
  118756. #else
  118757. "adc r4, r6\n\t"
  118758. #endif
  118759. "stm %[r]!, {r3, r4}\n\t"
  118760. "ldm %[b]!, {r5, r6}\n\t"
  118761. "ldm %[a]!, {r3, r4}\n\t"
  118762. #ifdef WOLFSSL_KEIL
  118763. "adcs r3, r3, r5\n\t"
  118764. #elif defined(__clang__)
  118765. "adcs r3, r5\n\t"
  118766. #else
  118767. "adc r3, r5\n\t"
  118768. #endif
  118769. #ifdef WOLFSSL_KEIL
  118770. "adcs r4, r4, r6\n\t"
  118771. #elif defined(__clang__)
  118772. "adcs r4, r6\n\t"
  118773. #else
  118774. "adc r4, r6\n\t"
  118775. #endif
  118776. "stm %[r]!, {r3, r4}\n\t"
  118777. "ldr r5, [%[b]]\n\t"
  118778. "ldr r3, [%[a]]\n\t"
  118779. #ifdef WOLFSSL_KEIL
  118780. "adcs r3, r3, r5\n\t"
  118781. #elif defined(__clang__)
  118782. "adcs r3, r5\n\t"
  118783. #else
  118784. "adc r3, r5\n\t"
  118785. #endif
  118786. "str r3, [%[r]]\n\t"
  118787. "movs %[r], #0\n\t"
  118788. #ifdef WOLFSSL_KEIL
  118789. "adcs %[r], %[r], %[r]\n\t"
  118790. #elif defined(__clang__)
  118791. "adcs %[r], %[r]\n\t"
  118792. #else
  118793. "adc %[r], %[r]\n\t"
  118794. #endif
  118795. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  118796. :
  118797. : "memory", "r3", "r4", "r5", "r6"
  118798. );
  118799. return (uint32_t)(size_t)r;
  118800. }
  118801. #endif /* WOLFSSL_SP_SMALL */
  118802. #ifdef WOLFSSL_SP_SMALL
  118803. /* Sub b from a into r. (r = a - b)
  118804. *
  118805. * r A single precision integer.
  118806. * a A single precision integer.
  118807. * b A single precision integer.
  118808. */
  118809. SP_NOINLINE static sp_digit sp_521_sub_17(sp_digit* r, const sp_digit* a,
  118810. const sp_digit* b)
  118811. {
  118812. __asm__ __volatile__ (
  118813. "movs r6, %[a]\n\t"
  118814. "movs r3, #0\n\t"
  118815. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118816. "adds r6, r6, #0x44\n\t"
  118817. #else
  118818. "add r6, r6, #0x44\n\t"
  118819. #endif
  118820. "\n"
  118821. "L_sp_521_sub_17_word_%=:\n\t"
  118822. "movs r5, #0\n\t"
  118823. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118824. "subs r5, r5, r3\n\t"
  118825. #else
  118826. "sub r5, r5, r3\n\t"
  118827. #endif
  118828. "ldr r4, [%[a]]\n\t"
  118829. "ldr r5, [%[b]]\n\t"
  118830. #ifdef WOLFSSL_KEIL
  118831. "sbcs r4, r4, r5\n\t"
  118832. #elif defined(__clang__)
  118833. "sbcs r4, r5\n\t"
  118834. #else
  118835. "sbc r4, r5\n\t"
  118836. #endif
  118837. "str r4, [%[r]]\n\t"
  118838. #ifdef WOLFSSL_KEIL
  118839. "sbcs r3, r3, r3\n\t"
  118840. #elif defined(__clang__)
  118841. "sbcs r3, r3\n\t"
  118842. #else
  118843. "sbc r3, r3\n\t"
  118844. #endif
  118845. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118846. "adds %[a], %[a], #4\n\t"
  118847. #else
  118848. "add %[a], %[a], #4\n\t"
  118849. #endif
  118850. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118851. "adds %[b], %[b], #4\n\t"
  118852. #else
  118853. "add %[b], %[b], #4\n\t"
  118854. #endif
  118855. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118856. "adds %[r], %[r], #4\n\t"
  118857. #else
  118858. "add %[r], %[r], #4\n\t"
  118859. #endif
  118860. "cmp %[a], r6\n\t"
  118861. "bne L_sp_521_sub_17_word_%=\n\t"
  118862. "movs %[r], r3\n\t"
  118863. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  118864. :
  118865. : "memory", "r3", "r4", "r5", "r6"
  118866. );
  118867. return (uint32_t)(size_t)r;
  118868. }
  118869. #else
  118870. /* Sub b from a into r. (r = a - b)
  118871. *
  118872. * r A single precision integer.
  118873. * a A single precision integer.
  118874. * b A single precision integer.
  118875. */
  118876. SP_NOINLINE static sp_digit sp_521_sub_17(sp_digit* r, const sp_digit* a,
  118877. const sp_digit* b)
  118878. {
  118879. __asm__ __volatile__ (
  118880. "ldm %[b]!, {r5, r6}\n\t"
  118881. "ldm %[a]!, {r3, r4}\n\t"
  118882. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118883. "subs r3, r3, r5\n\t"
  118884. #else
  118885. "sub r3, r3, r5\n\t"
  118886. #endif
  118887. #ifdef WOLFSSL_KEIL
  118888. "sbcs r4, r4, r6\n\t"
  118889. #elif defined(__clang__)
  118890. "sbcs r4, r6\n\t"
  118891. #else
  118892. "sbc r4, r6\n\t"
  118893. #endif
  118894. "stm %[r]!, {r3, r4}\n\t"
  118895. "ldm %[b]!, {r5, r6}\n\t"
  118896. "ldm %[a]!, {r3, r4}\n\t"
  118897. #ifdef WOLFSSL_KEIL
  118898. "sbcs r3, r3, r5\n\t"
  118899. #elif defined(__clang__)
  118900. "sbcs r3, r5\n\t"
  118901. #else
  118902. "sbc r3, r5\n\t"
  118903. #endif
  118904. #ifdef WOLFSSL_KEIL
  118905. "sbcs r4, r4, r6\n\t"
  118906. #elif defined(__clang__)
  118907. "sbcs r4, r6\n\t"
  118908. #else
  118909. "sbc r4, r6\n\t"
  118910. #endif
  118911. "stm %[r]!, {r3, r4}\n\t"
  118912. "ldm %[b]!, {r5, r6}\n\t"
  118913. "ldm %[a]!, {r3, r4}\n\t"
  118914. #ifdef WOLFSSL_KEIL
  118915. "sbcs r3, r3, r5\n\t"
  118916. #elif defined(__clang__)
  118917. "sbcs r3, r5\n\t"
  118918. #else
  118919. "sbc r3, r5\n\t"
  118920. #endif
  118921. #ifdef WOLFSSL_KEIL
  118922. "sbcs r4, r4, r6\n\t"
  118923. #elif defined(__clang__)
  118924. "sbcs r4, r6\n\t"
  118925. #else
  118926. "sbc r4, r6\n\t"
  118927. #endif
  118928. "stm %[r]!, {r3, r4}\n\t"
  118929. "ldm %[b]!, {r5, r6}\n\t"
  118930. "ldm %[a]!, {r3, r4}\n\t"
  118931. #ifdef WOLFSSL_KEIL
  118932. "sbcs r3, r3, r5\n\t"
  118933. #elif defined(__clang__)
  118934. "sbcs r3, r5\n\t"
  118935. #else
  118936. "sbc r3, r5\n\t"
  118937. #endif
  118938. #ifdef WOLFSSL_KEIL
  118939. "sbcs r4, r4, r6\n\t"
  118940. #elif defined(__clang__)
  118941. "sbcs r4, r6\n\t"
  118942. #else
  118943. "sbc r4, r6\n\t"
  118944. #endif
  118945. "stm %[r]!, {r3, r4}\n\t"
  118946. "ldm %[b]!, {r5, r6}\n\t"
  118947. "ldm %[a]!, {r3, r4}\n\t"
  118948. #ifdef WOLFSSL_KEIL
  118949. "sbcs r3, r3, r5\n\t"
  118950. #elif defined(__clang__)
  118951. "sbcs r3, r5\n\t"
  118952. #else
  118953. "sbc r3, r5\n\t"
  118954. #endif
  118955. #ifdef WOLFSSL_KEIL
  118956. "sbcs r4, r4, r6\n\t"
  118957. #elif defined(__clang__)
  118958. "sbcs r4, r6\n\t"
  118959. #else
  118960. "sbc r4, r6\n\t"
  118961. #endif
  118962. "stm %[r]!, {r3, r4}\n\t"
  118963. "ldm %[b]!, {r5, r6}\n\t"
  118964. "ldm %[a]!, {r3, r4}\n\t"
  118965. #ifdef WOLFSSL_KEIL
  118966. "sbcs r3, r3, r5\n\t"
  118967. #elif defined(__clang__)
  118968. "sbcs r3, r5\n\t"
  118969. #else
  118970. "sbc r3, r5\n\t"
  118971. #endif
  118972. #ifdef WOLFSSL_KEIL
  118973. "sbcs r4, r4, r6\n\t"
  118974. #elif defined(__clang__)
  118975. "sbcs r4, r6\n\t"
  118976. #else
  118977. "sbc r4, r6\n\t"
  118978. #endif
  118979. "stm %[r]!, {r3, r4}\n\t"
  118980. "ldm %[b]!, {r5, r6}\n\t"
  118981. "ldm %[a]!, {r3, r4}\n\t"
  118982. #ifdef WOLFSSL_KEIL
  118983. "sbcs r3, r3, r5\n\t"
  118984. #elif defined(__clang__)
  118985. "sbcs r3, r5\n\t"
  118986. #else
  118987. "sbc r3, r5\n\t"
  118988. #endif
  118989. #ifdef WOLFSSL_KEIL
  118990. "sbcs r4, r4, r6\n\t"
  118991. #elif defined(__clang__)
  118992. "sbcs r4, r6\n\t"
  118993. #else
  118994. "sbc r4, r6\n\t"
  118995. #endif
  118996. "stm %[r]!, {r3, r4}\n\t"
  118997. "ldm %[b]!, {r5, r6}\n\t"
  118998. "ldm %[a]!, {r3, r4}\n\t"
  118999. #ifdef WOLFSSL_KEIL
  119000. "sbcs r3, r3, r5\n\t"
  119001. #elif defined(__clang__)
  119002. "sbcs r3, r5\n\t"
  119003. #else
  119004. "sbc r3, r5\n\t"
  119005. #endif
  119006. #ifdef WOLFSSL_KEIL
  119007. "sbcs r4, r4, r6\n\t"
  119008. #elif defined(__clang__)
  119009. "sbcs r4, r6\n\t"
  119010. #else
  119011. "sbc r4, r6\n\t"
  119012. #endif
  119013. "stm %[r]!, {r3, r4}\n\t"
  119014. "ldr r5, [%[b]]\n\t"
  119015. "ldr r3, [%[a]]\n\t"
  119016. #ifdef WOLFSSL_KEIL
  119017. "sbcs r3, r3, r5\n\t"
  119018. #elif defined(__clang__)
  119019. "sbcs r3, r5\n\t"
  119020. #else
  119021. "sbc r3, r5\n\t"
  119022. #endif
  119023. "str r3, [%[r]]\n\t"
  119024. #ifdef WOLFSSL_KEIL
  119025. "sbcs %[r], %[r], %[r]\n\t"
  119026. #elif defined(__clang__)
  119027. "sbcs %[r], %[r]\n\t"
  119028. #else
  119029. "sbc %[r], %[r]\n\t"
  119030. #endif
  119031. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  119032. :
  119033. : "memory", "r3", "r4", "r5", "r6"
  119034. );
  119035. return (uint32_t)(size_t)r;
  119036. }
  119037. #endif /* WOLFSSL_SP_SMALL */
  119038. /* Multiply a number by Montgomery normalizer mod modulus (prime).
  119039. *
  119040. * r The resulting Montgomery form number.
  119041. * a The number to convert.
  119042. * m The modulus (prime).
  119043. * returns MEMORY_E when memory allocation fails and MP_OKAY otherwise.
  119044. */
  119045. static int sp_521_mod_mul_norm_17(sp_digit* r, const sp_digit* a, const sp_digit* m)
  119046. {
  119047. (void)m;
  119048. if (r != a) {
  119049. XMEMCPY(r, a, 17 * sizeof(sp_digit));
  119050. }
  119051. return MP_OKAY;
  119052. }
  119053. /* Convert an mp_int to an array of sp_digit.
  119054. *
  119055. * r A single precision integer.
  119056. * size Maximum number of bytes to convert
  119057. * a A multi-precision integer.
  119058. */
  119059. static void sp_521_from_mp(sp_digit* r, int size, const mp_int* a)
  119060. {
  119061. #if DIGIT_BIT == 32
  119062. int i;
  119063. int j = 0;
  119064. for (i = 0; i < size; i++) {
  119065. sp_digit mask =
  119066. (((sp_digit)(a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1;
  119067. r[i] = a->dp[j] & mask;
  119068. j += (int)(((sp_digit)1) -
  119069. (((sp_digit)(a->used - i - 2)) >> (SP_WORD_SIZE - 1)));
  119070. }
  119071. #elif DIGIT_BIT > 32
  119072. int i;
  119073. int j = 0;
  119074. word32 s = 0;
  119075. r[0] = 0;
  119076. for (i = 0; i < a->used && j < size; i++) {
  119077. r[j] |= ((sp_digit)a->dp[i] << s);
  119078. r[j] &= 0xffffffff;
  119079. s = 32U - s;
  119080. if (j + 1 >= size) {
  119081. break;
  119082. }
  119083. /* lint allow cast of mismatch word32 and mp_digit */
  119084. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  119085. while ((s + 32U) <= (word32)DIGIT_BIT) {
  119086. s += 32U;
  119087. r[j] &= 0xffffffff;
  119088. if (j + 1 >= size) {
  119089. break;
  119090. }
  119091. if (s < (word32)DIGIT_BIT) {
  119092. /* lint allow cast of mismatch word32 and mp_digit */
  119093. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  119094. }
  119095. else {
  119096. r[++j] = (sp_digit)0;
  119097. }
  119098. }
  119099. s = (word32)DIGIT_BIT - s;
  119100. }
  119101. for (j++; j < size; j++) {
  119102. r[j] = 0;
  119103. }
  119104. #else
  119105. int i;
  119106. int j = 0;
  119107. int s = 0;
  119108. r[0] = 0;
  119109. for (i = 0; i < a->used && j < size; i++) {
  119110. r[j] |= ((sp_digit)a->dp[i]) << s;
  119111. if (s + DIGIT_BIT >= 32) {
  119112. r[j] &= 0xffffffff;
  119113. if (j + 1 >= size) {
  119114. break;
  119115. }
  119116. s = 32 - s;
  119117. if (s == DIGIT_BIT) {
  119118. r[++j] = 0;
  119119. s = 0;
  119120. }
  119121. else {
  119122. r[++j] = a->dp[i] >> s;
  119123. s = DIGIT_BIT - s;
  119124. }
  119125. }
  119126. else {
  119127. s += DIGIT_BIT;
  119128. }
  119129. }
  119130. for (j++; j < size; j++) {
  119131. r[j] = 0;
  119132. }
  119133. #endif
  119134. }
  119135. /* Convert a point of type ecc_point to type sp_point_521.
  119136. *
  119137. * p Point of type sp_point_521 (result).
  119138. * pm Point of type ecc_point.
  119139. */
  119140. static void sp_521_point_from_ecc_point_17(sp_point_521* p,
  119141. const ecc_point* pm)
  119142. {
  119143. XMEMSET(p->x, 0, sizeof(p->x));
  119144. XMEMSET(p->y, 0, sizeof(p->y));
  119145. XMEMSET(p->z, 0, sizeof(p->z));
  119146. sp_521_from_mp(p->x, 17, pm->x);
  119147. sp_521_from_mp(p->y, 17, pm->y);
  119148. sp_521_from_mp(p->z, 17, pm->z);
  119149. p->infinity = 0;
  119150. }
  119151. /* Convert an array of sp_digit to an mp_int.
  119152. *
  119153. * a A single precision integer.
  119154. * r A multi-precision integer.
  119155. */
  119156. static int sp_521_to_mp(const sp_digit* a, mp_int* r)
  119157. {
  119158. int err;
  119159. err = mp_grow(r, (521 + DIGIT_BIT - 1) / DIGIT_BIT);
  119160. if (err == MP_OKAY) { /*lint !e774 case where err is always MP_OKAY*/
  119161. #if DIGIT_BIT == 32
  119162. XMEMCPY(r->dp, a, sizeof(sp_digit) * 17);
  119163. r->used = 17;
  119164. mp_clamp(r);
  119165. #elif DIGIT_BIT < 32
  119166. int i;
  119167. int j = 0;
  119168. int s = 0;
  119169. r->dp[0] = 0;
  119170. for (i = 0; i < 17; i++) {
  119171. r->dp[j] |= (mp_digit)(a[i] << s);
  119172. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  119173. s = DIGIT_BIT - s;
  119174. r->dp[++j] = (mp_digit)(a[i] >> s);
  119175. while (s + DIGIT_BIT <= 32) {
  119176. s += DIGIT_BIT;
  119177. r->dp[j++] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  119178. if (s == SP_WORD_SIZE) {
  119179. r->dp[j] = 0;
  119180. }
  119181. else {
  119182. r->dp[j] = (mp_digit)(a[i] >> s);
  119183. }
  119184. }
  119185. s = 32 - s;
  119186. }
  119187. r->used = (521 + DIGIT_BIT - 1) / DIGIT_BIT;
  119188. mp_clamp(r);
  119189. #else
  119190. int i;
  119191. int j = 0;
  119192. int s = 0;
  119193. r->dp[0] = 0;
  119194. for (i = 0; i < 17; i++) {
  119195. r->dp[j] |= ((mp_digit)a[i]) << s;
  119196. if (s + 32 >= DIGIT_BIT) {
  119197. #if DIGIT_BIT != 32 && DIGIT_BIT != 64
  119198. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  119199. #endif
  119200. s = DIGIT_BIT - s;
  119201. r->dp[++j] = a[i] >> s;
  119202. s = 32 - s;
  119203. }
  119204. else {
  119205. s += 32;
  119206. }
  119207. }
  119208. r->used = (521 + DIGIT_BIT - 1) / DIGIT_BIT;
  119209. mp_clamp(r);
  119210. #endif
  119211. }
  119212. return err;
  119213. }
  119214. /* Convert a point of type sp_point_521 to type ecc_point.
  119215. *
  119216. * p Point of type sp_point_521.
  119217. * pm Point of type ecc_point (result).
  119218. * returns MEMORY_E when allocation of memory in ecc_point fails otherwise
  119219. * MP_OKAY.
  119220. */
  119221. static int sp_521_point_to_ecc_point_17(const sp_point_521* p, ecc_point* pm)
  119222. {
  119223. int err;
  119224. err = sp_521_to_mp(p->x, pm->x);
  119225. if (err == MP_OKAY) {
  119226. err = sp_521_to_mp(p->y, pm->y);
  119227. }
  119228. if (err == MP_OKAY) {
  119229. err = sp_521_to_mp(p->z, pm->z);
  119230. }
  119231. return err;
  119232. }
  119233. /* Conditionally subtract b from a using the mask m.
  119234. * m is -1 to subtract and 0 when not copying.
  119235. *
  119236. * r A single precision number representing condition subtract result.
  119237. * a A single precision number to subtract from.
  119238. * b A single precision number to subtract.
  119239. * m Mask value to apply.
  119240. */
  119241. SP_NOINLINE static sp_digit sp_521_cond_sub_17(sp_digit* r, const sp_digit* a,
  119242. const sp_digit* b, sp_digit m)
  119243. {
  119244. __asm__ __volatile__ (
  119245. "movs r4, #0\n\t"
  119246. "movs r5, #0x44\n\t"
  119247. "mov r8, r5\n\t"
  119248. "movs r7, #0\n\t"
  119249. "\n"
  119250. "L_sp_521_cond_sub_17_words_%=:\n\t"
  119251. "ldr r6, [%[b], r7]\n\t"
  119252. #ifdef WOLFSSL_KEIL
  119253. "ands r6, r6, %[m]\n\t"
  119254. #elif defined(__clang__)
  119255. "ands r6, %[m]\n\t"
  119256. #else
  119257. "and r6, %[m]\n\t"
  119258. #endif
  119259. "movs r5, #0\n\t"
  119260. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119261. "subs r5, r5, r4\n\t"
  119262. #else
  119263. "sub r5, r5, r4\n\t"
  119264. #endif
  119265. "ldr r5, [%[a], r7]\n\t"
  119266. #ifdef WOLFSSL_KEIL
  119267. "sbcs r5, r5, r6\n\t"
  119268. #elif defined(__clang__)
  119269. "sbcs r5, r6\n\t"
  119270. #else
  119271. "sbc r5, r6\n\t"
  119272. #endif
  119273. #ifdef WOLFSSL_KEIL
  119274. "sbcs r4, r4, r4\n\t"
  119275. #elif defined(__clang__)
  119276. "sbcs r4, r4\n\t"
  119277. #else
  119278. "sbc r4, r4\n\t"
  119279. #endif
  119280. "str r5, [%[r], r7]\n\t"
  119281. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119282. "adds r7, r7, #4\n\t"
  119283. #else
  119284. "add r7, r7, #4\n\t"
  119285. #endif
  119286. "cmp r7, r8\n\t"
  119287. "blt L_sp_521_cond_sub_17_words_%=\n\t"
  119288. "movs %[r], r4\n\t"
  119289. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m)
  119290. :
  119291. : "memory", "r4", "r5", "r6", "r7", "r8"
  119292. );
  119293. return (uint32_t)(size_t)r;
  119294. }
  119295. /* Reduce the number back to 521 bits using Montgomery reduction.
  119296. *
  119297. * a A single precision number to reduce in place.
  119298. * m The single precision number representing the modulus.
  119299. * mp The digit representing the negative inverse of m mod 2^n.
  119300. */
  119301. SP_NOINLINE static void sp_521_mont_reduce_17(sp_digit* a, const sp_digit* m,
  119302. sp_digit mp)
  119303. {
  119304. (void)mp;
  119305. (void)m;
  119306. __asm__ __volatile__ (
  119307. "sub sp, sp, #0x44\n\t"
  119308. "mov r6, sp\n\t"
  119309. "movs r5, #0x40\n\t"
  119310. "movs r7, %[a]\n\t"
  119311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119312. "adds r7, r7, r5\n\t"
  119313. #else
  119314. "add r7, r7, r5\n\t"
  119315. #endif
  119316. "ldm r7!, {r1, r2, r3, r4}\n\t"
  119317. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119318. "lsls r5, r2, #23\n\t"
  119319. #else
  119320. "lsl r5, r2, #23\n\t"
  119321. #endif
  119322. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119323. "lsrs r1, r1, #9\n\t"
  119324. #else
  119325. "lsr r1, r1, #9\n\t"
  119326. #endif
  119327. #ifdef WOLFSSL_KEIL
  119328. "orrs r1, r1, r5\n\t"
  119329. #elif defined(__clang__)
  119330. "orrs r1, r5\n\t"
  119331. #else
  119332. "orr r1, r5\n\t"
  119333. #endif
  119334. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119335. "lsls r5, r3, #23\n\t"
  119336. #else
  119337. "lsl r5, r3, #23\n\t"
  119338. #endif
  119339. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119340. "lsrs r2, r2, #9\n\t"
  119341. #else
  119342. "lsr r2, r2, #9\n\t"
  119343. #endif
  119344. #ifdef WOLFSSL_KEIL
  119345. "orrs r2, r2, r5\n\t"
  119346. #elif defined(__clang__)
  119347. "orrs r2, r5\n\t"
  119348. #else
  119349. "orr r2, r5\n\t"
  119350. #endif
  119351. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119352. "lsls r5, r4, #23\n\t"
  119353. #else
  119354. "lsl r5, r4, #23\n\t"
  119355. #endif
  119356. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119357. "lsrs r3, r3, #9\n\t"
  119358. #else
  119359. "lsr r3, r3, #9\n\t"
  119360. #endif
  119361. #ifdef WOLFSSL_KEIL
  119362. "orrs r3, r3, r5\n\t"
  119363. #elif defined(__clang__)
  119364. "orrs r3, r5\n\t"
  119365. #else
  119366. "orr r3, r5\n\t"
  119367. #endif
  119368. "stm r6!, {r1, r2, r3}\n\t"
  119369. "movs r1, r4\n\t"
  119370. "ldm r7!, {r2, r3, r4}\n\t"
  119371. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119372. "lsls r5, r2, #23\n\t"
  119373. #else
  119374. "lsl r5, r2, #23\n\t"
  119375. #endif
  119376. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119377. "lsrs r1, r1, #9\n\t"
  119378. #else
  119379. "lsr r1, r1, #9\n\t"
  119380. #endif
  119381. #ifdef WOLFSSL_KEIL
  119382. "orrs r1, r1, r5\n\t"
  119383. #elif defined(__clang__)
  119384. "orrs r1, r5\n\t"
  119385. #else
  119386. "orr r1, r5\n\t"
  119387. #endif
  119388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119389. "lsls r5, r3, #23\n\t"
  119390. #else
  119391. "lsl r5, r3, #23\n\t"
  119392. #endif
  119393. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119394. "lsrs r2, r2, #9\n\t"
  119395. #else
  119396. "lsr r2, r2, #9\n\t"
  119397. #endif
  119398. #ifdef WOLFSSL_KEIL
  119399. "orrs r2, r2, r5\n\t"
  119400. #elif defined(__clang__)
  119401. "orrs r2, r5\n\t"
  119402. #else
  119403. "orr r2, r5\n\t"
  119404. #endif
  119405. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119406. "lsls r5, r4, #23\n\t"
  119407. #else
  119408. "lsl r5, r4, #23\n\t"
  119409. #endif
  119410. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119411. "lsrs r3, r3, #9\n\t"
  119412. #else
  119413. "lsr r3, r3, #9\n\t"
  119414. #endif
  119415. #ifdef WOLFSSL_KEIL
  119416. "orrs r3, r3, r5\n\t"
  119417. #elif defined(__clang__)
  119418. "orrs r3, r5\n\t"
  119419. #else
  119420. "orr r3, r5\n\t"
  119421. #endif
  119422. "stm r6!, {r1, r2, r3}\n\t"
  119423. "movs r1, r4\n\t"
  119424. "ldm r7!, {r2, r3, r4}\n\t"
  119425. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119426. "lsls r5, r2, #23\n\t"
  119427. #else
  119428. "lsl r5, r2, #23\n\t"
  119429. #endif
  119430. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119431. "lsrs r1, r1, #9\n\t"
  119432. #else
  119433. "lsr r1, r1, #9\n\t"
  119434. #endif
  119435. #ifdef WOLFSSL_KEIL
  119436. "orrs r1, r1, r5\n\t"
  119437. #elif defined(__clang__)
  119438. "orrs r1, r5\n\t"
  119439. #else
  119440. "orr r1, r5\n\t"
  119441. #endif
  119442. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119443. "lsls r5, r3, #23\n\t"
  119444. #else
  119445. "lsl r5, r3, #23\n\t"
  119446. #endif
  119447. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119448. "lsrs r2, r2, #9\n\t"
  119449. #else
  119450. "lsr r2, r2, #9\n\t"
  119451. #endif
  119452. #ifdef WOLFSSL_KEIL
  119453. "orrs r2, r2, r5\n\t"
  119454. #elif defined(__clang__)
  119455. "orrs r2, r5\n\t"
  119456. #else
  119457. "orr r2, r5\n\t"
  119458. #endif
  119459. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119460. "lsls r5, r4, #23\n\t"
  119461. #else
  119462. "lsl r5, r4, #23\n\t"
  119463. #endif
  119464. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119465. "lsrs r3, r3, #9\n\t"
  119466. #else
  119467. "lsr r3, r3, #9\n\t"
  119468. #endif
  119469. #ifdef WOLFSSL_KEIL
  119470. "orrs r3, r3, r5\n\t"
  119471. #elif defined(__clang__)
  119472. "orrs r3, r5\n\t"
  119473. #else
  119474. "orr r3, r5\n\t"
  119475. #endif
  119476. "stm r6!, {r1, r2, r3}\n\t"
  119477. "movs r1, r4\n\t"
  119478. "ldm r7!, {r2, r3, r4}\n\t"
  119479. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119480. "lsls r5, r2, #23\n\t"
  119481. #else
  119482. "lsl r5, r2, #23\n\t"
  119483. #endif
  119484. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119485. "lsrs r1, r1, #9\n\t"
  119486. #else
  119487. "lsr r1, r1, #9\n\t"
  119488. #endif
  119489. #ifdef WOLFSSL_KEIL
  119490. "orrs r1, r1, r5\n\t"
  119491. #elif defined(__clang__)
  119492. "orrs r1, r5\n\t"
  119493. #else
  119494. "orr r1, r5\n\t"
  119495. #endif
  119496. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119497. "lsls r5, r3, #23\n\t"
  119498. #else
  119499. "lsl r5, r3, #23\n\t"
  119500. #endif
  119501. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119502. "lsrs r2, r2, #9\n\t"
  119503. #else
  119504. "lsr r2, r2, #9\n\t"
  119505. #endif
  119506. #ifdef WOLFSSL_KEIL
  119507. "orrs r2, r2, r5\n\t"
  119508. #elif defined(__clang__)
  119509. "orrs r2, r5\n\t"
  119510. #else
  119511. "orr r2, r5\n\t"
  119512. #endif
  119513. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119514. "lsls r5, r4, #23\n\t"
  119515. #else
  119516. "lsl r5, r4, #23\n\t"
  119517. #endif
  119518. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119519. "lsrs r3, r3, #9\n\t"
  119520. #else
  119521. "lsr r3, r3, #9\n\t"
  119522. #endif
  119523. #ifdef WOLFSSL_KEIL
  119524. "orrs r3, r3, r5\n\t"
  119525. #elif defined(__clang__)
  119526. "orrs r3, r5\n\t"
  119527. #else
  119528. "orr r3, r5\n\t"
  119529. #endif
  119530. "stm r6!, {r1, r2, r3}\n\t"
  119531. "movs r1, r4\n\t"
  119532. "ldm r7!, {r2, r3, r4}\n\t"
  119533. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119534. "lsls r5, r2, #23\n\t"
  119535. #else
  119536. "lsl r5, r2, #23\n\t"
  119537. #endif
  119538. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119539. "lsrs r1, r1, #9\n\t"
  119540. #else
  119541. "lsr r1, r1, #9\n\t"
  119542. #endif
  119543. #ifdef WOLFSSL_KEIL
  119544. "orrs r1, r1, r5\n\t"
  119545. #elif defined(__clang__)
  119546. "orrs r1, r5\n\t"
  119547. #else
  119548. "orr r1, r5\n\t"
  119549. #endif
  119550. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119551. "lsls r5, r3, #23\n\t"
  119552. #else
  119553. "lsl r5, r3, #23\n\t"
  119554. #endif
  119555. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119556. "lsrs r2, r2, #9\n\t"
  119557. #else
  119558. "lsr r2, r2, #9\n\t"
  119559. #endif
  119560. #ifdef WOLFSSL_KEIL
  119561. "orrs r2, r2, r5\n\t"
  119562. #elif defined(__clang__)
  119563. "orrs r2, r5\n\t"
  119564. #else
  119565. "orr r2, r5\n\t"
  119566. #endif
  119567. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119568. "lsls r5, r4, #23\n\t"
  119569. #else
  119570. "lsl r5, r4, #23\n\t"
  119571. #endif
  119572. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119573. "lsrs r3, r3, #9\n\t"
  119574. #else
  119575. "lsr r3, r3, #9\n\t"
  119576. #endif
  119577. #ifdef WOLFSSL_KEIL
  119578. "orrs r3, r3, r5\n\t"
  119579. #elif defined(__clang__)
  119580. "orrs r3, r5\n\t"
  119581. #else
  119582. "orr r3, r5\n\t"
  119583. #endif
  119584. "stm r6!, {r1, r2, r3}\n\t"
  119585. "movs r1, r4\n\t"
  119586. "ldm r7!, {r2}\n\t"
  119587. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119588. "lsls r5, r2, #23\n\t"
  119589. #else
  119590. "lsl r5, r2, #23\n\t"
  119591. #endif
  119592. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119593. "lsrs r1, r1, #9\n\t"
  119594. #else
  119595. "lsr r1, r1, #9\n\t"
  119596. #endif
  119597. #ifdef WOLFSSL_KEIL
  119598. "orrs r1, r1, r5\n\t"
  119599. #elif defined(__clang__)
  119600. "orrs r1, r5\n\t"
  119601. #else
  119602. "orr r1, r5\n\t"
  119603. #endif
  119604. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119605. "lsrs r2, r2, #9\n\t"
  119606. #else
  119607. "lsr r2, r2, #9\n\t"
  119608. #endif
  119609. "stm r6!, {r1, r2}\n\t"
  119610. "ldr r1, [%[a], #64]\n\t"
  119611. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119612. "lsls r1, r1, #23\n\t"
  119613. #else
  119614. "lsl r1, r1, #23\n\t"
  119615. #endif
  119616. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119617. "lsrs r1, r1, #23\n\t"
  119618. #else
  119619. "lsr r1, r1, #23\n\t"
  119620. #endif
  119621. "mov r8, r1\n\t"
  119622. "mov r7, sp\n\t"
  119623. "ldr r1, [%[a]]\n\t"
  119624. "ldr r2, [%[a], #4]\n\t"
  119625. "ldr r3, [%[a], #8]\n\t"
  119626. "ldm r7!, {r4, r5, r6}\n\t"
  119627. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119628. "adds r1, r1, r4\n\t"
  119629. #else
  119630. "add r1, r1, r4\n\t"
  119631. #endif
  119632. #ifdef WOLFSSL_KEIL
  119633. "adcs r2, r2, r5\n\t"
  119634. #elif defined(__clang__)
  119635. "adcs r2, r5\n\t"
  119636. #else
  119637. "adc r2, r5\n\t"
  119638. #endif
  119639. #ifdef WOLFSSL_KEIL
  119640. "adcs r3, r3, r6\n\t"
  119641. #elif defined(__clang__)
  119642. "adcs r3, r6\n\t"
  119643. #else
  119644. "adc r3, r6\n\t"
  119645. #endif
  119646. "stm %[a]!, {r1, r2, r3}\n\t"
  119647. "ldr r1, [%[a]]\n\t"
  119648. "ldr r2, [%[a], #4]\n\t"
  119649. "ldr r3, [%[a], #8]\n\t"
  119650. "ldm r7!, {r4, r5, r6}\n\t"
  119651. #ifdef WOLFSSL_KEIL
  119652. "adcs r1, r1, r4\n\t"
  119653. #elif defined(__clang__)
  119654. "adcs r1, r4\n\t"
  119655. #else
  119656. "adc r1, r4\n\t"
  119657. #endif
  119658. #ifdef WOLFSSL_KEIL
  119659. "adcs r2, r2, r5\n\t"
  119660. #elif defined(__clang__)
  119661. "adcs r2, r5\n\t"
  119662. #else
  119663. "adc r2, r5\n\t"
  119664. #endif
  119665. #ifdef WOLFSSL_KEIL
  119666. "adcs r3, r3, r6\n\t"
  119667. #elif defined(__clang__)
  119668. "adcs r3, r6\n\t"
  119669. #else
  119670. "adc r3, r6\n\t"
  119671. #endif
  119672. "stm %[a]!, {r1, r2, r3}\n\t"
  119673. "ldr r1, [%[a]]\n\t"
  119674. "ldr r2, [%[a], #4]\n\t"
  119675. "ldr r3, [%[a], #8]\n\t"
  119676. "ldm r7!, {r4, r5, r6}\n\t"
  119677. #ifdef WOLFSSL_KEIL
  119678. "adcs r1, r1, r4\n\t"
  119679. #elif defined(__clang__)
  119680. "adcs r1, r4\n\t"
  119681. #else
  119682. "adc r1, r4\n\t"
  119683. #endif
  119684. #ifdef WOLFSSL_KEIL
  119685. "adcs r2, r2, r5\n\t"
  119686. #elif defined(__clang__)
  119687. "adcs r2, r5\n\t"
  119688. #else
  119689. "adc r2, r5\n\t"
  119690. #endif
  119691. #ifdef WOLFSSL_KEIL
  119692. "adcs r3, r3, r6\n\t"
  119693. #elif defined(__clang__)
  119694. "adcs r3, r6\n\t"
  119695. #else
  119696. "adc r3, r6\n\t"
  119697. #endif
  119698. "stm %[a]!, {r1, r2, r3}\n\t"
  119699. "ldr r1, [%[a]]\n\t"
  119700. "ldr r2, [%[a], #4]\n\t"
  119701. "ldr r3, [%[a], #8]\n\t"
  119702. "ldm r7!, {r4, r5, r6}\n\t"
  119703. #ifdef WOLFSSL_KEIL
  119704. "adcs r1, r1, r4\n\t"
  119705. #elif defined(__clang__)
  119706. "adcs r1, r4\n\t"
  119707. #else
  119708. "adc r1, r4\n\t"
  119709. #endif
  119710. #ifdef WOLFSSL_KEIL
  119711. "adcs r2, r2, r5\n\t"
  119712. #elif defined(__clang__)
  119713. "adcs r2, r5\n\t"
  119714. #else
  119715. "adc r2, r5\n\t"
  119716. #endif
  119717. #ifdef WOLFSSL_KEIL
  119718. "adcs r3, r3, r6\n\t"
  119719. #elif defined(__clang__)
  119720. "adcs r3, r6\n\t"
  119721. #else
  119722. "adc r3, r6\n\t"
  119723. #endif
  119724. "stm %[a]!, {r1, r2, r3}\n\t"
  119725. "ldr r1, [%[a]]\n\t"
  119726. "ldr r2, [%[a], #4]\n\t"
  119727. "ldr r3, [%[a], #8]\n\t"
  119728. "ldm r7!, {r4, r5, r6}\n\t"
  119729. #ifdef WOLFSSL_KEIL
  119730. "adcs r1, r1, r4\n\t"
  119731. #elif defined(__clang__)
  119732. "adcs r1, r4\n\t"
  119733. #else
  119734. "adc r1, r4\n\t"
  119735. #endif
  119736. #ifdef WOLFSSL_KEIL
  119737. "adcs r2, r2, r5\n\t"
  119738. #elif defined(__clang__)
  119739. "adcs r2, r5\n\t"
  119740. #else
  119741. "adc r2, r5\n\t"
  119742. #endif
  119743. #ifdef WOLFSSL_KEIL
  119744. "adcs r3, r3, r6\n\t"
  119745. #elif defined(__clang__)
  119746. "adcs r3, r6\n\t"
  119747. #else
  119748. "adc r3, r6\n\t"
  119749. #endif
  119750. "stm %[a]!, {r1, r2, r3}\n\t"
  119751. "ldr r1, [%[a]]\n\t"
  119752. "ldm r7!, {r4, r5}\n\t"
  119753. "mov r2, r8\n\t"
  119754. #ifdef WOLFSSL_KEIL
  119755. "adcs r1, r1, r4\n\t"
  119756. #elif defined(__clang__)
  119757. "adcs r1, r4\n\t"
  119758. #else
  119759. "adc r1, r4\n\t"
  119760. #endif
  119761. #ifdef WOLFSSL_KEIL
  119762. "adcs r2, r2, r5\n\t"
  119763. #elif defined(__clang__)
  119764. "adcs r2, r5\n\t"
  119765. #else
  119766. "adc r2, r5\n\t"
  119767. #endif
  119768. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119769. "lsrs r6, r2, #9\n\t"
  119770. #else
  119771. "lsr r6, r2, #9\n\t"
  119772. #endif
  119773. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119774. "lsls r2, r2, #23\n\t"
  119775. #else
  119776. "lsl r2, r2, #23\n\t"
  119777. #endif
  119778. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119779. "lsrs r2, r2, #23\n\t"
  119780. #else
  119781. "lsr r2, r2, #23\n\t"
  119782. #endif
  119783. "stm %[a]!, {r1, r2}\n\t"
  119784. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119785. "subs %[a], %[a], #0x44\n\t"
  119786. #else
  119787. "sub %[a], %[a], #0x44\n\t"
  119788. #endif
  119789. "movs r5, #0\n\t"
  119790. "ldr r1, [%[a]]\n\t"
  119791. "ldr r2, [%[a], #4]\n\t"
  119792. "ldr r3, [%[a], #8]\n\t"
  119793. "ldr r4, [%[a], #12]\n\t"
  119794. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119795. "adds r1, r1, r6\n\t"
  119796. #else
  119797. "add r1, r1, r6\n\t"
  119798. #endif
  119799. #ifdef WOLFSSL_KEIL
  119800. "adcs r2, r2, r5\n\t"
  119801. #elif defined(__clang__)
  119802. "adcs r2, r5\n\t"
  119803. #else
  119804. "adc r2, r5\n\t"
  119805. #endif
  119806. #ifdef WOLFSSL_KEIL
  119807. "adcs r3, r3, r5\n\t"
  119808. #elif defined(__clang__)
  119809. "adcs r3, r5\n\t"
  119810. #else
  119811. "adc r3, r5\n\t"
  119812. #endif
  119813. #ifdef WOLFSSL_KEIL
  119814. "adcs r4, r4, r5\n\t"
  119815. #elif defined(__clang__)
  119816. "adcs r4, r5\n\t"
  119817. #else
  119818. "adc r4, r5\n\t"
  119819. #endif
  119820. "stm %[a]!, {r1, r2, r3, r4}\n\t"
  119821. "ldr r1, [%[a]]\n\t"
  119822. "ldr r2, [%[a], #4]\n\t"
  119823. "ldr r3, [%[a], #8]\n\t"
  119824. "ldr r4, [%[a], #12]\n\t"
  119825. #ifdef WOLFSSL_KEIL
  119826. "adcs r1, r1, r5\n\t"
  119827. #elif defined(__clang__)
  119828. "adcs r1, r5\n\t"
  119829. #else
  119830. "adc r1, r5\n\t"
  119831. #endif
  119832. #ifdef WOLFSSL_KEIL
  119833. "adcs r2, r2, r5\n\t"
  119834. #elif defined(__clang__)
  119835. "adcs r2, r5\n\t"
  119836. #else
  119837. "adc r2, r5\n\t"
  119838. #endif
  119839. #ifdef WOLFSSL_KEIL
  119840. "adcs r3, r3, r5\n\t"
  119841. #elif defined(__clang__)
  119842. "adcs r3, r5\n\t"
  119843. #else
  119844. "adc r3, r5\n\t"
  119845. #endif
  119846. #ifdef WOLFSSL_KEIL
  119847. "adcs r4, r4, r5\n\t"
  119848. #elif defined(__clang__)
  119849. "adcs r4, r5\n\t"
  119850. #else
  119851. "adc r4, r5\n\t"
  119852. #endif
  119853. "stm %[a]!, {r1, r2, r3, r4}\n\t"
  119854. "ldr r1, [%[a]]\n\t"
  119855. "ldr r2, [%[a], #4]\n\t"
  119856. "ldr r3, [%[a], #8]\n\t"
  119857. "ldr r4, [%[a], #12]\n\t"
  119858. #ifdef WOLFSSL_KEIL
  119859. "adcs r1, r1, r5\n\t"
  119860. #elif defined(__clang__)
  119861. "adcs r1, r5\n\t"
  119862. #else
  119863. "adc r1, r5\n\t"
  119864. #endif
  119865. #ifdef WOLFSSL_KEIL
  119866. "adcs r2, r2, r5\n\t"
  119867. #elif defined(__clang__)
  119868. "adcs r2, r5\n\t"
  119869. #else
  119870. "adc r2, r5\n\t"
  119871. #endif
  119872. #ifdef WOLFSSL_KEIL
  119873. "adcs r3, r3, r5\n\t"
  119874. #elif defined(__clang__)
  119875. "adcs r3, r5\n\t"
  119876. #else
  119877. "adc r3, r5\n\t"
  119878. #endif
  119879. #ifdef WOLFSSL_KEIL
  119880. "adcs r4, r4, r5\n\t"
  119881. #elif defined(__clang__)
  119882. "adcs r4, r5\n\t"
  119883. #else
  119884. "adc r4, r5\n\t"
  119885. #endif
  119886. "stm %[a]!, {r1, r2, r3, r4}\n\t"
  119887. "ldr r1, [%[a]]\n\t"
  119888. "ldr r2, [%[a], #4]\n\t"
  119889. "ldr r3, [%[a], #8]\n\t"
  119890. "ldr r4, [%[a], #12]\n\t"
  119891. #ifdef WOLFSSL_KEIL
  119892. "adcs r1, r1, r5\n\t"
  119893. #elif defined(__clang__)
  119894. "adcs r1, r5\n\t"
  119895. #else
  119896. "adc r1, r5\n\t"
  119897. #endif
  119898. #ifdef WOLFSSL_KEIL
  119899. "adcs r2, r2, r5\n\t"
  119900. #elif defined(__clang__)
  119901. "adcs r2, r5\n\t"
  119902. #else
  119903. "adc r2, r5\n\t"
  119904. #endif
  119905. #ifdef WOLFSSL_KEIL
  119906. "adcs r3, r3, r5\n\t"
  119907. #elif defined(__clang__)
  119908. "adcs r3, r5\n\t"
  119909. #else
  119910. "adc r3, r5\n\t"
  119911. #endif
  119912. #ifdef WOLFSSL_KEIL
  119913. "adcs r4, r4, r5\n\t"
  119914. #elif defined(__clang__)
  119915. "adcs r4, r5\n\t"
  119916. #else
  119917. "adc r4, r5\n\t"
  119918. #endif
  119919. "stm %[a]!, {r1, r2, r3, r4}\n\t"
  119920. "ldr r1, [%[a]]\n\t"
  119921. #ifdef WOLFSSL_KEIL
  119922. "adcs r1, r1, r5\n\t"
  119923. #elif defined(__clang__)
  119924. "adcs r1, r5\n\t"
  119925. #else
  119926. "adc r1, r5\n\t"
  119927. #endif
  119928. "stm %[a]!, {r1}\n\t"
  119929. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119930. "subs %[a], %[a], #0x44\n\t"
  119931. #else
  119932. "sub %[a], %[a], #0x44\n\t"
  119933. #endif
  119934. "add sp, sp, #0x44\n\t"
  119935. : [a] "+l" (a)
  119936. :
  119937. : "memory", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8"
  119938. );
  119939. }
  119940. /* Reduce the number back to 521 bits using Montgomery reduction.
  119941. *
  119942. * a A single precision number to reduce in place.
  119943. * m The single precision number representing the modulus.
  119944. * mp The digit representing the negative inverse of m mod 2^n.
  119945. */
  119946. SP_NOINLINE static void sp_521_mont_reduce_order_17(sp_digit* a,
  119947. const sp_digit* m, sp_digit mp)
  119948. {
  119949. __asm__ __volatile__ (
  119950. "movs r7, #0\n\t"
  119951. "mov r8, %[mp]\n\t"
  119952. "mov r12, r7\n\t"
  119953. "mov lr, %[m]\n\t"
  119954. "mov r9, %[a]\n\t"
  119955. "mov r11, %[a]\n\t"
  119956. "movs r5, #0x40\n\t"
  119957. "movs r6, #0x44\n\t"
  119958. "add r9, r9, r5\n\t"
  119959. "add r11, r11, r6\n\t"
  119960. "\n"
  119961. "L_sp_521_mont_reduce_order_17_mod_%=:\n\t"
  119962. "movs r7, #0\n\t"
  119963. "movs r4, #0\n\t"
  119964. "# a[i] += m[0] * mu\n\t"
  119965. "ldm %[m]!, {%[mp]}\n\t"
  119966. "ldr r3, [%[a]]\n\t"
  119967. "# mu = a[i] * mp\n\t"
  119968. "mov r5, r8\n\t"
  119969. #ifdef WOLFSSL_KEIL
  119970. "muls r5, r3, r5\n\t"
  119971. #elif defined(__clang__)
  119972. "muls r5, r3\n\t"
  119973. #else
  119974. "mul r5, r3\n\t"
  119975. #endif
  119976. "mov r6, r11\n\t"
  119977. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119978. "subs r6, r6, #4\n\t"
  119979. #else
  119980. "sub r6, r6, #4\n\t"
  119981. #endif
  119982. "cmp %[a], r6\n\t"
  119983. "bne L_sp_521_mont_reduce_order_17_nomask_%=\n\t"
  119984. "movs r6, #1\n\t"
  119985. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119986. "lsls r6, r6, #8\n\t"
  119987. #else
  119988. "lsl r6, r6, #8\n\t"
  119989. #endif
  119990. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119991. "adds r6, r6, #0xff\n\t"
  119992. #else
  119993. "add r6, r6, #0xff\n\t"
  119994. #endif
  119995. #ifdef WOLFSSL_KEIL
  119996. "ands r5, r5, r6\n\t"
  119997. #elif defined(__clang__)
  119998. "ands r5, r6\n\t"
  119999. #else
  120000. "and r5, r6\n\t"
  120001. #endif
  120002. "\n"
  120003. "L_sp_521_mont_reduce_order_17_nomask_%=:\n\t"
  120004. "mov r10, r5\n\t"
  120005. "# Multiply m[0] and mu - Start\n\t"
  120006. "mov r5, r10\n\t"
  120007. "uxth r6, %[mp]\n\t"
  120008. "uxth r5, r5\n\t"
  120009. #ifdef WOLFSSL_KEIL
  120010. "muls r6, r5, r6\n\t"
  120011. #elif defined(__clang__)
  120012. "muls r6, r5\n\t"
  120013. #else
  120014. "mul r6, r5\n\t"
  120015. #endif
  120016. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120017. "adds r3, r3, r6\n\t"
  120018. #else
  120019. "add r3, r3, r6\n\t"
  120020. #endif
  120021. #ifdef WOLFSSL_KEIL
  120022. "adcs r4, r4, r7\n\t"
  120023. #elif defined(__clang__)
  120024. "adcs r4, r7\n\t"
  120025. #else
  120026. "adc r4, r7\n\t"
  120027. #endif
  120028. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120029. "lsrs r6, %[mp], #16\n\t"
  120030. #else
  120031. "lsr r6, %[mp], #16\n\t"
  120032. #endif
  120033. #ifdef WOLFSSL_KEIL
  120034. "muls r5, r6, r5\n\t"
  120035. #elif defined(__clang__)
  120036. "muls r5, r6\n\t"
  120037. #else
  120038. "mul r5, r6\n\t"
  120039. #endif
  120040. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120041. "lsrs r6, r5, #16\n\t"
  120042. #else
  120043. "lsr r6, r5, #16\n\t"
  120044. #endif
  120045. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120046. "lsls r5, r5, #16\n\t"
  120047. #else
  120048. "lsl r5, r5, #16\n\t"
  120049. #endif
  120050. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120051. "adds r3, r3, r5\n\t"
  120052. #else
  120053. "add r3, r3, r5\n\t"
  120054. #endif
  120055. #ifdef WOLFSSL_KEIL
  120056. "adcs r4, r4, r6\n\t"
  120057. #elif defined(__clang__)
  120058. "adcs r4, r6\n\t"
  120059. #else
  120060. "adc r4, r6\n\t"
  120061. #endif
  120062. "mov r5, r10\n\t"
  120063. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120064. "lsrs r6, %[mp], #16\n\t"
  120065. #else
  120066. "lsr r6, %[mp], #16\n\t"
  120067. #endif
  120068. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120069. "lsrs r5, r5, #16\n\t"
  120070. #else
  120071. "lsr r5, r5, #16\n\t"
  120072. #endif
  120073. #ifdef WOLFSSL_KEIL
  120074. "muls r6, r5, r6\n\t"
  120075. #elif defined(__clang__)
  120076. "muls r6, r5\n\t"
  120077. #else
  120078. "mul r6, r5\n\t"
  120079. #endif
  120080. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120081. "adds r4, r4, r6\n\t"
  120082. #else
  120083. "add r4, r4, r6\n\t"
  120084. #endif
  120085. "uxth r6, %[mp]\n\t"
  120086. #ifdef WOLFSSL_KEIL
  120087. "muls r5, r6, r5\n\t"
  120088. #elif defined(__clang__)
  120089. "muls r5, r6\n\t"
  120090. #else
  120091. "mul r5, r6\n\t"
  120092. #endif
  120093. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120094. "lsrs r6, r5, #16\n\t"
  120095. #else
  120096. "lsr r6, r5, #16\n\t"
  120097. #endif
  120098. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120099. "lsls r5, r5, #16\n\t"
  120100. #else
  120101. "lsl r5, r5, #16\n\t"
  120102. #endif
  120103. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120104. "adds r3, r3, r5\n\t"
  120105. #else
  120106. "add r3, r3, r5\n\t"
  120107. #endif
  120108. #ifdef WOLFSSL_KEIL
  120109. "adcs r4, r4, r6\n\t"
  120110. #elif defined(__clang__)
  120111. "adcs r4, r6\n\t"
  120112. #else
  120113. "adc r4, r6\n\t"
  120114. #endif
  120115. "# Multiply m[0] and mu - Done\n\t"
  120116. "stm %[a]!, {r3}\n\t"
  120117. "\n"
  120118. "L_sp_521_mont_reduce_order_17_word_%=:\n\t"
  120119. "# a[i+j] += m[j] * mu\n\t"
  120120. "ldr r3, [%[a]]\n\t"
  120121. "ldm %[m]!, {%[mp]}\n\t"
  120122. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120123. "adds r3, r3, r4\n\t"
  120124. #else
  120125. "add r3, r3, r4\n\t"
  120126. #endif
  120127. "movs r4, #0\n\t"
  120128. #ifdef WOLFSSL_KEIL
  120129. "adcs r4, r4, r7\n\t"
  120130. #elif defined(__clang__)
  120131. "adcs r4, r7\n\t"
  120132. #else
  120133. "adc r4, r7\n\t"
  120134. #endif
  120135. "# Multiply m[j] and mu - Start\n\t"
  120136. "mov r5, r10\n\t"
  120137. "uxth r6, %[mp]\n\t"
  120138. "uxth r5, r5\n\t"
  120139. #ifdef WOLFSSL_KEIL
  120140. "muls r6, r5, r6\n\t"
  120141. #elif defined(__clang__)
  120142. "muls r6, r5\n\t"
  120143. #else
  120144. "mul r6, r5\n\t"
  120145. #endif
  120146. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120147. "adds r3, r3, r6\n\t"
  120148. #else
  120149. "add r3, r3, r6\n\t"
  120150. #endif
  120151. #ifdef WOLFSSL_KEIL
  120152. "adcs r4, r4, r7\n\t"
  120153. #elif defined(__clang__)
  120154. "adcs r4, r7\n\t"
  120155. #else
  120156. "adc r4, r7\n\t"
  120157. #endif
  120158. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120159. "lsrs r6, %[mp], #16\n\t"
  120160. #else
  120161. "lsr r6, %[mp], #16\n\t"
  120162. #endif
  120163. #ifdef WOLFSSL_KEIL
  120164. "muls r5, r6, r5\n\t"
  120165. #elif defined(__clang__)
  120166. "muls r5, r6\n\t"
  120167. #else
  120168. "mul r5, r6\n\t"
  120169. #endif
  120170. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120171. "lsrs r6, r5, #16\n\t"
  120172. #else
  120173. "lsr r6, r5, #16\n\t"
  120174. #endif
  120175. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120176. "lsls r5, r5, #16\n\t"
  120177. #else
  120178. "lsl r5, r5, #16\n\t"
  120179. #endif
  120180. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120181. "adds r3, r3, r5\n\t"
  120182. #else
  120183. "add r3, r3, r5\n\t"
  120184. #endif
  120185. #ifdef WOLFSSL_KEIL
  120186. "adcs r4, r4, r6\n\t"
  120187. #elif defined(__clang__)
  120188. "adcs r4, r6\n\t"
  120189. #else
  120190. "adc r4, r6\n\t"
  120191. #endif
  120192. "mov r5, r10\n\t"
  120193. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120194. "lsrs r6, %[mp], #16\n\t"
  120195. #else
  120196. "lsr r6, %[mp], #16\n\t"
  120197. #endif
  120198. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120199. "lsrs r5, r5, #16\n\t"
  120200. #else
  120201. "lsr r5, r5, #16\n\t"
  120202. #endif
  120203. #ifdef WOLFSSL_KEIL
  120204. "muls r6, r5, r6\n\t"
  120205. #elif defined(__clang__)
  120206. "muls r6, r5\n\t"
  120207. #else
  120208. "mul r6, r5\n\t"
  120209. #endif
  120210. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120211. "adds r4, r4, r6\n\t"
  120212. #else
  120213. "add r4, r4, r6\n\t"
  120214. #endif
  120215. "uxth r6, %[mp]\n\t"
  120216. #ifdef WOLFSSL_KEIL
  120217. "muls r5, r6, r5\n\t"
  120218. #elif defined(__clang__)
  120219. "muls r5, r6\n\t"
  120220. #else
  120221. "mul r5, r6\n\t"
  120222. #endif
  120223. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120224. "lsrs r6, r5, #16\n\t"
  120225. #else
  120226. "lsr r6, r5, #16\n\t"
  120227. #endif
  120228. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120229. "lsls r5, r5, #16\n\t"
  120230. #else
  120231. "lsl r5, r5, #16\n\t"
  120232. #endif
  120233. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120234. "adds r3, r3, r5\n\t"
  120235. #else
  120236. "add r3, r3, r5\n\t"
  120237. #endif
  120238. #ifdef WOLFSSL_KEIL
  120239. "adcs r4, r4, r6\n\t"
  120240. #elif defined(__clang__)
  120241. "adcs r4, r6\n\t"
  120242. #else
  120243. "adc r4, r6\n\t"
  120244. #endif
  120245. "# Multiply m[j] and mu - Done\n\t"
  120246. "stm %[a]!, {r3}\n\t"
  120247. "cmp %[a], r9\n\t"
  120248. "blt L_sp_521_mont_reduce_order_17_word_%=\n\t"
  120249. "# a[i+16] += m[16] * mu\n\t"
  120250. "ldr %[mp], [%[m]]\n\t"
  120251. "mov r3, r12\n\t"
  120252. "# Multiply m[16] and mu - Start\n\t"
  120253. "mov r5, r10\n\t"
  120254. "uxth r6, %[mp]\n\t"
  120255. "uxth r5, r5\n\t"
  120256. #ifdef WOLFSSL_KEIL
  120257. "muls r6, r5, r6\n\t"
  120258. #elif defined(__clang__)
  120259. "muls r6, r5\n\t"
  120260. #else
  120261. "mul r6, r5\n\t"
  120262. #endif
  120263. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120264. "adds r4, r4, r6\n\t"
  120265. #else
  120266. "add r4, r4, r6\n\t"
  120267. #endif
  120268. #ifdef WOLFSSL_KEIL
  120269. "adcs r3, r3, r7\n\t"
  120270. #elif defined(__clang__)
  120271. "adcs r3, r7\n\t"
  120272. #else
  120273. "adc r3, r7\n\t"
  120274. #endif
  120275. #ifdef WOLFSSL_KEIL
  120276. "adcs r7, r7, r7\n\t"
  120277. #elif defined(__clang__)
  120278. "adcs r7, r7\n\t"
  120279. #else
  120280. "adc r7, r7\n\t"
  120281. #endif
  120282. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120283. "lsrs r6, %[mp], #16\n\t"
  120284. #else
  120285. "lsr r6, %[mp], #16\n\t"
  120286. #endif
  120287. #ifdef WOLFSSL_KEIL
  120288. "muls r5, r6, r5\n\t"
  120289. #elif defined(__clang__)
  120290. "muls r5, r6\n\t"
  120291. #else
  120292. "mul r5, r6\n\t"
  120293. #endif
  120294. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120295. "lsrs r6, r5, #16\n\t"
  120296. #else
  120297. "lsr r6, r5, #16\n\t"
  120298. #endif
  120299. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120300. "lsls r5, r5, #16\n\t"
  120301. #else
  120302. "lsl r5, r5, #16\n\t"
  120303. #endif
  120304. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120305. "adds r4, r4, r5\n\t"
  120306. #else
  120307. "add r4, r4, r5\n\t"
  120308. #endif
  120309. #ifdef WOLFSSL_KEIL
  120310. "adcs r3, r3, r6\n\t"
  120311. #elif defined(__clang__)
  120312. "adcs r3, r6\n\t"
  120313. #else
  120314. "adc r3, r6\n\t"
  120315. #endif
  120316. #ifdef WOLFSSL_KEIL
  120317. "adcs r7, r7, r7\n\t"
  120318. #elif defined(__clang__)
  120319. "adcs r7, r7\n\t"
  120320. #else
  120321. "adc r7, r7\n\t"
  120322. #endif
  120323. "mov r5, r10\n\t"
  120324. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120325. "lsrs r6, %[mp], #16\n\t"
  120326. #else
  120327. "lsr r6, %[mp], #16\n\t"
  120328. #endif
  120329. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120330. "lsrs r5, r5, #16\n\t"
  120331. #else
  120332. "lsr r5, r5, #16\n\t"
  120333. #endif
  120334. #ifdef WOLFSSL_KEIL
  120335. "muls r6, r5, r6\n\t"
  120336. #elif defined(__clang__)
  120337. "muls r6, r5\n\t"
  120338. #else
  120339. "mul r6, r5\n\t"
  120340. #endif
  120341. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120342. "adds r3, r3, r6\n\t"
  120343. #else
  120344. "add r3, r3, r6\n\t"
  120345. #endif
  120346. #ifdef WOLFSSL_KEIL
  120347. "adcs r7, r7, r7\n\t"
  120348. #elif defined(__clang__)
  120349. "adcs r7, r7\n\t"
  120350. #else
  120351. "adc r7, r7\n\t"
  120352. #endif
  120353. "uxth r6, %[mp]\n\t"
  120354. #ifdef WOLFSSL_KEIL
  120355. "muls r5, r6, r5\n\t"
  120356. #elif defined(__clang__)
  120357. "muls r5, r6\n\t"
  120358. #else
  120359. "mul r5, r6\n\t"
  120360. #endif
  120361. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120362. "lsrs r6, r5, #16\n\t"
  120363. #else
  120364. "lsr r6, r5, #16\n\t"
  120365. #endif
  120366. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120367. "lsls r5, r5, #16\n\t"
  120368. #else
  120369. "lsl r5, r5, #16\n\t"
  120370. #endif
  120371. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120372. "adds r4, r4, r5\n\t"
  120373. #else
  120374. "add r4, r4, r5\n\t"
  120375. #endif
  120376. #ifdef WOLFSSL_KEIL
  120377. "adcs r3, r3, r6\n\t"
  120378. #elif defined(__clang__)
  120379. "adcs r3, r6\n\t"
  120380. #else
  120381. "adc r3, r6\n\t"
  120382. #endif
  120383. #ifdef WOLFSSL_KEIL
  120384. "adcs r7, r7, r7\n\t"
  120385. #elif defined(__clang__)
  120386. "adcs r7, r7\n\t"
  120387. #else
  120388. "adc r7, r7\n\t"
  120389. #endif
  120390. "# Multiply m[16] and mu - Done\n\t"
  120391. "ldr r5, [%[a]]\n\t"
  120392. "ldr r6, [%[a], #4]\n\t"
  120393. "movs %[mp], #0\n\t"
  120394. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120395. "adds r5, r5, r4\n\t"
  120396. #else
  120397. "add r5, r5, r4\n\t"
  120398. #endif
  120399. #ifdef WOLFSSL_KEIL
  120400. "adcs r6, r6, r3\n\t"
  120401. #elif defined(__clang__)
  120402. "adcs r6, r3\n\t"
  120403. #else
  120404. "adc r6, r3\n\t"
  120405. #endif
  120406. #ifdef WOLFSSL_KEIL
  120407. "adcs r7, r7, %[mp]\n\t"
  120408. #elif defined(__clang__)
  120409. "adcs r7, %[mp]\n\t"
  120410. #else
  120411. "adc r7, %[mp]\n\t"
  120412. #endif
  120413. "stm %[a]!, {r5, r6}\n\t"
  120414. "# i += 1\n\t"
  120415. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120416. "subs %[a], %[a], #4\n\t"
  120417. #else
  120418. "sub %[a], %[a], #4\n\t"
  120419. #endif
  120420. "movs r3, #0x40\n\t"
  120421. "mov r9, %[a]\n\t"
  120422. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120423. "subs %[a], %[a], r3\n\t"
  120424. #else
  120425. "sub %[a], %[a], r3\n\t"
  120426. #endif
  120427. "mov r12, r7\n\t"
  120428. "mov %[m], lr\n\t"
  120429. "cmp r11, %[a]\n\t"
  120430. "bgt L_sp_521_mont_reduce_order_17_mod_%=\n\t"
  120431. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120432. "subs %[a], %[a], #4\n\t"
  120433. #else
  120434. "sub %[a], %[a], #4\n\t"
  120435. #endif
  120436. "ldr r3, [%[a]]\n\t"
  120437. "ldr r4, [%[a], #4]\n\t"
  120438. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120439. "lsrs r3, r3, #9\n\t"
  120440. #else
  120441. "lsr r3, r3, #9\n\t"
  120442. #endif
  120443. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120444. "lsls r6, r4, #23\n\t"
  120445. #else
  120446. "lsl r6, r4, #23\n\t"
  120447. #endif
  120448. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120449. "lsrs r4, r4, #9\n\t"
  120450. #else
  120451. "lsr r4, r4, #9\n\t"
  120452. #endif
  120453. #ifdef WOLFSSL_KEIL
  120454. "orrs r3, r3, r6\n\t"
  120455. #elif defined(__clang__)
  120456. "orrs r3, r6\n\t"
  120457. #else
  120458. "orr r3, r6\n\t"
  120459. #endif
  120460. "ldr r5, [%[a], #8]\n\t"
  120461. "str r3, [%[a], #4]\n\t"
  120462. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120463. "lsls r6, r5, #23\n\t"
  120464. #else
  120465. "lsl r6, r5, #23\n\t"
  120466. #endif
  120467. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120468. "lsrs r5, r5, #9\n\t"
  120469. #else
  120470. "lsr r5, r5, #9\n\t"
  120471. #endif
  120472. #ifdef WOLFSSL_KEIL
  120473. "orrs r4, r4, r6\n\t"
  120474. #elif defined(__clang__)
  120475. "orrs r4, r6\n\t"
  120476. #else
  120477. "orr r4, r6\n\t"
  120478. #endif
  120479. "ldr r3, [%[a], #12]\n\t"
  120480. "str r4, [%[a], #8]\n\t"
  120481. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120482. "lsls r6, r3, #23\n\t"
  120483. #else
  120484. "lsl r6, r3, #23\n\t"
  120485. #endif
  120486. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120487. "lsrs r3, r3, #9\n\t"
  120488. #else
  120489. "lsr r3, r3, #9\n\t"
  120490. #endif
  120491. #ifdef WOLFSSL_KEIL
  120492. "orrs r5, r5, r6\n\t"
  120493. #elif defined(__clang__)
  120494. "orrs r5, r6\n\t"
  120495. #else
  120496. "orr r5, r6\n\t"
  120497. #endif
  120498. "ldr r4, [%[a], #16]\n\t"
  120499. "str r5, [%[a], #12]\n\t"
  120500. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120501. "lsls r6, r4, #23\n\t"
  120502. #else
  120503. "lsl r6, r4, #23\n\t"
  120504. #endif
  120505. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120506. "lsrs r4, r4, #9\n\t"
  120507. #else
  120508. "lsr r4, r4, #9\n\t"
  120509. #endif
  120510. #ifdef WOLFSSL_KEIL
  120511. "orrs r3, r3, r6\n\t"
  120512. #elif defined(__clang__)
  120513. "orrs r3, r6\n\t"
  120514. #else
  120515. "orr r3, r6\n\t"
  120516. #endif
  120517. "ldr r5, [%[a], #20]\n\t"
  120518. "str r3, [%[a], #16]\n\t"
  120519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120520. "lsls r6, r5, #23\n\t"
  120521. #else
  120522. "lsl r6, r5, #23\n\t"
  120523. #endif
  120524. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120525. "lsrs r5, r5, #9\n\t"
  120526. #else
  120527. "lsr r5, r5, #9\n\t"
  120528. #endif
  120529. #ifdef WOLFSSL_KEIL
  120530. "orrs r4, r4, r6\n\t"
  120531. #elif defined(__clang__)
  120532. "orrs r4, r6\n\t"
  120533. #else
  120534. "orr r4, r6\n\t"
  120535. #endif
  120536. "ldr r3, [%[a], #24]\n\t"
  120537. "str r4, [%[a], #20]\n\t"
  120538. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120539. "lsls r6, r3, #23\n\t"
  120540. #else
  120541. "lsl r6, r3, #23\n\t"
  120542. #endif
  120543. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120544. "lsrs r3, r3, #9\n\t"
  120545. #else
  120546. "lsr r3, r3, #9\n\t"
  120547. #endif
  120548. #ifdef WOLFSSL_KEIL
  120549. "orrs r5, r5, r6\n\t"
  120550. #elif defined(__clang__)
  120551. "orrs r5, r6\n\t"
  120552. #else
  120553. "orr r5, r6\n\t"
  120554. #endif
  120555. "ldr r4, [%[a], #28]\n\t"
  120556. "str r5, [%[a], #24]\n\t"
  120557. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120558. "lsls r6, r4, #23\n\t"
  120559. #else
  120560. "lsl r6, r4, #23\n\t"
  120561. #endif
  120562. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120563. "lsrs r4, r4, #9\n\t"
  120564. #else
  120565. "lsr r4, r4, #9\n\t"
  120566. #endif
  120567. #ifdef WOLFSSL_KEIL
  120568. "orrs r3, r3, r6\n\t"
  120569. #elif defined(__clang__)
  120570. "orrs r3, r6\n\t"
  120571. #else
  120572. "orr r3, r6\n\t"
  120573. #endif
  120574. "ldr r5, [%[a], #32]\n\t"
  120575. "str r3, [%[a], #28]\n\t"
  120576. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120577. "lsls r6, r5, #23\n\t"
  120578. #else
  120579. "lsl r6, r5, #23\n\t"
  120580. #endif
  120581. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120582. "lsrs r5, r5, #9\n\t"
  120583. #else
  120584. "lsr r5, r5, #9\n\t"
  120585. #endif
  120586. #ifdef WOLFSSL_KEIL
  120587. "orrs r4, r4, r6\n\t"
  120588. #elif defined(__clang__)
  120589. "orrs r4, r6\n\t"
  120590. #else
  120591. "orr r4, r6\n\t"
  120592. #endif
  120593. "ldr r3, [%[a], #36]\n\t"
  120594. "str r4, [%[a], #32]\n\t"
  120595. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120596. "lsls r6, r3, #23\n\t"
  120597. #else
  120598. "lsl r6, r3, #23\n\t"
  120599. #endif
  120600. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120601. "lsrs r3, r3, #9\n\t"
  120602. #else
  120603. "lsr r3, r3, #9\n\t"
  120604. #endif
  120605. #ifdef WOLFSSL_KEIL
  120606. "orrs r5, r5, r6\n\t"
  120607. #elif defined(__clang__)
  120608. "orrs r5, r6\n\t"
  120609. #else
  120610. "orr r5, r6\n\t"
  120611. #endif
  120612. "ldr r4, [%[a], #40]\n\t"
  120613. "str r5, [%[a], #36]\n\t"
  120614. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120615. "lsls r6, r4, #23\n\t"
  120616. #else
  120617. "lsl r6, r4, #23\n\t"
  120618. #endif
  120619. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120620. "lsrs r4, r4, #9\n\t"
  120621. #else
  120622. "lsr r4, r4, #9\n\t"
  120623. #endif
  120624. #ifdef WOLFSSL_KEIL
  120625. "orrs r3, r3, r6\n\t"
  120626. #elif defined(__clang__)
  120627. "orrs r3, r6\n\t"
  120628. #else
  120629. "orr r3, r6\n\t"
  120630. #endif
  120631. "ldr r5, [%[a], #44]\n\t"
  120632. "str r3, [%[a], #40]\n\t"
  120633. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120634. "lsls r6, r5, #23\n\t"
  120635. #else
  120636. "lsl r6, r5, #23\n\t"
  120637. #endif
  120638. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120639. "lsrs r5, r5, #9\n\t"
  120640. #else
  120641. "lsr r5, r5, #9\n\t"
  120642. #endif
  120643. #ifdef WOLFSSL_KEIL
  120644. "orrs r4, r4, r6\n\t"
  120645. #elif defined(__clang__)
  120646. "orrs r4, r6\n\t"
  120647. #else
  120648. "orr r4, r6\n\t"
  120649. #endif
  120650. "ldr r3, [%[a], #48]\n\t"
  120651. "str r4, [%[a], #44]\n\t"
  120652. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120653. "lsls r6, r3, #23\n\t"
  120654. #else
  120655. "lsl r6, r3, #23\n\t"
  120656. #endif
  120657. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120658. "lsrs r3, r3, #9\n\t"
  120659. #else
  120660. "lsr r3, r3, #9\n\t"
  120661. #endif
  120662. #ifdef WOLFSSL_KEIL
  120663. "orrs r5, r5, r6\n\t"
  120664. #elif defined(__clang__)
  120665. "orrs r5, r6\n\t"
  120666. #else
  120667. "orr r5, r6\n\t"
  120668. #endif
  120669. "ldr r4, [%[a], #52]\n\t"
  120670. "str r5, [%[a], #48]\n\t"
  120671. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120672. "lsls r6, r4, #23\n\t"
  120673. #else
  120674. "lsl r6, r4, #23\n\t"
  120675. #endif
  120676. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120677. "lsrs r4, r4, #9\n\t"
  120678. #else
  120679. "lsr r4, r4, #9\n\t"
  120680. #endif
  120681. #ifdef WOLFSSL_KEIL
  120682. "orrs r3, r3, r6\n\t"
  120683. #elif defined(__clang__)
  120684. "orrs r3, r6\n\t"
  120685. #else
  120686. "orr r3, r6\n\t"
  120687. #endif
  120688. "ldr r5, [%[a], #56]\n\t"
  120689. "str r3, [%[a], #52]\n\t"
  120690. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120691. "lsls r6, r5, #23\n\t"
  120692. #else
  120693. "lsl r6, r5, #23\n\t"
  120694. #endif
  120695. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120696. "lsrs r5, r5, #9\n\t"
  120697. #else
  120698. "lsr r5, r5, #9\n\t"
  120699. #endif
  120700. #ifdef WOLFSSL_KEIL
  120701. "orrs r4, r4, r6\n\t"
  120702. #elif defined(__clang__)
  120703. "orrs r4, r6\n\t"
  120704. #else
  120705. "orr r4, r6\n\t"
  120706. #endif
  120707. "ldr r3, [%[a], #60]\n\t"
  120708. "str r4, [%[a], #56]\n\t"
  120709. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120710. "lsls r6, r3, #23\n\t"
  120711. #else
  120712. "lsl r6, r3, #23\n\t"
  120713. #endif
  120714. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120715. "lsrs r3, r3, #9\n\t"
  120716. #else
  120717. "lsr r3, r3, #9\n\t"
  120718. #endif
  120719. #ifdef WOLFSSL_KEIL
  120720. "orrs r5, r5, r6\n\t"
  120721. #elif defined(__clang__)
  120722. "orrs r5, r6\n\t"
  120723. #else
  120724. "orr r5, r6\n\t"
  120725. #endif
  120726. "ldr r4, [%[a], #64]\n\t"
  120727. "str r5, [%[a], #60]\n\t"
  120728. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120729. "lsls r6, r4, #23\n\t"
  120730. #else
  120731. "lsl r6, r4, #23\n\t"
  120732. #endif
  120733. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120734. "lsrs r4, r4, #9\n\t"
  120735. #else
  120736. "lsr r4, r4, #9\n\t"
  120737. #endif
  120738. #ifdef WOLFSSL_KEIL
  120739. "orrs r3, r3, r6\n\t"
  120740. #elif defined(__clang__)
  120741. "orrs r3, r6\n\t"
  120742. #else
  120743. "orr r3, r6\n\t"
  120744. #endif
  120745. "str r3, [%[a], #64]\n\t"
  120746. "movs r7, r4\n\t"
  120747. "str r4, [%[a], #68]\n\t"
  120748. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120749. "lsrs r7, r7, #9\n\t"
  120750. #else
  120751. "lsr r7, r7, #9\n\t"
  120752. #endif
  120753. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120754. "adds %[a], %[a], #4\n\t"
  120755. #else
  120756. "add %[a], %[a], #4\n\t"
  120757. #endif
  120758. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120759. "negs r7, r7\n\t"
  120760. #else
  120761. "neg r7, r7\n\t"
  120762. #endif
  120763. "# Subtract masked modulus\n\t"
  120764. "movs r4, #0x44\n\t"
  120765. "movs %[mp], #0\n\t"
  120766. "movs r3, #0\n\t"
  120767. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120768. "subs %[a], %[a], r4\n\t"
  120769. #else
  120770. "sub %[a], %[a], r4\n\t"
  120771. #endif
  120772. #ifndef WOLFSSL_SP_LARGE_CODE
  120773. "\n"
  120774. "L_sp_521_mont_reduce_order_17_sub_mask_%=:\n\t"
  120775. "ldm %[m]!, {r6}\n\t"
  120776. "movs r5, #0\n\t"
  120777. #ifdef WOLFSSL_KEIL
  120778. "ands r6, r6, r7\n\t"
  120779. #elif defined(__clang__)
  120780. "ands r6, r7\n\t"
  120781. #else
  120782. "and r6, r7\n\t"
  120783. #endif
  120784. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120785. "subs r5, r5, %[mp]\n\t"
  120786. #else
  120787. "sub r5, r5, %[mp]\n\t"
  120788. #endif
  120789. "ldr r5, [%[a], r4]\n\t"
  120790. #ifdef WOLFSSL_KEIL
  120791. "sbcs r5, r5, r6\n\t"
  120792. #elif defined(__clang__)
  120793. "sbcs r5, r6\n\t"
  120794. #else
  120795. "sbc r5, r6\n\t"
  120796. #endif
  120797. #ifdef WOLFSSL_KEIL
  120798. "sbcs %[mp], %[mp], %[mp]\n\t"
  120799. #elif defined(__clang__)
  120800. "sbcs %[mp], %[mp]\n\t"
  120801. #else
  120802. "sbc %[mp], %[mp]\n\t"
  120803. #endif
  120804. "stm %[a]!, {r5}\n\t"
  120805. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120806. "adds r3, r3, #4\n\t"
  120807. #else
  120808. "add r3, r3, #4\n\t"
  120809. #endif
  120810. "cmp r3, r4\n\t"
  120811. "blt L_sp_521_mont_reduce_order_17_sub_mask_%=\n\t"
  120812. #else /* WOLFSSL_SP_LARGE_CODE */
  120813. "ldm %[m]!, {r6}\n\t"
  120814. #ifdef WOLFSSL_KEIL
  120815. "ands r6, r6, r7\n\t"
  120816. #elif defined(__clang__)
  120817. "ands r6, r7\n\t"
  120818. #else
  120819. "and r6, r7\n\t"
  120820. #endif
  120821. "ldr r5, [%[a], r4]\n\t"
  120822. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120823. "subs r5, r5, r6\n\t"
  120824. #else
  120825. "sub r5, r5, r6\n\t"
  120826. #endif
  120827. "stm %[a]!, {r5}\n\t"
  120828. "ldm %[m]!, {r6}\n\t"
  120829. #ifdef WOLFSSL_KEIL
  120830. "ands r6, r6, r7\n\t"
  120831. #elif defined(__clang__)
  120832. "ands r6, r7\n\t"
  120833. #else
  120834. "and r6, r7\n\t"
  120835. #endif
  120836. "ldr r5, [%[a], r4]\n\t"
  120837. #ifdef WOLFSSL_KEIL
  120838. "sbcs r5, r5, r6\n\t"
  120839. #elif defined(__clang__)
  120840. "sbcs r5, r6\n\t"
  120841. #else
  120842. "sbc r5, r6\n\t"
  120843. #endif
  120844. "stm %[a]!, {r5}\n\t"
  120845. "ldm %[m]!, {r6}\n\t"
  120846. #ifdef WOLFSSL_KEIL
  120847. "ands r6, r6, r7\n\t"
  120848. #elif defined(__clang__)
  120849. "ands r6, r7\n\t"
  120850. #else
  120851. "and r6, r7\n\t"
  120852. #endif
  120853. "ldr r5, [%[a], r4]\n\t"
  120854. #ifdef WOLFSSL_KEIL
  120855. "sbcs r5, r5, r6\n\t"
  120856. #elif defined(__clang__)
  120857. "sbcs r5, r6\n\t"
  120858. #else
  120859. "sbc r5, r6\n\t"
  120860. #endif
  120861. "stm %[a]!, {r5}\n\t"
  120862. "ldm %[m]!, {r6}\n\t"
  120863. #ifdef WOLFSSL_KEIL
  120864. "ands r6, r6, r7\n\t"
  120865. #elif defined(__clang__)
  120866. "ands r6, r7\n\t"
  120867. #else
  120868. "and r6, r7\n\t"
  120869. #endif
  120870. "ldr r5, [%[a], r4]\n\t"
  120871. #ifdef WOLFSSL_KEIL
  120872. "sbcs r5, r5, r6\n\t"
  120873. #elif defined(__clang__)
  120874. "sbcs r5, r6\n\t"
  120875. #else
  120876. "sbc r5, r6\n\t"
  120877. #endif
  120878. "stm %[a]!, {r5}\n\t"
  120879. "ldm %[m]!, {r6}\n\t"
  120880. #ifdef WOLFSSL_KEIL
  120881. "ands r6, r6, r7\n\t"
  120882. #elif defined(__clang__)
  120883. "ands r6, r7\n\t"
  120884. #else
  120885. "and r6, r7\n\t"
  120886. #endif
  120887. "ldr r5, [%[a], r4]\n\t"
  120888. #ifdef WOLFSSL_KEIL
  120889. "sbcs r5, r5, r6\n\t"
  120890. #elif defined(__clang__)
  120891. "sbcs r5, r6\n\t"
  120892. #else
  120893. "sbc r5, r6\n\t"
  120894. #endif
  120895. "stm %[a]!, {r5}\n\t"
  120896. "ldm %[m]!, {r6}\n\t"
  120897. #ifdef WOLFSSL_KEIL
  120898. "ands r6, r6, r7\n\t"
  120899. #elif defined(__clang__)
  120900. "ands r6, r7\n\t"
  120901. #else
  120902. "and r6, r7\n\t"
  120903. #endif
  120904. "ldr r5, [%[a], r4]\n\t"
  120905. #ifdef WOLFSSL_KEIL
  120906. "sbcs r5, r5, r6\n\t"
  120907. #elif defined(__clang__)
  120908. "sbcs r5, r6\n\t"
  120909. #else
  120910. "sbc r5, r6\n\t"
  120911. #endif
  120912. "stm %[a]!, {r5}\n\t"
  120913. "ldm %[m]!, {r6}\n\t"
  120914. #ifdef WOLFSSL_KEIL
  120915. "ands r6, r6, r7\n\t"
  120916. #elif defined(__clang__)
  120917. "ands r6, r7\n\t"
  120918. #else
  120919. "and r6, r7\n\t"
  120920. #endif
  120921. "ldr r5, [%[a], r4]\n\t"
  120922. #ifdef WOLFSSL_KEIL
  120923. "sbcs r5, r5, r6\n\t"
  120924. #elif defined(__clang__)
  120925. "sbcs r5, r6\n\t"
  120926. #else
  120927. "sbc r5, r6\n\t"
  120928. #endif
  120929. "stm %[a]!, {r5}\n\t"
  120930. "ldm %[m]!, {r6}\n\t"
  120931. #ifdef WOLFSSL_KEIL
  120932. "ands r6, r6, r7\n\t"
  120933. #elif defined(__clang__)
  120934. "ands r6, r7\n\t"
  120935. #else
  120936. "and r6, r7\n\t"
  120937. #endif
  120938. "ldr r5, [%[a], r4]\n\t"
  120939. #ifdef WOLFSSL_KEIL
  120940. "sbcs r5, r5, r6\n\t"
  120941. #elif defined(__clang__)
  120942. "sbcs r5, r6\n\t"
  120943. #else
  120944. "sbc r5, r6\n\t"
  120945. #endif
  120946. "stm %[a]!, {r5}\n\t"
  120947. "ldm %[m]!, {r6}\n\t"
  120948. #ifdef WOLFSSL_KEIL
  120949. "ands r6, r6, r7\n\t"
  120950. #elif defined(__clang__)
  120951. "ands r6, r7\n\t"
  120952. #else
  120953. "and r6, r7\n\t"
  120954. #endif
  120955. "ldr r5, [%[a], r4]\n\t"
  120956. #ifdef WOLFSSL_KEIL
  120957. "sbcs r5, r5, r6\n\t"
  120958. #elif defined(__clang__)
  120959. "sbcs r5, r6\n\t"
  120960. #else
  120961. "sbc r5, r6\n\t"
  120962. #endif
  120963. "stm %[a]!, {r5}\n\t"
  120964. "ldm %[m]!, {r6}\n\t"
  120965. #ifdef WOLFSSL_KEIL
  120966. "ands r6, r6, r7\n\t"
  120967. #elif defined(__clang__)
  120968. "ands r6, r7\n\t"
  120969. #else
  120970. "and r6, r7\n\t"
  120971. #endif
  120972. "ldr r5, [%[a], r4]\n\t"
  120973. #ifdef WOLFSSL_KEIL
  120974. "sbcs r5, r5, r6\n\t"
  120975. #elif defined(__clang__)
  120976. "sbcs r5, r6\n\t"
  120977. #else
  120978. "sbc r5, r6\n\t"
  120979. #endif
  120980. "stm %[a]!, {r5}\n\t"
  120981. "ldm %[m]!, {r6}\n\t"
  120982. #ifdef WOLFSSL_KEIL
  120983. "ands r6, r6, r7\n\t"
  120984. #elif defined(__clang__)
  120985. "ands r6, r7\n\t"
  120986. #else
  120987. "and r6, r7\n\t"
  120988. #endif
  120989. "ldr r5, [%[a], r4]\n\t"
  120990. #ifdef WOLFSSL_KEIL
  120991. "sbcs r5, r5, r6\n\t"
  120992. #elif defined(__clang__)
  120993. "sbcs r5, r6\n\t"
  120994. #else
  120995. "sbc r5, r6\n\t"
  120996. #endif
  120997. "stm %[a]!, {r5}\n\t"
  120998. "ldm %[m]!, {r6}\n\t"
  120999. #ifdef WOLFSSL_KEIL
  121000. "ands r6, r6, r7\n\t"
  121001. #elif defined(__clang__)
  121002. "ands r6, r7\n\t"
  121003. #else
  121004. "and r6, r7\n\t"
  121005. #endif
  121006. "ldr r5, [%[a], r4]\n\t"
  121007. #ifdef WOLFSSL_KEIL
  121008. "sbcs r5, r5, r6\n\t"
  121009. #elif defined(__clang__)
  121010. "sbcs r5, r6\n\t"
  121011. #else
  121012. "sbc r5, r6\n\t"
  121013. #endif
  121014. "stm %[a]!, {r5}\n\t"
  121015. "ldm %[m]!, {r6}\n\t"
  121016. #ifdef WOLFSSL_KEIL
  121017. "ands r6, r6, r7\n\t"
  121018. #elif defined(__clang__)
  121019. "ands r6, r7\n\t"
  121020. #else
  121021. "and r6, r7\n\t"
  121022. #endif
  121023. "ldr r5, [%[a], r4]\n\t"
  121024. #ifdef WOLFSSL_KEIL
  121025. "sbcs r5, r5, r6\n\t"
  121026. #elif defined(__clang__)
  121027. "sbcs r5, r6\n\t"
  121028. #else
  121029. "sbc r5, r6\n\t"
  121030. #endif
  121031. "stm %[a]!, {r5}\n\t"
  121032. "ldm %[m]!, {r6}\n\t"
  121033. #ifdef WOLFSSL_KEIL
  121034. "ands r6, r6, r7\n\t"
  121035. #elif defined(__clang__)
  121036. "ands r6, r7\n\t"
  121037. #else
  121038. "and r6, r7\n\t"
  121039. #endif
  121040. "ldr r5, [%[a], r4]\n\t"
  121041. #ifdef WOLFSSL_KEIL
  121042. "sbcs r5, r5, r6\n\t"
  121043. #elif defined(__clang__)
  121044. "sbcs r5, r6\n\t"
  121045. #else
  121046. "sbc r5, r6\n\t"
  121047. #endif
  121048. "stm %[a]!, {r5}\n\t"
  121049. "ldm %[m]!, {r6}\n\t"
  121050. #ifdef WOLFSSL_KEIL
  121051. "ands r6, r6, r7\n\t"
  121052. #elif defined(__clang__)
  121053. "ands r6, r7\n\t"
  121054. #else
  121055. "and r6, r7\n\t"
  121056. #endif
  121057. "ldr r5, [%[a], r4]\n\t"
  121058. #ifdef WOLFSSL_KEIL
  121059. "sbcs r5, r5, r6\n\t"
  121060. #elif defined(__clang__)
  121061. "sbcs r5, r6\n\t"
  121062. #else
  121063. "sbc r5, r6\n\t"
  121064. #endif
  121065. "stm %[a]!, {r5}\n\t"
  121066. "ldm %[m]!, {r6}\n\t"
  121067. #ifdef WOLFSSL_KEIL
  121068. "ands r6, r6, r7\n\t"
  121069. #elif defined(__clang__)
  121070. "ands r6, r7\n\t"
  121071. #else
  121072. "and r6, r7\n\t"
  121073. #endif
  121074. "ldr r5, [%[a], r4]\n\t"
  121075. #ifdef WOLFSSL_KEIL
  121076. "sbcs r5, r5, r6\n\t"
  121077. #elif defined(__clang__)
  121078. "sbcs r5, r6\n\t"
  121079. #else
  121080. "sbc r5, r6\n\t"
  121081. #endif
  121082. "stm %[a]!, {r5}\n\t"
  121083. "ldm %[m]!, {r6}\n\t"
  121084. #ifdef WOLFSSL_KEIL
  121085. "ands r6, r6, r7\n\t"
  121086. #elif defined(__clang__)
  121087. "ands r6, r7\n\t"
  121088. #else
  121089. "and r6, r7\n\t"
  121090. #endif
  121091. "ldr r5, [%[a], r4]\n\t"
  121092. #ifdef WOLFSSL_KEIL
  121093. "sbcs r5, r5, r6\n\t"
  121094. #elif defined(__clang__)
  121095. "sbcs r5, r6\n\t"
  121096. #else
  121097. "sbc r5, r6\n\t"
  121098. #endif
  121099. "stm %[a]!, {r5}\n\t"
  121100. #endif /* WOLFSSL_SP_LARGE_CODE */
  121101. : [a] "+l" (a), [m] "+l" (m), [mp] "+l" (mp)
  121102. :
  121103. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr"
  121104. );
  121105. }
  121106. /* Multiply two Montgomery form numbers mod the modulus (prime).
  121107. * (r = a * b mod m)
  121108. *
  121109. * r Result of multiplication.
  121110. * a First number to multiply in Montgomery form.
  121111. * b Second number to multiply in Montgomery form.
  121112. * m Modulus (prime).
  121113. * mp Montgomery mulitplier.
  121114. */
  121115. SP_NOINLINE static void sp_521_mont_mul_17(sp_digit* r, const sp_digit* a,
  121116. const sp_digit* b, const sp_digit* m, sp_digit mp)
  121117. {
  121118. sp_521_mul_17(r, a, b);
  121119. sp_521_mont_reduce_17(r, m, mp);
  121120. }
  121121. /* Square the Montgomery form number. (r = a * a mod m)
  121122. *
  121123. * r Result of squaring.
  121124. * a Number to square in Montgomery form.
  121125. * m Modulus (prime).
  121126. * mp Montgomery mulitplier.
  121127. */
  121128. SP_NOINLINE static void sp_521_mont_sqr_17(sp_digit* r, const sp_digit* a,
  121129. const sp_digit* m, sp_digit mp)
  121130. {
  121131. sp_521_sqr_17(r, a);
  121132. sp_521_mont_reduce_17(r, m, mp);
  121133. }
  121134. #ifndef WOLFSSL_SP_SMALL
  121135. /* Square the Montgomery form number a number of times. (r = a ^ n mod m)
  121136. *
  121137. * r Result of squaring.
  121138. * a Number to square in Montgomery form.
  121139. * n Number of times to square.
  121140. * m Modulus (prime).
  121141. * mp Montgomery mulitplier.
  121142. */
  121143. static void sp_521_mont_sqr_n_17(sp_digit* r, const sp_digit* a, int n,
  121144. const sp_digit* m, sp_digit mp)
  121145. {
  121146. sp_521_mont_sqr_17(r, a, m, mp);
  121147. for (; n > 1; n--) {
  121148. sp_521_mont_sqr_17(r, r, m, mp);
  121149. }
  121150. }
  121151. #endif /* !WOLFSSL_SP_SMALL */
  121152. #ifdef WOLFSSL_SP_SMALL
  121153. /* Mod-2 for the P521 curve. */
  121154. static const uint32_t p521_mod_minus_2[17] = {
  121155. 0xfffffffdU,0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,
  121156. 0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,
  121157. 0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,0x000001ffU
  121158. };
  121159. #endif /* !WOLFSSL_SP_SMALL */
  121160. /* Invert the number, in Montgomery form, modulo the modulus (prime) of the
  121161. * P521 curve. (r = 1 / a mod m)
  121162. *
  121163. * r Inverse result.
  121164. * a Number to invert.
  121165. * td Temporary data.
  121166. */
  121167. static void sp_521_mont_inv_17(sp_digit* r, const sp_digit* a, sp_digit* td)
  121168. {
  121169. #ifdef WOLFSSL_SP_SMALL
  121170. sp_digit* t = td;
  121171. int i;
  121172. XMEMCPY(t, a, sizeof(sp_digit) * 17);
  121173. for (i=519; i>=0; i--) {
  121174. sp_521_mont_sqr_17(t, t, p521_mod, p521_mp_mod);
  121175. if (p521_mod_minus_2[i / 32] & ((sp_digit)1 << (i % 32)))
  121176. sp_521_mont_mul_17(t, t, a, p521_mod, p521_mp_mod);
  121177. }
  121178. XMEMCPY(r, t, sizeof(sp_digit) * 17);
  121179. #else
  121180. sp_digit* t1 = td;
  121181. sp_digit* t2 = td + 2 * 17;
  121182. sp_digit* t3 = td + 4 * 17;
  121183. /* 0x2 */
  121184. sp_521_mont_sqr_17(t1, a, p521_mod, p521_mp_mod);
  121185. /* 0x3 */
  121186. sp_521_mont_mul_17(t2, t1, a, p521_mod, p521_mp_mod);
  121187. /* 0x6 */
  121188. sp_521_mont_sqr_17(t1, t2, p521_mod, p521_mp_mod);
  121189. /* 0x7 */
  121190. sp_521_mont_mul_17(t3, t1, a, p521_mod, p521_mp_mod);
  121191. /* 0xc */
  121192. sp_521_mont_sqr_n_17(t1, t2, 2, p521_mod, p521_mp_mod);
  121193. /* 0xf */
  121194. sp_521_mont_mul_17(t2, t2, t1, p521_mod, p521_mp_mod);
  121195. /* 0x78 */
  121196. sp_521_mont_sqr_n_17(t1, t2, 3, p521_mod, p521_mp_mod);
  121197. /* 0x7f */
  121198. sp_521_mont_mul_17(t3, t3, t1, p521_mod, p521_mp_mod);
  121199. /* 0xf0 */
  121200. sp_521_mont_sqr_n_17(t1, t2, 4, p521_mod, p521_mp_mod);
  121201. /* 0xff */
  121202. sp_521_mont_mul_17(t2, t2, t1, p521_mod, p521_mp_mod);
  121203. /* 0xff00 */
  121204. sp_521_mont_sqr_n_17(t1, t2, 8, p521_mod, p521_mp_mod);
  121205. /* 0xffff */
  121206. sp_521_mont_mul_17(t2, t2, t1, p521_mod, p521_mp_mod);
  121207. /* 0xffff0000 */
  121208. sp_521_mont_sqr_n_17(t1, t2, 16, p521_mod, p521_mp_mod);
  121209. /* 0xffffffff */
  121210. sp_521_mont_mul_17(t2, t2, t1, p521_mod, p521_mp_mod);
  121211. /* 0xffffffff00000000 */
  121212. sp_521_mont_sqr_n_17(t1, t2, 32, p521_mod, p521_mp_mod);
  121213. /* 0xffffffffffffffff */
  121214. sp_521_mont_mul_17(t2, t2, t1, p521_mod, p521_mp_mod);
  121215. /* 0xffffffffffffffff0000000000000000 */
  121216. sp_521_mont_sqr_n_17(t1, t2, 64, p521_mod, p521_mp_mod);
  121217. /* 0xffffffffffffffffffffffffffffffff */
  121218. sp_521_mont_mul_17(t2, t2, t1, p521_mod, p521_mp_mod);
  121219. /* 0xffffffffffffffffffffffffffffffff00000000000000000000000000000000 */
  121220. sp_521_mont_sqr_n_17(t1, t2, 128, p521_mod, p521_mp_mod);
  121221. /* 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff */
  121222. sp_521_mont_mul_17(t2, t2, t1, p521_mod, p521_mp_mod);
  121223. /* 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000 */
  121224. sp_521_mont_sqr_n_17(t1, t2, 256, p521_mod, p521_mp_mod);
  121225. /* 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff */
  121226. sp_521_mont_mul_17(t2, t2, t1, p521_mod, p521_mp_mod);
  121227. /* 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80 */
  121228. sp_521_mont_sqr_n_17(t1, t2, 7, p521_mod, p521_mp_mod);
  121229. /* 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff */
  121230. sp_521_mont_mul_17(t2, t3, t1, p521_mod, p521_mp_mod);
  121231. /* 0x1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc */
  121232. sp_521_mont_sqr_n_17(t1, t2, 2, p521_mod, p521_mp_mod);
  121233. /* 0x1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd */
  121234. sp_521_mont_mul_17(r, t1, a, p521_mod, p521_mp_mod);
  121235. #endif /* WOLFSSL_SP_SMALL */
  121236. }
  121237. /* Compare a with b in constant time.
  121238. *
  121239. * a A single precision integer.
  121240. * b A single precision integer.
  121241. * return -ve, 0 or +ve if a is less than, equal to or greater than b
  121242. * respectively.
  121243. */
  121244. SP_NOINLINE static sp_int32 sp_521_cmp_17(const sp_digit* a, const sp_digit* b)
  121245. {
  121246. __asm__ __volatile__ (
  121247. "movs r2, #0\n\t"
  121248. "movs r3, #0\n\t"
  121249. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121250. "mvns r3, r3\n\t"
  121251. #else
  121252. "mvn r3, r3\n\t"
  121253. #endif
  121254. "movs r6, #0x40\n\t"
  121255. "\n"
  121256. "L_sp_521_cmp_17_words_%=:\n\t"
  121257. "ldr r7, [%[a], r6]\n\t"
  121258. "ldr r5, [%[b], r6]\n\t"
  121259. #ifdef WOLFSSL_KEIL
  121260. "ands r7, r7, r3\n\t"
  121261. #elif defined(__clang__)
  121262. "ands r7, r3\n\t"
  121263. #else
  121264. "and r7, r3\n\t"
  121265. #endif
  121266. #ifdef WOLFSSL_KEIL
  121267. "ands r5, r5, r3\n\t"
  121268. #elif defined(__clang__)
  121269. "ands r5, r3\n\t"
  121270. #else
  121271. "and r5, r3\n\t"
  121272. #endif
  121273. "movs r4, r7\n\t"
  121274. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121275. "subs r7, r7, r5\n\t"
  121276. #else
  121277. "sub r7, r7, r5\n\t"
  121278. #endif
  121279. #ifdef WOLFSSL_KEIL
  121280. "sbcs r7, r7, r7\n\t"
  121281. #elif defined(__clang__)
  121282. "sbcs r7, r7\n\t"
  121283. #else
  121284. "sbc r7, r7\n\t"
  121285. #endif
  121286. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121287. "adds r2, r2, r7\n\t"
  121288. #else
  121289. "add r2, r2, r7\n\t"
  121290. #endif
  121291. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121292. "mvns r7, r7\n\t"
  121293. #else
  121294. "mvn r7, r7\n\t"
  121295. #endif
  121296. #ifdef WOLFSSL_KEIL
  121297. "ands r3, r3, r7\n\t"
  121298. #elif defined(__clang__)
  121299. "ands r3, r7\n\t"
  121300. #else
  121301. "and r3, r7\n\t"
  121302. #endif
  121303. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121304. "subs r5, r5, r4\n\t"
  121305. #else
  121306. "sub r5, r5, r4\n\t"
  121307. #endif
  121308. #ifdef WOLFSSL_KEIL
  121309. "sbcs r7, r7, r7\n\t"
  121310. #elif defined(__clang__)
  121311. "sbcs r7, r7\n\t"
  121312. #else
  121313. "sbc r7, r7\n\t"
  121314. #endif
  121315. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121316. "subs r2, r2, r7\n\t"
  121317. #else
  121318. "sub r2, r2, r7\n\t"
  121319. #endif
  121320. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121321. "mvns r7, r7\n\t"
  121322. #else
  121323. "mvn r7, r7\n\t"
  121324. #endif
  121325. #ifdef WOLFSSL_KEIL
  121326. "ands r3, r3, r7\n\t"
  121327. #elif defined(__clang__)
  121328. "ands r3, r7\n\t"
  121329. #else
  121330. "and r3, r7\n\t"
  121331. #endif
  121332. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121333. "subs r6, r6, #4\n\t"
  121334. #else
  121335. "sub r6, r6, #4\n\t"
  121336. #endif
  121337. "bge L_sp_521_cmp_17_words_%=\n\t"
  121338. "movs %[a], r2\n\t"
  121339. : [a] "+l" (a), [b] "+l" (b)
  121340. :
  121341. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  121342. );
  121343. return (uint32_t)(size_t)a;
  121344. }
  121345. /* Normalize the values in each word to 32.
  121346. *
  121347. * a Array of sp_digit to normalize.
  121348. */
  121349. #define sp_521_norm_17(a)
  121350. /* Map the Montgomery form projective coordinate point to an affine point.
  121351. *
  121352. * r Resulting affine coordinate point.
  121353. * p Montgomery form projective coordinate point.
  121354. * t Temporary ordinate data.
  121355. */
  121356. static void sp_521_map_17(sp_point_521* r, const sp_point_521* p,
  121357. sp_digit* t)
  121358. {
  121359. sp_digit* t1 = t;
  121360. sp_digit* t2 = t + 2*17;
  121361. sp_int32 n;
  121362. sp_521_mont_inv_17(t1, p->z, t + 2*17);
  121363. sp_521_mont_sqr_17(t2, t1, p521_mod, p521_mp_mod);
  121364. sp_521_mont_mul_17(t1, t2, t1, p521_mod, p521_mp_mod);
  121365. /* x /= z^2 */
  121366. sp_521_mont_mul_17(r->x, p->x, t2, p521_mod, p521_mp_mod);
  121367. XMEMSET(r->x + 17, 0, sizeof(r->x) / 2U);
  121368. sp_521_mont_reduce_17(r->x, p521_mod, p521_mp_mod);
  121369. /* Reduce x to less than modulus */
  121370. n = sp_521_cmp_17(r->x, p521_mod);
  121371. sp_521_cond_sub_17(r->x, r->x, p521_mod, ~(n >> 31));
  121372. sp_521_norm_17(r->x);
  121373. /* y /= z^3 */
  121374. sp_521_mont_mul_17(r->y, p->y, t1, p521_mod, p521_mp_mod);
  121375. XMEMSET(r->y + 17, 0, sizeof(r->y) / 2U);
  121376. sp_521_mont_reduce_17(r->y, p521_mod, p521_mp_mod);
  121377. /* Reduce y to less than modulus */
  121378. n = sp_521_cmp_17(r->y, p521_mod);
  121379. sp_521_cond_sub_17(r->y, r->y, p521_mod, ~(n >> 31));
  121380. sp_521_norm_17(r->y);
  121381. XMEMSET(r->z, 0, sizeof(r->z) / 2);
  121382. r->z[0] = 1;
  121383. }
  121384. /* Add two Montgomery form numbers (r = a + b % m).
  121385. *
  121386. * r Result of addition.
  121387. * a First number to add in Montgomery form.
  121388. * b Second number to add in Montgomery form.
  121389. * m Modulus (prime).
  121390. */
  121391. SP_NOINLINE static void sp_521_mont_add_17(sp_digit* r, const sp_digit* a,
  121392. const sp_digit* b, const sp_digit* m)
  121393. {
  121394. __asm__ __volatile__ (
  121395. "ldm %[a]!, {r4, r5}\n\t"
  121396. "ldm %[b]!, {r6, r7}\n\t"
  121397. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121398. "adds r4, r4, r6\n\t"
  121399. #else
  121400. "add r4, r4, r6\n\t"
  121401. #endif
  121402. #ifdef WOLFSSL_KEIL
  121403. "adcs r5, r5, r7\n\t"
  121404. #elif defined(__clang__)
  121405. "adcs r5, r7\n\t"
  121406. #else
  121407. "adc r5, r7\n\t"
  121408. #endif
  121409. "stm %[r]!, {r4, r5}\n\t"
  121410. "ldm %[a]!, {r4, r5}\n\t"
  121411. "ldm %[b]!, {r6, r7}\n\t"
  121412. #ifdef WOLFSSL_KEIL
  121413. "adcs r4, r4, r6\n\t"
  121414. #elif defined(__clang__)
  121415. "adcs r4, r6\n\t"
  121416. #else
  121417. "adc r4, r6\n\t"
  121418. #endif
  121419. #ifdef WOLFSSL_KEIL
  121420. "adcs r5, r5, r7\n\t"
  121421. #elif defined(__clang__)
  121422. "adcs r5, r7\n\t"
  121423. #else
  121424. "adc r5, r7\n\t"
  121425. #endif
  121426. "stm %[r]!, {r4, r5}\n\t"
  121427. "ldm %[a]!, {r4, r5}\n\t"
  121428. "ldm %[b]!, {r6, r7}\n\t"
  121429. #ifdef WOLFSSL_KEIL
  121430. "adcs r4, r4, r6\n\t"
  121431. #elif defined(__clang__)
  121432. "adcs r4, r6\n\t"
  121433. #else
  121434. "adc r4, r6\n\t"
  121435. #endif
  121436. #ifdef WOLFSSL_KEIL
  121437. "adcs r5, r5, r7\n\t"
  121438. #elif defined(__clang__)
  121439. "adcs r5, r7\n\t"
  121440. #else
  121441. "adc r5, r7\n\t"
  121442. #endif
  121443. "stm %[r]!, {r4, r5}\n\t"
  121444. "ldm %[a]!, {r4, r5}\n\t"
  121445. "ldm %[b]!, {r6, r7}\n\t"
  121446. #ifdef WOLFSSL_KEIL
  121447. "adcs r4, r4, r6\n\t"
  121448. #elif defined(__clang__)
  121449. "adcs r4, r6\n\t"
  121450. #else
  121451. "adc r4, r6\n\t"
  121452. #endif
  121453. #ifdef WOLFSSL_KEIL
  121454. "adcs r5, r5, r7\n\t"
  121455. #elif defined(__clang__)
  121456. "adcs r5, r7\n\t"
  121457. #else
  121458. "adc r5, r7\n\t"
  121459. #endif
  121460. "stm %[r]!, {r4, r5}\n\t"
  121461. "ldm %[a]!, {r4, r5}\n\t"
  121462. "ldm %[b]!, {r6, r7}\n\t"
  121463. #ifdef WOLFSSL_KEIL
  121464. "adcs r4, r4, r6\n\t"
  121465. #elif defined(__clang__)
  121466. "adcs r4, r6\n\t"
  121467. #else
  121468. "adc r4, r6\n\t"
  121469. #endif
  121470. #ifdef WOLFSSL_KEIL
  121471. "adcs r5, r5, r7\n\t"
  121472. #elif defined(__clang__)
  121473. "adcs r5, r7\n\t"
  121474. #else
  121475. "adc r5, r7\n\t"
  121476. #endif
  121477. "stm %[r]!, {r4, r5}\n\t"
  121478. "ldm %[a]!, {r4, r5}\n\t"
  121479. "ldm %[b]!, {r6, r7}\n\t"
  121480. #ifdef WOLFSSL_KEIL
  121481. "adcs r4, r4, r6\n\t"
  121482. #elif defined(__clang__)
  121483. "adcs r4, r6\n\t"
  121484. #else
  121485. "adc r4, r6\n\t"
  121486. #endif
  121487. #ifdef WOLFSSL_KEIL
  121488. "adcs r5, r5, r7\n\t"
  121489. #elif defined(__clang__)
  121490. "adcs r5, r7\n\t"
  121491. #else
  121492. "adc r5, r7\n\t"
  121493. #endif
  121494. "stm %[r]!, {r4, r5}\n\t"
  121495. "ldm %[a]!, {r4, r5}\n\t"
  121496. "ldm %[b]!, {r6, r7}\n\t"
  121497. #ifdef WOLFSSL_KEIL
  121498. "adcs r4, r4, r6\n\t"
  121499. #elif defined(__clang__)
  121500. "adcs r4, r6\n\t"
  121501. #else
  121502. "adc r4, r6\n\t"
  121503. #endif
  121504. #ifdef WOLFSSL_KEIL
  121505. "adcs r5, r5, r7\n\t"
  121506. #elif defined(__clang__)
  121507. "adcs r5, r7\n\t"
  121508. #else
  121509. "adc r5, r7\n\t"
  121510. #endif
  121511. "stm %[r]!, {r4, r5}\n\t"
  121512. "ldm %[a]!, {r4, r5}\n\t"
  121513. "ldm %[b]!, {r6, r7}\n\t"
  121514. #ifdef WOLFSSL_KEIL
  121515. "adcs r4, r4, r6\n\t"
  121516. #elif defined(__clang__)
  121517. "adcs r4, r6\n\t"
  121518. #else
  121519. "adc r4, r6\n\t"
  121520. #endif
  121521. #ifdef WOLFSSL_KEIL
  121522. "adcs r5, r5, r7\n\t"
  121523. #elif defined(__clang__)
  121524. "adcs r5, r7\n\t"
  121525. #else
  121526. "adc r5, r7\n\t"
  121527. #endif
  121528. "stm %[r]!, {r4, r5}\n\t"
  121529. "ldm %[a]!, {r4}\n\t"
  121530. "ldm %[b]!, {r6}\n\t"
  121531. #ifdef WOLFSSL_KEIL
  121532. "adcs r4, r4, r6\n\t"
  121533. #elif defined(__clang__)
  121534. "adcs r4, r6\n\t"
  121535. #else
  121536. "adc r4, r6\n\t"
  121537. #endif
  121538. "movs r7, #1\n\t"
  121539. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121540. "lsls r7, r7, #8\n\t"
  121541. #else
  121542. "lsl r7, r7, #8\n\t"
  121543. #endif
  121544. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121545. "adds r7, r7, #0xff\n\t"
  121546. #else
  121547. "add r7, r7, #0xff\n\t"
  121548. #endif
  121549. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121550. "lsrs %[m], r4, #9\n\t"
  121551. #else
  121552. "lsr %[m], r4, #9\n\t"
  121553. #endif
  121554. #ifdef WOLFSSL_KEIL
  121555. "ands r4, r4, r7\n\t"
  121556. #elif defined(__clang__)
  121557. "ands r4, r7\n\t"
  121558. #else
  121559. "and r4, r7\n\t"
  121560. #endif
  121561. "stm %[r]!, {r4}\n\t"
  121562. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121563. "subs %[r], %[r], #0x44\n\t"
  121564. #else
  121565. "sub %[r], %[r], #0x44\n\t"
  121566. #endif
  121567. "ldr r4, [%[r]]\n\t"
  121568. "ldr r5, [%[r], #4]\n\t"
  121569. "ldr r6, [%[r], #8]\n\t"
  121570. "ldr r7, [%[r], #12]\n\t"
  121571. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121572. "adds r4, r4, %[m]\n\t"
  121573. #else
  121574. "add r4, r4, %[m]\n\t"
  121575. #endif
  121576. "movs %[m], #0\n\t"
  121577. #ifdef WOLFSSL_KEIL
  121578. "adcs r5, r5, %[m]\n\t"
  121579. #elif defined(__clang__)
  121580. "adcs r5, %[m]\n\t"
  121581. #else
  121582. "adc r5, %[m]\n\t"
  121583. #endif
  121584. #ifdef WOLFSSL_KEIL
  121585. "adcs r6, r6, %[m]\n\t"
  121586. #elif defined(__clang__)
  121587. "adcs r6, %[m]\n\t"
  121588. #else
  121589. "adc r6, %[m]\n\t"
  121590. #endif
  121591. #ifdef WOLFSSL_KEIL
  121592. "adcs r7, r7, %[m]\n\t"
  121593. #elif defined(__clang__)
  121594. "adcs r7, %[m]\n\t"
  121595. #else
  121596. "adc r7, %[m]\n\t"
  121597. #endif
  121598. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  121599. "ldr r4, [%[r]]\n\t"
  121600. "ldr r5, [%[r], #4]\n\t"
  121601. "ldr r6, [%[r], #8]\n\t"
  121602. "ldr r7, [%[r], #12]\n\t"
  121603. #ifdef WOLFSSL_KEIL
  121604. "adcs r4, r4, %[m]\n\t"
  121605. #elif defined(__clang__)
  121606. "adcs r4, %[m]\n\t"
  121607. #else
  121608. "adc r4, %[m]\n\t"
  121609. #endif
  121610. #ifdef WOLFSSL_KEIL
  121611. "adcs r5, r5, %[m]\n\t"
  121612. #elif defined(__clang__)
  121613. "adcs r5, %[m]\n\t"
  121614. #else
  121615. "adc r5, %[m]\n\t"
  121616. #endif
  121617. #ifdef WOLFSSL_KEIL
  121618. "adcs r6, r6, %[m]\n\t"
  121619. #elif defined(__clang__)
  121620. "adcs r6, %[m]\n\t"
  121621. #else
  121622. "adc r6, %[m]\n\t"
  121623. #endif
  121624. #ifdef WOLFSSL_KEIL
  121625. "adcs r7, r7, %[m]\n\t"
  121626. #elif defined(__clang__)
  121627. "adcs r7, %[m]\n\t"
  121628. #else
  121629. "adc r7, %[m]\n\t"
  121630. #endif
  121631. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  121632. "ldr r4, [%[r]]\n\t"
  121633. "ldr r5, [%[r], #4]\n\t"
  121634. "ldr r6, [%[r], #8]\n\t"
  121635. "ldr r7, [%[r], #12]\n\t"
  121636. #ifdef WOLFSSL_KEIL
  121637. "adcs r4, r4, %[m]\n\t"
  121638. #elif defined(__clang__)
  121639. "adcs r4, %[m]\n\t"
  121640. #else
  121641. "adc r4, %[m]\n\t"
  121642. #endif
  121643. #ifdef WOLFSSL_KEIL
  121644. "adcs r5, r5, %[m]\n\t"
  121645. #elif defined(__clang__)
  121646. "adcs r5, %[m]\n\t"
  121647. #else
  121648. "adc r5, %[m]\n\t"
  121649. #endif
  121650. #ifdef WOLFSSL_KEIL
  121651. "adcs r6, r6, %[m]\n\t"
  121652. #elif defined(__clang__)
  121653. "adcs r6, %[m]\n\t"
  121654. #else
  121655. "adc r6, %[m]\n\t"
  121656. #endif
  121657. #ifdef WOLFSSL_KEIL
  121658. "adcs r7, r7, %[m]\n\t"
  121659. #elif defined(__clang__)
  121660. "adcs r7, %[m]\n\t"
  121661. #else
  121662. "adc r7, %[m]\n\t"
  121663. #endif
  121664. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  121665. "ldr r4, [%[r]]\n\t"
  121666. "ldr r5, [%[r], #4]\n\t"
  121667. "ldr r6, [%[r], #8]\n\t"
  121668. "ldr r7, [%[r], #12]\n\t"
  121669. #ifdef WOLFSSL_KEIL
  121670. "adcs r4, r4, %[m]\n\t"
  121671. #elif defined(__clang__)
  121672. "adcs r4, %[m]\n\t"
  121673. #else
  121674. "adc r4, %[m]\n\t"
  121675. #endif
  121676. #ifdef WOLFSSL_KEIL
  121677. "adcs r5, r5, %[m]\n\t"
  121678. #elif defined(__clang__)
  121679. "adcs r5, %[m]\n\t"
  121680. #else
  121681. "adc r5, %[m]\n\t"
  121682. #endif
  121683. #ifdef WOLFSSL_KEIL
  121684. "adcs r6, r6, %[m]\n\t"
  121685. #elif defined(__clang__)
  121686. "adcs r6, %[m]\n\t"
  121687. #else
  121688. "adc r6, %[m]\n\t"
  121689. #endif
  121690. #ifdef WOLFSSL_KEIL
  121691. "adcs r7, r7, %[m]\n\t"
  121692. #elif defined(__clang__)
  121693. "adcs r7, %[m]\n\t"
  121694. #else
  121695. "adc r7, %[m]\n\t"
  121696. #endif
  121697. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  121698. "ldr r4, [%[r]]\n\t"
  121699. #ifdef WOLFSSL_KEIL
  121700. "adcs r4, r4, %[m]\n\t"
  121701. #elif defined(__clang__)
  121702. "adcs r4, %[m]\n\t"
  121703. #else
  121704. "adc r4, %[m]\n\t"
  121705. #endif
  121706. "stm %[r]!, {r4}\n\t"
  121707. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121708. "subs %[r], %[r], #0x44\n\t"
  121709. #else
  121710. "sub %[r], %[r], #0x44\n\t"
  121711. #endif
  121712. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m)
  121713. :
  121714. : "memory", "r4", "r5", "r6", "r7"
  121715. );
  121716. }
  121717. /* Double a Montgomery form number (r = a + a % m).
  121718. *
  121719. * r Result of doubling.
  121720. * a Number to double in Montgomery form.
  121721. * m Modulus (prime).
  121722. */
  121723. SP_NOINLINE static void sp_521_mont_dbl_17(sp_digit* r, const sp_digit* a,
  121724. const sp_digit* m)
  121725. {
  121726. __asm__ __volatile__ (
  121727. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  121728. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121729. "adds r3, r3, r3\n\t"
  121730. #else
  121731. "add r3, r3, r3\n\t"
  121732. #endif
  121733. #ifdef WOLFSSL_KEIL
  121734. "adcs r4, r4, r4\n\t"
  121735. #elif defined(__clang__)
  121736. "adcs r4, r4\n\t"
  121737. #else
  121738. "adc r4, r4\n\t"
  121739. #endif
  121740. #ifdef WOLFSSL_KEIL
  121741. "adcs r5, r5, r5\n\t"
  121742. #elif defined(__clang__)
  121743. "adcs r5, r5\n\t"
  121744. #else
  121745. "adc r5, r5\n\t"
  121746. #endif
  121747. #ifdef WOLFSSL_KEIL
  121748. "adcs r6, r6, r6\n\t"
  121749. #elif defined(__clang__)
  121750. "adcs r6, r6\n\t"
  121751. #else
  121752. "adc r6, r6\n\t"
  121753. #endif
  121754. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  121755. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  121756. #ifdef WOLFSSL_KEIL
  121757. "adcs r3, r3, r3\n\t"
  121758. #elif defined(__clang__)
  121759. "adcs r3, r3\n\t"
  121760. #else
  121761. "adc r3, r3\n\t"
  121762. #endif
  121763. #ifdef WOLFSSL_KEIL
  121764. "adcs r4, r4, r4\n\t"
  121765. #elif defined(__clang__)
  121766. "adcs r4, r4\n\t"
  121767. #else
  121768. "adc r4, r4\n\t"
  121769. #endif
  121770. #ifdef WOLFSSL_KEIL
  121771. "adcs r5, r5, r5\n\t"
  121772. #elif defined(__clang__)
  121773. "adcs r5, r5\n\t"
  121774. #else
  121775. "adc r5, r5\n\t"
  121776. #endif
  121777. #ifdef WOLFSSL_KEIL
  121778. "adcs r6, r6, r6\n\t"
  121779. #elif defined(__clang__)
  121780. "adcs r6, r6\n\t"
  121781. #else
  121782. "adc r6, r6\n\t"
  121783. #endif
  121784. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  121785. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  121786. #ifdef WOLFSSL_KEIL
  121787. "adcs r3, r3, r3\n\t"
  121788. #elif defined(__clang__)
  121789. "adcs r3, r3\n\t"
  121790. #else
  121791. "adc r3, r3\n\t"
  121792. #endif
  121793. #ifdef WOLFSSL_KEIL
  121794. "adcs r4, r4, r4\n\t"
  121795. #elif defined(__clang__)
  121796. "adcs r4, r4\n\t"
  121797. #else
  121798. "adc r4, r4\n\t"
  121799. #endif
  121800. #ifdef WOLFSSL_KEIL
  121801. "adcs r5, r5, r5\n\t"
  121802. #elif defined(__clang__)
  121803. "adcs r5, r5\n\t"
  121804. #else
  121805. "adc r5, r5\n\t"
  121806. #endif
  121807. #ifdef WOLFSSL_KEIL
  121808. "adcs r6, r6, r6\n\t"
  121809. #elif defined(__clang__)
  121810. "adcs r6, r6\n\t"
  121811. #else
  121812. "adc r6, r6\n\t"
  121813. #endif
  121814. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  121815. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  121816. #ifdef WOLFSSL_KEIL
  121817. "adcs r3, r3, r3\n\t"
  121818. #elif defined(__clang__)
  121819. "adcs r3, r3\n\t"
  121820. #else
  121821. "adc r3, r3\n\t"
  121822. #endif
  121823. #ifdef WOLFSSL_KEIL
  121824. "adcs r4, r4, r4\n\t"
  121825. #elif defined(__clang__)
  121826. "adcs r4, r4\n\t"
  121827. #else
  121828. "adc r4, r4\n\t"
  121829. #endif
  121830. #ifdef WOLFSSL_KEIL
  121831. "adcs r5, r5, r5\n\t"
  121832. #elif defined(__clang__)
  121833. "adcs r5, r5\n\t"
  121834. #else
  121835. "adc r5, r5\n\t"
  121836. #endif
  121837. #ifdef WOLFSSL_KEIL
  121838. "adcs r6, r6, r6\n\t"
  121839. #elif defined(__clang__)
  121840. "adcs r6, r6\n\t"
  121841. #else
  121842. "adc r6, r6\n\t"
  121843. #endif
  121844. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  121845. "ldm %[a]!, {r3}\n\t"
  121846. #ifdef WOLFSSL_KEIL
  121847. "adcs r3, r3, r3\n\t"
  121848. #elif defined(__clang__)
  121849. "adcs r3, r3\n\t"
  121850. #else
  121851. "adc r3, r3\n\t"
  121852. #endif
  121853. "movs r7, #1\n\t"
  121854. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121855. "lsls r7, r7, #8\n\t"
  121856. #else
  121857. "lsl r7, r7, #8\n\t"
  121858. #endif
  121859. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121860. "adds r7, r7, #0xff\n\t"
  121861. #else
  121862. "add r7, r7, #0xff\n\t"
  121863. #endif
  121864. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121865. "lsrs %[m], r3, #9\n\t"
  121866. #else
  121867. "lsr %[m], r3, #9\n\t"
  121868. #endif
  121869. #ifdef WOLFSSL_KEIL
  121870. "ands r3, r3, r7\n\t"
  121871. #elif defined(__clang__)
  121872. "ands r3, r7\n\t"
  121873. #else
  121874. "and r3, r7\n\t"
  121875. #endif
  121876. "stm %[r]!, {r3}\n\t"
  121877. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121878. "subs %[r], %[r], #0x44\n\t"
  121879. #else
  121880. "sub %[r], %[r], #0x44\n\t"
  121881. #endif
  121882. "movs r7, #0\n\t"
  121883. "ldr r3, [%[r]]\n\t"
  121884. "ldr r4, [%[r], #4]\n\t"
  121885. "ldr r5, [%[r], #8]\n\t"
  121886. "ldr r6, [%[r], #12]\n\t"
  121887. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121888. "adds r3, r3, %[m]\n\t"
  121889. #else
  121890. "add r3, r3, %[m]\n\t"
  121891. #endif
  121892. #ifdef WOLFSSL_KEIL
  121893. "adcs r4, r4, r7\n\t"
  121894. #elif defined(__clang__)
  121895. "adcs r4, r7\n\t"
  121896. #else
  121897. "adc r4, r7\n\t"
  121898. #endif
  121899. #ifdef WOLFSSL_KEIL
  121900. "adcs r5, r5, r7\n\t"
  121901. #elif defined(__clang__)
  121902. "adcs r5, r7\n\t"
  121903. #else
  121904. "adc r5, r7\n\t"
  121905. #endif
  121906. #ifdef WOLFSSL_KEIL
  121907. "adcs r6, r6, r7\n\t"
  121908. #elif defined(__clang__)
  121909. "adcs r6, r7\n\t"
  121910. #else
  121911. "adc r6, r7\n\t"
  121912. #endif
  121913. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  121914. "ldr r3, [%[r]]\n\t"
  121915. "ldr r4, [%[r], #4]\n\t"
  121916. "ldr r5, [%[r], #8]\n\t"
  121917. "ldr r6, [%[r], #12]\n\t"
  121918. #ifdef WOLFSSL_KEIL
  121919. "adcs r3, r3, r7\n\t"
  121920. #elif defined(__clang__)
  121921. "adcs r3, r7\n\t"
  121922. #else
  121923. "adc r3, r7\n\t"
  121924. #endif
  121925. #ifdef WOLFSSL_KEIL
  121926. "adcs r4, r4, r7\n\t"
  121927. #elif defined(__clang__)
  121928. "adcs r4, r7\n\t"
  121929. #else
  121930. "adc r4, r7\n\t"
  121931. #endif
  121932. #ifdef WOLFSSL_KEIL
  121933. "adcs r5, r5, r7\n\t"
  121934. #elif defined(__clang__)
  121935. "adcs r5, r7\n\t"
  121936. #else
  121937. "adc r5, r7\n\t"
  121938. #endif
  121939. #ifdef WOLFSSL_KEIL
  121940. "adcs r6, r6, r7\n\t"
  121941. #elif defined(__clang__)
  121942. "adcs r6, r7\n\t"
  121943. #else
  121944. "adc r6, r7\n\t"
  121945. #endif
  121946. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  121947. "ldr r3, [%[r]]\n\t"
  121948. "ldr r4, [%[r], #4]\n\t"
  121949. "ldr r5, [%[r], #8]\n\t"
  121950. "ldr r6, [%[r], #12]\n\t"
  121951. #ifdef WOLFSSL_KEIL
  121952. "adcs r3, r3, r7\n\t"
  121953. #elif defined(__clang__)
  121954. "adcs r3, r7\n\t"
  121955. #else
  121956. "adc r3, r7\n\t"
  121957. #endif
  121958. #ifdef WOLFSSL_KEIL
  121959. "adcs r4, r4, r7\n\t"
  121960. #elif defined(__clang__)
  121961. "adcs r4, r7\n\t"
  121962. #else
  121963. "adc r4, r7\n\t"
  121964. #endif
  121965. #ifdef WOLFSSL_KEIL
  121966. "adcs r5, r5, r7\n\t"
  121967. #elif defined(__clang__)
  121968. "adcs r5, r7\n\t"
  121969. #else
  121970. "adc r5, r7\n\t"
  121971. #endif
  121972. #ifdef WOLFSSL_KEIL
  121973. "adcs r6, r6, r7\n\t"
  121974. #elif defined(__clang__)
  121975. "adcs r6, r7\n\t"
  121976. #else
  121977. "adc r6, r7\n\t"
  121978. #endif
  121979. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  121980. "ldr r3, [%[r]]\n\t"
  121981. "ldr r4, [%[r], #4]\n\t"
  121982. "ldr r5, [%[r], #8]\n\t"
  121983. "ldr r6, [%[r], #12]\n\t"
  121984. #ifdef WOLFSSL_KEIL
  121985. "adcs r3, r3, r7\n\t"
  121986. #elif defined(__clang__)
  121987. "adcs r3, r7\n\t"
  121988. #else
  121989. "adc r3, r7\n\t"
  121990. #endif
  121991. #ifdef WOLFSSL_KEIL
  121992. "adcs r4, r4, r7\n\t"
  121993. #elif defined(__clang__)
  121994. "adcs r4, r7\n\t"
  121995. #else
  121996. "adc r4, r7\n\t"
  121997. #endif
  121998. #ifdef WOLFSSL_KEIL
  121999. "adcs r5, r5, r7\n\t"
  122000. #elif defined(__clang__)
  122001. "adcs r5, r7\n\t"
  122002. #else
  122003. "adc r5, r7\n\t"
  122004. #endif
  122005. #ifdef WOLFSSL_KEIL
  122006. "adcs r6, r6, r7\n\t"
  122007. #elif defined(__clang__)
  122008. "adcs r6, r7\n\t"
  122009. #else
  122010. "adc r6, r7\n\t"
  122011. #endif
  122012. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  122013. "ldr r3, [%[r]]\n\t"
  122014. #ifdef WOLFSSL_KEIL
  122015. "adcs r3, r3, r7\n\t"
  122016. #elif defined(__clang__)
  122017. "adcs r3, r7\n\t"
  122018. #else
  122019. "adc r3, r7\n\t"
  122020. #endif
  122021. "stm %[r]!, {r3}\n\t"
  122022. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122023. "subs %[r], %[r], #0x44\n\t"
  122024. #else
  122025. "sub %[r], %[r], #0x44\n\t"
  122026. #endif
  122027. : [r] "+l" (r), [a] "+l" (a), [m] "+l" (m)
  122028. :
  122029. : "memory", "r3", "r4", "r5", "r6", "r7"
  122030. );
  122031. }
  122032. /* Triple a Montgomery form number (r = a + a + a % m).
  122033. *
  122034. * r Result of Tripling.
  122035. * a Number to triple in Montgomery form.
  122036. * m Modulus (prime).
  122037. */
  122038. SP_NOINLINE static void sp_521_mont_tpl_17(sp_digit* r, const sp_digit* a,
  122039. const sp_digit* m)
  122040. {
  122041. __asm__ __volatile__ (
  122042. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  122043. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122044. "adds r3, r3, r3\n\t"
  122045. #else
  122046. "add r3, r3, r3\n\t"
  122047. #endif
  122048. #ifdef WOLFSSL_KEIL
  122049. "adcs r4, r4, r4\n\t"
  122050. #elif defined(__clang__)
  122051. "adcs r4, r4\n\t"
  122052. #else
  122053. "adc r4, r4\n\t"
  122054. #endif
  122055. #ifdef WOLFSSL_KEIL
  122056. "adcs r5, r5, r5\n\t"
  122057. #elif defined(__clang__)
  122058. "adcs r5, r5\n\t"
  122059. #else
  122060. "adc r5, r5\n\t"
  122061. #endif
  122062. #ifdef WOLFSSL_KEIL
  122063. "adcs r6, r6, r6\n\t"
  122064. #elif defined(__clang__)
  122065. "adcs r6, r6\n\t"
  122066. #else
  122067. "adc r6, r6\n\t"
  122068. #endif
  122069. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  122070. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  122071. #ifdef WOLFSSL_KEIL
  122072. "adcs r3, r3, r3\n\t"
  122073. #elif defined(__clang__)
  122074. "adcs r3, r3\n\t"
  122075. #else
  122076. "adc r3, r3\n\t"
  122077. #endif
  122078. #ifdef WOLFSSL_KEIL
  122079. "adcs r4, r4, r4\n\t"
  122080. #elif defined(__clang__)
  122081. "adcs r4, r4\n\t"
  122082. #else
  122083. "adc r4, r4\n\t"
  122084. #endif
  122085. #ifdef WOLFSSL_KEIL
  122086. "adcs r5, r5, r5\n\t"
  122087. #elif defined(__clang__)
  122088. "adcs r5, r5\n\t"
  122089. #else
  122090. "adc r5, r5\n\t"
  122091. #endif
  122092. #ifdef WOLFSSL_KEIL
  122093. "adcs r6, r6, r6\n\t"
  122094. #elif defined(__clang__)
  122095. "adcs r6, r6\n\t"
  122096. #else
  122097. "adc r6, r6\n\t"
  122098. #endif
  122099. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  122100. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  122101. #ifdef WOLFSSL_KEIL
  122102. "adcs r3, r3, r3\n\t"
  122103. #elif defined(__clang__)
  122104. "adcs r3, r3\n\t"
  122105. #else
  122106. "adc r3, r3\n\t"
  122107. #endif
  122108. #ifdef WOLFSSL_KEIL
  122109. "adcs r4, r4, r4\n\t"
  122110. #elif defined(__clang__)
  122111. "adcs r4, r4\n\t"
  122112. #else
  122113. "adc r4, r4\n\t"
  122114. #endif
  122115. #ifdef WOLFSSL_KEIL
  122116. "adcs r5, r5, r5\n\t"
  122117. #elif defined(__clang__)
  122118. "adcs r5, r5\n\t"
  122119. #else
  122120. "adc r5, r5\n\t"
  122121. #endif
  122122. #ifdef WOLFSSL_KEIL
  122123. "adcs r6, r6, r6\n\t"
  122124. #elif defined(__clang__)
  122125. "adcs r6, r6\n\t"
  122126. #else
  122127. "adc r6, r6\n\t"
  122128. #endif
  122129. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  122130. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  122131. #ifdef WOLFSSL_KEIL
  122132. "adcs r3, r3, r3\n\t"
  122133. #elif defined(__clang__)
  122134. "adcs r3, r3\n\t"
  122135. #else
  122136. "adc r3, r3\n\t"
  122137. #endif
  122138. #ifdef WOLFSSL_KEIL
  122139. "adcs r4, r4, r4\n\t"
  122140. #elif defined(__clang__)
  122141. "adcs r4, r4\n\t"
  122142. #else
  122143. "adc r4, r4\n\t"
  122144. #endif
  122145. #ifdef WOLFSSL_KEIL
  122146. "adcs r5, r5, r5\n\t"
  122147. #elif defined(__clang__)
  122148. "adcs r5, r5\n\t"
  122149. #else
  122150. "adc r5, r5\n\t"
  122151. #endif
  122152. #ifdef WOLFSSL_KEIL
  122153. "adcs r6, r6, r6\n\t"
  122154. #elif defined(__clang__)
  122155. "adcs r6, r6\n\t"
  122156. #else
  122157. "adc r6, r6\n\t"
  122158. #endif
  122159. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  122160. "ldm %[a]!, {r3}\n\t"
  122161. #ifdef WOLFSSL_KEIL
  122162. "adcs r3, r3, r3\n\t"
  122163. #elif defined(__clang__)
  122164. "adcs r3, r3\n\t"
  122165. #else
  122166. "adc r3, r3\n\t"
  122167. #endif
  122168. "stm %[r]!, {r3}\n\t"
  122169. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122170. "subs %[r], %[r], #0x44\n\t"
  122171. #else
  122172. "sub %[r], %[r], #0x44\n\t"
  122173. #endif
  122174. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122175. "subs %[a], %[a], #0x44\n\t"
  122176. #else
  122177. "sub %[a], %[a], #0x44\n\t"
  122178. #endif
  122179. "ldm %[a]!, {r3, r4}\n\t"
  122180. "ldr r5, [%[r]]\n\t"
  122181. "ldr r6, [%[r], #4]\n\t"
  122182. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122183. "adds r5, r5, r3\n\t"
  122184. #else
  122185. "add r5, r5, r3\n\t"
  122186. #endif
  122187. #ifdef WOLFSSL_KEIL
  122188. "adcs r6, r6, r4\n\t"
  122189. #elif defined(__clang__)
  122190. "adcs r6, r4\n\t"
  122191. #else
  122192. "adc r6, r4\n\t"
  122193. #endif
  122194. "stm %[r]!, {r5, r6}\n\t"
  122195. "ldm %[a]!, {r3, r4}\n\t"
  122196. "ldr r5, [%[r]]\n\t"
  122197. "ldr r6, [%[r], #4]\n\t"
  122198. #ifdef WOLFSSL_KEIL
  122199. "adcs r5, r5, r3\n\t"
  122200. #elif defined(__clang__)
  122201. "adcs r5, r3\n\t"
  122202. #else
  122203. "adc r5, r3\n\t"
  122204. #endif
  122205. #ifdef WOLFSSL_KEIL
  122206. "adcs r6, r6, r4\n\t"
  122207. #elif defined(__clang__)
  122208. "adcs r6, r4\n\t"
  122209. #else
  122210. "adc r6, r4\n\t"
  122211. #endif
  122212. "stm %[r]!, {r5, r6}\n\t"
  122213. "ldm %[a]!, {r3, r4}\n\t"
  122214. "ldr r5, [%[r]]\n\t"
  122215. "ldr r6, [%[r], #4]\n\t"
  122216. #ifdef WOLFSSL_KEIL
  122217. "adcs r5, r5, r3\n\t"
  122218. #elif defined(__clang__)
  122219. "adcs r5, r3\n\t"
  122220. #else
  122221. "adc r5, r3\n\t"
  122222. #endif
  122223. #ifdef WOLFSSL_KEIL
  122224. "adcs r6, r6, r4\n\t"
  122225. #elif defined(__clang__)
  122226. "adcs r6, r4\n\t"
  122227. #else
  122228. "adc r6, r4\n\t"
  122229. #endif
  122230. "stm %[r]!, {r5, r6}\n\t"
  122231. "ldm %[a]!, {r3, r4}\n\t"
  122232. "ldr r5, [%[r]]\n\t"
  122233. "ldr r6, [%[r], #4]\n\t"
  122234. #ifdef WOLFSSL_KEIL
  122235. "adcs r5, r5, r3\n\t"
  122236. #elif defined(__clang__)
  122237. "adcs r5, r3\n\t"
  122238. #else
  122239. "adc r5, r3\n\t"
  122240. #endif
  122241. #ifdef WOLFSSL_KEIL
  122242. "adcs r6, r6, r4\n\t"
  122243. #elif defined(__clang__)
  122244. "adcs r6, r4\n\t"
  122245. #else
  122246. "adc r6, r4\n\t"
  122247. #endif
  122248. "stm %[r]!, {r5, r6}\n\t"
  122249. "ldm %[a]!, {r3, r4}\n\t"
  122250. "ldr r5, [%[r]]\n\t"
  122251. "ldr r6, [%[r], #4]\n\t"
  122252. #ifdef WOLFSSL_KEIL
  122253. "adcs r5, r5, r3\n\t"
  122254. #elif defined(__clang__)
  122255. "adcs r5, r3\n\t"
  122256. #else
  122257. "adc r5, r3\n\t"
  122258. #endif
  122259. #ifdef WOLFSSL_KEIL
  122260. "adcs r6, r6, r4\n\t"
  122261. #elif defined(__clang__)
  122262. "adcs r6, r4\n\t"
  122263. #else
  122264. "adc r6, r4\n\t"
  122265. #endif
  122266. "stm %[r]!, {r5, r6}\n\t"
  122267. "ldm %[a]!, {r3, r4}\n\t"
  122268. "ldr r5, [%[r]]\n\t"
  122269. "ldr r6, [%[r], #4]\n\t"
  122270. #ifdef WOLFSSL_KEIL
  122271. "adcs r5, r5, r3\n\t"
  122272. #elif defined(__clang__)
  122273. "adcs r5, r3\n\t"
  122274. #else
  122275. "adc r5, r3\n\t"
  122276. #endif
  122277. #ifdef WOLFSSL_KEIL
  122278. "adcs r6, r6, r4\n\t"
  122279. #elif defined(__clang__)
  122280. "adcs r6, r4\n\t"
  122281. #else
  122282. "adc r6, r4\n\t"
  122283. #endif
  122284. "stm %[r]!, {r5, r6}\n\t"
  122285. "ldm %[a]!, {r3, r4}\n\t"
  122286. "ldr r5, [%[r]]\n\t"
  122287. "ldr r6, [%[r], #4]\n\t"
  122288. #ifdef WOLFSSL_KEIL
  122289. "adcs r5, r5, r3\n\t"
  122290. #elif defined(__clang__)
  122291. "adcs r5, r3\n\t"
  122292. #else
  122293. "adc r5, r3\n\t"
  122294. #endif
  122295. #ifdef WOLFSSL_KEIL
  122296. "adcs r6, r6, r4\n\t"
  122297. #elif defined(__clang__)
  122298. "adcs r6, r4\n\t"
  122299. #else
  122300. "adc r6, r4\n\t"
  122301. #endif
  122302. "stm %[r]!, {r5, r6}\n\t"
  122303. "ldm %[a]!, {r3, r4}\n\t"
  122304. "ldr r5, [%[r]]\n\t"
  122305. "ldr r6, [%[r], #4]\n\t"
  122306. #ifdef WOLFSSL_KEIL
  122307. "adcs r5, r5, r3\n\t"
  122308. #elif defined(__clang__)
  122309. "adcs r5, r3\n\t"
  122310. #else
  122311. "adc r5, r3\n\t"
  122312. #endif
  122313. #ifdef WOLFSSL_KEIL
  122314. "adcs r6, r6, r4\n\t"
  122315. #elif defined(__clang__)
  122316. "adcs r6, r4\n\t"
  122317. #else
  122318. "adc r6, r4\n\t"
  122319. #endif
  122320. "stm %[r]!, {r5, r6}\n\t"
  122321. "ldm %[a]!, {r3}\n\t"
  122322. "ldr r5, [%[r]]\n\t"
  122323. #ifdef WOLFSSL_KEIL
  122324. "adcs r5, r5, r3\n\t"
  122325. #elif defined(__clang__)
  122326. "adcs r5, r3\n\t"
  122327. #else
  122328. "adc r5, r3\n\t"
  122329. #endif
  122330. "movs r7, #1\n\t"
  122331. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122332. "lsls r7, r7, #8\n\t"
  122333. #else
  122334. "lsl r7, r7, #8\n\t"
  122335. #endif
  122336. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122337. "adds r7, r7, #0xff\n\t"
  122338. #else
  122339. "add r7, r7, #0xff\n\t"
  122340. #endif
  122341. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122342. "lsrs %[m], r5, #9\n\t"
  122343. #else
  122344. "lsr %[m], r5, #9\n\t"
  122345. #endif
  122346. #ifdef WOLFSSL_KEIL
  122347. "ands r5, r5, r7\n\t"
  122348. #elif defined(__clang__)
  122349. "ands r5, r7\n\t"
  122350. #else
  122351. "and r5, r7\n\t"
  122352. #endif
  122353. "stm %[r]!, {r5}\n\t"
  122354. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122355. "subs %[r], %[r], #0x44\n\t"
  122356. #else
  122357. "sub %[r], %[r], #0x44\n\t"
  122358. #endif
  122359. "movs r7, #0\n\t"
  122360. "ldr r3, [%[r]]\n\t"
  122361. "ldr r4, [%[r], #4]\n\t"
  122362. "ldr r5, [%[r], #8]\n\t"
  122363. "ldr r6, [%[r], #12]\n\t"
  122364. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122365. "adds r3, r3, %[m]\n\t"
  122366. #else
  122367. "add r3, r3, %[m]\n\t"
  122368. #endif
  122369. #ifdef WOLFSSL_KEIL
  122370. "adcs r4, r4, r7\n\t"
  122371. #elif defined(__clang__)
  122372. "adcs r4, r7\n\t"
  122373. #else
  122374. "adc r4, r7\n\t"
  122375. #endif
  122376. #ifdef WOLFSSL_KEIL
  122377. "adcs r5, r5, r7\n\t"
  122378. #elif defined(__clang__)
  122379. "adcs r5, r7\n\t"
  122380. #else
  122381. "adc r5, r7\n\t"
  122382. #endif
  122383. #ifdef WOLFSSL_KEIL
  122384. "adcs r6, r6, r7\n\t"
  122385. #elif defined(__clang__)
  122386. "adcs r6, r7\n\t"
  122387. #else
  122388. "adc r6, r7\n\t"
  122389. #endif
  122390. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  122391. "ldr r3, [%[r]]\n\t"
  122392. "ldr r4, [%[r], #4]\n\t"
  122393. "ldr r5, [%[r], #8]\n\t"
  122394. "ldr r6, [%[r], #12]\n\t"
  122395. #ifdef WOLFSSL_KEIL
  122396. "adcs r3, r3, r7\n\t"
  122397. #elif defined(__clang__)
  122398. "adcs r3, r7\n\t"
  122399. #else
  122400. "adc r3, r7\n\t"
  122401. #endif
  122402. #ifdef WOLFSSL_KEIL
  122403. "adcs r4, r4, r7\n\t"
  122404. #elif defined(__clang__)
  122405. "adcs r4, r7\n\t"
  122406. #else
  122407. "adc r4, r7\n\t"
  122408. #endif
  122409. #ifdef WOLFSSL_KEIL
  122410. "adcs r5, r5, r7\n\t"
  122411. #elif defined(__clang__)
  122412. "adcs r5, r7\n\t"
  122413. #else
  122414. "adc r5, r7\n\t"
  122415. #endif
  122416. #ifdef WOLFSSL_KEIL
  122417. "adcs r6, r6, r7\n\t"
  122418. #elif defined(__clang__)
  122419. "adcs r6, r7\n\t"
  122420. #else
  122421. "adc r6, r7\n\t"
  122422. #endif
  122423. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  122424. "ldr r3, [%[r]]\n\t"
  122425. "ldr r4, [%[r], #4]\n\t"
  122426. "ldr r5, [%[r], #8]\n\t"
  122427. "ldr r6, [%[r], #12]\n\t"
  122428. #ifdef WOLFSSL_KEIL
  122429. "adcs r3, r3, r7\n\t"
  122430. #elif defined(__clang__)
  122431. "adcs r3, r7\n\t"
  122432. #else
  122433. "adc r3, r7\n\t"
  122434. #endif
  122435. #ifdef WOLFSSL_KEIL
  122436. "adcs r4, r4, r7\n\t"
  122437. #elif defined(__clang__)
  122438. "adcs r4, r7\n\t"
  122439. #else
  122440. "adc r4, r7\n\t"
  122441. #endif
  122442. #ifdef WOLFSSL_KEIL
  122443. "adcs r5, r5, r7\n\t"
  122444. #elif defined(__clang__)
  122445. "adcs r5, r7\n\t"
  122446. #else
  122447. "adc r5, r7\n\t"
  122448. #endif
  122449. #ifdef WOLFSSL_KEIL
  122450. "adcs r6, r6, r7\n\t"
  122451. #elif defined(__clang__)
  122452. "adcs r6, r7\n\t"
  122453. #else
  122454. "adc r6, r7\n\t"
  122455. #endif
  122456. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  122457. "ldr r3, [%[r]]\n\t"
  122458. "ldr r4, [%[r], #4]\n\t"
  122459. "ldr r5, [%[r], #8]\n\t"
  122460. "ldr r6, [%[r], #12]\n\t"
  122461. #ifdef WOLFSSL_KEIL
  122462. "adcs r3, r3, r7\n\t"
  122463. #elif defined(__clang__)
  122464. "adcs r3, r7\n\t"
  122465. #else
  122466. "adc r3, r7\n\t"
  122467. #endif
  122468. #ifdef WOLFSSL_KEIL
  122469. "adcs r4, r4, r7\n\t"
  122470. #elif defined(__clang__)
  122471. "adcs r4, r7\n\t"
  122472. #else
  122473. "adc r4, r7\n\t"
  122474. #endif
  122475. #ifdef WOLFSSL_KEIL
  122476. "adcs r5, r5, r7\n\t"
  122477. #elif defined(__clang__)
  122478. "adcs r5, r7\n\t"
  122479. #else
  122480. "adc r5, r7\n\t"
  122481. #endif
  122482. #ifdef WOLFSSL_KEIL
  122483. "adcs r6, r6, r7\n\t"
  122484. #elif defined(__clang__)
  122485. "adcs r6, r7\n\t"
  122486. #else
  122487. "adc r6, r7\n\t"
  122488. #endif
  122489. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  122490. "ldr r3, [%[r]]\n\t"
  122491. #ifdef WOLFSSL_KEIL
  122492. "adcs r3, r3, r7\n\t"
  122493. #elif defined(__clang__)
  122494. "adcs r3, r7\n\t"
  122495. #else
  122496. "adc r3, r7\n\t"
  122497. #endif
  122498. "stm %[r]!, {r3}\n\t"
  122499. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122500. "subs %[r], %[r], #0x44\n\t"
  122501. #else
  122502. "sub %[r], %[r], #0x44\n\t"
  122503. #endif
  122504. : [r] "+l" (r), [a] "+l" (a), [m] "+l" (m)
  122505. :
  122506. : "memory", "r3", "r4", "r5", "r6", "r7"
  122507. );
  122508. }
  122509. /* Conditionally add a and b using the mask m.
  122510. * m is -1 to add and 0 when not.
  122511. *
  122512. * r A single precision number representing conditional add result.
  122513. * a A single precision number to add with.
  122514. * b A single precision number to add.
  122515. * m Mask value to apply.
  122516. */
  122517. SP_NOINLINE static sp_digit sp_521_cond_add_17(sp_digit* r, const sp_digit* a,
  122518. const sp_digit* b, sp_digit m)
  122519. {
  122520. __asm__ __volatile__ (
  122521. "movs r4, #0\n\t"
  122522. "movs r5, #0x44\n\t"
  122523. "mov r8, r5\n\t"
  122524. "movs r7, #0\n\t"
  122525. "\n"
  122526. "L_sp_521_cond_add_17_words_%=:\n\t"
  122527. "ldr r6, [%[b], r7]\n\t"
  122528. #ifdef WOLFSSL_KEIL
  122529. "ands r6, r6, %[m]\n\t"
  122530. #elif defined(__clang__)
  122531. "ands r6, %[m]\n\t"
  122532. #else
  122533. "and r6, %[m]\n\t"
  122534. #endif
  122535. "movs r5, #0\n\t"
  122536. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122537. "subs r5, r5, #1\n\t"
  122538. #else
  122539. "sub r5, r5, #1\n\t"
  122540. #endif
  122541. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122542. "adds r5, r5, r4\n\t"
  122543. #else
  122544. "add r5, r5, r4\n\t"
  122545. #endif
  122546. "ldr r5, [%[a], r7]\n\t"
  122547. #ifdef WOLFSSL_KEIL
  122548. "adcs r5, r5, r6\n\t"
  122549. #elif defined(__clang__)
  122550. "adcs r5, r6\n\t"
  122551. #else
  122552. "adc r5, r6\n\t"
  122553. #endif
  122554. "movs r4, #0\n\t"
  122555. #ifdef WOLFSSL_KEIL
  122556. "adcs r4, r4, r4\n\t"
  122557. #elif defined(__clang__)
  122558. "adcs r4, r4\n\t"
  122559. #else
  122560. "adc r4, r4\n\t"
  122561. #endif
  122562. "str r5, [%[r], r7]\n\t"
  122563. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122564. "adds r7, r7, #4\n\t"
  122565. #else
  122566. "add r7, r7, #4\n\t"
  122567. #endif
  122568. "cmp r7, r8\n\t"
  122569. "blt L_sp_521_cond_add_17_words_%=\n\t"
  122570. "movs %[r], r4\n\t"
  122571. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m)
  122572. :
  122573. : "memory", "r4", "r5", "r6", "r7", "r8"
  122574. );
  122575. return (uint32_t)(size_t)r;
  122576. }
  122577. /* Subtract two Montgomery form numbers (r = a - b % m).
  122578. *
  122579. * r Result of subtration.
  122580. * a Number to subtract from in Montgomery form.
  122581. * b Number to subtract with in Montgomery form.
  122582. * m Modulus (prime).
  122583. */
  122584. SP_NOINLINE static void sp_521_mont_sub_17(sp_digit* r, const sp_digit* a,
  122585. const sp_digit* b, const sp_digit* m)
  122586. {
  122587. __asm__ __volatile__ (
  122588. "ldm %[a]!, {r4, r5}\n\t"
  122589. "ldm %[b]!, {r6, r7}\n\t"
  122590. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122591. "subs r4, r4, r6\n\t"
  122592. #else
  122593. "sub r4, r4, r6\n\t"
  122594. #endif
  122595. #ifdef WOLFSSL_KEIL
  122596. "sbcs r5, r5, r7\n\t"
  122597. #elif defined(__clang__)
  122598. "sbcs r5, r7\n\t"
  122599. #else
  122600. "sbc r5, r7\n\t"
  122601. #endif
  122602. "stm %[r]!, {r4, r5}\n\t"
  122603. "ldm %[a]!, {r4, r5}\n\t"
  122604. "ldm %[b]!, {r6, r7}\n\t"
  122605. #ifdef WOLFSSL_KEIL
  122606. "sbcs r4, r4, r6\n\t"
  122607. #elif defined(__clang__)
  122608. "sbcs r4, r6\n\t"
  122609. #else
  122610. "sbc r4, r6\n\t"
  122611. #endif
  122612. #ifdef WOLFSSL_KEIL
  122613. "sbcs r5, r5, r7\n\t"
  122614. #elif defined(__clang__)
  122615. "sbcs r5, r7\n\t"
  122616. #else
  122617. "sbc r5, r7\n\t"
  122618. #endif
  122619. "stm %[r]!, {r4, r5}\n\t"
  122620. "ldm %[a]!, {r4, r5}\n\t"
  122621. "ldm %[b]!, {r6, r7}\n\t"
  122622. #ifdef WOLFSSL_KEIL
  122623. "sbcs r4, r4, r6\n\t"
  122624. #elif defined(__clang__)
  122625. "sbcs r4, r6\n\t"
  122626. #else
  122627. "sbc r4, r6\n\t"
  122628. #endif
  122629. #ifdef WOLFSSL_KEIL
  122630. "sbcs r5, r5, r7\n\t"
  122631. #elif defined(__clang__)
  122632. "sbcs r5, r7\n\t"
  122633. #else
  122634. "sbc r5, r7\n\t"
  122635. #endif
  122636. "stm %[r]!, {r4, r5}\n\t"
  122637. "ldm %[a]!, {r4, r5}\n\t"
  122638. "ldm %[b]!, {r6, r7}\n\t"
  122639. #ifdef WOLFSSL_KEIL
  122640. "sbcs r4, r4, r6\n\t"
  122641. #elif defined(__clang__)
  122642. "sbcs r4, r6\n\t"
  122643. #else
  122644. "sbc r4, r6\n\t"
  122645. #endif
  122646. #ifdef WOLFSSL_KEIL
  122647. "sbcs r5, r5, r7\n\t"
  122648. #elif defined(__clang__)
  122649. "sbcs r5, r7\n\t"
  122650. #else
  122651. "sbc r5, r7\n\t"
  122652. #endif
  122653. "stm %[r]!, {r4, r5}\n\t"
  122654. "ldm %[a]!, {r4, r5}\n\t"
  122655. "ldm %[b]!, {r6, r7}\n\t"
  122656. #ifdef WOLFSSL_KEIL
  122657. "sbcs r4, r4, r6\n\t"
  122658. #elif defined(__clang__)
  122659. "sbcs r4, r6\n\t"
  122660. #else
  122661. "sbc r4, r6\n\t"
  122662. #endif
  122663. #ifdef WOLFSSL_KEIL
  122664. "sbcs r5, r5, r7\n\t"
  122665. #elif defined(__clang__)
  122666. "sbcs r5, r7\n\t"
  122667. #else
  122668. "sbc r5, r7\n\t"
  122669. #endif
  122670. "stm %[r]!, {r4, r5}\n\t"
  122671. "ldm %[a]!, {r4, r5}\n\t"
  122672. "ldm %[b]!, {r6, r7}\n\t"
  122673. #ifdef WOLFSSL_KEIL
  122674. "sbcs r4, r4, r6\n\t"
  122675. #elif defined(__clang__)
  122676. "sbcs r4, r6\n\t"
  122677. #else
  122678. "sbc r4, r6\n\t"
  122679. #endif
  122680. #ifdef WOLFSSL_KEIL
  122681. "sbcs r5, r5, r7\n\t"
  122682. #elif defined(__clang__)
  122683. "sbcs r5, r7\n\t"
  122684. #else
  122685. "sbc r5, r7\n\t"
  122686. #endif
  122687. "stm %[r]!, {r4, r5}\n\t"
  122688. "ldm %[a]!, {r4, r5}\n\t"
  122689. "ldm %[b]!, {r6, r7}\n\t"
  122690. #ifdef WOLFSSL_KEIL
  122691. "sbcs r4, r4, r6\n\t"
  122692. #elif defined(__clang__)
  122693. "sbcs r4, r6\n\t"
  122694. #else
  122695. "sbc r4, r6\n\t"
  122696. #endif
  122697. #ifdef WOLFSSL_KEIL
  122698. "sbcs r5, r5, r7\n\t"
  122699. #elif defined(__clang__)
  122700. "sbcs r5, r7\n\t"
  122701. #else
  122702. "sbc r5, r7\n\t"
  122703. #endif
  122704. "stm %[r]!, {r4, r5}\n\t"
  122705. "ldm %[a]!, {r4, r5}\n\t"
  122706. "ldm %[b]!, {r6, r7}\n\t"
  122707. #ifdef WOLFSSL_KEIL
  122708. "sbcs r4, r4, r6\n\t"
  122709. #elif defined(__clang__)
  122710. "sbcs r4, r6\n\t"
  122711. #else
  122712. "sbc r4, r6\n\t"
  122713. #endif
  122714. #ifdef WOLFSSL_KEIL
  122715. "sbcs r5, r5, r7\n\t"
  122716. #elif defined(__clang__)
  122717. "sbcs r5, r7\n\t"
  122718. #else
  122719. "sbc r5, r7\n\t"
  122720. #endif
  122721. "stm %[r]!, {r4, r5}\n\t"
  122722. "ldm %[a]!, {r4}\n\t"
  122723. "ldm %[b]!, {r6}\n\t"
  122724. #ifdef WOLFSSL_KEIL
  122725. "sbcs r4, r4, r6\n\t"
  122726. #elif defined(__clang__)
  122727. "sbcs r4, r6\n\t"
  122728. #else
  122729. "sbc r4, r6\n\t"
  122730. #endif
  122731. "movs r7, #1\n\t"
  122732. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122733. "lsls r7, r7, #8\n\t"
  122734. #else
  122735. "lsl r7, r7, #8\n\t"
  122736. #endif
  122737. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122738. "adds r7, r7, #0xff\n\t"
  122739. #else
  122740. "add r7, r7, #0xff\n\t"
  122741. #endif
  122742. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122743. "asrs %[m], r4, #9\n\t"
  122744. #else
  122745. "asr %[m], r4, #9\n\t"
  122746. #endif
  122747. #ifdef WOLFSSL_KEIL
  122748. "ands r4, r4, r7\n\t"
  122749. #elif defined(__clang__)
  122750. "ands r4, r7\n\t"
  122751. #else
  122752. "and r4, r7\n\t"
  122753. #endif
  122754. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122755. "negs %[m], %[m]\n\t"
  122756. #else
  122757. "neg %[m], %[m]\n\t"
  122758. #endif
  122759. "stm %[r]!, {r4}\n\t"
  122760. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122761. "subs %[r], %[r], #0x44\n\t"
  122762. #else
  122763. "sub %[r], %[r], #0x44\n\t"
  122764. #endif
  122765. "movs r7, #0\n\t"
  122766. "ldr r4, [%[r]]\n\t"
  122767. "ldr r5, [%[r], #4]\n\t"
  122768. "ldr r6, [%[r], #8]\n\t"
  122769. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122770. "subs r4, r4, %[m]\n\t"
  122771. #else
  122772. "sub r4, r4, %[m]\n\t"
  122773. #endif
  122774. #ifdef WOLFSSL_KEIL
  122775. "sbcs r5, r5, r7\n\t"
  122776. #elif defined(__clang__)
  122777. "sbcs r5, r7\n\t"
  122778. #else
  122779. "sbc r5, r7\n\t"
  122780. #endif
  122781. #ifdef WOLFSSL_KEIL
  122782. "sbcs r6, r6, r7\n\t"
  122783. #elif defined(__clang__)
  122784. "sbcs r6, r7\n\t"
  122785. #else
  122786. "sbc r6, r7\n\t"
  122787. #endif
  122788. "stm %[r]!, {r4, r5, r6}\n\t"
  122789. "ldr r4, [%[r]]\n\t"
  122790. "ldr r5, [%[r], #4]\n\t"
  122791. "ldr r6, [%[r], #8]\n\t"
  122792. #ifdef WOLFSSL_KEIL
  122793. "sbcs r4, r4, r7\n\t"
  122794. #elif defined(__clang__)
  122795. "sbcs r4, r7\n\t"
  122796. #else
  122797. "sbc r4, r7\n\t"
  122798. #endif
  122799. #ifdef WOLFSSL_KEIL
  122800. "sbcs r5, r5, r7\n\t"
  122801. #elif defined(__clang__)
  122802. "sbcs r5, r7\n\t"
  122803. #else
  122804. "sbc r5, r7\n\t"
  122805. #endif
  122806. #ifdef WOLFSSL_KEIL
  122807. "sbcs r6, r6, r7\n\t"
  122808. #elif defined(__clang__)
  122809. "sbcs r6, r7\n\t"
  122810. #else
  122811. "sbc r6, r7\n\t"
  122812. #endif
  122813. "stm %[r]!, {r4, r5, r6}\n\t"
  122814. "ldr r4, [%[r]]\n\t"
  122815. "ldr r5, [%[r], #4]\n\t"
  122816. "ldr r6, [%[r], #8]\n\t"
  122817. #ifdef WOLFSSL_KEIL
  122818. "sbcs r4, r4, r7\n\t"
  122819. #elif defined(__clang__)
  122820. "sbcs r4, r7\n\t"
  122821. #else
  122822. "sbc r4, r7\n\t"
  122823. #endif
  122824. #ifdef WOLFSSL_KEIL
  122825. "sbcs r5, r5, r7\n\t"
  122826. #elif defined(__clang__)
  122827. "sbcs r5, r7\n\t"
  122828. #else
  122829. "sbc r5, r7\n\t"
  122830. #endif
  122831. #ifdef WOLFSSL_KEIL
  122832. "sbcs r6, r6, r7\n\t"
  122833. #elif defined(__clang__)
  122834. "sbcs r6, r7\n\t"
  122835. #else
  122836. "sbc r6, r7\n\t"
  122837. #endif
  122838. "stm %[r]!, {r4, r5, r6}\n\t"
  122839. "ldr r4, [%[r]]\n\t"
  122840. "ldr r5, [%[r], #4]\n\t"
  122841. "ldr r6, [%[r], #8]\n\t"
  122842. #ifdef WOLFSSL_KEIL
  122843. "sbcs r4, r4, r7\n\t"
  122844. #elif defined(__clang__)
  122845. "sbcs r4, r7\n\t"
  122846. #else
  122847. "sbc r4, r7\n\t"
  122848. #endif
  122849. #ifdef WOLFSSL_KEIL
  122850. "sbcs r5, r5, r7\n\t"
  122851. #elif defined(__clang__)
  122852. "sbcs r5, r7\n\t"
  122853. #else
  122854. "sbc r5, r7\n\t"
  122855. #endif
  122856. #ifdef WOLFSSL_KEIL
  122857. "sbcs r6, r6, r7\n\t"
  122858. #elif defined(__clang__)
  122859. "sbcs r6, r7\n\t"
  122860. #else
  122861. "sbc r6, r7\n\t"
  122862. #endif
  122863. "stm %[r]!, {r4, r5, r6}\n\t"
  122864. "ldr r4, [%[r]]\n\t"
  122865. "ldr r5, [%[r], #4]\n\t"
  122866. "ldr r6, [%[r], #8]\n\t"
  122867. #ifdef WOLFSSL_KEIL
  122868. "sbcs r4, r4, r7\n\t"
  122869. #elif defined(__clang__)
  122870. "sbcs r4, r7\n\t"
  122871. #else
  122872. "sbc r4, r7\n\t"
  122873. #endif
  122874. #ifdef WOLFSSL_KEIL
  122875. "sbcs r5, r5, r7\n\t"
  122876. #elif defined(__clang__)
  122877. "sbcs r5, r7\n\t"
  122878. #else
  122879. "sbc r5, r7\n\t"
  122880. #endif
  122881. #ifdef WOLFSSL_KEIL
  122882. "sbcs r6, r6, r7\n\t"
  122883. #elif defined(__clang__)
  122884. "sbcs r6, r7\n\t"
  122885. #else
  122886. "sbc r6, r7\n\t"
  122887. #endif
  122888. "stm %[r]!, {r4, r5, r6}\n\t"
  122889. "ldr r4, [%[r]]\n\t"
  122890. "ldr r5, [%[r], #4]\n\t"
  122891. #ifdef WOLFSSL_KEIL
  122892. "sbcs r4, r4, r7\n\t"
  122893. #elif defined(__clang__)
  122894. "sbcs r4, r7\n\t"
  122895. #else
  122896. "sbc r4, r7\n\t"
  122897. #endif
  122898. #ifdef WOLFSSL_KEIL
  122899. "sbcs r5, r5, r7\n\t"
  122900. #elif defined(__clang__)
  122901. "sbcs r5, r7\n\t"
  122902. #else
  122903. "sbc r5, r7\n\t"
  122904. #endif
  122905. "stm %[r]!, {r4, r5}\n\t"
  122906. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122907. "subs %[r], %[r], #0x44\n\t"
  122908. #else
  122909. "sub %[r], %[r], #0x44\n\t"
  122910. #endif
  122911. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m)
  122912. :
  122913. : "memory", "r4", "r5", "r6", "r7"
  122914. );
  122915. }
  122916. #define sp_521_mont_sub_lower_17 sp_521_mont_sub_17
  122917. /* Right shift a by 1 bit into r. (r = a >> 1)
  122918. *
  122919. * r A single precision integer.
  122920. * a A single precision integer.
  122921. */
  122922. static void sp_521_rshift1_17(sp_digit* r, const sp_digit* a)
  122923. {
  122924. __asm__ __volatile__ (
  122925. "ldr r2, [%[a]]\n\t"
  122926. "ldr r3, [%[a], #4]\n\t"
  122927. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122928. "lsrs r2, r2, #1\n\t"
  122929. #else
  122930. "lsr r2, r2, #1\n\t"
  122931. #endif
  122932. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122933. "lsls r5, r3, #31\n\t"
  122934. #else
  122935. "lsl r5, r3, #31\n\t"
  122936. #endif
  122937. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122938. "lsrs r3, r3, #1\n\t"
  122939. #else
  122940. "lsr r3, r3, #1\n\t"
  122941. #endif
  122942. #ifdef WOLFSSL_KEIL
  122943. "orrs r2, r2, r5\n\t"
  122944. #elif defined(__clang__)
  122945. "orrs r2, r5\n\t"
  122946. #else
  122947. "orr r2, r5\n\t"
  122948. #endif
  122949. "ldr r4, [%[a], #8]\n\t"
  122950. "str r2, [%[r]]\n\t"
  122951. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122952. "lsls r5, r4, #31\n\t"
  122953. #else
  122954. "lsl r5, r4, #31\n\t"
  122955. #endif
  122956. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122957. "lsrs r4, r4, #1\n\t"
  122958. #else
  122959. "lsr r4, r4, #1\n\t"
  122960. #endif
  122961. #ifdef WOLFSSL_KEIL
  122962. "orrs r3, r3, r5\n\t"
  122963. #elif defined(__clang__)
  122964. "orrs r3, r5\n\t"
  122965. #else
  122966. "orr r3, r5\n\t"
  122967. #endif
  122968. "ldr r2, [%[a], #12]\n\t"
  122969. "str r3, [%[r], #4]\n\t"
  122970. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122971. "lsls r5, r2, #31\n\t"
  122972. #else
  122973. "lsl r5, r2, #31\n\t"
  122974. #endif
  122975. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122976. "lsrs r2, r2, #1\n\t"
  122977. #else
  122978. "lsr r2, r2, #1\n\t"
  122979. #endif
  122980. #ifdef WOLFSSL_KEIL
  122981. "orrs r4, r4, r5\n\t"
  122982. #elif defined(__clang__)
  122983. "orrs r4, r5\n\t"
  122984. #else
  122985. "orr r4, r5\n\t"
  122986. #endif
  122987. "ldr r3, [%[a], #16]\n\t"
  122988. "str r4, [%[r], #8]\n\t"
  122989. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122990. "lsls r5, r3, #31\n\t"
  122991. #else
  122992. "lsl r5, r3, #31\n\t"
  122993. #endif
  122994. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122995. "lsrs r3, r3, #1\n\t"
  122996. #else
  122997. "lsr r3, r3, #1\n\t"
  122998. #endif
  122999. #ifdef WOLFSSL_KEIL
  123000. "orrs r2, r2, r5\n\t"
  123001. #elif defined(__clang__)
  123002. "orrs r2, r5\n\t"
  123003. #else
  123004. "orr r2, r5\n\t"
  123005. #endif
  123006. "ldr r4, [%[a], #20]\n\t"
  123007. "str r2, [%[r], #12]\n\t"
  123008. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123009. "lsls r5, r4, #31\n\t"
  123010. #else
  123011. "lsl r5, r4, #31\n\t"
  123012. #endif
  123013. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123014. "lsrs r4, r4, #1\n\t"
  123015. #else
  123016. "lsr r4, r4, #1\n\t"
  123017. #endif
  123018. #ifdef WOLFSSL_KEIL
  123019. "orrs r3, r3, r5\n\t"
  123020. #elif defined(__clang__)
  123021. "orrs r3, r5\n\t"
  123022. #else
  123023. "orr r3, r5\n\t"
  123024. #endif
  123025. "ldr r2, [%[a], #24]\n\t"
  123026. "str r3, [%[r], #16]\n\t"
  123027. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123028. "lsls r5, r2, #31\n\t"
  123029. #else
  123030. "lsl r5, r2, #31\n\t"
  123031. #endif
  123032. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123033. "lsrs r2, r2, #1\n\t"
  123034. #else
  123035. "lsr r2, r2, #1\n\t"
  123036. #endif
  123037. #ifdef WOLFSSL_KEIL
  123038. "orrs r4, r4, r5\n\t"
  123039. #elif defined(__clang__)
  123040. "orrs r4, r5\n\t"
  123041. #else
  123042. "orr r4, r5\n\t"
  123043. #endif
  123044. "ldr r3, [%[a], #28]\n\t"
  123045. "str r4, [%[r], #20]\n\t"
  123046. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123047. "lsls r5, r3, #31\n\t"
  123048. #else
  123049. "lsl r5, r3, #31\n\t"
  123050. #endif
  123051. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123052. "lsrs r3, r3, #1\n\t"
  123053. #else
  123054. "lsr r3, r3, #1\n\t"
  123055. #endif
  123056. #ifdef WOLFSSL_KEIL
  123057. "orrs r2, r2, r5\n\t"
  123058. #elif defined(__clang__)
  123059. "orrs r2, r5\n\t"
  123060. #else
  123061. "orr r2, r5\n\t"
  123062. #endif
  123063. "ldr r4, [%[a], #32]\n\t"
  123064. "str r2, [%[r], #24]\n\t"
  123065. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123066. "lsls r5, r4, #31\n\t"
  123067. #else
  123068. "lsl r5, r4, #31\n\t"
  123069. #endif
  123070. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123071. "lsrs r4, r4, #1\n\t"
  123072. #else
  123073. "lsr r4, r4, #1\n\t"
  123074. #endif
  123075. #ifdef WOLFSSL_KEIL
  123076. "orrs r3, r3, r5\n\t"
  123077. #elif defined(__clang__)
  123078. "orrs r3, r5\n\t"
  123079. #else
  123080. "orr r3, r5\n\t"
  123081. #endif
  123082. "ldr r2, [%[a], #36]\n\t"
  123083. "str r3, [%[r], #28]\n\t"
  123084. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123085. "lsls r5, r2, #31\n\t"
  123086. #else
  123087. "lsl r5, r2, #31\n\t"
  123088. #endif
  123089. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123090. "lsrs r2, r2, #1\n\t"
  123091. #else
  123092. "lsr r2, r2, #1\n\t"
  123093. #endif
  123094. #ifdef WOLFSSL_KEIL
  123095. "orrs r4, r4, r5\n\t"
  123096. #elif defined(__clang__)
  123097. "orrs r4, r5\n\t"
  123098. #else
  123099. "orr r4, r5\n\t"
  123100. #endif
  123101. "ldr r3, [%[a], #40]\n\t"
  123102. "str r4, [%[r], #32]\n\t"
  123103. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123104. "lsls r5, r3, #31\n\t"
  123105. #else
  123106. "lsl r5, r3, #31\n\t"
  123107. #endif
  123108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123109. "lsrs r3, r3, #1\n\t"
  123110. #else
  123111. "lsr r3, r3, #1\n\t"
  123112. #endif
  123113. #ifdef WOLFSSL_KEIL
  123114. "orrs r2, r2, r5\n\t"
  123115. #elif defined(__clang__)
  123116. "orrs r2, r5\n\t"
  123117. #else
  123118. "orr r2, r5\n\t"
  123119. #endif
  123120. "ldr r4, [%[a], #44]\n\t"
  123121. "str r2, [%[r], #36]\n\t"
  123122. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123123. "lsls r5, r4, #31\n\t"
  123124. #else
  123125. "lsl r5, r4, #31\n\t"
  123126. #endif
  123127. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123128. "lsrs r4, r4, #1\n\t"
  123129. #else
  123130. "lsr r4, r4, #1\n\t"
  123131. #endif
  123132. #ifdef WOLFSSL_KEIL
  123133. "orrs r3, r3, r5\n\t"
  123134. #elif defined(__clang__)
  123135. "orrs r3, r5\n\t"
  123136. #else
  123137. "orr r3, r5\n\t"
  123138. #endif
  123139. "ldr r2, [%[a], #48]\n\t"
  123140. "str r3, [%[r], #40]\n\t"
  123141. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123142. "lsls r5, r2, #31\n\t"
  123143. #else
  123144. "lsl r5, r2, #31\n\t"
  123145. #endif
  123146. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123147. "lsrs r2, r2, #1\n\t"
  123148. #else
  123149. "lsr r2, r2, #1\n\t"
  123150. #endif
  123151. #ifdef WOLFSSL_KEIL
  123152. "orrs r4, r4, r5\n\t"
  123153. #elif defined(__clang__)
  123154. "orrs r4, r5\n\t"
  123155. #else
  123156. "orr r4, r5\n\t"
  123157. #endif
  123158. "ldr r3, [%[a], #52]\n\t"
  123159. "str r4, [%[r], #44]\n\t"
  123160. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123161. "lsls r5, r3, #31\n\t"
  123162. #else
  123163. "lsl r5, r3, #31\n\t"
  123164. #endif
  123165. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123166. "lsrs r3, r3, #1\n\t"
  123167. #else
  123168. "lsr r3, r3, #1\n\t"
  123169. #endif
  123170. #ifdef WOLFSSL_KEIL
  123171. "orrs r2, r2, r5\n\t"
  123172. #elif defined(__clang__)
  123173. "orrs r2, r5\n\t"
  123174. #else
  123175. "orr r2, r5\n\t"
  123176. #endif
  123177. "ldr r4, [%[a], #56]\n\t"
  123178. "str r2, [%[r], #48]\n\t"
  123179. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123180. "lsls r5, r4, #31\n\t"
  123181. #else
  123182. "lsl r5, r4, #31\n\t"
  123183. #endif
  123184. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123185. "lsrs r4, r4, #1\n\t"
  123186. #else
  123187. "lsr r4, r4, #1\n\t"
  123188. #endif
  123189. #ifdef WOLFSSL_KEIL
  123190. "orrs r3, r3, r5\n\t"
  123191. #elif defined(__clang__)
  123192. "orrs r3, r5\n\t"
  123193. #else
  123194. "orr r3, r5\n\t"
  123195. #endif
  123196. "ldr r2, [%[a], #60]\n\t"
  123197. "str r3, [%[r], #52]\n\t"
  123198. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123199. "lsls r5, r2, #31\n\t"
  123200. #else
  123201. "lsl r5, r2, #31\n\t"
  123202. #endif
  123203. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123204. "lsrs r2, r2, #1\n\t"
  123205. #else
  123206. "lsr r2, r2, #1\n\t"
  123207. #endif
  123208. #ifdef WOLFSSL_KEIL
  123209. "orrs r4, r4, r5\n\t"
  123210. #elif defined(__clang__)
  123211. "orrs r4, r5\n\t"
  123212. #else
  123213. "orr r4, r5\n\t"
  123214. #endif
  123215. "ldr r3, [%[a], #64]\n\t"
  123216. "str r4, [%[r], #56]\n\t"
  123217. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123218. "lsls r5, r3, #31\n\t"
  123219. #else
  123220. "lsl r5, r3, #31\n\t"
  123221. #endif
  123222. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123223. "lsrs r3, r3, #1\n\t"
  123224. #else
  123225. "lsr r3, r3, #1\n\t"
  123226. #endif
  123227. #ifdef WOLFSSL_KEIL
  123228. "orrs r2, r2, r5\n\t"
  123229. #elif defined(__clang__)
  123230. "orrs r2, r5\n\t"
  123231. #else
  123232. "orr r2, r5\n\t"
  123233. #endif
  123234. "str r2, [%[r], #60]\n\t"
  123235. "str r3, [%[r], #64]\n\t"
  123236. : [r] "+l" (r), [a] "+l" (a)
  123237. :
  123238. : "memory", "r2", "r3", "r4", "r5"
  123239. );
  123240. }
  123241. /* Divide the number by 2 mod the modulus (prime). (r = a / 2 % m)
  123242. *
  123243. * r Result of division by 2.
  123244. * a Number to divide.
  123245. * m Modulus (prime).
  123246. */
  123247. SP_NOINLINE static void sp_521_div2_17(sp_digit* r, const sp_digit* a,
  123248. const sp_digit* m)
  123249. {
  123250. sp_digit o;
  123251. o = sp_521_cond_add_17(r, a, m, 0 - (a[0] & 1));
  123252. sp_521_rshift1_17(r, r);
  123253. r[16] |= o << 31;
  123254. }
  123255. /* Double the Montgomery form projective point p.
  123256. *
  123257. * r Result of doubling point.
  123258. * p Point to double.
  123259. * t Temporary ordinate data.
  123260. */
  123261. #ifdef WOLFSSL_SP_NONBLOCK
  123262. typedef struct sp_521_proj_point_dbl_17_ctx {
  123263. int state;
  123264. sp_digit* t1;
  123265. sp_digit* t2;
  123266. sp_digit* x;
  123267. sp_digit* y;
  123268. sp_digit* z;
  123269. } sp_521_proj_point_dbl_17_ctx;
  123270. static int sp_521_proj_point_dbl_17_nb(sp_ecc_ctx_t* sp_ctx, sp_point_521* r, const sp_point_521* p, sp_digit* t)
  123271. {
  123272. int err = FP_WOULDBLOCK;
  123273. sp_521_proj_point_dbl_17_ctx* ctx = (sp_521_proj_point_dbl_17_ctx*)sp_ctx->data;
  123274. typedef char ctx_size_test[sizeof(sp_521_proj_point_dbl_17_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  123275. (void)sizeof(ctx_size_test);
  123276. switch (ctx->state) {
  123277. case 0:
  123278. ctx->t1 = t;
  123279. ctx->t2 = t + 2*17;
  123280. ctx->x = r->x;
  123281. ctx->y = r->y;
  123282. ctx->z = r->z;
  123283. /* Put infinity into result. */
  123284. if (r != p) {
  123285. r->infinity = p->infinity;
  123286. }
  123287. ctx->state = 1;
  123288. break;
  123289. case 1:
  123290. /* T1 = Z * Z */
  123291. sp_521_mont_sqr_17(ctx->t1, p->z, p521_mod, p521_mp_mod);
  123292. ctx->state = 2;
  123293. break;
  123294. case 2:
  123295. /* Z = Y * Z */
  123296. sp_521_mont_mul_17(ctx->z, p->y, p->z, p521_mod, p521_mp_mod);
  123297. ctx->state = 3;
  123298. break;
  123299. case 3:
  123300. /* Z = 2Z */
  123301. sp_521_mont_dbl_17(ctx->z, ctx->z, p521_mod);
  123302. ctx->state = 4;
  123303. break;
  123304. case 4:
  123305. /* T2 = X - T1 */
  123306. sp_521_mont_sub_17(ctx->t2, p->x, ctx->t1, p521_mod);
  123307. ctx->state = 5;
  123308. break;
  123309. case 5:
  123310. /* T1 = X + T1 */
  123311. sp_521_mont_add_17(ctx->t1, p->x, ctx->t1, p521_mod);
  123312. ctx->state = 6;
  123313. break;
  123314. case 6:
  123315. /* T2 = T1 * T2 */
  123316. sp_521_mont_mul_17(ctx->t2, ctx->t1, ctx->t2, p521_mod, p521_mp_mod);
  123317. ctx->state = 7;
  123318. break;
  123319. case 7:
  123320. /* T1 = 3T2 */
  123321. sp_521_mont_tpl_17(ctx->t1, ctx->t2, p521_mod);
  123322. ctx->state = 8;
  123323. break;
  123324. case 8:
  123325. /* Y = 2Y */
  123326. sp_521_mont_dbl_17(ctx->y, p->y, p521_mod);
  123327. ctx->state = 9;
  123328. break;
  123329. case 9:
  123330. /* Y = Y * Y */
  123331. sp_521_mont_sqr_17(ctx->y, ctx->y, p521_mod, p521_mp_mod);
  123332. ctx->state = 10;
  123333. break;
  123334. case 10:
  123335. /* T2 = Y * Y */
  123336. sp_521_mont_sqr_17(ctx->t2, ctx->y, p521_mod, p521_mp_mod);
  123337. ctx->state = 11;
  123338. break;
  123339. case 11:
  123340. /* T2 = T2/2 */
  123341. sp_521_div2_17(ctx->t2, ctx->t2, p521_mod);
  123342. ctx->state = 12;
  123343. break;
  123344. case 12:
  123345. /* Y = Y * X */
  123346. sp_521_mont_mul_17(ctx->y, ctx->y, p->x, p521_mod, p521_mp_mod);
  123347. ctx->state = 13;
  123348. break;
  123349. case 13:
  123350. /* X = T1 * T1 */
  123351. sp_521_mont_sqr_17(ctx->x, ctx->t1, p521_mod, p521_mp_mod);
  123352. ctx->state = 14;
  123353. break;
  123354. case 14:
  123355. /* X = X - Y */
  123356. sp_521_mont_sub_17(ctx->x, ctx->x, ctx->y, p521_mod);
  123357. ctx->state = 15;
  123358. break;
  123359. case 15:
  123360. /* X = X - Y */
  123361. sp_521_mont_sub_17(ctx->x, ctx->x, ctx->y, p521_mod);
  123362. ctx->state = 16;
  123363. break;
  123364. case 16:
  123365. /* Y = Y - X */
  123366. sp_521_mont_sub_lower_17(ctx->y, ctx->y, ctx->x, p521_mod);
  123367. ctx->state = 17;
  123368. break;
  123369. case 17:
  123370. /* Y = Y * T1 */
  123371. sp_521_mont_mul_17(ctx->y, ctx->y, ctx->t1, p521_mod, p521_mp_mod);
  123372. ctx->state = 18;
  123373. break;
  123374. case 18:
  123375. /* Y = Y - T2 */
  123376. sp_521_mont_sub_17(ctx->y, ctx->y, ctx->t2, p521_mod);
  123377. ctx->state = 19;
  123378. /* fall-through */
  123379. case 19:
  123380. err = MP_OKAY;
  123381. break;
  123382. }
  123383. if (err == MP_OKAY && ctx->state != 19) {
  123384. err = FP_WOULDBLOCK;
  123385. }
  123386. return err;
  123387. }
  123388. #endif /* WOLFSSL_SP_NONBLOCK */
  123389. static void sp_521_proj_point_dbl_17(sp_point_521* r, const sp_point_521* p,
  123390. sp_digit* t)
  123391. {
  123392. sp_digit* t1 = t;
  123393. sp_digit* t2 = t + 2*17;
  123394. sp_digit* x;
  123395. sp_digit* y;
  123396. sp_digit* z;
  123397. x = r->x;
  123398. y = r->y;
  123399. z = r->z;
  123400. /* Put infinity into result. */
  123401. if (r != p) {
  123402. r->infinity = p->infinity;
  123403. }
  123404. /* T1 = Z * Z */
  123405. sp_521_mont_sqr_17(t1, p->z, p521_mod, p521_mp_mod);
  123406. /* Z = Y * Z */
  123407. sp_521_mont_mul_17(z, p->y, p->z, p521_mod, p521_mp_mod);
  123408. /* Z = 2Z */
  123409. sp_521_mont_dbl_17(z, z, p521_mod);
  123410. /* T2 = X - T1 */
  123411. sp_521_mont_sub_17(t2, p->x, t1, p521_mod);
  123412. /* T1 = X + T1 */
  123413. sp_521_mont_add_17(t1, p->x, t1, p521_mod);
  123414. /* T2 = T1 * T2 */
  123415. sp_521_mont_mul_17(t2, t1, t2, p521_mod, p521_mp_mod);
  123416. /* T1 = 3T2 */
  123417. sp_521_mont_tpl_17(t1, t2, p521_mod);
  123418. /* Y = 2Y */
  123419. sp_521_mont_dbl_17(y, p->y, p521_mod);
  123420. /* Y = Y * Y */
  123421. sp_521_mont_sqr_17(y, y, p521_mod, p521_mp_mod);
  123422. /* T2 = Y * Y */
  123423. sp_521_mont_sqr_17(t2, y, p521_mod, p521_mp_mod);
  123424. /* T2 = T2/2 */
  123425. sp_521_div2_17(t2, t2, p521_mod);
  123426. /* Y = Y * X */
  123427. sp_521_mont_mul_17(y, y, p->x, p521_mod, p521_mp_mod);
  123428. /* X = T1 * T1 */
  123429. sp_521_mont_sqr_17(x, t1, p521_mod, p521_mp_mod);
  123430. /* X = X - Y */
  123431. sp_521_mont_sub_17(x, x, y, p521_mod);
  123432. /* X = X - Y */
  123433. sp_521_mont_sub_17(x, x, y, p521_mod);
  123434. /* Y = Y - X */
  123435. sp_521_mont_sub_lower_17(y, y, x, p521_mod);
  123436. /* Y = Y * T1 */
  123437. sp_521_mont_mul_17(y, y, t1, p521_mod, p521_mp_mod);
  123438. /* Y = Y - T2 */
  123439. sp_521_mont_sub_17(y, y, t2, p521_mod);
  123440. }
  123441. /* Compare two numbers to determine if they are equal.
  123442. * Constant time implementation.
  123443. *
  123444. * a First number to compare.
  123445. * b Second number to compare.
  123446. * returns 1 when equal and 0 otherwise.
  123447. */
  123448. static int sp_521_cmp_equal_17(const sp_digit* a, const sp_digit* b)
  123449. {
  123450. return ((a[0] ^ b[0]) | (a[1] ^ b[1]) | (a[2] ^ b[2]) |
  123451. (a[3] ^ b[3]) | (a[4] ^ b[4]) | (a[5] ^ b[5]) |
  123452. (a[6] ^ b[6]) | (a[7] ^ b[7]) | (a[8] ^ b[8]) |
  123453. (a[9] ^ b[9]) | (a[10] ^ b[10]) | (a[11] ^ b[11]) |
  123454. (a[12] ^ b[12]) | (a[13] ^ b[13]) | (a[14] ^ b[14]) |
  123455. (a[15] ^ b[15]) | (a[16] ^ b[16])) == 0;
  123456. }
  123457. /* Returns 1 if the number of zero.
  123458. * Implementation is constant time.
  123459. *
  123460. * a Number to check.
  123461. * returns 1 if the number is zero and 0 otherwise.
  123462. */
  123463. static int sp_521_iszero_17(const sp_digit* a)
  123464. {
  123465. return (a[0] | a[1] | a[2] | a[3] | a[4] | a[5] | a[6] | a[7] |
  123466. a[8] | a[9] | a[10] | a[11] | a[12] | a[13] | a[14] | a[15] |
  123467. a[16]) == 0;
  123468. }
  123469. /* Add two Montgomery form projective points.
  123470. *
  123471. * r Result of addition.
  123472. * p First point to add.
  123473. * q Second point to add.
  123474. * t Temporary ordinate data.
  123475. */
  123476. #ifdef WOLFSSL_SP_NONBLOCK
  123477. typedef struct sp_521_proj_point_add_17_ctx {
  123478. int state;
  123479. sp_521_proj_point_dbl_17_ctx dbl_ctx;
  123480. const sp_point_521* ap[2];
  123481. sp_point_521* rp[2];
  123482. sp_digit* t1;
  123483. sp_digit* t2;
  123484. sp_digit* t3;
  123485. sp_digit* t4;
  123486. sp_digit* t5;
  123487. sp_digit* t6;
  123488. sp_digit* x;
  123489. sp_digit* y;
  123490. sp_digit* z;
  123491. } sp_521_proj_point_add_17_ctx;
  123492. static int sp_521_proj_point_add_17_nb(sp_ecc_ctx_t* sp_ctx, sp_point_521* r,
  123493. const sp_point_521* p, const sp_point_521* q, sp_digit* t)
  123494. {
  123495. int err = FP_WOULDBLOCK;
  123496. sp_521_proj_point_add_17_ctx* ctx = (sp_521_proj_point_add_17_ctx*)sp_ctx->data;
  123497. /* Ensure only the first point is the same as the result. */
  123498. if (q == r) {
  123499. const sp_point_521* a = p;
  123500. p = q;
  123501. q = a;
  123502. }
  123503. typedef char ctx_size_test[sizeof(sp_521_proj_point_add_17_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  123504. (void)sizeof(ctx_size_test);
  123505. switch (ctx->state) {
  123506. case 0: /* INIT */
  123507. ctx->t1 = t;
  123508. ctx->t2 = t + 2*17;
  123509. ctx->t3 = t + 4*17;
  123510. ctx->t4 = t + 6*17;
  123511. ctx->t5 = t + 8*17;
  123512. ctx->t6 = t + 10*17;
  123513. ctx->x = ctx->t6;
  123514. ctx->y = ctx->t1;
  123515. ctx->z = ctx->t2;
  123516. ctx->state = 1;
  123517. break;
  123518. case 1:
  123519. /* Check double */
  123520. (void)sp_521_sub_17(ctx->t1, p521_mod, q->y);
  123521. sp_521_norm_17(ctx->t1);
  123522. if ((~p->infinity & ~q->infinity &
  123523. sp_521_cmp_equal_17(p->x, q->x) & sp_521_cmp_equal_17(p->z, q->z) &
  123524. (sp_521_cmp_equal_17(p->y, q->y) | sp_521_cmp_equal_17(p->y, ctx->t1))) != 0)
  123525. {
  123526. XMEMSET(&ctx->dbl_ctx, 0, sizeof(ctx->dbl_ctx));
  123527. ctx->state = 2;
  123528. }
  123529. else {
  123530. ctx->state = 3;
  123531. }
  123532. break;
  123533. case 2:
  123534. err = sp_521_proj_point_dbl_17_nb((sp_ecc_ctx_t*)&ctx->dbl_ctx, r, p, t);
  123535. if (err == MP_OKAY)
  123536. ctx->state = 27; /* done */
  123537. break;
  123538. case 3:
  123539. {
  123540. ctx->state = 4;
  123541. break;
  123542. }
  123543. case 4:
  123544. /* U1 = X1*Z2^2 */
  123545. sp_521_mont_sqr_17(ctx->t1, q->z, p521_mod, p521_mp_mod);
  123546. ctx->state = 5;
  123547. break;
  123548. case 5:
  123549. sp_521_mont_mul_17(ctx->t3, ctx->t1, q->z, p521_mod, p521_mp_mod);
  123550. ctx->state = 6;
  123551. break;
  123552. case 6:
  123553. sp_521_mont_mul_17(ctx->t1, ctx->t1, p->x, p521_mod, p521_mp_mod);
  123554. ctx->state = 7;
  123555. break;
  123556. case 7:
  123557. /* U2 = X2*Z1^2 */
  123558. sp_521_mont_sqr_17(ctx->t2, p->z, p521_mod, p521_mp_mod);
  123559. ctx->state = 8;
  123560. break;
  123561. case 8:
  123562. sp_521_mont_mul_17(ctx->t4, ctx->t2, p->z, p521_mod, p521_mp_mod);
  123563. ctx->state = 9;
  123564. break;
  123565. case 9:
  123566. sp_521_mont_mul_17(ctx->t2, ctx->t2, q->x, p521_mod, p521_mp_mod);
  123567. ctx->state = 10;
  123568. break;
  123569. case 10:
  123570. /* S1 = Y1*Z2^3 */
  123571. sp_521_mont_mul_17(ctx->t3, ctx->t3, p->y, p521_mod, p521_mp_mod);
  123572. ctx->state = 11;
  123573. break;
  123574. case 11:
  123575. /* S2 = Y2*Z1^3 */
  123576. sp_521_mont_mul_17(ctx->t4, ctx->t4, q->y, p521_mod, p521_mp_mod);
  123577. ctx->state = 12;
  123578. break;
  123579. case 12:
  123580. /* H = U2 - U1 */
  123581. sp_521_mont_sub_17(ctx->t2, ctx->t2, ctx->t1, p521_mod);
  123582. ctx->state = 13;
  123583. break;
  123584. case 13:
  123585. /* R = S2 - S1 */
  123586. sp_521_mont_sub_17(ctx->t4, ctx->t4, ctx->t3, p521_mod);
  123587. ctx->state = 14;
  123588. break;
  123589. case 14:
  123590. /* X3 = R^2 - H^3 - 2*U1*H^2 */
  123591. sp_521_mont_sqr_17(ctx->t5, ctx->t2, p521_mod, p521_mp_mod);
  123592. ctx->state = 15;
  123593. break;
  123594. case 15:
  123595. sp_521_mont_mul_17(ctx->y, ctx->t1, ctx->t5, p521_mod, p521_mp_mod);
  123596. ctx->state = 16;
  123597. break;
  123598. case 16:
  123599. sp_521_mont_mul_17(ctx->t5, ctx->t5, ctx->t2, p521_mod, p521_mp_mod);
  123600. ctx->state = 17;
  123601. break;
  123602. case 17:
  123603. /* Z3 = H*Z1*Z2 */
  123604. sp_521_mont_mul_17(ctx->z, p->z, ctx->t2, p521_mod, p521_mp_mod);
  123605. ctx->state = 18;
  123606. break;
  123607. case 18:
  123608. sp_521_mont_mul_17(ctx->z, ctx->z, q->z, p521_mod, p521_mp_mod);
  123609. ctx->state = 19;
  123610. break;
  123611. case 19:
  123612. sp_521_mont_sqr_17(ctx->x, ctx->t4, p521_mod, p521_mp_mod);
  123613. ctx->state = 20;
  123614. break;
  123615. case 20:
  123616. sp_521_mont_sub_17(ctx->x, ctx->x, ctx->t5, p521_mod);
  123617. ctx->state = 21;
  123618. break;
  123619. case 21:
  123620. sp_521_mont_mul_17(ctx->t5, ctx->t5, ctx->t3, p521_mod, p521_mp_mod);
  123621. ctx->state = 22;
  123622. break;
  123623. case 22:
  123624. sp_521_mont_dbl_17(ctx->t3, ctx->y, p521_mod);
  123625. ctx->state = 23;
  123626. break;
  123627. case 23:
  123628. sp_521_mont_sub_17(ctx->x, ctx->x, ctx->t3, p521_mod);
  123629. ctx->state = 24;
  123630. break;
  123631. case 24:
  123632. /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
  123633. sp_521_mont_sub_lower_17(ctx->y, ctx->y, ctx->x, p521_mod);
  123634. ctx->state = 25;
  123635. break;
  123636. case 25:
  123637. sp_521_mont_mul_17(ctx->y, ctx->y, ctx->t4, p521_mod, p521_mp_mod);
  123638. ctx->state = 26;
  123639. break;
  123640. case 26:
  123641. sp_521_mont_sub_17(ctx->y, ctx->y, ctx->t5, p521_mod);
  123642. ctx->state = 27;
  123643. /* fall-through */
  123644. case 27:
  123645. {
  123646. int i;
  123647. sp_digit maskp = 0 - (q->infinity & (!p->infinity));
  123648. sp_digit maskq = 0 - (p->infinity & (!q->infinity));
  123649. sp_digit maskt = ~(maskp | maskq);
  123650. for (i = 0; i < 17; i++) {
  123651. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) |
  123652. (ctx->x[i] & maskt);
  123653. }
  123654. for (i = 0; i < 17; i++) {
  123655. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) |
  123656. (ctx->y[i] & maskt);
  123657. }
  123658. for (i = 0; i < 17; i++) {
  123659. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) |
  123660. (ctx->z[i] & maskt);
  123661. }
  123662. r->z[0] |= p->infinity & q->infinity;
  123663. r->infinity = p->infinity & q->infinity;
  123664. err = MP_OKAY;
  123665. break;
  123666. }
  123667. }
  123668. if (err == MP_OKAY && ctx->state != 27) {
  123669. err = FP_WOULDBLOCK;
  123670. }
  123671. return err;
  123672. }
  123673. #endif /* WOLFSSL_SP_NONBLOCK */
  123674. static void sp_521_proj_point_add_17(sp_point_521* r,
  123675. const sp_point_521* p, const sp_point_521* q, sp_digit* t)
  123676. {
  123677. sp_digit* t1 = t;
  123678. sp_digit* t2 = t + 2*17;
  123679. sp_digit* t3 = t + 4*17;
  123680. sp_digit* t4 = t + 6*17;
  123681. sp_digit* t5 = t + 8*17;
  123682. sp_digit* t6 = t + 10*17;
  123683. /* Check double */
  123684. (void)sp_521_sub_17(t1, p521_mod, q->y);
  123685. sp_521_norm_17(t1);
  123686. if ((~p->infinity & ~q->infinity &
  123687. sp_521_cmp_equal_17(p->x, q->x) & sp_521_cmp_equal_17(p->z, q->z) &
  123688. (sp_521_cmp_equal_17(p->y, q->y) | sp_521_cmp_equal_17(p->y, t1))) != 0) {
  123689. sp_521_proj_point_dbl_17(r, p, t);
  123690. }
  123691. else {
  123692. sp_digit maskp;
  123693. sp_digit maskq;
  123694. sp_digit maskt;
  123695. sp_digit* x = t6;
  123696. sp_digit* y = t1;
  123697. sp_digit* z = t2;
  123698. int i;
  123699. maskp = 0 - (q->infinity & (!p->infinity));
  123700. maskq = 0 - (p->infinity & (!q->infinity));
  123701. maskt = ~(maskp | maskq);
  123702. /* U1 = X1*Z2^2 */
  123703. sp_521_mont_sqr_17(t1, q->z, p521_mod, p521_mp_mod);
  123704. sp_521_mont_mul_17(t3, t1, q->z, p521_mod, p521_mp_mod);
  123705. sp_521_mont_mul_17(t1, t1, p->x, p521_mod, p521_mp_mod);
  123706. /* U2 = X2*Z1^2 */
  123707. sp_521_mont_sqr_17(t2, p->z, p521_mod, p521_mp_mod);
  123708. sp_521_mont_mul_17(t4, t2, p->z, p521_mod, p521_mp_mod);
  123709. sp_521_mont_mul_17(t2, t2, q->x, p521_mod, p521_mp_mod);
  123710. /* S1 = Y1*Z2^3 */
  123711. sp_521_mont_mul_17(t3, t3, p->y, p521_mod, p521_mp_mod);
  123712. /* S2 = Y2*Z1^3 */
  123713. sp_521_mont_mul_17(t4, t4, q->y, p521_mod, p521_mp_mod);
  123714. /* H = U2 - U1 */
  123715. sp_521_mont_sub_17(t2, t2, t1, p521_mod);
  123716. /* R = S2 - S1 */
  123717. sp_521_mont_sub_17(t4, t4, t3, p521_mod);
  123718. if (~p->infinity & ~q->infinity &
  123719. sp_521_iszero_17(t2) & sp_521_iszero_17(t4) & maskt) {
  123720. sp_521_proj_point_dbl_17(r, p, t);
  123721. }
  123722. else {
  123723. /* X3 = R^2 - H^3 - 2*U1*H^2 */
  123724. sp_521_mont_sqr_17(t5, t2, p521_mod, p521_mp_mod);
  123725. sp_521_mont_mul_17(y, t1, t5, p521_mod, p521_mp_mod);
  123726. sp_521_mont_mul_17(t5, t5, t2, p521_mod, p521_mp_mod);
  123727. /* Z3 = H*Z1*Z2 */
  123728. sp_521_mont_mul_17(z, p->z, t2, p521_mod, p521_mp_mod);
  123729. sp_521_mont_mul_17(z, z, q->z, p521_mod, p521_mp_mod);
  123730. sp_521_mont_sqr_17(x, t4, p521_mod, p521_mp_mod);
  123731. sp_521_mont_sub_17(x, x, t5, p521_mod);
  123732. sp_521_mont_mul_17(t5, t5, t3, p521_mod, p521_mp_mod);
  123733. sp_521_mont_dbl_17(t3, y, p521_mod);
  123734. sp_521_mont_sub_17(x, x, t3, p521_mod);
  123735. /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
  123736. sp_521_mont_sub_lower_17(y, y, x, p521_mod);
  123737. sp_521_mont_mul_17(y, y, t4, p521_mod, p521_mp_mod);
  123738. sp_521_mont_sub_17(y, y, t5, p521_mod);
  123739. for (i = 0; i < 17; i++) {
  123740. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) |
  123741. (x[i] & maskt);
  123742. }
  123743. for (i = 0; i < 17; i++) {
  123744. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) |
  123745. (y[i] & maskt);
  123746. }
  123747. for (i = 0; i < 17; i++) {
  123748. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) |
  123749. (z[i] & maskt);
  123750. }
  123751. r->z[0] |= p->infinity & q->infinity;
  123752. r->infinity = p->infinity & q->infinity;
  123753. }
  123754. }
  123755. }
  123756. #ifndef WC_NO_CACHE_RESISTANT
  123757. /* Touch each possible point that could be being copied.
  123758. *
  123759. * r Point to copy into.
  123760. * table Table - start of the entires to access
  123761. * idx Index of entry to retrieve.
  123762. */
  123763. static void sp_521_get_point_16_17(sp_point_521* r, const sp_point_521* table,
  123764. int idx)
  123765. {
  123766. int i;
  123767. sp_digit mask;
  123768. r->x[0] = 0;
  123769. r->x[1] = 0;
  123770. r->x[2] = 0;
  123771. r->x[3] = 0;
  123772. r->x[4] = 0;
  123773. r->x[5] = 0;
  123774. r->x[6] = 0;
  123775. r->x[7] = 0;
  123776. r->x[8] = 0;
  123777. r->x[9] = 0;
  123778. r->x[10] = 0;
  123779. r->x[11] = 0;
  123780. r->x[12] = 0;
  123781. r->x[13] = 0;
  123782. r->x[14] = 0;
  123783. r->x[15] = 0;
  123784. r->x[16] = 0;
  123785. r->y[0] = 0;
  123786. r->y[1] = 0;
  123787. r->y[2] = 0;
  123788. r->y[3] = 0;
  123789. r->y[4] = 0;
  123790. r->y[5] = 0;
  123791. r->y[6] = 0;
  123792. r->y[7] = 0;
  123793. r->y[8] = 0;
  123794. r->y[9] = 0;
  123795. r->y[10] = 0;
  123796. r->y[11] = 0;
  123797. r->y[12] = 0;
  123798. r->y[13] = 0;
  123799. r->y[14] = 0;
  123800. r->y[15] = 0;
  123801. r->y[16] = 0;
  123802. r->z[0] = 0;
  123803. r->z[1] = 0;
  123804. r->z[2] = 0;
  123805. r->z[3] = 0;
  123806. r->z[4] = 0;
  123807. r->z[5] = 0;
  123808. r->z[6] = 0;
  123809. r->z[7] = 0;
  123810. r->z[8] = 0;
  123811. r->z[9] = 0;
  123812. r->z[10] = 0;
  123813. r->z[11] = 0;
  123814. r->z[12] = 0;
  123815. r->z[13] = 0;
  123816. r->z[14] = 0;
  123817. r->z[15] = 0;
  123818. r->z[16] = 0;
  123819. for (i = 1; i < 16; i++) {
  123820. mask = 0 - (i == idx);
  123821. r->x[0] |= mask & table[i].x[0];
  123822. r->x[1] |= mask & table[i].x[1];
  123823. r->x[2] |= mask & table[i].x[2];
  123824. r->x[3] |= mask & table[i].x[3];
  123825. r->x[4] |= mask & table[i].x[4];
  123826. r->x[5] |= mask & table[i].x[5];
  123827. r->x[6] |= mask & table[i].x[6];
  123828. r->x[7] |= mask & table[i].x[7];
  123829. r->x[8] |= mask & table[i].x[8];
  123830. r->x[9] |= mask & table[i].x[9];
  123831. r->x[10] |= mask & table[i].x[10];
  123832. r->x[11] |= mask & table[i].x[11];
  123833. r->x[12] |= mask & table[i].x[12];
  123834. r->x[13] |= mask & table[i].x[13];
  123835. r->x[14] |= mask & table[i].x[14];
  123836. r->x[15] |= mask & table[i].x[15];
  123837. r->x[16] |= mask & table[i].x[16];
  123838. r->y[0] |= mask & table[i].y[0];
  123839. r->y[1] |= mask & table[i].y[1];
  123840. r->y[2] |= mask & table[i].y[2];
  123841. r->y[3] |= mask & table[i].y[3];
  123842. r->y[4] |= mask & table[i].y[4];
  123843. r->y[5] |= mask & table[i].y[5];
  123844. r->y[6] |= mask & table[i].y[6];
  123845. r->y[7] |= mask & table[i].y[7];
  123846. r->y[8] |= mask & table[i].y[8];
  123847. r->y[9] |= mask & table[i].y[9];
  123848. r->y[10] |= mask & table[i].y[10];
  123849. r->y[11] |= mask & table[i].y[11];
  123850. r->y[12] |= mask & table[i].y[12];
  123851. r->y[13] |= mask & table[i].y[13];
  123852. r->y[14] |= mask & table[i].y[14];
  123853. r->y[15] |= mask & table[i].y[15];
  123854. r->y[16] |= mask & table[i].y[16];
  123855. r->z[0] |= mask & table[i].z[0];
  123856. r->z[1] |= mask & table[i].z[1];
  123857. r->z[2] |= mask & table[i].z[2];
  123858. r->z[3] |= mask & table[i].z[3];
  123859. r->z[4] |= mask & table[i].z[4];
  123860. r->z[5] |= mask & table[i].z[5];
  123861. r->z[6] |= mask & table[i].z[6];
  123862. r->z[7] |= mask & table[i].z[7];
  123863. r->z[8] |= mask & table[i].z[8];
  123864. r->z[9] |= mask & table[i].z[9];
  123865. r->z[10] |= mask & table[i].z[10];
  123866. r->z[11] |= mask & table[i].z[11];
  123867. r->z[12] |= mask & table[i].z[12];
  123868. r->z[13] |= mask & table[i].z[13];
  123869. r->z[14] |= mask & table[i].z[14];
  123870. r->z[15] |= mask & table[i].z[15];
  123871. r->z[16] |= mask & table[i].z[16];
  123872. }
  123873. }
  123874. #endif /* !WC_NO_CACHE_RESISTANT */
  123875. /* Multiply the point by the scalar and return the result.
  123876. * If map is true then convert result to affine coordinates.
  123877. *
  123878. * Fast implementation that generates a pre-computation table.
  123879. * 4 bits of window (no sliding!).
  123880. * Uses add and double for calculating table.
  123881. * 521 doubles.
  123882. * 143 adds.
  123883. *
  123884. * r Resulting point.
  123885. * g Point to multiply.
  123886. * k Scalar to multiply by.
  123887. * map Indicates whether to convert result to affine.
  123888. * ct Constant time required.
  123889. * heap Heap to use for allocation.
  123890. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  123891. */
  123892. static int sp_521_ecc_mulmod_fast_17(sp_point_521* r, const sp_point_521* g, const sp_digit* k,
  123893. int map, int ct, void* heap)
  123894. {
  123895. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  123896. sp_point_521* t = NULL;
  123897. sp_digit* tmp = NULL;
  123898. #else
  123899. sp_point_521 t[16 + 1];
  123900. sp_digit tmp[2 * 17 * 6];
  123901. #endif
  123902. sp_point_521* rt = NULL;
  123903. #ifndef WC_NO_CACHE_RESISTANT
  123904. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  123905. sp_point_521* p = NULL;
  123906. #else
  123907. sp_point_521 p[1];
  123908. #endif
  123909. #endif /* !WC_NO_CACHE_RESISTANT */
  123910. sp_digit n;
  123911. int i;
  123912. int c;
  123913. int y;
  123914. int err = MP_OKAY;
  123915. /* Constant time used for cache attack resistance implementation. */
  123916. (void)ct;
  123917. (void)heap;
  123918. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  123919. t = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * (16 + 1),
  123920. heap, DYNAMIC_TYPE_ECC);
  123921. if (t == NULL)
  123922. err = MEMORY_E;
  123923. #ifndef WC_NO_CACHE_RESISTANT
  123924. if (err == MP_OKAY) {
  123925. p = (sp_point_521*)XMALLOC(sizeof(sp_point_521),
  123926. heap, DYNAMIC_TYPE_ECC);
  123927. if (p == NULL)
  123928. err = MEMORY_E;
  123929. }
  123930. #endif
  123931. if (err == MP_OKAY) {
  123932. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 17 * 6, heap,
  123933. DYNAMIC_TYPE_ECC);
  123934. if (tmp == NULL)
  123935. err = MEMORY_E;
  123936. }
  123937. #endif
  123938. if (err == MP_OKAY) {
  123939. rt = t + 16;
  123940. /* t[0] = {0, 0, 1} * norm */
  123941. XMEMSET(&t[0], 0, sizeof(t[0]));
  123942. t[0].infinity = 1;
  123943. /* t[1] = {g->x, g->y, g->z} * norm */
  123944. (void)sp_521_mod_mul_norm_17(t[1].x, g->x, p521_mod);
  123945. (void)sp_521_mod_mul_norm_17(t[1].y, g->y, p521_mod);
  123946. (void)sp_521_mod_mul_norm_17(t[1].z, g->z, p521_mod);
  123947. t[1].infinity = 0;
  123948. sp_521_proj_point_dbl_17(&t[ 2], &t[ 1], tmp);
  123949. t[ 2].infinity = 0;
  123950. sp_521_proj_point_add_17(&t[ 3], &t[ 2], &t[ 1], tmp);
  123951. t[ 3].infinity = 0;
  123952. sp_521_proj_point_dbl_17(&t[ 4], &t[ 2], tmp);
  123953. t[ 4].infinity = 0;
  123954. sp_521_proj_point_add_17(&t[ 5], &t[ 3], &t[ 2], tmp);
  123955. t[ 5].infinity = 0;
  123956. sp_521_proj_point_dbl_17(&t[ 6], &t[ 3], tmp);
  123957. t[ 6].infinity = 0;
  123958. sp_521_proj_point_add_17(&t[ 7], &t[ 4], &t[ 3], tmp);
  123959. t[ 7].infinity = 0;
  123960. sp_521_proj_point_dbl_17(&t[ 8], &t[ 4], tmp);
  123961. t[ 8].infinity = 0;
  123962. sp_521_proj_point_add_17(&t[ 9], &t[ 5], &t[ 4], tmp);
  123963. t[ 9].infinity = 0;
  123964. sp_521_proj_point_dbl_17(&t[10], &t[ 5], tmp);
  123965. t[10].infinity = 0;
  123966. sp_521_proj_point_add_17(&t[11], &t[ 6], &t[ 5], tmp);
  123967. t[11].infinity = 0;
  123968. sp_521_proj_point_dbl_17(&t[12], &t[ 6], tmp);
  123969. t[12].infinity = 0;
  123970. sp_521_proj_point_add_17(&t[13], &t[ 7], &t[ 6], tmp);
  123971. t[13].infinity = 0;
  123972. sp_521_proj_point_dbl_17(&t[14], &t[ 7], tmp);
  123973. t[14].infinity = 0;
  123974. sp_521_proj_point_add_17(&t[15], &t[ 8], &t[ 7], tmp);
  123975. t[15].infinity = 0;
  123976. i = 15;
  123977. n = k[i+1] << 0;
  123978. c = 5;
  123979. y = (int)(n >> 5);
  123980. #ifndef WC_NO_CACHE_RESISTANT
  123981. if (ct) {
  123982. sp_521_get_point_16_17(rt, t, y);
  123983. rt->infinity = !y;
  123984. }
  123985. else
  123986. #endif
  123987. {
  123988. XMEMCPY(rt, &t[y], sizeof(sp_point_521));
  123989. }
  123990. n <<= 27;
  123991. for (; i>=0 || c>=4; ) {
  123992. if (c < 4) {
  123993. n = (k[i+1] << 31) | (k[i] >> 1);
  123994. i--;
  123995. c += 32;
  123996. }
  123997. y = (n >> 28) & 0xf;
  123998. n <<= 4;
  123999. c -= 4;
  124000. sp_521_proj_point_dbl_17(rt, rt, tmp);
  124001. sp_521_proj_point_dbl_17(rt, rt, tmp);
  124002. sp_521_proj_point_dbl_17(rt, rt, tmp);
  124003. sp_521_proj_point_dbl_17(rt, rt, tmp);
  124004. #ifndef WC_NO_CACHE_RESISTANT
  124005. if (ct) {
  124006. sp_521_get_point_16_17(p, t, y);
  124007. p->infinity = !y;
  124008. sp_521_proj_point_add_17(rt, rt, p, tmp);
  124009. }
  124010. else
  124011. #endif
  124012. {
  124013. sp_521_proj_point_add_17(rt, rt, &t[y], tmp);
  124014. }
  124015. }
  124016. y = k[0] & 0x1;
  124017. sp_521_proj_point_dbl_17(rt, rt, tmp);
  124018. sp_521_proj_point_add_17(rt, rt, &t[y], tmp);
  124019. if (map != 0) {
  124020. sp_521_map_17(r, rt, tmp);
  124021. }
  124022. else {
  124023. XMEMCPY(r, rt, sizeof(sp_point_521));
  124024. }
  124025. }
  124026. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  124027. if (tmp != NULL)
  124028. #endif
  124029. {
  124030. ForceZero(tmp, sizeof(sp_digit) * 2 * 17 * 6);
  124031. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  124032. XFREE(tmp, heap, DYNAMIC_TYPE_ECC);
  124033. #endif
  124034. }
  124035. #ifndef WC_NO_CACHE_RESISTANT
  124036. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  124037. if (p != NULL)
  124038. #endif
  124039. {
  124040. ForceZero(p, sizeof(sp_point_521));
  124041. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  124042. XFREE(p, heap, DYNAMIC_TYPE_ECC);
  124043. #endif
  124044. }
  124045. #endif /* !WC_NO_CACHE_RESISTANT */
  124046. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  124047. if (t != NULL)
  124048. #endif
  124049. {
  124050. ForceZero(t, sizeof(sp_point_521) * 17);
  124051. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  124052. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  124053. #endif
  124054. }
  124055. return err;
  124056. }
  124057. #ifdef FP_ECC
  124058. #define sp_521_mont_dbl_lower_17 sp_521_mont_dbl_17
  124059. #define sp_521_mont_tpl_lower_17 sp_521_mont_tpl_17
  124060. /* Double the Montgomery form projective point p a number of times.
  124061. *
  124062. * r Result of repeated doubling of point.
  124063. * p Point to double.
  124064. * n Number of times to double
  124065. * t Temporary ordinate data.
  124066. */
  124067. static void sp_521_proj_point_dbl_n_17(sp_point_521* p, int i,
  124068. sp_digit* t)
  124069. {
  124070. sp_digit* w = t;
  124071. sp_digit* a = t + 2*17;
  124072. sp_digit* b = t + 4*17;
  124073. sp_digit* t1 = t + 6*17;
  124074. sp_digit* t2 = t + 8*17;
  124075. sp_digit* x;
  124076. sp_digit* y;
  124077. sp_digit* z;
  124078. volatile int n = i;
  124079. x = p->x;
  124080. y = p->y;
  124081. z = p->z;
  124082. /* Y = 2*Y */
  124083. sp_521_mont_dbl_17(y, y, p521_mod);
  124084. /* W = Z^4 */
  124085. sp_521_mont_sqr_17(w, z, p521_mod, p521_mp_mod);
  124086. sp_521_mont_sqr_17(w, w, p521_mod, p521_mp_mod);
  124087. #ifndef WOLFSSL_SP_SMALL
  124088. while (--n > 0)
  124089. #else
  124090. while (--n >= 0)
  124091. #endif
  124092. {
  124093. /* A = 3*(X^2 - W) */
  124094. sp_521_mont_sqr_17(t1, x, p521_mod, p521_mp_mod);
  124095. sp_521_mont_sub_17(t1, t1, w, p521_mod);
  124096. sp_521_mont_tpl_lower_17(a, t1, p521_mod);
  124097. /* B = X*Y^2 */
  124098. sp_521_mont_sqr_17(t1, y, p521_mod, p521_mp_mod);
  124099. sp_521_mont_mul_17(b, t1, x, p521_mod, p521_mp_mod);
  124100. /* X = A^2 - 2B */
  124101. sp_521_mont_sqr_17(x, a, p521_mod, p521_mp_mod);
  124102. sp_521_mont_dbl_17(t2, b, p521_mod);
  124103. sp_521_mont_sub_17(x, x, t2, p521_mod);
  124104. /* b = 2.(B - X) */
  124105. sp_521_mont_sub_lower_17(t2, b, x, p521_mod);
  124106. sp_521_mont_dbl_lower_17(b, t2, p521_mod);
  124107. /* Z = Z*Y */
  124108. sp_521_mont_mul_17(z, z, y, p521_mod, p521_mp_mod);
  124109. /* t1 = Y^4 */
  124110. sp_521_mont_sqr_17(t1, t1, p521_mod, p521_mp_mod);
  124111. #ifdef WOLFSSL_SP_SMALL
  124112. if (n != 0)
  124113. #endif
  124114. {
  124115. /* W = W*Y^4 */
  124116. sp_521_mont_mul_17(w, w, t1, p521_mod, p521_mp_mod);
  124117. }
  124118. /* y = 2*A*(B - X) - Y^4 */
  124119. sp_521_mont_mul_17(y, b, a, p521_mod, p521_mp_mod);
  124120. sp_521_mont_sub_17(y, y, t1, p521_mod);
  124121. }
  124122. #ifndef WOLFSSL_SP_SMALL
  124123. /* A = 3*(X^2 - W) */
  124124. sp_521_mont_sqr_17(t1, x, p521_mod, p521_mp_mod);
  124125. sp_521_mont_sub_17(t1, t1, w, p521_mod);
  124126. sp_521_mont_tpl_lower_17(a, t1, p521_mod);
  124127. /* B = X*Y^2 */
  124128. sp_521_mont_sqr_17(t1, y, p521_mod, p521_mp_mod);
  124129. sp_521_mont_mul_17(b, t1, x, p521_mod, p521_mp_mod);
  124130. /* X = A^2 - 2B */
  124131. sp_521_mont_sqr_17(x, a, p521_mod, p521_mp_mod);
  124132. sp_521_mont_dbl_17(t2, b, p521_mod);
  124133. sp_521_mont_sub_17(x, x, t2, p521_mod);
  124134. /* b = 2.(B - X) */
  124135. sp_521_mont_sub_lower_17(t2, b, x, p521_mod);
  124136. sp_521_mont_dbl_lower_17(b, t2, p521_mod);
  124137. /* Z = Z*Y */
  124138. sp_521_mont_mul_17(z, z, y, p521_mod, p521_mp_mod);
  124139. /* t1 = Y^4 */
  124140. sp_521_mont_sqr_17(t1, t1, p521_mod, p521_mp_mod);
  124141. /* y = 2*A*(B - X) - Y^4 */
  124142. sp_521_mont_mul_17(y, b, a, p521_mod, p521_mp_mod);
  124143. sp_521_mont_sub_17(y, y, t1, p521_mod);
  124144. #endif
  124145. /* Y = Y/2 */
  124146. sp_521_div2_17(y, y, p521_mod);
  124147. }
  124148. /* Convert the projective point to affine.
  124149. * Ordinates are in Montgomery form.
  124150. *
  124151. * a Point to convert.
  124152. * t Temporary data.
  124153. */
  124154. static void sp_521_proj_to_affine_17(sp_point_521* a, sp_digit* t)
  124155. {
  124156. sp_digit* t1 = t;
  124157. sp_digit* t2 = t + 2 * 17;
  124158. sp_digit* tmp = t + 4 * 17;
  124159. sp_521_mont_inv_17(t1, a->z, tmp);
  124160. sp_521_mont_sqr_17(t2, t1, p521_mod, p521_mp_mod);
  124161. sp_521_mont_mul_17(t1, t2, t1, p521_mod, p521_mp_mod);
  124162. sp_521_mont_mul_17(a->x, a->x, t2, p521_mod, p521_mp_mod);
  124163. sp_521_mont_mul_17(a->y, a->y, t1, p521_mod, p521_mp_mod);
  124164. XMEMCPY(a->z, p521_norm_mod, sizeof(p521_norm_mod));
  124165. }
  124166. #endif /* FP_ECC */
  124167. /* A table entry for pre-computed points. */
  124168. typedef struct sp_table_entry_521 {
  124169. sp_digit x[17];
  124170. sp_digit y[17];
  124171. } sp_table_entry_521;
  124172. #ifdef FP_ECC
  124173. #endif /* FP_ECC */
  124174. /* Add two Montgomery form projective points. The second point has a q value of
  124175. * one.
  124176. * Only the first point can be the same pointer as the result point.
  124177. *
  124178. * r Result of addition.
  124179. * p First point to add.
  124180. * q Second point to add.
  124181. * t Temporary ordinate data.
  124182. */
  124183. static void sp_521_proj_point_add_qz1_17(sp_point_521* r, const sp_point_521* p,
  124184. const sp_point_521* q, sp_digit* t)
  124185. {
  124186. sp_digit* t1 = t;
  124187. sp_digit* t2 = t + 2*17;
  124188. sp_digit* t3 = t + 4*17;
  124189. sp_digit* t4 = t + 6*17;
  124190. sp_digit* t5 = t + 8*17;
  124191. sp_digit* t6 = t + 10*17;
  124192. /* Check double */
  124193. (void)sp_521_sub_17(t1, p521_mod, q->y);
  124194. sp_521_norm_17(t1);
  124195. if ((~p->infinity & ~q->infinity &
  124196. sp_521_cmp_equal_17(p->x, q->x) & sp_521_cmp_equal_17(p->z, q->z) &
  124197. (sp_521_cmp_equal_17(p->y, q->y) | sp_521_cmp_equal_17(p->y, t1))) != 0) {
  124198. sp_521_proj_point_dbl_17(r, p, t);
  124199. }
  124200. else {
  124201. sp_digit maskp;
  124202. sp_digit maskq;
  124203. sp_digit maskt;
  124204. sp_digit* x = t2;
  124205. sp_digit* y = t5;
  124206. sp_digit* z = t6;
  124207. int i;
  124208. /* U2 = X2*Z1^2 */
  124209. sp_521_mont_sqr_17(t2, p->z, p521_mod, p521_mp_mod);
  124210. sp_521_mont_mul_17(t4, t2, p->z, p521_mod, p521_mp_mod);
  124211. sp_521_mont_mul_17(t2, t2, q->x, p521_mod, p521_mp_mod);
  124212. /* S2 = Y2*Z1^3 */
  124213. sp_521_mont_mul_17(t4, t4, q->y, p521_mod, p521_mp_mod);
  124214. /* H = U2 - X1 */
  124215. sp_521_mont_sub_17(t2, t2, p->x, p521_mod);
  124216. /* R = S2 - Y1 */
  124217. sp_521_mont_sub_17(t4, t4, p->y, p521_mod);
  124218. /* Z3 = H*Z1 */
  124219. sp_521_mont_mul_17(z, p->z, t2, p521_mod, p521_mp_mod);
  124220. /* X3 = R^2 - H^3 - 2*X1*H^2 */
  124221. sp_521_mont_sqr_17(t1, t4, p521_mod, p521_mp_mod);
  124222. sp_521_mont_sqr_17(t5, t2, p521_mod, p521_mp_mod);
  124223. sp_521_mont_mul_17(t3, p->x, t5, p521_mod, p521_mp_mod);
  124224. sp_521_mont_mul_17(t5, t5, t2, p521_mod, p521_mp_mod);
  124225. sp_521_mont_sub_17(x, t1, t5, p521_mod);
  124226. sp_521_mont_dbl_17(t1, t3, p521_mod);
  124227. sp_521_mont_sub_17(x, x, t1, p521_mod);
  124228. /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */
  124229. sp_521_mont_sub_lower_17(t3, t3, x, p521_mod);
  124230. sp_521_mont_mul_17(t3, t3, t4, p521_mod, p521_mp_mod);
  124231. sp_521_mont_mul_17(t5, t5, p->y, p521_mod, p521_mp_mod);
  124232. sp_521_mont_sub_17(y, t3, t5, p521_mod);
  124233. maskp = 0 - (q->infinity & (!p->infinity));
  124234. maskq = 0 - (p->infinity & (!q->infinity));
  124235. maskt = ~(maskp | maskq);
  124236. for (i = 0; i < 17; i++) {
  124237. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt);
  124238. }
  124239. for (i = 0; i < 17; i++) {
  124240. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt);
  124241. }
  124242. for (i = 0; i < 17; i++) {
  124243. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt);
  124244. }
  124245. r->z[0] |= p->infinity & q->infinity;
  124246. r->infinity = p->infinity & q->infinity;
  124247. }
  124248. }
  124249. #ifdef WOLFSSL_SP_SMALL
  124250. #ifdef FP_ECC
  124251. /* Generate the pre-computed table of points for the base point.
  124252. *
  124253. * width = 4
  124254. * 16 entries
  124255. * 130 bits between
  124256. *
  124257. * a The base point.
  124258. * table Place to store generated point data.
  124259. * tmp Temporary data.
  124260. * heap Heap to use for allocation.
  124261. */
  124262. static int sp_521_gen_stripe_table_17(const sp_point_521* a,
  124263. sp_table_entry_521* table, sp_digit* tmp, void* heap)
  124264. {
  124265. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  124266. sp_point_521* t = NULL;
  124267. #else
  124268. sp_point_521 t[3];
  124269. #endif
  124270. sp_point_521* s1 = NULL;
  124271. sp_point_521* s2 = NULL;
  124272. int i;
  124273. int j;
  124274. int err = MP_OKAY;
  124275. (void)heap;
  124276. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  124277. t = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 3, heap,
  124278. DYNAMIC_TYPE_ECC);
  124279. if (t == NULL)
  124280. err = MEMORY_E;
  124281. #endif
  124282. if (err == MP_OKAY) {
  124283. s1 = t + 1;
  124284. s2 = t + 2;
  124285. err = sp_521_mod_mul_norm_17(t->x, a->x, p521_mod);
  124286. }
  124287. if (err == MP_OKAY) {
  124288. err = sp_521_mod_mul_norm_17(t->y, a->y, p521_mod);
  124289. }
  124290. if (err == MP_OKAY) {
  124291. err = sp_521_mod_mul_norm_17(t->z, a->z, p521_mod);
  124292. }
  124293. if (err == MP_OKAY) {
  124294. t->infinity = 0;
  124295. sp_521_proj_to_affine_17(t, tmp);
  124296. XMEMCPY(s1->z, p521_norm_mod, sizeof(p521_norm_mod));
  124297. s1->infinity = 0;
  124298. XMEMCPY(s2->z, p521_norm_mod, sizeof(p521_norm_mod));
  124299. s2->infinity = 0;
  124300. /* table[0] = {0, 0, infinity} */
  124301. XMEMSET(&table[0], 0, sizeof(sp_table_entry_521));
  124302. /* table[1] = Affine version of 'a' in Montgomery form */
  124303. XMEMCPY(table[1].x, t->x, sizeof(table->x));
  124304. XMEMCPY(table[1].y, t->y, sizeof(table->y));
  124305. for (i=1; i<4; i++) {
  124306. sp_521_proj_point_dbl_n_17(t, 131, tmp);
  124307. sp_521_proj_to_affine_17(t, tmp);
  124308. XMEMCPY(table[1<<i].x, t->x, sizeof(table->x));
  124309. XMEMCPY(table[1<<i].y, t->y, sizeof(table->y));
  124310. }
  124311. for (i=1; i<4; i++) {
  124312. XMEMCPY(s1->x, table[1<<i].x, sizeof(table->x));
  124313. XMEMCPY(s1->y, table[1<<i].y, sizeof(table->y));
  124314. for (j=(1<<i)+1; j<(1<<(i+1)); j++) {
  124315. XMEMCPY(s2->x, table[j-(1<<i)].x, sizeof(table->x));
  124316. XMEMCPY(s2->y, table[j-(1<<i)].y, sizeof(table->y));
  124317. sp_521_proj_point_add_qz1_17(t, s1, s2, tmp);
  124318. sp_521_proj_to_affine_17(t, tmp);
  124319. XMEMCPY(table[j].x, t->x, sizeof(table->x));
  124320. XMEMCPY(table[j].y, t->y, sizeof(table->y));
  124321. }
  124322. }
  124323. }
  124324. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  124325. if (t != NULL)
  124326. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  124327. #endif
  124328. return err;
  124329. }
  124330. #endif /* FP_ECC */
  124331. #ifndef WC_NO_CACHE_RESISTANT
  124332. /* Touch each possible entry that could be being copied.
  124333. *
  124334. * r Point to copy into.
  124335. * table Table - start of the entires to access
  124336. * idx Index of entry to retrieve.
  124337. */
  124338. static void sp_521_get_entry_16_17(sp_point_521* r,
  124339. const sp_table_entry_521* table, int idx)
  124340. {
  124341. int i;
  124342. sp_digit mask;
  124343. r->x[0] = 0;
  124344. r->x[1] = 0;
  124345. r->x[2] = 0;
  124346. r->x[3] = 0;
  124347. r->x[4] = 0;
  124348. r->x[5] = 0;
  124349. r->x[6] = 0;
  124350. r->x[7] = 0;
  124351. r->x[8] = 0;
  124352. r->x[9] = 0;
  124353. r->x[10] = 0;
  124354. r->x[11] = 0;
  124355. r->x[12] = 0;
  124356. r->x[13] = 0;
  124357. r->x[14] = 0;
  124358. r->x[15] = 0;
  124359. r->x[16] = 0;
  124360. r->y[0] = 0;
  124361. r->y[1] = 0;
  124362. r->y[2] = 0;
  124363. r->y[3] = 0;
  124364. r->y[4] = 0;
  124365. r->y[5] = 0;
  124366. r->y[6] = 0;
  124367. r->y[7] = 0;
  124368. r->y[8] = 0;
  124369. r->y[9] = 0;
  124370. r->y[10] = 0;
  124371. r->y[11] = 0;
  124372. r->y[12] = 0;
  124373. r->y[13] = 0;
  124374. r->y[14] = 0;
  124375. r->y[15] = 0;
  124376. r->y[16] = 0;
  124377. for (i = 1; i < 16; i++) {
  124378. mask = 0 - (i == idx);
  124379. r->x[0] |= mask & table[i].x[0];
  124380. r->x[1] |= mask & table[i].x[1];
  124381. r->x[2] |= mask & table[i].x[2];
  124382. r->x[3] |= mask & table[i].x[3];
  124383. r->x[4] |= mask & table[i].x[4];
  124384. r->x[5] |= mask & table[i].x[5];
  124385. r->x[6] |= mask & table[i].x[6];
  124386. r->x[7] |= mask & table[i].x[7];
  124387. r->x[8] |= mask & table[i].x[8];
  124388. r->x[9] |= mask & table[i].x[9];
  124389. r->x[10] |= mask & table[i].x[10];
  124390. r->x[11] |= mask & table[i].x[11];
  124391. r->x[12] |= mask & table[i].x[12];
  124392. r->x[13] |= mask & table[i].x[13];
  124393. r->x[14] |= mask & table[i].x[14];
  124394. r->x[15] |= mask & table[i].x[15];
  124395. r->x[16] |= mask & table[i].x[16];
  124396. r->y[0] |= mask & table[i].y[0];
  124397. r->y[1] |= mask & table[i].y[1];
  124398. r->y[2] |= mask & table[i].y[2];
  124399. r->y[3] |= mask & table[i].y[3];
  124400. r->y[4] |= mask & table[i].y[4];
  124401. r->y[5] |= mask & table[i].y[5];
  124402. r->y[6] |= mask & table[i].y[6];
  124403. r->y[7] |= mask & table[i].y[7];
  124404. r->y[8] |= mask & table[i].y[8];
  124405. r->y[9] |= mask & table[i].y[9];
  124406. r->y[10] |= mask & table[i].y[10];
  124407. r->y[11] |= mask & table[i].y[11];
  124408. r->y[12] |= mask & table[i].y[12];
  124409. r->y[13] |= mask & table[i].y[13];
  124410. r->y[14] |= mask & table[i].y[14];
  124411. r->y[15] |= mask & table[i].y[15];
  124412. r->y[16] |= mask & table[i].y[16];
  124413. }
  124414. }
  124415. #endif /* !WC_NO_CACHE_RESISTANT */
  124416. /* Multiply the point by the scalar and return the result.
  124417. * If map is true then convert result to affine coordinates.
  124418. *
  124419. * Stripe implementation.
  124420. * Pre-generated: 2^0, 2^130, ...
  124421. * Pre-generated: products of all combinations of above.
  124422. * 4 doubles and adds (with qz=1)
  124423. *
  124424. * r Resulting point.
  124425. * k Scalar to multiply by.
  124426. * table Pre-computed table.
  124427. * map Indicates whether to convert result to affine.
  124428. * ct Constant time required.
  124429. * heap Heap to use for allocation.
  124430. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  124431. */
  124432. static int sp_521_ecc_mulmod_stripe_17(sp_point_521* r, const sp_point_521* g,
  124433. const sp_table_entry_521* table, const sp_digit* k, int map,
  124434. int ct, void* heap)
  124435. {
  124436. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  124437. sp_point_521* rt = NULL;
  124438. sp_digit* t = NULL;
  124439. #else
  124440. sp_point_521 rt[2];
  124441. sp_digit t[2 * 17 * 6];
  124442. #endif
  124443. sp_point_521* p = NULL;
  124444. int i;
  124445. int j;
  124446. int y;
  124447. int x;
  124448. int err = MP_OKAY;
  124449. (void)g;
  124450. /* Constant time used for cache attack resistance implementation. */
  124451. (void)ct;
  124452. (void)heap;
  124453. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  124454. rt = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap,
  124455. DYNAMIC_TYPE_ECC);
  124456. if (rt == NULL)
  124457. err = MEMORY_E;
  124458. if (err == MP_OKAY) {
  124459. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 17 * 6, heap,
  124460. DYNAMIC_TYPE_ECC);
  124461. if (t == NULL)
  124462. err = MEMORY_E;
  124463. }
  124464. #endif
  124465. if (err == MP_OKAY) {
  124466. p = rt + 1;
  124467. XMEMCPY(p->z, p521_norm_mod, sizeof(p521_norm_mod));
  124468. XMEMCPY(rt->z, p521_norm_mod, sizeof(p521_norm_mod));
  124469. y = 0;
  124470. x = 130;
  124471. for (j=0; j<4 && x<521; j++) {
  124472. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  124473. x += 131;
  124474. }
  124475. #ifndef WC_NO_CACHE_RESISTANT
  124476. if (ct) {
  124477. sp_521_get_entry_16_17(rt, table, y);
  124478. } else
  124479. #endif
  124480. {
  124481. XMEMCPY(rt->x, table[y].x, sizeof(table[y].x));
  124482. XMEMCPY(rt->y, table[y].y, sizeof(table[y].y));
  124483. }
  124484. rt->infinity = !y;
  124485. for (i=129; i>=0; i--) {
  124486. y = 0;
  124487. x = i;
  124488. for (j=0; j<4 && x<521; j++) {
  124489. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  124490. x += 131;
  124491. }
  124492. sp_521_proj_point_dbl_17(rt, rt, t);
  124493. #ifndef WC_NO_CACHE_RESISTANT
  124494. if (ct) {
  124495. sp_521_get_entry_16_17(p, table, y);
  124496. }
  124497. else
  124498. #endif
  124499. {
  124500. XMEMCPY(p->x, table[y].x, sizeof(table[y].x));
  124501. XMEMCPY(p->y, table[y].y, sizeof(table[y].y));
  124502. }
  124503. p->infinity = !y;
  124504. sp_521_proj_point_add_qz1_17(rt, rt, p, t);
  124505. }
  124506. if (map != 0) {
  124507. sp_521_map_17(r, rt, t);
  124508. }
  124509. else {
  124510. XMEMCPY(r, rt, sizeof(sp_point_521));
  124511. }
  124512. }
  124513. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  124514. if (t != NULL)
  124515. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  124516. if (rt != NULL)
  124517. XFREE(rt, heap, DYNAMIC_TYPE_ECC);
  124518. #endif
  124519. return err;
  124520. }
  124521. #ifdef FP_ECC
  124522. #ifndef FP_ENTRIES
  124523. #define FP_ENTRIES 16
  124524. #endif
  124525. /* Cache entry - holds precomputation tables for a point. */
  124526. typedef struct sp_cache_521_t {
  124527. /* X ordinate of point that table was generated from. */
  124528. sp_digit x[17];
  124529. /* Y ordinate of point that table was generated from. */
  124530. sp_digit y[17];
  124531. /* Precomputation table for point. */
  124532. sp_table_entry_521 table[16];
  124533. /* Count of entries in table. */
  124534. uint32_t cnt;
  124535. /* Point and table set in entry. */
  124536. int set;
  124537. } sp_cache_521_t;
  124538. /* Cache of tables. */
  124539. static THREAD_LS_T sp_cache_521_t sp_cache_521[FP_ENTRIES];
  124540. /* Index of last entry in cache. */
  124541. static THREAD_LS_T int sp_cache_521_last = -1;
  124542. /* Cache has been initialized. */
  124543. static THREAD_LS_T int sp_cache_521_inited = 0;
  124544. #ifndef HAVE_THREAD_LS
  124545. static volatile int initCacheMutex_521 = 0;
  124546. static wolfSSL_Mutex sp_cache_521_lock;
  124547. #endif
  124548. /* Get the cache entry for the point.
  124549. *
  124550. * g [in] Point scalar multipling.
  124551. * cache [out] Cache table to use.
  124552. */
  124553. static void sp_ecc_get_cache_521(const sp_point_521* g, sp_cache_521_t** cache)
  124554. {
  124555. int i;
  124556. int j;
  124557. uint32_t least;
  124558. if (sp_cache_521_inited == 0) {
  124559. for (i=0; i<FP_ENTRIES; i++) {
  124560. sp_cache_521[i].set = 0;
  124561. }
  124562. sp_cache_521_inited = 1;
  124563. }
  124564. /* Compare point with those in cache. */
  124565. for (i=0; i<FP_ENTRIES; i++) {
  124566. if (!sp_cache_521[i].set)
  124567. continue;
  124568. if (sp_521_cmp_equal_17(g->x, sp_cache_521[i].x) &
  124569. sp_521_cmp_equal_17(g->y, sp_cache_521[i].y)) {
  124570. sp_cache_521[i].cnt++;
  124571. break;
  124572. }
  124573. }
  124574. /* No match. */
  124575. if (i == FP_ENTRIES) {
  124576. /* Find empty entry. */
  124577. i = (sp_cache_521_last + 1) % FP_ENTRIES;
  124578. for (; i != sp_cache_521_last; i=(i+1)%FP_ENTRIES) {
  124579. if (!sp_cache_521[i].set) {
  124580. break;
  124581. }
  124582. }
  124583. /* Evict least used. */
  124584. if (i == sp_cache_521_last) {
  124585. least = sp_cache_521[0].cnt;
  124586. for (j=1; j<FP_ENTRIES; j++) {
  124587. if (sp_cache_521[j].cnt < least) {
  124588. i = j;
  124589. least = sp_cache_521[i].cnt;
  124590. }
  124591. }
  124592. }
  124593. XMEMCPY(sp_cache_521[i].x, g->x, sizeof(sp_cache_521[i].x));
  124594. XMEMCPY(sp_cache_521[i].y, g->y, sizeof(sp_cache_521[i].y));
  124595. sp_cache_521[i].set = 1;
  124596. sp_cache_521[i].cnt = 1;
  124597. }
  124598. *cache = &sp_cache_521[i];
  124599. sp_cache_521_last = i;
  124600. }
  124601. #endif /* FP_ECC */
  124602. /* Multiply the base point of P521 by the scalar and return the result.
  124603. * If map is true then convert result to affine coordinates.
  124604. *
  124605. * r Resulting point.
  124606. * g Point to multiply.
  124607. * k Scalar to multiply by.
  124608. * map Indicates whether to convert result to affine.
  124609. * ct Constant time required.
  124610. * heap Heap to use for allocation.
  124611. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  124612. */
  124613. static int sp_521_ecc_mulmod_17(sp_point_521* r, const sp_point_521* g, const sp_digit* k,
  124614. int map, int ct, void* heap)
  124615. {
  124616. #ifndef FP_ECC
  124617. return sp_521_ecc_mulmod_fast_17(r, g, k, map, ct, heap);
  124618. #else
  124619. sp_digit tmp[2 * 17 * 6];
  124620. sp_cache_521_t* cache;
  124621. int err = MP_OKAY;
  124622. #ifndef HAVE_THREAD_LS
  124623. if (initCacheMutex_521 == 0) {
  124624. wc_InitMutex(&sp_cache_521_lock);
  124625. initCacheMutex_521 = 1;
  124626. }
  124627. if (wc_LockMutex(&sp_cache_521_lock) != 0)
  124628. err = BAD_MUTEX_E;
  124629. #endif /* HAVE_THREAD_LS */
  124630. if (err == MP_OKAY) {
  124631. sp_ecc_get_cache_521(g, &cache);
  124632. if (cache->cnt == 2)
  124633. sp_521_gen_stripe_table_17(g, cache->table, tmp, heap);
  124634. #ifndef HAVE_THREAD_LS
  124635. wc_UnLockMutex(&sp_cache_521_lock);
  124636. #endif /* HAVE_THREAD_LS */
  124637. if (cache->cnt < 2) {
  124638. err = sp_521_ecc_mulmod_fast_17(r, g, k, map, ct, heap);
  124639. }
  124640. else {
  124641. err = sp_521_ecc_mulmod_stripe_17(r, g, cache->table, k,
  124642. map, ct, heap);
  124643. }
  124644. }
  124645. return err;
  124646. #endif
  124647. }
  124648. #else
  124649. #ifdef FP_ECC
  124650. /* Generate the pre-computed table of points for the base point.
  124651. *
  124652. * width = 8
  124653. * 256 entries
  124654. * 65 bits between
  124655. *
  124656. * a The base point.
  124657. * table Place to store generated point data.
  124658. * tmp Temporary data.
  124659. * heap Heap to use for allocation.
  124660. */
  124661. static int sp_521_gen_stripe_table_17(const sp_point_521* a,
  124662. sp_table_entry_521* table, sp_digit* tmp, void* heap)
  124663. {
  124664. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  124665. sp_point_521* t = NULL;
  124666. #else
  124667. sp_point_521 t[3];
  124668. #endif
  124669. sp_point_521* s1 = NULL;
  124670. sp_point_521* s2 = NULL;
  124671. int i;
  124672. int j;
  124673. int err = MP_OKAY;
  124674. (void)heap;
  124675. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  124676. t = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 3, heap,
  124677. DYNAMIC_TYPE_ECC);
  124678. if (t == NULL)
  124679. err = MEMORY_E;
  124680. #endif
  124681. if (err == MP_OKAY) {
  124682. s1 = t + 1;
  124683. s2 = t + 2;
  124684. err = sp_521_mod_mul_norm_17(t->x, a->x, p521_mod);
  124685. }
  124686. if (err == MP_OKAY) {
  124687. err = sp_521_mod_mul_norm_17(t->y, a->y, p521_mod);
  124688. }
  124689. if (err == MP_OKAY) {
  124690. err = sp_521_mod_mul_norm_17(t->z, a->z, p521_mod);
  124691. }
  124692. if (err == MP_OKAY) {
  124693. t->infinity = 0;
  124694. sp_521_proj_to_affine_17(t, tmp);
  124695. XMEMCPY(s1->z, p521_norm_mod, sizeof(p521_norm_mod));
  124696. s1->infinity = 0;
  124697. XMEMCPY(s2->z, p521_norm_mod, sizeof(p521_norm_mod));
  124698. s2->infinity = 0;
  124699. /* table[0] = {0, 0, infinity} */
  124700. XMEMSET(&table[0], 0, sizeof(sp_table_entry_521));
  124701. /* table[1] = Affine version of 'a' in Montgomery form */
  124702. XMEMCPY(table[1].x, t->x, sizeof(table->x));
  124703. XMEMCPY(table[1].y, t->y, sizeof(table->y));
  124704. for (i=1; i<8; i++) {
  124705. sp_521_proj_point_dbl_n_17(t, 66, tmp);
  124706. sp_521_proj_to_affine_17(t, tmp);
  124707. XMEMCPY(table[1<<i].x, t->x, sizeof(table->x));
  124708. XMEMCPY(table[1<<i].y, t->y, sizeof(table->y));
  124709. }
  124710. for (i=1; i<8; i++) {
  124711. XMEMCPY(s1->x, table[1<<i].x, sizeof(table->x));
  124712. XMEMCPY(s1->y, table[1<<i].y, sizeof(table->y));
  124713. for (j=(1<<i)+1; j<(1<<(i+1)); j++) {
  124714. XMEMCPY(s2->x, table[j-(1<<i)].x, sizeof(table->x));
  124715. XMEMCPY(s2->y, table[j-(1<<i)].y, sizeof(table->y));
  124716. sp_521_proj_point_add_qz1_17(t, s1, s2, tmp);
  124717. sp_521_proj_to_affine_17(t, tmp);
  124718. XMEMCPY(table[j].x, t->x, sizeof(table->x));
  124719. XMEMCPY(table[j].y, t->y, sizeof(table->y));
  124720. }
  124721. }
  124722. }
  124723. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  124724. if (t != NULL)
  124725. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  124726. #endif
  124727. return err;
  124728. }
  124729. #endif /* FP_ECC */
  124730. #ifndef WC_NO_CACHE_RESISTANT
  124731. /* Touch each possible entry that could be being copied.
  124732. *
  124733. * r Point to copy into.
  124734. * table Table - start of the entires to access
  124735. * idx Index of entry to retrieve.
  124736. */
  124737. static void sp_521_get_entry_256_17(sp_point_521* r,
  124738. const sp_table_entry_521* table, int idx)
  124739. {
  124740. int i;
  124741. sp_digit mask;
  124742. r->x[0] = 0;
  124743. r->x[1] = 0;
  124744. r->x[2] = 0;
  124745. r->x[3] = 0;
  124746. r->x[4] = 0;
  124747. r->x[5] = 0;
  124748. r->x[6] = 0;
  124749. r->x[7] = 0;
  124750. r->x[8] = 0;
  124751. r->x[9] = 0;
  124752. r->x[10] = 0;
  124753. r->x[11] = 0;
  124754. r->x[12] = 0;
  124755. r->x[13] = 0;
  124756. r->x[14] = 0;
  124757. r->x[15] = 0;
  124758. r->x[16] = 0;
  124759. r->y[0] = 0;
  124760. r->y[1] = 0;
  124761. r->y[2] = 0;
  124762. r->y[3] = 0;
  124763. r->y[4] = 0;
  124764. r->y[5] = 0;
  124765. r->y[6] = 0;
  124766. r->y[7] = 0;
  124767. r->y[8] = 0;
  124768. r->y[9] = 0;
  124769. r->y[10] = 0;
  124770. r->y[11] = 0;
  124771. r->y[12] = 0;
  124772. r->y[13] = 0;
  124773. r->y[14] = 0;
  124774. r->y[15] = 0;
  124775. r->y[16] = 0;
  124776. for (i = 1; i < 256; i++) {
  124777. mask = 0 - (i == idx);
  124778. r->x[0] |= mask & table[i].x[0];
  124779. r->x[1] |= mask & table[i].x[1];
  124780. r->x[2] |= mask & table[i].x[2];
  124781. r->x[3] |= mask & table[i].x[3];
  124782. r->x[4] |= mask & table[i].x[4];
  124783. r->x[5] |= mask & table[i].x[5];
  124784. r->x[6] |= mask & table[i].x[6];
  124785. r->x[7] |= mask & table[i].x[7];
  124786. r->x[8] |= mask & table[i].x[8];
  124787. r->x[9] |= mask & table[i].x[9];
  124788. r->x[10] |= mask & table[i].x[10];
  124789. r->x[11] |= mask & table[i].x[11];
  124790. r->x[12] |= mask & table[i].x[12];
  124791. r->x[13] |= mask & table[i].x[13];
  124792. r->x[14] |= mask & table[i].x[14];
  124793. r->x[15] |= mask & table[i].x[15];
  124794. r->x[16] |= mask & table[i].x[16];
  124795. r->y[0] |= mask & table[i].y[0];
  124796. r->y[1] |= mask & table[i].y[1];
  124797. r->y[2] |= mask & table[i].y[2];
  124798. r->y[3] |= mask & table[i].y[3];
  124799. r->y[4] |= mask & table[i].y[4];
  124800. r->y[5] |= mask & table[i].y[5];
  124801. r->y[6] |= mask & table[i].y[6];
  124802. r->y[7] |= mask & table[i].y[7];
  124803. r->y[8] |= mask & table[i].y[8];
  124804. r->y[9] |= mask & table[i].y[9];
  124805. r->y[10] |= mask & table[i].y[10];
  124806. r->y[11] |= mask & table[i].y[11];
  124807. r->y[12] |= mask & table[i].y[12];
  124808. r->y[13] |= mask & table[i].y[13];
  124809. r->y[14] |= mask & table[i].y[14];
  124810. r->y[15] |= mask & table[i].y[15];
  124811. r->y[16] |= mask & table[i].y[16];
  124812. }
  124813. }
  124814. #endif /* !WC_NO_CACHE_RESISTANT */
  124815. /* Multiply the point by the scalar and return the result.
  124816. * If map is true then convert result to affine coordinates.
  124817. *
  124818. * Stripe implementation.
  124819. * Pre-generated: 2^0, 2^65, ...
  124820. * Pre-generated: products of all combinations of above.
  124821. * 8 doubles and adds (with qz=1)
  124822. *
  124823. * r Resulting point.
  124824. * k Scalar to multiply by.
  124825. * table Pre-computed table.
  124826. * map Indicates whether to convert result to affine.
  124827. * ct Constant time required.
  124828. * heap Heap to use for allocation.
  124829. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  124830. */
  124831. static int sp_521_ecc_mulmod_stripe_17(sp_point_521* r, const sp_point_521* g,
  124832. const sp_table_entry_521* table, const sp_digit* k, int map,
  124833. int ct, void* heap)
  124834. {
  124835. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  124836. sp_point_521* rt = NULL;
  124837. sp_digit* t = NULL;
  124838. #else
  124839. sp_point_521 rt[2];
  124840. sp_digit t[2 * 17 * 6];
  124841. #endif
  124842. sp_point_521* p = NULL;
  124843. int i;
  124844. int j;
  124845. int y;
  124846. int x;
  124847. int err = MP_OKAY;
  124848. (void)g;
  124849. /* Constant time used for cache attack resistance implementation. */
  124850. (void)ct;
  124851. (void)heap;
  124852. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  124853. rt = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap,
  124854. DYNAMIC_TYPE_ECC);
  124855. if (rt == NULL)
  124856. err = MEMORY_E;
  124857. if (err == MP_OKAY) {
  124858. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 17 * 6, heap,
  124859. DYNAMIC_TYPE_ECC);
  124860. if (t == NULL)
  124861. err = MEMORY_E;
  124862. }
  124863. #endif
  124864. if (err == MP_OKAY) {
  124865. p = rt + 1;
  124866. XMEMCPY(p->z, p521_norm_mod, sizeof(p521_norm_mod));
  124867. XMEMCPY(rt->z, p521_norm_mod, sizeof(p521_norm_mod));
  124868. y = 0;
  124869. x = 65;
  124870. for (j=0; j<8 && x<521; j++) {
  124871. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  124872. x += 66;
  124873. }
  124874. #ifndef WC_NO_CACHE_RESISTANT
  124875. if (ct) {
  124876. sp_521_get_entry_256_17(rt, table, y);
  124877. } else
  124878. #endif
  124879. {
  124880. XMEMCPY(rt->x, table[y].x, sizeof(table[y].x));
  124881. XMEMCPY(rt->y, table[y].y, sizeof(table[y].y));
  124882. }
  124883. rt->infinity = !y;
  124884. for (i=64; i>=0; i--) {
  124885. y = 0;
  124886. x = i;
  124887. for (j=0; j<8 && x<521; j++) {
  124888. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  124889. x += 66;
  124890. }
  124891. sp_521_proj_point_dbl_17(rt, rt, t);
  124892. #ifndef WC_NO_CACHE_RESISTANT
  124893. if (ct) {
  124894. sp_521_get_entry_256_17(p, table, y);
  124895. }
  124896. else
  124897. #endif
  124898. {
  124899. XMEMCPY(p->x, table[y].x, sizeof(table[y].x));
  124900. XMEMCPY(p->y, table[y].y, sizeof(table[y].y));
  124901. }
  124902. p->infinity = !y;
  124903. sp_521_proj_point_add_qz1_17(rt, rt, p, t);
  124904. }
  124905. if (map != 0) {
  124906. sp_521_map_17(r, rt, t);
  124907. }
  124908. else {
  124909. XMEMCPY(r, rt, sizeof(sp_point_521));
  124910. }
  124911. }
  124912. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  124913. if (t != NULL)
  124914. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  124915. if (rt != NULL)
  124916. XFREE(rt, heap, DYNAMIC_TYPE_ECC);
  124917. #endif
  124918. return err;
  124919. }
  124920. #ifdef FP_ECC
  124921. #ifndef FP_ENTRIES
  124922. #define FP_ENTRIES 16
  124923. #endif
  124924. /* Cache entry - holds precomputation tables for a point. */
  124925. typedef struct sp_cache_521_t {
  124926. /* X ordinate of point that table was generated from. */
  124927. sp_digit x[17];
  124928. /* Y ordinate of point that table was generated from. */
  124929. sp_digit y[17];
  124930. /* Precomputation table for point. */
  124931. sp_table_entry_521 table[256];
  124932. /* Count of entries in table. */
  124933. uint32_t cnt;
  124934. /* Point and table set in entry. */
  124935. int set;
  124936. } sp_cache_521_t;
  124937. /* Cache of tables. */
  124938. static THREAD_LS_T sp_cache_521_t sp_cache_521[FP_ENTRIES];
  124939. /* Index of last entry in cache. */
  124940. static THREAD_LS_T int sp_cache_521_last = -1;
  124941. /* Cache has been initialized. */
  124942. static THREAD_LS_T int sp_cache_521_inited = 0;
  124943. #ifndef HAVE_THREAD_LS
  124944. static volatile int initCacheMutex_521 = 0;
  124945. static wolfSSL_Mutex sp_cache_521_lock;
  124946. #endif
  124947. /* Get the cache entry for the point.
  124948. *
  124949. * g [in] Point scalar multipling.
  124950. * cache [out] Cache table to use.
  124951. */
  124952. static void sp_ecc_get_cache_521(const sp_point_521* g, sp_cache_521_t** cache)
  124953. {
  124954. int i;
  124955. int j;
  124956. uint32_t least;
  124957. if (sp_cache_521_inited == 0) {
  124958. for (i=0; i<FP_ENTRIES; i++) {
  124959. sp_cache_521[i].set = 0;
  124960. }
  124961. sp_cache_521_inited = 1;
  124962. }
  124963. /* Compare point with those in cache. */
  124964. for (i=0; i<FP_ENTRIES; i++) {
  124965. if (!sp_cache_521[i].set)
  124966. continue;
  124967. if (sp_521_cmp_equal_17(g->x, sp_cache_521[i].x) &
  124968. sp_521_cmp_equal_17(g->y, sp_cache_521[i].y)) {
  124969. sp_cache_521[i].cnt++;
  124970. break;
  124971. }
  124972. }
  124973. /* No match. */
  124974. if (i == FP_ENTRIES) {
  124975. /* Find empty entry. */
  124976. i = (sp_cache_521_last + 1) % FP_ENTRIES;
  124977. for (; i != sp_cache_521_last; i=(i+1)%FP_ENTRIES) {
  124978. if (!sp_cache_521[i].set) {
  124979. break;
  124980. }
  124981. }
  124982. /* Evict least used. */
  124983. if (i == sp_cache_521_last) {
  124984. least = sp_cache_521[0].cnt;
  124985. for (j=1; j<FP_ENTRIES; j++) {
  124986. if (sp_cache_521[j].cnt < least) {
  124987. i = j;
  124988. least = sp_cache_521[i].cnt;
  124989. }
  124990. }
  124991. }
  124992. XMEMCPY(sp_cache_521[i].x, g->x, sizeof(sp_cache_521[i].x));
  124993. XMEMCPY(sp_cache_521[i].y, g->y, sizeof(sp_cache_521[i].y));
  124994. sp_cache_521[i].set = 1;
  124995. sp_cache_521[i].cnt = 1;
  124996. }
  124997. *cache = &sp_cache_521[i];
  124998. sp_cache_521_last = i;
  124999. }
  125000. #endif /* FP_ECC */
  125001. /* Multiply the base point of P521 by the scalar and return the result.
  125002. * If map is true then convert result to affine coordinates.
  125003. *
  125004. * r Resulting point.
  125005. * g Point to multiply.
  125006. * k Scalar to multiply by.
  125007. * map Indicates whether to convert result to affine.
  125008. * ct Constant time required.
  125009. * heap Heap to use for allocation.
  125010. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  125011. */
  125012. static int sp_521_ecc_mulmod_17(sp_point_521* r, const sp_point_521* g, const sp_digit* k,
  125013. int map, int ct, void* heap)
  125014. {
  125015. #ifndef FP_ECC
  125016. return sp_521_ecc_mulmod_fast_17(r, g, k, map, ct, heap);
  125017. #else
  125018. sp_digit tmp[2 * 17 * 6];
  125019. sp_cache_521_t* cache;
  125020. int err = MP_OKAY;
  125021. #ifndef HAVE_THREAD_LS
  125022. if (initCacheMutex_521 == 0) {
  125023. wc_InitMutex(&sp_cache_521_lock);
  125024. initCacheMutex_521 = 1;
  125025. }
  125026. if (wc_LockMutex(&sp_cache_521_lock) != 0)
  125027. err = BAD_MUTEX_E;
  125028. #endif /* HAVE_THREAD_LS */
  125029. if (err == MP_OKAY) {
  125030. sp_ecc_get_cache_521(g, &cache);
  125031. if (cache->cnt == 2)
  125032. sp_521_gen_stripe_table_17(g, cache->table, tmp, heap);
  125033. #ifndef HAVE_THREAD_LS
  125034. wc_UnLockMutex(&sp_cache_521_lock);
  125035. #endif /* HAVE_THREAD_LS */
  125036. if (cache->cnt < 2) {
  125037. err = sp_521_ecc_mulmod_fast_17(r, g, k, map, ct, heap);
  125038. }
  125039. else {
  125040. err = sp_521_ecc_mulmod_stripe_17(r, g, cache->table, k,
  125041. map, ct, heap);
  125042. }
  125043. }
  125044. return err;
  125045. #endif
  125046. }
  125047. #endif /* WOLFSSL_SP_SMALL */
  125048. /* Multiply the point by the scalar and return the result.
  125049. * If map is true then convert result to affine coordinates.
  125050. *
  125051. * km Scalar to multiply by.
  125052. * p Point to multiply.
  125053. * r Resulting point.
  125054. * map Indicates whether to convert result to affine.
  125055. * heap Heap to use for allocation.
  125056. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  125057. */
  125058. int sp_ecc_mulmod_521(const mp_int* km, const ecc_point* gm, ecc_point* r,
  125059. int map, void* heap)
  125060. {
  125061. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  125062. sp_point_521* point = NULL;
  125063. sp_digit* k = NULL;
  125064. #else
  125065. sp_point_521 point[1];
  125066. sp_digit k[17];
  125067. #endif
  125068. int err = MP_OKAY;
  125069. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  125070. point = (sp_point_521*)XMALLOC(sizeof(sp_point_521), heap,
  125071. DYNAMIC_TYPE_ECC);
  125072. if (point == NULL)
  125073. err = MEMORY_E;
  125074. if (err == MP_OKAY) {
  125075. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 17, heap,
  125076. DYNAMIC_TYPE_ECC);
  125077. if (k == NULL)
  125078. err = MEMORY_E;
  125079. }
  125080. #endif
  125081. if (err == MP_OKAY) {
  125082. sp_521_from_mp(k, 17, km);
  125083. sp_521_point_from_ecc_point_17(point, gm);
  125084. err = sp_521_ecc_mulmod_17(point, point, k, map, 1, heap);
  125085. }
  125086. if (err == MP_OKAY) {
  125087. err = sp_521_point_to_ecc_point_17(point, r);
  125088. }
  125089. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  125090. if (k != NULL)
  125091. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  125092. if (point != NULL)
  125093. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  125094. #endif
  125095. return err;
  125096. }
  125097. /* Multiply the point by the scalar, add point a and return the result.
  125098. * If map is true then convert result to affine coordinates.
  125099. *
  125100. * km Scalar to multiply by.
  125101. * p Point to multiply.
  125102. * am Point to add to scalar mulitply result.
  125103. * inMont Point to add is in montgomery form.
  125104. * r Resulting point.
  125105. * map Indicates whether to convert result to affine.
  125106. * heap Heap to use for allocation.
  125107. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  125108. */
  125109. int sp_ecc_mulmod_add_521(const mp_int* km, const ecc_point* gm,
  125110. const ecc_point* am, int inMont, ecc_point* r, int map, void* heap)
  125111. {
  125112. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  125113. sp_point_521* point = NULL;
  125114. sp_digit* k = NULL;
  125115. #else
  125116. sp_point_521 point[2];
  125117. sp_digit k[17 + 17 * 2 * 6];
  125118. #endif
  125119. sp_point_521* addP = NULL;
  125120. sp_digit* tmp = NULL;
  125121. int err = MP_OKAY;
  125122. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  125123. point = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap,
  125124. DYNAMIC_TYPE_ECC);
  125125. if (point == NULL)
  125126. err = MEMORY_E;
  125127. if (err == MP_OKAY) {
  125128. k = (sp_digit*)XMALLOC(
  125129. sizeof(sp_digit) * (17 + 17 * 2 * 6), heap,
  125130. DYNAMIC_TYPE_ECC);
  125131. if (k == NULL)
  125132. err = MEMORY_E;
  125133. }
  125134. #endif
  125135. if (err == MP_OKAY) {
  125136. addP = point + 1;
  125137. tmp = k + 17;
  125138. sp_521_from_mp(k, 17, km);
  125139. sp_521_point_from_ecc_point_17(point, gm);
  125140. sp_521_point_from_ecc_point_17(addP, am);
  125141. }
  125142. if ((err == MP_OKAY) && (!inMont)) {
  125143. err = sp_521_mod_mul_norm_17(addP->x, addP->x, p521_mod);
  125144. }
  125145. if ((err == MP_OKAY) && (!inMont)) {
  125146. err = sp_521_mod_mul_norm_17(addP->y, addP->y, p521_mod);
  125147. }
  125148. if ((err == MP_OKAY) && (!inMont)) {
  125149. err = sp_521_mod_mul_norm_17(addP->z, addP->z, p521_mod);
  125150. }
  125151. if (err == MP_OKAY) {
  125152. err = sp_521_ecc_mulmod_17(point, point, k, 0, 0, heap);
  125153. }
  125154. if (err == MP_OKAY) {
  125155. sp_521_proj_point_add_17(point, point, addP, tmp);
  125156. if (map) {
  125157. sp_521_map_17(point, point, tmp);
  125158. }
  125159. err = sp_521_point_to_ecc_point_17(point, r);
  125160. }
  125161. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  125162. if (k != NULL)
  125163. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  125164. if (point != NULL)
  125165. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  125166. #endif
  125167. return err;
  125168. }
  125169. #ifdef WOLFSSL_SP_SMALL
  125170. /* Striping precomputation table.
  125171. * 4 points combined into a table of 16 points.
  125172. * Distance of 131 between points.
  125173. */
  125174. static const sp_table_entry_521 p521_table[16] = {
  125175. /* 0 */
  125176. { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  125177. 0x00, 0x00, 0x00, 0x00, 0x00 },
  125178. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  125179. 0x00, 0x00, 0x00, 0x00, 0x00 } },
  125180. /* 1 */
  125181. { { 0xc2e5bd66,0xf97e7e31,0x856a429b,0x3348b3c1,0xa2ffa8de,0xfe1dc127,
  125182. 0xefe75928,0xa14b5e77,0x6b4d3dba,0xf828af60,0x053fb521,0x9c648139,
  125183. 0x2395b442,0x9e3ecb66,0x0404e9cd,0x858e06b7,0x000000c6 },
  125184. { 0x9fd16650,0x88be9476,0xa272c240,0x353c7086,0x3fad0761,0xc550b901,
  125185. 0x5ef42640,0x97ee7299,0x273e662c,0x17afbd17,0x579b4468,0x98f54449,
  125186. 0x2c7d1bd9,0x5c8a5fb4,0x9a3bc004,0x39296a78,0x00000118 } },
  125187. /* 2 */
  125188. { { 0x66fd07ca,0x1036eb9b,0x6b7fb490,0x6ca52cc1,0xd3e0c270,0x512e973e,
  125189. 0x73d92d11,0x889980bf,0xa4005eea,0x38b4cfe4,0x8ceb4313,0xb6f992cc,
  125190. 0x6daf7c23,0xd0ac2f8d,0xe32a93cb,0x1ccfbf17,0x000000c2 },
  125191. { 0x2f508cca,0x7bd9d6f1,0x595a72af,0xe82d7171,0x97512873,0x25d02976,
  125192. 0x8cf39fbc,0xefc1de8b,0x9a1237f4,0x25e6b77f,0xd4d98b5d,0x9f3b73e7,
  125193. 0xeccb07fe,0xe1fda62b,0x625350cf,0xdb813b03,0x00000014 } },
  125194. /* 3 */
  125195. { { 0x9b27bd61,0x415a1c9b,0x606854d6,0x74522753,0x92e73538,0x9e331ef4,
  125196. 0x817e7a6d,0x0b3dba85,0x49ac273b,0x55c4bd53,0xfcb5417f,0xad42c78d,
  125197. 0x92e08d38,0x528998b9,0xcc1914cc,0x14c2fff6,0x000000c1 },
  125198. { 0x767e9645,0x35b26fb0,0xc5e5a659,0x162b512f,0xcc47fbb8,0xa6e03696,
  125199. 0x0a29a69b,0x732db065,0xd56bdf5d,0x058a74ed,0x25c858d9,0x4b7b60a0,
  125200. 0xbd43373d,0x17f8a6d4,0xedf610b4,0x7b968f51,0x0000011f } },
  125201. /* 4 */
  125202. { { 0x1bc0fa77,0x5f56b5a4,0x64fd36f5,0x6cdd6bb5,0x8a5b7c7f,0xd0ac68b5,
  125203. 0x09919ef9,0x4a92d9bf,0x71c3c520,0xc305e12b,0xdb699aee,0x554a9d1c,
  125204. 0x61f54643,0x7fde0077,0x479115ce,0x99c13124,0x00000039 },
  125205. { 0xc271ac2d,0x25f890e1,0x94b370ac,0x1353ccd3,0x744d4011,0xc7b5adf6,
  125206. 0xbe378127,0x9ccd7687,0x06c4e3cd,0xa8489b5c,0x305505f9,0x1945580a,
  125207. 0x4ab3b12b,0x07190a20,0x1534ea4d,0x0ff53eb1,0x00000159 } },
  125208. /* 5 */
  125209. { { 0x91798548,0x877d4edd,0x031d657a,0xc43c7b25,0xfab18a04,0x47603671,
  125210. 0xf670b476,0x7e39e7f2,0xb02fcc03,0xf7b76431,0x877f46f5,0x7c5662f3,
  125211. 0x1c8b0c61,0x5bf8327e,0x4a8be322,0xe9cdb353,0x000001ae },
  125212. { 0x9d264420,0xa2d7092e,0x533ff3db,0x1f970352,0x99b5b52e,0x31dd232b,
  125213. 0x850f45e9,0x8a9ce16b,0xc3011849,0x01c99023,0xc8e9301e,0x4bc30989,
  125214. 0xcd95f64c,0x77a4de70,0x1026f289,0xbc8797bb,0x000000d7 } },
  125215. /* 6 */
  125216. { { 0x2be9edf8,0x98ea0934,0xfcb98199,0x6c2f3132,0xfaf83aeb,0xf579893d,
  125217. 0xc73fda0f,0x858e87bb,0x7a0b9d1c,0xd3c0b3fb,0x71ee68b1,0x21fe6305,
  125218. 0x66aa6f16,0x5bf8f01f,0xbca825ed,0x30934c99,0x000000d1 },
  125219. { 0x913022f2,0xe4309850,0xde5b80ce,0xfdc336c9,0x8b6130ef,0xb716d689,
  125220. 0xa758d2f4,0x8a58b405,0xaa5cbc1c,0x98879df8,0xc12ce0bb,0x847cfd06,
  125221. 0x8c02ff3c,0xa1006360,0x3438695b,0x836e906a,0x00000136 } },
  125222. /* 7 */
  125223. { { 0x259ce02d,0xac8fe351,0xdae5e0f7,0xa506da0c,0xf043421d,0x77b56e98,
  125224. 0xa1647490,0xe0d041c7,0x9cb90101,0xe41f0789,0xda3e72e6,0x29bbf572,
  125225. 0x04a14df0,0x6b635c47,0xe81ef5d3,0x56873f58,0x000001dd },
  125226. { 0x5cf9e33f,0x77abe79e,0x0a1117fd,0x91aab581,0xcbac2fe1,0x11edf3b1,
  125227. 0xd72113b7,0xef43e017,0x06b74002,0xf9ad685c,0x8fbd3b1a,0x7e6370ce,
  125228. 0x42f73a82,0x550dd50b,0xc5e64a9b,0x8f2146be,0x000001f2 } },
  125229. /* 8 */
  125230. { { 0x2934ed82,0x05a704cc,0x989edd8c,0x647089fb,0x0ce7c62d,0xe0b239d4,
  125231. 0x105a5eff,0x4c892ea6,0xd5ed6b04,0xa519395f,0x509ed794,0x806c7003,
  125232. 0xe70ce5c4,0x882e9886,0xff01f6a9,0x50730ca1,0x00000088 },
  125233. { 0xdbcc5484,0x90a78a16,0xfd454b50,0xc1ab078c,0xcb09e525,0x6f488252,
  125234. 0xe19b2ed7,0xdd663f53,0xa67bf59c,0x16b10da1,0x36bb770a,0xb47f6b95,
  125235. 0x777b2bce,0x6bdc8428,0x561553f8,0xcd02ae3d,0x00000017 } },
  125236. /* 9 */
  125237. { { 0x1579d15a,0x1e3633a0,0x3e98cd1f,0x574f0c23,0xc60f4f99,0x45969dca,
  125238. 0x49fb9f24,0x10062c93,0xd378f640,0xd29a29d7,0xd7d48c2f,0xec941760,
  125239. 0x31fbea5c,0xf0591c59,0xb40f9ebf,0xd6173e6b,0x00000063 },
  125240. { 0x5a984a72,0x220f4f39,0x32510f26,0x9a3f82ce,0x8c069a1d,0xf3d04c76,
  125241. 0x69a21e57,0xf1d6d891,0xdc4db601,0x6b96b30b,0x64dcf3e0,0x71eeb728,
  125242. 0xc7caaff3,0x6f80c483,0x571b66e4,0x45533092,0x000000b0 } },
  125243. /* 10 */
  125244. { { 0x87140dad,0x49ae4521,0x57e2803e,0xda73032b,0x026ea20a,0x13f5e5eb,
  125245. 0x6e00afb9,0x2d54c4b0,0x7a150474,0x4393b92b,0x13f1a7da,0xb5b41bf8,
  125246. 0x02b5867a,0x6d786907,0xaf2ea4d1,0x5193a9ac,0x000001b3 },
  125247. { 0xa6b186cb,0x2a1563f7,0xe28e57b6,0x73a70a44,0x78fc8a1d,0xd7c4fc6d,
  125248. 0xdf3d6d99,0x4c9b4581,0x1e373aab,0x544f5249,0xe913498e,0xe99434a2,
  125249. 0xc4700f4c,0x30159749,0xe5142766,0xb8ef02cc,0x000001d0 } },
  125250. /* 11 */
  125251. { { 0xb9e6ffc9,0xe99805a6,0xf74d977b,0x1a357f05,0x5c9941bc,0xc8ddef31,
  125252. 0xcbe842e7,0x4b6d66ca,0xa20dc12d,0x84e1f75f,0x5f0c02fc,0x8b1b2c50,
  125253. 0x037b493d,0x3fa1889e,0x95705046,0x720bd9e0,0x000001c2 },
  125254. { 0x93ab9309,0x1a1f3378,0x226a8f94,0xe05a30a2,0x4045f1bd,0x2c01a52d,
  125255. 0xab5f5115,0xf42e8fd5,0x0c05fecf,0x954d1d09,0x8d0650d3,0x47e964d1,
  125256. 0x3c860801,0x6866fa5d,0x5abbb4af,0xac2fecbf,0x0000012c } },
  125257. /* 12 */
  125258. { { 0xe5537747,0x846dc3d2,0x1f5f9f46,0xe28e00df,0x3f31e42d,0x041af624,
  125259. 0x256af225,0x4948947f,0xff4f9550,0x3896c61a,0x34bb5a3e,0xcb40c773,
  125260. 0xeceafacc,0xb9becb07,0x4d45e83e,0xfe29f049,0x000001aa },
  125261. { 0x6b5578db,0x83fb71b3,0x0a710526,0x3017f115,0x5f220d77,0x189ec946,
  125262. 0x48465e68,0xba87ae07,0x70e0cbea,0x1da474d5,0x2b2ba7c5,0xb92cb0a6,
  125263. 0x8b1fb7e2,0x35cb356d,0x2cc8cb18,0x1155296a,0x0000000f } },
  125264. /* 13 */
  125265. { { 0x6ed0f604,0x7f9c9d9b,0xcb49c6d7,0x765e43e9,0xae9be5ca,0x03c4dd67,
  125266. 0x405aed36,0x5480888b,0x920ccddb,0x3a69ebb2,0x03f0c7cc,0x44ec0573,
  125267. 0xce89b026,0x158e2437,0x4f179a17,0x86795029,0x0000003a },
  125268. { 0x9f193dd9,0xf7854032,0xdcc158a9,0x531e4068,0x3642b1a5,0x774171bf,
  125269. 0xc1e53aa3,0x12b4920f,0xfd87478d,0xd1c5fb53,0xa7cba7ca,0x48958c58,
  125270. 0x3f66f2c7,0x375b2cb2,0x598899bd,0x1b510d0f,0x000001b8 } },
  125271. /* 14 */
  125272. { { 0x52007e41,0xfe96299d,0xcd708dcd,0x997140b5,0xf655f6fa,0xe9294eed,
  125273. 0xd58b839d,0x7701d45d,0xb6f77cdb,0x5dbdf5ad,0x95a572f0,0x265189f4,
  125274. 0xb3515e7b,0xc162794e,0x72655e0b,0xbfb571e0,0x00000168 },
  125275. { 0xbda82a6b,0xf0d2b863,0x390a9cc7,0x3df5b283,0x700fcd7b,0xbab9995a,
  125276. 0xfa4e6c06,0xc01ef0af,0x76a392d4,0x10a98513,0x955392f0,0xa7e3fc72,
  125277. 0x1d7a8550,0x8e3c0128,0x361898a8,0xcbca551a,0x0000010f } },
  125278. /* 15 */
  125279. { { 0x3ab71115,0xc8a4cd40,0xbcb9b55b,0xb783170d,0xabd9b426,0x1be20f6a,
  125280. 0x5377b714,0x32d2ea64,0x6b358bbf,0xda342480,0x6e202211,0x782bc800,
  125281. 0xaa27c499,0xf80974c4,0x50341cde,0xc2e66fa9,0x0000004e },
  125282. { 0x24ae60c3,0x082cb95b,0x83ad7484,0xd4b80af4,0x6205256b,0x84b739ce,
  125283. 0xae1fe063,0x616f505e,0x342f218f,0xef14ea68,0x64a01186,0x2b17d66c,
  125284. 0x50858bce,0x60e889ce,0xd5881005,0xdb046c59,0x000001e1 } },
  125285. };
  125286. /* Multiply the base point of P521 by the scalar and return the result.
  125287. * If map is true then convert result to affine coordinates.
  125288. *
  125289. * Stripe implementation.
  125290. * Pre-generated: 2^0, 2^130, ...
  125291. * Pre-generated: products of all combinations of above.
  125292. * 4 doubles and adds (with qz=1)
  125293. *
  125294. * r Resulting point.
  125295. * k Scalar to multiply by.
  125296. * map Indicates whether to convert result to affine.
  125297. * ct Constant time required.
  125298. * heap Heap to use for allocation.
  125299. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  125300. */
  125301. static int sp_521_ecc_mulmod_base_17(sp_point_521* r, const sp_digit* k,
  125302. int map, int ct, void* heap)
  125303. {
  125304. return sp_521_ecc_mulmod_stripe_17(r, &p521_base, p521_table,
  125305. k, map, ct, heap);
  125306. }
  125307. #else
  125308. /* Striping precomputation table.
  125309. * 8 points combined into a table of 256 points.
  125310. * Distance of 66 between points.
  125311. */
  125312. static const sp_table_entry_521 p521_table[256] = {
  125313. /* 0 */
  125314. { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  125315. 0x00, 0x00, 0x00, 0x00, 0x00 },
  125316. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  125317. 0x00, 0x00, 0x00, 0x00, 0x00 } },
  125318. /* 1 */
  125319. { { 0xc2e5bd66,0xf97e7e31,0x856a429b,0x3348b3c1,0xa2ffa8de,0xfe1dc127,
  125320. 0xefe75928,0xa14b5e77,0x6b4d3dba,0xf828af60,0x053fb521,0x9c648139,
  125321. 0x2395b442,0x9e3ecb66,0x0404e9cd,0x858e06b7,0x000000c6 },
  125322. { 0x9fd16650,0x88be9476,0xa272c240,0x353c7086,0x3fad0761,0xc550b901,
  125323. 0x5ef42640,0x97ee7299,0x273e662c,0x17afbd17,0x579b4468,0x98f54449,
  125324. 0x2c7d1bd9,0x5c8a5fb4,0x9a3bc004,0x39296a78,0x00000118 } },
  125325. /* 2 */
  125326. { { 0x0f0ccb51,0x80398667,0x3654974a,0xb87e1d01,0xb2b29ed9,0x7f58cf21,
  125327. 0xa3add337,0x06c0e9aa,0xe9d08ffb,0xf13b35d0,0x96761627,0xdd8bf44c,
  125328. 0x758a3ef4,0xa4a18c14,0xa0043adb,0x96a576dd,0x0000013e },
  125329. { 0x632d95a3,0x2bde24f8,0x4c524829,0x79f15ef1,0x9bdaba19,0xaadd863e,
  125330. 0xa962b707,0xdde053f4,0x14258d98,0xc598a2de,0x061c235c,0x9fa5a19d,
  125331. 0xe8ffd32c,0x0ed46510,0xef78ceac,0x2aea9dd1,0x00000185 } },
  125332. /* 3 */
  125333. { { 0xeaaf1fe3,0xd0a91dd8,0x4400b52b,0x0db38662,0x21abf0d2,0xff6a06a9,
  125334. 0xa768c940,0x9412879a,0x9a1eec37,0xf3791abc,0x2738343c,0xc913fbe6,
  125335. 0xe222abc1,0x728b42ab,0x2b9ef313,0x874c0a86,0x00000157 },
  125336. { 0xe6f03d49,0x0ac8f184,0x1e48be03,0xa9c357e4,0x815cbdef,0x02ce5ef3,
  125337. 0x5fd8dc3c,0x7a41c7ab,0xfaeb109d,0x4bef67c9,0xa84f4d38,0x2f98cca1,
  125338. 0x672f0aae,0x7e03d47d,0x1d58968b,0x24b1ab58,0x00000007 } },
  125339. /* 4 */
  125340. { { 0xdf9314e0,0x904f2d4b,0xe7a00aac,0xdaae850d,0x582efb03,0x79231083,
  125341. 0xec7fe6d2,0x80f1c283,0x199d74a8,0x2d5b3996,0x395007e7,0x5f120b9b,
  125342. 0x4773f03e,0x30d23773,0x3b78b686,0xf4c19273,0x00000121 },
  125343. { 0xfa8b51f0,0xf103ff6d,0x40e2bdf0,0xae7afb51,0x83254171,0x1130380e,
  125344. 0xcda10d95,0xe83501b8,0x4f3a8c01,0x1057771e,0xac807069,0x8f52196a,
  125345. 0xa5623821,0x3609b0aa,0x94a0a7f1,0x8c257906,0x000001db } },
  125346. /* 5 */
  125347. { { 0xb2c0958d,0x300370cc,0x69a7b387,0x89aef166,0x480c9b38,0x2792f3cf,
  125348. 0xfab3e149,0x0b2984f2,0x50748967,0x9751e436,0xad33db2a,0x9cab99d5,
  125349. 0xb44a4daa,0x4d945d32,0x16c77325,0xa26cca52,0x0000000a },
  125350. { 0xf9e66d18,0xcdbe1d41,0xaa117e7a,0x80aeef96,0xddb0d24b,0x053214a2,
  125351. 0x5c98b7bf,0x6dcfb227,0xdfd3c848,0x613e7436,0x3ca4d52c,0x6e703fa1,
  125352. 0x18551e64,0x0c8e2977,0xbfa8527d,0xf5e90eac,0x000001c6 } },
  125353. /* 6 */
  125354. { { 0x4ab2d58f,0xa2c2f1e7,0x2a097802,0xc1bbf82c,0x770bb76a,0x6583eb24,
  125355. 0x5667f7bd,0x8e4ed9ed,0xfd96897e,0xd8c01d86,0x3fbe0f15,0x66395a13,
  125356. 0xd99cdcb1,0x51e4f39d,0x720deb25,0xde08424a,0x00000082 },
  125357. { 0x60ea91af,0x97aa53b2,0x7a31dfdd,0xa4384af7,0x5cd09bbe,0xcd82f239,
  125358. 0xf30058e1,0x997c19da,0xe5c78e97,0x443b60c6,0x575b1845,0xfaae9b5f,
  125359. 0x08c2ce16,0x5ce86f33,0x4f63fa86,0x983ce58f,0x00000073 } },
  125360. /* 7 */
  125361. { { 0x8217609d,0xaee93131,0x2412fc00,0x7f8a9dd4,0x286c6329,0xe117e64c,
  125362. 0x7bf1c65e,0xcc3782d6,0x8d03eee5,0xe8c144db,0x9ab93799,0x01acacb2,
  125363. 0xb07784c7,0x215eb1b5,0x1affcd87,0x2c409fa8,0x000000f8 },
  125364. { 0x378139a4,0x007d3766,0xb55bea93,0xc6d969eb,0x68c8bc9d,0xc7c60d6f,
  125365. 0x5f93f242,0x844e8461,0x741717d9,0x8461ca2a,0xf0bf120e,0x8e930e79,
  125366. 0x6b5699d7,0xe1554a02,0x6a4fb6de,0xe69c7702,0x0000007d } },
  125367. /* 8 */
  125368. { { 0x4bee80d7,0x61b51bb0,0x7692de69,0x0e1f6a1f,0xa0ebc3bd,0x8379e46c,
  125369. 0x930644f0,0x1c0bffa7,0x390db077,0x97c67b87,0xfada1ce9,0x095c33e1,
  125370. 0xac54b512,0x3c500add,0xd3118656,0xc231d360,0x000000b0 },
  125371. { 0x39bcab2f,0x06289298,0x64dd220a,0xc0c06780,0x763dc2a0,0x062f6084,
  125372. 0x1938c3e3,0x88e9da73,0x52e46eb9,0x69be8f2d,0x6a5de0fd,0xe55c8d2d,
  125373. 0xdb2c0e26,0xf3a3fd63,0x1e4bff57,0x899c6d9f,0x0000014a } },
  125374. /* 9 */
  125375. { { 0xec05ce88,0x9ff6e3a1,0xb6afd202,0xf8fc2496,0x6fbeb007,0x0b9d2077,
  125376. 0xeebded40,0xb50ec0bd,0x693700f7,0xaef97742,0x3f7b030e,0x806e37a1,
  125377. 0x1b901f77,0x5cf17d17,0xca95ae0f,0x9036e5df,0x00000159 },
  125378. { 0x000e8e0c,0x00af64b5,0x06fb4df9,0xd3f2ae04,0x449f23ba,0x5f61da67,
  125379. 0x255b25a9,0x0ca91842,0x8e33c650,0xfa6af3e6,0xc2c027c1,0x14373c00,
  125380. 0x972840a5,0x99f3cda1,0xd0e84240,0x98c62b79,0x000000e7 } },
  125381. /* 10 */
  125382. { { 0xae4d0f28,0xe8c7c4a8,0x566d006e,0x3a8a55ef,0x066e4023,0x37985f65,
  125383. 0x5d321b76,0x8deccab5,0xb8351b07,0x38b966d6,0x57d548ab,0x2e889e53,
  125384. 0xe631ab0b,0x7a9e8e2f,0xe75c537b,0x45c60f95,0x00000059 },
  125385. { 0x7867d79c,0xbca27d34,0x81c81980,0x7f460b15,0x976b8c51,0x7ec2d9ab,
  125386. 0x61b91ed9,0xfcd04486,0xd9c1d15f,0x730a7a25,0xf94c9db9,0x8a2cf259,
  125387. 0x5dec5a3b,0x8e784b87,0x3e5131ee,0x06252607,0x00000004 } },
  125388. /* 11 */
  125389. { { 0xf1631bba,0xdee04e5c,0x156f4524,0x40e6c1df,0xe4c30990,0x06603f30,
  125390. 0x6b6abec7,0xdb649a43,0xf6b94f6e,0x354f509c,0x36b7e0b5,0x7fecf469,
  125391. 0xba1e6dd2,0xa7a7107e,0x689450ca,0x889edac5,0x00000022 },
  125392. { 0xd05596f2,0x9012916e,0xb023cb8b,0xe3901dac,0xe7d4abe1,0x2501d3ec,
  125393. 0xa9c90313,0xb2815040,0xc6d146d0,0x9dbcd3f1,0x74ee1896,0x6fa1d5b1,
  125394. 0xa91226fb,0x49aea161,0xb8a80984,0x754ceedf,0x00000154 } },
  125395. /* 12 */
  125396. { { 0x4270b2f0,0xb64e27b0,0xbf4d74d7,0x84b34e48,0x0c2722ba,0xb186be8b,
  125397. 0x9ff9b71c,0xf54a589d,0x34fd6bc4,0x9887e4df,0x7412f49d,0xb7c669fd,
  125398. 0x77f89d16,0x4008d9bb,0xc902e074,0xafb9426b,0x000001cf },
  125399. { 0x662935ca,0xcca4f2d1,0x997dcc46,0x2847c703,0x353c79f8,0xc089e9e5,
  125400. 0x5215f0f4,0x9ed8d989,0x80911b9d,0x59cf08bc,0x6de27aa3,0x4b03540e,
  125401. 0xf69e320d,0x52f4d63e,0x94ef193b,0xa0217fd6,0x000000e6 } },
  125402. /* 13 */
  125403. { { 0x74214780,0xb77de627,0x207459ea,0xca066817,0xe9c7fb01,0xf78579b7,
  125404. 0xd6d4b7c7,0xe55548c1,0xa66caa39,0x45756190,0x98505a4f,0xf8141b03,
  125405. 0x4c8864eb,0xa5ca0d7c,0x9e129d3f,0xbf8af950,0x00000053 },
  125406. { 0x85285092,0xbc9b29d8,0x8eed5e5f,0x82f31daa,0xf618aab9,0x9c33690e,
  125407. 0xd2626ed1,0x0eee14f4,0x07ed8e09,0x4229570b,0x8736d040,0x1977920e,
  125408. 0xede7d01d,0x47ee25ff,0xbc7ab73b,0x3c921c3a,0x000001b9 } },
  125409. /* 14 */
  125410. { { 0xa08b2b14,0x0b6a07cc,0xbf174c7f,0xaa978deb,0xc40cb2a4,0x291cb828,
  125411. 0x90adc838,0x95c78272,0x8c1edde6,0x08da8b2a,0x90fbd220,0x741ceb2f,
  125412. 0x322db94e,0x5f89c9e5,0xb73c548e,0x18266085,0x0000007d },
  125413. { 0x2defd012,0x69ebf82a,0x5a1537ef,0x01ecb094,0x3ef0811d,0x3c557535,
  125414. 0xb2bd4dea,0x59c882a7,0x7bf969c8,0x00a1f972,0x0b25ad1b,0x063adf5e,
  125415. 0xf2536005,0x4c1ff306,0x4112fe18,0x8e515bec,0x00000117 } },
  125416. /* 15 */
  125417. { { 0xefe3d3d5,0x9314787f,0x9d897227,0x29e76f65,0xe0b6acf5,0x15c77ed1,
  125418. 0x1c5e8dd9,0x9c2b7b20,0x5f5667af,0x788038f1,0xf3576ef4,0xf38c766f,
  125419. 0x0040154a,0x9f0623c8,0xde883b53,0x47d3c44b,0x00000096 },
  125420. { 0xde1b21a4,0x32075638,0x571081c1,0xbb6399c1,0x75c03599,0x322e6067,
  125421. 0xade60cf5,0x5c7fde7f,0xefc19059,0x1b195440,0xdd7b3960,0x7e70ac8c,
  125422. 0x6a6fa73e,0x4aa5a83d,0x63080764,0x34f8cfac,0x00000042 } },
  125423. /* 16 */
  125424. { { 0x286492ad,0xee31e71a,0x65f86ac4,0x08f3de44,0xda713cb4,0xe89700d4,
  125425. 0xa86b7104,0x7ad0f5e9,0x2572c161,0xd9a62e4f,0x25cc1c99,0x77d223ef,
  125426. 0x3b962e0c,0xedff6961,0x81d8b205,0x818d28f3,0x0000008e },
  125427. { 0x8cdf1f60,0x721231cf,0x6717760f,0x8b640f2b,0xe045a403,0xbe726f8c,
  125428. 0x0370689f,0x422285dc,0x72ea0dcb,0x7196bf8f,0xc8086623,0xa16f7855,
  125429. 0xc326fe48,0xd4e19fc7,0x8f68bf44,0xfdbc856e,0x0000013e } },
  125430. /* 17 */
  125431. { { 0xe6a3ace5,0xde34d04f,0x896191c1,0x0dbb603e,0xf75ed0f4,0xb4dc0007,
  125432. 0x95b259b5,0x15e0e6bc,0x2615f020,0xdfbcba66,0xd31ea3f8,0xb2ec5433,
  125433. 0x103ff824,0x42b0b0e4,0xc480332e,0x19315060,0x00000111 },
  125434. { 0x045452f1,0x9997ea28,0x71f3f73b,0x80b678cf,0x41e9328e,0x4a52bddc,
  125435. 0xe6af1c23,0xb7f2656e,0xb44215e7,0xc43805b9,0xf0a4028b,0x3aa734f2,
  125436. 0x422476e2,0xe3c72479,0x68c60cf7,0x6dc2e8b0,0x000001f1 } },
  125437. /* 18 */
  125438. { { 0xfffc0de5,0xbcdfae6f,0xab4a5f24,0xa801814f,0xea2aa8dd,0x19013658,
  125439. 0xda4f0441,0xf3b1caf5,0x34100611,0xf24b9cdb,0x96e0cf88,0x48c324ed,
  125440. 0x23055c82,0x4b7ea334,0x89092e29,0x6e835b64,0x000001d3 },
  125441. { 0x07372f27,0x7eb77ae7,0x83bae19a,0x4779b4fa,0x65429ebb,0xa175dae1,
  125442. 0xfc03ef3f,0x942ec266,0x6991c7c4,0x0e5fc6a9,0x56253d3c,0xa0f61e4f,
  125443. 0xde74e738,0x7a11ff58,0x624de919,0x60524cd4,0x00000002 } },
  125444. /* 19 */
  125445. { { 0x01342e08,0x45b5d0ca,0xb749f0af,0x509ed4f0,0x6529d804,0xeb5502d9,
  125446. 0x6d80359c,0x5eb087db,0x4c384800,0xeaa66a87,0xc75a8784,0xe972c7a0,
  125447. 0x6874317e,0x8c169e21,0xe5c9fbf4,0x81c556e0,0x0000014f },
  125448. { 0xe120674d,0x26b0b12b,0x219f00ac,0xc6bf09b9,0xd658caa6,0x1e1e732d,
  125449. 0x8292d99e,0xc771c5af,0x25fdbf80,0x5d813529,0x3666c37d,0xe61bd798,
  125450. 0x1d0df680,0x8dac946a,0xc39f0983,0x58dcf684,0x0000009f } },
  125451. /* 20 */
  125452. { { 0x7b7dc837,0x14169102,0xb50eb1c4,0x2d719754,0xd7e6741b,0x04f4092a,
  125453. 0xbc824a38,0x1d0a7f1d,0xc8e20bcf,0x570b2056,0xda181db0,0x6732e3b9,
  125454. 0x0a7b508a,0x7880636e,0xc9f70492,0x11af502c,0x00000045 },
  125455. { 0xc56f4ffa,0x0b820d94,0xc4f0c0fa,0x1c6205a2,0xa1a0606a,0x99f33d4e,
  125456. 0x79b316fb,0x1bab6466,0xe4f240fc,0x05aa0852,0x92d7dc43,0x22539b78,
  125457. 0x06e3c073,0x03657f12,0xcedb6633,0x28405280,0x00000059 } },
  125458. /* 21 */
  125459. { { 0x4397760c,0x90d08711,0x1c9fcd06,0xb9020b76,0x987e24f7,0xc7fec7fa,
  125460. 0x522335a0,0x0e33b8a0,0xae21ca10,0x73dbeafd,0x3b032220,0x458c060a,
  125461. 0xee145da6,0x9b9c73b8,0x27ff62ef,0x31c661e5,0x000000aa },
  125462. { 0x81430b5e,0xaf518eb0,0x50ee0d69,0xb32f9cea,0xaa6ebe8b,0x0ecdb0b5,
  125463. 0x9fe1d689,0x1f15f7f2,0x1a59cc9a,0xce5d68f3,0x08ab2a63,0xf4d67994,
  125464. 0x4347ce54,0xe85b1cef,0x286d0776,0x8ff423c0,0x00000176 } },
  125465. /* 22 */
  125466. { { 0x33dcec23,0x8564104c,0xcdd07519,0xbaf0d61b,0x4c4f309a,0x486daf51,
  125467. 0xde488715,0xf01bc8f5,0xd3539ba3,0xddd6baf1,0x3a3be8ec,0xbb7e665d,
  125468. 0xcb5d865f,0xf919dac3,0xf12149a0,0xfe203da3,0x00000173 },
  125469. { 0x78d4a3d1,0x043ae9a1,0x865316d8,0xa4d5cf58,0x41176463,0xeaf026c0,
  125470. 0xf84afa44,0x316c638f,0xffea422d,0x512f2397,0x6622b613,0x691eaa04,
  125471. 0x97e7068d,0x48856ea3,0xf4a1b33c,0x42d1b2e3,0x000001b5 } },
  125472. /* 23 */
  125473. { { 0x1f487402,0xf51b2d5e,0x7aaf1dd5,0xe36016e6,0x6da9c20a,0x1eb3f1f5,
  125474. 0xece45bfd,0x25b7d361,0x027a9e18,0x42db0633,0xe8411649,0xbf228777,
  125475. 0x458773d0,0xf5fce0c4,0x2dd7a5f0,0xb2b3151d,0x0000001f },
  125476. { 0xfbaa096a,0x102773e8,0xe093a878,0x152726eb,0x2c7f1781,0x5c53cd07,
  125477. 0xab5dca76,0x38d3dfd0,0x87ef2d4a,0xbb4a7d85,0xb7eb11c2,0x5c9c2013,
  125478. 0x0b6da22f,0x5e353c34,0xa325ecad,0x846d50a5,0x00000039 } },
  125479. /* 24 */
  125480. { { 0x1677df58,0x76da7736,0x1cb50d6c,0x364bd567,0x0a080ff2,0x0443c7d7,
  125481. 0x86532430,0xa0a85429,0xc35101e7,0x82002dd2,0x48c5cd76,0xbebc6143,
  125482. 0xca6cf13f,0xff1591ae,0x98bf8dc0,0x91c7c2e6,0x000000fb },
  125483. { 0x12de14d5,0x6a7c5cad,0x6561c822,0xbc448c5f,0x7cdbb3da,0x9f8de430,
  125484. 0xc76811d7,0x9c58f011,0x75462049,0x1e89806e,0xc9a74e49,0xe52ad0a2,
  125485. 0xb2be37c3,0x2034685c,0x0a0bc72d,0x7a863245,0x000000ec } },
  125486. /* 25 */
  125487. { { 0x8a86786e,0x33818c21,0x2137e2c8,0xed537f74,0xa7e6eb20,0x5d9690d1,
  125488. 0x5cdc4803,0x9790ec70,0x24f7bd75,0x469162c8,0x4e1f0f14,0x09e7ef9d,
  125489. 0xce9915ca,0xd30c128b,0x6c71226f,0x810145f6,0x0000002d },
  125490. { 0xb71d87e5,0x312749f5,0x7b02ceda,0x25f3b141,0xe0baff16,0x02456d2e,
  125491. 0xfcae6627,0x97f7b3a9,0x37bd985f,0x0d6ebf8f,0x7fa6d0c1,0x20aa81b9,
  125492. 0x21f2f137,0xb29f1a01,0x5cc0ddb1,0xe326a2f8,0x0000003d } },
  125493. /* 26 */
  125494. { { 0x38c2ee78,0x26f3398b,0xa75a0bee,0x40c3d101,0x565a7f8e,0x35a31706,
  125495. 0x04019e5d,0xd12985e3,0xb8174b6e,0x21e2a642,0xaf80a52a,0x25a15ee8,
  125496. 0x8518d80e,0x5d1e0fe6,0x04f6ea9a,0x8cbbc138,0x00000084 },
  125497. { 0xdfd45169,0x76828690,0x59d3e8d0,0x38d7e098,0xcdb8bfc2,0x23758811,
  125498. 0x162cf648,0x8499547a,0xb4d15b8c,0x494bab3b,0xc60499a6,0x822cbc57,
  125499. 0xa8a1cfed,0xac43224e,0x57c6598b,0x43563469,0x000000d9 } },
  125500. /* 27 */
  125501. { { 0x68271323,0x2b069253,0x49cd04d7,0x24d9e0a8,0x2b31cc7d,0xaae35fbf,
  125502. 0x57a3e361,0x44f64b4f,0x0294e856,0x14904686,0x43ced4ae,0xddc82ee7,
  125503. 0x7e2cda47,0xcb92a6a5,0xbfc1f968,0x989c42ef,0x0000013f },
  125504. { 0xb8651600,0xbed98bdf,0x7a3cfaee,0x8c363434,0x35b1a226,0x93a12543,
  125505. 0xd5825507,0x558da7dd,0x852eb1e9,0xa5173b23,0x2295f545,0xdf5ae585,
  125506. 0x6646d101,0xe546e2ef,0x5d89f862,0xf7e16a2c,0x000001fa } },
  125507. /* 28 */
  125508. { { 0xc7ec136d,0x0d746c8e,0xcd11351b,0xf8e1d827,0xf187a116,0x764a3ad3,
  125509. 0x136e8465,0x2f1b968f,0x850983c2,0xd41aa294,0xbe717259,0x2123ecc4,
  125510. 0x763c149c,0xdcdcab52,0x1022b82d,0xa7f50b18,0x0000016d },
  125511. { 0x0ca5e258,0xf99e532d,0x97b62a7b,0xa148ad17,0xc77fddef,0x8d0a242e,
  125512. 0x74f9b6c4,0x58518bcd,0x7fd122d4,0xc53b30b8,0xfb50b2d7,0xbb8cd193,
  125513. 0xbc01aae9,0x1a169aee,0x1de26e09,0x7e49b10a,0x000001c5 } },
  125514. /* 29 */
  125515. { { 0x21210716,0x2cabe675,0x07e02400,0x81a296a3,0x8c83795b,0x94afc11d,
  125516. 0xdd9efa6a,0x68f20334,0x677d686f,0x5be2f9eb,0xbf5ce275,0x6a13f277,
  125517. 0xb9757c5c,0xf7d92241,0xc74f4b8c,0x70c3d2f4,0x00000132 },
  125518. { 0x8d209aa4,0xf9c8609c,0xdb2b5436,0x46f413a2,0x2992345d,0x96b72d1a,
  125519. 0x9487c34f,0x186f2aeb,0xb440a375,0x4fa72176,0x7da5358e,0x3a420936,
  125520. 0xff25b310,0xf11eade3,0x505d60b8,0x9a570153,0x000001a9 } },
  125521. /* 30 */
  125522. { { 0x6e7495bb,0xae151393,0x490879d1,0xebd2fd28,0x29fd76fc,0x9c232b0b,
  125523. 0xc60e721c,0xa1a0d49b,0x517a09e2,0x9f582b83,0x9d8badf8,0xac37809e,
  125524. 0x0ad48bb4,0x4aa4de9e,0xcb6cc487,0xfd041312,0x00000027 },
  125525. { 0xead4fb6d,0xc05502ee,0x0a602cbe,0x760c25ed,0xbd7f4a07,0x58ba6841,
  125526. 0x54edce14,0xc28b6032,0x0397614c,0xb9d41e39,0x181eed93,0x4221b71d,
  125527. 0x332d4b0b,0xd010e3c2,0xdab0e419,0xdfe58a27,0x00000096 } },
  125528. /* 31 */
  125529. { { 0x7debd24e,0x4cd6fcd6,0x9ae2b075,0xbe3fca60,0xf217c26c,0xa7d8c22e,
  125530. 0xb9620e3f,0xd42d03e0,0xc7f9f87d,0x634bf216,0x8972ffee,0x22b1ec53,
  125531. 0xd60d3e77,0x83a957c1,0x0f6a537e,0xedfe5f86,0x00000162 },
  125532. { 0xf0ea20b8,0x40a05400,0x1d796900,0x2872ac7e,0x0edb0cac,0x7765a5c9,
  125533. 0xb62939a7,0x9df5b930,0xaf2cb708,0xf78a676e,0x52febc12,0x030732bf,
  125534. 0xba190ad3,0x3a6640de,0x93e7e341,0x36eae15f,0x000000d5 } },
  125535. /* 32 */
  125536. { { 0xa1c88f3c,0x6c6119f6,0x2ec6944a,0x924e5fec,0x5742ff2a,0x4c8aac60,
  125537. 0xddb22c7c,0x60adde1e,0xfa5d25bb,0x9728938c,0xec117de0,0xfa5ac4f7,
  125538. 0x482929c1,0x41f35ab7,0x0afd95f5,0xd1c4e8f9,0x00000180 },
  125539. { 0xa7cd8358,0x2fc4e73d,0xf2a1c920,0x39361a57,0xad94d288,0xf6f2f130,
  125540. 0x2b6a78e2,0xe37e2466,0x79c262cd,0x0babff8b,0x61b597b9,0x6cae01ef,
  125541. 0xa60d4e64,0x9c1e33f0,0xdd01f845,0x52a42280,0x0000000e } },
  125542. /* 33 */
  125543. { { 0x0f013755,0x72d640a4,0xfb8380e9,0x0b6dce77,0x7eb64b31,0x2789ce79,
  125544. 0x93ca5a36,0x8e704b0b,0x58bdffc9,0x18c360ff,0xb230c372,0x53b1f323,
  125545. 0x5a7385d1,0xd6b39088,0x56b93bf7,0x071130f5,0x0000004a },
  125546. { 0xfeef3f88,0x29a2096b,0xb82b3945,0x22eba869,0x872664a7,0x7fe2184a,
  125547. 0x858ff942,0xa0dc0ba1,0x7490c9da,0x33799eb5,0x81588ce8,0x1d356f62,
  125548. 0xa7b2cee2,0x7dd9bc7f,0xa3cfaee9,0x1e61a4e8,0x000000d2 } },
  125549. /* 34 */
  125550. { { 0xe9068656,0xec5db629,0x9fede4df,0x623bd70c,0xfcd45546,0xc78ad5bd,
  125551. 0x6291a741,0xf7981dd2,0x761e688e,0x3ac53d92,0x55b9272f,0x6a96892a,
  125552. 0x06546fec,0x4217e7b8,0xab9e2f56,0x793c03cb,0x0000015e },
  125553. { 0x6eff39be,0x08fd9543,0xdbff4f68,0x5a1af07e,0xb0241616,0x83d47abd,
  125554. 0xd4798029,0x37c5d2fd,0x60b2e6fb,0x9d86d978,0xce8db998,0xe3e3284e,
  125555. 0xd868b9bb,0x9f049eb5,0x9dad18b3,0x3b3e8a78,0x0000018e } },
  125556. /* 35 */
  125557. { { 0xe51e61f0,0x57026c56,0x307f2757,0xdddbcaa3,0xb1aeaf41,0x92a026eb,
  125558. 0xe2d7f5ba,0xa33e937c,0xbc5ead91,0x1f7cc01e,0x2e46807d,0x90ab665d,
  125559. 0x53419519,0xc2a44f55,0x79664049,0x099c1ca6,0x000000aa },
  125560. { 0x8f97e387,0xb561a909,0x45e1dd69,0xf6051778,0x7ff1d6ab,0x1ffa512b,
  125561. 0xd09a9c89,0x42da55a4,0xd2282e2b,0x5e5a7c71,0xe74185ad,0xdfa5a203,
  125562. 0xea0baeff,0x19b1369d,0x1ecc0a16,0xa5eef914,0x000001a3 } },
  125563. /* 36 */
  125564. { { 0x7a573b81,0x2af20d0a,0x66194cef,0x7eac1ca8,0x0b711c34,0xef0d2d8d,
  125565. 0xba099d42,0x6aea016c,0x5067a8ca,0xa6609d28,0x7a1351ef,0x6a52c600,
  125566. 0xb11c2634,0xdab85818,0xbb1c033c,0xf17fa45d,0x00000121 },
  125567. { 0xfc3279d6,0x9fb8b87a,0xc201f1e1,0xe30e76ab,0x806c21dd,0x02af6a83,
  125568. 0xc63f824f,0xeafd7e2b,0x46bd1a53,0x7b074e26,0xa2139164,0xcd6f4931,
  125569. 0xc172d9bf,0xab2cfd39,0x4db59cf1,0x62f3eb4b,0x0000010a } },
  125570. /* 37 */
  125571. { { 0xe0689a1b,0xe402de36,0x7dcafe72,0x9dccc9fd,0x255d0bfb,0xe4dead7e,
  125572. 0x4ada04d9,0xd7ee87ee,0xbfd2e774,0x5a85039e,0x770b2b9b,0x282c6657,
  125573. 0xba103bba,0xa7aca826,0xc7cd5071,0xac7028ba,0x0000011a },
  125574. { 0x680c8f04,0x2e61d39c,0xb48b3b5e,0x2f09c4cc,0x95744f3c,0x131609bd,
  125575. 0xaaccb593,0x6d72e4b4,0x5adfb209,0xdb7060ca,0x1fd3eccf,0xc67d9e43,
  125576. 0xe1752a73,0x1487a26f,0x64d0857c,0x3d953663,0x000001e3 } },
  125577. /* 38 */
  125578. { { 0x4cec9e7f,0xe664506b,0x30aab98f,0xa44564b4,0x173fa284,0x5e1b501f,
  125579. 0x15c97472,0xe7b7bd7e,0x82dec033,0xd6cc67a8,0x0a63b762,0x1fe2e934,
  125580. 0x3f8e2fcd,0x3a084e1b,0x9ae6e752,0xccce4da8,0x000000fd },
  125581. { 0xc12fd820,0x0797f8ee,0x96da4733,0x325f892a,0x55997bf4,0x597d241d,
  125582. 0x02b753cf,0x3aef35ac,0xf677ceba,0x8a73f95d,0xd1bbac6c,0x5b2892b7,
  125583. 0xcc5278b0,0x90751583,0xa47f45f6,0x2f5ed53f,0x0000001c } },
  125584. /* 39 */
  125585. { { 0xab40b79c,0x3914165e,0x25b489a8,0xbfb6eed8,0x8a6c107f,0xda136b7d,
  125586. 0x8e01f28b,0xd431db8b,0xa4d79907,0x84e5d0dd,0xa471e685,0x69a91472,
  125587. 0x98376ff8,0x58d06969,0xc46311fd,0xce369b74,0x00000006 },
  125588. { 0x1add1452,0x6c0773d1,0xed8e9a2a,0x2e4e9c95,0xca15a40c,0xe8ff8e32,
  125589. 0xaf62f18f,0x3fcb7d36,0xeec9484b,0x2ca336ee,0x3b20405b,0xa4d6e7a9,
  125590. 0x956d8352,0x6d90d031,0xd9ca03e7,0xdd375603,0x000000e5 } },
  125591. /* 40 */
  125592. { { 0x8b481bf7,0xcc5f297d,0x2a13383c,0x06a2a3e4,0xdc40b96c,0x9e14528c,
  125593. 0x1189da3c,0x9a2bf35f,0x6cd57fa7,0xb8adb989,0x9357d32b,0xc1a4935c,
  125594. 0xc2d76fad,0x51fb2580,0x24f23de1,0x98721eb4,0x000001ba },
  125595. { 0x52a4b397,0x8c02daaf,0x0d0b4e54,0xc3c5f4cc,0x7b7e79cd,0x29be4db3,
  125596. 0xb33970b6,0xf34336ec,0x92808c7f,0xed3dcb7c,0x02288db1,0xec290eff,
  125597. 0xe96ed59a,0x2a479d51,0x76d8fa5f,0x9d7ed870,0x00000092 } },
  125598. /* 41 */
  125599. { { 0xe660043c,0xd8edaf0b,0x016e074d,0x84aa2ccb,0xe2cc3b3d,0x9d2368e7,
  125600. 0x5c269fc4,0x47b50130,0x3de33e36,0xd0194ee1,0x789ca504,0xdb3361b9,
  125601. 0x984db11d,0x8cd51833,0xc8ec92f0,0xd5b801ec,0x000000c6 },
  125602. { 0x47ab9887,0x33f91c15,0x6b5ab011,0x2f285e2a,0x133fc818,0x9b734e5a,
  125603. 0x38d8692c,0x5c435a74,0x43282e81,0x3c92b47c,0x9c7bcdaa,0x191231f5,
  125604. 0x4d158c86,0x3ae425c3,0xc5a23cca,0x7f568feb,0x00000011 } },
  125605. /* 42 */
  125606. { { 0xbf5caa87,0x8ccbd9d5,0x68dd8c9d,0x17bfc60f,0xc7d4dede,0x63eb4dbb,
  125607. 0x8270b5bf,0xbf6e5945,0xcc098fe7,0x887137a5,0x05d7b8f5,0xca5eb687,
  125608. 0x4b25a533,0x4b7deeee,0x4a700a6c,0x8e045c32,0x000000ef },
  125609. { 0x70cf52bc,0x160c1c92,0x90cc6298,0x4bf3f63a,0xbf3028fb,0x5fff421c,
  125610. 0x523beff1,0x0a8102d7,0x8b9ce105,0xff3309a3,0x06621b1e,0x8e9da4d0,
  125611. 0xcc0a7807,0x9775f89f,0x00178612,0x59044865,0x000000eb } },
  125612. /* 43 */
  125613. { { 0xebbd33ec,0x8a6664fd,0xce5ad579,0x0cf9a660,0x50fb56ed,0xecd06c05,
  125614. 0x1d5aaa6e,0xb4ca5fad,0x948a7f07,0x36daee5b,0xefe1c11a,0xd2e37887,
  125615. 0x91d2544b,0x41f61ac4,0x2bffd8ea,0x49df7071,0x000000be },
  125616. { 0x65acdb56,0x60e2f1f5,0x5e5e5bde,0xf2f13c84,0xe17a0412,0xb97fd354,
  125617. 0xd9c93bef,0x8a2867cf,0x25a957e4,0x9ca9d16b,0x4a18635f,0x1f55c19b,
  125618. 0x8d26ae71,0x9b3868f5,0x4c94541d,0xac448041,0x00000000 } },
  125619. /* 44 */
  125620. { { 0xd4ad38db,0x6c1bcf89,0x3d714511,0x1180f381,0xcb70243a,0x5b4c2759,
  125621. 0x163a716c,0x5dd64d63,0x13648bdb,0xbbd2efea,0xe4de9969,0xa47187f9,
  125622. 0xe2de8c45,0x65de6912,0x4bdad0a7,0xe075f29c,0x00000048 },
  125623. { 0x5e4dd88d,0x00335474,0x80577afc,0x18283638,0x227288f7,0xe4b35c01,
  125624. 0xe68989de,0xd008fd91,0xcd3f71ba,0x42142315,0x3e4da1e2,0x5cb023ff,
  125625. 0xb5662bb1,0x7e6b9c35,0x7fb04fe5,0x143f4165,0x00000072 } },
  125626. /* 45 */
  125627. { { 0x26f40f2c,0xb06b046c,0x6cd7c31d,0xbd5d246c,0x1953a9b7,0xaaa56270,
  125628. 0x8f00436f,0x5ac929b8,0x21d0660d,0x1937392c,0x9bd6dbe6,0xd279ed15,
  125629. 0xd17c43f9,0x377c4d5a,0xb8fcd025,0x800eda50,0x00000179 },
  125630. { 0x36132f31,0xb88ddc0b,0x2ade73a3,0x6f8f4f01,0x203de2b9,0x38859ec3,
  125631. 0x231b6533,0xedb03814,0xa14093ca,0xad08cd20,0x5c2be2f9,0xb9f86d44,
  125632. 0xf6ebc09f,0xfd3d9532,0x1aef478d,0x757b5899,0x0000013d } },
  125633. /* 46 */
  125634. { { 0x580f894b,0x7d9ad100,0xd925e46f,0xb612488a,0x2e5a6865,0x45497e14,
  125635. 0x17f9a813,0xc86e1053,0xf8a33541,0xd8aa820a,0x7a66d578,0xa6790660,
  125636. 0x5f758e23,0x47df60ae,0xa7f8ab5c,0xcadd4c90,0x00000107 },
  125637. { 0x6764ad0e,0x356b044f,0x250189b3,0xf69fe0e1,0x5f14db6a,0x2deaca62,
  125638. 0x1bd77d54,0xe9f2779f,0x5cfa895c,0x979911f2,0xb6f19ac3,0xd4e94ced,
  125639. 0x01af44b1,0xc3533417,0x50c727f5,0xcac43fff,0x0000003b } },
  125640. /* 47 */
  125641. { { 0x83c1d4cf,0x1742951c,0xb245c34f,0xe03791d0,0x9c2dcc71,0xea8f8ef6,
  125642. 0x2a310767,0x2ea57a29,0xb12948bd,0x255b46bb,0x0feaeb83,0x2adc1e09,
  125643. 0x449abf59,0xa0d2d18c,0xc4a8a689,0x9e8c9ff5,0x00000019 },
  125644. { 0xeb28171a,0xc9f7b9cd,0xd576987b,0xefd78403,0x22ff824c,0x58b4f3bf,
  125645. 0xbf333cc5,0xee09b393,0xb01ceb72,0xebff83a2,0x220299cd,0x5bb34c45,
  125646. 0x66ebf751,0xa3c3e8a0,0x49d05cf3,0x5dee07bb,0x000001a6 } },
  125647. /* 48 */
  125648. { { 0xb114257b,0x09a958d6,0xd4975e30,0x729afd41,0x3aae7b11,0x072879b5,
  125649. 0xedd1ac83,0x0791b093,0x1eb67975,0xcfefc7d1,0xe2675b4a,0x0e54bd37,
  125650. 0x8d69517f,0x89a62d7e,0x202109a3,0x96f805d8,0x0000006b },
  125651. { 0x57b5f9f4,0x4815d517,0x405b44d1,0xe5c9e436,0xe4870160,0x3442dde0,
  125652. 0x1ef6b3f8,0x953fef95,0xf7497faf,0x919e4cf5,0x016ef0b7,0x24e3cc4d,
  125653. 0x2512eeed,0xfc5caa87,0xa3bd1703,0xf1ba4029,0x000001b6 } },
  125654. /* 49 */
  125655. { { 0x529252ac,0x2a668435,0x74e7b0d8,0x3da626c0,0xe0be86ab,0x55080cc1,
  125656. 0x4ed5dc53,0x534a53f7,0x0cd41fd0,0xa9eff140,0x5674891c,0x0e7c945c,
  125657. 0xec53b5ad,0xdea4b895,0x15150988,0xefc67bef,0x000001ff },
  125658. { 0x306033fd,0x988dc109,0xf36875d9,0x1b287979,0xe3c335c5,0x4d39af26,
  125659. 0x124e29d6,0xa47259fd,0xc41dbdfc,0x5d60c570,0x0cc0d895,0x06224b61,
  125660. 0xeea8ff86,0xa041d4e5,0xae4d8707,0x2920e15c,0x000001fd } },
  125661. /* 50 */
  125662. { { 0xcd67da85,0x66d15f0c,0x5ac54a15,0xae98b6f4,0xf1ac71c3,0x2f05e021,
  125663. 0x47559224,0x1feb2226,0x66e856dc,0x2a2f1561,0x6fb4ba47,0x65eb1456,
  125664. 0xa29d920b,0x34688bd2,0xf9d4cb9b,0x943ce86e,0x00000061 },
  125665. { 0xaac91174,0xb4696218,0x41dd9234,0x85b519ec,0x9f0763a4,0xb7efadf2,
  125666. 0x712c8b33,0x98517f27,0xb0538630,0xa02e7ec3,0x1ff3e3e4,0x46bc45bb,
  125667. 0x29496486,0x46ae896f,0xebd2b93f,0x2aeb1649,0x00000146 } },
  125668. /* 51 */
  125669. { { 0xe8e4d3c3,0x1f34f41f,0x5bb7e9db,0xc80d87ff,0xd910b579,0xf0216c0a,
  125670. 0xb87349ae,0x2a24b761,0x2b0a6cc0,0x054bc528,0xaf2d1957,0x3b4c7029,
  125671. 0xadbe6cdd,0x0e4b90e2,0x26060a34,0x8e774f81,0x000000cf },
  125672. { 0x2e229950,0x3c7f9dbc,0xd9f82b70,0xab11f846,0xf10c05f3,0x2b7ad9a3,
  125673. 0x0f1820ca,0x203ead4f,0xccbfb332,0x51dbcbc8,0x066706f1,0x3bd9caf0,
  125674. 0x06059d5e,0x5a39be25,0xdcafe64e,0x984387c8,0x0000014c } },
  125675. /* 52 */
  125676. { { 0x8e011531,0x708a757f,0xc3dcd57c,0x7f45b172,0xc2d99e29,0xa8eac9fd,
  125677. 0xb93b6415,0x9d4ee81f,0xa5488e86,0xa5833b54,0x0bb7ab70,0xddd561c3,
  125678. 0xb3bdf3a9,0xb5bda384,0x1ddf332b,0xf909f8e0,0x00000124 },
  125679. { 0xab41e782,0xc5b8aa84,0x851ddb87,0x1de20126,0x99482bd2,0xf49baa7d,
  125680. 0xf4b6413b,0x05963deb,0x7cd1e224,0xed369fbb,0x1bad60ee,0xdcf495dd,
  125681. 0x892e30ed,0xeb475693,0xaf0a212d,0xaaf11bd8,0x0000010b } },
  125682. /* 53 */
  125683. { { 0x16ec64e2,0x71460174,0x7d7c6ebe,0xbfd14acf,0x668b7176,0x1e3504a3,
  125684. 0x741b041c,0x72e3f3f3,0x2d3b67b0,0x651fa54a,0xe57d928d,0x623edca3,
  125685. 0x72c8f419,0x29b74e8b,0x327abaef,0x3d99cb47,0x00000038 },
  125686. { 0xda342a3f,0x808dd0b3,0xdef4a954,0x12002462,0xeab5a860,0x1b1c642e,
  125687. 0x06e54b6d,0x5e1e2a05,0x10c6cf1a,0x9ba1710f,0x0f903cd0,0x334fc366,
  125688. 0x134166f5,0x969e0001,0x155c4353,0xfaa26074,0x000000fa } },
  125689. /* 54 */
  125690. { { 0x712de285,0xc85cd0e6,0x869f5dc5,0xcd2ff8b0,0xdf4ed389,0x372a2b92,
  125691. 0x55b99c84,0x63524d30,0xe07a0033,0x46fef5a2,0xd6e09493,0x0a2c82da,
  125692. 0x72a8952b,0xb3626621,0xaf217eb6,0x9afcb188,0x0000002c },
  125693. { 0x9a64c5b5,0xd3b9d476,0x44c4cfe1,0xa0d8d5de,0x11c6dbff,0x560858ef,
  125694. 0x41c14aed,0xce1d978f,0x35efe854,0x251f9e72,0x0474575d,0xf9d0c14c,
  125695. 0xbda89c03,0x0d2c838e,0x36cc9dc0,0xa25f040b,0x0000016f } },
  125696. /* 55 */
  125697. { { 0x9cad682d,0xb23d9dea,0x46369391,0x87acb1b3,0x5c0f24d7,0x9f5c1988,
  125698. 0xd41883ce,0xdff62fc7,0x53555e46,0xd1ab29df,0x891cda05,0x569b1cb2,
  125699. 0x52c633ed,0xdb14dbc4,0x2a345428,0x1acbb86c,0x00000194 },
  125700. { 0x24db8127,0xd86a70c8,0x41b7cf5b,0x84a6563f,0xb908d9b4,0x8d84dabe,
  125701. 0x899c260a,0xaaeaae63,0x44436957,0x13ed6b2b,0xd0a92c8d,0x3bc94f99,
  125702. 0xd04bcb97,0x978f2e2b,0x716a565f,0x56a388ef,0x00000074 } },
  125703. /* 56 */
  125704. { { 0x96fc1f77,0x6082dfe4,0x1347ad6a,0xb04c435f,0x25ebe457,0xf42694dc,
  125705. 0xb6f764aa,0x64a17069,0x04d83da1,0xe03873d5,0xe0c82330,0xb0b9db52,
  125706. 0xd4239b3e,0x9886b34e,0x598814da,0x76587f2a,0x0000016a },
  125707. { 0xebc71a5d,0x6918f8e8,0x85405233,0x49141a42,0xc182cbcc,0xd63f09cc,
  125708. 0xe09057a7,0x4afe59d3,0xe239d8eb,0xe633db0d,0xfd9494b2,0xbac8582d,
  125709. 0x4704fd61,0x8b915a41,0xfceaefd9,0xe0866a9d,0x0000010e } },
  125710. /* 57 */
  125711. { { 0x52e07a4d,0x2b50c470,0xe5d745d0,0x7f6d38b8,0xe1af1226,0xb414c47c,
  125712. 0x39c505f7,0x03e4b44b,0x86f739be,0x59f3d795,0xe7c2f1bc,0xca19bca7,
  125713. 0xc063fad4,0x1c51c01e,0x7f428afb,0xda3937a5,0x00000080 },
  125714. { 0x102369fa,0xe9d8ca9d,0x706c0e35,0xe009bffb,0x96b55d80,0x2e0a19a7,
  125715. 0xac0d094c,0xda0e42de,0x787c187a,0x6c1be2c5,0x9cfa04b6,0x6d4ae2cc,
  125716. 0x76577340,0x5b0cea60,0xc7c96285,0x2d525245,0x000000d8 } },
  125717. /* 58 */
  125718. { { 0xae93de69,0x6dcb238c,0x3bfdae9b,0x4963c833,0xe8b79836,0x33c81f4d,
  125719. 0xae8bf8ae,0xe13a2244,0x4c3ebacc,0x0bc6e786,0x555a5ad6,0xa837a53c,
  125720. 0xbc7e9459,0x875d8d35,0xf9f46fcd,0xb3705534,0x0000001f },
  125721. { 0x7fb974a1,0x78e9270c,0xe9ed2481,0x23448fa0,0x64bffbd4,0x14166c3d,
  125722. 0xd79f4b3c,0xa05aa443,0x3b9f32a0,0xd855a4f1,0xac90235e,0x4bebcf8d,
  125723. 0x8db52b48,0x65849987,0xe48d09d1,0xaa4d59f1,0x00000183 } },
  125724. /* 59 */
  125725. { { 0xdbffad9f,0xee585d75,0xf419d8fc,0x64df6174,0xe6c69345,0x6f73bf59,
  125726. 0x83d59b0c,0xb80793d1,0x929c8950,0x6baf4fc3,0x29962bab,0xbd445a95,
  125727. 0xeaa91273,0x52b61945,0x3d1c785b,0x4fccdfff,0x000001be },
  125728. { 0x7cb2857f,0x05c384d9,0x06b7abf4,0x4cf83058,0x43ace6b2,0xf528dd17,
  125729. 0xbc43d6b6,0x2c7b8fa2,0x14e564b9,0x8f0e28bf,0xd2b9f01a,0x1b69bc73,
  125730. 0x3dd383e6,0xab8beb40,0x9791946b,0xaccea0c5,0x000000ae } },
  125731. /* 60 */
  125732. { { 0x0163c2de,0x9a68baee,0xeb2768a4,0xc42d0b2b,0xffdae767,0x5686f124,
  125733. 0x0aaca943,0x926da5d5,0xe01091cf,0x699c34ce,0x5324becd,0x3d254540,
  125734. 0x4193a0a9,0x1b6b58f1,0xd611cc9d,0xf144925e,0x0000014f },
  125735. { 0xc1ed9259,0x7f61a60c,0x2f1d5a7f,0x1be37aa3,0x07aef431,0x0384713d,
  125736. 0x4e6fa7ba,0x99f33d49,0x8bd3730c,0x43928c16,0x5b9557dc,0x73cf8ccf,
  125737. 0xd1a2bee5,0x0bc6d460,0x83b15610,0x27cd1943,0x00000145 } },
  125738. /* 61 */
  125739. { { 0x3427af4e,0x4be65135,0x310d937d,0x2e6c0bb1,0xcaa671c3,0xbd8ea76a,
  125740. 0xd3a9c376,0x9d7b3fd4,0x471709aa,0x124ce863,0x018051c0,0x225ce41d,
  125741. 0xf9e8ee1c,0x5489284f,0x535c4ec8,0x22d829c9,0x0000013d },
  125742. { 0xa1b15e02,0x6b01ed9d,0x301e5868,0x1d092bac,0x5764135b,0xbfa7a183,
  125743. 0x6f7159a4,0xc0ee59b7,0x18090d0d,0x9171a051,0xb8052196,0x5c1531bb,
  125744. 0x20927904,0x740930fc,0x76337685,0x963b48cc,0x00000008 } },
  125745. /* 62 */
  125746. { { 0xf4aaaed5,0x0fe8b620,0xfe871ee8,0x1068de7d,0xfebfcb4b,0x2b22030f,
  125747. 0xc3a2155b,0xd4dfbee7,0x2769b805,0xa7a26a8c,0x6d39eaf0,0x377de770,
  125748. 0xf615f032,0xf1a92447,0x42d9b731,0xa1b81a84,0x0000012a },
  125749. { 0xb1152e8f,0x299e67d0,0x92b5e14c,0x2e773d97,0xf1cb57a2,0xe0d81073,
  125750. 0xbf1da4a2,0x03af0a9c,0xc22b449a,0x169b160e,0xdd2d7d1d,0xb82c1ac8,
  125751. 0xbfc98ee4,0x7508aca6,0xe3cbea15,0x54992440,0x00000150 } },
  125752. /* 63 */
  125753. { { 0xa13a4602,0x70004a0a,0xd0d2c60e,0x505c71a3,0xa6d79bc5,0xa4fe2463,
  125754. 0xd54d9df4,0xe878eb3a,0x73d3c7b8,0x7ecca907,0x244ecfa5,0x5b3bb278,
  125755. 0xb124d179,0x8a30f61f,0x4f632af0,0x5b7e5001,0x00000115 },
  125756. { 0x9ef0021a,0x62c42ecc,0xf856c9d4,0x58017fd7,0x2e6478bc,0x10e243b8,
  125757. 0x1505a4db,0xaf074669,0x4cd7eea5,0xd9bb0a1c,0xd52aed0a,0xe8ba39a2,
  125758. 0xb549f09d,0x0747449a,0x9e57fa64,0xd5c8f7bd,0x0000013f } },
  125759. /* 64 */
  125760. { { 0x5a53c22b,0x1bd8ce7b,0x7cab446a,0x78733fcd,0x48acb394,0xc44ca4e2,
  125761. 0xa38c790f,0xa9888b1e,0x15c34237,0x36afb6eb,0xfb702063,0xb913b8a8,
  125762. 0x917508fa,0x34b77cc5,0xf9e4732b,0xa931d7a7,0x00000050 },
  125763. { 0x56d21d18,0xa90a4290,0x55b410a1,0x82666307,0x894a6b05,0xb4684a8b,
  125764. 0x828cf75c,0x8a1ade63,0x127702a3,0x4fb2f85a,0xadf7b709,0x83ff7d05,
  125765. 0xa68d1db6,0x1d3f5a92,0xc093cd5c,0x243ce1db,0x000000f5 } },
  125766. /* 65 */
  125767. { { 0xd37d7891,0x8fc183c3,0xfd865eca,0x17b50149,0x8f218441,0x0f6e43d6,
  125768. 0x5a07f658,0xaf51ec25,0xad303202,0x8fe5a6cb,0x10676ef5,0x95de68f3,
  125769. 0xca4e000c,0x7508e31f,0x77735254,0x783e5a95,0x00000159 },
  125770. { 0x2e537ad9,0xbc1db571,0x35be9cf7,0x5e87112d,0xd57f9bcb,0xbb522b48,
  125771. 0xa8b3cbc7,0x1eff7890,0xe5ecdb5c,0x4f306e11,0x3387e7ed,0x30da8392,
  125772. 0x72321e3d,0x4d91fcf4,0xe412a67c,0x8487bb62,0x0000009f } },
  125773. /* 66 */
  125774. { { 0x8cb8e08e,0x86f5f80f,0x2496fed6,0x7cfd2c41,0x60b7dcdf,0x0061b743,
  125775. 0x57f4d05f,0x4dbaffdf,0x458061f2,0xb1993c2a,0x9de994c4,0x6c6ca8d0,
  125776. 0x2747e062,0xef70d24d,0xb9995cbc,0xd4e5d4e3,0x000000ff },
  125777. { 0xc6f40077,0x3171e245,0x0723e506,0x1592e045,0x6a6bfd88,0x35c86f7e,
  125778. 0x6d9d9ce0,0xba0959d1,0x3eb5770c,0x2e7f8fe8,0xc40d63dd,0x58eb0881,
  125779. 0xeb9e4419,0x56333bda,0x3afd1f4d,0xfb0397df,0x00000034 } },
  125780. /* 67 */
  125781. { { 0xb358815c,0x7b84e05e,0xe41087d9,0x3abcb2d4,0x07f05d7a,0x87a75889,
  125782. 0x7a9d481c,0x350778d5,0x42d64cbd,0x9d34cff8,0xccf289fe,0x0859cd5a,
  125783. 0xdd2b2c6e,0x8372d591,0x18b40b62,0xc06d482e,0x0000006b },
  125784. { 0xda4ed375,0xd10695a0,0x298daaea,0x51baf588,0xf4b7092c,0xb028a1b4,
  125785. 0x7a335b35,0x8ab87dae,0x0567efd8,0xa7359362,0x3320c374,0x7a49fc10,
  125786. 0xa3558b30,0x737acac4,0x4c0fce9b,0xd30696a3,0x0000001e } },
  125787. /* 68 */
  125788. { { 0xbd3902fe,0xd9550ab0,0x86a9d3b3,0x9bba4b4b,0x975cac37,0x3a59e0a9,
  125789. 0x333605dc,0x045e8731,0x1afc2c58,0xf2c598c2,0xeef9cbf1,0x81ff8d6f,
  125790. 0x9bf83c42,0x82bed5d0,0x528131d5,0x9d1d9d5b,0x00000157 },
  125791. { 0x5519258e,0x687da305,0x027de2a8,0x73f539f9,0xd6a230d6,0x69fa9747,
  125792. 0x5f5d1684,0xab1aeb23,0x5f7e41f5,0x5bbfe947,0x16a7feb3,0xbd546abb,
  125793. 0xe16d5187,0x2afbd4e8,0xbcc953dd,0x7437be13,0x00000160 } },
  125794. /* 69 */
  125795. { { 0xee9755a3,0x55f165a9,0xb82c9ab1,0x0c8d5a1a,0xab6b97e6,0x65a1e45a,
  125796. 0xab05e271,0x3004cdb0,0x6db0830f,0x9e0c3b52,0x75acbdeb,0xaae1ec1a,
  125797. 0x761e8498,0x413d4484,0xb1b9c62e,0x589e09bb,0x000001e9 },
  125798. { 0x9c72258d,0x67512081,0x5c1593d4,0x61dcd734,0x91c11fdb,0x6c627a7b,
  125799. 0x8857908e,0xd1d3e9bf,0x530bc68e,0x9aac06fe,0x6b5b44ff,0x125c16bb,
  125800. 0xdb90edd5,0x38860bb6,0xfbbedb5c,0x96fe8b08,0x000001aa } },
  125801. /* 70 */
  125802. { { 0xf257c0f8,0x323a5dd8,0xdd3a10d9,0x4884dc92,0xbbb8ce03,0x03f379ce,
  125803. 0xa47262a9,0x6217ad53,0x52e06c6d,0xa1df2017,0xc32428cd,0xf5b723e0,
  125804. 0x2c30c62c,0x1e5d3889,0x477f82cc,0xd9a90f1f,0x000001fd },
  125805. { 0x1763ab59,0x830d27ba,0x723783e9,0xcf27d93e,0x945968aa,0x81558264,
  125806. 0x1700d5d5,0x63251a32,0x03146d9f,0xcf6bbe73,0xe65bf0f2,0x6cdcf455,
  125807. 0x632323fb,0x80aa00ce,0xd96a4744,0x6e49e62c,0x00000149 } },
  125808. /* 71 */
  125809. { { 0x40574c09,0xbeff0b7e,0x3fe80e96,0xb76f2643,0xeb237d91,0x0b3bd352,
  125810. 0x7edc3102,0x3c0c62b7,0x424a36dc,0xf989394b,0x7c6c435e,0xe9ea64c2,
  125811. 0xe388d076,0x2dfc21c4,0xa4e69e4b,0xcc3852f6,0x00000139 },
  125812. { 0xbb096b91,0x5238a3ff,0x73d8d43e,0xee72c9e5,0x8c577558,0xc116db11,
  125813. 0xdc47d4b4,0x54ec89d2,0x42e1955f,0x2006dd35,0x7437475c,0x004aed6a,
  125814. 0x2bee9041,0xc1ddc32a,0xed9332c9,0x597417a2,0x000001fb } },
  125815. /* 72 */
  125816. { { 0x859bae66,0x3c0f1981,0x845d7c1b,0xab48e9b1,0x452a3c1e,0xc6ce9c03,
  125817. 0xff810339,0x2384a00c,0x5f98d6fe,0xcd7ede11,0x38a0dd5b,0xf7a00e3d,
  125818. 0x3c7e1c06,0x56dd948a,0x8e53a61f,0x9d21a7d1,0x000000d0 },
  125819. { 0x880eb3fb,0xf9cfdbaf,0x5e83f7c9,0x64cfd297,0xa28a74b4,0x61ba7d6f,
  125820. 0xdfb13e03,0xb8200d5f,0x232a6128,0x03bc8f4b,0x81a8d86e,0xd1fb92c2,
  125821. 0x706d6ea7,0x68675fae,0xefab18c2,0x9b08608a,0x0000011d } },
  125822. /* 73 */
  125823. { { 0xbbd2f539,0x17cf6146,0x76e26ba2,0x96052fc0,0xd4be4a67,0x36821d18,
  125824. 0x9f3f39a8,0x8f823422,0x433f873a,0x68b846b9,0x716f4568,0x7a1d3f36,
  125825. 0x2fd47750,0xdf603e28,0x6975e226,0x77cb02c5,0x00000003 },
  125826. { 0x8c01dd59,0xf275add3,0xb9c1a37a,0x9c213a9e,0x4dfc5403,0x690ad104,
  125827. 0x07ee0d86,0x202ee206,0x661fc40e,0x896ede95,0xd0b02f56,0x6b4d7398,
  125828. 0xe5af1a24,0xccb96991,0xc13f7125,0xd5c281af,0x0000009f } },
  125829. /* 74 */
  125830. { { 0xd7073a5a,0xc858c54b,0x861eac7d,0x87c81a5c,0xe720201a,0x51f84a39,
  125831. 0x40e003ce,0x952a9f8e,0x58f199de,0x76bdc4ab,0xd56cc02b,0x1cf12322,
  125832. 0x83f162f3,0xb6634e63,0x8f969e11,0x84c017ee,0x00000169 },
  125833. { 0x5c89f1fa,0xf1f43362,0xb697b078,0x4a02a630,0x4b05b7f4,0x33311e5c,
  125834. 0x4fede4cc,0xa7ccae51,0x4b025aa4,0x0d26e874,0xf84db7ad,0x7d5b77bb,
  125835. 0xf571c1fe,0x39ef1aa8,0x418ccd20,0x65eba928,0x0000018d } },
  125836. /* 75 */
  125837. { { 0x8abb2537,0xa37866ab,0x65b3096f,0x14ac4cbb,0x2a428ad3,0x827fa7ed,
  125838. 0x10e9e196,0x95d19f62,0x89801b4e,0x31eb97a0,0xaae8b823,0xaae77a62,
  125839. 0x5f5c9642,0x9693d62a,0x3e368b84,0xff5bfe97,0x000000ad },
  125840. { 0x492b0dee,0xa3efae21,0x9602c2ce,0x2143e9ee,0x6f3b99e5,0x21367c99,
  125841. 0xe93b8f59,0xdd78b2b0,0x1064c13e,0x8d541c38,0xf5738e7a,0xe6b970da,
  125842. 0x8373b1a4,0xaf6ecc16,0x74ae208f,0xdbfa3f4f,0x00000180 } },
  125843. /* 76 */
  125844. { { 0x907a6aa0,0xb024621a,0x407879f6,0xef56cb68,0x8168a934,0x44c38b68,
  125845. 0x9b9a9048,0x70d638d3,0x82541f20,0x6968caa0,0x1fc88b50,0x0c597053,
  125846. 0xaf635784,0x5564ded5,0xc4d494cf,0xe7e898c7,0x00000097 },
  125847. { 0x6b6ebb2f,0xe1dc98d9,0x7aa9e126,0x292a17fc,0xfa2a2c68,0xb60f0fdb,
  125848. 0xb2e1851b,0x9c63270c,0x81ca4cfe,0x898db265,0xb11959d5,0x94082638,
  125849. 0xa54b8d19,0xe44f308e,0x44e63094,0x96399eb8,0x000000d6 } },
  125850. /* 77 */
  125851. { { 0xb83769ee,0xfa00f362,0x3efc4cb3,0x72d040ac,0x57abd687,0xc3933889,
  125852. 0x940a7128,0x62264425,0xec242a31,0x909c4c8f,0x65a1a551,0xd1e48f1e,
  125853. 0x049c2172,0x68bd70f1,0x709b7fd4,0xc8692d2b,0x00000041 },
  125854. { 0xdf816784,0x4e388aa1,0x01be75ce,0x4a58c8a5,0x02a67812,0x9b49dffb,
  125855. 0xeda721e0,0xa73299e0,0xe67a65ec,0x8a0bd1f5,0x856c71b6,0xd81e91e8,
  125856. 0xc005aa30,0x37aee2f4,0x0595bbf2,0xd9400750,0x00000073 } },
  125857. /* 78 */
  125858. { { 0x010c0ef3,0xa912ac4a,0x4e81b1a0,0x0e654bd8,0x4f353509,0x8f0563dc,
  125859. 0xb47d189a,0x10dc41f3,0xf238c09c,0x122edd06,0xc41acf67,0x224c16af,
  125860. 0x83758520,0x1ccb9334,0x2275ae6f,0x1a4b5f29,0x00000127 },
  125861. { 0x3ce688b5,0x792fd473,0xdca9c68b,0x14566d37,0x541711d0,0xfce9326e,
  125862. 0x3cc341a8,0xe3ba14ee,0x2122c11f,0x6b8ab4cc,0xf5d379b5,0xc0fa763b,
  125863. 0xf1522f91,0x95e2d2ae,0x31cf95a5,0xd4e21b3d,0x000000ac } },
  125864. /* 79 */
  125865. { { 0x1d8e061a,0x4013a779,0xacc84a30,0x62707e70,0xeb2f636a,0x6ac08266,
  125866. 0x77b25c9d,0xe917ea21,0x70ff35cf,0xddb78bbd,0x041898be,0x5008db2b,
  125867. 0xce0ae445,0x0f58a4fc,0x2257d0e7,0xed092397,0x00000043 },
  125868. { 0xe2e129e6,0x2cad77b3,0x0f1be4d7,0xfb8c4a87,0x20056333,0xaee50dff,
  125869. 0x2a691543,0xbc2658c1,0xb8fe2640,0x95dc0cca,0x1965a0af,0x694eb584,
  125870. 0xedd1d99e,0x7d3baa53,0x8a1edc87,0x2df13b20,0x00000083 } },
  125871. /* 80 */
  125872. { { 0xd181c3f2,0xfead2247,0xf337b23f,0x915d35be,0x74890672,0xdb4cfcba,
  125873. 0xfda7a3a1,0xe4f70d8f,0x79275686,0x226b6419,0x6ff1f79e,0xe8040863,
  125874. 0xcf5fa4e8,0x98e84b39,0xd8a09f60,0x57aa0be9,0x000000da },
  125875. { 0x4efcea66,0xd40cecf5,0xafc76fae,0x98df2aec,0xc91585a8,0x63f19a48,
  125876. 0x13f00aa5,0xb111bda7,0x44b5cb9f,0x6687afab,0x652620d1,0xc6d5fb12,
  125877. 0xbacb35ab,0xaf953f1b,0xff94c4d2,0x99709370,0x000000ed } },
  125878. /* 81 */
  125879. { { 0x68b54c89,0xac9f56e0,0xce737c22,0x08ecc17d,0xab089b53,0x208ee83f,
  125880. 0x543fbd1b,0xb0f3a129,0x844dd706,0x1b204cf8,0xdec2e40d,0x80975c89,
  125881. 0x9399914a,0x08b011ae,0x74674df7,0x6b4ba170,0x00000017 },
  125882. { 0x8fdfc175,0x71216ea9,0x7e0f5b0c,0x77b7fc63,0xceb33a34,0x88d0285f,
  125883. 0x0223eab7,0xb679814f,0x51c6d922,0x9078720b,0x9c13f51d,0x5859d5a4,
  125884. 0xfaed60b5,0xe69f850b,0x6d0ccab2,0x2499a844,0x0000005c } },
  125885. /* 82 */
  125886. { { 0x73e7bcf1,0x41d581fb,0xdd3c17be,0x16dde61c,0xfa199fd9,0xc62997ec,
  125887. 0xc159db97,0x1a758873,0x64132830,0x4ed77896,0x2942a918,0x9672ce89,
  125888. 0x816ba4bb,0xf3ee4587,0xce54dd7f,0x4fb7a148,0x00000123 },
  125889. { 0xf009be8c,0xf05d80af,0x78df1ba1,0x62e938d7,0x312de620,0xa7e22e84,
  125890. 0x6070c4b9,0x48d29e7f,0xa1b5da37,0x5cd9c3eb,0xa4717453,0x1e51bd2f,
  125891. 0x56ab9e67,0x94098ab0,0x49f7c6a1,0xbb584abc,0x00000049 } },
  125892. /* 83 */
  125893. { { 0x1ea470f7,0xa9f25530,0xe9254e30,0xa01bf808,0x71a0038d,0x098569ea,
  125894. 0x5913ca87,0x0d2b2ee1,0xb8281fdb,0xae17004b,0x118e5c2a,0xdb5c6eb0,
  125895. 0x1fa943ab,0xa56ac64c,0x1a92d501,0x1aaf6477,0x00000053 },
  125896. { 0x06345730,0x9679ef49,0x846f37c2,0x946aaa4e,0x1a7c3aab,0xf81726b0,
  125897. 0x8166df4e,0xcb808da2,0x4e04dc3e,0xe9fb3fc2,0x76ec19b4,0x9e0b61db,
  125898. 0xeed6d13e,0x6e7f665e,0x86a75384,0x70ed8c07,0x000000e5 } },
  125899. /* 84 */
  125900. { { 0x108ce13f,0x66456e58,0x0e397813,0xb5bfc58d,0xea3949e9,0x04b6a84b,
  125901. 0x75af667d,0xea9b66bc,0xa891566b,0x7cb4d6dc,0xbf61595a,0x1b3cecf0,
  125902. 0x002e2520,0x4312c73d,0x6135a5fa,0x81d76898,0x0000014b },
  125903. { 0x841078ec,0x4047bc25,0x179c454d,0x75aa9c96,0x4851f8fc,0x6a160609,
  125904. 0xce34091f,0x998d4e3e,0x88e54102,0x9a9f6704,0x5da8ac5e,0xbf280f88,
  125905. 0x8fec230c,0xc64caca0,0x5094b775,0x0ac864b0,0x0000002b } },
  125906. /* 85 */
  125907. { { 0x8f5daf7f,0x6b606e39,0x10927506,0x48385489,0x08c58a72,0xa2255c5c,
  125908. 0xc90f3ee3,0x2f362fd0,0x08795f02,0xc9633af4,0x0425f5aa,0x71710bd1,
  125909. 0xec06dbfb,0xc2017e05,0xc1b8bbcd,0xd9c7dc82,0x000001c8 },
  125910. { 0x18b8bed9,0x7db41fdf,0xe3a23125,0xe9483308,0x7291c4bb,0xbcf91de7,
  125911. 0x41448aaf,0x9b0b972b,0xc44da462,0x95dfc633,0x01bf50a2,0x90b9c463,
  125912. 0x869e3131,0x18b66f77,0x121baad9,0xa8a4e2fa,0x000000f5 } },
  125913. /* 86 */
  125914. { { 0xca0251ea,0x8ca55109,0x27a6c9b0,0xf2aeed8b,0x5620f528,0x901a8beb,
  125915. 0xae13fc56,0x9a8421e8,0x85993c07,0x1349f1c4,0x0d1ab0d7,0x29e08359,
  125916. 0xaeb5d909,0x96e2929b,0xf599a66f,0x96c2f1f8,0x000000ce },
  125917. { 0x12be8bd7,0xe4bc4b51,0x3c67e99b,0xf4846a0f,0x4d3a3864,0xd89cc7d3,
  125918. 0x73f43981,0x1f647112,0x26dce567,0xc32bc324,0xf02b096b,0xf7134ebf,
  125919. 0x0d0682b7,0x5604f00b,0xe3ce8b59,0xfd23d7ea,0x0000011c } },
  125920. /* 87 */
  125921. { { 0xa27689a6,0xf89646cc,0x5564172b,0xd6a7dc43,0xb57cbfcc,0x30bda48e,
  125922. 0x5b1adfe5,0x9b11fffb,0x711d8bf4,0x9f2d80db,0xb70e5a5b,0xe879fdf0,
  125923. 0x6bd18a1d,0x97534183,0x8cbfd504,0xc8c526bd,0x00000114 },
  125924. { 0xef7388bd,0xd5fe725b,0xe7ffaea7,0xf1c3dbdf,0x7e6de2ac,0x78395b89,
  125925. 0x9ebf1bfb,0x81a72c9a,0x69785146,0x65265707,0xf52670af,0x3925ecd9,
  125926. 0x83d57d48,0x437bcdd2,0xc80ecb02,0xb5d732a7,0x000001ce } },
  125927. /* 88 */
  125928. { { 0xcfd376d7,0xa7f9fcce,0xa66b084d,0x6b4eab3e,0xd5b91bd8,0x6ac90d08,
  125929. 0x8aa304d8,0xaa3d5b7e,0x7f866a4f,0x27f3d42b,0xbb813ae1,0x95d19fa8,
  125930. 0xe34a9206,0xd38798d7,0xa32c1cdd,0xdf7c0a69,0x00000073 },
  125931. { 0x38315b16,0xbe2c01bb,0x9e18c8f9,0x1daa7c89,0x08b6b853,0xa3d43fb4,
  125932. 0x68092a81,0xb159e48c,0x836faad4,0x77e93d9e,0xa4699730,0xd4ed6361,
  125933. 0x6297e476,0x569cb3f6,0xe7811fa6,0xb69d8183,0x00000185 } },
  125934. /* 89 */
  125935. { { 0xab9cb764,0x18f27eb3,0x8ebc1d6d,0xbbbefc21,0x0479aa79,0x47760ddb,
  125936. 0x09e542f5,0xb4d16d24,0xbc699b96,0xe35c38d1,0x8c8d8c8a,0x13b2ae25,
  125937. 0x67a3a45d,0x8579c152,0x6c554c04,0x773b7357,0x000000d9 },
  125938. { 0x0218c299,0x9620a473,0x99f78a33,0x69be29b3,0x484f414f,0x4684a009,
  125939. 0x9a2ca4d4,0xb2c74937,0x68db7ab3,0x09c0773e,0x935c357f,0x6181f059,
  125940. 0x8b7de3f2,0x0931303d,0xe0fb6e08,0xf3effcd0,0x00000060 } },
  125941. /* 90 */
  125942. { { 0xb25d6530,0x723c14be,0x9a97d40f,0x5e015b39,0xfbf7f622,0x209c3c4b,
  125943. 0x14b4f0f1,0x83d8c59c,0x3f7e8ecf,0xcf002fde,0x1eb1ef0f,0x35d353c9,
  125944. 0x201f0c60,0x394c42a5,0x7be8ee34,0x787128ab,0x000001b5 },
  125945. { 0xb70110cd,0xa0937d3a,0x477911b5,0xe0fa4efc,0xc53a4c19,0xc6acaf5b,
  125946. 0x38d509f2,0xbd3010f3,0xe54ac1c6,0x3ee2a82b,0xe4f2a3bf,0x31ea67c3,
  125947. 0xf089c7b9,0x7a4ca66e,0x34a2362f,0x5bda2c4f,0x000000b0 } },
  125948. /* 91 */
  125949. { { 0xd1f575cd,0xb424a071,0xa5237182,0x15693b01,0x9a2c9d40,0x14133602,
  125950. 0x9c914a60,0x50c4348b,0x095b31c1,0x9024573d,0x22fd4962,0x6f975fd2,
  125951. 0xe210b277,0xa1704886,0x6dba937b,0xac29b813,0x000001f6 },
  125952. { 0x775da491,0x09edef55,0x2b6aad82,0x25953f9e,0x1bb40d5b,0x6696a106,
  125953. 0x4d5127d8,0xcfc45311,0x81ead062,0x2f21dca9,0xaf3b7123,0x3f3e4f07,
  125954. 0x9646f20d,0x12cd06b8,0x6910f5bb,0x24136369,0x0000015e } },
  125955. /* 92 */
  125956. { { 0x3ecfc44e,0x0c844fd0,0x5043b3d5,0x4095f2c8,0xc9bd059a,0x9a5fe7db,
  125957. 0xf65becdf,0x239328fa,0xa67961cd,0xe3102471,0xbbb5dfdd,0xea9e39bf,
  125958. 0x133dc5ba,0x8022b6d0,0x5f12c379,0xbed7aa9b,0x00000141 },
  125959. { 0xfd94d941,0x096f0059,0x7d4ff018,0xfc6e9f00,0x779f05e3,0xe63af598,
  125960. 0x00483c99,0x4c40f0b3,0x72a19870,0x04d2feef,0x464a4a71,0xdb773b5b,
  125961. 0x49367f1e,0x00b6770f,0x2a9fbd2a,0x4f7e0301,0x00000169 } },
  125962. /* 93 */
  125963. { { 0x8a9095fd,0x0df5dd73,0xd3ce857a,0xc4b7a021,0xe5edc767,0x90aa796b,
  125964. 0x180a0808,0x56497eff,0x66f10aab,0xb9856e1f,0x39879766,0x31298824,
  125965. 0x3ba80601,0x61748cf7,0x555da929,0x07d9076c,0x00000012 },
  125966. { 0x1c44394d,0x0b049a01,0x0ce49e45,0xf5f25ef7,0xb1694265,0x1e3a09f0,
  125967. 0x109b33f8,0x2c5bd9fe,0xa30932e4,0x07f2a43f,0xc6cf8af2,0x736abfca,
  125968. 0xf3366722,0xadf7fa04,0xfa9d26b0,0x2f1e92fb,0x000000e0 } },
  125969. /* 94 */
  125970. { { 0x63be4d4a,0x9524e4a6,0x66f3cc91,0x1fa57bed,0x7e7a7ccd,0xdd7c93fa,
  125971. 0x88c5d1d3,0x70e8cf6a,0x3f251f1e,0xb257997a,0xe3554cf5,0x0a5ec58e,
  125972. 0x065a7109,0x68d268d7,0x085089ea,0x7c23d4d2,0x0000004c },
  125973. { 0xbd52d132,0x63ae575b,0x38c81cc5,0x0fb8daa7,0xe4e63b99,0x096a6e51,
  125974. 0xb239d387,0x51d6b366,0xa5d49fed,0xed5f8874,0x43a8c07a,0x025091d9,
  125975. 0xe4686ae2,0x100f845a,0x7eb4ef5a,0x1af59d74,0x000001c2 } },
  125976. /* 95 */
  125977. { { 0xdd441308,0x5f7bc01e,0x86308890,0x0dc34944,0x759611cd,0x2af38a74,
  125978. 0x4c23ce66,0x11a71261,0xf8bafed2,0x37f317b5,0x4c93e079,0x4efbb9ff,
  125979. 0x8ecc52cf,0x880f0edd,0xddc9d82a,0x480cdd2c,0x00000028 },
  125980. { 0xc3f807ac,0xe8f1ca0d,0xbd070549,0x6a3e4fc2,0x91f8bb6c,0xad3d0a14,
  125981. 0x3d6dfacd,0xe3ee1cfd,0x5fb46ffb,0xee46b1b9,0x7dd5cfbc,0x5207b3ac,
  125982. 0xb1b8e8b7,0xd580c0d9,0xc7bdd11a,0x52c669f4,0x00000084 } },
  125983. /* 96 */
  125984. { { 0xc0ace6d5,0xa42b4747,0xbe7287ad,0xd5acb64b,0x89bc2614,0xf3304899,
  125985. 0xff05c71e,0x817fe836,0xd35ac450,0x772eb246,0x375a9c3c,0x7f5fc216,
  125986. 0xcbc0d6fd,0xfb6f9e1a,0x720e9733,0x7643c315,0x0000009a },
  125987. { 0xf3845ccf,0x4b2216b4,0x90bc05bd,0x9c174e80,0xd6049037,0x7a550c74,
  125988. 0x6358c806,0xbd7220a1,0xaa677b6d,0x838f9c41,0x66e2e08e,0x37332c19,
  125989. 0x496f6da5,0xb032875e,0x9c30630d,0x52b274cf,0x0000000c } },
  125990. /* 97 */
  125991. { { 0x8ea58beb,0x6ec2e782,0x3665fa48,0x2b404c1d,0x20b40ff0,0x546d5fad,
  125992. 0x29d3e6a5,0xfb5df7b6,0x66c81991,0xf186846d,0x6e2cfe3e,0xbe690bde,
  125993. 0x1410d16b,0x97aeb9a0,0xbacc8e92,0x59d81548,0x000000cb },
  125994. { 0xbaf66a23,0xd905d3ad,0x40dfb081,0xc3337387,0x4b00f432,0x6d5535de,
  125995. 0x07d3a03e,0xe17fe8e8,0x066bca80,0x29544ff7,0xbadffa55,0x60c2b96c,
  125996. 0x45a26ea4,0x9f018d94,0x24a34ffc,0xd5438167,0x0000011e } },
  125997. /* 98 */
  125998. { { 0xbd7f8a61,0x62a873fb,0xbbe580bb,0x5e18cd71,0x667f6980,0xfd5c9eb3,
  125999. 0x571d3dc0,0xab8d4f61,0x783f9bc8,0xe2e45215,0x24398b14,0x36c3774b,
  126000. 0x74d811b5,0x2db4a363,0x2debe3c3,0x9f7f1297,0x00000138 },
  126001. { 0x798fefb2,0xbb97f21c,0x107baa72,0x9c76fcb5,0xfadbb568,0x12fbf760,
  126002. 0xd33ea6c5,0x1a648be7,0x236134a5,0x412a2993,0x8985893b,0x4a3d8169,
  126003. 0x3e66ada4,0x6144958f,0x7687b457,0xb4dfc79b,0x00000140 } },
  126004. /* 99 */
  126005. { { 0x7abe5bb9,0x83b14570,0xe51d81be,0xae0cbfd8,0xc9827aff,0x20dadf49,
  126006. 0xa687b554,0xc3a72548,0xeeb41733,0x080263fb,0xd3827c63,0x7014fdc3,
  126007. 0xb5e3b70e,0x7d018f84,0xfbcf7168,0x1d483e00,0x00000015 },
  126008. { 0x6b578aa3,0x154e3c7c,0xd3043dae,0x511ce9b5,0xb6008101,0x55f89e9b,
  126009. 0xf405ac6f,0x4ec31112,0x2008ac7b,0x7e66a4d8,0x25c52fa6,0x73c00d39,
  126010. 0x8acac2eb,0xee1b9998,0x60b57453,0xdfa31d95,0x0000008f } },
  126011. /* 100 */
  126012. { { 0x251cf8d8,0xcc74a0e0,0x041f2bd2,0xd4d8949d,0x33ebce52,0x0b734a49,
  126013. 0x5c5bcdae,0xe1ac5f51,0x16200b93,0xd3ecdfcc,0xa793736e,0x2506a266,
  126014. 0xea6e6940,0x585a1c8b,0x9190f935,0x081cdd53,0x0000000e },
  126015. { 0x53e28412,0x055f9956,0xdb27164b,0x0d1526f2,0x1df3adc7,0xcd5625eb,
  126016. 0xdd35dedd,0xd2c453ca,0xa838ffe2,0xed442849,0x5c0ce589,0xad20c137,
  126017. 0xbd99b609,0x2d5fba81,0x622efb07,0x5be41dcc,0x000001ad } },
  126018. /* 101 */
  126019. { { 0x8f850756,0x563af667,0x52f3b597,0x86d37aae,0x796842f5,0x10d38a53,
  126020. 0xf743f997,0xcdaaf99f,0x93f1a8ba,0x2fa755e5,0x409f7cd9,0x1af04e15,
  126021. 0xd6d0650b,0x63bf9a0a,0x55abfd9a,0x67b1cead,0x0000000e },
  126022. { 0xb5f43178,0x3660a8e0,0x9cc35b33,0x56bd412d,0x880f6808,0x3d7bfa63,
  126023. 0x2e622c71,0x7f372d66,0x6ff82445,0xad7b7be7,0x8db04e51,0x0f2bde80,
  126024. 0x4bd15c8d,0xe1e781fe,0xb8e502f2,0x1f475bfb,0x00000194 } },
  126025. /* 102 */
  126026. { { 0xd63543ec,0x79482bf9,0xa117ef3e,0x985cb67c,0x160ccc63,0x8ac50638,
  126027. 0x729bdc1e,0x556cbed5,0xa22686df,0xd62ed97d,0xc81eb77c,0xb124cb5f,
  126028. 0x72fa2ed9,0x4d7b4f66,0x78335b96,0x60b29aa7,0x00000172 },
  126029. { 0xa43df7c6,0x21bfc7b6,0xbc20706c,0x85acac23,0x345d9580,0xeb6f37bc,
  126030. 0xa32a08bc,0x9d8f20d2,0xd1953c5e,0xf08924f6,0xc4f680d0,0x7d25d7c6,
  126031. 0x2de9912c,0x64e6a237,0x52ce644c,0xda1c06c4,0x000000eb } },
  126032. /* 103 */
  126033. { { 0x411dd110,0x26677c5c,0x2c991c4a,0x0d6787aa,0xa45666d6,0x53be6a41,
  126034. 0xc15f9f15,0x73e716aa,0x0e0cc7b2,0xa93b863f,0x2a624ab0,0xa4057117,
  126035. 0x1a39c260,0xe5e7656e,0x2ef6f130,0xaf8d78b5,0x00000046 },
  126036. { 0x70f38dff,0x796214b1,0x123a1105,0x3e35d828,0x957ed812,0x046a44d4,
  126037. 0x0da60161,0x618fa9ba,0x54f84413,0xe7cdd2a5,0x19ea95ab,0xf1c2563e,
  126038. 0xcb2a30b4,0xc4459e14,0x61ff9aa9,0xc748add6,0x00000183 } },
  126039. /* 104 */
  126040. { { 0x9de58caf,0x32981f39,0x8753ea64,0x05bb80fd,0x2d119486,0xc83f9f24,
  126041. 0x03eeb00a,0xf490cf06,0x7c73d79c,0x4037f251,0x724d461b,0x844209fd,
  126042. 0x272420cf,0x6b03f6d2,0xb3438fa2,0x6f4bd29e,0x00000152 },
  126043. { 0xc389e51c,0x964d034a,0x6db7d98e,0xacda55e9,0xe913c583,0xb2ae97de,
  126044. 0xfeb03440,0x0793077b,0x9d461e29,0xaa16e378,0x043bf8be,0xb0a67533,
  126045. 0xba7d8c3f,0x9d749a42,0x6bb925dc,0x7c41e6d6,0x000000ec } },
  126046. /* 105 */
  126047. { { 0xc5da8398,0x2e9b345d,0xbb38c430,0xbc66841f,0x7c3bb47a,0xce3ac562,
  126048. 0x738d2cdd,0x8fbeb12b,0x68731185,0xd4bc2ad7,0xbbd4f4f4,0x9521db1c,
  126049. 0xfe4e1b0e,0x2a690cae,0x7bfebe3e,0x375215eb,0x00000194 },
  126050. { 0x2edfd661,0x4cb234f1,0xed52c1f4,0x0149984e,0xd8f8f98c,0x32d27260,
  126051. 0x7be38590,0xfe76e4e4,0x95e8b672,0x5435873d,0xf2b00e82,0x916c397f,
  126052. 0xbad61eb8,0x3b9bf705,0xae131bbe,0x7ee90182,0x00000000 } },
  126053. /* 106 */
  126054. { { 0x93fbcb5c,0xd36fea9e,0x9fa8529b,0x382be583,0xfd611ba0,0x0b243125,
  126055. 0xcd8a2637,0xa59ae37f,0x3d8d4704,0xab78c60e,0x44c41b79,0x1bac243d,
  126056. 0xeda49cc5,0xc4001fea,0x83dc7e9f,0x988ea44a,0x000000f6 },
  126057. { 0xf077f79e,0x4d90caa4,0xd9e2590d,0xf4d17601,0xd21b4b77,0x11debbb3,
  126058. 0x9037e1b6,0x031b3f60,0x135becf0,0xf113ed82,0xf2903dda,0xf6c01379,
  126059. 0xa6f19296,0x36bde7ca,0x9dbbad85,0x57d3b684,0x0000006c } },
  126060. /* 107 */
  126061. { { 0x9abfccb0,0x963fee38,0xb9676e63,0x6c6e2a24,0x84ba6d27,0xf8768f02,
  126062. 0x465853d1,0xc38ba3ba,0x1b8ab9b6,0x6e3ab36d,0x47a07331,0x01fc9742,
  126063. 0x25233f32,0xfdd41718,0xac61de7a,0x4dacfa81,0x00000021 },
  126064. { 0xeaa3198c,0x365a9f37,0xfc8b99d5,0xcbe8a345,0xd4f5ecbc,0xa427f12a,
  126065. 0x0c237514,0xe841ff60,0x28a27b05,0x5d9e8c5a,0x62859ff3,0x2d377444,
  126066. 0xea8bde37,0x1c0460ff,0x29cf5bf8,0x0a0e49a1,0x00000181 } },
  126067. /* 108 */
  126068. { { 0x45843c3e,0x688203af,0xaabebae7,0x4601e303,0x624df62b,0x397b08f3,
  126069. 0xd21e5aa8,0x5687348a,0x9a242b0e,0x2cf12c73,0x32a76c6d,0xc848ed01,
  126070. 0xf52751a2,0xb72aa1c2,0x92c02d05,0xb63296c3,0x000000f3 },
  126071. { 0xc6f3d1f0,0xce4b42ad,0x2f532b94,0x2f0dcc53,0x83443d9c,0x57813335,
  126072. 0xdc8dd9cb,0xb50118ee,0xee87192f,0x3039e1a5,0x557419c2,0x9977267d,
  126073. 0x30f96b0c,0x462efa4c,0x3cd3c35a,0x454fb796,0x000001f7 } },
  126074. /* 109 */
  126075. { { 0x9d153926,0x10f28194,0x82b57548,0x42e28c91,0x509e94c9,0x4b423b30,
  126076. 0xde9d6b57,0xc5acc52a,0x8b3ca314,0xaa746c39,0xc63d5bc5,0x0f4ea307,
  126077. 0xe1ccc989,0x425553a2,0xf76d9194,0x271198bf,0x0000008e },
  126078. { 0x3c8e672b,0xc7900e46,0x3f2dfc27,0x703675cd,0xaf2163c9,0x704951f7,
  126079. 0x7aceaab0,0x74d69908,0x7e8d2369,0x482f21a9,0x813dc115,0xdcfbc1dc,
  126080. 0x04f6cd13,0x0ce2bc80,0x82bfaff2,0x2a54662c,0x0000003f } },
  126081. /* 110 */
  126082. { { 0x1588a8bc,0x0dcf41e6,0x210c52cb,0x6f48cd0e,0x758e7a45,0x338562bd,
  126083. 0x48b9b957,0x1600d54b,0xa6b89b9e,0x461df80b,0x098cc82f,0xf7fd4f17,
  126084. 0x14977147,0x167f01cd,0x6116c5f9,0xb1338511,0x00000048 },
  126085. { 0x5d2617f0,0xdeb76333,0x6ecb8606,0x3f9a5772,0x1b91fce9,0xa93c032d,
  126086. 0x6c84b997,0xf7a4388b,0x823ca5be,0xbfe80225,0x35a32f6b,0x6f19c028,
  126087. 0xe3cb5c58,0xf26cd5ad,0x6d0c1dd9,0x7f5ddc77,0x000001e7 } },
  126088. /* 111 */
  126089. { { 0x6ee764c9,0x3c9feec8,0xb07c82cc,0xd1bec836,0xa005b142,0x6bf1b2e6,
  126090. 0x29e8a5ea,0x70ef51a3,0x3ffe241c,0x517d298e,0x72966c28,0xbb389e28,
  126091. 0x2c7acc76,0x3a2da8a9,0x732a21b5,0x902c9126,0x0000004a },
  126092. { 0x8f7ce110,0x96c51b9c,0xaeb036f1,0xdcc33a87,0x0a6a59e2,0x82695098,
  126093. 0xe78db500,0xceaf26a7,0xc95bb030,0x82f3c384,0x24c42f42,0x6dd6e9f7,
  126094. 0x70ac4a0a,0x768dde29,0x03d22efc,0x4aedce4b,0x0000016f } },
  126095. /* 112 */
  126096. { { 0xeded03c0,0x077f032a,0x588ddd4d,0x2684a052,0x9a85be0f,0x6d09bc4f,
  126097. 0xe0b9b6bb,0xbdda0c7f,0xf2fb5887,0x19689c7e,0xec3cce7e,0xf8a96960,
  126098. 0x768d2ae5,0xb043d9d5,0xdb21219a,0x29c8081b,0x00000068 },
  126099. { 0xde59f006,0x6bf872fa,0xcb97ef5a,0xc2b9ffc6,0x58ae7ef8,0x371915db,
  126100. 0xf4ccaa1f,0xc2e23ca1,0x89c27cc4,0x1af8c60e,0xc86bdcc6,0xeee5d7e7,
  126101. 0x9bd8de43,0x9225b47f,0x4b24f08b,0x53e7f463,0x000000b4 } },
  126102. /* 113 */
  126103. { { 0xe3048bda,0x54c496d0,0x43c3de4e,0xe2b67499,0x4c2d509e,0xac2049f7,
  126104. 0x543c5089,0xb01f691e,0x105a365b,0xcd9960a3,0x78b17049,0x34d93ffe,
  126105. 0xf82c9467,0x029f99b3,0x0161a755,0x785c5ea2,0x00000091 },
  126106. { 0x953dbdb6,0xb455f978,0x97eca19f,0xea9e84d9,0x36d4d75a,0x473bd029,
  126107. 0xc15276fa,0xa9c17ca8,0x47c76356,0x9cf66133,0x039738d2,0x4a68360b,
  126108. 0x69733609,0xd3e430a8,0xe2b27f21,0x0ae532de,0x000001b4 } },
  126109. /* 114 */
  126110. { { 0x5164cb8b,0x68110e82,0x2552a67d,0x6979af4f,0x8d185527,0xe10d6d0e,
  126111. 0xfb64eac4,0xcf6c5787,0xac424592,0x8408163b,0xfce0d810,0x5d8fff37,
  126112. 0xda84c15c,0x8b284e49,0x32663ec9,0xed805567,0x00000010 },
  126113. { 0x51f3ee9e,0x106f4030,0xb38adf1e,0x2e8e3ee9,0xa13d6449,0xd3c87a6e,
  126114. 0x80e1abb1,0x27b49f45,0x0bfd7298,0xc283d179,0xafc7a35f,0x8fe50fa5,
  126115. 0xade3ad4f,0x773da545,0xd9a21df2,0x78bfaae4,0x000001f8 } },
  126116. /* 115 */
  126117. { { 0xabad5678,0xae60d8e8,0xe600c25b,0x0afa72ce,0x4c288e21,0xb9d4e0b4,
  126118. 0xd254cf9f,0x64447f76,0x959e2ba5,0x1fb36bc4,0x2961132c,0x393c44d7,
  126119. 0xfc140f19,0xd7a8881f,0x8d096648,0x27a86128,0x00000091 },
  126120. { 0x8a9e690c,0xb536c021,0xeab4fa15,0x85dcc521,0xb00ee54c,0x09af4423,
  126121. 0xaf3a8e48,0xb3793525,0xb7731d85,0xe1f36308,0x141cfb55,0xb5361d78,
  126122. 0xeffc4529,0xea41f29e,0x9f7d2634,0xcf5755b1,0x000000e8 } },
  126123. /* 116 */
  126124. { { 0xd212b398,0x01edb80d,0xd53dd373,0xd0396181,0x8a52fa95,0x0e086047,
  126125. 0xa7825e6d,0xad1e6432,0x330ece4f,0xe0185bc5,0xb078936f,0x508f7313,
  126126. 0x9e7f6ea3,0x1dc982fd,0xd5556b60,0xdbf3a602,0x000000e8 },
  126127. { 0x279e05bc,0xc3763234,0xf44453d3,0x7f5f40ec,0x7fa30793,0x310c5f4d,
  126128. 0x108d7e22,0x5cffad36,0xc2a98bbc,0xf2f01ef3,0xd7d47f80,0x30ab1719,
  126129. 0xa9b22e1c,0x7bc9f918,0xe834df94,0xf53dc52a,0x000001f9 } },
  126130. /* 117 */
  126131. { { 0xc183f89b,0xf266b49e,0x5f5806d4,0xd3fb5f02,0x94ec3080,0xd30a42b5,
  126132. 0x371cd917,0x4b6b1940,0xb7f7e26d,0xf7541aab,0x2d5b7b64,0xe55269eb,
  126133. 0x7f8036c5,0x0e1a85c1,0xda5f2675,0xa0ff0f22,0x000001ce },
  126134. { 0x3a8e11f8,0x602bd56a,0xf5f9ab54,0x29864021,0x0ccc92d7,0xc6742c5a,
  126135. 0x523f650b,0xd64569e6,0xf7fabfb4,0xc8e4681b,0xc3c9e6cb,0xb4275947,
  126136. 0x38f5ff20,0x2b3952d5,0x1f04aea2,0x818f8e38,0x000001b0 } },
  126137. /* 118 */
  126138. { { 0xe50d90f0,0x3be5bffa,0xf5011cdc,0x4cb3b11b,0xa691dfac,0xe10ca711,
  126139. 0x4ea1a773,0x62ec211d,0xe586eeb6,0x5a979ebb,0xa0c2f1fd,0x4df16ab1,
  126140. 0xc57bbfea,0xfe9e3f7e,0x5ae526f6,0x1b05960e,0x0000015e },
  126141. { 0x8630e62e,0x1c8e04a5,0x6447e1b7,0x3d00310e,0x43b4447a,0xcf1e6b61,
  126142. 0x7462e7a3,0x92abb851,0x0002724d,0x8309ea08,0xe45296df,0x1d805d70,
  126143. 0x3d4ed812,0x0f3849b3,0x6834d44e,0x2d6bffbc,0x00000096 } },
  126144. /* 119 */
  126145. { { 0x48e07711,0xd13fe58d,0xd270a3b2,0x70f83648,0x8cdff04c,0x1517892d,
  126146. 0x51411f14,0x15bb6578,0x3e4f8a55,0x6c31cd90,0x0413362f,0x73f87152,
  126147. 0xeca06d4d,0x2fe025ee,0x954e317f,0x32a6e417,0x000000ad },
  126148. { 0x69d147df,0x7e38c63f,0x710bf37b,0xb69bb06e,0x28d514de,0xb94debef,
  126149. 0x8d11c3d9,0x4b2307fb,0x0385c604,0x3b369df9,0xe7800e83,0x68ea2f49,
  126150. 0x7d501c1c,0xf028b258,0x5cef7818,0x97078221,0x00000055 } },
  126151. /* 120 */
  126152. { { 0x54c1d751,0x10c351db,0xba0f9512,0x81445301,0xbfdc8bed,0xa77eb34f,
  126153. 0xcf23680a,0x498d8138,0xe04f2860,0x928c14a4,0x16a5b6da,0x96192dba,
  126154. 0x5f9a9103,0x49dea95b,0x01724102,0x80dd4578,0x00000085 },
  126155. { 0x0e09221c,0xe9072500,0xf21de056,0x62e05b21,0xe0e60950,0x448cafa1,
  126156. 0x6f775129,0x657fb97b,0xf1f34aca,0x5d2991bd,0x49ff15d6,0xa66cd5ac,
  126157. 0xd049ec79,0xdc1d6897,0xe72baea8,0x388fca84,0x00000067 } },
  126158. /* 121 */
  126159. { { 0xa6ef1dd3,0x6520b49d,0x3ba6cd76,0x391a045e,0xf33d5f48,0x9c84980a,
  126160. 0xef07474a,0xe53cf5b2,0x78bfb1ea,0xa35b2e9a,0xeda906fa,0xeca97fd6,
  126161. 0x1b9f2cf4,0xf1a93789,0x3ab28589,0x66753369,0x0000010d },
  126162. { 0x73691faf,0x5b510496,0xd57ec618,0xdc73d3a9,0x930a8525,0x7e2921bb,
  126163. 0x40b05b69,0x094f571e,0x413bedca,0x5e96a017,0x8d1a6b98,0x9e7d4f72,
  126164. 0x3eade8b7,0x55143fda,0xd16e454d,0x859b8444,0x000000fb } },
  126165. /* 122 */
  126166. { { 0x7c667aaf,0x7c22083e,0x4a91ccba,0x33545cb9,0x8ca0e94a,0xca1e9931,
  126167. 0xe4eaa0c7,0xc3afff23,0x42f56844,0xa21ac436,0x60d52d0b,0xfcc68a8b,
  126168. 0x6a9301d4,0x401a585b,0x907abce1,0x547f762c,0x000000a3 },
  126169. { 0xfbe260ce,0x63dd3ed3,0x80dc01fa,0x2717752d,0x6f1da3e4,0xd5fab75d,
  126170. 0x5261f10e,0x5f16864a,0xd20cd6bb,0xbe7b1f63,0x221ac656,0x9d638c10,
  126171. 0x673b918e,0x3137b8f6,0x4ada2fb8,0x23eb4438,0x00000174 } },
  126172. /* 123 */
  126173. { { 0x2a1fbcf4,0x194e27c4,0x5facd5ee,0x4c0d285b,0x915e6607,0x75c2ebdd,
  126174. 0xef0a6a9a,0x1e696510,0x067cf458,0x13c5afa1,0x7bee1fba,0x2be013c1,
  126175. 0xdad279e7,0x85a406d6,0x5142cf59,0x0042951d,0x00000031 },
  126176. { 0xa22bbc45,0x6a735ec1,0x7f56f4d8,0x4ee5391a,0x236001de,0x305af9d0,
  126177. 0xaa2f8d25,0xa8b21851,0x187db78a,0x0e2c36d8,0xa1a888c3,0xcfcc083f,
  126178. 0xbd3e7d5b,0xb91dab7f,0xf4fdd023,0x62d85460,0x000000f4 } },
  126179. /* 124 */
  126180. { { 0x4972d703,0xf568ba02,0x39098a03,0xfc44ca1d,0xae28c855,0xe9b8e542,
  126181. 0x5b1b4536,0x4fd4f360,0x4c7f7e48,0x2e08b07b,0x2230823d,0x042f3b98,
  126182. 0x1889fd13,0xc9ffd313,0xc6c68359,0x56af0652,0x000001bb },
  126183. { 0x06e0f16a,0xedbf05e2,0xd74644a5,0xfc1ac2fa,0x0f92c71a,0xe59a0a98,
  126184. 0x36c800a1,0x13ae37d7,0x236178dc,0x5f20efc6,0x2b46ef10,0x443a58b8,
  126185. 0x442509e4,0xc9517dcf,0x640ed9b0,0x7d0bb415,0x00000166 } },
  126186. /* 125 */
  126187. { { 0x3d22842d,0x3aa30a61,0xb3c4ece0,0x8c6e00f5,0x6df82b79,0x8764cf87,
  126188. 0x78d208c5,0xda92d86d,0xe788854a,0x0a52d391,0xa59b0994,0x499b26fb,
  126189. 0x04c5fc9a,0x5dc133ad,0x34e3f134,0xa5c09269,0x000001dd },
  126190. { 0xfad6d673,0x6f0dcac2,0x00f3b3fe,0x6d8fdf05,0x631756e9,0xece71941,
  126191. 0x0a4d80e3,0x3990f493,0x31d13001,0xf2aca936,0x75581638,0xee91966c,
  126192. 0xe6dd5679,0x6df0f574,0xccd71cda,0xbe124868,0x00000111 } },
  126193. /* 126 */
  126194. { { 0x475cc1b4,0xf644c726,0x2b73978c,0x915fc2f9,0x0e3d7eb7,0x65a7e6d1,
  126195. 0xf40c38e0,0xbb44e21a,0xe1ad24fc,0x988662b9,0xc35606e5,0x270ba4dd,
  126196. 0x1a4f93f7,0xc3834a2c,0x3362a4d7,0x93d0c9a2,0x00000021 },
  126197. { 0xf769fd7f,0xe2cb7b8c,0x89a213b9,0x1815da97,0x6b910fef,0x7b4f8c56,
  126198. 0x26931438,0x2088b309,0x925b37c0,0x477b71bd,0x26a640e5,0xa049a921,
  126199. 0xfd21c6ef,0xd3ddf1bd,0x232a56b2,0x9b5f9d7d,0x00000064 } },
  126200. /* 127 */
  126201. { { 0x679a9c35,0xd640adf8,0xcb74d796,0xcdad98e3,0x5f8e9daf,0x464b8ebb,
  126202. 0xad4a073c,0x4738614e,0x2edde557,0xbd86c0ee,0x576ce0b9,0x77331738,
  126203. 0x4095fb96,0x9b5d3327,0xee09aead,0x72f0aeb3,0x00000136 },
  126204. { 0x64e54ba5,0xa388c76d,0xdc474d21,0x63fe7af1,0xb2a77081,0x7fa3e9d1,
  126205. 0xde1240ad,0x0447b49e,0xc720303a,0xd9f64b66,0xe6bd0213,0xb1c78029,
  126206. 0x0aa03ea5,0x1caf1c70,0x3bb85d2b,0x179180eb,0x00000103 } },
  126207. /* 128 */
  126208. { { 0xaf2ed12f,0xadbf4f9f,0xf380fd8a,0xce1d19e4,0xa39e81ae,0x0957bdb5,
  126209. 0x626ef6bc,0xf9833321,0x0cf5b28d,0x110ae5ea,0x20392cd4,0xab159450,
  126210. 0x6bc67855,0x67c49887,0xa3fd61c6,0xce7e5938,0x0000004a },
  126211. { 0x28c7dea9,0x59c5b9ef,0x0a6a7184,0xd02f95ba,0x8202769c,0x034dc257,
  126212. 0x94dd6896,0x213b0b08,0xb5dea95a,0x03730b7f,0x617ca889,0xfe243ed0,
  126213. 0xfb1ba052,0x16cf4d17,0x226f96da,0xd8691d6b,0x000001c0 } },
  126214. /* 129 */
  126215. { { 0xbf8015c2,0xaa2edf3f,0xc49502d8,0xe7f8236d,0xa6a43157,0xe890f6e0,
  126216. 0xa2d04b0c,0x318ef325,0xa809dbab,0x9cc0668d,0xda67ca21,0xdd26937a,
  126217. 0x83febc49,0x8f27c12c,0x3c9b9844,0x87b3db2f,0x00000029 },
  126218. { 0xfd2e3dc7,0x37e7aed0,0x7415fd55,0x498e8bdb,0x58a45f25,0xfc0d6c9a,
  126219. 0x209c85d0,0x83d5baba,0xd579e1ee,0x31ec8dc6,0xa502bfed,0x1f4cad0b,
  126220. 0x1f41bef1,0xc432e6ce,0xbbffca65,0x3b10afaa,0x00000191 } },
  126221. /* 130 */
  126222. { { 0x53053af7,0xbd9f7df0,0xb28a1cf4,0x60304765,0x7ce90438,0x441778fc,
  126223. 0xac8c5ddd,0x8fbed36e,0xfb59ec61,0x27b1313b,0xa1b1becf,0x9d2656ff,
  126224. 0x945973a9,0x334e1345,0xc362b595,0x3261888c,0x0000018c },
  126225. { 0xaa7f6ff8,0xf413a414,0x3fab7c7a,0x092aeb88,0x7cc307ba,0xfa1d886b,
  126226. 0x2346100e,0xdc81c125,0x02140c93,0x93d4d273,0xe6104835,0xa1ed7e3c,
  126227. 0xdf1795f3,0xe2b91ecf,0x369ed416,0x160dc11a,0x00000191 } },
  126228. /* 131 */
  126229. { { 0x8b57d7cc,0x9a72f46e,0x4bf02386,0x3140b0e5,0x05b3a91d,0x886c396e,
  126230. 0xa4ec26e0,0x1b9ab3a9,0xc50f58e9,0x742feaeb,0x55e26af0,0x1592c608,
  126231. 0xbb1cd9f7,0x943cd476,0xc7f02c89,0x3ed97fd4,0x0000017c },
  126232. { 0xe6d54964,0x53b02503,0xc6a318c0,0xd9bd1162,0x9cc28c22,0x18ff6cf4,
  126233. 0x03534640,0xa45c7840,0xb4cc0668,0x8ea3335e,0xf42dbe03,0x7ad727f8,
  126234. 0xfdf6c3cd,0xb157e911,0xec992d76,0xa7f894c9,0x000001b3 } },
  126235. /* 132 */
  126236. { { 0xaf09ea77,0x91e6e397,0x75dc25c5,0x26a760b9,0xb94a197b,0x8c040c08,
  126237. 0xb68ce619,0x041baca8,0x5bd23564,0xa19a0d15,0xd977b33f,0x86ca5b94,
  126238. 0xe5fbd029,0xf31f87f8,0xb1901f99,0xf76c55a6,0x000000b8 },
  126239. { 0x3846ec9f,0x175bf8c3,0x9deaca46,0xf462205c,0xa3108df0,0x92cb5ec0,
  126240. 0xcfaed928,0x879db283,0x65049fb2,0x477dc004,0x96ee5031,0x48d24bac,
  126241. 0x56adce45,0xa7db6b16,0xab1c684f,0x0110cdab,0x000000fc } },
  126242. /* 133 */
  126243. { { 0x4d308bf2,0x151b66d8,0xd6638004,0x99013c9f,0xfd383bf9,0x6892df92,
  126244. 0x3ffc8efc,0xa10efd84,0x313ea287,0x527e316c,0x3a0df740,0x8ef6e3cd,
  126245. 0xf6ebd2a1,0xcb96e430,0xa70ee4ce,0xc1ebecf2,0x0000018c },
  126246. { 0x1a70404c,0x80d14ad7,0xf9ce2a30,0x6ad21dd0,0x3aa3e072,0xb94cbcde,
  126247. 0x6363a690,0x0ab59611,0xc6b1e2b4,0xe70bff45,0x66ceec5b,0x1296dd0b,
  126248. 0x747757c0,0xd4cb2a74,0x3d7d91e8,0x08988ca6,0x000000aa } },
  126249. /* 134 */
  126250. { { 0xf8db0396,0xaa2dcfca,0xb422da76,0xe8ae8f37,0x96485724,0x652f8349,
  126251. 0x7bf1493f,0xf647c3c4,0xb0247a4e,0x8b600b46,0x7aebda8e,0xabf3e439,
  126252. 0xa7958df0,0x2e1d231f,0xf881bab2,0x38e692b1,0x000000ef },
  126253. { 0x26cf3047,0x1f3c1689,0x59539858,0xdad14f94,0x293f20b6,0xfde85d1c,
  126254. 0xf57abb17,0x2ea5436e,0x1794de38,0x0d1a8ffc,0x2bfecd2f,0x9ba508e2,
  126255. 0xdb786042,0x110f0a7f,0x7cde31f8,0x2ade6f64,0x00000196 } },
  126256. /* 135 */
  126257. { { 0xfec78898,0xc996a537,0xde0fa77f,0x0b39de72,0xd34cb08f,0xf6d076ac,
  126258. 0xda78d353,0xacd8bb82,0xa0392cc1,0x5fe804d3,0xe581549d,0xab7adede,
  126259. 0xc067c6d9,0x883901a0,0x4ed93f37,0x5855ffa2,0x00000191 },
  126260. { 0xbf9ebef3,0x29570e36,0xdf4b3177,0xe21046a5,0xa6816b5c,0xf9b89a95,
  126261. 0x288d0e11,0xadf39281,0x3979159a,0xd6baabe5,0x5c8fabb2,0x411afee0,
  126262. 0xe5c7af10,0xf192c3af,0xd7dce37b,0xaa72e81c,0x000000f7 } },
  126263. /* 136 */
  126264. { { 0x16c386ee,0x20fa3c0f,0xd4c09839,0xb33b0469,0x876a3136,0x79e0d722,
  126265. 0x3c406c06,0x343c0a92,0x4debe27d,0xef220e3e,0x196f00ea,0x09d7b1e1,
  126266. 0x24a9dcff,0x4a0f5dd8,0x99c1d085,0x53582ec5,0x000001e2 },
  126267. { 0x5138c7ed,0xcc8ef262,0x6547f88d,0xdec43194,0xdd0a9488,0x2b6e53ad,
  126268. 0x8257ebdc,0xeb9f1efa,0x1f08c989,0xc583c6eb,0x40163768,0xf1736911,
  126269. 0xdbc20e3d,0x6282ff8b,0x9cbd514e,0x26b81005,0x000000d5 } },
  126270. /* 137 */
  126271. { { 0xa0025949,0x2449522f,0x0bbd8945,0xb26d888f,0xe637216f,0x33442f5f,
  126272. 0x472827f6,0xd8ec3b64,0x99fc2681,0x91d8a1a3,0x68c7710d,0x6d232ead,
  126273. 0xe51b2762,0x8e5bfe2f,0xfd109fa7,0x0f9f4fed,0x00000004 },
  126274. { 0x6b4a05e0,0x1952ea51,0xf21c78eb,0xcb0d48ee,0x1997dfdb,0x64d36619,
  126275. 0x8b4c21fd,0x0d11b204,0xbe92303a,0xa6f569b6,0x78c5e809,0x2b8f6096,
  126276. 0x36805d8e,0x7226b5ab,0xdb349ca2,0xd6cff180,0x000001bd } },
  126277. /* 138 */
  126278. { { 0x943cc612,0xa49f8576,0x832b31c7,0xc914319e,0xcccadebd,0x9225e297,
  126279. 0xb0619821,0x4918fb42,0x25b1cc7c,0xaccb3084,0xa646e5f0,0x751d3347,
  126280. 0x590e3e22,0xeafb4aae,0x2c4a0008,0x82146038,0x00000151 },
  126281. { 0xbf96a461,0x3c2481db,0xb52a3ba4,0x51c122e9,0x464db08b,0x21c2858e,
  126282. 0x6d6a081d,0xb1014b78,0xf533cef7,0x167d3ed4,0x81545f7c,0x6cfb3294,
  126283. 0x449b7b9f,0xea46d31c,0x9621c299,0xcfad7613,0x00000081 } },
  126284. /* 139 */
  126285. { { 0x478a7f0e,0xef796327,0xde17705d,0x914183e2,0x572117e8,0xd24a26df,
  126286. 0xb7cd52cf,0x3cdb1b09,0xad83c160,0x9e42b9fb,0x709ef8c9,0x6971d2ea,
  126287. 0x8ee54ccd,0x1894fc5b,0x34a520fc,0xf757b4e5,0x000000fc },
  126288. { 0x86b62347,0x5a5518cc,0x7bc2a928,0xec51c9d2,0x2966727f,0x2eea2b05,
  126289. 0x0ae43e6f,0xbc8a8e3a,0x05ca066b,0x80535b5e,0x8833986d,0x91ffcdb1,
  126290. 0x32374cdd,0x2f4a5bba,0x0d202243,0x08763a49,0x00000124 } },
  126291. /* 140 */
  126292. { { 0x4efac14d,0xe498b972,0xa79a9d3c,0xb6f4bf8d,0xd6e07c29,0x0f1e8dbd,
  126293. 0x71771538,0xfac30cfd,0x71b03263,0x4c91ed22,0x19b455f5,0xbf938335,
  126294. 0x127092bf,0x76a5e789,0xb4813bd9,0xa97674e1,0x00000128 },
  126295. { 0x583e5924,0x29b63c41,0x8f171d06,0x61f9aff1,0xab227a28,0x2b45b3cd,
  126296. 0x8a11ab70,0x939d5dda,0xe8db6971,0x2bfb47b0,0x0ec10805,0x562379df,
  126297. 0x24ce1801,0xaf5a6481,0x34f94aba,0x8d98c434,0x00000150 } },
  126298. /* 141 */
  126299. { { 0xcfffc80f,0xdea9fe73,0xd43473f6,0xe23e2e9b,0xc9d37ba7,0x27fb3ed3,
  126300. 0x7a3fc357,0x733766d2,0x8e04a03d,0xd0db4cf3,0x2bbe0f43,0x8ce01752,
  126301. 0xda986f4f,0xd87eb719,0x2fe6b037,0x6d1b50ae,0x00000153 },
  126302. { 0xda40bab1,0x371f5def,0x9b2bda63,0x07d6a8af,0x0d4aca87,0x5e8a5c89,
  126303. 0x643ff8ab,0x4d72f0ff,0x4bf8ec2f,0x9c4c10d9,0x0eb93e22,0x36b0eaba,
  126304. 0x1d2dfd01,0xbc4b0e8f,0x9d34a082,0x9f252e5a,0x00000142 } },
  126305. /* 142 */
  126306. { { 0x7d0e7020,0x4affd4c1,0xb5482168,0x9b169aaa,0x588f348f,0xdbe01708,
  126307. 0x885986bb,0xdaebf6ff,0x15f9c381,0xb33987f5,0x04a94a7b,0x7e455f2c,
  126308. 0xa0ed6849,0x39a41442,0x1ef7798c,0x1c1ad4a6,0x00000154 },
  126309. { 0x072709c4,0x7647b628,0x8810e5fe,0xb330d68b,0xe92e0f63,0xd1bd8874,
  126310. 0xf8bea9ba,0x144e4fb9,0x8318981a,0xc15afc18,0xb68c6a07,0xe19c5c82,
  126311. 0x36e00b66,0x858c57a2,0x07cb7aec,0x9b255110,0x00000011 } },
  126312. /* 143 */
  126313. { { 0xc887027d,0x121ced27,0x2bfab286,0x6050f335,0x19d511e2,0x6e373c1c,
  126314. 0x7f4c69f5,0x02d4c3a9,0x25226bb4,0xe6f356af,0x83e7ac30,0x3b9011c3,
  126315. 0x33d8fdfb,0x43b0c23d,0xaf2ea363,0xa8c390f7,0x0000000b },
  126316. { 0x7e851bac,0xc430c3d6,0xa5f544fc,0x8991c389,0x67fba061,0x006bbc64,
  126317. 0x97cbdbf4,0xd49d024e,0x7734adad,0x4539b7dd,0x28cb6d2a,0x90ba8f9f,
  126318. 0x4de4b3ad,0x7a921830,0xa7b96928,0xb28732ef,0x0000006a } },
  126319. /* 144 */
  126320. { { 0x22ed5986,0x71dab52d,0x58533e06,0xdeee627a,0xcf155fe3,0xe8fee37a,
  126321. 0x7ae8b132,0xcd61490d,0x34a08b94,0x2706e185,0xf9c15c30,0xa85ffd52,
  126322. 0x51a5ad46,0xd5a224f3,0x54d700bb,0x44d1b6d5,0x000001e6 },
  126323. { 0x862e4e9c,0x96830686,0x48763fe4,0xfe5cd76c,0xc0839caa,0x60309679,
  126324. 0x8d83d62d,0xc0e4cbeb,0x11bc4ae2,0x911e254e,0x64fca062,0x96a0d7c8,
  126325. 0xe9a27045,0xf5785dd5,0xf3e0412c,0x2f4677d0,0x000001be } },
  126326. /* 145 */
  126327. { { 0xab01a6dc,0x4c0012dd,0xae1adb69,0x391bd6c1,0xb9b05079,0x3ae7daec,
  126328. 0x62a1061f,0xc2714f9e,0xa96536b7,0x71978ee7,0x5e17654b,0xeec11bd0,
  126329. 0xefab3dd4,0xc71166e0,0x87edbf61,0x0f7aa572,0x000001d7 },
  126330. { 0x51eb5932,0x26ea6f7d,0x5f882ca4,0x354ea0aa,0x7739f7dc,0x175b6097,
  126331. 0x9be57934,0xd335192a,0x78545ecc,0x9801f423,0x7b643c9d,0x32b8e256,
  126332. 0x23e3abec,0xb9411dd7,0xcf1c6509,0x656dea68,0x000000ee } },
  126333. /* 146 */
  126334. { { 0xa0890deb,0x4d38e140,0xbceb84bd,0xbf7bd87d,0xba041dec,0x51f0ff72,
  126335. 0xa6820be9,0xafeec70a,0x8c486298,0x755190a3,0xe7010ec4,0xecdba558,
  126336. 0x8c7879b1,0xced91db8,0xef5e215c,0x08de3e4c,0x0000014c },
  126337. { 0x16266da2,0x9c1534ed,0x7b4c9009,0x9ce322eb,0x69927688,0x37decaef,
  126338. 0x05c2844d,0x6525097f,0x1ac519ab,0xd23b7e13,0x65a3cc86,0x682ebb72,
  126339. 0x628c4575,0x0c531db9,0x73805373,0x2e00e8b8,0x000000be } },
  126340. /* 147 */
  126341. { { 0x57ed32e9,0x3807c800,0x7c024997,0x427e40cf,0xabb54830,0x58506abb,
  126342. 0xce820bf4,0x5649776f,0xb2c43e81,0xb5353293,0xcfef6648,0x671e8353,
  126343. 0x903bdca5,0x27217d3f,0xa813fd79,0x40a9c109,0x000001dc },
  126344. { 0x3db21a38,0x6beaa6c3,0xd73ef7e4,0xcae222e1,0xbd1d507f,0x1ff684e7,
  126345. 0x587a77ab,0xf5bac664,0x0c64a4d6,0x58c74f62,0x6a7c378a,0x4ca837d9,
  126346. 0x3e42e409,0xf43df531,0xfb49e14f,0x8a9a4347,0x0000013f } },
  126347. /* 148 */
  126348. { { 0x992f8923,0x85ab4edf,0x6fd209f3,0xe24aa5e0,0x1b1340ee,0x27be9b87,
  126349. 0x91e0bb40,0x2957d11f,0xf3d4c62c,0x425afad2,0xc7ff7aaf,0x2d231286,
  126350. 0x0114cbe9,0x96412b2b,0xc3e23529,0x6706a231,0x0000019f },
  126351. { 0x225c02af,0x06b3bbd2,0x3fa3e98d,0x53ebc166,0xb84f482e,0xa6df2b75,
  126352. 0x2bfc55df,0x912b4521,0x512a73da,0x30bdbd40,0x3d53eaa4,0xac0f43d9,
  126353. 0x0c27fd53,0xfc358fe4,0x919424b4,0x2cb183be,0x000000a3 } },
  126354. /* 149 */
  126355. { { 0x3fa6a746,0xe39b0c2d,0x1d5a24a8,0xe84a7922,0x78cdf2b5,0x70a58914,
  126356. 0x30666cb3,0x8a88067d,0xf6d71d06,0xb09a709e,0x0065d184,0x50007a3e,
  126357. 0xb8dc9448,0x7046af4b,0xc65493ac,0x2b6a3129,0x000001fd },
  126358. { 0xe45f2771,0xd3d5d5bd,0xf432ed95,0x8542b08a,0xf232a6bb,0x2ecd40fb,
  126359. 0xe8beccb2,0x0fcb6143,0xbf8e247f,0xcecc513a,0x8da3039b,0x955d56f7,
  126360. 0x56c2a0df,0x9157c619,0x3031fe2a,0xa6d35cbf,0x0000018c } },
  126361. /* 150 */
  126362. { { 0xbe0c4923,0xdd800b1b,0x6902907b,0x046ae740,0x957bd0c7,0x2398b37f,
  126363. 0x9655f8b8,0xaa8e1a9d,0x500f4150,0xcd2927fa,0x202e7aee,0x826a9c6d,
  126364. 0x9f29692e,0xb4cf58b3,0xbf41577c,0x3093868c,0x0000011f },
  126365. { 0x333ed442,0xadcb5e7a,0x906fef7b,0xae5c8e2f,0x3d98f228,0x2d9b0123,
  126366. 0x7ffe125c,0x4632f2da,0xba231835,0x59487731,0x12d2c512,0xa0caae5b,
  126367. 0x9857d9c4,0xbf00e658,0x54f200f6,0xc5d10086,0x00000172 } },
  126368. /* 151 */
  126369. { { 0x2fc283e0,0x58954046,0x7ee0880e,0xf7633984,0xb7fd1622,0xfaf1b40e,
  126370. 0xf598c5ed,0xecf5151e,0x7e00d9bb,0x6b4d92f7,0xa8c43fd4,0x7543e3b3,
  126371. 0x6511d1d2,0x3994e12c,0xaf05b6d3,0xdd841a1d,0x000000c6 },
  126372. { 0x23b991ad,0x23da17e0,0x71fba514,0xaab2b213,0x0ddc1879,0xb417ec5a,
  126373. 0x5f63acdc,0x173bc8ad,0x1e2a7d50,0x2fcf5210,0x6106d008,0x63373fd0,
  126374. 0x7db012cf,0x1e8211de,0x576545ef,0xa07766d9,0x0000018c } },
  126375. /* 152 */
  126376. { { 0xaf80dfaf,0x8e4347b9,0x9c4667f3,0xa80b631f,0x6ddbc238,0x6ff1db26,
  126377. 0xaa8718a0,0x6161e365,0xaf31c35f,0xe7f7ac90,0xfc6846e8,0xc03831d1,
  126378. 0x684175b4,0x1e669d10,0x934b731a,0x6da9d620,0x000000c7 },
  126379. { 0xa3e4e78b,0x981f597b,0x55099f9a,0x2c14dedc,0x93088c61,0xbf373995,
  126380. 0x9b207458,0x7c568307,0xa2276900,0xc4440c47,0xf7e6daf3,0xb6df23c8,
  126381. 0x42929103,0x4f662c25,0x8b3b7963,0xf4ea6db1,0x000000f9 } },
  126382. /* 153 */
  126383. { { 0xced36049,0xc669eb88,0xf41b99f8,0x87a4ffe1,0x6a72e108,0x690b7563,
  126384. 0x65a0bb8a,0x67dd6a8c,0x96e42955,0x42cf8c58,0x1aabffad,0x5286b5f3,
  126385. 0x8f6f26a4,0x1f7dfaf2,0x0e1ae503,0xc5d9e0ac,0x00000120 },
  126386. { 0xacc10da7,0xafbee3ff,0x944946e5,0x67e2d5f9,0x3c4220ff,0x8ec17e86,
  126387. 0xbd6f632e,0xfe6f7414,0xc3fc9ef4,0x4a9e3c0f,0x03bfb870,0x25ff3cba,
  126388. 0xbb03342d,0x18fd3600,0x0050cd2e,0x1e63e753,0x000001ac } },
  126389. /* 154 */
  126390. { { 0x8f3d6a02,0xdd83d07c,0x7ef4d0d1,0x71fc143c,0xd4c7af61,0xca994bf0,
  126391. 0x827c5cf0,0xc8a93e98,0x2b697882,0x4a102c7b,0x8a55e8ba,0x633c87d5,
  126392. 0xcc2d64f0,0x1ae8822f,0x986d01fc,0x2ce9b53f,0x000001c1 },
  126393. { 0x95dc1b79,0x859639fd,0x3f4e616a,0x2728f754,0xede2fb9f,0x6e703c4c,
  126394. 0xd50fae9e,0x042f7680,0xc2d530ed,0x0546bc3b,0xcdd598ac,0x00a4006b,
  126395. 0xe1294910,0x3f3286c9,0xb6bf9629,0x77782255,0x00000146 } },
  126396. /* 155 */
  126397. { { 0xe30c98fe,0xaf81421e,0xfc2cd705,0xdeb0feb0,0x14df6ad2,0x9b2c4ca6,
  126398. 0x9ba314e8,0xd38134de,0x4f04b16d,0xa443deb8,0xf07f8ca8,0xfc556ee0,
  126399. 0x3a4f3917,0x3c1c83bb,0xb1adcd41,0x8397dd24,0x00000199 },
  126400. { 0xdf4781e6,0xca01e17e,0x46f1f901,0x32d7c319,0xb53090da,0xa227a613,
  126401. 0xa7c8c607,0x2495b1dc,0xddc69709,0x1cf2fbee,0x45608098,0x1d3d82bb,
  126402. 0x085134d7,0xcfcddda3,0x96798c41,0x3dd171b5,0x000000d2 } },
  126403. /* 156 */
  126404. { { 0xd4dd7e96,0x97a40f84,0x8409fc0c,0x7114c8ea,0xa9d11393,0xc56f29e6,
  126405. 0x8fd8c6d6,0x3b606621,0x00269e7c,0xad3baa86,0x05929d5f,0x1413c6b0,
  126406. 0x222e365b,0xc1ad7e40,0x4798aaec,0x6a82621a,0x000001d3 },
  126407. { 0xc1003c81,0xaeac45c4,0xf43d8602,0x9ef9ef5a,0x60f77469,0x36a65f5e,
  126408. 0xbf5d2858,0xf312e7ab,0xc84acef1,0x2f53ec81,0x9d248b52,0x63e32ca2,
  126409. 0x81e65c60,0xfe9aa7c5,0x52841973,0xe3686c9a,0x00000017 } },
  126410. /* 157 */
  126411. { { 0x9e90de99,0x0b2efe65,0xad05ab63,0xbe4485bc,0xe14e4892,0xc48a6a52,
  126412. 0x22628687,0x2ad85430,0x5eb3db54,0x261f0e95,0xd45e5841,0x48e81863,
  126413. 0x8ed75739,0xcfe1ce0f,0x7d84ade4,0xbd6f1ff5,0x0000003f },
  126414. { 0xd1bf968c,0xd43711dd,0x48dfa472,0xd558d7cd,0xe425a566,0x49f09223,
  126415. 0x5c26d041,0x0cf83338,0x7c2c1743,0xbe7b81f1,0x5143d9d9,0xe3bdc33e,
  126416. 0x94fd3fae,0xf385ac35,0x9fd1811a,0x7551cf42,0x00000113 } },
  126417. /* 158 */
  126418. { { 0x20193bb2,0x4928f55b,0x7310b872,0x96e579d0,0xd345d276,0x5ee06309,
  126419. 0xa871868a,0x9a43e432,0x11038683,0x28c113e1,0xa332f108,0x8286ecf3,
  126420. 0x0385cbb4,0x3348aa37,0xef158daf,0x698ffcaa,0x000000c6 },
  126421. { 0xf6908745,0xa044c54a,0x6a3353fb,0xa6b336e4,0xd561e821,0x694c2852,
  126422. 0x3634917f,0x1b297970,0x81f61315,0x6e1023b9,0xef46a5ef,0x6817dc2b,
  126423. 0x8e114f7f,0x93dea0af,0xed72c5bf,0xc3cf3cd5,0x00000136 } },
  126424. /* 159 */
  126425. { { 0x7b080de4,0xbb8799ab,0xd69d8396,0x3b8f781d,0x986f8f63,0x76b42aaa,
  126426. 0xa54bc5ca,0x5d74c038,0xa9c2fbb9,0x76fcb605,0x80178930,0x8451b440,
  126427. 0x9d286f0d,0x40f00c38,0x0c543263,0x3038e952,0x0000014c },
  126428. { 0x6977aad9,0xc94bc381,0xd7087be3,0xadbfd082,0x875fed08,0x06d0820c,
  126429. 0x345656fc,0xe1ce84d4,0x0fd6dd4e,0x71c4d8e0,0x6a5fab40,0x23338b22,
  126430. 0x0baeeb6f,0xd477eac1,0x5f80c26c,0xe4db08bb,0x00000078 } },
  126431. /* 160 */
  126432. { { 0x1078342a,0x0111d12a,0x559a1064,0x0534725e,0x0fd3ffdd,0xea459d59,
  126433. 0x06f0ac1f,0xcf694a9f,0x3e19bc69,0xf6d24adb,0xb9ddcd00,0x3ce38f5e,
  126434. 0xb632dd4e,0x38400f66,0xe15e1c55,0xcab8fdfb,0x00000085 },
  126435. { 0x8d09422f,0x0a943f6b,0x0f988c3b,0x17d29756,0x2ef2e4d9,0x55a441fa,
  126436. 0x35f7c13f,0x6743523b,0xedaad3ff,0x274d3407,0x9347242d,0x59411435,
  126437. 0x3bb8615d,0x1cb27301,0xbd7794cd,0xa0437004,0x0000007d } },
  126438. /* 161 */
  126439. { { 0x2d712c44,0x824b99a6,0xa6962577,0x148368f8,0xd65e2287,0x8ed68432,
  126440. 0x6f5bc5f8,0x14028306,0x4ec3479d,0xe6cf3121,0x9326db70,0x96db6f44,
  126441. 0xca32936b,0xca5ac098,0x2fea21af,0x69e248c7,0x0000004d },
  126442. { 0xa71269fb,0x0aa89092,0x18650b60,0x2f6bdba8,0x9fb55db2,0x1d9cc2a3,
  126443. 0x6311e9d0,0x0fceb0df,0x90ac2c1d,0x6faeb79c,0xcb1f372a,0x2393b222,
  126444. 0xbc8c4193,0x62a6f3df,0x2fe8e674,0x9dea30b2,0x00000001 } },
  126445. /* 162 */
  126446. { { 0x12b3118b,0x7df689ac,0x6cb6ea56,0xd06ee39d,0x187cd978,0xcfcc22c2,
  126447. 0x8d537d87,0xb985b681,0xe9f56db2,0x75845152,0x5e098c15,0x0f839871,
  126448. 0x3b212cd2,0xbe96a5c8,0xd9ac1c47,0x3dda0338,0x000001fb },
  126449. { 0xcfa0a9b8,0xf06b7fe0,0xe22dcf75,0x9478bac7,0x136887c8,0xf3815e04,
  126450. 0x914c54bc,0xed811dde,0x0f51ea64,0xc8c24160,0x4c870577,0x63914d83,
  126451. 0xa8abbcb4,0xed24e552,0x2644f52e,0x9e5eb9e8,0x00000001 } },
  126452. /* 163 */
  126453. { { 0x66d52313,0x1f65a04e,0x4d3f72bd,0xfd694545,0xa6b7ae11,0x2bc0ddaf,
  126454. 0x571ab247,0x921f79d8,0xae5a8d68,0xd4c5f966,0xaec5ce13,0xfde17716,
  126455. 0xb764bd39,0x70e6eda4,0x990d6783,0xffe94085,0x000001ef },
  126456. { 0xd88f92e8,0xf3fa0e27,0x9c77123c,0xa21ef0fd,0x89274dba,0x6259974c,
  126457. 0xb9ba2762,0xd4cfa4a5,0x46ebcaf6,0x10c909d2,0x8f8e2870,0x0317a10d,
  126458. 0x453aeea2,0xb0771de1,0x68c6b0a3,0xdf0c4791,0x000000ea } },
  126459. /* 164 */
  126460. { { 0x4c854477,0x11bc1e48,0x8638e47c,0x2bec25b4,0x869c54d9,0x43d4e02b,
  126461. 0xbe1e7ed2,0xe318de32,0x6b460c4a,0xf5471eb0,0xaa426afe,0x38ae7bf3,
  126462. 0xd8452dc1,0x23ae26dd,0x5782de9d,0x9d3fc1d5,0x00000164 },
  126463. { 0x0ade1979,0xd87cae31,0x3b4bc728,0xa847041d,0x56c3c9be,0x38923c40,
  126464. 0xd74ae467,0x36fe182a,0xecbe49ae,0x92bff6f4,0xdc41f9f5,0x6680db80,
  126465. 0xe4630715,0x35bac06f,0xd6d07307,0x6d68b4c7,0x000000c0 } },
  126466. /* 165 */
  126467. { { 0x854dfcf2,0xdbe22be7,0xa6ae3bd0,0xee21a7df,0xa521ec46,0xf4633ad1,
  126468. 0x41a9484c,0xee94527a,0x2aa123f3,0x1145eb9b,0xcae3ca92,0x5634a82a,
  126469. 0xfc85d925,0xe176aca0,0x19082d8c,0x504cf7fc,0x00000078 },
  126470. { 0x3799793c,0xd74ce7c4,0xb5519fb5,0x74ddd618,0x95ff9808,0x2cf6df93,
  126471. 0xb8bf61e6,0x00ea45d1,0xdcfcf54f,0x26863613,0x030035b0,0x67423b76,
  126472. 0x4028a9cb,0x9fbc7534,0x051a077e,0x7b52ce37,0x000000f4 } },
  126473. /* 166 */
  126474. { { 0x96bec962,0xebf7d8ad,0x17e0107a,0xd1cc81f6,0x214e1058,0x64c44509,
  126475. 0x42394c9f,0x6c298c43,0x1a660513,0xd910052d,0x90df8243,0xc3643754,
  126476. 0xfe5cdea4,0x2313be1e,0xd27fb7b1,0x249a60f7,0x00000076 },
  126477. { 0x1cf593a0,0x74975838,0x8364c59e,0x0c9ceefb,0xe05c9991,0x2f5a1333,
  126478. 0x421808e3,0x30ea5e1f,0x4f5e8f4f,0x56fb3a4f,0xb6c0cb47,0x2cae6e2e,
  126479. 0x08bdcc6a,0x60b307fd,0x0ff8c117,0xee17901c,0x0000001a } },
  126480. /* 167 */
  126481. { { 0x89aa9e14,0xc048336b,0xf676700f,0x66634271,0x906b6980,0x4daa0433,
  126482. 0xebb7ab23,0x30247ee1,0xeb59a053,0x969b4aa7,0x8000f4d5,0xd78ef825,
  126483. 0x46026b5b,0xe5db38eb,0x7d6856c4,0x06a43e5d,0x0000003b },
  126484. { 0xed2a0ee7,0xaa0ae838,0xf16e8813,0x04bbe528,0x4ea64137,0x8ab6df5c,
  126485. 0x06e29867,0x5be80cb6,0xf459ed2b,0xf19b1b72,0x1761521a,0x7a9cce4d,
  126486. 0xaa516f3b,0x39aff994,0xb3416925,0x97d92e86,0x00000007 } },
  126487. /* 168 */
  126488. { { 0x5af3a8ca,0x25aeede1,0xa5c351ec,0x33924782,0xf93ec080,0x41e7a3fb,
  126489. 0xe6f425b4,0xb04f93c4,0x81e76009,0xe4ec12ec,0x5180ffc6,0x797366d4,
  126490. 0x0e0aef3a,0xd293cbb5,0x68d71d91,0xa1496944,0x00000061 },
  126491. { 0x675a67a1,0xf52c541c,0x8f5fe906,0x67d38d30,0xf6be988e,0x2a70bccc,
  126492. 0x18589886,0xae03ecbe,0x7067045b,0xecd02616,0x10ca8d96,0x1facdd99,
  126493. 0x30c0735d,0x7aa10a82,0x3328f21c,0x2a27e554,0x00000015 } },
  126494. /* 169 */
  126495. { { 0xe6057e27,0x3dd609e0,0xc7a454da,0x87e8b6a7,0x1f32dd5b,0xff599145,
  126496. 0xd0ef51e2,0xea397a88,0x25567546,0xc49866a1,0x3228b480,0xea45c8b1,
  126497. 0xdd01997a,0x3dbe0e77,0xc51867d2,0x0e2ea28f,0x000001f8 },
  126498. { 0x69d0820b,0x6295412d,0x1ea65a18,0x03173127,0xeb06380d,0xc27c8221,
  126499. 0x75fe9706,0x7ffd4efc,0x5a71d250,0x7b396a57,0xc7cb7543,0x61c80051,
  126500. 0xad4dbee3,0xe07db4d7,0x9b192d45,0x1c7481f4,0x00000143 } },
  126501. /* 170 */
  126502. { { 0x08e1cc4d,0x5eab2d04,0xad2dc1ee,0xe93758d3,0x5c9c7393,0x0ceb7dfe,
  126503. 0xd3379683,0x530d86a9,0xe24f86d7,0xef5283ca,0xf0b1bb0b,0xab5d1a64,
  126504. 0x54db4e3c,0x96aabc1f,0x3bc00c59,0x3e3d87cc,0x00000144 },
  126505. { 0x1d60e7b0,0xe50a8213,0x5d33d018,0xfc9b629b,0xfd05338d,0xc54aee42,
  126506. 0xe821c6ea,0x0678f2c0,0x06ac09cb,0xe5c9d75f,0x53018df6,0x83357513,
  126507. 0x0bf8c667,0x81ca6fac,0x9d0ae2dd,0x7fc8020e,0x000000e1 } },
  126508. /* 171 */
  126509. { { 0x1baaa5eb,0x8add4741,0x79bd8036,0x02cbb759,0xcdffed22,0xd8680c40,
  126510. 0x4e091141,0x1c23a8f0,0x20748b87,0x65d141ed,0x659e9289,0x586a1575,
  126511. 0x5006dbfe,0x7c68d7cd,0x22569a74,0xda0ad0df,0x00000148 },
  126512. { 0x7f9069d7,0xc8fcc5db,0x5c0531a4,0x2487d245,0xe9a2db3a,0xc5ab4899,
  126513. 0xb4fe9720,0x52bfd538,0xd27f35e4,0x73a04ca4,0xee2dac93,0x7cbbc549,
  126514. 0xff3ee7e2,0x0287229d,0x28da9360,0x3179878d,0x000000d0 } },
  126515. /* 172 */
  126516. { { 0x3b66c047,0x89b7e9bb,0x602a3e1d,0x22e65869,0xc8db9c00,0x44f82297,
  126517. 0xd08a74a3,0x0e76aca3,0xfcd398de,0xfbf1a71d,0x8320e66a,0x2fbb6eaa,
  126518. 0x179c9fc5,0xa82d0ebc,0x4e7ab2b4,0x4e00cf6f,0x0000000f },
  126519. { 0x4890c439,0x424c0e9a,0xbc35a6b2,0x37564a2b,0xd9b7497d,0x95a4479d,
  126520. 0x612de942,0xa1ff3f0d,0xe60d0033,0x358627fc,0x522417da,0x815da8c0,
  126521. 0xef6b8385,0x506104d4,0xf16e96aa,0x800728d2,0x00000120 } },
  126522. /* 173 */
  126523. { { 0xab039042,0x976f2372,0x9fa084ed,0x10e6978c,0x58bec143,0xd03fdd2f,
  126524. 0xfe2045c3,0x3200c101,0xb0a5a928,0xe6868f7a,0xe61faff8,0x26c95d1d,
  126525. 0xb7b12265,0xa1e20127,0xc2a5ed17,0x8e63dd78,0x00000089 },
  126526. { 0x22bba4ee,0xbb6533da,0xf496a574,0x3eff6397,0x14f2a6b9,0x409329f7,
  126527. 0x1dfdd73f,0xa08248bd,0x69bca1b1,0x62f33f2e,0xba2e0327,0x9a177e64,
  126528. 0x75ddf741,0xbc50e993,0x4a56bd1c,0xb87a979f,0x00000095 } },
  126529. /* 174 */
  126530. { { 0x67c1f177,0xe83736a9,0x600133c9,0x1b6d3508,0x6eac9a5b,0x9424bb92,
  126531. 0xc27ef31c,0x7a9c01a6,0x122b4870,0xad93bba5,0x9d1ac985,0x9eb94e2a,
  126532. 0xd53f175b,0x511c0206,0x5102d914,0xd13eb252,0x000000b1 },
  126533. { 0x675a1171,0xcfe7dbeb,0x16c0d2b1,0xb228295c,0x057c88ca,0x8db25b5a,
  126534. 0xd300e9cf,0x73ea9e96,0x269552eb,0xb0e0037f,0x9e0f98df,0xea9d035c,
  126535. 0xd290480f,0x860e49b8,0xc036b319,0xa35e9512,0x00000037 } },
  126536. /* 175 */
  126537. { { 0x8f00df48,0xc56729ee,0x11ac8304,0xb89ca7b6,0x8b3a8123,0x497a57f9,
  126538. 0xc21ca3ea,0xe0431b19,0xe2bb3ce7,0x45a73deb,0xadc77819,0x2f86cc2b,
  126539. 0xe5eb3df1,0x5ff005e4,0xdd27dcf0,0xf955dd7a,0x0000005e },
  126540. { 0x00ee402f,0xe0c22ffa,0x3b30bb4c,0x5b335e2a,0x643cb101,0x542551d0,
  126541. 0x3cd19688,0xc6183f45,0xf0be54b4,0xc6664f22,0x4c20cde4,0xa5f4cfee,
  126542. 0x80a4c475,0xdcaa972f,0x59111ed9,0xde4af200,0x0000019c } },
  126543. /* 176 */
  126544. { { 0xd771f428,0x9e9d0bc8,0xe43ca382,0x3ac1ecd9,0xeb93acf0,0x8d5ee480,
  126545. 0x065a2a3f,0x16232f81,0x2f0b8a73,0x1fc04faa,0x025474a2,0x4a8df7e7,
  126546. 0x3bb15f6f,0x51ac4ff2,0xe0950e52,0x66e21b73,0x0000006b },
  126547. { 0x67a41dee,0x59c98480,0x7b3e2b3f,0x2cfa95ae,0x891454e1,0x54d98386,
  126548. 0xeefca6a4,0xf0dddbdf,0x11e9cb75,0x5f691b24,0xfef208c3,0xa9b9e766,
  126549. 0x18b33cf6,0xe8df1000,0xd1c174a9,0xb8a55ac9,0x000001c4 } },
  126550. /* 177 */
  126551. { { 0x5c4cccb8,0xa99f5862,0x2ef4d3ef,0x70bf5209,0x89efc878,0x28f4e576,
  126552. 0xda14206e,0xa2366f96,0x7c52107d,0x90331a00,0xd4a0f0f0,0x478d4cea,
  126553. 0x472a47b0,0xb2899ee2,0x64207549,0xae96534e,0x00000110 },
  126554. { 0xcced05b0,0x2cc1d655,0x01759543,0xabac3f09,0x8e577cd7,0xbaeb70a4,
  126555. 0x40e98d6d,0x84b00893,0x603d24f1,0x26983653,0x2572173d,0x6e145883,
  126556. 0x611141de,0x1d348b26,0xefa27f34,0xe52257dc,0x0000006b } },
  126557. /* 178 */
  126558. { { 0xc947e655,0x92678f33,0x08923795,0xff0fb76a,0x790239d1,0xb2dfe745,
  126559. 0x3cdbb7ce,0xea087492,0x05f6d41c,0x21326db9,0x79dc5588,0x5b1ae9ae,
  126560. 0xe9c31702,0xe145340c,0xa2c38a9c,0x07502c29,0x000000c3 },
  126561. { 0xc156ace2,0x0c124f11,0x79ff2529,0x2c170fe7,0x6e1171b2,0x60df9a81,
  126562. 0x55de2797,0xa19bca83,0x7c6cc79d,0x1ad927ea,0x1d61f770,0x28590112,
  126563. 0x261c06bb,0xfe80c826,0xaa2642bb,0x4050d338,0x0000015e } },
  126564. /* 179 */
  126565. { { 0xeaad87bc,0xc9397829,0x81e84cbd,0xe0ac9367,0x6ade4fde,0xb579c24d,
  126566. 0x690d7f56,0x50b9aba5,0xd14fb0b9,0xf09b29d3,0x25a0e7b6,0xd0684f23,
  126567. 0x606f4ff3,0x0514e9d3,0xe8ad733b,0xe63bdd26,0x00000077 },
  126568. { 0xe0d25c6d,0x0afd06ec,0x00ba2dcf,0xdd90021a,0x8c5bb398,0x1b025770,
  126569. 0x198ff8fc,0x077f06d8,0xb7e2cd68,0x87d50ff1,0x263a3572,0xef75e057,
  126570. 0xfa925a9a,0xbf257892,0x739d0e95,0x847d3df0,0x00000111 } },
  126571. /* 180 */
  126572. { { 0xfec82924,0x52ab9cc7,0xa7220d69,0x1c76dd69,0xa06ef0e2,0xa63527de,
  126573. 0x27183904,0xab3e51c2,0x716807c8,0xf4db35ea,0x748f1246,0x8f3ede0a,
  126574. 0x41156095,0xf1493644,0x874b38de,0x5f6583d1,0x000000f7 },
  126575. { 0x0b927eb7,0xa39189e1,0xc2e2f127,0xa87c6359,0x7fe966f4,0x0b72c233,
  126576. 0x105e5585,0x102b8382,0xe58c39f9,0x63fee006,0x991b5329,0x3f052ee3,
  126577. 0xcbaff97b,0x7f5b854c,0x5f805060,0x935e5f6c,0x0000016a } },
  126578. /* 181 */
  126579. { { 0xdfd88d38,0xf19a0355,0xc549df40,0x555cd8e3,0x04d006e1,0x322729e3,
  126580. 0xfd0b0ce6,0xf16b706c,0x35f2ad31,0xf156dc09,0xf7a3df9f,0xb30c5213,
  126581. 0xa55e5fb5,0x9f29cc92,0x2b858da2,0xa0ecfdd4,0x00000144 },
  126582. { 0x52658a92,0xb5c115df,0xc4281616,0xbce3ed17,0x7fd92a91,0xa5595f70,
  126583. 0x9cd5d896,0x663c8bfd,0x5a9472b1,0x0776343f,0xb033e1bd,0x14e44ca8,
  126584. 0x1e5c02fb,0x27a1c986,0xcc4ffb32,0xece0f2c4,0x000001b5 } },
  126585. /* 182 */
  126586. { { 0x31211943,0x17127bab,0x5684325c,0x44a8cac6,0xd855fc3e,0xd2fe0b88,
  126587. 0xce91eea5,0x47abab0c,0x78ec7d12,0x5d23ddc4,0x0cd9fefa,0xa3986de7,
  126588. 0x82655766,0x32c7b867,0xeeaec7fa,0x3e54018b,0x00000087 },
  126589. { 0xb38d17c1,0xc96e86f2,0x71fa040d,0x9cbfbd0c,0xf88499cb,0xe111ab79,
  126590. 0xf71ec80b,0x1d47c5ce,0x46c89692,0xacaa3bc1,0x3d316331,0x5f921c0e,
  126591. 0xe768765b,0x31fa081e,0x41eff270,0xd5dafd5f,0x000000fe } },
  126592. /* 183 */
  126593. { { 0x4cda1348,0x8af10b9d,0x25c3013a,0xb0769fd2,0x8957c22b,0x450aa5b1,
  126594. 0xf5acf1c4,0x5cafd6c7,0x9fef8029,0xcf71a140,0xee089f5d,0xe12029f5,
  126595. 0x0fbd2ba8,0x9752a8fb,0x6f70cb58,0x61e2275f,0x00000090 },
  126596. { 0x1fbda16a,0xb70a4ac5,0xf1dfa2a2,0x79910e79,0xd9945f6f,0xba2ce132,
  126597. 0xeb4ba4ef,0x450d59ae,0x4bf2d53d,0x6a8e09b3,0xe620c7a8,0x76010204,
  126598. 0x0a53c6f4,0x63f8943d,0x87eaf56a,0x14c91d19,0x00000132 } },
  126599. /* 184 */
  126600. { { 0x490d66c3,0xe54fb120,0xa0dc8204,0xeaed7328,0x04b4294d,0xba014c38,
  126601. 0x31ddc467,0x3f2fa2ab,0x8342ed11,0x70ff55ea,0x23034e0e,0xb18da72f,
  126602. 0xbd8ae3c1,0xadc30dbe,0x3e945a02,0x179bdf6f,0x0000009c },
  126603. { 0x7484c26f,0x46c928ef,0xef2adbb1,0x206b7db1,0x3f58dda7,0x0887f548,
  126604. 0x4bc7edb6,0xfde4e20c,0x975cafdc,0x484d121d,0x86beec20,0xc5b59670,
  126605. 0xa6d6db67,0xb579aa88,0x41187488,0x22c6d87e,0x00000015 } },
  126606. /* 185 */
  126607. { { 0xc471d4ae,0x0a890757,0x43a1da76,0xfef4b1a5,0x6aa701a1,0xb892b182,
  126608. 0x59c65f93,0xbf4d4e52,0xd789df35,0x923af929,0x0b79c3f2,0x3ccb46c6,
  126609. 0xcf4cf130,0x95582ce7,0x257f0ec4,0x7da081b4,0x0000011c },
  126610. { 0x9aeef274,0xf92c6ae5,0x1437c083,0xe6c5bf4f,0xe13c86af,0xaa74b023,
  126611. 0x2a225360,0xd21dace6,0x22589fa5,0xb3d572b8,0xdfa74b0f,0x3d4a3916,
  126612. 0xb12891a9,0xe76cd8dc,0x59f4cfbd,0xa0391a3f,0x0000019a } },
  126613. /* 186 */
  126614. { { 0x203fc3f1,0x054ba69e,0x62106a29,0x09168ccb,0xaad5fa9f,0xb0818540,
  126615. 0xbff7ed6f,0xecb8f20e,0xbef94afd,0x2c80a618,0xb0abd1db,0xe25d8ca0,
  126616. 0x028e0a7c,0x75e67a41,0xd6e95b9a,0xdd7662dd,0x000001b2 },
  126617. { 0xf289d7ee,0x87dff279,0xeea2205c,0x4d755d59,0xc18adac6,0xaeb0fd54,
  126618. 0x7ec01019,0x3a8c46cf,0xb48d70a4,0x6fc90e7e,0x10b39ef8,0x965c53c1,
  126619. 0x38545a20,0x455777cc,0x57dd023e,0xa33430f7,0x0000016e } },
  126620. /* 187 */
  126621. { { 0x0ff53d2c,0xfa9f3949,0xb00349b9,0x8dc91596,0xd5997967,0xf10a5014,
  126622. 0xa8a6b78a,0x4dd72dab,0x8b517b10,0xef5de540,0xa6d39be0,0x142b90bc,
  126623. 0xeda17f70,0xcaeaa3e9,0x06b31118,0xa01689d6,0x0000016d },
  126624. { 0xf46afff7,0xea6ca563,0x34a5e5f3,0x3945c7ba,0xaa998fd8,0xc1ffe4c8,
  126625. 0xb63f535e,0x42a60146,0xd1f509e5,0x50816888,0x9f8cd0db,0xd1918daa,
  126626. 0x78a36772,0x6505e6bb,0x9cc6dc66,0x4ab03a81,0x000001ef } },
  126627. /* 188 */
  126628. { { 0xd376d986,0x06089d14,0xa2dc35b0,0xd0f4e077,0x53ff2c86,0x1c11709a,
  126629. 0x123c3fc8,0xfef4ba45,0x1b656fc2,0x852cd5a7,0x1fefa8bb,0xb57c7489,
  126630. 0x48110b77,0x8f05383e,0x52c5a129,0x4b55d3ad,0x0000004c },
  126631. { 0xf3827633,0x5110cff3,0xe00afe96,0x086784d5,0x3ead32fa,0xcb387882,
  126632. 0x2b91cd86,0x3dcf4d16,0xe6f3638a,0x078b6a58,0xe8b7fd42,0x33792112,
  126633. 0xee5683e7,0x6964044d,0x28e28433,0x3b84210f,0x00000122 } },
  126634. /* 189 */
  126635. { { 0xc3ebeb27,0x6c28a9a9,0x3ef590f8,0xd7bcdcb5,0x4dae7f37,0xe88a2e11,
  126636. 0x726ea7c9,0x033522e4,0x8c141388,0x99d50386,0x61621575,0x59b1aeca,
  126637. 0xfcc564d8,0x719fcfeb,0x1aeb8e36,0x3a577af1,0x00000043 },
  126638. { 0x6feba922,0xc3f26ce0,0x475a5693,0x5f6c83ee,0x28bf378e,0x7f796740,
  126639. 0xbdc3f6f1,0xd2a5e368,0xa6ed90ae,0x3d034a0a,0x4a47cbd5,0x3b1c3a4c,
  126640. 0x4dce2bc8,0xa4f0aa6e,0x74ca00eb,0x97c7af43,0x000001c0 } },
  126641. /* 190 */
  126642. { { 0x79c28de7,0x00377178,0xab9c330c,0x617aa2aa,0x66bc61eb,0x43081826,
  126643. 0x4d78b504,0xe0b5b5cf,0x9870fc72,0xd76a752d,0xd40b7bc5,0x3b4689f5,
  126644. 0x87f2d03a,0xa97fd867,0xfd6060a9,0x6ab7b5ee,0x000001c0 },
  126645. { 0xffb71704,0xe99eadb1,0x390fe3b1,0x436e58bb,0xab4f19aa,0xeecab82c,
  126646. 0xe0f3d9dc,0xda492dfa,0x6e20ad12,0x2a0f54bd,0x7dbbd262,0xaf89fa0f,
  126647. 0xe8d2eb54,0xdcc50a1a,0xef7d0758,0x9799f816,0x000000b7 } },
  126648. /* 191 */
  126649. { { 0x104f98cc,0x9ec46462,0x72aedeae,0x45115922,0x7e62186f,0x7ae93dd0,
  126650. 0x8d6d69b6,0xd17ce026,0xfd43a8f3,0xb5347608,0x7c0ab797,0xe87f1c13,
  126651. 0x139f991d,0x3bf597a8,0xe547e0d6,0xe293a85b,0x0000008d },
  126652. { 0x8ef668b1,0x0982add3,0x611c9764,0xc54e6b2d,0x1c1d4263,0x3ce76b12,
  126653. 0xeff64e73,0x3134b28e,0x2871612a,0xaf71a9ac,0xba093594,0x31c88af2,
  126654. 0xba9108e8,0x0b649112,0x5cf437da,0x8febc5c5,0x00000113 } },
  126655. /* 192 */
  126656. { { 0xc4a2daa2,0x7e9ca589,0x400f608c,0x18ea703c,0xd5175103,0x6f8cd058,
  126657. 0x4abb6f29,0x26493472,0x94296ab4,0x0be553e1,0xac51657d,0x9af9398f,
  126658. 0x4f880ea8,0xe232deec,0x67b1e1b1,0x2f81761e,0x00000137 },
  126659. { 0x3a20f662,0x51014bc7,0x49ed9502,0x1fb7e77c,0xb62b9652,0x89f5096f,
  126660. 0xa2e8d37e,0x3a659c67,0x5804170e,0x0f2b2a26,0x9ed50a34,0x1674fce6,
  126661. 0xfdc3c00f,0xaaa4537e,0x4ce99d93,0xf3c3bfda,0x00000198 } },
  126662. /* 193 */
  126663. { { 0x81614189,0xbab1f5cd,0x24b259f7,0xc7d56c45,0x45fb415e,0xc7baa4b2,
  126664. 0x7af6bef9,0x302bc8dc,0x74b48e82,0x91b770e0,0x9b6d1b1f,0x4a1336e0,
  126665. 0xe6680c97,0x285c1357,0xc7ccb625,0x59bcb813,0x0000012d },
  126666. { 0x7c019927,0xddad83b4,0x630dfd5b,0xe10f2667,0x31e05d23,0x15dbec5a,
  126667. 0x456ac460,0x2aa6e5fa,0x243cac82,0x46956529,0x4dc8c9e9,0xc69c9c7f,
  126668. 0xe24a4065,0xadb27e09,0xae41301b,0xdfa7a34e,0x000001cc } },
  126669. /* 194 */
  126670. { { 0x59cb1a7d,0x176a864d,0x6aefb8ee,0x4d864ca3,0x1c22b0d8,0x0ee83acb,
  126671. 0xd980df1d,0x7e80a6eb,0x7f94ced9,0xf582acc4,0x3a72c115,0xa29cd123,
  126672. 0xc7107bb7,0xce12a2a8,0x4ed80a30,0x0229ca56,0x00000150 },
  126673. { 0x2f1c180b,0x9774bad5,0xd749aa10,0xd08be998,0x56dbd1ba,0x978c48ab,
  126674. 0x0afbea9a,0x6ed3e3e4,0x153dc5fc,0x8a8be97b,0x9be93ed0,0xadc7f095,
  126675. 0x2cee23bd,0x8d242908,0xdc2729de,0x417523c6,0x00000016 } },
  126676. /* 195 */
  126677. { { 0x6c14a31e,0x74eeccf1,0xb2de3c2d,0x488e2534,0x7cec43c3,0xf9bb3599,
  126678. 0x916ac936,0x4210459d,0x9f7e4400,0x71d15c02,0x44553583,0x8c9c7c12,
  126679. 0xec94a467,0xcc97548d,0x3167bad9,0x4ca67818,0x0000014e },
  126680. { 0x8d0312bf,0x033af055,0x54161e66,0xbd1bf4f5,0xfa41781d,0x259945a7,
  126681. 0x00eef1d5,0x33494da8,0x79c3b8d0,0x6c505ec0,0x1c9f6e69,0x70ae1ade,
  126682. 0x76830aaa,0x0288f0c1,0xa62a060c,0x7f4cfe3b,0x0000000c } },
  126683. /* 196 */
  126684. { { 0x057d6006,0x0d8b447d,0xfd71c8b0,0x38b976e6,0xabcf40f5,0x5e77e029,
  126685. 0xf103a783,0x13bee386,0x5e472c4b,0x20a6ac20,0x31fcb194,0x43b045f6,
  126686. 0xc00abf49,0xe5dc1d9f,0xa5556b79,0x28c0bc70,0x000001b5 },
  126687. { 0x8a8640b8,0xba9d07ee,0xd0e34012,0x25611023,0xbe24ae89,0xc7ce655b,
  126688. 0xfa579dcd,0xe358e524,0x377bbfe5,0x57ce2715,0x3c0947e4,0x64651c6c,
  126689. 0xf4a97826,0x5fbd8d50,0xe2e1c15a,0x6fcdd28f,0x0000008d } },
  126690. /* 197 */
  126691. { { 0x5c7202c8,0xb564a2f6,0x5a54b0d8,0x7d634052,0x1434fbf5,0x8414d672,
  126692. 0x1d9830a3,0x8114215e,0x5ef0fbe1,0xc7a758d5,0xe6f57f9f,0x5705dcf8,
  126693. 0xd92269d3,0x5dd49a56,0xbdb49f97,0x8f015d7a,0x000000f1 },
  126694. { 0xb4799ce6,0x07131110,0x2cbcb7db,0x35bbfb99,0xf7ba21e2,0xc1f00c9f,
  126695. 0xb18f49fe,0x009d6913,0xabcf959b,0x8da61951,0x0d42146e,0x0e687213,
  126696. 0xae5f23f1,0x55832817,0x9ae7386b,0xc9b5bb68,0x00000143 } },
  126697. /* 198 */
  126698. { { 0x48c74424,0x423328db,0xd19cb2eb,0x32616e11,0x40d6e217,0xe534192a,
  126699. 0x0cbdc752,0xdd83a94c,0xd733bb01,0x5c623050,0x5b7a4520,0xcd0d631a,
  126700. 0x9a4011c8,0xccdc0a25,0x646e7cd5,0x22f112cc,0x000001e6 },
  126701. { 0x3e1e4c4b,0x47d6e29a,0x9fb1548a,0xd5f82538,0x4fd3e319,0x7e3705b5,
  126702. 0x0a08b966,0x8c4ce59a,0xd8cbe8db,0xbca749e7,0xaeec3d75,0xcc4496ea,
  126703. 0x8a1a313d,0x17dc723a,0x8ceb9360,0x250ff77a,0x000001a5 } },
  126704. /* 199 */
  126705. { { 0xfe29bd79,0xa55a0726,0x4f990b34,0x6574a810,0xaad56983,0x6906946d,
  126706. 0x50d41fef,0x0e580ab9,0x6e6f7f45,0xbc75b514,0xf0f3718a,0x508cc97b,
  126707. 0xa5634087,0x51ba2ca4,0xe64d8910,0x75c39077,0x00000172 },
  126708. { 0xf77ca6bd,0xf37cccaf,0xbdb18df5,0xe0a0df41,0x019e01f7,0x9f46cff8,
  126709. 0xaa65d72b,0xbe4f3d44,0x6e3663e9,0x7822d8ac,0x3ef9db6d,0x5f37f922,
  126710. 0xabe4a9aa,0x7f0ad39d,0xf69cc8ba,0xa0a57c70,0x00000098 } },
  126711. /* 200 */
  126712. { { 0x00fd5286,0xd9c50cf4,0x72a4b03c,0x1ea5b9d5,0x051ae73e,0xf5e60f9e,
  126713. 0x951b3824,0xfe9b5142,0x9fb4d667,0xb034b2d0,0xedc50856,0x4b537a80,
  126714. 0x8cb0022e,0x69ee1012,0x6a548aee,0x7c8b9e5c,0x000000ed },
  126715. { 0xd933619b,0x746007bc,0x2b9dfe19,0x0ce7668e,0xcc6e2a2e,0xa9eed5d3,
  126716. 0x7eebf32f,0x35a14f5f,0x67cc4f64,0x75cb898d,0x7850c16c,0xcb2185fc,
  126717. 0x45f79c96,0x09874a76,0x27db4744,0x7468f8ae,0x00000139 } },
  126718. /* 201 */
  126719. { { 0xc88684f6,0xc5de68ad,0x619a7dbf,0x7c1edaab,0xb27a18f5,0x258d1735,
  126720. 0x8ecd89eb,0xb27e7b65,0xd879f7ea,0x3d8889c6,0x67d5befb,0xa8fdc96d,
  126721. 0x37bad73c,0xc84d86ae,0xce8e56d7,0xc7e91976,0x000001a4 },
  126722. { 0x6319ffa6,0x5001a540,0x134ec04c,0x0cae64ec,0xd541242c,0x1f69a96c,
  126723. 0xbf2caeee,0x9da259ee,0x28bee805,0x88e7978c,0xb8e890e4,0xe9484beb,
  126724. 0xfb227fd9,0x0e5246d0,0x625d6318,0x8be2a54a,0x000001b7 } },
  126725. /* 202 */
  126726. { { 0xf472f13a,0xa223554a,0x5733e91c,0xfac993b7,0x96c168a2,0x26afe9f0,
  126727. 0x4b127535,0x7cfe761d,0xe77070ca,0x84301873,0xc7e7cdf6,0x66b6aaad,
  126728. 0xa1562ed4,0xda2dd5ea,0x39faf8d8,0xa81a2e00,0x00000016 },
  126729. { 0x4e3de3bf,0xa880759c,0x52f3088a,0x0c1e2e11,0xaa7eba5b,0xcb2ded9a,
  126730. 0x9f9c11ca,0x4c65d553,0xb0dc5c19,0x0ab9bd87,0xca3f4b61,0xd32f8c96,
  126731. 0x28cb5f9f,0x49842fcc,0xb90e21df,0x31ae27cc,0x000000f4 } },
  126732. /* 203 */
  126733. { { 0x6a0ccd0a,0x3b2a0a0d,0x5993b555,0xa3eeec82,0x9de672a6,0xb13486fd,
  126734. 0x0da05dcf,0x8d9c5148,0x6739874d,0xc4aa444d,0xe29a35c9,0xd9cf35b2,
  126735. 0x89177ead,0xd6bd9b5f,0x2a0470a1,0x9af0f59d,0x000001d6 },
  126736. { 0xba7535fd,0xb2f844c7,0xa842ff39,0x45bd4c3d,0xe951974b,0x5fe149ed,
  126737. 0xfd4453ec,0x6982e997,0xe6c37c0e,0xa63f705d,0xd2c3ef6a,0x09b0f6a9,
  126738. 0x1776a8d6,0xbedd3586,0xede11b78,0x4048a46a,0x00000176 } },
  126739. /* 204 */
  126740. { { 0x51a251d1,0xa47c6ee5,0x0d279dfd,0xbef4bf12,0xec518a28,0x4c2d538c,
  126741. 0x3880be6e,0x1b2b7887,0x1be9b20b,0xc69ccf8e,0x3796a19e,0xe41dfeae,
  126742. 0xfb50bdea,0x25676fc9,0x03e180c0,0x8b815a05,0x0000016a },
  126743. { 0x53f5ef65,0x2ca085f6,0x77b25105,0x61dfbbf9,0xa3346fe6,0x88ea87e3,
  126744. 0x1b95f7ef,0x25ddfdee,0x5b65eaec,0x22074e69,0x4c2e023b,0x11869a15,
  126745. 0x42e83bb5,0x8601b577,0xfa877e7d,0x1464652c,0x00000015 } },
  126746. /* 205 */
  126747. { { 0x57fa58f1,0x250853c8,0x4ca4c670,0xb58a4e68,0x1b81f40d,0x07b96d0a,
  126748. 0x558e8cbd,0xa4651e10,0x42e388cf,0x1a64046e,0x44436088,0x51b0d539,
  126749. 0xe26b8fd0,0xc2bf35b3,0x5702cfce,0x4ae78709,0x000000fd },
  126750. { 0xdf53d498,0x3c79bc29,0x1137f624,0x4cf31c4e,0x17a3cedf,0x93b6856c,
  126751. 0x6cd9115d,0x2461131c,0x9228cddb,0xab30a453,0x8d202bf1,0xe97757b6,
  126752. 0xe6108612,0xa666de7c,0x4f6026b4,0xc200fe65,0x00000051 } },
  126753. /* 206 */
  126754. { { 0xb1a2b4b5,0xea96103c,0x843c0968,0x98dccbfe,0x986ffb5b,0x6a37072d,
  126755. 0x169d3ac2,0x2fa07af2,0x771371f1,0x8bb85b9a,0xe7c299ef,0xeae10d34,
  126756. 0xe2372efc,0x3d4bdc69,0x8dd856f1,0x378df75d,0x00000039 },
  126757. { 0xde7ff5d9,0x31e902ff,0x325a09ca,0x0e9a85d2,0xf4192fcd,0xd71b93a6,
  126758. 0x15b076b3,0xf52a5737,0x6e711d1c,0xd726aa86,0x2c292819,0x0b61b1df,
  126759. 0xc8015de6,0x224e575c,0x18b79e47,0x68e893e1,0x000001dc } },
  126760. /* 207 */
  126761. { { 0x6ffeda73,0xb7924ff9,0xa0da2018,0xe709f406,0xf89584df,0x368e20ea,
  126762. 0x8355a040,0x0095112e,0xfd777d7c,0x259d4528,0x2bf8f2c8,0xb0c49565,
  126763. 0x44c5311b,0x7f631928,0x8466d9d5,0x698d0e4f,0x000000d5 },
  126764. { 0x015d204d,0xe10d64fa,0x6dd10c53,0x7b626bfa,0xa7698c94,0x087f8e63,
  126765. 0x05337a56,0x525a6547,0xdf5c782f,0x558e2244,0x855fbaff,0x48aa1e41,
  126766. 0x47ee3830,0x48f2218e,0x138463d3,0xf2523959,0x0000004d } },
  126767. /* 208 */
  126768. { { 0xd8695310,0x76f4fd69,0x7e8768ea,0xe28eb09f,0xe0d532a8,0x039c1812,
  126769. 0xc572ac79,0xdda67744,0x785d6293,0x1f9800e0,0x3da76bb2,0x2bfe2a5a,
  126770. 0xa2bc7217,0x6ed15b90,0xd1788a8e,0xd80e61bf,0x0000004c },
  126771. { 0x16730056,0xb9f40370,0xdced3d43,0x46f45fef,0x1aa50742,0x0afd763c,
  126772. 0xff92ae73,0x21e5c652,0x1bb2063f,0x6ef0830d,0x12d22540,0x18306ecc,
  126773. 0x1f15001c,0x4edd9b3a,0xc0cc5424,0xe4eb25b8,0x000001f4 } },
  126774. /* 209 */
  126775. { { 0xa1db5c18,0xed61a714,0x7677074c,0x9454e61e,0x7bf685de,0xe970fbe5,
  126776. 0xd2145be5,0x221b0c53,0xee49a5f2,0xb931881b,0x14b11d03,0x00b91afa,
  126777. 0x3ec22137,0xc6aefe49,0x526200af,0x50554e94,0x0000013c },
  126778. { 0x7364c92e,0xd42c45e7,0x735218e8,0xe0500265,0x84d3f3c5,0xd281da02,
  126779. 0xdbf7646b,0x312f8424,0x485f304f,0xe1a88f2a,0x1127a513,0x583f5631,
  126780. 0x1a60e0bc,0xed7950c7,0x4b7b70a4,0x92855e10,0x000000c6 } },
  126781. /* 210 */
  126782. { { 0x644614e7,0x8d06185c,0x4749a424,0x2e906cae,0x2587e528,0x585412ea,
  126783. 0xd12857cd,0x3763990a,0xba5593b5,0x770c7f70,0xdd5d2a46,0xc2cf6dc4,
  126784. 0x3b69a1ba,0x564da456,0x187895da,0x639f7e14,0x000001c8 },
  126785. { 0xf8589620,0x05c96b02,0x41e44054,0x2fe468a3,0x096ad09c,0xbf22da11,
  126786. 0x9c652aee,0xbc73c298,0x547e1b8f,0xcdef9f8b,0x977dbf73,0x7073785a,
  126787. 0x7e13552d,0x0a92a1aa,0x3a393d3f,0x22761140,0x0000015b } },
  126788. /* 211 */
  126789. { { 0x1fbfaf32,0x89a5a7b0,0xbe661d21,0x5c5a62d0,0xf5e3b44d,0x47970f5e,
  126790. 0xf43bbf62,0x3ea001ed,0x260ae5a0,0xa8e74285,0x2697c62c,0xeb899ebd,
  126791. 0x751a7643,0x36a003e6,0xba0725a6,0xef178c51,0x000000ea },
  126792. { 0x9bd51f28,0xaacf8e9f,0xa8712044,0x39febbdb,0x5bfc8365,0x8780ad3a,
  126793. 0x10e6f08f,0x408a34cd,0x8241ab0e,0x8104ca10,0x98a662a1,0x843e71ce,
  126794. 0x232048d6,0x9dce8514,0x1cf3d187,0x5cba23be,0x000001fa } },
  126795. /* 212 */
  126796. { { 0x2973a15c,0x2fe8c9d2,0xd42979f3,0x66fec8dd,0x0b6afb3e,0x39af4a39,
  126797. 0xab65ef22,0x0bb1e436,0x66c5fcdb,0x8f26201e,0x5af4870b,0x3cffe8a3,
  126798. 0x2bb44e24,0x65ae286f,0x51dd1722,0xda2e283a,0x00000114 },
  126799. { 0xc1e3d708,0x4a9c9a56,0x1cb0efa6,0x4fe62d3f,0x97e87540,0xf0702984,
  126800. 0x3cea46fa,0x138b7d6b,0x83886263,0x0780634e,0x71c30909,0x27e84280,
  126801. 0xe5838647,0xf0af79d7,0xb236a267,0xc1b86582,0x00000104 } },
  126802. /* 213 */
  126803. { { 0xa526c894,0x32ff09ed,0x14ac7d23,0x95abf120,0x3cd92934,0xb6f94dcd,
  126804. 0x92e6b556,0xffaaeb12,0x1036c31b,0x193796ea,0x707ff32e,0xa9d237e7,
  126805. 0x829d67b8,0xd65a5b0d,0xdb29248b,0x48edb556,0x000001b3 },
  126806. { 0xded46575,0x6ee9f9b2,0xffa69acf,0x496ca08a,0xf16d37d1,0xd5aeb3a1,
  126807. 0x789e5d01,0x4a507db1,0xc827cc45,0x05e2ce29,0x2964e677,0x29b6e4a5,
  126808. 0x4c0e46f2,0x0563b0ba,0x4bc46485,0xe75c2448,0x000000a3 } },
  126809. /* 214 */
  126810. { { 0xd2f6615d,0x0fcb476f,0xd98da9a9,0x4b7f9b78,0xd2bdf107,0xe2fddf1c,
  126811. 0x9b956f31,0x2bda3086,0xb596eadf,0xf3cca2f7,0x355b2538,0x91c09f8b,
  126812. 0xc6c846db,0x46f3f6f3,0x2a14642e,0x9bb9398e,0x000001ff },
  126813. { 0xa17bd645,0x5118d4f5,0xdbd6d552,0x57033eab,0x734d0957,0x007e86fc,
  126814. 0x5f53c435,0x98ca065f,0xfd27dd19,0x9949d9bf,0x6952d1ca,0xddc4e304,
  126815. 0x81ac101c,0x84cab4fb,0x4a56b007,0x46d079f9,0x00000003 } },
  126816. /* 215 */
  126817. { { 0xa6bfdedd,0x95eb8e4f,0x7a74c6f9,0x993a285e,0x3d09a252,0x8bd5d4d1,
  126818. 0x19a5f767,0xeaa10be6,0x0cebb340,0xd3db083e,0x1dbf7a83,0xc633a78b,
  126819. 0xc30f23e1,0x2664bc3e,0x07a08379,0x6630f8f1,0x000001c9 },
  126820. { 0xdef86a80,0xbbf4cb4b,0x3f8259ab,0x1fa4ec78,0x609532c8,0xa4bf7604,
  126821. 0x8b909e92,0x71bb7acc,0x17884160,0xca1d7317,0xca1ab928,0x7f7f14be,
  126822. 0x5f8455a5,0xbfea016e,0xbf21e899,0x7b8c76b9,0x0000002d } },
  126823. /* 216 */
  126824. { { 0x4b9f8e7d,0x46860563,0x63fc58a8,0x201176b7,0x2feed68a,0xe7a5da7e,
  126825. 0x65183190,0xcc67763e,0xe9377ad6,0x7d7d0102,0x77032321,0xccfc4720,
  126826. 0x534bb505,0x573ee031,0x0f1a2769,0x1bf1ef8c,0x000000f3 },
  126827. { 0x0c935667,0x635f5c4b,0x060d2b8b,0x74152c39,0x37c3a574,0xeffaac2e,
  126828. 0x0b72e0cd,0xfd5fcc4c,0xf4f60247,0xb743f9b9,0x79e16f33,0x05c2e354,
  126829. 0x3074ef9c,0xa2234c47,0x495aace3,0x4092f279,0x00000124 } },
  126830. /* 217 */
  126831. { { 0xb30f9170,0x5bfd7851,0x37fce5b1,0x715aa1e9,0x928437b9,0xcffd55e0,
  126832. 0xc32f1273,0x88acd259,0x48be1e34,0x5a145cf2,0x7a5bc62b,0x3a340860,
  126833. 0x18156f46,0x6296eb15,0x2774e1c3,0x397fad19,0x000001e7 },
  126834. { 0x9c8225b5,0x362f99f4,0x46b77c4d,0x33efce49,0x8541e91b,0x451df530,
  126835. 0x38f3d693,0x0bd2d934,0xe727b54e,0x0b5de2d6,0x7622d940,0x42d929c2,
  126836. 0x56f6a94b,0x36ace723,0xfccaf205,0x64a18cd5,0x00000044 } },
  126837. /* 218 */
  126838. { { 0xaba95d63,0x8dbe0aab,0x7b4b346d,0x92780c61,0x0e0d8142,0x6430f863,
  126839. 0xb56ef04c,0x875be02a,0x785e3633,0xc28feb95,0xc12c93e4,0xd5401795,
  126840. 0xe36f82a3,0x89ff51c1,0x10eeafd6,0x3c48c895,0x0000016b },
  126841. { 0xd4f064be,0x79287eba,0x54ebda99,0x1a77d555,0x623727ea,0x46745ef2,
  126842. 0x89f366c6,0xa911f591,0xc59d6ebd,0x7e5435cd,0x7524d213,0x3a84daea,
  126843. 0x4395b38d,0xc7b1dd1c,0x1a823c49,0xca13e704,0x0000001c } },
  126844. /* 219 */
  126845. { { 0x874d64b0,0x6399860c,0x1653ce0c,0x3375b092,0xeaa11986,0x16700000,
  126846. 0x621cd15d,0x62c67909,0x77d70dcd,0xbe1d7dd6,0x305bd4cd,0xeff0f270,
  126847. 0x362f8f30,0x076ec621,0x7e445b78,0x81204816,0x000001d8 },
  126848. { 0x161f9758,0x81749a0e,0xa3c4fce2,0xe60915fe,0x911dd8af,0xf537ce41,
  126849. 0x79a51a09,0xfe36a8ac,0x2ca5cf8e,0x67fb54b4,0xe49057f5,0x1bdcae07,
  126850. 0xa4244b64,0xb71ff0c5,0x4b606583,0x4815a536,0x00000106 } },
  126851. /* 220 */
  126852. { { 0xef39cc39,0x78c69c3e,0xfa6356d1,0x98304564,0x412fb990,0xbd3c3542,
  126853. 0x79dbb2a5,0xa1d531d3,0xe7e75e3d,0x4865f188,0x0b0147b1,0x2dac4e22,
  126854. 0x33d29ab0,0xf59e51ca,0x37b074ef,0xc964f7fe,0x000000f1 },
  126855. { 0x0e301262,0x7080c0a6,0x5390a22d,0x9a458060,0xcc8a9029,0xda677f9a,
  126856. 0x14c0f1c2,0xdfae9057,0x6e66d9f7,0x3665ff16,0x47846924,0xc866dd8c,
  126857. 0xc4cc307c,0xc5afe98f,0xe0bf50e4,0x60e3ba63,0x00000039 } },
  126858. /* 221 */
  126859. { { 0x959ecdb3,0x1a785136,0xf9e959be,0x289af617,0xcde0dc88,0x5145b2b8,
  126860. 0x7c079e15,0xfe9070b0,0x50e22415,0xf77f04d3,0x358d6d42,0xb3ab7372,
  126861. 0xba7b629a,0x14fd41b9,0x7400fd25,0x7b32d80e,0x00000193 },
  126862. { 0x7147886f,0xe5d80d4d,0x576c81ca,0xe08ced61,0x642717bb,0xe14e8692,
  126863. 0xabb4bd21,0x9dcdf198,0x6530308b,0x658be646,0xd99d19c7,0xfbf192da,
  126864. 0x304ab126,0x55a3d1b3,0xfa24de31,0x943f4be5,0x0000000e } },
  126865. /* 222 */
  126866. { { 0x7fe9ea48,0xc5424058,0x61b57486,0xaf24f825,0x78719740,0x9d2c413c,
  126867. 0x70eb874d,0x27a9be79,0xb62ba3aa,0x43fef8e0,0x2c1bf0ac,0x0a23f286,
  126868. 0x4af130e1,0x51c276f3,0xae55cebf,0xf6cd1e9a,0x00000185 },
  126869. { 0x40369093,0x24defa7f,0x58581e0a,0x11f1d9d6,0xe512ed9e,0x9900bf33,
  126870. 0xed120896,0xbf8a8459,0x8b73c399,0x8324555e,0x8f6f54fe,0x54a30569,
  126871. 0x3c252355,0x2a9d6da5,0x2a093b31,0xe6a6f904,0x0000016a } },
  126872. /* 223 */
  126873. { { 0x152cdd35,0xb2e123c9,0x86402ef1,0xae6e43a8,0xb9ce5bd5,0x892bf0df,
  126874. 0x75804914,0xb4acb84a,0xf502eec2,0x8c7f55ff,0xaa33ef4e,0x9c8a7b93,
  126875. 0xfd9d2001,0x06b10357,0x0ba3bceb,0x3e319ff0,0x00000027 },
  126876. { 0xabe360a3,0x182c2f77,0xadfefca6,0x57ef5c84,0x650b6fcc,0x9a4f0ca6,
  126877. 0xaaf0b202,0x3f4f8e56,0xa24ef156,0x5c8508a0,0x1ea45f13,0xd8f62fd9,
  126878. 0x28036dbe,0xf2c923a0,0x1a4d103b,0x4a9ca4c0,0x0000018a } },
  126879. /* 224 */
  126880. { { 0x5448e339,0x2a3fb798,0x18a39976,0xde8770cf,0x7a69170c,0x1160574d,
  126881. 0x2b6067ac,0x4bb05c59,0x848138ab,0xde0d2db0,0x4909e794,0x149dab92,
  126882. 0x790315f7,0x83a336b6,0xa335a258,0xcd9074d9,0x0000013c },
  126883. { 0xac1b784d,0xe839c5e0,0xee527ae1,0xab65c8c6,0xa1c88ec0,0xd3c86146,
  126884. 0x46c1bf58,0x2201f790,0x3fda502a,0x71cec627,0x225b9065,0xff3f88eb,
  126885. 0xc556dfcd,0x6c1f0c98,0x484fa5cc,0xaa3222aa,0x000000ac } },
  126886. /* 225 */
  126887. { { 0xc9b4dfd6,0x17e74bc3,0xf8e76293,0x25ba8053,0x9d8c3520,0x0307dc05,
  126888. 0xb85a20b4,0x1c9036cc,0x23871359,0xf2c63f0a,0xca95fb4e,0x1a99d9d8,
  126889. 0x9850c6c6,0x3d7c4f39,0x68299668,0x162969c9,0x00000169 },
  126890. { 0xcb63ee53,0x7d13c267,0x75eac353,0x67b12e61,0x191abfca,0xb3369a11,
  126891. 0xee1af69f,0x5ad0649d,0x11dc11e7,0x4d7a6f00,0xdb9f9765,0x80f030b8,
  126892. 0xf0ab1332,0xa20001a3,0x39d8cc62,0xe17c98d2,0x00000194 } },
  126893. /* 226 */
  126894. { { 0x1d8fe898,0x720d80b4,0x32184534,0x8d7a28b7,0x04f21740,0xf1f3c385,
  126895. 0x166aa6af,0x5d381cd5,0xcc560e35,0x9cde6084,0x5e61e2cd,0xcb041f0a,
  126896. 0xd9b4951a,0x621116f5,0x7ee2ac2c,0x509e16d3,0x000000c4 },
  126897. { 0x2c6fd79e,0xb82a20c4,0x3af78b0e,0x95b7ee4e,0xbad819ca,0x3d9b63c1,
  126898. 0x98552569,0x10d674de,0xf9c19d0f,0x17de64b2,0x47c5e6a9,0xa03fabaf,
  126899. 0x2ce2db6f,0x858bc4ad,0x1fc9d18e,0x76c2380a,0x000000c9 } },
  126900. /* 227 */
  126901. { { 0xb064f114,0x91171ef8,0x4f2f0f4c,0x83cb1565,0x57b262b7,0x30525854,
  126902. 0x0f34936c,0x468c6701,0x99a41fed,0xef26d2fe,0xa7f7f6a9,0xf6da2267,
  126903. 0xa01bfc1b,0x2563b8db,0xc340ed40,0x14b36c85,0x0000000e },
  126904. { 0x25db67e6,0x5e57e264,0x7f2e905f,0x85df4e89,0x026c4268,0x7832e514,
  126905. 0x3e875093,0x312be262,0x3c538691,0x856b5bd8,0x95734f9d,0x5b1cae55,
  126906. 0xd5aa4861,0x5a07bfe2,0xce8abb58,0x7a4c96f0,0x000001d0 } },
  126907. /* 228 */
  126908. { { 0x523aa2e9,0x7bf54d05,0xed3d0860,0xc8841e0c,0x7f9bfb69,0x5683f6e2,
  126909. 0x162bdf85,0xdcb07f44,0x07b0dcc9,0x62d17839,0x657a536e,0xa2cbb8ab,
  126910. 0x7cf47d3c,0x98b9a0d2,0x5eea6370,0xff154d68,0x000001f2 },
  126911. { 0x56b232ac,0x568b768a,0x3f2a52ab,0x4e8d6e36,0x8837fc60,0xbae87a16,
  126912. 0xd10a7691,0xebc58a83,0xf9455fbe,0xad5e4af0,0x7d654e2e,0x1a20d6c3,
  126913. 0xda7c8255,0x8c40fcb9,0x60d9b931,0x6d7b3cd7,0x000000b2 } },
  126914. /* 229 */
  126915. { { 0xbb2eaf45,0x7b090c3e,0x62ffb92f,0xed24d91c,0xa736f23d,0xbf2a3ea4,
  126916. 0x6ff0fde3,0xb5b99ebd,0xca1102f5,0xbca2b55d,0x07e032a8,0xf6203cd8,
  126917. 0xa8bf17a8,0x5410b448,0xe1dc55b1,0xb86660a7,0x00000109 },
  126918. { 0x02a2fbd8,0xb148b1da,0x3b22e8a5,0xfed85e8b,0x8712b509,0x1378a0e4,
  126919. 0xc6a3e516,0x68560148,0x1633b503,0x7100921c,0x25512711,0x93925143,
  126920. 0x07d31047,0x7b4931d2,0x8542e0bb,0x623e722b,0x000000ea } },
  126921. /* 230 */
  126922. { { 0x24972688,0x084823d3,0x003f5762,0x58b83c12,0x6d0d4528,0x194d6690,
  126923. 0x2c6f747e,0x84219584,0x0146d89a,0xc8f8a2e9,0x7451bbc2,0x29ec1de7,
  126924. 0xf7f284fa,0xf622b6b8,0x7b71e44f,0x83f1dbe9,0x00000060 },
  126925. { 0x999dd56b,0x99649333,0x97a47de9,0x2cfac0ba,0xbbe8fb20,0x6660d8ae,
  126926. 0xf61d7bca,0x47c29dd8,0x85adc14d,0x6f5fb51d,0x4f9fd41c,0xe65ac788,
  126927. 0xff513e6c,0x1ce69dd4,0xffe59d3e,0x1ace591e,0x00000023 } },
  126928. /* 231 */
  126929. { { 0xa9fda771,0x2e67a438,0x8663100e,0x626f652c,0xe133f23b,0xdfb19e48,
  126930. 0x035d2d1f,0x599f88f2,0x8d13e878,0x1723a112,0xfb51ce07,0x890aa292,
  126931. 0xbbd9ba82,0xe5f3a70e,0x374514b4,0xdde82673,0x00000155 },
  126932. { 0xd6f59a95,0x08b2b77e,0x02020420,0x93f853e3,0xebac7797,0x52252ac1,
  126933. 0xb56b6676,0x6ecdcb99,0x9722a500,0x4abdb9f9,0x04e2bad0,0x26210f3f,
  126934. 0x3034dd4d,0x0ca5a0ff,0xdac0b80d,0x333d8080,0x00000041 } },
  126935. /* 232 */
  126936. { { 0x35a85a06,0xe8510709,0x42ef1b44,0x4e166e76,0xa07b3a6d,0x84a90b71,
  126937. 0x30329e6a,0xd6dd6c00,0x3d555259,0x20c4ba65,0x6f8ad05e,0xee3b26af,
  126938. 0x2ab4cccd,0x20e3d541,0xa9406424,0x79798934,0x000001bd },
  126939. { 0x8e0c7ff0,0xf2a1d184,0x9543b340,0xbae85efc,0xf51d318b,0xe96431ae,
  126940. 0x75878fa6,0xe5d3ed4e,0xc2895f52,0x4d2a29db,0x1f11067c,0x3af27877,
  126941. 0x9e7f4ee5,0x6ccde964,0xa56d74da,0x35188da1,0x00000192 } },
  126942. /* 233 */
  126943. { { 0x03d310ed,0xb0832120,0x987b0311,0xd20ee8cc,0x84c558a8,0x9e549d26,
  126944. 0xb7167ec8,0x5e25f3ce,0x4bf55bb5,0xacf114f4,0x061c9017,0x819edc77,
  126945. 0xdeb343c0,0x759a44e6,0x04c9b5ed,0x58df9f7e,0x00000078 },
  126946. { 0x3bf13222,0x4fa47ebb,0xea07da11,0x1e451dcd,0xc0d8242f,0x1be9fac3,
  126947. 0x36eb871e,0x93257d4d,0xbea3190d,0xf49e775a,0x4ebe2b33,0x406d191f,
  126948. 0x0c110096,0x67aac53c,0xd381ac78,0x5215cf8b,0x000001f4 } },
  126949. /* 234 */
  126950. { { 0xfa493b79,0x387e8a8e,0x4eb1c2ac,0xb20e270b,0x9ff22320,0x9f393fa0,
  126951. 0xa91c393d,0x5ee1baae,0x138a8d96,0xdeda961a,0x97bd50e4,0x69ab238c,
  126952. 0x2363c8e0,0xff68d48a,0xce4c4c16,0xaf8e00e5,0x00000158 },
  126953. { 0xcfc509a1,0x6ccdcf06,0xc26cc075,0x60f411ef,0x4d9c57f0,0x6d0cdfd6,
  126954. 0x32e99cac,0xa9514853,0x8b8e9510,0x58f9ab3d,0xb10dc3fd,0xa7e98709,
  126955. 0x75ef3509,0x8390843d,0x5a9312c7,0x28ccc9d0,0x000001b6 } },
  126956. /* 235 */
  126957. { { 0xe341463f,0x1d934f00,0x150da7a0,0x14c8a6ce,0x4109553f,0xdb4860fc,
  126958. 0xa93f4a91,0xc23bde5a,0x2cd58067,0x9f47c787,0x8433dc80,0x1d330054,
  126959. 0x75a32a7d,0x0c0be7f9,0x88c75da9,0x08b777d5,0x0000012e },
  126960. { 0x61a10d37,0xdfc12817,0x5c50f5a5,0xed7b6181,0x79477c60,0x28af95db,
  126961. 0x33c5310b,0xa0aa2b77,0x53118267,0x905faab8,0x6b41959f,0xf40e9816,
  126962. 0x16b37784,0x9ccb4252,0x69866acc,0x6835d77c,0x000000c5 } },
  126963. /* 236 */
  126964. { { 0x2b450a66,0xe9d714cb,0x7dbfdc14,0x1318885c,0xb466a0c0,0x655a8d85,
  126965. 0x5bdfc1a6,0x02a21e99,0xe67792d1,0x7a0d7c98,0xb550a797,0x2a01bb57,
  126966. 0x5d74d337,0x42c46233,0x88dad495,0x7be4e1c0,0x0000008b },
  126967. { 0x95812273,0x1873b03f,0xee3f757f,0x2e26ed32,0x6da6217a,0x2c710eae,
  126968. 0x261d9f4f,0x9b50b574,0xb7c1da2d,0x43971fa9,0xc4a85de7,0x22c4fb87,
  126969. 0xec22137b,0xf72c3451,0x77ba1926,0x1345668c,0x00000173 } },
  126970. /* 237 */
  126971. { { 0x8a3ba183,0x3e3e8c7a,0xfe389fa7,0x4e8cebbb,0x0f9ba60f,0x8ea44687,
  126972. 0xcb601a83,0x55176e35,0x12e52db4,0xf90bdc26,0x8f712bf1,0x95f9e459,
  126973. 0xbea054cd,0x9bd3200f,0xdd5fd40b,0x2cf19bf6,0x0000017a },
  126974. { 0x66736feb,0x71cf6ca2,0xde7cfe2f,0xbde86f49,0xfc290563,0xc60abce8,
  126975. 0x726b6e4f,0xaae8a3ce,0x3f29235b,0xd2382445,0x650ffa5e,0xa4b557f5,
  126976. 0x113ef744,0xa1453e54,0x3e426dd2,0x7c676a53,0x000001b0 } },
  126977. /* 238 */
  126978. { { 0x35d96872,0xf5e603f2,0x3fa5b8ca,0xab1a23cc,0xe988dc5f,0x5459871b,
  126979. 0xd430c0bd,0xe32e8489,0x764d9cc3,0x7ec269e0,0xf2c0c40d,0xf7238212,
  126980. 0x887b83b4,0x2d946183,0x2f18a411,0x281fa671,0x00000010 },
  126981. { 0x64858b37,0x8028048f,0x357de5d9,0xe0e149af,0x619ebb18,0xb2218791,
  126982. 0x9f2b0ba0,0x210200b3,0x1039cbae,0x5a87eae6,0x39579d1d,0x4efdcddb,
  126983. 0x2788515e,0x1b388eaa,0xc81878aa,0x1a552c3c,0x0000002c } },
  126984. /* 239 */
  126985. { { 0x0ea723dc,0x7ac7f500,0x42b15231,0x0a5f04f4,0xbe885c86,0x63d49445,
  126986. 0xff119702,0x61f9993f,0xc4c58cea,0xc3fba45c,0xb9cd6036,0xe6d151e6,
  126987. 0x57b923bb,0x75a3ab15,0xceb2fd46,0x4ec07c52,0x00000147 },
  126988. { 0xed88239d,0xc46a3d32,0x835ae694,0x0d1b8ae6,0x9feeb2e7,0xf4fde325,
  126989. 0x43bc0bb5,0x223bf71c,0x8f62a705,0x3cd220b7,0x9fe799a5,0x2224860e,
  126990. 0x24ab7f93,0xd8558703,0xb594958b,0x8e0f7330,0x0000010f } },
  126991. /* 240 */
  126992. { { 0x3c67d520,0xaf35c7bb,0x23fca9ec,0xd8f4958b,0x8bbaa808,0x0778f194,
  126993. 0x2135e8ae,0x418c30ce,0xc888eff7,0xcdd8d9a9,0xf73144ab,0x72075df0,
  126994. 0x4506a534,0xb549c895,0x5fbb7fc5,0x4ef38979,0x0000011c },
  126995. { 0x43f5e698,0x3fe2c9ac,0xe38a5e3a,0xce77fcbc,0x3089c2e1,0x6d05c90e,
  126996. 0xac1d5801,0x5a74f3ff,0x381b9d2a,0xaeeda220,0xf5f3960b,0xd958b143,
  126997. 0x0db7abbe,0x65ffd051,0x7a05b718,0x8e97e680,0x000000ce } },
  126998. /* 241 */
  126999. { { 0x8ce86a83,0x2251e61b,0xbf7e7160,0x8604159f,0x48f03377,0xfc127dd7,
  127000. 0x45052242,0x87cb2c37,0x934ea09b,0xbd4950f4,0xc4679441,0x5146c403,
  127001. 0x23ba416a,0xe8ad4710,0xaf638eb1,0x89b81a60,0x000001b3 },
  127002. { 0xe8150c69,0xe699934e,0xe27c14bc,0x74f75908,0x6a0194ff,0x5dc0a891,
  127003. 0x1bd51b76,0x38f49d32,0x18779630,0x6bc3305e,0xfd3b4a68,0xfe2f3fbf,
  127004. 0xd7caf189,0x1409b377,0x9b8f109b,0x029ea13b,0x000001b3 } },
  127005. /* 242 */
  127006. { { 0x25a2fd88,0xef7938d2,0xceba0603,0x890f2f7c,0xd7a6dff4,0x4c3e1c80,
  127007. 0x2883f986,0x00c78f36,0x998e5305,0xed92b592,0x325ddc73,0x018a8f1b,
  127008. 0xd5d3708a,0x6dffd987,0x0d1f28bb,0xdcd3554f,0x00000059 },
  127009. { 0x23a74e7d,0x17c6e41d,0x5db32df6,0x94b61ebe,0x9e7ffa0b,0x3c2fffa7,
  127010. 0x2ebb7a0d,0x473662b7,0x01adf9c3,0xa86415ee,0x54679264,0x1502c326,
  127011. 0x2fa09c57,0x16911349,0x24749086,0x897f34aa,0x00000195 } },
  127012. /* 243 */
  127013. { { 0xabadc253,0x4845d359,0xc797c95e,0xe054b92c,0x9a218212,0x22a9b5bd,
  127014. 0xa52b8827,0x9bb80a5e,0x2e61c676,0xea38e78e,0x08b0f8b3,0xfb274b1a,
  127015. 0xdb9d854c,0xb6aa42e3,0x56012d73,0x8ba22523,0x00000163 },
  127016. { 0x75c8c576,0x7cec0e6f,0xe4bc7dd2,0xabb20e7c,0x69d80726,0x0958a0c8,
  127017. 0x8a023eb7,0xa908c66a,0x76110b15,0xca9f50ea,0x186f61a6,0x668c9994,
  127018. 0x2a0a69d8,0x9ddf22ed,0xbbf8a10f,0xbfee1897,0x000001e0 } },
  127019. /* 244 */
  127020. { { 0x48319e4f,0x26d86818,0x5a586fa0,0x6be6f6b5,0x26713265,0xbef5d886,
  127021. 0x98529cfa,0xac252ac5,0x62b29cfb,0xe7cc45f1,0xa2a6358d,0xee050609,
  127022. 0x2940ac70,0xf7cb9ca4,0xa885b1f0,0xfb44aaec,0x000001ad },
  127023. { 0xe798678e,0x66b7a936,0x99540438,0xca01e103,0x816860b7,0xf2491e37,
  127024. 0xb745d857,0xeeffd483,0xa4705ed6,0x5dbb3628,0xb2a5d0f7,0x57d68d49,
  127025. 0x2389fee3,0xd1a8529a,0x1a7fd686,0xdbbc2549,0x000001ad } },
  127026. /* 245 */
  127027. { { 0x969686a3,0xe10cba20,0xe3c053f5,0x308b1c55,0x26f47102,0x1712b134,
  127028. 0x49033038,0x1f9165b1,0x2d01527b,0x45b72017,0xaa9a34e2,0x6fcf6647,
  127029. 0xb0be35c8,0x51f54b94,0x5a15e382,0xfccb22a5,0x000000e3 },
  127030. { 0x5b4dc0be,0xaa71e4ec,0xdb1cd5c4,0xbb136248,0x046e1007,0xf36bff43,
  127031. 0xda9c99a3,0x5a6806d7,0x8349bc50,0x9cbfc6ee,0xe13e0850,0x26871e73,
  127032. 0x67f448c1,0x5e6aa227,0x2da7baf9,0xba77787c,0x000001b9 } },
  127033. /* 246 */
  127034. { { 0xc5a73375,0x1abe58ee,0x7a8ac438,0x175df69d,0xceca835a,0x2cf3150a,
  127035. 0xf507d30f,0xb87b0609,0xc60b0424,0x9ae53a2b,0x410f90ec,0x4931e182,
  127036. 0xadd689bb,0x452c7d0f,0x47631a8e,0xab453491,0x00000013 },
  127037. { 0x8c84f3af,0xaf2dd856,0x1baae33e,0x829dc092,0x8b96b070,0x46542a85,
  127038. 0xe8a82516,0x42260d40,0x5c35322b,0xb9e5edac,0x39eda0d2,0xbca79560,
  127039. 0xb962b90a,0x86bd07c6,0xb1ec5302,0x2e22dac7,0x0000010a } },
  127040. /* 247 */
  127041. { { 0x239d8f0a,0x665fc09d,0xab8a1021,0x92b2e03c,0x0173477b,0xe4369768,
  127042. 0x8e361604,0xab38ed9f,0x9eb061be,0x79b0091d,0x3e845670,0xcd422654,
  127043. 0x2fe1a2e0,0xa0f77ec7,0x760a030f,0x1d242162,0x00000093 },
  127044. { 0xf8646bc3,0xfa9f834c,0x40ae96f9,0x7df94a52,0x379177d1,0x901c3890,
  127045. 0xffeb66cd,0x9dfd0644,0x77b92465,0x81aec2ec,0xcd981d4f,0x2df3b7f2,
  127046. 0xf377b093,0xc9bc3f69,0xdd859d8b,0xdaef34f3,0x00000125 } },
  127047. /* 248 */
  127048. { { 0xa2c123bc,0xac08451b,0x0818fa54,0xd1e83a68,0x98957b8a,0x56dd5702,
  127049. 0xf0f12f16,0xcc7f2e34,0x0a9fa14d,0x1f6a9c33,0xb2fe782c,0xefc9a2bb,
  127050. 0x709f54dd,0xd319c697,0xd6460a53,0x0b8238cb,0x000001dc },
  127051. { 0x44dfb6f6,0xf6492901,0x6e401d26,0x270d7cb4,0x48537ad8,0x1a70a40e,
  127052. 0x70d8dbd9,0x84d661b5,0xf170d58b,0xca27223a,0x6344e1d2,0xeeb4cf14,
  127053. 0xab9de1fa,0x2255fc95,0xdbdc5ea7,0xcd6e110a,0x000001f8 } },
  127054. /* 249 */
  127055. { { 0x78b8a0a7,0x2a57c6b9,0xe833edea,0x24b4aeb6,0x4bd13fe7,0x9e4617c1,
  127056. 0xfc2e8ee4,0xc4186888,0xfb147eef,0x8d398a49,0x2e662cfb,0xe9f191f1,
  127057. 0x958ba2ec,0x61872289,0x00b8d50d,0xbd6d0f1b,0x0000002d },
  127058. { 0x24c93cc9,0x895cfdfe,0xb9e718e7,0x29ed7780,0x38baf7eb,0x01c8ba58,
  127059. 0x4ddcbf69,0x0225387e,0xa180d6bb,0x64b250bf,0xc947c7c2,0x6d68e548,
  127060. 0x9923f3cd,0x82a7b632,0x2d103cd2,0xb8f03613,0x0000000f } },
  127061. /* 250 */
  127062. { { 0x8cd9d494,0x8198b3f0,0x94f4f9f3,0x9b2065b9,0x3c738fa9,0x7664a220,
  127063. 0xd8d229cb,0x199f4c14,0xc51c54b3,0xddad75c4,0xd213a332,0x9a32ce0b,
  127064. 0x888c7b2f,0xf3a21085,0x5b1ff20a,0x6defa362,0x000000d1 },
  127065. { 0x19a296eb,0x44e00548,0xd1a91313,0x1d94ff15,0xfeaa454f,0xd7dead2b,
  127066. 0x4d40bd7f,0xae65a803,0x1801a4af,0x604f147e,0xa5e0de77,0x983048f9,
  127067. 0xff572ca0,0xa3b19ca5,0x1821d117,0xa237dba7,0x000000e0 } },
  127068. /* 251 */
  127069. { { 0x91630ee8,0xedbabf84,0x05eb5301,0xde6589c2,0xa051f47b,0x9f7d2b2d,
  127070. 0x212bbe81,0xaeaa9f96,0x94292124,0xdced3d5e,0xf4435e5b,0x691f5b89,
  127071. 0x9411f66f,0x19604c33,0x4356f0da,0xb7fc09ca,0x000000e6 },
  127072. { 0xf74f811c,0x1294e413,0xdf8d8ddb,0x1a42d831,0x963418c9,0x27f57217,
  127073. 0x88ebcdec,0x5fde5218,0xea305bc9,0xfdd5e06e,0xac668b61,0xed1e6088,
  127074. 0xeb811861,0x333af016,0x15ddcebc,0x5ecb192d,0x000001c9 } },
  127075. /* 252 */
  127076. { { 0xe0bde442,0x927b37a3,0x66f7a73e,0xe0543fe8,0x8ed10c2e,0xd30d9d20,
  127077. 0xa6617a32,0xaf79c341,0xd1d5cf8b,0xe7367870,0xe3abcf8b,0x02d0dce9,
  127078. 0x772b5e7b,0xfe23d2dd,0x1ffc70c5,0x29fceea0,0x0000010b },
  127079. { 0x62d803ff,0x31bcae4d,0xdbc306a9,0x93ee913f,0xd8c10662,0xaf1de7ab,
  127080. 0xe7a6d658,0xd485782a,0x102f4e06,0x9126592e,0x136fafe6,0x91a3127f,
  127081. 0x88371213,0x46b93440,0xa31e1634,0x53bb4380,0x000000ba } },
  127082. /* 253 */
  127083. { { 0xca5636b0,0x62e517fc,0x6aba15c7,0x4296e021,0x212e7b2d,0x5aa8fd7c,
  127084. 0x5717ad84,0x9517ce6d,0x98b2f357,0xe762b85b,0xdf59b07c,0x42f996b5,
  127085. 0xf37ef6f0,0xf3732abb,0x4542b489,0xa5d145ea,0x0000015d },
  127086. { 0xaa7f6e3f,0x1e77c55e,0xaa4a05bc,0x3f4d99a7,0x45828227,0xa56d7d77,
  127087. 0x77b748fb,0xdb0895fb,0x0629f5d1,0x1c484cce,0x359803fb,0xf5b1c90a,
  127088. 0x1720b8d0,0x43ac4f29,0x72ac13f2,0x8c10bfe8,0x000000e9 } },
  127089. /* 254 */
  127090. { { 0xc06c4fd6,0x9d1c4785,0xd25c2b9d,0xbf4b9025,0xd4982f24,0x04135eb1,
  127091. 0xba4fef2b,0x3ab3edc2,0x98de07ab,0x55a5239f,0x096f4b7d,0xd5fc49ab,
  127092. 0x3844c815,0xc50a2960,0x15676b2b,0xdb1148d0,0x00000047 },
  127093. { 0x10f3bad9,0xc49f9cc5,0x022901d4,0x490888fc,0xc47b44df,0x917a55eb,
  127094. 0xf39f2b68,0x20b2ebc6,0x04e9962a,0x0c58e3af,0x573dd5b7,0x52ab7c1b,
  127095. 0xa329f76c,0x2b54add6,0x82f4ca3b,0x59dad1eb,0x00000108 } },
  127096. /* 255 */
  127097. { { 0xa182d1ad,0x662c4128,0x20916c45,0x7751796e,0xba681647,0xa7704272,
  127098. 0xb92c85c1,0xfac8b0fa,0xaefb2e07,0x207ab2df,0x7861b32d,0xc73530a0,
  127099. 0x88aed145,0x63dbed65,0x0a53a49d,0x547bcdca,0x000000bd },
  127100. { 0x87056b51,0xa7c1382f,0x130f9912,0xc3d91edb,0xd3805b42,0xf7c7de46,
  127101. 0xfd31a995,0x456101eb,0xcd3fb8aa,0x1efd22b4,0x9eb17bce,0xfe391df7,
  127102. 0x616c0c32,0xb4d4c0c6,0x711beef4,0x19f023be,0x00000112 } },
  127103. };
  127104. /* Multiply the base point of P521 by the scalar and return the result.
  127105. * If map is true then convert result to affine coordinates.
  127106. *
  127107. * Stripe implementation.
  127108. * Pre-generated: 2^0, 2^65, ...
  127109. * Pre-generated: products of all combinations of above.
  127110. * 8 doubles and adds (with qz=1)
  127111. *
  127112. * r Resulting point.
  127113. * k Scalar to multiply by.
  127114. * map Indicates whether to convert result to affine.
  127115. * ct Constant time required.
  127116. * heap Heap to use for allocation.
  127117. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  127118. */
  127119. static int sp_521_ecc_mulmod_base_17(sp_point_521* r, const sp_digit* k,
  127120. int map, int ct, void* heap)
  127121. {
  127122. return sp_521_ecc_mulmod_stripe_17(r, &p521_base, p521_table,
  127123. k, map, ct, heap);
  127124. }
  127125. #endif
  127126. /* Multiply the base point of P521 by the scalar and return the result.
  127127. * If map is true then convert result to affine coordinates.
  127128. *
  127129. * km Scalar to multiply by.
  127130. * r Resulting point.
  127131. * map Indicates whether to convert result to affine.
  127132. * heap Heap to use for allocation.
  127133. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  127134. */
  127135. int sp_ecc_mulmod_base_521(const mp_int* km, ecc_point* r, int map, void* heap)
  127136. {
  127137. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  127138. sp_point_521* point = NULL;
  127139. sp_digit* k = NULL;
  127140. #else
  127141. sp_point_521 point[1];
  127142. sp_digit k[17];
  127143. #endif
  127144. int err = MP_OKAY;
  127145. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  127146. point = (sp_point_521*)XMALLOC(sizeof(sp_point_521), heap,
  127147. DYNAMIC_TYPE_ECC);
  127148. if (point == NULL)
  127149. err = MEMORY_E;
  127150. if (err == MP_OKAY) {
  127151. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 17, heap,
  127152. DYNAMIC_TYPE_ECC);
  127153. if (k == NULL)
  127154. err = MEMORY_E;
  127155. }
  127156. #endif
  127157. if (err == MP_OKAY) {
  127158. sp_521_from_mp(k, 17, km);
  127159. err = sp_521_ecc_mulmod_base_17(point, k, map, 1, heap);
  127160. }
  127161. if (err == MP_OKAY) {
  127162. err = sp_521_point_to_ecc_point_17(point, r);
  127163. }
  127164. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  127165. if (k != NULL)
  127166. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  127167. if (point != NULL)
  127168. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  127169. #endif
  127170. return err;
  127171. }
  127172. /* Multiply the base point of P521 by the scalar, add point a and return
  127173. * the result. If map is true then convert result to affine coordinates.
  127174. *
  127175. * km Scalar to multiply by.
  127176. * am Point to add to scalar mulitply result.
  127177. * inMont Point to add is in montgomery form.
  127178. * r Resulting point.
  127179. * map Indicates whether to convert result to affine.
  127180. * heap Heap to use for allocation.
  127181. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  127182. */
  127183. int sp_ecc_mulmod_base_add_521(const mp_int* km, const ecc_point* am,
  127184. int inMont, ecc_point* r, int map, void* heap)
  127185. {
  127186. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  127187. sp_point_521* point = NULL;
  127188. sp_digit* k = NULL;
  127189. #else
  127190. sp_point_521 point[2];
  127191. sp_digit k[17 + 17 * 2 * 6];
  127192. #endif
  127193. sp_point_521* addP = NULL;
  127194. sp_digit* tmp = NULL;
  127195. int err = MP_OKAY;
  127196. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  127197. point = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap,
  127198. DYNAMIC_TYPE_ECC);
  127199. if (point == NULL)
  127200. err = MEMORY_E;
  127201. if (err == MP_OKAY) {
  127202. k = (sp_digit*)XMALLOC(
  127203. sizeof(sp_digit) * (17 + 17 * 2 * 6),
  127204. heap, DYNAMIC_TYPE_ECC);
  127205. if (k == NULL)
  127206. err = MEMORY_E;
  127207. }
  127208. #endif
  127209. if (err == MP_OKAY) {
  127210. addP = point + 1;
  127211. tmp = k + 17;
  127212. sp_521_from_mp(k, 17, km);
  127213. sp_521_point_from_ecc_point_17(addP, am);
  127214. }
  127215. if ((err == MP_OKAY) && (!inMont)) {
  127216. err = sp_521_mod_mul_norm_17(addP->x, addP->x, p521_mod);
  127217. }
  127218. if ((err == MP_OKAY) && (!inMont)) {
  127219. err = sp_521_mod_mul_norm_17(addP->y, addP->y, p521_mod);
  127220. }
  127221. if ((err == MP_OKAY) && (!inMont)) {
  127222. err = sp_521_mod_mul_norm_17(addP->z, addP->z, p521_mod);
  127223. }
  127224. if (err == MP_OKAY) {
  127225. err = sp_521_ecc_mulmod_base_17(point, k, 0, 0, heap);
  127226. }
  127227. if (err == MP_OKAY) {
  127228. sp_521_proj_point_add_17(point, point, addP, tmp);
  127229. if (map) {
  127230. sp_521_map_17(point, point, tmp);
  127231. }
  127232. err = sp_521_point_to_ecc_point_17(point, r);
  127233. }
  127234. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  127235. if (k != NULL)
  127236. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  127237. if (point)
  127238. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  127239. #endif
  127240. return err;
  127241. }
  127242. #if defined(WOLFSSL_VALIDATE_ECC_KEYGEN) || defined(HAVE_ECC_SIGN) || \
  127243. defined(HAVE_ECC_VERIFY)
  127244. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN | HAVE_ECC_SIGN | HAVE_ECC_VERIFY */
  127245. /* Add 1 to a. (a = a + 1)
  127246. *
  127247. * a A single precision integer.
  127248. */
  127249. SP_NOINLINE static void sp_521_add_one_17(sp_digit* a)
  127250. {
  127251. __asm__ __volatile__ (
  127252. "movs r2, #1\n\t"
  127253. "ldr r1, [%[a]]\n\t"
  127254. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127255. "adds r1, r1, r2\n\t"
  127256. #else
  127257. "add r1, r1, r2\n\t"
  127258. #endif
  127259. "movs r2, #0\n\t"
  127260. "str r1, [%[a]]\n\t"
  127261. "ldr r1, [%[a], #4]\n\t"
  127262. #ifdef WOLFSSL_KEIL
  127263. "adcs r1, r1, r2\n\t"
  127264. #elif defined(__clang__)
  127265. "adcs r1, r2\n\t"
  127266. #else
  127267. "adc r1, r2\n\t"
  127268. #endif
  127269. "str r1, [%[a], #4]\n\t"
  127270. "ldr r1, [%[a], #8]\n\t"
  127271. #ifdef WOLFSSL_KEIL
  127272. "adcs r1, r1, r2\n\t"
  127273. #elif defined(__clang__)
  127274. "adcs r1, r2\n\t"
  127275. #else
  127276. "adc r1, r2\n\t"
  127277. #endif
  127278. "str r1, [%[a], #8]\n\t"
  127279. "ldr r1, [%[a], #12]\n\t"
  127280. #ifdef WOLFSSL_KEIL
  127281. "adcs r1, r1, r2\n\t"
  127282. #elif defined(__clang__)
  127283. "adcs r1, r2\n\t"
  127284. #else
  127285. "adc r1, r2\n\t"
  127286. #endif
  127287. "str r1, [%[a], #12]\n\t"
  127288. "ldr r1, [%[a], #16]\n\t"
  127289. #ifdef WOLFSSL_KEIL
  127290. "adcs r1, r1, r2\n\t"
  127291. #elif defined(__clang__)
  127292. "adcs r1, r2\n\t"
  127293. #else
  127294. "adc r1, r2\n\t"
  127295. #endif
  127296. "str r1, [%[a], #16]\n\t"
  127297. "ldr r1, [%[a], #20]\n\t"
  127298. #ifdef WOLFSSL_KEIL
  127299. "adcs r1, r1, r2\n\t"
  127300. #elif defined(__clang__)
  127301. "adcs r1, r2\n\t"
  127302. #else
  127303. "adc r1, r2\n\t"
  127304. #endif
  127305. "str r1, [%[a], #20]\n\t"
  127306. "ldr r1, [%[a], #24]\n\t"
  127307. #ifdef WOLFSSL_KEIL
  127308. "adcs r1, r1, r2\n\t"
  127309. #elif defined(__clang__)
  127310. "adcs r1, r2\n\t"
  127311. #else
  127312. "adc r1, r2\n\t"
  127313. #endif
  127314. "str r1, [%[a], #24]\n\t"
  127315. "ldr r1, [%[a], #28]\n\t"
  127316. #ifdef WOLFSSL_KEIL
  127317. "adcs r1, r1, r2\n\t"
  127318. #elif defined(__clang__)
  127319. "adcs r1, r2\n\t"
  127320. #else
  127321. "adc r1, r2\n\t"
  127322. #endif
  127323. "str r1, [%[a], #28]\n\t"
  127324. "ldr r1, [%[a], #32]\n\t"
  127325. #ifdef WOLFSSL_KEIL
  127326. "adcs r1, r1, r2\n\t"
  127327. #elif defined(__clang__)
  127328. "adcs r1, r2\n\t"
  127329. #else
  127330. "adc r1, r2\n\t"
  127331. #endif
  127332. "str r1, [%[a], #32]\n\t"
  127333. "ldr r1, [%[a], #36]\n\t"
  127334. #ifdef WOLFSSL_KEIL
  127335. "adcs r1, r1, r2\n\t"
  127336. #elif defined(__clang__)
  127337. "adcs r1, r2\n\t"
  127338. #else
  127339. "adc r1, r2\n\t"
  127340. #endif
  127341. "str r1, [%[a], #36]\n\t"
  127342. "ldr r1, [%[a], #40]\n\t"
  127343. #ifdef WOLFSSL_KEIL
  127344. "adcs r1, r1, r2\n\t"
  127345. #elif defined(__clang__)
  127346. "adcs r1, r2\n\t"
  127347. #else
  127348. "adc r1, r2\n\t"
  127349. #endif
  127350. "str r1, [%[a], #40]\n\t"
  127351. "ldr r1, [%[a], #44]\n\t"
  127352. #ifdef WOLFSSL_KEIL
  127353. "adcs r1, r1, r2\n\t"
  127354. #elif defined(__clang__)
  127355. "adcs r1, r2\n\t"
  127356. #else
  127357. "adc r1, r2\n\t"
  127358. #endif
  127359. "str r1, [%[a], #44]\n\t"
  127360. "ldr r1, [%[a], #48]\n\t"
  127361. #ifdef WOLFSSL_KEIL
  127362. "adcs r1, r1, r2\n\t"
  127363. #elif defined(__clang__)
  127364. "adcs r1, r2\n\t"
  127365. #else
  127366. "adc r1, r2\n\t"
  127367. #endif
  127368. "str r1, [%[a], #48]\n\t"
  127369. "ldr r1, [%[a], #52]\n\t"
  127370. #ifdef WOLFSSL_KEIL
  127371. "adcs r1, r1, r2\n\t"
  127372. #elif defined(__clang__)
  127373. "adcs r1, r2\n\t"
  127374. #else
  127375. "adc r1, r2\n\t"
  127376. #endif
  127377. "str r1, [%[a], #52]\n\t"
  127378. "ldr r1, [%[a], #56]\n\t"
  127379. #ifdef WOLFSSL_KEIL
  127380. "adcs r1, r1, r2\n\t"
  127381. #elif defined(__clang__)
  127382. "adcs r1, r2\n\t"
  127383. #else
  127384. "adc r1, r2\n\t"
  127385. #endif
  127386. "str r1, [%[a], #56]\n\t"
  127387. "ldr r1, [%[a], #60]\n\t"
  127388. #ifdef WOLFSSL_KEIL
  127389. "adcs r1, r1, r2\n\t"
  127390. #elif defined(__clang__)
  127391. "adcs r1, r2\n\t"
  127392. #else
  127393. "adc r1, r2\n\t"
  127394. #endif
  127395. "str r1, [%[a], #60]\n\t"
  127396. "ldr r1, [%[a], #64]\n\t"
  127397. #ifdef WOLFSSL_KEIL
  127398. "adcs r1, r1, r2\n\t"
  127399. #elif defined(__clang__)
  127400. "adcs r1, r2\n\t"
  127401. #else
  127402. "adc r1, r2\n\t"
  127403. #endif
  127404. "str r1, [%[a], #64]\n\t"
  127405. : [a] "+l" (a)
  127406. :
  127407. : "memory", "r1", "r2"
  127408. );
  127409. }
  127410. /* Read big endian unsigned byte array into r.
  127411. *
  127412. * r A single precision integer.
  127413. * size Maximum number of bytes to convert
  127414. * a Byte array.
  127415. * n Number of bytes in array to read.
  127416. */
  127417. static void sp_521_from_bin(sp_digit* r, int size, const byte* a, int n)
  127418. {
  127419. int i;
  127420. int j;
  127421. byte* d;
  127422. for (i = n - 1,j = 0; i >= 3; i -= 4) {
  127423. r[j] = ((sp_digit)a[i - 0] << 0) |
  127424. ((sp_digit)a[i - 1] << 8) |
  127425. ((sp_digit)a[i - 2] << 16) |
  127426. ((sp_digit)a[i - 3] << 24);
  127427. j++;
  127428. }
  127429. if (i >= 0) {
  127430. r[j] = 0;
  127431. d = (byte*)r;
  127432. switch (i) {
  127433. case 2: d[n - 1 - 2] = a[2]; //fallthrough
  127434. case 1: d[n - 1 - 1] = a[1]; //fallthrough
  127435. case 0: d[n - 1 - 0] = a[0]; //fallthrough
  127436. }
  127437. j++;
  127438. }
  127439. for (; j < size; j++) {
  127440. r[j] = 0;
  127441. }
  127442. }
  127443. /* Generates a scalar that is in the range 1..order-1.
  127444. *
  127445. * rng Random number generator.
  127446. * k Scalar value.
  127447. * returns RNG failures, MEMORY_E when memory allocation fails and
  127448. * MP_OKAY on success.
  127449. */
  127450. static int sp_521_ecc_gen_k_17(WC_RNG* rng, sp_digit* k)
  127451. {
  127452. int err;
  127453. byte buf[66];
  127454. do {
  127455. err = wc_RNG_GenerateBlock(rng, buf, sizeof(buf));
  127456. if (err == 0) {
  127457. buf[0] &= 0x1;
  127458. sp_521_from_bin(k, 17, buf, (int)sizeof(buf));
  127459. if (sp_521_cmp_17(k, p521_order2) <= 0) {
  127460. sp_521_add_one_17(k);
  127461. break;
  127462. }
  127463. }
  127464. }
  127465. while (err == 0);
  127466. return err;
  127467. }
  127468. /* Makes a random EC key pair.
  127469. *
  127470. * rng Random number generator.
  127471. * priv Generated private value.
  127472. * pub Generated public point.
  127473. * heap Heap to use for allocation.
  127474. * returns ECC_INF_E when the point does not have the correct order, RNG
  127475. * failures, MEMORY_E when memory allocation fails and MP_OKAY on success.
  127476. */
  127477. int sp_ecc_make_key_521(WC_RNG* rng, mp_int* priv, ecc_point* pub, void* heap)
  127478. {
  127479. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  127480. sp_point_521* point = NULL;
  127481. sp_digit* k = NULL;
  127482. #else
  127483. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  127484. sp_point_521 point[2];
  127485. #else
  127486. sp_point_521 point[1];
  127487. #endif
  127488. sp_digit k[17];
  127489. #endif
  127490. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  127491. sp_point_521* infinity = NULL;
  127492. #endif
  127493. int err = MP_OKAY;
  127494. (void)heap;
  127495. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  127496. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  127497. point = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap, DYNAMIC_TYPE_ECC);
  127498. #else
  127499. point = (sp_point_521*)XMALLOC(sizeof(sp_point_521), heap, DYNAMIC_TYPE_ECC);
  127500. #endif
  127501. if (point == NULL)
  127502. err = MEMORY_E;
  127503. if (err == MP_OKAY) {
  127504. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 17, heap,
  127505. DYNAMIC_TYPE_ECC);
  127506. if (k == NULL)
  127507. err = MEMORY_E;
  127508. }
  127509. #endif
  127510. if (err == MP_OKAY) {
  127511. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  127512. infinity = point + 1;
  127513. #endif
  127514. err = sp_521_ecc_gen_k_17(rng, k);
  127515. }
  127516. if (err == MP_OKAY) {
  127517. err = sp_521_ecc_mulmod_base_17(point, k, 1, 1, NULL);
  127518. }
  127519. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  127520. if (err == MP_OKAY) {
  127521. err = sp_521_ecc_mulmod_17(infinity, point, p521_order, 1, 1, NULL);
  127522. }
  127523. if (err == MP_OKAY) {
  127524. if (sp_521_iszero_17(point->x) || sp_521_iszero_17(point->y)) {
  127525. err = ECC_INF_E;
  127526. }
  127527. }
  127528. #endif
  127529. if (err == MP_OKAY) {
  127530. err = sp_521_to_mp(k, priv);
  127531. }
  127532. if (err == MP_OKAY) {
  127533. err = sp_521_point_to_ecc_point_17(point, pub);
  127534. }
  127535. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  127536. if (k != NULL)
  127537. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  127538. if (point != NULL) {
  127539. /* point is not sensitive, so no need to zeroize */
  127540. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  127541. }
  127542. #endif
  127543. return err;
  127544. }
  127545. #ifdef WOLFSSL_SP_NONBLOCK
  127546. typedef struct sp_ecc_key_gen_521_ctx {
  127547. int state;
  127548. sp_521_ecc_mulmod_17_ctx mulmod_ctx;
  127549. sp_digit k[17];
  127550. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  127551. sp_point_521 point[2];
  127552. #else
  127553. sp_point_521 point[1];
  127554. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN */
  127555. } sp_ecc_key_gen_521_ctx;
  127556. int sp_ecc_make_key_521_nb(sp_ecc_ctx_t* sp_ctx, WC_RNG* rng, mp_int* priv,
  127557. ecc_point* pub, void* heap)
  127558. {
  127559. int err = FP_WOULDBLOCK;
  127560. sp_ecc_key_gen_521_ctx* ctx = (sp_ecc_key_gen_521_ctx*)sp_ctx->data;
  127561. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  127562. sp_point_521* infinity = ctx->point + 1;
  127563. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN */
  127564. typedef char ctx_size_test[sizeof(sp_ecc_key_gen_521_ctx)
  127565. >= sizeof(*sp_ctx) ? -1 : 1];
  127566. (void)sizeof(ctx_size_test);
  127567. switch (ctx->state) {
  127568. case 0:
  127569. err = sp_521_ecc_gen_k_17(rng, ctx->k);
  127570. if (err == MP_OKAY) {
  127571. err = FP_WOULDBLOCK;
  127572. ctx->state = 1;
  127573. }
  127574. break;
  127575. case 1:
  127576. err = sp_521_ecc_mulmod_base_17_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  127577. ctx->point, ctx->k, 1, 1, heap);
  127578. if (err == MP_OKAY) {
  127579. err = FP_WOULDBLOCK;
  127580. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  127581. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  127582. ctx->state = 2;
  127583. #else
  127584. ctx->state = 3;
  127585. #endif
  127586. }
  127587. break;
  127588. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  127589. case 2:
  127590. err = sp_521_ecc_mulmod_17_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  127591. infinity, ctx->point, p521_order, 1, 1);
  127592. if (err == MP_OKAY) {
  127593. if (sp_521_iszero_17(ctx->point->x) ||
  127594. sp_521_iszero_17(ctx->point->y)) {
  127595. err = ECC_INF_E;
  127596. }
  127597. else {
  127598. err = FP_WOULDBLOCK;
  127599. ctx->state = 3;
  127600. }
  127601. }
  127602. break;
  127603. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN */
  127604. case 3:
  127605. err = sp_521_to_mp(ctx->k, priv);
  127606. if (err == MP_OKAY) {
  127607. err = sp_521_point_to_ecc_point_17(ctx->point, pub);
  127608. }
  127609. break;
  127610. }
  127611. if (err != FP_WOULDBLOCK) {
  127612. XMEMSET(ctx, 0, sizeof(sp_ecc_key_gen_521_ctx));
  127613. }
  127614. return err;
  127615. }
  127616. #endif /* WOLFSSL_SP_NONBLOCK */
  127617. #ifdef HAVE_ECC_DHE
  127618. /* Write r as big endian to byte array.
  127619. * Fixed length number of bytes written: 66
  127620. *
  127621. * r A single precision integer.
  127622. * a Byte array.
  127623. */
  127624. static void sp_521_to_bin_17(sp_digit* r, byte* a)
  127625. {
  127626. int i;
  127627. int j = 0;
  127628. a[j++] = r[16] >> 8;
  127629. a[j++] = r[16] >> 0;
  127630. for (i = 15; i >= 0; i--) {
  127631. a[j++] = r[i] >> 24;
  127632. a[j++] = r[i] >> 16;
  127633. a[j++] = r[i] >> 8;
  127634. a[j++] = r[i] >> 0;
  127635. }
  127636. }
  127637. /* Multiply the point by the scalar and serialize the X ordinate.
  127638. * The number is 0 padded to maximum size on output.
  127639. *
  127640. * priv Scalar to multiply the point by.
  127641. * pub Point to multiply.
  127642. * out Buffer to hold X ordinate.
  127643. * outLen On entry, size of the buffer in bytes.
  127644. * On exit, length of data in buffer in bytes.
  127645. * heap Heap to use for allocation.
  127646. * returns BUFFER_E if the buffer is to small for output size,
  127647. * MEMORY_E when memory allocation fails and MP_OKAY on success.
  127648. */
  127649. int sp_ecc_secret_gen_521(const mp_int* priv, const ecc_point* pub, byte* out,
  127650. word32* outLen, void* heap)
  127651. {
  127652. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  127653. sp_point_521* point = NULL;
  127654. sp_digit* k = NULL;
  127655. #else
  127656. sp_point_521 point[1];
  127657. sp_digit k[17];
  127658. #endif
  127659. int err = MP_OKAY;
  127660. if (*outLen < 65U) {
  127661. err = BUFFER_E;
  127662. }
  127663. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  127664. if (err == MP_OKAY) {
  127665. point = (sp_point_521*)XMALLOC(sizeof(sp_point_521), heap,
  127666. DYNAMIC_TYPE_ECC);
  127667. if (point == NULL)
  127668. err = MEMORY_E;
  127669. }
  127670. if (err == MP_OKAY) {
  127671. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 17, heap,
  127672. DYNAMIC_TYPE_ECC);
  127673. if (k == NULL)
  127674. err = MEMORY_E;
  127675. }
  127676. #endif
  127677. if (err == MP_OKAY) {
  127678. sp_521_from_mp(k, 17, priv);
  127679. sp_521_point_from_ecc_point_17(point, pub);
  127680. err = sp_521_ecc_mulmod_17(point, point, k, 1, 1, heap);
  127681. }
  127682. if (err == MP_OKAY) {
  127683. sp_521_to_bin_17(point->x, out);
  127684. *outLen = 66;
  127685. }
  127686. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  127687. if (k != NULL)
  127688. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  127689. if (point != NULL)
  127690. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  127691. #endif
  127692. return err;
  127693. }
  127694. #ifdef WOLFSSL_SP_NONBLOCK
  127695. typedef struct sp_ecc_sec_gen_521_ctx {
  127696. int state;
  127697. union {
  127698. sp_521_ecc_mulmod_17_ctx mulmod_ctx;
  127699. };
  127700. sp_digit k[17];
  127701. sp_point_521 point;
  127702. } sp_ecc_sec_gen_521_ctx;
  127703. int sp_ecc_secret_gen_521_nb(sp_ecc_ctx_t* sp_ctx, const mp_int* priv,
  127704. const ecc_point* pub, byte* out, word32* outLen, void* heap)
  127705. {
  127706. int err = FP_WOULDBLOCK;
  127707. sp_ecc_sec_gen_521_ctx* ctx = (sp_ecc_sec_gen_521_ctx*)sp_ctx->data;
  127708. typedef char ctx_size_test[sizeof(sp_ecc_sec_gen_521_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  127709. (void)sizeof(ctx_size_test);
  127710. if (*outLen < 32U) {
  127711. err = BUFFER_E;
  127712. }
  127713. switch (ctx->state) {
  127714. case 0:
  127715. sp_521_from_mp(ctx->k, 17, priv);
  127716. sp_521_point_from_ecc_point_17(&ctx->point, pub);
  127717. ctx->state = 1;
  127718. break;
  127719. case 1:
  127720. err = sp_521_ecc_mulmod_17_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  127721. &ctx->point, &ctx->point, ctx->k, 1, 1, heap);
  127722. if (err == MP_OKAY) {
  127723. sp_521_to_bin_17(ctx->point.x, out);
  127724. *outLen = 66;
  127725. }
  127726. break;
  127727. }
  127728. if (err == MP_OKAY && ctx->state != 1) {
  127729. err = FP_WOULDBLOCK;
  127730. }
  127731. if (err != FP_WOULDBLOCK) {
  127732. XMEMSET(ctx, 0, sizeof(sp_ecc_sec_gen_521_ctx));
  127733. }
  127734. return err;
  127735. }
  127736. #endif /* WOLFSSL_SP_NONBLOCK */
  127737. #endif /* HAVE_ECC_DHE */
  127738. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  127739. /* Right shift a by n bits into r. (r = a >> n)
  127740. *
  127741. * r A single precision integer.
  127742. * a A single precision integer.
  127743. * n Integer representing number of bits to shift.
  127744. */
  127745. static void sp_521_rshift_17(sp_digit* r, const sp_digit* a, byte n)
  127746. {
  127747. __asm__ __volatile__ (
  127748. "movs r7, #32\n\t"
  127749. #ifdef WOLFSSL_KEIL
  127750. "subs r7, r7, %[n]\n\t"
  127751. #else
  127752. #ifdef __clang__
  127753. "subs r7, r7, %[n]\n\t"
  127754. #else
  127755. "sub r7, r7, %[n]\n\t"
  127756. #endif
  127757. #endif
  127758. "ldr r3, [%[a]]\n\t"
  127759. "ldr r4, [%[a], #4]\n\t"
  127760. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127761. "lsrs r3, r3, %[n]\n\t"
  127762. #else
  127763. "lsr r3, r3, %[n]\n\t"
  127764. #endif
  127765. "movs r6, r4\n\t"
  127766. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127767. "lsrs r4, r4, %[n]\n\t"
  127768. #else
  127769. "lsr r4, r4, %[n]\n\t"
  127770. #endif
  127771. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127772. "lsls r6, r6, r7\n\t"
  127773. #else
  127774. "lsl r6, r6, r7\n\t"
  127775. #endif
  127776. #ifdef WOLFSSL_KEIL
  127777. "orrs r3, r3, r6\n\t"
  127778. #elif defined(__clang__)
  127779. "orrs r3, r6\n\t"
  127780. #else
  127781. "orr r3, r6\n\t"
  127782. #endif
  127783. "ldr r5, [%[a], #8]\n\t"
  127784. "str r3, [%[r]]\n\t"
  127785. "movs r6, r5\n\t"
  127786. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127787. "lsrs r5, r5, %[n]\n\t"
  127788. #else
  127789. "lsr r5, r5, %[n]\n\t"
  127790. #endif
  127791. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127792. "lsls r6, r6, r7\n\t"
  127793. #else
  127794. "lsl r6, r6, r7\n\t"
  127795. #endif
  127796. #ifdef WOLFSSL_KEIL
  127797. "orrs r4, r4, r6\n\t"
  127798. #elif defined(__clang__)
  127799. "orrs r4, r6\n\t"
  127800. #else
  127801. "orr r4, r6\n\t"
  127802. #endif
  127803. "ldr r3, [%[a], #12]\n\t"
  127804. "str r4, [%[r], #4]\n\t"
  127805. "movs r6, r3\n\t"
  127806. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127807. "lsrs r3, r3, %[n]\n\t"
  127808. #else
  127809. "lsr r3, r3, %[n]\n\t"
  127810. #endif
  127811. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127812. "lsls r6, r6, r7\n\t"
  127813. #else
  127814. "lsl r6, r6, r7\n\t"
  127815. #endif
  127816. #ifdef WOLFSSL_KEIL
  127817. "orrs r5, r5, r6\n\t"
  127818. #elif defined(__clang__)
  127819. "orrs r5, r6\n\t"
  127820. #else
  127821. "orr r5, r6\n\t"
  127822. #endif
  127823. "ldr r4, [%[a], #16]\n\t"
  127824. "str r5, [%[r], #8]\n\t"
  127825. "movs r6, r4\n\t"
  127826. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127827. "lsrs r4, r4, %[n]\n\t"
  127828. #else
  127829. "lsr r4, r4, %[n]\n\t"
  127830. #endif
  127831. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127832. "lsls r6, r6, r7\n\t"
  127833. #else
  127834. "lsl r6, r6, r7\n\t"
  127835. #endif
  127836. #ifdef WOLFSSL_KEIL
  127837. "orrs r3, r3, r6\n\t"
  127838. #elif defined(__clang__)
  127839. "orrs r3, r6\n\t"
  127840. #else
  127841. "orr r3, r6\n\t"
  127842. #endif
  127843. "ldr r5, [%[a], #20]\n\t"
  127844. "str r3, [%[r], #12]\n\t"
  127845. "movs r6, r5\n\t"
  127846. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127847. "lsrs r5, r5, %[n]\n\t"
  127848. #else
  127849. "lsr r5, r5, %[n]\n\t"
  127850. #endif
  127851. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127852. "lsls r6, r6, r7\n\t"
  127853. #else
  127854. "lsl r6, r6, r7\n\t"
  127855. #endif
  127856. #ifdef WOLFSSL_KEIL
  127857. "orrs r4, r4, r6\n\t"
  127858. #elif defined(__clang__)
  127859. "orrs r4, r6\n\t"
  127860. #else
  127861. "orr r4, r6\n\t"
  127862. #endif
  127863. "ldr r3, [%[a], #24]\n\t"
  127864. "str r4, [%[r], #16]\n\t"
  127865. "movs r6, r3\n\t"
  127866. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127867. "lsrs r3, r3, %[n]\n\t"
  127868. #else
  127869. "lsr r3, r3, %[n]\n\t"
  127870. #endif
  127871. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127872. "lsls r6, r6, r7\n\t"
  127873. #else
  127874. "lsl r6, r6, r7\n\t"
  127875. #endif
  127876. #ifdef WOLFSSL_KEIL
  127877. "orrs r5, r5, r6\n\t"
  127878. #elif defined(__clang__)
  127879. "orrs r5, r6\n\t"
  127880. #else
  127881. "orr r5, r6\n\t"
  127882. #endif
  127883. "ldr r4, [%[a], #28]\n\t"
  127884. "str r5, [%[r], #20]\n\t"
  127885. "movs r6, r4\n\t"
  127886. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127887. "lsrs r4, r4, %[n]\n\t"
  127888. #else
  127889. "lsr r4, r4, %[n]\n\t"
  127890. #endif
  127891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127892. "lsls r6, r6, r7\n\t"
  127893. #else
  127894. "lsl r6, r6, r7\n\t"
  127895. #endif
  127896. #ifdef WOLFSSL_KEIL
  127897. "orrs r3, r3, r6\n\t"
  127898. #elif defined(__clang__)
  127899. "orrs r3, r6\n\t"
  127900. #else
  127901. "orr r3, r6\n\t"
  127902. #endif
  127903. "ldr r5, [%[a], #32]\n\t"
  127904. "str r3, [%[r], #24]\n\t"
  127905. "movs r6, r5\n\t"
  127906. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127907. "lsrs r5, r5, %[n]\n\t"
  127908. #else
  127909. "lsr r5, r5, %[n]\n\t"
  127910. #endif
  127911. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127912. "lsls r6, r6, r7\n\t"
  127913. #else
  127914. "lsl r6, r6, r7\n\t"
  127915. #endif
  127916. #ifdef WOLFSSL_KEIL
  127917. "orrs r4, r4, r6\n\t"
  127918. #elif defined(__clang__)
  127919. "orrs r4, r6\n\t"
  127920. #else
  127921. "orr r4, r6\n\t"
  127922. #endif
  127923. "ldr r3, [%[a], #36]\n\t"
  127924. "str r4, [%[r], #28]\n\t"
  127925. "movs r6, r3\n\t"
  127926. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127927. "lsrs r3, r3, %[n]\n\t"
  127928. #else
  127929. "lsr r3, r3, %[n]\n\t"
  127930. #endif
  127931. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127932. "lsls r6, r6, r7\n\t"
  127933. #else
  127934. "lsl r6, r6, r7\n\t"
  127935. #endif
  127936. #ifdef WOLFSSL_KEIL
  127937. "orrs r5, r5, r6\n\t"
  127938. #elif defined(__clang__)
  127939. "orrs r5, r6\n\t"
  127940. #else
  127941. "orr r5, r6\n\t"
  127942. #endif
  127943. "ldr r4, [%[a], #40]\n\t"
  127944. "str r5, [%[r], #32]\n\t"
  127945. "movs r6, r4\n\t"
  127946. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127947. "lsrs r4, r4, %[n]\n\t"
  127948. #else
  127949. "lsr r4, r4, %[n]\n\t"
  127950. #endif
  127951. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127952. "lsls r6, r6, r7\n\t"
  127953. #else
  127954. "lsl r6, r6, r7\n\t"
  127955. #endif
  127956. #ifdef WOLFSSL_KEIL
  127957. "orrs r3, r3, r6\n\t"
  127958. #elif defined(__clang__)
  127959. "orrs r3, r6\n\t"
  127960. #else
  127961. "orr r3, r6\n\t"
  127962. #endif
  127963. "ldr r5, [%[a], #44]\n\t"
  127964. "str r3, [%[r], #36]\n\t"
  127965. "movs r6, r5\n\t"
  127966. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127967. "lsrs r5, r5, %[n]\n\t"
  127968. #else
  127969. "lsr r5, r5, %[n]\n\t"
  127970. #endif
  127971. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127972. "lsls r6, r6, r7\n\t"
  127973. #else
  127974. "lsl r6, r6, r7\n\t"
  127975. #endif
  127976. #ifdef WOLFSSL_KEIL
  127977. "orrs r4, r4, r6\n\t"
  127978. #elif defined(__clang__)
  127979. "orrs r4, r6\n\t"
  127980. #else
  127981. "orr r4, r6\n\t"
  127982. #endif
  127983. "ldr r3, [%[a], #48]\n\t"
  127984. "str r4, [%[r], #40]\n\t"
  127985. "movs r6, r3\n\t"
  127986. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127987. "lsrs r3, r3, %[n]\n\t"
  127988. #else
  127989. "lsr r3, r3, %[n]\n\t"
  127990. #endif
  127991. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127992. "lsls r6, r6, r7\n\t"
  127993. #else
  127994. "lsl r6, r6, r7\n\t"
  127995. #endif
  127996. #ifdef WOLFSSL_KEIL
  127997. "orrs r5, r5, r6\n\t"
  127998. #elif defined(__clang__)
  127999. "orrs r5, r6\n\t"
  128000. #else
  128001. "orr r5, r6\n\t"
  128002. #endif
  128003. "ldr r4, [%[a], #52]\n\t"
  128004. "str r5, [%[r], #44]\n\t"
  128005. "movs r6, r4\n\t"
  128006. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128007. "lsrs r4, r4, %[n]\n\t"
  128008. #else
  128009. "lsr r4, r4, %[n]\n\t"
  128010. #endif
  128011. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128012. "lsls r6, r6, r7\n\t"
  128013. #else
  128014. "lsl r6, r6, r7\n\t"
  128015. #endif
  128016. #ifdef WOLFSSL_KEIL
  128017. "orrs r3, r3, r6\n\t"
  128018. #elif defined(__clang__)
  128019. "orrs r3, r6\n\t"
  128020. #else
  128021. "orr r3, r6\n\t"
  128022. #endif
  128023. "ldr r5, [%[a], #56]\n\t"
  128024. "str r3, [%[r], #48]\n\t"
  128025. "movs r6, r5\n\t"
  128026. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128027. "lsrs r5, r5, %[n]\n\t"
  128028. #else
  128029. "lsr r5, r5, %[n]\n\t"
  128030. #endif
  128031. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128032. "lsls r6, r6, r7\n\t"
  128033. #else
  128034. "lsl r6, r6, r7\n\t"
  128035. #endif
  128036. #ifdef WOLFSSL_KEIL
  128037. "orrs r4, r4, r6\n\t"
  128038. #elif defined(__clang__)
  128039. "orrs r4, r6\n\t"
  128040. #else
  128041. "orr r4, r6\n\t"
  128042. #endif
  128043. "ldr r3, [%[a], #60]\n\t"
  128044. "str r4, [%[r], #52]\n\t"
  128045. "movs r6, r3\n\t"
  128046. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128047. "lsrs r3, r3, %[n]\n\t"
  128048. #else
  128049. "lsr r3, r3, %[n]\n\t"
  128050. #endif
  128051. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128052. "lsls r6, r6, r7\n\t"
  128053. #else
  128054. "lsl r6, r6, r7\n\t"
  128055. #endif
  128056. #ifdef WOLFSSL_KEIL
  128057. "orrs r5, r5, r6\n\t"
  128058. #elif defined(__clang__)
  128059. "orrs r5, r6\n\t"
  128060. #else
  128061. "orr r5, r6\n\t"
  128062. #endif
  128063. "ldr r4, [%[a], #64]\n\t"
  128064. "str r5, [%[r], #56]\n\t"
  128065. "movs r6, r4\n\t"
  128066. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128067. "lsrs r4, r4, %[n]\n\t"
  128068. #else
  128069. "lsr r4, r4, %[n]\n\t"
  128070. #endif
  128071. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128072. "lsls r6, r6, r7\n\t"
  128073. #else
  128074. "lsl r6, r6, r7\n\t"
  128075. #endif
  128076. #ifdef WOLFSSL_KEIL
  128077. "orrs r3, r3, r6\n\t"
  128078. #elif defined(__clang__)
  128079. "orrs r3, r6\n\t"
  128080. #else
  128081. "orr r3, r6\n\t"
  128082. #endif
  128083. "str r3, [%[r], #60]\n\t"
  128084. "str r4, [%[r], #64]\n\t"
  128085. : [r] "+l" (r), [a] "+l" (a), [n] "+l" (n)
  128086. :
  128087. : "memory", "r3", "r4", "r5", "r6", "r7"
  128088. );
  128089. }
  128090. #endif
  128091. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  128092. #endif
  128093. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  128094. /* Lefy shift a by n bits into r. (r = a << n)
  128095. *
  128096. * r A single precision integer.
  128097. * a A single precision integer.
  128098. * n Integer representing number of bits to shift.
  128099. */
  128100. static void sp_521_lshift_17(sp_digit* r, const sp_digit* a, byte n)
  128101. {
  128102. __asm__ __volatile__ (
  128103. "movs r7, #31\n\t"
  128104. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128105. "subs r7, r7, %[n]\n\t"
  128106. #else
  128107. "sub r7, r7, %[n]\n\t"
  128108. #endif
  128109. "ldr r4, [%[a], #64]\n\t"
  128110. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128111. "lsrs r5, r4, #1\n\t"
  128112. #else
  128113. "lsr r5, r4, #1\n\t"
  128114. #endif
  128115. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128116. "lsls r4, r4, %[n]\n\t"
  128117. #else
  128118. "lsl r4, r4, %[n]\n\t"
  128119. #endif
  128120. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128121. "lsrs r5, r5, r7\n\t"
  128122. #else
  128123. "lsr r5, r5, r7\n\t"
  128124. #endif
  128125. "ldr r3, [%[a], #60]\n\t"
  128126. "str r5, [%[r], #68]\n\t"
  128127. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128128. "lsrs r6, r3, #1\n\t"
  128129. #else
  128130. "lsr r6, r3, #1\n\t"
  128131. #endif
  128132. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128133. "lsls r3, r3, %[n]\n\t"
  128134. #else
  128135. "lsl r3, r3, %[n]\n\t"
  128136. #endif
  128137. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128138. "lsrs r6, r6, r7\n\t"
  128139. #else
  128140. "lsr r6, r6, r7\n\t"
  128141. #endif
  128142. #ifdef WOLFSSL_KEIL
  128143. "orrs r4, r4, r6\n\t"
  128144. #elif defined(__clang__)
  128145. "orrs r4, r6\n\t"
  128146. #else
  128147. "orr r4, r6\n\t"
  128148. #endif
  128149. "ldr r5, [%[a], #56]\n\t"
  128150. "str r4, [%[r], #64]\n\t"
  128151. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128152. "lsrs r6, r5, #1\n\t"
  128153. #else
  128154. "lsr r6, r5, #1\n\t"
  128155. #endif
  128156. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128157. "lsls r5, r5, %[n]\n\t"
  128158. #else
  128159. "lsl r5, r5, %[n]\n\t"
  128160. #endif
  128161. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128162. "lsrs r6, r6, r7\n\t"
  128163. #else
  128164. "lsr r6, r6, r7\n\t"
  128165. #endif
  128166. #ifdef WOLFSSL_KEIL
  128167. "orrs r3, r3, r6\n\t"
  128168. #elif defined(__clang__)
  128169. "orrs r3, r6\n\t"
  128170. #else
  128171. "orr r3, r6\n\t"
  128172. #endif
  128173. "ldr r4, [%[a], #52]\n\t"
  128174. "str r3, [%[r], #60]\n\t"
  128175. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128176. "lsrs r6, r4, #1\n\t"
  128177. #else
  128178. "lsr r6, r4, #1\n\t"
  128179. #endif
  128180. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128181. "lsls r4, r4, %[n]\n\t"
  128182. #else
  128183. "lsl r4, r4, %[n]\n\t"
  128184. #endif
  128185. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128186. "lsrs r6, r6, r7\n\t"
  128187. #else
  128188. "lsr r6, r6, r7\n\t"
  128189. #endif
  128190. #ifdef WOLFSSL_KEIL
  128191. "orrs r5, r5, r6\n\t"
  128192. #elif defined(__clang__)
  128193. "orrs r5, r6\n\t"
  128194. #else
  128195. "orr r5, r6\n\t"
  128196. #endif
  128197. "ldr r3, [%[a], #48]\n\t"
  128198. "str r5, [%[r], #56]\n\t"
  128199. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128200. "lsrs r6, r3, #1\n\t"
  128201. #else
  128202. "lsr r6, r3, #1\n\t"
  128203. #endif
  128204. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128205. "lsls r3, r3, %[n]\n\t"
  128206. #else
  128207. "lsl r3, r3, %[n]\n\t"
  128208. #endif
  128209. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128210. "lsrs r6, r6, r7\n\t"
  128211. #else
  128212. "lsr r6, r6, r7\n\t"
  128213. #endif
  128214. #ifdef WOLFSSL_KEIL
  128215. "orrs r4, r4, r6\n\t"
  128216. #elif defined(__clang__)
  128217. "orrs r4, r6\n\t"
  128218. #else
  128219. "orr r4, r6\n\t"
  128220. #endif
  128221. "ldr r5, [%[a], #44]\n\t"
  128222. "str r4, [%[r], #52]\n\t"
  128223. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128224. "lsrs r6, r5, #1\n\t"
  128225. #else
  128226. "lsr r6, r5, #1\n\t"
  128227. #endif
  128228. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128229. "lsls r5, r5, %[n]\n\t"
  128230. #else
  128231. "lsl r5, r5, %[n]\n\t"
  128232. #endif
  128233. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128234. "lsrs r6, r6, r7\n\t"
  128235. #else
  128236. "lsr r6, r6, r7\n\t"
  128237. #endif
  128238. #ifdef WOLFSSL_KEIL
  128239. "orrs r3, r3, r6\n\t"
  128240. #elif defined(__clang__)
  128241. "orrs r3, r6\n\t"
  128242. #else
  128243. "orr r3, r6\n\t"
  128244. #endif
  128245. "ldr r4, [%[a], #40]\n\t"
  128246. "str r3, [%[r], #48]\n\t"
  128247. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128248. "lsrs r6, r4, #1\n\t"
  128249. #else
  128250. "lsr r6, r4, #1\n\t"
  128251. #endif
  128252. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128253. "lsls r4, r4, %[n]\n\t"
  128254. #else
  128255. "lsl r4, r4, %[n]\n\t"
  128256. #endif
  128257. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128258. "lsrs r6, r6, r7\n\t"
  128259. #else
  128260. "lsr r6, r6, r7\n\t"
  128261. #endif
  128262. #ifdef WOLFSSL_KEIL
  128263. "orrs r5, r5, r6\n\t"
  128264. #elif defined(__clang__)
  128265. "orrs r5, r6\n\t"
  128266. #else
  128267. "orr r5, r6\n\t"
  128268. #endif
  128269. "ldr r3, [%[a], #36]\n\t"
  128270. "str r5, [%[r], #44]\n\t"
  128271. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128272. "lsrs r6, r3, #1\n\t"
  128273. #else
  128274. "lsr r6, r3, #1\n\t"
  128275. #endif
  128276. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128277. "lsls r3, r3, %[n]\n\t"
  128278. #else
  128279. "lsl r3, r3, %[n]\n\t"
  128280. #endif
  128281. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128282. "lsrs r6, r6, r7\n\t"
  128283. #else
  128284. "lsr r6, r6, r7\n\t"
  128285. #endif
  128286. #ifdef WOLFSSL_KEIL
  128287. "orrs r4, r4, r6\n\t"
  128288. #elif defined(__clang__)
  128289. "orrs r4, r6\n\t"
  128290. #else
  128291. "orr r4, r6\n\t"
  128292. #endif
  128293. "ldr r5, [%[a], #32]\n\t"
  128294. "str r4, [%[r], #40]\n\t"
  128295. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128296. "lsrs r6, r5, #1\n\t"
  128297. #else
  128298. "lsr r6, r5, #1\n\t"
  128299. #endif
  128300. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128301. "lsls r5, r5, %[n]\n\t"
  128302. #else
  128303. "lsl r5, r5, %[n]\n\t"
  128304. #endif
  128305. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128306. "lsrs r6, r6, r7\n\t"
  128307. #else
  128308. "lsr r6, r6, r7\n\t"
  128309. #endif
  128310. #ifdef WOLFSSL_KEIL
  128311. "orrs r3, r3, r6\n\t"
  128312. #elif defined(__clang__)
  128313. "orrs r3, r6\n\t"
  128314. #else
  128315. "orr r3, r6\n\t"
  128316. #endif
  128317. "ldr r4, [%[a], #28]\n\t"
  128318. "str r3, [%[r], #36]\n\t"
  128319. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128320. "lsrs r6, r4, #1\n\t"
  128321. #else
  128322. "lsr r6, r4, #1\n\t"
  128323. #endif
  128324. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128325. "lsls r4, r4, %[n]\n\t"
  128326. #else
  128327. "lsl r4, r4, %[n]\n\t"
  128328. #endif
  128329. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128330. "lsrs r6, r6, r7\n\t"
  128331. #else
  128332. "lsr r6, r6, r7\n\t"
  128333. #endif
  128334. #ifdef WOLFSSL_KEIL
  128335. "orrs r5, r5, r6\n\t"
  128336. #elif defined(__clang__)
  128337. "orrs r5, r6\n\t"
  128338. #else
  128339. "orr r5, r6\n\t"
  128340. #endif
  128341. "ldr r3, [%[a], #24]\n\t"
  128342. "str r5, [%[r], #32]\n\t"
  128343. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128344. "lsrs r6, r3, #1\n\t"
  128345. #else
  128346. "lsr r6, r3, #1\n\t"
  128347. #endif
  128348. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128349. "lsls r3, r3, %[n]\n\t"
  128350. #else
  128351. "lsl r3, r3, %[n]\n\t"
  128352. #endif
  128353. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128354. "lsrs r6, r6, r7\n\t"
  128355. #else
  128356. "lsr r6, r6, r7\n\t"
  128357. #endif
  128358. #ifdef WOLFSSL_KEIL
  128359. "orrs r4, r4, r6\n\t"
  128360. #elif defined(__clang__)
  128361. "orrs r4, r6\n\t"
  128362. #else
  128363. "orr r4, r6\n\t"
  128364. #endif
  128365. "ldr r5, [%[a], #20]\n\t"
  128366. "str r4, [%[r], #28]\n\t"
  128367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128368. "lsrs r6, r5, #1\n\t"
  128369. #else
  128370. "lsr r6, r5, #1\n\t"
  128371. #endif
  128372. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128373. "lsls r5, r5, %[n]\n\t"
  128374. #else
  128375. "lsl r5, r5, %[n]\n\t"
  128376. #endif
  128377. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128378. "lsrs r6, r6, r7\n\t"
  128379. #else
  128380. "lsr r6, r6, r7\n\t"
  128381. #endif
  128382. #ifdef WOLFSSL_KEIL
  128383. "orrs r3, r3, r6\n\t"
  128384. #elif defined(__clang__)
  128385. "orrs r3, r6\n\t"
  128386. #else
  128387. "orr r3, r6\n\t"
  128388. #endif
  128389. "ldr r4, [%[a], #16]\n\t"
  128390. "str r3, [%[r], #24]\n\t"
  128391. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128392. "lsrs r6, r4, #1\n\t"
  128393. #else
  128394. "lsr r6, r4, #1\n\t"
  128395. #endif
  128396. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128397. "lsls r4, r4, %[n]\n\t"
  128398. #else
  128399. "lsl r4, r4, %[n]\n\t"
  128400. #endif
  128401. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128402. "lsrs r6, r6, r7\n\t"
  128403. #else
  128404. "lsr r6, r6, r7\n\t"
  128405. #endif
  128406. #ifdef WOLFSSL_KEIL
  128407. "orrs r5, r5, r6\n\t"
  128408. #elif defined(__clang__)
  128409. "orrs r5, r6\n\t"
  128410. #else
  128411. "orr r5, r6\n\t"
  128412. #endif
  128413. "ldr r3, [%[a], #12]\n\t"
  128414. "str r5, [%[r], #20]\n\t"
  128415. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128416. "lsrs r6, r3, #1\n\t"
  128417. #else
  128418. "lsr r6, r3, #1\n\t"
  128419. #endif
  128420. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128421. "lsls r3, r3, %[n]\n\t"
  128422. #else
  128423. "lsl r3, r3, %[n]\n\t"
  128424. #endif
  128425. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128426. "lsrs r6, r6, r7\n\t"
  128427. #else
  128428. "lsr r6, r6, r7\n\t"
  128429. #endif
  128430. #ifdef WOLFSSL_KEIL
  128431. "orrs r4, r4, r6\n\t"
  128432. #elif defined(__clang__)
  128433. "orrs r4, r6\n\t"
  128434. #else
  128435. "orr r4, r6\n\t"
  128436. #endif
  128437. "ldr r5, [%[a], #8]\n\t"
  128438. "str r4, [%[r], #16]\n\t"
  128439. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128440. "lsrs r6, r5, #1\n\t"
  128441. #else
  128442. "lsr r6, r5, #1\n\t"
  128443. #endif
  128444. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128445. "lsls r5, r5, %[n]\n\t"
  128446. #else
  128447. "lsl r5, r5, %[n]\n\t"
  128448. #endif
  128449. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128450. "lsrs r6, r6, r7\n\t"
  128451. #else
  128452. "lsr r6, r6, r7\n\t"
  128453. #endif
  128454. #ifdef WOLFSSL_KEIL
  128455. "orrs r3, r3, r6\n\t"
  128456. #elif defined(__clang__)
  128457. "orrs r3, r6\n\t"
  128458. #else
  128459. "orr r3, r6\n\t"
  128460. #endif
  128461. "ldr r4, [%[a], #4]\n\t"
  128462. "str r3, [%[r], #12]\n\t"
  128463. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128464. "lsrs r6, r4, #1\n\t"
  128465. #else
  128466. "lsr r6, r4, #1\n\t"
  128467. #endif
  128468. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128469. "lsls r4, r4, %[n]\n\t"
  128470. #else
  128471. "lsl r4, r4, %[n]\n\t"
  128472. #endif
  128473. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128474. "lsrs r6, r6, r7\n\t"
  128475. #else
  128476. "lsr r6, r6, r7\n\t"
  128477. #endif
  128478. #ifdef WOLFSSL_KEIL
  128479. "orrs r5, r5, r6\n\t"
  128480. #elif defined(__clang__)
  128481. "orrs r5, r6\n\t"
  128482. #else
  128483. "orr r5, r6\n\t"
  128484. #endif
  128485. "ldr r3, [%[a]]\n\t"
  128486. "str r5, [%[r], #8]\n\t"
  128487. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128488. "lsrs r6, r3, #1\n\t"
  128489. #else
  128490. "lsr r6, r3, #1\n\t"
  128491. #endif
  128492. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128493. "lsls r3, r3, %[n]\n\t"
  128494. #else
  128495. "lsl r3, r3, %[n]\n\t"
  128496. #endif
  128497. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128498. "lsrs r6, r6, r7\n\t"
  128499. #else
  128500. "lsr r6, r6, r7\n\t"
  128501. #endif
  128502. #ifdef WOLFSSL_KEIL
  128503. "orrs r4, r4, r6\n\t"
  128504. #elif defined(__clang__)
  128505. "orrs r4, r6\n\t"
  128506. #else
  128507. "orr r4, r6\n\t"
  128508. #endif
  128509. "str r3, [%[r]]\n\t"
  128510. "str r4, [%[r], #4]\n\t"
  128511. : [r] "+l" (r), [a] "+l" (a), [n] "+l" (n)
  128512. :
  128513. : "memory", "r3", "r4", "r5", "r6", "r7"
  128514. );
  128515. }
  128516. /* Lefy shift a by n bits into r. (r = a << n)
  128517. *
  128518. * r A single precision integer.
  128519. * a A single precision integer.
  128520. * n Integer representing number of bits to shift.
  128521. */
  128522. static void sp_521_lshift_34(sp_digit* r, const sp_digit* a, byte n)
  128523. {
  128524. __asm__ __volatile__ (
  128525. "movs r7, #31\n\t"
  128526. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128527. "subs r7, r7, %[n]\n\t"
  128528. #else
  128529. "sub r7, r7, %[n]\n\t"
  128530. #endif
  128531. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128532. "adds %[a], %[a], #0x80\n\t"
  128533. #else
  128534. "add %[a], %[a], #0x80\n\t"
  128535. #endif
  128536. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128537. "adds %[r], %[r], #0x80\n\t"
  128538. #else
  128539. "add %[r], %[r], #0x80\n\t"
  128540. #endif
  128541. "ldr r4, [%[a], #4]\n\t"
  128542. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128543. "lsrs r5, r4, #1\n\t"
  128544. #else
  128545. "lsr r5, r4, #1\n\t"
  128546. #endif
  128547. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128548. "lsls r4, r4, %[n]\n\t"
  128549. #else
  128550. "lsl r4, r4, %[n]\n\t"
  128551. #endif
  128552. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128553. "lsrs r5, r5, r7\n\t"
  128554. #else
  128555. "lsr r5, r5, r7\n\t"
  128556. #endif
  128557. "ldr r3, [%[a]]\n\t"
  128558. "str r5, [%[r], #8]\n\t"
  128559. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128560. "lsrs r6, r3, #1\n\t"
  128561. #else
  128562. "lsr r6, r3, #1\n\t"
  128563. #endif
  128564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128565. "lsls r3, r3, %[n]\n\t"
  128566. #else
  128567. "lsl r3, r3, %[n]\n\t"
  128568. #endif
  128569. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128570. "lsrs r6, r6, r7\n\t"
  128571. #else
  128572. "lsr r6, r6, r7\n\t"
  128573. #endif
  128574. #ifdef WOLFSSL_KEIL
  128575. "orrs r4, r4, r6\n\t"
  128576. #elif defined(__clang__)
  128577. "orrs r4, r6\n\t"
  128578. #else
  128579. "orr r4, r6\n\t"
  128580. #endif
  128581. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128582. "subs %[a], %[a], #0x40\n\t"
  128583. #else
  128584. "sub %[a], %[a], #0x40\n\t"
  128585. #endif
  128586. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128587. "subs %[r], %[r], #0x40\n\t"
  128588. #else
  128589. "sub %[r], %[r], #0x40\n\t"
  128590. #endif
  128591. "ldr r5, [%[a], #60]\n\t"
  128592. "str r4, [%[r], #68]\n\t"
  128593. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128594. "lsrs r6, r5, #1\n\t"
  128595. #else
  128596. "lsr r6, r5, #1\n\t"
  128597. #endif
  128598. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128599. "lsls r5, r5, %[n]\n\t"
  128600. #else
  128601. "lsl r5, r5, %[n]\n\t"
  128602. #endif
  128603. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128604. "lsrs r6, r6, r7\n\t"
  128605. #else
  128606. "lsr r6, r6, r7\n\t"
  128607. #endif
  128608. #ifdef WOLFSSL_KEIL
  128609. "orrs r3, r3, r6\n\t"
  128610. #elif defined(__clang__)
  128611. "orrs r3, r6\n\t"
  128612. #else
  128613. "orr r3, r6\n\t"
  128614. #endif
  128615. "ldr r4, [%[a], #56]\n\t"
  128616. "str r3, [%[r], #64]\n\t"
  128617. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128618. "lsrs r6, r4, #1\n\t"
  128619. #else
  128620. "lsr r6, r4, #1\n\t"
  128621. #endif
  128622. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128623. "lsls r4, r4, %[n]\n\t"
  128624. #else
  128625. "lsl r4, r4, %[n]\n\t"
  128626. #endif
  128627. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128628. "lsrs r6, r6, r7\n\t"
  128629. #else
  128630. "lsr r6, r6, r7\n\t"
  128631. #endif
  128632. #ifdef WOLFSSL_KEIL
  128633. "orrs r5, r5, r6\n\t"
  128634. #elif defined(__clang__)
  128635. "orrs r5, r6\n\t"
  128636. #else
  128637. "orr r5, r6\n\t"
  128638. #endif
  128639. "ldr r3, [%[a], #52]\n\t"
  128640. "str r5, [%[r], #60]\n\t"
  128641. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128642. "lsrs r6, r3, #1\n\t"
  128643. #else
  128644. "lsr r6, r3, #1\n\t"
  128645. #endif
  128646. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128647. "lsls r3, r3, %[n]\n\t"
  128648. #else
  128649. "lsl r3, r3, %[n]\n\t"
  128650. #endif
  128651. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128652. "lsrs r6, r6, r7\n\t"
  128653. #else
  128654. "lsr r6, r6, r7\n\t"
  128655. #endif
  128656. #ifdef WOLFSSL_KEIL
  128657. "orrs r4, r4, r6\n\t"
  128658. #elif defined(__clang__)
  128659. "orrs r4, r6\n\t"
  128660. #else
  128661. "orr r4, r6\n\t"
  128662. #endif
  128663. "ldr r5, [%[a], #48]\n\t"
  128664. "str r4, [%[r], #56]\n\t"
  128665. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128666. "lsrs r6, r5, #1\n\t"
  128667. #else
  128668. "lsr r6, r5, #1\n\t"
  128669. #endif
  128670. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128671. "lsls r5, r5, %[n]\n\t"
  128672. #else
  128673. "lsl r5, r5, %[n]\n\t"
  128674. #endif
  128675. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128676. "lsrs r6, r6, r7\n\t"
  128677. #else
  128678. "lsr r6, r6, r7\n\t"
  128679. #endif
  128680. #ifdef WOLFSSL_KEIL
  128681. "orrs r3, r3, r6\n\t"
  128682. #elif defined(__clang__)
  128683. "orrs r3, r6\n\t"
  128684. #else
  128685. "orr r3, r6\n\t"
  128686. #endif
  128687. "ldr r4, [%[a], #44]\n\t"
  128688. "str r3, [%[r], #52]\n\t"
  128689. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128690. "lsrs r6, r4, #1\n\t"
  128691. #else
  128692. "lsr r6, r4, #1\n\t"
  128693. #endif
  128694. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128695. "lsls r4, r4, %[n]\n\t"
  128696. #else
  128697. "lsl r4, r4, %[n]\n\t"
  128698. #endif
  128699. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128700. "lsrs r6, r6, r7\n\t"
  128701. #else
  128702. "lsr r6, r6, r7\n\t"
  128703. #endif
  128704. #ifdef WOLFSSL_KEIL
  128705. "orrs r5, r5, r6\n\t"
  128706. #elif defined(__clang__)
  128707. "orrs r5, r6\n\t"
  128708. #else
  128709. "orr r5, r6\n\t"
  128710. #endif
  128711. "ldr r3, [%[a], #40]\n\t"
  128712. "str r5, [%[r], #48]\n\t"
  128713. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128714. "lsrs r6, r3, #1\n\t"
  128715. #else
  128716. "lsr r6, r3, #1\n\t"
  128717. #endif
  128718. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128719. "lsls r3, r3, %[n]\n\t"
  128720. #else
  128721. "lsl r3, r3, %[n]\n\t"
  128722. #endif
  128723. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128724. "lsrs r6, r6, r7\n\t"
  128725. #else
  128726. "lsr r6, r6, r7\n\t"
  128727. #endif
  128728. #ifdef WOLFSSL_KEIL
  128729. "orrs r4, r4, r6\n\t"
  128730. #elif defined(__clang__)
  128731. "orrs r4, r6\n\t"
  128732. #else
  128733. "orr r4, r6\n\t"
  128734. #endif
  128735. "ldr r5, [%[a], #36]\n\t"
  128736. "str r4, [%[r], #44]\n\t"
  128737. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128738. "lsrs r6, r5, #1\n\t"
  128739. #else
  128740. "lsr r6, r5, #1\n\t"
  128741. #endif
  128742. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128743. "lsls r5, r5, %[n]\n\t"
  128744. #else
  128745. "lsl r5, r5, %[n]\n\t"
  128746. #endif
  128747. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128748. "lsrs r6, r6, r7\n\t"
  128749. #else
  128750. "lsr r6, r6, r7\n\t"
  128751. #endif
  128752. #ifdef WOLFSSL_KEIL
  128753. "orrs r3, r3, r6\n\t"
  128754. #elif defined(__clang__)
  128755. "orrs r3, r6\n\t"
  128756. #else
  128757. "orr r3, r6\n\t"
  128758. #endif
  128759. "ldr r4, [%[a], #32]\n\t"
  128760. "str r3, [%[r], #40]\n\t"
  128761. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128762. "lsrs r6, r4, #1\n\t"
  128763. #else
  128764. "lsr r6, r4, #1\n\t"
  128765. #endif
  128766. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128767. "lsls r4, r4, %[n]\n\t"
  128768. #else
  128769. "lsl r4, r4, %[n]\n\t"
  128770. #endif
  128771. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128772. "lsrs r6, r6, r7\n\t"
  128773. #else
  128774. "lsr r6, r6, r7\n\t"
  128775. #endif
  128776. #ifdef WOLFSSL_KEIL
  128777. "orrs r5, r5, r6\n\t"
  128778. #elif defined(__clang__)
  128779. "orrs r5, r6\n\t"
  128780. #else
  128781. "orr r5, r6\n\t"
  128782. #endif
  128783. "ldr r3, [%[a], #28]\n\t"
  128784. "str r5, [%[r], #36]\n\t"
  128785. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128786. "lsrs r6, r3, #1\n\t"
  128787. #else
  128788. "lsr r6, r3, #1\n\t"
  128789. #endif
  128790. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128791. "lsls r3, r3, %[n]\n\t"
  128792. #else
  128793. "lsl r3, r3, %[n]\n\t"
  128794. #endif
  128795. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128796. "lsrs r6, r6, r7\n\t"
  128797. #else
  128798. "lsr r6, r6, r7\n\t"
  128799. #endif
  128800. #ifdef WOLFSSL_KEIL
  128801. "orrs r4, r4, r6\n\t"
  128802. #elif defined(__clang__)
  128803. "orrs r4, r6\n\t"
  128804. #else
  128805. "orr r4, r6\n\t"
  128806. #endif
  128807. "ldr r5, [%[a], #24]\n\t"
  128808. "str r4, [%[r], #32]\n\t"
  128809. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128810. "lsrs r6, r5, #1\n\t"
  128811. #else
  128812. "lsr r6, r5, #1\n\t"
  128813. #endif
  128814. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128815. "lsls r5, r5, %[n]\n\t"
  128816. #else
  128817. "lsl r5, r5, %[n]\n\t"
  128818. #endif
  128819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128820. "lsrs r6, r6, r7\n\t"
  128821. #else
  128822. "lsr r6, r6, r7\n\t"
  128823. #endif
  128824. #ifdef WOLFSSL_KEIL
  128825. "orrs r3, r3, r6\n\t"
  128826. #elif defined(__clang__)
  128827. "orrs r3, r6\n\t"
  128828. #else
  128829. "orr r3, r6\n\t"
  128830. #endif
  128831. "ldr r4, [%[a], #20]\n\t"
  128832. "str r3, [%[r], #28]\n\t"
  128833. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128834. "lsrs r6, r4, #1\n\t"
  128835. #else
  128836. "lsr r6, r4, #1\n\t"
  128837. #endif
  128838. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128839. "lsls r4, r4, %[n]\n\t"
  128840. #else
  128841. "lsl r4, r4, %[n]\n\t"
  128842. #endif
  128843. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128844. "lsrs r6, r6, r7\n\t"
  128845. #else
  128846. "lsr r6, r6, r7\n\t"
  128847. #endif
  128848. #ifdef WOLFSSL_KEIL
  128849. "orrs r5, r5, r6\n\t"
  128850. #elif defined(__clang__)
  128851. "orrs r5, r6\n\t"
  128852. #else
  128853. "orr r5, r6\n\t"
  128854. #endif
  128855. "ldr r3, [%[a], #16]\n\t"
  128856. "str r5, [%[r], #24]\n\t"
  128857. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128858. "lsrs r6, r3, #1\n\t"
  128859. #else
  128860. "lsr r6, r3, #1\n\t"
  128861. #endif
  128862. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128863. "lsls r3, r3, %[n]\n\t"
  128864. #else
  128865. "lsl r3, r3, %[n]\n\t"
  128866. #endif
  128867. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128868. "lsrs r6, r6, r7\n\t"
  128869. #else
  128870. "lsr r6, r6, r7\n\t"
  128871. #endif
  128872. #ifdef WOLFSSL_KEIL
  128873. "orrs r4, r4, r6\n\t"
  128874. #elif defined(__clang__)
  128875. "orrs r4, r6\n\t"
  128876. #else
  128877. "orr r4, r6\n\t"
  128878. #endif
  128879. "ldr r5, [%[a], #12]\n\t"
  128880. "str r4, [%[r], #20]\n\t"
  128881. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128882. "lsrs r6, r5, #1\n\t"
  128883. #else
  128884. "lsr r6, r5, #1\n\t"
  128885. #endif
  128886. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128887. "lsls r5, r5, %[n]\n\t"
  128888. #else
  128889. "lsl r5, r5, %[n]\n\t"
  128890. #endif
  128891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128892. "lsrs r6, r6, r7\n\t"
  128893. #else
  128894. "lsr r6, r6, r7\n\t"
  128895. #endif
  128896. #ifdef WOLFSSL_KEIL
  128897. "orrs r3, r3, r6\n\t"
  128898. #elif defined(__clang__)
  128899. "orrs r3, r6\n\t"
  128900. #else
  128901. "orr r3, r6\n\t"
  128902. #endif
  128903. "ldr r4, [%[a], #8]\n\t"
  128904. "str r3, [%[r], #16]\n\t"
  128905. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128906. "lsrs r6, r4, #1\n\t"
  128907. #else
  128908. "lsr r6, r4, #1\n\t"
  128909. #endif
  128910. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128911. "lsls r4, r4, %[n]\n\t"
  128912. #else
  128913. "lsl r4, r4, %[n]\n\t"
  128914. #endif
  128915. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128916. "lsrs r6, r6, r7\n\t"
  128917. #else
  128918. "lsr r6, r6, r7\n\t"
  128919. #endif
  128920. #ifdef WOLFSSL_KEIL
  128921. "orrs r5, r5, r6\n\t"
  128922. #elif defined(__clang__)
  128923. "orrs r5, r6\n\t"
  128924. #else
  128925. "orr r5, r6\n\t"
  128926. #endif
  128927. "ldr r3, [%[a], #4]\n\t"
  128928. "str r5, [%[r], #12]\n\t"
  128929. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128930. "lsrs r6, r3, #1\n\t"
  128931. #else
  128932. "lsr r6, r3, #1\n\t"
  128933. #endif
  128934. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128935. "lsls r3, r3, %[n]\n\t"
  128936. #else
  128937. "lsl r3, r3, %[n]\n\t"
  128938. #endif
  128939. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128940. "lsrs r6, r6, r7\n\t"
  128941. #else
  128942. "lsr r6, r6, r7\n\t"
  128943. #endif
  128944. #ifdef WOLFSSL_KEIL
  128945. "orrs r4, r4, r6\n\t"
  128946. #elif defined(__clang__)
  128947. "orrs r4, r6\n\t"
  128948. #else
  128949. "orr r4, r6\n\t"
  128950. #endif
  128951. "ldr r5, [%[a]]\n\t"
  128952. "str r4, [%[r], #8]\n\t"
  128953. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128954. "lsrs r6, r5, #1\n\t"
  128955. #else
  128956. "lsr r6, r5, #1\n\t"
  128957. #endif
  128958. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128959. "lsls r5, r5, %[n]\n\t"
  128960. #else
  128961. "lsl r5, r5, %[n]\n\t"
  128962. #endif
  128963. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128964. "lsrs r6, r6, r7\n\t"
  128965. #else
  128966. "lsr r6, r6, r7\n\t"
  128967. #endif
  128968. #ifdef WOLFSSL_KEIL
  128969. "orrs r3, r3, r6\n\t"
  128970. #elif defined(__clang__)
  128971. "orrs r3, r6\n\t"
  128972. #else
  128973. "orr r3, r6\n\t"
  128974. #endif
  128975. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128976. "subs %[a], %[a], #0x40\n\t"
  128977. #else
  128978. "sub %[a], %[a], #0x40\n\t"
  128979. #endif
  128980. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128981. "subs %[r], %[r], #0x40\n\t"
  128982. #else
  128983. "sub %[r], %[r], #0x40\n\t"
  128984. #endif
  128985. "ldr r4, [%[a], #60]\n\t"
  128986. "str r3, [%[r], #68]\n\t"
  128987. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128988. "lsrs r6, r4, #1\n\t"
  128989. #else
  128990. "lsr r6, r4, #1\n\t"
  128991. #endif
  128992. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128993. "lsls r4, r4, %[n]\n\t"
  128994. #else
  128995. "lsl r4, r4, %[n]\n\t"
  128996. #endif
  128997. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128998. "lsrs r6, r6, r7\n\t"
  128999. #else
  129000. "lsr r6, r6, r7\n\t"
  129001. #endif
  129002. #ifdef WOLFSSL_KEIL
  129003. "orrs r5, r5, r6\n\t"
  129004. #elif defined(__clang__)
  129005. "orrs r5, r6\n\t"
  129006. #else
  129007. "orr r5, r6\n\t"
  129008. #endif
  129009. "ldr r3, [%[a], #56]\n\t"
  129010. "str r5, [%[r], #64]\n\t"
  129011. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129012. "lsrs r6, r3, #1\n\t"
  129013. #else
  129014. "lsr r6, r3, #1\n\t"
  129015. #endif
  129016. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129017. "lsls r3, r3, %[n]\n\t"
  129018. #else
  129019. "lsl r3, r3, %[n]\n\t"
  129020. #endif
  129021. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129022. "lsrs r6, r6, r7\n\t"
  129023. #else
  129024. "lsr r6, r6, r7\n\t"
  129025. #endif
  129026. #ifdef WOLFSSL_KEIL
  129027. "orrs r4, r4, r6\n\t"
  129028. #elif defined(__clang__)
  129029. "orrs r4, r6\n\t"
  129030. #else
  129031. "orr r4, r6\n\t"
  129032. #endif
  129033. "ldr r5, [%[a], #52]\n\t"
  129034. "str r4, [%[r], #60]\n\t"
  129035. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129036. "lsrs r6, r5, #1\n\t"
  129037. #else
  129038. "lsr r6, r5, #1\n\t"
  129039. #endif
  129040. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129041. "lsls r5, r5, %[n]\n\t"
  129042. #else
  129043. "lsl r5, r5, %[n]\n\t"
  129044. #endif
  129045. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129046. "lsrs r6, r6, r7\n\t"
  129047. #else
  129048. "lsr r6, r6, r7\n\t"
  129049. #endif
  129050. #ifdef WOLFSSL_KEIL
  129051. "orrs r3, r3, r6\n\t"
  129052. #elif defined(__clang__)
  129053. "orrs r3, r6\n\t"
  129054. #else
  129055. "orr r3, r6\n\t"
  129056. #endif
  129057. "ldr r4, [%[a], #48]\n\t"
  129058. "str r3, [%[r], #56]\n\t"
  129059. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129060. "lsrs r6, r4, #1\n\t"
  129061. #else
  129062. "lsr r6, r4, #1\n\t"
  129063. #endif
  129064. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129065. "lsls r4, r4, %[n]\n\t"
  129066. #else
  129067. "lsl r4, r4, %[n]\n\t"
  129068. #endif
  129069. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129070. "lsrs r6, r6, r7\n\t"
  129071. #else
  129072. "lsr r6, r6, r7\n\t"
  129073. #endif
  129074. #ifdef WOLFSSL_KEIL
  129075. "orrs r5, r5, r6\n\t"
  129076. #elif defined(__clang__)
  129077. "orrs r5, r6\n\t"
  129078. #else
  129079. "orr r5, r6\n\t"
  129080. #endif
  129081. "ldr r3, [%[a], #44]\n\t"
  129082. "str r5, [%[r], #52]\n\t"
  129083. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129084. "lsrs r6, r3, #1\n\t"
  129085. #else
  129086. "lsr r6, r3, #1\n\t"
  129087. #endif
  129088. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129089. "lsls r3, r3, %[n]\n\t"
  129090. #else
  129091. "lsl r3, r3, %[n]\n\t"
  129092. #endif
  129093. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129094. "lsrs r6, r6, r7\n\t"
  129095. #else
  129096. "lsr r6, r6, r7\n\t"
  129097. #endif
  129098. #ifdef WOLFSSL_KEIL
  129099. "orrs r4, r4, r6\n\t"
  129100. #elif defined(__clang__)
  129101. "orrs r4, r6\n\t"
  129102. #else
  129103. "orr r4, r6\n\t"
  129104. #endif
  129105. "ldr r5, [%[a], #40]\n\t"
  129106. "str r4, [%[r], #48]\n\t"
  129107. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129108. "lsrs r6, r5, #1\n\t"
  129109. #else
  129110. "lsr r6, r5, #1\n\t"
  129111. #endif
  129112. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129113. "lsls r5, r5, %[n]\n\t"
  129114. #else
  129115. "lsl r5, r5, %[n]\n\t"
  129116. #endif
  129117. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129118. "lsrs r6, r6, r7\n\t"
  129119. #else
  129120. "lsr r6, r6, r7\n\t"
  129121. #endif
  129122. #ifdef WOLFSSL_KEIL
  129123. "orrs r3, r3, r6\n\t"
  129124. #elif defined(__clang__)
  129125. "orrs r3, r6\n\t"
  129126. #else
  129127. "orr r3, r6\n\t"
  129128. #endif
  129129. "ldr r4, [%[a], #36]\n\t"
  129130. "str r3, [%[r], #44]\n\t"
  129131. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129132. "lsrs r6, r4, #1\n\t"
  129133. #else
  129134. "lsr r6, r4, #1\n\t"
  129135. #endif
  129136. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129137. "lsls r4, r4, %[n]\n\t"
  129138. #else
  129139. "lsl r4, r4, %[n]\n\t"
  129140. #endif
  129141. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129142. "lsrs r6, r6, r7\n\t"
  129143. #else
  129144. "lsr r6, r6, r7\n\t"
  129145. #endif
  129146. #ifdef WOLFSSL_KEIL
  129147. "orrs r5, r5, r6\n\t"
  129148. #elif defined(__clang__)
  129149. "orrs r5, r6\n\t"
  129150. #else
  129151. "orr r5, r6\n\t"
  129152. #endif
  129153. "ldr r3, [%[a], #32]\n\t"
  129154. "str r5, [%[r], #40]\n\t"
  129155. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129156. "lsrs r6, r3, #1\n\t"
  129157. #else
  129158. "lsr r6, r3, #1\n\t"
  129159. #endif
  129160. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129161. "lsls r3, r3, %[n]\n\t"
  129162. #else
  129163. "lsl r3, r3, %[n]\n\t"
  129164. #endif
  129165. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129166. "lsrs r6, r6, r7\n\t"
  129167. #else
  129168. "lsr r6, r6, r7\n\t"
  129169. #endif
  129170. #ifdef WOLFSSL_KEIL
  129171. "orrs r4, r4, r6\n\t"
  129172. #elif defined(__clang__)
  129173. "orrs r4, r6\n\t"
  129174. #else
  129175. "orr r4, r6\n\t"
  129176. #endif
  129177. "ldr r5, [%[a], #28]\n\t"
  129178. "str r4, [%[r], #36]\n\t"
  129179. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129180. "lsrs r6, r5, #1\n\t"
  129181. #else
  129182. "lsr r6, r5, #1\n\t"
  129183. #endif
  129184. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129185. "lsls r5, r5, %[n]\n\t"
  129186. #else
  129187. "lsl r5, r5, %[n]\n\t"
  129188. #endif
  129189. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129190. "lsrs r6, r6, r7\n\t"
  129191. #else
  129192. "lsr r6, r6, r7\n\t"
  129193. #endif
  129194. #ifdef WOLFSSL_KEIL
  129195. "orrs r3, r3, r6\n\t"
  129196. #elif defined(__clang__)
  129197. "orrs r3, r6\n\t"
  129198. #else
  129199. "orr r3, r6\n\t"
  129200. #endif
  129201. "ldr r4, [%[a], #24]\n\t"
  129202. "str r3, [%[r], #32]\n\t"
  129203. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129204. "lsrs r6, r4, #1\n\t"
  129205. #else
  129206. "lsr r6, r4, #1\n\t"
  129207. #endif
  129208. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129209. "lsls r4, r4, %[n]\n\t"
  129210. #else
  129211. "lsl r4, r4, %[n]\n\t"
  129212. #endif
  129213. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129214. "lsrs r6, r6, r7\n\t"
  129215. #else
  129216. "lsr r6, r6, r7\n\t"
  129217. #endif
  129218. #ifdef WOLFSSL_KEIL
  129219. "orrs r5, r5, r6\n\t"
  129220. #elif defined(__clang__)
  129221. "orrs r5, r6\n\t"
  129222. #else
  129223. "orr r5, r6\n\t"
  129224. #endif
  129225. "ldr r3, [%[a], #20]\n\t"
  129226. "str r5, [%[r], #28]\n\t"
  129227. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129228. "lsrs r6, r3, #1\n\t"
  129229. #else
  129230. "lsr r6, r3, #1\n\t"
  129231. #endif
  129232. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129233. "lsls r3, r3, %[n]\n\t"
  129234. #else
  129235. "lsl r3, r3, %[n]\n\t"
  129236. #endif
  129237. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129238. "lsrs r6, r6, r7\n\t"
  129239. #else
  129240. "lsr r6, r6, r7\n\t"
  129241. #endif
  129242. #ifdef WOLFSSL_KEIL
  129243. "orrs r4, r4, r6\n\t"
  129244. #elif defined(__clang__)
  129245. "orrs r4, r6\n\t"
  129246. #else
  129247. "orr r4, r6\n\t"
  129248. #endif
  129249. "ldr r5, [%[a], #16]\n\t"
  129250. "str r4, [%[r], #24]\n\t"
  129251. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129252. "lsrs r6, r5, #1\n\t"
  129253. #else
  129254. "lsr r6, r5, #1\n\t"
  129255. #endif
  129256. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129257. "lsls r5, r5, %[n]\n\t"
  129258. #else
  129259. "lsl r5, r5, %[n]\n\t"
  129260. #endif
  129261. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129262. "lsrs r6, r6, r7\n\t"
  129263. #else
  129264. "lsr r6, r6, r7\n\t"
  129265. #endif
  129266. #ifdef WOLFSSL_KEIL
  129267. "orrs r3, r3, r6\n\t"
  129268. #elif defined(__clang__)
  129269. "orrs r3, r6\n\t"
  129270. #else
  129271. "orr r3, r6\n\t"
  129272. #endif
  129273. "ldr r4, [%[a], #12]\n\t"
  129274. "str r3, [%[r], #20]\n\t"
  129275. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129276. "lsrs r6, r4, #1\n\t"
  129277. #else
  129278. "lsr r6, r4, #1\n\t"
  129279. #endif
  129280. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129281. "lsls r4, r4, %[n]\n\t"
  129282. #else
  129283. "lsl r4, r4, %[n]\n\t"
  129284. #endif
  129285. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129286. "lsrs r6, r6, r7\n\t"
  129287. #else
  129288. "lsr r6, r6, r7\n\t"
  129289. #endif
  129290. #ifdef WOLFSSL_KEIL
  129291. "orrs r5, r5, r6\n\t"
  129292. #elif defined(__clang__)
  129293. "orrs r5, r6\n\t"
  129294. #else
  129295. "orr r5, r6\n\t"
  129296. #endif
  129297. "ldr r3, [%[a], #8]\n\t"
  129298. "str r5, [%[r], #16]\n\t"
  129299. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129300. "lsrs r6, r3, #1\n\t"
  129301. #else
  129302. "lsr r6, r3, #1\n\t"
  129303. #endif
  129304. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129305. "lsls r3, r3, %[n]\n\t"
  129306. #else
  129307. "lsl r3, r3, %[n]\n\t"
  129308. #endif
  129309. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129310. "lsrs r6, r6, r7\n\t"
  129311. #else
  129312. "lsr r6, r6, r7\n\t"
  129313. #endif
  129314. #ifdef WOLFSSL_KEIL
  129315. "orrs r4, r4, r6\n\t"
  129316. #elif defined(__clang__)
  129317. "orrs r4, r6\n\t"
  129318. #else
  129319. "orr r4, r6\n\t"
  129320. #endif
  129321. "ldr r5, [%[a], #4]\n\t"
  129322. "str r4, [%[r], #12]\n\t"
  129323. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129324. "lsrs r6, r5, #1\n\t"
  129325. #else
  129326. "lsr r6, r5, #1\n\t"
  129327. #endif
  129328. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129329. "lsls r5, r5, %[n]\n\t"
  129330. #else
  129331. "lsl r5, r5, %[n]\n\t"
  129332. #endif
  129333. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129334. "lsrs r6, r6, r7\n\t"
  129335. #else
  129336. "lsr r6, r6, r7\n\t"
  129337. #endif
  129338. #ifdef WOLFSSL_KEIL
  129339. "orrs r3, r3, r6\n\t"
  129340. #elif defined(__clang__)
  129341. "orrs r3, r6\n\t"
  129342. #else
  129343. "orr r3, r6\n\t"
  129344. #endif
  129345. "ldr r4, [%[a]]\n\t"
  129346. "str r3, [%[r], #8]\n\t"
  129347. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129348. "lsrs r6, r4, #1\n\t"
  129349. #else
  129350. "lsr r6, r4, #1\n\t"
  129351. #endif
  129352. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129353. "lsls r4, r4, %[n]\n\t"
  129354. #else
  129355. "lsl r4, r4, %[n]\n\t"
  129356. #endif
  129357. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129358. "lsrs r6, r6, r7\n\t"
  129359. #else
  129360. "lsr r6, r6, r7\n\t"
  129361. #endif
  129362. #ifdef WOLFSSL_KEIL
  129363. "orrs r5, r5, r6\n\t"
  129364. #elif defined(__clang__)
  129365. "orrs r5, r6\n\t"
  129366. #else
  129367. "orr r5, r6\n\t"
  129368. #endif
  129369. "str r4, [%[r]]\n\t"
  129370. "str r5, [%[r], #4]\n\t"
  129371. : [r] "+l" (r), [a] "+l" (a), [n] "+l" (n)
  129372. :
  129373. : "memory", "r3", "r4", "r5", "r6", "r7"
  129374. );
  129375. }
  129376. #ifdef WOLFSSL_SP_SMALL
  129377. /* Sub b from a into a. (a -= b)
  129378. *
  129379. * a A single precision integer.
  129380. * b A single precision integer.
  129381. */
  129382. SP_NOINLINE static sp_digit sp_521_sub_in_place_17(sp_digit* a,
  129383. const sp_digit* b)
  129384. {
  129385. __asm__ __volatile__ (
  129386. "movs r7, %[a]\n\t"
  129387. "movs r2, #0\n\t"
  129388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129389. "adds r7, r7, #0x40\n\t"
  129390. #else
  129391. "add r7, r7, #0x40\n\t"
  129392. #endif
  129393. "\n"
  129394. "L_sp_521_sub_in_place_17_words_%=:\n\t"
  129395. "movs r5, #0\n\t"
  129396. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129397. "subs r5, r5, r2\n\t"
  129398. #else
  129399. "sub r5, r5, r2\n\t"
  129400. #endif
  129401. "ldr r3, [%[a]]\n\t"
  129402. "ldr r4, [%[a], #4]\n\t"
  129403. "ldr r5, [%[b]]\n\t"
  129404. "ldr r6, [%[b], #4]\n\t"
  129405. #ifdef WOLFSSL_KEIL
  129406. "sbcs r3, r3, r5\n\t"
  129407. #elif defined(__clang__)
  129408. "sbcs r3, r5\n\t"
  129409. #else
  129410. "sbc r3, r5\n\t"
  129411. #endif
  129412. #ifdef WOLFSSL_KEIL
  129413. "sbcs r4, r4, r6\n\t"
  129414. #elif defined(__clang__)
  129415. "sbcs r4, r6\n\t"
  129416. #else
  129417. "sbc r4, r6\n\t"
  129418. #endif
  129419. "str r3, [%[a]]\n\t"
  129420. "str r4, [%[a], #4]\n\t"
  129421. #ifdef WOLFSSL_KEIL
  129422. "sbcs r2, r2, r2\n\t"
  129423. #elif defined(__clang__)
  129424. "sbcs r2, r2\n\t"
  129425. #else
  129426. "sbc r2, r2\n\t"
  129427. #endif
  129428. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129429. "adds %[a], %[a], #8\n\t"
  129430. #else
  129431. "add %[a], %[a], #8\n\t"
  129432. #endif
  129433. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129434. "adds %[b], %[b], #8\n\t"
  129435. #else
  129436. "add %[b], %[b], #8\n\t"
  129437. #endif
  129438. "cmp %[a], r7\n\t"
  129439. "bne L_sp_521_sub_in_place_17_words_%=\n\t"
  129440. "movs %[a], r2\n\t"
  129441. : [a] "+l" (a), [b] "+l" (b)
  129442. :
  129443. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  129444. );
  129445. return (uint32_t)(size_t)a;
  129446. }
  129447. #else
  129448. /* Sub b from a into a. (a -= b)
  129449. *
  129450. * a A single precision integer.
  129451. * b A single precision integer.
  129452. */
  129453. SP_NOINLINE static sp_digit sp_521_sub_in_place_17(sp_digit* a,
  129454. const sp_digit* b)
  129455. {
  129456. __asm__ __volatile__ (
  129457. "ldm %[b]!, {r4, r5}\n\t"
  129458. "ldr r2, [%[a]]\n\t"
  129459. "ldr r3, [%[a], #4]\n\t"
  129460. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129461. "subs r2, r2, r4\n\t"
  129462. #else
  129463. "sub r2, r2, r4\n\t"
  129464. #endif
  129465. #ifdef WOLFSSL_KEIL
  129466. "sbcs r3, r3, r5\n\t"
  129467. #elif defined(__clang__)
  129468. "sbcs r3, r5\n\t"
  129469. #else
  129470. "sbc r3, r5\n\t"
  129471. #endif
  129472. "stm %[a]!, {r2, r3}\n\t"
  129473. "ldm %[b]!, {r4, r5}\n\t"
  129474. "ldr r2, [%[a]]\n\t"
  129475. "ldr r3, [%[a], #4]\n\t"
  129476. #ifdef WOLFSSL_KEIL
  129477. "sbcs r2, r2, r4\n\t"
  129478. #elif defined(__clang__)
  129479. "sbcs r2, r4\n\t"
  129480. #else
  129481. "sbc r2, r4\n\t"
  129482. #endif
  129483. #ifdef WOLFSSL_KEIL
  129484. "sbcs r3, r3, r5\n\t"
  129485. #elif defined(__clang__)
  129486. "sbcs r3, r5\n\t"
  129487. #else
  129488. "sbc r3, r5\n\t"
  129489. #endif
  129490. "stm %[a]!, {r2, r3}\n\t"
  129491. "ldm %[b]!, {r4, r5}\n\t"
  129492. "ldr r2, [%[a]]\n\t"
  129493. "ldr r3, [%[a], #4]\n\t"
  129494. #ifdef WOLFSSL_KEIL
  129495. "sbcs r2, r2, r4\n\t"
  129496. #elif defined(__clang__)
  129497. "sbcs r2, r4\n\t"
  129498. #else
  129499. "sbc r2, r4\n\t"
  129500. #endif
  129501. #ifdef WOLFSSL_KEIL
  129502. "sbcs r3, r3, r5\n\t"
  129503. #elif defined(__clang__)
  129504. "sbcs r3, r5\n\t"
  129505. #else
  129506. "sbc r3, r5\n\t"
  129507. #endif
  129508. "stm %[a]!, {r2, r3}\n\t"
  129509. "ldm %[b]!, {r4, r5}\n\t"
  129510. "ldr r2, [%[a]]\n\t"
  129511. "ldr r3, [%[a], #4]\n\t"
  129512. #ifdef WOLFSSL_KEIL
  129513. "sbcs r2, r2, r4\n\t"
  129514. #elif defined(__clang__)
  129515. "sbcs r2, r4\n\t"
  129516. #else
  129517. "sbc r2, r4\n\t"
  129518. #endif
  129519. #ifdef WOLFSSL_KEIL
  129520. "sbcs r3, r3, r5\n\t"
  129521. #elif defined(__clang__)
  129522. "sbcs r3, r5\n\t"
  129523. #else
  129524. "sbc r3, r5\n\t"
  129525. #endif
  129526. "stm %[a]!, {r2, r3}\n\t"
  129527. "ldm %[b]!, {r4, r5}\n\t"
  129528. "ldr r2, [%[a]]\n\t"
  129529. "ldr r3, [%[a], #4]\n\t"
  129530. #ifdef WOLFSSL_KEIL
  129531. "sbcs r2, r2, r4\n\t"
  129532. #elif defined(__clang__)
  129533. "sbcs r2, r4\n\t"
  129534. #else
  129535. "sbc r2, r4\n\t"
  129536. #endif
  129537. #ifdef WOLFSSL_KEIL
  129538. "sbcs r3, r3, r5\n\t"
  129539. #elif defined(__clang__)
  129540. "sbcs r3, r5\n\t"
  129541. #else
  129542. "sbc r3, r5\n\t"
  129543. #endif
  129544. "stm %[a]!, {r2, r3}\n\t"
  129545. "ldm %[b]!, {r4, r5}\n\t"
  129546. "ldr r2, [%[a]]\n\t"
  129547. "ldr r3, [%[a], #4]\n\t"
  129548. #ifdef WOLFSSL_KEIL
  129549. "sbcs r2, r2, r4\n\t"
  129550. #elif defined(__clang__)
  129551. "sbcs r2, r4\n\t"
  129552. #else
  129553. "sbc r2, r4\n\t"
  129554. #endif
  129555. #ifdef WOLFSSL_KEIL
  129556. "sbcs r3, r3, r5\n\t"
  129557. #elif defined(__clang__)
  129558. "sbcs r3, r5\n\t"
  129559. #else
  129560. "sbc r3, r5\n\t"
  129561. #endif
  129562. "stm %[a]!, {r2, r3}\n\t"
  129563. "ldm %[b]!, {r4, r5}\n\t"
  129564. "ldr r2, [%[a]]\n\t"
  129565. "ldr r3, [%[a], #4]\n\t"
  129566. #ifdef WOLFSSL_KEIL
  129567. "sbcs r2, r2, r4\n\t"
  129568. #elif defined(__clang__)
  129569. "sbcs r2, r4\n\t"
  129570. #else
  129571. "sbc r2, r4\n\t"
  129572. #endif
  129573. #ifdef WOLFSSL_KEIL
  129574. "sbcs r3, r3, r5\n\t"
  129575. #elif defined(__clang__)
  129576. "sbcs r3, r5\n\t"
  129577. #else
  129578. "sbc r3, r5\n\t"
  129579. #endif
  129580. "stm %[a]!, {r2, r3}\n\t"
  129581. "ldm %[b]!, {r4, r5}\n\t"
  129582. "ldr r2, [%[a]]\n\t"
  129583. "ldr r3, [%[a], #4]\n\t"
  129584. #ifdef WOLFSSL_KEIL
  129585. "sbcs r2, r2, r4\n\t"
  129586. #elif defined(__clang__)
  129587. "sbcs r2, r4\n\t"
  129588. #else
  129589. "sbc r2, r4\n\t"
  129590. #endif
  129591. #ifdef WOLFSSL_KEIL
  129592. "sbcs r3, r3, r5\n\t"
  129593. #elif defined(__clang__)
  129594. "sbcs r3, r5\n\t"
  129595. #else
  129596. "sbc r3, r5\n\t"
  129597. #endif
  129598. "stm %[a]!, {r2, r3}\n\t"
  129599. "ldr r4, [%[b]]\n\t"
  129600. "ldr r2, [%[a]]\n\t"
  129601. #ifdef WOLFSSL_KEIL
  129602. "sbcs r2, r2, r4\n\t"
  129603. #elif defined(__clang__)
  129604. "sbcs r2, r4\n\t"
  129605. #else
  129606. "sbc r2, r4\n\t"
  129607. #endif
  129608. "str r2, [%[a]]\n\t"
  129609. #ifdef WOLFSSL_KEIL
  129610. "sbcs %[a], %[a], %[a]\n\t"
  129611. #elif defined(__clang__)
  129612. "sbcs %[a], %[a]\n\t"
  129613. #else
  129614. "sbc %[a], %[a]\n\t"
  129615. #endif
  129616. : [a] "+l" (a), [b] "+l" (b)
  129617. :
  129618. : "memory", "r2", "r3", "r4", "r5"
  129619. );
  129620. return (uint32_t)(size_t)a;
  129621. }
  129622. #endif /* WOLFSSL_SP_SMALL */
  129623. /* Mul a by digit b into r. (r = a * b)
  129624. *
  129625. * r A single precision integer.
  129626. * a A single precision integer.
  129627. * b A single precision digit.
  129628. */
  129629. SP_NOINLINE static void sp_521_mul_d_17(sp_digit* r, const sp_digit* a,
  129630. sp_digit b)
  129631. {
  129632. __asm__ __volatile__ (
  129633. "movs r6, #0x44\n\t"
  129634. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129635. "adds r6, r6, %[a]\n\t"
  129636. #else
  129637. "add r6, r6, %[a]\n\t"
  129638. #endif
  129639. "mov r8, %[r]\n\t"
  129640. "mov r9, r6\n\t"
  129641. "movs r3, #0\n\t"
  129642. "movs r4, #0\n\t"
  129643. "\n"
  129644. "L_sp_521_mul_d_17_%=:\n\t"
  129645. "movs %[r], #0\n\t"
  129646. "movs r5, #0\n\t"
  129647. "# A[] * B\n\t"
  129648. "ldrh r6, [%[a]]\n\t"
  129649. "uxth r7, %[b]\n\t"
  129650. #ifdef WOLFSSL_KEIL
  129651. "muls r7, r6, r7\n\t"
  129652. #elif defined(__clang__)
  129653. "muls r7, r6\n\t"
  129654. #else
  129655. "mul r7, r6\n\t"
  129656. #endif
  129657. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129658. "adds r3, r3, r7\n\t"
  129659. #else
  129660. "add r3, r3, r7\n\t"
  129661. #endif
  129662. #ifdef WOLFSSL_KEIL
  129663. "adcs r4, r4, %[r]\n\t"
  129664. #elif defined(__clang__)
  129665. "adcs r4, %[r]\n\t"
  129666. #else
  129667. "adc r4, %[r]\n\t"
  129668. #endif
  129669. #ifdef WOLFSSL_KEIL
  129670. "adcs r5, r5, %[r]\n\t"
  129671. #elif defined(__clang__)
  129672. "adcs r5, %[r]\n\t"
  129673. #else
  129674. "adc r5, %[r]\n\t"
  129675. #endif
  129676. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129677. "lsrs r7, %[b], #16\n\t"
  129678. #else
  129679. "lsr r7, %[b], #16\n\t"
  129680. #endif
  129681. #ifdef WOLFSSL_KEIL
  129682. "muls r6, r7, r6\n\t"
  129683. #elif defined(__clang__)
  129684. "muls r6, r7\n\t"
  129685. #else
  129686. "mul r6, r7\n\t"
  129687. #endif
  129688. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129689. "lsrs r7, r6, #16\n\t"
  129690. #else
  129691. "lsr r7, r6, #16\n\t"
  129692. #endif
  129693. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129694. "lsls r6, r6, #16\n\t"
  129695. #else
  129696. "lsl r6, r6, #16\n\t"
  129697. #endif
  129698. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129699. "adds r3, r3, r6\n\t"
  129700. #else
  129701. "add r3, r3, r6\n\t"
  129702. #endif
  129703. #ifdef WOLFSSL_KEIL
  129704. "adcs r4, r4, r7\n\t"
  129705. #elif defined(__clang__)
  129706. "adcs r4, r7\n\t"
  129707. #else
  129708. "adc r4, r7\n\t"
  129709. #endif
  129710. #ifdef WOLFSSL_KEIL
  129711. "adcs r5, r5, %[r]\n\t"
  129712. #elif defined(__clang__)
  129713. "adcs r5, %[r]\n\t"
  129714. #else
  129715. "adc r5, %[r]\n\t"
  129716. #endif
  129717. "ldr r6, [%[a]]\n\t"
  129718. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129719. "lsrs r6, r6, #16\n\t"
  129720. #else
  129721. "lsr r6, r6, #16\n\t"
  129722. #endif
  129723. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129724. "lsrs r7, %[b], #16\n\t"
  129725. #else
  129726. "lsr r7, %[b], #16\n\t"
  129727. #endif
  129728. #ifdef WOLFSSL_KEIL
  129729. "muls r7, r6, r7\n\t"
  129730. #elif defined(__clang__)
  129731. "muls r7, r6\n\t"
  129732. #else
  129733. "mul r7, r6\n\t"
  129734. #endif
  129735. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129736. "adds r4, r4, r7\n\t"
  129737. #else
  129738. "add r4, r4, r7\n\t"
  129739. #endif
  129740. #ifdef WOLFSSL_KEIL
  129741. "adcs r5, r5, %[r]\n\t"
  129742. #elif defined(__clang__)
  129743. "adcs r5, %[r]\n\t"
  129744. #else
  129745. "adc r5, %[r]\n\t"
  129746. #endif
  129747. "uxth r7, %[b]\n\t"
  129748. #ifdef WOLFSSL_KEIL
  129749. "muls r6, r7, r6\n\t"
  129750. #elif defined(__clang__)
  129751. "muls r6, r7\n\t"
  129752. #else
  129753. "mul r6, r7\n\t"
  129754. #endif
  129755. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129756. "lsrs r7, r6, #16\n\t"
  129757. #else
  129758. "lsr r7, r6, #16\n\t"
  129759. #endif
  129760. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129761. "lsls r6, r6, #16\n\t"
  129762. #else
  129763. "lsl r6, r6, #16\n\t"
  129764. #endif
  129765. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129766. "adds r3, r3, r6\n\t"
  129767. #else
  129768. "add r3, r3, r6\n\t"
  129769. #endif
  129770. #ifdef WOLFSSL_KEIL
  129771. "adcs r4, r4, r7\n\t"
  129772. #elif defined(__clang__)
  129773. "adcs r4, r7\n\t"
  129774. #else
  129775. "adc r4, r7\n\t"
  129776. #endif
  129777. #ifdef WOLFSSL_KEIL
  129778. "adcs r5, r5, %[r]\n\t"
  129779. #elif defined(__clang__)
  129780. "adcs r5, %[r]\n\t"
  129781. #else
  129782. "adc r5, %[r]\n\t"
  129783. #endif
  129784. "# A[] * B - Done\n\t"
  129785. "mov %[r], r8\n\t"
  129786. "str r3, [%[r]]\n\t"
  129787. "movs r3, r4\n\t"
  129788. "movs r4, r5\n\t"
  129789. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129790. "adds %[r], %[r], #4\n\t"
  129791. #else
  129792. "add %[r], %[r], #4\n\t"
  129793. #endif
  129794. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129795. "adds %[a], %[a], #4\n\t"
  129796. #else
  129797. "add %[a], %[a], #4\n\t"
  129798. #endif
  129799. "mov r8, %[r]\n\t"
  129800. "cmp %[a], r9\n\t"
  129801. "blt L_sp_521_mul_d_17_%=\n\t"
  129802. "str r3, [%[r]]\n\t"
  129803. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  129804. :
  129805. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  129806. );
  129807. }
  129808. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  129809. *
  129810. * d1 The high order half of the number to divide.
  129811. * d0 The low order half of the number to divide.
  129812. * div The divisor.
  129813. * returns the result of the division.
  129814. *
  129815. * Note that this is an approximate div. It may give an answer 1 larger.
  129816. */
  129817. SP_NOINLINE static sp_digit div_521_word_17(sp_digit d1, sp_digit d0,
  129818. sp_digit div)
  129819. {
  129820. __asm__ __volatile__ (
  129821. "movs r3, #0\n\t"
  129822. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129823. "lsrs r5, %[div], #1\n\t"
  129824. #else
  129825. "lsr r5, %[div], #1\n\t"
  129826. #endif
  129827. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129828. "adds r5, r5, #1\n\t"
  129829. #else
  129830. "add r5, r5, #1\n\t"
  129831. #endif
  129832. "mov r8, %[d0]\n\t"
  129833. "mov r9, %[d1]\n\t"
  129834. "# Do top 32\n\t"
  129835. "movs r6, r5\n\t"
  129836. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129837. "subs r6, r6, %[d1]\n\t"
  129838. #else
  129839. "sub r6, r6, %[d1]\n\t"
  129840. #endif
  129841. #ifdef WOLFSSL_KEIL
  129842. "sbcs r6, r6, r6\n\t"
  129843. #elif defined(__clang__)
  129844. "sbcs r6, r6\n\t"
  129845. #else
  129846. "sbc r6, r6\n\t"
  129847. #endif
  129848. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129849. "adds r3, r3, r3\n\t"
  129850. #else
  129851. "add r3, r3, r3\n\t"
  129852. #endif
  129853. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129854. "subs r3, r3, r6\n\t"
  129855. #else
  129856. "sub r3, r3, r6\n\t"
  129857. #endif
  129858. #ifdef WOLFSSL_KEIL
  129859. "ands r6, r6, r5\n\t"
  129860. #elif defined(__clang__)
  129861. "ands r6, r5\n\t"
  129862. #else
  129863. "and r6, r5\n\t"
  129864. #endif
  129865. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129866. "subs %[d1], %[d1], r6\n\t"
  129867. #else
  129868. "sub %[d1], %[d1], r6\n\t"
  129869. #endif
  129870. "movs r4, #29\n\t"
  129871. "\n"
  129872. "L_div_521_word_17_loop_%=:\n\t"
  129873. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129874. "lsls %[d0], %[d0], #1\n\t"
  129875. #else
  129876. "lsl %[d0], %[d0], #1\n\t"
  129877. #endif
  129878. #ifdef WOLFSSL_KEIL
  129879. "adcs %[d1], %[d1], %[d1]\n\t"
  129880. #elif defined(__clang__)
  129881. "adcs %[d1], %[d1]\n\t"
  129882. #else
  129883. "adc %[d1], %[d1]\n\t"
  129884. #endif
  129885. "movs r6, r5\n\t"
  129886. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129887. "subs r6, r6, %[d1]\n\t"
  129888. #else
  129889. "sub r6, r6, %[d1]\n\t"
  129890. #endif
  129891. #ifdef WOLFSSL_KEIL
  129892. "sbcs r6, r6, r6\n\t"
  129893. #elif defined(__clang__)
  129894. "sbcs r6, r6\n\t"
  129895. #else
  129896. "sbc r6, r6\n\t"
  129897. #endif
  129898. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129899. "adds r3, r3, r3\n\t"
  129900. #else
  129901. "add r3, r3, r3\n\t"
  129902. #endif
  129903. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129904. "subs r3, r3, r6\n\t"
  129905. #else
  129906. "sub r3, r3, r6\n\t"
  129907. #endif
  129908. #ifdef WOLFSSL_KEIL
  129909. "ands r6, r6, r5\n\t"
  129910. #elif defined(__clang__)
  129911. "ands r6, r5\n\t"
  129912. #else
  129913. "and r6, r5\n\t"
  129914. #endif
  129915. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129916. "subs %[d1], %[d1], r6\n\t"
  129917. #else
  129918. "sub %[d1], %[d1], r6\n\t"
  129919. #endif
  129920. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129921. "subs r4, r4, #1\n\t"
  129922. #else
  129923. "sub r4, r4, #1\n\t"
  129924. #endif
  129925. "bpl L_div_521_word_17_loop_%=\n\t"
  129926. "movs r7, #0\n\t"
  129927. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129928. "adds r3, r3, r3\n\t"
  129929. #else
  129930. "add r3, r3, r3\n\t"
  129931. #endif
  129932. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129933. "adds r3, r3, #1\n\t"
  129934. #else
  129935. "add r3, r3, #1\n\t"
  129936. #endif
  129937. "# r * div - Start\n\t"
  129938. "uxth %[d1], r3\n\t"
  129939. "uxth r4, %[div]\n\t"
  129940. #ifdef WOLFSSL_KEIL
  129941. "muls r4, %[d1], r4\n\t"
  129942. #elif defined(__clang__)
  129943. "muls r4, %[d1]\n\t"
  129944. #else
  129945. "mul r4, %[d1]\n\t"
  129946. #endif
  129947. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129948. "lsrs r6, %[div], #16\n\t"
  129949. #else
  129950. "lsr r6, %[div], #16\n\t"
  129951. #endif
  129952. #ifdef WOLFSSL_KEIL
  129953. "muls %[d1], r6, %[d1]\n\t"
  129954. #elif defined(__clang__)
  129955. "muls %[d1], r6\n\t"
  129956. #else
  129957. "mul %[d1], r6\n\t"
  129958. #endif
  129959. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129960. "lsrs r5, %[d1], #16\n\t"
  129961. #else
  129962. "lsr r5, %[d1], #16\n\t"
  129963. #endif
  129964. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129965. "lsls %[d1], %[d1], #16\n\t"
  129966. #else
  129967. "lsl %[d1], %[d1], #16\n\t"
  129968. #endif
  129969. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129970. "adds r4, r4, %[d1]\n\t"
  129971. #else
  129972. "add r4, r4, %[d1]\n\t"
  129973. #endif
  129974. #ifdef WOLFSSL_KEIL
  129975. "adcs r5, r5, r7\n\t"
  129976. #elif defined(__clang__)
  129977. "adcs r5, r7\n\t"
  129978. #else
  129979. "adc r5, r7\n\t"
  129980. #endif
  129981. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129982. "lsrs %[d1], r3, #16\n\t"
  129983. #else
  129984. "lsr %[d1], r3, #16\n\t"
  129985. #endif
  129986. #ifdef WOLFSSL_KEIL
  129987. "muls r6, %[d1], r6\n\t"
  129988. #elif defined(__clang__)
  129989. "muls r6, %[d1]\n\t"
  129990. #else
  129991. "mul r6, %[d1]\n\t"
  129992. #endif
  129993. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129994. "adds r5, r5, r6\n\t"
  129995. #else
  129996. "add r5, r5, r6\n\t"
  129997. #endif
  129998. "uxth r6, %[div]\n\t"
  129999. #ifdef WOLFSSL_KEIL
  130000. "muls %[d1], r6, %[d1]\n\t"
  130001. #elif defined(__clang__)
  130002. "muls %[d1], r6\n\t"
  130003. #else
  130004. "mul %[d1], r6\n\t"
  130005. #endif
  130006. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130007. "lsrs r6, %[d1], #16\n\t"
  130008. #else
  130009. "lsr r6, %[d1], #16\n\t"
  130010. #endif
  130011. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130012. "lsls %[d1], %[d1], #16\n\t"
  130013. #else
  130014. "lsl %[d1], %[d1], #16\n\t"
  130015. #endif
  130016. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130017. "adds r4, r4, %[d1]\n\t"
  130018. #else
  130019. "add r4, r4, %[d1]\n\t"
  130020. #endif
  130021. #ifdef WOLFSSL_KEIL
  130022. "adcs r5, r5, r6\n\t"
  130023. #elif defined(__clang__)
  130024. "adcs r5, r6\n\t"
  130025. #else
  130026. "adc r5, r6\n\t"
  130027. #endif
  130028. "# r * div - Done\n\t"
  130029. "mov %[d1], r8\n\t"
  130030. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130031. "subs %[d1], %[d1], r4\n\t"
  130032. #else
  130033. "sub %[d1], %[d1], r4\n\t"
  130034. #endif
  130035. "movs r4, %[d1]\n\t"
  130036. "mov %[d1], r9\n\t"
  130037. #ifdef WOLFSSL_KEIL
  130038. "sbcs %[d1], %[d1], r5\n\t"
  130039. #elif defined(__clang__)
  130040. "sbcs %[d1], r5\n\t"
  130041. #else
  130042. "sbc %[d1], r5\n\t"
  130043. #endif
  130044. "movs r5, %[d1]\n\t"
  130045. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130046. "adds r3, r3, r5\n\t"
  130047. #else
  130048. "add r3, r3, r5\n\t"
  130049. #endif
  130050. "# r * div - Start\n\t"
  130051. "uxth %[d1], r3\n\t"
  130052. "uxth r4, %[div]\n\t"
  130053. #ifdef WOLFSSL_KEIL
  130054. "muls r4, %[d1], r4\n\t"
  130055. #elif defined(__clang__)
  130056. "muls r4, %[d1]\n\t"
  130057. #else
  130058. "mul r4, %[d1]\n\t"
  130059. #endif
  130060. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130061. "lsrs r6, %[div], #16\n\t"
  130062. #else
  130063. "lsr r6, %[div], #16\n\t"
  130064. #endif
  130065. #ifdef WOLFSSL_KEIL
  130066. "muls %[d1], r6, %[d1]\n\t"
  130067. #elif defined(__clang__)
  130068. "muls %[d1], r6\n\t"
  130069. #else
  130070. "mul %[d1], r6\n\t"
  130071. #endif
  130072. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130073. "lsrs r5, %[d1], #16\n\t"
  130074. #else
  130075. "lsr r5, %[d1], #16\n\t"
  130076. #endif
  130077. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130078. "lsls %[d1], %[d1], #16\n\t"
  130079. #else
  130080. "lsl %[d1], %[d1], #16\n\t"
  130081. #endif
  130082. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130083. "adds r4, r4, %[d1]\n\t"
  130084. #else
  130085. "add r4, r4, %[d1]\n\t"
  130086. #endif
  130087. #ifdef WOLFSSL_KEIL
  130088. "adcs r5, r5, r7\n\t"
  130089. #elif defined(__clang__)
  130090. "adcs r5, r7\n\t"
  130091. #else
  130092. "adc r5, r7\n\t"
  130093. #endif
  130094. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130095. "lsrs %[d1], r3, #16\n\t"
  130096. #else
  130097. "lsr %[d1], r3, #16\n\t"
  130098. #endif
  130099. #ifdef WOLFSSL_KEIL
  130100. "muls r6, %[d1], r6\n\t"
  130101. #elif defined(__clang__)
  130102. "muls r6, %[d1]\n\t"
  130103. #else
  130104. "mul r6, %[d1]\n\t"
  130105. #endif
  130106. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130107. "adds r5, r5, r6\n\t"
  130108. #else
  130109. "add r5, r5, r6\n\t"
  130110. #endif
  130111. "uxth r6, %[div]\n\t"
  130112. #ifdef WOLFSSL_KEIL
  130113. "muls %[d1], r6, %[d1]\n\t"
  130114. #elif defined(__clang__)
  130115. "muls %[d1], r6\n\t"
  130116. #else
  130117. "mul %[d1], r6\n\t"
  130118. #endif
  130119. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130120. "lsrs r6, %[d1], #16\n\t"
  130121. #else
  130122. "lsr r6, %[d1], #16\n\t"
  130123. #endif
  130124. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130125. "lsls %[d1], %[d1], #16\n\t"
  130126. #else
  130127. "lsl %[d1], %[d1], #16\n\t"
  130128. #endif
  130129. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130130. "adds r4, r4, %[d1]\n\t"
  130131. #else
  130132. "add r4, r4, %[d1]\n\t"
  130133. #endif
  130134. #ifdef WOLFSSL_KEIL
  130135. "adcs r5, r5, r6\n\t"
  130136. #elif defined(__clang__)
  130137. "adcs r5, r6\n\t"
  130138. #else
  130139. "adc r5, r6\n\t"
  130140. #endif
  130141. "# r * div - Done\n\t"
  130142. "mov %[d1], r8\n\t"
  130143. "mov r6, r9\n\t"
  130144. #ifdef WOLFSSL_KEIL
  130145. "subs r4, %[d1], r4\n\t"
  130146. #else
  130147. #ifdef __clang__
  130148. "subs r4, %[d1], r4\n\t"
  130149. #else
  130150. "sub r4, %[d1], r4\n\t"
  130151. #endif
  130152. #endif
  130153. #ifdef WOLFSSL_KEIL
  130154. "sbcs r6, r6, r5\n\t"
  130155. #elif defined(__clang__)
  130156. "sbcs r6, r5\n\t"
  130157. #else
  130158. "sbc r6, r5\n\t"
  130159. #endif
  130160. "movs r5, r6\n\t"
  130161. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130162. "adds r3, r3, r5\n\t"
  130163. #else
  130164. "add r3, r3, r5\n\t"
  130165. #endif
  130166. "# r * div - Start\n\t"
  130167. "uxth %[d1], r3\n\t"
  130168. "uxth r4, %[div]\n\t"
  130169. #ifdef WOLFSSL_KEIL
  130170. "muls r4, %[d1], r4\n\t"
  130171. #elif defined(__clang__)
  130172. "muls r4, %[d1]\n\t"
  130173. #else
  130174. "mul r4, %[d1]\n\t"
  130175. #endif
  130176. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130177. "lsrs r6, %[div], #16\n\t"
  130178. #else
  130179. "lsr r6, %[div], #16\n\t"
  130180. #endif
  130181. #ifdef WOLFSSL_KEIL
  130182. "muls %[d1], r6, %[d1]\n\t"
  130183. #elif defined(__clang__)
  130184. "muls %[d1], r6\n\t"
  130185. #else
  130186. "mul %[d1], r6\n\t"
  130187. #endif
  130188. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130189. "lsrs r5, %[d1], #16\n\t"
  130190. #else
  130191. "lsr r5, %[d1], #16\n\t"
  130192. #endif
  130193. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130194. "lsls %[d1], %[d1], #16\n\t"
  130195. #else
  130196. "lsl %[d1], %[d1], #16\n\t"
  130197. #endif
  130198. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130199. "adds r4, r4, %[d1]\n\t"
  130200. #else
  130201. "add r4, r4, %[d1]\n\t"
  130202. #endif
  130203. #ifdef WOLFSSL_KEIL
  130204. "adcs r5, r5, r7\n\t"
  130205. #elif defined(__clang__)
  130206. "adcs r5, r7\n\t"
  130207. #else
  130208. "adc r5, r7\n\t"
  130209. #endif
  130210. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130211. "lsrs %[d1], r3, #16\n\t"
  130212. #else
  130213. "lsr %[d1], r3, #16\n\t"
  130214. #endif
  130215. #ifdef WOLFSSL_KEIL
  130216. "muls r6, %[d1], r6\n\t"
  130217. #elif defined(__clang__)
  130218. "muls r6, %[d1]\n\t"
  130219. #else
  130220. "mul r6, %[d1]\n\t"
  130221. #endif
  130222. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130223. "adds r5, r5, r6\n\t"
  130224. #else
  130225. "add r5, r5, r6\n\t"
  130226. #endif
  130227. "uxth r6, %[div]\n\t"
  130228. #ifdef WOLFSSL_KEIL
  130229. "muls %[d1], r6, %[d1]\n\t"
  130230. #elif defined(__clang__)
  130231. "muls %[d1], r6\n\t"
  130232. #else
  130233. "mul %[d1], r6\n\t"
  130234. #endif
  130235. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130236. "lsrs r6, %[d1], #16\n\t"
  130237. #else
  130238. "lsr r6, %[d1], #16\n\t"
  130239. #endif
  130240. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130241. "lsls %[d1], %[d1], #16\n\t"
  130242. #else
  130243. "lsl %[d1], %[d1], #16\n\t"
  130244. #endif
  130245. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130246. "adds r4, r4, %[d1]\n\t"
  130247. #else
  130248. "add r4, r4, %[d1]\n\t"
  130249. #endif
  130250. #ifdef WOLFSSL_KEIL
  130251. "adcs r5, r5, r6\n\t"
  130252. #elif defined(__clang__)
  130253. "adcs r5, r6\n\t"
  130254. #else
  130255. "adc r5, r6\n\t"
  130256. #endif
  130257. "# r * div - Done\n\t"
  130258. "mov %[d1], r8\n\t"
  130259. "mov r6, r9\n\t"
  130260. #ifdef WOLFSSL_KEIL
  130261. "subs r4, %[d1], r4\n\t"
  130262. #else
  130263. #ifdef __clang__
  130264. "subs r4, %[d1], r4\n\t"
  130265. #else
  130266. "sub r4, %[d1], r4\n\t"
  130267. #endif
  130268. #endif
  130269. #ifdef WOLFSSL_KEIL
  130270. "sbcs r6, r6, r5\n\t"
  130271. #elif defined(__clang__)
  130272. "sbcs r6, r5\n\t"
  130273. #else
  130274. "sbc r6, r5\n\t"
  130275. #endif
  130276. "movs r5, r6\n\t"
  130277. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130278. "adds r3, r3, r5\n\t"
  130279. #else
  130280. "add r3, r3, r5\n\t"
  130281. #endif
  130282. "# r * div - Start\n\t"
  130283. "uxth %[d1], r3\n\t"
  130284. "uxth r4, %[div]\n\t"
  130285. #ifdef WOLFSSL_KEIL
  130286. "muls r4, %[d1], r4\n\t"
  130287. #elif defined(__clang__)
  130288. "muls r4, %[d1]\n\t"
  130289. #else
  130290. "mul r4, %[d1]\n\t"
  130291. #endif
  130292. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130293. "lsrs r6, %[div], #16\n\t"
  130294. #else
  130295. "lsr r6, %[div], #16\n\t"
  130296. #endif
  130297. #ifdef WOLFSSL_KEIL
  130298. "muls %[d1], r6, %[d1]\n\t"
  130299. #elif defined(__clang__)
  130300. "muls %[d1], r6\n\t"
  130301. #else
  130302. "mul %[d1], r6\n\t"
  130303. #endif
  130304. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130305. "lsrs r5, %[d1], #16\n\t"
  130306. #else
  130307. "lsr r5, %[d1], #16\n\t"
  130308. #endif
  130309. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130310. "lsls %[d1], %[d1], #16\n\t"
  130311. #else
  130312. "lsl %[d1], %[d1], #16\n\t"
  130313. #endif
  130314. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130315. "adds r4, r4, %[d1]\n\t"
  130316. #else
  130317. "add r4, r4, %[d1]\n\t"
  130318. #endif
  130319. #ifdef WOLFSSL_KEIL
  130320. "adcs r5, r5, r7\n\t"
  130321. #elif defined(__clang__)
  130322. "adcs r5, r7\n\t"
  130323. #else
  130324. "adc r5, r7\n\t"
  130325. #endif
  130326. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130327. "lsrs %[d1], r3, #16\n\t"
  130328. #else
  130329. "lsr %[d1], r3, #16\n\t"
  130330. #endif
  130331. #ifdef WOLFSSL_KEIL
  130332. "muls r6, %[d1], r6\n\t"
  130333. #elif defined(__clang__)
  130334. "muls r6, %[d1]\n\t"
  130335. #else
  130336. "mul r6, %[d1]\n\t"
  130337. #endif
  130338. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130339. "adds r5, r5, r6\n\t"
  130340. #else
  130341. "add r5, r5, r6\n\t"
  130342. #endif
  130343. "uxth r6, %[div]\n\t"
  130344. #ifdef WOLFSSL_KEIL
  130345. "muls %[d1], r6, %[d1]\n\t"
  130346. #elif defined(__clang__)
  130347. "muls %[d1], r6\n\t"
  130348. #else
  130349. "mul %[d1], r6\n\t"
  130350. #endif
  130351. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130352. "lsrs r6, %[d1], #16\n\t"
  130353. #else
  130354. "lsr r6, %[d1], #16\n\t"
  130355. #endif
  130356. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130357. "lsls %[d1], %[d1], #16\n\t"
  130358. #else
  130359. "lsl %[d1], %[d1], #16\n\t"
  130360. #endif
  130361. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130362. "adds r4, r4, %[d1]\n\t"
  130363. #else
  130364. "add r4, r4, %[d1]\n\t"
  130365. #endif
  130366. #ifdef WOLFSSL_KEIL
  130367. "adcs r5, r5, r6\n\t"
  130368. #elif defined(__clang__)
  130369. "adcs r5, r6\n\t"
  130370. #else
  130371. "adc r5, r6\n\t"
  130372. #endif
  130373. "# r * div - Done\n\t"
  130374. "mov %[d1], r8\n\t"
  130375. "mov r6, r9\n\t"
  130376. #ifdef WOLFSSL_KEIL
  130377. "subs r4, %[d1], r4\n\t"
  130378. #else
  130379. #ifdef __clang__
  130380. "subs r4, %[d1], r4\n\t"
  130381. #else
  130382. "sub r4, %[d1], r4\n\t"
  130383. #endif
  130384. #endif
  130385. #ifdef WOLFSSL_KEIL
  130386. "sbcs r6, r6, r5\n\t"
  130387. #elif defined(__clang__)
  130388. "sbcs r6, r5\n\t"
  130389. #else
  130390. "sbc r6, r5\n\t"
  130391. #endif
  130392. "movs r5, r6\n\t"
  130393. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130394. "adds r3, r3, r5\n\t"
  130395. #else
  130396. "add r3, r3, r5\n\t"
  130397. #endif
  130398. "movs r6, %[div]\n\t"
  130399. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130400. "subs r6, r6, r4\n\t"
  130401. #else
  130402. "sub r6, r6, r4\n\t"
  130403. #endif
  130404. #ifdef WOLFSSL_KEIL
  130405. "sbcs r6, r6, r6\n\t"
  130406. #elif defined(__clang__)
  130407. "sbcs r6, r6\n\t"
  130408. #else
  130409. "sbc r6, r6\n\t"
  130410. #endif
  130411. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130412. "subs r3, r3, r6\n\t"
  130413. #else
  130414. "sub r3, r3, r6\n\t"
  130415. #endif
  130416. "movs %[d1], r3\n\t"
  130417. : [d1] "+l" (d1), [d0] "+l" (d0), [div] "+l" (div)
  130418. :
  130419. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  130420. );
  130421. return (uint32_t)(size_t)d1;
  130422. }
  130423. /* AND m into each word of a and store in r.
  130424. *
  130425. * r A single precision integer.
  130426. * a A single precision integer.
  130427. * m Mask to AND against each digit.
  130428. */
  130429. static void sp_521_mask_17(sp_digit* r, const sp_digit* a, sp_digit m)
  130430. {
  130431. #ifdef WOLFSSL_SP_SMALL
  130432. int i;
  130433. for (i=0; i<17; i++) {
  130434. r[i] = a[i] & m;
  130435. }
  130436. #else
  130437. int i;
  130438. for (i = 0; i < 16; i += 8) {
  130439. r[i+0] = a[i+0] & m;
  130440. r[i+1] = a[i+1] & m;
  130441. r[i+2] = a[i+2] & m;
  130442. r[i+3] = a[i+3] & m;
  130443. r[i+4] = a[i+4] & m;
  130444. r[i+5] = a[i+5] & m;
  130445. r[i+6] = a[i+6] & m;
  130446. r[i+7] = a[i+7] & m;
  130447. }
  130448. r[16] = a[16] & m;
  130449. #endif
  130450. }
  130451. /* Divide d in a and put remainder into r (m*d + r = a)
  130452. * m is not calculated as it is not needed at this time.
  130453. *
  130454. * a Number to be divided.
  130455. * d Number to divide with.
  130456. * m Multiplier result.
  130457. * r Remainder from the division.
  130458. * returns MP_OKAY indicating success.
  130459. */
  130460. static WC_INLINE int sp_521_div_17(const sp_digit* a, const sp_digit* d, sp_digit* m,
  130461. sp_digit* r)
  130462. {
  130463. sp_digit t1[35];
  130464. sp_digit t2[18];
  130465. sp_digit sd[18];
  130466. sp_digit div;
  130467. sp_digit r1;
  130468. int i;
  130469. ASSERT_SAVED_VECTOR_REGISTERS();
  130470. (void)m;
  130471. div = (d[16] << 23) | (d[15] >> 9);
  130472. XMEMCPY(t1, a, sizeof(*t1) * 2 * 17);
  130473. r1 = sp_521_cmp_17(&t1[17], d) >= 0;
  130474. sp_521_cond_sub_17(&t1[17], &t1[17], d, (sp_digit)0 - r1);
  130475. sp_521_lshift_17(sd, d, 23);
  130476. sp_521_lshift_34(t1, t1, 23);
  130477. for (i = 16; i >= 0; i--) {
  130478. sp_digit hi = t1[17 + i] - (t1[17 + i] == div);
  130479. r1 = div_521_word_17(hi, t1[17 + i - 1], div);
  130480. sp_521_mul_d_17(t2, sd, r1);
  130481. t1[17 + i] += sp_521_sub_in_place_17(&t1[i], t2);
  130482. t1[17 + i] -= t2[17];
  130483. sp_521_mask_17(t2, sd, t1[17 + i]);
  130484. t1[17 + i] += sp_521_add_17(&t1[i], &t1[i], t2);
  130485. sp_521_mask_17(t2, sd, t1[17 + i]);
  130486. t1[17 + i] += sp_521_add_17(&t1[i], &t1[i], t2);
  130487. }
  130488. r1 = sp_521_cmp_17(t1, sd) >= 0;
  130489. sp_521_cond_sub_17(r, t1, sd, (sp_digit)0 - r1);
  130490. sp_521_rshift_17(r, r, 23);
  130491. return MP_OKAY;
  130492. }
  130493. /* Reduce a modulo m into r. (r = a mod m)
  130494. *
  130495. * r A single precision number that is the reduced result.
  130496. * a A single precision number that is to be reduced.
  130497. * m A single precision number that is the modulus to reduce with.
  130498. * returns MP_OKAY indicating success.
  130499. */
  130500. static WC_INLINE int sp_521_mod_17(sp_digit* r, const sp_digit* a, const sp_digit* m)
  130501. {
  130502. int ret;
  130503. ret = sp_521_div_17(a, m, NULL, r);
  130504. return ret;
  130505. }
  130506. #endif
  130507. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  130508. /* Multiply two number mod the order of P521 curve. (r = a * b mod order)
  130509. *
  130510. * r Result of the multiplication.
  130511. * a First operand of the multiplication.
  130512. * b Second operand of the multiplication.
  130513. */
  130514. static void sp_521_mont_mul_order_17(sp_digit* r, const sp_digit* a, const sp_digit* b)
  130515. {
  130516. sp_521_mul_17(r, a, b);
  130517. sp_521_mont_reduce_order_17(r, p521_order, p521_mp_order);
  130518. }
  130519. #if defined(HAVE_ECC_SIGN) || (defined(HAVE_ECC_VERIFY) && defined(WOLFSSL_SP_SMALL))
  130520. #ifdef WOLFSSL_SP_SMALL
  130521. /* Order-2 for the P521 curve. */
  130522. static const uint32_t p521_order_minus_2[17] = {
  130523. 0x91386407U,0xbb6fb71eU,0x899c47aeU,0x3bb5c9b8U,0xf709a5d0U,0x7fcc0148U,
  130524. 0xbf2f966bU,0x51868783U,0xfffffffaU,0xffffffffU,0xffffffffU,0xffffffffU,
  130525. 0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,0x000001ffU
  130526. };
  130527. #else
  130528. /* The low half of the order-2 of the P521 curve. */
  130529. static const uint32_t p521_order_low[9] = {
  130530. 0x91386407U,0xbb6fb71eU,0x899c47aeU,0x3bb5c9b8U,0xf709a5d0U,0x7fcc0148U,
  130531. 0xbf2f966bU,0x51868783U,0xfffffffaU
  130532. };
  130533. #endif /* WOLFSSL_SP_SMALL */
  130534. /* Square number mod the order of P521 curve. (r = a * a mod order)
  130535. *
  130536. * r Result of the squaring.
  130537. * a Number to square.
  130538. */
  130539. static void sp_521_mont_sqr_order_17(sp_digit* r, const sp_digit* a)
  130540. {
  130541. sp_521_sqr_17(r, a);
  130542. sp_521_mont_reduce_order_17(r, p521_order, p521_mp_order);
  130543. }
  130544. #ifndef WOLFSSL_SP_SMALL
  130545. /* Square number mod the order of P521 curve a number of times.
  130546. * (r = a ^ n mod order)
  130547. *
  130548. * r Result of the squaring.
  130549. * a Number to square.
  130550. */
  130551. static void sp_521_mont_sqr_n_order_17(sp_digit* r, const sp_digit* a, int n)
  130552. {
  130553. int i;
  130554. sp_521_mont_sqr_order_17(r, a);
  130555. for (i=1; i<n; i++) {
  130556. sp_521_mont_sqr_order_17(r, r);
  130557. }
  130558. }
  130559. #endif /* !WOLFSSL_SP_SMALL */
  130560. /* Invert the number, in Montgomery form, modulo the order of the P521 curve.
  130561. * (r = 1 / a mod order)
  130562. *
  130563. * r Inverse result.
  130564. * a Number to invert.
  130565. * td Temporary data.
  130566. */
  130567. #ifdef WOLFSSL_SP_NONBLOCK
  130568. typedef struct sp_521_mont_inv_order_17_ctx {
  130569. int state;
  130570. int i;
  130571. } sp_521_mont_inv_order_17_ctx;
  130572. static int sp_521_mont_inv_order_17_nb(sp_ecc_ctx_t* sp_ctx, sp_digit* r, const sp_digit* a,
  130573. sp_digit* t)
  130574. {
  130575. int err = FP_WOULDBLOCK;
  130576. sp_521_mont_inv_order_17_ctx* ctx = (sp_521_mont_inv_order_17_ctx*)sp_ctx;
  130577. typedef char ctx_size_test[sizeof(sp_521_mont_inv_order_17_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  130578. (void)sizeof(ctx_size_test);
  130579. switch (ctx->state) {
  130580. case 0:
  130581. XMEMCPY(t, a, sizeof(sp_digit) * 17);
  130582. ctx->i = 519;
  130583. ctx->state = 1;
  130584. break;
  130585. case 1:
  130586. sp_521_mont_sqr_order_17(t, t);
  130587. ctx->state = 2;
  130588. break;
  130589. case 2:
  130590. if ((p521_order_minus_2[ctx->i / 32] & ((sp_int_digit)1 << (ctx->i % 32))) != 0) {
  130591. sp_521_mont_mul_order_17(t, t, a);
  130592. }
  130593. ctx->i--;
  130594. ctx->state = (ctx->i == 0) ? 3 : 1;
  130595. break;
  130596. case 3:
  130597. XMEMCPY(r, t, sizeof(sp_digit) * 17U);
  130598. err = MP_OKAY;
  130599. break;
  130600. }
  130601. return err;
  130602. }
  130603. #endif /* WOLFSSL_SP_NONBLOCK */
  130604. static void sp_521_mont_inv_order_17(sp_digit* r, const sp_digit* a,
  130605. sp_digit* td)
  130606. {
  130607. #ifdef WOLFSSL_SP_SMALL
  130608. sp_digit* t = td;
  130609. int i;
  130610. XMEMCPY(t, a, sizeof(sp_digit) * 17);
  130611. for (i=519; i>=0; i--) {
  130612. sp_521_mont_sqr_order_17(t, t);
  130613. if ((p521_order_minus_2[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
  130614. sp_521_mont_mul_order_17(t, t, a);
  130615. }
  130616. }
  130617. XMEMCPY(r, t, sizeof(sp_digit) * 17U);
  130618. #else
  130619. sp_digit* t = td;
  130620. sp_digit* t2 = td + 2 * 17;
  130621. sp_digit* t3 = td + 4 * 17;
  130622. int i;
  130623. /* t = a^2 */
  130624. sp_521_mont_sqr_order_17(t, a);
  130625. /* t = a^3 = t * a */
  130626. sp_521_mont_mul_order_17(t, t, a);
  130627. /* t= a^c = t ^ 2 ^ 2 */
  130628. sp_521_mont_sqr_n_order_17(t2, t, 2);
  130629. /* t = a^f = t2 * t */
  130630. sp_521_mont_mul_order_17(t, t2, t);
  130631. /* t3 = a^1e */
  130632. sp_521_mont_sqr_order_17(t3, t);
  130633. /* t3 = a^1f = t3 * a */
  130634. sp_521_mont_mul_order_17(t3, t3, a);
  130635. /* t2= a^f0 = t ^ 2 ^ 4 */
  130636. sp_521_mont_sqr_n_order_17(t2, t, 4);
  130637. /* t = a^ff = t2 * t */
  130638. sp_521_mont_mul_order_17(t, t2, t);
  130639. /* t2= a^ff00 = t ^ 2 ^ 8 */
  130640. sp_521_mont_sqr_n_order_17(t2, t, 8);
  130641. /* t3= a^ffff = t2 * t */
  130642. sp_521_mont_mul_order_17(t, t2, t);
  130643. /* t2= a^ffff0000 = t ^ 2 ^ 16 */
  130644. sp_521_mont_sqr_n_order_17(t2, t, 16);
  130645. /* t = a^ffffffff = t2 * t */
  130646. sp_521_mont_mul_order_17(t, t2, t);
  130647. /* t2= a^ffffffff00000000 = t ^ 2 ^ 32 */
  130648. sp_521_mont_sqr_n_order_17(t2, t, 32);
  130649. /* t = a^ffffffffffffffff = t2 * t */
  130650. sp_521_mont_mul_order_17(t, t2, t);
  130651. /* t2= a^ffffffffffffffff0000000000000000 = t ^ 2 ^ 64 */
  130652. sp_521_mont_sqr_n_order_17(t2, t, 64);
  130653. /* t = a^ffffffffffffffffffffffffffffffff = t2 * t */
  130654. sp_521_mont_mul_order_17(t, t2, t);
  130655. /* t2= a^ffffffffffffffffffffffffffffffff00000000000000000000000000000000 = t ^ 2 ^ 128 */
  130656. sp_521_mont_sqr_n_order_17(t2, t, 128);
  130657. /* t = a^ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff = t2 * t */
  130658. sp_521_mont_mul_order_17(t, t2, t);
  130659. /* t2 = a^1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0 */
  130660. sp_521_mont_sqr_n_order_17(t2, t, 5);
  130661. /* t2 = a^1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff = t * t3 */
  130662. sp_521_mont_mul_order_17(t2, t2, t3);
  130663. for (i=259; i>=1; i--) {
  130664. sp_521_mont_sqr_order_17(t2, t2);
  130665. if ((p521_order_low[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
  130666. sp_521_mont_mul_order_17(t2, t2, a);
  130667. }
  130668. }
  130669. sp_521_mont_sqr_order_17(t2, t2);
  130670. sp_521_mont_mul_order_17(r, t2, a);
  130671. #endif /* WOLFSSL_SP_SMALL */
  130672. }
  130673. #endif /* HAVE_ECC_SIGN || (HAVE_ECC_VERIFY && WOLFSSL_SP_SMALL) */
  130674. #endif /* HAVE_ECC_SIGN | HAVE_ECC_VERIFY */
  130675. #ifdef HAVE_ECC_SIGN
  130676. #ifndef SP_ECC_MAX_SIG_GEN
  130677. #define SP_ECC_MAX_SIG_GEN 64
  130678. #endif
  130679. /* Calculate second signature value S from R, k and private value.
  130680. *
  130681. * s = (r * x + e) / k
  130682. *
  130683. * s Signature value.
  130684. * r First signature value.
  130685. * k Ephemeral private key.
  130686. * x Private key as a number.
  130687. * e Hash of message as a number.
  130688. * tmp Temporary storage for intermediate numbers.
  130689. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  130690. */
  130691. static int sp_521_calc_s_17(sp_digit* s, const sp_digit* r, sp_digit* k,
  130692. sp_digit* x, const sp_digit* e, sp_digit* tmp)
  130693. {
  130694. int err;
  130695. sp_digit carry;
  130696. sp_int32 c;
  130697. sp_digit* kInv = k;
  130698. /* Conv k to Montgomery form (mod order) */
  130699. sp_521_mul_17(k, k, p521_norm_order);
  130700. err = sp_521_mod_17(k, k, p521_order);
  130701. if (err == MP_OKAY) {
  130702. sp_521_norm_17(k);
  130703. /* kInv = 1/k mod order */
  130704. sp_521_mont_inv_order_17(kInv, k, tmp);
  130705. sp_521_norm_17(kInv);
  130706. /* s = r * x + e */
  130707. sp_521_mul_17(x, x, r);
  130708. err = sp_521_mod_17(x, x, p521_order);
  130709. }
  130710. if (err == MP_OKAY) {
  130711. sp_521_norm_17(x);
  130712. carry = sp_521_add_17(s, e, x);
  130713. sp_521_cond_sub_17(s, s, p521_order, 0 - carry);
  130714. sp_521_norm_17(s);
  130715. c = sp_521_cmp_17(s, p521_order);
  130716. sp_521_cond_sub_17(s, s, p521_order,
  130717. (sp_digit)0 - (sp_digit)(c >= 0));
  130718. sp_521_norm_17(s);
  130719. /* s = s * k^-1 mod order */
  130720. sp_521_mont_mul_order_17(s, s, kInv);
  130721. sp_521_norm_17(s);
  130722. }
  130723. return err;
  130724. }
  130725. /* Sign the hash using the private key.
  130726. * e = [hash, 521 bits] from binary
  130727. * r = (k.G)->x mod order
  130728. * s = (r * x + e) / k mod order
  130729. * The hash is truncated to the first 521 bits.
  130730. *
  130731. * hash Hash to sign.
  130732. * hashLen Length of the hash data.
  130733. * rng Random number generator.
  130734. * priv Private part of key - scalar.
  130735. * rm First part of result as an mp_int.
  130736. * sm Sirst part of result as an mp_int.
  130737. * heap Heap to use for allocation.
  130738. * returns RNG failures, MEMORY_E when memory allocation fails and
  130739. * MP_OKAY on success.
  130740. */
  130741. int sp_ecc_sign_521(const byte* hash, word32 hashLen, WC_RNG* rng,
  130742. const mp_int* priv, mp_int* rm, mp_int* sm, mp_int* km, void* heap)
  130743. {
  130744. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  130745. sp_digit* e = NULL;
  130746. sp_point_521* point = NULL;
  130747. #else
  130748. sp_digit e[7 * 2 * 17];
  130749. sp_point_521 point[1];
  130750. #endif
  130751. sp_digit* x = NULL;
  130752. sp_digit* k = NULL;
  130753. sp_digit* r = NULL;
  130754. sp_digit* tmp = NULL;
  130755. sp_digit* s = NULL;
  130756. sp_int32 c;
  130757. int err = MP_OKAY;
  130758. int i;
  130759. (void)heap;
  130760. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  130761. if (err == MP_OKAY) {
  130762. point = (sp_point_521*)XMALLOC(sizeof(sp_point_521), heap,
  130763. DYNAMIC_TYPE_ECC);
  130764. if (point == NULL)
  130765. err = MEMORY_E;
  130766. }
  130767. if (err == MP_OKAY) {
  130768. e = (sp_digit*)XMALLOC(sizeof(sp_digit) * 7 * 2 * 17, heap,
  130769. DYNAMIC_TYPE_ECC);
  130770. if (e == NULL)
  130771. err = MEMORY_E;
  130772. }
  130773. #endif
  130774. if (err == MP_OKAY) {
  130775. x = e + 2 * 17;
  130776. k = e + 4 * 17;
  130777. r = e + 6 * 17;
  130778. tmp = e + 8 * 17;
  130779. s = e;
  130780. if (hashLen > 66U) {
  130781. hashLen = 66U;
  130782. }
  130783. }
  130784. for (i = SP_ECC_MAX_SIG_GEN; err == MP_OKAY && i > 0; i--) {
  130785. /* New random point. */
  130786. if (km == NULL || mp_iszero(km)) {
  130787. err = sp_521_ecc_gen_k_17(rng, k);
  130788. }
  130789. else {
  130790. sp_521_from_mp(k, 17, km);
  130791. mp_zero(km);
  130792. }
  130793. if (err == MP_OKAY) {
  130794. err = sp_521_ecc_mulmod_base_17(point, k, 1, 1, heap);
  130795. }
  130796. if (err == MP_OKAY) {
  130797. /* r = point->x mod order */
  130798. XMEMCPY(r, point->x, sizeof(sp_digit) * 17U);
  130799. sp_521_norm_17(r);
  130800. c = sp_521_cmp_17(r, p521_order);
  130801. sp_521_cond_sub_17(r, r, p521_order,
  130802. (sp_digit)0 - (sp_digit)(c >= 0));
  130803. sp_521_norm_17(r);
  130804. sp_521_from_mp(x, 17, priv);
  130805. sp_521_from_bin(e, 17, hash, (int)hashLen);
  130806. if (hashLen == 66U) {
  130807. sp_521_rshift_17(e, e, 7);
  130808. }
  130809. err = sp_521_calc_s_17(s, r, k, x, e, tmp);
  130810. }
  130811. /* Check that signature is usable. */
  130812. if ((err == MP_OKAY) && (sp_521_iszero_17(s) == 0)) {
  130813. break;
  130814. }
  130815. #ifdef WOLFSSL_ECDSA_SET_K_ONE_LOOP
  130816. i = 1;
  130817. #endif
  130818. }
  130819. if (i == 0) {
  130820. err = RNG_FAILURE_E;
  130821. }
  130822. if (err == MP_OKAY) {
  130823. err = sp_521_to_mp(r, rm);
  130824. }
  130825. if (err == MP_OKAY) {
  130826. err = sp_521_to_mp(s, sm);
  130827. }
  130828. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  130829. if (e != NULL)
  130830. #endif
  130831. {
  130832. ForceZero(e, sizeof(sp_digit) * 7 * 2 * 17);
  130833. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  130834. XFREE(e, heap, DYNAMIC_TYPE_ECC);
  130835. #endif
  130836. }
  130837. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  130838. if (point != NULL)
  130839. #endif
  130840. {
  130841. ForceZero(point, sizeof(sp_point_521));
  130842. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  130843. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  130844. #endif
  130845. }
  130846. return err;
  130847. }
  130848. #ifdef WOLFSSL_SP_NONBLOCK
  130849. typedef struct sp_ecc_sign_521_ctx {
  130850. int state;
  130851. union {
  130852. sp_521_ecc_mulmod_17_ctx mulmod_ctx;
  130853. sp_521_mont_inv_order_17_ctx mont_inv_order_ctx;
  130854. };
  130855. sp_digit e[2*17];
  130856. sp_digit x[2*17];
  130857. sp_digit k[2*17];
  130858. sp_digit r[2*17];
  130859. sp_digit tmp[3 * 2*17];
  130860. sp_point_521 point;
  130861. sp_digit* s;
  130862. sp_digit* kInv;
  130863. int i;
  130864. } sp_ecc_sign_521_ctx;
  130865. int sp_ecc_sign_521_nb(sp_ecc_ctx_t* sp_ctx, const byte* hash, word32 hashLen, WC_RNG* rng,
  130866. mp_int* priv, mp_int* rm, mp_int* sm, mp_int* km, void* heap)
  130867. {
  130868. int err = FP_WOULDBLOCK;
  130869. sp_ecc_sign_521_ctx* ctx = (sp_ecc_sign_521_ctx*)sp_ctx->data;
  130870. typedef char ctx_size_test[sizeof(sp_ecc_sign_521_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  130871. (void)sizeof(ctx_size_test);
  130872. switch (ctx->state) {
  130873. case 0: /* INIT */
  130874. ctx->s = ctx->e;
  130875. ctx->kInv = ctx->k;
  130876. ctx->i = SP_ECC_MAX_SIG_GEN;
  130877. ctx->state = 1;
  130878. break;
  130879. case 1: /* GEN */
  130880. /* New random point. */
  130881. if (km == NULL || mp_iszero(km)) {
  130882. err = sp_521_ecc_gen_k_17(rng, ctx->k);
  130883. }
  130884. else {
  130885. sp_521_from_mp(ctx->k, 17, km);
  130886. mp_zero(km);
  130887. }
  130888. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  130889. ctx->state = 2;
  130890. break;
  130891. case 2: /* MULMOD */
  130892. err = sp_521_ecc_mulmod_17_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  130893. &ctx->point, &p521_base, ctx->k, 1, 1, heap);
  130894. if (err == MP_OKAY) {
  130895. ctx->state = 3;
  130896. }
  130897. break;
  130898. case 3: /* MODORDER */
  130899. {
  130900. sp_int32 c;
  130901. /* r = point->x mod order */
  130902. XMEMCPY(ctx->r, ctx->point.x, sizeof(sp_digit) * 17U);
  130903. sp_521_norm_17(ctx->r);
  130904. c = sp_521_cmp_17(ctx->r, p521_order);
  130905. sp_521_cond_sub_17(ctx->r, ctx->r, p521_order,
  130906. (sp_digit)0 - (sp_digit)(c >= 0));
  130907. sp_521_norm_17(ctx->r);
  130908. if (hashLen > 66U) {
  130909. hashLen = 66U;
  130910. }
  130911. sp_521_from_mp(ctx->x, 17, priv);
  130912. sp_521_from_bin(ctx->e, 17, hash, (int)hashLen);
  130913. if (hashLen == 66U) {
  130914. sp_521_rshift_17(ctx->e, ctx->e, 7);
  130915. }
  130916. ctx->state = 4;
  130917. break;
  130918. }
  130919. case 4: /* KMODORDER */
  130920. /* Conv k to Montgomery form (mod order) */
  130921. sp_521_mul_17(ctx->k, ctx->k, p521_norm_order);
  130922. err = sp_521_mod_17(ctx->k, ctx->k, p521_order);
  130923. if (err == MP_OKAY) {
  130924. sp_521_norm_17(ctx->k);
  130925. XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
  130926. ctx->state = 5;
  130927. }
  130928. break;
  130929. case 5: /* KINV */
  130930. /* kInv = 1/k mod order */
  130931. err = sp_521_mont_inv_order_17_nb((sp_ecc_ctx_t*)&ctx->mont_inv_order_ctx, ctx->kInv, ctx->k, ctx->tmp);
  130932. if (err == MP_OKAY) {
  130933. XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
  130934. ctx->state = 6;
  130935. }
  130936. break;
  130937. case 6: /* KINVNORM */
  130938. sp_521_norm_17(ctx->kInv);
  130939. ctx->state = 7;
  130940. break;
  130941. case 7: /* R */
  130942. /* s = r * x + e */
  130943. sp_521_mul_17(ctx->x, ctx->x, ctx->r);
  130944. ctx->state = 8;
  130945. break;
  130946. case 8: /* S1 */
  130947. err = sp_521_mod_17(ctx->x, ctx->x, p521_order);
  130948. if (err == MP_OKAY)
  130949. ctx->state = 9;
  130950. break;
  130951. case 9: /* S2 */
  130952. {
  130953. sp_digit carry;
  130954. sp_int32 c;
  130955. sp_521_norm_17(ctx->x);
  130956. carry = sp_521_add_17(ctx->s, ctx->e, ctx->x);
  130957. sp_521_cond_sub_17(ctx->s, ctx->s,
  130958. p521_order, 0 - carry);
  130959. sp_521_norm_17(ctx->s);
  130960. c = sp_521_cmp_17(ctx->s, p521_order);
  130961. sp_521_cond_sub_17(ctx->s, ctx->s, p521_order,
  130962. (sp_digit)0 - (sp_digit)(c >= 0));
  130963. sp_521_norm_17(ctx->s);
  130964. /* s = s * k^-1 mod order */
  130965. sp_521_mont_mul_order_17(ctx->s, ctx->s, ctx->kInv);
  130966. sp_521_norm_17(ctx->s);
  130967. /* Check that signature is usable. */
  130968. if (sp_521_iszero_17(ctx->s) == 0) {
  130969. ctx->state = 10;
  130970. break;
  130971. }
  130972. #ifdef WOLFSSL_ECDSA_SET_K_ONE_LOOP
  130973. ctx->i = 1;
  130974. #endif
  130975. /* not usable gen, try again */
  130976. ctx->i--;
  130977. if (ctx->i == 0) {
  130978. err = RNG_FAILURE_E;
  130979. }
  130980. ctx->state = 1;
  130981. break;
  130982. }
  130983. case 10: /* RES */
  130984. err = sp_521_to_mp(ctx->r, rm);
  130985. if (err == MP_OKAY) {
  130986. err = sp_521_to_mp(ctx->s, sm);
  130987. }
  130988. break;
  130989. }
  130990. if (err == MP_OKAY && ctx->state != 10) {
  130991. err = FP_WOULDBLOCK;
  130992. }
  130993. if (err != FP_WOULDBLOCK) {
  130994. XMEMSET(ctx->e, 0, sizeof(sp_digit) * 2U * 17U);
  130995. XMEMSET(ctx->x, 0, sizeof(sp_digit) * 2U * 17U);
  130996. XMEMSET(ctx->k, 0, sizeof(sp_digit) * 2U * 17U);
  130997. XMEMSET(ctx->r, 0, sizeof(sp_digit) * 2U * 17U);
  130998. XMEMSET(ctx->tmp, 0, sizeof(sp_digit) * 3U * 2U * 17U);
  130999. }
  131000. return err;
  131001. }
  131002. #endif /* WOLFSSL_SP_NONBLOCK */
  131003. #endif /* HAVE_ECC_SIGN */
  131004. #ifndef WOLFSSL_SP_SMALL
  131005. /* Divide the number by 2 mod the modulus. (r = a / 2 % m)
  131006. *
  131007. * r Result of division by 2.
  131008. * a Number to divide.
  131009. * m Modulus.
  131010. */
  131011. static void sp_521_div2_mod_17(sp_digit* r, const sp_digit* a,
  131012. const sp_digit* m)
  131013. {
  131014. __asm__ __volatile__ (
  131015. "ldr r3, [%[a]]\n\t"
  131016. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131017. "lsls r3, r3, #31\n\t"
  131018. #else
  131019. "lsl r3, r3, #31\n\t"
  131020. #endif
  131021. "beq L_sp_521_div2_mod_17_no_add_%=\n\t"
  131022. "ldr r4, [%[a]]\n\t"
  131023. "ldr r5, [%[a], #4]\n\t"
  131024. "ldr r6, [%[m]]\n\t"
  131025. "ldr r7, [%[m], #4]\n\t"
  131026. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131027. "adds r4, r4, r6\n\t"
  131028. #else
  131029. "add r4, r4, r6\n\t"
  131030. #endif
  131031. #ifdef WOLFSSL_KEIL
  131032. "adcs r5, r5, r7\n\t"
  131033. #elif defined(__clang__)
  131034. "adcs r5, r7\n\t"
  131035. #else
  131036. "adc r5, r7\n\t"
  131037. #endif
  131038. "str r4, [%[r]]\n\t"
  131039. "str r5, [%[r], #4]\n\t"
  131040. "ldr r4, [%[a], #8]\n\t"
  131041. "ldr r5, [%[a], #12]\n\t"
  131042. "ldr r6, [%[m], #8]\n\t"
  131043. "ldr r7, [%[m], #12]\n\t"
  131044. #ifdef WOLFSSL_KEIL
  131045. "adcs r4, r4, r6\n\t"
  131046. #elif defined(__clang__)
  131047. "adcs r4, r6\n\t"
  131048. #else
  131049. "adc r4, r6\n\t"
  131050. #endif
  131051. #ifdef WOLFSSL_KEIL
  131052. "adcs r5, r5, r7\n\t"
  131053. #elif defined(__clang__)
  131054. "adcs r5, r7\n\t"
  131055. #else
  131056. "adc r5, r7\n\t"
  131057. #endif
  131058. "str r4, [%[r], #8]\n\t"
  131059. "str r5, [%[r], #12]\n\t"
  131060. "ldr r4, [%[a], #16]\n\t"
  131061. "ldr r5, [%[a], #20]\n\t"
  131062. "ldr r6, [%[m], #16]\n\t"
  131063. "ldr r7, [%[m], #20]\n\t"
  131064. #ifdef WOLFSSL_KEIL
  131065. "adcs r4, r4, r6\n\t"
  131066. #elif defined(__clang__)
  131067. "adcs r4, r6\n\t"
  131068. #else
  131069. "adc r4, r6\n\t"
  131070. #endif
  131071. #ifdef WOLFSSL_KEIL
  131072. "adcs r5, r5, r7\n\t"
  131073. #elif defined(__clang__)
  131074. "adcs r5, r7\n\t"
  131075. #else
  131076. "adc r5, r7\n\t"
  131077. #endif
  131078. "str r4, [%[r], #16]\n\t"
  131079. "str r5, [%[r], #20]\n\t"
  131080. "ldr r4, [%[a], #24]\n\t"
  131081. "ldr r5, [%[a], #28]\n\t"
  131082. "ldr r6, [%[m], #24]\n\t"
  131083. "ldr r7, [%[m], #28]\n\t"
  131084. #ifdef WOLFSSL_KEIL
  131085. "adcs r4, r4, r6\n\t"
  131086. #elif defined(__clang__)
  131087. "adcs r4, r6\n\t"
  131088. #else
  131089. "adc r4, r6\n\t"
  131090. #endif
  131091. #ifdef WOLFSSL_KEIL
  131092. "adcs r5, r5, r7\n\t"
  131093. #elif defined(__clang__)
  131094. "adcs r5, r7\n\t"
  131095. #else
  131096. "adc r5, r7\n\t"
  131097. #endif
  131098. "str r4, [%[r], #24]\n\t"
  131099. "str r5, [%[r], #28]\n\t"
  131100. "ldr r4, [%[a], #32]\n\t"
  131101. "ldr r5, [%[a], #36]\n\t"
  131102. "ldr r6, [%[m], #32]\n\t"
  131103. "ldr r7, [%[m], #36]\n\t"
  131104. #ifdef WOLFSSL_KEIL
  131105. "adcs r4, r4, r6\n\t"
  131106. #elif defined(__clang__)
  131107. "adcs r4, r6\n\t"
  131108. #else
  131109. "adc r4, r6\n\t"
  131110. #endif
  131111. #ifdef WOLFSSL_KEIL
  131112. "adcs r5, r5, r7\n\t"
  131113. #elif defined(__clang__)
  131114. "adcs r5, r7\n\t"
  131115. #else
  131116. "adc r5, r7\n\t"
  131117. #endif
  131118. "str r4, [%[r], #32]\n\t"
  131119. "str r5, [%[r], #36]\n\t"
  131120. "ldr r4, [%[a], #40]\n\t"
  131121. "ldr r5, [%[a], #44]\n\t"
  131122. "ldr r6, [%[m], #40]\n\t"
  131123. "ldr r7, [%[m], #44]\n\t"
  131124. #ifdef WOLFSSL_KEIL
  131125. "adcs r4, r4, r6\n\t"
  131126. #elif defined(__clang__)
  131127. "adcs r4, r6\n\t"
  131128. #else
  131129. "adc r4, r6\n\t"
  131130. #endif
  131131. #ifdef WOLFSSL_KEIL
  131132. "adcs r5, r5, r7\n\t"
  131133. #elif defined(__clang__)
  131134. "adcs r5, r7\n\t"
  131135. #else
  131136. "adc r5, r7\n\t"
  131137. #endif
  131138. "str r4, [%[r], #40]\n\t"
  131139. "str r5, [%[r], #44]\n\t"
  131140. "ldr r4, [%[a], #48]\n\t"
  131141. "ldr r5, [%[a], #52]\n\t"
  131142. "ldr r6, [%[m], #48]\n\t"
  131143. "ldr r7, [%[m], #52]\n\t"
  131144. #ifdef WOLFSSL_KEIL
  131145. "adcs r4, r4, r6\n\t"
  131146. #elif defined(__clang__)
  131147. "adcs r4, r6\n\t"
  131148. #else
  131149. "adc r4, r6\n\t"
  131150. #endif
  131151. #ifdef WOLFSSL_KEIL
  131152. "adcs r5, r5, r7\n\t"
  131153. #elif defined(__clang__)
  131154. "adcs r5, r7\n\t"
  131155. #else
  131156. "adc r5, r7\n\t"
  131157. #endif
  131158. "str r4, [%[r], #48]\n\t"
  131159. "str r5, [%[r], #52]\n\t"
  131160. "ldr r4, [%[a], #56]\n\t"
  131161. "ldr r5, [%[a], #60]\n\t"
  131162. "ldr r6, [%[m], #56]\n\t"
  131163. "ldr r7, [%[m], #60]\n\t"
  131164. #ifdef WOLFSSL_KEIL
  131165. "adcs r4, r4, r6\n\t"
  131166. #elif defined(__clang__)
  131167. "adcs r4, r6\n\t"
  131168. #else
  131169. "adc r4, r6\n\t"
  131170. #endif
  131171. #ifdef WOLFSSL_KEIL
  131172. "adcs r5, r5, r7\n\t"
  131173. #elif defined(__clang__)
  131174. "adcs r5, r7\n\t"
  131175. #else
  131176. "adc r5, r7\n\t"
  131177. #endif
  131178. "str r4, [%[r], #56]\n\t"
  131179. "str r5, [%[r], #60]\n\t"
  131180. "ldr r4, [%[a], #64]\n\t"
  131181. "ldr r6, [%[m], #64]\n\t"
  131182. #ifdef WOLFSSL_KEIL
  131183. "adcs r4, r4, r6\n\t"
  131184. #elif defined(__clang__)
  131185. "adcs r4, r6\n\t"
  131186. #else
  131187. "adc r4, r6\n\t"
  131188. #endif
  131189. "str r4, [%[r], #64]\n\t"
  131190. "movs r3, #0\n\t"
  131191. #ifdef WOLFSSL_KEIL
  131192. "adcs r3, r3, r3\n\t"
  131193. #elif defined(__clang__)
  131194. "adcs r3, r3\n\t"
  131195. #else
  131196. "adc r3, r3\n\t"
  131197. #endif
  131198. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131199. "lsls r3, r3, #31\n\t"
  131200. #else
  131201. "lsl r3, r3, #31\n\t"
  131202. #endif
  131203. "b L_sp_521_div2_mod_17_div2_%=\n\t"
  131204. "\n"
  131205. "L_sp_521_div2_mod_17_no_add_%=:\n\t"
  131206. "ldr r4, [%[a]]\n\t"
  131207. "ldr r5, [%[a], #4]\n\t"
  131208. "str r4, [%[r]]\n\t"
  131209. "str r5, [%[r], #4]\n\t"
  131210. "ldr r4, [%[a], #8]\n\t"
  131211. "ldr r5, [%[a], #12]\n\t"
  131212. "str r4, [%[r], #8]\n\t"
  131213. "str r5, [%[r], #12]\n\t"
  131214. "ldr r4, [%[a], #16]\n\t"
  131215. "ldr r5, [%[a], #20]\n\t"
  131216. "str r4, [%[r], #16]\n\t"
  131217. "str r5, [%[r], #20]\n\t"
  131218. "ldr r4, [%[a], #24]\n\t"
  131219. "ldr r5, [%[a], #28]\n\t"
  131220. "str r4, [%[r], #24]\n\t"
  131221. "str r5, [%[r], #28]\n\t"
  131222. "ldr r4, [%[a], #32]\n\t"
  131223. "ldr r5, [%[a], #36]\n\t"
  131224. "str r4, [%[r], #32]\n\t"
  131225. "str r5, [%[r], #36]\n\t"
  131226. "ldr r4, [%[a], #40]\n\t"
  131227. "ldr r5, [%[a], #44]\n\t"
  131228. "str r4, [%[r], #40]\n\t"
  131229. "str r5, [%[r], #44]\n\t"
  131230. "ldr r4, [%[a], #48]\n\t"
  131231. "ldr r5, [%[a], #52]\n\t"
  131232. "str r4, [%[r], #48]\n\t"
  131233. "str r5, [%[r], #52]\n\t"
  131234. "ldr r4, [%[a], #56]\n\t"
  131235. "ldr r5, [%[a], #60]\n\t"
  131236. "str r4, [%[r], #56]\n\t"
  131237. "str r5, [%[r], #60]\n\t"
  131238. "ldr r4, [%[a], #64]\n\t"
  131239. "str r4, [%[r], #64]\n\t"
  131240. "\n"
  131241. "L_sp_521_div2_mod_17_div2_%=:\n\t"
  131242. "ldr r4, [%[r]]\n\t"
  131243. "ldr r5, [%[r], #4]\n\t"
  131244. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131245. "lsrs r4, r4, #1\n\t"
  131246. #else
  131247. "lsr r4, r4, #1\n\t"
  131248. #endif
  131249. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131250. "lsls r6, r5, #31\n\t"
  131251. #else
  131252. "lsl r6, r5, #31\n\t"
  131253. #endif
  131254. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131255. "lsrs r5, r5, #1\n\t"
  131256. #else
  131257. "lsr r5, r5, #1\n\t"
  131258. #endif
  131259. #ifdef WOLFSSL_KEIL
  131260. "orrs r4, r4, r6\n\t"
  131261. #elif defined(__clang__)
  131262. "orrs r4, r6\n\t"
  131263. #else
  131264. "orr r4, r6\n\t"
  131265. #endif
  131266. "ldr r7, [%[r], #8]\n\t"
  131267. "str r4, [%[r]]\n\t"
  131268. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131269. "lsls r6, r7, #31\n\t"
  131270. #else
  131271. "lsl r6, r7, #31\n\t"
  131272. #endif
  131273. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131274. "lsrs r7, r7, #1\n\t"
  131275. #else
  131276. "lsr r7, r7, #1\n\t"
  131277. #endif
  131278. #ifdef WOLFSSL_KEIL
  131279. "orrs r5, r5, r6\n\t"
  131280. #elif defined(__clang__)
  131281. "orrs r5, r6\n\t"
  131282. #else
  131283. "orr r5, r6\n\t"
  131284. #endif
  131285. "ldr r4, [%[r], #12]\n\t"
  131286. "str r5, [%[r], #4]\n\t"
  131287. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131288. "lsls r6, r4, #31\n\t"
  131289. #else
  131290. "lsl r6, r4, #31\n\t"
  131291. #endif
  131292. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131293. "lsrs r4, r4, #1\n\t"
  131294. #else
  131295. "lsr r4, r4, #1\n\t"
  131296. #endif
  131297. #ifdef WOLFSSL_KEIL
  131298. "orrs r7, r7, r6\n\t"
  131299. #elif defined(__clang__)
  131300. "orrs r7, r6\n\t"
  131301. #else
  131302. "orr r7, r6\n\t"
  131303. #endif
  131304. "ldr r5, [%[r], #16]\n\t"
  131305. "str r7, [%[r], #8]\n\t"
  131306. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131307. "lsls r6, r5, #31\n\t"
  131308. #else
  131309. "lsl r6, r5, #31\n\t"
  131310. #endif
  131311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131312. "lsrs r5, r5, #1\n\t"
  131313. #else
  131314. "lsr r5, r5, #1\n\t"
  131315. #endif
  131316. #ifdef WOLFSSL_KEIL
  131317. "orrs r4, r4, r6\n\t"
  131318. #elif defined(__clang__)
  131319. "orrs r4, r6\n\t"
  131320. #else
  131321. "orr r4, r6\n\t"
  131322. #endif
  131323. "ldr r7, [%[r], #20]\n\t"
  131324. "str r4, [%[r], #12]\n\t"
  131325. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131326. "lsls r6, r7, #31\n\t"
  131327. #else
  131328. "lsl r6, r7, #31\n\t"
  131329. #endif
  131330. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131331. "lsrs r7, r7, #1\n\t"
  131332. #else
  131333. "lsr r7, r7, #1\n\t"
  131334. #endif
  131335. #ifdef WOLFSSL_KEIL
  131336. "orrs r5, r5, r6\n\t"
  131337. #elif defined(__clang__)
  131338. "orrs r5, r6\n\t"
  131339. #else
  131340. "orr r5, r6\n\t"
  131341. #endif
  131342. "ldr r4, [%[r], #24]\n\t"
  131343. "str r5, [%[r], #16]\n\t"
  131344. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131345. "lsls r6, r4, #31\n\t"
  131346. #else
  131347. "lsl r6, r4, #31\n\t"
  131348. #endif
  131349. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131350. "lsrs r4, r4, #1\n\t"
  131351. #else
  131352. "lsr r4, r4, #1\n\t"
  131353. #endif
  131354. #ifdef WOLFSSL_KEIL
  131355. "orrs r7, r7, r6\n\t"
  131356. #elif defined(__clang__)
  131357. "orrs r7, r6\n\t"
  131358. #else
  131359. "orr r7, r6\n\t"
  131360. #endif
  131361. "ldr r5, [%[r], #28]\n\t"
  131362. "str r7, [%[r], #20]\n\t"
  131363. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131364. "lsls r6, r5, #31\n\t"
  131365. #else
  131366. "lsl r6, r5, #31\n\t"
  131367. #endif
  131368. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131369. "lsrs r5, r5, #1\n\t"
  131370. #else
  131371. "lsr r5, r5, #1\n\t"
  131372. #endif
  131373. #ifdef WOLFSSL_KEIL
  131374. "orrs r4, r4, r6\n\t"
  131375. #elif defined(__clang__)
  131376. "orrs r4, r6\n\t"
  131377. #else
  131378. "orr r4, r6\n\t"
  131379. #endif
  131380. "ldr r7, [%[r], #32]\n\t"
  131381. "str r4, [%[r], #24]\n\t"
  131382. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131383. "lsls r6, r7, #31\n\t"
  131384. #else
  131385. "lsl r6, r7, #31\n\t"
  131386. #endif
  131387. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131388. "lsrs r7, r7, #1\n\t"
  131389. #else
  131390. "lsr r7, r7, #1\n\t"
  131391. #endif
  131392. #ifdef WOLFSSL_KEIL
  131393. "orrs r5, r5, r6\n\t"
  131394. #elif defined(__clang__)
  131395. "orrs r5, r6\n\t"
  131396. #else
  131397. "orr r5, r6\n\t"
  131398. #endif
  131399. "ldr r4, [%[r], #36]\n\t"
  131400. "str r5, [%[r], #28]\n\t"
  131401. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131402. "lsls r6, r4, #31\n\t"
  131403. #else
  131404. "lsl r6, r4, #31\n\t"
  131405. #endif
  131406. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131407. "lsrs r4, r4, #1\n\t"
  131408. #else
  131409. "lsr r4, r4, #1\n\t"
  131410. #endif
  131411. #ifdef WOLFSSL_KEIL
  131412. "orrs r7, r7, r6\n\t"
  131413. #elif defined(__clang__)
  131414. "orrs r7, r6\n\t"
  131415. #else
  131416. "orr r7, r6\n\t"
  131417. #endif
  131418. "ldr r5, [%[r], #40]\n\t"
  131419. "str r7, [%[r], #32]\n\t"
  131420. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131421. "lsls r6, r5, #31\n\t"
  131422. #else
  131423. "lsl r6, r5, #31\n\t"
  131424. #endif
  131425. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131426. "lsrs r5, r5, #1\n\t"
  131427. #else
  131428. "lsr r5, r5, #1\n\t"
  131429. #endif
  131430. #ifdef WOLFSSL_KEIL
  131431. "orrs r4, r4, r6\n\t"
  131432. #elif defined(__clang__)
  131433. "orrs r4, r6\n\t"
  131434. #else
  131435. "orr r4, r6\n\t"
  131436. #endif
  131437. "ldr r7, [%[r], #44]\n\t"
  131438. "str r4, [%[r], #36]\n\t"
  131439. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131440. "lsls r6, r7, #31\n\t"
  131441. #else
  131442. "lsl r6, r7, #31\n\t"
  131443. #endif
  131444. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131445. "lsrs r7, r7, #1\n\t"
  131446. #else
  131447. "lsr r7, r7, #1\n\t"
  131448. #endif
  131449. #ifdef WOLFSSL_KEIL
  131450. "orrs r5, r5, r6\n\t"
  131451. #elif defined(__clang__)
  131452. "orrs r5, r6\n\t"
  131453. #else
  131454. "orr r5, r6\n\t"
  131455. #endif
  131456. "ldr r4, [%[r], #48]\n\t"
  131457. "str r5, [%[r], #40]\n\t"
  131458. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131459. "lsls r6, r4, #31\n\t"
  131460. #else
  131461. "lsl r6, r4, #31\n\t"
  131462. #endif
  131463. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131464. "lsrs r4, r4, #1\n\t"
  131465. #else
  131466. "lsr r4, r4, #1\n\t"
  131467. #endif
  131468. #ifdef WOLFSSL_KEIL
  131469. "orrs r7, r7, r6\n\t"
  131470. #elif defined(__clang__)
  131471. "orrs r7, r6\n\t"
  131472. #else
  131473. "orr r7, r6\n\t"
  131474. #endif
  131475. "ldr r5, [%[r], #52]\n\t"
  131476. "str r7, [%[r], #44]\n\t"
  131477. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131478. "lsls r6, r5, #31\n\t"
  131479. #else
  131480. "lsl r6, r5, #31\n\t"
  131481. #endif
  131482. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131483. "lsrs r5, r5, #1\n\t"
  131484. #else
  131485. "lsr r5, r5, #1\n\t"
  131486. #endif
  131487. #ifdef WOLFSSL_KEIL
  131488. "orrs r4, r4, r6\n\t"
  131489. #elif defined(__clang__)
  131490. "orrs r4, r6\n\t"
  131491. #else
  131492. "orr r4, r6\n\t"
  131493. #endif
  131494. "ldr r7, [%[r], #56]\n\t"
  131495. "str r4, [%[r], #48]\n\t"
  131496. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131497. "lsls r6, r7, #31\n\t"
  131498. #else
  131499. "lsl r6, r7, #31\n\t"
  131500. #endif
  131501. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131502. "lsrs r7, r7, #1\n\t"
  131503. #else
  131504. "lsr r7, r7, #1\n\t"
  131505. #endif
  131506. #ifdef WOLFSSL_KEIL
  131507. "orrs r5, r5, r6\n\t"
  131508. #elif defined(__clang__)
  131509. "orrs r5, r6\n\t"
  131510. #else
  131511. "orr r5, r6\n\t"
  131512. #endif
  131513. "ldr r4, [%[r], #60]\n\t"
  131514. "str r5, [%[r], #52]\n\t"
  131515. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131516. "lsls r6, r4, #31\n\t"
  131517. #else
  131518. "lsl r6, r4, #31\n\t"
  131519. #endif
  131520. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131521. "lsrs r4, r4, #1\n\t"
  131522. #else
  131523. "lsr r4, r4, #1\n\t"
  131524. #endif
  131525. #ifdef WOLFSSL_KEIL
  131526. "orrs r7, r7, r6\n\t"
  131527. #elif defined(__clang__)
  131528. "orrs r7, r6\n\t"
  131529. #else
  131530. "orr r7, r6\n\t"
  131531. #endif
  131532. "ldr r5, [%[r], #64]\n\t"
  131533. "str r7, [%[r], #56]\n\t"
  131534. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131535. "lsls r6, r5, #31\n\t"
  131536. #else
  131537. "lsl r6, r5, #31\n\t"
  131538. #endif
  131539. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131540. "lsrs r5, r5, #1\n\t"
  131541. #else
  131542. "lsr r5, r5, #1\n\t"
  131543. #endif
  131544. #ifdef WOLFSSL_KEIL
  131545. "orrs r4, r4, r6\n\t"
  131546. #elif defined(__clang__)
  131547. "orrs r4, r6\n\t"
  131548. #else
  131549. "orr r4, r6\n\t"
  131550. #endif
  131551. #ifdef WOLFSSL_KEIL
  131552. "orrs r5, r5, r3\n\t"
  131553. #elif defined(__clang__)
  131554. "orrs r5, r3\n\t"
  131555. #else
  131556. "orr r5, r3\n\t"
  131557. #endif
  131558. "str r4, [%[r], #60]\n\t"
  131559. "str r5, [%[r], #64]\n\t"
  131560. : [r] "+l" (r), [a] "+l" (a), [m] "+l" (m)
  131561. :
  131562. : "memory", "r3", "r4", "r5", "r6", "r7"
  131563. );
  131564. }
  131565. static int sp_521_num_bits_17(sp_digit* a)
  131566. {
  131567. static const byte sp_num_bits_table[256] = {
  131568. 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
  131569. 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
  131570. 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
  131571. 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
  131572. 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
  131573. 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
  131574. 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
  131575. 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
  131576. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  131577. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  131578. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  131579. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  131580. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  131581. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  131582. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  131583. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  131584. };
  131585. const byte* table = sp_num_bits_table;
  131586. __asm__ __volatile__ (
  131587. "movs r6, #0xff\n\t"
  131588. "ldr r3, [%[a], #64]\n\t"
  131589. "cmp r3, #0\n\t"
  131590. "beq L_sp_521_num_bits_17_16_%=\n\t"
  131591. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131592. "lsrs r5, r3, #24\n\t"
  131593. #else
  131594. "lsr r5, r3, #24\n\t"
  131595. #endif
  131596. "cmp r5, #0\n\t"
  131597. "beq L_sp_521_num_bits_17_183_%=\n\t"
  131598. "movs r2, #2\n\t"
  131599. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131600. "lsls r2, r2, #8\n\t"
  131601. #else
  131602. "lsl r2, r2, #8\n\t"
  131603. #endif
  131604. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131605. "adds r2, r2, #24\n\t"
  131606. #else
  131607. "add r2, r2, #24\n\t"
  131608. #endif
  131609. "ldrb r4, [%[table], r5]\n\t"
  131610. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131611. "adds r2, r2, r4\n\t"
  131612. #else
  131613. "add r2, r2, r4\n\t"
  131614. #endif
  131615. "b L_sp_521_num_bits_17_18_%=\n\t"
  131616. "\n"
  131617. "L_sp_521_num_bits_17_183_%=:\n\t"
  131618. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131619. "lsrs r5, r3, #16\n\t"
  131620. #else
  131621. "lsr r5, r3, #16\n\t"
  131622. #endif
  131623. #ifdef WOLFSSL_KEIL
  131624. "ands r5, r5, r6\n\t"
  131625. #elif defined(__clang__)
  131626. "ands r5, r6\n\t"
  131627. #else
  131628. "and r5, r6\n\t"
  131629. #endif
  131630. "cmp r5, #0\n\t"
  131631. "beq L_sp_521_num_bits_17_182_%=\n\t"
  131632. "movs r2, #2\n\t"
  131633. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131634. "lsls r2, r2, #8\n\t"
  131635. #else
  131636. "lsl r2, r2, #8\n\t"
  131637. #endif
  131638. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131639. "adds r2, r2, #16\n\t"
  131640. #else
  131641. "add r2, r2, #16\n\t"
  131642. #endif
  131643. "ldrb r4, [%[table], r5]\n\t"
  131644. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131645. "adds r2, r2, r4\n\t"
  131646. #else
  131647. "add r2, r2, r4\n\t"
  131648. #endif
  131649. "b L_sp_521_num_bits_17_18_%=\n\t"
  131650. "\n"
  131651. "L_sp_521_num_bits_17_182_%=:\n\t"
  131652. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131653. "lsrs r5, r3, #8\n\t"
  131654. #else
  131655. "lsr r5, r3, #8\n\t"
  131656. #endif
  131657. #ifdef WOLFSSL_KEIL
  131658. "ands r5, r5, r6\n\t"
  131659. #elif defined(__clang__)
  131660. "ands r5, r6\n\t"
  131661. #else
  131662. "and r5, r6\n\t"
  131663. #endif
  131664. "cmp r5, #0\n\t"
  131665. "beq L_sp_521_num_bits_17_181_%=\n\t"
  131666. "movs r2, #2\n\t"
  131667. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131668. "lsls r2, r2, #8\n\t"
  131669. #else
  131670. "lsl r2, r2, #8\n\t"
  131671. #endif
  131672. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131673. "adds r2, r2, #8\n\t"
  131674. #else
  131675. "add r2, r2, #8\n\t"
  131676. #endif
  131677. "ldrb r4, [%[table], r5]\n\t"
  131678. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131679. "adds r2, r2, r4\n\t"
  131680. #else
  131681. "add r2, r2, r4\n\t"
  131682. #endif
  131683. "b L_sp_521_num_bits_17_18_%=\n\t"
  131684. "\n"
  131685. "L_sp_521_num_bits_17_181_%=:\n\t"
  131686. "movs r5, r3\n\t"
  131687. #ifdef WOLFSSL_KEIL
  131688. "ands r5, r5, r6\n\t"
  131689. #elif defined(__clang__)
  131690. "ands r5, r6\n\t"
  131691. #else
  131692. "and r5, r6\n\t"
  131693. #endif
  131694. "cmp r5, #0\n\t"
  131695. "beq L_sp_521_num_bits_17_180_%=\n\t"
  131696. "movs r2, #2\n\t"
  131697. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131698. "lsls r2, r2, #8\n\t"
  131699. #else
  131700. "lsl r2, r2, #8\n\t"
  131701. #endif
  131702. "ldrb r4, [%[table], r5]\n\t"
  131703. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131704. "adds r2, r2, r4\n\t"
  131705. #else
  131706. "add r2, r2, r4\n\t"
  131707. #endif
  131708. "b L_sp_521_num_bits_17_18_%=\n\t"
  131709. "\n"
  131710. "L_sp_521_num_bits_17_180_%=:\n\t"
  131711. "b L_sp_521_num_bits_17_18_%=\n\t"
  131712. "\n"
  131713. "L_sp_521_num_bits_17_16_%=:\n\t"
  131714. "ldr r3, [%[a], #60]\n\t"
  131715. "cmp r3, #0\n\t"
  131716. "beq L_sp_521_num_bits_17_15_%=\n\t"
  131717. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131718. "lsrs r5, r3, #24\n\t"
  131719. #else
  131720. "lsr r5, r3, #24\n\t"
  131721. #endif
  131722. "cmp r5, #0\n\t"
  131723. "beq L_sp_521_num_bits_17_173_%=\n\t"
  131724. "movs r2, #0xff\n\t"
  131725. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131726. "adds r2, r2, #0xf9\n\t"
  131727. #else
  131728. "add r2, r2, #0xf9\n\t"
  131729. #endif
  131730. "ldrb r4, [%[table], r5]\n\t"
  131731. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131732. "adds r2, r2, r4\n\t"
  131733. #else
  131734. "add r2, r2, r4\n\t"
  131735. #endif
  131736. "b L_sp_521_num_bits_17_18_%=\n\t"
  131737. "\n"
  131738. "L_sp_521_num_bits_17_173_%=:\n\t"
  131739. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131740. "lsrs r5, r3, #16\n\t"
  131741. #else
  131742. "lsr r5, r3, #16\n\t"
  131743. #endif
  131744. #ifdef WOLFSSL_KEIL
  131745. "ands r5, r5, r6\n\t"
  131746. #elif defined(__clang__)
  131747. "ands r5, r6\n\t"
  131748. #else
  131749. "and r5, r6\n\t"
  131750. #endif
  131751. "cmp r5, #0\n\t"
  131752. "beq L_sp_521_num_bits_17_172_%=\n\t"
  131753. "movs r2, #0xff\n\t"
  131754. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131755. "adds r2, r2, #0xf1\n\t"
  131756. #else
  131757. "add r2, r2, #0xf1\n\t"
  131758. #endif
  131759. "ldrb r4, [%[table], r5]\n\t"
  131760. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131761. "adds r2, r2, r4\n\t"
  131762. #else
  131763. "add r2, r2, r4\n\t"
  131764. #endif
  131765. "b L_sp_521_num_bits_17_18_%=\n\t"
  131766. "\n"
  131767. "L_sp_521_num_bits_17_172_%=:\n\t"
  131768. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131769. "lsrs r5, r3, #8\n\t"
  131770. #else
  131771. "lsr r5, r3, #8\n\t"
  131772. #endif
  131773. #ifdef WOLFSSL_KEIL
  131774. "ands r5, r5, r6\n\t"
  131775. #elif defined(__clang__)
  131776. "ands r5, r6\n\t"
  131777. #else
  131778. "and r5, r6\n\t"
  131779. #endif
  131780. "cmp r5, #0\n\t"
  131781. "beq L_sp_521_num_bits_17_171_%=\n\t"
  131782. "movs r2, #0xff\n\t"
  131783. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131784. "adds r2, r2, #0xe9\n\t"
  131785. #else
  131786. "add r2, r2, #0xe9\n\t"
  131787. #endif
  131788. "ldrb r4, [%[table], r5]\n\t"
  131789. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131790. "adds r2, r2, r4\n\t"
  131791. #else
  131792. "add r2, r2, r4\n\t"
  131793. #endif
  131794. "b L_sp_521_num_bits_17_18_%=\n\t"
  131795. "\n"
  131796. "L_sp_521_num_bits_17_171_%=:\n\t"
  131797. "movs r5, r3\n\t"
  131798. #ifdef WOLFSSL_KEIL
  131799. "ands r5, r5, r6\n\t"
  131800. #elif defined(__clang__)
  131801. "ands r5, r6\n\t"
  131802. #else
  131803. "and r5, r6\n\t"
  131804. #endif
  131805. "cmp r5, #0\n\t"
  131806. "beq L_sp_521_num_bits_17_170_%=\n\t"
  131807. "movs r2, #0xff\n\t"
  131808. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131809. "adds r2, r2, #0xe1\n\t"
  131810. #else
  131811. "add r2, r2, #0xe1\n\t"
  131812. #endif
  131813. "ldrb r4, [%[table], r5]\n\t"
  131814. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131815. "adds r2, r2, r4\n\t"
  131816. #else
  131817. "add r2, r2, r4\n\t"
  131818. #endif
  131819. "b L_sp_521_num_bits_17_18_%=\n\t"
  131820. "\n"
  131821. "L_sp_521_num_bits_17_170_%=:\n\t"
  131822. "b L_sp_521_num_bits_17_18_%=\n\t"
  131823. "\n"
  131824. "L_sp_521_num_bits_17_15_%=:\n\t"
  131825. "ldr r3, [%[a], #56]\n\t"
  131826. "cmp r3, #0\n\t"
  131827. "beq L_sp_521_num_bits_17_14_%=\n\t"
  131828. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131829. "lsrs r5, r3, #24\n\t"
  131830. #else
  131831. "lsr r5, r3, #24\n\t"
  131832. #endif
  131833. "cmp r5, #0\n\t"
  131834. "beq L_sp_521_num_bits_17_163_%=\n\t"
  131835. "movs r2, #0xff\n\t"
  131836. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131837. "adds r2, r2, #0xd9\n\t"
  131838. #else
  131839. "add r2, r2, #0xd9\n\t"
  131840. #endif
  131841. "ldrb r4, [%[table], r5]\n\t"
  131842. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131843. "adds r2, r2, r4\n\t"
  131844. #else
  131845. "add r2, r2, r4\n\t"
  131846. #endif
  131847. "b L_sp_521_num_bits_17_18_%=\n\t"
  131848. "\n"
  131849. "L_sp_521_num_bits_17_163_%=:\n\t"
  131850. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131851. "lsrs r5, r3, #16\n\t"
  131852. #else
  131853. "lsr r5, r3, #16\n\t"
  131854. #endif
  131855. #ifdef WOLFSSL_KEIL
  131856. "ands r5, r5, r6\n\t"
  131857. #elif defined(__clang__)
  131858. "ands r5, r6\n\t"
  131859. #else
  131860. "and r5, r6\n\t"
  131861. #endif
  131862. "cmp r5, #0\n\t"
  131863. "beq L_sp_521_num_bits_17_162_%=\n\t"
  131864. "movs r2, #0xff\n\t"
  131865. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131866. "adds r2, r2, #0xd1\n\t"
  131867. #else
  131868. "add r2, r2, #0xd1\n\t"
  131869. #endif
  131870. "ldrb r4, [%[table], r5]\n\t"
  131871. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131872. "adds r2, r2, r4\n\t"
  131873. #else
  131874. "add r2, r2, r4\n\t"
  131875. #endif
  131876. "b L_sp_521_num_bits_17_18_%=\n\t"
  131877. "\n"
  131878. "L_sp_521_num_bits_17_162_%=:\n\t"
  131879. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131880. "lsrs r5, r3, #8\n\t"
  131881. #else
  131882. "lsr r5, r3, #8\n\t"
  131883. #endif
  131884. #ifdef WOLFSSL_KEIL
  131885. "ands r5, r5, r6\n\t"
  131886. #elif defined(__clang__)
  131887. "ands r5, r6\n\t"
  131888. #else
  131889. "and r5, r6\n\t"
  131890. #endif
  131891. "cmp r5, #0\n\t"
  131892. "beq L_sp_521_num_bits_17_161_%=\n\t"
  131893. "movs r2, #0xff\n\t"
  131894. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131895. "adds r2, r2, #0xc9\n\t"
  131896. #else
  131897. "add r2, r2, #0xc9\n\t"
  131898. #endif
  131899. "ldrb r4, [%[table], r5]\n\t"
  131900. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131901. "adds r2, r2, r4\n\t"
  131902. #else
  131903. "add r2, r2, r4\n\t"
  131904. #endif
  131905. "b L_sp_521_num_bits_17_18_%=\n\t"
  131906. "\n"
  131907. "L_sp_521_num_bits_17_161_%=:\n\t"
  131908. "movs r5, r3\n\t"
  131909. #ifdef WOLFSSL_KEIL
  131910. "ands r5, r5, r6\n\t"
  131911. #elif defined(__clang__)
  131912. "ands r5, r6\n\t"
  131913. #else
  131914. "and r5, r6\n\t"
  131915. #endif
  131916. "cmp r5, #0\n\t"
  131917. "beq L_sp_521_num_bits_17_160_%=\n\t"
  131918. "movs r2, #0xff\n\t"
  131919. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131920. "adds r2, r2, #0xc1\n\t"
  131921. #else
  131922. "add r2, r2, #0xc1\n\t"
  131923. #endif
  131924. "ldrb r4, [%[table], r5]\n\t"
  131925. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131926. "adds r2, r2, r4\n\t"
  131927. #else
  131928. "add r2, r2, r4\n\t"
  131929. #endif
  131930. "b L_sp_521_num_bits_17_18_%=\n\t"
  131931. "\n"
  131932. "L_sp_521_num_bits_17_160_%=:\n\t"
  131933. "b L_sp_521_num_bits_17_18_%=\n\t"
  131934. "\n"
  131935. "L_sp_521_num_bits_17_14_%=:\n\t"
  131936. "ldr r3, [%[a], #52]\n\t"
  131937. "cmp r3, #0\n\t"
  131938. "beq L_sp_521_num_bits_17_13_%=\n\t"
  131939. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131940. "lsrs r5, r3, #24\n\t"
  131941. #else
  131942. "lsr r5, r3, #24\n\t"
  131943. #endif
  131944. "cmp r5, #0\n\t"
  131945. "beq L_sp_521_num_bits_17_153_%=\n\t"
  131946. "movs r2, #0xff\n\t"
  131947. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131948. "adds r2, r2, #0xb9\n\t"
  131949. #else
  131950. "add r2, r2, #0xb9\n\t"
  131951. #endif
  131952. "ldrb r4, [%[table], r5]\n\t"
  131953. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131954. "adds r2, r2, r4\n\t"
  131955. #else
  131956. "add r2, r2, r4\n\t"
  131957. #endif
  131958. "b L_sp_521_num_bits_17_18_%=\n\t"
  131959. "\n"
  131960. "L_sp_521_num_bits_17_153_%=:\n\t"
  131961. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131962. "lsrs r5, r3, #16\n\t"
  131963. #else
  131964. "lsr r5, r3, #16\n\t"
  131965. #endif
  131966. #ifdef WOLFSSL_KEIL
  131967. "ands r5, r5, r6\n\t"
  131968. #elif defined(__clang__)
  131969. "ands r5, r6\n\t"
  131970. #else
  131971. "and r5, r6\n\t"
  131972. #endif
  131973. "cmp r5, #0\n\t"
  131974. "beq L_sp_521_num_bits_17_152_%=\n\t"
  131975. "movs r2, #0xff\n\t"
  131976. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131977. "adds r2, r2, #0xb1\n\t"
  131978. #else
  131979. "add r2, r2, #0xb1\n\t"
  131980. #endif
  131981. "ldrb r4, [%[table], r5]\n\t"
  131982. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131983. "adds r2, r2, r4\n\t"
  131984. #else
  131985. "add r2, r2, r4\n\t"
  131986. #endif
  131987. "b L_sp_521_num_bits_17_18_%=\n\t"
  131988. "\n"
  131989. "L_sp_521_num_bits_17_152_%=:\n\t"
  131990. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131991. "lsrs r5, r3, #8\n\t"
  131992. #else
  131993. "lsr r5, r3, #8\n\t"
  131994. #endif
  131995. #ifdef WOLFSSL_KEIL
  131996. "ands r5, r5, r6\n\t"
  131997. #elif defined(__clang__)
  131998. "ands r5, r6\n\t"
  131999. #else
  132000. "and r5, r6\n\t"
  132001. #endif
  132002. "cmp r5, #0\n\t"
  132003. "beq L_sp_521_num_bits_17_151_%=\n\t"
  132004. "movs r2, #0xff\n\t"
  132005. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132006. "adds r2, r2, #0xa9\n\t"
  132007. #else
  132008. "add r2, r2, #0xa9\n\t"
  132009. #endif
  132010. "ldrb r4, [%[table], r5]\n\t"
  132011. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132012. "adds r2, r2, r4\n\t"
  132013. #else
  132014. "add r2, r2, r4\n\t"
  132015. #endif
  132016. "b L_sp_521_num_bits_17_18_%=\n\t"
  132017. "\n"
  132018. "L_sp_521_num_bits_17_151_%=:\n\t"
  132019. "movs r5, r3\n\t"
  132020. #ifdef WOLFSSL_KEIL
  132021. "ands r5, r5, r6\n\t"
  132022. #elif defined(__clang__)
  132023. "ands r5, r6\n\t"
  132024. #else
  132025. "and r5, r6\n\t"
  132026. #endif
  132027. "cmp r5, #0\n\t"
  132028. "beq L_sp_521_num_bits_17_150_%=\n\t"
  132029. "movs r2, #0xff\n\t"
  132030. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132031. "adds r2, r2, #0xa1\n\t"
  132032. #else
  132033. "add r2, r2, #0xa1\n\t"
  132034. #endif
  132035. "ldrb r4, [%[table], r5]\n\t"
  132036. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132037. "adds r2, r2, r4\n\t"
  132038. #else
  132039. "add r2, r2, r4\n\t"
  132040. #endif
  132041. "b L_sp_521_num_bits_17_18_%=\n\t"
  132042. "\n"
  132043. "L_sp_521_num_bits_17_150_%=:\n\t"
  132044. "b L_sp_521_num_bits_17_18_%=\n\t"
  132045. "\n"
  132046. "L_sp_521_num_bits_17_13_%=:\n\t"
  132047. "ldr r3, [%[a], #48]\n\t"
  132048. "cmp r3, #0\n\t"
  132049. "beq L_sp_521_num_bits_17_12_%=\n\t"
  132050. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132051. "lsrs r5, r3, #24\n\t"
  132052. #else
  132053. "lsr r5, r3, #24\n\t"
  132054. #endif
  132055. "cmp r5, #0\n\t"
  132056. "beq L_sp_521_num_bits_17_143_%=\n\t"
  132057. "movs r2, #0xff\n\t"
  132058. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132059. "adds r2, r2, #0x99\n\t"
  132060. #else
  132061. "add r2, r2, #0x99\n\t"
  132062. #endif
  132063. "ldrb r4, [%[table], r5]\n\t"
  132064. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132065. "adds r2, r2, r4\n\t"
  132066. #else
  132067. "add r2, r2, r4\n\t"
  132068. #endif
  132069. "b L_sp_521_num_bits_17_18_%=\n\t"
  132070. "\n"
  132071. "L_sp_521_num_bits_17_143_%=:\n\t"
  132072. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132073. "lsrs r5, r3, #16\n\t"
  132074. #else
  132075. "lsr r5, r3, #16\n\t"
  132076. #endif
  132077. #ifdef WOLFSSL_KEIL
  132078. "ands r5, r5, r6\n\t"
  132079. #elif defined(__clang__)
  132080. "ands r5, r6\n\t"
  132081. #else
  132082. "and r5, r6\n\t"
  132083. #endif
  132084. "cmp r5, #0\n\t"
  132085. "beq L_sp_521_num_bits_17_142_%=\n\t"
  132086. "movs r2, #0xff\n\t"
  132087. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132088. "adds r2, r2, #0x91\n\t"
  132089. #else
  132090. "add r2, r2, #0x91\n\t"
  132091. #endif
  132092. "ldrb r4, [%[table], r5]\n\t"
  132093. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132094. "adds r2, r2, r4\n\t"
  132095. #else
  132096. "add r2, r2, r4\n\t"
  132097. #endif
  132098. "b L_sp_521_num_bits_17_18_%=\n\t"
  132099. "\n"
  132100. "L_sp_521_num_bits_17_142_%=:\n\t"
  132101. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132102. "lsrs r5, r3, #8\n\t"
  132103. #else
  132104. "lsr r5, r3, #8\n\t"
  132105. #endif
  132106. #ifdef WOLFSSL_KEIL
  132107. "ands r5, r5, r6\n\t"
  132108. #elif defined(__clang__)
  132109. "ands r5, r6\n\t"
  132110. #else
  132111. "and r5, r6\n\t"
  132112. #endif
  132113. "cmp r5, #0\n\t"
  132114. "beq L_sp_521_num_bits_17_141_%=\n\t"
  132115. "movs r2, #0xff\n\t"
  132116. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132117. "adds r2, r2, #0x89\n\t"
  132118. #else
  132119. "add r2, r2, #0x89\n\t"
  132120. #endif
  132121. "ldrb r4, [%[table], r5]\n\t"
  132122. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132123. "adds r2, r2, r4\n\t"
  132124. #else
  132125. "add r2, r2, r4\n\t"
  132126. #endif
  132127. "b L_sp_521_num_bits_17_18_%=\n\t"
  132128. "\n"
  132129. "L_sp_521_num_bits_17_141_%=:\n\t"
  132130. "movs r5, r3\n\t"
  132131. #ifdef WOLFSSL_KEIL
  132132. "ands r5, r5, r6\n\t"
  132133. #elif defined(__clang__)
  132134. "ands r5, r6\n\t"
  132135. #else
  132136. "and r5, r6\n\t"
  132137. #endif
  132138. "cmp r5, #0\n\t"
  132139. "beq L_sp_521_num_bits_17_140_%=\n\t"
  132140. "movs r2, #0xff\n\t"
  132141. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132142. "adds r2, r2, #0x81\n\t"
  132143. #else
  132144. "add r2, r2, #0x81\n\t"
  132145. #endif
  132146. "ldrb r4, [%[table], r5]\n\t"
  132147. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132148. "adds r2, r2, r4\n\t"
  132149. #else
  132150. "add r2, r2, r4\n\t"
  132151. #endif
  132152. "b L_sp_521_num_bits_17_18_%=\n\t"
  132153. "\n"
  132154. "L_sp_521_num_bits_17_140_%=:\n\t"
  132155. "b L_sp_521_num_bits_17_18_%=\n\t"
  132156. "\n"
  132157. "L_sp_521_num_bits_17_12_%=:\n\t"
  132158. "ldr r3, [%[a], #44]\n\t"
  132159. "cmp r3, #0\n\t"
  132160. "beq L_sp_521_num_bits_17_11_%=\n\t"
  132161. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132162. "lsrs r5, r3, #24\n\t"
  132163. #else
  132164. "lsr r5, r3, #24\n\t"
  132165. #endif
  132166. "cmp r5, #0\n\t"
  132167. "beq L_sp_521_num_bits_17_133_%=\n\t"
  132168. "movs r2, #0xff\n\t"
  132169. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132170. "adds r2, r2, #0x79\n\t"
  132171. #else
  132172. "add r2, r2, #0x79\n\t"
  132173. #endif
  132174. "ldrb r4, [%[table], r5]\n\t"
  132175. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132176. "adds r2, r2, r4\n\t"
  132177. #else
  132178. "add r2, r2, r4\n\t"
  132179. #endif
  132180. "b L_sp_521_num_bits_17_18_%=\n\t"
  132181. "\n"
  132182. "L_sp_521_num_bits_17_133_%=:\n\t"
  132183. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132184. "lsrs r5, r3, #16\n\t"
  132185. #else
  132186. "lsr r5, r3, #16\n\t"
  132187. #endif
  132188. #ifdef WOLFSSL_KEIL
  132189. "ands r5, r5, r6\n\t"
  132190. #elif defined(__clang__)
  132191. "ands r5, r6\n\t"
  132192. #else
  132193. "and r5, r6\n\t"
  132194. #endif
  132195. "cmp r5, #0\n\t"
  132196. "beq L_sp_521_num_bits_17_132_%=\n\t"
  132197. "movs r2, #0xff\n\t"
  132198. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132199. "adds r2, r2, #0x71\n\t"
  132200. #else
  132201. "add r2, r2, #0x71\n\t"
  132202. #endif
  132203. "ldrb r4, [%[table], r5]\n\t"
  132204. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132205. "adds r2, r2, r4\n\t"
  132206. #else
  132207. "add r2, r2, r4\n\t"
  132208. #endif
  132209. "b L_sp_521_num_bits_17_18_%=\n\t"
  132210. "\n"
  132211. "L_sp_521_num_bits_17_132_%=:\n\t"
  132212. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132213. "lsrs r5, r3, #8\n\t"
  132214. #else
  132215. "lsr r5, r3, #8\n\t"
  132216. #endif
  132217. #ifdef WOLFSSL_KEIL
  132218. "ands r5, r5, r6\n\t"
  132219. #elif defined(__clang__)
  132220. "ands r5, r6\n\t"
  132221. #else
  132222. "and r5, r6\n\t"
  132223. #endif
  132224. "cmp r5, #0\n\t"
  132225. "beq L_sp_521_num_bits_17_131_%=\n\t"
  132226. "movs r2, #0xff\n\t"
  132227. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132228. "adds r2, r2, #0x69\n\t"
  132229. #else
  132230. "add r2, r2, #0x69\n\t"
  132231. #endif
  132232. "ldrb r4, [%[table], r5]\n\t"
  132233. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132234. "adds r2, r2, r4\n\t"
  132235. #else
  132236. "add r2, r2, r4\n\t"
  132237. #endif
  132238. "b L_sp_521_num_bits_17_18_%=\n\t"
  132239. "\n"
  132240. "L_sp_521_num_bits_17_131_%=:\n\t"
  132241. "movs r5, r3\n\t"
  132242. #ifdef WOLFSSL_KEIL
  132243. "ands r5, r5, r6\n\t"
  132244. #elif defined(__clang__)
  132245. "ands r5, r6\n\t"
  132246. #else
  132247. "and r5, r6\n\t"
  132248. #endif
  132249. "cmp r5, #0\n\t"
  132250. "beq L_sp_521_num_bits_17_130_%=\n\t"
  132251. "movs r2, #0xff\n\t"
  132252. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132253. "adds r2, r2, #0x61\n\t"
  132254. #else
  132255. "add r2, r2, #0x61\n\t"
  132256. #endif
  132257. "ldrb r4, [%[table], r5]\n\t"
  132258. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132259. "adds r2, r2, r4\n\t"
  132260. #else
  132261. "add r2, r2, r4\n\t"
  132262. #endif
  132263. "b L_sp_521_num_bits_17_18_%=\n\t"
  132264. "\n"
  132265. "L_sp_521_num_bits_17_130_%=:\n\t"
  132266. "b L_sp_521_num_bits_17_18_%=\n\t"
  132267. "\n"
  132268. "L_sp_521_num_bits_17_11_%=:\n\t"
  132269. "ldr r3, [%[a], #40]\n\t"
  132270. "cmp r3, #0\n\t"
  132271. "beq L_sp_521_num_bits_17_10_%=\n\t"
  132272. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132273. "lsrs r5, r3, #24\n\t"
  132274. #else
  132275. "lsr r5, r3, #24\n\t"
  132276. #endif
  132277. "cmp r5, #0\n\t"
  132278. "beq L_sp_521_num_bits_17_123_%=\n\t"
  132279. "movs r2, #0xff\n\t"
  132280. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132281. "adds r2, r2, #0x59\n\t"
  132282. #else
  132283. "add r2, r2, #0x59\n\t"
  132284. #endif
  132285. "ldrb r4, [%[table], r5]\n\t"
  132286. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132287. "adds r2, r2, r4\n\t"
  132288. #else
  132289. "add r2, r2, r4\n\t"
  132290. #endif
  132291. "b L_sp_521_num_bits_17_18_%=\n\t"
  132292. "\n"
  132293. "L_sp_521_num_bits_17_123_%=:\n\t"
  132294. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132295. "lsrs r5, r3, #16\n\t"
  132296. #else
  132297. "lsr r5, r3, #16\n\t"
  132298. #endif
  132299. #ifdef WOLFSSL_KEIL
  132300. "ands r5, r5, r6\n\t"
  132301. #elif defined(__clang__)
  132302. "ands r5, r6\n\t"
  132303. #else
  132304. "and r5, r6\n\t"
  132305. #endif
  132306. "cmp r5, #0\n\t"
  132307. "beq L_sp_521_num_bits_17_122_%=\n\t"
  132308. "movs r2, #0xff\n\t"
  132309. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132310. "adds r2, r2, #0x51\n\t"
  132311. #else
  132312. "add r2, r2, #0x51\n\t"
  132313. #endif
  132314. "ldrb r4, [%[table], r5]\n\t"
  132315. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132316. "adds r2, r2, r4\n\t"
  132317. #else
  132318. "add r2, r2, r4\n\t"
  132319. #endif
  132320. "b L_sp_521_num_bits_17_18_%=\n\t"
  132321. "\n"
  132322. "L_sp_521_num_bits_17_122_%=:\n\t"
  132323. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132324. "lsrs r5, r3, #8\n\t"
  132325. #else
  132326. "lsr r5, r3, #8\n\t"
  132327. #endif
  132328. #ifdef WOLFSSL_KEIL
  132329. "ands r5, r5, r6\n\t"
  132330. #elif defined(__clang__)
  132331. "ands r5, r6\n\t"
  132332. #else
  132333. "and r5, r6\n\t"
  132334. #endif
  132335. "cmp r5, #0\n\t"
  132336. "beq L_sp_521_num_bits_17_121_%=\n\t"
  132337. "movs r2, #0xff\n\t"
  132338. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132339. "adds r2, r2, #0x49\n\t"
  132340. #else
  132341. "add r2, r2, #0x49\n\t"
  132342. #endif
  132343. "ldrb r4, [%[table], r5]\n\t"
  132344. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132345. "adds r2, r2, r4\n\t"
  132346. #else
  132347. "add r2, r2, r4\n\t"
  132348. #endif
  132349. "b L_sp_521_num_bits_17_18_%=\n\t"
  132350. "\n"
  132351. "L_sp_521_num_bits_17_121_%=:\n\t"
  132352. "movs r5, r3\n\t"
  132353. #ifdef WOLFSSL_KEIL
  132354. "ands r5, r5, r6\n\t"
  132355. #elif defined(__clang__)
  132356. "ands r5, r6\n\t"
  132357. #else
  132358. "and r5, r6\n\t"
  132359. #endif
  132360. "cmp r5, #0\n\t"
  132361. "beq L_sp_521_num_bits_17_120_%=\n\t"
  132362. "movs r2, #0xff\n\t"
  132363. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132364. "adds r2, r2, #0x41\n\t"
  132365. #else
  132366. "add r2, r2, #0x41\n\t"
  132367. #endif
  132368. "ldrb r4, [%[table], r5]\n\t"
  132369. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132370. "adds r2, r2, r4\n\t"
  132371. #else
  132372. "add r2, r2, r4\n\t"
  132373. #endif
  132374. "b L_sp_521_num_bits_17_18_%=\n\t"
  132375. "\n"
  132376. "L_sp_521_num_bits_17_120_%=:\n\t"
  132377. "b L_sp_521_num_bits_17_18_%=\n\t"
  132378. "\n"
  132379. "L_sp_521_num_bits_17_10_%=:\n\t"
  132380. "ldr r3, [%[a], #36]\n\t"
  132381. "cmp r3, #0\n\t"
  132382. "beq L_sp_521_num_bits_17_9_%=\n\t"
  132383. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132384. "lsrs r5, r3, #24\n\t"
  132385. #else
  132386. "lsr r5, r3, #24\n\t"
  132387. #endif
  132388. "cmp r5, #0\n\t"
  132389. "beq L_sp_521_num_bits_17_113_%=\n\t"
  132390. "movs r2, #0xff\n\t"
  132391. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132392. "adds r2, r2, #57\n\t"
  132393. #else
  132394. "add r2, r2, #57\n\t"
  132395. #endif
  132396. "ldrb r4, [%[table], r5]\n\t"
  132397. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132398. "adds r2, r2, r4\n\t"
  132399. #else
  132400. "add r2, r2, r4\n\t"
  132401. #endif
  132402. "b L_sp_521_num_bits_17_18_%=\n\t"
  132403. "\n"
  132404. "L_sp_521_num_bits_17_113_%=:\n\t"
  132405. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132406. "lsrs r5, r3, #16\n\t"
  132407. #else
  132408. "lsr r5, r3, #16\n\t"
  132409. #endif
  132410. #ifdef WOLFSSL_KEIL
  132411. "ands r5, r5, r6\n\t"
  132412. #elif defined(__clang__)
  132413. "ands r5, r6\n\t"
  132414. #else
  132415. "and r5, r6\n\t"
  132416. #endif
  132417. "cmp r5, #0\n\t"
  132418. "beq L_sp_521_num_bits_17_112_%=\n\t"
  132419. "movs r2, #0xff\n\t"
  132420. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132421. "adds r2, r2, #49\n\t"
  132422. #else
  132423. "add r2, r2, #49\n\t"
  132424. #endif
  132425. "ldrb r4, [%[table], r5]\n\t"
  132426. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132427. "adds r2, r2, r4\n\t"
  132428. #else
  132429. "add r2, r2, r4\n\t"
  132430. #endif
  132431. "b L_sp_521_num_bits_17_18_%=\n\t"
  132432. "\n"
  132433. "L_sp_521_num_bits_17_112_%=:\n\t"
  132434. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132435. "lsrs r5, r3, #8\n\t"
  132436. #else
  132437. "lsr r5, r3, #8\n\t"
  132438. #endif
  132439. #ifdef WOLFSSL_KEIL
  132440. "ands r5, r5, r6\n\t"
  132441. #elif defined(__clang__)
  132442. "ands r5, r6\n\t"
  132443. #else
  132444. "and r5, r6\n\t"
  132445. #endif
  132446. "cmp r5, #0\n\t"
  132447. "beq L_sp_521_num_bits_17_111_%=\n\t"
  132448. "movs r2, #0xff\n\t"
  132449. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132450. "adds r2, r2, #41\n\t"
  132451. #else
  132452. "add r2, r2, #41\n\t"
  132453. #endif
  132454. "ldrb r4, [%[table], r5]\n\t"
  132455. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132456. "adds r2, r2, r4\n\t"
  132457. #else
  132458. "add r2, r2, r4\n\t"
  132459. #endif
  132460. "b L_sp_521_num_bits_17_18_%=\n\t"
  132461. "\n"
  132462. "L_sp_521_num_bits_17_111_%=:\n\t"
  132463. "movs r5, r3\n\t"
  132464. #ifdef WOLFSSL_KEIL
  132465. "ands r5, r5, r6\n\t"
  132466. #elif defined(__clang__)
  132467. "ands r5, r6\n\t"
  132468. #else
  132469. "and r5, r6\n\t"
  132470. #endif
  132471. "cmp r5, #0\n\t"
  132472. "beq L_sp_521_num_bits_17_110_%=\n\t"
  132473. "movs r2, #0xff\n\t"
  132474. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132475. "adds r2, r2, #33\n\t"
  132476. #else
  132477. "add r2, r2, #33\n\t"
  132478. #endif
  132479. "ldrb r4, [%[table], r5]\n\t"
  132480. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132481. "adds r2, r2, r4\n\t"
  132482. #else
  132483. "add r2, r2, r4\n\t"
  132484. #endif
  132485. "b L_sp_521_num_bits_17_18_%=\n\t"
  132486. "\n"
  132487. "L_sp_521_num_bits_17_110_%=:\n\t"
  132488. "b L_sp_521_num_bits_17_18_%=\n\t"
  132489. "\n"
  132490. "L_sp_521_num_bits_17_9_%=:\n\t"
  132491. "ldr r3, [%[a], #32]\n\t"
  132492. "cmp r3, #0\n\t"
  132493. "beq L_sp_521_num_bits_17_8_%=\n\t"
  132494. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132495. "lsrs r5, r3, #24\n\t"
  132496. #else
  132497. "lsr r5, r3, #24\n\t"
  132498. #endif
  132499. "cmp r5, #0\n\t"
  132500. "beq L_sp_521_num_bits_17_103_%=\n\t"
  132501. "movs r2, #0xff\n\t"
  132502. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132503. "adds r2, r2, #25\n\t"
  132504. #else
  132505. "add r2, r2, #25\n\t"
  132506. #endif
  132507. "ldrb r4, [%[table], r5]\n\t"
  132508. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132509. "adds r2, r2, r4\n\t"
  132510. #else
  132511. "add r2, r2, r4\n\t"
  132512. #endif
  132513. "b L_sp_521_num_bits_17_18_%=\n\t"
  132514. "\n"
  132515. "L_sp_521_num_bits_17_103_%=:\n\t"
  132516. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132517. "lsrs r5, r3, #16\n\t"
  132518. #else
  132519. "lsr r5, r3, #16\n\t"
  132520. #endif
  132521. #ifdef WOLFSSL_KEIL
  132522. "ands r5, r5, r6\n\t"
  132523. #elif defined(__clang__)
  132524. "ands r5, r6\n\t"
  132525. #else
  132526. "and r5, r6\n\t"
  132527. #endif
  132528. "cmp r5, #0\n\t"
  132529. "beq L_sp_521_num_bits_17_102_%=\n\t"
  132530. "movs r2, #0xff\n\t"
  132531. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132532. "adds r2, r2, #17\n\t"
  132533. #else
  132534. "add r2, r2, #17\n\t"
  132535. #endif
  132536. "ldrb r4, [%[table], r5]\n\t"
  132537. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132538. "adds r2, r2, r4\n\t"
  132539. #else
  132540. "add r2, r2, r4\n\t"
  132541. #endif
  132542. "b L_sp_521_num_bits_17_18_%=\n\t"
  132543. "\n"
  132544. "L_sp_521_num_bits_17_102_%=:\n\t"
  132545. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132546. "lsrs r5, r3, #8\n\t"
  132547. #else
  132548. "lsr r5, r3, #8\n\t"
  132549. #endif
  132550. #ifdef WOLFSSL_KEIL
  132551. "ands r5, r5, r6\n\t"
  132552. #elif defined(__clang__)
  132553. "ands r5, r6\n\t"
  132554. #else
  132555. "and r5, r6\n\t"
  132556. #endif
  132557. "cmp r5, #0\n\t"
  132558. "beq L_sp_521_num_bits_17_101_%=\n\t"
  132559. "movs r2, #0xff\n\t"
  132560. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132561. "adds r2, r2, #9\n\t"
  132562. #else
  132563. "add r2, r2, #9\n\t"
  132564. #endif
  132565. "ldrb r4, [%[table], r5]\n\t"
  132566. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132567. "adds r2, r2, r4\n\t"
  132568. #else
  132569. "add r2, r2, r4\n\t"
  132570. #endif
  132571. "b L_sp_521_num_bits_17_18_%=\n\t"
  132572. "\n"
  132573. "L_sp_521_num_bits_17_101_%=:\n\t"
  132574. "movs r5, r3\n\t"
  132575. #ifdef WOLFSSL_KEIL
  132576. "ands r5, r5, r6\n\t"
  132577. #elif defined(__clang__)
  132578. "ands r5, r6\n\t"
  132579. #else
  132580. "and r5, r6\n\t"
  132581. #endif
  132582. "cmp r5, #0\n\t"
  132583. "beq L_sp_521_num_bits_17_100_%=\n\t"
  132584. "movs r2, #0xff\n\t"
  132585. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132586. "adds r2, r2, #1\n\t"
  132587. #else
  132588. "add r2, r2, #1\n\t"
  132589. #endif
  132590. "ldrb r4, [%[table], r5]\n\t"
  132591. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132592. "adds r2, r2, r4\n\t"
  132593. #else
  132594. "add r2, r2, r4\n\t"
  132595. #endif
  132596. "b L_sp_521_num_bits_17_18_%=\n\t"
  132597. "\n"
  132598. "L_sp_521_num_bits_17_100_%=:\n\t"
  132599. "b L_sp_521_num_bits_17_18_%=\n\t"
  132600. "\n"
  132601. "L_sp_521_num_bits_17_8_%=:\n\t"
  132602. "ldr r3, [%[a], #28]\n\t"
  132603. "cmp r3, #0\n\t"
  132604. "beq L_sp_521_num_bits_17_7_%=\n\t"
  132605. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132606. "lsrs r5, r3, #24\n\t"
  132607. #else
  132608. "lsr r5, r3, #24\n\t"
  132609. #endif
  132610. "cmp r5, #0\n\t"
  132611. "beq L_sp_521_num_bits_17_93_%=\n\t"
  132612. "movs r2, #0xf8\n\t"
  132613. "ldrb r4, [%[table], r5]\n\t"
  132614. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132615. "adds r2, r2, r4\n\t"
  132616. #else
  132617. "add r2, r2, r4\n\t"
  132618. #endif
  132619. "b L_sp_521_num_bits_17_18_%=\n\t"
  132620. "\n"
  132621. "L_sp_521_num_bits_17_93_%=:\n\t"
  132622. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132623. "lsrs r5, r3, #16\n\t"
  132624. #else
  132625. "lsr r5, r3, #16\n\t"
  132626. #endif
  132627. #ifdef WOLFSSL_KEIL
  132628. "ands r5, r5, r6\n\t"
  132629. #elif defined(__clang__)
  132630. "ands r5, r6\n\t"
  132631. #else
  132632. "and r5, r6\n\t"
  132633. #endif
  132634. "cmp r5, #0\n\t"
  132635. "beq L_sp_521_num_bits_17_92_%=\n\t"
  132636. "movs r2, #0xf0\n\t"
  132637. "ldrb r4, [%[table], r5]\n\t"
  132638. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132639. "adds r2, r2, r4\n\t"
  132640. #else
  132641. "add r2, r2, r4\n\t"
  132642. #endif
  132643. "b L_sp_521_num_bits_17_18_%=\n\t"
  132644. "\n"
  132645. "L_sp_521_num_bits_17_92_%=:\n\t"
  132646. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132647. "lsrs r5, r3, #8\n\t"
  132648. #else
  132649. "lsr r5, r3, #8\n\t"
  132650. #endif
  132651. #ifdef WOLFSSL_KEIL
  132652. "ands r5, r5, r6\n\t"
  132653. #elif defined(__clang__)
  132654. "ands r5, r6\n\t"
  132655. #else
  132656. "and r5, r6\n\t"
  132657. #endif
  132658. "cmp r5, #0\n\t"
  132659. "beq L_sp_521_num_bits_17_91_%=\n\t"
  132660. "movs r2, #0xe8\n\t"
  132661. "ldrb r4, [%[table], r5]\n\t"
  132662. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132663. "adds r2, r2, r4\n\t"
  132664. #else
  132665. "add r2, r2, r4\n\t"
  132666. #endif
  132667. "b L_sp_521_num_bits_17_18_%=\n\t"
  132668. "\n"
  132669. "L_sp_521_num_bits_17_91_%=:\n\t"
  132670. "movs r5, r3\n\t"
  132671. #ifdef WOLFSSL_KEIL
  132672. "ands r5, r5, r6\n\t"
  132673. #elif defined(__clang__)
  132674. "ands r5, r6\n\t"
  132675. #else
  132676. "and r5, r6\n\t"
  132677. #endif
  132678. "cmp r5, #0\n\t"
  132679. "beq L_sp_521_num_bits_17_90_%=\n\t"
  132680. "movs r2, #0xe0\n\t"
  132681. "ldrb r4, [%[table], r5]\n\t"
  132682. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132683. "adds r2, r2, r4\n\t"
  132684. #else
  132685. "add r2, r2, r4\n\t"
  132686. #endif
  132687. "b L_sp_521_num_bits_17_18_%=\n\t"
  132688. "\n"
  132689. "L_sp_521_num_bits_17_90_%=:\n\t"
  132690. "b L_sp_521_num_bits_17_18_%=\n\t"
  132691. "\n"
  132692. "L_sp_521_num_bits_17_7_%=:\n\t"
  132693. "ldr r3, [%[a], #24]\n\t"
  132694. "cmp r3, #0\n\t"
  132695. "beq L_sp_521_num_bits_17_6_%=\n\t"
  132696. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132697. "lsrs r5, r3, #24\n\t"
  132698. #else
  132699. "lsr r5, r3, #24\n\t"
  132700. #endif
  132701. "cmp r5, #0\n\t"
  132702. "beq L_sp_521_num_bits_17_83_%=\n\t"
  132703. "movs r2, #0xd8\n\t"
  132704. "ldrb r4, [%[table], r5]\n\t"
  132705. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132706. "adds r2, r2, r4\n\t"
  132707. #else
  132708. "add r2, r2, r4\n\t"
  132709. #endif
  132710. "b L_sp_521_num_bits_17_18_%=\n\t"
  132711. "\n"
  132712. "L_sp_521_num_bits_17_83_%=:\n\t"
  132713. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132714. "lsrs r5, r3, #16\n\t"
  132715. #else
  132716. "lsr r5, r3, #16\n\t"
  132717. #endif
  132718. #ifdef WOLFSSL_KEIL
  132719. "ands r5, r5, r6\n\t"
  132720. #elif defined(__clang__)
  132721. "ands r5, r6\n\t"
  132722. #else
  132723. "and r5, r6\n\t"
  132724. #endif
  132725. "cmp r5, #0\n\t"
  132726. "beq L_sp_521_num_bits_17_82_%=\n\t"
  132727. "movs r2, #0xd0\n\t"
  132728. "ldrb r4, [%[table], r5]\n\t"
  132729. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132730. "adds r2, r2, r4\n\t"
  132731. #else
  132732. "add r2, r2, r4\n\t"
  132733. #endif
  132734. "b L_sp_521_num_bits_17_18_%=\n\t"
  132735. "\n"
  132736. "L_sp_521_num_bits_17_82_%=:\n\t"
  132737. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132738. "lsrs r5, r3, #8\n\t"
  132739. #else
  132740. "lsr r5, r3, #8\n\t"
  132741. #endif
  132742. #ifdef WOLFSSL_KEIL
  132743. "ands r5, r5, r6\n\t"
  132744. #elif defined(__clang__)
  132745. "ands r5, r6\n\t"
  132746. #else
  132747. "and r5, r6\n\t"
  132748. #endif
  132749. "cmp r5, #0\n\t"
  132750. "beq L_sp_521_num_bits_17_81_%=\n\t"
  132751. "movs r2, #0xc8\n\t"
  132752. "ldrb r4, [%[table], r5]\n\t"
  132753. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132754. "adds r2, r2, r4\n\t"
  132755. #else
  132756. "add r2, r2, r4\n\t"
  132757. #endif
  132758. "b L_sp_521_num_bits_17_18_%=\n\t"
  132759. "\n"
  132760. "L_sp_521_num_bits_17_81_%=:\n\t"
  132761. "movs r5, r3\n\t"
  132762. #ifdef WOLFSSL_KEIL
  132763. "ands r5, r5, r6\n\t"
  132764. #elif defined(__clang__)
  132765. "ands r5, r6\n\t"
  132766. #else
  132767. "and r5, r6\n\t"
  132768. #endif
  132769. "cmp r5, #0\n\t"
  132770. "beq L_sp_521_num_bits_17_80_%=\n\t"
  132771. "movs r2, #0xc0\n\t"
  132772. "ldrb r4, [%[table], r5]\n\t"
  132773. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132774. "adds r2, r2, r4\n\t"
  132775. #else
  132776. "add r2, r2, r4\n\t"
  132777. #endif
  132778. "b L_sp_521_num_bits_17_18_%=\n\t"
  132779. "\n"
  132780. "L_sp_521_num_bits_17_80_%=:\n\t"
  132781. "b L_sp_521_num_bits_17_18_%=\n\t"
  132782. "\n"
  132783. "L_sp_521_num_bits_17_6_%=:\n\t"
  132784. "ldr r3, [%[a], #20]\n\t"
  132785. "cmp r3, #0\n\t"
  132786. "beq L_sp_521_num_bits_17_5_%=\n\t"
  132787. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132788. "lsrs r5, r3, #24\n\t"
  132789. #else
  132790. "lsr r5, r3, #24\n\t"
  132791. #endif
  132792. "cmp r5, #0\n\t"
  132793. "beq L_sp_521_num_bits_17_73_%=\n\t"
  132794. "movs r2, #0xb8\n\t"
  132795. "ldrb r4, [%[table], r5]\n\t"
  132796. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132797. "adds r2, r2, r4\n\t"
  132798. #else
  132799. "add r2, r2, r4\n\t"
  132800. #endif
  132801. "b L_sp_521_num_bits_17_18_%=\n\t"
  132802. "\n"
  132803. "L_sp_521_num_bits_17_73_%=:\n\t"
  132804. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132805. "lsrs r5, r3, #16\n\t"
  132806. #else
  132807. "lsr r5, r3, #16\n\t"
  132808. #endif
  132809. #ifdef WOLFSSL_KEIL
  132810. "ands r5, r5, r6\n\t"
  132811. #elif defined(__clang__)
  132812. "ands r5, r6\n\t"
  132813. #else
  132814. "and r5, r6\n\t"
  132815. #endif
  132816. "cmp r5, #0\n\t"
  132817. "beq L_sp_521_num_bits_17_72_%=\n\t"
  132818. "movs r2, #0xb0\n\t"
  132819. "ldrb r4, [%[table], r5]\n\t"
  132820. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132821. "adds r2, r2, r4\n\t"
  132822. #else
  132823. "add r2, r2, r4\n\t"
  132824. #endif
  132825. "b L_sp_521_num_bits_17_18_%=\n\t"
  132826. "\n"
  132827. "L_sp_521_num_bits_17_72_%=:\n\t"
  132828. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132829. "lsrs r5, r3, #8\n\t"
  132830. #else
  132831. "lsr r5, r3, #8\n\t"
  132832. #endif
  132833. #ifdef WOLFSSL_KEIL
  132834. "ands r5, r5, r6\n\t"
  132835. #elif defined(__clang__)
  132836. "ands r5, r6\n\t"
  132837. #else
  132838. "and r5, r6\n\t"
  132839. #endif
  132840. "cmp r5, #0\n\t"
  132841. "beq L_sp_521_num_bits_17_71_%=\n\t"
  132842. "movs r2, #0xa8\n\t"
  132843. "ldrb r4, [%[table], r5]\n\t"
  132844. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132845. "adds r2, r2, r4\n\t"
  132846. #else
  132847. "add r2, r2, r4\n\t"
  132848. #endif
  132849. "b L_sp_521_num_bits_17_18_%=\n\t"
  132850. "\n"
  132851. "L_sp_521_num_bits_17_71_%=:\n\t"
  132852. "movs r5, r3\n\t"
  132853. #ifdef WOLFSSL_KEIL
  132854. "ands r5, r5, r6\n\t"
  132855. #elif defined(__clang__)
  132856. "ands r5, r6\n\t"
  132857. #else
  132858. "and r5, r6\n\t"
  132859. #endif
  132860. "cmp r5, #0\n\t"
  132861. "beq L_sp_521_num_bits_17_70_%=\n\t"
  132862. "movs r2, #0xa0\n\t"
  132863. "ldrb r4, [%[table], r5]\n\t"
  132864. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132865. "adds r2, r2, r4\n\t"
  132866. #else
  132867. "add r2, r2, r4\n\t"
  132868. #endif
  132869. "b L_sp_521_num_bits_17_18_%=\n\t"
  132870. "\n"
  132871. "L_sp_521_num_bits_17_70_%=:\n\t"
  132872. "b L_sp_521_num_bits_17_18_%=\n\t"
  132873. "\n"
  132874. "L_sp_521_num_bits_17_5_%=:\n\t"
  132875. "ldr r3, [%[a], #16]\n\t"
  132876. "cmp r3, #0\n\t"
  132877. "beq L_sp_521_num_bits_17_4_%=\n\t"
  132878. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132879. "lsrs r5, r3, #24\n\t"
  132880. #else
  132881. "lsr r5, r3, #24\n\t"
  132882. #endif
  132883. "cmp r5, #0\n\t"
  132884. "beq L_sp_521_num_bits_17_63_%=\n\t"
  132885. "movs r2, #0x98\n\t"
  132886. "ldrb r4, [%[table], r5]\n\t"
  132887. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132888. "adds r2, r2, r4\n\t"
  132889. #else
  132890. "add r2, r2, r4\n\t"
  132891. #endif
  132892. "b L_sp_521_num_bits_17_18_%=\n\t"
  132893. "\n"
  132894. "L_sp_521_num_bits_17_63_%=:\n\t"
  132895. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132896. "lsrs r5, r3, #16\n\t"
  132897. #else
  132898. "lsr r5, r3, #16\n\t"
  132899. #endif
  132900. #ifdef WOLFSSL_KEIL
  132901. "ands r5, r5, r6\n\t"
  132902. #elif defined(__clang__)
  132903. "ands r5, r6\n\t"
  132904. #else
  132905. "and r5, r6\n\t"
  132906. #endif
  132907. "cmp r5, #0\n\t"
  132908. "beq L_sp_521_num_bits_17_62_%=\n\t"
  132909. "movs r2, #0x90\n\t"
  132910. "ldrb r4, [%[table], r5]\n\t"
  132911. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132912. "adds r2, r2, r4\n\t"
  132913. #else
  132914. "add r2, r2, r4\n\t"
  132915. #endif
  132916. "b L_sp_521_num_bits_17_18_%=\n\t"
  132917. "\n"
  132918. "L_sp_521_num_bits_17_62_%=:\n\t"
  132919. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132920. "lsrs r5, r3, #8\n\t"
  132921. #else
  132922. "lsr r5, r3, #8\n\t"
  132923. #endif
  132924. #ifdef WOLFSSL_KEIL
  132925. "ands r5, r5, r6\n\t"
  132926. #elif defined(__clang__)
  132927. "ands r5, r6\n\t"
  132928. #else
  132929. "and r5, r6\n\t"
  132930. #endif
  132931. "cmp r5, #0\n\t"
  132932. "beq L_sp_521_num_bits_17_61_%=\n\t"
  132933. "movs r2, #0x88\n\t"
  132934. "ldrb r4, [%[table], r5]\n\t"
  132935. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132936. "adds r2, r2, r4\n\t"
  132937. #else
  132938. "add r2, r2, r4\n\t"
  132939. #endif
  132940. "b L_sp_521_num_bits_17_18_%=\n\t"
  132941. "\n"
  132942. "L_sp_521_num_bits_17_61_%=:\n\t"
  132943. "movs r5, r3\n\t"
  132944. #ifdef WOLFSSL_KEIL
  132945. "ands r5, r5, r6\n\t"
  132946. #elif defined(__clang__)
  132947. "ands r5, r6\n\t"
  132948. #else
  132949. "and r5, r6\n\t"
  132950. #endif
  132951. "cmp r5, #0\n\t"
  132952. "beq L_sp_521_num_bits_17_60_%=\n\t"
  132953. "movs r2, #0x80\n\t"
  132954. "ldrb r4, [%[table], r5]\n\t"
  132955. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132956. "adds r2, r2, r4\n\t"
  132957. #else
  132958. "add r2, r2, r4\n\t"
  132959. #endif
  132960. "b L_sp_521_num_bits_17_18_%=\n\t"
  132961. "\n"
  132962. "L_sp_521_num_bits_17_60_%=:\n\t"
  132963. "b L_sp_521_num_bits_17_18_%=\n\t"
  132964. "\n"
  132965. "L_sp_521_num_bits_17_4_%=:\n\t"
  132966. "ldr r3, [%[a], #12]\n\t"
  132967. "cmp r3, #0\n\t"
  132968. "beq L_sp_521_num_bits_17_3_%=\n\t"
  132969. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132970. "lsrs r5, r3, #24\n\t"
  132971. #else
  132972. "lsr r5, r3, #24\n\t"
  132973. #endif
  132974. "cmp r5, #0\n\t"
  132975. "beq L_sp_521_num_bits_17_53_%=\n\t"
  132976. "movs r2, #0x78\n\t"
  132977. "ldrb r4, [%[table], r5]\n\t"
  132978. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132979. "adds r2, r2, r4\n\t"
  132980. #else
  132981. "add r2, r2, r4\n\t"
  132982. #endif
  132983. "b L_sp_521_num_bits_17_18_%=\n\t"
  132984. "\n"
  132985. "L_sp_521_num_bits_17_53_%=:\n\t"
  132986. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132987. "lsrs r5, r3, #16\n\t"
  132988. #else
  132989. "lsr r5, r3, #16\n\t"
  132990. #endif
  132991. #ifdef WOLFSSL_KEIL
  132992. "ands r5, r5, r6\n\t"
  132993. #elif defined(__clang__)
  132994. "ands r5, r6\n\t"
  132995. #else
  132996. "and r5, r6\n\t"
  132997. #endif
  132998. "cmp r5, #0\n\t"
  132999. "beq L_sp_521_num_bits_17_52_%=\n\t"
  133000. "movs r2, #0x70\n\t"
  133001. "ldrb r4, [%[table], r5]\n\t"
  133002. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133003. "adds r2, r2, r4\n\t"
  133004. #else
  133005. "add r2, r2, r4\n\t"
  133006. #endif
  133007. "b L_sp_521_num_bits_17_18_%=\n\t"
  133008. "\n"
  133009. "L_sp_521_num_bits_17_52_%=:\n\t"
  133010. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133011. "lsrs r5, r3, #8\n\t"
  133012. #else
  133013. "lsr r5, r3, #8\n\t"
  133014. #endif
  133015. #ifdef WOLFSSL_KEIL
  133016. "ands r5, r5, r6\n\t"
  133017. #elif defined(__clang__)
  133018. "ands r5, r6\n\t"
  133019. #else
  133020. "and r5, r6\n\t"
  133021. #endif
  133022. "cmp r5, #0\n\t"
  133023. "beq L_sp_521_num_bits_17_51_%=\n\t"
  133024. "movs r2, #0x68\n\t"
  133025. "ldrb r4, [%[table], r5]\n\t"
  133026. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133027. "adds r2, r2, r4\n\t"
  133028. #else
  133029. "add r2, r2, r4\n\t"
  133030. #endif
  133031. "b L_sp_521_num_bits_17_18_%=\n\t"
  133032. "\n"
  133033. "L_sp_521_num_bits_17_51_%=:\n\t"
  133034. "movs r5, r3\n\t"
  133035. #ifdef WOLFSSL_KEIL
  133036. "ands r5, r5, r6\n\t"
  133037. #elif defined(__clang__)
  133038. "ands r5, r6\n\t"
  133039. #else
  133040. "and r5, r6\n\t"
  133041. #endif
  133042. "cmp r5, #0\n\t"
  133043. "beq L_sp_521_num_bits_17_50_%=\n\t"
  133044. "movs r2, #0x60\n\t"
  133045. "ldrb r4, [%[table], r5]\n\t"
  133046. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133047. "adds r2, r2, r4\n\t"
  133048. #else
  133049. "add r2, r2, r4\n\t"
  133050. #endif
  133051. "b L_sp_521_num_bits_17_18_%=\n\t"
  133052. "\n"
  133053. "L_sp_521_num_bits_17_50_%=:\n\t"
  133054. "b L_sp_521_num_bits_17_18_%=\n\t"
  133055. "\n"
  133056. "L_sp_521_num_bits_17_3_%=:\n\t"
  133057. "ldr r3, [%[a], #8]\n\t"
  133058. "cmp r3, #0\n\t"
  133059. "beq L_sp_521_num_bits_17_2_%=\n\t"
  133060. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133061. "lsrs r5, r3, #24\n\t"
  133062. #else
  133063. "lsr r5, r3, #24\n\t"
  133064. #endif
  133065. "cmp r5, #0\n\t"
  133066. "beq L_sp_521_num_bits_17_43_%=\n\t"
  133067. "movs r2, #0x58\n\t"
  133068. "ldrb r4, [%[table], r5]\n\t"
  133069. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133070. "adds r2, r2, r4\n\t"
  133071. #else
  133072. "add r2, r2, r4\n\t"
  133073. #endif
  133074. "b L_sp_521_num_bits_17_18_%=\n\t"
  133075. "\n"
  133076. "L_sp_521_num_bits_17_43_%=:\n\t"
  133077. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133078. "lsrs r5, r3, #16\n\t"
  133079. #else
  133080. "lsr r5, r3, #16\n\t"
  133081. #endif
  133082. #ifdef WOLFSSL_KEIL
  133083. "ands r5, r5, r6\n\t"
  133084. #elif defined(__clang__)
  133085. "ands r5, r6\n\t"
  133086. #else
  133087. "and r5, r6\n\t"
  133088. #endif
  133089. "cmp r5, #0\n\t"
  133090. "beq L_sp_521_num_bits_17_42_%=\n\t"
  133091. "movs r2, #0x50\n\t"
  133092. "ldrb r4, [%[table], r5]\n\t"
  133093. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133094. "adds r2, r2, r4\n\t"
  133095. #else
  133096. "add r2, r2, r4\n\t"
  133097. #endif
  133098. "b L_sp_521_num_bits_17_18_%=\n\t"
  133099. "\n"
  133100. "L_sp_521_num_bits_17_42_%=:\n\t"
  133101. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133102. "lsrs r5, r3, #8\n\t"
  133103. #else
  133104. "lsr r5, r3, #8\n\t"
  133105. #endif
  133106. #ifdef WOLFSSL_KEIL
  133107. "ands r5, r5, r6\n\t"
  133108. #elif defined(__clang__)
  133109. "ands r5, r6\n\t"
  133110. #else
  133111. "and r5, r6\n\t"
  133112. #endif
  133113. "cmp r5, #0\n\t"
  133114. "beq L_sp_521_num_bits_17_41_%=\n\t"
  133115. "movs r2, #0x48\n\t"
  133116. "ldrb r4, [%[table], r5]\n\t"
  133117. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133118. "adds r2, r2, r4\n\t"
  133119. #else
  133120. "add r2, r2, r4\n\t"
  133121. #endif
  133122. "b L_sp_521_num_bits_17_18_%=\n\t"
  133123. "\n"
  133124. "L_sp_521_num_bits_17_41_%=:\n\t"
  133125. "movs r5, r3\n\t"
  133126. #ifdef WOLFSSL_KEIL
  133127. "ands r5, r5, r6\n\t"
  133128. #elif defined(__clang__)
  133129. "ands r5, r6\n\t"
  133130. #else
  133131. "and r5, r6\n\t"
  133132. #endif
  133133. "cmp r5, #0\n\t"
  133134. "beq L_sp_521_num_bits_17_40_%=\n\t"
  133135. "movs r2, #0x40\n\t"
  133136. "ldrb r4, [%[table], r5]\n\t"
  133137. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133138. "adds r2, r2, r4\n\t"
  133139. #else
  133140. "add r2, r2, r4\n\t"
  133141. #endif
  133142. "b L_sp_521_num_bits_17_18_%=\n\t"
  133143. "\n"
  133144. "L_sp_521_num_bits_17_40_%=:\n\t"
  133145. "b L_sp_521_num_bits_17_18_%=\n\t"
  133146. "\n"
  133147. "L_sp_521_num_bits_17_2_%=:\n\t"
  133148. "ldr r3, [%[a], #4]\n\t"
  133149. "cmp r3, #0\n\t"
  133150. "beq L_sp_521_num_bits_17_1_%=\n\t"
  133151. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133152. "lsrs r5, r3, #24\n\t"
  133153. #else
  133154. "lsr r5, r3, #24\n\t"
  133155. #endif
  133156. "cmp r5, #0\n\t"
  133157. "beq L_sp_521_num_bits_17_33_%=\n\t"
  133158. "movs r2, #56\n\t"
  133159. "ldrb r4, [%[table], r5]\n\t"
  133160. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133161. "adds r2, r2, r4\n\t"
  133162. #else
  133163. "add r2, r2, r4\n\t"
  133164. #endif
  133165. "b L_sp_521_num_bits_17_18_%=\n\t"
  133166. "\n"
  133167. "L_sp_521_num_bits_17_33_%=:\n\t"
  133168. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133169. "lsrs r5, r3, #16\n\t"
  133170. #else
  133171. "lsr r5, r3, #16\n\t"
  133172. #endif
  133173. #ifdef WOLFSSL_KEIL
  133174. "ands r5, r5, r6\n\t"
  133175. #elif defined(__clang__)
  133176. "ands r5, r6\n\t"
  133177. #else
  133178. "and r5, r6\n\t"
  133179. #endif
  133180. "cmp r5, #0\n\t"
  133181. "beq L_sp_521_num_bits_17_32_%=\n\t"
  133182. "movs r2, #48\n\t"
  133183. "ldrb r4, [%[table], r5]\n\t"
  133184. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133185. "adds r2, r2, r4\n\t"
  133186. #else
  133187. "add r2, r2, r4\n\t"
  133188. #endif
  133189. "b L_sp_521_num_bits_17_18_%=\n\t"
  133190. "\n"
  133191. "L_sp_521_num_bits_17_32_%=:\n\t"
  133192. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133193. "lsrs r5, r3, #8\n\t"
  133194. #else
  133195. "lsr r5, r3, #8\n\t"
  133196. #endif
  133197. #ifdef WOLFSSL_KEIL
  133198. "ands r5, r5, r6\n\t"
  133199. #elif defined(__clang__)
  133200. "ands r5, r6\n\t"
  133201. #else
  133202. "and r5, r6\n\t"
  133203. #endif
  133204. "cmp r5, #0\n\t"
  133205. "beq L_sp_521_num_bits_17_31_%=\n\t"
  133206. "movs r2, #40\n\t"
  133207. "ldrb r4, [%[table], r5]\n\t"
  133208. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133209. "adds r2, r2, r4\n\t"
  133210. #else
  133211. "add r2, r2, r4\n\t"
  133212. #endif
  133213. "b L_sp_521_num_bits_17_18_%=\n\t"
  133214. "\n"
  133215. "L_sp_521_num_bits_17_31_%=:\n\t"
  133216. "movs r5, r3\n\t"
  133217. #ifdef WOLFSSL_KEIL
  133218. "ands r5, r5, r6\n\t"
  133219. #elif defined(__clang__)
  133220. "ands r5, r6\n\t"
  133221. #else
  133222. "and r5, r6\n\t"
  133223. #endif
  133224. "cmp r5, #0\n\t"
  133225. "beq L_sp_521_num_bits_17_30_%=\n\t"
  133226. "movs r2, #32\n\t"
  133227. "ldrb r4, [%[table], r5]\n\t"
  133228. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133229. "adds r2, r2, r4\n\t"
  133230. #else
  133231. "add r2, r2, r4\n\t"
  133232. #endif
  133233. "b L_sp_521_num_bits_17_18_%=\n\t"
  133234. "\n"
  133235. "L_sp_521_num_bits_17_30_%=:\n\t"
  133236. "b L_sp_521_num_bits_17_18_%=\n\t"
  133237. "\n"
  133238. "L_sp_521_num_bits_17_1_%=:\n\t"
  133239. "ldr r3, [%[a]]\n\t"
  133240. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133241. "lsrs r5, r3, #24\n\t"
  133242. #else
  133243. "lsr r5, r3, #24\n\t"
  133244. #endif
  133245. "cmp r5, #0\n\t"
  133246. "beq L_sp_521_num_bits_17_23_%=\n\t"
  133247. "movs r2, #24\n\t"
  133248. "ldrb r4, [%[table], r5]\n\t"
  133249. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133250. "adds r2, r2, r4\n\t"
  133251. #else
  133252. "add r2, r2, r4\n\t"
  133253. #endif
  133254. "b L_sp_521_num_bits_17_18_%=\n\t"
  133255. "\n"
  133256. "L_sp_521_num_bits_17_23_%=:\n\t"
  133257. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133258. "lsrs r5, r3, #16\n\t"
  133259. #else
  133260. "lsr r5, r3, #16\n\t"
  133261. #endif
  133262. #ifdef WOLFSSL_KEIL
  133263. "ands r5, r5, r6\n\t"
  133264. #elif defined(__clang__)
  133265. "ands r5, r6\n\t"
  133266. #else
  133267. "and r5, r6\n\t"
  133268. #endif
  133269. "cmp r5, #0\n\t"
  133270. "beq L_sp_521_num_bits_17_22_%=\n\t"
  133271. "movs r2, #16\n\t"
  133272. "ldrb r4, [%[table], r5]\n\t"
  133273. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133274. "adds r2, r2, r4\n\t"
  133275. #else
  133276. "add r2, r2, r4\n\t"
  133277. #endif
  133278. "b L_sp_521_num_bits_17_18_%=\n\t"
  133279. "\n"
  133280. "L_sp_521_num_bits_17_22_%=:\n\t"
  133281. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133282. "lsrs r5, r3, #8\n\t"
  133283. #else
  133284. "lsr r5, r3, #8\n\t"
  133285. #endif
  133286. #ifdef WOLFSSL_KEIL
  133287. "ands r5, r5, r6\n\t"
  133288. #elif defined(__clang__)
  133289. "ands r5, r6\n\t"
  133290. #else
  133291. "and r5, r6\n\t"
  133292. #endif
  133293. "cmp r5, #0\n\t"
  133294. "beq L_sp_521_num_bits_17_21_%=\n\t"
  133295. "movs r2, #8\n\t"
  133296. "ldrb r4, [%[table], r5]\n\t"
  133297. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133298. "adds r2, r2, r4\n\t"
  133299. #else
  133300. "add r2, r2, r4\n\t"
  133301. #endif
  133302. "b L_sp_521_num_bits_17_18_%=\n\t"
  133303. "\n"
  133304. "L_sp_521_num_bits_17_21_%=:\n\t"
  133305. "movs r5, r3\n\t"
  133306. #ifdef WOLFSSL_KEIL
  133307. "ands r5, r5, r6\n\t"
  133308. #elif defined(__clang__)
  133309. "ands r5, r6\n\t"
  133310. #else
  133311. "and r5, r6\n\t"
  133312. #endif
  133313. "cmp r5, #0\n\t"
  133314. "beq L_sp_521_num_bits_17_20_%=\n\t"
  133315. "movs r2, #0\n\t"
  133316. "ldrb r4, [%[table], r5]\n\t"
  133317. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133318. "adds r2, r2, r4\n\t"
  133319. #else
  133320. "add r2, r2, r4\n\t"
  133321. #endif
  133322. "b L_sp_521_num_bits_17_18_%=\n\t"
  133323. "\n"
  133324. "L_sp_521_num_bits_17_20_%=:\n\t"
  133325. "\n"
  133326. "L_sp_521_num_bits_17_18_%=:\n\t"
  133327. "movs %[a], r2\n\t"
  133328. : [a] "+l" (a), [table] "+l" (table)
  133329. :
  133330. : "memory", "r2", "r3", "r4", "r5", "r6"
  133331. );
  133332. return (uint32_t)(size_t)a;
  133333. }
  133334. /* Non-constant time modular inversion.
  133335. *
  133336. * @param [out] r Resulting number.
  133337. * @param [in] a Number to invert.
  133338. * @param [in] m Modulus.
  133339. * @return MP_OKAY on success.
  133340. */
  133341. static int sp_521_mod_inv_17(sp_digit* r, const sp_digit* a, const sp_digit* m)
  133342. {
  133343. sp_digit u[17];
  133344. sp_digit v[17];
  133345. sp_digit b[17];
  133346. sp_digit d[17];
  133347. int ut, vt;
  133348. sp_digit o;
  133349. XMEMCPY(u, m, sizeof(u));
  133350. XMEMCPY(v, a, sizeof(v));
  133351. ut = sp_521_num_bits_17(u);
  133352. vt = sp_521_num_bits_17(v);
  133353. XMEMSET(b, 0, sizeof(b));
  133354. if ((v[0] & 1) == 0) {
  133355. sp_521_rshift1_17(v, v);
  133356. XMEMCPY(d, m, sizeof(u));
  133357. d[0] += 1;
  133358. sp_521_rshift1_17(d, d);
  133359. vt--;
  133360. while ((v[0] & 1) == 0) {
  133361. sp_521_rshift1_17(v, v);
  133362. sp_521_div2_mod_17(d, d, m);
  133363. vt--;
  133364. }
  133365. }
  133366. else {
  133367. XMEMSET(d+1, 0, sizeof(d)-sizeof(sp_digit));
  133368. d[0] = 1;
  133369. }
  133370. while (ut > 1 && vt > 1) {
  133371. if (ut > vt || (ut == vt && sp_521_cmp_17(u, v) >= 0)) {
  133372. sp_521_sub_17(u, u, v);
  133373. o = sp_521_sub_17(b, b, d);
  133374. if (o != 0)
  133375. sp_521_add_17(b, b, m);
  133376. ut = sp_521_num_bits_17(u);
  133377. do {
  133378. sp_521_rshift1_17(u, u);
  133379. sp_521_div2_mod_17(b, b, m);
  133380. ut--;
  133381. }
  133382. while (ut > 0 && (u[0] & 1) == 0);
  133383. }
  133384. else {
  133385. sp_521_sub_17(v, v, u);
  133386. o = sp_521_sub_17(d, d, b);
  133387. if (o != 0)
  133388. sp_521_add_17(d, d, m);
  133389. vt = sp_521_num_bits_17(v);
  133390. do {
  133391. sp_521_rshift1_17(v, v);
  133392. sp_521_div2_mod_17(d, d, m);
  133393. vt--;
  133394. }
  133395. while (vt > 0 && (v[0] & 1) == 0);
  133396. }
  133397. }
  133398. if (ut == 1)
  133399. XMEMCPY(r, b, sizeof(b));
  133400. else
  133401. XMEMCPY(r, d, sizeof(d));
  133402. return MP_OKAY;
  133403. }
  133404. #endif /* WOLFSSL_SP_SMALL */
  133405. /* Add point p1 into point p2. Handles p1 == p2 and result at infinity.
  133406. *
  133407. * p1 First point to add and holds result.
  133408. * p2 Second point to add.
  133409. * tmp Temporary storage for intermediate numbers.
  133410. */
  133411. static void sp_521_add_points_17(sp_point_521* p1, const sp_point_521* p2,
  133412. sp_digit* tmp)
  133413. {
  133414. sp_521_proj_point_add_17(p1, p1, p2, tmp);
  133415. if (sp_521_iszero_17(p1->z)) {
  133416. if (sp_521_iszero_17(p1->x) && sp_521_iszero_17(p1->y)) {
  133417. sp_521_proj_point_dbl_17(p1, p2, tmp);
  133418. }
  133419. else {
  133420. /* Y ordinate is not used from here - don't set. */
  133421. p1->x[0] = 0;
  133422. p1->x[1] = 0;
  133423. p1->x[2] = 0;
  133424. p1->x[3] = 0;
  133425. p1->x[4] = 0;
  133426. p1->x[5] = 0;
  133427. p1->x[6] = 0;
  133428. p1->x[7] = 0;
  133429. p1->x[8] = 0;
  133430. p1->x[9] = 0;
  133431. p1->x[10] = 0;
  133432. p1->x[11] = 0;
  133433. p1->x[12] = 0;
  133434. p1->x[13] = 0;
  133435. p1->x[14] = 0;
  133436. p1->x[15] = 0;
  133437. p1->x[16] = 0;
  133438. XMEMCPY(p1->z, p521_norm_mod, sizeof(p521_norm_mod));
  133439. }
  133440. }
  133441. }
  133442. /* Calculate the verification point: [e/s]G + [r/s]Q
  133443. *
  133444. * p1 Calculated point.
  133445. * p2 Public point and temporary.
  133446. * s Second part of signature as a number.
  133447. * u1 Temporary number.
  133448. * u2 Temproray number.
  133449. * heap Heap to use for allocation.
  133450. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  133451. */
  133452. static int sp_521_calc_vfy_point_17(sp_point_521* p1, sp_point_521* p2,
  133453. sp_digit* s, sp_digit* u1, sp_digit* u2, sp_digit* tmp, void* heap)
  133454. {
  133455. int err;
  133456. #ifndef WOLFSSL_SP_SMALL
  133457. err = sp_521_mod_inv_17(s, s, p521_order);
  133458. if (err == MP_OKAY)
  133459. #endif /* !WOLFSSL_SP_SMALL */
  133460. {
  133461. sp_521_mul_17(s, s, p521_norm_order);
  133462. err = sp_521_mod_17(s, s, p521_order);
  133463. }
  133464. if (err == MP_OKAY) {
  133465. sp_521_norm_17(s);
  133466. #ifdef WOLFSSL_SP_SMALL
  133467. {
  133468. sp_521_mont_inv_order_17(s, s, tmp);
  133469. sp_521_mont_mul_order_17(u1, u1, s);
  133470. sp_521_mont_mul_order_17(u2, u2, s);
  133471. }
  133472. #else
  133473. {
  133474. sp_521_mont_mul_order_17(u1, u1, s);
  133475. sp_521_mont_mul_order_17(u2, u2, s);
  133476. }
  133477. #endif /* WOLFSSL_SP_SMALL */
  133478. {
  133479. err = sp_521_ecc_mulmod_base_17(p1, u1, 0, 0, heap);
  133480. }
  133481. }
  133482. if ((err == MP_OKAY) && sp_521_iszero_17(p1->z)) {
  133483. p1->infinity = 1;
  133484. }
  133485. if (err == MP_OKAY) {
  133486. err = sp_521_ecc_mulmod_17(p2, p2, u2, 0, 0, heap);
  133487. }
  133488. if ((err == MP_OKAY) && sp_521_iszero_17(p2->z)) {
  133489. p2->infinity = 1;
  133490. }
  133491. if (err == MP_OKAY) {
  133492. sp_521_add_points_17(p1, p2, tmp);
  133493. }
  133494. return err;
  133495. }
  133496. #ifdef HAVE_ECC_VERIFY
  133497. /* Verify the signature values with the hash and public key.
  133498. * e = Truncate(hash, 521)
  133499. * u1 = e/s mod order
  133500. * u2 = r/s mod order
  133501. * r == (u1.G + u2.Q)->x mod order
  133502. * Optimization: Leave point in projective form.
  133503. * (x, y, 1) == (x' / z'*z', y' / z'*z'*z', z' / z')
  133504. * (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x'
  133505. * The hash is truncated to the first 521 bits.
  133506. *
  133507. * hash Hash to sign.
  133508. * hashLen Length of the hash data.
  133509. * rng Random number generator.
  133510. * priv Private part of key - scalar.
  133511. * rm First part of result as an mp_int.
  133512. * sm Sirst part of result as an mp_int.
  133513. * heap Heap to use for allocation.
  133514. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  133515. */
  133516. int sp_ecc_verify_521(const byte* hash, word32 hashLen, const mp_int* pX,
  133517. const mp_int* pY, const mp_int* pZ, const mp_int* rm, const mp_int* sm,
  133518. int* res, void* heap)
  133519. {
  133520. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  133521. sp_digit* u1 = NULL;
  133522. sp_point_521* p1 = NULL;
  133523. #else
  133524. sp_digit u1[18 * 17];
  133525. sp_point_521 p1[2];
  133526. #endif
  133527. sp_digit* u2 = NULL;
  133528. sp_digit* s = NULL;
  133529. sp_digit* tmp = NULL;
  133530. sp_point_521* p2 = NULL;
  133531. sp_digit carry;
  133532. sp_int32 c = 0;
  133533. int err = MP_OKAY;
  133534. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  133535. if (err == MP_OKAY) {
  133536. p1 = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap,
  133537. DYNAMIC_TYPE_ECC);
  133538. if (p1 == NULL)
  133539. err = MEMORY_E;
  133540. }
  133541. if (err == MP_OKAY) {
  133542. u1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 18 * 17, heap,
  133543. DYNAMIC_TYPE_ECC);
  133544. if (u1 == NULL)
  133545. err = MEMORY_E;
  133546. }
  133547. #endif
  133548. if (err == MP_OKAY) {
  133549. u2 = u1 + 2 * 17;
  133550. s = u1 + 4 * 17;
  133551. tmp = u1 + 6 * 17;
  133552. p2 = p1 + 1;
  133553. if (hashLen > 66U) {
  133554. hashLen = 66U;
  133555. }
  133556. sp_521_from_bin(u1, 17, hash, (int)hashLen);
  133557. sp_521_from_mp(u2, 17, rm);
  133558. sp_521_from_mp(s, 17, sm);
  133559. sp_521_from_mp(p2->x, 17, pX);
  133560. sp_521_from_mp(p2->y, 17, pY);
  133561. sp_521_from_mp(p2->z, 17, pZ);
  133562. if (hashLen == 66U) {
  133563. sp_521_rshift_17(u1, u1, 7);
  133564. }
  133565. err = sp_521_calc_vfy_point_17(p1, p2, s, u1, u2, tmp, heap);
  133566. }
  133567. if (err == MP_OKAY) {
  133568. /* (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x' */
  133569. /* Reload r and convert to Montgomery form. */
  133570. sp_521_from_mp(u2, 17, rm);
  133571. err = sp_521_mod_mul_norm_17(u2, u2, p521_mod);
  133572. }
  133573. if (err == MP_OKAY) {
  133574. /* u1 = r.z'.z' mod prime */
  133575. sp_521_mont_sqr_17(p1->z, p1->z, p521_mod, p521_mp_mod);
  133576. sp_521_mont_mul_17(u1, u2, p1->z, p521_mod, p521_mp_mod);
  133577. *res = (int)(sp_521_cmp_17(p1->x, u1) == 0);
  133578. if (*res == 0) {
  133579. /* Reload r and add order. */
  133580. sp_521_from_mp(u2, 17, rm);
  133581. carry = sp_521_add_17(u2, u2, p521_order);
  133582. /* Carry means result is greater than mod and is not valid. */
  133583. if (carry == 0) {
  133584. sp_521_norm_17(u2);
  133585. /* Compare with mod and if greater or equal then not valid. */
  133586. c = sp_521_cmp_17(u2, p521_mod);
  133587. }
  133588. }
  133589. if ((*res == 0) && (c < 0)) {
  133590. /* Convert to Montogomery form */
  133591. err = sp_521_mod_mul_norm_17(u2, u2, p521_mod);
  133592. if (err == MP_OKAY) {
  133593. /* u1 = (r + 1*order).z'.z' mod prime */
  133594. {
  133595. sp_521_mont_mul_17(u1, u2, p1->z, p521_mod, p521_mp_mod);
  133596. }
  133597. *res = (sp_521_cmp_17(p1->x, u1) == 0);
  133598. }
  133599. }
  133600. }
  133601. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  133602. if (u1 != NULL)
  133603. XFREE(u1, heap, DYNAMIC_TYPE_ECC);
  133604. if (p1 != NULL)
  133605. XFREE(p1, heap, DYNAMIC_TYPE_ECC);
  133606. #endif
  133607. return err;
  133608. }
  133609. #ifdef WOLFSSL_SP_NONBLOCK
  133610. typedef struct sp_ecc_verify_521_ctx {
  133611. int state;
  133612. union {
  133613. sp_521_ecc_mulmod_17_ctx mulmod_ctx;
  133614. sp_521_mont_inv_order_17_ctx mont_inv_order_ctx;
  133615. sp_521_proj_point_dbl_17_ctx dbl_ctx;
  133616. sp_521_proj_point_add_17_ctx add_ctx;
  133617. };
  133618. sp_digit u1[2*17];
  133619. sp_digit u2[2*17];
  133620. sp_digit s[2*17];
  133621. sp_digit tmp[2*17 * 6];
  133622. sp_point_521 p1;
  133623. sp_point_521 p2;
  133624. } sp_ecc_verify_521_ctx;
  133625. int sp_ecc_verify_521_nb(sp_ecc_ctx_t* sp_ctx, const byte* hash,
  133626. word32 hashLen, const mp_int* pX, const mp_int* pY, const mp_int* pZ,
  133627. const mp_int* rm, const mp_int* sm, int* res, void* heap)
  133628. {
  133629. int err = FP_WOULDBLOCK;
  133630. sp_ecc_verify_521_ctx* ctx = (sp_ecc_verify_521_ctx*)sp_ctx->data;
  133631. typedef char ctx_size_test[sizeof(sp_ecc_verify_521_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  133632. (void)sizeof(ctx_size_test);
  133633. switch (ctx->state) {
  133634. case 0: /* INIT */
  133635. if (hashLen > 66U) {
  133636. hashLen = 66U;
  133637. }
  133638. sp_521_from_bin(ctx->u1, 17, hash, (int)hashLen);
  133639. sp_521_from_mp(ctx->u2, 17, rm);
  133640. sp_521_from_mp(ctx->s, 17, sm);
  133641. sp_521_from_mp(ctx->p2.x, 17, pX);
  133642. sp_521_from_mp(ctx->p2.y, 17, pY);
  133643. sp_521_from_mp(ctx->p2.z, 17, pZ);
  133644. if (hashLen == 66U) {
  133645. sp_521_rshift_17(ctx->u1, ctx->u1, 7);
  133646. }
  133647. ctx->state = 1;
  133648. break;
  133649. case 1: /* NORMS0 */
  133650. sp_521_mul_17(ctx->s, ctx->s, p521_norm_order);
  133651. err = sp_521_mod_17(ctx->s, ctx->s, p521_order);
  133652. if (err == MP_OKAY)
  133653. ctx->state = 2;
  133654. break;
  133655. case 2: /* NORMS1 */
  133656. sp_521_norm_17(ctx->s);
  133657. XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
  133658. ctx->state = 3;
  133659. break;
  133660. case 3: /* NORMS2 */
  133661. err = sp_521_mont_inv_order_17_nb((sp_ecc_ctx_t*)&ctx->mont_inv_order_ctx, ctx->s, ctx->s, ctx->tmp);
  133662. if (err == MP_OKAY) {
  133663. ctx->state = 4;
  133664. }
  133665. break;
  133666. case 4: /* NORMS3 */
  133667. sp_521_mont_mul_order_17(ctx->u1, ctx->u1, ctx->s);
  133668. ctx->state = 5;
  133669. break;
  133670. case 5: /* NORMS4 */
  133671. sp_521_mont_mul_order_17(ctx->u2, ctx->u2, ctx->s);
  133672. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  133673. ctx->state = 6;
  133674. break;
  133675. case 6: /* MULBASE */
  133676. err = sp_521_ecc_mulmod_17_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx, &ctx->p1, &p521_base, ctx->u1, 0, 0, heap);
  133677. if (err == MP_OKAY) {
  133678. if (sp_521_iszero_17(ctx->p1.z)) {
  133679. ctx->p1.infinity = 1;
  133680. }
  133681. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  133682. ctx->state = 7;
  133683. }
  133684. break;
  133685. case 7: /* MULMOD */
  133686. err = sp_521_ecc_mulmod_17_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx, &ctx->p2, &ctx->p2, ctx->u2, 0, 0, heap);
  133687. if (err == MP_OKAY) {
  133688. if (sp_521_iszero_17(ctx->p2.z)) {
  133689. ctx->p2.infinity = 1;
  133690. }
  133691. XMEMSET(&ctx->add_ctx, 0, sizeof(ctx->add_ctx));
  133692. ctx->state = 8;
  133693. }
  133694. break;
  133695. case 8: /* ADD */
  133696. err = sp_521_proj_point_add_17_nb((sp_ecc_ctx_t*)&ctx->add_ctx, &ctx->p1, &ctx->p1, &ctx->p2, ctx->tmp);
  133697. if (err == MP_OKAY)
  133698. ctx->state = 9;
  133699. break;
  133700. case 9: /* MONT */
  133701. /* (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x' */
  133702. /* Reload r and convert to Montgomery form. */
  133703. sp_521_from_mp(ctx->u2, 17, rm);
  133704. err = sp_521_mod_mul_norm_17(ctx->u2, ctx->u2, p521_mod);
  133705. if (err == MP_OKAY)
  133706. ctx->state = 10;
  133707. break;
  133708. case 10: /* SQR */
  133709. /* u1 = r.z'.z' mod prime */
  133710. sp_521_mont_sqr_17(ctx->p1.z, ctx->p1.z, p521_mod, p521_mp_mod);
  133711. ctx->state = 11;
  133712. break;
  133713. case 11: /* MUL */
  133714. sp_521_mont_mul_17(ctx->u1, ctx->u2, ctx->p1.z, p521_mod, p521_mp_mod);
  133715. ctx->state = 12;
  133716. break;
  133717. case 12: /* RES */
  133718. {
  133719. sp_int32 c = 0;
  133720. err = MP_OKAY; /* math okay, now check result */
  133721. *res = (int)(sp_521_cmp_17(ctx->p1.x, ctx->u1) == 0);
  133722. if (*res == 0) {
  133723. sp_digit carry;
  133724. /* Reload r and add order. */
  133725. sp_521_from_mp(ctx->u2, 17, rm);
  133726. carry = sp_521_add_17(ctx->u2, ctx->u2, p521_order);
  133727. /* Carry means result is greater than mod and is not valid. */
  133728. if (carry == 0) {
  133729. sp_521_norm_17(ctx->u2);
  133730. /* Compare with mod and if greater or equal then not valid. */
  133731. c = sp_521_cmp_17(ctx->u2, p521_mod);
  133732. }
  133733. }
  133734. if ((*res == 0) && (c < 0)) {
  133735. /* Convert to Montogomery form */
  133736. err = sp_521_mod_mul_norm_17(ctx->u2, ctx->u2, p521_mod);
  133737. if (err == MP_OKAY) {
  133738. /* u1 = (r + 1*order).z'.z' mod prime */
  133739. sp_521_mont_mul_17(ctx->u1, ctx->u2, ctx->p1.z, p521_mod,
  133740. p521_mp_mod);
  133741. *res = (int)(sp_521_cmp_17(ctx->p1.x, ctx->u1) == 0);
  133742. }
  133743. }
  133744. break;
  133745. }
  133746. } /* switch */
  133747. if (err == MP_OKAY && ctx->state != 12) {
  133748. err = FP_WOULDBLOCK;
  133749. }
  133750. return err;
  133751. }
  133752. #endif /* WOLFSSL_SP_NONBLOCK */
  133753. #endif /* HAVE_ECC_VERIFY */
  133754. #ifdef HAVE_ECC_CHECK_KEY
  133755. /* Check that the x and y oridinates are a valid point on the curve.
  133756. *
  133757. * point EC point.
  133758. * heap Heap to use if dynamically allocating.
  133759. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  133760. * not on the curve and MP_OKAY otherwise.
  133761. */
  133762. static int sp_521_ecc_is_point_17(const sp_point_521* point,
  133763. void* heap)
  133764. {
  133765. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  133766. sp_digit* t1 = NULL;
  133767. #else
  133768. sp_digit t1[17 * 4];
  133769. #endif
  133770. sp_digit* t2 = NULL;
  133771. int err = MP_OKAY;
  133772. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  133773. t1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 17 * 4, heap, DYNAMIC_TYPE_ECC);
  133774. if (t1 == NULL)
  133775. err = MEMORY_E;
  133776. #endif
  133777. (void)heap;
  133778. if (err == MP_OKAY) {
  133779. t2 = t1 + 2 * 17;
  133780. sp_521_sqr_17(t1, point->y);
  133781. (void)sp_521_mod_17(t1, t1, p521_mod);
  133782. sp_521_sqr_17(t2, point->x);
  133783. (void)sp_521_mod_17(t2, t2, p521_mod);
  133784. sp_521_mul_17(t2, t2, point->x);
  133785. (void)sp_521_mod_17(t2, t2, p521_mod);
  133786. (void)sp_521_sub_17(t2, p521_mod, t2);
  133787. sp_521_mont_add_17(t1, t1, t2, p521_mod);
  133788. sp_521_mont_add_17(t1, t1, point->x, p521_mod);
  133789. sp_521_mont_add_17(t1, t1, point->x, p521_mod);
  133790. sp_521_mont_add_17(t1, t1, point->x, p521_mod);
  133791. if (sp_521_cmp_17(t1, p521_b) != 0) {
  133792. err = MP_VAL;
  133793. }
  133794. }
  133795. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  133796. if (t1 != NULL)
  133797. XFREE(t1, heap, DYNAMIC_TYPE_ECC);
  133798. #endif
  133799. return err;
  133800. }
  133801. /* Check that the x and y oridinates are a valid point on the curve.
  133802. *
  133803. * pX X ordinate of EC point.
  133804. * pY Y ordinate of EC point.
  133805. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  133806. * not on the curve and MP_OKAY otherwise.
  133807. */
  133808. int sp_ecc_is_point_521(const mp_int* pX, const mp_int* pY)
  133809. {
  133810. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  133811. sp_point_521* pub = NULL;
  133812. #else
  133813. sp_point_521 pub[1];
  133814. #endif
  133815. const byte one[1] = { 1 };
  133816. int err = MP_OKAY;
  133817. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  133818. pub = (sp_point_521*)XMALLOC(sizeof(sp_point_521), NULL,
  133819. DYNAMIC_TYPE_ECC);
  133820. if (pub == NULL)
  133821. err = MEMORY_E;
  133822. #endif
  133823. if (err == MP_OKAY) {
  133824. sp_521_from_mp(pub->x, 17, pX);
  133825. sp_521_from_mp(pub->y, 17, pY);
  133826. sp_521_from_bin(pub->z, 17, one, (int)sizeof(one));
  133827. err = sp_521_ecc_is_point_17(pub, NULL);
  133828. }
  133829. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  133830. if (pub != NULL)
  133831. XFREE(pub, NULL, DYNAMIC_TYPE_ECC);
  133832. #endif
  133833. return err;
  133834. }
  133835. /* Check that the private scalar generates the EC point (px, py), the point is
  133836. * on the curve and the point has the correct order.
  133837. *
  133838. * pX X ordinate of EC point.
  133839. * pY Y ordinate of EC point.
  133840. * privm Private scalar that generates EC point.
  133841. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  133842. * not on the curve, ECC_INF_E if the point does not have the correct order,
  133843. * ECC_PRIV_KEY_E when the private scalar doesn't generate the EC point and
  133844. * MP_OKAY otherwise.
  133845. */
  133846. int sp_ecc_check_key_521(const mp_int* pX, const mp_int* pY,
  133847. const mp_int* privm, void* heap)
  133848. {
  133849. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  133850. sp_digit* priv = NULL;
  133851. sp_point_521* pub = NULL;
  133852. #else
  133853. sp_digit priv[17];
  133854. sp_point_521 pub[2];
  133855. #endif
  133856. sp_point_521* p = NULL;
  133857. const byte one[1] = { 1 };
  133858. int err = MP_OKAY;
  133859. /* Quick check the lengs of public key ordinates and private key are in
  133860. * range. Proper check later.
  133861. */
  133862. if (((mp_count_bits(pX) > 521) ||
  133863. (mp_count_bits(pY) > 521) ||
  133864. ((privm != NULL) && (mp_count_bits(privm) > 521)))) {
  133865. err = ECC_OUT_OF_RANGE_E;
  133866. }
  133867. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  133868. if (err == MP_OKAY) {
  133869. pub = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap,
  133870. DYNAMIC_TYPE_ECC);
  133871. if (pub == NULL)
  133872. err = MEMORY_E;
  133873. }
  133874. if (err == MP_OKAY && privm) {
  133875. priv = (sp_digit*)XMALLOC(sizeof(sp_digit) * 17, heap,
  133876. DYNAMIC_TYPE_ECC);
  133877. if (priv == NULL)
  133878. err = MEMORY_E;
  133879. }
  133880. #endif
  133881. if (err == MP_OKAY) {
  133882. p = pub + 1;
  133883. sp_521_from_mp(pub->x, 17, pX);
  133884. sp_521_from_mp(pub->y, 17, pY);
  133885. sp_521_from_bin(pub->z, 17, one, (int)sizeof(one));
  133886. if (privm)
  133887. sp_521_from_mp(priv, 17, privm);
  133888. /* Check point at infinitiy. */
  133889. if ((sp_521_iszero_17(pub->x) != 0) &&
  133890. (sp_521_iszero_17(pub->y) != 0)) {
  133891. err = ECC_INF_E;
  133892. }
  133893. }
  133894. /* Check range of X and Y */
  133895. if ((err == MP_OKAY) &&
  133896. ((sp_521_cmp_17(pub->x, p521_mod) >= 0) ||
  133897. (sp_521_cmp_17(pub->y, p521_mod) >= 0))) {
  133898. err = ECC_OUT_OF_RANGE_E;
  133899. }
  133900. if (err == MP_OKAY) {
  133901. /* Check point is on curve */
  133902. err = sp_521_ecc_is_point_17(pub, heap);
  133903. }
  133904. if (err == MP_OKAY) {
  133905. /* Point * order = infinity */
  133906. err = sp_521_ecc_mulmod_17(p, pub, p521_order, 1, 1, heap);
  133907. }
  133908. /* Check result is infinity */
  133909. if ((err == MP_OKAY) && ((sp_521_iszero_17(p->x) == 0) ||
  133910. (sp_521_iszero_17(p->y) == 0))) {
  133911. err = ECC_INF_E;
  133912. }
  133913. if (privm) {
  133914. if (err == MP_OKAY) {
  133915. /* Base * private = point */
  133916. err = sp_521_ecc_mulmod_base_17(p, priv, 1, 1, heap);
  133917. }
  133918. /* Check result is public key */
  133919. if ((err == MP_OKAY) &&
  133920. ((sp_521_cmp_17(p->x, pub->x) != 0) ||
  133921. (sp_521_cmp_17(p->y, pub->y) != 0))) {
  133922. err = ECC_PRIV_KEY_E;
  133923. }
  133924. }
  133925. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  133926. if (pub != NULL)
  133927. XFREE(pub, heap, DYNAMIC_TYPE_ECC);
  133928. if (priv != NULL)
  133929. XFREE(priv, heap, DYNAMIC_TYPE_ECC);
  133930. #endif
  133931. return err;
  133932. }
  133933. #endif
  133934. #ifdef WOLFSSL_PUBLIC_ECC_ADD_DBL
  133935. /* Add two projective EC points together.
  133936. * (pX, pY, pZ) + (qX, qY, qZ) = (rX, rY, rZ)
  133937. *
  133938. * pX First EC point's X ordinate.
  133939. * pY First EC point's Y ordinate.
  133940. * pZ First EC point's Z ordinate.
  133941. * qX Second EC point's X ordinate.
  133942. * qY Second EC point's Y ordinate.
  133943. * qZ Second EC point's Z ordinate.
  133944. * rX Resultant EC point's X ordinate.
  133945. * rY Resultant EC point's Y ordinate.
  133946. * rZ Resultant EC point's Z ordinate.
  133947. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  133948. */
  133949. int sp_ecc_proj_add_point_521(mp_int* pX, mp_int* pY, mp_int* pZ,
  133950. mp_int* qX, mp_int* qY, mp_int* qZ,
  133951. mp_int* rX, mp_int* rY, mp_int* rZ)
  133952. {
  133953. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  133954. sp_digit* tmp = NULL;
  133955. sp_point_521* p = NULL;
  133956. #else
  133957. sp_digit tmp[2 * 17 * 6];
  133958. sp_point_521 p[2];
  133959. #endif
  133960. sp_point_521* q = NULL;
  133961. int err = MP_OKAY;
  133962. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  133963. if (err == MP_OKAY) {
  133964. p = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, NULL,
  133965. DYNAMIC_TYPE_ECC);
  133966. if (p == NULL)
  133967. err = MEMORY_E;
  133968. }
  133969. if (err == MP_OKAY) {
  133970. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 17 * 6, NULL,
  133971. DYNAMIC_TYPE_ECC);
  133972. if (tmp == NULL) {
  133973. err = MEMORY_E;
  133974. }
  133975. }
  133976. #endif
  133977. if (err == MP_OKAY) {
  133978. q = p + 1;
  133979. sp_521_from_mp(p->x, 17, pX);
  133980. sp_521_from_mp(p->y, 17, pY);
  133981. sp_521_from_mp(p->z, 17, pZ);
  133982. sp_521_from_mp(q->x, 17, qX);
  133983. sp_521_from_mp(q->y, 17, qY);
  133984. sp_521_from_mp(q->z, 17, qZ);
  133985. p->infinity = sp_521_iszero_17(p->x) &
  133986. sp_521_iszero_17(p->y);
  133987. q->infinity = sp_521_iszero_17(q->x) &
  133988. sp_521_iszero_17(q->y);
  133989. sp_521_proj_point_add_17(p, p, q, tmp);
  133990. }
  133991. if (err == MP_OKAY) {
  133992. err = sp_521_to_mp(p->x, rX);
  133993. }
  133994. if (err == MP_OKAY) {
  133995. err = sp_521_to_mp(p->y, rY);
  133996. }
  133997. if (err == MP_OKAY) {
  133998. err = sp_521_to_mp(p->z, rZ);
  133999. }
  134000. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  134001. if (tmp != NULL)
  134002. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
  134003. if (p != NULL)
  134004. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  134005. #endif
  134006. return err;
  134007. }
  134008. /* Double a projective EC point.
  134009. * (pX, pY, pZ) + (pX, pY, pZ) = (rX, rY, rZ)
  134010. *
  134011. * pX EC point's X ordinate.
  134012. * pY EC point's Y ordinate.
  134013. * pZ EC point's Z ordinate.
  134014. * rX Resultant EC point's X ordinate.
  134015. * rY Resultant EC point's Y ordinate.
  134016. * rZ Resultant EC point's Z ordinate.
  134017. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  134018. */
  134019. int sp_ecc_proj_dbl_point_521(mp_int* pX, mp_int* pY, mp_int* pZ,
  134020. mp_int* rX, mp_int* rY, mp_int* rZ)
  134021. {
  134022. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  134023. sp_digit* tmp = NULL;
  134024. sp_point_521* p = NULL;
  134025. #else
  134026. sp_digit tmp[2 * 17 * 2];
  134027. sp_point_521 p[1];
  134028. #endif
  134029. int err = MP_OKAY;
  134030. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  134031. if (err == MP_OKAY) {
  134032. p = (sp_point_521*)XMALLOC(sizeof(sp_point_521), NULL,
  134033. DYNAMIC_TYPE_ECC);
  134034. if (p == NULL)
  134035. err = MEMORY_E;
  134036. }
  134037. if (err == MP_OKAY) {
  134038. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 17 * 2, NULL,
  134039. DYNAMIC_TYPE_ECC);
  134040. if (tmp == NULL)
  134041. err = MEMORY_E;
  134042. }
  134043. #endif
  134044. if (err == MP_OKAY) {
  134045. sp_521_from_mp(p->x, 17, pX);
  134046. sp_521_from_mp(p->y, 17, pY);
  134047. sp_521_from_mp(p->z, 17, pZ);
  134048. p->infinity = sp_521_iszero_17(p->x) &
  134049. sp_521_iszero_17(p->y);
  134050. sp_521_proj_point_dbl_17(p, p, tmp);
  134051. }
  134052. if (err == MP_OKAY) {
  134053. err = sp_521_to_mp(p->x, rX);
  134054. }
  134055. if (err == MP_OKAY) {
  134056. err = sp_521_to_mp(p->y, rY);
  134057. }
  134058. if (err == MP_OKAY) {
  134059. err = sp_521_to_mp(p->z, rZ);
  134060. }
  134061. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  134062. if (tmp != NULL)
  134063. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
  134064. if (p != NULL)
  134065. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  134066. #endif
  134067. return err;
  134068. }
  134069. /* Map a projective EC point to affine in place.
  134070. * pZ will be one.
  134071. *
  134072. * pX EC point's X ordinate.
  134073. * pY EC point's Y ordinate.
  134074. * pZ EC point's Z ordinate.
  134075. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  134076. */
  134077. int sp_ecc_map_521(mp_int* pX, mp_int* pY, mp_int* pZ)
  134078. {
  134079. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  134080. sp_digit* tmp = NULL;
  134081. sp_point_521* p = NULL;
  134082. #else
  134083. sp_digit tmp[2 * 17 * 5];
  134084. sp_point_521 p[1];
  134085. #endif
  134086. int err = MP_OKAY;
  134087. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  134088. if (err == MP_OKAY) {
  134089. p = (sp_point_521*)XMALLOC(sizeof(sp_point_521), NULL,
  134090. DYNAMIC_TYPE_ECC);
  134091. if (p == NULL)
  134092. err = MEMORY_E;
  134093. }
  134094. if (err == MP_OKAY) {
  134095. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 17 * 5, NULL,
  134096. DYNAMIC_TYPE_ECC);
  134097. if (tmp == NULL)
  134098. err = MEMORY_E;
  134099. }
  134100. #endif
  134101. if (err == MP_OKAY) {
  134102. sp_521_from_mp(p->x, 17, pX);
  134103. sp_521_from_mp(p->y, 17, pY);
  134104. sp_521_from_mp(p->z, 17, pZ);
  134105. p->infinity = sp_521_iszero_17(p->x) &
  134106. sp_521_iszero_17(p->y);
  134107. sp_521_map_17(p, p, tmp);
  134108. }
  134109. if (err == MP_OKAY) {
  134110. err = sp_521_to_mp(p->x, pX);
  134111. }
  134112. if (err == MP_OKAY) {
  134113. err = sp_521_to_mp(p->y, pY);
  134114. }
  134115. if (err == MP_OKAY) {
  134116. err = sp_521_to_mp(p->z, pZ);
  134117. }
  134118. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  134119. if (tmp != NULL)
  134120. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
  134121. if (p != NULL)
  134122. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  134123. #endif
  134124. return err;
  134125. }
  134126. #endif /* WOLFSSL_PUBLIC_ECC_ADD_DBL */
  134127. #ifdef HAVE_COMP_KEY
  134128. /* Square root power for the P521 curve. */
  134129. static const uint32_t p521_sqrt_power[17] = {
  134130. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  134131. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  134132. 0x00000000,0x00000000,0x00000080
  134133. };
  134134. /* Find the square root of a number mod the prime of the curve.
  134135. *
  134136. * y The number to operate on and the result.
  134137. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  134138. */
  134139. static int sp_521_mont_sqrt_17(sp_digit* y)
  134140. {
  134141. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  134142. sp_digit* t = NULL;
  134143. #else
  134144. sp_digit t[2 * 17];
  134145. #endif
  134146. int err = MP_OKAY;
  134147. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  134148. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 17, NULL, DYNAMIC_TYPE_ECC);
  134149. if (t == NULL)
  134150. err = MEMORY_E;
  134151. #endif
  134152. if (err == MP_OKAY) {
  134153. {
  134154. int i;
  134155. XMEMCPY(t, y, sizeof(sp_digit) * 17);
  134156. for (i=518; i>=0; i--) {
  134157. sp_521_mont_sqr_17(t, t, p521_mod, p521_mp_mod);
  134158. if (p521_sqrt_power[i / 32] & ((sp_digit)1 << (i % 32)))
  134159. sp_521_mont_mul_17(t, t, y, p521_mod, p521_mp_mod);
  134160. }
  134161. XMEMCPY(y, t, sizeof(sp_digit) * 17);
  134162. }
  134163. }
  134164. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  134165. if (t != NULL)
  134166. XFREE(t, NULL, DYNAMIC_TYPE_ECC);
  134167. #endif
  134168. return err;
  134169. }
  134170. /* Uncompress the point given the X ordinate.
  134171. *
  134172. * xm X ordinate.
  134173. * odd Whether the Y ordinate is odd.
  134174. * ym Calculated Y ordinate.
  134175. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  134176. */
  134177. int sp_ecc_uncompress_521(mp_int* xm, int odd, mp_int* ym)
  134178. {
  134179. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  134180. sp_digit* x = NULL;
  134181. #else
  134182. sp_digit x[4 * 17];
  134183. #endif
  134184. sp_digit* y = NULL;
  134185. int err = MP_OKAY;
  134186. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  134187. x = (sp_digit*)XMALLOC(sizeof(sp_digit) * 4 * 17, NULL, DYNAMIC_TYPE_ECC);
  134188. if (x == NULL)
  134189. err = MEMORY_E;
  134190. #endif
  134191. if (err == MP_OKAY) {
  134192. y = x + 2 * 17;
  134193. sp_521_from_mp(x, 17, xm);
  134194. err = sp_521_mod_mul_norm_17(x, x, p521_mod);
  134195. }
  134196. if (err == MP_OKAY) {
  134197. /* y = x^3 */
  134198. {
  134199. sp_521_mont_sqr_17(y, x, p521_mod, p521_mp_mod);
  134200. sp_521_mont_mul_17(y, y, x, p521_mod, p521_mp_mod);
  134201. }
  134202. /* y = x^3 - 3x */
  134203. sp_521_mont_sub_17(y, y, x, p521_mod);
  134204. sp_521_mont_sub_17(y, y, x, p521_mod);
  134205. sp_521_mont_sub_17(y, y, x, p521_mod);
  134206. /* y = x^3 - 3x + b */
  134207. err = sp_521_mod_mul_norm_17(x, p521_b, p521_mod);
  134208. }
  134209. if (err == MP_OKAY) {
  134210. sp_521_mont_add_17(y, y, x, p521_mod);
  134211. /* y = sqrt(x^3 - 3x + b) */
  134212. err = sp_521_mont_sqrt_17(y);
  134213. }
  134214. if (err == MP_OKAY) {
  134215. XMEMSET(y + 17, 0, 17U * sizeof(sp_digit));
  134216. sp_521_mont_reduce_17(y, p521_mod, p521_mp_mod);
  134217. if ((((word32)y[0] ^ (word32)odd) & 1U) != 0U) {
  134218. sp_521_mont_sub_17(y, p521_mod, y, p521_mod);
  134219. }
  134220. err = sp_521_to_mp(y, ym);
  134221. }
  134222. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  134223. if (x != NULL)
  134224. XFREE(x, NULL, DYNAMIC_TYPE_ECC);
  134225. #endif
  134226. return err;
  134227. }
  134228. #endif
  134229. #endif /* WOLFSSL_SP_521 */
  134230. #ifdef WOLFCRYPT_HAVE_SAKKE
  134231. #ifdef WOLFSSL_SP_1024
  134232. /* Point structure to use. */
  134233. typedef struct sp_point_1024 {
  134234. /* X ordinate of point. */
  134235. sp_digit x[2 * 32];
  134236. /* Y ordinate of point. */
  134237. sp_digit y[2 * 32];
  134238. /* Z ordinate of point. */
  134239. sp_digit z[2 * 32];
  134240. /* Indicates point is at infinity. */
  134241. int infinity;
  134242. } sp_point_1024;
  134243. #ifndef WOLFSSL_SP_SMALL
  134244. #ifndef WOLFSSL_SP_LARGE_CODE
  134245. /* Multiply a and b into r. (r = a * b)
  134246. *
  134247. * r A single precision integer.
  134248. * a A single precision integer.
  134249. * b A single precision integer.
  134250. */
  134251. SP_NOINLINE static void sp_1024_mul_16(sp_digit* r, const sp_digit* a,
  134252. const sp_digit* b)
  134253. {
  134254. sp_digit t[16 * 2];
  134255. sp_digit* tmp = t;
  134256. __asm__ __volatile__ (
  134257. "movs r3, #0\n\t"
  134258. "movs r4, #0\n\t"
  134259. "mov r8, r3\n\t"
  134260. "mov r11, %[tmp]\n\t"
  134261. "mov r9, %[a]\n\t"
  134262. "mov r10, %[b]\n\t"
  134263. "movs r6, #0x40\n\t"
  134264. "add r6, r6, r9\n\t"
  134265. "mov r12, r6\n\t"
  134266. "\n"
  134267. "L_sp_1024_mul_16_words_%=:\n\t"
  134268. "movs %[tmp], #0\n\t"
  134269. "movs r5, #0\n\t"
  134270. "movs r6, #60\n\t"
  134271. "mov %[a], r8\n\t"
  134272. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134273. "subs %[a], %[a], r6\n\t"
  134274. #else
  134275. "sub %[a], %[a], r6\n\t"
  134276. #endif
  134277. #ifdef WOLFSSL_KEIL
  134278. "sbcs r6, r6, r6\n\t"
  134279. #elif defined(__clang__)
  134280. "sbcs r6, r6\n\t"
  134281. #else
  134282. "sbc r6, r6\n\t"
  134283. #endif
  134284. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134285. "mvns r6, r6\n\t"
  134286. #else
  134287. "mvn r6, r6\n\t"
  134288. #endif
  134289. #ifdef WOLFSSL_KEIL
  134290. "ands %[a], %[a], r6\n\t"
  134291. #elif defined(__clang__)
  134292. "ands %[a], r6\n\t"
  134293. #else
  134294. "and %[a], r6\n\t"
  134295. #endif
  134296. "mov %[b], r8\n\t"
  134297. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134298. "subs %[b], %[b], %[a]\n\t"
  134299. #else
  134300. "sub %[b], %[b], %[a]\n\t"
  134301. #endif
  134302. "add %[a], %[a], r9\n\t"
  134303. "add %[b], %[b], r10\n\t"
  134304. "\n"
  134305. "L_sp_1024_mul_16_mul_%=:\n\t"
  134306. "# Multiply Start\n\t"
  134307. "ldrh r6, [%[a]]\n\t"
  134308. "ldrh r7, [%[b]]\n\t"
  134309. #ifdef WOLFSSL_KEIL
  134310. "muls r7, r6, r7\n\t"
  134311. #elif defined(__clang__)
  134312. "muls r7, r6\n\t"
  134313. #else
  134314. "mul r7, r6\n\t"
  134315. #endif
  134316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134317. "adds r3, r3, r7\n\t"
  134318. #else
  134319. "add r3, r3, r7\n\t"
  134320. #endif
  134321. #ifdef WOLFSSL_KEIL
  134322. "adcs r4, r4, %[tmp]\n\t"
  134323. #elif defined(__clang__)
  134324. "adcs r4, %[tmp]\n\t"
  134325. #else
  134326. "adc r4, %[tmp]\n\t"
  134327. #endif
  134328. #ifdef WOLFSSL_KEIL
  134329. "adcs r5, r5, %[tmp]\n\t"
  134330. #elif defined(__clang__)
  134331. "adcs r5, %[tmp]\n\t"
  134332. #else
  134333. "adc r5, %[tmp]\n\t"
  134334. #endif
  134335. "ldr r7, [%[b]]\n\t"
  134336. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134337. "lsrs r7, r7, #16\n\t"
  134338. #else
  134339. "lsr r7, r7, #16\n\t"
  134340. #endif
  134341. #ifdef WOLFSSL_KEIL
  134342. "muls r6, r7, r6\n\t"
  134343. #elif defined(__clang__)
  134344. "muls r6, r7\n\t"
  134345. #else
  134346. "mul r6, r7\n\t"
  134347. #endif
  134348. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134349. "lsrs r7, r6, #16\n\t"
  134350. #else
  134351. "lsr r7, r6, #16\n\t"
  134352. #endif
  134353. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134354. "lsls r6, r6, #16\n\t"
  134355. #else
  134356. "lsl r6, r6, #16\n\t"
  134357. #endif
  134358. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134359. "adds r3, r3, r6\n\t"
  134360. #else
  134361. "add r3, r3, r6\n\t"
  134362. #endif
  134363. #ifdef WOLFSSL_KEIL
  134364. "adcs r4, r4, r7\n\t"
  134365. #elif defined(__clang__)
  134366. "adcs r4, r7\n\t"
  134367. #else
  134368. "adc r4, r7\n\t"
  134369. #endif
  134370. #ifdef WOLFSSL_KEIL
  134371. "adcs r5, r5, %[tmp]\n\t"
  134372. #elif defined(__clang__)
  134373. "adcs r5, %[tmp]\n\t"
  134374. #else
  134375. "adc r5, %[tmp]\n\t"
  134376. #endif
  134377. "ldr r6, [%[a]]\n\t"
  134378. "ldr r7, [%[b]]\n\t"
  134379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134380. "lsrs r6, r6, #16\n\t"
  134381. #else
  134382. "lsr r6, r6, #16\n\t"
  134383. #endif
  134384. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134385. "lsrs r7, r7, #16\n\t"
  134386. #else
  134387. "lsr r7, r7, #16\n\t"
  134388. #endif
  134389. #ifdef WOLFSSL_KEIL
  134390. "muls r7, r6, r7\n\t"
  134391. #elif defined(__clang__)
  134392. "muls r7, r6\n\t"
  134393. #else
  134394. "mul r7, r6\n\t"
  134395. #endif
  134396. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134397. "adds r4, r4, r7\n\t"
  134398. #else
  134399. "add r4, r4, r7\n\t"
  134400. #endif
  134401. #ifdef WOLFSSL_KEIL
  134402. "adcs r5, r5, %[tmp]\n\t"
  134403. #elif defined(__clang__)
  134404. "adcs r5, %[tmp]\n\t"
  134405. #else
  134406. "adc r5, %[tmp]\n\t"
  134407. #endif
  134408. "ldrh r7, [%[b]]\n\t"
  134409. #ifdef WOLFSSL_KEIL
  134410. "muls r6, r7, r6\n\t"
  134411. #elif defined(__clang__)
  134412. "muls r6, r7\n\t"
  134413. #else
  134414. "mul r6, r7\n\t"
  134415. #endif
  134416. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134417. "lsrs r7, r6, #16\n\t"
  134418. #else
  134419. "lsr r7, r6, #16\n\t"
  134420. #endif
  134421. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134422. "lsls r6, r6, #16\n\t"
  134423. #else
  134424. "lsl r6, r6, #16\n\t"
  134425. #endif
  134426. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134427. "adds r3, r3, r6\n\t"
  134428. #else
  134429. "add r3, r3, r6\n\t"
  134430. #endif
  134431. #ifdef WOLFSSL_KEIL
  134432. "adcs r4, r4, r7\n\t"
  134433. #elif defined(__clang__)
  134434. "adcs r4, r7\n\t"
  134435. #else
  134436. "adc r4, r7\n\t"
  134437. #endif
  134438. #ifdef WOLFSSL_KEIL
  134439. "adcs r5, r5, %[tmp]\n\t"
  134440. #elif defined(__clang__)
  134441. "adcs r5, %[tmp]\n\t"
  134442. #else
  134443. "adc r5, %[tmp]\n\t"
  134444. #endif
  134445. "# Multiply Done\n\t"
  134446. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134447. "adds %[a], %[a], #4\n\t"
  134448. #else
  134449. "add %[a], %[a], #4\n\t"
  134450. #endif
  134451. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134452. "subs %[b], %[b], #4\n\t"
  134453. #else
  134454. "sub %[b], %[b], #4\n\t"
  134455. #endif
  134456. "cmp %[a], r12\n\t"
  134457. "beq L_sp_1024_mul_16_done_mul_%=\n\t"
  134458. "mov r6, r8\n\t"
  134459. "add r6, r6, r9\n\t"
  134460. "cmp %[a], r6\n\t"
  134461. "ble L_sp_1024_mul_16_mul_%=\n\t"
  134462. "\n"
  134463. "L_sp_1024_mul_16_done_mul_%=:\n\t"
  134464. "mov %[tmp], r11\n\t"
  134465. "mov r7, r8\n\t"
  134466. "str r3, [%[tmp], r7]\n\t"
  134467. "movs r3, r4\n\t"
  134468. "movs r4, r5\n\t"
  134469. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134470. "adds r7, r7, #4\n\t"
  134471. #else
  134472. "add r7, r7, #4\n\t"
  134473. #endif
  134474. "mov r8, r7\n\t"
  134475. "movs r6, #0x78\n\t"
  134476. "cmp r7, r6\n\t"
  134477. "ble L_sp_1024_mul_16_words_%=\n\t"
  134478. "str r3, [%[tmp], r7]\n\t"
  134479. "mov %[a], r9\n\t"
  134480. "mov %[b], r10\n\t"
  134481. : [a] "+l" (a), [b] "+l" (b), [tmp] "+l" (tmp)
  134482. :
  134483. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  134484. );
  134485. XMEMCPY(r, t, sizeof(t));
  134486. }
  134487. #else
  134488. /* Multiply a and b into r. (r = a * b)
  134489. *
  134490. * r A single precision integer.
  134491. * a A single precision integer.
  134492. * b A single precision integer.
  134493. */
  134494. SP_NOINLINE static void sp_1024_mul_16(sp_digit* r, const sp_digit* a,
  134495. const sp_digit* b)
  134496. {
  134497. __asm__ __volatile__ (
  134498. "sub sp, sp, #0x40\n\t"
  134499. "mov r8, %[r]\n\t"
  134500. "mov r9, %[a]\n\t"
  134501. "mov r10, %[b]\n\t"
  134502. "movs %[r], #0\n\t"
  134503. "# A[0] * B[0]\n\t"
  134504. "ldr %[a], [%[a]]\n\t"
  134505. "ldr %[b], [%[b]]\n\t"
  134506. "uxth r6, %[a]\n\t"
  134507. "uxth r3, %[b]\n\t"
  134508. #ifdef WOLFSSL_KEIL
  134509. "muls r3, r6, r3\n\t"
  134510. #elif defined(__clang__)
  134511. "muls r3, r6\n\t"
  134512. #else
  134513. "mul r3, r6\n\t"
  134514. #endif
  134515. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134516. "lsrs r7, %[b], #16\n\t"
  134517. #else
  134518. "lsr r7, %[b], #16\n\t"
  134519. #endif
  134520. #ifdef WOLFSSL_KEIL
  134521. "muls r6, r7, r6\n\t"
  134522. #elif defined(__clang__)
  134523. "muls r6, r7\n\t"
  134524. #else
  134525. "mul r6, r7\n\t"
  134526. #endif
  134527. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134528. "lsrs r4, r6, #16\n\t"
  134529. #else
  134530. "lsr r4, r6, #16\n\t"
  134531. #endif
  134532. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134533. "lsls r6, r6, #16\n\t"
  134534. #else
  134535. "lsl r6, r6, #16\n\t"
  134536. #endif
  134537. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134538. "adds r3, r3, r6\n\t"
  134539. #else
  134540. "add r3, r3, r6\n\t"
  134541. #endif
  134542. #ifdef WOLFSSL_KEIL
  134543. "adcs r4, r4, %[r]\n\t"
  134544. #elif defined(__clang__)
  134545. "adcs r4, %[r]\n\t"
  134546. #else
  134547. "adc r4, %[r]\n\t"
  134548. #endif
  134549. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134550. "lsrs r6, %[a], #16\n\t"
  134551. #else
  134552. "lsr r6, %[a], #16\n\t"
  134553. #endif
  134554. #ifdef WOLFSSL_KEIL
  134555. "muls r7, r6, r7\n\t"
  134556. #elif defined(__clang__)
  134557. "muls r7, r6\n\t"
  134558. #else
  134559. "mul r7, r6\n\t"
  134560. #endif
  134561. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134562. "adds r4, r4, r7\n\t"
  134563. #else
  134564. "add r4, r4, r7\n\t"
  134565. #endif
  134566. "uxth r7, %[b]\n\t"
  134567. #ifdef WOLFSSL_KEIL
  134568. "muls r6, r7, r6\n\t"
  134569. #elif defined(__clang__)
  134570. "muls r6, r7\n\t"
  134571. #else
  134572. "mul r6, r7\n\t"
  134573. #endif
  134574. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134575. "lsrs r7, r6, #16\n\t"
  134576. #else
  134577. "lsr r7, r6, #16\n\t"
  134578. #endif
  134579. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134580. "lsls r6, r6, #16\n\t"
  134581. #else
  134582. "lsl r6, r6, #16\n\t"
  134583. #endif
  134584. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134585. "adds r3, r3, r6\n\t"
  134586. #else
  134587. "add r3, r3, r6\n\t"
  134588. #endif
  134589. #ifdef WOLFSSL_KEIL
  134590. "adcs r4, r4, r7\n\t"
  134591. #elif defined(__clang__)
  134592. "adcs r4, r7\n\t"
  134593. #else
  134594. "adc r4, r7\n\t"
  134595. #endif
  134596. "movs r5, #0\n\t"
  134597. "str r3, [sp]\n\t"
  134598. "# A[0] * B[1]\n\t"
  134599. "movs r3, #0\n\t"
  134600. "mov %[a], r9\n\t"
  134601. "mov %[b], r10\n\t"
  134602. "ldr %[a], [%[a]]\n\t"
  134603. "ldr %[b], [%[b], #4]\n\t"
  134604. "uxth r6, %[a]\n\t"
  134605. "uxth r7, %[b]\n\t"
  134606. #ifdef WOLFSSL_KEIL
  134607. "muls r7, r6, r7\n\t"
  134608. #elif defined(__clang__)
  134609. "muls r7, r6\n\t"
  134610. #else
  134611. "mul r7, r6\n\t"
  134612. #endif
  134613. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134614. "adds r4, r4, r7\n\t"
  134615. #else
  134616. "add r4, r4, r7\n\t"
  134617. #endif
  134618. #ifdef WOLFSSL_KEIL
  134619. "adcs r5, r5, %[r]\n\t"
  134620. #elif defined(__clang__)
  134621. "adcs r5, %[r]\n\t"
  134622. #else
  134623. "adc r5, %[r]\n\t"
  134624. #endif
  134625. #ifdef WOLFSSL_KEIL
  134626. "adcs r3, r3, %[r]\n\t"
  134627. #elif defined(__clang__)
  134628. "adcs r3, %[r]\n\t"
  134629. #else
  134630. "adc r3, %[r]\n\t"
  134631. #endif
  134632. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134633. "lsrs r7, %[b], #16\n\t"
  134634. #else
  134635. "lsr r7, %[b], #16\n\t"
  134636. #endif
  134637. #ifdef WOLFSSL_KEIL
  134638. "muls r6, r7, r6\n\t"
  134639. #elif defined(__clang__)
  134640. "muls r6, r7\n\t"
  134641. #else
  134642. "mul r6, r7\n\t"
  134643. #endif
  134644. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134645. "lsrs r7, r6, #16\n\t"
  134646. #else
  134647. "lsr r7, r6, #16\n\t"
  134648. #endif
  134649. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134650. "lsls r6, r6, #16\n\t"
  134651. #else
  134652. "lsl r6, r6, #16\n\t"
  134653. #endif
  134654. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134655. "adds r4, r4, r6\n\t"
  134656. #else
  134657. "add r4, r4, r6\n\t"
  134658. #endif
  134659. #ifdef WOLFSSL_KEIL
  134660. "adcs r5, r5, r7\n\t"
  134661. #elif defined(__clang__)
  134662. "adcs r5, r7\n\t"
  134663. #else
  134664. "adc r5, r7\n\t"
  134665. #endif
  134666. #ifdef WOLFSSL_KEIL
  134667. "adcs r3, r3, %[r]\n\t"
  134668. #elif defined(__clang__)
  134669. "adcs r3, %[r]\n\t"
  134670. #else
  134671. "adc r3, %[r]\n\t"
  134672. #endif
  134673. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134674. "lsrs r6, %[a], #16\n\t"
  134675. #else
  134676. "lsr r6, %[a], #16\n\t"
  134677. #endif
  134678. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134679. "lsrs r7, %[b], #16\n\t"
  134680. #else
  134681. "lsr r7, %[b], #16\n\t"
  134682. #endif
  134683. #ifdef WOLFSSL_KEIL
  134684. "muls r7, r6, r7\n\t"
  134685. #elif defined(__clang__)
  134686. "muls r7, r6\n\t"
  134687. #else
  134688. "mul r7, r6\n\t"
  134689. #endif
  134690. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134691. "adds r5, r5, r7\n\t"
  134692. #else
  134693. "add r5, r5, r7\n\t"
  134694. #endif
  134695. #ifdef WOLFSSL_KEIL
  134696. "adcs r3, r3, %[r]\n\t"
  134697. #elif defined(__clang__)
  134698. "adcs r3, %[r]\n\t"
  134699. #else
  134700. "adc r3, %[r]\n\t"
  134701. #endif
  134702. "uxth r7, %[b]\n\t"
  134703. #ifdef WOLFSSL_KEIL
  134704. "muls r6, r7, r6\n\t"
  134705. #elif defined(__clang__)
  134706. "muls r6, r7\n\t"
  134707. #else
  134708. "mul r6, r7\n\t"
  134709. #endif
  134710. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134711. "lsrs r7, r6, #16\n\t"
  134712. #else
  134713. "lsr r7, r6, #16\n\t"
  134714. #endif
  134715. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134716. "lsls r6, r6, #16\n\t"
  134717. #else
  134718. "lsl r6, r6, #16\n\t"
  134719. #endif
  134720. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134721. "adds r4, r4, r6\n\t"
  134722. #else
  134723. "add r4, r4, r6\n\t"
  134724. #endif
  134725. #ifdef WOLFSSL_KEIL
  134726. "adcs r5, r5, r7\n\t"
  134727. #elif defined(__clang__)
  134728. "adcs r5, r7\n\t"
  134729. #else
  134730. "adc r5, r7\n\t"
  134731. #endif
  134732. #ifdef WOLFSSL_KEIL
  134733. "adcs r3, r3, %[r]\n\t"
  134734. #elif defined(__clang__)
  134735. "adcs r3, %[r]\n\t"
  134736. #else
  134737. "adc r3, %[r]\n\t"
  134738. #endif
  134739. "# A[1] * B[0]\n\t"
  134740. "mov %[a], r9\n\t"
  134741. "mov %[b], r10\n\t"
  134742. "ldr %[a], [%[a], #4]\n\t"
  134743. "ldr %[b], [%[b]]\n\t"
  134744. "uxth r6, %[a]\n\t"
  134745. "uxth r7, %[b]\n\t"
  134746. #ifdef WOLFSSL_KEIL
  134747. "muls r7, r6, r7\n\t"
  134748. #elif defined(__clang__)
  134749. "muls r7, r6\n\t"
  134750. #else
  134751. "mul r7, r6\n\t"
  134752. #endif
  134753. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134754. "adds r4, r4, r7\n\t"
  134755. #else
  134756. "add r4, r4, r7\n\t"
  134757. #endif
  134758. #ifdef WOLFSSL_KEIL
  134759. "adcs r5, r5, %[r]\n\t"
  134760. #elif defined(__clang__)
  134761. "adcs r5, %[r]\n\t"
  134762. #else
  134763. "adc r5, %[r]\n\t"
  134764. #endif
  134765. #ifdef WOLFSSL_KEIL
  134766. "adcs r3, r3, %[r]\n\t"
  134767. #elif defined(__clang__)
  134768. "adcs r3, %[r]\n\t"
  134769. #else
  134770. "adc r3, %[r]\n\t"
  134771. #endif
  134772. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134773. "lsrs r7, %[b], #16\n\t"
  134774. #else
  134775. "lsr r7, %[b], #16\n\t"
  134776. #endif
  134777. #ifdef WOLFSSL_KEIL
  134778. "muls r6, r7, r6\n\t"
  134779. #elif defined(__clang__)
  134780. "muls r6, r7\n\t"
  134781. #else
  134782. "mul r6, r7\n\t"
  134783. #endif
  134784. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134785. "lsrs r7, r6, #16\n\t"
  134786. #else
  134787. "lsr r7, r6, #16\n\t"
  134788. #endif
  134789. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134790. "lsls r6, r6, #16\n\t"
  134791. #else
  134792. "lsl r6, r6, #16\n\t"
  134793. #endif
  134794. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134795. "adds r4, r4, r6\n\t"
  134796. #else
  134797. "add r4, r4, r6\n\t"
  134798. #endif
  134799. #ifdef WOLFSSL_KEIL
  134800. "adcs r5, r5, r7\n\t"
  134801. #elif defined(__clang__)
  134802. "adcs r5, r7\n\t"
  134803. #else
  134804. "adc r5, r7\n\t"
  134805. #endif
  134806. #ifdef WOLFSSL_KEIL
  134807. "adcs r3, r3, %[r]\n\t"
  134808. #elif defined(__clang__)
  134809. "adcs r3, %[r]\n\t"
  134810. #else
  134811. "adc r3, %[r]\n\t"
  134812. #endif
  134813. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134814. "lsrs r6, %[a], #16\n\t"
  134815. #else
  134816. "lsr r6, %[a], #16\n\t"
  134817. #endif
  134818. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134819. "lsrs r7, %[b], #16\n\t"
  134820. #else
  134821. "lsr r7, %[b], #16\n\t"
  134822. #endif
  134823. #ifdef WOLFSSL_KEIL
  134824. "muls r7, r6, r7\n\t"
  134825. #elif defined(__clang__)
  134826. "muls r7, r6\n\t"
  134827. #else
  134828. "mul r7, r6\n\t"
  134829. #endif
  134830. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134831. "adds r5, r5, r7\n\t"
  134832. #else
  134833. "add r5, r5, r7\n\t"
  134834. #endif
  134835. #ifdef WOLFSSL_KEIL
  134836. "adcs r3, r3, %[r]\n\t"
  134837. #elif defined(__clang__)
  134838. "adcs r3, %[r]\n\t"
  134839. #else
  134840. "adc r3, %[r]\n\t"
  134841. #endif
  134842. "uxth r7, %[b]\n\t"
  134843. #ifdef WOLFSSL_KEIL
  134844. "muls r6, r7, r6\n\t"
  134845. #elif defined(__clang__)
  134846. "muls r6, r7\n\t"
  134847. #else
  134848. "mul r6, r7\n\t"
  134849. #endif
  134850. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134851. "lsrs r7, r6, #16\n\t"
  134852. #else
  134853. "lsr r7, r6, #16\n\t"
  134854. #endif
  134855. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134856. "lsls r6, r6, #16\n\t"
  134857. #else
  134858. "lsl r6, r6, #16\n\t"
  134859. #endif
  134860. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134861. "adds r4, r4, r6\n\t"
  134862. #else
  134863. "add r4, r4, r6\n\t"
  134864. #endif
  134865. #ifdef WOLFSSL_KEIL
  134866. "adcs r5, r5, r7\n\t"
  134867. #elif defined(__clang__)
  134868. "adcs r5, r7\n\t"
  134869. #else
  134870. "adc r5, r7\n\t"
  134871. #endif
  134872. #ifdef WOLFSSL_KEIL
  134873. "adcs r3, r3, %[r]\n\t"
  134874. #elif defined(__clang__)
  134875. "adcs r3, %[r]\n\t"
  134876. #else
  134877. "adc r3, %[r]\n\t"
  134878. #endif
  134879. "str r4, [sp, #4]\n\t"
  134880. "# A[2] * B[0]\n\t"
  134881. "movs r4, #0\n\t"
  134882. "mov %[a], r9\n\t"
  134883. "mov %[b], r10\n\t"
  134884. "ldr %[a], [%[a], #8]\n\t"
  134885. "ldr %[b], [%[b]]\n\t"
  134886. "uxth r6, %[a]\n\t"
  134887. "uxth r7, %[b]\n\t"
  134888. #ifdef WOLFSSL_KEIL
  134889. "muls r7, r6, r7\n\t"
  134890. #elif defined(__clang__)
  134891. "muls r7, r6\n\t"
  134892. #else
  134893. "mul r7, r6\n\t"
  134894. #endif
  134895. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134896. "adds r5, r5, r7\n\t"
  134897. #else
  134898. "add r5, r5, r7\n\t"
  134899. #endif
  134900. #ifdef WOLFSSL_KEIL
  134901. "adcs r3, r3, %[r]\n\t"
  134902. #elif defined(__clang__)
  134903. "adcs r3, %[r]\n\t"
  134904. #else
  134905. "adc r3, %[r]\n\t"
  134906. #endif
  134907. #ifdef WOLFSSL_KEIL
  134908. "adcs r4, r4, %[r]\n\t"
  134909. #elif defined(__clang__)
  134910. "adcs r4, %[r]\n\t"
  134911. #else
  134912. "adc r4, %[r]\n\t"
  134913. #endif
  134914. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134915. "lsrs r7, %[b], #16\n\t"
  134916. #else
  134917. "lsr r7, %[b], #16\n\t"
  134918. #endif
  134919. #ifdef WOLFSSL_KEIL
  134920. "muls r6, r7, r6\n\t"
  134921. #elif defined(__clang__)
  134922. "muls r6, r7\n\t"
  134923. #else
  134924. "mul r6, r7\n\t"
  134925. #endif
  134926. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134927. "lsrs r7, r6, #16\n\t"
  134928. #else
  134929. "lsr r7, r6, #16\n\t"
  134930. #endif
  134931. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134932. "lsls r6, r6, #16\n\t"
  134933. #else
  134934. "lsl r6, r6, #16\n\t"
  134935. #endif
  134936. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134937. "adds r5, r5, r6\n\t"
  134938. #else
  134939. "add r5, r5, r6\n\t"
  134940. #endif
  134941. #ifdef WOLFSSL_KEIL
  134942. "adcs r3, r3, r7\n\t"
  134943. #elif defined(__clang__)
  134944. "adcs r3, r7\n\t"
  134945. #else
  134946. "adc r3, r7\n\t"
  134947. #endif
  134948. #ifdef WOLFSSL_KEIL
  134949. "adcs r4, r4, %[r]\n\t"
  134950. #elif defined(__clang__)
  134951. "adcs r4, %[r]\n\t"
  134952. #else
  134953. "adc r4, %[r]\n\t"
  134954. #endif
  134955. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134956. "lsrs r6, %[a], #16\n\t"
  134957. #else
  134958. "lsr r6, %[a], #16\n\t"
  134959. #endif
  134960. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134961. "lsrs r7, %[b], #16\n\t"
  134962. #else
  134963. "lsr r7, %[b], #16\n\t"
  134964. #endif
  134965. #ifdef WOLFSSL_KEIL
  134966. "muls r7, r6, r7\n\t"
  134967. #elif defined(__clang__)
  134968. "muls r7, r6\n\t"
  134969. #else
  134970. "mul r7, r6\n\t"
  134971. #endif
  134972. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134973. "adds r3, r3, r7\n\t"
  134974. #else
  134975. "add r3, r3, r7\n\t"
  134976. #endif
  134977. #ifdef WOLFSSL_KEIL
  134978. "adcs r4, r4, %[r]\n\t"
  134979. #elif defined(__clang__)
  134980. "adcs r4, %[r]\n\t"
  134981. #else
  134982. "adc r4, %[r]\n\t"
  134983. #endif
  134984. "uxth r7, %[b]\n\t"
  134985. #ifdef WOLFSSL_KEIL
  134986. "muls r6, r7, r6\n\t"
  134987. #elif defined(__clang__)
  134988. "muls r6, r7\n\t"
  134989. #else
  134990. "mul r6, r7\n\t"
  134991. #endif
  134992. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134993. "lsrs r7, r6, #16\n\t"
  134994. #else
  134995. "lsr r7, r6, #16\n\t"
  134996. #endif
  134997. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134998. "lsls r6, r6, #16\n\t"
  134999. #else
  135000. "lsl r6, r6, #16\n\t"
  135001. #endif
  135002. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135003. "adds r5, r5, r6\n\t"
  135004. #else
  135005. "add r5, r5, r6\n\t"
  135006. #endif
  135007. #ifdef WOLFSSL_KEIL
  135008. "adcs r3, r3, r7\n\t"
  135009. #elif defined(__clang__)
  135010. "adcs r3, r7\n\t"
  135011. #else
  135012. "adc r3, r7\n\t"
  135013. #endif
  135014. #ifdef WOLFSSL_KEIL
  135015. "adcs r4, r4, %[r]\n\t"
  135016. #elif defined(__clang__)
  135017. "adcs r4, %[r]\n\t"
  135018. #else
  135019. "adc r4, %[r]\n\t"
  135020. #endif
  135021. "# A[1] * B[1]\n\t"
  135022. "mov %[a], r9\n\t"
  135023. "mov %[b], r10\n\t"
  135024. "ldr %[a], [%[a], #4]\n\t"
  135025. "ldr %[b], [%[b], #4]\n\t"
  135026. "uxth r6, %[a]\n\t"
  135027. "uxth r7, %[b]\n\t"
  135028. #ifdef WOLFSSL_KEIL
  135029. "muls r7, r6, r7\n\t"
  135030. #elif defined(__clang__)
  135031. "muls r7, r6\n\t"
  135032. #else
  135033. "mul r7, r6\n\t"
  135034. #endif
  135035. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135036. "adds r5, r5, r7\n\t"
  135037. #else
  135038. "add r5, r5, r7\n\t"
  135039. #endif
  135040. #ifdef WOLFSSL_KEIL
  135041. "adcs r3, r3, %[r]\n\t"
  135042. #elif defined(__clang__)
  135043. "adcs r3, %[r]\n\t"
  135044. #else
  135045. "adc r3, %[r]\n\t"
  135046. #endif
  135047. #ifdef WOLFSSL_KEIL
  135048. "adcs r4, r4, %[r]\n\t"
  135049. #elif defined(__clang__)
  135050. "adcs r4, %[r]\n\t"
  135051. #else
  135052. "adc r4, %[r]\n\t"
  135053. #endif
  135054. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135055. "lsrs r7, %[b], #16\n\t"
  135056. #else
  135057. "lsr r7, %[b], #16\n\t"
  135058. #endif
  135059. #ifdef WOLFSSL_KEIL
  135060. "muls r6, r7, r6\n\t"
  135061. #elif defined(__clang__)
  135062. "muls r6, r7\n\t"
  135063. #else
  135064. "mul r6, r7\n\t"
  135065. #endif
  135066. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135067. "lsrs r7, r6, #16\n\t"
  135068. #else
  135069. "lsr r7, r6, #16\n\t"
  135070. #endif
  135071. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135072. "lsls r6, r6, #16\n\t"
  135073. #else
  135074. "lsl r6, r6, #16\n\t"
  135075. #endif
  135076. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135077. "adds r5, r5, r6\n\t"
  135078. #else
  135079. "add r5, r5, r6\n\t"
  135080. #endif
  135081. #ifdef WOLFSSL_KEIL
  135082. "adcs r3, r3, r7\n\t"
  135083. #elif defined(__clang__)
  135084. "adcs r3, r7\n\t"
  135085. #else
  135086. "adc r3, r7\n\t"
  135087. #endif
  135088. #ifdef WOLFSSL_KEIL
  135089. "adcs r4, r4, %[r]\n\t"
  135090. #elif defined(__clang__)
  135091. "adcs r4, %[r]\n\t"
  135092. #else
  135093. "adc r4, %[r]\n\t"
  135094. #endif
  135095. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135096. "lsrs r6, %[a], #16\n\t"
  135097. #else
  135098. "lsr r6, %[a], #16\n\t"
  135099. #endif
  135100. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135101. "lsrs r7, %[b], #16\n\t"
  135102. #else
  135103. "lsr r7, %[b], #16\n\t"
  135104. #endif
  135105. #ifdef WOLFSSL_KEIL
  135106. "muls r7, r6, r7\n\t"
  135107. #elif defined(__clang__)
  135108. "muls r7, r6\n\t"
  135109. #else
  135110. "mul r7, r6\n\t"
  135111. #endif
  135112. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135113. "adds r3, r3, r7\n\t"
  135114. #else
  135115. "add r3, r3, r7\n\t"
  135116. #endif
  135117. #ifdef WOLFSSL_KEIL
  135118. "adcs r4, r4, %[r]\n\t"
  135119. #elif defined(__clang__)
  135120. "adcs r4, %[r]\n\t"
  135121. #else
  135122. "adc r4, %[r]\n\t"
  135123. #endif
  135124. "uxth r7, %[b]\n\t"
  135125. #ifdef WOLFSSL_KEIL
  135126. "muls r6, r7, r6\n\t"
  135127. #elif defined(__clang__)
  135128. "muls r6, r7\n\t"
  135129. #else
  135130. "mul r6, r7\n\t"
  135131. #endif
  135132. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135133. "lsrs r7, r6, #16\n\t"
  135134. #else
  135135. "lsr r7, r6, #16\n\t"
  135136. #endif
  135137. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135138. "lsls r6, r6, #16\n\t"
  135139. #else
  135140. "lsl r6, r6, #16\n\t"
  135141. #endif
  135142. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135143. "adds r5, r5, r6\n\t"
  135144. #else
  135145. "add r5, r5, r6\n\t"
  135146. #endif
  135147. #ifdef WOLFSSL_KEIL
  135148. "adcs r3, r3, r7\n\t"
  135149. #elif defined(__clang__)
  135150. "adcs r3, r7\n\t"
  135151. #else
  135152. "adc r3, r7\n\t"
  135153. #endif
  135154. #ifdef WOLFSSL_KEIL
  135155. "adcs r4, r4, %[r]\n\t"
  135156. #elif defined(__clang__)
  135157. "adcs r4, %[r]\n\t"
  135158. #else
  135159. "adc r4, %[r]\n\t"
  135160. #endif
  135161. "# A[0] * B[2]\n\t"
  135162. "mov %[a], r9\n\t"
  135163. "mov %[b], r10\n\t"
  135164. "ldr %[a], [%[a]]\n\t"
  135165. "ldr %[b], [%[b], #8]\n\t"
  135166. "uxth r6, %[a]\n\t"
  135167. "uxth r7, %[b]\n\t"
  135168. #ifdef WOLFSSL_KEIL
  135169. "muls r7, r6, r7\n\t"
  135170. #elif defined(__clang__)
  135171. "muls r7, r6\n\t"
  135172. #else
  135173. "mul r7, r6\n\t"
  135174. #endif
  135175. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135176. "adds r5, r5, r7\n\t"
  135177. #else
  135178. "add r5, r5, r7\n\t"
  135179. #endif
  135180. #ifdef WOLFSSL_KEIL
  135181. "adcs r3, r3, %[r]\n\t"
  135182. #elif defined(__clang__)
  135183. "adcs r3, %[r]\n\t"
  135184. #else
  135185. "adc r3, %[r]\n\t"
  135186. #endif
  135187. #ifdef WOLFSSL_KEIL
  135188. "adcs r4, r4, %[r]\n\t"
  135189. #elif defined(__clang__)
  135190. "adcs r4, %[r]\n\t"
  135191. #else
  135192. "adc r4, %[r]\n\t"
  135193. #endif
  135194. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135195. "lsrs r7, %[b], #16\n\t"
  135196. #else
  135197. "lsr r7, %[b], #16\n\t"
  135198. #endif
  135199. #ifdef WOLFSSL_KEIL
  135200. "muls r6, r7, r6\n\t"
  135201. #elif defined(__clang__)
  135202. "muls r6, r7\n\t"
  135203. #else
  135204. "mul r6, r7\n\t"
  135205. #endif
  135206. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135207. "lsrs r7, r6, #16\n\t"
  135208. #else
  135209. "lsr r7, r6, #16\n\t"
  135210. #endif
  135211. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135212. "lsls r6, r6, #16\n\t"
  135213. #else
  135214. "lsl r6, r6, #16\n\t"
  135215. #endif
  135216. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135217. "adds r5, r5, r6\n\t"
  135218. #else
  135219. "add r5, r5, r6\n\t"
  135220. #endif
  135221. #ifdef WOLFSSL_KEIL
  135222. "adcs r3, r3, r7\n\t"
  135223. #elif defined(__clang__)
  135224. "adcs r3, r7\n\t"
  135225. #else
  135226. "adc r3, r7\n\t"
  135227. #endif
  135228. #ifdef WOLFSSL_KEIL
  135229. "adcs r4, r4, %[r]\n\t"
  135230. #elif defined(__clang__)
  135231. "adcs r4, %[r]\n\t"
  135232. #else
  135233. "adc r4, %[r]\n\t"
  135234. #endif
  135235. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135236. "lsrs r6, %[a], #16\n\t"
  135237. #else
  135238. "lsr r6, %[a], #16\n\t"
  135239. #endif
  135240. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135241. "lsrs r7, %[b], #16\n\t"
  135242. #else
  135243. "lsr r7, %[b], #16\n\t"
  135244. #endif
  135245. #ifdef WOLFSSL_KEIL
  135246. "muls r7, r6, r7\n\t"
  135247. #elif defined(__clang__)
  135248. "muls r7, r6\n\t"
  135249. #else
  135250. "mul r7, r6\n\t"
  135251. #endif
  135252. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135253. "adds r3, r3, r7\n\t"
  135254. #else
  135255. "add r3, r3, r7\n\t"
  135256. #endif
  135257. #ifdef WOLFSSL_KEIL
  135258. "adcs r4, r4, %[r]\n\t"
  135259. #elif defined(__clang__)
  135260. "adcs r4, %[r]\n\t"
  135261. #else
  135262. "adc r4, %[r]\n\t"
  135263. #endif
  135264. "uxth r7, %[b]\n\t"
  135265. #ifdef WOLFSSL_KEIL
  135266. "muls r6, r7, r6\n\t"
  135267. #elif defined(__clang__)
  135268. "muls r6, r7\n\t"
  135269. #else
  135270. "mul r6, r7\n\t"
  135271. #endif
  135272. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135273. "lsrs r7, r6, #16\n\t"
  135274. #else
  135275. "lsr r7, r6, #16\n\t"
  135276. #endif
  135277. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135278. "lsls r6, r6, #16\n\t"
  135279. #else
  135280. "lsl r6, r6, #16\n\t"
  135281. #endif
  135282. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135283. "adds r5, r5, r6\n\t"
  135284. #else
  135285. "add r5, r5, r6\n\t"
  135286. #endif
  135287. #ifdef WOLFSSL_KEIL
  135288. "adcs r3, r3, r7\n\t"
  135289. #elif defined(__clang__)
  135290. "adcs r3, r7\n\t"
  135291. #else
  135292. "adc r3, r7\n\t"
  135293. #endif
  135294. #ifdef WOLFSSL_KEIL
  135295. "adcs r4, r4, %[r]\n\t"
  135296. #elif defined(__clang__)
  135297. "adcs r4, %[r]\n\t"
  135298. #else
  135299. "adc r4, %[r]\n\t"
  135300. #endif
  135301. "str r5, [sp, #8]\n\t"
  135302. "# A[0] * B[3]\n\t"
  135303. "movs r5, #0\n\t"
  135304. "mov %[a], r9\n\t"
  135305. "mov %[b], r10\n\t"
  135306. "ldr %[a], [%[a]]\n\t"
  135307. "ldr %[b], [%[b], #12]\n\t"
  135308. "uxth r6, %[a]\n\t"
  135309. "uxth r7, %[b]\n\t"
  135310. #ifdef WOLFSSL_KEIL
  135311. "muls r7, r6, r7\n\t"
  135312. #elif defined(__clang__)
  135313. "muls r7, r6\n\t"
  135314. #else
  135315. "mul r7, r6\n\t"
  135316. #endif
  135317. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135318. "adds r3, r3, r7\n\t"
  135319. #else
  135320. "add r3, r3, r7\n\t"
  135321. #endif
  135322. #ifdef WOLFSSL_KEIL
  135323. "adcs r4, r4, %[r]\n\t"
  135324. #elif defined(__clang__)
  135325. "adcs r4, %[r]\n\t"
  135326. #else
  135327. "adc r4, %[r]\n\t"
  135328. #endif
  135329. #ifdef WOLFSSL_KEIL
  135330. "adcs r5, r5, %[r]\n\t"
  135331. #elif defined(__clang__)
  135332. "adcs r5, %[r]\n\t"
  135333. #else
  135334. "adc r5, %[r]\n\t"
  135335. #endif
  135336. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135337. "lsrs r7, %[b], #16\n\t"
  135338. #else
  135339. "lsr r7, %[b], #16\n\t"
  135340. #endif
  135341. #ifdef WOLFSSL_KEIL
  135342. "muls r6, r7, r6\n\t"
  135343. #elif defined(__clang__)
  135344. "muls r6, r7\n\t"
  135345. #else
  135346. "mul r6, r7\n\t"
  135347. #endif
  135348. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135349. "lsrs r7, r6, #16\n\t"
  135350. #else
  135351. "lsr r7, r6, #16\n\t"
  135352. #endif
  135353. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135354. "lsls r6, r6, #16\n\t"
  135355. #else
  135356. "lsl r6, r6, #16\n\t"
  135357. #endif
  135358. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135359. "adds r3, r3, r6\n\t"
  135360. #else
  135361. "add r3, r3, r6\n\t"
  135362. #endif
  135363. #ifdef WOLFSSL_KEIL
  135364. "adcs r4, r4, r7\n\t"
  135365. #elif defined(__clang__)
  135366. "adcs r4, r7\n\t"
  135367. #else
  135368. "adc r4, r7\n\t"
  135369. #endif
  135370. #ifdef WOLFSSL_KEIL
  135371. "adcs r5, r5, %[r]\n\t"
  135372. #elif defined(__clang__)
  135373. "adcs r5, %[r]\n\t"
  135374. #else
  135375. "adc r5, %[r]\n\t"
  135376. #endif
  135377. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135378. "lsrs r6, %[a], #16\n\t"
  135379. #else
  135380. "lsr r6, %[a], #16\n\t"
  135381. #endif
  135382. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135383. "lsrs r7, %[b], #16\n\t"
  135384. #else
  135385. "lsr r7, %[b], #16\n\t"
  135386. #endif
  135387. #ifdef WOLFSSL_KEIL
  135388. "muls r7, r6, r7\n\t"
  135389. #elif defined(__clang__)
  135390. "muls r7, r6\n\t"
  135391. #else
  135392. "mul r7, r6\n\t"
  135393. #endif
  135394. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135395. "adds r4, r4, r7\n\t"
  135396. #else
  135397. "add r4, r4, r7\n\t"
  135398. #endif
  135399. #ifdef WOLFSSL_KEIL
  135400. "adcs r5, r5, %[r]\n\t"
  135401. #elif defined(__clang__)
  135402. "adcs r5, %[r]\n\t"
  135403. #else
  135404. "adc r5, %[r]\n\t"
  135405. #endif
  135406. "uxth r7, %[b]\n\t"
  135407. #ifdef WOLFSSL_KEIL
  135408. "muls r6, r7, r6\n\t"
  135409. #elif defined(__clang__)
  135410. "muls r6, r7\n\t"
  135411. #else
  135412. "mul r6, r7\n\t"
  135413. #endif
  135414. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135415. "lsrs r7, r6, #16\n\t"
  135416. #else
  135417. "lsr r7, r6, #16\n\t"
  135418. #endif
  135419. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135420. "lsls r6, r6, #16\n\t"
  135421. #else
  135422. "lsl r6, r6, #16\n\t"
  135423. #endif
  135424. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135425. "adds r3, r3, r6\n\t"
  135426. #else
  135427. "add r3, r3, r6\n\t"
  135428. #endif
  135429. #ifdef WOLFSSL_KEIL
  135430. "adcs r4, r4, r7\n\t"
  135431. #elif defined(__clang__)
  135432. "adcs r4, r7\n\t"
  135433. #else
  135434. "adc 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. "# A[1] * B[2]\n\t"
  135444. "mov %[a], r9\n\t"
  135445. "mov %[b], r10\n\t"
  135446. "ldr %[a], [%[a], #4]\n\t"
  135447. "ldr %[b], [%[b], #8]\n\t"
  135448. "uxth r6, %[a]\n\t"
  135449. "uxth r7, %[b]\n\t"
  135450. #ifdef WOLFSSL_KEIL
  135451. "muls r7, r6, r7\n\t"
  135452. #elif defined(__clang__)
  135453. "muls r7, r6\n\t"
  135454. #else
  135455. "mul r7, r6\n\t"
  135456. #endif
  135457. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135458. "adds r3, r3, r7\n\t"
  135459. #else
  135460. "add r3, r3, r7\n\t"
  135461. #endif
  135462. #ifdef WOLFSSL_KEIL
  135463. "adcs r4, r4, %[r]\n\t"
  135464. #elif defined(__clang__)
  135465. "adcs r4, %[r]\n\t"
  135466. #else
  135467. "adc r4, %[r]\n\t"
  135468. #endif
  135469. #ifdef WOLFSSL_KEIL
  135470. "adcs r5, r5, %[r]\n\t"
  135471. #elif defined(__clang__)
  135472. "adcs r5, %[r]\n\t"
  135473. #else
  135474. "adc r5, %[r]\n\t"
  135475. #endif
  135476. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135477. "lsrs r7, %[b], #16\n\t"
  135478. #else
  135479. "lsr r7, %[b], #16\n\t"
  135480. #endif
  135481. #ifdef WOLFSSL_KEIL
  135482. "muls r6, r7, r6\n\t"
  135483. #elif defined(__clang__)
  135484. "muls r6, r7\n\t"
  135485. #else
  135486. "mul r6, r7\n\t"
  135487. #endif
  135488. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135489. "lsrs r7, r6, #16\n\t"
  135490. #else
  135491. "lsr r7, r6, #16\n\t"
  135492. #endif
  135493. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135494. "lsls r6, r6, #16\n\t"
  135495. #else
  135496. "lsl r6, r6, #16\n\t"
  135497. #endif
  135498. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135499. "adds r3, r3, r6\n\t"
  135500. #else
  135501. "add r3, r3, r6\n\t"
  135502. #endif
  135503. #ifdef WOLFSSL_KEIL
  135504. "adcs r4, r4, r7\n\t"
  135505. #elif defined(__clang__)
  135506. "adcs r4, r7\n\t"
  135507. #else
  135508. "adc r4, r7\n\t"
  135509. #endif
  135510. #ifdef WOLFSSL_KEIL
  135511. "adcs r5, r5, %[r]\n\t"
  135512. #elif defined(__clang__)
  135513. "adcs r5, %[r]\n\t"
  135514. #else
  135515. "adc r5, %[r]\n\t"
  135516. #endif
  135517. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135518. "lsrs r6, %[a], #16\n\t"
  135519. #else
  135520. "lsr r6, %[a], #16\n\t"
  135521. #endif
  135522. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135523. "lsrs r7, %[b], #16\n\t"
  135524. #else
  135525. "lsr r7, %[b], #16\n\t"
  135526. #endif
  135527. #ifdef WOLFSSL_KEIL
  135528. "muls r7, r6, r7\n\t"
  135529. #elif defined(__clang__)
  135530. "muls r7, r6\n\t"
  135531. #else
  135532. "mul r7, r6\n\t"
  135533. #endif
  135534. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135535. "adds r4, r4, r7\n\t"
  135536. #else
  135537. "add r4, r4, r7\n\t"
  135538. #endif
  135539. #ifdef WOLFSSL_KEIL
  135540. "adcs r5, r5, %[r]\n\t"
  135541. #elif defined(__clang__)
  135542. "adcs r5, %[r]\n\t"
  135543. #else
  135544. "adc r5, %[r]\n\t"
  135545. #endif
  135546. "uxth r7, %[b]\n\t"
  135547. #ifdef WOLFSSL_KEIL
  135548. "muls r6, r7, r6\n\t"
  135549. #elif defined(__clang__)
  135550. "muls r6, r7\n\t"
  135551. #else
  135552. "mul r6, r7\n\t"
  135553. #endif
  135554. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135555. "lsrs r7, r6, #16\n\t"
  135556. #else
  135557. "lsr r7, r6, #16\n\t"
  135558. #endif
  135559. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135560. "lsls r6, r6, #16\n\t"
  135561. #else
  135562. "lsl r6, r6, #16\n\t"
  135563. #endif
  135564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135565. "adds r3, r3, r6\n\t"
  135566. #else
  135567. "add r3, r3, r6\n\t"
  135568. #endif
  135569. #ifdef WOLFSSL_KEIL
  135570. "adcs r4, r4, r7\n\t"
  135571. #elif defined(__clang__)
  135572. "adcs r4, r7\n\t"
  135573. #else
  135574. "adc 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. "# A[2] * B[1]\n\t"
  135584. "mov %[a], r9\n\t"
  135585. "mov %[b], r10\n\t"
  135586. "ldr %[a], [%[a], #8]\n\t"
  135587. "ldr %[b], [%[b], #4]\n\t"
  135588. "uxth r6, %[a]\n\t"
  135589. "uxth r7, %[b]\n\t"
  135590. #ifdef WOLFSSL_KEIL
  135591. "muls r7, r6, r7\n\t"
  135592. #elif defined(__clang__)
  135593. "muls r7, r6\n\t"
  135594. #else
  135595. "mul r7, r6\n\t"
  135596. #endif
  135597. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135598. "adds r3, r3, r7\n\t"
  135599. #else
  135600. "add r3, r3, r7\n\t"
  135601. #endif
  135602. #ifdef WOLFSSL_KEIL
  135603. "adcs r4, r4, %[r]\n\t"
  135604. #elif defined(__clang__)
  135605. "adcs r4, %[r]\n\t"
  135606. #else
  135607. "adc r4, %[r]\n\t"
  135608. #endif
  135609. #ifdef WOLFSSL_KEIL
  135610. "adcs r5, r5, %[r]\n\t"
  135611. #elif defined(__clang__)
  135612. "adcs r5, %[r]\n\t"
  135613. #else
  135614. "adc r5, %[r]\n\t"
  135615. #endif
  135616. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135617. "lsrs r7, %[b], #16\n\t"
  135618. #else
  135619. "lsr r7, %[b], #16\n\t"
  135620. #endif
  135621. #ifdef WOLFSSL_KEIL
  135622. "muls r6, r7, r6\n\t"
  135623. #elif defined(__clang__)
  135624. "muls r6, r7\n\t"
  135625. #else
  135626. "mul r6, r7\n\t"
  135627. #endif
  135628. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135629. "lsrs r7, r6, #16\n\t"
  135630. #else
  135631. "lsr r7, r6, #16\n\t"
  135632. #endif
  135633. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135634. "lsls r6, r6, #16\n\t"
  135635. #else
  135636. "lsl r6, r6, #16\n\t"
  135637. #endif
  135638. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135639. "adds r3, r3, r6\n\t"
  135640. #else
  135641. "add r3, r3, r6\n\t"
  135642. #endif
  135643. #ifdef WOLFSSL_KEIL
  135644. "adcs r4, r4, r7\n\t"
  135645. #elif defined(__clang__)
  135646. "adcs r4, r7\n\t"
  135647. #else
  135648. "adc r4, r7\n\t"
  135649. #endif
  135650. #ifdef WOLFSSL_KEIL
  135651. "adcs r5, r5, %[r]\n\t"
  135652. #elif defined(__clang__)
  135653. "adcs r5, %[r]\n\t"
  135654. #else
  135655. "adc r5, %[r]\n\t"
  135656. #endif
  135657. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135658. "lsrs r6, %[a], #16\n\t"
  135659. #else
  135660. "lsr r6, %[a], #16\n\t"
  135661. #endif
  135662. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135663. "lsrs r7, %[b], #16\n\t"
  135664. #else
  135665. "lsr r7, %[b], #16\n\t"
  135666. #endif
  135667. #ifdef WOLFSSL_KEIL
  135668. "muls r7, r6, r7\n\t"
  135669. #elif defined(__clang__)
  135670. "muls r7, r6\n\t"
  135671. #else
  135672. "mul r7, r6\n\t"
  135673. #endif
  135674. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135675. "adds r4, r4, r7\n\t"
  135676. #else
  135677. "add r4, r4, r7\n\t"
  135678. #endif
  135679. #ifdef WOLFSSL_KEIL
  135680. "adcs r5, r5, %[r]\n\t"
  135681. #elif defined(__clang__)
  135682. "adcs r5, %[r]\n\t"
  135683. #else
  135684. "adc r5, %[r]\n\t"
  135685. #endif
  135686. "uxth r7, %[b]\n\t"
  135687. #ifdef WOLFSSL_KEIL
  135688. "muls r6, r7, r6\n\t"
  135689. #elif defined(__clang__)
  135690. "muls r6, r7\n\t"
  135691. #else
  135692. "mul r6, r7\n\t"
  135693. #endif
  135694. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135695. "lsrs r7, r6, #16\n\t"
  135696. #else
  135697. "lsr r7, r6, #16\n\t"
  135698. #endif
  135699. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135700. "lsls r6, r6, #16\n\t"
  135701. #else
  135702. "lsl r6, r6, #16\n\t"
  135703. #endif
  135704. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135705. "adds r3, r3, r6\n\t"
  135706. #else
  135707. "add r3, r3, r6\n\t"
  135708. #endif
  135709. #ifdef WOLFSSL_KEIL
  135710. "adcs r4, r4, r7\n\t"
  135711. #elif defined(__clang__)
  135712. "adcs r4, r7\n\t"
  135713. #else
  135714. "adc r4, r7\n\t"
  135715. #endif
  135716. #ifdef WOLFSSL_KEIL
  135717. "adcs r5, r5, %[r]\n\t"
  135718. #elif defined(__clang__)
  135719. "adcs r5, %[r]\n\t"
  135720. #else
  135721. "adc r5, %[r]\n\t"
  135722. #endif
  135723. "# A[3] * B[0]\n\t"
  135724. "mov %[a], r9\n\t"
  135725. "mov %[b], r10\n\t"
  135726. "ldr %[a], [%[a], #12]\n\t"
  135727. "ldr %[b], [%[b]]\n\t"
  135728. "uxth r6, %[a]\n\t"
  135729. "uxth r7, %[b]\n\t"
  135730. #ifdef WOLFSSL_KEIL
  135731. "muls r7, r6, r7\n\t"
  135732. #elif defined(__clang__)
  135733. "muls r7, r6\n\t"
  135734. #else
  135735. "mul r7, r6\n\t"
  135736. #endif
  135737. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135738. "adds r3, r3, r7\n\t"
  135739. #else
  135740. "add r3, r3, r7\n\t"
  135741. #endif
  135742. #ifdef WOLFSSL_KEIL
  135743. "adcs r4, r4, %[r]\n\t"
  135744. #elif defined(__clang__)
  135745. "adcs r4, %[r]\n\t"
  135746. #else
  135747. "adc r4, %[r]\n\t"
  135748. #endif
  135749. #ifdef WOLFSSL_KEIL
  135750. "adcs r5, r5, %[r]\n\t"
  135751. #elif defined(__clang__)
  135752. "adcs r5, %[r]\n\t"
  135753. #else
  135754. "adc r5, %[r]\n\t"
  135755. #endif
  135756. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135757. "lsrs r7, %[b], #16\n\t"
  135758. #else
  135759. "lsr r7, %[b], #16\n\t"
  135760. #endif
  135761. #ifdef WOLFSSL_KEIL
  135762. "muls r6, r7, r6\n\t"
  135763. #elif defined(__clang__)
  135764. "muls r6, r7\n\t"
  135765. #else
  135766. "mul r6, r7\n\t"
  135767. #endif
  135768. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135769. "lsrs r7, r6, #16\n\t"
  135770. #else
  135771. "lsr r7, r6, #16\n\t"
  135772. #endif
  135773. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135774. "lsls r6, r6, #16\n\t"
  135775. #else
  135776. "lsl r6, r6, #16\n\t"
  135777. #endif
  135778. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135779. "adds r3, r3, r6\n\t"
  135780. #else
  135781. "add r3, r3, r6\n\t"
  135782. #endif
  135783. #ifdef WOLFSSL_KEIL
  135784. "adcs r4, r4, r7\n\t"
  135785. #elif defined(__clang__)
  135786. "adcs r4, r7\n\t"
  135787. #else
  135788. "adc r4, r7\n\t"
  135789. #endif
  135790. #ifdef WOLFSSL_KEIL
  135791. "adcs r5, r5, %[r]\n\t"
  135792. #elif defined(__clang__)
  135793. "adcs r5, %[r]\n\t"
  135794. #else
  135795. "adc r5, %[r]\n\t"
  135796. #endif
  135797. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135798. "lsrs r6, %[a], #16\n\t"
  135799. #else
  135800. "lsr r6, %[a], #16\n\t"
  135801. #endif
  135802. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135803. "lsrs r7, %[b], #16\n\t"
  135804. #else
  135805. "lsr r7, %[b], #16\n\t"
  135806. #endif
  135807. #ifdef WOLFSSL_KEIL
  135808. "muls r7, r6, r7\n\t"
  135809. #elif defined(__clang__)
  135810. "muls r7, r6\n\t"
  135811. #else
  135812. "mul r7, r6\n\t"
  135813. #endif
  135814. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135815. "adds r4, r4, r7\n\t"
  135816. #else
  135817. "add r4, r4, r7\n\t"
  135818. #endif
  135819. #ifdef WOLFSSL_KEIL
  135820. "adcs r5, r5, %[r]\n\t"
  135821. #elif defined(__clang__)
  135822. "adcs r5, %[r]\n\t"
  135823. #else
  135824. "adc r5, %[r]\n\t"
  135825. #endif
  135826. "uxth r7, %[b]\n\t"
  135827. #ifdef WOLFSSL_KEIL
  135828. "muls r6, r7, r6\n\t"
  135829. #elif defined(__clang__)
  135830. "muls r6, r7\n\t"
  135831. #else
  135832. "mul r6, r7\n\t"
  135833. #endif
  135834. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135835. "lsrs r7, r6, #16\n\t"
  135836. #else
  135837. "lsr r7, r6, #16\n\t"
  135838. #endif
  135839. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135840. "lsls r6, r6, #16\n\t"
  135841. #else
  135842. "lsl r6, r6, #16\n\t"
  135843. #endif
  135844. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135845. "adds r3, r3, r6\n\t"
  135846. #else
  135847. "add r3, r3, r6\n\t"
  135848. #endif
  135849. #ifdef WOLFSSL_KEIL
  135850. "adcs r4, r4, r7\n\t"
  135851. #elif defined(__clang__)
  135852. "adcs r4, r7\n\t"
  135853. #else
  135854. "adc r4, r7\n\t"
  135855. #endif
  135856. #ifdef WOLFSSL_KEIL
  135857. "adcs r5, r5, %[r]\n\t"
  135858. #elif defined(__clang__)
  135859. "adcs r5, %[r]\n\t"
  135860. #else
  135861. "adc r5, %[r]\n\t"
  135862. #endif
  135863. "str r3, [sp, #12]\n\t"
  135864. "# A[4] * B[0]\n\t"
  135865. "movs r3, #0\n\t"
  135866. "mov %[a], r9\n\t"
  135867. "mov %[b], r10\n\t"
  135868. "ldr %[a], [%[a], #16]\n\t"
  135869. "ldr %[b], [%[b]]\n\t"
  135870. "uxth r6, %[a]\n\t"
  135871. "uxth r7, %[b]\n\t"
  135872. #ifdef WOLFSSL_KEIL
  135873. "muls r7, r6, r7\n\t"
  135874. #elif defined(__clang__)
  135875. "muls r7, r6\n\t"
  135876. #else
  135877. "mul r7, r6\n\t"
  135878. #endif
  135879. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135880. "adds r4, r4, r7\n\t"
  135881. #else
  135882. "add r4, r4, r7\n\t"
  135883. #endif
  135884. #ifdef WOLFSSL_KEIL
  135885. "adcs r5, r5, %[r]\n\t"
  135886. #elif defined(__clang__)
  135887. "adcs r5, %[r]\n\t"
  135888. #else
  135889. "adc r5, %[r]\n\t"
  135890. #endif
  135891. #ifdef WOLFSSL_KEIL
  135892. "adcs r3, r3, %[r]\n\t"
  135893. #elif defined(__clang__)
  135894. "adcs r3, %[r]\n\t"
  135895. #else
  135896. "adc r3, %[r]\n\t"
  135897. #endif
  135898. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135899. "lsrs r7, %[b], #16\n\t"
  135900. #else
  135901. "lsr r7, %[b], #16\n\t"
  135902. #endif
  135903. #ifdef WOLFSSL_KEIL
  135904. "muls r6, r7, r6\n\t"
  135905. #elif defined(__clang__)
  135906. "muls r6, r7\n\t"
  135907. #else
  135908. "mul r6, r7\n\t"
  135909. #endif
  135910. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135911. "lsrs r7, r6, #16\n\t"
  135912. #else
  135913. "lsr r7, r6, #16\n\t"
  135914. #endif
  135915. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135916. "lsls r6, r6, #16\n\t"
  135917. #else
  135918. "lsl r6, r6, #16\n\t"
  135919. #endif
  135920. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135921. "adds r4, r4, r6\n\t"
  135922. #else
  135923. "add r4, r4, r6\n\t"
  135924. #endif
  135925. #ifdef WOLFSSL_KEIL
  135926. "adcs r5, r5, r7\n\t"
  135927. #elif defined(__clang__)
  135928. "adcs r5, r7\n\t"
  135929. #else
  135930. "adc r5, r7\n\t"
  135931. #endif
  135932. #ifdef WOLFSSL_KEIL
  135933. "adcs r3, r3, %[r]\n\t"
  135934. #elif defined(__clang__)
  135935. "adcs r3, %[r]\n\t"
  135936. #else
  135937. "adc r3, %[r]\n\t"
  135938. #endif
  135939. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135940. "lsrs r6, %[a], #16\n\t"
  135941. #else
  135942. "lsr r6, %[a], #16\n\t"
  135943. #endif
  135944. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135945. "lsrs r7, %[b], #16\n\t"
  135946. #else
  135947. "lsr r7, %[b], #16\n\t"
  135948. #endif
  135949. #ifdef WOLFSSL_KEIL
  135950. "muls r7, r6, r7\n\t"
  135951. #elif defined(__clang__)
  135952. "muls r7, r6\n\t"
  135953. #else
  135954. "mul r7, r6\n\t"
  135955. #endif
  135956. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135957. "adds r5, r5, r7\n\t"
  135958. #else
  135959. "add r5, r5, r7\n\t"
  135960. #endif
  135961. #ifdef WOLFSSL_KEIL
  135962. "adcs r3, r3, %[r]\n\t"
  135963. #elif defined(__clang__)
  135964. "adcs r3, %[r]\n\t"
  135965. #else
  135966. "adc r3, %[r]\n\t"
  135967. #endif
  135968. "uxth r7, %[b]\n\t"
  135969. #ifdef WOLFSSL_KEIL
  135970. "muls r6, r7, r6\n\t"
  135971. #elif defined(__clang__)
  135972. "muls r6, r7\n\t"
  135973. #else
  135974. "mul r6, r7\n\t"
  135975. #endif
  135976. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135977. "lsrs r7, r6, #16\n\t"
  135978. #else
  135979. "lsr r7, r6, #16\n\t"
  135980. #endif
  135981. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135982. "lsls r6, r6, #16\n\t"
  135983. #else
  135984. "lsl r6, r6, #16\n\t"
  135985. #endif
  135986. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135987. "adds r4, r4, r6\n\t"
  135988. #else
  135989. "add r4, r4, r6\n\t"
  135990. #endif
  135991. #ifdef WOLFSSL_KEIL
  135992. "adcs r5, r5, r7\n\t"
  135993. #elif defined(__clang__)
  135994. "adcs r5, r7\n\t"
  135995. #else
  135996. "adc 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. "# A[3] * B[1]\n\t"
  136006. "mov %[a], r9\n\t"
  136007. "mov %[b], r10\n\t"
  136008. "ldr %[a], [%[a], #12]\n\t"
  136009. "ldr %[b], [%[b], #4]\n\t"
  136010. "uxth r6, %[a]\n\t"
  136011. "uxth r7, %[b]\n\t"
  136012. #ifdef WOLFSSL_KEIL
  136013. "muls r7, r6, r7\n\t"
  136014. #elif defined(__clang__)
  136015. "muls r7, r6\n\t"
  136016. #else
  136017. "mul r7, r6\n\t"
  136018. #endif
  136019. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136020. "adds r4, r4, r7\n\t"
  136021. #else
  136022. "add r4, r4, r7\n\t"
  136023. #endif
  136024. #ifdef WOLFSSL_KEIL
  136025. "adcs r5, r5, %[r]\n\t"
  136026. #elif defined(__clang__)
  136027. "adcs r5, %[r]\n\t"
  136028. #else
  136029. "adc r5, %[r]\n\t"
  136030. #endif
  136031. #ifdef WOLFSSL_KEIL
  136032. "adcs r3, r3, %[r]\n\t"
  136033. #elif defined(__clang__)
  136034. "adcs r3, %[r]\n\t"
  136035. #else
  136036. "adc r3, %[r]\n\t"
  136037. #endif
  136038. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136039. "lsrs r7, %[b], #16\n\t"
  136040. #else
  136041. "lsr r7, %[b], #16\n\t"
  136042. #endif
  136043. #ifdef WOLFSSL_KEIL
  136044. "muls r6, r7, r6\n\t"
  136045. #elif defined(__clang__)
  136046. "muls r6, r7\n\t"
  136047. #else
  136048. "mul r6, r7\n\t"
  136049. #endif
  136050. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136051. "lsrs r7, r6, #16\n\t"
  136052. #else
  136053. "lsr r7, r6, #16\n\t"
  136054. #endif
  136055. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136056. "lsls r6, r6, #16\n\t"
  136057. #else
  136058. "lsl r6, r6, #16\n\t"
  136059. #endif
  136060. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136061. "adds r4, r4, r6\n\t"
  136062. #else
  136063. "add r4, r4, r6\n\t"
  136064. #endif
  136065. #ifdef WOLFSSL_KEIL
  136066. "adcs r5, r5, r7\n\t"
  136067. #elif defined(__clang__)
  136068. "adcs r5, r7\n\t"
  136069. #else
  136070. "adc r5, r7\n\t"
  136071. #endif
  136072. #ifdef WOLFSSL_KEIL
  136073. "adcs r3, r3, %[r]\n\t"
  136074. #elif defined(__clang__)
  136075. "adcs r3, %[r]\n\t"
  136076. #else
  136077. "adc r3, %[r]\n\t"
  136078. #endif
  136079. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136080. "lsrs r6, %[a], #16\n\t"
  136081. #else
  136082. "lsr r6, %[a], #16\n\t"
  136083. #endif
  136084. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136085. "lsrs r7, %[b], #16\n\t"
  136086. #else
  136087. "lsr r7, %[b], #16\n\t"
  136088. #endif
  136089. #ifdef WOLFSSL_KEIL
  136090. "muls r7, r6, r7\n\t"
  136091. #elif defined(__clang__)
  136092. "muls r7, r6\n\t"
  136093. #else
  136094. "mul r7, r6\n\t"
  136095. #endif
  136096. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136097. "adds r5, r5, r7\n\t"
  136098. #else
  136099. "add r5, r5, r7\n\t"
  136100. #endif
  136101. #ifdef WOLFSSL_KEIL
  136102. "adcs r3, r3, %[r]\n\t"
  136103. #elif defined(__clang__)
  136104. "adcs r3, %[r]\n\t"
  136105. #else
  136106. "adc r3, %[r]\n\t"
  136107. #endif
  136108. "uxth r7, %[b]\n\t"
  136109. #ifdef WOLFSSL_KEIL
  136110. "muls r6, r7, r6\n\t"
  136111. #elif defined(__clang__)
  136112. "muls r6, r7\n\t"
  136113. #else
  136114. "mul r6, r7\n\t"
  136115. #endif
  136116. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136117. "lsrs r7, r6, #16\n\t"
  136118. #else
  136119. "lsr r7, r6, #16\n\t"
  136120. #endif
  136121. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136122. "lsls r6, r6, #16\n\t"
  136123. #else
  136124. "lsl r6, r6, #16\n\t"
  136125. #endif
  136126. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136127. "adds r4, r4, r6\n\t"
  136128. #else
  136129. "add r4, r4, r6\n\t"
  136130. #endif
  136131. #ifdef WOLFSSL_KEIL
  136132. "adcs r5, r5, r7\n\t"
  136133. #elif defined(__clang__)
  136134. "adcs r5, r7\n\t"
  136135. #else
  136136. "adc 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. "# A[2] * B[2]\n\t"
  136146. "mov %[a], r9\n\t"
  136147. "mov %[b], r10\n\t"
  136148. "ldr %[a], [%[a], #8]\n\t"
  136149. "ldr %[b], [%[b], #8]\n\t"
  136150. "uxth r6, %[a]\n\t"
  136151. "uxth r7, %[b]\n\t"
  136152. #ifdef WOLFSSL_KEIL
  136153. "muls r7, r6, r7\n\t"
  136154. #elif defined(__clang__)
  136155. "muls r7, r6\n\t"
  136156. #else
  136157. "mul r7, r6\n\t"
  136158. #endif
  136159. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136160. "adds r4, r4, r7\n\t"
  136161. #else
  136162. "add r4, r4, r7\n\t"
  136163. #endif
  136164. #ifdef WOLFSSL_KEIL
  136165. "adcs r5, r5, %[r]\n\t"
  136166. #elif defined(__clang__)
  136167. "adcs r5, %[r]\n\t"
  136168. #else
  136169. "adc r5, %[r]\n\t"
  136170. #endif
  136171. #ifdef WOLFSSL_KEIL
  136172. "adcs r3, r3, %[r]\n\t"
  136173. #elif defined(__clang__)
  136174. "adcs r3, %[r]\n\t"
  136175. #else
  136176. "adc r3, %[r]\n\t"
  136177. #endif
  136178. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136179. "lsrs r7, %[b], #16\n\t"
  136180. #else
  136181. "lsr r7, %[b], #16\n\t"
  136182. #endif
  136183. #ifdef WOLFSSL_KEIL
  136184. "muls r6, r7, r6\n\t"
  136185. #elif defined(__clang__)
  136186. "muls r6, r7\n\t"
  136187. #else
  136188. "mul r6, r7\n\t"
  136189. #endif
  136190. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136191. "lsrs r7, r6, #16\n\t"
  136192. #else
  136193. "lsr r7, r6, #16\n\t"
  136194. #endif
  136195. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136196. "lsls r6, r6, #16\n\t"
  136197. #else
  136198. "lsl r6, r6, #16\n\t"
  136199. #endif
  136200. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136201. "adds r4, r4, r6\n\t"
  136202. #else
  136203. "add r4, r4, r6\n\t"
  136204. #endif
  136205. #ifdef WOLFSSL_KEIL
  136206. "adcs r5, r5, r7\n\t"
  136207. #elif defined(__clang__)
  136208. "adcs r5, r7\n\t"
  136209. #else
  136210. "adc r5, r7\n\t"
  136211. #endif
  136212. #ifdef WOLFSSL_KEIL
  136213. "adcs r3, r3, %[r]\n\t"
  136214. #elif defined(__clang__)
  136215. "adcs r3, %[r]\n\t"
  136216. #else
  136217. "adc r3, %[r]\n\t"
  136218. #endif
  136219. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136220. "lsrs r6, %[a], #16\n\t"
  136221. #else
  136222. "lsr r6, %[a], #16\n\t"
  136223. #endif
  136224. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136225. "lsrs r7, %[b], #16\n\t"
  136226. #else
  136227. "lsr r7, %[b], #16\n\t"
  136228. #endif
  136229. #ifdef WOLFSSL_KEIL
  136230. "muls r7, r6, r7\n\t"
  136231. #elif defined(__clang__)
  136232. "muls r7, r6\n\t"
  136233. #else
  136234. "mul r7, r6\n\t"
  136235. #endif
  136236. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136237. "adds r5, r5, r7\n\t"
  136238. #else
  136239. "add r5, r5, r7\n\t"
  136240. #endif
  136241. #ifdef WOLFSSL_KEIL
  136242. "adcs r3, r3, %[r]\n\t"
  136243. #elif defined(__clang__)
  136244. "adcs r3, %[r]\n\t"
  136245. #else
  136246. "adc r3, %[r]\n\t"
  136247. #endif
  136248. "uxth r7, %[b]\n\t"
  136249. #ifdef WOLFSSL_KEIL
  136250. "muls r6, r7, r6\n\t"
  136251. #elif defined(__clang__)
  136252. "muls r6, r7\n\t"
  136253. #else
  136254. "mul r6, r7\n\t"
  136255. #endif
  136256. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136257. "lsrs r7, r6, #16\n\t"
  136258. #else
  136259. "lsr r7, r6, #16\n\t"
  136260. #endif
  136261. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136262. "lsls r6, r6, #16\n\t"
  136263. #else
  136264. "lsl r6, r6, #16\n\t"
  136265. #endif
  136266. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136267. "adds r4, r4, r6\n\t"
  136268. #else
  136269. "add r4, r4, r6\n\t"
  136270. #endif
  136271. #ifdef WOLFSSL_KEIL
  136272. "adcs r5, r5, r7\n\t"
  136273. #elif defined(__clang__)
  136274. "adcs r5, r7\n\t"
  136275. #else
  136276. "adc 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. "# A[1] * B[3]\n\t"
  136286. "mov %[a], r9\n\t"
  136287. "mov %[b], r10\n\t"
  136288. "ldr %[a], [%[a], #4]\n\t"
  136289. "ldr %[b], [%[b], #12]\n\t"
  136290. "uxth r6, %[a]\n\t"
  136291. "uxth r7, %[b]\n\t"
  136292. #ifdef WOLFSSL_KEIL
  136293. "muls r7, r6, r7\n\t"
  136294. #elif defined(__clang__)
  136295. "muls r7, r6\n\t"
  136296. #else
  136297. "mul r7, r6\n\t"
  136298. #endif
  136299. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136300. "adds r4, r4, r7\n\t"
  136301. #else
  136302. "add r4, r4, r7\n\t"
  136303. #endif
  136304. #ifdef WOLFSSL_KEIL
  136305. "adcs r5, r5, %[r]\n\t"
  136306. #elif defined(__clang__)
  136307. "adcs r5, %[r]\n\t"
  136308. #else
  136309. "adc r5, %[r]\n\t"
  136310. #endif
  136311. #ifdef WOLFSSL_KEIL
  136312. "adcs r3, r3, %[r]\n\t"
  136313. #elif defined(__clang__)
  136314. "adcs r3, %[r]\n\t"
  136315. #else
  136316. "adc r3, %[r]\n\t"
  136317. #endif
  136318. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136319. "lsrs r7, %[b], #16\n\t"
  136320. #else
  136321. "lsr r7, %[b], #16\n\t"
  136322. #endif
  136323. #ifdef WOLFSSL_KEIL
  136324. "muls r6, r7, r6\n\t"
  136325. #elif defined(__clang__)
  136326. "muls r6, r7\n\t"
  136327. #else
  136328. "mul r6, r7\n\t"
  136329. #endif
  136330. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136331. "lsrs r7, r6, #16\n\t"
  136332. #else
  136333. "lsr r7, r6, #16\n\t"
  136334. #endif
  136335. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136336. "lsls r6, r6, #16\n\t"
  136337. #else
  136338. "lsl r6, r6, #16\n\t"
  136339. #endif
  136340. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136341. "adds r4, r4, r6\n\t"
  136342. #else
  136343. "add r4, r4, r6\n\t"
  136344. #endif
  136345. #ifdef WOLFSSL_KEIL
  136346. "adcs r5, r5, r7\n\t"
  136347. #elif defined(__clang__)
  136348. "adcs r5, r7\n\t"
  136349. #else
  136350. "adc r5, r7\n\t"
  136351. #endif
  136352. #ifdef WOLFSSL_KEIL
  136353. "adcs r3, r3, %[r]\n\t"
  136354. #elif defined(__clang__)
  136355. "adcs r3, %[r]\n\t"
  136356. #else
  136357. "adc r3, %[r]\n\t"
  136358. #endif
  136359. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136360. "lsrs r6, %[a], #16\n\t"
  136361. #else
  136362. "lsr r6, %[a], #16\n\t"
  136363. #endif
  136364. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136365. "lsrs r7, %[b], #16\n\t"
  136366. #else
  136367. "lsr r7, %[b], #16\n\t"
  136368. #endif
  136369. #ifdef WOLFSSL_KEIL
  136370. "muls r7, r6, r7\n\t"
  136371. #elif defined(__clang__)
  136372. "muls r7, r6\n\t"
  136373. #else
  136374. "mul r7, r6\n\t"
  136375. #endif
  136376. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136377. "adds r5, r5, r7\n\t"
  136378. #else
  136379. "add r5, r5, r7\n\t"
  136380. #endif
  136381. #ifdef WOLFSSL_KEIL
  136382. "adcs r3, r3, %[r]\n\t"
  136383. #elif defined(__clang__)
  136384. "adcs r3, %[r]\n\t"
  136385. #else
  136386. "adc r3, %[r]\n\t"
  136387. #endif
  136388. "uxth r7, %[b]\n\t"
  136389. #ifdef WOLFSSL_KEIL
  136390. "muls r6, r7, r6\n\t"
  136391. #elif defined(__clang__)
  136392. "muls r6, r7\n\t"
  136393. #else
  136394. "mul r6, r7\n\t"
  136395. #endif
  136396. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136397. "lsrs r7, r6, #16\n\t"
  136398. #else
  136399. "lsr r7, r6, #16\n\t"
  136400. #endif
  136401. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136402. "lsls r6, r6, #16\n\t"
  136403. #else
  136404. "lsl r6, r6, #16\n\t"
  136405. #endif
  136406. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136407. "adds r4, r4, r6\n\t"
  136408. #else
  136409. "add r4, r4, r6\n\t"
  136410. #endif
  136411. #ifdef WOLFSSL_KEIL
  136412. "adcs r5, r5, r7\n\t"
  136413. #elif defined(__clang__)
  136414. "adcs r5, r7\n\t"
  136415. #else
  136416. "adc 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. "# A[0] * B[4]\n\t"
  136426. "mov %[a], r9\n\t"
  136427. "mov %[b], r10\n\t"
  136428. "ldr %[a], [%[a]]\n\t"
  136429. "ldr %[b], [%[b], #16]\n\t"
  136430. "uxth r6, %[a]\n\t"
  136431. "uxth r7, %[b]\n\t"
  136432. #ifdef WOLFSSL_KEIL
  136433. "muls r7, r6, r7\n\t"
  136434. #elif defined(__clang__)
  136435. "muls r7, r6\n\t"
  136436. #else
  136437. "mul r7, r6\n\t"
  136438. #endif
  136439. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136440. "adds r4, r4, r7\n\t"
  136441. #else
  136442. "add r4, r4, r7\n\t"
  136443. #endif
  136444. #ifdef WOLFSSL_KEIL
  136445. "adcs r5, r5, %[r]\n\t"
  136446. #elif defined(__clang__)
  136447. "adcs r5, %[r]\n\t"
  136448. #else
  136449. "adc r5, %[r]\n\t"
  136450. #endif
  136451. #ifdef WOLFSSL_KEIL
  136452. "adcs r3, r3, %[r]\n\t"
  136453. #elif defined(__clang__)
  136454. "adcs r3, %[r]\n\t"
  136455. #else
  136456. "adc r3, %[r]\n\t"
  136457. #endif
  136458. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136459. "lsrs r7, %[b], #16\n\t"
  136460. #else
  136461. "lsr r7, %[b], #16\n\t"
  136462. #endif
  136463. #ifdef WOLFSSL_KEIL
  136464. "muls r6, r7, r6\n\t"
  136465. #elif defined(__clang__)
  136466. "muls r6, r7\n\t"
  136467. #else
  136468. "mul r6, r7\n\t"
  136469. #endif
  136470. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136471. "lsrs r7, r6, #16\n\t"
  136472. #else
  136473. "lsr r7, r6, #16\n\t"
  136474. #endif
  136475. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136476. "lsls r6, r6, #16\n\t"
  136477. #else
  136478. "lsl r6, r6, #16\n\t"
  136479. #endif
  136480. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136481. "adds r4, r4, r6\n\t"
  136482. #else
  136483. "add r4, r4, r6\n\t"
  136484. #endif
  136485. #ifdef WOLFSSL_KEIL
  136486. "adcs r5, r5, r7\n\t"
  136487. #elif defined(__clang__)
  136488. "adcs r5, r7\n\t"
  136489. #else
  136490. "adc r5, r7\n\t"
  136491. #endif
  136492. #ifdef WOLFSSL_KEIL
  136493. "adcs r3, r3, %[r]\n\t"
  136494. #elif defined(__clang__)
  136495. "adcs r3, %[r]\n\t"
  136496. #else
  136497. "adc r3, %[r]\n\t"
  136498. #endif
  136499. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136500. "lsrs r6, %[a], #16\n\t"
  136501. #else
  136502. "lsr r6, %[a], #16\n\t"
  136503. #endif
  136504. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136505. "lsrs r7, %[b], #16\n\t"
  136506. #else
  136507. "lsr r7, %[b], #16\n\t"
  136508. #endif
  136509. #ifdef WOLFSSL_KEIL
  136510. "muls r7, r6, r7\n\t"
  136511. #elif defined(__clang__)
  136512. "muls r7, r6\n\t"
  136513. #else
  136514. "mul r7, r6\n\t"
  136515. #endif
  136516. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136517. "adds r5, r5, r7\n\t"
  136518. #else
  136519. "add r5, r5, r7\n\t"
  136520. #endif
  136521. #ifdef WOLFSSL_KEIL
  136522. "adcs r3, r3, %[r]\n\t"
  136523. #elif defined(__clang__)
  136524. "adcs r3, %[r]\n\t"
  136525. #else
  136526. "adc r3, %[r]\n\t"
  136527. #endif
  136528. "uxth r7, %[b]\n\t"
  136529. #ifdef WOLFSSL_KEIL
  136530. "muls r6, r7, r6\n\t"
  136531. #elif defined(__clang__)
  136532. "muls r6, r7\n\t"
  136533. #else
  136534. "mul r6, r7\n\t"
  136535. #endif
  136536. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136537. "lsrs r7, r6, #16\n\t"
  136538. #else
  136539. "lsr r7, r6, #16\n\t"
  136540. #endif
  136541. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136542. "lsls r6, r6, #16\n\t"
  136543. #else
  136544. "lsl r6, r6, #16\n\t"
  136545. #endif
  136546. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136547. "adds r4, r4, r6\n\t"
  136548. #else
  136549. "add r4, r4, r6\n\t"
  136550. #endif
  136551. #ifdef WOLFSSL_KEIL
  136552. "adcs r5, r5, r7\n\t"
  136553. #elif defined(__clang__)
  136554. "adcs r5, r7\n\t"
  136555. #else
  136556. "adc 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. "str r4, [sp, #16]\n\t"
  136566. "# A[0] * B[5]\n\t"
  136567. "movs r4, #0\n\t"
  136568. "mov %[a], r9\n\t"
  136569. "mov %[b], r10\n\t"
  136570. "ldr %[a], [%[a]]\n\t"
  136571. "ldr %[b], [%[b], #20]\n\t"
  136572. "uxth r6, %[a]\n\t"
  136573. "uxth r7, %[b]\n\t"
  136574. #ifdef WOLFSSL_KEIL
  136575. "muls r7, r6, r7\n\t"
  136576. #elif defined(__clang__)
  136577. "muls r7, r6\n\t"
  136578. #else
  136579. "mul r7, r6\n\t"
  136580. #endif
  136581. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136582. "adds r5, r5, r7\n\t"
  136583. #else
  136584. "add r5, r5, r7\n\t"
  136585. #endif
  136586. #ifdef WOLFSSL_KEIL
  136587. "adcs r3, r3, %[r]\n\t"
  136588. #elif defined(__clang__)
  136589. "adcs r3, %[r]\n\t"
  136590. #else
  136591. "adc r3, %[r]\n\t"
  136592. #endif
  136593. #ifdef WOLFSSL_KEIL
  136594. "adcs r4, r4, %[r]\n\t"
  136595. #elif defined(__clang__)
  136596. "adcs r4, %[r]\n\t"
  136597. #else
  136598. "adc r4, %[r]\n\t"
  136599. #endif
  136600. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136601. "lsrs r7, %[b], #16\n\t"
  136602. #else
  136603. "lsr r7, %[b], #16\n\t"
  136604. #endif
  136605. #ifdef WOLFSSL_KEIL
  136606. "muls r6, r7, r6\n\t"
  136607. #elif defined(__clang__)
  136608. "muls r6, r7\n\t"
  136609. #else
  136610. "mul r6, r7\n\t"
  136611. #endif
  136612. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136613. "lsrs r7, r6, #16\n\t"
  136614. #else
  136615. "lsr r7, r6, #16\n\t"
  136616. #endif
  136617. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136618. "lsls r6, r6, #16\n\t"
  136619. #else
  136620. "lsl r6, r6, #16\n\t"
  136621. #endif
  136622. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136623. "adds r5, r5, r6\n\t"
  136624. #else
  136625. "add r5, r5, r6\n\t"
  136626. #endif
  136627. #ifdef WOLFSSL_KEIL
  136628. "adcs r3, r3, r7\n\t"
  136629. #elif defined(__clang__)
  136630. "adcs r3, r7\n\t"
  136631. #else
  136632. "adc r3, r7\n\t"
  136633. #endif
  136634. #ifdef WOLFSSL_KEIL
  136635. "adcs r4, r4, %[r]\n\t"
  136636. #elif defined(__clang__)
  136637. "adcs r4, %[r]\n\t"
  136638. #else
  136639. "adc r4, %[r]\n\t"
  136640. #endif
  136641. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136642. "lsrs r6, %[a], #16\n\t"
  136643. #else
  136644. "lsr r6, %[a], #16\n\t"
  136645. #endif
  136646. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136647. "lsrs r7, %[b], #16\n\t"
  136648. #else
  136649. "lsr r7, %[b], #16\n\t"
  136650. #endif
  136651. #ifdef WOLFSSL_KEIL
  136652. "muls r7, r6, r7\n\t"
  136653. #elif defined(__clang__)
  136654. "muls r7, r6\n\t"
  136655. #else
  136656. "mul r7, r6\n\t"
  136657. #endif
  136658. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136659. "adds r3, r3, r7\n\t"
  136660. #else
  136661. "add r3, r3, r7\n\t"
  136662. #endif
  136663. #ifdef WOLFSSL_KEIL
  136664. "adcs r4, r4, %[r]\n\t"
  136665. #elif defined(__clang__)
  136666. "adcs r4, %[r]\n\t"
  136667. #else
  136668. "adc r4, %[r]\n\t"
  136669. #endif
  136670. "uxth r7, %[b]\n\t"
  136671. #ifdef WOLFSSL_KEIL
  136672. "muls r6, r7, r6\n\t"
  136673. #elif defined(__clang__)
  136674. "muls r6, r7\n\t"
  136675. #else
  136676. "mul r6, r7\n\t"
  136677. #endif
  136678. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136679. "lsrs r7, r6, #16\n\t"
  136680. #else
  136681. "lsr r7, r6, #16\n\t"
  136682. #endif
  136683. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136684. "lsls r6, r6, #16\n\t"
  136685. #else
  136686. "lsl r6, r6, #16\n\t"
  136687. #endif
  136688. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136689. "adds r5, r5, r6\n\t"
  136690. #else
  136691. "add r5, r5, r6\n\t"
  136692. #endif
  136693. #ifdef WOLFSSL_KEIL
  136694. "adcs r3, r3, r7\n\t"
  136695. #elif defined(__clang__)
  136696. "adcs r3, r7\n\t"
  136697. #else
  136698. "adc r3, r7\n\t"
  136699. #endif
  136700. #ifdef WOLFSSL_KEIL
  136701. "adcs r4, r4, %[r]\n\t"
  136702. #elif defined(__clang__)
  136703. "adcs r4, %[r]\n\t"
  136704. #else
  136705. "adc r4, %[r]\n\t"
  136706. #endif
  136707. "# A[1] * B[4]\n\t"
  136708. "mov %[a], r9\n\t"
  136709. "mov %[b], r10\n\t"
  136710. "ldr %[a], [%[a], #4]\n\t"
  136711. "ldr %[b], [%[b], #16]\n\t"
  136712. "uxth r6, %[a]\n\t"
  136713. "uxth r7, %[b]\n\t"
  136714. #ifdef WOLFSSL_KEIL
  136715. "muls r7, r6, r7\n\t"
  136716. #elif defined(__clang__)
  136717. "muls r7, r6\n\t"
  136718. #else
  136719. "mul r7, r6\n\t"
  136720. #endif
  136721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136722. "adds r5, r5, r7\n\t"
  136723. #else
  136724. "add r5, r5, r7\n\t"
  136725. #endif
  136726. #ifdef WOLFSSL_KEIL
  136727. "adcs r3, r3, %[r]\n\t"
  136728. #elif defined(__clang__)
  136729. "adcs r3, %[r]\n\t"
  136730. #else
  136731. "adc r3, %[r]\n\t"
  136732. #endif
  136733. #ifdef WOLFSSL_KEIL
  136734. "adcs r4, r4, %[r]\n\t"
  136735. #elif defined(__clang__)
  136736. "adcs r4, %[r]\n\t"
  136737. #else
  136738. "adc r4, %[r]\n\t"
  136739. #endif
  136740. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136741. "lsrs r7, %[b], #16\n\t"
  136742. #else
  136743. "lsr r7, %[b], #16\n\t"
  136744. #endif
  136745. #ifdef WOLFSSL_KEIL
  136746. "muls r6, r7, r6\n\t"
  136747. #elif defined(__clang__)
  136748. "muls r6, r7\n\t"
  136749. #else
  136750. "mul r6, r7\n\t"
  136751. #endif
  136752. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136753. "lsrs r7, r6, #16\n\t"
  136754. #else
  136755. "lsr r7, r6, #16\n\t"
  136756. #endif
  136757. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136758. "lsls r6, r6, #16\n\t"
  136759. #else
  136760. "lsl r6, r6, #16\n\t"
  136761. #endif
  136762. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136763. "adds r5, r5, r6\n\t"
  136764. #else
  136765. "add r5, r5, r6\n\t"
  136766. #endif
  136767. #ifdef WOLFSSL_KEIL
  136768. "adcs r3, r3, r7\n\t"
  136769. #elif defined(__clang__)
  136770. "adcs r3, r7\n\t"
  136771. #else
  136772. "adc r3, r7\n\t"
  136773. #endif
  136774. #ifdef WOLFSSL_KEIL
  136775. "adcs r4, r4, %[r]\n\t"
  136776. #elif defined(__clang__)
  136777. "adcs r4, %[r]\n\t"
  136778. #else
  136779. "adc r4, %[r]\n\t"
  136780. #endif
  136781. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136782. "lsrs r6, %[a], #16\n\t"
  136783. #else
  136784. "lsr r6, %[a], #16\n\t"
  136785. #endif
  136786. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136787. "lsrs r7, %[b], #16\n\t"
  136788. #else
  136789. "lsr r7, %[b], #16\n\t"
  136790. #endif
  136791. #ifdef WOLFSSL_KEIL
  136792. "muls r7, r6, r7\n\t"
  136793. #elif defined(__clang__)
  136794. "muls r7, r6\n\t"
  136795. #else
  136796. "mul r7, r6\n\t"
  136797. #endif
  136798. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136799. "adds r3, r3, r7\n\t"
  136800. #else
  136801. "add r3, r3, r7\n\t"
  136802. #endif
  136803. #ifdef WOLFSSL_KEIL
  136804. "adcs r4, r4, %[r]\n\t"
  136805. #elif defined(__clang__)
  136806. "adcs r4, %[r]\n\t"
  136807. #else
  136808. "adc r4, %[r]\n\t"
  136809. #endif
  136810. "uxth r7, %[b]\n\t"
  136811. #ifdef WOLFSSL_KEIL
  136812. "muls r6, r7, r6\n\t"
  136813. #elif defined(__clang__)
  136814. "muls r6, r7\n\t"
  136815. #else
  136816. "mul r6, r7\n\t"
  136817. #endif
  136818. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136819. "lsrs r7, r6, #16\n\t"
  136820. #else
  136821. "lsr r7, r6, #16\n\t"
  136822. #endif
  136823. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136824. "lsls r6, r6, #16\n\t"
  136825. #else
  136826. "lsl r6, r6, #16\n\t"
  136827. #endif
  136828. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136829. "adds r5, r5, r6\n\t"
  136830. #else
  136831. "add r5, r5, r6\n\t"
  136832. #endif
  136833. #ifdef WOLFSSL_KEIL
  136834. "adcs r3, r3, r7\n\t"
  136835. #elif defined(__clang__)
  136836. "adcs r3, r7\n\t"
  136837. #else
  136838. "adc r3, r7\n\t"
  136839. #endif
  136840. #ifdef WOLFSSL_KEIL
  136841. "adcs r4, r4, %[r]\n\t"
  136842. #elif defined(__clang__)
  136843. "adcs r4, %[r]\n\t"
  136844. #else
  136845. "adc r4, %[r]\n\t"
  136846. #endif
  136847. "# A[2] * B[3]\n\t"
  136848. "mov %[a], r9\n\t"
  136849. "mov %[b], r10\n\t"
  136850. "ldr %[a], [%[a], #8]\n\t"
  136851. "ldr %[b], [%[b], #12]\n\t"
  136852. "uxth r6, %[a]\n\t"
  136853. "uxth r7, %[b]\n\t"
  136854. #ifdef WOLFSSL_KEIL
  136855. "muls r7, r6, r7\n\t"
  136856. #elif defined(__clang__)
  136857. "muls r7, r6\n\t"
  136858. #else
  136859. "mul r7, r6\n\t"
  136860. #endif
  136861. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136862. "adds r5, r5, r7\n\t"
  136863. #else
  136864. "add r5, r5, r7\n\t"
  136865. #endif
  136866. #ifdef WOLFSSL_KEIL
  136867. "adcs r3, r3, %[r]\n\t"
  136868. #elif defined(__clang__)
  136869. "adcs r3, %[r]\n\t"
  136870. #else
  136871. "adc r3, %[r]\n\t"
  136872. #endif
  136873. #ifdef WOLFSSL_KEIL
  136874. "adcs r4, r4, %[r]\n\t"
  136875. #elif defined(__clang__)
  136876. "adcs r4, %[r]\n\t"
  136877. #else
  136878. "adc r4, %[r]\n\t"
  136879. #endif
  136880. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136881. "lsrs r7, %[b], #16\n\t"
  136882. #else
  136883. "lsr r7, %[b], #16\n\t"
  136884. #endif
  136885. #ifdef WOLFSSL_KEIL
  136886. "muls r6, r7, r6\n\t"
  136887. #elif defined(__clang__)
  136888. "muls r6, r7\n\t"
  136889. #else
  136890. "mul r6, r7\n\t"
  136891. #endif
  136892. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136893. "lsrs r7, r6, #16\n\t"
  136894. #else
  136895. "lsr r7, r6, #16\n\t"
  136896. #endif
  136897. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136898. "lsls r6, r6, #16\n\t"
  136899. #else
  136900. "lsl r6, r6, #16\n\t"
  136901. #endif
  136902. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136903. "adds r5, r5, r6\n\t"
  136904. #else
  136905. "add r5, r5, r6\n\t"
  136906. #endif
  136907. #ifdef WOLFSSL_KEIL
  136908. "adcs r3, r3, r7\n\t"
  136909. #elif defined(__clang__)
  136910. "adcs r3, r7\n\t"
  136911. #else
  136912. "adc r3, r7\n\t"
  136913. #endif
  136914. #ifdef WOLFSSL_KEIL
  136915. "adcs r4, r4, %[r]\n\t"
  136916. #elif defined(__clang__)
  136917. "adcs r4, %[r]\n\t"
  136918. #else
  136919. "adc r4, %[r]\n\t"
  136920. #endif
  136921. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136922. "lsrs r6, %[a], #16\n\t"
  136923. #else
  136924. "lsr r6, %[a], #16\n\t"
  136925. #endif
  136926. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136927. "lsrs r7, %[b], #16\n\t"
  136928. #else
  136929. "lsr r7, %[b], #16\n\t"
  136930. #endif
  136931. #ifdef WOLFSSL_KEIL
  136932. "muls r7, r6, r7\n\t"
  136933. #elif defined(__clang__)
  136934. "muls r7, r6\n\t"
  136935. #else
  136936. "mul r7, r6\n\t"
  136937. #endif
  136938. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136939. "adds r3, r3, r7\n\t"
  136940. #else
  136941. "add r3, r3, r7\n\t"
  136942. #endif
  136943. #ifdef WOLFSSL_KEIL
  136944. "adcs r4, r4, %[r]\n\t"
  136945. #elif defined(__clang__)
  136946. "adcs r4, %[r]\n\t"
  136947. #else
  136948. "adc r4, %[r]\n\t"
  136949. #endif
  136950. "uxth r7, %[b]\n\t"
  136951. #ifdef WOLFSSL_KEIL
  136952. "muls r6, r7, r6\n\t"
  136953. #elif defined(__clang__)
  136954. "muls r6, r7\n\t"
  136955. #else
  136956. "mul r6, r7\n\t"
  136957. #endif
  136958. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136959. "lsrs r7, r6, #16\n\t"
  136960. #else
  136961. "lsr r7, r6, #16\n\t"
  136962. #endif
  136963. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136964. "lsls r6, r6, #16\n\t"
  136965. #else
  136966. "lsl r6, r6, #16\n\t"
  136967. #endif
  136968. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136969. "adds r5, r5, r6\n\t"
  136970. #else
  136971. "add r5, r5, r6\n\t"
  136972. #endif
  136973. #ifdef WOLFSSL_KEIL
  136974. "adcs r3, r3, r7\n\t"
  136975. #elif defined(__clang__)
  136976. "adcs r3, r7\n\t"
  136977. #else
  136978. "adc r3, r7\n\t"
  136979. #endif
  136980. #ifdef WOLFSSL_KEIL
  136981. "adcs r4, r4, %[r]\n\t"
  136982. #elif defined(__clang__)
  136983. "adcs r4, %[r]\n\t"
  136984. #else
  136985. "adc r4, %[r]\n\t"
  136986. #endif
  136987. "# A[3] * B[2]\n\t"
  136988. "mov %[a], r9\n\t"
  136989. "mov %[b], r10\n\t"
  136990. "ldr %[a], [%[a], #12]\n\t"
  136991. "ldr %[b], [%[b], #8]\n\t"
  136992. "uxth r6, %[a]\n\t"
  136993. "uxth r7, %[b]\n\t"
  136994. #ifdef WOLFSSL_KEIL
  136995. "muls r7, r6, r7\n\t"
  136996. #elif defined(__clang__)
  136997. "muls r7, r6\n\t"
  136998. #else
  136999. "mul r7, r6\n\t"
  137000. #endif
  137001. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137002. "adds r5, r5, r7\n\t"
  137003. #else
  137004. "add r5, r5, r7\n\t"
  137005. #endif
  137006. #ifdef WOLFSSL_KEIL
  137007. "adcs r3, r3, %[r]\n\t"
  137008. #elif defined(__clang__)
  137009. "adcs r3, %[r]\n\t"
  137010. #else
  137011. "adc r3, %[r]\n\t"
  137012. #endif
  137013. #ifdef WOLFSSL_KEIL
  137014. "adcs r4, r4, %[r]\n\t"
  137015. #elif defined(__clang__)
  137016. "adcs r4, %[r]\n\t"
  137017. #else
  137018. "adc r4, %[r]\n\t"
  137019. #endif
  137020. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137021. "lsrs r7, %[b], #16\n\t"
  137022. #else
  137023. "lsr r7, %[b], #16\n\t"
  137024. #endif
  137025. #ifdef WOLFSSL_KEIL
  137026. "muls r6, r7, r6\n\t"
  137027. #elif defined(__clang__)
  137028. "muls r6, r7\n\t"
  137029. #else
  137030. "mul r6, r7\n\t"
  137031. #endif
  137032. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137033. "lsrs r7, r6, #16\n\t"
  137034. #else
  137035. "lsr r7, r6, #16\n\t"
  137036. #endif
  137037. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137038. "lsls r6, r6, #16\n\t"
  137039. #else
  137040. "lsl r6, r6, #16\n\t"
  137041. #endif
  137042. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137043. "adds r5, r5, r6\n\t"
  137044. #else
  137045. "add r5, r5, r6\n\t"
  137046. #endif
  137047. #ifdef WOLFSSL_KEIL
  137048. "adcs r3, r3, r7\n\t"
  137049. #elif defined(__clang__)
  137050. "adcs r3, r7\n\t"
  137051. #else
  137052. "adc r3, r7\n\t"
  137053. #endif
  137054. #ifdef WOLFSSL_KEIL
  137055. "adcs r4, r4, %[r]\n\t"
  137056. #elif defined(__clang__)
  137057. "adcs r4, %[r]\n\t"
  137058. #else
  137059. "adc r4, %[r]\n\t"
  137060. #endif
  137061. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137062. "lsrs r6, %[a], #16\n\t"
  137063. #else
  137064. "lsr r6, %[a], #16\n\t"
  137065. #endif
  137066. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137067. "lsrs r7, %[b], #16\n\t"
  137068. #else
  137069. "lsr r7, %[b], #16\n\t"
  137070. #endif
  137071. #ifdef WOLFSSL_KEIL
  137072. "muls r7, r6, r7\n\t"
  137073. #elif defined(__clang__)
  137074. "muls r7, r6\n\t"
  137075. #else
  137076. "mul r7, r6\n\t"
  137077. #endif
  137078. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137079. "adds r3, r3, r7\n\t"
  137080. #else
  137081. "add r3, r3, r7\n\t"
  137082. #endif
  137083. #ifdef WOLFSSL_KEIL
  137084. "adcs r4, r4, %[r]\n\t"
  137085. #elif defined(__clang__)
  137086. "adcs r4, %[r]\n\t"
  137087. #else
  137088. "adc r4, %[r]\n\t"
  137089. #endif
  137090. "uxth r7, %[b]\n\t"
  137091. #ifdef WOLFSSL_KEIL
  137092. "muls r6, r7, r6\n\t"
  137093. #elif defined(__clang__)
  137094. "muls r6, r7\n\t"
  137095. #else
  137096. "mul r6, r7\n\t"
  137097. #endif
  137098. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137099. "lsrs r7, r6, #16\n\t"
  137100. #else
  137101. "lsr r7, r6, #16\n\t"
  137102. #endif
  137103. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137104. "lsls r6, r6, #16\n\t"
  137105. #else
  137106. "lsl r6, r6, #16\n\t"
  137107. #endif
  137108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137109. "adds r5, r5, r6\n\t"
  137110. #else
  137111. "add r5, r5, r6\n\t"
  137112. #endif
  137113. #ifdef WOLFSSL_KEIL
  137114. "adcs r3, r3, r7\n\t"
  137115. #elif defined(__clang__)
  137116. "adcs r3, r7\n\t"
  137117. #else
  137118. "adc r3, r7\n\t"
  137119. #endif
  137120. #ifdef WOLFSSL_KEIL
  137121. "adcs r4, r4, %[r]\n\t"
  137122. #elif defined(__clang__)
  137123. "adcs r4, %[r]\n\t"
  137124. #else
  137125. "adc r4, %[r]\n\t"
  137126. #endif
  137127. "# A[4] * B[1]\n\t"
  137128. "mov %[a], r9\n\t"
  137129. "mov %[b], r10\n\t"
  137130. "ldr %[a], [%[a], #16]\n\t"
  137131. "ldr %[b], [%[b], #4]\n\t"
  137132. "uxth r6, %[a]\n\t"
  137133. "uxth r7, %[b]\n\t"
  137134. #ifdef WOLFSSL_KEIL
  137135. "muls r7, r6, r7\n\t"
  137136. #elif defined(__clang__)
  137137. "muls r7, r6\n\t"
  137138. #else
  137139. "mul r7, r6\n\t"
  137140. #endif
  137141. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137142. "adds r5, r5, r7\n\t"
  137143. #else
  137144. "add r5, r5, r7\n\t"
  137145. #endif
  137146. #ifdef WOLFSSL_KEIL
  137147. "adcs r3, r3, %[r]\n\t"
  137148. #elif defined(__clang__)
  137149. "adcs r3, %[r]\n\t"
  137150. #else
  137151. "adc r3, %[r]\n\t"
  137152. #endif
  137153. #ifdef WOLFSSL_KEIL
  137154. "adcs r4, r4, %[r]\n\t"
  137155. #elif defined(__clang__)
  137156. "adcs r4, %[r]\n\t"
  137157. #else
  137158. "adc r4, %[r]\n\t"
  137159. #endif
  137160. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137161. "lsrs r7, %[b], #16\n\t"
  137162. #else
  137163. "lsr r7, %[b], #16\n\t"
  137164. #endif
  137165. #ifdef WOLFSSL_KEIL
  137166. "muls r6, r7, r6\n\t"
  137167. #elif defined(__clang__)
  137168. "muls r6, r7\n\t"
  137169. #else
  137170. "mul r6, r7\n\t"
  137171. #endif
  137172. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137173. "lsrs r7, r6, #16\n\t"
  137174. #else
  137175. "lsr r7, r6, #16\n\t"
  137176. #endif
  137177. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137178. "lsls r6, r6, #16\n\t"
  137179. #else
  137180. "lsl r6, r6, #16\n\t"
  137181. #endif
  137182. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137183. "adds r5, r5, r6\n\t"
  137184. #else
  137185. "add r5, r5, r6\n\t"
  137186. #endif
  137187. #ifdef WOLFSSL_KEIL
  137188. "adcs r3, r3, r7\n\t"
  137189. #elif defined(__clang__)
  137190. "adcs r3, r7\n\t"
  137191. #else
  137192. "adc r3, r7\n\t"
  137193. #endif
  137194. #ifdef WOLFSSL_KEIL
  137195. "adcs r4, r4, %[r]\n\t"
  137196. #elif defined(__clang__)
  137197. "adcs r4, %[r]\n\t"
  137198. #else
  137199. "adc r4, %[r]\n\t"
  137200. #endif
  137201. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137202. "lsrs r6, %[a], #16\n\t"
  137203. #else
  137204. "lsr r6, %[a], #16\n\t"
  137205. #endif
  137206. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137207. "lsrs r7, %[b], #16\n\t"
  137208. #else
  137209. "lsr r7, %[b], #16\n\t"
  137210. #endif
  137211. #ifdef WOLFSSL_KEIL
  137212. "muls r7, r6, r7\n\t"
  137213. #elif defined(__clang__)
  137214. "muls r7, r6\n\t"
  137215. #else
  137216. "mul r7, r6\n\t"
  137217. #endif
  137218. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137219. "adds r3, r3, r7\n\t"
  137220. #else
  137221. "add r3, r3, r7\n\t"
  137222. #endif
  137223. #ifdef WOLFSSL_KEIL
  137224. "adcs r4, r4, %[r]\n\t"
  137225. #elif defined(__clang__)
  137226. "adcs r4, %[r]\n\t"
  137227. #else
  137228. "adc r4, %[r]\n\t"
  137229. #endif
  137230. "uxth r7, %[b]\n\t"
  137231. #ifdef WOLFSSL_KEIL
  137232. "muls r6, r7, r6\n\t"
  137233. #elif defined(__clang__)
  137234. "muls r6, r7\n\t"
  137235. #else
  137236. "mul r6, r7\n\t"
  137237. #endif
  137238. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137239. "lsrs r7, r6, #16\n\t"
  137240. #else
  137241. "lsr r7, r6, #16\n\t"
  137242. #endif
  137243. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137244. "lsls r6, r6, #16\n\t"
  137245. #else
  137246. "lsl r6, r6, #16\n\t"
  137247. #endif
  137248. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137249. "adds r5, r5, r6\n\t"
  137250. #else
  137251. "add r5, r5, r6\n\t"
  137252. #endif
  137253. #ifdef WOLFSSL_KEIL
  137254. "adcs r3, r3, r7\n\t"
  137255. #elif defined(__clang__)
  137256. "adcs r3, r7\n\t"
  137257. #else
  137258. "adc r3, r7\n\t"
  137259. #endif
  137260. #ifdef WOLFSSL_KEIL
  137261. "adcs r4, r4, %[r]\n\t"
  137262. #elif defined(__clang__)
  137263. "adcs r4, %[r]\n\t"
  137264. #else
  137265. "adc r4, %[r]\n\t"
  137266. #endif
  137267. "# A[5] * B[0]\n\t"
  137268. "mov %[a], r9\n\t"
  137269. "mov %[b], r10\n\t"
  137270. "ldr %[a], [%[a], #20]\n\t"
  137271. "ldr %[b], [%[b]]\n\t"
  137272. "uxth r6, %[a]\n\t"
  137273. "uxth r7, %[b]\n\t"
  137274. #ifdef WOLFSSL_KEIL
  137275. "muls r7, r6, r7\n\t"
  137276. #elif defined(__clang__)
  137277. "muls r7, r6\n\t"
  137278. #else
  137279. "mul r7, r6\n\t"
  137280. #endif
  137281. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137282. "adds r5, r5, r7\n\t"
  137283. #else
  137284. "add r5, r5, r7\n\t"
  137285. #endif
  137286. #ifdef WOLFSSL_KEIL
  137287. "adcs r3, r3, %[r]\n\t"
  137288. #elif defined(__clang__)
  137289. "adcs r3, %[r]\n\t"
  137290. #else
  137291. "adc r3, %[r]\n\t"
  137292. #endif
  137293. #ifdef WOLFSSL_KEIL
  137294. "adcs r4, r4, %[r]\n\t"
  137295. #elif defined(__clang__)
  137296. "adcs r4, %[r]\n\t"
  137297. #else
  137298. "adc r4, %[r]\n\t"
  137299. #endif
  137300. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137301. "lsrs r7, %[b], #16\n\t"
  137302. #else
  137303. "lsr r7, %[b], #16\n\t"
  137304. #endif
  137305. #ifdef WOLFSSL_KEIL
  137306. "muls r6, r7, r6\n\t"
  137307. #elif defined(__clang__)
  137308. "muls r6, r7\n\t"
  137309. #else
  137310. "mul r6, r7\n\t"
  137311. #endif
  137312. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137313. "lsrs r7, r6, #16\n\t"
  137314. #else
  137315. "lsr r7, r6, #16\n\t"
  137316. #endif
  137317. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137318. "lsls r6, r6, #16\n\t"
  137319. #else
  137320. "lsl r6, r6, #16\n\t"
  137321. #endif
  137322. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137323. "adds r5, r5, r6\n\t"
  137324. #else
  137325. "add r5, r5, r6\n\t"
  137326. #endif
  137327. #ifdef WOLFSSL_KEIL
  137328. "adcs r3, r3, r7\n\t"
  137329. #elif defined(__clang__)
  137330. "adcs r3, r7\n\t"
  137331. #else
  137332. "adc r3, r7\n\t"
  137333. #endif
  137334. #ifdef WOLFSSL_KEIL
  137335. "adcs r4, r4, %[r]\n\t"
  137336. #elif defined(__clang__)
  137337. "adcs r4, %[r]\n\t"
  137338. #else
  137339. "adc r4, %[r]\n\t"
  137340. #endif
  137341. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137342. "lsrs r6, %[a], #16\n\t"
  137343. #else
  137344. "lsr r6, %[a], #16\n\t"
  137345. #endif
  137346. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137347. "lsrs r7, %[b], #16\n\t"
  137348. #else
  137349. "lsr r7, %[b], #16\n\t"
  137350. #endif
  137351. #ifdef WOLFSSL_KEIL
  137352. "muls r7, r6, r7\n\t"
  137353. #elif defined(__clang__)
  137354. "muls r7, r6\n\t"
  137355. #else
  137356. "mul r7, r6\n\t"
  137357. #endif
  137358. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137359. "adds r3, r3, r7\n\t"
  137360. #else
  137361. "add r3, r3, r7\n\t"
  137362. #endif
  137363. #ifdef WOLFSSL_KEIL
  137364. "adcs r4, r4, %[r]\n\t"
  137365. #elif defined(__clang__)
  137366. "adcs r4, %[r]\n\t"
  137367. #else
  137368. "adc r4, %[r]\n\t"
  137369. #endif
  137370. "uxth r7, %[b]\n\t"
  137371. #ifdef WOLFSSL_KEIL
  137372. "muls r6, r7, r6\n\t"
  137373. #elif defined(__clang__)
  137374. "muls r6, r7\n\t"
  137375. #else
  137376. "mul r6, r7\n\t"
  137377. #endif
  137378. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137379. "lsrs r7, r6, #16\n\t"
  137380. #else
  137381. "lsr r7, r6, #16\n\t"
  137382. #endif
  137383. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137384. "lsls r6, r6, #16\n\t"
  137385. #else
  137386. "lsl r6, r6, #16\n\t"
  137387. #endif
  137388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137389. "adds r5, r5, r6\n\t"
  137390. #else
  137391. "add r5, r5, r6\n\t"
  137392. #endif
  137393. #ifdef WOLFSSL_KEIL
  137394. "adcs r3, r3, r7\n\t"
  137395. #elif defined(__clang__)
  137396. "adcs r3, r7\n\t"
  137397. #else
  137398. "adc r3, r7\n\t"
  137399. #endif
  137400. #ifdef WOLFSSL_KEIL
  137401. "adcs r4, r4, %[r]\n\t"
  137402. #elif defined(__clang__)
  137403. "adcs r4, %[r]\n\t"
  137404. #else
  137405. "adc r4, %[r]\n\t"
  137406. #endif
  137407. "str r5, [sp, #20]\n\t"
  137408. "# A[6] * B[0]\n\t"
  137409. "movs r5, #0\n\t"
  137410. "mov %[a], r9\n\t"
  137411. "mov %[b], r10\n\t"
  137412. "ldr %[a], [%[a], #24]\n\t"
  137413. "ldr %[b], [%[b]]\n\t"
  137414. "uxth r6, %[a]\n\t"
  137415. "uxth r7, %[b]\n\t"
  137416. #ifdef WOLFSSL_KEIL
  137417. "muls r7, r6, r7\n\t"
  137418. #elif defined(__clang__)
  137419. "muls r7, r6\n\t"
  137420. #else
  137421. "mul r7, r6\n\t"
  137422. #endif
  137423. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137424. "adds r3, r3, r7\n\t"
  137425. #else
  137426. "add r3, r3, r7\n\t"
  137427. #endif
  137428. #ifdef WOLFSSL_KEIL
  137429. "adcs r4, r4, %[r]\n\t"
  137430. #elif defined(__clang__)
  137431. "adcs r4, %[r]\n\t"
  137432. #else
  137433. "adc r4, %[r]\n\t"
  137434. #endif
  137435. #ifdef WOLFSSL_KEIL
  137436. "adcs r5, r5, %[r]\n\t"
  137437. #elif defined(__clang__)
  137438. "adcs r5, %[r]\n\t"
  137439. #else
  137440. "adc r5, %[r]\n\t"
  137441. #endif
  137442. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137443. "lsrs r7, %[b], #16\n\t"
  137444. #else
  137445. "lsr r7, %[b], #16\n\t"
  137446. #endif
  137447. #ifdef WOLFSSL_KEIL
  137448. "muls r6, r7, r6\n\t"
  137449. #elif defined(__clang__)
  137450. "muls r6, r7\n\t"
  137451. #else
  137452. "mul r6, r7\n\t"
  137453. #endif
  137454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137455. "lsrs r7, r6, #16\n\t"
  137456. #else
  137457. "lsr r7, r6, #16\n\t"
  137458. #endif
  137459. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137460. "lsls r6, r6, #16\n\t"
  137461. #else
  137462. "lsl r6, r6, #16\n\t"
  137463. #endif
  137464. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137465. "adds r3, r3, r6\n\t"
  137466. #else
  137467. "add r3, r3, r6\n\t"
  137468. #endif
  137469. #ifdef WOLFSSL_KEIL
  137470. "adcs r4, r4, r7\n\t"
  137471. #elif defined(__clang__)
  137472. "adcs r4, r7\n\t"
  137473. #else
  137474. "adc r4, r7\n\t"
  137475. #endif
  137476. #ifdef WOLFSSL_KEIL
  137477. "adcs r5, r5, %[r]\n\t"
  137478. #elif defined(__clang__)
  137479. "adcs r5, %[r]\n\t"
  137480. #else
  137481. "adc r5, %[r]\n\t"
  137482. #endif
  137483. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137484. "lsrs r6, %[a], #16\n\t"
  137485. #else
  137486. "lsr r6, %[a], #16\n\t"
  137487. #endif
  137488. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137489. "lsrs r7, %[b], #16\n\t"
  137490. #else
  137491. "lsr r7, %[b], #16\n\t"
  137492. #endif
  137493. #ifdef WOLFSSL_KEIL
  137494. "muls r7, r6, r7\n\t"
  137495. #elif defined(__clang__)
  137496. "muls r7, r6\n\t"
  137497. #else
  137498. "mul r7, r6\n\t"
  137499. #endif
  137500. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137501. "adds r4, r4, r7\n\t"
  137502. #else
  137503. "add r4, r4, r7\n\t"
  137504. #endif
  137505. #ifdef WOLFSSL_KEIL
  137506. "adcs r5, r5, %[r]\n\t"
  137507. #elif defined(__clang__)
  137508. "adcs r5, %[r]\n\t"
  137509. #else
  137510. "adc r5, %[r]\n\t"
  137511. #endif
  137512. "uxth r7, %[b]\n\t"
  137513. #ifdef WOLFSSL_KEIL
  137514. "muls r6, r7, r6\n\t"
  137515. #elif defined(__clang__)
  137516. "muls r6, r7\n\t"
  137517. #else
  137518. "mul r6, r7\n\t"
  137519. #endif
  137520. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137521. "lsrs r7, r6, #16\n\t"
  137522. #else
  137523. "lsr r7, r6, #16\n\t"
  137524. #endif
  137525. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137526. "lsls r6, r6, #16\n\t"
  137527. #else
  137528. "lsl r6, r6, #16\n\t"
  137529. #endif
  137530. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137531. "adds r3, r3, r6\n\t"
  137532. #else
  137533. "add r3, r3, r6\n\t"
  137534. #endif
  137535. #ifdef WOLFSSL_KEIL
  137536. "adcs r4, r4, r7\n\t"
  137537. #elif defined(__clang__)
  137538. "adcs r4, r7\n\t"
  137539. #else
  137540. "adc r4, r7\n\t"
  137541. #endif
  137542. #ifdef WOLFSSL_KEIL
  137543. "adcs r5, r5, %[r]\n\t"
  137544. #elif defined(__clang__)
  137545. "adcs r5, %[r]\n\t"
  137546. #else
  137547. "adc r5, %[r]\n\t"
  137548. #endif
  137549. "# A[5] * B[1]\n\t"
  137550. "mov %[a], r9\n\t"
  137551. "mov %[b], r10\n\t"
  137552. "ldr %[a], [%[a], #20]\n\t"
  137553. "ldr %[b], [%[b], #4]\n\t"
  137554. "uxth r6, %[a]\n\t"
  137555. "uxth r7, %[b]\n\t"
  137556. #ifdef WOLFSSL_KEIL
  137557. "muls r7, r6, r7\n\t"
  137558. #elif defined(__clang__)
  137559. "muls r7, r6\n\t"
  137560. #else
  137561. "mul r7, r6\n\t"
  137562. #endif
  137563. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137564. "adds r3, r3, r7\n\t"
  137565. #else
  137566. "add r3, r3, r7\n\t"
  137567. #endif
  137568. #ifdef WOLFSSL_KEIL
  137569. "adcs r4, r4, %[r]\n\t"
  137570. #elif defined(__clang__)
  137571. "adcs r4, %[r]\n\t"
  137572. #else
  137573. "adc r4, %[r]\n\t"
  137574. #endif
  137575. #ifdef WOLFSSL_KEIL
  137576. "adcs r5, r5, %[r]\n\t"
  137577. #elif defined(__clang__)
  137578. "adcs r5, %[r]\n\t"
  137579. #else
  137580. "adc r5, %[r]\n\t"
  137581. #endif
  137582. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137583. "lsrs r7, %[b], #16\n\t"
  137584. #else
  137585. "lsr r7, %[b], #16\n\t"
  137586. #endif
  137587. #ifdef WOLFSSL_KEIL
  137588. "muls r6, r7, r6\n\t"
  137589. #elif defined(__clang__)
  137590. "muls r6, r7\n\t"
  137591. #else
  137592. "mul r6, r7\n\t"
  137593. #endif
  137594. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137595. "lsrs r7, r6, #16\n\t"
  137596. #else
  137597. "lsr r7, r6, #16\n\t"
  137598. #endif
  137599. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137600. "lsls r6, r6, #16\n\t"
  137601. #else
  137602. "lsl r6, r6, #16\n\t"
  137603. #endif
  137604. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137605. "adds r3, r3, r6\n\t"
  137606. #else
  137607. "add r3, r3, r6\n\t"
  137608. #endif
  137609. #ifdef WOLFSSL_KEIL
  137610. "adcs r4, r4, r7\n\t"
  137611. #elif defined(__clang__)
  137612. "adcs r4, r7\n\t"
  137613. #else
  137614. "adc r4, r7\n\t"
  137615. #endif
  137616. #ifdef WOLFSSL_KEIL
  137617. "adcs r5, r5, %[r]\n\t"
  137618. #elif defined(__clang__)
  137619. "adcs r5, %[r]\n\t"
  137620. #else
  137621. "adc r5, %[r]\n\t"
  137622. #endif
  137623. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137624. "lsrs r6, %[a], #16\n\t"
  137625. #else
  137626. "lsr r6, %[a], #16\n\t"
  137627. #endif
  137628. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137629. "lsrs r7, %[b], #16\n\t"
  137630. #else
  137631. "lsr r7, %[b], #16\n\t"
  137632. #endif
  137633. #ifdef WOLFSSL_KEIL
  137634. "muls r7, r6, r7\n\t"
  137635. #elif defined(__clang__)
  137636. "muls r7, r6\n\t"
  137637. #else
  137638. "mul r7, r6\n\t"
  137639. #endif
  137640. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137641. "adds r4, r4, r7\n\t"
  137642. #else
  137643. "add r4, r4, r7\n\t"
  137644. #endif
  137645. #ifdef WOLFSSL_KEIL
  137646. "adcs r5, r5, %[r]\n\t"
  137647. #elif defined(__clang__)
  137648. "adcs r5, %[r]\n\t"
  137649. #else
  137650. "adc r5, %[r]\n\t"
  137651. #endif
  137652. "uxth r7, %[b]\n\t"
  137653. #ifdef WOLFSSL_KEIL
  137654. "muls r6, r7, r6\n\t"
  137655. #elif defined(__clang__)
  137656. "muls r6, r7\n\t"
  137657. #else
  137658. "mul r6, r7\n\t"
  137659. #endif
  137660. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137661. "lsrs r7, r6, #16\n\t"
  137662. #else
  137663. "lsr r7, r6, #16\n\t"
  137664. #endif
  137665. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137666. "lsls r6, r6, #16\n\t"
  137667. #else
  137668. "lsl r6, r6, #16\n\t"
  137669. #endif
  137670. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137671. "adds r3, r3, r6\n\t"
  137672. #else
  137673. "add r3, r3, r6\n\t"
  137674. #endif
  137675. #ifdef WOLFSSL_KEIL
  137676. "adcs r4, r4, r7\n\t"
  137677. #elif defined(__clang__)
  137678. "adcs r4, r7\n\t"
  137679. #else
  137680. "adc r4, r7\n\t"
  137681. #endif
  137682. #ifdef WOLFSSL_KEIL
  137683. "adcs r5, r5, %[r]\n\t"
  137684. #elif defined(__clang__)
  137685. "adcs r5, %[r]\n\t"
  137686. #else
  137687. "adc r5, %[r]\n\t"
  137688. #endif
  137689. "# A[4] * B[2]\n\t"
  137690. "mov %[a], r9\n\t"
  137691. "mov %[b], r10\n\t"
  137692. "ldr %[a], [%[a], #16]\n\t"
  137693. "ldr %[b], [%[b], #8]\n\t"
  137694. "uxth r6, %[a]\n\t"
  137695. "uxth r7, %[b]\n\t"
  137696. #ifdef WOLFSSL_KEIL
  137697. "muls r7, r6, r7\n\t"
  137698. #elif defined(__clang__)
  137699. "muls r7, r6\n\t"
  137700. #else
  137701. "mul r7, r6\n\t"
  137702. #endif
  137703. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137704. "adds r3, r3, r7\n\t"
  137705. #else
  137706. "add r3, r3, r7\n\t"
  137707. #endif
  137708. #ifdef WOLFSSL_KEIL
  137709. "adcs r4, r4, %[r]\n\t"
  137710. #elif defined(__clang__)
  137711. "adcs r4, %[r]\n\t"
  137712. #else
  137713. "adc r4, %[r]\n\t"
  137714. #endif
  137715. #ifdef WOLFSSL_KEIL
  137716. "adcs r5, r5, %[r]\n\t"
  137717. #elif defined(__clang__)
  137718. "adcs r5, %[r]\n\t"
  137719. #else
  137720. "adc r5, %[r]\n\t"
  137721. #endif
  137722. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137723. "lsrs r7, %[b], #16\n\t"
  137724. #else
  137725. "lsr r7, %[b], #16\n\t"
  137726. #endif
  137727. #ifdef WOLFSSL_KEIL
  137728. "muls r6, r7, r6\n\t"
  137729. #elif defined(__clang__)
  137730. "muls r6, r7\n\t"
  137731. #else
  137732. "mul r6, r7\n\t"
  137733. #endif
  137734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137735. "lsrs r7, r6, #16\n\t"
  137736. #else
  137737. "lsr r7, r6, #16\n\t"
  137738. #endif
  137739. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137740. "lsls r6, r6, #16\n\t"
  137741. #else
  137742. "lsl r6, r6, #16\n\t"
  137743. #endif
  137744. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137745. "adds r3, r3, r6\n\t"
  137746. #else
  137747. "add r3, r3, r6\n\t"
  137748. #endif
  137749. #ifdef WOLFSSL_KEIL
  137750. "adcs r4, r4, r7\n\t"
  137751. #elif defined(__clang__)
  137752. "adcs r4, r7\n\t"
  137753. #else
  137754. "adc r4, r7\n\t"
  137755. #endif
  137756. #ifdef WOLFSSL_KEIL
  137757. "adcs r5, r5, %[r]\n\t"
  137758. #elif defined(__clang__)
  137759. "adcs r5, %[r]\n\t"
  137760. #else
  137761. "adc r5, %[r]\n\t"
  137762. #endif
  137763. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137764. "lsrs r6, %[a], #16\n\t"
  137765. #else
  137766. "lsr r6, %[a], #16\n\t"
  137767. #endif
  137768. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137769. "lsrs r7, %[b], #16\n\t"
  137770. #else
  137771. "lsr r7, %[b], #16\n\t"
  137772. #endif
  137773. #ifdef WOLFSSL_KEIL
  137774. "muls r7, r6, r7\n\t"
  137775. #elif defined(__clang__)
  137776. "muls r7, r6\n\t"
  137777. #else
  137778. "mul r7, r6\n\t"
  137779. #endif
  137780. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137781. "adds r4, r4, r7\n\t"
  137782. #else
  137783. "add r4, r4, r7\n\t"
  137784. #endif
  137785. #ifdef WOLFSSL_KEIL
  137786. "adcs r5, r5, %[r]\n\t"
  137787. #elif defined(__clang__)
  137788. "adcs r5, %[r]\n\t"
  137789. #else
  137790. "adc r5, %[r]\n\t"
  137791. #endif
  137792. "uxth r7, %[b]\n\t"
  137793. #ifdef WOLFSSL_KEIL
  137794. "muls r6, r7, r6\n\t"
  137795. #elif defined(__clang__)
  137796. "muls r6, r7\n\t"
  137797. #else
  137798. "mul r6, r7\n\t"
  137799. #endif
  137800. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137801. "lsrs r7, r6, #16\n\t"
  137802. #else
  137803. "lsr r7, r6, #16\n\t"
  137804. #endif
  137805. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137806. "lsls r6, r6, #16\n\t"
  137807. #else
  137808. "lsl r6, r6, #16\n\t"
  137809. #endif
  137810. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137811. "adds r3, r3, r6\n\t"
  137812. #else
  137813. "add r3, r3, r6\n\t"
  137814. #endif
  137815. #ifdef WOLFSSL_KEIL
  137816. "adcs r4, r4, r7\n\t"
  137817. #elif defined(__clang__)
  137818. "adcs r4, r7\n\t"
  137819. #else
  137820. "adc r4, r7\n\t"
  137821. #endif
  137822. #ifdef WOLFSSL_KEIL
  137823. "adcs r5, r5, %[r]\n\t"
  137824. #elif defined(__clang__)
  137825. "adcs r5, %[r]\n\t"
  137826. #else
  137827. "adc r5, %[r]\n\t"
  137828. #endif
  137829. "# A[3] * B[3]\n\t"
  137830. "mov %[a], r9\n\t"
  137831. "mov %[b], r10\n\t"
  137832. "ldr %[a], [%[a], #12]\n\t"
  137833. "ldr %[b], [%[b], #12]\n\t"
  137834. "uxth r6, %[a]\n\t"
  137835. "uxth r7, %[b]\n\t"
  137836. #ifdef WOLFSSL_KEIL
  137837. "muls r7, r6, r7\n\t"
  137838. #elif defined(__clang__)
  137839. "muls r7, r6\n\t"
  137840. #else
  137841. "mul r7, r6\n\t"
  137842. #endif
  137843. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137844. "adds r3, r3, r7\n\t"
  137845. #else
  137846. "add r3, r3, r7\n\t"
  137847. #endif
  137848. #ifdef WOLFSSL_KEIL
  137849. "adcs r4, r4, %[r]\n\t"
  137850. #elif defined(__clang__)
  137851. "adcs r4, %[r]\n\t"
  137852. #else
  137853. "adc r4, %[r]\n\t"
  137854. #endif
  137855. #ifdef WOLFSSL_KEIL
  137856. "adcs r5, r5, %[r]\n\t"
  137857. #elif defined(__clang__)
  137858. "adcs r5, %[r]\n\t"
  137859. #else
  137860. "adc r5, %[r]\n\t"
  137861. #endif
  137862. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137863. "lsrs r7, %[b], #16\n\t"
  137864. #else
  137865. "lsr r7, %[b], #16\n\t"
  137866. #endif
  137867. #ifdef WOLFSSL_KEIL
  137868. "muls r6, r7, r6\n\t"
  137869. #elif defined(__clang__)
  137870. "muls r6, r7\n\t"
  137871. #else
  137872. "mul r6, r7\n\t"
  137873. #endif
  137874. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137875. "lsrs r7, r6, #16\n\t"
  137876. #else
  137877. "lsr r7, r6, #16\n\t"
  137878. #endif
  137879. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137880. "lsls r6, r6, #16\n\t"
  137881. #else
  137882. "lsl r6, r6, #16\n\t"
  137883. #endif
  137884. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137885. "adds r3, r3, r6\n\t"
  137886. #else
  137887. "add r3, r3, r6\n\t"
  137888. #endif
  137889. #ifdef WOLFSSL_KEIL
  137890. "adcs r4, r4, r7\n\t"
  137891. #elif defined(__clang__)
  137892. "adcs r4, r7\n\t"
  137893. #else
  137894. "adc r4, r7\n\t"
  137895. #endif
  137896. #ifdef WOLFSSL_KEIL
  137897. "adcs r5, r5, %[r]\n\t"
  137898. #elif defined(__clang__)
  137899. "adcs r5, %[r]\n\t"
  137900. #else
  137901. "adc r5, %[r]\n\t"
  137902. #endif
  137903. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137904. "lsrs r6, %[a], #16\n\t"
  137905. #else
  137906. "lsr r6, %[a], #16\n\t"
  137907. #endif
  137908. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137909. "lsrs r7, %[b], #16\n\t"
  137910. #else
  137911. "lsr r7, %[b], #16\n\t"
  137912. #endif
  137913. #ifdef WOLFSSL_KEIL
  137914. "muls r7, r6, r7\n\t"
  137915. #elif defined(__clang__)
  137916. "muls r7, r6\n\t"
  137917. #else
  137918. "mul r7, r6\n\t"
  137919. #endif
  137920. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137921. "adds r4, r4, r7\n\t"
  137922. #else
  137923. "add r4, r4, r7\n\t"
  137924. #endif
  137925. #ifdef WOLFSSL_KEIL
  137926. "adcs r5, r5, %[r]\n\t"
  137927. #elif defined(__clang__)
  137928. "adcs r5, %[r]\n\t"
  137929. #else
  137930. "adc r5, %[r]\n\t"
  137931. #endif
  137932. "uxth r7, %[b]\n\t"
  137933. #ifdef WOLFSSL_KEIL
  137934. "muls r6, r7, r6\n\t"
  137935. #elif defined(__clang__)
  137936. "muls r6, r7\n\t"
  137937. #else
  137938. "mul r6, r7\n\t"
  137939. #endif
  137940. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137941. "lsrs r7, r6, #16\n\t"
  137942. #else
  137943. "lsr r7, r6, #16\n\t"
  137944. #endif
  137945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137946. "lsls r6, r6, #16\n\t"
  137947. #else
  137948. "lsl r6, r6, #16\n\t"
  137949. #endif
  137950. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137951. "adds r3, r3, r6\n\t"
  137952. #else
  137953. "add r3, r3, r6\n\t"
  137954. #endif
  137955. #ifdef WOLFSSL_KEIL
  137956. "adcs r4, r4, r7\n\t"
  137957. #elif defined(__clang__)
  137958. "adcs r4, r7\n\t"
  137959. #else
  137960. "adc r4, r7\n\t"
  137961. #endif
  137962. #ifdef WOLFSSL_KEIL
  137963. "adcs r5, r5, %[r]\n\t"
  137964. #elif defined(__clang__)
  137965. "adcs r5, %[r]\n\t"
  137966. #else
  137967. "adc r5, %[r]\n\t"
  137968. #endif
  137969. "# A[2] * B[4]\n\t"
  137970. "mov %[a], r9\n\t"
  137971. "mov %[b], r10\n\t"
  137972. "ldr %[a], [%[a], #8]\n\t"
  137973. "ldr %[b], [%[b], #16]\n\t"
  137974. "uxth r6, %[a]\n\t"
  137975. "uxth r7, %[b]\n\t"
  137976. #ifdef WOLFSSL_KEIL
  137977. "muls r7, r6, r7\n\t"
  137978. #elif defined(__clang__)
  137979. "muls r7, r6\n\t"
  137980. #else
  137981. "mul r7, r6\n\t"
  137982. #endif
  137983. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137984. "adds r3, r3, r7\n\t"
  137985. #else
  137986. "add r3, r3, r7\n\t"
  137987. #endif
  137988. #ifdef WOLFSSL_KEIL
  137989. "adcs r4, r4, %[r]\n\t"
  137990. #elif defined(__clang__)
  137991. "adcs r4, %[r]\n\t"
  137992. #else
  137993. "adc r4, %[r]\n\t"
  137994. #endif
  137995. #ifdef WOLFSSL_KEIL
  137996. "adcs r5, r5, %[r]\n\t"
  137997. #elif defined(__clang__)
  137998. "adcs r5, %[r]\n\t"
  137999. #else
  138000. "adc r5, %[r]\n\t"
  138001. #endif
  138002. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138003. "lsrs r7, %[b], #16\n\t"
  138004. #else
  138005. "lsr r7, %[b], #16\n\t"
  138006. #endif
  138007. #ifdef WOLFSSL_KEIL
  138008. "muls r6, r7, r6\n\t"
  138009. #elif defined(__clang__)
  138010. "muls r6, r7\n\t"
  138011. #else
  138012. "mul r6, r7\n\t"
  138013. #endif
  138014. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138015. "lsrs r7, r6, #16\n\t"
  138016. #else
  138017. "lsr r7, r6, #16\n\t"
  138018. #endif
  138019. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138020. "lsls r6, r6, #16\n\t"
  138021. #else
  138022. "lsl r6, r6, #16\n\t"
  138023. #endif
  138024. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138025. "adds r3, r3, r6\n\t"
  138026. #else
  138027. "add r3, r3, r6\n\t"
  138028. #endif
  138029. #ifdef WOLFSSL_KEIL
  138030. "adcs r4, r4, r7\n\t"
  138031. #elif defined(__clang__)
  138032. "adcs r4, r7\n\t"
  138033. #else
  138034. "adc r4, r7\n\t"
  138035. #endif
  138036. #ifdef WOLFSSL_KEIL
  138037. "adcs r5, r5, %[r]\n\t"
  138038. #elif defined(__clang__)
  138039. "adcs r5, %[r]\n\t"
  138040. #else
  138041. "adc r5, %[r]\n\t"
  138042. #endif
  138043. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138044. "lsrs r6, %[a], #16\n\t"
  138045. #else
  138046. "lsr r6, %[a], #16\n\t"
  138047. #endif
  138048. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138049. "lsrs r7, %[b], #16\n\t"
  138050. #else
  138051. "lsr r7, %[b], #16\n\t"
  138052. #endif
  138053. #ifdef WOLFSSL_KEIL
  138054. "muls r7, r6, r7\n\t"
  138055. #elif defined(__clang__)
  138056. "muls r7, r6\n\t"
  138057. #else
  138058. "mul r7, r6\n\t"
  138059. #endif
  138060. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138061. "adds r4, r4, r7\n\t"
  138062. #else
  138063. "add r4, r4, r7\n\t"
  138064. #endif
  138065. #ifdef WOLFSSL_KEIL
  138066. "adcs r5, r5, %[r]\n\t"
  138067. #elif defined(__clang__)
  138068. "adcs r5, %[r]\n\t"
  138069. #else
  138070. "adc r5, %[r]\n\t"
  138071. #endif
  138072. "uxth r7, %[b]\n\t"
  138073. #ifdef WOLFSSL_KEIL
  138074. "muls r6, r7, r6\n\t"
  138075. #elif defined(__clang__)
  138076. "muls r6, r7\n\t"
  138077. #else
  138078. "mul r6, r7\n\t"
  138079. #endif
  138080. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138081. "lsrs r7, r6, #16\n\t"
  138082. #else
  138083. "lsr r7, r6, #16\n\t"
  138084. #endif
  138085. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138086. "lsls r6, r6, #16\n\t"
  138087. #else
  138088. "lsl r6, r6, #16\n\t"
  138089. #endif
  138090. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138091. "adds r3, r3, r6\n\t"
  138092. #else
  138093. "add r3, r3, r6\n\t"
  138094. #endif
  138095. #ifdef WOLFSSL_KEIL
  138096. "adcs r4, r4, r7\n\t"
  138097. #elif defined(__clang__)
  138098. "adcs r4, r7\n\t"
  138099. #else
  138100. "adc r4, r7\n\t"
  138101. #endif
  138102. #ifdef WOLFSSL_KEIL
  138103. "adcs r5, r5, %[r]\n\t"
  138104. #elif defined(__clang__)
  138105. "adcs r5, %[r]\n\t"
  138106. #else
  138107. "adc r5, %[r]\n\t"
  138108. #endif
  138109. "# A[1] * B[5]\n\t"
  138110. "mov %[a], r9\n\t"
  138111. "mov %[b], r10\n\t"
  138112. "ldr %[a], [%[a], #4]\n\t"
  138113. "ldr %[b], [%[b], #20]\n\t"
  138114. "uxth r6, %[a]\n\t"
  138115. "uxth r7, %[b]\n\t"
  138116. #ifdef WOLFSSL_KEIL
  138117. "muls r7, r6, r7\n\t"
  138118. #elif defined(__clang__)
  138119. "muls r7, r6\n\t"
  138120. #else
  138121. "mul r7, r6\n\t"
  138122. #endif
  138123. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138124. "adds r3, r3, r7\n\t"
  138125. #else
  138126. "add r3, r3, r7\n\t"
  138127. #endif
  138128. #ifdef WOLFSSL_KEIL
  138129. "adcs r4, r4, %[r]\n\t"
  138130. #elif defined(__clang__)
  138131. "adcs r4, %[r]\n\t"
  138132. #else
  138133. "adc r4, %[r]\n\t"
  138134. #endif
  138135. #ifdef WOLFSSL_KEIL
  138136. "adcs r5, r5, %[r]\n\t"
  138137. #elif defined(__clang__)
  138138. "adcs r5, %[r]\n\t"
  138139. #else
  138140. "adc r5, %[r]\n\t"
  138141. #endif
  138142. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138143. "lsrs r7, %[b], #16\n\t"
  138144. #else
  138145. "lsr r7, %[b], #16\n\t"
  138146. #endif
  138147. #ifdef WOLFSSL_KEIL
  138148. "muls r6, r7, r6\n\t"
  138149. #elif defined(__clang__)
  138150. "muls r6, r7\n\t"
  138151. #else
  138152. "mul r6, r7\n\t"
  138153. #endif
  138154. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138155. "lsrs r7, r6, #16\n\t"
  138156. #else
  138157. "lsr r7, r6, #16\n\t"
  138158. #endif
  138159. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138160. "lsls r6, r6, #16\n\t"
  138161. #else
  138162. "lsl r6, r6, #16\n\t"
  138163. #endif
  138164. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138165. "adds r3, r3, r6\n\t"
  138166. #else
  138167. "add r3, r3, r6\n\t"
  138168. #endif
  138169. #ifdef WOLFSSL_KEIL
  138170. "adcs r4, r4, r7\n\t"
  138171. #elif defined(__clang__)
  138172. "adcs r4, r7\n\t"
  138173. #else
  138174. "adc r4, r7\n\t"
  138175. #endif
  138176. #ifdef WOLFSSL_KEIL
  138177. "adcs r5, r5, %[r]\n\t"
  138178. #elif defined(__clang__)
  138179. "adcs r5, %[r]\n\t"
  138180. #else
  138181. "adc r5, %[r]\n\t"
  138182. #endif
  138183. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138184. "lsrs r6, %[a], #16\n\t"
  138185. #else
  138186. "lsr r6, %[a], #16\n\t"
  138187. #endif
  138188. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138189. "lsrs r7, %[b], #16\n\t"
  138190. #else
  138191. "lsr r7, %[b], #16\n\t"
  138192. #endif
  138193. #ifdef WOLFSSL_KEIL
  138194. "muls r7, r6, r7\n\t"
  138195. #elif defined(__clang__)
  138196. "muls r7, r6\n\t"
  138197. #else
  138198. "mul r7, r6\n\t"
  138199. #endif
  138200. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138201. "adds r4, r4, r7\n\t"
  138202. #else
  138203. "add r4, r4, r7\n\t"
  138204. #endif
  138205. #ifdef WOLFSSL_KEIL
  138206. "adcs r5, r5, %[r]\n\t"
  138207. #elif defined(__clang__)
  138208. "adcs r5, %[r]\n\t"
  138209. #else
  138210. "adc r5, %[r]\n\t"
  138211. #endif
  138212. "uxth r7, %[b]\n\t"
  138213. #ifdef WOLFSSL_KEIL
  138214. "muls r6, r7, r6\n\t"
  138215. #elif defined(__clang__)
  138216. "muls r6, r7\n\t"
  138217. #else
  138218. "mul r6, r7\n\t"
  138219. #endif
  138220. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138221. "lsrs r7, r6, #16\n\t"
  138222. #else
  138223. "lsr r7, r6, #16\n\t"
  138224. #endif
  138225. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138226. "lsls r6, r6, #16\n\t"
  138227. #else
  138228. "lsl r6, r6, #16\n\t"
  138229. #endif
  138230. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138231. "adds r3, r3, r6\n\t"
  138232. #else
  138233. "add r3, r3, r6\n\t"
  138234. #endif
  138235. #ifdef WOLFSSL_KEIL
  138236. "adcs r4, r4, r7\n\t"
  138237. #elif defined(__clang__)
  138238. "adcs r4, r7\n\t"
  138239. #else
  138240. "adc r4, r7\n\t"
  138241. #endif
  138242. #ifdef WOLFSSL_KEIL
  138243. "adcs r5, r5, %[r]\n\t"
  138244. #elif defined(__clang__)
  138245. "adcs r5, %[r]\n\t"
  138246. #else
  138247. "adc r5, %[r]\n\t"
  138248. #endif
  138249. "# A[0] * B[6]\n\t"
  138250. "mov %[a], r9\n\t"
  138251. "mov %[b], r10\n\t"
  138252. "ldr %[a], [%[a]]\n\t"
  138253. "ldr %[b], [%[b], #24]\n\t"
  138254. "uxth r6, %[a]\n\t"
  138255. "uxth r7, %[b]\n\t"
  138256. #ifdef WOLFSSL_KEIL
  138257. "muls r7, r6, r7\n\t"
  138258. #elif defined(__clang__)
  138259. "muls r7, r6\n\t"
  138260. #else
  138261. "mul r7, r6\n\t"
  138262. #endif
  138263. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138264. "adds r3, r3, r7\n\t"
  138265. #else
  138266. "add r3, r3, r7\n\t"
  138267. #endif
  138268. #ifdef WOLFSSL_KEIL
  138269. "adcs r4, r4, %[r]\n\t"
  138270. #elif defined(__clang__)
  138271. "adcs r4, %[r]\n\t"
  138272. #else
  138273. "adc r4, %[r]\n\t"
  138274. #endif
  138275. #ifdef WOLFSSL_KEIL
  138276. "adcs r5, r5, %[r]\n\t"
  138277. #elif defined(__clang__)
  138278. "adcs r5, %[r]\n\t"
  138279. #else
  138280. "adc r5, %[r]\n\t"
  138281. #endif
  138282. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138283. "lsrs r7, %[b], #16\n\t"
  138284. #else
  138285. "lsr r7, %[b], #16\n\t"
  138286. #endif
  138287. #ifdef WOLFSSL_KEIL
  138288. "muls r6, r7, r6\n\t"
  138289. #elif defined(__clang__)
  138290. "muls r6, r7\n\t"
  138291. #else
  138292. "mul r6, r7\n\t"
  138293. #endif
  138294. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138295. "lsrs r7, r6, #16\n\t"
  138296. #else
  138297. "lsr r7, r6, #16\n\t"
  138298. #endif
  138299. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138300. "lsls r6, r6, #16\n\t"
  138301. #else
  138302. "lsl r6, r6, #16\n\t"
  138303. #endif
  138304. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138305. "adds r3, r3, r6\n\t"
  138306. #else
  138307. "add r3, r3, r6\n\t"
  138308. #endif
  138309. #ifdef WOLFSSL_KEIL
  138310. "adcs r4, r4, r7\n\t"
  138311. #elif defined(__clang__)
  138312. "adcs r4, r7\n\t"
  138313. #else
  138314. "adc r4, r7\n\t"
  138315. #endif
  138316. #ifdef WOLFSSL_KEIL
  138317. "adcs r5, r5, %[r]\n\t"
  138318. #elif defined(__clang__)
  138319. "adcs r5, %[r]\n\t"
  138320. #else
  138321. "adc r5, %[r]\n\t"
  138322. #endif
  138323. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138324. "lsrs r6, %[a], #16\n\t"
  138325. #else
  138326. "lsr r6, %[a], #16\n\t"
  138327. #endif
  138328. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138329. "lsrs r7, %[b], #16\n\t"
  138330. #else
  138331. "lsr r7, %[b], #16\n\t"
  138332. #endif
  138333. #ifdef WOLFSSL_KEIL
  138334. "muls r7, r6, r7\n\t"
  138335. #elif defined(__clang__)
  138336. "muls r7, r6\n\t"
  138337. #else
  138338. "mul r7, r6\n\t"
  138339. #endif
  138340. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138341. "adds r4, r4, r7\n\t"
  138342. #else
  138343. "add r4, r4, r7\n\t"
  138344. #endif
  138345. #ifdef WOLFSSL_KEIL
  138346. "adcs r5, r5, %[r]\n\t"
  138347. #elif defined(__clang__)
  138348. "adcs r5, %[r]\n\t"
  138349. #else
  138350. "adc r5, %[r]\n\t"
  138351. #endif
  138352. "uxth r7, %[b]\n\t"
  138353. #ifdef WOLFSSL_KEIL
  138354. "muls r6, r7, r6\n\t"
  138355. #elif defined(__clang__)
  138356. "muls r6, r7\n\t"
  138357. #else
  138358. "mul r6, r7\n\t"
  138359. #endif
  138360. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138361. "lsrs r7, r6, #16\n\t"
  138362. #else
  138363. "lsr r7, r6, #16\n\t"
  138364. #endif
  138365. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138366. "lsls r6, r6, #16\n\t"
  138367. #else
  138368. "lsl r6, r6, #16\n\t"
  138369. #endif
  138370. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138371. "adds r3, r3, r6\n\t"
  138372. #else
  138373. "add r3, r3, r6\n\t"
  138374. #endif
  138375. #ifdef WOLFSSL_KEIL
  138376. "adcs r4, r4, r7\n\t"
  138377. #elif defined(__clang__)
  138378. "adcs r4, r7\n\t"
  138379. #else
  138380. "adc r4, r7\n\t"
  138381. #endif
  138382. #ifdef WOLFSSL_KEIL
  138383. "adcs r5, r5, %[r]\n\t"
  138384. #elif defined(__clang__)
  138385. "adcs r5, %[r]\n\t"
  138386. #else
  138387. "adc r5, %[r]\n\t"
  138388. #endif
  138389. "str r3, [sp, #24]\n\t"
  138390. "# A[0] * B[7]\n\t"
  138391. "movs r3, #0\n\t"
  138392. "mov %[a], r9\n\t"
  138393. "mov %[b], r10\n\t"
  138394. "ldr %[a], [%[a]]\n\t"
  138395. "ldr %[b], [%[b], #28]\n\t"
  138396. "uxth r6, %[a]\n\t"
  138397. "uxth r7, %[b]\n\t"
  138398. #ifdef WOLFSSL_KEIL
  138399. "muls r7, r6, r7\n\t"
  138400. #elif defined(__clang__)
  138401. "muls r7, r6\n\t"
  138402. #else
  138403. "mul r7, r6\n\t"
  138404. #endif
  138405. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138406. "adds r4, r4, r7\n\t"
  138407. #else
  138408. "add r4, r4, r7\n\t"
  138409. #endif
  138410. #ifdef WOLFSSL_KEIL
  138411. "adcs r5, r5, %[r]\n\t"
  138412. #elif defined(__clang__)
  138413. "adcs r5, %[r]\n\t"
  138414. #else
  138415. "adc r5, %[r]\n\t"
  138416. #endif
  138417. #ifdef WOLFSSL_KEIL
  138418. "adcs r3, r3, %[r]\n\t"
  138419. #elif defined(__clang__)
  138420. "adcs r3, %[r]\n\t"
  138421. #else
  138422. "adc r3, %[r]\n\t"
  138423. #endif
  138424. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138425. "lsrs r7, %[b], #16\n\t"
  138426. #else
  138427. "lsr r7, %[b], #16\n\t"
  138428. #endif
  138429. #ifdef WOLFSSL_KEIL
  138430. "muls r6, r7, r6\n\t"
  138431. #elif defined(__clang__)
  138432. "muls r6, r7\n\t"
  138433. #else
  138434. "mul r6, r7\n\t"
  138435. #endif
  138436. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138437. "lsrs r7, r6, #16\n\t"
  138438. #else
  138439. "lsr r7, r6, #16\n\t"
  138440. #endif
  138441. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138442. "lsls r6, r6, #16\n\t"
  138443. #else
  138444. "lsl r6, r6, #16\n\t"
  138445. #endif
  138446. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138447. "adds r4, r4, r6\n\t"
  138448. #else
  138449. "add r4, r4, r6\n\t"
  138450. #endif
  138451. #ifdef WOLFSSL_KEIL
  138452. "adcs r5, r5, r7\n\t"
  138453. #elif defined(__clang__)
  138454. "adcs r5, r7\n\t"
  138455. #else
  138456. "adc r5, r7\n\t"
  138457. #endif
  138458. #ifdef WOLFSSL_KEIL
  138459. "adcs r3, r3, %[r]\n\t"
  138460. #elif defined(__clang__)
  138461. "adcs r3, %[r]\n\t"
  138462. #else
  138463. "adc r3, %[r]\n\t"
  138464. #endif
  138465. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138466. "lsrs r6, %[a], #16\n\t"
  138467. #else
  138468. "lsr r6, %[a], #16\n\t"
  138469. #endif
  138470. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138471. "lsrs r7, %[b], #16\n\t"
  138472. #else
  138473. "lsr r7, %[b], #16\n\t"
  138474. #endif
  138475. #ifdef WOLFSSL_KEIL
  138476. "muls r7, r6, r7\n\t"
  138477. #elif defined(__clang__)
  138478. "muls r7, r6\n\t"
  138479. #else
  138480. "mul r7, r6\n\t"
  138481. #endif
  138482. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138483. "adds r5, r5, r7\n\t"
  138484. #else
  138485. "add r5, r5, r7\n\t"
  138486. #endif
  138487. #ifdef WOLFSSL_KEIL
  138488. "adcs r3, r3, %[r]\n\t"
  138489. #elif defined(__clang__)
  138490. "adcs r3, %[r]\n\t"
  138491. #else
  138492. "adc r3, %[r]\n\t"
  138493. #endif
  138494. "uxth r7, %[b]\n\t"
  138495. #ifdef WOLFSSL_KEIL
  138496. "muls r6, r7, r6\n\t"
  138497. #elif defined(__clang__)
  138498. "muls r6, r7\n\t"
  138499. #else
  138500. "mul r6, r7\n\t"
  138501. #endif
  138502. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138503. "lsrs r7, r6, #16\n\t"
  138504. #else
  138505. "lsr r7, r6, #16\n\t"
  138506. #endif
  138507. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138508. "lsls r6, r6, #16\n\t"
  138509. #else
  138510. "lsl r6, r6, #16\n\t"
  138511. #endif
  138512. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138513. "adds r4, r4, r6\n\t"
  138514. #else
  138515. "add r4, r4, r6\n\t"
  138516. #endif
  138517. #ifdef WOLFSSL_KEIL
  138518. "adcs r5, r5, r7\n\t"
  138519. #elif defined(__clang__)
  138520. "adcs r5, r7\n\t"
  138521. #else
  138522. "adc r5, r7\n\t"
  138523. #endif
  138524. #ifdef WOLFSSL_KEIL
  138525. "adcs r3, r3, %[r]\n\t"
  138526. #elif defined(__clang__)
  138527. "adcs r3, %[r]\n\t"
  138528. #else
  138529. "adc r3, %[r]\n\t"
  138530. #endif
  138531. "# A[1] * B[6]\n\t"
  138532. "mov %[a], r9\n\t"
  138533. "mov %[b], r10\n\t"
  138534. "ldr %[a], [%[a], #4]\n\t"
  138535. "ldr %[b], [%[b], #24]\n\t"
  138536. "uxth r6, %[a]\n\t"
  138537. "uxth r7, %[b]\n\t"
  138538. #ifdef WOLFSSL_KEIL
  138539. "muls r7, r6, r7\n\t"
  138540. #elif defined(__clang__)
  138541. "muls r7, r6\n\t"
  138542. #else
  138543. "mul r7, r6\n\t"
  138544. #endif
  138545. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138546. "adds r4, r4, r7\n\t"
  138547. #else
  138548. "add r4, r4, r7\n\t"
  138549. #endif
  138550. #ifdef WOLFSSL_KEIL
  138551. "adcs r5, r5, %[r]\n\t"
  138552. #elif defined(__clang__)
  138553. "adcs r5, %[r]\n\t"
  138554. #else
  138555. "adc r5, %[r]\n\t"
  138556. #endif
  138557. #ifdef WOLFSSL_KEIL
  138558. "adcs r3, r3, %[r]\n\t"
  138559. #elif defined(__clang__)
  138560. "adcs r3, %[r]\n\t"
  138561. #else
  138562. "adc r3, %[r]\n\t"
  138563. #endif
  138564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138565. "lsrs r7, %[b], #16\n\t"
  138566. #else
  138567. "lsr r7, %[b], #16\n\t"
  138568. #endif
  138569. #ifdef WOLFSSL_KEIL
  138570. "muls r6, r7, r6\n\t"
  138571. #elif defined(__clang__)
  138572. "muls r6, r7\n\t"
  138573. #else
  138574. "mul r6, r7\n\t"
  138575. #endif
  138576. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138577. "lsrs r7, r6, #16\n\t"
  138578. #else
  138579. "lsr r7, r6, #16\n\t"
  138580. #endif
  138581. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138582. "lsls r6, r6, #16\n\t"
  138583. #else
  138584. "lsl r6, r6, #16\n\t"
  138585. #endif
  138586. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138587. "adds r4, r4, r6\n\t"
  138588. #else
  138589. "add r4, r4, r6\n\t"
  138590. #endif
  138591. #ifdef WOLFSSL_KEIL
  138592. "adcs r5, r5, r7\n\t"
  138593. #elif defined(__clang__)
  138594. "adcs r5, r7\n\t"
  138595. #else
  138596. "adc r5, r7\n\t"
  138597. #endif
  138598. #ifdef WOLFSSL_KEIL
  138599. "adcs r3, r3, %[r]\n\t"
  138600. #elif defined(__clang__)
  138601. "adcs r3, %[r]\n\t"
  138602. #else
  138603. "adc r3, %[r]\n\t"
  138604. #endif
  138605. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138606. "lsrs r6, %[a], #16\n\t"
  138607. #else
  138608. "lsr r6, %[a], #16\n\t"
  138609. #endif
  138610. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138611. "lsrs r7, %[b], #16\n\t"
  138612. #else
  138613. "lsr r7, %[b], #16\n\t"
  138614. #endif
  138615. #ifdef WOLFSSL_KEIL
  138616. "muls r7, r6, r7\n\t"
  138617. #elif defined(__clang__)
  138618. "muls r7, r6\n\t"
  138619. #else
  138620. "mul r7, r6\n\t"
  138621. #endif
  138622. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138623. "adds r5, r5, r7\n\t"
  138624. #else
  138625. "add r5, r5, r7\n\t"
  138626. #endif
  138627. #ifdef WOLFSSL_KEIL
  138628. "adcs r3, r3, %[r]\n\t"
  138629. #elif defined(__clang__)
  138630. "adcs r3, %[r]\n\t"
  138631. #else
  138632. "adc r3, %[r]\n\t"
  138633. #endif
  138634. "uxth r7, %[b]\n\t"
  138635. #ifdef WOLFSSL_KEIL
  138636. "muls r6, r7, r6\n\t"
  138637. #elif defined(__clang__)
  138638. "muls r6, r7\n\t"
  138639. #else
  138640. "mul r6, r7\n\t"
  138641. #endif
  138642. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138643. "lsrs r7, r6, #16\n\t"
  138644. #else
  138645. "lsr r7, r6, #16\n\t"
  138646. #endif
  138647. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138648. "lsls r6, r6, #16\n\t"
  138649. #else
  138650. "lsl r6, r6, #16\n\t"
  138651. #endif
  138652. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138653. "adds r4, r4, r6\n\t"
  138654. #else
  138655. "add r4, r4, r6\n\t"
  138656. #endif
  138657. #ifdef WOLFSSL_KEIL
  138658. "adcs r5, r5, r7\n\t"
  138659. #elif defined(__clang__)
  138660. "adcs r5, r7\n\t"
  138661. #else
  138662. "adc r5, r7\n\t"
  138663. #endif
  138664. #ifdef WOLFSSL_KEIL
  138665. "adcs r3, r3, %[r]\n\t"
  138666. #elif defined(__clang__)
  138667. "adcs r3, %[r]\n\t"
  138668. #else
  138669. "adc r3, %[r]\n\t"
  138670. #endif
  138671. "# A[2] * B[5]\n\t"
  138672. "mov %[a], r9\n\t"
  138673. "mov %[b], r10\n\t"
  138674. "ldr %[a], [%[a], #8]\n\t"
  138675. "ldr %[b], [%[b], #20]\n\t"
  138676. "uxth r6, %[a]\n\t"
  138677. "uxth r7, %[b]\n\t"
  138678. #ifdef WOLFSSL_KEIL
  138679. "muls r7, r6, r7\n\t"
  138680. #elif defined(__clang__)
  138681. "muls r7, r6\n\t"
  138682. #else
  138683. "mul r7, r6\n\t"
  138684. #endif
  138685. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138686. "adds r4, r4, r7\n\t"
  138687. #else
  138688. "add r4, r4, r7\n\t"
  138689. #endif
  138690. #ifdef WOLFSSL_KEIL
  138691. "adcs r5, r5, %[r]\n\t"
  138692. #elif defined(__clang__)
  138693. "adcs r5, %[r]\n\t"
  138694. #else
  138695. "adc r5, %[r]\n\t"
  138696. #endif
  138697. #ifdef WOLFSSL_KEIL
  138698. "adcs r3, r3, %[r]\n\t"
  138699. #elif defined(__clang__)
  138700. "adcs r3, %[r]\n\t"
  138701. #else
  138702. "adc r3, %[r]\n\t"
  138703. #endif
  138704. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138705. "lsrs r7, %[b], #16\n\t"
  138706. #else
  138707. "lsr r7, %[b], #16\n\t"
  138708. #endif
  138709. #ifdef WOLFSSL_KEIL
  138710. "muls r6, r7, r6\n\t"
  138711. #elif defined(__clang__)
  138712. "muls r6, r7\n\t"
  138713. #else
  138714. "mul r6, r7\n\t"
  138715. #endif
  138716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138717. "lsrs r7, r6, #16\n\t"
  138718. #else
  138719. "lsr r7, r6, #16\n\t"
  138720. #endif
  138721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138722. "lsls r6, r6, #16\n\t"
  138723. #else
  138724. "lsl r6, r6, #16\n\t"
  138725. #endif
  138726. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138727. "adds r4, r4, r6\n\t"
  138728. #else
  138729. "add r4, r4, r6\n\t"
  138730. #endif
  138731. #ifdef WOLFSSL_KEIL
  138732. "adcs r5, r5, r7\n\t"
  138733. #elif defined(__clang__)
  138734. "adcs r5, r7\n\t"
  138735. #else
  138736. "adc r5, r7\n\t"
  138737. #endif
  138738. #ifdef WOLFSSL_KEIL
  138739. "adcs r3, r3, %[r]\n\t"
  138740. #elif defined(__clang__)
  138741. "adcs r3, %[r]\n\t"
  138742. #else
  138743. "adc r3, %[r]\n\t"
  138744. #endif
  138745. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138746. "lsrs r6, %[a], #16\n\t"
  138747. #else
  138748. "lsr r6, %[a], #16\n\t"
  138749. #endif
  138750. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138751. "lsrs r7, %[b], #16\n\t"
  138752. #else
  138753. "lsr r7, %[b], #16\n\t"
  138754. #endif
  138755. #ifdef WOLFSSL_KEIL
  138756. "muls r7, r6, r7\n\t"
  138757. #elif defined(__clang__)
  138758. "muls r7, r6\n\t"
  138759. #else
  138760. "mul r7, r6\n\t"
  138761. #endif
  138762. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138763. "adds r5, r5, r7\n\t"
  138764. #else
  138765. "add r5, r5, r7\n\t"
  138766. #endif
  138767. #ifdef WOLFSSL_KEIL
  138768. "adcs r3, r3, %[r]\n\t"
  138769. #elif defined(__clang__)
  138770. "adcs r3, %[r]\n\t"
  138771. #else
  138772. "adc r3, %[r]\n\t"
  138773. #endif
  138774. "uxth r7, %[b]\n\t"
  138775. #ifdef WOLFSSL_KEIL
  138776. "muls r6, r7, r6\n\t"
  138777. #elif defined(__clang__)
  138778. "muls r6, r7\n\t"
  138779. #else
  138780. "mul r6, r7\n\t"
  138781. #endif
  138782. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138783. "lsrs r7, r6, #16\n\t"
  138784. #else
  138785. "lsr r7, r6, #16\n\t"
  138786. #endif
  138787. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138788. "lsls r6, r6, #16\n\t"
  138789. #else
  138790. "lsl r6, r6, #16\n\t"
  138791. #endif
  138792. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138793. "adds r4, r4, r6\n\t"
  138794. #else
  138795. "add r4, r4, r6\n\t"
  138796. #endif
  138797. #ifdef WOLFSSL_KEIL
  138798. "adcs r5, r5, r7\n\t"
  138799. #elif defined(__clang__)
  138800. "adcs r5, r7\n\t"
  138801. #else
  138802. "adc r5, r7\n\t"
  138803. #endif
  138804. #ifdef WOLFSSL_KEIL
  138805. "adcs r3, r3, %[r]\n\t"
  138806. #elif defined(__clang__)
  138807. "adcs r3, %[r]\n\t"
  138808. #else
  138809. "adc r3, %[r]\n\t"
  138810. #endif
  138811. "# A[3] * B[4]\n\t"
  138812. "mov %[a], r9\n\t"
  138813. "mov %[b], r10\n\t"
  138814. "ldr %[a], [%[a], #12]\n\t"
  138815. "ldr %[b], [%[b], #16]\n\t"
  138816. "uxth r6, %[a]\n\t"
  138817. "uxth r7, %[b]\n\t"
  138818. #ifdef WOLFSSL_KEIL
  138819. "muls r7, r6, r7\n\t"
  138820. #elif defined(__clang__)
  138821. "muls r7, r6\n\t"
  138822. #else
  138823. "mul r7, r6\n\t"
  138824. #endif
  138825. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138826. "adds r4, r4, r7\n\t"
  138827. #else
  138828. "add r4, r4, r7\n\t"
  138829. #endif
  138830. #ifdef WOLFSSL_KEIL
  138831. "adcs r5, r5, %[r]\n\t"
  138832. #elif defined(__clang__)
  138833. "adcs r5, %[r]\n\t"
  138834. #else
  138835. "adc r5, %[r]\n\t"
  138836. #endif
  138837. #ifdef WOLFSSL_KEIL
  138838. "adcs r3, r3, %[r]\n\t"
  138839. #elif defined(__clang__)
  138840. "adcs r3, %[r]\n\t"
  138841. #else
  138842. "adc r3, %[r]\n\t"
  138843. #endif
  138844. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138845. "lsrs r7, %[b], #16\n\t"
  138846. #else
  138847. "lsr r7, %[b], #16\n\t"
  138848. #endif
  138849. #ifdef WOLFSSL_KEIL
  138850. "muls r6, r7, r6\n\t"
  138851. #elif defined(__clang__)
  138852. "muls r6, r7\n\t"
  138853. #else
  138854. "mul r6, r7\n\t"
  138855. #endif
  138856. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138857. "lsrs r7, r6, #16\n\t"
  138858. #else
  138859. "lsr r7, r6, #16\n\t"
  138860. #endif
  138861. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138862. "lsls r6, r6, #16\n\t"
  138863. #else
  138864. "lsl r6, r6, #16\n\t"
  138865. #endif
  138866. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138867. "adds r4, r4, r6\n\t"
  138868. #else
  138869. "add r4, r4, r6\n\t"
  138870. #endif
  138871. #ifdef WOLFSSL_KEIL
  138872. "adcs r5, r5, r7\n\t"
  138873. #elif defined(__clang__)
  138874. "adcs r5, r7\n\t"
  138875. #else
  138876. "adc r5, r7\n\t"
  138877. #endif
  138878. #ifdef WOLFSSL_KEIL
  138879. "adcs r3, r3, %[r]\n\t"
  138880. #elif defined(__clang__)
  138881. "adcs r3, %[r]\n\t"
  138882. #else
  138883. "adc r3, %[r]\n\t"
  138884. #endif
  138885. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138886. "lsrs r6, %[a], #16\n\t"
  138887. #else
  138888. "lsr r6, %[a], #16\n\t"
  138889. #endif
  138890. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138891. "lsrs r7, %[b], #16\n\t"
  138892. #else
  138893. "lsr r7, %[b], #16\n\t"
  138894. #endif
  138895. #ifdef WOLFSSL_KEIL
  138896. "muls r7, r6, r7\n\t"
  138897. #elif defined(__clang__)
  138898. "muls r7, r6\n\t"
  138899. #else
  138900. "mul r7, r6\n\t"
  138901. #endif
  138902. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138903. "adds r5, r5, r7\n\t"
  138904. #else
  138905. "add r5, r5, r7\n\t"
  138906. #endif
  138907. #ifdef WOLFSSL_KEIL
  138908. "adcs r3, r3, %[r]\n\t"
  138909. #elif defined(__clang__)
  138910. "adcs r3, %[r]\n\t"
  138911. #else
  138912. "adc r3, %[r]\n\t"
  138913. #endif
  138914. "uxth r7, %[b]\n\t"
  138915. #ifdef WOLFSSL_KEIL
  138916. "muls r6, r7, r6\n\t"
  138917. #elif defined(__clang__)
  138918. "muls r6, r7\n\t"
  138919. #else
  138920. "mul r6, r7\n\t"
  138921. #endif
  138922. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138923. "lsrs r7, r6, #16\n\t"
  138924. #else
  138925. "lsr r7, r6, #16\n\t"
  138926. #endif
  138927. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138928. "lsls r6, r6, #16\n\t"
  138929. #else
  138930. "lsl r6, r6, #16\n\t"
  138931. #endif
  138932. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138933. "adds r4, r4, r6\n\t"
  138934. #else
  138935. "add r4, r4, r6\n\t"
  138936. #endif
  138937. #ifdef WOLFSSL_KEIL
  138938. "adcs r5, r5, r7\n\t"
  138939. #elif defined(__clang__)
  138940. "adcs r5, r7\n\t"
  138941. #else
  138942. "adc r5, r7\n\t"
  138943. #endif
  138944. #ifdef WOLFSSL_KEIL
  138945. "adcs r3, r3, %[r]\n\t"
  138946. #elif defined(__clang__)
  138947. "adcs r3, %[r]\n\t"
  138948. #else
  138949. "adc r3, %[r]\n\t"
  138950. #endif
  138951. "# A[4] * B[3]\n\t"
  138952. "mov %[a], r9\n\t"
  138953. "mov %[b], r10\n\t"
  138954. "ldr %[a], [%[a], #16]\n\t"
  138955. "ldr %[b], [%[b], #12]\n\t"
  138956. "uxth r6, %[a]\n\t"
  138957. "uxth r7, %[b]\n\t"
  138958. #ifdef WOLFSSL_KEIL
  138959. "muls r7, r6, r7\n\t"
  138960. #elif defined(__clang__)
  138961. "muls r7, r6\n\t"
  138962. #else
  138963. "mul r7, r6\n\t"
  138964. #endif
  138965. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138966. "adds r4, r4, r7\n\t"
  138967. #else
  138968. "add r4, r4, r7\n\t"
  138969. #endif
  138970. #ifdef WOLFSSL_KEIL
  138971. "adcs r5, r5, %[r]\n\t"
  138972. #elif defined(__clang__)
  138973. "adcs r5, %[r]\n\t"
  138974. #else
  138975. "adc r5, %[r]\n\t"
  138976. #endif
  138977. #ifdef WOLFSSL_KEIL
  138978. "adcs r3, r3, %[r]\n\t"
  138979. #elif defined(__clang__)
  138980. "adcs r3, %[r]\n\t"
  138981. #else
  138982. "adc r3, %[r]\n\t"
  138983. #endif
  138984. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138985. "lsrs r7, %[b], #16\n\t"
  138986. #else
  138987. "lsr r7, %[b], #16\n\t"
  138988. #endif
  138989. #ifdef WOLFSSL_KEIL
  138990. "muls r6, r7, r6\n\t"
  138991. #elif defined(__clang__)
  138992. "muls r6, r7\n\t"
  138993. #else
  138994. "mul r6, r7\n\t"
  138995. #endif
  138996. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138997. "lsrs r7, r6, #16\n\t"
  138998. #else
  138999. "lsr r7, r6, #16\n\t"
  139000. #endif
  139001. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139002. "lsls r6, r6, #16\n\t"
  139003. #else
  139004. "lsl r6, r6, #16\n\t"
  139005. #endif
  139006. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139007. "adds r4, r4, r6\n\t"
  139008. #else
  139009. "add r4, r4, r6\n\t"
  139010. #endif
  139011. #ifdef WOLFSSL_KEIL
  139012. "adcs r5, r5, r7\n\t"
  139013. #elif defined(__clang__)
  139014. "adcs r5, r7\n\t"
  139015. #else
  139016. "adc r5, r7\n\t"
  139017. #endif
  139018. #ifdef WOLFSSL_KEIL
  139019. "adcs r3, r3, %[r]\n\t"
  139020. #elif defined(__clang__)
  139021. "adcs r3, %[r]\n\t"
  139022. #else
  139023. "adc r3, %[r]\n\t"
  139024. #endif
  139025. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139026. "lsrs r6, %[a], #16\n\t"
  139027. #else
  139028. "lsr r6, %[a], #16\n\t"
  139029. #endif
  139030. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139031. "lsrs r7, %[b], #16\n\t"
  139032. #else
  139033. "lsr r7, %[b], #16\n\t"
  139034. #endif
  139035. #ifdef WOLFSSL_KEIL
  139036. "muls r7, r6, r7\n\t"
  139037. #elif defined(__clang__)
  139038. "muls r7, r6\n\t"
  139039. #else
  139040. "mul r7, r6\n\t"
  139041. #endif
  139042. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139043. "adds r5, r5, r7\n\t"
  139044. #else
  139045. "add r5, r5, r7\n\t"
  139046. #endif
  139047. #ifdef WOLFSSL_KEIL
  139048. "adcs r3, r3, %[r]\n\t"
  139049. #elif defined(__clang__)
  139050. "adcs r3, %[r]\n\t"
  139051. #else
  139052. "adc r3, %[r]\n\t"
  139053. #endif
  139054. "uxth r7, %[b]\n\t"
  139055. #ifdef WOLFSSL_KEIL
  139056. "muls r6, r7, r6\n\t"
  139057. #elif defined(__clang__)
  139058. "muls r6, r7\n\t"
  139059. #else
  139060. "mul r6, r7\n\t"
  139061. #endif
  139062. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139063. "lsrs r7, r6, #16\n\t"
  139064. #else
  139065. "lsr r7, r6, #16\n\t"
  139066. #endif
  139067. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139068. "lsls r6, r6, #16\n\t"
  139069. #else
  139070. "lsl r6, r6, #16\n\t"
  139071. #endif
  139072. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139073. "adds r4, r4, r6\n\t"
  139074. #else
  139075. "add r4, r4, r6\n\t"
  139076. #endif
  139077. #ifdef WOLFSSL_KEIL
  139078. "adcs r5, r5, r7\n\t"
  139079. #elif defined(__clang__)
  139080. "adcs r5, r7\n\t"
  139081. #else
  139082. "adc r5, r7\n\t"
  139083. #endif
  139084. #ifdef WOLFSSL_KEIL
  139085. "adcs r3, r3, %[r]\n\t"
  139086. #elif defined(__clang__)
  139087. "adcs r3, %[r]\n\t"
  139088. #else
  139089. "adc r3, %[r]\n\t"
  139090. #endif
  139091. "# A[5] * B[2]\n\t"
  139092. "mov %[a], r9\n\t"
  139093. "mov %[b], r10\n\t"
  139094. "ldr %[a], [%[a], #20]\n\t"
  139095. "ldr %[b], [%[b], #8]\n\t"
  139096. "uxth r6, %[a]\n\t"
  139097. "uxth r7, %[b]\n\t"
  139098. #ifdef WOLFSSL_KEIL
  139099. "muls r7, r6, r7\n\t"
  139100. #elif defined(__clang__)
  139101. "muls r7, r6\n\t"
  139102. #else
  139103. "mul r7, r6\n\t"
  139104. #endif
  139105. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139106. "adds r4, r4, r7\n\t"
  139107. #else
  139108. "add r4, r4, r7\n\t"
  139109. #endif
  139110. #ifdef WOLFSSL_KEIL
  139111. "adcs r5, r5, %[r]\n\t"
  139112. #elif defined(__clang__)
  139113. "adcs r5, %[r]\n\t"
  139114. #else
  139115. "adc r5, %[r]\n\t"
  139116. #endif
  139117. #ifdef WOLFSSL_KEIL
  139118. "adcs r3, r3, %[r]\n\t"
  139119. #elif defined(__clang__)
  139120. "adcs r3, %[r]\n\t"
  139121. #else
  139122. "adc r3, %[r]\n\t"
  139123. #endif
  139124. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139125. "lsrs r7, %[b], #16\n\t"
  139126. #else
  139127. "lsr r7, %[b], #16\n\t"
  139128. #endif
  139129. #ifdef WOLFSSL_KEIL
  139130. "muls r6, r7, r6\n\t"
  139131. #elif defined(__clang__)
  139132. "muls r6, r7\n\t"
  139133. #else
  139134. "mul r6, r7\n\t"
  139135. #endif
  139136. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139137. "lsrs r7, r6, #16\n\t"
  139138. #else
  139139. "lsr r7, r6, #16\n\t"
  139140. #endif
  139141. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139142. "lsls r6, r6, #16\n\t"
  139143. #else
  139144. "lsl r6, r6, #16\n\t"
  139145. #endif
  139146. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139147. "adds r4, r4, r6\n\t"
  139148. #else
  139149. "add r4, r4, r6\n\t"
  139150. #endif
  139151. #ifdef WOLFSSL_KEIL
  139152. "adcs r5, r5, r7\n\t"
  139153. #elif defined(__clang__)
  139154. "adcs r5, r7\n\t"
  139155. #else
  139156. "adc r5, r7\n\t"
  139157. #endif
  139158. #ifdef WOLFSSL_KEIL
  139159. "adcs r3, r3, %[r]\n\t"
  139160. #elif defined(__clang__)
  139161. "adcs r3, %[r]\n\t"
  139162. #else
  139163. "adc r3, %[r]\n\t"
  139164. #endif
  139165. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139166. "lsrs r6, %[a], #16\n\t"
  139167. #else
  139168. "lsr r6, %[a], #16\n\t"
  139169. #endif
  139170. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139171. "lsrs r7, %[b], #16\n\t"
  139172. #else
  139173. "lsr r7, %[b], #16\n\t"
  139174. #endif
  139175. #ifdef WOLFSSL_KEIL
  139176. "muls r7, r6, r7\n\t"
  139177. #elif defined(__clang__)
  139178. "muls r7, r6\n\t"
  139179. #else
  139180. "mul r7, r6\n\t"
  139181. #endif
  139182. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139183. "adds r5, r5, r7\n\t"
  139184. #else
  139185. "add r5, r5, r7\n\t"
  139186. #endif
  139187. #ifdef WOLFSSL_KEIL
  139188. "adcs r3, r3, %[r]\n\t"
  139189. #elif defined(__clang__)
  139190. "adcs r3, %[r]\n\t"
  139191. #else
  139192. "adc r3, %[r]\n\t"
  139193. #endif
  139194. "uxth r7, %[b]\n\t"
  139195. #ifdef WOLFSSL_KEIL
  139196. "muls r6, r7, r6\n\t"
  139197. #elif defined(__clang__)
  139198. "muls r6, r7\n\t"
  139199. #else
  139200. "mul r6, r7\n\t"
  139201. #endif
  139202. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139203. "lsrs r7, r6, #16\n\t"
  139204. #else
  139205. "lsr r7, r6, #16\n\t"
  139206. #endif
  139207. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139208. "lsls r6, r6, #16\n\t"
  139209. #else
  139210. "lsl r6, r6, #16\n\t"
  139211. #endif
  139212. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139213. "adds r4, r4, r6\n\t"
  139214. #else
  139215. "add r4, r4, r6\n\t"
  139216. #endif
  139217. #ifdef WOLFSSL_KEIL
  139218. "adcs r5, r5, r7\n\t"
  139219. #elif defined(__clang__)
  139220. "adcs r5, r7\n\t"
  139221. #else
  139222. "adc r5, r7\n\t"
  139223. #endif
  139224. #ifdef WOLFSSL_KEIL
  139225. "adcs r3, r3, %[r]\n\t"
  139226. #elif defined(__clang__)
  139227. "adcs r3, %[r]\n\t"
  139228. #else
  139229. "adc r3, %[r]\n\t"
  139230. #endif
  139231. "# A[6] * B[1]\n\t"
  139232. "mov %[a], r9\n\t"
  139233. "mov %[b], r10\n\t"
  139234. "ldr %[a], [%[a], #24]\n\t"
  139235. "ldr %[b], [%[b], #4]\n\t"
  139236. "uxth r6, %[a]\n\t"
  139237. "uxth r7, %[b]\n\t"
  139238. #ifdef WOLFSSL_KEIL
  139239. "muls r7, r6, r7\n\t"
  139240. #elif defined(__clang__)
  139241. "muls r7, r6\n\t"
  139242. #else
  139243. "mul r7, r6\n\t"
  139244. #endif
  139245. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139246. "adds r4, r4, r7\n\t"
  139247. #else
  139248. "add r4, r4, r7\n\t"
  139249. #endif
  139250. #ifdef WOLFSSL_KEIL
  139251. "adcs r5, r5, %[r]\n\t"
  139252. #elif defined(__clang__)
  139253. "adcs r5, %[r]\n\t"
  139254. #else
  139255. "adc r5, %[r]\n\t"
  139256. #endif
  139257. #ifdef WOLFSSL_KEIL
  139258. "adcs r3, r3, %[r]\n\t"
  139259. #elif defined(__clang__)
  139260. "adcs r3, %[r]\n\t"
  139261. #else
  139262. "adc r3, %[r]\n\t"
  139263. #endif
  139264. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139265. "lsrs r7, %[b], #16\n\t"
  139266. #else
  139267. "lsr r7, %[b], #16\n\t"
  139268. #endif
  139269. #ifdef WOLFSSL_KEIL
  139270. "muls r6, r7, r6\n\t"
  139271. #elif defined(__clang__)
  139272. "muls r6, r7\n\t"
  139273. #else
  139274. "mul r6, r7\n\t"
  139275. #endif
  139276. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139277. "lsrs r7, r6, #16\n\t"
  139278. #else
  139279. "lsr r7, r6, #16\n\t"
  139280. #endif
  139281. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139282. "lsls r6, r6, #16\n\t"
  139283. #else
  139284. "lsl r6, r6, #16\n\t"
  139285. #endif
  139286. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139287. "adds r4, r4, r6\n\t"
  139288. #else
  139289. "add r4, r4, r6\n\t"
  139290. #endif
  139291. #ifdef WOLFSSL_KEIL
  139292. "adcs r5, r5, r7\n\t"
  139293. #elif defined(__clang__)
  139294. "adcs r5, r7\n\t"
  139295. #else
  139296. "adc r5, r7\n\t"
  139297. #endif
  139298. #ifdef WOLFSSL_KEIL
  139299. "adcs r3, r3, %[r]\n\t"
  139300. #elif defined(__clang__)
  139301. "adcs r3, %[r]\n\t"
  139302. #else
  139303. "adc r3, %[r]\n\t"
  139304. #endif
  139305. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139306. "lsrs r6, %[a], #16\n\t"
  139307. #else
  139308. "lsr r6, %[a], #16\n\t"
  139309. #endif
  139310. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139311. "lsrs r7, %[b], #16\n\t"
  139312. #else
  139313. "lsr r7, %[b], #16\n\t"
  139314. #endif
  139315. #ifdef WOLFSSL_KEIL
  139316. "muls r7, r6, r7\n\t"
  139317. #elif defined(__clang__)
  139318. "muls r7, r6\n\t"
  139319. #else
  139320. "mul r7, r6\n\t"
  139321. #endif
  139322. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139323. "adds r5, r5, r7\n\t"
  139324. #else
  139325. "add r5, r5, r7\n\t"
  139326. #endif
  139327. #ifdef WOLFSSL_KEIL
  139328. "adcs r3, r3, %[r]\n\t"
  139329. #elif defined(__clang__)
  139330. "adcs r3, %[r]\n\t"
  139331. #else
  139332. "adc r3, %[r]\n\t"
  139333. #endif
  139334. "uxth r7, %[b]\n\t"
  139335. #ifdef WOLFSSL_KEIL
  139336. "muls r6, r7, r6\n\t"
  139337. #elif defined(__clang__)
  139338. "muls r6, r7\n\t"
  139339. #else
  139340. "mul r6, r7\n\t"
  139341. #endif
  139342. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139343. "lsrs r7, r6, #16\n\t"
  139344. #else
  139345. "lsr r7, r6, #16\n\t"
  139346. #endif
  139347. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139348. "lsls r6, r6, #16\n\t"
  139349. #else
  139350. "lsl r6, r6, #16\n\t"
  139351. #endif
  139352. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139353. "adds r4, r4, r6\n\t"
  139354. #else
  139355. "add r4, r4, r6\n\t"
  139356. #endif
  139357. #ifdef WOLFSSL_KEIL
  139358. "adcs r5, r5, r7\n\t"
  139359. #elif defined(__clang__)
  139360. "adcs r5, r7\n\t"
  139361. #else
  139362. "adc r5, r7\n\t"
  139363. #endif
  139364. #ifdef WOLFSSL_KEIL
  139365. "adcs r3, r3, %[r]\n\t"
  139366. #elif defined(__clang__)
  139367. "adcs r3, %[r]\n\t"
  139368. #else
  139369. "adc r3, %[r]\n\t"
  139370. #endif
  139371. "# A[7] * B[0]\n\t"
  139372. "mov %[a], r9\n\t"
  139373. "mov %[b], r10\n\t"
  139374. "ldr %[a], [%[a], #28]\n\t"
  139375. "ldr %[b], [%[b]]\n\t"
  139376. "uxth r6, %[a]\n\t"
  139377. "uxth r7, %[b]\n\t"
  139378. #ifdef WOLFSSL_KEIL
  139379. "muls r7, r6, r7\n\t"
  139380. #elif defined(__clang__)
  139381. "muls r7, r6\n\t"
  139382. #else
  139383. "mul r7, r6\n\t"
  139384. #endif
  139385. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139386. "adds r4, r4, r7\n\t"
  139387. #else
  139388. "add r4, r4, r7\n\t"
  139389. #endif
  139390. #ifdef WOLFSSL_KEIL
  139391. "adcs r5, r5, %[r]\n\t"
  139392. #elif defined(__clang__)
  139393. "adcs r5, %[r]\n\t"
  139394. #else
  139395. "adc r5, %[r]\n\t"
  139396. #endif
  139397. #ifdef WOLFSSL_KEIL
  139398. "adcs r3, r3, %[r]\n\t"
  139399. #elif defined(__clang__)
  139400. "adcs r3, %[r]\n\t"
  139401. #else
  139402. "adc r3, %[r]\n\t"
  139403. #endif
  139404. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139405. "lsrs r7, %[b], #16\n\t"
  139406. #else
  139407. "lsr r7, %[b], #16\n\t"
  139408. #endif
  139409. #ifdef WOLFSSL_KEIL
  139410. "muls r6, r7, r6\n\t"
  139411. #elif defined(__clang__)
  139412. "muls r6, r7\n\t"
  139413. #else
  139414. "mul r6, r7\n\t"
  139415. #endif
  139416. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139417. "lsrs r7, r6, #16\n\t"
  139418. #else
  139419. "lsr r7, r6, #16\n\t"
  139420. #endif
  139421. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139422. "lsls r6, r6, #16\n\t"
  139423. #else
  139424. "lsl r6, r6, #16\n\t"
  139425. #endif
  139426. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139427. "adds r4, r4, r6\n\t"
  139428. #else
  139429. "add r4, r4, r6\n\t"
  139430. #endif
  139431. #ifdef WOLFSSL_KEIL
  139432. "adcs r5, r5, r7\n\t"
  139433. #elif defined(__clang__)
  139434. "adcs r5, r7\n\t"
  139435. #else
  139436. "adc r5, r7\n\t"
  139437. #endif
  139438. #ifdef WOLFSSL_KEIL
  139439. "adcs r3, r3, %[r]\n\t"
  139440. #elif defined(__clang__)
  139441. "adcs r3, %[r]\n\t"
  139442. #else
  139443. "adc r3, %[r]\n\t"
  139444. #endif
  139445. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139446. "lsrs r6, %[a], #16\n\t"
  139447. #else
  139448. "lsr r6, %[a], #16\n\t"
  139449. #endif
  139450. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139451. "lsrs r7, %[b], #16\n\t"
  139452. #else
  139453. "lsr r7, %[b], #16\n\t"
  139454. #endif
  139455. #ifdef WOLFSSL_KEIL
  139456. "muls r7, r6, r7\n\t"
  139457. #elif defined(__clang__)
  139458. "muls r7, r6\n\t"
  139459. #else
  139460. "mul r7, r6\n\t"
  139461. #endif
  139462. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139463. "adds r5, r5, r7\n\t"
  139464. #else
  139465. "add r5, r5, r7\n\t"
  139466. #endif
  139467. #ifdef WOLFSSL_KEIL
  139468. "adcs r3, r3, %[r]\n\t"
  139469. #elif defined(__clang__)
  139470. "adcs r3, %[r]\n\t"
  139471. #else
  139472. "adc r3, %[r]\n\t"
  139473. #endif
  139474. "uxth r7, %[b]\n\t"
  139475. #ifdef WOLFSSL_KEIL
  139476. "muls r6, r7, r6\n\t"
  139477. #elif defined(__clang__)
  139478. "muls r6, r7\n\t"
  139479. #else
  139480. "mul r6, r7\n\t"
  139481. #endif
  139482. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139483. "lsrs r7, r6, #16\n\t"
  139484. #else
  139485. "lsr r7, r6, #16\n\t"
  139486. #endif
  139487. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139488. "lsls r6, r6, #16\n\t"
  139489. #else
  139490. "lsl r6, r6, #16\n\t"
  139491. #endif
  139492. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139493. "adds r4, r4, r6\n\t"
  139494. #else
  139495. "add r4, r4, r6\n\t"
  139496. #endif
  139497. #ifdef WOLFSSL_KEIL
  139498. "adcs r5, r5, r7\n\t"
  139499. #elif defined(__clang__)
  139500. "adcs r5, r7\n\t"
  139501. #else
  139502. "adc r5, r7\n\t"
  139503. #endif
  139504. #ifdef WOLFSSL_KEIL
  139505. "adcs r3, r3, %[r]\n\t"
  139506. #elif defined(__clang__)
  139507. "adcs r3, %[r]\n\t"
  139508. #else
  139509. "adc r3, %[r]\n\t"
  139510. #endif
  139511. "str r4, [sp, #28]\n\t"
  139512. "# A[8] * B[0]\n\t"
  139513. "movs r4, #0\n\t"
  139514. "mov %[a], r9\n\t"
  139515. "mov %[b], r10\n\t"
  139516. "ldr %[a], [%[a], #32]\n\t"
  139517. "ldr %[b], [%[b]]\n\t"
  139518. "uxth r6, %[a]\n\t"
  139519. "uxth r7, %[b]\n\t"
  139520. #ifdef WOLFSSL_KEIL
  139521. "muls r7, r6, r7\n\t"
  139522. #elif defined(__clang__)
  139523. "muls r7, r6\n\t"
  139524. #else
  139525. "mul r7, r6\n\t"
  139526. #endif
  139527. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139528. "adds r5, r5, r7\n\t"
  139529. #else
  139530. "add r5, r5, r7\n\t"
  139531. #endif
  139532. #ifdef WOLFSSL_KEIL
  139533. "adcs r3, r3, %[r]\n\t"
  139534. #elif defined(__clang__)
  139535. "adcs r3, %[r]\n\t"
  139536. #else
  139537. "adc r3, %[r]\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. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139547. "lsrs r7, %[b], #16\n\t"
  139548. #else
  139549. "lsr r7, %[b], #16\n\t"
  139550. #endif
  139551. #ifdef WOLFSSL_KEIL
  139552. "muls r6, r7, r6\n\t"
  139553. #elif defined(__clang__)
  139554. "muls r6, r7\n\t"
  139555. #else
  139556. "mul r6, r7\n\t"
  139557. #endif
  139558. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139559. "lsrs r7, r6, #16\n\t"
  139560. #else
  139561. "lsr r7, r6, #16\n\t"
  139562. #endif
  139563. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139564. "lsls r6, r6, #16\n\t"
  139565. #else
  139566. "lsl r6, r6, #16\n\t"
  139567. #endif
  139568. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139569. "adds r5, r5, r6\n\t"
  139570. #else
  139571. "add r5, r5, r6\n\t"
  139572. #endif
  139573. #ifdef WOLFSSL_KEIL
  139574. "adcs r3, r3, r7\n\t"
  139575. #elif defined(__clang__)
  139576. "adcs r3, r7\n\t"
  139577. #else
  139578. "adc r3, r7\n\t"
  139579. #endif
  139580. #ifdef WOLFSSL_KEIL
  139581. "adcs r4, r4, %[r]\n\t"
  139582. #elif defined(__clang__)
  139583. "adcs r4, %[r]\n\t"
  139584. #else
  139585. "adc r4, %[r]\n\t"
  139586. #endif
  139587. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139588. "lsrs r6, %[a], #16\n\t"
  139589. #else
  139590. "lsr r6, %[a], #16\n\t"
  139591. #endif
  139592. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139593. "lsrs r7, %[b], #16\n\t"
  139594. #else
  139595. "lsr r7, %[b], #16\n\t"
  139596. #endif
  139597. #ifdef WOLFSSL_KEIL
  139598. "muls r7, r6, r7\n\t"
  139599. #elif defined(__clang__)
  139600. "muls r7, r6\n\t"
  139601. #else
  139602. "mul r7, r6\n\t"
  139603. #endif
  139604. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139605. "adds r3, r3, r7\n\t"
  139606. #else
  139607. "add r3, r3, r7\n\t"
  139608. #endif
  139609. #ifdef WOLFSSL_KEIL
  139610. "adcs r4, r4, %[r]\n\t"
  139611. #elif defined(__clang__)
  139612. "adcs r4, %[r]\n\t"
  139613. #else
  139614. "adc r4, %[r]\n\t"
  139615. #endif
  139616. "uxth r7, %[b]\n\t"
  139617. #ifdef WOLFSSL_KEIL
  139618. "muls r6, r7, r6\n\t"
  139619. #elif defined(__clang__)
  139620. "muls r6, r7\n\t"
  139621. #else
  139622. "mul r6, r7\n\t"
  139623. #endif
  139624. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139625. "lsrs r7, r6, #16\n\t"
  139626. #else
  139627. "lsr r7, r6, #16\n\t"
  139628. #endif
  139629. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139630. "lsls r6, r6, #16\n\t"
  139631. #else
  139632. "lsl r6, r6, #16\n\t"
  139633. #endif
  139634. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139635. "adds r5, r5, r6\n\t"
  139636. #else
  139637. "add r5, r5, r6\n\t"
  139638. #endif
  139639. #ifdef WOLFSSL_KEIL
  139640. "adcs r3, r3, r7\n\t"
  139641. #elif defined(__clang__)
  139642. "adcs r3, r7\n\t"
  139643. #else
  139644. "adc r3, r7\n\t"
  139645. #endif
  139646. #ifdef WOLFSSL_KEIL
  139647. "adcs r4, r4, %[r]\n\t"
  139648. #elif defined(__clang__)
  139649. "adcs r4, %[r]\n\t"
  139650. #else
  139651. "adc r4, %[r]\n\t"
  139652. #endif
  139653. "# A[7] * B[1]\n\t"
  139654. "mov %[a], r9\n\t"
  139655. "mov %[b], r10\n\t"
  139656. "ldr %[a], [%[a], #28]\n\t"
  139657. "ldr %[b], [%[b], #4]\n\t"
  139658. "uxth r6, %[a]\n\t"
  139659. "uxth r7, %[b]\n\t"
  139660. #ifdef WOLFSSL_KEIL
  139661. "muls r7, r6, r7\n\t"
  139662. #elif defined(__clang__)
  139663. "muls r7, r6\n\t"
  139664. #else
  139665. "mul r7, r6\n\t"
  139666. #endif
  139667. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139668. "adds r5, r5, r7\n\t"
  139669. #else
  139670. "add r5, r5, r7\n\t"
  139671. #endif
  139672. #ifdef WOLFSSL_KEIL
  139673. "adcs r3, r3, %[r]\n\t"
  139674. #elif defined(__clang__)
  139675. "adcs r3, %[r]\n\t"
  139676. #else
  139677. "adc r3, %[r]\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. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139687. "lsrs r7, %[b], #16\n\t"
  139688. #else
  139689. "lsr r7, %[b], #16\n\t"
  139690. #endif
  139691. #ifdef WOLFSSL_KEIL
  139692. "muls r6, r7, r6\n\t"
  139693. #elif defined(__clang__)
  139694. "muls r6, r7\n\t"
  139695. #else
  139696. "mul r6, r7\n\t"
  139697. #endif
  139698. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139699. "lsrs r7, r6, #16\n\t"
  139700. #else
  139701. "lsr r7, r6, #16\n\t"
  139702. #endif
  139703. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139704. "lsls r6, r6, #16\n\t"
  139705. #else
  139706. "lsl r6, r6, #16\n\t"
  139707. #endif
  139708. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139709. "adds r5, r5, r6\n\t"
  139710. #else
  139711. "add r5, r5, r6\n\t"
  139712. #endif
  139713. #ifdef WOLFSSL_KEIL
  139714. "adcs r3, r3, r7\n\t"
  139715. #elif defined(__clang__)
  139716. "adcs r3, r7\n\t"
  139717. #else
  139718. "adc r3, r7\n\t"
  139719. #endif
  139720. #ifdef WOLFSSL_KEIL
  139721. "adcs r4, r4, %[r]\n\t"
  139722. #elif defined(__clang__)
  139723. "adcs r4, %[r]\n\t"
  139724. #else
  139725. "adc r4, %[r]\n\t"
  139726. #endif
  139727. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139728. "lsrs r6, %[a], #16\n\t"
  139729. #else
  139730. "lsr r6, %[a], #16\n\t"
  139731. #endif
  139732. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139733. "lsrs r7, %[b], #16\n\t"
  139734. #else
  139735. "lsr r7, %[b], #16\n\t"
  139736. #endif
  139737. #ifdef WOLFSSL_KEIL
  139738. "muls r7, r6, r7\n\t"
  139739. #elif defined(__clang__)
  139740. "muls r7, r6\n\t"
  139741. #else
  139742. "mul r7, r6\n\t"
  139743. #endif
  139744. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139745. "adds r3, r3, r7\n\t"
  139746. #else
  139747. "add r3, r3, r7\n\t"
  139748. #endif
  139749. #ifdef WOLFSSL_KEIL
  139750. "adcs r4, r4, %[r]\n\t"
  139751. #elif defined(__clang__)
  139752. "adcs r4, %[r]\n\t"
  139753. #else
  139754. "adc r4, %[r]\n\t"
  139755. #endif
  139756. "uxth r7, %[b]\n\t"
  139757. #ifdef WOLFSSL_KEIL
  139758. "muls r6, r7, r6\n\t"
  139759. #elif defined(__clang__)
  139760. "muls r6, r7\n\t"
  139761. #else
  139762. "mul r6, r7\n\t"
  139763. #endif
  139764. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139765. "lsrs r7, r6, #16\n\t"
  139766. #else
  139767. "lsr r7, r6, #16\n\t"
  139768. #endif
  139769. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139770. "lsls r6, r6, #16\n\t"
  139771. #else
  139772. "lsl r6, r6, #16\n\t"
  139773. #endif
  139774. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139775. "adds r5, r5, r6\n\t"
  139776. #else
  139777. "add r5, r5, r6\n\t"
  139778. #endif
  139779. #ifdef WOLFSSL_KEIL
  139780. "adcs r3, r3, r7\n\t"
  139781. #elif defined(__clang__)
  139782. "adcs r3, r7\n\t"
  139783. #else
  139784. "adc r3, r7\n\t"
  139785. #endif
  139786. #ifdef WOLFSSL_KEIL
  139787. "adcs r4, r4, %[r]\n\t"
  139788. #elif defined(__clang__)
  139789. "adcs r4, %[r]\n\t"
  139790. #else
  139791. "adc r4, %[r]\n\t"
  139792. #endif
  139793. "# A[6] * B[2]\n\t"
  139794. "mov %[a], r9\n\t"
  139795. "mov %[b], r10\n\t"
  139796. "ldr %[a], [%[a], #24]\n\t"
  139797. "ldr %[b], [%[b], #8]\n\t"
  139798. "uxth r6, %[a]\n\t"
  139799. "uxth r7, %[b]\n\t"
  139800. #ifdef WOLFSSL_KEIL
  139801. "muls r7, r6, r7\n\t"
  139802. #elif defined(__clang__)
  139803. "muls r7, r6\n\t"
  139804. #else
  139805. "mul r7, r6\n\t"
  139806. #endif
  139807. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139808. "adds r5, r5, r7\n\t"
  139809. #else
  139810. "add r5, r5, r7\n\t"
  139811. #endif
  139812. #ifdef WOLFSSL_KEIL
  139813. "adcs r3, r3, %[r]\n\t"
  139814. #elif defined(__clang__)
  139815. "adcs r3, %[r]\n\t"
  139816. #else
  139817. "adc r3, %[r]\n\t"
  139818. #endif
  139819. #ifdef WOLFSSL_KEIL
  139820. "adcs r4, r4, %[r]\n\t"
  139821. #elif defined(__clang__)
  139822. "adcs r4, %[r]\n\t"
  139823. #else
  139824. "adc r4, %[r]\n\t"
  139825. #endif
  139826. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139827. "lsrs r7, %[b], #16\n\t"
  139828. #else
  139829. "lsr r7, %[b], #16\n\t"
  139830. #endif
  139831. #ifdef WOLFSSL_KEIL
  139832. "muls r6, r7, r6\n\t"
  139833. #elif defined(__clang__)
  139834. "muls r6, r7\n\t"
  139835. #else
  139836. "mul r6, r7\n\t"
  139837. #endif
  139838. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139839. "lsrs r7, r6, #16\n\t"
  139840. #else
  139841. "lsr r7, r6, #16\n\t"
  139842. #endif
  139843. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139844. "lsls r6, r6, #16\n\t"
  139845. #else
  139846. "lsl r6, r6, #16\n\t"
  139847. #endif
  139848. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139849. "adds r5, r5, r6\n\t"
  139850. #else
  139851. "add r5, r5, r6\n\t"
  139852. #endif
  139853. #ifdef WOLFSSL_KEIL
  139854. "adcs r3, r3, r7\n\t"
  139855. #elif defined(__clang__)
  139856. "adcs r3, r7\n\t"
  139857. #else
  139858. "adc r3, r7\n\t"
  139859. #endif
  139860. #ifdef WOLFSSL_KEIL
  139861. "adcs r4, r4, %[r]\n\t"
  139862. #elif defined(__clang__)
  139863. "adcs r4, %[r]\n\t"
  139864. #else
  139865. "adc r4, %[r]\n\t"
  139866. #endif
  139867. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139868. "lsrs r6, %[a], #16\n\t"
  139869. #else
  139870. "lsr r6, %[a], #16\n\t"
  139871. #endif
  139872. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139873. "lsrs r7, %[b], #16\n\t"
  139874. #else
  139875. "lsr r7, %[b], #16\n\t"
  139876. #endif
  139877. #ifdef WOLFSSL_KEIL
  139878. "muls r7, r6, r7\n\t"
  139879. #elif defined(__clang__)
  139880. "muls r7, r6\n\t"
  139881. #else
  139882. "mul r7, r6\n\t"
  139883. #endif
  139884. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139885. "adds r3, r3, r7\n\t"
  139886. #else
  139887. "add r3, r3, r7\n\t"
  139888. #endif
  139889. #ifdef WOLFSSL_KEIL
  139890. "adcs r4, r4, %[r]\n\t"
  139891. #elif defined(__clang__)
  139892. "adcs r4, %[r]\n\t"
  139893. #else
  139894. "adc r4, %[r]\n\t"
  139895. #endif
  139896. "uxth r7, %[b]\n\t"
  139897. #ifdef WOLFSSL_KEIL
  139898. "muls r6, r7, r6\n\t"
  139899. #elif defined(__clang__)
  139900. "muls r6, r7\n\t"
  139901. #else
  139902. "mul r6, r7\n\t"
  139903. #endif
  139904. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139905. "lsrs r7, r6, #16\n\t"
  139906. #else
  139907. "lsr r7, r6, #16\n\t"
  139908. #endif
  139909. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139910. "lsls r6, r6, #16\n\t"
  139911. #else
  139912. "lsl r6, r6, #16\n\t"
  139913. #endif
  139914. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139915. "adds r5, r5, r6\n\t"
  139916. #else
  139917. "add r5, r5, r6\n\t"
  139918. #endif
  139919. #ifdef WOLFSSL_KEIL
  139920. "adcs r3, r3, r7\n\t"
  139921. #elif defined(__clang__)
  139922. "adcs r3, r7\n\t"
  139923. #else
  139924. "adc r3, r7\n\t"
  139925. #endif
  139926. #ifdef WOLFSSL_KEIL
  139927. "adcs r4, r4, %[r]\n\t"
  139928. #elif defined(__clang__)
  139929. "adcs r4, %[r]\n\t"
  139930. #else
  139931. "adc r4, %[r]\n\t"
  139932. #endif
  139933. "# A[5] * B[3]\n\t"
  139934. "mov %[a], r9\n\t"
  139935. "mov %[b], r10\n\t"
  139936. "ldr %[a], [%[a], #20]\n\t"
  139937. "ldr %[b], [%[b], #12]\n\t"
  139938. "uxth r6, %[a]\n\t"
  139939. "uxth r7, %[b]\n\t"
  139940. #ifdef WOLFSSL_KEIL
  139941. "muls r7, r6, r7\n\t"
  139942. #elif defined(__clang__)
  139943. "muls r7, r6\n\t"
  139944. #else
  139945. "mul r7, r6\n\t"
  139946. #endif
  139947. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139948. "adds r5, r5, r7\n\t"
  139949. #else
  139950. "add r5, r5, r7\n\t"
  139951. #endif
  139952. #ifdef WOLFSSL_KEIL
  139953. "adcs r3, r3, %[r]\n\t"
  139954. #elif defined(__clang__)
  139955. "adcs r3, %[r]\n\t"
  139956. #else
  139957. "adc r3, %[r]\n\t"
  139958. #endif
  139959. #ifdef WOLFSSL_KEIL
  139960. "adcs r4, r4, %[r]\n\t"
  139961. #elif defined(__clang__)
  139962. "adcs r4, %[r]\n\t"
  139963. #else
  139964. "adc r4, %[r]\n\t"
  139965. #endif
  139966. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139967. "lsrs r7, %[b], #16\n\t"
  139968. #else
  139969. "lsr r7, %[b], #16\n\t"
  139970. #endif
  139971. #ifdef WOLFSSL_KEIL
  139972. "muls r6, r7, r6\n\t"
  139973. #elif defined(__clang__)
  139974. "muls r6, r7\n\t"
  139975. #else
  139976. "mul r6, r7\n\t"
  139977. #endif
  139978. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139979. "lsrs r7, r6, #16\n\t"
  139980. #else
  139981. "lsr r7, r6, #16\n\t"
  139982. #endif
  139983. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139984. "lsls r6, r6, #16\n\t"
  139985. #else
  139986. "lsl r6, r6, #16\n\t"
  139987. #endif
  139988. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139989. "adds r5, r5, r6\n\t"
  139990. #else
  139991. "add r5, r5, r6\n\t"
  139992. #endif
  139993. #ifdef WOLFSSL_KEIL
  139994. "adcs r3, r3, r7\n\t"
  139995. #elif defined(__clang__)
  139996. "adcs r3, r7\n\t"
  139997. #else
  139998. "adc r3, r7\n\t"
  139999. #endif
  140000. #ifdef WOLFSSL_KEIL
  140001. "adcs r4, r4, %[r]\n\t"
  140002. #elif defined(__clang__)
  140003. "adcs r4, %[r]\n\t"
  140004. #else
  140005. "adc r4, %[r]\n\t"
  140006. #endif
  140007. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140008. "lsrs r6, %[a], #16\n\t"
  140009. #else
  140010. "lsr r6, %[a], #16\n\t"
  140011. #endif
  140012. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140013. "lsrs r7, %[b], #16\n\t"
  140014. #else
  140015. "lsr r7, %[b], #16\n\t"
  140016. #endif
  140017. #ifdef WOLFSSL_KEIL
  140018. "muls r7, r6, r7\n\t"
  140019. #elif defined(__clang__)
  140020. "muls r7, r6\n\t"
  140021. #else
  140022. "mul r7, r6\n\t"
  140023. #endif
  140024. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140025. "adds r3, r3, r7\n\t"
  140026. #else
  140027. "add r3, r3, r7\n\t"
  140028. #endif
  140029. #ifdef WOLFSSL_KEIL
  140030. "adcs r4, r4, %[r]\n\t"
  140031. #elif defined(__clang__)
  140032. "adcs r4, %[r]\n\t"
  140033. #else
  140034. "adc r4, %[r]\n\t"
  140035. #endif
  140036. "uxth r7, %[b]\n\t"
  140037. #ifdef WOLFSSL_KEIL
  140038. "muls r6, r7, r6\n\t"
  140039. #elif defined(__clang__)
  140040. "muls r6, r7\n\t"
  140041. #else
  140042. "mul r6, r7\n\t"
  140043. #endif
  140044. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140045. "lsrs r7, r6, #16\n\t"
  140046. #else
  140047. "lsr r7, r6, #16\n\t"
  140048. #endif
  140049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140050. "lsls r6, r6, #16\n\t"
  140051. #else
  140052. "lsl r6, r6, #16\n\t"
  140053. #endif
  140054. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140055. "adds r5, r5, r6\n\t"
  140056. #else
  140057. "add r5, r5, r6\n\t"
  140058. #endif
  140059. #ifdef WOLFSSL_KEIL
  140060. "adcs r3, r3, r7\n\t"
  140061. #elif defined(__clang__)
  140062. "adcs r3, r7\n\t"
  140063. #else
  140064. "adc r3, r7\n\t"
  140065. #endif
  140066. #ifdef WOLFSSL_KEIL
  140067. "adcs r4, r4, %[r]\n\t"
  140068. #elif defined(__clang__)
  140069. "adcs r4, %[r]\n\t"
  140070. #else
  140071. "adc r4, %[r]\n\t"
  140072. #endif
  140073. "# A[4] * B[4]\n\t"
  140074. "mov %[a], r9\n\t"
  140075. "mov %[b], r10\n\t"
  140076. "ldr %[a], [%[a], #16]\n\t"
  140077. "ldr %[b], [%[b], #16]\n\t"
  140078. "uxth r6, %[a]\n\t"
  140079. "uxth r7, %[b]\n\t"
  140080. #ifdef WOLFSSL_KEIL
  140081. "muls r7, r6, r7\n\t"
  140082. #elif defined(__clang__)
  140083. "muls r7, r6\n\t"
  140084. #else
  140085. "mul r7, r6\n\t"
  140086. #endif
  140087. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140088. "adds r5, r5, r7\n\t"
  140089. #else
  140090. "add r5, r5, r7\n\t"
  140091. #endif
  140092. #ifdef WOLFSSL_KEIL
  140093. "adcs r3, r3, %[r]\n\t"
  140094. #elif defined(__clang__)
  140095. "adcs r3, %[r]\n\t"
  140096. #else
  140097. "adc r3, %[r]\n\t"
  140098. #endif
  140099. #ifdef WOLFSSL_KEIL
  140100. "adcs r4, r4, %[r]\n\t"
  140101. #elif defined(__clang__)
  140102. "adcs r4, %[r]\n\t"
  140103. #else
  140104. "adc r4, %[r]\n\t"
  140105. #endif
  140106. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140107. "lsrs r7, %[b], #16\n\t"
  140108. #else
  140109. "lsr r7, %[b], #16\n\t"
  140110. #endif
  140111. #ifdef WOLFSSL_KEIL
  140112. "muls r6, r7, r6\n\t"
  140113. #elif defined(__clang__)
  140114. "muls r6, r7\n\t"
  140115. #else
  140116. "mul r6, r7\n\t"
  140117. #endif
  140118. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140119. "lsrs r7, r6, #16\n\t"
  140120. #else
  140121. "lsr r7, r6, #16\n\t"
  140122. #endif
  140123. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140124. "lsls r6, r6, #16\n\t"
  140125. #else
  140126. "lsl r6, r6, #16\n\t"
  140127. #endif
  140128. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140129. "adds r5, r5, r6\n\t"
  140130. #else
  140131. "add r5, r5, r6\n\t"
  140132. #endif
  140133. #ifdef WOLFSSL_KEIL
  140134. "adcs r3, r3, r7\n\t"
  140135. #elif defined(__clang__)
  140136. "adcs r3, r7\n\t"
  140137. #else
  140138. "adc r3, r7\n\t"
  140139. #endif
  140140. #ifdef WOLFSSL_KEIL
  140141. "adcs r4, r4, %[r]\n\t"
  140142. #elif defined(__clang__)
  140143. "adcs r4, %[r]\n\t"
  140144. #else
  140145. "adc r4, %[r]\n\t"
  140146. #endif
  140147. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140148. "lsrs r6, %[a], #16\n\t"
  140149. #else
  140150. "lsr r6, %[a], #16\n\t"
  140151. #endif
  140152. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140153. "lsrs r7, %[b], #16\n\t"
  140154. #else
  140155. "lsr r7, %[b], #16\n\t"
  140156. #endif
  140157. #ifdef WOLFSSL_KEIL
  140158. "muls r7, r6, r7\n\t"
  140159. #elif defined(__clang__)
  140160. "muls r7, r6\n\t"
  140161. #else
  140162. "mul r7, r6\n\t"
  140163. #endif
  140164. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140165. "adds r3, r3, r7\n\t"
  140166. #else
  140167. "add r3, r3, r7\n\t"
  140168. #endif
  140169. #ifdef WOLFSSL_KEIL
  140170. "adcs r4, r4, %[r]\n\t"
  140171. #elif defined(__clang__)
  140172. "adcs r4, %[r]\n\t"
  140173. #else
  140174. "adc r4, %[r]\n\t"
  140175. #endif
  140176. "uxth r7, %[b]\n\t"
  140177. #ifdef WOLFSSL_KEIL
  140178. "muls r6, r7, r6\n\t"
  140179. #elif defined(__clang__)
  140180. "muls r6, r7\n\t"
  140181. #else
  140182. "mul r6, r7\n\t"
  140183. #endif
  140184. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140185. "lsrs r7, r6, #16\n\t"
  140186. #else
  140187. "lsr r7, r6, #16\n\t"
  140188. #endif
  140189. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140190. "lsls r6, r6, #16\n\t"
  140191. #else
  140192. "lsl r6, r6, #16\n\t"
  140193. #endif
  140194. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140195. "adds r5, r5, r6\n\t"
  140196. #else
  140197. "add r5, r5, r6\n\t"
  140198. #endif
  140199. #ifdef WOLFSSL_KEIL
  140200. "adcs r3, r3, r7\n\t"
  140201. #elif defined(__clang__)
  140202. "adcs r3, r7\n\t"
  140203. #else
  140204. "adc r3, r7\n\t"
  140205. #endif
  140206. #ifdef WOLFSSL_KEIL
  140207. "adcs r4, r4, %[r]\n\t"
  140208. #elif defined(__clang__)
  140209. "adcs r4, %[r]\n\t"
  140210. #else
  140211. "adc r4, %[r]\n\t"
  140212. #endif
  140213. "# A[3] * B[5]\n\t"
  140214. "mov %[a], r9\n\t"
  140215. "mov %[b], r10\n\t"
  140216. "ldr %[a], [%[a], #12]\n\t"
  140217. "ldr %[b], [%[b], #20]\n\t"
  140218. "uxth r6, %[a]\n\t"
  140219. "uxth r7, %[b]\n\t"
  140220. #ifdef WOLFSSL_KEIL
  140221. "muls r7, r6, r7\n\t"
  140222. #elif defined(__clang__)
  140223. "muls r7, r6\n\t"
  140224. #else
  140225. "mul r7, r6\n\t"
  140226. #endif
  140227. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140228. "adds r5, r5, r7\n\t"
  140229. #else
  140230. "add r5, r5, r7\n\t"
  140231. #endif
  140232. #ifdef WOLFSSL_KEIL
  140233. "adcs r3, r3, %[r]\n\t"
  140234. #elif defined(__clang__)
  140235. "adcs r3, %[r]\n\t"
  140236. #else
  140237. "adc r3, %[r]\n\t"
  140238. #endif
  140239. #ifdef WOLFSSL_KEIL
  140240. "adcs r4, r4, %[r]\n\t"
  140241. #elif defined(__clang__)
  140242. "adcs r4, %[r]\n\t"
  140243. #else
  140244. "adc r4, %[r]\n\t"
  140245. #endif
  140246. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140247. "lsrs r7, %[b], #16\n\t"
  140248. #else
  140249. "lsr r7, %[b], #16\n\t"
  140250. #endif
  140251. #ifdef WOLFSSL_KEIL
  140252. "muls r6, r7, r6\n\t"
  140253. #elif defined(__clang__)
  140254. "muls r6, r7\n\t"
  140255. #else
  140256. "mul r6, r7\n\t"
  140257. #endif
  140258. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140259. "lsrs r7, r6, #16\n\t"
  140260. #else
  140261. "lsr r7, r6, #16\n\t"
  140262. #endif
  140263. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140264. "lsls r6, r6, #16\n\t"
  140265. #else
  140266. "lsl r6, r6, #16\n\t"
  140267. #endif
  140268. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140269. "adds r5, r5, r6\n\t"
  140270. #else
  140271. "add r5, r5, r6\n\t"
  140272. #endif
  140273. #ifdef WOLFSSL_KEIL
  140274. "adcs r3, r3, r7\n\t"
  140275. #elif defined(__clang__)
  140276. "adcs r3, r7\n\t"
  140277. #else
  140278. "adc r3, r7\n\t"
  140279. #endif
  140280. #ifdef WOLFSSL_KEIL
  140281. "adcs r4, r4, %[r]\n\t"
  140282. #elif defined(__clang__)
  140283. "adcs r4, %[r]\n\t"
  140284. #else
  140285. "adc r4, %[r]\n\t"
  140286. #endif
  140287. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140288. "lsrs r6, %[a], #16\n\t"
  140289. #else
  140290. "lsr r6, %[a], #16\n\t"
  140291. #endif
  140292. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140293. "lsrs r7, %[b], #16\n\t"
  140294. #else
  140295. "lsr r7, %[b], #16\n\t"
  140296. #endif
  140297. #ifdef WOLFSSL_KEIL
  140298. "muls r7, r6, r7\n\t"
  140299. #elif defined(__clang__)
  140300. "muls r7, r6\n\t"
  140301. #else
  140302. "mul r7, r6\n\t"
  140303. #endif
  140304. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140305. "adds r3, r3, r7\n\t"
  140306. #else
  140307. "add r3, r3, r7\n\t"
  140308. #endif
  140309. #ifdef WOLFSSL_KEIL
  140310. "adcs r4, r4, %[r]\n\t"
  140311. #elif defined(__clang__)
  140312. "adcs r4, %[r]\n\t"
  140313. #else
  140314. "adc r4, %[r]\n\t"
  140315. #endif
  140316. "uxth r7, %[b]\n\t"
  140317. #ifdef WOLFSSL_KEIL
  140318. "muls r6, r7, r6\n\t"
  140319. #elif defined(__clang__)
  140320. "muls r6, r7\n\t"
  140321. #else
  140322. "mul r6, r7\n\t"
  140323. #endif
  140324. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140325. "lsrs r7, r6, #16\n\t"
  140326. #else
  140327. "lsr r7, r6, #16\n\t"
  140328. #endif
  140329. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140330. "lsls r6, r6, #16\n\t"
  140331. #else
  140332. "lsl r6, r6, #16\n\t"
  140333. #endif
  140334. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140335. "adds r5, r5, r6\n\t"
  140336. #else
  140337. "add r5, r5, r6\n\t"
  140338. #endif
  140339. #ifdef WOLFSSL_KEIL
  140340. "adcs r3, r3, r7\n\t"
  140341. #elif defined(__clang__)
  140342. "adcs r3, r7\n\t"
  140343. #else
  140344. "adc r3, r7\n\t"
  140345. #endif
  140346. #ifdef WOLFSSL_KEIL
  140347. "adcs r4, r4, %[r]\n\t"
  140348. #elif defined(__clang__)
  140349. "adcs r4, %[r]\n\t"
  140350. #else
  140351. "adc r4, %[r]\n\t"
  140352. #endif
  140353. "# A[2] * B[6]\n\t"
  140354. "mov %[a], r9\n\t"
  140355. "mov %[b], r10\n\t"
  140356. "ldr %[a], [%[a], #8]\n\t"
  140357. "ldr %[b], [%[b], #24]\n\t"
  140358. "uxth r6, %[a]\n\t"
  140359. "uxth r7, %[b]\n\t"
  140360. #ifdef WOLFSSL_KEIL
  140361. "muls r7, r6, r7\n\t"
  140362. #elif defined(__clang__)
  140363. "muls r7, r6\n\t"
  140364. #else
  140365. "mul r7, r6\n\t"
  140366. #endif
  140367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140368. "adds r5, r5, r7\n\t"
  140369. #else
  140370. "add r5, r5, r7\n\t"
  140371. #endif
  140372. #ifdef WOLFSSL_KEIL
  140373. "adcs r3, r3, %[r]\n\t"
  140374. #elif defined(__clang__)
  140375. "adcs r3, %[r]\n\t"
  140376. #else
  140377. "adc r3, %[r]\n\t"
  140378. #endif
  140379. #ifdef WOLFSSL_KEIL
  140380. "adcs r4, r4, %[r]\n\t"
  140381. #elif defined(__clang__)
  140382. "adcs r4, %[r]\n\t"
  140383. #else
  140384. "adc r4, %[r]\n\t"
  140385. #endif
  140386. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140387. "lsrs r7, %[b], #16\n\t"
  140388. #else
  140389. "lsr r7, %[b], #16\n\t"
  140390. #endif
  140391. #ifdef WOLFSSL_KEIL
  140392. "muls r6, r7, r6\n\t"
  140393. #elif defined(__clang__)
  140394. "muls r6, r7\n\t"
  140395. #else
  140396. "mul r6, r7\n\t"
  140397. #endif
  140398. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140399. "lsrs r7, r6, #16\n\t"
  140400. #else
  140401. "lsr r7, r6, #16\n\t"
  140402. #endif
  140403. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140404. "lsls r6, r6, #16\n\t"
  140405. #else
  140406. "lsl r6, r6, #16\n\t"
  140407. #endif
  140408. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140409. "adds r5, r5, r6\n\t"
  140410. #else
  140411. "add r5, r5, r6\n\t"
  140412. #endif
  140413. #ifdef WOLFSSL_KEIL
  140414. "adcs r3, r3, r7\n\t"
  140415. #elif defined(__clang__)
  140416. "adcs r3, r7\n\t"
  140417. #else
  140418. "adc r3, r7\n\t"
  140419. #endif
  140420. #ifdef WOLFSSL_KEIL
  140421. "adcs r4, r4, %[r]\n\t"
  140422. #elif defined(__clang__)
  140423. "adcs r4, %[r]\n\t"
  140424. #else
  140425. "adc r4, %[r]\n\t"
  140426. #endif
  140427. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140428. "lsrs r6, %[a], #16\n\t"
  140429. #else
  140430. "lsr r6, %[a], #16\n\t"
  140431. #endif
  140432. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140433. "lsrs r7, %[b], #16\n\t"
  140434. #else
  140435. "lsr r7, %[b], #16\n\t"
  140436. #endif
  140437. #ifdef WOLFSSL_KEIL
  140438. "muls r7, r6, r7\n\t"
  140439. #elif defined(__clang__)
  140440. "muls r7, r6\n\t"
  140441. #else
  140442. "mul r7, r6\n\t"
  140443. #endif
  140444. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140445. "adds r3, r3, r7\n\t"
  140446. #else
  140447. "add r3, r3, r7\n\t"
  140448. #endif
  140449. #ifdef WOLFSSL_KEIL
  140450. "adcs r4, r4, %[r]\n\t"
  140451. #elif defined(__clang__)
  140452. "adcs r4, %[r]\n\t"
  140453. #else
  140454. "adc r4, %[r]\n\t"
  140455. #endif
  140456. "uxth r7, %[b]\n\t"
  140457. #ifdef WOLFSSL_KEIL
  140458. "muls r6, r7, r6\n\t"
  140459. #elif defined(__clang__)
  140460. "muls r6, r7\n\t"
  140461. #else
  140462. "mul r6, r7\n\t"
  140463. #endif
  140464. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140465. "lsrs r7, r6, #16\n\t"
  140466. #else
  140467. "lsr r7, r6, #16\n\t"
  140468. #endif
  140469. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140470. "lsls r6, r6, #16\n\t"
  140471. #else
  140472. "lsl r6, r6, #16\n\t"
  140473. #endif
  140474. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140475. "adds r5, r5, r6\n\t"
  140476. #else
  140477. "add r5, r5, r6\n\t"
  140478. #endif
  140479. #ifdef WOLFSSL_KEIL
  140480. "adcs r3, r3, r7\n\t"
  140481. #elif defined(__clang__)
  140482. "adcs r3, r7\n\t"
  140483. #else
  140484. "adc r3, r7\n\t"
  140485. #endif
  140486. #ifdef WOLFSSL_KEIL
  140487. "adcs r4, r4, %[r]\n\t"
  140488. #elif defined(__clang__)
  140489. "adcs r4, %[r]\n\t"
  140490. #else
  140491. "adc r4, %[r]\n\t"
  140492. #endif
  140493. "# A[1] * B[7]\n\t"
  140494. "mov %[a], r9\n\t"
  140495. "mov %[b], r10\n\t"
  140496. "ldr %[a], [%[a], #4]\n\t"
  140497. "ldr %[b], [%[b], #28]\n\t"
  140498. "uxth r6, %[a]\n\t"
  140499. "uxth r7, %[b]\n\t"
  140500. #ifdef WOLFSSL_KEIL
  140501. "muls r7, r6, r7\n\t"
  140502. #elif defined(__clang__)
  140503. "muls r7, r6\n\t"
  140504. #else
  140505. "mul r7, r6\n\t"
  140506. #endif
  140507. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140508. "adds r5, r5, r7\n\t"
  140509. #else
  140510. "add r5, r5, r7\n\t"
  140511. #endif
  140512. #ifdef WOLFSSL_KEIL
  140513. "adcs r3, r3, %[r]\n\t"
  140514. #elif defined(__clang__)
  140515. "adcs r3, %[r]\n\t"
  140516. #else
  140517. "adc r3, %[r]\n\t"
  140518. #endif
  140519. #ifdef WOLFSSL_KEIL
  140520. "adcs r4, r4, %[r]\n\t"
  140521. #elif defined(__clang__)
  140522. "adcs r4, %[r]\n\t"
  140523. #else
  140524. "adc r4, %[r]\n\t"
  140525. #endif
  140526. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140527. "lsrs r7, %[b], #16\n\t"
  140528. #else
  140529. "lsr r7, %[b], #16\n\t"
  140530. #endif
  140531. #ifdef WOLFSSL_KEIL
  140532. "muls r6, r7, r6\n\t"
  140533. #elif defined(__clang__)
  140534. "muls r6, r7\n\t"
  140535. #else
  140536. "mul r6, r7\n\t"
  140537. #endif
  140538. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140539. "lsrs r7, r6, #16\n\t"
  140540. #else
  140541. "lsr r7, r6, #16\n\t"
  140542. #endif
  140543. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140544. "lsls r6, r6, #16\n\t"
  140545. #else
  140546. "lsl r6, r6, #16\n\t"
  140547. #endif
  140548. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140549. "adds r5, r5, r6\n\t"
  140550. #else
  140551. "add r5, r5, r6\n\t"
  140552. #endif
  140553. #ifdef WOLFSSL_KEIL
  140554. "adcs r3, r3, r7\n\t"
  140555. #elif defined(__clang__)
  140556. "adcs r3, r7\n\t"
  140557. #else
  140558. "adc r3, r7\n\t"
  140559. #endif
  140560. #ifdef WOLFSSL_KEIL
  140561. "adcs r4, r4, %[r]\n\t"
  140562. #elif defined(__clang__)
  140563. "adcs r4, %[r]\n\t"
  140564. #else
  140565. "adc r4, %[r]\n\t"
  140566. #endif
  140567. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140568. "lsrs r6, %[a], #16\n\t"
  140569. #else
  140570. "lsr r6, %[a], #16\n\t"
  140571. #endif
  140572. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140573. "lsrs r7, %[b], #16\n\t"
  140574. #else
  140575. "lsr r7, %[b], #16\n\t"
  140576. #endif
  140577. #ifdef WOLFSSL_KEIL
  140578. "muls r7, r6, r7\n\t"
  140579. #elif defined(__clang__)
  140580. "muls r7, r6\n\t"
  140581. #else
  140582. "mul r7, r6\n\t"
  140583. #endif
  140584. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140585. "adds r3, r3, r7\n\t"
  140586. #else
  140587. "add r3, r3, r7\n\t"
  140588. #endif
  140589. #ifdef WOLFSSL_KEIL
  140590. "adcs r4, r4, %[r]\n\t"
  140591. #elif defined(__clang__)
  140592. "adcs r4, %[r]\n\t"
  140593. #else
  140594. "adc r4, %[r]\n\t"
  140595. #endif
  140596. "uxth r7, %[b]\n\t"
  140597. #ifdef WOLFSSL_KEIL
  140598. "muls r6, r7, r6\n\t"
  140599. #elif defined(__clang__)
  140600. "muls r6, r7\n\t"
  140601. #else
  140602. "mul r6, r7\n\t"
  140603. #endif
  140604. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140605. "lsrs r7, r6, #16\n\t"
  140606. #else
  140607. "lsr r7, r6, #16\n\t"
  140608. #endif
  140609. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140610. "lsls r6, r6, #16\n\t"
  140611. #else
  140612. "lsl r6, r6, #16\n\t"
  140613. #endif
  140614. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140615. "adds r5, r5, r6\n\t"
  140616. #else
  140617. "add r5, r5, r6\n\t"
  140618. #endif
  140619. #ifdef WOLFSSL_KEIL
  140620. "adcs r3, r3, r7\n\t"
  140621. #elif defined(__clang__)
  140622. "adcs r3, r7\n\t"
  140623. #else
  140624. "adc r3, r7\n\t"
  140625. #endif
  140626. #ifdef WOLFSSL_KEIL
  140627. "adcs r4, r4, %[r]\n\t"
  140628. #elif defined(__clang__)
  140629. "adcs r4, %[r]\n\t"
  140630. #else
  140631. "adc r4, %[r]\n\t"
  140632. #endif
  140633. "# A[0] * B[8]\n\t"
  140634. "mov %[a], r9\n\t"
  140635. "mov %[b], r10\n\t"
  140636. "ldr %[a], [%[a]]\n\t"
  140637. "ldr %[b], [%[b], #32]\n\t"
  140638. "uxth r6, %[a]\n\t"
  140639. "uxth r7, %[b]\n\t"
  140640. #ifdef WOLFSSL_KEIL
  140641. "muls r7, r6, r7\n\t"
  140642. #elif defined(__clang__)
  140643. "muls r7, r6\n\t"
  140644. #else
  140645. "mul r7, r6\n\t"
  140646. #endif
  140647. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140648. "adds r5, r5, r7\n\t"
  140649. #else
  140650. "add r5, r5, r7\n\t"
  140651. #endif
  140652. #ifdef WOLFSSL_KEIL
  140653. "adcs r3, r3, %[r]\n\t"
  140654. #elif defined(__clang__)
  140655. "adcs r3, %[r]\n\t"
  140656. #else
  140657. "adc r3, %[r]\n\t"
  140658. #endif
  140659. #ifdef WOLFSSL_KEIL
  140660. "adcs r4, r4, %[r]\n\t"
  140661. #elif defined(__clang__)
  140662. "adcs r4, %[r]\n\t"
  140663. #else
  140664. "adc r4, %[r]\n\t"
  140665. #endif
  140666. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140667. "lsrs r7, %[b], #16\n\t"
  140668. #else
  140669. "lsr r7, %[b], #16\n\t"
  140670. #endif
  140671. #ifdef WOLFSSL_KEIL
  140672. "muls r6, r7, r6\n\t"
  140673. #elif defined(__clang__)
  140674. "muls r6, r7\n\t"
  140675. #else
  140676. "mul r6, r7\n\t"
  140677. #endif
  140678. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140679. "lsrs r7, r6, #16\n\t"
  140680. #else
  140681. "lsr r7, r6, #16\n\t"
  140682. #endif
  140683. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140684. "lsls r6, r6, #16\n\t"
  140685. #else
  140686. "lsl r6, r6, #16\n\t"
  140687. #endif
  140688. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140689. "adds r5, r5, r6\n\t"
  140690. #else
  140691. "add r5, r5, r6\n\t"
  140692. #endif
  140693. #ifdef WOLFSSL_KEIL
  140694. "adcs r3, r3, r7\n\t"
  140695. #elif defined(__clang__)
  140696. "adcs r3, r7\n\t"
  140697. #else
  140698. "adc r3, r7\n\t"
  140699. #endif
  140700. #ifdef WOLFSSL_KEIL
  140701. "adcs r4, r4, %[r]\n\t"
  140702. #elif defined(__clang__)
  140703. "adcs r4, %[r]\n\t"
  140704. #else
  140705. "adc r4, %[r]\n\t"
  140706. #endif
  140707. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140708. "lsrs r6, %[a], #16\n\t"
  140709. #else
  140710. "lsr r6, %[a], #16\n\t"
  140711. #endif
  140712. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140713. "lsrs r7, %[b], #16\n\t"
  140714. #else
  140715. "lsr r7, %[b], #16\n\t"
  140716. #endif
  140717. #ifdef WOLFSSL_KEIL
  140718. "muls r7, r6, r7\n\t"
  140719. #elif defined(__clang__)
  140720. "muls r7, r6\n\t"
  140721. #else
  140722. "mul r7, r6\n\t"
  140723. #endif
  140724. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140725. "adds r3, r3, r7\n\t"
  140726. #else
  140727. "add r3, r3, r7\n\t"
  140728. #endif
  140729. #ifdef WOLFSSL_KEIL
  140730. "adcs r4, r4, %[r]\n\t"
  140731. #elif defined(__clang__)
  140732. "adcs r4, %[r]\n\t"
  140733. #else
  140734. "adc r4, %[r]\n\t"
  140735. #endif
  140736. "uxth r7, %[b]\n\t"
  140737. #ifdef WOLFSSL_KEIL
  140738. "muls r6, r7, r6\n\t"
  140739. #elif defined(__clang__)
  140740. "muls r6, r7\n\t"
  140741. #else
  140742. "mul r6, r7\n\t"
  140743. #endif
  140744. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140745. "lsrs r7, r6, #16\n\t"
  140746. #else
  140747. "lsr r7, r6, #16\n\t"
  140748. #endif
  140749. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140750. "lsls r6, r6, #16\n\t"
  140751. #else
  140752. "lsl r6, r6, #16\n\t"
  140753. #endif
  140754. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140755. "adds r5, r5, r6\n\t"
  140756. #else
  140757. "add r5, r5, r6\n\t"
  140758. #endif
  140759. #ifdef WOLFSSL_KEIL
  140760. "adcs r3, r3, r7\n\t"
  140761. #elif defined(__clang__)
  140762. "adcs r3, r7\n\t"
  140763. #else
  140764. "adc r3, r7\n\t"
  140765. #endif
  140766. #ifdef WOLFSSL_KEIL
  140767. "adcs r4, r4, %[r]\n\t"
  140768. #elif defined(__clang__)
  140769. "adcs r4, %[r]\n\t"
  140770. #else
  140771. "adc r4, %[r]\n\t"
  140772. #endif
  140773. "str r5, [sp, #32]\n\t"
  140774. "# A[0] * B[9]\n\t"
  140775. "movs r5, #0\n\t"
  140776. "mov %[a], r9\n\t"
  140777. "mov %[b], r10\n\t"
  140778. "ldr %[a], [%[a]]\n\t"
  140779. "ldr %[b], [%[b], #36]\n\t"
  140780. "uxth r6, %[a]\n\t"
  140781. "uxth r7, %[b]\n\t"
  140782. #ifdef WOLFSSL_KEIL
  140783. "muls r7, r6, r7\n\t"
  140784. #elif defined(__clang__)
  140785. "muls r7, r6\n\t"
  140786. #else
  140787. "mul r7, r6\n\t"
  140788. #endif
  140789. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140790. "adds r3, r3, r7\n\t"
  140791. #else
  140792. "add r3, r3, r7\n\t"
  140793. #endif
  140794. #ifdef WOLFSSL_KEIL
  140795. "adcs r4, r4, %[r]\n\t"
  140796. #elif defined(__clang__)
  140797. "adcs r4, %[r]\n\t"
  140798. #else
  140799. "adc r4, %[r]\n\t"
  140800. #endif
  140801. #ifdef WOLFSSL_KEIL
  140802. "adcs r5, r5, %[r]\n\t"
  140803. #elif defined(__clang__)
  140804. "adcs r5, %[r]\n\t"
  140805. #else
  140806. "adc r5, %[r]\n\t"
  140807. #endif
  140808. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140809. "lsrs r7, %[b], #16\n\t"
  140810. #else
  140811. "lsr r7, %[b], #16\n\t"
  140812. #endif
  140813. #ifdef WOLFSSL_KEIL
  140814. "muls r6, r7, r6\n\t"
  140815. #elif defined(__clang__)
  140816. "muls r6, r7\n\t"
  140817. #else
  140818. "mul r6, r7\n\t"
  140819. #endif
  140820. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140821. "lsrs r7, r6, #16\n\t"
  140822. #else
  140823. "lsr r7, r6, #16\n\t"
  140824. #endif
  140825. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140826. "lsls r6, r6, #16\n\t"
  140827. #else
  140828. "lsl r6, r6, #16\n\t"
  140829. #endif
  140830. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140831. "adds r3, r3, r6\n\t"
  140832. #else
  140833. "add r3, r3, r6\n\t"
  140834. #endif
  140835. #ifdef WOLFSSL_KEIL
  140836. "adcs r4, r4, r7\n\t"
  140837. #elif defined(__clang__)
  140838. "adcs r4, r7\n\t"
  140839. #else
  140840. "adc r4, r7\n\t"
  140841. #endif
  140842. #ifdef WOLFSSL_KEIL
  140843. "adcs r5, r5, %[r]\n\t"
  140844. #elif defined(__clang__)
  140845. "adcs r5, %[r]\n\t"
  140846. #else
  140847. "adc r5, %[r]\n\t"
  140848. #endif
  140849. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140850. "lsrs r6, %[a], #16\n\t"
  140851. #else
  140852. "lsr r6, %[a], #16\n\t"
  140853. #endif
  140854. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140855. "lsrs r7, %[b], #16\n\t"
  140856. #else
  140857. "lsr r7, %[b], #16\n\t"
  140858. #endif
  140859. #ifdef WOLFSSL_KEIL
  140860. "muls r7, r6, r7\n\t"
  140861. #elif defined(__clang__)
  140862. "muls r7, r6\n\t"
  140863. #else
  140864. "mul r7, r6\n\t"
  140865. #endif
  140866. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140867. "adds r4, r4, r7\n\t"
  140868. #else
  140869. "add r4, r4, r7\n\t"
  140870. #endif
  140871. #ifdef WOLFSSL_KEIL
  140872. "adcs r5, r5, %[r]\n\t"
  140873. #elif defined(__clang__)
  140874. "adcs r5, %[r]\n\t"
  140875. #else
  140876. "adc r5, %[r]\n\t"
  140877. #endif
  140878. "uxth r7, %[b]\n\t"
  140879. #ifdef WOLFSSL_KEIL
  140880. "muls r6, r7, r6\n\t"
  140881. #elif defined(__clang__)
  140882. "muls r6, r7\n\t"
  140883. #else
  140884. "mul r6, r7\n\t"
  140885. #endif
  140886. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140887. "lsrs r7, r6, #16\n\t"
  140888. #else
  140889. "lsr r7, r6, #16\n\t"
  140890. #endif
  140891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140892. "lsls r6, r6, #16\n\t"
  140893. #else
  140894. "lsl r6, r6, #16\n\t"
  140895. #endif
  140896. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140897. "adds r3, r3, r6\n\t"
  140898. #else
  140899. "add r3, r3, r6\n\t"
  140900. #endif
  140901. #ifdef WOLFSSL_KEIL
  140902. "adcs r4, r4, r7\n\t"
  140903. #elif defined(__clang__)
  140904. "adcs r4, r7\n\t"
  140905. #else
  140906. "adc r4, r7\n\t"
  140907. #endif
  140908. #ifdef WOLFSSL_KEIL
  140909. "adcs r5, r5, %[r]\n\t"
  140910. #elif defined(__clang__)
  140911. "adcs r5, %[r]\n\t"
  140912. #else
  140913. "adc r5, %[r]\n\t"
  140914. #endif
  140915. "# A[1] * B[8]\n\t"
  140916. "mov %[a], r9\n\t"
  140917. "mov %[b], r10\n\t"
  140918. "ldr %[a], [%[a], #4]\n\t"
  140919. "ldr %[b], [%[b], #32]\n\t"
  140920. "uxth r6, %[a]\n\t"
  140921. "uxth r7, %[b]\n\t"
  140922. #ifdef WOLFSSL_KEIL
  140923. "muls r7, r6, r7\n\t"
  140924. #elif defined(__clang__)
  140925. "muls r7, r6\n\t"
  140926. #else
  140927. "mul r7, r6\n\t"
  140928. #endif
  140929. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140930. "adds r3, r3, r7\n\t"
  140931. #else
  140932. "add r3, r3, r7\n\t"
  140933. #endif
  140934. #ifdef WOLFSSL_KEIL
  140935. "adcs r4, r4, %[r]\n\t"
  140936. #elif defined(__clang__)
  140937. "adcs r4, %[r]\n\t"
  140938. #else
  140939. "adc r4, %[r]\n\t"
  140940. #endif
  140941. #ifdef WOLFSSL_KEIL
  140942. "adcs r5, r5, %[r]\n\t"
  140943. #elif defined(__clang__)
  140944. "adcs r5, %[r]\n\t"
  140945. #else
  140946. "adc r5, %[r]\n\t"
  140947. #endif
  140948. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140949. "lsrs r7, %[b], #16\n\t"
  140950. #else
  140951. "lsr r7, %[b], #16\n\t"
  140952. #endif
  140953. #ifdef WOLFSSL_KEIL
  140954. "muls r6, r7, r6\n\t"
  140955. #elif defined(__clang__)
  140956. "muls r6, r7\n\t"
  140957. #else
  140958. "mul r6, r7\n\t"
  140959. #endif
  140960. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140961. "lsrs r7, r6, #16\n\t"
  140962. #else
  140963. "lsr r7, r6, #16\n\t"
  140964. #endif
  140965. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140966. "lsls r6, r6, #16\n\t"
  140967. #else
  140968. "lsl r6, r6, #16\n\t"
  140969. #endif
  140970. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140971. "adds r3, r3, r6\n\t"
  140972. #else
  140973. "add r3, r3, r6\n\t"
  140974. #endif
  140975. #ifdef WOLFSSL_KEIL
  140976. "adcs r4, r4, r7\n\t"
  140977. #elif defined(__clang__)
  140978. "adcs r4, r7\n\t"
  140979. #else
  140980. "adc r4, r7\n\t"
  140981. #endif
  140982. #ifdef WOLFSSL_KEIL
  140983. "adcs r5, r5, %[r]\n\t"
  140984. #elif defined(__clang__)
  140985. "adcs r5, %[r]\n\t"
  140986. #else
  140987. "adc r5, %[r]\n\t"
  140988. #endif
  140989. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140990. "lsrs r6, %[a], #16\n\t"
  140991. #else
  140992. "lsr r6, %[a], #16\n\t"
  140993. #endif
  140994. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140995. "lsrs r7, %[b], #16\n\t"
  140996. #else
  140997. "lsr r7, %[b], #16\n\t"
  140998. #endif
  140999. #ifdef WOLFSSL_KEIL
  141000. "muls r7, r6, r7\n\t"
  141001. #elif defined(__clang__)
  141002. "muls r7, r6\n\t"
  141003. #else
  141004. "mul r7, r6\n\t"
  141005. #endif
  141006. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141007. "adds r4, r4, r7\n\t"
  141008. #else
  141009. "add r4, r4, r7\n\t"
  141010. #endif
  141011. #ifdef WOLFSSL_KEIL
  141012. "adcs r5, r5, %[r]\n\t"
  141013. #elif defined(__clang__)
  141014. "adcs r5, %[r]\n\t"
  141015. #else
  141016. "adc r5, %[r]\n\t"
  141017. #endif
  141018. "uxth r7, %[b]\n\t"
  141019. #ifdef WOLFSSL_KEIL
  141020. "muls r6, r7, r6\n\t"
  141021. #elif defined(__clang__)
  141022. "muls r6, r7\n\t"
  141023. #else
  141024. "mul r6, r7\n\t"
  141025. #endif
  141026. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141027. "lsrs r7, r6, #16\n\t"
  141028. #else
  141029. "lsr r7, r6, #16\n\t"
  141030. #endif
  141031. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141032. "lsls r6, r6, #16\n\t"
  141033. #else
  141034. "lsl r6, r6, #16\n\t"
  141035. #endif
  141036. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141037. "adds r3, r3, r6\n\t"
  141038. #else
  141039. "add r3, r3, r6\n\t"
  141040. #endif
  141041. #ifdef WOLFSSL_KEIL
  141042. "adcs r4, r4, r7\n\t"
  141043. #elif defined(__clang__)
  141044. "adcs r4, r7\n\t"
  141045. #else
  141046. "adc r4, r7\n\t"
  141047. #endif
  141048. #ifdef WOLFSSL_KEIL
  141049. "adcs r5, r5, %[r]\n\t"
  141050. #elif defined(__clang__)
  141051. "adcs r5, %[r]\n\t"
  141052. #else
  141053. "adc r5, %[r]\n\t"
  141054. #endif
  141055. "# A[2] * B[7]\n\t"
  141056. "mov %[a], r9\n\t"
  141057. "mov %[b], r10\n\t"
  141058. "ldr %[a], [%[a], #8]\n\t"
  141059. "ldr %[b], [%[b], #28]\n\t"
  141060. "uxth r6, %[a]\n\t"
  141061. "uxth r7, %[b]\n\t"
  141062. #ifdef WOLFSSL_KEIL
  141063. "muls r7, r6, r7\n\t"
  141064. #elif defined(__clang__)
  141065. "muls r7, r6\n\t"
  141066. #else
  141067. "mul r7, r6\n\t"
  141068. #endif
  141069. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141070. "adds r3, r3, r7\n\t"
  141071. #else
  141072. "add r3, r3, r7\n\t"
  141073. #endif
  141074. #ifdef WOLFSSL_KEIL
  141075. "adcs r4, r4, %[r]\n\t"
  141076. #elif defined(__clang__)
  141077. "adcs r4, %[r]\n\t"
  141078. #else
  141079. "adc r4, %[r]\n\t"
  141080. #endif
  141081. #ifdef WOLFSSL_KEIL
  141082. "adcs r5, r5, %[r]\n\t"
  141083. #elif defined(__clang__)
  141084. "adcs r5, %[r]\n\t"
  141085. #else
  141086. "adc r5, %[r]\n\t"
  141087. #endif
  141088. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141089. "lsrs r7, %[b], #16\n\t"
  141090. #else
  141091. "lsr r7, %[b], #16\n\t"
  141092. #endif
  141093. #ifdef WOLFSSL_KEIL
  141094. "muls r6, r7, r6\n\t"
  141095. #elif defined(__clang__)
  141096. "muls r6, r7\n\t"
  141097. #else
  141098. "mul r6, r7\n\t"
  141099. #endif
  141100. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141101. "lsrs r7, r6, #16\n\t"
  141102. #else
  141103. "lsr r7, r6, #16\n\t"
  141104. #endif
  141105. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141106. "lsls r6, r6, #16\n\t"
  141107. #else
  141108. "lsl r6, r6, #16\n\t"
  141109. #endif
  141110. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141111. "adds r3, r3, r6\n\t"
  141112. #else
  141113. "add r3, r3, r6\n\t"
  141114. #endif
  141115. #ifdef WOLFSSL_KEIL
  141116. "adcs r4, r4, r7\n\t"
  141117. #elif defined(__clang__)
  141118. "adcs r4, r7\n\t"
  141119. #else
  141120. "adc r4, r7\n\t"
  141121. #endif
  141122. #ifdef WOLFSSL_KEIL
  141123. "adcs r5, r5, %[r]\n\t"
  141124. #elif defined(__clang__)
  141125. "adcs r5, %[r]\n\t"
  141126. #else
  141127. "adc r5, %[r]\n\t"
  141128. #endif
  141129. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141130. "lsrs r6, %[a], #16\n\t"
  141131. #else
  141132. "lsr r6, %[a], #16\n\t"
  141133. #endif
  141134. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141135. "lsrs r7, %[b], #16\n\t"
  141136. #else
  141137. "lsr r7, %[b], #16\n\t"
  141138. #endif
  141139. #ifdef WOLFSSL_KEIL
  141140. "muls r7, r6, r7\n\t"
  141141. #elif defined(__clang__)
  141142. "muls r7, r6\n\t"
  141143. #else
  141144. "mul r7, r6\n\t"
  141145. #endif
  141146. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141147. "adds r4, r4, r7\n\t"
  141148. #else
  141149. "add r4, r4, r7\n\t"
  141150. #endif
  141151. #ifdef WOLFSSL_KEIL
  141152. "adcs r5, r5, %[r]\n\t"
  141153. #elif defined(__clang__)
  141154. "adcs r5, %[r]\n\t"
  141155. #else
  141156. "adc r5, %[r]\n\t"
  141157. #endif
  141158. "uxth r7, %[b]\n\t"
  141159. #ifdef WOLFSSL_KEIL
  141160. "muls r6, r7, r6\n\t"
  141161. #elif defined(__clang__)
  141162. "muls r6, r7\n\t"
  141163. #else
  141164. "mul r6, r7\n\t"
  141165. #endif
  141166. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141167. "lsrs r7, r6, #16\n\t"
  141168. #else
  141169. "lsr r7, r6, #16\n\t"
  141170. #endif
  141171. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141172. "lsls r6, r6, #16\n\t"
  141173. #else
  141174. "lsl r6, r6, #16\n\t"
  141175. #endif
  141176. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141177. "adds r3, r3, r6\n\t"
  141178. #else
  141179. "add r3, r3, r6\n\t"
  141180. #endif
  141181. #ifdef WOLFSSL_KEIL
  141182. "adcs r4, r4, r7\n\t"
  141183. #elif defined(__clang__)
  141184. "adcs r4, r7\n\t"
  141185. #else
  141186. "adc r4, r7\n\t"
  141187. #endif
  141188. #ifdef WOLFSSL_KEIL
  141189. "adcs r5, r5, %[r]\n\t"
  141190. #elif defined(__clang__)
  141191. "adcs r5, %[r]\n\t"
  141192. #else
  141193. "adc r5, %[r]\n\t"
  141194. #endif
  141195. "# A[3] * B[6]\n\t"
  141196. "mov %[a], r9\n\t"
  141197. "mov %[b], r10\n\t"
  141198. "ldr %[a], [%[a], #12]\n\t"
  141199. "ldr %[b], [%[b], #24]\n\t"
  141200. "uxth r6, %[a]\n\t"
  141201. "uxth r7, %[b]\n\t"
  141202. #ifdef WOLFSSL_KEIL
  141203. "muls r7, r6, r7\n\t"
  141204. #elif defined(__clang__)
  141205. "muls r7, r6\n\t"
  141206. #else
  141207. "mul r7, r6\n\t"
  141208. #endif
  141209. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141210. "adds r3, r3, r7\n\t"
  141211. #else
  141212. "add r3, r3, r7\n\t"
  141213. #endif
  141214. #ifdef WOLFSSL_KEIL
  141215. "adcs r4, r4, %[r]\n\t"
  141216. #elif defined(__clang__)
  141217. "adcs r4, %[r]\n\t"
  141218. #else
  141219. "adc r4, %[r]\n\t"
  141220. #endif
  141221. #ifdef WOLFSSL_KEIL
  141222. "adcs r5, r5, %[r]\n\t"
  141223. #elif defined(__clang__)
  141224. "adcs r5, %[r]\n\t"
  141225. #else
  141226. "adc r5, %[r]\n\t"
  141227. #endif
  141228. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141229. "lsrs r7, %[b], #16\n\t"
  141230. #else
  141231. "lsr r7, %[b], #16\n\t"
  141232. #endif
  141233. #ifdef WOLFSSL_KEIL
  141234. "muls r6, r7, r6\n\t"
  141235. #elif defined(__clang__)
  141236. "muls r6, r7\n\t"
  141237. #else
  141238. "mul r6, r7\n\t"
  141239. #endif
  141240. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141241. "lsrs r7, r6, #16\n\t"
  141242. #else
  141243. "lsr r7, r6, #16\n\t"
  141244. #endif
  141245. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141246. "lsls r6, r6, #16\n\t"
  141247. #else
  141248. "lsl r6, r6, #16\n\t"
  141249. #endif
  141250. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141251. "adds r3, r3, r6\n\t"
  141252. #else
  141253. "add r3, r3, r6\n\t"
  141254. #endif
  141255. #ifdef WOLFSSL_KEIL
  141256. "adcs r4, r4, r7\n\t"
  141257. #elif defined(__clang__)
  141258. "adcs r4, r7\n\t"
  141259. #else
  141260. "adc r4, r7\n\t"
  141261. #endif
  141262. #ifdef WOLFSSL_KEIL
  141263. "adcs r5, r5, %[r]\n\t"
  141264. #elif defined(__clang__)
  141265. "adcs r5, %[r]\n\t"
  141266. #else
  141267. "adc r5, %[r]\n\t"
  141268. #endif
  141269. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141270. "lsrs r6, %[a], #16\n\t"
  141271. #else
  141272. "lsr r6, %[a], #16\n\t"
  141273. #endif
  141274. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141275. "lsrs r7, %[b], #16\n\t"
  141276. #else
  141277. "lsr r7, %[b], #16\n\t"
  141278. #endif
  141279. #ifdef WOLFSSL_KEIL
  141280. "muls r7, r6, r7\n\t"
  141281. #elif defined(__clang__)
  141282. "muls r7, r6\n\t"
  141283. #else
  141284. "mul r7, r6\n\t"
  141285. #endif
  141286. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141287. "adds r4, r4, r7\n\t"
  141288. #else
  141289. "add r4, r4, r7\n\t"
  141290. #endif
  141291. #ifdef WOLFSSL_KEIL
  141292. "adcs r5, r5, %[r]\n\t"
  141293. #elif defined(__clang__)
  141294. "adcs r5, %[r]\n\t"
  141295. #else
  141296. "adc r5, %[r]\n\t"
  141297. #endif
  141298. "uxth r7, %[b]\n\t"
  141299. #ifdef WOLFSSL_KEIL
  141300. "muls r6, r7, r6\n\t"
  141301. #elif defined(__clang__)
  141302. "muls r6, r7\n\t"
  141303. #else
  141304. "mul r6, r7\n\t"
  141305. #endif
  141306. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141307. "lsrs r7, r6, #16\n\t"
  141308. #else
  141309. "lsr r7, r6, #16\n\t"
  141310. #endif
  141311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141312. "lsls r6, r6, #16\n\t"
  141313. #else
  141314. "lsl r6, r6, #16\n\t"
  141315. #endif
  141316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141317. "adds r3, r3, r6\n\t"
  141318. #else
  141319. "add r3, r3, r6\n\t"
  141320. #endif
  141321. #ifdef WOLFSSL_KEIL
  141322. "adcs r4, r4, r7\n\t"
  141323. #elif defined(__clang__)
  141324. "adcs r4, r7\n\t"
  141325. #else
  141326. "adc r4, r7\n\t"
  141327. #endif
  141328. #ifdef WOLFSSL_KEIL
  141329. "adcs r5, r5, %[r]\n\t"
  141330. #elif defined(__clang__)
  141331. "adcs r5, %[r]\n\t"
  141332. #else
  141333. "adc r5, %[r]\n\t"
  141334. #endif
  141335. "# A[4] * B[5]\n\t"
  141336. "mov %[a], r9\n\t"
  141337. "mov %[b], r10\n\t"
  141338. "ldr %[a], [%[a], #16]\n\t"
  141339. "ldr %[b], [%[b], #20]\n\t"
  141340. "uxth r6, %[a]\n\t"
  141341. "uxth r7, %[b]\n\t"
  141342. #ifdef WOLFSSL_KEIL
  141343. "muls r7, r6, r7\n\t"
  141344. #elif defined(__clang__)
  141345. "muls r7, r6\n\t"
  141346. #else
  141347. "mul r7, r6\n\t"
  141348. #endif
  141349. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141350. "adds r3, r3, r7\n\t"
  141351. #else
  141352. "add r3, r3, r7\n\t"
  141353. #endif
  141354. #ifdef WOLFSSL_KEIL
  141355. "adcs r4, r4, %[r]\n\t"
  141356. #elif defined(__clang__)
  141357. "adcs r4, %[r]\n\t"
  141358. #else
  141359. "adc r4, %[r]\n\t"
  141360. #endif
  141361. #ifdef WOLFSSL_KEIL
  141362. "adcs r5, r5, %[r]\n\t"
  141363. #elif defined(__clang__)
  141364. "adcs r5, %[r]\n\t"
  141365. #else
  141366. "adc r5, %[r]\n\t"
  141367. #endif
  141368. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141369. "lsrs r7, %[b], #16\n\t"
  141370. #else
  141371. "lsr r7, %[b], #16\n\t"
  141372. #endif
  141373. #ifdef WOLFSSL_KEIL
  141374. "muls r6, r7, r6\n\t"
  141375. #elif defined(__clang__)
  141376. "muls r6, r7\n\t"
  141377. #else
  141378. "mul r6, r7\n\t"
  141379. #endif
  141380. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141381. "lsrs r7, r6, #16\n\t"
  141382. #else
  141383. "lsr r7, r6, #16\n\t"
  141384. #endif
  141385. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141386. "lsls r6, r6, #16\n\t"
  141387. #else
  141388. "lsl r6, r6, #16\n\t"
  141389. #endif
  141390. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141391. "adds r3, r3, r6\n\t"
  141392. #else
  141393. "add r3, r3, r6\n\t"
  141394. #endif
  141395. #ifdef WOLFSSL_KEIL
  141396. "adcs r4, r4, r7\n\t"
  141397. #elif defined(__clang__)
  141398. "adcs r4, r7\n\t"
  141399. #else
  141400. "adc r4, r7\n\t"
  141401. #endif
  141402. #ifdef WOLFSSL_KEIL
  141403. "adcs r5, r5, %[r]\n\t"
  141404. #elif defined(__clang__)
  141405. "adcs r5, %[r]\n\t"
  141406. #else
  141407. "adc r5, %[r]\n\t"
  141408. #endif
  141409. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141410. "lsrs r6, %[a], #16\n\t"
  141411. #else
  141412. "lsr r6, %[a], #16\n\t"
  141413. #endif
  141414. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141415. "lsrs r7, %[b], #16\n\t"
  141416. #else
  141417. "lsr r7, %[b], #16\n\t"
  141418. #endif
  141419. #ifdef WOLFSSL_KEIL
  141420. "muls r7, r6, r7\n\t"
  141421. #elif defined(__clang__)
  141422. "muls r7, r6\n\t"
  141423. #else
  141424. "mul r7, r6\n\t"
  141425. #endif
  141426. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141427. "adds r4, r4, r7\n\t"
  141428. #else
  141429. "add r4, r4, r7\n\t"
  141430. #endif
  141431. #ifdef WOLFSSL_KEIL
  141432. "adcs r5, r5, %[r]\n\t"
  141433. #elif defined(__clang__)
  141434. "adcs r5, %[r]\n\t"
  141435. #else
  141436. "adc r5, %[r]\n\t"
  141437. #endif
  141438. "uxth r7, %[b]\n\t"
  141439. #ifdef WOLFSSL_KEIL
  141440. "muls r6, r7, r6\n\t"
  141441. #elif defined(__clang__)
  141442. "muls r6, r7\n\t"
  141443. #else
  141444. "mul r6, r7\n\t"
  141445. #endif
  141446. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141447. "lsrs r7, r6, #16\n\t"
  141448. #else
  141449. "lsr r7, r6, #16\n\t"
  141450. #endif
  141451. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141452. "lsls r6, r6, #16\n\t"
  141453. #else
  141454. "lsl r6, r6, #16\n\t"
  141455. #endif
  141456. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141457. "adds r3, r3, r6\n\t"
  141458. #else
  141459. "add r3, r3, r6\n\t"
  141460. #endif
  141461. #ifdef WOLFSSL_KEIL
  141462. "adcs r4, r4, r7\n\t"
  141463. #elif defined(__clang__)
  141464. "adcs r4, r7\n\t"
  141465. #else
  141466. "adc r4, r7\n\t"
  141467. #endif
  141468. #ifdef WOLFSSL_KEIL
  141469. "adcs r5, r5, %[r]\n\t"
  141470. #elif defined(__clang__)
  141471. "adcs r5, %[r]\n\t"
  141472. #else
  141473. "adc r5, %[r]\n\t"
  141474. #endif
  141475. "# A[5] * B[4]\n\t"
  141476. "mov %[a], r9\n\t"
  141477. "mov %[b], r10\n\t"
  141478. "ldr %[a], [%[a], #20]\n\t"
  141479. "ldr %[b], [%[b], #16]\n\t"
  141480. "uxth r6, %[a]\n\t"
  141481. "uxth r7, %[b]\n\t"
  141482. #ifdef WOLFSSL_KEIL
  141483. "muls r7, r6, r7\n\t"
  141484. #elif defined(__clang__)
  141485. "muls r7, r6\n\t"
  141486. #else
  141487. "mul r7, r6\n\t"
  141488. #endif
  141489. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141490. "adds r3, r3, r7\n\t"
  141491. #else
  141492. "add r3, r3, r7\n\t"
  141493. #endif
  141494. #ifdef WOLFSSL_KEIL
  141495. "adcs r4, r4, %[r]\n\t"
  141496. #elif defined(__clang__)
  141497. "adcs r4, %[r]\n\t"
  141498. #else
  141499. "adc r4, %[r]\n\t"
  141500. #endif
  141501. #ifdef WOLFSSL_KEIL
  141502. "adcs r5, r5, %[r]\n\t"
  141503. #elif defined(__clang__)
  141504. "adcs r5, %[r]\n\t"
  141505. #else
  141506. "adc r5, %[r]\n\t"
  141507. #endif
  141508. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141509. "lsrs r7, %[b], #16\n\t"
  141510. #else
  141511. "lsr r7, %[b], #16\n\t"
  141512. #endif
  141513. #ifdef WOLFSSL_KEIL
  141514. "muls r6, r7, r6\n\t"
  141515. #elif defined(__clang__)
  141516. "muls r6, r7\n\t"
  141517. #else
  141518. "mul r6, r7\n\t"
  141519. #endif
  141520. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141521. "lsrs r7, r6, #16\n\t"
  141522. #else
  141523. "lsr r7, r6, #16\n\t"
  141524. #endif
  141525. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141526. "lsls r6, r6, #16\n\t"
  141527. #else
  141528. "lsl r6, r6, #16\n\t"
  141529. #endif
  141530. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141531. "adds r3, r3, r6\n\t"
  141532. #else
  141533. "add r3, r3, r6\n\t"
  141534. #endif
  141535. #ifdef WOLFSSL_KEIL
  141536. "adcs r4, r4, r7\n\t"
  141537. #elif defined(__clang__)
  141538. "adcs r4, r7\n\t"
  141539. #else
  141540. "adc r4, r7\n\t"
  141541. #endif
  141542. #ifdef WOLFSSL_KEIL
  141543. "adcs r5, r5, %[r]\n\t"
  141544. #elif defined(__clang__)
  141545. "adcs r5, %[r]\n\t"
  141546. #else
  141547. "adc r5, %[r]\n\t"
  141548. #endif
  141549. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141550. "lsrs r6, %[a], #16\n\t"
  141551. #else
  141552. "lsr r6, %[a], #16\n\t"
  141553. #endif
  141554. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141555. "lsrs r7, %[b], #16\n\t"
  141556. #else
  141557. "lsr r7, %[b], #16\n\t"
  141558. #endif
  141559. #ifdef WOLFSSL_KEIL
  141560. "muls r7, r6, r7\n\t"
  141561. #elif defined(__clang__)
  141562. "muls r7, r6\n\t"
  141563. #else
  141564. "mul r7, r6\n\t"
  141565. #endif
  141566. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141567. "adds r4, r4, r7\n\t"
  141568. #else
  141569. "add r4, r4, r7\n\t"
  141570. #endif
  141571. #ifdef WOLFSSL_KEIL
  141572. "adcs r5, r5, %[r]\n\t"
  141573. #elif defined(__clang__)
  141574. "adcs r5, %[r]\n\t"
  141575. #else
  141576. "adc r5, %[r]\n\t"
  141577. #endif
  141578. "uxth r7, %[b]\n\t"
  141579. #ifdef WOLFSSL_KEIL
  141580. "muls r6, r7, r6\n\t"
  141581. #elif defined(__clang__)
  141582. "muls r6, r7\n\t"
  141583. #else
  141584. "mul r6, r7\n\t"
  141585. #endif
  141586. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141587. "lsrs r7, r6, #16\n\t"
  141588. #else
  141589. "lsr r7, r6, #16\n\t"
  141590. #endif
  141591. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141592. "lsls r6, r6, #16\n\t"
  141593. #else
  141594. "lsl r6, r6, #16\n\t"
  141595. #endif
  141596. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141597. "adds r3, r3, r6\n\t"
  141598. #else
  141599. "add r3, r3, r6\n\t"
  141600. #endif
  141601. #ifdef WOLFSSL_KEIL
  141602. "adcs r4, r4, r7\n\t"
  141603. #elif defined(__clang__)
  141604. "adcs r4, r7\n\t"
  141605. #else
  141606. "adc r4, r7\n\t"
  141607. #endif
  141608. #ifdef WOLFSSL_KEIL
  141609. "adcs r5, r5, %[r]\n\t"
  141610. #elif defined(__clang__)
  141611. "adcs r5, %[r]\n\t"
  141612. #else
  141613. "adc r5, %[r]\n\t"
  141614. #endif
  141615. "# A[6] * B[3]\n\t"
  141616. "mov %[a], r9\n\t"
  141617. "mov %[b], r10\n\t"
  141618. "ldr %[a], [%[a], #24]\n\t"
  141619. "ldr %[b], [%[b], #12]\n\t"
  141620. "uxth r6, %[a]\n\t"
  141621. "uxth r7, %[b]\n\t"
  141622. #ifdef WOLFSSL_KEIL
  141623. "muls r7, r6, r7\n\t"
  141624. #elif defined(__clang__)
  141625. "muls r7, r6\n\t"
  141626. #else
  141627. "mul r7, r6\n\t"
  141628. #endif
  141629. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141630. "adds r3, r3, r7\n\t"
  141631. #else
  141632. "add r3, r3, r7\n\t"
  141633. #endif
  141634. #ifdef WOLFSSL_KEIL
  141635. "adcs r4, r4, %[r]\n\t"
  141636. #elif defined(__clang__)
  141637. "adcs r4, %[r]\n\t"
  141638. #else
  141639. "adc r4, %[r]\n\t"
  141640. #endif
  141641. #ifdef WOLFSSL_KEIL
  141642. "adcs r5, r5, %[r]\n\t"
  141643. #elif defined(__clang__)
  141644. "adcs r5, %[r]\n\t"
  141645. #else
  141646. "adc r5, %[r]\n\t"
  141647. #endif
  141648. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141649. "lsrs r7, %[b], #16\n\t"
  141650. #else
  141651. "lsr r7, %[b], #16\n\t"
  141652. #endif
  141653. #ifdef WOLFSSL_KEIL
  141654. "muls r6, r7, r6\n\t"
  141655. #elif defined(__clang__)
  141656. "muls r6, r7\n\t"
  141657. #else
  141658. "mul r6, r7\n\t"
  141659. #endif
  141660. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141661. "lsrs r7, r6, #16\n\t"
  141662. #else
  141663. "lsr r7, r6, #16\n\t"
  141664. #endif
  141665. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141666. "lsls r6, r6, #16\n\t"
  141667. #else
  141668. "lsl r6, r6, #16\n\t"
  141669. #endif
  141670. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141671. "adds r3, r3, r6\n\t"
  141672. #else
  141673. "add r3, r3, r6\n\t"
  141674. #endif
  141675. #ifdef WOLFSSL_KEIL
  141676. "adcs r4, r4, r7\n\t"
  141677. #elif defined(__clang__)
  141678. "adcs r4, r7\n\t"
  141679. #else
  141680. "adc r4, r7\n\t"
  141681. #endif
  141682. #ifdef WOLFSSL_KEIL
  141683. "adcs r5, r5, %[r]\n\t"
  141684. #elif defined(__clang__)
  141685. "adcs r5, %[r]\n\t"
  141686. #else
  141687. "adc r5, %[r]\n\t"
  141688. #endif
  141689. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141690. "lsrs r6, %[a], #16\n\t"
  141691. #else
  141692. "lsr r6, %[a], #16\n\t"
  141693. #endif
  141694. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141695. "lsrs r7, %[b], #16\n\t"
  141696. #else
  141697. "lsr r7, %[b], #16\n\t"
  141698. #endif
  141699. #ifdef WOLFSSL_KEIL
  141700. "muls r7, r6, r7\n\t"
  141701. #elif defined(__clang__)
  141702. "muls r7, r6\n\t"
  141703. #else
  141704. "mul r7, r6\n\t"
  141705. #endif
  141706. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141707. "adds r4, r4, r7\n\t"
  141708. #else
  141709. "add r4, r4, r7\n\t"
  141710. #endif
  141711. #ifdef WOLFSSL_KEIL
  141712. "adcs r5, r5, %[r]\n\t"
  141713. #elif defined(__clang__)
  141714. "adcs r5, %[r]\n\t"
  141715. #else
  141716. "adc r5, %[r]\n\t"
  141717. #endif
  141718. "uxth r7, %[b]\n\t"
  141719. #ifdef WOLFSSL_KEIL
  141720. "muls r6, r7, r6\n\t"
  141721. #elif defined(__clang__)
  141722. "muls r6, r7\n\t"
  141723. #else
  141724. "mul r6, r7\n\t"
  141725. #endif
  141726. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141727. "lsrs r7, r6, #16\n\t"
  141728. #else
  141729. "lsr r7, r6, #16\n\t"
  141730. #endif
  141731. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141732. "lsls r6, r6, #16\n\t"
  141733. #else
  141734. "lsl r6, r6, #16\n\t"
  141735. #endif
  141736. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141737. "adds r3, r3, r6\n\t"
  141738. #else
  141739. "add r3, r3, r6\n\t"
  141740. #endif
  141741. #ifdef WOLFSSL_KEIL
  141742. "adcs r4, r4, r7\n\t"
  141743. #elif defined(__clang__)
  141744. "adcs r4, r7\n\t"
  141745. #else
  141746. "adc r4, r7\n\t"
  141747. #endif
  141748. #ifdef WOLFSSL_KEIL
  141749. "adcs r5, r5, %[r]\n\t"
  141750. #elif defined(__clang__)
  141751. "adcs r5, %[r]\n\t"
  141752. #else
  141753. "adc r5, %[r]\n\t"
  141754. #endif
  141755. "# A[7] * B[2]\n\t"
  141756. "mov %[a], r9\n\t"
  141757. "mov %[b], r10\n\t"
  141758. "ldr %[a], [%[a], #28]\n\t"
  141759. "ldr %[b], [%[b], #8]\n\t"
  141760. "uxth r6, %[a]\n\t"
  141761. "uxth r7, %[b]\n\t"
  141762. #ifdef WOLFSSL_KEIL
  141763. "muls r7, r6, r7\n\t"
  141764. #elif defined(__clang__)
  141765. "muls r7, r6\n\t"
  141766. #else
  141767. "mul r7, r6\n\t"
  141768. #endif
  141769. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141770. "adds r3, r3, r7\n\t"
  141771. #else
  141772. "add r3, r3, r7\n\t"
  141773. #endif
  141774. #ifdef WOLFSSL_KEIL
  141775. "adcs r4, r4, %[r]\n\t"
  141776. #elif defined(__clang__)
  141777. "adcs r4, %[r]\n\t"
  141778. #else
  141779. "adc r4, %[r]\n\t"
  141780. #endif
  141781. #ifdef WOLFSSL_KEIL
  141782. "adcs r5, r5, %[r]\n\t"
  141783. #elif defined(__clang__)
  141784. "adcs r5, %[r]\n\t"
  141785. #else
  141786. "adc r5, %[r]\n\t"
  141787. #endif
  141788. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141789. "lsrs r7, %[b], #16\n\t"
  141790. #else
  141791. "lsr r7, %[b], #16\n\t"
  141792. #endif
  141793. #ifdef WOLFSSL_KEIL
  141794. "muls r6, r7, r6\n\t"
  141795. #elif defined(__clang__)
  141796. "muls r6, r7\n\t"
  141797. #else
  141798. "mul r6, r7\n\t"
  141799. #endif
  141800. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141801. "lsrs r7, r6, #16\n\t"
  141802. #else
  141803. "lsr r7, r6, #16\n\t"
  141804. #endif
  141805. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141806. "lsls r6, r6, #16\n\t"
  141807. #else
  141808. "lsl r6, r6, #16\n\t"
  141809. #endif
  141810. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141811. "adds r3, r3, r6\n\t"
  141812. #else
  141813. "add r3, r3, r6\n\t"
  141814. #endif
  141815. #ifdef WOLFSSL_KEIL
  141816. "adcs r4, r4, r7\n\t"
  141817. #elif defined(__clang__)
  141818. "adcs r4, r7\n\t"
  141819. #else
  141820. "adc r4, r7\n\t"
  141821. #endif
  141822. #ifdef WOLFSSL_KEIL
  141823. "adcs r5, r5, %[r]\n\t"
  141824. #elif defined(__clang__)
  141825. "adcs r5, %[r]\n\t"
  141826. #else
  141827. "adc r5, %[r]\n\t"
  141828. #endif
  141829. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141830. "lsrs r6, %[a], #16\n\t"
  141831. #else
  141832. "lsr r6, %[a], #16\n\t"
  141833. #endif
  141834. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141835. "lsrs r7, %[b], #16\n\t"
  141836. #else
  141837. "lsr r7, %[b], #16\n\t"
  141838. #endif
  141839. #ifdef WOLFSSL_KEIL
  141840. "muls r7, r6, r7\n\t"
  141841. #elif defined(__clang__)
  141842. "muls r7, r6\n\t"
  141843. #else
  141844. "mul r7, r6\n\t"
  141845. #endif
  141846. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141847. "adds r4, r4, r7\n\t"
  141848. #else
  141849. "add r4, r4, r7\n\t"
  141850. #endif
  141851. #ifdef WOLFSSL_KEIL
  141852. "adcs r5, r5, %[r]\n\t"
  141853. #elif defined(__clang__)
  141854. "adcs r5, %[r]\n\t"
  141855. #else
  141856. "adc r5, %[r]\n\t"
  141857. #endif
  141858. "uxth r7, %[b]\n\t"
  141859. #ifdef WOLFSSL_KEIL
  141860. "muls r6, r7, r6\n\t"
  141861. #elif defined(__clang__)
  141862. "muls r6, r7\n\t"
  141863. #else
  141864. "mul r6, r7\n\t"
  141865. #endif
  141866. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141867. "lsrs r7, r6, #16\n\t"
  141868. #else
  141869. "lsr r7, r6, #16\n\t"
  141870. #endif
  141871. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141872. "lsls r6, r6, #16\n\t"
  141873. #else
  141874. "lsl r6, r6, #16\n\t"
  141875. #endif
  141876. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141877. "adds r3, r3, r6\n\t"
  141878. #else
  141879. "add r3, r3, r6\n\t"
  141880. #endif
  141881. #ifdef WOLFSSL_KEIL
  141882. "adcs r4, r4, r7\n\t"
  141883. #elif defined(__clang__)
  141884. "adcs r4, r7\n\t"
  141885. #else
  141886. "adc r4, r7\n\t"
  141887. #endif
  141888. #ifdef WOLFSSL_KEIL
  141889. "adcs r5, r5, %[r]\n\t"
  141890. #elif defined(__clang__)
  141891. "adcs r5, %[r]\n\t"
  141892. #else
  141893. "adc r5, %[r]\n\t"
  141894. #endif
  141895. "# A[8] * B[1]\n\t"
  141896. "mov %[a], r9\n\t"
  141897. "mov %[b], r10\n\t"
  141898. "ldr %[a], [%[a], #32]\n\t"
  141899. "ldr %[b], [%[b], #4]\n\t"
  141900. "uxth r6, %[a]\n\t"
  141901. "uxth r7, %[b]\n\t"
  141902. #ifdef WOLFSSL_KEIL
  141903. "muls r7, r6, r7\n\t"
  141904. #elif defined(__clang__)
  141905. "muls r7, r6\n\t"
  141906. #else
  141907. "mul r7, r6\n\t"
  141908. #endif
  141909. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141910. "adds r3, r3, r7\n\t"
  141911. #else
  141912. "add r3, r3, r7\n\t"
  141913. #endif
  141914. #ifdef WOLFSSL_KEIL
  141915. "adcs r4, r4, %[r]\n\t"
  141916. #elif defined(__clang__)
  141917. "adcs r4, %[r]\n\t"
  141918. #else
  141919. "adc r4, %[r]\n\t"
  141920. #endif
  141921. #ifdef WOLFSSL_KEIL
  141922. "adcs r5, r5, %[r]\n\t"
  141923. #elif defined(__clang__)
  141924. "adcs r5, %[r]\n\t"
  141925. #else
  141926. "adc r5, %[r]\n\t"
  141927. #endif
  141928. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141929. "lsrs r7, %[b], #16\n\t"
  141930. #else
  141931. "lsr r7, %[b], #16\n\t"
  141932. #endif
  141933. #ifdef WOLFSSL_KEIL
  141934. "muls r6, r7, r6\n\t"
  141935. #elif defined(__clang__)
  141936. "muls r6, r7\n\t"
  141937. #else
  141938. "mul r6, r7\n\t"
  141939. #endif
  141940. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141941. "lsrs r7, r6, #16\n\t"
  141942. #else
  141943. "lsr r7, r6, #16\n\t"
  141944. #endif
  141945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141946. "lsls r6, r6, #16\n\t"
  141947. #else
  141948. "lsl r6, r6, #16\n\t"
  141949. #endif
  141950. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141951. "adds r3, r3, r6\n\t"
  141952. #else
  141953. "add r3, r3, r6\n\t"
  141954. #endif
  141955. #ifdef WOLFSSL_KEIL
  141956. "adcs r4, r4, r7\n\t"
  141957. #elif defined(__clang__)
  141958. "adcs r4, r7\n\t"
  141959. #else
  141960. "adc r4, r7\n\t"
  141961. #endif
  141962. #ifdef WOLFSSL_KEIL
  141963. "adcs r5, r5, %[r]\n\t"
  141964. #elif defined(__clang__)
  141965. "adcs r5, %[r]\n\t"
  141966. #else
  141967. "adc r5, %[r]\n\t"
  141968. #endif
  141969. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141970. "lsrs r6, %[a], #16\n\t"
  141971. #else
  141972. "lsr r6, %[a], #16\n\t"
  141973. #endif
  141974. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141975. "lsrs r7, %[b], #16\n\t"
  141976. #else
  141977. "lsr r7, %[b], #16\n\t"
  141978. #endif
  141979. #ifdef WOLFSSL_KEIL
  141980. "muls r7, r6, r7\n\t"
  141981. #elif defined(__clang__)
  141982. "muls r7, r6\n\t"
  141983. #else
  141984. "mul r7, r6\n\t"
  141985. #endif
  141986. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141987. "adds r4, r4, r7\n\t"
  141988. #else
  141989. "add r4, r4, r7\n\t"
  141990. #endif
  141991. #ifdef WOLFSSL_KEIL
  141992. "adcs r5, r5, %[r]\n\t"
  141993. #elif defined(__clang__)
  141994. "adcs r5, %[r]\n\t"
  141995. #else
  141996. "adc r5, %[r]\n\t"
  141997. #endif
  141998. "uxth r7, %[b]\n\t"
  141999. #ifdef WOLFSSL_KEIL
  142000. "muls r6, r7, r6\n\t"
  142001. #elif defined(__clang__)
  142002. "muls r6, r7\n\t"
  142003. #else
  142004. "mul r6, r7\n\t"
  142005. #endif
  142006. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142007. "lsrs r7, r6, #16\n\t"
  142008. #else
  142009. "lsr r7, r6, #16\n\t"
  142010. #endif
  142011. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142012. "lsls r6, r6, #16\n\t"
  142013. #else
  142014. "lsl r6, r6, #16\n\t"
  142015. #endif
  142016. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142017. "adds r3, r3, r6\n\t"
  142018. #else
  142019. "add r3, r3, r6\n\t"
  142020. #endif
  142021. #ifdef WOLFSSL_KEIL
  142022. "adcs r4, r4, r7\n\t"
  142023. #elif defined(__clang__)
  142024. "adcs r4, r7\n\t"
  142025. #else
  142026. "adc r4, r7\n\t"
  142027. #endif
  142028. #ifdef WOLFSSL_KEIL
  142029. "adcs r5, r5, %[r]\n\t"
  142030. #elif defined(__clang__)
  142031. "adcs r5, %[r]\n\t"
  142032. #else
  142033. "adc r5, %[r]\n\t"
  142034. #endif
  142035. "# A[9] * B[0]\n\t"
  142036. "mov %[a], r9\n\t"
  142037. "mov %[b], r10\n\t"
  142038. "ldr %[a], [%[a], #36]\n\t"
  142039. "ldr %[b], [%[b]]\n\t"
  142040. "uxth r6, %[a]\n\t"
  142041. "uxth r7, %[b]\n\t"
  142042. #ifdef WOLFSSL_KEIL
  142043. "muls r7, r6, r7\n\t"
  142044. #elif defined(__clang__)
  142045. "muls r7, r6\n\t"
  142046. #else
  142047. "mul r7, r6\n\t"
  142048. #endif
  142049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142050. "adds r3, r3, r7\n\t"
  142051. #else
  142052. "add r3, r3, r7\n\t"
  142053. #endif
  142054. #ifdef WOLFSSL_KEIL
  142055. "adcs r4, r4, %[r]\n\t"
  142056. #elif defined(__clang__)
  142057. "adcs r4, %[r]\n\t"
  142058. #else
  142059. "adc r4, %[r]\n\t"
  142060. #endif
  142061. #ifdef WOLFSSL_KEIL
  142062. "adcs r5, r5, %[r]\n\t"
  142063. #elif defined(__clang__)
  142064. "adcs r5, %[r]\n\t"
  142065. #else
  142066. "adc r5, %[r]\n\t"
  142067. #endif
  142068. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142069. "lsrs r7, %[b], #16\n\t"
  142070. #else
  142071. "lsr r7, %[b], #16\n\t"
  142072. #endif
  142073. #ifdef WOLFSSL_KEIL
  142074. "muls r6, r7, r6\n\t"
  142075. #elif defined(__clang__)
  142076. "muls r6, r7\n\t"
  142077. #else
  142078. "mul r6, r7\n\t"
  142079. #endif
  142080. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142081. "lsrs r7, r6, #16\n\t"
  142082. #else
  142083. "lsr r7, r6, #16\n\t"
  142084. #endif
  142085. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142086. "lsls r6, r6, #16\n\t"
  142087. #else
  142088. "lsl r6, r6, #16\n\t"
  142089. #endif
  142090. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142091. "adds r3, r3, r6\n\t"
  142092. #else
  142093. "add r3, r3, r6\n\t"
  142094. #endif
  142095. #ifdef WOLFSSL_KEIL
  142096. "adcs r4, r4, r7\n\t"
  142097. #elif defined(__clang__)
  142098. "adcs r4, r7\n\t"
  142099. #else
  142100. "adc r4, r7\n\t"
  142101. #endif
  142102. #ifdef WOLFSSL_KEIL
  142103. "adcs r5, r5, %[r]\n\t"
  142104. #elif defined(__clang__)
  142105. "adcs r5, %[r]\n\t"
  142106. #else
  142107. "adc r5, %[r]\n\t"
  142108. #endif
  142109. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142110. "lsrs r6, %[a], #16\n\t"
  142111. #else
  142112. "lsr r6, %[a], #16\n\t"
  142113. #endif
  142114. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142115. "lsrs r7, %[b], #16\n\t"
  142116. #else
  142117. "lsr r7, %[b], #16\n\t"
  142118. #endif
  142119. #ifdef WOLFSSL_KEIL
  142120. "muls r7, r6, r7\n\t"
  142121. #elif defined(__clang__)
  142122. "muls r7, r6\n\t"
  142123. #else
  142124. "mul r7, r6\n\t"
  142125. #endif
  142126. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142127. "adds r4, r4, r7\n\t"
  142128. #else
  142129. "add r4, r4, r7\n\t"
  142130. #endif
  142131. #ifdef WOLFSSL_KEIL
  142132. "adcs r5, r5, %[r]\n\t"
  142133. #elif defined(__clang__)
  142134. "adcs r5, %[r]\n\t"
  142135. #else
  142136. "adc r5, %[r]\n\t"
  142137. #endif
  142138. "uxth r7, %[b]\n\t"
  142139. #ifdef WOLFSSL_KEIL
  142140. "muls r6, r7, r6\n\t"
  142141. #elif defined(__clang__)
  142142. "muls r6, r7\n\t"
  142143. #else
  142144. "mul r6, r7\n\t"
  142145. #endif
  142146. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142147. "lsrs r7, r6, #16\n\t"
  142148. #else
  142149. "lsr r7, r6, #16\n\t"
  142150. #endif
  142151. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142152. "lsls r6, r6, #16\n\t"
  142153. #else
  142154. "lsl r6, r6, #16\n\t"
  142155. #endif
  142156. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142157. "adds r3, r3, r6\n\t"
  142158. #else
  142159. "add r3, r3, r6\n\t"
  142160. #endif
  142161. #ifdef WOLFSSL_KEIL
  142162. "adcs r4, r4, r7\n\t"
  142163. #elif defined(__clang__)
  142164. "adcs r4, r7\n\t"
  142165. #else
  142166. "adc r4, r7\n\t"
  142167. #endif
  142168. #ifdef WOLFSSL_KEIL
  142169. "adcs r5, r5, %[r]\n\t"
  142170. #elif defined(__clang__)
  142171. "adcs r5, %[r]\n\t"
  142172. #else
  142173. "adc r5, %[r]\n\t"
  142174. #endif
  142175. "str r3, [sp, #36]\n\t"
  142176. "# A[10] * B[0]\n\t"
  142177. "movs r3, #0\n\t"
  142178. "mov %[a], r9\n\t"
  142179. "mov %[b], r10\n\t"
  142180. "ldr %[a], [%[a], #40]\n\t"
  142181. "ldr %[b], [%[b]]\n\t"
  142182. "uxth r6, %[a]\n\t"
  142183. "uxth r7, %[b]\n\t"
  142184. #ifdef WOLFSSL_KEIL
  142185. "muls r7, r6, r7\n\t"
  142186. #elif defined(__clang__)
  142187. "muls r7, r6\n\t"
  142188. #else
  142189. "mul r7, r6\n\t"
  142190. #endif
  142191. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142192. "adds r4, r4, r7\n\t"
  142193. #else
  142194. "add r4, r4, r7\n\t"
  142195. #endif
  142196. #ifdef WOLFSSL_KEIL
  142197. "adcs r5, r5, %[r]\n\t"
  142198. #elif defined(__clang__)
  142199. "adcs r5, %[r]\n\t"
  142200. #else
  142201. "adc r5, %[r]\n\t"
  142202. #endif
  142203. #ifdef WOLFSSL_KEIL
  142204. "adcs r3, r3, %[r]\n\t"
  142205. #elif defined(__clang__)
  142206. "adcs r3, %[r]\n\t"
  142207. #else
  142208. "adc r3, %[r]\n\t"
  142209. #endif
  142210. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142211. "lsrs r7, %[b], #16\n\t"
  142212. #else
  142213. "lsr r7, %[b], #16\n\t"
  142214. #endif
  142215. #ifdef WOLFSSL_KEIL
  142216. "muls r6, r7, r6\n\t"
  142217. #elif defined(__clang__)
  142218. "muls r6, r7\n\t"
  142219. #else
  142220. "mul r6, r7\n\t"
  142221. #endif
  142222. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142223. "lsrs r7, r6, #16\n\t"
  142224. #else
  142225. "lsr r7, r6, #16\n\t"
  142226. #endif
  142227. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142228. "lsls r6, r6, #16\n\t"
  142229. #else
  142230. "lsl r6, r6, #16\n\t"
  142231. #endif
  142232. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142233. "adds r4, r4, r6\n\t"
  142234. #else
  142235. "add r4, r4, r6\n\t"
  142236. #endif
  142237. #ifdef WOLFSSL_KEIL
  142238. "adcs r5, r5, r7\n\t"
  142239. #elif defined(__clang__)
  142240. "adcs r5, r7\n\t"
  142241. #else
  142242. "adc r5, r7\n\t"
  142243. #endif
  142244. #ifdef WOLFSSL_KEIL
  142245. "adcs r3, r3, %[r]\n\t"
  142246. #elif defined(__clang__)
  142247. "adcs r3, %[r]\n\t"
  142248. #else
  142249. "adc r3, %[r]\n\t"
  142250. #endif
  142251. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142252. "lsrs r6, %[a], #16\n\t"
  142253. #else
  142254. "lsr r6, %[a], #16\n\t"
  142255. #endif
  142256. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142257. "lsrs r7, %[b], #16\n\t"
  142258. #else
  142259. "lsr r7, %[b], #16\n\t"
  142260. #endif
  142261. #ifdef WOLFSSL_KEIL
  142262. "muls r7, r6, r7\n\t"
  142263. #elif defined(__clang__)
  142264. "muls r7, r6\n\t"
  142265. #else
  142266. "mul r7, r6\n\t"
  142267. #endif
  142268. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142269. "adds r5, r5, r7\n\t"
  142270. #else
  142271. "add r5, r5, r7\n\t"
  142272. #endif
  142273. #ifdef WOLFSSL_KEIL
  142274. "adcs r3, r3, %[r]\n\t"
  142275. #elif defined(__clang__)
  142276. "adcs r3, %[r]\n\t"
  142277. #else
  142278. "adc r3, %[r]\n\t"
  142279. #endif
  142280. "uxth r7, %[b]\n\t"
  142281. #ifdef WOLFSSL_KEIL
  142282. "muls r6, r7, r6\n\t"
  142283. #elif defined(__clang__)
  142284. "muls r6, r7\n\t"
  142285. #else
  142286. "mul r6, r7\n\t"
  142287. #endif
  142288. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142289. "lsrs r7, r6, #16\n\t"
  142290. #else
  142291. "lsr r7, r6, #16\n\t"
  142292. #endif
  142293. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142294. "lsls r6, r6, #16\n\t"
  142295. #else
  142296. "lsl r6, r6, #16\n\t"
  142297. #endif
  142298. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142299. "adds r4, r4, r6\n\t"
  142300. #else
  142301. "add r4, r4, r6\n\t"
  142302. #endif
  142303. #ifdef WOLFSSL_KEIL
  142304. "adcs r5, r5, r7\n\t"
  142305. #elif defined(__clang__)
  142306. "adcs r5, r7\n\t"
  142307. #else
  142308. "adc 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. "# A[9] * B[1]\n\t"
  142318. "mov %[a], r9\n\t"
  142319. "mov %[b], r10\n\t"
  142320. "ldr %[a], [%[a], #36]\n\t"
  142321. "ldr %[b], [%[b], #4]\n\t"
  142322. "uxth r6, %[a]\n\t"
  142323. "uxth r7, %[b]\n\t"
  142324. #ifdef WOLFSSL_KEIL
  142325. "muls r7, r6, r7\n\t"
  142326. #elif defined(__clang__)
  142327. "muls r7, r6\n\t"
  142328. #else
  142329. "mul r7, r6\n\t"
  142330. #endif
  142331. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142332. "adds r4, r4, r7\n\t"
  142333. #else
  142334. "add r4, r4, r7\n\t"
  142335. #endif
  142336. #ifdef WOLFSSL_KEIL
  142337. "adcs r5, r5, %[r]\n\t"
  142338. #elif defined(__clang__)
  142339. "adcs r5, %[r]\n\t"
  142340. #else
  142341. "adc r5, %[r]\n\t"
  142342. #endif
  142343. #ifdef WOLFSSL_KEIL
  142344. "adcs r3, r3, %[r]\n\t"
  142345. #elif defined(__clang__)
  142346. "adcs r3, %[r]\n\t"
  142347. #else
  142348. "adc r3, %[r]\n\t"
  142349. #endif
  142350. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142351. "lsrs r7, %[b], #16\n\t"
  142352. #else
  142353. "lsr r7, %[b], #16\n\t"
  142354. #endif
  142355. #ifdef WOLFSSL_KEIL
  142356. "muls r6, r7, r6\n\t"
  142357. #elif defined(__clang__)
  142358. "muls r6, r7\n\t"
  142359. #else
  142360. "mul r6, r7\n\t"
  142361. #endif
  142362. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142363. "lsrs r7, r6, #16\n\t"
  142364. #else
  142365. "lsr r7, r6, #16\n\t"
  142366. #endif
  142367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142368. "lsls r6, r6, #16\n\t"
  142369. #else
  142370. "lsl r6, r6, #16\n\t"
  142371. #endif
  142372. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142373. "adds r4, r4, r6\n\t"
  142374. #else
  142375. "add r4, r4, r6\n\t"
  142376. #endif
  142377. #ifdef WOLFSSL_KEIL
  142378. "adcs r5, r5, r7\n\t"
  142379. #elif defined(__clang__)
  142380. "adcs r5, r7\n\t"
  142381. #else
  142382. "adc r5, r7\n\t"
  142383. #endif
  142384. #ifdef WOLFSSL_KEIL
  142385. "adcs r3, r3, %[r]\n\t"
  142386. #elif defined(__clang__)
  142387. "adcs r3, %[r]\n\t"
  142388. #else
  142389. "adc r3, %[r]\n\t"
  142390. #endif
  142391. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142392. "lsrs r6, %[a], #16\n\t"
  142393. #else
  142394. "lsr r6, %[a], #16\n\t"
  142395. #endif
  142396. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142397. "lsrs r7, %[b], #16\n\t"
  142398. #else
  142399. "lsr r7, %[b], #16\n\t"
  142400. #endif
  142401. #ifdef WOLFSSL_KEIL
  142402. "muls r7, r6, r7\n\t"
  142403. #elif defined(__clang__)
  142404. "muls r7, r6\n\t"
  142405. #else
  142406. "mul r7, r6\n\t"
  142407. #endif
  142408. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142409. "adds r5, r5, r7\n\t"
  142410. #else
  142411. "add r5, r5, r7\n\t"
  142412. #endif
  142413. #ifdef WOLFSSL_KEIL
  142414. "adcs r3, r3, %[r]\n\t"
  142415. #elif defined(__clang__)
  142416. "adcs r3, %[r]\n\t"
  142417. #else
  142418. "adc r3, %[r]\n\t"
  142419. #endif
  142420. "uxth r7, %[b]\n\t"
  142421. #ifdef WOLFSSL_KEIL
  142422. "muls r6, r7, r6\n\t"
  142423. #elif defined(__clang__)
  142424. "muls r6, r7\n\t"
  142425. #else
  142426. "mul r6, r7\n\t"
  142427. #endif
  142428. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142429. "lsrs r7, r6, #16\n\t"
  142430. #else
  142431. "lsr r7, r6, #16\n\t"
  142432. #endif
  142433. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142434. "lsls r6, r6, #16\n\t"
  142435. #else
  142436. "lsl r6, r6, #16\n\t"
  142437. #endif
  142438. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142439. "adds r4, r4, r6\n\t"
  142440. #else
  142441. "add r4, r4, r6\n\t"
  142442. #endif
  142443. #ifdef WOLFSSL_KEIL
  142444. "adcs r5, r5, r7\n\t"
  142445. #elif defined(__clang__)
  142446. "adcs r5, r7\n\t"
  142447. #else
  142448. "adc 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. "# A[8] * B[2]\n\t"
  142458. "mov %[a], r9\n\t"
  142459. "mov %[b], r10\n\t"
  142460. "ldr %[a], [%[a], #32]\n\t"
  142461. "ldr %[b], [%[b], #8]\n\t"
  142462. "uxth r6, %[a]\n\t"
  142463. "uxth r7, %[b]\n\t"
  142464. #ifdef WOLFSSL_KEIL
  142465. "muls r7, r6, r7\n\t"
  142466. #elif defined(__clang__)
  142467. "muls r7, r6\n\t"
  142468. #else
  142469. "mul r7, r6\n\t"
  142470. #endif
  142471. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142472. "adds r4, r4, r7\n\t"
  142473. #else
  142474. "add r4, r4, r7\n\t"
  142475. #endif
  142476. #ifdef WOLFSSL_KEIL
  142477. "adcs r5, r5, %[r]\n\t"
  142478. #elif defined(__clang__)
  142479. "adcs r5, %[r]\n\t"
  142480. #else
  142481. "adc r5, %[r]\n\t"
  142482. #endif
  142483. #ifdef WOLFSSL_KEIL
  142484. "adcs r3, r3, %[r]\n\t"
  142485. #elif defined(__clang__)
  142486. "adcs r3, %[r]\n\t"
  142487. #else
  142488. "adc r3, %[r]\n\t"
  142489. #endif
  142490. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142491. "lsrs r7, %[b], #16\n\t"
  142492. #else
  142493. "lsr r7, %[b], #16\n\t"
  142494. #endif
  142495. #ifdef WOLFSSL_KEIL
  142496. "muls r6, r7, r6\n\t"
  142497. #elif defined(__clang__)
  142498. "muls r6, r7\n\t"
  142499. #else
  142500. "mul r6, r7\n\t"
  142501. #endif
  142502. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142503. "lsrs r7, r6, #16\n\t"
  142504. #else
  142505. "lsr r7, r6, #16\n\t"
  142506. #endif
  142507. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142508. "lsls r6, r6, #16\n\t"
  142509. #else
  142510. "lsl r6, r6, #16\n\t"
  142511. #endif
  142512. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142513. "adds r4, r4, r6\n\t"
  142514. #else
  142515. "add r4, r4, r6\n\t"
  142516. #endif
  142517. #ifdef WOLFSSL_KEIL
  142518. "adcs r5, r5, r7\n\t"
  142519. #elif defined(__clang__)
  142520. "adcs r5, r7\n\t"
  142521. #else
  142522. "adc r5, r7\n\t"
  142523. #endif
  142524. #ifdef WOLFSSL_KEIL
  142525. "adcs r3, r3, %[r]\n\t"
  142526. #elif defined(__clang__)
  142527. "adcs r3, %[r]\n\t"
  142528. #else
  142529. "adc r3, %[r]\n\t"
  142530. #endif
  142531. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142532. "lsrs r6, %[a], #16\n\t"
  142533. #else
  142534. "lsr r6, %[a], #16\n\t"
  142535. #endif
  142536. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142537. "lsrs r7, %[b], #16\n\t"
  142538. #else
  142539. "lsr r7, %[b], #16\n\t"
  142540. #endif
  142541. #ifdef WOLFSSL_KEIL
  142542. "muls r7, r6, r7\n\t"
  142543. #elif defined(__clang__)
  142544. "muls r7, r6\n\t"
  142545. #else
  142546. "mul r7, r6\n\t"
  142547. #endif
  142548. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142549. "adds r5, r5, r7\n\t"
  142550. #else
  142551. "add r5, r5, r7\n\t"
  142552. #endif
  142553. #ifdef WOLFSSL_KEIL
  142554. "adcs r3, r3, %[r]\n\t"
  142555. #elif defined(__clang__)
  142556. "adcs r3, %[r]\n\t"
  142557. #else
  142558. "adc r3, %[r]\n\t"
  142559. #endif
  142560. "uxth r7, %[b]\n\t"
  142561. #ifdef WOLFSSL_KEIL
  142562. "muls r6, r7, r6\n\t"
  142563. #elif defined(__clang__)
  142564. "muls r6, r7\n\t"
  142565. #else
  142566. "mul r6, r7\n\t"
  142567. #endif
  142568. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142569. "lsrs r7, r6, #16\n\t"
  142570. #else
  142571. "lsr r7, r6, #16\n\t"
  142572. #endif
  142573. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142574. "lsls r6, r6, #16\n\t"
  142575. #else
  142576. "lsl r6, r6, #16\n\t"
  142577. #endif
  142578. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142579. "adds r4, r4, r6\n\t"
  142580. #else
  142581. "add r4, r4, r6\n\t"
  142582. #endif
  142583. #ifdef WOLFSSL_KEIL
  142584. "adcs r5, r5, r7\n\t"
  142585. #elif defined(__clang__)
  142586. "adcs r5, r7\n\t"
  142587. #else
  142588. "adc 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. "# A[7] * B[3]\n\t"
  142598. "mov %[a], r9\n\t"
  142599. "mov %[b], r10\n\t"
  142600. "ldr %[a], [%[a], #28]\n\t"
  142601. "ldr %[b], [%[b], #12]\n\t"
  142602. "uxth r6, %[a]\n\t"
  142603. "uxth r7, %[b]\n\t"
  142604. #ifdef WOLFSSL_KEIL
  142605. "muls r7, r6, r7\n\t"
  142606. #elif defined(__clang__)
  142607. "muls r7, r6\n\t"
  142608. #else
  142609. "mul r7, r6\n\t"
  142610. #endif
  142611. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142612. "adds r4, r4, r7\n\t"
  142613. #else
  142614. "add r4, r4, r7\n\t"
  142615. #endif
  142616. #ifdef WOLFSSL_KEIL
  142617. "adcs r5, r5, %[r]\n\t"
  142618. #elif defined(__clang__)
  142619. "adcs r5, %[r]\n\t"
  142620. #else
  142621. "adc r5, %[r]\n\t"
  142622. #endif
  142623. #ifdef WOLFSSL_KEIL
  142624. "adcs r3, r3, %[r]\n\t"
  142625. #elif defined(__clang__)
  142626. "adcs r3, %[r]\n\t"
  142627. #else
  142628. "adc r3, %[r]\n\t"
  142629. #endif
  142630. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142631. "lsrs r7, %[b], #16\n\t"
  142632. #else
  142633. "lsr r7, %[b], #16\n\t"
  142634. #endif
  142635. #ifdef WOLFSSL_KEIL
  142636. "muls r6, r7, r6\n\t"
  142637. #elif defined(__clang__)
  142638. "muls r6, r7\n\t"
  142639. #else
  142640. "mul r6, r7\n\t"
  142641. #endif
  142642. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142643. "lsrs r7, r6, #16\n\t"
  142644. #else
  142645. "lsr r7, r6, #16\n\t"
  142646. #endif
  142647. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142648. "lsls r6, r6, #16\n\t"
  142649. #else
  142650. "lsl r6, r6, #16\n\t"
  142651. #endif
  142652. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142653. "adds r4, r4, r6\n\t"
  142654. #else
  142655. "add r4, r4, r6\n\t"
  142656. #endif
  142657. #ifdef WOLFSSL_KEIL
  142658. "adcs r5, r5, r7\n\t"
  142659. #elif defined(__clang__)
  142660. "adcs r5, r7\n\t"
  142661. #else
  142662. "adc r5, r7\n\t"
  142663. #endif
  142664. #ifdef WOLFSSL_KEIL
  142665. "adcs r3, r3, %[r]\n\t"
  142666. #elif defined(__clang__)
  142667. "adcs r3, %[r]\n\t"
  142668. #else
  142669. "adc r3, %[r]\n\t"
  142670. #endif
  142671. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142672. "lsrs r6, %[a], #16\n\t"
  142673. #else
  142674. "lsr r6, %[a], #16\n\t"
  142675. #endif
  142676. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142677. "lsrs r7, %[b], #16\n\t"
  142678. #else
  142679. "lsr r7, %[b], #16\n\t"
  142680. #endif
  142681. #ifdef WOLFSSL_KEIL
  142682. "muls r7, r6, r7\n\t"
  142683. #elif defined(__clang__)
  142684. "muls r7, r6\n\t"
  142685. #else
  142686. "mul r7, r6\n\t"
  142687. #endif
  142688. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142689. "adds r5, r5, r7\n\t"
  142690. #else
  142691. "add r5, r5, r7\n\t"
  142692. #endif
  142693. #ifdef WOLFSSL_KEIL
  142694. "adcs r3, r3, %[r]\n\t"
  142695. #elif defined(__clang__)
  142696. "adcs r3, %[r]\n\t"
  142697. #else
  142698. "adc r3, %[r]\n\t"
  142699. #endif
  142700. "uxth r7, %[b]\n\t"
  142701. #ifdef WOLFSSL_KEIL
  142702. "muls r6, r7, r6\n\t"
  142703. #elif defined(__clang__)
  142704. "muls r6, r7\n\t"
  142705. #else
  142706. "mul r6, r7\n\t"
  142707. #endif
  142708. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142709. "lsrs r7, r6, #16\n\t"
  142710. #else
  142711. "lsr r7, r6, #16\n\t"
  142712. #endif
  142713. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142714. "lsls r6, r6, #16\n\t"
  142715. #else
  142716. "lsl r6, r6, #16\n\t"
  142717. #endif
  142718. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142719. "adds r4, r4, r6\n\t"
  142720. #else
  142721. "add r4, r4, r6\n\t"
  142722. #endif
  142723. #ifdef WOLFSSL_KEIL
  142724. "adcs r5, r5, r7\n\t"
  142725. #elif defined(__clang__)
  142726. "adcs r5, r7\n\t"
  142727. #else
  142728. "adc 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. "# A[6] * B[4]\n\t"
  142738. "mov %[a], r9\n\t"
  142739. "mov %[b], r10\n\t"
  142740. "ldr %[a], [%[a], #24]\n\t"
  142741. "ldr %[b], [%[b], #16]\n\t"
  142742. "uxth r6, %[a]\n\t"
  142743. "uxth r7, %[b]\n\t"
  142744. #ifdef WOLFSSL_KEIL
  142745. "muls r7, r6, r7\n\t"
  142746. #elif defined(__clang__)
  142747. "muls r7, r6\n\t"
  142748. #else
  142749. "mul r7, r6\n\t"
  142750. #endif
  142751. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142752. "adds r4, r4, r7\n\t"
  142753. #else
  142754. "add r4, r4, r7\n\t"
  142755. #endif
  142756. #ifdef WOLFSSL_KEIL
  142757. "adcs r5, r5, %[r]\n\t"
  142758. #elif defined(__clang__)
  142759. "adcs r5, %[r]\n\t"
  142760. #else
  142761. "adc r5, %[r]\n\t"
  142762. #endif
  142763. #ifdef WOLFSSL_KEIL
  142764. "adcs r3, r3, %[r]\n\t"
  142765. #elif defined(__clang__)
  142766. "adcs r3, %[r]\n\t"
  142767. #else
  142768. "adc r3, %[r]\n\t"
  142769. #endif
  142770. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142771. "lsrs r7, %[b], #16\n\t"
  142772. #else
  142773. "lsr r7, %[b], #16\n\t"
  142774. #endif
  142775. #ifdef WOLFSSL_KEIL
  142776. "muls r6, r7, r6\n\t"
  142777. #elif defined(__clang__)
  142778. "muls r6, r7\n\t"
  142779. #else
  142780. "mul r6, r7\n\t"
  142781. #endif
  142782. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142783. "lsrs r7, r6, #16\n\t"
  142784. #else
  142785. "lsr r7, r6, #16\n\t"
  142786. #endif
  142787. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142788. "lsls r6, r6, #16\n\t"
  142789. #else
  142790. "lsl r6, r6, #16\n\t"
  142791. #endif
  142792. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142793. "adds r4, r4, r6\n\t"
  142794. #else
  142795. "add r4, r4, r6\n\t"
  142796. #endif
  142797. #ifdef WOLFSSL_KEIL
  142798. "adcs r5, r5, r7\n\t"
  142799. #elif defined(__clang__)
  142800. "adcs r5, r7\n\t"
  142801. #else
  142802. "adc r5, r7\n\t"
  142803. #endif
  142804. #ifdef WOLFSSL_KEIL
  142805. "adcs r3, r3, %[r]\n\t"
  142806. #elif defined(__clang__)
  142807. "adcs r3, %[r]\n\t"
  142808. #else
  142809. "adc r3, %[r]\n\t"
  142810. #endif
  142811. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142812. "lsrs r6, %[a], #16\n\t"
  142813. #else
  142814. "lsr r6, %[a], #16\n\t"
  142815. #endif
  142816. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142817. "lsrs r7, %[b], #16\n\t"
  142818. #else
  142819. "lsr r7, %[b], #16\n\t"
  142820. #endif
  142821. #ifdef WOLFSSL_KEIL
  142822. "muls r7, r6, r7\n\t"
  142823. #elif defined(__clang__)
  142824. "muls r7, r6\n\t"
  142825. #else
  142826. "mul r7, r6\n\t"
  142827. #endif
  142828. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142829. "adds r5, r5, r7\n\t"
  142830. #else
  142831. "add r5, r5, r7\n\t"
  142832. #endif
  142833. #ifdef WOLFSSL_KEIL
  142834. "adcs r3, r3, %[r]\n\t"
  142835. #elif defined(__clang__)
  142836. "adcs r3, %[r]\n\t"
  142837. #else
  142838. "adc r3, %[r]\n\t"
  142839. #endif
  142840. "uxth r7, %[b]\n\t"
  142841. #ifdef WOLFSSL_KEIL
  142842. "muls r6, r7, r6\n\t"
  142843. #elif defined(__clang__)
  142844. "muls r6, r7\n\t"
  142845. #else
  142846. "mul r6, r7\n\t"
  142847. #endif
  142848. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142849. "lsrs r7, r6, #16\n\t"
  142850. #else
  142851. "lsr r7, r6, #16\n\t"
  142852. #endif
  142853. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142854. "lsls r6, r6, #16\n\t"
  142855. #else
  142856. "lsl r6, r6, #16\n\t"
  142857. #endif
  142858. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142859. "adds r4, r4, r6\n\t"
  142860. #else
  142861. "add r4, r4, r6\n\t"
  142862. #endif
  142863. #ifdef WOLFSSL_KEIL
  142864. "adcs r5, r5, r7\n\t"
  142865. #elif defined(__clang__)
  142866. "adcs r5, r7\n\t"
  142867. #else
  142868. "adc 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. "# A[5] * B[5]\n\t"
  142878. "mov %[a], r9\n\t"
  142879. "mov %[b], r10\n\t"
  142880. "ldr %[a], [%[a], #20]\n\t"
  142881. "ldr %[b], [%[b], #20]\n\t"
  142882. "uxth r6, %[a]\n\t"
  142883. "uxth r7, %[b]\n\t"
  142884. #ifdef WOLFSSL_KEIL
  142885. "muls r7, r6, r7\n\t"
  142886. #elif defined(__clang__)
  142887. "muls r7, r6\n\t"
  142888. #else
  142889. "mul r7, r6\n\t"
  142890. #endif
  142891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142892. "adds r4, r4, r7\n\t"
  142893. #else
  142894. "add r4, r4, r7\n\t"
  142895. #endif
  142896. #ifdef WOLFSSL_KEIL
  142897. "adcs r5, r5, %[r]\n\t"
  142898. #elif defined(__clang__)
  142899. "adcs r5, %[r]\n\t"
  142900. #else
  142901. "adc r5, %[r]\n\t"
  142902. #endif
  142903. #ifdef WOLFSSL_KEIL
  142904. "adcs r3, r3, %[r]\n\t"
  142905. #elif defined(__clang__)
  142906. "adcs r3, %[r]\n\t"
  142907. #else
  142908. "adc r3, %[r]\n\t"
  142909. #endif
  142910. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142911. "lsrs r7, %[b], #16\n\t"
  142912. #else
  142913. "lsr r7, %[b], #16\n\t"
  142914. #endif
  142915. #ifdef WOLFSSL_KEIL
  142916. "muls r6, r7, r6\n\t"
  142917. #elif defined(__clang__)
  142918. "muls r6, r7\n\t"
  142919. #else
  142920. "mul r6, r7\n\t"
  142921. #endif
  142922. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142923. "lsrs r7, r6, #16\n\t"
  142924. #else
  142925. "lsr r7, r6, #16\n\t"
  142926. #endif
  142927. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142928. "lsls r6, r6, #16\n\t"
  142929. #else
  142930. "lsl r6, r6, #16\n\t"
  142931. #endif
  142932. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142933. "adds r4, r4, r6\n\t"
  142934. #else
  142935. "add r4, r4, r6\n\t"
  142936. #endif
  142937. #ifdef WOLFSSL_KEIL
  142938. "adcs r5, r5, r7\n\t"
  142939. #elif defined(__clang__)
  142940. "adcs r5, r7\n\t"
  142941. #else
  142942. "adc r5, r7\n\t"
  142943. #endif
  142944. #ifdef WOLFSSL_KEIL
  142945. "adcs r3, r3, %[r]\n\t"
  142946. #elif defined(__clang__)
  142947. "adcs r3, %[r]\n\t"
  142948. #else
  142949. "adc r3, %[r]\n\t"
  142950. #endif
  142951. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142952. "lsrs r6, %[a], #16\n\t"
  142953. #else
  142954. "lsr r6, %[a], #16\n\t"
  142955. #endif
  142956. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142957. "lsrs r7, %[b], #16\n\t"
  142958. #else
  142959. "lsr r7, %[b], #16\n\t"
  142960. #endif
  142961. #ifdef WOLFSSL_KEIL
  142962. "muls r7, r6, r7\n\t"
  142963. #elif defined(__clang__)
  142964. "muls r7, r6\n\t"
  142965. #else
  142966. "mul r7, r6\n\t"
  142967. #endif
  142968. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142969. "adds r5, r5, r7\n\t"
  142970. #else
  142971. "add r5, r5, r7\n\t"
  142972. #endif
  142973. #ifdef WOLFSSL_KEIL
  142974. "adcs r3, r3, %[r]\n\t"
  142975. #elif defined(__clang__)
  142976. "adcs r3, %[r]\n\t"
  142977. #else
  142978. "adc r3, %[r]\n\t"
  142979. #endif
  142980. "uxth r7, %[b]\n\t"
  142981. #ifdef WOLFSSL_KEIL
  142982. "muls r6, r7, r6\n\t"
  142983. #elif defined(__clang__)
  142984. "muls r6, r7\n\t"
  142985. #else
  142986. "mul r6, r7\n\t"
  142987. #endif
  142988. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142989. "lsrs r7, r6, #16\n\t"
  142990. #else
  142991. "lsr r7, r6, #16\n\t"
  142992. #endif
  142993. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142994. "lsls r6, r6, #16\n\t"
  142995. #else
  142996. "lsl r6, r6, #16\n\t"
  142997. #endif
  142998. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142999. "adds r4, r4, r6\n\t"
  143000. #else
  143001. "add r4, r4, r6\n\t"
  143002. #endif
  143003. #ifdef WOLFSSL_KEIL
  143004. "adcs r5, r5, r7\n\t"
  143005. #elif defined(__clang__)
  143006. "adcs r5, r7\n\t"
  143007. #else
  143008. "adc 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. "# A[4] * B[6]\n\t"
  143018. "mov %[a], r9\n\t"
  143019. "mov %[b], r10\n\t"
  143020. "ldr %[a], [%[a], #16]\n\t"
  143021. "ldr %[b], [%[b], #24]\n\t"
  143022. "uxth r6, %[a]\n\t"
  143023. "uxth r7, %[b]\n\t"
  143024. #ifdef WOLFSSL_KEIL
  143025. "muls r7, r6, r7\n\t"
  143026. #elif defined(__clang__)
  143027. "muls r7, r6\n\t"
  143028. #else
  143029. "mul r7, r6\n\t"
  143030. #endif
  143031. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143032. "adds r4, r4, r7\n\t"
  143033. #else
  143034. "add r4, r4, r7\n\t"
  143035. #endif
  143036. #ifdef WOLFSSL_KEIL
  143037. "adcs r5, r5, %[r]\n\t"
  143038. #elif defined(__clang__)
  143039. "adcs r5, %[r]\n\t"
  143040. #else
  143041. "adc r5, %[r]\n\t"
  143042. #endif
  143043. #ifdef WOLFSSL_KEIL
  143044. "adcs r3, r3, %[r]\n\t"
  143045. #elif defined(__clang__)
  143046. "adcs r3, %[r]\n\t"
  143047. #else
  143048. "adc r3, %[r]\n\t"
  143049. #endif
  143050. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143051. "lsrs r7, %[b], #16\n\t"
  143052. #else
  143053. "lsr r7, %[b], #16\n\t"
  143054. #endif
  143055. #ifdef WOLFSSL_KEIL
  143056. "muls r6, r7, r6\n\t"
  143057. #elif defined(__clang__)
  143058. "muls r6, r7\n\t"
  143059. #else
  143060. "mul r6, r7\n\t"
  143061. #endif
  143062. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143063. "lsrs r7, r6, #16\n\t"
  143064. #else
  143065. "lsr r7, r6, #16\n\t"
  143066. #endif
  143067. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143068. "lsls r6, r6, #16\n\t"
  143069. #else
  143070. "lsl r6, r6, #16\n\t"
  143071. #endif
  143072. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143073. "adds r4, r4, r6\n\t"
  143074. #else
  143075. "add r4, r4, r6\n\t"
  143076. #endif
  143077. #ifdef WOLFSSL_KEIL
  143078. "adcs r5, r5, r7\n\t"
  143079. #elif defined(__clang__)
  143080. "adcs r5, r7\n\t"
  143081. #else
  143082. "adc r5, r7\n\t"
  143083. #endif
  143084. #ifdef WOLFSSL_KEIL
  143085. "adcs r3, r3, %[r]\n\t"
  143086. #elif defined(__clang__)
  143087. "adcs r3, %[r]\n\t"
  143088. #else
  143089. "adc r3, %[r]\n\t"
  143090. #endif
  143091. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143092. "lsrs r6, %[a], #16\n\t"
  143093. #else
  143094. "lsr r6, %[a], #16\n\t"
  143095. #endif
  143096. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143097. "lsrs r7, %[b], #16\n\t"
  143098. #else
  143099. "lsr r7, %[b], #16\n\t"
  143100. #endif
  143101. #ifdef WOLFSSL_KEIL
  143102. "muls r7, r6, r7\n\t"
  143103. #elif defined(__clang__)
  143104. "muls r7, r6\n\t"
  143105. #else
  143106. "mul r7, r6\n\t"
  143107. #endif
  143108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143109. "adds r5, r5, r7\n\t"
  143110. #else
  143111. "add r5, r5, r7\n\t"
  143112. #endif
  143113. #ifdef WOLFSSL_KEIL
  143114. "adcs r3, r3, %[r]\n\t"
  143115. #elif defined(__clang__)
  143116. "adcs r3, %[r]\n\t"
  143117. #else
  143118. "adc r3, %[r]\n\t"
  143119. #endif
  143120. "uxth r7, %[b]\n\t"
  143121. #ifdef WOLFSSL_KEIL
  143122. "muls r6, r7, r6\n\t"
  143123. #elif defined(__clang__)
  143124. "muls r6, r7\n\t"
  143125. #else
  143126. "mul r6, r7\n\t"
  143127. #endif
  143128. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143129. "lsrs r7, r6, #16\n\t"
  143130. #else
  143131. "lsr r7, r6, #16\n\t"
  143132. #endif
  143133. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143134. "lsls r6, r6, #16\n\t"
  143135. #else
  143136. "lsl r6, r6, #16\n\t"
  143137. #endif
  143138. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143139. "adds r4, r4, r6\n\t"
  143140. #else
  143141. "add r4, r4, r6\n\t"
  143142. #endif
  143143. #ifdef WOLFSSL_KEIL
  143144. "adcs r5, r5, r7\n\t"
  143145. #elif defined(__clang__)
  143146. "adcs r5, r7\n\t"
  143147. #else
  143148. "adc 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. "# A[3] * B[7]\n\t"
  143158. "mov %[a], r9\n\t"
  143159. "mov %[b], r10\n\t"
  143160. "ldr %[a], [%[a], #12]\n\t"
  143161. "ldr %[b], [%[b], #28]\n\t"
  143162. "uxth r6, %[a]\n\t"
  143163. "uxth r7, %[b]\n\t"
  143164. #ifdef WOLFSSL_KEIL
  143165. "muls r7, r6, r7\n\t"
  143166. #elif defined(__clang__)
  143167. "muls r7, r6\n\t"
  143168. #else
  143169. "mul r7, r6\n\t"
  143170. #endif
  143171. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143172. "adds r4, r4, r7\n\t"
  143173. #else
  143174. "add r4, r4, r7\n\t"
  143175. #endif
  143176. #ifdef WOLFSSL_KEIL
  143177. "adcs r5, r5, %[r]\n\t"
  143178. #elif defined(__clang__)
  143179. "adcs r5, %[r]\n\t"
  143180. #else
  143181. "adc r5, %[r]\n\t"
  143182. #endif
  143183. #ifdef WOLFSSL_KEIL
  143184. "adcs r3, r3, %[r]\n\t"
  143185. #elif defined(__clang__)
  143186. "adcs r3, %[r]\n\t"
  143187. #else
  143188. "adc r3, %[r]\n\t"
  143189. #endif
  143190. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143191. "lsrs r7, %[b], #16\n\t"
  143192. #else
  143193. "lsr r7, %[b], #16\n\t"
  143194. #endif
  143195. #ifdef WOLFSSL_KEIL
  143196. "muls r6, r7, r6\n\t"
  143197. #elif defined(__clang__)
  143198. "muls r6, r7\n\t"
  143199. #else
  143200. "mul r6, r7\n\t"
  143201. #endif
  143202. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143203. "lsrs r7, r6, #16\n\t"
  143204. #else
  143205. "lsr r7, r6, #16\n\t"
  143206. #endif
  143207. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143208. "lsls r6, r6, #16\n\t"
  143209. #else
  143210. "lsl r6, r6, #16\n\t"
  143211. #endif
  143212. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143213. "adds r4, r4, r6\n\t"
  143214. #else
  143215. "add r4, r4, r6\n\t"
  143216. #endif
  143217. #ifdef WOLFSSL_KEIL
  143218. "adcs r5, r5, r7\n\t"
  143219. #elif defined(__clang__)
  143220. "adcs r5, r7\n\t"
  143221. #else
  143222. "adc r5, r7\n\t"
  143223. #endif
  143224. #ifdef WOLFSSL_KEIL
  143225. "adcs r3, r3, %[r]\n\t"
  143226. #elif defined(__clang__)
  143227. "adcs r3, %[r]\n\t"
  143228. #else
  143229. "adc r3, %[r]\n\t"
  143230. #endif
  143231. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143232. "lsrs r6, %[a], #16\n\t"
  143233. #else
  143234. "lsr r6, %[a], #16\n\t"
  143235. #endif
  143236. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143237. "lsrs r7, %[b], #16\n\t"
  143238. #else
  143239. "lsr r7, %[b], #16\n\t"
  143240. #endif
  143241. #ifdef WOLFSSL_KEIL
  143242. "muls r7, r6, r7\n\t"
  143243. #elif defined(__clang__)
  143244. "muls r7, r6\n\t"
  143245. #else
  143246. "mul r7, r6\n\t"
  143247. #endif
  143248. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143249. "adds r5, r5, r7\n\t"
  143250. #else
  143251. "add r5, r5, r7\n\t"
  143252. #endif
  143253. #ifdef WOLFSSL_KEIL
  143254. "adcs r3, r3, %[r]\n\t"
  143255. #elif defined(__clang__)
  143256. "adcs r3, %[r]\n\t"
  143257. #else
  143258. "adc r3, %[r]\n\t"
  143259. #endif
  143260. "uxth r7, %[b]\n\t"
  143261. #ifdef WOLFSSL_KEIL
  143262. "muls r6, r7, r6\n\t"
  143263. #elif defined(__clang__)
  143264. "muls r6, r7\n\t"
  143265. #else
  143266. "mul r6, r7\n\t"
  143267. #endif
  143268. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143269. "lsrs r7, r6, #16\n\t"
  143270. #else
  143271. "lsr r7, r6, #16\n\t"
  143272. #endif
  143273. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143274. "lsls r6, r6, #16\n\t"
  143275. #else
  143276. "lsl r6, r6, #16\n\t"
  143277. #endif
  143278. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143279. "adds r4, r4, r6\n\t"
  143280. #else
  143281. "add r4, r4, r6\n\t"
  143282. #endif
  143283. #ifdef WOLFSSL_KEIL
  143284. "adcs r5, r5, r7\n\t"
  143285. #elif defined(__clang__)
  143286. "adcs r5, r7\n\t"
  143287. #else
  143288. "adc r5, r7\n\t"
  143289. #endif
  143290. #ifdef WOLFSSL_KEIL
  143291. "adcs r3, r3, %[r]\n\t"
  143292. #elif defined(__clang__)
  143293. "adcs r3, %[r]\n\t"
  143294. #else
  143295. "adc r3, %[r]\n\t"
  143296. #endif
  143297. "# A[2] * B[8]\n\t"
  143298. "mov %[a], r9\n\t"
  143299. "mov %[b], r10\n\t"
  143300. "ldr %[a], [%[a], #8]\n\t"
  143301. "ldr %[b], [%[b], #32]\n\t"
  143302. "uxth r6, %[a]\n\t"
  143303. "uxth r7, %[b]\n\t"
  143304. #ifdef WOLFSSL_KEIL
  143305. "muls r7, r6, r7\n\t"
  143306. #elif defined(__clang__)
  143307. "muls r7, r6\n\t"
  143308. #else
  143309. "mul r7, r6\n\t"
  143310. #endif
  143311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143312. "adds r4, r4, r7\n\t"
  143313. #else
  143314. "add r4, r4, r7\n\t"
  143315. #endif
  143316. #ifdef WOLFSSL_KEIL
  143317. "adcs r5, r5, %[r]\n\t"
  143318. #elif defined(__clang__)
  143319. "adcs r5, %[r]\n\t"
  143320. #else
  143321. "adc r5, %[r]\n\t"
  143322. #endif
  143323. #ifdef WOLFSSL_KEIL
  143324. "adcs r3, r3, %[r]\n\t"
  143325. #elif defined(__clang__)
  143326. "adcs r3, %[r]\n\t"
  143327. #else
  143328. "adc r3, %[r]\n\t"
  143329. #endif
  143330. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143331. "lsrs r7, %[b], #16\n\t"
  143332. #else
  143333. "lsr r7, %[b], #16\n\t"
  143334. #endif
  143335. #ifdef WOLFSSL_KEIL
  143336. "muls r6, r7, r6\n\t"
  143337. #elif defined(__clang__)
  143338. "muls r6, r7\n\t"
  143339. #else
  143340. "mul r6, r7\n\t"
  143341. #endif
  143342. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143343. "lsrs r7, r6, #16\n\t"
  143344. #else
  143345. "lsr r7, r6, #16\n\t"
  143346. #endif
  143347. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143348. "lsls r6, r6, #16\n\t"
  143349. #else
  143350. "lsl r6, r6, #16\n\t"
  143351. #endif
  143352. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143353. "adds r4, r4, r6\n\t"
  143354. #else
  143355. "add r4, r4, r6\n\t"
  143356. #endif
  143357. #ifdef WOLFSSL_KEIL
  143358. "adcs r5, r5, r7\n\t"
  143359. #elif defined(__clang__)
  143360. "adcs r5, r7\n\t"
  143361. #else
  143362. "adc r5, r7\n\t"
  143363. #endif
  143364. #ifdef WOLFSSL_KEIL
  143365. "adcs r3, r3, %[r]\n\t"
  143366. #elif defined(__clang__)
  143367. "adcs r3, %[r]\n\t"
  143368. #else
  143369. "adc r3, %[r]\n\t"
  143370. #endif
  143371. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143372. "lsrs r6, %[a], #16\n\t"
  143373. #else
  143374. "lsr r6, %[a], #16\n\t"
  143375. #endif
  143376. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143377. "lsrs r7, %[b], #16\n\t"
  143378. #else
  143379. "lsr r7, %[b], #16\n\t"
  143380. #endif
  143381. #ifdef WOLFSSL_KEIL
  143382. "muls r7, r6, r7\n\t"
  143383. #elif defined(__clang__)
  143384. "muls r7, r6\n\t"
  143385. #else
  143386. "mul r7, r6\n\t"
  143387. #endif
  143388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143389. "adds r5, r5, r7\n\t"
  143390. #else
  143391. "add r5, r5, r7\n\t"
  143392. #endif
  143393. #ifdef WOLFSSL_KEIL
  143394. "adcs r3, r3, %[r]\n\t"
  143395. #elif defined(__clang__)
  143396. "adcs r3, %[r]\n\t"
  143397. #else
  143398. "adc r3, %[r]\n\t"
  143399. #endif
  143400. "uxth r7, %[b]\n\t"
  143401. #ifdef WOLFSSL_KEIL
  143402. "muls r6, r7, r6\n\t"
  143403. #elif defined(__clang__)
  143404. "muls r6, r7\n\t"
  143405. #else
  143406. "mul r6, r7\n\t"
  143407. #endif
  143408. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143409. "lsrs r7, r6, #16\n\t"
  143410. #else
  143411. "lsr r7, r6, #16\n\t"
  143412. #endif
  143413. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143414. "lsls r6, r6, #16\n\t"
  143415. #else
  143416. "lsl r6, r6, #16\n\t"
  143417. #endif
  143418. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143419. "adds r4, r4, r6\n\t"
  143420. #else
  143421. "add r4, r4, r6\n\t"
  143422. #endif
  143423. #ifdef WOLFSSL_KEIL
  143424. "adcs r5, r5, r7\n\t"
  143425. #elif defined(__clang__)
  143426. "adcs r5, r7\n\t"
  143427. #else
  143428. "adc r5, r7\n\t"
  143429. #endif
  143430. #ifdef WOLFSSL_KEIL
  143431. "adcs r3, r3, %[r]\n\t"
  143432. #elif defined(__clang__)
  143433. "adcs r3, %[r]\n\t"
  143434. #else
  143435. "adc r3, %[r]\n\t"
  143436. #endif
  143437. "# A[1] * B[9]\n\t"
  143438. "mov %[a], r9\n\t"
  143439. "mov %[b], r10\n\t"
  143440. "ldr %[a], [%[a], #4]\n\t"
  143441. "ldr %[b], [%[b], #36]\n\t"
  143442. "uxth r6, %[a]\n\t"
  143443. "uxth r7, %[b]\n\t"
  143444. #ifdef WOLFSSL_KEIL
  143445. "muls r7, r6, r7\n\t"
  143446. #elif defined(__clang__)
  143447. "muls r7, r6\n\t"
  143448. #else
  143449. "mul r7, r6\n\t"
  143450. #endif
  143451. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143452. "adds r4, r4, r7\n\t"
  143453. #else
  143454. "add r4, r4, r7\n\t"
  143455. #endif
  143456. #ifdef WOLFSSL_KEIL
  143457. "adcs r5, r5, %[r]\n\t"
  143458. #elif defined(__clang__)
  143459. "adcs r5, %[r]\n\t"
  143460. #else
  143461. "adc r5, %[r]\n\t"
  143462. #endif
  143463. #ifdef WOLFSSL_KEIL
  143464. "adcs r3, r3, %[r]\n\t"
  143465. #elif defined(__clang__)
  143466. "adcs r3, %[r]\n\t"
  143467. #else
  143468. "adc r3, %[r]\n\t"
  143469. #endif
  143470. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143471. "lsrs r7, %[b], #16\n\t"
  143472. #else
  143473. "lsr r7, %[b], #16\n\t"
  143474. #endif
  143475. #ifdef WOLFSSL_KEIL
  143476. "muls r6, r7, r6\n\t"
  143477. #elif defined(__clang__)
  143478. "muls r6, r7\n\t"
  143479. #else
  143480. "mul r6, r7\n\t"
  143481. #endif
  143482. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143483. "lsrs r7, r6, #16\n\t"
  143484. #else
  143485. "lsr r7, r6, #16\n\t"
  143486. #endif
  143487. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143488. "lsls r6, r6, #16\n\t"
  143489. #else
  143490. "lsl r6, r6, #16\n\t"
  143491. #endif
  143492. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143493. "adds r4, r4, r6\n\t"
  143494. #else
  143495. "add r4, r4, r6\n\t"
  143496. #endif
  143497. #ifdef WOLFSSL_KEIL
  143498. "adcs r5, r5, r7\n\t"
  143499. #elif defined(__clang__)
  143500. "adcs r5, r7\n\t"
  143501. #else
  143502. "adc r5, r7\n\t"
  143503. #endif
  143504. #ifdef WOLFSSL_KEIL
  143505. "adcs r3, r3, %[r]\n\t"
  143506. #elif defined(__clang__)
  143507. "adcs r3, %[r]\n\t"
  143508. #else
  143509. "adc r3, %[r]\n\t"
  143510. #endif
  143511. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143512. "lsrs r6, %[a], #16\n\t"
  143513. #else
  143514. "lsr r6, %[a], #16\n\t"
  143515. #endif
  143516. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143517. "lsrs r7, %[b], #16\n\t"
  143518. #else
  143519. "lsr r7, %[b], #16\n\t"
  143520. #endif
  143521. #ifdef WOLFSSL_KEIL
  143522. "muls r7, r6, r7\n\t"
  143523. #elif defined(__clang__)
  143524. "muls r7, r6\n\t"
  143525. #else
  143526. "mul r7, r6\n\t"
  143527. #endif
  143528. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143529. "adds r5, r5, r7\n\t"
  143530. #else
  143531. "add r5, r5, r7\n\t"
  143532. #endif
  143533. #ifdef WOLFSSL_KEIL
  143534. "adcs r3, r3, %[r]\n\t"
  143535. #elif defined(__clang__)
  143536. "adcs r3, %[r]\n\t"
  143537. #else
  143538. "adc r3, %[r]\n\t"
  143539. #endif
  143540. "uxth r7, %[b]\n\t"
  143541. #ifdef WOLFSSL_KEIL
  143542. "muls r6, r7, r6\n\t"
  143543. #elif defined(__clang__)
  143544. "muls r6, r7\n\t"
  143545. #else
  143546. "mul r6, r7\n\t"
  143547. #endif
  143548. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143549. "lsrs r7, r6, #16\n\t"
  143550. #else
  143551. "lsr r7, r6, #16\n\t"
  143552. #endif
  143553. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143554. "lsls r6, r6, #16\n\t"
  143555. #else
  143556. "lsl r6, r6, #16\n\t"
  143557. #endif
  143558. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143559. "adds r4, r4, r6\n\t"
  143560. #else
  143561. "add r4, r4, r6\n\t"
  143562. #endif
  143563. #ifdef WOLFSSL_KEIL
  143564. "adcs r5, r5, r7\n\t"
  143565. #elif defined(__clang__)
  143566. "adcs r5, r7\n\t"
  143567. #else
  143568. "adc r5, r7\n\t"
  143569. #endif
  143570. #ifdef WOLFSSL_KEIL
  143571. "adcs r3, r3, %[r]\n\t"
  143572. #elif defined(__clang__)
  143573. "adcs r3, %[r]\n\t"
  143574. #else
  143575. "adc r3, %[r]\n\t"
  143576. #endif
  143577. "# A[0] * B[10]\n\t"
  143578. "mov %[a], r9\n\t"
  143579. "mov %[b], r10\n\t"
  143580. "ldr %[a], [%[a]]\n\t"
  143581. "ldr %[b], [%[b], #40]\n\t"
  143582. "uxth r6, %[a]\n\t"
  143583. "uxth r7, %[b]\n\t"
  143584. #ifdef WOLFSSL_KEIL
  143585. "muls r7, r6, r7\n\t"
  143586. #elif defined(__clang__)
  143587. "muls r7, r6\n\t"
  143588. #else
  143589. "mul r7, r6\n\t"
  143590. #endif
  143591. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143592. "adds r4, r4, r7\n\t"
  143593. #else
  143594. "add r4, r4, r7\n\t"
  143595. #endif
  143596. #ifdef WOLFSSL_KEIL
  143597. "adcs r5, r5, %[r]\n\t"
  143598. #elif defined(__clang__)
  143599. "adcs r5, %[r]\n\t"
  143600. #else
  143601. "adc r5, %[r]\n\t"
  143602. #endif
  143603. #ifdef WOLFSSL_KEIL
  143604. "adcs r3, r3, %[r]\n\t"
  143605. #elif defined(__clang__)
  143606. "adcs r3, %[r]\n\t"
  143607. #else
  143608. "adc r3, %[r]\n\t"
  143609. #endif
  143610. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143611. "lsrs r7, %[b], #16\n\t"
  143612. #else
  143613. "lsr r7, %[b], #16\n\t"
  143614. #endif
  143615. #ifdef WOLFSSL_KEIL
  143616. "muls r6, r7, r6\n\t"
  143617. #elif defined(__clang__)
  143618. "muls r6, r7\n\t"
  143619. #else
  143620. "mul r6, r7\n\t"
  143621. #endif
  143622. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143623. "lsrs r7, r6, #16\n\t"
  143624. #else
  143625. "lsr r7, r6, #16\n\t"
  143626. #endif
  143627. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143628. "lsls r6, r6, #16\n\t"
  143629. #else
  143630. "lsl r6, r6, #16\n\t"
  143631. #endif
  143632. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143633. "adds r4, r4, r6\n\t"
  143634. #else
  143635. "add r4, r4, r6\n\t"
  143636. #endif
  143637. #ifdef WOLFSSL_KEIL
  143638. "adcs r5, r5, r7\n\t"
  143639. #elif defined(__clang__)
  143640. "adcs r5, r7\n\t"
  143641. #else
  143642. "adc r5, r7\n\t"
  143643. #endif
  143644. #ifdef WOLFSSL_KEIL
  143645. "adcs r3, r3, %[r]\n\t"
  143646. #elif defined(__clang__)
  143647. "adcs r3, %[r]\n\t"
  143648. #else
  143649. "adc r3, %[r]\n\t"
  143650. #endif
  143651. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143652. "lsrs r6, %[a], #16\n\t"
  143653. #else
  143654. "lsr r6, %[a], #16\n\t"
  143655. #endif
  143656. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143657. "lsrs r7, %[b], #16\n\t"
  143658. #else
  143659. "lsr r7, %[b], #16\n\t"
  143660. #endif
  143661. #ifdef WOLFSSL_KEIL
  143662. "muls r7, r6, r7\n\t"
  143663. #elif defined(__clang__)
  143664. "muls r7, r6\n\t"
  143665. #else
  143666. "mul r7, r6\n\t"
  143667. #endif
  143668. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143669. "adds r5, r5, r7\n\t"
  143670. #else
  143671. "add r5, r5, r7\n\t"
  143672. #endif
  143673. #ifdef WOLFSSL_KEIL
  143674. "adcs r3, r3, %[r]\n\t"
  143675. #elif defined(__clang__)
  143676. "adcs r3, %[r]\n\t"
  143677. #else
  143678. "adc r3, %[r]\n\t"
  143679. #endif
  143680. "uxth r7, %[b]\n\t"
  143681. #ifdef WOLFSSL_KEIL
  143682. "muls r6, r7, r6\n\t"
  143683. #elif defined(__clang__)
  143684. "muls r6, r7\n\t"
  143685. #else
  143686. "mul r6, r7\n\t"
  143687. #endif
  143688. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143689. "lsrs r7, r6, #16\n\t"
  143690. #else
  143691. "lsr r7, r6, #16\n\t"
  143692. #endif
  143693. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143694. "lsls r6, r6, #16\n\t"
  143695. #else
  143696. "lsl r6, r6, #16\n\t"
  143697. #endif
  143698. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143699. "adds r4, r4, r6\n\t"
  143700. #else
  143701. "add r4, r4, r6\n\t"
  143702. #endif
  143703. #ifdef WOLFSSL_KEIL
  143704. "adcs r5, r5, r7\n\t"
  143705. #elif defined(__clang__)
  143706. "adcs r5, r7\n\t"
  143707. #else
  143708. "adc r5, r7\n\t"
  143709. #endif
  143710. #ifdef WOLFSSL_KEIL
  143711. "adcs r3, r3, %[r]\n\t"
  143712. #elif defined(__clang__)
  143713. "adcs r3, %[r]\n\t"
  143714. #else
  143715. "adc r3, %[r]\n\t"
  143716. #endif
  143717. "str r4, [sp, #40]\n\t"
  143718. "# A[0] * B[11]\n\t"
  143719. "movs r4, #0\n\t"
  143720. "mov %[a], r9\n\t"
  143721. "mov %[b], r10\n\t"
  143722. "ldr %[a], [%[a]]\n\t"
  143723. "ldr %[b], [%[b], #44]\n\t"
  143724. "uxth r6, %[a]\n\t"
  143725. "uxth r7, %[b]\n\t"
  143726. #ifdef WOLFSSL_KEIL
  143727. "muls r7, r6, r7\n\t"
  143728. #elif defined(__clang__)
  143729. "muls r7, r6\n\t"
  143730. #else
  143731. "mul r7, r6\n\t"
  143732. #endif
  143733. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143734. "adds r5, r5, r7\n\t"
  143735. #else
  143736. "add r5, r5, r7\n\t"
  143737. #endif
  143738. #ifdef WOLFSSL_KEIL
  143739. "adcs r3, r3, %[r]\n\t"
  143740. #elif defined(__clang__)
  143741. "adcs r3, %[r]\n\t"
  143742. #else
  143743. "adc r3, %[r]\n\t"
  143744. #endif
  143745. #ifdef WOLFSSL_KEIL
  143746. "adcs r4, r4, %[r]\n\t"
  143747. #elif defined(__clang__)
  143748. "adcs r4, %[r]\n\t"
  143749. #else
  143750. "adc r4, %[r]\n\t"
  143751. #endif
  143752. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143753. "lsrs r7, %[b], #16\n\t"
  143754. #else
  143755. "lsr r7, %[b], #16\n\t"
  143756. #endif
  143757. #ifdef WOLFSSL_KEIL
  143758. "muls r6, r7, r6\n\t"
  143759. #elif defined(__clang__)
  143760. "muls r6, r7\n\t"
  143761. #else
  143762. "mul r6, r7\n\t"
  143763. #endif
  143764. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143765. "lsrs r7, r6, #16\n\t"
  143766. #else
  143767. "lsr r7, r6, #16\n\t"
  143768. #endif
  143769. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143770. "lsls r6, r6, #16\n\t"
  143771. #else
  143772. "lsl r6, r6, #16\n\t"
  143773. #endif
  143774. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143775. "adds r5, r5, r6\n\t"
  143776. #else
  143777. "add r5, r5, r6\n\t"
  143778. #endif
  143779. #ifdef WOLFSSL_KEIL
  143780. "adcs r3, r3, r7\n\t"
  143781. #elif defined(__clang__)
  143782. "adcs r3, r7\n\t"
  143783. #else
  143784. "adc r3, r7\n\t"
  143785. #endif
  143786. #ifdef WOLFSSL_KEIL
  143787. "adcs r4, r4, %[r]\n\t"
  143788. #elif defined(__clang__)
  143789. "adcs r4, %[r]\n\t"
  143790. #else
  143791. "adc r4, %[r]\n\t"
  143792. #endif
  143793. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143794. "lsrs r6, %[a], #16\n\t"
  143795. #else
  143796. "lsr r6, %[a], #16\n\t"
  143797. #endif
  143798. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143799. "lsrs r7, %[b], #16\n\t"
  143800. #else
  143801. "lsr r7, %[b], #16\n\t"
  143802. #endif
  143803. #ifdef WOLFSSL_KEIL
  143804. "muls r7, r6, r7\n\t"
  143805. #elif defined(__clang__)
  143806. "muls r7, r6\n\t"
  143807. #else
  143808. "mul r7, r6\n\t"
  143809. #endif
  143810. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143811. "adds r3, r3, r7\n\t"
  143812. #else
  143813. "add r3, r3, r7\n\t"
  143814. #endif
  143815. #ifdef WOLFSSL_KEIL
  143816. "adcs r4, r4, %[r]\n\t"
  143817. #elif defined(__clang__)
  143818. "adcs r4, %[r]\n\t"
  143819. #else
  143820. "adc r4, %[r]\n\t"
  143821. #endif
  143822. "uxth r7, %[b]\n\t"
  143823. #ifdef WOLFSSL_KEIL
  143824. "muls r6, r7, r6\n\t"
  143825. #elif defined(__clang__)
  143826. "muls r6, r7\n\t"
  143827. #else
  143828. "mul r6, r7\n\t"
  143829. #endif
  143830. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143831. "lsrs r7, r6, #16\n\t"
  143832. #else
  143833. "lsr r7, r6, #16\n\t"
  143834. #endif
  143835. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143836. "lsls r6, r6, #16\n\t"
  143837. #else
  143838. "lsl r6, r6, #16\n\t"
  143839. #endif
  143840. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143841. "adds r5, r5, r6\n\t"
  143842. #else
  143843. "add r5, r5, r6\n\t"
  143844. #endif
  143845. #ifdef WOLFSSL_KEIL
  143846. "adcs r3, r3, r7\n\t"
  143847. #elif defined(__clang__)
  143848. "adcs r3, r7\n\t"
  143849. #else
  143850. "adc r3, r7\n\t"
  143851. #endif
  143852. #ifdef WOLFSSL_KEIL
  143853. "adcs r4, r4, %[r]\n\t"
  143854. #elif defined(__clang__)
  143855. "adcs r4, %[r]\n\t"
  143856. #else
  143857. "adc r4, %[r]\n\t"
  143858. #endif
  143859. "# A[1] * B[10]\n\t"
  143860. "mov %[a], r9\n\t"
  143861. "mov %[b], r10\n\t"
  143862. "ldr %[a], [%[a], #4]\n\t"
  143863. "ldr %[b], [%[b], #40]\n\t"
  143864. "uxth r6, %[a]\n\t"
  143865. "uxth r7, %[b]\n\t"
  143866. #ifdef WOLFSSL_KEIL
  143867. "muls r7, r6, r7\n\t"
  143868. #elif defined(__clang__)
  143869. "muls r7, r6\n\t"
  143870. #else
  143871. "mul r7, r6\n\t"
  143872. #endif
  143873. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143874. "adds r5, r5, r7\n\t"
  143875. #else
  143876. "add r5, r5, r7\n\t"
  143877. #endif
  143878. #ifdef WOLFSSL_KEIL
  143879. "adcs r3, r3, %[r]\n\t"
  143880. #elif defined(__clang__)
  143881. "adcs r3, %[r]\n\t"
  143882. #else
  143883. "adc r3, %[r]\n\t"
  143884. #endif
  143885. #ifdef WOLFSSL_KEIL
  143886. "adcs r4, r4, %[r]\n\t"
  143887. #elif defined(__clang__)
  143888. "adcs r4, %[r]\n\t"
  143889. #else
  143890. "adc r4, %[r]\n\t"
  143891. #endif
  143892. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143893. "lsrs r7, %[b], #16\n\t"
  143894. #else
  143895. "lsr r7, %[b], #16\n\t"
  143896. #endif
  143897. #ifdef WOLFSSL_KEIL
  143898. "muls r6, r7, r6\n\t"
  143899. #elif defined(__clang__)
  143900. "muls r6, r7\n\t"
  143901. #else
  143902. "mul r6, r7\n\t"
  143903. #endif
  143904. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143905. "lsrs r7, r6, #16\n\t"
  143906. #else
  143907. "lsr r7, r6, #16\n\t"
  143908. #endif
  143909. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143910. "lsls r6, r6, #16\n\t"
  143911. #else
  143912. "lsl r6, r6, #16\n\t"
  143913. #endif
  143914. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143915. "adds r5, r5, r6\n\t"
  143916. #else
  143917. "add r5, r5, r6\n\t"
  143918. #endif
  143919. #ifdef WOLFSSL_KEIL
  143920. "adcs r3, r3, r7\n\t"
  143921. #elif defined(__clang__)
  143922. "adcs r3, r7\n\t"
  143923. #else
  143924. "adc r3, r7\n\t"
  143925. #endif
  143926. #ifdef WOLFSSL_KEIL
  143927. "adcs r4, r4, %[r]\n\t"
  143928. #elif defined(__clang__)
  143929. "adcs r4, %[r]\n\t"
  143930. #else
  143931. "adc r4, %[r]\n\t"
  143932. #endif
  143933. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143934. "lsrs r6, %[a], #16\n\t"
  143935. #else
  143936. "lsr r6, %[a], #16\n\t"
  143937. #endif
  143938. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143939. "lsrs r7, %[b], #16\n\t"
  143940. #else
  143941. "lsr r7, %[b], #16\n\t"
  143942. #endif
  143943. #ifdef WOLFSSL_KEIL
  143944. "muls r7, r6, r7\n\t"
  143945. #elif defined(__clang__)
  143946. "muls r7, r6\n\t"
  143947. #else
  143948. "mul r7, r6\n\t"
  143949. #endif
  143950. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143951. "adds r3, r3, r7\n\t"
  143952. #else
  143953. "add r3, r3, r7\n\t"
  143954. #endif
  143955. #ifdef WOLFSSL_KEIL
  143956. "adcs r4, r4, %[r]\n\t"
  143957. #elif defined(__clang__)
  143958. "adcs r4, %[r]\n\t"
  143959. #else
  143960. "adc r4, %[r]\n\t"
  143961. #endif
  143962. "uxth r7, %[b]\n\t"
  143963. #ifdef WOLFSSL_KEIL
  143964. "muls r6, r7, r6\n\t"
  143965. #elif defined(__clang__)
  143966. "muls r6, r7\n\t"
  143967. #else
  143968. "mul r6, r7\n\t"
  143969. #endif
  143970. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143971. "lsrs r7, r6, #16\n\t"
  143972. #else
  143973. "lsr r7, r6, #16\n\t"
  143974. #endif
  143975. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143976. "lsls r6, r6, #16\n\t"
  143977. #else
  143978. "lsl r6, r6, #16\n\t"
  143979. #endif
  143980. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143981. "adds r5, r5, r6\n\t"
  143982. #else
  143983. "add r5, r5, r6\n\t"
  143984. #endif
  143985. #ifdef WOLFSSL_KEIL
  143986. "adcs r3, r3, r7\n\t"
  143987. #elif defined(__clang__)
  143988. "adcs r3, r7\n\t"
  143989. #else
  143990. "adc r3, r7\n\t"
  143991. #endif
  143992. #ifdef WOLFSSL_KEIL
  143993. "adcs r4, r4, %[r]\n\t"
  143994. #elif defined(__clang__)
  143995. "adcs r4, %[r]\n\t"
  143996. #else
  143997. "adc r4, %[r]\n\t"
  143998. #endif
  143999. "# A[2] * B[9]\n\t"
  144000. "mov %[a], r9\n\t"
  144001. "mov %[b], r10\n\t"
  144002. "ldr %[a], [%[a], #8]\n\t"
  144003. "ldr %[b], [%[b], #36]\n\t"
  144004. "uxth r6, %[a]\n\t"
  144005. "uxth r7, %[b]\n\t"
  144006. #ifdef WOLFSSL_KEIL
  144007. "muls r7, r6, r7\n\t"
  144008. #elif defined(__clang__)
  144009. "muls r7, r6\n\t"
  144010. #else
  144011. "mul r7, r6\n\t"
  144012. #endif
  144013. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144014. "adds r5, r5, r7\n\t"
  144015. #else
  144016. "add r5, r5, r7\n\t"
  144017. #endif
  144018. #ifdef WOLFSSL_KEIL
  144019. "adcs r3, r3, %[r]\n\t"
  144020. #elif defined(__clang__)
  144021. "adcs r3, %[r]\n\t"
  144022. #else
  144023. "adc r3, %[r]\n\t"
  144024. #endif
  144025. #ifdef WOLFSSL_KEIL
  144026. "adcs r4, r4, %[r]\n\t"
  144027. #elif defined(__clang__)
  144028. "adcs r4, %[r]\n\t"
  144029. #else
  144030. "adc r4, %[r]\n\t"
  144031. #endif
  144032. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144033. "lsrs r7, %[b], #16\n\t"
  144034. #else
  144035. "lsr r7, %[b], #16\n\t"
  144036. #endif
  144037. #ifdef WOLFSSL_KEIL
  144038. "muls r6, r7, r6\n\t"
  144039. #elif defined(__clang__)
  144040. "muls r6, r7\n\t"
  144041. #else
  144042. "mul r6, r7\n\t"
  144043. #endif
  144044. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144045. "lsrs r7, r6, #16\n\t"
  144046. #else
  144047. "lsr r7, r6, #16\n\t"
  144048. #endif
  144049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144050. "lsls r6, r6, #16\n\t"
  144051. #else
  144052. "lsl r6, r6, #16\n\t"
  144053. #endif
  144054. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144055. "adds r5, r5, r6\n\t"
  144056. #else
  144057. "add r5, r5, r6\n\t"
  144058. #endif
  144059. #ifdef WOLFSSL_KEIL
  144060. "adcs r3, r3, r7\n\t"
  144061. #elif defined(__clang__)
  144062. "adcs r3, r7\n\t"
  144063. #else
  144064. "adc r3, r7\n\t"
  144065. #endif
  144066. #ifdef WOLFSSL_KEIL
  144067. "adcs r4, r4, %[r]\n\t"
  144068. #elif defined(__clang__)
  144069. "adcs r4, %[r]\n\t"
  144070. #else
  144071. "adc r4, %[r]\n\t"
  144072. #endif
  144073. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144074. "lsrs r6, %[a], #16\n\t"
  144075. #else
  144076. "lsr r6, %[a], #16\n\t"
  144077. #endif
  144078. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144079. "lsrs r7, %[b], #16\n\t"
  144080. #else
  144081. "lsr r7, %[b], #16\n\t"
  144082. #endif
  144083. #ifdef WOLFSSL_KEIL
  144084. "muls r7, r6, r7\n\t"
  144085. #elif defined(__clang__)
  144086. "muls r7, r6\n\t"
  144087. #else
  144088. "mul r7, r6\n\t"
  144089. #endif
  144090. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144091. "adds r3, r3, r7\n\t"
  144092. #else
  144093. "add r3, r3, r7\n\t"
  144094. #endif
  144095. #ifdef WOLFSSL_KEIL
  144096. "adcs r4, r4, %[r]\n\t"
  144097. #elif defined(__clang__)
  144098. "adcs r4, %[r]\n\t"
  144099. #else
  144100. "adc r4, %[r]\n\t"
  144101. #endif
  144102. "uxth r7, %[b]\n\t"
  144103. #ifdef WOLFSSL_KEIL
  144104. "muls r6, r7, r6\n\t"
  144105. #elif defined(__clang__)
  144106. "muls r6, r7\n\t"
  144107. #else
  144108. "mul r6, r7\n\t"
  144109. #endif
  144110. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144111. "lsrs r7, r6, #16\n\t"
  144112. #else
  144113. "lsr r7, r6, #16\n\t"
  144114. #endif
  144115. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144116. "lsls r6, r6, #16\n\t"
  144117. #else
  144118. "lsl r6, r6, #16\n\t"
  144119. #endif
  144120. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144121. "adds r5, r5, r6\n\t"
  144122. #else
  144123. "add r5, r5, r6\n\t"
  144124. #endif
  144125. #ifdef WOLFSSL_KEIL
  144126. "adcs r3, r3, r7\n\t"
  144127. #elif defined(__clang__)
  144128. "adcs r3, r7\n\t"
  144129. #else
  144130. "adc r3, r7\n\t"
  144131. #endif
  144132. #ifdef WOLFSSL_KEIL
  144133. "adcs r4, r4, %[r]\n\t"
  144134. #elif defined(__clang__)
  144135. "adcs r4, %[r]\n\t"
  144136. #else
  144137. "adc r4, %[r]\n\t"
  144138. #endif
  144139. "# A[3] * B[8]\n\t"
  144140. "mov %[a], r9\n\t"
  144141. "mov %[b], r10\n\t"
  144142. "ldr %[a], [%[a], #12]\n\t"
  144143. "ldr %[b], [%[b], #32]\n\t"
  144144. "uxth r6, %[a]\n\t"
  144145. "uxth r7, %[b]\n\t"
  144146. #ifdef WOLFSSL_KEIL
  144147. "muls r7, r6, r7\n\t"
  144148. #elif defined(__clang__)
  144149. "muls r7, r6\n\t"
  144150. #else
  144151. "mul r7, r6\n\t"
  144152. #endif
  144153. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144154. "adds r5, r5, r7\n\t"
  144155. #else
  144156. "add r5, r5, r7\n\t"
  144157. #endif
  144158. #ifdef WOLFSSL_KEIL
  144159. "adcs r3, r3, %[r]\n\t"
  144160. #elif defined(__clang__)
  144161. "adcs r3, %[r]\n\t"
  144162. #else
  144163. "adc r3, %[r]\n\t"
  144164. #endif
  144165. #ifdef WOLFSSL_KEIL
  144166. "adcs r4, r4, %[r]\n\t"
  144167. #elif defined(__clang__)
  144168. "adcs r4, %[r]\n\t"
  144169. #else
  144170. "adc r4, %[r]\n\t"
  144171. #endif
  144172. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144173. "lsrs r7, %[b], #16\n\t"
  144174. #else
  144175. "lsr r7, %[b], #16\n\t"
  144176. #endif
  144177. #ifdef WOLFSSL_KEIL
  144178. "muls r6, r7, r6\n\t"
  144179. #elif defined(__clang__)
  144180. "muls r6, r7\n\t"
  144181. #else
  144182. "mul r6, r7\n\t"
  144183. #endif
  144184. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144185. "lsrs r7, r6, #16\n\t"
  144186. #else
  144187. "lsr r7, r6, #16\n\t"
  144188. #endif
  144189. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144190. "lsls r6, r6, #16\n\t"
  144191. #else
  144192. "lsl r6, r6, #16\n\t"
  144193. #endif
  144194. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144195. "adds r5, r5, r6\n\t"
  144196. #else
  144197. "add r5, r5, r6\n\t"
  144198. #endif
  144199. #ifdef WOLFSSL_KEIL
  144200. "adcs r3, r3, r7\n\t"
  144201. #elif defined(__clang__)
  144202. "adcs r3, r7\n\t"
  144203. #else
  144204. "adc r3, r7\n\t"
  144205. #endif
  144206. #ifdef WOLFSSL_KEIL
  144207. "adcs r4, r4, %[r]\n\t"
  144208. #elif defined(__clang__)
  144209. "adcs r4, %[r]\n\t"
  144210. #else
  144211. "adc r4, %[r]\n\t"
  144212. #endif
  144213. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144214. "lsrs r6, %[a], #16\n\t"
  144215. #else
  144216. "lsr r6, %[a], #16\n\t"
  144217. #endif
  144218. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144219. "lsrs r7, %[b], #16\n\t"
  144220. #else
  144221. "lsr r7, %[b], #16\n\t"
  144222. #endif
  144223. #ifdef WOLFSSL_KEIL
  144224. "muls r7, r6, r7\n\t"
  144225. #elif defined(__clang__)
  144226. "muls r7, r6\n\t"
  144227. #else
  144228. "mul r7, r6\n\t"
  144229. #endif
  144230. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144231. "adds r3, r3, r7\n\t"
  144232. #else
  144233. "add r3, r3, r7\n\t"
  144234. #endif
  144235. #ifdef WOLFSSL_KEIL
  144236. "adcs r4, r4, %[r]\n\t"
  144237. #elif defined(__clang__)
  144238. "adcs r4, %[r]\n\t"
  144239. #else
  144240. "adc r4, %[r]\n\t"
  144241. #endif
  144242. "uxth r7, %[b]\n\t"
  144243. #ifdef WOLFSSL_KEIL
  144244. "muls r6, r7, r6\n\t"
  144245. #elif defined(__clang__)
  144246. "muls r6, r7\n\t"
  144247. #else
  144248. "mul r6, r7\n\t"
  144249. #endif
  144250. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144251. "lsrs r7, r6, #16\n\t"
  144252. #else
  144253. "lsr r7, r6, #16\n\t"
  144254. #endif
  144255. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144256. "lsls r6, r6, #16\n\t"
  144257. #else
  144258. "lsl r6, r6, #16\n\t"
  144259. #endif
  144260. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144261. "adds r5, r5, r6\n\t"
  144262. #else
  144263. "add r5, r5, r6\n\t"
  144264. #endif
  144265. #ifdef WOLFSSL_KEIL
  144266. "adcs r3, r3, r7\n\t"
  144267. #elif defined(__clang__)
  144268. "adcs r3, r7\n\t"
  144269. #else
  144270. "adc r3, r7\n\t"
  144271. #endif
  144272. #ifdef WOLFSSL_KEIL
  144273. "adcs r4, r4, %[r]\n\t"
  144274. #elif defined(__clang__)
  144275. "adcs r4, %[r]\n\t"
  144276. #else
  144277. "adc r4, %[r]\n\t"
  144278. #endif
  144279. "# A[4] * B[7]\n\t"
  144280. "mov %[a], r9\n\t"
  144281. "mov %[b], r10\n\t"
  144282. "ldr %[a], [%[a], #16]\n\t"
  144283. "ldr %[b], [%[b], #28]\n\t"
  144284. "uxth r6, %[a]\n\t"
  144285. "uxth r7, %[b]\n\t"
  144286. #ifdef WOLFSSL_KEIL
  144287. "muls r7, r6, r7\n\t"
  144288. #elif defined(__clang__)
  144289. "muls r7, r6\n\t"
  144290. #else
  144291. "mul r7, r6\n\t"
  144292. #endif
  144293. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144294. "adds r5, r5, r7\n\t"
  144295. #else
  144296. "add r5, r5, r7\n\t"
  144297. #endif
  144298. #ifdef WOLFSSL_KEIL
  144299. "adcs r3, r3, %[r]\n\t"
  144300. #elif defined(__clang__)
  144301. "adcs r3, %[r]\n\t"
  144302. #else
  144303. "adc r3, %[r]\n\t"
  144304. #endif
  144305. #ifdef WOLFSSL_KEIL
  144306. "adcs r4, r4, %[r]\n\t"
  144307. #elif defined(__clang__)
  144308. "adcs r4, %[r]\n\t"
  144309. #else
  144310. "adc r4, %[r]\n\t"
  144311. #endif
  144312. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144313. "lsrs r7, %[b], #16\n\t"
  144314. #else
  144315. "lsr r7, %[b], #16\n\t"
  144316. #endif
  144317. #ifdef WOLFSSL_KEIL
  144318. "muls r6, r7, r6\n\t"
  144319. #elif defined(__clang__)
  144320. "muls r6, r7\n\t"
  144321. #else
  144322. "mul r6, r7\n\t"
  144323. #endif
  144324. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144325. "lsrs r7, r6, #16\n\t"
  144326. #else
  144327. "lsr r7, r6, #16\n\t"
  144328. #endif
  144329. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144330. "lsls r6, r6, #16\n\t"
  144331. #else
  144332. "lsl r6, r6, #16\n\t"
  144333. #endif
  144334. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144335. "adds r5, r5, r6\n\t"
  144336. #else
  144337. "add r5, r5, r6\n\t"
  144338. #endif
  144339. #ifdef WOLFSSL_KEIL
  144340. "adcs r3, r3, r7\n\t"
  144341. #elif defined(__clang__)
  144342. "adcs r3, r7\n\t"
  144343. #else
  144344. "adc r3, r7\n\t"
  144345. #endif
  144346. #ifdef WOLFSSL_KEIL
  144347. "adcs r4, r4, %[r]\n\t"
  144348. #elif defined(__clang__)
  144349. "adcs r4, %[r]\n\t"
  144350. #else
  144351. "adc r4, %[r]\n\t"
  144352. #endif
  144353. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144354. "lsrs r6, %[a], #16\n\t"
  144355. #else
  144356. "lsr r6, %[a], #16\n\t"
  144357. #endif
  144358. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144359. "lsrs r7, %[b], #16\n\t"
  144360. #else
  144361. "lsr r7, %[b], #16\n\t"
  144362. #endif
  144363. #ifdef WOLFSSL_KEIL
  144364. "muls r7, r6, r7\n\t"
  144365. #elif defined(__clang__)
  144366. "muls r7, r6\n\t"
  144367. #else
  144368. "mul r7, r6\n\t"
  144369. #endif
  144370. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144371. "adds r3, r3, r7\n\t"
  144372. #else
  144373. "add r3, r3, r7\n\t"
  144374. #endif
  144375. #ifdef WOLFSSL_KEIL
  144376. "adcs r4, r4, %[r]\n\t"
  144377. #elif defined(__clang__)
  144378. "adcs r4, %[r]\n\t"
  144379. #else
  144380. "adc r4, %[r]\n\t"
  144381. #endif
  144382. "uxth r7, %[b]\n\t"
  144383. #ifdef WOLFSSL_KEIL
  144384. "muls r6, r7, r6\n\t"
  144385. #elif defined(__clang__)
  144386. "muls r6, r7\n\t"
  144387. #else
  144388. "mul r6, r7\n\t"
  144389. #endif
  144390. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144391. "lsrs r7, r6, #16\n\t"
  144392. #else
  144393. "lsr r7, r6, #16\n\t"
  144394. #endif
  144395. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144396. "lsls r6, r6, #16\n\t"
  144397. #else
  144398. "lsl r6, r6, #16\n\t"
  144399. #endif
  144400. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144401. "adds r5, r5, r6\n\t"
  144402. #else
  144403. "add r5, r5, r6\n\t"
  144404. #endif
  144405. #ifdef WOLFSSL_KEIL
  144406. "adcs r3, r3, r7\n\t"
  144407. #elif defined(__clang__)
  144408. "adcs r3, r7\n\t"
  144409. #else
  144410. "adc r3, r7\n\t"
  144411. #endif
  144412. #ifdef WOLFSSL_KEIL
  144413. "adcs r4, r4, %[r]\n\t"
  144414. #elif defined(__clang__)
  144415. "adcs r4, %[r]\n\t"
  144416. #else
  144417. "adc r4, %[r]\n\t"
  144418. #endif
  144419. "# A[5] * B[6]\n\t"
  144420. "mov %[a], r9\n\t"
  144421. "mov %[b], r10\n\t"
  144422. "ldr %[a], [%[a], #20]\n\t"
  144423. "ldr %[b], [%[b], #24]\n\t"
  144424. "uxth r6, %[a]\n\t"
  144425. "uxth r7, %[b]\n\t"
  144426. #ifdef WOLFSSL_KEIL
  144427. "muls r7, r6, r7\n\t"
  144428. #elif defined(__clang__)
  144429. "muls r7, r6\n\t"
  144430. #else
  144431. "mul r7, r6\n\t"
  144432. #endif
  144433. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144434. "adds r5, r5, r7\n\t"
  144435. #else
  144436. "add r5, r5, r7\n\t"
  144437. #endif
  144438. #ifdef WOLFSSL_KEIL
  144439. "adcs r3, r3, %[r]\n\t"
  144440. #elif defined(__clang__)
  144441. "adcs r3, %[r]\n\t"
  144442. #else
  144443. "adc r3, %[r]\n\t"
  144444. #endif
  144445. #ifdef WOLFSSL_KEIL
  144446. "adcs r4, r4, %[r]\n\t"
  144447. #elif defined(__clang__)
  144448. "adcs r4, %[r]\n\t"
  144449. #else
  144450. "adc r4, %[r]\n\t"
  144451. #endif
  144452. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144453. "lsrs r7, %[b], #16\n\t"
  144454. #else
  144455. "lsr r7, %[b], #16\n\t"
  144456. #endif
  144457. #ifdef WOLFSSL_KEIL
  144458. "muls r6, r7, r6\n\t"
  144459. #elif defined(__clang__)
  144460. "muls r6, r7\n\t"
  144461. #else
  144462. "mul r6, r7\n\t"
  144463. #endif
  144464. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144465. "lsrs r7, r6, #16\n\t"
  144466. #else
  144467. "lsr r7, r6, #16\n\t"
  144468. #endif
  144469. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144470. "lsls r6, r6, #16\n\t"
  144471. #else
  144472. "lsl r6, r6, #16\n\t"
  144473. #endif
  144474. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144475. "adds r5, r5, r6\n\t"
  144476. #else
  144477. "add r5, r5, r6\n\t"
  144478. #endif
  144479. #ifdef WOLFSSL_KEIL
  144480. "adcs r3, r3, r7\n\t"
  144481. #elif defined(__clang__)
  144482. "adcs r3, r7\n\t"
  144483. #else
  144484. "adc r3, r7\n\t"
  144485. #endif
  144486. #ifdef WOLFSSL_KEIL
  144487. "adcs r4, r4, %[r]\n\t"
  144488. #elif defined(__clang__)
  144489. "adcs r4, %[r]\n\t"
  144490. #else
  144491. "adc r4, %[r]\n\t"
  144492. #endif
  144493. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144494. "lsrs r6, %[a], #16\n\t"
  144495. #else
  144496. "lsr r6, %[a], #16\n\t"
  144497. #endif
  144498. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144499. "lsrs r7, %[b], #16\n\t"
  144500. #else
  144501. "lsr r7, %[b], #16\n\t"
  144502. #endif
  144503. #ifdef WOLFSSL_KEIL
  144504. "muls r7, r6, r7\n\t"
  144505. #elif defined(__clang__)
  144506. "muls r7, r6\n\t"
  144507. #else
  144508. "mul r7, r6\n\t"
  144509. #endif
  144510. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144511. "adds r3, r3, r7\n\t"
  144512. #else
  144513. "add r3, r3, r7\n\t"
  144514. #endif
  144515. #ifdef WOLFSSL_KEIL
  144516. "adcs r4, r4, %[r]\n\t"
  144517. #elif defined(__clang__)
  144518. "adcs r4, %[r]\n\t"
  144519. #else
  144520. "adc r4, %[r]\n\t"
  144521. #endif
  144522. "uxth r7, %[b]\n\t"
  144523. #ifdef WOLFSSL_KEIL
  144524. "muls r6, r7, r6\n\t"
  144525. #elif defined(__clang__)
  144526. "muls r6, r7\n\t"
  144527. #else
  144528. "mul r6, r7\n\t"
  144529. #endif
  144530. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144531. "lsrs r7, r6, #16\n\t"
  144532. #else
  144533. "lsr r7, r6, #16\n\t"
  144534. #endif
  144535. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144536. "lsls r6, r6, #16\n\t"
  144537. #else
  144538. "lsl r6, r6, #16\n\t"
  144539. #endif
  144540. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144541. "adds r5, r5, r6\n\t"
  144542. #else
  144543. "add r5, r5, r6\n\t"
  144544. #endif
  144545. #ifdef WOLFSSL_KEIL
  144546. "adcs r3, r3, r7\n\t"
  144547. #elif defined(__clang__)
  144548. "adcs r3, r7\n\t"
  144549. #else
  144550. "adc r3, r7\n\t"
  144551. #endif
  144552. #ifdef WOLFSSL_KEIL
  144553. "adcs r4, r4, %[r]\n\t"
  144554. #elif defined(__clang__)
  144555. "adcs r4, %[r]\n\t"
  144556. #else
  144557. "adc r4, %[r]\n\t"
  144558. #endif
  144559. "# A[6] * B[5]\n\t"
  144560. "mov %[a], r9\n\t"
  144561. "mov %[b], r10\n\t"
  144562. "ldr %[a], [%[a], #24]\n\t"
  144563. "ldr %[b], [%[b], #20]\n\t"
  144564. "uxth r6, %[a]\n\t"
  144565. "uxth r7, %[b]\n\t"
  144566. #ifdef WOLFSSL_KEIL
  144567. "muls r7, r6, r7\n\t"
  144568. #elif defined(__clang__)
  144569. "muls r7, r6\n\t"
  144570. #else
  144571. "mul r7, r6\n\t"
  144572. #endif
  144573. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144574. "adds r5, r5, r7\n\t"
  144575. #else
  144576. "add r5, r5, r7\n\t"
  144577. #endif
  144578. #ifdef WOLFSSL_KEIL
  144579. "adcs r3, r3, %[r]\n\t"
  144580. #elif defined(__clang__)
  144581. "adcs r3, %[r]\n\t"
  144582. #else
  144583. "adc r3, %[r]\n\t"
  144584. #endif
  144585. #ifdef WOLFSSL_KEIL
  144586. "adcs r4, r4, %[r]\n\t"
  144587. #elif defined(__clang__)
  144588. "adcs r4, %[r]\n\t"
  144589. #else
  144590. "adc r4, %[r]\n\t"
  144591. #endif
  144592. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144593. "lsrs r7, %[b], #16\n\t"
  144594. #else
  144595. "lsr r7, %[b], #16\n\t"
  144596. #endif
  144597. #ifdef WOLFSSL_KEIL
  144598. "muls r6, r7, r6\n\t"
  144599. #elif defined(__clang__)
  144600. "muls r6, r7\n\t"
  144601. #else
  144602. "mul r6, r7\n\t"
  144603. #endif
  144604. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144605. "lsrs r7, r6, #16\n\t"
  144606. #else
  144607. "lsr r7, r6, #16\n\t"
  144608. #endif
  144609. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144610. "lsls r6, r6, #16\n\t"
  144611. #else
  144612. "lsl r6, r6, #16\n\t"
  144613. #endif
  144614. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144615. "adds r5, r5, r6\n\t"
  144616. #else
  144617. "add r5, r5, r6\n\t"
  144618. #endif
  144619. #ifdef WOLFSSL_KEIL
  144620. "adcs r3, r3, r7\n\t"
  144621. #elif defined(__clang__)
  144622. "adcs r3, r7\n\t"
  144623. #else
  144624. "adc r3, r7\n\t"
  144625. #endif
  144626. #ifdef WOLFSSL_KEIL
  144627. "adcs r4, r4, %[r]\n\t"
  144628. #elif defined(__clang__)
  144629. "adcs r4, %[r]\n\t"
  144630. #else
  144631. "adc r4, %[r]\n\t"
  144632. #endif
  144633. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144634. "lsrs r6, %[a], #16\n\t"
  144635. #else
  144636. "lsr r6, %[a], #16\n\t"
  144637. #endif
  144638. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144639. "lsrs r7, %[b], #16\n\t"
  144640. #else
  144641. "lsr r7, %[b], #16\n\t"
  144642. #endif
  144643. #ifdef WOLFSSL_KEIL
  144644. "muls r7, r6, r7\n\t"
  144645. #elif defined(__clang__)
  144646. "muls r7, r6\n\t"
  144647. #else
  144648. "mul r7, r6\n\t"
  144649. #endif
  144650. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144651. "adds r3, r3, r7\n\t"
  144652. #else
  144653. "add r3, r3, r7\n\t"
  144654. #endif
  144655. #ifdef WOLFSSL_KEIL
  144656. "adcs r4, r4, %[r]\n\t"
  144657. #elif defined(__clang__)
  144658. "adcs r4, %[r]\n\t"
  144659. #else
  144660. "adc r4, %[r]\n\t"
  144661. #endif
  144662. "uxth r7, %[b]\n\t"
  144663. #ifdef WOLFSSL_KEIL
  144664. "muls r6, r7, r6\n\t"
  144665. #elif defined(__clang__)
  144666. "muls r6, r7\n\t"
  144667. #else
  144668. "mul r6, r7\n\t"
  144669. #endif
  144670. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144671. "lsrs r7, r6, #16\n\t"
  144672. #else
  144673. "lsr r7, r6, #16\n\t"
  144674. #endif
  144675. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144676. "lsls r6, r6, #16\n\t"
  144677. #else
  144678. "lsl r6, r6, #16\n\t"
  144679. #endif
  144680. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144681. "adds r5, r5, r6\n\t"
  144682. #else
  144683. "add r5, r5, r6\n\t"
  144684. #endif
  144685. #ifdef WOLFSSL_KEIL
  144686. "adcs r3, r3, r7\n\t"
  144687. #elif defined(__clang__)
  144688. "adcs r3, r7\n\t"
  144689. #else
  144690. "adc r3, r7\n\t"
  144691. #endif
  144692. #ifdef WOLFSSL_KEIL
  144693. "adcs r4, r4, %[r]\n\t"
  144694. #elif defined(__clang__)
  144695. "adcs r4, %[r]\n\t"
  144696. #else
  144697. "adc r4, %[r]\n\t"
  144698. #endif
  144699. "# A[7] * B[4]\n\t"
  144700. "mov %[a], r9\n\t"
  144701. "mov %[b], r10\n\t"
  144702. "ldr %[a], [%[a], #28]\n\t"
  144703. "ldr %[b], [%[b], #16]\n\t"
  144704. "uxth r6, %[a]\n\t"
  144705. "uxth r7, %[b]\n\t"
  144706. #ifdef WOLFSSL_KEIL
  144707. "muls r7, r6, r7\n\t"
  144708. #elif defined(__clang__)
  144709. "muls r7, r6\n\t"
  144710. #else
  144711. "mul r7, r6\n\t"
  144712. #endif
  144713. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144714. "adds r5, r5, r7\n\t"
  144715. #else
  144716. "add r5, r5, r7\n\t"
  144717. #endif
  144718. #ifdef WOLFSSL_KEIL
  144719. "adcs r3, r3, %[r]\n\t"
  144720. #elif defined(__clang__)
  144721. "adcs r3, %[r]\n\t"
  144722. #else
  144723. "adc r3, %[r]\n\t"
  144724. #endif
  144725. #ifdef WOLFSSL_KEIL
  144726. "adcs r4, r4, %[r]\n\t"
  144727. #elif defined(__clang__)
  144728. "adcs r4, %[r]\n\t"
  144729. #else
  144730. "adc r4, %[r]\n\t"
  144731. #endif
  144732. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144733. "lsrs r7, %[b], #16\n\t"
  144734. #else
  144735. "lsr r7, %[b], #16\n\t"
  144736. #endif
  144737. #ifdef WOLFSSL_KEIL
  144738. "muls r6, r7, r6\n\t"
  144739. #elif defined(__clang__)
  144740. "muls r6, r7\n\t"
  144741. #else
  144742. "mul r6, r7\n\t"
  144743. #endif
  144744. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144745. "lsrs r7, r6, #16\n\t"
  144746. #else
  144747. "lsr r7, r6, #16\n\t"
  144748. #endif
  144749. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144750. "lsls r6, r6, #16\n\t"
  144751. #else
  144752. "lsl r6, r6, #16\n\t"
  144753. #endif
  144754. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144755. "adds r5, r5, r6\n\t"
  144756. #else
  144757. "add r5, r5, r6\n\t"
  144758. #endif
  144759. #ifdef WOLFSSL_KEIL
  144760. "adcs r3, r3, r7\n\t"
  144761. #elif defined(__clang__)
  144762. "adcs r3, r7\n\t"
  144763. #else
  144764. "adc r3, r7\n\t"
  144765. #endif
  144766. #ifdef WOLFSSL_KEIL
  144767. "adcs r4, r4, %[r]\n\t"
  144768. #elif defined(__clang__)
  144769. "adcs r4, %[r]\n\t"
  144770. #else
  144771. "adc r4, %[r]\n\t"
  144772. #endif
  144773. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144774. "lsrs r6, %[a], #16\n\t"
  144775. #else
  144776. "lsr r6, %[a], #16\n\t"
  144777. #endif
  144778. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144779. "lsrs r7, %[b], #16\n\t"
  144780. #else
  144781. "lsr r7, %[b], #16\n\t"
  144782. #endif
  144783. #ifdef WOLFSSL_KEIL
  144784. "muls r7, r6, r7\n\t"
  144785. #elif defined(__clang__)
  144786. "muls r7, r6\n\t"
  144787. #else
  144788. "mul r7, r6\n\t"
  144789. #endif
  144790. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144791. "adds r3, r3, r7\n\t"
  144792. #else
  144793. "add r3, r3, r7\n\t"
  144794. #endif
  144795. #ifdef WOLFSSL_KEIL
  144796. "adcs r4, r4, %[r]\n\t"
  144797. #elif defined(__clang__)
  144798. "adcs r4, %[r]\n\t"
  144799. #else
  144800. "adc r4, %[r]\n\t"
  144801. #endif
  144802. "uxth r7, %[b]\n\t"
  144803. #ifdef WOLFSSL_KEIL
  144804. "muls r6, r7, r6\n\t"
  144805. #elif defined(__clang__)
  144806. "muls r6, r7\n\t"
  144807. #else
  144808. "mul r6, r7\n\t"
  144809. #endif
  144810. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144811. "lsrs r7, r6, #16\n\t"
  144812. #else
  144813. "lsr r7, r6, #16\n\t"
  144814. #endif
  144815. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144816. "lsls r6, r6, #16\n\t"
  144817. #else
  144818. "lsl r6, r6, #16\n\t"
  144819. #endif
  144820. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144821. "adds r5, r5, r6\n\t"
  144822. #else
  144823. "add r5, r5, r6\n\t"
  144824. #endif
  144825. #ifdef WOLFSSL_KEIL
  144826. "adcs r3, r3, r7\n\t"
  144827. #elif defined(__clang__)
  144828. "adcs r3, r7\n\t"
  144829. #else
  144830. "adc r3, r7\n\t"
  144831. #endif
  144832. #ifdef WOLFSSL_KEIL
  144833. "adcs r4, r4, %[r]\n\t"
  144834. #elif defined(__clang__)
  144835. "adcs r4, %[r]\n\t"
  144836. #else
  144837. "adc r4, %[r]\n\t"
  144838. #endif
  144839. "# A[8] * B[3]\n\t"
  144840. "mov %[a], r9\n\t"
  144841. "mov %[b], r10\n\t"
  144842. "ldr %[a], [%[a], #32]\n\t"
  144843. "ldr %[b], [%[b], #12]\n\t"
  144844. "uxth r6, %[a]\n\t"
  144845. "uxth r7, %[b]\n\t"
  144846. #ifdef WOLFSSL_KEIL
  144847. "muls r7, r6, r7\n\t"
  144848. #elif defined(__clang__)
  144849. "muls r7, r6\n\t"
  144850. #else
  144851. "mul r7, r6\n\t"
  144852. #endif
  144853. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144854. "adds r5, r5, r7\n\t"
  144855. #else
  144856. "add r5, r5, r7\n\t"
  144857. #endif
  144858. #ifdef WOLFSSL_KEIL
  144859. "adcs r3, r3, %[r]\n\t"
  144860. #elif defined(__clang__)
  144861. "adcs r3, %[r]\n\t"
  144862. #else
  144863. "adc r3, %[r]\n\t"
  144864. #endif
  144865. #ifdef WOLFSSL_KEIL
  144866. "adcs r4, r4, %[r]\n\t"
  144867. #elif defined(__clang__)
  144868. "adcs r4, %[r]\n\t"
  144869. #else
  144870. "adc r4, %[r]\n\t"
  144871. #endif
  144872. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144873. "lsrs r7, %[b], #16\n\t"
  144874. #else
  144875. "lsr r7, %[b], #16\n\t"
  144876. #endif
  144877. #ifdef WOLFSSL_KEIL
  144878. "muls r6, r7, r6\n\t"
  144879. #elif defined(__clang__)
  144880. "muls r6, r7\n\t"
  144881. #else
  144882. "mul r6, r7\n\t"
  144883. #endif
  144884. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144885. "lsrs r7, r6, #16\n\t"
  144886. #else
  144887. "lsr r7, r6, #16\n\t"
  144888. #endif
  144889. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144890. "lsls r6, r6, #16\n\t"
  144891. #else
  144892. "lsl r6, r6, #16\n\t"
  144893. #endif
  144894. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144895. "adds r5, r5, r6\n\t"
  144896. #else
  144897. "add r5, r5, r6\n\t"
  144898. #endif
  144899. #ifdef WOLFSSL_KEIL
  144900. "adcs r3, r3, r7\n\t"
  144901. #elif defined(__clang__)
  144902. "adcs r3, r7\n\t"
  144903. #else
  144904. "adc r3, r7\n\t"
  144905. #endif
  144906. #ifdef WOLFSSL_KEIL
  144907. "adcs r4, r4, %[r]\n\t"
  144908. #elif defined(__clang__)
  144909. "adcs r4, %[r]\n\t"
  144910. #else
  144911. "adc r4, %[r]\n\t"
  144912. #endif
  144913. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144914. "lsrs r6, %[a], #16\n\t"
  144915. #else
  144916. "lsr r6, %[a], #16\n\t"
  144917. #endif
  144918. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144919. "lsrs r7, %[b], #16\n\t"
  144920. #else
  144921. "lsr r7, %[b], #16\n\t"
  144922. #endif
  144923. #ifdef WOLFSSL_KEIL
  144924. "muls r7, r6, r7\n\t"
  144925. #elif defined(__clang__)
  144926. "muls r7, r6\n\t"
  144927. #else
  144928. "mul r7, r6\n\t"
  144929. #endif
  144930. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144931. "adds r3, r3, r7\n\t"
  144932. #else
  144933. "add r3, r3, r7\n\t"
  144934. #endif
  144935. #ifdef WOLFSSL_KEIL
  144936. "adcs r4, r4, %[r]\n\t"
  144937. #elif defined(__clang__)
  144938. "adcs r4, %[r]\n\t"
  144939. #else
  144940. "adc r4, %[r]\n\t"
  144941. #endif
  144942. "uxth r7, %[b]\n\t"
  144943. #ifdef WOLFSSL_KEIL
  144944. "muls r6, r7, r6\n\t"
  144945. #elif defined(__clang__)
  144946. "muls r6, r7\n\t"
  144947. #else
  144948. "mul r6, r7\n\t"
  144949. #endif
  144950. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144951. "lsrs r7, r6, #16\n\t"
  144952. #else
  144953. "lsr r7, r6, #16\n\t"
  144954. #endif
  144955. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144956. "lsls r6, r6, #16\n\t"
  144957. #else
  144958. "lsl r6, r6, #16\n\t"
  144959. #endif
  144960. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144961. "adds r5, r5, r6\n\t"
  144962. #else
  144963. "add r5, r5, r6\n\t"
  144964. #endif
  144965. #ifdef WOLFSSL_KEIL
  144966. "adcs r3, r3, r7\n\t"
  144967. #elif defined(__clang__)
  144968. "adcs r3, r7\n\t"
  144969. #else
  144970. "adc r3, r7\n\t"
  144971. #endif
  144972. #ifdef WOLFSSL_KEIL
  144973. "adcs r4, r4, %[r]\n\t"
  144974. #elif defined(__clang__)
  144975. "adcs r4, %[r]\n\t"
  144976. #else
  144977. "adc r4, %[r]\n\t"
  144978. #endif
  144979. "# A[9] * B[2]\n\t"
  144980. "mov %[a], r9\n\t"
  144981. "mov %[b], r10\n\t"
  144982. "ldr %[a], [%[a], #36]\n\t"
  144983. "ldr %[b], [%[b], #8]\n\t"
  144984. "uxth r6, %[a]\n\t"
  144985. "uxth r7, %[b]\n\t"
  144986. #ifdef WOLFSSL_KEIL
  144987. "muls r7, r6, r7\n\t"
  144988. #elif defined(__clang__)
  144989. "muls r7, r6\n\t"
  144990. #else
  144991. "mul r7, r6\n\t"
  144992. #endif
  144993. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144994. "adds r5, r5, r7\n\t"
  144995. #else
  144996. "add r5, r5, r7\n\t"
  144997. #endif
  144998. #ifdef WOLFSSL_KEIL
  144999. "adcs r3, r3, %[r]\n\t"
  145000. #elif defined(__clang__)
  145001. "adcs r3, %[r]\n\t"
  145002. #else
  145003. "adc r3, %[r]\n\t"
  145004. #endif
  145005. #ifdef WOLFSSL_KEIL
  145006. "adcs r4, r4, %[r]\n\t"
  145007. #elif defined(__clang__)
  145008. "adcs r4, %[r]\n\t"
  145009. #else
  145010. "adc r4, %[r]\n\t"
  145011. #endif
  145012. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145013. "lsrs r7, %[b], #16\n\t"
  145014. #else
  145015. "lsr r7, %[b], #16\n\t"
  145016. #endif
  145017. #ifdef WOLFSSL_KEIL
  145018. "muls r6, r7, r6\n\t"
  145019. #elif defined(__clang__)
  145020. "muls r6, r7\n\t"
  145021. #else
  145022. "mul r6, r7\n\t"
  145023. #endif
  145024. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145025. "lsrs r7, r6, #16\n\t"
  145026. #else
  145027. "lsr r7, r6, #16\n\t"
  145028. #endif
  145029. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145030. "lsls r6, r6, #16\n\t"
  145031. #else
  145032. "lsl r6, r6, #16\n\t"
  145033. #endif
  145034. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145035. "adds r5, r5, r6\n\t"
  145036. #else
  145037. "add r5, r5, r6\n\t"
  145038. #endif
  145039. #ifdef WOLFSSL_KEIL
  145040. "adcs r3, r3, r7\n\t"
  145041. #elif defined(__clang__)
  145042. "adcs r3, r7\n\t"
  145043. #else
  145044. "adc r3, r7\n\t"
  145045. #endif
  145046. #ifdef WOLFSSL_KEIL
  145047. "adcs r4, r4, %[r]\n\t"
  145048. #elif defined(__clang__)
  145049. "adcs r4, %[r]\n\t"
  145050. #else
  145051. "adc r4, %[r]\n\t"
  145052. #endif
  145053. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145054. "lsrs r6, %[a], #16\n\t"
  145055. #else
  145056. "lsr r6, %[a], #16\n\t"
  145057. #endif
  145058. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145059. "lsrs r7, %[b], #16\n\t"
  145060. #else
  145061. "lsr r7, %[b], #16\n\t"
  145062. #endif
  145063. #ifdef WOLFSSL_KEIL
  145064. "muls r7, r6, r7\n\t"
  145065. #elif defined(__clang__)
  145066. "muls r7, r6\n\t"
  145067. #else
  145068. "mul r7, r6\n\t"
  145069. #endif
  145070. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145071. "adds r3, r3, r7\n\t"
  145072. #else
  145073. "add r3, r3, r7\n\t"
  145074. #endif
  145075. #ifdef WOLFSSL_KEIL
  145076. "adcs r4, r4, %[r]\n\t"
  145077. #elif defined(__clang__)
  145078. "adcs r4, %[r]\n\t"
  145079. #else
  145080. "adc r4, %[r]\n\t"
  145081. #endif
  145082. "uxth r7, %[b]\n\t"
  145083. #ifdef WOLFSSL_KEIL
  145084. "muls r6, r7, r6\n\t"
  145085. #elif defined(__clang__)
  145086. "muls r6, r7\n\t"
  145087. #else
  145088. "mul r6, r7\n\t"
  145089. #endif
  145090. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145091. "lsrs r7, r6, #16\n\t"
  145092. #else
  145093. "lsr r7, r6, #16\n\t"
  145094. #endif
  145095. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145096. "lsls r6, r6, #16\n\t"
  145097. #else
  145098. "lsl r6, r6, #16\n\t"
  145099. #endif
  145100. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145101. "adds r5, r5, r6\n\t"
  145102. #else
  145103. "add r5, r5, r6\n\t"
  145104. #endif
  145105. #ifdef WOLFSSL_KEIL
  145106. "adcs r3, r3, r7\n\t"
  145107. #elif defined(__clang__)
  145108. "adcs r3, r7\n\t"
  145109. #else
  145110. "adc r3, r7\n\t"
  145111. #endif
  145112. #ifdef WOLFSSL_KEIL
  145113. "adcs r4, r4, %[r]\n\t"
  145114. #elif defined(__clang__)
  145115. "adcs r4, %[r]\n\t"
  145116. #else
  145117. "adc r4, %[r]\n\t"
  145118. #endif
  145119. "# A[10] * B[1]\n\t"
  145120. "mov %[a], r9\n\t"
  145121. "mov %[b], r10\n\t"
  145122. "ldr %[a], [%[a], #40]\n\t"
  145123. "ldr %[b], [%[b], #4]\n\t"
  145124. "uxth r6, %[a]\n\t"
  145125. "uxth r7, %[b]\n\t"
  145126. #ifdef WOLFSSL_KEIL
  145127. "muls r7, r6, r7\n\t"
  145128. #elif defined(__clang__)
  145129. "muls r7, r6\n\t"
  145130. #else
  145131. "mul r7, r6\n\t"
  145132. #endif
  145133. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145134. "adds r5, r5, r7\n\t"
  145135. #else
  145136. "add r5, r5, r7\n\t"
  145137. #endif
  145138. #ifdef WOLFSSL_KEIL
  145139. "adcs r3, r3, %[r]\n\t"
  145140. #elif defined(__clang__)
  145141. "adcs r3, %[r]\n\t"
  145142. #else
  145143. "adc r3, %[r]\n\t"
  145144. #endif
  145145. #ifdef WOLFSSL_KEIL
  145146. "adcs r4, r4, %[r]\n\t"
  145147. #elif defined(__clang__)
  145148. "adcs r4, %[r]\n\t"
  145149. #else
  145150. "adc r4, %[r]\n\t"
  145151. #endif
  145152. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145153. "lsrs r7, %[b], #16\n\t"
  145154. #else
  145155. "lsr r7, %[b], #16\n\t"
  145156. #endif
  145157. #ifdef WOLFSSL_KEIL
  145158. "muls r6, r7, r6\n\t"
  145159. #elif defined(__clang__)
  145160. "muls r6, r7\n\t"
  145161. #else
  145162. "mul r6, r7\n\t"
  145163. #endif
  145164. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145165. "lsrs r7, r6, #16\n\t"
  145166. #else
  145167. "lsr r7, r6, #16\n\t"
  145168. #endif
  145169. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145170. "lsls r6, r6, #16\n\t"
  145171. #else
  145172. "lsl r6, r6, #16\n\t"
  145173. #endif
  145174. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145175. "adds r5, r5, r6\n\t"
  145176. #else
  145177. "add r5, r5, r6\n\t"
  145178. #endif
  145179. #ifdef WOLFSSL_KEIL
  145180. "adcs r3, r3, r7\n\t"
  145181. #elif defined(__clang__)
  145182. "adcs r3, r7\n\t"
  145183. #else
  145184. "adc r3, r7\n\t"
  145185. #endif
  145186. #ifdef WOLFSSL_KEIL
  145187. "adcs r4, r4, %[r]\n\t"
  145188. #elif defined(__clang__)
  145189. "adcs r4, %[r]\n\t"
  145190. #else
  145191. "adc r4, %[r]\n\t"
  145192. #endif
  145193. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145194. "lsrs r6, %[a], #16\n\t"
  145195. #else
  145196. "lsr r6, %[a], #16\n\t"
  145197. #endif
  145198. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145199. "lsrs r7, %[b], #16\n\t"
  145200. #else
  145201. "lsr r7, %[b], #16\n\t"
  145202. #endif
  145203. #ifdef WOLFSSL_KEIL
  145204. "muls r7, r6, r7\n\t"
  145205. #elif defined(__clang__)
  145206. "muls r7, r6\n\t"
  145207. #else
  145208. "mul r7, r6\n\t"
  145209. #endif
  145210. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145211. "adds r3, r3, r7\n\t"
  145212. #else
  145213. "add r3, r3, r7\n\t"
  145214. #endif
  145215. #ifdef WOLFSSL_KEIL
  145216. "adcs r4, r4, %[r]\n\t"
  145217. #elif defined(__clang__)
  145218. "adcs r4, %[r]\n\t"
  145219. #else
  145220. "adc r4, %[r]\n\t"
  145221. #endif
  145222. "uxth r7, %[b]\n\t"
  145223. #ifdef WOLFSSL_KEIL
  145224. "muls r6, r7, r6\n\t"
  145225. #elif defined(__clang__)
  145226. "muls r6, r7\n\t"
  145227. #else
  145228. "mul r6, r7\n\t"
  145229. #endif
  145230. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145231. "lsrs r7, r6, #16\n\t"
  145232. #else
  145233. "lsr r7, r6, #16\n\t"
  145234. #endif
  145235. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145236. "lsls r6, r6, #16\n\t"
  145237. #else
  145238. "lsl r6, r6, #16\n\t"
  145239. #endif
  145240. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145241. "adds r5, r5, r6\n\t"
  145242. #else
  145243. "add r5, r5, r6\n\t"
  145244. #endif
  145245. #ifdef WOLFSSL_KEIL
  145246. "adcs r3, r3, r7\n\t"
  145247. #elif defined(__clang__)
  145248. "adcs r3, r7\n\t"
  145249. #else
  145250. "adc r3, r7\n\t"
  145251. #endif
  145252. #ifdef WOLFSSL_KEIL
  145253. "adcs r4, r4, %[r]\n\t"
  145254. #elif defined(__clang__)
  145255. "adcs r4, %[r]\n\t"
  145256. #else
  145257. "adc r4, %[r]\n\t"
  145258. #endif
  145259. "# A[11] * B[0]\n\t"
  145260. "mov %[a], r9\n\t"
  145261. "mov %[b], r10\n\t"
  145262. "ldr %[a], [%[a], #44]\n\t"
  145263. "ldr %[b], [%[b]]\n\t"
  145264. "uxth r6, %[a]\n\t"
  145265. "uxth r7, %[b]\n\t"
  145266. #ifdef WOLFSSL_KEIL
  145267. "muls r7, r6, r7\n\t"
  145268. #elif defined(__clang__)
  145269. "muls r7, r6\n\t"
  145270. #else
  145271. "mul r7, r6\n\t"
  145272. #endif
  145273. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145274. "adds r5, r5, r7\n\t"
  145275. #else
  145276. "add r5, r5, r7\n\t"
  145277. #endif
  145278. #ifdef WOLFSSL_KEIL
  145279. "adcs r3, r3, %[r]\n\t"
  145280. #elif defined(__clang__)
  145281. "adcs r3, %[r]\n\t"
  145282. #else
  145283. "adc r3, %[r]\n\t"
  145284. #endif
  145285. #ifdef WOLFSSL_KEIL
  145286. "adcs r4, r4, %[r]\n\t"
  145287. #elif defined(__clang__)
  145288. "adcs r4, %[r]\n\t"
  145289. #else
  145290. "adc r4, %[r]\n\t"
  145291. #endif
  145292. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145293. "lsrs r7, %[b], #16\n\t"
  145294. #else
  145295. "lsr r7, %[b], #16\n\t"
  145296. #endif
  145297. #ifdef WOLFSSL_KEIL
  145298. "muls r6, r7, r6\n\t"
  145299. #elif defined(__clang__)
  145300. "muls r6, r7\n\t"
  145301. #else
  145302. "mul r6, r7\n\t"
  145303. #endif
  145304. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145305. "lsrs r7, r6, #16\n\t"
  145306. #else
  145307. "lsr r7, r6, #16\n\t"
  145308. #endif
  145309. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145310. "lsls r6, r6, #16\n\t"
  145311. #else
  145312. "lsl r6, r6, #16\n\t"
  145313. #endif
  145314. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145315. "adds r5, r5, r6\n\t"
  145316. #else
  145317. "add r5, r5, r6\n\t"
  145318. #endif
  145319. #ifdef WOLFSSL_KEIL
  145320. "adcs r3, r3, r7\n\t"
  145321. #elif defined(__clang__)
  145322. "adcs r3, r7\n\t"
  145323. #else
  145324. "adc r3, r7\n\t"
  145325. #endif
  145326. #ifdef WOLFSSL_KEIL
  145327. "adcs r4, r4, %[r]\n\t"
  145328. #elif defined(__clang__)
  145329. "adcs r4, %[r]\n\t"
  145330. #else
  145331. "adc r4, %[r]\n\t"
  145332. #endif
  145333. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145334. "lsrs r6, %[a], #16\n\t"
  145335. #else
  145336. "lsr r6, %[a], #16\n\t"
  145337. #endif
  145338. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145339. "lsrs r7, %[b], #16\n\t"
  145340. #else
  145341. "lsr r7, %[b], #16\n\t"
  145342. #endif
  145343. #ifdef WOLFSSL_KEIL
  145344. "muls r7, r6, r7\n\t"
  145345. #elif defined(__clang__)
  145346. "muls r7, r6\n\t"
  145347. #else
  145348. "mul r7, r6\n\t"
  145349. #endif
  145350. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145351. "adds r3, r3, r7\n\t"
  145352. #else
  145353. "add r3, r3, r7\n\t"
  145354. #endif
  145355. #ifdef WOLFSSL_KEIL
  145356. "adcs r4, r4, %[r]\n\t"
  145357. #elif defined(__clang__)
  145358. "adcs r4, %[r]\n\t"
  145359. #else
  145360. "adc r4, %[r]\n\t"
  145361. #endif
  145362. "uxth r7, %[b]\n\t"
  145363. #ifdef WOLFSSL_KEIL
  145364. "muls r6, r7, r6\n\t"
  145365. #elif defined(__clang__)
  145366. "muls r6, r7\n\t"
  145367. #else
  145368. "mul r6, r7\n\t"
  145369. #endif
  145370. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145371. "lsrs r7, r6, #16\n\t"
  145372. #else
  145373. "lsr r7, r6, #16\n\t"
  145374. #endif
  145375. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145376. "lsls r6, r6, #16\n\t"
  145377. #else
  145378. "lsl r6, r6, #16\n\t"
  145379. #endif
  145380. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145381. "adds r5, r5, r6\n\t"
  145382. #else
  145383. "add r5, r5, r6\n\t"
  145384. #endif
  145385. #ifdef WOLFSSL_KEIL
  145386. "adcs r3, r3, r7\n\t"
  145387. #elif defined(__clang__)
  145388. "adcs r3, r7\n\t"
  145389. #else
  145390. "adc r3, r7\n\t"
  145391. #endif
  145392. #ifdef WOLFSSL_KEIL
  145393. "adcs r4, r4, %[r]\n\t"
  145394. #elif defined(__clang__)
  145395. "adcs r4, %[r]\n\t"
  145396. #else
  145397. "adc r4, %[r]\n\t"
  145398. #endif
  145399. "str r5, [sp, #44]\n\t"
  145400. "# A[12] * B[0]\n\t"
  145401. "movs r5, #0\n\t"
  145402. "mov %[a], r9\n\t"
  145403. "mov %[b], r10\n\t"
  145404. "ldr %[a], [%[a], #48]\n\t"
  145405. "ldr %[b], [%[b]]\n\t"
  145406. "uxth r6, %[a]\n\t"
  145407. "uxth r7, %[b]\n\t"
  145408. #ifdef WOLFSSL_KEIL
  145409. "muls r7, r6, r7\n\t"
  145410. #elif defined(__clang__)
  145411. "muls r7, r6\n\t"
  145412. #else
  145413. "mul r7, r6\n\t"
  145414. #endif
  145415. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145416. "adds r3, r3, r7\n\t"
  145417. #else
  145418. "add r3, r3, r7\n\t"
  145419. #endif
  145420. #ifdef WOLFSSL_KEIL
  145421. "adcs r4, r4, %[r]\n\t"
  145422. #elif defined(__clang__)
  145423. "adcs r4, %[r]\n\t"
  145424. #else
  145425. "adc r4, %[r]\n\t"
  145426. #endif
  145427. #ifdef WOLFSSL_KEIL
  145428. "adcs r5, r5, %[r]\n\t"
  145429. #elif defined(__clang__)
  145430. "adcs r5, %[r]\n\t"
  145431. #else
  145432. "adc r5, %[r]\n\t"
  145433. #endif
  145434. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145435. "lsrs r7, %[b], #16\n\t"
  145436. #else
  145437. "lsr r7, %[b], #16\n\t"
  145438. #endif
  145439. #ifdef WOLFSSL_KEIL
  145440. "muls r6, r7, r6\n\t"
  145441. #elif defined(__clang__)
  145442. "muls r6, r7\n\t"
  145443. #else
  145444. "mul r6, r7\n\t"
  145445. #endif
  145446. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145447. "lsrs r7, r6, #16\n\t"
  145448. #else
  145449. "lsr r7, r6, #16\n\t"
  145450. #endif
  145451. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145452. "lsls r6, r6, #16\n\t"
  145453. #else
  145454. "lsl r6, r6, #16\n\t"
  145455. #endif
  145456. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145457. "adds r3, r3, r6\n\t"
  145458. #else
  145459. "add r3, r3, r6\n\t"
  145460. #endif
  145461. #ifdef WOLFSSL_KEIL
  145462. "adcs r4, r4, r7\n\t"
  145463. #elif defined(__clang__)
  145464. "adcs r4, r7\n\t"
  145465. #else
  145466. "adc r4, r7\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 r6, %[a], #16\n\t"
  145477. #else
  145478. "lsr r6, %[a], #16\n\t"
  145479. #endif
  145480. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145481. "lsrs r7, %[b], #16\n\t"
  145482. #else
  145483. "lsr r7, %[b], #16\n\t"
  145484. #endif
  145485. #ifdef WOLFSSL_KEIL
  145486. "muls r7, r6, r7\n\t"
  145487. #elif defined(__clang__)
  145488. "muls r7, r6\n\t"
  145489. #else
  145490. "mul r7, r6\n\t"
  145491. #endif
  145492. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145493. "adds r4, r4, r7\n\t"
  145494. #else
  145495. "add r4, r4, r7\n\t"
  145496. #endif
  145497. #ifdef WOLFSSL_KEIL
  145498. "adcs r5, r5, %[r]\n\t"
  145499. #elif defined(__clang__)
  145500. "adcs r5, %[r]\n\t"
  145501. #else
  145502. "adc r5, %[r]\n\t"
  145503. #endif
  145504. "uxth r7, %[b]\n\t"
  145505. #ifdef WOLFSSL_KEIL
  145506. "muls r6, r7, r6\n\t"
  145507. #elif defined(__clang__)
  145508. "muls r6, r7\n\t"
  145509. #else
  145510. "mul r6, r7\n\t"
  145511. #endif
  145512. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145513. "lsrs r7, r6, #16\n\t"
  145514. #else
  145515. "lsr r7, r6, #16\n\t"
  145516. #endif
  145517. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145518. "lsls r6, r6, #16\n\t"
  145519. #else
  145520. "lsl r6, r6, #16\n\t"
  145521. #endif
  145522. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145523. "adds r3, r3, r6\n\t"
  145524. #else
  145525. "add r3, r3, r6\n\t"
  145526. #endif
  145527. #ifdef WOLFSSL_KEIL
  145528. "adcs r4, r4, r7\n\t"
  145529. #elif defined(__clang__)
  145530. "adcs r4, r7\n\t"
  145531. #else
  145532. "adc r4, r7\n\t"
  145533. #endif
  145534. #ifdef WOLFSSL_KEIL
  145535. "adcs r5, r5, %[r]\n\t"
  145536. #elif defined(__clang__)
  145537. "adcs r5, %[r]\n\t"
  145538. #else
  145539. "adc r5, %[r]\n\t"
  145540. #endif
  145541. "# A[11] * B[1]\n\t"
  145542. "mov %[a], r9\n\t"
  145543. "mov %[b], r10\n\t"
  145544. "ldr %[a], [%[a], #44]\n\t"
  145545. "ldr %[b], [%[b], #4]\n\t"
  145546. "uxth r6, %[a]\n\t"
  145547. "uxth r7, %[b]\n\t"
  145548. #ifdef WOLFSSL_KEIL
  145549. "muls r7, r6, r7\n\t"
  145550. #elif defined(__clang__)
  145551. "muls r7, r6\n\t"
  145552. #else
  145553. "mul r7, r6\n\t"
  145554. #endif
  145555. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145556. "adds r3, r3, r7\n\t"
  145557. #else
  145558. "add r3, r3, r7\n\t"
  145559. #endif
  145560. #ifdef WOLFSSL_KEIL
  145561. "adcs r4, r4, %[r]\n\t"
  145562. #elif defined(__clang__)
  145563. "adcs r4, %[r]\n\t"
  145564. #else
  145565. "adc r4, %[r]\n\t"
  145566. #endif
  145567. #ifdef WOLFSSL_KEIL
  145568. "adcs r5, r5, %[r]\n\t"
  145569. #elif defined(__clang__)
  145570. "adcs r5, %[r]\n\t"
  145571. #else
  145572. "adc r5, %[r]\n\t"
  145573. #endif
  145574. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145575. "lsrs r7, %[b], #16\n\t"
  145576. #else
  145577. "lsr r7, %[b], #16\n\t"
  145578. #endif
  145579. #ifdef WOLFSSL_KEIL
  145580. "muls r6, r7, r6\n\t"
  145581. #elif defined(__clang__)
  145582. "muls r6, r7\n\t"
  145583. #else
  145584. "mul r6, r7\n\t"
  145585. #endif
  145586. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145587. "lsrs r7, r6, #16\n\t"
  145588. #else
  145589. "lsr r7, r6, #16\n\t"
  145590. #endif
  145591. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145592. "lsls r6, r6, #16\n\t"
  145593. #else
  145594. "lsl r6, r6, #16\n\t"
  145595. #endif
  145596. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145597. "adds r3, r3, r6\n\t"
  145598. #else
  145599. "add r3, r3, r6\n\t"
  145600. #endif
  145601. #ifdef WOLFSSL_KEIL
  145602. "adcs r4, r4, r7\n\t"
  145603. #elif defined(__clang__)
  145604. "adcs r4, r7\n\t"
  145605. #else
  145606. "adc r4, r7\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 r6, %[a], #16\n\t"
  145617. #else
  145618. "lsr r6, %[a], #16\n\t"
  145619. #endif
  145620. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145621. "lsrs r7, %[b], #16\n\t"
  145622. #else
  145623. "lsr r7, %[b], #16\n\t"
  145624. #endif
  145625. #ifdef WOLFSSL_KEIL
  145626. "muls r7, r6, r7\n\t"
  145627. #elif defined(__clang__)
  145628. "muls r7, r6\n\t"
  145629. #else
  145630. "mul r7, r6\n\t"
  145631. #endif
  145632. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145633. "adds r4, r4, r7\n\t"
  145634. #else
  145635. "add r4, r4, r7\n\t"
  145636. #endif
  145637. #ifdef WOLFSSL_KEIL
  145638. "adcs r5, r5, %[r]\n\t"
  145639. #elif defined(__clang__)
  145640. "adcs r5, %[r]\n\t"
  145641. #else
  145642. "adc r5, %[r]\n\t"
  145643. #endif
  145644. "uxth r7, %[b]\n\t"
  145645. #ifdef WOLFSSL_KEIL
  145646. "muls r6, r7, r6\n\t"
  145647. #elif defined(__clang__)
  145648. "muls r6, r7\n\t"
  145649. #else
  145650. "mul r6, r7\n\t"
  145651. #endif
  145652. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145653. "lsrs r7, r6, #16\n\t"
  145654. #else
  145655. "lsr r7, r6, #16\n\t"
  145656. #endif
  145657. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145658. "lsls r6, r6, #16\n\t"
  145659. #else
  145660. "lsl r6, r6, #16\n\t"
  145661. #endif
  145662. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145663. "adds r3, r3, r6\n\t"
  145664. #else
  145665. "add r3, r3, r6\n\t"
  145666. #endif
  145667. #ifdef WOLFSSL_KEIL
  145668. "adcs r4, r4, r7\n\t"
  145669. #elif defined(__clang__)
  145670. "adcs r4, r7\n\t"
  145671. #else
  145672. "adc r4, r7\n\t"
  145673. #endif
  145674. #ifdef WOLFSSL_KEIL
  145675. "adcs r5, r5, %[r]\n\t"
  145676. #elif defined(__clang__)
  145677. "adcs r5, %[r]\n\t"
  145678. #else
  145679. "adc r5, %[r]\n\t"
  145680. #endif
  145681. "# A[10] * B[2]\n\t"
  145682. "mov %[a], r9\n\t"
  145683. "mov %[b], r10\n\t"
  145684. "ldr %[a], [%[a], #40]\n\t"
  145685. "ldr %[b], [%[b], #8]\n\t"
  145686. "uxth r6, %[a]\n\t"
  145687. "uxth r7, %[b]\n\t"
  145688. #ifdef WOLFSSL_KEIL
  145689. "muls r7, r6, r7\n\t"
  145690. #elif defined(__clang__)
  145691. "muls r7, r6\n\t"
  145692. #else
  145693. "mul r7, r6\n\t"
  145694. #endif
  145695. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145696. "adds r3, r3, r7\n\t"
  145697. #else
  145698. "add r3, r3, r7\n\t"
  145699. #endif
  145700. #ifdef WOLFSSL_KEIL
  145701. "adcs r4, r4, %[r]\n\t"
  145702. #elif defined(__clang__)
  145703. "adcs r4, %[r]\n\t"
  145704. #else
  145705. "adc r4, %[r]\n\t"
  145706. #endif
  145707. #ifdef WOLFSSL_KEIL
  145708. "adcs r5, r5, %[r]\n\t"
  145709. #elif defined(__clang__)
  145710. "adcs r5, %[r]\n\t"
  145711. #else
  145712. "adc r5, %[r]\n\t"
  145713. #endif
  145714. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145715. "lsrs r7, %[b], #16\n\t"
  145716. #else
  145717. "lsr r7, %[b], #16\n\t"
  145718. #endif
  145719. #ifdef WOLFSSL_KEIL
  145720. "muls r6, r7, r6\n\t"
  145721. #elif defined(__clang__)
  145722. "muls r6, r7\n\t"
  145723. #else
  145724. "mul r6, r7\n\t"
  145725. #endif
  145726. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145727. "lsrs r7, r6, #16\n\t"
  145728. #else
  145729. "lsr r7, r6, #16\n\t"
  145730. #endif
  145731. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145732. "lsls r6, r6, #16\n\t"
  145733. #else
  145734. "lsl r6, r6, #16\n\t"
  145735. #endif
  145736. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145737. "adds r3, r3, r6\n\t"
  145738. #else
  145739. "add r3, r3, r6\n\t"
  145740. #endif
  145741. #ifdef WOLFSSL_KEIL
  145742. "adcs r4, r4, r7\n\t"
  145743. #elif defined(__clang__)
  145744. "adcs r4, r7\n\t"
  145745. #else
  145746. "adc r4, r7\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 r6, %[a], #16\n\t"
  145757. #else
  145758. "lsr r6, %[a], #16\n\t"
  145759. #endif
  145760. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145761. "lsrs r7, %[b], #16\n\t"
  145762. #else
  145763. "lsr r7, %[b], #16\n\t"
  145764. #endif
  145765. #ifdef WOLFSSL_KEIL
  145766. "muls r7, r6, r7\n\t"
  145767. #elif defined(__clang__)
  145768. "muls r7, r6\n\t"
  145769. #else
  145770. "mul r7, r6\n\t"
  145771. #endif
  145772. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145773. "adds r4, r4, r7\n\t"
  145774. #else
  145775. "add r4, r4, r7\n\t"
  145776. #endif
  145777. #ifdef WOLFSSL_KEIL
  145778. "adcs r5, r5, %[r]\n\t"
  145779. #elif defined(__clang__)
  145780. "adcs r5, %[r]\n\t"
  145781. #else
  145782. "adc r5, %[r]\n\t"
  145783. #endif
  145784. "uxth r7, %[b]\n\t"
  145785. #ifdef WOLFSSL_KEIL
  145786. "muls r6, r7, r6\n\t"
  145787. #elif defined(__clang__)
  145788. "muls r6, r7\n\t"
  145789. #else
  145790. "mul r6, r7\n\t"
  145791. #endif
  145792. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145793. "lsrs r7, r6, #16\n\t"
  145794. #else
  145795. "lsr r7, r6, #16\n\t"
  145796. #endif
  145797. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145798. "lsls r6, r6, #16\n\t"
  145799. #else
  145800. "lsl r6, r6, #16\n\t"
  145801. #endif
  145802. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145803. "adds r3, r3, r6\n\t"
  145804. #else
  145805. "add r3, r3, r6\n\t"
  145806. #endif
  145807. #ifdef WOLFSSL_KEIL
  145808. "adcs r4, r4, r7\n\t"
  145809. #elif defined(__clang__)
  145810. "adcs r4, r7\n\t"
  145811. #else
  145812. "adc r4, r7\n\t"
  145813. #endif
  145814. #ifdef WOLFSSL_KEIL
  145815. "adcs r5, r5, %[r]\n\t"
  145816. #elif defined(__clang__)
  145817. "adcs r5, %[r]\n\t"
  145818. #else
  145819. "adc r5, %[r]\n\t"
  145820. #endif
  145821. "# A[9] * B[3]\n\t"
  145822. "mov %[a], r9\n\t"
  145823. "mov %[b], r10\n\t"
  145824. "ldr %[a], [%[a], #36]\n\t"
  145825. "ldr %[b], [%[b], #12]\n\t"
  145826. "uxth r6, %[a]\n\t"
  145827. "uxth r7, %[b]\n\t"
  145828. #ifdef WOLFSSL_KEIL
  145829. "muls r7, r6, r7\n\t"
  145830. #elif defined(__clang__)
  145831. "muls r7, r6\n\t"
  145832. #else
  145833. "mul r7, r6\n\t"
  145834. #endif
  145835. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145836. "adds r3, r3, r7\n\t"
  145837. #else
  145838. "add r3, r3, r7\n\t"
  145839. #endif
  145840. #ifdef WOLFSSL_KEIL
  145841. "adcs r4, r4, %[r]\n\t"
  145842. #elif defined(__clang__)
  145843. "adcs r4, %[r]\n\t"
  145844. #else
  145845. "adc r4, %[r]\n\t"
  145846. #endif
  145847. #ifdef WOLFSSL_KEIL
  145848. "adcs r5, r5, %[r]\n\t"
  145849. #elif defined(__clang__)
  145850. "adcs r5, %[r]\n\t"
  145851. #else
  145852. "adc r5, %[r]\n\t"
  145853. #endif
  145854. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145855. "lsrs r7, %[b], #16\n\t"
  145856. #else
  145857. "lsr r7, %[b], #16\n\t"
  145858. #endif
  145859. #ifdef WOLFSSL_KEIL
  145860. "muls r6, r7, r6\n\t"
  145861. #elif defined(__clang__)
  145862. "muls r6, r7\n\t"
  145863. #else
  145864. "mul r6, r7\n\t"
  145865. #endif
  145866. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145867. "lsrs r7, r6, #16\n\t"
  145868. #else
  145869. "lsr r7, r6, #16\n\t"
  145870. #endif
  145871. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145872. "lsls r6, r6, #16\n\t"
  145873. #else
  145874. "lsl r6, r6, #16\n\t"
  145875. #endif
  145876. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145877. "adds r3, r3, r6\n\t"
  145878. #else
  145879. "add r3, r3, r6\n\t"
  145880. #endif
  145881. #ifdef WOLFSSL_KEIL
  145882. "adcs r4, r4, r7\n\t"
  145883. #elif defined(__clang__)
  145884. "adcs r4, r7\n\t"
  145885. #else
  145886. "adc r4, r7\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 r6, %[a], #16\n\t"
  145897. #else
  145898. "lsr r6, %[a], #16\n\t"
  145899. #endif
  145900. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145901. "lsrs r7, %[b], #16\n\t"
  145902. #else
  145903. "lsr r7, %[b], #16\n\t"
  145904. #endif
  145905. #ifdef WOLFSSL_KEIL
  145906. "muls r7, r6, r7\n\t"
  145907. #elif defined(__clang__)
  145908. "muls r7, r6\n\t"
  145909. #else
  145910. "mul r7, r6\n\t"
  145911. #endif
  145912. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145913. "adds r4, r4, r7\n\t"
  145914. #else
  145915. "add r4, r4, r7\n\t"
  145916. #endif
  145917. #ifdef WOLFSSL_KEIL
  145918. "adcs r5, r5, %[r]\n\t"
  145919. #elif defined(__clang__)
  145920. "adcs r5, %[r]\n\t"
  145921. #else
  145922. "adc r5, %[r]\n\t"
  145923. #endif
  145924. "uxth r7, %[b]\n\t"
  145925. #ifdef WOLFSSL_KEIL
  145926. "muls r6, r7, r6\n\t"
  145927. #elif defined(__clang__)
  145928. "muls r6, r7\n\t"
  145929. #else
  145930. "mul r6, r7\n\t"
  145931. #endif
  145932. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145933. "lsrs r7, r6, #16\n\t"
  145934. #else
  145935. "lsr r7, r6, #16\n\t"
  145936. #endif
  145937. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145938. "lsls r6, r6, #16\n\t"
  145939. #else
  145940. "lsl r6, r6, #16\n\t"
  145941. #endif
  145942. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145943. "adds r3, r3, r6\n\t"
  145944. #else
  145945. "add r3, r3, r6\n\t"
  145946. #endif
  145947. #ifdef WOLFSSL_KEIL
  145948. "adcs r4, r4, r7\n\t"
  145949. #elif defined(__clang__)
  145950. "adcs r4, r7\n\t"
  145951. #else
  145952. "adc r4, r7\n\t"
  145953. #endif
  145954. #ifdef WOLFSSL_KEIL
  145955. "adcs r5, r5, %[r]\n\t"
  145956. #elif defined(__clang__)
  145957. "adcs r5, %[r]\n\t"
  145958. #else
  145959. "adc r5, %[r]\n\t"
  145960. #endif
  145961. "# A[8] * B[4]\n\t"
  145962. "mov %[a], r9\n\t"
  145963. "mov %[b], r10\n\t"
  145964. "ldr %[a], [%[a], #32]\n\t"
  145965. "ldr %[b], [%[b], #16]\n\t"
  145966. "uxth r6, %[a]\n\t"
  145967. "uxth r7, %[b]\n\t"
  145968. #ifdef WOLFSSL_KEIL
  145969. "muls r7, r6, r7\n\t"
  145970. #elif defined(__clang__)
  145971. "muls r7, r6\n\t"
  145972. #else
  145973. "mul r7, r6\n\t"
  145974. #endif
  145975. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145976. "adds r3, r3, r7\n\t"
  145977. #else
  145978. "add r3, r3, r7\n\t"
  145979. #endif
  145980. #ifdef WOLFSSL_KEIL
  145981. "adcs r4, r4, %[r]\n\t"
  145982. #elif defined(__clang__)
  145983. "adcs r4, %[r]\n\t"
  145984. #else
  145985. "adc r4, %[r]\n\t"
  145986. #endif
  145987. #ifdef WOLFSSL_KEIL
  145988. "adcs r5, r5, %[r]\n\t"
  145989. #elif defined(__clang__)
  145990. "adcs r5, %[r]\n\t"
  145991. #else
  145992. "adc r5, %[r]\n\t"
  145993. #endif
  145994. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145995. "lsrs r7, %[b], #16\n\t"
  145996. #else
  145997. "lsr r7, %[b], #16\n\t"
  145998. #endif
  145999. #ifdef WOLFSSL_KEIL
  146000. "muls r6, r7, r6\n\t"
  146001. #elif defined(__clang__)
  146002. "muls r6, r7\n\t"
  146003. #else
  146004. "mul r6, r7\n\t"
  146005. #endif
  146006. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146007. "lsrs r7, r6, #16\n\t"
  146008. #else
  146009. "lsr r7, r6, #16\n\t"
  146010. #endif
  146011. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146012. "lsls r6, r6, #16\n\t"
  146013. #else
  146014. "lsl r6, r6, #16\n\t"
  146015. #endif
  146016. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146017. "adds r3, r3, r6\n\t"
  146018. #else
  146019. "add r3, r3, r6\n\t"
  146020. #endif
  146021. #ifdef WOLFSSL_KEIL
  146022. "adcs r4, r4, r7\n\t"
  146023. #elif defined(__clang__)
  146024. "adcs r4, r7\n\t"
  146025. #else
  146026. "adc r4, r7\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 r6, %[a], #16\n\t"
  146037. #else
  146038. "lsr r6, %[a], #16\n\t"
  146039. #endif
  146040. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146041. "lsrs r7, %[b], #16\n\t"
  146042. #else
  146043. "lsr r7, %[b], #16\n\t"
  146044. #endif
  146045. #ifdef WOLFSSL_KEIL
  146046. "muls r7, r6, r7\n\t"
  146047. #elif defined(__clang__)
  146048. "muls r7, r6\n\t"
  146049. #else
  146050. "mul r7, r6\n\t"
  146051. #endif
  146052. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146053. "adds r4, r4, r7\n\t"
  146054. #else
  146055. "add r4, r4, r7\n\t"
  146056. #endif
  146057. #ifdef WOLFSSL_KEIL
  146058. "adcs r5, r5, %[r]\n\t"
  146059. #elif defined(__clang__)
  146060. "adcs r5, %[r]\n\t"
  146061. #else
  146062. "adc r5, %[r]\n\t"
  146063. #endif
  146064. "uxth r7, %[b]\n\t"
  146065. #ifdef WOLFSSL_KEIL
  146066. "muls r6, r7, r6\n\t"
  146067. #elif defined(__clang__)
  146068. "muls r6, r7\n\t"
  146069. #else
  146070. "mul r6, r7\n\t"
  146071. #endif
  146072. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146073. "lsrs r7, r6, #16\n\t"
  146074. #else
  146075. "lsr r7, r6, #16\n\t"
  146076. #endif
  146077. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146078. "lsls r6, r6, #16\n\t"
  146079. #else
  146080. "lsl r6, r6, #16\n\t"
  146081. #endif
  146082. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146083. "adds r3, r3, r6\n\t"
  146084. #else
  146085. "add r3, r3, r6\n\t"
  146086. #endif
  146087. #ifdef WOLFSSL_KEIL
  146088. "adcs r4, r4, r7\n\t"
  146089. #elif defined(__clang__)
  146090. "adcs r4, r7\n\t"
  146091. #else
  146092. "adc r4, r7\n\t"
  146093. #endif
  146094. #ifdef WOLFSSL_KEIL
  146095. "adcs r5, r5, %[r]\n\t"
  146096. #elif defined(__clang__)
  146097. "adcs r5, %[r]\n\t"
  146098. #else
  146099. "adc r5, %[r]\n\t"
  146100. #endif
  146101. "# A[7] * B[5]\n\t"
  146102. "mov %[a], r9\n\t"
  146103. "mov %[b], r10\n\t"
  146104. "ldr %[a], [%[a], #28]\n\t"
  146105. "ldr %[b], [%[b], #20]\n\t"
  146106. "uxth r6, %[a]\n\t"
  146107. "uxth r7, %[b]\n\t"
  146108. #ifdef WOLFSSL_KEIL
  146109. "muls r7, r6, r7\n\t"
  146110. #elif defined(__clang__)
  146111. "muls r7, r6\n\t"
  146112. #else
  146113. "mul r7, r6\n\t"
  146114. #endif
  146115. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146116. "adds r3, r3, r7\n\t"
  146117. #else
  146118. "add r3, r3, r7\n\t"
  146119. #endif
  146120. #ifdef WOLFSSL_KEIL
  146121. "adcs r4, r4, %[r]\n\t"
  146122. #elif defined(__clang__)
  146123. "adcs r4, %[r]\n\t"
  146124. #else
  146125. "adc r4, %[r]\n\t"
  146126. #endif
  146127. #ifdef WOLFSSL_KEIL
  146128. "adcs r5, r5, %[r]\n\t"
  146129. #elif defined(__clang__)
  146130. "adcs r5, %[r]\n\t"
  146131. #else
  146132. "adc r5, %[r]\n\t"
  146133. #endif
  146134. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146135. "lsrs r7, %[b], #16\n\t"
  146136. #else
  146137. "lsr r7, %[b], #16\n\t"
  146138. #endif
  146139. #ifdef WOLFSSL_KEIL
  146140. "muls r6, r7, r6\n\t"
  146141. #elif defined(__clang__)
  146142. "muls r6, r7\n\t"
  146143. #else
  146144. "mul r6, r7\n\t"
  146145. #endif
  146146. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146147. "lsrs r7, r6, #16\n\t"
  146148. #else
  146149. "lsr r7, r6, #16\n\t"
  146150. #endif
  146151. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146152. "lsls r6, r6, #16\n\t"
  146153. #else
  146154. "lsl r6, r6, #16\n\t"
  146155. #endif
  146156. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146157. "adds r3, r3, r6\n\t"
  146158. #else
  146159. "add r3, r3, r6\n\t"
  146160. #endif
  146161. #ifdef WOLFSSL_KEIL
  146162. "adcs r4, r4, r7\n\t"
  146163. #elif defined(__clang__)
  146164. "adcs r4, r7\n\t"
  146165. #else
  146166. "adc r4, r7\n\t"
  146167. #endif
  146168. #ifdef WOLFSSL_KEIL
  146169. "adcs r5, r5, %[r]\n\t"
  146170. #elif defined(__clang__)
  146171. "adcs r5, %[r]\n\t"
  146172. #else
  146173. "adc r5, %[r]\n\t"
  146174. #endif
  146175. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146176. "lsrs r6, %[a], #16\n\t"
  146177. #else
  146178. "lsr r6, %[a], #16\n\t"
  146179. #endif
  146180. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146181. "lsrs r7, %[b], #16\n\t"
  146182. #else
  146183. "lsr r7, %[b], #16\n\t"
  146184. #endif
  146185. #ifdef WOLFSSL_KEIL
  146186. "muls r7, r6, r7\n\t"
  146187. #elif defined(__clang__)
  146188. "muls r7, r6\n\t"
  146189. #else
  146190. "mul r7, r6\n\t"
  146191. #endif
  146192. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146193. "adds r4, r4, r7\n\t"
  146194. #else
  146195. "add r4, r4, r7\n\t"
  146196. #endif
  146197. #ifdef WOLFSSL_KEIL
  146198. "adcs r5, r5, %[r]\n\t"
  146199. #elif defined(__clang__)
  146200. "adcs r5, %[r]\n\t"
  146201. #else
  146202. "adc r5, %[r]\n\t"
  146203. #endif
  146204. "uxth r7, %[b]\n\t"
  146205. #ifdef WOLFSSL_KEIL
  146206. "muls r6, r7, r6\n\t"
  146207. #elif defined(__clang__)
  146208. "muls r6, r7\n\t"
  146209. #else
  146210. "mul r6, r7\n\t"
  146211. #endif
  146212. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146213. "lsrs r7, r6, #16\n\t"
  146214. #else
  146215. "lsr r7, r6, #16\n\t"
  146216. #endif
  146217. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146218. "lsls r6, r6, #16\n\t"
  146219. #else
  146220. "lsl r6, r6, #16\n\t"
  146221. #endif
  146222. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146223. "adds r3, r3, r6\n\t"
  146224. #else
  146225. "add r3, r3, r6\n\t"
  146226. #endif
  146227. #ifdef WOLFSSL_KEIL
  146228. "adcs r4, r4, r7\n\t"
  146229. #elif defined(__clang__)
  146230. "adcs r4, r7\n\t"
  146231. #else
  146232. "adc r4, r7\n\t"
  146233. #endif
  146234. #ifdef WOLFSSL_KEIL
  146235. "adcs r5, r5, %[r]\n\t"
  146236. #elif defined(__clang__)
  146237. "adcs r5, %[r]\n\t"
  146238. #else
  146239. "adc r5, %[r]\n\t"
  146240. #endif
  146241. "# A[6] * B[6]\n\t"
  146242. "mov %[a], r9\n\t"
  146243. "mov %[b], r10\n\t"
  146244. "ldr %[a], [%[a], #24]\n\t"
  146245. "ldr %[b], [%[b], #24]\n\t"
  146246. "uxth r6, %[a]\n\t"
  146247. "uxth r7, %[b]\n\t"
  146248. #ifdef WOLFSSL_KEIL
  146249. "muls r7, r6, r7\n\t"
  146250. #elif defined(__clang__)
  146251. "muls r7, r6\n\t"
  146252. #else
  146253. "mul r7, r6\n\t"
  146254. #endif
  146255. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146256. "adds r3, r3, r7\n\t"
  146257. #else
  146258. "add r3, r3, r7\n\t"
  146259. #endif
  146260. #ifdef WOLFSSL_KEIL
  146261. "adcs r4, r4, %[r]\n\t"
  146262. #elif defined(__clang__)
  146263. "adcs r4, %[r]\n\t"
  146264. #else
  146265. "adc r4, %[r]\n\t"
  146266. #endif
  146267. #ifdef WOLFSSL_KEIL
  146268. "adcs r5, r5, %[r]\n\t"
  146269. #elif defined(__clang__)
  146270. "adcs r5, %[r]\n\t"
  146271. #else
  146272. "adc r5, %[r]\n\t"
  146273. #endif
  146274. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146275. "lsrs r7, %[b], #16\n\t"
  146276. #else
  146277. "lsr r7, %[b], #16\n\t"
  146278. #endif
  146279. #ifdef WOLFSSL_KEIL
  146280. "muls r6, r7, r6\n\t"
  146281. #elif defined(__clang__)
  146282. "muls r6, r7\n\t"
  146283. #else
  146284. "mul r6, r7\n\t"
  146285. #endif
  146286. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146287. "lsrs r7, r6, #16\n\t"
  146288. #else
  146289. "lsr r7, r6, #16\n\t"
  146290. #endif
  146291. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146292. "lsls r6, r6, #16\n\t"
  146293. #else
  146294. "lsl r6, r6, #16\n\t"
  146295. #endif
  146296. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146297. "adds r3, r3, r6\n\t"
  146298. #else
  146299. "add r3, r3, r6\n\t"
  146300. #endif
  146301. #ifdef WOLFSSL_KEIL
  146302. "adcs r4, r4, r7\n\t"
  146303. #elif defined(__clang__)
  146304. "adcs r4, r7\n\t"
  146305. #else
  146306. "adc r4, r7\n\t"
  146307. #endif
  146308. #ifdef WOLFSSL_KEIL
  146309. "adcs r5, r5, %[r]\n\t"
  146310. #elif defined(__clang__)
  146311. "adcs r5, %[r]\n\t"
  146312. #else
  146313. "adc r5, %[r]\n\t"
  146314. #endif
  146315. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146316. "lsrs r6, %[a], #16\n\t"
  146317. #else
  146318. "lsr r6, %[a], #16\n\t"
  146319. #endif
  146320. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146321. "lsrs r7, %[b], #16\n\t"
  146322. #else
  146323. "lsr r7, %[b], #16\n\t"
  146324. #endif
  146325. #ifdef WOLFSSL_KEIL
  146326. "muls r7, r6, r7\n\t"
  146327. #elif defined(__clang__)
  146328. "muls r7, r6\n\t"
  146329. #else
  146330. "mul r7, r6\n\t"
  146331. #endif
  146332. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146333. "adds r4, r4, r7\n\t"
  146334. #else
  146335. "add r4, r4, r7\n\t"
  146336. #endif
  146337. #ifdef WOLFSSL_KEIL
  146338. "adcs r5, r5, %[r]\n\t"
  146339. #elif defined(__clang__)
  146340. "adcs r5, %[r]\n\t"
  146341. #else
  146342. "adc r5, %[r]\n\t"
  146343. #endif
  146344. "uxth r7, %[b]\n\t"
  146345. #ifdef WOLFSSL_KEIL
  146346. "muls r6, r7, r6\n\t"
  146347. #elif defined(__clang__)
  146348. "muls r6, r7\n\t"
  146349. #else
  146350. "mul r6, r7\n\t"
  146351. #endif
  146352. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146353. "lsrs r7, r6, #16\n\t"
  146354. #else
  146355. "lsr r7, r6, #16\n\t"
  146356. #endif
  146357. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146358. "lsls r6, r6, #16\n\t"
  146359. #else
  146360. "lsl r6, r6, #16\n\t"
  146361. #endif
  146362. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146363. "adds r3, r3, r6\n\t"
  146364. #else
  146365. "add r3, r3, r6\n\t"
  146366. #endif
  146367. #ifdef WOLFSSL_KEIL
  146368. "adcs r4, r4, r7\n\t"
  146369. #elif defined(__clang__)
  146370. "adcs r4, r7\n\t"
  146371. #else
  146372. "adc r4, r7\n\t"
  146373. #endif
  146374. #ifdef WOLFSSL_KEIL
  146375. "adcs r5, r5, %[r]\n\t"
  146376. #elif defined(__clang__)
  146377. "adcs r5, %[r]\n\t"
  146378. #else
  146379. "adc r5, %[r]\n\t"
  146380. #endif
  146381. "# A[5] * B[7]\n\t"
  146382. "mov %[a], r9\n\t"
  146383. "mov %[b], r10\n\t"
  146384. "ldr %[a], [%[a], #20]\n\t"
  146385. "ldr %[b], [%[b], #28]\n\t"
  146386. "uxth r6, %[a]\n\t"
  146387. "uxth r7, %[b]\n\t"
  146388. #ifdef WOLFSSL_KEIL
  146389. "muls r7, r6, r7\n\t"
  146390. #elif defined(__clang__)
  146391. "muls r7, r6\n\t"
  146392. #else
  146393. "mul r7, r6\n\t"
  146394. #endif
  146395. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146396. "adds r3, r3, r7\n\t"
  146397. #else
  146398. "add r3, r3, r7\n\t"
  146399. #endif
  146400. #ifdef WOLFSSL_KEIL
  146401. "adcs r4, r4, %[r]\n\t"
  146402. #elif defined(__clang__)
  146403. "adcs r4, %[r]\n\t"
  146404. #else
  146405. "adc r4, %[r]\n\t"
  146406. #endif
  146407. #ifdef WOLFSSL_KEIL
  146408. "adcs r5, r5, %[r]\n\t"
  146409. #elif defined(__clang__)
  146410. "adcs r5, %[r]\n\t"
  146411. #else
  146412. "adc r5, %[r]\n\t"
  146413. #endif
  146414. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146415. "lsrs r7, %[b], #16\n\t"
  146416. #else
  146417. "lsr r7, %[b], #16\n\t"
  146418. #endif
  146419. #ifdef WOLFSSL_KEIL
  146420. "muls r6, r7, r6\n\t"
  146421. #elif defined(__clang__)
  146422. "muls r6, r7\n\t"
  146423. #else
  146424. "mul r6, r7\n\t"
  146425. #endif
  146426. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146427. "lsrs r7, r6, #16\n\t"
  146428. #else
  146429. "lsr r7, r6, #16\n\t"
  146430. #endif
  146431. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146432. "lsls r6, r6, #16\n\t"
  146433. #else
  146434. "lsl r6, r6, #16\n\t"
  146435. #endif
  146436. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146437. "adds r3, r3, r6\n\t"
  146438. #else
  146439. "add r3, r3, r6\n\t"
  146440. #endif
  146441. #ifdef WOLFSSL_KEIL
  146442. "adcs r4, r4, r7\n\t"
  146443. #elif defined(__clang__)
  146444. "adcs r4, r7\n\t"
  146445. #else
  146446. "adc r4, r7\n\t"
  146447. #endif
  146448. #ifdef WOLFSSL_KEIL
  146449. "adcs r5, r5, %[r]\n\t"
  146450. #elif defined(__clang__)
  146451. "adcs r5, %[r]\n\t"
  146452. #else
  146453. "adc r5, %[r]\n\t"
  146454. #endif
  146455. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146456. "lsrs r6, %[a], #16\n\t"
  146457. #else
  146458. "lsr r6, %[a], #16\n\t"
  146459. #endif
  146460. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146461. "lsrs r7, %[b], #16\n\t"
  146462. #else
  146463. "lsr r7, %[b], #16\n\t"
  146464. #endif
  146465. #ifdef WOLFSSL_KEIL
  146466. "muls r7, r6, r7\n\t"
  146467. #elif defined(__clang__)
  146468. "muls r7, r6\n\t"
  146469. #else
  146470. "mul r7, r6\n\t"
  146471. #endif
  146472. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146473. "adds r4, r4, r7\n\t"
  146474. #else
  146475. "add r4, r4, r7\n\t"
  146476. #endif
  146477. #ifdef WOLFSSL_KEIL
  146478. "adcs r5, r5, %[r]\n\t"
  146479. #elif defined(__clang__)
  146480. "adcs r5, %[r]\n\t"
  146481. #else
  146482. "adc r5, %[r]\n\t"
  146483. #endif
  146484. "uxth r7, %[b]\n\t"
  146485. #ifdef WOLFSSL_KEIL
  146486. "muls r6, r7, r6\n\t"
  146487. #elif defined(__clang__)
  146488. "muls r6, r7\n\t"
  146489. #else
  146490. "mul r6, r7\n\t"
  146491. #endif
  146492. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146493. "lsrs r7, r6, #16\n\t"
  146494. #else
  146495. "lsr r7, r6, #16\n\t"
  146496. #endif
  146497. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146498. "lsls r6, r6, #16\n\t"
  146499. #else
  146500. "lsl r6, r6, #16\n\t"
  146501. #endif
  146502. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146503. "adds r3, r3, r6\n\t"
  146504. #else
  146505. "add r3, r3, r6\n\t"
  146506. #endif
  146507. #ifdef WOLFSSL_KEIL
  146508. "adcs r4, r4, r7\n\t"
  146509. #elif defined(__clang__)
  146510. "adcs r4, r7\n\t"
  146511. #else
  146512. "adc r4, r7\n\t"
  146513. #endif
  146514. #ifdef WOLFSSL_KEIL
  146515. "adcs r5, r5, %[r]\n\t"
  146516. #elif defined(__clang__)
  146517. "adcs r5, %[r]\n\t"
  146518. #else
  146519. "adc r5, %[r]\n\t"
  146520. #endif
  146521. "# A[4] * B[8]\n\t"
  146522. "mov %[a], r9\n\t"
  146523. "mov %[b], r10\n\t"
  146524. "ldr %[a], [%[a], #16]\n\t"
  146525. "ldr %[b], [%[b], #32]\n\t"
  146526. "uxth r6, %[a]\n\t"
  146527. "uxth r7, %[b]\n\t"
  146528. #ifdef WOLFSSL_KEIL
  146529. "muls r7, r6, r7\n\t"
  146530. #elif defined(__clang__)
  146531. "muls r7, r6\n\t"
  146532. #else
  146533. "mul r7, r6\n\t"
  146534. #endif
  146535. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146536. "adds r3, r3, r7\n\t"
  146537. #else
  146538. "add r3, r3, r7\n\t"
  146539. #endif
  146540. #ifdef WOLFSSL_KEIL
  146541. "adcs r4, r4, %[r]\n\t"
  146542. #elif defined(__clang__)
  146543. "adcs r4, %[r]\n\t"
  146544. #else
  146545. "adc r4, %[r]\n\t"
  146546. #endif
  146547. #ifdef WOLFSSL_KEIL
  146548. "adcs r5, r5, %[r]\n\t"
  146549. #elif defined(__clang__)
  146550. "adcs r5, %[r]\n\t"
  146551. #else
  146552. "adc r5, %[r]\n\t"
  146553. #endif
  146554. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146555. "lsrs r7, %[b], #16\n\t"
  146556. #else
  146557. "lsr r7, %[b], #16\n\t"
  146558. #endif
  146559. #ifdef WOLFSSL_KEIL
  146560. "muls r6, r7, r6\n\t"
  146561. #elif defined(__clang__)
  146562. "muls r6, r7\n\t"
  146563. #else
  146564. "mul r6, r7\n\t"
  146565. #endif
  146566. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146567. "lsrs r7, r6, #16\n\t"
  146568. #else
  146569. "lsr r7, r6, #16\n\t"
  146570. #endif
  146571. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146572. "lsls r6, r6, #16\n\t"
  146573. #else
  146574. "lsl r6, r6, #16\n\t"
  146575. #endif
  146576. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146577. "adds r3, r3, r6\n\t"
  146578. #else
  146579. "add r3, r3, r6\n\t"
  146580. #endif
  146581. #ifdef WOLFSSL_KEIL
  146582. "adcs r4, r4, r7\n\t"
  146583. #elif defined(__clang__)
  146584. "adcs r4, r7\n\t"
  146585. #else
  146586. "adc r4, r7\n\t"
  146587. #endif
  146588. #ifdef WOLFSSL_KEIL
  146589. "adcs r5, r5, %[r]\n\t"
  146590. #elif defined(__clang__)
  146591. "adcs r5, %[r]\n\t"
  146592. #else
  146593. "adc r5, %[r]\n\t"
  146594. #endif
  146595. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146596. "lsrs r6, %[a], #16\n\t"
  146597. #else
  146598. "lsr r6, %[a], #16\n\t"
  146599. #endif
  146600. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146601. "lsrs r7, %[b], #16\n\t"
  146602. #else
  146603. "lsr r7, %[b], #16\n\t"
  146604. #endif
  146605. #ifdef WOLFSSL_KEIL
  146606. "muls r7, r6, r7\n\t"
  146607. #elif defined(__clang__)
  146608. "muls r7, r6\n\t"
  146609. #else
  146610. "mul r7, r6\n\t"
  146611. #endif
  146612. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146613. "adds r4, r4, r7\n\t"
  146614. #else
  146615. "add r4, r4, r7\n\t"
  146616. #endif
  146617. #ifdef WOLFSSL_KEIL
  146618. "adcs r5, r5, %[r]\n\t"
  146619. #elif defined(__clang__)
  146620. "adcs r5, %[r]\n\t"
  146621. #else
  146622. "adc r5, %[r]\n\t"
  146623. #endif
  146624. "uxth r7, %[b]\n\t"
  146625. #ifdef WOLFSSL_KEIL
  146626. "muls r6, r7, r6\n\t"
  146627. #elif defined(__clang__)
  146628. "muls r6, r7\n\t"
  146629. #else
  146630. "mul r6, r7\n\t"
  146631. #endif
  146632. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146633. "lsrs r7, r6, #16\n\t"
  146634. #else
  146635. "lsr r7, r6, #16\n\t"
  146636. #endif
  146637. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146638. "lsls r6, r6, #16\n\t"
  146639. #else
  146640. "lsl r6, r6, #16\n\t"
  146641. #endif
  146642. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146643. "adds r3, r3, r6\n\t"
  146644. #else
  146645. "add r3, r3, r6\n\t"
  146646. #endif
  146647. #ifdef WOLFSSL_KEIL
  146648. "adcs r4, r4, r7\n\t"
  146649. #elif defined(__clang__)
  146650. "adcs r4, r7\n\t"
  146651. #else
  146652. "adc r4, r7\n\t"
  146653. #endif
  146654. #ifdef WOLFSSL_KEIL
  146655. "adcs r5, r5, %[r]\n\t"
  146656. #elif defined(__clang__)
  146657. "adcs r5, %[r]\n\t"
  146658. #else
  146659. "adc r5, %[r]\n\t"
  146660. #endif
  146661. "# A[3] * B[9]\n\t"
  146662. "mov %[a], r9\n\t"
  146663. "mov %[b], r10\n\t"
  146664. "ldr %[a], [%[a], #12]\n\t"
  146665. "ldr %[b], [%[b], #36]\n\t"
  146666. "uxth r6, %[a]\n\t"
  146667. "uxth r7, %[b]\n\t"
  146668. #ifdef WOLFSSL_KEIL
  146669. "muls r7, r6, r7\n\t"
  146670. #elif defined(__clang__)
  146671. "muls r7, r6\n\t"
  146672. #else
  146673. "mul r7, r6\n\t"
  146674. #endif
  146675. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146676. "adds r3, r3, r7\n\t"
  146677. #else
  146678. "add r3, r3, r7\n\t"
  146679. #endif
  146680. #ifdef WOLFSSL_KEIL
  146681. "adcs r4, r4, %[r]\n\t"
  146682. #elif defined(__clang__)
  146683. "adcs r4, %[r]\n\t"
  146684. #else
  146685. "adc r4, %[r]\n\t"
  146686. #endif
  146687. #ifdef WOLFSSL_KEIL
  146688. "adcs r5, r5, %[r]\n\t"
  146689. #elif defined(__clang__)
  146690. "adcs r5, %[r]\n\t"
  146691. #else
  146692. "adc r5, %[r]\n\t"
  146693. #endif
  146694. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146695. "lsrs r7, %[b], #16\n\t"
  146696. #else
  146697. "lsr r7, %[b], #16\n\t"
  146698. #endif
  146699. #ifdef WOLFSSL_KEIL
  146700. "muls r6, r7, r6\n\t"
  146701. #elif defined(__clang__)
  146702. "muls r6, r7\n\t"
  146703. #else
  146704. "mul r6, r7\n\t"
  146705. #endif
  146706. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146707. "lsrs r7, r6, #16\n\t"
  146708. #else
  146709. "lsr r7, r6, #16\n\t"
  146710. #endif
  146711. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146712. "lsls r6, r6, #16\n\t"
  146713. #else
  146714. "lsl r6, r6, #16\n\t"
  146715. #endif
  146716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146717. "adds r3, r3, r6\n\t"
  146718. #else
  146719. "add r3, r3, r6\n\t"
  146720. #endif
  146721. #ifdef WOLFSSL_KEIL
  146722. "adcs r4, r4, r7\n\t"
  146723. #elif defined(__clang__)
  146724. "adcs r4, r7\n\t"
  146725. #else
  146726. "adc r4, r7\n\t"
  146727. #endif
  146728. #ifdef WOLFSSL_KEIL
  146729. "adcs r5, r5, %[r]\n\t"
  146730. #elif defined(__clang__)
  146731. "adcs r5, %[r]\n\t"
  146732. #else
  146733. "adc r5, %[r]\n\t"
  146734. #endif
  146735. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146736. "lsrs r6, %[a], #16\n\t"
  146737. #else
  146738. "lsr r6, %[a], #16\n\t"
  146739. #endif
  146740. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146741. "lsrs r7, %[b], #16\n\t"
  146742. #else
  146743. "lsr r7, %[b], #16\n\t"
  146744. #endif
  146745. #ifdef WOLFSSL_KEIL
  146746. "muls r7, r6, r7\n\t"
  146747. #elif defined(__clang__)
  146748. "muls r7, r6\n\t"
  146749. #else
  146750. "mul r7, r6\n\t"
  146751. #endif
  146752. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146753. "adds r4, r4, r7\n\t"
  146754. #else
  146755. "add r4, r4, r7\n\t"
  146756. #endif
  146757. #ifdef WOLFSSL_KEIL
  146758. "adcs r5, r5, %[r]\n\t"
  146759. #elif defined(__clang__)
  146760. "adcs r5, %[r]\n\t"
  146761. #else
  146762. "adc r5, %[r]\n\t"
  146763. #endif
  146764. "uxth r7, %[b]\n\t"
  146765. #ifdef WOLFSSL_KEIL
  146766. "muls r6, r7, r6\n\t"
  146767. #elif defined(__clang__)
  146768. "muls r6, r7\n\t"
  146769. #else
  146770. "mul r6, r7\n\t"
  146771. #endif
  146772. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146773. "lsrs r7, r6, #16\n\t"
  146774. #else
  146775. "lsr r7, r6, #16\n\t"
  146776. #endif
  146777. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146778. "lsls r6, r6, #16\n\t"
  146779. #else
  146780. "lsl r6, r6, #16\n\t"
  146781. #endif
  146782. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146783. "adds r3, r3, r6\n\t"
  146784. #else
  146785. "add r3, r3, r6\n\t"
  146786. #endif
  146787. #ifdef WOLFSSL_KEIL
  146788. "adcs r4, r4, r7\n\t"
  146789. #elif defined(__clang__)
  146790. "adcs r4, r7\n\t"
  146791. #else
  146792. "adc r4, r7\n\t"
  146793. #endif
  146794. #ifdef WOLFSSL_KEIL
  146795. "adcs r5, r5, %[r]\n\t"
  146796. #elif defined(__clang__)
  146797. "adcs r5, %[r]\n\t"
  146798. #else
  146799. "adc r5, %[r]\n\t"
  146800. #endif
  146801. "# A[2] * B[10]\n\t"
  146802. "mov %[a], r9\n\t"
  146803. "mov %[b], r10\n\t"
  146804. "ldr %[a], [%[a], #8]\n\t"
  146805. "ldr %[b], [%[b], #40]\n\t"
  146806. "uxth r6, %[a]\n\t"
  146807. "uxth r7, %[b]\n\t"
  146808. #ifdef WOLFSSL_KEIL
  146809. "muls r7, r6, r7\n\t"
  146810. #elif defined(__clang__)
  146811. "muls r7, r6\n\t"
  146812. #else
  146813. "mul r7, r6\n\t"
  146814. #endif
  146815. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146816. "adds r3, r3, r7\n\t"
  146817. #else
  146818. "add r3, r3, r7\n\t"
  146819. #endif
  146820. #ifdef WOLFSSL_KEIL
  146821. "adcs r4, r4, %[r]\n\t"
  146822. #elif defined(__clang__)
  146823. "adcs r4, %[r]\n\t"
  146824. #else
  146825. "adc r4, %[r]\n\t"
  146826. #endif
  146827. #ifdef WOLFSSL_KEIL
  146828. "adcs r5, r5, %[r]\n\t"
  146829. #elif defined(__clang__)
  146830. "adcs r5, %[r]\n\t"
  146831. #else
  146832. "adc r5, %[r]\n\t"
  146833. #endif
  146834. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146835. "lsrs r7, %[b], #16\n\t"
  146836. #else
  146837. "lsr r7, %[b], #16\n\t"
  146838. #endif
  146839. #ifdef WOLFSSL_KEIL
  146840. "muls r6, r7, r6\n\t"
  146841. #elif defined(__clang__)
  146842. "muls r6, r7\n\t"
  146843. #else
  146844. "mul r6, r7\n\t"
  146845. #endif
  146846. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146847. "lsrs r7, r6, #16\n\t"
  146848. #else
  146849. "lsr r7, r6, #16\n\t"
  146850. #endif
  146851. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146852. "lsls r6, r6, #16\n\t"
  146853. #else
  146854. "lsl r6, r6, #16\n\t"
  146855. #endif
  146856. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146857. "adds r3, r3, r6\n\t"
  146858. #else
  146859. "add r3, r3, r6\n\t"
  146860. #endif
  146861. #ifdef WOLFSSL_KEIL
  146862. "adcs r4, r4, r7\n\t"
  146863. #elif defined(__clang__)
  146864. "adcs r4, r7\n\t"
  146865. #else
  146866. "adc r4, r7\n\t"
  146867. #endif
  146868. #ifdef WOLFSSL_KEIL
  146869. "adcs r5, r5, %[r]\n\t"
  146870. #elif defined(__clang__)
  146871. "adcs r5, %[r]\n\t"
  146872. #else
  146873. "adc r5, %[r]\n\t"
  146874. #endif
  146875. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146876. "lsrs r6, %[a], #16\n\t"
  146877. #else
  146878. "lsr r6, %[a], #16\n\t"
  146879. #endif
  146880. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146881. "lsrs r7, %[b], #16\n\t"
  146882. #else
  146883. "lsr r7, %[b], #16\n\t"
  146884. #endif
  146885. #ifdef WOLFSSL_KEIL
  146886. "muls r7, r6, r7\n\t"
  146887. #elif defined(__clang__)
  146888. "muls r7, r6\n\t"
  146889. #else
  146890. "mul r7, r6\n\t"
  146891. #endif
  146892. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146893. "adds r4, r4, r7\n\t"
  146894. #else
  146895. "add r4, r4, r7\n\t"
  146896. #endif
  146897. #ifdef WOLFSSL_KEIL
  146898. "adcs r5, r5, %[r]\n\t"
  146899. #elif defined(__clang__)
  146900. "adcs r5, %[r]\n\t"
  146901. #else
  146902. "adc r5, %[r]\n\t"
  146903. #endif
  146904. "uxth r7, %[b]\n\t"
  146905. #ifdef WOLFSSL_KEIL
  146906. "muls r6, r7, r6\n\t"
  146907. #elif defined(__clang__)
  146908. "muls r6, r7\n\t"
  146909. #else
  146910. "mul r6, r7\n\t"
  146911. #endif
  146912. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146913. "lsrs r7, r6, #16\n\t"
  146914. #else
  146915. "lsr r7, r6, #16\n\t"
  146916. #endif
  146917. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146918. "lsls r6, r6, #16\n\t"
  146919. #else
  146920. "lsl r6, r6, #16\n\t"
  146921. #endif
  146922. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146923. "adds r3, r3, r6\n\t"
  146924. #else
  146925. "add r3, r3, r6\n\t"
  146926. #endif
  146927. #ifdef WOLFSSL_KEIL
  146928. "adcs r4, r4, r7\n\t"
  146929. #elif defined(__clang__)
  146930. "adcs r4, r7\n\t"
  146931. #else
  146932. "adc r4, r7\n\t"
  146933. #endif
  146934. #ifdef WOLFSSL_KEIL
  146935. "adcs r5, r5, %[r]\n\t"
  146936. #elif defined(__clang__)
  146937. "adcs r5, %[r]\n\t"
  146938. #else
  146939. "adc r5, %[r]\n\t"
  146940. #endif
  146941. "# A[1] * B[11]\n\t"
  146942. "mov %[a], r9\n\t"
  146943. "mov %[b], r10\n\t"
  146944. "ldr %[a], [%[a], #4]\n\t"
  146945. "ldr %[b], [%[b], #44]\n\t"
  146946. "uxth r6, %[a]\n\t"
  146947. "uxth r7, %[b]\n\t"
  146948. #ifdef WOLFSSL_KEIL
  146949. "muls r7, r6, r7\n\t"
  146950. #elif defined(__clang__)
  146951. "muls r7, r6\n\t"
  146952. #else
  146953. "mul r7, r6\n\t"
  146954. #endif
  146955. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146956. "adds r3, r3, r7\n\t"
  146957. #else
  146958. "add r3, r3, r7\n\t"
  146959. #endif
  146960. #ifdef WOLFSSL_KEIL
  146961. "adcs r4, r4, %[r]\n\t"
  146962. #elif defined(__clang__)
  146963. "adcs r4, %[r]\n\t"
  146964. #else
  146965. "adc r4, %[r]\n\t"
  146966. #endif
  146967. #ifdef WOLFSSL_KEIL
  146968. "adcs r5, r5, %[r]\n\t"
  146969. #elif defined(__clang__)
  146970. "adcs r5, %[r]\n\t"
  146971. #else
  146972. "adc r5, %[r]\n\t"
  146973. #endif
  146974. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146975. "lsrs r7, %[b], #16\n\t"
  146976. #else
  146977. "lsr r7, %[b], #16\n\t"
  146978. #endif
  146979. #ifdef WOLFSSL_KEIL
  146980. "muls r6, r7, r6\n\t"
  146981. #elif defined(__clang__)
  146982. "muls r6, r7\n\t"
  146983. #else
  146984. "mul r6, r7\n\t"
  146985. #endif
  146986. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146987. "lsrs r7, r6, #16\n\t"
  146988. #else
  146989. "lsr r7, r6, #16\n\t"
  146990. #endif
  146991. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146992. "lsls r6, r6, #16\n\t"
  146993. #else
  146994. "lsl r6, r6, #16\n\t"
  146995. #endif
  146996. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146997. "adds r3, r3, r6\n\t"
  146998. #else
  146999. "add r3, r3, r6\n\t"
  147000. #endif
  147001. #ifdef WOLFSSL_KEIL
  147002. "adcs r4, r4, r7\n\t"
  147003. #elif defined(__clang__)
  147004. "adcs r4, r7\n\t"
  147005. #else
  147006. "adc r4, r7\n\t"
  147007. #endif
  147008. #ifdef WOLFSSL_KEIL
  147009. "adcs r5, r5, %[r]\n\t"
  147010. #elif defined(__clang__)
  147011. "adcs r5, %[r]\n\t"
  147012. #else
  147013. "adc r5, %[r]\n\t"
  147014. #endif
  147015. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147016. "lsrs r6, %[a], #16\n\t"
  147017. #else
  147018. "lsr r6, %[a], #16\n\t"
  147019. #endif
  147020. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147021. "lsrs r7, %[b], #16\n\t"
  147022. #else
  147023. "lsr r7, %[b], #16\n\t"
  147024. #endif
  147025. #ifdef WOLFSSL_KEIL
  147026. "muls r7, r6, r7\n\t"
  147027. #elif defined(__clang__)
  147028. "muls r7, r6\n\t"
  147029. #else
  147030. "mul r7, r6\n\t"
  147031. #endif
  147032. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147033. "adds r4, r4, r7\n\t"
  147034. #else
  147035. "add r4, r4, r7\n\t"
  147036. #endif
  147037. #ifdef WOLFSSL_KEIL
  147038. "adcs r5, r5, %[r]\n\t"
  147039. #elif defined(__clang__)
  147040. "adcs r5, %[r]\n\t"
  147041. #else
  147042. "adc r5, %[r]\n\t"
  147043. #endif
  147044. "uxth r7, %[b]\n\t"
  147045. #ifdef WOLFSSL_KEIL
  147046. "muls r6, r7, r6\n\t"
  147047. #elif defined(__clang__)
  147048. "muls r6, r7\n\t"
  147049. #else
  147050. "mul r6, r7\n\t"
  147051. #endif
  147052. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147053. "lsrs r7, r6, #16\n\t"
  147054. #else
  147055. "lsr r7, r6, #16\n\t"
  147056. #endif
  147057. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147058. "lsls r6, r6, #16\n\t"
  147059. #else
  147060. "lsl r6, r6, #16\n\t"
  147061. #endif
  147062. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147063. "adds r3, r3, r6\n\t"
  147064. #else
  147065. "add r3, r3, r6\n\t"
  147066. #endif
  147067. #ifdef WOLFSSL_KEIL
  147068. "adcs r4, r4, r7\n\t"
  147069. #elif defined(__clang__)
  147070. "adcs r4, r7\n\t"
  147071. #else
  147072. "adc r4, r7\n\t"
  147073. #endif
  147074. #ifdef WOLFSSL_KEIL
  147075. "adcs r5, r5, %[r]\n\t"
  147076. #elif defined(__clang__)
  147077. "adcs r5, %[r]\n\t"
  147078. #else
  147079. "adc r5, %[r]\n\t"
  147080. #endif
  147081. "# A[0] * B[12]\n\t"
  147082. "mov %[a], r9\n\t"
  147083. "mov %[b], r10\n\t"
  147084. "ldr %[a], [%[a]]\n\t"
  147085. "ldr %[b], [%[b], #48]\n\t"
  147086. "uxth r6, %[a]\n\t"
  147087. "uxth r7, %[b]\n\t"
  147088. #ifdef WOLFSSL_KEIL
  147089. "muls r7, r6, r7\n\t"
  147090. #elif defined(__clang__)
  147091. "muls r7, r6\n\t"
  147092. #else
  147093. "mul r7, r6\n\t"
  147094. #endif
  147095. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147096. "adds r3, r3, r7\n\t"
  147097. #else
  147098. "add r3, r3, r7\n\t"
  147099. #endif
  147100. #ifdef WOLFSSL_KEIL
  147101. "adcs r4, r4, %[r]\n\t"
  147102. #elif defined(__clang__)
  147103. "adcs r4, %[r]\n\t"
  147104. #else
  147105. "adc r4, %[r]\n\t"
  147106. #endif
  147107. #ifdef WOLFSSL_KEIL
  147108. "adcs r5, r5, %[r]\n\t"
  147109. #elif defined(__clang__)
  147110. "adcs r5, %[r]\n\t"
  147111. #else
  147112. "adc r5, %[r]\n\t"
  147113. #endif
  147114. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147115. "lsrs r7, %[b], #16\n\t"
  147116. #else
  147117. "lsr r7, %[b], #16\n\t"
  147118. #endif
  147119. #ifdef WOLFSSL_KEIL
  147120. "muls r6, r7, r6\n\t"
  147121. #elif defined(__clang__)
  147122. "muls r6, r7\n\t"
  147123. #else
  147124. "mul r6, r7\n\t"
  147125. #endif
  147126. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147127. "lsrs r7, r6, #16\n\t"
  147128. #else
  147129. "lsr r7, r6, #16\n\t"
  147130. #endif
  147131. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147132. "lsls r6, r6, #16\n\t"
  147133. #else
  147134. "lsl r6, r6, #16\n\t"
  147135. #endif
  147136. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147137. "adds r3, r3, r6\n\t"
  147138. #else
  147139. "add r3, r3, r6\n\t"
  147140. #endif
  147141. #ifdef WOLFSSL_KEIL
  147142. "adcs r4, r4, r7\n\t"
  147143. #elif defined(__clang__)
  147144. "adcs r4, r7\n\t"
  147145. #else
  147146. "adc r4, r7\n\t"
  147147. #endif
  147148. #ifdef WOLFSSL_KEIL
  147149. "adcs r5, r5, %[r]\n\t"
  147150. #elif defined(__clang__)
  147151. "adcs r5, %[r]\n\t"
  147152. #else
  147153. "adc r5, %[r]\n\t"
  147154. #endif
  147155. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147156. "lsrs r6, %[a], #16\n\t"
  147157. #else
  147158. "lsr r6, %[a], #16\n\t"
  147159. #endif
  147160. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147161. "lsrs r7, %[b], #16\n\t"
  147162. #else
  147163. "lsr r7, %[b], #16\n\t"
  147164. #endif
  147165. #ifdef WOLFSSL_KEIL
  147166. "muls r7, r6, r7\n\t"
  147167. #elif defined(__clang__)
  147168. "muls r7, r6\n\t"
  147169. #else
  147170. "mul r7, r6\n\t"
  147171. #endif
  147172. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147173. "adds r4, r4, r7\n\t"
  147174. #else
  147175. "add r4, r4, r7\n\t"
  147176. #endif
  147177. #ifdef WOLFSSL_KEIL
  147178. "adcs r5, r5, %[r]\n\t"
  147179. #elif defined(__clang__)
  147180. "adcs r5, %[r]\n\t"
  147181. #else
  147182. "adc r5, %[r]\n\t"
  147183. #endif
  147184. "uxth r7, %[b]\n\t"
  147185. #ifdef WOLFSSL_KEIL
  147186. "muls r6, r7, r6\n\t"
  147187. #elif defined(__clang__)
  147188. "muls r6, r7\n\t"
  147189. #else
  147190. "mul r6, r7\n\t"
  147191. #endif
  147192. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147193. "lsrs r7, r6, #16\n\t"
  147194. #else
  147195. "lsr r7, r6, #16\n\t"
  147196. #endif
  147197. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147198. "lsls r6, r6, #16\n\t"
  147199. #else
  147200. "lsl r6, r6, #16\n\t"
  147201. #endif
  147202. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147203. "adds r3, r3, r6\n\t"
  147204. #else
  147205. "add r3, r3, r6\n\t"
  147206. #endif
  147207. #ifdef WOLFSSL_KEIL
  147208. "adcs r4, r4, r7\n\t"
  147209. #elif defined(__clang__)
  147210. "adcs r4, r7\n\t"
  147211. #else
  147212. "adc r4, r7\n\t"
  147213. #endif
  147214. #ifdef WOLFSSL_KEIL
  147215. "adcs r5, r5, %[r]\n\t"
  147216. #elif defined(__clang__)
  147217. "adcs r5, %[r]\n\t"
  147218. #else
  147219. "adc r5, %[r]\n\t"
  147220. #endif
  147221. "str r3, [sp, #48]\n\t"
  147222. "# A[0] * B[13]\n\t"
  147223. "movs r3, #0\n\t"
  147224. "mov %[a], r9\n\t"
  147225. "mov %[b], r10\n\t"
  147226. "ldr %[a], [%[a]]\n\t"
  147227. "ldr %[b], [%[b], #52]\n\t"
  147228. "uxth r6, %[a]\n\t"
  147229. "uxth r7, %[b]\n\t"
  147230. #ifdef WOLFSSL_KEIL
  147231. "muls r7, r6, r7\n\t"
  147232. #elif defined(__clang__)
  147233. "muls r7, r6\n\t"
  147234. #else
  147235. "mul r7, r6\n\t"
  147236. #endif
  147237. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147238. "adds r4, r4, r7\n\t"
  147239. #else
  147240. "add r4, r4, r7\n\t"
  147241. #endif
  147242. #ifdef WOLFSSL_KEIL
  147243. "adcs r5, r5, %[r]\n\t"
  147244. #elif defined(__clang__)
  147245. "adcs r5, %[r]\n\t"
  147246. #else
  147247. "adc r5, %[r]\n\t"
  147248. #endif
  147249. #ifdef WOLFSSL_KEIL
  147250. "adcs r3, r3, %[r]\n\t"
  147251. #elif defined(__clang__)
  147252. "adcs r3, %[r]\n\t"
  147253. #else
  147254. "adc r3, %[r]\n\t"
  147255. #endif
  147256. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147257. "lsrs r7, %[b], #16\n\t"
  147258. #else
  147259. "lsr r7, %[b], #16\n\t"
  147260. #endif
  147261. #ifdef WOLFSSL_KEIL
  147262. "muls r6, r7, r6\n\t"
  147263. #elif defined(__clang__)
  147264. "muls r6, r7\n\t"
  147265. #else
  147266. "mul r6, r7\n\t"
  147267. #endif
  147268. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147269. "lsrs r7, r6, #16\n\t"
  147270. #else
  147271. "lsr r7, r6, #16\n\t"
  147272. #endif
  147273. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147274. "lsls r6, r6, #16\n\t"
  147275. #else
  147276. "lsl r6, r6, #16\n\t"
  147277. #endif
  147278. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147279. "adds r4, r4, r6\n\t"
  147280. #else
  147281. "add r4, r4, r6\n\t"
  147282. #endif
  147283. #ifdef WOLFSSL_KEIL
  147284. "adcs r5, r5, r7\n\t"
  147285. #elif defined(__clang__)
  147286. "adcs r5, r7\n\t"
  147287. #else
  147288. "adc r5, r7\n\t"
  147289. #endif
  147290. #ifdef WOLFSSL_KEIL
  147291. "adcs r3, r3, %[r]\n\t"
  147292. #elif defined(__clang__)
  147293. "adcs r3, %[r]\n\t"
  147294. #else
  147295. "adc r3, %[r]\n\t"
  147296. #endif
  147297. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147298. "lsrs r6, %[a], #16\n\t"
  147299. #else
  147300. "lsr r6, %[a], #16\n\t"
  147301. #endif
  147302. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147303. "lsrs r7, %[b], #16\n\t"
  147304. #else
  147305. "lsr r7, %[b], #16\n\t"
  147306. #endif
  147307. #ifdef WOLFSSL_KEIL
  147308. "muls r7, r6, r7\n\t"
  147309. #elif defined(__clang__)
  147310. "muls r7, r6\n\t"
  147311. #else
  147312. "mul r7, r6\n\t"
  147313. #endif
  147314. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147315. "adds r5, r5, r7\n\t"
  147316. #else
  147317. "add r5, r5, r7\n\t"
  147318. #endif
  147319. #ifdef WOLFSSL_KEIL
  147320. "adcs r3, r3, %[r]\n\t"
  147321. #elif defined(__clang__)
  147322. "adcs r3, %[r]\n\t"
  147323. #else
  147324. "adc r3, %[r]\n\t"
  147325. #endif
  147326. "uxth r7, %[b]\n\t"
  147327. #ifdef WOLFSSL_KEIL
  147328. "muls r6, r7, r6\n\t"
  147329. #elif defined(__clang__)
  147330. "muls r6, r7\n\t"
  147331. #else
  147332. "mul r6, r7\n\t"
  147333. #endif
  147334. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147335. "lsrs r7, r6, #16\n\t"
  147336. #else
  147337. "lsr r7, r6, #16\n\t"
  147338. #endif
  147339. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147340. "lsls r6, r6, #16\n\t"
  147341. #else
  147342. "lsl r6, r6, #16\n\t"
  147343. #endif
  147344. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147345. "adds r4, r4, r6\n\t"
  147346. #else
  147347. "add r4, r4, r6\n\t"
  147348. #endif
  147349. #ifdef WOLFSSL_KEIL
  147350. "adcs r5, r5, r7\n\t"
  147351. #elif defined(__clang__)
  147352. "adcs r5, r7\n\t"
  147353. #else
  147354. "adc r5, r7\n\t"
  147355. #endif
  147356. #ifdef WOLFSSL_KEIL
  147357. "adcs r3, r3, %[r]\n\t"
  147358. #elif defined(__clang__)
  147359. "adcs r3, %[r]\n\t"
  147360. #else
  147361. "adc r3, %[r]\n\t"
  147362. #endif
  147363. "# A[1] * B[12]\n\t"
  147364. "mov %[a], r9\n\t"
  147365. "mov %[b], r10\n\t"
  147366. "ldr %[a], [%[a], #4]\n\t"
  147367. "ldr %[b], [%[b], #48]\n\t"
  147368. "uxth r6, %[a]\n\t"
  147369. "uxth r7, %[b]\n\t"
  147370. #ifdef WOLFSSL_KEIL
  147371. "muls r7, r6, r7\n\t"
  147372. #elif defined(__clang__)
  147373. "muls r7, r6\n\t"
  147374. #else
  147375. "mul r7, r6\n\t"
  147376. #endif
  147377. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147378. "adds r4, r4, r7\n\t"
  147379. #else
  147380. "add r4, r4, r7\n\t"
  147381. #endif
  147382. #ifdef WOLFSSL_KEIL
  147383. "adcs r5, r5, %[r]\n\t"
  147384. #elif defined(__clang__)
  147385. "adcs r5, %[r]\n\t"
  147386. #else
  147387. "adc r5, %[r]\n\t"
  147388. #endif
  147389. #ifdef WOLFSSL_KEIL
  147390. "adcs r3, r3, %[r]\n\t"
  147391. #elif defined(__clang__)
  147392. "adcs r3, %[r]\n\t"
  147393. #else
  147394. "adc r3, %[r]\n\t"
  147395. #endif
  147396. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147397. "lsrs r7, %[b], #16\n\t"
  147398. #else
  147399. "lsr r7, %[b], #16\n\t"
  147400. #endif
  147401. #ifdef WOLFSSL_KEIL
  147402. "muls r6, r7, r6\n\t"
  147403. #elif defined(__clang__)
  147404. "muls r6, r7\n\t"
  147405. #else
  147406. "mul r6, r7\n\t"
  147407. #endif
  147408. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147409. "lsrs r7, r6, #16\n\t"
  147410. #else
  147411. "lsr r7, r6, #16\n\t"
  147412. #endif
  147413. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147414. "lsls r6, r6, #16\n\t"
  147415. #else
  147416. "lsl r6, r6, #16\n\t"
  147417. #endif
  147418. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147419. "adds r4, r4, r6\n\t"
  147420. #else
  147421. "add r4, r4, r6\n\t"
  147422. #endif
  147423. #ifdef WOLFSSL_KEIL
  147424. "adcs r5, r5, r7\n\t"
  147425. #elif defined(__clang__)
  147426. "adcs r5, r7\n\t"
  147427. #else
  147428. "adc r5, r7\n\t"
  147429. #endif
  147430. #ifdef WOLFSSL_KEIL
  147431. "adcs r3, r3, %[r]\n\t"
  147432. #elif defined(__clang__)
  147433. "adcs r3, %[r]\n\t"
  147434. #else
  147435. "adc r3, %[r]\n\t"
  147436. #endif
  147437. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147438. "lsrs r6, %[a], #16\n\t"
  147439. #else
  147440. "lsr r6, %[a], #16\n\t"
  147441. #endif
  147442. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147443. "lsrs r7, %[b], #16\n\t"
  147444. #else
  147445. "lsr r7, %[b], #16\n\t"
  147446. #endif
  147447. #ifdef WOLFSSL_KEIL
  147448. "muls r7, r6, r7\n\t"
  147449. #elif defined(__clang__)
  147450. "muls r7, r6\n\t"
  147451. #else
  147452. "mul r7, r6\n\t"
  147453. #endif
  147454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147455. "adds r5, r5, r7\n\t"
  147456. #else
  147457. "add r5, r5, r7\n\t"
  147458. #endif
  147459. #ifdef WOLFSSL_KEIL
  147460. "adcs r3, r3, %[r]\n\t"
  147461. #elif defined(__clang__)
  147462. "adcs r3, %[r]\n\t"
  147463. #else
  147464. "adc r3, %[r]\n\t"
  147465. #endif
  147466. "uxth r7, %[b]\n\t"
  147467. #ifdef WOLFSSL_KEIL
  147468. "muls r6, r7, r6\n\t"
  147469. #elif defined(__clang__)
  147470. "muls r6, r7\n\t"
  147471. #else
  147472. "mul r6, r7\n\t"
  147473. #endif
  147474. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147475. "lsrs r7, r6, #16\n\t"
  147476. #else
  147477. "lsr r7, r6, #16\n\t"
  147478. #endif
  147479. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147480. "lsls r6, r6, #16\n\t"
  147481. #else
  147482. "lsl r6, r6, #16\n\t"
  147483. #endif
  147484. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147485. "adds r4, r4, r6\n\t"
  147486. #else
  147487. "add r4, r4, r6\n\t"
  147488. #endif
  147489. #ifdef WOLFSSL_KEIL
  147490. "adcs r5, r5, r7\n\t"
  147491. #elif defined(__clang__)
  147492. "adcs r5, r7\n\t"
  147493. #else
  147494. "adc r5, r7\n\t"
  147495. #endif
  147496. #ifdef WOLFSSL_KEIL
  147497. "adcs r3, r3, %[r]\n\t"
  147498. #elif defined(__clang__)
  147499. "adcs r3, %[r]\n\t"
  147500. #else
  147501. "adc r3, %[r]\n\t"
  147502. #endif
  147503. "# A[2] * B[11]\n\t"
  147504. "mov %[a], r9\n\t"
  147505. "mov %[b], r10\n\t"
  147506. "ldr %[a], [%[a], #8]\n\t"
  147507. "ldr %[b], [%[b], #44]\n\t"
  147508. "uxth r6, %[a]\n\t"
  147509. "uxth r7, %[b]\n\t"
  147510. #ifdef WOLFSSL_KEIL
  147511. "muls r7, r6, r7\n\t"
  147512. #elif defined(__clang__)
  147513. "muls r7, r6\n\t"
  147514. #else
  147515. "mul r7, r6\n\t"
  147516. #endif
  147517. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147518. "adds r4, r4, r7\n\t"
  147519. #else
  147520. "add r4, r4, r7\n\t"
  147521. #endif
  147522. #ifdef WOLFSSL_KEIL
  147523. "adcs r5, r5, %[r]\n\t"
  147524. #elif defined(__clang__)
  147525. "adcs r5, %[r]\n\t"
  147526. #else
  147527. "adc r5, %[r]\n\t"
  147528. #endif
  147529. #ifdef WOLFSSL_KEIL
  147530. "adcs r3, r3, %[r]\n\t"
  147531. #elif defined(__clang__)
  147532. "adcs r3, %[r]\n\t"
  147533. #else
  147534. "adc r3, %[r]\n\t"
  147535. #endif
  147536. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147537. "lsrs r7, %[b], #16\n\t"
  147538. #else
  147539. "lsr r7, %[b], #16\n\t"
  147540. #endif
  147541. #ifdef WOLFSSL_KEIL
  147542. "muls r6, r7, r6\n\t"
  147543. #elif defined(__clang__)
  147544. "muls r6, r7\n\t"
  147545. #else
  147546. "mul r6, r7\n\t"
  147547. #endif
  147548. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147549. "lsrs r7, r6, #16\n\t"
  147550. #else
  147551. "lsr r7, r6, #16\n\t"
  147552. #endif
  147553. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147554. "lsls r6, r6, #16\n\t"
  147555. #else
  147556. "lsl r6, r6, #16\n\t"
  147557. #endif
  147558. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147559. "adds r4, r4, r6\n\t"
  147560. #else
  147561. "add r4, r4, r6\n\t"
  147562. #endif
  147563. #ifdef WOLFSSL_KEIL
  147564. "adcs r5, r5, r7\n\t"
  147565. #elif defined(__clang__)
  147566. "adcs r5, r7\n\t"
  147567. #else
  147568. "adc r5, r7\n\t"
  147569. #endif
  147570. #ifdef WOLFSSL_KEIL
  147571. "adcs r3, r3, %[r]\n\t"
  147572. #elif defined(__clang__)
  147573. "adcs r3, %[r]\n\t"
  147574. #else
  147575. "adc r3, %[r]\n\t"
  147576. #endif
  147577. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147578. "lsrs r6, %[a], #16\n\t"
  147579. #else
  147580. "lsr r6, %[a], #16\n\t"
  147581. #endif
  147582. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147583. "lsrs r7, %[b], #16\n\t"
  147584. #else
  147585. "lsr r7, %[b], #16\n\t"
  147586. #endif
  147587. #ifdef WOLFSSL_KEIL
  147588. "muls r7, r6, r7\n\t"
  147589. #elif defined(__clang__)
  147590. "muls r7, r6\n\t"
  147591. #else
  147592. "mul r7, r6\n\t"
  147593. #endif
  147594. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147595. "adds r5, r5, r7\n\t"
  147596. #else
  147597. "add r5, r5, r7\n\t"
  147598. #endif
  147599. #ifdef WOLFSSL_KEIL
  147600. "adcs r3, r3, %[r]\n\t"
  147601. #elif defined(__clang__)
  147602. "adcs r3, %[r]\n\t"
  147603. #else
  147604. "adc r3, %[r]\n\t"
  147605. #endif
  147606. "uxth r7, %[b]\n\t"
  147607. #ifdef WOLFSSL_KEIL
  147608. "muls r6, r7, r6\n\t"
  147609. #elif defined(__clang__)
  147610. "muls r6, r7\n\t"
  147611. #else
  147612. "mul r6, r7\n\t"
  147613. #endif
  147614. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147615. "lsrs r7, r6, #16\n\t"
  147616. #else
  147617. "lsr r7, r6, #16\n\t"
  147618. #endif
  147619. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147620. "lsls r6, r6, #16\n\t"
  147621. #else
  147622. "lsl r6, r6, #16\n\t"
  147623. #endif
  147624. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147625. "adds r4, r4, r6\n\t"
  147626. #else
  147627. "add r4, r4, r6\n\t"
  147628. #endif
  147629. #ifdef WOLFSSL_KEIL
  147630. "adcs r5, r5, r7\n\t"
  147631. #elif defined(__clang__)
  147632. "adcs r5, r7\n\t"
  147633. #else
  147634. "adc r5, r7\n\t"
  147635. #endif
  147636. #ifdef WOLFSSL_KEIL
  147637. "adcs r3, r3, %[r]\n\t"
  147638. #elif defined(__clang__)
  147639. "adcs r3, %[r]\n\t"
  147640. #else
  147641. "adc r3, %[r]\n\t"
  147642. #endif
  147643. "# A[3] * B[10]\n\t"
  147644. "mov %[a], r9\n\t"
  147645. "mov %[b], r10\n\t"
  147646. "ldr %[a], [%[a], #12]\n\t"
  147647. "ldr %[b], [%[b], #40]\n\t"
  147648. "uxth r6, %[a]\n\t"
  147649. "uxth r7, %[b]\n\t"
  147650. #ifdef WOLFSSL_KEIL
  147651. "muls r7, r6, r7\n\t"
  147652. #elif defined(__clang__)
  147653. "muls r7, r6\n\t"
  147654. #else
  147655. "mul r7, r6\n\t"
  147656. #endif
  147657. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147658. "adds r4, r4, r7\n\t"
  147659. #else
  147660. "add r4, r4, r7\n\t"
  147661. #endif
  147662. #ifdef WOLFSSL_KEIL
  147663. "adcs r5, r5, %[r]\n\t"
  147664. #elif defined(__clang__)
  147665. "adcs r5, %[r]\n\t"
  147666. #else
  147667. "adc r5, %[r]\n\t"
  147668. #endif
  147669. #ifdef WOLFSSL_KEIL
  147670. "adcs r3, r3, %[r]\n\t"
  147671. #elif defined(__clang__)
  147672. "adcs r3, %[r]\n\t"
  147673. #else
  147674. "adc r3, %[r]\n\t"
  147675. #endif
  147676. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147677. "lsrs r7, %[b], #16\n\t"
  147678. #else
  147679. "lsr r7, %[b], #16\n\t"
  147680. #endif
  147681. #ifdef WOLFSSL_KEIL
  147682. "muls r6, r7, r6\n\t"
  147683. #elif defined(__clang__)
  147684. "muls r6, r7\n\t"
  147685. #else
  147686. "mul r6, r7\n\t"
  147687. #endif
  147688. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147689. "lsrs r7, r6, #16\n\t"
  147690. #else
  147691. "lsr r7, r6, #16\n\t"
  147692. #endif
  147693. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147694. "lsls r6, r6, #16\n\t"
  147695. #else
  147696. "lsl r6, r6, #16\n\t"
  147697. #endif
  147698. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147699. "adds r4, r4, r6\n\t"
  147700. #else
  147701. "add r4, r4, r6\n\t"
  147702. #endif
  147703. #ifdef WOLFSSL_KEIL
  147704. "adcs r5, r5, r7\n\t"
  147705. #elif defined(__clang__)
  147706. "adcs r5, r7\n\t"
  147707. #else
  147708. "adc r5, r7\n\t"
  147709. #endif
  147710. #ifdef WOLFSSL_KEIL
  147711. "adcs r3, r3, %[r]\n\t"
  147712. #elif defined(__clang__)
  147713. "adcs r3, %[r]\n\t"
  147714. #else
  147715. "adc r3, %[r]\n\t"
  147716. #endif
  147717. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147718. "lsrs r6, %[a], #16\n\t"
  147719. #else
  147720. "lsr r6, %[a], #16\n\t"
  147721. #endif
  147722. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147723. "lsrs r7, %[b], #16\n\t"
  147724. #else
  147725. "lsr r7, %[b], #16\n\t"
  147726. #endif
  147727. #ifdef WOLFSSL_KEIL
  147728. "muls r7, r6, r7\n\t"
  147729. #elif defined(__clang__)
  147730. "muls r7, r6\n\t"
  147731. #else
  147732. "mul r7, r6\n\t"
  147733. #endif
  147734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147735. "adds r5, r5, r7\n\t"
  147736. #else
  147737. "add r5, r5, r7\n\t"
  147738. #endif
  147739. #ifdef WOLFSSL_KEIL
  147740. "adcs r3, r3, %[r]\n\t"
  147741. #elif defined(__clang__)
  147742. "adcs r3, %[r]\n\t"
  147743. #else
  147744. "adc r3, %[r]\n\t"
  147745. #endif
  147746. "uxth r7, %[b]\n\t"
  147747. #ifdef WOLFSSL_KEIL
  147748. "muls r6, r7, r6\n\t"
  147749. #elif defined(__clang__)
  147750. "muls r6, r7\n\t"
  147751. #else
  147752. "mul r6, r7\n\t"
  147753. #endif
  147754. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147755. "lsrs r7, r6, #16\n\t"
  147756. #else
  147757. "lsr r7, r6, #16\n\t"
  147758. #endif
  147759. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147760. "lsls r6, r6, #16\n\t"
  147761. #else
  147762. "lsl r6, r6, #16\n\t"
  147763. #endif
  147764. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147765. "adds r4, r4, r6\n\t"
  147766. #else
  147767. "add r4, r4, r6\n\t"
  147768. #endif
  147769. #ifdef WOLFSSL_KEIL
  147770. "adcs r5, r5, r7\n\t"
  147771. #elif defined(__clang__)
  147772. "adcs r5, r7\n\t"
  147773. #else
  147774. "adc r5, r7\n\t"
  147775. #endif
  147776. #ifdef WOLFSSL_KEIL
  147777. "adcs r3, r3, %[r]\n\t"
  147778. #elif defined(__clang__)
  147779. "adcs r3, %[r]\n\t"
  147780. #else
  147781. "adc r3, %[r]\n\t"
  147782. #endif
  147783. "# A[4] * B[9]\n\t"
  147784. "mov %[a], r9\n\t"
  147785. "mov %[b], r10\n\t"
  147786. "ldr %[a], [%[a], #16]\n\t"
  147787. "ldr %[b], [%[b], #36]\n\t"
  147788. "uxth r6, %[a]\n\t"
  147789. "uxth r7, %[b]\n\t"
  147790. #ifdef WOLFSSL_KEIL
  147791. "muls r7, r6, r7\n\t"
  147792. #elif defined(__clang__)
  147793. "muls r7, r6\n\t"
  147794. #else
  147795. "mul r7, r6\n\t"
  147796. #endif
  147797. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147798. "adds r4, r4, r7\n\t"
  147799. #else
  147800. "add r4, r4, r7\n\t"
  147801. #endif
  147802. #ifdef WOLFSSL_KEIL
  147803. "adcs r5, r5, %[r]\n\t"
  147804. #elif defined(__clang__)
  147805. "adcs r5, %[r]\n\t"
  147806. #else
  147807. "adc r5, %[r]\n\t"
  147808. #endif
  147809. #ifdef WOLFSSL_KEIL
  147810. "adcs r3, r3, %[r]\n\t"
  147811. #elif defined(__clang__)
  147812. "adcs r3, %[r]\n\t"
  147813. #else
  147814. "adc r3, %[r]\n\t"
  147815. #endif
  147816. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147817. "lsrs r7, %[b], #16\n\t"
  147818. #else
  147819. "lsr r7, %[b], #16\n\t"
  147820. #endif
  147821. #ifdef WOLFSSL_KEIL
  147822. "muls r6, r7, r6\n\t"
  147823. #elif defined(__clang__)
  147824. "muls r6, r7\n\t"
  147825. #else
  147826. "mul r6, r7\n\t"
  147827. #endif
  147828. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147829. "lsrs r7, r6, #16\n\t"
  147830. #else
  147831. "lsr r7, r6, #16\n\t"
  147832. #endif
  147833. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147834. "lsls r6, r6, #16\n\t"
  147835. #else
  147836. "lsl r6, r6, #16\n\t"
  147837. #endif
  147838. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147839. "adds r4, r4, r6\n\t"
  147840. #else
  147841. "add r4, r4, r6\n\t"
  147842. #endif
  147843. #ifdef WOLFSSL_KEIL
  147844. "adcs r5, r5, r7\n\t"
  147845. #elif defined(__clang__)
  147846. "adcs r5, r7\n\t"
  147847. #else
  147848. "adc r5, r7\n\t"
  147849. #endif
  147850. #ifdef WOLFSSL_KEIL
  147851. "adcs r3, r3, %[r]\n\t"
  147852. #elif defined(__clang__)
  147853. "adcs r3, %[r]\n\t"
  147854. #else
  147855. "adc r3, %[r]\n\t"
  147856. #endif
  147857. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147858. "lsrs r6, %[a], #16\n\t"
  147859. #else
  147860. "lsr r6, %[a], #16\n\t"
  147861. #endif
  147862. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147863. "lsrs r7, %[b], #16\n\t"
  147864. #else
  147865. "lsr r7, %[b], #16\n\t"
  147866. #endif
  147867. #ifdef WOLFSSL_KEIL
  147868. "muls r7, r6, r7\n\t"
  147869. #elif defined(__clang__)
  147870. "muls r7, r6\n\t"
  147871. #else
  147872. "mul r7, r6\n\t"
  147873. #endif
  147874. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147875. "adds r5, r5, r7\n\t"
  147876. #else
  147877. "add r5, r5, r7\n\t"
  147878. #endif
  147879. #ifdef WOLFSSL_KEIL
  147880. "adcs r3, r3, %[r]\n\t"
  147881. #elif defined(__clang__)
  147882. "adcs r3, %[r]\n\t"
  147883. #else
  147884. "adc r3, %[r]\n\t"
  147885. #endif
  147886. "uxth r7, %[b]\n\t"
  147887. #ifdef WOLFSSL_KEIL
  147888. "muls r6, r7, r6\n\t"
  147889. #elif defined(__clang__)
  147890. "muls r6, r7\n\t"
  147891. #else
  147892. "mul r6, r7\n\t"
  147893. #endif
  147894. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147895. "lsrs r7, r6, #16\n\t"
  147896. #else
  147897. "lsr r7, r6, #16\n\t"
  147898. #endif
  147899. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147900. "lsls r6, r6, #16\n\t"
  147901. #else
  147902. "lsl r6, r6, #16\n\t"
  147903. #endif
  147904. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147905. "adds r4, r4, r6\n\t"
  147906. #else
  147907. "add r4, r4, r6\n\t"
  147908. #endif
  147909. #ifdef WOLFSSL_KEIL
  147910. "adcs r5, r5, r7\n\t"
  147911. #elif defined(__clang__)
  147912. "adcs r5, r7\n\t"
  147913. #else
  147914. "adc r5, r7\n\t"
  147915. #endif
  147916. #ifdef WOLFSSL_KEIL
  147917. "adcs r3, r3, %[r]\n\t"
  147918. #elif defined(__clang__)
  147919. "adcs r3, %[r]\n\t"
  147920. #else
  147921. "adc r3, %[r]\n\t"
  147922. #endif
  147923. "# A[5] * B[8]\n\t"
  147924. "mov %[a], r9\n\t"
  147925. "mov %[b], r10\n\t"
  147926. "ldr %[a], [%[a], #20]\n\t"
  147927. "ldr %[b], [%[b], #32]\n\t"
  147928. "uxth r6, %[a]\n\t"
  147929. "uxth r7, %[b]\n\t"
  147930. #ifdef WOLFSSL_KEIL
  147931. "muls r7, r6, r7\n\t"
  147932. #elif defined(__clang__)
  147933. "muls r7, r6\n\t"
  147934. #else
  147935. "mul r7, r6\n\t"
  147936. #endif
  147937. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147938. "adds r4, r4, r7\n\t"
  147939. #else
  147940. "add r4, r4, r7\n\t"
  147941. #endif
  147942. #ifdef WOLFSSL_KEIL
  147943. "adcs r5, r5, %[r]\n\t"
  147944. #elif defined(__clang__)
  147945. "adcs r5, %[r]\n\t"
  147946. #else
  147947. "adc r5, %[r]\n\t"
  147948. #endif
  147949. #ifdef WOLFSSL_KEIL
  147950. "adcs r3, r3, %[r]\n\t"
  147951. #elif defined(__clang__)
  147952. "adcs r3, %[r]\n\t"
  147953. #else
  147954. "adc r3, %[r]\n\t"
  147955. #endif
  147956. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147957. "lsrs r7, %[b], #16\n\t"
  147958. #else
  147959. "lsr r7, %[b], #16\n\t"
  147960. #endif
  147961. #ifdef WOLFSSL_KEIL
  147962. "muls r6, r7, r6\n\t"
  147963. #elif defined(__clang__)
  147964. "muls r6, r7\n\t"
  147965. #else
  147966. "mul r6, r7\n\t"
  147967. #endif
  147968. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147969. "lsrs r7, r6, #16\n\t"
  147970. #else
  147971. "lsr r7, r6, #16\n\t"
  147972. #endif
  147973. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147974. "lsls r6, r6, #16\n\t"
  147975. #else
  147976. "lsl r6, r6, #16\n\t"
  147977. #endif
  147978. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147979. "adds r4, r4, r6\n\t"
  147980. #else
  147981. "add r4, r4, r6\n\t"
  147982. #endif
  147983. #ifdef WOLFSSL_KEIL
  147984. "adcs r5, r5, r7\n\t"
  147985. #elif defined(__clang__)
  147986. "adcs r5, r7\n\t"
  147987. #else
  147988. "adc r5, r7\n\t"
  147989. #endif
  147990. #ifdef WOLFSSL_KEIL
  147991. "adcs r3, r3, %[r]\n\t"
  147992. #elif defined(__clang__)
  147993. "adcs r3, %[r]\n\t"
  147994. #else
  147995. "adc r3, %[r]\n\t"
  147996. #endif
  147997. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147998. "lsrs r6, %[a], #16\n\t"
  147999. #else
  148000. "lsr r6, %[a], #16\n\t"
  148001. #endif
  148002. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148003. "lsrs r7, %[b], #16\n\t"
  148004. #else
  148005. "lsr r7, %[b], #16\n\t"
  148006. #endif
  148007. #ifdef WOLFSSL_KEIL
  148008. "muls r7, r6, r7\n\t"
  148009. #elif defined(__clang__)
  148010. "muls r7, r6\n\t"
  148011. #else
  148012. "mul r7, r6\n\t"
  148013. #endif
  148014. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148015. "adds r5, r5, r7\n\t"
  148016. #else
  148017. "add r5, r5, r7\n\t"
  148018. #endif
  148019. #ifdef WOLFSSL_KEIL
  148020. "adcs r3, r3, %[r]\n\t"
  148021. #elif defined(__clang__)
  148022. "adcs r3, %[r]\n\t"
  148023. #else
  148024. "adc r3, %[r]\n\t"
  148025. #endif
  148026. "uxth r7, %[b]\n\t"
  148027. #ifdef WOLFSSL_KEIL
  148028. "muls r6, r7, r6\n\t"
  148029. #elif defined(__clang__)
  148030. "muls r6, r7\n\t"
  148031. #else
  148032. "mul r6, r7\n\t"
  148033. #endif
  148034. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148035. "lsrs r7, r6, #16\n\t"
  148036. #else
  148037. "lsr r7, r6, #16\n\t"
  148038. #endif
  148039. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148040. "lsls r6, r6, #16\n\t"
  148041. #else
  148042. "lsl r6, r6, #16\n\t"
  148043. #endif
  148044. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148045. "adds r4, r4, r6\n\t"
  148046. #else
  148047. "add r4, r4, r6\n\t"
  148048. #endif
  148049. #ifdef WOLFSSL_KEIL
  148050. "adcs r5, r5, r7\n\t"
  148051. #elif defined(__clang__)
  148052. "adcs r5, r7\n\t"
  148053. #else
  148054. "adc r5, r7\n\t"
  148055. #endif
  148056. #ifdef WOLFSSL_KEIL
  148057. "adcs r3, r3, %[r]\n\t"
  148058. #elif defined(__clang__)
  148059. "adcs r3, %[r]\n\t"
  148060. #else
  148061. "adc r3, %[r]\n\t"
  148062. #endif
  148063. "# A[6] * B[7]\n\t"
  148064. "mov %[a], r9\n\t"
  148065. "mov %[b], r10\n\t"
  148066. "ldr %[a], [%[a], #24]\n\t"
  148067. "ldr %[b], [%[b], #28]\n\t"
  148068. "uxth r6, %[a]\n\t"
  148069. "uxth r7, %[b]\n\t"
  148070. #ifdef WOLFSSL_KEIL
  148071. "muls r7, r6, r7\n\t"
  148072. #elif defined(__clang__)
  148073. "muls r7, r6\n\t"
  148074. #else
  148075. "mul r7, r6\n\t"
  148076. #endif
  148077. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148078. "adds r4, r4, r7\n\t"
  148079. #else
  148080. "add r4, r4, r7\n\t"
  148081. #endif
  148082. #ifdef WOLFSSL_KEIL
  148083. "adcs r5, r5, %[r]\n\t"
  148084. #elif defined(__clang__)
  148085. "adcs r5, %[r]\n\t"
  148086. #else
  148087. "adc r5, %[r]\n\t"
  148088. #endif
  148089. #ifdef WOLFSSL_KEIL
  148090. "adcs r3, r3, %[r]\n\t"
  148091. #elif defined(__clang__)
  148092. "adcs r3, %[r]\n\t"
  148093. #else
  148094. "adc r3, %[r]\n\t"
  148095. #endif
  148096. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148097. "lsrs r7, %[b], #16\n\t"
  148098. #else
  148099. "lsr r7, %[b], #16\n\t"
  148100. #endif
  148101. #ifdef WOLFSSL_KEIL
  148102. "muls r6, r7, r6\n\t"
  148103. #elif defined(__clang__)
  148104. "muls r6, r7\n\t"
  148105. #else
  148106. "mul r6, r7\n\t"
  148107. #endif
  148108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148109. "lsrs r7, r6, #16\n\t"
  148110. #else
  148111. "lsr r7, r6, #16\n\t"
  148112. #endif
  148113. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148114. "lsls r6, r6, #16\n\t"
  148115. #else
  148116. "lsl r6, r6, #16\n\t"
  148117. #endif
  148118. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148119. "adds r4, r4, r6\n\t"
  148120. #else
  148121. "add r4, r4, r6\n\t"
  148122. #endif
  148123. #ifdef WOLFSSL_KEIL
  148124. "adcs r5, r5, r7\n\t"
  148125. #elif defined(__clang__)
  148126. "adcs r5, r7\n\t"
  148127. #else
  148128. "adc r5, r7\n\t"
  148129. #endif
  148130. #ifdef WOLFSSL_KEIL
  148131. "adcs r3, r3, %[r]\n\t"
  148132. #elif defined(__clang__)
  148133. "adcs r3, %[r]\n\t"
  148134. #else
  148135. "adc r3, %[r]\n\t"
  148136. #endif
  148137. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148138. "lsrs r6, %[a], #16\n\t"
  148139. #else
  148140. "lsr r6, %[a], #16\n\t"
  148141. #endif
  148142. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148143. "lsrs r7, %[b], #16\n\t"
  148144. #else
  148145. "lsr r7, %[b], #16\n\t"
  148146. #endif
  148147. #ifdef WOLFSSL_KEIL
  148148. "muls r7, r6, r7\n\t"
  148149. #elif defined(__clang__)
  148150. "muls r7, r6\n\t"
  148151. #else
  148152. "mul r7, r6\n\t"
  148153. #endif
  148154. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148155. "adds r5, r5, r7\n\t"
  148156. #else
  148157. "add r5, r5, r7\n\t"
  148158. #endif
  148159. #ifdef WOLFSSL_KEIL
  148160. "adcs r3, r3, %[r]\n\t"
  148161. #elif defined(__clang__)
  148162. "adcs r3, %[r]\n\t"
  148163. #else
  148164. "adc r3, %[r]\n\t"
  148165. #endif
  148166. "uxth r7, %[b]\n\t"
  148167. #ifdef WOLFSSL_KEIL
  148168. "muls r6, r7, r6\n\t"
  148169. #elif defined(__clang__)
  148170. "muls r6, r7\n\t"
  148171. #else
  148172. "mul r6, r7\n\t"
  148173. #endif
  148174. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148175. "lsrs r7, r6, #16\n\t"
  148176. #else
  148177. "lsr r7, r6, #16\n\t"
  148178. #endif
  148179. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148180. "lsls r6, r6, #16\n\t"
  148181. #else
  148182. "lsl r6, r6, #16\n\t"
  148183. #endif
  148184. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148185. "adds r4, r4, r6\n\t"
  148186. #else
  148187. "add r4, r4, r6\n\t"
  148188. #endif
  148189. #ifdef WOLFSSL_KEIL
  148190. "adcs r5, r5, r7\n\t"
  148191. #elif defined(__clang__)
  148192. "adcs r5, r7\n\t"
  148193. #else
  148194. "adc r5, r7\n\t"
  148195. #endif
  148196. #ifdef WOLFSSL_KEIL
  148197. "adcs r3, r3, %[r]\n\t"
  148198. #elif defined(__clang__)
  148199. "adcs r3, %[r]\n\t"
  148200. #else
  148201. "adc r3, %[r]\n\t"
  148202. #endif
  148203. "# A[7] * B[6]\n\t"
  148204. "mov %[a], r9\n\t"
  148205. "mov %[b], r10\n\t"
  148206. "ldr %[a], [%[a], #28]\n\t"
  148207. "ldr %[b], [%[b], #24]\n\t"
  148208. "uxth r6, %[a]\n\t"
  148209. "uxth r7, %[b]\n\t"
  148210. #ifdef WOLFSSL_KEIL
  148211. "muls r7, r6, r7\n\t"
  148212. #elif defined(__clang__)
  148213. "muls r7, r6\n\t"
  148214. #else
  148215. "mul r7, r6\n\t"
  148216. #endif
  148217. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148218. "adds r4, r4, r7\n\t"
  148219. #else
  148220. "add r4, r4, r7\n\t"
  148221. #endif
  148222. #ifdef WOLFSSL_KEIL
  148223. "adcs r5, r5, %[r]\n\t"
  148224. #elif defined(__clang__)
  148225. "adcs r5, %[r]\n\t"
  148226. #else
  148227. "adc r5, %[r]\n\t"
  148228. #endif
  148229. #ifdef WOLFSSL_KEIL
  148230. "adcs r3, r3, %[r]\n\t"
  148231. #elif defined(__clang__)
  148232. "adcs r3, %[r]\n\t"
  148233. #else
  148234. "adc r3, %[r]\n\t"
  148235. #endif
  148236. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148237. "lsrs r7, %[b], #16\n\t"
  148238. #else
  148239. "lsr r7, %[b], #16\n\t"
  148240. #endif
  148241. #ifdef WOLFSSL_KEIL
  148242. "muls r6, r7, r6\n\t"
  148243. #elif defined(__clang__)
  148244. "muls r6, r7\n\t"
  148245. #else
  148246. "mul r6, r7\n\t"
  148247. #endif
  148248. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148249. "lsrs r7, r6, #16\n\t"
  148250. #else
  148251. "lsr r7, r6, #16\n\t"
  148252. #endif
  148253. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148254. "lsls r6, r6, #16\n\t"
  148255. #else
  148256. "lsl r6, r6, #16\n\t"
  148257. #endif
  148258. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148259. "adds r4, r4, r6\n\t"
  148260. #else
  148261. "add r4, r4, r6\n\t"
  148262. #endif
  148263. #ifdef WOLFSSL_KEIL
  148264. "adcs r5, r5, r7\n\t"
  148265. #elif defined(__clang__)
  148266. "adcs r5, r7\n\t"
  148267. #else
  148268. "adc r5, r7\n\t"
  148269. #endif
  148270. #ifdef WOLFSSL_KEIL
  148271. "adcs r3, r3, %[r]\n\t"
  148272. #elif defined(__clang__)
  148273. "adcs r3, %[r]\n\t"
  148274. #else
  148275. "adc r3, %[r]\n\t"
  148276. #endif
  148277. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148278. "lsrs r6, %[a], #16\n\t"
  148279. #else
  148280. "lsr r6, %[a], #16\n\t"
  148281. #endif
  148282. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148283. "lsrs r7, %[b], #16\n\t"
  148284. #else
  148285. "lsr r7, %[b], #16\n\t"
  148286. #endif
  148287. #ifdef WOLFSSL_KEIL
  148288. "muls r7, r6, r7\n\t"
  148289. #elif defined(__clang__)
  148290. "muls r7, r6\n\t"
  148291. #else
  148292. "mul r7, r6\n\t"
  148293. #endif
  148294. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148295. "adds r5, r5, r7\n\t"
  148296. #else
  148297. "add r5, r5, r7\n\t"
  148298. #endif
  148299. #ifdef WOLFSSL_KEIL
  148300. "adcs r3, r3, %[r]\n\t"
  148301. #elif defined(__clang__)
  148302. "adcs r3, %[r]\n\t"
  148303. #else
  148304. "adc r3, %[r]\n\t"
  148305. #endif
  148306. "uxth r7, %[b]\n\t"
  148307. #ifdef WOLFSSL_KEIL
  148308. "muls r6, r7, r6\n\t"
  148309. #elif defined(__clang__)
  148310. "muls r6, r7\n\t"
  148311. #else
  148312. "mul r6, r7\n\t"
  148313. #endif
  148314. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148315. "lsrs r7, r6, #16\n\t"
  148316. #else
  148317. "lsr r7, r6, #16\n\t"
  148318. #endif
  148319. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148320. "lsls r6, r6, #16\n\t"
  148321. #else
  148322. "lsl r6, r6, #16\n\t"
  148323. #endif
  148324. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148325. "adds r4, r4, r6\n\t"
  148326. #else
  148327. "add r4, r4, r6\n\t"
  148328. #endif
  148329. #ifdef WOLFSSL_KEIL
  148330. "adcs r5, r5, r7\n\t"
  148331. #elif defined(__clang__)
  148332. "adcs r5, r7\n\t"
  148333. #else
  148334. "adc r5, r7\n\t"
  148335. #endif
  148336. #ifdef WOLFSSL_KEIL
  148337. "adcs r3, r3, %[r]\n\t"
  148338. #elif defined(__clang__)
  148339. "adcs r3, %[r]\n\t"
  148340. #else
  148341. "adc r3, %[r]\n\t"
  148342. #endif
  148343. "# A[8] * B[5]\n\t"
  148344. "mov %[a], r9\n\t"
  148345. "mov %[b], r10\n\t"
  148346. "ldr %[a], [%[a], #32]\n\t"
  148347. "ldr %[b], [%[b], #20]\n\t"
  148348. "uxth r6, %[a]\n\t"
  148349. "uxth r7, %[b]\n\t"
  148350. #ifdef WOLFSSL_KEIL
  148351. "muls r7, r6, r7\n\t"
  148352. #elif defined(__clang__)
  148353. "muls r7, r6\n\t"
  148354. #else
  148355. "mul r7, r6\n\t"
  148356. #endif
  148357. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148358. "adds r4, r4, r7\n\t"
  148359. #else
  148360. "add r4, r4, r7\n\t"
  148361. #endif
  148362. #ifdef WOLFSSL_KEIL
  148363. "adcs r5, r5, %[r]\n\t"
  148364. #elif defined(__clang__)
  148365. "adcs r5, %[r]\n\t"
  148366. #else
  148367. "adc r5, %[r]\n\t"
  148368. #endif
  148369. #ifdef WOLFSSL_KEIL
  148370. "adcs r3, r3, %[r]\n\t"
  148371. #elif defined(__clang__)
  148372. "adcs r3, %[r]\n\t"
  148373. #else
  148374. "adc r3, %[r]\n\t"
  148375. #endif
  148376. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148377. "lsrs r7, %[b], #16\n\t"
  148378. #else
  148379. "lsr r7, %[b], #16\n\t"
  148380. #endif
  148381. #ifdef WOLFSSL_KEIL
  148382. "muls r6, r7, r6\n\t"
  148383. #elif defined(__clang__)
  148384. "muls r6, r7\n\t"
  148385. #else
  148386. "mul r6, r7\n\t"
  148387. #endif
  148388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148389. "lsrs r7, r6, #16\n\t"
  148390. #else
  148391. "lsr r7, r6, #16\n\t"
  148392. #endif
  148393. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148394. "lsls r6, r6, #16\n\t"
  148395. #else
  148396. "lsl r6, r6, #16\n\t"
  148397. #endif
  148398. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148399. "adds r4, r4, r6\n\t"
  148400. #else
  148401. "add r4, r4, r6\n\t"
  148402. #endif
  148403. #ifdef WOLFSSL_KEIL
  148404. "adcs r5, r5, r7\n\t"
  148405. #elif defined(__clang__)
  148406. "adcs r5, r7\n\t"
  148407. #else
  148408. "adc r5, r7\n\t"
  148409. #endif
  148410. #ifdef WOLFSSL_KEIL
  148411. "adcs r3, r3, %[r]\n\t"
  148412. #elif defined(__clang__)
  148413. "adcs r3, %[r]\n\t"
  148414. #else
  148415. "adc r3, %[r]\n\t"
  148416. #endif
  148417. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148418. "lsrs r6, %[a], #16\n\t"
  148419. #else
  148420. "lsr r6, %[a], #16\n\t"
  148421. #endif
  148422. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148423. "lsrs r7, %[b], #16\n\t"
  148424. #else
  148425. "lsr r7, %[b], #16\n\t"
  148426. #endif
  148427. #ifdef WOLFSSL_KEIL
  148428. "muls r7, r6, r7\n\t"
  148429. #elif defined(__clang__)
  148430. "muls r7, r6\n\t"
  148431. #else
  148432. "mul r7, r6\n\t"
  148433. #endif
  148434. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148435. "adds r5, r5, r7\n\t"
  148436. #else
  148437. "add r5, r5, r7\n\t"
  148438. #endif
  148439. #ifdef WOLFSSL_KEIL
  148440. "adcs r3, r3, %[r]\n\t"
  148441. #elif defined(__clang__)
  148442. "adcs r3, %[r]\n\t"
  148443. #else
  148444. "adc r3, %[r]\n\t"
  148445. #endif
  148446. "uxth r7, %[b]\n\t"
  148447. #ifdef WOLFSSL_KEIL
  148448. "muls r6, r7, r6\n\t"
  148449. #elif defined(__clang__)
  148450. "muls r6, r7\n\t"
  148451. #else
  148452. "mul r6, r7\n\t"
  148453. #endif
  148454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148455. "lsrs r7, r6, #16\n\t"
  148456. #else
  148457. "lsr r7, r6, #16\n\t"
  148458. #endif
  148459. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148460. "lsls r6, r6, #16\n\t"
  148461. #else
  148462. "lsl r6, r6, #16\n\t"
  148463. #endif
  148464. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148465. "adds r4, r4, r6\n\t"
  148466. #else
  148467. "add r4, r4, r6\n\t"
  148468. #endif
  148469. #ifdef WOLFSSL_KEIL
  148470. "adcs r5, r5, r7\n\t"
  148471. #elif defined(__clang__)
  148472. "adcs r5, r7\n\t"
  148473. #else
  148474. "adc r5, r7\n\t"
  148475. #endif
  148476. #ifdef WOLFSSL_KEIL
  148477. "adcs r3, r3, %[r]\n\t"
  148478. #elif defined(__clang__)
  148479. "adcs r3, %[r]\n\t"
  148480. #else
  148481. "adc r3, %[r]\n\t"
  148482. #endif
  148483. "# A[9] * B[4]\n\t"
  148484. "mov %[a], r9\n\t"
  148485. "mov %[b], r10\n\t"
  148486. "ldr %[a], [%[a], #36]\n\t"
  148487. "ldr %[b], [%[b], #16]\n\t"
  148488. "uxth r6, %[a]\n\t"
  148489. "uxth r7, %[b]\n\t"
  148490. #ifdef WOLFSSL_KEIL
  148491. "muls r7, r6, r7\n\t"
  148492. #elif defined(__clang__)
  148493. "muls r7, r6\n\t"
  148494. #else
  148495. "mul r7, r6\n\t"
  148496. #endif
  148497. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148498. "adds r4, r4, r7\n\t"
  148499. #else
  148500. "add r4, r4, r7\n\t"
  148501. #endif
  148502. #ifdef WOLFSSL_KEIL
  148503. "adcs r5, r5, %[r]\n\t"
  148504. #elif defined(__clang__)
  148505. "adcs r5, %[r]\n\t"
  148506. #else
  148507. "adc r5, %[r]\n\t"
  148508. #endif
  148509. #ifdef WOLFSSL_KEIL
  148510. "adcs r3, r3, %[r]\n\t"
  148511. #elif defined(__clang__)
  148512. "adcs r3, %[r]\n\t"
  148513. #else
  148514. "adc r3, %[r]\n\t"
  148515. #endif
  148516. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148517. "lsrs r7, %[b], #16\n\t"
  148518. #else
  148519. "lsr r7, %[b], #16\n\t"
  148520. #endif
  148521. #ifdef WOLFSSL_KEIL
  148522. "muls r6, r7, r6\n\t"
  148523. #elif defined(__clang__)
  148524. "muls r6, r7\n\t"
  148525. #else
  148526. "mul r6, r7\n\t"
  148527. #endif
  148528. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148529. "lsrs r7, r6, #16\n\t"
  148530. #else
  148531. "lsr r7, r6, #16\n\t"
  148532. #endif
  148533. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148534. "lsls r6, r6, #16\n\t"
  148535. #else
  148536. "lsl r6, r6, #16\n\t"
  148537. #endif
  148538. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148539. "adds r4, r4, r6\n\t"
  148540. #else
  148541. "add r4, r4, r6\n\t"
  148542. #endif
  148543. #ifdef WOLFSSL_KEIL
  148544. "adcs r5, r5, r7\n\t"
  148545. #elif defined(__clang__)
  148546. "adcs r5, r7\n\t"
  148547. #else
  148548. "adc r5, r7\n\t"
  148549. #endif
  148550. #ifdef WOLFSSL_KEIL
  148551. "adcs r3, r3, %[r]\n\t"
  148552. #elif defined(__clang__)
  148553. "adcs r3, %[r]\n\t"
  148554. #else
  148555. "adc r3, %[r]\n\t"
  148556. #endif
  148557. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148558. "lsrs r6, %[a], #16\n\t"
  148559. #else
  148560. "lsr r6, %[a], #16\n\t"
  148561. #endif
  148562. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148563. "lsrs r7, %[b], #16\n\t"
  148564. #else
  148565. "lsr r7, %[b], #16\n\t"
  148566. #endif
  148567. #ifdef WOLFSSL_KEIL
  148568. "muls r7, r6, r7\n\t"
  148569. #elif defined(__clang__)
  148570. "muls r7, r6\n\t"
  148571. #else
  148572. "mul r7, r6\n\t"
  148573. #endif
  148574. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148575. "adds r5, r5, r7\n\t"
  148576. #else
  148577. "add r5, r5, r7\n\t"
  148578. #endif
  148579. #ifdef WOLFSSL_KEIL
  148580. "adcs r3, r3, %[r]\n\t"
  148581. #elif defined(__clang__)
  148582. "adcs r3, %[r]\n\t"
  148583. #else
  148584. "adc r3, %[r]\n\t"
  148585. #endif
  148586. "uxth r7, %[b]\n\t"
  148587. #ifdef WOLFSSL_KEIL
  148588. "muls r6, r7, r6\n\t"
  148589. #elif defined(__clang__)
  148590. "muls r6, r7\n\t"
  148591. #else
  148592. "mul r6, r7\n\t"
  148593. #endif
  148594. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148595. "lsrs r7, r6, #16\n\t"
  148596. #else
  148597. "lsr r7, r6, #16\n\t"
  148598. #endif
  148599. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148600. "lsls r6, r6, #16\n\t"
  148601. #else
  148602. "lsl r6, r6, #16\n\t"
  148603. #endif
  148604. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148605. "adds r4, r4, r6\n\t"
  148606. #else
  148607. "add r4, r4, r6\n\t"
  148608. #endif
  148609. #ifdef WOLFSSL_KEIL
  148610. "adcs r5, r5, r7\n\t"
  148611. #elif defined(__clang__)
  148612. "adcs r5, r7\n\t"
  148613. #else
  148614. "adc r5, r7\n\t"
  148615. #endif
  148616. #ifdef WOLFSSL_KEIL
  148617. "adcs r3, r3, %[r]\n\t"
  148618. #elif defined(__clang__)
  148619. "adcs r3, %[r]\n\t"
  148620. #else
  148621. "adc r3, %[r]\n\t"
  148622. #endif
  148623. "# A[10] * B[3]\n\t"
  148624. "mov %[a], r9\n\t"
  148625. "mov %[b], r10\n\t"
  148626. "ldr %[a], [%[a], #40]\n\t"
  148627. "ldr %[b], [%[b], #12]\n\t"
  148628. "uxth r6, %[a]\n\t"
  148629. "uxth r7, %[b]\n\t"
  148630. #ifdef WOLFSSL_KEIL
  148631. "muls r7, r6, r7\n\t"
  148632. #elif defined(__clang__)
  148633. "muls r7, r6\n\t"
  148634. #else
  148635. "mul r7, r6\n\t"
  148636. #endif
  148637. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148638. "adds r4, r4, r7\n\t"
  148639. #else
  148640. "add r4, r4, r7\n\t"
  148641. #endif
  148642. #ifdef WOLFSSL_KEIL
  148643. "adcs r5, r5, %[r]\n\t"
  148644. #elif defined(__clang__)
  148645. "adcs r5, %[r]\n\t"
  148646. #else
  148647. "adc r5, %[r]\n\t"
  148648. #endif
  148649. #ifdef WOLFSSL_KEIL
  148650. "adcs r3, r3, %[r]\n\t"
  148651. #elif defined(__clang__)
  148652. "adcs r3, %[r]\n\t"
  148653. #else
  148654. "adc r3, %[r]\n\t"
  148655. #endif
  148656. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148657. "lsrs r7, %[b], #16\n\t"
  148658. #else
  148659. "lsr r7, %[b], #16\n\t"
  148660. #endif
  148661. #ifdef WOLFSSL_KEIL
  148662. "muls r6, r7, r6\n\t"
  148663. #elif defined(__clang__)
  148664. "muls r6, r7\n\t"
  148665. #else
  148666. "mul r6, r7\n\t"
  148667. #endif
  148668. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148669. "lsrs r7, r6, #16\n\t"
  148670. #else
  148671. "lsr r7, r6, #16\n\t"
  148672. #endif
  148673. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148674. "lsls r6, r6, #16\n\t"
  148675. #else
  148676. "lsl r6, r6, #16\n\t"
  148677. #endif
  148678. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148679. "adds r4, r4, r6\n\t"
  148680. #else
  148681. "add r4, r4, r6\n\t"
  148682. #endif
  148683. #ifdef WOLFSSL_KEIL
  148684. "adcs r5, r5, r7\n\t"
  148685. #elif defined(__clang__)
  148686. "adcs r5, r7\n\t"
  148687. #else
  148688. "adc r5, r7\n\t"
  148689. #endif
  148690. #ifdef WOLFSSL_KEIL
  148691. "adcs r3, r3, %[r]\n\t"
  148692. #elif defined(__clang__)
  148693. "adcs r3, %[r]\n\t"
  148694. #else
  148695. "adc r3, %[r]\n\t"
  148696. #endif
  148697. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148698. "lsrs r6, %[a], #16\n\t"
  148699. #else
  148700. "lsr r6, %[a], #16\n\t"
  148701. #endif
  148702. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148703. "lsrs r7, %[b], #16\n\t"
  148704. #else
  148705. "lsr r7, %[b], #16\n\t"
  148706. #endif
  148707. #ifdef WOLFSSL_KEIL
  148708. "muls r7, r6, r7\n\t"
  148709. #elif defined(__clang__)
  148710. "muls r7, r6\n\t"
  148711. #else
  148712. "mul r7, r6\n\t"
  148713. #endif
  148714. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148715. "adds r5, r5, r7\n\t"
  148716. #else
  148717. "add r5, r5, r7\n\t"
  148718. #endif
  148719. #ifdef WOLFSSL_KEIL
  148720. "adcs r3, r3, %[r]\n\t"
  148721. #elif defined(__clang__)
  148722. "adcs r3, %[r]\n\t"
  148723. #else
  148724. "adc r3, %[r]\n\t"
  148725. #endif
  148726. "uxth r7, %[b]\n\t"
  148727. #ifdef WOLFSSL_KEIL
  148728. "muls r6, r7, r6\n\t"
  148729. #elif defined(__clang__)
  148730. "muls r6, r7\n\t"
  148731. #else
  148732. "mul r6, r7\n\t"
  148733. #endif
  148734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148735. "lsrs r7, r6, #16\n\t"
  148736. #else
  148737. "lsr r7, r6, #16\n\t"
  148738. #endif
  148739. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148740. "lsls r6, r6, #16\n\t"
  148741. #else
  148742. "lsl r6, r6, #16\n\t"
  148743. #endif
  148744. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148745. "adds r4, r4, r6\n\t"
  148746. #else
  148747. "add r4, r4, r6\n\t"
  148748. #endif
  148749. #ifdef WOLFSSL_KEIL
  148750. "adcs r5, r5, r7\n\t"
  148751. #elif defined(__clang__)
  148752. "adcs r5, r7\n\t"
  148753. #else
  148754. "adc r5, r7\n\t"
  148755. #endif
  148756. #ifdef WOLFSSL_KEIL
  148757. "adcs r3, r3, %[r]\n\t"
  148758. #elif defined(__clang__)
  148759. "adcs r3, %[r]\n\t"
  148760. #else
  148761. "adc r3, %[r]\n\t"
  148762. #endif
  148763. "# A[11] * B[2]\n\t"
  148764. "mov %[a], r9\n\t"
  148765. "mov %[b], r10\n\t"
  148766. "ldr %[a], [%[a], #44]\n\t"
  148767. "ldr %[b], [%[b], #8]\n\t"
  148768. "uxth r6, %[a]\n\t"
  148769. "uxth r7, %[b]\n\t"
  148770. #ifdef WOLFSSL_KEIL
  148771. "muls r7, r6, r7\n\t"
  148772. #elif defined(__clang__)
  148773. "muls r7, r6\n\t"
  148774. #else
  148775. "mul r7, r6\n\t"
  148776. #endif
  148777. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148778. "adds r4, r4, r7\n\t"
  148779. #else
  148780. "add r4, r4, r7\n\t"
  148781. #endif
  148782. #ifdef WOLFSSL_KEIL
  148783. "adcs r5, r5, %[r]\n\t"
  148784. #elif defined(__clang__)
  148785. "adcs r5, %[r]\n\t"
  148786. #else
  148787. "adc r5, %[r]\n\t"
  148788. #endif
  148789. #ifdef WOLFSSL_KEIL
  148790. "adcs r3, r3, %[r]\n\t"
  148791. #elif defined(__clang__)
  148792. "adcs r3, %[r]\n\t"
  148793. #else
  148794. "adc r3, %[r]\n\t"
  148795. #endif
  148796. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148797. "lsrs r7, %[b], #16\n\t"
  148798. #else
  148799. "lsr r7, %[b], #16\n\t"
  148800. #endif
  148801. #ifdef WOLFSSL_KEIL
  148802. "muls r6, r7, r6\n\t"
  148803. #elif defined(__clang__)
  148804. "muls r6, r7\n\t"
  148805. #else
  148806. "mul r6, r7\n\t"
  148807. #endif
  148808. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148809. "lsrs r7, r6, #16\n\t"
  148810. #else
  148811. "lsr r7, r6, #16\n\t"
  148812. #endif
  148813. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148814. "lsls r6, r6, #16\n\t"
  148815. #else
  148816. "lsl r6, r6, #16\n\t"
  148817. #endif
  148818. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148819. "adds r4, r4, r6\n\t"
  148820. #else
  148821. "add r4, r4, r6\n\t"
  148822. #endif
  148823. #ifdef WOLFSSL_KEIL
  148824. "adcs r5, r5, r7\n\t"
  148825. #elif defined(__clang__)
  148826. "adcs r5, r7\n\t"
  148827. #else
  148828. "adc r5, r7\n\t"
  148829. #endif
  148830. #ifdef WOLFSSL_KEIL
  148831. "adcs r3, r3, %[r]\n\t"
  148832. #elif defined(__clang__)
  148833. "adcs r3, %[r]\n\t"
  148834. #else
  148835. "adc r3, %[r]\n\t"
  148836. #endif
  148837. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148838. "lsrs r6, %[a], #16\n\t"
  148839. #else
  148840. "lsr r6, %[a], #16\n\t"
  148841. #endif
  148842. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148843. "lsrs r7, %[b], #16\n\t"
  148844. #else
  148845. "lsr r7, %[b], #16\n\t"
  148846. #endif
  148847. #ifdef WOLFSSL_KEIL
  148848. "muls r7, r6, r7\n\t"
  148849. #elif defined(__clang__)
  148850. "muls r7, r6\n\t"
  148851. #else
  148852. "mul r7, r6\n\t"
  148853. #endif
  148854. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148855. "adds r5, r5, r7\n\t"
  148856. #else
  148857. "add r5, r5, r7\n\t"
  148858. #endif
  148859. #ifdef WOLFSSL_KEIL
  148860. "adcs r3, r3, %[r]\n\t"
  148861. #elif defined(__clang__)
  148862. "adcs r3, %[r]\n\t"
  148863. #else
  148864. "adc r3, %[r]\n\t"
  148865. #endif
  148866. "uxth r7, %[b]\n\t"
  148867. #ifdef WOLFSSL_KEIL
  148868. "muls r6, r7, r6\n\t"
  148869. #elif defined(__clang__)
  148870. "muls r6, r7\n\t"
  148871. #else
  148872. "mul r6, r7\n\t"
  148873. #endif
  148874. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148875. "lsrs r7, r6, #16\n\t"
  148876. #else
  148877. "lsr r7, r6, #16\n\t"
  148878. #endif
  148879. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148880. "lsls r6, r6, #16\n\t"
  148881. #else
  148882. "lsl r6, r6, #16\n\t"
  148883. #endif
  148884. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148885. "adds r4, r4, r6\n\t"
  148886. #else
  148887. "add r4, r4, r6\n\t"
  148888. #endif
  148889. #ifdef WOLFSSL_KEIL
  148890. "adcs r5, r5, r7\n\t"
  148891. #elif defined(__clang__)
  148892. "adcs r5, r7\n\t"
  148893. #else
  148894. "adc r5, r7\n\t"
  148895. #endif
  148896. #ifdef WOLFSSL_KEIL
  148897. "adcs r3, r3, %[r]\n\t"
  148898. #elif defined(__clang__)
  148899. "adcs r3, %[r]\n\t"
  148900. #else
  148901. "adc r3, %[r]\n\t"
  148902. #endif
  148903. "# A[12] * B[1]\n\t"
  148904. "mov %[a], r9\n\t"
  148905. "mov %[b], r10\n\t"
  148906. "ldr %[a], [%[a], #48]\n\t"
  148907. "ldr %[b], [%[b], #4]\n\t"
  148908. "uxth r6, %[a]\n\t"
  148909. "uxth r7, %[b]\n\t"
  148910. #ifdef WOLFSSL_KEIL
  148911. "muls r7, r6, r7\n\t"
  148912. #elif defined(__clang__)
  148913. "muls r7, r6\n\t"
  148914. #else
  148915. "mul r7, r6\n\t"
  148916. #endif
  148917. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148918. "adds r4, r4, r7\n\t"
  148919. #else
  148920. "add r4, r4, r7\n\t"
  148921. #endif
  148922. #ifdef WOLFSSL_KEIL
  148923. "adcs r5, r5, %[r]\n\t"
  148924. #elif defined(__clang__)
  148925. "adcs r5, %[r]\n\t"
  148926. #else
  148927. "adc r5, %[r]\n\t"
  148928. #endif
  148929. #ifdef WOLFSSL_KEIL
  148930. "adcs r3, r3, %[r]\n\t"
  148931. #elif defined(__clang__)
  148932. "adcs r3, %[r]\n\t"
  148933. #else
  148934. "adc r3, %[r]\n\t"
  148935. #endif
  148936. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148937. "lsrs r7, %[b], #16\n\t"
  148938. #else
  148939. "lsr r7, %[b], #16\n\t"
  148940. #endif
  148941. #ifdef WOLFSSL_KEIL
  148942. "muls r6, r7, r6\n\t"
  148943. #elif defined(__clang__)
  148944. "muls r6, r7\n\t"
  148945. #else
  148946. "mul r6, r7\n\t"
  148947. #endif
  148948. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148949. "lsrs r7, r6, #16\n\t"
  148950. #else
  148951. "lsr r7, r6, #16\n\t"
  148952. #endif
  148953. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148954. "lsls r6, r6, #16\n\t"
  148955. #else
  148956. "lsl r6, r6, #16\n\t"
  148957. #endif
  148958. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148959. "adds r4, r4, r6\n\t"
  148960. #else
  148961. "add r4, r4, r6\n\t"
  148962. #endif
  148963. #ifdef WOLFSSL_KEIL
  148964. "adcs r5, r5, r7\n\t"
  148965. #elif defined(__clang__)
  148966. "adcs r5, r7\n\t"
  148967. #else
  148968. "adc r5, r7\n\t"
  148969. #endif
  148970. #ifdef WOLFSSL_KEIL
  148971. "adcs r3, r3, %[r]\n\t"
  148972. #elif defined(__clang__)
  148973. "adcs r3, %[r]\n\t"
  148974. #else
  148975. "adc r3, %[r]\n\t"
  148976. #endif
  148977. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148978. "lsrs r6, %[a], #16\n\t"
  148979. #else
  148980. "lsr r6, %[a], #16\n\t"
  148981. #endif
  148982. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148983. "lsrs r7, %[b], #16\n\t"
  148984. #else
  148985. "lsr r7, %[b], #16\n\t"
  148986. #endif
  148987. #ifdef WOLFSSL_KEIL
  148988. "muls r7, r6, r7\n\t"
  148989. #elif defined(__clang__)
  148990. "muls r7, r6\n\t"
  148991. #else
  148992. "mul r7, r6\n\t"
  148993. #endif
  148994. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148995. "adds r5, r5, r7\n\t"
  148996. #else
  148997. "add r5, r5, r7\n\t"
  148998. #endif
  148999. #ifdef WOLFSSL_KEIL
  149000. "adcs r3, r3, %[r]\n\t"
  149001. #elif defined(__clang__)
  149002. "adcs r3, %[r]\n\t"
  149003. #else
  149004. "adc r3, %[r]\n\t"
  149005. #endif
  149006. "uxth r7, %[b]\n\t"
  149007. #ifdef WOLFSSL_KEIL
  149008. "muls r6, r7, r6\n\t"
  149009. #elif defined(__clang__)
  149010. "muls r6, r7\n\t"
  149011. #else
  149012. "mul r6, r7\n\t"
  149013. #endif
  149014. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149015. "lsrs r7, r6, #16\n\t"
  149016. #else
  149017. "lsr r7, r6, #16\n\t"
  149018. #endif
  149019. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149020. "lsls r6, r6, #16\n\t"
  149021. #else
  149022. "lsl r6, r6, #16\n\t"
  149023. #endif
  149024. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149025. "adds r4, r4, r6\n\t"
  149026. #else
  149027. "add r4, r4, r6\n\t"
  149028. #endif
  149029. #ifdef WOLFSSL_KEIL
  149030. "adcs r5, r5, r7\n\t"
  149031. #elif defined(__clang__)
  149032. "adcs r5, r7\n\t"
  149033. #else
  149034. "adc r5, r7\n\t"
  149035. #endif
  149036. #ifdef WOLFSSL_KEIL
  149037. "adcs r3, r3, %[r]\n\t"
  149038. #elif defined(__clang__)
  149039. "adcs r3, %[r]\n\t"
  149040. #else
  149041. "adc r3, %[r]\n\t"
  149042. #endif
  149043. "# A[13] * B[0]\n\t"
  149044. "mov %[a], r9\n\t"
  149045. "mov %[b], r10\n\t"
  149046. "ldr %[a], [%[a], #52]\n\t"
  149047. "ldr %[b], [%[b]]\n\t"
  149048. "uxth r6, %[a]\n\t"
  149049. "uxth r7, %[b]\n\t"
  149050. #ifdef WOLFSSL_KEIL
  149051. "muls r7, r6, r7\n\t"
  149052. #elif defined(__clang__)
  149053. "muls r7, r6\n\t"
  149054. #else
  149055. "mul r7, r6\n\t"
  149056. #endif
  149057. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149058. "adds r4, r4, r7\n\t"
  149059. #else
  149060. "add r4, r4, r7\n\t"
  149061. #endif
  149062. #ifdef WOLFSSL_KEIL
  149063. "adcs r5, r5, %[r]\n\t"
  149064. #elif defined(__clang__)
  149065. "adcs r5, %[r]\n\t"
  149066. #else
  149067. "adc r5, %[r]\n\t"
  149068. #endif
  149069. #ifdef WOLFSSL_KEIL
  149070. "adcs r3, r3, %[r]\n\t"
  149071. #elif defined(__clang__)
  149072. "adcs r3, %[r]\n\t"
  149073. #else
  149074. "adc r3, %[r]\n\t"
  149075. #endif
  149076. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149077. "lsrs r7, %[b], #16\n\t"
  149078. #else
  149079. "lsr r7, %[b], #16\n\t"
  149080. #endif
  149081. #ifdef WOLFSSL_KEIL
  149082. "muls r6, r7, r6\n\t"
  149083. #elif defined(__clang__)
  149084. "muls r6, r7\n\t"
  149085. #else
  149086. "mul r6, r7\n\t"
  149087. #endif
  149088. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149089. "lsrs r7, r6, #16\n\t"
  149090. #else
  149091. "lsr r7, r6, #16\n\t"
  149092. #endif
  149093. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149094. "lsls r6, r6, #16\n\t"
  149095. #else
  149096. "lsl r6, r6, #16\n\t"
  149097. #endif
  149098. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149099. "adds r4, r4, r6\n\t"
  149100. #else
  149101. "add r4, r4, r6\n\t"
  149102. #endif
  149103. #ifdef WOLFSSL_KEIL
  149104. "adcs r5, r5, r7\n\t"
  149105. #elif defined(__clang__)
  149106. "adcs r5, r7\n\t"
  149107. #else
  149108. "adc r5, r7\n\t"
  149109. #endif
  149110. #ifdef WOLFSSL_KEIL
  149111. "adcs r3, r3, %[r]\n\t"
  149112. #elif defined(__clang__)
  149113. "adcs r3, %[r]\n\t"
  149114. #else
  149115. "adc r3, %[r]\n\t"
  149116. #endif
  149117. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149118. "lsrs r6, %[a], #16\n\t"
  149119. #else
  149120. "lsr r6, %[a], #16\n\t"
  149121. #endif
  149122. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149123. "lsrs r7, %[b], #16\n\t"
  149124. #else
  149125. "lsr r7, %[b], #16\n\t"
  149126. #endif
  149127. #ifdef WOLFSSL_KEIL
  149128. "muls r7, r6, r7\n\t"
  149129. #elif defined(__clang__)
  149130. "muls r7, r6\n\t"
  149131. #else
  149132. "mul r7, r6\n\t"
  149133. #endif
  149134. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149135. "adds r5, r5, r7\n\t"
  149136. #else
  149137. "add r5, r5, r7\n\t"
  149138. #endif
  149139. #ifdef WOLFSSL_KEIL
  149140. "adcs r3, r3, %[r]\n\t"
  149141. #elif defined(__clang__)
  149142. "adcs r3, %[r]\n\t"
  149143. #else
  149144. "adc r3, %[r]\n\t"
  149145. #endif
  149146. "uxth r7, %[b]\n\t"
  149147. #ifdef WOLFSSL_KEIL
  149148. "muls r6, r7, r6\n\t"
  149149. #elif defined(__clang__)
  149150. "muls r6, r7\n\t"
  149151. #else
  149152. "mul r6, r7\n\t"
  149153. #endif
  149154. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149155. "lsrs r7, r6, #16\n\t"
  149156. #else
  149157. "lsr r7, r6, #16\n\t"
  149158. #endif
  149159. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149160. "lsls r6, r6, #16\n\t"
  149161. #else
  149162. "lsl r6, r6, #16\n\t"
  149163. #endif
  149164. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149165. "adds r4, r4, r6\n\t"
  149166. #else
  149167. "add r4, r4, r6\n\t"
  149168. #endif
  149169. #ifdef WOLFSSL_KEIL
  149170. "adcs r5, r5, r7\n\t"
  149171. #elif defined(__clang__)
  149172. "adcs r5, r7\n\t"
  149173. #else
  149174. "adc r5, r7\n\t"
  149175. #endif
  149176. #ifdef WOLFSSL_KEIL
  149177. "adcs r3, r3, %[r]\n\t"
  149178. #elif defined(__clang__)
  149179. "adcs r3, %[r]\n\t"
  149180. #else
  149181. "adc r3, %[r]\n\t"
  149182. #endif
  149183. "str r4, [sp, #52]\n\t"
  149184. "# A[14] * B[0]\n\t"
  149185. "movs r4, #0\n\t"
  149186. "mov %[a], r9\n\t"
  149187. "mov %[b], r10\n\t"
  149188. "ldr %[a], [%[a], #56]\n\t"
  149189. "ldr %[b], [%[b]]\n\t"
  149190. "uxth r6, %[a]\n\t"
  149191. "uxth r7, %[b]\n\t"
  149192. #ifdef WOLFSSL_KEIL
  149193. "muls r7, r6, r7\n\t"
  149194. #elif defined(__clang__)
  149195. "muls r7, r6\n\t"
  149196. #else
  149197. "mul r7, r6\n\t"
  149198. #endif
  149199. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149200. "adds r5, r5, r7\n\t"
  149201. #else
  149202. "add r5, r5, r7\n\t"
  149203. #endif
  149204. #ifdef WOLFSSL_KEIL
  149205. "adcs r3, r3, %[r]\n\t"
  149206. #elif defined(__clang__)
  149207. "adcs r3, %[r]\n\t"
  149208. #else
  149209. "adc r3, %[r]\n\t"
  149210. #endif
  149211. #ifdef WOLFSSL_KEIL
  149212. "adcs r4, r4, %[r]\n\t"
  149213. #elif defined(__clang__)
  149214. "adcs r4, %[r]\n\t"
  149215. #else
  149216. "adc r4, %[r]\n\t"
  149217. #endif
  149218. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149219. "lsrs r7, %[b], #16\n\t"
  149220. #else
  149221. "lsr r7, %[b], #16\n\t"
  149222. #endif
  149223. #ifdef WOLFSSL_KEIL
  149224. "muls r6, r7, r6\n\t"
  149225. #elif defined(__clang__)
  149226. "muls r6, r7\n\t"
  149227. #else
  149228. "mul r6, r7\n\t"
  149229. #endif
  149230. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149231. "lsrs r7, r6, #16\n\t"
  149232. #else
  149233. "lsr r7, r6, #16\n\t"
  149234. #endif
  149235. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149236. "lsls r6, r6, #16\n\t"
  149237. #else
  149238. "lsl r6, r6, #16\n\t"
  149239. #endif
  149240. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149241. "adds r5, r5, r6\n\t"
  149242. #else
  149243. "add r5, r5, r6\n\t"
  149244. #endif
  149245. #ifdef WOLFSSL_KEIL
  149246. "adcs r3, r3, r7\n\t"
  149247. #elif defined(__clang__)
  149248. "adcs r3, r7\n\t"
  149249. #else
  149250. "adc r3, r7\n\t"
  149251. #endif
  149252. #ifdef WOLFSSL_KEIL
  149253. "adcs r4, r4, %[r]\n\t"
  149254. #elif defined(__clang__)
  149255. "adcs r4, %[r]\n\t"
  149256. #else
  149257. "adc r4, %[r]\n\t"
  149258. #endif
  149259. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149260. "lsrs r6, %[a], #16\n\t"
  149261. #else
  149262. "lsr r6, %[a], #16\n\t"
  149263. #endif
  149264. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149265. "lsrs r7, %[b], #16\n\t"
  149266. #else
  149267. "lsr r7, %[b], #16\n\t"
  149268. #endif
  149269. #ifdef WOLFSSL_KEIL
  149270. "muls r7, r6, r7\n\t"
  149271. #elif defined(__clang__)
  149272. "muls r7, r6\n\t"
  149273. #else
  149274. "mul r7, r6\n\t"
  149275. #endif
  149276. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149277. "adds r3, r3, r7\n\t"
  149278. #else
  149279. "add r3, r3, r7\n\t"
  149280. #endif
  149281. #ifdef WOLFSSL_KEIL
  149282. "adcs r4, r4, %[r]\n\t"
  149283. #elif defined(__clang__)
  149284. "adcs r4, %[r]\n\t"
  149285. #else
  149286. "adc r4, %[r]\n\t"
  149287. #endif
  149288. "uxth r7, %[b]\n\t"
  149289. #ifdef WOLFSSL_KEIL
  149290. "muls r6, r7, r6\n\t"
  149291. #elif defined(__clang__)
  149292. "muls r6, r7\n\t"
  149293. #else
  149294. "mul r6, r7\n\t"
  149295. #endif
  149296. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149297. "lsrs r7, r6, #16\n\t"
  149298. #else
  149299. "lsr r7, r6, #16\n\t"
  149300. #endif
  149301. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149302. "lsls r6, r6, #16\n\t"
  149303. #else
  149304. "lsl r6, r6, #16\n\t"
  149305. #endif
  149306. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149307. "adds r5, r5, r6\n\t"
  149308. #else
  149309. "add r5, r5, r6\n\t"
  149310. #endif
  149311. #ifdef WOLFSSL_KEIL
  149312. "adcs r3, r3, r7\n\t"
  149313. #elif defined(__clang__)
  149314. "adcs r3, r7\n\t"
  149315. #else
  149316. "adc r3, r7\n\t"
  149317. #endif
  149318. #ifdef WOLFSSL_KEIL
  149319. "adcs r4, r4, %[r]\n\t"
  149320. #elif defined(__clang__)
  149321. "adcs r4, %[r]\n\t"
  149322. #else
  149323. "adc r4, %[r]\n\t"
  149324. #endif
  149325. "# A[13] * B[1]\n\t"
  149326. "mov %[a], r9\n\t"
  149327. "mov %[b], r10\n\t"
  149328. "ldr %[a], [%[a], #52]\n\t"
  149329. "ldr %[b], [%[b], #4]\n\t"
  149330. "uxth r6, %[a]\n\t"
  149331. "uxth r7, %[b]\n\t"
  149332. #ifdef WOLFSSL_KEIL
  149333. "muls r7, r6, r7\n\t"
  149334. #elif defined(__clang__)
  149335. "muls r7, r6\n\t"
  149336. #else
  149337. "mul r7, r6\n\t"
  149338. #endif
  149339. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149340. "adds r5, r5, r7\n\t"
  149341. #else
  149342. "add r5, r5, r7\n\t"
  149343. #endif
  149344. #ifdef WOLFSSL_KEIL
  149345. "adcs r3, r3, %[r]\n\t"
  149346. #elif defined(__clang__)
  149347. "adcs r3, %[r]\n\t"
  149348. #else
  149349. "adc r3, %[r]\n\t"
  149350. #endif
  149351. #ifdef WOLFSSL_KEIL
  149352. "adcs r4, r4, %[r]\n\t"
  149353. #elif defined(__clang__)
  149354. "adcs r4, %[r]\n\t"
  149355. #else
  149356. "adc r4, %[r]\n\t"
  149357. #endif
  149358. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149359. "lsrs r7, %[b], #16\n\t"
  149360. #else
  149361. "lsr r7, %[b], #16\n\t"
  149362. #endif
  149363. #ifdef WOLFSSL_KEIL
  149364. "muls r6, r7, r6\n\t"
  149365. #elif defined(__clang__)
  149366. "muls r6, r7\n\t"
  149367. #else
  149368. "mul r6, r7\n\t"
  149369. #endif
  149370. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149371. "lsrs r7, r6, #16\n\t"
  149372. #else
  149373. "lsr r7, r6, #16\n\t"
  149374. #endif
  149375. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149376. "lsls r6, r6, #16\n\t"
  149377. #else
  149378. "lsl r6, r6, #16\n\t"
  149379. #endif
  149380. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149381. "adds r5, r5, r6\n\t"
  149382. #else
  149383. "add r5, r5, r6\n\t"
  149384. #endif
  149385. #ifdef WOLFSSL_KEIL
  149386. "adcs r3, r3, r7\n\t"
  149387. #elif defined(__clang__)
  149388. "adcs r3, r7\n\t"
  149389. #else
  149390. "adc r3, r7\n\t"
  149391. #endif
  149392. #ifdef WOLFSSL_KEIL
  149393. "adcs r4, r4, %[r]\n\t"
  149394. #elif defined(__clang__)
  149395. "adcs r4, %[r]\n\t"
  149396. #else
  149397. "adc r4, %[r]\n\t"
  149398. #endif
  149399. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149400. "lsrs r6, %[a], #16\n\t"
  149401. #else
  149402. "lsr r6, %[a], #16\n\t"
  149403. #endif
  149404. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149405. "lsrs r7, %[b], #16\n\t"
  149406. #else
  149407. "lsr r7, %[b], #16\n\t"
  149408. #endif
  149409. #ifdef WOLFSSL_KEIL
  149410. "muls r7, r6, r7\n\t"
  149411. #elif defined(__clang__)
  149412. "muls r7, r6\n\t"
  149413. #else
  149414. "mul r7, r6\n\t"
  149415. #endif
  149416. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149417. "adds r3, r3, r7\n\t"
  149418. #else
  149419. "add r3, r3, r7\n\t"
  149420. #endif
  149421. #ifdef WOLFSSL_KEIL
  149422. "adcs r4, r4, %[r]\n\t"
  149423. #elif defined(__clang__)
  149424. "adcs r4, %[r]\n\t"
  149425. #else
  149426. "adc r4, %[r]\n\t"
  149427. #endif
  149428. "uxth r7, %[b]\n\t"
  149429. #ifdef WOLFSSL_KEIL
  149430. "muls r6, r7, r6\n\t"
  149431. #elif defined(__clang__)
  149432. "muls r6, r7\n\t"
  149433. #else
  149434. "mul r6, r7\n\t"
  149435. #endif
  149436. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149437. "lsrs r7, r6, #16\n\t"
  149438. #else
  149439. "lsr r7, r6, #16\n\t"
  149440. #endif
  149441. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149442. "lsls r6, r6, #16\n\t"
  149443. #else
  149444. "lsl r6, r6, #16\n\t"
  149445. #endif
  149446. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149447. "adds r5, r5, r6\n\t"
  149448. #else
  149449. "add r5, r5, r6\n\t"
  149450. #endif
  149451. #ifdef WOLFSSL_KEIL
  149452. "adcs r3, r3, r7\n\t"
  149453. #elif defined(__clang__)
  149454. "adcs r3, r7\n\t"
  149455. #else
  149456. "adc r3, r7\n\t"
  149457. #endif
  149458. #ifdef WOLFSSL_KEIL
  149459. "adcs r4, r4, %[r]\n\t"
  149460. #elif defined(__clang__)
  149461. "adcs r4, %[r]\n\t"
  149462. #else
  149463. "adc r4, %[r]\n\t"
  149464. #endif
  149465. "# A[12] * B[2]\n\t"
  149466. "mov %[a], r9\n\t"
  149467. "mov %[b], r10\n\t"
  149468. "ldr %[a], [%[a], #48]\n\t"
  149469. "ldr %[b], [%[b], #8]\n\t"
  149470. "uxth r6, %[a]\n\t"
  149471. "uxth r7, %[b]\n\t"
  149472. #ifdef WOLFSSL_KEIL
  149473. "muls r7, r6, r7\n\t"
  149474. #elif defined(__clang__)
  149475. "muls r7, r6\n\t"
  149476. #else
  149477. "mul r7, r6\n\t"
  149478. #endif
  149479. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149480. "adds r5, r5, r7\n\t"
  149481. #else
  149482. "add r5, r5, r7\n\t"
  149483. #endif
  149484. #ifdef WOLFSSL_KEIL
  149485. "adcs r3, r3, %[r]\n\t"
  149486. #elif defined(__clang__)
  149487. "adcs r3, %[r]\n\t"
  149488. #else
  149489. "adc r3, %[r]\n\t"
  149490. #endif
  149491. #ifdef WOLFSSL_KEIL
  149492. "adcs r4, r4, %[r]\n\t"
  149493. #elif defined(__clang__)
  149494. "adcs r4, %[r]\n\t"
  149495. #else
  149496. "adc r4, %[r]\n\t"
  149497. #endif
  149498. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149499. "lsrs r7, %[b], #16\n\t"
  149500. #else
  149501. "lsr r7, %[b], #16\n\t"
  149502. #endif
  149503. #ifdef WOLFSSL_KEIL
  149504. "muls r6, r7, r6\n\t"
  149505. #elif defined(__clang__)
  149506. "muls r6, r7\n\t"
  149507. #else
  149508. "mul r6, r7\n\t"
  149509. #endif
  149510. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149511. "lsrs r7, r6, #16\n\t"
  149512. #else
  149513. "lsr r7, r6, #16\n\t"
  149514. #endif
  149515. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149516. "lsls r6, r6, #16\n\t"
  149517. #else
  149518. "lsl r6, r6, #16\n\t"
  149519. #endif
  149520. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149521. "adds r5, r5, r6\n\t"
  149522. #else
  149523. "add r5, r5, r6\n\t"
  149524. #endif
  149525. #ifdef WOLFSSL_KEIL
  149526. "adcs r3, r3, r7\n\t"
  149527. #elif defined(__clang__)
  149528. "adcs r3, r7\n\t"
  149529. #else
  149530. "adc r3, r7\n\t"
  149531. #endif
  149532. #ifdef WOLFSSL_KEIL
  149533. "adcs r4, r4, %[r]\n\t"
  149534. #elif defined(__clang__)
  149535. "adcs r4, %[r]\n\t"
  149536. #else
  149537. "adc r4, %[r]\n\t"
  149538. #endif
  149539. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149540. "lsrs r6, %[a], #16\n\t"
  149541. #else
  149542. "lsr r6, %[a], #16\n\t"
  149543. #endif
  149544. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149545. "lsrs r7, %[b], #16\n\t"
  149546. #else
  149547. "lsr r7, %[b], #16\n\t"
  149548. #endif
  149549. #ifdef WOLFSSL_KEIL
  149550. "muls r7, r6, r7\n\t"
  149551. #elif defined(__clang__)
  149552. "muls r7, r6\n\t"
  149553. #else
  149554. "mul r7, r6\n\t"
  149555. #endif
  149556. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149557. "adds r3, r3, r7\n\t"
  149558. #else
  149559. "add r3, r3, r7\n\t"
  149560. #endif
  149561. #ifdef WOLFSSL_KEIL
  149562. "adcs r4, r4, %[r]\n\t"
  149563. #elif defined(__clang__)
  149564. "adcs r4, %[r]\n\t"
  149565. #else
  149566. "adc r4, %[r]\n\t"
  149567. #endif
  149568. "uxth r7, %[b]\n\t"
  149569. #ifdef WOLFSSL_KEIL
  149570. "muls r6, r7, r6\n\t"
  149571. #elif defined(__clang__)
  149572. "muls r6, r7\n\t"
  149573. #else
  149574. "mul r6, r7\n\t"
  149575. #endif
  149576. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149577. "lsrs r7, r6, #16\n\t"
  149578. #else
  149579. "lsr r7, r6, #16\n\t"
  149580. #endif
  149581. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149582. "lsls r6, r6, #16\n\t"
  149583. #else
  149584. "lsl r6, r6, #16\n\t"
  149585. #endif
  149586. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149587. "adds r5, r5, r6\n\t"
  149588. #else
  149589. "add r5, r5, r6\n\t"
  149590. #endif
  149591. #ifdef WOLFSSL_KEIL
  149592. "adcs r3, r3, r7\n\t"
  149593. #elif defined(__clang__)
  149594. "adcs r3, r7\n\t"
  149595. #else
  149596. "adc r3, r7\n\t"
  149597. #endif
  149598. #ifdef WOLFSSL_KEIL
  149599. "adcs r4, r4, %[r]\n\t"
  149600. #elif defined(__clang__)
  149601. "adcs r4, %[r]\n\t"
  149602. #else
  149603. "adc r4, %[r]\n\t"
  149604. #endif
  149605. "# A[11] * B[3]\n\t"
  149606. "mov %[a], r9\n\t"
  149607. "mov %[b], r10\n\t"
  149608. "ldr %[a], [%[a], #44]\n\t"
  149609. "ldr %[b], [%[b], #12]\n\t"
  149610. "uxth r6, %[a]\n\t"
  149611. "uxth r7, %[b]\n\t"
  149612. #ifdef WOLFSSL_KEIL
  149613. "muls r7, r6, r7\n\t"
  149614. #elif defined(__clang__)
  149615. "muls r7, r6\n\t"
  149616. #else
  149617. "mul r7, r6\n\t"
  149618. #endif
  149619. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149620. "adds r5, r5, r7\n\t"
  149621. #else
  149622. "add r5, r5, r7\n\t"
  149623. #endif
  149624. #ifdef WOLFSSL_KEIL
  149625. "adcs r3, r3, %[r]\n\t"
  149626. #elif defined(__clang__)
  149627. "adcs r3, %[r]\n\t"
  149628. #else
  149629. "adc r3, %[r]\n\t"
  149630. #endif
  149631. #ifdef WOLFSSL_KEIL
  149632. "adcs r4, r4, %[r]\n\t"
  149633. #elif defined(__clang__)
  149634. "adcs r4, %[r]\n\t"
  149635. #else
  149636. "adc r4, %[r]\n\t"
  149637. #endif
  149638. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149639. "lsrs r7, %[b], #16\n\t"
  149640. #else
  149641. "lsr r7, %[b], #16\n\t"
  149642. #endif
  149643. #ifdef WOLFSSL_KEIL
  149644. "muls r6, r7, r6\n\t"
  149645. #elif defined(__clang__)
  149646. "muls r6, r7\n\t"
  149647. #else
  149648. "mul r6, r7\n\t"
  149649. #endif
  149650. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149651. "lsrs r7, r6, #16\n\t"
  149652. #else
  149653. "lsr r7, r6, #16\n\t"
  149654. #endif
  149655. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149656. "lsls r6, r6, #16\n\t"
  149657. #else
  149658. "lsl r6, r6, #16\n\t"
  149659. #endif
  149660. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149661. "adds r5, r5, r6\n\t"
  149662. #else
  149663. "add r5, r5, r6\n\t"
  149664. #endif
  149665. #ifdef WOLFSSL_KEIL
  149666. "adcs r3, r3, r7\n\t"
  149667. #elif defined(__clang__)
  149668. "adcs r3, r7\n\t"
  149669. #else
  149670. "adc r3, r7\n\t"
  149671. #endif
  149672. #ifdef WOLFSSL_KEIL
  149673. "adcs r4, r4, %[r]\n\t"
  149674. #elif defined(__clang__)
  149675. "adcs r4, %[r]\n\t"
  149676. #else
  149677. "adc r4, %[r]\n\t"
  149678. #endif
  149679. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149680. "lsrs r6, %[a], #16\n\t"
  149681. #else
  149682. "lsr r6, %[a], #16\n\t"
  149683. #endif
  149684. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149685. "lsrs r7, %[b], #16\n\t"
  149686. #else
  149687. "lsr r7, %[b], #16\n\t"
  149688. #endif
  149689. #ifdef WOLFSSL_KEIL
  149690. "muls r7, r6, r7\n\t"
  149691. #elif defined(__clang__)
  149692. "muls r7, r6\n\t"
  149693. #else
  149694. "mul r7, r6\n\t"
  149695. #endif
  149696. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149697. "adds r3, r3, r7\n\t"
  149698. #else
  149699. "add r3, r3, r7\n\t"
  149700. #endif
  149701. #ifdef WOLFSSL_KEIL
  149702. "adcs r4, r4, %[r]\n\t"
  149703. #elif defined(__clang__)
  149704. "adcs r4, %[r]\n\t"
  149705. #else
  149706. "adc r4, %[r]\n\t"
  149707. #endif
  149708. "uxth r7, %[b]\n\t"
  149709. #ifdef WOLFSSL_KEIL
  149710. "muls r6, r7, r6\n\t"
  149711. #elif defined(__clang__)
  149712. "muls r6, r7\n\t"
  149713. #else
  149714. "mul r6, r7\n\t"
  149715. #endif
  149716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149717. "lsrs r7, r6, #16\n\t"
  149718. #else
  149719. "lsr r7, r6, #16\n\t"
  149720. #endif
  149721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149722. "lsls r6, r6, #16\n\t"
  149723. #else
  149724. "lsl r6, r6, #16\n\t"
  149725. #endif
  149726. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149727. "adds r5, r5, r6\n\t"
  149728. #else
  149729. "add r5, r5, r6\n\t"
  149730. #endif
  149731. #ifdef WOLFSSL_KEIL
  149732. "adcs r3, r3, r7\n\t"
  149733. #elif defined(__clang__)
  149734. "adcs r3, r7\n\t"
  149735. #else
  149736. "adc r3, r7\n\t"
  149737. #endif
  149738. #ifdef WOLFSSL_KEIL
  149739. "adcs r4, r4, %[r]\n\t"
  149740. #elif defined(__clang__)
  149741. "adcs r4, %[r]\n\t"
  149742. #else
  149743. "adc r4, %[r]\n\t"
  149744. #endif
  149745. "# A[10] * B[4]\n\t"
  149746. "mov %[a], r9\n\t"
  149747. "mov %[b], r10\n\t"
  149748. "ldr %[a], [%[a], #40]\n\t"
  149749. "ldr %[b], [%[b], #16]\n\t"
  149750. "uxth r6, %[a]\n\t"
  149751. "uxth r7, %[b]\n\t"
  149752. #ifdef WOLFSSL_KEIL
  149753. "muls r7, r6, r7\n\t"
  149754. #elif defined(__clang__)
  149755. "muls r7, r6\n\t"
  149756. #else
  149757. "mul r7, r6\n\t"
  149758. #endif
  149759. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149760. "adds r5, r5, r7\n\t"
  149761. #else
  149762. "add r5, r5, r7\n\t"
  149763. #endif
  149764. #ifdef WOLFSSL_KEIL
  149765. "adcs r3, r3, %[r]\n\t"
  149766. #elif defined(__clang__)
  149767. "adcs r3, %[r]\n\t"
  149768. #else
  149769. "adc r3, %[r]\n\t"
  149770. #endif
  149771. #ifdef WOLFSSL_KEIL
  149772. "adcs r4, r4, %[r]\n\t"
  149773. #elif defined(__clang__)
  149774. "adcs r4, %[r]\n\t"
  149775. #else
  149776. "adc r4, %[r]\n\t"
  149777. #endif
  149778. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149779. "lsrs r7, %[b], #16\n\t"
  149780. #else
  149781. "lsr r7, %[b], #16\n\t"
  149782. #endif
  149783. #ifdef WOLFSSL_KEIL
  149784. "muls r6, r7, r6\n\t"
  149785. #elif defined(__clang__)
  149786. "muls r6, r7\n\t"
  149787. #else
  149788. "mul r6, r7\n\t"
  149789. #endif
  149790. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149791. "lsrs r7, r6, #16\n\t"
  149792. #else
  149793. "lsr r7, r6, #16\n\t"
  149794. #endif
  149795. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149796. "lsls r6, r6, #16\n\t"
  149797. #else
  149798. "lsl r6, r6, #16\n\t"
  149799. #endif
  149800. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149801. "adds r5, r5, r6\n\t"
  149802. #else
  149803. "add r5, r5, r6\n\t"
  149804. #endif
  149805. #ifdef WOLFSSL_KEIL
  149806. "adcs r3, r3, r7\n\t"
  149807. #elif defined(__clang__)
  149808. "adcs r3, r7\n\t"
  149809. #else
  149810. "adc r3, r7\n\t"
  149811. #endif
  149812. #ifdef WOLFSSL_KEIL
  149813. "adcs r4, r4, %[r]\n\t"
  149814. #elif defined(__clang__)
  149815. "adcs r4, %[r]\n\t"
  149816. #else
  149817. "adc r4, %[r]\n\t"
  149818. #endif
  149819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149820. "lsrs r6, %[a], #16\n\t"
  149821. #else
  149822. "lsr r6, %[a], #16\n\t"
  149823. #endif
  149824. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149825. "lsrs r7, %[b], #16\n\t"
  149826. #else
  149827. "lsr r7, %[b], #16\n\t"
  149828. #endif
  149829. #ifdef WOLFSSL_KEIL
  149830. "muls r7, r6, r7\n\t"
  149831. #elif defined(__clang__)
  149832. "muls r7, r6\n\t"
  149833. #else
  149834. "mul r7, r6\n\t"
  149835. #endif
  149836. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149837. "adds r3, r3, r7\n\t"
  149838. #else
  149839. "add r3, r3, r7\n\t"
  149840. #endif
  149841. #ifdef WOLFSSL_KEIL
  149842. "adcs r4, r4, %[r]\n\t"
  149843. #elif defined(__clang__)
  149844. "adcs r4, %[r]\n\t"
  149845. #else
  149846. "adc r4, %[r]\n\t"
  149847. #endif
  149848. "uxth r7, %[b]\n\t"
  149849. #ifdef WOLFSSL_KEIL
  149850. "muls r6, r7, r6\n\t"
  149851. #elif defined(__clang__)
  149852. "muls r6, r7\n\t"
  149853. #else
  149854. "mul r6, r7\n\t"
  149855. #endif
  149856. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149857. "lsrs r7, r6, #16\n\t"
  149858. #else
  149859. "lsr r7, r6, #16\n\t"
  149860. #endif
  149861. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149862. "lsls r6, r6, #16\n\t"
  149863. #else
  149864. "lsl r6, r6, #16\n\t"
  149865. #endif
  149866. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149867. "adds r5, r5, r6\n\t"
  149868. #else
  149869. "add r5, r5, r6\n\t"
  149870. #endif
  149871. #ifdef WOLFSSL_KEIL
  149872. "adcs r3, r3, r7\n\t"
  149873. #elif defined(__clang__)
  149874. "adcs r3, r7\n\t"
  149875. #else
  149876. "adc r3, r7\n\t"
  149877. #endif
  149878. #ifdef WOLFSSL_KEIL
  149879. "adcs r4, r4, %[r]\n\t"
  149880. #elif defined(__clang__)
  149881. "adcs r4, %[r]\n\t"
  149882. #else
  149883. "adc r4, %[r]\n\t"
  149884. #endif
  149885. "# A[9] * B[5]\n\t"
  149886. "mov %[a], r9\n\t"
  149887. "mov %[b], r10\n\t"
  149888. "ldr %[a], [%[a], #36]\n\t"
  149889. "ldr %[b], [%[b], #20]\n\t"
  149890. "uxth r6, %[a]\n\t"
  149891. "uxth r7, %[b]\n\t"
  149892. #ifdef WOLFSSL_KEIL
  149893. "muls r7, r6, r7\n\t"
  149894. #elif defined(__clang__)
  149895. "muls r7, r6\n\t"
  149896. #else
  149897. "mul r7, r6\n\t"
  149898. #endif
  149899. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149900. "adds r5, r5, r7\n\t"
  149901. #else
  149902. "add r5, r5, r7\n\t"
  149903. #endif
  149904. #ifdef WOLFSSL_KEIL
  149905. "adcs r3, r3, %[r]\n\t"
  149906. #elif defined(__clang__)
  149907. "adcs r3, %[r]\n\t"
  149908. #else
  149909. "adc r3, %[r]\n\t"
  149910. #endif
  149911. #ifdef WOLFSSL_KEIL
  149912. "adcs r4, r4, %[r]\n\t"
  149913. #elif defined(__clang__)
  149914. "adcs r4, %[r]\n\t"
  149915. #else
  149916. "adc r4, %[r]\n\t"
  149917. #endif
  149918. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149919. "lsrs r7, %[b], #16\n\t"
  149920. #else
  149921. "lsr r7, %[b], #16\n\t"
  149922. #endif
  149923. #ifdef WOLFSSL_KEIL
  149924. "muls r6, r7, r6\n\t"
  149925. #elif defined(__clang__)
  149926. "muls r6, r7\n\t"
  149927. #else
  149928. "mul r6, r7\n\t"
  149929. #endif
  149930. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149931. "lsrs r7, r6, #16\n\t"
  149932. #else
  149933. "lsr r7, r6, #16\n\t"
  149934. #endif
  149935. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149936. "lsls r6, r6, #16\n\t"
  149937. #else
  149938. "lsl r6, r6, #16\n\t"
  149939. #endif
  149940. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149941. "adds r5, r5, r6\n\t"
  149942. #else
  149943. "add r5, r5, r6\n\t"
  149944. #endif
  149945. #ifdef WOLFSSL_KEIL
  149946. "adcs r3, r3, r7\n\t"
  149947. #elif defined(__clang__)
  149948. "adcs r3, r7\n\t"
  149949. #else
  149950. "adc r3, r7\n\t"
  149951. #endif
  149952. #ifdef WOLFSSL_KEIL
  149953. "adcs r4, r4, %[r]\n\t"
  149954. #elif defined(__clang__)
  149955. "adcs r4, %[r]\n\t"
  149956. #else
  149957. "adc r4, %[r]\n\t"
  149958. #endif
  149959. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149960. "lsrs r6, %[a], #16\n\t"
  149961. #else
  149962. "lsr r6, %[a], #16\n\t"
  149963. #endif
  149964. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149965. "lsrs r7, %[b], #16\n\t"
  149966. #else
  149967. "lsr r7, %[b], #16\n\t"
  149968. #endif
  149969. #ifdef WOLFSSL_KEIL
  149970. "muls r7, r6, r7\n\t"
  149971. #elif defined(__clang__)
  149972. "muls r7, r6\n\t"
  149973. #else
  149974. "mul r7, r6\n\t"
  149975. #endif
  149976. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149977. "adds r3, r3, r7\n\t"
  149978. #else
  149979. "add r3, r3, r7\n\t"
  149980. #endif
  149981. #ifdef WOLFSSL_KEIL
  149982. "adcs r4, r4, %[r]\n\t"
  149983. #elif defined(__clang__)
  149984. "adcs r4, %[r]\n\t"
  149985. #else
  149986. "adc r4, %[r]\n\t"
  149987. #endif
  149988. "uxth r7, %[b]\n\t"
  149989. #ifdef WOLFSSL_KEIL
  149990. "muls r6, r7, r6\n\t"
  149991. #elif defined(__clang__)
  149992. "muls r6, r7\n\t"
  149993. #else
  149994. "mul r6, r7\n\t"
  149995. #endif
  149996. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149997. "lsrs r7, r6, #16\n\t"
  149998. #else
  149999. "lsr r7, r6, #16\n\t"
  150000. #endif
  150001. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150002. "lsls r6, r6, #16\n\t"
  150003. #else
  150004. "lsl r6, r6, #16\n\t"
  150005. #endif
  150006. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150007. "adds r5, r5, r6\n\t"
  150008. #else
  150009. "add r5, r5, r6\n\t"
  150010. #endif
  150011. #ifdef WOLFSSL_KEIL
  150012. "adcs r3, r3, r7\n\t"
  150013. #elif defined(__clang__)
  150014. "adcs r3, r7\n\t"
  150015. #else
  150016. "adc r3, r7\n\t"
  150017. #endif
  150018. #ifdef WOLFSSL_KEIL
  150019. "adcs r4, r4, %[r]\n\t"
  150020. #elif defined(__clang__)
  150021. "adcs r4, %[r]\n\t"
  150022. #else
  150023. "adc r4, %[r]\n\t"
  150024. #endif
  150025. "# A[8] * B[6]\n\t"
  150026. "mov %[a], r9\n\t"
  150027. "mov %[b], r10\n\t"
  150028. "ldr %[a], [%[a], #32]\n\t"
  150029. "ldr %[b], [%[b], #24]\n\t"
  150030. "uxth r6, %[a]\n\t"
  150031. "uxth r7, %[b]\n\t"
  150032. #ifdef WOLFSSL_KEIL
  150033. "muls r7, r6, r7\n\t"
  150034. #elif defined(__clang__)
  150035. "muls r7, r6\n\t"
  150036. #else
  150037. "mul r7, r6\n\t"
  150038. #endif
  150039. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150040. "adds r5, r5, r7\n\t"
  150041. #else
  150042. "add r5, r5, r7\n\t"
  150043. #endif
  150044. #ifdef WOLFSSL_KEIL
  150045. "adcs r3, r3, %[r]\n\t"
  150046. #elif defined(__clang__)
  150047. "adcs r3, %[r]\n\t"
  150048. #else
  150049. "adc r3, %[r]\n\t"
  150050. #endif
  150051. #ifdef WOLFSSL_KEIL
  150052. "adcs r4, r4, %[r]\n\t"
  150053. #elif defined(__clang__)
  150054. "adcs r4, %[r]\n\t"
  150055. #else
  150056. "adc r4, %[r]\n\t"
  150057. #endif
  150058. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150059. "lsrs r7, %[b], #16\n\t"
  150060. #else
  150061. "lsr r7, %[b], #16\n\t"
  150062. #endif
  150063. #ifdef WOLFSSL_KEIL
  150064. "muls r6, r7, r6\n\t"
  150065. #elif defined(__clang__)
  150066. "muls r6, r7\n\t"
  150067. #else
  150068. "mul r6, r7\n\t"
  150069. #endif
  150070. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150071. "lsrs r7, r6, #16\n\t"
  150072. #else
  150073. "lsr r7, r6, #16\n\t"
  150074. #endif
  150075. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150076. "lsls r6, r6, #16\n\t"
  150077. #else
  150078. "lsl r6, r6, #16\n\t"
  150079. #endif
  150080. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150081. "adds r5, r5, r6\n\t"
  150082. #else
  150083. "add r5, r5, r6\n\t"
  150084. #endif
  150085. #ifdef WOLFSSL_KEIL
  150086. "adcs r3, r3, r7\n\t"
  150087. #elif defined(__clang__)
  150088. "adcs r3, r7\n\t"
  150089. #else
  150090. "adc r3, r7\n\t"
  150091. #endif
  150092. #ifdef WOLFSSL_KEIL
  150093. "adcs r4, r4, %[r]\n\t"
  150094. #elif defined(__clang__)
  150095. "adcs r4, %[r]\n\t"
  150096. #else
  150097. "adc r4, %[r]\n\t"
  150098. #endif
  150099. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150100. "lsrs r6, %[a], #16\n\t"
  150101. #else
  150102. "lsr r6, %[a], #16\n\t"
  150103. #endif
  150104. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150105. "lsrs r7, %[b], #16\n\t"
  150106. #else
  150107. "lsr r7, %[b], #16\n\t"
  150108. #endif
  150109. #ifdef WOLFSSL_KEIL
  150110. "muls r7, r6, r7\n\t"
  150111. #elif defined(__clang__)
  150112. "muls r7, r6\n\t"
  150113. #else
  150114. "mul r7, r6\n\t"
  150115. #endif
  150116. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150117. "adds r3, r3, r7\n\t"
  150118. #else
  150119. "add r3, r3, r7\n\t"
  150120. #endif
  150121. #ifdef WOLFSSL_KEIL
  150122. "adcs r4, r4, %[r]\n\t"
  150123. #elif defined(__clang__)
  150124. "adcs r4, %[r]\n\t"
  150125. #else
  150126. "adc r4, %[r]\n\t"
  150127. #endif
  150128. "uxth r7, %[b]\n\t"
  150129. #ifdef WOLFSSL_KEIL
  150130. "muls r6, r7, r6\n\t"
  150131. #elif defined(__clang__)
  150132. "muls r6, r7\n\t"
  150133. #else
  150134. "mul r6, r7\n\t"
  150135. #endif
  150136. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150137. "lsrs r7, r6, #16\n\t"
  150138. #else
  150139. "lsr r7, r6, #16\n\t"
  150140. #endif
  150141. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150142. "lsls r6, r6, #16\n\t"
  150143. #else
  150144. "lsl r6, r6, #16\n\t"
  150145. #endif
  150146. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150147. "adds r5, r5, r6\n\t"
  150148. #else
  150149. "add r5, r5, r6\n\t"
  150150. #endif
  150151. #ifdef WOLFSSL_KEIL
  150152. "adcs r3, r3, r7\n\t"
  150153. #elif defined(__clang__)
  150154. "adcs r3, r7\n\t"
  150155. #else
  150156. "adc r3, r7\n\t"
  150157. #endif
  150158. #ifdef WOLFSSL_KEIL
  150159. "adcs r4, r4, %[r]\n\t"
  150160. #elif defined(__clang__)
  150161. "adcs r4, %[r]\n\t"
  150162. #else
  150163. "adc r4, %[r]\n\t"
  150164. #endif
  150165. "# A[7] * B[7]\n\t"
  150166. "mov %[a], r9\n\t"
  150167. "mov %[b], r10\n\t"
  150168. "ldr %[a], [%[a], #28]\n\t"
  150169. "ldr %[b], [%[b], #28]\n\t"
  150170. "uxth r6, %[a]\n\t"
  150171. "uxth r7, %[b]\n\t"
  150172. #ifdef WOLFSSL_KEIL
  150173. "muls r7, r6, r7\n\t"
  150174. #elif defined(__clang__)
  150175. "muls r7, r6\n\t"
  150176. #else
  150177. "mul r7, r6\n\t"
  150178. #endif
  150179. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150180. "adds r5, r5, r7\n\t"
  150181. #else
  150182. "add r5, r5, r7\n\t"
  150183. #endif
  150184. #ifdef WOLFSSL_KEIL
  150185. "adcs r3, r3, %[r]\n\t"
  150186. #elif defined(__clang__)
  150187. "adcs r3, %[r]\n\t"
  150188. #else
  150189. "adc r3, %[r]\n\t"
  150190. #endif
  150191. #ifdef WOLFSSL_KEIL
  150192. "adcs r4, r4, %[r]\n\t"
  150193. #elif defined(__clang__)
  150194. "adcs r4, %[r]\n\t"
  150195. #else
  150196. "adc r4, %[r]\n\t"
  150197. #endif
  150198. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150199. "lsrs r7, %[b], #16\n\t"
  150200. #else
  150201. "lsr r7, %[b], #16\n\t"
  150202. #endif
  150203. #ifdef WOLFSSL_KEIL
  150204. "muls r6, r7, r6\n\t"
  150205. #elif defined(__clang__)
  150206. "muls r6, r7\n\t"
  150207. #else
  150208. "mul r6, r7\n\t"
  150209. #endif
  150210. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150211. "lsrs r7, r6, #16\n\t"
  150212. #else
  150213. "lsr r7, r6, #16\n\t"
  150214. #endif
  150215. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150216. "lsls r6, r6, #16\n\t"
  150217. #else
  150218. "lsl r6, r6, #16\n\t"
  150219. #endif
  150220. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150221. "adds r5, r5, r6\n\t"
  150222. #else
  150223. "add r5, r5, r6\n\t"
  150224. #endif
  150225. #ifdef WOLFSSL_KEIL
  150226. "adcs r3, r3, r7\n\t"
  150227. #elif defined(__clang__)
  150228. "adcs r3, r7\n\t"
  150229. #else
  150230. "adc r3, r7\n\t"
  150231. #endif
  150232. #ifdef WOLFSSL_KEIL
  150233. "adcs r4, r4, %[r]\n\t"
  150234. #elif defined(__clang__)
  150235. "adcs r4, %[r]\n\t"
  150236. #else
  150237. "adc r4, %[r]\n\t"
  150238. #endif
  150239. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150240. "lsrs r6, %[a], #16\n\t"
  150241. #else
  150242. "lsr r6, %[a], #16\n\t"
  150243. #endif
  150244. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150245. "lsrs r7, %[b], #16\n\t"
  150246. #else
  150247. "lsr r7, %[b], #16\n\t"
  150248. #endif
  150249. #ifdef WOLFSSL_KEIL
  150250. "muls r7, r6, r7\n\t"
  150251. #elif defined(__clang__)
  150252. "muls r7, r6\n\t"
  150253. #else
  150254. "mul r7, r6\n\t"
  150255. #endif
  150256. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150257. "adds r3, r3, r7\n\t"
  150258. #else
  150259. "add r3, r3, r7\n\t"
  150260. #endif
  150261. #ifdef WOLFSSL_KEIL
  150262. "adcs r4, r4, %[r]\n\t"
  150263. #elif defined(__clang__)
  150264. "adcs r4, %[r]\n\t"
  150265. #else
  150266. "adc r4, %[r]\n\t"
  150267. #endif
  150268. "uxth r7, %[b]\n\t"
  150269. #ifdef WOLFSSL_KEIL
  150270. "muls r6, r7, r6\n\t"
  150271. #elif defined(__clang__)
  150272. "muls r6, r7\n\t"
  150273. #else
  150274. "mul r6, r7\n\t"
  150275. #endif
  150276. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150277. "lsrs r7, r6, #16\n\t"
  150278. #else
  150279. "lsr r7, r6, #16\n\t"
  150280. #endif
  150281. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150282. "lsls r6, r6, #16\n\t"
  150283. #else
  150284. "lsl r6, r6, #16\n\t"
  150285. #endif
  150286. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150287. "adds r5, r5, r6\n\t"
  150288. #else
  150289. "add r5, r5, r6\n\t"
  150290. #endif
  150291. #ifdef WOLFSSL_KEIL
  150292. "adcs r3, r3, r7\n\t"
  150293. #elif defined(__clang__)
  150294. "adcs r3, r7\n\t"
  150295. #else
  150296. "adc r3, r7\n\t"
  150297. #endif
  150298. #ifdef WOLFSSL_KEIL
  150299. "adcs r4, r4, %[r]\n\t"
  150300. #elif defined(__clang__)
  150301. "adcs r4, %[r]\n\t"
  150302. #else
  150303. "adc r4, %[r]\n\t"
  150304. #endif
  150305. "# A[6] * B[8]\n\t"
  150306. "mov %[a], r9\n\t"
  150307. "mov %[b], r10\n\t"
  150308. "ldr %[a], [%[a], #24]\n\t"
  150309. "ldr %[b], [%[b], #32]\n\t"
  150310. "uxth r6, %[a]\n\t"
  150311. "uxth r7, %[b]\n\t"
  150312. #ifdef WOLFSSL_KEIL
  150313. "muls r7, r6, r7\n\t"
  150314. #elif defined(__clang__)
  150315. "muls r7, r6\n\t"
  150316. #else
  150317. "mul r7, r6\n\t"
  150318. #endif
  150319. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150320. "adds r5, r5, r7\n\t"
  150321. #else
  150322. "add r5, r5, r7\n\t"
  150323. #endif
  150324. #ifdef WOLFSSL_KEIL
  150325. "adcs r3, r3, %[r]\n\t"
  150326. #elif defined(__clang__)
  150327. "adcs r3, %[r]\n\t"
  150328. #else
  150329. "adc r3, %[r]\n\t"
  150330. #endif
  150331. #ifdef WOLFSSL_KEIL
  150332. "adcs r4, r4, %[r]\n\t"
  150333. #elif defined(__clang__)
  150334. "adcs r4, %[r]\n\t"
  150335. #else
  150336. "adc r4, %[r]\n\t"
  150337. #endif
  150338. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150339. "lsrs r7, %[b], #16\n\t"
  150340. #else
  150341. "lsr r7, %[b], #16\n\t"
  150342. #endif
  150343. #ifdef WOLFSSL_KEIL
  150344. "muls r6, r7, r6\n\t"
  150345. #elif defined(__clang__)
  150346. "muls r6, r7\n\t"
  150347. #else
  150348. "mul r6, r7\n\t"
  150349. #endif
  150350. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150351. "lsrs r7, r6, #16\n\t"
  150352. #else
  150353. "lsr r7, r6, #16\n\t"
  150354. #endif
  150355. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150356. "lsls r6, r6, #16\n\t"
  150357. #else
  150358. "lsl r6, r6, #16\n\t"
  150359. #endif
  150360. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150361. "adds r5, r5, r6\n\t"
  150362. #else
  150363. "add r5, r5, r6\n\t"
  150364. #endif
  150365. #ifdef WOLFSSL_KEIL
  150366. "adcs r3, r3, r7\n\t"
  150367. #elif defined(__clang__)
  150368. "adcs r3, r7\n\t"
  150369. #else
  150370. "adc r3, r7\n\t"
  150371. #endif
  150372. #ifdef WOLFSSL_KEIL
  150373. "adcs r4, r4, %[r]\n\t"
  150374. #elif defined(__clang__)
  150375. "adcs r4, %[r]\n\t"
  150376. #else
  150377. "adc r4, %[r]\n\t"
  150378. #endif
  150379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150380. "lsrs r6, %[a], #16\n\t"
  150381. #else
  150382. "lsr r6, %[a], #16\n\t"
  150383. #endif
  150384. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150385. "lsrs r7, %[b], #16\n\t"
  150386. #else
  150387. "lsr r7, %[b], #16\n\t"
  150388. #endif
  150389. #ifdef WOLFSSL_KEIL
  150390. "muls r7, r6, r7\n\t"
  150391. #elif defined(__clang__)
  150392. "muls r7, r6\n\t"
  150393. #else
  150394. "mul r7, r6\n\t"
  150395. #endif
  150396. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150397. "adds r3, r3, r7\n\t"
  150398. #else
  150399. "add r3, r3, r7\n\t"
  150400. #endif
  150401. #ifdef WOLFSSL_KEIL
  150402. "adcs r4, r4, %[r]\n\t"
  150403. #elif defined(__clang__)
  150404. "adcs r4, %[r]\n\t"
  150405. #else
  150406. "adc r4, %[r]\n\t"
  150407. #endif
  150408. "uxth r7, %[b]\n\t"
  150409. #ifdef WOLFSSL_KEIL
  150410. "muls r6, r7, r6\n\t"
  150411. #elif defined(__clang__)
  150412. "muls r6, r7\n\t"
  150413. #else
  150414. "mul r6, r7\n\t"
  150415. #endif
  150416. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150417. "lsrs r7, r6, #16\n\t"
  150418. #else
  150419. "lsr r7, r6, #16\n\t"
  150420. #endif
  150421. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150422. "lsls r6, r6, #16\n\t"
  150423. #else
  150424. "lsl r6, r6, #16\n\t"
  150425. #endif
  150426. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150427. "adds r5, r5, r6\n\t"
  150428. #else
  150429. "add r5, r5, r6\n\t"
  150430. #endif
  150431. #ifdef WOLFSSL_KEIL
  150432. "adcs r3, r3, r7\n\t"
  150433. #elif defined(__clang__)
  150434. "adcs r3, r7\n\t"
  150435. #else
  150436. "adc r3, r7\n\t"
  150437. #endif
  150438. #ifdef WOLFSSL_KEIL
  150439. "adcs r4, r4, %[r]\n\t"
  150440. #elif defined(__clang__)
  150441. "adcs r4, %[r]\n\t"
  150442. #else
  150443. "adc r4, %[r]\n\t"
  150444. #endif
  150445. "# A[5] * B[9]\n\t"
  150446. "mov %[a], r9\n\t"
  150447. "mov %[b], r10\n\t"
  150448. "ldr %[a], [%[a], #20]\n\t"
  150449. "ldr %[b], [%[b], #36]\n\t"
  150450. "uxth r6, %[a]\n\t"
  150451. "uxth r7, %[b]\n\t"
  150452. #ifdef WOLFSSL_KEIL
  150453. "muls r7, r6, r7\n\t"
  150454. #elif defined(__clang__)
  150455. "muls r7, r6\n\t"
  150456. #else
  150457. "mul r7, r6\n\t"
  150458. #endif
  150459. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150460. "adds r5, r5, r7\n\t"
  150461. #else
  150462. "add r5, r5, r7\n\t"
  150463. #endif
  150464. #ifdef WOLFSSL_KEIL
  150465. "adcs r3, r3, %[r]\n\t"
  150466. #elif defined(__clang__)
  150467. "adcs r3, %[r]\n\t"
  150468. #else
  150469. "adc r3, %[r]\n\t"
  150470. #endif
  150471. #ifdef WOLFSSL_KEIL
  150472. "adcs r4, r4, %[r]\n\t"
  150473. #elif defined(__clang__)
  150474. "adcs r4, %[r]\n\t"
  150475. #else
  150476. "adc r4, %[r]\n\t"
  150477. #endif
  150478. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150479. "lsrs r7, %[b], #16\n\t"
  150480. #else
  150481. "lsr r7, %[b], #16\n\t"
  150482. #endif
  150483. #ifdef WOLFSSL_KEIL
  150484. "muls r6, r7, r6\n\t"
  150485. #elif defined(__clang__)
  150486. "muls r6, r7\n\t"
  150487. #else
  150488. "mul r6, r7\n\t"
  150489. #endif
  150490. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150491. "lsrs r7, r6, #16\n\t"
  150492. #else
  150493. "lsr r7, r6, #16\n\t"
  150494. #endif
  150495. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150496. "lsls r6, r6, #16\n\t"
  150497. #else
  150498. "lsl r6, r6, #16\n\t"
  150499. #endif
  150500. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150501. "adds r5, r5, r6\n\t"
  150502. #else
  150503. "add r5, r5, r6\n\t"
  150504. #endif
  150505. #ifdef WOLFSSL_KEIL
  150506. "adcs r3, r3, r7\n\t"
  150507. #elif defined(__clang__)
  150508. "adcs r3, r7\n\t"
  150509. #else
  150510. "adc r3, r7\n\t"
  150511. #endif
  150512. #ifdef WOLFSSL_KEIL
  150513. "adcs r4, r4, %[r]\n\t"
  150514. #elif defined(__clang__)
  150515. "adcs r4, %[r]\n\t"
  150516. #else
  150517. "adc r4, %[r]\n\t"
  150518. #endif
  150519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150520. "lsrs r6, %[a], #16\n\t"
  150521. #else
  150522. "lsr r6, %[a], #16\n\t"
  150523. #endif
  150524. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150525. "lsrs r7, %[b], #16\n\t"
  150526. #else
  150527. "lsr r7, %[b], #16\n\t"
  150528. #endif
  150529. #ifdef WOLFSSL_KEIL
  150530. "muls r7, r6, r7\n\t"
  150531. #elif defined(__clang__)
  150532. "muls r7, r6\n\t"
  150533. #else
  150534. "mul r7, r6\n\t"
  150535. #endif
  150536. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150537. "adds r3, r3, r7\n\t"
  150538. #else
  150539. "add r3, r3, r7\n\t"
  150540. #endif
  150541. #ifdef WOLFSSL_KEIL
  150542. "adcs r4, r4, %[r]\n\t"
  150543. #elif defined(__clang__)
  150544. "adcs r4, %[r]\n\t"
  150545. #else
  150546. "adc r4, %[r]\n\t"
  150547. #endif
  150548. "uxth r7, %[b]\n\t"
  150549. #ifdef WOLFSSL_KEIL
  150550. "muls r6, r7, r6\n\t"
  150551. #elif defined(__clang__)
  150552. "muls r6, r7\n\t"
  150553. #else
  150554. "mul r6, r7\n\t"
  150555. #endif
  150556. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150557. "lsrs r7, r6, #16\n\t"
  150558. #else
  150559. "lsr r7, r6, #16\n\t"
  150560. #endif
  150561. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150562. "lsls r6, r6, #16\n\t"
  150563. #else
  150564. "lsl r6, r6, #16\n\t"
  150565. #endif
  150566. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150567. "adds r5, r5, r6\n\t"
  150568. #else
  150569. "add r5, r5, r6\n\t"
  150570. #endif
  150571. #ifdef WOLFSSL_KEIL
  150572. "adcs r3, r3, r7\n\t"
  150573. #elif defined(__clang__)
  150574. "adcs r3, r7\n\t"
  150575. #else
  150576. "adc r3, r7\n\t"
  150577. #endif
  150578. #ifdef WOLFSSL_KEIL
  150579. "adcs r4, r4, %[r]\n\t"
  150580. #elif defined(__clang__)
  150581. "adcs r4, %[r]\n\t"
  150582. #else
  150583. "adc r4, %[r]\n\t"
  150584. #endif
  150585. "# A[4] * B[10]\n\t"
  150586. "mov %[a], r9\n\t"
  150587. "mov %[b], r10\n\t"
  150588. "ldr %[a], [%[a], #16]\n\t"
  150589. "ldr %[b], [%[b], #40]\n\t"
  150590. "uxth r6, %[a]\n\t"
  150591. "uxth r7, %[b]\n\t"
  150592. #ifdef WOLFSSL_KEIL
  150593. "muls r7, r6, r7\n\t"
  150594. #elif defined(__clang__)
  150595. "muls r7, r6\n\t"
  150596. #else
  150597. "mul r7, r6\n\t"
  150598. #endif
  150599. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150600. "adds r5, r5, r7\n\t"
  150601. #else
  150602. "add r5, r5, r7\n\t"
  150603. #endif
  150604. #ifdef WOLFSSL_KEIL
  150605. "adcs r3, r3, %[r]\n\t"
  150606. #elif defined(__clang__)
  150607. "adcs r3, %[r]\n\t"
  150608. #else
  150609. "adc r3, %[r]\n\t"
  150610. #endif
  150611. #ifdef WOLFSSL_KEIL
  150612. "adcs r4, r4, %[r]\n\t"
  150613. #elif defined(__clang__)
  150614. "adcs r4, %[r]\n\t"
  150615. #else
  150616. "adc r4, %[r]\n\t"
  150617. #endif
  150618. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150619. "lsrs r7, %[b], #16\n\t"
  150620. #else
  150621. "lsr r7, %[b], #16\n\t"
  150622. #endif
  150623. #ifdef WOLFSSL_KEIL
  150624. "muls r6, r7, r6\n\t"
  150625. #elif defined(__clang__)
  150626. "muls r6, r7\n\t"
  150627. #else
  150628. "mul r6, r7\n\t"
  150629. #endif
  150630. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150631. "lsrs r7, r6, #16\n\t"
  150632. #else
  150633. "lsr r7, r6, #16\n\t"
  150634. #endif
  150635. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150636. "lsls r6, r6, #16\n\t"
  150637. #else
  150638. "lsl r6, r6, #16\n\t"
  150639. #endif
  150640. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150641. "adds r5, r5, r6\n\t"
  150642. #else
  150643. "add r5, r5, r6\n\t"
  150644. #endif
  150645. #ifdef WOLFSSL_KEIL
  150646. "adcs r3, r3, r7\n\t"
  150647. #elif defined(__clang__)
  150648. "adcs r3, r7\n\t"
  150649. #else
  150650. "adc r3, r7\n\t"
  150651. #endif
  150652. #ifdef WOLFSSL_KEIL
  150653. "adcs r4, r4, %[r]\n\t"
  150654. #elif defined(__clang__)
  150655. "adcs r4, %[r]\n\t"
  150656. #else
  150657. "adc r4, %[r]\n\t"
  150658. #endif
  150659. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150660. "lsrs r6, %[a], #16\n\t"
  150661. #else
  150662. "lsr r6, %[a], #16\n\t"
  150663. #endif
  150664. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150665. "lsrs r7, %[b], #16\n\t"
  150666. #else
  150667. "lsr r7, %[b], #16\n\t"
  150668. #endif
  150669. #ifdef WOLFSSL_KEIL
  150670. "muls r7, r6, r7\n\t"
  150671. #elif defined(__clang__)
  150672. "muls r7, r6\n\t"
  150673. #else
  150674. "mul r7, r6\n\t"
  150675. #endif
  150676. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150677. "adds r3, r3, r7\n\t"
  150678. #else
  150679. "add r3, r3, r7\n\t"
  150680. #endif
  150681. #ifdef WOLFSSL_KEIL
  150682. "adcs r4, r4, %[r]\n\t"
  150683. #elif defined(__clang__)
  150684. "adcs r4, %[r]\n\t"
  150685. #else
  150686. "adc r4, %[r]\n\t"
  150687. #endif
  150688. "uxth r7, %[b]\n\t"
  150689. #ifdef WOLFSSL_KEIL
  150690. "muls r6, r7, r6\n\t"
  150691. #elif defined(__clang__)
  150692. "muls r6, r7\n\t"
  150693. #else
  150694. "mul r6, r7\n\t"
  150695. #endif
  150696. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150697. "lsrs r7, r6, #16\n\t"
  150698. #else
  150699. "lsr r7, r6, #16\n\t"
  150700. #endif
  150701. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150702. "lsls r6, r6, #16\n\t"
  150703. #else
  150704. "lsl r6, r6, #16\n\t"
  150705. #endif
  150706. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150707. "adds r5, r5, r6\n\t"
  150708. #else
  150709. "add r5, r5, r6\n\t"
  150710. #endif
  150711. #ifdef WOLFSSL_KEIL
  150712. "adcs r3, r3, r7\n\t"
  150713. #elif defined(__clang__)
  150714. "adcs r3, r7\n\t"
  150715. #else
  150716. "adc r3, r7\n\t"
  150717. #endif
  150718. #ifdef WOLFSSL_KEIL
  150719. "adcs r4, r4, %[r]\n\t"
  150720. #elif defined(__clang__)
  150721. "adcs r4, %[r]\n\t"
  150722. #else
  150723. "adc r4, %[r]\n\t"
  150724. #endif
  150725. "# A[3] * B[11]\n\t"
  150726. "mov %[a], r9\n\t"
  150727. "mov %[b], r10\n\t"
  150728. "ldr %[a], [%[a], #12]\n\t"
  150729. "ldr %[b], [%[b], #44]\n\t"
  150730. "uxth r6, %[a]\n\t"
  150731. "uxth r7, %[b]\n\t"
  150732. #ifdef WOLFSSL_KEIL
  150733. "muls r7, r6, r7\n\t"
  150734. #elif defined(__clang__)
  150735. "muls r7, r6\n\t"
  150736. #else
  150737. "mul r7, r6\n\t"
  150738. #endif
  150739. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150740. "adds r5, r5, r7\n\t"
  150741. #else
  150742. "add r5, r5, r7\n\t"
  150743. #endif
  150744. #ifdef WOLFSSL_KEIL
  150745. "adcs r3, r3, %[r]\n\t"
  150746. #elif defined(__clang__)
  150747. "adcs r3, %[r]\n\t"
  150748. #else
  150749. "adc r3, %[r]\n\t"
  150750. #endif
  150751. #ifdef WOLFSSL_KEIL
  150752. "adcs r4, r4, %[r]\n\t"
  150753. #elif defined(__clang__)
  150754. "adcs r4, %[r]\n\t"
  150755. #else
  150756. "adc r4, %[r]\n\t"
  150757. #endif
  150758. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150759. "lsrs r7, %[b], #16\n\t"
  150760. #else
  150761. "lsr r7, %[b], #16\n\t"
  150762. #endif
  150763. #ifdef WOLFSSL_KEIL
  150764. "muls r6, r7, r6\n\t"
  150765. #elif defined(__clang__)
  150766. "muls r6, r7\n\t"
  150767. #else
  150768. "mul r6, r7\n\t"
  150769. #endif
  150770. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150771. "lsrs r7, r6, #16\n\t"
  150772. #else
  150773. "lsr r7, r6, #16\n\t"
  150774. #endif
  150775. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150776. "lsls r6, r6, #16\n\t"
  150777. #else
  150778. "lsl r6, r6, #16\n\t"
  150779. #endif
  150780. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150781. "adds r5, r5, r6\n\t"
  150782. #else
  150783. "add r5, r5, r6\n\t"
  150784. #endif
  150785. #ifdef WOLFSSL_KEIL
  150786. "adcs r3, r3, r7\n\t"
  150787. #elif defined(__clang__)
  150788. "adcs r3, r7\n\t"
  150789. #else
  150790. "adc r3, r7\n\t"
  150791. #endif
  150792. #ifdef WOLFSSL_KEIL
  150793. "adcs r4, r4, %[r]\n\t"
  150794. #elif defined(__clang__)
  150795. "adcs r4, %[r]\n\t"
  150796. #else
  150797. "adc r4, %[r]\n\t"
  150798. #endif
  150799. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150800. "lsrs r6, %[a], #16\n\t"
  150801. #else
  150802. "lsr r6, %[a], #16\n\t"
  150803. #endif
  150804. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150805. "lsrs r7, %[b], #16\n\t"
  150806. #else
  150807. "lsr r7, %[b], #16\n\t"
  150808. #endif
  150809. #ifdef WOLFSSL_KEIL
  150810. "muls r7, r6, r7\n\t"
  150811. #elif defined(__clang__)
  150812. "muls r7, r6\n\t"
  150813. #else
  150814. "mul r7, r6\n\t"
  150815. #endif
  150816. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150817. "adds r3, r3, r7\n\t"
  150818. #else
  150819. "add r3, r3, r7\n\t"
  150820. #endif
  150821. #ifdef WOLFSSL_KEIL
  150822. "adcs r4, r4, %[r]\n\t"
  150823. #elif defined(__clang__)
  150824. "adcs r4, %[r]\n\t"
  150825. #else
  150826. "adc r4, %[r]\n\t"
  150827. #endif
  150828. "uxth r7, %[b]\n\t"
  150829. #ifdef WOLFSSL_KEIL
  150830. "muls r6, r7, r6\n\t"
  150831. #elif defined(__clang__)
  150832. "muls r6, r7\n\t"
  150833. #else
  150834. "mul r6, r7\n\t"
  150835. #endif
  150836. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150837. "lsrs r7, r6, #16\n\t"
  150838. #else
  150839. "lsr r7, r6, #16\n\t"
  150840. #endif
  150841. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150842. "lsls r6, r6, #16\n\t"
  150843. #else
  150844. "lsl r6, r6, #16\n\t"
  150845. #endif
  150846. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150847. "adds r5, r5, r6\n\t"
  150848. #else
  150849. "add r5, r5, r6\n\t"
  150850. #endif
  150851. #ifdef WOLFSSL_KEIL
  150852. "adcs r3, r3, r7\n\t"
  150853. #elif defined(__clang__)
  150854. "adcs r3, r7\n\t"
  150855. #else
  150856. "adc r3, r7\n\t"
  150857. #endif
  150858. #ifdef WOLFSSL_KEIL
  150859. "adcs r4, r4, %[r]\n\t"
  150860. #elif defined(__clang__)
  150861. "adcs r4, %[r]\n\t"
  150862. #else
  150863. "adc r4, %[r]\n\t"
  150864. #endif
  150865. "# A[2] * B[12]\n\t"
  150866. "mov %[a], r9\n\t"
  150867. "mov %[b], r10\n\t"
  150868. "ldr %[a], [%[a], #8]\n\t"
  150869. "ldr %[b], [%[b], #48]\n\t"
  150870. "uxth r6, %[a]\n\t"
  150871. "uxth r7, %[b]\n\t"
  150872. #ifdef WOLFSSL_KEIL
  150873. "muls r7, r6, r7\n\t"
  150874. #elif defined(__clang__)
  150875. "muls r7, r6\n\t"
  150876. #else
  150877. "mul r7, r6\n\t"
  150878. #endif
  150879. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150880. "adds r5, r5, r7\n\t"
  150881. #else
  150882. "add r5, r5, r7\n\t"
  150883. #endif
  150884. #ifdef WOLFSSL_KEIL
  150885. "adcs r3, r3, %[r]\n\t"
  150886. #elif defined(__clang__)
  150887. "adcs r3, %[r]\n\t"
  150888. #else
  150889. "adc r3, %[r]\n\t"
  150890. #endif
  150891. #ifdef WOLFSSL_KEIL
  150892. "adcs r4, r4, %[r]\n\t"
  150893. #elif defined(__clang__)
  150894. "adcs r4, %[r]\n\t"
  150895. #else
  150896. "adc r4, %[r]\n\t"
  150897. #endif
  150898. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150899. "lsrs r7, %[b], #16\n\t"
  150900. #else
  150901. "lsr r7, %[b], #16\n\t"
  150902. #endif
  150903. #ifdef WOLFSSL_KEIL
  150904. "muls r6, r7, r6\n\t"
  150905. #elif defined(__clang__)
  150906. "muls r6, r7\n\t"
  150907. #else
  150908. "mul r6, r7\n\t"
  150909. #endif
  150910. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150911. "lsrs r7, r6, #16\n\t"
  150912. #else
  150913. "lsr r7, r6, #16\n\t"
  150914. #endif
  150915. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150916. "lsls r6, r6, #16\n\t"
  150917. #else
  150918. "lsl r6, r6, #16\n\t"
  150919. #endif
  150920. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150921. "adds r5, r5, r6\n\t"
  150922. #else
  150923. "add r5, r5, r6\n\t"
  150924. #endif
  150925. #ifdef WOLFSSL_KEIL
  150926. "adcs r3, r3, r7\n\t"
  150927. #elif defined(__clang__)
  150928. "adcs r3, r7\n\t"
  150929. #else
  150930. "adc r3, r7\n\t"
  150931. #endif
  150932. #ifdef WOLFSSL_KEIL
  150933. "adcs r4, r4, %[r]\n\t"
  150934. #elif defined(__clang__)
  150935. "adcs r4, %[r]\n\t"
  150936. #else
  150937. "adc r4, %[r]\n\t"
  150938. #endif
  150939. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150940. "lsrs r6, %[a], #16\n\t"
  150941. #else
  150942. "lsr r6, %[a], #16\n\t"
  150943. #endif
  150944. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150945. "lsrs r7, %[b], #16\n\t"
  150946. #else
  150947. "lsr r7, %[b], #16\n\t"
  150948. #endif
  150949. #ifdef WOLFSSL_KEIL
  150950. "muls r7, r6, r7\n\t"
  150951. #elif defined(__clang__)
  150952. "muls r7, r6\n\t"
  150953. #else
  150954. "mul r7, r6\n\t"
  150955. #endif
  150956. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150957. "adds r3, r3, r7\n\t"
  150958. #else
  150959. "add r3, r3, r7\n\t"
  150960. #endif
  150961. #ifdef WOLFSSL_KEIL
  150962. "adcs r4, r4, %[r]\n\t"
  150963. #elif defined(__clang__)
  150964. "adcs r4, %[r]\n\t"
  150965. #else
  150966. "adc r4, %[r]\n\t"
  150967. #endif
  150968. "uxth r7, %[b]\n\t"
  150969. #ifdef WOLFSSL_KEIL
  150970. "muls r6, r7, r6\n\t"
  150971. #elif defined(__clang__)
  150972. "muls r6, r7\n\t"
  150973. #else
  150974. "mul r6, r7\n\t"
  150975. #endif
  150976. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150977. "lsrs r7, r6, #16\n\t"
  150978. #else
  150979. "lsr r7, r6, #16\n\t"
  150980. #endif
  150981. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150982. "lsls r6, r6, #16\n\t"
  150983. #else
  150984. "lsl r6, r6, #16\n\t"
  150985. #endif
  150986. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150987. "adds r5, r5, r6\n\t"
  150988. #else
  150989. "add r5, r5, r6\n\t"
  150990. #endif
  150991. #ifdef WOLFSSL_KEIL
  150992. "adcs r3, r3, r7\n\t"
  150993. #elif defined(__clang__)
  150994. "adcs r3, r7\n\t"
  150995. #else
  150996. "adc r3, r7\n\t"
  150997. #endif
  150998. #ifdef WOLFSSL_KEIL
  150999. "adcs r4, r4, %[r]\n\t"
  151000. #elif defined(__clang__)
  151001. "adcs r4, %[r]\n\t"
  151002. #else
  151003. "adc r4, %[r]\n\t"
  151004. #endif
  151005. "# A[1] * B[13]\n\t"
  151006. "mov %[a], r9\n\t"
  151007. "mov %[b], r10\n\t"
  151008. "ldr %[a], [%[a], #4]\n\t"
  151009. "ldr %[b], [%[b], #52]\n\t"
  151010. "uxth r6, %[a]\n\t"
  151011. "uxth r7, %[b]\n\t"
  151012. #ifdef WOLFSSL_KEIL
  151013. "muls r7, r6, r7\n\t"
  151014. #elif defined(__clang__)
  151015. "muls r7, r6\n\t"
  151016. #else
  151017. "mul r7, r6\n\t"
  151018. #endif
  151019. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151020. "adds r5, r5, r7\n\t"
  151021. #else
  151022. "add r5, r5, r7\n\t"
  151023. #endif
  151024. #ifdef WOLFSSL_KEIL
  151025. "adcs r3, r3, %[r]\n\t"
  151026. #elif defined(__clang__)
  151027. "adcs r3, %[r]\n\t"
  151028. #else
  151029. "adc r3, %[r]\n\t"
  151030. #endif
  151031. #ifdef WOLFSSL_KEIL
  151032. "adcs r4, r4, %[r]\n\t"
  151033. #elif defined(__clang__)
  151034. "adcs r4, %[r]\n\t"
  151035. #else
  151036. "adc r4, %[r]\n\t"
  151037. #endif
  151038. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151039. "lsrs r7, %[b], #16\n\t"
  151040. #else
  151041. "lsr r7, %[b], #16\n\t"
  151042. #endif
  151043. #ifdef WOLFSSL_KEIL
  151044. "muls r6, r7, r6\n\t"
  151045. #elif defined(__clang__)
  151046. "muls r6, r7\n\t"
  151047. #else
  151048. "mul r6, r7\n\t"
  151049. #endif
  151050. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151051. "lsrs r7, r6, #16\n\t"
  151052. #else
  151053. "lsr r7, r6, #16\n\t"
  151054. #endif
  151055. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151056. "lsls r6, r6, #16\n\t"
  151057. #else
  151058. "lsl r6, r6, #16\n\t"
  151059. #endif
  151060. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151061. "adds r5, r5, r6\n\t"
  151062. #else
  151063. "add r5, r5, r6\n\t"
  151064. #endif
  151065. #ifdef WOLFSSL_KEIL
  151066. "adcs r3, r3, r7\n\t"
  151067. #elif defined(__clang__)
  151068. "adcs r3, r7\n\t"
  151069. #else
  151070. "adc r3, r7\n\t"
  151071. #endif
  151072. #ifdef WOLFSSL_KEIL
  151073. "adcs r4, r4, %[r]\n\t"
  151074. #elif defined(__clang__)
  151075. "adcs r4, %[r]\n\t"
  151076. #else
  151077. "adc r4, %[r]\n\t"
  151078. #endif
  151079. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151080. "lsrs r6, %[a], #16\n\t"
  151081. #else
  151082. "lsr r6, %[a], #16\n\t"
  151083. #endif
  151084. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151085. "lsrs r7, %[b], #16\n\t"
  151086. #else
  151087. "lsr r7, %[b], #16\n\t"
  151088. #endif
  151089. #ifdef WOLFSSL_KEIL
  151090. "muls r7, r6, r7\n\t"
  151091. #elif defined(__clang__)
  151092. "muls r7, r6\n\t"
  151093. #else
  151094. "mul r7, r6\n\t"
  151095. #endif
  151096. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151097. "adds r3, r3, r7\n\t"
  151098. #else
  151099. "add r3, r3, r7\n\t"
  151100. #endif
  151101. #ifdef WOLFSSL_KEIL
  151102. "adcs r4, r4, %[r]\n\t"
  151103. #elif defined(__clang__)
  151104. "adcs r4, %[r]\n\t"
  151105. #else
  151106. "adc r4, %[r]\n\t"
  151107. #endif
  151108. "uxth r7, %[b]\n\t"
  151109. #ifdef WOLFSSL_KEIL
  151110. "muls r6, r7, r6\n\t"
  151111. #elif defined(__clang__)
  151112. "muls r6, r7\n\t"
  151113. #else
  151114. "mul r6, r7\n\t"
  151115. #endif
  151116. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151117. "lsrs r7, r6, #16\n\t"
  151118. #else
  151119. "lsr r7, r6, #16\n\t"
  151120. #endif
  151121. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151122. "lsls r6, r6, #16\n\t"
  151123. #else
  151124. "lsl r6, r6, #16\n\t"
  151125. #endif
  151126. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151127. "adds r5, r5, r6\n\t"
  151128. #else
  151129. "add r5, r5, r6\n\t"
  151130. #endif
  151131. #ifdef WOLFSSL_KEIL
  151132. "adcs r3, r3, r7\n\t"
  151133. #elif defined(__clang__)
  151134. "adcs r3, r7\n\t"
  151135. #else
  151136. "adc r3, r7\n\t"
  151137. #endif
  151138. #ifdef WOLFSSL_KEIL
  151139. "adcs r4, r4, %[r]\n\t"
  151140. #elif defined(__clang__)
  151141. "adcs r4, %[r]\n\t"
  151142. #else
  151143. "adc r4, %[r]\n\t"
  151144. #endif
  151145. "# A[0] * B[14]\n\t"
  151146. "mov %[a], r9\n\t"
  151147. "mov %[b], r10\n\t"
  151148. "ldr %[a], [%[a]]\n\t"
  151149. "ldr %[b], [%[b], #56]\n\t"
  151150. "uxth r6, %[a]\n\t"
  151151. "uxth r7, %[b]\n\t"
  151152. #ifdef WOLFSSL_KEIL
  151153. "muls r7, r6, r7\n\t"
  151154. #elif defined(__clang__)
  151155. "muls r7, r6\n\t"
  151156. #else
  151157. "mul r7, r6\n\t"
  151158. #endif
  151159. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151160. "adds r5, r5, r7\n\t"
  151161. #else
  151162. "add r5, r5, r7\n\t"
  151163. #endif
  151164. #ifdef WOLFSSL_KEIL
  151165. "adcs r3, r3, %[r]\n\t"
  151166. #elif defined(__clang__)
  151167. "adcs r3, %[r]\n\t"
  151168. #else
  151169. "adc r3, %[r]\n\t"
  151170. #endif
  151171. #ifdef WOLFSSL_KEIL
  151172. "adcs r4, r4, %[r]\n\t"
  151173. #elif defined(__clang__)
  151174. "adcs r4, %[r]\n\t"
  151175. #else
  151176. "adc r4, %[r]\n\t"
  151177. #endif
  151178. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151179. "lsrs r7, %[b], #16\n\t"
  151180. #else
  151181. "lsr r7, %[b], #16\n\t"
  151182. #endif
  151183. #ifdef WOLFSSL_KEIL
  151184. "muls r6, r7, r6\n\t"
  151185. #elif defined(__clang__)
  151186. "muls r6, r7\n\t"
  151187. #else
  151188. "mul r6, r7\n\t"
  151189. #endif
  151190. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151191. "lsrs r7, r6, #16\n\t"
  151192. #else
  151193. "lsr r7, r6, #16\n\t"
  151194. #endif
  151195. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151196. "lsls r6, r6, #16\n\t"
  151197. #else
  151198. "lsl r6, r6, #16\n\t"
  151199. #endif
  151200. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151201. "adds r5, r5, r6\n\t"
  151202. #else
  151203. "add r5, r5, r6\n\t"
  151204. #endif
  151205. #ifdef WOLFSSL_KEIL
  151206. "adcs r3, r3, r7\n\t"
  151207. #elif defined(__clang__)
  151208. "adcs r3, r7\n\t"
  151209. #else
  151210. "adc r3, r7\n\t"
  151211. #endif
  151212. #ifdef WOLFSSL_KEIL
  151213. "adcs r4, r4, %[r]\n\t"
  151214. #elif defined(__clang__)
  151215. "adcs r4, %[r]\n\t"
  151216. #else
  151217. "adc r4, %[r]\n\t"
  151218. #endif
  151219. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151220. "lsrs r6, %[a], #16\n\t"
  151221. #else
  151222. "lsr r6, %[a], #16\n\t"
  151223. #endif
  151224. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151225. "lsrs r7, %[b], #16\n\t"
  151226. #else
  151227. "lsr r7, %[b], #16\n\t"
  151228. #endif
  151229. #ifdef WOLFSSL_KEIL
  151230. "muls r7, r6, r7\n\t"
  151231. #elif defined(__clang__)
  151232. "muls r7, r6\n\t"
  151233. #else
  151234. "mul r7, r6\n\t"
  151235. #endif
  151236. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151237. "adds r3, r3, r7\n\t"
  151238. #else
  151239. "add r3, r3, r7\n\t"
  151240. #endif
  151241. #ifdef WOLFSSL_KEIL
  151242. "adcs r4, r4, %[r]\n\t"
  151243. #elif defined(__clang__)
  151244. "adcs r4, %[r]\n\t"
  151245. #else
  151246. "adc r4, %[r]\n\t"
  151247. #endif
  151248. "uxth r7, %[b]\n\t"
  151249. #ifdef WOLFSSL_KEIL
  151250. "muls r6, r7, r6\n\t"
  151251. #elif defined(__clang__)
  151252. "muls r6, r7\n\t"
  151253. #else
  151254. "mul r6, r7\n\t"
  151255. #endif
  151256. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151257. "lsrs r7, r6, #16\n\t"
  151258. #else
  151259. "lsr r7, r6, #16\n\t"
  151260. #endif
  151261. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151262. "lsls r6, r6, #16\n\t"
  151263. #else
  151264. "lsl r6, r6, #16\n\t"
  151265. #endif
  151266. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151267. "adds r5, r5, r6\n\t"
  151268. #else
  151269. "add r5, r5, r6\n\t"
  151270. #endif
  151271. #ifdef WOLFSSL_KEIL
  151272. "adcs r3, r3, r7\n\t"
  151273. #elif defined(__clang__)
  151274. "adcs r3, r7\n\t"
  151275. #else
  151276. "adc r3, r7\n\t"
  151277. #endif
  151278. #ifdef WOLFSSL_KEIL
  151279. "adcs r4, r4, %[r]\n\t"
  151280. #elif defined(__clang__)
  151281. "adcs r4, %[r]\n\t"
  151282. #else
  151283. "adc r4, %[r]\n\t"
  151284. #endif
  151285. "str r5, [sp, #56]\n\t"
  151286. "# A[0] * B[15]\n\t"
  151287. "movs r5, #0\n\t"
  151288. "mov %[a], r9\n\t"
  151289. "mov %[b], r10\n\t"
  151290. "ldr %[a], [%[a]]\n\t"
  151291. "ldr %[b], [%[b], #60]\n\t"
  151292. "uxth r6, %[a]\n\t"
  151293. "uxth r7, %[b]\n\t"
  151294. #ifdef WOLFSSL_KEIL
  151295. "muls r7, r6, r7\n\t"
  151296. #elif defined(__clang__)
  151297. "muls r7, r6\n\t"
  151298. #else
  151299. "mul r7, r6\n\t"
  151300. #endif
  151301. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151302. "adds r3, r3, r7\n\t"
  151303. #else
  151304. "add r3, r3, r7\n\t"
  151305. #endif
  151306. #ifdef WOLFSSL_KEIL
  151307. "adcs r4, r4, %[r]\n\t"
  151308. #elif defined(__clang__)
  151309. "adcs r4, %[r]\n\t"
  151310. #else
  151311. "adc r4, %[r]\n\t"
  151312. #endif
  151313. #ifdef WOLFSSL_KEIL
  151314. "adcs r5, r5, %[r]\n\t"
  151315. #elif defined(__clang__)
  151316. "adcs r5, %[r]\n\t"
  151317. #else
  151318. "adc r5, %[r]\n\t"
  151319. #endif
  151320. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151321. "lsrs r7, %[b], #16\n\t"
  151322. #else
  151323. "lsr r7, %[b], #16\n\t"
  151324. #endif
  151325. #ifdef WOLFSSL_KEIL
  151326. "muls r6, r7, r6\n\t"
  151327. #elif defined(__clang__)
  151328. "muls r6, r7\n\t"
  151329. #else
  151330. "mul r6, r7\n\t"
  151331. #endif
  151332. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151333. "lsrs r7, r6, #16\n\t"
  151334. #else
  151335. "lsr r7, r6, #16\n\t"
  151336. #endif
  151337. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151338. "lsls r6, r6, #16\n\t"
  151339. #else
  151340. "lsl r6, r6, #16\n\t"
  151341. #endif
  151342. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151343. "adds r3, r3, r6\n\t"
  151344. #else
  151345. "add r3, r3, r6\n\t"
  151346. #endif
  151347. #ifdef WOLFSSL_KEIL
  151348. "adcs r4, r4, r7\n\t"
  151349. #elif defined(__clang__)
  151350. "adcs r4, r7\n\t"
  151351. #else
  151352. "adc r4, r7\n\t"
  151353. #endif
  151354. #ifdef WOLFSSL_KEIL
  151355. "adcs r5, r5, %[r]\n\t"
  151356. #elif defined(__clang__)
  151357. "adcs r5, %[r]\n\t"
  151358. #else
  151359. "adc r5, %[r]\n\t"
  151360. #endif
  151361. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151362. "lsrs r6, %[a], #16\n\t"
  151363. #else
  151364. "lsr r6, %[a], #16\n\t"
  151365. #endif
  151366. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151367. "lsrs r7, %[b], #16\n\t"
  151368. #else
  151369. "lsr r7, %[b], #16\n\t"
  151370. #endif
  151371. #ifdef WOLFSSL_KEIL
  151372. "muls r7, r6, r7\n\t"
  151373. #elif defined(__clang__)
  151374. "muls r7, r6\n\t"
  151375. #else
  151376. "mul r7, r6\n\t"
  151377. #endif
  151378. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151379. "adds r4, r4, r7\n\t"
  151380. #else
  151381. "add r4, r4, r7\n\t"
  151382. #endif
  151383. #ifdef WOLFSSL_KEIL
  151384. "adcs r5, r5, %[r]\n\t"
  151385. #elif defined(__clang__)
  151386. "adcs r5, %[r]\n\t"
  151387. #else
  151388. "adc r5, %[r]\n\t"
  151389. #endif
  151390. "uxth r7, %[b]\n\t"
  151391. #ifdef WOLFSSL_KEIL
  151392. "muls r6, r7, r6\n\t"
  151393. #elif defined(__clang__)
  151394. "muls r6, r7\n\t"
  151395. #else
  151396. "mul r6, r7\n\t"
  151397. #endif
  151398. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151399. "lsrs r7, r6, #16\n\t"
  151400. #else
  151401. "lsr r7, r6, #16\n\t"
  151402. #endif
  151403. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151404. "lsls r6, r6, #16\n\t"
  151405. #else
  151406. "lsl r6, r6, #16\n\t"
  151407. #endif
  151408. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151409. "adds r3, r3, r6\n\t"
  151410. #else
  151411. "add r3, r3, r6\n\t"
  151412. #endif
  151413. #ifdef WOLFSSL_KEIL
  151414. "adcs r4, r4, r7\n\t"
  151415. #elif defined(__clang__)
  151416. "adcs r4, r7\n\t"
  151417. #else
  151418. "adc r4, r7\n\t"
  151419. #endif
  151420. #ifdef WOLFSSL_KEIL
  151421. "adcs r5, r5, %[r]\n\t"
  151422. #elif defined(__clang__)
  151423. "adcs r5, %[r]\n\t"
  151424. #else
  151425. "adc r5, %[r]\n\t"
  151426. #endif
  151427. "# A[1] * B[14]\n\t"
  151428. "mov %[a], r9\n\t"
  151429. "mov %[b], r10\n\t"
  151430. "ldr %[a], [%[a], #4]\n\t"
  151431. "ldr %[b], [%[b], #56]\n\t"
  151432. "uxth r6, %[a]\n\t"
  151433. "uxth r7, %[b]\n\t"
  151434. #ifdef WOLFSSL_KEIL
  151435. "muls r7, r6, r7\n\t"
  151436. #elif defined(__clang__)
  151437. "muls r7, r6\n\t"
  151438. #else
  151439. "mul r7, r6\n\t"
  151440. #endif
  151441. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151442. "adds r3, r3, r7\n\t"
  151443. #else
  151444. "add r3, r3, r7\n\t"
  151445. #endif
  151446. #ifdef WOLFSSL_KEIL
  151447. "adcs r4, r4, %[r]\n\t"
  151448. #elif defined(__clang__)
  151449. "adcs r4, %[r]\n\t"
  151450. #else
  151451. "adc r4, %[r]\n\t"
  151452. #endif
  151453. #ifdef WOLFSSL_KEIL
  151454. "adcs r5, r5, %[r]\n\t"
  151455. #elif defined(__clang__)
  151456. "adcs r5, %[r]\n\t"
  151457. #else
  151458. "adc r5, %[r]\n\t"
  151459. #endif
  151460. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151461. "lsrs r7, %[b], #16\n\t"
  151462. #else
  151463. "lsr r7, %[b], #16\n\t"
  151464. #endif
  151465. #ifdef WOLFSSL_KEIL
  151466. "muls r6, r7, r6\n\t"
  151467. #elif defined(__clang__)
  151468. "muls r6, r7\n\t"
  151469. #else
  151470. "mul r6, r7\n\t"
  151471. #endif
  151472. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151473. "lsrs r7, r6, #16\n\t"
  151474. #else
  151475. "lsr r7, r6, #16\n\t"
  151476. #endif
  151477. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151478. "lsls r6, r6, #16\n\t"
  151479. #else
  151480. "lsl r6, r6, #16\n\t"
  151481. #endif
  151482. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151483. "adds r3, r3, r6\n\t"
  151484. #else
  151485. "add r3, r3, r6\n\t"
  151486. #endif
  151487. #ifdef WOLFSSL_KEIL
  151488. "adcs r4, r4, r7\n\t"
  151489. #elif defined(__clang__)
  151490. "adcs r4, r7\n\t"
  151491. #else
  151492. "adc r4, r7\n\t"
  151493. #endif
  151494. #ifdef WOLFSSL_KEIL
  151495. "adcs r5, r5, %[r]\n\t"
  151496. #elif defined(__clang__)
  151497. "adcs r5, %[r]\n\t"
  151498. #else
  151499. "adc r5, %[r]\n\t"
  151500. #endif
  151501. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151502. "lsrs r6, %[a], #16\n\t"
  151503. #else
  151504. "lsr r6, %[a], #16\n\t"
  151505. #endif
  151506. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151507. "lsrs r7, %[b], #16\n\t"
  151508. #else
  151509. "lsr r7, %[b], #16\n\t"
  151510. #endif
  151511. #ifdef WOLFSSL_KEIL
  151512. "muls r7, r6, r7\n\t"
  151513. #elif defined(__clang__)
  151514. "muls r7, r6\n\t"
  151515. #else
  151516. "mul r7, r6\n\t"
  151517. #endif
  151518. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151519. "adds r4, r4, r7\n\t"
  151520. #else
  151521. "add r4, r4, r7\n\t"
  151522. #endif
  151523. #ifdef WOLFSSL_KEIL
  151524. "adcs r5, r5, %[r]\n\t"
  151525. #elif defined(__clang__)
  151526. "adcs r5, %[r]\n\t"
  151527. #else
  151528. "adc r5, %[r]\n\t"
  151529. #endif
  151530. "uxth r7, %[b]\n\t"
  151531. #ifdef WOLFSSL_KEIL
  151532. "muls r6, r7, r6\n\t"
  151533. #elif defined(__clang__)
  151534. "muls r6, r7\n\t"
  151535. #else
  151536. "mul r6, r7\n\t"
  151537. #endif
  151538. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151539. "lsrs r7, r6, #16\n\t"
  151540. #else
  151541. "lsr r7, r6, #16\n\t"
  151542. #endif
  151543. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151544. "lsls r6, r6, #16\n\t"
  151545. #else
  151546. "lsl r6, r6, #16\n\t"
  151547. #endif
  151548. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151549. "adds r3, r3, r6\n\t"
  151550. #else
  151551. "add r3, r3, r6\n\t"
  151552. #endif
  151553. #ifdef WOLFSSL_KEIL
  151554. "adcs r4, r4, r7\n\t"
  151555. #elif defined(__clang__)
  151556. "adcs r4, r7\n\t"
  151557. #else
  151558. "adc r4, r7\n\t"
  151559. #endif
  151560. #ifdef WOLFSSL_KEIL
  151561. "adcs r5, r5, %[r]\n\t"
  151562. #elif defined(__clang__)
  151563. "adcs r5, %[r]\n\t"
  151564. #else
  151565. "adc r5, %[r]\n\t"
  151566. #endif
  151567. "# A[2] * B[13]\n\t"
  151568. "mov %[a], r9\n\t"
  151569. "mov %[b], r10\n\t"
  151570. "ldr %[a], [%[a], #8]\n\t"
  151571. "ldr %[b], [%[b], #52]\n\t"
  151572. "uxth r6, %[a]\n\t"
  151573. "uxth r7, %[b]\n\t"
  151574. #ifdef WOLFSSL_KEIL
  151575. "muls r7, r6, r7\n\t"
  151576. #elif defined(__clang__)
  151577. "muls r7, r6\n\t"
  151578. #else
  151579. "mul r7, r6\n\t"
  151580. #endif
  151581. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151582. "adds r3, r3, r7\n\t"
  151583. #else
  151584. "add r3, r3, r7\n\t"
  151585. #endif
  151586. #ifdef WOLFSSL_KEIL
  151587. "adcs r4, r4, %[r]\n\t"
  151588. #elif defined(__clang__)
  151589. "adcs r4, %[r]\n\t"
  151590. #else
  151591. "adc r4, %[r]\n\t"
  151592. #endif
  151593. #ifdef WOLFSSL_KEIL
  151594. "adcs r5, r5, %[r]\n\t"
  151595. #elif defined(__clang__)
  151596. "adcs r5, %[r]\n\t"
  151597. #else
  151598. "adc r5, %[r]\n\t"
  151599. #endif
  151600. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151601. "lsrs r7, %[b], #16\n\t"
  151602. #else
  151603. "lsr r7, %[b], #16\n\t"
  151604. #endif
  151605. #ifdef WOLFSSL_KEIL
  151606. "muls r6, r7, r6\n\t"
  151607. #elif defined(__clang__)
  151608. "muls r6, r7\n\t"
  151609. #else
  151610. "mul r6, r7\n\t"
  151611. #endif
  151612. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151613. "lsrs r7, r6, #16\n\t"
  151614. #else
  151615. "lsr r7, r6, #16\n\t"
  151616. #endif
  151617. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151618. "lsls r6, r6, #16\n\t"
  151619. #else
  151620. "lsl r6, r6, #16\n\t"
  151621. #endif
  151622. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151623. "adds r3, r3, r6\n\t"
  151624. #else
  151625. "add r3, r3, r6\n\t"
  151626. #endif
  151627. #ifdef WOLFSSL_KEIL
  151628. "adcs r4, r4, r7\n\t"
  151629. #elif defined(__clang__)
  151630. "adcs r4, r7\n\t"
  151631. #else
  151632. "adc r4, r7\n\t"
  151633. #endif
  151634. #ifdef WOLFSSL_KEIL
  151635. "adcs r5, r5, %[r]\n\t"
  151636. #elif defined(__clang__)
  151637. "adcs r5, %[r]\n\t"
  151638. #else
  151639. "adc r5, %[r]\n\t"
  151640. #endif
  151641. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151642. "lsrs r6, %[a], #16\n\t"
  151643. #else
  151644. "lsr r6, %[a], #16\n\t"
  151645. #endif
  151646. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151647. "lsrs r7, %[b], #16\n\t"
  151648. #else
  151649. "lsr r7, %[b], #16\n\t"
  151650. #endif
  151651. #ifdef WOLFSSL_KEIL
  151652. "muls r7, r6, r7\n\t"
  151653. #elif defined(__clang__)
  151654. "muls r7, r6\n\t"
  151655. #else
  151656. "mul r7, r6\n\t"
  151657. #endif
  151658. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151659. "adds r4, r4, r7\n\t"
  151660. #else
  151661. "add r4, r4, r7\n\t"
  151662. #endif
  151663. #ifdef WOLFSSL_KEIL
  151664. "adcs r5, r5, %[r]\n\t"
  151665. #elif defined(__clang__)
  151666. "adcs r5, %[r]\n\t"
  151667. #else
  151668. "adc r5, %[r]\n\t"
  151669. #endif
  151670. "uxth r7, %[b]\n\t"
  151671. #ifdef WOLFSSL_KEIL
  151672. "muls r6, r7, r6\n\t"
  151673. #elif defined(__clang__)
  151674. "muls r6, r7\n\t"
  151675. #else
  151676. "mul r6, r7\n\t"
  151677. #endif
  151678. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151679. "lsrs r7, r6, #16\n\t"
  151680. #else
  151681. "lsr r7, r6, #16\n\t"
  151682. #endif
  151683. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151684. "lsls r6, r6, #16\n\t"
  151685. #else
  151686. "lsl r6, r6, #16\n\t"
  151687. #endif
  151688. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151689. "adds r3, r3, r6\n\t"
  151690. #else
  151691. "add r3, r3, r6\n\t"
  151692. #endif
  151693. #ifdef WOLFSSL_KEIL
  151694. "adcs r4, r4, r7\n\t"
  151695. #elif defined(__clang__)
  151696. "adcs r4, r7\n\t"
  151697. #else
  151698. "adc r4, r7\n\t"
  151699. #endif
  151700. #ifdef WOLFSSL_KEIL
  151701. "adcs r5, r5, %[r]\n\t"
  151702. #elif defined(__clang__)
  151703. "adcs r5, %[r]\n\t"
  151704. #else
  151705. "adc r5, %[r]\n\t"
  151706. #endif
  151707. "# A[3] * B[12]\n\t"
  151708. "mov %[a], r9\n\t"
  151709. "mov %[b], r10\n\t"
  151710. "ldr %[a], [%[a], #12]\n\t"
  151711. "ldr %[b], [%[b], #48]\n\t"
  151712. "uxth r6, %[a]\n\t"
  151713. "uxth r7, %[b]\n\t"
  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 r3, r3, r7\n\t"
  151723. #else
  151724. "add r3, r3, r7\n\t"
  151725. #endif
  151726. #ifdef WOLFSSL_KEIL
  151727. "adcs r4, r4, %[r]\n\t"
  151728. #elif defined(__clang__)
  151729. "adcs r4, %[r]\n\t"
  151730. #else
  151731. "adc r4, %[r]\n\t"
  151732. #endif
  151733. #ifdef WOLFSSL_KEIL
  151734. "adcs r5, r5, %[r]\n\t"
  151735. #elif defined(__clang__)
  151736. "adcs r5, %[r]\n\t"
  151737. #else
  151738. "adc r5, %[r]\n\t"
  151739. #endif
  151740. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151741. "lsrs r7, %[b], #16\n\t"
  151742. #else
  151743. "lsr r7, %[b], #16\n\t"
  151744. #endif
  151745. #ifdef WOLFSSL_KEIL
  151746. "muls r6, r7, r6\n\t"
  151747. #elif defined(__clang__)
  151748. "muls r6, r7\n\t"
  151749. #else
  151750. "mul r6, r7\n\t"
  151751. #endif
  151752. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151753. "lsrs r7, r6, #16\n\t"
  151754. #else
  151755. "lsr r7, r6, #16\n\t"
  151756. #endif
  151757. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151758. "lsls r6, r6, #16\n\t"
  151759. #else
  151760. "lsl r6, r6, #16\n\t"
  151761. #endif
  151762. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151763. "adds r3, r3, r6\n\t"
  151764. #else
  151765. "add r3, r3, r6\n\t"
  151766. #endif
  151767. #ifdef WOLFSSL_KEIL
  151768. "adcs r4, r4, r7\n\t"
  151769. #elif defined(__clang__)
  151770. "adcs r4, r7\n\t"
  151771. #else
  151772. "adc r4, r7\n\t"
  151773. #endif
  151774. #ifdef WOLFSSL_KEIL
  151775. "adcs r5, r5, %[r]\n\t"
  151776. #elif defined(__clang__)
  151777. "adcs r5, %[r]\n\t"
  151778. #else
  151779. "adc r5, %[r]\n\t"
  151780. #endif
  151781. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151782. "lsrs r6, %[a], #16\n\t"
  151783. #else
  151784. "lsr r6, %[a], #16\n\t"
  151785. #endif
  151786. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151787. "lsrs r7, %[b], #16\n\t"
  151788. #else
  151789. "lsr r7, %[b], #16\n\t"
  151790. #endif
  151791. #ifdef WOLFSSL_KEIL
  151792. "muls r7, r6, r7\n\t"
  151793. #elif defined(__clang__)
  151794. "muls r7, r6\n\t"
  151795. #else
  151796. "mul r7, r6\n\t"
  151797. #endif
  151798. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151799. "adds r4, r4, r7\n\t"
  151800. #else
  151801. "add r4, r4, r7\n\t"
  151802. #endif
  151803. #ifdef WOLFSSL_KEIL
  151804. "adcs r5, r5, %[r]\n\t"
  151805. #elif defined(__clang__)
  151806. "adcs r5, %[r]\n\t"
  151807. #else
  151808. "adc r5, %[r]\n\t"
  151809. #endif
  151810. "uxth r7, %[b]\n\t"
  151811. #ifdef WOLFSSL_KEIL
  151812. "muls r6, r7, r6\n\t"
  151813. #elif defined(__clang__)
  151814. "muls r6, r7\n\t"
  151815. #else
  151816. "mul r6, r7\n\t"
  151817. #endif
  151818. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151819. "lsrs r7, r6, #16\n\t"
  151820. #else
  151821. "lsr r7, r6, #16\n\t"
  151822. #endif
  151823. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151824. "lsls r6, r6, #16\n\t"
  151825. #else
  151826. "lsl r6, r6, #16\n\t"
  151827. #endif
  151828. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151829. "adds r3, r3, r6\n\t"
  151830. #else
  151831. "add r3, r3, r6\n\t"
  151832. #endif
  151833. #ifdef WOLFSSL_KEIL
  151834. "adcs r4, r4, r7\n\t"
  151835. #elif defined(__clang__)
  151836. "adcs r4, r7\n\t"
  151837. #else
  151838. "adc r4, r7\n\t"
  151839. #endif
  151840. #ifdef WOLFSSL_KEIL
  151841. "adcs r5, r5, %[r]\n\t"
  151842. #elif defined(__clang__)
  151843. "adcs r5, %[r]\n\t"
  151844. #else
  151845. "adc r5, %[r]\n\t"
  151846. #endif
  151847. "# A[4] * B[11]\n\t"
  151848. "mov %[a], r9\n\t"
  151849. "mov %[b], r10\n\t"
  151850. "ldr %[a], [%[a], #16]\n\t"
  151851. "ldr %[b], [%[b], #44]\n\t"
  151852. "uxth r6, %[a]\n\t"
  151853. "uxth r7, %[b]\n\t"
  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 r3, r3, r7\n\t"
  151863. #else
  151864. "add r3, r3, r7\n\t"
  151865. #endif
  151866. #ifdef WOLFSSL_KEIL
  151867. "adcs r4, r4, %[r]\n\t"
  151868. #elif defined(__clang__)
  151869. "adcs r4, %[r]\n\t"
  151870. #else
  151871. "adc r4, %[r]\n\t"
  151872. #endif
  151873. #ifdef WOLFSSL_KEIL
  151874. "adcs r5, r5, %[r]\n\t"
  151875. #elif defined(__clang__)
  151876. "adcs r5, %[r]\n\t"
  151877. #else
  151878. "adc r5, %[r]\n\t"
  151879. #endif
  151880. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151881. "lsrs r7, %[b], #16\n\t"
  151882. #else
  151883. "lsr r7, %[b], #16\n\t"
  151884. #endif
  151885. #ifdef WOLFSSL_KEIL
  151886. "muls r6, r7, r6\n\t"
  151887. #elif defined(__clang__)
  151888. "muls r6, r7\n\t"
  151889. #else
  151890. "mul r6, r7\n\t"
  151891. #endif
  151892. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151893. "lsrs r7, r6, #16\n\t"
  151894. #else
  151895. "lsr r7, r6, #16\n\t"
  151896. #endif
  151897. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151898. "lsls r6, r6, #16\n\t"
  151899. #else
  151900. "lsl r6, r6, #16\n\t"
  151901. #endif
  151902. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151903. "adds r3, r3, r6\n\t"
  151904. #else
  151905. "add r3, r3, r6\n\t"
  151906. #endif
  151907. #ifdef WOLFSSL_KEIL
  151908. "adcs r4, r4, r7\n\t"
  151909. #elif defined(__clang__)
  151910. "adcs r4, r7\n\t"
  151911. #else
  151912. "adc r4, r7\n\t"
  151913. #endif
  151914. #ifdef WOLFSSL_KEIL
  151915. "adcs r5, r5, %[r]\n\t"
  151916. #elif defined(__clang__)
  151917. "adcs r5, %[r]\n\t"
  151918. #else
  151919. "adc r5, %[r]\n\t"
  151920. #endif
  151921. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151922. "lsrs r6, %[a], #16\n\t"
  151923. #else
  151924. "lsr r6, %[a], #16\n\t"
  151925. #endif
  151926. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151927. "lsrs r7, %[b], #16\n\t"
  151928. #else
  151929. "lsr r7, %[b], #16\n\t"
  151930. #endif
  151931. #ifdef WOLFSSL_KEIL
  151932. "muls r7, r6, r7\n\t"
  151933. #elif defined(__clang__)
  151934. "muls r7, r6\n\t"
  151935. #else
  151936. "mul r7, r6\n\t"
  151937. #endif
  151938. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151939. "adds r4, r4, r7\n\t"
  151940. #else
  151941. "add r4, r4, r7\n\t"
  151942. #endif
  151943. #ifdef WOLFSSL_KEIL
  151944. "adcs r5, r5, %[r]\n\t"
  151945. #elif defined(__clang__)
  151946. "adcs r5, %[r]\n\t"
  151947. #else
  151948. "adc r5, %[r]\n\t"
  151949. #endif
  151950. "uxth r7, %[b]\n\t"
  151951. #ifdef WOLFSSL_KEIL
  151952. "muls r6, r7, r6\n\t"
  151953. #elif defined(__clang__)
  151954. "muls r6, r7\n\t"
  151955. #else
  151956. "mul r6, r7\n\t"
  151957. #endif
  151958. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151959. "lsrs r7, r6, #16\n\t"
  151960. #else
  151961. "lsr r7, r6, #16\n\t"
  151962. #endif
  151963. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151964. "lsls r6, r6, #16\n\t"
  151965. #else
  151966. "lsl r6, r6, #16\n\t"
  151967. #endif
  151968. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151969. "adds r3, r3, r6\n\t"
  151970. #else
  151971. "add r3, r3, r6\n\t"
  151972. #endif
  151973. #ifdef WOLFSSL_KEIL
  151974. "adcs r4, r4, r7\n\t"
  151975. #elif defined(__clang__)
  151976. "adcs r4, r7\n\t"
  151977. #else
  151978. "adc r4, r7\n\t"
  151979. #endif
  151980. #ifdef WOLFSSL_KEIL
  151981. "adcs r5, r5, %[r]\n\t"
  151982. #elif defined(__clang__)
  151983. "adcs r5, %[r]\n\t"
  151984. #else
  151985. "adc r5, %[r]\n\t"
  151986. #endif
  151987. "# A[5] * B[10]\n\t"
  151988. "mov %[a], r9\n\t"
  151989. "mov %[b], r10\n\t"
  151990. "ldr %[a], [%[a], #20]\n\t"
  151991. "ldr %[b], [%[b], #40]\n\t"
  151992. "uxth r6, %[a]\n\t"
  151993. "uxth r7, %[b]\n\t"
  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 r3, r3, r7\n\t"
  152003. #else
  152004. "add r3, r3, r7\n\t"
  152005. #endif
  152006. #ifdef WOLFSSL_KEIL
  152007. "adcs r4, r4, %[r]\n\t"
  152008. #elif defined(__clang__)
  152009. "adcs r4, %[r]\n\t"
  152010. #else
  152011. "adc r4, %[r]\n\t"
  152012. #endif
  152013. #ifdef WOLFSSL_KEIL
  152014. "adcs r5, r5, %[r]\n\t"
  152015. #elif defined(__clang__)
  152016. "adcs r5, %[r]\n\t"
  152017. #else
  152018. "adc r5, %[r]\n\t"
  152019. #endif
  152020. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152021. "lsrs r7, %[b], #16\n\t"
  152022. #else
  152023. "lsr r7, %[b], #16\n\t"
  152024. #endif
  152025. #ifdef WOLFSSL_KEIL
  152026. "muls r6, r7, r6\n\t"
  152027. #elif defined(__clang__)
  152028. "muls r6, r7\n\t"
  152029. #else
  152030. "mul r6, r7\n\t"
  152031. #endif
  152032. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152033. "lsrs r7, r6, #16\n\t"
  152034. #else
  152035. "lsr r7, r6, #16\n\t"
  152036. #endif
  152037. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152038. "lsls r6, r6, #16\n\t"
  152039. #else
  152040. "lsl r6, r6, #16\n\t"
  152041. #endif
  152042. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152043. "adds r3, r3, r6\n\t"
  152044. #else
  152045. "add r3, r3, r6\n\t"
  152046. #endif
  152047. #ifdef WOLFSSL_KEIL
  152048. "adcs r4, r4, r7\n\t"
  152049. #elif defined(__clang__)
  152050. "adcs r4, r7\n\t"
  152051. #else
  152052. "adc r4, r7\n\t"
  152053. #endif
  152054. #ifdef WOLFSSL_KEIL
  152055. "adcs r5, r5, %[r]\n\t"
  152056. #elif defined(__clang__)
  152057. "adcs r5, %[r]\n\t"
  152058. #else
  152059. "adc r5, %[r]\n\t"
  152060. #endif
  152061. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152062. "lsrs r6, %[a], #16\n\t"
  152063. #else
  152064. "lsr r6, %[a], #16\n\t"
  152065. #endif
  152066. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152067. "lsrs r7, %[b], #16\n\t"
  152068. #else
  152069. "lsr r7, %[b], #16\n\t"
  152070. #endif
  152071. #ifdef WOLFSSL_KEIL
  152072. "muls r7, r6, r7\n\t"
  152073. #elif defined(__clang__)
  152074. "muls r7, r6\n\t"
  152075. #else
  152076. "mul r7, r6\n\t"
  152077. #endif
  152078. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152079. "adds r4, r4, r7\n\t"
  152080. #else
  152081. "add r4, r4, r7\n\t"
  152082. #endif
  152083. #ifdef WOLFSSL_KEIL
  152084. "adcs r5, r5, %[r]\n\t"
  152085. #elif defined(__clang__)
  152086. "adcs r5, %[r]\n\t"
  152087. #else
  152088. "adc r5, %[r]\n\t"
  152089. #endif
  152090. "uxth r7, %[b]\n\t"
  152091. #ifdef WOLFSSL_KEIL
  152092. "muls r6, r7, r6\n\t"
  152093. #elif defined(__clang__)
  152094. "muls r6, r7\n\t"
  152095. #else
  152096. "mul r6, r7\n\t"
  152097. #endif
  152098. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152099. "lsrs r7, r6, #16\n\t"
  152100. #else
  152101. "lsr r7, r6, #16\n\t"
  152102. #endif
  152103. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152104. "lsls r6, r6, #16\n\t"
  152105. #else
  152106. "lsl r6, r6, #16\n\t"
  152107. #endif
  152108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152109. "adds r3, r3, r6\n\t"
  152110. #else
  152111. "add r3, r3, r6\n\t"
  152112. #endif
  152113. #ifdef WOLFSSL_KEIL
  152114. "adcs r4, r4, r7\n\t"
  152115. #elif defined(__clang__)
  152116. "adcs r4, r7\n\t"
  152117. #else
  152118. "adc r4, r7\n\t"
  152119. #endif
  152120. #ifdef WOLFSSL_KEIL
  152121. "adcs r5, r5, %[r]\n\t"
  152122. #elif defined(__clang__)
  152123. "adcs r5, %[r]\n\t"
  152124. #else
  152125. "adc r5, %[r]\n\t"
  152126. #endif
  152127. "# A[6] * B[9]\n\t"
  152128. "mov %[a], r9\n\t"
  152129. "mov %[b], r10\n\t"
  152130. "ldr %[a], [%[a], #24]\n\t"
  152131. "ldr %[b], [%[b], #36]\n\t"
  152132. "uxth r6, %[a]\n\t"
  152133. "uxth r7, %[b]\n\t"
  152134. #ifdef WOLFSSL_KEIL
  152135. "muls r7, r6, r7\n\t"
  152136. #elif defined(__clang__)
  152137. "muls r7, r6\n\t"
  152138. #else
  152139. "mul r7, r6\n\t"
  152140. #endif
  152141. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152142. "adds r3, r3, r7\n\t"
  152143. #else
  152144. "add r3, r3, r7\n\t"
  152145. #endif
  152146. #ifdef WOLFSSL_KEIL
  152147. "adcs r4, r4, %[r]\n\t"
  152148. #elif defined(__clang__)
  152149. "adcs r4, %[r]\n\t"
  152150. #else
  152151. "adc r4, %[r]\n\t"
  152152. #endif
  152153. #ifdef WOLFSSL_KEIL
  152154. "adcs r5, r5, %[r]\n\t"
  152155. #elif defined(__clang__)
  152156. "adcs r5, %[r]\n\t"
  152157. #else
  152158. "adc r5, %[r]\n\t"
  152159. #endif
  152160. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152161. "lsrs r7, %[b], #16\n\t"
  152162. #else
  152163. "lsr r7, %[b], #16\n\t"
  152164. #endif
  152165. #ifdef WOLFSSL_KEIL
  152166. "muls r6, r7, r6\n\t"
  152167. #elif defined(__clang__)
  152168. "muls r6, r7\n\t"
  152169. #else
  152170. "mul r6, r7\n\t"
  152171. #endif
  152172. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152173. "lsrs r7, r6, #16\n\t"
  152174. #else
  152175. "lsr r7, r6, #16\n\t"
  152176. #endif
  152177. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152178. "lsls r6, r6, #16\n\t"
  152179. #else
  152180. "lsl r6, r6, #16\n\t"
  152181. #endif
  152182. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152183. "adds r3, r3, r6\n\t"
  152184. #else
  152185. "add r3, r3, r6\n\t"
  152186. #endif
  152187. #ifdef WOLFSSL_KEIL
  152188. "adcs r4, r4, r7\n\t"
  152189. #elif defined(__clang__)
  152190. "adcs r4, r7\n\t"
  152191. #else
  152192. "adc r4, r7\n\t"
  152193. #endif
  152194. #ifdef WOLFSSL_KEIL
  152195. "adcs r5, r5, %[r]\n\t"
  152196. #elif defined(__clang__)
  152197. "adcs r5, %[r]\n\t"
  152198. #else
  152199. "adc r5, %[r]\n\t"
  152200. #endif
  152201. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152202. "lsrs r6, %[a], #16\n\t"
  152203. #else
  152204. "lsr r6, %[a], #16\n\t"
  152205. #endif
  152206. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152207. "lsrs r7, %[b], #16\n\t"
  152208. #else
  152209. "lsr r7, %[b], #16\n\t"
  152210. #endif
  152211. #ifdef WOLFSSL_KEIL
  152212. "muls r7, r6, r7\n\t"
  152213. #elif defined(__clang__)
  152214. "muls r7, r6\n\t"
  152215. #else
  152216. "mul r7, r6\n\t"
  152217. #endif
  152218. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152219. "adds r4, r4, r7\n\t"
  152220. #else
  152221. "add r4, r4, r7\n\t"
  152222. #endif
  152223. #ifdef WOLFSSL_KEIL
  152224. "adcs r5, r5, %[r]\n\t"
  152225. #elif defined(__clang__)
  152226. "adcs r5, %[r]\n\t"
  152227. #else
  152228. "adc r5, %[r]\n\t"
  152229. #endif
  152230. "uxth r7, %[b]\n\t"
  152231. #ifdef WOLFSSL_KEIL
  152232. "muls r6, r7, r6\n\t"
  152233. #elif defined(__clang__)
  152234. "muls r6, r7\n\t"
  152235. #else
  152236. "mul r6, r7\n\t"
  152237. #endif
  152238. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152239. "lsrs r7, r6, #16\n\t"
  152240. #else
  152241. "lsr r7, r6, #16\n\t"
  152242. #endif
  152243. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152244. "lsls r6, r6, #16\n\t"
  152245. #else
  152246. "lsl r6, r6, #16\n\t"
  152247. #endif
  152248. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152249. "adds r3, r3, r6\n\t"
  152250. #else
  152251. "add r3, r3, r6\n\t"
  152252. #endif
  152253. #ifdef WOLFSSL_KEIL
  152254. "adcs r4, r4, r7\n\t"
  152255. #elif defined(__clang__)
  152256. "adcs r4, r7\n\t"
  152257. #else
  152258. "adc r4, r7\n\t"
  152259. #endif
  152260. #ifdef WOLFSSL_KEIL
  152261. "adcs r5, r5, %[r]\n\t"
  152262. #elif defined(__clang__)
  152263. "adcs r5, %[r]\n\t"
  152264. #else
  152265. "adc r5, %[r]\n\t"
  152266. #endif
  152267. "# A[7] * B[8]\n\t"
  152268. "mov %[a], r9\n\t"
  152269. "mov %[b], r10\n\t"
  152270. "ldr %[a], [%[a], #28]\n\t"
  152271. "ldr %[b], [%[b], #32]\n\t"
  152272. "uxth r6, %[a]\n\t"
  152273. "uxth r7, %[b]\n\t"
  152274. #ifdef WOLFSSL_KEIL
  152275. "muls r7, r6, r7\n\t"
  152276. #elif defined(__clang__)
  152277. "muls r7, r6\n\t"
  152278. #else
  152279. "mul r7, r6\n\t"
  152280. #endif
  152281. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152282. "adds r3, r3, r7\n\t"
  152283. #else
  152284. "add r3, r3, r7\n\t"
  152285. #endif
  152286. #ifdef WOLFSSL_KEIL
  152287. "adcs r4, r4, %[r]\n\t"
  152288. #elif defined(__clang__)
  152289. "adcs r4, %[r]\n\t"
  152290. #else
  152291. "adc r4, %[r]\n\t"
  152292. #endif
  152293. #ifdef WOLFSSL_KEIL
  152294. "adcs r5, r5, %[r]\n\t"
  152295. #elif defined(__clang__)
  152296. "adcs r5, %[r]\n\t"
  152297. #else
  152298. "adc r5, %[r]\n\t"
  152299. #endif
  152300. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152301. "lsrs r7, %[b], #16\n\t"
  152302. #else
  152303. "lsr r7, %[b], #16\n\t"
  152304. #endif
  152305. #ifdef WOLFSSL_KEIL
  152306. "muls r6, r7, r6\n\t"
  152307. #elif defined(__clang__)
  152308. "muls r6, r7\n\t"
  152309. #else
  152310. "mul r6, r7\n\t"
  152311. #endif
  152312. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152313. "lsrs r7, r6, #16\n\t"
  152314. #else
  152315. "lsr r7, r6, #16\n\t"
  152316. #endif
  152317. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152318. "lsls r6, r6, #16\n\t"
  152319. #else
  152320. "lsl r6, r6, #16\n\t"
  152321. #endif
  152322. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152323. "adds r3, r3, r6\n\t"
  152324. #else
  152325. "add r3, r3, r6\n\t"
  152326. #endif
  152327. #ifdef WOLFSSL_KEIL
  152328. "adcs r4, r4, r7\n\t"
  152329. #elif defined(__clang__)
  152330. "adcs r4, r7\n\t"
  152331. #else
  152332. "adc r4, r7\n\t"
  152333. #endif
  152334. #ifdef WOLFSSL_KEIL
  152335. "adcs r5, r5, %[r]\n\t"
  152336. #elif defined(__clang__)
  152337. "adcs r5, %[r]\n\t"
  152338. #else
  152339. "adc r5, %[r]\n\t"
  152340. #endif
  152341. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152342. "lsrs r6, %[a], #16\n\t"
  152343. #else
  152344. "lsr r6, %[a], #16\n\t"
  152345. #endif
  152346. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152347. "lsrs r7, %[b], #16\n\t"
  152348. #else
  152349. "lsr r7, %[b], #16\n\t"
  152350. #endif
  152351. #ifdef WOLFSSL_KEIL
  152352. "muls r7, r6, r7\n\t"
  152353. #elif defined(__clang__)
  152354. "muls r7, r6\n\t"
  152355. #else
  152356. "mul r7, r6\n\t"
  152357. #endif
  152358. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152359. "adds r4, r4, r7\n\t"
  152360. #else
  152361. "add r4, r4, r7\n\t"
  152362. #endif
  152363. #ifdef WOLFSSL_KEIL
  152364. "adcs r5, r5, %[r]\n\t"
  152365. #elif defined(__clang__)
  152366. "adcs r5, %[r]\n\t"
  152367. #else
  152368. "adc r5, %[r]\n\t"
  152369. #endif
  152370. "uxth r7, %[b]\n\t"
  152371. #ifdef WOLFSSL_KEIL
  152372. "muls r6, r7, r6\n\t"
  152373. #elif defined(__clang__)
  152374. "muls r6, r7\n\t"
  152375. #else
  152376. "mul r6, r7\n\t"
  152377. #endif
  152378. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152379. "lsrs r7, r6, #16\n\t"
  152380. #else
  152381. "lsr r7, r6, #16\n\t"
  152382. #endif
  152383. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152384. "lsls r6, r6, #16\n\t"
  152385. #else
  152386. "lsl r6, r6, #16\n\t"
  152387. #endif
  152388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152389. "adds r3, r3, r6\n\t"
  152390. #else
  152391. "add r3, r3, r6\n\t"
  152392. #endif
  152393. #ifdef WOLFSSL_KEIL
  152394. "adcs r4, r4, r7\n\t"
  152395. #elif defined(__clang__)
  152396. "adcs r4, r7\n\t"
  152397. #else
  152398. "adc r4, r7\n\t"
  152399. #endif
  152400. #ifdef WOLFSSL_KEIL
  152401. "adcs r5, r5, %[r]\n\t"
  152402. #elif defined(__clang__)
  152403. "adcs r5, %[r]\n\t"
  152404. #else
  152405. "adc r5, %[r]\n\t"
  152406. #endif
  152407. "# A[8] * B[7]\n\t"
  152408. "mov %[a], r9\n\t"
  152409. "mov %[b], r10\n\t"
  152410. "ldr %[a], [%[a], #32]\n\t"
  152411. "ldr %[b], [%[b], #28]\n\t"
  152412. "uxth r6, %[a]\n\t"
  152413. "uxth r7, %[b]\n\t"
  152414. #ifdef WOLFSSL_KEIL
  152415. "muls r7, r6, r7\n\t"
  152416. #elif defined(__clang__)
  152417. "muls r7, r6\n\t"
  152418. #else
  152419. "mul r7, r6\n\t"
  152420. #endif
  152421. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152422. "adds r3, r3, r7\n\t"
  152423. #else
  152424. "add r3, r3, r7\n\t"
  152425. #endif
  152426. #ifdef WOLFSSL_KEIL
  152427. "adcs r4, r4, %[r]\n\t"
  152428. #elif defined(__clang__)
  152429. "adcs r4, %[r]\n\t"
  152430. #else
  152431. "adc r4, %[r]\n\t"
  152432. #endif
  152433. #ifdef WOLFSSL_KEIL
  152434. "adcs r5, r5, %[r]\n\t"
  152435. #elif defined(__clang__)
  152436. "adcs r5, %[r]\n\t"
  152437. #else
  152438. "adc r5, %[r]\n\t"
  152439. #endif
  152440. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152441. "lsrs r7, %[b], #16\n\t"
  152442. #else
  152443. "lsr r7, %[b], #16\n\t"
  152444. #endif
  152445. #ifdef WOLFSSL_KEIL
  152446. "muls r6, r7, r6\n\t"
  152447. #elif defined(__clang__)
  152448. "muls r6, r7\n\t"
  152449. #else
  152450. "mul r6, r7\n\t"
  152451. #endif
  152452. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152453. "lsrs r7, r6, #16\n\t"
  152454. #else
  152455. "lsr r7, r6, #16\n\t"
  152456. #endif
  152457. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152458. "lsls r6, r6, #16\n\t"
  152459. #else
  152460. "lsl r6, r6, #16\n\t"
  152461. #endif
  152462. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152463. "adds r3, r3, r6\n\t"
  152464. #else
  152465. "add r3, r3, r6\n\t"
  152466. #endif
  152467. #ifdef WOLFSSL_KEIL
  152468. "adcs r4, r4, r7\n\t"
  152469. #elif defined(__clang__)
  152470. "adcs r4, r7\n\t"
  152471. #else
  152472. "adc r4, r7\n\t"
  152473. #endif
  152474. #ifdef WOLFSSL_KEIL
  152475. "adcs r5, r5, %[r]\n\t"
  152476. #elif defined(__clang__)
  152477. "adcs r5, %[r]\n\t"
  152478. #else
  152479. "adc r5, %[r]\n\t"
  152480. #endif
  152481. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152482. "lsrs r6, %[a], #16\n\t"
  152483. #else
  152484. "lsr r6, %[a], #16\n\t"
  152485. #endif
  152486. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152487. "lsrs r7, %[b], #16\n\t"
  152488. #else
  152489. "lsr r7, %[b], #16\n\t"
  152490. #endif
  152491. #ifdef WOLFSSL_KEIL
  152492. "muls r7, r6, r7\n\t"
  152493. #elif defined(__clang__)
  152494. "muls r7, r6\n\t"
  152495. #else
  152496. "mul r7, r6\n\t"
  152497. #endif
  152498. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152499. "adds r4, r4, r7\n\t"
  152500. #else
  152501. "add r4, r4, r7\n\t"
  152502. #endif
  152503. #ifdef WOLFSSL_KEIL
  152504. "adcs r5, r5, %[r]\n\t"
  152505. #elif defined(__clang__)
  152506. "adcs r5, %[r]\n\t"
  152507. #else
  152508. "adc r5, %[r]\n\t"
  152509. #endif
  152510. "uxth r7, %[b]\n\t"
  152511. #ifdef WOLFSSL_KEIL
  152512. "muls r6, r7, r6\n\t"
  152513. #elif defined(__clang__)
  152514. "muls r6, r7\n\t"
  152515. #else
  152516. "mul r6, r7\n\t"
  152517. #endif
  152518. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152519. "lsrs r7, r6, #16\n\t"
  152520. #else
  152521. "lsr r7, r6, #16\n\t"
  152522. #endif
  152523. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152524. "lsls r6, r6, #16\n\t"
  152525. #else
  152526. "lsl r6, r6, #16\n\t"
  152527. #endif
  152528. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152529. "adds r3, r3, r6\n\t"
  152530. #else
  152531. "add r3, r3, r6\n\t"
  152532. #endif
  152533. #ifdef WOLFSSL_KEIL
  152534. "adcs r4, r4, r7\n\t"
  152535. #elif defined(__clang__)
  152536. "adcs r4, r7\n\t"
  152537. #else
  152538. "adc r4, r7\n\t"
  152539. #endif
  152540. #ifdef WOLFSSL_KEIL
  152541. "adcs r5, r5, %[r]\n\t"
  152542. #elif defined(__clang__)
  152543. "adcs r5, %[r]\n\t"
  152544. #else
  152545. "adc r5, %[r]\n\t"
  152546. #endif
  152547. "# A[9] * B[6]\n\t"
  152548. "mov %[a], r9\n\t"
  152549. "mov %[b], r10\n\t"
  152550. "ldr %[a], [%[a], #36]\n\t"
  152551. "ldr %[b], [%[b], #24]\n\t"
  152552. "uxth r6, %[a]\n\t"
  152553. "uxth r7, %[b]\n\t"
  152554. #ifdef WOLFSSL_KEIL
  152555. "muls r7, r6, r7\n\t"
  152556. #elif defined(__clang__)
  152557. "muls r7, r6\n\t"
  152558. #else
  152559. "mul r7, r6\n\t"
  152560. #endif
  152561. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152562. "adds r3, r3, r7\n\t"
  152563. #else
  152564. "add r3, r3, r7\n\t"
  152565. #endif
  152566. #ifdef WOLFSSL_KEIL
  152567. "adcs r4, r4, %[r]\n\t"
  152568. #elif defined(__clang__)
  152569. "adcs r4, %[r]\n\t"
  152570. #else
  152571. "adc r4, %[r]\n\t"
  152572. #endif
  152573. #ifdef WOLFSSL_KEIL
  152574. "adcs r5, r5, %[r]\n\t"
  152575. #elif defined(__clang__)
  152576. "adcs r5, %[r]\n\t"
  152577. #else
  152578. "adc r5, %[r]\n\t"
  152579. #endif
  152580. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152581. "lsrs r7, %[b], #16\n\t"
  152582. #else
  152583. "lsr r7, %[b], #16\n\t"
  152584. #endif
  152585. #ifdef WOLFSSL_KEIL
  152586. "muls r6, r7, r6\n\t"
  152587. #elif defined(__clang__)
  152588. "muls r6, r7\n\t"
  152589. #else
  152590. "mul r6, r7\n\t"
  152591. #endif
  152592. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152593. "lsrs r7, r6, #16\n\t"
  152594. #else
  152595. "lsr r7, r6, #16\n\t"
  152596. #endif
  152597. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152598. "lsls r6, r6, #16\n\t"
  152599. #else
  152600. "lsl r6, r6, #16\n\t"
  152601. #endif
  152602. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152603. "adds r3, r3, r6\n\t"
  152604. #else
  152605. "add r3, r3, r6\n\t"
  152606. #endif
  152607. #ifdef WOLFSSL_KEIL
  152608. "adcs r4, r4, r7\n\t"
  152609. #elif defined(__clang__)
  152610. "adcs r4, r7\n\t"
  152611. #else
  152612. "adc r4, r7\n\t"
  152613. #endif
  152614. #ifdef WOLFSSL_KEIL
  152615. "adcs r5, r5, %[r]\n\t"
  152616. #elif defined(__clang__)
  152617. "adcs r5, %[r]\n\t"
  152618. #else
  152619. "adc r5, %[r]\n\t"
  152620. #endif
  152621. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152622. "lsrs r6, %[a], #16\n\t"
  152623. #else
  152624. "lsr r6, %[a], #16\n\t"
  152625. #endif
  152626. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152627. "lsrs r7, %[b], #16\n\t"
  152628. #else
  152629. "lsr r7, %[b], #16\n\t"
  152630. #endif
  152631. #ifdef WOLFSSL_KEIL
  152632. "muls r7, r6, r7\n\t"
  152633. #elif defined(__clang__)
  152634. "muls r7, r6\n\t"
  152635. #else
  152636. "mul r7, r6\n\t"
  152637. #endif
  152638. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152639. "adds r4, r4, r7\n\t"
  152640. #else
  152641. "add r4, r4, r7\n\t"
  152642. #endif
  152643. #ifdef WOLFSSL_KEIL
  152644. "adcs r5, r5, %[r]\n\t"
  152645. #elif defined(__clang__)
  152646. "adcs r5, %[r]\n\t"
  152647. #else
  152648. "adc r5, %[r]\n\t"
  152649. #endif
  152650. "uxth r7, %[b]\n\t"
  152651. #ifdef WOLFSSL_KEIL
  152652. "muls r6, r7, r6\n\t"
  152653. #elif defined(__clang__)
  152654. "muls r6, r7\n\t"
  152655. #else
  152656. "mul r6, r7\n\t"
  152657. #endif
  152658. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152659. "lsrs r7, r6, #16\n\t"
  152660. #else
  152661. "lsr r7, r6, #16\n\t"
  152662. #endif
  152663. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152664. "lsls r6, r6, #16\n\t"
  152665. #else
  152666. "lsl r6, r6, #16\n\t"
  152667. #endif
  152668. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152669. "adds r3, r3, r6\n\t"
  152670. #else
  152671. "add r3, r3, r6\n\t"
  152672. #endif
  152673. #ifdef WOLFSSL_KEIL
  152674. "adcs r4, r4, r7\n\t"
  152675. #elif defined(__clang__)
  152676. "adcs r4, r7\n\t"
  152677. #else
  152678. "adc r4, r7\n\t"
  152679. #endif
  152680. #ifdef WOLFSSL_KEIL
  152681. "adcs r5, r5, %[r]\n\t"
  152682. #elif defined(__clang__)
  152683. "adcs r5, %[r]\n\t"
  152684. #else
  152685. "adc r5, %[r]\n\t"
  152686. #endif
  152687. "# A[10] * B[5]\n\t"
  152688. "mov %[a], r9\n\t"
  152689. "mov %[b], r10\n\t"
  152690. "ldr %[a], [%[a], #40]\n\t"
  152691. "ldr %[b], [%[b], #20]\n\t"
  152692. "uxth r6, %[a]\n\t"
  152693. "uxth r7, %[b]\n\t"
  152694. #ifdef WOLFSSL_KEIL
  152695. "muls r7, r6, r7\n\t"
  152696. #elif defined(__clang__)
  152697. "muls r7, r6\n\t"
  152698. #else
  152699. "mul r7, r6\n\t"
  152700. #endif
  152701. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152702. "adds r3, r3, r7\n\t"
  152703. #else
  152704. "add r3, r3, r7\n\t"
  152705. #endif
  152706. #ifdef WOLFSSL_KEIL
  152707. "adcs r4, r4, %[r]\n\t"
  152708. #elif defined(__clang__)
  152709. "adcs r4, %[r]\n\t"
  152710. #else
  152711. "adc r4, %[r]\n\t"
  152712. #endif
  152713. #ifdef WOLFSSL_KEIL
  152714. "adcs r5, r5, %[r]\n\t"
  152715. #elif defined(__clang__)
  152716. "adcs r5, %[r]\n\t"
  152717. #else
  152718. "adc r5, %[r]\n\t"
  152719. #endif
  152720. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152721. "lsrs r7, %[b], #16\n\t"
  152722. #else
  152723. "lsr r7, %[b], #16\n\t"
  152724. #endif
  152725. #ifdef WOLFSSL_KEIL
  152726. "muls r6, r7, r6\n\t"
  152727. #elif defined(__clang__)
  152728. "muls r6, r7\n\t"
  152729. #else
  152730. "mul r6, r7\n\t"
  152731. #endif
  152732. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152733. "lsrs r7, r6, #16\n\t"
  152734. #else
  152735. "lsr r7, r6, #16\n\t"
  152736. #endif
  152737. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152738. "lsls r6, r6, #16\n\t"
  152739. #else
  152740. "lsl r6, r6, #16\n\t"
  152741. #endif
  152742. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152743. "adds r3, r3, r6\n\t"
  152744. #else
  152745. "add r3, r3, r6\n\t"
  152746. #endif
  152747. #ifdef WOLFSSL_KEIL
  152748. "adcs r4, r4, r7\n\t"
  152749. #elif defined(__clang__)
  152750. "adcs r4, r7\n\t"
  152751. #else
  152752. "adc r4, r7\n\t"
  152753. #endif
  152754. #ifdef WOLFSSL_KEIL
  152755. "adcs r5, r5, %[r]\n\t"
  152756. #elif defined(__clang__)
  152757. "adcs r5, %[r]\n\t"
  152758. #else
  152759. "adc r5, %[r]\n\t"
  152760. #endif
  152761. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152762. "lsrs r6, %[a], #16\n\t"
  152763. #else
  152764. "lsr r6, %[a], #16\n\t"
  152765. #endif
  152766. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152767. "lsrs r7, %[b], #16\n\t"
  152768. #else
  152769. "lsr r7, %[b], #16\n\t"
  152770. #endif
  152771. #ifdef WOLFSSL_KEIL
  152772. "muls r7, r6, r7\n\t"
  152773. #elif defined(__clang__)
  152774. "muls r7, r6\n\t"
  152775. #else
  152776. "mul r7, r6\n\t"
  152777. #endif
  152778. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152779. "adds r4, r4, r7\n\t"
  152780. #else
  152781. "add r4, r4, r7\n\t"
  152782. #endif
  152783. #ifdef WOLFSSL_KEIL
  152784. "adcs r5, r5, %[r]\n\t"
  152785. #elif defined(__clang__)
  152786. "adcs r5, %[r]\n\t"
  152787. #else
  152788. "adc r5, %[r]\n\t"
  152789. #endif
  152790. "uxth r7, %[b]\n\t"
  152791. #ifdef WOLFSSL_KEIL
  152792. "muls r6, r7, r6\n\t"
  152793. #elif defined(__clang__)
  152794. "muls r6, r7\n\t"
  152795. #else
  152796. "mul r6, r7\n\t"
  152797. #endif
  152798. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152799. "lsrs r7, r6, #16\n\t"
  152800. #else
  152801. "lsr r7, r6, #16\n\t"
  152802. #endif
  152803. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152804. "lsls r6, r6, #16\n\t"
  152805. #else
  152806. "lsl r6, r6, #16\n\t"
  152807. #endif
  152808. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152809. "adds r3, r3, r6\n\t"
  152810. #else
  152811. "add r3, r3, r6\n\t"
  152812. #endif
  152813. #ifdef WOLFSSL_KEIL
  152814. "adcs r4, r4, r7\n\t"
  152815. #elif defined(__clang__)
  152816. "adcs r4, r7\n\t"
  152817. #else
  152818. "adc r4, r7\n\t"
  152819. #endif
  152820. #ifdef WOLFSSL_KEIL
  152821. "adcs r5, r5, %[r]\n\t"
  152822. #elif defined(__clang__)
  152823. "adcs r5, %[r]\n\t"
  152824. #else
  152825. "adc r5, %[r]\n\t"
  152826. #endif
  152827. "# A[11] * B[4]\n\t"
  152828. "mov %[a], r9\n\t"
  152829. "mov %[b], r10\n\t"
  152830. "ldr %[a], [%[a], #44]\n\t"
  152831. "ldr %[b], [%[b], #16]\n\t"
  152832. "uxth r6, %[a]\n\t"
  152833. "uxth r7, %[b]\n\t"
  152834. #ifdef WOLFSSL_KEIL
  152835. "muls r7, r6, r7\n\t"
  152836. #elif defined(__clang__)
  152837. "muls r7, r6\n\t"
  152838. #else
  152839. "mul r7, r6\n\t"
  152840. #endif
  152841. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152842. "adds r3, r3, r7\n\t"
  152843. #else
  152844. "add r3, r3, r7\n\t"
  152845. #endif
  152846. #ifdef WOLFSSL_KEIL
  152847. "adcs r4, r4, %[r]\n\t"
  152848. #elif defined(__clang__)
  152849. "adcs r4, %[r]\n\t"
  152850. #else
  152851. "adc r4, %[r]\n\t"
  152852. #endif
  152853. #ifdef WOLFSSL_KEIL
  152854. "adcs r5, r5, %[r]\n\t"
  152855. #elif defined(__clang__)
  152856. "adcs r5, %[r]\n\t"
  152857. #else
  152858. "adc r5, %[r]\n\t"
  152859. #endif
  152860. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152861. "lsrs r7, %[b], #16\n\t"
  152862. #else
  152863. "lsr r7, %[b], #16\n\t"
  152864. #endif
  152865. #ifdef WOLFSSL_KEIL
  152866. "muls r6, r7, r6\n\t"
  152867. #elif defined(__clang__)
  152868. "muls r6, r7\n\t"
  152869. #else
  152870. "mul r6, r7\n\t"
  152871. #endif
  152872. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152873. "lsrs r7, r6, #16\n\t"
  152874. #else
  152875. "lsr r7, r6, #16\n\t"
  152876. #endif
  152877. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152878. "lsls r6, r6, #16\n\t"
  152879. #else
  152880. "lsl r6, r6, #16\n\t"
  152881. #endif
  152882. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152883. "adds r3, r3, r6\n\t"
  152884. #else
  152885. "add r3, r3, r6\n\t"
  152886. #endif
  152887. #ifdef WOLFSSL_KEIL
  152888. "adcs r4, r4, r7\n\t"
  152889. #elif defined(__clang__)
  152890. "adcs r4, r7\n\t"
  152891. #else
  152892. "adc r4, r7\n\t"
  152893. #endif
  152894. #ifdef WOLFSSL_KEIL
  152895. "adcs r5, r5, %[r]\n\t"
  152896. #elif defined(__clang__)
  152897. "adcs r5, %[r]\n\t"
  152898. #else
  152899. "adc r5, %[r]\n\t"
  152900. #endif
  152901. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152902. "lsrs r6, %[a], #16\n\t"
  152903. #else
  152904. "lsr r6, %[a], #16\n\t"
  152905. #endif
  152906. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152907. "lsrs r7, %[b], #16\n\t"
  152908. #else
  152909. "lsr r7, %[b], #16\n\t"
  152910. #endif
  152911. #ifdef WOLFSSL_KEIL
  152912. "muls r7, r6, r7\n\t"
  152913. #elif defined(__clang__)
  152914. "muls r7, r6\n\t"
  152915. #else
  152916. "mul r7, r6\n\t"
  152917. #endif
  152918. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152919. "adds r4, r4, r7\n\t"
  152920. #else
  152921. "add r4, r4, r7\n\t"
  152922. #endif
  152923. #ifdef WOLFSSL_KEIL
  152924. "adcs r5, r5, %[r]\n\t"
  152925. #elif defined(__clang__)
  152926. "adcs r5, %[r]\n\t"
  152927. #else
  152928. "adc r5, %[r]\n\t"
  152929. #endif
  152930. "uxth r7, %[b]\n\t"
  152931. #ifdef WOLFSSL_KEIL
  152932. "muls r6, r7, r6\n\t"
  152933. #elif defined(__clang__)
  152934. "muls r6, r7\n\t"
  152935. #else
  152936. "mul r6, r7\n\t"
  152937. #endif
  152938. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152939. "lsrs r7, r6, #16\n\t"
  152940. #else
  152941. "lsr r7, r6, #16\n\t"
  152942. #endif
  152943. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152944. "lsls r6, r6, #16\n\t"
  152945. #else
  152946. "lsl r6, r6, #16\n\t"
  152947. #endif
  152948. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152949. "adds r3, r3, r6\n\t"
  152950. #else
  152951. "add r3, r3, r6\n\t"
  152952. #endif
  152953. #ifdef WOLFSSL_KEIL
  152954. "adcs r4, r4, r7\n\t"
  152955. #elif defined(__clang__)
  152956. "adcs r4, r7\n\t"
  152957. #else
  152958. "adc r4, r7\n\t"
  152959. #endif
  152960. #ifdef WOLFSSL_KEIL
  152961. "adcs r5, r5, %[r]\n\t"
  152962. #elif defined(__clang__)
  152963. "adcs r5, %[r]\n\t"
  152964. #else
  152965. "adc r5, %[r]\n\t"
  152966. #endif
  152967. "# A[12] * B[3]\n\t"
  152968. "mov %[a], r9\n\t"
  152969. "mov %[b], r10\n\t"
  152970. "ldr %[a], [%[a], #48]\n\t"
  152971. "ldr %[b], [%[b], #12]\n\t"
  152972. "uxth r6, %[a]\n\t"
  152973. "uxth r7, %[b]\n\t"
  152974. #ifdef WOLFSSL_KEIL
  152975. "muls r7, r6, r7\n\t"
  152976. #elif defined(__clang__)
  152977. "muls r7, r6\n\t"
  152978. #else
  152979. "mul r7, r6\n\t"
  152980. #endif
  152981. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152982. "adds r3, r3, r7\n\t"
  152983. #else
  152984. "add r3, r3, r7\n\t"
  152985. #endif
  152986. #ifdef WOLFSSL_KEIL
  152987. "adcs r4, r4, %[r]\n\t"
  152988. #elif defined(__clang__)
  152989. "adcs r4, %[r]\n\t"
  152990. #else
  152991. "adc r4, %[r]\n\t"
  152992. #endif
  152993. #ifdef WOLFSSL_KEIL
  152994. "adcs r5, r5, %[r]\n\t"
  152995. #elif defined(__clang__)
  152996. "adcs r5, %[r]\n\t"
  152997. #else
  152998. "adc r5, %[r]\n\t"
  152999. #endif
  153000. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153001. "lsrs r7, %[b], #16\n\t"
  153002. #else
  153003. "lsr r7, %[b], #16\n\t"
  153004. #endif
  153005. #ifdef WOLFSSL_KEIL
  153006. "muls r6, r7, r6\n\t"
  153007. #elif defined(__clang__)
  153008. "muls r6, r7\n\t"
  153009. #else
  153010. "mul r6, r7\n\t"
  153011. #endif
  153012. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153013. "lsrs r7, r6, #16\n\t"
  153014. #else
  153015. "lsr r7, r6, #16\n\t"
  153016. #endif
  153017. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153018. "lsls r6, r6, #16\n\t"
  153019. #else
  153020. "lsl r6, r6, #16\n\t"
  153021. #endif
  153022. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153023. "adds r3, r3, r6\n\t"
  153024. #else
  153025. "add r3, r3, r6\n\t"
  153026. #endif
  153027. #ifdef WOLFSSL_KEIL
  153028. "adcs r4, r4, r7\n\t"
  153029. #elif defined(__clang__)
  153030. "adcs r4, r7\n\t"
  153031. #else
  153032. "adc r4, r7\n\t"
  153033. #endif
  153034. #ifdef WOLFSSL_KEIL
  153035. "adcs r5, r5, %[r]\n\t"
  153036. #elif defined(__clang__)
  153037. "adcs r5, %[r]\n\t"
  153038. #else
  153039. "adc r5, %[r]\n\t"
  153040. #endif
  153041. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153042. "lsrs r6, %[a], #16\n\t"
  153043. #else
  153044. "lsr r6, %[a], #16\n\t"
  153045. #endif
  153046. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153047. "lsrs r7, %[b], #16\n\t"
  153048. #else
  153049. "lsr r7, %[b], #16\n\t"
  153050. #endif
  153051. #ifdef WOLFSSL_KEIL
  153052. "muls r7, r6, r7\n\t"
  153053. #elif defined(__clang__)
  153054. "muls r7, r6\n\t"
  153055. #else
  153056. "mul r7, r6\n\t"
  153057. #endif
  153058. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153059. "adds r4, r4, r7\n\t"
  153060. #else
  153061. "add r4, r4, r7\n\t"
  153062. #endif
  153063. #ifdef WOLFSSL_KEIL
  153064. "adcs r5, r5, %[r]\n\t"
  153065. #elif defined(__clang__)
  153066. "adcs r5, %[r]\n\t"
  153067. #else
  153068. "adc r5, %[r]\n\t"
  153069. #endif
  153070. "uxth r7, %[b]\n\t"
  153071. #ifdef WOLFSSL_KEIL
  153072. "muls r6, r7, r6\n\t"
  153073. #elif defined(__clang__)
  153074. "muls r6, r7\n\t"
  153075. #else
  153076. "mul r6, r7\n\t"
  153077. #endif
  153078. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153079. "lsrs r7, r6, #16\n\t"
  153080. #else
  153081. "lsr r7, r6, #16\n\t"
  153082. #endif
  153083. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153084. "lsls r6, r6, #16\n\t"
  153085. #else
  153086. "lsl r6, r6, #16\n\t"
  153087. #endif
  153088. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153089. "adds r3, r3, r6\n\t"
  153090. #else
  153091. "add r3, r3, r6\n\t"
  153092. #endif
  153093. #ifdef WOLFSSL_KEIL
  153094. "adcs r4, r4, r7\n\t"
  153095. #elif defined(__clang__)
  153096. "adcs r4, r7\n\t"
  153097. #else
  153098. "adc r4, r7\n\t"
  153099. #endif
  153100. #ifdef WOLFSSL_KEIL
  153101. "adcs r5, r5, %[r]\n\t"
  153102. #elif defined(__clang__)
  153103. "adcs r5, %[r]\n\t"
  153104. #else
  153105. "adc r5, %[r]\n\t"
  153106. #endif
  153107. "# A[13] * B[2]\n\t"
  153108. "mov %[a], r9\n\t"
  153109. "mov %[b], r10\n\t"
  153110. "ldr %[a], [%[a], #52]\n\t"
  153111. "ldr %[b], [%[b], #8]\n\t"
  153112. "uxth r6, %[a]\n\t"
  153113. "uxth r7, %[b]\n\t"
  153114. #ifdef WOLFSSL_KEIL
  153115. "muls r7, r6, r7\n\t"
  153116. #elif defined(__clang__)
  153117. "muls r7, r6\n\t"
  153118. #else
  153119. "mul r7, r6\n\t"
  153120. #endif
  153121. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153122. "adds r3, r3, r7\n\t"
  153123. #else
  153124. "add r3, r3, r7\n\t"
  153125. #endif
  153126. #ifdef WOLFSSL_KEIL
  153127. "adcs r4, r4, %[r]\n\t"
  153128. #elif defined(__clang__)
  153129. "adcs r4, %[r]\n\t"
  153130. #else
  153131. "adc r4, %[r]\n\t"
  153132. #endif
  153133. #ifdef WOLFSSL_KEIL
  153134. "adcs r5, r5, %[r]\n\t"
  153135. #elif defined(__clang__)
  153136. "adcs r5, %[r]\n\t"
  153137. #else
  153138. "adc r5, %[r]\n\t"
  153139. #endif
  153140. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153141. "lsrs r7, %[b], #16\n\t"
  153142. #else
  153143. "lsr r7, %[b], #16\n\t"
  153144. #endif
  153145. #ifdef WOLFSSL_KEIL
  153146. "muls r6, r7, r6\n\t"
  153147. #elif defined(__clang__)
  153148. "muls r6, r7\n\t"
  153149. #else
  153150. "mul r6, r7\n\t"
  153151. #endif
  153152. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153153. "lsrs r7, r6, #16\n\t"
  153154. #else
  153155. "lsr r7, r6, #16\n\t"
  153156. #endif
  153157. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153158. "lsls r6, r6, #16\n\t"
  153159. #else
  153160. "lsl r6, r6, #16\n\t"
  153161. #endif
  153162. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153163. "adds r3, r3, r6\n\t"
  153164. #else
  153165. "add r3, r3, r6\n\t"
  153166. #endif
  153167. #ifdef WOLFSSL_KEIL
  153168. "adcs r4, r4, r7\n\t"
  153169. #elif defined(__clang__)
  153170. "adcs r4, r7\n\t"
  153171. #else
  153172. "adc r4, r7\n\t"
  153173. #endif
  153174. #ifdef WOLFSSL_KEIL
  153175. "adcs r5, r5, %[r]\n\t"
  153176. #elif defined(__clang__)
  153177. "adcs r5, %[r]\n\t"
  153178. #else
  153179. "adc r5, %[r]\n\t"
  153180. #endif
  153181. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153182. "lsrs r6, %[a], #16\n\t"
  153183. #else
  153184. "lsr r6, %[a], #16\n\t"
  153185. #endif
  153186. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153187. "lsrs r7, %[b], #16\n\t"
  153188. #else
  153189. "lsr r7, %[b], #16\n\t"
  153190. #endif
  153191. #ifdef WOLFSSL_KEIL
  153192. "muls r7, r6, r7\n\t"
  153193. #elif defined(__clang__)
  153194. "muls r7, r6\n\t"
  153195. #else
  153196. "mul r7, r6\n\t"
  153197. #endif
  153198. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153199. "adds r4, r4, r7\n\t"
  153200. #else
  153201. "add r4, r4, r7\n\t"
  153202. #endif
  153203. #ifdef WOLFSSL_KEIL
  153204. "adcs r5, r5, %[r]\n\t"
  153205. #elif defined(__clang__)
  153206. "adcs r5, %[r]\n\t"
  153207. #else
  153208. "adc r5, %[r]\n\t"
  153209. #endif
  153210. "uxth r7, %[b]\n\t"
  153211. #ifdef WOLFSSL_KEIL
  153212. "muls r6, r7, r6\n\t"
  153213. #elif defined(__clang__)
  153214. "muls r6, r7\n\t"
  153215. #else
  153216. "mul r6, r7\n\t"
  153217. #endif
  153218. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153219. "lsrs r7, r6, #16\n\t"
  153220. #else
  153221. "lsr r7, r6, #16\n\t"
  153222. #endif
  153223. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153224. "lsls r6, r6, #16\n\t"
  153225. #else
  153226. "lsl r6, r6, #16\n\t"
  153227. #endif
  153228. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153229. "adds r3, r3, r6\n\t"
  153230. #else
  153231. "add r3, r3, r6\n\t"
  153232. #endif
  153233. #ifdef WOLFSSL_KEIL
  153234. "adcs r4, r4, r7\n\t"
  153235. #elif defined(__clang__)
  153236. "adcs r4, r7\n\t"
  153237. #else
  153238. "adc r4, r7\n\t"
  153239. #endif
  153240. #ifdef WOLFSSL_KEIL
  153241. "adcs r5, r5, %[r]\n\t"
  153242. #elif defined(__clang__)
  153243. "adcs r5, %[r]\n\t"
  153244. #else
  153245. "adc r5, %[r]\n\t"
  153246. #endif
  153247. "# A[14] * B[1]\n\t"
  153248. "mov %[a], r9\n\t"
  153249. "mov %[b], r10\n\t"
  153250. "ldr %[a], [%[a], #56]\n\t"
  153251. "ldr %[b], [%[b], #4]\n\t"
  153252. "uxth r6, %[a]\n\t"
  153253. "uxth r7, %[b]\n\t"
  153254. #ifdef WOLFSSL_KEIL
  153255. "muls r7, r6, r7\n\t"
  153256. #elif defined(__clang__)
  153257. "muls r7, r6\n\t"
  153258. #else
  153259. "mul r7, r6\n\t"
  153260. #endif
  153261. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153262. "adds r3, r3, r7\n\t"
  153263. #else
  153264. "add r3, r3, r7\n\t"
  153265. #endif
  153266. #ifdef WOLFSSL_KEIL
  153267. "adcs r4, r4, %[r]\n\t"
  153268. #elif defined(__clang__)
  153269. "adcs r4, %[r]\n\t"
  153270. #else
  153271. "adc r4, %[r]\n\t"
  153272. #endif
  153273. #ifdef WOLFSSL_KEIL
  153274. "adcs r5, r5, %[r]\n\t"
  153275. #elif defined(__clang__)
  153276. "adcs r5, %[r]\n\t"
  153277. #else
  153278. "adc r5, %[r]\n\t"
  153279. #endif
  153280. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153281. "lsrs r7, %[b], #16\n\t"
  153282. #else
  153283. "lsr r7, %[b], #16\n\t"
  153284. #endif
  153285. #ifdef WOLFSSL_KEIL
  153286. "muls r6, r7, r6\n\t"
  153287. #elif defined(__clang__)
  153288. "muls r6, r7\n\t"
  153289. #else
  153290. "mul r6, r7\n\t"
  153291. #endif
  153292. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153293. "lsrs r7, r6, #16\n\t"
  153294. #else
  153295. "lsr r7, r6, #16\n\t"
  153296. #endif
  153297. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153298. "lsls r6, r6, #16\n\t"
  153299. #else
  153300. "lsl r6, r6, #16\n\t"
  153301. #endif
  153302. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153303. "adds r3, r3, r6\n\t"
  153304. #else
  153305. "add r3, r3, r6\n\t"
  153306. #endif
  153307. #ifdef WOLFSSL_KEIL
  153308. "adcs r4, r4, r7\n\t"
  153309. #elif defined(__clang__)
  153310. "adcs r4, r7\n\t"
  153311. #else
  153312. "adc r4, r7\n\t"
  153313. #endif
  153314. #ifdef WOLFSSL_KEIL
  153315. "adcs r5, r5, %[r]\n\t"
  153316. #elif defined(__clang__)
  153317. "adcs r5, %[r]\n\t"
  153318. #else
  153319. "adc r5, %[r]\n\t"
  153320. #endif
  153321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153322. "lsrs r6, %[a], #16\n\t"
  153323. #else
  153324. "lsr r6, %[a], #16\n\t"
  153325. #endif
  153326. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153327. "lsrs r7, %[b], #16\n\t"
  153328. #else
  153329. "lsr r7, %[b], #16\n\t"
  153330. #endif
  153331. #ifdef WOLFSSL_KEIL
  153332. "muls r7, r6, r7\n\t"
  153333. #elif defined(__clang__)
  153334. "muls r7, r6\n\t"
  153335. #else
  153336. "mul r7, r6\n\t"
  153337. #endif
  153338. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153339. "adds r4, r4, r7\n\t"
  153340. #else
  153341. "add r4, r4, r7\n\t"
  153342. #endif
  153343. #ifdef WOLFSSL_KEIL
  153344. "adcs r5, r5, %[r]\n\t"
  153345. #elif defined(__clang__)
  153346. "adcs r5, %[r]\n\t"
  153347. #else
  153348. "adc r5, %[r]\n\t"
  153349. #endif
  153350. "uxth r7, %[b]\n\t"
  153351. #ifdef WOLFSSL_KEIL
  153352. "muls r6, r7, r6\n\t"
  153353. #elif defined(__clang__)
  153354. "muls r6, r7\n\t"
  153355. #else
  153356. "mul r6, r7\n\t"
  153357. #endif
  153358. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153359. "lsrs r7, r6, #16\n\t"
  153360. #else
  153361. "lsr r7, r6, #16\n\t"
  153362. #endif
  153363. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153364. "lsls r6, r6, #16\n\t"
  153365. #else
  153366. "lsl r6, r6, #16\n\t"
  153367. #endif
  153368. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153369. "adds r3, r3, r6\n\t"
  153370. #else
  153371. "add r3, r3, r6\n\t"
  153372. #endif
  153373. #ifdef WOLFSSL_KEIL
  153374. "adcs r4, r4, r7\n\t"
  153375. #elif defined(__clang__)
  153376. "adcs r4, r7\n\t"
  153377. #else
  153378. "adc r4, r7\n\t"
  153379. #endif
  153380. #ifdef WOLFSSL_KEIL
  153381. "adcs r5, r5, %[r]\n\t"
  153382. #elif defined(__clang__)
  153383. "adcs r5, %[r]\n\t"
  153384. #else
  153385. "adc r5, %[r]\n\t"
  153386. #endif
  153387. "# A[15] * B[0]\n\t"
  153388. "mov %[a], r9\n\t"
  153389. "mov %[b], r10\n\t"
  153390. "ldr %[a], [%[a], #60]\n\t"
  153391. "ldr %[b], [%[b]]\n\t"
  153392. "uxth r6, %[a]\n\t"
  153393. "uxth r7, %[b]\n\t"
  153394. #ifdef WOLFSSL_KEIL
  153395. "muls r7, r6, r7\n\t"
  153396. #elif defined(__clang__)
  153397. "muls r7, r6\n\t"
  153398. #else
  153399. "mul r7, r6\n\t"
  153400. #endif
  153401. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153402. "adds r3, r3, r7\n\t"
  153403. #else
  153404. "add r3, r3, r7\n\t"
  153405. #endif
  153406. #ifdef WOLFSSL_KEIL
  153407. "adcs r4, r4, %[r]\n\t"
  153408. #elif defined(__clang__)
  153409. "adcs r4, %[r]\n\t"
  153410. #else
  153411. "adc r4, %[r]\n\t"
  153412. #endif
  153413. #ifdef WOLFSSL_KEIL
  153414. "adcs r5, r5, %[r]\n\t"
  153415. #elif defined(__clang__)
  153416. "adcs r5, %[r]\n\t"
  153417. #else
  153418. "adc r5, %[r]\n\t"
  153419. #endif
  153420. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153421. "lsrs r7, %[b], #16\n\t"
  153422. #else
  153423. "lsr r7, %[b], #16\n\t"
  153424. #endif
  153425. #ifdef WOLFSSL_KEIL
  153426. "muls r6, r7, r6\n\t"
  153427. #elif defined(__clang__)
  153428. "muls r6, r7\n\t"
  153429. #else
  153430. "mul r6, r7\n\t"
  153431. #endif
  153432. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153433. "lsrs r7, r6, #16\n\t"
  153434. #else
  153435. "lsr r7, r6, #16\n\t"
  153436. #endif
  153437. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153438. "lsls r6, r6, #16\n\t"
  153439. #else
  153440. "lsl r6, r6, #16\n\t"
  153441. #endif
  153442. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153443. "adds r3, r3, r6\n\t"
  153444. #else
  153445. "add r3, r3, r6\n\t"
  153446. #endif
  153447. #ifdef WOLFSSL_KEIL
  153448. "adcs r4, r4, r7\n\t"
  153449. #elif defined(__clang__)
  153450. "adcs r4, r7\n\t"
  153451. #else
  153452. "adc r4, r7\n\t"
  153453. #endif
  153454. #ifdef WOLFSSL_KEIL
  153455. "adcs r5, r5, %[r]\n\t"
  153456. #elif defined(__clang__)
  153457. "adcs r5, %[r]\n\t"
  153458. #else
  153459. "adc r5, %[r]\n\t"
  153460. #endif
  153461. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153462. "lsrs r6, %[a], #16\n\t"
  153463. #else
  153464. "lsr r6, %[a], #16\n\t"
  153465. #endif
  153466. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153467. "lsrs r7, %[b], #16\n\t"
  153468. #else
  153469. "lsr r7, %[b], #16\n\t"
  153470. #endif
  153471. #ifdef WOLFSSL_KEIL
  153472. "muls r7, r6, r7\n\t"
  153473. #elif defined(__clang__)
  153474. "muls r7, r6\n\t"
  153475. #else
  153476. "mul r7, r6\n\t"
  153477. #endif
  153478. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153479. "adds r4, r4, r7\n\t"
  153480. #else
  153481. "add r4, r4, r7\n\t"
  153482. #endif
  153483. #ifdef WOLFSSL_KEIL
  153484. "adcs r5, r5, %[r]\n\t"
  153485. #elif defined(__clang__)
  153486. "adcs r5, %[r]\n\t"
  153487. #else
  153488. "adc r5, %[r]\n\t"
  153489. #endif
  153490. "uxth r7, %[b]\n\t"
  153491. #ifdef WOLFSSL_KEIL
  153492. "muls r6, r7, r6\n\t"
  153493. #elif defined(__clang__)
  153494. "muls r6, r7\n\t"
  153495. #else
  153496. "mul r6, r7\n\t"
  153497. #endif
  153498. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153499. "lsrs r7, r6, #16\n\t"
  153500. #else
  153501. "lsr r7, r6, #16\n\t"
  153502. #endif
  153503. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153504. "lsls r6, r6, #16\n\t"
  153505. #else
  153506. "lsl r6, r6, #16\n\t"
  153507. #endif
  153508. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153509. "adds r3, r3, r6\n\t"
  153510. #else
  153511. "add r3, r3, r6\n\t"
  153512. #endif
  153513. #ifdef WOLFSSL_KEIL
  153514. "adcs r4, r4, r7\n\t"
  153515. #elif defined(__clang__)
  153516. "adcs r4, r7\n\t"
  153517. #else
  153518. "adc r4, r7\n\t"
  153519. #endif
  153520. #ifdef WOLFSSL_KEIL
  153521. "adcs r5, r5, %[r]\n\t"
  153522. #elif defined(__clang__)
  153523. "adcs r5, %[r]\n\t"
  153524. #else
  153525. "adc r5, %[r]\n\t"
  153526. #endif
  153527. "str r3, [sp, #60]\n\t"
  153528. "# A[15] * B[1]\n\t"
  153529. "movs r3, #0\n\t"
  153530. "mov %[a], r9\n\t"
  153531. "mov %[b], r10\n\t"
  153532. "ldr %[a], [%[a], #60]\n\t"
  153533. "ldr %[b], [%[b], #4]\n\t"
  153534. "uxth r6, %[a]\n\t"
  153535. "uxth r7, %[b]\n\t"
  153536. #ifdef WOLFSSL_KEIL
  153537. "muls r7, r6, r7\n\t"
  153538. #elif defined(__clang__)
  153539. "muls r7, r6\n\t"
  153540. #else
  153541. "mul r7, r6\n\t"
  153542. #endif
  153543. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153544. "adds r4, r4, r7\n\t"
  153545. #else
  153546. "add r4, r4, r7\n\t"
  153547. #endif
  153548. #ifdef WOLFSSL_KEIL
  153549. "adcs r5, r5, %[r]\n\t"
  153550. #elif defined(__clang__)
  153551. "adcs r5, %[r]\n\t"
  153552. #else
  153553. "adc r5, %[r]\n\t"
  153554. #endif
  153555. #ifdef WOLFSSL_KEIL
  153556. "adcs r3, r3, %[r]\n\t"
  153557. #elif defined(__clang__)
  153558. "adcs r3, %[r]\n\t"
  153559. #else
  153560. "adc r3, %[r]\n\t"
  153561. #endif
  153562. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153563. "lsrs r7, %[b], #16\n\t"
  153564. #else
  153565. "lsr r7, %[b], #16\n\t"
  153566. #endif
  153567. #ifdef WOLFSSL_KEIL
  153568. "muls r6, r7, r6\n\t"
  153569. #elif defined(__clang__)
  153570. "muls r6, r7\n\t"
  153571. #else
  153572. "mul r6, r7\n\t"
  153573. #endif
  153574. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153575. "lsrs r7, r6, #16\n\t"
  153576. #else
  153577. "lsr r7, r6, #16\n\t"
  153578. #endif
  153579. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153580. "lsls r6, r6, #16\n\t"
  153581. #else
  153582. "lsl r6, r6, #16\n\t"
  153583. #endif
  153584. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153585. "adds r4, r4, r6\n\t"
  153586. #else
  153587. "add r4, r4, r6\n\t"
  153588. #endif
  153589. #ifdef WOLFSSL_KEIL
  153590. "adcs r5, r5, r7\n\t"
  153591. #elif defined(__clang__)
  153592. "adcs r5, r7\n\t"
  153593. #else
  153594. "adc r5, r7\n\t"
  153595. #endif
  153596. #ifdef WOLFSSL_KEIL
  153597. "adcs r3, r3, %[r]\n\t"
  153598. #elif defined(__clang__)
  153599. "adcs r3, %[r]\n\t"
  153600. #else
  153601. "adc r3, %[r]\n\t"
  153602. #endif
  153603. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153604. "lsrs r6, %[a], #16\n\t"
  153605. #else
  153606. "lsr r6, %[a], #16\n\t"
  153607. #endif
  153608. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153609. "lsrs r7, %[b], #16\n\t"
  153610. #else
  153611. "lsr r7, %[b], #16\n\t"
  153612. #endif
  153613. #ifdef WOLFSSL_KEIL
  153614. "muls r7, r6, r7\n\t"
  153615. #elif defined(__clang__)
  153616. "muls r7, r6\n\t"
  153617. #else
  153618. "mul r7, r6\n\t"
  153619. #endif
  153620. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153621. "adds r5, r5, r7\n\t"
  153622. #else
  153623. "add r5, r5, r7\n\t"
  153624. #endif
  153625. #ifdef WOLFSSL_KEIL
  153626. "adcs r3, r3, %[r]\n\t"
  153627. #elif defined(__clang__)
  153628. "adcs r3, %[r]\n\t"
  153629. #else
  153630. "adc r3, %[r]\n\t"
  153631. #endif
  153632. "uxth r7, %[b]\n\t"
  153633. #ifdef WOLFSSL_KEIL
  153634. "muls r6, r7, r6\n\t"
  153635. #elif defined(__clang__)
  153636. "muls r6, r7\n\t"
  153637. #else
  153638. "mul r6, r7\n\t"
  153639. #endif
  153640. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153641. "lsrs r7, r6, #16\n\t"
  153642. #else
  153643. "lsr r7, r6, #16\n\t"
  153644. #endif
  153645. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153646. "lsls r6, r6, #16\n\t"
  153647. #else
  153648. "lsl r6, r6, #16\n\t"
  153649. #endif
  153650. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153651. "adds r4, r4, r6\n\t"
  153652. #else
  153653. "add r4, r4, r6\n\t"
  153654. #endif
  153655. #ifdef WOLFSSL_KEIL
  153656. "adcs r5, r5, r7\n\t"
  153657. #elif defined(__clang__)
  153658. "adcs r5, r7\n\t"
  153659. #else
  153660. "adc r5, r7\n\t"
  153661. #endif
  153662. #ifdef WOLFSSL_KEIL
  153663. "adcs r3, r3, %[r]\n\t"
  153664. #elif defined(__clang__)
  153665. "adcs r3, %[r]\n\t"
  153666. #else
  153667. "adc r3, %[r]\n\t"
  153668. #endif
  153669. "# A[14] * B[2]\n\t"
  153670. "mov %[a], r9\n\t"
  153671. "mov %[b], r10\n\t"
  153672. "ldr %[a], [%[a], #56]\n\t"
  153673. "ldr %[b], [%[b], #8]\n\t"
  153674. "uxth r6, %[a]\n\t"
  153675. "uxth r7, %[b]\n\t"
  153676. #ifdef WOLFSSL_KEIL
  153677. "muls r7, r6, r7\n\t"
  153678. #elif defined(__clang__)
  153679. "muls r7, r6\n\t"
  153680. #else
  153681. "mul r7, r6\n\t"
  153682. #endif
  153683. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153684. "adds r4, r4, r7\n\t"
  153685. #else
  153686. "add r4, r4, r7\n\t"
  153687. #endif
  153688. #ifdef WOLFSSL_KEIL
  153689. "adcs r5, r5, %[r]\n\t"
  153690. #elif defined(__clang__)
  153691. "adcs r5, %[r]\n\t"
  153692. #else
  153693. "adc r5, %[r]\n\t"
  153694. #endif
  153695. #ifdef WOLFSSL_KEIL
  153696. "adcs r3, r3, %[r]\n\t"
  153697. #elif defined(__clang__)
  153698. "adcs r3, %[r]\n\t"
  153699. #else
  153700. "adc r3, %[r]\n\t"
  153701. #endif
  153702. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153703. "lsrs r7, %[b], #16\n\t"
  153704. #else
  153705. "lsr r7, %[b], #16\n\t"
  153706. #endif
  153707. #ifdef WOLFSSL_KEIL
  153708. "muls r6, r7, r6\n\t"
  153709. #elif defined(__clang__)
  153710. "muls r6, r7\n\t"
  153711. #else
  153712. "mul r6, r7\n\t"
  153713. #endif
  153714. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153715. "lsrs r7, r6, #16\n\t"
  153716. #else
  153717. "lsr r7, r6, #16\n\t"
  153718. #endif
  153719. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153720. "lsls r6, r6, #16\n\t"
  153721. #else
  153722. "lsl r6, r6, #16\n\t"
  153723. #endif
  153724. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153725. "adds r4, r4, r6\n\t"
  153726. #else
  153727. "add r4, r4, r6\n\t"
  153728. #endif
  153729. #ifdef WOLFSSL_KEIL
  153730. "adcs r5, r5, r7\n\t"
  153731. #elif defined(__clang__)
  153732. "adcs r5, r7\n\t"
  153733. #else
  153734. "adc r5, r7\n\t"
  153735. #endif
  153736. #ifdef WOLFSSL_KEIL
  153737. "adcs r3, r3, %[r]\n\t"
  153738. #elif defined(__clang__)
  153739. "adcs r3, %[r]\n\t"
  153740. #else
  153741. "adc r3, %[r]\n\t"
  153742. #endif
  153743. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153744. "lsrs r6, %[a], #16\n\t"
  153745. #else
  153746. "lsr r6, %[a], #16\n\t"
  153747. #endif
  153748. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153749. "lsrs r7, %[b], #16\n\t"
  153750. #else
  153751. "lsr r7, %[b], #16\n\t"
  153752. #endif
  153753. #ifdef WOLFSSL_KEIL
  153754. "muls r7, r6, r7\n\t"
  153755. #elif defined(__clang__)
  153756. "muls r7, r6\n\t"
  153757. #else
  153758. "mul r7, r6\n\t"
  153759. #endif
  153760. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153761. "adds r5, r5, r7\n\t"
  153762. #else
  153763. "add r5, r5, r7\n\t"
  153764. #endif
  153765. #ifdef WOLFSSL_KEIL
  153766. "adcs r3, r3, %[r]\n\t"
  153767. #elif defined(__clang__)
  153768. "adcs r3, %[r]\n\t"
  153769. #else
  153770. "adc r3, %[r]\n\t"
  153771. #endif
  153772. "uxth r7, %[b]\n\t"
  153773. #ifdef WOLFSSL_KEIL
  153774. "muls r6, r7, r6\n\t"
  153775. #elif defined(__clang__)
  153776. "muls r6, r7\n\t"
  153777. #else
  153778. "mul r6, r7\n\t"
  153779. #endif
  153780. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153781. "lsrs r7, r6, #16\n\t"
  153782. #else
  153783. "lsr r7, r6, #16\n\t"
  153784. #endif
  153785. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153786. "lsls r6, r6, #16\n\t"
  153787. #else
  153788. "lsl r6, r6, #16\n\t"
  153789. #endif
  153790. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153791. "adds r4, r4, r6\n\t"
  153792. #else
  153793. "add r4, r4, r6\n\t"
  153794. #endif
  153795. #ifdef WOLFSSL_KEIL
  153796. "adcs r5, r5, r7\n\t"
  153797. #elif defined(__clang__)
  153798. "adcs r5, r7\n\t"
  153799. #else
  153800. "adc r5, r7\n\t"
  153801. #endif
  153802. #ifdef WOLFSSL_KEIL
  153803. "adcs r3, r3, %[r]\n\t"
  153804. #elif defined(__clang__)
  153805. "adcs r3, %[r]\n\t"
  153806. #else
  153807. "adc r3, %[r]\n\t"
  153808. #endif
  153809. "# A[13] * B[3]\n\t"
  153810. "mov %[a], r9\n\t"
  153811. "mov %[b], r10\n\t"
  153812. "ldr %[a], [%[a], #52]\n\t"
  153813. "ldr %[b], [%[b], #12]\n\t"
  153814. "uxth r6, %[a]\n\t"
  153815. "uxth r7, %[b]\n\t"
  153816. #ifdef WOLFSSL_KEIL
  153817. "muls r7, r6, r7\n\t"
  153818. #elif defined(__clang__)
  153819. "muls r7, r6\n\t"
  153820. #else
  153821. "mul r7, r6\n\t"
  153822. #endif
  153823. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153824. "adds r4, r4, r7\n\t"
  153825. #else
  153826. "add r4, r4, r7\n\t"
  153827. #endif
  153828. #ifdef WOLFSSL_KEIL
  153829. "adcs r5, r5, %[r]\n\t"
  153830. #elif defined(__clang__)
  153831. "adcs r5, %[r]\n\t"
  153832. #else
  153833. "adc r5, %[r]\n\t"
  153834. #endif
  153835. #ifdef WOLFSSL_KEIL
  153836. "adcs r3, r3, %[r]\n\t"
  153837. #elif defined(__clang__)
  153838. "adcs r3, %[r]\n\t"
  153839. #else
  153840. "adc r3, %[r]\n\t"
  153841. #endif
  153842. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153843. "lsrs r7, %[b], #16\n\t"
  153844. #else
  153845. "lsr r7, %[b], #16\n\t"
  153846. #endif
  153847. #ifdef WOLFSSL_KEIL
  153848. "muls r6, r7, r6\n\t"
  153849. #elif defined(__clang__)
  153850. "muls r6, r7\n\t"
  153851. #else
  153852. "mul r6, r7\n\t"
  153853. #endif
  153854. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153855. "lsrs r7, r6, #16\n\t"
  153856. #else
  153857. "lsr r7, r6, #16\n\t"
  153858. #endif
  153859. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153860. "lsls r6, r6, #16\n\t"
  153861. #else
  153862. "lsl r6, r6, #16\n\t"
  153863. #endif
  153864. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153865. "adds r4, r4, r6\n\t"
  153866. #else
  153867. "add r4, r4, r6\n\t"
  153868. #endif
  153869. #ifdef WOLFSSL_KEIL
  153870. "adcs r5, r5, r7\n\t"
  153871. #elif defined(__clang__)
  153872. "adcs r5, r7\n\t"
  153873. #else
  153874. "adc r5, r7\n\t"
  153875. #endif
  153876. #ifdef WOLFSSL_KEIL
  153877. "adcs r3, r3, %[r]\n\t"
  153878. #elif defined(__clang__)
  153879. "adcs r3, %[r]\n\t"
  153880. #else
  153881. "adc r3, %[r]\n\t"
  153882. #endif
  153883. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153884. "lsrs r6, %[a], #16\n\t"
  153885. #else
  153886. "lsr r6, %[a], #16\n\t"
  153887. #endif
  153888. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153889. "lsrs r7, %[b], #16\n\t"
  153890. #else
  153891. "lsr r7, %[b], #16\n\t"
  153892. #endif
  153893. #ifdef WOLFSSL_KEIL
  153894. "muls r7, r6, r7\n\t"
  153895. #elif defined(__clang__)
  153896. "muls r7, r6\n\t"
  153897. #else
  153898. "mul r7, r6\n\t"
  153899. #endif
  153900. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153901. "adds r5, r5, r7\n\t"
  153902. #else
  153903. "add r5, r5, r7\n\t"
  153904. #endif
  153905. #ifdef WOLFSSL_KEIL
  153906. "adcs r3, r3, %[r]\n\t"
  153907. #elif defined(__clang__)
  153908. "adcs r3, %[r]\n\t"
  153909. #else
  153910. "adc r3, %[r]\n\t"
  153911. #endif
  153912. "uxth r7, %[b]\n\t"
  153913. #ifdef WOLFSSL_KEIL
  153914. "muls r6, r7, r6\n\t"
  153915. #elif defined(__clang__)
  153916. "muls r6, r7\n\t"
  153917. #else
  153918. "mul r6, r7\n\t"
  153919. #endif
  153920. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153921. "lsrs r7, r6, #16\n\t"
  153922. #else
  153923. "lsr r7, r6, #16\n\t"
  153924. #endif
  153925. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153926. "lsls r6, r6, #16\n\t"
  153927. #else
  153928. "lsl r6, r6, #16\n\t"
  153929. #endif
  153930. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153931. "adds r4, r4, r6\n\t"
  153932. #else
  153933. "add r4, r4, r6\n\t"
  153934. #endif
  153935. #ifdef WOLFSSL_KEIL
  153936. "adcs r5, r5, r7\n\t"
  153937. #elif defined(__clang__)
  153938. "adcs r5, r7\n\t"
  153939. #else
  153940. "adc r5, r7\n\t"
  153941. #endif
  153942. #ifdef WOLFSSL_KEIL
  153943. "adcs r3, r3, %[r]\n\t"
  153944. #elif defined(__clang__)
  153945. "adcs r3, %[r]\n\t"
  153946. #else
  153947. "adc r3, %[r]\n\t"
  153948. #endif
  153949. "# A[12] * B[4]\n\t"
  153950. "mov %[a], r9\n\t"
  153951. "mov %[b], r10\n\t"
  153952. "ldr %[a], [%[a], #48]\n\t"
  153953. "ldr %[b], [%[b], #16]\n\t"
  153954. "uxth r6, %[a]\n\t"
  153955. "uxth r7, %[b]\n\t"
  153956. #ifdef WOLFSSL_KEIL
  153957. "muls r7, r6, r7\n\t"
  153958. #elif defined(__clang__)
  153959. "muls r7, r6\n\t"
  153960. #else
  153961. "mul r7, r6\n\t"
  153962. #endif
  153963. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153964. "adds r4, r4, r7\n\t"
  153965. #else
  153966. "add r4, r4, r7\n\t"
  153967. #endif
  153968. #ifdef WOLFSSL_KEIL
  153969. "adcs r5, r5, %[r]\n\t"
  153970. #elif defined(__clang__)
  153971. "adcs r5, %[r]\n\t"
  153972. #else
  153973. "adc r5, %[r]\n\t"
  153974. #endif
  153975. #ifdef WOLFSSL_KEIL
  153976. "adcs r3, r3, %[r]\n\t"
  153977. #elif defined(__clang__)
  153978. "adcs r3, %[r]\n\t"
  153979. #else
  153980. "adc r3, %[r]\n\t"
  153981. #endif
  153982. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153983. "lsrs r7, %[b], #16\n\t"
  153984. #else
  153985. "lsr r7, %[b], #16\n\t"
  153986. #endif
  153987. #ifdef WOLFSSL_KEIL
  153988. "muls r6, r7, r6\n\t"
  153989. #elif defined(__clang__)
  153990. "muls r6, r7\n\t"
  153991. #else
  153992. "mul r6, r7\n\t"
  153993. #endif
  153994. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153995. "lsrs r7, r6, #16\n\t"
  153996. #else
  153997. "lsr r7, r6, #16\n\t"
  153998. #endif
  153999. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154000. "lsls r6, r6, #16\n\t"
  154001. #else
  154002. "lsl r6, r6, #16\n\t"
  154003. #endif
  154004. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154005. "adds r4, r4, r6\n\t"
  154006. #else
  154007. "add r4, r4, r6\n\t"
  154008. #endif
  154009. #ifdef WOLFSSL_KEIL
  154010. "adcs r5, r5, r7\n\t"
  154011. #elif defined(__clang__)
  154012. "adcs r5, r7\n\t"
  154013. #else
  154014. "adc r5, r7\n\t"
  154015. #endif
  154016. #ifdef WOLFSSL_KEIL
  154017. "adcs r3, r3, %[r]\n\t"
  154018. #elif defined(__clang__)
  154019. "adcs r3, %[r]\n\t"
  154020. #else
  154021. "adc r3, %[r]\n\t"
  154022. #endif
  154023. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154024. "lsrs r6, %[a], #16\n\t"
  154025. #else
  154026. "lsr r6, %[a], #16\n\t"
  154027. #endif
  154028. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154029. "lsrs r7, %[b], #16\n\t"
  154030. #else
  154031. "lsr r7, %[b], #16\n\t"
  154032. #endif
  154033. #ifdef WOLFSSL_KEIL
  154034. "muls r7, r6, r7\n\t"
  154035. #elif defined(__clang__)
  154036. "muls r7, r6\n\t"
  154037. #else
  154038. "mul r7, r6\n\t"
  154039. #endif
  154040. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154041. "adds r5, r5, r7\n\t"
  154042. #else
  154043. "add r5, r5, r7\n\t"
  154044. #endif
  154045. #ifdef WOLFSSL_KEIL
  154046. "adcs r3, r3, %[r]\n\t"
  154047. #elif defined(__clang__)
  154048. "adcs r3, %[r]\n\t"
  154049. #else
  154050. "adc r3, %[r]\n\t"
  154051. #endif
  154052. "uxth r7, %[b]\n\t"
  154053. #ifdef WOLFSSL_KEIL
  154054. "muls r6, r7, r6\n\t"
  154055. #elif defined(__clang__)
  154056. "muls r6, r7\n\t"
  154057. #else
  154058. "mul r6, r7\n\t"
  154059. #endif
  154060. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154061. "lsrs r7, r6, #16\n\t"
  154062. #else
  154063. "lsr r7, r6, #16\n\t"
  154064. #endif
  154065. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154066. "lsls r6, r6, #16\n\t"
  154067. #else
  154068. "lsl r6, r6, #16\n\t"
  154069. #endif
  154070. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154071. "adds r4, r4, r6\n\t"
  154072. #else
  154073. "add r4, r4, r6\n\t"
  154074. #endif
  154075. #ifdef WOLFSSL_KEIL
  154076. "adcs r5, r5, r7\n\t"
  154077. #elif defined(__clang__)
  154078. "adcs r5, r7\n\t"
  154079. #else
  154080. "adc r5, r7\n\t"
  154081. #endif
  154082. #ifdef WOLFSSL_KEIL
  154083. "adcs r3, r3, %[r]\n\t"
  154084. #elif defined(__clang__)
  154085. "adcs r3, %[r]\n\t"
  154086. #else
  154087. "adc r3, %[r]\n\t"
  154088. #endif
  154089. "# A[11] * B[5]\n\t"
  154090. "mov %[a], r9\n\t"
  154091. "mov %[b], r10\n\t"
  154092. "ldr %[a], [%[a], #44]\n\t"
  154093. "ldr %[b], [%[b], #20]\n\t"
  154094. "uxth r6, %[a]\n\t"
  154095. "uxth r7, %[b]\n\t"
  154096. #ifdef WOLFSSL_KEIL
  154097. "muls r7, r6, r7\n\t"
  154098. #elif defined(__clang__)
  154099. "muls r7, r6\n\t"
  154100. #else
  154101. "mul r7, r6\n\t"
  154102. #endif
  154103. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154104. "adds r4, r4, r7\n\t"
  154105. #else
  154106. "add r4, r4, r7\n\t"
  154107. #endif
  154108. #ifdef WOLFSSL_KEIL
  154109. "adcs r5, r5, %[r]\n\t"
  154110. #elif defined(__clang__)
  154111. "adcs r5, %[r]\n\t"
  154112. #else
  154113. "adc r5, %[r]\n\t"
  154114. #endif
  154115. #ifdef WOLFSSL_KEIL
  154116. "adcs r3, r3, %[r]\n\t"
  154117. #elif defined(__clang__)
  154118. "adcs r3, %[r]\n\t"
  154119. #else
  154120. "adc r3, %[r]\n\t"
  154121. #endif
  154122. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154123. "lsrs r7, %[b], #16\n\t"
  154124. #else
  154125. "lsr r7, %[b], #16\n\t"
  154126. #endif
  154127. #ifdef WOLFSSL_KEIL
  154128. "muls r6, r7, r6\n\t"
  154129. #elif defined(__clang__)
  154130. "muls r6, r7\n\t"
  154131. #else
  154132. "mul r6, r7\n\t"
  154133. #endif
  154134. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154135. "lsrs r7, r6, #16\n\t"
  154136. #else
  154137. "lsr r7, r6, #16\n\t"
  154138. #endif
  154139. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154140. "lsls r6, r6, #16\n\t"
  154141. #else
  154142. "lsl r6, r6, #16\n\t"
  154143. #endif
  154144. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154145. "adds r4, r4, r6\n\t"
  154146. #else
  154147. "add r4, r4, r6\n\t"
  154148. #endif
  154149. #ifdef WOLFSSL_KEIL
  154150. "adcs r5, r5, r7\n\t"
  154151. #elif defined(__clang__)
  154152. "adcs r5, r7\n\t"
  154153. #else
  154154. "adc r5, r7\n\t"
  154155. #endif
  154156. #ifdef WOLFSSL_KEIL
  154157. "adcs r3, r3, %[r]\n\t"
  154158. #elif defined(__clang__)
  154159. "adcs r3, %[r]\n\t"
  154160. #else
  154161. "adc r3, %[r]\n\t"
  154162. #endif
  154163. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154164. "lsrs r6, %[a], #16\n\t"
  154165. #else
  154166. "lsr r6, %[a], #16\n\t"
  154167. #endif
  154168. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154169. "lsrs r7, %[b], #16\n\t"
  154170. #else
  154171. "lsr r7, %[b], #16\n\t"
  154172. #endif
  154173. #ifdef WOLFSSL_KEIL
  154174. "muls r7, r6, r7\n\t"
  154175. #elif defined(__clang__)
  154176. "muls r7, r6\n\t"
  154177. #else
  154178. "mul r7, r6\n\t"
  154179. #endif
  154180. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154181. "adds r5, r5, r7\n\t"
  154182. #else
  154183. "add r5, r5, r7\n\t"
  154184. #endif
  154185. #ifdef WOLFSSL_KEIL
  154186. "adcs r3, r3, %[r]\n\t"
  154187. #elif defined(__clang__)
  154188. "adcs r3, %[r]\n\t"
  154189. #else
  154190. "adc r3, %[r]\n\t"
  154191. #endif
  154192. "uxth r7, %[b]\n\t"
  154193. #ifdef WOLFSSL_KEIL
  154194. "muls r6, r7, r6\n\t"
  154195. #elif defined(__clang__)
  154196. "muls r6, r7\n\t"
  154197. #else
  154198. "mul r6, r7\n\t"
  154199. #endif
  154200. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154201. "lsrs r7, r6, #16\n\t"
  154202. #else
  154203. "lsr r7, r6, #16\n\t"
  154204. #endif
  154205. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154206. "lsls r6, r6, #16\n\t"
  154207. #else
  154208. "lsl r6, r6, #16\n\t"
  154209. #endif
  154210. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154211. "adds r4, r4, r6\n\t"
  154212. #else
  154213. "add r4, r4, r6\n\t"
  154214. #endif
  154215. #ifdef WOLFSSL_KEIL
  154216. "adcs r5, r5, r7\n\t"
  154217. #elif defined(__clang__)
  154218. "adcs r5, r7\n\t"
  154219. #else
  154220. "adc r5, r7\n\t"
  154221. #endif
  154222. #ifdef WOLFSSL_KEIL
  154223. "adcs r3, r3, %[r]\n\t"
  154224. #elif defined(__clang__)
  154225. "adcs r3, %[r]\n\t"
  154226. #else
  154227. "adc r3, %[r]\n\t"
  154228. #endif
  154229. "# A[10] * B[6]\n\t"
  154230. "mov %[a], r9\n\t"
  154231. "mov %[b], r10\n\t"
  154232. "ldr %[a], [%[a], #40]\n\t"
  154233. "ldr %[b], [%[b], #24]\n\t"
  154234. "uxth r6, %[a]\n\t"
  154235. "uxth r7, %[b]\n\t"
  154236. #ifdef WOLFSSL_KEIL
  154237. "muls r7, r6, r7\n\t"
  154238. #elif defined(__clang__)
  154239. "muls r7, r6\n\t"
  154240. #else
  154241. "mul r7, r6\n\t"
  154242. #endif
  154243. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154244. "adds r4, r4, r7\n\t"
  154245. #else
  154246. "add r4, r4, r7\n\t"
  154247. #endif
  154248. #ifdef WOLFSSL_KEIL
  154249. "adcs r5, r5, %[r]\n\t"
  154250. #elif defined(__clang__)
  154251. "adcs r5, %[r]\n\t"
  154252. #else
  154253. "adc r5, %[r]\n\t"
  154254. #endif
  154255. #ifdef WOLFSSL_KEIL
  154256. "adcs r3, r3, %[r]\n\t"
  154257. #elif defined(__clang__)
  154258. "adcs r3, %[r]\n\t"
  154259. #else
  154260. "adc r3, %[r]\n\t"
  154261. #endif
  154262. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154263. "lsrs r7, %[b], #16\n\t"
  154264. #else
  154265. "lsr r7, %[b], #16\n\t"
  154266. #endif
  154267. #ifdef WOLFSSL_KEIL
  154268. "muls r6, r7, r6\n\t"
  154269. #elif defined(__clang__)
  154270. "muls r6, r7\n\t"
  154271. #else
  154272. "mul r6, r7\n\t"
  154273. #endif
  154274. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154275. "lsrs r7, r6, #16\n\t"
  154276. #else
  154277. "lsr r7, r6, #16\n\t"
  154278. #endif
  154279. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154280. "lsls r6, r6, #16\n\t"
  154281. #else
  154282. "lsl r6, r6, #16\n\t"
  154283. #endif
  154284. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154285. "adds r4, r4, r6\n\t"
  154286. #else
  154287. "add r4, r4, r6\n\t"
  154288. #endif
  154289. #ifdef WOLFSSL_KEIL
  154290. "adcs r5, r5, r7\n\t"
  154291. #elif defined(__clang__)
  154292. "adcs r5, r7\n\t"
  154293. #else
  154294. "adc r5, r7\n\t"
  154295. #endif
  154296. #ifdef WOLFSSL_KEIL
  154297. "adcs r3, r3, %[r]\n\t"
  154298. #elif defined(__clang__)
  154299. "adcs r3, %[r]\n\t"
  154300. #else
  154301. "adc r3, %[r]\n\t"
  154302. #endif
  154303. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154304. "lsrs r6, %[a], #16\n\t"
  154305. #else
  154306. "lsr r6, %[a], #16\n\t"
  154307. #endif
  154308. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154309. "lsrs r7, %[b], #16\n\t"
  154310. #else
  154311. "lsr r7, %[b], #16\n\t"
  154312. #endif
  154313. #ifdef WOLFSSL_KEIL
  154314. "muls r7, r6, r7\n\t"
  154315. #elif defined(__clang__)
  154316. "muls r7, r6\n\t"
  154317. #else
  154318. "mul r7, r6\n\t"
  154319. #endif
  154320. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154321. "adds r5, r5, r7\n\t"
  154322. #else
  154323. "add r5, r5, r7\n\t"
  154324. #endif
  154325. #ifdef WOLFSSL_KEIL
  154326. "adcs r3, r3, %[r]\n\t"
  154327. #elif defined(__clang__)
  154328. "adcs r3, %[r]\n\t"
  154329. #else
  154330. "adc r3, %[r]\n\t"
  154331. #endif
  154332. "uxth r7, %[b]\n\t"
  154333. #ifdef WOLFSSL_KEIL
  154334. "muls r6, r7, r6\n\t"
  154335. #elif defined(__clang__)
  154336. "muls r6, r7\n\t"
  154337. #else
  154338. "mul r6, r7\n\t"
  154339. #endif
  154340. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154341. "lsrs r7, r6, #16\n\t"
  154342. #else
  154343. "lsr r7, r6, #16\n\t"
  154344. #endif
  154345. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154346. "lsls r6, r6, #16\n\t"
  154347. #else
  154348. "lsl r6, r6, #16\n\t"
  154349. #endif
  154350. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154351. "adds r4, r4, r6\n\t"
  154352. #else
  154353. "add r4, r4, r6\n\t"
  154354. #endif
  154355. #ifdef WOLFSSL_KEIL
  154356. "adcs r5, r5, r7\n\t"
  154357. #elif defined(__clang__)
  154358. "adcs r5, r7\n\t"
  154359. #else
  154360. "adc r5, r7\n\t"
  154361. #endif
  154362. #ifdef WOLFSSL_KEIL
  154363. "adcs r3, r3, %[r]\n\t"
  154364. #elif defined(__clang__)
  154365. "adcs r3, %[r]\n\t"
  154366. #else
  154367. "adc r3, %[r]\n\t"
  154368. #endif
  154369. "# A[9] * B[7]\n\t"
  154370. "mov %[a], r9\n\t"
  154371. "mov %[b], r10\n\t"
  154372. "ldr %[a], [%[a], #36]\n\t"
  154373. "ldr %[b], [%[b], #28]\n\t"
  154374. "uxth r6, %[a]\n\t"
  154375. "uxth r7, %[b]\n\t"
  154376. #ifdef WOLFSSL_KEIL
  154377. "muls r7, r6, r7\n\t"
  154378. #elif defined(__clang__)
  154379. "muls r7, r6\n\t"
  154380. #else
  154381. "mul r7, r6\n\t"
  154382. #endif
  154383. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154384. "adds r4, r4, r7\n\t"
  154385. #else
  154386. "add r4, r4, r7\n\t"
  154387. #endif
  154388. #ifdef WOLFSSL_KEIL
  154389. "adcs r5, r5, %[r]\n\t"
  154390. #elif defined(__clang__)
  154391. "adcs r5, %[r]\n\t"
  154392. #else
  154393. "adc r5, %[r]\n\t"
  154394. #endif
  154395. #ifdef WOLFSSL_KEIL
  154396. "adcs r3, r3, %[r]\n\t"
  154397. #elif defined(__clang__)
  154398. "adcs r3, %[r]\n\t"
  154399. #else
  154400. "adc r3, %[r]\n\t"
  154401. #endif
  154402. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154403. "lsrs r7, %[b], #16\n\t"
  154404. #else
  154405. "lsr r7, %[b], #16\n\t"
  154406. #endif
  154407. #ifdef WOLFSSL_KEIL
  154408. "muls r6, r7, r6\n\t"
  154409. #elif defined(__clang__)
  154410. "muls r6, r7\n\t"
  154411. #else
  154412. "mul r6, r7\n\t"
  154413. #endif
  154414. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154415. "lsrs r7, r6, #16\n\t"
  154416. #else
  154417. "lsr r7, r6, #16\n\t"
  154418. #endif
  154419. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154420. "lsls r6, r6, #16\n\t"
  154421. #else
  154422. "lsl r6, r6, #16\n\t"
  154423. #endif
  154424. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154425. "adds r4, r4, r6\n\t"
  154426. #else
  154427. "add r4, r4, r6\n\t"
  154428. #endif
  154429. #ifdef WOLFSSL_KEIL
  154430. "adcs r5, r5, r7\n\t"
  154431. #elif defined(__clang__)
  154432. "adcs r5, r7\n\t"
  154433. #else
  154434. "adc r5, r7\n\t"
  154435. #endif
  154436. #ifdef WOLFSSL_KEIL
  154437. "adcs r3, r3, %[r]\n\t"
  154438. #elif defined(__clang__)
  154439. "adcs r3, %[r]\n\t"
  154440. #else
  154441. "adc r3, %[r]\n\t"
  154442. #endif
  154443. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154444. "lsrs r6, %[a], #16\n\t"
  154445. #else
  154446. "lsr r6, %[a], #16\n\t"
  154447. #endif
  154448. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154449. "lsrs r7, %[b], #16\n\t"
  154450. #else
  154451. "lsr r7, %[b], #16\n\t"
  154452. #endif
  154453. #ifdef WOLFSSL_KEIL
  154454. "muls r7, r6, r7\n\t"
  154455. #elif defined(__clang__)
  154456. "muls r7, r6\n\t"
  154457. #else
  154458. "mul r7, r6\n\t"
  154459. #endif
  154460. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154461. "adds r5, r5, r7\n\t"
  154462. #else
  154463. "add r5, r5, r7\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. "uxth r7, %[b]\n\t"
  154473. #ifdef WOLFSSL_KEIL
  154474. "muls r6, r7, r6\n\t"
  154475. #elif defined(__clang__)
  154476. "muls r6, r7\n\t"
  154477. #else
  154478. "mul r6, r7\n\t"
  154479. #endif
  154480. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154481. "lsrs r7, r6, #16\n\t"
  154482. #else
  154483. "lsr r7, r6, #16\n\t"
  154484. #endif
  154485. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154486. "lsls r6, r6, #16\n\t"
  154487. #else
  154488. "lsl r6, r6, #16\n\t"
  154489. #endif
  154490. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154491. "adds r4, r4, r6\n\t"
  154492. #else
  154493. "add r4, r4, r6\n\t"
  154494. #endif
  154495. #ifdef WOLFSSL_KEIL
  154496. "adcs r5, r5, r7\n\t"
  154497. #elif defined(__clang__)
  154498. "adcs r5, r7\n\t"
  154499. #else
  154500. "adc r5, r7\n\t"
  154501. #endif
  154502. #ifdef WOLFSSL_KEIL
  154503. "adcs r3, r3, %[r]\n\t"
  154504. #elif defined(__clang__)
  154505. "adcs r3, %[r]\n\t"
  154506. #else
  154507. "adc r3, %[r]\n\t"
  154508. #endif
  154509. "# A[8] * B[8]\n\t"
  154510. "mov %[a], r9\n\t"
  154511. "mov %[b], r10\n\t"
  154512. "ldr %[a], [%[a], #32]\n\t"
  154513. "ldr %[b], [%[b], #32]\n\t"
  154514. "uxth r6, %[a]\n\t"
  154515. "uxth r7, %[b]\n\t"
  154516. #ifdef WOLFSSL_KEIL
  154517. "muls r7, r6, r7\n\t"
  154518. #elif defined(__clang__)
  154519. "muls r7, r6\n\t"
  154520. #else
  154521. "mul r7, r6\n\t"
  154522. #endif
  154523. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154524. "adds r4, r4, r7\n\t"
  154525. #else
  154526. "add r4, r4, r7\n\t"
  154527. #endif
  154528. #ifdef WOLFSSL_KEIL
  154529. "adcs r5, r5, %[r]\n\t"
  154530. #elif defined(__clang__)
  154531. "adcs r5, %[r]\n\t"
  154532. #else
  154533. "adc r5, %[r]\n\t"
  154534. #endif
  154535. #ifdef WOLFSSL_KEIL
  154536. "adcs r3, r3, %[r]\n\t"
  154537. #elif defined(__clang__)
  154538. "adcs r3, %[r]\n\t"
  154539. #else
  154540. "adc r3, %[r]\n\t"
  154541. #endif
  154542. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154543. "lsrs r7, %[b], #16\n\t"
  154544. #else
  154545. "lsr r7, %[b], #16\n\t"
  154546. #endif
  154547. #ifdef WOLFSSL_KEIL
  154548. "muls r6, r7, r6\n\t"
  154549. #elif defined(__clang__)
  154550. "muls r6, r7\n\t"
  154551. #else
  154552. "mul r6, r7\n\t"
  154553. #endif
  154554. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154555. "lsrs r7, r6, #16\n\t"
  154556. #else
  154557. "lsr r7, r6, #16\n\t"
  154558. #endif
  154559. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154560. "lsls r6, r6, #16\n\t"
  154561. #else
  154562. "lsl r6, r6, #16\n\t"
  154563. #endif
  154564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154565. "adds r4, r4, r6\n\t"
  154566. #else
  154567. "add r4, r4, r6\n\t"
  154568. #endif
  154569. #ifdef WOLFSSL_KEIL
  154570. "adcs r5, r5, r7\n\t"
  154571. #elif defined(__clang__)
  154572. "adcs r5, r7\n\t"
  154573. #else
  154574. "adc r5, r7\n\t"
  154575. #endif
  154576. #ifdef WOLFSSL_KEIL
  154577. "adcs r3, r3, %[r]\n\t"
  154578. #elif defined(__clang__)
  154579. "adcs r3, %[r]\n\t"
  154580. #else
  154581. "adc r3, %[r]\n\t"
  154582. #endif
  154583. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154584. "lsrs r6, %[a], #16\n\t"
  154585. #else
  154586. "lsr r6, %[a], #16\n\t"
  154587. #endif
  154588. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154589. "lsrs r7, %[b], #16\n\t"
  154590. #else
  154591. "lsr r7, %[b], #16\n\t"
  154592. #endif
  154593. #ifdef WOLFSSL_KEIL
  154594. "muls r7, r6, r7\n\t"
  154595. #elif defined(__clang__)
  154596. "muls r7, r6\n\t"
  154597. #else
  154598. "mul r7, r6\n\t"
  154599. #endif
  154600. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154601. "adds r5, r5, r7\n\t"
  154602. #else
  154603. "add r5, r5, r7\n\t"
  154604. #endif
  154605. #ifdef WOLFSSL_KEIL
  154606. "adcs r3, r3, %[r]\n\t"
  154607. #elif defined(__clang__)
  154608. "adcs r3, %[r]\n\t"
  154609. #else
  154610. "adc r3, %[r]\n\t"
  154611. #endif
  154612. "uxth r7, %[b]\n\t"
  154613. #ifdef WOLFSSL_KEIL
  154614. "muls r6, r7, r6\n\t"
  154615. #elif defined(__clang__)
  154616. "muls r6, r7\n\t"
  154617. #else
  154618. "mul r6, r7\n\t"
  154619. #endif
  154620. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154621. "lsrs r7, r6, #16\n\t"
  154622. #else
  154623. "lsr r7, r6, #16\n\t"
  154624. #endif
  154625. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154626. "lsls r6, r6, #16\n\t"
  154627. #else
  154628. "lsl r6, r6, #16\n\t"
  154629. #endif
  154630. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154631. "adds r4, r4, r6\n\t"
  154632. #else
  154633. "add r4, r4, r6\n\t"
  154634. #endif
  154635. #ifdef WOLFSSL_KEIL
  154636. "adcs r5, r5, r7\n\t"
  154637. #elif defined(__clang__)
  154638. "adcs r5, r7\n\t"
  154639. #else
  154640. "adc r5, r7\n\t"
  154641. #endif
  154642. #ifdef WOLFSSL_KEIL
  154643. "adcs r3, r3, %[r]\n\t"
  154644. #elif defined(__clang__)
  154645. "adcs r3, %[r]\n\t"
  154646. #else
  154647. "adc r3, %[r]\n\t"
  154648. #endif
  154649. "# A[7] * B[9]\n\t"
  154650. "mov %[a], r9\n\t"
  154651. "mov %[b], r10\n\t"
  154652. "ldr %[a], [%[a], #28]\n\t"
  154653. "ldr %[b], [%[b], #36]\n\t"
  154654. "uxth r6, %[a]\n\t"
  154655. "uxth r7, %[b]\n\t"
  154656. #ifdef WOLFSSL_KEIL
  154657. "muls r7, r6, r7\n\t"
  154658. #elif defined(__clang__)
  154659. "muls r7, r6\n\t"
  154660. #else
  154661. "mul r7, r6\n\t"
  154662. #endif
  154663. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154664. "adds r4, r4, r7\n\t"
  154665. #else
  154666. "add r4, r4, r7\n\t"
  154667. #endif
  154668. #ifdef WOLFSSL_KEIL
  154669. "adcs r5, r5, %[r]\n\t"
  154670. #elif defined(__clang__)
  154671. "adcs r5, %[r]\n\t"
  154672. #else
  154673. "adc r5, %[r]\n\t"
  154674. #endif
  154675. #ifdef WOLFSSL_KEIL
  154676. "adcs r3, r3, %[r]\n\t"
  154677. #elif defined(__clang__)
  154678. "adcs r3, %[r]\n\t"
  154679. #else
  154680. "adc r3, %[r]\n\t"
  154681. #endif
  154682. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154683. "lsrs r7, %[b], #16\n\t"
  154684. #else
  154685. "lsr r7, %[b], #16\n\t"
  154686. #endif
  154687. #ifdef WOLFSSL_KEIL
  154688. "muls r6, r7, r6\n\t"
  154689. #elif defined(__clang__)
  154690. "muls r6, r7\n\t"
  154691. #else
  154692. "mul r6, r7\n\t"
  154693. #endif
  154694. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154695. "lsrs r7, r6, #16\n\t"
  154696. #else
  154697. "lsr r7, r6, #16\n\t"
  154698. #endif
  154699. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154700. "lsls r6, r6, #16\n\t"
  154701. #else
  154702. "lsl r6, r6, #16\n\t"
  154703. #endif
  154704. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154705. "adds r4, r4, r6\n\t"
  154706. #else
  154707. "add r4, r4, r6\n\t"
  154708. #endif
  154709. #ifdef WOLFSSL_KEIL
  154710. "adcs r5, r5, r7\n\t"
  154711. #elif defined(__clang__)
  154712. "adcs r5, r7\n\t"
  154713. #else
  154714. "adc r5, r7\n\t"
  154715. #endif
  154716. #ifdef WOLFSSL_KEIL
  154717. "adcs r3, r3, %[r]\n\t"
  154718. #elif defined(__clang__)
  154719. "adcs r3, %[r]\n\t"
  154720. #else
  154721. "adc r3, %[r]\n\t"
  154722. #endif
  154723. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154724. "lsrs r6, %[a], #16\n\t"
  154725. #else
  154726. "lsr r6, %[a], #16\n\t"
  154727. #endif
  154728. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154729. "lsrs r7, %[b], #16\n\t"
  154730. #else
  154731. "lsr r7, %[b], #16\n\t"
  154732. #endif
  154733. #ifdef WOLFSSL_KEIL
  154734. "muls r7, r6, r7\n\t"
  154735. #elif defined(__clang__)
  154736. "muls r7, r6\n\t"
  154737. #else
  154738. "mul r7, r6\n\t"
  154739. #endif
  154740. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154741. "adds r5, r5, r7\n\t"
  154742. #else
  154743. "add r5, r5, r7\n\t"
  154744. #endif
  154745. #ifdef WOLFSSL_KEIL
  154746. "adcs r3, r3, %[r]\n\t"
  154747. #elif defined(__clang__)
  154748. "adcs r3, %[r]\n\t"
  154749. #else
  154750. "adc r3, %[r]\n\t"
  154751. #endif
  154752. "uxth r7, %[b]\n\t"
  154753. #ifdef WOLFSSL_KEIL
  154754. "muls r6, r7, r6\n\t"
  154755. #elif defined(__clang__)
  154756. "muls r6, r7\n\t"
  154757. #else
  154758. "mul r6, r7\n\t"
  154759. #endif
  154760. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154761. "lsrs r7, r6, #16\n\t"
  154762. #else
  154763. "lsr r7, r6, #16\n\t"
  154764. #endif
  154765. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154766. "lsls r6, r6, #16\n\t"
  154767. #else
  154768. "lsl r6, r6, #16\n\t"
  154769. #endif
  154770. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154771. "adds r4, r4, r6\n\t"
  154772. #else
  154773. "add r4, r4, r6\n\t"
  154774. #endif
  154775. #ifdef WOLFSSL_KEIL
  154776. "adcs r5, r5, r7\n\t"
  154777. #elif defined(__clang__)
  154778. "adcs r5, r7\n\t"
  154779. #else
  154780. "adc r5, r7\n\t"
  154781. #endif
  154782. #ifdef WOLFSSL_KEIL
  154783. "adcs r3, r3, %[r]\n\t"
  154784. #elif defined(__clang__)
  154785. "adcs r3, %[r]\n\t"
  154786. #else
  154787. "adc r3, %[r]\n\t"
  154788. #endif
  154789. "# A[6] * B[10]\n\t"
  154790. "mov %[a], r9\n\t"
  154791. "mov %[b], r10\n\t"
  154792. "ldr %[a], [%[a], #24]\n\t"
  154793. "ldr %[b], [%[b], #40]\n\t"
  154794. "uxth r6, %[a]\n\t"
  154795. "uxth r7, %[b]\n\t"
  154796. #ifdef WOLFSSL_KEIL
  154797. "muls r7, r6, r7\n\t"
  154798. #elif defined(__clang__)
  154799. "muls r7, r6\n\t"
  154800. #else
  154801. "mul r7, r6\n\t"
  154802. #endif
  154803. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154804. "adds r4, r4, r7\n\t"
  154805. #else
  154806. "add r4, r4, r7\n\t"
  154807. #endif
  154808. #ifdef WOLFSSL_KEIL
  154809. "adcs r5, r5, %[r]\n\t"
  154810. #elif defined(__clang__)
  154811. "adcs r5, %[r]\n\t"
  154812. #else
  154813. "adc r5, %[r]\n\t"
  154814. #endif
  154815. #ifdef WOLFSSL_KEIL
  154816. "adcs r3, r3, %[r]\n\t"
  154817. #elif defined(__clang__)
  154818. "adcs r3, %[r]\n\t"
  154819. #else
  154820. "adc r3, %[r]\n\t"
  154821. #endif
  154822. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154823. "lsrs r7, %[b], #16\n\t"
  154824. #else
  154825. "lsr r7, %[b], #16\n\t"
  154826. #endif
  154827. #ifdef WOLFSSL_KEIL
  154828. "muls r6, r7, r6\n\t"
  154829. #elif defined(__clang__)
  154830. "muls r6, r7\n\t"
  154831. #else
  154832. "mul r6, r7\n\t"
  154833. #endif
  154834. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154835. "lsrs r7, r6, #16\n\t"
  154836. #else
  154837. "lsr r7, r6, #16\n\t"
  154838. #endif
  154839. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154840. "lsls r6, r6, #16\n\t"
  154841. #else
  154842. "lsl r6, r6, #16\n\t"
  154843. #endif
  154844. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154845. "adds r4, r4, r6\n\t"
  154846. #else
  154847. "add r4, r4, r6\n\t"
  154848. #endif
  154849. #ifdef WOLFSSL_KEIL
  154850. "adcs r5, r5, r7\n\t"
  154851. #elif defined(__clang__)
  154852. "adcs r5, r7\n\t"
  154853. #else
  154854. "adc r5, r7\n\t"
  154855. #endif
  154856. #ifdef WOLFSSL_KEIL
  154857. "adcs r3, r3, %[r]\n\t"
  154858. #elif defined(__clang__)
  154859. "adcs r3, %[r]\n\t"
  154860. #else
  154861. "adc r3, %[r]\n\t"
  154862. #endif
  154863. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154864. "lsrs r6, %[a], #16\n\t"
  154865. #else
  154866. "lsr r6, %[a], #16\n\t"
  154867. #endif
  154868. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154869. "lsrs r7, %[b], #16\n\t"
  154870. #else
  154871. "lsr r7, %[b], #16\n\t"
  154872. #endif
  154873. #ifdef WOLFSSL_KEIL
  154874. "muls r7, r6, r7\n\t"
  154875. #elif defined(__clang__)
  154876. "muls r7, r6\n\t"
  154877. #else
  154878. "mul r7, r6\n\t"
  154879. #endif
  154880. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154881. "adds r5, r5, r7\n\t"
  154882. #else
  154883. "add r5, r5, r7\n\t"
  154884. #endif
  154885. #ifdef WOLFSSL_KEIL
  154886. "adcs r3, r3, %[r]\n\t"
  154887. #elif defined(__clang__)
  154888. "adcs r3, %[r]\n\t"
  154889. #else
  154890. "adc r3, %[r]\n\t"
  154891. #endif
  154892. "uxth r7, %[b]\n\t"
  154893. #ifdef WOLFSSL_KEIL
  154894. "muls r6, r7, r6\n\t"
  154895. #elif defined(__clang__)
  154896. "muls r6, r7\n\t"
  154897. #else
  154898. "mul r6, r7\n\t"
  154899. #endif
  154900. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154901. "lsrs r7, r6, #16\n\t"
  154902. #else
  154903. "lsr r7, r6, #16\n\t"
  154904. #endif
  154905. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154906. "lsls r6, r6, #16\n\t"
  154907. #else
  154908. "lsl r6, r6, #16\n\t"
  154909. #endif
  154910. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154911. "adds r4, r4, r6\n\t"
  154912. #else
  154913. "add r4, r4, r6\n\t"
  154914. #endif
  154915. #ifdef WOLFSSL_KEIL
  154916. "adcs r5, r5, r7\n\t"
  154917. #elif defined(__clang__)
  154918. "adcs r5, r7\n\t"
  154919. #else
  154920. "adc r5, r7\n\t"
  154921. #endif
  154922. #ifdef WOLFSSL_KEIL
  154923. "adcs r3, r3, %[r]\n\t"
  154924. #elif defined(__clang__)
  154925. "adcs r3, %[r]\n\t"
  154926. #else
  154927. "adc r3, %[r]\n\t"
  154928. #endif
  154929. "# A[5] * B[11]\n\t"
  154930. "mov %[a], r9\n\t"
  154931. "mov %[b], r10\n\t"
  154932. "ldr %[a], [%[a], #20]\n\t"
  154933. "ldr %[b], [%[b], #44]\n\t"
  154934. "uxth r6, %[a]\n\t"
  154935. "uxth r7, %[b]\n\t"
  154936. #ifdef WOLFSSL_KEIL
  154937. "muls r7, r6, r7\n\t"
  154938. #elif defined(__clang__)
  154939. "muls r7, r6\n\t"
  154940. #else
  154941. "mul r7, r6\n\t"
  154942. #endif
  154943. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154944. "adds r4, r4, r7\n\t"
  154945. #else
  154946. "add r4, r4, r7\n\t"
  154947. #endif
  154948. #ifdef WOLFSSL_KEIL
  154949. "adcs r5, r5, %[r]\n\t"
  154950. #elif defined(__clang__)
  154951. "adcs r5, %[r]\n\t"
  154952. #else
  154953. "adc r5, %[r]\n\t"
  154954. #endif
  154955. #ifdef WOLFSSL_KEIL
  154956. "adcs r3, r3, %[r]\n\t"
  154957. #elif defined(__clang__)
  154958. "adcs r3, %[r]\n\t"
  154959. #else
  154960. "adc r3, %[r]\n\t"
  154961. #endif
  154962. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154963. "lsrs r7, %[b], #16\n\t"
  154964. #else
  154965. "lsr r7, %[b], #16\n\t"
  154966. #endif
  154967. #ifdef WOLFSSL_KEIL
  154968. "muls r6, r7, r6\n\t"
  154969. #elif defined(__clang__)
  154970. "muls r6, r7\n\t"
  154971. #else
  154972. "mul r6, r7\n\t"
  154973. #endif
  154974. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154975. "lsrs r7, r6, #16\n\t"
  154976. #else
  154977. "lsr r7, r6, #16\n\t"
  154978. #endif
  154979. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154980. "lsls r6, r6, #16\n\t"
  154981. #else
  154982. "lsl r6, r6, #16\n\t"
  154983. #endif
  154984. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154985. "adds r4, r4, r6\n\t"
  154986. #else
  154987. "add r4, r4, r6\n\t"
  154988. #endif
  154989. #ifdef WOLFSSL_KEIL
  154990. "adcs r5, r5, r7\n\t"
  154991. #elif defined(__clang__)
  154992. "adcs r5, r7\n\t"
  154993. #else
  154994. "adc r5, r7\n\t"
  154995. #endif
  154996. #ifdef WOLFSSL_KEIL
  154997. "adcs r3, r3, %[r]\n\t"
  154998. #elif defined(__clang__)
  154999. "adcs r3, %[r]\n\t"
  155000. #else
  155001. "adc r3, %[r]\n\t"
  155002. #endif
  155003. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155004. "lsrs r6, %[a], #16\n\t"
  155005. #else
  155006. "lsr r6, %[a], #16\n\t"
  155007. #endif
  155008. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155009. "lsrs r7, %[b], #16\n\t"
  155010. #else
  155011. "lsr r7, %[b], #16\n\t"
  155012. #endif
  155013. #ifdef WOLFSSL_KEIL
  155014. "muls r7, r6, r7\n\t"
  155015. #elif defined(__clang__)
  155016. "muls r7, r6\n\t"
  155017. #else
  155018. "mul r7, r6\n\t"
  155019. #endif
  155020. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155021. "adds r5, r5, r7\n\t"
  155022. #else
  155023. "add r5, r5, r7\n\t"
  155024. #endif
  155025. #ifdef WOLFSSL_KEIL
  155026. "adcs r3, r3, %[r]\n\t"
  155027. #elif defined(__clang__)
  155028. "adcs r3, %[r]\n\t"
  155029. #else
  155030. "adc r3, %[r]\n\t"
  155031. #endif
  155032. "uxth r7, %[b]\n\t"
  155033. #ifdef WOLFSSL_KEIL
  155034. "muls r6, r7, r6\n\t"
  155035. #elif defined(__clang__)
  155036. "muls r6, r7\n\t"
  155037. #else
  155038. "mul r6, r7\n\t"
  155039. #endif
  155040. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155041. "lsrs r7, r6, #16\n\t"
  155042. #else
  155043. "lsr r7, r6, #16\n\t"
  155044. #endif
  155045. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155046. "lsls r6, r6, #16\n\t"
  155047. #else
  155048. "lsl r6, r6, #16\n\t"
  155049. #endif
  155050. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155051. "adds r4, r4, r6\n\t"
  155052. #else
  155053. "add r4, r4, r6\n\t"
  155054. #endif
  155055. #ifdef WOLFSSL_KEIL
  155056. "adcs r5, r5, r7\n\t"
  155057. #elif defined(__clang__)
  155058. "adcs r5, r7\n\t"
  155059. #else
  155060. "adc r5, r7\n\t"
  155061. #endif
  155062. #ifdef WOLFSSL_KEIL
  155063. "adcs r3, r3, %[r]\n\t"
  155064. #elif defined(__clang__)
  155065. "adcs r3, %[r]\n\t"
  155066. #else
  155067. "adc r3, %[r]\n\t"
  155068. #endif
  155069. "# A[4] * B[12]\n\t"
  155070. "mov %[a], r9\n\t"
  155071. "mov %[b], r10\n\t"
  155072. "ldr %[a], [%[a], #16]\n\t"
  155073. "ldr %[b], [%[b], #48]\n\t"
  155074. "uxth r6, %[a]\n\t"
  155075. "uxth r7, %[b]\n\t"
  155076. #ifdef WOLFSSL_KEIL
  155077. "muls r7, r6, r7\n\t"
  155078. #elif defined(__clang__)
  155079. "muls r7, r6\n\t"
  155080. #else
  155081. "mul r7, r6\n\t"
  155082. #endif
  155083. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155084. "adds r4, r4, r7\n\t"
  155085. #else
  155086. "add r4, r4, r7\n\t"
  155087. #endif
  155088. #ifdef WOLFSSL_KEIL
  155089. "adcs r5, r5, %[r]\n\t"
  155090. #elif defined(__clang__)
  155091. "adcs r5, %[r]\n\t"
  155092. #else
  155093. "adc r5, %[r]\n\t"
  155094. #endif
  155095. #ifdef WOLFSSL_KEIL
  155096. "adcs r3, r3, %[r]\n\t"
  155097. #elif defined(__clang__)
  155098. "adcs r3, %[r]\n\t"
  155099. #else
  155100. "adc r3, %[r]\n\t"
  155101. #endif
  155102. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155103. "lsrs r7, %[b], #16\n\t"
  155104. #else
  155105. "lsr r7, %[b], #16\n\t"
  155106. #endif
  155107. #ifdef WOLFSSL_KEIL
  155108. "muls r6, r7, r6\n\t"
  155109. #elif defined(__clang__)
  155110. "muls r6, r7\n\t"
  155111. #else
  155112. "mul r6, r7\n\t"
  155113. #endif
  155114. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155115. "lsrs r7, r6, #16\n\t"
  155116. #else
  155117. "lsr r7, r6, #16\n\t"
  155118. #endif
  155119. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155120. "lsls r6, r6, #16\n\t"
  155121. #else
  155122. "lsl r6, r6, #16\n\t"
  155123. #endif
  155124. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155125. "adds r4, r4, r6\n\t"
  155126. #else
  155127. "add r4, r4, r6\n\t"
  155128. #endif
  155129. #ifdef WOLFSSL_KEIL
  155130. "adcs r5, r5, r7\n\t"
  155131. #elif defined(__clang__)
  155132. "adcs r5, r7\n\t"
  155133. #else
  155134. "adc r5, r7\n\t"
  155135. #endif
  155136. #ifdef WOLFSSL_KEIL
  155137. "adcs r3, r3, %[r]\n\t"
  155138. #elif defined(__clang__)
  155139. "adcs r3, %[r]\n\t"
  155140. #else
  155141. "adc r3, %[r]\n\t"
  155142. #endif
  155143. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155144. "lsrs r6, %[a], #16\n\t"
  155145. #else
  155146. "lsr r6, %[a], #16\n\t"
  155147. #endif
  155148. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155149. "lsrs r7, %[b], #16\n\t"
  155150. #else
  155151. "lsr r7, %[b], #16\n\t"
  155152. #endif
  155153. #ifdef WOLFSSL_KEIL
  155154. "muls r7, r6, r7\n\t"
  155155. #elif defined(__clang__)
  155156. "muls r7, r6\n\t"
  155157. #else
  155158. "mul r7, r6\n\t"
  155159. #endif
  155160. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155161. "adds r5, r5, r7\n\t"
  155162. #else
  155163. "add r5, r5, r7\n\t"
  155164. #endif
  155165. #ifdef WOLFSSL_KEIL
  155166. "adcs r3, r3, %[r]\n\t"
  155167. #elif defined(__clang__)
  155168. "adcs r3, %[r]\n\t"
  155169. #else
  155170. "adc r3, %[r]\n\t"
  155171. #endif
  155172. "uxth r7, %[b]\n\t"
  155173. #ifdef WOLFSSL_KEIL
  155174. "muls r6, r7, r6\n\t"
  155175. #elif defined(__clang__)
  155176. "muls r6, r7\n\t"
  155177. #else
  155178. "mul r6, r7\n\t"
  155179. #endif
  155180. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155181. "lsrs r7, r6, #16\n\t"
  155182. #else
  155183. "lsr r7, r6, #16\n\t"
  155184. #endif
  155185. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155186. "lsls r6, r6, #16\n\t"
  155187. #else
  155188. "lsl r6, r6, #16\n\t"
  155189. #endif
  155190. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155191. "adds r4, r4, r6\n\t"
  155192. #else
  155193. "add r4, r4, r6\n\t"
  155194. #endif
  155195. #ifdef WOLFSSL_KEIL
  155196. "adcs r5, r5, r7\n\t"
  155197. #elif defined(__clang__)
  155198. "adcs r5, r7\n\t"
  155199. #else
  155200. "adc r5, r7\n\t"
  155201. #endif
  155202. #ifdef WOLFSSL_KEIL
  155203. "adcs r3, r3, %[r]\n\t"
  155204. #elif defined(__clang__)
  155205. "adcs r3, %[r]\n\t"
  155206. #else
  155207. "adc r3, %[r]\n\t"
  155208. #endif
  155209. "# A[3] * B[13]\n\t"
  155210. "mov %[a], r9\n\t"
  155211. "mov %[b], r10\n\t"
  155212. "ldr %[a], [%[a], #12]\n\t"
  155213. "ldr %[b], [%[b], #52]\n\t"
  155214. "uxth r6, %[a]\n\t"
  155215. "uxth r7, %[b]\n\t"
  155216. #ifdef WOLFSSL_KEIL
  155217. "muls r7, r6, r7\n\t"
  155218. #elif defined(__clang__)
  155219. "muls r7, r6\n\t"
  155220. #else
  155221. "mul r7, r6\n\t"
  155222. #endif
  155223. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155224. "adds r4, r4, r7\n\t"
  155225. #else
  155226. "add r4, r4, r7\n\t"
  155227. #endif
  155228. #ifdef WOLFSSL_KEIL
  155229. "adcs r5, r5, %[r]\n\t"
  155230. #elif defined(__clang__)
  155231. "adcs r5, %[r]\n\t"
  155232. #else
  155233. "adc r5, %[r]\n\t"
  155234. #endif
  155235. #ifdef WOLFSSL_KEIL
  155236. "adcs r3, r3, %[r]\n\t"
  155237. #elif defined(__clang__)
  155238. "adcs r3, %[r]\n\t"
  155239. #else
  155240. "adc r3, %[r]\n\t"
  155241. #endif
  155242. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155243. "lsrs r7, %[b], #16\n\t"
  155244. #else
  155245. "lsr r7, %[b], #16\n\t"
  155246. #endif
  155247. #ifdef WOLFSSL_KEIL
  155248. "muls r6, r7, r6\n\t"
  155249. #elif defined(__clang__)
  155250. "muls r6, r7\n\t"
  155251. #else
  155252. "mul r6, r7\n\t"
  155253. #endif
  155254. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155255. "lsrs r7, r6, #16\n\t"
  155256. #else
  155257. "lsr r7, r6, #16\n\t"
  155258. #endif
  155259. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155260. "lsls r6, r6, #16\n\t"
  155261. #else
  155262. "lsl r6, r6, #16\n\t"
  155263. #endif
  155264. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155265. "adds r4, r4, r6\n\t"
  155266. #else
  155267. "add r4, r4, r6\n\t"
  155268. #endif
  155269. #ifdef WOLFSSL_KEIL
  155270. "adcs r5, r5, r7\n\t"
  155271. #elif defined(__clang__)
  155272. "adcs r5, r7\n\t"
  155273. #else
  155274. "adc r5, r7\n\t"
  155275. #endif
  155276. #ifdef WOLFSSL_KEIL
  155277. "adcs r3, r3, %[r]\n\t"
  155278. #elif defined(__clang__)
  155279. "adcs r3, %[r]\n\t"
  155280. #else
  155281. "adc r3, %[r]\n\t"
  155282. #endif
  155283. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155284. "lsrs r6, %[a], #16\n\t"
  155285. #else
  155286. "lsr r6, %[a], #16\n\t"
  155287. #endif
  155288. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155289. "lsrs r7, %[b], #16\n\t"
  155290. #else
  155291. "lsr r7, %[b], #16\n\t"
  155292. #endif
  155293. #ifdef WOLFSSL_KEIL
  155294. "muls r7, r6, r7\n\t"
  155295. #elif defined(__clang__)
  155296. "muls r7, r6\n\t"
  155297. #else
  155298. "mul r7, r6\n\t"
  155299. #endif
  155300. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155301. "adds r5, r5, r7\n\t"
  155302. #else
  155303. "add r5, r5, r7\n\t"
  155304. #endif
  155305. #ifdef WOLFSSL_KEIL
  155306. "adcs r3, r3, %[r]\n\t"
  155307. #elif defined(__clang__)
  155308. "adcs r3, %[r]\n\t"
  155309. #else
  155310. "adc r3, %[r]\n\t"
  155311. #endif
  155312. "uxth r7, %[b]\n\t"
  155313. #ifdef WOLFSSL_KEIL
  155314. "muls r6, r7, r6\n\t"
  155315. #elif defined(__clang__)
  155316. "muls r6, r7\n\t"
  155317. #else
  155318. "mul r6, r7\n\t"
  155319. #endif
  155320. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155321. "lsrs r7, r6, #16\n\t"
  155322. #else
  155323. "lsr r7, r6, #16\n\t"
  155324. #endif
  155325. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155326. "lsls r6, r6, #16\n\t"
  155327. #else
  155328. "lsl r6, r6, #16\n\t"
  155329. #endif
  155330. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155331. "adds r4, r4, r6\n\t"
  155332. #else
  155333. "add r4, r4, r6\n\t"
  155334. #endif
  155335. #ifdef WOLFSSL_KEIL
  155336. "adcs r5, r5, r7\n\t"
  155337. #elif defined(__clang__)
  155338. "adcs r5, r7\n\t"
  155339. #else
  155340. "adc r5, r7\n\t"
  155341. #endif
  155342. #ifdef WOLFSSL_KEIL
  155343. "adcs r3, r3, %[r]\n\t"
  155344. #elif defined(__clang__)
  155345. "adcs r3, %[r]\n\t"
  155346. #else
  155347. "adc r3, %[r]\n\t"
  155348. #endif
  155349. "# A[2] * B[14]\n\t"
  155350. "mov %[a], r9\n\t"
  155351. "mov %[b], r10\n\t"
  155352. "ldr %[a], [%[a], #8]\n\t"
  155353. "ldr %[b], [%[b], #56]\n\t"
  155354. "uxth r6, %[a]\n\t"
  155355. "uxth r7, %[b]\n\t"
  155356. #ifdef WOLFSSL_KEIL
  155357. "muls r7, r6, r7\n\t"
  155358. #elif defined(__clang__)
  155359. "muls r7, r6\n\t"
  155360. #else
  155361. "mul r7, r6\n\t"
  155362. #endif
  155363. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155364. "adds r4, r4, r7\n\t"
  155365. #else
  155366. "add r4, r4, r7\n\t"
  155367. #endif
  155368. #ifdef WOLFSSL_KEIL
  155369. "adcs r5, r5, %[r]\n\t"
  155370. #elif defined(__clang__)
  155371. "adcs r5, %[r]\n\t"
  155372. #else
  155373. "adc r5, %[r]\n\t"
  155374. #endif
  155375. #ifdef WOLFSSL_KEIL
  155376. "adcs r3, r3, %[r]\n\t"
  155377. #elif defined(__clang__)
  155378. "adcs r3, %[r]\n\t"
  155379. #else
  155380. "adc r3, %[r]\n\t"
  155381. #endif
  155382. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155383. "lsrs r7, %[b], #16\n\t"
  155384. #else
  155385. "lsr r7, %[b], #16\n\t"
  155386. #endif
  155387. #ifdef WOLFSSL_KEIL
  155388. "muls r6, r7, r6\n\t"
  155389. #elif defined(__clang__)
  155390. "muls r6, r7\n\t"
  155391. #else
  155392. "mul r6, r7\n\t"
  155393. #endif
  155394. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155395. "lsrs r7, r6, #16\n\t"
  155396. #else
  155397. "lsr r7, r6, #16\n\t"
  155398. #endif
  155399. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155400. "lsls r6, r6, #16\n\t"
  155401. #else
  155402. "lsl r6, r6, #16\n\t"
  155403. #endif
  155404. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155405. "adds r4, r4, r6\n\t"
  155406. #else
  155407. "add r4, r4, r6\n\t"
  155408. #endif
  155409. #ifdef WOLFSSL_KEIL
  155410. "adcs r5, r5, r7\n\t"
  155411. #elif defined(__clang__)
  155412. "adcs r5, r7\n\t"
  155413. #else
  155414. "adc r5, r7\n\t"
  155415. #endif
  155416. #ifdef WOLFSSL_KEIL
  155417. "adcs r3, r3, %[r]\n\t"
  155418. #elif defined(__clang__)
  155419. "adcs r3, %[r]\n\t"
  155420. #else
  155421. "adc r3, %[r]\n\t"
  155422. #endif
  155423. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155424. "lsrs r6, %[a], #16\n\t"
  155425. #else
  155426. "lsr r6, %[a], #16\n\t"
  155427. #endif
  155428. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155429. "lsrs r7, %[b], #16\n\t"
  155430. #else
  155431. "lsr r7, %[b], #16\n\t"
  155432. #endif
  155433. #ifdef WOLFSSL_KEIL
  155434. "muls r7, r6, r7\n\t"
  155435. #elif defined(__clang__)
  155436. "muls r7, r6\n\t"
  155437. #else
  155438. "mul r7, r6\n\t"
  155439. #endif
  155440. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155441. "adds r5, r5, r7\n\t"
  155442. #else
  155443. "add r5, r5, r7\n\t"
  155444. #endif
  155445. #ifdef WOLFSSL_KEIL
  155446. "adcs r3, r3, %[r]\n\t"
  155447. #elif defined(__clang__)
  155448. "adcs r3, %[r]\n\t"
  155449. #else
  155450. "adc r3, %[r]\n\t"
  155451. #endif
  155452. "uxth r7, %[b]\n\t"
  155453. #ifdef WOLFSSL_KEIL
  155454. "muls r6, r7, r6\n\t"
  155455. #elif defined(__clang__)
  155456. "muls r6, r7\n\t"
  155457. #else
  155458. "mul r6, r7\n\t"
  155459. #endif
  155460. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155461. "lsrs r7, r6, #16\n\t"
  155462. #else
  155463. "lsr r7, r6, #16\n\t"
  155464. #endif
  155465. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155466. "lsls r6, r6, #16\n\t"
  155467. #else
  155468. "lsl r6, r6, #16\n\t"
  155469. #endif
  155470. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155471. "adds r4, r4, r6\n\t"
  155472. #else
  155473. "add r4, r4, r6\n\t"
  155474. #endif
  155475. #ifdef WOLFSSL_KEIL
  155476. "adcs r5, r5, r7\n\t"
  155477. #elif defined(__clang__)
  155478. "adcs r5, r7\n\t"
  155479. #else
  155480. "adc r5, r7\n\t"
  155481. #endif
  155482. #ifdef WOLFSSL_KEIL
  155483. "adcs r3, r3, %[r]\n\t"
  155484. #elif defined(__clang__)
  155485. "adcs r3, %[r]\n\t"
  155486. #else
  155487. "adc r3, %[r]\n\t"
  155488. #endif
  155489. "# A[1] * B[15]\n\t"
  155490. "mov %[a], r9\n\t"
  155491. "mov %[b], r10\n\t"
  155492. "ldr %[a], [%[a], #4]\n\t"
  155493. "ldr %[b], [%[b], #60]\n\t"
  155494. "uxth r6, %[a]\n\t"
  155495. "uxth r7, %[b]\n\t"
  155496. #ifdef WOLFSSL_KEIL
  155497. "muls r7, r6, r7\n\t"
  155498. #elif defined(__clang__)
  155499. "muls r7, r6\n\t"
  155500. #else
  155501. "mul r7, r6\n\t"
  155502. #endif
  155503. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155504. "adds r4, r4, r7\n\t"
  155505. #else
  155506. "add r4, r4, r7\n\t"
  155507. #endif
  155508. #ifdef WOLFSSL_KEIL
  155509. "adcs r5, r5, %[r]\n\t"
  155510. #elif defined(__clang__)
  155511. "adcs r5, %[r]\n\t"
  155512. #else
  155513. "adc r5, %[r]\n\t"
  155514. #endif
  155515. #ifdef WOLFSSL_KEIL
  155516. "adcs r3, r3, %[r]\n\t"
  155517. #elif defined(__clang__)
  155518. "adcs r3, %[r]\n\t"
  155519. #else
  155520. "adc r3, %[r]\n\t"
  155521. #endif
  155522. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155523. "lsrs r7, %[b], #16\n\t"
  155524. #else
  155525. "lsr r7, %[b], #16\n\t"
  155526. #endif
  155527. #ifdef WOLFSSL_KEIL
  155528. "muls r6, r7, r6\n\t"
  155529. #elif defined(__clang__)
  155530. "muls r6, r7\n\t"
  155531. #else
  155532. "mul r6, r7\n\t"
  155533. #endif
  155534. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155535. "lsrs r7, r6, #16\n\t"
  155536. #else
  155537. "lsr r7, r6, #16\n\t"
  155538. #endif
  155539. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155540. "lsls r6, r6, #16\n\t"
  155541. #else
  155542. "lsl r6, r6, #16\n\t"
  155543. #endif
  155544. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155545. "adds r4, r4, r6\n\t"
  155546. #else
  155547. "add r4, r4, r6\n\t"
  155548. #endif
  155549. #ifdef WOLFSSL_KEIL
  155550. "adcs r5, r5, r7\n\t"
  155551. #elif defined(__clang__)
  155552. "adcs r5, r7\n\t"
  155553. #else
  155554. "adc r5, r7\n\t"
  155555. #endif
  155556. #ifdef WOLFSSL_KEIL
  155557. "adcs r3, r3, %[r]\n\t"
  155558. #elif defined(__clang__)
  155559. "adcs r3, %[r]\n\t"
  155560. #else
  155561. "adc r3, %[r]\n\t"
  155562. #endif
  155563. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155564. "lsrs r6, %[a], #16\n\t"
  155565. #else
  155566. "lsr r6, %[a], #16\n\t"
  155567. #endif
  155568. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155569. "lsrs r7, %[b], #16\n\t"
  155570. #else
  155571. "lsr r7, %[b], #16\n\t"
  155572. #endif
  155573. #ifdef WOLFSSL_KEIL
  155574. "muls r7, r6, r7\n\t"
  155575. #elif defined(__clang__)
  155576. "muls r7, r6\n\t"
  155577. #else
  155578. "mul r7, r6\n\t"
  155579. #endif
  155580. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155581. "adds r5, r5, r7\n\t"
  155582. #else
  155583. "add r5, r5, r7\n\t"
  155584. #endif
  155585. #ifdef WOLFSSL_KEIL
  155586. "adcs r3, r3, %[r]\n\t"
  155587. #elif defined(__clang__)
  155588. "adcs r3, %[r]\n\t"
  155589. #else
  155590. "adc r3, %[r]\n\t"
  155591. #endif
  155592. "uxth r7, %[b]\n\t"
  155593. #ifdef WOLFSSL_KEIL
  155594. "muls r6, r7, r6\n\t"
  155595. #elif defined(__clang__)
  155596. "muls r6, r7\n\t"
  155597. #else
  155598. "mul r6, r7\n\t"
  155599. #endif
  155600. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155601. "lsrs r7, r6, #16\n\t"
  155602. #else
  155603. "lsr r7, r6, #16\n\t"
  155604. #endif
  155605. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155606. "lsls r6, r6, #16\n\t"
  155607. #else
  155608. "lsl r6, r6, #16\n\t"
  155609. #endif
  155610. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155611. "adds r4, r4, r6\n\t"
  155612. #else
  155613. "add r4, r4, r6\n\t"
  155614. #endif
  155615. #ifdef WOLFSSL_KEIL
  155616. "adcs r5, r5, r7\n\t"
  155617. #elif defined(__clang__)
  155618. "adcs r5, r7\n\t"
  155619. #else
  155620. "adc r5, r7\n\t"
  155621. #endif
  155622. #ifdef WOLFSSL_KEIL
  155623. "adcs r3, r3, %[r]\n\t"
  155624. #elif defined(__clang__)
  155625. "adcs r3, %[r]\n\t"
  155626. #else
  155627. "adc r3, %[r]\n\t"
  155628. #endif
  155629. "mov %[r], r8\n\t"
  155630. "str r4, [%[r], #64]\n\t"
  155631. "movs %[r], #0\n\t"
  155632. "# A[2] * B[15]\n\t"
  155633. "movs r4, #0\n\t"
  155634. "mov %[a], r9\n\t"
  155635. "mov %[b], r10\n\t"
  155636. "ldr %[a], [%[a], #8]\n\t"
  155637. "ldr %[b], [%[b], #60]\n\t"
  155638. "uxth r6, %[a]\n\t"
  155639. "uxth r7, %[b]\n\t"
  155640. #ifdef WOLFSSL_KEIL
  155641. "muls r7, r6, r7\n\t"
  155642. #elif defined(__clang__)
  155643. "muls r7, r6\n\t"
  155644. #else
  155645. "mul r7, r6\n\t"
  155646. #endif
  155647. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155648. "adds r5, r5, r7\n\t"
  155649. #else
  155650. "add r5, r5, r7\n\t"
  155651. #endif
  155652. #ifdef WOLFSSL_KEIL
  155653. "adcs r3, r3, %[r]\n\t"
  155654. #elif defined(__clang__)
  155655. "adcs r3, %[r]\n\t"
  155656. #else
  155657. "adc r3, %[r]\n\t"
  155658. #endif
  155659. #ifdef WOLFSSL_KEIL
  155660. "adcs r4, r4, %[r]\n\t"
  155661. #elif defined(__clang__)
  155662. "adcs r4, %[r]\n\t"
  155663. #else
  155664. "adc r4, %[r]\n\t"
  155665. #endif
  155666. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155667. "lsrs r7, %[b], #16\n\t"
  155668. #else
  155669. "lsr r7, %[b], #16\n\t"
  155670. #endif
  155671. #ifdef WOLFSSL_KEIL
  155672. "muls r6, r7, r6\n\t"
  155673. #elif defined(__clang__)
  155674. "muls r6, r7\n\t"
  155675. #else
  155676. "mul r6, r7\n\t"
  155677. #endif
  155678. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155679. "lsrs r7, r6, #16\n\t"
  155680. #else
  155681. "lsr r7, r6, #16\n\t"
  155682. #endif
  155683. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155684. "lsls r6, r6, #16\n\t"
  155685. #else
  155686. "lsl r6, r6, #16\n\t"
  155687. #endif
  155688. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155689. "adds r5, r5, r6\n\t"
  155690. #else
  155691. "add r5, r5, r6\n\t"
  155692. #endif
  155693. #ifdef WOLFSSL_KEIL
  155694. "adcs r3, r3, r7\n\t"
  155695. #elif defined(__clang__)
  155696. "adcs r3, r7\n\t"
  155697. #else
  155698. "adc r3, r7\n\t"
  155699. #endif
  155700. #ifdef WOLFSSL_KEIL
  155701. "adcs r4, r4, %[r]\n\t"
  155702. #elif defined(__clang__)
  155703. "adcs r4, %[r]\n\t"
  155704. #else
  155705. "adc r4, %[r]\n\t"
  155706. #endif
  155707. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155708. "lsrs r6, %[a], #16\n\t"
  155709. #else
  155710. "lsr r6, %[a], #16\n\t"
  155711. #endif
  155712. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155713. "lsrs r7, %[b], #16\n\t"
  155714. #else
  155715. "lsr r7, %[b], #16\n\t"
  155716. #endif
  155717. #ifdef WOLFSSL_KEIL
  155718. "muls r7, r6, r7\n\t"
  155719. #elif defined(__clang__)
  155720. "muls r7, r6\n\t"
  155721. #else
  155722. "mul r7, r6\n\t"
  155723. #endif
  155724. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155725. "adds r3, r3, r7\n\t"
  155726. #else
  155727. "add r3, r3, r7\n\t"
  155728. #endif
  155729. #ifdef WOLFSSL_KEIL
  155730. "adcs r4, r4, %[r]\n\t"
  155731. #elif defined(__clang__)
  155732. "adcs r4, %[r]\n\t"
  155733. #else
  155734. "adc r4, %[r]\n\t"
  155735. #endif
  155736. "uxth r7, %[b]\n\t"
  155737. #ifdef WOLFSSL_KEIL
  155738. "muls r6, r7, r6\n\t"
  155739. #elif defined(__clang__)
  155740. "muls r6, r7\n\t"
  155741. #else
  155742. "mul r6, r7\n\t"
  155743. #endif
  155744. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155745. "lsrs r7, r6, #16\n\t"
  155746. #else
  155747. "lsr r7, r6, #16\n\t"
  155748. #endif
  155749. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155750. "lsls r6, r6, #16\n\t"
  155751. #else
  155752. "lsl r6, r6, #16\n\t"
  155753. #endif
  155754. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155755. "adds r5, r5, r6\n\t"
  155756. #else
  155757. "add r5, r5, r6\n\t"
  155758. #endif
  155759. #ifdef WOLFSSL_KEIL
  155760. "adcs r3, r3, r7\n\t"
  155761. #elif defined(__clang__)
  155762. "adcs r3, r7\n\t"
  155763. #else
  155764. "adc r3, r7\n\t"
  155765. #endif
  155766. #ifdef WOLFSSL_KEIL
  155767. "adcs r4, r4, %[r]\n\t"
  155768. #elif defined(__clang__)
  155769. "adcs r4, %[r]\n\t"
  155770. #else
  155771. "adc r4, %[r]\n\t"
  155772. #endif
  155773. "# A[3] * B[14]\n\t"
  155774. "mov %[a], r9\n\t"
  155775. "mov %[b], r10\n\t"
  155776. "ldr %[a], [%[a], #12]\n\t"
  155777. "ldr %[b], [%[b], #56]\n\t"
  155778. "uxth r6, %[a]\n\t"
  155779. "uxth r7, %[b]\n\t"
  155780. #ifdef WOLFSSL_KEIL
  155781. "muls r7, r6, r7\n\t"
  155782. #elif defined(__clang__)
  155783. "muls r7, r6\n\t"
  155784. #else
  155785. "mul r7, r6\n\t"
  155786. #endif
  155787. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155788. "adds r5, r5, r7\n\t"
  155789. #else
  155790. "add r5, r5, r7\n\t"
  155791. #endif
  155792. #ifdef WOLFSSL_KEIL
  155793. "adcs r3, r3, %[r]\n\t"
  155794. #elif defined(__clang__)
  155795. "adcs r3, %[r]\n\t"
  155796. #else
  155797. "adc r3, %[r]\n\t"
  155798. #endif
  155799. #ifdef WOLFSSL_KEIL
  155800. "adcs r4, r4, %[r]\n\t"
  155801. #elif defined(__clang__)
  155802. "adcs r4, %[r]\n\t"
  155803. #else
  155804. "adc r4, %[r]\n\t"
  155805. #endif
  155806. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155807. "lsrs r7, %[b], #16\n\t"
  155808. #else
  155809. "lsr r7, %[b], #16\n\t"
  155810. #endif
  155811. #ifdef WOLFSSL_KEIL
  155812. "muls r6, r7, r6\n\t"
  155813. #elif defined(__clang__)
  155814. "muls r6, r7\n\t"
  155815. #else
  155816. "mul r6, r7\n\t"
  155817. #endif
  155818. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155819. "lsrs r7, r6, #16\n\t"
  155820. #else
  155821. "lsr r7, r6, #16\n\t"
  155822. #endif
  155823. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155824. "lsls r6, r6, #16\n\t"
  155825. #else
  155826. "lsl r6, r6, #16\n\t"
  155827. #endif
  155828. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155829. "adds r5, r5, r6\n\t"
  155830. #else
  155831. "add r5, r5, r6\n\t"
  155832. #endif
  155833. #ifdef WOLFSSL_KEIL
  155834. "adcs r3, r3, r7\n\t"
  155835. #elif defined(__clang__)
  155836. "adcs r3, r7\n\t"
  155837. #else
  155838. "adc r3, r7\n\t"
  155839. #endif
  155840. #ifdef WOLFSSL_KEIL
  155841. "adcs r4, r4, %[r]\n\t"
  155842. #elif defined(__clang__)
  155843. "adcs r4, %[r]\n\t"
  155844. #else
  155845. "adc r4, %[r]\n\t"
  155846. #endif
  155847. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155848. "lsrs r6, %[a], #16\n\t"
  155849. #else
  155850. "lsr r6, %[a], #16\n\t"
  155851. #endif
  155852. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155853. "lsrs r7, %[b], #16\n\t"
  155854. #else
  155855. "lsr r7, %[b], #16\n\t"
  155856. #endif
  155857. #ifdef WOLFSSL_KEIL
  155858. "muls r7, r6, r7\n\t"
  155859. #elif defined(__clang__)
  155860. "muls r7, r6\n\t"
  155861. #else
  155862. "mul r7, r6\n\t"
  155863. #endif
  155864. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155865. "adds r3, r3, r7\n\t"
  155866. #else
  155867. "add r3, r3, r7\n\t"
  155868. #endif
  155869. #ifdef WOLFSSL_KEIL
  155870. "adcs r4, r4, %[r]\n\t"
  155871. #elif defined(__clang__)
  155872. "adcs r4, %[r]\n\t"
  155873. #else
  155874. "adc r4, %[r]\n\t"
  155875. #endif
  155876. "uxth r7, %[b]\n\t"
  155877. #ifdef WOLFSSL_KEIL
  155878. "muls r6, r7, r6\n\t"
  155879. #elif defined(__clang__)
  155880. "muls r6, r7\n\t"
  155881. #else
  155882. "mul r6, r7\n\t"
  155883. #endif
  155884. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155885. "lsrs r7, r6, #16\n\t"
  155886. #else
  155887. "lsr r7, r6, #16\n\t"
  155888. #endif
  155889. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155890. "lsls r6, r6, #16\n\t"
  155891. #else
  155892. "lsl r6, r6, #16\n\t"
  155893. #endif
  155894. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155895. "adds r5, r5, r6\n\t"
  155896. #else
  155897. "add r5, r5, r6\n\t"
  155898. #endif
  155899. #ifdef WOLFSSL_KEIL
  155900. "adcs r3, r3, r7\n\t"
  155901. #elif defined(__clang__)
  155902. "adcs r3, r7\n\t"
  155903. #else
  155904. "adc r3, r7\n\t"
  155905. #endif
  155906. #ifdef WOLFSSL_KEIL
  155907. "adcs r4, r4, %[r]\n\t"
  155908. #elif defined(__clang__)
  155909. "adcs r4, %[r]\n\t"
  155910. #else
  155911. "adc r4, %[r]\n\t"
  155912. #endif
  155913. "# A[4] * B[13]\n\t"
  155914. "mov %[a], r9\n\t"
  155915. "mov %[b], r10\n\t"
  155916. "ldr %[a], [%[a], #16]\n\t"
  155917. "ldr %[b], [%[b], #52]\n\t"
  155918. "uxth r6, %[a]\n\t"
  155919. "uxth r7, %[b]\n\t"
  155920. #ifdef WOLFSSL_KEIL
  155921. "muls r7, r6, r7\n\t"
  155922. #elif defined(__clang__)
  155923. "muls r7, r6\n\t"
  155924. #else
  155925. "mul r7, r6\n\t"
  155926. #endif
  155927. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155928. "adds r5, r5, r7\n\t"
  155929. #else
  155930. "add r5, r5, r7\n\t"
  155931. #endif
  155932. #ifdef WOLFSSL_KEIL
  155933. "adcs r3, r3, %[r]\n\t"
  155934. #elif defined(__clang__)
  155935. "adcs r3, %[r]\n\t"
  155936. #else
  155937. "adc r3, %[r]\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. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155947. "lsrs r7, %[b], #16\n\t"
  155948. #else
  155949. "lsr r7, %[b], #16\n\t"
  155950. #endif
  155951. #ifdef WOLFSSL_KEIL
  155952. "muls r6, r7, r6\n\t"
  155953. #elif defined(__clang__)
  155954. "muls r6, r7\n\t"
  155955. #else
  155956. "mul r6, r7\n\t"
  155957. #endif
  155958. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155959. "lsrs r7, r6, #16\n\t"
  155960. #else
  155961. "lsr r7, r6, #16\n\t"
  155962. #endif
  155963. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155964. "lsls r6, r6, #16\n\t"
  155965. #else
  155966. "lsl r6, r6, #16\n\t"
  155967. #endif
  155968. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155969. "adds r5, r5, r6\n\t"
  155970. #else
  155971. "add r5, r5, r6\n\t"
  155972. #endif
  155973. #ifdef WOLFSSL_KEIL
  155974. "adcs r3, r3, r7\n\t"
  155975. #elif defined(__clang__)
  155976. "adcs r3, r7\n\t"
  155977. #else
  155978. "adc r3, r7\n\t"
  155979. #endif
  155980. #ifdef WOLFSSL_KEIL
  155981. "adcs r4, r4, %[r]\n\t"
  155982. #elif defined(__clang__)
  155983. "adcs r4, %[r]\n\t"
  155984. #else
  155985. "adc r4, %[r]\n\t"
  155986. #endif
  155987. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155988. "lsrs r6, %[a], #16\n\t"
  155989. #else
  155990. "lsr r6, %[a], #16\n\t"
  155991. #endif
  155992. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155993. "lsrs r7, %[b], #16\n\t"
  155994. #else
  155995. "lsr r7, %[b], #16\n\t"
  155996. #endif
  155997. #ifdef WOLFSSL_KEIL
  155998. "muls r7, r6, r7\n\t"
  155999. #elif defined(__clang__)
  156000. "muls r7, r6\n\t"
  156001. #else
  156002. "mul r7, r6\n\t"
  156003. #endif
  156004. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156005. "adds r3, r3, r7\n\t"
  156006. #else
  156007. "add r3, r3, r7\n\t"
  156008. #endif
  156009. #ifdef WOLFSSL_KEIL
  156010. "adcs r4, r4, %[r]\n\t"
  156011. #elif defined(__clang__)
  156012. "adcs r4, %[r]\n\t"
  156013. #else
  156014. "adc r4, %[r]\n\t"
  156015. #endif
  156016. "uxth r7, %[b]\n\t"
  156017. #ifdef WOLFSSL_KEIL
  156018. "muls r6, r7, r6\n\t"
  156019. #elif defined(__clang__)
  156020. "muls r6, r7\n\t"
  156021. #else
  156022. "mul r6, r7\n\t"
  156023. #endif
  156024. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156025. "lsrs r7, r6, #16\n\t"
  156026. #else
  156027. "lsr r7, r6, #16\n\t"
  156028. #endif
  156029. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156030. "lsls r6, r6, #16\n\t"
  156031. #else
  156032. "lsl r6, r6, #16\n\t"
  156033. #endif
  156034. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156035. "adds r5, r5, r6\n\t"
  156036. #else
  156037. "add r5, r5, r6\n\t"
  156038. #endif
  156039. #ifdef WOLFSSL_KEIL
  156040. "adcs r3, r3, r7\n\t"
  156041. #elif defined(__clang__)
  156042. "adcs r3, r7\n\t"
  156043. #else
  156044. "adc r3, r7\n\t"
  156045. #endif
  156046. #ifdef WOLFSSL_KEIL
  156047. "adcs r4, r4, %[r]\n\t"
  156048. #elif defined(__clang__)
  156049. "adcs r4, %[r]\n\t"
  156050. #else
  156051. "adc r4, %[r]\n\t"
  156052. #endif
  156053. "# A[5] * B[12]\n\t"
  156054. "mov %[a], r9\n\t"
  156055. "mov %[b], r10\n\t"
  156056. "ldr %[a], [%[a], #20]\n\t"
  156057. "ldr %[b], [%[b], #48]\n\t"
  156058. "uxth r6, %[a]\n\t"
  156059. "uxth r7, %[b]\n\t"
  156060. #ifdef WOLFSSL_KEIL
  156061. "muls r7, r6, r7\n\t"
  156062. #elif defined(__clang__)
  156063. "muls r7, r6\n\t"
  156064. #else
  156065. "mul r7, r6\n\t"
  156066. #endif
  156067. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156068. "adds r5, r5, r7\n\t"
  156069. #else
  156070. "add r5, r5, r7\n\t"
  156071. #endif
  156072. #ifdef WOLFSSL_KEIL
  156073. "adcs r3, r3, %[r]\n\t"
  156074. #elif defined(__clang__)
  156075. "adcs r3, %[r]\n\t"
  156076. #else
  156077. "adc r3, %[r]\n\t"
  156078. #endif
  156079. #ifdef WOLFSSL_KEIL
  156080. "adcs r4, r4, %[r]\n\t"
  156081. #elif defined(__clang__)
  156082. "adcs r4, %[r]\n\t"
  156083. #else
  156084. "adc r4, %[r]\n\t"
  156085. #endif
  156086. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156087. "lsrs r7, %[b], #16\n\t"
  156088. #else
  156089. "lsr r7, %[b], #16\n\t"
  156090. #endif
  156091. #ifdef WOLFSSL_KEIL
  156092. "muls r6, r7, r6\n\t"
  156093. #elif defined(__clang__)
  156094. "muls r6, r7\n\t"
  156095. #else
  156096. "mul r6, r7\n\t"
  156097. #endif
  156098. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156099. "lsrs r7, r6, #16\n\t"
  156100. #else
  156101. "lsr r7, r6, #16\n\t"
  156102. #endif
  156103. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156104. "lsls r6, r6, #16\n\t"
  156105. #else
  156106. "lsl r6, r6, #16\n\t"
  156107. #endif
  156108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156109. "adds r5, r5, r6\n\t"
  156110. #else
  156111. "add r5, r5, r6\n\t"
  156112. #endif
  156113. #ifdef WOLFSSL_KEIL
  156114. "adcs r3, r3, r7\n\t"
  156115. #elif defined(__clang__)
  156116. "adcs r3, r7\n\t"
  156117. #else
  156118. "adc r3, r7\n\t"
  156119. #endif
  156120. #ifdef WOLFSSL_KEIL
  156121. "adcs r4, r4, %[r]\n\t"
  156122. #elif defined(__clang__)
  156123. "adcs r4, %[r]\n\t"
  156124. #else
  156125. "adc r4, %[r]\n\t"
  156126. #endif
  156127. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156128. "lsrs r6, %[a], #16\n\t"
  156129. #else
  156130. "lsr r6, %[a], #16\n\t"
  156131. #endif
  156132. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156133. "lsrs r7, %[b], #16\n\t"
  156134. #else
  156135. "lsr r7, %[b], #16\n\t"
  156136. #endif
  156137. #ifdef WOLFSSL_KEIL
  156138. "muls r7, r6, r7\n\t"
  156139. #elif defined(__clang__)
  156140. "muls r7, r6\n\t"
  156141. #else
  156142. "mul r7, r6\n\t"
  156143. #endif
  156144. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156145. "adds r3, r3, r7\n\t"
  156146. #else
  156147. "add r3, r3, r7\n\t"
  156148. #endif
  156149. #ifdef WOLFSSL_KEIL
  156150. "adcs r4, r4, %[r]\n\t"
  156151. #elif defined(__clang__)
  156152. "adcs r4, %[r]\n\t"
  156153. #else
  156154. "adc r4, %[r]\n\t"
  156155. #endif
  156156. "uxth r7, %[b]\n\t"
  156157. #ifdef WOLFSSL_KEIL
  156158. "muls r6, r7, r6\n\t"
  156159. #elif defined(__clang__)
  156160. "muls r6, r7\n\t"
  156161. #else
  156162. "mul r6, r7\n\t"
  156163. #endif
  156164. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156165. "lsrs r7, r6, #16\n\t"
  156166. #else
  156167. "lsr r7, r6, #16\n\t"
  156168. #endif
  156169. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156170. "lsls r6, r6, #16\n\t"
  156171. #else
  156172. "lsl r6, r6, #16\n\t"
  156173. #endif
  156174. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156175. "adds r5, r5, r6\n\t"
  156176. #else
  156177. "add r5, r5, r6\n\t"
  156178. #endif
  156179. #ifdef WOLFSSL_KEIL
  156180. "adcs r3, r3, r7\n\t"
  156181. #elif defined(__clang__)
  156182. "adcs r3, r7\n\t"
  156183. #else
  156184. "adc r3, r7\n\t"
  156185. #endif
  156186. #ifdef WOLFSSL_KEIL
  156187. "adcs r4, r4, %[r]\n\t"
  156188. #elif defined(__clang__)
  156189. "adcs r4, %[r]\n\t"
  156190. #else
  156191. "adc r4, %[r]\n\t"
  156192. #endif
  156193. "# A[6] * B[11]\n\t"
  156194. "mov %[a], r9\n\t"
  156195. "mov %[b], r10\n\t"
  156196. "ldr %[a], [%[a], #24]\n\t"
  156197. "ldr %[b], [%[b], #44]\n\t"
  156198. "uxth r6, %[a]\n\t"
  156199. "uxth r7, %[b]\n\t"
  156200. #ifdef WOLFSSL_KEIL
  156201. "muls r7, r6, r7\n\t"
  156202. #elif defined(__clang__)
  156203. "muls r7, r6\n\t"
  156204. #else
  156205. "mul r7, r6\n\t"
  156206. #endif
  156207. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156208. "adds r5, r5, r7\n\t"
  156209. #else
  156210. "add r5, r5, r7\n\t"
  156211. #endif
  156212. #ifdef WOLFSSL_KEIL
  156213. "adcs r3, r3, %[r]\n\t"
  156214. #elif defined(__clang__)
  156215. "adcs r3, %[r]\n\t"
  156216. #else
  156217. "adc r3, %[r]\n\t"
  156218. #endif
  156219. #ifdef WOLFSSL_KEIL
  156220. "adcs r4, r4, %[r]\n\t"
  156221. #elif defined(__clang__)
  156222. "adcs r4, %[r]\n\t"
  156223. #else
  156224. "adc r4, %[r]\n\t"
  156225. #endif
  156226. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156227. "lsrs r7, %[b], #16\n\t"
  156228. #else
  156229. "lsr r7, %[b], #16\n\t"
  156230. #endif
  156231. #ifdef WOLFSSL_KEIL
  156232. "muls r6, r7, r6\n\t"
  156233. #elif defined(__clang__)
  156234. "muls r6, r7\n\t"
  156235. #else
  156236. "mul r6, r7\n\t"
  156237. #endif
  156238. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156239. "lsrs r7, r6, #16\n\t"
  156240. #else
  156241. "lsr r7, r6, #16\n\t"
  156242. #endif
  156243. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156244. "lsls r6, r6, #16\n\t"
  156245. #else
  156246. "lsl r6, r6, #16\n\t"
  156247. #endif
  156248. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156249. "adds r5, r5, r6\n\t"
  156250. #else
  156251. "add r5, r5, r6\n\t"
  156252. #endif
  156253. #ifdef WOLFSSL_KEIL
  156254. "adcs r3, r3, r7\n\t"
  156255. #elif defined(__clang__)
  156256. "adcs r3, r7\n\t"
  156257. #else
  156258. "adc r3, r7\n\t"
  156259. #endif
  156260. #ifdef WOLFSSL_KEIL
  156261. "adcs r4, r4, %[r]\n\t"
  156262. #elif defined(__clang__)
  156263. "adcs r4, %[r]\n\t"
  156264. #else
  156265. "adc r4, %[r]\n\t"
  156266. #endif
  156267. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156268. "lsrs r6, %[a], #16\n\t"
  156269. #else
  156270. "lsr r6, %[a], #16\n\t"
  156271. #endif
  156272. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156273. "lsrs r7, %[b], #16\n\t"
  156274. #else
  156275. "lsr r7, %[b], #16\n\t"
  156276. #endif
  156277. #ifdef WOLFSSL_KEIL
  156278. "muls r7, r6, r7\n\t"
  156279. #elif defined(__clang__)
  156280. "muls r7, r6\n\t"
  156281. #else
  156282. "mul r7, r6\n\t"
  156283. #endif
  156284. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156285. "adds r3, r3, r7\n\t"
  156286. #else
  156287. "add r3, r3, r7\n\t"
  156288. #endif
  156289. #ifdef WOLFSSL_KEIL
  156290. "adcs r4, r4, %[r]\n\t"
  156291. #elif defined(__clang__)
  156292. "adcs r4, %[r]\n\t"
  156293. #else
  156294. "adc r4, %[r]\n\t"
  156295. #endif
  156296. "uxth r7, %[b]\n\t"
  156297. #ifdef WOLFSSL_KEIL
  156298. "muls r6, r7, r6\n\t"
  156299. #elif defined(__clang__)
  156300. "muls r6, r7\n\t"
  156301. #else
  156302. "mul r6, r7\n\t"
  156303. #endif
  156304. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156305. "lsrs r7, r6, #16\n\t"
  156306. #else
  156307. "lsr r7, r6, #16\n\t"
  156308. #endif
  156309. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156310. "lsls r6, r6, #16\n\t"
  156311. #else
  156312. "lsl r6, r6, #16\n\t"
  156313. #endif
  156314. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156315. "adds r5, r5, r6\n\t"
  156316. #else
  156317. "add r5, r5, r6\n\t"
  156318. #endif
  156319. #ifdef WOLFSSL_KEIL
  156320. "adcs r3, r3, r7\n\t"
  156321. #elif defined(__clang__)
  156322. "adcs r3, r7\n\t"
  156323. #else
  156324. "adc r3, r7\n\t"
  156325. #endif
  156326. #ifdef WOLFSSL_KEIL
  156327. "adcs r4, r4, %[r]\n\t"
  156328. #elif defined(__clang__)
  156329. "adcs r4, %[r]\n\t"
  156330. #else
  156331. "adc r4, %[r]\n\t"
  156332. #endif
  156333. "# A[7] * B[10]\n\t"
  156334. "mov %[a], r9\n\t"
  156335. "mov %[b], r10\n\t"
  156336. "ldr %[a], [%[a], #28]\n\t"
  156337. "ldr %[b], [%[b], #40]\n\t"
  156338. "uxth r6, %[a]\n\t"
  156339. "uxth r7, %[b]\n\t"
  156340. #ifdef WOLFSSL_KEIL
  156341. "muls r7, r6, r7\n\t"
  156342. #elif defined(__clang__)
  156343. "muls r7, r6\n\t"
  156344. #else
  156345. "mul r7, r6\n\t"
  156346. #endif
  156347. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156348. "adds r5, r5, r7\n\t"
  156349. #else
  156350. "add r5, r5, r7\n\t"
  156351. #endif
  156352. #ifdef WOLFSSL_KEIL
  156353. "adcs r3, r3, %[r]\n\t"
  156354. #elif defined(__clang__)
  156355. "adcs r3, %[r]\n\t"
  156356. #else
  156357. "adc r3, %[r]\n\t"
  156358. #endif
  156359. #ifdef WOLFSSL_KEIL
  156360. "adcs r4, r4, %[r]\n\t"
  156361. #elif defined(__clang__)
  156362. "adcs r4, %[r]\n\t"
  156363. #else
  156364. "adc r4, %[r]\n\t"
  156365. #endif
  156366. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156367. "lsrs r7, %[b], #16\n\t"
  156368. #else
  156369. "lsr r7, %[b], #16\n\t"
  156370. #endif
  156371. #ifdef WOLFSSL_KEIL
  156372. "muls r6, r7, r6\n\t"
  156373. #elif defined(__clang__)
  156374. "muls r6, r7\n\t"
  156375. #else
  156376. "mul r6, r7\n\t"
  156377. #endif
  156378. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156379. "lsrs r7, r6, #16\n\t"
  156380. #else
  156381. "lsr r7, r6, #16\n\t"
  156382. #endif
  156383. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156384. "lsls r6, r6, #16\n\t"
  156385. #else
  156386. "lsl r6, r6, #16\n\t"
  156387. #endif
  156388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156389. "adds r5, r5, r6\n\t"
  156390. #else
  156391. "add r5, r5, r6\n\t"
  156392. #endif
  156393. #ifdef WOLFSSL_KEIL
  156394. "adcs r3, r3, r7\n\t"
  156395. #elif defined(__clang__)
  156396. "adcs r3, r7\n\t"
  156397. #else
  156398. "adc r3, r7\n\t"
  156399. #endif
  156400. #ifdef WOLFSSL_KEIL
  156401. "adcs r4, r4, %[r]\n\t"
  156402. #elif defined(__clang__)
  156403. "adcs r4, %[r]\n\t"
  156404. #else
  156405. "adc r4, %[r]\n\t"
  156406. #endif
  156407. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156408. "lsrs r6, %[a], #16\n\t"
  156409. #else
  156410. "lsr r6, %[a], #16\n\t"
  156411. #endif
  156412. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156413. "lsrs r7, %[b], #16\n\t"
  156414. #else
  156415. "lsr r7, %[b], #16\n\t"
  156416. #endif
  156417. #ifdef WOLFSSL_KEIL
  156418. "muls r7, r6, r7\n\t"
  156419. #elif defined(__clang__)
  156420. "muls r7, r6\n\t"
  156421. #else
  156422. "mul r7, r6\n\t"
  156423. #endif
  156424. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156425. "adds r3, r3, r7\n\t"
  156426. #else
  156427. "add r3, r3, r7\n\t"
  156428. #endif
  156429. #ifdef WOLFSSL_KEIL
  156430. "adcs r4, r4, %[r]\n\t"
  156431. #elif defined(__clang__)
  156432. "adcs r4, %[r]\n\t"
  156433. #else
  156434. "adc r4, %[r]\n\t"
  156435. #endif
  156436. "uxth r7, %[b]\n\t"
  156437. #ifdef WOLFSSL_KEIL
  156438. "muls r6, r7, r6\n\t"
  156439. #elif defined(__clang__)
  156440. "muls r6, r7\n\t"
  156441. #else
  156442. "mul r6, r7\n\t"
  156443. #endif
  156444. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156445. "lsrs r7, r6, #16\n\t"
  156446. #else
  156447. "lsr r7, r6, #16\n\t"
  156448. #endif
  156449. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156450. "lsls r6, r6, #16\n\t"
  156451. #else
  156452. "lsl r6, r6, #16\n\t"
  156453. #endif
  156454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156455. "adds r5, r5, r6\n\t"
  156456. #else
  156457. "add r5, r5, r6\n\t"
  156458. #endif
  156459. #ifdef WOLFSSL_KEIL
  156460. "adcs r3, r3, r7\n\t"
  156461. #elif defined(__clang__)
  156462. "adcs r3, r7\n\t"
  156463. #else
  156464. "adc r3, r7\n\t"
  156465. #endif
  156466. #ifdef WOLFSSL_KEIL
  156467. "adcs r4, r4, %[r]\n\t"
  156468. #elif defined(__clang__)
  156469. "adcs r4, %[r]\n\t"
  156470. #else
  156471. "adc r4, %[r]\n\t"
  156472. #endif
  156473. "# A[8] * B[9]\n\t"
  156474. "mov %[a], r9\n\t"
  156475. "mov %[b], r10\n\t"
  156476. "ldr %[a], [%[a], #32]\n\t"
  156477. "ldr %[b], [%[b], #36]\n\t"
  156478. "uxth r6, %[a]\n\t"
  156479. "uxth r7, %[b]\n\t"
  156480. #ifdef WOLFSSL_KEIL
  156481. "muls r7, r6, r7\n\t"
  156482. #elif defined(__clang__)
  156483. "muls r7, r6\n\t"
  156484. #else
  156485. "mul r7, r6\n\t"
  156486. #endif
  156487. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156488. "adds r5, r5, r7\n\t"
  156489. #else
  156490. "add r5, r5, r7\n\t"
  156491. #endif
  156492. #ifdef WOLFSSL_KEIL
  156493. "adcs r3, r3, %[r]\n\t"
  156494. #elif defined(__clang__)
  156495. "adcs r3, %[r]\n\t"
  156496. #else
  156497. "adc r3, %[r]\n\t"
  156498. #endif
  156499. #ifdef WOLFSSL_KEIL
  156500. "adcs r4, r4, %[r]\n\t"
  156501. #elif defined(__clang__)
  156502. "adcs r4, %[r]\n\t"
  156503. #else
  156504. "adc r4, %[r]\n\t"
  156505. #endif
  156506. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156507. "lsrs r7, %[b], #16\n\t"
  156508. #else
  156509. "lsr r7, %[b], #16\n\t"
  156510. #endif
  156511. #ifdef WOLFSSL_KEIL
  156512. "muls r6, r7, r6\n\t"
  156513. #elif defined(__clang__)
  156514. "muls r6, r7\n\t"
  156515. #else
  156516. "mul r6, r7\n\t"
  156517. #endif
  156518. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156519. "lsrs r7, r6, #16\n\t"
  156520. #else
  156521. "lsr r7, r6, #16\n\t"
  156522. #endif
  156523. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156524. "lsls r6, r6, #16\n\t"
  156525. #else
  156526. "lsl r6, r6, #16\n\t"
  156527. #endif
  156528. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156529. "adds r5, r5, r6\n\t"
  156530. #else
  156531. "add r5, r5, r6\n\t"
  156532. #endif
  156533. #ifdef WOLFSSL_KEIL
  156534. "adcs r3, r3, r7\n\t"
  156535. #elif defined(__clang__)
  156536. "adcs r3, r7\n\t"
  156537. #else
  156538. "adc r3, r7\n\t"
  156539. #endif
  156540. #ifdef WOLFSSL_KEIL
  156541. "adcs r4, r4, %[r]\n\t"
  156542. #elif defined(__clang__)
  156543. "adcs r4, %[r]\n\t"
  156544. #else
  156545. "adc r4, %[r]\n\t"
  156546. #endif
  156547. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156548. "lsrs r6, %[a], #16\n\t"
  156549. #else
  156550. "lsr r6, %[a], #16\n\t"
  156551. #endif
  156552. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156553. "lsrs r7, %[b], #16\n\t"
  156554. #else
  156555. "lsr r7, %[b], #16\n\t"
  156556. #endif
  156557. #ifdef WOLFSSL_KEIL
  156558. "muls r7, r6, r7\n\t"
  156559. #elif defined(__clang__)
  156560. "muls r7, r6\n\t"
  156561. #else
  156562. "mul r7, r6\n\t"
  156563. #endif
  156564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156565. "adds r3, r3, r7\n\t"
  156566. #else
  156567. "add r3, r3, r7\n\t"
  156568. #endif
  156569. #ifdef WOLFSSL_KEIL
  156570. "adcs r4, r4, %[r]\n\t"
  156571. #elif defined(__clang__)
  156572. "adcs r4, %[r]\n\t"
  156573. #else
  156574. "adc r4, %[r]\n\t"
  156575. #endif
  156576. "uxth r7, %[b]\n\t"
  156577. #ifdef WOLFSSL_KEIL
  156578. "muls r6, r7, r6\n\t"
  156579. #elif defined(__clang__)
  156580. "muls r6, r7\n\t"
  156581. #else
  156582. "mul r6, r7\n\t"
  156583. #endif
  156584. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156585. "lsrs r7, r6, #16\n\t"
  156586. #else
  156587. "lsr r7, r6, #16\n\t"
  156588. #endif
  156589. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156590. "lsls r6, r6, #16\n\t"
  156591. #else
  156592. "lsl r6, r6, #16\n\t"
  156593. #endif
  156594. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156595. "adds r5, r5, r6\n\t"
  156596. #else
  156597. "add r5, r5, r6\n\t"
  156598. #endif
  156599. #ifdef WOLFSSL_KEIL
  156600. "adcs r3, r3, r7\n\t"
  156601. #elif defined(__clang__)
  156602. "adcs r3, r7\n\t"
  156603. #else
  156604. "adc r3, r7\n\t"
  156605. #endif
  156606. #ifdef WOLFSSL_KEIL
  156607. "adcs r4, r4, %[r]\n\t"
  156608. #elif defined(__clang__)
  156609. "adcs r4, %[r]\n\t"
  156610. #else
  156611. "adc r4, %[r]\n\t"
  156612. #endif
  156613. "# A[9] * B[8]\n\t"
  156614. "mov %[a], r9\n\t"
  156615. "mov %[b], r10\n\t"
  156616. "ldr %[a], [%[a], #36]\n\t"
  156617. "ldr %[b], [%[b], #32]\n\t"
  156618. "uxth r6, %[a]\n\t"
  156619. "uxth r7, %[b]\n\t"
  156620. #ifdef WOLFSSL_KEIL
  156621. "muls r7, r6, r7\n\t"
  156622. #elif defined(__clang__)
  156623. "muls r7, r6\n\t"
  156624. #else
  156625. "mul r7, r6\n\t"
  156626. #endif
  156627. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156628. "adds r5, r5, r7\n\t"
  156629. #else
  156630. "add r5, r5, r7\n\t"
  156631. #endif
  156632. #ifdef WOLFSSL_KEIL
  156633. "adcs r3, r3, %[r]\n\t"
  156634. #elif defined(__clang__)
  156635. "adcs r3, %[r]\n\t"
  156636. #else
  156637. "adc r3, %[r]\n\t"
  156638. #endif
  156639. #ifdef WOLFSSL_KEIL
  156640. "adcs r4, r4, %[r]\n\t"
  156641. #elif defined(__clang__)
  156642. "adcs r4, %[r]\n\t"
  156643. #else
  156644. "adc r4, %[r]\n\t"
  156645. #endif
  156646. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156647. "lsrs r7, %[b], #16\n\t"
  156648. #else
  156649. "lsr r7, %[b], #16\n\t"
  156650. #endif
  156651. #ifdef WOLFSSL_KEIL
  156652. "muls r6, r7, r6\n\t"
  156653. #elif defined(__clang__)
  156654. "muls r6, r7\n\t"
  156655. #else
  156656. "mul r6, r7\n\t"
  156657. #endif
  156658. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156659. "lsrs r7, r6, #16\n\t"
  156660. #else
  156661. "lsr r7, r6, #16\n\t"
  156662. #endif
  156663. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156664. "lsls r6, r6, #16\n\t"
  156665. #else
  156666. "lsl r6, r6, #16\n\t"
  156667. #endif
  156668. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156669. "adds r5, r5, r6\n\t"
  156670. #else
  156671. "add r5, r5, r6\n\t"
  156672. #endif
  156673. #ifdef WOLFSSL_KEIL
  156674. "adcs r3, r3, r7\n\t"
  156675. #elif defined(__clang__)
  156676. "adcs r3, r7\n\t"
  156677. #else
  156678. "adc r3, r7\n\t"
  156679. #endif
  156680. #ifdef WOLFSSL_KEIL
  156681. "adcs r4, r4, %[r]\n\t"
  156682. #elif defined(__clang__)
  156683. "adcs r4, %[r]\n\t"
  156684. #else
  156685. "adc r4, %[r]\n\t"
  156686. #endif
  156687. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156688. "lsrs r6, %[a], #16\n\t"
  156689. #else
  156690. "lsr r6, %[a], #16\n\t"
  156691. #endif
  156692. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156693. "lsrs r7, %[b], #16\n\t"
  156694. #else
  156695. "lsr r7, %[b], #16\n\t"
  156696. #endif
  156697. #ifdef WOLFSSL_KEIL
  156698. "muls r7, r6, r7\n\t"
  156699. #elif defined(__clang__)
  156700. "muls r7, r6\n\t"
  156701. #else
  156702. "mul r7, r6\n\t"
  156703. #endif
  156704. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156705. "adds r3, r3, r7\n\t"
  156706. #else
  156707. "add r3, r3, r7\n\t"
  156708. #endif
  156709. #ifdef WOLFSSL_KEIL
  156710. "adcs r4, r4, %[r]\n\t"
  156711. #elif defined(__clang__)
  156712. "adcs r4, %[r]\n\t"
  156713. #else
  156714. "adc r4, %[r]\n\t"
  156715. #endif
  156716. "uxth r7, %[b]\n\t"
  156717. #ifdef WOLFSSL_KEIL
  156718. "muls r6, r7, r6\n\t"
  156719. #elif defined(__clang__)
  156720. "muls r6, r7\n\t"
  156721. #else
  156722. "mul r6, r7\n\t"
  156723. #endif
  156724. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156725. "lsrs r7, r6, #16\n\t"
  156726. #else
  156727. "lsr r7, r6, #16\n\t"
  156728. #endif
  156729. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156730. "lsls r6, r6, #16\n\t"
  156731. #else
  156732. "lsl r6, r6, #16\n\t"
  156733. #endif
  156734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156735. "adds r5, r5, r6\n\t"
  156736. #else
  156737. "add r5, r5, r6\n\t"
  156738. #endif
  156739. #ifdef WOLFSSL_KEIL
  156740. "adcs r3, r3, r7\n\t"
  156741. #elif defined(__clang__)
  156742. "adcs r3, r7\n\t"
  156743. #else
  156744. "adc r3, r7\n\t"
  156745. #endif
  156746. #ifdef WOLFSSL_KEIL
  156747. "adcs r4, r4, %[r]\n\t"
  156748. #elif defined(__clang__)
  156749. "adcs r4, %[r]\n\t"
  156750. #else
  156751. "adc r4, %[r]\n\t"
  156752. #endif
  156753. "# A[10] * B[7]\n\t"
  156754. "mov %[a], r9\n\t"
  156755. "mov %[b], r10\n\t"
  156756. "ldr %[a], [%[a], #40]\n\t"
  156757. "ldr %[b], [%[b], #28]\n\t"
  156758. "uxth r6, %[a]\n\t"
  156759. "uxth r7, %[b]\n\t"
  156760. #ifdef WOLFSSL_KEIL
  156761. "muls r7, r6, r7\n\t"
  156762. #elif defined(__clang__)
  156763. "muls r7, r6\n\t"
  156764. #else
  156765. "mul r7, r6\n\t"
  156766. #endif
  156767. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156768. "adds r5, r5, r7\n\t"
  156769. #else
  156770. "add r5, r5, r7\n\t"
  156771. #endif
  156772. #ifdef WOLFSSL_KEIL
  156773. "adcs r3, r3, %[r]\n\t"
  156774. #elif defined(__clang__)
  156775. "adcs r3, %[r]\n\t"
  156776. #else
  156777. "adc r3, %[r]\n\t"
  156778. #endif
  156779. #ifdef WOLFSSL_KEIL
  156780. "adcs r4, r4, %[r]\n\t"
  156781. #elif defined(__clang__)
  156782. "adcs r4, %[r]\n\t"
  156783. #else
  156784. "adc r4, %[r]\n\t"
  156785. #endif
  156786. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156787. "lsrs r7, %[b], #16\n\t"
  156788. #else
  156789. "lsr r7, %[b], #16\n\t"
  156790. #endif
  156791. #ifdef WOLFSSL_KEIL
  156792. "muls r6, r7, r6\n\t"
  156793. #elif defined(__clang__)
  156794. "muls r6, r7\n\t"
  156795. #else
  156796. "mul r6, r7\n\t"
  156797. #endif
  156798. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156799. "lsrs r7, r6, #16\n\t"
  156800. #else
  156801. "lsr r7, r6, #16\n\t"
  156802. #endif
  156803. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156804. "lsls r6, r6, #16\n\t"
  156805. #else
  156806. "lsl r6, r6, #16\n\t"
  156807. #endif
  156808. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156809. "adds r5, r5, r6\n\t"
  156810. #else
  156811. "add r5, r5, r6\n\t"
  156812. #endif
  156813. #ifdef WOLFSSL_KEIL
  156814. "adcs r3, r3, r7\n\t"
  156815. #elif defined(__clang__)
  156816. "adcs r3, r7\n\t"
  156817. #else
  156818. "adc r3, r7\n\t"
  156819. #endif
  156820. #ifdef WOLFSSL_KEIL
  156821. "adcs r4, r4, %[r]\n\t"
  156822. #elif defined(__clang__)
  156823. "adcs r4, %[r]\n\t"
  156824. #else
  156825. "adc r4, %[r]\n\t"
  156826. #endif
  156827. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156828. "lsrs r6, %[a], #16\n\t"
  156829. #else
  156830. "lsr r6, %[a], #16\n\t"
  156831. #endif
  156832. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156833. "lsrs r7, %[b], #16\n\t"
  156834. #else
  156835. "lsr r7, %[b], #16\n\t"
  156836. #endif
  156837. #ifdef WOLFSSL_KEIL
  156838. "muls r7, r6, r7\n\t"
  156839. #elif defined(__clang__)
  156840. "muls r7, r6\n\t"
  156841. #else
  156842. "mul r7, r6\n\t"
  156843. #endif
  156844. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156845. "adds r3, r3, r7\n\t"
  156846. #else
  156847. "add r3, r3, r7\n\t"
  156848. #endif
  156849. #ifdef WOLFSSL_KEIL
  156850. "adcs r4, r4, %[r]\n\t"
  156851. #elif defined(__clang__)
  156852. "adcs r4, %[r]\n\t"
  156853. #else
  156854. "adc r4, %[r]\n\t"
  156855. #endif
  156856. "uxth r7, %[b]\n\t"
  156857. #ifdef WOLFSSL_KEIL
  156858. "muls r6, r7, r6\n\t"
  156859. #elif defined(__clang__)
  156860. "muls r6, r7\n\t"
  156861. #else
  156862. "mul r6, r7\n\t"
  156863. #endif
  156864. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156865. "lsrs r7, r6, #16\n\t"
  156866. #else
  156867. "lsr r7, r6, #16\n\t"
  156868. #endif
  156869. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156870. "lsls r6, r6, #16\n\t"
  156871. #else
  156872. "lsl r6, r6, #16\n\t"
  156873. #endif
  156874. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156875. "adds r5, r5, r6\n\t"
  156876. #else
  156877. "add r5, r5, r6\n\t"
  156878. #endif
  156879. #ifdef WOLFSSL_KEIL
  156880. "adcs r3, r3, r7\n\t"
  156881. #elif defined(__clang__)
  156882. "adcs r3, r7\n\t"
  156883. #else
  156884. "adc r3, r7\n\t"
  156885. #endif
  156886. #ifdef WOLFSSL_KEIL
  156887. "adcs r4, r4, %[r]\n\t"
  156888. #elif defined(__clang__)
  156889. "adcs r4, %[r]\n\t"
  156890. #else
  156891. "adc r4, %[r]\n\t"
  156892. #endif
  156893. "# A[11] * B[6]\n\t"
  156894. "mov %[a], r9\n\t"
  156895. "mov %[b], r10\n\t"
  156896. "ldr %[a], [%[a], #44]\n\t"
  156897. "ldr %[b], [%[b], #24]\n\t"
  156898. "uxth r6, %[a]\n\t"
  156899. "uxth r7, %[b]\n\t"
  156900. #ifdef WOLFSSL_KEIL
  156901. "muls r7, r6, r7\n\t"
  156902. #elif defined(__clang__)
  156903. "muls r7, r6\n\t"
  156904. #else
  156905. "mul r7, r6\n\t"
  156906. #endif
  156907. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156908. "adds r5, r5, r7\n\t"
  156909. #else
  156910. "add r5, r5, r7\n\t"
  156911. #endif
  156912. #ifdef WOLFSSL_KEIL
  156913. "adcs r3, r3, %[r]\n\t"
  156914. #elif defined(__clang__)
  156915. "adcs r3, %[r]\n\t"
  156916. #else
  156917. "adc r3, %[r]\n\t"
  156918. #endif
  156919. #ifdef WOLFSSL_KEIL
  156920. "adcs r4, r4, %[r]\n\t"
  156921. #elif defined(__clang__)
  156922. "adcs r4, %[r]\n\t"
  156923. #else
  156924. "adc r4, %[r]\n\t"
  156925. #endif
  156926. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156927. "lsrs r7, %[b], #16\n\t"
  156928. #else
  156929. "lsr r7, %[b], #16\n\t"
  156930. #endif
  156931. #ifdef WOLFSSL_KEIL
  156932. "muls r6, r7, r6\n\t"
  156933. #elif defined(__clang__)
  156934. "muls r6, r7\n\t"
  156935. #else
  156936. "mul r6, r7\n\t"
  156937. #endif
  156938. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156939. "lsrs r7, r6, #16\n\t"
  156940. #else
  156941. "lsr r7, r6, #16\n\t"
  156942. #endif
  156943. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156944. "lsls r6, r6, #16\n\t"
  156945. #else
  156946. "lsl r6, r6, #16\n\t"
  156947. #endif
  156948. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156949. "adds r5, r5, r6\n\t"
  156950. #else
  156951. "add r5, r5, r6\n\t"
  156952. #endif
  156953. #ifdef WOLFSSL_KEIL
  156954. "adcs r3, r3, r7\n\t"
  156955. #elif defined(__clang__)
  156956. "adcs r3, r7\n\t"
  156957. #else
  156958. "adc r3, r7\n\t"
  156959. #endif
  156960. #ifdef WOLFSSL_KEIL
  156961. "adcs r4, r4, %[r]\n\t"
  156962. #elif defined(__clang__)
  156963. "adcs r4, %[r]\n\t"
  156964. #else
  156965. "adc r4, %[r]\n\t"
  156966. #endif
  156967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156968. "lsrs r6, %[a], #16\n\t"
  156969. #else
  156970. "lsr r6, %[a], #16\n\t"
  156971. #endif
  156972. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156973. "lsrs r7, %[b], #16\n\t"
  156974. #else
  156975. "lsr r7, %[b], #16\n\t"
  156976. #endif
  156977. #ifdef WOLFSSL_KEIL
  156978. "muls r7, r6, r7\n\t"
  156979. #elif defined(__clang__)
  156980. "muls r7, r6\n\t"
  156981. #else
  156982. "mul r7, r6\n\t"
  156983. #endif
  156984. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156985. "adds r3, r3, r7\n\t"
  156986. #else
  156987. "add r3, r3, r7\n\t"
  156988. #endif
  156989. #ifdef WOLFSSL_KEIL
  156990. "adcs r4, r4, %[r]\n\t"
  156991. #elif defined(__clang__)
  156992. "adcs r4, %[r]\n\t"
  156993. #else
  156994. "adc r4, %[r]\n\t"
  156995. #endif
  156996. "uxth r7, %[b]\n\t"
  156997. #ifdef WOLFSSL_KEIL
  156998. "muls r6, r7, r6\n\t"
  156999. #elif defined(__clang__)
  157000. "muls r6, r7\n\t"
  157001. #else
  157002. "mul r6, r7\n\t"
  157003. #endif
  157004. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157005. "lsrs r7, r6, #16\n\t"
  157006. #else
  157007. "lsr r7, r6, #16\n\t"
  157008. #endif
  157009. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157010. "lsls r6, r6, #16\n\t"
  157011. #else
  157012. "lsl r6, r6, #16\n\t"
  157013. #endif
  157014. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157015. "adds r5, r5, r6\n\t"
  157016. #else
  157017. "add r5, r5, r6\n\t"
  157018. #endif
  157019. #ifdef WOLFSSL_KEIL
  157020. "adcs r3, r3, r7\n\t"
  157021. #elif defined(__clang__)
  157022. "adcs r3, r7\n\t"
  157023. #else
  157024. "adc r3, r7\n\t"
  157025. #endif
  157026. #ifdef WOLFSSL_KEIL
  157027. "adcs r4, r4, %[r]\n\t"
  157028. #elif defined(__clang__)
  157029. "adcs r4, %[r]\n\t"
  157030. #else
  157031. "adc r4, %[r]\n\t"
  157032. #endif
  157033. "# A[12] * B[5]\n\t"
  157034. "mov %[a], r9\n\t"
  157035. "mov %[b], r10\n\t"
  157036. "ldr %[a], [%[a], #48]\n\t"
  157037. "ldr %[b], [%[b], #20]\n\t"
  157038. "uxth r6, %[a]\n\t"
  157039. "uxth r7, %[b]\n\t"
  157040. #ifdef WOLFSSL_KEIL
  157041. "muls r7, r6, r7\n\t"
  157042. #elif defined(__clang__)
  157043. "muls r7, r6\n\t"
  157044. #else
  157045. "mul r7, r6\n\t"
  157046. #endif
  157047. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157048. "adds r5, r5, r7\n\t"
  157049. #else
  157050. "add r5, r5, r7\n\t"
  157051. #endif
  157052. #ifdef WOLFSSL_KEIL
  157053. "adcs r3, r3, %[r]\n\t"
  157054. #elif defined(__clang__)
  157055. "adcs r3, %[r]\n\t"
  157056. #else
  157057. "adc r3, %[r]\n\t"
  157058. #endif
  157059. #ifdef WOLFSSL_KEIL
  157060. "adcs r4, r4, %[r]\n\t"
  157061. #elif defined(__clang__)
  157062. "adcs r4, %[r]\n\t"
  157063. #else
  157064. "adc r4, %[r]\n\t"
  157065. #endif
  157066. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157067. "lsrs r7, %[b], #16\n\t"
  157068. #else
  157069. "lsr r7, %[b], #16\n\t"
  157070. #endif
  157071. #ifdef WOLFSSL_KEIL
  157072. "muls r6, r7, r6\n\t"
  157073. #elif defined(__clang__)
  157074. "muls r6, r7\n\t"
  157075. #else
  157076. "mul r6, r7\n\t"
  157077. #endif
  157078. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157079. "lsrs r7, r6, #16\n\t"
  157080. #else
  157081. "lsr r7, r6, #16\n\t"
  157082. #endif
  157083. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157084. "lsls r6, r6, #16\n\t"
  157085. #else
  157086. "lsl r6, r6, #16\n\t"
  157087. #endif
  157088. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157089. "adds r5, r5, r6\n\t"
  157090. #else
  157091. "add r5, r5, r6\n\t"
  157092. #endif
  157093. #ifdef WOLFSSL_KEIL
  157094. "adcs r3, r3, r7\n\t"
  157095. #elif defined(__clang__)
  157096. "adcs r3, r7\n\t"
  157097. #else
  157098. "adc r3, r7\n\t"
  157099. #endif
  157100. #ifdef WOLFSSL_KEIL
  157101. "adcs r4, r4, %[r]\n\t"
  157102. #elif defined(__clang__)
  157103. "adcs r4, %[r]\n\t"
  157104. #else
  157105. "adc r4, %[r]\n\t"
  157106. #endif
  157107. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157108. "lsrs r6, %[a], #16\n\t"
  157109. #else
  157110. "lsr r6, %[a], #16\n\t"
  157111. #endif
  157112. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157113. "lsrs r7, %[b], #16\n\t"
  157114. #else
  157115. "lsr r7, %[b], #16\n\t"
  157116. #endif
  157117. #ifdef WOLFSSL_KEIL
  157118. "muls r7, r6, r7\n\t"
  157119. #elif defined(__clang__)
  157120. "muls r7, r6\n\t"
  157121. #else
  157122. "mul r7, r6\n\t"
  157123. #endif
  157124. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157125. "adds r3, r3, r7\n\t"
  157126. #else
  157127. "add r3, r3, r7\n\t"
  157128. #endif
  157129. #ifdef WOLFSSL_KEIL
  157130. "adcs r4, r4, %[r]\n\t"
  157131. #elif defined(__clang__)
  157132. "adcs r4, %[r]\n\t"
  157133. #else
  157134. "adc r4, %[r]\n\t"
  157135. #endif
  157136. "uxth r7, %[b]\n\t"
  157137. #ifdef WOLFSSL_KEIL
  157138. "muls r6, r7, r6\n\t"
  157139. #elif defined(__clang__)
  157140. "muls r6, r7\n\t"
  157141. #else
  157142. "mul r6, r7\n\t"
  157143. #endif
  157144. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157145. "lsrs r7, r6, #16\n\t"
  157146. #else
  157147. "lsr r7, r6, #16\n\t"
  157148. #endif
  157149. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157150. "lsls r6, r6, #16\n\t"
  157151. #else
  157152. "lsl r6, r6, #16\n\t"
  157153. #endif
  157154. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157155. "adds r5, r5, r6\n\t"
  157156. #else
  157157. "add r5, r5, r6\n\t"
  157158. #endif
  157159. #ifdef WOLFSSL_KEIL
  157160. "adcs r3, r3, r7\n\t"
  157161. #elif defined(__clang__)
  157162. "adcs r3, r7\n\t"
  157163. #else
  157164. "adc r3, r7\n\t"
  157165. #endif
  157166. #ifdef WOLFSSL_KEIL
  157167. "adcs r4, r4, %[r]\n\t"
  157168. #elif defined(__clang__)
  157169. "adcs r4, %[r]\n\t"
  157170. #else
  157171. "adc r4, %[r]\n\t"
  157172. #endif
  157173. "# A[13] * B[4]\n\t"
  157174. "mov %[a], r9\n\t"
  157175. "mov %[b], r10\n\t"
  157176. "ldr %[a], [%[a], #52]\n\t"
  157177. "ldr %[b], [%[b], #16]\n\t"
  157178. "uxth r6, %[a]\n\t"
  157179. "uxth r7, %[b]\n\t"
  157180. #ifdef WOLFSSL_KEIL
  157181. "muls r7, r6, r7\n\t"
  157182. #elif defined(__clang__)
  157183. "muls r7, r6\n\t"
  157184. #else
  157185. "mul r7, r6\n\t"
  157186. #endif
  157187. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157188. "adds r5, r5, r7\n\t"
  157189. #else
  157190. "add r5, r5, r7\n\t"
  157191. #endif
  157192. #ifdef WOLFSSL_KEIL
  157193. "adcs r3, r3, %[r]\n\t"
  157194. #elif defined(__clang__)
  157195. "adcs r3, %[r]\n\t"
  157196. #else
  157197. "adc r3, %[r]\n\t"
  157198. #endif
  157199. #ifdef WOLFSSL_KEIL
  157200. "adcs r4, r4, %[r]\n\t"
  157201. #elif defined(__clang__)
  157202. "adcs r4, %[r]\n\t"
  157203. #else
  157204. "adc r4, %[r]\n\t"
  157205. #endif
  157206. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157207. "lsrs r7, %[b], #16\n\t"
  157208. #else
  157209. "lsr r7, %[b], #16\n\t"
  157210. #endif
  157211. #ifdef WOLFSSL_KEIL
  157212. "muls r6, r7, r6\n\t"
  157213. #elif defined(__clang__)
  157214. "muls r6, r7\n\t"
  157215. #else
  157216. "mul r6, r7\n\t"
  157217. #endif
  157218. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157219. "lsrs r7, r6, #16\n\t"
  157220. #else
  157221. "lsr r7, r6, #16\n\t"
  157222. #endif
  157223. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157224. "lsls r6, r6, #16\n\t"
  157225. #else
  157226. "lsl r6, r6, #16\n\t"
  157227. #endif
  157228. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157229. "adds r5, r5, r6\n\t"
  157230. #else
  157231. "add r5, r5, r6\n\t"
  157232. #endif
  157233. #ifdef WOLFSSL_KEIL
  157234. "adcs r3, r3, r7\n\t"
  157235. #elif defined(__clang__)
  157236. "adcs r3, r7\n\t"
  157237. #else
  157238. "adc r3, r7\n\t"
  157239. #endif
  157240. #ifdef WOLFSSL_KEIL
  157241. "adcs r4, r4, %[r]\n\t"
  157242. #elif defined(__clang__)
  157243. "adcs r4, %[r]\n\t"
  157244. #else
  157245. "adc r4, %[r]\n\t"
  157246. #endif
  157247. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157248. "lsrs r6, %[a], #16\n\t"
  157249. #else
  157250. "lsr r6, %[a], #16\n\t"
  157251. #endif
  157252. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157253. "lsrs r7, %[b], #16\n\t"
  157254. #else
  157255. "lsr r7, %[b], #16\n\t"
  157256. #endif
  157257. #ifdef WOLFSSL_KEIL
  157258. "muls r7, r6, r7\n\t"
  157259. #elif defined(__clang__)
  157260. "muls r7, r6\n\t"
  157261. #else
  157262. "mul r7, r6\n\t"
  157263. #endif
  157264. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157265. "adds r3, r3, r7\n\t"
  157266. #else
  157267. "add r3, r3, r7\n\t"
  157268. #endif
  157269. #ifdef WOLFSSL_KEIL
  157270. "adcs r4, r4, %[r]\n\t"
  157271. #elif defined(__clang__)
  157272. "adcs r4, %[r]\n\t"
  157273. #else
  157274. "adc r4, %[r]\n\t"
  157275. #endif
  157276. "uxth r7, %[b]\n\t"
  157277. #ifdef WOLFSSL_KEIL
  157278. "muls r6, r7, r6\n\t"
  157279. #elif defined(__clang__)
  157280. "muls r6, r7\n\t"
  157281. #else
  157282. "mul r6, r7\n\t"
  157283. #endif
  157284. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157285. "lsrs r7, r6, #16\n\t"
  157286. #else
  157287. "lsr r7, r6, #16\n\t"
  157288. #endif
  157289. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157290. "lsls r6, r6, #16\n\t"
  157291. #else
  157292. "lsl r6, r6, #16\n\t"
  157293. #endif
  157294. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157295. "adds r5, r5, r6\n\t"
  157296. #else
  157297. "add r5, r5, r6\n\t"
  157298. #endif
  157299. #ifdef WOLFSSL_KEIL
  157300. "adcs r3, r3, r7\n\t"
  157301. #elif defined(__clang__)
  157302. "adcs r3, r7\n\t"
  157303. #else
  157304. "adc r3, r7\n\t"
  157305. #endif
  157306. #ifdef WOLFSSL_KEIL
  157307. "adcs r4, r4, %[r]\n\t"
  157308. #elif defined(__clang__)
  157309. "adcs r4, %[r]\n\t"
  157310. #else
  157311. "adc r4, %[r]\n\t"
  157312. #endif
  157313. "# A[14] * B[3]\n\t"
  157314. "mov %[a], r9\n\t"
  157315. "mov %[b], r10\n\t"
  157316. "ldr %[a], [%[a], #56]\n\t"
  157317. "ldr %[b], [%[b], #12]\n\t"
  157318. "uxth r6, %[a]\n\t"
  157319. "uxth r7, %[b]\n\t"
  157320. #ifdef WOLFSSL_KEIL
  157321. "muls r7, r6, r7\n\t"
  157322. #elif defined(__clang__)
  157323. "muls r7, r6\n\t"
  157324. #else
  157325. "mul r7, r6\n\t"
  157326. #endif
  157327. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157328. "adds r5, r5, r7\n\t"
  157329. #else
  157330. "add r5, r5, r7\n\t"
  157331. #endif
  157332. #ifdef WOLFSSL_KEIL
  157333. "adcs r3, r3, %[r]\n\t"
  157334. #elif defined(__clang__)
  157335. "adcs r3, %[r]\n\t"
  157336. #else
  157337. "adc r3, %[r]\n\t"
  157338. #endif
  157339. #ifdef WOLFSSL_KEIL
  157340. "adcs r4, r4, %[r]\n\t"
  157341. #elif defined(__clang__)
  157342. "adcs r4, %[r]\n\t"
  157343. #else
  157344. "adc r4, %[r]\n\t"
  157345. #endif
  157346. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157347. "lsrs r7, %[b], #16\n\t"
  157348. #else
  157349. "lsr r7, %[b], #16\n\t"
  157350. #endif
  157351. #ifdef WOLFSSL_KEIL
  157352. "muls r6, r7, r6\n\t"
  157353. #elif defined(__clang__)
  157354. "muls r6, r7\n\t"
  157355. #else
  157356. "mul r6, r7\n\t"
  157357. #endif
  157358. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157359. "lsrs r7, r6, #16\n\t"
  157360. #else
  157361. "lsr r7, r6, #16\n\t"
  157362. #endif
  157363. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157364. "lsls r6, r6, #16\n\t"
  157365. #else
  157366. "lsl r6, r6, #16\n\t"
  157367. #endif
  157368. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157369. "adds r5, r5, r6\n\t"
  157370. #else
  157371. "add r5, r5, r6\n\t"
  157372. #endif
  157373. #ifdef WOLFSSL_KEIL
  157374. "adcs r3, r3, r7\n\t"
  157375. #elif defined(__clang__)
  157376. "adcs r3, r7\n\t"
  157377. #else
  157378. "adc r3, r7\n\t"
  157379. #endif
  157380. #ifdef WOLFSSL_KEIL
  157381. "adcs r4, r4, %[r]\n\t"
  157382. #elif defined(__clang__)
  157383. "adcs r4, %[r]\n\t"
  157384. #else
  157385. "adc r4, %[r]\n\t"
  157386. #endif
  157387. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157388. "lsrs r6, %[a], #16\n\t"
  157389. #else
  157390. "lsr r6, %[a], #16\n\t"
  157391. #endif
  157392. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157393. "lsrs r7, %[b], #16\n\t"
  157394. #else
  157395. "lsr r7, %[b], #16\n\t"
  157396. #endif
  157397. #ifdef WOLFSSL_KEIL
  157398. "muls r7, r6, r7\n\t"
  157399. #elif defined(__clang__)
  157400. "muls r7, r6\n\t"
  157401. #else
  157402. "mul r7, r6\n\t"
  157403. #endif
  157404. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157405. "adds r3, r3, r7\n\t"
  157406. #else
  157407. "add r3, r3, r7\n\t"
  157408. #endif
  157409. #ifdef WOLFSSL_KEIL
  157410. "adcs r4, r4, %[r]\n\t"
  157411. #elif defined(__clang__)
  157412. "adcs r4, %[r]\n\t"
  157413. #else
  157414. "adc r4, %[r]\n\t"
  157415. #endif
  157416. "uxth r7, %[b]\n\t"
  157417. #ifdef WOLFSSL_KEIL
  157418. "muls r6, r7, r6\n\t"
  157419. #elif defined(__clang__)
  157420. "muls r6, r7\n\t"
  157421. #else
  157422. "mul r6, r7\n\t"
  157423. #endif
  157424. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157425. "lsrs r7, r6, #16\n\t"
  157426. #else
  157427. "lsr r7, r6, #16\n\t"
  157428. #endif
  157429. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157430. "lsls r6, r6, #16\n\t"
  157431. #else
  157432. "lsl r6, r6, #16\n\t"
  157433. #endif
  157434. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157435. "adds r5, r5, r6\n\t"
  157436. #else
  157437. "add r5, r5, r6\n\t"
  157438. #endif
  157439. #ifdef WOLFSSL_KEIL
  157440. "adcs r3, r3, r7\n\t"
  157441. #elif defined(__clang__)
  157442. "adcs r3, r7\n\t"
  157443. #else
  157444. "adc r3, r7\n\t"
  157445. #endif
  157446. #ifdef WOLFSSL_KEIL
  157447. "adcs r4, r4, %[r]\n\t"
  157448. #elif defined(__clang__)
  157449. "adcs r4, %[r]\n\t"
  157450. #else
  157451. "adc r4, %[r]\n\t"
  157452. #endif
  157453. "# A[15] * B[2]\n\t"
  157454. "mov %[a], r9\n\t"
  157455. "mov %[b], r10\n\t"
  157456. "ldr %[a], [%[a], #60]\n\t"
  157457. "ldr %[b], [%[b], #8]\n\t"
  157458. "uxth r6, %[a]\n\t"
  157459. "uxth r7, %[b]\n\t"
  157460. #ifdef WOLFSSL_KEIL
  157461. "muls r7, r6, r7\n\t"
  157462. #elif defined(__clang__)
  157463. "muls r7, r6\n\t"
  157464. #else
  157465. "mul r7, r6\n\t"
  157466. #endif
  157467. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157468. "adds r5, r5, r7\n\t"
  157469. #else
  157470. "add r5, r5, r7\n\t"
  157471. #endif
  157472. #ifdef WOLFSSL_KEIL
  157473. "adcs r3, r3, %[r]\n\t"
  157474. #elif defined(__clang__)
  157475. "adcs r3, %[r]\n\t"
  157476. #else
  157477. "adc r3, %[r]\n\t"
  157478. #endif
  157479. #ifdef WOLFSSL_KEIL
  157480. "adcs r4, r4, %[r]\n\t"
  157481. #elif defined(__clang__)
  157482. "adcs r4, %[r]\n\t"
  157483. #else
  157484. "adc r4, %[r]\n\t"
  157485. #endif
  157486. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157487. "lsrs r7, %[b], #16\n\t"
  157488. #else
  157489. "lsr r7, %[b], #16\n\t"
  157490. #endif
  157491. #ifdef WOLFSSL_KEIL
  157492. "muls r6, r7, r6\n\t"
  157493. #elif defined(__clang__)
  157494. "muls r6, r7\n\t"
  157495. #else
  157496. "mul r6, r7\n\t"
  157497. #endif
  157498. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157499. "lsrs r7, r6, #16\n\t"
  157500. #else
  157501. "lsr r7, r6, #16\n\t"
  157502. #endif
  157503. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157504. "lsls r6, r6, #16\n\t"
  157505. #else
  157506. "lsl r6, r6, #16\n\t"
  157507. #endif
  157508. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157509. "adds r5, r5, r6\n\t"
  157510. #else
  157511. "add r5, r5, r6\n\t"
  157512. #endif
  157513. #ifdef WOLFSSL_KEIL
  157514. "adcs r3, r3, r7\n\t"
  157515. #elif defined(__clang__)
  157516. "adcs r3, r7\n\t"
  157517. #else
  157518. "adc r3, r7\n\t"
  157519. #endif
  157520. #ifdef WOLFSSL_KEIL
  157521. "adcs r4, r4, %[r]\n\t"
  157522. #elif defined(__clang__)
  157523. "adcs r4, %[r]\n\t"
  157524. #else
  157525. "adc r4, %[r]\n\t"
  157526. #endif
  157527. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157528. "lsrs r6, %[a], #16\n\t"
  157529. #else
  157530. "lsr r6, %[a], #16\n\t"
  157531. #endif
  157532. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157533. "lsrs r7, %[b], #16\n\t"
  157534. #else
  157535. "lsr r7, %[b], #16\n\t"
  157536. #endif
  157537. #ifdef WOLFSSL_KEIL
  157538. "muls r7, r6, r7\n\t"
  157539. #elif defined(__clang__)
  157540. "muls r7, r6\n\t"
  157541. #else
  157542. "mul r7, r6\n\t"
  157543. #endif
  157544. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157545. "adds r3, r3, r7\n\t"
  157546. #else
  157547. "add r3, r3, r7\n\t"
  157548. #endif
  157549. #ifdef WOLFSSL_KEIL
  157550. "adcs r4, r4, %[r]\n\t"
  157551. #elif defined(__clang__)
  157552. "adcs r4, %[r]\n\t"
  157553. #else
  157554. "adc r4, %[r]\n\t"
  157555. #endif
  157556. "uxth r7, %[b]\n\t"
  157557. #ifdef WOLFSSL_KEIL
  157558. "muls r6, r7, r6\n\t"
  157559. #elif defined(__clang__)
  157560. "muls r6, r7\n\t"
  157561. #else
  157562. "mul r6, r7\n\t"
  157563. #endif
  157564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157565. "lsrs r7, r6, #16\n\t"
  157566. #else
  157567. "lsr r7, r6, #16\n\t"
  157568. #endif
  157569. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157570. "lsls r6, r6, #16\n\t"
  157571. #else
  157572. "lsl r6, r6, #16\n\t"
  157573. #endif
  157574. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157575. "adds r5, r5, r6\n\t"
  157576. #else
  157577. "add r5, r5, r6\n\t"
  157578. #endif
  157579. #ifdef WOLFSSL_KEIL
  157580. "adcs r3, r3, r7\n\t"
  157581. #elif defined(__clang__)
  157582. "adcs r3, r7\n\t"
  157583. #else
  157584. "adc r3, r7\n\t"
  157585. #endif
  157586. #ifdef WOLFSSL_KEIL
  157587. "adcs r4, r4, %[r]\n\t"
  157588. #elif defined(__clang__)
  157589. "adcs r4, %[r]\n\t"
  157590. #else
  157591. "adc r4, %[r]\n\t"
  157592. #endif
  157593. "mov %[r], r8\n\t"
  157594. "str r5, [%[r], #68]\n\t"
  157595. "movs %[r], #0\n\t"
  157596. "# A[15] * B[3]\n\t"
  157597. "movs r5, #0\n\t"
  157598. "mov %[a], r9\n\t"
  157599. "mov %[b], r10\n\t"
  157600. "ldr %[a], [%[a], #60]\n\t"
  157601. "ldr %[b], [%[b], #12]\n\t"
  157602. "uxth r6, %[a]\n\t"
  157603. "uxth r7, %[b]\n\t"
  157604. #ifdef WOLFSSL_KEIL
  157605. "muls r7, r6, r7\n\t"
  157606. #elif defined(__clang__)
  157607. "muls r7, r6\n\t"
  157608. #else
  157609. "mul r7, r6\n\t"
  157610. #endif
  157611. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157612. "adds r3, r3, r7\n\t"
  157613. #else
  157614. "add r3, r3, r7\n\t"
  157615. #endif
  157616. #ifdef WOLFSSL_KEIL
  157617. "adcs r4, r4, %[r]\n\t"
  157618. #elif defined(__clang__)
  157619. "adcs r4, %[r]\n\t"
  157620. #else
  157621. "adc r4, %[r]\n\t"
  157622. #endif
  157623. #ifdef WOLFSSL_KEIL
  157624. "adcs r5, r5, %[r]\n\t"
  157625. #elif defined(__clang__)
  157626. "adcs r5, %[r]\n\t"
  157627. #else
  157628. "adc r5, %[r]\n\t"
  157629. #endif
  157630. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157631. "lsrs r7, %[b], #16\n\t"
  157632. #else
  157633. "lsr r7, %[b], #16\n\t"
  157634. #endif
  157635. #ifdef WOLFSSL_KEIL
  157636. "muls r6, r7, r6\n\t"
  157637. #elif defined(__clang__)
  157638. "muls r6, r7\n\t"
  157639. #else
  157640. "mul r6, r7\n\t"
  157641. #endif
  157642. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157643. "lsrs r7, r6, #16\n\t"
  157644. #else
  157645. "lsr r7, r6, #16\n\t"
  157646. #endif
  157647. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157648. "lsls r6, r6, #16\n\t"
  157649. #else
  157650. "lsl r6, r6, #16\n\t"
  157651. #endif
  157652. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157653. "adds r3, r3, r6\n\t"
  157654. #else
  157655. "add r3, r3, r6\n\t"
  157656. #endif
  157657. #ifdef WOLFSSL_KEIL
  157658. "adcs r4, r4, r7\n\t"
  157659. #elif defined(__clang__)
  157660. "adcs r4, r7\n\t"
  157661. #else
  157662. "adc r4, r7\n\t"
  157663. #endif
  157664. #ifdef WOLFSSL_KEIL
  157665. "adcs r5, r5, %[r]\n\t"
  157666. #elif defined(__clang__)
  157667. "adcs r5, %[r]\n\t"
  157668. #else
  157669. "adc r5, %[r]\n\t"
  157670. #endif
  157671. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157672. "lsrs r6, %[a], #16\n\t"
  157673. #else
  157674. "lsr r6, %[a], #16\n\t"
  157675. #endif
  157676. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157677. "lsrs r7, %[b], #16\n\t"
  157678. #else
  157679. "lsr r7, %[b], #16\n\t"
  157680. #endif
  157681. #ifdef WOLFSSL_KEIL
  157682. "muls r7, r6, r7\n\t"
  157683. #elif defined(__clang__)
  157684. "muls r7, r6\n\t"
  157685. #else
  157686. "mul r7, r6\n\t"
  157687. #endif
  157688. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157689. "adds r4, r4, r7\n\t"
  157690. #else
  157691. "add r4, r4, r7\n\t"
  157692. #endif
  157693. #ifdef WOLFSSL_KEIL
  157694. "adcs r5, r5, %[r]\n\t"
  157695. #elif defined(__clang__)
  157696. "adcs r5, %[r]\n\t"
  157697. #else
  157698. "adc r5, %[r]\n\t"
  157699. #endif
  157700. "uxth r7, %[b]\n\t"
  157701. #ifdef WOLFSSL_KEIL
  157702. "muls r6, r7, r6\n\t"
  157703. #elif defined(__clang__)
  157704. "muls r6, r7\n\t"
  157705. #else
  157706. "mul r6, r7\n\t"
  157707. #endif
  157708. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157709. "lsrs r7, r6, #16\n\t"
  157710. #else
  157711. "lsr r7, r6, #16\n\t"
  157712. #endif
  157713. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157714. "lsls r6, r6, #16\n\t"
  157715. #else
  157716. "lsl r6, r6, #16\n\t"
  157717. #endif
  157718. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157719. "adds r3, r3, r6\n\t"
  157720. #else
  157721. "add r3, r3, r6\n\t"
  157722. #endif
  157723. #ifdef WOLFSSL_KEIL
  157724. "adcs r4, r4, r7\n\t"
  157725. #elif defined(__clang__)
  157726. "adcs r4, r7\n\t"
  157727. #else
  157728. "adc r4, r7\n\t"
  157729. #endif
  157730. #ifdef WOLFSSL_KEIL
  157731. "adcs r5, r5, %[r]\n\t"
  157732. #elif defined(__clang__)
  157733. "adcs r5, %[r]\n\t"
  157734. #else
  157735. "adc r5, %[r]\n\t"
  157736. #endif
  157737. "# A[14] * B[4]\n\t"
  157738. "mov %[a], r9\n\t"
  157739. "mov %[b], r10\n\t"
  157740. "ldr %[a], [%[a], #56]\n\t"
  157741. "ldr %[b], [%[b], #16]\n\t"
  157742. "uxth r6, %[a]\n\t"
  157743. "uxth r7, %[b]\n\t"
  157744. #ifdef WOLFSSL_KEIL
  157745. "muls r7, r6, r7\n\t"
  157746. #elif defined(__clang__)
  157747. "muls r7, r6\n\t"
  157748. #else
  157749. "mul r7, r6\n\t"
  157750. #endif
  157751. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157752. "adds r3, r3, r7\n\t"
  157753. #else
  157754. "add r3, r3, r7\n\t"
  157755. #endif
  157756. #ifdef WOLFSSL_KEIL
  157757. "adcs r4, r4, %[r]\n\t"
  157758. #elif defined(__clang__)
  157759. "adcs r4, %[r]\n\t"
  157760. #else
  157761. "adc r4, %[r]\n\t"
  157762. #endif
  157763. #ifdef WOLFSSL_KEIL
  157764. "adcs r5, r5, %[r]\n\t"
  157765. #elif defined(__clang__)
  157766. "adcs r5, %[r]\n\t"
  157767. #else
  157768. "adc r5, %[r]\n\t"
  157769. #endif
  157770. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157771. "lsrs r7, %[b], #16\n\t"
  157772. #else
  157773. "lsr r7, %[b], #16\n\t"
  157774. #endif
  157775. #ifdef WOLFSSL_KEIL
  157776. "muls r6, r7, r6\n\t"
  157777. #elif defined(__clang__)
  157778. "muls r6, r7\n\t"
  157779. #else
  157780. "mul r6, r7\n\t"
  157781. #endif
  157782. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157783. "lsrs r7, r6, #16\n\t"
  157784. #else
  157785. "lsr r7, r6, #16\n\t"
  157786. #endif
  157787. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157788. "lsls r6, r6, #16\n\t"
  157789. #else
  157790. "lsl r6, r6, #16\n\t"
  157791. #endif
  157792. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157793. "adds r3, r3, r6\n\t"
  157794. #else
  157795. "add r3, r3, r6\n\t"
  157796. #endif
  157797. #ifdef WOLFSSL_KEIL
  157798. "adcs r4, r4, r7\n\t"
  157799. #elif defined(__clang__)
  157800. "adcs r4, r7\n\t"
  157801. #else
  157802. "adc r4, r7\n\t"
  157803. #endif
  157804. #ifdef WOLFSSL_KEIL
  157805. "adcs r5, r5, %[r]\n\t"
  157806. #elif defined(__clang__)
  157807. "adcs r5, %[r]\n\t"
  157808. #else
  157809. "adc r5, %[r]\n\t"
  157810. #endif
  157811. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157812. "lsrs r6, %[a], #16\n\t"
  157813. #else
  157814. "lsr r6, %[a], #16\n\t"
  157815. #endif
  157816. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157817. "lsrs r7, %[b], #16\n\t"
  157818. #else
  157819. "lsr r7, %[b], #16\n\t"
  157820. #endif
  157821. #ifdef WOLFSSL_KEIL
  157822. "muls r7, r6, r7\n\t"
  157823. #elif defined(__clang__)
  157824. "muls r7, r6\n\t"
  157825. #else
  157826. "mul r7, r6\n\t"
  157827. #endif
  157828. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157829. "adds r4, r4, r7\n\t"
  157830. #else
  157831. "add r4, r4, r7\n\t"
  157832. #endif
  157833. #ifdef WOLFSSL_KEIL
  157834. "adcs r5, r5, %[r]\n\t"
  157835. #elif defined(__clang__)
  157836. "adcs r5, %[r]\n\t"
  157837. #else
  157838. "adc r5, %[r]\n\t"
  157839. #endif
  157840. "uxth r7, %[b]\n\t"
  157841. #ifdef WOLFSSL_KEIL
  157842. "muls r6, r7, r6\n\t"
  157843. #elif defined(__clang__)
  157844. "muls r6, r7\n\t"
  157845. #else
  157846. "mul r6, r7\n\t"
  157847. #endif
  157848. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157849. "lsrs r7, r6, #16\n\t"
  157850. #else
  157851. "lsr r7, r6, #16\n\t"
  157852. #endif
  157853. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157854. "lsls r6, r6, #16\n\t"
  157855. #else
  157856. "lsl r6, r6, #16\n\t"
  157857. #endif
  157858. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157859. "adds r3, r3, r6\n\t"
  157860. #else
  157861. "add r3, r3, r6\n\t"
  157862. #endif
  157863. #ifdef WOLFSSL_KEIL
  157864. "adcs r4, r4, r7\n\t"
  157865. #elif defined(__clang__)
  157866. "adcs r4, r7\n\t"
  157867. #else
  157868. "adc r4, r7\n\t"
  157869. #endif
  157870. #ifdef WOLFSSL_KEIL
  157871. "adcs r5, r5, %[r]\n\t"
  157872. #elif defined(__clang__)
  157873. "adcs r5, %[r]\n\t"
  157874. #else
  157875. "adc r5, %[r]\n\t"
  157876. #endif
  157877. "# A[13] * B[5]\n\t"
  157878. "mov %[a], r9\n\t"
  157879. "mov %[b], r10\n\t"
  157880. "ldr %[a], [%[a], #52]\n\t"
  157881. "ldr %[b], [%[b], #20]\n\t"
  157882. "uxth r6, %[a]\n\t"
  157883. "uxth r7, %[b]\n\t"
  157884. #ifdef WOLFSSL_KEIL
  157885. "muls r7, r6, r7\n\t"
  157886. #elif defined(__clang__)
  157887. "muls r7, r6\n\t"
  157888. #else
  157889. "mul r7, r6\n\t"
  157890. #endif
  157891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157892. "adds r3, r3, r7\n\t"
  157893. #else
  157894. "add r3, r3, r7\n\t"
  157895. #endif
  157896. #ifdef WOLFSSL_KEIL
  157897. "adcs r4, r4, %[r]\n\t"
  157898. #elif defined(__clang__)
  157899. "adcs r4, %[r]\n\t"
  157900. #else
  157901. "adc r4, %[r]\n\t"
  157902. #endif
  157903. #ifdef WOLFSSL_KEIL
  157904. "adcs r5, r5, %[r]\n\t"
  157905. #elif defined(__clang__)
  157906. "adcs r5, %[r]\n\t"
  157907. #else
  157908. "adc r5, %[r]\n\t"
  157909. #endif
  157910. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157911. "lsrs r7, %[b], #16\n\t"
  157912. #else
  157913. "lsr r7, %[b], #16\n\t"
  157914. #endif
  157915. #ifdef WOLFSSL_KEIL
  157916. "muls r6, r7, r6\n\t"
  157917. #elif defined(__clang__)
  157918. "muls r6, r7\n\t"
  157919. #else
  157920. "mul r6, r7\n\t"
  157921. #endif
  157922. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157923. "lsrs r7, r6, #16\n\t"
  157924. #else
  157925. "lsr r7, r6, #16\n\t"
  157926. #endif
  157927. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157928. "lsls r6, r6, #16\n\t"
  157929. #else
  157930. "lsl r6, r6, #16\n\t"
  157931. #endif
  157932. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157933. "adds r3, r3, r6\n\t"
  157934. #else
  157935. "add r3, r3, r6\n\t"
  157936. #endif
  157937. #ifdef WOLFSSL_KEIL
  157938. "adcs r4, r4, r7\n\t"
  157939. #elif defined(__clang__)
  157940. "adcs r4, r7\n\t"
  157941. #else
  157942. "adc r4, r7\n\t"
  157943. #endif
  157944. #ifdef WOLFSSL_KEIL
  157945. "adcs r5, r5, %[r]\n\t"
  157946. #elif defined(__clang__)
  157947. "adcs r5, %[r]\n\t"
  157948. #else
  157949. "adc r5, %[r]\n\t"
  157950. #endif
  157951. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157952. "lsrs r6, %[a], #16\n\t"
  157953. #else
  157954. "lsr r6, %[a], #16\n\t"
  157955. #endif
  157956. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157957. "lsrs r7, %[b], #16\n\t"
  157958. #else
  157959. "lsr r7, %[b], #16\n\t"
  157960. #endif
  157961. #ifdef WOLFSSL_KEIL
  157962. "muls r7, r6, r7\n\t"
  157963. #elif defined(__clang__)
  157964. "muls r7, r6\n\t"
  157965. #else
  157966. "mul r7, r6\n\t"
  157967. #endif
  157968. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157969. "adds r4, r4, r7\n\t"
  157970. #else
  157971. "add r4, r4, r7\n\t"
  157972. #endif
  157973. #ifdef WOLFSSL_KEIL
  157974. "adcs r5, r5, %[r]\n\t"
  157975. #elif defined(__clang__)
  157976. "adcs r5, %[r]\n\t"
  157977. #else
  157978. "adc r5, %[r]\n\t"
  157979. #endif
  157980. "uxth r7, %[b]\n\t"
  157981. #ifdef WOLFSSL_KEIL
  157982. "muls r6, r7, r6\n\t"
  157983. #elif defined(__clang__)
  157984. "muls r6, r7\n\t"
  157985. #else
  157986. "mul r6, r7\n\t"
  157987. #endif
  157988. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157989. "lsrs r7, r6, #16\n\t"
  157990. #else
  157991. "lsr r7, r6, #16\n\t"
  157992. #endif
  157993. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157994. "lsls r6, r6, #16\n\t"
  157995. #else
  157996. "lsl r6, r6, #16\n\t"
  157997. #endif
  157998. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157999. "adds r3, r3, r6\n\t"
  158000. #else
  158001. "add r3, r3, r6\n\t"
  158002. #endif
  158003. #ifdef WOLFSSL_KEIL
  158004. "adcs r4, r4, r7\n\t"
  158005. #elif defined(__clang__)
  158006. "adcs r4, r7\n\t"
  158007. #else
  158008. "adc r4, r7\n\t"
  158009. #endif
  158010. #ifdef WOLFSSL_KEIL
  158011. "adcs r5, r5, %[r]\n\t"
  158012. #elif defined(__clang__)
  158013. "adcs r5, %[r]\n\t"
  158014. #else
  158015. "adc r5, %[r]\n\t"
  158016. #endif
  158017. "# A[12] * B[6]\n\t"
  158018. "mov %[a], r9\n\t"
  158019. "mov %[b], r10\n\t"
  158020. "ldr %[a], [%[a], #48]\n\t"
  158021. "ldr %[b], [%[b], #24]\n\t"
  158022. "uxth r6, %[a]\n\t"
  158023. "uxth r7, %[b]\n\t"
  158024. #ifdef WOLFSSL_KEIL
  158025. "muls r7, r6, r7\n\t"
  158026. #elif defined(__clang__)
  158027. "muls r7, r6\n\t"
  158028. #else
  158029. "mul r7, r6\n\t"
  158030. #endif
  158031. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158032. "adds r3, r3, r7\n\t"
  158033. #else
  158034. "add r3, r3, r7\n\t"
  158035. #endif
  158036. #ifdef WOLFSSL_KEIL
  158037. "adcs r4, r4, %[r]\n\t"
  158038. #elif defined(__clang__)
  158039. "adcs r4, %[r]\n\t"
  158040. #else
  158041. "adc r4, %[r]\n\t"
  158042. #endif
  158043. #ifdef WOLFSSL_KEIL
  158044. "adcs r5, r5, %[r]\n\t"
  158045. #elif defined(__clang__)
  158046. "adcs r5, %[r]\n\t"
  158047. #else
  158048. "adc r5, %[r]\n\t"
  158049. #endif
  158050. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158051. "lsrs r7, %[b], #16\n\t"
  158052. #else
  158053. "lsr r7, %[b], #16\n\t"
  158054. #endif
  158055. #ifdef WOLFSSL_KEIL
  158056. "muls r6, r7, r6\n\t"
  158057. #elif defined(__clang__)
  158058. "muls r6, r7\n\t"
  158059. #else
  158060. "mul r6, r7\n\t"
  158061. #endif
  158062. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158063. "lsrs r7, r6, #16\n\t"
  158064. #else
  158065. "lsr r7, r6, #16\n\t"
  158066. #endif
  158067. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158068. "lsls r6, r6, #16\n\t"
  158069. #else
  158070. "lsl r6, r6, #16\n\t"
  158071. #endif
  158072. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158073. "adds r3, r3, r6\n\t"
  158074. #else
  158075. "add r3, r3, r6\n\t"
  158076. #endif
  158077. #ifdef WOLFSSL_KEIL
  158078. "adcs r4, r4, r7\n\t"
  158079. #elif defined(__clang__)
  158080. "adcs r4, r7\n\t"
  158081. #else
  158082. "adc r4, r7\n\t"
  158083. #endif
  158084. #ifdef WOLFSSL_KEIL
  158085. "adcs r5, r5, %[r]\n\t"
  158086. #elif defined(__clang__)
  158087. "adcs r5, %[r]\n\t"
  158088. #else
  158089. "adc r5, %[r]\n\t"
  158090. #endif
  158091. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158092. "lsrs r6, %[a], #16\n\t"
  158093. #else
  158094. "lsr r6, %[a], #16\n\t"
  158095. #endif
  158096. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158097. "lsrs r7, %[b], #16\n\t"
  158098. #else
  158099. "lsr r7, %[b], #16\n\t"
  158100. #endif
  158101. #ifdef WOLFSSL_KEIL
  158102. "muls r7, r6, r7\n\t"
  158103. #elif defined(__clang__)
  158104. "muls r7, r6\n\t"
  158105. #else
  158106. "mul r7, r6\n\t"
  158107. #endif
  158108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158109. "adds r4, r4, r7\n\t"
  158110. #else
  158111. "add r4, r4, r7\n\t"
  158112. #endif
  158113. #ifdef WOLFSSL_KEIL
  158114. "adcs r5, r5, %[r]\n\t"
  158115. #elif defined(__clang__)
  158116. "adcs r5, %[r]\n\t"
  158117. #else
  158118. "adc r5, %[r]\n\t"
  158119. #endif
  158120. "uxth r7, %[b]\n\t"
  158121. #ifdef WOLFSSL_KEIL
  158122. "muls r6, r7, r6\n\t"
  158123. #elif defined(__clang__)
  158124. "muls r6, r7\n\t"
  158125. #else
  158126. "mul r6, r7\n\t"
  158127. #endif
  158128. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158129. "lsrs r7, r6, #16\n\t"
  158130. #else
  158131. "lsr r7, r6, #16\n\t"
  158132. #endif
  158133. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158134. "lsls r6, r6, #16\n\t"
  158135. #else
  158136. "lsl r6, r6, #16\n\t"
  158137. #endif
  158138. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158139. "adds r3, r3, r6\n\t"
  158140. #else
  158141. "add r3, r3, r6\n\t"
  158142. #endif
  158143. #ifdef WOLFSSL_KEIL
  158144. "adcs r4, r4, r7\n\t"
  158145. #elif defined(__clang__)
  158146. "adcs r4, r7\n\t"
  158147. #else
  158148. "adc r4, r7\n\t"
  158149. #endif
  158150. #ifdef WOLFSSL_KEIL
  158151. "adcs r5, r5, %[r]\n\t"
  158152. #elif defined(__clang__)
  158153. "adcs r5, %[r]\n\t"
  158154. #else
  158155. "adc r5, %[r]\n\t"
  158156. #endif
  158157. "# A[11] * B[7]\n\t"
  158158. "mov %[a], r9\n\t"
  158159. "mov %[b], r10\n\t"
  158160. "ldr %[a], [%[a], #44]\n\t"
  158161. "ldr %[b], [%[b], #28]\n\t"
  158162. "uxth r6, %[a]\n\t"
  158163. "uxth r7, %[b]\n\t"
  158164. #ifdef WOLFSSL_KEIL
  158165. "muls r7, r6, r7\n\t"
  158166. #elif defined(__clang__)
  158167. "muls r7, r6\n\t"
  158168. #else
  158169. "mul r7, r6\n\t"
  158170. #endif
  158171. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158172. "adds r3, r3, r7\n\t"
  158173. #else
  158174. "add r3, r3, r7\n\t"
  158175. #endif
  158176. #ifdef WOLFSSL_KEIL
  158177. "adcs r4, r4, %[r]\n\t"
  158178. #elif defined(__clang__)
  158179. "adcs r4, %[r]\n\t"
  158180. #else
  158181. "adc r4, %[r]\n\t"
  158182. #endif
  158183. #ifdef WOLFSSL_KEIL
  158184. "adcs r5, r5, %[r]\n\t"
  158185. #elif defined(__clang__)
  158186. "adcs r5, %[r]\n\t"
  158187. #else
  158188. "adc r5, %[r]\n\t"
  158189. #endif
  158190. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158191. "lsrs r7, %[b], #16\n\t"
  158192. #else
  158193. "lsr r7, %[b], #16\n\t"
  158194. #endif
  158195. #ifdef WOLFSSL_KEIL
  158196. "muls r6, r7, r6\n\t"
  158197. #elif defined(__clang__)
  158198. "muls r6, r7\n\t"
  158199. #else
  158200. "mul r6, r7\n\t"
  158201. #endif
  158202. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158203. "lsrs r7, r6, #16\n\t"
  158204. #else
  158205. "lsr r7, r6, #16\n\t"
  158206. #endif
  158207. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158208. "lsls r6, r6, #16\n\t"
  158209. #else
  158210. "lsl r6, r6, #16\n\t"
  158211. #endif
  158212. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158213. "adds r3, r3, r6\n\t"
  158214. #else
  158215. "add r3, r3, r6\n\t"
  158216. #endif
  158217. #ifdef WOLFSSL_KEIL
  158218. "adcs r4, r4, r7\n\t"
  158219. #elif defined(__clang__)
  158220. "adcs r4, r7\n\t"
  158221. #else
  158222. "adc r4, r7\n\t"
  158223. #endif
  158224. #ifdef WOLFSSL_KEIL
  158225. "adcs r5, r5, %[r]\n\t"
  158226. #elif defined(__clang__)
  158227. "adcs r5, %[r]\n\t"
  158228. #else
  158229. "adc r5, %[r]\n\t"
  158230. #endif
  158231. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158232. "lsrs r6, %[a], #16\n\t"
  158233. #else
  158234. "lsr r6, %[a], #16\n\t"
  158235. #endif
  158236. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158237. "lsrs r7, %[b], #16\n\t"
  158238. #else
  158239. "lsr r7, %[b], #16\n\t"
  158240. #endif
  158241. #ifdef WOLFSSL_KEIL
  158242. "muls r7, r6, r7\n\t"
  158243. #elif defined(__clang__)
  158244. "muls r7, r6\n\t"
  158245. #else
  158246. "mul r7, r6\n\t"
  158247. #endif
  158248. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158249. "adds r4, r4, r7\n\t"
  158250. #else
  158251. "add r4, r4, r7\n\t"
  158252. #endif
  158253. #ifdef WOLFSSL_KEIL
  158254. "adcs r5, r5, %[r]\n\t"
  158255. #elif defined(__clang__)
  158256. "adcs r5, %[r]\n\t"
  158257. #else
  158258. "adc r5, %[r]\n\t"
  158259. #endif
  158260. "uxth r7, %[b]\n\t"
  158261. #ifdef WOLFSSL_KEIL
  158262. "muls r6, r7, r6\n\t"
  158263. #elif defined(__clang__)
  158264. "muls r6, r7\n\t"
  158265. #else
  158266. "mul r6, r7\n\t"
  158267. #endif
  158268. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158269. "lsrs r7, r6, #16\n\t"
  158270. #else
  158271. "lsr r7, r6, #16\n\t"
  158272. #endif
  158273. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158274. "lsls r6, r6, #16\n\t"
  158275. #else
  158276. "lsl r6, r6, #16\n\t"
  158277. #endif
  158278. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158279. "adds r3, r3, r6\n\t"
  158280. #else
  158281. "add r3, r3, r6\n\t"
  158282. #endif
  158283. #ifdef WOLFSSL_KEIL
  158284. "adcs r4, r4, r7\n\t"
  158285. #elif defined(__clang__)
  158286. "adcs r4, r7\n\t"
  158287. #else
  158288. "adc r4, r7\n\t"
  158289. #endif
  158290. #ifdef WOLFSSL_KEIL
  158291. "adcs r5, r5, %[r]\n\t"
  158292. #elif defined(__clang__)
  158293. "adcs r5, %[r]\n\t"
  158294. #else
  158295. "adc r5, %[r]\n\t"
  158296. #endif
  158297. "# A[10] * B[8]\n\t"
  158298. "mov %[a], r9\n\t"
  158299. "mov %[b], r10\n\t"
  158300. "ldr %[a], [%[a], #40]\n\t"
  158301. "ldr %[b], [%[b], #32]\n\t"
  158302. "uxth r6, %[a]\n\t"
  158303. "uxth r7, %[b]\n\t"
  158304. #ifdef WOLFSSL_KEIL
  158305. "muls r7, r6, r7\n\t"
  158306. #elif defined(__clang__)
  158307. "muls r7, r6\n\t"
  158308. #else
  158309. "mul r7, r6\n\t"
  158310. #endif
  158311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158312. "adds r3, r3, r7\n\t"
  158313. #else
  158314. "add r3, r3, r7\n\t"
  158315. #endif
  158316. #ifdef WOLFSSL_KEIL
  158317. "adcs r4, r4, %[r]\n\t"
  158318. #elif defined(__clang__)
  158319. "adcs r4, %[r]\n\t"
  158320. #else
  158321. "adc r4, %[r]\n\t"
  158322. #endif
  158323. #ifdef WOLFSSL_KEIL
  158324. "adcs r5, r5, %[r]\n\t"
  158325. #elif defined(__clang__)
  158326. "adcs r5, %[r]\n\t"
  158327. #else
  158328. "adc r5, %[r]\n\t"
  158329. #endif
  158330. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158331. "lsrs r7, %[b], #16\n\t"
  158332. #else
  158333. "lsr r7, %[b], #16\n\t"
  158334. #endif
  158335. #ifdef WOLFSSL_KEIL
  158336. "muls r6, r7, r6\n\t"
  158337. #elif defined(__clang__)
  158338. "muls r6, r7\n\t"
  158339. #else
  158340. "mul r6, r7\n\t"
  158341. #endif
  158342. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158343. "lsrs r7, r6, #16\n\t"
  158344. #else
  158345. "lsr r7, r6, #16\n\t"
  158346. #endif
  158347. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158348. "lsls r6, r6, #16\n\t"
  158349. #else
  158350. "lsl r6, r6, #16\n\t"
  158351. #endif
  158352. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158353. "adds r3, r3, r6\n\t"
  158354. #else
  158355. "add r3, r3, r6\n\t"
  158356. #endif
  158357. #ifdef WOLFSSL_KEIL
  158358. "adcs r4, r4, r7\n\t"
  158359. #elif defined(__clang__)
  158360. "adcs r4, r7\n\t"
  158361. #else
  158362. "adc r4, r7\n\t"
  158363. #endif
  158364. #ifdef WOLFSSL_KEIL
  158365. "adcs r5, r5, %[r]\n\t"
  158366. #elif defined(__clang__)
  158367. "adcs r5, %[r]\n\t"
  158368. #else
  158369. "adc r5, %[r]\n\t"
  158370. #endif
  158371. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158372. "lsrs r6, %[a], #16\n\t"
  158373. #else
  158374. "lsr r6, %[a], #16\n\t"
  158375. #endif
  158376. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158377. "lsrs r7, %[b], #16\n\t"
  158378. #else
  158379. "lsr r7, %[b], #16\n\t"
  158380. #endif
  158381. #ifdef WOLFSSL_KEIL
  158382. "muls r7, r6, r7\n\t"
  158383. #elif defined(__clang__)
  158384. "muls r7, r6\n\t"
  158385. #else
  158386. "mul r7, r6\n\t"
  158387. #endif
  158388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158389. "adds r4, r4, r7\n\t"
  158390. #else
  158391. "add r4, r4, r7\n\t"
  158392. #endif
  158393. #ifdef WOLFSSL_KEIL
  158394. "adcs r5, r5, %[r]\n\t"
  158395. #elif defined(__clang__)
  158396. "adcs r5, %[r]\n\t"
  158397. #else
  158398. "adc r5, %[r]\n\t"
  158399. #endif
  158400. "uxth r7, %[b]\n\t"
  158401. #ifdef WOLFSSL_KEIL
  158402. "muls r6, r7, r6\n\t"
  158403. #elif defined(__clang__)
  158404. "muls r6, r7\n\t"
  158405. #else
  158406. "mul r6, r7\n\t"
  158407. #endif
  158408. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158409. "lsrs r7, r6, #16\n\t"
  158410. #else
  158411. "lsr r7, r6, #16\n\t"
  158412. #endif
  158413. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158414. "lsls r6, r6, #16\n\t"
  158415. #else
  158416. "lsl r6, r6, #16\n\t"
  158417. #endif
  158418. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158419. "adds r3, r3, r6\n\t"
  158420. #else
  158421. "add r3, r3, r6\n\t"
  158422. #endif
  158423. #ifdef WOLFSSL_KEIL
  158424. "adcs r4, r4, r7\n\t"
  158425. #elif defined(__clang__)
  158426. "adcs r4, r7\n\t"
  158427. #else
  158428. "adc r4, r7\n\t"
  158429. #endif
  158430. #ifdef WOLFSSL_KEIL
  158431. "adcs r5, r5, %[r]\n\t"
  158432. #elif defined(__clang__)
  158433. "adcs r5, %[r]\n\t"
  158434. #else
  158435. "adc r5, %[r]\n\t"
  158436. #endif
  158437. "# A[9] * B[9]\n\t"
  158438. "mov %[a], r9\n\t"
  158439. "mov %[b], r10\n\t"
  158440. "ldr %[a], [%[a], #36]\n\t"
  158441. "ldr %[b], [%[b], #36]\n\t"
  158442. "uxth r6, %[a]\n\t"
  158443. "uxth r7, %[b]\n\t"
  158444. #ifdef WOLFSSL_KEIL
  158445. "muls r7, r6, r7\n\t"
  158446. #elif defined(__clang__)
  158447. "muls r7, r6\n\t"
  158448. #else
  158449. "mul r7, r6\n\t"
  158450. #endif
  158451. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158452. "adds r3, r3, r7\n\t"
  158453. #else
  158454. "add r3, r3, r7\n\t"
  158455. #endif
  158456. #ifdef WOLFSSL_KEIL
  158457. "adcs r4, r4, %[r]\n\t"
  158458. #elif defined(__clang__)
  158459. "adcs r4, %[r]\n\t"
  158460. #else
  158461. "adc r4, %[r]\n\t"
  158462. #endif
  158463. #ifdef WOLFSSL_KEIL
  158464. "adcs r5, r5, %[r]\n\t"
  158465. #elif defined(__clang__)
  158466. "adcs r5, %[r]\n\t"
  158467. #else
  158468. "adc r5, %[r]\n\t"
  158469. #endif
  158470. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158471. "lsrs r7, %[b], #16\n\t"
  158472. #else
  158473. "lsr r7, %[b], #16\n\t"
  158474. #endif
  158475. #ifdef WOLFSSL_KEIL
  158476. "muls r6, r7, r6\n\t"
  158477. #elif defined(__clang__)
  158478. "muls r6, r7\n\t"
  158479. #else
  158480. "mul r6, r7\n\t"
  158481. #endif
  158482. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158483. "lsrs r7, r6, #16\n\t"
  158484. #else
  158485. "lsr r7, r6, #16\n\t"
  158486. #endif
  158487. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158488. "lsls r6, r6, #16\n\t"
  158489. #else
  158490. "lsl r6, r6, #16\n\t"
  158491. #endif
  158492. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158493. "adds r3, r3, r6\n\t"
  158494. #else
  158495. "add r3, r3, r6\n\t"
  158496. #endif
  158497. #ifdef WOLFSSL_KEIL
  158498. "adcs r4, r4, r7\n\t"
  158499. #elif defined(__clang__)
  158500. "adcs r4, r7\n\t"
  158501. #else
  158502. "adc r4, r7\n\t"
  158503. #endif
  158504. #ifdef WOLFSSL_KEIL
  158505. "adcs r5, r5, %[r]\n\t"
  158506. #elif defined(__clang__)
  158507. "adcs r5, %[r]\n\t"
  158508. #else
  158509. "adc r5, %[r]\n\t"
  158510. #endif
  158511. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158512. "lsrs r6, %[a], #16\n\t"
  158513. #else
  158514. "lsr r6, %[a], #16\n\t"
  158515. #endif
  158516. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158517. "lsrs r7, %[b], #16\n\t"
  158518. #else
  158519. "lsr r7, %[b], #16\n\t"
  158520. #endif
  158521. #ifdef WOLFSSL_KEIL
  158522. "muls r7, r6, r7\n\t"
  158523. #elif defined(__clang__)
  158524. "muls r7, r6\n\t"
  158525. #else
  158526. "mul r7, r6\n\t"
  158527. #endif
  158528. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158529. "adds r4, r4, r7\n\t"
  158530. #else
  158531. "add r4, r4, r7\n\t"
  158532. #endif
  158533. #ifdef WOLFSSL_KEIL
  158534. "adcs r5, r5, %[r]\n\t"
  158535. #elif defined(__clang__)
  158536. "adcs r5, %[r]\n\t"
  158537. #else
  158538. "adc r5, %[r]\n\t"
  158539. #endif
  158540. "uxth r7, %[b]\n\t"
  158541. #ifdef WOLFSSL_KEIL
  158542. "muls r6, r7, r6\n\t"
  158543. #elif defined(__clang__)
  158544. "muls r6, r7\n\t"
  158545. #else
  158546. "mul r6, r7\n\t"
  158547. #endif
  158548. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158549. "lsrs r7, r6, #16\n\t"
  158550. #else
  158551. "lsr r7, r6, #16\n\t"
  158552. #endif
  158553. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158554. "lsls r6, r6, #16\n\t"
  158555. #else
  158556. "lsl r6, r6, #16\n\t"
  158557. #endif
  158558. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158559. "adds r3, r3, r6\n\t"
  158560. #else
  158561. "add r3, r3, r6\n\t"
  158562. #endif
  158563. #ifdef WOLFSSL_KEIL
  158564. "adcs r4, r4, r7\n\t"
  158565. #elif defined(__clang__)
  158566. "adcs r4, r7\n\t"
  158567. #else
  158568. "adc r4, r7\n\t"
  158569. #endif
  158570. #ifdef WOLFSSL_KEIL
  158571. "adcs r5, r5, %[r]\n\t"
  158572. #elif defined(__clang__)
  158573. "adcs r5, %[r]\n\t"
  158574. #else
  158575. "adc r5, %[r]\n\t"
  158576. #endif
  158577. "# A[8] * B[10]\n\t"
  158578. "mov %[a], r9\n\t"
  158579. "mov %[b], r10\n\t"
  158580. "ldr %[a], [%[a], #32]\n\t"
  158581. "ldr %[b], [%[b], #40]\n\t"
  158582. "uxth r6, %[a]\n\t"
  158583. "uxth r7, %[b]\n\t"
  158584. #ifdef WOLFSSL_KEIL
  158585. "muls r7, r6, r7\n\t"
  158586. #elif defined(__clang__)
  158587. "muls r7, r6\n\t"
  158588. #else
  158589. "mul r7, r6\n\t"
  158590. #endif
  158591. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158592. "adds r3, r3, r7\n\t"
  158593. #else
  158594. "add r3, r3, r7\n\t"
  158595. #endif
  158596. #ifdef WOLFSSL_KEIL
  158597. "adcs r4, r4, %[r]\n\t"
  158598. #elif defined(__clang__)
  158599. "adcs r4, %[r]\n\t"
  158600. #else
  158601. "adc r4, %[r]\n\t"
  158602. #endif
  158603. #ifdef WOLFSSL_KEIL
  158604. "adcs r5, r5, %[r]\n\t"
  158605. #elif defined(__clang__)
  158606. "adcs r5, %[r]\n\t"
  158607. #else
  158608. "adc r5, %[r]\n\t"
  158609. #endif
  158610. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158611. "lsrs r7, %[b], #16\n\t"
  158612. #else
  158613. "lsr r7, %[b], #16\n\t"
  158614. #endif
  158615. #ifdef WOLFSSL_KEIL
  158616. "muls r6, r7, r6\n\t"
  158617. #elif defined(__clang__)
  158618. "muls r6, r7\n\t"
  158619. #else
  158620. "mul r6, r7\n\t"
  158621. #endif
  158622. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158623. "lsrs r7, r6, #16\n\t"
  158624. #else
  158625. "lsr r7, r6, #16\n\t"
  158626. #endif
  158627. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158628. "lsls r6, r6, #16\n\t"
  158629. #else
  158630. "lsl r6, r6, #16\n\t"
  158631. #endif
  158632. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158633. "adds r3, r3, r6\n\t"
  158634. #else
  158635. "add r3, r3, r6\n\t"
  158636. #endif
  158637. #ifdef WOLFSSL_KEIL
  158638. "adcs r4, r4, r7\n\t"
  158639. #elif defined(__clang__)
  158640. "adcs r4, r7\n\t"
  158641. #else
  158642. "adc r4, r7\n\t"
  158643. #endif
  158644. #ifdef WOLFSSL_KEIL
  158645. "adcs r5, r5, %[r]\n\t"
  158646. #elif defined(__clang__)
  158647. "adcs r5, %[r]\n\t"
  158648. #else
  158649. "adc r5, %[r]\n\t"
  158650. #endif
  158651. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158652. "lsrs r6, %[a], #16\n\t"
  158653. #else
  158654. "lsr r6, %[a], #16\n\t"
  158655. #endif
  158656. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158657. "lsrs r7, %[b], #16\n\t"
  158658. #else
  158659. "lsr r7, %[b], #16\n\t"
  158660. #endif
  158661. #ifdef WOLFSSL_KEIL
  158662. "muls r7, r6, r7\n\t"
  158663. #elif defined(__clang__)
  158664. "muls r7, r6\n\t"
  158665. #else
  158666. "mul r7, r6\n\t"
  158667. #endif
  158668. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158669. "adds r4, r4, r7\n\t"
  158670. #else
  158671. "add r4, r4, r7\n\t"
  158672. #endif
  158673. #ifdef WOLFSSL_KEIL
  158674. "adcs r5, r5, %[r]\n\t"
  158675. #elif defined(__clang__)
  158676. "adcs r5, %[r]\n\t"
  158677. #else
  158678. "adc r5, %[r]\n\t"
  158679. #endif
  158680. "uxth r7, %[b]\n\t"
  158681. #ifdef WOLFSSL_KEIL
  158682. "muls r6, r7, r6\n\t"
  158683. #elif defined(__clang__)
  158684. "muls r6, r7\n\t"
  158685. #else
  158686. "mul r6, r7\n\t"
  158687. #endif
  158688. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158689. "lsrs r7, r6, #16\n\t"
  158690. #else
  158691. "lsr r7, r6, #16\n\t"
  158692. #endif
  158693. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158694. "lsls r6, r6, #16\n\t"
  158695. #else
  158696. "lsl r6, r6, #16\n\t"
  158697. #endif
  158698. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158699. "adds r3, r3, r6\n\t"
  158700. #else
  158701. "add r3, r3, r6\n\t"
  158702. #endif
  158703. #ifdef WOLFSSL_KEIL
  158704. "adcs r4, r4, r7\n\t"
  158705. #elif defined(__clang__)
  158706. "adcs r4, r7\n\t"
  158707. #else
  158708. "adc r4, r7\n\t"
  158709. #endif
  158710. #ifdef WOLFSSL_KEIL
  158711. "adcs r5, r5, %[r]\n\t"
  158712. #elif defined(__clang__)
  158713. "adcs r5, %[r]\n\t"
  158714. #else
  158715. "adc r5, %[r]\n\t"
  158716. #endif
  158717. "# A[7] * B[11]\n\t"
  158718. "mov %[a], r9\n\t"
  158719. "mov %[b], r10\n\t"
  158720. "ldr %[a], [%[a], #28]\n\t"
  158721. "ldr %[b], [%[b], #44]\n\t"
  158722. "uxth r6, %[a]\n\t"
  158723. "uxth r7, %[b]\n\t"
  158724. #ifdef WOLFSSL_KEIL
  158725. "muls r7, r6, r7\n\t"
  158726. #elif defined(__clang__)
  158727. "muls r7, r6\n\t"
  158728. #else
  158729. "mul r7, r6\n\t"
  158730. #endif
  158731. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158732. "adds r3, r3, r7\n\t"
  158733. #else
  158734. "add r3, r3, r7\n\t"
  158735. #endif
  158736. #ifdef WOLFSSL_KEIL
  158737. "adcs r4, r4, %[r]\n\t"
  158738. #elif defined(__clang__)
  158739. "adcs r4, %[r]\n\t"
  158740. #else
  158741. "adc r4, %[r]\n\t"
  158742. #endif
  158743. #ifdef WOLFSSL_KEIL
  158744. "adcs r5, r5, %[r]\n\t"
  158745. #elif defined(__clang__)
  158746. "adcs r5, %[r]\n\t"
  158747. #else
  158748. "adc r5, %[r]\n\t"
  158749. #endif
  158750. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158751. "lsrs r7, %[b], #16\n\t"
  158752. #else
  158753. "lsr r7, %[b], #16\n\t"
  158754. #endif
  158755. #ifdef WOLFSSL_KEIL
  158756. "muls r6, r7, r6\n\t"
  158757. #elif defined(__clang__)
  158758. "muls r6, r7\n\t"
  158759. #else
  158760. "mul r6, r7\n\t"
  158761. #endif
  158762. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158763. "lsrs r7, r6, #16\n\t"
  158764. #else
  158765. "lsr r7, r6, #16\n\t"
  158766. #endif
  158767. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158768. "lsls r6, r6, #16\n\t"
  158769. #else
  158770. "lsl r6, r6, #16\n\t"
  158771. #endif
  158772. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158773. "adds r3, r3, r6\n\t"
  158774. #else
  158775. "add r3, r3, r6\n\t"
  158776. #endif
  158777. #ifdef WOLFSSL_KEIL
  158778. "adcs r4, r4, r7\n\t"
  158779. #elif defined(__clang__)
  158780. "adcs r4, r7\n\t"
  158781. #else
  158782. "adc r4, r7\n\t"
  158783. #endif
  158784. #ifdef WOLFSSL_KEIL
  158785. "adcs r5, r5, %[r]\n\t"
  158786. #elif defined(__clang__)
  158787. "adcs r5, %[r]\n\t"
  158788. #else
  158789. "adc r5, %[r]\n\t"
  158790. #endif
  158791. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158792. "lsrs r6, %[a], #16\n\t"
  158793. #else
  158794. "lsr r6, %[a], #16\n\t"
  158795. #endif
  158796. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158797. "lsrs r7, %[b], #16\n\t"
  158798. #else
  158799. "lsr r7, %[b], #16\n\t"
  158800. #endif
  158801. #ifdef WOLFSSL_KEIL
  158802. "muls r7, r6, r7\n\t"
  158803. #elif defined(__clang__)
  158804. "muls r7, r6\n\t"
  158805. #else
  158806. "mul r7, r6\n\t"
  158807. #endif
  158808. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158809. "adds r4, r4, r7\n\t"
  158810. #else
  158811. "add r4, r4, r7\n\t"
  158812. #endif
  158813. #ifdef WOLFSSL_KEIL
  158814. "adcs r5, r5, %[r]\n\t"
  158815. #elif defined(__clang__)
  158816. "adcs r5, %[r]\n\t"
  158817. #else
  158818. "adc r5, %[r]\n\t"
  158819. #endif
  158820. "uxth r7, %[b]\n\t"
  158821. #ifdef WOLFSSL_KEIL
  158822. "muls r6, r7, r6\n\t"
  158823. #elif defined(__clang__)
  158824. "muls r6, r7\n\t"
  158825. #else
  158826. "mul r6, r7\n\t"
  158827. #endif
  158828. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158829. "lsrs r7, r6, #16\n\t"
  158830. #else
  158831. "lsr r7, r6, #16\n\t"
  158832. #endif
  158833. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158834. "lsls r6, r6, #16\n\t"
  158835. #else
  158836. "lsl r6, r6, #16\n\t"
  158837. #endif
  158838. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158839. "adds r3, r3, r6\n\t"
  158840. #else
  158841. "add r3, r3, r6\n\t"
  158842. #endif
  158843. #ifdef WOLFSSL_KEIL
  158844. "adcs r4, r4, r7\n\t"
  158845. #elif defined(__clang__)
  158846. "adcs r4, r7\n\t"
  158847. #else
  158848. "adc r4, r7\n\t"
  158849. #endif
  158850. #ifdef WOLFSSL_KEIL
  158851. "adcs r5, r5, %[r]\n\t"
  158852. #elif defined(__clang__)
  158853. "adcs r5, %[r]\n\t"
  158854. #else
  158855. "adc r5, %[r]\n\t"
  158856. #endif
  158857. "# A[6] * B[12]\n\t"
  158858. "mov %[a], r9\n\t"
  158859. "mov %[b], r10\n\t"
  158860. "ldr %[a], [%[a], #24]\n\t"
  158861. "ldr %[b], [%[b], #48]\n\t"
  158862. "uxth r6, %[a]\n\t"
  158863. "uxth r7, %[b]\n\t"
  158864. #ifdef WOLFSSL_KEIL
  158865. "muls r7, r6, r7\n\t"
  158866. #elif defined(__clang__)
  158867. "muls r7, r6\n\t"
  158868. #else
  158869. "mul r7, r6\n\t"
  158870. #endif
  158871. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158872. "adds r3, r3, r7\n\t"
  158873. #else
  158874. "add r3, r3, r7\n\t"
  158875. #endif
  158876. #ifdef WOLFSSL_KEIL
  158877. "adcs r4, r4, %[r]\n\t"
  158878. #elif defined(__clang__)
  158879. "adcs r4, %[r]\n\t"
  158880. #else
  158881. "adc r4, %[r]\n\t"
  158882. #endif
  158883. #ifdef WOLFSSL_KEIL
  158884. "adcs r5, r5, %[r]\n\t"
  158885. #elif defined(__clang__)
  158886. "adcs r5, %[r]\n\t"
  158887. #else
  158888. "adc r5, %[r]\n\t"
  158889. #endif
  158890. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158891. "lsrs r7, %[b], #16\n\t"
  158892. #else
  158893. "lsr r7, %[b], #16\n\t"
  158894. #endif
  158895. #ifdef WOLFSSL_KEIL
  158896. "muls r6, r7, r6\n\t"
  158897. #elif defined(__clang__)
  158898. "muls r6, r7\n\t"
  158899. #else
  158900. "mul r6, r7\n\t"
  158901. #endif
  158902. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158903. "lsrs r7, r6, #16\n\t"
  158904. #else
  158905. "lsr r7, r6, #16\n\t"
  158906. #endif
  158907. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158908. "lsls r6, r6, #16\n\t"
  158909. #else
  158910. "lsl r6, r6, #16\n\t"
  158911. #endif
  158912. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158913. "adds r3, r3, r6\n\t"
  158914. #else
  158915. "add r3, r3, r6\n\t"
  158916. #endif
  158917. #ifdef WOLFSSL_KEIL
  158918. "adcs r4, r4, r7\n\t"
  158919. #elif defined(__clang__)
  158920. "adcs r4, r7\n\t"
  158921. #else
  158922. "adc r4, r7\n\t"
  158923. #endif
  158924. #ifdef WOLFSSL_KEIL
  158925. "adcs r5, r5, %[r]\n\t"
  158926. #elif defined(__clang__)
  158927. "adcs r5, %[r]\n\t"
  158928. #else
  158929. "adc r5, %[r]\n\t"
  158930. #endif
  158931. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158932. "lsrs r6, %[a], #16\n\t"
  158933. #else
  158934. "lsr r6, %[a], #16\n\t"
  158935. #endif
  158936. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158937. "lsrs r7, %[b], #16\n\t"
  158938. #else
  158939. "lsr r7, %[b], #16\n\t"
  158940. #endif
  158941. #ifdef WOLFSSL_KEIL
  158942. "muls r7, r6, r7\n\t"
  158943. #elif defined(__clang__)
  158944. "muls r7, r6\n\t"
  158945. #else
  158946. "mul r7, r6\n\t"
  158947. #endif
  158948. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158949. "adds r4, r4, r7\n\t"
  158950. #else
  158951. "add r4, r4, r7\n\t"
  158952. #endif
  158953. #ifdef WOLFSSL_KEIL
  158954. "adcs r5, r5, %[r]\n\t"
  158955. #elif defined(__clang__)
  158956. "adcs r5, %[r]\n\t"
  158957. #else
  158958. "adc r5, %[r]\n\t"
  158959. #endif
  158960. "uxth r7, %[b]\n\t"
  158961. #ifdef WOLFSSL_KEIL
  158962. "muls r6, r7, r6\n\t"
  158963. #elif defined(__clang__)
  158964. "muls r6, r7\n\t"
  158965. #else
  158966. "mul r6, r7\n\t"
  158967. #endif
  158968. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158969. "lsrs r7, r6, #16\n\t"
  158970. #else
  158971. "lsr r7, r6, #16\n\t"
  158972. #endif
  158973. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158974. "lsls r6, r6, #16\n\t"
  158975. #else
  158976. "lsl r6, r6, #16\n\t"
  158977. #endif
  158978. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158979. "adds r3, r3, r6\n\t"
  158980. #else
  158981. "add r3, r3, r6\n\t"
  158982. #endif
  158983. #ifdef WOLFSSL_KEIL
  158984. "adcs r4, r4, r7\n\t"
  158985. #elif defined(__clang__)
  158986. "adcs r4, r7\n\t"
  158987. #else
  158988. "adc r4, r7\n\t"
  158989. #endif
  158990. #ifdef WOLFSSL_KEIL
  158991. "adcs r5, r5, %[r]\n\t"
  158992. #elif defined(__clang__)
  158993. "adcs r5, %[r]\n\t"
  158994. #else
  158995. "adc r5, %[r]\n\t"
  158996. #endif
  158997. "# A[5] * B[13]\n\t"
  158998. "mov %[a], r9\n\t"
  158999. "mov %[b], r10\n\t"
  159000. "ldr %[a], [%[a], #20]\n\t"
  159001. "ldr %[b], [%[b], #52]\n\t"
  159002. "uxth r6, %[a]\n\t"
  159003. "uxth r7, %[b]\n\t"
  159004. #ifdef WOLFSSL_KEIL
  159005. "muls r7, r6, r7\n\t"
  159006. #elif defined(__clang__)
  159007. "muls r7, r6\n\t"
  159008. #else
  159009. "mul r7, r6\n\t"
  159010. #endif
  159011. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159012. "adds r3, r3, r7\n\t"
  159013. #else
  159014. "add r3, r3, r7\n\t"
  159015. #endif
  159016. #ifdef WOLFSSL_KEIL
  159017. "adcs r4, r4, %[r]\n\t"
  159018. #elif defined(__clang__)
  159019. "adcs r4, %[r]\n\t"
  159020. #else
  159021. "adc r4, %[r]\n\t"
  159022. #endif
  159023. #ifdef WOLFSSL_KEIL
  159024. "adcs r5, r5, %[r]\n\t"
  159025. #elif defined(__clang__)
  159026. "adcs r5, %[r]\n\t"
  159027. #else
  159028. "adc r5, %[r]\n\t"
  159029. #endif
  159030. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159031. "lsrs r7, %[b], #16\n\t"
  159032. #else
  159033. "lsr r7, %[b], #16\n\t"
  159034. #endif
  159035. #ifdef WOLFSSL_KEIL
  159036. "muls r6, r7, r6\n\t"
  159037. #elif defined(__clang__)
  159038. "muls r6, r7\n\t"
  159039. #else
  159040. "mul r6, r7\n\t"
  159041. #endif
  159042. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159043. "lsrs r7, r6, #16\n\t"
  159044. #else
  159045. "lsr r7, r6, #16\n\t"
  159046. #endif
  159047. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159048. "lsls r6, r6, #16\n\t"
  159049. #else
  159050. "lsl r6, r6, #16\n\t"
  159051. #endif
  159052. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159053. "adds r3, r3, r6\n\t"
  159054. #else
  159055. "add r3, r3, r6\n\t"
  159056. #endif
  159057. #ifdef WOLFSSL_KEIL
  159058. "adcs r4, r4, r7\n\t"
  159059. #elif defined(__clang__)
  159060. "adcs r4, r7\n\t"
  159061. #else
  159062. "adc r4, r7\n\t"
  159063. #endif
  159064. #ifdef WOLFSSL_KEIL
  159065. "adcs r5, r5, %[r]\n\t"
  159066. #elif defined(__clang__)
  159067. "adcs r5, %[r]\n\t"
  159068. #else
  159069. "adc r5, %[r]\n\t"
  159070. #endif
  159071. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159072. "lsrs r6, %[a], #16\n\t"
  159073. #else
  159074. "lsr r6, %[a], #16\n\t"
  159075. #endif
  159076. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159077. "lsrs r7, %[b], #16\n\t"
  159078. #else
  159079. "lsr r7, %[b], #16\n\t"
  159080. #endif
  159081. #ifdef WOLFSSL_KEIL
  159082. "muls r7, r6, r7\n\t"
  159083. #elif defined(__clang__)
  159084. "muls r7, r6\n\t"
  159085. #else
  159086. "mul r7, r6\n\t"
  159087. #endif
  159088. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159089. "adds r4, r4, r7\n\t"
  159090. #else
  159091. "add r4, r4, r7\n\t"
  159092. #endif
  159093. #ifdef WOLFSSL_KEIL
  159094. "adcs r5, r5, %[r]\n\t"
  159095. #elif defined(__clang__)
  159096. "adcs r5, %[r]\n\t"
  159097. #else
  159098. "adc r5, %[r]\n\t"
  159099. #endif
  159100. "uxth r7, %[b]\n\t"
  159101. #ifdef WOLFSSL_KEIL
  159102. "muls r6, r7, r6\n\t"
  159103. #elif defined(__clang__)
  159104. "muls r6, r7\n\t"
  159105. #else
  159106. "mul r6, r7\n\t"
  159107. #endif
  159108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159109. "lsrs r7, r6, #16\n\t"
  159110. #else
  159111. "lsr r7, r6, #16\n\t"
  159112. #endif
  159113. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159114. "lsls r6, r6, #16\n\t"
  159115. #else
  159116. "lsl r6, r6, #16\n\t"
  159117. #endif
  159118. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159119. "adds r3, r3, r6\n\t"
  159120. #else
  159121. "add r3, r3, r6\n\t"
  159122. #endif
  159123. #ifdef WOLFSSL_KEIL
  159124. "adcs r4, r4, r7\n\t"
  159125. #elif defined(__clang__)
  159126. "adcs r4, r7\n\t"
  159127. #else
  159128. "adc r4, r7\n\t"
  159129. #endif
  159130. #ifdef WOLFSSL_KEIL
  159131. "adcs r5, r5, %[r]\n\t"
  159132. #elif defined(__clang__)
  159133. "adcs r5, %[r]\n\t"
  159134. #else
  159135. "adc r5, %[r]\n\t"
  159136. #endif
  159137. "# A[4] * B[14]\n\t"
  159138. "mov %[a], r9\n\t"
  159139. "mov %[b], r10\n\t"
  159140. "ldr %[a], [%[a], #16]\n\t"
  159141. "ldr %[b], [%[b], #56]\n\t"
  159142. "uxth r6, %[a]\n\t"
  159143. "uxth r7, %[b]\n\t"
  159144. #ifdef WOLFSSL_KEIL
  159145. "muls r7, r6, r7\n\t"
  159146. #elif defined(__clang__)
  159147. "muls r7, r6\n\t"
  159148. #else
  159149. "mul r7, r6\n\t"
  159150. #endif
  159151. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159152. "adds r3, r3, r7\n\t"
  159153. #else
  159154. "add r3, r3, r7\n\t"
  159155. #endif
  159156. #ifdef WOLFSSL_KEIL
  159157. "adcs r4, r4, %[r]\n\t"
  159158. #elif defined(__clang__)
  159159. "adcs r4, %[r]\n\t"
  159160. #else
  159161. "adc r4, %[r]\n\t"
  159162. #endif
  159163. #ifdef WOLFSSL_KEIL
  159164. "adcs r5, r5, %[r]\n\t"
  159165. #elif defined(__clang__)
  159166. "adcs r5, %[r]\n\t"
  159167. #else
  159168. "adc r5, %[r]\n\t"
  159169. #endif
  159170. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159171. "lsrs r7, %[b], #16\n\t"
  159172. #else
  159173. "lsr r7, %[b], #16\n\t"
  159174. #endif
  159175. #ifdef WOLFSSL_KEIL
  159176. "muls r6, r7, r6\n\t"
  159177. #elif defined(__clang__)
  159178. "muls r6, r7\n\t"
  159179. #else
  159180. "mul r6, r7\n\t"
  159181. #endif
  159182. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159183. "lsrs r7, r6, #16\n\t"
  159184. #else
  159185. "lsr r7, r6, #16\n\t"
  159186. #endif
  159187. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159188. "lsls r6, r6, #16\n\t"
  159189. #else
  159190. "lsl r6, r6, #16\n\t"
  159191. #endif
  159192. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159193. "adds r3, r3, r6\n\t"
  159194. #else
  159195. "add r3, r3, r6\n\t"
  159196. #endif
  159197. #ifdef WOLFSSL_KEIL
  159198. "adcs r4, r4, r7\n\t"
  159199. #elif defined(__clang__)
  159200. "adcs r4, r7\n\t"
  159201. #else
  159202. "adc r4, r7\n\t"
  159203. #endif
  159204. #ifdef WOLFSSL_KEIL
  159205. "adcs r5, r5, %[r]\n\t"
  159206. #elif defined(__clang__)
  159207. "adcs r5, %[r]\n\t"
  159208. #else
  159209. "adc r5, %[r]\n\t"
  159210. #endif
  159211. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159212. "lsrs r6, %[a], #16\n\t"
  159213. #else
  159214. "lsr r6, %[a], #16\n\t"
  159215. #endif
  159216. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159217. "lsrs r7, %[b], #16\n\t"
  159218. #else
  159219. "lsr r7, %[b], #16\n\t"
  159220. #endif
  159221. #ifdef WOLFSSL_KEIL
  159222. "muls r7, r6, r7\n\t"
  159223. #elif defined(__clang__)
  159224. "muls r7, r6\n\t"
  159225. #else
  159226. "mul r7, r6\n\t"
  159227. #endif
  159228. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159229. "adds r4, r4, r7\n\t"
  159230. #else
  159231. "add r4, r4, r7\n\t"
  159232. #endif
  159233. #ifdef WOLFSSL_KEIL
  159234. "adcs r5, r5, %[r]\n\t"
  159235. #elif defined(__clang__)
  159236. "adcs r5, %[r]\n\t"
  159237. #else
  159238. "adc r5, %[r]\n\t"
  159239. #endif
  159240. "uxth r7, %[b]\n\t"
  159241. #ifdef WOLFSSL_KEIL
  159242. "muls r6, r7, r6\n\t"
  159243. #elif defined(__clang__)
  159244. "muls r6, r7\n\t"
  159245. #else
  159246. "mul r6, r7\n\t"
  159247. #endif
  159248. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159249. "lsrs r7, r6, #16\n\t"
  159250. #else
  159251. "lsr r7, r6, #16\n\t"
  159252. #endif
  159253. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159254. "lsls r6, r6, #16\n\t"
  159255. #else
  159256. "lsl r6, r6, #16\n\t"
  159257. #endif
  159258. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159259. "adds r3, r3, r6\n\t"
  159260. #else
  159261. "add r3, r3, r6\n\t"
  159262. #endif
  159263. #ifdef WOLFSSL_KEIL
  159264. "adcs r4, r4, r7\n\t"
  159265. #elif defined(__clang__)
  159266. "adcs r4, r7\n\t"
  159267. #else
  159268. "adc r4, r7\n\t"
  159269. #endif
  159270. #ifdef WOLFSSL_KEIL
  159271. "adcs r5, r5, %[r]\n\t"
  159272. #elif defined(__clang__)
  159273. "adcs r5, %[r]\n\t"
  159274. #else
  159275. "adc r5, %[r]\n\t"
  159276. #endif
  159277. "# A[3] * B[15]\n\t"
  159278. "mov %[a], r9\n\t"
  159279. "mov %[b], r10\n\t"
  159280. "ldr %[a], [%[a], #12]\n\t"
  159281. "ldr %[b], [%[b], #60]\n\t"
  159282. "uxth r6, %[a]\n\t"
  159283. "uxth r7, %[b]\n\t"
  159284. #ifdef WOLFSSL_KEIL
  159285. "muls r7, r6, r7\n\t"
  159286. #elif defined(__clang__)
  159287. "muls r7, r6\n\t"
  159288. #else
  159289. "mul r7, r6\n\t"
  159290. #endif
  159291. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159292. "adds r3, r3, r7\n\t"
  159293. #else
  159294. "add r3, r3, r7\n\t"
  159295. #endif
  159296. #ifdef WOLFSSL_KEIL
  159297. "adcs r4, r4, %[r]\n\t"
  159298. #elif defined(__clang__)
  159299. "adcs r4, %[r]\n\t"
  159300. #else
  159301. "adc r4, %[r]\n\t"
  159302. #endif
  159303. #ifdef WOLFSSL_KEIL
  159304. "adcs r5, r5, %[r]\n\t"
  159305. #elif defined(__clang__)
  159306. "adcs r5, %[r]\n\t"
  159307. #else
  159308. "adc r5, %[r]\n\t"
  159309. #endif
  159310. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159311. "lsrs r7, %[b], #16\n\t"
  159312. #else
  159313. "lsr r7, %[b], #16\n\t"
  159314. #endif
  159315. #ifdef WOLFSSL_KEIL
  159316. "muls r6, r7, r6\n\t"
  159317. #elif defined(__clang__)
  159318. "muls r6, r7\n\t"
  159319. #else
  159320. "mul r6, r7\n\t"
  159321. #endif
  159322. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159323. "lsrs r7, r6, #16\n\t"
  159324. #else
  159325. "lsr r7, r6, #16\n\t"
  159326. #endif
  159327. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159328. "lsls r6, r6, #16\n\t"
  159329. #else
  159330. "lsl r6, r6, #16\n\t"
  159331. #endif
  159332. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159333. "adds r3, r3, r6\n\t"
  159334. #else
  159335. "add r3, r3, r6\n\t"
  159336. #endif
  159337. #ifdef WOLFSSL_KEIL
  159338. "adcs r4, r4, r7\n\t"
  159339. #elif defined(__clang__)
  159340. "adcs r4, r7\n\t"
  159341. #else
  159342. "adc r4, r7\n\t"
  159343. #endif
  159344. #ifdef WOLFSSL_KEIL
  159345. "adcs r5, r5, %[r]\n\t"
  159346. #elif defined(__clang__)
  159347. "adcs r5, %[r]\n\t"
  159348. #else
  159349. "adc r5, %[r]\n\t"
  159350. #endif
  159351. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159352. "lsrs r6, %[a], #16\n\t"
  159353. #else
  159354. "lsr r6, %[a], #16\n\t"
  159355. #endif
  159356. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159357. "lsrs r7, %[b], #16\n\t"
  159358. #else
  159359. "lsr r7, %[b], #16\n\t"
  159360. #endif
  159361. #ifdef WOLFSSL_KEIL
  159362. "muls r7, r6, r7\n\t"
  159363. #elif defined(__clang__)
  159364. "muls r7, r6\n\t"
  159365. #else
  159366. "mul r7, r6\n\t"
  159367. #endif
  159368. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159369. "adds r4, r4, r7\n\t"
  159370. #else
  159371. "add r4, r4, r7\n\t"
  159372. #endif
  159373. #ifdef WOLFSSL_KEIL
  159374. "adcs r5, r5, %[r]\n\t"
  159375. #elif defined(__clang__)
  159376. "adcs r5, %[r]\n\t"
  159377. #else
  159378. "adc r5, %[r]\n\t"
  159379. #endif
  159380. "uxth r7, %[b]\n\t"
  159381. #ifdef WOLFSSL_KEIL
  159382. "muls r6, r7, r6\n\t"
  159383. #elif defined(__clang__)
  159384. "muls r6, r7\n\t"
  159385. #else
  159386. "mul r6, r7\n\t"
  159387. #endif
  159388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159389. "lsrs r7, r6, #16\n\t"
  159390. #else
  159391. "lsr r7, r6, #16\n\t"
  159392. #endif
  159393. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159394. "lsls r6, r6, #16\n\t"
  159395. #else
  159396. "lsl r6, r6, #16\n\t"
  159397. #endif
  159398. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159399. "adds r3, r3, r6\n\t"
  159400. #else
  159401. "add r3, r3, r6\n\t"
  159402. #endif
  159403. #ifdef WOLFSSL_KEIL
  159404. "adcs r4, r4, r7\n\t"
  159405. #elif defined(__clang__)
  159406. "adcs r4, r7\n\t"
  159407. #else
  159408. "adc r4, r7\n\t"
  159409. #endif
  159410. #ifdef WOLFSSL_KEIL
  159411. "adcs r5, r5, %[r]\n\t"
  159412. #elif defined(__clang__)
  159413. "adcs r5, %[r]\n\t"
  159414. #else
  159415. "adc r5, %[r]\n\t"
  159416. #endif
  159417. "mov %[r], r8\n\t"
  159418. "str r3, [%[r], #72]\n\t"
  159419. "movs %[r], #0\n\t"
  159420. "# A[4] * B[15]\n\t"
  159421. "movs r3, #0\n\t"
  159422. "mov %[a], r9\n\t"
  159423. "mov %[b], r10\n\t"
  159424. "ldr %[a], [%[a], #16]\n\t"
  159425. "ldr %[b], [%[b], #60]\n\t"
  159426. "uxth r6, %[a]\n\t"
  159427. "uxth r7, %[b]\n\t"
  159428. #ifdef WOLFSSL_KEIL
  159429. "muls r7, r6, r7\n\t"
  159430. #elif defined(__clang__)
  159431. "muls r7, r6\n\t"
  159432. #else
  159433. "mul r7, r6\n\t"
  159434. #endif
  159435. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159436. "adds r4, r4, r7\n\t"
  159437. #else
  159438. "add r4, r4, r7\n\t"
  159439. #endif
  159440. #ifdef WOLFSSL_KEIL
  159441. "adcs r5, r5, %[r]\n\t"
  159442. #elif defined(__clang__)
  159443. "adcs r5, %[r]\n\t"
  159444. #else
  159445. "adc r5, %[r]\n\t"
  159446. #endif
  159447. #ifdef WOLFSSL_KEIL
  159448. "adcs r3, r3, %[r]\n\t"
  159449. #elif defined(__clang__)
  159450. "adcs r3, %[r]\n\t"
  159451. #else
  159452. "adc r3, %[r]\n\t"
  159453. #endif
  159454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159455. "lsrs r7, %[b], #16\n\t"
  159456. #else
  159457. "lsr r7, %[b], #16\n\t"
  159458. #endif
  159459. #ifdef WOLFSSL_KEIL
  159460. "muls r6, r7, r6\n\t"
  159461. #elif defined(__clang__)
  159462. "muls r6, r7\n\t"
  159463. #else
  159464. "mul r6, r7\n\t"
  159465. #endif
  159466. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159467. "lsrs r7, r6, #16\n\t"
  159468. #else
  159469. "lsr r7, r6, #16\n\t"
  159470. #endif
  159471. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159472. "lsls r6, r6, #16\n\t"
  159473. #else
  159474. "lsl r6, r6, #16\n\t"
  159475. #endif
  159476. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159477. "adds r4, r4, r6\n\t"
  159478. #else
  159479. "add r4, r4, r6\n\t"
  159480. #endif
  159481. #ifdef WOLFSSL_KEIL
  159482. "adcs r5, r5, r7\n\t"
  159483. #elif defined(__clang__)
  159484. "adcs r5, r7\n\t"
  159485. #else
  159486. "adc r5, r7\n\t"
  159487. #endif
  159488. #ifdef WOLFSSL_KEIL
  159489. "adcs r3, r3, %[r]\n\t"
  159490. #elif defined(__clang__)
  159491. "adcs r3, %[r]\n\t"
  159492. #else
  159493. "adc r3, %[r]\n\t"
  159494. #endif
  159495. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159496. "lsrs r6, %[a], #16\n\t"
  159497. #else
  159498. "lsr r6, %[a], #16\n\t"
  159499. #endif
  159500. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159501. "lsrs r7, %[b], #16\n\t"
  159502. #else
  159503. "lsr r7, %[b], #16\n\t"
  159504. #endif
  159505. #ifdef WOLFSSL_KEIL
  159506. "muls r7, r6, r7\n\t"
  159507. #elif defined(__clang__)
  159508. "muls r7, r6\n\t"
  159509. #else
  159510. "mul r7, r6\n\t"
  159511. #endif
  159512. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159513. "adds r5, r5, r7\n\t"
  159514. #else
  159515. "add r5, r5, r7\n\t"
  159516. #endif
  159517. #ifdef WOLFSSL_KEIL
  159518. "adcs r3, r3, %[r]\n\t"
  159519. #elif defined(__clang__)
  159520. "adcs r3, %[r]\n\t"
  159521. #else
  159522. "adc r3, %[r]\n\t"
  159523. #endif
  159524. "uxth r7, %[b]\n\t"
  159525. #ifdef WOLFSSL_KEIL
  159526. "muls r6, r7, r6\n\t"
  159527. #elif defined(__clang__)
  159528. "muls r6, r7\n\t"
  159529. #else
  159530. "mul r6, r7\n\t"
  159531. #endif
  159532. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159533. "lsrs r7, r6, #16\n\t"
  159534. #else
  159535. "lsr r7, r6, #16\n\t"
  159536. #endif
  159537. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159538. "lsls r6, r6, #16\n\t"
  159539. #else
  159540. "lsl r6, r6, #16\n\t"
  159541. #endif
  159542. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159543. "adds r4, r4, r6\n\t"
  159544. #else
  159545. "add r4, r4, r6\n\t"
  159546. #endif
  159547. #ifdef WOLFSSL_KEIL
  159548. "adcs r5, r5, r7\n\t"
  159549. #elif defined(__clang__)
  159550. "adcs r5, r7\n\t"
  159551. #else
  159552. "adc r5, r7\n\t"
  159553. #endif
  159554. #ifdef WOLFSSL_KEIL
  159555. "adcs r3, r3, %[r]\n\t"
  159556. #elif defined(__clang__)
  159557. "adcs r3, %[r]\n\t"
  159558. #else
  159559. "adc r3, %[r]\n\t"
  159560. #endif
  159561. "# A[5] * B[14]\n\t"
  159562. "mov %[a], r9\n\t"
  159563. "mov %[b], r10\n\t"
  159564. "ldr %[a], [%[a], #20]\n\t"
  159565. "ldr %[b], [%[b], #56]\n\t"
  159566. "uxth r6, %[a]\n\t"
  159567. "uxth r7, %[b]\n\t"
  159568. #ifdef WOLFSSL_KEIL
  159569. "muls r7, r6, r7\n\t"
  159570. #elif defined(__clang__)
  159571. "muls r7, r6\n\t"
  159572. #else
  159573. "mul r7, r6\n\t"
  159574. #endif
  159575. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159576. "adds r4, r4, r7\n\t"
  159577. #else
  159578. "add r4, r4, r7\n\t"
  159579. #endif
  159580. #ifdef WOLFSSL_KEIL
  159581. "adcs r5, r5, %[r]\n\t"
  159582. #elif defined(__clang__)
  159583. "adcs r5, %[r]\n\t"
  159584. #else
  159585. "adc r5, %[r]\n\t"
  159586. #endif
  159587. #ifdef WOLFSSL_KEIL
  159588. "adcs r3, r3, %[r]\n\t"
  159589. #elif defined(__clang__)
  159590. "adcs r3, %[r]\n\t"
  159591. #else
  159592. "adc r3, %[r]\n\t"
  159593. #endif
  159594. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159595. "lsrs r7, %[b], #16\n\t"
  159596. #else
  159597. "lsr r7, %[b], #16\n\t"
  159598. #endif
  159599. #ifdef WOLFSSL_KEIL
  159600. "muls r6, r7, r6\n\t"
  159601. #elif defined(__clang__)
  159602. "muls r6, r7\n\t"
  159603. #else
  159604. "mul r6, r7\n\t"
  159605. #endif
  159606. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159607. "lsrs r7, r6, #16\n\t"
  159608. #else
  159609. "lsr r7, r6, #16\n\t"
  159610. #endif
  159611. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159612. "lsls r6, r6, #16\n\t"
  159613. #else
  159614. "lsl r6, r6, #16\n\t"
  159615. #endif
  159616. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159617. "adds r4, r4, r6\n\t"
  159618. #else
  159619. "add r4, r4, r6\n\t"
  159620. #endif
  159621. #ifdef WOLFSSL_KEIL
  159622. "adcs r5, r5, r7\n\t"
  159623. #elif defined(__clang__)
  159624. "adcs r5, r7\n\t"
  159625. #else
  159626. "adc r5, r7\n\t"
  159627. #endif
  159628. #ifdef WOLFSSL_KEIL
  159629. "adcs r3, r3, %[r]\n\t"
  159630. #elif defined(__clang__)
  159631. "adcs r3, %[r]\n\t"
  159632. #else
  159633. "adc r3, %[r]\n\t"
  159634. #endif
  159635. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159636. "lsrs r6, %[a], #16\n\t"
  159637. #else
  159638. "lsr r6, %[a], #16\n\t"
  159639. #endif
  159640. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159641. "lsrs r7, %[b], #16\n\t"
  159642. #else
  159643. "lsr r7, %[b], #16\n\t"
  159644. #endif
  159645. #ifdef WOLFSSL_KEIL
  159646. "muls r7, r6, r7\n\t"
  159647. #elif defined(__clang__)
  159648. "muls r7, r6\n\t"
  159649. #else
  159650. "mul r7, r6\n\t"
  159651. #endif
  159652. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159653. "adds r5, r5, r7\n\t"
  159654. #else
  159655. "add r5, r5, r7\n\t"
  159656. #endif
  159657. #ifdef WOLFSSL_KEIL
  159658. "adcs r3, r3, %[r]\n\t"
  159659. #elif defined(__clang__)
  159660. "adcs r3, %[r]\n\t"
  159661. #else
  159662. "adc r3, %[r]\n\t"
  159663. #endif
  159664. "uxth r7, %[b]\n\t"
  159665. #ifdef WOLFSSL_KEIL
  159666. "muls r6, r7, r6\n\t"
  159667. #elif defined(__clang__)
  159668. "muls r6, r7\n\t"
  159669. #else
  159670. "mul r6, r7\n\t"
  159671. #endif
  159672. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159673. "lsrs r7, r6, #16\n\t"
  159674. #else
  159675. "lsr r7, r6, #16\n\t"
  159676. #endif
  159677. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159678. "lsls r6, r6, #16\n\t"
  159679. #else
  159680. "lsl r6, r6, #16\n\t"
  159681. #endif
  159682. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159683. "adds r4, r4, r6\n\t"
  159684. #else
  159685. "add r4, r4, r6\n\t"
  159686. #endif
  159687. #ifdef WOLFSSL_KEIL
  159688. "adcs r5, r5, r7\n\t"
  159689. #elif defined(__clang__)
  159690. "adcs r5, r7\n\t"
  159691. #else
  159692. "adc r5, r7\n\t"
  159693. #endif
  159694. #ifdef WOLFSSL_KEIL
  159695. "adcs r3, r3, %[r]\n\t"
  159696. #elif defined(__clang__)
  159697. "adcs r3, %[r]\n\t"
  159698. #else
  159699. "adc r3, %[r]\n\t"
  159700. #endif
  159701. "# A[6] * B[13]\n\t"
  159702. "mov %[a], r9\n\t"
  159703. "mov %[b], r10\n\t"
  159704. "ldr %[a], [%[a], #24]\n\t"
  159705. "ldr %[b], [%[b], #52]\n\t"
  159706. "uxth r6, %[a]\n\t"
  159707. "uxth r7, %[b]\n\t"
  159708. #ifdef WOLFSSL_KEIL
  159709. "muls r7, r6, r7\n\t"
  159710. #elif defined(__clang__)
  159711. "muls r7, r6\n\t"
  159712. #else
  159713. "mul r7, r6\n\t"
  159714. #endif
  159715. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159716. "adds r4, r4, r7\n\t"
  159717. #else
  159718. "add r4, r4, r7\n\t"
  159719. #endif
  159720. #ifdef WOLFSSL_KEIL
  159721. "adcs r5, r5, %[r]\n\t"
  159722. #elif defined(__clang__)
  159723. "adcs r5, %[r]\n\t"
  159724. #else
  159725. "adc r5, %[r]\n\t"
  159726. #endif
  159727. #ifdef WOLFSSL_KEIL
  159728. "adcs r3, r3, %[r]\n\t"
  159729. #elif defined(__clang__)
  159730. "adcs r3, %[r]\n\t"
  159731. #else
  159732. "adc r3, %[r]\n\t"
  159733. #endif
  159734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159735. "lsrs r7, %[b], #16\n\t"
  159736. #else
  159737. "lsr r7, %[b], #16\n\t"
  159738. #endif
  159739. #ifdef WOLFSSL_KEIL
  159740. "muls r6, r7, r6\n\t"
  159741. #elif defined(__clang__)
  159742. "muls r6, r7\n\t"
  159743. #else
  159744. "mul r6, r7\n\t"
  159745. #endif
  159746. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159747. "lsrs r7, r6, #16\n\t"
  159748. #else
  159749. "lsr r7, r6, #16\n\t"
  159750. #endif
  159751. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159752. "lsls r6, r6, #16\n\t"
  159753. #else
  159754. "lsl r6, r6, #16\n\t"
  159755. #endif
  159756. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159757. "adds r4, r4, r6\n\t"
  159758. #else
  159759. "add r4, r4, r6\n\t"
  159760. #endif
  159761. #ifdef WOLFSSL_KEIL
  159762. "adcs r5, r5, r7\n\t"
  159763. #elif defined(__clang__)
  159764. "adcs r5, r7\n\t"
  159765. #else
  159766. "adc r5, r7\n\t"
  159767. #endif
  159768. #ifdef WOLFSSL_KEIL
  159769. "adcs r3, r3, %[r]\n\t"
  159770. #elif defined(__clang__)
  159771. "adcs r3, %[r]\n\t"
  159772. #else
  159773. "adc r3, %[r]\n\t"
  159774. #endif
  159775. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159776. "lsrs r6, %[a], #16\n\t"
  159777. #else
  159778. "lsr r6, %[a], #16\n\t"
  159779. #endif
  159780. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159781. "lsrs r7, %[b], #16\n\t"
  159782. #else
  159783. "lsr r7, %[b], #16\n\t"
  159784. #endif
  159785. #ifdef WOLFSSL_KEIL
  159786. "muls r7, r6, r7\n\t"
  159787. #elif defined(__clang__)
  159788. "muls r7, r6\n\t"
  159789. #else
  159790. "mul r7, r6\n\t"
  159791. #endif
  159792. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159793. "adds r5, r5, r7\n\t"
  159794. #else
  159795. "add r5, r5, r7\n\t"
  159796. #endif
  159797. #ifdef WOLFSSL_KEIL
  159798. "adcs r3, r3, %[r]\n\t"
  159799. #elif defined(__clang__)
  159800. "adcs r3, %[r]\n\t"
  159801. #else
  159802. "adc r3, %[r]\n\t"
  159803. #endif
  159804. "uxth r7, %[b]\n\t"
  159805. #ifdef WOLFSSL_KEIL
  159806. "muls r6, r7, r6\n\t"
  159807. #elif defined(__clang__)
  159808. "muls r6, r7\n\t"
  159809. #else
  159810. "mul r6, r7\n\t"
  159811. #endif
  159812. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159813. "lsrs r7, r6, #16\n\t"
  159814. #else
  159815. "lsr r7, r6, #16\n\t"
  159816. #endif
  159817. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159818. "lsls r6, r6, #16\n\t"
  159819. #else
  159820. "lsl r6, r6, #16\n\t"
  159821. #endif
  159822. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159823. "adds r4, r4, r6\n\t"
  159824. #else
  159825. "add r4, r4, r6\n\t"
  159826. #endif
  159827. #ifdef WOLFSSL_KEIL
  159828. "adcs r5, r5, r7\n\t"
  159829. #elif defined(__clang__)
  159830. "adcs r5, r7\n\t"
  159831. #else
  159832. "adc r5, r7\n\t"
  159833. #endif
  159834. #ifdef WOLFSSL_KEIL
  159835. "adcs r3, r3, %[r]\n\t"
  159836. #elif defined(__clang__)
  159837. "adcs r3, %[r]\n\t"
  159838. #else
  159839. "adc r3, %[r]\n\t"
  159840. #endif
  159841. "# A[7] * B[12]\n\t"
  159842. "mov %[a], r9\n\t"
  159843. "mov %[b], r10\n\t"
  159844. "ldr %[a], [%[a], #28]\n\t"
  159845. "ldr %[b], [%[b], #48]\n\t"
  159846. "uxth r6, %[a]\n\t"
  159847. "uxth r7, %[b]\n\t"
  159848. #ifdef WOLFSSL_KEIL
  159849. "muls r7, r6, r7\n\t"
  159850. #elif defined(__clang__)
  159851. "muls r7, r6\n\t"
  159852. #else
  159853. "mul r7, r6\n\t"
  159854. #endif
  159855. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159856. "adds r4, r4, r7\n\t"
  159857. #else
  159858. "add r4, r4, r7\n\t"
  159859. #endif
  159860. #ifdef WOLFSSL_KEIL
  159861. "adcs r5, r5, %[r]\n\t"
  159862. #elif defined(__clang__)
  159863. "adcs r5, %[r]\n\t"
  159864. #else
  159865. "adc r5, %[r]\n\t"
  159866. #endif
  159867. #ifdef WOLFSSL_KEIL
  159868. "adcs r3, r3, %[r]\n\t"
  159869. #elif defined(__clang__)
  159870. "adcs r3, %[r]\n\t"
  159871. #else
  159872. "adc r3, %[r]\n\t"
  159873. #endif
  159874. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159875. "lsrs r7, %[b], #16\n\t"
  159876. #else
  159877. "lsr r7, %[b], #16\n\t"
  159878. #endif
  159879. #ifdef WOLFSSL_KEIL
  159880. "muls r6, r7, r6\n\t"
  159881. #elif defined(__clang__)
  159882. "muls r6, r7\n\t"
  159883. #else
  159884. "mul r6, r7\n\t"
  159885. #endif
  159886. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159887. "lsrs r7, r6, #16\n\t"
  159888. #else
  159889. "lsr r7, r6, #16\n\t"
  159890. #endif
  159891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159892. "lsls r6, r6, #16\n\t"
  159893. #else
  159894. "lsl r6, r6, #16\n\t"
  159895. #endif
  159896. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159897. "adds r4, r4, r6\n\t"
  159898. #else
  159899. "add r4, r4, r6\n\t"
  159900. #endif
  159901. #ifdef WOLFSSL_KEIL
  159902. "adcs r5, r5, r7\n\t"
  159903. #elif defined(__clang__)
  159904. "adcs r5, r7\n\t"
  159905. #else
  159906. "adc r5, r7\n\t"
  159907. #endif
  159908. #ifdef WOLFSSL_KEIL
  159909. "adcs r3, r3, %[r]\n\t"
  159910. #elif defined(__clang__)
  159911. "adcs r3, %[r]\n\t"
  159912. #else
  159913. "adc r3, %[r]\n\t"
  159914. #endif
  159915. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159916. "lsrs r6, %[a], #16\n\t"
  159917. #else
  159918. "lsr r6, %[a], #16\n\t"
  159919. #endif
  159920. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159921. "lsrs r7, %[b], #16\n\t"
  159922. #else
  159923. "lsr r7, %[b], #16\n\t"
  159924. #endif
  159925. #ifdef WOLFSSL_KEIL
  159926. "muls r7, r6, r7\n\t"
  159927. #elif defined(__clang__)
  159928. "muls r7, r6\n\t"
  159929. #else
  159930. "mul r7, r6\n\t"
  159931. #endif
  159932. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159933. "adds r5, r5, r7\n\t"
  159934. #else
  159935. "add r5, r5, r7\n\t"
  159936. #endif
  159937. #ifdef WOLFSSL_KEIL
  159938. "adcs r3, r3, %[r]\n\t"
  159939. #elif defined(__clang__)
  159940. "adcs r3, %[r]\n\t"
  159941. #else
  159942. "adc r3, %[r]\n\t"
  159943. #endif
  159944. "uxth r7, %[b]\n\t"
  159945. #ifdef WOLFSSL_KEIL
  159946. "muls r6, r7, r6\n\t"
  159947. #elif defined(__clang__)
  159948. "muls r6, r7\n\t"
  159949. #else
  159950. "mul r6, r7\n\t"
  159951. #endif
  159952. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159953. "lsrs r7, r6, #16\n\t"
  159954. #else
  159955. "lsr r7, r6, #16\n\t"
  159956. #endif
  159957. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159958. "lsls r6, r6, #16\n\t"
  159959. #else
  159960. "lsl r6, r6, #16\n\t"
  159961. #endif
  159962. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159963. "adds r4, r4, r6\n\t"
  159964. #else
  159965. "add r4, r4, r6\n\t"
  159966. #endif
  159967. #ifdef WOLFSSL_KEIL
  159968. "adcs r5, r5, r7\n\t"
  159969. #elif defined(__clang__)
  159970. "adcs r5, r7\n\t"
  159971. #else
  159972. "adc r5, r7\n\t"
  159973. #endif
  159974. #ifdef WOLFSSL_KEIL
  159975. "adcs r3, r3, %[r]\n\t"
  159976. #elif defined(__clang__)
  159977. "adcs r3, %[r]\n\t"
  159978. #else
  159979. "adc r3, %[r]\n\t"
  159980. #endif
  159981. "# A[8] * B[11]\n\t"
  159982. "mov %[a], r9\n\t"
  159983. "mov %[b], r10\n\t"
  159984. "ldr %[a], [%[a], #32]\n\t"
  159985. "ldr %[b], [%[b], #44]\n\t"
  159986. "uxth r6, %[a]\n\t"
  159987. "uxth r7, %[b]\n\t"
  159988. #ifdef WOLFSSL_KEIL
  159989. "muls r7, r6, r7\n\t"
  159990. #elif defined(__clang__)
  159991. "muls r7, r6\n\t"
  159992. #else
  159993. "mul r7, r6\n\t"
  159994. #endif
  159995. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159996. "adds r4, r4, r7\n\t"
  159997. #else
  159998. "add r4, r4, r7\n\t"
  159999. #endif
  160000. #ifdef WOLFSSL_KEIL
  160001. "adcs r5, r5, %[r]\n\t"
  160002. #elif defined(__clang__)
  160003. "adcs r5, %[r]\n\t"
  160004. #else
  160005. "adc r5, %[r]\n\t"
  160006. #endif
  160007. #ifdef WOLFSSL_KEIL
  160008. "adcs r3, r3, %[r]\n\t"
  160009. #elif defined(__clang__)
  160010. "adcs r3, %[r]\n\t"
  160011. #else
  160012. "adc r3, %[r]\n\t"
  160013. #endif
  160014. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160015. "lsrs r7, %[b], #16\n\t"
  160016. #else
  160017. "lsr r7, %[b], #16\n\t"
  160018. #endif
  160019. #ifdef WOLFSSL_KEIL
  160020. "muls r6, r7, r6\n\t"
  160021. #elif defined(__clang__)
  160022. "muls r6, r7\n\t"
  160023. #else
  160024. "mul r6, r7\n\t"
  160025. #endif
  160026. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160027. "lsrs r7, r6, #16\n\t"
  160028. #else
  160029. "lsr r7, r6, #16\n\t"
  160030. #endif
  160031. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160032. "lsls r6, r6, #16\n\t"
  160033. #else
  160034. "lsl r6, r6, #16\n\t"
  160035. #endif
  160036. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160037. "adds r4, r4, r6\n\t"
  160038. #else
  160039. "add r4, r4, r6\n\t"
  160040. #endif
  160041. #ifdef WOLFSSL_KEIL
  160042. "adcs r5, r5, r7\n\t"
  160043. #elif defined(__clang__)
  160044. "adcs r5, r7\n\t"
  160045. #else
  160046. "adc r5, r7\n\t"
  160047. #endif
  160048. #ifdef WOLFSSL_KEIL
  160049. "adcs r3, r3, %[r]\n\t"
  160050. #elif defined(__clang__)
  160051. "adcs r3, %[r]\n\t"
  160052. #else
  160053. "adc r3, %[r]\n\t"
  160054. #endif
  160055. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160056. "lsrs r6, %[a], #16\n\t"
  160057. #else
  160058. "lsr r6, %[a], #16\n\t"
  160059. #endif
  160060. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160061. "lsrs r7, %[b], #16\n\t"
  160062. #else
  160063. "lsr r7, %[b], #16\n\t"
  160064. #endif
  160065. #ifdef WOLFSSL_KEIL
  160066. "muls r7, r6, r7\n\t"
  160067. #elif defined(__clang__)
  160068. "muls r7, r6\n\t"
  160069. #else
  160070. "mul r7, r6\n\t"
  160071. #endif
  160072. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160073. "adds r5, r5, r7\n\t"
  160074. #else
  160075. "add r5, r5, r7\n\t"
  160076. #endif
  160077. #ifdef WOLFSSL_KEIL
  160078. "adcs r3, r3, %[r]\n\t"
  160079. #elif defined(__clang__)
  160080. "adcs r3, %[r]\n\t"
  160081. #else
  160082. "adc r3, %[r]\n\t"
  160083. #endif
  160084. "uxth r7, %[b]\n\t"
  160085. #ifdef WOLFSSL_KEIL
  160086. "muls r6, r7, r6\n\t"
  160087. #elif defined(__clang__)
  160088. "muls r6, r7\n\t"
  160089. #else
  160090. "mul r6, r7\n\t"
  160091. #endif
  160092. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160093. "lsrs r7, r6, #16\n\t"
  160094. #else
  160095. "lsr r7, r6, #16\n\t"
  160096. #endif
  160097. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160098. "lsls r6, r6, #16\n\t"
  160099. #else
  160100. "lsl r6, r6, #16\n\t"
  160101. #endif
  160102. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160103. "adds r4, r4, r6\n\t"
  160104. #else
  160105. "add r4, r4, r6\n\t"
  160106. #endif
  160107. #ifdef WOLFSSL_KEIL
  160108. "adcs r5, r5, r7\n\t"
  160109. #elif defined(__clang__)
  160110. "adcs r5, r7\n\t"
  160111. #else
  160112. "adc r5, r7\n\t"
  160113. #endif
  160114. #ifdef WOLFSSL_KEIL
  160115. "adcs r3, r3, %[r]\n\t"
  160116. #elif defined(__clang__)
  160117. "adcs r3, %[r]\n\t"
  160118. #else
  160119. "adc r3, %[r]\n\t"
  160120. #endif
  160121. "# A[9] * B[10]\n\t"
  160122. "mov %[a], r9\n\t"
  160123. "mov %[b], r10\n\t"
  160124. "ldr %[a], [%[a], #36]\n\t"
  160125. "ldr %[b], [%[b], #40]\n\t"
  160126. "uxth r6, %[a]\n\t"
  160127. "uxth r7, %[b]\n\t"
  160128. #ifdef WOLFSSL_KEIL
  160129. "muls r7, r6, r7\n\t"
  160130. #elif defined(__clang__)
  160131. "muls r7, r6\n\t"
  160132. #else
  160133. "mul r7, r6\n\t"
  160134. #endif
  160135. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160136. "adds r4, r4, r7\n\t"
  160137. #else
  160138. "add r4, r4, r7\n\t"
  160139. #endif
  160140. #ifdef WOLFSSL_KEIL
  160141. "adcs r5, r5, %[r]\n\t"
  160142. #elif defined(__clang__)
  160143. "adcs r5, %[r]\n\t"
  160144. #else
  160145. "adc r5, %[r]\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 r7, %[b], #16\n\t"
  160156. #else
  160157. "lsr r7, %[b], #16\n\t"
  160158. #endif
  160159. #ifdef WOLFSSL_KEIL
  160160. "muls r6, r7, r6\n\t"
  160161. #elif defined(__clang__)
  160162. "muls r6, r7\n\t"
  160163. #else
  160164. "mul r6, r7\n\t"
  160165. #endif
  160166. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160167. "lsrs r7, r6, #16\n\t"
  160168. #else
  160169. "lsr r7, r6, #16\n\t"
  160170. #endif
  160171. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160172. "lsls r6, r6, #16\n\t"
  160173. #else
  160174. "lsl r6, r6, #16\n\t"
  160175. #endif
  160176. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160177. "adds r4, r4, r6\n\t"
  160178. #else
  160179. "add r4, r4, r6\n\t"
  160180. #endif
  160181. #ifdef WOLFSSL_KEIL
  160182. "adcs r5, r5, r7\n\t"
  160183. #elif defined(__clang__)
  160184. "adcs r5, r7\n\t"
  160185. #else
  160186. "adc r5, r7\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. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160196. "lsrs r6, %[a], #16\n\t"
  160197. #else
  160198. "lsr r6, %[a], #16\n\t"
  160199. #endif
  160200. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160201. "lsrs r7, %[b], #16\n\t"
  160202. #else
  160203. "lsr r7, %[b], #16\n\t"
  160204. #endif
  160205. #ifdef WOLFSSL_KEIL
  160206. "muls r7, r6, r7\n\t"
  160207. #elif defined(__clang__)
  160208. "muls r7, r6\n\t"
  160209. #else
  160210. "mul r7, r6\n\t"
  160211. #endif
  160212. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160213. "adds r5, r5, r7\n\t"
  160214. #else
  160215. "add r5, r5, r7\n\t"
  160216. #endif
  160217. #ifdef WOLFSSL_KEIL
  160218. "adcs r3, r3, %[r]\n\t"
  160219. #elif defined(__clang__)
  160220. "adcs r3, %[r]\n\t"
  160221. #else
  160222. "adc r3, %[r]\n\t"
  160223. #endif
  160224. "uxth r7, %[b]\n\t"
  160225. #ifdef WOLFSSL_KEIL
  160226. "muls r6, r7, r6\n\t"
  160227. #elif defined(__clang__)
  160228. "muls r6, r7\n\t"
  160229. #else
  160230. "mul r6, r7\n\t"
  160231. #endif
  160232. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160233. "lsrs r7, r6, #16\n\t"
  160234. #else
  160235. "lsr r7, r6, #16\n\t"
  160236. #endif
  160237. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160238. "lsls r6, r6, #16\n\t"
  160239. #else
  160240. "lsl r6, r6, #16\n\t"
  160241. #endif
  160242. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160243. "adds r4, r4, r6\n\t"
  160244. #else
  160245. "add r4, r4, r6\n\t"
  160246. #endif
  160247. #ifdef WOLFSSL_KEIL
  160248. "adcs r5, r5, r7\n\t"
  160249. #elif defined(__clang__)
  160250. "adcs r5, r7\n\t"
  160251. #else
  160252. "adc r5, r7\n\t"
  160253. #endif
  160254. #ifdef WOLFSSL_KEIL
  160255. "adcs r3, r3, %[r]\n\t"
  160256. #elif defined(__clang__)
  160257. "adcs r3, %[r]\n\t"
  160258. #else
  160259. "adc r3, %[r]\n\t"
  160260. #endif
  160261. "# A[10] * B[9]\n\t"
  160262. "mov %[a], r9\n\t"
  160263. "mov %[b], r10\n\t"
  160264. "ldr %[a], [%[a], #40]\n\t"
  160265. "ldr %[b], [%[b], #36]\n\t"
  160266. "uxth r6, %[a]\n\t"
  160267. "uxth r7, %[b]\n\t"
  160268. #ifdef WOLFSSL_KEIL
  160269. "muls r7, r6, r7\n\t"
  160270. #elif defined(__clang__)
  160271. "muls r7, r6\n\t"
  160272. #else
  160273. "mul r7, r6\n\t"
  160274. #endif
  160275. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160276. "adds r4, r4, r7\n\t"
  160277. #else
  160278. "add r4, r4, r7\n\t"
  160279. #endif
  160280. #ifdef WOLFSSL_KEIL
  160281. "adcs r5, r5, %[r]\n\t"
  160282. #elif defined(__clang__)
  160283. "adcs r5, %[r]\n\t"
  160284. #else
  160285. "adc r5, %[r]\n\t"
  160286. #endif
  160287. #ifdef WOLFSSL_KEIL
  160288. "adcs r3, r3, %[r]\n\t"
  160289. #elif defined(__clang__)
  160290. "adcs r3, %[r]\n\t"
  160291. #else
  160292. "adc r3, %[r]\n\t"
  160293. #endif
  160294. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160295. "lsrs r7, %[b], #16\n\t"
  160296. #else
  160297. "lsr r7, %[b], #16\n\t"
  160298. #endif
  160299. #ifdef WOLFSSL_KEIL
  160300. "muls r6, r7, r6\n\t"
  160301. #elif defined(__clang__)
  160302. "muls r6, r7\n\t"
  160303. #else
  160304. "mul r6, r7\n\t"
  160305. #endif
  160306. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160307. "lsrs r7, r6, #16\n\t"
  160308. #else
  160309. "lsr r7, r6, #16\n\t"
  160310. #endif
  160311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160312. "lsls r6, r6, #16\n\t"
  160313. #else
  160314. "lsl r6, r6, #16\n\t"
  160315. #endif
  160316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160317. "adds r4, r4, r6\n\t"
  160318. #else
  160319. "add r4, r4, r6\n\t"
  160320. #endif
  160321. #ifdef WOLFSSL_KEIL
  160322. "adcs r5, r5, r7\n\t"
  160323. #elif defined(__clang__)
  160324. "adcs r5, r7\n\t"
  160325. #else
  160326. "adc r5, r7\n\t"
  160327. #endif
  160328. #ifdef WOLFSSL_KEIL
  160329. "adcs r3, r3, %[r]\n\t"
  160330. #elif defined(__clang__)
  160331. "adcs r3, %[r]\n\t"
  160332. #else
  160333. "adc r3, %[r]\n\t"
  160334. #endif
  160335. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160336. "lsrs r6, %[a], #16\n\t"
  160337. #else
  160338. "lsr r6, %[a], #16\n\t"
  160339. #endif
  160340. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160341. "lsrs r7, %[b], #16\n\t"
  160342. #else
  160343. "lsr r7, %[b], #16\n\t"
  160344. #endif
  160345. #ifdef WOLFSSL_KEIL
  160346. "muls r7, r6, r7\n\t"
  160347. #elif defined(__clang__)
  160348. "muls r7, r6\n\t"
  160349. #else
  160350. "mul r7, r6\n\t"
  160351. #endif
  160352. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160353. "adds r5, r5, r7\n\t"
  160354. #else
  160355. "add r5, r5, r7\n\t"
  160356. #endif
  160357. #ifdef WOLFSSL_KEIL
  160358. "adcs r3, r3, %[r]\n\t"
  160359. #elif defined(__clang__)
  160360. "adcs r3, %[r]\n\t"
  160361. #else
  160362. "adc r3, %[r]\n\t"
  160363. #endif
  160364. "uxth r7, %[b]\n\t"
  160365. #ifdef WOLFSSL_KEIL
  160366. "muls r6, r7, r6\n\t"
  160367. #elif defined(__clang__)
  160368. "muls r6, r7\n\t"
  160369. #else
  160370. "mul r6, r7\n\t"
  160371. #endif
  160372. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160373. "lsrs r7, r6, #16\n\t"
  160374. #else
  160375. "lsr r7, r6, #16\n\t"
  160376. #endif
  160377. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160378. "lsls r6, r6, #16\n\t"
  160379. #else
  160380. "lsl r6, r6, #16\n\t"
  160381. #endif
  160382. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160383. "adds r4, r4, r6\n\t"
  160384. #else
  160385. "add r4, r4, r6\n\t"
  160386. #endif
  160387. #ifdef WOLFSSL_KEIL
  160388. "adcs r5, r5, r7\n\t"
  160389. #elif defined(__clang__)
  160390. "adcs r5, r7\n\t"
  160391. #else
  160392. "adc r5, r7\n\t"
  160393. #endif
  160394. #ifdef WOLFSSL_KEIL
  160395. "adcs r3, r3, %[r]\n\t"
  160396. #elif defined(__clang__)
  160397. "adcs r3, %[r]\n\t"
  160398. #else
  160399. "adc r3, %[r]\n\t"
  160400. #endif
  160401. "# A[11] * B[8]\n\t"
  160402. "mov %[a], r9\n\t"
  160403. "mov %[b], r10\n\t"
  160404. "ldr %[a], [%[a], #44]\n\t"
  160405. "ldr %[b], [%[b], #32]\n\t"
  160406. "uxth r6, %[a]\n\t"
  160407. "uxth r7, %[b]\n\t"
  160408. #ifdef WOLFSSL_KEIL
  160409. "muls r7, r6, r7\n\t"
  160410. #elif defined(__clang__)
  160411. "muls r7, r6\n\t"
  160412. #else
  160413. "mul r7, r6\n\t"
  160414. #endif
  160415. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160416. "adds r4, r4, r7\n\t"
  160417. #else
  160418. "add r4, r4, r7\n\t"
  160419. #endif
  160420. #ifdef WOLFSSL_KEIL
  160421. "adcs r5, r5, %[r]\n\t"
  160422. #elif defined(__clang__)
  160423. "adcs r5, %[r]\n\t"
  160424. #else
  160425. "adc r5, %[r]\n\t"
  160426. #endif
  160427. #ifdef WOLFSSL_KEIL
  160428. "adcs r3, r3, %[r]\n\t"
  160429. #elif defined(__clang__)
  160430. "adcs r3, %[r]\n\t"
  160431. #else
  160432. "adc r3, %[r]\n\t"
  160433. #endif
  160434. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160435. "lsrs r7, %[b], #16\n\t"
  160436. #else
  160437. "lsr r7, %[b], #16\n\t"
  160438. #endif
  160439. #ifdef WOLFSSL_KEIL
  160440. "muls r6, r7, r6\n\t"
  160441. #elif defined(__clang__)
  160442. "muls r6, r7\n\t"
  160443. #else
  160444. "mul r6, r7\n\t"
  160445. #endif
  160446. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160447. "lsrs r7, r6, #16\n\t"
  160448. #else
  160449. "lsr r7, r6, #16\n\t"
  160450. #endif
  160451. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160452. "lsls r6, r6, #16\n\t"
  160453. #else
  160454. "lsl r6, r6, #16\n\t"
  160455. #endif
  160456. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160457. "adds r4, r4, r6\n\t"
  160458. #else
  160459. "add r4, r4, r6\n\t"
  160460. #endif
  160461. #ifdef WOLFSSL_KEIL
  160462. "adcs r5, r5, r7\n\t"
  160463. #elif defined(__clang__)
  160464. "adcs r5, r7\n\t"
  160465. #else
  160466. "adc r5, r7\n\t"
  160467. #endif
  160468. #ifdef WOLFSSL_KEIL
  160469. "adcs r3, r3, %[r]\n\t"
  160470. #elif defined(__clang__)
  160471. "adcs r3, %[r]\n\t"
  160472. #else
  160473. "adc r3, %[r]\n\t"
  160474. #endif
  160475. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160476. "lsrs r6, %[a], #16\n\t"
  160477. #else
  160478. "lsr r6, %[a], #16\n\t"
  160479. #endif
  160480. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160481. "lsrs r7, %[b], #16\n\t"
  160482. #else
  160483. "lsr r7, %[b], #16\n\t"
  160484. #endif
  160485. #ifdef WOLFSSL_KEIL
  160486. "muls r7, r6, r7\n\t"
  160487. #elif defined(__clang__)
  160488. "muls r7, r6\n\t"
  160489. #else
  160490. "mul r7, r6\n\t"
  160491. #endif
  160492. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160493. "adds r5, r5, r7\n\t"
  160494. #else
  160495. "add r5, r5, r7\n\t"
  160496. #endif
  160497. #ifdef WOLFSSL_KEIL
  160498. "adcs r3, r3, %[r]\n\t"
  160499. #elif defined(__clang__)
  160500. "adcs r3, %[r]\n\t"
  160501. #else
  160502. "adc r3, %[r]\n\t"
  160503. #endif
  160504. "uxth r7, %[b]\n\t"
  160505. #ifdef WOLFSSL_KEIL
  160506. "muls r6, r7, r6\n\t"
  160507. #elif defined(__clang__)
  160508. "muls r6, r7\n\t"
  160509. #else
  160510. "mul r6, r7\n\t"
  160511. #endif
  160512. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160513. "lsrs r7, r6, #16\n\t"
  160514. #else
  160515. "lsr r7, r6, #16\n\t"
  160516. #endif
  160517. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160518. "lsls r6, r6, #16\n\t"
  160519. #else
  160520. "lsl r6, r6, #16\n\t"
  160521. #endif
  160522. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160523. "adds r4, r4, r6\n\t"
  160524. #else
  160525. "add r4, r4, r6\n\t"
  160526. #endif
  160527. #ifdef WOLFSSL_KEIL
  160528. "adcs r5, r5, r7\n\t"
  160529. #elif defined(__clang__)
  160530. "adcs r5, r7\n\t"
  160531. #else
  160532. "adc r5, r7\n\t"
  160533. #endif
  160534. #ifdef WOLFSSL_KEIL
  160535. "adcs r3, r3, %[r]\n\t"
  160536. #elif defined(__clang__)
  160537. "adcs r3, %[r]\n\t"
  160538. #else
  160539. "adc r3, %[r]\n\t"
  160540. #endif
  160541. "# A[12] * B[7]\n\t"
  160542. "mov %[a], r9\n\t"
  160543. "mov %[b], r10\n\t"
  160544. "ldr %[a], [%[a], #48]\n\t"
  160545. "ldr %[b], [%[b], #28]\n\t"
  160546. "uxth r6, %[a]\n\t"
  160547. "uxth r7, %[b]\n\t"
  160548. #ifdef WOLFSSL_KEIL
  160549. "muls r7, r6, r7\n\t"
  160550. #elif defined(__clang__)
  160551. "muls r7, r6\n\t"
  160552. #else
  160553. "mul r7, r6\n\t"
  160554. #endif
  160555. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160556. "adds r4, r4, r7\n\t"
  160557. #else
  160558. "add r4, r4, r7\n\t"
  160559. #endif
  160560. #ifdef WOLFSSL_KEIL
  160561. "adcs r5, r5, %[r]\n\t"
  160562. #elif defined(__clang__)
  160563. "adcs r5, %[r]\n\t"
  160564. #else
  160565. "adc r5, %[r]\n\t"
  160566. #endif
  160567. #ifdef WOLFSSL_KEIL
  160568. "adcs r3, r3, %[r]\n\t"
  160569. #elif defined(__clang__)
  160570. "adcs r3, %[r]\n\t"
  160571. #else
  160572. "adc r3, %[r]\n\t"
  160573. #endif
  160574. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160575. "lsrs r7, %[b], #16\n\t"
  160576. #else
  160577. "lsr r7, %[b], #16\n\t"
  160578. #endif
  160579. #ifdef WOLFSSL_KEIL
  160580. "muls r6, r7, r6\n\t"
  160581. #elif defined(__clang__)
  160582. "muls r6, r7\n\t"
  160583. #else
  160584. "mul r6, r7\n\t"
  160585. #endif
  160586. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160587. "lsrs r7, r6, #16\n\t"
  160588. #else
  160589. "lsr r7, r6, #16\n\t"
  160590. #endif
  160591. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160592. "lsls r6, r6, #16\n\t"
  160593. #else
  160594. "lsl r6, r6, #16\n\t"
  160595. #endif
  160596. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160597. "adds r4, r4, r6\n\t"
  160598. #else
  160599. "add r4, r4, r6\n\t"
  160600. #endif
  160601. #ifdef WOLFSSL_KEIL
  160602. "adcs r5, r5, r7\n\t"
  160603. #elif defined(__clang__)
  160604. "adcs r5, r7\n\t"
  160605. #else
  160606. "adc r5, r7\n\t"
  160607. #endif
  160608. #ifdef WOLFSSL_KEIL
  160609. "adcs r3, r3, %[r]\n\t"
  160610. #elif defined(__clang__)
  160611. "adcs r3, %[r]\n\t"
  160612. #else
  160613. "adc r3, %[r]\n\t"
  160614. #endif
  160615. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160616. "lsrs r6, %[a], #16\n\t"
  160617. #else
  160618. "lsr r6, %[a], #16\n\t"
  160619. #endif
  160620. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160621. "lsrs r7, %[b], #16\n\t"
  160622. #else
  160623. "lsr r7, %[b], #16\n\t"
  160624. #endif
  160625. #ifdef WOLFSSL_KEIL
  160626. "muls r7, r6, r7\n\t"
  160627. #elif defined(__clang__)
  160628. "muls r7, r6\n\t"
  160629. #else
  160630. "mul r7, r6\n\t"
  160631. #endif
  160632. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160633. "adds r5, r5, r7\n\t"
  160634. #else
  160635. "add r5, r5, r7\n\t"
  160636. #endif
  160637. #ifdef WOLFSSL_KEIL
  160638. "adcs r3, r3, %[r]\n\t"
  160639. #elif defined(__clang__)
  160640. "adcs r3, %[r]\n\t"
  160641. #else
  160642. "adc r3, %[r]\n\t"
  160643. #endif
  160644. "uxth r7, %[b]\n\t"
  160645. #ifdef WOLFSSL_KEIL
  160646. "muls r6, r7, r6\n\t"
  160647. #elif defined(__clang__)
  160648. "muls r6, r7\n\t"
  160649. #else
  160650. "mul r6, r7\n\t"
  160651. #endif
  160652. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160653. "lsrs r7, r6, #16\n\t"
  160654. #else
  160655. "lsr r7, r6, #16\n\t"
  160656. #endif
  160657. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160658. "lsls r6, r6, #16\n\t"
  160659. #else
  160660. "lsl r6, r6, #16\n\t"
  160661. #endif
  160662. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160663. "adds r4, r4, r6\n\t"
  160664. #else
  160665. "add r4, r4, r6\n\t"
  160666. #endif
  160667. #ifdef WOLFSSL_KEIL
  160668. "adcs r5, r5, r7\n\t"
  160669. #elif defined(__clang__)
  160670. "adcs r5, r7\n\t"
  160671. #else
  160672. "adc r5, r7\n\t"
  160673. #endif
  160674. #ifdef WOLFSSL_KEIL
  160675. "adcs r3, r3, %[r]\n\t"
  160676. #elif defined(__clang__)
  160677. "adcs r3, %[r]\n\t"
  160678. #else
  160679. "adc r3, %[r]\n\t"
  160680. #endif
  160681. "# A[13] * B[6]\n\t"
  160682. "mov %[a], r9\n\t"
  160683. "mov %[b], r10\n\t"
  160684. "ldr %[a], [%[a], #52]\n\t"
  160685. "ldr %[b], [%[b], #24]\n\t"
  160686. "uxth r6, %[a]\n\t"
  160687. "uxth r7, %[b]\n\t"
  160688. #ifdef WOLFSSL_KEIL
  160689. "muls r7, r6, r7\n\t"
  160690. #elif defined(__clang__)
  160691. "muls r7, r6\n\t"
  160692. #else
  160693. "mul r7, r6\n\t"
  160694. #endif
  160695. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160696. "adds r4, r4, r7\n\t"
  160697. #else
  160698. "add r4, r4, r7\n\t"
  160699. #endif
  160700. #ifdef WOLFSSL_KEIL
  160701. "adcs r5, r5, %[r]\n\t"
  160702. #elif defined(__clang__)
  160703. "adcs r5, %[r]\n\t"
  160704. #else
  160705. "adc r5, %[r]\n\t"
  160706. #endif
  160707. #ifdef WOLFSSL_KEIL
  160708. "adcs r3, r3, %[r]\n\t"
  160709. #elif defined(__clang__)
  160710. "adcs r3, %[r]\n\t"
  160711. #else
  160712. "adc r3, %[r]\n\t"
  160713. #endif
  160714. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160715. "lsrs r7, %[b], #16\n\t"
  160716. #else
  160717. "lsr r7, %[b], #16\n\t"
  160718. #endif
  160719. #ifdef WOLFSSL_KEIL
  160720. "muls r6, r7, r6\n\t"
  160721. #elif defined(__clang__)
  160722. "muls r6, r7\n\t"
  160723. #else
  160724. "mul r6, r7\n\t"
  160725. #endif
  160726. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160727. "lsrs r7, r6, #16\n\t"
  160728. #else
  160729. "lsr r7, r6, #16\n\t"
  160730. #endif
  160731. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160732. "lsls r6, r6, #16\n\t"
  160733. #else
  160734. "lsl r6, r6, #16\n\t"
  160735. #endif
  160736. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160737. "adds r4, r4, r6\n\t"
  160738. #else
  160739. "add r4, r4, r6\n\t"
  160740. #endif
  160741. #ifdef WOLFSSL_KEIL
  160742. "adcs r5, r5, r7\n\t"
  160743. #elif defined(__clang__)
  160744. "adcs r5, r7\n\t"
  160745. #else
  160746. "adc r5, r7\n\t"
  160747. #endif
  160748. #ifdef WOLFSSL_KEIL
  160749. "adcs r3, r3, %[r]\n\t"
  160750. #elif defined(__clang__)
  160751. "adcs r3, %[r]\n\t"
  160752. #else
  160753. "adc r3, %[r]\n\t"
  160754. #endif
  160755. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160756. "lsrs r6, %[a], #16\n\t"
  160757. #else
  160758. "lsr r6, %[a], #16\n\t"
  160759. #endif
  160760. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160761. "lsrs r7, %[b], #16\n\t"
  160762. #else
  160763. "lsr r7, %[b], #16\n\t"
  160764. #endif
  160765. #ifdef WOLFSSL_KEIL
  160766. "muls r7, r6, r7\n\t"
  160767. #elif defined(__clang__)
  160768. "muls r7, r6\n\t"
  160769. #else
  160770. "mul r7, r6\n\t"
  160771. #endif
  160772. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160773. "adds r5, r5, r7\n\t"
  160774. #else
  160775. "add r5, r5, r7\n\t"
  160776. #endif
  160777. #ifdef WOLFSSL_KEIL
  160778. "adcs r3, r3, %[r]\n\t"
  160779. #elif defined(__clang__)
  160780. "adcs r3, %[r]\n\t"
  160781. #else
  160782. "adc r3, %[r]\n\t"
  160783. #endif
  160784. "uxth r7, %[b]\n\t"
  160785. #ifdef WOLFSSL_KEIL
  160786. "muls r6, r7, r6\n\t"
  160787. #elif defined(__clang__)
  160788. "muls r6, r7\n\t"
  160789. #else
  160790. "mul r6, r7\n\t"
  160791. #endif
  160792. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160793. "lsrs r7, r6, #16\n\t"
  160794. #else
  160795. "lsr r7, r6, #16\n\t"
  160796. #endif
  160797. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160798. "lsls r6, r6, #16\n\t"
  160799. #else
  160800. "lsl r6, r6, #16\n\t"
  160801. #endif
  160802. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160803. "adds r4, r4, r6\n\t"
  160804. #else
  160805. "add r4, r4, r6\n\t"
  160806. #endif
  160807. #ifdef WOLFSSL_KEIL
  160808. "adcs r5, r5, r7\n\t"
  160809. #elif defined(__clang__)
  160810. "adcs r5, r7\n\t"
  160811. #else
  160812. "adc r5, r7\n\t"
  160813. #endif
  160814. #ifdef WOLFSSL_KEIL
  160815. "adcs r3, r3, %[r]\n\t"
  160816. #elif defined(__clang__)
  160817. "adcs r3, %[r]\n\t"
  160818. #else
  160819. "adc r3, %[r]\n\t"
  160820. #endif
  160821. "# A[14] * B[5]\n\t"
  160822. "mov %[a], r9\n\t"
  160823. "mov %[b], r10\n\t"
  160824. "ldr %[a], [%[a], #56]\n\t"
  160825. "ldr %[b], [%[b], #20]\n\t"
  160826. "uxth r6, %[a]\n\t"
  160827. "uxth r7, %[b]\n\t"
  160828. #ifdef WOLFSSL_KEIL
  160829. "muls r7, r6, r7\n\t"
  160830. #elif defined(__clang__)
  160831. "muls r7, r6\n\t"
  160832. #else
  160833. "mul r7, r6\n\t"
  160834. #endif
  160835. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160836. "adds r4, r4, r7\n\t"
  160837. #else
  160838. "add r4, r4, r7\n\t"
  160839. #endif
  160840. #ifdef WOLFSSL_KEIL
  160841. "adcs r5, r5, %[r]\n\t"
  160842. #elif defined(__clang__)
  160843. "adcs r5, %[r]\n\t"
  160844. #else
  160845. "adc r5, %[r]\n\t"
  160846. #endif
  160847. #ifdef WOLFSSL_KEIL
  160848. "adcs r3, r3, %[r]\n\t"
  160849. #elif defined(__clang__)
  160850. "adcs r3, %[r]\n\t"
  160851. #else
  160852. "adc r3, %[r]\n\t"
  160853. #endif
  160854. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160855. "lsrs r7, %[b], #16\n\t"
  160856. #else
  160857. "lsr r7, %[b], #16\n\t"
  160858. #endif
  160859. #ifdef WOLFSSL_KEIL
  160860. "muls r6, r7, r6\n\t"
  160861. #elif defined(__clang__)
  160862. "muls r6, r7\n\t"
  160863. #else
  160864. "mul r6, r7\n\t"
  160865. #endif
  160866. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160867. "lsrs r7, r6, #16\n\t"
  160868. #else
  160869. "lsr r7, r6, #16\n\t"
  160870. #endif
  160871. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160872. "lsls r6, r6, #16\n\t"
  160873. #else
  160874. "lsl r6, r6, #16\n\t"
  160875. #endif
  160876. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160877. "adds r4, r4, r6\n\t"
  160878. #else
  160879. "add r4, r4, r6\n\t"
  160880. #endif
  160881. #ifdef WOLFSSL_KEIL
  160882. "adcs r5, r5, r7\n\t"
  160883. #elif defined(__clang__)
  160884. "adcs r5, r7\n\t"
  160885. #else
  160886. "adc r5, r7\n\t"
  160887. #endif
  160888. #ifdef WOLFSSL_KEIL
  160889. "adcs r3, r3, %[r]\n\t"
  160890. #elif defined(__clang__)
  160891. "adcs r3, %[r]\n\t"
  160892. #else
  160893. "adc r3, %[r]\n\t"
  160894. #endif
  160895. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160896. "lsrs r6, %[a], #16\n\t"
  160897. #else
  160898. "lsr r6, %[a], #16\n\t"
  160899. #endif
  160900. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160901. "lsrs r7, %[b], #16\n\t"
  160902. #else
  160903. "lsr r7, %[b], #16\n\t"
  160904. #endif
  160905. #ifdef WOLFSSL_KEIL
  160906. "muls r7, r6, r7\n\t"
  160907. #elif defined(__clang__)
  160908. "muls r7, r6\n\t"
  160909. #else
  160910. "mul r7, r6\n\t"
  160911. #endif
  160912. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160913. "adds r5, r5, r7\n\t"
  160914. #else
  160915. "add r5, r5, r7\n\t"
  160916. #endif
  160917. #ifdef WOLFSSL_KEIL
  160918. "adcs r3, r3, %[r]\n\t"
  160919. #elif defined(__clang__)
  160920. "adcs r3, %[r]\n\t"
  160921. #else
  160922. "adc r3, %[r]\n\t"
  160923. #endif
  160924. "uxth r7, %[b]\n\t"
  160925. #ifdef WOLFSSL_KEIL
  160926. "muls r6, r7, r6\n\t"
  160927. #elif defined(__clang__)
  160928. "muls r6, r7\n\t"
  160929. #else
  160930. "mul r6, r7\n\t"
  160931. #endif
  160932. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160933. "lsrs r7, r6, #16\n\t"
  160934. #else
  160935. "lsr r7, r6, #16\n\t"
  160936. #endif
  160937. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160938. "lsls r6, r6, #16\n\t"
  160939. #else
  160940. "lsl r6, r6, #16\n\t"
  160941. #endif
  160942. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160943. "adds r4, r4, r6\n\t"
  160944. #else
  160945. "add r4, r4, r6\n\t"
  160946. #endif
  160947. #ifdef WOLFSSL_KEIL
  160948. "adcs r5, r5, r7\n\t"
  160949. #elif defined(__clang__)
  160950. "adcs r5, r7\n\t"
  160951. #else
  160952. "adc r5, r7\n\t"
  160953. #endif
  160954. #ifdef WOLFSSL_KEIL
  160955. "adcs r3, r3, %[r]\n\t"
  160956. #elif defined(__clang__)
  160957. "adcs r3, %[r]\n\t"
  160958. #else
  160959. "adc r3, %[r]\n\t"
  160960. #endif
  160961. "# A[15] * B[4]\n\t"
  160962. "mov %[a], r9\n\t"
  160963. "mov %[b], r10\n\t"
  160964. "ldr %[a], [%[a], #60]\n\t"
  160965. "ldr %[b], [%[b], #16]\n\t"
  160966. "uxth r6, %[a]\n\t"
  160967. "uxth r7, %[b]\n\t"
  160968. #ifdef WOLFSSL_KEIL
  160969. "muls r7, r6, r7\n\t"
  160970. #elif defined(__clang__)
  160971. "muls r7, r6\n\t"
  160972. #else
  160973. "mul r7, r6\n\t"
  160974. #endif
  160975. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160976. "adds r4, r4, r7\n\t"
  160977. #else
  160978. "add r4, r4, r7\n\t"
  160979. #endif
  160980. #ifdef WOLFSSL_KEIL
  160981. "adcs r5, r5, %[r]\n\t"
  160982. #elif defined(__clang__)
  160983. "adcs r5, %[r]\n\t"
  160984. #else
  160985. "adc r5, %[r]\n\t"
  160986. #endif
  160987. #ifdef WOLFSSL_KEIL
  160988. "adcs r3, r3, %[r]\n\t"
  160989. #elif defined(__clang__)
  160990. "adcs r3, %[r]\n\t"
  160991. #else
  160992. "adc r3, %[r]\n\t"
  160993. #endif
  160994. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160995. "lsrs r7, %[b], #16\n\t"
  160996. #else
  160997. "lsr r7, %[b], #16\n\t"
  160998. #endif
  160999. #ifdef WOLFSSL_KEIL
  161000. "muls r6, r7, r6\n\t"
  161001. #elif defined(__clang__)
  161002. "muls r6, r7\n\t"
  161003. #else
  161004. "mul r6, r7\n\t"
  161005. #endif
  161006. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161007. "lsrs r7, r6, #16\n\t"
  161008. #else
  161009. "lsr r7, r6, #16\n\t"
  161010. #endif
  161011. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161012. "lsls r6, r6, #16\n\t"
  161013. #else
  161014. "lsl r6, r6, #16\n\t"
  161015. #endif
  161016. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161017. "adds r4, r4, r6\n\t"
  161018. #else
  161019. "add r4, r4, r6\n\t"
  161020. #endif
  161021. #ifdef WOLFSSL_KEIL
  161022. "adcs r5, r5, r7\n\t"
  161023. #elif defined(__clang__)
  161024. "adcs r5, r7\n\t"
  161025. #else
  161026. "adc r5, r7\n\t"
  161027. #endif
  161028. #ifdef WOLFSSL_KEIL
  161029. "adcs r3, r3, %[r]\n\t"
  161030. #elif defined(__clang__)
  161031. "adcs r3, %[r]\n\t"
  161032. #else
  161033. "adc r3, %[r]\n\t"
  161034. #endif
  161035. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161036. "lsrs r6, %[a], #16\n\t"
  161037. #else
  161038. "lsr r6, %[a], #16\n\t"
  161039. #endif
  161040. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161041. "lsrs r7, %[b], #16\n\t"
  161042. #else
  161043. "lsr r7, %[b], #16\n\t"
  161044. #endif
  161045. #ifdef WOLFSSL_KEIL
  161046. "muls r7, r6, r7\n\t"
  161047. #elif defined(__clang__)
  161048. "muls r7, r6\n\t"
  161049. #else
  161050. "mul r7, r6\n\t"
  161051. #endif
  161052. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161053. "adds r5, r5, r7\n\t"
  161054. #else
  161055. "add r5, r5, r7\n\t"
  161056. #endif
  161057. #ifdef WOLFSSL_KEIL
  161058. "adcs r3, r3, %[r]\n\t"
  161059. #elif defined(__clang__)
  161060. "adcs r3, %[r]\n\t"
  161061. #else
  161062. "adc r3, %[r]\n\t"
  161063. #endif
  161064. "uxth r7, %[b]\n\t"
  161065. #ifdef WOLFSSL_KEIL
  161066. "muls r6, r7, r6\n\t"
  161067. #elif defined(__clang__)
  161068. "muls r6, r7\n\t"
  161069. #else
  161070. "mul r6, r7\n\t"
  161071. #endif
  161072. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161073. "lsrs r7, r6, #16\n\t"
  161074. #else
  161075. "lsr r7, r6, #16\n\t"
  161076. #endif
  161077. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161078. "lsls r6, r6, #16\n\t"
  161079. #else
  161080. "lsl r6, r6, #16\n\t"
  161081. #endif
  161082. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161083. "adds r4, r4, r6\n\t"
  161084. #else
  161085. "add r4, r4, r6\n\t"
  161086. #endif
  161087. #ifdef WOLFSSL_KEIL
  161088. "adcs r5, r5, r7\n\t"
  161089. #elif defined(__clang__)
  161090. "adcs r5, r7\n\t"
  161091. #else
  161092. "adc r5, r7\n\t"
  161093. #endif
  161094. #ifdef WOLFSSL_KEIL
  161095. "adcs r3, r3, %[r]\n\t"
  161096. #elif defined(__clang__)
  161097. "adcs r3, %[r]\n\t"
  161098. #else
  161099. "adc r3, %[r]\n\t"
  161100. #endif
  161101. "mov %[r], r8\n\t"
  161102. "str r4, [%[r], #76]\n\t"
  161103. "movs %[r], #0\n\t"
  161104. "# A[15] * B[5]\n\t"
  161105. "movs r4, #0\n\t"
  161106. "mov %[a], r9\n\t"
  161107. "mov %[b], r10\n\t"
  161108. "ldr %[a], [%[a], #60]\n\t"
  161109. "ldr %[b], [%[b], #20]\n\t"
  161110. "uxth r6, %[a]\n\t"
  161111. "uxth r7, %[b]\n\t"
  161112. #ifdef WOLFSSL_KEIL
  161113. "muls r7, r6, r7\n\t"
  161114. #elif defined(__clang__)
  161115. "muls r7, r6\n\t"
  161116. #else
  161117. "mul r7, r6\n\t"
  161118. #endif
  161119. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161120. "adds r5, r5, r7\n\t"
  161121. #else
  161122. "add r5, r5, r7\n\t"
  161123. #endif
  161124. #ifdef WOLFSSL_KEIL
  161125. "adcs r3, r3, %[r]\n\t"
  161126. #elif defined(__clang__)
  161127. "adcs r3, %[r]\n\t"
  161128. #else
  161129. "adc r3, %[r]\n\t"
  161130. #endif
  161131. #ifdef WOLFSSL_KEIL
  161132. "adcs r4, r4, %[r]\n\t"
  161133. #elif defined(__clang__)
  161134. "adcs r4, %[r]\n\t"
  161135. #else
  161136. "adc r4, %[r]\n\t"
  161137. #endif
  161138. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161139. "lsrs r7, %[b], #16\n\t"
  161140. #else
  161141. "lsr r7, %[b], #16\n\t"
  161142. #endif
  161143. #ifdef WOLFSSL_KEIL
  161144. "muls r6, r7, r6\n\t"
  161145. #elif defined(__clang__)
  161146. "muls r6, r7\n\t"
  161147. #else
  161148. "mul r6, r7\n\t"
  161149. #endif
  161150. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161151. "lsrs r7, r6, #16\n\t"
  161152. #else
  161153. "lsr r7, r6, #16\n\t"
  161154. #endif
  161155. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161156. "lsls r6, r6, #16\n\t"
  161157. #else
  161158. "lsl r6, r6, #16\n\t"
  161159. #endif
  161160. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161161. "adds r5, r5, r6\n\t"
  161162. #else
  161163. "add r5, r5, r6\n\t"
  161164. #endif
  161165. #ifdef WOLFSSL_KEIL
  161166. "adcs r3, r3, r7\n\t"
  161167. #elif defined(__clang__)
  161168. "adcs r3, r7\n\t"
  161169. #else
  161170. "adc r3, r7\n\t"
  161171. #endif
  161172. #ifdef WOLFSSL_KEIL
  161173. "adcs r4, r4, %[r]\n\t"
  161174. #elif defined(__clang__)
  161175. "adcs r4, %[r]\n\t"
  161176. #else
  161177. "adc r4, %[r]\n\t"
  161178. #endif
  161179. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161180. "lsrs r6, %[a], #16\n\t"
  161181. #else
  161182. "lsr r6, %[a], #16\n\t"
  161183. #endif
  161184. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161185. "lsrs r7, %[b], #16\n\t"
  161186. #else
  161187. "lsr r7, %[b], #16\n\t"
  161188. #endif
  161189. #ifdef WOLFSSL_KEIL
  161190. "muls r7, r6, r7\n\t"
  161191. #elif defined(__clang__)
  161192. "muls r7, r6\n\t"
  161193. #else
  161194. "mul r7, r6\n\t"
  161195. #endif
  161196. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161197. "adds r3, r3, r7\n\t"
  161198. #else
  161199. "add r3, r3, r7\n\t"
  161200. #endif
  161201. #ifdef WOLFSSL_KEIL
  161202. "adcs r4, r4, %[r]\n\t"
  161203. #elif defined(__clang__)
  161204. "adcs r4, %[r]\n\t"
  161205. #else
  161206. "adc r4, %[r]\n\t"
  161207. #endif
  161208. "uxth r7, %[b]\n\t"
  161209. #ifdef WOLFSSL_KEIL
  161210. "muls r6, r7, r6\n\t"
  161211. #elif defined(__clang__)
  161212. "muls r6, r7\n\t"
  161213. #else
  161214. "mul r6, r7\n\t"
  161215. #endif
  161216. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161217. "lsrs r7, r6, #16\n\t"
  161218. #else
  161219. "lsr r7, r6, #16\n\t"
  161220. #endif
  161221. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161222. "lsls r6, r6, #16\n\t"
  161223. #else
  161224. "lsl r6, r6, #16\n\t"
  161225. #endif
  161226. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161227. "adds r5, r5, r6\n\t"
  161228. #else
  161229. "add r5, r5, r6\n\t"
  161230. #endif
  161231. #ifdef WOLFSSL_KEIL
  161232. "adcs r3, r3, r7\n\t"
  161233. #elif defined(__clang__)
  161234. "adcs r3, r7\n\t"
  161235. #else
  161236. "adc r3, r7\n\t"
  161237. #endif
  161238. #ifdef WOLFSSL_KEIL
  161239. "adcs r4, r4, %[r]\n\t"
  161240. #elif defined(__clang__)
  161241. "adcs r4, %[r]\n\t"
  161242. #else
  161243. "adc r4, %[r]\n\t"
  161244. #endif
  161245. "# A[14] * B[6]\n\t"
  161246. "mov %[a], r9\n\t"
  161247. "mov %[b], r10\n\t"
  161248. "ldr %[a], [%[a], #56]\n\t"
  161249. "ldr %[b], [%[b], #24]\n\t"
  161250. "uxth r6, %[a]\n\t"
  161251. "uxth r7, %[b]\n\t"
  161252. #ifdef WOLFSSL_KEIL
  161253. "muls r7, r6, r7\n\t"
  161254. #elif defined(__clang__)
  161255. "muls r7, r6\n\t"
  161256. #else
  161257. "mul r7, r6\n\t"
  161258. #endif
  161259. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161260. "adds r5, r5, r7\n\t"
  161261. #else
  161262. "add r5, r5, r7\n\t"
  161263. #endif
  161264. #ifdef WOLFSSL_KEIL
  161265. "adcs r3, r3, %[r]\n\t"
  161266. #elif defined(__clang__)
  161267. "adcs r3, %[r]\n\t"
  161268. #else
  161269. "adc r3, %[r]\n\t"
  161270. #endif
  161271. #ifdef WOLFSSL_KEIL
  161272. "adcs r4, r4, %[r]\n\t"
  161273. #elif defined(__clang__)
  161274. "adcs r4, %[r]\n\t"
  161275. #else
  161276. "adc r4, %[r]\n\t"
  161277. #endif
  161278. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161279. "lsrs r7, %[b], #16\n\t"
  161280. #else
  161281. "lsr r7, %[b], #16\n\t"
  161282. #endif
  161283. #ifdef WOLFSSL_KEIL
  161284. "muls r6, r7, r6\n\t"
  161285. #elif defined(__clang__)
  161286. "muls r6, r7\n\t"
  161287. #else
  161288. "mul r6, r7\n\t"
  161289. #endif
  161290. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161291. "lsrs r7, r6, #16\n\t"
  161292. #else
  161293. "lsr r7, r6, #16\n\t"
  161294. #endif
  161295. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161296. "lsls r6, r6, #16\n\t"
  161297. #else
  161298. "lsl r6, r6, #16\n\t"
  161299. #endif
  161300. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161301. "adds r5, r5, r6\n\t"
  161302. #else
  161303. "add r5, r5, r6\n\t"
  161304. #endif
  161305. #ifdef WOLFSSL_KEIL
  161306. "adcs r3, r3, r7\n\t"
  161307. #elif defined(__clang__)
  161308. "adcs r3, r7\n\t"
  161309. #else
  161310. "adc r3, r7\n\t"
  161311. #endif
  161312. #ifdef WOLFSSL_KEIL
  161313. "adcs r4, r4, %[r]\n\t"
  161314. #elif defined(__clang__)
  161315. "adcs r4, %[r]\n\t"
  161316. #else
  161317. "adc r4, %[r]\n\t"
  161318. #endif
  161319. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161320. "lsrs r6, %[a], #16\n\t"
  161321. #else
  161322. "lsr r6, %[a], #16\n\t"
  161323. #endif
  161324. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161325. "lsrs r7, %[b], #16\n\t"
  161326. #else
  161327. "lsr r7, %[b], #16\n\t"
  161328. #endif
  161329. #ifdef WOLFSSL_KEIL
  161330. "muls r7, r6, r7\n\t"
  161331. #elif defined(__clang__)
  161332. "muls r7, r6\n\t"
  161333. #else
  161334. "mul r7, r6\n\t"
  161335. #endif
  161336. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161337. "adds r3, r3, r7\n\t"
  161338. #else
  161339. "add r3, r3, r7\n\t"
  161340. #endif
  161341. #ifdef WOLFSSL_KEIL
  161342. "adcs r4, r4, %[r]\n\t"
  161343. #elif defined(__clang__)
  161344. "adcs r4, %[r]\n\t"
  161345. #else
  161346. "adc r4, %[r]\n\t"
  161347. #endif
  161348. "uxth r7, %[b]\n\t"
  161349. #ifdef WOLFSSL_KEIL
  161350. "muls r6, r7, r6\n\t"
  161351. #elif defined(__clang__)
  161352. "muls r6, r7\n\t"
  161353. #else
  161354. "mul r6, r7\n\t"
  161355. #endif
  161356. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161357. "lsrs r7, r6, #16\n\t"
  161358. #else
  161359. "lsr r7, r6, #16\n\t"
  161360. #endif
  161361. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161362. "lsls r6, r6, #16\n\t"
  161363. #else
  161364. "lsl r6, r6, #16\n\t"
  161365. #endif
  161366. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161367. "adds r5, r5, r6\n\t"
  161368. #else
  161369. "add r5, r5, r6\n\t"
  161370. #endif
  161371. #ifdef WOLFSSL_KEIL
  161372. "adcs r3, r3, r7\n\t"
  161373. #elif defined(__clang__)
  161374. "adcs r3, r7\n\t"
  161375. #else
  161376. "adc r3, r7\n\t"
  161377. #endif
  161378. #ifdef WOLFSSL_KEIL
  161379. "adcs r4, r4, %[r]\n\t"
  161380. #elif defined(__clang__)
  161381. "adcs r4, %[r]\n\t"
  161382. #else
  161383. "adc r4, %[r]\n\t"
  161384. #endif
  161385. "# A[13] * B[7]\n\t"
  161386. "mov %[a], r9\n\t"
  161387. "mov %[b], r10\n\t"
  161388. "ldr %[a], [%[a], #52]\n\t"
  161389. "ldr %[b], [%[b], #28]\n\t"
  161390. "uxth r6, %[a]\n\t"
  161391. "uxth r7, %[b]\n\t"
  161392. #ifdef WOLFSSL_KEIL
  161393. "muls r7, r6, r7\n\t"
  161394. #elif defined(__clang__)
  161395. "muls r7, r6\n\t"
  161396. #else
  161397. "mul r7, r6\n\t"
  161398. #endif
  161399. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161400. "adds r5, r5, r7\n\t"
  161401. #else
  161402. "add r5, r5, r7\n\t"
  161403. #endif
  161404. #ifdef WOLFSSL_KEIL
  161405. "adcs r3, r3, %[r]\n\t"
  161406. #elif defined(__clang__)
  161407. "adcs r3, %[r]\n\t"
  161408. #else
  161409. "adc r3, %[r]\n\t"
  161410. #endif
  161411. #ifdef WOLFSSL_KEIL
  161412. "adcs r4, r4, %[r]\n\t"
  161413. #elif defined(__clang__)
  161414. "adcs r4, %[r]\n\t"
  161415. #else
  161416. "adc r4, %[r]\n\t"
  161417. #endif
  161418. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161419. "lsrs r7, %[b], #16\n\t"
  161420. #else
  161421. "lsr r7, %[b], #16\n\t"
  161422. #endif
  161423. #ifdef WOLFSSL_KEIL
  161424. "muls r6, r7, r6\n\t"
  161425. #elif defined(__clang__)
  161426. "muls r6, r7\n\t"
  161427. #else
  161428. "mul r6, r7\n\t"
  161429. #endif
  161430. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161431. "lsrs r7, r6, #16\n\t"
  161432. #else
  161433. "lsr r7, r6, #16\n\t"
  161434. #endif
  161435. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161436. "lsls r6, r6, #16\n\t"
  161437. #else
  161438. "lsl r6, r6, #16\n\t"
  161439. #endif
  161440. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161441. "adds r5, r5, r6\n\t"
  161442. #else
  161443. "add r5, r5, r6\n\t"
  161444. #endif
  161445. #ifdef WOLFSSL_KEIL
  161446. "adcs r3, r3, r7\n\t"
  161447. #elif defined(__clang__)
  161448. "adcs r3, r7\n\t"
  161449. #else
  161450. "adc r3, r7\n\t"
  161451. #endif
  161452. #ifdef WOLFSSL_KEIL
  161453. "adcs r4, r4, %[r]\n\t"
  161454. #elif defined(__clang__)
  161455. "adcs r4, %[r]\n\t"
  161456. #else
  161457. "adc r4, %[r]\n\t"
  161458. #endif
  161459. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161460. "lsrs r6, %[a], #16\n\t"
  161461. #else
  161462. "lsr r6, %[a], #16\n\t"
  161463. #endif
  161464. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161465. "lsrs r7, %[b], #16\n\t"
  161466. #else
  161467. "lsr r7, %[b], #16\n\t"
  161468. #endif
  161469. #ifdef WOLFSSL_KEIL
  161470. "muls r7, r6, r7\n\t"
  161471. #elif defined(__clang__)
  161472. "muls r7, r6\n\t"
  161473. #else
  161474. "mul r7, r6\n\t"
  161475. #endif
  161476. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161477. "adds r3, r3, r7\n\t"
  161478. #else
  161479. "add r3, r3, r7\n\t"
  161480. #endif
  161481. #ifdef WOLFSSL_KEIL
  161482. "adcs r4, r4, %[r]\n\t"
  161483. #elif defined(__clang__)
  161484. "adcs r4, %[r]\n\t"
  161485. #else
  161486. "adc r4, %[r]\n\t"
  161487. #endif
  161488. "uxth r7, %[b]\n\t"
  161489. #ifdef WOLFSSL_KEIL
  161490. "muls r6, r7, r6\n\t"
  161491. #elif defined(__clang__)
  161492. "muls r6, r7\n\t"
  161493. #else
  161494. "mul r6, r7\n\t"
  161495. #endif
  161496. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161497. "lsrs r7, r6, #16\n\t"
  161498. #else
  161499. "lsr r7, r6, #16\n\t"
  161500. #endif
  161501. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161502. "lsls r6, r6, #16\n\t"
  161503. #else
  161504. "lsl r6, r6, #16\n\t"
  161505. #endif
  161506. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161507. "adds r5, r5, r6\n\t"
  161508. #else
  161509. "add r5, r5, r6\n\t"
  161510. #endif
  161511. #ifdef WOLFSSL_KEIL
  161512. "adcs r3, r3, r7\n\t"
  161513. #elif defined(__clang__)
  161514. "adcs r3, r7\n\t"
  161515. #else
  161516. "adc r3, r7\n\t"
  161517. #endif
  161518. #ifdef WOLFSSL_KEIL
  161519. "adcs r4, r4, %[r]\n\t"
  161520. #elif defined(__clang__)
  161521. "adcs r4, %[r]\n\t"
  161522. #else
  161523. "adc r4, %[r]\n\t"
  161524. #endif
  161525. "# A[12] * B[8]\n\t"
  161526. "mov %[a], r9\n\t"
  161527. "mov %[b], r10\n\t"
  161528. "ldr %[a], [%[a], #48]\n\t"
  161529. "ldr %[b], [%[b], #32]\n\t"
  161530. "uxth r6, %[a]\n\t"
  161531. "uxth r7, %[b]\n\t"
  161532. #ifdef WOLFSSL_KEIL
  161533. "muls r7, r6, r7\n\t"
  161534. #elif defined(__clang__)
  161535. "muls r7, r6\n\t"
  161536. #else
  161537. "mul r7, r6\n\t"
  161538. #endif
  161539. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161540. "adds r5, r5, r7\n\t"
  161541. #else
  161542. "add r5, r5, r7\n\t"
  161543. #endif
  161544. #ifdef WOLFSSL_KEIL
  161545. "adcs r3, r3, %[r]\n\t"
  161546. #elif defined(__clang__)
  161547. "adcs r3, %[r]\n\t"
  161548. #else
  161549. "adc r3, %[r]\n\t"
  161550. #endif
  161551. #ifdef WOLFSSL_KEIL
  161552. "adcs r4, r4, %[r]\n\t"
  161553. #elif defined(__clang__)
  161554. "adcs r4, %[r]\n\t"
  161555. #else
  161556. "adc r4, %[r]\n\t"
  161557. #endif
  161558. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161559. "lsrs r7, %[b], #16\n\t"
  161560. #else
  161561. "lsr r7, %[b], #16\n\t"
  161562. #endif
  161563. #ifdef WOLFSSL_KEIL
  161564. "muls r6, r7, r6\n\t"
  161565. #elif defined(__clang__)
  161566. "muls r6, r7\n\t"
  161567. #else
  161568. "mul r6, r7\n\t"
  161569. #endif
  161570. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161571. "lsrs r7, r6, #16\n\t"
  161572. #else
  161573. "lsr r7, r6, #16\n\t"
  161574. #endif
  161575. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161576. "lsls r6, r6, #16\n\t"
  161577. #else
  161578. "lsl r6, r6, #16\n\t"
  161579. #endif
  161580. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161581. "adds r5, r5, r6\n\t"
  161582. #else
  161583. "add r5, r5, r6\n\t"
  161584. #endif
  161585. #ifdef WOLFSSL_KEIL
  161586. "adcs r3, r3, r7\n\t"
  161587. #elif defined(__clang__)
  161588. "adcs r3, r7\n\t"
  161589. #else
  161590. "adc r3, r7\n\t"
  161591. #endif
  161592. #ifdef WOLFSSL_KEIL
  161593. "adcs r4, r4, %[r]\n\t"
  161594. #elif defined(__clang__)
  161595. "adcs r4, %[r]\n\t"
  161596. #else
  161597. "adc r4, %[r]\n\t"
  161598. #endif
  161599. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161600. "lsrs r6, %[a], #16\n\t"
  161601. #else
  161602. "lsr r6, %[a], #16\n\t"
  161603. #endif
  161604. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161605. "lsrs r7, %[b], #16\n\t"
  161606. #else
  161607. "lsr r7, %[b], #16\n\t"
  161608. #endif
  161609. #ifdef WOLFSSL_KEIL
  161610. "muls r7, r6, r7\n\t"
  161611. #elif defined(__clang__)
  161612. "muls r7, r6\n\t"
  161613. #else
  161614. "mul r7, r6\n\t"
  161615. #endif
  161616. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161617. "adds r3, r3, r7\n\t"
  161618. #else
  161619. "add r3, r3, r7\n\t"
  161620. #endif
  161621. #ifdef WOLFSSL_KEIL
  161622. "adcs r4, r4, %[r]\n\t"
  161623. #elif defined(__clang__)
  161624. "adcs r4, %[r]\n\t"
  161625. #else
  161626. "adc r4, %[r]\n\t"
  161627. #endif
  161628. "uxth r7, %[b]\n\t"
  161629. #ifdef WOLFSSL_KEIL
  161630. "muls r6, r7, r6\n\t"
  161631. #elif defined(__clang__)
  161632. "muls r6, r7\n\t"
  161633. #else
  161634. "mul r6, r7\n\t"
  161635. #endif
  161636. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161637. "lsrs r7, r6, #16\n\t"
  161638. #else
  161639. "lsr r7, r6, #16\n\t"
  161640. #endif
  161641. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161642. "lsls r6, r6, #16\n\t"
  161643. #else
  161644. "lsl r6, r6, #16\n\t"
  161645. #endif
  161646. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161647. "adds r5, r5, r6\n\t"
  161648. #else
  161649. "add r5, r5, r6\n\t"
  161650. #endif
  161651. #ifdef WOLFSSL_KEIL
  161652. "adcs r3, r3, r7\n\t"
  161653. #elif defined(__clang__)
  161654. "adcs r3, r7\n\t"
  161655. #else
  161656. "adc r3, r7\n\t"
  161657. #endif
  161658. #ifdef WOLFSSL_KEIL
  161659. "adcs r4, r4, %[r]\n\t"
  161660. #elif defined(__clang__)
  161661. "adcs r4, %[r]\n\t"
  161662. #else
  161663. "adc r4, %[r]\n\t"
  161664. #endif
  161665. "# A[11] * B[9]\n\t"
  161666. "mov %[a], r9\n\t"
  161667. "mov %[b], r10\n\t"
  161668. "ldr %[a], [%[a], #44]\n\t"
  161669. "ldr %[b], [%[b], #36]\n\t"
  161670. "uxth r6, %[a]\n\t"
  161671. "uxth r7, %[b]\n\t"
  161672. #ifdef WOLFSSL_KEIL
  161673. "muls r7, r6, r7\n\t"
  161674. #elif defined(__clang__)
  161675. "muls r7, r6\n\t"
  161676. #else
  161677. "mul r7, r6\n\t"
  161678. #endif
  161679. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161680. "adds r5, r5, r7\n\t"
  161681. #else
  161682. "add r5, r5, r7\n\t"
  161683. #endif
  161684. #ifdef WOLFSSL_KEIL
  161685. "adcs r3, r3, %[r]\n\t"
  161686. #elif defined(__clang__)
  161687. "adcs r3, %[r]\n\t"
  161688. #else
  161689. "adc r3, %[r]\n\t"
  161690. #endif
  161691. #ifdef WOLFSSL_KEIL
  161692. "adcs r4, r4, %[r]\n\t"
  161693. #elif defined(__clang__)
  161694. "adcs r4, %[r]\n\t"
  161695. #else
  161696. "adc r4, %[r]\n\t"
  161697. #endif
  161698. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161699. "lsrs r7, %[b], #16\n\t"
  161700. #else
  161701. "lsr r7, %[b], #16\n\t"
  161702. #endif
  161703. #ifdef WOLFSSL_KEIL
  161704. "muls r6, r7, r6\n\t"
  161705. #elif defined(__clang__)
  161706. "muls r6, r7\n\t"
  161707. #else
  161708. "mul r6, r7\n\t"
  161709. #endif
  161710. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161711. "lsrs r7, r6, #16\n\t"
  161712. #else
  161713. "lsr r7, r6, #16\n\t"
  161714. #endif
  161715. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161716. "lsls r6, r6, #16\n\t"
  161717. #else
  161718. "lsl r6, r6, #16\n\t"
  161719. #endif
  161720. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161721. "adds r5, r5, r6\n\t"
  161722. #else
  161723. "add r5, r5, r6\n\t"
  161724. #endif
  161725. #ifdef WOLFSSL_KEIL
  161726. "adcs r3, r3, r7\n\t"
  161727. #elif defined(__clang__)
  161728. "adcs r3, r7\n\t"
  161729. #else
  161730. "adc r3, r7\n\t"
  161731. #endif
  161732. #ifdef WOLFSSL_KEIL
  161733. "adcs r4, r4, %[r]\n\t"
  161734. #elif defined(__clang__)
  161735. "adcs r4, %[r]\n\t"
  161736. #else
  161737. "adc r4, %[r]\n\t"
  161738. #endif
  161739. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161740. "lsrs r6, %[a], #16\n\t"
  161741. #else
  161742. "lsr r6, %[a], #16\n\t"
  161743. #endif
  161744. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161745. "lsrs r7, %[b], #16\n\t"
  161746. #else
  161747. "lsr r7, %[b], #16\n\t"
  161748. #endif
  161749. #ifdef WOLFSSL_KEIL
  161750. "muls r7, r6, r7\n\t"
  161751. #elif defined(__clang__)
  161752. "muls r7, r6\n\t"
  161753. #else
  161754. "mul r7, r6\n\t"
  161755. #endif
  161756. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161757. "adds r3, r3, r7\n\t"
  161758. #else
  161759. "add r3, r3, r7\n\t"
  161760. #endif
  161761. #ifdef WOLFSSL_KEIL
  161762. "adcs r4, r4, %[r]\n\t"
  161763. #elif defined(__clang__)
  161764. "adcs r4, %[r]\n\t"
  161765. #else
  161766. "adc r4, %[r]\n\t"
  161767. #endif
  161768. "uxth r7, %[b]\n\t"
  161769. #ifdef WOLFSSL_KEIL
  161770. "muls r6, r7, r6\n\t"
  161771. #elif defined(__clang__)
  161772. "muls r6, r7\n\t"
  161773. #else
  161774. "mul r6, r7\n\t"
  161775. #endif
  161776. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161777. "lsrs r7, r6, #16\n\t"
  161778. #else
  161779. "lsr r7, r6, #16\n\t"
  161780. #endif
  161781. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161782. "lsls r6, r6, #16\n\t"
  161783. #else
  161784. "lsl r6, r6, #16\n\t"
  161785. #endif
  161786. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161787. "adds r5, r5, r6\n\t"
  161788. #else
  161789. "add r5, r5, r6\n\t"
  161790. #endif
  161791. #ifdef WOLFSSL_KEIL
  161792. "adcs r3, r3, r7\n\t"
  161793. #elif defined(__clang__)
  161794. "adcs r3, r7\n\t"
  161795. #else
  161796. "adc r3, r7\n\t"
  161797. #endif
  161798. #ifdef WOLFSSL_KEIL
  161799. "adcs r4, r4, %[r]\n\t"
  161800. #elif defined(__clang__)
  161801. "adcs r4, %[r]\n\t"
  161802. #else
  161803. "adc r4, %[r]\n\t"
  161804. #endif
  161805. "# A[10] * B[10]\n\t"
  161806. "mov %[a], r9\n\t"
  161807. "mov %[b], r10\n\t"
  161808. "ldr %[a], [%[a], #40]\n\t"
  161809. "ldr %[b], [%[b], #40]\n\t"
  161810. "uxth r6, %[a]\n\t"
  161811. "uxth r7, %[b]\n\t"
  161812. #ifdef WOLFSSL_KEIL
  161813. "muls r7, r6, r7\n\t"
  161814. #elif defined(__clang__)
  161815. "muls r7, r6\n\t"
  161816. #else
  161817. "mul r7, r6\n\t"
  161818. #endif
  161819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161820. "adds r5, r5, r7\n\t"
  161821. #else
  161822. "add r5, r5, r7\n\t"
  161823. #endif
  161824. #ifdef WOLFSSL_KEIL
  161825. "adcs r3, r3, %[r]\n\t"
  161826. #elif defined(__clang__)
  161827. "adcs r3, %[r]\n\t"
  161828. #else
  161829. "adc r3, %[r]\n\t"
  161830. #endif
  161831. #ifdef WOLFSSL_KEIL
  161832. "adcs r4, r4, %[r]\n\t"
  161833. #elif defined(__clang__)
  161834. "adcs r4, %[r]\n\t"
  161835. #else
  161836. "adc r4, %[r]\n\t"
  161837. #endif
  161838. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161839. "lsrs r7, %[b], #16\n\t"
  161840. #else
  161841. "lsr r7, %[b], #16\n\t"
  161842. #endif
  161843. #ifdef WOLFSSL_KEIL
  161844. "muls r6, r7, r6\n\t"
  161845. #elif defined(__clang__)
  161846. "muls r6, r7\n\t"
  161847. #else
  161848. "mul r6, r7\n\t"
  161849. #endif
  161850. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161851. "lsrs r7, r6, #16\n\t"
  161852. #else
  161853. "lsr r7, r6, #16\n\t"
  161854. #endif
  161855. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161856. "lsls r6, r6, #16\n\t"
  161857. #else
  161858. "lsl r6, r6, #16\n\t"
  161859. #endif
  161860. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161861. "adds r5, r5, r6\n\t"
  161862. #else
  161863. "add r5, r5, r6\n\t"
  161864. #endif
  161865. #ifdef WOLFSSL_KEIL
  161866. "adcs r3, r3, r7\n\t"
  161867. #elif defined(__clang__)
  161868. "adcs r3, r7\n\t"
  161869. #else
  161870. "adc r3, r7\n\t"
  161871. #endif
  161872. #ifdef WOLFSSL_KEIL
  161873. "adcs r4, r4, %[r]\n\t"
  161874. #elif defined(__clang__)
  161875. "adcs r4, %[r]\n\t"
  161876. #else
  161877. "adc r4, %[r]\n\t"
  161878. #endif
  161879. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161880. "lsrs r6, %[a], #16\n\t"
  161881. #else
  161882. "lsr r6, %[a], #16\n\t"
  161883. #endif
  161884. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161885. "lsrs r7, %[b], #16\n\t"
  161886. #else
  161887. "lsr r7, %[b], #16\n\t"
  161888. #endif
  161889. #ifdef WOLFSSL_KEIL
  161890. "muls r7, r6, r7\n\t"
  161891. #elif defined(__clang__)
  161892. "muls r7, r6\n\t"
  161893. #else
  161894. "mul r7, r6\n\t"
  161895. #endif
  161896. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161897. "adds r3, r3, r7\n\t"
  161898. #else
  161899. "add r3, r3, r7\n\t"
  161900. #endif
  161901. #ifdef WOLFSSL_KEIL
  161902. "adcs r4, r4, %[r]\n\t"
  161903. #elif defined(__clang__)
  161904. "adcs r4, %[r]\n\t"
  161905. #else
  161906. "adc r4, %[r]\n\t"
  161907. #endif
  161908. "uxth r7, %[b]\n\t"
  161909. #ifdef WOLFSSL_KEIL
  161910. "muls r6, r7, r6\n\t"
  161911. #elif defined(__clang__)
  161912. "muls r6, r7\n\t"
  161913. #else
  161914. "mul r6, r7\n\t"
  161915. #endif
  161916. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161917. "lsrs r7, r6, #16\n\t"
  161918. #else
  161919. "lsr r7, r6, #16\n\t"
  161920. #endif
  161921. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161922. "lsls r6, r6, #16\n\t"
  161923. #else
  161924. "lsl r6, r6, #16\n\t"
  161925. #endif
  161926. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161927. "adds r5, r5, r6\n\t"
  161928. #else
  161929. "add r5, r5, r6\n\t"
  161930. #endif
  161931. #ifdef WOLFSSL_KEIL
  161932. "adcs r3, r3, r7\n\t"
  161933. #elif defined(__clang__)
  161934. "adcs r3, r7\n\t"
  161935. #else
  161936. "adc r3, r7\n\t"
  161937. #endif
  161938. #ifdef WOLFSSL_KEIL
  161939. "adcs r4, r4, %[r]\n\t"
  161940. #elif defined(__clang__)
  161941. "adcs r4, %[r]\n\t"
  161942. #else
  161943. "adc r4, %[r]\n\t"
  161944. #endif
  161945. "# A[9] * B[11]\n\t"
  161946. "mov %[a], r9\n\t"
  161947. "mov %[b], r10\n\t"
  161948. "ldr %[a], [%[a], #36]\n\t"
  161949. "ldr %[b], [%[b], #44]\n\t"
  161950. "uxth r6, %[a]\n\t"
  161951. "uxth r7, %[b]\n\t"
  161952. #ifdef WOLFSSL_KEIL
  161953. "muls r7, r6, r7\n\t"
  161954. #elif defined(__clang__)
  161955. "muls r7, r6\n\t"
  161956. #else
  161957. "mul r7, r6\n\t"
  161958. #endif
  161959. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161960. "adds r5, r5, r7\n\t"
  161961. #else
  161962. "add r5, r5, r7\n\t"
  161963. #endif
  161964. #ifdef WOLFSSL_KEIL
  161965. "adcs r3, r3, %[r]\n\t"
  161966. #elif defined(__clang__)
  161967. "adcs r3, %[r]\n\t"
  161968. #else
  161969. "adc r3, %[r]\n\t"
  161970. #endif
  161971. #ifdef WOLFSSL_KEIL
  161972. "adcs r4, r4, %[r]\n\t"
  161973. #elif defined(__clang__)
  161974. "adcs r4, %[r]\n\t"
  161975. #else
  161976. "adc r4, %[r]\n\t"
  161977. #endif
  161978. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161979. "lsrs r7, %[b], #16\n\t"
  161980. #else
  161981. "lsr r7, %[b], #16\n\t"
  161982. #endif
  161983. #ifdef WOLFSSL_KEIL
  161984. "muls r6, r7, r6\n\t"
  161985. #elif defined(__clang__)
  161986. "muls r6, r7\n\t"
  161987. #else
  161988. "mul r6, r7\n\t"
  161989. #endif
  161990. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161991. "lsrs r7, r6, #16\n\t"
  161992. #else
  161993. "lsr r7, r6, #16\n\t"
  161994. #endif
  161995. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161996. "lsls r6, r6, #16\n\t"
  161997. #else
  161998. "lsl r6, r6, #16\n\t"
  161999. #endif
  162000. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162001. "adds r5, r5, r6\n\t"
  162002. #else
  162003. "add r5, r5, r6\n\t"
  162004. #endif
  162005. #ifdef WOLFSSL_KEIL
  162006. "adcs r3, r3, r7\n\t"
  162007. #elif defined(__clang__)
  162008. "adcs r3, r7\n\t"
  162009. #else
  162010. "adc r3, r7\n\t"
  162011. #endif
  162012. #ifdef WOLFSSL_KEIL
  162013. "adcs r4, r4, %[r]\n\t"
  162014. #elif defined(__clang__)
  162015. "adcs r4, %[r]\n\t"
  162016. #else
  162017. "adc r4, %[r]\n\t"
  162018. #endif
  162019. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162020. "lsrs r6, %[a], #16\n\t"
  162021. #else
  162022. "lsr r6, %[a], #16\n\t"
  162023. #endif
  162024. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162025. "lsrs r7, %[b], #16\n\t"
  162026. #else
  162027. "lsr r7, %[b], #16\n\t"
  162028. #endif
  162029. #ifdef WOLFSSL_KEIL
  162030. "muls r7, r6, r7\n\t"
  162031. #elif defined(__clang__)
  162032. "muls r7, r6\n\t"
  162033. #else
  162034. "mul r7, r6\n\t"
  162035. #endif
  162036. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162037. "adds r3, r3, r7\n\t"
  162038. #else
  162039. "add r3, r3, r7\n\t"
  162040. #endif
  162041. #ifdef WOLFSSL_KEIL
  162042. "adcs r4, r4, %[r]\n\t"
  162043. #elif defined(__clang__)
  162044. "adcs r4, %[r]\n\t"
  162045. #else
  162046. "adc r4, %[r]\n\t"
  162047. #endif
  162048. "uxth r7, %[b]\n\t"
  162049. #ifdef WOLFSSL_KEIL
  162050. "muls r6, r7, r6\n\t"
  162051. #elif defined(__clang__)
  162052. "muls r6, r7\n\t"
  162053. #else
  162054. "mul r6, r7\n\t"
  162055. #endif
  162056. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162057. "lsrs r7, r6, #16\n\t"
  162058. #else
  162059. "lsr r7, r6, #16\n\t"
  162060. #endif
  162061. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162062. "lsls r6, r6, #16\n\t"
  162063. #else
  162064. "lsl r6, r6, #16\n\t"
  162065. #endif
  162066. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162067. "adds r5, r5, r6\n\t"
  162068. #else
  162069. "add r5, r5, r6\n\t"
  162070. #endif
  162071. #ifdef WOLFSSL_KEIL
  162072. "adcs r3, r3, r7\n\t"
  162073. #elif defined(__clang__)
  162074. "adcs r3, r7\n\t"
  162075. #else
  162076. "adc r3, r7\n\t"
  162077. #endif
  162078. #ifdef WOLFSSL_KEIL
  162079. "adcs r4, r4, %[r]\n\t"
  162080. #elif defined(__clang__)
  162081. "adcs r4, %[r]\n\t"
  162082. #else
  162083. "adc r4, %[r]\n\t"
  162084. #endif
  162085. "# A[8] * B[12]\n\t"
  162086. "mov %[a], r9\n\t"
  162087. "mov %[b], r10\n\t"
  162088. "ldr %[a], [%[a], #32]\n\t"
  162089. "ldr %[b], [%[b], #48]\n\t"
  162090. "uxth r6, %[a]\n\t"
  162091. "uxth r7, %[b]\n\t"
  162092. #ifdef WOLFSSL_KEIL
  162093. "muls r7, r6, r7\n\t"
  162094. #elif defined(__clang__)
  162095. "muls r7, r6\n\t"
  162096. #else
  162097. "mul r7, r6\n\t"
  162098. #endif
  162099. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162100. "adds r5, r5, r7\n\t"
  162101. #else
  162102. "add r5, r5, r7\n\t"
  162103. #endif
  162104. #ifdef WOLFSSL_KEIL
  162105. "adcs r3, r3, %[r]\n\t"
  162106. #elif defined(__clang__)
  162107. "adcs r3, %[r]\n\t"
  162108. #else
  162109. "adc r3, %[r]\n\t"
  162110. #endif
  162111. #ifdef WOLFSSL_KEIL
  162112. "adcs r4, r4, %[r]\n\t"
  162113. #elif defined(__clang__)
  162114. "adcs r4, %[r]\n\t"
  162115. #else
  162116. "adc r4, %[r]\n\t"
  162117. #endif
  162118. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162119. "lsrs r7, %[b], #16\n\t"
  162120. #else
  162121. "lsr r7, %[b], #16\n\t"
  162122. #endif
  162123. #ifdef WOLFSSL_KEIL
  162124. "muls r6, r7, r6\n\t"
  162125. #elif defined(__clang__)
  162126. "muls r6, r7\n\t"
  162127. #else
  162128. "mul r6, r7\n\t"
  162129. #endif
  162130. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162131. "lsrs r7, r6, #16\n\t"
  162132. #else
  162133. "lsr r7, r6, #16\n\t"
  162134. #endif
  162135. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162136. "lsls r6, r6, #16\n\t"
  162137. #else
  162138. "lsl r6, r6, #16\n\t"
  162139. #endif
  162140. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162141. "adds r5, r5, r6\n\t"
  162142. #else
  162143. "add r5, r5, r6\n\t"
  162144. #endif
  162145. #ifdef WOLFSSL_KEIL
  162146. "adcs r3, r3, r7\n\t"
  162147. #elif defined(__clang__)
  162148. "adcs r3, r7\n\t"
  162149. #else
  162150. "adc r3, r7\n\t"
  162151. #endif
  162152. #ifdef WOLFSSL_KEIL
  162153. "adcs r4, r4, %[r]\n\t"
  162154. #elif defined(__clang__)
  162155. "adcs r4, %[r]\n\t"
  162156. #else
  162157. "adc r4, %[r]\n\t"
  162158. #endif
  162159. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162160. "lsrs r6, %[a], #16\n\t"
  162161. #else
  162162. "lsr r6, %[a], #16\n\t"
  162163. #endif
  162164. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162165. "lsrs r7, %[b], #16\n\t"
  162166. #else
  162167. "lsr r7, %[b], #16\n\t"
  162168. #endif
  162169. #ifdef WOLFSSL_KEIL
  162170. "muls r7, r6, r7\n\t"
  162171. #elif defined(__clang__)
  162172. "muls r7, r6\n\t"
  162173. #else
  162174. "mul r7, r6\n\t"
  162175. #endif
  162176. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162177. "adds r3, r3, r7\n\t"
  162178. #else
  162179. "add r3, r3, r7\n\t"
  162180. #endif
  162181. #ifdef WOLFSSL_KEIL
  162182. "adcs r4, r4, %[r]\n\t"
  162183. #elif defined(__clang__)
  162184. "adcs r4, %[r]\n\t"
  162185. #else
  162186. "adc r4, %[r]\n\t"
  162187. #endif
  162188. "uxth r7, %[b]\n\t"
  162189. #ifdef WOLFSSL_KEIL
  162190. "muls r6, r7, r6\n\t"
  162191. #elif defined(__clang__)
  162192. "muls r6, r7\n\t"
  162193. #else
  162194. "mul r6, r7\n\t"
  162195. #endif
  162196. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162197. "lsrs r7, r6, #16\n\t"
  162198. #else
  162199. "lsr r7, r6, #16\n\t"
  162200. #endif
  162201. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162202. "lsls r6, r6, #16\n\t"
  162203. #else
  162204. "lsl r6, r6, #16\n\t"
  162205. #endif
  162206. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162207. "adds r5, r5, r6\n\t"
  162208. #else
  162209. "add r5, r5, r6\n\t"
  162210. #endif
  162211. #ifdef WOLFSSL_KEIL
  162212. "adcs r3, r3, r7\n\t"
  162213. #elif defined(__clang__)
  162214. "adcs r3, r7\n\t"
  162215. #else
  162216. "adc r3, r7\n\t"
  162217. #endif
  162218. #ifdef WOLFSSL_KEIL
  162219. "adcs r4, r4, %[r]\n\t"
  162220. #elif defined(__clang__)
  162221. "adcs r4, %[r]\n\t"
  162222. #else
  162223. "adc r4, %[r]\n\t"
  162224. #endif
  162225. "# A[7] * B[13]\n\t"
  162226. "mov %[a], r9\n\t"
  162227. "mov %[b], r10\n\t"
  162228. "ldr %[a], [%[a], #28]\n\t"
  162229. "ldr %[b], [%[b], #52]\n\t"
  162230. "uxth r6, %[a]\n\t"
  162231. "uxth r7, %[b]\n\t"
  162232. #ifdef WOLFSSL_KEIL
  162233. "muls r7, r6, r7\n\t"
  162234. #elif defined(__clang__)
  162235. "muls r7, r6\n\t"
  162236. #else
  162237. "mul r7, r6\n\t"
  162238. #endif
  162239. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162240. "adds r5, r5, r7\n\t"
  162241. #else
  162242. "add r5, r5, r7\n\t"
  162243. #endif
  162244. #ifdef WOLFSSL_KEIL
  162245. "adcs r3, r3, %[r]\n\t"
  162246. #elif defined(__clang__)
  162247. "adcs r3, %[r]\n\t"
  162248. #else
  162249. "adc r3, %[r]\n\t"
  162250. #endif
  162251. #ifdef WOLFSSL_KEIL
  162252. "adcs r4, r4, %[r]\n\t"
  162253. #elif defined(__clang__)
  162254. "adcs r4, %[r]\n\t"
  162255. #else
  162256. "adc r4, %[r]\n\t"
  162257. #endif
  162258. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162259. "lsrs r7, %[b], #16\n\t"
  162260. #else
  162261. "lsr r7, %[b], #16\n\t"
  162262. #endif
  162263. #ifdef WOLFSSL_KEIL
  162264. "muls r6, r7, r6\n\t"
  162265. #elif defined(__clang__)
  162266. "muls r6, r7\n\t"
  162267. #else
  162268. "mul r6, r7\n\t"
  162269. #endif
  162270. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162271. "lsrs r7, r6, #16\n\t"
  162272. #else
  162273. "lsr r7, r6, #16\n\t"
  162274. #endif
  162275. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162276. "lsls r6, r6, #16\n\t"
  162277. #else
  162278. "lsl r6, r6, #16\n\t"
  162279. #endif
  162280. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162281. "adds r5, r5, r6\n\t"
  162282. #else
  162283. "add r5, r5, r6\n\t"
  162284. #endif
  162285. #ifdef WOLFSSL_KEIL
  162286. "adcs r3, r3, r7\n\t"
  162287. #elif defined(__clang__)
  162288. "adcs r3, r7\n\t"
  162289. #else
  162290. "adc r3, r7\n\t"
  162291. #endif
  162292. #ifdef WOLFSSL_KEIL
  162293. "adcs r4, r4, %[r]\n\t"
  162294. #elif defined(__clang__)
  162295. "adcs r4, %[r]\n\t"
  162296. #else
  162297. "adc r4, %[r]\n\t"
  162298. #endif
  162299. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162300. "lsrs r6, %[a], #16\n\t"
  162301. #else
  162302. "lsr r6, %[a], #16\n\t"
  162303. #endif
  162304. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162305. "lsrs r7, %[b], #16\n\t"
  162306. #else
  162307. "lsr r7, %[b], #16\n\t"
  162308. #endif
  162309. #ifdef WOLFSSL_KEIL
  162310. "muls r7, r6, r7\n\t"
  162311. #elif defined(__clang__)
  162312. "muls r7, r6\n\t"
  162313. #else
  162314. "mul r7, r6\n\t"
  162315. #endif
  162316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162317. "adds r3, r3, r7\n\t"
  162318. #else
  162319. "add r3, r3, r7\n\t"
  162320. #endif
  162321. #ifdef WOLFSSL_KEIL
  162322. "adcs r4, r4, %[r]\n\t"
  162323. #elif defined(__clang__)
  162324. "adcs r4, %[r]\n\t"
  162325. #else
  162326. "adc r4, %[r]\n\t"
  162327. #endif
  162328. "uxth r7, %[b]\n\t"
  162329. #ifdef WOLFSSL_KEIL
  162330. "muls r6, r7, r6\n\t"
  162331. #elif defined(__clang__)
  162332. "muls r6, r7\n\t"
  162333. #else
  162334. "mul r6, r7\n\t"
  162335. #endif
  162336. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162337. "lsrs r7, r6, #16\n\t"
  162338. #else
  162339. "lsr r7, r6, #16\n\t"
  162340. #endif
  162341. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162342. "lsls r6, r6, #16\n\t"
  162343. #else
  162344. "lsl r6, r6, #16\n\t"
  162345. #endif
  162346. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162347. "adds r5, r5, r6\n\t"
  162348. #else
  162349. "add r5, r5, r6\n\t"
  162350. #endif
  162351. #ifdef WOLFSSL_KEIL
  162352. "adcs r3, r3, r7\n\t"
  162353. #elif defined(__clang__)
  162354. "adcs r3, r7\n\t"
  162355. #else
  162356. "adc r3, r7\n\t"
  162357. #endif
  162358. #ifdef WOLFSSL_KEIL
  162359. "adcs r4, r4, %[r]\n\t"
  162360. #elif defined(__clang__)
  162361. "adcs r4, %[r]\n\t"
  162362. #else
  162363. "adc r4, %[r]\n\t"
  162364. #endif
  162365. "# A[6] * B[14]\n\t"
  162366. "mov %[a], r9\n\t"
  162367. "mov %[b], r10\n\t"
  162368. "ldr %[a], [%[a], #24]\n\t"
  162369. "ldr %[b], [%[b], #56]\n\t"
  162370. "uxth r6, %[a]\n\t"
  162371. "uxth r7, %[b]\n\t"
  162372. #ifdef WOLFSSL_KEIL
  162373. "muls r7, r6, r7\n\t"
  162374. #elif defined(__clang__)
  162375. "muls r7, r6\n\t"
  162376. #else
  162377. "mul r7, r6\n\t"
  162378. #endif
  162379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162380. "adds r5, r5, r7\n\t"
  162381. #else
  162382. "add r5, r5, r7\n\t"
  162383. #endif
  162384. #ifdef WOLFSSL_KEIL
  162385. "adcs r3, r3, %[r]\n\t"
  162386. #elif defined(__clang__)
  162387. "adcs r3, %[r]\n\t"
  162388. #else
  162389. "adc r3, %[r]\n\t"
  162390. #endif
  162391. #ifdef WOLFSSL_KEIL
  162392. "adcs r4, r4, %[r]\n\t"
  162393. #elif defined(__clang__)
  162394. "adcs r4, %[r]\n\t"
  162395. #else
  162396. "adc r4, %[r]\n\t"
  162397. #endif
  162398. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162399. "lsrs r7, %[b], #16\n\t"
  162400. #else
  162401. "lsr r7, %[b], #16\n\t"
  162402. #endif
  162403. #ifdef WOLFSSL_KEIL
  162404. "muls r6, r7, r6\n\t"
  162405. #elif defined(__clang__)
  162406. "muls r6, r7\n\t"
  162407. #else
  162408. "mul r6, r7\n\t"
  162409. #endif
  162410. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162411. "lsrs r7, r6, #16\n\t"
  162412. #else
  162413. "lsr r7, r6, #16\n\t"
  162414. #endif
  162415. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162416. "lsls r6, r6, #16\n\t"
  162417. #else
  162418. "lsl r6, r6, #16\n\t"
  162419. #endif
  162420. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162421. "adds r5, r5, r6\n\t"
  162422. #else
  162423. "add r5, r5, r6\n\t"
  162424. #endif
  162425. #ifdef WOLFSSL_KEIL
  162426. "adcs r3, r3, r7\n\t"
  162427. #elif defined(__clang__)
  162428. "adcs r3, r7\n\t"
  162429. #else
  162430. "adc r3, r7\n\t"
  162431. #endif
  162432. #ifdef WOLFSSL_KEIL
  162433. "adcs r4, r4, %[r]\n\t"
  162434. #elif defined(__clang__)
  162435. "adcs r4, %[r]\n\t"
  162436. #else
  162437. "adc r4, %[r]\n\t"
  162438. #endif
  162439. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162440. "lsrs r6, %[a], #16\n\t"
  162441. #else
  162442. "lsr r6, %[a], #16\n\t"
  162443. #endif
  162444. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162445. "lsrs r7, %[b], #16\n\t"
  162446. #else
  162447. "lsr r7, %[b], #16\n\t"
  162448. #endif
  162449. #ifdef WOLFSSL_KEIL
  162450. "muls r7, r6, r7\n\t"
  162451. #elif defined(__clang__)
  162452. "muls r7, r6\n\t"
  162453. #else
  162454. "mul r7, r6\n\t"
  162455. #endif
  162456. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162457. "adds r3, r3, r7\n\t"
  162458. #else
  162459. "add r3, r3, r7\n\t"
  162460. #endif
  162461. #ifdef WOLFSSL_KEIL
  162462. "adcs r4, r4, %[r]\n\t"
  162463. #elif defined(__clang__)
  162464. "adcs r4, %[r]\n\t"
  162465. #else
  162466. "adc r4, %[r]\n\t"
  162467. #endif
  162468. "uxth r7, %[b]\n\t"
  162469. #ifdef WOLFSSL_KEIL
  162470. "muls r6, r7, r6\n\t"
  162471. #elif defined(__clang__)
  162472. "muls r6, r7\n\t"
  162473. #else
  162474. "mul r6, r7\n\t"
  162475. #endif
  162476. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162477. "lsrs r7, r6, #16\n\t"
  162478. #else
  162479. "lsr r7, r6, #16\n\t"
  162480. #endif
  162481. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162482. "lsls r6, r6, #16\n\t"
  162483. #else
  162484. "lsl r6, r6, #16\n\t"
  162485. #endif
  162486. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162487. "adds r5, r5, r6\n\t"
  162488. #else
  162489. "add r5, r5, r6\n\t"
  162490. #endif
  162491. #ifdef WOLFSSL_KEIL
  162492. "adcs r3, r3, r7\n\t"
  162493. #elif defined(__clang__)
  162494. "adcs r3, r7\n\t"
  162495. #else
  162496. "adc r3, r7\n\t"
  162497. #endif
  162498. #ifdef WOLFSSL_KEIL
  162499. "adcs r4, r4, %[r]\n\t"
  162500. #elif defined(__clang__)
  162501. "adcs r4, %[r]\n\t"
  162502. #else
  162503. "adc r4, %[r]\n\t"
  162504. #endif
  162505. "# A[5] * B[15]\n\t"
  162506. "mov %[a], r9\n\t"
  162507. "mov %[b], r10\n\t"
  162508. "ldr %[a], [%[a], #20]\n\t"
  162509. "ldr %[b], [%[b], #60]\n\t"
  162510. "uxth r6, %[a]\n\t"
  162511. "uxth r7, %[b]\n\t"
  162512. #ifdef WOLFSSL_KEIL
  162513. "muls r7, r6, r7\n\t"
  162514. #elif defined(__clang__)
  162515. "muls r7, r6\n\t"
  162516. #else
  162517. "mul r7, r6\n\t"
  162518. #endif
  162519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162520. "adds r5, r5, r7\n\t"
  162521. #else
  162522. "add r5, r5, r7\n\t"
  162523. #endif
  162524. #ifdef WOLFSSL_KEIL
  162525. "adcs r3, r3, %[r]\n\t"
  162526. #elif defined(__clang__)
  162527. "adcs r3, %[r]\n\t"
  162528. #else
  162529. "adc r3, %[r]\n\t"
  162530. #endif
  162531. #ifdef WOLFSSL_KEIL
  162532. "adcs r4, r4, %[r]\n\t"
  162533. #elif defined(__clang__)
  162534. "adcs r4, %[r]\n\t"
  162535. #else
  162536. "adc r4, %[r]\n\t"
  162537. #endif
  162538. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162539. "lsrs r7, %[b], #16\n\t"
  162540. #else
  162541. "lsr r7, %[b], #16\n\t"
  162542. #endif
  162543. #ifdef WOLFSSL_KEIL
  162544. "muls r6, r7, r6\n\t"
  162545. #elif defined(__clang__)
  162546. "muls r6, r7\n\t"
  162547. #else
  162548. "mul r6, r7\n\t"
  162549. #endif
  162550. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162551. "lsrs r7, r6, #16\n\t"
  162552. #else
  162553. "lsr r7, r6, #16\n\t"
  162554. #endif
  162555. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162556. "lsls r6, r6, #16\n\t"
  162557. #else
  162558. "lsl r6, r6, #16\n\t"
  162559. #endif
  162560. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162561. "adds r5, r5, r6\n\t"
  162562. #else
  162563. "add r5, r5, r6\n\t"
  162564. #endif
  162565. #ifdef WOLFSSL_KEIL
  162566. "adcs r3, r3, r7\n\t"
  162567. #elif defined(__clang__)
  162568. "adcs r3, r7\n\t"
  162569. #else
  162570. "adc r3, r7\n\t"
  162571. #endif
  162572. #ifdef WOLFSSL_KEIL
  162573. "adcs r4, r4, %[r]\n\t"
  162574. #elif defined(__clang__)
  162575. "adcs r4, %[r]\n\t"
  162576. #else
  162577. "adc r4, %[r]\n\t"
  162578. #endif
  162579. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162580. "lsrs r6, %[a], #16\n\t"
  162581. #else
  162582. "lsr r6, %[a], #16\n\t"
  162583. #endif
  162584. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162585. "lsrs r7, %[b], #16\n\t"
  162586. #else
  162587. "lsr r7, %[b], #16\n\t"
  162588. #endif
  162589. #ifdef WOLFSSL_KEIL
  162590. "muls r7, r6, r7\n\t"
  162591. #elif defined(__clang__)
  162592. "muls r7, r6\n\t"
  162593. #else
  162594. "mul r7, r6\n\t"
  162595. #endif
  162596. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162597. "adds r3, r3, r7\n\t"
  162598. #else
  162599. "add r3, r3, r7\n\t"
  162600. #endif
  162601. #ifdef WOLFSSL_KEIL
  162602. "adcs r4, r4, %[r]\n\t"
  162603. #elif defined(__clang__)
  162604. "adcs r4, %[r]\n\t"
  162605. #else
  162606. "adc r4, %[r]\n\t"
  162607. #endif
  162608. "uxth r7, %[b]\n\t"
  162609. #ifdef WOLFSSL_KEIL
  162610. "muls r6, r7, r6\n\t"
  162611. #elif defined(__clang__)
  162612. "muls r6, r7\n\t"
  162613. #else
  162614. "mul r6, r7\n\t"
  162615. #endif
  162616. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162617. "lsrs r7, r6, #16\n\t"
  162618. #else
  162619. "lsr r7, r6, #16\n\t"
  162620. #endif
  162621. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162622. "lsls r6, r6, #16\n\t"
  162623. #else
  162624. "lsl r6, r6, #16\n\t"
  162625. #endif
  162626. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162627. "adds r5, r5, r6\n\t"
  162628. #else
  162629. "add r5, r5, r6\n\t"
  162630. #endif
  162631. #ifdef WOLFSSL_KEIL
  162632. "adcs r3, r3, r7\n\t"
  162633. #elif defined(__clang__)
  162634. "adcs r3, r7\n\t"
  162635. #else
  162636. "adc r3, r7\n\t"
  162637. #endif
  162638. #ifdef WOLFSSL_KEIL
  162639. "adcs r4, r4, %[r]\n\t"
  162640. #elif defined(__clang__)
  162641. "adcs r4, %[r]\n\t"
  162642. #else
  162643. "adc r4, %[r]\n\t"
  162644. #endif
  162645. "mov %[r], r8\n\t"
  162646. "str r5, [%[r], #80]\n\t"
  162647. "movs %[r], #0\n\t"
  162648. "# A[6] * B[15]\n\t"
  162649. "movs r5, #0\n\t"
  162650. "mov %[a], r9\n\t"
  162651. "mov %[b], r10\n\t"
  162652. "ldr %[a], [%[a], #24]\n\t"
  162653. "ldr %[b], [%[b], #60]\n\t"
  162654. "uxth r6, %[a]\n\t"
  162655. "uxth r7, %[b]\n\t"
  162656. #ifdef WOLFSSL_KEIL
  162657. "muls r7, r6, r7\n\t"
  162658. #elif defined(__clang__)
  162659. "muls r7, r6\n\t"
  162660. #else
  162661. "mul r7, r6\n\t"
  162662. #endif
  162663. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162664. "adds r3, r3, r7\n\t"
  162665. #else
  162666. "add r3, r3, r7\n\t"
  162667. #endif
  162668. #ifdef WOLFSSL_KEIL
  162669. "adcs r4, r4, %[r]\n\t"
  162670. #elif defined(__clang__)
  162671. "adcs r4, %[r]\n\t"
  162672. #else
  162673. "adc r4, %[r]\n\t"
  162674. #endif
  162675. #ifdef WOLFSSL_KEIL
  162676. "adcs r5, r5, %[r]\n\t"
  162677. #elif defined(__clang__)
  162678. "adcs r5, %[r]\n\t"
  162679. #else
  162680. "adc r5, %[r]\n\t"
  162681. #endif
  162682. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162683. "lsrs r7, %[b], #16\n\t"
  162684. #else
  162685. "lsr r7, %[b], #16\n\t"
  162686. #endif
  162687. #ifdef WOLFSSL_KEIL
  162688. "muls r6, r7, r6\n\t"
  162689. #elif defined(__clang__)
  162690. "muls r6, r7\n\t"
  162691. #else
  162692. "mul r6, r7\n\t"
  162693. #endif
  162694. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162695. "lsrs r7, r6, #16\n\t"
  162696. #else
  162697. "lsr r7, r6, #16\n\t"
  162698. #endif
  162699. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162700. "lsls r6, r6, #16\n\t"
  162701. #else
  162702. "lsl r6, r6, #16\n\t"
  162703. #endif
  162704. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162705. "adds r3, r3, r6\n\t"
  162706. #else
  162707. "add r3, r3, r6\n\t"
  162708. #endif
  162709. #ifdef WOLFSSL_KEIL
  162710. "adcs r4, r4, r7\n\t"
  162711. #elif defined(__clang__)
  162712. "adcs r4, r7\n\t"
  162713. #else
  162714. "adc r4, r7\n\t"
  162715. #endif
  162716. #ifdef WOLFSSL_KEIL
  162717. "adcs r5, r5, %[r]\n\t"
  162718. #elif defined(__clang__)
  162719. "adcs r5, %[r]\n\t"
  162720. #else
  162721. "adc r5, %[r]\n\t"
  162722. #endif
  162723. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162724. "lsrs r6, %[a], #16\n\t"
  162725. #else
  162726. "lsr r6, %[a], #16\n\t"
  162727. #endif
  162728. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162729. "lsrs r7, %[b], #16\n\t"
  162730. #else
  162731. "lsr r7, %[b], #16\n\t"
  162732. #endif
  162733. #ifdef WOLFSSL_KEIL
  162734. "muls r7, r6, r7\n\t"
  162735. #elif defined(__clang__)
  162736. "muls r7, r6\n\t"
  162737. #else
  162738. "mul r7, r6\n\t"
  162739. #endif
  162740. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162741. "adds r4, r4, r7\n\t"
  162742. #else
  162743. "add r4, r4, r7\n\t"
  162744. #endif
  162745. #ifdef WOLFSSL_KEIL
  162746. "adcs r5, r5, %[r]\n\t"
  162747. #elif defined(__clang__)
  162748. "adcs r5, %[r]\n\t"
  162749. #else
  162750. "adc r5, %[r]\n\t"
  162751. #endif
  162752. "uxth r7, %[b]\n\t"
  162753. #ifdef WOLFSSL_KEIL
  162754. "muls r6, r7, r6\n\t"
  162755. #elif defined(__clang__)
  162756. "muls r6, r7\n\t"
  162757. #else
  162758. "mul r6, r7\n\t"
  162759. #endif
  162760. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162761. "lsrs r7, r6, #16\n\t"
  162762. #else
  162763. "lsr r7, r6, #16\n\t"
  162764. #endif
  162765. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162766. "lsls r6, r6, #16\n\t"
  162767. #else
  162768. "lsl r6, r6, #16\n\t"
  162769. #endif
  162770. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162771. "adds r3, r3, r6\n\t"
  162772. #else
  162773. "add r3, r3, r6\n\t"
  162774. #endif
  162775. #ifdef WOLFSSL_KEIL
  162776. "adcs r4, r4, r7\n\t"
  162777. #elif defined(__clang__)
  162778. "adcs r4, r7\n\t"
  162779. #else
  162780. "adc r4, r7\n\t"
  162781. #endif
  162782. #ifdef WOLFSSL_KEIL
  162783. "adcs r5, r5, %[r]\n\t"
  162784. #elif defined(__clang__)
  162785. "adcs r5, %[r]\n\t"
  162786. #else
  162787. "adc r5, %[r]\n\t"
  162788. #endif
  162789. "# A[7] * B[14]\n\t"
  162790. "mov %[a], r9\n\t"
  162791. "mov %[b], r10\n\t"
  162792. "ldr %[a], [%[a], #28]\n\t"
  162793. "ldr %[b], [%[b], #56]\n\t"
  162794. "uxth r6, %[a]\n\t"
  162795. "uxth r7, %[b]\n\t"
  162796. #ifdef WOLFSSL_KEIL
  162797. "muls r7, r6, r7\n\t"
  162798. #elif defined(__clang__)
  162799. "muls r7, r6\n\t"
  162800. #else
  162801. "mul r7, r6\n\t"
  162802. #endif
  162803. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162804. "adds r3, r3, r7\n\t"
  162805. #else
  162806. "add r3, r3, r7\n\t"
  162807. #endif
  162808. #ifdef WOLFSSL_KEIL
  162809. "adcs r4, r4, %[r]\n\t"
  162810. #elif defined(__clang__)
  162811. "adcs r4, %[r]\n\t"
  162812. #else
  162813. "adc r4, %[r]\n\t"
  162814. #endif
  162815. #ifdef WOLFSSL_KEIL
  162816. "adcs r5, r5, %[r]\n\t"
  162817. #elif defined(__clang__)
  162818. "adcs r5, %[r]\n\t"
  162819. #else
  162820. "adc r5, %[r]\n\t"
  162821. #endif
  162822. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162823. "lsrs r7, %[b], #16\n\t"
  162824. #else
  162825. "lsr r7, %[b], #16\n\t"
  162826. #endif
  162827. #ifdef WOLFSSL_KEIL
  162828. "muls r6, r7, r6\n\t"
  162829. #elif defined(__clang__)
  162830. "muls r6, r7\n\t"
  162831. #else
  162832. "mul r6, r7\n\t"
  162833. #endif
  162834. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162835. "lsrs r7, r6, #16\n\t"
  162836. #else
  162837. "lsr r7, r6, #16\n\t"
  162838. #endif
  162839. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162840. "lsls r6, r6, #16\n\t"
  162841. #else
  162842. "lsl r6, r6, #16\n\t"
  162843. #endif
  162844. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162845. "adds r3, r3, r6\n\t"
  162846. #else
  162847. "add r3, r3, r6\n\t"
  162848. #endif
  162849. #ifdef WOLFSSL_KEIL
  162850. "adcs r4, r4, r7\n\t"
  162851. #elif defined(__clang__)
  162852. "adcs r4, r7\n\t"
  162853. #else
  162854. "adc r4, r7\n\t"
  162855. #endif
  162856. #ifdef WOLFSSL_KEIL
  162857. "adcs r5, r5, %[r]\n\t"
  162858. #elif defined(__clang__)
  162859. "adcs r5, %[r]\n\t"
  162860. #else
  162861. "adc r5, %[r]\n\t"
  162862. #endif
  162863. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162864. "lsrs r6, %[a], #16\n\t"
  162865. #else
  162866. "lsr r6, %[a], #16\n\t"
  162867. #endif
  162868. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162869. "lsrs r7, %[b], #16\n\t"
  162870. #else
  162871. "lsr r7, %[b], #16\n\t"
  162872. #endif
  162873. #ifdef WOLFSSL_KEIL
  162874. "muls r7, r6, r7\n\t"
  162875. #elif defined(__clang__)
  162876. "muls r7, r6\n\t"
  162877. #else
  162878. "mul r7, r6\n\t"
  162879. #endif
  162880. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162881. "adds r4, r4, r7\n\t"
  162882. #else
  162883. "add r4, r4, r7\n\t"
  162884. #endif
  162885. #ifdef WOLFSSL_KEIL
  162886. "adcs r5, r5, %[r]\n\t"
  162887. #elif defined(__clang__)
  162888. "adcs r5, %[r]\n\t"
  162889. #else
  162890. "adc r5, %[r]\n\t"
  162891. #endif
  162892. "uxth r7, %[b]\n\t"
  162893. #ifdef WOLFSSL_KEIL
  162894. "muls r6, r7, r6\n\t"
  162895. #elif defined(__clang__)
  162896. "muls r6, r7\n\t"
  162897. #else
  162898. "mul r6, r7\n\t"
  162899. #endif
  162900. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162901. "lsrs r7, r6, #16\n\t"
  162902. #else
  162903. "lsr r7, r6, #16\n\t"
  162904. #endif
  162905. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162906. "lsls r6, r6, #16\n\t"
  162907. #else
  162908. "lsl r6, r6, #16\n\t"
  162909. #endif
  162910. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162911. "adds r3, r3, r6\n\t"
  162912. #else
  162913. "add r3, r3, r6\n\t"
  162914. #endif
  162915. #ifdef WOLFSSL_KEIL
  162916. "adcs r4, r4, r7\n\t"
  162917. #elif defined(__clang__)
  162918. "adcs r4, r7\n\t"
  162919. #else
  162920. "adc r4, r7\n\t"
  162921. #endif
  162922. #ifdef WOLFSSL_KEIL
  162923. "adcs r5, r5, %[r]\n\t"
  162924. #elif defined(__clang__)
  162925. "adcs r5, %[r]\n\t"
  162926. #else
  162927. "adc r5, %[r]\n\t"
  162928. #endif
  162929. "# A[8] * B[13]\n\t"
  162930. "mov %[a], r9\n\t"
  162931. "mov %[b], r10\n\t"
  162932. "ldr %[a], [%[a], #32]\n\t"
  162933. "ldr %[b], [%[b], #52]\n\t"
  162934. "uxth r6, %[a]\n\t"
  162935. "uxth r7, %[b]\n\t"
  162936. #ifdef WOLFSSL_KEIL
  162937. "muls r7, r6, r7\n\t"
  162938. #elif defined(__clang__)
  162939. "muls r7, r6\n\t"
  162940. #else
  162941. "mul r7, r6\n\t"
  162942. #endif
  162943. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162944. "adds r3, r3, r7\n\t"
  162945. #else
  162946. "add r3, r3, r7\n\t"
  162947. #endif
  162948. #ifdef WOLFSSL_KEIL
  162949. "adcs r4, r4, %[r]\n\t"
  162950. #elif defined(__clang__)
  162951. "adcs r4, %[r]\n\t"
  162952. #else
  162953. "adc r4, %[r]\n\t"
  162954. #endif
  162955. #ifdef WOLFSSL_KEIL
  162956. "adcs r5, r5, %[r]\n\t"
  162957. #elif defined(__clang__)
  162958. "adcs r5, %[r]\n\t"
  162959. #else
  162960. "adc r5, %[r]\n\t"
  162961. #endif
  162962. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162963. "lsrs r7, %[b], #16\n\t"
  162964. #else
  162965. "lsr r7, %[b], #16\n\t"
  162966. #endif
  162967. #ifdef WOLFSSL_KEIL
  162968. "muls r6, r7, r6\n\t"
  162969. #elif defined(__clang__)
  162970. "muls r6, r7\n\t"
  162971. #else
  162972. "mul r6, r7\n\t"
  162973. #endif
  162974. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162975. "lsrs r7, r6, #16\n\t"
  162976. #else
  162977. "lsr r7, r6, #16\n\t"
  162978. #endif
  162979. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162980. "lsls r6, r6, #16\n\t"
  162981. #else
  162982. "lsl r6, r6, #16\n\t"
  162983. #endif
  162984. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162985. "adds r3, r3, r6\n\t"
  162986. #else
  162987. "add r3, r3, r6\n\t"
  162988. #endif
  162989. #ifdef WOLFSSL_KEIL
  162990. "adcs r4, r4, r7\n\t"
  162991. #elif defined(__clang__)
  162992. "adcs r4, r7\n\t"
  162993. #else
  162994. "adc r4, r7\n\t"
  162995. #endif
  162996. #ifdef WOLFSSL_KEIL
  162997. "adcs r5, r5, %[r]\n\t"
  162998. #elif defined(__clang__)
  162999. "adcs r5, %[r]\n\t"
  163000. #else
  163001. "adc r5, %[r]\n\t"
  163002. #endif
  163003. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163004. "lsrs r6, %[a], #16\n\t"
  163005. #else
  163006. "lsr r6, %[a], #16\n\t"
  163007. #endif
  163008. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163009. "lsrs r7, %[b], #16\n\t"
  163010. #else
  163011. "lsr r7, %[b], #16\n\t"
  163012. #endif
  163013. #ifdef WOLFSSL_KEIL
  163014. "muls r7, r6, r7\n\t"
  163015. #elif defined(__clang__)
  163016. "muls r7, r6\n\t"
  163017. #else
  163018. "mul r7, r6\n\t"
  163019. #endif
  163020. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163021. "adds r4, r4, r7\n\t"
  163022. #else
  163023. "add r4, r4, r7\n\t"
  163024. #endif
  163025. #ifdef WOLFSSL_KEIL
  163026. "adcs r5, r5, %[r]\n\t"
  163027. #elif defined(__clang__)
  163028. "adcs r5, %[r]\n\t"
  163029. #else
  163030. "adc r5, %[r]\n\t"
  163031. #endif
  163032. "uxth r7, %[b]\n\t"
  163033. #ifdef WOLFSSL_KEIL
  163034. "muls r6, r7, r6\n\t"
  163035. #elif defined(__clang__)
  163036. "muls r6, r7\n\t"
  163037. #else
  163038. "mul r6, r7\n\t"
  163039. #endif
  163040. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163041. "lsrs r7, r6, #16\n\t"
  163042. #else
  163043. "lsr r7, r6, #16\n\t"
  163044. #endif
  163045. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163046. "lsls r6, r6, #16\n\t"
  163047. #else
  163048. "lsl r6, r6, #16\n\t"
  163049. #endif
  163050. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163051. "adds r3, r3, r6\n\t"
  163052. #else
  163053. "add r3, r3, r6\n\t"
  163054. #endif
  163055. #ifdef WOLFSSL_KEIL
  163056. "adcs r4, r4, r7\n\t"
  163057. #elif defined(__clang__)
  163058. "adcs r4, r7\n\t"
  163059. #else
  163060. "adc r4, r7\n\t"
  163061. #endif
  163062. #ifdef WOLFSSL_KEIL
  163063. "adcs r5, r5, %[r]\n\t"
  163064. #elif defined(__clang__)
  163065. "adcs r5, %[r]\n\t"
  163066. #else
  163067. "adc r5, %[r]\n\t"
  163068. #endif
  163069. "# A[9] * B[12]\n\t"
  163070. "mov %[a], r9\n\t"
  163071. "mov %[b], r10\n\t"
  163072. "ldr %[a], [%[a], #36]\n\t"
  163073. "ldr %[b], [%[b], #48]\n\t"
  163074. "uxth r6, %[a]\n\t"
  163075. "uxth r7, %[b]\n\t"
  163076. #ifdef WOLFSSL_KEIL
  163077. "muls r7, r6, r7\n\t"
  163078. #elif defined(__clang__)
  163079. "muls r7, r6\n\t"
  163080. #else
  163081. "mul r7, r6\n\t"
  163082. #endif
  163083. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163084. "adds r3, r3, r7\n\t"
  163085. #else
  163086. "add r3, r3, r7\n\t"
  163087. #endif
  163088. #ifdef WOLFSSL_KEIL
  163089. "adcs r4, r4, %[r]\n\t"
  163090. #elif defined(__clang__)
  163091. "adcs r4, %[r]\n\t"
  163092. #else
  163093. "adc r4, %[r]\n\t"
  163094. #endif
  163095. #ifdef WOLFSSL_KEIL
  163096. "adcs r5, r5, %[r]\n\t"
  163097. #elif defined(__clang__)
  163098. "adcs r5, %[r]\n\t"
  163099. #else
  163100. "adc r5, %[r]\n\t"
  163101. #endif
  163102. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163103. "lsrs r7, %[b], #16\n\t"
  163104. #else
  163105. "lsr r7, %[b], #16\n\t"
  163106. #endif
  163107. #ifdef WOLFSSL_KEIL
  163108. "muls r6, r7, r6\n\t"
  163109. #elif defined(__clang__)
  163110. "muls r6, r7\n\t"
  163111. #else
  163112. "mul r6, r7\n\t"
  163113. #endif
  163114. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163115. "lsrs r7, r6, #16\n\t"
  163116. #else
  163117. "lsr r7, r6, #16\n\t"
  163118. #endif
  163119. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163120. "lsls r6, r6, #16\n\t"
  163121. #else
  163122. "lsl r6, r6, #16\n\t"
  163123. #endif
  163124. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163125. "adds r3, r3, r6\n\t"
  163126. #else
  163127. "add r3, r3, r6\n\t"
  163128. #endif
  163129. #ifdef WOLFSSL_KEIL
  163130. "adcs r4, r4, r7\n\t"
  163131. #elif defined(__clang__)
  163132. "adcs r4, r7\n\t"
  163133. #else
  163134. "adc r4, r7\n\t"
  163135. #endif
  163136. #ifdef WOLFSSL_KEIL
  163137. "adcs r5, r5, %[r]\n\t"
  163138. #elif defined(__clang__)
  163139. "adcs r5, %[r]\n\t"
  163140. #else
  163141. "adc r5, %[r]\n\t"
  163142. #endif
  163143. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163144. "lsrs r6, %[a], #16\n\t"
  163145. #else
  163146. "lsr r6, %[a], #16\n\t"
  163147. #endif
  163148. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163149. "lsrs r7, %[b], #16\n\t"
  163150. #else
  163151. "lsr r7, %[b], #16\n\t"
  163152. #endif
  163153. #ifdef WOLFSSL_KEIL
  163154. "muls r7, r6, r7\n\t"
  163155. #elif defined(__clang__)
  163156. "muls r7, r6\n\t"
  163157. #else
  163158. "mul r7, r6\n\t"
  163159. #endif
  163160. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163161. "adds r4, r4, r7\n\t"
  163162. #else
  163163. "add r4, r4, r7\n\t"
  163164. #endif
  163165. #ifdef WOLFSSL_KEIL
  163166. "adcs r5, r5, %[r]\n\t"
  163167. #elif defined(__clang__)
  163168. "adcs r5, %[r]\n\t"
  163169. #else
  163170. "adc r5, %[r]\n\t"
  163171. #endif
  163172. "uxth r7, %[b]\n\t"
  163173. #ifdef WOLFSSL_KEIL
  163174. "muls r6, r7, r6\n\t"
  163175. #elif defined(__clang__)
  163176. "muls r6, r7\n\t"
  163177. #else
  163178. "mul r6, r7\n\t"
  163179. #endif
  163180. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163181. "lsrs r7, r6, #16\n\t"
  163182. #else
  163183. "lsr r7, r6, #16\n\t"
  163184. #endif
  163185. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163186. "lsls r6, r6, #16\n\t"
  163187. #else
  163188. "lsl r6, r6, #16\n\t"
  163189. #endif
  163190. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163191. "adds r3, r3, r6\n\t"
  163192. #else
  163193. "add r3, r3, r6\n\t"
  163194. #endif
  163195. #ifdef WOLFSSL_KEIL
  163196. "adcs r4, r4, r7\n\t"
  163197. #elif defined(__clang__)
  163198. "adcs r4, r7\n\t"
  163199. #else
  163200. "adc r4, r7\n\t"
  163201. #endif
  163202. #ifdef WOLFSSL_KEIL
  163203. "adcs r5, r5, %[r]\n\t"
  163204. #elif defined(__clang__)
  163205. "adcs r5, %[r]\n\t"
  163206. #else
  163207. "adc r5, %[r]\n\t"
  163208. #endif
  163209. "# A[10] * B[11]\n\t"
  163210. "mov %[a], r9\n\t"
  163211. "mov %[b], r10\n\t"
  163212. "ldr %[a], [%[a], #40]\n\t"
  163213. "ldr %[b], [%[b], #44]\n\t"
  163214. "uxth r6, %[a]\n\t"
  163215. "uxth r7, %[b]\n\t"
  163216. #ifdef WOLFSSL_KEIL
  163217. "muls r7, r6, r7\n\t"
  163218. #elif defined(__clang__)
  163219. "muls r7, r6\n\t"
  163220. #else
  163221. "mul r7, r6\n\t"
  163222. #endif
  163223. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163224. "adds r3, r3, r7\n\t"
  163225. #else
  163226. "add r3, r3, r7\n\t"
  163227. #endif
  163228. #ifdef WOLFSSL_KEIL
  163229. "adcs r4, r4, %[r]\n\t"
  163230. #elif defined(__clang__)
  163231. "adcs r4, %[r]\n\t"
  163232. #else
  163233. "adc r4, %[r]\n\t"
  163234. #endif
  163235. #ifdef WOLFSSL_KEIL
  163236. "adcs r5, r5, %[r]\n\t"
  163237. #elif defined(__clang__)
  163238. "adcs r5, %[r]\n\t"
  163239. #else
  163240. "adc r5, %[r]\n\t"
  163241. #endif
  163242. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163243. "lsrs r7, %[b], #16\n\t"
  163244. #else
  163245. "lsr r7, %[b], #16\n\t"
  163246. #endif
  163247. #ifdef WOLFSSL_KEIL
  163248. "muls r6, r7, r6\n\t"
  163249. #elif defined(__clang__)
  163250. "muls r6, r7\n\t"
  163251. #else
  163252. "mul r6, r7\n\t"
  163253. #endif
  163254. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163255. "lsrs r7, r6, #16\n\t"
  163256. #else
  163257. "lsr r7, r6, #16\n\t"
  163258. #endif
  163259. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163260. "lsls r6, r6, #16\n\t"
  163261. #else
  163262. "lsl r6, r6, #16\n\t"
  163263. #endif
  163264. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163265. "adds r3, r3, r6\n\t"
  163266. #else
  163267. "add r3, r3, r6\n\t"
  163268. #endif
  163269. #ifdef WOLFSSL_KEIL
  163270. "adcs r4, r4, r7\n\t"
  163271. #elif defined(__clang__)
  163272. "adcs r4, r7\n\t"
  163273. #else
  163274. "adc r4, r7\n\t"
  163275. #endif
  163276. #ifdef WOLFSSL_KEIL
  163277. "adcs r5, r5, %[r]\n\t"
  163278. #elif defined(__clang__)
  163279. "adcs r5, %[r]\n\t"
  163280. #else
  163281. "adc r5, %[r]\n\t"
  163282. #endif
  163283. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163284. "lsrs r6, %[a], #16\n\t"
  163285. #else
  163286. "lsr r6, %[a], #16\n\t"
  163287. #endif
  163288. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163289. "lsrs r7, %[b], #16\n\t"
  163290. #else
  163291. "lsr r7, %[b], #16\n\t"
  163292. #endif
  163293. #ifdef WOLFSSL_KEIL
  163294. "muls r7, r6, r7\n\t"
  163295. #elif defined(__clang__)
  163296. "muls r7, r6\n\t"
  163297. #else
  163298. "mul r7, r6\n\t"
  163299. #endif
  163300. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163301. "adds r4, r4, r7\n\t"
  163302. #else
  163303. "add r4, r4, r7\n\t"
  163304. #endif
  163305. #ifdef WOLFSSL_KEIL
  163306. "adcs r5, r5, %[r]\n\t"
  163307. #elif defined(__clang__)
  163308. "adcs r5, %[r]\n\t"
  163309. #else
  163310. "adc r5, %[r]\n\t"
  163311. #endif
  163312. "uxth r7, %[b]\n\t"
  163313. #ifdef WOLFSSL_KEIL
  163314. "muls r6, r7, r6\n\t"
  163315. #elif defined(__clang__)
  163316. "muls r6, r7\n\t"
  163317. #else
  163318. "mul r6, r7\n\t"
  163319. #endif
  163320. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163321. "lsrs r7, r6, #16\n\t"
  163322. #else
  163323. "lsr r7, r6, #16\n\t"
  163324. #endif
  163325. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163326. "lsls r6, r6, #16\n\t"
  163327. #else
  163328. "lsl r6, r6, #16\n\t"
  163329. #endif
  163330. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163331. "adds r3, r3, r6\n\t"
  163332. #else
  163333. "add r3, r3, r6\n\t"
  163334. #endif
  163335. #ifdef WOLFSSL_KEIL
  163336. "adcs r4, r4, r7\n\t"
  163337. #elif defined(__clang__)
  163338. "adcs r4, r7\n\t"
  163339. #else
  163340. "adc r4, r7\n\t"
  163341. #endif
  163342. #ifdef WOLFSSL_KEIL
  163343. "adcs r5, r5, %[r]\n\t"
  163344. #elif defined(__clang__)
  163345. "adcs r5, %[r]\n\t"
  163346. #else
  163347. "adc r5, %[r]\n\t"
  163348. #endif
  163349. "# A[11] * B[10]\n\t"
  163350. "mov %[a], r9\n\t"
  163351. "mov %[b], r10\n\t"
  163352. "ldr %[a], [%[a], #44]\n\t"
  163353. "ldr %[b], [%[b], #40]\n\t"
  163354. "uxth r6, %[a]\n\t"
  163355. "uxth r7, %[b]\n\t"
  163356. #ifdef WOLFSSL_KEIL
  163357. "muls r7, r6, r7\n\t"
  163358. #elif defined(__clang__)
  163359. "muls r7, r6\n\t"
  163360. #else
  163361. "mul r7, r6\n\t"
  163362. #endif
  163363. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163364. "adds r3, r3, r7\n\t"
  163365. #else
  163366. "add r3, r3, r7\n\t"
  163367. #endif
  163368. #ifdef WOLFSSL_KEIL
  163369. "adcs r4, r4, %[r]\n\t"
  163370. #elif defined(__clang__)
  163371. "adcs r4, %[r]\n\t"
  163372. #else
  163373. "adc r4, %[r]\n\t"
  163374. #endif
  163375. #ifdef WOLFSSL_KEIL
  163376. "adcs r5, r5, %[r]\n\t"
  163377. #elif defined(__clang__)
  163378. "adcs r5, %[r]\n\t"
  163379. #else
  163380. "adc r5, %[r]\n\t"
  163381. #endif
  163382. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163383. "lsrs r7, %[b], #16\n\t"
  163384. #else
  163385. "lsr r7, %[b], #16\n\t"
  163386. #endif
  163387. #ifdef WOLFSSL_KEIL
  163388. "muls r6, r7, r6\n\t"
  163389. #elif defined(__clang__)
  163390. "muls r6, r7\n\t"
  163391. #else
  163392. "mul r6, r7\n\t"
  163393. #endif
  163394. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163395. "lsrs r7, r6, #16\n\t"
  163396. #else
  163397. "lsr r7, r6, #16\n\t"
  163398. #endif
  163399. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163400. "lsls r6, r6, #16\n\t"
  163401. #else
  163402. "lsl r6, r6, #16\n\t"
  163403. #endif
  163404. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163405. "adds r3, r3, r6\n\t"
  163406. #else
  163407. "add r3, r3, r6\n\t"
  163408. #endif
  163409. #ifdef WOLFSSL_KEIL
  163410. "adcs r4, r4, r7\n\t"
  163411. #elif defined(__clang__)
  163412. "adcs r4, r7\n\t"
  163413. #else
  163414. "adc r4, r7\n\t"
  163415. #endif
  163416. #ifdef WOLFSSL_KEIL
  163417. "adcs r5, r5, %[r]\n\t"
  163418. #elif defined(__clang__)
  163419. "adcs r5, %[r]\n\t"
  163420. #else
  163421. "adc r5, %[r]\n\t"
  163422. #endif
  163423. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163424. "lsrs r6, %[a], #16\n\t"
  163425. #else
  163426. "lsr r6, %[a], #16\n\t"
  163427. #endif
  163428. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163429. "lsrs r7, %[b], #16\n\t"
  163430. #else
  163431. "lsr r7, %[b], #16\n\t"
  163432. #endif
  163433. #ifdef WOLFSSL_KEIL
  163434. "muls r7, r6, r7\n\t"
  163435. #elif defined(__clang__)
  163436. "muls r7, r6\n\t"
  163437. #else
  163438. "mul r7, r6\n\t"
  163439. #endif
  163440. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163441. "adds r4, r4, r7\n\t"
  163442. #else
  163443. "add r4, r4, r7\n\t"
  163444. #endif
  163445. #ifdef WOLFSSL_KEIL
  163446. "adcs r5, r5, %[r]\n\t"
  163447. #elif defined(__clang__)
  163448. "adcs r5, %[r]\n\t"
  163449. #else
  163450. "adc r5, %[r]\n\t"
  163451. #endif
  163452. "uxth r7, %[b]\n\t"
  163453. #ifdef WOLFSSL_KEIL
  163454. "muls r6, r7, r6\n\t"
  163455. #elif defined(__clang__)
  163456. "muls r6, r7\n\t"
  163457. #else
  163458. "mul r6, r7\n\t"
  163459. #endif
  163460. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163461. "lsrs r7, r6, #16\n\t"
  163462. #else
  163463. "lsr r7, r6, #16\n\t"
  163464. #endif
  163465. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163466. "lsls r6, r6, #16\n\t"
  163467. #else
  163468. "lsl r6, r6, #16\n\t"
  163469. #endif
  163470. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163471. "adds r3, r3, r6\n\t"
  163472. #else
  163473. "add r3, r3, r6\n\t"
  163474. #endif
  163475. #ifdef WOLFSSL_KEIL
  163476. "adcs r4, r4, r7\n\t"
  163477. #elif defined(__clang__)
  163478. "adcs r4, r7\n\t"
  163479. #else
  163480. "adc r4, r7\n\t"
  163481. #endif
  163482. #ifdef WOLFSSL_KEIL
  163483. "adcs r5, r5, %[r]\n\t"
  163484. #elif defined(__clang__)
  163485. "adcs r5, %[r]\n\t"
  163486. #else
  163487. "adc r5, %[r]\n\t"
  163488. #endif
  163489. "# A[12] * B[9]\n\t"
  163490. "mov %[a], r9\n\t"
  163491. "mov %[b], r10\n\t"
  163492. "ldr %[a], [%[a], #48]\n\t"
  163493. "ldr %[b], [%[b], #36]\n\t"
  163494. "uxth r6, %[a]\n\t"
  163495. "uxth r7, %[b]\n\t"
  163496. #ifdef WOLFSSL_KEIL
  163497. "muls r7, r6, r7\n\t"
  163498. #elif defined(__clang__)
  163499. "muls r7, r6\n\t"
  163500. #else
  163501. "mul r7, r6\n\t"
  163502. #endif
  163503. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163504. "adds r3, r3, r7\n\t"
  163505. #else
  163506. "add r3, r3, r7\n\t"
  163507. #endif
  163508. #ifdef WOLFSSL_KEIL
  163509. "adcs r4, r4, %[r]\n\t"
  163510. #elif defined(__clang__)
  163511. "adcs r4, %[r]\n\t"
  163512. #else
  163513. "adc r4, %[r]\n\t"
  163514. #endif
  163515. #ifdef WOLFSSL_KEIL
  163516. "adcs r5, r5, %[r]\n\t"
  163517. #elif defined(__clang__)
  163518. "adcs r5, %[r]\n\t"
  163519. #else
  163520. "adc r5, %[r]\n\t"
  163521. #endif
  163522. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163523. "lsrs r7, %[b], #16\n\t"
  163524. #else
  163525. "lsr r7, %[b], #16\n\t"
  163526. #endif
  163527. #ifdef WOLFSSL_KEIL
  163528. "muls r6, r7, r6\n\t"
  163529. #elif defined(__clang__)
  163530. "muls r6, r7\n\t"
  163531. #else
  163532. "mul r6, r7\n\t"
  163533. #endif
  163534. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163535. "lsrs r7, r6, #16\n\t"
  163536. #else
  163537. "lsr r7, r6, #16\n\t"
  163538. #endif
  163539. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163540. "lsls r6, r6, #16\n\t"
  163541. #else
  163542. "lsl r6, r6, #16\n\t"
  163543. #endif
  163544. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163545. "adds r3, r3, r6\n\t"
  163546. #else
  163547. "add r3, r3, r6\n\t"
  163548. #endif
  163549. #ifdef WOLFSSL_KEIL
  163550. "adcs r4, r4, r7\n\t"
  163551. #elif defined(__clang__)
  163552. "adcs r4, r7\n\t"
  163553. #else
  163554. "adc r4, r7\n\t"
  163555. #endif
  163556. #ifdef WOLFSSL_KEIL
  163557. "adcs r5, r5, %[r]\n\t"
  163558. #elif defined(__clang__)
  163559. "adcs r5, %[r]\n\t"
  163560. #else
  163561. "adc r5, %[r]\n\t"
  163562. #endif
  163563. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163564. "lsrs r6, %[a], #16\n\t"
  163565. #else
  163566. "lsr r6, %[a], #16\n\t"
  163567. #endif
  163568. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163569. "lsrs r7, %[b], #16\n\t"
  163570. #else
  163571. "lsr r7, %[b], #16\n\t"
  163572. #endif
  163573. #ifdef WOLFSSL_KEIL
  163574. "muls r7, r6, r7\n\t"
  163575. #elif defined(__clang__)
  163576. "muls r7, r6\n\t"
  163577. #else
  163578. "mul r7, r6\n\t"
  163579. #endif
  163580. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163581. "adds r4, r4, r7\n\t"
  163582. #else
  163583. "add r4, r4, r7\n\t"
  163584. #endif
  163585. #ifdef WOLFSSL_KEIL
  163586. "adcs r5, r5, %[r]\n\t"
  163587. #elif defined(__clang__)
  163588. "adcs r5, %[r]\n\t"
  163589. #else
  163590. "adc r5, %[r]\n\t"
  163591. #endif
  163592. "uxth r7, %[b]\n\t"
  163593. #ifdef WOLFSSL_KEIL
  163594. "muls r6, r7, r6\n\t"
  163595. #elif defined(__clang__)
  163596. "muls r6, r7\n\t"
  163597. #else
  163598. "mul r6, r7\n\t"
  163599. #endif
  163600. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163601. "lsrs r7, r6, #16\n\t"
  163602. #else
  163603. "lsr r7, r6, #16\n\t"
  163604. #endif
  163605. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163606. "lsls r6, r6, #16\n\t"
  163607. #else
  163608. "lsl r6, r6, #16\n\t"
  163609. #endif
  163610. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163611. "adds r3, r3, r6\n\t"
  163612. #else
  163613. "add r3, r3, r6\n\t"
  163614. #endif
  163615. #ifdef WOLFSSL_KEIL
  163616. "adcs r4, r4, r7\n\t"
  163617. #elif defined(__clang__)
  163618. "adcs r4, r7\n\t"
  163619. #else
  163620. "adc r4, r7\n\t"
  163621. #endif
  163622. #ifdef WOLFSSL_KEIL
  163623. "adcs r5, r5, %[r]\n\t"
  163624. #elif defined(__clang__)
  163625. "adcs r5, %[r]\n\t"
  163626. #else
  163627. "adc r5, %[r]\n\t"
  163628. #endif
  163629. "# A[13] * B[8]\n\t"
  163630. "mov %[a], r9\n\t"
  163631. "mov %[b], r10\n\t"
  163632. "ldr %[a], [%[a], #52]\n\t"
  163633. "ldr %[b], [%[b], #32]\n\t"
  163634. "uxth r6, %[a]\n\t"
  163635. "uxth r7, %[b]\n\t"
  163636. #ifdef WOLFSSL_KEIL
  163637. "muls r7, r6, r7\n\t"
  163638. #elif defined(__clang__)
  163639. "muls r7, r6\n\t"
  163640. #else
  163641. "mul r7, r6\n\t"
  163642. #endif
  163643. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163644. "adds r3, r3, r7\n\t"
  163645. #else
  163646. "add r3, r3, r7\n\t"
  163647. #endif
  163648. #ifdef WOLFSSL_KEIL
  163649. "adcs r4, r4, %[r]\n\t"
  163650. #elif defined(__clang__)
  163651. "adcs r4, %[r]\n\t"
  163652. #else
  163653. "adc r4, %[r]\n\t"
  163654. #endif
  163655. #ifdef WOLFSSL_KEIL
  163656. "adcs r5, r5, %[r]\n\t"
  163657. #elif defined(__clang__)
  163658. "adcs r5, %[r]\n\t"
  163659. #else
  163660. "adc r5, %[r]\n\t"
  163661. #endif
  163662. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163663. "lsrs r7, %[b], #16\n\t"
  163664. #else
  163665. "lsr r7, %[b], #16\n\t"
  163666. #endif
  163667. #ifdef WOLFSSL_KEIL
  163668. "muls r6, r7, r6\n\t"
  163669. #elif defined(__clang__)
  163670. "muls r6, r7\n\t"
  163671. #else
  163672. "mul r6, r7\n\t"
  163673. #endif
  163674. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163675. "lsrs r7, r6, #16\n\t"
  163676. #else
  163677. "lsr r7, r6, #16\n\t"
  163678. #endif
  163679. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163680. "lsls r6, r6, #16\n\t"
  163681. #else
  163682. "lsl r6, r6, #16\n\t"
  163683. #endif
  163684. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163685. "adds r3, r3, r6\n\t"
  163686. #else
  163687. "add r3, r3, r6\n\t"
  163688. #endif
  163689. #ifdef WOLFSSL_KEIL
  163690. "adcs r4, r4, r7\n\t"
  163691. #elif defined(__clang__)
  163692. "adcs r4, r7\n\t"
  163693. #else
  163694. "adc r4, r7\n\t"
  163695. #endif
  163696. #ifdef WOLFSSL_KEIL
  163697. "adcs r5, r5, %[r]\n\t"
  163698. #elif defined(__clang__)
  163699. "adcs r5, %[r]\n\t"
  163700. #else
  163701. "adc r5, %[r]\n\t"
  163702. #endif
  163703. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163704. "lsrs r6, %[a], #16\n\t"
  163705. #else
  163706. "lsr r6, %[a], #16\n\t"
  163707. #endif
  163708. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163709. "lsrs r7, %[b], #16\n\t"
  163710. #else
  163711. "lsr r7, %[b], #16\n\t"
  163712. #endif
  163713. #ifdef WOLFSSL_KEIL
  163714. "muls r7, r6, r7\n\t"
  163715. #elif defined(__clang__)
  163716. "muls r7, r6\n\t"
  163717. #else
  163718. "mul r7, r6\n\t"
  163719. #endif
  163720. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163721. "adds r4, r4, r7\n\t"
  163722. #else
  163723. "add r4, r4, r7\n\t"
  163724. #endif
  163725. #ifdef WOLFSSL_KEIL
  163726. "adcs r5, r5, %[r]\n\t"
  163727. #elif defined(__clang__)
  163728. "adcs r5, %[r]\n\t"
  163729. #else
  163730. "adc r5, %[r]\n\t"
  163731. #endif
  163732. "uxth r7, %[b]\n\t"
  163733. #ifdef WOLFSSL_KEIL
  163734. "muls r6, r7, r6\n\t"
  163735. #elif defined(__clang__)
  163736. "muls r6, r7\n\t"
  163737. #else
  163738. "mul r6, r7\n\t"
  163739. #endif
  163740. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163741. "lsrs r7, r6, #16\n\t"
  163742. #else
  163743. "lsr r7, r6, #16\n\t"
  163744. #endif
  163745. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163746. "lsls r6, r6, #16\n\t"
  163747. #else
  163748. "lsl r6, r6, #16\n\t"
  163749. #endif
  163750. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163751. "adds r3, r3, r6\n\t"
  163752. #else
  163753. "add r3, r3, r6\n\t"
  163754. #endif
  163755. #ifdef WOLFSSL_KEIL
  163756. "adcs r4, r4, r7\n\t"
  163757. #elif defined(__clang__)
  163758. "adcs r4, r7\n\t"
  163759. #else
  163760. "adc r4, r7\n\t"
  163761. #endif
  163762. #ifdef WOLFSSL_KEIL
  163763. "adcs r5, r5, %[r]\n\t"
  163764. #elif defined(__clang__)
  163765. "adcs r5, %[r]\n\t"
  163766. #else
  163767. "adc r5, %[r]\n\t"
  163768. #endif
  163769. "# A[14] * B[7]\n\t"
  163770. "mov %[a], r9\n\t"
  163771. "mov %[b], r10\n\t"
  163772. "ldr %[a], [%[a], #56]\n\t"
  163773. "ldr %[b], [%[b], #28]\n\t"
  163774. "uxth r6, %[a]\n\t"
  163775. "uxth r7, %[b]\n\t"
  163776. #ifdef WOLFSSL_KEIL
  163777. "muls r7, r6, r7\n\t"
  163778. #elif defined(__clang__)
  163779. "muls r7, r6\n\t"
  163780. #else
  163781. "mul r7, r6\n\t"
  163782. #endif
  163783. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163784. "adds r3, r3, r7\n\t"
  163785. #else
  163786. "add r3, r3, r7\n\t"
  163787. #endif
  163788. #ifdef WOLFSSL_KEIL
  163789. "adcs r4, r4, %[r]\n\t"
  163790. #elif defined(__clang__)
  163791. "adcs r4, %[r]\n\t"
  163792. #else
  163793. "adc r4, %[r]\n\t"
  163794. #endif
  163795. #ifdef WOLFSSL_KEIL
  163796. "adcs r5, r5, %[r]\n\t"
  163797. #elif defined(__clang__)
  163798. "adcs r5, %[r]\n\t"
  163799. #else
  163800. "adc r5, %[r]\n\t"
  163801. #endif
  163802. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163803. "lsrs r7, %[b], #16\n\t"
  163804. #else
  163805. "lsr r7, %[b], #16\n\t"
  163806. #endif
  163807. #ifdef WOLFSSL_KEIL
  163808. "muls r6, r7, r6\n\t"
  163809. #elif defined(__clang__)
  163810. "muls r6, r7\n\t"
  163811. #else
  163812. "mul r6, r7\n\t"
  163813. #endif
  163814. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163815. "lsrs r7, r6, #16\n\t"
  163816. #else
  163817. "lsr r7, r6, #16\n\t"
  163818. #endif
  163819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163820. "lsls r6, r6, #16\n\t"
  163821. #else
  163822. "lsl r6, r6, #16\n\t"
  163823. #endif
  163824. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163825. "adds r3, r3, r6\n\t"
  163826. #else
  163827. "add r3, r3, r6\n\t"
  163828. #endif
  163829. #ifdef WOLFSSL_KEIL
  163830. "adcs r4, r4, r7\n\t"
  163831. #elif defined(__clang__)
  163832. "adcs r4, r7\n\t"
  163833. #else
  163834. "adc r4, r7\n\t"
  163835. #endif
  163836. #ifdef WOLFSSL_KEIL
  163837. "adcs r5, r5, %[r]\n\t"
  163838. #elif defined(__clang__)
  163839. "adcs r5, %[r]\n\t"
  163840. #else
  163841. "adc r5, %[r]\n\t"
  163842. #endif
  163843. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163844. "lsrs r6, %[a], #16\n\t"
  163845. #else
  163846. "lsr r6, %[a], #16\n\t"
  163847. #endif
  163848. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163849. "lsrs r7, %[b], #16\n\t"
  163850. #else
  163851. "lsr r7, %[b], #16\n\t"
  163852. #endif
  163853. #ifdef WOLFSSL_KEIL
  163854. "muls r7, r6, r7\n\t"
  163855. #elif defined(__clang__)
  163856. "muls r7, r6\n\t"
  163857. #else
  163858. "mul r7, r6\n\t"
  163859. #endif
  163860. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163861. "adds r4, r4, r7\n\t"
  163862. #else
  163863. "add r4, r4, r7\n\t"
  163864. #endif
  163865. #ifdef WOLFSSL_KEIL
  163866. "adcs r5, r5, %[r]\n\t"
  163867. #elif defined(__clang__)
  163868. "adcs r5, %[r]\n\t"
  163869. #else
  163870. "adc r5, %[r]\n\t"
  163871. #endif
  163872. "uxth r7, %[b]\n\t"
  163873. #ifdef WOLFSSL_KEIL
  163874. "muls r6, r7, r6\n\t"
  163875. #elif defined(__clang__)
  163876. "muls r6, r7\n\t"
  163877. #else
  163878. "mul r6, r7\n\t"
  163879. #endif
  163880. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163881. "lsrs r7, r6, #16\n\t"
  163882. #else
  163883. "lsr r7, r6, #16\n\t"
  163884. #endif
  163885. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163886. "lsls r6, r6, #16\n\t"
  163887. #else
  163888. "lsl r6, r6, #16\n\t"
  163889. #endif
  163890. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163891. "adds r3, r3, r6\n\t"
  163892. #else
  163893. "add r3, r3, r6\n\t"
  163894. #endif
  163895. #ifdef WOLFSSL_KEIL
  163896. "adcs r4, r4, r7\n\t"
  163897. #elif defined(__clang__)
  163898. "adcs r4, r7\n\t"
  163899. #else
  163900. "adc r4, r7\n\t"
  163901. #endif
  163902. #ifdef WOLFSSL_KEIL
  163903. "adcs r5, r5, %[r]\n\t"
  163904. #elif defined(__clang__)
  163905. "adcs r5, %[r]\n\t"
  163906. #else
  163907. "adc r5, %[r]\n\t"
  163908. #endif
  163909. "# A[15] * B[6]\n\t"
  163910. "mov %[a], r9\n\t"
  163911. "mov %[b], r10\n\t"
  163912. "ldr %[a], [%[a], #60]\n\t"
  163913. "ldr %[b], [%[b], #24]\n\t"
  163914. "uxth r6, %[a]\n\t"
  163915. "uxth r7, %[b]\n\t"
  163916. #ifdef WOLFSSL_KEIL
  163917. "muls r7, r6, r7\n\t"
  163918. #elif defined(__clang__)
  163919. "muls r7, r6\n\t"
  163920. #else
  163921. "mul r7, r6\n\t"
  163922. #endif
  163923. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163924. "adds r3, r3, r7\n\t"
  163925. #else
  163926. "add r3, r3, r7\n\t"
  163927. #endif
  163928. #ifdef WOLFSSL_KEIL
  163929. "adcs r4, r4, %[r]\n\t"
  163930. #elif defined(__clang__)
  163931. "adcs r4, %[r]\n\t"
  163932. #else
  163933. "adc r4, %[r]\n\t"
  163934. #endif
  163935. #ifdef WOLFSSL_KEIL
  163936. "adcs r5, r5, %[r]\n\t"
  163937. #elif defined(__clang__)
  163938. "adcs r5, %[r]\n\t"
  163939. #else
  163940. "adc r5, %[r]\n\t"
  163941. #endif
  163942. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163943. "lsrs r7, %[b], #16\n\t"
  163944. #else
  163945. "lsr r7, %[b], #16\n\t"
  163946. #endif
  163947. #ifdef WOLFSSL_KEIL
  163948. "muls r6, r7, r6\n\t"
  163949. #elif defined(__clang__)
  163950. "muls r6, r7\n\t"
  163951. #else
  163952. "mul r6, r7\n\t"
  163953. #endif
  163954. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163955. "lsrs r7, r6, #16\n\t"
  163956. #else
  163957. "lsr r7, r6, #16\n\t"
  163958. #endif
  163959. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163960. "lsls r6, r6, #16\n\t"
  163961. #else
  163962. "lsl r6, r6, #16\n\t"
  163963. #endif
  163964. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163965. "adds r3, r3, r6\n\t"
  163966. #else
  163967. "add r3, r3, r6\n\t"
  163968. #endif
  163969. #ifdef WOLFSSL_KEIL
  163970. "adcs r4, r4, r7\n\t"
  163971. #elif defined(__clang__)
  163972. "adcs r4, r7\n\t"
  163973. #else
  163974. "adc r4, r7\n\t"
  163975. #endif
  163976. #ifdef WOLFSSL_KEIL
  163977. "adcs r5, r5, %[r]\n\t"
  163978. #elif defined(__clang__)
  163979. "adcs r5, %[r]\n\t"
  163980. #else
  163981. "adc r5, %[r]\n\t"
  163982. #endif
  163983. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163984. "lsrs r6, %[a], #16\n\t"
  163985. #else
  163986. "lsr r6, %[a], #16\n\t"
  163987. #endif
  163988. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163989. "lsrs r7, %[b], #16\n\t"
  163990. #else
  163991. "lsr r7, %[b], #16\n\t"
  163992. #endif
  163993. #ifdef WOLFSSL_KEIL
  163994. "muls r7, r6, r7\n\t"
  163995. #elif defined(__clang__)
  163996. "muls r7, r6\n\t"
  163997. #else
  163998. "mul r7, r6\n\t"
  163999. #endif
  164000. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164001. "adds r4, r4, r7\n\t"
  164002. #else
  164003. "add r4, r4, r7\n\t"
  164004. #endif
  164005. #ifdef WOLFSSL_KEIL
  164006. "adcs r5, r5, %[r]\n\t"
  164007. #elif defined(__clang__)
  164008. "adcs r5, %[r]\n\t"
  164009. #else
  164010. "adc r5, %[r]\n\t"
  164011. #endif
  164012. "uxth r7, %[b]\n\t"
  164013. #ifdef WOLFSSL_KEIL
  164014. "muls r6, r7, r6\n\t"
  164015. #elif defined(__clang__)
  164016. "muls r6, r7\n\t"
  164017. #else
  164018. "mul r6, r7\n\t"
  164019. #endif
  164020. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164021. "lsrs r7, r6, #16\n\t"
  164022. #else
  164023. "lsr r7, r6, #16\n\t"
  164024. #endif
  164025. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164026. "lsls r6, r6, #16\n\t"
  164027. #else
  164028. "lsl r6, r6, #16\n\t"
  164029. #endif
  164030. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164031. "adds r3, r3, r6\n\t"
  164032. #else
  164033. "add r3, r3, r6\n\t"
  164034. #endif
  164035. #ifdef WOLFSSL_KEIL
  164036. "adcs r4, r4, r7\n\t"
  164037. #elif defined(__clang__)
  164038. "adcs r4, r7\n\t"
  164039. #else
  164040. "adc r4, r7\n\t"
  164041. #endif
  164042. #ifdef WOLFSSL_KEIL
  164043. "adcs r5, r5, %[r]\n\t"
  164044. #elif defined(__clang__)
  164045. "adcs r5, %[r]\n\t"
  164046. #else
  164047. "adc r5, %[r]\n\t"
  164048. #endif
  164049. "mov %[r], r8\n\t"
  164050. "str r3, [%[r], #84]\n\t"
  164051. "movs %[r], #0\n\t"
  164052. "# A[15] * B[7]\n\t"
  164053. "movs r3, #0\n\t"
  164054. "mov %[a], r9\n\t"
  164055. "mov %[b], r10\n\t"
  164056. "ldr %[a], [%[a], #60]\n\t"
  164057. "ldr %[b], [%[b], #28]\n\t"
  164058. "uxth r6, %[a]\n\t"
  164059. "uxth r7, %[b]\n\t"
  164060. #ifdef WOLFSSL_KEIL
  164061. "muls r7, r6, r7\n\t"
  164062. #elif defined(__clang__)
  164063. "muls r7, r6\n\t"
  164064. #else
  164065. "mul r7, r6\n\t"
  164066. #endif
  164067. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164068. "adds r4, r4, r7\n\t"
  164069. #else
  164070. "add r4, r4, r7\n\t"
  164071. #endif
  164072. #ifdef WOLFSSL_KEIL
  164073. "adcs r5, r5, %[r]\n\t"
  164074. #elif defined(__clang__)
  164075. "adcs r5, %[r]\n\t"
  164076. #else
  164077. "adc r5, %[r]\n\t"
  164078. #endif
  164079. #ifdef WOLFSSL_KEIL
  164080. "adcs r3, r3, %[r]\n\t"
  164081. #elif defined(__clang__)
  164082. "adcs r3, %[r]\n\t"
  164083. #else
  164084. "adc r3, %[r]\n\t"
  164085. #endif
  164086. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164087. "lsrs r7, %[b], #16\n\t"
  164088. #else
  164089. "lsr r7, %[b], #16\n\t"
  164090. #endif
  164091. #ifdef WOLFSSL_KEIL
  164092. "muls r6, r7, r6\n\t"
  164093. #elif defined(__clang__)
  164094. "muls r6, r7\n\t"
  164095. #else
  164096. "mul r6, r7\n\t"
  164097. #endif
  164098. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164099. "lsrs r7, r6, #16\n\t"
  164100. #else
  164101. "lsr r7, r6, #16\n\t"
  164102. #endif
  164103. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164104. "lsls r6, r6, #16\n\t"
  164105. #else
  164106. "lsl r6, r6, #16\n\t"
  164107. #endif
  164108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164109. "adds r4, r4, r6\n\t"
  164110. #else
  164111. "add r4, r4, r6\n\t"
  164112. #endif
  164113. #ifdef WOLFSSL_KEIL
  164114. "adcs r5, r5, r7\n\t"
  164115. #elif defined(__clang__)
  164116. "adcs r5, r7\n\t"
  164117. #else
  164118. "adc r5, r7\n\t"
  164119. #endif
  164120. #ifdef WOLFSSL_KEIL
  164121. "adcs r3, r3, %[r]\n\t"
  164122. #elif defined(__clang__)
  164123. "adcs r3, %[r]\n\t"
  164124. #else
  164125. "adc r3, %[r]\n\t"
  164126. #endif
  164127. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164128. "lsrs r6, %[a], #16\n\t"
  164129. #else
  164130. "lsr r6, %[a], #16\n\t"
  164131. #endif
  164132. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164133. "lsrs r7, %[b], #16\n\t"
  164134. #else
  164135. "lsr r7, %[b], #16\n\t"
  164136. #endif
  164137. #ifdef WOLFSSL_KEIL
  164138. "muls r7, r6, r7\n\t"
  164139. #elif defined(__clang__)
  164140. "muls r7, r6\n\t"
  164141. #else
  164142. "mul r7, r6\n\t"
  164143. #endif
  164144. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164145. "adds r5, r5, r7\n\t"
  164146. #else
  164147. "add r5, r5, r7\n\t"
  164148. #endif
  164149. #ifdef WOLFSSL_KEIL
  164150. "adcs r3, r3, %[r]\n\t"
  164151. #elif defined(__clang__)
  164152. "adcs r3, %[r]\n\t"
  164153. #else
  164154. "adc r3, %[r]\n\t"
  164155. #endif
  164156. "uxth r7, %[b]\n\t"
  164157. #ifdef WOLFSSL_KEIL
  164158. "muls r6, r7, r6\n\t"
  164159. #elif defined(__clang__)
  164160. "muls r6, r7\n\t"
  164161. #else
  164162. "mul r6, r7\n\t"
  164163. #endif
  164164. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164165. "lsrs r7, r6, #16\n\t"
  164166. #else
  164167. "lsr r7, r6, #16\n\t"
  164168. #endif
  164169. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164170. "lsls r6, r6, #16\n\t"
  164171. #else
  164172. "lsl r6, r6, #16\n\t"
  164173. #endif
  164174. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164175. "adds r4, r4, r6\n\t"
  164176. #else
  164177. "add r4, r4, r6\n\t"
  164178. #endif
  164179. #ifdef WOLFSSL_KEIL
  164180. "adcs r5, r5, r7\n\t"
  164181. #elif defined(__clang__)
  164182. "adcs r5, r7\n\t"
  164183. #else
  164184. "adc r5, r7\n\t"
  164185. #endif
  164186. #ifdef WOLFSSL_KEIL
  164187. "adcs r3, r3, %[r]\n\t"
  164188. #elif defined(__clang__)
  164189. "adcs r3, %[r]\n\t"
  164190. #else
  164191. "adc r3, %[r]\n\t"
  164192. #endif
  164193. "# A[14] * B[8]\n\t"
  164194. "mov %[a], r9\n\t"
  164195. "mov %[b], r10\n\t"
  164196. "ldr %[a], [%[a], #56]\n\t"
  164197. "ldr %[b], [%[b], #32]\n\t"
  164198. "uxth r6, %[a]\n\t"
  164199. "uxth r7, %[b]\n\t"
  164200. #ifdef WOLFSSL_KEIL
  164201. "muls r7, r6, r7\n\t"
  164202. #elif defined(__clang__)
  164203. "muls r7, r6\n\t"
  164204. #else
  164205. "mul r7, r6\n\t"
  164206. #endif
  164207. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164208. "adds r4, r4, r7\n\t"
  164209. #else
  164210. "add r4, r4, r7\n\t"
  164211. #endif
  164212. #ifdef WOLFSSL_KEIL
  164213. "adcs r5, r5, %[r]\n\t"
  164214. #elif defined(__clang__)
  164215. "adcs r5, %[r]\n\t"
  164216. #else
  164217. "adc r5, %[r]\n\t"
  164218. #endif
  164219. #ifdef WOLFSSL_KEIL
  164220. "adcs r3, r3, %[r]\n\t"
  164221. #elif defined(__clang__)
  164222. "adcs r3, %[r]\n\t"
  164223. #else
  164224. "adc r3, %[r]\n\t"
  164225. #endif
  164226. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164227. "lsrs r7, %[b], #16\n\t"
  164228. #else
  164229. "lsr r7, %[b], #16\n\t"
  164230. #endif
  164231. #ifdef WOLFSSL_KEIL
  164232. "muls r6, r7, r6\n\t"
  164233. #elif defined(__clang__)
  164234. "muls r6, r7\n\t"
  164235. #else
  164236. "mul r6, r7\n\t"
  164237. #endif
  164238. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164239. "lsrs r7, r6, #16\n\t"
  164240. #else
  164241. "lsr r7, r6, #16\n\t"
  164242. #endif
  164243. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164244. "lsls r6, r6, #16\n\t"
  164245. #else
  164246. "lsl r6, r6, #16\n\t"
  164247. #endif
  164248. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164249. "adds r4, r4, r6\n\t"
  164250. #else
  164251. "add r4, r4, r6\n\t"
  164252. #endif
  164253. #ifdef WOLFSSL_KEIL
  164254. "adcs r5, r5, r7\n\t"
  164255. #elif defined(__clang__)
  164256. "adcs r5, r7\n\t"
  164257. #else
  164258. "adc r5, r7\n\t"
  164259. #endif
  164260. #ifdef WOLFSSL_KEIL
  164261. "adcs r3, r3, %[r]\n\t"
  164262. #elif defined(__clang__)
  164263. "adcs r3, %[r]\n\t"
  164264. #else
  164265. "adc r3, %[r]\n\t"
  164266. #endif
  164267. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164268. "lsrs r6, %[a], #16\n\t"
  164269. #else
  164270. "lsr r6, %[a], #16\n\t"
  164271. #endif
  164272. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164273. "lsrs r7, %[b], #16\n\t"
  164274. #else
  164275. "lsr r7, %[b], #16\n\t"
  164276. #endif
  164277. #ifdef WOLFSSL_KEIL
  164278. "muls r7, r6, r7\n\t"
  164279. #elif defined(__clang__)
  164280. "muls r7, r6\n\t"
  164281. #else
  164282. "mul r7, r6\n\t"
  164283. #endif
  164284. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164285. "adds r5, r5, r7\n\t"
  164286. #else
  164287. "add r5, r5, r7\n\t"
  164288. #endif
  164289. #ifdef WOLFSSL_KEIL
  164290. "adcs r3, r3, %[r]\n\t"
  164291. #elif defined(__clang__)
  164292. "adcs r3, %[r]\n\t"
  164293. #else
  164294. "adc r3, %[r]\n\t"
  164295. #endif
  164296. "uxth r7, %[b]\n\t"
  164297. #ifdef WOLFSSL_KEIL
  164298. "muls r6, r7, r6\n\t"
  164299. #elif defined(__clang__)
  164300. "muls r6, r7\n\t"
  164301. #else
  164302. "mul r6, r7\n\t"
  164303. #endif
  164304. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164305. "lsrs r7, r6, #16\n\t"
  164306. #else
  164307. "lsr r7, r6, #16\n\t"
  164308. #endif
  164309. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164310. "lsls r6, r6, #16\n\t"
  164311. #else
  164312. "lsl r6, r6, #16\n\t"
  164313. #endif
  164314. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164315. "adds r4, r4, r6\n\t"
  164316. #else
  164317. "add r4, r4, r6\n\t"
  164318. #endif
  164319. #ifdef WOLFSSL_KEIL
  164320. "adcs r5, r5, r7\n\t"
  164321. #elif defined(__clang__)
  164322. "adcs r5, r7\n\t"
  164323. #else
  164324. "adc r5, r7\n\t"
  164325. #endif
  164326. #ifdef WOLFSSL_KEIL
  164327. "adcs r3, r3, %[r]\n\t"
  164328. #elif defined(__clang__)
  164329. "adcs r3, %[r]\n\t"
  164330. #else
  164331. "adc r3, %[r]\n\t"
  164332. #endif
  164333. "# A[13] * B[9]\n\t"
  164334. "mov %[a], r9\n\t"
  164335. "mov %[b], r10\n\t"
  164336. "ldr %[a], [%[a], #52]\n\t"
  164337. "ldr %[b], [%[b], #36]\n\t"
  164338. "uxth r6, %[a]\n\t"
  164339. "uxth r7, %[b]\n\t"
  164340. #ifdef WOLFSSL_KEIL
  164341. "muls r7, r6, r7\n\t"
  164342. #elif defined(__clang__)
  164343. "muls r7, r6\n\t"
  164344. #else
  164345. "mul r7, r6\n\t"
  164346. #endif
  164347. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164348. "adds r4, r4, r7\n\t"
  164349. #else
  164350. "add r4, r4, r7\n\t"
  164351. #endif
  164352. #ifdef WOLFSSL_KEIL
  164353. "adcs r5, r5, %[r]\n\t"
  164354. #elif defined(__clang__)
  164355. "adcs r5, %[r]\n\t"
  164356. #else
  164357. "adc r5, %[r]\n\t"
  164358. #endif
  164359. #ifdef WOLFSSL_KEIL
  164360. "adcs r3, r3, %[r]\n\t"
  164361. #elif defined(__clang__)
  164362. "adcs r3, %[r]\n\t"
  164363. #else
  164364. "adc r3, %[r]\n\t"
  164365. #endif
  164366. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164367. "lsrs r7, %[b], #16\n\t"
  164368. #else
  164369. "lsr r7, %[b], #16\n\t"
  164370. #endif
  164371. #ifdef WOLFSSL_KEIL
  164372. "muls r6, r7, r6\n\t"
  164373. #elif defined(__clang__)
  164374. "muls r6, r7\n\t"
  164375. #else
  164376. "mul r6, r7\n\t"
  164377. #endif
  164378. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164379. "lsrs r7, r6, #16\n\t"
  164380. #else
  164381. "lsr r7, r6, #16\n\t"
  164382. #endif
  164383. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164384. "lsls r6, r6, #16\n\t"
  164385. #else
  164386. "lsl r6, r6, #16\n\t"
  164387. #endif
  164388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164389. "adds r4, r4, r6\n\t"
  164390. #else
  164391. "add r4, r4, r6\n\t"
  164392. #endif
  164393. #ifdef WOLFSSL_KEIL
  164394. "adcs r5, r5, r7\n\t"
  164395. #elif defined(__clang__)
  164396. "adcs r5, r7\n\t"
  164397. #else
  164398. "adc r5, r7\n\t"
  164399. #endif
  164400. #ifdef WOLFSSL_KEIL
  164401. "adcs r3, r3, %[r]\n\t"
  164402. #elif defined(__clang__)
  164403. "adcs r3, %[r]\n\t"
  164404. #else
  164405. "adc r3, %[r]\n\t"
  164406. #endif
  164407. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164408. "lsrs r6, %[a], #16\n\t"
  164409. #else
  164410. "lsr r6, %[a], #16\n\t"
  164411. #endif
  164412. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164413. "lsrs r7, %[b], #16\n\t"
  164414. #else
  164415. "lsr r7, %[b], #16\n\t"
  164416. #endif
  164417. #ifdef WOLFSSL_KEIL
  164418. "muls r7, r6, r7\n\t"
  164419. #elif defined(__clang__)
  164420. "muls r7, r6\n\t"
  164421. #else
  164422. "mul r7, r6\n\t"
  164423. #endif
  164424. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164425. "adds r5, r5, r7\n\t"
  164426. #else
  164427. "add r5, r5, r7\n\t"
  164428. #endif
  164429. #ifdef WOLFSSL_KEIL
  164430. "adcs r3, r3, %[r]\n\t"
  164431. #elif defined(__clang__)
  164432. "adcs r3, %[r]\n\t"
  164433. #else
  164434. "adc r3, %[r]\n\t"
  164435. #endif
  164436. "uxth r7, %[b]\n\t"
  164437. #ifdef WOLFSSL_KEIL
  164438. "muls r6, r7, r6\n\t"
  164439. #elif defined(__clang__)
  164440. "muls r6, r7\n\t"
  164441. #else
  164442. "mul r6, r7\n\t"
  164443. #endif
  164444. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164445. "lsrs r7, r6, #16\n\t"
  164446. #else
  164447. "lsr r7, r6, #16\n\t"
  164448. #endif
  164449. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164450. "lsls r6, r6, #16\n\t"
  164451. #else
  164452. "lsl r6, r6, #16\n\t"
  164453. #endif
  164454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164455. "adds r4, r4, r6\n\t"
  164456. #else
  164457. "add r4, r4, r6\n\t"
  164458. #endif
  164459. #ifdef WOLFSSL_KEIL
  164460. "adcs r5, r5, r7\n\t"
  164461. #elif defined(__clang__)
  164462. "adcs r5, r7\n\t"
  164463. #else
  164464. "adc r5, r7\n\t"
  164465. #endif
  164466. #ifdef WOLFSSL_KEIL
  164467. "adcs r3, r3, %[r]\n\t"
  164468. #elif defined(__clang__)
  164469. "adcs r3, %[r]\n\t"
  164470. #else
  164471. "adc r3, %[r]\n\t"
  164472. #endif
  164473. "# A[12] * B[10]\n\t"
  164474. "mov %[a], r9\n\t"
  164475. "mov %[b], r10\n\t"
  164476. "ldr %[a], [%[a], #48]\n\t"
  164477. "ldr %[b], [%[b], #40]\n\t"
  164478. "uxth r6, %[a]\n\t"
  164479. "uxth r7, %[b]\n\t"
  164480. #ifdef WOLFSSL_KEIL
  164481. "muls r7, r6, r7\n\t"
  164482. #elif defined(__clang__)
  164483. "muls r7, r6\n\t"
  164484. #else
  164485. "mul r7, r6\n\t"
  164486. #endif
  164487. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164488. "adds r4, r4, r7\n\t"
  164489. #else
  164490. "add r4, r4, r7\n\t"
  164491. #endif
  164492. #ifdef WOLFSSL_KEIL
  164493. "adcs r5, r5, %[r]\n\t"
  164494. #elif defined(__clang__)
  164495. "adcs r5, %[r]\n\t"
  164496. #else
  164497. "adc r5, %[r]\n\t"
  164498. #endif
  164499. #ifdef WOLFSSL_KEIL
  164500. "adcs r3, r3, %[r]\n\t"
  164501. #elif defined(__clang__)
  164502. "adcs r3, %[r]\n\t"
  164503. #else
  164504. "adc r3, %[r]\n\t"
  164505. #endif
  164506. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164507. "lsrs r7, %[b], #16\n\t"
  164508. #else
  164509. "lsr r7, %[b], #16\n\t"
  164510. #endif
  164511. #ifdef WOLFSSL_KEIL
  164512. "muls r6, r7, r6\n\t"
  164513. #elif defined(__clang__)
  164514. "muls r6, r7\n\t"
  164515. #else
  164516. "mul r6, r7\n\t"
  164517. #endif
  164518. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164519. "lsrs r7, r6, #16\n\t"
  164520. #else
  164521. "lsr r7, r6, #16\n\t"
  164522. #endif
  164523. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164524. "lsls r6, r6, #16\n\t"
  164525. #else
  164526. "lsl r6, r6, #16\n\t"
  164527. #endif
  164528. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164529. "adds r4, r4, r6\n\t"
  164530. #else
  164531. "add r4, r4, r6\n\t"
  164532. #endif
  164533. #ifdef WOLFSSL_KEIL
  164534. "adcs r5, r5, r7\n\t"
  164535. #elif defined(__clang__)
  164536. "adcs r5, r7\n\t"
  164537. #else
  164538. "adc r5, r7\n\t"
  164539. #endif
  164540. #ifdef WOLFSSL_KEIL
  164541. "adcs r3, r3, %[r]\n\t"
  164542. #elif defined(__clang__)
  164543. "adcs r3, %[r]\n\t"
  164544. #else
  164545. "adc r3, %[r]\n\t"
  164546. #endif
  164547. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164548. "lsrs r6, %[a], #16\n\t"
  164549. #else
  164550. "lsr r6, %[a], #16\n\t"
  164551. #endif
  164552. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164553. "lsrs r7, %[b], #16\n\t"
  164554. #else
  164555. "lsr r7, %[b], #16\n\t"
  164556. #endif
  164557. #ifdef WOLFSSL_KEIL
  164558. "muls r7, r6, r7\n\t"
  164559. #elif defined(__clang__)
  164560. "muls r7, r6\n\t"
  164561. #else
  164562. "mul r7, r6\n\t"
  164563. #endif
  164564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164565. "adds r5, r5, r7\n\t"
  164566. #else
  164567. "add r5, r5, r7\n\t"
  164568. #endif
  164569. #ifdef WOLFSSL_KEIL
  164570. "adcs r3, r3, %[r]\n\t"
  164571. #elif defined(__clang__)
  164572. "adcs r3, %[r]\n\t"
  164573. #else
  164574. "adc r3, %[r]\n\t"
  164575. #endif
  164576. "uxth r7, %[b]\n\t"
  164577. #ifdef WOLFSSL_KEIL
  164578. "muls r6, r7, r6\n\t"
  164579. #elif defined(__clang__)
  164580. "muls r6, r7\n\t"
  164581. #else
  164582. "mul r6, r7\n\t"
  164583. #endif
  164584. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164585. "lsrs r7, r6, #16\n\t"
  164586. #else
  164587. "lsr r7, r6, #16\n\t"
  164588. #endif
  164589. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164590. "lsls r6, r6, #16\n\t"
  164591. #else
  164592. "lsl r6, r6, #16\n\t"
  164593. #endif
  164594. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164595. "adds r4, r4, r6\n\t"
  164596. #else
  164597. "add r4, r4, r6\n\t"
  164598. #endif
  164599. #ifdef WOLFSSL_KEIL
  164600. "adcs r5, r5, r7\n\t"
  164601. #elif defined(__clang__)
  164602. "adcs r5, r7\n\t"
  164603. #else
  164604. "adc r5, r7\n\t"
  164605. #endif
  164606. #ifdef WOLFSSL_KEIL
  164607. "adcs r3, r3, %[r]\n\t"
  164608. #elif defined(__clang__)
  164609. "adcs r3, %[r]\n\t"
  164610. #else
  164611. "adc r3, %[r]\n\t"
  164612. #endif
  164613. "# A[11] * B[11]\n\t"
  164614. "mov %[a], r9\n\t"
  164615. "mov %[b], r10\n\t"
  164616. "ldr %[a], [%[a], #44]\n\t"
  164617. "ldr %[b], [%[b], #44]\n\t"
  164618. "uxth r6, %[a]\n\t"
  164619. "uxth r7, %[b]\n\t"
  164620. #ifdef WOLFSSL_KEIL
  164621. "muls r7, r6, r7\n\t"
  164622. #elif defined(__clang__)
  164623. "muls r7, r6\n\t"
  164624. #else
  164625. "mul r7, r6\n\t"
  164626. #endif
  164627. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164628. "adds r4, r4, r7\n\t"
  164629. #else
  164630. "add r4, r4, r7\n\t"
  164631. #endif
  164632. #ifdef WOLFSSL_KEIL
  164633. "adcs r5, r5, %[r]\n\t"
  164634. #elif defined(__clang__)
  164635. "adcs r5, %[r]\n\t"
  164636. #else
  164637. "adc r5, %[r]\n\t"
  164638. #endif
  164639. #ifdef WOLFSSL_KEIL
  164640. "adcs r3, r3, %[r]\n\t"
  164641. #elif defined(__clang__)
  164642. "adcs r3, %[r]\n\t"
  164643. #else
  164644. "adc r3, %[r]\n\t"
  164645. #endif
  164646. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164647. "lsrs r7, %[b], #16\n\t"
  164648. #else
  164649. "lsr r7, %[b], #16\n\t"
  164650. #endif
  164651. #ifdef WOLFSSL_KEIL
  164652. "muls r6, r7, r6\n\t"
  164653. #elif defined(__clang__)
  164654. "muls r6, r7\n\t"
  164655. #else
  164656. "mul r6, r7\n\t"
  164657. #endif
  164658. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164659. "lsrs r7, r6, #16\n\t"
  164660. #else
  164661. "lsr r7, r6, #16\n\t"
  164662. #endif
  164663. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164664. "lsls r6, r6, #16\n\t"
  164665. #else
  164666. "lsl r6, r6, #16\n\t"
  164667. #endif
  164668. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164669. "adds r4, r4, r6\n\t"
  164670. #else
  164671. "add r4, r4, r6\n\t"
  164672. #endif
  164673. #ifdef WOLFSSL_KEIL
  164674. "adcs r5, r5, r7\n\t"
  164675. #elif defined(__clang__)
  164676. "adcs r5, r7\n\t"
  164677. #else
  164678. "adc r5, r7\n\t"
  164679. #endif
  164680. #ifdef WOLFSSL_KEIL
  164681. "adcs r3, r3, %[r]\n\t"
  164682. #elif defined(__clang__)
  164683. "adcs r3, %[r]\n\t"
  164684. #else
  164685. "adc r3, %[r]\n\t"
  164686. #endif
  164687. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164688. "lsrs r6, %[a], #16\n\t"
  164689. #else
  164690. "lsr r6, %[a], #16\n\t"
  164691. #endif
  164692. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164693. "lsrs r7, %[b], #16\n\t"
  164694. #else
  164695. "lsr r7, %[b], #16\n\t"
  164696. #endif
  164697. #ifdef WOLFSSL_KEIL
  164698. "muls r7, r6, r7\n\t"
  164699. #elif defined(__clang__)
  164700. "muls r7, r6\n\t"
  164701. #else
  164702. "mul r7, r6\n\t"
  164703. #endif
  164704. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164705. "adds r5, r5, r7\n\t"
  164706. #else
  164707. "add r5, r5, r7\n\t"
  164708. #endif
  164709. #ifdef WOLFSSL_KEIL
  164710. "adcs r3, r3, %[r]\n\t"
  164711. #elif defined(__clang__)
  164712. "adcs r3, %[r]\n\t"
  164713. #else
  164714. "adc r3, %[r]\n\t"
  164715. #endif
  164716. "uxth r7, %[b]\n\t"
  164717. #ifdef WOLFSSL_KEIL
  164718. "muls r6, r7, r6\n\t"
  164719. #elif defined(__clang__)
  164720. "muls r6, r7\n\t"
  164721. #else
  164722. "mul r6, r7\n\t"
  164723. #endif
  164724. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164725. "lsrs r7, r6, #16\n\t"
  164726. #else
  164727. "lsr r7, r6, #16\n\t"
  164728. #endif
  164729. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164730. "lsls r6, r6, #16\n\t"
  164731. #else
  164732. "lsl r6, r6, #16\n\t"
  164733. #endif
  164734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164735. "adds r4, r4, r6\n\t"
  164736. #else
  164737. "add r4, r4, r6\n\t"
  164738. #endif
  164739. #ifdef WOLFSSL_KEIL
  164740. "adcs r5, r5, r7\n\t"
  164741. #elif defined(__clang__)
  164742. "adcs r5, r7\n\t"
  164743. #else
  164744. "adc r5, r7\n\t"
  164745. #endif
  164746. #ifdef WOLFSSL_KEIL
  164747. "adcs r3, r3, %[r]\n\t"
  164748. #elif defined(__clang__)
  164749. "adcs r3, %[r]\n\t"
  164750. #else
  164751. "adc r3, %[r]\n\t"
  164752. #endif
  164753. "# A[10] * B[12]\n\t"
  164754. "mov %[a], r9\n\t"
  164755. "mov %[b], r10\n\t"
  164756. "ldr %[a], [%[a], #40]\n\t"
  164757. "ldr %[b], [%[b], #48]\n\t"
  164758. "uxth r6, %[a]\n\t"
  164759. "uxth r7, %[b]\n\t"
  164760. #ifdef WOLFSSL_KEIL
  164761. "muls r7, r6, r7\n\t"
  164762. #elif defined(__clang__)
  164763. "muls r7, r6\n\t"
  164764. #else
  164765. "mul r7, r6\n\t"
  164766. #endif
  164767. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164768. "adds r4, r4, r7\n\t"
  164769. #else
  164770. "add r4, r4, r7\n\t"
  164771. #endif
  164772. #ifdef WOLFSSL_KEIL
  164773. "adcs r5, r5, %[r]\n\t"
  164774. #elif defined(__clang__)
  164775. "adcs r5, %[r]\n\t"
  164776. #else
  164777. "adc r5, %[r]\n\t"
  164778. #endif
  164779. #ifdef WOLFSSL_KEIL
  164780. "adcs r3, r3, %[r]\n\t"
  164781. #elif defined(__clang__)
  164782. "adcs r3, %[r]\n\t"
  164783. #else
  164784. "adc r3, %[r]\n\t"
  164785. #endif
  164786. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164787. "lsrs r7, %[b], #16\n\t"
  164788. #else
  164789. "lsr r7, %[b], #16\n\t"
  164790. #endif
  164791. #ifdef WOLFSSL_KEIL
  164792. "muls r6, r7, r6\n\t"
  164793. #elif defined(__clang__)
  164794. "muls r6, r7\n\t"
  164795. #else
  164796. "mul r6, r7\n\t"
  164797. #endif
  164798. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164799. "lsrs r7, r6, #16\n\t"
  164800. #else
  164801. "lsr r7, r6, #16\n\t"
  164802. #endif
  164803. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164804. "lsls r6, r6, #16\n\t"
  164805. #else
  164806. "lsl r6, r6, #16\n\t"
  164807. #endif
  164808. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164809. "adds r4, r4, r6\n\t"
  164810. #else
  164811. "add r4, r4, r6\n\t"
  164812. #endif
  164813. #ifdef WOLFSSL_KEIL
  164814. "adcs r5, r5, r7\n\t"
  164815. #elif defined(__clang__)
  164816. "adcs r5, r7\n\t"
  164817. #else
  164818. "adc r5, r7\n\t"
  164819. #endif
  164820. #ifdef WOLFSSL_KEIL
  164821. "adcs r3, r3, %[r]\n\t"
  164822. #elif defined(__clang__)
  164823. "adcs r3, %[r]\n\t"
  164824. #else
  164825. "adc r3, %[r]\n\t"
  164826. #endif
  164827. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164828. "lsrs r6, %[a], #16\n\t"
  164829. #else
  164830. "lsr r6, %[a], #16\n\t"
  164831. #endif
  164832. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164833. "lsrs r7, %[b], #16\n\t"
  164834. #else
  164835. "lsr r7, %[b], #16\n\t"
  164836. #endif
  164837. #ifdef WOLFSSL_KEIL
  164838. "muls r7, r6, r7\n\t"
  164839. #elif defined(__clang__)
  164840. "muls r7, r6\n\t"
  164841. #else
  164842. "mul r7, r6\n\t"
  164843. #endif
  164844. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164845. "adds r5, r5, r7\n\t"
  164846. #else
  164847. "add r5, r5, r7\n\t"
  164848. #endif
  164849. #ifdef WOLFSSL_KEIL
  164850. "adcs r3, r3, %[r]\n\t"
  164851. #elif defined(__clang__)
  164852. "adcs r3, %[r]\n\t"
  164853. #else
  164854. "adc r3, %[r]\n\t"
  164855. #endif
  164856. "uxth r7, %[b]\n\t"
  164857. #ifdef WOLFSSL_KEIL
  164858. "muls r6, r7, r6\n\t"
  164859. #elif defined(__clang__)
  164860. "muls r6, r7\n\t"
  164861. #else
  164862. "mul r6, r7\n\t"
  164863. #endif
  164864. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164865. "lsrs r7, r6, #16\n\t"
  164866. #else
  164867. "lsr r7, r6, #16\n\t"
  164868. #endif
  164869. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164870. "lsls r6, r6, #16\n\t"
  164871. #else
  164872. "lsl r6, r6, #16\n\t"
  164873. #endif
  164874. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164875. "adds r4, r4, r6\n\t"
  164876. #else
  164877. "add r4, r4, r6\n\t"
  164878. #endif
  164879. #ifdef WOLFSSL_KEIL
  164880. "adcs r5, r5, r7\n\t"
  164881. #elif defined(__clang__)
  164882. "adcs r5, r7\n\t"
  164883. #else
  164884. "adc r5, r7\n\t"
  164885. #endif
  164886. #ifdef WOLFSSL_KEIL
  164887. "adcs r3, r3, %[r]\n\t"
  164888. #elif defined(__clang__)
  164889. "adcs r3, %[r]\n\t"
  164890. #else
  164891. "adc r3, %[r]\n\t"
  164892. #endif
  164893. "# A[9] * B[13]\n\t"
  164894. "mov %[a], r9\n\t"
  164895. "mov %[b], r10\n\t"
  164896. "ldr %[a], [%[a], #36]\n\t"
  164897. "ldr %[b], [%[b], #52]\n\t"
  164898. "uxth r6, %[a]\n\t"
  164899. "uxth r7, %[b]\n\t"
  164900. #ifdef WOLFSSL_KEIL
  164901. "muls r7, r6, r7\n\t"
  164902. #elif defined(__clang__)
  164903. "muls r7, r6\n\t"
  164904. #else
  164905. "mul r7, r6\n\t"
  164906. #endif
  164907. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164908. "adds r4, r4, r7\n\t"
  164909. #else
  164910. "add r4, r4, r7\n\t"
  164911. #endif
  164912. #ifdef WOLFSSL_KEIL
  164913. "adcs r5, r5, %[r]\n\t"
  164914. #elif defined(__clang__)
  164915. "adcs r5, %[r]\n\t"
  164916. #else
  164917. "adc r5, %[r]\n\t"
  164918. #endif
  164919. #ifdef WOLFSSL_KEIL
  164920. "adcs r3, r3, %[r]\n\t"
  164921. #elif defined(__clang__)
  164922. "adcs r3, %[r]\n\t"
  164923. #else
  164924. "adc r3, %[r]\n\t"
  164925. #endif
  164926. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164927. "lsrs r7, %[b], #16\n\t"
  164928. #else
  164929. "lsr r7, %[b], #16\n\t"
  164930. #endif
  164931. #ifdef WOLFSSL_KEIL
  164932. "muls r6, r7, r6\n\t"
  164933. #elif defined(__clang__)
  164934. "muls r6, r7\n\t"
  164935. #else
  164936. "mul r6, r7\n\t"
  164937. #endif
  164938. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164939. "lsrs r7, r6, #16\n\t"
  164940. #else
  164941. "lsr r7, r6, #16\n\t"
  164942. #endif
  164943. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164944. "lsls r6, r6, #16\n\t"
  164945. #else
  164946. "lsl r6, r6, #16\n\t"
  164947. #endif
  164948. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164949. "adds r4, r4, r6\n\t"
  164950. #else
  164951. "add r4, r4, r6\n\t"
  164952. #endif
  164953. #ifdef WOLFSSL_KEIL
  164954. "adcs r5, r5, r7\n\t"
  164955. #elif defined(__clang__)
  164956. "adcs r5, r7\n\t"
  164957. #else
  164958. "adc r5, r7\n\t"
  164959. #endif
  164960. #ifdef WOLFSSL_KEIL
  164961. "adcs r3, r3, %[r]\n\t"
  164962. #elif defined(__clang__)
  164963. "adcs r3, %[r]\n\t"
  164964. #else
  164965. "adc r3, %[r]\n\t"
  164966. #endif
  164967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164968. "lsrs r6, %[a], #16\n\t"
  164969. #else
  164970. "lsr r6, %[a], #16\n\t"
  164971. #endif
  164972. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164973. "lsrs r7, %[b], #16\n\t"
  164974. #else
  164975. "lsr r7, %[b], #16\n\t"
  164976. #endif
  164977. #ifdef WOLFSSL_KEIL
  164978. "muls r7, r6, r7\n\t"
  164979. #elif defined(__clang__)
  164980. "muls r7, r6\n\t"
  164981. #else
  164982. "mul r7, r6\n\t"
  164983. #endif
  164984. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164985. "adds r5, r5, r7\n\t"
  164986. #else
  164987. "add r5, r5, r7\n\t"
  164988. #endif
  164989. #ifdef WOLFSSL_KEIL
  164990. "adcs r3, r3, %[r]\n\t"
  164991. #elif defined(__clang__)
  164992. "adcs r3, %[r]\n\t"
  164993. #else
  164994. "adc r3, %[r]\n\t"
  164995. #endif
  164996. "uxth r7, %[b]\n\t"
  164997. #ifdef WOLFSSL_KEIL
  164998. "muls r6, r7, r6\n\t"
  164999. #elif defined(__clang__)
  165000. "muls r6, r7\n\t"
  165001. #else
  165002. "mul r6, r7\n\t"
  165003. #endif
  165004. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165005. "lsrs r7, r6, #16\n\t"
  165006. #else
  165007. "lsr r7, r6, #16\n\t"
  165008. #endif
  165009. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165010. "lsls r6, r6, #16\n\t"
  165011. #else
  165012. "lsl r6, r6, #16\n\t"
  165013. #endif
  165014. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165015. "adds r4, r4, r6\n\t"
  165016. #else
  165017. "add r4, r4, r6\n\t"
  165018. #endif
  165019. #ifdef WOLFSSL_KEIL
  165020. "adcs r5, r5, r7\n\t"
  165021. #elif defined(__clang__)
  165022. "adcs r5, r7\n\t"
  165023. #else
  165024. "adc r5, r7\n\t"
  165025. #endif
  165026. #ifdef WOLFSSL_KEIL
  165027. "adcs r3, r3, %[r]\n\t"
  165028. #elif defined(__clang__)
  165029. "adcs r3, %[r]\n\t"
  165030. #else
  165031. "adc r3, %[r]\n\t"
  165032. #endif
  165033. "# A[8] * B[14]\n\t"
  165034. "mov %[a], r9\n\t"
  165035. "mov %[b], r10\n\t"
  165036. "ldr %[a], [%[a], #32]\n\t"
  165037. "ldr %[b], [%[b], #56]\n\t"
  165038. "uxth r6, %[a]\n\t"
  165039. "uxth r7, %[b]\n\t"
  165040. #ifdef WOLFSSL_KEIL
  165041. "muls r7, r6, r7\n\t"
  165042. #elif defined(__clang__)
  165043. "muls r7, r6\n\t"
  165044. #else
  165045. "mul r7, r6\n\t"
  165046. #endif
  165047. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165048. "adds r4, r4, r7\n\t"
  165049. #else
  165050. "add r4, r4, r7\n\t"
  165051. #endif
  165052. #ifdef WOLFSSL_KEIL
  165053. "adcs r5, r5, %[r]\n\t"
  165054. #elif defined(__clang__)
  165055. "adcs r5, %[r]\n\t"
  165056. #else
  165057. "adc r5, %[r]\n\t"
  165058. #endif
  165059. #ifdef WOLFSSL_KEIL
  165060. "adcs r3, r3, %[r]\n\t"
  165061. #elif defined(__clang__)
  165062. "adcs r3, %[r]\n\t"
  165063. #else
  165064. "adc r3, %[r]\n\t"
  165065. #endif
  165066. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165067. "lsrs r7, %[b], #16\n\t"
  165068. #else
  165069. "lsr r7, %[b], #16\n\t"
  165070. #endif
  165071. #ifdef WOLFSSL_KEIL
  165072. "muls r6, r7, r6\n\t"
  165073. #elif defined(__clang__)
  165074. "muls r6, r7\n\t"
  165075. #else
  165076. "mul r6, r7\n\t"
  165077. #endif
  165078. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165079. "lsrs r7, r6, #16\n\t"
  165080. #else
  165081. "lsr r7, r6, #16\n\t"
  165082. #endif
  165083. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165084. "lsls r6, r6, #16\n\t"
  165085. #else
  165086. "lsl r6, r6, #16\n\t"
  165087. #endif
  165088. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165089. "adds r4, r4, r6\n\t"
  165090. #else
  165091. "add r4, r4, r6\n\t"
  165092. #endif
  165093. #ifdef WOLFSSL_KEIL
  165094. "adcs r5, r5, r7\n\t"
  165095. #elif defined(__clang__)
  165096. "adcs r5, r7\n\t"
  165097. #else
  165098. "adc r5, r7\n\t"
  165099. #endif
  165100. #ifdef WOLFSSL_KEIL
  165101. "adcs r3, r3, %[r]\n\t"
  165102. #elif defined(__clang__)
  165103. "adcs r3, %[r]\n\t"
  165104. #else
  165105. "adc r3, %[r]\n\t"
  165106. #endif
  165107. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165108. "lsrs r6, %[a], #16\n\t"
  165109. #else
  165110. "lsr r6, %[a], #16\n\t"
  165111. #endif
  165112. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165113. "lsrs r7, %[b], #16\n\t"
  165114. #else
  165115. "lsr r7, %[b], #16\n\t"
  165116. #endif
  165117. #ifdef WOLFSSL_KEIL
  165118. "muls r7, r6, r7\n\t"
  165119. #elif defined(__clang__)
  165120. "muls r7, r6\n\t"
  165121. #else
  165122. "mul r7, r6\n\t"
  165123. #endif
  165124. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165125. "adds r5, r5, r7\n\t"
  165126. #else
  165127. "add r5, r5, r7\n\t"
  165128. #endif
  165129. #ifdef WOLFSSL_KEIL
  165130. "adcs r3, r3, %[r]\n\t"
  165131. #elif defined(__clang__)
  165132. "adcs r3, %[r]\n\t"
  165133. #else
  165134. "adc r3, %[r]\n\t"
  165135. #endif
  165136. "uxth r7, %[b]\n\t"
  165137. #ifdef WOLFSSL_KEIL
  165138. "muls r6, r7, r6\n\t"
  165139. #elif defined(__clang__)
  165140. "muls r6, r7\n\t"
  165141. #else
  165142. "mul r6, r7\n\t"
  165143. #endif
  165144. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165145. "lsrs r7, r6, #16\n\t"
  165146. #else
  165147. "lsr r7, r6, #16\n\t"
  165148. #endif
  165149. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165150. "lsls r6, r6, #16\n\t"
  165151. #else
  165152. "lsl r6, r6, #16\n\t"
  165153. #endif
  165154. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165155. "adds r4, r4, r6\n\t"
  165156. #else
  165157. "add r4, r4, r6\n\t"
  165158. #endif
  165159. #ifdef WOLFSSL_KEIL
  165160. "adcs r5, r5, r7\n\t"
  165161. #elif defined(__clang__)
  165162. "adcs r5, r7\n\t"
  165163. #else
  165164. "adc r5, r7\n\t"
  165165. #endif
  165166. #ifdef WOLFSSL_KEIL
  165167. "adcs r3, r3, %[r]\n\t"
  165168. #elif defined(__clang__)
  165169. "adcs r3, %[r]\n\t"
  165170. #else
  165171. "adc r3, %[r]\n\t"
  165172. #endif
  165173. "# A[7] * B[15]\n\t"
  165174. "mov %[a], r9\n\t"
  165175. "mov %[b], r10\n\t"
  165176. "ldr %[a], [%[a], #28]\n\t"
  165177. "ldr %[b], [%[b], #60]\n\t"
  165178. "uxth r6, %[a]\n\t"
  165179. "uxth r7, %[b]\n\t"
  165180. #ifdef WOLFSSL_KEIL
  165181. "muls r7, r6, r7\n\t"
  165182. #elif defined(__clang__)
  165183. "muls r7, r6\n\t"
  165184. #else
  165185. "mul r7, r6\n\t"
  165186. #endif
  165187. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165188. "adds r4, r4, r7\n\t"
  165189. #else
  165190. "add r4, r4, r7\n\t"
  165191. #endif
  165192. #ifdef WOLFSSL_KEIL
  165193. "adcs r5, r5, %[r]\n\t"
  165194. #elif defined(__clang__)
  165195. "adcs r5, %[r]\n\t"
  165196. #else
  165197. "adc r5, %[r]\n\t"
  165198. #endif
  165199. #ifdef WOLFSSL_KEIL
  165200. "adcs r3, r3, %[r]\n\t"
  165201. #elif defined(__clang__)
  165202. "adcs r3, %[r]\n\t"
  165203. #else
  165204. "adc r3, %[r]\n\t"
  165205. #endif
  165206. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165207. "lsrs r7, %[b], #16\n\t"
  165208. #else
  165209. "lsr r7, %[b], #16\n\t"
  165210. #endif
  165211. #ifdef WOLFSSL_KEIL
  165212. "muls r6, r7, r6\n\t"
  165213. #elif defined(__clang__)
  165214. "muls r6, r7\n\t"
  165215. #else
  165216. "mul r6, r7\n\t"
  165217. #endif
  165218. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165219. "lsrs r7, r6, #16\n\t"
  165220. #else
  165221. "lsr r7, r6, #16\n\t"
  165222. #endif
  165223. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165224. "lsls r6, r6, #16\n\t"
  165225. #else
  165226. "lsl r6, r6, #16\n\t"
  165227. #endif
  165228. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165229. "adds r4, r4, r6\n\t"
  165230. #else
  165231. "add r4, r4, r6\n\t"
  165232. #endif
  165233. #ifdef WOLFSSL_KEIL
  165234. "adcs r5, r5, r7\n\t"
  165235. #elif defined(__clang__)
  165236. "adcs r5, r7\n\t"
  165237. #else
  165238. "adc r5, r7\n\t"
  165239. #endif
  165240. #ifdef WOLFSSL_KEIL
  165241. "adcs r3, r3, %[r]\n\t"
  165242. #elif defined(__clang__)
  165243. "adcs r3, %[r]\n\t"
  165244. #else
  165245. "adc r3, %[r]\n\t"
  165246. #endif
  165247. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165248. "lsrs r6, %[a], #16\n\t"
  165249. #else
  165250. "lsr r6, %[a], #16\n\t"
  165251. #endif
  165252. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165253. "lsrs r7, %[b], #16\n\t"
  165254. #else
  165255. "lsr r7, %[b], #16\n\t"
  165256. #endif
  165257. #ifdef WOLFSSL_KEIL
  165258. "muls r7, r6, r7\n\t"
  165259. #elif defined(__clang__)
  165260. "muls r7, r6\n\t"
  165261. #else
  165262. "mul r7, r6\n\t"
  165263. #endif
  165264. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165265. "adds r5, r5, r7\n\t"
  165266. #else
  165267. "add r5, r5, r7\n\t"
  165268. #endif
  165269. #ifdef WOLFSSL_KEIL
  165270. "adcs r3, r3, %[r]\n\t"
  165271. #elif defined(__clang__)
  165272. "adcs r3, %[r]\n\t"
  165273. #else
  165274. "adc r3, %[r]\n\t"
  165275. #endif
  165276. "uxth r7, %[b]\n\t"
  165277. #ifdef WOLFSSL_KEIL
  165278. "muls r6, r7, r6\n\t"
  165279. #elif defined(__clang__)
  165280. "muls r6, r7\n\t"
  165281. #else
  165282. "mul r6, r7\n\t"
  165283. #endif
  165284. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165285. "lsrs r7, r6, #16\n\t"
  165286. #else
  165287. "lsr r7, r6, #16\n\t"
  165288. #endif
  165289. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165290. "lsls r6, r6, #16\n\t"
  165291. #else
  165292. "lsl r6, r6, #16\n\t"
  165293. #endif
  165294. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165295. "adds r4, r4, r6\n\t"
  165296. #else
  165297. "add r4, r4, r6\n\t"
  165298. #endif
  165299. #ifdef WOLFSSL_KEIL
  165300. "adcs r5, r5, r7\n\t"
  165301. #elif defined(__clang__)
  165302. "adcs r5, r7\n\t"
  165303. #else
  165304. "adc r5, r7\n\t"
  165305. #endif
  165306. #ifdef WOLFSSL_KEIL
  165307. "adcs r3, r3, %[r]\n\t"
  165308. #elif defined(__clang__)
  165309. "adcs r3, %[r]\n\t"
  165310. #else
  165311. "adc r3, %[r]\n\t"
  165312. #endif
  165313. "mov %[r], r8\n\t"
  165314. "str r4, [%[r], #88]\n\t"
  165315. "movs %[r], #0\n\t"
  165316. "# A[8] * B[15]\n\t"
  165317. "movs r4, #0\n\t"
  165318. "mov %[a], r9\n\t"
  165319. "mov %[b], r10\n\t"
  165320. "ldr %[a], [%[a], #32]\n\t"
  165321. "ldr %[b], [%[b], #60]\n\t"
  165322. "uxth r6, %[a]\n\t"
  165323. "uxth r7, %[b]\n\t"
  165324. #ifdef WOLFSSL_KEIL
  165325. "muls r7, r6, r7\n\t"
  165326. #elif defined(__clang__)
  165327. "muls r7, r6\n\t"
  165328. #else
  165329. "mul r7, r6\n\t"
  165330. #endif
  165331. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165332. "adds r5, r5, r7\n\t"
  165333. #else
  165334. "add r5, r5, r7\n\t"
  165335. #endif
  165336. #ifdef WOLFSSL_KEIL
  165337. "adcs r3, r3, %[r]\n\t"
  165338. #elif defined(__clang__)
  165339. "adcs r3, %[r]\n\t"
  165340. #else
  165341. "adc r3, %[r]\n\t"
  165342. #endif
  165343. #ifdef WOLFSSL_KEIL
  165344. "adcs r4, r4, %[r]\n\t"
  165345. #elif defined(__clang__)
  165346. "adcs r4, %[r]\n\t"
  165347. #else
  165348. "adc r4, %[r]\n\t"
  165349. #endif
  165350. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165351. "lsrs r7, %[b], #16\n\t"
  165352. #else
  165353. "lsr r7, %[b], #16\n\t"
  165354. #endif
  165355. #ifdef WOLFSSL_KEIL
  165356. "muls r6, r7, r6\n\t"
  165357. #elif defined(__clang__)
  165358. "muls r6, r7\n\t"
  165359. #else
  165360. "mul r6, r7\n\t"
  165361. #endif
  165362. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165363. "lsrs r7, r6, #16\n\t"
  165364. #else
  165365. "lsr r7, r6, #16\n\t"
  165366. #endif
  165367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165368. "lsls r6, r6, #16\n\t"
  165369. #else
  165370. "lsl r6, r6, #16\n\t"
  165371. #endif
  165372. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165373. "adds r5, r5, r6\n\t"
  165374. #else
  165375. "add r5, r5, r6\n\t"
  165376. #endif
  165377. #ifdef WOLFSSL_KEIL
  165378. "adcs r3, r3, r7\n\t"
  165379. #elif defined(__clang__)
  165380. "adcs r3, r7\n\t"
  165381. #else
  165382. "adc r3, r7\n\t"
  165383. #endif
  165384. #ifdef WOLFSSL_KEIL
  165385. "adcs r4, r4, %[r]\n\t"
  165386. #elif defined(__clang__)
  165387. "adcs r4, %[r]\n\t"
  165388. #else
  165389. "adc r4, %[r]\n\t"
  165390. #endif
  165391. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165392. "lsrs r6, %[a], #16\n\t"
  165393. #else
  165394. "lsr r6, %[a], #16\n\t"
  165395. #endif
  165396. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165397. "lsrs r7, %[b], #16\n\t"
  165398. #else
  165399. "lsr r7, %[b], #16\n\t"
  165400. #endif
  165401. #ifdef WOLFSSL_KEIL
  165402. "muls r7, r6, r7\n\t"
  165403. #elif defined(__clang__)
  165404. "muls r7, r6\n\t"
  165405. #else
  165406. "mul r7, r6\n\t"
  165407. #endif
  165408. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165409. "adds r3, r3, r7\n\t"
  165410. #else
  165411. "add r3, r3, r7\n\t"
  165412. #endif
  165413. #ifdef WOLFSSL_KEIL
  165414. "adcs r4, r4, %[r]\n\t"
  165415. #elif defined(__clang__)
  165416. "adcs r4, %[r]\n\t"
  165417. #else
  165418. "adc r4, %[r]\n\t"
  165419. #endif
  165420. "uxth r7, %[b]\n\t"
  165421. #ifdef WOLFSSL_KEIL
  165422. "muls r6, r7, r6\n\t"
  165423. #elif defined(__clang__)
  165424. "muls r6, r7\n\t"
  165425. #else
  165426. "mul r6, r7\n\t"
  165427. #endif
  165428. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165429. "lsrs r7, r6, #16\n\t"
  165430. #else
  165431. "lsr r7, r6, #16\n\t"
  165432. #endif
  165433. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165434. "lsls r6, r6, #16\n\t"
  165435. #else
  165436. "lsl r6, r6, #16\n\t"
  165437. #endif
  165438. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165439. "adds r5, r5, r6\n\t"
  165440. #else
  165441. "add r5, r5, r6\n\t"
  165442. #endif
  165443. #ifdef WOLFSSL_KEIL
  165444. "adcs r3, r3, r7\n\t"
  165445. #elif defined(__clang__)
  165446. "adcs r3, r7\n\t"
  165447. #else
  165448. "adc r3, r7\n\t"
  165449. #endif
  165450. #ifdef WOLFSSL_KEIL
  165451. "adcs r4, r4, %[r]\n\t"
  165452. #elif defined(__clang__)
  165453. "adcs r4, %[r]\n\t"
  165454. #else
  165455. "adc r4, %[r]\n\t"
  165456. #endif
  165457. "# A[9] * B[14]\n\t"
  165458. "mov %[a], r9\n\t"
  165459. "mov %[b], r10\n\t"
  165460. "ldr %[a], [%[a], #36]\n\t"
  165461. "ldr %[b], [%[b], #56]\n\t"
  165462. "uxth r6, %[a]\n\t"
  165463. "uxth r7, %[b]\n\t"
  165464. #ifdef WOLFSSL_KEIL
  165465. "muls r7, r6, r7\n\t"
  165466. #elif defined(__clang__)
  165467. "muls r7, r6\n\t"
  165468. #else
  165469. "mul r7, r6\n\t"
  165470. #endif
  165471. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165472. "adds r5, r5, r7\n\t"
  165473. #else
  165474. "add r5, r5, r7\n\t"
  165475. #endif
  165476. #ifdef WOLFSSL_KEIL
  165477. "adcs r3, r3, %[r]\n\t"
  165478. #elif defined(__clang__)
  165479. "adcs r3, %[r]\n\t"
  165480. #else
  165481. "adc r3, %[r]\n\t"
  165482. #endif
  165483. #ifdef WOLFSSL_KEIL
  165484. "adcs r4, r4, %[r]\n\t"
  165485. #elif defined(__clang__)
  165486. "adcs r4, %[r]\n\t"
  165487. #else
  165488. "adc r4, %[r]\n\t"
  165489. #endif
  165490. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165491. "lsrs r7, %[b], #16\n\t"
  165492. #else
  165493. "lsr r7, %[b], #16\n\t"
  165494. #endif
  165495. #ifdef WOLFSSL_KEIL
  165496. "muls r6, r7, r6\n\t"
  165497. #elif defined(__clang__)
  165498. "muls r6, r7\n\t"
  165499. #else
  165500. "mul r6, r7\n\t"
  165501. #endif
  165502. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165503. "lsrs r7, r6, #16\n\t"
  165504. #else
  165505. "lsr r7, r6, #16\n\t"
  165506. #endif
  165507. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165508. "lsls r6, r6, #16\n\t"
  165509. #else
  165510. "lsl r6, r6, #16\n\t"
  165511. #endif
  165512. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165513. "adds r5, r5, r6\n\t"
  165514. #else
  165515. "add r5, r5, r6\n\t"
  165516. #endif
  165517. #ifdef WOLFSSL_KEIL
  165518. "adcs r3, r3, r7\n\t"
  165519. #elif defined(__clang__)
  165520. "adcs r3, r7\n\t"
  165521. #else
  165522. "adc r3, r7\n\t"
  165523. #endif
  165524. #ifdef WOLFSSL_KEIL
  165525. "adcs r4, r4, %[r]\n\t"
  165526. #elif defined(__clang__)
  165527. "adcs r4, %[r]\n\t"
  165528. #else
  165529. "adc r4, %[r]\n\t"
  165530. #endif
  165531. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165532. "lsrs r6, %[a], #16\n\t"
  165533. #else
  165534. "lsr r6, %[a], #16\n\t"
  165535. #endif
  165536. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165537. "lsrs r7, %[b], #16\n\t"
  165538. #else
  165539. "lsr r7, %[b], #16\n\t"
  165540. #endif
  165541. #ifdef WOLFSSL_KEIL
  165542. "muls r7, r6, r7\n\t"
  165543. #elif defined(__clang__)
  165544. "muls r7, r6\n\t"
  165545. #else
  165546. "mul r7, r6\n\t"
  165547. #endif
  165548. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165549. "adds r3, r3, r7\n\t"
  165550. #else
  165551. "add r3, r3, r7\n\t"
  165552. #endif
  165553. #ifdef WOLFSSL_KEIL
  165554. "adcs r4, r4, %[r]\n\t"
  165555. #elif defined(__clang__)
  165556. "adcs r4, %[r]\n\t"
  165557. #else
  165558. "adc r4, %[r]\n\t"
  165559. #endif
  165560. "uxth r7, %[b]\n\t"
  165561. #ifdef WOLFSSL_KEIL
  165562. "muls r6, r7, r6\n\t"
  165563. #elif defined(__clang__)
  165564. "muls r6, r7\n\t"
  165565. #else
  165566. "mul r6, r7\n\t"
  165567. #endif
  165568. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165569. "lsrs r7, r6, #16\n\t"
  165570. #else
  165571. "lsr r7, r6, #16\n\t"
  165572. #endif
  165573. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165574. "lsls r6, r6, #16\n\t"
  165575. #else
  165576. "lsl r6, r6, #16\n\t"
  165577. #endif
  165578. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165579. "adds r5, r5, r6\n\t"
  165580. #else
  165581. "add r5, r5, r6\n\t"
  165582. #endif
  165583. #ifdef WOLFSSL_KEIL
  165584. "adcs r3, r3, r7\n\t"
  165585. #elif defined(__clang__)
  165586. "adcs r3, r7\n\t"
  165587. #else
  165588. "adc r3, r7\n\t"
  165589. #endif
  165590. #ifdef WOLFSSL_KEIL
  165591. "adcs r4, r4, %[r]\n\t"
  165592. #elif defined(__clang__)
  165593. "adcs r4, %[r]\n\t"
  165594. #else
  165595. "adc r4, %[r]\n\t"
  165596. #endif
  165597. "# A[10] * B[13]\n\t"
  165598. "mov %[a], r9\n\t"
  165599. "mov %[b], r10\n\t"
  165600. "ldr %[a], [%[a], #40]\n\t"
  165601. "ldr %[b], [%[b], #52]\n\t"
  165602. "uxth r6, %[a]\n\t"
  165603. "uxth r7, %[b]\n\t"
  165604. #ifdef WOLFSSL_KEIL
  165605. "muls r7, r6, r7\n\t"
  165606. #elif defined(__clang__)
  165607. "muls r7, r6\n\t"
  165608. #else
  165609. "mul r7, r6\n\t"
  165610. #endif
  165611. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165612. "adds r5, r5, r7\n\t"
  165613. #else
  165614. "add r5, r5, r7\n\t"
  165615. #endif
  165616. #ifdef WOLFSSL_KEIL
  165617. "adcs r3, r3, %[r]\n\t"
  165618. #elif defined(__clang__)
  165619. "adcs r3, %[r]\n\t"
  165620. #else
  165621. "adc r3, %[r]\n\t"
  165622. #endif
  165623. #ifdef WOLFSSL_KEIL
  165624. "adcs r4, r4, %[r]\n\t"
  165625. #elif defined(__clang__)
  165626. "adcs r4, %[r]\n\t"
  165627. #else
  165628. "adc r4, %[r]\n\t"
  165629. #endif
  165630. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165631. "lsrs r7, %[b], #16\n\t"
  165632. #else
  165633. "lsr r7, %[b], #16\n\t"
  165634. #endif
  165635. #ifdef WOLFSSL_KEIL
  165636. "muls r6, r7, r6\n\t"
  165637. #elif defined(__clang__)
  165638. "muls r6, r7\n\t"
  165639. #else
  165640. "mul r6, r7\n\t"
  165641. #endif
  165642. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165643. "lsrs r7, r6, #16\n\t"
  165644. #else
  165645. "lsr r7, r6, #16\n\t"
  165646. #endif
  165647. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165648. "lsls r6, r6, #16\n\t"
  165649. #else
  165650. "lsl r6, r6, #16\n\t"
  165651. #endif
  165652. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165653. "adds r5, r5, r6\n\t"
  165654. #else
  165655. "add r5, r5, r6\n\t"
  165656. #endif
  165657. #ifdef WOLFSSL_KEIL
  165658. "adcs r3, r3, r7\n\t"
  165659. #elif defined(__clang__)
  165660. "adcs r3, r7\n\t"
  165661. #else
  165662. "adc r3, r7\n\t"
  165663. #endif
  165664. #ifdef WOLFSSL_KEIL
  165665. "adcs r4, r4, %[r]\n\t"
  165666. #elif defined(__clang__)
  165667. "adcs r4, %[r]\n\t"
  165668. #else
  165669. "adc r4, %[r]\n\t"
  165670. #endif
  165671. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165672. "lsrs r6, %[a], #16\n\t"
  165673. #else
  165674. "lsr r6, %[a], #16\n\t"
  165675. #endif
  165676. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165677. "lsrs r7, %[b], #16\n\t"
  165678. #else
  165679. "lsr r7, %[b], #16\n\t"
  165680. #endif
  165681. #ifdef WOLFSSL_KEIL
  165682. "muls r7, r6, r7\n\t"
  165683. #elif defined(__clang__)
  165684. "muls r7, r6\n\t"
  165685. #else
  165686. "mul r7, r6\n\t"
  165687. #endif
  165688. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165689. "adds r3, r3, r7\n\t"
  165690. #else
  165691. "add r3, r3, r7\n\t"
  165692. #endif
  165693. #ifdef WOLFSSL_KEIL
  165694. "adcs r4, r4, %[r]\n\t"
  165695. #elif defined(__clang__)
  165696. "adcs r4, %[r]\n\t"
  165697. #else
  165698. "adc r4, %[r]\n\t"
  165699. #endif
  165700. "uxth r7, %[b]\n\t"
  165701. #ifdef WOLFSSL_KEIL
  165702. "muls r6, r7, r6\n\t"
  165703. #elif defined(__clang__)
  165704. "muls r6, r7\n\t"
  165705. #else
  165706. "mul r6, r7\n\t"
  165707. #endif
  165708. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165709. "lsrs r7, r6, #16\n\t"
  165710. #else
  165711. "lsr r7, r6, #16\n\t"
  165712. #endif
  165713. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165714. "lsls r6, r6, #16\n\t"
  165715. #else
  165716. "lsl r6, r6, #16\n\t"
  165717. #endif
  165718. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165719. "adds r5, r5, r6\n\t"
  165720. #else
  165721. "add r5, r5, r6\n\t"
  165722. #endif
  165723. #ifdef WOLFSSL_KEIL
  165724. "adcs r3, r3, r7\n\t"
  165725. #elif defined(__clang__)
  165726. "adcs r3, r7\n\t"
  165727. #else
  165728. "adc r3, r7\n\t"
  165729. #endif
  165730. #ifdef WOLFSSL_KEIL
  165731. "adcs r4, r4, %[r]\n\t"
  165732. #elif defined(__clang__)
  165733. "adcs r4, %[r]\n\t"
  165734. #else
  165735. "adc r4, %[r]\n\t"
  165736. #endif
  165737. "# A[11] * B[12]\n\t"
  165738. "mov %[a], r9\n\t"
  165739. "mov %[b], r10\n\t"
  165740. "ldr %[a], [%[a], #44]\n\t"
  165741. "ldr %[b], [%[b], #48]\n\t"
  165742. "uxth r6, %[a]\n\t"
  165743. "uxth r7, %[b]\n\t"
  165744. #ifdef WOLFSSL_KEIL
  165745. "muls r7, r6, r7\n\t"
  165746. #elif defined(__clang__)
  165747. "muls r7, r6\n\t"
  165748. #else
  165749. "mul r7, r6\n\t"
  165750. #endif
  165751. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165752. "adds r5, r5, r7\n\t"
  165753. #else
  165754. "add r5, r5, r7\n\t"
  165755. #endif
  165756. #ifdef WOLFSSL_KEIL
  165757. "adcs r3, r3, %[r]\n\t"
  165758. #elif defined(__clang__)
  165759. "adcs r3, %[r]\n\t"
  165760. #else
  165761. "adc r3, %[r]\n\t"
  165762. #endif
  165763. #ifdef WOLFSSL_KEIL
  165764. "adcs r4, r4, %[r]\n\t"
  165765. #elif defined(__clang__)
  165766. "adcs r4, %[r]\n\t"
  165767. #else
  165768. "adc r4, %[r]\n\t"
  165769. #endif
  165770. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165771. "lsrs r7, %[b], #16\n\t"
  165772. #else
  165773. "lsr r7, %[b], #16\n\t"
  165774. #endif
  165775. #ifdef WOLFSSL_KEIL
  165776. "muls r6, r7, r6\n\t"
  165777. #elif defined(__clang__)
  165778. "muls r6, r7\n\t"
  165779. #else
  165780. "mul r6, r7\n\t"
  165781. #endif
  165782. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165783. "lsrs r7, r6, #16\n\t"
  165784. #else
  165785. "lsr r7, r6, #16\n\t"
  165786. #endif
  165787. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165788. "lsls r6, r6, #16\n\t"
  165789. #else
  165790. "lsl r6, r6, #16\n\t"
  165791. #endif
  165792. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165793. "adds r5, r5, r6\n\t"
  165794. #else
  165795. "add r5, r5, r6\n\t"
  165796. #endif
  165797. #ifdef WOLFSSL_KEIL
  165798. "adcs r3, r3, r7\n\t"
  165799. #elif defined(__clang__)
  165800. "adcs r3, r7\n\t"
  165801. #else
  165802. "adc r3, r7\n\t"
  165803. #endif
  165804. #ifdef WOLFSSL_KEIL
  165805. "adcs r4, r4, %[r]\n\t"
  165806. #elif defined(__clang__)
  165807. "adcs r4, %[r]\n\t"
  165808. #else
  165809. "adc r4, %[r]\n\t"
  165810. #endif
  165811. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165812. "lsrs r6, %[a], #16\n\t"
  165813. #else
  165814. "lsr r6, %[a], #16\n\t"
  165815. #endif
  165816. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165817. "lsrs r7, %[b], #16\n\t"
  165818. #else
  165819. "lsr r7, %[b], #16\n\t"
  165820. #endif
  165821. #ifdef WOLFSSL_KEIL
  165822. "muls r7, r6, r7\n\t"
  165823. #elif defined(__clang__)
  165824. "muls r7, r6\n\t"
  165825. #else
  165826. "mul r7, r6\n\t"
  165827. #endif
  165828. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165829. "adds r3, r3, r7\n\t"
  165830. #else
  165831. "add r3, r3, r7\n\t"
  165832. #endif
  165833. #ifdef WOLFSSL_KEIL
  165834. "adcs r4, r4, %[r]\n\t"
  165835. #elif defined(__clang__)
  165836. "adcs r4, %[r]\n\t"
  165837. #else
  165838. "adc r4, %[r]\n\t"
  165839. #endif
  165840. "uxth r7, %[b]\n\t"
  165841. #ifdef WOLFSSL_KEIL
  165842. "muls r6, r7, r6\n\t"
  165843. #elif defined(__clang__)
  165844. "muls r6, r7\n\t"
  165845. #else
  165846. "mul r6, r7\n\t"
  165847. #endif
  165848. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165849. "lsrs r7, r6, #16\n\t"
  165850. #else
  165851. "lsr r7, r6, #16\n\t"
  165852. #endif
  165853. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165854. "lsls r6, r6, #16\n\t"
  165855. #else
  165856. "lsl r6, r6, #16\n\t"
  165857. #endif
  165858. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165859. "adds r5, r5, r6\n\t"
  165860. #else
  165861. "add r5, r5, r6\n\t"
  165862. #endif
  165863. #ifdef WOLFSSL_KEIL
  165864. "adcs r3, r3, r7\n\t"
  165865. #elif defined(__clang__)
  165866. "adcs r3, r7\n\t"
  165867. #else
  165868. "adc r3, r7\n\t"
  165869. #endif
  165870. #ifdef WOLFSSL_KEIL
  165871. "adcs r4, r4, %[r]\n\t"
  165872. #elif defined(__clang__)
  165873. "adcs r4, %[r]\n\t"
  165874. #else
  165875. "adc r4, %[r]\n\t"
  165876. #endif
  165877. "# A[12] * B[11]\n\t"
  165878. "mov %[a], r9\n\t"
  165879. "mov %[b], r10\n\t"
  165880. "ldr %[a], [%[a], #48]\n\t"
  165881. "ldr %[b], [%[b], #44]\n\t"
  165882. "uxth r6, %[a]\n\t"
  165883. "uxth r7, %[b]\n\t"
  165884. #ifdef WOLFSSL_KEIL
  165885. "muls r7, r6, r7\n\t"
  165886. #elif defined(__clang__)
  165887. "muls r7, r6\n\t"
  165888. #else
  165889. "mul r7, r6\n\t"
  165890. #endif
  165891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165892. "adds r5, r5, r7\n\t"
  165893. #else
  165894. "add r5, r5, r7\n\t"
  165895. #endif
  165896. #ifdef WOLFSSL_KEIL
  165897. "adcs r3, r3, %[r]\n\t"
  165898. #elif defined(__clang__)
  165899. "adcs r3, %[r]\n\t"
  165900. #else
  165901. "adc r3, %[r]\n\t"
  165902. #endif
  165903. #ifdef WOLFSSL_KEIL
  165904. "adcs r4, r4, %[r]\n\t"
  165905. #elif defined(__clang__)
  165906. "adcs r4, %[r]\n\t"
  165907. #else
  165908. "adc r4, %[r]\n\t"
  165909. #endif
  165910. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165911. "lsrs r7, %[b], #16\n\t"
  165912. #else
  165913. "lsr r7, %[b], #16\n\t"
  165914. #endif
  165915. #ifdef WOLFSSL_KEIL
  165916. "muls r6, r7, r6\n\t"
  165917. #elif defined(__clang__)
  165918. "muls r6, r7\n\t"
  165919. #else
  165920. "mul r6, r7\n\t"
  165921. #endif
  165922. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165923. "lsrs r7, r6, #16\n\t"
  165924. #else
  165925. "lsr r7, r6, #16\n\t"
  165926. #endif
  165927. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165928. "lsls r6, r6, #16\n\t"
  165929. #else
  165930. "lsl r6, r6, #16\n\t"
  165931. #endif
  165932. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165933. "adds r5, r5, r6\n\t"
  165934. #else
  165935. "add r5, r5, r6\n\t"
  165936. #endif
  165937. #ifdef WOLFSSL_KEIL
  165938. "adcs r3, r3, r7\n\t"
  165939. #elif defined(__clang__)
  165940. "adcs r3, r7\n\t"
  165941. #else
  165942. "adc r3, r7\n\t"
  165943. #endif
  165944. #ifdef WOLFSSL_KEIL
  165945. "adcs r4, r4, %[r]\n\t"
  165946. #elif defined(__clang__)
  165947. "adcs r4, %[r]\n\t"
  165948. #else
  165949. "adc r4, %[r]\n\t"
  165950. #endif
  165951. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165952. "lsrs r6, %[a], #16\n\t"
  165953. #else
  165954. "lsr r6, %[a], #16\n\t"
  165955. #endif
  165956. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165957. "lsrs r7, %[b], #16\n\t"
  165958. #else
  165959. "lsr r7, %[b], #16\n\t"
  165960. #endif
  165961. #ifdef WOLFSSL_KEIL
  165962. "muls r7, r6, r7\n\t"
  165963. #elif defined(__clang__)
  165964. "muls r7, r6\n\t"
  165965. #else
  165966. "mul r7, r6\n\t"
  165967. #endif
  165968. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165969. "adds r3, r3, r7\n\t"
  165970. #else
  165971. "add r3, r3, r7\n\t"
  165972. #endif
  165973. #ifdef WOLFSSL_KEIL
  165974. "adcs r4, r4, %[r]\n\t"
  165975. #elif defined(__clang__)
  165976. "adcs r4, %[r]\n\t"
  165977. #else
  165978. "adc r4, %[r]\n\t"
  165979. #endif
  165980. "uxth r7, %[b]\n\t"
  165981. #ifdef WOLFSSL_KEIL
  165982. "muls r6, r7, r6\n\t"
  165983. #elif defined(__clang__)
  165984. "muls r6, r7\n\t"
  165985. #else
  165986. "mul r6, r7\n\t"
  165987. #endif
  165988. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165989. "lsrs r7, r6, #16\n\t"
  165990. #else
  165991. "lsr r7, r6, #16\n\t"
  165992. #endif
  165993. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165994. "lsls r6, r6, #16\n\t"
  165995. #else
  165996. "lsl r6, r6, #16\n\t"
  165997. #endif
  165998. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165999. "adds r5, r5, r6\n\t"
  166000. #else
  166001. "add r5, r5, r6\n\t"
  166002. #endif
  166003. #ifdef WOLFSSL_KEIL
  166004. "adcs r3, r3, r7\n\t"
  166005. #elif defined(__clang__)
  166006. "adcs r3, r7\n\t"
  166007. #else
  166008. "adc r3, r7\n\t"
  166009. #endif
  166010. #ifdef WOLFSSL_KEIL
  166011. "adcs r4, r4, %[r]\n\t"
  166012. #elif defined(__clang__)
  166013. "adcs r4, %[r]\n\t"
  166014. #else
  166015. "adc r4, %[r]\n\t"
  166016. #endif
  166017. "# A[13] * B[10]\n\t"
  166018. "mov %[a], r9\n\t"
  166019. "mov %[b], r10\n\t"
  166020. "ldr %[a], [%[a], #52]\n\t"
  166021. "ldr %[b], [%[b], #40]\n\t"
  166022. "uxth r6, %[a]\n\t"
  166023. "uxth r7, %[b]\n\t"
  166024. #ifdef WOLFSSL_KEIL
  166025. "muls r7, r6, r7\n\t"
  166026. #elif defined(__clang__)
  166027. "muls r7, r6\n\t"
  166028. #else
  166029. "mul r7, r6\n\t"
  166030. #endif
  166031. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166032. "adds r5, r5, r7\n\t"
  166033. #else
  166034. "add r5, r5, r7\n\t"
  166035. #endif
  166036. #ifdef WOLFSSL_KEIL
  166037. "adcs r3, r3, %[r]\n\t"
  166038. #elif defined(__clang__)
  166039. "adcs r3, %[r]\n\t"
  166040. #else
  166041. "adc r3, %[r]\n\t"
  166042. #endif
  166043. #ifdef WOLFSSL_KEIL
  166044. "adcs r4, r4, %[r]\n\t"
  166045. #elif defined(__clang__)
  166046. "adcs r4, %[r]\n\t"
  166047. #else
  166048. "adc r4, %[r]\n\t"
  166049. #endif
  166050. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166051. "lsrs r7, %[b], #16\n\t"
  166052. #else
  166053. "lsr r7, %[b], #16\n\t"
  166054. #endif
  166055. #ifdef WOLFSSL_KEIL
  166056. "muls r6, r7, r6\n\t"
  166057. #elif defined(__clang__)
  166058. "muls r6, r7\n\t"
  166059. #else
  166060. "mul r6, r7\n\t"
  166061. #endif
  166062. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166063. "lsrs r7, r6, #16\n\t"
  166064. #else
  166065. "lsr r7, r6, #16\n\t"
  166066. #endif
  166067. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166068. "lsls r6, r6, #16\n\t"
  166069. #else
  166070. "lsl r6, r6, #16\n\t"
  166071. #endif
  166072. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166073. "adds r5, r5, r6\n\t"
  166074. #else
  166075. "add r5, r5, r6\n\t"
  166076. #endif
  166077. #ifdef WOLFSSL_KEIL
  166078. "adcs r3, r3, r7\n\t"
  166079. #elif defined(__clang__)
  166080. "adcs r3, r7\n\t"
  166081. #else
  166082. "adc r3, r7\n\t"
  166083. #endif
  166084. #ifdef WOLFSSL_KEIL
  166085. "adcs r4, r4, %[r]\n\t"
  166086. #elif defined(__clang__)
  166087. "adcs r4, %[r]\n\t"
  166088. #else
  166089. "adc r4, %[r]\n\t"
  166090. #endif
  166091. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166092. "lsrs r6, %[a], #16\n\t"
  166093. #else
  166094. "lsr r6, %[a], #16\n\t"
  166095. #endif
  166096. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166097. "lsrs r7, %[b], #16\n\t"
  166098. #else
  166099. "lsr r7, %[b], #16\n\t"
  166100. #endif
  166101. #ifdef WOLFSSL_KEIL
  166102. "muls r7, r6, r7\n\t"
  166103. #elif defined(__clang__)
  166104. "muls r7, r6\n\t"
  166105. #else
  166106. "mul r7, r6\n\t"
  166107. #endif
  166108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166109. "adds r3, r3, r7\n\t"
  166110. #else
  166111. "add r3, r3, r7\n\t"
  166112. #endif
  166113. #ifdef WOLFSSL_KEIL
  166114. "adcs r4, r4, %[r]\n\t"
  166115. #elif defined(__clang__)
  166116. "adcs r4, %[r]\n\t"
  166117. #else
  166118. "adc r4, %[r]\n\t"
  166119. #endif
  166120. "uxth r7, %[b]\n\t"
  166121. #ifdef WOLFSSL_KEIL
  166122. "muls r6, r7, r6\n\t"
  166123. #elif defined(__clang__)
  166124. "muls r6, r7\n\t"
  166125. #else
  166126. "mul r6, r7\n\t"
  166127. #endif
  166128. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166129. "lsrs r7, r6, #16\n\t"
  166130. #else
  166131. "lsr r7, r6, #16\n\t"
  166132. #endif
  166133. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166134. "lsls r6, r6, #16\n\t"
  166135. #else
  166136. "lsl r6, r6, #16\n\t"
  166137. #endif
  166138. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166139. "adds r5, r5, r6\n\t"
  166140. #else
  166141. "add r5, r5, r6\n\t"
  166142. #endif
  166143. #ifdef WOLFSSL_KEIL
  166144. "adcs r3, r3, r7\n\t"
  166145. #elif defined(__clang__)
  166146. "adcs r3, r7\n\t"
  166147. #else
  166148. "adc r3, r7\n\t"
  166149. #endif
  166150. #ifdef WOLFSSL_KEIL
  166151. "adcs r4, r4, %[r]\n\t"
  166152. #elif defined(__clang__)
  166153. "adcs r4, %[r]\n\t"
  166154. #else
  166155. "adc r4, %[r]\n\t"
  166156. #endif
  166157. "# A[14] * B[9]\n\t"
  166158. "mov %[a], r9\n\t"
  166159. "mov %[b], r10\n\t"
  166160. "ldr %[a], [%[a], #56]\n\t"
  166161. "ldr %[b], [%[b], #36]\n\t"
  166162. "uxth r6, %[a]\n\t"
  166163. "uxth r7, %[b]\n\t"
  166164. #ifdef WOLFSSL_KEIL
  166165. "muls r7, r6, r7\n\t"
  166166. #elif defined(__clang__)
  166167. "muls r7, r6\n\t"
  166168. #else
  166169. "mul r7, r6\n\t"
  166170. #endif
  166171. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166172. "adds r5, r5, r7\n\t"
  166173. #else
  166174. "add r5, r5, r7\n\t"
  166175. #endif
  166176. #ifdef WOLFSSL_KEIL
  166177. "adcs r3, r3, %[r]\n\t"
  166178. #elif defined(__clang__)
  166179. "adcs r3, %[r]\n\t"
  166180. #else
  166181. "adc r3, %[r]\n\t"
  166182. #endif
  166183. #ifdef WOLFSSL_KEIL
  166184. "adcs r4, r4, %[r]\n\t"
  166185. #elif defined(__clang__)
  166186. "adcs r4, %[r]\n\t"
  166187. #else
  166188. "adc r4, %[r]\n\t"
  166189. #endif
  166190. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166191. "lsrs r7, %[b], #16\n\t"
  166192. #else
  166193. "lsr r7, %[b], #16\n\t"
  166194. #endif
  166195. #ifdef WOLFSSL_KEIL
  166196. "muls r6, r7, r6\n\t"
  166197. #elif defined(__clang__)
  166198. "muls r6, r7\n\t"
  166199. #else
  166200. "mul r6, r7\n\t"
  166201. #endif
  166202. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166203. "lsrs r7, r6, #16\n\t"
  166204. #else
  166205. "lsr r7, r6, #16\n\t"
  166206. #endif
  166207. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166208. "lsls r6, r6, #16\n\t"
  166209. #else
  166210. "lsl r6, r6, #16\n\t"
  166211. #endif
  166212. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166213. "adds r5, r5, r6\n\t"
  166214. #else
  166215. "add r5, r5, r6\n\t"
  166216. #endif
  166217. #ifdef WOLFSSL_KEIL
  166218. "adcs r3, r3, r7\n\t"
  166219. #elif defined(__clang__)
  166220. "adcs r3, r7\n\t"
  166221. #else
  166222. "adc r3, r7\n\t"
  166223. #endif
  166224. #ifdef WOLFSSL_KEIL
  166225. "adcs r4, r4, %[r]\n\t"
  166226. #elif defined(__clang__)
  166227. "adcs r4, %[r]\n\t"
  166228. #else
  166229. "adc r4, %[r]\n\t"
  166230. #endif
  166231. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166232. "lsrs r6, %[a], #16\n\t"
  166233. #else
  166234. "lsr r6, %[a], #16\n\t"
  166235. #endif
  166236. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166237. "lsrs r7, %[b], #16\n\t"
  166238. #else
  166239. "lsr r7, %[b], #16\n\t"
  166240. #endif
  166241. #ifdef WOLFSSL_KEIL
  166242. "muls r7, r6, r7\n\t"
  166243. #elif defined(__clang__)
  166244. "muls r7, r6\n\t"
  166245. #else
  166246. "mul r7, r6\n\t"
  166247. #endif
  166248. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166249. "adds r3, r3, r7\n\t"
  166250. #else
  166251. "add r3, r3, r7\n\t"
  166252. #endif
  166253. #ifdef WOLFSSL_KEIL
  166254. "adcs r4, r4, %[r]\n\t"
  166255. #elif defined(__clang__)
  166256. "adcs r4, %[r]\n\t"
  166257. #else
  166258. "adc r4, %[r]\n\t"
  166259. #endif
  166260. "uxth r7, %[b]\n\t"
  166261. #ifdef WOLFSSL_KEIL
  166262. "muls r6, r7, r6\n\t"
  166263. #elif defined(__clang__)
  166264. "muls r6, r7\n\t"
  166265. #else
  166266. "mul r6, r7\n\t"
  166267. #endif
  166268. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166269. "lsrs r7, r6, #16\n\t"
  166270. #else
  166271. "lsr r7, r6, #16\n\t"
  166272. #endif
  166273. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166274. "lsls r6, r6, #16\n\t"
  166275. #else
  166276. "lsl r6, r6, #16\n\t"
  166277. #endif
  166278. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166279. "adds r5, r5, r6\n\t"
  166280. #else
  166281. "add r5, r5, r6\n\t"
  166282. #endif
  166283. #ifdef WOLFSSL_KEIL
  166284. "adcs r3, r3, r7\n\t"
  166285. #elif defined(__clang__)
  166286. "adcs r3, r7\n\t"
  166287. #else
  166288. "adc r3, r7\n\t"
  166289. #endif
  166290. #ifdef WOLFSSL_KEIL
  166291. "adcs r4, r4, %[r]\n\t"
  166292. #elif defined(__clang__)
  166293. "adcs r4, %[r]\n\t"
  166294. #else
  166295. "adc r4, %[r]\n\t"
  166296. #endif
  166297. "# A[15] * B[8]\n\t"
  166298. "mov %[a], r9\n\t"
  166299. "mov %[b], r10\n\t"
  166300. "ldr %[a], [%[a], #60]\n\t"
  166301. "ldr %[b], [%[b], #32]\n\t"
  166302. "uxth r6, %[a]\n\t"
  166303. "uxth r7, %[b]\n\t"
  166304. #ifdef WOLFSSL_KEIL
  166305. "muls r7, r6, r7\n\t"
  166306. #elif defined(__clang__)
  166307. "muls r7, r6\n\t"
  166308. #else
  166309. "mul r7, r6\n\t"
  166310. #endif
  166311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166312. "adds r5, r5, r7\n\t"
  166313. #else
  166314. "add r5, r5, r7\n\t"
  166315. #endif
  166316. #ifdef WOLFSSL_KEIL
  166317. "adcs r3, r3, %[r]\n\t"
  166318. #elif defined(__clang__)
  166319. "adcs r3, %[r]\n\t"
  166320. #else
  166321. "adc r3, %[r]\n\t"
  166322. #endif
  166323. #ifdef WOLFSSL_KEIL
  166324. "adcs r4, r4, %[r]\n\t"
  166325. #elif defined(__clang__)
  166326. "adcs r4, %[r]\n\t"
  166327. #else
  166328. "adc r4, %[r]\n\t"
  166329. #endif
  166330. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166331. "lsrs r7, %[b], #16\n\t"
  166332. #else
  166333. "lsr r7, %[b], #16\n\t"
  166334. #endif
  166335. #ifdef WOLFSSL_KEIL
  166336. "muls r6, r7, r6\n\t"
  166337. #elif defined(__clang__)
  166338. "muls r6, r7\n\t"
  166339. #else
  166340. "mul r6, r7\n\t"
  166341. #endif
  166342. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166343. "lsrs r7, r6, #16\n\t"
  166344. #else
  166345. "lsr r7, r6, #16\n\t"
  166346. #endif
  166347. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166348. "lsls r6, r6, #16\n\t"
  166349. #else
  166350. "lsl r6, r6, #16\n\t"
  166351. #endif
  166352. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166353. "adds r5, r5, r6\n\t"
  166354. #else
  166355. "add r5, r5, r6\n\t"
  166356. #endif
  166357. #ifdef WOLFSSL_KEIL
  166358. "adcs r3, r3, r7\n\t"
  166359. #elif defined(__clang__)
  166360. "adcs r3, r7\n\t"
  166361. #else
  166362. "adc r3, r7\n\t"
  166363. #endif
  166364. #ifdef WOLFSSL_KEIL
  166365. "adcs r4, r4, %[r]\n\t"
  166366. #elif defined(__clang__)
  166367. "adcs r4, %[r]\n\t"
  166368. #else
  166369. "adc r4, %[r]\n\t"
  166370. #endif
  166371. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166372. "lsrs r6, %[a], #16\n\t"
  166373. #else
  166374. "lsr r6, %[a], #16\n\t"
  166375. #endif
  166376. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166377. "lsrs r7, %[b], #16\n\t"
  166378. #else
  166379. "lsr r7, %[b], #16\n\t"
  166380. #endif
  166381. #ifdef WOLFSSL_KEIL
  166382. "muls r7, r6, r7\n\t"
  166383. #elif defined(__clang__)
  166384. "muls r7, r6\n\t"
  166385. #else
  166386. "mul r7, r6\n\t"
  166387. #endif
  166388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166389. "adds r3, r3, r7\n\t"
  166390. #else
  166391. "add r3, r3, r7\n\t"
  166392. #endif
  166393. #ifdef WOLFSSL_KEIL
  166394. "adcs r4, r4, %[r]\n\t"
  166395. #elif defined(__clang__)
  166396. "adcs r4, %[r]\n\t"
  166397. #else
  166398. "adc r4, %[r]\n\t"
  166399. #endif
  166400. "uxth r7, %[b]\n\t"
  166401. #ifdef WOLFSSL_KEIL
  166402. "muls r6, r7, r6\n\t"
  166403. #elif defined(__clang__)
  166404. "muls r6, r7\n\t"
  166405. #else
  166406. "mul r6, r7\n\t"
  166407. #endif
  166408. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166409. "lsrs r7, r6, #16\n\t"
  166410. #else
  166411. "lsr r7, r6, #16\n\t"
  166412. #endif
  166413. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166414. "lsls r6, r6, #16\n\t"
  166415. #else
  166416. "lsl r6, r6, #16\n\t"
  166417. #endif
  166418. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166419. "adds r5, r5, r6\n\t"
  166420. #else
  166421. "add r5, r5, r6\n\t"
  166422. #endif
  166423. #ifdef WOLFSSL_KEIL
  166424. "adcs r3, r3, r7\n\t"
  166425. #elif defined(__clang__)
  166426. "adcs r3, r7\n\t"
  166427. #else
  166428. "adc r3, r7\n\t"
  166429. #endif
  166430. #ifdef WOLFSSL_KEIL
  166431. "adcs r4, r4, %[r]\n\t"
  166432. #elif defined(__clang__)
  166433. "adcs r4, %[r]\n\t"
  166434. #else
  166435. "adc r4, %[r]\n\t"
  166436. #endif
  166437. "mov %[r], r8\n\t"
  166438. "str r5, [%[r], #92]\n\t"
  166439. "movs %[r], #0\n\t"
  166440. "# A[15] * B[9]\n\t"
  166441. "movs r5, #0\n\t"
  166442. "mov %[a], r9\n\t"
  166443. "mov %[b], r10\n\t"
  166444. "ldr %[a], [%[a], #60]\n\t"
  166445. "ldr %[b], [%[b], #36]\n\t"
  166446. "uxth r6, %[a]\n\t"
  166447. "uxth r7, %[b]\n\t"
  166448. #ifdef WOLFSSL_KEIL
  166449. "muls r7, r6, r7\n\t"
  166450. #elif defined(__clang__)
  166451. "muls r7, r6\n\t"
  166452. #else
  166453. "mul r7, r6\n\t"
  166454. #endif
  166455. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166456. "adds r3, r3, r7\n\t"
  166457. #else
  166458. "add r3, r3, r7\n\t"
  166459. #endif
  166460. #ifdef WOLFSSL_KEIL
  166461. "adcs r4, r4, %[r]\n\t"
  166462. #elif defined(__clang__)
  166463. "adcs r4, %[r]\n\t"
  166464. #else
  166465. "adc r4, %[r]\n\t"
  166466. #endif
  166467. #ifdef WOLFSSL_KEIL
  166468. "adcs r5, r5, %[r]\n\t"
  166469. #elif defined(__clang__)
  166470. "adcs r5, %[r]\n\t"
  166471. #else
  166472. "adc r5, %[r]\n\t"
  166473. #endif
  166474. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166475. "lsrs r7, %[b], #16\n\t"
  166476. #else
  166477. "lsr r7, %[b], #16\n\t"
  166478. #endif
  166479. #ifdef WOLFSSL_KEIL
  166480. "muls r6, r7, r6\n\t"
  166481. #elif defined(__clang__)
  166482. "muls r6, r7\n\t"
  166483. #else
  166484. "mul r6, r7\n\t"
  166485. #endif
  166486. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166487. "lsrs r7, r6, #16\n\t"
  166488. #else
  166489. "lsr r7, r6, #16\n\t"
  166490. #endif
  166491. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166492. "lsls r6, r6, #16\n\t"
  166493. #else
  166494. "lsl r6, r6, #16\n\t"
  166495. #endif
  166496. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166497. "adds r3, r3, r6\n\t"
  166498. #else
  166499. "add r3, r3, r6\n\t"
  166500. #endif
  166501. #ifdef WOLFSSL_KEIL
  166502. "adcs r4, r4, r7\n\t"
  166503. #elif defined(__clang__)
  166504. "adcs r4, r7\n\t"
  166505. #else
  166506. "adc r4, r7\n\t"
  166507. #endif
  166508. #ifdef WOLFSSL_KEIL
  166509. "adcs r5, r5, %[r]\n\t"
  166510. #elif defined(__clang__)
  166511. "adcs r5, %[r]\n\t"
  166512. #else
  166513. "adc r5, %[r]\n\t"
  166514. #endif
  166515. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166516. "lsrs r6, %[a], #16\n\t"
  166517. #else
  166518. "lsr r6, %[a], #16\n\t"
  166519. #endif
  166520. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166521. "lsrs r7, %[b], #16\n\t"
  166522. #else
  166523. "lsr r7, %[b], #16\n\t"
  166524. #endif
  166525. #ifdef WOLFSSL_KEIL
  166526. "muls r7, r6, r7\n\t"
  166527. #elif defined(__clang__)
  166528. "muls r7, r6\n\t"
  166529. #else
  166530. "mul r7, r6\n\t"
  166531. #endif
  166532. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166533. "adds r4, r4, r7\n\t"
  166534. #else
  166535. "add r4, r4, r7\n\t"
  166536. #endif
  166537. #ifdef WOLFSSL_KEIL
  166538. "adcs r5, r5, %[r]\n\t"
  166539. #elif defined(__clang__)
  166540. "adcs r5, %[r]\n\t"
  166541. #else
  166542. "adc r5, %[r]\n\t"
  166543. #endif
  166544. "uxth r7, %[b]\n\t"
  166545. #ifdef WOLFSSL_KEIL
  166546. "muls r6, r7, r6\n\t"
  166547. #elif defined(__clang__)
  166548. "muls r6, r7\n\t"
  166549. #else
  166550. "mul r6, r7\n\t"
  166551. #endif
  166552. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166553. "lsrs r7, r6, #16\n\t"
  166554. #else
  166555. "lsr r7, r6, #16\n\t"
  166556. #endif
  166557. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166558. "lsls r6, r6, #16\n\t"
  166559. #else
  166560. "lsl r6, r6, #16\n\t"
  166561. #endif
  166562. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166563. "adds r3, r3, r6\n\t"
  166564. #else
  166565. "add r3, r3, r6\n\t"
  166566. #endif
  166567. #ifdef WOLFSSL_KEIL
  166568. "adcs r4, r4, r7\n\t"
  166569. #elif defined(__clang__)
  166570. "adcs r4, r7\n\t"
  166571. #else
  166572. "adc r4, r7\n\t"
  166573. #endif
  166574. #ifdef WOLFSSL_KEIL
  166575. "adcs r5, r5, %[r]\n\t"
  166576. #elif defined(__clang__)
  166577. "adcs r5, %[r]\n\t"
  166578. #else
  166579. "adc r5, %[r]\n\t"
  166580. #endif
  166581. "# A[14] * B[10]\n\t"
  166582. "mov %[a], r9\n\t"
  166583. "mov %[b], r10\n\t"
  166584. "ldr %[a], [%[a], #56]\n\t"
  166585. "ldr %[b], [%[b], #40]\n\t"
  166586. "uxth r6, %[a]\n\t"
  166587. "uxth r7, %[b]\n\t"
  166588. #ifdef WOLFSSL_KEIL
  166589. "muls r7, r6, r7\n\t"
  166590. #elif defined(__clang__)
  166591. "muls r7, r6\n\t"
  166592. #else
  166593. "mul r7, r6\n\t"
  166594. #endif
  166595. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166596. "adds r3, r3, r7\n\t"
  166597. #else
  166598. "add r3, r3, r7\n\t"
  166599. #endif
  166600. #ifdef WOLFSSL_KEIL
  166601. "adcs r4, r4, %[r]\n\t"
  166602. #elif defined(__clang__)
  166603. "adcs r4, %[r]\n\t"
  166604. #else
  166605. "adc r4, %[r]\n\t"
  166606. #endif
  166607. #ifdef WOLFSSL_KEIL
  166608. "adcs r5, r5, %[r]\n\t"
  166609. #elif defined(__clang__)
  166610. "adcs r5, %[r]\n\t"
  166611. #else
  166612. "adc r5, %[r]\n\t"
  166613. #endif
  166614. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166615. "lsrs r7, %[b], #16\n\t"
  166616. #else
  166617. "lsr r7, %[b], #16\n\t"
  166618. #endif
  166619. #ifdef WOLFSSL_KEIL
  166620. "muls r6, r7, r6\n\t"
  166621. #elif defined(__clang__)
  166622. "muls r6, r7\n\t"
  166623. #else
  166624. "mul r6, r7\n\t"
  166625. #endif
  166626. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166627. "lsrs r7, r6, #16\n\t"
  166628. #else
  166629. "lsr r7, r6, #16\n\t"
  166630. #endif
  166631. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166632. "lsls r6, r6, #16\n\t"
  166633. #else
  166634. "lsl r6, r6, #16\n\t"
  166635. #endif
  166636. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166637. "adds r3, r3, r6\n\t"
  166638. #else
  166639. "add r3, r3, r6\n\t"
  166640. #endif
  166641. #ifdef WOLFSSL_KEIL
  166642. "adcs r4, r4, r7\n\t"
  166643. #elif defined(__clang__)
  166644. "adcs r4, r7\n\t"
  166645. #else
  166646. "adc r4, r7\n\t"
  166647. #endif
  166648. #ifdef WOLFSSL_KEIL
  166649. "adcs r5, r5, %[r]\n\t"
  166650. #elif defined(__clang__)
  166651. "adcs r5, %[r]\n\t"
  166652. #else
  166653. "adc r5, %[r]\n\t"
  166654. #endif
  166655. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166656. "lsrs r6, %[a], #16\n\t"
  166657. #else
  166658. "lsr r6, %[a], #16\n\t"
  166659. #endif
  166660. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166661. "lsrs r7, %[b], #16\n\t"
  166662. #else
  166663. "lsr r7, %[b], #16\n\t"
  166664. #endif
  166665. #ifdef WOLFSSL_KEIL
  166666. "muls r7, r6, r7\n\t"
  166667. #elif defined(__clang__)
  166668. "muls r7, r6\n\t"
  166669. #else
  166670. "mul r7, r6\n\t"
  166671. #endif
  166672. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166673. "adds r4, r4, r7\n\t"
  166674. #else
  166675. "add r4, r4, r7\n\t"
  166676. #endif
  166677. #ifdef WOLFSSL_KEIL
  166678. "adcs r5, r5, %[r]\n\t"
  166679. #elif defined(__clang__)
  166680. "adcs r5, %[r]\n\t"
  166681. #else
  166682. "adc r5, %[r]\n\t"
  166683. #endif
  166684. "uxth r7, %[b]\n\t"
  166685. #ifdef WOLFSSL_KEIL
  166686. "muls r6, r7, r6\n\t"
  166687. #elif defined(__clang__)
  166688. "muls r6, r7\n\t"
  166689. #else
  166690. "mul r6, r7\n\t"
  166691. #endif
  166692. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166693. "lsrs r7, r6, #16\n\t"
  166694. #else
  166695. "lsr r7, r6, #16\n\t"
  166696. #endif
  166697. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166698. "lsls r6, r6, #16\n\t"
  166699. #else
  166700. "lsl r6, r6, #16\n\t"
  166701. #endif
  166702. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166703. "adds r3, r3, r6\n\t"
  166704. #else
  166705. "add r3, r3, r6\n\t"
  166706. #endif
  166707. #ifdef WOLFSSL_KEIL
  166708. "adcs r4, r4, r7\n\t"
  166709. #elif defined(__clang__)
  166710. "adcs r4, r7\n\t"
  166711. #else
  166712. "adc r4, r7\n\t"
  166713. #endif
  166714. #ifdef WOLFSSL_KEIL
  166715. "adcs r5, r5, %[r]\n\t"
  166716. #elif defined(__clang__)
  166717. "adcs r5, %[r]\n\t"
  166718. #else
  166719. "adc r5, %[r]\n\t"
  166720. #endif
  166721. "# A[13] * B[11]\n\t"
  166722. "mov %[a], r9\n\t"
  166723. "mov %[b], r10\n\t"
  166724. "ldr %[a], [%[a], #52]\n\t"
  166725. "ldr %[b], [%[b], #44]\n\t"
  166726. "uxth r6, %[a]\n\t"
  166727. "uxth r7, %[b]\n\t"
  166728. #ifdef WOLFSSL_KEIL
  166729. "muls r7, r6, r7\n\t"
  166730. #elif defined(__clang__)
  166731. "muls r7, r6\n\t"
  166732. #else
  166733. "mul r7, r6\n\t"
  166734. #endif
  166735. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166736. "adds r3, r3, r7\n\t"
  166737. #else
  166738. "add r3, r3, r7\n\t"
  166739. #endif
  166740. #ifdef WOLFSSL_KEIL
  166741. "adcs r4, r4, %[r]\n\t"
  166742. #elif defined(__clang__)
  166743. "adcs r4, %[r]\n\t"
  166744. #else
  166745. "adc r4, %[r]\n\t"
  166746. #endif
  166747. #ifdef WOLFSSL_KEIL
  166748. "adcs r5, r5, %[r]\n\t"
  166749. #elif defined(__clang__)
  166750. "adcs r5, %[r]\n\t"
  166751. #else
  166752. "adc r5, %[r]\n\t"
  166753. #endif
  166754. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166755. "lsrs r7, %[b], #16\n\t"
  166756. #else
  166757. "lsr r7, %[b], #16\n\t"
  166758. #endif
  166759. #ifdef WOLFSSL_KEIL
  166760. "muls r6, r7, r6\n\t"
  166761. #elif defined(__clang__)
  166762. "muls r6, r7\n\t"
  166763. #else
  166764. "mul r6, r7\n\t"
  166765. #endif
  166766. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166767. "lsrs r7, r6, #16\n\t"
  166768. #else
  166769. "lsr r7, r6, #16\n\t"
  166770. #endif
  166771. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166772. "lsls r6, r6, #16\n\t"
  166773. #else
  166774. "lsl r6, r6, #16\n\t"
  166775. #endif
  166776. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166777. "adds r3, r3, r6\n\t"
  166778. #else
  166779. "add r3, r3, r6\n\t"
  166780. #endif
  166781. #ifdef WOLFSSL_KEIL
  166782. "adcs r4, r4, r7\n\t"
  166783. #elif defined(__clang__)
  166784. "adcs r4, r7\n\t"
  166785. #else
  166786. "adc r4, r7\n\t"
  166787. #endif
  166788. #ifdef WOLFSSL_KEIL
  166789. "adcs r5, r5, %[r]\n\t"
  166790. #elif defined(__clang__)
  166791. "adcs r5, %[r]\n\t"
  166792. #else
  166793. "adc r5, %[r]\n\t"
  166794. #endif
  166795. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166796. "lsrs r6, %[a], #16\n\t"
  166797. #else
  166798. "lsr r6, %[a], #16\n\t"
  166799. #endif
  166800. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166801. "lsrs r7, %[b], #16\n\t"
  166802. #else
  166803. "lsr r7, %[b], #16\n\t"
  166804. #endif
  166805. #ifdef WOLFSSL_KEIL
  166806. "muls r7, r6, r7\n\t"
  166807. #elif defined(__clang__)
  166808. "muls r7, r6\n\t"
  166809. #else
  166810. "mul r7, r6\n\t"
  166811. #endif
  166812. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166813. "adds r4, r4, r7\n\t"
  166814. #else
  166815. "add r4, r4, r7\n\t"
  166816. #endif
  166817. #ifdef WOLFSSL_KEIL
  166818. "adcs r5, r5, %[r]\n\t"
  166819. #elif defined(__clang__)
  166820. "adcs r5, %[r]\n\t"
  166821. #else
  166822. "adc r5, %[r]\n\t"
  166823. #endif
  166824. "uxth r7, %[b]\n\t"
  166825. #ifdef WOLFSSL_KEIL
  166826. "muls r6, r7, r6\n\t"
  166827. #elif defined(__clang__)
  166828. "muls r6, r7\n\t"
  166829. #else
  166830. "mul r6, r7\n\t"
  166831. #endif
  166832. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166833. "lsrs r7, r6, #16\n\t"
  166834. #else
  166835. "lsr r7, r6, #16\n\t"
  166836. #endif
  166837. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166838. "lsls r6, r6, #16\n\t"
  166839. #else
  166840. "lsl r6, r6, #16\n\t"
  166841. #endif
  166842. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166843. "adds r3, r3, r6\n\t"
  166844. #else
  166845. "add r3, r3, r6\n\t"
  166846. #endif
  166847. #ifdef WOLFSSL_KEIL
  166848. "adcs r4, r4, r7\n\t"
  166849. #elif defined(__clang__)
  166850. "adcs r4, r7\n\t"
  166851. #else
  166852. "adc r4, r7\n\t"
  166853. #endif
  166854. #ifdef WOLFSSL_KEIL
  166855. "adcs r5, r5, %[r]\n\t"
  166856. #elif defined(__clang__)
  166857. "adcs r5, %[r]\n\t"
  166858. #else
  166859. "adc r5, %[r]\n\t"
  166860. #endif
  166861. "# A[12] * B[12]\n\t"
  166862. "mov %[a], r9\n\t"
  166863. "mov %[b], r10\n\t"
  166864. "ldr %[a], [%[a], #48]\n\t"
  166865. "ldr %[b], [%[b], #48]\n\t"
  166866. "uxth r6, %[a]\n\t"
  166867. "uxth r7, %[b]\n\t"
  166868. #ifdef WOLFSSL_KEIL
  166869. "muls r7, r6, r7\n\t"
  166870. #elif defined(__clang__)
  166871. "muls r7, r6\n\t"
  166872. #else
  166873. "mul r7, r6\n\t"
  166874. #endif
  166875. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166876. "adds r3, r3, r7\n\t"
  166877. #else
  166878. "add r3, r3, r7\n\t"
  166879. #endif
  166880. #ifdef WOLFSSL_KEIL
  166881. "adcs r4, r4, %[r]\n\t"
  166882. #elif defined(__clang__)
  166883. "adcs r4, %[r]\n\t"
  166884. #else
  166885. "adc r4, %[r]\n\t"
  166886. #endif
  166887. #ifdef WOLFSSL_KEIL
  166888. "adcs r5, r5, %[r]\n\t"
  166889. #elif defined(__clang__)
  166890. "adcs r5, %[r]\n\t"
  166891. #else
  166892. "adc r5, %[r]\n\t"
  166893. #endif
  166894. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166895. "lsrs r7, %[b], #16\n\t"
  166896. #else
  166897. "lsr r7, %[b], #16\n\t"
  166898. #endif
  166899. #ifdef WOLFSSL_KEIL
  166900. "muls r6, r7, r6\n\t"
  166901. #elif defined(__clang__)
  166902. "muls r6, r7\n\t"
  166903. #else
  166904. "mul r6, r7\n\t"
  166905. #endif
  166906. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166907. "lsrs r7, r6, #16\n\t"
  166908. #else
  166909. "lsr r7, r6, #16\n\t"
  166910. #endif
  166911. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166912. "lsls r6, r6, #16\n\t"
  166913. #else
  166914. "lsl r6, r6, #16\n\t"
  166915. #endif
  166916. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166917. "adds r3, r3, r6\n\t"
  166918. #else
  166919. "add r3, r3, r6\n\t"
  166920. #endif
  166921. #ifdef WOLFSSL_KEIL
  166922. "adcs r4, r4, r7\n\t"
  166923. #elif defined(__clang__)
  166924. "adcs r4, r7\n\t"
  166925. #else
  166926. "adc r4, r7\n\t"
  166927. #endif
  166928. #ifdef WOLFSSL_KEIL
  166929. "adcs r5, r5, %[r]\n\t"
  166930. #elif defined(__clang__)
  166931. "adcs r5, %[r]\n\t"
  166932. #else
  166933. "adc r5, %[r]\n\t"
  166934. #endif
  166935. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166936. "lsrs r6, %[a], #16\n\t"
  166937. #else
  166938. "lsr r6, %[a], #16\n\t"
  166939. #endif
  166940. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166941. "lsrs r7, %[b], #16\n\t"
  166942. #else
  166943. "lsr r7, %[b], #16\n\t"
  166944. #endif
  166945. #ifdef WOLFSSL_KEIL
  166946. "muls r7, r6, r7\n\t"
  166947. #elif defined(__clang__)
  166948. "muls r7, r6\n\t"
  166949. #else
  166950. "mul r7, r6\n\t"
  166951. #endif
  166952. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166953. "adds r4, r4, r7\n\t"
  166954. #else
  166955. "add r4, r4, r7\n\t"
  166956. #endif
  166957. #ifdef WOLFSSL_KEIL
  166958. "adcs r5, r5, %[r]\n\t"
  166959. #elif defined(__clang__)
  166960. "adcs r5, %[r]\n\t"
  166961. #else
  166962. "adc r5, %[r]\n\t"
  166963. #endif
  166964. "uxth r7, %[b]\n\t"
  166965. #ifdef WOLFSSL_KEIL
  166966. "muls r6, r7, r6\n\t"
  166967. #elif defined(__clang__)
  166968. "muls r6, r7\n\t"
  166969. #else
  166970. "mul r6, r7\n\t"
  166971. #endif
  166972. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166973. "lsrs r7, r6, #16\n\t"
  166974. #else
  166975. "lsr r7, r6, #16\n\t"
  166976. #endif
  166977. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166978. "lsls r6, r6, #16\n\t"
  166979. #else
  166980. "lsl r6, r6, #16\n\t"
  166981. #endif
  166982. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166983. "adds r3, r3, r6\n\t"
  166984. #else
  166985. "add r3, r3, r6\n\t"
  166986. #endif
  166987. #ifdef WOLFSSL_KEIL
  166988. "adcs r4, r4, r7\n\t"
  166989. #elif defined(__clang__)
  166990. "adcs r4, r7\n\t"
  166991. #else
  166992. "adc r4, r7\n\t"
  166993. #endif
  166994. #ifdef WOLFSSL_KEIL
  166995. "adcs r5, r5, %[r]\n\t"
  166996. #elif defined(__clang__)
  166997. "adcs r5, %[r]\n\t"
  166998. #else
  166999. "adc r5, %[r]\n\t"
  167000. #endif
  167001. "# A[11] * B[13]\n\t"
  167002. "mov %[a], r9\n\t"
  167003. "mov %[b], r10\n\t"
  167004. "ldr %[a], [%[a], #44]\n\t"
  167005. "ldr %[b], [%[b], #52]\n\t"
  167006. "uxth r6, %[a]\n\t"
  167007. "uxth r7, %[b]\n\t"
  167008. #ifdef WOLFSSL_KEIL
  167009. "muls r7, r6, r7\n\t"
  167010. #elif defined(__clang__)
  167011. "muls r7, r6\n\t"
  167012. #else
  167013. "mul r7, r6\n\t"
  167014. #endif
  167015. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167016. "adds r3, r3, r7\n\t"
  167017. #else
  167018. "add r3, r3, r7\n\t"
  167019. #endif
  167020. #ifdef WOLFSSL_KEIL
  167021. "adcs r4, r4, %[r]\n\t"
  167022. #elif defined(__clang__)
  167023. "adcs r4, %[r]\n\t"
  167024. #else
  167025. "adc r4, %[r]\n\t"
  167026. #endif
  167027. #ifdef WOLFSSL_KEIL
  167028. "adcs r5, r5, %[r]\n\t"
  167029. #elif defined(__clang__)
  167030. "adcs r5, %[r]\n\t"
  167031. #else
  167032. "adc r5, %[r]\n\t"
  167033. #endif
  167034. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167035. "lsrs r7, %[b], #16\n\t"
  167036. #else
  167037. "lsr r7, %[b], #16\n\t"
  167038. #endif
  167039. #ifdef WOLFSSL_KEIL
  167040. "muls r6, r7, r6\n\t"
  167041. #elif defined(__clang__)
  167042. "muls r6, r7\n\t"
  167043. #else
  167044. "mul r6, r7\n\t"
  167045. #endif
  167046. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167047. "lsrs r7, r6, #16\n\t"
  167048. #else
  167049. "lsr r7, r6, #16\n\t"
  167050. #endif
  167051. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167052. "lsls r6, r6, #16\n\t"
  167053. #else
  167054. "lsl r6, r6, #16\n\t"
  167055. #endif
  167056. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167057. "adds r3, r3, r6\n\t"
  167058. #else
  167059. "add r3, r3, r6\n\t"
  167060. #endif
  167061. #ifdef WOLFSSL_KEIL
  167062. "adcs r4, r4, r7\n\t"
  167063. #elif defined(__clang__)
  167064. "adcs r4, r7\n\t"
  167065. #else
  167066. "adc r4, r7\n\t"
  167067. #endif
  167068. #ifdef WOLFSSL_KEIL
  167069. "adcs r5, r5, %[r]\n\t"
  167070. #elif defined(__clang__)
  167071. "adcs r5, %[r]\n\t"
  167072. #else
  167073. "adc r5, %[r]\n\t"
  167074. #endif
  167075. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167076. "lsrs r6, %[a], #16\n\t"
  167077. #else
  167078. "lsr r6, %[a], #16\n\t"
  167079. #endif
  167080. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167081. "lsrs r7, %[b], #16\n\t"
  167082. #else
  167083. "lsr r7, %[b], #16\n\t"
  167084. #endif
  167085. #ifdef WOLFSSL_KEIL
  167086. "muls r7, r6, r7\n\t"
  167087. #elif defined(__clang__)
  167088. "muls r7, r6\n\t"
  167089. #else
  167090. "mul r7, r6\n\t"
  167091. #endif
  167092. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167093. "adds r4, r4, r7\n\t"
  167094. #else
  167095. "add r4, r4, r7\n\t"
  167096. #endif
  167097. #ifdef WOLFSSL_KEIL
  167098. "adcs r5, r5, %[r]\n\t"
  167099. #elif defined(__clang__)
  167100. "adcs r5, %[r]\n\t"
  167101. #else
  167102. "adc r5, %[r]\n\t"
  167103. #endif
  167104. "uxth r7, %[b]\n\t"
  167105. #ifdef WOLFSSL_KEIL
  167106. "muls r6, r7, r6\n\t"
  167107. #elif defined(__clang__)
  167108. "muls r6, r7\n\t"
  167109. #else
  167110. "mul r6, r7\n\t"
  167111. #endif
  167112. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167113. "lsrs r7, r6, #16\n\t"
  167114. #else
  167115. "lsr r7, r6, #16\n\t"
  167116. #endif
  167117. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167118. "lsls r6, r6, #16\n\t"
  167119. #else
  167120. "lsl r6, r6, #16\n\t"
  167121. #endif
  167122. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167123. "adds r3, r3, r6\n\t"
  167124. #else
  167125. "add r3, r3, r6\n\t"
  167126. #endif
  167127. #ifdef WOLFSSL_KEIL
  167128. "adcs r4, r4, r7\n\t"
  167129. #elif defined(__clang__)
  167130. "adcs r4, r7\n\t"
  167131. #else
  167132. "adc r4, r7\n\t"
  167133. #endif
  167134. #ifdef WOLFSSL_KEIL
  167135. "adcs r5, r5, %[r]\n\t"
  167136. #elif defined(__clang__)
  167137. "adcs r5, %[r]\n\t"
  167138. #else
  167139. "adc r5, %[r]\n\t"
  167140. #endif
  167141. "# A[10] * B[14]\n\t"
  167142. "mov %[a], r9\n\t"
  167143. "mov %[b], r10\n\t"
  167144. "ldr %[a], [%[a], #40]\n\t"
  167145. "ldr %[b], [%[b], #56]\n\t"
  167146. "uxth r6, %[a]\n\t"
  167147. "uxth r7, %[b]\n\t"
  167148. #ifdef WOLFSSL_KEIL
  167149. "muls r7, r6, r7\n\t"
  167150. #elif defined(__clang__)
  167151. "muls r7, r6\n\t"
  167152. #else
  167153. "mul r7, r6\n\t"
  167154. #endif
  167155. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167156. "adds r3, r3, r7\n\t"
  167157. #else
  167158. "add r3, r3, r7\n\t"
  167159. #endif
  167160. #ifdef WOLFSSL_KEIL
  167161. "adcs r4, r4, %[r]\n\t"
  167162. #elif defined(__clang__)
  167163. "adcs r4, %[r]\n\t"
  167164. #else
  167165. "adc r4, %[r]\n\t"
  167166. #endif
  167167. #ifdef WOLFSSL_KEIL
  167168. "adcs r5, r5, %[r]\n\t"
  167169. #elif defined(__clang__)
  167170. "adcs r5, %[r]\n\t"
  167171. #else
  167172. "adc r5, %[r]\n\t"
  167173. #endif
  167174. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167175. "lsrs r7, %[b], #16\n\t"
  167176. #else
  167177. "lsr r7, %[b], #16\n\t"
  167178. #endif
  167179. #ifdef WOLFSSL_KEIL
  167180. "muls r6, r7, r6\n\t"
  167181. #elif defined(__clang__)
  167182. "muls r6, r7\n\t"
  167183. #else
  167184. "mul r6, r7\n\t"
  167185. #endif
  167186. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167187. "lsrs r7, r6, #16\n\t"
  167188. #else
  167189. "lsr r7, r6, #16\n\t"
  167190. #endif
  167191. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167192. "lsls r6, r6, #16\n\t"
  167193. #else
  167194. "lsl r6, r6, #16\n\t"
  167195. #endif
  167196. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167197. "adds r3, r3, r6\n\t"
  167198. #else
  167199. "add r3, r3, r6\n\t"
  167200. #endif
  167201. #ifdef WOLFSSL_KEIL
  167202. "adcs r4, r4, r7\n\t"
  167203. #elif defined(__clang__)
  167204. "adcs r4, r7\n\t"
  167205. #else
  167206. "adc r4, r7\n\t"
  167207. #endif
  167208. #ifdef WOLFSSL_KEIL
  167209. "adcs r5, r5, %[r]\n\t"
  167210. #elif defined(__clang__)
  167211. "adcs r5, %[r]\n\t"
  167212. #else
  167213. "adc r5, %[r]\n\t"
  167214. #endif
  167215. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167216. "lsrs r6, %[a], #16\n\t"
  167217. #else
  167218. "lsr r6, %[a], #16\n\t"
  167219. #endif
  167220. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167221. "lsrs r7, %[b], #16\n\t"
  167222. #else
  167223. "lsr r7, %[b], #16\n\t"
  167224. #endif
  167225. #ifdef WOLFSSL_KEIL
  167226. "muls r7, r6, r7\n\t"
  167227. #elif defined(__clang__)
  167228. "muls r7, r6\n\t"
  167229. #else
  167230. "mul r7, r6\n\t"
  167231. #endif
  167232. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167233. "adds r4, r4, r7\n\t"
  167234. #else
  167235. "add r4, r4, r7\n\t"
  167236. #endif
  167237. #ifdef WOLFSSL_KEIL
  167238. "adcs r5, r5, %[r]\n\t"
  167239. #elif defined(__clang__)
  167240. "adcs r5, %[r]\n\t"
  167241. #else
  167242. "adc r5, %[r]\n\t"
  167243. #endif
  167244. "uxth r7, %[b]\n\t"
  167245. #ifdef WOLFSSL_KEIL
  167246. "muls r6, r7, r6\n\t"
  167247. #elif defined(__clang__)
  167248. "muls r6, r7\n\t"
  167249. #else
  167250. "mul r6, r7\n\t"
  167251. #endif
  167252. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167253. "lsrs r7, r6, #16\n\t"
  167254. #else
  167255. "lsr r7, r6, #16\n\t"
  167256. #endif
  167257. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167258. "lsls r6, r6, #16\n\t"
  167259. #else
  167260. "lsl r6, r6, #16\n\t"
  167261. #endif
  167262. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167263. "adds r3, r3, r6\n\t"
  167264. #else
  167265. "add r3, r3, r6\n\t"
  167266. #endif
  167267. #ifdef WOLFSSL_KEIL
  167268. "adcs r4, r4, r7\n\t"
  167269. #elif defined(__clang__)
  167270. "adcs r4, r7\n\t"
  167271. #else
  167272. "adc r4, r7\n\t"
  167273. #endif
  167274. #ifdef WOLFSSL_KEIL
  167275. "adcs r5, r5, %[r]\n\t"
  167276. #elif defined(__clang__)
  167277. "adcs r5, %[r]\n\t"
  167278. #else
  167279. "adc r5, %[r]\n\t"
  167280. #endif
  167281. "# A[9] * B[15]\n\t"
  167282. "mov %[a], r9\n\t"
  167283. "mov %[b], r10\n\t"
  167284. "ldr %[a], [%[a], #36]\n\t"
  167285. "ldr %[b], [%[b], #60]\n\t"
  167286. "uxth r6, %[a]\n\t"
  167287. "uxth r7, %[b]\n\t"
  167288. #ifdef WOLFSSL_KEIL
  167289. "muls r7, r6, r7\n\t"
  167290. #elif defined(__clang__)
  167291. "muls r7, r6\n\t"
  167292. #else
  167293. "mul r7, r6\n\t"
  167294. #endif
  167295. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167296. "adds r3, r3, r7\n\t"
  167297. #else
  167298. "add r3, r3, r7\n\t"
  167299. #endif
  167300. #ifdef WOLFSSL_KEIL
  167301. "adcs r4, r4, %[r]\n\t"
  167302. #elif defined(__clang__)
  167303. "adcs r4, %[r]\n\t"
  167304. #else
  167305. "adc r4, %[r]\n\t"
  167306. #endif
  167307. #ifdef WOLFSSL_KEIL
  167308. "adcs r5, r5, %[r]\n\t"
  167309. #elif defined(__clang__)
  167310. "adcs r5, %[r]\n\t"
  167311. #else
  167312. "adc r5, %[r]\n\t"
  167313. #endif
  167314. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167315. "lsrs r7, %[b], #16\n\t"
  167316. #else
  167317. "lsr r7, %[b], #16\n\t"
  167318. #endif
  167319. #ifdef WOLFSSL_KEIL
  167320. "muls r6, r7, r6\n\t"
  167321. #elif defined(__clang__)
  167322. "muls r6, r7\n\t"
  167323. #else
  167324. "mul r6, r7\n\t"
  167325. #endif
  167326. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167327. "lsrs r7, r6, #16\n\t"
  167328. #else
  167329. "lsr r7, r6, #16\n\t"
  167330. #endif
  167331. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167332. "lsls r6, r6, #16\n\t"
  167333. #else
  167334. "lsl r6, r6, #16\n\t"
  167335. #endif
  167336. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167337. "adds r3, r3, r6\n\t"
  167338. #else
  167339. "add r3, r3, r6\n\t"
  167340. #endif
  167341. #ifdef WOLFSSL_KEIL
  167342. "adcs r4, r4, r7\n\t"
  167343. #elif defined(__clang__)
  167344. "adcs r4, r7\n\t"
  167345. #else
  167346. "adc r4, r7\n\t"
  167347. #endif
  167348. #ifdef WOLFSSL_KEIL
  167349. "adcs r5, r5, %[r]\n\t"
  167350. #elif defined(__clang__)
  167351. "adcs r5, %[r]\n\t"
  167352. #else
  167353. "adc r5, %[r]\n\t"
  167354. #endif
  167355. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167356. "lsrs r6, %[a], #16\n\t"
  167357. #else
  167358. "lsr r6, %[a], #16\n\t"
  167359. #endif
  167360. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167361. "lsrs r7, %[b], #16\n\t"
  167362. #else
  167363. "lsr r7, %[b], #16\n\t"
  167364. #endif
  167365. #ifdef WOLFSSL_KEIL
  167366. "muls r7, r6, r7\n\t"
  167367. #elif defined(__clang__)
  167368. "muls r7, r6\n\t"
  167369. #else
  167370. "mul r7, r6\n\t"
  167371. #endif
  167372. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167373. "adds r4, r4, r7\n\t"
  167374. #else
  167375. "add r4, r4, r7\n\t"
  167376. #endif
  167377. #ifdef WOLFSSL_KEIL
  167378. "adcs r5, r5, %[r]\n\t"
  167379. #elif defined(__clang__)
  167380. "adcs r5, %[r]\n\t"
  167381. #else
  167382. "adc r5, %[r]\n\t"
  167383. #endif
  167384. "uxth r7, %[b]\n\t"
  167385. #ifdef WOLFSSL_KEIL
  167386. "muls r6, r7, r6\n\t"
  167387. #elif defined(__clang__)
  167388. "muls r6, r7\n\t"
  167389. #else
  167390. "mul r6, r7\n\t"
  167391. #endif
  167392. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167393. "lsrs r7, r6, #16\n\t"
  167394. #else
  167395. "lsr r7, r6, #16\n\t"
  167396. #endif
  167397. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167398. "lsls r6, r6, #16\n\t"
  167399. #else
  167400. "lsl r6, r6, #16\n\t"
  167401. #endif
  167402. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167403. "adds r3, r3, r6\n\t"
  167404. #else
  167405. "add r3, r3, r6\n\t"
  167406. #endif
  167407. #ifdef WOLFSSL_KEIL
  167408. "adcs r4, r4, r7\n\t"
  167409. #elif defined(__clang__)
  167410. "adcs r4, r7\n\t"
  167411. #else
  167412. "adc r4, r7\n\t"
  167413. #endif
  167414. #ifdef WOLFSSL_KEIL
  167415. "adcs r5, r5, %[r]\n\t"
  167416. #elif defined(__clang__)
  167417. "adcs r5, %[r]\n\t"
  167418. #else
  167419. "adc r5, %[r]\n\t"
  167420. #endif
  167421. "mov %[r], r8\n\t"
  167422. "str r3, [%[r], #96]\n\t"
  167423. "movs %[r], #0\n\t"
  167424. "# A[10] * B[15]\n\t"
  167425. "movs r3, #0\n\t"
  167426. "mov %[a], r9\n\t"
  167427. "mov %[b], r10\n\t"
  167428. "ldr %[a], [%[a], #40]\n\t"
  167429. "ldr %[b], [%[b], #60]\n\t"
  167430. "uxth r6, %[a]\n\t"
  167431. "uxth r7, %[b]\n\t"
  167432. #ifdef WOLFSSL_KEIL
  167433. "muls r7, r6, r7\n\t"
  167434. #elif defined(__clang__)
  167435. "muls r7, r6\n\t"
  167436. #else
  167437. "mul r7, r6\n\t"
  167438. #endif
  167439. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167440. "adds r4, r4, r7\n\t"
  167441. #else
  167442. "add r4, r4, r7\n\t"
  167443. #endif
  167444. #ifdef WOLFSSL_KEIL
  167445. "adcs r5, r5, %[r]\n\t"
  167446. #elif defined(__clang__)
  167447. "adcs r5, %[r]\n\t"
  167448. #else
  167449. "adc r5, %[r]\n\t"
  167450. #endif
  167451. #ifdef WOLFSSL_KEIL
  167452. "adcs r3, r3, %[r]\n\t"
  167453. #elif defined(__clang__)
  167454. "adcs r3, %[r]\n\t"
  167455. #else
  167456. "adc r3, %[r]\n\t"
  167457. #endif
  167458. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167459. "lsrs r7, %[b], #16\n\t"
  167460. #else
  167461. "lsr r7, %[b], #16\n\t"
  167462. #endif
  167463. #ifdef WOLFSSL_KEIL
  167464. "muls r6, r7, r6\n\t"
  167465. #elif defined(__clang__)
  167466. "muls r6, r7\n\t"
  167467. #else
  167468. "mul r6, r7\n\t"
  167469. #endif
  167470. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167471. "lsrs r7, r6, #16\n\t"
  167472. #else
  167473. "lsr r7, r6, #16\n\t"
  167474. #endif
  167475. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167476. "lsls r6, r6, #16\n\t"
  167477. #else
  167478. "lsl r6, r6, #16\n\t"
  167479. #endif
  167480. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167481. "adds r4, r4, r6\n\t"
  167482. #else
  167483. "add r4, r4, r6\n\t"
  167484. #endif
  167485. #ifdef WOLFSSL_KEIL
  167486. "adcs r5, r5, r7\n\t"
  167487. #elif defined(__clang__)
  167488. "adcs r5, r7\n\t"
  167489. #else
  167490. "adc r5, r7\n\t"
  167491. #endif
  167492. #ifdef WOLFSSL_KEIL
  167493. "adcs r3, r3, %[r]\n\t"
  167494. #elif defined(__clang__)
  167495. "adcs r3, %[r]\n\t"
  167496. #else
  167497. "adc r3, %[r]\n\t"
  167498. #endif
  167499. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167500. "lsrs r6, %[a], #16\n\t"
  167501. #else
  167502. "lsr r6, %[a], #16\n\t"
  167503. #endif
  167504. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167505. "lsrs r7, %[b], #16\n\t"
  167506. #else
  167507. "lsr r7, %[b], #16\n\t"
  167508. #endif
  167509. #ifdef WOLFSSL_KEIL
  167510. "muls r7, r6, r7\n\t"
  167511. #elif defined(__clang__)
  167512. "muls r7, r6\n\t"
  167513. #else
  167514. "mul r7, r6\n\t"
  167515. #endif
  167516. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167517. "adds r5, r5, r7\n\t"
  167518. #else
  167519. "add r5, r5, r7\n\t"
  167520. #endif
  167521. #ifdef WOLFSSL_KEIL
  167522. "adcs r3, r3, %[r]\n\t"
  167523. #elif defined(__clang__)
  167524. "adcs r3, %[r]\n\t"
  167525. #else
  167526. "adc r3, %[r]\n\t"
  167527. #endif
  167528. "uxth r7, %[b]\n\t"
  167529. #ifdef WOLFSSL_KEIL
  167530. "muls r6, r7, r6\n\t"
  167531. #elif defined(__clang__)
  167532. "muls r6, r7\n\t"
  167533. #else
  167534. "mul r6, r7\n\t"
  167535. #endif
  167536. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167537. "lsrs r7, r6, #16\n\t"
  167538. #else
  167539. "lsr r7, r6, #16\n\t"
  167540. #endif
  167541. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167542. "lsls r6, r6, #16\n\t"
  167543. #else
  167544. "lsl r6, r6, #16\n\t"
  167545. #endif
  167546. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167547. "adds r4, r4, r6\n\t"
  167548. #else
  167549. "add r4, r4, r6\n\t"
  167550. #endif
  167551. #ifdef WOLFSSL_KEIL
  167552. "adcs r5, r5, r7\n\t"
  167553. #elif defined(__clang__)
  167554. "adcs r5, r7\n\t"
  167555. #else
  167556. "adc r5, r7\n\t"
  167557. #endif
  167558. #ifdef WOLFSSL_KEIL
  167559. "adcs r3, r3, %[r]\n\t"
  167560. #elif defined(__clang__)
  167561. "adcs r3, %[r]\n\t"
  167562. #else
  167563. "adc r3, %[r]\n\t"
  167564. #endif
  167565. "# A[11] * B[14]\n\t"
  167566. "mov %[a], r9\n\t"
  167567. "mov %[b], r10\n\t"
  167568. "ldr %[a], [%[a], #44]\n\t"
  167569. "ldr %[b], [%[b], #56]\n\t"
  167570. "uxth r6, %[a]\n\t"
  167571. "uxth r7, %[b]\n\t"
  167572. #ifdef WOLFSSL_KEIL
  167573. "muls r7, r6, r7\n\t"
  167574. #elif defined(__clang__)
  167575. "muls r7, r6\n\t"
  167576. #else
  167577. "mul r7, r6\n\t"
  167578. #endif
  167579. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167580. "adds r4, r4, r7\n\t"
  167581. #else
  167582. "add r4, r4, r7\n\t"
  167583. #endif
  167584. #ifdef WOLFSSL_KEIL
  167585. "adcs r5, r5, %[r]\n\t"
  167586. #elif defined(__clang__)
  167587. "adcs r5, %[r]\n\t"
  167588. #else
  167589. "adc r5, %[r]\n\t"
  167590. #endif
  167591. #ifdef WOLFSSL_KEIL
  167592. "adcs r3, r3, %[r]\n\t"
  167593. #elif defined(__clang__)
  167594. "adcs r3, %[r]\n\t"
  167595. #else
  167596. "adc r3, %[r]\n\t"
  167597. #endif
  167598. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167599. "lsrs r7, %[b], #16\n\t"
  167600. #else
  167601. "lsr r7, %[b], #16\n\t"
  167602. #endif
  167603. #ifdef WOLFSSL_KEIL
  167604. "muls r6, r7, r6\n\t"
  167605. #elif defined(__clang__)
  167606. "muls r6, r7\n\t"
  167607. #else
  167608. "mul r6, r7\n\t"
  167609. #endif
  167610. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167611. "lsrs r7, r6, #16\n\t"
  167612. #else
  167613. "lsr r7, r6, #16\n\t"
  167614. #endif
  167615. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167616. "lsls r6, r6, #16\n\t"
  167617. #else
  167618. "lsl r6, r6, #16\n\t"
  167619. #endif
  167620. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167621. "adds r4, r4, r6\n\t"
  167622. #else
  167623. "add r4, r4, r6\n\t"
  167624. #endif
  167625. #ifdef WOLFSSL_KEIL
  167626. "adcs r5, r5, r7\n\t"
  167627. #elif defined(__clang__)
  167628. "adcs r5, r7\n\t"
  167629. #else
  167630. "adc r5, r7\n\t"
  167631. #endif
  167632. #ifdef WOLFSSL_KEIL
  167633. "adcs r3, r3, %[r]\n\t"
  167634. #elif defined(__clang__)
  167635. "adcs r3, %[r]\n\t"
  167636. #else
  167637. "adc r3, %[r]\n\t"
  167638. #endif
  167639. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167640. "lsrs r6, %[a], #16\n\t"
  167641. #else
  167642. "lsr r6, %[a], #16\n\t"
  167643. #endif
  167644. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167645. "lsrs r7, %[b], #16\n\t"
  167646. #else
  167647. "lsr r7, %[b], #16\n\t"
  167648. #endif
  167649. #ifdef WOLFSSL_KEIL
  167650. "muls r7, r6, r7\n\t"
  167651. #elif defined(__clang__)
  167652. "muls r7, r6\n\t"
  167653. #else
  167654. "mul r7, r6\n\t"
  167655. #endif
  167656. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167657. "adds r5, r5, r7\n\t"
  167658. #else
  167659. "add r5, r5, r7\n\t"
  167660. #endif
  167661. #ifdef WOLFSSL_KEIL
  167662. "adcs r3, r3, %[r]\n\t"
  167663. #elif defined(__clang__)
  167664. "adcs r3, %[r]\n\t"
  167665. #else
  167666. "adc r3, %[r]\n\t"
  167667. #endif
  167668. "uxth r7, %[b]\n\t"
  167669. #ifdef WOLFSSL_KEIL
  167670. "muls r6, r7, r6\n\t"
  167671. #elif defined(__clang__)
  167672. "muls r6, r7\n\t"
  167673. #else
  167674. "mul r6, r7\n\t"
  167675. #endif
  167676. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167677. "lsrs r7, r6, #16\n\t"
  167678. #else
  167679. "lsr r7, r6, #16\n\t"
  167680. #endif
  167681. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167682. "lsls r6, r6, #16\n\t"
  167683. #else
  167684. "lsl r6, r6, #16\n\t"
  167685. #endif
  167686. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167687. "adds r4, r4, r6\n\t"
  167688. #else
  167689. "add r4, r4, r6\n\t"
  167690. #endif
  167691. #ifdef WOLFSSL_KEIL
  167692. "adcs r5, r5, r7\n\t"
  167693. #elif defined(__clang__)
  167694. "adcs r5, r7\n\t"
  167695. #else
  167696. "adc r5, r7\n\t"
  167697. #endif
  167698. #ifdef WOLFSSL_KEIL
  167699. "adcs r3, r3, %[r]\n\t"
  167700. #elif defined(__clang__)
  167701. "adcs r3, %[r]\n\t"
  167702. #else
  167703. "adc r3, %[r]\n\t"
  167704. #endif
  167705. "# A[12] * B[13]\n\t"
  167706. "mov %[a], r9\n\t"
  167707. "mov %[b], r10\n\t"
  167708. "ldr %[a], [%[a], #48]\n\t"
  167709. "ldr %[b], [%[b], #52]\n\t"
  167710. "uxth r6, %[a]\n\t"
  167711. "uxth r7, %[b]\n\t"
  167712. #ifdef WOLFSSL_KEIL
  167713. "muls r7, r6, r7\n\t"
  167714. #elif defined(__clang__)
  167715. "muls r7, r6\n\t"
  167716. #else
  167717. "mul r7, r6\n\t"
  167718. #endif
  167719. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167720. "adds r4, r4, r7\n\t"
  167721. #else
  167722. "add r4, r4, r7\n\t"
  167723. #endif
  167724. #ifdef WOLFSSL_KEIL
  167725. "adcs r5, r5, %[r]\n\t"
  167726. #elif defined(__clang__)
  167727. "adcs r5, %[r]\n\t"
  167728. #else
  167729. "adc r5, %[r]\n\t"
  167730. #endif
  167731. #ifdef WOLFSSL_KEIL
  167732. "adcs r3, r3, %[r]\n\t"
  167733. #elif defined(__clang__)
  167734. "adcs r3, %[r]\n\t"
  167735. #else
  167736. "adc r3, %[r]\n\t"
  167737. #endif
  167738. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167739. "lsrs r7, %[b], #16\n\t"
  167740. #else
  167741. "lsr r7, %[b], #16\n\t"
  167742. #endif
  167743. #ifdef WOLFSSL_KEIL
  167744. "muls r6, r7, r6\n\t"
  167745. #elif defined(__clang__)
  167746. "muls r6, r7\n\t"
  167747. #else
  167748. "mul r6, r7\n\t"
  167749. #endif
  167750. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167751. "lsrs r7, r6, #16\n\t"
  167752. #else
  167753. "lsr r7, r6, #16\n\t"
  167754. #endif
  167755. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167756. "lsls r6, r6, #16\n\t"
  167757. #else
  167758. "lsl r6, r6, #16\n\t"
  167759. #endif
  167760. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167761. "adds r4, r4, r6\n\t"
  167762. #else
  167763. "add r4, r4, r6\n\t"
  167764. #endif
  167765. #ifdef WOLFSSL_KEIL
  167766. "adcs r5, r5, r7\n\t"
  167767. #elif defined(__clang__)
  167768. "adcs r5, r7\n\t"
  167769. #else
  167770. "adc r5, r7\n\t"
  167771. #endif
  167772. #ifdef WOLFSSL_KEIL
  167773. "adcs r3, r3, %[r]\n\t"
  167774. #elif defined(__clang__)
  167775. "adcs r3, %[r]\n\t"
  167776. #else
  167777. "adc r3, %[r]\n\t"
  167778. #endif
  167779. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167780. "lsrs r6, %[a], #16\n\t"
  167781. #else
  167782. "lsr r6, %[a], #16\n\t"
  167783. #endif
  167784. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167785. "lsrs r7, %[b], #16\n\t"
  167786. #else
  167787. "lsr r7, %[b], #16\n\t"
  167788. #endif
  167789. #ifdef WOLFSSL_KEIL
  167790. "muls r7, r6, r7\n\t"
  167791. #elif defined(__clang__)
  167792. "muls r7, r6\n\t"
  167793. #else
  167794. "mul r7, r6\n\t"
  167795. #endif
  167796. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167797. "adds r5, r5, r7\n\t"
  167798. #else
  167799. "add r5, r5, r7\n\t"
  167800. #endif
  167801. #ifdef WOLFSSL_KEIL
  167802. "adcs r3, r3, %[r]\n\t"
  167803. #elif defined(__clang__)
  167804. "adcs r3, %[r]\n\t"
  167805. #else
  167806. "adc r3, %[r]\n\t"
  167807. #endif
  167808. "uxth r7, %[b]\n\t"
  167809. #ifdef WOLFSSL_KEIL
  167810. "muls r6, r7, r6\n\t"
  167811. #elif defined(__clang__)
  167812. "muls r6, r7\n\t"
  167813. #else
  167814. "mul r6, r7\n\t"
  167815. #endif
  167816. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167817. "lsrs r7, r6, #16\n\t"
  167818. #else
  167819. "lsr r7, r6, #16\n\t"
  167820. #endif
  167821. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167822. "lsls r6, r6, #16\n\t"
  167823. #else
  167824. "lsl r6, r6, #16\n\t"
  167825. #endif
  167826. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167827. "adds r4, r4, r6\n\t"
  167828. #else
  167829. "add r4, r4, r6\n\t"
  167830. #endif
  167831. #ifdef WOLFSSL_KEIL
  167832. "adcs r5, r5, r7\n\t"
  167833. #elif defined(__clang__)
  167834. "adcs r5, r7\n\t"
  167835. #else
  167836. "adc r5, r7\n\t"
  167837. #endif
  167838. #ifdef WOLFSSL_KEIL
  167839. "adcs r3, r3, %[r]\n\t"
  167840. #elif defined(__clang__)
  167841. "adcs r3, %[r]\n\t"
  167842. #else
  167843. "adc r3, %[r]\n\t"
  167844. #endif
  167845. "# A[13] * B[12]\n\t"
  167846. "mov %[a], r9\n\t"
  167847. "mov %[b], r10\n\t"
  167848. "ldr %[a], [%[a], #52]\n\t"
  167849. "ldr %[b], [%[b], #48]\n\t"
  167850. "uxth r6, %[a]\n\t"
  167851. "uxth r7, %[b]\n\t"
  167852. #ifdef WOLFSSL_KEIL
  167853. "muls r7, r6, r7\n\t"
  167854. #elif defined(__clang__)
  167855. "muls r7, r6\n\t"
  167856. #else
  167857. "mul r7, r6\n\t"
  167858. #endif
  167859. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167860. "adds r4, r4, r7\n\t"
  167861. #else
  167862. "add r4, r4, r7\n\t"
  167863. #endif
  167864. #ifdef WOLFSSL_KEIL
  167865. "adcs r5, r5, %[r]\n\t"
  167866. #elif defined(__clang__)
  167867. "adcs r5, %[r]\n\t"
  167868. #else
  167869. "adc r5, %[r]\n\t"
  167870. #endif
  167871. #ifdef WOLFSSL_KEIL
  167872. "adcs r3, r3, %[r]\n\t"
  167873. #elif defined(__clang__)
  167874. "adcs r3, %[r]\n\t"
  167875. #else
  167876. "adc r3, %[r]\n\t"
  167877. #endif
  167878. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167879. "lsrs r7, %[b], #16\n\t"
  167880. #else
  167881. "lsr r7, %[b], #16\n\t"
  167882. #endif
  167883. #ifdef WOLFSSL_KEIL
  167884. "muls r6, r7, r6\n\t"
  167885. #elif defined(__clang__)
  167886. "muls r6, r7\n\t"
  167887. #else
  167888. "mul r6, r7\n\t"
  167889. #endif
  167890. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167891. "lsrs r7, r6, #16\n\t"
  167892. #else
  167893. "lsr r7, r6, #16\n\t"
  167894. #endif
  167895. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167896. "lsls r6, r6, #16\n\t"
  167897. #else
  167898. "lsl r6, r6, #16\n\t"
  167899. #endif
  167900. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167901. "adds r4, r4, r6\n\t"
  167902. #else
  167903. "add r4, r4, r6\n\t"
  167904. #endif
  167905. #ifdef WOLFSSL_KEIL
  167906. "adcs r5, r5, r7\n\t"
  167907. #elif defined(__clang__)
  167908. "adcs r5, r7\n\t"
  167909. #else
  167910. "adc r5, r7\n\t"
  167911. #endif
  167912. #ifdef WOLFSSL_KEIL
  167913. "adcs r3, r3, %[r]\n\t"
  167914. #elif defined(__clang__)
  167915. "adcs r3, %[r]\n\t"
  167916. #else
  167917. "adc r3, %[r]\n\t"
  167918. #endif
  167919. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167920. "lsrs r6, %[a], #16\n\t"
  167921. #else
  167922. "lsr r6, %[a], #16\n\t"
  167923. #endif
  167924. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167925. "lsrs r7, %[b], #16\n\t"
  167926. #else
  167927. "lsr r7, %[b], #16\n\t"
  167928. #endif
  167929. #ifdef WOLFSSL_KEIL
  167930. "muls r7, r6, r7\n\t"
  167931. #elif defined(__clang__)
  167932. "muls r7, r6\n\t"
  167933. #else
  167934. "mul r7, r6\n\t"
  167935. #endif
  167936. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167937. "adds r5, r5, r7\n\t"
  167938. #else
  167939. "add r5, r5, r7\n\t"
  167940. #endif
  167941. #ifdef WOLFSSL_KEIL
  167942. "adcs r3, r3, %[r]\n\t"
  167943. #elif defined(__clang__)
  167944. "adcs r3, %[r]\n\t"
  167945. #else
  167946. "adc r3, %[r]\n\t"
  167947. #endif
  167948. "uxth r7, %[b]\n\t"
  167949. #ifdef WOLFSSL_KEIL
  167950. "muls r6, r7, r6\n\t"
  167951. #elif defined(__clang__)
  167952. "muls r6, r7\n\t"
  167953. #else
  167954. "mul r6, r7\n\t"
  167955. #endif
  167956. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167957. "lsrs r7, r6, #16\n\t"
  167958. #else
  167959. "lsr r7, r6, #16\n\t"
  167960. #endif
  167961. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167962. "lsls r6, r6, #16\n\t"
  167963. #else
  167964. "lsl r6, r6, #16\n\t"
  167965. #endif
  167966. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167967. "adds r4, r4, r6\n\t"
  167968. #else
  167969. "add r4, r4, r6\n\t"
  167970. #endif
  167971. #ifdef WOLFSSL_KEIL
  167972. "adcs r5, r5, r7\n\t"
  167973. #elif defined(__clang__)
  167974. "adcs r5, r7\n\t"
  167975. #else
  167976. "adc r5, r7\n\t"
  167977. #endif
  167978. #ifdef WOLFSSL_KEIL
  167979. "adcs r3, r3, %[r]\n\t"
  167980. #elif defined(__clang__)
  167981. "adcs r3, %[r]\n\t"
  167982. #else
  167983. "adc r3, %[r]\n\t"
  167984. #endif
  167985. "# A[14] * B[11]\n\t"
  167986. "mov %[a], r9\n\t"
  167987. "mov %[b], r10\n\t"
  167988. "ldr %[a], [%[a], #56]\n\t"
  167989. "ldr %[b], [%[b], #44]\n\t"
  167990. "uxth r6, %[a]\n\t"
  167991. "uxth r7, %[b]\n\t"
  167992. #ifdef WOLFSSL_KEIL
  167993. "muls r7, r6, r7\n\t"
  167994. #elif defined(__clang__)
  167995. "muls r7, r6\n\t"
  167996. #else
  167997. "mul r7, r6\n\t"
  167998. #endif
  167999. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168000. "adds r4, r4, r7\n\t"
  168001. #else
  168002. "add r4, r4, r7\n\t"
  168003. #endif
  168004. #ifdef WOLFSSL_KEIL
  168005. "adcs r5, r5, %[r]\n\t"
  168006. #elif defined(__clang__)
  168007. "adcs r5, %[r]\n\t"
  168008. #else
  168009. "adc r5, %[r]\n\t"
  168010. #endif
  168011. #ifdef WOLFSSL_KEIL
  168012. "adcs r3, r3, %[r]\n\t"
  168013. #elif defined(__clang__)
  168014. "adcs r3, %[r]\n\t"
  168015. #else
  168016. "adc r3, %[r]\n\t"
  168017. #endif
  168018. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168019. "lsrs r7, %[b], #16\n\t"
  168020. #else
  168021. "lsr r7, %[b], #16\n\t"
  168022. #endif
  168023. #ifdef WOLFSSL_KEIL
  168024. "muls r6, r7, r6\n\t"
  168025. #elif defined(__clang__)
  168026. "muls r6, r7\n\t"
  168027. #else
  168028. "mul r6, r7\n\t"
  168029. #endif
  168030. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168031. "lsrs r7, r6, #16\n\t"
  168032. #else
  168033. "lsr r7, r6, #16\n\t"
  168034. #endif
  168035. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168036. "lsls r6, r6, #16\n\t"
  168037. #else
  168038. "lsl r6, r6, #16\n\t"
  168039. #endif
  168040. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168041. "adds r4, r4, r6\n\t"
  168042. #else
  168043. "add r4, r4, r6\n\t"
  168044. #endif
  168045. #ifdef WOLFSSL_KEIL
  168046. "adcs r5, r5, r7\n\t"
  168047. #elif defined(__clang__)
  168048. "adcs r5, r7\n\t"
  168049. #else
  168050. "adc r5, r7\n\t"
  168051. #endif
  168052. #ifdef WOLFSSL_KEIL
  168053. "adcs r3, r3, %[r]\n\t"
  168054. #elif defined(__clang__)
  168055. "adcs r3, %[r]\n\t"
  168056. #else
  168057. "adc r3, %[r]\n\t"
  168058. #endif
  168059. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168060. "lsrs r6, %[a], #16\n\t"
  168061. #else
  168062. "lsr r6, %[a], #16\n\t"
  168063. #endif
  168064. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168065. "lsrs r7, %[b], #16\n\t"
  168066. #else
  168067. "lsr r7, %[b], #16\n\t"
  168068. #endif
  168069. #ifdef WOLFSSL_KEIL
  168070. "muls r7, r6, r7\n\t"
  168071. #elif defined(__clang__)
  168072. "muls r7, r6\n\t"
  168073. #else
  168074. "mul r7, r6\n\t"
  168075. #endif
  168076. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168077. "adds r5, r5, r7\n\t"
  168078. #else
  168079. "add r5, r5, r7\n\t"
  168080. #endif
  168081. #ifdef WOLFSSL_KEIL
  168082. "adcs r3, r3, %[r]\n\t"
  168083. #elif defined(__clang__)
  168084. "adcs r3, %[r]\n\t"
  168085. #else
  168086. "adc r3, %[r]\n\t"
  168087. #endif
  168088. "uxth r7, %[b]\n\t"
  168089. #ifdef WOLFSSL_KEIL
  168090. "muls r6, r7, r6\n\t"
  168091. #elif defined(__clang__)
  168092. "muls r6, r7\n\t"
  168093. #else
  168094. "mul r6, r7\n\t"
  168095. #endif
  168096. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168097. "lsrs r7, r6, #16\n\t"
  168098. #else
  168099. "lsr r7, r6, #16\n\t"
  168100. #endif
  168101. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168102. "lsls r6, r6, #16\n\t"
  168103. #else
  168104. "lsl r6, r6, #16\n\t"
  168105. #endif
  168106. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168107. "adds r4, r4, r6\n\t"
  168108. #else
  168109. "add r4, r4, r6\n\t"
  168110. #endif
  168111. #ifdef WOLFSSL_KEIL
  168112. "adcs r5, r5, r7\n\t"
  168113. #elif defined(__clang__)
  168114. "adcs r5, r7\n\t"
  168115. #else
  168116. "adc r5, r7\n\t"
  168117. #endif
  168118. #ifdef WOLFSSL_KEIL
  168119. "adcs r3, r3, %[r]\n\t"
  168120. #elif defined(__clang__)
  168121. "adcs r3, %[r]\n\t"
  168122. #else
  168123. "adc r3, %[r]\n\t"
  168124. #endif
  168125. "# A[15] * B[10]\n\t"
  168126. "mov %[a], r9\n\t"
  168127. "mov %[b], r10\n\t"
  168128. "ldr %[a], [%[a], #60]\n\t"
  168129. "ldr %[b], [%[b], #40]\n\t"
  168130. "uxth r6, %[a]\n\t"
  168131. "uxth r7, %[b]\n\t"
  168132. #ifdef WOLFSSL_KEIL
  168133. "muls r7, r6, r7\n\t"
  168134. #elif defined(__clang__)
  168135. "muls r7, r6\n\t"
  168136. #else
  168137. "mul r7, r6\n\t"
  168138. #endif
  168139. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168140. "adds r4, r4, r7\n\t"
  168141. #else
  168142. "add r4, r4, r7\n\t"
  168143. #endif
  168144. #ifdef WOLFSSL_KEIL
  168145. "adcs r5, r5, %[r]\n\t"
  168146. #elif defined(__clang__)
  168147. "adcs r5, %[r]\n\t"
  168148. #else
  168149. "adc r5, %[r]\n\t"
  168150. #endif
  168151. #ifdef WOLFSSL_KEIL
  168152. "adcs r3, r3, %[r]\n\t"
  168153. #elif defined(__clang__)
  168154. "adcs r3, %[r]\n\t"
  168155. #else
  168156. "adc r3, %[r]\n\t"
  168157. #endif
  168158. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168159. "lsrs r7, %[b], #16\n\t"
  168160. #else
  168161. "lsr r7, %[b], #16\n\t"
  168162. #endif
  168163. #ifdef WOLFSSL_KEIL
  168164. "muls r6, r7, r6\n\t"
  168165. #elif defined(__clang__)
  168166. "muls r6, r7\n\t"
  168167. #else
  168168. "mul r6, r7\n\t"
  168169. #endif
  168170. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168171. "lsrs r7, r6, #16\n\t"
  168172. #else
  168173. "lsr r7, r6, #16\n\t"
  168174. #endif
  168175. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168176. "lsls r6, r6, #16\n\t"
  168177. #else
  168178. "lsl r6, r6, #16\n\t"
  168179. #endif
  168180. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168181. "adds r4, r4, r6\n\t"
  168182. #else
  168183. "add r4, r4, r6\n\t"
  168184. #endif
  168185. #ifdef WOLFSSL_KEIL
  168186. "adcs r5, r5, r7\n\t"
  168187. #elif defined(__clang__)
  168188. "adcs r5, r7\n\t"
  168189. #else
  168190. "adc r5, r7\n\t"
  168191. #endif
  168192. #ifdef WOLFSSL_KEIL
  168193. "adcs r3, r3, %[r]\n\t"
  168194. #elif defined(__clang__)
  168195. "adcs r3, %[r]\n\t"
  168196. #else
  168197. "adc r3, %[r]\n\t"
  168198. #endif
  168199. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168200. "lsrs r6, %[a], #16\n\t"
  168201. #else
  168202. "lsr r6, %[a], #16\n\t"
  168203. #endif
  168204. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168205. "lsrs r7, %[b], #16\n\t"
  168206. #else
  168207. "lsr r7, %[b], #16\n\t"
  168208. #endif
  168209. #ifdef WOLFSSL_KEIL
  168210. "muls r7, r6, r7\n\t"
  168211. #elif defined(__clang__)
  168212. "muls r7, r6\n\t"
  168213. #else
  168214. "mul r7, r6\n\t"
  168215. #endif
  168216. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168217. "adds r5, r5, r7\n\t"
  168218. #else
  168219. "add r5, r5, r7\n\t"
  168220. #endif
  168221. #ifdef WOLFSSL_KEIL
  168222. "adcs r3, r3, %[r]\n\t"
  168223. #elif defined(__clang__)
  168224. "adcs r3, %[r]\n\t"
  168225. #else
  168226. "adc r3, %[r]\n\t"
  168227. #endif
  168228. "uxth r7, %[b]\n\t"
  168229. #ifdef WOLFSSL_KEIL
  168230. "muls r6, r7, r6\n\t"
  168231. #elif defined(__clang__)
  168232. "muls r6, r7\n\t"
  168233. #else
  168234. "mul r6, r7\n\t"
  168235. #endif
  168236. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168237. "lsrs r7, r6, #16\n\t"
  168238. #else
  168239. "lsr r7, r6, #16\n\t"
  168240. #endif
  168241. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168242. "lsls r6, r6, #16\n\t"
  168243. #else
  168244. "lsl r6, r6, #16\n\t"
  168245. #endif
  168246. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168247. "adds r4, r4, r6\n\t"
  168248. #else
  168249. "add r4, r4, r6\n\t"
  168250. #endif
  168251. #ifdef WOLFSSL_KEIL
  168252. "adcs r5, r5, r7\n\t"
  168253. #elif defined(__clang__)
  168254. "adcs r5, r7\n\t"
  168255. #else
  168256. "adc r5, r7\n\t"
  168257. #endif
  168258. #ifdef WOLFSSL_KEIL
  168259. "adcs r3, r3, %[r]\n\t"
  168260. #elif defined(__clang__)
  168261. "adcs r3, %[r]\n\t"
  168262. #else
  168263. "adc r3, %[r]\n\t"
  168264. #endif
  168265. "mov %[r], r8\n\t"
  168266. "str r4, [%[r], #100]\n\t"
  168267. "movs %[r], #0\n\t"
  168268. "# A[15] * B[11]\n\t"
  168269. "movs r4, #0\n\t"
  168270. "mov %[a], r9\n\t"
  168271. "mov %[b], r10\n\t"
  168272. "ldr %[a], [%[a], #60]\n\t"
  168273. "ldr %[b], [%[b], #44]\n\t"
  168274. "uxth r6, %[a]\n\t"
  168275. "uxth r7, %[b]\n\t"
  168276. #ifdef WOLFSSL_KEIL
  168277. "muls r7, r6, r7\n\t"
  168278. #elif defined(__clang__)
  168279. "muls r7, r6\n\t"
  168280. #else
  168281. "mul r7, r6\n\t"
  168282. #endif
  168283. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168284. "adds r5, r5, r7\n\t"
  168285. #else
  168286. "add r5, r5, r7\n\t"
  168287. #endif
  168288. #ifdef WOLFSSL_KEIL
  168289. "adcs r3, r3, %[r]\n\t"
  168290. #elif defined(__clang__)
  168291. "adcs r3, %[r]\n\t"
  168292. #else
  168293. "adc r3, %[r]\n\t"
  168294. #endif
  168295. #ifdef WOLFSSL_KEIL
  168296. "adcs r4, r4, %[r]\n\t"
  168297. #elif defined(__clang__)
  168298. "adcs r4, %[r]\n\t"
  168299. #else
  168300. "adc r4, %[r]\n\t"
  168301. #endif
  168302. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168303. "lsrs r7, %[b], #16\n\t"
  168304. #else
  168305. "lsr r7, %[b], #16\n\t"
  168306. #endif
  168307. #ifdef WOLFSSL_KEIL
  168308. "muls r6, r7, r6\n\t"
  168309. #elif defined(__clang__)
  168310. "muls r6, r7\n\t"
  168311. #else
  168312. "mul r6, r7\n\t"
  168313. #endif
  168314. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168315. "lsrs r7, r6, #16\n\t"
  168316. #else
  168317. "lsr r7, r6, #16\n\t"
  168318. #endif
  168319. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168320. "lsls r6, r6, #16\n\t"
  168321. #else
  168322. "lsl r6, r6, #16\n\t"
  168323. #endif
  168324. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168325. "adds r5, r5, r6\n\t"
  168326. #else
  168327. "add r5, r5, r6\n\t"
  168328. #endif
  168329. #ifdef WOLFSSL_KEIL
  168330. "adcs r3, r3, r7\n\t"
  168331. #elif defined(__clang__)
  168332. "adcs r3, r7\n\t"
  168333. #else
  168334. "adc r3, r7\n\t"
  168335. #endif
  168336. #ifdef WOLFSSL_KEIL
  168337. "adcs r4, r4, %[r]\n\t"
  168338. #elif defined(__clang__)
  168339. "adcs r4, %[r]\n\t"
  168340. #else
  168341. "adc r4, %[r]\n\t"
  168342. #endif
  168343. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168344. "lsrs r6, %[a], #16\n\t"
  168345. #else
  168346. "lsr r6, %[a], #16\n\t"
  168347. #endif
  168348. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168349. "lsrs r7, %[b], #16\n\t"
  168350. #else
  168351. "lsr r7, %[b], #16\n\t"
  168352. #endif
  168353. #ifdef WOLFSSL_KEIL
  168354. "muls r7, r6, r7\n\t"
  168355. #elif defined(__clang__)
  168356. "muls r7, r6\n\t"
  168357. #else
  168358. "mul r7, r6\n\t"
  168359. #endif
  168360. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168361. "adds r3, r3, r7\n\t"
  168362. #else
  168363. "add r3, r3, r7\n\t"
  168364. #endif
  168365. #ifdef WOLFSSL_KEIL
  168366. "adcs r4, r4, %[r]\n\t"
  168367. #elif defined(__clang__)
  168368. "adcs r4, %[r]\n\t"
  168369. #else
  168370. "adc r4, %[r]\n\t"
  168371. #endif
  168372. "uxth r7, %[b]\n\t"
  168373. #ifdef WOLFSSL_KEIL
  168374. "muls r6, r7, r6\n\t"
  168375. #elif defined(__clang__)
  168376. "muls r6, r7\n\t"
  168377. #else
  168378. "mul r6, r7\n\t"
  168379. #endif
  168380. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168381. "lsrs r7, r6, #16\n\t"
  168382. #else
  168383. "lsr r7, r6, #16\n\t"
  168384. #endif
  168385. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168386. "lsls r6, r6, #16\n\t"
  168387. #else
  168388. "lsl r6, r6, #16\n\t"
  168389. #endif
  168390. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168391. "adds r5, r5, r6\n\t"
  168392. #else
  168393. "add r5, r5, r6\n\t"
  168394. #endif
  168395. #ifdef WOLFSSL_KEIL
  168396. "adcs r3, r3, r7\n\t"
  168397. #elif defined(__clang__)
  168398. "adcs r3, r7\n\t"
  168399. #else
  168400. "adc r3, r7\n\t"
  168401. #endif
  168402. #ifdef WOLFSSL_KEIL
  168403. "adcs r4, r4, %[r]\n\t"
  168404. #elif defined(__clang__)
  168405. "adcs r4, %[r]\n\t"
  168406. #else
  168407. "adc r4, %[r]\n\t"
  168408. #endif
  168409. "# A[14] * B[12]\n\t"
  168410. "mov %[a], r9\n\t"
  168411. "mov %[b], r10\n\t"
  168412. "ldr %[a], [%[a], #56]\n\t"
  168413. "ldr %[b], [%[b], #48]\n\t"
  168414. "uxth r6, %[a]\n\t"
  168415. "uxth r7, %[b]\n\t"
  168416. #ifdef WOLFSSL_KEIL
  168417. "muls r7, r6, r7\n\t"
  168418. #elif defined(__clang__)
  168419. "muls r7, r6\n\t"
  168420. #else
  168421. "mul r7, r6\n\t"
  168422. #endif
  168423. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168424. "adds r5, r5, r7\n\t"
  168425. #else
  168426. "add r5, r5, r7\n\t"
  168427. #endif
  168428. #ifdef WOLFSSL_KEIL
  168429. "adcs r3, r3, %[r]\n\t"
  168430. #elif defined(__clang__)
  168431. "adcs r3, %[r]\n\t"
  168432. #else
  168433. "adc r3, %[r]\n\t"
  168434. #endif
  168435. #ifdef WOLFSSL_KEIL
  168436. "adcs r4, r4, %[r]\n\t"
  168437. #elif defined(__clang__)
  168438. "adcs r4, %[r]\n\t"
  168439. #else
  168440. "adc r4, %[r]\n\t"
  168441. #endif
  168442. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168443. "lsrs r7, %[b], #16\n\t"
  168444. #else
  168445. "lsr r7, %[b], #16\n\t"
  168446. #endif
  168447. #ifdef WOLFSSL_KEIL
  168448. "muls r6, r7, r6\n\t"
  168449. #elif defined(__clang__)
  168450. "muls r6, r7\n\t"
  168451. #else
  168452. "mul r6, r7\n\t"
  168453. #endif
  168454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168455. "lsrs r7, r6, #16\n\t"
  168456. #else
  168457. "lsr r7, r6, #16\n\t"
  168458. #endif
  168459. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168460. "lsls r6, r6, #16\n\t"
  168461. #else
  168462. "lsl r6, r6, #16\n\t"
  168463. #endif
  168464. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168465. "adds r5, r5, r6\n\t"
  168466. #else
  168467. "add r5, r5, r6\n\t"
  168468. #endif
  168469. #ifdef WOLFSSL_KEIL
  168470. "adcs r3, r3, r7\n\t"
  168471. #elif defined(__clang__)
  168472. "adcs r3, r7\n\t"
  168473. #else
  168474. "adc r3, r7\n\t"
  168475. #endif
  168476. #ifdef WOLFSSL_KEIL
  168477. "adcs r4, r4, %[r]\n\t"
  168478. #elif defined(__clang__)
  168479. "adcs r4, %[r]\n\t"
  168480. #else
  168481. "adc r4, %[r]\n\t"
  168482. #endif
  168483. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168484. "lsrs r6, %[a], #16\n\t"
  168485. #else
  168486. "lsr r6, %[a], #16\n\t"
  168487. #endif
  168488. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168489. "lsrs r7, %[b], #16\n\t"
  168490. #else
  168491. "lsr r7, %[b], #16\n\t"
  168492. #endif
  168493. #ifdef WOLFSSL_KEIL
  168494. "muls r7, r6, r7\n\t"
  168495. #elif defined(__clang__)
  168496. "muls r7, r6\n\t"
  168497. #else
  168498. "mul r7, r6\n\t"
  168499. #endif
  168500. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168501. "adds r3, r3, r7\n\t"
  168502. #else
  168503. "add r3, r3, r7\n\t"
  168504. #endif
  168505. #ifdef WOLFSSL_KEIL
  168506. "adcs r4, r4, %[r]\n\t"
  168507. #elif defined(__clang__)
  168508. "adcs r4, %[r]\n\t"
  168509. #else
  168510. "adc r4, %[r]\n\t"
  168511. #endif
  168512. "uxth r7, %[b]\n\t"
  168513. #ifdef WOLFSSL_KEIL
  168514. "muls r6, r7, r6\n\t"
  168515. #elif defined(__clang__)
  168516. "muls r6, r7\n\t"
  168517. #else
  168518. "mul r6, r7\n\t"
  168519. #endif
  168520. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168521. "lsrs r7, r6, #16\n\t"
  168522. #else
  168523. "lsr r7, r6, #16\n\t"
  168524. #endif
  168525. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168526. "lsls r6, r6, #16\n\t"
  168527. #else
  168528. "lsl r6, r6, #16\n\t"
  168529. #endif
  168530. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168531. "adds r5, r5, r6\n\t"
  168532. #else
  168533. "add r5, r5, r6\n\t"
  168534. #endif
  168535. #ifdef WOLFSSL_KEIL
  168536. "adcs r3, r3, r7\n\t"
  168537. #elif defined(__clang__)
  168538. "adcs r3, r7\n\t"
  168539. #else
  168540. "adc r3, r7\n\t"
  168541. #endif
  168542. #ifdef WOLFSSL_KEIL
  168543. "adcs r4, r4, %[r]\n\t"
  168544. #elif defined(__clang__)
  168545. "adcs r4, %[r]\n\t"
  168546. #else
  168547. "adc r4, %[r]\n\t"
  168548. #endif
  168549. "# A[13] * B[13]\n\t"
  168550. "mov %[a], r9\n\t"
  168551. "mov %[b], r10\n\t"
  168552. "ldr %[a], [%[a], #52]\n\t"
  168553. "ldr %[b], [%[b], #52]\n\t"
  168554. "uxth r6, %[a]\n\t"
  168555. "uxth r7, %[b]\n\t"
  168556. #ifdef WOLFSSL_KEIL
  168557. "muls r7, r6, r7\n\t"
  168558. #elif defined(__clang__)
  168559. "muls r7, r6\n\t"
  168560. #else
  168561. "mul r7, r6\n\t"
  168562. #endif
  168563. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168564. "adds r5, r5, r7\n\t"
  168565. #else
  168566. "add r5, r5, r7\n\t"
  168567. #endif
  168568. #ifdef WOLFSSL_KEIL
  168569. "adcs r3, r3, %[r]\n\t"
  168570. #elif defined(__clang__)
  168571. "adcs r3, %[r]\n\t"
  168572. #else
  168573. "adc r3, %[r]\n\t"
  168574. #endif
  168575. #ifdef WOLFSSL_KEIL
  168576. "adcs r4, r4, %[r]\n\t"
  168577. #elif defined(__clang__)
  168578. "adcs r4, %[r]\n\t"
  168579. #else
  168580. "adc r4, %[r]\n\t"
  168581. #endif
  168582. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168583. "lsrs r7, %[b], #16\n\t"
  168584. #else
  168585. "lsr r7, %[b], #16\n\t"
  168586. #endif
  168587. #ifdef WOLFSSL_KEIL
  168588. "muls r6, r7, r6\n\t"
  168589. #elif defined(__clang__)
  168590. "muls r6, r7\n\t"
  168591. #else
  168592. "mul r6, r7\n\t"
  168593. #endif
  168594. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168595. "lsrs r7, r6, #16\n\t"
  168596. #else
  168597. "lsr r7, r6, #16\n\t"
  168598. #endif
  168599. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168600. "lsls r6, r6, #16\n\t"
  168601. #else
  168602. "lsl r6, r6, #16\n\t"
  168603. #endif
  168604. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168605. "adds r5, r5, r6\n\t"
  168606. #else
  168607. "add r5, r5, r6\n\t"
  168608. #endif
  168609. #ifdef WOLFSSL_KEIL
  168610. "adcs r3, r3, r7\n\t"
  168611. #elif defined(__clang__)
  168612. "adcs r3, r7\n\t"
  168613. #else
  168614. "adc r3, r7\n\t"
  168615. #endif
  168616. #ifdef WOLFSSL_KEIL
  168617. "adcs r4, r4, %[r]\n\t"
  168618. #elif defined(__clang__)
  168619. "adcs r4, %[r]\n\t"
  168620. #else
  168621. "adc r4, %[r]\n\t"
  168622. #endif
  168623. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168624. "lsrs r6, %[a], #16\n\t"
  168625. #else
  168626. "lsr r6, %[a], #16\n\t"
  168627. #endif
  168628. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168629. "lsrs r7, %[b], #16\n\t"
  168630. #else
  168631. "lsr r7, %[b], #16\n\t"
  168632. #endif
  168633. #ifdef WOLFSSL_KEIL
  168634. "muls r7, r6, r7\n\t"
  168635. #elif defined(__clang__)
  168636. "muls r7, r6\n\t"
  168637. #else
  168638. "mul r7, r6\n\t"
  168639. #endif
  168640. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168641. "adds r3, r3, r7\n\t"
  168642. #else
  168643. "add r3, r3, r7\n\t"
  168644. #endif
  168645. #ifdef WOLFSSL_KEIL
  168646. "adcs r4, r4, %[r]\n\t"
  168647. #elif defined(__clang__)
  168648. "adcs r4, %[r]\n\t"
  168649. #else
  168650. "adc r4, %[r]\n\t"
  168651. #endif
  168652. "uxth r7, %[b]\n\t"
  168653. #ifdef WOLFSSL_KEIL
  168654. "muls r6, r7, r6\n\t"
  168655. #elif defined(__clang__)
  168656. "muls r6, r7\n\t"
  168657. #else
  168658. "mul r6, r7\n\t"
  168659. #endif
  168660. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168661. "lsrs r7, r6, #16\n\t"
  168662. #else
  168663. "lsr r7, r6, #16\n\t"
  168664. #endif
  168665. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168666. "lsls r6, r6, #16\n\t"
  168667. #else
  168668. "lsl r6, r6, #16\n\t"
  168669. #endif
  168670. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168671. "adds r5, r5, r6\n\t"
  168672. #else
  168673. "add r5, r5, r6\n\t"
  168674. #endif
  168675. #ifdef WOLFSSL_KEIL
  168676. "adcs r3, r3, r7\n\t"
  168677. #elif defined(__clang__)
  168678. "adcs r3, r7\n\t"
  168679. #else
  168680. "adc r3, r7\n\t"
  168681. #endif
  168682. #ifdef WOLFSSL_KEIL
  168683. "adcs r4, r4, %[r]\n\t"
  168684. #elif defined(__clang__)
  168685. "adcs r4, %[r]\n\t"
  168686. #else
  168687. "adc r4, %[r]\n\t"
  168688. #endif
  168689. "# A[12] * B[14]\n\t"
  168690. "mov %[a], r9\n\t"
  168691. "mov %[b], r10\n\t"
  168692. "ldr %[a], [%[a], #48]\n\t"
  168693. "ldr %[b], [%[b], #56]\n\t"
  168694. "uxth r6, %[a]\n\t"
  168695. "uxth r7, %[b]\n\t"
  168696. #ifdef WOLFSSL_KEIL
  168697. "muls r7, r6, r7\n\t"
  168698. #elif defined(__clang__)
  168699. "muls r7, r6\n\t"
  168700. #else
  168701. "mul r7, r6\n\t"
  168702. #endif
  168703. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168704. "adds r5, r5, r7\n\t"
  168705. #else
  168706. "add r5, r5, r7\n\t"
  168707. #endif
  168708. #ifdef WOLFSSL_KEIL
  168709. "adcs r3, r3, %[r]\n\t"
  168710. #elif defined(__clang__)
  168711. "adcs r3, %[r]\n\t"
  168712. #else
  168713. "adc r3, %[r]\n\t"
  168714. #endif
  168715. #ifdef WOLFSSL_KEIL
  168716. "adcs r4, r4, %[r]\n\t"
  168717. #elif defined(__clang__)
  168718. "adcs r4, %[r]\n\t"
  168719. #else
  168720. "adc r4, %[r]\n\t"
  168721. #endif
  168722. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168723. "lsrs r7, %[b], #16\n\t"
  168724. #else
  168725. "lsr r7, %[b], #16\n\t"
  168726. #endif
  168727. #ifdef WOLFSSL_KEIL
  168728. "muls r6, r7, r6\n\t"
  168729. #elif defined(__clang__)
  168730. "muls r6, r7\n\t"
  168731. #else
  168732. "mul r6, r7\n\t"
  168733. #endif
  168734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168735. "lsrs r7, r6, #16\n\t"
  168736. #else
  168737. "lsr r7, r6, #16\n\t"
  168738. #endif
  168739. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168740. "lsls r6, r6, #16\n\t"
  168741. #else
  168742. "lsl r6, r6, #16\n\t"
  168743. #endif
  168744. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168745. "adds r5, r5, r6\n\t"
  168746. #else
  168747. "add r5, r5, r6\n\t"
  168748. #endif
  168749. #ifdef WOLFSSL_KEIL
  168750. "adcs r3, r3, r7\n\t"
  168751. #elif defined(__clang__)
  168752. "adcs r3, r7\n\t"
  168753. #else
  168754. "adc r3, r7\n\t"
  168755. #endif
  168756. #ifdef WOLFSSL_KEIL
  168757. "adcs r4, r4, %[r]\n\t"
  168758. #elif defined(__clang__)
  168759. "adcs r4, %[r]\n\t"
  168760. #else
  168761. "adc r4, %[r]\n\t"
  168762. #endif
  168763. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168764. "lsrs r6, %[a], #16\n\t"
  168765. #else
  168766. "lsr r6, %[a], #16\n\t"
  168767. #endif
  168768. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168769. "lsrs r7, %[b], #16\n\t"
  168770. #else
  168771. "lsr r7, %[b], #16\n\t"
  168772. #endif
  168773. #ifdef WOLFSSL_KEIL
  168774. "muls r7, r6, r7\n\t"
  168775. #elif defined(__clang__)
  168776. "muls r7, r6\n\t"
  168777. #else
  168778. "mul r7, r6\n\t"
  168779. #endif
  168780. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168781. "adds r3, r3, r7\n\t"
  168782. #else
  168783. "add r3, r3, r7\n\t"
  168784. #endif
  168785. #ifdef WOLFSSL_KEIL
  168786. "adcs r4, r4, %[r]\n\t"
  168787. #elif defined(__clang__)
  168788. "adcs r4, %[r]\n\t"
  168789. #else
  168790. "adc r4, %[r]\n\t"
  168791. #endif
  168792. "uxth r7, %[b]\n\t"
  168793. #ifdef WOLFSSL_KEIL
  168794. "muls r6, r7, r6\n\t"
  168795. #elif defined(__clang__)
  168796. "muls r6, r7\n\t"
  168797. #else
  168798. "mul r6, r7\n\t"
  168799. #endif
  168800. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168801. "lsrs r7, r6, #16\n\t"
  168802. #else
  168803. "lsr r7, r6, #16\n\t"
  168804. #endif
  168805. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168806. "lsls r6, r6, #16\n\t"
  168807. #else
  168808. "lsl r6, r6, #16\n\t"
  168809. #endif
  168810. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168811. "adds r5, r5, r6\n\t"
  168812. #else
  168813. "add r5, r5, r6\n\t"
  168814. #endif
  168815. #ifdef WOLFSSL_KEIL
  168816. "adcs r3, r3, r7\n\t"
  168817. #elif defined(__clang__)
  168818. "adcs r3, r7\n\t"
  168819. #else
  168820. "adc r3, r7\n\t"
  168821. #endif
  168822. #ifdef WOLFSSL_KEIL
  168823. "adcs r4, r4, %[r]\n\t"
  168824. #elif defined(__clang__)
  168825. "adcs r4, %[r]\n\t"
  168826. #else
  168827. "adc r4, %[r]\n\t"
  168828. #endif
  168829. "# A[11] * B[15]\n\t"
  168830. "mov %[a], r9\n\t"
  168831. "mov %[b], r10\n\t"
  168832. "ldr %[a], [%[a], #44]\n\t"
  168833. "ldr %[b], [%[b], #60]\n\t"
  168834. "uxth r6, %[a]\n\t"
  168835. "uxth r7, %[b]\n\t"
  168836. #ifdef WOLFSSL_KEIL
  168837. "muls r7, r6, r7\n\t"
  168838. #elif defined(__clang__)
  168839. "muls r7, r6\n\t"
  168840. #else
  168841. "mul r7, r6\n\t"
  168842. #endif
  168843. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168844. "adds r5, r5, r7\n\t"
  168845. #else
  168846. "add r5, r5, r7\n\t"
  168847. #endif
  168848. #ifdef WOLFSSL_KEIL
  168849. "adcs r3, r3, %[r]\n\t"
  168850. #elif defined(__clang__)
  168851. "adcs r3, %[r]\n\t"
  168852. #else
  168853. "adc r3, %[r]\n\t"
  168854. #endif
  168855. #ifdef WOLFSSL_KEIL
  168856. "adcs r4, r4, %[r]\n\t"
  168857. #elif defined(__clang__)
  168858. "adcs r4, %[r]\n\t"
  168859. #else
  168860. "adc r4, %[r]\n\t"
  168861. #endif
  168862. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168863. "lsrs r7, %[b], #16\n\t"
  168864. #else
  168865. "lsr r7, %[b], #16\n\t"
  168866. #endif
  168867. #ifdef WOLFSSL_KEIL
  168868. "muls r6, r7, r6\n\t"
  168869. #elif defined(__clang__)
  168870. "muls r6, r7\n\t"
  168871. #else
  168872. "mul r6, r7\n\t"
  168873. #endif
  168874. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168875. "lsrs r7, r6, #16\n\t"
  168876. #else
  168877. "lsr r7, r6, #16\n\t"
  168878. #endif
  168879. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168880. "lsls r6, r6, #16\n\t"
  168881. #else
  168882. "lsl r6, r6, #16\n\t"
  168883. #endif
  168884. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168885. "adds r5, r5, r6\n\t"
  168886. #else
  168887. "add r5, r5, r6\n\t"
  168888. #endif
  168889. #ifdef WOLFSSL_KEIL
  168890. "adcs r3, r3, r7\n\t"
  168891. #elif defined(__clang__)
  168892. "adcs r3, r7\n\t"
  168893. #else
  168894. "adc r3, r7\n\t"
  168895. #endif
  168896. #ifdef WOLFSSL_KEIL
  168897. "adcs r4, r4, %[r]\n\t"
  168898. #elif defined(__clang__)
  168899. "adcs r4, %[r]\n\t"
  168900. #else
  168901. "adc r4, %[r]\n\t"
  168902. #endif
  168903. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168904. "lsrs r6, %[a], #16\n\t"
  168905. #else
  168906. "lsr r6, %[a], #16\n\t"
  168907. #endif
  168908. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168909. "lsrs r7, %[b], #16\n\t"
  168910. #else
  168911. "lsr r7, %[b], #16\n\t"
  168912. #endif
  168913. #ifdef WOLFSSL_KEIL
  168914. "muls r7, r6, r7\n\t"
  168915. #elif defined(__clang__)
  168916. "muls r7, r6\n\t"
  168917. #else
  168918. "mul r7, r6\n\t"
  168919. #endif
  168920. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168921. "adds r3, r3, r7\n\t"
  168922. #else
  168923. "add r3, r3, r7\n\t"
  168924. #endif
  168925. #ifdef WOLFSSL_KEIL
  168926. "adcs r4, r4, %[r]\n\t"
  168927. #elif defined(__clang__)
  168928. "adcs r4, %[r]\n\t"
  168929. #else
  168930. "adc r4, %[r]\n\t"
  168931. #endif
  168932. "uxth r7, %[b]\n\t"
  168933. #ifdef WOLFSSL_KEIL
  168934. "muls r6, r7, r6\n\t"
  168935. #elif defined(__clang__)
  168936. "muls r6, r7\n\t"
  168937. #else
  168938. "mul r6, r7\n\t"
  168939. #endif
  168940. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168941. "lsrs r7, r6, #16\n\t"
  168942. #else
  168943. "lsr r7, r6, #16\n\t"
  168944. #endif
  168945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168946. "lsls r6, r6, #16\n\t"
  168947. #else
  168948. "lsl r6, r6, #16\n\t"
  168949. #endif
  168950. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168951. "adds r5, r5, r6\n\t"
  168952. #else
  168953. "add r5, r5, r6\n\t"
  168954. #endif
  168955. #ifdef WOLFSSL_KEIL
  168956. "adcs r3, r3, r7\n\t"
  168957. #elif defined(__clang__)
  168958. "adcs r3, r7\n\t"
  168959. #else
  168960. "adc r3, r7\n\t"
  168961. #endif
  168962. #ifdef WOLFSSL_KEIL
  168963. "adcs r4, r4, %[r]\n\t"
  168964. #elif defined(__clang__)
  168965. "adcs r4, %[r]\n\t"
  168966. #else
  168967. "adc r4, %[r]\n\t"
  168968. #endif
  168969. "mov %[r], r8\n\t"
  168970. "str r5, [%[r], #104]\n\t"
  168971. "movs %[r], #0\n\t"
  168972. "# A[12] * B[15]\n\t"
  168973. "movs r5, #0\n\t"
  168974. "mov %[a], r9\n\t"
  168975. "mov %[b], r10\n\t"
  168976. "ldr %[a], [%[a], #48]\n\t"
  168977. "ldr %[b], [%[b], #60]\n\t"
  168978. "uxth r6, %[a]\n\t"
  168979. "uxth r7, %[b]\n\t"
  168980. #ifdef WOLFSSL_KEIL
  168981. "muls r7, r6, r7\n\t"
  168982. #elif defined(__clang__)
  168983. "muls r7, r6\n\t"
  168984. #else
  168985. "mul r7, r6\n\t"
  168986. #endif
  168987. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168988. "adds r3, r3, r7\n\t"
  168989. #else
  168990. "add r3, r3, r7\n\t"
  168991. #endif
  168992. #ifdef WOLFSSL_KEIL
  168993. "adcs r4, r4, %[r]\n\t"
  168994. #elif defined(__clang__)
  168995. "adcs r4, %[r]\n\t"
  168996. #else
  168997. "adc r4, %[r]\n\t"
  168998. #endif
  168999. #ifdef WOLFSSL_KEIL
  169000. "adcs r5, r5, %[r]\n\t"
  169001. #elif defined(__clang__)
  169002. "adcs r5, %[r]\n\t"
  169003. #else
  169004. "adc r5, %[r]\n\t"
  169005. #endif
  169006. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169007. "lsrs r7, %[b], #16\n\t"
  169008. #else
  169009. "lsr r7, %[b], #16\n\t"
  169010. #endif
  169011. #ifdef WOLFSSL_KEIL
  169012. "muls r6, r7, r6\n\t"
  169013. #elif defined(__clang__)
  169014. "muls r6, r7\n\t"
  169015. #else
  169016. "mul r6, r7\n\t"
  169017. #endif
  169018. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169019. "lsrs r7, r6, #16\n\t"
  169020. #else
  169021. "lsr r7, r6, #16\n\t"
  169022. #endif
  169023. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169024. "lsls r6, r6, #16\n\t"
  169025. #else
  169026. "lsl r6, r6, #16\n\t"
  169027. #endif
  169028. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169029. "adds r3, r3, r6\n\t"
  169030. #else
  169031. "add r3, r3, r6\n\t"
  169032. #endif
  169033. #ifdef WOLFSSL_KEIL
  169034. "adcs r4, r4, r7\n\t"
  169035. #elif defined(__clang__)
  169036. "adcs r4, r7\n\t"
  169037. #else
  169038. "adc r4, r7\n\t"
  169039. #endif
  169040. #ifdef WOLFSSL_KEIL
  169041. "adcs r5, r5, %[r]\n\t"
  169042. #elif defined(__clang__)
  169043. "adcs r5, %[r]\n\t"
  169044. #else
  169045. "adc r5, %[r]\n\t"
  169046. #endif
  169047. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169048. "lsrs r6, %[a], #16\n\t"
  169049. #else
  169050. "lsr r6, %[a], #16\n\t"
  169051. #endif
  169052. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169053. "lsrs r7, %[b], #16\n\t"
  169054. #else
  169055. "lsr r7, %[b], #16\n\t"
  169056. #endif
  169057. #ifdef WOLFSSL_KEIL
  169058. "muls r7, r6, r7\n\t"
  169059. #elif defined(__clang__)
  169060. "muls r7, r6\n\t"
  169061. #else
  169062. "mul r7, r6\n\t"
  169063. #endif
  169064. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169065. "adds r4, r4, r7\n\t"
  169066. #else
  169067. "add r4, r4, r7\n\t"
  169068. #endif
  169069. #ifdef WOLFSSL_KEIL
  169070. "adcs r5, r5, %[r]\n\t"
  169071. #elif defined(__clang__)
  169072. "adcs r5, %[r]\n\t"
  169073. #else
  169074. "adc r5, %[r]\n\t"
  169075. #endif
  169076. "uxth r7, %[b]\n\t"
  169077. #ifdef WOLFSSL_KEIL
  169078. "muls r6, r7, r6\n\t"
  169079. #elif defined(__clang__)
  169080. "muls r6, r7\n\t"
  169081. #else
  169082. "mul r6, r7\n\t"
  169083. #endif
  169084. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169085. "lsrs r7, r6, #16\n\t"
  169086. #else
  169087. "lsr r7, r6, #16\n\t"
  169088. #endif
  169089. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169090. "lsls r6, r6, #16\n\t"
  169091. #else
  169092. "lsl r6, r6, #16\n\t"
  169093. #endif
  169094. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169095. "adds r3, r3, r6\n\t"
  169096. #else
  169097. "add r3, r3, r6\n\t"
  169098. #endif
  169099. #ifdef WOLFSSL_KEIL
  169100. "adcs r4, r4, r7\n\t"
  169101. #elif defined(__clang__)
  169102. "adcs r4, r7\n\t"
  169103. #else
  169104. "adc r4, r7\n\t"
  169105. #endif
  169106. #ifdef WOLFSSL_KEIL
  169107. "adcs r5, r5, %[r]\n\t"
  169108. #elif defined(__clang__)
  169109. "adcs r5, %[r]\n\t"
  169110. #else
  169111. "adc r5, %[r]\n\t"
  169112. #endif
  169113. "# A[13] * B[14]\n\t"
  169114. "mov %[a], r9\n\t"
  169115. "mov %[b], r10\n\t"
  169116. "ldr %[a], [%[a], #52]\n\t"
  169117. "ldr %[b], [%[b], #56]\n\t"
  169118. "uxth r6, %[a]\n\t"
  169119. "uxth r7, %[b]\n\t"
  169120. #ifdef WOLFSSL_KEIL
  169121. "muls r7, r6, r7\n\t"
  169122. #elif defined(__clang__)
  169123. "muls r7, r6\n\t"
  169124. #else
  169125. "mul r7, r6\n\t"
  169126. #endif
  169127. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169128. "adds r3, r3, r7\n\t"
  169129. #else
  169130. "add r3, r3, r7\n\t"
  169131. #endif
  169132. #ifdef WOLFSSL_KEIL
  169133. "adcs r4, r4, %[r]\n\t"
  169134. #elif defined(__clang__)
  169135. "adcs r4, %[r]\n\t"
  169136. #else
  169137. "adc r4, %[r]\n\t"
  169138. #endif
  169139. #ifdef WOLFSSL_KEIL
  169140. "adcs r5, r5, %[r]\n\t"
  169141. #elif defined(__clang__)
  169142. "adcs r5, %[r]\n\t"
  169143. #else
  169144. "adc r5, %[r]\n\t"
  169145. #endif
  169146. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169147. "lsrs r7, %[b], #16\n\t"
  169148. #else
  169149. "lsr r7, %[b], #16\n\t"
  169150. #endif
  169151. #ifdef WOLFSSL_KEIL
  169152. "muls r6, r7, r6\n\t"
  169153. #elif defined(__clang__)
  169154. "muls r6, r7\n\t"
  169155. #else
  169156. "mul r6, r7\n\t"
  169157. #endif
  169158. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169159. "lsrs r7, r6, #16\n\t"
  169160. #else
  169161. "lsr r7, r6, #16\n\t"
  169162. #endif
  169163. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169164. "lsls r6, r6, #16\n\t"
  169165. #else
  169166. "lsl r6, r6, #16\n\t"
  169167. #endif
  169168. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169169. "adds r3, r3, r6\n\t"
  169170. #else
  169171. "add r3, r3, r6\n\t"
  169172. #endif
  169173. #ifdef WOLFSSL_KEIL
  169174. "adcs r4, r4, r7\n\t"
  169175. #elif defined(__clang__)
  169176. "adcs r4, r7\n\t"
  169177. #else
  169178. "adc r4, r7\n\t"
  169179. #endif
  169180. #ifdef WOLFSSL_KEIL
  169181. "adcs r5, r5, %[r]\n\t"
  169182. #elif defined(__clang__)
  169183. "adcs r5, %[r]\n\t"
  169184. #else
  169185. "adc r5, %[r]\n\t"
  169186. #endif
  169187. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169188. "lsrs r6, %[a], #16\n\t"
  169189. #else
  169190. "lsr r6, %[a], #16\n\t"
  169191. #endif
  169192. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169193. "lsrs r7, %[b], #16\n\t"
  169194. #else
  169195. "lsr r7, %[b], #16\n\t"
  169196. #endif
  169197. #ifdef WOLFSSL_KEIL
  169198. "muls r7, r6, r7\n\t"
  169199. #elif defined(__clang__)
  169200. "muls r7, r6\n\t"
  169201. #else
  169202. "mul r7, r6\n\t"
  169203. #endif
  169204. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169205. "adds r4, r4, r7\n\t"
  169206. #else
  169207. "add r4, r4, r7\n\t"
  169208. #endif
  169209. #ifdef WOLFSSL_KEIL
  169210. "adcs r5, r5, %[r]\n\t"
  169211. #elif defined(__clang__)
  169212. "adcs r5, %[r]\n\t"
  169213. #else
  169214. "adc r5, %[r]\n\t"
  169215. #endif
  169216. "uxth r7, %[b]\n\t"
  169217. #ifdef WOLFSSL_KEIL
  169218. "muls r6, r7, r6\n\t"
  169219. #elif defined(__clang__)
  169220. "muls r6, r7\n\t"
  169221. #else
  169222. "mul r6, r7\n\t"
  169223. #endif
  169224. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169225. "lsrs r7, r6, #16\n\t"
  169226. #else
  169227. "lsr r7, r6, #16\n\t"
  169228. #endif
  169229. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169230. "lsls r6, r6, #16\n\t"
  169231. #else
  169232. "lsl r6, r6, #16\n\t"
  169233. #endif
  169234. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169235. "adds r3, r3, r6\n\t"
  169236. #else
  169237. "add r3, r3, r6\n\t"
  169238. #endif
  169239. #ifdef WOLFSSL_KEIL
  169240. "adcs r4, r4, r7\n\t"
  169241. #elif defined(__clang__)
  169242. "adcs r4, r7\n\t"
  169243. #else
  169244. "adc r4, r7\n\t"
  169245. #endif
  169246. #ifdef WOLFSSL_KEIL
  169247. "adcs r5, r5, %[r]\n\t"
  169248. #elif defined(__clang__)
  169249. "adcs r5, %[r]\n\t"
  169250. #else
  169251. "adc r5, %[r]\n\t"
  169252. #endif
  169253. "# A[14] * B[13]\n\t"
  169254. "mov %[a], r9\n\t"
  169255. "mov %[b], r10\n\t"
  169256. "ldr %[a], [%[a], #56]\n\t"
  169257. "ldr %[b], [%[b], #52]\n\t"
  169258. "uxth r6, %[a]\n\t"
  169259. "uxth r7, %[b]\n\t"
  169260. #ifdef WOLFSSL_KEIL
  169261. "muls r7, r6, r7\n\t"
  169262. #elif defined(__clang__)
  169263. "muls r7, r6\n\t"
  169264. #else
  169265. "mul r7, r6\n\t"
  169266. #endif
  169267. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169268. "adds r3, r3, r7\n\t"
  169269. #else
  169270. "add r3, r3, r7\n\t"
  169271. #endif
  169272. #ifdef WOLFSSL_KEIL
  169273. "adcs r4, r4, %[r]\n\t"
  169274. #elif defined(__clang__)
  169275. "adcs r4, %[r]\n\t"
  169276. #else
  169277. "adc r4, %[r]\n\t"
  169278. #endif
  169279. #ifdef WOLFSSL_KEIL
  169280. "adcs r5, r5, %[r]\n\t"
  169281. #elif defined(__clang__)
  169282. "adcs r5, %[r]\n\t"
  169283. #else
  169284. "adc r5, %[r]\n\t"
  169285. #endif
  169286. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169287. "lsrs r7, %[b], #16\n\t"
  169288. #else
  169289. "lsr r7, %[b], #16\n\t"
  169290. #endif
  169291. #ifdef WOLFSSL_KEIL
  169292. "muls r6, r7, r6\n\t"
  169293. #elif defined(__clang__)
  169294. "muls r6, r7\n\t"
  169295. #else
  169296. "mul r6, r7\n\t"
  169297. #endif
  169298. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169299. "lsrs r7, r6, #16\n\t"
  169300. #else
  169301. "lsr r7, r6, #16\n\t"
  169302. #endif
  169303. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169304. "lsls r6, r6, #16\n\t"
  169305. #else
  169306. "lsl r6, r6, #16\n\t"
  169307. #endif
  169308. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169309. "adds r3, r3, r6\n\t"
  169310. #else
  169311. "add r3, r3, r6\n\t"
  169312. #endif
  169313. #ifdef WOLFSSL_KEIL
  169314. "adcs r4, r4, r7\n\t"
  169315. #elif defined(__clang__)
  169316. "adcs r4, r7\n\t"
  169317. #else
  169318. "adc r4, r7\n\t"
  169319. #endif
  169320. #ifdef WOLFSSL_KEIL
  169321. "adcs r5, r5, %[r]\n\t"
  169322. #elif defined(__clang__)
  169323. "adcs r5, %[r]\n\t"
  169324. #else
  169325. "adc r5, %[r]\n\t"
  169326. #endif
  169327. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169328. "lsrs r6, %[a], #16\n\t"
  169329. #else
  169330. "lsr r6, %[a], #16\n\t"
  169331. #endif
  169332. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169333. "lsrs r7, %[b], #16\n\t"
  169334. #else
  169335. "lsr r7, %[b], #16\n\t"
  169336. #endif
  169337. #ifdef WOLFSSL_KEIL
  169338. "muls r7, r6, r7\n\t"
  169339. #elif defined(__clang__)
  169340. "muls r7, r6\n\t"
  169341. #else
  169342. "mul r7, r6\n\t"
  169343. #endif
  169344. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169345. "adds r4, r4, r7\n\t"
  169346. #else
  169347. "add r4, r4, r7\n\t"
  169348. #endif
  169349. #ifdef WOLFSSL_KEIL
  169350. "adcs r5, r5, %[r]\n\t"
  169351. #elif defined(__clang__)
  169352. "adcs r5, %[r]\n\t"
  169353. #else
  169354. "adc r5, %[r]\n\t"
  169355. #endif
  169356. "uxth r7, %[b]\n\t"
  169357. #ifdef WOLFSSL_KEIL
  169358. "muls r6, r7, r6\n\t"
  169359. #elif defined(__clang__)
  169360. "muls r6, r7\n\t"
  169361. #else
  169362. "mul r6, r7\n\t"
  169363. #endif
  169364. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169365. "lsrs r7, r6, #16\n\t"
  169366. #else
  169367. "lsr r7, r6, #16\n\t"
  169368. #endif
  169369. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169370. "lsls r6, r6, #16\n\t"
  169371. #else
  169372. "lsl r6, r6, #16\n\t"
  169373. #endif
  169374. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169375. "adds r3, r3, r6\n\t"
  169376. #else
  169377. "add r3, r3, r6\n\t"
  169378. #endif
  169379. #ifdef WOLFSSL_KEIL
  169380. "adcs r4, r4, r7\n\t"
  169381. #elif defined(__clang__)
  169382. "adcs r4, r7\n\t"
  169383. #else
  169384. "adc r4, r7\n\t"
  169385. #endif
  169386. #ifdef WOLFSSL_KEIL
  169387. "adcs r5, r5, %[r]\n\t"
  169388. #elif defined(__clang__)
  169389. "adcs r5, %[r]\n\t"
  169390. #else
  169391. "adc r5, %[r]\n\t"
  169392. #endif
  169393. "# A[15] * B[12]\n\t"
  169394. "mov %[a], r9\n\t"
  169395. "mov %[b], r10\n\t"
  169396. "ldr %[a], [%[a], #60]\n\t"
  169397. "ldr %[b], [%[b], #48]\n\t"
  169398. "uxth r6, %[a]\n\t"
  169399. "uxth r7, %[b]\n\t"
  169400. #ifdef WOLFSSL_KEIL
  169401. "muls r7, r6, r7\n\t"
  169402. #elif defined(__clang__)
  169403. "muls r7, r6\n\t"
  169404. #else
  169405. "mul r7, r6\n\t"
  169406. #endif
  169407. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169408. "adds r3, r3, r7\n\t"
  169409. #else
  169410. "add r3, r3, r7\n\t"
  169411. #endif
  169412. #ifdef WOLFSSL_KEIL
  169413. "adcs r4, r4, %[r]\n\t"
  169414. #elif defined(__clang__)
  169415. "adcs r4, %[r]\n\t"
  169416. #else
  169417. "adc r4, %[r]\n\t"
  169418. #endif
  169419. #ifdef WOLFSSL_KEIL
  169420. "adcs r5, r5, %[r]\n\t"
  169421. #elif defined(__clang__)
  169422. "adcs r5, %[r]\n\t"
  169423. #else
  169424. "adc r5, %[r]\n\t"
  169425. #endif
  169426. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169427. "lsrs r7, %[b], #16\n\t"
  169428. #else
  169429. "lsr r7, %[b], #16\n\t"
  169430. #endif
  169431. #ifdef WOLFSSL_KEIL
  169432. "muls r6, r7, r6\n\t"
  169433. #elif defined(__clang__)
  169434. "muls r6, r7\n\t"
  169435. #else
  169436. "mul r6, r7\n\t"
  169437. #endif
  169438. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169439. "lsrs r7, r6, #16\n\t"
  169440. #else
  169441. "lsr r7, r6, #16\n\t"
  169442. #endif
  169443. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169444. "lsls r6, r6, #16\n\t"
  169445. #else
  169446. "lsl r6, r6, #16\n\t"
  169447. #endif
  169448. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169449. "adds r3, r3, r6\n\t"
  169450. #else
  169451. "add r3, r3, r6\n\t"
  169452. #endif
  169453. #ifdef WOLFSSL_KEIL
  169454. "adcs r4, r4, r7\n\t"
  169455. #elif defined(__clang__)
  169456. "adcs r4, r7\n\t"
  169457. #else
  169458. "adc r4, r7\n\t"
  169459. #endif
  169460. #ifdef WOLFSSL_KEIL
  169461. "adcs r5, r5, %[r]\n\t"
  169462. #elif defined(__clang__)
  169463. "adcs r5, %[r]\n\t"
  169464. #else
  169465. "adc r5, %[r]\n\t"
  169466. #endif
  169467. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169468. "lsrs r6, %[a], #16\n\t"
  169469. #else
  169470. "lsr r6, %[a], #16\n\t"
  169471. #endif
  169472. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169473. "lsrs r7, %[b], #16\n\t"
  169474. #else
  169475. "lsr r7, %[b], #16\n\t"
  169476. #endif
  169477. #ifdef WOLFSSL_KEIL
  169478. "muls r7, r6, r7\n\t"
  169479. #elif defined(__clang__)
  169480. "muls r7, r6\n\t"
  169481. #else
  169482. "mul r7, r6\n\t"
  169483. #endif
  169484. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169485. "adds r4, r4, r7\n\t"
  169486. #else
  169487. "add r4, r4, r7\n\t"
  169488. #endif
  169489. #ifdef WOLFSSL_KEIL
  169490. "adcs r5, r5, %[r]\n\t"
  169491. #elif defined(__clang__)
  169492. "adcs r5, %[r]\n\t"
  169493. #else
  169494. "adc r5, %[r]\n\t"
  169495. #endif
  169496. "uxth r7, %[b]\n\t"
  169497. #ifdef WOLFSSL_KEIL
  169498. "muls r6, r7, r6\n\t"
  169499. #elif defined(__clang__)
  169500. "muls r6, r7\n\t"
  169501. #else
  169502. "mul r6, r7\n\t"
  169503. #endif
  169504. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169505. "lsrs r7, r6, #16\n\t"
  169506. #else
  169507. "lsr r7, r6, #16\n\t"
  169508. #endif
  169509. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169510. "lsls r6, r6, #16\n\t"
  169511. #else
  169512. "lsl r6, r6, #16\n\t"
  169513. #endif
  169514. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169515. "adds r3, r3, r6\n\t"
  169516. #else
  169517. "add r3, r3, r6\n\t"
  169518. #endif
  169519. #ifdef WOLFSSL_KEIL
  169520. "adcs r4, r4, r7\n\t"
  169521. #elif defined(__clang__)
  169522. "adcs r4, r7\n\t"
  169523. #else
  169524. "adc r4, r7\n\t"
  169525. #endif
  169526. #ifdef WOLFSSL_KEIL
  169527. "adcs r5, r5, %[r]\n\t"
  169528. #elif defined(__clang__)
  169529. "adcs r5, %[r]\n\t"
  169530. #else
  169531. "adc r5, %[r]\n\t"
  169532. #endif
  169533. "mov %[r], r8\n\t"
  169534. "str r3, [%[r], #108]\n\t"
  169535. "movs %[r], #0\n\t"
  169536. "# A[15] * B[13]\n\t"
  169537. "movs r3, #0\n\t"
  169538. "mov %[a], r9\n\t"
  169539. "mov %[b], r10\n\t"
  169540. "ldr %[a], [%[a], #60]\n\t"
  169541. "ldr %[b], [%[b], #52]\n\t"
  169542. "uxth r6, %[a]\n\t"
  169543. "uxth r7, %[b]\n\t"
  169544. #ifdef WOLFSSL_KEIL
  169545. "muls r7, r6, r7\n\t"
  169546. #elif defined(__clang__)
  169547. "muls r7, r6\n\t"
  169548. #else
  169549. "mul r7, r6\n\t"
  169550. #endif
  169551. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169552. "adds r4, r4, r7\n\t"
  169553. #else
  169554. "add r4, r4, r7\n\t"
  169555. #endif
  169556. #ifdef WOLFSSL_KEIL
  169557. "adcs r5, r5, %[r]\n\t"
  169558. #elif defined(__clang__)
  169559. "adcs r5, %[r]\n\t"
  169560. #else
  169561. "adc r5, %[r]\n\t"
  169562. #endif
  169563. #ifdef WOLFSSL_KEIL
  169564. "adcs r3, r3, %[r]\n\t"
  169565. #elif defined(__clang__)
  169566. "adcs r3, %[r]\n\t"
  169567. #else
  169568. "adc r3, %[r]\n\t"
  169569. #endif
  169570. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169571. "lsrs r7, %[b], #16\n\t"
  169572. #else
  169573. "lsr r7, %[b], #16\n\t"
  169574. #endif
  169575. #ifdef WOLFSSL_KEIL
  169576. "muls r6, r7, r6\n\t"
  169577. #elif defined(__clang__)
  169578. "muls r6, r7\n\t"
  169579. #else
  169580. "mul r6, r7\n\t"
  169581. #endif
  169582. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169583. "lsrs r7, r6, #16\n\t"
  169584. #else
  169585. "lsr r7, r6, #16\n\t"
  169586. #endif
  169587. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169588. "lsls r6, r6, #16\n\t"
  169589. #else
  169590. "lsl r6, r6, #16\n\t"
  169591. #endif
  169592. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169593. "adds r4, r4, r6\n\t"
  169594. #else
  169595. "add r4, r4, r6\n\t"
  169596. #endif
  169597. #ifdef WOLFSSL_KEIL
  169598. "adcs r5, r5, r7\n\t"
  169599. #elif defined(__clang__)
  169600. "adcs r5, r7\n\t"
  169601. #else
  169602. "adc r5, r7\n\t"
  169603. #endif
  169604. #ifdef WOLFSSL_KEIL
  169605. "adcs r3, r3, %[r]\n\t"
  169606. #elif defined(__clang__)
  169607. "adcs r3, %[r]\n\t"
  169608. #else
  169609. "adc r3, %[r]\n\t"
  169610. #endif
  169611. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169612. "lsrs r6, %[a], #16\n\t"
  169613. #else
  169614. "lsr r6, %[a], #16\n\t"
  169615. #endif
  169616. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169617. "lsrs r7, %[b], #16\n\t"
  169618. #else
  169619. "lsr r7, %[b], #16\n\t"
  169620. #endif
  169621. #ifdef WOLFSSL_KEIL
  169622. "muls r7, r6, r7\n\t"
  169623. #elif defined(__clang__)
  169624. "muls r7, r6\n\t"
  169625. #else
  169626. "mul r7, r6\n\t"
  169627. #endif
  169628. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169629. "adds r5, r5, r7\n\t"
  169630. #else
  169631. "add r5, r5, r7\n\t"
  169632. #endif
  169633. #ifdef WOLFSSL_KEIL
  169634. "adcs r3, r3, %[r]\n\t"
  169635. #elif defined(__clang__)
  169636. "adcs r3, %[r]\n\t"
  169637. #else
  169638. "adc r3, %[r]\n\t"
  169639. #endif
  169640. "uxth r7, %[b]\n\t"
  169641. #ifdef WOLFSSL_KEIL
  169642. "muls r6, r7, r6\n\t"
  169643. #elif defined(__clang__)
  169644. "muls r6, r7\n\t"
  169645. #else
  169646. "mul r6, r7\n\t"
  169647. #endif
  169648. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169649. "lsrs r7, r6, #16\n\t"
  169650. #else
  169651. "lsr r7, r6, #16\n\t"
  169652. #endif
  169653. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169654. "lsls r6, r6, #16\n\t"
  169655. #else
  169656. "lsl r6, r6, #16\n\t"
  169657. #endif
  169658. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169659. "adds r4, r4, r6\n\t"
  169660. #else
  169661. "add r4, r4, r6\n\t"
  169662. #endif
  169663. #ifdef WOLFSSL_KEIL
  169664. "adcs r5, r5, r7\n\t"
  169665. #elif defined(__clang__)
  169666. "adcs r5, r7\n\t"
  169667. #else
  169668. "adc r5, r7\n\t"
  169669. #endif
  169670. #ifdef WOLFSSL_KEIL
  169671. "adcs r3, r3, %[r]\n\t"
  169672. #elif defined(__clang__)
  169673. "adcs r3, %[r]\n\t"
  169674. #else
  169675. "adc r3, %[r]\n\t"
  169676. #endif
  169677. "# A[14] * B[14]\n\t"
  169678. "mov %[a], r9\n\t"
  169679. "mov %[b], r10\n\t"
  169680. "ldr %[a], [%[a], #56]\n\t"
  169681. "ldr %[b], [%[b], #56]\n\t"
  169682. "uxth r6, %[a]\n\t"
  169683. "uxth r7, %[b]\n\t"
  169684. #ifdef WOLFSSL_KEIL
  169685. "muls r7, r6, r7\n\t"
  169686. #elif defined(__clang__)
  169687. "muls r7, r6\n\t"
  169688. #else
  169689. "mul r7, r6\n\t"
  169690. #endif
  169691. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169692. "adds r4, r4, r7\n\t"
  169693. #else
  169694. "add r4, r4, r7\n\t"
  169695. #endif
  169696. #ifdef WOLFSSL_KEIL
  169697. "adcs r5, r5, %[r]\n\t"
  169698. #elif defined(__clang__)
  169699. "adcs r5, %[r]\n\t"
  169700. #else
  169701. "adc r5, %[r]\n\t"
  169702. #endif
  169703. #ifdef WOLFSSL_KEIL
  169704. "adcs r3, r3, %[r]\n\t"
  169705. #elif defined(__clang__)
  169706. "adcs r3, %[r]\n\t"
  169707. #else
  169708. "adc r3, %[r]\n\t"
  169709. #endif
  169710. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169711. "lsrs r7, %[b], #16\n\t"
  169712. #else
  169713. "lsr r7, %[b], #16\n\t"
  169714. #endif
  169715. #ifdef WOLFSSL_KEIL
  169716. "muls r6, r7, r6\n\t"
  169717. #elif defined(__clang__)
  169718. "muls r6, r7\n\t"
  169719. #else
  169720. "mul r6, r7\n\t"
  169721. #endif
  169722. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169723. "lsrs r7, r6, #16\n\t"
  169724. #else
  169725. "lsr r7, r6, #16\n\t"
  169726. #endif
  169727. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169728. "lsls r6, r6, #16\n\t"
  169729. #else
  169730. "lsl r6, r6, #16\n\t"
  169731. #endif
  169732. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169733. "adds r4, r4, r6\n\t"
  169734. #else
  169735. "add r4, r4, r6\n\t"
  169736. #endif
  169737. #ifdef WOLFSSL_KEIL
  169738. "adcs r5, r5, r7\n\t"
  169739. #elif defined(__clang__)
  169740. "adcs r5, r7\n\t"
  169741. #else
  169742. "adc r5, r7\n\t"
  169743. #endif
  169744. #ifdef WOLFSSL_KEIL
  169745. "adcs r3, r3, %[r]\n\t"
  169746. #elif defined(__clang__)
  169747. "adcs r3, %[r]\n\t"
  169748. #else
  169749. "adc r3, %[r]\n\t"
  169750. #endif
  169751. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169752. "lsrs r6, %[a], #16\n\t"
  169753. #else
  169754. "lsr r6, %[a], #16\n\t"
  169755. #endif
  169756. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169757. "lsrs r7, %[b], #16\n\t"
  169758. #else
  169759. "lsr r7, %[b], #16\n\t"
  169760. #endif
  169761. #ifdef WOLFSSL_KEIL
  169762. "muls r7, r6, r7\n\t"
  169763. #elif defined(__clang__)
  169764. "muls r7, r6\n\t"
  169765. #else
  169766. "mul r7, r6\n\t"
  169767. #endif
  169768. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169769. "adds r5, r5, r7\n\t"
  169770. #else
  169771. "add r5, r5, r7\n\t"
  169772. #endif
  169773. #ifdef WOLFSSL_KEIL
  169774. "adcs r3, r3, %[r]\n\t"
  169775. #elif defined(__clang__)
  169776. "adcs r3, %[r]\n\t"
  169777. #else
  169778. "adc r3, %[r]\n\t"
  169779. #endif
  169780. "uxth r7, %[b]\n\t"
  169781. #ifdef WOLFSSL_KEIL
  169782. "muls r6, r7, r6\n\t"
  169783. #elif defined(__clang__)
  169784. "muls r6, r7\n\t"
  169785. #else
  169786. "mul r6, r7\n\t"
  169787. #endif
  169788. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169789. "lsrs r7, r6, #16\n\t"
  169790. #else
  169791. "lsr r7, r6, #16\n\t"
  169792. #endif
  169793. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169794. "lsls r6, r6, #16\n\t"
  169795. #else
  169796. "lsl r6, r6, #16\n\t"
  169797. #endif
  169798. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169799. "adds r4, r4, r6\n\t"
  169800. #else
  169801. "add r4, r4, r6\n\t"
  169802. #endif
  169803. #ifdef WOLFSSL_KEIL
  169804. "adcs r5, r5, r7\n\t"
  169805. #elif defined(__clang__)
  169806. "adcs r5, r7\n\t"
  169807. #else
  169808. "adc r5, r7\n\t"
  169809. #endif
  169810. #ifdef WOLFSSL_KEIL
  169811. "adcs r3, r3, %[r]\n\t"
  169812. #elif defined(__clang__)
  169813. "adcs r3, %[r]\n\t"
  169814. #else
  169815. "adc r3, %[r]\n\t"
  169816. #endif
  169817. "# A[13] * B[15]\n\t"
  169818. "mov %[a], r9\n\t"
  169819. "mov %[b], r10\n\t"
  169820. "ldr %[a], [%[a], #52]\n\t"
  169821. "ldr %[b], [%[b], #60]\n\t"
  169822. "uxth r6, %[a]\n\t"
  169823. "uxth r7, %[b]\n\t"
  169824. #ifdef WOLFSSL_KEIL
  169825. "muls r7, r6, r7\n\t"
  169826. #elif defined(__clang__)
  169827. "muls r7, r6\n\t"
  169828. #else
  169829. "mul r7, r6\n\t"
  169830. #endif
  169831. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169832. "adds r4, r4, r7\n\t"
  169833. #else
  169834. "add r4, r4, r7\n\t"
  169835. #endif
  169836. #ifdef WOLFSSL_KEIL
  169837. "adcs r5, r5, %[r]\n\t"
  169838. #elif defined(__clang__)
  169839. "adcs r5, %[r]\n\t"
  169840. #else
  169841. "adc r5, %[r]\n\t"
  169842. #endif
  169843. #ifdef WOLFSSL_KEIL
  169844. "adcs r3, r3, %[r]\n\t"
  169845. #elif defined(__clang__)
  169846. "adcs r3, %[r]\n\t"
  169847. #else
  169848. "adc r3, %[r]\n\t"
  169849. #endif
  169850. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169851. "lsrs r7, %[b], #16\n\t"
  169852. #else
  169853. "lsr r7, %[b], #16\n\t"
  169854. #endif
  169855. #ifdef WOLFSSL_KEIL
  169856. "muls r6, r7, r6\n\t"
  169857. #elif defined(__clang__)
  169858. "muls r6, r7\n\t"
  169859. #else
  169860. "mul r6, r7\n\t"
  169861. #endif
  169862. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169863. "lsrs r7, r6, #16\n\t"
  169864. #else
  169865. "lsr r7, r6, #16\n\t"
  169866. #endif
  169867. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169868. "lsls r6, r6, #16\n\t"
  169869. #else
  169870. "lsl r6, r6, #16\n\t"
  169871. #endif
  169872. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169873. "adds r4, r4, r6\n\t"
  169874. #else
  169875. "add r4, r4, r6\n\t"
  169876. #endif
  169877. #ifdef WOLFSSL_KEIL
  169878. "adcs r5, r5, r7\n\t"
  169879. #elif defined(__clang__)
  169880. "adcs r5, r7\n\t"
  169881. #else
  169882. "adc r5, r7\n\t"
  169883. #endif
  169884. #ifdef WOLFSSL_KEIL
  169885. "adcs r3, r3, %[r]\n\t"
  169886. #elif defined(__clang__)
  169887. "adcs r3, %[r]\n\t"
  169888. #else
  169889. "adc r3, %[r]\n\t"
  169890. #endif
  169891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169892. "lsrs r6, %[a], #16\n\t"
  169893. #else
  169894. "lsr r6, %[a], #16\n\t"
  169895. #endif
  169896. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169897. "lsrs r7, %[b], #16\n\t"
  169898. #else
  169899. "lsr r7, %[b], #16\n\t"
  169900. #endif
  169901. #ifdef WOLFSSL_KEIL
  169902. "muls r7, r6, r7\n\t"
  169903. #elif defined(__clang__)
  169904. "muls r7, r6\n\t"
  169905. #else
  169906. "mul r7, r6\n\t"
  169907. #endif
  169908. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169909. "adds r5, r5, r7\n\t"
  169910. #else
  169911. "add r5, r5, r7\n\t"
  169912. #endif
  169913. #ifdef WOLFSSL_KEIL
  169914. "adcs r3, r3, %[r]\n\t"
  169915. #elif defined(__clang__)
  169916. "adcs r3, %[r]\n\t"
  169917. #else
  169918. "adc r3, %[r]\n\t"
  169919. #endif
  169920. "uxth r7, %[b]\n\t"
  169921. #ifdef WOLFSSL_KEIL
  169922. "muls r6, r7, r6\n\t"
  169923. #elif defined(__clang__)
  169924. "muls r6, r7\n\t"
  169925. #else
  169926. "mul r6, r7\n\t"
  169927. #endif
  169928. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169929. "lsrs r7, r6, #16\n\t"
  169930. #else
  169931. "lsr r7, r6, #16\n\t"
  169932. #endif
  169933. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169934. "lsls r6, r6, #16\n\t"
  169935. #else
  169936. "lsl r6, r6, #16\n\t"
  169937. #endif
  169938. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169939. "adds r4, r4, r6\n\t"
  169940. #else
  169941. "add r4, r4, r6\n\t"
  169942. #endif
  169943. #ifdef WOLFSSL_KEIL
  169944. "adcs r5, r5, r7\n\t"
  169945. #elif defined(__clang__)
  169946. "adcs r5, r7\n\t"
  169947. #else
  169948. "adc r5, r7\n\t"
  169949. #endif
  169950. #ifdef WOLFSSL_KEIL
  169951. "adcs r3, r3, %[r]\n\t"
  169952. #elif defined(__clang__)
  169953. "adcs r3, %[r]\n\t"
  169954. #else
  169955. "adc r3, %[r]\n\t"
  169956. #endif
  169957. "mov %[r], r8\n\t"
  169958. "str r4, [%[r], #112]\n\t"
  169959. "movs %[r], #0\n\t"
  169960. "# A[14] * B[15]\n\t"
  169961. "movs r4, #0\n\t"
  169962. "mov %[a], r9\n\t"
  169963. "mov %[b], r10\n\t"
  169964. "ldr %[a], [%[a], #56]\n\t"
  169965. "ldr %[b], [%[b], #60]\n\t"
  169966. "uxth r6, %[a]\n\t"
  169967. "uxth r7, %[b]\n\t"
  169968. #ifdef WOLFSSL_KEIL
  169969. "muls r7, r6, r7\n\t"
  169970. #elif defined(__clang__)
  169971. "muls r7, r6\n\t"
  169972. #else
  169973. "mul r7, r6\n\t"
  169974. #endif
  169975. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169976. "adds r5, r5, r7\n\t"
  169977. #else
  169978. "add r5, r5, r7\n\t"
  169979. #endif
  169980. #ifdef WOLFSSL_KEIL
  169981. "adcs r3, r3, %[r]\n\t"
  169982. #elif defined(__clang__)
  169983. "adcs r3, %[r]\n\t"
  169984. #else
  169985. "adc r3, %[r]\n\t"
  169986. #endif
  169987. #ifdef WOLFSSL_KEIL
  169988. "adcs r4, r4, %[r]\n\t"
  169989. #elif defined(__clang__)
  169990. "adcs r4, %[r]\n\t"
  169991. #else
  169992. "adc r4, %[r]\n\t"
  169993. #endif
  169994. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169995. "lsrs r7, %[b], #16\n\t"
  169996. #else
  169997. "lsr r7, %[b], #16\n\t"
  169998. #endif
  169999. #ifdef WOLFSSL_KEIL
  170000. "muls r6, r7, r6\n\t"
  170001. #elif defined(__clang__)
  170002. "muls r6, r7\n\t"
  170003. #else
  170004. "mul r6, r7\n\t"
  170005. #endif
  170006. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170007. "lsrs r7, r6, #16\n\t"
  170008. #else
  170009. "lsr r7, r6, #16\n\t"
  170010. #endif
  170011. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170012. "lsls r6, r6, #16\n\t"
  170013. #else
  170014. "lsl r6, r6, #16\n\t"
  170015. #endif
  170016. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170017. "adds r5, r5, r6\n\t"
  170018. #else
  170019. "add r5, r5, r6\n\t"
  170020. #endif
  170021. #ifdef WOLFSSL_KEIL
  170022. "adcs r3, r3, r7\n\t"
  170023. #elif defined(__clang__)
  170024. "adcs r3, r7\n\t"
  170025. #else
  170026. "adc r3, r7\n\t"
  170027. #endif
  170028. #ifdef WOLFSSL_KEIL
  170029. "adcs r4, r4, %[r]\n\t"
  170030. #elif defined(__clang__)
  170031. "adcs r4, %[r]\n\t"
  170032. #else
  170033. "adc r4, %[r]\n\t"
  170034. #endif
  170035. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170036. "lsrs r6, %[a], #16\n\t"
  170037. #else
  170038. "lsr r6, %[a], #16\n\t"
  170039. #endif
  170040. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170041. "lsrs r7, %[b], #16\n\t"
  170042. #else
  170043. "lsr r7, %[b], #16\n\t"
  170044. #endif
  170045. #ifdef WOLFSSL_KEIL
  170046. "muls r7, r6, r7\n\t"
  170047. #elif defined(__clang__)
  170048. "muls r7, r6\n\t"
  170049. #else
  170050. "mul r7, r6\n\t"
  170051. #endif
  170052. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170053. "adds r3, r3, r7\n\t"
  170054. #else
  170055. "add r3, r3, r7\n\t"
  170056. #endif
  170057. #ifdef WOLFSSL_KEIL
  170058. "adcs r4, r4, %[r]\n\t"
  170059. #elif defined(__clang__)
  170060. "adcs r4, %[r]\n\t"
  170061. #else
  170062. "adc r4, %[r]\n\t"
  170063. #endif
  170064. "uxth r7, %[b]\n\t"
  170065. #ifdef WOLFSSL_KEIL
  170066. "muls r6, r7, r6\n\t"
  170067. #elif defined(__clang__)
  170068. "muls r6, r7\n\t"
  170069. #else
  170070. "mul r6, r7\n\t"
  170071. #endif
  170072. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170073. "lsrs r7, r6, #16\n\t"
  170074. #else
  170075. "lsr r7, r6, #16\n\t"
  170076. #endif
  170077. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170078. "lsls r6, r6, #16\n\t"
  170079. #else
  170080. "lsl r6, r6, #16\n\t"
  170081. #endif
  170082. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170083. "adds r5, r5, r6\n\t"
  170084. #else
  170085. "add r5, r5, r6\n\t"
  170086. #endif
  170087. #ifdef WOLFSSL_KEIL
  170088. "adcs r3, r3, r7\n\t"
  170089. #elif defined(__clang__)
  170090. "adcs r3, r7\n\t"
  170091. #else
  170092. "adc r3, r7\n\t"
  170093. #endif
  170094. #ifdef WOLFSSL_KEIL
  170095. "adcs r4, r4, %[r]\n\t"
  170096. #elif defined(__clang__)
  170097. "adcs r4, %[r]\n\t"
  170098. #else
  170099. "adc r4, %[r]\n\t"
  170100. #endif
  170101. "# A[15] * B[14]\n\t"
  170102. "mov %[a], r9\n\t"
  170103. "mov %[b], r10\n\t"
  170104. "ldr %[a], [%[a], #60]\n\t"
  170105. "ldr %[b], [%[b], #56]\n\t"
  170106. "uxth r6, %[a]\n\t"
  170107. "uxth r7, %[b]\n\t"
  170108. #ifdef WOLFSSL_KEIL
  170109. "muls r7, r6, r7\n\t"
  170110. #elif defined(__clang__)
  170111. "muls r7, r6\n\t"
  170112. #else
  170113. "mul r7, r6\n\t"
  170114. #endif
  170115. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170116. "adds r5, r5, r7\n\t"
  170117. #else
  170118. "add r5, r5, r7\n\t"
  170119. #endif
  170120. #ifdef WOLFSSL_KEIL
  170121. "adcs r3, r3, %[r]\n\t"
  170122. #elif defined(__clang__)
  170123. "adcs r3, %[r]\n\t"
  170124. #else
  170125. "adc r3, %[r]\n\t"
  170126. #endif
  170127. #ifdef WOLFSSL_KEIL
  170128. "adcs r4, r4, %[r]\n\t"
  170129. #elif defined(__clang__)
  170130. "adcs r4, %[r]\n\t"
  170131. #else
  170132. "adc r4, %[r]\n\t"
  170133. #endif
  170134. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170135. "lsrs r7, %[b], #16\n\t"
  170136. #else
  170137. "lsr r7, %[b], #16\n\t"
  170138. #endif
  170139. #ifdef WOLFSSL_KEIL
  170140. "muls r6, r7, r6\n\t"
  170141. #elif defined(__clang__)
  170142. "muls r6, r7\n\t"
  170143. #else
  170144. "mul r6, r7\n\t"
  170145. #endif
  170146. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170147. "lsrs r7, r6, #16\n\t"
  170148. #else
  170149. "lsr r7, r6, #16\n\t"
  170150. #endif
  170151. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170152. "lsls r6, r6, #16\n\t"
  170153. #else
  170154. "lsl r6, r6, #16\n\t"
  170155. #endif
  170156. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170157. "adds r5, r5, r6\n\t"
  170158. #else
  170159. "add r5, r5, r6\n\t"
  170160. #endif
  170161. #ifdef WOLFSSL_KEIL
  170162. "adcs r3, r3, r7\n\t"
  170163. #elif defined(__clang__)
  170164. "adcs r3, r7\n\t"
  170165. #else
  170166. "adc r3, r7\n\t"
  170167. #endif
  170168. #ifdef WOLFSSL_KEIL
  170169. "adcs r4, r4, %[r]\n\t"
  170170. #elif defined(__clang__)
  170171. "adcs r4, %[r]\n\t"
  170172. #else
  170173. "adc r4, %[r]\n\t"
  170174. #endif
  170175. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170176. "lsrs r6, %[a], #16\n\t"
  170177. #else
  170178. "lsr r6, %[a], #16\n\t"
  170179. #endif
  170180. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170181. "lsrs r7, %[b], #16\n\t"
  170182. #else
  170183. "lsr r7, %[b], #16\n\t"
  170184. #endif
  170185. #ifdef WOLFSSL_KEIL
  170186. "muls r7, r6, r7\n\t"
  170187. #elif defined(__clang__)
  170188. "muls r7, r6\n\t"
  170189. #else
  170190. "mul r7, r6\n\t"
  170191. #endif
  170192. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170193. "adds r3, r3, r7\n\t"
  170194. #else
  170195. "add r3, r3, r7\n\t"
  170196. #endif
  170197. #ifdef WOLFSSL_KEIL
  170198. "adcs r4, r4, %[r]\n\t"
  170199. #elif defined(__clang__)
  170200. "adcs r4, %[r]\n\t"
  170201. #else
  170202. "adc r4, %[r]\n\t"
  170203. #endif
  170204. "uxth r7, %[b]\n\t"
  170205. #ifdef WOLFSSL_KEIL
  170206. "muls r6, r7, r6\n\t"
  170207. #elif defined(__clang__)
  170208. "muls r6, r7\n\t"
  170209. #else
  170210. "mul r6, r7\n\t"
  170211. #endif
  170212. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170213. "lsrs r7, r6, #16\n\t"
  170214. #else
  170215. "lsr r7, r6, #16\n\t"
  170216. #endif
  170217. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170218. "lsls r6, r6, #16\n\t"
  170219. #else
  170220. "lsl r6, r6, #16\n\t"
  170221. #endif
  170222. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170223. "adds r5, r5, r6\n\t"
  170224. #else
  170225. "add r5, r5, r6\n\t"
  170226. #endif
  170227. #ifdef WOLFSSL_KEIL
  170228. "adcs r3, r3, r7\n\t"
  170229. #elif defined(__clang__)
  170230. "adcs r3, r7\n\t"
  170231. #else
  170232. "adc r3, r7\n\t"
  170233. #endif
  170234. #ifdef WOLFSSL_KEIL
  170235. "adcs r4, r4, %[r]\n\t"
  170236. #elif defined(__clang__)
  170237. "adcs r4, %[r]\n\t"
  170238. #else
  170239. "adc r4, %[r]\n\t"
  170240. #endif
  170241. "mov %[r], r8\n\t"
  170242. "str r5, [%[r], #116]\n\t"
  170243. "movs %[r], #0\n\t"
  170244. "# A[15] * B[15]\n\t"
  170245. "mov %[a], r9\n\t"
  170246. "mov %[b], r10\n\t"
  170247. "ldr %[a], [%[a], #60]\n\t"
  170248. "ldr %[b], [%[b], #60]\n\t"
  170249. "uxth r6, %[a]\n\t"
  170250. "uxth r7, %[b]\n\t"
  170251. #ifdef WOLFSSL_KEIL
  170252. "muls r7, r6, r7\n\t"
  170253. #elif defined(__clang__)
  170254. "muls r7, r6\n\t"
  170255. #else
  170256. "mul r7, r6\n\t"
  170257. #endif
  170258. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170259. "adds r3, r3, r7\n\t"
  170260. #else
  170261. "add r3, r3, r7\n\t"
  170262. #endif
  170263. #ifdef WOLFSSL_KEIL
  170264. "adcs r4, r4, %[r]\n\t"
  170265. #elif defined(__clang__)
  170266. "adcs r4, %[r]\n\t"
  170267. #else
  170268. "adc r4, %[r]\n\t"
  170269. #endif
  170270. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170271. "lsrs r7, %[b], #16\n\t"
  170272. #else
  170273. "lsr r7, %[b], #16\n\t"
  170274. #endif
  170275. #ifdef WOLFSSL_KEIL
  170276. "muls r6, r7, r6\n\t"
  170277. #elif defined(__clang__)
  170278. "muls r6, r7\n\t"
  170279. #else
  170280. "mul r6, r7\n\t"
  170281. #endif
  170282. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170283. "lsrs r7, r6, #16\n\t"
  170284. #else
  170285. "lsr r7, r6, #16\n\t"
  170286. #endif
  170287. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170288. "lsls r6, r6, #16\n\t"
  170289. #else
  170290. "lsl r6, r6, #16\n\t"
  170291. #endif
  170292. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170293. "adds r3, r3, r6\n\t"
  170294. #else
  170295. "add r3, r3, r6\n\t"
  170296. #endif
  170297. #ifdef WOLFSSL_KEIL
  170298. "adcs r4, r4, r7\n\t"
  170299. #elif defined(__clang__)
  170300. "adcs r4, r7\n\t"
  170301. #else
  170302. "adc r4, r7\n\t"
  170303. #endif
  170304. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170305. "lsrs r6, %[a], #16\n\t"
  170306. #else
  170307. "lsr r6, %[a], #16\n\t"
  170308. #endif
  170309. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170310. "lsrs r7, %[b], #16\n\t"
  170311. #else
  170312. "lsr r7, %[b], #16\n\t"
  170313. #endif
  170314. #ifdef WOLFSSL_KEIL
  170315. "muls r7, r6, r7\n\t"
  170316. #elif defined(__clang__)
  170317. "muls r7, r6\n\t"
  170318. #else
  170319. "mul r7, r6\n\t"
  170320. #endif
  170321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170322. "adds r4, r4, r7\n\t"
  170323. #else
  170324. "add r4, r4, r7\n\t"
  170325. #endif
  170326. "uxth r7, %[b]\n\t"
  170327. #ifdef WOLFSSL_KEIL
  170328. "muls r6, r7, r6\n\t"
  170329. #elif defined(__clang__)
  170330. "muls r6, r7\n\t"
  170331. #else
  170332. "mul r6, r7\n\t"
  170333. #endif
  170334. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170335. "lsrs r7, r6, #16\n\t"
  170336. #else
  170337. "lsr r7, r6, #16\n\t"
  170338. #endif
  170339. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170340. "lsls r6, r6, #16\n\t"
  170341. #else
  170342. "lsl r6, r6, #16\n\t"
  170343. #endif
  170344. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170345. "adds r3, r3, r6\n\t"
  170346. #else
  170347. "add r3, r3, r6\n\t"
  170348. #endif
  170349. #ifdef WOLFSSL_KEIL
  170350. "adcs r4, r4, r7\n\t"
  170351. #elif defined(__clang__)
  170352. "adcs r4, r7\n\t"
  170353. #else
  170354. "adc r4, r7\n\t"
  170355. #endif
  170356. "mov %[r], r8\n\t"
  170357. "str r3, [%[r], #120]\n\t"
  170358. "str r4, [%[r], #124]\n\t"
  170359. "pop {r3, r4, r5, r6}\n\t"
  170360. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  170361. "pop {r3, r4, r5, r6}\n\t"
  170362. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  170363. "pop {r3, r4, r5, r6}\n\t"
  170364. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  170365. "pop {r3, r4, r5, r6}\n\t"
  170366. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  170367. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  170368. :
  170369. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10"
  170370. );
  170371. }
  170372. #endif /* !WOLFSSL_SP_LARGE_CODE */
  170373. #ifndef WOLFSSL_SP_LARGE_CODE
  170374. /* Square a and put result in r. (r = a * a)
  170375. *
  170376. * r A single precision integer.
  170377. * a A single precision integer.
  170378. */
  170379. SP_NOINLINE static void sp_1024_sqr_16(sp_digit* r, const sp_digit* a)
  170380. {
  170381. __asm__ __volatile__ (
  170382. "movs r3, #0\n\t"
  170383. "movs r4, #0\n\t"
  170384. "movs r5, #0\n\t"
  170385. "mov r8, r3\n\t"
  170386. "mov r11, %[r]\n\t"
  170387. "movs r6, #0x80\n\t"
  170388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170389. "negs r6, r6\n\t"
  170390. #else
  170391. "neg r6, r6\n\t"
  170392. #endif
  170393. "add sp, sp, r6\n\t"
  170394. "mov r10, sp\n\t"
  170395. "mov r9, %[a]\n\t"
  170396. "\n"
  170397. "L_sp_1024_sqr_16_words_%=:\n\t"
  170398. "movs %[r], #0\n\t"
  170399. "movs r6, #60\n\t"
  170400. "mov %[a], r8\n\t"
  170401. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170402. "subs %[a], %[a], r6\n\t"
  170403. #else
  170404. "sub %[a], %[a], r6\n\t"
  170405. #endif
  170406. #ifdef WOLFSSL_KEIL
  170407. "sbcs r6, r6, r6\n\t"
  170408. #elif defined(__clang__)
  170409. "sbcs r6, r6\n\t"
  170410. #else
  170411. "sbc r6, r6\n\t"
  170412. #endif
  170413. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170414. "mvns r6, r6\n\t"
  170415. #else
  170416. "mvn r6, r6\n\t"
  170417. #endif
  170418. #ifdef WOLFSSL_KEIL
  170419. "ands %[a], %[a], r6\n\t"
  170420. #elif defined(__clang__)
  170421. "ands %[a], r6\n\t"
  170422. #else
  170423. "and %[a], r6\n\t"
  170424. #endif
  170425. "mov r2, r8\n\t"
  170426. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170427. "subs r2, r2, %[a]\n\t"
  170428. #else
  170429. "sub r2, r2, %[a]\n\t"
  170430. #endif
  170431. "add %[a], %[a], r9\n\t"
  170432. "add r2, r2, r9\n\t"
  170433. "\n"
  170434. "L_sp_1024_sqr_16_mul_%=:\n\t"
  170435. "cmp r2, %[a]\n\t"
  170436. "beq L_sp_1024_sqr_16_sqr_%=\n\t"
  170437. "# Multiply * 2: Start\n\t"
  170438. "ldrh r6, [%[a]]\n\t"
  170439. "ldrh r7, [r2]\n\t"
  170440. #ifdef WOLFSSL_KEIL
  170441. "muls r7, r6, r7\n\t"
  170442. #elif defined(__clang__)
  170443. "muls r7, r6\n\t"
  170444. #else
  170445. "mul r7, r6\n\t"
  170446. #endif
  170447. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170448. "adds r3, r3, r7\n\t"
  170449. #else
  170450. "add r3, r3, r7\n\t"
  170451. #endif
  170452. #ifdef WOLFSSL_KEIL
  170453. "adcs r4, r4, %[r]\n\t"
  170454. #elif defined(__clang__)
  170455. "adcs r4, %[r]\n\t"
  170456. #else
  170457. "adc r4, %[r]\n\t"
  170458. #endif
  170459. #ifdef WOLFSSL_KEIL
  170460. "adcs r5, r5, %[r]\n\t"
  170461. #elif defined(__clang__)
  170462. "adcs r5, %[r]\n\t"
  170463. #else
  170464. "adc r5, %[r]\n\t"
  170465. #endif
  170466. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170467. "adds r3, r3, r7\n\t"
  170468. #else
  170469. "add r3, r3, r7\n\t"
  170470. #endif
  170471. #ifdef WOLFSSL_KEIL
  170472. "adcs r4, r4, %[r]\n\t"
  170473. #elif defined(__clang__)
  170474. "adcs r4, %[r]\n\t"
  170475. #else
  170476. "adc r4, %[r]\n\t"
  170477. #endif
  170478. #ifdef WOLFSSL_KEIL
  170479. "adcs r5, r5, %[r]\n\t"
  170480. #elif defined(__clang__)
  170481. "adcs r5, %[r]\n\t"
  170482. #else
  170483. "adc r5, %[r]\n\t"
  170484. #endif
  170485. "ldr r7, [r2]\n\t"
  170486. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170487. "lsrs r7, r7, #16\n\t"
  170488. #else
  170489. "lsr r7, r7, #16\n\t"
  170490. #endif
  170491. #ifdef WOLFSSL_KEIL
  170492. "muls r6, r7, r6\n\t"
  170493. #elif defined(__clang__)
  170494. "muls r6, r7\n\t"
  170495. #else
  170496. "mul r6, r7\n\t"
  170497. #endif
  170498. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170499. "lsrs r7, r6, #16\n\t"
  170500. #else
  170501. "lsr r7, r6, #16\n\t"
  170502. #endif
  170503. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170504. "lsls r6, r6, #16\n\t"
  170505. #else
  170506. "lsl r6, r6, #16\n\t"
  170507. #endif
  170508. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170509. "adds r3, r3, r6\n\t"
  170510. #else
  170511. "add r3, r3, r6\n\t"
  170512. #endif
  170513. #ifdef WOLFSSL_KEIL
  170514. "adcs r4, r4, r7\n\t"
  170515. #elif defined(__clang__)
  170516. "adcs r4, r7\n\t"
  170517. #else
  170518. "adc r4, r7\n\t"
  170519. #endif
  170520. #ifdef WOLFSSL_KEIL
  170521. "adcs r5, r5, %[r]\n\t"
  170522. #elif defined(__clang__)
  170523. "adcs r5, %[r]\n\t"
  170524. #else
  170525. "adc r5, %[r]\n\t"
  170526. #endif
  170527. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170528. "adds r3, r3, r6\n\t"
  170529. #else
  170530. "add r3, r3, r6\n\t"
  170531. #endif
  170532. #ifdef WOLFSSL_KEIL
  170533. "adcs r4, r4, r7\n\t"
  170534. #elif defined(__clang__)
  170535. "adcs r4, r7\n\t"
  170536. #else
  170537. "adc r4, r7\n\t"
  170538. #endif
  170539. #ifdef WOLFSSL_KEIL
  170540. "adcs r5, r5, %[r]\n\t"
  170541. #elif defined(__clang__)
  170542. "adcs r5, %[r]\n\t"
  170543. #else
  170544. "adc r5, %[r]\n\t"
  170545. #endif
  170546. "ldr r6, [%[a]]\n\t"
  170547. "ldr r7, [r2]\n\t"
  170548. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170549. "lsrs r6, r6, #16\n\t"
  170550. #else
  170551. "lsr r6, r6, #16\n\t"
  170552. #endif
  170553. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170554. "lsrs r7, r7, #16\n\t"
  170555. #else
  170556. "lsr r7, r7, #16\n\t"
  170557. #endif
  170558. #ifdef WOLFSSL_KEIL
  170559. "muls r7, r6, r7\n\t"
  170560. #elif defined(__clang__)
  170561. "muls r7, r6\n\t"
  170562. #else
  170563. "mul r7, r6\n\t"
  170564. #endif
  170565. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170566. "adds r4, r4, r7\n\t"
  170567. #else
  170568. "add r4, r4, r7\n\t"
  170569. #endif
  170570. #ifdef WOLFSSL_KEIL
  170571. "adcs r5, r5, %[r]\n\t"
  170572. #elif defined(__clang__)
  170573. "adcs r5, %[r]\n\t"
  170574. #else
  170575. "adc r5, %[r]\n\t"
  170576. #endif
  170577. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170578. "adds r4, r4, r7\n\t"
  170579. #else
  170580. "add r4, r4, r7\n\t"
  170581. #endif
  170582. #ifdef WOLFSSL_KEIL
  170583. "adcs r5, r5, %[r]\n\t"
  170584. #elif defined(__clang__)
  170585. "adcs r5, %[r]\n\t"
  170586. #else
  170587. "adc r5, %[r]\n\t"
  170588. #endif
  170589. "ldrh r7, [r2]\n\t"
  170590. #ifdef WOLFSSL_KEIL
  170591. "muls r6, r7, r6\n\t"
  170592. #elif defined(__clang__)
  170593. "muls r6, r7\n\t"
  170594. #else
  170595. "mul r6, r7\n\t"
  170596. #endif
  170597. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170598. "lsrs r7, r6, #16\n\t"
  170599. #else
  170600. "lsr r7, r6, #16\n\t"
  170601. #endif
  170602. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170603. "lsls r6, r6, #16\n\t"
  170604. #else
  170605. "lsl r6, r6, #16\n\t"
  170606. #endif
  170607. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170608. "adds r3, r3, r6\n\t"
  170609. #else
  170610. "add r3, r3, r6\n\t"
  170611. #endif
  170612. #ifdef WOLFSSL_KEIL
  170613. "adcs r4, r4, r7\n\t"
  170614. #elif defined(__clang__)
  170615. "adcs r4, r7\n\t"
  170616. #else
  170617. "adc r4, r7\n\t"
  170618. #endif
  170619. #ifdef WOLFSSL_KEIL
  170620. "adcs r5, r5, %[r]\n\t"
  170621. #elif defined(__clang__)
  170622. "adcs r5, %[r]\n\t"
  170623. #else
  170624. "adc r5, %[r]\n\t"
  170625. #endif
  170626. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170627. "adds r3, r3, r6\n\t"
  170628. #else
  170629. "add r3, r3, r6\n\t"
  170630. #endif
  170631. #ifdef WOLFSSL_KEIL
  170632. "adcs r4, r4, r7\n\t"
  170633. #elif defined(__clang__)
  170634. "adcs r4, r7\n\t"
  170635. #else
  170636. "adc r4, r7\n\t"
  170637. #endif
  170638. #ifdef WOLFSSL_KEIL
  170639. "adcs r5, r5, %[r]\n\t"
  170640. #elif defined(__clang__)
  170641. "adcs r5, %[r]\n\t"
  170642. #else
  170643. "adc r5, %[r]\n\t"
  170644. #endif
  170645. "# Multiply * 2: Done\n\t"
  170646. "bal L_sp_1024_sqr_16_done_sqr_%=\n\t"
  170647. "\n"
  170648. "L_sp_1024_sqr_16_sqr_%=:\n\t"
  170649. "mov r12, r2\n\t"
  170650. "ldr r2, [%[a]]\n\t"
  170651. "# Square: Start\n\t"
  170652. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170653. "lsrs r7, r2, #16\n\t"
  170654. #else
  170655. "lsr r7, r2, #16\n\t"
  170656. #endif
  170657. "uxth r6, r2\n\t"
  170658. #ifdef WOLFSSL_KEIL
  170659. "muls r6, r6, r6\n\t"
  170660. #elif defined(__clang__)
  170661. "muls r6, r6\n\t"
  170662. #else
  170663. "mul r6, r6\n\t"
  170664. #endif
  170665. #ifdef WOLFSSL_KEIL
  170666. "muls r7, r7, r7\n\t"
  170667. #elif defined(__clang__)
  170668. "muls r7, r7\n\t"
  170669. #else
  170670. "mul r7, r7\n\t"
  170671. #endif
  170672. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170673. "adds r3, r3, r6\n\t"
  170674. #else
  170675. "add r3, r3, r6\n\t"
  170676. #endif
  170677. #ifdef WOLFSSL_KEIL
  170678. "adcs r4, r4, r7\n\t"
  170679. #elif defined(__clang__)
  170680. "adcs r4, r7\n\t"
  170681. #else
  170682. "adc r4, r7\n\t"
  170683. #endif
  170684. #ifdef WOLFSSL_KEIL
  170685. "adcs r5, r5, %[r]\n\t"
  170686. #elif defined(__clang__)
  170687. "adcs r5, %[r]\n\t"
  170688. #else
  170689. "adc r5, %[r]\n\t"
  170690. #endif
  170691. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170692. "lsrs r7, r2, #16\n\t"
  170693. #else
  170694. "lsr r7, r2, #16\n\t"
  170695. #endif
  170696. "uxth r6, r2\n\t"
  170697. #ifdef WOLFSSL_KEIL
  170698. "muls r6, r7, r6\n\t"
  170699. #elif defined(__clang__)
  170700. "muls r6, r7\n\t"
  170701. #else
  170702. "mul r6, r7\n\t"
  170703. #endif
  170704. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170705. "lsrs r7, r6, #15\n\t"
  170706. #else
  170707. "lsr r7, r6, #15\n\t"
  170708. #endif
  170709. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170710. "lsls r6, r6, #17\n\t"
  170711. #else
  170712. "lsl r6, r6, #17\n\t"
  170713. #endif
  170714. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170715. "adds r3, r3, r6\n\t"
  170716. #else
  170717. "add r3, r3, r6\n\t"
  170718. #endif
  170719. #ifdef WOLFSSL_KEIL
  170720. "adcs r4, r4, r7\n\t"
  170721. #elif defined(__clang__)
  170722. "adcs r4, r7\n\t"
  170723. #else
  170724. "adc r4, r7\n\t"
  170725. #endif
  170726. #ifdef WOLFSSL_KEIL
  170727. "adcs r5, r5, %[r]\n\t"
  170728. #elif defined(__clang__)
  170729. "adcs r5, %[r]\n\t"
  170730. #else
  170731. "adc r5, %[r]\n\t"
  170732. #endif
  170733. "# Square: Done\n\t"
  170734. "mov r2, r12\n\t"
  170735. "\n"
  170736. "L_sp_1024_sqr_16_done_sqr_%=:\n\t"
  170737. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170738. "adds %[a], %[a], #4\n\t"
  170739. #else
  170740. "add %[a], %[a], #4\n\t"
  170741. #endif
  170742. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170743. "subs r2, r2, #4\n\t"
  170744. #else
  170745. "sub r2, r2, #4\n\t"
  170746. #endif
  170747. "movs r6, #0x40\n\t"
  170748. "add r6, r6, r9\n\t"
  170749. "cmp %[a], r6\n\t"
  170750. "beq L_sp_1024_sqr_16_done_mul_%=\n\t"
  170751. "cmp %[a], r2\n\t"
  170752. "bgt L_sp_1024_sqr_16_done_mul_%=\n\t"
  170753. "mov r7, r8\n\t"
  170754. "add r7, r7, r9\n\t"
  170755. "cmp %[a], r7\n\t"
  170756. "ble L_sp_1024_sqr_16_mul_%=\n\t"
  170757. "\n"
  170758. "L_sp_1024_sqr_16_done_mul_%=:\n\t"
  170759. "mov %[r], r10\n\t"
  170760. "mov r7, r8\n\t"
  170761. "str r3, [%[r], r7]\n\t"
  170762. "movs r3, r4\n\t"
  170763. "movs r4, r5\n\t"
  170764. "movs r5, #0\n\t"
  170765. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170766. "adds r7, r7, #4\n\t"
  170767. #else
  170768. "add r7, r7, #4\n\t"
  170769. #endif
  170770. "mov r8, r7\n\t"
  170771. "movs r6, #0x78\n\t"
  170772. "cmp r7, r6\n\t"
  170773. "ble L_sp_1024_sqr_16_words_%=\n\t"
  170774. "mov %[a], r9\n\t"
  170775. "str r3, [%[r], r7]\n\t"
  170776. "mov %[r], r11\n\t"
  170777. "mov %[a], r10\n\t"
  170778. "movs r3, #0x7c\n\t"
  170779. "\n"
  170780. "L_sp_1024_sqr_16_store_%=:\n\t"
  170781. "ldr r6, [%[a], r3]\n\t"
  170782. "str r6, [%[r], r3]\n\t"
  170783. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170784. "subs r3, r3, #4\n\t"
  170785. #else
  170786. "sub r3, r3, #4\n\t"
  170787. #endif
  170788. "bge L_sp_1024_sqr_16_store_%=\n\t"
  170789. "movs r6, #0x80\n\t"
  170790. "add sp, sp, r6\n\t"
  170791. : [r] "+l" (r), [a] "+l" (a)
  170792. :
  170793. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  170794. );
  170795. }
  170796. #else
  170797. /* Square a and put result in r. (r = a * a)
  170798. *
  170799. * r A single precision integer.
  170800. * a A single precision integer.
  170801. */
  170802. SP_NOINLINE static void sp_1024_sqr_16(sp_digit* r, const sp_digit* a)
  170803. {
  170804. __asm__ __volatile__ (
  170805. "sub sp, sp, #0x40\n\t"
  170806. "mov r8, %[r]\n\t"
  170807. "mov r9, %[a]\n\t"
  170808. "movs %[r], #0\n\t"
  170809. "ldm %[a]!, {r2, r3, r4, r5}\n\t"
  170810. "mov r10, r2\n\t"
  170811. "mov r11, r3\n\t"
  170812. "mov r12, r4\n\t"
  170813. "mov lr, r5\n\t"
  170814. "mov %[a], r9\n\t"
  170815. "# A[0] * A[0]\n\t"
  170816. "movs r4, #0\n\t"
  170817. "mov r7, r10\n\t"
  170818. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170819. "lsrs r6, r7, #16\n\t"
  170820. #else
  170821. "lsr r6, r7, #16\n\t"
  170822. #endif
  170823. "uxth r5, r7\n\t"
  170824. "movs r2, r5\n\t"
  170825. "movs r3, r6\n\t"
  170826. #ifdef WOLFSSL_KEIL
  170827. "muls r2, r2, r2\n\t"
  170828. #elif defined(__clang__)
  170829. "muls r2, r2\n\t"
  170830. #else
  170831. "mul r2, r2\n\t"
  170832. #endif
  170833. #ifdef WOLFSSL_KEIL
  170834. "muls r3, r3, r3\n\t"
  170835. #elif defined(__clang__)
  170836. "muls r3, r3\n\t"
  170837. #else
  170838. "mul r3, r3\n\t"
  170839. #endif
  170840. #ifdef WOLFSSL_KEIL
  170841. "muls r5, r6, r5\n\t"
  170842. #elif defined(__clang__)
  170843. "muls r5, r6\n\t"
  170844. #else
  170845. "mul r5, r6\n\t"
  170846. #endif
  170847. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170848. "lsrs r6, r5, #15\n\t"
  170849. #else
  170850. "lsr r6, r5, #15\n\t"
  170851. #endif
  170852. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170853. "lsls r5, r5, #17\n\t"
  170854. #else
  170855. "lsl r5, r5, #17\n\t"
  170856. #endif
  170857. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170858. "adds r2, r2, r5\n\t"
  170859. #else
  170860. "add r2, r2, r5\n\t"
  170861. #endif
  170862. #ifdef WOLFSSL_KEIL
  170863. "adcs r3, r3, r6\n\t"
  170864. #elif defined(__clang__)
  170865. "adcs r3, r6\n\t"
  170866. #else
  170867. "adc r3, r6\n\t"
  170868. #endif
  170869. "str r2, [sp]\n\t"
  170870. "# A[1] * A[0]\n\t"
  170871. "movs r2, #0\n\t"
  170872. "mov %[a], r11\n\t"
  170873. "uxth r5, %[a]\n\t"
  170874. "uxth r6, r7\n\t"
  170875. #ifdef WOLFSSL_KEIL
  170876. "muls r6, r5, r6\n\t"
  170877. #elif defined(__clang__)
  170878. "muls r6, r5\n\t"
  170879. #else
  170880. "mul r6, r5\n\t"
  170881. #endif
  170882. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170883. "adds r3, r3, r6\n\t"
  170884. #else
  170885. "add r3, r3, r6\n\t"
  170886. #endif
  170887. #ifdef WOLFSSL_KEIL
  170888. "adcs r4, r4, %[r]\n\t"
  170889. #elif defined(__clang__)
  170890. "adcs r4, %[r]\n\t"
  170891. #else
  170892. "adc r4, %[r]\n\t"
  170893. #endif
  170894. #ifdef WOLFSSL_KEIL
  170895. "adcs r2, r2, %[r]\n\t"
  170896. #elif defined(__clang__)
  170897. "adcs r2, %[r]\n\t"
  170898. #else
  170899. "adc r2, %[r]\n\t"
  170900. #endif
  170901. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170902. "adds r3, r3, r6\n\t"
  170903. #else
  170904. "add r3, r3, r6\n\t"
  170905. #endif
  170906. #ifdef WOLFSSL_KEIL
  170907. "adcs r4, r4, %[r]\n\t"
  170908. #elif defined(__clang__)
  170909. "adcs r4, %[r]\n\t"
  170910. #else
  170911. "adc r4, %[r]\n\t"
  170912. #endif
  170913. #ifdef WOLFSSL_KEIL
  170914. "adcs r2, r2, %[r]\n\t"
  170915. #elif defined(__clang__)
  170916. "adcs r2, %[r]\n\t"
  170917. #else
  170918. "adc r2, %[r]\n\t"
  170919. #endif
  170920. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170921. "lsrs r6, r7, #16\n\t"
  170922. #else
  170923. "lsr r6, r7, #16\n\t"
  170924. #endif
  170925. #ifdef WOLFSSL_KEIL
  170926. "muls r5, r6, r5\n\t"
  170927. #elif defined(__clang__)
  170928. "muls r5, r6\n\t"
  170929. #else
  170930. "mul r5, r6\n\t"
  170931. #endif
  170932. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170933. "lsrs r6, r5, #16\n\t"
  170934. #else
  170935. "lsr r6, r5, #16\n\t"
  170936. #endif
  170937. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170938. "lsls r5, r5, #16\n\t"
  170939. #else
  170940. "lsl r5, r5, #16\n\t"
  170941. #endif
  170942. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170943. "adds r3, r3, r5\n\t"
  170944. #else
  170945. "add r3, r3, r5\n\t"
  170946. #endif
  170947. #ifdef WOLFSSL_KEIL
  170948. "adcs r4, r4, r6\n\t"
  170949. #elif defined(__clang__)
  170950. "adcs r4, r6\n\t"
  170951. #else
  170952. "adc r4, r6\n\t"
  170953. #endif
  170954. #ifdef WOLFSSL_KEIL
  170955. "adcs r2, r2, %[r]\n\t"
  170956. #elif defined(__clang__)
  170957. "adcs r2, %[r]\n\t"
  170958. #else
  170959. "adc r2, %[r]\n\t"
  170960. #endif
  170961. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170962. "adds r3, r3, r5\n\t"
  170963. #else
  170964. "add r3, r3, r5\n\t"
  170965. #endif
  170966. #ifdef WOLFSSL_KEIL
  170967. "adcs r4, r4, r6\n\t"
  170968. #elif defined(__clang__)
  170969. "adcs r4, r6\n\t"
  170970. #else
  170971. "adc r4, r6\n\t"
  170972. #endif
  170973. #ifdef WOLFSSL_KEIL
  170974. "adcs r2, r2, %[r]\n\t"
  170975. #elif defined(__clang__)
  170976. "adcs r2, %[r]\n\t"
  170977. #else
  170978. "adc r2, %[r]\n\t"
  170979. #endif
  170980. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170981. "lsrs r5, %[a], #16\n\t"
  170982. #else
  170983. "lsr r5, %[a], #16\n\t"
  170984. #endif
  170985. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170986. "lsrs r6, r7, #16\n\t"
  170987. #else
  170988. "lsr r6, r7, #16\n\t"
  170989. #endif
  170990. #ifdef WOLFSSL_KEIL
  170991. "muls r6, r5, r6\n\t"
  170992. #elif defined(__clang__)
  170993. "muls r6, r5\n\t"
  170994. #else
  170995. "mul r6, r5\n\t"
  170996. #endif
  170997. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170998. "adds r4, r4, r6\n\t"
  170999. #else
  171000. "add r4, r4, r6\n\t"
  171001. #endif
  171002. #ifdef WOLFSSL_KEIL
  171003. "adcs r2, r2, %[r]\n\t"
  171004. #elif defined(__clang__)
  171005. "adcs r2, %[r]\n\t"
  171006. #else
  171007. "adc r2, %[r]\n\t"
  171008. #endif
  171009. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171010. "adds r4, r4, r6\n\t"
  171011. #else
  171012. "add r4, r4, r6\n\t"
  171013. #endif
  171014. #ifdef WOLFSSL_KEIL
  171015. "adcs r2, r2, %[r]\n\t"
  171016. #elif defined(__clang__)
  171017. "adcs r2, %[r]\n\t"
  171018. #else
  171019. "adc r2, %[r]\n\t"
  171020. #endif
  171021. "uxth r6, r7\n\t"
  171022. #ifdef WOLFSSL_KEIL
  171023. "muls r5, r6, r5\n\t"
  171024. #elif defined(__clang__)
  171025. "muls r5, r6\n\t"
  171026. #else
  171027. "mul r5, r6\n\t"
  171028. #endif
  171029. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171030. "lsrs r6, r5, #16\n\t"
  171031. #else
  171032. "lsr r6, r5, #16\n\t"
  171033. #endif
  171034. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171035. "lsls r5, r5, #16\n\t"
  171036. #else
  171037. "lsl r5, r5, #16\n\t"
  171038. #endif
  171039. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171040. "adds r3, r3, r5\n\t"
  171041. #else
  171042. "add r3, r3, r5\n\t"
  171043. #endif
  171044. #ifdef WOLFSSL_KEIL
  171045. "adcs r4, r4, r6\n\t"
  171046. #elif defined(__clang__)
  171047. "adcs r4, r6\n\t"
  171048. #else
  171049. "adc r4, r6\n\t"
  171050. #endif
  171051. #ifdef WOLFSSL_KEIL
  171052. "adcs r2, r2, %[r]\n\t"
  171053. #elif defined(__clang__)
  171054. "adcs r2, %[r]\n\t"
  171055. #else
  171056. "adc r2, %[r]\n\t"
  171057. #endif
  171058. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171059. "adds r3, r3, r5\n\t"
  171060. #else
  171061. "add r3, r3, r5\n\t"
  171062. #endif
  171063. #ifdef WOLFSSL_KEIL
  171064. "adcs r4, r4, r6\n\t"
  171065. #elif defined(__clang__)
  171066. "adcs r4, r6\n\t"
  171067. #else
  171068. "adc r4, r6\n\t"
  171069. #endif
  171070. #ifdef WOLFSSL_KEIL
  171071. "adcs r2, r2, %[r]\n\t"
  171072. #elif defined(__clang__)
  171073. "adcs r2, %[r]\n\t"
  171074. #else
  171075. "adc r2, %[r]\n\t"
  171076. #endif
  171077. "str r3, [sp, #4]\n\t"
  171078. "# A[2] * A[0]\n\t"
  171079. "movs r3, #0\n\t"
  171080. "mov %[a], r9\n\t"
  171081. "mov %[a], r12\n\t"
  171082. "uxth r5, %[a]\n\t"
  171083. "uxth r6, r7\n\t"
  171084. #ifdef WOLFSSL_KEIL
  171085. "muls r6, r5, r6\n\t"
  171086. #elif defined(__clang__)
  171087. "muls r6, r5\n\t"
  171088. #else
  171089. "mul r6, r5\n\t"
  171090. #endif
  171091. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171092. "adds r4, r4, r6\n\t"
  171093. #else
  171094. "add r4, r4, r6\n\t"
  171095. #endif
  171096. #ifdef WOLFSSL_KEIL
  171097. "adcs r2, r2, %[r]\n\t"
  171098. #elif defined(__clang__)
  171099. "adcs r2, %[r]\n\t"
  171100. #else
  171101. "adc r2, %[r]\n\t"
  171102. #endif
  171103. #ifdef WOLFSSL_KEIL
  171104. "adcs r3, r3, %[r]\n\t"
  171105. #elif defined(__clang__)
  171106. "adcs r3, %[r]\n\t"
  171107. #else
  171108. "adc r3, %[r]\n\t"
  171109. #endif
  171110. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171111. "adds r4, r4, r6\n\t"
  171112. #else
  171113. "add r4, r4, r6\n\t"
  171114. #endif
  171115. #ifdef WOLFSSL_KEIL
  171116. "adcs r2, r2, %[r]\n\t"
  171117. #elif defined(__clang__)
  171118. "adcs r2, %[r]\n\t"
  171119. #else
  171120. "adc r2, %[r]\n\t"
  171121. #endif
  171122. #ifdef WOLFSSL_KEIL
  171123. "adcs r3, r3, %[r]\n\t"
  171124. #elif defined(__clang__)
  171125. "adcs r3, %[r]\n\t"
  171126. #else
  171127. "adc r3, %[r]\n\t"
  171128. #endif
  171129. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171130. "lsrs r6, r7, #16\n\t"
  171131. #else
  171132. "lsr r6, r7, #16\n\t"
  171133. #endif
  171134. #ifdef WOLFSSL_KEIL
  171135. "muls r5, r6, r5\n\t"
  171136. #elif defined(__clang__)
  171137. "muls r5, r6\n\t"
  171138. #else
  171139. "mul r5, r6\n\t"
  171140. #endif
  171141. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171142. "lsrs r6, r5, #16\n\t"
  171143. #else
  171144. "lsr r6, r5, #16\n\t"
  171145. #endif
  171146. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171147. "lsls r5, r5, #16\n\t"
  171148. #else
  171149. "lsl r5, r5, #16\n\t"
  171150. #endif
  171151. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171152. "adds r4, r4, r5\n\t"
  171153. #else
  171154. "add r4, r4, r5\n\t"
  171155. #endif
  171156. #ifdef WOLFSSL_KEIL
  171157. "adcs r2, r2, r6\n\t"
  171158. #elif defined(__clang__)
  171159. "adcs r2, r6\n\t"
  171160. #else
  171161. "adc r2, r6\n\t"
  171162. #endif
  171163. #ifdef WOLFSSL_KEIL
  171164. "adcs r3, r3, %[r]\n\t"
  171165. #elif defined(__clang__)
  171166. "adcs r3, %[r]\n\t"
  171167. #else
  171168. "adc r3, %[r]\n\t"
  171169. #endif
  171170. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171171. "adds r4, r4, r5\n\t"
  171172. #else
  171173. "add r4, r4, r5\n\t"
  171174. #endif
  171175. #ifdef WOLFSSL_KEIL
  171176. "adcs r2, r2, r6\n\t"
  171177. #elif defined(__clang__)
  171178. "adcs r2, r6\n\t"
  171179. #else
  171180. "adc r2, r6\n\t"
  171181. #endif
  171182. #ifdef WOLFSSL_KEIL
  171183. "adcs r3, r3, %[r]\n\t"
  171184. #elif defined(__clang__)
  171185. "adcs r3, %[r]\n\t"
  171186. #else
  171187. "adc r3, %[r]\n\t"
  171188. #endif
  171189. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171190. "lsrs r5, %[a], #16\n\t"
  171191. #else
  171192. "lsr r5, %[a], #16\n\t"
  171193. #endif
  171194. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171195. "lsrs r6, r7, #16\n\t"
  171196. #else
  171197. "lsr r6, r7, #16\n\t"
  171198. #endif
  171199. #ifdef WOLFSSL_KEIL
  171200. "muls r6, r5, r6\n\t"
  171201. #elif defined(__clang__)
  171202. "muls r6, r5\n\t"
  171203. #else
  171204. "mul r6, r5\n\t"
  171205. #endif
  171206. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171207. "adds r2, r2, r6\n\t"
  171208. #else
  171209. "add r2, r2, r6\n\t"
  171210. #endif
  171211. #ifdef WOLFSSL_KEIL
  171212. "adcs r3, r3, %[r]\n\t"
  171213. #elif defined(__clang__)
  171214. "adcs r3, %[r]\n\t"
  171215. #else
  171216. "adc r3, %[r]\n\t"
  171217. #endif
  171218. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171219. "adds r2, r2, r6\n\t"
  171220. #else
  171221. "add r2, r2, r6\n\t"
  171222. #endif
  171223. #ifdef WOLFSSL_KEIL
  171224. "adcs r3, r3, %[r]\n\t"
  171225. #elif defined(__clang__)
  171226. "adcs r3, %[r]\n\t"
  171227. #else
  171228. "adc r3, %[r]\n\t"
  171229. #endif
  171230. "uxth r6, r7\n\t"
  171231. #ifdef WOLFSSL_KEIL
  171232. "muls r5, r6, r5\n\t"
  171233. #elif defined(__clang__)
  171234. "muls r5, r6\n\t"
  171235. #else
  171236. "mul r5, r6\n\t"
  171237. #endif
  171238. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171239. "lsrs r6, r5, #16\n\t"
  171240. #else
  171241. "lsr r6, r5, #16\n\t"
  171242. #endif
  171243. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171244. "lsls r5, r5, #16\n\t"
  171245. #else
  171246. "lsl r5, r5, #16\n\t"
  171247. #endif
  171248. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171249. "adds r4, r4, r5\n\t"
  171250. #else
  171251. "add r4, r4, r5\n\t"
  171252. #endif
  171253. #ifdef WOLFSSL_KEIL
  171254. "adcs r2, r2, r6\n\t"
  171255. #elif defined(__clang__)
  171256. "adcs r2, r6\n\t"
  171257. #else
  171258. "adc r2, r6\n\t"
  171259. #endif
  171260. #ifdef WOLFSSL_KEIL
  171261. "adcs r3, r3, %[r]\n\t"
  171262. #elif defined(__clang__)
  171263. "adcs r3, %[r]\n\t"
  171264. #else
  171265. "adc r3, %[r]\n\t"
  171266. #endif
  171267. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171268. "adds r4, r4, r5\n\t"
  171269. #else
  171270. "add r4, r4, r5\n\t"
  171271. #endif
  171272. #ifdef WOLFSSL_KEIL
  171273. "adcs r2, r2, r6\n\t"
  171274. #elif defined(__clang__)
  171275. "adcs r2, r6\n\t"
  171276. #else
  171277. "adc r2, r6\n\t"
  171278. #endif
  171279. #ifdef WOLFSSL_KEIL
  171280. "adcs r3, r3, %[r]\n\t"
  171281. #elif defined(__clang__)
  171282. "adcs r3, %[r]\n\t"
  171283. #else
  171284. "adc r3, %[r]\n\t"
  171285. #endif
  171286. "# A[1] * A[1]\n\t"
  171287. "mov r7, r11\n\t"
  171288. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171289. "lsrs r6, r7, #16\n\t"
  171290. #else
  171291. "lsr r6, r7, #16\n\t"
  171292. #endif
  171293. "uxth r5, r7\n\t"
  171294. #ifdef WOLFSSL_KEIL
  171295. "muls r5, r5, r5\n\t"
  171296. #elif defined(__clang__)
  171297. "muls r5, r5\n\t"
  171298. #else
  171299. "mul r5, r5\n\t"
  171300. #endif
  171301. #ifdef WOLFSSL_KEIL
  171302. "muls r6, r6, r6\n\t"
  171303. #elif defined(__clang__)
  171304. "muls r6, r6\n\t"
  171305. #else
  171306. "mul r6, r6\n\t"
  171307. #endif
  171308. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171309. "adds r4, r4, r5\n\t"
  171310. #else
  171311. "add r4, r4, r5\n\t"
  171312. #endif
  171313. #ifdef WOLFSSL_KEIL
  171314. "adcs r2, r2, r6\n\t"
  171315. #elif defined(__clang__)
  171316. "adcs r2, r6\n\t"
  171317. #else
  171318. "adc r2, r6\n\t"
  171319. #endif
  171320. #ifdef WOLFSSL_KEIL
  171321. "adcs r3, r3, %[r]\n\t"
  171322. #elif defined(__clang__)
  171323. "adcs r3, %[r]\n\t"
  171324. #else
  171325. "adc r3, %[r]\n\t"
  171326. #endif
  171327. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171328. "lsrs r6, r7, #16\n\t"
  171329. #else
  171330. "lsr r6, r7, #16\n\t"
  171331. #endif
  171332. "uxth r5, r7\n\t"
  171333. #ifdef WOLFSSL_KEIL
  171334. "muls r5, r6, r5\n\t"
  171335. #elif defined(__clang__)
  171336. "muls r5, r6\n\t"
  171337. #else
  171338. "mul r5, r6\n\t"
  171339. #endif
  171340. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171341. "lsrs r6, r5, #15\n\t"
  171342. #else
  171343. "lsr r6, r5, #15\n\t"
  171344. #endif
  171345. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171346. "lsls r5, r5, #17\n\t"
  171347. #else
  171348. "lsl r5, r5, #17\n\t"
  171349. #endif
  171350. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171351. "adds r4, r4, r5\n\t"
  171352. #else
  171353. "add r4, r4, r5\n\t"
  171354. #endif
  171355. #ifdef WOLFSSL_KEIL
  171356. "adcs r2, r2, r6\n\t"
  171357. #elif defined(__clang__)
  171358. "adcs r2, r6\n\t"
  171359. #else
  171360. "adc r2, r6\n\t"
  171361. #endif
  171362. #ifdef WOLFSSL_KEIL
  171363. "adcs r3, r3, %[r]\n\t"
  171364. #elif defined(__clang__)
  171365. "adcs r3, %[r]\n\t"
  171366. #else
  171367. "adc r3, %[r]\n\t"
  171368. #endif
  171369. "str r4, [sp, #8]\n\t"
  171370. "# A[2] * A[1]\n\t"
  171371. "movs r4, #0\n\t"
  171372. "mov %[a], r9\n\t"
  171373. "mov %[a], r12\n\t"
  171374. "uxth r5, %[a]\n\t"
  171375. "uxth r6, r7\n\t"
  171376. #ifdef WOLFSSL_KEIL
  171377. "muls r6, r5, r6\n\t"
  171378. #elif defined(__clang__)
  171379. "muls r6, r5\n\t"
  171380. #else
  171381. "mul r6, r5\n\t"
  171382. #endif
  171383. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171384. "adds r2, r2, r6\n\t"
  171385. #else
  171386. "add r2, r2, r6\n\t"
  171387. #endif
  171388. #ifdef WOLFSSL_KEIL
  171389. "adcs r3, r3, %[r]\n\t"
  171390. #elif defined(__clang__)
  171391. "adcs r3, %[r]\n\t"
  171392. #else
  171393. "adc r3, %[r]\n\t"
  171394. #endif
  171395. #ifdef WOLFSSL_KEIL
  171396. "adcs r4, r4, %[r]\n\t"
  171397. #elif defined(__clang__)
  171398. "adcs r4, %[r]\n\t"
  171399. #else
  171400. "adc r4, %[r]\n\t"
  171401. #endif
  171402. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171403. "adds r2, r2, r6\n\t"
  171404. #else
  171405. "add r2, r2, r6\n\t"
  171406. #endif
  171407. #ifdef WOLFSSL_KEIL
  171408. "adcs r3, r3, %[r]\n\t"
  171409. #elif defined(__clang__)
  171410. "adcs r3, %[r]\n\t"
  171411. #else
  171412. "adc r3, %[r]\n\t"
  171413. #endif
  171414. #ifdef WOLFSSL_KEIL
  171415. "adcs r4, r4, %[r]\n\t"
  171416. #elif defined(__clang__)
  171417. "adcs r4, %[r]\n\t"
  171418. #else
  171419. "adc r4, %[r]\n\t"
  171420. #endif
  171421. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171422. "lsrs r6, r7, #16\n\t"
  171423. #else
  171424. "lsr r6, r7, #16\n\t"
  171425. #endif
  171426. #ifdef WOLFSSL_KEIL
  171427. "muls r5, r6, r5\n\t"
  171428. #elif defined(__clang__)
  171429. "muls r5, r6\n\t"
  171430. #else
  171431. "mul r5, r6\n\t"
  171432. #endif
  171433. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171434. "lsrs r6, r5, #16\n\t"
  171435. #else
  171436. "lsr r6, r5, #16\n\t"
  171437. #endif
  171438. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171439. "lsls r5, r5, #16\n\t"
  171440. #else
  171441. "lsl r5, r5, #16\n\t"
  171442. #endif
  171443. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171444. "adds r2, r2, r5\n\t"
  171445. #else
  171446. "add r2, r2, r5\n\t"
  171447. #endif
  171448. #ifdef WOLFSSL_KEIL
  171449. "adcs r3, r3, r6\n\t"
  171450. #elif defined(__clang__)
  171451. "adcs r3, r6\n\t"
  171452. #else
  171453. "adc r3, r6\n\t"
  171454. #endif
  171455. #ifdef WOLFSSL_KEIL
  171456. "adcs r4, r4, %[r]\n\t"
  171457. #elif defined(__clang__)
  171458. "adcs r4, %[r]\n\t"
  171459. #else
  171460. "adc r4, %[r]\n\t"
  171461. #endif
  171462. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171463. "adds r2, r2, r5\n\t"
  171464. #else
  171465. "add r2, r2, r5\n\t"
  171466. #endif
  171467. #ifdef WOLFSSL_KEIL
  171468. "adcs r3, r3, r6\n\t"
  171469. #elif defined(__clang__)
  171470. "adcs r3, r6\n\t"
  171471. #else
  171472. "adc r3, r6\n\t"
  171473. #endif
  171474. #ifdef WOLFSSL_KEIL
  171475. "adcs r4, r4, %[r]\n\t"
  171476. #elif defined(__clang__)
  171477. "adcs r4, %[r]\n\t"
  171478. #else
  171479. "adc r4, %[r]\n\t"
  171480. #endif
  171481. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171482. "lsrs r5, %[a], #16\n\t"
  171483. #else
  171484. "lsr r5, %[a], #16\n\t"
  171485. #endif
  171486. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171487. "lsrs r6, r7, #16\n\t"
  171488. #else
  171489. "lsr r6, r7, #16\n\t"
  171490. #endif
  171491. #ifdef WOLFSSL_KEIL
  171492. "muls r6, r5, r6\n\t"
  171493. #elif defined(__clang__)
  171494. "muls r6, r5\n\t"
  171495. #else
  171496. "mul r6, r5\n\t"
  171497. #endif
  171498. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171499. "adds r3, r3, r6\n\t"
  171500. #else
  171501. "add r3, r3, r6\n\t"
  171502. #endif
  171503. #ifdef WOLFSSL_KEIL
  171504. "adcs r4, r4, %[r]\n\t"
  171505. #elif defined(__clang__)
  171506. "adcs r4, %[r]\n\t"
  171507. #else
  171508. "adc r4, %[r]\n\t"
  171509. #endif
  171510. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171511. "adds r3, r3, r6\n\t"
  171512. #else
  171513. "add r3, r3, r6\n\t"
  171514. #endif
  171515. #ifdef WOLFSSL_KEIL
  171516. "adcs r4, r4, %[r]\n\t"
  171517. #elif defined(__clang__)
  171518. "adcs r4, %[r]\n\t"
  171519. #else
  171520. "adc r4, %[r]\n\t"
  171521. #endif
  171522. "uxth r6, r7\n\t"
  171523. #ifdef WOLFSSL_KEIL
  171524. "muls r5, r6, r5\n\t"
  171525. #elif defined(__clang__)
  171526. "muls r5, r6\n\t"
  171527. #else
  171528. "mul r5, r6\n\t"
  171529. #endif
  171530. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171531. "lsrs r6, r5, #16\n\t"
  171532. #else
  171533. "lsr r6, r5, #16\n\t"
  171534. #endif
  171535. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171536. "lsls r5, r5, #16\n\t"
  171537. #else
  171538. "lsl r5, r5, #16\n\t"
  171539. #endif
  171540. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171541. "adds r2, r2, r5\n\t"
  171542. #else
  171543. "add r2, r2, r5\n\t"
  171544. #endif
  171545. #ifdef WOLFSSL_KEIL
  171546. "adcs r3, r3, r6\n\t"
  171547. #elif defined(__clang__)
  171548. "adcs r3, r6\n\t"
  171549. #else
  171550. "adc r3, r6\n\t"
  171551. #endif
  171552. #ifdef WOLFSSL_KEIL
  171553. "adcs r4, r4, %[r]\n\t"
  171554. #elif defined(__clang__)
  171555. "adcs r4, %[r]\n\t"
  171556. #else
  171557. "adc r4, %[r]\n\t"
  171558. #endif
  171559. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171560. "adds r2, r2, r5\n\t"
  171561. #else
  171562. "add r2, r2, r5\n\t"
  171563. #endif
  171564. #ifdef WOLFSSL_KEIL
  171565. "adcs r3, r3, r6\n\t"
  171566. #elif defined(__clang__)
  171567. "adcs r3, r6\n\t"
  171568. #else
  171569. "adc r3, r6\n\t"
  171570. #endif
  171571. #ifdef WOLFSSL_KEIL
  171572. "adcs r4, r4, %[r]\n\t"
  171573. #elif defined(__clang__)
  171574. "adcs r4, %[r]\n\t"
  171575. #else
  171576. "adc r4, %[r]\n\t"
  171577. #endif
  171578. "# A[3] * A[0]\n\t"
  171579. "mov %[a], r9\n\t"
  171580. "mov r7, r10\n\t"
  171581. "mov %[a], lr\n\t"
  171582. "uxth r5, %[a]\n\t"
  171583. "uxth r6, r7\n\t"
  171584. #ifdef WOLFSSL_KEIL
  171585. "muls r6, r5, r6\n\t"
  171586. #elif defined(__clang__)
  171587. "muls r6, r5\n\t"
  171588. #else
  171589. "mul r6, r5\n\t"
  171590. #endif
  171591. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171592. "adds r2, r2, r6\n\t"
  171593. #else
  171594. "add r2, r2, r6\n\t"
  171595. #endif
  171596. #ifdef WOLFSSL_KEIL
  171597. "adcs r3, r3, %[r]\n\t"
  171598. #elif defined(__clang__)
  171599. "adcs r3, %[r]\n\t"
  171600. #else
  171601. "adc r3, %[r]\n\t"
  171602. #endif
  171603. #ifdef WOLFSSL_KEIL
  171604. "adcs r4, r4, %[r]\n\t"
  171605. #elif defined(__clang__)
  171606. "adcs r4, %[r]\n\t"
  171607. #else
  171608. "adc r4, %[r]\n\t"
  171609. #endif
  171610. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171611. "adds r2, r2, r6\n\t"
  171612. #else
  171613. "add r2, r2, r6\n\t"
  171614. #endif
  171615. #ifdef WOLFSSL_KEIL
  171616. "adcs r3, r3, %[r]\n\t"
  171617. #elif defined(__clang__)
  171618. "adcs r3, %[r]\n\t"
  171619. #else
  171620. "adc r3, %[r]\n\t"
  171621. #endif
  171622. #ifdef WOLFSSL_KEIL
  171623. "adcs r4, r4, %[r]\n\t"
  171624. #elif defined(__clang__)
  171625. "adcs r4, %[r]\n\t"
  171626. #else
  171627. "adc r4, %[r]\n\t"
  171628. #endif
  171629. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171630. "lsrs r6, r7, #16\n\t"
  171631. #else
  171632. "lsr r6, r7, #16\n\t"
  171633. #endif
  171634. #ifdef WOLFSSL_KEIL
  171635. "muls r5, r6, r5\n\t"
  171636. #elif defined(__clang__)
  171637. "muls r5, r6\n\t"
  171638. #else
  171639. "mul r5, r6\n\t"
  171640. #endif
  171641. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171642. "lsrs r6, r5, #16\n\t"
  171643. #else
  171644. "lsr r6, r5, #16\n\t"
  171645. #endif
  171646. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171647. "lsls r5, r5, #16\n\t"
  171648. #else
  171649. "lsl r5, r5, #16\n\t"
  171650. #endif
  171651. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171652. "adds r2, r2, r5\n\t"
  171653. #else
  171654. "add r2, r2, r5\n\t"
  171655. #endif
  171656. #ifdef WOLFSSL_KEIL
  171657. "adcs r3, r3, r6\n\t"
  171658. #elif defined(__clang__)
  171659. "adcs r3, r6\n\t"
  171660. #else
  171661. "adc r3, r6\n\t"
  171662. #endif
  171663. #ifdef WOLFSSL_KEIL
  171664. "adcs r4, r4, %[r]\n\t"
  171665. #elif defined(__clang__)
  171666. "adcs r4, %[r]\n\t"
  171667. #else
  171668. "adc r4, %[r]\n\t"
  171669. #endif
  171670. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171671. "adds r2, r2, r5\n\t"
  171672. #else
  171673. "add r2, r2, r5\n\t"
  171674. #endif
  171675. #ifdef WOLFSSL_KEIL
  171676. "adcs r3, r3, r6\n\t"
  171677. #elif defined(__clang__)
  171678. "adcs r3, r6\n\t"
  171679. #else
  171680. "adc r3, r6\n\t"
  171681. #endif
  171682. #ifdef WOLFSSL_KEIL
  171683. "adcs r4, r4, %[r]\n\t"
  171684. #elif defined(__clang__)
  171685. "adcs r4, %[r]\n\t"
  171686. #else
  171687. "adc r4, %[r]\n\t"
  171688. #endif
  171689. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171690. "lsrs r5, %[a], #16\n\t"
  171691. #else
  171692. "lsr r5, %[a], #16\n\t"
  171693. #endif
  171694. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171695. "lsrs r6, r7, #16\n\t"
  171696. #else
  171697. "lsr r6, r7, #16\n\t"
  171698. #endif
  171699. #ifdef WOLFSSL_KEIL
  171700. "muls r6, r5, r6\n\t"
  171701. #elif defined(__clang__)
  171702. "muls r6, r5\n\t"
  171703. #else
  171704. "mul r6, r5\n\t"
  171705. #endif
  171706. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171707. "adds r3, r3, r6\n\t"
  171708. #else
  171709. "add r3, r3, r6\n\t"
  171710. #endif
  171711. #ifdef WOLFSSL_KEIL
  171712. "adcs r4, r4, %[r]\n\t"
  171713. #elif defined(__clang__)
  171714. "adcs r4, %[r]\n\t"
  171715. #else
  171716. "adc r4, %[r]\n\t"
  171717. #endif
  171718. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171719. "adds r3, r3, r6\n\t"
  171720. #else
  171721. "add r3, r3, r6\n\t"
  171722. #endif
  171723. #ifdef WOLFSSL_KEIL
  171724. "adcs r4, r4, %[r]\n\t"
  171725. #elif defined(__clang__)
  171726. "adcs r4, %[r]\n\t"
  171727. #else
  171728. "adc r4, %[r]\n\t"
  171729. #endif
  171730. "uxth r6, r7\n\t"
  171731. #ifdef WOLFSSL_KEIL
  171732. "muls r5, r6, r5\n\t"
  171733. #elif defined(__clang__)
  171734. "muls r5, r6\n\t"
  171735. #else
  171736. "mul r5, r6\n\t"
  171737. #endif
  171738. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171739. "lsrs r6, r5, #16\n\t"
  171740. #else
  171741. "lsr r6, r5, #16\n\t"
  171742. #endif
  171743. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171744. "lsls r5, r5, #16\n\t"
  171745. #else
  171746. "lsl r5, r5, #16\n\t"
  171747. #endif
  171748. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171749. "adds r2, r2, r5\n\t"
  171750. #else
  171751. "add r2, r2, r5\n\t"
  171752. #endif
  171753. #ifdef WOLFSSL_KEIL
  171754. "adcs r3, r3, r6\n\t"
  171755. #elif defined(__clang__)
  171756. "adcs r3, r6\n\t"
  171757. #else
  171758. "adc r3, r6\n\t"
  171759. #endif
  171760. #ifdef WOLFSSL_KEIL
  171761. "adcs r4, r4, %[r]\n\t"
  171762. #elif defined(__clang__)
  171763. "adcs r4, %[r]\n\t"
  171764. #else
  171765. "adc r4, %[r]\n\t"
  171766. #endif
  171767. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171768. "adds r2, r2, r5\n\t"
  171769. #else
  171770. "add r2, r2, r5\n\t"
  171771. #endif
  171772. #ifdef WOLFSSL_KEIL
  171773. "adcs r3, r3, r6\n\t"
  171774. #elif defined(__clang__)
  171775. "adcs r3, r6\n\t"
  171776. #else
  171777. "adc r3, r6\n\t"
  171778. #endif
  171779. #ifdef WOLFSSL_KEIL
  171780. "adcs r4, r4, %[r]\n\t"
  171781. #elif defined(__clang__)
  171782. "adcs r4, %[r]\n\t"
  171783. #else
  171784. "adc r4, %[r]\n\t"
  171785. #endif
  171786. "str r2, [sp, #12]\n\t"
  171787. "# A[4] * A[0]\n\t"
  171788. "movs r2, #0\n\t"
  171789. "mov %[a], r9\n\t"
  171790. "ldr %[a], [%[a], #16]\n\t"
  171791. "uxth r5, %[a]\n\t"
  171792. "uxth r6, r7\n\t"
  171793. #ifdef WOLFSSL_KEIL
  171794. "muls r6, r5, r6\n\t"
  171795. #elif defined(__clang__)
  171796. "muls r6, r5\n\t"
  171797. #else
  171798. "mul r6, r5\n\t"
  171799. #endif
  171800. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171801. "adds r3, r3, r6\n\t"
  171802. #else
  171803. "add r3, r3, r6\n\t"
  171804. #endif
  171805. #ifdef WOLFSSL_KEIL
  171806. "adcs r4, r4, %[r]\n\t"
  171807. #elif defined(__clang__)
  171808. "adcs r4, %[r]\n\t"
  171809. #else
  171810. "adc r4, %[r]\n\t"
  171811. #endif
  171812. #ifdef WOLFSSL_KEIL
  171813. "adcs r2, r2, %[r]\n\t"
  171814. #elif defined(__clang__)
  171815. "adcs r2, %[r]\n\t"
  171816. #else
  171817. "adc r2, %[r]\n\t"
  171818. #endif
  171819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171820. "adds r3, r3, r6\n\t"
  171821. #else
  171822. "add r3, r3, r6\n\t"
  171823. #endif
  171824. #ifdef WOLFSSL_KEIL
  171825. "adcs r4, r4, %[r]\n\t"
  171826. #elif defined(__clang__)
  171827. "adcs r4, %[r]\n\t"
  171828. #else
  171829. "adc r4, %[r]\n\t"
  171830. #endif
  171831. #ifdef WOLFSSL_KEIL
  171832. "adcs r2, r2, %[r]\n\t"
  171833. #elif defined(__clang__)
  171834. "adcs r2, %[r]\n\t"
  171835. #else
  171836. "adc r2, %[r]\n\t"
  171837. #endif
  171838. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171839. "lsrs r6, r7, #16\n\t"
  171840. #else
  171841. "lsr r6, r7, #16\n\t"
  171842. #endif
  171843. #ifdef WOLFSSL_KEIL
  171844. "muls r5, r6, r5\n\t"
  171845. #elif defined(__clang__)
  171846. "muls r5, r6\n\t"
  171847. #else
  171848. "mul r5, r6\n\t"
  171849. #endif
  171850. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171851. "lsrs r6, r5, #16\n\t"
  171852. #else
  171853. "lsr r6, r5, #16\n\t"
  171854. #endif
  171855. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171856. "lsls r5, r5, #16\n\t"
  171857. #else
  171858. "lsl r5, r5, #16\n\t"
  171859. #endif
  171860. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171861. "adds r3, r3, r5\n\t"
  171862. #else
  171863. "add r3, r3, r5\n\t"
  171864. #endif
  171865. #ifdef WOLFSSL_KEIL
  171866. "adcs r4, r4, r6\n\t"
  171867. #elif defined(__clang__)
  171868. "adcs r4, r6\n\t"
  171869. #else
  171870. "adc r4, r6\n\t"
  171871. #endif
  171872. #ifdef WOLFSSL_KEIL
  171873. "adcs r2, r2, %[r]\n\t"
  171874. #elif defined(__clang__)
  171875. "adcs r2, %[r]\n\t"
  171876. #else
  171877. "adc r2, %[r]\n\t"
  171878. #endif
  171879. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171880. "adds r3, r3, r5\n\t"
  171881. #else
  171882. "add r3, r3, r5\n\t"
  171883. #endif
  171884. #ifdef WOLFSSL_KEIL
  171885. "adcs r4, r4, r6\n\t"
  171886. #elif defined(__clang__)
  171887. "adcs r4, r6\n\t"
  171888. #else
  171889. "adc r4, r6\n\t"
  171890. #endif
  171891. #ifdef WOLFSSL_KEIL
  171892. "adcs r2, r2, %[r]\n\t"
  171893. #elif defined(__clang__)
  171894. "adcs r2, %[r]\n\t"
  171895. #else
  171896. "adc r2, %[r]\n\t"
  171897. #endif
  171898. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171899. "lsrs r5, %[a], #16\n\t"
  171900. #else
  171901. "lsr r5, %[a], #16\n\t"
  171902. #endif
  171903. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171904. "lsrs r6, r7, #16\n\t"
  171905. #else
  171906. "lsr r6, r7, #16\n\t"
  171907. #endif
  171908. #ifdef WOLFSSL_KEIL
  171909. "muls r6, r5, r6\n\t"
  171910. #elif defined(__clang__)
  171911. "muls r6, r5\n\t"
  171912. #else
  171913. "mul r6, r5\n\t"
  171914. #endif
  171915. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171916. "adds r4, r4, r6\n\t"
  171917. #else
  171918. "add r4, r4, r6\n\t"
  171919. #endif
  171920. #ifdef WOLFSSL_KEIL
  171921. "adcs r2, r2, %[r]\n\t"
  171922. #elif defined(__clang__)
  171923. "adcs r2, %[r]\n\t"
  171924. #else
  171925. "adc r2, %[r]\n\t"
  171926. #endif
  171927. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171928. "adds r4, r4, r6\n\t"
  171929. #else
  171930. "add r4, r4, r6\n\t"
  171931. #endif
  171932. #ifdef WOLFSSL_KEIL
  171933. "adcs r2, r2, %[r]\n\t"
  171934. #elif defined(__clang__)
  171935. "adcs r2, %[r]\n\t"
  171936. #else
  171937. "adc r2, %[r]\n\t"
  171938. #endif
  171939. "uxth r6, r7\n\t"
  171940. #ifdef WOLFSSL_KEIL
  171941. "muls r5, r6, r5\n\t"
  171942. #elif defined(__clang__)
  171943. "muls r5, r6\n\t"
  171944. #else
  171945. "mul r5, r6\n\t"
  171946. #endif
  171947. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171948. "lsrs r6, r5, #16\n\t"
  171949. #else
  171950. "lsr r6, r5, #16\n\t"
  171951. #endif
  171952. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171953. "lsls r5, r5, #16\n\t"
  171954. #else
  171955. "lsl r5, r5, #16\n\t"
  171956. #endif
  171957. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171958. "adds r3, r3, r5\n\t"
  171959. #else
  171960. "add r3, r3, r5\n\t"
  171961. #endif
  171962. #ifdef WOLFSSL_KEIL
  171963. "adcs r4, r4, r6\n\t"
  171964. #elif defined(__clang__)
  171965. "adcs r4, r6\n\t"
  171966. #else
  171967. "adc r4, r6\n\t"
  171968. #endif
  171969. #ifdef WOLFSSL_KEIL
  171970. "adcs r2, r2, %[r]\n\t"
  171971. #elif defined(__clang__)
  171972. "adcs r2, %[r]\n\t"
  171973. #else
  171974. "adc r2, %[r]\n\t"
  171975. #endif
  171976. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171977. "adds r3, r3, r5\n\t"
  171978. #else
  171979. "add r3, r3, r5\n\t"
  171980. #endif
  171981. #ifdef WOLFSSL_KEIL
  171982. "adcs r4, r4, r6\n\t"
  171983. #elif defined(__clang__)
  171984. "adcs r4, r6\n\t"
  171985. #else
  171986. "adc r4, r6\n\t"
  171987. #endif
  171988. #ifdef WOLFSSL_KEIL
  171989. "adcs r2, r2, %[r]\n\t"
  171990. #elif defined(__clang__)
  171991. "adcs r2, %[r]\n\t"
  171992. #else
  171993. "adc r2, %[r]\n\t"
  171994. #endif
  171995. "# A[3] * A[1]\n\t"
  171996. "mov %[a], r9\n\t"
  171997. "mov r7, r11\n\t"
  171998. "mov %[a], lr\n\t"
  171999. "uxth r5, %[a]\n\t"
  172000. "uxth r6, r7\n\t"
  172001. #ifdef WOLFSSL_KEIL
  172002. "muls r6, r5, r6\n\t"
  172003. #elif defined(__clang__)
  172004. "muls r6, r5\n\t"
  172005. #else
  172006. "mul r6, r5\n\t"
  172007. #endif
  172008. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172009. "adds r3, r3, r6\n\t"
  172010. #else
  172011. "add r3, r3, r6\n\t"
  172012. #endif
  172013. #ifdef WOLFSSL_KEIL
  172014. "adcs r4, r4, %[r]\n\t"
  172015. #elif defined(__clang__)
  172016. "adcs r4, %[r]\n\t"
  172017. #else
  172018. "adc r4, %[r]\n\t"
  172019. #endif
  172020. #ifdef WOLFSSL_KEIL
  172021. "adcs r2, r2, %[r]\n\t"
  172022. #elif defined(__clang__)
  172023. "adcs r2, %[r]\n\t"
  172024. #else
  172025. "adc r2, %[r]\n\t"
  172026. #endif
  172027. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172028. "adds r3, r3, r6\n\t"
  172029. #else
  172030. "add r3, r3, r6\n\t"
  172031. #endif
  172032. #ifdef WOLFSSL_KEIL
  172033. "adcs r4, r4, %[r]\n\t"
  172034. #elif defined(__clang__)
  172035. "adcs r4, %[r]\n\t"
  172036. #else
  172037. "adc r4, %[r]\n\t"
  172038. #endif
  172039. #ifdef WOLFSSL_KEIL
  172040. "adcs r2, r2, %[r]\n\t"
  172041. #elif defined(__clang__)
  172042. "adcs r2, %[r]\n\t"
  172043. #else
  172044. "adc r2, %[r]\n\t"
  172045. #endif
  172046. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172047. "lsrs r6, r7, #16\n\t"
  172048. #else
  172049. "lsr r6, r7, #16\n\t"
  172050. #endif
  172051. #ifdef WOLFSSL_KEIL
  172052. "muls r5, r6, r5\n\t"
  172053. #elif defined(__clang__)
  172054. "muls r5, r6\n\t"
  172055. #else
  172056. "mul r5, r6\n\t"
  172057. #endif
  172058. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172059. "lsrs r6, r5, #16\n\t"
  172060. #else
  172061. "lsr r6, r5, #16\n\t"
  172062. #endif
  172063. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172064. "lsls r5, r5, #16\n\t"
  172065. #else
  172066. "lsl r5, r5, #16\n\t"
  172067. #endif
  172068. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172069. "adds r3, r3, r5\n\t"
  172070. #else
  172071. "add r3, r3, r5\n\t"
  172072. #endif
  172073. #ifdef WOLFSSL_KEIL
  172074. "adcs r4, r4, r6\n\t"
  172075. #elif defined(__clang__)
  172076. "adcs r4, r6\n\t"
  172077. #else
  172078. "adc r4, r6\n\t"
  172079. #endif
  172080. #ifdef WOLFSSL_KEIL
  172081. "adcs r2, r2, %[r]\n\t"
  172082. #elif defined(__clang__)
  172083. "adcs r2, %[r]\n\t"
  172084. #else
  172085. "adc r2, %[r]\n\t"
  172086. #endif
  172087. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172088. "adds r3, r3, r5\n\t"
  172089. #else
  172090. "add r3, r3, r5\n\t"
  172091. #endif
  172092. #ifdef WOLFSSL_KEIL
  172093. "adcs r4, r4, r6\n\t"
  172094. #elif defined(__clang__)
  172095. "adcs r4, r6\n\t"
  172096. #else
  172097. "adc r4, r6\n\t"
  172098. #endif
  172099. #ifdef WOLFSSL_KEIL
  172100. "adcs r2, r2, %[r]\n\t"
  172101. #elif defined(__clang__)
  172102. "adcs r2, %[r]\n\t"
  172103. #else
  172104. "adc r2, %[r]\n\t"
  172105. #endif
  172106. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172107. "lsrs r5, %[a], #16\n\t"
  172108. #else
  172109. "lsr r5, %[a], #16\n\t"
  172110. #endif
  172111. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172112. "lsrs r6, r7, #16\n\t"
  172113. #else
  172114. "lsr r6, r7, #16\n\t"
  172115. #endif
  172116. #ifdef WOLFSSL_KEIL
  172117. "muls r6, r5, r6\n\t"
  172118. #elif defined(__clang__)
  172119. "muls r6, r5\n\t"
  172120. #else
  172121. "mul r6, r5\n\t"
  172122. #endif
  172123. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172124. "adds r4, r4, r6\n\t"
  172125. #else
  172126. "add r4, r4, r6\n\t"
  172127. #endif
  172128. #ifdef WOLFSSL_KEIL
  172129. "adcs r2, r2, %[r]\n\t"
  172130. #elif defined(__clang__)
  172131. "adcs r2, %[r]\n\t"
  172132. #else
  172133. "adc r2, %[r]\n\t"
  172134. #endif
  172135. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172136. "adds r4, r4, r6\n\t"
  172137. #else
  172138. "add r4, r4, r6\n\t"
  172139. #endif
  172140. #ifdef WOLFSSL_KEIL
  172141. "adcs r2, r2, %[r]\n\t"
  172142. #elif defined(__clang__)
  172143. "adcs r2, %[r]\n\t"
  172144. #else
  172145. "adc r2, %[r]\n\t"
  172146. #endif
  172147. "uxth r6, r7\n\t"
  172148. #ifdef WOLFSSL_KEIL
  172149. "muls r5, r6, r5\n\t"
  172150. #elif defined(__clang__)
  172151. "muls r5, r6\n\t"
  172152. #else
  172153. "mul r5, r6\n\t"
  172154. #endif
  172155. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172156. "lsrs r6, r5, #16\n\t"
  172157. #else
  172158. "lsr r6, r5, #16\n\t"
  172159. #endif
  172160. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172161. "lsls r5, r5, #16\n\t"
  172162. #else
  172163. "lsl r5, r5, #16\n\t"
  172164. #endif
  172165. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172166. "adds r3, r3, r5\n\t"
  172167. #else
  172168. "add r3, r3, r5\n\t"
  172169. #endif
  172170. #ifdef WOLFSSL_KEIL
  172171. "adcs r4, r4, r6\n\t"
  172172. #elif defined(__clang__)
  172173. "adcs r4, r6\n\t"
  172174. #else
  172175. "adc r4, r6\n\t"
  172176. #endif
  172177. #ifdef WOLFSSL_KEIL
  172178. "adcs r2, r2, %[r]\n\t"
  172179. #elif defined(__clang__)
  172180. "adcs r2, %[r]\n\t"
  172181. #else
  172182. "adc r2, %[r]\n\t"
  172183. #endif
  172184. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172185. "adds r3, r3, r5\n\t"
  172186. #else
  172187. "add r3, r3, r5\n\t"
  172188. #endif
  172189. #ifdef WOLFSSL_KEIL
  172190. "adcs r4, r4, r6\n\t"
  172191. #elif defined(__clang__)
  172192. "adcs r4, r6\n\t"
  172193. #else
  172194. "adc r4, r6\n\t"
  172195. #endif
  172196. #ifdef WOLFSSL_KEIL
  172197. "adcs r2, r2, %[r]\n\t"
  172198. #elif defined(__clang__)
  172199. "adcs r2, %[r]\n\t"
  172200. #else
  172201. "adc r2, %[r]\n\t"
  172202. #endif
  172203. "# A[2] * A[2]\n\t"
  172204. "mov r7, r12\n\t"
  172205. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172206. "lsrs r6, r7, #16\n\t"
  172207. #else
  172208. "lsr r6, r7, #16\n\t"
  172209. #endif
  172210. "uxth r5, r7\n\t"
  172211. #ifdef WOLFSSL_KEIL
  172212. "muls r5, r5, r5\n\t"
  172213. #elif defined(__clang__)
  172214. "muls r5, r5\n\t"
  172215. #else
  172216. "mul r5, r5\n\t"
  172217. #endif
  172218. #ifdef WOLFSSL_KEIL
  172219. "muls r6, r6, r6\n\t"
  172220. #elif defined(__clang__)
  172221. "muls r6, r6\n\t"
  172222. #else
  172223. "mul r6, r6\n\t"
  172224. #endif
  172225. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172226. "adds r3, r3, r5\n\t"
  172227. #else
  172228. "add r3, r3, r5\n\t"
  172229. #endif
  172230. #ifdef WOLFSSL_KEIL
  172231. "adcs r4, r4, r6\n\t"
  172232. #elif defined(__clang__)
  172233. "adcs r4, r6\n\t"
  172234. #else
  172235. "adc r4, r6\n\t"
  172236. #endif
  172237. #ifdef WOLFSSL_KEIL
  172238. "adcs r2, r2, %[r]\n\t"
  172239. #elif defined(__clang__)
  172240. "adcs r2, %[r]\n\t"
  172241. #else
  172242. "adc r2, %[r]\n\t"
  172243. #endif
  172244. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172245. "lsrs r6, r7, #16\n\t"
  172246. #else
  172247. "lsr r6, r7, #16\n\t"
  172248. #endif
  172249. "uxth r5, r7\n\t"
  172250. #ifdef WOLFSSL_KEIL
  172251. "muls r5, r6, r5\n\t"
  172252. #elif defined(__clang__)
  172253. "muls r5, r6\n\t"
  172254. #else
  172255. "mul r5, r6\n\t"
  172256. #endif
  172257. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172258. "lsrs r6, r5, #15\n\t"
  172259. #else
  172260. "lsr r6, r5, #15\n\t"
  172261. #endif
  172262. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172263. "lsls r5, r5, #17\n\t"
  172264. #else
  172265. "lsl r5, r5, #17\n\t"
  172266. #endif
  172267. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172268. "adds r3, r3, r5\n\t"
  172269. #else
  172270. "add r3, r3, r5\n\t"
  172271. #endif
  172272. #ifdef WOLFSSL_KEIL
  172273. "adcs r4, r4, r6\n\t"
  172274. #elif defined(__clang__)
  172275. "adcs r4, r6\n\t"
  172276. #else
  172277. "adc r4, r6\n\t"
  172278. #endif
  172279. #ifdef WOLFSSL_KEIL
  172280. "adcs r2, r2, %[r]\n\t"
  172281. #elif defined(__clang__)
  172282. "adcs r2, %[r]\n\t"
  172283. #else
  172284. "adc r2, %[r]\n\t"
  172285. #endif
  172286. "str r3, [sp, #16]\n\t"
  172287. "# A[3] * A[2]\n\t"
  172288. "movs r3, #0\n\t"
  172289. "mov %[a], r9\n\t"
  172290. "mov %[a], lr\n\t"
  172291. "uxth r5, %[a]\n\t"
  172292. "uxth r6, r7\n\t"
  172293. #ifdef WOLFSSL_KEIL
  172294. "muls r6, r5, r6\n\t"
  172295. #elif defined(__clang__)
  172296. "muls r6, r5\n\t"
  172297. #else
  172298. "mul r6, r5\n\t"
  172299. #endif
  172300. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172301. "adds r4, r4, r6\n\t"
  172302. #else
  172303. "add r4, r4, r6\n\t"
  172304. #endif
  172305. #ifdef WOLFSSL_KEIL
  172306. "adcs r2, r2, %[r]\n\t"
  172307. #elif defined(__clang__)
  172308. "adcs r2, %[r]\n\t"
  172309. #else
  172310. "adc r2, %[r]\n\t"
  172311. #endif
  172312. #ifdef WOLFSSL_KEIL
  172313. "adcs r3, r3, %[r]\n\t"
  172314. #elif defined(__clang__)
  172315. "adcs r3, %[r]\n\t"
  172316. #else
  172317. "adc r3, %[r]\n\t"
  172318. #endif
  172319. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172320. "adds r4, r4, r6\n\t"
  172321. #else
  172322. "add r4, r4, r6\n\t"
  172323. #endif
  172324. #ifdef WOLFSSL_KEIL
  172325. "adcs r2, r2, %[r]\n\t"
  172326. #elif defined(__clang__)
  172327. "adcs r2, %[r]\n\t"
  172328. #else
  172329. "adc r2, %[r]\n\t"
  172330. #endif
  172331. #ifdef WOLFSSL_KEIL
  172332. "adcs r3, r3, %[r]\n\t"
  172333. #elif defined(__clang__)
  172334. "adcs r3, %[r]\n\t"
  172335. #else
  172336. "adc r3, %[r]\n\t"
  172337. #endif
  172338. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172339. "lsrs r6, r7, #16\n\t"
  172340. #else
  172341. "lsr r6, r7, #16\n\t"
  172342. #endif
  172343. #ifdef WOLFSSL_KEIL
  172344. "muls r5, r6, r5\n\t"
  172345. #elif defined(__clang__)
  172346. "muls r5, r6\n\t"
  172347. #else
  172348. "mul r5, r6\n\t"
  172349. #endif
  172350. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172351. "lsrs r6, r5, #16\n\t"
  172352. #else
  172353. "lsr r6, r5, #16\n\t"
  172354. #endif
  172355. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172356. "lsls r5, r5, #16\n\t"
  172357. #else
  172358. "lsl r5, r5, #16\n\t"
  172359. #endif
  172360. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172361. "adds r4, r4, r5\n\t"
  172362. #else
  172363. "add r4, r4, r5\n\t"
  172364. #endif
  172365. #ifdef WOLFSSL_KEIL
  172366. "adcs r2, r2, r6\n\t"
  172367. #elif defined(__clang__)
  172368. "adcs r2, r6\n\t"
  172369. #else
  172370. "adc r2, r6\n\t"
  172371. #endif
  172372. #ifdef WOLFSSL_KEIL
  172373. "adcs r3, r3, %[r]\n\t"
  172374. #elif defined(__clang__)
  172375. "adcs r3, %[r]\n\t"
  172376. #else
  172377. "adc r3, %[r]\n\t"
  172378. #endif
  172379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172380. "adds r4, r4, r5\n\t"
  172381. #else
  172382. "add r4, r4, r5\n\t"
  172383. #endif
  172384. #ifdef WOLFSSL_KEIL
  172385. "adcs r2, r2, r6\n\t"
  172386. #elif defined(__clang__)
  172387. "adcs r2, r6\n\t"
  172388. #else
  172389. "adc r2, r6\n\t"
  172390. #endif
  172391. #ifdef WOLFSSL_KEIL
  172392. "adcs r3, r3, %[r]\n\t"
  172393. #elif defined(__clang__)
  172394. "adcs r3, %[r]\n\t"
  172395. #else
  172396. "adc r3, %[r]\n\t"
  172397. #endif
  172398. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172399. "lsrs r5, %[a], #16\n\t"
  172400. #else
  172401. "lsr r5, %[a], #16\n\t"
  172402. #endif
  172403. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172404. "lsrs r6, r7, #16\n\t"
  172405. #else
  172406. "lsr r6, r7, #16\n\t"
  172407. #endif
  172408. #ifdef WOLFSSL_KEIL
  172409. "muls r6, r5, r6\n\t"
  172410. #elif defined(__clang__)
  172411. "muls r6, r5\n\t"
  172412. #else
  172413. "mul r6, r5\n\t"
  172414. #endif
  172415. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172416. "adds r2, r2, r6\n\t"
  172417. #else
  172418. "add r2, r2, r6\n\t"
  172419. #endif
  172420. #ifdef WOLFSSL_KEIL
  172421. "adcs r3, r3, %[r]\n\t"
  172422. #elif defined(__clang__)
  172423. "adcs r3, %[r]\n\t"
  172424. #else
  172425. "adc r3, %[r]\n\t"
  172426. #endif
  172427. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172428. "adds r2, r2, r6\n\t"
  172429. #else
  172430. "add r2, r2, r6\n\t"
  172431. #endif
  172432. #ifdef WOLFSSL_KEIL
  172433. "adcs r3, r3, %[r]\n\t"
  172434. #elif defined(__clang__)
  172435. "adcs r3, %[r]\n\t"
  172436. #else
  172437. "adc r3, %[r]\n\t"
  172438. #endif
  172439. "uxth r6, r7\n\t"
  172440. #ifdef WOLFSSL_KEIL
  172441. "muls r5, r6, r5\n\t"
  172442. #elif defined(__clang__)
  172443. "muls r5, r6\n\t"
  172444. #else
  172445. "mul r5, r6\n\t"
  172446. #endif
  172447. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172448. "lsrs r6, r5, #16\n\t"
  172449. #else
  172450. "lsr r6, r5, #16\n\t"
  172451. #endif
  172452. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172453. "lsls r5, r5, #16\n\t"
  172454. #else
  172455. "lsl r5, r5, #16\n\t"
  172456. #endif
  172457. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172458. "adds r4, r4, r5\n\t"
  172459. #else
  172460. "add r4, r4, r5\n\t"
  172461. #endif
  172462. #ifdef WOLFSSL_KEIL
  172463. "adcs r2, r2, r6\n\t"
  172464. #elif defined(__clang__)
  172465. "adcs r2, r6\n\t"
  172466. #else
  172467. "adc r2, r6\n\t"
  172468. #endif
  172469. #ifdef WOLFSSL_KEIL
  172470. "adcs r3, r3, %[r]\n\t"
  172471. #elif defined(__clang__)
  172472. "adcs r3, %[r]\n\t"
  172473. #else
  172474. "adc r3, %[r]\n\t"
  172475. #endif
  172476. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172477. "adds r4, r4, r5\n\t"
  172478. #else
  172479. "add r4, r4, r5\n\t"
  172480. #endif
  172481. #ifdef WOLFSSL_KEIL
  172482. "adcs r2, r2, r6\n\t"
  172483. #elif defined(__clang__)
  172484. "adcs r2, r6\n\t"
  172485. #else
  172486. "adc r2, r6\n\t"
  172487. #endif
  172488. #ifdef WOLFSSL_KEIL
  172489. "adcs r3, r3, %[r]\n\t"
  172490. #elif defined(__clang__)
  172491. "adcs r3, %[r]\n\t"
  172492. #else
  172493. "adc r3, %[r]\n\t"
  172494. #endif
  172495. "# A[4] * A[1]\n\t"
  172496. "mov %[a], r9\n\t"
  172497. "mov r7, r11\n\t"
  172498. "ldr %[a], [%[a], #16]\n\t"
  172499. "uxth r5, %[a]\n\t"
  172500. "uxth r6, r7\n\t"
  172501. #ifdef WOLFSSL_KEIL
  172502. "muls r6, r5, r6\n\t"
  172503. #elif defined(__clang__)
  172504. "muls r6, r5\n\t"
  172505. #else
  172506. "mul r6, r5\n\t"
  172507. #endif
  172508. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172509. "adds r4, r4, r6\n\t"
  172510. #else
  172511. "add r4, r4, r6\n\t"
  172512. #endif
  172513. #ifdef WOLFSSL_KEIL
  172514. "adcs r2, r2, %[r]\n\t"
  172515. #elif defined(__clang__)
  172516. "adcs r2, %[r]\n\t"
  172517. #else
  172518. "adc r2, %[r]\n\t"
  172519. #endif
  172520. #ifdef WOLFSSL_KEIL
  172521. "adcs r3, r3, %[r]\n\t"
  172522. #elif defined(__clang__)
  172523. "adcs r3, %[r]\n\t"
  172524. #else
  172525. "adc r3, %[r]\n\t"
  172526. #endif
  172527. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172528. "adds r4, r4, r6\n\t"
  172529. #else
  172530. "add r4, r4, r6\n\t"
  172531. #endif
  172532. #ifdef WOLFSSL_KEIL
  172533. "adcs r2, r2, %[r]\n\t"
  172534. #elif defined(__clang__)
  172535. "adcs r2, %[r]\n\t"
  172536. #else
  172537. "adc r2, %[r]\n\t"
  172538. #endif
  172539. #ifdef WOLFSSL_KEIL
  172540. "adcs r3, r3, %[r]\n\t"
  172541. #elif defined(__clang__)
  172542. "adcs r3, %[r]\n\t"
  172543. #else
  172544. "adc r3, %[r]\n\t"
  172545. #endif
  172546. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172547. "lsrs r6, r7, #16\n\t"
  172548. #else
  172549. "lsr r6, r7, #16\n\t"
  172550. #endif
  172551. #ifdef WOLFSSL_KEIL
  172552. "muls r5, r6, r5\n\t"
  172553. #elif defined(__clang__)
  172554. "muls r5, r6\n\t"
  172555. #else
  172556. "mul r5, r6\n\t"
  172557. #endif
  172558. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172559. "lsrs r6, r5, #16\n\t"
  172560. #else
  172561. "lsr r6, r5, #16\n\t"
  172562. #endif
  172563. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172564. "lsls r5, r5, #16\n\t"
  172565. #else
  172566. "lsl r5, r5, #16\n\t"
  172567. #endif
  172568. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172569. "adds r4, r4, r5\n\t"
  172570. #else
  172571. "add r4, r4, r5\n\t"
  172572. #endif
  172573. #ifdef WOLFSSL_KEIL
  172574. "adcs r2, r2, r6\n\t"
  172575. #elif defined(__clang__)
  172576. "adcs r2, r6\n\t"
  172577. #else
  172578. "adc r2, r6\n\t"
  172579. #endif
  172580. #ifdef WOLFSSL_KEIL
  172581. "adcs r3, r3, %[r]\n\t"
  172582. #elif defined(__clang__)
  172583. "adcs r3, %[r]\n\t"
  172584. #else
  172585. "adc r3, %[r]\n\t"
  172586. #endif
  172587. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172588. "adds r4, r4, r5\n\t"
  172589. #else
  172590. "add r4, r4, r5\n\t"
  172591. #endif
  172592. #ifdef WOLFSSL_KEIL
  172593. "adcs r2, r2, r6\n\t"
  172594. #elif defined(__clang__)
  172595. "adcs r2, r6\n\t"
  172596. #else
  172597. "adc r2, r6\n\t"
  172598. #endif
  172599. #ifdef WOLFSSL_KEIL
  172600. "adcs r3, r3, %[r]\n\t"
  172601. #elif defined(__clang__)
  172602. "adcs r3, %[r]\n\t"
  172603. #else
  172604. "adc r3, %[r]\n\t"
  172605. #endif
  172606. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172607. "lsrs r5, %[a], #16\n\t"
  172608. #else
  172609. "lsr r5, %[a], #16\n\t"
  172610. #endif
  172611. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172612. "lsrs r6, r7, #16\n\t"
  172613. #else
  172614. "lsr r6, r7, #16\n\t"
  172615. #endif
  172616. #ifdef WOLFSSL_KEIL
  172617. "muls r6, r5, r6\n\t"
  172618. #elif defined(__clang__)
  172619. "muls r6, r5\n\t"
  172620. #else
  172621. "mul r6, r5\n\t"
  172622. #endif
  172623. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172624. "adds r2, r2, r6\n\t"
  172625. #else
  172626. "add r2, r2, r6\n\t"
  172627. #endif
  172628. #ifdef WOLFSSL_KEIL
  172629. "adcs r3, r3, %[r]\n\t"
  172630. #elif defined(__clang__)
  172631. "adcs r3, %[r]\n\t"
  172632. #else
  172633. "adc r3, %[r]\n\t"
  172634. #endif
  172635. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172636. "adds r2, r2, r6\n\t"
  172637. #else
  172638. "add r2, r2, r6\n\t"
  172639. #endif
  172640. #ifdef WOLFSSL_KEIL
  172641. "adcs r3, r3, %[r]\n\t"
  172642. #elif defined(__clang__)
  172643. "adcs r3, %[r]\n\t"
  172644. #else
  172645. "adc r3, %[r]\n\t"
  172646. #endif
  172647. "uxth r6, r7\n\t"
  172648. #ifdef WOLFSSL_KEIL
  172649. "muls r5, r6, r5\n\t"
  172650. #elif defined(__clang__)
  172651. "muls r5, r6\n\t"
  172652. #else
  172653. "mul r5, r6\n\t"
  172654. #endif
  172655. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172656. "lsrs r6, r5, #16\n\t"
  172657. #else
  172658. "lsr r6, r5, #16\n\t"
  172659. #endif
  172660. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172661. "lsls r5, r5, #16\n\t"
  172662. #else
  172663. "lsl r5, r5, #16\n\t"
  172664. #endif
  172665. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172666. "adds r4, r4, r5\n\t"
  172667. #else
  172668. "add r4, r4, r5\n\t"
  172669. #endif
  172670. #ifdef WOLFSSL_KEIL
  172671. "adcs r2, r2, r6\n\t"
  172672. #elif defined(__clang__)
  172673. "adcs r2, r6\n\t"
  172674. #else
  172675. "adc r2, r6\n\t"
  172676. #endif
  172677. #ifdef WOLFSSL_KEIL
  172678. "adcs r3, r3, %[r]\n\t"
  172679. #elif defined(__clang__)
  172680. "adcs r3, %[r]\n\t"
  172681. #else
  172682. "adc r3, %[r]\n\t"
  172683. #endif
  172684. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172685. "adds r4, r4, r5\n\t"
  172686. #else
  172687. "add r4, r4, r5\n\t"
  172688. #endif
  172689. #ifdef WOLFSSL_KEIL
  172690. "adcs r2, r2, r6\n\t"
  172691. #elif defined(__clang__)
  172692. "adcs r2, r6\n\t"
  172693. #else
  172694. "adc r2, r6\n\t"
  172695. #endif
  172696. #ifdef WOLFSSL_KEIL
  172697. "adcs r3, r3, %[r]\n\t"
  172698. #elif defined(__clang__)
  172699. "adcs r3, %[r]\n\t"
  172700. #else
  172701. "adc r3, %[r]\n\t"
  172702. #endif
  172703. "# A[5] * A[0]\n\t"
  172704. "mov %[a], r9\n\t"
  172705. "mov r7, r10\n\t"
  172706. "ldr %[a], [%[a], #20]\n\t"
  172707. "uxth r5, %[a]\n\t"
  172708. "uxth r6, r7\n\t"
  172709. #ifdef WOLFSSL_KEIL
  172710. "muls r6, r5, r6\n\t"
  172711. #elif defined(__clang__)
  172712. "muls r6, r5\n\t"
  172713. #else
  172714. "mul r6, r5\n\t"
  172715. #endif
  172716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172717. "adds r4, r4, r6\n\t"
  172718. #else
  172719. "add r4, r4, r6\n\t"
  172720. #endif
  172721. #ifdef WOLFSSL_KEIL
  172722. "adcs r2, r2, %[r]\n\t"
  172723. #elif defined(__clang__)
  172724. "adcs r2, %[r]\n\t"
  172725. #else
  172726. "adc r2, %[r]\n\t"
  172727. #endif
  172728. #ifdef WOLFSSL_KEIL
  172729. "adcs r3, r3, %[r]\n\t"
  172730. #elif defined(__clang__)
  172731. "adcs r3, %[r]\n\t"
  172732. #else
  172733. "adc r3, %[r]\n\t"
  172734. #endif
  172735. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172736. "adds r4, r4, r6\n\t"
  172737. #else
  172738. "add r4, r4, r6\n\t"
  172739. #endif
  172740. #ifdef WOLFSSL_KEIL
  172741. "adcs r2, r2, %[r]\n\t"
  172742. #elif defined(__clang__)
  172743. "adcs r2, %[r]\n\t"
  172744. #else
  172745. "adc r2, %[r]\n\t"
  172746. #endif
  172747. #ifdef WOLFSSL_KEIL
  172748. "adcs r3, r3, %[r]\n\t"
  172749. #elif defined(__clang__)
  172750. "adcs r3, %[r]\n\t"
  172751. #else
  172752. "adc r3, %[r]\n\t"
  172753. #endif
  172754. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172755. "lsrs r6, r7, #16\n\t"
  172756. #else
  172757. "lsr r6, r7, #16\n\t"
  172758. #endif
  172759. #ifdef WOLFSSL_KEIL
  172760. "muls r5, r6, r5\n\t"
  172761. #elif defined(__clang__)
  172762. "muls r5, r6\n\t"
  172763. #else
  172764. "mul r5, r6\n\t"
  172765. #endif
  172766. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172767. "lsrs r6, r5, #16\n\t"
  172768. #else
  172769. "lsr r6, r5, #16\n\t"
  172770. #endif
  172771. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172772. "lsls r5, r5, #16\n\t"
  172773. #else
  172774. "lsl r5, r5, #16\n\t"
  172775. #endif
  172776. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172777. "adds r4, r4, r5\n\t"
  172778. #else
  172779. "add r4, r4, r5\n\t"
  172780. #endif
  172781. #ifdef WOLFSSL_KEIL
  172782. "adcs r2, r2, r6\n\t"
  172783. #elif defined(__clang__)
  172784. "adcs r2, r6\n\t"
  172785. #else
  172786. "adc r2, r6\n\t"
  172787. #endif
  172788. #ifdef WOLFSSL_KEIL
  172789. "adcs r3, r3, %[r]\n\t"
  172790. #elif defined(__clang__)
  172791. "adcs r3, %[r]\n\t"
  172792. #else
  172793. "adc r3, %[r]\n\t"
  172794. #endif
  172795. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172796. "adds r4, r4, r5\n\t"
  172797. #else
  172798. "add r4, r4, r5\n\t"
  172799. #endif
  172800. #ifdef WOLFSSL_KEIL
  172801. "adcs r2, r2, r6\n\t"
  172802. #elif defined(__clang__)
  172803. "adcs r2, r6\n\t"
  172804. #else
  172805. "adc r2, r6\n\t"
  172806. #endif
  172807. #ifdef WOLFSSL_KEIL
  172808. "adcs r3, r3, %[r]\n\t"
  172809. #elif defined(__clang__)
  172810. "adcs r3, %[r]\n\t"
  172811. #else
  172812. "adc r3, %[r]\n\t"
  172813. #endif
  172814. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172815. "lsrs r5, %[a], #16\n\t"
  172816. #else
  172817. "lsr r5, %[a], #16\n\t"
  172818. #endif
  172819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172820. "lsrs r6, r7, #16\n\t"
  172821. #else
  172822. "lsr r6, r7, #16\n\t"
  172823. #endif
  172824. #ifdef WOLFSSL_KEIL
  172825. "muls r6, r5, r6\n\t"
  172826. #elif defined(__clang__)
  172827. "muls r6, r5\n\t"
  172828. #else
  172829. "mul r6, r5\n\t"
  172830. #endif
  172831. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172832. "adds r2, r2, r6\n\t"
  172833. #else
  172834. "add r2, r2, r6\n\t"
  172835. #endif
  172836. #ifdef WOLFSSL_KEIL
  172837. "adcs r3, r3, %[r]\n\t"
  172838. #elif defined(__clang__)
  172839. "adcs r3, %[r]\n\t"
  172840. #else
  172841. "adc r3, %[r]\n\t"
  172842. #endif
  172843. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172844. "adds r2, r2, r6\n\t"
  172845. #else
  172846. "add r2, r2, r6\n\t"
  172847. #endif
  172848. #ifdef WOLFSSL_KEIL
  172849. "adcs r3, r3, %[r]\n\t"
  172850. #elif defined(__clang__)
  172851. "adcs r3, %[r]\n\t"
  172852. #else
  172853. "adc r3, %[r]\n\t"
  172854. #endif
  172855. "uxth r6, r7\n\t"
  172856. #ifdef WOLFSSL_KEIL
  172857. "muls r5, r6, r5\n\t"
  172858. #elif defined(__clang__)
  172859. "muls r5, r6\n\t"
  172860. #else
  172861. "mul r5, r6\n\t"
  172862. #endif
  172863. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172864. "lsrs r6, r5, #16\n\t"
  172865. #else
  172866. "lsr r6, r5, #16\n\t"
  172867. #endif
  172868. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172869. "lsls r5, r5, #16\n\t"
  172870. #else
  172871. "lsl r5, r5, #16\n\t"
  172872. #endif
  172873. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172874. "adds r4, r4, r5\n\t"
  172875. #else
  172876. "add r4, r4, r5\n\t"
  172877. #endif
  172878. #ifdef WOLFSSL_KEIL
  172879. "adcs r2, r2, r6\n\t"
  172880. #elif defined(__clang__)
  172881. "adcs r2, r6\n\t"
  172882. #else
  172883. "adc r2, r6\n\t"
  172884. #endif
  172885. #ifdef WOLFSSL_KEIL
  172886. "adcs r3, r3, %[r]\n\t"
  172887. #elif defined(__clang__)
  172888. "adcs r3, %[r]\n\t"
  172889. #else
  172890. "adc r3, %[r]\n\t"
  172891. #endif
  172892. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172893. "adds r4, r4, r5\n\t"
  172894. #else
  172895. "add r4, r4, r5\n\t"
  172896. #endif
  172897. #ifdef WOLFSSL_KEIL
  172898. "adcs r2, r2, r6\n\t"
  172899. #elif defined(__clang__)
  172900. "adcs r2, r6\n\t"
  172901. #else
  172902. "adc r2, r6\n\t"
  172903. #endif
  172904. #ifdef WOLFSSL_KEIL
  172905. "adcs r3, r3, %[r]\n\t"
  172906. #elif defined(__clang__)
  172907. "adcs r3, %[r]\n\t"
  172908. #else
  172909. "adc r3, %[r]\n\t"
  172910. #endif
  172911. "str r4, [sp, #20]\n\t"
  172912. "# A[6] * A[0]\n\t"
  172913. "movs r4, #0\n\t"
  172914. "mov %[a], r9\n\t"
  172915. "ldr %[a], [%[a], #24]\n\t"
  172916. "uxth r5, %[a]\n\t"
  172917. "uxth r6, r7\n\t"
  172918. #ifdef WOLFSSL_KEIL
  172919. "muls r6, r5, r6\n\t"
  172920. #elif defined(__clang__)
  172921. "muls r6, r5\n\t"
  172922. #else
  172923. "mul r6, r5\n\t"
  172924. #endif
  172925. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172926. "adds r2, r2, r6\n\t"
  172927. #else
  172928. "add r2, r2, r6\n\t"
  172929. #endif
  172930. #ifdef WOLFSSL_KEIL
  172931. "adcs r3, r3, %[r]\n\t"
  172932. #elif defined(__clang__)
  172933. "adcs r3, %[r]\n\t"
  172934. #else
  172935. "adc r3, %[r]\n\t"
  172936. #endif
  172937. #ifdef WOLFSSL_KEIL
  172938. "adcs r4, r4, %[r]\n\t"
  172939. #elif defined(__clang__)
  172940. "adcs r4, %[r]\n\t"
  172941. #else
  172942. "adc r4, %[r]\n\t"
  172943. #endif
  172944. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172945. "adds r2, r2, r6\n\t"
  172946. #else
  172947. "add r2, r2, r6\n\t"
  172948. #endif
  172949. #ifdef WOLFSSL_KEIL
  172950. "adcs r3, r3, %[r]\n\t"
  172951. #elif defined(__clang__)
  172952. "adcs r3, %[r]\n\t"
  172953. #else
  172954. "adc r3, %[r]\n\t"
  172955. #endif
  172956. #ifdef WOLFSSL_KEIL
  172957. "adcs r4, r4, %[r]\n\t"
  172958. #elif defined(__clang__)
  172959. "adcs r4, %[r]\n\t"
  172960. #else
  172961. "adc r4, %[r]\n\t"
  172962. #endif
  172963. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172964. "lsrs r6, r7, #16\n\t"
  172965. #else
  172966. "lsr r6, r7, #16\n\t"
  172967. #endif
  172968. #ifdef WOLFSSL_KEIL
  172969. "muls r5, r6, r5\n\t"
  172970. #elif defined(__clang__)
  172971. "muls r5, r6\n\t"
  172972. #else
  172973. "mul r5, r6\n\t"
  172974. #endif
  172975. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172976. "lsrs r6, r5, #16\n\t"
  172977. #else
  172978. "lsr r6, r5, #16\n\t"
  172979. #endif
  172980. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172981. "lsls r5, r5, #16\n\t"
  172982. #else
  172983. "lsl r5, r5, #16\n\t"
  172984. #endif
  172985. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172986. "adds r2, r2, r5\n\t"
  172987. #else
  172988. "add r2, r2, r5\n\t"
  172989. #endif
  172990. #ifdef WOLFSSL_KEIL
  172991. "adcs r3, r3, r6\n\t"
  172992. #elif defined(__clang__)
  172993. "adcs r3, r6\n\t"
  172994. #else
  172995. "adc r3, r6\n\t"
  172996. #endif
  172997. #ifdef WOLFSSL_KEIL
  172998. "adcs r4, r4, %[r]\n\t"
  172999. #elif defined(__clang__)
  173000. "adcs r4, %[r]\n\t"
  173001. #else
  173002. "adc r4, %[r]\n\t"
  173003. #endif
  173004. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173005. "adds r2, r2, r5\n\t"
  173006. #else
  173007. "add r2, r2, r5\n\t"
  173008. #endif
  173009. #ifdef WOLFSSL_KEIL
  173010. "adcs r3, r3, r6\n\t"
  173011. #elif defined(__clang__)
  173012. "adcs r3, r6\n\t"
  173013. #else
  173014. "adc r3, r6\n\t"
  173015. #endif
  173016. #ifdef WOLFSSL_KEIL
  173017. "adcs r4, r4, %[r]\n\t"
  173018. #elif defined(__clang__)
  173019. "adcs r4, %[r]\n\t"
  173020. #else
  173021. "adc r4, %[r]\n\t"
  173022. #endif
  173023. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173024. "lsrs r5, %[a], #16\n\t"
  173025. #else
  173026. "lsr r5, %[a], #16\n\t"
  173027. #endif
  173028. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173029. "lsrs r6, r7, #16\n\t"
  173030. #else
  173031. "lsr r6, r7, #16\n\t"
  173032. #endif
  173033. #ifdef WOLFSSL_KEIL
  173034. "muls r6, r5, r6\n\t"
  173035. #elif defined(__clang__)
  173036. "muls r6, r5\n\t"
  173037. #else
  173038. "mul r6, r5\n\t"
  173039. #endif
  173040. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173041. "adds r3, r3, r6\n\t"
  173042. #else
  173043. "add r3, r3, r6\n\t"
  173044. #endif
  173045. #ifdef WOLFSSL_KEIL
  173046. "adcs r4, r4, %[r]\n\t"
  173047. #elif defined(__clang__)
  173048. "adcs r4, %[r]\n\t"
  173049. #else
  173050. "adc r4, %[r]\n\t"
  173051. #endif
  173052. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173053. "adds r3, r3, r6\n\t"
  173054. #else
  173055. "add r3, r3, r6\n\t"
  173056. #endif
  173057. #ifdef WOLFSSL_KEIL
  173058. "adcs r4, r4, %[r]\n\t"
  173059. #elif defined(__clang__)
  173060. "adcs r4, %[r]\n\t"
  173061. #else
  173062. "adc r4, %[r]\n\t"
  173063. #endif
  173064. "uxth r6, r7\n\t"
  173065. #ifdef WOLFSSL_KEIL
  173066. "muls r5, r6, r5\n\t"
  173067. #elif defined(__clang__)
  173068. "muls r5, r6\n\t"
  173069. #else
  173070. "mul r5, r6\n\t"
  173071. #endif
  173072. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173073. "lsrs r6, r5, #16\n\t"
  173074. #else
  173075. "lsr r6, r5, #16\n\t"
  173076. #endif
  173077. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173078. "lsls r5, r5, #16\n\t"
  173079. #else
  173080. "lsl r5, r5, #16\n\t"
  173081. #endif
  173082. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173083. "adds r2, r2, r5\n\t"
  173084. #else
  173085. "add r2, r2, r5\n\t"
  173086. #endif
  173087. #ifdef WOLFSSL_KEIL
  173088. "adcs r3, r3, r6\n\t"
  173089. #elif defined(__clang__)
  173090. "adcs r3, r6\n\t"
  173091. #else
  173092. "adc r3, r6\n\t"
  173093. #endif
  173094. #ifdef WOLFSSL_KEIL
  173095. "adcs r4, r4, %[r]\n\t"
  173096. #elif defined(__clang__)
  173097. "adcs r4, %[r]\n\t"
  173098. #else
  173099. "adc r4, %[r]\n\t"
  173100. #endif
  173101. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173102. "adds r2, r2, r5\n\t"
  173103. #else
  173104. "add r2, r2, r5\n\t"
  173105. #endif
  173106. #ifdef WOLFSSL_KEIL
  173107. "adcs r3, r3, r6\n\t"
  173108. #elif defined(__clang__)
  173109. "adcs r3, r6\n\t"
  173110. #else
  173111. "adc r3, r6\n\t"
  173112. #endif
  173113. #ifdef WOLFSSL_KEIL
  173114. "adcs r4, r4, %[r]\n\t"
  173115. #elif defined(__clang__)
  173116. "adcs r4, %[r]\n\t"
  173117. #else
  173118. "adc r4, %[r]\n\t"
  173119. #endif
  173120. "# A[5] * A[1]\n\t"
  173121. "mov %[a], r9\n\t"
  173122. "mov r7, r11\n\t"
  173123. "ldr %[a], [%[a], #20]\n\t"
  173124. "uxth r5, %[a]\n\t"
  173125. "uxth r6, r7\n\t"
  173126. #ifdef WOLFSSL_KEIL
  173127. "muls r6, r5, r6\n\t"
  173128. #elif defined(__clang__)
  173129. "muls r6, r5\n\t"
  173130. #else
  173131. "mul r6, r5\n\t"
  173132. #endif
  173133. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173134. "adds r2, r2, r6\n\t"
  173135. #else
  173136. "add r2, r2, r6\n\t"
  173137. #endif
  173138. #ifdef WOLFSSL_KEIL
  173139. "adcs r3, r3, %[r]\n\t"
  173140. #elif defined(__clang__)
  173141. "adcs r3, %[r]\n\t"
  173142. #else
  173143. "adc r3, %[r]\n\t"
  173144. #endif
  173145. #ifdef WOLFSSL_KEIL
  173146. "adcs r4, r4, %[r]\n\t"
  173147. #elif defined(__clang__)
  173148. "adcs r4, %[r]\n\t"
  173149. #else
  173150. "adc r4, %[r]\n\t"
  173151. #endif
  173152. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173153. "adds r2, r2, r6\n\t"
  173154. #else
  173155. "add r2, r2, r6\n\t"
  173156. #endif
  173157. #ifdef WOLFSSL_KEIL
  173158. "adcs r3, r3, %[r]\n\t"
  173159. #elif defined(__clang__)
  173160. "adcs r3, %[r]\n\t"
  173161. #else
  173162. "adc r3, %[r]\n\t"
  173163. #endif
  173164. #ifdef WOLFSSL_KEIL
  173165. "adcs r4, r4, %[r]\n\t"
  173166. #elif defined(__clang__)
  173167. "adcs r4, %[r]\n\t"
  173168. #else
  173169. "adc r4, %[r]\n\t"
  173170. #endif
  173171. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173172. "lsrs r6, r7, #16\n\t"
  173173. #else
  173174. "lsr r6, r7, #16\n\t"
  173175. #endif
  173176. #ifdef WOLFSSL_KEIL
  173177. "muls r5, r6, r5\n\t"
  173178. #elif defined(__clang__)
  173179. "muls r5, r6\n\t"
  173180. #else
  173181. "mul r5, r6\n\t"
  173182. #endif
  173183. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173184. "lsrs r6, r5, #16\n\t"
  173185. #else
  173186. "lsr r6, r5, #16\n\t"
  173187. #endif
  173188. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173189. "lsls r5, r5, #16\n\t"
  173190. #else
  173191. "lsl r5, r5, #16\n\t"
  173192. #endif
  173193. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173194. "adds r2, r2, r5\n\t"
  173195. #else
  173196. "add r2, r2, r5\n\t"
  173197. #endif
  173198. #ifdef WOLFSSL_KEIL
  173199. "adcs r3, r3, r6\n\t"
  173200. #elif defined(__clang__)
  173201. "adcs r3, r6\n\t"
  173202. #else
  173203. "adc r3, r6\n\t"
  173204. #endif
  173205. #ifdef WOLFSSL_KEIL
  173206. "adcs r4, r4, %[r]\n\t"
  173207. #elif defined(__clang__)
  173208. "adcs r4, %[r]\n\t"
  173209. #else
  173210. "adc r4, %[r]\n\t"
  173211. #endif
  173212. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173213. "adds r2, r2, r5\n\t"
  173214. #else
  173215. "add r2, r2, r5\n\t"
  173216. #endif
  173217. #ifdef WOLFSSL_KEIL
  173218. "adcs r3, r3, r6\n\t"
  173219. #elif defined(__clang__)
  173220. "adcs r3, r6\n\t"
  173221. #else
  173222. "adc r3, r6\n\t"
  173223. #endif
  173224. #ifdef WOLFSSL_KEIL
  173225. "adcs r4, r4, %[r]\n\t"
  173226. #elif defined(__clang__)
  173227. "adcs r4, %[r]\n\t"
  173228. #else
  173229. "adc r4, %[r]\n\t"
  173230. #endif
  173231. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173232. "lsrs r5, %[a], #16\n\t"
  173233. #else
  173234. "lsr r5, %[a], #16\n\t"
  173235. #endif
  173236. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173237. "lsrs r6, r7, #16\n\t"
  173238. #else
  173239. "lsr r6, r7, #16\n\t"
  173240. #endif
  173241. #ifdef WOLFSSL_KEIL
  173242. "muls r6, r5, r6\n\t"
  173243. #elif defined(__clang__)
  173244. "muls r6, r5\n\t"
  173245. #else
  173246. "mul r6, r5\n\t"
  173247. #endif
  173248. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173249. "adds r3, r3, r6\n\t"
  173250. #else
  173251. "add r3, r3, r6\n\t"
  173252. #endif
  173253. #ifdef WOLFSSL_KEIL
  173254. "adcs r4, r4, %[r]\n\t"
  173255. #elif defined(__clang__)
  173256. "adcs r4, %[r]\n\t"
  173257. #else
  173258. "adc r4, %[r]\n\t"
  173259. #endif
  173260. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173261. "adds r3, r3, r6\n\t"
  173262. #else
  173263. "add r3, r3, r6\n\t"
  173264. #endif
  173265. #ifdef WOLFSSL_KEIL
  173266. "adcs r4, r4, %[r]\n\t"
  173267. #elif defined(__clang__)
  173268. "adcs r4, %[r]\n\t"
  173269. #else
  173270. "adc r4, %[r]\n\t"
  173271. #endif
  173272. "uxth r6, r7\n\t"
  173273. #ifdef WOLFSSL_KEIL
  173274. "muls r5, r6, r5\n\t"
  173275. #elif defined(__clang__)
  173276. "muls r5, r6\n\t"
  173277. #else
  173278. "mul r5, r6\n\t"
  173279. #endif
  173280. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173281. "lsrs r6, r5, #16\n\t"
  173282. #else
  173283. "lsr r6, r5, #16\n\t"
  173284. #endif
  173285. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173286. "lsls r5, r5, #16\n\t"
  173287. #else
  173288. "lsl r5, r5, #16\n\t"
  173289. #endif
  173290. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173291. "adds r2, r2, r5\n\t"
  173292. #else
  173293. "add r2, r2, r5\n\t"
  173294. #endif
  173295. #ifdef WOLFSSL_KEIL
  173296. "adcs r3, r3, r6\n\t"
  173297. #elif defined(__clang__)
  173298. "adcs r3, r6\n\t"
  173299. #else
  173300. "adc r3, r6\n\t"
  173301. #endif
  173302. #ifdef WOLFSSL_KEIL
  173303. "adcs r4, r4, %[r]\n\t"
  173304. #elif defined(__clang__)
  173305. "adcs r4, %[r]\n\t"
  173306. #else
  173307. "adc r4, %[r]\n\t"
  173308. #endif
  173309. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173310. "adds r2, r2, r5\n\t"
  173311. #else
  173312. "add r2, r2, r5\n\t"
  173313. #endif
  173314. #ifdef WOLFSSL_KEIL
  173315. "adcs r3, r3, r6\n\t"
  173316. #elif defined(__clang__)
  173317. "adcs r3, r6\n\t"
  173318. #else
  173319. "adc r3, r6\n\t"
  173320. #endif
  173321. #ifdef WOLFSSL_KEIL
  173322. "adcs r4, r4, %[r]\n\t"
  173323. #elif defined(__clang__)
  173324. "adcs r4, %[r]\n\t"
  173325. #else
  173326. "adc r4, %[r]\n\t"
  173327. #endif
  173328. "# A[4] * A[2]\n\t"
  173329. "mov %[a], r9\n\t"
  173330. "mov r7, r12\n\t"
  173331. "ldr %[a], [%[a], #16]\n\t"
  173332. "uxth r5, %[a]\n\t"
  173333. "uxth r6, r7\n\t"
  173334. #ifdef WOLFSSL_KEIL
  173335. "muls r6, r5, r6\n\t"
  173336. #elif defined(__clang__)
  173337. "muls r6, r5\n\t"
  173338. #else
  173339. "mul r6, r5\n\t"
  173340. #endif
  173341. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173342. "adds r2, r2, r6\n\t"
  173343. #else
  173344. "add r2, r2, r6\n\t"
  173345. #endif
  173346. #ifdef WOLFSSL_KEIL
  173347. "adcs r3, r3, %[r]\n\t"
  173348. #elif defined(__clang__)
  173349. "adcs r3, %[r]\n\t"
  173350. #else
  173351. "adc r3, %[r]\n\t"
  173352. #endif
  173353. #ifdef WOLFSSL_KEIL
  173354. "adcs r4, r4, %[r]\n\t"
  173355. #elif defined(__clang__)
  173356. "adcs r4, %[r]\n\t"
  173357. #else
  173358. "adc r4, %[r]\n\t"
  173359. #endif
  173360. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173361. "adds r2, r2, r6\n\t"
  173362. #else
  173363. "add r2, r2, r6\n\t"
  173364. #endif
  173365. #ifdef WOLFSSL_KEIL
  173366. "adcs r3, r3, %[r]\n\t"
  173367. #elif defined(__clang__)
  173368. "adcs r3, %[r]\n\t"
  173369. #else
  173370. "adc r3, %[r]\n\t"
  173371. #endif
  173372. #ifdef WOLFSSL_KEIL
  173373. "adcs r4, r4, %[r]\n\t"
  173374. #elif defined(__clang__)
  173375. "adcs r4, %[r]\n\t"
  173376. #else
  173377. "adc r4, %[r]\n\t"
  173378. #endif
  173379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173380. "lsrs r6, r7, #16\n\t"
  173381. #else
  173382. "lsr r6, r7, #16\n\t"
  173383. #endif
  173384. #ifdef WOLFSSL_KEIL
  173385. "muls r5, r6, r5\n\t"
  173386. #elif defined(__clang__)
  173387. "muls r5, r6\n\t"
  173388. #else
  173389. "mul r5, r6\n\t"
  173390. #endif
  173391. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173392. "lsrs r6, r5, #16\n\t"
  173393. #else
  173394. "lsr r6, r5, #16\n\t"
  173395. #endif
  173396. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173397. "lsls r5, r5, #16\n\t"
  173398. #else
  173399. "lsl r5, r5, #16\n\t"
  173400. #endif
  173401. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173402. "adds r2, r2, r5\n\t"
  173403. #else
  173404. "add r2, r2, r5\n\t"
  173405. #endif
  173406. #ifdef WOLFSSL_KEIL
  173407. "adcs r3, r3, r6\n\t"
  173408. #elif defined(__clang__)
  173409. "adcs r3, r6\n\t"
  173410. #else
  173411. "adc r3, r6\n\t"
  173412. #endif
  173413. #ifdef WOLFSSL_KEIL
  173414. "adcs r4, r4, %[r]\n\t"
  173415. #elif defined(__clang__)
  173416. "adcs r4, %[r]\n\t"
  173417. #else
  173418. "adc r4, %[r]\n\t"
  173419. #endif
  173420. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173421. "adds r2, r2, r5\n\t"
  173422. #else
  173423. "add r2, r2, r5\n\t"
  173424. #endif
  173425. #ifdef WOLFSSL_KEIL
  173426. "adcs r3, r3, r6\n\t"
  173427. #elif defined(__clang__)
  173428. "adcs r3, r6\n\t"
  173429. #else
  173430. "adc r3, r6\n\t"
  173431. #endif
  173432. #ifdef WOLFSSL_KEIL
  173433. "adcs r4, r4, %[r]\n\t"
  173434. #elif defined(__clang__)
  173435. "adcs r4, %[r]\n\t"
  173436. #else
  173437. "adc r4, %[r]\n\t"
  173438. #endif
  173439. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173440. "lsrs r5, %[a], #16\n\t"
  173441. #else
  173442. "lsr r5, %[a], #16\n\t"
  173443. #endif
  173444. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173445. "lsrs r6, r7, #16\n\t"
  173446. #else
  173447. "lsr r6, r7, #16\n\t"
  173448. #endif
  173449. #ifdef WOLFSSL_KEIL
  173450. "muls r6, r5, r6\n\t"
  173451. #elif defined(__clang__)
  173452. "muls r6, r5\n\t"
  173453. #else
  173454. "mul r6, r5\n\t"
  173455. #endif
  173456. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173457. "adds r3, r3, r6\n\t"
  173458. #else
  173459. "add r3, r3, r6\n\t"
  173460. #endif
  173461. #ifdef WOLFSSL_KEIL
  173462. "adcs r4, r4, %[r]\n\t"
  173463. #elif defined(__clang__)
  173464. "adcs r4, %[r]\n\t"
  173465. #else
  173466. "adc r4, %[r]\n\t"
  173467. #endif
  173468. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173469. "adds r3, r3, r6\n\t"
  173470. #else
  173471. "add r3, r3, r6\n\t"
  173472. #endif
  173473. #ifdef WOLFSSL_KEIL
  173474. "adcs r4, r4, %[r]\n\t"
  173475. #elif defined(__clang__)
  173476. "adcs r4, %[r]\n\t"
  173477. #else
  173478. "adc r4, %[r]\n\t"
  173479. #endif
  173480. "uxth r6, r7\n\t"
  173481. #ifdef WOLFSSL_KEIL
  173482. "muls r5, r6, r5\n\t"
  173483. #elif defined(__clang__)
  173484. "muls r5, r6\n\t"
  173485. #else
  173486. "mul r5, r6\n\t"
  173487. #endif
  173488. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173489. "lsrs r6, r5, #16\n\t"
  173490. #else
  173491. "lsr r6, r5, #16\n\t"
  173492. #endif
  173493. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173494. "lsls r5, r5, #16\n\t"
  173495. #else
  173496. "lsl r5, r5, #16\n\t"
  173497. #endif
  173498. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173499. "adds r2, r2, r5\n\t"
  173500. #else
  173501. "add r2, r2, r5\n\t"
  173502. #endif
  173503. #ifdef WOLFSSL_KEIL
  173504. "adcs r3, r3, r6\n\t"
  173505. #elif defined(__clang__)
  173506. "adcs r3, r6\n\t"
  173507. #else
  173508. "adc r3, r6\n\t"
  173509. #endif
  173510. #ifdef WOLFSSL_KEIL
  173511. "adcs r4, r4, %[r]\n\t"
  173512. #elif defined(__clang__)
  173513. "adcs r4, %[r]\n\t"
  173514. #else
  173515. "adc r4, %[r]\n\t"
  173516. #endif
  173517. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173518. "adds r2, r2, r5\n\t"
  173519. #else
  173520. "add r2, r2, r5\n\t"
  173521. #endif
  173522. #ifdef WOLFSSL_KEIL
  173523. "adcs r3, r3, r6\n\t"
  173524. #elif defined(__clang__)
  173525. "adcs r3, r6\n\t"
  173526. #else
  173527. "adc r3, r6\n\t"
  173528. #endif
  173529. #ifdef WOLFSSL_KEIL
  173530. "adcs r4, r4, %[r]\n\t"
  173531. #elif defined(__clang__)
  173532. "adcs r4, %[r]\n\t"
  173533. #else
  173534. "adc r4, %[r]\n\t"
  173535. #endif
  173536. "# A[3] * A[3]\n\t"
  173537. "mov r7, lr\n\t"
  173538. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173539. "lsrs r6, r7, #16\n\t"
  173540. #else
  173541. "lsr r6, r7, #16\n\t"
  173542. #endif
  173543. "uxth r5, r7\n\t"
  173544. #ifdef WOLFSSL_KEIL
  173545. "muls r5, r5, r5\n\t"
  173546. #elif defined(__clang__)
  173547. "muls r5, r5\n\t"
  173548. #else
  173549. "mul r5, r5\n\t"
  173550. #endif
  173551. #ifdef WOLFSSL_KEIL
  173552. "muls r6, r6, r6\n\t"
  173553. #elif defined(__clang__)
  173554. "muls r6, r6\n\t"
  173555. #else
  173556. "mul r6, r6\n\t"
  173557. #endif
  173558. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173559. "adds r2, r2, r5\n\t"
  173560. #else
  173561. "add r2, r2, r5\n\t"
  173562. #endif
  173563. #ifdef WOLFSSL_KEIL
  173564. "adcs r3, r3, r6\n\t"
  173565. #elif defined(__clang__)
  173566. "adcs r3, r6\n\t"
  173567. #else
  173568. "adc r3, r6\n\t"
  173569. #endif
  173570. #ifdef WOLFSSL_KEIL
  173571. "adcs r4, r4, %[r]\n\t"
  173572. #elif defined(__clang__)
  173573. "adcs r4, %[r]\n\t"
  173574. #else
  173575. "adc r4, %[r]\n\t"
  173576. #endif
  173577. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173578. "lsrs r6, r7, #16\n\t"
  173579. #else
  173580. "lsr r6, r7, #16\n\t"
  173581. #endif
  173582. "uxth r5, r7\n\t"
  173583. #ifdef WOLFSSL_KEIL
  173584. "muls r5, r6, r5\n\t"
  173585. #elif defined(__clang__)
  173586. "muls r5, r6\n\t"
  173587. #else
  173588. "mul r5, r6\n\t"
  173589. #endif
  173590. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173591. "lsrs r6, r5, #15\n\t"
  173592. #else
  173593. "lsr r6, r5, #15\n\t"
  173594. #endif
  173595. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173596. "lsls r5, r5, #17\n\t"
  173597. #else
  173598. "lsl r5, r5, #17\n\t"
  173599. #endif
  173600. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173601. "adds r2, r2, r5\n\t"
  173602. #else
  173603. "add r2, r2, r5\n\t"
  173604. #endif
  173605. #ifdef WOLFSSL_KEIL
  173606. "adcs r3, r3, r6\n\t"
  173607. #elif defined(__clang__)
  173608. "adcs r3, r6\n\t"
  173609. #else
  173610. "adc r3, r6\n\t"
  173611. #endif
  173612. #ifdef WOLFSSL_KEIL
  173613. "adcs r4, r4, %[r]\n\t"
  173614. #elif defined(__clang__)
  173615. "adcs r4, %[r]\n\t"
  173616. #else
  173617. "adc r4, %[r]\n\t"
  173618. #endif
  173619. "str r2, [sp, #24]\n\t"
  173620. "# A[4] * A[3]\n\t"
  173621. "movs r2, #0\n\t"
  173622. "mov %[a], r9\n\t"
  173623. "ldr %[a], [%[a], #16]\n\t"
  173624. "uxth r5, %[a]\n\t"
  173625. "uxth r6, r7\n\t"
  173626. #ifdef WOLFSSL_KEIL
  173627. "muls r6, r5, r6\n\t"
  173628. #elif defined(__clang__)
  173629. "muls r6, r5\n\t"
  173630. #else
  173631. "mul r6, r5\n\t"
  173632. #endif
  173633. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173634. "adds r3, r3, r6\n\t"
  173635. #else
  173636. "add r3, r3, r6\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. #ifdef WOLFSSL_KEIL
  173646. "adcs r2, r2, %[r]\n\t"
  173647. #elif defined(__clang__)
  173648. "adcs r2, %[r]\n\t"
  173649. #else
  173650. "adc r2, %[r]\n\t"
  173651. #endif
  173652. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173653. "adds r3, r3, r6\n\t"
  173654. #else
  173655. "add r3, r3, r6\n\t"
  173656. #endif
  173657. #ifdef WOLFSSL_KEIL
  173658. "adcs r4, r4, %[r]\n\t"
  173659. #elif defined(__clang__)
  173660. "adcs r4, %[r]\n\t"
  173661. #else
  173662. "adc r4, %[r]\n\t"
  173663. #endif
  173664. #ifdef WOLFSSL_KEIL
  173665. "adcs r2, r2, %[r]\n\t"
  173666. #elif defined(__clang__)
  173667. "adcs r2, %[r]\n\t"
  173668. #else
  173669. "adc r2, %[r]\n\t"
  173670. #endif
  173671. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173672. "lsrs r6, r7, #16\n\t"
  173673. #else
  173674. "lsr r6, r7, #16\n\t"
  173675. #endif
  173676. #ifdef WOLFSSL_KEIL
  173677. "muls r5, r6, r5\n\t"
  173678. #elif defined(__clang__)
  173679. "muls r5, r6\n\t"
  173680. #else
  173681. "mul r5, r6\n\t"
  173682. #endif
  173683. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173684. "lsrs r6, r5, #16\n\t"
  173685. #else
  173686. "lsr r6, r5, #16\n\t"
  173687. #endif
  173688. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173689. "lsls r5, r5, #16\n\t"
  173690. #else
  173691. "lsl r5, r5, #16\n\t"
  173692. #endif
  173693. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173694. "adds r3, r3, r5\n\t"
  173695. #else
  173696. "add r3, r3, r5\n\t"
  173697. #endif
  173698. #ifdef WOLFSSL_KEIL
  173699. "adcs r4, r4, r6\n\t"
  173700. #elif defined(__clang__)
  173701. "adcs r4, r6\n\t"
  173702. #else
  173703. "adc r4, r6\n\t"
  173704. #endif
  173705. #ifdef WOLFSSL_KEIL
  173706. "adcs r2, r2, %[r]\n\t"
  173707. #elif defined(__clang__)
  173708. "adcs r2, %[r]\n\t"
  173709. #else
  173710. "adc r2, %[r]\n\t"
  173711. #endif
  173712. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173713. "adds r3, r3, r5\n\t"
  173714. #else
  173715. "add r3, r3, r5\n\t"
  173716. #endif
  173717. #ifdef WOLFSSL_KEIL
  173718. "adcs r4, r4, r6\n\t"
  173719. #elif defined(__clang__)
  173720. "adcs r4, r6\n\t"
  173721. #else
  173722. "adc r4, r6\n\t"
  173723. #endif
  173724. #ifdef WOLFSSL_KEIL
  173725. "adcs r2, r2, %[r]\n\t"
  173726. #elif defined(__clang__)
  173727. "adcs r2, %[r]\n\t"
  173728. #else
  173729. "adc r2, %[r]\n\t"
  173730. #endif
  173731. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173732. "lsrs r5, %[a], #16\n\t"
  173733. #else
  173734. "lsr r5, %[a], #16\n\t"
  173735. #endif
  173736. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173737. "lsrs r6, r7, #16\n\t"
  173738. #else
  173739. "lsr r6, r7, #16\n\t"
  173740. #endif
  173741. #ifdef WOLFSSL_KEIL
  173742. "muls r6, r5, r6\n\t"
  173743. #elif defined(__clang__)
  173744. "muls r6, r5\n\t"
  173745. #else
  173746. "mul r6, r5\n\t"
  173747. #endif
  173748. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173749. "adds r4, r4, r6\n\t"
  173750. #else
  173751. "add r4, r4, r6\n\t"
  173752. #endif
  173753. #ifdef WOLFSSL_KEIL
  173754. "adcs r2, r2, %[r]\n\t"
  173755. #elif defined(__clang__)
  173756. "adcs r2, %[r]\n\t"
  173757. #else
  173758. "adc r2, %[r]\n\t"
  173759. #endif
  173760. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173761. "adds r4, r4, r6\n\t"
  173762. #else
  173763. "add r4, r4, r6\n\t"
  173764. #endif
  173765. #ifdef WOLFSSL_KEIL
  173766. "adcs r2, r2, %[r]\n\t"
  173767. #elif defined(__clang__)
  173768. "adcs r2, %[r]\n\t"
  173769. #else
  173770. "adc r2, %[r]\n\t"
  173771. #endif
  173772. "uxth r6, r7\n\t"
  173773. #ifdef WOLFSSL_KEIL
  173774. "muls r5, r6, r5\n\t"
  173775. #elif defined(__clang__)
  173776. "muls r5, r6\n\t"
  173777. #else
  173778. "mul r5, r6\n\t"
  173779. #endif
  173780. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173781. "lsrs r6, r5, #16\n\t"
  173782. #else
  173783. "lsr r6, r5, #16\n\t"
  173784. #endif
  173785. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173786. "lsls r5, r5, #16\n\t"
  173787. #else
  173788. "lsl r5, r5, #16\n\t"
  173789. #endif
  173790. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173791. "adds r3, r3, r5\n\t"
  173792. #else
  173793. "add r3, r3, r5\n\t"
  173794. #endif
  173795. #ifdef WOLFSSL_KEIL
  173796. "adcs r4, r4, r6\n\t"
  173797. #elif defined(__clang__)
  173798. "adcs r4, r6\n\t"
  173799. #else
  173800. "adc r4, r6\n\t"
  173801. #endif
  173802. #ifdef WOLFSSL_KEIL
  173803. "adcs r2, r2, %[r]\n\t"
  173804. #elif defined(__clang__)
  173805. "adcs r2, %[r]\n\t"
  173806. #else
  173807. "adc r2, %[r]\n\t"
  173808. #endif
  173809. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173810. "adds r3, r3, r5\n\t"
  173811. #else
  173812. "add r3, r3, r5\n\t"
  173813. #endif
  173814. #ifdef WOLFSSL_KEIL
  173815. "adcs r4, r4, r6\n\t"
  173816. #elif defined(__clang__)
  173817. "adcs r4, r6\n\t"
  173818. #else
  173819. "adc r4, r6\n\t"
  173820. #endif
  173821. #ifdef WOLFSSL_KEIL
  173822. "adcs r2, r2, %[r]\n\t"
  173823. #elif defined(__clang__)
  173824. "adcs r2, %[r]\n\t"
  173825. #else
  173826. "adc r2, %[r]\n\t"
  173827. #endif
  173828. "# A[5] * A[2]\n\t"
  173829. "mov %[a], r9\n\t"
  173830. "mov r7, r12\n\t"
  173831. "ldr %[a], [%[a], #20]\n\t"
  173832. "uxth r5, %[a]\n\t"
  173833. "uxth r6, r7\n\t"
  173834. #ifdef WOLFSSL_KEIL
  173835. "muls r6, r5, r6\n\t"
  173836. #elif defined(__clang__)
  173837. "muls r6, r5\n\t"
  173838. #else
  173839. "mul r6, r5\n\t"
  173840. #endif
  173841. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173842. "adds r3, r3, r6\n\t"
  173843. #else
  173844. "add r3, r3, r6\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. #ifdef WOLFSSL_KEIL
  173854. "adcs r2, r2, %[r]\n\t"
  173855. #elif defined(__clang__)
  173856. "adcs r2, %[r]\n\t"
  173857. #else
  173858. "adc r2, %[r]\n\t"
  173859. #endif
  173860. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173861. "adds r3, r3, r6\n\t"
  173862. #else
  173863. "add r3, r3, r6\n\t"
  173864. #endif
  173865. #ifdef WOLFSSL_KEIL
  173866. "adcs r4, r4, %[r]\n\t"
  173867. #elif defined(__clang__)
  173868. "adcs r4, %[r]\n\t"
  173869. #else
  173870. "adc r4, %[r]\n\t"
  173871. #endif
  173872. #ifdef WOLFSSL_KEIL
  173873. "adcs r2, r2, %[r]\n\t"
  173874. #elif defined(__clang__)
  173875. "adcs r2, %[r]\n\t"
  173876. #else
  173877. "adc r2, %[r]\n\t"
  173878. #endif
  173879. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173880. "lsrs r6, r7, #16\n\t"
  173881. #else
  173882. "lsr r6, r7, #16\n\t"
  173883. #endif
  173884. #ifdef WOLFSSL_KEIL
  173885. "muls r5, r6, r5\n\t"
  173886. #elif defined(__clang__)
  173887. "muls r5, r6\n\t"
  173888. #else
  173889. "mul r5, r6\n\t"
  173890. #endif
  173891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173892. "lsrs r6, r5, #16\n\t"
  173893. #else
  173894. "lsr r6, r5, #16\n\t"
  173895. #endif
  173896. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173897. "lsls r5, r5, #16\n\t"
  173898. #else
  173899. "lsl r5, r5, #16\n\t"
  173900. #endif
  173901. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173902. "adds r3, r3, r5\n\t"
  173903. #else
  173904. "add r3, r3, r5\n\t"
  173905. #endif
  173906. #ifdef WOLFSSL_KEIL
  173907. "adcs r4, r4, r6\n\t"
  173908. #elif defined(__clang__)
  173909. "adcs r4, r6\n\t"
  173910. #else
  173911. "adc r4, r6\n\t"
  173912. #endif
  173913. #ifdef WOLFSSL_KEIL
  173914. "adcs r2, r2, %[r]\n\t"
  173915. #elif defined(__clang__)
  173916. "adcs r2, %[r]\n\t"
  173917. #else
  173918. "adc r2, %[r]\n\t"
  173919. #endif
  173920. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173921. "adds r3, r3, r5\n\t"
  173922. #else
  173923. "add r3, r3, r5\n\t"
  173924. #endif
  173925. #ifdef WOLFSSL_KEIL
  173926. "adcs r4, r4, r6\n\t"
  173927. #elif defined(__clang__)
  173928. "adcs r4, r6\n\t"
  173929. #else
  173930. "adc r4, r6\n\t"
  173931. #endif
  173932. #ifdef WOLFSSL_KEIL
  173933. "adcs r2, r2, %[r]\n\t"
  173934. #elif defined(__clang__)
  173935. "adcs r2, %[r]\n\t"
  173936. #else
  173937. "adc r2, %[r]\n\t"
  173938. #endif
  173939. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173940. "lsrs r5, %[a], #16\n\t"
  173941. #else
  173942. "lsr r5, %[a], #16\n\t"
  173943. #endif
  173944. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173945. "lsrs r6, r7, #16\n\t"
  173946. #else
  173947. "lsr r6, r7, #16\n\t"
  173948. #endif
  173949. #ifdef WOLFSSL_KEIL
  173950. "muls r6, r5, r6\n\t"
  173951. #elif defined(__clang__)
  173952. "muls r6, r5\n\t"
  173953. #else
  173954. "mul r6, r5\n\t"
  173955. #endif
  173956. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173957. "adds r4, r4, r6\n\t"
  173958. #else
  173959. "add r4, r4, r6\n\t"
  173960. #endif
  173961. #ifdef WOLFSSL_KEIL
  173962. "adcs r2, r2, %[r]\n\t"
  173963. #elif defined(__clang__)
  173964. "adcs r2, %[r]\n\t"
  173965. #else
  173966. "adc r2, %[r]\n\t"
  173967. #endif
  173968. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173969. "adds r4, r4, r6\n\t"
  173970. #else
  173971. "add r4, r4, r6\n\t"
  173972. #endif
  173973. #ifdef WOLFSSL_KEIL
  173974. "adcs r2, r2, %[r]\n\t"
  173975. #elif defined(__clang__)
  173976. "adcs r2, %[r]\n\t"
  173977. #else
  173978. "adc r2, %[r]\n\t"
  173979. #endif
  173980. "uxth r6, r7\n\t"
  173981. #ifdef WOLFSSL_KEIL
  173982. "muls r5, r6, r5\n\t"
  173983. #elif defined(__clang__)
  173984. "muls r5, r6\n\t"
  173985. #else
  173986. "mul r5, r6\n\t"
  173987. #endif
  173988. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173989. "lsrs r6, r5, #16\n\t"
  173990. #else
  173991. "lsr r6, r5, #16\n\t"
  173992. #endif
  173993. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173994. "lsls r5, r5, #16\n\t"
  173995. #else
  173996. "lsl r5, r5, #16\n\t"
  173997. #endif
  173998. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173999. "adds r3, r3, r5\n\t"
  174000. #else
  174001. "add r3, r3, r5\n\t"
  174002. #endif
  174003. #ifdef WOLFSSL_KEIL
  174004. "adcs r4, r4, r6\n\t"
  174005. #elif defined(__clang__)
  174006. "adcs r4, r6\n\t"
  174007. #else
  174008. "adc r4, r6\n\t"
  174009. #endif
  174010. #ifdef WOLFSSL_KEIL
  174011. "adcs r2, r2, %[r]\n\t"
  174012. #elif defined(__clang__)
  174013. "adcs r2, %[r]\n\t"
  174014. #else
  174015. "adc r2, %[r]\n\t"
  174016. #endif
  174017. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174018. "adds r3, r3, r5\n\t"
  174019. #else
  174020. "add r3, r3, r5\n\t"
  174021. #endif
  174022. #ifdef WOLFSSL_KEIL
  174023. "adcs r4, r4, r6\n\t"
  174024. #elif defined(__clang__)
  174025. "adcs r4, r6\n\t"
  174026. #else
  174027. "adc r4, r6\n\t"
  174028. #endif
  174029. #ifdef WOLFSSL_KEIL
  174030. "adcs r2, r2, %[r]\n\t"
  174031. #elif defined(__clang__)
  174032. "adcs r2, %[r]\n\t"
  174033. #else
  174034. "adc r2, %[r]\n\t"
  174035. #endif
  174036. "# A[6] * A[1]\n\t"
  174037. "mov %[a], r9\n\t"
  174038. "mov r7, r11\n\t"
  174039. "ldr %[a], [%[a], #24]\n\t"
  174040. "uxth r5, %[a]\n\t"
  174041. "uxth r6, r7\n\t"
  174042. #ifdef WOLFSSL_KEIL
  174043. "muls r6, r5, r6\n\t"
  174044. #elif defined(__clang__)
  174045. "muls r6, r5\n\t"
  174046. #else
  174047. "mul r6, r5\n\t"
  174048. #endif
  174049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174050. "adds r3, r3, r6\n\t"
  174051. #else
  174052. "add r3, r3, r6\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. #ifdef WOLFSSL_KEIL
  174062. "adcs r2, r2, %[r]\n\t"
  174063. #elif defined(__clang__)
  174064. "adcs r2, %[r]\n\t"
  174065. #else
  174066. "adc r2, %[r]\n\t"
  174067. #endif
  174068. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174069. "adds r3, r3, r6\n\t"
  174070. #else
  174071. "add r3, r3, r6\n\t"
  174072. #endif
  174073. #ifdef WOLFSSL_KEIL
  174074. "adcs r4, r4, %[r]\n\t"
  174075. #elif defined(__clang__)
  174076. "adcs r4, %[r]\n\t"
  174077. #else
  174078. "adc r4, %[r]\n\t"
  174079. #endif
  174080. #ifdef WOLFSSL_KEIL
  174081. "adcs r2, r2, %[r]\n\t"
  174082. #elif defined(__clang__)
  174083. "adcs r2, %[r]\n\t"
  174084. #else
  174085. "adc r2, %[r]\n\t"
  174086. #endif
  174087. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174088. "lsrs r6, r7, #16\n\t"
  174089. #else
  174090. "lsr r6, r7, #16\n\t"
  174091. #endif
  174092. #ifdef WOLFSSL_KEIL
  174093. "muls r5, r6, r5\n\t"
  174094. #elif defined(__clang__)
  174095. "muls r5, r6\n\t"
  174096. #else
  174097. "mul r5, r6\n\t"
  174098. #endif
  174099. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174100. "lsrs r6, r5, #16\n\t"
  174101. #else
  174102. "lsr r6, r5, #16\n\t"
  174103. #endif
  174104. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174105. "lsls r5, r5, #16\n\t"
  174106. #else
  174107. "lsl r5, r5, #16\n\t"
  174108. #endif
  174109. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174110. "adds r3, r3, r5\n\t"
  174111. #else
  174112. "add r3, r3, r5\n\t"
  174113. #endif
  174114. #ifdef WOLFSSL_KEIL
  174115. "adcs r4, r4, r6\n\t"
  174116. #elif defined(__clang__)
  174117. "adcs r4, r6\n\t"
  174118. #else
  174119. "adc r4, r6\n\t"
  174120. #endif
  174121. #ifdef WOLFSSL_KEIL
  174122. "adcs r2, r2, %[r]\n\t"
  174123. #elif defined(__clang__)
  174124. "adcs r2, %[r]\n\t"
  174125. #else
  174126. "adc r2, %[r]\n\t"
  174127. #endif
  174128. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174129. "adds r3, r3, r5\n\t"
  174130. #else
  174131. "add r3, r3, r5\n\t"
  174132. #endif
  174133. #ifdef WOLFSSL_KEIL
  174134. "adcs r4, r4, r6\n\t"
  174135. #elif defined(__clang__)
  174136. "adcs r4, r6\n\t"
  174137. #else
  174138. "adc r4, r6\n\t"
  174139. #endif
  174140. #ifdef WOLFSSL_KEIL
  174141. "adcs r2, r2, %[r]\n\t"
  174142. #elif defined(__clang__)
  174143. "adcs r2, %[r]\n\t"
  174144. #else
  174145. "adc r2, %[r]\n\t"
  174146. #endif
  174147. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174148. "lsrs r5, %[a], #16\n\t"
  174149. #else
  174150. "lsr r5, %[a], #16\n\t"
  174151. #endif
  174152. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174153. "lsrs r6, r7, #16\n\t"
  174154. #else
  174155. "lsr r6, r7, #16\n\t"
  174156. #endif
  174157. #ifdef WOLFSSL_KEIL
  174158. "muls r6, r5, r6\n\t"
  174159. #elif defined(__clang__)
  174160. "muls r6, r5\n\t"
  174161. #else
  174162. "mul r6, r5\n\t"
  174163. #endif
  174164. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174165. "adds r4, r4, r6\n\t"
  174166. #else
  174167. "add r4, r4, r6\n\t"
  174168. #endif
  174169. #ifdef WOLFSSL_KEIL
  174170. "adcs r2, r2, %[r]\n\t"
  174171. #elif defined(__clang__)
  174172. "adcs r2, %[r]\n\t"
  174173. #else
  174174. "adc r2, %[r]\n\t"
  174175. #endif
  174176. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174177. "adds r4, r4, r6\n\t"
  174178. #else
  174179. "add r4, r4, r6\n\t"
  174180. #endif
  174181. #ifdef WOLFSSL_KEIL
  174182. "adcs r2, r2, %[r]\n\t"
  174183. #elif defined(__clang__)
  174184. "adcs r2, %[r]\n\t"
  174185. #else
  174186. "adc r2, %[r]\n\t"
  174187. #endif
  174188. "uxth r6, r7\n\t"
  174189. #ifdef WOLFSSL_KEIL
  174190. "muls r5, r6, r5\n\t"
  174191. #elif defined(__clang__)
  174192. "muls r5, r6\n\t"
  174193. #else
  174194. "mul r5, r6\n\t"
  174195. #endif
  174196. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174197. "lsrs r6, r5, #16\n\t"
  174198. #else
  174199. "lsr r6, r5, #16\n\t"
  174200. #endif
  174201. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174202. "lsls r5, r5, #16\n\t"
  174203. #else
  174204. "lsl r5, r5, #16\n\t"
  174205. #endif
  174206. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174207. "adds r3, r3, r5\n\t"
  174208. #else
  174209. "add r3, r3, r5\n\t"
  174210. #endif
  174211. #ifdef WOLFSSL_KEIL
  174212. "adcs r4, r4, r6\n\t"
  174213. #elif defined(__clang__)
  174214. "adcs r4, r6\n\t"
  174215. #else
  174216. "adc r4, r6\n\t"
  174217. #endif
  174218. #ifdef WOLFSSL_KEIL
  174219. "adcs r2, r2, %[r]\n\t"
  174220. #elif defined(__clang__)
  174221. "adcs r2, %[r]\n\t"
  174222. #else
  174223. "adc r2, %[r]\n\t"
  174224. #endif
  174225. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174226. "adds r3, r3, r5\n\t"
  174227. #else
  174228. "add r3, r3, r5\n\t"
  174229. #endif
  174230. #ifdef WOLFSSL_KEIL
  174231. "adcs r4, r4, r6\n\t"
  174232. #elif defined(__clang__)
  174233. "adcs r4, r6\n\t"
  174234. #else
  174235. "adc r4, r6\n\t"
  174236. #endif
  174237. #ifdef WOLFSSL_KEIL
  174238. "adcs r2, r2, %[r]\n\t"
  174239. #elif defined(__clang__)
  174240. "adcs r2, %[r]\n\t"
  174241. #else
  174242. "adc r2, %[r]\n\t"
  174243. #endif
  174244. "# A[7] * A[0]\n\t"
  174245. "mov %[a], r9\n\t"
  174246. "mov r7, r10\n\t"
  174247. "ldr %[a], [%[a], #28]\n\t"
  174248. "uxth r5, %[a]\n\t"
  174249. "uxth r6, r7\n\t"
  174250. #ifdef WOLFSSL_KEIL
  174251. "muls r6, r5, r6\n\t"
  174252. #elif defined(__clang__)
  174253. "muls r6, r5\n\t"
  174254. #else
  174255. "mul r6, r5\n\t"
  174256. #endif
  174257. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174258. "adds r3, r3, r6\n\t"
  174259. #else
  174260. "add r3, r3, r6\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. #ifdef WOLFSSL_KEIL
  174270. "adcs r2, r2, %[r]\n\t"
  174271. #elif defined(__clang__)
  174272. "adcs r2, %[r]\n\t"
  174273. #else
  174274. "adc r2, %[r]\n\t"
  174275. #endif
  174276. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174277. "adds r3, r3, r6\n\t"
  174278. #else
  174279. "add r3, r3, r6\n\t"
  174280. #endif
  174281. #ifdef WOLFSSL_KEIL
  174282. "adcs r4, r4, %[r]\n\t"
  174283. #elif defined(__clang__)
  174284. "adcs r4, %[r]\n\t"
  174285. #else
  174286. "adc r4, %[r]\n\t"
  174287. #endif
  174288. #ifdef WOLFSSL_KEIL
  174289. "adcs r2, r2, %[r]\n\t"
  174290. #elif defined(__clang__)
  174291. "adcs r2, %[r]\n\t"
  174292. #else
  174293. "adc r2, %[r]\n\t"
  174294. #endif
  174295. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174296. "lsrs r6, r7, #16\n\t"
  174297. #else
  174298. "lsr r6, r7, #16\n\t"
  174299. #endif
  174300. #ifdef WOLFSSL_KEIL
  174301. "muls r5, r6, r5\n\t"
  174302. #elif defined(__clang__)
  174303. "muls r5, r6\n\t"
  174304. #else
  174305. "mul r5, r6\n\t"
  174306. #endif
  174307. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174308. "lsrs r6, r5, #16\n\t"
  174309. #else
  174310. "lsr r6, r5, #16\n\t"
  174311. #endif
  174312. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174313. "lsls r5, r5, #16\n\t"
  174314. #else
  174315. "lsl r5, r5, #16\n\t"
  174316. #endif
  174317. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174318. "adds r3, r3, r5\n\t"
  174319. #else
  174320. "add r3, r3, r5\n\t"
  174321. #endif
  174322. #ifdef WOLFSSL_KEIL
  174323. "adcs r4, r4, r6\n\t"
  174324. #elif defined(__clang__)
  174325. "adcs r4, r6\n\t"
  174326. #else
  174327. "adc r4, r6\n\t"
  174328. #endif
  174329. #ifdef WOLFSSL_KEIL
  174330. "adcs r2, r2, %[r]\n\t"
  174331. #elif defined(__clang__)
  174332. "adcs r2, %[r]\n\t"
  174333. #else
  174334. "adc r2, %[r]\n\t"
  174335. #endif
  174336. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174337. "adds r3, r3, r5\n\t"
  174338. #else
  174339. "add r3, r3, r5\n\t"
  174340. #endif
  174341. #ifdef WOLFSSL_KEIL
  174342. "adcs r4, r4, r6\n\t"
  174343. #elif defined(__clang__)
  174344. "adcs r4, r6\n\t"
  174345. #else
  174346. "adc r4, r6\n\t"
  174347. #endif
  174348. #ifdef WOLFSSL_KEIL
  174349. "adcs r2, r2, %[r]\n\t"
  174350. #elif defined(__clang__)
  174351. "adcs r2, %[r]\n\t"
  174352. #else
  174353. "adc r2, %[r]\n\t"
  174354. #endif
  174355. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174356. "lsrs r5, %[a], #16\n\t"
  174357. #else
  174358. "lsr r5, %[a], #16\n\t"
  174359. #endif
  174360. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174361. "lsrs r6, r7, #16\n\t"
  174362. #else
  174363. "lsr r6, r7, #16\n\t"
  174364. #endif
  174365. #ifdef WOLFSSL_KEIL
  174366. "muls r6, r5, r6\n\t"
  174367. #elif defined(__clang__)
  174368. "muls r6, r5\n\t"
  174369. #else
  174370. "mul r6, r5\n\t"
  174371. #endif
  174372. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174373. "adds r4, r4, r6\n\t"
  174374. #else
  174375. "add r4, r4, r6\n\t"
  174376. #endif
  174377. #ifdef WOLFSSL_KEIL
  174378. "adcs r2, r2, %[r]\n\t"
  174379. #elif defined(__clang__)
  174380. "adcs r2, %[r]\n\t"
  174381. #else
  174382. "adc r2, %[r]\n\t"
  174383. #endif
  174384. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174385. "adds r4, r4, r6\n\t"
  174386. #else
  174387. "add r4, r4, r6\n\t"
  174388. #endif
  174389. #ifdef WOLFSSL_KEIL
  174390. "adcs r2, r2, %[r]\n\t"
  174391. #elif defined(__clang__)
  174392. "adcs r2, %[r]\n\t"
  174393. #else
  174394. "adc r2, %[r]\n\t"
  174395. #endif
  174396. "uxth r6, r7\n\t"
  174397. #ifdef WOLFSSL_KEIL
  174398. "muls r5, r6, r5\n\t"
  174399. #elif defined(__clang__)
  174400. "muls r5, r6\n\t"
  174401. #else
  174402. "mul r5, r6\n\t"
  174403. #endif
  174404. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174405. "lsrs r6, r5, #16\n\t"
  174406. #else
  174407. "lsr r6, r5, #16\n\t"
  174408. #endif
  174409. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174410. "lsls r5, r5, #16\n\t"
  174411. #else
  174412. "lsl r5, r5, #16\n\t"
  174413. #endif
  174414. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174415. "adds r3, r3, r5\n\t"
  174416. #else
  174417. "add r3, r3, r5\n\t"
  174418. #endif
  174419. #ifdef WOLFSSL_KEIL
  174420. "adcs r4, r4, r6\n\t"
  174421. #elif defined(__clang__)
  174422. "adcs r4, r6\n\t"
  174423. #else
  174424. "adc r4, r6\n\t"
  174425. #endif
  174426. #ifdef WOLFSSL_KEIL
  174427. "adcs r2, r2, %[r]\n\t"
  174428. #elif defined(__clang__)
  174429. "adcs r2, %[r]\n\t"
  174430. #else
  174431. "adc r2, %[r]\n\t"
  174432. #endif
  174433. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174434. "adds r3, r3, r5\n\t"
  174435. #else
  174436. "add r3, r3, r5\n\t"
  174437. #endif
  174438. #ifdef WOLFSSL_KEIL
  174439. "adcs r4, r4, r6\n\t"
  174440. #elif defined(__clang__)
  174441. "adcs r4, r6\n\t"
  174442. #else
  174443. "adc r4, r6\n\t"
  174444. #endif
  174445. #ifdef WOLFSSL_KEIL
  174446. "adcs r2, r2, %[r]\n\t"
  174447. #elif defined(__clang__)
  174448. "adcs r2, %[r]\n\t"
  174449. #else
  174450. "adc r2, %[r]\n\t"
  174451. #endif
  174452. "str r3, [sp, #28]\n\t"
  174453. "# A[8] * A[0]\n\t"
  174454. "movs r3, #0\n\t"
  174455. "mov %[a], r9\n\t"
  174456. "ldr %[a], [%[a], #32]\n\t"
  174457. "uxth r5, %[a]\n\t"
  174458. "uxth r6, r7\n\t"
  174459. #ifdef WOLFSSL_KEIL
  174460. "muls r6, r5, r6\n\t"
  174461. #elif defined(__clang__)
  174462. "muls r6, r5\n\t"
  174463. #else
  174464. "mul r6, r5\n\t"
  174465. #endif
  174466. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174467. "adds r4, r4, r6\n\t"
  174468. #else
  174469. "add r4, r4, r6\n\t"
  174470. #endif
  174471. #ifdef WOLFSSL_KEIL
  174472. "adcs r2, r2, %[r]\n\t"
  174473. #elif defined(__clang__)
  174474. "adcs r2, %[r]\n\t"
  174475. #else
  174476. "adc r2, %[r]\n\t"
  174477. #endif
  174478. #ifdef WOLFSSL_KEIL
  174479. "adcs r3, r3, %[r]\n\t"
  174480. #elif defined(__clang__)
  174481. "adcs r3, %[r]\n\t"
  174482. #else
  174483. "adc r3, %[r]\n\t"
  174484. #endif
  174485. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174486. "adds r4, r4, r6\n\t"
  174487. #else
  174488. "add r4, r4, r6\n\t"
  174489. #endif
  174490. #ifdef WOLFSSL_KEIL
  174491. "adcs r2, r2, %[r]\n\t"
  174492. #elif defined(__clang__)
  174493. "adcs r2, %[r]\n\t"
  174494. #else
  174495. "adc r2, %[r]\n\t"
  174496. #endif
  174497. #ifdef WOLFSSL_KEIL
  174498. "adcs r3, r3, %[r]\n\t"
  174499. #elif defined(__clang__)
  174500. "adcs r3, %[r]\n\t"
  174501. #else
  174502. "adc r3, %[r]\n\t"
  174503. #endif
  174504. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174505. "lsrs r6, r7, #16\n\t"
  174506. #else
  174507. "lsr r6, r7, #16\n\t"
  174508. #endif
  174509. #ifdef WOLFSSL_KEIL
  174510. "muls r5, r6, r5\n\t"
  174511. #elif defined(__clang__)
  174512. "muls r5, r6\n\t"
  174513. #else
  174514. "mul r5, r6\n\t"
  174515. #endif
  174516. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174517. "lsrs r6, r5, #16\n\t"
  174518. #else
  174519. "lsr r6, r5, #16\n\t"
  174520. #endif
  174521. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174522. "lsls r5, r5, #16\n\t"
  174523. #else
  174524. "lsl r5, r5, #16\n\t"
  174525. #endif
  174526. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174527. "adds r4, r4, r5\n\t"
  174528. #else
  174529. "add r4, r4, r5\n\t"
  174530. #endif
  174531. #ifdef WOLFSSL_KEIL
  174532. "adcs r2, r2, r6\n\t"
  174533. #elif defined(__clang__)
  174534. "adcs r2, r6\n\t"
  174535. #else
  174536. "adc r2, r6\n\t"
  174537. #endif
  174538. #ifdef WOLFSSL_KEIL
  174539. "adcs r3, r3, %[r]\n\t"
  174540. #elif defined(__clang__)
  174541. "adcs r3, %[r]\n\t"
  174542. #else
  174543. "adc r3, %[r]\n\t"
  174544. #endif
  174545. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174546. "adds r4, r4, r5\n\t"
  174547. #else
  174548. "add r4, r4, r5\n\t"
  174549. #endif
  174550. #ifdef WOLFSSL_KEIL
  174551. "adcs r2, r2, r6\n\t"
  174552. #elif defined(__clang__)
  174553. "adcs r2, r6\n\t"
  174554. #else
  174555. "adc r2, r6\n\t"
  174556. #endif
  174557. #ifdef WOLFSSL_KEIL
  174558. "adcs r3, r3, %[r]\n\t"
  174559. #elif defined(__clang__)
  174560. "adcs r3, %[r]\n\t"
  174561. #else
  174562. "adc r3, %[r]\n\t"
  174563. #endif
  174564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174565. "lsrs r5, %[a], #16\n\t"
  174566. #else
  174567. "lsr r5, %[a], #16\n\t"
  174568. #endif
  174569. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174570. "lsrs r6, r7, #16\n\t"
  174571. #else
  174572. "lsr r6, r7, #16\n\t"
  174573. #endif
  174574. #ifdef WOLFSSL_KEIL
  174575. "muls r6, r5, r6\n\t"
  174576. #elif defined(__clang__)
  174577. "muls r6, r5\n\t"
  174578. #else
  174579. "mul r6, r5\n\t"
  174580. #endif
  174581. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174582. "adds r2, r2, r6\n\t"
  174583. #else
  174584. "add r2, r2, r6\n\t"
  174585. #endif
  174586. #ifdef WOLFSSL_KEIL
  174587. "adcs r3, r3, %[r]\n\t"
  174588. #elif defined(__clang__)
  174589. "adcs r3, %[r]\n\t"
  174590. #else
  174591. "adc r3, %[r]\n\t"
  174592. #endif
  174593. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174594. "adds r2, r2, r6\n\t"
  174595. #else
  174596. "add r2, r2, r6\n\t"
  174597. #endif
  174598. #ifdef WOLFSSL_KEIL
  174599. "adcs r3, r3, %[r]\n\t"
  174600. #elif defined(__clang__)
  174601. "adcs r3, %[r]\n\t"
  174602. #else
  174603. "adc r3, %[r]\n\t"
  174604. #endif
  174605. "uxth r6, r7\n\t"
  174606. #ifdef WOLFSSL_KEIL
  174607. "muls r5, r6, r5\n\t"
  174608. #elif defined(__clang__)
  174609. "muls r5, r6\n\t"
  174610. #else
  174611. "mul r5, r6\n\t"
  174612. #endif
  174613. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174614. "lsrs r6, r5, #16\n\t"
  174615. #else
  174616. "lsr r6, r5, #16\n\t"
  174617. #endif
  174618. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174619. "lsls r5, r5, #16\n\t"
  174620. #else
  174621. "lsl r5, r5, #16\n\t"
  174622. #endif
  174623. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174624. "adds r4, r4, r5\n\t"
  174625. #else
  174626. "add r4, r4, r5\n\t"
  174627. #endif
  174628. #ifdef WOLFSSL_KEIL
  174629. "adcs r2, r2, r6\n\t"
  174630. #elif defined(__clang__)
  174631. "adcs r2, r6\n\t"
  174632. #else
  174633. "adc r2, r6\n\t"
  174634. #endif
  174635. #ifdef WOLFSSL_KEIL
  174636. "adcs r3, r3, %[r]\n\t"
  174637. #elif defined(__clang__)
  174638. "adcs r3, %[r]\n\t"
  174639. #else
  174640. "adc r3, %[r]\n\t"
  174641. #endif
  174642. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174643. "adds r4, r4, r5\n\t"
  174644. #else
  174645. "add r4, r4, r5\n\t"
  174646. #endif
  174647. #ifdef WOLFSSL_KEIL
  174648. "adcs r2, r2, r6\n\t"
  174649. #elif defined(__clang__)
  174650. "adcs r2, r6\n\t"
  174651. #else
  174652. "adc r2, r6\n\t"
  174653. #endif
  174654. #ifdef WOLFSSL_KEIL
  174655. "adcs r3, r3, %[r]\n\t"
  174656. #elif defined(__clang__)
  174657. "adcs r3, %[r]\n\t"
  174658. #else
  174659. "adc r3, %[r]\n\t"
  174660. #endif
  174661. "# A[7] * A[1]\n\t"
  174662. "mov %[a], r9\n\t"
  174663. "mov r7, r11\n\t"
  174664. "ldr %[a], [%[a], #28]\n\t"
  174665. "uxth r5, %[a]\n\t"
  174666. "uxth r6, r7\n\t"
  174667. #ifdef WOLFSSL_KEIL
  174668. "muls r6, r5, r6\n\t"
  174669. #elif defined(__clang__)
  174670. "muls r6, r5\n\t"
  174671. #else
  174672. "mul r6, r5\n\t"
  174673. #endif
  174674. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174675. "adds r4, r4, r6\n\t"
  174676. #else
  174677. "add r4, r4, r6\n\t"
  174678. #endif
  174679. #ifdef WOLFSSL_KEIL
  174680. "adcs r2, r2, %[r]\n\t"
  174681. #elif defined(__clang__)
  174682. "adcs r2, %[r]\n\t"
  174683. #else
  174684. "adc r2, %[r]\n\t"
  174685. #endif
  174686. #ifdef WOLFSSL_KEIL
  174687. "adcs r3, r3, %[r]\n\t"
  174688. #elif defined(__clang__)
  174689. "adcs r3, %[r]\n\t"
  174690. #else
  174691. "adc r3, %[r]\n\t"
  174692. #endif
  174693. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174694. "adds r4, r4, r6\n\t"
  174695. #else
  174696. "add r4, r4, r6\n\t"
  174697. #endif
  174698. #ifdef WOLFSSL_KEIL
  174699. "adcs r2, r2, %[r]\n\t"
  174700. #elif defined(__clang__)
  174701. "adcs r2, %[r]\n\t"
  174702. #else
  174703. "adc r2, %[r]\n\t"
  174704. #endif
  174705. #ifdef WOLFSSL_KEIL
  174706. "adcs r3, r3, %[r]\n\t"
  174707. #elif defined(__clang__)
  174708. "adcs r3, %[r]\n\t"
  174709. #else
  174710. "adc r3, %[r]\n\t"
  174711. #endif
  174712. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174713. "lsrs r6, r7, #16\n\t"
  174714. #else
  174715. "lsr r6, r7, #16\n\t"
  174716. #endif
  174717. #ifdef WOLFSSL_KEIL
  174718. "muls r5, r6, r5\n\t"
  174719. #elif defined(__clang__)
  174720. "muls r5, r6\n\t"
  174721. #else
  174722. "mul r5, r6\n\t"
  174723. #endif
  174724. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174725. "lsrs r6, r5, #16\n\t"
  174726. #else
  174727. "lsr r6, r5, #16\n\t"
  174728. #endif
  174729. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174730. "lsls r5, r5, #16\n\t"
  174731. #else
  174732. "lsl r5, r5, #16\n\t"
  174733. #endif
  174734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174735. "adds r4, r4, r5\n\t"
  174736. #else
  174737. "add r4, r4, r5\n\t"
  174738. #endif
  174739. #ifdef WOLFSSL_KEIL
  174740. "adcs r2, r2, r6\n\t"
  174741. #elif defined(__clang__)
  174742. "adcs r2, r6\n\t"
  174743. #else
  174744. "adc r2, r6\n\t"
  174745. #endif
  174746. #ifdef WOLFSSL_KEIL
  174747. "adcs r3, r3, %[r]\n\t"
  174748. #elif defined(__clang__)
  174749. "adcs r3, %[r]\n\t"
  174750. #else
  174751. "adc r3, %[r]\n\t"
  174752. #endif
  174753. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174754. "adds r4, r4, r5\n\t"
  174755. #else
  174756. "add r4, r4, r5\n\t"
  174757. #endif
  174758. #ifdef WOLFSSL_KEIL
  174759. "adcs r2, r2, r6\n\t"
  174760. #elif defined(__clang__)
  174761. "adcs r2, r6\n\t"
  174762. #else
  174763. "adc r2, r6\n\t"
  174764. #endif
  174765. #ifdef WOLFSSL_KEIL
  174766. "adcs r3, r3, %[r]\n\t"
  174767. #elif defined(__clang__)
  174768. "adcs r3, %[r]\n\t"
  174769. #else
  174770. "adc r3, %[r]\n\t"
  174771. #endif
  174772. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174773. "lsrs r5, %[a], #16\n\t"
  174774. #else
  174775. "lsr r5, %[a], #16\n\t"
  174776. #endif
  174777. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174778. "lsrs r6, r7, #16\n\t"
  174779. #else
  174780. "lsr r6, r7, #16\n\t"
  174781. #endif
  174782. #ifdef WOLFSSL_KEIL
  174783. "muls r6, r5, r6\n\t"
  174784. #elif defined(__clang__)
  174785. "muls r6, r5\n\t"
  174786. #else
  174787. "mul r6, r5\n\t"
  174788. #endif
  174789. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174790. "adds r2, r2, r6\n\t"
  174791. #else
  174792. "add r2, r2, r6\n\t"
  174793. #endif
  174794. #ifdef WOLFSSL_KEIL
  174795. "adcs r3, r3, %[r]\n\t"
  174796. #elif defined(__clang__)
  174797. "adcs r3, %[r]\n\t"
  174798. #else
  174799. "adc r3, %[r]\n\t"
  174800. #endif
  174801. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174802. "adds r2, r2, r6\n\t"
  174803. #else
  174804. "add r2, r2, r6\n\t"
  174805. #endif
  174806. #ifdef WOLFSSL_KEIL
  174807. "adcs r3, r3, %[r]\n\t"
  174808. #elif defined(__clang__)
  174809. "adcs r3, %[r]\n\t"
  174810. #else
  174811. "adc r3, %[r]\n\t"
  174812. #endif
  174813. "uxth r6, r7\n\t"
  174814. #ifdef WOLFSSL_KEIL
  174815. "muls r5, r6, r5\n\t"
  174816. #elif defined(__clang__)
  174817. "muls r5, r6\n\t"
  174818. #else
  174819. "mul r5, r6\n\t"
  174820. #endif
  174821. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174822. "lsrs r6, r5, #16\n\t"
  174823. #else
  174824. "lsr r6, r5, #16\n\t"
  174825. #endif
  174826. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174827. "lsls r5, r5, #16\n\t"
  174828. #else
  174829. "lsl r5, r5, #16\n\t"
  174830. #endif
  174831. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174832. "adds r4, r4, r5\n\t"
  174833. #else
  174834. "add r4, r4, r5\n\t"
  174835. #endif
  174836. #ifdef WOLFSSL_KEIL
  174837. "adcs r2, r2, r6\n\t"
  174838. #elif defined(__clang__)
  174839. "adcs r2, r6\n\t"
  174840. #else
  174841. "adc r2, r6\n\t"
  174842. #endif
  174843. #ifdef WOLFSSL_KEIL
  174844. "adcs r3, r3, %[r]\n\t"
  174845. #elif defined(__clang__)
  174846. "adcs r3, %[r]\n\t"
  174847. #else
  174848. "adc r3, %[r]\n\t"
  174849. #endif
  174850. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174851. "adds r4, r4, r5\n\t"
  174852. #else
  174853. "add r4, r4, r5\n\t"
  174854. #endif
  174855. #ifdef WOLFSSL_KEIL
  174856. "adcs r2, r2, r6\n\t"
  174857. #elif defined(__clang__)
  174858. "adcs r2, r6\n\t"
  174859. #else
  174860. "adc r2, r6\n\t"
  174861. #endif
  174862. #ifdef WOLFSSL_KEIL
  174863. "adcs r3, r3, %[r]\n\t"
  174864. #elif defined(__clang__)
  174865. "adcs r3, %[r]\n\t"
  174866. #else
  174867. "adc r3, %[r]\n\t"
  174868. #endif
  174869. "# A[6] * A[2]\n\t"
  174870. "mov %[a], r9\n\t"
  174871. "mov r7, r12\n\t"
  174872. "ldr %[a], [%[a], #24]\n\t"
  174873. "uxth r5, %[a]\n\t"
  174874. "uxth r6, r7\n\t"
  174875. #ifdef WOLFSSL_KEIL
  174876. "muls r6, r5, r6\n\t"
  174877. #elif defined(__clang__)
  174878. "muls r6, r5\n\t"
  174879. #else
  174880. "mul r6, r5\n\t"
  174881. #endif
  174882. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174883. "adds r4, r4, r6\n\t"
  174884. #else
  174885. "add r4, r4, r6\n\t"
  174886. #endif
  174887. #ifdef WOLFSSL_KEIL
  174888. "adcs r2, r2, %[r]\n\t"
  174889. #elif defined(__clang__)
  174890. "adcs r2, %[r]\n\t"
  174891. #else
  174892. "adc r2, %[r]\n\t"
  174893. #endif
  174894. #ifdef WOLFSSL_KEIL
  174895. "adcs r3, r3, %[r]\n\t"
  174896. #elif defined(__clang__)
  174897. "adcs r3, %[r]\n\t"
  174898. #else
  174899. "adc r3, %[r]\n\t"
  174900. #endif
  174901. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174902. "adds r4, r4, r6\n\t"
  174903. #else
  174904. "add r4, r4, r6\n\t"
  174905. #endif
  174906. #ifdef WOLFSSL_KEIL
  174907. "adcs r2, r2, %[r]\n\t"
  174908. #elif defined(__clang__)
  174909. "adcs r2, %[r]\n\t"
  174910. #else
  174911. "adc r2, %[r]\n\t"
  174912. #endif
  174913. #ifdef WOLFSSL_KEIL
  174914. "adcs r3, r3, %[r]\n\t"
  174915. #elif defined(__clang__)
  174916. "adcs r3, %[r]\n\t"
  174917. #else
  174918. "adc r3, %[r]\n\t"
  174919. #endif
  174920. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174921. "lsrs r6, r7, #16\n\t"
  174922. #else
  174923. "lsr r6, r7, #16\n\t"
  174924. #endif
  174925. #ifdef WOLFSSL_KEIL
  174926. "muls r5, r6, r5\n\t"
  174927. #elif defined(__clang__)
  174928. "muls r5, r6\n\t"
  174929. #else
  174930. "mul r5, r6\n\t"
  174931. #endif
  174932. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174933. "lsrs r6, r5, #16\n\t"
  174934. #else
  174935. "lsr r6, r5, #16\n\t"
  174936. #endif
  174937. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174938. "lsls r5, r5, #16\n\t"
  174939. #else
  174940. "lsl r5, r5, #16\n\t"
  174941. #endif
  174942. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174943. "adds r4, r4, r5\n\t"
  174944. #else
  174945. "add r4, r4, r5\n\t"
  174946. #endif
  174947. #ifdef WOLFSSL_KEIL
  174948. "adcs r2, r2, r6\n\t"
  174949. #elif defined(__clang__)
  174950. "adcs r2, r6\n\t"
  174951. #else
  174952. "adc r2, r6\n\t"
  174953. #endif
  174954. #ifdef WOLFSSL_KEIL
  174955. "adcs r3, r3, %[r]\n\t"
  174956. #elif defined(__clang__)
  174957. "adcs r3, %[r]\n\t"
  174958. #else
  174959. "adc r3, %[r]\n\t"
  174960. #endif
  174961. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174962. "adds r4, r4, r5\n\t"
  174963. #else
  174964. "add r4, r4, r5\n\t"
  174965. #endif
  174966. #ifdef WOLFSSL_KEIL
  174967. "adcs r2, r2, r6\n\t"
  174968. #elif defined(__clang__)
  174969. "adcs r2, r6\n\t"
  174970. #else
  174971. "adc r2, r6\n\t"
  174972. #endif
  174973. #ifdef WOLFSSL_KEIL
  174974. "adcs r3, r3, %[r]\n\t"
  174975. #elif defined(__clang__)
  174976. "adcs r3, %[r]\n\t"
  174977. #else
  174978. "adc r3, %[r]\n\t"
  174979. #endif
  174980. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174981. "lsrs r5, %[a], #16\n\t"
  174982. #else
  174983. "lsr r5, %[a], #16\n\t"
  174984. #endif
  174985. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174986. "lsrs r6, r7, #16\n\t"
  174987. #else
  174988. "lsr r6, r7, #16\n\t"
  174989. #endif
  174990. #ifdef WOLFSSL_KEIL
  174991. "muls r6, r5, r6\n\t"
  174992. #elif defined(__clang__)
  174993. "muls r6, r5\n\t"
  174994. #else
  174995. "mul r6, r5\n\t"
  174996. #endif
  174997. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174998. "adds r2, r2, r6\n\t"
  174999. #else
  175000. "add r2, r2, r6\n\t"
  175001. #endif
  175002. #ifdef WOLFSSL_KEIL
  175003. "adcs r3, r3, %[r]\n\t"
  175004. #elif defined(__clang__)
  175005. "adcs r3, %[r]\n\t"
  175006. #else
  175007. "adc r3, %[r]\n\t"
  175008. #endif
  175009. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175010. "adds r2, r2, r6\n\t"
  175011. #else
  175012. "add r2, r2, r6\n\t"
  175013. #endif
  175014. #ifdef WOLFSSL_KEIL
  175015. "adcs r3, r3, %[r]\n\t"
  175016. #elif defined(__clang__)
  175017. "adcs r3, %[r]\n\t"
  175018. #else
  175019. "adc r3, %[r]\n\t"
  175020. #endif
  175021. "uxth r6, r7\n\t"
  175022. #ifdef WOLFSSL_KEIL
  175023. "muls r5, r6, r5\n\t"
  175024. #elif defined(__clang__)
  175025. "muls r5, r6\n\t"
  175026. #else
  175027. "mul r5, r6\n\t"
  175028. #endif
  175029. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175030. "lsrs r6, r5, #16\n\t"
  175031. #else
  175032. "lsr r6, r5, #16\n\t"
  175033. #endif
  175034. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175035. "lsls r5, r5, #16\n\t"
  175036. #else
  175037. "lsl r5, r5, #16\n\t"
  175038. #endif
  175039. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175040. "adds r4, r4, r5\n\t"
  175041. #else
  175042. "add r4, r4, r5\n\t"
  175043. #endif
  175044. #ifdef WOLFSSL_KEIL
  175045. "adcs r2, r2, r6\n\t"
  175046. #elif defined(__clang__)
  175047. "adcs r2, r6\n\t"
  175048. #else
  175049. "adc r2, r6\n\t"
  175050. #endif
  175051. #ifdef WOLFSSL_KEIL
  175052. "adcs r3, r3, %[r]\n\t"
  175053. #elif defined(__clang__)
  175054. "adcs r3, %[r]\n\t"
  175055. #else
  175056. "adc r3, %[r]\n\t"
  175057. #endif
  175058. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175059. "adds r4, r4, r5\n\t"
  175060. #else
  175061. "add r4, r4, r5\n\t"
  175062. #endif
  175063. #ifdef WOLFSSL_KEIL
  175064. "adcs r2, r2, r6\n\t"
  175065. #elif defined(__clang__)
  175066. "adcs r2, r6\n\t"
  175067. #else
  175068. "adc r2, r6\n\t"
  175069. #endif
  175070. #ifdef WOLFSSL_KEIL
  175071. "adcs r3, r3, %[r]\n\t"
  175072. #elif defined(__clang__)
  175073. "adcs r3, %[r]\n\t"
  175074. #else
  175075. "adc r3, %[r]\n\t"
  175076. #endif
  175077. "# A[5] * A[3]\n\t"
  175078. "mov %[a], r9\n\t"
  175079. "mov r7, lr\n\t"
  175080. "ldr %[a], [%[a], #20]\n\t"
  175081. "uxth r5, %[a]\n\t"
  175082. "uxth r6, r7\n\t"
  175083. #ifdef WOLFSSL_KEIL
  175084. "muls r6, r5, r6\n\t"
  175085. #elif defined(__clang__)
  175086. "muls r6, r5\n\t"
  175087. #else
  175088. "mul r6, r5\n\t"
  175089. #endif
  175090. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175091. "adds r4, r4, r6\n\t"
  175092. #else
  175093. "add r4, r4, r6\n\t"
  175094. #endif
  175095. #ifdef WOLFSSL_KEIL
  175096. "adcs r2, r2, %[r]\n\t"
  175097. #elif defined(__clang__)
  175098. "adcs r2, %[r]\n\t"
  175099. #else
  175100. "adc r2, %[r]\n\t"
  175101. #endif
  175102. #ifdef WOLFSSL_KEIL
  175103. "adcs r3, r3, %[r]\n\t"
  175104. #elif defined(__clang__)
  175105. "adcs r3, %[r]\n\t"
  175106. #else
  175107. "adc r3, %[r]\n\t"
  175108. #endif
  175109. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175110. "adds r4, r4, r6\n\t"
  175111. #else
  175112. "add r4, r4, r6\n\t"
  175113. #endif
  175114. #ifdef WOLFSSL_KEIL
  175115. "adcs r2, r2, %[r]\n\t"
  175116. #elif defined(__clang__)
  175117. "adcs r2, %[r]\n\t"
  175118. #else
  175119. "adc r2, %[r]\n\t"
  175120. #endif
  175121. #ifdef WOLFSSL_KEIL
  175122. "adcs r3, r3, %[r]\n\t"
  175123. #elif defined(__clang__)
  175124. "adcs r3, %[r]\n\t"
  175125. #else
  175126. "adc r3, %[r]\n\t"
  175127. #endif
  175128. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175129. "lsrs r6, r7, #16\n\t"
  175130. #else
  175131. "lsr r6, r7, #16\n\t"
  175132. #endif
  175133. #ifdef WOLFSSL_KEIL
  175134. "muls r5, r6, r5\n\t"
  175135. #elif defined(__clang__)
  175136. "muls r5, r6\n\t"
  175137. #else
  175138. "mul r5, r6\n\t"
  175139. #endif
  175140. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175141. "lsrs r6, r5, #16\n\t"
  175142. #else
  175143. "lsr r6, r5, #16\n\t"
  175144. #endif
  175145. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175146. "lsls r5, r5, #16\n\t"
  175147. #else
  175148. "lsl r5, r5, #16\n\t"
  175149. #endif
  175150. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175151. "adds r4, r4, r5\n\t"
  175152. #else
  175153. "add r4, r4, r5\n\t"
  175154. #endif
  175155. #ifdef WOLFSSL_KEIL
  175156. "adcs r2, r2, r6\n\t"
  175157. #elif defined(__clang__)
  175158. "adcs r2, r6\n\t"
  175159. #else
  175160. "adc r2, r6\n\t"
  175161. #endif
  175162. #ifdef WOLFSSL_KEIL
  175163. "adcs r3, r3, %[r]\n\t"
  175164. #elif defined(__clang__)
  175165. "adcs r3, %[r]\n\t"
  175166. #else
  175167. "adc r3, %[r]\n\t"
  175168. #endif
  175169. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175170. "adds r4, r4, r5\n\t"
  175171. #else
  175172. "add r4, r4, r5\n\t"
  175173. #endif
  175174. #ifdef WOLFSSL_KEIL
  175175. "adcs r2, r2, r6\n\t"
  175176. #elif defined(__clang__)
  175177. "adcs r2, r6\n\t"
  175178. #else
  175179. "adc r2, r6\n\t"
  175180. #endif
  175181. #ifdef WOLFSSL_KEIL
  175182. "adcs r3, r3, %[r]\n\t"
  175183. #elif defined(__clang__)
  175184. "adcs r3, %[r]\n\t"
  175185. #else
  175186. "adc r3, %[r]\n\t"
  175187. #endif
  175188. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175189. "lsrs r5, %[a], #16\n\t"
  175190. #else
  175191. "lsr r5, %[a], #16\n\t"
  175192. #endif
  175193. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175194. "lsrs r6, r7, #16\n\t"
  175195. #else
  175196. "lsr r6, r7, #16\n\t"
  175197. #endif
  175198. #ifdef WOLFSSL_KEIL
  175199. "muls r6, r5, r6\n\t"
  175200. #elif defined(__clang__)
  175201. "muls r6, r5\n\t"
  175202. #else
  175203. "mul r6, r5\n\t"
  175204. #endif
  175205. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175206. "adds r2, r2, r6\n\t"
  175207. #else
  175208. "add r2, r2, r6\n\t"
  175209. #endif
  175210. #ifdef WOLFSSL_KEIL
  175211. "adcs r3, r3, %[r]\n\t"
  175212. #elif defined(__clang__)
  175213. "adcs r3, %[r]\n\t"
  175214. #else
  175215. "adc r3, %[r]\n\t"
  175216. #endif
  175217. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175218. "adds r2, r2, r6\n\t"
  175219. #else
  175220. "add r2, r2, r6\n\t"
  175221. #endif
  175222. #ifdef WOLFSSL_KEIL
  175223. "adcs r3, r3, %[r]\n\t"
  175224. #elif defined(__clang__)
  175225. "adcs r3, %[r]\n\t"
  175226. #else
  175227. "adc r3, %[r]\n\t"
  175228. #endif
  175229. "uxth r6, r7\n\t"
  175230. #ifdef WOLFSSL_KEIL
  175231. "muls r5, r6, r5\n\t"
  175232. #elif defined(__clang__)
  175233. "muls r5, r6\n\t"
  175234. #else
  175235. "mul r5, r6\n\t"
  175236. #endif
  175237. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175238. "lsrs r6, r5, #16\n\t"
  175239. #else
  175240. "lsr r6, r5, #16\n\t"
  175241. #endif
  175242. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175243. "lsls r5, r5, #16\n\t"
  175244. #else
  175245. "lsl r5, r5, #16\n\t"
  175246. #endif
  175247. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175248. "adds r4, r4, r5\n\t"
  175249. #else
  175250. "add r4, r4, r5\n\t"
  175251. #endif
  175252. #ifdef WOLFSSL_KEIL
  175253. "adcs r2, r2, r6\n\t"
  175254. #elif defined(__clang__)
  175255. "adcs r2, r6\n\t"
  175256. #else
  175257. "adc r2, r6\n\t"
  175258. #endif
  175259. #ifdef WOLFSSL_KEIL
  175260. "adcs r3, r3, %[r]\n\t"
  175261. #elif defined(__clang__)
  175262. "adcs r3, %[r]\n\t"
  175263. #else
  175264. "adc r3, %[r]\n\t"
  175265. #endif
  175266. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175267. "adds r4, r4, r5\n\t"
  175268. #else
  175269. "add r4, r4, r5\n\t"
  175270. #endif
  175271. #ifdef WOLFSSL_KEIL
  175272. "adcs r2, r2, r6\n\t"
  175273. #elif defined(__clang__)
  175274. "adcs r2, r6\n\t"
  175275. #else
  175276. "adc r2, r6\n\t"
  175277. #endif
  175278. #ifdef WOLFSSL_KEIL
  175279. "adcs r3, r3, %[r]\n\t"
  175280. #elif defined(__clang__)
  175281. "adcs r3, %[r]\n\t"
  175282. #else
  175283. "adc r3, %[r]\n\t"
  175284. #endif
  175285. "# A[4] * A[4]\n\t"
  175286. "mov %[a], r9\n\t"
  175287. "ldr r7, [%[a], #16]\n\t"
  175288. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175289. "lsrs r6, r7, #16\n\t"
  175290. #else
  175291. "lsr r6, r7, #16\n\t"
  175292. #endif
  175293. "uxth r5, r7\n\t"
  175294. #ifdef WOLFSSL_KEIL
  175295. "muls r5, r5, r5\n\t"
  175296. #elif defined(__clang__)
  175297. "muls r5, r5\n\t"
  175298. #else
  175299. "mul r5, r5\n\t"
  175300. #endif
  175301. #ifdef WOLFSSL_KEIL
  175302. "muls r6, r6, r6\n\t"
  175303. #elif defined(__clang__)
  175304. "muls r6, r6\n\t"
  175305. #else
  175306. "mul r6, r6\n\t"
  175307. #endif
  175308. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175309. "adds r4, r4, r5\n\t"
  175310. #else
  175311. "add r4, r4, r5\n\t"
  175312. #endif
  175313. #ifdef WOLFSSL_KEIL
  175314. "adcs r2, r2, r6\n\t"
  175315. #elif defined(__clang__)
  175316. "adcs r2, r6\n\t"
  175317. #else
  175318. "adc r2, r6\n\t"
  175319. #endif
  175320. #ifdef WOLFSSL_KEIL
  175321. "adcs r3, r3, %[r]\n\t"
  175322. #elif defined(__clang__)
  175323. "adcs r3, %[r]\n\t"
  175324. #else
  175325. "adc r3, %[r]\n\t"
  175326. #endif
  175327. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175328. "lsrs r6, r7, #16\n\t"
  175329. #else
  175330. "lsr r6, r7, #16\n\t"
  175331. #endif
  175332. "uxth r5, r7\n\t"
  175333. #ifdef WOLFSSL_KEIL
  175334. "muls r5, r6, r5\n\t"
  175335. #elif defined(__clang__)
  175336. "muls r5, r6\n\t"
  175337. #else
  175338. "mul r5, r6\n\t"
  175339. #endif
  175340. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175341. "lsrs r6, r5, #15\n\t"
  175342. #else
  175343. "lsr r6, r5, #15\n\t"
  175344. #endif
  175345. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175346. "lsls r5, r5, #17\n\t"
  175347. #else
  175348. "lsl r5, r5, #17\n\t"
  175349. #endif
  175350. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175351. "adds r4, r4, r5\n\t"
  175352. #else
  175353. "add r4, r4, r5\n\t"
  175354. #endif
  175355. #ifdef WOLFSSL_KEIL
  175356. "adcs r2, r2, r6\n\t"
  175357. #elif defined(__clang__)
  175358. "adcs r2, r6\n\t"
  175359. #else
  175360. "adc r2, r6\n\t"
  175361. #endif
  175362. #ifdef WOLFSSL_KEIL
  175363. "adcs r3, r3, %[r]\n\t"
  175364. #elif defined(__clang__)
  175365. "adcs r3, %[r]\n\t"
  175366. #else
  175367. "adc r3, %[r]\n\t"
  175368. #endif
  175369. "str r4, [sp, #32]\n\t"
  175370. "# A[5] * A[4]\n\t"
  175371. "movs r4, #0\n\t"
  175372. "ldr %[a], [%[a], #20]\n\t"
  175373. "uxth r5, %[a]\n\t"
  175374. "uxth r6, r7\n\t"
  175375. #ifdef WOLFSSL_KEIL
  175376. "muls r6, r5, r6\n\t"
  175377. #elif defined(__clang__)
  175378. "muls r6, r5\n\t"
  175379. #else
  175380. "mul r6, r5\n\t"
  175381. #endif
  175382. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175383. "adds r2, r2, r6\n\t"
  175384. #else
  175385. "add r2, r2, r6\n\t"
  175386. #endif
  175387. #ifdef WOLFSSL_KEIL
  175388. "adcs r3, r3, %[r]\n\t"
  175389. #elif defined(__clang__)
  175390. "adcs r3, %[r]\n\t"
  175391. #else
  175392. "adc r3, %[r]\n\t"
  175393. #endif
  175394. #ifdef WOLFSSL_KEIL
  175395. "adcs r4, r4, %[r]\n\t"
  175396. #elif defined(__clang__)
  175397. "adcs r4, %[r]\n\t"
  175398. #else
  175399. "adc r4, %[r]\n\t"
  175400. #endif
  175401. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175402. "adds r2, r2, r6\n\t"
  175403. #else
  175404. "add r2, r2, r6\n\t"
  175405. #endif
  175406. #ifdef WOLFSSL_KEIL
  175407. "adcs r3, r3, %[r]\n\t"
  175408. #elif defined(__clang__)
  175409. "adcs r3, %[r]\n\t"
  175410. #else
  175411. "adc r3, %[r]\n\t"
  175412. #endif
  175413. #ifdef WOLFSSL_KEIL
  175414. "adcs r4, r4, %[r]\n\t"
  175415. #elif defined(__clang__)
  175416. "adcs r4, %[r]\n\t"
  175417. #else
  175418. "adc r4, %[r]\n\t"
  175419. #endif
  175420. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175421. "lsrs r6, r7, #16\n\t"
  175422. #else
  175423. "lsr r6, r7, #16\n\t"
  175424. #endif
  175425. #ifdef WOLFSSL_KEIL
  175426. "muls r5, r6, r5\n\t"
  175427. #elif defined(__clang__)
  175428. "muls r5, r6\n\t"
  175429. #else
  175430. "mul r5, r6\n\t"
  175431. #endif
  175432. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175433. "lsrs r6, r5, #16\n\t"
  175434. #else
  175435. "lsr r6, r5, #16\n\t"
  175436. #endif
  175437. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175438. "lsls r5, r5, #16\n\t"
  175439. #else
  175440. "lsl r5, r5, #16\n\t"
  175441. #endif
  175442. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175443. "adds r2, r2, r5\n\t"
  175444. #else
  175445. "add r2, r2, r5\n\t"
  175446. #endif
  175447. #ifdef WOLFSSL_KEIL
  175448. "adcs r3, r3, r6\n\t"
  175449. #elif defined(__clang__)
  175450. "adcs r3, r6\n\t"
  175451. #else
  175452. "adc r3, r6\n\t"
  175453. #endif
  175454. #ifdef WOLFSSL_KEIL
  175455. "adcs r4, r4, %[r]\n\t"
  175456. #elif defined(__clang__)
  175457. "adcs r4, %[r]\n\t"
  175458. #else
  175459. "adc r4, %[r]\n\t"
  175460. #endif
  175461. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175462. "adds r2, r2, r5\n\t"
  175463. #else
  175464. "add r2, r2, r5\n\t"
  175465. #endif
  175466. #ifdef WOLFSSL_KEIL
  175467. "adcs r3, r3, r6\n\t"
  175468. #elif defined(__clang__)
  175469. "adcs r3, r6\n\t"
  175470. #else
  175471. "adc r3, r6\n\t"
  175472. #endif
  175473. #ifdef WOLFSSL_KEIL
  175474. "adcs r4, r4, %[r]\n\t"
  175475. #elif defined(__clang__)
  175476. "adcs r4, %[r]\n\t"
  175477. #else
  175478. "adc r4, %[r]\n\t"
  175479. #endif
  175480. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175481. "lsrs r5, %[a], #16\n\t"
  175482. #else
  175483. "lsr r5, %[a], #16\n\t"
  175484. #endif
  175485. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175486. "lsrs r6, r7, #16\n\t"
  175487. #else
  175488. "lsr r6, r7, #16\n\t"
  175489. #endif
  175490. #ifdef WOLFSSL_KEIL
  175491. "muls r6, r5, r6\n\t"
  175492. #elif defined(__clang__)
  175493. "muls r6, r5\n\t"
  175494. #else
  175495. "mul r6, r5\n\t"
  175496. #endif
  175497. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175498. "adds r3, r3, r6\n\t"
  175499. #else
  175500. "add r3, r3, r6\n\t"
  175501. #endif
  175502. #ifdef WOLFSSL_KEIL
  175503. "adcs r4, r4, %[r]\n\t"
  175504. #elif defined(__clang__)
  175505. "adcs r4, %[r]\n\t"
  175506. #else
  175507. "adc r4, %[r]\n\t"
  175508. #endif
  175509. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175510. "adds r3, r3, r6\n\t"
  175511. #else
  175512. "add r3, r3, r6\n\t"
  175513. #endif
  175514. #ifdef WOLFSSL_KEIL
  175515. "adcs r4, r4, %[r]\n\t"
  175516. #elif defined(__clang__)
  175517. "adcs r4, %[r]\n\t"
  175518. #else
  175519. "adc r4, %[r]\n\t"
  175520. #endif
  175521. "uxth r6, r7\n\t"
  175522. #ifdef WOLFSSL_KEIL
  175523. "muls r5, r6, r5\n\t"
  175524. #elif defined(__clang__)
  175525. "muls r5, r6\n\t"
  175526. #else
  175527. "mul r5, r6\n\t"
  175528. #endif
  175529. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175530. "lsrs r6, r5, #16\n\t"
  175531. #else
  175532. "lsr r6, r5, #16\n\t"
  175533. #endif
  175534. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175535. "lsls r5, r5, #16\n\t"
  175536. #else
  175537. "lsl r5, r5, #16\n\t"
  175538. #endif
  175539. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175540. "adds r2, r2, r5\n\t"
  175541. #else
  175542. "add r2, r2, r5\n\t"
  175543. #endif
  175544. #ifdef WOLFSSL_KEIL
  175545. "adcs r3, r3, r6\n\t"
  175546. #elif defined(__clang__)
  175547. "adcs r3, r6\n\t"
  175548. #else
  175549. "adc r3, r6\n\t"
  175550. #endif
  175551. #ifdef WOLFSSL_KEIL
  175552. "adcs r4, r4, %[r]\n\t"
  175553. #elif defined(__clang__)
  175554. "adcs r4, %[r]\n\t"
  175555. #else
  175556. "adc r4, %[r]\n\t"
  175557. #endif
  175558. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175559. "adds r2, r2, r5\n\t"
  175560. #else
  175561. "add r2, r2, r5\n\t"
  175562. #endif
  175563. #ifdef WOLFSSL_KEIL
  175564. "adcs r3, r3, r6\n\t"
  175565. #elif defined(__clang__)
  175566. "adcs r3, r6\n\t"
  175567. #else
  175568. "adc r3, r6\n\t"
  175569. #endif
  175570. #ifdef WOLFSSL_KEIL
  175571. "adcs r4, r4, %[r]\n\t"
  175572. #elif defined(__clang__)
  175573. "adcs r4, %[r]\n\t"
  175574. #else
  175575. "adc r4, %[r]\n\t"
  175576. #endif
  175577. "# A[6] * A[3]\n\t"
  175578. "mov %[a], r9\n\t"
  175579. "mov r7, lr\n\t"
  175580. "ldr %[a], [%[a], #24]\n\t"
  175581. "uxth r5, %[a]\n\t"
  175582. "uxth r6, r7\n\t"
  175583. #ifdef WOLFSSL_KEIL
  175584. "muls r6, r5, r6\n\t"
  175585. #elif defined(__clang__)
  175586. "muls r6, r5\n\t"
  175587. #else
  175588. "mul r6, r5\n\t"
  175589. #endif
  175590. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175591. "adds r2, r2, r6\n\t"
  175592. #else
  175593. "add r2, r2, r6\n\t"
  175594. #endif
  175595. #ifdef WOLFSSL_KEIL
  175596. "adcs r3, r3, %[r]\n\t"
  175597. #elif defined(__clang__)
  175598. "adcs r3, %[r]\n\t"
  175599. #else
  175600. "adc r3, %[r]\n\t"
  175601. #endif
  175602. #ifdef WOLFSSL_KEIL
  175603. "adcs r4, r4, %[r]\n\t"
  175604. #elif defined(__clang__)
  175605. "adcs r4, %[r]\n\t"
  175606. #else
  175607. "adc r4, %[r]\n\t"
  175608. #endif
  175609. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175610. "adds r2, r2, r6\n\t"
  175611. #else
  175612. "add r2, r2, r6\n\t"
  175613. #endif
  175614. #ifdef WOLFSSL_KEIL
  175615. "adcs r3, r3, %[r]\n\t"
  175616. #elif defined(__clang__)
  175617. "adcs r3, %[r]\n\t"
  175618. #else
  175619. "adc r3, %[r]\n\t"
  175620. #endif
  175621. #ifdef WOLFSSL_KEIL
  175622. "adcs r4, r4, %[r]\n\t"
  175623. #elif defined(__clang__)
  175624. "adcs r4, %[r]\n\t"
  175625. #else
  175626. "adc r4, %[r]\n\t"
  175627. #endif
  175628. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175629. "lsrs r6, r7, #16\n\t"
  175630. #else
  175631. "lsr r6, r7, #16\n\t"
  175632. #endif
  175633. #ifdef WOLFSSL_KEIL
  175634. "muls r5, r6, r5\n\t"
  175635. #elif defined(__clang__)
  175636. "muls r5, r6\n\t"
  175637. #else
  175638. "mul r5, r6\n\t"
  175639. #endif
  175640. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175641. "lsrs r6, r5, #16\n\t"
  175642. #else
  175643. "lsr r6, r5, #16\n\t"
  175644. #endif
  175645. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175646. "lsls r5, r5, #16\n\t"
  175647. #else
  175648. "lsl r5, r5, #16\n\t"
  175649. #endif
  175650. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175651. "adds r2, r2, r5\n\t"
  175652. #else
  175653. "add r2, r2, r5\n\t"
  175654. #endif
  175655. #ifdef WOLFSSL_KEIL
  175656. "adcs r3, r3, r6\n\t"
  175657. #elif defined(__clang__)
  175658. "adcs r3, r6\n\t"
  175659. #else
  175660. "adc r3, r6\n\t"
  175661. #endif
  175662. #ifdef WOLFSSL_KEIL
  175663. "adcs r4, r4, %[r]\n\t"
  175664. #elif defined(__clang__)
  175665. "adcs r4, %[r]\n\t"
  175666. #else
  175667. "adc r4, %[r]\n\t"
  175668. #endif
  175669. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175670. "adds r2, r2, r5\n\t"
  175671. #else
  175672. "add r2, r2, r5\n\t"
  175673. #endif
  175674. #ifdef WOLFSSL_KEIL
  175675. "adcs r3, r3, r6\n\t"
  175676. #elif defined(__clang__)
  175677. "adcs r3, r6\n\t"
  175678. #else
  175679. "adc r3, r6\n\t"
  175680. #endif
  175681. #ifdef WOLFSSL_KEIL
  175682. "adcs r4, r4, %[r]\n\t"
  175683. #elif defined(__clang__)
  175684. "adcs r4, %[r]\n\t"
  175685. #else
  175686. "adc r4, %[r]\n\t"
  175687. #endif
  175688. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175689. "lsrs r5, %[a], #16\n\t"
  175690. #else
  175691. "lsr r5, %[a], #16\n\t"
  175692. #endif
  175693. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175694. "lsrs r6, r7, #16\n\t"
  175695. #else
  175696. "lsr r6, r7, #16\n\t"
  175697. #endif
  175698. #ifdef WOLFSSL_KEIL
  175699. "muls r6, r5, r6\n\t"
  175700. #elif defined(__clang__)
  175701. "muls r6, r5\n\t"
  175702. #else
  175703. "mul r6, r5\n\t"
  175704. #endif
  175705. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175706. "adds r3, r3, r6\n\t"
  175707. #else
  175708. "add r3, r3, r6\n\t"
  175709. #endif
  175710. #ifdef WOLFSSL_KEIL
  175711. "adcs r4, r4, %[r]\n\t"
  175712. #elif defined(__clang__)
  175713. "adcs r4, %[r]\n\t"
  175714. #else
  175715. "adc r4, %[r]\n\t"
  175716. #endif
  175717. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175718. "adds r3, r3, r6\n\t"
  175719. #else
  175720. "add r3, r3, r6\n\t"
  175721. #endif
  175722. #ifdef WOLFSSL_KEIL
  175723. "adcs r4, r4, %[r]\n\t"
  175724. #elif defined(__clang__)
  175725. "adcs r4, %[r]\n\t"
  175726. #else
  175727. "adc r4, %[r]\n\t"
  175728. #endif
  175729. "uxth r6, r7\n\t"
  175730. #ifdef WOLFSSL_KEIL
  175731. "muls r5, r6, r5\n\t"
  175732. #elif defined(__clang__)
  175733. "muls r5, r6\n\t"
  175734. #else
  175735. "mul r5, r6\n\t"
  175736. #endif
  175737. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175738. "lsrs r6, r5, #16\n\t"
  175739. #else
  175740. "lsr r6, r5, #16\n\t"
  175741. #endif
  175742. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175743. "lsls r5, r5, #16\n\t"
  175744. #else
  175745. "lsl r5, r5, #16\n\t"
  175746. #endif
  175747. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175748. "adds r2, r2, r5\n\t"
  175749. #else
  175750. "add r2, r2, r5\n\t"
  175751. #endif
  175752. #ifdef WOLFSSL_KEIL
  175753. "adcs r3, r3, r6\n\t"
  175754. #elif defined(__clang__)
  175755. "adcs r3, r6\n\t"
  175756. #else
  175757. "adc r3, r6\n\t"
  175758. #endif
  175759. #ifdef WOLFSSL_KEIL
  175760. "adcs r4, r4, %[r]\n\t"
  175761. #elif defined(__clang__)
  175762. "adcs r4, %[r]\n\t"
  175763. #else
  175764. "adc r4, %[r]\n\t"
  175765. #endif
  175766. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175767. "adds r2, r2, r5\n\t"
  175768. #else
  175769. "add r2, r2, r5\n\t"
  175770. #endif
  175771. #ifdef WOLFSSL_KEIL
  175772. "adcs r3, r3, r6\n\t"
  175773. #elif defined(__clang__)
  175774. "adcs r3, r6\n\t"
  175775. #else
  175776. "adc r3, r6\n\t"
  175777. #endif
  175778. #ifdef WOLFSSL_KEIL
  175779. "adcs r4, r4, %[r]\n\t"
  175780. #elif defined(__clang__)
  175781. "adcs r4, %[r]\n\t"
  175782. #else
  175783. "adc r4, %[r]\n\t"
  175784. #endif
  175785. "# A[7] * A[2]\n\t"
  175786. "mov %[a], r9\n\t"
  175787. "mov r7, r12\n\t"
  175788. "ldr %[a], [%[a], #28]\n\t"
  175789. "uxth r5, %[a]\n\t"
  175790. "uxth r6, r7\n\t"
  175791. #ifdef WOLFSSL_KEIL
  175792. "muls r6, r5, r6\n\t"
  175793. #elif defined(__clang__)
  175794. "muls r6, r5\n\t"
  175795. #else
  175796. "mul r6, r5\n\t"
  175797. #endif
  175798. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175799. "adds r2, r2, r6\n\t"
  175800. #else
  175801. "add r2, r2, r6\n\t"
  175802. #endif
  175803. #ifdef WOLFSSL_KEIL
  175804. "adcs r3, r3, %[r]\n\t"
  175805. #elif defined(__clang__)
  175806. "adcs r3, %[r]\n\t"
  175807. #else
  175808. "adc r3, %[r]\n\t"
  175809. #endif
  175810. #ifdef WOLFSSL_KEIL
  175811. "adcs r4, r4, %[r]\n\t"
  175812. #elif defined(__clang__)
  175813. "adcs r4, %[r]\n\t"
  175814. #else
  175815. "adc r4, %[r]\n\t"
  175816. #endif
  175817. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175818. "adds r2, r2, r6\n\t"
  175819. #else
  175820. "add r2, r2, r6\n\t"
  175821. #endif
  175822. #ifdef WOLFSSL_KEIL
  175823. "adcs r3, r3, %[r]\n\t"
  175824. #elif defined(__clang__)
  175825. "adcs r3, %[r]\n\t"
  175826. #else
  175827. "adc r3, %[r]\n\t"
  175828. #endif
  175829. #ifdef WOLFSSL_KEIL
  175830. "adcs r4, r4, %[r]\n\t"
  175831. #elif defined(__clang__)
  175832. "adcs r4, %[r]\n\t"
  175833. #else
  175834. "adc r4, %[r]\n\t"
  175835. #endif
  175836. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175837. "lsrs r6, r7, #16\n\t"
  175838. #else
  175839. "lsr r6, r7, #16\n\t"
  175840. #endif
  175841. #ifdef WOLFSSL_KEIL
  175842. "muls r5, r6, r5\n\t"
  175843. #elif defined(__clang__)
  175844. "muls r5, r6\n\t"
  175845. #else
  175846. "mul r5, r6\n\t"
  175847. #endif
  175848. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175849. "lsrs r6, r5, #16\n\t"
  175850. #else
  175851. "lsr r6, r5, #16\n\t"
  175852. #endif
  175853. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175854. "lsls r5, r5, #16\n\t"
  175855. #else
  175856. "lsl r5, r5, #16\n\t"
  175857. #endif
  175858. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175859. "adds r2, r2, r5\n\t"
  175860. #else
  175861. "add r2, r2, r5\n\t"
  175862. #endif
  175863. #ifdef WOLFSSL_KEIL
  175864. "adcs r3, r3, r6\n\t"
  175865. #elif defined(__clang__)
  175866. "adcs r3, r6\n\t"
  175867. #else
  175868. "adc r3, r6\n\t"
  175869. #endif
  175870. #ifdef WOLFSSL_KEIL
  175871. "adcs r4, r4, %[r]\n\t"
  175872. #elif defined(__clang__)
  175873. "adcs r4, %[r]\n\t"
  175874. #else
  175875. "adc r4, %[r]\n\t"
  175876. #endif
  175877. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175878. "adds r2, r2, r5\n\t"
  175879. #else
  175880. "add r2, r2, r5\n\t"
  175881. #endif
  175882. #ifdef WOLFSSL_KEIL
  175883. "adcs r3, r3, r6\n\t"
  175884. #elif defined(__clang__)
  175885. "adcs r3, r6\n\t"
  175886. #else
  175887. "adc r3, r6\n\t"
  175888. #endif
  175889. #ifdef WOLFSSL_KEIL
  175890. "adcs r4, r4, %[r]\n\t"
  175891. #elif defined(__clang__)
  175892. "adcs r4, %[r]\n\t"
  175893. #else
  175894. "adc r4, %[r]\n\t"
  175895. #endif
  175896. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175897. "lsrs r5, %[a], #16\n\t"
  175898. #else
  175899. "lsr r5, %[a], #16\n\t"
  175900. #endif
  175901. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175902. "lsrs r6, r7, #16\n\t"
  175903. #else
  175904. "lsr r6, r7, #16\n\t"
  175905. #endif
  175906. #ifdef WOLFSSL_KEIL
  175907. "muls r6, r5, r6\n\t"
  175908. #elif defined(__clang__)
  175909. "muls r6, r5\n\t"
  175910. #else
  175911. "mul r6, r5\n\t"
  175912. #endif
  175913. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175914. "adds r3, r3, r6\n\t"
  175915. #else
  175916. "add r3, r3, r6\n\t"
  175917. #endif
  175918. #ifdef WOLFSSL_KEIL
  175919. "adcs r4, r4, %[r]\n\t"
  175920. #elif defined(__clang__)
  175921. "adcs r4, %[r]\n\t"
  175922. #else
  175923. "adc r4, %[r]\n\t"
  175924. #endif
  175925. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175926. "adds r3, r3, r6\n\t"
  175927. #else
  175928. "add r3, r3, r6\n\t"
  175929. #endif
  175930. #ifdef WOLFSSL_KEIL
  175931. "adcs r4, r4, %[r]\n\t"
  175932. #elif defined(__clang__)
  175933. "adcs r4, %[r]\n\t"
  175934. #else
  175935. "adc r4, %[r]\n\t"
  175936. #endif
  175937. "uxth r6, r7\n\t"
  175938. #ifdef WOLFSSL_KEIL
  175939. "muls r5, r6, r5\n\t"
  175940. #elif defined(__clang__)
  175941. "muls r5, r6\n\t"
  175942. #else
  175943. "mul r5, r6\n\t"
  175944. #endif
  175945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175946. "lsrs r6, r5, #16\n\t"
  175947. #else
  175948. "lsr r6, r5, #16\n\t"
  175949. #endif
  175950. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175951. "lsls r5, r5, #16\n\t"
  175952. #else
  175953. "lsl r5, r5, #16\n\t"
  175954. #endif
  175955. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175956. "adds r2, r2, r5\n\t"
  175957. #else
  175958. "add r2, r2, r5\n\t"
  175959. #endif
  175960. #ifdef WOLFSSL_KEIL
  175961. "adcs r3, r3, r6\n\t"
  175962. #elif defined(__clang__)
  175963. "adcs r3, r6\n\t"
  175964. #else
  175965. "adc r3, r6\n\t"
  175966. #endif
  175967. #ifdef WOLFSSL_KEIL
  175968. "adcs r4, r4, %[r]\n\t"
  175969. #elif defined(__clang__)
  175970. "adcs r4, %[r]\n\t"
  175971. #else
  175972. "adc r4, %[r]\n\t"
  175973. #endif
  175974. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175975. "adds r2, r2, r5\n\t"
  175976. #else
  175977. "add r2, r2, r5\n\t"
  175978. #endif
  175979. #ifdef WOLFSSL_KEIL
  175980. "adcs r3, r3, r6\n\t"
  175981. #elif defined(__clang__)
  175982. "adcs r3, r6\n\t"
  175983. #else
  175984. "adc r3, r6\n\t"
  175985. #endif
  175986. #ifdef WOLFSSL_KEIL
  175987. "adcs r4, r4, %[r]\n\t"
  175988. #elif defined(__clang__)
  175989. "adcs r4, %[r]\n\t"
  175990. #else
  175991. "adc r4, %[r]\n\t"
  175992. #endif
  175993. "# A[8] * A[1]\n\t"
  175994. "mov %[a], r9\n\t"
  175995. "mov r7, r11\n\t"
  175996. "ldr %[a], [%[a], #32]\n\t"
  175997. "uxth r5, %[a]\n\t"
  175998. "uxth r6, r7\n\t"
  175999. #ifdef WOLFSSL_KEIL
  176000. "muls r6, r5, r6\n\t"
  176001. #elif defined(__clang__)
  176002. "muls r6, r5\n\t"
  176003. #else
  176004. "mul r6, r5\n\t"
  176005. #endif
  176006. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176007. "adds r2, r2, r6\n\t"
  176008. #else
  176009. "add r2, r2, r6\n\t"
  176010. #endif
  176011. #ifdef WOLFSSL_KEIL
  176012. "adcs r3, r3, %[r]\n\t"
  176013. #elif defined(__clang__)
  176014. "adcs r3, %[r]\n\t"
  176015. #else
  176016. "adc r3, %[r]\n\t"
  176017. #endif
  176018. #ifdef WOLFSSL_KEIL
  176019. "adcs r4, r4, %[r]\n\t"
  176020. #elif defined(__clang__)
  176021. "adcs r4, %[r]\n\t"
  176022. #else
  176023. "adc r4, %[r]\n\t"
  176024. #endif
  176025. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176026. "adds r2, r2, r6\n\t"
  176027. #else
  176028. "add r2, r2, r6\n\t"
  176029. #endif
  176030. #ifdef WOLFSSL_KEIL
  176031. "adcs r3, r3, %[r]\n\t"
  176032. #elif defined(__clang__)
  176033. "adcs r3, %[r]\n\t"
  176034. #else
  176035. "adc r3, %[r]\n\t"
  176036. #endif
  176037. #ifdef WOLFSSL_KEIL
  176038. "adcs r4, r4, %[r]\n\t"
  176039. #elif defined(__clang__)
  176040. "adcs r4, %[r]\n\t"
  176041. #else
  176042. "adc r4, %[r]\n\t"
  176043. #endif
  176044. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176045. "lsrs r6, r7, #16\n\t"
  176046. #else
  176047. "lsr r6, r7, #16\n\t"
  176048. #endif
  176049. #ifdef WOLFSSL_KEIL
  176050. "muls r5, r6, r5\n\t"
  176051. #elif defined(__clang__)
  176052. "muls r5, r6\n\t"
  176053. #else
  176054. "mul r5, r6\n\t"
  176055. #endif
  176056. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176057. "lsrs r6, r5, #16\n\t"
  176058. #else
  176059. "lsr r6, r5, #16\n\t"
  176060. #endif
  176061. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176062. "lsls r5, r5, #16\n\t"
  176063. #else
  176064. "lsl r5, r5, #16\n\t"
  176065. #endif
  176066. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176067. "adds r2, r2, r5\n\t"
  176068. #else
  176069. "add r2, r2, r5\n\t"
  176070. #endif
  176071. #ifdef WOLFSSL_KEIL
  176072. "adcs r3, r3, r6\n\t"
  176073. #elif defined(__clang__)
  176074. "adcs r3, r6\n\t"
  176075. #else
  176076. "adc r3, r6\n\t"
  176077. #endif
  176078. #ifdef WOLFSSL_KEIL
  176079. "adcs r4, r4, %[r]\n\t"
  176080. #elif defined(__clang__)
  176081. "adcs r4, %[r]\n\t"
  176082. #else
  176083. "adc r4, %[r]\n\t"
  176084. #endif
  176085. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176086. "adds r2, r2, r5\n\t"
  176087. #else
  176088. "add r2, r2, r5\n\t"
  176089. #endif
  176090. #ifdef WOLFSSL_KEIL
  176091. "adcs r3, r3, r6\n\t"
  176092. #elif defined(__clang__)
  176093. "adcs r3, r6\n\t"
  176094. #else
  176095. "adc r3, r6\n\t"
  176096. #endif
  176097. #ifdef WOLFSSL_KEIL
  176098. "adcs r4, r4, %[r]\n\t"
  176099. #elif defined(__clang__)
  176100. "adcs r4, %[r]\n\t"
  176101. #else
  176102. "adc r4, %[r]\n\t"
  176103. #endif
  176104. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176105. "lsrs r5, %[a], #16\n\t"
  176106. #else
  176107. "lsr r5, %[a], #16\n\t"
  176108. #endif
  176109. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176110. "lsrs r6, r7, #16\n\t"
  176111. #else
  176112. "lsr r6, r7, #16\n\t"
  176113. #endif
  176114. #ifdef WOLFSSL_KEIL
  176115. "muls r6, r5, r6\n\t"
  176116. #elif defined(__clang__)
  176117. "muls r6, r5\n\t"
  176118. #else
  176119. "mul r6, r5\n\t"
  176120. #endif
  176121. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176122. "adds r3, r3, r6\n\t"
  176123. #else
  176124. "add r3, r3, r6\n\t"
  176125. #endif
  176126. #ifdef WOLFSSL_KEIL
  176127. "adcs r4, r4, %[r]\n\t"
  176128. #elif defined(__clang__)
  176129. "adcs r4, %[r]\n\t"
  176130. #else
  176131. "adc r4, %[r]\n\t"
  176132. #endif
  176133. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176134. "adds r3, r3, r6\n\t"
  176135. #else
  176136. "add r3, r3, r6\n\t"
  176137. #endif
  176138. #ifdef WOLFSSL_KEIL
  176139. "adcs r4, r4, %[r]\n\t"
  176140. #elif defined(__clang__)
  176141. "adcs r4, %[r]\n\t"
  176142. #else
  176143. "adc r4, %[r]\n\t"
  176144. #endif
  176145. "uxth r6, r7\n\t"
  176146. #ifdef WOLFSSL_KEIL
  176147. "muls r5, r6, r5\n\t"
  176148. #elif defined(__clang__)
  176149. "muls r5, r6\n\t"
  176150. #else
  176151. "mul r5, r6\n\t"
  176152. #endif
  176153. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176154. "lsrs r6, r5, #16\n\t"
  176155. #else
  176156. "lsr r6, r5, #16\n\t"
  176157. #endif
  176158. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176159. "lsls r5, r5, #16\n\t"
  176160. #else
  176161. "lsl r5, r5, #16\n\t"
  176162. #endif
  176163. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176164. "adds r2, r2, r5\n\t"
  176165. #else
  176166. "add r2, r2, r5\n\t"
  176167. #endif
  176168. #ifdef WOLFSSL_KEIL
  176169. "adcs r3, r3, r6\n\t"
  176170. #elif defined(__clang__)
  176171. "adcs r3, r6\n\t"
  176172. #else
  176173. "adc r3, r6\n\t"
  176174. #endif
  176175. #ifdef WOLFSSL_KEIL
  176176. "adcs r4, r4, %[r]\n\t"
  176177. #elif defined(__clang__)
  176178. "adcs r4, %[r]\n\t"
  176179. #else
  176180. "adc r4, %[r]\n\t"
  176181. #endif
  176182. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176183. "adds r2, r2, r5\n\t"
  176184. #else
  176185. "add r2, r2, r5\n\t"
  176186. #endif
  176187. #ifdef WOLFSSL_KEIL
  176188. "adcs r3, r3, r6\n\t"
  176189. #elif defined(__clang__)
  176190. "adcs r3, r6\n\t"
  176191. #else
  176192. "adc r3, r6\n\t"
  176193. #endif
  176194. #ifdef WOLFSSL_KEIL
  176195. "adcs r4, r4, %[r]\n\t"
  176196. #elif defined(__clang__)
  176197. "adcs r4, %[r]\n\t"
  176198. #else
  176199. "adc r4, %[r]\n\t"
  176200. #endif
  176201. "# A[9] * A[0]\n\t"
  176202. "mov %[a], r9\n\t"
  176203. "mov r7, r10\n\t"
  176204. "ldr %[a], [%[a], #36]\n\t"
  176205. "uxth r5, %[a]\n\t"
  176206. "uxth r6, r7\n\t"
  176207. #ifdef WOLFSSL_KEIL
  176208. "muls r6, r5, r6\n\t"
  176209. #elif defined(__clang__)
  176210. "muls r6, r5\n\t"
  176211. #else
  176212. "mul r6, r5\n\t"
  176213. #endif
  176214. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176215. "adds r2, r2, r6\n\t"
  176216. #else
  176217. "add r2, r2, r6\n\t"
  176218. #endif
  176219. #ifdef WOLFSSL_KEIL
  176220. "adcs r3, r3, %[r]\n\t"
  176221. #elif defined(__clang__)
  176222. "adcs r3, %[r]\n\t"
  176223. #else
  176224. "adc r3, %[r]\n\t"
  176225. #endif
  176226. #ifdef WOLFSSL_KEIL
  176227. "adcs r4, r4, %[r]\n\t"
  176228. #elif defined(__clang__)
  176229. "adcs r4, %[r]\n\t"
  176230. #else
  176231. "adc r4, %[r]\n\t"
  176232. #endif
  176233. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176234. "adds r2, r2, r6\n\t"
  176235. #else
  176236. "add r2, r2, r6\n\t"
  176237. #endif
  176238. #ifdef WOLFSSL_KEIL
  176239. "adcs r3, r3, %[r]\n\t"
  176240. #elif defined(__clang__)
  176241. "adcs r3, %[r]\n\t"
  176242. #else
  176243. "adc r3, %[r]\n\t"
  176244. #endif
  176245. #ifdef WOLFSSL_KEIL
  176246. "adcs r4, r4, %[r]\n\t"
  176247. #elif defined(__clang__)
  176248. "adcs r4, %[r]\n\t"
  176249. #else
  176250. "adc r4, %[r]\n\t"
  176251. #endif
  176252. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176253. "lsrs r6, r7, #16\n\t"
  176254. #else
  176255. "lsr r6, r7, #16\n\t"
  176256. #endif
  176257. #ifdef WOLFSSL_KEIL
  176258. "muls r5, r6, r5\n\t"
  176259. #elif defined(__clang__)
  176260. "muls r5, r6\n\t"
  176261. #else
  176262. "mul r5, r6\n\t"
  176263. #endif
  176264. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176265. "lsrs r6, r5, #16\n\t"
  176266. #else
  176267. "lsr r6, r5, #16\n\t"
  176268. #endif
  176269. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176270. "lsls r5, r5, #16\n\t"
  176271. #else
  176272. "lsl r5, r5, #16\n\t"
  176273. #endif
  176274. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176275. "adds r2, r2, r5\n\t"
  176276. #else
  176277. "add r2, r2, r5\n\t"
  176278. #endif
  176279. #ifdef WOLFSSL_KEIL
  176280. "adcs r3, r3, r6\n\t"
  176281. #elif defined(__clang__)
  176282. "adcs r3, r6\n\t"
  176283. #else
  176284. "adc r3, r6\n\t"
  176285. #endif
  176286. #ifdef WOLFSSL_KEIL
  176287. "adcs r4, r4, %[r]\n\t"
  176288. #elif defined(__clang__)
  176289. "adcs r4, %[r]\n\t"
  176290. #else
  176291. "adc r4, %[r]\n\t"
  176292. #endif
  176293. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176294. "adds r2, r2, r5\n\t"
  176295. #else
  176296. "add r2, r2, r5\n\t"
  176297. #endif
  176298. #ifdef WOLFSSL_KEIL
  176299. "adcs r3, r3, r6\n\t"
  176300. #elif defined(__clang__)
  176301. "adcs r3, r6\n\t"
  176302. #else
  176303. "adc r3, r6\n\t"
  176304. #endif
  176305. #ifdef WOLFSSL_KEIL
  176306. "adcs r4, r4, %[r]\n\t"
  176307. #elif defined(__clang__)
  176308. "adcs r4, %[r]\n\t"
  176309. #else
  176310. "adc r4, %[r]\n\t"
  176311. #endif
  176312. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176313. "lsrs r5, %[a], #16\n\t"
  176314. #else
  176315. "lsr r5, %[a], #16\n\t"
  176316. #endif
  176317. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176318. "lsrs r6, r7, #16\n\t"
  176319. #else
  176320. "lsr r6, r7, #16\n\t"
  176321. #endif
  176322. #ifdef WOLFSSL_KEIL
  176323. "muls r6, r5, r6\n\t"
  176324. #elif defined(__clang__)
  176325. "muls r6, r5\n\t"
  176326. #else
  176327. "mul r6, r5\n\t"
  176328. #endif
  176329. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176330. "adds r3, r3, r6\n\t"
  176331. #else
  176332. "add r3, r3, r6\n\t"
  176333. #endif
  176334. #ifdef WOLFSSL_KEIL
  176335. "adcs r4, r4, %[r]\n\t"
  176336. #elif defined(__clang__)
  176337. "adcs r4, %[r]\n\t"
  176338. #else
  176339. "adc r4, %[r]\n\t"
  176340. #endif
  176341. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176342. "adds r3, r3, r6\n\t"
  176343. #else
  176344. "add r3, r3, r6\n\t"
  176345. #endif
  176346. #ifdef WOLFSSL_KEIL
  176347. "adcs r4, r4, %[r]\n\t"
  176348. #elif defined(__clang__)
  176349. "adcs r4, %[r]\n\t"
  176350. #else
  176351. "adc r4, %[r]\n\t"
  176352. #endif
  176353. "uxth r6, r7\n\t"
  176354. #ifdef WOLFSSL_KEIL
  176355. "muls r5, r6, r5\n\t"
  176356. #elif defined(__clang__)
  176357. "muls r5, r6\n\t"
  176358. #else
  176359. "mul r5, r6\n\t"
  176360. #endif
  176361. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176362. "lsrs r6, r5, #16\n\t"
  176363. #else
  176364. "lsr r6, r5, #16\n\t"
  176365. #endif
  176366. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176367. "lsls r5, r5, #16\n\t"
  176368. #else
  176369. "lsl r5, r5, #16\n\t"
  176370. #endif
  176371. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176372. "adds r2, r2, r5\n\t"
  176373. #else
  176374. "add r2, r2, r5\n\t"
  176375. #endif
  176376. #ifdef WOLFSSL_KEIL
  176377. "adcs r3, r3, r6\n\t"
  176378. #elif defined(__clang__)
  176379. "adcs r3, r6\n\t"
  176380. #else
  176381. "adc r3, r6\n\t"
  176382. #endif
  176383. #ifdef WOLFSSL_KEIL
  176384. "adcs r4, r4, %[r]\n\t"
  176385. #elif defined(__clang__)
  176386. "adcs r4, %[r]\n\t"
  176387. #else
  176388. "adc r4, %[r]\n\t"
  176389. #endif
  176390. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176391. "adds r2, r2, r5\n\t"
  176392. #else
  176393. "add r2, r2, r5\n\t"
  176394. #endif
  176395. #ifdef WOLFSSL_KEIL
  176396. "adcs r3, r3, r6\n\t"
  176397. #elif defined(__clang__)
  176398. "adcs r3, r6\n\t"
  176399. #else
  176400. "adc r3, r6\n\t"
  176401. #endif
  176402. #ifdef WOLFSSL_KEIL
  176403. "adcs r4, r4, %[r]\n\t"
  176404. #elif defined(__clang__)
  176405. "adcs r4, %[r]\n\t"
  176406. #else
  176407. "adc r4, %[r]\n\t"
  176408. #endif
  176409. "str r2, [sp, #36]\n\t"
  176410. "# A[10] * A[0]\n\t"
  176411. "movs r2, #0\n\t"
  176412. "mov %[a], r9\n\t"
  176413. "ldr %[a], [%[a], #40]\n\t"
  176414. "uxth r5, %[a]\n\t"
  176415. "uxth r6, r7\n\t"
  176416. #ifdef WOLFSSL_KEIL
  176417. "muls r6, r5, r6\n\t"
  176418. #elif defined(__clang__)
  176419. "muls r6, r5\n\t"
  176420. #else
  176421. "mul r6, r5\n\t"
  176422. #endif
  176423. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176424. "adds r3, r3, r6\n\t"
  176425. #else
  176426. "add r3, r3, r6\n\t"
  176427. #endif
  176428. #ifdef WOLFSSL_KEIL
  176429. "adcs r4, r4, %[r]\n\t"
  176430. #elif defined(__clang__)
  176431. "adcs r4, %[r]\n\t"
  176432. #else
  176433. "adc r4, %[r]\n\t"
  176434. #endif
  176435. #ifdef WOLFSSL_KEIL
  176436. "adcs r2, r2, %[r]\n\t"
  176437. #elif defined(__clang__)
  176438. "adcs r2, %[r]\n\t"
  176439. #else
  176440. "adc r2, %[r]\n\t"
  176441. #endif
  176442. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176443. "adds r3, r3, r6\n\t"
  176444. #else
  176445. "add r3, r3, r6\n\t"
  176446. #endif
  176447. #ifdef WOLFSSL_KEIL
  176448. "adcs r4, r4, %[r]\n\t"
  176449. #elif defined(__clang__)
  176450. "adcs r4, %[r]\n\t"
  176451. #else
  176452. "adc r4, %[r]\n\t"
  176453. #endif
  176454. #ifdef WOLFSSL_KEIL
  176455. "adcs r2, r2, %[r]\n\t"
  176456. #elif defined(__clang__)
  176457. "adcs r2, %[r]\n\t"
  176458. #else
  176459. "adc r2, %[r]\n\t"
  176460. #endif
  176461. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176462. "lsrs r6, r7, #16\n\t"
  176463. #else
  176464. "lsr r6, r7, #16\n\t"
  176465. #endif
  176466. #ifdef WOLFSSL_KEIL
  176467. "muls r5, r6, r5\n\t"
  176468. #elif defined(__clang__)
  176469. "muls r5, r6\n\t"
  176470. #else
  176471. "mul r5, r6\n\t"
  176472. #endif
  176473. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176474. "lsrs r6, r5, #16\n\t"
  176475. #else
  176476. "lsr r6, r5, #16\n\t"
  176477. #endif
  176478. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176479. "lsls r5, r5, #16\n\t"
  176480. #else
  176481. "lsl r5, r5, #16\n\t"
  176482. #endif
  176483. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176484. "adds r3, r3, r5\n\t"
  176485. #else
  176486. "add r3, r3, r5\n\t"
  176487. #endif
  176488. #ifdef WOLFSSL_KEIL
  176489. "adcs r4, r4, r6\n\t"
  176490. #elif defined(__clang__)
  176491. "adcs r4, r6\n\t"
  176492. #else
  176493. "adc r4, r6\n\t"
  176494. #endif
  176495. #ifdef WOLFSSL_KEIL
  176496. "adcs r2, r2, %[r]\n\t"
  176497. #elif defined(__clang__)
  176498. "adcs r2, %[r]\n\t"
  176499. #else
  176500. "adc r2, %[r]\n\t"
  176501. #endif
  176502. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176503. "adds r3, r3, r5\n\t"
  176504. #else
  176505. "add r3, r3, r5\n\t"
  176506. #endif
  176507. #ifdef WOLFSSL_KEIL
  176508. "adcs r4, r4, r6\n\t"
  176509. #elif defined(__clang__)
  176510. "adcs r4, r6\n\t"
  176511. #else
  176512. "adc r4, r6\n\t"
  176513. #endif
  176514. #ifdef WOLFSSL_KEIL
  176515. "adcs r2, r2, %[r]\n\t"
  176516. #elif defined(__clang__)
  176517. "adcs r2, %[r]\n\t"
  176518. #else
  176519. "adc r2, %[r]\n\t"
  176520. #endif
  176521. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176522. "lsrs r5, %[a], #16\n\t"
  176523. #else
  176524. "lsr r5, %[a], #16\n\t"
  176525. #endif
  176526. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176527. "lsrs r6, r7, #16\n\t"
  176528. #else
  176529. "lsr r6, r7, #16\n\t"
  176530. #endif
  176531. #ifdef WOLFSSL_KEIL
  176532. "muls r6, r5, r6\n\t"
  176533. #elif defined(__clang__)
  176534. "muls r6, r5\n\t"
  176535. #else
  176536. "mul r6, r5\n\t"
  176537. #endif
  176538. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176539. "adds r4, r4, r6\n\t"
  176540. #else
  176541. "add r4, r4, r6\n\t"
  176542. #endif
  176543. #ifdef WOLFSSL_KEIL
  176544. "adcs r2, r2, %[r]\n\t"
  176545. #elif defined(__clang__)
  176546. "adcs r2, %[r]\n\t"
  176547. #else
  176548. "adc r2, %[r]\n\t"
  176549. #endif
  176550. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176551. "adds r4, r4, r6\n\t"
  176552. #else
  176553. "add r4, r4, r6\n\t"
  176554. #endif
  176555. #ifdef WOLFSSL_KEIL
  176556. "adcs r2, r2, %[r]\n\t"
  176557. #elif defined(__clang__)
  176558. "adcs r2, %[r]\n\t"
  176559. #else
  176560. "adc r2, %[r]\n\t"
  176561. #endif
  176562. "uxth r6, r7\n\t"
  176563. #ifdef WOLFSSL_KEIL
  176564. "muls r5, r6, r5\n\t"
  176565. #elif defined(__clang__)
  176566. "muls r5, r6\n\t"
  176567. #else
  176568. "mul r5, r6\n\t"
  176569. #endif
  176570. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176571. "lsrs r6, r5, #16\n\t"
  176572. #else
  176573. "lsr r6, r5, #16\n\t"
  176574. #endif
  176575. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176576. "lsls r5, r5, #16\n\t"
  176577. #else
  176578. "lsl r5, r5, #16\n\t"
  176579. #endif
  176580. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176581. "adds r3, r3, r5\n\t"
  176582. #else
  176583. "add r3, r3, r5\n\t"
  176584. #endif
  176585. #ifdef WOLFSSL_KEIL
  176586. "adcs r4, r4, r6\n\t"
  176587. #elif defined(__clang__)
  176588. "adcs r4, r6\n\t"
  176589. #else
  176590. "adc r4, r6\n\t"
  176591. #endif
  176592. #ifdef WOLFSSL_KEIL
  176593. "adcs r2, r2, %[r]\n\t"
  176594. #elif defined(__clang__)
  176595. "adcs r2, %[r]\n\t"
  176596. #else
  176597. "adc r2, %[r]\n\t"
  176598. #endif
  176599. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176600. "adds r3, r3, r5\n\t"
  176601. #else
  176602. "add r3, r3, r5\n\t"
  176603. #endif
  176604. #ifdef WOLFSSL_KEIL
  176605. "adcs r4, r4, r6\n\t"
  176606. #elif defined(__clang__)
  176607. "adcs r4, r6\n\t"
  176608. #else
  176609. "adc r4, r6\n\t"
  176610. #endif
  176611. #ifdef WOLFSSL_KEIL
  176612. "adcs r2, r2, %[r]\n\t"
  176613. #elif defined(__clang__)
  176614. "adcs r2, %[r]\n\t"
  176615. #else
  176616. "adc r2, %[r]\n\t"
  176617. #endif
  176618. "# A[9] * A[1]\n\t"
  176619. "mov %[a], r9\n\t"
  176620. "mov r7, r11\n\t"
  176621. "ldr %[a], [%[a], #36]\n\t"
  176622. "uxth r5, %[a]\n\t"
  176623. "uxth r6, r7\n\t"
  176624. #ifdef WOLFSSL_KEIL
  176625. "muls r6, r5, r6\n\t"
  176626. #elif defined(__clang__)
  176627. "muls r6, r5\n\t"
  176628. #else
  176629. "mul r6, r5\n\t"
  176630. #endif
  176631. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176632. "adds r3, r3, r6\n\t"
  176633. #else
  176634. "add r3, r3, r6\n\t"
  176635. #endif
  176636. #ifdef WOLFSSL_KEIL
  176637. "adcs r4, r4, %[r]\n\t"
  176638. #elif defined(__clang__)
  176639. "adcs r4, %[r]\n\t"
  176640. #else
  176641. "adc r4, %[r]\n\t"
  176642. #endif
  176643. #ifdef WOLFSSL_KEIL
  176644. "adcs r2, r2, %[r]\n\t"
  176645. #elif defined(__clang__)
  176646. "adcs r2, %[r]\n\t"
  176647. #else
  176648. "adc r2, %[r]\n\t"
  176649. #endif
  176650. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176651. "adds r3, r3, r6\n\t"
  176652. #else
  176653. "add r3, r3, r6\n\t"
  176654. #endif
  176655. #ifdef WOLFSSL_KEIL
  176656. "adcs r4, r4, %[r]\n\t"
  176657. #elif defined(__clang__)
  176658. "adcs r4, %[r]\n\t"
  176659. #else
  176660. "adc r4, %[r]\n\t"
  176661. #endif
  176662. #ifdef WOLFSSL_KEIL
  176663. "adcs r2, r2, %[r]\n\t"
  176664. #elif defined(__clang__)
  176665. "adcs r2, %[r]\n\t"
  176666. #else
  176667. "adc r2, %[r]\n\t"
  176668. #endif
  176669. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176670. "lsrs r6, r7, #16\n\t"
  176671. #else
  176672. "lsr r6, r7, #16\n\t"
  176673. #endif
  176674. #ifdef WOLFSSL_KEIL
  176675. "muls r5, r6, r5\n\t"
  176676. #elif defined(__clang__)
  176677. "muls r5, r6\n\t"
  176678. #else
  176679. "mul r5, r6\n\t"
  176680. #endif
  176681. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176682. "lsrs r6, r5, #16\n\t"
  176683. #else
  176684. "lsr r6, r5, #16\n\t"
  176685. #endif
  176686. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176687. "lsls r5, r5, #16\n\t"
  176688. #else
  176689. "lsl r5, r5, #16\n\t"
  176690. #endif
  176691. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176692. "adds r3, r3, r5\n\t"
  176693. #else
  176694. "add r3, r3, r5\n\t"
  176695. #endif
  176696. #ifdef WOLFSSL_KEIL
  176697. "adcs r4, r4, r6\n\t"
  176698. #elif defined(__clang__)
  176699. "adcs r4, r6\n\t"
  176700. #else
  176701. "adc r4, r6\n\t"
  176702. #endif
  176703. #ifdef WOLFSSL_KEIL
  176704. "adcs r2, r2, %[r]\n\t"
  176705. #elif defined(__clang__)
  176706. "adcs r2, %[r]\n\t"
  176707. #else
  176708. "adc r2, %[r]\n\t"
  176709. #endif
  176710. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176711. "adds r3, r3, r5\n\t"
  176712. #else
  176713. "add r3, r3, r5\n\t"
  176714. #endif
  176715. #ifdef WOLFSSL_KEIL
  176716. "adcs r4, r4, r6\n\t"
  176717. #elif defined(__clang__)
  176718. "adcs r4, r6\n\t"
  176719. #else
  176720. "adc r4, r6\n\t"
  176721. #endif
  176722. #ifdef WOLFSSL_KEIL
  176723. "adcs r2, r2, %[r]\n\t"
  176724. #elif defined(__clang__)
  176725. "adcs r2, %[r]\n\t"
  176726. #else
  176727. "adc r2, %[r]\n\t"
  176728. #endif
  176729. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176730. "lsrs r5, %[a], #16\n\t"
  176731. #else
  176732. "lsr r5, %[a], #16\n\t"
  176733. #endif
  176734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176735. "lsrs r6, r7, #16\n\t"
  176736. #else
  176737. "lsr r6, r7, #16\n\t"
  176738. #endif
  176739. #ifdef WOLFSSL_KEIL
  176740. "muls r6, r5, r6\n\t"
  176741. #elif defined(__clang__)
  176742. "muls r6, r5\n\t"
  176743. #else
  176744. "mul r6, r5\n\t"
  176745. #endif
  176746. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176747. "adds r4, r4, r6\n\t"
  176748. #else
  176749. "add r4, r4, r6\n\t"
  176750. #endif
  176751. #ifdef WOLFSSL_KEIL
  176752. "adcs r2, r2, %[r]\n\t"
  176753. #elif defined(__clang__)
  176754. "adcs r2, %[r]\n\t"
  176755. #else
  176756. "adc r2, %[r]\n\t"
  176757. #endif
  176758. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176759. "adds r4, r4, r6\n\t"
  176760. #else
  176761. "add r4, r4, r6\n\t"
  176762. #endif
  176763. #ifdef WOLFSSL_KEIL
  176764. "adcs r2, r2, %[r]\n\t"
  176765. #elif defined(__clang__)
  176766. "adcs r2, %[r]\n\t"
  176767. #else
  176768. "adc r2, %[r]\n\t"
  176769. #endif
  176770. "uxth r6, r7\n\t"
  176771. #ifdef WOLFSSL_KEIL
  176772. "muls r5, r6, r5\n\t"
  176773. #elif defined(__clang__)
  176774. "muls r5, r6\n\t"
  176775. #else
  176776. "mul r5, r6\n\t"
  176777. #endif
  176778. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176779. "lsrs r6, r5, #16\n\t"
  176780. #else
  176781. "lsr r6, r5, #16\n\t"
  176782. #endif
  176783. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176784. "lsls r5, r5, #16\n\t"
  176785. #else
  176786. "lsl r5, r5, #16\n\t"
  176787. #endif
  176788. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176789. "adds r3, r3, r5\n\t"
  176790. #else
  176791. "add r3, r3, r5\n\t"
  176792. #endif
  176793. #ifdef WOLFSSL_KEIL
  176794. "adcs r4, r4, r6\n\t"
  176795. #elif defined(__clang__)
  176796. "adcs r4, r6\n\t"
  176797. #else
  176798. "adc r4, r6\n\t"
  176799. #endif
  176800. #ifdef WOLFSSL_KEIL
  176801. "adcs r2, r2, %[r]\n\t"
  176802. #elif defined(__clang__)
  176803. "adcs r2, %[r]\n\t"
  176804. #else
  176805. "adc r2, %[r]\n\t"
  176806. #endif
  176807. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176808. "adds r3, r3, r5\n\t"
  176809. #else
  176810. "add r3, r3, r5\n\t"
  176811. #endif
  176812. #ifdef WOLFSSL_KEIL
  176813. "adcs r4, r4, r6\n\t"
  176814. #elif defined(__clang__)
  176815. "adcs r4, r6\n\t"
  176816. #else
  176817. "adc r4, r6\n\t"
  176818. #endif
  176819. #ifdef WOLFSSL_KEIL
  176820. "adcs r2, r2, %[r]\n\t"
  176821. #elif defined(__clang__)
  176822. "adcs r2, %[r]\n\t"
  176823. #else
  176824. "adc r2, %[r]\n\t"
  176825. #endif
  176826. "# A[8] * A[2]\n\t"
  176827. "mov %[a], r9\n\t"
  176828. "mov r7, r12\n\t"
  176829. "ldr %[a], [%[a], #32]\n\t"
  176830. "uxth r5, %[a]\n\t"
  176831. "uxth r6, r7\n\t"
  176832. #ifdef WOLFSSL_KEIL
  176833. "muls r6, r5, r6\n\t"
  176834. #elif defined(__clang__)
  176835. "muls r6, r5\n\t"
  176836. #else
  176837. "mul r6, r5\n\t"
  176838. #endif
  176839. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176840. "adds r3, r3, r6\n\t"
  176841. #else
  176842. "add r3, r3, r6\n\t"
  176843. #endif
  176844. #ifdef WOLFSSL_KEIL
  176845. "adcs r4, r4, %[r]\n\t"
  176846. #elif defined(__clang__)
  176847. "adcs r4, %[r]\n\t"
  176848. #else
  176849. "adc r4, %[r]\n\t"
  176850. #endif
  176851. #ifdef WOLFSSL_KEIL
  176852. "adcs r2, r2, %[r]\n\t"
  176853. #elif defined(__clang__)
  176854. "adcs r2, %[r]\n\t"
  176855. #else
  176856. "adc r2, %[r]\n\t"
  176857. #endif
  176858. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176859. "adds r3, r3, r6\n\t"
  176860. #else
  176861. "add r3, r3, r6\n\t"
  176862. #endif
  176863. #ifdef WOLFSSL_KEIL
  176864. "adcs r4, r4, %[r]\n\t"
  176865. #elif defined(__clang__)
  176866. "adcs r4, %[r]\n\t"
  176867. #else
  176868. "adc r4, %[r]\n\t"
  176869. #endif
  176870. #ifdef WOLFSSL_KEIL
  176871. "adcs r2, r2, %[r]\n\t"
  176872. #elif defined(__clang__)
  176873. "adcs r2, %[r]\n\t"
  176874. #else
  176875. "adc r2, %[r]\n\t"
  176876. #endif
  176877. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176878. "lsrs r6, r7, #16\n\t"
  176879. #else
  176880. "lsr r6, r7, #16\n\t"
  176881. #endif
  176882. #ifdef WOLFSSL_KEIL
  176883. "muls r5, r6, r5\n\t"
  176884. #elif defined(__clang__)
  176885. "muls r5, r6\n\t"
  176886. #else
  176887. "mul r5, r6\n\t"
  176888. #endif
  176889. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176890. "lsrs r6, r5, #16\n\t"
  176891. #else
  176892. "lsr r6, r5, #16\n\t"
  176893. #endif
  176894. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176895. "lsls r5, r5, #16\n\t"
  176896. #else
  176897. "lsl r5, r5, #16\n\t"
  176898. #endif
  176899. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176900. "adds r3, r3, r5\n\t"
  176901. #else
  176902. "add r3, r3, r5\n\t"
  176903. #endif
  176904. #ifdef WOLFSSL_KEIL
  176905. "adcs r4, r4, r6\n\t"
  176906. #elif defined(__clang__)
  176907. "adcs r4, r6\n\t"
  176908. #else
  176909. "adc r4, r6\n\t"
  176910. #endif
  176911. #ifdef WOLFSSL_KEIL
  176912. "adcs r2, r2, %[r]\n\t"
  176913. #elif defined(__clang__)
  176914. "adcs r2, %[r]\n\t"
  176915. #else
  176916. "adc r2, %[r]\n\t"
  176917. #endif
  176918. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176919. "adds r3, r3, r5\n\t"
  176920. #else
  176921. "add r3, r3, r5\n\t"
  176922. #endif
  176923. #ifdef WOLFSSL_KEIL
  176924. "adcs r4, r4, r6\n\t"
  176925. #elif defined(__clang__)
  176926. "adcs r4, r6\n\t"
  176927. #else
  176928. "adc r4, r6\n\t"
  176929. #endif
  176930. #ifdef WOLFSSL_KEIL
  176931. "adcs r2, r2, %[r]\n\t"
  176932. #elif defined(__clang__)
  176933. "adcs r2, %[r]\n\t"
  176934. #else
  176935. "adc r2, %[r]\n\t"
  176936. #endif
  176937. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176938. "lsrs r5, %[a], #16\n\t"
  176939. #else
  176940. "lsr r5, %[a], #16\n\t"
  176941. #endif
  176942. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176943. "lsrs r6, r7, #16\n\t"
  176944. #else
  176945. "lsr r6, r7, #16\n\t"
  176946. #endif
  176947. #ifdef WOLFSSL_KEIL
  176948. "muls r6, r5, r6\n\t"
  176949. #elif defined(__clang__)
  176950. "muls r6, r5\n\t"
  176951. #else
  176952. "mul r6, r5\n\t"
  176953. #endif
  176954. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176955. "adds r4, r4, r6\n\t"
  176956. #else
  176957. "add r4, r4, r6\n\t"
  176958. #endif
  176959. #ifdef WOLFSSL_KEIL
  176960. "adcs r2, r2, %[r]\n\t"
  176961. #elif defined(__clang__)
  176962. "adcs r2, %[r]\n\t"
  176963. #else
  176964. "adc r2, %[r]\n\t"
  176965. #endif
  176966. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176967. "adds r4, r4, r6\n\t"
  176968. #else
  176969. "add r4, r4, r6\n\t"
  176970. #endif
  176971. #ifdef WOLFSSL_KEIL
  176972. "adcs r2, r2, %[r]\n\t"
  176973. #elif defined(__clang__)
  176974. "adcs r2, %[r]\n\t"
  176975. #else
  176976. "adc r2, %[r]\n\t"
  176977. #endif
  176978. "uxth r6, r7\n\t"
  176979. #ifdef WOLFSSL_KEIL
  176980. "muls r5, r6, r5\n\t"
  176981. #elif defined(__clang__)
  176982. "muls r5, r6\n\t"
  176983. #else
  176984. "mul r5, r6\n\t"
  176985. #endif
  176986. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176987. "lsrs r6, r5, #16\n\t"
  176988. #else
  176989. "lsr r6, r5, #16\n\t"
  176990. #endif
  176991. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176992. "lsls r5, r5, #16\n\t"
  176993. #else
  176994. "lsl r5, r5, #16\n\t"
  176995. #endif
  176996. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176997. "adds r3, r3, r5\n\t"
  176998. #else
  176999. "add r3, r3, r5\n\t"
  177000. #endif
  177001. #ifdef WOLFSSL_KEIL
  177002. "adcs r4, r4, r6\n\t"
  177003. #elif defined(__clang__)
  177004. "adcs r4, r6\n\t"
  177005. #else
  177006. "adc r4, r6\n\t"
  177007. #endif
  177008. #ifdef WOLFSSL_KEIL
  177009. "adcs r2, r2, %[r]\n\t"
  177010. #elif defined(__clang__)
  177011. "adcs r2, %[r]\n\t"
  177012. #else
  177013. "adc r2, %[r]\n\t"
  177014. #endif
  177015. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177016. "adds r3, r3, r5\n\t"
  177017. #else
  177018. "add r3, r3, r5\n\t"
  177019. #endif
  177020. #ifdef WOLFSSL_KEIL
  177021. "adcs r4, r4, r6\n\t"
  177022. #elif defined(__clang__)
  177023. "adcs r4, r6\n\t"
  177024. #else
  177025. "adc r4, r6\n\t"
  177026. #endif
  177027. #ifdef WOLFSSL_KEIL
  177028. "adcs r2, r2, %[r]\n\t"
  177029. #elif defined(__clang__)
  177030. "adcs r2, %[r]\n\t"
  177031. #else
  177032. "adc r2, %[r]\n\t"
  177033. #endif
  177034. "# A[7] * A[3]\n\t"
  177035. "mov %[a], r9\n\t"
  177036. "mov r7, lr\n\t"
  177037. "ldr %[a], [%[a], #28]\n\t"
  177038. "uxth r5, %[a]\n\t"
  177039. "uxth r6, r7\n\t"
  177040. #ifdef WOLFSSL_KEIL
  177041. "muls r6, r5, r6\n\t"
  177042. #elif defined(__clang__)
  177043. "muls r6, r5\n\t"
  177044. #else
  177045. "mul r6, r5\n\t"
  177046. #endif
  177047. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177048. "adds r3, r3, r6\n\t"
  177049. #else
  177050. "add r3, r3, r6\n\t"
  177051. #endif
  177052. #ifdef WOLFSSL_KEIL
  177053. "adcs r4, r4, %[r]\n\t"
  177054. #elif defined(__clang__)
  177055. "adcs r4, %[r]\n\t"
  177056. #else
  177057. "adc r4, %[r]\n\t"
  177058. #endif
  177059. #ifdef WOLFSSL_KEIL
  177060. "adcs r2, r2, %[r]\n\t"
  177061. #elif defined(__clang__)
  177062. "adcs r2, %[r]\n\t"
  177063. #else
  177064. "adc r2, %[r]\n\t"
  177065. #endif
  177066. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177067. "adds r3, r3, r6\n\t"
  177068. #else
  177069. "add r3, r3, r6\n\t"
  177070. #endif
  177071. #ifdef WOLFSSL_KEIL
  177072. "adcs r4, r4, %[r]\n\t"
  177073. #elif defined(__clang__)
  177074. "adcs r4, %[r]\n\t"
  177075. #else
  177076. "adc r4, %[r]\n\t"
  177077. #endif
  177078. #ifdef WOLFSSL_KEIL
  177079. "adcs r2, r2, %[r]\n\t"
  177080. #elif defined(__clang__)
  177081. "adcs r2, %[r]\n\t"
  177082. #else
  177083. "adc r2, %[r]\n\t"
  177084. #endif
  177085. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177086. "lsrs r6, r7, #16\n\t"
  177087. #else
  177088. "lsr r6, r7, #16\n\t"
  177089. #endif
  177090. #ifdef WOLFSSL_KEIL
  177091. "muls r5, r6, r5\n\t"
  177092. #elif defined(__clang__)
  177093. "muls r5, r6\n\t"
  177094. #else
  177095. "mul r5, r6\n\t"
  177096. #endif
  177097. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177098. "lsrs r6, r5, #16\n\t"
  177099. #else
  177100. "lsr r6, r5, #16\n\t"
  177101. #endif
  177102. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177103. "lsls r5, r5, #16\n\t"
  177104. #else
  177105. "lsl r5, r5, #16\n\t"
  177106. #endif
  177107. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177108. "adds r3, r3, r5\n\t"
  177109. #else
  177110. "add r3, r3, r5\n\t"
  177111. #endif
  177112. #ifdef WOLFSSL_KEIL
  177113. "adcs r4, r4, r6\n\t"
  177114. #elif defined(__clang__)
  177115. "adcs r4, r6\n\t"
  177116. #else
  177117. "adc r4, r6\n\t"
  177118. #endif
  177119. #ifdef WOLFSSL_KEIL
  177120. "adcs r2, r2, %[r]\n\t"
  177121. #elif defined(__clang__)
  177122. "adcs r2, %[r]\n\t"
  177123. #else
  177124. "adc r2, %[r]\n\t"
  177125. #endif
  177126. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177127. "adds r3, r3, r5\n\t"
  177128. #else
  177129. "add r3, r3, r5\n\t"
  177130. #endif
  177131. #ifdef WOLFSSL_KEIL
  177132. "adcs r4, r4, r6\n\t"
  177133. #elif defined(__clang__)
  177134. "adcs r4, r6\n\t"
  177135. #else
  177136. "adc r4, r6\n\t"
  177137. #endif
  177138. #ifdef WOLFSSL_KEIL
  177139. "adcs r2, r2, %[r]\n\t"
  177140. #elif defined(__clang__)
  177141. "adcs r2, %[r]\n\t"
  177142. #else
  177143. "adc r2, %[r]\n\t"
  177144. #endif
  177145. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177146. "lsrs r5, %[a], #16\n\t"
  177147. #else
  177148. "lsr r5, %[a], #16\n\t"
  177149. #endif
  177150. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177151. "lsrs r6, r7, #16\n\t"
  177152. #else
  177153. "lsr r6, r7, #16\n\t"
  177154. #endif
  177155. #ifdef WOLFSSL_KEIL
  177156. "muls r6, r5, r6\n\t"
  177157. #elif defined(__clang__)
  177158. "muls r6, r5\n\t"
  177159. #else
  177160. "mul r6, r5\n\t"
  177161. #endif
  177162. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177163. "adds r4, r4, r6\n\t"
  177164. #else
  177165. "add r4, r4, r6\n\t"
  177166. #endif
  177167. #ifdef WOLFSSL_KEIL
  177168. "adcs r2, r2, %[r]\n\t"
  177169. #elif defined(__clang__)
  177170. "adcs r2, %[r]\n\t"
  177171. #else
  177172. "adc r2, %[r]\n\t"
  177173. #endif
  177174. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177175. "adds r4, r4, r6\n\t"
  177176. #else
  177177. "add r4, r4, r6\n\t"
  177178. #endif
  177179. #ifdef WOLFSSL_KEIL
  177180. "adcs r2, r2, %[r]\n\t"
  177181. #elif defined(__clang__)
  177182. "adcs r2, %[r]\n\t"
  177183. #else
  177184. "adc r2, %[r]\n\t"
  177185. #endif
  177186. "uxth r6, r7\n\t"
  177187. #ifdef WOLFSSL_KEIL
  177188. "muls r5, r6, r5\n\t"
  177189. #elif defined(__clang__)
  177190. "muls r5, r6\n\t"
  177191. #else
  177192. "mul r5, r6\n\t"
  177193. #endif
  177194. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177195. "lsrs r6, r5, #16\n\t"
  177196. #else
  177197. "lsr r6, r5, #16\n\t"
  177198. #endif
  177199. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177200. "lsls r5, r5, #16\n\t"
  177201. #else
  177202. "lsl r5, r5, #16\n\t"
  177203. #endif
  177204. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177205. "adds r3, r3, r5\n\t"
  177206. #else
  177207. "add r3, r3, r5\n\t"
  177208. #endif
  177209. #ifdef WOLFSSL_KEIL
  177210. "adcs r4, r4, r6\n\t"
  177211. #elif defined(__clang__)
  177212. "adcs r4, r6\n\t"
  177213. #else
  177214. "adc r4, r6\n\t"
  177215. #endif
  177216. #ifdef WOLFSSL_KEIL
  177217. "adcs r2, r2, %[r]\n\t"
  177218. #elif defined(__clang__)
  177219. "adcs r2, %[r]\n\t"
  177220. #else
  177221. "adc r2, %[r]\n\t"
  177222. #endif
  177223. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177224. "adds r3, r3, r5\n\t"
  177225. #else
  177226. "add r3, r3, r5\n\t"
  177227. #endif
  177228. #ifdef WOLFSSL_KEIL
  177229. "adcs r4, r4, r6\n\t"
  177230. #elif defined(__clang__)
  177231. "adcs r4, r6\n\t"
  177232. #else
  177233. "adc 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. "# A[6] * A[4]\n\t"
  177243. "mov %[a], r9\n\t"
  177244. "ldr r7, [%[a], #16]\n\t"
  177245. "ldr %[a], [%[a], #24]\n\t"
  177246. "uxth r5, %[a]\n\t"
  177247. "uxth r6, r7\n\t"
  177248. #ifdef WOLFSSL_KEIL
  177249. "muls r6, r5, r6\n\t"
  177250. #elif defined(__clang__)
  177251. "muls r6, r5\n\t"
  177252. #else
  177253. "mul r6, r5\n\t"
  177254. #endif
  177255. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177256. "adds r3, r3, r6\n\t"
  177257. #else
  177258. "add r3, r3, r6\n\t"
  177259. #endif
  177260. #ifdef WOLFSSL_KEIL
  177261. "adcs r4, r4, %[r]\n\t"
  177262. #elif defined(__clang__)
  177263. "adcs r4, %[r]\n\t"
  177264. #else
  177265. "adc r4, %[r]\n\t"
  177266. #endif
  177267. #ifdef WOLFSSL_KEIL
  177268. "adcs r2, r2, %[r]\n\t"
  177269. #elif defined(__clang__)
  177270. "adcs r2, %[r]\n\t"
  177271. #else
  177272. "adc r2, %[r]\n\t"
  177273. #endif
  177274. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177275. "adds r3, r3, r6\n\t"
  177276. #else
  177277. "add r3, r3, r6\n\t"
  177278. #endif
  177279. #ifdef WOLFSSL_KEIL
  177280. "adcs r4, r4, %[r]\n\t"
  177281. #elif defined(__clang__)
  177282. "adcs r4, %[r]\n\t"
  177283. #else
  177284. "adc r4, %[r]\n\t"
  177285. #endif
  177286. #ifdef WOLFSSL_KEIL
  177287. "adcs r2, r2, %[r]\n\t"
  177288. #elif defined(__clang__)
  177289. "adcs r2, %[r]\n\t"
  177290. #else
  177291. "adc r2, %[r]\n\t"
  177292. #endif
  177293. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177294. "lsrs r6, r7, #16\n\t"
  177295. #else
  177296. "lsr r6, r7, #16\n\t"
  177297. #endif
  177298. #ifdef WOLFSSL_KEIL
  177299. "muls r5, r6, r5\n\t"
  177300. #elif defined(__clang__)
  177301. "muls r5, r6\n\t"
  177302. #else
  177303. "mul r5, r6\n\t"
  177304. #endif
  177305. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177306. "lsrs r6, r5, #16\n\t"
  177307. #else
  177308. "lsr r6, r5, #16\n\t"
  177309. #endif
  177310. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177311. "lsls r5, r5, #16\n\t"
  177312. #else
  177313. "lsl r5, r5, #16\n\t"
  177314. #endif
  177315. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177316. "adds r3, r3, r5\n\t"
  177317. #else
  177318. "add r3, r3, r5\n\t"
  177319. #endif
  177320. #ifdef WOLFSSL_KEIL
  177321. "adcs r4, r4, r6\n\t"
  177322. #elif defined(__clang__)
  177323. "adcs r4, r6\n\t"
  177324. #else
  177325. "adc r4, r6\n\t"
  177326. #endif
  177327. #ifdef WOLFSSL_KEIL
  177328. "adcs r2, r2, %[r]\n\t"
  177329. #elif defined(__clang__)
  177330. "adcs r2, %[r]\n\t"
  177331. #else
  177332. "adc r2, %[r]\n\t"
  177333. #endif
  177334. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177335. "adds r3, r3, r5\n\t"
  177336. #else
  177337. "add r3, r3, r5\n\t"
  177338. #endif
  177339. #ifdef WOLFSSL_KEIL
  177340. "adcs r4, r4, r6\n\t"
  177341. #elif defined(__clang__)
  177342. "adcs r4, r6\n\t"
  177343. #else
  177344. "adc r4, r6\n\t"
  177345. #endif
  177346. #ifdef WOLFSSL_KEIL
  177347. "adcs r2, r2, %[r]\n\t"
  177348. #elif defined(__clang__)
  177349. "adcs r2, %[r]\n\t"
  177350. #else
  177351. "adc r2, %[r]\n\t"
  177352. #endif
  177353. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177354. "lsrs r5, %[a], #16\n\t"
  177355. #else
  177356. "lsr r5, %[a], #16\n\t"
  177357. #endif
  177358. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177359. "lsrs r6, r7, #16\n\t"
  177360. #else
  177361. "lsr r6, r7, #16\n\t"
  177362. #endif
  177363. #ifdef WOLFSSL_KEIL
  177364. "muls r6, r5, r6\n\t"
  177365. #elif defined(__clang__)
  177366. "muls r6, r5\n\t"
  177367. #else
  177368. "mul r6, r5\n\t"
  177369. #endif
  177370. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177371. "adds r4, r4, r6\n\t"
  177372. #else
  177373. "add r4, r4, r6\n\t"
  177374. #endif
  177375. #ifdef WOLFSSL_KEIL
  177376. "adcs r2, r2, %[r]\n\t"
  177377. #elif defined(__clang__)
  177378. "adcs r2, %[r]\n\t"
  177379. #else
  177380. "adc r2, %[r]\n\t"
  177381. #endif
  177382. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177383. "adds r4, r4, r6\n\t"
  177384. #else
  177385. "add r4, r4, r6\n\t"
  177386. #endif
  177387. #ifdef WOLFSSL_KEIL
  177388. "adcs r2, r2, %[r]\n\t"
  177389. #elif defined(__clang__)
  177390. "adcs r2, %[r]\n\t"
  177391. #else
  177392. "adc r2, %[r]\n\t"
  177393. #endif
  177394. "uxth r6, r7\n\t"
  177395. #ifdef WOLFSSL_KEIL
  177396. "muls r5, r6, r5\n\t"
  177397. #elif defined(__clang__)
  177398. "muls r5, r6\n\t"
  177399. #else
  177400. "mul r5, r6\n\t"
  177401. #endif
  177402. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177403. "lsrs r6, r5, #16\n\t"
  177404. #else
  177405. "lsr r6, r5, #16\n\t"
  177406. #endif
  177407. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177408. "lsls r5, r5, #16\n\t"
  177409. #else
  177410. "lsl r5, r5, #16\n\t"
  177411. #endif
  177412. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177413. "adds r3, r3, r5\n\t"
  177414. #else
  177415. "add r3, r3, r5\n\t"
  177416. #endif
  177417. #ifdef WOLFSSL_KEIL
  177418. "adcs r4, r4, r6\n\t"
  177419. #elif defined(__clang__)
  177420. "adcs r4, r6\n\t"
  177421. #else
  177422. "adc r4, r6\n\t"
  177423. #endif
  177424. #ifdef WOLFSSL_KEIL
  177425. "adcs r2, r2, %[r]\n\t"
  177426. #elif defined(__clang__)
  177427. "adcs r2, %[r]\n\t"
  177428. #else
  177429. "adc r2, %[r]\n\t"
  177430. #endif
  177431. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177432. "adds r3, r3, r5\n\t"
  177433. #else
  177434. "add r3, r3, r5\n\t"
  177435. #endif
  177436. #ifdef WOLFSSL_KEIL
  177437. "adcs r4, r4, r6\n\t"
  177438. #elif defined(__clang__)
  177439. "adcs r4, r6\n\t"
  177440. #else
  177441. "adc 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. "# A[5] * A[5]\n\t"
  177451. "mov %[a], r9\n\t"
  177452. "ldr r7, [%[a], #20]\n\t"
  177453. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177454. "lsrs r6, r7, #16\n\t"
  177455. #else
  177456. "lsr r6, r7, #16\n\t"
  177457. #endif
  177458. "uxth r5, r7\n\t"
  177459. #ifdef WOLFSSL_KEIL
  177460. "muls r5, r5, r5\n\t"
  177461. #elif defined(__clang__)
  177462. "muls r5, r5\n\t"
  177463. #else
  177464. "mul r5, r5\n\t"
  177465. #endif
  177466. #ifdef WOLFSSL_KEIL
  177467. "muls r6, r6, r6\n\t"
  177468. #elif defined(__clang__)
  177469. "muls r6, r6\n\t"
  177470. #else
  177471. "mul r6, r6\n\t"
  177472. #endif
  177473. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177474. "adds r3, r3, r5\n\t"
  177475. #else
  177476. "add r3, r3, r5\n\t"
  177477. #endif
  177478. #ifdef WOLFSSL_KEIL
  177479. "adcs r4, r4, r6\n\t"
  177480. #elif defined(__clang__)
  177481. "adcs r4, r6\n\t"
  177482. #else
  177483. "adc r4, r6\n\t"
  177484. #endif
  177485. #ifdef WOLFSSL_KEIL
  177486. "adcs r2, r2, %[r]\n\t"
  177487. #elif defined(__clang__)
  177488. "adcs r2, %[r]\n\t"
  177489. #else
  177490. "adc r2, %[r]\n\t"
  177491. #endif
  177492. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177493. "lsrs r6, r7, #16\n\t"
  177494. #else
  177495. "lsr r6, r7, #16\n\t"
  177496. #endif
  177497. "uxth r5, r7\n\t"
  177498. #ifdef WOLFSSL_KEIL
  177499. "muls r5, r6, r5\n\t"
  177500. #elif defined(__clang__)
  177501. "muls r5, r6\n\t"
  177502. #else
  177503. "mul r5, r6\n\t"
  177504. #endif
  177505. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177506. "lsrs r6, r5, #15\n\t"
  177507. #else
  177508. "lsr r6, r5, #15\n\t"
  177509. #endif
  177510. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177511. "lsls r5, r5, #17\n\t"
  177512. #else
  177513. "lsl r5, r5, #17\n\t"
  177514. #endif
  177515. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177516. "adds r3, r3, r5\n\t"
  177517. #else
  177518. "add r3, r3, r5\n\t"
  177519. #endif
  177520. #ifdef WOLFSSL_KEIL
  177521. "adcs r4, r4, r6\n\t"
  177522. #elif defined(__clang__)
  177523. "adcs r4, r6\n\t"
  177524. #else
  177525. "adc r4, r6\n\t"
  177526. #endif
  177527. #ifdef WOLFSSL_KEIL
  177528. "adcs r2, r2, %[r]\n\t"
  177529. #elif defined(__clang__)
  177530. "adcs r2, %[r]\n\t"
  177531. #else
  177532. "adc r2, %[r]\n\t"
  177533. #endif
  177534. "str r3, [sp, #40]\n\t"
  177535. "# A[6] * A[5]\n\t"
  177536. "movs r3, #0\n\t"
  177537. "ldr %[a], [%[a], #24]\n\t"
  177538. "uxth r5, %[a]\n\t"
  177539. "uxth r6, r7\n\t"
  177540. #ifdef WOLFSSL_KEIL
  177541. "muls r6, r5, r6\n\t"
  177542. #elif defined(__clang__)
  177543. "muls r6, r5\n\t"
  177544. #else
  177545. "mul r6, r5\n\t"
  177546. #endif
  177547. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177548. "adds r4, r4, r6\n\t"
  177549. #else
  177550. "add r4, r4, r6\n\t"
  177551. #endif
  177552. #ifdef WOLFSSL_KEIL
  177553. "adcs r2, r2, %[r]\n\t"
  177554. #elif defined(__clang__)
  177555. "adcs r2, %[r]\n\t"
  177556. #else
  177557. "adc r2, %[r]\n\t"
  177558. #endif
  177559. #ifdef WOLFSSL_KEIL
  177560. "adcs r3, r3, %[r]\n\t"
  177561. #elif defined(__clang__)
  177562. "adcs r3, %[r]\n\t"
  177563. #else
  177564. "adc r3, %[r]\n\t"
  177565. #endif
  177566. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177567. "adds r4, r4, r6\n\t"
  177568. #else
  177569. "add r4, r4, r6\n\t"
  177570. #endif
  177571. #ifdef WOLFSSL_KEIL
  177572. "adcs r2, r2, %[r]\n\t"
  177573. #elif defined(__clang__)
  177574. "adcs r2, %[r]\n\t"
  177575. #else
  177576. "adc r2, %[r]\n\t"
  177577. #endif
  177578. #ifdef WOLFSSL_KEIL
  177579. "adcs r3, r3, %[r]\n\t"
  177580. #elif defined(__clang__)
  177581. "adcs r3, %[r]\n\t"
  177582. #else
  177583. "adc r3, %[r]\n\t"
  177584. #endif
  177585. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177586. "lsrs r6, r7, #16\n\t"
  177587. #else
  177588. "lsr r6, r7, #16\n\t"
  177589. #endif
  177590. #ifdef WOLFSSL_KEIL
  177591. "muls r5, r6, r5\n\t"
  177592. #elif defined(__clang__)
  177593. "muls r5, r6\n\t"
  177594. #else
  177595. "mul r5, r6\n\t"
  177596. #endif
  177597. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177598. "lsrs r6, r5, #16\n\t"
  177599. #else
  177600. "lsr r6, r5, #16\n\t"
  177601. #endif
  177602. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177603. "lsls r5, r5, #16\n\t"
  177604. #else
  177605. "lsl r5, r5, #16\n\t"
  177606. #endif
  177607. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177608. "adds r4, r4, r5\n\t"
  177609. #else
  177610. "add r4, r4, r5\n\t"
  177611. #endif
  177612. #ifdef WOLFSSL_KEIL
  177613. "adcs r2, r2, r6\n\t"
  177614. #elif defined(__clang__)
  177615. "adcs r2, r6\n\t"
  177616. #else
  177617. "adc r2, r6\n\t"
  177618. #endif
  177619. #ifdef WOLFSSL_KEIL
  177620. "adcs r3, r3, %[r]\n\t"
  177621. #elif defined(__clang__)
  177622. "adcs r3, %[r]\n\t"
  177623. #else
  177624. "adc r3, %[r]\n\t"
  177625. #endif
  177626. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177627. "adds r4, r4, r5\n\t"
  177628. #else
  177629. "add r4, r4, r5\n\t"
  177630. #endif
  177631. #ifdef WOLFSSL_KEIL
  177632. "adcs r2, r2, r6\n\t"
  177633. #elif defined(__clang__)
  177634. "adcs r2, r6\n\t"
  177635. #else
  177636. "adc r2, r6\n\t"
  177637. #endif
  177638. #ifdef WOLFSSL_KEIL
  177639. "adcs r3, r3, %[r]\n\t"
  177640. #elif defined(__clang__)
  177641. "adcs r3, %[r]\n\t"
  177642. #else
  177643. "adc r3, %[r]\n\t"
  177644. #endif
  177645. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177646. "lsrs r5, %[a], #16\n\t"
  177647. #else
  177648. "lsr r5, %[a], #16\n\t"
  177649. #endif
  177650. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177651. "lsrs r6, r7, #16\n\t"
  177652. #else
  177653. "lsr r6, r7, #16\n\t"
  177654. #endif
  177655. #ifdef WOLFSSL_KEIL
  177656. "muls r6, r5, r6\n\t"
  177657. #elif defined(__clang__)
  177658. "muls r6, r5\n\t"
  177659. #else
  177660. "mul r6, r5\n\t"
  177661. #endif
  177662. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177663. "adds r2, r2, r6\n\t"
  177664. #else
  177665. "add r2, r2, r6\n\t"
  177666. #endif
  177667. #ifdef WOLFSSL_KEIL
  177668. "adcs r3, r3, %[r]\n\t"
  177669. #elif defined(__clang__)
  177670. "adcs r3, %[r]\n\t"
  177671. #else
  177672. "adc r3, %[r]\n\t"
  177673. #endif
  177674. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177675. "adds r2, r2, r6\n\t"
  177676. #else
  177677. "add r2, r2, r6\n\t"
  177678. #endif
  177679. #ifdef WOLFSSL_KEIL
  177680. "adcs r3, r3, %[r]\n\t"
  177681. #elif defined(__clang__)
  177682. "adcs r3, %[r]\n\t"
  177683. #else
  177684. "adc r3, %[r]\n\t"
  177685. #endif
  177686. "uxth r6, r7\n\t"
  177687. #ifdef WOLFSSL_KEIL
  177688. "muls r5, r6, r5\n\t"
  177689. #elif defined(__clang__)
  177690. "muls r5, r6\n\t"
  177691. #else
  177692. "mul r5, r6\n\t"
  177693. #endif
  177694. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177695. "lsrs r6, r5, #16\n\t"
  177696. #else
  177697. "lsr r6, r5, #16\n\t"
  177698. #endif
  177699. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177700. "lsls r5, r5, #16\n\t"
  177701. #else
  177702. "lsl r5, r5, #16\n\t"
  177703. #endif
  177704. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177705. "adds r4, r4, r5\n\t"
  177706. #else
  177707. "add r4, r4, r5\n\t"
  177708. #endif
  177709. #ifdef WOLFSSL_KEIL
  177710. "adcs r2, r2, r6\n\t"
  177711. #elif defined(__clang__)
  177712. "adcs r2, r6\n\t"
  177713. #else
  177714. "adc r2, r6\n\t"
  177715. #endif
  177716. #ifdef WOLFSSL_KEIL
  177717. "adcs r3, r3, %[r]\n\t"
  177718. #elif defined(__clang__)
  177719. "adcs r3, %[r]\n\t"
  177720. #else
  177721. "adc r3, %[r]\n\t"
  177722. #endif
  177723. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177724. "adds r4, r4, r5\n\t"
  177725. #else
  177726. "add r4, r4, r5\n\t"
  177727. #endif
  177728. #ifdef WOLFSSL_KEIL
  177729. "adcs r2, r2, r6\n\t"
  177730. #elif defined(__clang__)
  177731. "adcs r2, r6\n\t"
  177732. #else
  177733. "adc r2, r6\n\t"
  177734. #endif
  177735. #ifdef WOLFSSL_KEIL
  177736. "adcs r3, r3, %[r]\n\t"
  177737. #elif defined(__clang__)
  177738. "adcs r3, %[r]\n\t"
  177739. #else
  177740. "adc r3, %[r]\n\t"
  177741. #endif
  177742. "# A[7] * A[4]\n\t"
  177743. "mov %[a], r9\n\t"
  177744. "ldr r7, [%[a], #16]\n\t"
  177745. "ldr %[a], [%[a], #28]\n\t"
  177746. "uxth r5, %[a]\n\t"
  177747. "uxth r6, r7\n\t"
  177748. #ifdef WOLFSSL_KEIL
  177749. "muls r6, r5, r6\n\t"
  177750. #elif defined(__clang__)
  177751. "muls r6, r5\n\t"
  177752. #else
  177753. "mul r6, r5\n\t"
  177754. #endif
  177755. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177756. "adds r4, r4, r6\n\t"
  177757. #else
  177758. "add r4, r4, r6\n\t"
  177759. #endif
  177760. #ifdef WOLFSSL_KEIL
  177761. "adcs r2, r2, %[r]\n\t"
  177762. #elif defined(__clang__)
  177763. "adcs r2, %[r]\n\t"
  177764. #else
  177765. "adc r2, %[r]\n\t"
  177766. #endif
  177767. #ifdef WOLFSSL_KEIL
  177768. "adcs r3, r3, %[r]\n\t"
  177769. #elif defined(__clang__)
  177770. "adcs r3, %[r]\n\t"
  177771. #else
  177772. "adc r3, %[r]\n\t"
  177773. #endif
  177774. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177775. "adds r4, r4, r6\n\t"
  177776. #else
  177777. "add r4, r4, r6\n\t"
  177778. #endif
  177779. #ifdef WOLFSSL_KEIL
  177780. "adcs r2, r2, %[r]\n\t"
  177781. #elif defined(__clang__)
  177782. "adcs r2, %[r]\n\t"
  177783. #else
  177784. "adc r2, %[r]\n\t"
  177785. #endif
  177786. #ifdef WOLFSSL_KEIL
  177787. "adcs r3, r3, %[r]\n\t"
  177788. #elif defined(__clang__)
  177789. "adcs r3, %[r]\n\t"
  177790. #else
  177791. "adc r3, %[r]\n\t"
  177792. #endif
  177793. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177794. "lsrs r6, r7, #16\n\t"
  177795. #else
  177796. "lsr r6, r7, #16\n\t"
  177797. #endif
  177798. #ifdef WOLFSSL_KEIL
  177799. "muls r5, r6, r5\n\t"
  177800. #elif defined(__clang__)
  177801. "muls r5, r6\n\t"
  177802. #else
  177803. "mul r5, r6\n\t"
  177804. #endif
  177805. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177806. "lsrs r6, r5, #16\n\t"
  177807. #else
  177808. "lsr r6, r5, #16\n\t"
  177809. #endif
  177810. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177811. "lsls r5, r5, #16\n\t"
  177812. #else
  177813. "lsl r5, r5, #16\n\t"
  177814. #endif
  177815. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177816. "adds r4, r4, r5\n\t"
  177817. #else
  177818. "add r4, r4, r5\n\t"
  177819. #endif
  177820. #ifdef WOLFSSL_KEIL
  177821. "adcs r2, r2, r6\n\t"
  177822. #elif defined(__clang__)
  177823. "adcs r2, r6\n\t"
  177824. #else
  177825. "adc r2, r6\n\t"
  177826. #endif
  177827. #ifdef WOLFSSL_KEIL
  177828. "adcs r3, r3, %[r]\n\t"
  177829. #elif defined(__clang__)
  177830. "adcs r3, %[r]\n\t"
  177831. #else
  177832. "adc r3, %[r]\n\t"
  177833. #endif
  177834. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177835. "adds r4, r4, r5\n\t"
  177836. #else
  177837. "add r4, r4, r5\n\t"
  177838. #endif
  177839. #ifdef WOLFSSL_KEIL
  177840. "adcs r2, r2, r6\n\t"
  177841. #elif defined(__clang__)
  177842. "adcs r2, r6\n\t"
  177843. #else
  177844. "adc r2, r6\n\t"
  177845. #endif
  177846. #ifdef WOLFSSL_KEIL
  177847. "adcs r3, r3, %[r]\n\t"
  177848. #elif defined(__clang__)
  177849. "adcs r3, %[r]\n\t"
  177850. #else
  177851. "adc r3, %[r]\n\t"
  177852. #endif
  177853. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177854. "lsrs r5, %[a], #16\n\t"
  177855. #else
  177856. "lsr r5, %[a], #16\n\t"
  177857. #endif
  177858. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177859. "lsrs r6, r7, #16\n\t"
  177860. #else
  177861. "lsr r6, r7, #16\n\t"
  177862. #endif
  177863. #ifdef WOLFSSL_KEIL
  177864. "muls r6, r5, r6\n\t"
  177865. #elif defined(__clang__)
  177866. "muls r6, r5\n\t"
  177867. #else
  177868. "mul r6, r5\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. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177883. "adds r2, r2, r6\n\t"
  177884. #else
  177885. "add r2, r2, r6\n\t"
  177886. #endif
  177887. #ifdef WOLFSSL_KEIL
  177888. "adcs r3, r3, %[r]\n\t"
  177889. #elif defined(__clang__)
  177890. "adcs r3, %[r]\n\t"
  177891. #else
  177892. "adc r3, %[r]\n\t"
  177893. #endif
  177894. "uxth r6, r7\n\t"
  177895. #ifdef WOLFSSL_KEIL
  177896. "muls r5, r6, r5\n\t"
  177897. #elif defined(__clang__)
  177898. "muls r5, r6\n\t"
  177899. #else
  177900. "mul r5, r6\n\t"
  177901. #endif
  177902. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177903. "lsrs r6, r5, #16\n\t"
  177904. #else
  177905. "lsr r6, r5, #16\n\t"
  177906. #endif
  177907. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177908. "lsls r5, r5, #16\n\t"
  177909. #else
  177910. "lsl r5, r5, #16\n\t"
  177911. #endif
  177912. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177913. "adds r4, r4, r5\n\t"
  177914. #else
  177915. "add r4, r4, r5\n\t"
  177916. #endif
  177917. #ifdef WOLFSSL_KEIL
  177918. "adcs r2, r2, r6\n\t"
  177919. #elif defined(__clang__)
  177920. "adcs r2, r6\n\t"
  177921. #else
  177922. "adc r2, r6\n\t"
  177923. #endif
  177924. #ifdef WOLFSSL_KEIL
  177925. "adcs r3, r3, %[r]\n\t"
  177926. #elif defined(__clang__)
  177927. "adcs r3, %[r]\n\t"
  177928. #else
  177929. "adc r3, %[r]\n\t"
  177930. #endif
  177931. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177932. "adds r4, r4, r5\n\t"
  177933. #else
  177934. "add r4, r4, r5\n\t"
  177935. #endif
  177936. #ifdef WOLFSSL_KEIL
  177937. "adcs r2, r2, r6\n\t"
  177938. #elif defined(__clang__)
  177939. "adcs r2, r6\n\t"
  177940. #else
  177941. "adc r2, r6\n\t"
  177942. #endif
  177943. #ifdef WOLFSSL_KEIL
  177944. "adcs r3, r3, %[r]\n\t"
  177945. #elif defined(__clang__)
  177946. "adcs r3, %[r]\n\t"
  177947. #else
  177948. "adc r3, %[r]\n\t"
  177949. #endif
  177950. "# A[8] * A[3]\n\t"
  177951. "mov %[a], r9\n\t"
  177952. "mov r7, lr\n\t"
  177953. "ldr %[a], [%[a], #32]\n\t"
  177954. "uxth r5, %[a]\n\t"
  177955. "uxth r6, r7\n\t"
  177956. #ifdef WOLFSSL_KEIL
  177957. "muls r6, r5, r6\n\t"
  177958. #elif defined(__clang__)
  177959. "muls r6, r5\n\t"
  177960. #else
  177961. "mul r6, r5\n\t"
  177962. #endif
  177963. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177964. "adds r4, r4, r6\n\t"
  177965. #else
  177966. "add r4, r4, r6\n\t"
  177967. #endif
  177968. #ifdef WOLFSSL_KEIL
  177969. "adcs r2, r2, %[r]\n\t"
  177970. #elif defined(__clang__)
  177971. "adcs r2, %[r]\n\t"
  177972. #else
  177973. "adc r2, %[r]\n\t"
  177974. #endif
  177975. #ifdef WOLFSSL_KEIL
  177976. "adcs r3, r3, %[r]\n\t"
  177977. #elif defined(__clang__)
  177978. "adcs r3, %[r]\n\t"
  177979. #else
  177980. "adc r3, %[r]\n\t"
  177981. #endif
  177982. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177983. "adds r4, r4, r6\n\t"
  177984. #else
  177985. "add r4, r4, r6\n\t"
  177986. #endif
  177987. #ifdef WOLFSSL_KEIL
  177988. "adcs r2, r2, %[r]\n\t"
  177989. #elif defined(__clang__)
  177990. "adcs r2, %[r]\n\t"
  177991. #else
  177992. "adc r2, %[r]\n\t"
  177993. #endif
  177994. #ifdef WOLFSSL_KEIL
  177995. "adcs r3, r3, %[r]\n\t"
  177996. #elif defined(__clang__)
  177997. "adcs r3, %[r]\n\t"
  177998. #else
  177999. "adc r3, %[r]\n\t"
  178000. #endif
  178001. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178002. "lsrs r6, r7, #16\n\t"
  178003. #else
  178004. "lsr r6, r7, #16\n\t"
  178005. #endif
  178006. #ifdef WOLFSSL_KEIL
  178007. "muls r5, r6, r5\n\t"
  178008. #elif defined(__clang__)
  178009. "muls r5, r6\n\t"
  178010. #else
  178011. "mul r5, r6\n\t"
  178012. #endif
  178013. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178014. "lsrs r6, r5, #16\n\t"
  178015. #else
  178016. "lsr r6, r5, #16\n\t"
  178017. #endif
  178018. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178019. "lsls r5, r5, #16\n\t"
  178020. #else
  178021. "lsl r5, r5, #16\n\t"
  178022. #endif
  178023. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178024. "adds r4, r4, r5\n\t"
  178025. #else
  178026. "add r4, r4, r5\n\t"
  178027. #endif
  178028. #ifdef WOLFSSL_KEIL
  178029. "adcs r2, r2, r6\n\t"
  178030. #elif defined(__clang__)
  178031. "adcs r2, r6\n\t"
  178032. #else
  178033. "adc r2, r6\n\t"
  178034. #endif
  178035. #ifdef WOLFSSL_KEIL
  178036. "adcs r3, r3, %[r]\n\t"
  178037. #elif defined(__clang__)
  178038. "adcs r3, %[r]\n\t"
  178039. #else
  178040. "adc r3, %[r]\n\t"
  178041. #endif
  178042. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178043. "adds r4, r4, r5\n\t"
  178044. #else
  178045. "add r4, r4, r5\n\t"
  178046. #endif
  178047. #ifdef WOLFSSL_KEIL
  178048. "adcs r2, r2, r6\n\t"
  178049. #elif defined(__clang__)
  178050. "adcs r2, r6\n\t"
  178051. #else
  178052. "adc r2, r6\n\t"
  178053. #endif
  178054. #ifdef WOLFSSL_KEIL
  178055. "adcs r3, r3, %[r]\n\t"
  178056. #elif defined(__clang__)
  178057. "adcs r3, %[r]\n\t"
  178058. #else
  178059. "adc r3, %[r]\n\t"
  178060. #endif
  178061. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178062. "lsrs r5, %[a], #16\n\t"
  178063. #else
  178064. "lsr r5, %[a], #16\n\t"
  178065. #endif
  178066. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178067. "lsrs r6, r7, #16\n\t"
  178068. #else
  178069. "lsr r6, r7, #16\n\t"
  178070. #endif
  178071. #ifdef WOLFSSL_KEIL
  178072. "muls r6, r5, r6\n\t"
  178073. #elif defined(__clang__)
  178074. "muls r6, r5\n\t"
  178075. #else
  178076. "mul r6, r5\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. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178091. "adds r2, r2, r6\n\t"
  178092. #else
  178093. "add r2, r2, r6\n\t"
  178094. #endif
  178095. #ifdef WOLFSSL_KEIL
  178096. "adcs r3, r3, %[r]\n\t"
  178097. #elif defined(__clang__)
  178098. "adcs r3, %[r]\n\t"
  178099. #else
  178100. "adc r3, %[r]\n\t"
  178101. #endif
  178102. "uxth r6, r7\n\t"
  178103. #ifdef WOLFSSL_KEIL
  178104. "muls r5, r6, r5\n\t"
  178105. #elif defined(__clang__)
  178106. "muls r5, r6\n\t"
  178107. #else
  178108. "mul r5, r6\n\t"
  178109. #endif
  178110. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178111. "lsrs r6, r5, #16\n\t"
  178112. #else
  178113. "lsr r6, r5, #16\n\t"
  178114. #endif
  178115. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178116. "lsls r5, r5, #16\n\t"
  178117. #else
  178118. "lsl r5, r5, #16\n\t"
  178119. #endif
  178120. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178121. "adds r4, r4, r5\n\t"
  178122. #else
  178123. "add r4, r4, r5\n\t"
  178124. #endif
  178125. #ifdef WOLFSSL_KEIL
  178126. "adcs r2, r2, r6\n\t"
  178127. #elif defined(__clang__)
  178128. "adcs r2, r6\n\t"
  178129. #else
  178130. "adc r2, r6\n\t"
  178131. #endif
  178132. #ifdef WOLFSSL_KEIL
  178133. "adcs r3, r3, %[r]\n\t"
  178134. #elif defined(__clang__)
  178135. "adcs r3, %[r]\n\t"
  178136. #else
  178137. "adc r3, %[r]\n\t"
  178138. #endif
  178139. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178140. "adds r4, r4, r5\n\t"
  178141. #else
  178142. "add r4, r4, r5\n\t"
  178143. #endif
  178144. #ifdef WOLFSSL_KEIL
  178145. "adcs r2, r2, r6\n\t"
  178146. #elif defined(__clang__)
  178147. "adcs r2, r6\n\t"
  178148. #else
  178149. "adc r2, r6\n\t"
  178150. #endif
  178151. #ifdef WOLFSSL_KEIL
  178152. "adcs r3, r3, %[r]\n\t"
  178153. #elif defined(__clang__)
  178154. "adcs r3, %[r]\n\t"
  178155. #else
  178156. "adc r3, %[r]\n\t"
  178157. #endif
  178158. "# A[9] * A[2]\n\t"
  178159. "mov %[a], r9\n\t"
  178160. "mov r7, r12\n\t"
  178161. "ldr %[a], [%[a], #36]\n\t"
  178162. "uxth r5, %[a]\n\t"
  178163. "uxth r6, r7\n\t"
  178164. #ifdef WOLFSSL_KEIL
  178165. "muls r6, r5, r6\n\t"
  178166. #elif defined(__clang__)
  178167. "muls r6, r5\n\t"
  178168. #else
  178169. "mul r6, r5\n\t"
  178170. #endif
  178171. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178172. "adds r4, r4, r6\n\t"
  178173. #else
  178174. "add r4, r4, r6\n\t"
  178175. #endif
  178176. #ifdef WOLFSSL_KEIL
  178177. "adcs r2, r2, %[r]\n\t"
  178178. #elif defined(__clang__)
  178179. "adcs r2, %[r]\n\t"
  178180. #else
  178181. "adc r2, %[r]\n\t"
  178182. #endif
  178183. #ifdef WOLFSSL_KEIL
  178184. "adcs r3, r3, %[r]\n\t"
  178185. #elif defined(__clang__)
  178186. "adcs r3, %[r]\n\t"
  178187. #else
  178188. "adc r3, %[r]\n\t"
  178189. #endif
  178190. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178191. "adds r4, r4, r6\n\t"
  178192. #else
  178193. "add r4, r4, r6\n\t"
  178194. #endif
  178195. #ifdef WOLFSSL_KEIL
  178196. "adcs r2, r2, %[r]\n\t"
  178197. #elif defined(__clang__)
  178198. "adcs r2, %[r]\n\t"
  178199. #else
  178200. "adc r2, %[r]\n\t"
  178201. #endif
  178202. #ifdef WOLFSSL_KEIL
  178203. "adcs r3, r3, %[r]\n\t"
  178204. #elif defined(__clang__)
  178205. "adcs r3, %[r]\n\t"
  178206. #else
  178207. "adc r3, %[r]\n\t"
  178208. #endif
  178209. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178210. "lsrs r6, r7, #16\n\t"
  178211. #else
  178212. "lsr r6, r7, #16\n\t"
  178213. #endif
  178214. #ifdef WOLFSSL_KEIL
  178215. "muls r5, r6, r5\n\t"
  178216. #elif defined(__clang__)
  178217. "muls r5, r6\n\t"
  178218. #else
  178219. "mul r5, r6\n\t"
  178220. #endif
  178221. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178222. "lsrs r6, r5, #16\n\t"
  178223. #else
  178224. "lsr r6, r5, #16\n\t"
  178225. #endif
  178226. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178227. "lsls r5, r5, #16\n\t"
  178228. #else
  178229. "lsl r5, r5, #16\n\t"
  178230. #endif
  178231. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178232. "adds r4, r4, r5\n\t"
  178233. #else
  178234. "add r4, r4, r5\n\t"
  178235. #endif
  178236. #ifdef WOLFSSL_KEIL
  178237. "adcs r2, r2, r6\n\t"
  178238. #elif defined(__clang__)
  178239. "adcs r2, r6\n\t"
  178240. #else
  178241. "adc r2, r6\n\t"
  178242. #endif
  178243. #ifdef WOLFSSL_KEIL
  178244. "adcs r3, r3, %[r]\n\t"
  178245. #elif defined(__clang__)
  178246. "adcs r3, %[r]\n\t"
  178247. #else
  178248. "adc r3, %[r]\n\t"
  178249. #endif
  178250. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178251. "adds r4, r4, r5\n\t"
  178252. #else
  178253. "add r4, r4, r5\n\t"
  178254. #endif
  178255. #ifdef WOLFSSL_KEIL
  178256. "adcs r2, r2, r6\n\t"
  178257. #elif defined(__clang__)
  178258. "adcs r2, r6\n\t"
  178259. #else
  178260. "adc r2, r6\n\t"
  178261. #endif
  178262. #ifdef WOLFSSL_KEIL
  178263. "adcs r3, r3, %[r]\n\t"
  178264. #elif defined(__clang__)
  178265. "adcs r3, %[r]\n\t"
  178266. #else
  178267. "adc r3, %[r]\n\t"
  178268. #endif
  178269. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178270. "lsrs r5, %[a], #16\n\t"
  178271. #else
  178272. "lsr r5, %[a], #16\n\t"
  178273. #endif
  178274. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178275. "lsrs r6, r7, #16\n\t"
  178276. #else
  178277. "lsr r6, r7, #16\n\t"
  178278. #endif
  178279. #ifdef WOLFSSL_KEIL
  178280. "muls r6, r5, r6\n\t"
  178281. #elif defined(__clang__)
  178282. "muls r6, r5\n\t"
  178283. #else
  178284. "mul r6, r5\n\t"
  178285. #endif
  178286. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178287. "adds r2, r2, r6\n\t"
  178288. #else
  178289. "add r2, r2, r6\n\t"
  178290. #endif
  178291. #ifdef WOLFSSL_KEIL
  178292. "adcs r3, r3, %[r]\n\t"
  178293. #elif defined(__clang__)
  178294. "adcs r3, %[r]\n\t"
  178295. #else
  178296. "adc r3, %[r]\n\t"
  178297. #endif
  178298. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178299. "adds r2, r2, r6\n\t"
  178300. #else
  178301. "add r2, r2, r6\n\t"
  178302. #endif
  178303. #ifdef WOLFSSL_KEIL
  178304. "adcs r3, r3, %[r]\n\t"
  178305. #elif defined(__clang__)
  178306. "adcs r3, %[r]\n\t"
  178307. #else
  178308. "adc r3, %[r]\n\t"
  178309. #endif
  178310. "uxth r6, r7\n\t"
  178311. #ifdef WOLFSSL_KEIL
  178312. "muls r5, r6, r5\n\t"
  178313. #elif defined(__clang__)
  178314. "muls r5, r6\n\t"
  178315. #else
  178316. "mul r5, r6\n\t"
  178317. #endif
  178318. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178319. "lsrs r6, r5, #16\n\t"
  178320. #else
  178321. "lsr r6, r5, #16\n\t"
  178322. #endif
  178323. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178324. "lsls r5, r5, #16\n\t"
  178325. #else
  178326. "lsl r5, r5, #16\n\t"
  178327. #endif
  178328. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178329. "adds r4, r4, r5\n\t"
  178330. #else
  178331. "add r4, r4, r5\n\t"
  178332. #endif
  178333. #ifdef WOLFSSL_KEIL
  178334. "adcs r2, r2, r6\n\t"
  178335. #elif defined(__clang__)
  178336. "adcs r2, r6\n\t"
  178337. #else
  178338. "adc r2, r6\n\t"
  178339. #endif
  178340. #ifdef WOLFSSL_KEIL
  178341. "adcs r3, r3, %[r]\n\t"
  178342. #elif defined(__clang__)
  178343. "adcs r3, %[r]\n\t"
  178344. #else
  178345. "adc r3, %[r]\n\t"
  178346. #endif
  178347. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178348. "adds r4, r4, r5\n\t"
  178349. #else
  178350. "add r4, r4, r5\n\t"
  178351. #endif
  178352. #ifdef WOLFSSL_KEIL
  178353. "adcs r2, r2, r6\n\t"
  178354. #elif defined(__clang__)
  178355. "adcs r2, r6\n\t"
  178356. #else
  178357. "adc r2, r6\n\t"
  178358. #endif
  178359. #ifdef WOLFSSL_KEIL
  178360. "adcs r3, r3, %[r]\n\t"
  178361. #elif defined(__clang__)
  178362. "adcs r3, %[r]\n\t"
  178363. #else
  178364. "adc r3, %[r]\n\t"
  178365. #endif
  178366. "# A[10] * A[1]\n\t"
  178367. "mov %[a], r9\n\t"
  178368. "mov r7, r11\n\t"
  178369. "ldr %[a], [%[a], #40]\n\t"
  178370. "uxth r5, %[a]\n\t"
  178371. "uxth r6, r7\n\t"
  178372. #ifdef WOLFSSL_KEIL
  178373. "muls r6, r5, r6\n\t"
  178374. #elif defined(__clang__)
  178375. "muls r6, r5\n\t"
  178376. #else
  178377. "mul r6, r5\n\t"
  178378. #endif
  178379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178380. "adds r4, r4, r6\n\t"
  178381. #else
  178382. "add r4, r4, r6\n\t"
  178383. #endif
  178384. #ifdef WOLFSSL_KEIL
  178385. "adcs r2, r2, %[r]\n\t"
  178386. #elif defined(__clang__)
  178387. "adcs r2, %[r]\n\t"
  178388. #else
  178389. "adc r2, %[r]\n\t"
  178390. #endif
  178391. #ifdef WOLFSSL_KEIL
  178392. "adcs r3, r3, %[r]\n\t"
  178393. #elif defined(__clang__)
  178394. "adcs r3, %[r]\n\t"
  178395. #else
  178396. "adc r3, %[r]\n\t"
  178397. #endif
  178398. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178399. "adds r4, r4, r6\n\t"
  178400. #else
  178401. "add r4, r4, r6\n\t"
  178402. #endif
  178403. #ifdef WOLFSSL_KEIL
  178404. "adcs r2, r2, %[r]\n\t"
  178405. #elif defined(__clang__)
  178406. "adcs r2, %[r]\n\t"
  178407. #else
  178408. "adc r2, %[r]\n\t"
  178409. #endif
  178410. #ifdef WOLFSSL_KEIL
  178411. "adcs r3, r3, %[r]\n\t"
  178412. #elif defined(__clang__)
  178413. "adcs r3, %[r]\n\t"
  178414. #else
  178415. "adc r3, %[r]\n\t"
  178416. #endif
  178417. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178418. "lsrs r6, r7, #16\n\t"
  178419. #else
  178420. "lsr r6, r7, #16\n\t"
  178421. #endif
  178422. #ifdef WOLFSSL_KEIL
  178423. "muls r5, r6, r5\n\t"
  178424. #elif defined(__clang__)
  178425. "muls r5, r6\n\t"
  178426. #else
  178427. "mul r5, r6\n\t"
  178428. #endif
  178429. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178430. "lsrs r6, r5, #16\n\t"
  178431. #else
  178432. "lsr r6, r5, #16\n\t"
  178433. #endif
  178434. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178435. "lsls r5, r5, #16\n\t"
  178436. #else
  178437. "lsl r5, r5, #16\n\t"
  178438. #endif
  178439. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178440. "adds r4, r4, r5\n\t"
  178441. #else
  178442. "add r4, r4, r5\n\t"
  178443. #endif
  178444. #ifdef WOLFSSL_KEIL
  178445. "adcs r2, r2, r6\n\t"
  178446. #elif defined(__clang__)
  178447. "adcs r2, r6\n\t"
  178448. #else
  178449. "adc r2, r6\n\t"
  178450. #endif
  178451. #ifdef WOLFSSL_KEIL
  178452. "adcs r3, r3, %[r]\n\t"
  178453. #elif defined(__clang__)
  178454. "adcs r3, %[r]\n\t"
  178455. #else
  178456. "adc r3, %[r]\n\t"
  178457. #endif
  178458. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178459. "adds r4, r4, r5\n\t"
  178460. #else
  178461. "add r4, r4, r5\n\t"
  178462. #endif
  178463. #ifdef WOLFSSL_KEIL
  178464. "adcs r2, r2, r6\n\t"
  178465. #elif defined(__clang__)
  178466. "adcs r2, r6\n\t"
  178467. #else
  178468. "adc r2, r6\n\t"
  178469. #endif
  178470. #ifdef WOLFSSL_KEIL
  178471. "adcs r3, r3, %[r]\n\t"
  178472. #elif defined(__clang__)
  178473. "adcs r3, %[r]\n\t"
  178474. #else
  178475. "adc r3, %[r]\n\t"
  178476. #endif
  178477. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178478. "lsrs r5, %[a], #16\n\t"
  178479. #else
  178480. "lsr r5, %[a], #16\n\t"
  178481. #endif
  178482. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178483. "lsrs r6, r7, #16\n\t"
  178484. #else
  178485. "lsr r6, r7, #16\n\t"
  178486. #endif
  178487. #ifdef WOLFSSL_KEIL
  178488. "muls r6, r5, r6\n\t"
  178489. #elif defined(__clang__)
  178490. "muls r6, r5\n\t"
  178491. #else
  178492. "mul r6, r5\n\t"
  178493. #endif
  178494. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178495. "adds r2, r2, r6\n\t"
  178496. #else
  178497. "add r2, r2, r6\n\t"
  178498. #endif
  178499. #ifdef WOLFSSL_KEIL
  178500. "adcs r3, r3, %[r]\n\t"
  178501. #elif defined(__clang__)
  178502. "adcs r3, %[r]\n\t"
  178503. #else
  178504. "adc r3, %[r]\n\t"
  178505. #endif
  178506. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178507. "adds r2, r2, r6\n\t"
  178508. #else
  178509. "add r2, r2, r6\n\t"
  178510. #endif
  178511. #ifdef WOLFSSL_KEIL
  178512. "adcs r3, r3, %[r]\n\t"
  178513. #elif defined(__clang__)
  178514. "adcs r3, %[r]\n\t"
  178515. #else
  178516. "adc r3, %[r]\n\t"
  178517. #endif
  178518. "uxth r6, r7\n\t"
  178519. #ifdef WOLFSSL_KEIL
  178520. "muls r5, r6, r5\n\t"
  178521. #elif defined(__clang__)
  178522. "muls r5, r6\n\t"
  178523. #else
  178524. "mul r5, r6\n\t"
  178525. #endif
  178526. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178527. "lsrs r6, r5, #16\n\t"
  178528. #else
  178529. "lsr r6, r5, #16\n\t"
  178530. #endif
  178531. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178532. "lsls r5, r5, #16\n\t"
  178533. #else
  178534. "lsl r5, r5, #16\n\t"
  178535. #endif
  178536. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178537. "adds r4, r4, r5\n\t"
  178538. #else
  178539. "add r4, r4, r5\n\t"
  178540. #endif
  178541. #ifdef WOLFSSL_KEIL
  178542. "adcs r2, r2, r6\n\t"
  178543. #elif defined(__clang__)
  178544. "adcs r2, r6\n\t"
  178545. #else
  178546. "adc r2, r6\n\t"
  178547. #endif
  178548. #ifdef WOLFSSL_KEIL
  178549. "adcs r3, r3, %[r]\n\t"
  178550. #elif defined(__clang__)
  178551. "adcs r3, %[r]\n\t"
  178552. #else
  178553. "adc r3, %[r]\n\t"
  178554. #endif
  178555. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178556. "adds r4, r4, r5\n\t"
  178557. #else
  178558. "add r4, r4, r5\n\t"
  178559. #endif
  178560. #ifdef WOLFSSL_KEIL
  178561. "adcs r2, r2, r6\n\t"
  178562. #elif defined(__clang__)
  178563. "adcs r2, r6\n\t"
  178564. #else
  178565. "adc r2, r6\n\t"
  178566. #endif
  178567. #ifdef WOLFSSL_KEIL
  178568. "adcs r3, r3, %[r]\n\t"
  178569. #elif defined(__clang__)
  178570. "adcs r3, %[r]\n\t"
  178571. #else
  178572. "adc r3, %[r]\n\t"
  178573. #endif
  178574. "# A[11] * A[0]\n\t"
  178575. "mov %[a], r9\n\t"
  178576. "mov r7, r10\n\t"
  178577. "ldr %[a], [%[a], #44]\n\t"
  178578. "uxth r5, %[a]\n\t"
  178579. "uxth r6, r7\n\t"
  178580. #ifdef WOLFSSL_KEIL
  178581. "muls r6, r5, r6\n\t"
  178582. #elif defined(__clang__)
  178583. "muls r6, r5\n\t"
  178584. #else
  178585. "mul r6, r5\n\t"
  178586. #endif
  178587. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178588. "adds r4, r4, r6\n\t"
  178589. #else
  178590. "add r4, r4, r6\n\t"
  178591. #endif
  178592. #ifdef WOLFSSL_KEIL
  178593. "adcs r2, r2, %[r]\n\t"
  178594. #elif defined(__clang__)
  178595. "adcs r2, %[r]\n\t"
  178596. #else
  178597. "adc r2, %[r]\n\t"
  178598. #endif
  178599. #ifdef WOLFSSL_KEIL
  178600. "adcs r3, r3, %[r]\n\t"
  178601. #elif defined(__clang__)
  178602. "adcs r3, %[r]\n\t"
  178603. #else
  178604. "adc r3, %[r]\n\t"
  178605. #endif
  178606. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178607. "adds r4, r4, r6\n\t"
  178608. #else
  178609. "add r4, r4, r6\n\t"
  178610. #endif
  178611. #ifdef WOLFSSL_KEIL
  178612. "adcs r2, r2, %[r]\n\t"
  178613. #elif defined(__clang__)
  178614. "adcs r2, %[r]\n\t"
  178615. #else
  178616. "adc r2, %[r]\n\t"
  178617. #endif
  178618. #ifdef WOLFSSL_KEIL
  178619. "adcs r3, r3, %[r]\n\t"
  178620. #elif defined(__clang__)
  178621. "adcs r3, %[r]\n\t"
  178622. #else
  178623. "adc r3, %[r]\n\t"
  178624. #endif
  178625. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178626. "lsrs r6, r7, #16\n\t"
  178627. #else
  178628. "lsr r6, r7, #16\n\t"
  178629. #endif
  178630. #ifdef WOLFSSL_KEIL
  178631. "muls r5, r6, r5\n\t"
  178632. #elif defined(__clang__)
  178633. "muls r5, r6\n\t"
  178634. #else
  178635. "mul r5, r6\n\t"
  178636. #endif
  178637. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178638. "lsrs r6, r5, #16\n\t"
  178639. #else
  178640. "lsr r6, r5, #16\n\t"
  178641. #endif
  178642. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178643. "lsls r5, r5, #16\n\t"
  178644. #else
  178645. "lsl r5, r5, #16\n\t"
  178646. #endif
  178647. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178648. "adds r4, r4, r5\n\t"
  178649. #else
  178650. "add r4, r4, r5\n\t"
  178651. #endif
  178652. #ifdef WOLFSSL_KEIL
  178653. "adcs r2, r2, r6\n\t"
  178654. #elif defined(__clang__)
  178655. "adcs r2, r6\n\t"
  178656. #else
  178657. "adc r2, r6\n\t"
  178658. #endif
  178659. #ifdef WOLFSSL_KEIL
  178660. "adcs r3, r3, %[r]\n\t"
  178661. #elif defined(__clang__)
  178662. "adcs r3, %[r]\n\t"
  178663. #else
  178664. "adc r3, %[r]\n\t"
  178665. #endif
  178666. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178667. "adds r4, r4, r5\n\t"
  178668. #else
  178669. "add r4, r4, r5\n\t"
  178670. #endif
  178671. #ifdef WOLFSSL_KEIL
  178672. "adcs r2, r2, r6\n\t"
  178673. #elif defined(__clang__)
  178674. "adcs r2, r6\n\t"
  178675. #else
  178676. "adc r2, r6\n\t"
  178677. #endif
  178678. #ifdef WOLFSSL_KEIL
  178679. "adcs r3, r3, %[r]\n\t"
  178680. #elif defined(__clang__)
  178681. "adcs r3, %[r]\n\t"
  178682. #else
  178683. "adc r3, %[r]\n\t"
  178684. #endif
  178685. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178686. "lsrs r5, %[a], #16\n\t"
  178687. #else
  178688. "lsr r5, %[a], #16\n\t"
  178689. #endif
  178690. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178691. "lsrs r6, r7, #16\n\t"
  178692. #else
  178693. "lsr r6, r7, #16\n\t"
  178694. #endif
  178695. #ifdef WOLFSSL_KEIL
  178696. "muls r6, r5, r6\n\t"
  178697. #elif defined(__clang__)
  178698. "muls r6, r5\n\t"
  178699. #else
  178700. "mul r6, r5\n\t"
  178701. #endif
  178702. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178703. "adds r2, r2, r6\n\t"
  178704. #else
  178705. "add r2, r2, r6\n\t"
  178706. #endif
  178707. #ifdef WOLFSSL_KEIL
  178708. "adcs r3, r3, %[r]\n\t"
  178709. #elif defined(__clang__)
  178710. "adcs r3, %[r]\n\t"
  178711. #else
  178712. "adc r3, %[r]\n\t"
  178713. #endif
  178714. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178715. "adds r2, r2, r6\n\t"
  178716. #else
  178717. "add r2, r2, r6\n\t"
  178718. #endif
  178719. #ifdef WOLFSSL_KEIL
  178720. "adcs r3, r3, %[r]\n\t"
  178721. #elif defined(__clang__)
  178722. "adcs r3, %[r]\n\t"
  178723. #else
  178724. "adc r3, %[r]\n\t"
  178725. #endif
  178726. "uxth r6, r7\n\t"
  178727. #ifdef WOLFSSL_KEIL
  178728. "muls r5, r6, r5\n\t"
  178729. #elif defined(__clang__)
  178730. "muls r5, r6\n\t"
  178731. #else
  178732. "mul r5, r6\n\t"
  178733. #endif
  178734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178735. "lsrs r6, r5, #16\n\t"
  178736. #else
  178737. "lsr r6, r5, #16\n\t"
  178738. #endif
  178739. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178740. "lsls r5, r5, #16\n\t"
  178741. #else
  178742. "lsl r5, r5, #16\n\t"
  178743. #endif
  178744. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178745. "adds r4, r4, r5\n\t"
  178746. #else
  178747. "add r4, r4, r5\n\t"
  178748. #endif
  178749. #ifdef WOLFSSL_KEIL
  178750. "adcs r2, r2, r6\n\t"
  178751. #elif defined(__clang__)
  178752. "adcs r2, r6\n\t"
  178753. #else
  178754. "adc r2, r6\n\t"
  178755. #endif
  178756. #ifdef WOLFSSL_KEIL
  178757. "adcs r3, r3, %[r]\n\t"
  178758. #elif defined(__clang__)
  178759. "adcs r3, %[r]\n\t"
  178760. #else
  178761. "adc r3, %[r]\n\t"
  178762. #endif
  178763. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178764. "adds r4, r4, r5\n\t"
  178765. #else
  178766. "add r4, r4, r5\n\t"
  178767. #endif
  178768. #ifdef WOLFSSL_KEIL
  178769. "adcs r2, r2, r6\n\t"
  178770. #elif defined(__clang__)
  178771. "adcs r2, r6\n\t"
  178772. #else
  178773. "adc r2, r6\n\t"
  178774. #endif
  178775. #ifdef WOLFSSL_KEIL
  178776. "adcs r3, r3, %[r]\n\t"
  178777. #elif defined(__clang__)
  178778. "adcs r3, %[r]\n\t"
  178779. #else
  178780. "adc r3, %[r]\n\t"
  178781. #endif
  178782. "str r4, [sp, #44]\n\t"
  178783. "# A[12] * A[0]\n\t"
  178784. "movs r4, #0\n\t"
  178785. "mov %[a], r9\n\t"
  178786. "ldr %[a], [%[a], #48]\n\t"
  178787. "uxth r5, %[a]\n\t"
  178788. "uxth r6, r7\n\t"
  178789. #ifdef WOLFSSL_KEIL
  178790. "muls r6, r5, r6\n\t"
  178791. #elif defined(__clang__)
  178792. "muls r6, r5\n\t"
  178793. #else
  178794. "mul r6, r5\n\t"
  178795. #endif
  178796. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178797. "adds r2, r2, r6\n\t"
  178798. #else
  178799. "add r2, r2, r6\n\t"
  178800. #endif
  178801. #ifdef WOLFSSL_KEIL
  178802. "adcs r3, r3, %[r]\n\t"
  178803. #elif defined(__clang__)
  178804. "adcs r3, %[r]\n\t"
  178805. #else
  178806. "adc r3, %[r]\n\t"
  178807. #endif
  178808. #ifdef WOLFSSL_KEIL
  178809. "adcs r4, r4, %[r]\n\t"
  178810. #elif defined(__clang__)
  178811. "adcs r4, %[r]\n\t"
  178812. #else
  178813. "adc r4, %[r]\n\t"
  178814. #endif
  178815. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178816. "adds r2, r2, r6\n\t"
  178817. #else
  178818. "add r2, r2, r6\n\t"
  178819. #endif
  178820. #ifdef WOLFSSL_KEIL
  178821. "adcs r3, r3, %[r]\n\t"
  178822. #elif defined(__clang__)
  178823. "adcs r3, %[r]\n\t"
  178824. #else
  178825. "adc r3, %[r]\n\t"
  178826. #endif
  178827. #ifdef WOLFSSL_KEIL
  178828. "adcs r4, r4, %[r]\n\t"
  178829. #elif defined(__clang__)
  178830. "adcs r4, %[r]\n\t"
  178831. #else
  178832. "adc r4, %[r]\n\t"
  178833. #endif
  178834. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178835. "lsrs r6, r7, #16\n\t"
  178836. #else
  178837. "lsr r6, r7, #16\n\t"
  178838. #endif
  178839. #ifdef WOLFSSL_KEIL
  178840. "muls r5, r6, r5\n\t"
  178841. #elif defined(__clang__)
  178842. "muls r5, r6\n\t"
  178843. #else
  178844. "mul r5, r6\n\t"
  178845. #endif
  178846. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178847. "lsrs r6, r5, #16\n\t"
  178848. #else
  178849. "lsr r6, r5, #16\n\t"
  178850. #endif
  178851. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178852. "lsls r5, r5, #16\n\t"
  178853. #else
  178854. "lsl r5, r5, #16\n\t"
  178855. #endif
  178856. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178857. "adds r2, r2, r5\n\t"
  178858. #else
  178859. "add r2, r2, r5\n\t"
  178860. #endif
  178861. #ifdef WOLFSSL_KEIL
  178862. "adcs r3, r3, r6\n\t"
  178863. #elif defined(__clang__)
  178864. "adcs r3, r6\n\t"
  178865. #else
  178866. "adc r3, r6\n\t"
  178867. #endif
  178868. #ifdef WOLFSSL_KEIL
  178869. "adcs r4, r4, %[r]\n\t"
  178870. #elif defined(__clang__)
  178871. "adcs r4, %[r]\n\t"
  178872. #else
  178873. "adc r4, %[r]\n\t"
  178874. #endif
  178875. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178876. "adds r2, r2, r5\n\t"
  178877. #else
  178878. "add r2, r2, r5\n\t"
  178879. #endif
  178880. #ifdef WOLFSSL_KEIL
  178881. "adcs r3, r3, r6\n\t"
  178882. #elif defined(__clang__)
  178883. "adcs r3, r6\n\t"
  178884. #else
  178885. "adc r3, r6\n\t"
  178886. #endif
  178887. #ifdef WOLFSSL_KEIL
  178888. "adcs r4, r4, %[r]\n\t"
  178889. #elif defined(__clang__)
  178890. "adcs r4, %[r]\n\t"
  178891. #else
  178892. "adc r4, %[r]\n\t"
  178893. #endif
  178894. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178895. "lsrs r5, %[a], #16\n\t"
  178896. #else
  178897. "lsr r5, %[a], #16\n\t"
  178898. #endif
  178899. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178900. "lsrs r6, r7, #16\n\t"
  178901. #else
  178902. "lsr r6, r7, #16\n\t"
  178903. #endif
  178904. #ifdef WOLFSSL_KEIL
  178905. "muls r6, r5, r6\n\t"
  178906. #elif defined(__clang__)
  178907. "muls r6, r5\n\t"
  178908. #else
  178909. "mul r6, r5\n\t"
  178910. #endif
  178911. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178912. "adds r3, r3, r6\n\t"
  178913. #else
  178914. "add r3, r3, r6\n\t"
  178915. #endif
  178916. #ifdef WOLFSSL_KEIL
  178917. "adcs r4, r4, %[r]\n\t"
  178918. #elif defined(__clang__)
  178919. "adcs r4, %[r]\n\t"
  178920. #else
  178921. "adc r4, %[r]\n\t"
  178922. #endif
  178923. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178924. "adds r3, r3, r6\n\t"
  178925. #else
  178926. "add r3, r3, r6\n\t"
  178927. #endif
  178928. #ifdef WOLFSSL_KEIL
  178929. "adcs r4, r4, %[r]\n\t"
  178930. #elif defined(__clang__)
  178931. "adcs r4, %[r]\n\t"
  178932. #else
  178933. "adc r4, %[r]\n\t"
  178934. #endif
  178935. "uxth r6, r7\n\t"
  178936. #ifdef WOLFSSL_KEIL
  178937. "muls r5, r6, r5\n\t"
  178938. #elif defined(__clang__)
  178939. "muls r5, r6\n\t"
  178940. #else
  178941. "mul r5, r6\n\t"
  178942. #endif
  178943. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178944. "lsrs r6, r5, #16\n\t"
  178945. #else
  178946. "lsr r6, r5, #16\n\t"
  178947. #endif
  178948. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178949. "lsls r5, r5, #16\n\t"
  178950. #else
  178951. "lsl r5, r5, #16\n\t"
  178952. #endif
  178953. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178954. "adds r2, r2, r5\n\t"
  178955. #else
  178956. "add r2, r2, r5\n\t"
  178957. #endif
  178958. #ifdef WOLFSSL_KEIL
  178959. "adcs r3, r3, r6\n\t"
  178960. #elif defined(__clang__)
  178961. "adcs r3, r6\n\t"
  178962. #else
  178963. "adc r3, r6\n\t"
  178964. #endif
  178965. #ifdef WOLFSSL_KEIL
  178966. "adcs r4, r4, %[r]\n\t"
  178967. #elif defined(__clang__)
  178968. "adcs r4, %[r]\n\t"
  178969. #else
  178970. "adc r4, %[r]\n\t"
  178971. #endif
  178972. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178973. "adds r2, r2, r5\n\t"
  178974. #else
  178975. "add r2, r2, r5\n\t"
  178976. #endif
  178977. #ifdef WOLFSSL_KEIL
  178978. "adcs r3, r3, r6\n\t"
  178979. #elif defined(__clang__)
  178980. "adcs r3, r6\n\t"
  178981. #else
  178982. "adc r3, r6\n\t"
  178983. #endif
  178984. #ifdef WOLFSSL_KEIL
  178985. "adcs r4, r4, %[r]\n\t"
  178986. #elif defined(__clang__)
  178987. "adcs r4, %[r]\n\t"
  178988. #else
  178989. "adc r4, %[r]\n\t"
  178990. #endif
  178991. "# A[11] * A[1]\n\t"
  178992. "mov %[a], r9\n\t"
  178993. "mov r7, r11\n\t"
  178994. "ldr %[a], [%[a], #44]\n\t"
  178995. "uxth r5, %[a]\n\t"
  178996. "uxth r6, r7\n\t"
  178997. #ifdef WOLFSSL_KEIL
  178998. "muls r6, r5, r6\n\t"
  178999. #elif defined(__clang__)
  179000. "muls r6, r5\n\t"
  179001. #else
  179002. "mul r6, r5\n\t"
  179003. #endif
  179004. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179005. "adds r2, r2, r6\n\t"
  179006. #else
  179007. "add r2, r2, r6\n\t"
  179008. #endif
  179009. #ifdef WOLFSSL_KEIL
  179010. "adcs r3, r3, %[r]\n\t"
  179011. #elif defined(__clang__)
  179012. "adcs r3, %[r]\n\t"
  179013. #else
  179014. "adc r3, %[r]\n\t"
  179015. #endif
  179016. #ifdef WOLFSSL_KEIL
  179017. "adcs r4, r4, %[r]\n\t"
  179018. #elif defined(__clang__)
  179019. "adcs r4, %[r]\n\t"
  179020. #else
  179021. "adc r4, %[r]\n\t"
  179022. #endif
  179023. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179024. "adds r2, r2, r6\n\t"
  179025. #else
  179026. "add r2, r2, r6\n\t"
  179027. #endif
  179028. #ifdef WOLFSSL_KEIL
  179029. "adcs r3, r3, %[r]\n\t"
  179030. #elif defined(__clang__)
  179031. "adcs r3, %[r]\n\t"
  179032. #else
  179033. "adc r3, %[r]\n\t"
  179034. #endif
  179035. #ifdef WOLFSSL_KEIL
  179036. "adcs r4, r4, %[r]\n\t"
  179037. #elif defined(__clang__)
  179038. "adcs r4, %[r]\n\t"
  179039. #else
  179040. "adc r4, %[r]\n\t"
  179041. #endif
  179042. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179043. "lsrs r6, r7, #16\n\t"
  179044. #else
  179045. "lsr r6, r7, #16\n\t"
  179046. #endif
  179047. #ifdef WOLFSSL_KEIL
  179048. "muls r5, r6, r5\n\t"
  179049. #elif defined(__clang__)
  179050. "muls r5, r6\n\t"
  179051. #else
  179052. "mul r5, r6\n\t"
  179053. #endif
  179054. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179055. "lsrs r6, r5, #16\n\t"
  179056. #else
  179057. "lsr r6, r5, #16\n\t"
  179058. #endif
  179059. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179060. "lsls r5, r5, #16\n\t"
  179061. #else
  179062. "lsl r5, r5, #16\n\t"
  179063. #endif
  179064. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179065. "adds r2, r2, r5\n\t"
  179066. #else
  179067. "add r2, r2, r5\n\t"
  179068. #endif
  179069. #ifdef WOLFSSL_KEIL
  179070. "adcs r3, r3, r6\n\t"
  179071. #elif defined(__clang__)
  179072. "adcs r3, r6\n\t"
  179073. #else
  179074. "adc r3, r6\n\t"
  179075. #endif
  179076. #ifdef WOLFSSL_KEIL
  179077. "adcs r4, r4, %[r]\n\t"
  179078. #elif defined(__clang__)
  179079. "adcs r4, %[r]\n\t"
  179080. #else
  179081. "adc r4, %[r]\n\t"
  179082. #endif
  179083. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179084. "adds r2, r2, r5\n\t"
  179085. #else
  179086. "add r2, r2, r5\n\t"
  179087. #endif
  179088. #ifdef WOLFSSL_KEIL
  179089. "adcs r3, r3, r6\n\t"
  179090. #elif defined(__clang__)
  179091. "adcs r3, r6\n\t"
  179092. #else
  179093. "adc r3, r6\n\t"
  179094. #endif
  179095. #ifdef WOLFSSL_KEIL
  179096. "adcs r4, r4, %[r]\n\t"
  179097. #elif defined(__clang__)
  179098. "adcs r4, %[r]\n\t"
  179099. #else
  179100. "adc r4, %[r]\n\t"
  179101. #endif
  179102. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179103. "lsrs r5, %[a], #16\n\t"
  179104. #else
  179105. "lsr r5, %[a], #16\n\t"
  179106. #endif
  179107. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179108. "lsrs r6, r7, #16\n\t"
  179109. #else
  179110. "lsr r6, r7, #16\n\t"
  179111. #endif
  179112. #ifdef WOLFSSL_KEIL
  179113. "muls r6, r5, r6\n\t"
  179114. #elif defined(__clang__)
  179115. "muls r6, r5\n\t"
  179116. #else
  179117. "mul r6, r5\n\t"
  179118. #endif
  179119. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179120. "adds r3, r3, r6\n\t"
  179121. #else
  179122. "add r3, r3, r6\n\t"
  179123. #endif
  179124. #ifdef WOLFSSL_KEIL
  179125. "adcs r4, r4, %[r]\n\t"
  179126. #elif defined(__clang__)
  179127. "adcs r4, %[r]\n\t"
  179128. #else
  179129. "adc r4, %[r]\n\t"
  179130. #endif
  179131. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179132. "adds r3, r3, r6\n\t"
  179133. #else
  179134. "add r3, r3, r6\n\t"
  179135. #endif
  179136. #ifdef WOLFSSL_KEIL
  179137. "adcs r4, r4, %[r]\n\t"
  179138. #elif defined(__clang__)
  179139. "adcs r4, %[r]\n\t"
  179140. #else
  179141. "adc r4, %[r]\n\t"
  179142. #endif
  179143. "uxth r6, r7\n\t"
  179144. #ifdef WOLFSSL_KEIL
  179145. "muls r5, r6, r5\n\t"
  179146. #elif defined(__clang__)
  179147. "muls r5, r6\n\t"
  179148. #else
  179149. "mul r5, r6\n\t"
  179150. #endif
  179151. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179152. "lsrs r6, r5, #16\n\t"
  179153. #else
  179154. "lsr r6, r5, #16\n\t"
  179155. #endif
  179156. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179157. "lsls r5, r5, #16\n\t"
  179158. #else
  179159. "lsl r5, r5, #16\n\t"
  179160. #endif
  179161. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179162. "adds r2, r2, r5\n\t"
  179163. #else
  179164. "add r2, r2, r5\n\t"
  179165. #endif
  179166. #ifdef WOLFSSL_KEIL
  179167. "adcs r3, r3, r6\n\t"
  179168. #elif defined(__clang__)
  179169. "adcs r3, r6\n\t"
  179170. #else
  179171. "adc r3, r6\n\t"
  179172. #endif
  179173. #ifdef WOLFSSL_KEIL
  179174. "adcs r4, r4, %[r]\n\t"
  179175. #elif defined(__clang__)
  179176. "adcs r4, %[r]\n\t"
  179177. #else
  179178. "adc r4, %[r]\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. #ifdef WOLFSSL_KEIL
  179193. "adcs r4, r4, %[r]\n\t"
  179194. #elif defined(__clang__)
  179195. "adcs r4, %[r]\n\t"
  179196. #else
  179197. "adc r4, %[r]\n\t"
  179198. #endif
  179199. "# A[10] * A[2]\n\t"
  179200. "mov %[a], r9\n\t"
  179201. "mov r7, r12\n\t"
  179202. "ldr %[a], [%[a], #40]\n\t"
  179203. "uxth r5, %[a]\n\t"
  179204. "uxth r6, r7\n\t"
  179205. #ifdef WOLFSSL_KEIL
  179206. "muls r6, r5, r6\n\t"
  179207. #elif defined(__clang__)
  179208. "muls r6, r5\n\t"
  179209. #else
  179210. "mul r6, r5\n\t"
  179211. #endif
  179212. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179213. "adds r2, r2, r6\n\t"
  179214. #else
  179215. "add r2, r2, r6\n\t"
  179216. #endif
  179217. #ifdef WOLFSSL_KEIL
  179218. "adcs r3, r3, %[r]\n\t"
  179219. #elif defined(__clang__)
  179220. "adcs r3, %[r]\n\t"
  179221. #else
  179222. "adc r3, %[r]\n\t"
  179223. #endif
  179224. #ifdef WOLFSSL_KEIL
  179225. "adcs r4, r4, %[r]\n\t"
  179226. #elif defined(__clang__)
  179227. "adcs r4, %[r]\n\t"
  179228. #else
  179229. "adc r4, %[r]\n\t"
  179230. #endif
  179231. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179232. "adds r2, r2, r6\n\t"
  179233. #else
  179234. "add r2, r2, r6\n\t"
  179235. #endif
  179236. #ifdef WOLFSSL_KEIL
  179237. "adcs r3, r3, %[r]\n\t"
  179238. #elif defined(__clang__)
  179239. "adcs r3, %[r]\n\t"
  179240. #else
  179241. "adc r3, %[r]\n\t"
  179242. #endif
  179243. #ifdef WOLFSSL_KEIL
  179244. "adcs r4, r4, %[r]\n\t"
  179245. #elif defined(__clang__)
  179246. "adcs r4, %[r]\n\t"
  179247. #else
  179248. "adc r4, %[r]\n\t"
  179249. #endif
  179250. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179251. "lsrs r6, r7, #16\n\t"
  179252. #else
  179253. "lsr r6, r7, #16\n\t"
  179254. #endif
  179255. #ifdef WOLFSSL_KEIL
  179256. "muls r5, r6, r5\n\t"
  179257. #elif defined(__clang__)
  179258. "muls r5, r6\n\t"
  179259. #else
  179260. "mul r5, r6\n\t"
  179261. #endif
  179262. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179263. "lsrs r6, r5, #16\n\t"
  179264. #else
  179265. "lsr r6, r5, #16\n\t"
  179266. #endif
  179267. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179268. "lsls r5, r5, #16\n\t"
  179269. #else
  179270. "lsl r5, r5, #16\n\t"
  179271. #endif
  179272. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179273. "adds r2, r2, r5\n\t"
  179274. #else
  179275. "add r2, r2, r5\n\t"
  179276. #endif
  179277. #ifdef WOLFSSL_KEIL
  179278. "adcs r3, r3, r6\n\t"
  179279. #elif defined(__clang__)
  179280. "adcs r3, r6\n\t"
  179281. #else
  179282. "adc r3, r6\n\t"
  179283. #endif
  179284. #ifdef WOLFSSL_KEIL
  179285. "adcs r4, r4, %[r]\n\t"
  179286. #elif defined(__clang__)
  179287. "adcs r4, %[r]\n\t"
  179288. #else
  179289. "adc r4, %[r]\n\t"
  179290. #endif
  179291. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179292. "adds r2, r2, r5\n\t"
  179293. #else
  179294. "add r2, r2, r5\n\t"
  179295. #endif
  179296. #ifdef WOLFSSL_KEIL
  179297. "adcs r3, r3, r6\n\t"
  179298. #elif defined(__clang__)
  179299. "adcs r3, r6\n\t"
  179300. #else
  179301. "adc r3, r6\n\t"
  179302. #endif
  179303. #ifdef WOLFSSL_KEIL
  179304. "adcs r4, r4, %[r]\n\t"
  179305. #elif defined(__clang__)
  179306. "adcs r4, %[r]\n\t"
  179307. #else
  179308. "adc r4, %[r]\n\t"
  179309. #endif
  179310. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179311. "lsrs r5, %[a], #16\n\t"
  179312. #else
  179313. "lsr r5, %[a], #16\n\t"
  179314. #endif
  179315. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179316. "lsrs r6, r7, #16\n\t"
  179317. #else
  179318. "lsr r6, r7, #16\n\t"
  179319. #endif
  179320. #ifdef WOLFSSL_KEIL
  179321. "muls r6, r5, r6\n\t"
  179322. #elif defined(__clang__)
  179323. "muls r6, r5\n\t"
  179324. #else
  179325. "mul r6, r5\n\t"
  179326. #endif
  179327. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179328. "adds r3, r3, r6\n\t"
  179329. #else
  179330. "add r3, r3, r6\n\t"
  179331. #endif
  179332. #ifdef WOLFSSL_KEIL
  179333. "adcs r4, r4, %[r]\n\t"
  179334. #elif defined(__clang__)
  179335. "adcs r4, %[r]\n\t"
  179336. #else
  179337. "adc r4, %[r]\n\t"
  179338. #endif
  179339. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179340. "adds r3, r3, r6\n\t"
  179341. #else
  179342. "add r3, r3, r6\n\t"
  179343. #endif
  179344. #ifdef WOLFSSL_KEIL
  179345. "adcs r4, r4, %[r]\n\t"
  179346. #elif defined(__clang__)
  179347. "adcs r4, %[r]\n\t"
  179348. #else
  179349. "adc r4, %[r]\n\t"
  179350. #endif
  179351. "uxth r6, r7\n\t"
  179352. #ifdef WOLFSSL_KEIL
  179353. "muls r5, r6, r5\n\t"
  179354. #elif defined(__clang__)
  179355. "muls r5, r6\n\t"
  179356. #else
  179357. "mul r5, r6\n\t"
  179358. #endif
  179359. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179360. "lsrs r6, r5, #16\n\t"
  179361. #else
  179362. "lsr r6, r5, #16\n\t"
  179363. #endif
  179364. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179365. "lsls r5, r5, #16\n\t"
  179366. #else
  179367. "lsl r5, r5, #16\n\t"
  179368. #endif
  179369. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179370. "adds r2, r2, r5\n\t"
  179371. #else
  179372. "add r2, r2, r5\n\t"
  179373. #endif
  179374. #ifdef WOLFSSL_KEIL
  179375. "adcs r3, r3, r6\n\t"
  179376. #elif defined(__clang__)
  179377. "adcs r3, r6\n\t"
  179378. #else
  179379. "adc r3, r6\n\t"
  179380. #endif
  179381. #ifdef WOLFSSL_KEIL
  179382. "adcs r4, r4, %[r]\n\t"
  179383. #elif defined(__clang__)
  179384. "adcs r4, %[r]\n\t"
  179385. #else
  179386. "adc r4, %[r]\n\t"
  179387. #endif
  179388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179389. "adds r2, r2, r5\n\t"
  179390. #else
  179391. "add r2, r2, r5\n\t"
  179392. #endif
  179393. #ifdef WOLFSSL_KEIL
  179394. "adcs r3, r3, r6\n\t"
  179395. #elif defined(__clang__)
  179396. "adcs r3, r6\n\t"
  179397. #else
  179398. "adc r3, r6\n\t"
  179399. #endif
  179400. #ifdef WOLFSSL_KEIL
  179401. "adcs r4, r4, %[r]\n\t"
  179402. #elif defined(__clang__)
  179403. "adcs r4, %[r]\n\t"
  179404. #else
  179405. "adc r4, %[r]\n\t"
  179406. #endif
  179407. "# A[9] * A[3]\n\t"
  179408. "mov %[a], r9\n\t"
  179409. "mov r7, lr\n\t"
  179410. "ldr %[a], [%[a], #36]\n\t"
  179411. "uxth r5, %[a]\n\t"
  179412. "uxth r6, r7\n\t"
  179413. #ifdef WOLFSSL_KEIL
  179414. "muls r6, r5, r6\n\t"
  179415. #elif defined(__clang__)
  179416. "muls r6, r5\n\t"
  179417. #else
  179418. "mul r6, r5\n\t"
  179419. #endif
  179420. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179421. "adds r2, r2, r6\n\t"
  179422. #else
  179423. "add r2, r2, r6\n\t"
  179424. #endif
  179425. #ifdef WOLFSSL_KEIL
  179426. "adcs r3, r3, %[r]\n\t"
  179427. #elif defined(__clang__)
  179428. "adcs r3, %[r]\n\t"
  179429. #else
  179430. "adc r3, %[r]\n\t"
  179431. #endif
  179432. #ifdef WOLFSSL_KEIL
  179433. "adcs r4, r4, %[r]\n\t"
  179434. #elif defined(__clang__)
  179435. "adcs r4, %[r]\n\t"
  179436. #else
  179437. "adc r4, %[r]\n\t"
  179438. #endif
  179439. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179440. "adds r2, r2, r6\n\t"
  179441. #else
  179442. "add r2, r2, r6\n\t"
  179443. #endif
  179444. #ifdef WOLFSSL_KEIL
  179445. "adcs r3, r3, %[r]\n\t"
  179446. #elif defined(__clang__)
  179447. "adcs r3, %[r]\n\t"
  179448. #else
  179449. "adc r3, %[r]\n\t"
  179450. #endif
  179451. #ifdef WOLFSSL_KEIL
  179452. "adcs r4, r4, %[r]\n\t"
  179453. #elif defined(__clang__)
  179454. "adcs r4, %[r]\n\t"
  179455. #else
  179456. "adc r4, %[r]\n\t"
  179457. #endif
  179458. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179459. "lsrs r6, r7, #16\n\t"
  179460. #else
  179461. "lsr r6, r7, #16\n\t"
  179462. #endif
  179463. #ifdef WOLFSSL_KEIL
  179464. "muls r5, r6, r5\n\t"
  179465. #elif defined(__clang__)
  179466. "muls r5, r6\n\t"
  179467. #else
  179468. "mul r5, r6\n\t"
  179469. #endif
  179470. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179471. "lsrs r6, r5, #16\n\t"
  179472. #else
  179473. "lsr r6, r5, #16\n\t"
  179474. #endif
  179475. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179476. "lsls r5, r5, #16\n\t"
  179477. #else
  179478. "lsl r5, r5, #16\n\t"
  179479. #endif
  179480. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179481. "adds r2, r2, r5\n\t"
  179482. #else
  179483. "add r2, r2, r5\n\t"
  179484. #endif
  179485. #ifdef WOLFSSL_KEIL
  179486. "adcs r3, r3, r6\n\t"
  179487. #elif defined(__clang__)
  179488. "adcs r3, r6\n\t"
  179489. #else
  179490. "adc r3, r6\n\t"
  179491. #endif
  179492. #ifdef WOLFSSL_KEIL
  179493. "adcs r4, r4, %[r]\n\t"
  179494. #elif defined(__clang__)
  179495. "adcs r4, %[r]\n\t"
  179496. #else
  179497. "adc r4, %[r]\n\t"
  179498. #endif
  179499. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179500. "adds r2, r2, r5\n\t"
  179501. #else
  179502. "add r2, r2, r5\n\t"
  179503. #endif
  179504. #ifdef WOLFSSL_KEIL
  179505. "adcs r3, r3, r6\n\t"
  179506. #elif defined(__clang__)
  179507. "adcs r3, r6\n\t"
  179508. #else
  179509. "adc r3, r6\n\t"
  179510. #endif
  179511. #ifdef WOLFSSL_KEIL
  179512. "adcs r4, r4, %[r]\n\t"
  179513. #elif defined(__clang__)
  179514. "adcs r4, %[r]\n\t"
  179515. #else
  179516. "adc r4, %[r]\n\t"
  179517. #endif
  179518. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179519. "lsrs r5, %[a], #16\n\t"
  179520. #else
  179521. "lsr r5, %[a], #16\n\t"
  179522. #endif
  179523. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179524. "lsrs r6, r7, #16\n\t"
  179525. #else
  179526. "lsr r6, r7, #16\n\t"
  179527. #endif
  179528. #ifdef WOLFSSL_KEIL
  179529. "muls r6, r5, r6\n\t"
  179530. #elif defined(__clang__)
  179531. "muls r6, r5\n\t"
  179532. #else
  179533. "mul r6, r5\n\t"
  179534. #endif
  179535. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179536. "adds r3, r3, r6\n\t"
  179537. #else
  179538. "add r3, r3, r6\n\t"
  179539. #endif
  179540. #ifdef WOLFSSL_KEIL
  179541. "adcs r4, r4, %[r]\n\t"
  179542. #elif defined(__clang__)
  179543. "adcs r4, %[r]\n\t"
  179544. #else
  179545. "adc r4, %[r]\n\t"
  179546. #endif
  179547. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179548. "adds r3, r3, r6\n\t"
  179549. #else
  179550. "add r3, r3, r6\n\t"
  179551. #endif
  179552. #ifdef WOLFSSL_KEIL
  179553. "adcs r4, r4, %[r]\n\t"
  179554. #elif defined(__clang__)
  179555. "adcs r4, %[r]\n\t"
  179556. #else
  179557. "adc r4, %[r]\n\t"
  179558. #endif
  179559. "uxth r6, r7\n\t"
  179560. #ifdef WOLFSSL_KEIL
  179561. "muls r5, r6, r5\n\t"
  179562. #elif defined(__clang__)
  179563. "muls r5, r6\n\t"
  179564. #else
  179565. "mul r5, r6\n\t"
  179566. #endif
  179567. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179568. "lsrs r6, r5, #16\n\t"
  179569. #else
  179570. "lsr r6, r5, #16\n\t"
  179571. #endif
  179572. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179573. "lsls r5, r5, #16\n\t"
  179574. #else
  179575. "lsl r5, r5, #16\n\t"
  179576. #endif
  179577. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179578. "adds r2, r2, r5\n\t"
  179579. #else
  179580. "add r2, r2, r5\n\t"
  179581. #endif
  179582. #ifdef WOLFSSL_KEIL
  179583. "adcs r3, r3, r6\n\t"
  179584. #elif defined(__clang__)
  179585. "adcs r3, r6\n\t"
  179586. #else
  179587. "adc r3, r6\n\t"
  179588. #endif
  179589. #ifdef WOLFSSL_KEIL
  179590. "adcs r4, r4, %[r]\n\t"
  179591. #elif defined(__clang__)
  179592. "adcs r4, %[r]\n\t"
  179593. #else
  179594. "adc r4, %[r]\n\t"
  179595. #endif
  179596. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179597. "adds r2, r2, r5\n\t"
  179598. #else
  179599. "add r2, r2, r5\n\t"
  179600. #endif
  179601. #ifdef WOLFSSL_KEIL
  179602. "adcs r3, r3, r6\n\t"
  179603. #elif defined(__clang__)
  179604. "adcs r3, r6\n\t"
  179605. #else
  179606. "adc r3, r6\n\t"
  179607. #endif
  179608. #ifdef WOLFSSL_KEIL
  179609. "adcs r4, r4, %[r]\n\t"
  179610. #elif defined(__clang__)
  179611. "adcs r4, %[r]\n\t"
  179612. #else
  179613. "adc r4, %[r]\n\t"
  179614. #endif
  179615. "# A[8] * A[4]\n\t"
  179616. "mov %[a], r9\n\t"
  179617. "ldr r7, [%[a], #16]\n\t"
  179618. "ldr %[a], [%[a], #32]\n\t"
  179619. "uxth r5, %[a]\n\t"
  179620. "uxth r6, r7\n\t"
  179621. #ifdef WOLFSSL_KEIL
  179622. "muls r6, r5, r6\n\t"
  179623. #elif defined(__clang__)
  179624. "muls r6, r5\n\t"
  179625. #else
  179626. "mul r6, r5\n\t"
  179627. #endif
  179628. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179629. "adds r2, r2, r6\n\t"
  179630. #else
  179631. "add r2, r2, r6\n\t"
  179632. #endif
  179633. #ifdef WOLFSSL_KEIL
  179634. "adcs r3, r3, %[r]\n\t"
  179635. #elif defined(__clang__)
  179636. "adcs r3, %[r]\n\t"
  179637. #else
  179638. "adc r3, %[r]\n\t"
  179639. #endif
  179640. #ifdef WOLFSSL_KEIL
  179641. "adcs r4, r4, %[r]\n\t"
  179642. #elif defined(__clang__)
  179643. "adcs r4, %[r]\n\t"
  179644. #else
  179645. "adc r4, %[r]\n\t"
  179646. #endif
  179647. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179648. "adds r2, r2, r6\n\t"
  179649. #else
  179650. "add r2, r2, r6\n\t"
  179651. #endif
  179652. #ifdef WOLFSSL_KEIL
  179653. "adcs r3, r3, %[r]\n\t"
  179654. #elif defined(__clang__)
  179655. "adcs r3, %[r]\n\t"
  179656. #else
  179657. "adc r3, %[r]\n\t"
  179658. #endif
  179659. #ifdef WOLFSSL_KEIL
  179660. "adcs r4, r4, %[r]\n\t"
  179661. #elif defined(__clang__)
  179662. "adcs r4, %[r]\n\t"
  179663. #else
  179664. "adc r4, %[r]\n\t"
  179665. #endif
  179666. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179667. "lsrs r6, r7, #16\n\t"
  179668. #else
  179669. "lsr r6, r7, #16\n\t"
  179670. #endif
  179671. #ifdef WOLFSSL_KEIL
  179672. "muls r5, r6, r5\n\t"
  179673. #elif defined(__clang__)
  179674. "muls r5, r6\n\t"
  179675. #else
  179676. "mul r5, r6\n\t"
  179677. #endif
  179678. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179679. "lsrs r6, r5, #16\n\t"
  179680. #else
  179681. "lsr r6, r5, #16\n\t"
  179682. #endif
  179683. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179684. "lsls r5, r5, #16\n\t"
  179685. #else
  179686. "lsl r5, r5, #16\n\t"
  179687. #endif
  179688. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179689. "adds r2, r2, r5\n\t"
  179690. #else
  179691. "add r2, r2, r5\n\t"
  179692. #endif
  179693. #ifdef WOLFSSL_KEIL
  179694. "adcs r3, r3, r6\n\t"
  179695. #elif defined(__clang__)
  179696. "adcs r3, r6\n\t"
  179697. #else
  179698. "adc r3, r6\n\t"
  179699. #endif
  179700. #ifdef WOLFSSL_KEIL
  179701. "adcs r4, r4, %[r]\n\t"
  179702. #elif defined(__clang__)
  179703. "adcs r4, %[r]\n\t"
  179704. #else
  179705. "adc r4, %[r]\n\t"
  179706. #endif
  179707. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179708. "adds r2, r2, r5\n\t"
  179709. #else
  179710. "add r2, r2, r5\n\t"
  179711. #endif
  179712. #ifdef WOLFSSL_KEIL
  179713. "adcs r3, r3, r6\n\t"
  179714. #elif defined(__clang__)
  179715. "adcs r3, r6\n\t"
  179716. #else
  179717. "adc r3, r6\n\t"
  179718. #endif
  179719. #ifdef WOLFSSL_KEIL
  179720. "adcs r4, r4, %[r]\n\t"
  179721. #elif defined(__clang__)
  179722. "adcs r4, %[r]\n\t"
  179723. #else
  179724. "adc r4, %[r]\n\t"
  179725. #endif
  179726. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179727. "lsrs r5, %[a], #16\n\t"
  179728. #else
  179729. "lsr r5, %[a], #16\n\t"
  179730. #endif
  179731. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179732. "lsrs r6, r7, #16\n\t"
  179733. #else
  179734. "lsr r6, r7, #16\n\t"
  179735. #endif
  179736. #ifdef WOLFSSL_KEIL
  179737. "muls r6, r5, r6\n\t"
  179738. #elif defined(__clang__)
  179739. "muls r6, r5\n\t"
  179740. #else
  179741. "mul r6, r5\n\t"
  179742. #endif
  179743. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179744. "adds r3, r3, r6\n\t"
  179745. #else
  179746. "add r3, r3, r6\n\t"
  179747. #endif
  179748. #ifdef WOLFSSL_KEIL
  179749. "adcs r4, r4, %[r]\n\t"
  179750. #elif defined(__clang__)
  179751. "adcs r4, %[r]\n\t"
  179752. #else
  179753. "adc r4, %[r]\n\t"
  179754. #endif
  179755. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179756. "adds r3, r3, r6\n\t"
  179757. #else
  179758. "add r3, r3, r6\n\t"
  179759. #endif
  179760. #ifdef WOLFSSL_KEIL
  179761. "adcs r4, r4, %[r]\n\t"
  179762. #elif defined(__clang__)
  179763. "adcs r4, %[r]\n\t"
  179764. #else
  179765. "adc r4, %[r]\n\t"
  179766. #endif
  179767. "uxth r6, r7\n\t"
  179768. #ifdef WOLFSSL_KEIL
  179769. "muls r5, r6, r5\n\t"
  179770. #elif defined(__clang__)
  179771. "muls r5, r6\n\t"
  179772. #else
  179773. "mul r5, r6\n\t"
  179774. #endif
  179775. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179776. "lsrs r6, r5, #16\n\t"
  179777. #else
  179778. "lsr r6, r5, #16\n\t"
  179779. #endif
  179780. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179781. "lsls r5, r5, #16\n\t"
  179782. #else
  179783. "lsl r5, r5, #16\n\t"
  179784. #endif
  179785. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179786. "adds r2, r2, r5\n\t"
  179787. #else
  179788. "add r2, r2, r5\n\t"
  179789. #endif
  179790. #ifdef WOLFSSL_KEIL
  179791. "adcs r3, r3, r6\n\t"
  179792. #elif defined(__clang__)
  179793. "adcs r3, r6\n\t"
  179794. #else
  179795. "adc r3, r6\n\t"
  179796. #endif
  179797. #ifdef WOLFSSL_KEIL
  179798. "adcs r4, r4, %[r]\n\t"
  179799. #elif defined(__clang__)
  179800. "adcs r4, %[r]\n\t"
  179801. #else
  179802. "adc r4, %[r]\n\t"
  179803. #endif
  179804. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179805. "adds r2, r2, r5\n\t"
  179806. #else
  179807. "add r2, r2, r5\n\t"
  179808. #endif
  179809. #ifdef WOLFSSL_KEIL
  179810. "adcs r3, r3, r6\n\t"
  179811. #elif defined(__clang__)
  179812. "adcs r3, r6\n\t"
  179813. #else
  179814. "adc r3, r6\n\t"
  179815. #endif
  179816. #ifdef WOLFSSL_KEIL
  179817. "adcs r4, r4, %[r]\n\t"
  179818. #elif defined(__clang__)
  179819. "adcs r4, %[r]\n\t"
  179820. #else
  179821. "adc r4, %[r]\n\t"
  179822. #endif
  179823. "# A[7] * A[5]\n\t"
  179824. "mov %[a], r9\n\t"
  179825. "ldr r7, [%[a], #20]\n\t"
  179826. "ldr %[a], [%[a], #28]\n\t"
  179827. "uxth r5, %[a]\n\t"
  179828. "uxth r6, r7\n\t"
  179829. #ifdef WOLFSSL_KEIL
  179830. "muls r6, r5, r6\n\t"
  179831. #elif defined(__clang__)
  179832. "muls r6, r5\n\t"
  179833. #else
  179834. "mul r6, r5\n\t"
  179835. #endif
  179836. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179837. "adds r2, r2, r6\n\t"
  179838. #else
  179839. "add r2, r2, r6\n\t"
  179840. #endif
  179841. #ifdef WOLFSSL_KEIL
  179842. "adcs r3, r3, %[r]\n\t"
  179843. #elif defined(__clang__)
  179844. "adcs r3, %[r]\n\t"
  179845. #else
  179846. "adc r3, %[r]\n\t"
  179847. #endif
  179848. #ifdef WOLFSSL_KEIL
  179849. "adcs r4, r4, %[r]\n\t"
  179850. #elif defined(__clang__)
  179851. "adcs r4, %[r]\n\t"
  179852. #else
  179853. "adc r4, %[r]\n\t"
  179854. #endif
  179855. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179856. "adds r2, r2, r6\n\t"
  179857. #else
  179858. "add r2, r2, r6\n\t"
  179859. #endif
  179860. #ifdef WOLFSSL_KEIL
  179861. "adcs r3, r3, %[r]\n\t"
  179862. #elif defined(__clang__)
  179863. "adcs r3, %[r]\n\t"
  179864. #else
  179865. "adc r3, %[r]\n\t"
  179866. #endif
  179867. #ifdef WOLFSSL_KEIL
  179868. "adcs r4, r4, %[r]\n\t"
  179869. #elif defined(__clang__)
  179870. "adcs r4, %[r]\n\t"
  179871. #else
  179872. "adc r4, %[r]\n\t"
  179873. #endif
  179874. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179875. "lsrs r6, r7, #16\n\t"
  179876. #else
  179877. "lsr r6, r7, #16\n\t"
  179878. #endif
  179879. #ifdef WOLFSSL_KEIL
  179880. "muls r5, r6, r5\n\t"
  179881. #elif defined(__clang__)
  179882. "muls r5, r6\n\t"
  179883. #else
  179884. "mul r5, r6\n\t"
  179885. #endif
  179886. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179887. "lsrs r6, r5, #16\n\t"
  179888. #else
  179889. "lsr r6, r5, #16\n\t"
  179890. #endif
  179891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179892. "lsls r5, r5, #16\n\t"
  179893. #else
  179894. "lsl r5, r5, #16\n\t"
  179895. #endif
  179896. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179897. "adds r2, r2, r5\n\t"
  179898. #else
  179899. "add r2, r2, r5\n\t"
  179900. #endif
  179901. #ifdef WOLFSSL_KEIL
  179902. "adcs r3, r3, r6\n\t"
  179903. #elif defined(__clang__)
  179904. "adcs r3, r6\n\t"
  179905. #else
  179906. "adc r3, r6\n\t"
  179907. #endif
  179908. #ifdef WOLFSSL_KEIL
  179909. "adcs r4, r4, %[r]\n\t"
  179910. #elif defined(__clang__)
  179911. "adcs r4, %[r]\n\t"
  179912. #else
  179913. "adc r4, %[r]\n\t"
  179914. #endif
  179915. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179916. "adds r2, r2, r5\n\t"
  179917. #else
  179918. "add r2, r2, r5\n\t"
  179919. #endif
  179920. #ifdef WOLFSSL_KEIL
  179921. "adcs r3, r3, r6\n\t"
  179922. #elif defined(__clang__)
  179923. "adcs r3, r6\n\t"
  179924. #else
  179925. "adc r3, r6\n\t"
  179926. #endif
  179927. #ifdef WOLFSSL_KEIL
  179928. "adcs r4, r4, %[r]\n\t"
  179929. #elif defined(__clang__)
  179930. "adcs r4, %[r]\n\t"
  179931. #else
  179932. "adc r4, %[r]\n\t"
  179933. #endif
  179934. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179935. "lsrs r5, %[a], #16\n\t"
  179936. #else
  179937. "lsr r5, %[a], #16\n\t"
  179938. #endif
  179939. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179940. "lsrs r6, r7, #16\n\t"
  179941. #else
  179942. "lsr r6, r7, #16\n\t"
  179943. #endif
  179944. #ifdef WOLFSSL_KEIL
  179945. "muls r6, r5, r6\n\t"
  179946. #elif defined(__clang__)
  179947. "muls r6, r5\n\t"
  179948. #else
  179949. "mul r6, r5\n\t"
  179950. #endif
  179951. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179952. "adds r3, r3, r6\n\t"
  179953. #else
  179954. "add r3, r3, r6\n\t"
  179955. #endif
  179956. #ifdef WOLFSSL_KEIL
  179957. "adcs r4, r4, %[r]\n\t"
  179958. #elif defined(__clang__)
  179959. "adcs r4, %[r]\n\t"
  179960. #else
  179961. "adc r4, %[r]\n\t"
  179962. #endif
  179963. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179964. "adds r3, r3, r6\n\t"
  179965. #else
  179966. "add r3, r3, r6\n\t"
  179967. #endif
  179968. #ifdef WOLFSSL_KEIL
  179969. "adcs r4, r4, %[r]\n\t"
  179970. #elif defined(__clang__)
  179971. "adcs r4, %[r]\n\t"
  179972. #else
  179973. "adc r4, %[r]\n\t"
  179974. #endif
  179975. "uxth r6, r7\n\t"
  179976. #ifdef WOLFSSL_KEIL
  179977. "muls r5, r6, r5\n\t"
  179978. #elif defined(__clang__)
  179979. "muls r5, r6\n\t"
  179980. #else
  179981. "mul r5, r6\n\t"
  179982. #endif
  179983. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179984. "lsrs r6, r5, #16\n\t"
  179985. #else
  179986. "lsr r6, r5, #16\n\t"
  179987. #endif
  179988. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179989. "lsls r5, r5, #16\n\t"
  179990. #else
  179991. "lsl r5, r5, #16\n\t"
  179992. #endif
  179993. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179994. "adds r2, r2, r5\n\t"
  179995. #else
  179996. "add r2, r2, r5\n\t"
  179997. #endif
  179998. #ifdef WOLFSSL_KEIL
  179999. "adcs r3, r3, r6\n\t"
  180000. #elif defined(__clang__)
  180001. "adcs r3, r6\n\t"
  180002. #else
  180003. "adc r3, r6\n\t"
  180004. #endif
  180005. #ifdef WOLFSSL_KEIL
  180006. "adcs r4, r4, %[r]\n\t"
  180007. #elif defined(__clang__)
  180008. "adcs r4, %[r]\n\t"
  180009. #else
  180010. "adc r4, %[r]\n\t"
  180011. #endif
  180012. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180013. "adds r2, r2, r5\n\t"
  180014. #else
  180015. "add r2, r2, r5\n\t"
  180016. #endif
  180017. #ifdef WOLFSSL_KEIL
  180018. "adcs r3, r3, r6\n\t"
  180019. #elif defined(__clang__)
  180020. "adcs r3, r6\n\t"
  180021. #else
  180022. "adc r3, r6\n\t"
  180023. #endif
  180024. #ifdef WOLFSSL_KEIL
  180025. "adcs r4, r4, %[r]\n\t"
  180026. #elif defined(__clang__)
  180027. "adcs r4, %[r]\n\t"
  180028. #else
  180029. "adc r4, %[r]\n\t"
  180030. #endif
  180031. "# A[6] * A[6]\n\t"
  180032. "mov %[a], r9\n\t"
  180033. "ldr r7, [%[a], #24]\n\t"
  180034. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180035. "lsrs r6, r7, #16\n\t"
  180036. #else
  180037. "lsr r6, r7, #16\n\t"
  180038. #endif
  180039. "uxth r5, r7\n\t"
  180040. #ifdef WOLFSSL_KEIL
  180041. "muls r5, r5, r5\n\t"
  180042. #elif defined(__clang__)
  180043. "muls r5, r5\n\t"
  180044. #else
  180045. "mul r5, r5\n\t"
  180046. #endif
  180047. #ifdef WOLFSSL_KEIL
  180048. "muls r6, r6, r6\n\t"
  180049. #elif defined(__clang__)
  180050. "muls r6, r6\n\t"
  180051. #else
  180052. "mul r6, r6\n\t"
  180053. #endif
  180054. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180055. "adds r2, r2, r5\n\t"
  180056. #else
  180057. "add r2, r2, r5\n\t"
  180058. #endif
  180059. #ifdef WOLFSSL_KEIL
  180060. "adcs r3, r3, r6\n\t"
  180061. #elif defined(__clang__)
  180062. "adcs r3, r6\n\t"
  180063. #else
  180064. "adc r3, r6\n\t"
  180065. #endif
  180066. #ifdef WOLFSSL_KEIL
  180067. "adcs r4, r4, %[r]\n\t"
  180068. #elif defined(__clang__)
  180069. "adcs r4, %[r]\n\t"
  180070. #else
  180071. "adc r4, %[r]\n\t"
  180072. #endif
  180073. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180074. "lsrs r6, r7, #16\n\t"
  180075. #else
  180076. "lsr r6, r7, #16\n\t"
  180077. #endif
  180078. "uxth r5, r7\n\t"
  180079. #ifdef WOLFSSL_KEIL
  180080. "muls r5, r6, r5\n\t"
  180081. #elif defined(__clang__)
  180082. "muls r5, r6\n\t"
  180083. #else
  180084. "mul r5, r6\n\t"
  180085. #endif
  180086. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180087. "lsrs r6, r5, #15\n\t"
  180088. #else
  180089. "lsr r6, r5, #15\n\t"
  180090. #endif
  180091. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180092. "lsls r5, r5, #17\n\t"
  180093. #else
  180094. "lsl r5, r5, #17\n\t"
  180095. #endif
  180096. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180097. "adds r2, r2, r5\n\t"
  180098. #else
  180099. "add r2, r2, r5\n\t"
  180100. #endif
  180101. #ifdef WOLFSSL_KEIL
  180102. "adcs r3, r3, r6\n\t"
  180103. #elif defined(__clang__)
  180104. "adcs r3, r6\n\t"
  180105. #else
  180106. "adc r3, r6\n\t"
  180107. #endif
  180108. #ifdef WOLFSSL_KEIL
  180109. "adcs r4, r4, %[r]\n\t"
  180110. #elif defined(__clang__)
  180111. "adcs r4, %[r]\n\t"
  180112. #else
  180113. "adc r4, %[r]\n\t"
  180114. #endif
  180115. "str r2, [sp, #48]\n\t"
  180116. "# A[7] * A[6]\n\t"
  180117. "movs r2, #0\n\t"
  180118. "ldr %[a], [%[a], #28]\n\t"
  180119. "uxth r5, %[a]\n\t"
  180120. "uxth r6, r7\n\t"
  180121. #ifdef WOLFSSL_KEIL
  180122. "muls r6, r5, r6\n\t"
  180123. #elif defined(__clang__)
  180124. "muls r6, r5\n\t"
  180125. #else
  180126. "mul r6, r5\n\t"
  180127. #endif
  180128. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180129. "adds r3, r3, r6\n\t"
  180130. #else
  180131. "add r3, r3, r6\n\t"
  180132. #endif
  180133. #ifdef WOLFSSL_KEIL
  180134. "adcs r4, r4, %[r]\n\t"
  180135. #elif defined(__clang__)
  180136. "adcs r4, %[r]\n\t"
  180137. #else
  180138. "adc r4, %[r]\n\t"
  180139. #endif
  180140. #ifdef WOLFSSL_KEIL
  180141. "adcs r2, r2, %[r]\n\t"
  180142. #elif defined(__clang__)
  180143. "adcs r2, %[r]\n\t"
  180144. #else
  180145. "adc r2, %[r]\n\t"
  180146. #endif
  180147. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180148. "adds r3, r3, r6\n\t"
  180149. #else
  180150. "add r3, r3, r6\n\t"
  180151. #endif
  180152. #ifdef WOLFSSL_KEIL
  180153. "adcs r4, r4, %[r]\n\t"
  180154. #elif defined(__clang__)
  180155. "adcs r4, %[r]\n\t"
  180156. #else
  180157. "adc r4, %[r]\n\t"
  180158. #endif
  180159. #ifdef WOLFSSL_KEIL
  180160. "adcs r2, r2, %[r]\n\t"
  180161. #elif defined(__clang__)
  180162. "adcs r2, %[r]\n\t"
  180163. #else
  180164. "adc r2, %[r]\n\t"
  180165. #endif
  180166. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180167. "lsrs r6, r7, #16\n\t"
  180168. #else
  180169. "lsr r6, r7, #16\n\t"
  180170. #endif
  180171. #ifdef WOLFSSL_KEIL
  180172. "muls r5, r6, r5\n\t"
  180173. #elif defined(__clang__)
  180174. "muls r5, r6\n\t"
  180175. #else
  180176. "mul r5, r6\n\t"
  180177. #endif
  180178. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180179. "lsrs r6, r5, #16\n\t"
  180180. #else
  180181. "lsr r6, r5, #16\n\t"
  180182. #endif
  180183. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180184. "lsls r5, r5, #16\n\t"
  180185. #else
  180186. "lsl r5, r5, #16\n\t"
  180187. #endif
  180188. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180189. "adds r3, r3, r5\n\t"
  180190. #else
  180191. "add r3, r3, r5\n\t"
  180192. #endif
  180193. #ifdef WOLFSSL_KEIL
  180194. "adcs r4, r4, r6\n\t"
  180195. #elif defined(__clang__)
  180196. "adcs r4, r6\n\t"
  180197. #else
  180198. "adc r4, r6\n\t"
  180199. #endif
  180200. #ifdef WOLFSSL_KEIL
  180201. "adcs r2, r2, %[r]\n\t"
  180202. #elif defined(__clang__)
  180203. "adcs r2, %[r]\n\t"
  180204. #else
  180205. "adc r2, %[r]\n\t"
  180206. #endif
  180207. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180208. "adds r3, r3, r5\n\t"
  180209. #else
  180210. "add r3, r3, r5\n\t"
  180211. #endif
  180212. #ifdef WOLFSSL_KEIL
  180213. "adcs r4, r4, r6\n\t"
  180214. #elif defined(__clang__)
  180215. "adcs r4, r6\n\t"
  180216. #else
  180217. "adc r4, r6\n\t"
  180218. #endif
  180219. #ifdef WOLFSSL_KEIL
  180220. "adcs r2, r2, %[r]\n\t"
  180221. #elif defined(__clang__)
  180222. "adcs r2, %[r]\n\t"
  180223. #else
  180224. "adc r2, %[r]\n\t"
  180225. #endif
  180226. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180227. "lsrs r5, %[a], #16\n\t"
  180228. #else
  180229. "lsr r5, %[a], #16\n\t"
  180230. #endif
  180231. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180232. "lsrs r6, r7, #16\n\t"
  180233. #else
  180234. "lsr r6, r7, #16\n\t"
  180235. #endif
  180236. #ifdef WOLFSSL_KEIL
  180237. "muls r6, r5, r6\n\t"
  180238. #elif defined(__clang__)
  180239. "muls r6, r5\n\t"
  180240. #else
  180241. "mul r6, r5\n\t"
  180242. #endif
  180243. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180244. "adds r4, r4, r6\n\t"
  180245. #else
  180246. "add r4, r4, r6\n\t"
  180247. #endif
  180248. #ifdef WOLFSSL_KEIL
  180249. "adcs r2, r2, %[r]\n\t"
  180250. #elif defined(__clang__)
  180251. "adcs r2, %[r]\n\t"
  180252. #else
  180253. "adc r2, %[r]\n\t"
  180254. #endif
  180255. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180256. "adds r4, r4, r6\n\t"
  180257. #else
  180258. "add r4, r4, r6\n\t"
  180259. #endif
  180260. #ifdef WOLFSSL_KEIL
  180261. "adcs r2, r2, %[r]\n\t"
  180262. #elif defined(__clang__)
  180263. "adcs r2, %[r]\n\t"
  180264. #else
  180265. "adc r2, %[r]\n\t"
  180266. #endif
  180267. "uxth r6, r7\n\t"
  180268. #ifdef WOLFSSL_KEIL
  180269. "muls r5, r6, r5\n\t"
  180270. #elif defined(__clang__)
  180271. "muls r5, r6\n\t"
  180272. #else
  180273. "mul r5, r6\n\t"
  180274. #endif
  180275. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180276. "lsrs r6, r5, #16\n\t"
  180277. #else
  180278. "lsr r6, r5, #16\n\t"
  180279. #endif
  180280. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180281. "lsls r5, r5, #16\n\t"
  180282. #else
  180283. "lsl r5, r5, #16\n\t"
  180284. #endif
  180285. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180286. "adds r3, r3, r5\n\t"
  180287. #else
  180288. "add r3, r3, r5\n\t"
  180289. #endif
  180290. #ifdef WOLFSSL_KEIL
  180291. "adcs r4, r4, r6\n\t"
  180292. #elif defined(__clang__)
  180293. "adcs r4, r6\n\t"
  180294. #else
  180295. "adc r4, r6\n\t"
  180296. #endif
  180297. #ifdef WOLFSSL_KEIL
  180298. "adcs r2, r2, %[r]\n\t"
  180299. #elif defined(__clang__)
  180300. "adcs r2, %[r]\n\t"
  180301. #else
  180302. "adc r2, %[r]\n\t"
  180303. #endif
  180304. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180305. "adds r3, r3, r5\n\t"
  180306. #else
  180307. "add r3, r3, r5\n\t"
  180308. #endif
  180309. #ifdef WOLFSSL_KEIL
  180310. "adcs r4, r4, r6\n\t"
  180311. #elif defined(__clang__)
  180312. "adcs r4, r6\n\t"
  180313. #else
  180314. "adc r4, r6\n\t"
  180315. #endif
  180316. #ifdef WOLFSSL_KEIL
  180317. "adcs r2, r2, %[r]\n\t"
  180318. #elif defined(__clang__)
  180319. "adcs r2, %[r]\n\t"
  180320. #else
  180321. "adc r2, %[r]\n\t"
  180322. #endif
  180323. "# A[8] * A[5]\n\t"
  180324. "mov %[a], r9\n\t"
  180325. "ldr r7, [%[a], #20]\n\t"
  180326. "ldr %[a], [%[a], #32]\n\t"
  180327. "uxth r5, %[a]\n\t"
  180328. "uxth r6, r7\n\t"
  180329. #ifdef WOLFSSL_KEIL
  180330. "muls r6, r5, r6\n\t"
  180331. #elif defined(__clang__)
  180332. "muls r6, r5\n\t"
  180333. #else
  180334. "mul r6, r5\n\t"
  180335. #endif
  180336. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180337. "adds r3, r3, r6\n\t"
  180338. #else
  180339. "add r3, r3, r6\n\t"
  180340. #endif
  180341. #ifdef WOLFSSL_KEIL
  180342. "adcs r4, r4, %[r]\n\t"
  180343. #elif defined(__clang__)
  180344. "adcs r4, %[r]\n\t"
  180345. #else
  180346. "adc r4, %[r]\n\t"
  180347. #endif
  180348. #ifdef WOLFSSL_KEIL
  180349. "adcs r2, r2, %[r]\n\t"
  180350. #elif defined(__clang__)
  180351. "adcs r2, %[r]\n\t"
  180352. #else
  180353. "adc r2, %[r]\n\t"
  180354. #endif
  180355. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180356. "adds r3, r3, r6\n\t"
  180357. #else
  180358. "add r3, r3, r6\n\t"
  180359. #endif
  180360. #ifdef WOLFSSL_KEIL
  180361. "adcs r4, r4, %[r]\n\t"
  180362. #elif defined(__clang__)
  180363. "adcs r4, %[r]\n\t"
  180364. #else
  180365. "adc r4, %[r]\n\t"
  180366. #endif
  180367. #ifdef WOLFSSL_KEIL
  180368. "adcs r2, r2, %[r]\n\t"
  180369. #elif defined(__clang__)
  180370. "adcs r2, %[r]\n\t"
  180371. #else
  180372. "adc r2, %[r]\n\t"
  180373. #endif
  180374. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180375. "lsrs r6, r7, #16\n\t"
  180376. #else
  180377. "lsr r6, r7, #16\n\t"
  180378. #endif
  180379. #ifdef WOLFSSL_KEIL
  180380. "muls r5, r6, r5\n\t"
  180381. #elif defined(__clang__)
  180382. "muls r5, r6\n\t"
  180383. #else
  180384. "mul r5, r6\n\t"
  180385. #endif
  180386. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180387. "lsrs r6, r5, #16\n\t"
  180388. #else
  180389. "lsr r6, r5, #16\n\t"
  180390. #endif
  180391. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180392. "lsls r5, r5, #16\n\t"
  180393. #else
  180394. "lsl r5, r5, #16\n\t"
  180395. #endif
  180396. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180397. "adds r3, r3, r5\n\t"
  180398. #else
  180399. "add r3, r3, r5\n\t"
  180400. #endif
  180401. #ifdef WOLFSSL_KEIL
  180402. "adcs r4, r4, r6\n\t"
  180403. #elif defined(__clang__)
  180404. "adcs r4, r6\n\t"
  180405. #else
  180406. "adc r4, r6\n\t"
  180407. #endif
  180408. #ifdef WOLFSSL_KEIL
  180409. "adcs r2, r2, %[r]\n\t"
  180410. #elif defined(__clang__)
  180411. "adcs r2, %[r]\n\t"
  180412. #else
  180413. "adc r2, %[r]\n\t"
  180414. #endif
  180415. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180416. "adds r3, r3, r5\n\t"
  180417. #else
  180418. "add r3, r3, r5\n\t"
  180419. #endif
  180420. #ifdef WOLFSSL_KEIL
  180421. "adcs r4, r4, r6\n\t"
  180422. #elif defined(__clang__)
  180423. "adcs r4, r6\n\t"
  180424. #else
  180425. "adc r4, r6\n\t"
  180426. #endif
  180427. #ifdef WOLFSSL_KEIL
  180428. "adcs r2, r2, %[r]\n\t"
  180429. #elif defined(__clang__)
  180430. "adcs r2, %[r]\n\t"
  180431. #else
  180432. "adc r2, %[r]\n\t"
  180433. #endif
  180434. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180435. "lsrs r5, %[a], #16\n\t"
  180436. #else
  180437. "lsr r5, %[a], #16\n\t"
  180438. #endif
  180439. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180440. "lsrs r6, r7, #16\n\t"
  180441. #else
  180442. "lsr r6, r7, #16\n\t"
  180443. #endif
  180444. #ifdef WOLFSSL_KEIL
  180445. "muls r6, r5, r6\n\t"
  180446. #elif defined(__clang__)
  180447. "muls r6, r5\n\t"
  180448. #else
  180449. "mul r6, r5\n\t"
  180450. #endif
  180451. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180452. "adds r4, r4, r6\n\t"
  180453. #else
  180454. "add r4, r4, r6\n\t"
  180455. #endif
  180456. #ifdef WOLFSSL_KEIL
  180457. "adcs r2, r2, %[r]\n\t"
  180458. #elif defined(__clang__)
  180459. "adcs r2, %[r]\n\t"
  180460. #else
  180461. "adc r2, %[r]\n\t"
  180462. #endif
  180463. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180464. "adds r4, r4, r6\n\t"
  180465. #else
  180466. "add r4, r4, r6\n\t"
  180467. #endif
  180468. #ifdef WOLFSSL_KEIL
  180469. "adcs r2, r2, %[r]\n\t"
  180470. #elif defined(__clang__)
  180471. "adcs r2, %[r]\n\t"
  180472. #else
  180473. "adc r2, %[r]\n\t"
  180474. #endif
  180475. "uxth r6, r7\n\t"
  180476. #ifdef WOLFSSL_KEIL
  180477. "muls r5, r6, r5\n\t"
  180478. #elif defined(__clang__)
  180479. "muls r5, r6\n\t"
  180480. #else
  180481. "mul r5, r6\n\t"
  180482. #endif
  180483. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180484. "lsrs r6, r5, #16\n\t"
  180485. #else
  180486. "lsr r6, r5, #16\n\t"
  180487. #endif
  180488. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180489. "lsls r5, r5, #16\n\t"
  180490. #else
  180491. "lsl r5, r5, #16\n\t"
  180492. #endif
  180493. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180494. "adds r3, r3, r5\n\t"
  180495. #else
  180496. "add r3, r3, r5\n\t"
  180497. #endif
  180498. #ifdef WOLFSSL_KEIL
  180499. "adcs r4, r4, r6\n\t"
  180500. #elif defined(__clang__)
  180501. "adcs r4, r6\n\t"
  180502. #else
  180503. "adc r4, r6\n\t"
  180504. #endif
  180505. #ifdef WOLFSSL_KEIL
  180506. "adcs r2, r2, %[r]\n\t"
  180507. #elif defined(__clang__)
  180508. "adcs r2, %[r]\n\t"
  180509. #else
  180510. "adc r2, %[r]\n\t"
  180511. #endif
  180512. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180513. "adds r3, r3, r5\n\t"
  180514. #else
  180515. "add r3, r3, r5\n\t"
  180516. #endif
  180517. #ifdef WOLFSSL_KEIL
  180518. "adcs r4, r4, r6\n\t"
  180519. #elif defined(__clang__)
  180520. "adcs r4, r6\n\t"
  180521. #else
  180522. "adc r4, r6\n\t"
  180523. #endif
  180524. #ifdef WOLFSSL_KEIL
  180525. "adcs r2, r2, %[r]\n\t"
  180526. #elif defined(__clang__)
  180527. "adcs r2, %[r]\n\t"
  180528. #else
  180529. "adc r2, %[r]\n\t"
  180530. #endif
  180531. "# A[9] * A[4]\n\t"
  180532. "mov %[a], r9\n\t"
  180533. "ldr r7, [%[a], #16]\n\t"
  180534. "ldr %[a], [%[a], #36]\n\t"
  180535. "uxth r5, %[a]\n\t"
  180536. "uxth r6, r7\n\t"
  180537. #ifdef WOLFSSL_KEIL
  180538. "muls r6, r5, r6\n\t"
  180539. #elif defined(__clang__)
  180540. "muls r6, r5\n\t"
  180541. #else
  180542. "mul r6, r5\n\t"
  180543. #endif
  180544. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180545. "adds r3, r3, r6\n\t"
  180546. #else
  180547. "add r3, r3, r6\n\t"
  180548. #endif
  180549. #ifdef WOLFSSL_KEIL
  180550. "adcs r4, r4, %[r]\n\t"
  180551. #elif defined(__clang__)
  180552. "adcs r4, %[r]\n\t"
  180553. #else
  180554. "adc r4, %[r]\n\t"
  180555. #endif
  180556. #ifdef WOLFSSL_KEIL
  180557. "adcs r2, r2, %[r]\n\t"
  180558. #elif defined(__clang__)
  180559. "adcs r2, %[r]\n\t"
  180560. #else
  180561. "adc r2, %[r]\n\t"
  180562. #endif
  180563. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180564. "adds r3, r3, r6\n\t"
  180565. #else
  180566. "add r3, r3, r6\n\t"
  180567. #endif
  180568. #ifdef WOLFSSL_KEIL
  180569. "adcs r4, r4, %[r]\n\t"
  180570. #elif defined(__clang__)
  180571. "adcs r4, %[r]\n\t"
  180572. #else
  180573. "adc r4, %[r]\n\t"
  180574. #endif
  180575. #ifdef WOLFSSL_KEIL
  180576. "adcs r2, r2, %[r]\n\t"
  180577. #elif defined(__clang__)
  180578. "adcs r2, %[r]\n\t"
  180579. #else
  180580. "adc r2, %[r]\n\t"
  180581. #endif
  180582. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180583. "lsrs r6, r7, #16\n\t"
  180584. #else
  180585. "lsr r6, r7, #16\n\t"
  180586. #endif
  180587. #ifdef WOLFSSL_KEIL
  180588. "muls r5, r6, r5\n\t"
  180589. #elif defined(__clang__)
  180590. "muls r5, r6\n\t"
  180591. #else
  180592. "mul r5, r6\n\t"
  180593. #endif
  180594. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180595. "lsrs r6, r5, #16\n\t"
  180596. #else
  180597. "lsr r6, r5, #16\n\t"
  180598. #endif
  180599. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180600. "lsls r5, r5, #16\n\t"
  180601. #else
  180602. "lsl r5, r5, #16\n\t"
  180603. #endif
  180604. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180605. "adds r3, r3, r5\n\t"
  180606. #else
  180607. "add r3, r3, r5\n\t"
  180608. #endif
  180609. #ifdef WOLFSSL_KEIL
  180610. "adcs r4, r4, r6\n\t"
  180611. #elif defined(__clang__)
  180612. "adcs r4, r6\n\t"
  180613. #else
  180614. "adc r4, r6\n\t"
  180615. #endif
  180616. #ifdef WOLFSSL_KEIL
  180617. "adcs r2, r2, %[r]\n\t"
  180618. #elif defined(__clang__)
  180619. "adcs r2, %[r]\n\t"
  180620. #else
  180621. "adc r2, %[r]\n\t"
  180622. #endif
  180623. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180624. "adds r3, r3, r5\n\t"
  180625. #else
  180626. "add r3, r3, r5\n\t"
  180627. #endif
  180628. #ifdef WOLFSSL_KEIL
  180629. "adcs r4, r4, r6\n\t"
  180630. #elif defined(__clang__)
  180631. "adcs r4, r6\n\t"
  180632. #else
  180633. "adc r4, r6\n\t"
  180634. #endif
  180635. #ifdef WOLFSSL_KEIL
  180636. "adcs r2, r2, %[r]\n\t"
  180637. #elif defined(__clang__)
  180638. "adcs r2, %[r]\n\t"
  180639. #else
  180640. "adc r2, %[r]\n\t"
  180641. #endif
  180642. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180643. "lsrs r5, %[a], #16\n\t"
  180644. #else
  180645. "lsr r5, %[a], #16\n\t"
  180646. #endif
  180647. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180648. "lsrs r6, r7, #16\n\t"
  180649. #else
  180650. "lsr r6, r7, #16\n\t"
  180651. #endif
  180652. #ifdef WOLFSSL_KEIL
  180653. "muls r6, r5, r6\n\t"
  180654. #elif defined(__clang__)
  180655. "muls r6, r5\n\t"
  180656. #else
  180657. "mul r6, r5\n\t"
  180658. #endif
  180659. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180660. "adds r4, r4, r6\n\t"
  180661. #else
  180662. "add r4, r4, r6\n\t"
  180663. #endif
  180664. #ifdef WOLFSSL_KEIL
  180665. "adcs r2, r2, %[r]\n\t"
  180666. #elif defined(__clang__)
  180667. "adcs r2, %[r]\n\t"
  180668. #else
  180669. "adc r2, %[r]\n\t"
  180670. #endif
  180671. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180672. "adds r4, r4, r6\n\t"
  180673. #else
  180674. "add r4, r4, r6\n\t"
  180675. #endif
  180676. #ifdef WOLFSSL_KEIL
  180677. "adcs r2, r2, %[r]\n\t"
  180678. #elif defined(__clang__)
  180679. "adcs r2, %[r]\n\t"
  180680. #else
  180681. "adc r2, %[r]\n\t"
  180682. #endif
  180683. "uxth r6, r7\n\t"
  180684. #ifdef WOLFSSL_KEIL
  180685. "muls r5, r6, r5\n\t"
  180686. #elif defined(__clang__)
  180687. "muls r5, r6\n\t"
  180688. #else
  180689. "mul r5, r6\n\t"
  180690. #endif
  180691. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180692. "lsrs r6, r5, #16\n\t"
  180693. #else
  180694. "lsr r6, r5, #16\n\t"
  180695. #endif
  180696. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180697. "lsls r5, r5, #16\n\t"
  180698. #else
  180699. "lsl r5, r5, #16\n\t"
  180700. #endif
  180701. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180702. "adds r3, r3, r5\n\t"
  180703. #else
  180704. "add r3, r3, r5\n\t"
  180705. #endif
  180706. #ifdef WOLFSSL_KEIL
  180707. "adcs r4, r4, r6\n\t"
  180708. #elif defined(__clang__)
  180709. "adcs r4, r6\n\t"
  180710. #else
  180711. "adc r4, r6\n\t"
  180712. #endif
  180713. #ifdef WOLFSSL_KEIL
  180714. "adcs r2, r2, %[r]\n\t"
  180715. #elif defined(__clang__)
  180716. "adcs r2, %[r]\n\t"
  180717. #else
  180718. "adc r2, %[r]\n\t"
  180719. #endif
  180720. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180721. "adds r3, r3, r5\n\t"
  180722. #else
  180723. "add r3, r3, r5\n\t"
  180724. #endif
  180725. #ifdef WOLFSSL_KEIL
  180726. "adcs r4, r4, r6\n\t"
  180727. #elif defined(__clang__)
  180728. "adcs r4, r6\n\t"
  180729. #else
  180730. "adc r4, r6\n\t"
  180731. #endif
  180732. #ifdef WOLFSSL_KEIL
  180733. "adcs r2, r2, %[r]\n\t"
  180734. #elif defined(__clang__)
  180735. "adcs r2, %[r]\n\t"
  180736. #else
  180737. "adc r2, %[r]\n\t"
  180738. #endif
  180739. "# A[10] * A[3]\n\t"
  180740. "mov %[a], r9\n\t"
  180741. "mov r7, lr\n\t"
  180742. "ldr %[a], [%[a], #40]\n\t"
  180743. "uxth r5, %[a]\n\t"
  180744. "uxth r6, r7\n\t"
  180745. #ifdef WOLFSSL_KEIL
  180746. "muls r6, r5, r6\n\t"
  180747. #elif defined(__clang__)
  180748. "muls r6, r5\n\t"
  180749. #else
  180750. "mul r6, r5\n\t"
  180751. #endif
  180752. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180753. "adds r3, r3, r6\n\t"
  180754. #else
  180755. "add r3, r3, r6\n\t"
  180756. #endif
  180757. #ifdef WOLFSSL_KEIL
  180758. "adcs r4, r4, %[r]\n\t"
  180759. #elif defined(__clang__)
  180760. "adcs r4, %[r]\n\t"
  180761. #else
  180762. "adc r4, %[r]\n\t"
  180763. #endif
  180764. #ifdef WOLFSSL_KEIL
  180765. "adcs r2, r2, %[r]\n\t"
  180766. #elif defined(__clang__)
  180767. "adcs r2, %[r]\n\t"
  180768. #else
  180769. "adc r2, %[r]\n\t"
  180770. #endif
  180771. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180772. "adds r3, r3, r6\n\t"
  180773. #else
  180774. "add r3, r3, r6\n\t"
  180775. #endif
  180776. #ifdef WOLFSSL_KEIL
  180777. "adcs r4, r4, %[r]\n\t"
  180778. #elif defined(__clang__)
  180779. "adcs r4, %[r]\n\t"
  180780. #else
  180781. "adc r4, %[r]\n\t"
  180782. #endif
  180783. #ifdef WOLFSSL_KEIL
  180784. "adcs r2, r2, %[r]\n\t"
  180785. #elif defined(__clang__)
  180786. "adcs r2, %[r]\n\t"
  180787. #else
  180788. "adc r2, %[r]\n\t"
  180789. #endif
  180790. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180791. "lsrs r6, r7, #16\n\t"
  180792. #else
  180793. "lsr r6, r7, #16\n\t"
  180794. #endif
  180795. #ifdef WOLFSSL_KEIL
  180796. "muls r5, r6, r5\n\t"
  180797. #elif defined(__clang__)
  180798. "muls r5, r6\n\t"
  180799. #else
  180800. "mul r5, r6\n\t"
  180801. #endif
  180802. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180803. "lsrs r6, r5, #16\n\t"
  180804. #else
  180805. "lsr r6, r5, #16\n\t"
  180806. #endif
  180807. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180808. "lsls r5, r5, #16\n\t"
  180809. #else
  180810. "lsl r5, r5, #16\n\t"
  180811. #endif
  180812. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180813. "adds r3, r3, r5\n\t"
  180814. #else
  180815. "add r3, r3, r5\n\t"
  180816. #endif
  180817. #ifdef WOLFSSL_KEIL
  180818. "adcs r4, r4, r6\n\t"
  180819. #elif defined(__clang__)
  180820. "adcs r4, r6\n\t"
  180821. #else
  180822. "adc r4, r6\n\t"
  180823. #endif
  180824. #ifdef WOLFSSL_KEIL
  180825. "adcs r2, r2, %[r]\n\t"
  180826. #elif defined(__clang__)
  180827. "adcs r2, %[r]\n\t"
  180828. #else
  180829. "adc r2, %[r]\n\t"
  180830. #endif
  180831. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180832. "adds r3, r3, r5\n\t"
  180833. #else
  180834. "add r3, r3, r5\n\t"
  180835. #endif
  180836. #ifdef WOLFSSL_KEIL
  180837. "adcs r4, r4, r6\n\t"
  180838. #elif defined(__clang__)
  180839. "adcs r4, r6\n\t"
  180840. #else
  180841. "adc r4, r6\n\t"
  180842. #endif
  180843. #ifdef WOLFSSL_KEIL
  180844. "adcs r2, r2, %[r]\n\t"
  180845. #elif defined(__clang__)
  180846. "adcs r2, %[r]\n\t"
  180847. #else
  180848. "adc r2, %[r]\n\t"
  180849. #endif
  180850. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180851. "lsrs r5, %[a], #16\n\t"
  180852. #else
  180853. "lsr r5, %[a], #16\n\t"
  180854. #endif
  180855. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180856. "lsrs r6, r7, #16\n\t"
  180857. #else
  180858. "lsr r6, r7, #16\n\t"
  180859. #endif
  180860. #ifdef WOLFSSL_KEIL
  180861. "muls r6, r5, r6\n\t"
  180862. #elif defined(__clang__)
  180863. "muls r6, r5\n\t"
  180864. #else
  180865. "mul r6, r5\n\t"
  180866. #endif
  180867. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180868. "adds r4, r4, r6\n\t"
  180869. #else
  180870. "add r4, r4, r6\n\t"
  180871. #endif
  180872. #ifdef WOLFSSL_KEIL
  180873. "adcs r2, r2, %[r]\n\t"
  180874. #elif defined(__clang__)
  180875. "adcs r2, %[r]\n\t"
  180876. #else
  180877. "adc r2, %[r]\n\t"
  180878. #endif
  180879. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180880. "adds r4, r4, r6\n\t"
  180881. #else
  180882. "add r4, r4, r6\n\t"
  180883. #endif
  180884. #ifdef WOLFSSL_KEIL
  180885. "adcs r2, r2, %[r]\n\t"
  180886. #elif defined(__clang__)
  180887. "adcs r2, %[r]\n\t"
  180888. #else
  180889. "adc r2, %[r]\n\t"
  180890. #endif
  180891. "uxth r6, r7\n\t"
  180892. #ifdef WOLFSSL_KEIL
  180893. "muls r5, r6, r5\n\t"
  180894. #elif defined(__clang__)
  180895. "muls r5, r6\n\t"
  180896. #else
  180897. "mul r5, r6\n\t"
  180898. #endif
  180899. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180900. "lsrs r6, r5, #16\n\t"
  180901. #else
  180902. "lsr r6, r5, #16\n\t"
  180903. #endif
  180904. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180905. "lsls r5, r5, #16\n\t"
  180906. #else
  180907. "lsl r5, r5, #16\n\t"
  180908. #endif
  180909. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180910. "adds r3, r3, r5\n\t"
  180911. #else
  180912. "add r3, r3, r5\n\t"
  180913. #endif
  180914. #ifdef WOLFSSL_KEIL
  180915. "adcs r4, r4, r6\n\t"
  180916. #elif defined(__clang__)
  180917. "adcs r4, r6\n\t"
  180918. #else
  180919. "adc r4, r6\n\t"
  180920. #endif
  180921. #ifdef WOLFSSL_KEIL
  180922. "adcs r2, r2, %[r]\n\t"
  180923. #elif defined(__clang__)
  180924. "adcs r2, %[r]\n\t"
  180925. #else
  180926. "adc r2, %[r]\n\t"
  180927. #endif
  180928. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180929. "adds r3, r3, r5\n\t"
  180930. #else
  180931. "add r3, r3, r5\n\t"
  180932. #endif
  180933. #ifdef WOLFSSL_KEIL
  180934. "adcs r4, r4, r6\n\t"
  180935. #elif defined(__clang__)
  180936. "adcs r4, r6\n\t"
  180937. #else
  180938. "adc r4, r6\n\t"
  180939. #endif
  180940. #ifdef WOLFSSL_KEIL
  180941. "adcs r2, r2, %[r]\n\t"
  180942. #elif defined(__clang__)
  180943. "adcs r2, %[r]\n\t"
  180944. #else
  180945. "adc r2, %[r]\n\t"
  180946. #endif
  180947. "# A[11] * A[2]\n\t"
  180948. "mov %[a], r9\n\t"
  180949. "mov r7, r12\n\t"
  180950. "ldr %[a], [%[a], #44]\n\t"
  180951. "uxth r5, %[a]\n\t"
  180952. "uxth r6, r7\n\t"
  180953. #ifdef WOLFSSL_KEIL
  180954. "muls r6, r5, r6\n\t"
  180955. #elif defined(__clang__)
  180956. "muls r6, r5\n\t"
  180957. #else
  180958. "mul r6, r5\n\t"
  180959. #endif
  180960. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180961. "adds r3, r3, r6\n\t"
  180962. #else
  180963. "add r3, r3, r6\n\t"
  180964. #endif
  180965. #ifdef WOLFSSL_KEIL
  180966. "adcs r4, r4, %[r]\n\t"
  180967. #elif defined(__clang__)
  180968. "adcs r4, %[r]\n\t"
  180969. #else
  180970. "adc r4, %[r]\n\t"
  180971. #endif
  180972. #ifdef WOLFSSL_KEIL
  180973. "adcs r2, r2, %[r]\n\t"
  180974. #elif defined(__clang__)
  180975. "adcs r2, %[r]\n\t"
  180976. #else
  180977. "adc r2, %[r]\n\t"
  180978. #endif
  180979. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180980. "adds r3, r3, r6\n\t"
  180981. #else
  180982. "add r3, r3, r6\n\t"
  180983. #endif
  180984. #ifdef WOLFSSL_KEIL
  180985. "adcs r4, r4, %[r]\n\t"
  180986. #elif defined(__clang__)
  180987. "adcs r4, %[r]\n\t"
  180988. #else
  180989. "adc r4, %[r]\n\t"
  180990. #endif
  180991. #ifdef WOLFSSL_KEIL
  180992. "adcs r2, r2, %[r]\n\t"
  180993. #elif defined(__clang__)
  180994. "adcs r2, %[r]\n\t"
  180995. #else
  180996. "adc r2, %[r]\n\t"
  180997. #endif
  180998. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180999. "lsrs r6, r7, #16\n\t"
  181000. #else
  181001. "lsr r6, r7, #16\n\t"
  181002. #endif
  181003. #ifdef WOLFSSL_KEIL
  181004. "muls r5, r6, r5\n\t"
  181005. #elif defined(__clang__)
  181006. "muls r5, r6\n\t"
  181007. #else
  181008. "mul r5, r6\n\t"
  181009. #endif
  181010. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181011. "lsrs r6, r5, #16\n\t"
  181012. #else
  181013. "lsr r6, r5, #16\n\t"
  181014. #endif
  181015. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181016. "lsls r5, r5, #16\n\t"
  181017. #else
  181018. "lsl r5, r5, #16\n\t"
  181019. #endif
  181020. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181021. "adds r3, r3, r5\n\t"
  181022. #else
  181023. "add r3, r3, r5\n\t"
  181024. #endif
  181025. #ifdef WOLFSSL_KEIL
  181026. "adcs r4, r4, r6\n\t"
  181027. #elif defined(__clang__)
  181028. "adcs r4, r6\n\t"
  181029. #else
  181030. "adc r4, r6\n\t"
  181031. #endif
  181032. #ifdef WOLFSSL_KEIL
  181033. "adcs r2, r2, %[r]\n\t"
  181034. #elif defined(__clang__)
  181035. "adcs r2, %[r]\n\t"
  181036. #else
  181037. "adc r2, %[r]\n\t"
  181038. #endif
  181039. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181040. "adds r3, r3, r5\n\t"
  181041. #else
  181042. "add r3, r3, r5\n\t"
  181043. #endif
  181044. #ifdef WOLFSSL_KEIL
  181045. "adcs r4, r4, r6\n\t"
  181046. #elif defined(__clang__)
  181047. "adcs r4, r6\n\t"
  181048. #else
  181049. "adc r4, r6\n\t"
  181050. #endif
  181051. #ifdef WOLFSSL_KEIL
  181052. "adcs r2, r2, %[r]\n\t"
  181053. #elif defined(__clang__)
  181054. "adcs r2, %[r]\n\t"
  181055. #else
  181056. "adc r2, %[r]\n\t"
  181057. #endif
  181058. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181059. "lsrs r5, %[a], #16\n\t"
  181060. #else
  181061. "lsr r5, %[a], #16\n\t"
  181062. #endif
  181063. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181064. "lsrs r6, r7, #16\n\t"
  181065. #else
  181066. "lsr r6, r7, #16\n\t"
  181067. #endif
  181068. #ifdef WOLFSSL_KEIL
  181069. "muls r6, r5, r6\n\t"
  181070. #elif defined(__clang__)
  181071. "muls r6, r5\n\t"
  181072. #else
  181073. "mul r6, r5\n\t"
  181074. #endif
  181075. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181076. "adds r4, r4, r6\n\t"
  181077. #else
  181078. "add r4, r4, r6\n\t"
  181079. #endif
  181080. #ifdef WOLFSSL_KEIL
  181081. "adcs r2, r2, %[r]\n\t"
  181082. #elif defined(__clang__)
  181083. "adcs r2, %[r]\n\t"
  181084. #else
  181085. "adc r2, %[r]\n\t"
  181086. #endif
  181087. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181088. "adds r4, r4, r6\n\t"
  181089. #else
  181090. "add r4, r4, r6\n\t"
  181091. #endif
  181092. #ifdef WOLFSSL_KEIL
  181093. "adcs r2, r2, %[r]\n\t"
  181094. #elif defined(__clang__)
  181095. "adcs r2, %[r]\n\t"
  181096. #else
  181097. "adc r2, %[r]\n\t"
  181098. #endif
  181099. "uxth r6, r7\n\t"
  181100. #ifdef WOLFSSL_KEIL
  181101. "muls r5, r6, r5\n\t"
  181102. #elif defined(__clang__)
  181103. "muls r5, r6\n\t"
  181104. #else
  181105. "mul r5, r6\n\t"
  181106. #endif
  181107. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181108. "lsrs r6, r5, #16\n\t"
  181109. #else
  181110. "lsr r6, r5, #16\n\t"
  181111. #endif
  181112. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181113. "lsls r5, r5, #16\n\t"
  181114. #else
  181115. "lsl r5, r5, #16\n\t"
  181116. #endif
  181117. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181118. "adds r3, r3, r5\n\t"
  181119. #else
  181120. "add r3, r3, r5\n\t"
  181121. #endif
  181122. #ifdef WOLFSSL_KEIL
  181123. "adcs r4, r4, r6\n\t"
  181124. #elif defined(__clang__)
  181125. "adcs r4, r6\n\t"
  181126. #else
  181127. "adc r4, r6\n\t"
  181128. #endif
  181129. #ifdef WOLFSSL_KEIL
  181130. "adcs r2, r2, %[r]\n\t"
  181131. #elif defined(__clang__)
  181132. "adcs r2, %[r]\n\t"
  181133. #else
  181134. "adc r2, %[r]\n\t"
  181135. #endif
  181136. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181137. "adds r3, r3, r5\n\t"
  181138. #else
  181139. "add r3, r3, r5\n\t"
  181140. #endif
  181141. #ifdef WOLFSSL_KEIL
  181142. "adcs r4, r4, r6\n\t"
  181143. #elif defined(__clang__)
  181144. "adcs r4, r6\n\t"
  181145. #else
  181146. "adc r4, r6\n\t"
  181147. #endif
  181148. #ifdef WOLFSSL_KEIL
  181149. "adcs r2, r2, %[r]\n\t"
  181150. #elif defined(__clang__)
  181151. "adcs r2, %[r]\n\t"
  181152. #else
  181153. "adc r2, %[r]\n\t"
  181154. #endif
  181155. "# A[12] * A[1]\n\t"
  181156. "mov %[a], r9\n\t"
  181157. "mov r7, r11\n\t"
  181158. "ldr %[a], [%[a], #48]\n\t"
  181159. "uxth r5, %[a]\n\t"
  181160. "uxth r6, r7\n\t"
  181161. #ifdef WOLFSSL_KEIL
  181162. "muls r6, r5, r6\n\t"
  181163. #elif defined(__clang__)
  181164. "muls r6, r5\n\t"
  181165. #else
  181166. "mul r6, r5\n\t"
  181167. #endif
  181168. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181169. "adds r3, r3, r6\n\t"
  181170. #else
  181171. "add r3, r3, r6\n\t"
  181172. #endif
  181173. #ifdef WOLFSSL_KEIL
  181174. "adcs r4, r4, %[r]\n\t"
  181175. #elif defined(__clang__)
  181176. "adcs r4, %[r]\n\t"
  181177. #else
  181178. "adc r4, %[r]\n\t"
  181179. #endif
  181180. #ifdef WOLFSSL_KEIL
  181181. "adcs r2, r2, %[r]\n\t"
  181182. #elif defined(__clang__)
  181183. "adcs r2, %[r]\n\t"
  181184. #else
  181185. "adc r2, %[r]\n\t"
  181186. #endif
  181187. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181188. "adds r3, r3, r6\n\t"
  181189. #else
  181190. "add r3, r3, r6\n\t"
  181191. #endif
  181192. #ifdef WOLFSSL_KEIL
  181193. "adcs r4, r4, %[r]\n\t"
  181194. #elif defined(__clang__)
  181195. "adcs r4, %[r]\n\t"
  181196. #else
  181197. "adc r4, %[r]\n\t"
  181198. #endif
  181199. #ifdef WOLFSSL_KEIL
  181200. "adcs r2, r2, %[r]\n\t"
  181201. #elif defined(__clang__)
  181202. "adcs r2, %[r]\n\t"
  181203. #else
  181204. "adc r2, %[r]\n\t"
  181205. #endif
  181206. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181207. "lsrs r6, r7, #16\n\t"
  181208. #else
  181209. "lsr r6, r7, #16\n\t"
  181210. #endif
  181211. #ifdef WOLFSSL_KEIL
  181212. "muls r5, r6, r5\n\t"
  181213. #elif defined(__clang__)
  181214. "muls r5, r6\n\t"
  181215. #else
  181216. "mul r5, r6\n\t"
  181217. #endif
  181218. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181219. "lsrs r6, r5, #16\n\t"
  181220. #else
  181221. "lsr r6, r5, #16\n\t"
  181222. #endif
  181223. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181224. "lsls r5, r5, #16\n\t"
  181225. #else
  181226. "lsl r5, r5, #16\n\t"
  181227. #endif
  181228. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181229. "adds r3, r3, r5\n\t"
  181230. #else
  181231. "add r3, r3, r5\n\t"
  181232. #endif
  181233. #ifdef WOLFSSL_KEIL
  181234. "adcs r4, r4, r6\n\t"
  181235. #elif defined(__clang__)
  181236. "adcs r4, r6\n\t"
  181237. #else
  181238. "adc r4, r6\n\t"
  181239. #endif
  181240. #ifdef WOLFSSL_KEIL
  181241. "adcs r2, r2, %[r]\n\t"
  181242. #elif defined(__clang__)
  181243. "adcs r2, %[r]\n\t"
  181244. #else
  181245. "adc r2, %[r]\n\t"
  181246. #endif
  181247. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181248. "adds r3, r3, r5\n\t"
  181249. #else
  181250. "add r3, r3, r5\n\t"
  181251. #endif
  181252. #ifdef WOLFSSL_KEIL
  181253. "adcs r4, r4, r6\n\t"
  181254. #elif defined(__clang__)
  181255. "adcs r4, r6\n\t"
  181256. #else
  181257. "adc r4, r6\n\t"
  181258. #endif
  181259. #ifdef WOLFSSL_KEIL
  181260. "adcs r2, r2, %[r]\n\t"
  181261. #elif defined(__clang__)
  181262. "adcs r2, %[r]\n\t"
  181263. #else
  181264. "adc r2, %[r]\n\t"
  181265. #endif
  181266. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181267. "lsrs r5, %[a], #16\n\t"
  181268. #else
  181269. "lsr r5, %[a], #16\n\t"
  181270. #endif
  181271. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181272. "lsrs r6, r7, #16\n\t"
  181273. #else
  181274. "lsr r6, r7, #16\n\t"
  181275. #endif
  181276. #ifdef WOLFSSL_KEIL
  181277. "muls r6, r5, r6\n\t"
  181278. #elif defined(__clang__)
  181279. "muls r6, r5\n\t"
  181280. #else
  181281. "mul r6, r5\n\t"
  181282. #endif
  181283. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181284. "adds r4, r4, r6\n\t"
  181285. #else
  181286. "add r4, r4, r6\n\t"
  181287. #endif
  181288. #ifdef WOLFSSL_KEIL
  181289. "adcs r2, r2, %[r]\n\t"
  181290. #elif defined(__clang__)
  181291. "adcs r2, %[r]\n\t"
  181292. #else
  181293. "adc r2, %[r]\n\t"
  181294. #endif
  181295. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181296. "adds r4, r4, r6\n\t"
  181297. #else
  181298. "add r4, r4, r6\n\t"
  181299. #endif
  181300. #ifdef WOLFSSL_KEIL
  181301. "adcs r2, r2, %[r]\n\t"
  181302. #elif defined(__clang__)
  181303. "adcs r2, %[r]\n\t"
  181304. #else
  181305. "adc r2, %[r]\n\t"
  181306. #endif
  181307. "uxth r6, r7\n\t"
  181308. #ifdef WOLFSSL_KEIL
  181309. "muls r5, r6, r5\n\t"
  181310. #elif defined(__clang__)
  181311. "muls r5, r6\n\t"
  181312. #else
  181313. "mul r5, r6\n\t"
  181314. #endif
  181315. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181316. "lsrs r6, r5, #16\n\t"
  181317. #else
  181318. "lsr r6, r5, #16\n\t"
  181319. #endif
  181320. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181321. "lsls r5, r5, #16\n\t"
  181322. #else
  181323. "lsl r5, r5, #16\n\t"
  181324. #endif
  181325. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181326. "adds r3, r3, r5\n\t"
  181327. #else
  181328. "add r3, r3, r5\n\t"
  181329. #endif
  181330. #ifdef WOLFSSL_KEIL
  181331. "adcs r4, r4, r6\n\t"
  181332. #elif defined(__clang__)
  181333. "adcs r4, r6\n\t"
  181334. #else
  181335. "adc r4, r6\n\t"
  181336. #endif
  181337. #ifdef WOLFSSL_KEIL
  181338. "adcs r2, r2, %[r]\n\t"
  181339. #elif defined(__clang__)
  181340. "adcs r2, %[r]\n\t"
  181341. #else
  181342. "adc r2, %[r]\n\t"
  181343. #endif
  181344. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181345. "adds r3, r3, r5\n\t"
  181346. #else
  181347. "add r3, r3, r5\n\t"
  181348. #endif
  181349. #ifdef WOLFSSL_KEIL
  181350. "adcs r4, r4, r6\n\t"
  181351. #elif defined(__clang__)
  181352. "adcs r4, r6\n\t"
  181353. #else
  181354. "adc r4, r6\n\t"
  181355. #endif
  181356. #ifdef WOLFSSL_KEIL
  181357. "adcs r2, r2, %[r]\n\t"
  181358. #elif defined(__clang__)
  181359. "adcs r2, %[r]\n\t"
  181360. #else
  181361. "adc r2, %[r]\n\t"
  181362. #endif
  181363. "# A[13] * A[0]\n\t"
  181364. "mov %[a], r9\n\t"
  181365. "mov r7, r10\n\t"
  181366. "ldr %[a], [%[a], #52]\n\t"
  181367. "uxth r5, %[a]\n\t"
  181368. "uxth r6, r7\n\t"
  181369. #ifdef WOLFSSL_KEIL
  181370. "muls r6, r5, r6\n\t"
  181371. #elif defined(__clang__)
  181372. "muls r6, r5\n\t"
  181373. #else
  181374. "mul r6, r5\n\t"
  181375. #endif
  181376. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181377. "adds r3, r3, r6\n\t"
  181378. #else
  181379. "add r3, r3, r6\n\t"
  181380. #endif
  181381. #ifdef WOLFSSL_KEIL
  181382. "adcs r4, r4, %[r]\n\t"
  181383. #elif defined(__clang__)
  181384. "adcs r4, %[r]\n\t"
  181385. #else
  181386. "adc r4, %[r]\n\t"
  181387. #endif
  181388. #ifdef WOLFSSL_KEIL
  181389. "adcs r2, r2, %[r]\n\t"
  181390. #elif defined(__clang__)
  181391. "adcs r2, %[r]\n\t"
  181392. #else
  181393. "adc r2, %[r]\n\t"
  181394. #endif
  181395. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181396. "adds r3, r3, r6\n\t"
  181397. #else
  181398. "add r3, r3, r6\n\t"
  181399. #endif
  181400. #ifdef WOLFSSL_KEIL
  181401. "adcs r4, r4, %[r]\n\t"
  181402. #elif defined(__clang__)
  181403. "adcs r4, %[r]\n\t"
  181404. #else
  181405. "adc r4, %[r]\n\t"
  181406. #endif
  181407. #ifdef WOLFSSL_KEIL
  181408. "adcs r2, r2, %[r]\n\t"
  181409. #elif defined(__clang__)
  181410. "adcs r2, %[r]\n\t"
  181411. #else
  181412. "adc r2, %[r]\n\t"
  181413. #endif
  181414. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181415. "lsrs r6, r7, #16\n\t"
  181416. #else
  181417. "lsr r6, r7, #16\n\t"
  181418. #endif
  181419. #ifdef WOLFSSL_KEIL
  181420. "muls r5, r6, r5\n\t"
  181421. #elif defined(__clang__)
  181422. "muls r5, r6\n\t"
  181423. #else
  181424. "mul r5, r6\n\t"
  181425. #endif
  181426. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181427. "lsrs r6, r5, #16\n\t"
  181428. #else
  181429. "lsr r6, r5, #16\n\t"
  181430. #endif
  181431. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181432. "lsls r5, r5, #16\n\t"
  181433. #else
  181434. "lsl r5, r5, #16\n\t"
  181435. #endif
  181436. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181437. "adds r3, r3, r5\n\t"
  181438. #else
  181439. "add r3, r3, r5\n\t"
  181440. #endif
  181441. #ifdef WOLFSSL_KEIL
  181442. "adcs r4, r4, r6\n\t"
  181443. #elif defined(__clang__)
  181444. "adcs r4, r6\n\t"
  181445. #else
  181446. "adc r4, r6\n\t"
  181447. #endif
  181448. #ifdef WOLFSSL_KEIL
  181449. "adcs r2, r2, %[r]\n\t"
  181450. #elif defined(__clang__)
  181451. "adcs r2, %[r]\n\t"
  181452. #else
  181453. "adc r2, %[r]\n\t"
  181454. #endif
  181455. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181456. "adds r3, r3, r5\n\t"
  181457. #else
  181458. "add r3, r3, r5\n\t"
  181459. #endif
  181460. #ifdef WOLFSSL_KEIL
  181461. "adcs r4, r4, r6\n\t"
  181462. #elif defined(__clang__)
  181463. "adcs r4, r6\n\t"
  181464. #else
  181465. "adc r4, r6\n\t"
  181466. #endif
  181467. #ifdef WOLFSSL_KEIL
  181468. "adcs r2, r2, %[r]\n\t"
  181469. #elif defined(__clang__)
  181470. "adcs r2, %[r]\n\t"
  181471. #else
  181472. "adc r2, %[r]\n\t"
  181473. #endif
  181474. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181475. "lsrs r5, %[a], #16\n\t"
  181476. #else
  181477. "lsr r5, %[a], #16\n\t"
  181478. #endif
  181479. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181480. "lsrs r6, r7, #16\n\t"
  181481. #else
  181482. "lsr r6, r7, #16\n\t"
  181483. #endif
  181484. #ifdef WOLFSSL_KEIL
  181485. "muls r6, r5, r6\n\t"
  181486. #elif defined(__clang__)
  181487. "muls r6, r5\n\t"
  181488. #else
  181489. "mul r6, r5\n\t"
  181490. #endif
  181491. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181492. "adds r4, r4, r6\n\t"
  181493. #else
  181494. "add r4, r4, r6\n\t"
  181495. #endif
  181496. #ifdef WOLFSSL_KEIL
  181497. "adcs r2, r2, %[r]\n\t"
  181498. #elif defined(__clang__)
  181499. "adcs r2, %[r]\n\t"
  181500. #else
  181501. "adc r2, %[r]\n\t"
  181502. #endif
  181503. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181504. "adds r4, r4, r6\n\t"
  181505. #else
  181506. "add r4, r4, r6\n\t"
  181507. #endif
  181508. #ifdef WOLFSSL_KEIL
  181509. "adcs r2, r2, %[r]\n\t"
  181510. #elif defined(__clang__)
  181511. "adcs r2, %[r]\n\t"
  181512. #else
  181513. "adc r2, %[r]\n\t"
  181514. #endif
  181515. "uxth r6, r7\n\t"
  181516. #ifdef WOLFSSL_KEIL
  181517. "muls r5, r6, r5\n\t"
  181518. #elif defined(__clang__)
  181519. "muls r5, r6\n\t"
  181520. #else
  181521. "mul r5, r6\n\t"
  181522. #endif
  181523. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181524. "lsrs r6, r5, #16\n\t"
  181525. #else
  181526. "lsr r6, r5, #16\n\t"
  181527. #endif
  181528. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181529. "lsls r5, r5, #16\n\t"
  181530. #else
  181531. "lsl r5, r5, #16\n\t"
  181532. #endif
  181533. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181534. "adds r3, r3, r5\n\t"
  181535. #else
  181536. "add r3, r3, r5\n\t"
  181537. #endif
  181538. #ifdef WOLFSSL_KEIL
  181539. "adcs r4, r4, r6\n\t"
  181540. #elif defined(__clang__)
  181541. "adcs r4, r6\n\t"
  181542. #else
  181543. "adc r4, r6\n\t"
  181544. #endif
  181545. #ifdef WOLFSSL_KEIL
  181546. "adcs r2, r2, %[r]\n\t"
  181547. #elif defined(__clang__)
  181548. "adcs r2, %[r]\n\t"
  181549. #else
  181550. "adc r2, %[r]\n\t"
  181551. #endif
  181552. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181553. "adds r3, r3, r5\n\t"
  181554. #else
  181555. "add r3, r3, r5\n\t"
  181556. #endif
  181557. #ifdef WOLFSSL_KEIL
  181558. "adcs r4, r4, r6\n\t"
  181559. #elif defined(__clang__)
  181560. "adcs r4, r6\n\t"
  181561. #else
  181562. "adc r4, r6\n\t"
  181563. #endif
  181564. #ifdef WOLFSSL_KEIL
  181565. "adcs r2, r2, %[r]\n\t"
  181566. #elif defined(__clang__)
  181567. "adcs r2, %[r]\n\t"
  181568. #else
  181569. "adc r2, %[r]\n\t"
  181570. #endif
  181571. "str r3, [sp, #52]\n\t"
  181572. "# A[14] * A[0]\n\t"
  181573. "movs r3, #0\n\t"
  181574. "mov %[a], r9\n\t"
  181575. "ldr %[a], [%[a], #56]\n\t"
  181576. "uxth r5, %[a]\n\t"
  181577. "uxth r6, r7\n\t"
  181578. #ifdef WOLFSSL_KEIL
  181579. "muls r6, r5, r6\n\t"
  181580. #elif defined(__clang__)
  181581. "muls r6, r5\n\t"
  181582. #else
  181583. "mul r6, r5\n\t"
  181584. #endif
  181585. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181586. "adds r4, r4, r6\n\t"
  181587. #else
  181588. "add r4, r4, r6\n\t"
  181589. #endif
  181590. #ifdef WOLFSSL_KEIL
  181591. "adcs r2, r2, %[r]\n\t"
  181592. #elif defined(__clang__)
  181593. "adcs r2, %[r]\n\t"
  181594. #else
  181595. "adc r2, %[r]\n\t"
  181596. #endif
  181597. #ifdef WOLFSSL_KEIL
  181598. "adcs r3, r3, %[r]\n\t"
  181599. #elif defined(__clang__)
  181600. "adcs r3, %[r]\n\t"
  181601. #else
  181602. "adc r3, %[r]\n\t"
  181603. #endif
  181604. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181605. "adds r4, r4, r6\n\t"
  181606. #else
  181607. "add r4, r4, r6\n\t"
  181608. #endif
  181609. #ifdef WOLFSSL_KEIL
  181610. "adcs r2, r2, %[r]\n\t"
  181611. #elif defined(__clang__)
  181612. "adcs r2, %[r]\n\t"
  181613. #else
  181614. "adc r2, %[r]\n\t"
  181615. #endif
  181616. #ifdef WOLFSSL_KEIL
  181617. "adcs r3, r3, %[r]\n\t"
  181618. #elif defined(__clang__)
  181619. "adcs r3, %[r]\n\t"
  181620. #else
  181621. "adc r3, %[r]\n\t"
  181622. #endif
  181623. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181624. "lsrs r6, r7, #16\n\t"
  181625. #else
  181626. "lsr r6, r7, #16\n\t"
  181627. #endif
  181628. #ifdef WOLFSSL_KEIL
  181629. "muls r5, r6, r5\n\t"
  181630. #elif defined(__clang__)
  181631. "muls r5, r6\n\t"
  181632. #else
  181633. "mul r5, r6\n\t"
  181634. #endif
  181635. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181636. "lsrs r6, r5, #16\n\t"
  181637. #else
  181638. "lsr r6, r5, #16\n\t"
  181639. #endif
  181640. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181641. "lsls r5, r5, #16\n\t"
  181642. #else
  181643. "lsl r5, r5, #16\n\t"
  181644. #endif
  181645. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181646. "adds r4, r4, r5\n\t"
  181647. #else
  181648. "add r4, r4, r5\n\t"
  181649. #endif
  181650. #ifdef WOLFSSL_KEIL
  181651. "adcs r2, r2, r6\n\t"
  181652. #elif defined(__clang__)
  181653. "adcs r2, r6\n\t"
  181654. #else
  181655. "adc r2, r6\n\t"
  181656. #endif
  181657. #ifdef WOLFSSL_KEIL
  181658. "adcs r3, r3, %[r]\n\t"
  181659. #elif defined(__clang__)
  181660. "adcs r3, %[r]\n\t"
  181661. #else
  181662. "adc r3, %[r]\n\t"
  181663. #endif
  181664. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181665. "adds r4, r4, r5\n\t"
  181666. #else
  181667. "add r4, r4, r5\n\t"
  181668. #endif
  181669. #ifdef WOLFSSL_KEIL
  181670. "adcs r2, r2, r6\n\t"
  181671. #elif defined(__clang__)
  181672. "adcs r2, r6\n\t"
  181673. #else
  181674. "adc r2, r6\n\t"
  181675. #endif
  181676. #ifdef WOLFSSL_KEIL
  181677. "adcs r3, r3, %[r]\n\t"
  181678. #elif defined(__clang__)
  181679. "adcs r3, %[r]\n\t"
  181680. #else
  181681. "adc r3, %[r]\n\t"
  181682. #endif
  181683. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181684. "lsrs r5, %[a], #16\n\t"
  181685. #else
  181686. "lsr r5, %[a], #16\n\t"
  181687. #endif
  181688. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181689. "lsrs r6, r7, #16\n\t"
  181690. #else
  181691. "lsr r6, r7, #16\n\t"
  181692. #endif
  181693. #ifdef WOLFSSL_KEIL
  181694. "muls r6, r5, r6\n\t"
  181695. #elif defined(__clang__)
  181696. "muls r6, r5\n\t"
  181697. #else
  181698. "mul r6, r5\n\t"
  181699. #endif
  181700. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181701. "adds r2, r2, r6\n\t"
  181702. #else
  181703. "add r2, r2, r6\n\t"
  181704. #endif
  181705. #ifdef WOLFSSL_KEIL
  181706. "adcs r3, r3, %[r]\n\t"
  181707. #elif defined(__clang__)
  181708. "adcs r3, %[r]\n\t"
  181709. #else
  181710. "adc r3, %[r]\n\t"
  181711. #endif
  181712. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181713. "adds r2, r2, r6\n\t"
  181714. #else
  181715. "add r2, r2, r6\n\t"
  181716. #endif
  181717. #ifdef WOLFSSL_KEIL
  181718. "adcs r3, r3, %[r]\n\t"
  181719. #elif defined(__clang__)
  181720. "adcs r3, %[r]\n\t"
  181721. #else
  181722. "adc r3, %[r]\n\t"
  181723. #endif
  181724. "uxth r6, r7\n\t"
  181725. #ifdef WOLFSSL_KEIL
  181726. "muls r5, r6, r5\n\t"
  181727. #elif defined(__clang__)
  181728. "muls r5, r6\n\t"
  181729. #else
  181730. "mul r5, r6\n\t"
  181731. #endif
  181732. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181733. "lsrs r6, r5, #16\n\t"
  181734. #else
  181735. "lsr r6, r5, #16\n\t"
  181736. #endif
  181737. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181738. "lsls r5, r5, #16\n\t"
  181739. #else
  181740. "lsl r5, r5, #16\n\t"
  181741. #endif
  181742. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181743. "adds r4, r4, r5\n\t"
  181744. #else
  181745. "add r4, r4, r5\n\t"
  181746. #endif
  181747. #ifdef WOLFSSL_KEIL
  181748. "adcs r2, r2, r6\n\t"
  181749. #elif defined(__clang__)
  181750. "adcs r2, r6\n\t"
  181751. #else
  181752. "adc r2, r6\n\t"
  181753. #endif
  181754. #ifdef WOLFSSL_KEIL
  181755. "adcs r3, r3, %[r]\n\t"
  181756. #elif defined(__clang__)
  181757. "adcs r3, %[r]\n\t"
  181758. #else
  181759. "adc r3, %[r]\n\t"
  181760. #endif
  181761. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181762. "adds r4, r4, r5\n\t"
  181763. #else
  181764. "add r4, r4, r5\n\t"
  181765. #endif
  181766. #ifdef WOLFSSL_KEIL
  181767. "adcs r2, r2, r6\n\t"
  181768. #elif defined(__clang__)
  181769. "adcs r2, r6\n\t"
  181770. #else
  181771. "adc r2, r6\n\t"
  181772. #endif
  181773. #ifdef WOLFSSL_KEIL
  181774. "adcs r3, r3, %[r]\n\t"
  181775. #elif defined(__clang__)
  181776. "adcs r3, %[r]\n\t"
  181777. #else
  181778. "adc r3, %[r]\n\t"
  181779. #endif
  181780. "# A[13] * A[1]\n\t"
  181781. "mov %[a], r9\n\t"
  181782. "mov r7, r11\n\t"
  181783. "ldr %[a], [%[a], #52]\n\t"
  181784. "uxth r5, %[a]\n\t"
  181785. "uxth r6, r7\n\t"
  181786. #ifdef WOLFSSL_KEIL
  181787. "muls r6, r5, r6\n\t"
  181788. #elif defined(__clang__)
  181789. "muls r6, r5\n\t"
  181790. #else
  181791. "mul r6, r5\n\t"
  181792. #endif
  181793. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181794. "adds r4, r4, r6\n\t"
  181795. #else
  181796. "add r4, r4, r6\n\t"
  181797. #endif
  181798. #ifdef WOLFSSL_KEIL
  181799. "adcs r2, r2, %[r]\n\t"
  181800. #elif defined(__clang__)
  181801. "adcs r2, %[r]\n\t"
  181802. #else
  181803. "adc r2, %[r]\n\t"
  181804. #endif
  181805. #ifdef WOLFSSL_KEIL
  181806. "adcs r3, r3, %[r]\n\t"
  181807. #elif defined(__clang__)
  181808. "adcs r3, %[r]\n\t"
  181809. #else
  181810. "adc r3, %[r]\n\t"
  181811. #endif
  181812. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181813. "adds r4, r4, r6\n\t"
  181814. #else
  181815. "add r4, r4, r6\n\t"
  181816. #endif
  181817. #ifdef WOLFSSL_KEIL
  181818. "adcs r2, r2, %[r]\n\t"
  181819. #elif defined(__clang__)
  181820. "adcs r2, %[r]\n\t"
  181821. #else
  181822. "adc r2, %[r]\n\t"
  181823. #endif
  181824. #ifdef WOLFSSL_KEIL
  181825. "adcs r3, r3, %[r]\n\t"
  181826. #elif defined(__clang__)
  181827. "adcs r3, %[r]\n\t"
  181828. #else
  181829. "adc r3, %[r]\n\t"
  181830. #endif
  181831. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181832. "lsrs r6, r7, #16\n\t"
  181833. #else
  181834. "lsr r6, r7, #16\n\t"
  181835. #endif
  181836. #ifdef WOLFSSL_KEIL
  181837. "muls r5, r6, r5\n\t"
  181838. #elif defined(__clang__)
  181839. "muls r5, r6\n\t"
  181840. #else
  181841. "mul r5, r6\n\t"
  181842. #endif
  181843. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181844. "lsrs r6, r5, #16\n\t"
  181845. #else
  181846. "lsr r6, r5, #16\n\t"
  181847. #endif
  181848. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181849. "lsls r5, r5, #16\n\t"
  181850. #else
  181851. "lsl r5, r5, #16\n\t"
  181852. #endif
  181853. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181854. "adds r4, r4, r5\n\t"
  181855. #else
  181856. "add r4, r4, r5\n\t"
  181857. #endif
  181858. #ifdef WOLFSSL_KEIL
  181859. "adcs r2, r2, r6\n\t"
  181860. #elif defined(__clang__)
  181861. "adcs r2, r6\n\t"
  181862. #else
  181863. "adc r2, r6\n\t"
  181864. #endif
  181865. #ifdef WOLFSSL_KEIL
  181866. "adcs r3, r3, %[r]\n\t"
  181867. #elif defined(__clang__)
  181868. "adcs r3, %[r]\n\t"
  181869. #else
  181870. "adc r3, %[r]\n\t"
  181871. #endif
  181872. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181873. "adds r4, r4, r5\n\t"
  181874. #else
  181875. "add r4, r4, r5\n\t"
  181876. #endif
  181877. #ifdef WOLFSSL_KEIL
  181878. "adcs r2, r2, r6\n\t"
  181879. #elif defined(__clang__)
  181880. "adcs r2, r6\n\t"
  181881. #else
  181882. "adc r2, r6\n\t"
  181883. #endif
  181884. #ifdef WOLFSSL_KEIL
  181885. "adcs r3, r3, %[r]\n\t"
  181886. #elif defined(__clang__)
  181887. "adcs r3, %[r]\n\t"
  181888. #else
  181889. "adc r3, %[r]\n\t"
  181890. #endif
  181891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181892. "lsrs r5, %[a], #16\n\t"
  181893. #else
  181894. "lsr r5, %[a], #16\n\t"
  181895. #endif
  181896. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181897. "lsrs r6, r7, #16\n\t"
  181898. #else
  181899. "lsr r6, r7, #16\n\t"
  181900. #endif
  181901. #ifdef WOLFSSL_KEIL
  181902. "muls r6, r5, r6\n\t"
  181903. #elif defined(__clang__)
  181904. "muls r6, r5\n\t"
  181905. #else
  181906. "mul r6, r5\n\t"
  181907. #endif
  181908. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181909. "adds r2, r2, r6\n\t"
  181910. #else
  181911. "add r2, r2, r6\n\t"
  181912. #endif
  181913. #ifdef WOLFSSL_KEIL
  181914. "adcs r3, r3, %[r]\n\t"
  181915. #elif defined(__clang__)
  181916. "adcs r3, %[r]\n\t"
  181917. #else
  181918. "adc r3, %[r]\n\t"
  181919. #endif
  181920. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181921. "adds r2, r2, r6\n\t"
  181922. #else
  181923. "add r2, r2, r6\n\t"
  181924. #endif
  181925. #ifdef WOLFSSL_KEIL
  181926. "adcs r3, r3, %[r]\n\t"
  181927. #elif defined(__clang__)
  181928. "adcs r3, %[r]\n\t"
  181929. #else
  181930. "adc r3, %[r]\n\t"
  181931. #endif
  181932. "uxth r6, r7\n\t"
  181933. #ifdef WOLFSSL_KEIL
  181934. "muls r5, r6, r5\n\t"
  181935. #elif defined(__clang__)
  181936. "muls r5, r6\n\t"
  181937. #else
  181938. "mul r5, r6\n\t"
  181939. #endif
  181940. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181941. "lsrs r6, r5, #16\n\t"
  181942. #else
  181943. "lsr r6, r5, #16\n\t"
  181944. #endif
  181945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181946. "lsls r5, r5, #16\n\t"
  181947. #else
  181948. "lsl r5, r5, #16\n\t"
  181949. #endif
  181950. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181951. "adds r4, r4, r5\n\t"
  181952. #else
  181953. "add r4, r4, r5\n\t"
  181954. #endif
  181955. #ifdef WOLFSSL_KEIL
  181956. "adcs r2, r2, r6\n\t"
  181957. #elif defined(__clang__)
  181958. "adcs r2, r6\n\t"
  181959. #else
  181960. "adc r2, r6\n\t"
  181961. #endif
  181962. #ifdef WOLFSSL_KEIL
  181963. "adcs r3, r3, %[r]\n\t"
  181964. #elif defined(__clang__)
  181965. "adcs r3, %[r]\n\t"
  181966. #else
  181967. "adc r3, %[r]\n\t"
  181968. #endif
  181969. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181970. "adds r4, r4, r5\n\t"
  181971. #else
  181972. "add r4, r4, r5\n\t"
  181973. #endif
  181974. #ifdef WOLFSSL_KEIL
  181975. "adcs r2, r2, r6\n\t"
  181976. #elif defined(__clang__)
  181977. "adcs r2, r6\n\t"
  181978. #else
  181979. "adc r2, r6\n\t"
  181980. #endif
  181981. #ifdef WOLFSSL_KEIL
  181982. "adcs r3, r3, %[r]\n\t"
  181983. #elif defined(__clang__)
  181984. "adcs r3, %[r]\n\t"
  181985. #else
  181986. "adc r3, %[r]\n\t"
  181987. #endif
  181988. "# A[12] * A[2]\n\t"
  181989. "mov %[a], r9\n\t"
  181990. "mov r7, r12\n\t"
  181991. "ldr %[a], [%[a], #48]\n\t"
  181992. "uxth r5, %[a]\n\t"
  181993. "uxth r6, r7\n\t"
  181994. #ifdef WOLFSSL_KEIL
  181995. "muls r6, r5, r6\n\t"
  181996. #elif defined(__clang__)
  181997. "muls r6, r5\n\t"
  181998. #else
  181999. "mul r6, r5\n\t"
  182000. #endif
  182001. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182002. "adds r4, r4, r6\n\t"
  182003. #else
  182004. "add r4, r4, r6\n\t"
  182005. #endif
  182006. #ifdef WOLFSSL_KEIL
  182007. "adcs r2, r2, %[r]\n\t"
  182008. #elif defined(__clang__)
  182009. "adcs r2, %[r]\n\t"
  182010. #else
  182011. "adc r2, %[r]\n\t"
  182012. #endif
  182013. #ifdef WOLFSSL_KEIL
  182014. "adcs r3, r3, %[r]\n\t"
  182015. #elif defined(__clang__)
  182016. "adcs r3, %[r]\n\t"
  182017. #else
  182018. "adc r3, %[r]\n\t"
  182019. #endif
  182020. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182021. "adds r4, r4, r6\n\t"
  182022. #else
  182023. "add r4, r4, r6\n\t"
  182024. #endif
  182025. #ifdef WOLFSSL_KEIL
  182026. "adcs r2, r2, %[r]\n\t"
  182027. #elif defined(__clang__)
  182028. "adcs r2, %[r]\n\t"
  182029. #else
  182030. "adc r2, %[r]\n\t"
  182031. #endif
  182032. #ifdef WOLFSSL_KEIL
  182033. "adcs r3, r3, %[r]\n\t"
  182034. #elif defined(__clang__)
  182035. "adcs r3, %[r]\n\t"
  182036. #else
  182037. "adc r3, %[r]\n\t"
  182038. #endif
  182039. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182040. "lsrs r6, r7, #16\n\t"
  182041. #else
  182042. "lsr r6, r7, #16\n\t"
  182043. #endif
  182044. #ifdef WOLFSSL_KEIL
  182045. "muls r5, r6, r5\n\t"
  182046. #elif defined(__clang__)
  182047. "muls r5, r6\n\t"
  182048. #else
  182049. "mul r5, r6\n\t"
  182050. #endif
  182051. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182052. "lsrs r6, r5, #16\n\t"
  182053. #else
  182054. "lsr r6, r5, #16\n\t"
  182055. #endif
  182056. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182057. "lsls r5, r5, #16\n\t"
  182058. #else
  182059. "lsl r5, r5, #16\n\t"
  182060. #endif
  182061. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182062. "adds r4, r4, r5\n\t"
  182063. #else
  182064. "add r4, r4, r5\n\t"
  182065. #endif
  182066. #ifdef WOLFSSL_KEIL
  182067. "adcs r2, r2, r6\n\t"
  182068. #elif defined(__clang__)
  182069. "adcs r2, r6\n\t"
  182070. #else
  182071. "adc r2, r6\n\t"
  182072. #endif
  182073. #ifdef WOLFSSL_KEIL
  182074. "adcs r3, r3, %[r]\n\t"
  182075. #elif defined(__clang__)
  182076. "adcs r3, %[r]\n\t"
  182077. #else
  182078. "adc r3, %[r]\n\t"
  182079. #endif
  182080. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182081. "adds r4, r4, r5\n\t"
  182082. #else
  182083. "add r4, r4, r5\n\t"
  182084. #endif
  182085. #ifdef WOLFSSL_KEIL
  182086. "adcs r2, r2, r6\n\t"
  182087. #elif defined(__clang__)
  182088. "adcs r2, r6\n\t"
  182089. #else
  182090. "adc r2, r6\n\t"
  182091. #endif
  182092. #ifdef WOLFSSL_KEIL
  182093. "adcs r3, r3, %[r]\n\t"
  182094. #elif defined(__clang__)
  182095. "adcs r3, %[r]\n\t"
  182096. #else
  182097. "adc r3, %[r]\n\t"
  182098. #endif
  182099. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182100. "lsrs r5, %[a], #16\n\t"
  182101. #else
  182102. "lsr r5, %[a], #16\n\t"
  182103. #endif
  182104. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182105. "lsrs r6, r7, #16\n\t"
  182106. #else
  182107. "lsr r6, r7, #16\n\t"
  182108. #endif
  182109. #ifdef WOLFSSL_KEIL
  182110. "muls r6, r5, r6\n\t"
  182111. #elif defined(__clang__)
  182112. "muls r6, r5\n\t"
  182113. #else
  182114. "mul r6, r5\n\t"
  182115. #endif
  182116. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182117. "adds r2, r2, r6\n\t"
  182118. #else
  182119. "add r2, r2, r6\n\t"
  182120. #endif
  182121. #ifdef WOLFSSL_KEIL
  182122. "adcs r3, r3, %[r]\n\t"
  182123. #elif defined(__clang__)
  182124. "adcs r3, %[r]\n\t"
  182125. #else
  182126. "adc r3, %[r]\n\t"
  182127. #endif
  182128. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182129. "adds r2, r2, r6\n\t"
  182130. #else
  182131. "add r2, r2, r6\n\t"
  182132. #endif
  182133. #ifdef WOLFSSL_KEIL
  182134. "adcs r3, r3, %[r]\n\t"
  182135. #elif defined(__clang__)
  182136. "adcs r3, %[r]\n\t"
  182137. #else
  182138. "adc r3, %[r]\n\t"
  182139. #endif
  182140. "uxth r6, r7\n\t"
  182141. #ifdef WOLFSSL_KEIL
  182142. "muls r5, r6, r5\n\t"
  182143. #elif defined(__clang__)
  182144. "muls r5, r6\n\t"
  182145. #else
  182146. "mul r5, r6\n\t"
  182147. #endif
  182148. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182149. "lsrs r6, r5, #16\n\t"
  182150. #else
  182151. "lsr r6, r5, #16\n\t"
  182152. #endif
  182153. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182154. "lsls r5, r5, #16\n\t"
  182155. #else
  182156. "lsl r5, r5, #16\n\t"
  182157. #endif
  182158. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182159. "adds r4, r4, r5\n\t"
  182160. #else
  182161. "add r4, r4, r5\n\t"
  182162. #endif
  182163. #ifdef WOLFSSL_KEIL
  182164. "adcs r2, r2, r6\n\t"
  182165. #elif defined(__clang__)
  182166. "adcs r2, r6\n\t"
  182167. #else
  182168. "adc r2, r6\n\t"
  182169. #endif
  182170. #ifdef WOLFSSL_KEIL
  182171. "adcs r3, r3, %[r]\n\t"
  182172. #elif defined(__clang__)
  182173. "adcs r3, %[r]\n\t"
  182174. #else
  182175. "adc r3, %[r]\n\t"
  182176. #endif
  182177. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182178. "adds r4, r4, r5\n\t"
  182179. #else
  182180. "add r4, r4, r5\n\t"
  182181. #endif
  182182. #ifdef WOLFSSL_KEIL
  182183. "adcs r2, r2, r6\n\t"
  182184. #elif defined(__clang__)
  182185. "adcs r2, r6\n\t"
  182186. #else
  182187. "adc r2, r6\n\t"
  182188. #endif
  182189. #ifdef WOLFSSL_KEIL
  182190. "adcs r3, r3, %[r]\n\t"
  182191. #elif defined(__clang__)
  182192. "adcs r3, %[r]\n\t"
  182193. #else
  182194. "adc r3, %[r]\n\t"
  182195. #endif
  182196. "# A[11] * A[3]\n\t"
  182197. "mov %[a], r9\n\t"
  182198. "mov r7, lr\n\t"
  182199. "ldr %[a], [%[a], #44]\n\t"
  182200. "uxth r5, %[a]\n\t"
  182201. "uxth r6, r7\n\t"
  182202. #ifdef WOLFSSL_KEIL
  182203. "muls r6, r5, r6\n\t"
  182204. #elif defined(__clang__)
  182205. "muls r6, r5\n\t"
  182206. #else
  182207. "mul r6, r5\n\t"
  182208. #endif
  182209. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182210. "adds r4, r4, r6\n\t"
  182211. #else
  182212. "add r4, r4, r6\n\t"
  182213. #endif
  182214. #ifdef WOLFSSL_KEIL
  182215. "adcs r2, r2, %[r]\n\t"
  182216. #elif defined(__clang__)
  182217. "adcs r2, %[r]\n\t"
  182218. #else
  182219. "adc r2, %[r]\n\t"
  182220. #endif
  182221. #ifdef WOLFSSL_KEIL
  182222. "adcs r3, r3, %[r]\n\t"
  182223. #elif defined(__clang__)
  182224. "adcs r3, %[r]\n\t"
  182225. #else
  182226. "adc r3, %[r]\n\t"
  182227. #endif
  182228. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182229. "adds r4, r4, r6\n\t"
  182230. #else
  182231. "add r4, r4, r6\n\t"
  182232. #endif
  182233. #ifdef WOLFSSL_KEIL
  182234. "adcs r2, r2, %[r]\n\t"
  182235. #elif defined(__clang__)
  182236. "adcs r2, %[r]\n\t"
  182237. #else
  182238. "adc r2, %[r]\n\t"
  182239. #endif
  182240. #ifdef WOLFSSL_KEIL
  182241. "adcs r3, r3, %[r]\n\t"
  182242. #elif defined(__clang__)
  182243. "adcs r3, %[r]\n\t"
  182244. #else
  182245. "adc r3, %[r]\n\t"
  182246. #endif
  182247. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182248. "lsrs r6, r7, #16\n\t"
  182249. #else
  182250. "lsr r6, r7, #16\n\t"
  182251. #endif
  182252. #ifdef WOLFSSL_KEIL
  182253. "muls r5, r6, r5\n\t"
  182254. #elif defined(__clang__)
  182255. "muls r5, r6\n\t"
  182256. #else
  182257. "mul r5, r6\n\t"
  182258. #endif
  182259. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182260. "lsrs r6, r5, #16\n\t"
  182261. #else
  182262. "lsr r6, r5, #16\n\t"
  182263. #endif
  182264. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182265. "lsls r5, r5, #16\n\t"
  182266. #else
  182267. "lsl r5, r5, #16\n\t"
  182268. #endif
  182269. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182270. "adds r4, r4, r5\n\t"
  182271. #else
  182272. "add r4, r4, r5\n\t"
  182273. #endif
  182274. #ifdef WOLFSSL_KEIL
  182275. "adcs r2, r2, r6\n\t"
  182276. #elif defined(__clang__)
  182277. "adcs r2, r6\n\t"
  182278. #else
  182279. "adc r2, r6\n\t"
  182280. #endif
  182281. #ifdef WOLFSSL_KEIL
  182282. "adcs r3, r3, %[r]\n\t"
  182283. #elif defined(__clang__)
  182284. "adcs r3, %[r]\n\t"
  182285. #else
  182286. "adc r3, %[r]\n\t"
  182287. #endif
  182288. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182289. "adds r4, r4, r5\n\t"
  182290. #else
  182291. "add r4, r4, r5\n\t"
  182292. #endif
  182293. #ifdef WOLFSSL_KEIL
  182294. "adcs r2, r2, r6\n\t"
  182295. #elif defined(__clang__)
  182296. "adcs r2, r6\n\t"
  182297. #else
  182298. "adc r2, r6\n\t"
  182299. #endif
  182300. #ifdef WOLFSSL_KEIL
  182301. "adcs r3, r3, %[r]\n\t"
  182302. #elif defined(__clang__)
  182303. "adcs r3, %[r]\n\t"
  182304. #else
  182305. "adc r3, %[r]\n\t"
  182306. #endif
  182307. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182308. "lsrs r5, %[a], #16\n\t"
  182309. #else
  182310. "lsr r5, %[a], #16\n\t"
  182311. #endif
  182312. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182313. "lsrs r6, r7, #16\n\t"
  182314. #else
  182315. "lsr r6, r7, #16\n\t"
  182316. #endif
  182317. #ifdef WOLFSSL_KEIL
  182318. "muls r6, r5, r6\n\t"
  182319. #elif defined(__clang__)
  182320. "muls r6, r5\n\t"
  182321. #else
  182322. "mul r6, r5\n\t"
  182323. #endif
  182324. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182325. "adds r2, r2, r6\n\t"
  182326. #else
  182327. "add r2, r2, r6\n\t"
  182328. #endif
  182329. #ifdef WOLFSSL_KEIL
  182330. "adcs r3, r3, %[r]\n\t"
  182331. #elif defined(__clang__)
  182332. "adcs r3, %[r]\n\t"
  182333. #else
  182334. "adc r3, %[r]\n\t"
  182335. #endif
  182336. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182337. "adds r2, r2, r6\n\t"
  182338. #else
  182339. "add r2, r2, r6\n\t"
  182340. #endif
  182341. #ifdef WOLFSSL_KEIL
  182342. "adcs r3, r3, %[r]\n\t"
  182343. #elif defined(__clang__)
  182344. "adcs r3, %[r]\n\t"
  182345. #else
  182346. "adc r3, %[r]\n\t"
  182347. #endif
  182348. "uxth r6, r7\n\t"
  182349. #ifdef WOLFSSL_KEIL
  182350. "muls r5, r6, r5\n\t"
  182351. #elif defined(__clang__)
  182352. "muls r5, r6\n\t"
  182353. #else
  182354. "mul r5, r6\n\t"
  182355. #endif
  182356. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182357. "lsrs r6, r5, #16\n\t"
  182358. #else
  182359. "lsr r6, r5, #16\n\t"
  182360. #endif
  182361. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182362. "lsls r5, r5, #16\n\t"
  182363. #else
  182364. "lsl r5, r5, #16\n\t"
  182365. #endif
  182366. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182367. "adds r4, r4, r5\n\t"
  182368. #else
  182369. "add r4, r4, r5\n\t"
  182370. #endif
  182371. #ifdef WOLFSSL_KEIL
  182372. "adcs r2, r2, r6\n\t"
  182373. #elif defined(__clang__)
  182374. "adcs r2, r6\n\t"
  182375. #else
  182376. "adc r2, r6\n\t"
  182377. #endif
  182378. #ifdef WOLFSSL_KEIL
  182379. "adcs r3, r3, %[r]\n\t"
  182380. #elif defined(__clang__)
  182381. "adcs r3, %[r]\n\t"
  182382. #else
  182383. "adc r3, %[r]\n\t"
  182384. #endif
  182385. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182386. "adds r4, r4, r5\n\t"
  182387. #else
  182388. "add r4, r4, r5\n\t"
  182389. #endif
  182390. #ifdef WOLFSSL_KEIL
  182391. "adcs r2, r2, r6\n\t"
  182392. #elif defined(__clang__)
  182393. "adcs r2, r6\n\t"
  182394. #else
  182395. "adc r2, r6\n\t"
  182396. #endif
  182397. #ifdef WOLFSSL_KEIL
  182398. "adcs r3, r3, %[r]\n\t"
  182399. #elif defined(__clang__)
  182400. "adcs r3, %[r]\n\t"
  182401. #else
  182402. "adc r3, %[r]\n\t"
  182403. #endif
  182404. "# A[10] * A[4]\n\t"
  182405. "mov %[a], r9\n\t"
  182406. "ldr r7, [%[a], #16]\n\t"
  182407. "ldr %[a], [%[a], #40]\n\t"
  182408. "uxth r5, %[a]\n\t"
  182409. "uxth r6, r7\n\t"
  182410. #ifdef WOLFSSL_KEIL
  182411. "muls r6, r5, r6\n\t"
  182412. #elif defined(__clang__)
  182413. "muls r6, r5\n\t"
  182414. #else
  182415. "mul r6, r5\n\t"
  182416. #endif
  182417. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182418. "adds r4, r4, r6\n\t"
  182419. #else
  182420. "add r4, r4, r6\n\t"
  182421. #endif
  182422. #ifdef WOLFSSL_KEIL
  182423. "adcs r2, r2, %[r]\n\t"
  182424. #elif defined(__clang__)
  182425. "adcs r2, %[r]\n\t"
  182426. #else
  182427. "adc r2, %[r]\n\t"
  182428. #endif
  182429. #ifdef WOLFSSL_KEIL
  182430. "adcs r3, r3, %[r]\n\t"
  182431. #elif defined(__clang__)
  182432. "adcs r3, %[r]\n\t"
  182433. #else
  182434. "adc r3, %[r]\n\t"
  182435. #endif
  182436. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182437. "adds r4, r4, r6\n\t"
  182438. #else
  182439. "add r4, r4, r6\n\t"
  182440. #endif
  182441. #ifdef WOLFSSL_KEIL
  182442. "adcs r2, r2, %[r]\n\t"
  182443. #elif defined(__clang__)
  182444. "adcs r2, %[r]\n\t"
  182445. #else
  182446. "adc r2, %[r]\n\t"
  182447. #endif
  182448. #ifdef WOLFSSL_KEIL
  182449. "adcs r3, r3, %[r]\n\t"
  182450. #elif defined(__clang__)
  182451. "adcs r3, %[r]\n\t"
  182452. #else
  182453. "adc r3, %[r]\n\t"
  182454. #endif
  182455. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182456. "lsrs r6, r7, #16\n\t"
  182457. #else
  182458. "lsr r6, r7, #16\n\t"
  182459. #endif
  182460. #ifdef WOLFSSL_KEIL
  182461. "muls r5, r6, r5\n\t"
  182462. #elif defined(__clang__)
  182463. "muls r5, r6\n\t"
  182464. #else
  182465. "mul r5, r6\n\t"
  182466. #endif
  182467. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182468. "lsrs r6, r5, #16\n\t"
  182469. #else
  182470. "lsr r6, r5, #16\n\t"
  182471. #endif
  182472. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182473. "lsls r5, r5, #16\n\t"
  182474. #else
  182475. "lsl r5, r5, #16\n\t"
  182476. #endif
  182477. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182478. "adds r4, r4, r5\n\t"
  182479. #else
  182480. "add r4, r4, r5\n\t"
  182481. #endif
  182482. #ifdef WOLFSSL_KEIL
  182483. "adcs r2, r2, r6\n\t"
  182484. #elif defined(__clang__)
  182485. "adcs r2, r6\n\t"
  182486. #else
  182487. "adc r2, r6\n\t"
  182488. #endif
  182489. #ifdef WOLFSSL_KEIL
  182490. "adcs r3, r3, %[r]\n\t"
  182491. #elif defined(__clang__)
  182492. "adcs r3, %[r]\n\t"
  182493. #else
  182494. "adc r3, %[r]\n\t"
  182495. #endif
  182496. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182497. "adds r4, r4, r5\n\t"
  182498. #else
  182499. "add r4, r4, r5\n\t"
  182500. #endif
  182501. #ifdef WOLFSSL_KEIL
  182502. "adcs r2, r2, r6\n\t"
  182503. #elif defined(__clang__)
  182504. "adcs r2, r6\n\t"
  182505. #else
  182506. "adc r2, r6\n\t"
  182507. #endif
  182508. #ifdef WOLFSSL_KEIL
  182509. "adcs r3, r3, %[r]\n\t"
  182510. #elif defined(__clang__)
  182511. "adcs r3, %[r]\n\t"
  182512. #else
  182513. "adc r3, %[r]\n\t"
  182514. #endif
  182515. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182516. "lsrs r5, %[a], #16\n\t"
  182517. #else
  182518. "lsr r5, %[a], #16\n\t"
  182519. #endif
  182520. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182521. "lsrs r6, r7, #16\n\t"
  182522. #else
  182523. "lsr r6, r7, #16\n\t"
  182524. #endif
  182525. #ifdef WOLFSSL_KEIL
  182526. "muls r6, r5, r6\n\t"
  182527. #elif defined(__clang__)
  182528. "muls r6, r5\n\t"
  182529. #else
  182530. "mul r6, r5\n\t"
  182531. #endif
  182532. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182533. "adds r2, r2, r6\n\t"
  182534. #else
  182535. "add r2, r2, r6\n\t"
  182536. #endif
  182537. #ifdef WOLFSSL_KEIL
  182538. "adcs r3, r3, %[r]\n\t"
  182539. #elif defined(__clang__)
  182540. "adcs r3, %[r]\n\t"
  182541. #else
  182542. "adc r3, %[r]\n\t"
  182543. #endif
  182544. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182545. "adds r2, r2, r6\n\t"
  182546. #else
  182547. "add r2, r2, r6\n\t"
  182548. #endif
  182549. #ifdef WOLFSSL_KEIL
  182550. "adcs r3, r3, %[r]\n\t"
  182551. #elif defined(__clang__)
  182552. "adcs r3, %[r]\n\t"
  182553. #else
  182554. "adc r3, %[r]\n\t"
  182555. #endif
  182556. "uxth r6, r7\n\t"
  182557. #ifdef WOLFSSL_KEIL
  182558. "muls r5, r6, r5\n\t"
  182559. #elif defined(__clang__)
  182560. "muls r5, r6\n\t"
  182561. #else
  182562. "mul r5, r6\n\t"
  182563. #endif
  182564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182565. "lsrs r6, r5, #16\n\t"
  182566. #else
  182567. "lsr r6, r5, #16\n\t"
  182568. #endif
  182569. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182570. "lsls r5, r5, #16\n\t"
  182571. #else
  182572. "lsl r5, r5, #16\n\t"
  182573. #endif
  182574. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182575. "adds r4, r4, r5\n\t"
  182576. #else
  182577. "add r4, r4, r5\n\t"
  182578. #endif
  182579. #ifdef WOLFSSL_KEIL
  182580. "adcs r2, r2, r6\n\t"
  182581. #elif defined(__clang__)
  182582. "adcs r2, r6\n\t"
  182583. #else
  182584. "adc r2, r6\n\t"
  182585. #endif
  182586. #ifdef WOLFSSL_KEIL
  182587. "adcs r3, r3, %[r]\n\t"
  182588. #elif defined(__clang__)
  182589. "adcs r3, %[r]\n\t"
  182590. #else
  182591. "adc r3, %[r]\n\t"
  182592. #endif
  182593. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182594. "adds r4, r4, r5\n\t"
  182595. #else
  182596. "add r4, r4, r5\n\t"
  182597. #endif
  182598. #ifdef WOLFSSL_KEIL
  182599. "adcs r2, r2, r6\n\t"
  182600. #elif defined(__clang__)
  182601. "adcs r2, r6\n\t"
  182602. #else
  182603. "adc r2, r6\n\t"
  182604. #endif
  182605. #ifdef WOLFSSL_KEIL
  182606. "adcs r3, r3, %[r]\n\t"
  182607. #elif defined(__clang__)
  182608. "adcs r3, %[r]\n\t"
  182609. #else
  182610. "adc r3, %[r]\n\t"
  182611. #endif
  182612. "# A[9] * A[5]\n\t"
  182613. "mov %[a], r9\n\t"
  182614. "ldr r7, [%[a], #20]\n\t"
  182615. "ldr %[a], [%[a], #36]\n\t"
  182616. "uxth r5, %[a]\n\t"
  182617. "uxth r6, r7\n\t"
  182618. #ifdef WOLFSSL_KEIL
  182619. "muls r6, r5, r6\n\t"
  182620. #elif defined(__clang__)
  182621. "muls r6, r5\n\t"
  182622. #else
  182623. "mul r6, r5\n\t"
  182624. #endif
  182625. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182626. "adds r4, r4, r6\n\t"
  182627. #else
  182628. "add r4, r4, r6\n\t"
  182629. #endif
  182630. #ifdef WOLFSSL_KEIL
  182631. "adcs r2, r2, %[r]\n\t"
  182632. #elif defined(__clang__)
  182633. "adcs r2, %[r]\n\t"
  182634. #else
  182635. "adc r2, %[r]\n\t"
  182636. #endif
  182637. #ifdef WOLFSSL_KEIL
  182638. "adcs r3, r3, %[r]\n\t"
  182639. #elif defined(__clang__)
  182640. "adcs r3, %[r]\n\t"
  182641. #else
  182642. "adc r3, %[r]\n\t"
  182643. #endif
  182644. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182645. "adds r4, r4, r6\n\t"
  182646. #else
  182647. "add r4, r4, r6\n\t"
  182648. #endif
  182649. #ifdef WOLFSSL_KEIL
  182650. "adcs r2, r2, %[r]\n\t"
  182651. #elif defined(__clang__)
  182652. "adcs r2, %[r]\n\t"
  182653. #else
  182654. "adc r2, %[r]\n\t"
  182655. #endif
  182656. #ifdef WOLFSSL_KEIL
  182657. "adcs r3, r3, %[r]\n\t"
  182658. #elif defined(__clang__)
  182659. "adcs r3, %[r]\n\t"
  182660. #else
  182661. "adc r3, %[r]\n\t"
  182662. #endif
  182663. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182664. "lsrs r6, r7, #16\n\t"
  182665. #else
  182666. "lsr r6, r7, #16\n\t"
  182667. #endif
  182668. #ifdef WOLFSSL_KEIL
  182669. "muls r5, r6, r5\n\t"
  182670. #elif defined(__clang__)
  182671. "muls r5, r6\n\t"
  182672. #else
  182673. "mul r5, r6\n\t"
  182674. #endif
  182675. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182676. "lsrs r6, r5, #16\n\t"
  182677. #else
  182678. "lsr r6, r5, #16\n\t"
  182679. #endif
  182680. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182681. "lsls r5, r5, #16\n\t"
  182682. #else
  182683. "lsl r5, r5, #16\n\t"
  182684. #endif
  182685. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182686. "adds r4, r4, r5\n\t"
  182687. #else
  182688. "add r4, r4, r5\n\t"
  182689. #endif
  182690. #ifdef WOLFSSL_KEIL
  182691. "adcs r2, r2, r6\n\t"
  182692. #elif defined(__clang__)
  182693. "adcs r2, r6\n\t"
  182694. #else
  182695. "adc r2, r6\n\t"
  182696. #endif
  182697. #ifdef WOLFSSL_KEIL
  182698. "adcs r3, r3, %[r]\n\t"
  182699. #elif defined(__clang__)
  182700. "adcs r3, %[r]\n\t"
  182701. #else
  182702. "adc r3, %[r]\n\t"
  182703. #endif
  182704. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182705. "adds r4, r4, r5\n\t"
  182706. #else
  182707. "add r4, r4, r5\n\t"
  182708. #endif
  182709. #ifdef WOLFSSL_KEIL
  182710. "adcs r2, r2, r6\n\t"
  182711. #elif defined(__clang__)
  182712. "adcs r2, r6\n\t"
  182713. #else
  182714. "adc r2, r6\n\t"
  182715. #endif
  182716. #ifdef WOLFSSL_KEIL
  182717. "adcs r3, r3, %[r]\n\t"
  182718. #elif defined(__clang__)
  182719. "adcs r3, %[r]\n\t"
  182720. #else
  182721. "adc r3, %[r]\n\t"
  182722. #endif
  182723. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182724. "lsrs r5, %[a], #16\n\t"
  182725. #else
  182726. "lsr r5, %[a], #16\n\t"
  182727. #endif
  182728. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182729. "lsrs r6, r7, #16\n\t"
  182730. #else
  182731. "lsr r6, r7, #16\n\t"
  182732. #endif
  182733. #ifdef WOLFSSL_KEIL
  182734. "muls r6, r5, r6\n\t"
  182735. #elif defined(__clang__)
  182736. "muls r6, r5\n\t"
  182737. #else
  182738. "mul r6, r5\n\t"
  182739. #endif
  182740. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182741. "adds r2, r2, r6\n\t"
  182742. #else
  182743. "add r2, r2, r6\n\t"
  182744. #endif
  182745. #ifdef WOLFSSL_KEIL
  182746. "adcs r3, r3, %[r]\n\t"
  182747. #elif defined(__clang__)
  182748. "adcs r3, %[r]\n\t"
  182749. #else
  182750. "adc r3, %[r]\n\t"
  182751. #endif
  182752. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182753. "adds r2, r2, r6\n\t"
  182754. #else
  182755. "add r2, r2, r6\n\t"
  182756. #endif
  182757. #ifdef WOLFSSL_KEIL
  182758. "adcs r3, r3, %[r]\n\t"
  182759. #elif defined(__clang__)
  182760. "adcs r3, %[r]\n\t"
  182761. #else
  182762. "adc r3, %[r]\n\t"
  182763. #endif
  182764. "uxth r6, r7\n\t"
  182765. #ifdef WOLFSSL_KEIL
  182766. "muls r5, r6, r5\n\t"
  182767. #elif defined(__clang__)
  182768. "muls r5, r6\n\t"
  182769. #else
  182770. "mul r5, r6\n\t"
  182771. #endif
  182772. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182773. "lsrs r6, r5, #16\n\t"
  182774. #else
  182775. "lsr r6, r5, #16\n\t"
  182776. #endif
  182777. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182778. "lsls r5, r5, #16\n\t"
  182779. #else
  182780. "lsl r5, r5, #16\n\t"
  182781. #endif
  182782. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182783. "adds r4, r4, r5\n\t"
  182784. #else
  182785. "add r4, r4, r5\n\t"
  182786. #endif
  182787. #ifdef WOLFSSL_KEIL
  182788. "adcs r2, r2, r6\n\t"
  182789. #elif defined(__clang__)
  182790. "adcs r2, r6\n\t"
  182791. #else
  182792. "adc r2, r6\n\t"
  182793. #endif
  182794. #ifdef WOLFSSL_KEIL
  182795. "adcs r3, r3, %[r]\n\t"
  182796. #elif defined(__clang__)
  182797. "adcs r3, %[r]\n\t"
  182798. #else
  182799. "adc r3, %[r]\n\t"
  182800. #endif
  182801. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182802. "adds r4, r4, r5\n\t"
  182803. #else
  182804. "add r4, r4, r5\n\t"
  182805. #endif
  182806. #ifdef WOLFSSL_KEIL
  182807. "adcs r2, r2, r6\n\t"
  182808. #elif defined(__clang__)
  182809. "adcs r2, r6\n\t"
  182810. #else
  182811. "adc r2, r6\n\t"
  182812. #endif
  182813. #ifdef WOLFSSL_KEIL
  182814. "adcs r3, r3, %[r]\n\t"
  182815. #elif defined(__clang__)
  182816. "adcs r3, %[r]\n\t"
  182817. #else
  182818. "adc r3, %[r]\n\t"
  182819. #endif
  182820. "# A[8] * A[6]\n\t"
  182821. "mov %[a], r9\n\t"
  182822. "ldr r7, [%[a], #24]\n\t"
  182823. "ldr %[a], [%[a], #32]\n\t"
  182824. "uxth r5, %[a]\n\t"
  182825. "uxth r6, r7\n\t"
  182826. #ifdef WOLFSSL_KEIL
  182827. "muls r6, r5, r6\n\t"
  182828. #elif defined(__clang__)
  182829. "muls r6, r5\n\t"
  182830. #else
  182831. "mul r6, r5\n\t"
  182832. #endif
  182833. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182834. "adds r4, r4, r6\n\t"
  182835. #else
  182836. "add r4, r4, r6\n\t"
  182837. #endif
  182838. #ifdef WOLFSSL_KEIL
  182839. "adcs r2, r2, %[r]\n\t"
  182840. #elif defined(__clang__)
  182841. "adcs r2, %[r]\n\t"
  182842. #else
  182843. "adc r2, %[r]\n\t"
  182844. #endif
  182845. #ifdef WOLFSSL_KEIL
  182846. "adcs r3, r3, %[r]\n\t"
  182847. #elif defined(__clang__)
  182848. "adcs r3, %[r]\n\t"
  182849. #else
  182850. "adc r3, %[r]\n\t"
  182851. #endif
  182852. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182853. "adds r4, r4, r6\n\t"
  182854. #else
  182855. "add r4, r4, r6\n\t"
  182856. #endif
  182857. #ifdef WOLFSSL_KEIL
  182858. "adcs r2, r2, %[r]\n\t"
  182859. #elif defined(__clang__)
  182860. "adcs r2, %[r]\n\t"
  182861. #else
  182862. "adc r2, %[r]\n\t"
  182863. #endif
  182864. #ifdef WOLFSSL_KEIL
  182865. "adcs r3, r3, %[r]\n\t"
  182866. #elif defined(__clang__)
  182867. "adcs r3, %[r]\n\t"
  182868. #else
  182869. "adc r3, %[r]\n\t"
  182870. #endif
  182871. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182872. "lsrs r6, r7, #16\n\t"
  182873. #else
  182874. "lsr r6, r7, #16\n\t"
  182875. #endif
  182876. #ifdef WOLFSSL_KEIL
  182877. "muls r5, r6, r5\n\t"
  182878. #elif defined(__clang__)
  182879. "muls r5, r6\n\t"
  182880. #else
  182881. "mul r5, r6\n\t"
  182882. #endif
  182883. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182884. "lsrs r6, r5, #16\n\t"
  182885. #else
  182886. "lsr r6, r5, #16\n\t"
  182887. #endif
  182888. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182889. "lsls r5, r5, #16\n\t"
  182890. #else
  182891. "lsl r5, r5, #16\n\t"
  182892. #endif
  182893. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182894. "adds r4, r4, r5\n\t"
  182895. #else
  182896. "add r4, r4, r5\n\t"
  182897. #endif
  182898. #ifdef WOLFSSL_KEIL
  182899. "adcs r2, r2, r6\n\t"
  182900. #elif defined(__clang__)
  182901. "adcs r2, r6\n\t"
  182902. #else
  182903. "adc r2, r6\n\t"
  182904. #endif
  182905. #ifdef WOLFSSL_KEIL
  182906. "adcs r3, r3, %[r]\n\t"
  182907. #elif defined(__clang__)
  182908. "adcs r3, %[r]\n\t"
  182909. #else
  182910. "adc r3, %[r]\n\t"
  182911. #endif
  182912. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182913. "adds r4, r4, r5\n\t"
  182914. #else
  182915. "add r4, r4, r5\n\t"
  182916. #endif
  182917. #ifdef WOLFSSL_KEIL
  182918. "adcs r2, r2, r6\n\t"
  182919. #elif defined(__clang__)
  182920. "adcs r2, r6\n\t"
  182921. #else
  182922. "adc r2, r6\n\t"
  182923. #endif
  182924. #ifdef WOLFSSL_KEIL
  182925. "adcs r3, r3, %[r]\n\t"
  182926. #elif defined(__clang__)
  182927. "adcs r3, %[r]\n\t"
  182928. #else
  182929. "adc r3, %[r]\n\t"
  182930. #endif
  182931. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182932. "lsrs r5, %[a], #16\n\t"
  182933. #else
  182934. "lsr r5, %[a], #16\n\t"
  182935. #endif
  182936. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182937. "lsrs r6, r7, #16\n\t"
  182938. #else
  182939. "lsr r6, r7, #16\n\t"
  182940. #endif
  182941. #ifdef WOLFSSL_KEIL
  182942. "muls r6, r5, r6\n\t"
  182943. #elif defined(__clang__)
  182944. "muls r6, r5\n\t"
  182945. #else
  182946. "mul r6, r5\n\t"
  182947. #endif
  182948. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182949. "adds r2, r2, r6\n\t"
  182950. #else
  182951. "add r2, r2, r6\n\t"
  182952. #endif
  182953. #ifdef WOLFSSL_KEIL
  182954. "adcs r3, r3, %[r]\n\t"
  182955. #elif defined(__clang__)
  182956. "adcs r3, %[r]\n\t"
  182957. #else
  182958. "adc r3, %[r]\n\t"
  182959. #endif
  182960. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182961. "adds r2, r2, r6\n\t"
  182962. #else
  182963. "add r2, r2, r6\n\t"
  182964. #endif
  182965. #ifdef WOLFSSL_KEIL
  182966. "adcs r3, r3, %[r]\n\t"
  182967. #elif defined(__clang__)
  182968. "adcs r3, %[r]\n\t"
  182969. #else
  182970. "adc r3, %[r]\n\t"
  182971. #endif
  182972. "uxth r6, r7\n\t"
  182973. #ifdef WOLFSSL_KEIL
  182974. "muls r5, r6, r5\n\t"
  182975. #elif defined(__clang__)
  182976. "muls r5, r6\n\t"
  182977. #else
  182978. "mul r5, r6\n\t"
  182979. #endif
  182980. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182981. "lsrs r6, r5, #16\n\t"
  182982. #else
  182983. "lsr r6, r5, #16\n\t"
  182984. #endif
  182985. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182986. "lsls r5, r5, #16\n\t"
  182987. #else
  182988. "lsl r5, r5, #16\n\t"
  182989. #endif
  182990. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182991. "adds r4, r4, r5\n\t"
  182992. #else
  182993. "add r4, r4, r5\n\t"
  182994. #endif
  182995. #ifdef WOLFSSL_KEIL
  182996. "adcs r2, r2, r6\n\t"
  182997. #elif defined(__clang__)
  182998. "adcs r2, r6\n\t"
  182999. #else
  183000. "adc r2, r6\n\t"
  183001. #endif
  183002. #ifdef WOLFSSL_KEIL
  183003. "adcs r3, r3, %[r]\n\t"
  183004. #elif defined(__clang__)
  183005. "adcs r3, %[r]\n\t"
  183006. #else
  183007. "adc r3, %[r]\n\t"
  183008. #endif
  183009. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183010. "adds r4, r4, r5\n\t"
  183011. #else
  183012. "add r4, r4, r5\n\t"
  183013. #endif
  183014. #ifdef WOLFSSL_KEIL
  183015. "adcs r2, r2, r6\n\t"
  183016. #elif defined(__clang__)
  183017. "adcs r2, r6\n\t"
  183018. #else
  183019. "adc r2, r6\n\t"
  183020. #endif
  183021. #ifdef WOLFSSL_KEIL
  183022. "adcs r3, r3, %[r]\n\t"
  183023. #elif defined(__clang__)
  183024. "adcs r3, %[r]\n\t"
  183025. #else
  183026. "adc r3, %[r]\n\t"
  183027. #endif
  183028. "# A[7] * A[7]\n\t"
  183029. "mov %[a], r9\n\t"
  183030. "ldr r7, [%[a], #28]\n\t"
  183031. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183032. "lsrs r6, r7, #16\n\t"
  183033. #else
  183034. "lsr r6, r7, #16\n\t"
  183035. #endif
  183036. "uxth r5, r7\n\t"
  183037. #ifdef WOLFSSL_KEIL
  183038. "muls r5, r5, r5\n\t"
  183039. #elif defined(__clang__)
  183040. "muls r5, r5\n\t"
  183041. #else
  183042. "mul r5, r5\n\t"
  183043. #endif
  183044. #ifdef WOLFSSL_KEIL
  183045. "muls r6, r6, r6\n\t"
  183046. #elif defined(__clang__)
  183047. "muls r6, r6\n\t"
  183048. #else
  183049. "mul r6, r6\n\t"
  183050. #endif
  183051. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183052. "adds r4, r4, r5\n\t"
  183053. #else
  183054. "add r4, r4, r5\n\t"
  183055. #endif
  183056. #ifdef WOLFSSL_KEIL
  183057. "adcs r2, r2, r6\n\t"
  183058. #elif defined(__clang__)
  183059. "adcs r2, r6\n\t"
  183060. #else
  183061. "adc r2, r6\n\t"
  183062. #endif
  183063. #ifdef WOLFSSL_KEIL
  183064. "adcs r3, r3, %[r]\n\t"
  183065. #elif defined(__clang__)
  183066. "adcs r3, %[r]\n\t"
  183067. #else
  183068. "adc r3, %[r]\n\t"
  183069. #endif
  183070. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183071. "lsrs r6, r7, #16\n\t"
  183072. #else
  183073. "lsr r6, r7, #16\n\t"
  183074. #endif
  183075. "uxth r5, r7\n\t"
  183076. #ifdef WOLFSSL_KEIL
  183077. "muls r5, r6, r5\n\t"
  183078. #elif defined(__clang__)
  183079. "muls r5, r6\n\t"
  183080. #else
  183081. "mul r5, r6\n\t"
  183082. #endif
  183083. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183084. "lsrs r6, r5, #15\n\t"
  183085. #else
  183086. "lsr r6, r5, #15\n\t"
  183087. #endif
  183088. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183089. "lsls r5, r5, #17\n\t"
  183090. #else
  183091. "lsl r5, r5, #17\n\t"
  183092. #endif
  183093. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183094. "adds r4, r4, r5\n\t"
  183095. #else
  183096. "add r4, r4, r5\n\t"
  183097. #endif
  183098. #ifdef WOLFSSL_KEIL
  183099. "adcs r2, r2, r6\n\t"
  183100. #elif defined(__clang__)
  183101. "adcs r2, r6\n\t"
  183102. #else
  183103. "adc r2, r6\n\t"
  183104. #endif
  183105. #ifdef WOLFSSL_KEIL
  183106. "adcs r3, r3, %[r]\n\t"
  183107. #elif defined(__clang__)
  183108. "adcs r3, %[r]\n\t"
  183109. #else
  183110. "adc r3, %[r]\n\t"
  183111. #endif
  183112. "str r4, [sp, #56]\n\t"
  183113. "# A[8] * A[7]\n\t"
  183114. "movs r4, #0\n\t"
  183115. "ldr %[a], [%[a], #32]\n\t"
  183116. "uxth r5, %[a]\n\t"
  183117. "uxth r6, r7\n\t"
  183118. #ifdef WOLFSSL_KEIL
  183119. "muls r6, r5, r6\n\t"
  183120. #elif defined(__clang__)
  183121. "muls r6, r5\n\t"
  183122. #else
  183123. "mul r6, r5\n\t"
  183124. #endif
  183125. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183126. "adds r2, r2, r6\n\t"
  183127. #else
  183128. "add r2, r2, r6\n\t"
  183129. #endif
  183130. #ifdef WOLFSSL_KEIL
  183131. "adcs r3, r3, %[r]\n\t"
  183132. #elif defined(__clang__)
  183133. "adcs r3, %[r]\n\t"
  183134. #else
  183135. "adc r3, %[r]\n\t"
  183136. #endif
  183137. #ifdef WOLFSSL_KEIL
  183138. "adcs r4, r4, %[r]\n\t"
  183139. #elif defined(__clang__)
  183140. "adcs r4, %[r]\n\t"
  183141. #else
  183142. "adc r4, %[r]\n\t"
  183143. #endif
  183144. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183145. "adds r2, r2, r6\n\t"
  183146. #else
  183147. "add r2, r2, r6\n\t"
  183148. #endif
  183149. #ifdef WOLFSSL_KEIL
  183150. "adcs r3, r3, %[r]\n\t"
  183151. #elif defined(__clang__)
  183152. "adcs r3, %[r]\n\t"
  183153. #else
  183154. "adc r3, %[r]\n\t"
  183155. #endif
  183156. #ifdef WOLFSSL_KEIL
  183157. "adcs r4, r4, %[r]\n\t"
  183158. #elif defined(__clang__)
  183159. "adcs r4, %[r]\n\t"
  183160. #else
  183161. "adc r4, %[r]\n\t"
  183162. #endif
  183163. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183164. "lsrs r6, r7, #16\n\t"
  183165. #else
  183166. "lsr r6, r7, #16\n\t"
  183167. #endif
  183168. #ifdef WOLFSSL_KEIL
  183169. "muls r5, r6, r5\n\t"
  183170. #elif defined(__clang__)
  183171. "muls r5, r6\n\t"
  183172. #else
  183173. "mul r5, r6\n\t"
  183174. #endif
  183175. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183176. "lsrs r6, r5, #16\n\t"
  183177. #else
  183178. "lsr r6, r5, #16\n\t"
  183179. #endif
  183180. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183181. "lsls r5, r5, #16\n\t"
  183182. #else
  183183. "lsl r5, r5, #16\n\t"
  183184. #endif
  183185. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183186. "adds r2, r2, r5\n\t"
  183187. #else
  183188. "add r2, r2, r5\n\t"
  183189. #endif
  183190. #ifdef WOLFSSL_KEIL
  183191. "adcs r3, r3, r6\n\t"
  183192. #elif defined(__clang__)
  183193. "adcs r3, r6\n\t"
  183194. #else
  183195. "adc r3, r6\n\t"
  183196. #endif
  183197. #ifdef WOLFSSL_KEIL
  183198. "adcs r4, r4, %[r]\n\t"
  183199. #elif defined(__clang__)
  183200. "adcs r4, %[r]\n\t"
  183201. #else
  183202. "adc r4, %[r]\n\t"
  183203. #endif
  183204. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183205. "adds r2, r2, r5\n\t"
  183206. #else
  183207. "add r2, r2, r5\n\t"
  183208. #endif
  183209. #ifdef WOLFSSL_KEIL
  183210. "adcs r3, r3, r6\n\t"
  183211. #elif defined(__clang__)
  183212. "adcs r3, r6\n\t"
  183213. #else
  183214. "adc r3, r6\n\t"
  183215. #endif
  183216. #ifdef WOLFSSL_KEIL
  183217. "adcs r4, r4, %[r]\n\t"
  183218. #elif defined(__clang__)
  183219. "adcs r4, %[r]\n\t"
  183220. #else
  183221. "adc r4, %[r]\n\t"
  183222. #endif
  183223. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183224. "lsrs r5, %[a], #16\n\t"
  183225. #else
  183226. "lsr r5, %[a], #16\n\t"
  183227. #endif
  183228. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183229. "lsrs r6, r7, #16\n\t"
  183230. #else
  183231. "lsr r6, r7, #16\n\t"
  183232. #endif
  183233. #ifdef WOLFSSL_KEIL
  183234. "muls r6, r5, r6\n\t"
  183235. #elif defined(__clang__)
  183236. "muls r6, r5\n\t"
  183237. #else
  183238. "mul r6, r5\n\t"
  183239. #endif
  183240. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183241. "adds r3, r3, r6\n\t"
  183242. #else
  183243. "add r3, r3, r6\n\t"
  183244. #endif
  183245. #ifdef WOLFSSL_KEIL
  183246. "adcs r4, r4, %[r]\n\t"
  183247. #elif defined(__clang__)
  183248. "adcs r4, %[r]\n\t"
  183249. #else
  183250. "adc r4, %[r]\n\t"
  183251. #endif
  183252. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183253. "adds r3, r3, r6\n\t"
  183254. #else
  183255. "add r3, r3, r6\n\t"
  183256. #endif
  183257. #ifdef WOLFSSL_KEIL
  183258. "adcs r4, r4, %[r]\n\t"
  183259. #elif defined(__clang__)
  183260. "adcs r4, %[r]\n\t"
  183261. #else
  183262. "adc r4, %[r]\n\t"
  183263. #endif
  183264. "uxth r6, r7\n\t"
  183265. #ifdef WOLFSSL_KEIL
  183266. "muls r5, r6, r5\n\t"
  183267. #elif defined(__clang__)
  183268. "muls r5, r6\n\t"
  183269. #else
  183270. "mul r5, r6\n\t"
  183271. #endif
  183272. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183273. "lsrs r6, r5, #16\n\t"
  183274. #else
  183275. "lsr r6, r5, #16\n\t"
  183276. #endif
  183277. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183278. "lsls r5, r5, #16\n\t"
  183279. #else
  183280. "lsl r5, r5, #16\n\t"
  183281. #endif
  183282. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183283. "adds r2, r2, r5\n\t"
  183284. #else
  183285. "add r2, r2, r5\n\t"
  183286. #endif
  183287. #ifdef WOLFSSL_KEIL
  183288. "adcs r3, r3, r6\n\t"
  183289. #elif defined(__clang__)
  183290. "adcs r3, r6\n\t"
  183291. #else
  183292. "adc r3, r6\n\t"
  183293. #endif
  183294. #ifdef WOLFSSL_KEIL
  183295. "adcs r4, r4, %[r]\n\t"
  183296. #elif defined(__clang__)
  183297. "adcs r4, %[r]\n\t"
  183298. #else
  183299. "adc r4, %[r]\n\t"
  183300. #endif
  183301. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183302. "adds r2, r2, r5\n\t"
  183303. #else
  183304. "add r2, r2, r5\n\t"
  183305. #endif
  183306. #ifdef WOLFSSL_KEIL
  183307. "adcs r3, r3, r6\n\t"
  183308. #elif defined(__clang__)
  183309. "adcs r3, r6\n\t"
  183310. #else
  183311. "adc r3, r6\n\t"
  183312. #endif
  183313. #ifdef WOLFSSL_KEIL
  183314. "adcs r4, r4, %[r]\n\t"
  183315. #elif defined(__clang__)
  183316. "adcs r4, %[r]\n\t"
  183317. #else
  183318. "adc r4, %[r]\n\t"
  183319. #endif
  183320. "# A[9] * A[6]\n\t"
  183321. "mov %[a], r9\n\t"
  183322. "ldr r7, [%[a], #24]\n\t"
  183323. "ldr %[a], [%[a], #36]\n\t"
  183324. "uxth r5, %[a]\n\t"
  183325. "uxth r6, r7\n\t"
  183326. #ifdef WOLFSSL_KEIL
  183327. "muls r6, r5, r6\n\t"
  183328. #elif defined(__clang__)
  183329. "muls r6, r5\n\t"
  183330. #else
  183331. "mul r6, r5\n\t"
  183332. #endif
  183333. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183334. "adds r2, r2, r6\n\t"
  183335. #else
  183336. "add r2, r2, r6\n\t"
  183337. #endif
  183338. #ifdef WOLFSSL_KEIL
  183339. "adcs r3, r3, %[r]\n\t"
  183340. #elif defined(__clang__)
  183341. "adcs r3, %[r]\n\t"
  183342. #else
  183343. "adc r3, %[r]\n\t"
  183344. #endif
  183345. #ifdef WOLFSSL_KEIL
  183346. "adcs r4, r4, %[r]\n\t"
  183347. #elif defined(__clang__)
  183348. "adcs r4, %[r]\n\t"
  183349. #else
  183350. "adc r4, %[r]\n\t"
  183351. #endif
  183352. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183353. "adds r2, r2, r6\n\t"
  183354. #else
  183355. "add r2, r2, r6\n\t"
  183356. #endif
  183357. #ifdef WOLFSSL_KEIL
  183358. "adcs r3, r3, %[r]\n\t"
  183359. #elif defined(__clang__)
  183360. "adcs r3, %[r]\n\t"
  183361. #else
  183362. "adc r3, %[r]\n\t"
  183363. #endif
  183364. #ifdef WOLFSSL_KEIL
  183365. "adcs r4, r4, %[r]\n\t"
  183366. #elif defined(__clang__)
  183367. "adcs r4, %[r]\n\t"
  183368. #else
  183369. "adc r4, %[r]\n\t"
  183370. #endif
  183371. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183372. "lsrs r6, r7, #16\n\t"
  183373. #else
  183374. "lsr r6, r7, #16\n\t"
  183375. #endif
  183376. #ifdef WOLFSSL_KEIL
  183377. "muls r5, r6, r5\n\t"
  183378. #elif defined(__clang__)
  183379. "muls r5, r6\n\t"
  183380. #else
  183381. "mul r5, r6\n\t"
  183382. #endif
  183383. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183384. "lsrs r6, r5, #16\n\t"
  183385. #else
  183386. "lsr r6, r5, #16\n\t"
  183387. #endif
  183388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183389. "lsls r5, r5, #16\n\t"
  183390. #else
  183391. "lsl r5, r5, #16\n\t"
  183392. #endif
  183393. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183394. "adds r2, r2, r5\n\t"
  183395. #else
  183396. "add r2, r2, r5\n\t"
  183397. #endif
  183398. #ifdef WOLFSSL_KEIL
  183399. "adcs r3, r3, r6\n\t"
  183400. #elif defined(__clang__)
  183401. "adcs r3, r6\n\t"
  183402. #else
  183403. "adc r3, r6\n\t"
  183404. #endif
  183405. #ifdef WOLFSSL_KEIL
  183406. "adcs r4, r4, %[r]\n\t"
  183407. #elif defined(__clang__)
  183408. "adcs r4, %[r]\n\t"
  183409. #else
  183410. "adc r4, %[r]\n\t"
  183411. #endif
  183412. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183413. "adds r2, r2, r5\n\t"
  183414. #else
  183415. "add r2, r2, r5\n\t"
  183416. #endif
  183417. #ifdef WOLFSSL_KEIL
  183418. "adcs r3, r3, r6\n\t"
  183419. #elif defined(__clang__)
  183420. "adcs r3, r6\n\t"
  183421. #else
  183422. "adc r3, r6\n\t"
  183423. #endif
  183424. #ifdef WOLFSSL_KEIL
  183425. "adcs r4, r4, %[r]\n\t"
  183426. #elif defined(__clang__)
  183427. "adcs r4, %[r]\n\t"
  183428. #else
  183429. "adc r4, %[r]\n\t"
  183430. #endif
  183431. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183432. "lsrs r5, %[a], #16\n\t"
  183433. #else
  183434. "lsr r5, %[a], #16\n\t"
  183435. #endif
  183436. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183437. "lsrs r6, r7, #16\n\t"
  183438. #else
  183439. "lsr r6, r7, #16\n\t"
  183440. #endif
  183441. #ifdef WOLFSSL_KEIL
  183442. "muls r6, r5, r6\n\t"
  183443. #elif defined(__clang__)
  183444. "muls r6, r5\n\t"
  183445. #else
  183446. "mul r6, r5\n\t"
  183447. #endif
  183448. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183449. "adds r3, r3, r6\n\t"
  183450. #else
  183451. "add r3, r3, r6\n\t"
  183452. #endif
  183453. #ifdef WOLFSSL_KEIL
  183454. "adcs r4, r4, %[r]\n\t"
  183455. #elif defined(__clang__)
  183456. "adcs r4, %[r]\n\t"
  183457. #else
  183458. "adc r4, %[r]\n\t"
  183459. #endif
  183460. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183461. "adds r3, r3, r6\n\t"
  183462. #else
  183463. "add r3, r3, r6\n\t"
  183464. #endif
  183465. #ifdef WOLFSSL_KEIL
  183466. "adcs r4, r4, %[r]\n\t"
  183467. #elif defined(__clang__)
  183468. "adcs r4, %[r]\n\t"
  183469. #else
  183470. "adc r4, %[r]\n\t"
  183471. #endif
  183472. "uxth r6, r7\n\t"
  183473. #ifdef WOLFSSL_KEIL
  183474. "muls r5, r6, r5\n\t"
  183475. #elif defined(__clang__)
  183476. "muls r5, r6\n\t"
  183477. #else
  183478. "mul r5, r6\n\t"
  183479. #endif
  183480. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183481. "lsrs r6, r5, #16\n\t"
  183482. #else
  183483. "lsr r6, r5, #16\n\t"
  183484. #endif
  183485. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183486. "lsls r5, r5, #16\n\t"
  183487. #else
  183488. "lsl r5, r5, #16\n\t"
  183489. #endif
  183490. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183491. "adds r2, r2, r5\n\t"
  183492. #else
  183493. "add r2, r2, r5\n\t"
  183494. #endif
  183495. #ifdef WOLFSSL_KEIL
  183496. "adcs r3, r3, r6\n\t"
  183497. #elif defined(__clang__)
  183498. "adcs r3, r6\n\t"
  183499. #else
  183500. "adc r3, r6\n\t"
  183501. #endif
  183502. #ifdef WOLFSSL_KEIL
  183503. "adcs r4, r4, %[r]\n\t"
  183504. #elif defined(__clang__)
  183505. "adcs r4, %[r]\n\t"
  183506. #else
  183507. "adc r4, %[r]\n\t"
  183508. #endif
  183509. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183510. "adds r2, r2, r5\n\t"
  183511. #else
  183512. "add r2, r2, r5\n\t"
  183513. #endif
  183514. #ifdef WOLFSSL_KEIL
  183515. "adcs r3, r3, r6\n\t"
  183516. #elif defined(__clang__)
  183517. "adcs r3, r6\n\t"
  183518. #else
  183519. "adc r3, r6\n\t"
  183520. #endif
  183521. #ifdef WOLFSSL_KEIL
  183522. "adcs r4, r4, %[r]\n\t"
  183523. #elif defined(__clang__)
  183524. "adcs r4, %[r]\n\t"
  183525. #else
  183526. "adc r4, %[r]\n\t"
  183527. #endif
  183528. "# A[10] * A[5]\n\t"
  183529. "mov %[a], r9\n\t"
  183530. "ldr r7, [%[a], #20]\n\t"
  183531. "ldr %[a], [%[a], #40]\n\t"
  183532. "uxth r5, %[a]\n\t"
  183533. "uxth r6, r7\n\t"
  183534. #ifdef WOLFSSL_KEIL
  183535. "muls r6, r5, r6\n\t"
  183536. #elif defined(__clang__)
  183537. "muls r6, r5\n\t"
  183538. #else
  183539. "mul r6, r5\n\t"
  183540. #endif
  183541. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183542. "adds r2, r2, r6\n\t"
  183543. #else
  183544. "add r2, r2, r6\n\t"
  183545. #endif
  183546. #ifdef WOLFSSL_KEIL
  183547. "adcs r3, r3, %[r]\n\t"
  183548. #elif defined(__clang__)
  183549. "adcs r3, %[r]\n\t"
  183550. #else
  183551. "adc r3, %[r]\n\t"
  183552. #endif
  183553. #ifdef WOLFSSL_KEIL
  183554. "adcs r4, r4, %[r]\n\t"
  183555. #elif defined(__clang__)
  183556. "adcs r4, %[r]\n\t"
  183557. #else
  183558. "adc r4, %[r]\n\t"
  183559. #endif
  183560. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183561. "adds r2, r2, r6\n\t"
  183562. #else
  183563. "add r2, r2, r6\n\t"
  183564. #endif
  183565. #ifdef WOLFSSL_KEIL
  183566. "adcs r3, r3, %[r]\n\t"
  183567. #elif defined(__clang__)
  183568. "adcs r3, %[r]\n\t"
  183569. #else
  183570. "adc r3, %[r]\n\t"
  183571. #endif
  183572. #ifdef WOLFSSL_KEIL
  183573. "adcs r4, r4, %[r]\n\t"
  183574. #elif defined(__clang__)
  183575. "adcs r4, %[r]\n\t"
  183576. #else
  183577. "adc r4, %[r]\n\t"
  183578. #endif
  183579. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183580. "lsrs r6, r7, #16\n\t"
  183581. #else
  183582. "lsr r6, r7, #16\n\t"
  183583. #endif
  183584. #ifdef WOLFSSL_KEIL
  183585. "muls r5, r6, r5\n\t"
  183586. #elif defined(__clang__)
  183587. "muls r5, r6\n\t"
  183588. #else
  183589. "mul r5, r6\n\t"
  183590. #endif
  183591. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183592. "lsrs r6, r5, #16\n\t"
  183593. #else
  183594. "lsr r6, r5, #16\n\t"
  183595. #endif
  183596. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183597. "lsls r5, r5, #16\n\t"
  183598. #else
  183599. "lsl r5, r5, #16\n\t"
  183600. #endif
  183601. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183602. "adds r2, r2, r5\n\t"
  183603. #else
  183604. "add r2, r2, r5\n\t"
  183605. #endif
  183606. #ifdef WOLFSSL_KEIL
  183607. "adcs r3, r3, r6\n\t"
  183608. #elif defined(__clang__)
  183609. "adcs r3, r6\n\t"
  183610. #else
  183611. "adc r3, r6\n\t"
  183612. #endif
  183613. #ifdef WOLFSSL_KEIL
  183614. "adcs r4, r4, %[r]\n\t"
  183615. #elif defined(__clang__)
  183616. "adcs r4, %[r]\n\t"
  183617. #else
  183618. "adc r4, %[r]\n\t"
  183619. #endif
  183620. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183621. "adds r2, r2, r5\n\t"
  183622. #else
  183623. "add r2, r2, r5\n\t"
  183624. #endif
  183625. #ifdef WOLFSSL_KEIL
  183626. "adcs r3, r3, r6\n\t"
  183627. #elif defined(__clang__)
  183628. "adcs r3, r6\n\t"
  183629. #else
  183630. "adc r3, r6\n\t"
  183631. #endif
  183632. #ifdef WOLFSSL_KEIL
  183633. "adcs r4, r4, %[r]\n\t"
  183634. #elif defined(__clang__)
  183635. "adcs r4, %[r]\n\t"
  183636. #else
  183637. "adc r4, %[r]\n\t"
  183638. #endif
  183639. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183640. "lsrs r5, %[a], #16\n\t"
  183641. #else
  183642. "lsr r5, %[a], #16\n\t"
  183643. #endif
  183644. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183645. "lsrs r6, r7, #16\n\t"
  183646. #else
  183647. "lsr r6, r7, #16\n\t"
  183648. #endif
  183649. #ifdef WOLFSSL_KEIL
  183650. "muls r6, r5, r6\n\t"
  183651. #elif defined(__clang__)
  183652. "muls r6, r5\n\t"
  183653. #else
  183654. "mul r6, r5\n\t"
  183655. #endif
  183656. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183657. "adds r3, r3, r6\n\t"
  183658. #else
  183659. "add r3, r3, r6\n\t"
  183660. #endif
  183661. #ifdef WOLFSSL_KEIL
  183662. "adcs r4, r4, %[r]\n\t"
  183663. #elif defined(__clang__)
  183664. "adcs r4, %[r]\n\t"
  183665. #else
  183666. "adc r4, %[r]\n\t"
  183667. #endif
  183668. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183669. "adds r3, r3, r6\n\t"
  183670. #else
  183671. "add r3, r3, r6\n\t"
  183672. #endif
  183673. #ifdef WOLFSSL_KEIL
  183674. "adcs r4, r4, %[r]\n\t"
  183675. #elif defined(__clang__)
  183676. "adcs r4, %[r]\n\t"
  183677. #else
  183678. "adc r4, %[r]\n\t"
  183679. #endif
  183680. "uxth r6, r7\n\t"
  183681. #ifdef WOLFSSL_KEIL
  183682. "muls r5, r6, r5\n\t"
  183683. #elif defined(__clang__)
  183684. "muls r5, r6\n\t"
  183685. #else
  183686. "mul r5, r6\n\t"
  183687. #endif
  183688. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183689. "lsrs r6, r5, #16\n\t"
  183690. #else
  183691. "lsr r6, r5, #16\n\t"
  183692. #endif
  183693. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183694. "lsls r5, r5, #16\n\t"
  183695. #else
  183696. "lsl r5, r5, #16\n\t"
  183697. #endif
  183698. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183699. "adds r2, r2, r5\n\t"
  183700. #else
  183701. "add r2, r2, r5\n\t"
  183702. #endif
  183703. #ifdef WOLFSSL_KEIL
  183704. "adcs r3, r3, r6\n\t"
  183705. #elif defined(__clang__)
  183706. "adcs r3, r6\n\t"
  183707. #else
  183708. "adc r3, r6\n\t"
  183709. #endif
  183710. #ifdef WOLFSSL_KEIL
  183711. "adcs r4, r4, %[r]\n\t"
  183712. #elif defined(__clang__)
  183713. "adcs r4, %[r]\n\t"
  183714. #else
  183715. "adc r4, %[r]\n\t"
  183716. #endif
  183717. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183718. "adds r2, r2, r5\n\t"
  183719. #else
  183720. "add r2, r2, r5\n\t"
  183721. #endif
  183722. #ifdef WOLFSSL_KEIL
  183723. "adcs r3, r3, r6\n\t"
  183724. #elif defined(__clang__)
  183725. "adcs r3, r6\n\t"
  183726. #else
  183727. "adc r3, r6\n\t"
  183728. #endif
  183729. #ifdef WOLFSSL_KEIL
  183730. "adcs r4, r4, %[r]\n\t"
  183731. #elif defined(__clang__)
  183732. "adcs r4, %[r]\n\t"
  183733. #else
  183734. "adc r4, %[r]\n\t"
  183735. #endif
  183736. "# A[11] * A[4]\n\t"
  183737. "mov %[a], r9\n\t"
  183738. "ldr r7, [%[a], #16]\n\t"
  183739. "ldr %[a], [%[a], #44]\n\t"
  183740. "uxth r5, %[a]\n\t"
  183741. "uxth r6, r7\n\t"
  183742. #ifdef WOLFSSL_KEIL
  183743. "muls r6, r5, r6\n\t"
  183744. #elif defined(__clang__)
  183745. "muls r6, r5\n\t"
  183746. #else
  183747. "mul r6, r5\n\t"
  183748. #endif
  183749. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183750. "adds r2, r2, r6\n\t"
  183751. #else
  183752. "add r2, r2, r6\n\t"
  183753. #endif
  183754. #ifdef WOLFSSL_KEIL
  183755. "adcs r3, r3, %[r]\n\t"
  183756. #elif defined(__clang__)
  183757. "adcs r3, %[r]\n\t"
  183758. #else
  183759. "adc r3, %[r]\n\t"
  183760. #endif
  183761. #ifdef WOLFSSL_KEIL
  183762. "adcs r4, r4, %[r]\n\t"
  183763. #elif defined(__clang__)
  183764. "adcs r4, %[r]\n\t"
  183765. #else
  183766. "adc r4, %[r]\n\t"
  183767. #endif
  183768. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183769. "adds r2, r2, r6\n\t"
  183770. #else
  183771. "add r2, r2, r6\n\t"
  183772. #endif
  183773. #ifdef WOLFSSL_KEIL
  183774. "adcs r3, r3, %[r]\n\t"
  183775. #elif defined(__clang__)
  183776. "adcs r3, %[r]\n\t"
  183777. #else
  183778. "adc r3, %[r]\n\t"
  183779. #endif
  183780. #ifdef WOLFSSL_KEIL
  183781. "adcs r4, r4, %[r]\n\t"
  183782. #elif defined(__clang__)
  183783. "adcs r4, %[r]\n\t"
  183784. #else
  183785. "adc r4, %[r]\n\t"
  183786. #endif
  183787. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183788. "lsrs r6, r7, #16\n\t"
  183789. #else
  183790. "lsr r6, r7, #16\n\t"
  183791. #endif
  183792. #ifdef WOLFSSL_KEIL
  183793. "muls r5, r6, r5\n\t"
  183794. #elif defined(__clang__)
  183795. "muls r5, r6\n\t"
  183796. #else
  183797. "mul r5, r6\n\t"
  183798. #endif
  183799. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183800. "lsrs r6, r5, #16\n\t"
  183801. #else
  183802. "lsr r6, r5, #16\n\t"
  183803. #endif
  183804. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183805. "lsls r5, r5, #16\n\t"
  183806. #else
  183807. "lsl r5, r5, #16\n\t"
  183808. #endif
  183809. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183810. "adds r2, r2, r5\n\t"
  183811. #else
  183812. "add r2, r2, r5\n\t"
  183813. #endif
  183814. #ifdef WOLFSSL_KEIL
  183815. "adcs r3, r3, r6\n\t"
  183816. #elif defined(__clang__)
  183817. "adcs r3, r6\n\t"
  183818. #else
  183819. "adc r3, r6\n\t"
  183820. #endif
  183821. #ifdef WOLFSSL_KEIL
  183822. "adcs r4, r4, %[r]\n\t"
  183823. #elif defined(__clang__)
  183824. "adcs r4, %[r]\n\t"
  183825. #else
  183826. "adc r4, %[r]\n\t"
  183827. #endif
  183828. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183829. "adds r2, r2, r5\n\t"
  183830. #else
  183831. "add r2, r2, r5\n\t"
  183832. #endif
  183833. #ifdef WOLFSSL_KEIL
  183834. "adcs r3, r3, r6\n\t"
  183835. #elif defined(__clang__)
  183836. "adcs r3, r6\n\t"
  183837. #else
  183838. "adc r3, r6\n\t"
  183839. #endif
  183840. #ifdef WOLFSSL_KEIL
  183841. "adcs r4, r4, %[r]\n\t"
  183842. #elif defined(__clang__)
  183843. "adcs r4, %[r]\n\t"
  183844. #else
  183845. "adc r4, %[r]\n\t"
  183846. #endif
  183847. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183848. "lsrs r5, %[a], #16\n\t"
  183849. #else
  183850. "lsr r5, %[a], #16\n\t"
  183851. #endif
  183852. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183853. "lsrs r6, r7, #16\n\t"
  183854. #else
  183855. "lsr r6, r7, #16\n\t"
  183856. #endif
  183857. #ifdef WOLFSSL_KEIL
  183858. "muls r6, r5, r6\n\t"
  183859. #elif defined(__clang__)
  183860. "muls r6, r5\n\t"
  183861. #else
  183862. "mul r6, r5\n\t"
  183863. #endif
  183864. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183865. "adds r3, r3, r6\n\t"
  183866. #else
  183867. "add r3, r3, r6\n\t"
  183868. #endif
  183869. #ifdef WOLFSSL_KEIL
  183870. "adcs r4, r4, %[r]\n\t"
  183871. #elif defined(__clang__)
  183872. "adcs r4, %[r]\n\t"
  183873. #else
  183874. "adc r4, %[r]\n\t"
  183875. #endif
  183876. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183877. "adds r3, r3, r6\n\t"
  183878. #else
  183879. "add r3, r3, r6\n\t"
  183880. #endif
  183881. #ifdef WOLFSSL_KEIL
  183882. "adcs r4, r4, %[r]\n\t"
  183883. #elif defined(__clang__)
  183884. "adcs r4, %[r]\n\t"
  183885. #else
  183886. "adc r4, %[r]\n\t"
  183887. #endif
  183888. "uxth r6, r7\n\t"
  183889. #ifdef WOLFSSL_KEIL
  183890. "muls r5, r6, r5\n\t"
  183891. #elif defined(__clang__)
  183892. "muls r5, r6\n\t"
  183893. #else
  183894. "mul r5, r6\n\t"
  183895. #endif
  183896. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183897. "lsrs r6, r5, #16\n\t"
  183898. #else
  183899. "lsr r6, r5, #16\n\t"
  183900. #endif
  183901. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183902. "lsls r5, r5, #16\n\t"
  183903. #else
  183904. "lsl r5, r5, #16\n\t"
  183905. #endif
  183906. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183907. "adds r2, r2, r5\n\t"
  183908. #else
  183909. "add r2, r2, r5\n\t"
  183910. #endif
  183911. #ifdef WOLFSSL_KEIL
  183912. "adcs r3, r3, r6\n\t"
  183913. #elif defined(__clang__)
  183914. "adcs r3, r6\n\t"
  183915. #else
  183916. "adc r3, r6\n\t"
  183917. #endif
  183918. #ifdef WOLFSSL_KEIL
  183919. "adcs r4, r4, %[r]\n\t"
  183920. #elif defined(__clang__)
  183921. "adcs r4, %[r]\n\t"
  183922. #else
  183923. "adc r4, %[r]\n\t"
  183924. #endif
  183925. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183926. "adds r2, r2, r5\n\t"
  183927. #else
  183928. "add r2, r2, r5\n\t"
  183929. #endif
  183930. #ifdef WOLFSSL_KEIL
  183931. "adcs r3, r3, r6\n\t"
  183932. #elif defined(__clang__)
  183933. "adcs r3, r6\n\t"
  183934. #else
  183935. "adc r3, r6\n\t"
  183936. #endif
  183937. #ifdef WOLFSSL_KEIL
  183938. "adcs r4, r4, %[r]\n\t"
  183939. #elif defined(__clang__)
  183940. "adcs r4, %[r]\n\t"
  183941. #else
  183942. "adc r4, %[r]\n\t"
  183943. #endif
  183944. "# A[12] * A[3]\n\t"
  183945. "mov %[a], r9\n\t"
  183946. "mov r7, lr\n\t"
  183947. "ldr %[a], [%[a], #48]\n\t"
  183948. "uxth r5, %[a]\n\t"
  183949. "uxth r6, r7\n\t"
  183950. #ifdef WOLFSSL_KEIL
  183951. "muls r6, r5, r6\n\t"
  183952. #elif defined(__clang__)
  183953. "muls r6, r5\n\t"
  183954. #else
  183955. "mul r6, r5\n\t"
  183956. #endif
  183957. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183958. "adds r2, r2, r6\n\t"
  183959. #else
  183960. "add r2, r2, r6\n\t"
  183961. #endif
  183962. #ifdef WOLFSSL_KEIL
  183963. "adcs r3, r3, %[r]\n\t"
  183964. #elif defined(__clang__)
  183965. "adcs r3, %[r]\n\t"
  183966. #else
  183967. "adc r3, %[r]\n\t"
  183968. #endif
  183969. #ifdef WOLFSSL_KEIL
  183970. "adcs r4, r4, %[r]\n\t"
  183971. #elif defined(__clang__)
  183972. "adcs r4, %[r]\n\t"
  183973. #else
  183974. "adc r4, %[r]\n\t"
  183975. #endif
  183976. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183977. "adds r2, r2, r6\n\t"
  183978. #else
  183979. "add r2, r2, r6\n\t"
  183980. #endif
  183981. #ifdef WOLFSSL_KEIL
  183982. "adcs r3, r3, %[r]\n\t"
  183983. #elif defined(__clang__)
  183984. "adcs r3, %[r]\n\t"
  183985. #else
  183986. "adc r3, %[r]\n\t"
  183987. #endif
  183988. #ifdef WOLFSSL_KEIL
  183989. "adcs r4, r4, %[r]\n\t"
  183990. #elif defined(__clang__)
  183991. "adcs r4, %[r]\n\t"
  183992. #else
  183993. "adc r4, %[r]\n\t"
  183994. #endif
  183995. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183996. "lsrs r6, r7, #16\n\t"
  183997. #else
  183998. "lsr r6, r7, #16\n\t"
  183999. #endif
  184000. #ifdef WOLFSSL_KEIL
  184001. "muls r5, r6, r5\n\t"
  184002. #elif defined(__clang__)
  184003. "muls r5, r6\n\t"
  184004. #else
  184005. "mul r5, r6\n\t"
  184006. #endif
  184007. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184008. "lsrs r6, r5, #16\n\t"
  184009. #else
  184010. "lsr r6, r5, #16\n\t"
  184011. #endif
  184012. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184013. "lsls r5, r5, #16\n\t"
  184014. #else
  184015. "lsl r5, r5, #16\n\t"
  184016. #endif
  184017. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184018. "adds r2, r2, r5\n\t"
  184019. #else
  184020. "add r2, r2, r5\n\t"
  184021. #endif
  184022. #ifdef WOLFSSL_KEIL
  184023. "adcs r3, r3, r6\n\t"
  184024. #elif defined(__clang__)
  184025. "adcs r3, r6\n\t"
  184026. #else
  184027. "adc r3, r6\n\t"
  184028. #endif
  184029. #ifdef WOLFSSL_KEIL
  184030. "adcs r4, r4, %[r]\n\t"
  184031. #elif defined(__clang__)
  184032. "adcs r4, %[r]\n\t"
  184033. #else
  184034. "adc r4, %[r]\n\t"
  184035. #endif
  184036. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184037. "adds r2, r2, r5\n\t"
  184038. #else
  184039. "add r2, r2, r5\n\t"
  184040. #endif
  184041. #ifdef WOLFSSL_KEIL
  184042. "adcs r3, r3, r6\n\t"
  184043. #elif defined(__clang__)
  184044. "adcs r3, r6\n\t"
  184045. #else
  184046. "adc r3, r6\n\t"
  184047. #endif
  184048. #ifdef WOLFSSL_KEIL
  184049. "adcs r4, r4, %[r]\n\t"
  184050. #elif defined(__clang__)
  184051. "adcs r4, %[r]\n\t"
  184052. #else
  184053. "adc r4, %[r]\n\t"
  184054. #endif
  184055. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184056. "lsrs r5, %[a], #16\n\t"
  184057. #else
  184058. "lsr r5, %[a], #16\n\t"
  184059. #endif
  184060. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184061. "lsrs r6, r7, #16\n\t"
  184062. #else
  184063. "lsr r6, r7, #16\n\t"
  184064. #endif
  184065. #ifdef WOLFSSL_KEIL
  184066. "muls r6, r5, r6\n\t"
  184067. #elif defined(__clang__)
  184068. "muls r6, r5\n\t"
  184069. #else
  184070. "mul r6, r5\n\t"
  184071. #endif
  184072. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184073. "adds r3, r3, r6\n\t"
  184074. #else
  184075. "add r3, r3, r6\n\t"
  184076. #endif
  184077. #ifdef WOLFSSL_KEIL
  184078. "adcs r4, r4, %[r]\n\t"
  184079. #elif defined(__clang__)
  184080. "adcs r4, %[r]\n\t"
  184081. #else
  184082. "adc r4, %[r]\n\t"
  184083. #endif
  184084. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184085. "adds r3, r3, r6\n\t"
  184086. #else
  184087. "add r3, r3, r6\n\t"
  184088. #endif
  184089. #ifdef WOLFSSL_KEIL
  184090. "adcs r4, r4, %[r]\n\t"
  184091. #elif defined(__clang__)
  184092. "adcs r4, %[r]\n\t"
  184093. #else
  184094. "adc r4, %[r]\n\t"
  184095. #endif
  184096. "uxth r6, r7\n\t"
  184097. #ifdef WOLFSSL_KEIL
  184098. "muls r5, r6, r5\n\t"
  184099. #elif defined(__clang__)
  184100. "muls r5, r6\n\t"
  184101. #else
  184102. "mul r5, r6\n\t"
  184103. #endif
  184104. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184105. "lsrs r6, r5, #16\n\t"
  184106. #else
  184107. "lsr r6, r5, #16\n\t"
  184108. #endif
  184109. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184110. "lsls r5, r5, #16\n\t"
  184111. #else
  184112. "lsl r5, r5, #16\n\t"
  184113. #endif
  184114. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184115. "adds r2, r2, r5\n\t"
  184116. #else
  184117. "add r2, r2, r5\n\t"
  184118. #endif
  184119. #ifdef WOLFSSL_KEIL
  184120. "adcs r3, r3, r6\n\t"
  184121. #elif defined(__clang__)
  184122. "adcs r3, r6\n\t"
  184123. #else
  184124. "adc r3, r6\n\t"
  184125. #endif
  184126. #ifdef WOLFSSL_KEIL
  184127. "adcs r4, r4, %[r]\n\t"
  184128. #elif defined(__clang__)
  184129. "adcs r4, %[r]\n\t"
  184130. #else
  184131. "adc r4, %[r]\n\t"
  184132. #endif
  184133. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184134. "adds r2, r2, r5\n\t"
  184135. #else
  184136. "add r2, r2, r5\n\t"
  184137. #endif
  184138. #ifdef WOLFSSL_KEIL
  184139. "adcs r3, r3, r6\n\t"
  184140. #elif defined(__clang__)
  184141. "adcs r3, r6\n\t"
  184142. #else
  184143. "adc r3, r6\n\t"
  184144. #endif
  184145. #ifdef WOLFSSL_KEIL
  184146. "adcs r4, r4, %[r]\n\t"
  184147. #elif defined(__clang__)
  184148. "adcs r4, %[r]\n\t"
  184149. #else
  184150. "adc r4, %[r]\n\t"
  184151. #endif
  184152. "# A[13] * A[2]\n\t"
  184153. "mov %[a], r9\n\t"
  184154. "mov r7, r12\n\t"
  184155. "ldr %[a], [%[a], #52]\n\t"
  184156. "uxth r5, %[a]\n\t"
  184157. "uxth r6, r7\n\t"
  184158. #ifdef WOLFSSL_KEIL
  184159. "muls r6, r5, r6\n\t"
  184160. #elif defined(__clang__)
  184161. "muls r6, r5\n\t"
  184162. #else
  184163. "mul r6, r5\n\t"
  184164. #endif
  184165. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184166. "adds r2, r2, r6\n\t"
  184167. #else
  184168. "add r2, r2, r6\n\t"
  184169. #endif
  184170. #ifdef WOLFSSL_KEIL
  184171. "adcs r3, r3, %[r]\n\t"
  184172. #elif defined(__clang__)
  184173. "adcs r3, %[r]\n\t"
  184174. #else
  184175. "adc r3, %[r]\n\t"
  184176. #endif
  184177. #ifdef WOLFSSL_KEIL
  184178. "adcs r4, r4, %[r]\n\t"
  184179. #elif defined(__clang__)
  184180. "adcs r4, %[r]\n\t"
  184181. #else
  184182. "adc r4, %[r]\n\t"
  184183. #endif
  184184. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184185. "adds r2, r2, r6\n\t"
  184186. #else
  184187. "add r2, r2, r6\n\t"
  184188. #endif
  184189. #ifdef WOLFSSL_KEIL
  184190. "adcs r3, r3, %[r]\n\t"
  184191. #elif defined(__clang__)
  184192. "adcs r3, %[r]\n\t"
  184193. #else
  184194. "adc r3, %[r]\n\t"
  184195. #endif
  184196. #ifdef WOLFSSL_KEIL
  184197. "adcs r4, r4, %[r]\n\t"
  184198. #elif defined(__clang__)
  184199. "adcs r4, %[r]\n\t"
  184200. #else
  184201. "adc r4, %[r]\n\t"
  184202. #endif
  184203. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184204. "lsrs r6, r7, #16\n\t"
  184205. #else
  184206. "lsr r6, r7, #16\n\t"
  184207. #endif
  184208. #ifdef WOLFSSL_KEIL
  184209. "muls r5, r6, r5\n\t"
  184210. #elif defined(__clang__)
  184211. "muls r5, r6\n\t"
  184212. #else
  184213. "mul r5, r6\n\t"
  184214. #endif
  184215. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184216. "lsrs r6, r5, #16\n\t"
  184217. #else
  184218. "lsr r6, r5, #16\n\t"
  184219. #endif
  184220. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184221. "lsls r5, r5, #16\n\t"
  184222. #else
  184223. "lsl r5, r5, #16\n\t"
  184224. #endif
  184225. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184226. "adds r2, r2, r5\n\t"
  184227. #else
  184228. "add r2, r2, r5\n\t"
  184229. #endif
  184230. #ifdef WOLFSSL_KEIL
  184231. "adcs r3, r3, r6\n\t"
  184232. #elif defined(__clang__)
  184233. "adcs r3, r6\n\t"
  184234. #else
  184235. "adc r3, r6\n\t"
  184236. #endif
  184237. #ifdef WOLFSSL_KEIL
  184238. "adcs r4, r4, %[r]\n\t"
  184239. #elif defined(__clang__)
  184240. "adcs r4, %[r]\n\t"
  184241. #else
  184242. "adc r4, %[r]\n\t"
  184243. #endif
  184244. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184245. "adds r2, r2, r5\n\t"
  184246. #else
  184247. "add r2, r2, r5\n\t"
  184248. #endif
  184249. #ifdef WOLFSSL_KEIL
  184250. "adcs r3, r3, r6\n\t"
  184251. #elif defined(__clang__)
  184252. "adcs r3, r6\n\t"
  184253. #else
  184254. "adc r3, r6\n\t"
  184255. #endif
  184256. #ifdef WOLFSSL_KEIL
  184257. "adcs r4, r4, %[r]\n\t"
  184258. #elif defined(__clang__)
  184259. "adcs r4, %[r]\n\t"
  184260. #else
  184261. "adc r4, %[r]\n\t"
  184262. #endif
  184263. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184264. "lsrs r5, %[a], #16\n\t"
  184265. #else
  184266. "lsr r5, %[a], #16\n\t"
  184267. #endif
  184268. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184269. "lsrs r6, r7, #16\n\t"
  184270. #else
  184271. "lsr r6, r7, #16\n\t"
  184272. #endif
  184273. #ifdef WOLFSSL_KEIL
  184274. "muls r6, r5, r6\n\t"
  184275. #elif defined(__clang__)
  184276. "muls r6, r5\n\t"
  184277. #else
  184278. "mul r6, r5\n\t"
  184279. #endif
  184280. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184281. "adds r3, r3, r6\n\t"
  184282. #else
  184283. "add r3, r3, r6\n\t"
  184284. #endif
  184285. #ifdef WOLFSSL_KEIL
  184286. "adcs r4, r4, %[r]\n\t"
  184287. #elif defined(__clang__)
  184288. "adcs r4, %[r]\n\t"
  184289. #else
  184290. "adc r4, %[r]\n\t"
  184291. #endif
  184292. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184293. "adds r3, r3, r6\n\t"
  184294. #else
  184295. "add r3, r3, r6\n\t"
  184296. #endif
  184297. #ifdef WOLFSSL_KEIL
  184298. "adcs r4, r4, %[r]\n\t"
  184299. #elif defined(__clang__)
  184300. "adcs r4, %[r]\n\t"
  184301. #else
  184302. "adc r4, %[r]\n\t"
  184303. #endif
  184304. "uxth r6, r7\n\t"
  184305. #ifdef WOLFSSL_KEIL
  184306. "muls r5, r6, r5\n\t"
  184307. #elif defined(__clang__)
  184308. "muls r5, r6\n\t"
  184309. #else
  184310. "mul r5, r6\n\t"
  184311. #endif
  184312. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184313. "lsrs r6, r5, #16\n\t"
  184314. #else
  184315. "lsr r6, r5, #16\n\t"
  184316. #endif
  184317. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184318. "lsls r5, r5, #16\n\t"
  184319. #else
  184320. "lsl r5, r5, #16\n\t"
  184321. #endif
  184322. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184323. "adds r2, r2, r5\n\t"
  184324. #else
  184325. "add r2, r2, r5\n\t"
  184326. #endif
  184327. #ifdef WOLFSSL_KEIL
  184328. "adcs r3, r3, r6\n\t"
  184329. #elif defined(__clang__)
  184330. "adcs r3, r6\n\t"
  184331. #else
  184332. "adc r3, r6\n\t"
  184333. #endif
  184334. #ifdef WOLFSSL_KEIL
  184335. "adcs r4, r4, %[r]\n\t"
  184336. #elif defined(__clang__)
  184337. "adcs r4, %[r]\n\t"
  184338. #else
  184339. "adc r4, %[r]\n\t"
  184340. #endif
  184341. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184342. "adds r2, r2, r5\n\t"
  184343. #else
  184344. "add r2, r2, r5\n\t"
  184345. #endif
  184346. #ifdef WOLFSSL_KEIL
  184347. "adcs r3, r3, r6\n\t"
  184348. #elif defined(__clang__)
  184349. "adcs r3, r6\n\t"
  184350. #else
  184351. "adc r3, r6\n\t"
  184352. #endif
  184353. #ifdef WOLFSSL_KEIL
  184354. "adcs r4, r4, %[r]\n\t"
  184355. #elif defined(__clang__)
  184356. "adcs r4, %[r]\n\t"
  184357. #else
  184358. "adc r4, %[r]\n\t"
  184359. #endif
  184360. "# A[14] * A[1]\n\t"
  184361. "mov %[a], r9\n\t"
  184362. "mov r7, r11\n\t"
  184363. "ldr %[a], [%[a], #56]\n\t"
  184364. "uxth r5, %[a]\n\t"
  184365. "uxth r6, r7\n\t"
  184366. #ifdef WOLFSSL_KEIL
  184367. "muls r6, r5, r6\n\t"
  184368. #elif defined(__clang__)
  184369. "muls r6, r5\n\t"
  184370. #else
  184371. "mul r6, r5\n\t"
  184372. #endif
  184373. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184374. "adds r2, r2, r6\n\t"
  184375. #else
  184376. "add r2, r2, r6\n\t"
  184377. #endif
  184378. #ifdef WOLFSSL_KEIL
  184379. "adcs r3, r3, %[r]\n\t"
  184380. #elif defined(__clang__)
  184381. "adcs r3, %[r]\n\t"
  184382. #else
  184383. "adc r3, %[r]\n\t"
  184384. #endif
  184385. #ifdef WOLFSSL_KEIL
  184386. "adcs r4, r4, %[r]\n\t"
  184387. #elif defined(__clang__)
  184388. "adcs r4, %[r]\n\t"
  184389. #else
  184390. "adc r4, %[r]\n\t"
  184391. #endif
  184392. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184393. "adds r2, r2, r6\n\t"
  184394. #else
  184395. "add r2, r2, r6\n\t"
  184396. #endif
  184397. #ifdef WOLFSSL_KEIL
  184398. "adcs r3, r3, %[r]\n\t"
  184399. #elif defined(__clang__)
  184400. "adcs r3, %[r]\n\t"
  184401. #else
  184402. "adc r3, %[r]\n\t"
  184403. #endif
  184404. #ifdef WOLFSSL_KEIL
  184405. "adcs r4, r4, %[r]\n\t"
  184406. #elif defined(__clang__)
  184407. "adcs r4, %[r]\n\t"
  184408. #else
  184409. "adc r4, %[r]\n\t"
  184410. #endif
  184411. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184412. "lsrs r6, r7, #16\n\t"
  184413. #else
  184414. "lsr r6, r7, #16\n\t"
  184415. #endif
  184416. #ifdef WOLFSSL_KEIL
  184417. "muls r5, r6, r5\n\t"
  184418. #elif defined(__clang__)
  184419. "muls r5, r6\n\t"
  184420. #else
  184421. "mul r5, r6\n\t"
  184422. #endif
  184423. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184424. "lsrs r6, r5, #16\n\t"
  184425. #else
  184426. "lsr r6, r5, #16\n\t"
  184427. #endif
  184428. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184429. "lsls r5, r5, #16\n\t"
  184430. #else
  184431. "lsl r5, r5, #16\n\t"
  184432. #endif
  184433. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184434. "adds r2, r2, r5\n\t"
  184435. #else
  184436. "add r2, r2, r5\n\t"
  184437. #endif
  184438. #ifdef WOLFSSL_KEIL
  184439. "adcs r3, r3, r6\n\t"
  184440. #elif defined(__clang__)
  184441. "adcs r3, r6\n\t"
  184442. #else
  184443. "adc r3, r6\n\t"
  184444. #endif
  184445. #ifdef WOLFSSL_KEIL
  184446. "adcs r4, r4, %[r]\n\t"
  184447. #elif defined(__clang__)
  184448. "adcs r4, %[r]\n\t"
  184449. #else
  184450. "adc r4, %[r]\n\t"
  184451. #endif
  184452. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184453. "adds r2, r2, r5\n\t"
  184454. #else
  184455. "add r2, r2, r5\n\t"
  184456. #endif
  184457. #ifdef WOLFSSL_KEIL
  184458. "adcs r3, r3, r6\n\t"
  184459. #elif defined(__clang__)
  184460. "adcs r3, r6\n\t"
  184461. #else
  184462. "adc r3, r6\n\t"
  184463. #endif
  184464. #ifdef WOLFSSL_KEIL
  184465. "adcs r4, r4, %[r]\n\t"
  184466. #elif defined(__clang__)
  184467. "adcs r4, %[r]\n\t"
  184468. #else
  184469. "adc r4, %[r]\n\t"
  184470. #endif
  184471. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184472. "lsrs r5, %[a], #16\n\t"
  184473. #else
  184474. "lsr r5, %[a], #16\n\t"
  184475. #endif
  184476. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184477. "lsrs r6, r7, #16\n\t"
  184478. #else
  184479. "lsr r6, r7, #16\n\t"
  184480. #endif
  184481. #ifdef WOLFSSL_KEIL
  184482. "muls r6, r5, r6\n\t"
  184483. #elif defined(__clang__)
  184484. "muls r6, r5\n\t"
  184485. #else
  184486. "mul r6, r5\n\t"
  184487. #endif
  184488. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184489. "adds r3, r3, r6\n\t"
  184490. #else
  184491. "add r3, r3, r6\n\t"
  184492. #endif
  184493. #ifdef WOLFSSL_KEIL
  184494. "adcs r4, r4, %[r]\n\t"
  184495. #elif defined(__clang__)
  184496. "adcs r4, %[r]\n\t"
  184497. #else
  184498. "adc r4, %[r]\n\t"
  184499. #endif
  184500. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184501. "adds r3, r3, r6\n\t"
  184502. #else
  184503. "add r3, r3, r6\n\t"
  184504. #endif
  184505. #ifdef WOLFSSL_KEIL
  184506. "adcs r4, r4, %[r]\n\t"
  184507. #elif defined(__clang__)
  184508. "adcs r4, %[r]\n\t"
  184509. #else
  184510. "adc r4, %[r]\n\t"
  184511. #endif
  184512. "uxth r6, r7\n\t"
  184513. #ifdef WOLFSSL_KEIL
  184514. "muls r5, r6, r5\n\t"
  184515. #elif defined(__clang__)
  184516. "muls r5, r6\n\t"
  184517. #else
  184518. "mul r5, r6\n\t"
  184519. #endif
  184520. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184521. "lsrs r6, r5, #16\n\t"
  184522. #else
  184523. "lsr r6, r5, #16\n\t"
  184524. #endif
  184525. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184526. "lsls r5, r5, #16\n\t"
  184527. #else
  184528. "lsl r5, r5, #16\n\t"
  184529. #endif
  184530. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184531. "adds r2, r2, r5\n\t"
  184532. #else
  184533. "add r2, r2, r5\n\t"
  184534. #endif
  184535. #ifdef WOLFSSL_KEIL
  184536. "adcs r3, r3, r6\n\t"
  184537. #elif defined(__clang__)
  184538. "adcs r3, r6\n\t"
  184539. #else
  184540. "adc r3, r6\n\t"
  184541. #endif
  184542. #ifdef WOLFSSL_KEIL
  184543. "adcs r4, r4, %[r]\n\t"
  184544. #elif defined(__clang__)
  184545. "adcs r4, %[r]\n\t"
  184546. #else
  184547. "adc r4, %[r]\n\t"
  184548. #endif
  184549. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184550. "adds r2, r2, r5\n\t"
  184551. #else
  184552. "add r2, r2, r5\n\t"
  184553. #endif
  184554. #ifdef WOLFSSL_KEIL
  184555. "adcs r3, r3, r6\n\t"
  184556. #elif defined(__clang__)
  184557. "adcs r3, r6\n\t"
  184558. #else
  184559. "adc r3, r6\n\t"
  184560. #endif
  184561. #ifdef WOLFSSL_KEIL
  184562. "adcs r4, r4, %[r]\n\t"
  184563. #elif defined(__clang__)
  184564. "adcs r4, %[r]\n\t"
  184565. #else
  184566. "adc r4, %[r]\n\t"
  184567. #endif
  184568. "# A[15] * A[0]\n\t"
  184569. "mov %[a], r9\n\t"
  184570. "mov r7, r10\n\t"
  184571. "ldr %[a], [%[a], #60]\n\t"
  184572. "uxth r5, %[a]\n\t"
  184573. "uxth r6, r7\n\t"
  184574. #ifdef WOLFSSL_KEIL
  184575. "muls r6, r5, r6\n\t"
  184576. #elif defined(__clang__)
  184577. "muls r6, r5\n\t"
  184578. #else
  184579. "mul r6, r5\n\t"
  184580. #endif
  184581. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184582. "adds r2, r2, r6\n\t"
  184583. #else
  184584. "add r2, r2, r6\n\t"
  184585. #endif
  184586. #ifdef WOLFSSL_KEIL
  184587. "adcs r3, r3, %[r]\n\t"
  184588. #elif defined(__clang__)
  184589. "adcs r3, %[r]\n\t"
  184590. #else
  184591. "adc r3, %[r]\n\t"
  184592. #endif
  184593. #ifdef WOLFSSL_KEIL
  184594. "adcs r4, r4, %[r]\n\t"
  184595. #elif defined(__clang__)
  184596. "adcs r4, %[r]\n\t"
  184597. #else
  184598. "adc r4, %[r]\n\t"
  184599. #endif
  184600. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184601. "adds r2, r2, r6\n\t"
  184602. #else
  184603. "add r2, r2, r6\n\t"
  184604. #endif
  184605. #ifdef WOLFSSL_KEIL
  184606. "adcs r3, r3, %[r]\n\t"
  184607. #elif defined(__clang__)
  184608. "adcs r3, %[r]\n\t"
  184609. #else
  184610. "adc r3, %[r]\n\t"
  184611. #endif
  184612. #ifdef WOLFSSL_KEIL
  184613. "adcs r4, r4, %[r]\n\t"
  184614. #elif defined(__clang__)
  184615. "adcs r4, %[r]\n\t"
  184616. #else
  184617. "adc r4, %[r]\n\t"
  184618. #endif
  184619. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184620. "lsrs r6, r7, #16\n\t"
  184621. #else
  184622. "lsr r6, r7, #16\n\t"
  184623. #endif
  184624. #ifdef WOLFSSL_KEIL
  184625. "muls r5, r6, r5\n\t"
  184626. #elif defined(__clang__)
  184627. "muls r5, r6\n\t"
  184628. #else
  184629. "mul r5, r6\n\t"
  184630. #endif
  184631. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184632. "lsrs r6, r5, #16\n\t"
  184633. #else
  184634. "lsr r6, r5, #16\n\t"
  184635. #endif
  184636. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184637. "lsls r5, r5, #16\n\t"
  184638. #else
  184639. "lsl r5, r5, #16\n\t"
  184640. #endif
  184641. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184642. "adds r2, r2, r5\n\t"
  184643. #else
  184644. "add r2, r2, r5\n\t"
  184645. #endif
  184646. #ifdef WOLFSSL_KEIL
  184647. "adcs r3, r3, r6\n\t"
  184648. #elif defined(__clang__)
  184649. "adcs r3, r6\n\t"
  184650. #else
  184651. "adc r3, r6\n\t"
  184652. #endif
  184653. #ifdef WOLFSSL_KEIL
  184654. "adcs r4, r4, %[r]\n\t"
  184655. #elif defined(__clang__)
  184656. "adcs r4, %[r]\n\t"
  184657. #else
  184658. "adc r4, %[r]\n\t"
  184659. #endif
  184660. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184661. "adds r2, r2, r5\n\t"
  184662. #else
  184663. "add r2, r2, r5\n\t"
  184664. #endif
  184665. #ifdef WOLFSSL_KEIL
  184666. "adcs r3, r3, r6\n\t"
  184667. #elif defined(__clang__)
  184668. "adcs r3, r6\n\t"
  184669. #else
  184670. "adc r3, r6\n\t"
  184671. #endif
  184672. #ifdef WOLFSSL_KEIL
  184673. "adcs r4, r4, %[r]\n\t"
  184674. #elif defined(__clang__)
  184675. "adcs r4, %[r]\n\t"
  184676. #else
  184677. "adc r4, %[r]\n\t"
  184678. #endif
  184679. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184680. "lsrs r5, %[a], #16\n\t"
  184681. #else
  184682. "lsr r5, %[a], #16\n\t"
  184683. #endif
  184684. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184685. "lsrs r6, r7, #16\n\t"
  184686. #else
  184687. "lsr r6, r7, #16\n\t"
  184688. #endif
  184689. #ifdef WOLFSSL_KEIL
  184690. "muls r6, r5, r6\n\t"
  184691. #elif defined(__clang__)
  184692. "muls r6, r5\n\t"
  184693. #else
  184694. "mul r6, r5\n\t"
  184695. #endif
  184696. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184697. "adds r3, r3, r6\n\t"
  184698. #else
  184699. "add r3, r3, r6\n\t"
  184700. #endif
  184701. #ifdef WOLFSSL_KEIL
  184702. "adcs r4, r4, %[r]\n\t"
  184703. #elif defined(__clang__)
  184704. "adcs r4, %[r]\n\t"
  184705. #else
  184706. "adc r4, %[r]\n\t"
  184707. #endif
  184708. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184709. "adds r3, r3, r6\n\t"
  184710. #else
  184711. "add r3, r3, r6\n\t"
  184712. #endif
  184713. #ifdef WOLFSSL_KEIL
  184714. "adcs r4, r4, %[r]\n\t"
  184715. #elif defined(__clang__)
  184716. "adcs r4, %[r]\n\t"
  184717. #else
  184718. "adc r4, %[r]\n\t"
  184719. #endif
  184720. "uxth r6, r7\n\t"
  184721. #ifdef WOLFSSL_KEIL
  184722. "muls r5, r6, r5\n\t"
  184723. #elif defined(__clang__)
  184724. "muls r5, r6\n\t"
  184725. #else
  184726. "mul r5, r6\n\t"
  184727. #endif
  184728. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184729. "lsrs r6, r5, #16\n\t"
  184730. #else
  184731. "lsr r6, r5, #16\n\t"
  184732. #endif
  184733. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184734. "lsls r5, r5, #16\n\t"
  184735. #else
  184736. "lsl r5, r5, #16\n\t"
  184737. #endif
  184738. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184739. "adds r2, r2, r5\n\t"
  184740. #else
  184741. "add r2, r2, r5\n\t"
  184742. #endif
  184743. #ifdef WOLFSSL_KEIL
  184744. "adcs r3, r3, r6\n\t"
  184745. #elif defined(__clang__)
  184746. "adcs r3, r6\n\t"
  184747. #else
  184748. "adc r3, r6\n\t"
  184749. #endif
  184750. #ifdef WOLFSSL_KEIL
  184751. "adcs r4, r4, %[r]\n\t"
  184752. #elif defined(__clang__)
  184753. "adcs r4, %[r]\n\t"
  184754. #else
  184755. "adc r4, %[r]\n\t"
  184756. #endif
  184757. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184758. "adds r2, r2, r5\n\t"
  184759. #else
  184760. "add r2, r2, r5\n\t"
  184761. #endif
  184762. #ifdef WOLFSSL_KEIL
  184763. "adcs r3, r3, r6\n\t"
  184764. #elif defined(__clang__)
  184765. "adcs r3, r6\n\t"
  184766. #else
  184767. "adc r3, r6\n\t"
  184768. #endif
  184769. #ifdef WOLFSSL_KEIL
  184770. "adcs r4, r4, %[r]\n\t"
  184771. #elif defined(__clang__)
  184772. "adcs r4, %[r]\n\t"
  184773. #else
  184774. "adc r4, %[r]\n\t"
  184775. #endif
  184776. "str r2, [sp, #60]\n\t"
  184777. "# A[15] * A[1]\n\t"
  184778. "movs r2, #0\n\t"
  184779. "mov %[a], r9\n\t"
  184780. "mov r7, r11\n\t"
  184781. "ldr %[a], [%[a], #60]\n\t"
  184782. "uxth r5, %[a]\n\t"
  184783. "uxth r6, r7\n\t"
  184784. #ifdef WOLFSSL_KEIL
  184785. "muls r6, r5, r6\n\t"
  184786. #elif defined(__clang__)
  184787. "muls r6, r5\n\t"
  184788. #else
  184789. "mul r6, r5\n\t"
  184790. #endif
  184791. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184792. "adds r3, r3, r6\n\t"
  184793. #else
  184794. "add r3, r3, r6\n\t"
  184795. #endif
  184796. #ifdef WOLFSSL_KEIL
  184797. "adcs r4, r4, %[r]\n\t"
  184798. #elif defined(__clang__)
  184799. "adcs r4, %[r]\n\t"
  184800. #else
  184801. "adc r4, %[r]\n\t"
  184802. #endif
  184803. #ifdef WOLFSSL_KEIL
  184804. "adcs r2, r2, %[r]\n\t"
  184805. #elif defined(__clang__)
  184806. "adcs r2, %[r]\n\t"
  184807. #else
  184808. "adc r2, %[r]\n\t"
  184809. #endif
  184810. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184811. "adds r3, r3, r6\n\t"
  184812. #else
  184813. "add r3, r3, r6\n\t"
  184814. #endif
  184815. #ifdef WOLFSSL_KEIL
  184816. "adcs r4, r4, %[r]\n\t"
  184817. #elif defined(__clang__)
  184818. "adcs r4, %[r]\n\t"
  184819. #else
  184820. "adc r4, %[r]\n\t"
  184821. #endif
  184822. #ifdef WOLFSSL_KEIL
  184823. "adcs r2, r2, %[r]\n\t"
  184824. #elif defined(__clang__)
  184825. "adcs r2, %[r]\n\t"
  184826. #else
  184827. "adc r2, %[r]\n\t"
  184828. #endif
  184829. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184830. "lsrs r6, r7, #16\n\t"
  184831. #else
  184832. "lsr r6, r7, #16\n\t"
  184833. #endif
  184834. #ifdef WOLFSSL_KEIL
  184835. "muls r5, r6, r5\n\t"
  184836. #elif defined(__clang__)
  184837. "muls r5, r6\n\t"
  184838. #else
  184839. "mul r5, r6\n\t"
  184840. #endif
  184841. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184842. "lsrs r6, r5, #16\n\t"
  184843. #else
  184844. "lsr r6, r5, #16\n\t"
  184845. #endif
  184846. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184847. "lsls r5, r5, #16\n\t"
  184848. #else
  184849. "lsl r5, r5, #16\n\t"
  184850. #endif
  184851. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184852. "adds r3, r3, r5\n\t"
  184853. #else
  184854. "add r3, r3, r5\n\t"
  184855. #endif
  184856. #ifdef WOLFSSL_KEIL
  184857. "adcs r4, r4, r6\n\t"
  184858. #elif defined(__clang__)
  184859. "adcs r4, r6\n\t"
  184860. #else
  184861. "adc r4, r6\n\t"
  184862. #endif
  184863. #ifdef WOLFSSL_KEIL
  184864. "adcs r2, r2, %[r]\n\t"
  184865. #elif defined(__clang__)
  184866. "adcs r2, %[r]\n\t"
  184867. #else
  184868. "adc r2, %[r]\n\t"
  184869. #endif
  184870. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184871. "adds r3, r3, r5\n\t"
  184872. #else
  184873. "add r3, r3, r5\n\t"
  184874. #endif
  184875. #ifdef WOLFSSL_KEIL
  184876. "adcs r4, r4, r6\n\t"
  184877. #elif defined(__clang__)
  184878. "adcs r4, r6\n\t"
  184879. #else
  184880. "adc r4, r6\n\t"
  184881. #endif
  184882. #ifdef WOLFSSL_KEIL
  184883. "adcs r2, r2, %[r]\n\t"
  184884. #elif defined(__clang__)
  184885. "adcs r2, %[r]\n\t"
  184886. #else
  184887. "adc r2, %[r]\n\t"
  184888. #endif
  184889. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184890. "lsrs r5, %[a], #16\n\t"
  184891. #else
  184892. "lsr r5, %[a], #16\n\t"
  184893. #endif
  184894. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184895. "lsrs r6, r7, #16\n\t"
  184896. #else
  184897. "lsr r6, r7, #16\n\t"
  184898. #endif
  184899. #ifdef WOLFSSL_KEIL
  184900. "muls r6, r5, r6\n\t"
  184901. #elif defined(__clang__)
  184902. "muls r6, r5\n\t"
  184903. #else
  184904. "mul r6, r5\n\t"
  184905. #endif
  184906. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184907. "adds r4, r4, r6\n\t"
  184908. #else
  184909. "add r4, r4, r6\n\t"
  184910. #endif
  184911. #ifdef WOLFSSL_KEIL
  184912. "adcs r2, r2, %[r]\n\t"
  184913. #elif defined(__clang__)
  184914. "adcs r2, %[r]\n\t"
  184915. #else
  184916. "adc r2, %[r]\n\t"
  184917. #endif
  184918. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184919. "adds r4, r4, r6\n\t"
  184920. #else
  184921. "add r4, r4, r6\n\t"
  184922. #endif
  184923. #ifdef WOLFSSL_KEIL
  184924. "adcs r2, r2, %[r]\n\t"
  184925. #elif defined(__clang__)
  184926. "adcs r2, %[r]\n\t"
  184927. #else
  184928. "adc r2, %[r]\n\t"
  184929. #endif
  184930. "uxth r6, r7\n\t"
  184931. #ifdef WOLFSSL_KEIL
  184932. "muls r5, r6, r5\n\t"
  184933. #elif defined(__clang__)
  184934. "muls r5, r6\n\t"
  184935. #else
  184936. "mul r5, r6\n\t"
  184937. #endif
  184938. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184939. "lsrs r6, r5, #16\n\t"
  184940. #else
  184941. "lsr r6, r5, #16\n\t"
  184942. #endif
  184943. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184944. "lsls r5, r5, #16\n\t"
  184945. #else
  184946. "lsl r5, r5, #16\n\t"
  184947. #endif
  184948. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184949. "adds r3, r3, r5\n\t"
  184950. #else
  184951. "add r3, r3, r5\n\t"
  184952. #endif
  184953. #ifdef WOLFSSL_KEIL
  184954. "adcs r4, r4, r6\n\t"
  184955. #elif defined(__clang__)
  184956. "adcs r4, r6\n\t"
  184957. #else
  184958. "adc r4, r6\n\t"
  184959. #endif
  184960. #ifdef WOLFSSL_KEIL
  184961. "adcs r2, r2, %[r]\n\t"
  184962. #elif defined(__clang__)
  184963. "adcs r2, %[r]\n\t"
  184964. #else
  184965. "adc r2, %[r]\n\t"
  184966. #endif
  184967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184968. "adds r3, r3, r5\n\t"
  184969. #else
  184970. "add r3, r3, r5\n\t"
  184971. #endif
  184972. #ifdef WOLFSSL_KEIL
  184973. "adcs r4, r4, r6\n\t"
  184974. #elif defined(__clang__)
  184975. "adcs r4, r6\n\t"
  184976. #else
  184977. "adc r4, r6\n\t"
  184978. #endif
  184979. #ifdef WOLFSSL_KEIL
  184980. "adcs r2, r2, %[r]\n\t"
  184981. #elif defined(__clang__)
  184982. "adcs r2, %[r]\n\t"
  184983. #else
  184984. "adc r2, %[r]\n\t"
  184985. #endif
  184986. "# A[14] * A[2]\n\t"
  184987. "mov %[a], r9\n\t"
  184988. "mov r7, r12\n\t"
  184989. "ldr %[a], [%[a], #56]\n\t"
  184990. "uxth r5, %[a]\n\t"
  184991. "uxth r6, r7\n\t"
  184992. #ifdef WOLFSSL_KEIL
  184993. "muls r6, r5, r6\n\t"
  184994. #elif defined(__clang__)
  184995. "muls r6, r5\n\t"
  184996. #else
  184997. "mul r6, r5\n\t"
  184998. #endif
  184999. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185000. "adds r3, r3, r6\n\t"
  185001. #else
  185002. "add r3, r3, r6\n\t"
  185003. #endif
  185004. #ifdef WOLFSSL_KEIL
  185005. "adcs r4, r4, %[r]\n\t"
  185006. #elif defined(__clang__)
  185007. "adcs r4, %[r]\n\t"
  185008. #else
  185009. "adc r4, %[r]\n\t"
  185010. #endif
  185011. #ifdef WOLFSSL_KEIL
  185012. "adcs r2, r2, %[r]\n\t"
  185013. #elif defined(__clang__)
  185014. "adcs r2, %[r]\n\t"
  185015. #else
  185016. "adc r2, %[r]\n\t"
  185017. #endif
  185018. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185019. "adds r3, r3, r6\n\t"
  185020. #else
  185021. "add r3, r3, r6\n\t"
  185022. #endif
  185023. #ifdef WOLFSSL_KEIL
  185024. "adcs r4, r4, %[r]\n\t"
  185025. #elif defined(__clang__)
  185026. "adcs r4, %[r]\n\t"
  185027. #else
  185028. "adc r4, %[r]\n\t"
  185029. #endif
  185030. #ifdef WOLFSSL_KEIL
  185031. "adcs r2, r2, %[r]\n\t"
  185032. #elif defined(__clang__)
  185033. "adcs r2, %[r]\n\t"
  185034. #else
  185035. "adc r2, %[r]\n\t"
  185036. #endif
  185037. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185038. "lsrs r6, r7, #16\n\t"
  185039. #else
  185040. "lsr r6, r7, #16\n\t"
  185041. #endif
  185042. #ifdef WOLFSSL_KEIL
  185043. "muls r5, r6, r5\n\t"
  185044. #elif defined(__clang__)
  185045. "muls r5, r6\n\t"
  185046. #else
  185047. "mul r5, r6\n\t"
  185048. #endif
  185049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185050. "lsrs r6, r5, #16\n\t"
  185051. #else
  185052. "lsr r6, r5, #16\n\t"
  185053. #endif
  185054. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185055. "lsls r5, r5, #16\n\t"
  185056. #else
  185057. "lsl r5, r5, #16\n\t"
  185058. #endif
  185059. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185060. "adds r3, r3, r5\n\t"
  185061. #else
  185062. "add r3, r3, r5\n\t"
  185063. #endif
  185064. #ifdef WOLFSSL_KEIL
  185065. "adcs r4, r4, r6\n\t"
  185066. #elif defined(__clang__)
  185067. "adcs r4, r6\n\t"
  185068. #else
  185069. "adc r4, r6\n\t"
  185070. #endif
  185071. #ifdef WOLFSSL_KEIL
  185072. "adcs r2, r2, %[r]\n\t"
  185073. #elif defined(__clang__)
  185074. "adcs r2, %[r]\n\t"
  185075. #else
  185076. "adc r2, %[r]\n\t"
  185077. #endif
  185078. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185079. "adds r3, r3, r5\n\t"
  185080. #else
  185081. "add r3, r3, r5\n\t"
  185082. #endif
  185083. #ifdef WOLFSSL_KEIL
  185084. "adcs r4, r4, r6\n\t"
  185085. #elif defined(__clang__)
  185086. "adcs r4, r6\n\t"
  185087. #else
  185088. "adc r4, r6\n\t"
  185089. #endif
  185090. #ifdef WOLFSSL_KEIL
  185091. "adcs r2, r2, %[r]\n\t"
  185092. #elif defined(__clang__)
  185093. "adcs r2, %[r]\n\t"
  185094. #else
  185095. "adc r2, %[r]\n\t"
  185096. #endif
  185097. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185098. "lsrs r5, %[a], #16\n\t"
  185099. #else
  185100. "lsr r5, %[a], #16\n\t"
  185101. #endif
  185102. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185103. "lsrs r6, r7, #16\n\t"
  185104. #else
  185105. "lsr r6, r7, #16\n\t"
  185106. #endif
  185107. #ifdef WOLFSSL_KEIL
  185108. "muls r6, r5, r6\n\t"
  185109. #elif defined(__clang__)
  185110. "muls r6, r5\n\t"
  185111. #else
  185112. "mul r6, r5\n\t"
  185113. #endif
  185114. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185115. "adds r4, r4, r6\n\t"
  185116. #else
  185117. "add r4, r4, r6\n\t"
  185118. #endif
  185119. #ifdef WOLFSSL_KEIL
  185120. "adcs r2, r2, %[r]\n\t"
  185121. #elif defined(__clang__)
  185122. "adcs r2, %[r]\n\t"
  185123. #else
  185124. "adc r2, %[r]\n\t"
  185125. #endif
  185126. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185127. "adds r4, r4, r6\n\t"
  185128. #else
  185129. "add r4, r4, r6\n\t"
  185130. #endif
  185131. #ifdef WOLFSSL_KEIL
  185132. "adcs r2, r2, %[r]\n\t"
  185133. #elif defined(__clang__)
  185134. "adcs r2, %[r]\n\t"
  185135. #else
  185136. "adc r2, %[r]\n\t"
  185137. #endif
  185138. "uxth r6, r7\n\t"
  185139. #ifdef WOLFSSL_KEIL
  185140. "muls r5, r6, r5\n\t"
  185141. #elif defined(__clang__)
  185142. "muls r5, r6\n\t"
  185143. #else
  185144. "mul r5, r6\n\t"
  185145. #endif
  185146. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185147. "lsrs r6, r5, #16\n\t"
  185148. #else
  185149. "lsr r6, r5, #16\n\t"
  185150. #endif
  185151. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185152. "lsls r5, r5, #16\n\t"
  185153. #else
  185154. "lsl r5, r5, #16\n\t"
  185155. #endif
  185156. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185157. "adds r3, r3, r5\n\t"
  185158. #else
  185159. "add r3, r3, r5\n\t"
  185160. #endif
  185161. #ifdef WOLFSSL_KEIL
  185162. "adcs r4, r4, r6\n\t"
  185163. #elif defined(__clang__)
  185164. "adcs r4, r6\n\t"
  185165. #else
  185166. "adc r4, r6\n\t"
  185167. #endif
  185168. #ifdef WOLFSSL_KEIL
  185169. "adcs r2, r2, %[r]\n\t"
  185170. #elif defined(__clang__)
  185171. "adcs r2, %[r]\n\t"
  185172. #else
  185173. "adc r2, %[r]\n\t"
  185174. #endif
  185175. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185176. "adds r3, r3, r5\n\t"
  185177. #else
  185178. "add r3, r3, r5\n\t"
  185179. #endif
  185180. #ifdef WOLFSSL_KEIL
  185181. "adcs r4, r4, r6\n\t"
  185182. #elif defined(__clang__)
  185183. "adcs r4, r6\n\t"
  185184. #else
  185185. "adc r4, r6\n\t"
  185186. #endif
  185187. #ifdef WOLFSSL_KEIL
  185188. "adcs r2, r2, %[r]\n\t"
  185189. #elif defined(__clang__)
  185190. "adcs r2, %[r]\n\t"
  185191. #else
  185192. "adc r2, %[r]\n\t"
  185193. #endif
  185194. "# A[13] * A[3]\n\t"
  185195. "mov %[a], r9\n\t"
  185196. "mov r7, lr\n\t"
  185197. "ldr %[a], [%[a], #52]\n\t"
  185198. "uxth r5, %[a]\n\t"
  185199. "uxth r6, r7\n\t"
  185200. #ifdef WOLFSSL_KEIL
  185201. "muls r6, r5, r6\n\t"
  185202. #elif defined(__clang__)
  185203. "muls r6, r5\n\t"
  185204. #else
  185205. "mul r6, r5\n\t"
  185206. #endif
  185207. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185208. "adds r3, r3, r6\n\t"
  185209. #else
  185210. "add r3, r3, r6\n\t"
  185211. #endif
  185212. #ifdef WOLFSSL_KEIL
  185213. "adcs r4, r4, %[r]\n\t"
  185214. #elif defined(__clang__)
  185215. "adcs r4, %[r]\n\t"
  185216. #else
  185217. "adc r4, %[r]\n\t"
  185218. #endif
  185219. #ifdef WOLFSSL_KEIL
  185220. "adcs r2, r2, %[r]\n\t"
  185221. #elif defined(__clang__)
  185222. "adcs r2, %[r]\n\t"
  185223. #else
  185224. "adc r2, %[r]\n\t"
  185225. #endif
  185226. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185227. "adds r3, r3, r6\n\t"
  185228. #else
  185229. "add r3, r3, r6\n\t"
  185230. #endif
  185231. #ifdef WOLFSSL_KEIL
  185232. "adcs r4, r4, %[r]\n\t"
  185233. #elif defined(__clang__)
  185234. "adcs r4, %[r]\n\t"
  185235. #else
  185236. "adc r4, %[r]\n\t"
  185237. #endif
  185238. #ifdef WOLFSSL_KEIL
  185239. "adcs r2, r2, %[r]\n\t"
  185240. #elif defined(__clang__)
  185241. "adcs r2, %[r]\n\t"
  185242. #else
  185243. "adc r2, %[r]\n\t"
  185244. #endif
  185245. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185246. "lsrs r6, r7, #16\n\t"
  185247. #else
  185248. "lsr r6, r7, #16\n\t"
  185249. #endif
  185250. #ifdef WOLFSSL_KEIL
  185251. "muls r5, r6, r5\n\t"
  185252. #elif defined(__clang__)
  185253. "muls r5, r6\n\t"
  185254. #else
  185255. "mul r5, r6\n\t"
  185256. #endif
  185257. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185258. "lsrs r6, r5, #16\n\t"
  185259. #else
  185260. "lsr r6, r5, #16\n\t"
  185261. #endif
  185262. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185263. "lsls r5, r5, #16\n\t"
  185264. #else
  185265. "lsl r5, r5, #16\n\t"
  185266. #endif
  185267. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185268. "adds r3, r3, r5\n\t"
  185269. #else
  185270. "add r3, r3, r5\n\t"
  185271. #endif
  185272. #ifdef WOLFSSL_KEIL
  185273. "adcs r4, r4, r6\n\t"
  185274. #elif defined(__clang__)
  185275. "adcs r4, r6\n\t"
  185276. #else
  185277. "adc r4, r6\n\t"
  185278. #endif
  185279. #ifdef WOLFSSL_KEIL
  185280. "adcs r2, r2, %[r]\n\t"
  185281. #elif defined(__clang__)
  185282. "adcs r2, %[r]\n\t"
  185283. #else
  185284. "adc r2, %[r]\n\t"
  185285. #endif
  185286. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185287. "adds r3, r3, r5\n\t"
  185288. #else
  185289. "add r3, r3, r5\n\t"
  185290. #endif
  185291. #ifdef WOLFSSL_KEIL
  185292. "adcs r4, r4, r6\n\t"
  185293. #elif defined(__clang__)
  185294. "adcs r4, r6\n\t"
  185295. #else
  185296. "adc r4, r6\n\t"
  185297. #endif
  185298. #ifdef WOLFSSL_KEIL
  185299. "adcs r2, r2, %[r]\n\t"
  185300. #elif defined(__clang__)
  185301. "adcs r2, %[r]\n\t"
  185302. #else
  185303. "adc r2, %[r]\n\t"
  185304. #endif
  185305. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185306. "lsrs r5, %[a], #16\n\t"
  185307. #else
  185308. "lsr r5, %[a], #16\n\t"
  185309. #endif
  185310. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185311. "lsrs r6, r7, #16\n\t"
  185312. #else
  185313. "lsr r6, r7, #16\n\t"
  185314. #endif
  185315. #ifdef WOLFSSL_KEIL
  185316. "muls r6, r5, r6\n\t"
  185317. #elif defined(__clang__)
  185318. "muls r6, r5\n\t"
  185319. #else
  185320. "mul r6, r5\n\t"
  185321. #endif
  185322. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185323. "adds r4, r4, r6\n\t"
  185324. #else
  185325. "add r4, r4, r6\n\t"
  185326. #endif
  185327. #ifdef WOLFSSL_KEIL
  185328. "adcs r2, r2, %[r]\n\t"
  185329. #elif defined(__clang__)
  185330. "adcs r2, %[r]\n\t"
  185331. #else
  185332. "adc r2, %[r]\n\t"
  185333. #endif
  185334. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185335. "adds r4, r4, r6\n\t"
  185336. #else
  185337. "add r4, r4, r6\n\t"
  185338. #endif
  185339. #ifdef WOLFSSL_KEIL
  185340. "adcs r2, r2, %[r]\n\t"
  185341. #elif defined(__clang__)
  185342. "adcs r2, %[r]\n\t"
  185343. #else
  185344. "adc r2, %[r]\n\t"
  185345. #endif
  185346. "uxth r6, r7\n\t"
  185347. #ifdef WOLFSSL_KEIL
  185348. "muls r5, r6, r5\n\t"
  185349. #elif defined(__clang__)
  185350. "muls r5, r6\n\t"
  185351. #else
  185352. "mul r5, r6\n\t"
  185353. #endif
  185354. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185355. "lsrs r6, r5, #16\n\t"
  185356. #else
  185357. "lsr r6, r5, #16\n\t"
  185358. #endif
  185359. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185360. "lsls r5, r5, #16\n\t"
  185361. #else
  185362. "lsl r5, r5, #16\n\t"
  185363. #endif
  185364. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185365. "adds r3, r3, r5\n\t"
  185366. #else
  185367. "add r3, r3, r5\n\t"
  185368. #endif
  185369. #ifdef WOLFSSL_KEIL
  185370. "adcs r4, r4, r6\n\t"
  185371. #elif defined(__clang__)
  185372. "adcs r4, r6\n\t"
  185373. #else
  185374. "adc r4, r6\n\t"
  185375. #endif
  185376. #ifdef WOLFSSL_KEIL
  185377. "adcs r2, r2, %[r]\n\t"
  185378. #elif defined(__clang__)
  185379. "adcs r2, %[r]\n\t"
  185380. #else
  185381. "adc r2, %[r]\n\t"
  185382. #endif
  185383. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185384. "adds r3, r3, r5\n\t"
  185385. #else
  185386. "add r3, r3, r5\n\t"
  185387. #endif
  185388. #ifdef WOLFSSL_KEIL
  185389. "adcs r4, r4, r6\n\t"
  185390. #elif defined(__clang__)
  185391. "adcs r4, r6\n\t"
  185392. #else
  185393. "adc r4, r6\n\t"
  185394. #endif
  185395. #ifdef WOLFSSL_KEIL
  185396. "adcs r2, r2, %[r]\n\t"
  185397. #elif defined(__clang__)
  185398. "adcs r2, %[r]\n\t"
  185399. #else
  185400. "adc r2, %[r]\n\t"
  185401. #endif
  185402. "# A[12] * A[4]\n\t"
  185403. "mov %[a], r9\n\t"
  185404. "ldr r7, [%[a], #16]\n\t"
  185405. "ldr %[a], [%[a], #48]\n\t"
  185406. "uxth r5, %[a]\n\t"
  185407. "uxth r6, r7\n\t"
  185408. #ifdef WOLFSSL_KEIL
  185409. "muls r6, r5, r6\n\t"
  185410. #elif defined(__clang__)
  185411. "muls r6, r5\n\t"
  185412. #else
  185413. "mul r6, r5\n\t"
  185414. #endif
  185415. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185416. "adds r3, r3, r6\n\t"
  185417. #else
  185418. "add r3, r3, r6\n\t"
  185419. #endif
  185420. #ifdef WOLFSSL_KEIL
  185421. "adcs r4, r4, %[r]\n\t"
  185422. #elif defined(__clang__)
  185423. "adcs r4, %[r]\n\t"
  185424. #else
  185425. "adc r4, %[r]\n\t"
  185426. #endif
  185427. #ifdef WOLFSSL_KEIL
  185428. "adcs r2, r2, %[r]\n\t"
  185429. #elif defined(__clang__)
  185430. "adcs r2, %[r]\n\t"
  185431. #else
  185432. "adc r2, %[r]\n\t"
  185433. #endif
  185434. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185435. "adds r3, r3, r6\n\t"
  185436. #else
  185437. "add r3, r3, r6\n\t"
  185438. #endif
  185439. #ifdef WOLFSSL_KEIL
  185440. "adcs r4, r4, %[r]\n\t"
  185441. #elif defined(__clang__)
  185442. "adcs r4, %[r]\n\t"
  185443. #else
  185444. "adc r4, %[r]\n\t"
  185445. #endif
  185446. #ifdef WOLFSSL_KEIL
  185447. "adcs r2, r2, %[r]\n\t"
  185448. #elif defined(__clang__)
  185449. "adcs r2, %[r]\n\t"
  185450. #else
  185451. "adc r2, %[r]\n\t"
  185452. #endif
  185453. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185454. "lsrs r6, r7, #16\n\t"
  185455. #else
  185456. "lsr r6, r7, #16\n\t"
  185457. #endif
  185458. #ifdef WOLFSSL_KEIL
  185459. "muls r5, r6, r5\n\t"
  185460. #elif defined(__clang__)
  185461. "muls r5, r6\n\t"
  185462. #else
  185463. "mul r5, r6\n\t"
  185464. #endif
  185465. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185466. "lsrs r6, r5, #16\n\t"
  185467. #else
  185468. "lsr r6, r5, #16\n\t"
  185469. #endif
  185470. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185471. "lsls r5, r5, #16\n\t"
  185472. #else
  185473. "lsl r5, r5, #16\n\t"
  185474. #endif
  185475. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185476. "adds r3, r3, r5\n\t"
  185477. #else
  185478. "add r3, r3, r5\n\t"
  185479. #endif
  185480. #ifdef WOLFSSL_KEIL
  185481. "adcs r4, r4, r6\n\t"
  185482. #elif defined(__clang__)
  185483. "adcs r4, r6\n\t"
  185484. #else
  185485. "adc r4, r6\n\t"
  185486. #endif
  185487. #ifdef WOLFSSL_KEIL
  185488. "adcs r2, r2, %[r]\n\t"
  185489. #elif defined(__clang__)
  185490. "adcs r2, %[r]\n\t"
  185491. #else
  185492. "adc r2, %[r]\n\t"
  185493. #endif
  185494. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185495. "adds r3, r3, r5\n\t"
  185496. #else
  185497. "add r3, r3, r5\n\t"
  185498. #endif
  185499. #ifdef WOLFSSL_KEIL
  185500. "adcs r4, r4, r6\n\t"
  185501. #elif defined(__clang__)
  185502. "adcs r4, r6\n\t"
  185503. #else
  185504. "adc r4, r6\n\t"
  185505. #endif
  185506. #ifdef WOLFSSL_KEIL
  185507. "adcs r2, r2, %[r]\n\t"
  185508. #elif defined(__clang__)
  185509. "adcs r2, %[r]\n\t"
  185510. #else
  185511. "adc r2, %[r]\n\t"
  185512. #endif
  185513. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185514. "lsrs r5, %[a], #16\n\t"
  185515. #else
  185516. "lsr r5, %[a], #16\n\t"
  185517. #endif
  185518. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185519. "lsrs r6, r7, #16\n\t"
  185520. #else
  185521. "lsr r6, r7, #16\n\t"
  185522. #endif
  185523. #ifdef WOLFSSL_KEIL
  185524. "muls r6, r5, r6\n\t"
  185525. #elif defined(__clang__)
  185526. "muls r6, r5\n\t"
  185527. #else
  185528. "mul r6, r5\n\t"
  185529. #endif
  185530. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185531. "adds r4, r4, r6\n\t"
  185532. #else
  185533. "add r4, r4, r6\n\t"
  185534. #endif
  185535. #ifdef WOLFSSL_KEIL
  185536. "adcs r2, r2, %[r]\n\t"
  185537. #elif defined(__clang__)
  185538. "adcs r2, %[r]\n\t"
  185539. #else
  185540. "adc r2, %[r]\n\t"
  185541. #endif
  185542. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185543. "adds r4, r4, r6\n\t"
  185544. #else
  185545. "add r4, r4, r6\n\t"
  185546. #endif
  185547. #ifdef WOLFSSL_KEIL
  185548. "adcs r2, r2, %[r]\n\t"
  185549. #elif defined(__clang__)
  185550. "adcs r2, %[r]\n\t"
  185551. #else
  185552. "adc r2, %[r]\n\t"
  185553. #endif
  185554. "uxth r6, r7\n\t"
  185555. #ifdef WOLFSSL_KEIL
  185556. "muls r5, r6, r5\n\t"
  185557. #elif defined(__clang__)
  185558. "muls r5, r6\n\t"
  185559. #else
  185560. "mul r5, r6\n\t"
  185561. #endif
  185562. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185563. "lsrs r6, r5, #16\n\t"
  185564. #else
  185565. "lsr r6, r5, #16\n\t"
  185566. #endif
  185567. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185568. "lsls r5, r5, #16\n\t"
  185569. #else
  185570. "lsl r5, r5, #16\n\t"
  185571. #endif
  185572. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185573. "adds r3, r3, r5\n\t"
  185574. #else
  185575. "add r3, r3, r5\n\t"
  185576. #endif
  185577. #ifdef WOLFSSL_KEIL
  185578. "adcs r4, r4, r6\n\t"
  185579. #elif defined(__clang__)
  185580. "adcs r4, r6\n\t"
  185581. #else
  185582. "adc r4, r6\n\t"
  185583. #endif
  185584. #ifdef WOLFSSL_KEIL
  185585. "adcs r2, r2, %[r]\n\t"
  185586. #elif defined(__clang__)
  185587. "adcs r2, %[r]\n\t"
  185588. #else
  185589. "adc r2, %[r]\n\t"
  185590. #endif
  185591. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185592. "adds r3, r3, r5\n\t"
  185593. #else
  185594. "add r3, r3, r5\n\t"
  185595. #endif
  185596. #ifdef WOLFSSL_KEIL
  185597. "adcs r4, r4, r6\n\t"
  185598. #elif defined(__clang__)
  185599. "adcs r4, r6\n\t"
  185600. #else
  185601. "adc r4, r6\n\t"
  185602. #endif
  185603. #ifdef WOLFSSL_KEIL
  185604. "adcs r2, r2, %[r]\n\t"
  185605. #elif defined(__clang__)
  185606. "adcs r2, %[r]\n\t"
  185607. #else
  185608. "adc r2, %[r]\n\t"
  185609. #endif
  185610. "# A[11] * A[5]\n\t"
  185611. "mov %[a], r9\n\t"
  185612. "ldr r7, [%[a], #20]\n\t"
  185613. "ldr %[a], [%[a], #44]\n\t"
  185614. "uxth r5, %[a]\n\t"
  185615. "uxth r6, r7\n\t"
  185616. #ifdef WOLFSSL_KEIL
  185617. "muls r6, r5, r6\n\t"
  185618. #elif defined(__clang__)
  185619. "muls r6, r5\n\t"
  185620. #else
  185621. "mul r6, r5\n\t"
  185622. #endif
  185623. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185624. "adds r3, r3, r6\n\t"
  185625. #else
  185626. "add r3, r3, r6\n\t"
  185627. #endif
  185628. #ifdef WOLFSSL_KEIL
  185629. "adcs r4, r4, %[r]\n\t"
  185630. #elif defined(__clang__)
  185631. "adcs r4, %[r]\n\t"
  185632. #else
  185633. "adc r4, %[r]\n\t"
  185634. #endif
  185635. #ifdef WOLFSSL_KEIL
  185636. "adcs r2, r2, %[r]\n\t"
  185637. #elif defined(__clang__)
  185638. "adcs r2, %[r]\n\t"
  185639. #else
  185640. "adc r2, %[r]\n\t"
  185641. #endif
  185642. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185643. "adds r3, r3, r6\n\t"
  185644. #else
  185645. "add r3, r3, r6\n\t"
  185646. #endif
  185647. #ifdef WOLFSSL_KEIL
  185648. "adcs r4, r4, %[r]\n\t"
  185649. #elif defined(__clang__)
  185650. "adcs r4, %[r]\n\t"
  185651. #else
  185652. "adc r4, %[r]\n\t"
  185653. #endif
  185654. #ifdef WOLFSSL_KEIL
  185655. "adcs r2, r2, %[r]\n\t"
  185656. #elif defined(__clang__)
  185657. "adcs r2, %[r]\n\t"
  185658. #else
  185659. "adc r2, %[r]\n\t"
  185660. #endif
  185661. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185662. "lsrs r6, r7, #16\n\t"
  185663. #else
  185664. "lsr r6, r7, #16\n\t"
  185665. #endif
  185666. #ifdef WOLFSSL_KEIL
  185667. "muls r5, r6, r5\n\t"
  185668. #elif defined(__clang__)
  185669. "muls r5, r6\n\t"
  185670. #else
  185671. "mul r5, r6\n\t"
  185672. #endif
  185673. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185674. "lsrs r6, r5, #16\n\t"
  185675. #else
  185676. "lsr r6, r5, #16\n\t"
  185677. #endif
  185678. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185679. "lsls r5, r5, #16\n\t"
  185680. #else
  185681. "lsl r5, r5, #16\n\t"
  185682. #endif
  185683. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185684. "adds r3, r3, r5\n\t"
  185685. #else
  185686. "add r3, r3, r5\n\t"
  185687. #endif
  185688. #ifdef WOLFSSL_KEIL
  185689. "adcs r4, r4, r6\n\t"
  185690. #elif defined(__clang__)
  185691. "adcs r4, r6\n\t"
  185692. #else
  185693. "adc r4, r6\n\t"
  185694. #endif
  185695. #ifdef WOLFSSL_KEIL
  185696. "adcs r2, r2, %[r]\n\t"
  185697. #elif defined(__clang__)
  185698. "adcs r2, %[r]\n\t"
  185699. #else
  185700. "adc r2, %[r]\n\t"
  185701. #endif
  185702. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185703. "adds r3, r3, r5\n\t"
  185704. #else
  185705. "add r3, r3, r5\n\t"
  185706. #endif
  185707. #ifdef WOLFSSL_KEIL
  185708. "adcs r4, r4, r6\n\t"
  185709. #elif defined(__clang__)
  185710. "adcs r4, r6\n\t"
  185711. #else
  185712. "adc r4, r6\n\t"
  185713. #endif
  185714. #ifdef WOLFSSL_KEIL
  185715. "adcs r2, r2, %[r]\n\t"
  185716. #elif defined(__clang__)
  185717. "adcs r2, %[r]\n\t"
  185718. #else
  185719. "adc r2, %[r]\n\t"
  185720. #endif
  185721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185722. "lsrs r5, %[a], #16\n\t"
  185723. #else
  185724. "lsr r5, %[a], #16\n\t"
  185725. #endif
  185726. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185727. "lsrs r6, r7, #16\n\t"
  185728. #else
  185729. "lsr r6, r7, #16\n\t"
  185730. #endif
  185731. #ifdef WOLFSSL_KEIL
  185732. "muls r6, r5, r6\n\t"
  185733. #elif defined(__clang__)
  185734. "muls r6, r5\n\t"
  185735. #else
  185736. "mul r6, r5\n\t"
  185737. #endif
  185738. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185739. "adds r4, r4, r6\n\t"
  185740. #else
  185741. "add r4, r4, r6\n\t"
  185742. #endif
  185743. #ifdef WOLFSSL_KEIL
  185744. "adcs r2, r2, %[r]\n\t"
  185745. #elif defined(__clang__)
  185746. "adcs r2, %[r]\n\t"
  185747. #else
  185748. "adc r2, %[r]\n\t"
  185749. #endif
  185750. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185751. "adds r4, r4, r6\n\t"
  185752. #else
  185753. "add r4, r4, r6\n\t"
  185754. #endif
  185755. #ifdef WOLFSSL_KEIL
  185756. "adcs r2, r2, %[r]\n\t"
  185757. #elif defined(__clang__)
  185758. "adcs r2, %[r]\n\t"
  185759. #else
  185760. "adc r2, %[r]\n\t"
  185761. #endif
  185762. "uxth r6, r7\n\t"
  185763. #ifdef WOLFSSL_KEIL
  185764. "muls r5, r6, r5\n\t"
  185765. #elif defined(__clang__)
  185766. "muls r5, r6\n\t"
  185767. #else
  185768. "mul r5, r6\n\t"
  185769. #endif
  185770. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185771. "lsrs r6, r5, #16\n\t"
  185772. #else
  185773. "lsr r6, r5, #16\n\t"
  185774. #endif
  185775. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185776. "lsls r5, r5, #16\n\t"
  185777. #else
  185778. "lsl r5, r5, #16\n\t"
  185779. #endif
  185780. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185781. "adds r3, r3, r5\n\t"
  185782. #else
  185783. "add r3, r3, r5\n\t"
  185784. #endif
  185785. #ifdef WOLFSSL_KEIL
  185786. "adcs r4, r4, r6\n\t"
  185787. #elif defined(__clang__)
  185788. "adcs r4, r6\n\t"
  185789. #else
  185790. "adc r4, r6\n\t"
  185791. #endif
  185792. #ifdef WOLFSSL_KEIL
  185793. "adcs r2, r2, %[r]\n\t"
  185794. #elif defined(__clang__)
  185795. "adcs r2, %[r]\n\t"
  185796. #else
  185797. "adc r2, %[r]\n\t"
  185798. #endif
  185799. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185800. "adds r3, r3, r5\n\t"
  185801. #else
  185802. "add r3, r3, r5\n\t"
  185803. #endif
  185804. #ifdef WOLFSSL_KEIL
  185805. "adcs r4, r4, r6\n\t"
  185806. #elif defined(__clang__)
  185807. "adcs r4, r6\n\t"
  185808. #else
  185809. "adc r4, r6\n\t"
  185810. #endif
  185811. #ifdef WOLFSSL_KEIL
  185812. "adcs r2, r2, %[r]\n\t"
  185813. #elif defined(__clang__)
  185814. "adcs r2, %[r]\n\t"
  185815. #else
  185816. "adc r2, %[r]\n\t"
  185817. #endif
  185818. "# A[10] * A[6]\n\t"
  185819. "mov %[a], r9\n\t"
  185820. "ldr r7, [%[a], #24]\n\t"
  185821. "ldr %[a], [%[a], #40]\n\t"
  185822. "uxth r5, %[a]\n\t"
  185823. "uxth r6, r7\n\t"
  185824. #ifdef WOLFSSL_KEIL
  185825. "muls r6, r5, r6\n\t"
  185826. #elif defined(__clang__)
  185827. "muls r6, r5\n\t"
  185828. #else
  185829. "mul r6, r5\n\t"
  185830. #endif
  185831. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185832. "adds r3, r3, r6\n\t"
  185833. #else
  185834. "add r3, r3, r6\n\t"
  185835. #endif
  185836. #ifdef WOLFSSL_KEIL
  185837. "adcs r4, r4, %[r]\n\t"
  185838. #elif defined(__clang__)
  185839. "adcs r4, %[r]\n\t"
  185840. #else
  185841. "adc r4, %[r]\n\t"
  185842. #endif
  185843. #ifdef WOLFSSL_KEIL
  185844. "adcs r2, r2, %[r]\n\t"
  185845. #elif defined(__clang__)
  185846. "adcs r2, %[r]\n\t"
  185847. #else
  185848. "adc r2, %[r]\n\t"
  185849. #endif
  185850. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185851. "adds r3, r3, r6\n\t"
  185852. #else
  185853. "add r3, r3, r6\n\t"
  185854. #endif
  185855. #ifdef WOLFSSL_KEIL
  185856. "adcs r4, r4, %[r]\n\t"
  185857. #elif defined(__clang__)
  185858. "adcs r4, %[r]\n\t"
  185859. #else
  185860. "adc r4, %[r]\n\t"
  185861. #endif
  185862. #ifdef WOLFSSL_KEIL
  185863. "adcs r2, r2, %[r]\n\t"
  185864. #elif defined(__clang__)
  185865. "adcs r2, %[r]\n\t"
  185866. #else
  185867. "adc r2, %[r]\n\t"
  185868. #endif
  185869. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185870. "lsrs r6, r7, #16\n\t"
  185871. #else
  185872. "lsr r6, r7, #16\n\t"
  185873. #endif
  185874. #ifdef WOLFSSL_KEIL
  185875. "muls r5, r6, r5\n\t"
  185876. #elif defined(__clang__)
  185877. "muls r5, r6\n\t"
  185878. #else
  185879. "mul r5, r6\n\t"
  185880. #endif
  185881. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185882. "lsrs r6, r5, #16\n\t"
  185883. #else
  185884. "lsr r6, r5, #16\n\t"
  185885. #endif
  185886. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185887. "lsls r5, r5, #16\n\t"
  185888. #else
  185889. "lsl r5, r5, #16\n\t"
  185890. #endif
  185891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185892. "adds r3, r3, r5\n\t"
  185893. #else
  185894. "add r3, r3, r5\n\t"
  185895. #endif
  185896. #ifdef WOLFSSL_KEIL
  185897. "adcs r4, r4, r6\n\t"
  185898. #elif defined(__clang__)
  185899. "adcs r4, r6\n\t"
  185900. #else
  185901. "adc r4, r6\n\t"
  185902. #endif
  185903. #ifdef WOLFSSL_KEIL
  185904. "adcs r2, r2, %[r]\n\t"
  185905. #elif defined(__clang__)
  185906. "adcs r2, %[r]\n\t"
  185907. #else
  185908. "adc r2, %[r]\n\t"
  185909. #endif
  185910. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185911. "adds r3, r3, r5\n\t"
  185912. #else
  185913. "add r3, r3, r5\n\t"
  185914. #endif
  185915. #ifdef WOLFSSL_KEIL
  185916. "adcs r4, r4, r6\n\t"
  185917. #elif defined(__clang__)
  185918. "adcs r4, r6\n\t"
  185919. #else
  185920. "adc r4, r6\n\t"
  185921. #endif
  185922. #ifdef WOLFSSL_KEIL
  185923. "adcs r2, r2, %[r]\n\t"
  185924. #elif defined(__clang__)
  185925. "adcs r2, %[r]\n\t"
  185926. #else
  185927. "adc r2, %[r]\n\t"
  185928. #endif
  185929. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185930. "lsrs r5, %[a], #16\n\t"
  185931. #else
  185932. "lsr r5, %[a], #16\n\t"
  185933. #endif
  185934. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185935. "lsrs r6, r7, #16\n\t"
  185936. #else
  185937. "lsr r6, r7, #16\n\t"
  185938. #endif
  185939. #ifdef WOLFSSL_KEIL
  185940. "muls r6, r5, r6\n\t"
  185941. #elif defined(__clang__)
  185942. "muls r6, r5\n\t"
  185943. #else
  185944. "mul r6, r5\n\t"
  185945. #endif
  185946. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185947. "adds r4, r4, r6\n\t"
  185948. #else
  185949. "add r4, r4, r6\n\t"
  185950. #endif
  185951. #ifdef WOLFSSL_KEIL
  185952. "adcs r2, r2, %[r]\n\t"
  185953. #elif defined(__clang__)
  185954. "adcs r2, %[r]\n\t"
  185955. #else
  185956. "adc r2, %[r]\n\t"
  185957. #endif
  185958. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185959. "adds r4, r4, r6\n\t"
  185960. #else
  185961. "add r4, r4, r6\n\t"
  185962. #endif
  185963. #ifdef WOLFSSL_KEIL
  185964. "adcs r2, r2, %[r]\n\t"
  185965. #elif defined(__clang__)
  185966. "adcs r2, %[r]\n\t"
  185967. #else
  185968. "adc r2, %[r]\n\t"
  185969. #endif
  185970. "uxth r6, r7\n\t"
  185971. #ifdef WOLFSSL_KEIL
  185972. "muls r5, r6, r5\n\t"
  185973. #elif defined(__clang__)
  185974. "muls r5, r6\n\t"
  185975. #else
  185976. "mul r5, r6\n\t"
  185977. #endif
  185978. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185979. "lsrs r6, r5, #16\n\t"
  185980. #else
  185981. "lsr r6, r5, #16\n\t"
  185982. #endif
  185983. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185984. "lsls r5, r5, #16\n\t"
  185985. #else
  185986. "lsl r5, r5, #16\n\t"
  185987. #endif
  185988. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185989. "adds r3, r3, r5\n\t"
  185990. #else
  185991. "add r3, r3, r5\n\t"
  185992. #endif
  185993. #ifdef WOLFSSL_KEIL
  185994. "adcs r4, r4, r6\n\t"
  185995. #elif defined(__clang__)
  185996. "adcs r4, r6\n\t"
  185997. #else
  185998. "adc r4, r6\n\t"
  185999. #endif
  186000. #ifdef WOLFSSL_KEIL
  186001. "adcs r2, r2, %[r]\n\t"
  186002. #elif defined(__clang__)
  186003. "adcs r2, %[r]\n\t"
  186004. #else
  186005. "adc r2, %[r]\n\t"
  186006. #endif
  186007. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186008. "adds r3, r3, r5\n\t"
  186009. #else
  186010. "add r3, r3, r5\n\t"
  186011. #endif
  186012. #ifdef WOLFSSL_KEIL
  186013. "adcs r4, r4, r6\n\t"
  186014. #elif defined(__clang__)
  186015. "adcs r4, r6\n\t"
  186016. #else
  186017. "adc r4, r6\n\t"
  186018. #endif
  186019. #ifdef WOLFSSL_KEIL
  186020. "adcs r2, r2, %[r]\n\t"
  186021. #elif defined(__clang__)
  186022. "adcs r2, %[r]\n\t"
  186023. #else
  186024. "adc r2, %[r]\n\t"
  186025. #endif
  186026. "# A[9] * A[7]\n\t"
  186027. "mov %[a], r9\n\t"
  186028. "ldr r7, [%[a], #28]\n\t"
  186029. "ldr %[a], [%[a], #36]\n\t"
  186030. "uxth r5, %[a]\n\t"
  186031. "uxth r6, r7\n\t"
  186032. #ifdef WOLFSSL_KEIL
  186033. "muls r6, r5, r6\n\t"
  186034. #elif defined(__clang__)
  186035. "muls r6, r5\n\t"
  186036. #else
  186037. "mul r6, r5\n\t"
  186038. #endif
  186039. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186040. "adds r3, r3, r6\n\t"
  186041. #else
  186042. "add r3, r3, r6\n\t"
  186043. #endif
  186044. #ifdef WOLFSSL_KEIL
  186045. "adcs r4, r4, %[r]\n\t"
  186046. #elif defined(__clang__)
  186047. "adcs r4, %[r]\n\t"
  186048. #else
  186049. "adc r4, %[r]\n\t"
  186050. #endif
  186051. #ifdef WOLFSSL_KEIL
  186052. "adcs r2, r2, %[r]\n\t"
  186053. #elif defined(__clang__)
  186054. "adcs r2, %[r]\n\t"
  186055. #else
  186056. "adc r2, %[r]\n\t"
  186057. #endif
  186058. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186059. "adds r3, r3, r6\n\t"
  186060. #else
  186061. "add r3, r3, r6\n\t"
  186062. #endif
  186063. #ifdef WOLFSSL_KEIL
  186064. "adcs r4, r4, %[r]\n\t"
  186065. #elif defined(__clang__)
  186066. "adcs r4, %[r]\n\t"
  186067. #else
  186068. "adc r4, %[r]\n\t"
  186069. #endif
  186070. #ifdef WOLFSSL_KEIL
  186071. "adcs r2, r2, %[r]\n\t"
  186072. #elif defined(__clang__)
  186073. "adcs r2, %[r]\n\t"
  186074. #else
  186075. "adc r2, %[r]\n\t"
  186076. #endif
  186077. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186078. "lsrs r6, r7, #16\n\t"
  186079. #else
  186080. "lsr r6, r7, #16\n\t"
  186081. #endif
  186082. #ifdef WOLFSSL_KEIL
  186083. "muls r5, r6, r5\n\t"
  186084. #elif defined(__clang__)
  186085. "muls r5, r6\n\t"
  186086. #else
  186087. "mul r5, r6\n\t"
  186088. #endif
  186089. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186090. "lsrs r6, r5, #16\n\t"
  186091. #else
  186092. "lsr r6, r5, #16\n\t"
  186093. #endif
  186094. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186095. "lsls r5, r5, #16\n\t"
  186096. #else
  186097. "lsl r5, r5, #16\n\t"
  186098. #endif
  186099. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186100. "adds r3, r3, r5\n\t"
  186101. #else
  186102. "add r3, r3, r5\n\t"
  186103. #endif
  186104. #ifdef WOLFSSL_KEIL
  186105. "adcs r4, r4, r6\n\t"
  186106. #elif defined(__clang__)
  186107. "adcs r4, r6\n\t"
  186108. #else
  186109. "adc r4, r6\n\t"
  186110. #endif
  186111. #ifdef WOLFSSL_KEIL
  186112. "adcs r2, r2, %[r]\n\t"
  186113. #elif defined(__clang__)
  186114. "adcs r2, %[r]\n\t"
  186115. #else
  186116. "adc r2, %[r]\n\t"
  186117. #endif
  186118. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186119. "adds r3, r3, r5\n\t"
  186120. #else
  186121. "add r3, r3, r5\n\t"
  186122. #endif
  186123. #ifdef WOLFSSL_KEIL
  186124. "adcs r4, r4, r6\n\t"
  186125. #elif defined(__clang__)
  186126. "adcs r4, r6\n\t"
  186127. #else
  186128. "adc r4, r6\n\t"
  186129. #endif
  186130. #ifdef WOLFSSL_KEIL
  186131. "adcs r2, r2, %[r]\n\t"
  186132. #elif defined(__clang__)
  186133. "adcs r2, %[r]\n\t"
  186134. #else
  186135. "adc r2, %[r]\n\t"
  186136. #endif
  186137. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186138. "lsrs r5, %[a], #16\n\t"
  186139. #else
  186140. "lsr r5, %[a], #16\n\t"
  186141. #endif
  186142. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186143. "lsrs r6, r7, #16\n\t"
  186144. #else
  186145. "lsr r6, r7, #16\n\t"
  186146. #endif
  186147. #ifdef WOLFSSL_KEIL
  186148. "muls r6, r5, r6\n\t"
  186149. #elif defined(__clang__)
  186150. "muls r6, r5\n\t"
  186151. #else
  186152. "mul r6, r5\n\t"
  186153. #endif
  186154. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186155. "adds r4, r4, r6\n\t"
  186156. #else
  186157. "add r4, r4, r6\n\t"
  186158. #endif
  186159. #ifdef WOLFSSL_KEIL
  186160. "adcs r2, r2, %[r]\n\t"
  186161. #elif defined(__clang__)
  186162. "adcs r2, %[r]\n\t"
  186163. #else
  186164. "adc r2, %[r]\n\t"
  186165. #endif
  186166. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186167. "adds r4, r4, r6\n\t"
  186168. #else
  186169. "add r4, r4, r6\n\t"
  186170. #endif
  186171. #ifdef WOLFSSL_KEIL
  186172. "adcs r2, r2, %[r]\n\t"
  186173. #elif defined(__clang__)
  186174. "adcs r2, %[r]\n\t"
  186175. #else
  186176. "adc r2, %[r]\n\t"
  186177. #endif
  186178. "uxth r6, r7\n\t"
  186179. #ifdef WOLFSSL_KEIL
  186180. "muls r5, r6, r5\n\t"
  186181. #elif defined(__clang__)
  186182. "muls r5, r6\n\t"
  186183. #else
  186184. "mul r5, r6\n\t"
  186185. #endif
  186186. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186187. "lsrs r6, r5, #16\n\t"
  186188. #else
  186189. "lsr r6, r5, #16\n\t"
  186190. #endif
  186191. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186192. "lsls r5, r5, #16\n\t"
  186193. #else
  186194. "lsl r5, r5, #16\n\t"
  186195. #endif
  186196. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186197. "adds r3, r3, r5\n\t"
  186198. #else
  186199. "add r3, r3, r5\n\t"
  186200. #endif
  186201. #ifdef WOLFSSL_KEIL
  186202. "adcs r4, r4, r6\n\t"
  186203. #elif defined(__clang__)
  186204. "adcs r4, r6\n\t"
  186205. #else
  186206. "adc r4, r6\n\t"
  186207. #endif
  186208. #ifdef WOLFSSL_KEIL
  186209. "adcs r2, r2, %[r]\n\t"
  186210. #elif defined(__clang__)
  186211. "adcs r2, %[r]\n\t"
  186212. #else
  186213. "adc r2, %[r]\n\t"
  186214. #endif
  186215. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186216. "adds r3, r3, r5\n\t"
  186217. #else
  186218. "add r3, r3, r5\n\t"
  186219. #endif
  186220. #ifdef WOLFSSL_KEIL
  186221. "adcs r4, r4, r6\n\t"
  186222. #elif defined(__clang__)
  186223. "adcs r4, r6\n\t"
  186224. #else
  186225. "adc r4, r6\n\t"
  186226. #endif
  186227. #ifdef WOLFSSL_KEIL
  186228. "adcs r2, r2, %[r]\n\t"
  186229. #elif defined(__clang__)
  186230. "adcs r2, %[r]\n\t"
  186231. #else
  186232. "adc r2, %[r]\n\t"
  186233. #endif
  186234. "# A[8] * A[8]\n\t"
  186235. "mov %[a], r9\n\t"
  186236. "ldr r7, [%[a], #32]\n\t"
  186237. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186238. "lsrs r6, r7, #16\n\t"
  186239. #else
  186240. "lsr r6, r7, #16\n\t"
  186241. #endif
  186242. "uxth r5, r7\n\t"
  186243. #ifdef WOLFSSL_KEIL
  186244. "muls r5, r5, r5\n\t"
  186245. #elif defined(__clang__)
  186246. "muls r5, r5\n\t"
  186247. #else
  186248. "mul r5, r5\n\t"
  186249. #endif
  186250. #ifdef WOLFSSL_KEIL
  186251. "muls r6, r6, r6\n\t"
  186252. #elif defined(__clang__)
  186253. "muls r6, r6\n\t"
  186254. #else
  186255. "mul r6, r6\n\t"
  186256. #endif
  186257. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186258. "adds r3, r3, r5\n\t"
  186259. #else
  186260. "add r3, r3, r5\n\t"
  186261. #endif
  186262. #ifdef WOLFSSL_KEIL
  186263. "adcs r4, r4, r6\n\t"
  186264. #elif defined(__clang__)
  186265. "adcs r4, r6\n\t"
  186266. #else
  186267. "adc r4, r6\n\t"
  186268. #endif
  186269. #ifdef WOLFSSL_KEIL
  186270. "adcs r2, r2, %[r]\n\t"
  186271. #elif defined(__clang__)
  186272. "adcs r2, %[r]\n\t"
  186273. #else
  186274. "adc r2, %[r]\n\t"
  186275. #endif
  186276. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186277. "lsrs r6, r7, #16\n\t"
  186278. #else
  186279. "lsr r6, r7, #16\n\t"
  186280. #endif
  186281. "uxth r5, r7\n\t"
  186282. #ifdef WOLFSSL_KEIL
  186283. "muls r5, r6, r5\n\t"
  186284. #elif defined(__clang__)
  186285. "muls r5, r6\n\t"
  186286. #else
  186287. "mul r5, r6\n\t"
  186288. #endif
  186289. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186290. "lsrs r6, r5, #15\n\t"
  186291. #else
  186292. "lsr r6, r5, #15\n\t"
  186293. #endif
  186294. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186295. "lsls r5, r5, #17\n\t"
  186296. #else
  186297. "lsl r5, r5, #17\n\t"
  186298. #endif
  186299. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186300. "adds r3, r3, r5\n\t"
  186301. #else
  186302. "add r3, r3, r5\n\t"
  186303. #endif
  186304. #ifdef WOLFSSL_KEIL
  186305. "adcs r4, r4, r6\n\t"
  186306. #elif defined(__clang__)
  186307. "adcs r4, r6\n\t"
  186308. #else
  186309. "adc r4, r6\n\t"
  186310. #endif
  186311. #ifdef WOLFSSL_KEIL
  186312. "adcs r2, r2, %[r]\n\t"
  186313. #elif defined(__clang__)
  186314. "adcs r2, %[r]\n\t"
  186315. #else
  186316. "adc r2, %[r]\n\t"
  186317. #endif
  186318. "mov %[r], r8\n\t"
  186319. "str r3, [%[r], #64]\n\t"
  186320. "movs %[r], #0\n\t"
  186321. "movs %[a], #48\n\t"
  186322. "add %[a], %[a], r9\n\t"
  186323. "ldm %[a]!, {r5, r6}\n\t"
  186324. "mov r10, r5\n\t"
  186325. "mov r11, r6\n\t"
  186326. "ldm %[a]!, {r5, r6}\n\t"
  186327. "mov r12, r5\n\t"
  186328. "mov lr, r6\n\t"
  186329. "mov %[a], r9\n\t"
  186330. "# A[9] * A[8]\n\t"
  186331. "movs r3, #0\n\t"
  186332. "ldr %[a], [%[a], #36]\n\t"
  186333. "uxth r5, %[a]\n\t"
  186334. "uxth r6, r7\n\t"
  186335. #ifdef WOLFSSL_KEIL
  186336. "muls r6, r5, r6\n\t"
  186337. #elif defined(__clang__)
  186338. "muls r6, r5\n\t"
  186339. #else
  186340. "mul r6, r5\n\t"
  186341. #endif
  186342. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186343. "adds r4, r4, r6\n\t"
  186344. #else
  186345. "add r4, r4, r6\n\t"
  186346. #endif
  186347. #ifdef WOLFSSL_KEIL
  186348. "adcs r2, r2, %[r]\n\t"
  186349. #elif defined(__clang__)
  186350. "adcs r2, %[r]\n\t"
  186351. #else
  186352. "adc r2, %[r]\n\t"
  186353. #endif
  186354. #ifdef WOLFSSL_KEIL
  186355. "adcs r3, r3, %[r]\n\t"
  186356. #elif defined(__clang__)
  186357. "adcs r3, %[r]\n\t"
  186358. #else
  186359. "adc r3, %[r]\n\t"
  186360. #endif
  186361. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186362. "adds r4, r4, r6\n\t"
  186363. #else
  186364. "add r4, r4, r6\n\t"
  186365. #endif
  186366. #ifdef WOLFSSL_KEIL
  186367. "adcs r2, r2, %[r]\n\t"
  186368. #elif defined(__clang__)
  186369. "adcs r2, %[r]\n\t"
  186370. #else
  186371. "adc r2, %[r]\n\t"
  186372. #endif
  186373. #ifdef WOLFSSL_KEIL
  186374. "adcs r3, r3, %[r]\n\t"
  186375. #elif defined(__clang__)
  186376. "adcs r3, %[r]\n\t"
  186377. #else
  186378. "adc r3, %[r]\n\t"
  186379. #endif
  186380. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186381. "lsrs r6, r7, #16\n\t"
  186382. #else
  186383. "lsr r6, r7, #16\n\t"
  186384. #endif
  186385. #ifdef WOLFSSL_KEIL
  186386. "muls r5, r6, r5\n\t"
  186387. #elif defined(__clang__)
  186388. "muls r5, r6\n\t"
  186389. #else
  186390. "mul r5, r6\n\t"
  186391. #endif
  186392. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186393. "lsrs r6, r5, #16\n\t"
  186394. #else
  186395. "lsr r6, r5, #16\n\t"
  186396. #endif
  186397. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186398. "lsls r5, r5, #16\n\t"
  186399. #else
  186400. "lsl r5, r5, #16\n\t"
  186401. #endif
  186402. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186403. "adds r4, r4, r5\n\t"
  186404. #else
  186405. "add r4, r4, r5\n\t"
  186406. #endif
  186407. #ifdef WOLFSSL_KEIL
  186408. "adcs r2, r2, r6\n\t"
  186409. #elif defined(__clang__)
  186410. "adcs r2, r6\n\t"
  186411. #else
  186412. "adc r2, r6\n\t"
  186413. #endif
  186414. #ifdef WOLFSSL_KEIL
  186415. "adcs r3, r3, %[r]\n\t"
  186416. #elif defined(__clang__)
  186417. "adcs r3, %[r]\n\t"
  186418. #else
  186419. "adc r3, %[r]\n\t"
  186420. #endif
  186421. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186422. "adds r4, r4, r5\n\t"
  186423. #else
  186424. "add r4, r4, r5\n\t"
  186425. #endif
  186426. #ifdef WOLFSSL_KEIL
  186427. "adcs r2, r2, r6\n\t"
  186428. #elif defined(__clang__)
  186429. "adcs r2, r6\n\t"
  186430. #else
  186431. "adc r2, r6\n\t"
  186432. #endif
  186433. #ifdef WOLFSSL_KEIL
  186434. "adcs r3, r3, %[r]\n\t"
  186435. #elif defined(__clang__)
  186436. "adcs r3, %[r]\n\t"
  186437. #else
  186438. "adc r3, %[r]\n\t"
  186439. #endif
  186440. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186441. "lsrs r5, %[a], #16\n\t"
  186442. #else
  186443. "lsr r5, %[a], #16\n\t"
  186444. #endif
  186445. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186446. "lsrs r6, r7, #16\n\t"
  186447. #else
  186448. "lsr r6, r7, #16\n\t"
  186449. #endif
  186450. #ifdef WOLFSSL_KEIL
  186451. "muls r6, r5, r6\n\t"
  186452. #elif defined(__clang__)
  186453. "muls r6, r5\n\t"
  186454. #else
  186455. "mul r6, r5\n\t"
  186456. #endif
  186457. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186458. "adds r2, r2, r6\n\t"
  186459. #else
  186460. "add r2, r2, r6\n\t"
  186461. #endif
  186462. #ifdef WOLFSSL_KEIL
  186463. "adcs r3, r3, %[r]\n\t"
  186464. #elif defined(__clang__)
  186465. "adcs r3, %[r]\n\t"
  186466. #else
  186467. "adc r3, %[r]\n\t"
  186468. #endif
  186469. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186470. "adds r2, r2, r6\n\t"
  186471. #else
  186472. "add r2, r2, r6\n\t"
  186473. #endif
  186474. #ifdef WOLFSSL_KEIL
  186475. "adcs r3, r3, %[r]\n\t"
  186476. #elif defined(__clang__)
  186477. "adcs r3, %[r]\n\t"
  186478. #else
  186479. "adc r3, %[r]\n\t"
  186480. #endif
  186481. "uxth r6, r7\n\t"
  186482. #ifdef WOLFSSL_KEIL
  186483. "muls r5, r6, r5\n\t"
  186484. #elif defined(__clang__)
  186485. "muls r5, r6\n\t"
  186486. #else
  186487. "mul r5, r6\n\t"
  186488. #endif
  186489. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186490. "lsrs r6, r5, #16\n\t"
  186491. #else
  186492. "lsr r6, r5, #16\n\t"
  186493. #endif
  186494. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186495. "lsls r5, r5, #16\n\t"
  186496. #else
  186497. "lsl r5, r5, #16\n\t"
  186498. #endif
  186499. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186500. "adds r4, r4, r5\n\t"
  186501. #else
  186502. "add r4, r4, r5\n\t"
  186503. #endif
  186504. #ifdef WOLFSSL_KEIL
  186505. "adcs r2, r2, r6\n\t"
  186506. #elif defined(__clang__)
  186507. "adcs r2, r6\n\t"
  186508. #else
  186509. "adc r2, r6\n\t"
  186510. #endif
  186511. #ifdef WOLFSSL_KEIL
  186512. "adcs r3, r3, %[r]\n\t"
  186513. #elif defined(__clang__)
  186514. "adcs r3, %[r]\n\t"
  186515. #else
  186516. "adc r3, %[r]\n\t"
  186517. #endif
  186518. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186519. "adds r4, r4, r5\n\t"
  186520. #else
  186521. "add r4, r4, r5\n\t"
  186522. #endif
  186523. #ifdef WOLFSSL_KEIL
  186524. "adcs r2, r2, r6\n\t"
  186525. #elif defined(__clang__)
  186526. "adcs r2, r6\n\t"
  186527. #else
  186528. "adc r2, r6\n\t"
  186529. #endif
  186530. #ifdef WOLFSSL_KEIL
  186531. "adcs r3, r3, %[r]\n\t"
  186532. #elif defined(__clang__)
  186533. "adcs r3, %[r]\n\t"
  186534. #else
  186535. "adc r3, %[r]\n\t"
  186536. #endif
  186537. "# A[10] * A[7]\n\t"
  186538. "mov %[a], r9\n\t"
  186539. "ldr r7, [%[a], #28]\n\t"
  186540. "ldr %[a], [%[a], #40]\n\t"
  186541. "uxth r5, %[a]\n\t"
  186542. "uxth r6, r7\n\t"
  186543. #ifdef WOLFSSL_KEIL
  186544. "muls r6, r5, r6\n\t"
  186545. #elif defined(__clang__)
  186546. "muls r6, r5\n\t"
  186547. #else
  186548. "mul r6, r5\n\t"
  186549. #endif
  186550. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186551. "adds r4, r4, r6\n\t"
  186552. #else
  186553. "add r4, r4, r6\n\t"
  186554. #endif
  186555. #ifdef WOLFSSL_KEIL
  186556. "adcs r2, r2, %[r]\n\t"
  186557. #elif defined(__clang__)
  186558. "adcs r2, %[r]\n\t"
  186559. #else
  186560. "adc r2, %[r]\n\t"
  186561. #endif
  186562. #ifdef WOLFSSL_KEIL
  186563. "adcs r3, r3, %[r]\n\t"
  186564. #elif defined(__clang__)
  186565. "adcs r3, %[r]\n\t"
  186566. #else
  186567. "adc r3, %[r]\n\t"
  186568. #endif
  186569. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186570. "adds r4, r4, r6\n\t"
  186571. #else
  186572. "add r4, r4, r6\n\t"
  186573. #endif
  186574. #ifdef WOLFSSL_KEIL
  186575. "adcs r2, r2, %[r]\n\t"
  186576. #elif defined(__clang__)
  186577. "adcs r2, %[r]\n\t"
  186578. #else
  186579. "adc r2, %[r]\n\t"
  186580. #endif
  186581. #ifdef WOLFSSL_KEIL
  186582. "adcs r3, r3, %[r]\n\t"
  186583. #elif defined(__clang__)
  186584. "adcs r3, %[r]\n\t"
  186585. #else
  186586. "adc r3, %[r]\n\t"
  186587. #endif
  186588. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186589. "lsrs r6, r7, #16\n\t"
  186590. #else
  186591. "lsr r6, r7, #16\n\t"
  186592. #endif
  186593. #ifdef WOLFSSL_KEIL
  186594. "muls r5, r6, r5\n\t"
  186595. #elif defined(__clang__)
  186596. "muls r5, r6\n\t"
  186597. #else
  186598. "mul r5, r6\n\t"
  186599. #endif
  186600. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186601. "lsrs r6, r5, #16\n\t"
  186602. #else
  186603. "lsr r6, r5, #16\n\t"
  186604. #endif
  186605. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186606. "lsls r5, r5, #16\n\t"
  186607. #else
  186608. "lsl r5, r5, #16\n\t"
  186609. #endif
  186610. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186611. "adds r4, r4, r5\n\t"
  186612. #else
  186613. "add r4, r4, r5\n\t"
  186614. #endif
  186615. #ifdef WOLFSSL_KEIL
  186616. "adcs r2, r2, r6\n\t"
  186617. #elif defined(__clang__)
  186618. "adcs r2, r6\n\t"
  186619. #else
  186620. "adc r2, r6\n\t"
  186621. #endif
  186622. #ifdef WOLFSSL_KEIL
  186623. "adcs r3, r3, %[r]\n\t"
  186624. #elif defined(__clang__)
  186625. "adcs r3, %[r]\n\t"
  186626. #else
  186627. "adc r3, %[r]\n\t"
  186628. #endif
  186629. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186630. "adds r4, r4, r5\n\t"
  186631. #else
  186632. "add r4, r4, r5\n\t"
  186633. #endif
  186634. #ifdef WOLFSSL_KEIL
  186635. "adcs r2, r2, r6\n\t"
  186636. #elif defined(__clang__)
  186637. "adcs r2, r6\n\t"
  186638. #else
  186639. "adc r2, r6\n\t"
  186640. #endif
  186641. #ifdef WOLFSSL_KEIL
  186642. "adcs r3, r3, %[r]\n\t"
  186643. #elif defined(__clang__)
  186644. "adcs r3, %[r]\n\t"
  186645. #else
  186646. "adc r3, %[r]\n\t"
  186647. #endif
  186648. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186649. "lsrs r5, %[a], #16\n\t"
  186650. #else
  186651. "lsr r5, %[a], #16\n\t"
  186652. #endif
  186653. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186654. "lsrs r6, r7, #16\n\t"
  186655. #else
  186656. "lsr r6, r7, #16\n\t"
  186657. #endif
  186658. #ifdef WOLFSSL_KEIL
  186659. "muls r6, r5, r6\n\t"
  186660. #elif defined(__clang__)
  186661. "muls r6, r5\n\t"
  186662. #else
  186663. "mul r6, r5\n\t"
  186664. #endif
  186665. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186666. "adds r2, r2, r6\n\t"
  186667. #else
  186668. "add r2, r2, r6\n\t"
  186669. #endif
  186670. #ifdef WOLFSSL_KEIL
  186671. "adcs r3, r3, %[r]\n\t"
  186672. #elif defined(__clang__)
  186673. "adcs r3, %[r]\n\t"
  186674. #else
  186675. "adc r3, %[r]\n\t"
  186676. #endif
  186677. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186678. "adds r2, r2, r6\n\t"
  186679. #else
  186680. "add r2, r2, r6\n\t"
  186681. #endif
  186682. #ifdef WOLFSSL_KEIL
  186683. "adcs r3, r3, %[r]\n\t"
  186684. #elif defined(__clang__)
  186685. "adcs r3, %[r]\n\t"
  186686. #else
  186687. "adc r3, %[r]\n\t"
  186688. #endif
  186689. "uxth r6, r7\n\t"
  186690. #ifdef WOLFSSL_KEIL
  186691. "muls r5, r6, r5\n\t"
  186692. #elif defined(__clang__)
  186693. "muls r5, r6\n\t"
  186694. #else
  186695. "mul r5, r6\n\t"
  186696. #endif
  186697. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186698. "lsrs r6, r5, #16\n\t"
  186699. #else
  186700. "lsr r6, r5, #16\n\t"
  186701. #endif
  186702. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186703. "lsls r5, r5, #16\n\t"
  186704. #else
  186705. "lsl r5, r5, #16\n\t"
  186706. #endif
  186707. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186708. "adds r4, r4, r5\n\t"
  186709. #else
  186710. "add r4, r4, r5\n\t"
  186711. #endif
  186712. #ifdef WOLFSSL_KEIL
  186713. "adcs r2, r2, r6\n\t"
  186714. #elif defined(__clang__)
  186715. "adcs r2, r6\n\t"
  186716. #else
  186717. "adc r2, r6\n\t"
  186718. #endif
  186719. #ifdef WOLFSSL_KEIL
  186720. "adcs r3, r3, %[r]\n\t"
  186721. #elif defined(__clang__)
  186722. "adcs r3, %[r]\n\t"
  186723. #else
  186724. "adc r3, %[r]\n\t"
  186725. #endif
  186726. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186727. "adds r4, r4, r5\n\t"
  186728. #else
  186729. "add r4, r4, r5\n\t"
  186730. #endif
  186731. #ifdef WOLFSSL_KEIL
  186732. "adcs r2, r2, r6\n\t"
  186733. #elif defined(__clang__)
  186734. "adcs r2, r6\n\t"
  186735. #else
  186736. "adc r2, r6\n\t"
  186737. #endif
  186738. #ifdef WOLFSSL_KEIL
  186739. "adcs r3, r3, %[r]\n\t"
  186740. #elif defined(__clang__)
  186741. "adcs r3, %[r]\n\t"
  186742. #else
  186743. "adc r3, %[r]\n\t"
  186744. #endif
  186745. "# A[11] * A[6]\n\t"
  186746. "mov %[a], r9\n\t"
  186747. "ldr r7, [%[a], #24]\n\t"
  186748. "ldr %[a], [%[a], #44]\n\t"
  186749. "uxth r5, %[a]\n\t"
  186750. "uxth r6, r7\n\t"
  186751. #ifdef WOLFSSL_KEIL
  186752. "muls r6, r5, r6\n\t"
  186753. #elif defined(__clang__)
  186754. "muls r6, r5\n\t"
  186755. #else
  186756. "mul r6, r5\n\t"
  186757. #endif
  186758. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186759. "adds r4, r4, r6\n\t"
  186760. #else
  186761. "add r4, r4, r6\n\t"
  186762. #endif
  186763. #ifdef WOLFSSL_KEIL
  186764. "adcs r2, r2, %[r]\n\t"
  186765. #elif defined(__clang__)
  186766. "adcs r2, %[r]\n\t"
  186767. #else
  186768. "adc r2, %[r]\n\t"
  186769. #endif
  186770. #ifdef WOLFSSL_KEIL
  186771. "adcs r3, r3, %[r]\n\t"
  186772. #elif defined(__clang__)
  186773. "adcs r3, %[r]\n\t"
  186774. #else
  186775. "adc r3, %[r]\n\t"
  186776. #endif
  186777. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186778. "adds r4, r4, r6\n\t"
  186779. #else
  186780. "add r4, r4, r6\n\t"
  186781. #endif
  186782. #ifdef WOLFSSL_KEIL
  186783. "adcs r2, r2, %[r]\n\t"
  186784. #elif defined(__clang__)
  186785. "adcs r2, %[r]\n\t"
  186786. #else
  186787. "adc r2, %[r]\n\t"
  186788. #endif
  186789. #ifdef WOLFSSL_KEIL
  186790. "adcs r3, r3, %[r]\n\t"
  186791. #elif defined(__clang__)
  186792. "adcs r3, %[r]\n\t"
  186793. #else
  186794. "adc r3, %[r]\n\t"
  186795. #endif
  186796. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186797. "lsrs r6, r7, #16\n\t"
  186798. #else
  186799. "lsr r6, r7, #16\n\t"
  186800. #endif
  186801. #ifdef WOLFSSL_KEIL
  186802. "muls r5, r6, r5\n\t"
  186803. #elif defined(__clang__)
  186804. "muls r5, r6\n\t"
  186805. #else
  186806. "mul r5, r6\n\t"
  186807. #endif
  186808. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186809. "lsrs r6, r5, #16\n\t"
  186810. #else
  186811. "lsr r6, r5, #16\n\t"
  186812. #endif
  186813. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186814. "lsls r5, r5, #16\n\t"
  186815. #else
  186816. "lsl r5, r5, #16\n\t"
  186817. #endif
  186818. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186819. "adds r4, r4, r5\n\t"
  186820. #else
  186821. "add r4, r4, r5\n\t"
  186822. #endif
  186823. #ifdef WOLFSSL_KEIL
  186824. "adcs r2, r2, r6\n\t"
  186825. #elif defined(__clang__)
  186826. "adcs r2, r6\n\t"
  186827. #else
  186828. "adc r2, r6\n\t"
  186829. #endif
  186830. #ifdef WOLFSSL_KEIL
  186831. "adcs r3, r3, %[r]\n\t"
  186832. #elif defined(__clang__)
  186833. "adcs r3, %[r]\n\t"
  186834. #else
  186835. "adc r3, %[r]\n\t"
  186836. #endif
  186837. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186838. "adds r4, r4, r5\n\t"
  186839. #else
  186840. "add r4, r4, r5\n\t"
  186841. #endif
  186842. #ifdef WOLFSSL_KEIL
  186843. "adcs r2, r2, r6\n\t"
  186844. #elif defined(__clang__)
  186845. "adcs r2, r6\n\t"
  186846. #else
  186847. "adc r2, r6\n\t"
  186848. #endif
  186849. #ifdef WOLFSSL_KEIL
  186850. "adcs r3, r3, %[r]\n\t"
  186851. #elif defined(__clang__)
  186852. "adcs r3, %[r]\n\t"
  186853. #else
  186854. "adc r3, %[r]\n\t"
  186855. #endif
  186856. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186857. "lsrs r5, %[a], #16\n\t"
  186858. #else
  186859. "lsr r5, %[a], #16\n\t"
  186860. #endif
  186861. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186862. "lsrs r6, r7, #16\n\t"
  186863. #else
  186864. "lsr r6, r7, #16\n\t"
  186865. #endif
  186866. #ifdef WOLFSSL_KEIL
  186867. "muls r6, r5, r6\n\t"
  186868. #elif defined(__clang__)
  186869. "muls r6, r5\n\t"
  186870. #else
  186871. "mul r6, r5\n\t"
  186872. #endif
  186873. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186874. "adds r2, r2, r6\n\t"
  186875. #else
  186876. "add r2, r2, r6\n\t"
  186877. #endif
  186878. #ifdef WOLFSSL_KEIL
  186879. "adcs r3, r3, %[r]\n\t"
  186880. #elif defined(__clang__)
  186881. "adcs r3, %[r]\n\t"
  186882. #else
  186883. "adc r3, %[r]\n\t"
  186884. #endif
  186885. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186886. "adds r2, r2, r6\n\t"
  186887. #else
  186888. "add r2, r2, r6\n\t"
  186889. #endif
  186890. #ifdef WOLFSSL_KEIL
  186891. "adcs r3, r3, %[r]\n\t"
  186892. #elif defined(__clang__)
  186893. "adcs r3, %[r]\n\t"
  186894. #else
  186895. "adc r3, %[r]\n\t"
  186896. #endif
  186897. "uxth r6, r7\n\t"
  186898. #ifdef WOLFSSL_KEIL
  186899. "muls r5, r6, r5\n\t"
  186900. #elif defined(__clang__)
  186901. "muls r5, r6\n\t"
  186902. #else
  186903. "mul r5, r6\n\t"
  186904. #endif
  186905. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186906. "lsrs r6, r5, #16\n\t"
  186907. #else
  186908. "lsr r6, r5, #16\n\t"
  186909. #endif
  186910. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186911. "lsls r5, r5, #16\n\t"
  186912. #else
  186913. "lsl r5, r5, #16\n\t"
  186914. #endif
  186915. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186916. "adds r4, r4, r5\n\t"
  186917. #else
  186918. "add r4, r4, r5\n\t"
  186919. #endif
  186920. #ifdef WOLFSSL_KEIL
  186921. "adcs r2, r2, r6\n\t"
  186922. #elif defined(__clang__)
  186923. "adcs r2, r6\n\t"
  186924. #else
  186925. "adc r2, r6\n\t"
  186926. #endif
  186927. #ifdef WOLFSSL_KEIL
  186928. "adcs r3, r3, %[r]\n\t"
  186929. #elif defined(__clang__)
  186930. "adcs r3, %[r]\n\t"
  186931. #else
  186932. "adc r3, %[r]\n\t"
  186933. #endif
  186934. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186935. "adds r4, r4, r5\n\t"
  186936. #else
  186937. "add r4, r4, r5\n\t"
  186938. #endif
  186939. #ifdef WOLFSSL_KEIL
  186940. "adcs r2, r2, r6\n\t"
  186941. #elif defined(__clang__)
  186942. "adcs r2, r6\n\t"
  186943. #else
  186944. "adc r2, r6\n\t"
  186945. #endif
  186946. #ifdef WOLFSSL_KEIL
  186947. "adcs r3, r3, %[r]\n\t"
  186948. #elif defined(__clang__)
  186949. "adcs r3, %[r]\n\t"
  186950. #else
  186951. "adc r3, %[r]\n\t"
  186952. #endif
  186953. "# A[12] * A[5]\n\t"
  186954. "mov %[a], r9\n\t"
  186955. "ldr r7, [%[a], #20]\n\t"
  186956. "mov %[a], r10\n\t"
  186957. "uxth r5, %[a]\n\t"
  186958. "uxth r6, r7\n\t"
  186959. #ifdef WOLFSSL_KEIL
  186960. "muls r6, r5, r6\n\t"
  186961. #elif defined(__clang__)
  186962. "muls r6, r5\n\t"
  186963. #else
  186964. "mul r6, r5\n\t"
  186965. #endif
  186966. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186967. "adds r4, r4, r6\n\t"
  186968. #else
  186969. "add r4, r4, r6\n\t"
  186970. #endif
  186971. #ifdef WOLFSSL_KEIL
  186972. "adcs r2, r2, %[r]\n\t"
  186973. #elif defined(__clang__)
  186974. "adcs r2, %[r]\n\t"
  186975. #else
  186976. "adc r2, %[r]\n\t"
  186977. #endif
  186978. #ifdef WOLFSSL_KEIL
  186979. "adcs r3, r3, %[r]\n\t"
  186980. #elif defined(__clang__)
  186981. "adcs r3, %[r]\n\t"
  186982. #else
  186983. "adc r3, %[r]\n\t"
  186984. #endif
  186985. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186986. "adds r4, r4, r6\n\t"
  186987. #else
  186988. "add r4, r4, r6\n\t"
  186989. #endif
  186990. #ifdef WOLFSSL_KEIL
  186991. "adcs r2, r2, %[r]\n\t"
  186992. #elif defined(__clang__)
  186993. "adcs r2, %[r]\n\t"
  186994. #else
  186995. "adc r2, %[r]\n\t"
  186996. #endif
  186997. #ifdef WOLFSSL_KEIL
  186998. "adcs r3, r3, %[r]\n\t"
  186999. #elif defined(__clang__)
  187000. "adcs r3, %[r]\n\t"
  187001. #else
  187002. "adc r3, %[r]\n\t"
  187003. #endif
  187004. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187005. "lsrs r6, r7, #16\n\t"
  187006. #else
  187007. "lsr r6, r7, #16\n\t"
  187008. #endif
  187009. #ifdef WOLFSSL_KEIL
  187010. "muls r5, r6, r5\n\t"
  187011. #elif defined(__clang__)
  187012. "muls r5, r6\n\t"
  187013. #else
  187014. "mul r5, r6\n\t"
  187015. #endif
  187016. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187017. "lsrs r6, r5, #16\n\t"
  187018. #else
  187019. "lsr r6, r5, #16\n\t"
  187020. #endif
  187021. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187022. "lsls r5, r5, #16\n\t"
  187023. #else
  187024. "lsl r5, r5, #16\n\t"
  187025. #endif
  187026. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187027. "adds r4, r4, r5\n\t"
  187028. #else
  187029. "add r4, r4, r5\n\t"
  187030. #endif
  187031. #ifdef WOLFSSL_KEIL
  187032. "adcs r2, r2, r6\n\t"
  187033. #elif defined(__clang__)
  187034. "adcs r2, r6\n\t"
  187035. #else
  187036. "adc r2, r6\n\t"
  187037. #endif
  187038. #ifdef WOLFSSL_KEIL
  187039. "adcs r3, r3, %[r]\n\t"
  187040. #elif defined(__clang__)
  187041. "adcs r3, %[r]\n\t"
  187042. #else
  187043. "adc r3, %[r]\n\t"
  187044. #endif
  187045. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187046. "adds r4, r4, r5\n\t"
  187047. #else
  187048. "add r4, r4, r5\n\t"
  187049. #endif
  187050. #ifdef WOLFSSL_KEIL
  187051. "adcs r2, r2, r6\n\t"
  187052. #elif defined(__clang__)
  187053. "adcs r2, r6\n\t"
  187054. #else
  187055. "adc r2, r6\n\t"
  187056. #endif
  187057. #ifdef WOLFSSL_KEIL
  187058. "adcs r3, r3, %[r]\n\t"
  187059. #elif defined(__clang__)
  187060. "adcs r3, %[r]\n\t"
  187061. #else
  187062. "adc r3, %[r]\n\t"
  187063. #endif
  187064. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187065. "lsrs r5, %[a], #16\n\t"
  187066. #else
  187067. "lsr r5, %[a], #16\n\t"
  187068. #endif
  187069. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187070. "lsrs r6, r7, #16\n\t"
  187071. #else
  187072. "lsr r6, r7, #16\n\t"
  187073. #endif
  187074. #ifdef WOLFSSL_KEIL
  187075. "muls r6, r5, r6\n\t"
  187076. #elif defined(__clang__)
  187077. "muls r6, r5\n\t"
  187078. #else
  187079. "mul r6, r5\n\t"
  187080. #endif
  187081. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187082. "adds r2, r2, r6\n\t"
  187083. #else
  187084. "add r2, r2, r6\n\t"
  187085. #endif
  187086. #ifdef WOLFSSL_KEIL
  187087. "adcs r3, r3, %[r]\n\t"
  187088. #elif defined(__clang__)
  187089. "adcs r3, %[r]\n\t"
  187090. #else
  187091. "adc r3, %[r]\n\t"
  187092. #endif
  187093. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187094. "adds r2, r2, r6\n\t"
  187095. #else
  187096. "add r2, r2, r6\n\t"
  187097. #endif
  187098. #ifdef WOLFSSL_KEIL
  187099. "adcs r3, r3, %[r]\n\t"
  187100. #elif defined(__clang__)
  187101. "adcs r3, %[r]\n\t"
  187102. #else
  187103. "adc r3, %[r]\n\t"
  187104. #endif
  187105. "uxth r6, r7\n\t"
  187106. #ifdef WOLFSSL_KEIL
  187107. "muls r5, r6, r5\n\t"
  187108. #elif defined(__clang__)
  187109. "muls r5, r6\n\t"
  187110. #else
  187111. "mul r5, r6\n\t"
  187112. #endif
  187113. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187114. "lsrs r6, r5, #16\n\t"
  187115. #else
  187116. "lsr r6, r5, #16\n\t"
  187117. #endif
  187118. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187119. "lsls r5, r5, #16\n\t"
  187120. #else
  187121. "lsl r5, r5, #16\n\t"
  187122. #endif
  187123. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187124. "adds r4, r4, r5\n\t"
  187125. #else
  187126. "add r4, r4, r5\n\t"
  187127. #endif
  187128. #ifdef WOLFSSL_KEIL
  187129. "adcs r2, r2, r6\n\t"
  187130. #elif defined(__clang__)
  187131. "adcs r2, r6\n\t"
  187132. #else
  187133. "adc r2, r6\n\t"
  187134. #endif
  187135. #ifdef WOLFSSL_KEIL
  187136. "adcs r3, r3, %[r]\n\t"
  187137. #elif defined(__clang__)
  187138. "adcs r3, %[r]\n\t"
  187139. #else
  187140. "adc r3, %[r]\n\t"
  187141. #endif
  187142. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187143. "adds r4, r4, r5\n\t"
  187144. #else
  187145. "add r4, r4, r5\n\t"
  187146. #endif
  187147. #ifdef WOLFSSL_KEIL
  187148. "adcs r2, r2, r6\n\t"
  187149. #elif defined(__clang__)
  187150. "adcs r2, r6\n\t"
  187151. #else
  187152. "adc r2, r6\n\t"
  187153. #endif
  187154. #ifdef WOLFSSL_KEIL
  187155. "adcs r3, r3, %[r]\n\t"
  187156. #elif defined(__clang__)
  187157. "adcs r3, %[r]\n\t"
  187158. #else
  187159. "adc r3, %[r]\n\t"
  187160. #endif
  187161. "# A[13] * A[4]\n\t"
  187162. "mov %[a], r9\n\t"
  187163. "ldr r7, [%[a], #16]\n\t"
  187164. "mov %[a], r11\n\t"
  187165. "uxth r5, %[a]\n\t"
  187166. "uxth r6, r7\n\t"
  187167. #ifdef WOLFSSL_KEIL
  187168. "muls r6, r5, r6\n\t"
  187169. #elif defined(__clang__)
  187170. "muls r6, r5\n\t"
  187171. #else
  187172. "mul r6, r5\n\t"
  187173. #endif
  187174. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187175. "adds r4, r4, r6\n\t"
  187176. #else
  187177. "add r4, r4, r6\n\t"
  187178. #endif
  187179. #ifdef WOLFSSL_KEIL
  187180. "adcs r2, r2, %[r]\n\t"
  187181. #elif defined(__clang__)
  187182. "adcs r2, %[r]\n\t"
  187183. #else
  187184. "adc r2, %[r]\n\t"
  187185. #endif
  187186. #ifdef WOLFSSL_KEIL
  187187. "adcs r3, r3, %[r]\n\t"
  187188. #elif defined(__clang__)
  187189. "adcs r3, %[r]\n\t"
  187190. #else
  187191. "adc r3, %[r]\n\t"
  187192. #endif
  187193. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187194. "adds r4, r4, r6\n\t"
  187195. #else
  187196. "add r4, r4, r6\n\t"
  187197. #endif
  187198. #ifdef WOLFSSL_KEIL
  187199. "adcs r2, r2, %[r]\n\t"
  187200. #elif defined(__clang__)
  187201. "adcs r2, %[r]\n\t"
  187202. #else
  187203. "adc r2, %[r]\n\t"
  187204. #endif
  187205. #ifdef WOLFSSL_KEIL
  187206. "adcs r3, r3, %[r]\n\t"
  187207. #elif defined(__clang__)
  187208. "adcs r3, %[r]\n\t"
  187209. #else
  187210. "adc r3, %[r]\n\t"
  187211. #endif
  187212. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187213. "lsrs r6, r7, #16\n\t"
  187214. #else
  187215. "lsr r6, r7, #16\n\t"
  187216. #endif
  187217. #ifdef WOLFSSL_KEIL
  187218. "muls r5, r6, r5\n\t"
  187219. #elif defined(__clang__)
  187220. "muls r5, r6\n\t"
  187221. #else
  187222. "mul r5, r6\n\t"
  187223. #endif
  187224. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187225. "lsrs r6, r5, #16\n\t"
  187226. #else
  187227. "lsr r6, r5, #16\n\t"
  187228. #endif
  187229. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187230. "lsls r5, r5, #16\n\t"
  187231. #else
  187232. "lsl r5, r5, #16\n\t"
  187233. #endif
  187234. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187235. "adds r4, r4, r5\n\t"
  187236. #else
  187237. "add r4, r4, r5\n\t"
  187238. #endif
  187239. #ifdef WOLFSSL_KEIL
  187240. "adcs r2, r2, r6\n\t"
  187241. #elif defined(__clang__)
  187242. "adcs r2, r6\n\t"
  187243. #else
  187244. "adc r2, r6\n\t"
  187245. #endif
  187246. #ifdef WOLFSSL_KEIL
  187247. "adcs r3, r3, %[r]\n\t"
  187248. #elif defined(__clang__)
  187249. "adcs r3, %[r]\n\t"
  187250. #else
  187251. "adc r3, %[r]\n\t"
  187252. #endif
  187253. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187254. "adds r4, r4, r5\n\t"
  187255. #else
  187256. "add r4, r4, r5\n\t"
  187257. #endif
  187258. #ifdef WOLFSSL_KEIL
  187259. "adcs r2, r2, r6\n\t"
  187260. #elif defined(__clang__)
  187261. "adcs r2, r6\n\t"
  187262. #else
  187263. "adc r2, r6\n\t"
  187264. #endif
  187265. #ifdef WOLFSSL_KEIL
  187266. "adcs r3, r3, %[r]\n\t"
  187267. #elif defined(__clang__)
  187268. "adcs r3, %[r]\n\t"
  187269. #else
  187270. "adc r3, %[r]\n\t"
  187271. #endif
  187272. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187273. "lsrs r5, %[a], #16\n\t"
  187274. #else
  187275. "lsr r5, %[a], #16\n\t"
  187276. #endif
  187277. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187278. "lsrs r6, r7, #16\n\t"
  187279. #else
  187280. "lsr r6, r7, #16\n\t"
  187281. #endif
  187282. #ifdef WOLFSSL_KEIL
  187283. "muls r6, r5, r6\n\t"
  187284. #elif defined(__clang__)
  187285. "muls r6, r5\n\t"
  187286. #else
  187287. "mul r6, r5\n\t"
  187288. #endif
  187289. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187290. "adds r2, r2, r6\n\t"
  187291. #else
  187292. "add r2, r2, r6\n\t"
  187293. #endif
  187294. #ifdef WOLFSSL_KEIL
  187295. "adcs r3, r3, %[r]\n\t"
  187296. #elif defined(__clang__)
  187297. "adcs r3, %[r]\n\t"
  187298. #else
  187299. "adc r3, %[r]\n\t"
  187300. #endif
  187301. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187302. "adds r2, r2, r6\n\t"
  187303. #else
  187304. "add r2, r2, r6\n\t"
  187305. #endif
  187306. #ifdef WOLFSSL_KEIL
  187307. "adcs r3, r3, %[r]\n\t"
  187308. #elif defined(__clang__)
  187309. "adcs r3, %[r]\n\t"
  187310. #else
  187311. "adc r3, %[r]\n\t"
  187312. #endif
  187313. "uxth r6, r7\n\t"
  187314. #ifdef WOLFSSL_KEIL
  187315. "muls r5, r6, r5\n\t"
  187316. #elif defined(__clang__)
  187317. "muls r5, r6\n\t"
  187318. #else
  187319. "mul r5, r6\n\t"
  187320. #endif
  187321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187322. "lsrs r6, r5, #16\n\t"
  187323. #else
  187324. "lsr r6, r5, #16\n\t"
  187325. #endif
  187326. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187327. "lsls r5, r5, #16\n\t"
  187328. #else
  187329. "lsl r5, r5, #16\n\t"
  187330. #endif
  187331. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187332. "adds r4, r4, r5\n\t"
  187333. #else
  187334. "add r4, r4, r5\n\t"
  187335. #endif
  187336. #ifdef WOLFSSL_KEIL
  187337. "adcs r2, r2, r6\n\t"
  187338. #elif defined(__clang__)
  187339. "adcs r2, r6\n\t"
  187340. #else
  187341. "adc r2, r6\n\t"
  187342. #endif
  187343. #ifdef WOLFSSL_KEIL
  187344. "adcs r3, r3, %[r]\n\t"
  187345. #elif defined(__clang__)
  187346. "adcs r3, %[r]\n\t"
  187347. #else
  187348. "adc r3, %[r]\n\t"
  187349. #endif
  187350. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187351. "adds r4, r4, r5\n\t"
  187352. #else
  187353. "add r4, r4, r5\n\t"
  187354. #endif
  187355. #ifdef WOLFSSL_KEIL
  187356. "adcs r2, r2, r6\n\t"
  187357. #elif defined(__clang__)
  187358. "adcs r2, r6\n\t"
  187359. #else
  187360. "adc r2, r6\n\t"
  187361. #endif
  187362. #ifdef WOLFSSL_KEIL
  187363. "adcs r3, r3, %[r]\n\t"
  187364. #elif defined(__clang__)
  187365. "adcs r3, %[r]\n\t"
  187366. #else
  187367. "adc r3, %[r]\n\t"
  187368. #endif
  187369. "# A[14] * A[3]\n\t"
  187370. "mov %[a], r9\n\t"
  187371. "ldr r7, [%[a], #12]\n\t"
  187372. "mov %[a], r12\n\t"
  187373. "uxth r5, %[a]\n\t"
  187374. "uxth r6, r7\n\t"
  187375. #ifdef WOLFSSL_KEIL
  187376. "muls r6, r5, r6\n\t"
  187377. #elif defined(__clang__)
  187378. "muls r6, r5\n\t"
  187379. #else
  187380. "mul r6, r5\n\t"
  187381. #endif
  187382. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187383. "adds r4, r4, r6\n\t"
  187384. #else
  187385. "add r4, r4, r6\n\t"
  187386. #endif
  187387. #ifdef WOLFSSL_KEIL
  187388. "adcs r2, r2, %[r]\n\t"
  187389. #elif defined(__clang__)
  187390. "adcs r2, %[r]\n\t"
  187391. #else
  187392. "adc r2, %[r]\n\t"
  187393. #endif
  187394. #ifdef WOLFSSL_KEIL
  187395. "adcs r3, r3, %[r]\n\t"
  187396. #elif defined(__clang__)
  187397. "adcs r3, %[r]\n\t"
  187398. #else
  187399. "adc r3, %[r]\n\t"
  187400. #endif
  187401. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187402. "adds r4, r4, r6\n\t"
  187403. #else
  187404. "add r4, r4, r6\n\t"
  187405. #endif
  187406. #ifdef WOLFSSL_KEIL
  187407. "adcs r2, r2, %[r]\n\t"
  187408. #elif defined(__clang__)
  187409. "adcs r2, %[r]\n\t"
  187410. #else
  187411. "adc r2, %[r]\n\t"
  187412. #endif
  187413. #ifdef WOLFSSL_KEIL
  187414. "adcs r3, r3, %[r]\n\t"
  187415. #elif defined(__clang__)
  187416. "adcs r3, %[r]\n\t"
  187417. #else
  187418. "adc r3, %[r]\n\t"
  187419. #endif
  187420. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187421. "lsrs r6, r7, #16\n\t"
  187422. #else
  187423. "lsr r6, r7, #16\n\t"
  187424. #endif
  187425. #ifdef WOLFSSL_KEIL
  187426. "muls r5, r6, r5\n\t"
  187427. #elif defined(__clang__)
  187428. "muls r5, r6\n\t"
  187429. #else
  187430. "mul r5, r6\n\t"
  187431. #endif
  187432. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187433. "lsrs r6, r5, #16\n\t"
  187434. #else
  187435. "lsr r6, r5, #16\n\t"
  187436. #endif
  187437. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187438. "lsls r5, r5, #16\n\t"
  187439. #else
  187440. "lsl r5, r5, #16\n\t"
  187441. #endif
  187442. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187443. "adds r4, r4, r5\n\t"
  187444. #else
  187445. "add r4, r4, r5\n\t"
  187446. #endif
  187447. #ifdef WOLFSSL_KEIL
  187448. "adcs r2, r2, r6\n\t"
  187449. #elif defined(__clang__)
  187450. "adcs r2, r6\n\t"
  187451. #else
  187452. "adc r2, r6\n\t"
  187453. #endif
  187454. #ifdef WOLFSSL_KEIL
  187455. "adcs r3, r3, %[r]\n\t"
  187456. #elif defined(__clang__)
  187457. "adcs r3, %[r]\n\t"
  187458. #else
  187459. "adc r3, %[r]\n\t"
  187460. #endif
  187461. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187462. "adds r4, r4, r5\n\t"
  187463. #else
  187464. "add r4, r4, r5\n\t"
  187465. #endif
  187466. #ifdef WOLFSSL_KEIL
  187467. "adcs r2, r2, r6\n\t"
  187468. #elif defined(__clang__)
  187469. "adcs r2, r6\n\t"
  187470. #else
  187471. "adc r2, r6\n\t"
  187472. #endif
  187473. #ifdef WOLFSSL_KEIL
  187474. "adcs r3, r3, %[r]\n\t"
  187475. #elif defined(__clang__)
  187476. "adcs r3, %[r]\n\t"
  187477. #else
  187478. "adc r3, %[r]\n\t"
  187479. #endif
  187480. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187481. "lsrs r5, %[a], #16\n\t"
  187482. #else
  187483. "lsr r5, %[a], #16\n\t"
  187484. #endif
  187485. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187486. "lsrs r6, r7, #16\n\t"
  187487. #else
  187488. "lsr r6, r7, #16\n\t"
  187489. #endif
  187490. #ifdef WOLFSSL_KEIL
  187491. "muls r6, r5, r6\n\t"
  187492. #elif defined(__clang__)
  187493. "muls r6, r5\n\t"
  187494. #else
  187495. "mul r6, r5\n\t"
  187496. #endif
  187497. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187498. "adds r2, r2, r6\n\t"
  187499. #else
  187500. "add r2, r2, r6\n\t"
  187501. #endif
  187502. #ifdef WOLFSSL_KEIL
  187503. "adcs r3, r3, %[r]\n\t"
  187504. #elif defined(__clang__)
  187505. "adcs r3, %[r]\n\t"
  187506. #else
  187507. "adc r3, %[r]\n\t"
  187508. #endif
  187509. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187510. "adds r2, r2, r6\n\t"
  187511. #else
  187512. "add r2, r2, r6\n\t"
  187513. #endif
  187514. #ifdef WOLFSSL_KEIL
  187515. "adcs r3, r3, %[r]\n\t"
  187516. #elif defined(__clang__)
  187517. "adcs r3, %[r]\n\t"
  187518. #else
  187519. "adc r3, %[r]\n\t"
  187520. #endif
  187521. "uxth r6, r7\n\t"
  187522. #ifdef WOLFSSL_KEIL
  187523. "muls r5, r6, r5\n\t"
  187524. #elif defined(__clang__)
  187525. "muls r5, r6\n\t"
  187526. #else
  187527. "mul r5, r6\n\t"
  187528. #endif
  187529. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187530. "lsrs r6, r5, #16\n\t"
  187531. #else
  187532. "lsr r6, r5, #16\n\t"
  187533. #endif
  187534. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187535. "lsls r5, r5, #16\n\t"
  187536. #else
  187537. "lsl r5, r5, #16\n\t"
  187538. #endif
  187539. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187540. "adds r4, r4, r5\n\t"
  187541. #else
  187542. "add r4, r4, r5\n\t"
  187543. #endif
  187544. #ifdef WOLFSSL_KEIL
  187545. "adcs r2, r2, r6\n\t"
  187546. #elif defined(__clang__)
  187547. "adcs r2, r6\n\t"
  187548. #else
  187549. "adc r2, r6\n\t"
  187550. #endif
  187551. #ifdef WOLFSSL_KEIL
  187552. "adcs r3, r3, %[r]\n\t"
  187553. #elif defined(__clang__)
  187554. "adcs r3, %[r]\n\t"
  187555. #else
  187556. "adc r3, %[r]\n\t"
  187557. #endif
  187558. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187559. "adds r4, r4, r5\n\t"
  187560. #else
  187561. "add r4, r4, r5\n\t"
  187562. #endif
  187563. #ifdef WOLFSSL_KEIL
  187564. "adcs r2, r2, r6\n\t"
  187565. #elif defined(__clang__)
  187566. "adcs r2, r6\n\t"
  187567. #else
  187568. "adc r2, r6\n\t"
  187569. #endif
  187570. #ifdef WOLFSSL_KEIL
  187571. "adcs r3, r3, %[r]\n\t"
  187572. #elif defined(__clang__)
  187573. "adcs r3, %[r]\n\t"
  187574. #else
  187575. "adc r3, %[r]\n\t"
  187576. #endif
  187577. "# A[15] * A[2]\n\t"
  187578. "mov %[a], r9\n\t"
  187579. "ldr r7, [%[a], #8]\n\t"
  187580. "mov %[a], lr\n\t"
  187581. "uxth r5, %[a]\n\t"
  187582. "uxth r6, r7\n\t"
  187583. #ifdef WOLFSSL_KEIL
  187584. "muls r6, r5, r6\n\t"
  187585. #elif defined(__clang__)
  187586. "muls r6, r5\n\t"
  187587. #else
  187588. "mul r6, r5\n\t"
  187589. #endif
  187590. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187591. "adds r4, r4, r6\n\t"
  187592. #else
  187593. "add r4, r4, r6\n\t"
  187594. #endif
  187595. #ifdef WOLFSSL_KEIL
  187596. "adcs r2, r2, %[r]\n\t"
  187597. #elif defined(__clang__)
  187598. "adcs r2, %[r]\n\t"
  187599. #else
  187600. "adc r2, %[r]\n\t"
  187601. #endif
  187602. #ifdef WOLFSSL_KEIL
  187603. "adcs r3, r3, %[r]\n\t"
  187604. #elif defined(__clang__)
  187605. "adcs r3, %[r]\n\t"
  187606. #else
  187607. "adc r3, %[r]\n\t"
  187608. #endif
  187609. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187610. "adds r4, r4, r6\n\t"
  187611. #else
  187612. "add r4, r4, r6\n\t"
  187613. #endif
  187614. #ifdef WOLFSSL_KEIL
  187615. "adcs r2, r2, %[r]\n\t"
  187616. #elif defined(__clang__)
  187617. "adcs r2, %[r]\n\t"
  187618. #else
  187619. "adc r2, %[r]\n\t"
  187620. #endif
  187621. #ifdef WOLFSSL_KEIL
  187622. "adcs r3, r3, %[r]\n\t"
  187623. #elif defined(__clang__)
  187624. "adcs r3, %[r]\n\t"
  187625. #else
  187626. "adc r3, %[r]\n\t"
  187627. #endif
  187628. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187629. "lsrs r6, r7, #16\n\t"
  187630. #else
  187631. "lsr r6, r7, #16\n\t"
  187632. #endif
  187633. #ifdef WOLFSSL_KEIL
  187634. "muls r5, r6, r5\n\t"
  187635. #elif defined(__clang__)
  187636. "muls r5, r6\n\t"
  187637. #else
  187638. "mul r5, r6\n\t"
  187639. #endif
  187640. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187641. "lsrs r6, r5, #16\n\t"
  187642. #else
  187643. "lsr r6, r5, #16\n\t"
  187644. #endif
  187645. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187646. "lsls r5, r5, #16\n\t"
  187647. #else
  187648. "lsl r5, r5, #16\n\t"
  187649. #endif
  187650. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187651. "adds r4, r4, r5\n\t"
  187652. #else
  187653. "add r4, r4, r5\n\t"
  187654. #endif
  187655. #ifdef WOLFSSL_KEIL
  187656. "adcs r2, r2, r6\n\t"
  187657. #elif defined(__clang__)
  187658. "adcs r2, r6\n\t"
  187659. #else
  187660. "adc r2, r6\n\t"
  187661. #endif
  187662. #ifdef WOLFSSL_KEIL
  187663. "adcs r3, r3, %[r]\n\t"
  187664. #elif defined(__clang__)
  187665. "adcs r3, %[r]\n\t"
  187666. #else
  187667. "adc r3, %[r]\n\t"
  187668. #endif
  187669. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187670. "adds r4, r4, r5\n\t"
  187671. #else
  187672. "add r4, r4, r5\n\t"
  187673. #endif
  187674. #ifdef WOLFSSL_KEIL
  187675. "adcs r2, r2, r6\n\t"
  187676. #elif defined(__clang__)
  187677. "adcs r2, r6\n\t"
  187678. #else
  187679. "adc r2, r6\n\t"
  187680. #endif
  187681. #ifdef WOLFSSL_KEIL
  187682. "adcs r3, r3, %[r]\n\t"
  187683. #elif defined(__clang__)
  187684. "adcs r3, %[r]\n\t"
  187685. #else
  187686. "adc r3, %[r]\n\t"
  187687. #endif
  187688. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187689. "lsrs r5, %[a], #16\n\t"
  187690. #else
  187691. "lsr r5, %[a], #16\n\t"
  187692. #endif
  187693. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187694. "lsrs r6, r7, #16\n\t"
  187695. #else
  187696. "lsr r6, r7, #16\n\t"
  187697. #endif
  187698. #ifdef WOLFSSL_KEIL
  187699. "muls r6, r5, r6\n\t"
  187700. #elif defined(__clang__)
  187701. "muls r6, r5\n\t"
  187702. #else
  187703. "mul r6, r5\n\t"
  187704. #endif
  187705. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187706. "adds r2, r2, r6\n\t"
  187707. #else
  187708. "add r2, r2, r6\n\t"
  187709. #endif
  187710. #ifdef WOLFSSL_KEIL
  187711. "adcs r3, r3, %[r]\n\t"
  187712. #elif defined(__clang__)
  187713. "adcs r3, %[r]\n\t"
  187714. #else
  187715. "adc r3, %[r]\n\t"
  187716. #endif
  187717. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187718. "adds r2, r2, r6\n\t"
  187719. #else
  187720. "add r2, r2, r6\n\t"
  187721. #endif
  187722. #ifdef WOLFSSL_KEIL
  187723. "adcs r3, r3, %[r]\n\t"
  187724. #elif defined(__clang__)
  187725. "adcs r3, %[r]\n\t"
  187726. #else
  187727. "adc r3, %[r]\n\t"
  187728. #endif
  187729. "uxth r6, r7\n\t"
  187730. #ifdef WOLFSSL_KEIL
  187731. "muls r5, r6, r5\n\t"
  187732. #elif defined(__clang__)
  187733. "muls r5, r6\n\t"
  187734. #else
  187735. "mul r5, r6\n\t"
  187736. #endif
  187737. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187738. "lsrs r6, r5, #16\n\t"
  187739. #else
  187740. "lsr r6, r5, #16\n\t"
  187741. #endif
  187742. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187743. "lsls r5, r5, #16\n\t"
  187744. #else
  187745. "lsl r5, r5, #16\n\t"
  187746. #endif
  187747. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187748. "adds r4, r4, r5\n\t"
  187749. #else
  187750. "add r4, r4, r5\n\t"
  187751. #endif
  187752. #ifdef WOLFSSL_KEIL
  187753. "adcs r2, r2, r6\n\t"
  187754. #elif defined(__clang__)
  187755. "adcs r2, r6\n\t"
  187756. #else
  187757. "adc r2, r6\n\t"
  187758. #endif
  187759. #ifdef WOLFSSL_KEIL
  187760. "adcs r3, r3, %[r]\n\t"
  187761. #elif defined(__clang__)
  187762. "adcs r3, %[r]\n\t"
  187763. #else
  187764. "adc r3, %[r]\n\t"
  187765. #endif
  187766. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187767. "adds r4, r4, r5\n\t"
  187768. #else
  187769. "add r4, r4, r5\n\t"
  187770. #endif
  187771. #ifdef WOLFSSL_KEIL
  187772. "adcs r2, r2, r6\n\t"
  187773. #elif defined(__clang__)
  187774. "adcs r2, r6\n\t"
  187775. #else
  187776. "adc r2, r6\n\t"
  187777. #endif
  187778. #ifdef WOLFSSL_KEIL
  187779. "adcs r3, r3, %[r]\n\t"
  187780. #elif defined(__clang__)
  187781. "adcs r3, %[r]\n\t"
  187782. #else
  187783. "adc r3, %[r]\n\t"
  187784. #endif
  187785. "mov %[r], r8\n\t"
  187786. "str r4, [%[r], #68]\n\t"
  187787. "movs %[r], #0\n\t"
  187788. "# A[15] * A[3]\n\t"
  187789. "movs r4, #0\n\t"
  187790. "mov %[a], r9\n\t"
  187791. "ldr r7, [%[a], #12]\n\t"
  187792. "mov %[a], lr\n\t"
  187793. "uxth r5, %[a]\n\t"
  187794. "uxth r6, r7\n\t"
  187795. #ifdef WOLFSSL_KEIL
  187796. "muls r6, r5, r6\n\t"
  187797. #elif defined(__clang__)
  187798. "muls r6, r5\n\t"
  187799. #else
  187800. "mul r6, r5\n\t"
  187801. #endif
  187802. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187803. "adds r2, r2, r6\n\t"
  187804. #else
  187805. "add r2, r2, r6\n\t"
  187806. #endif
  187807. #ifdef WOLFSSL_KEIL
  187808. "adcs r3, r3, %[r]\n\t"
  187809. #elif defined(__clang__)
  187810. "adcs r3, %[r]\n\t"
  187811. #else
  187812. "adc r3, %[r]\n\t"
  187813. #endif
  187814. #ifdef WOLFSSL_KEIL
  187815. "adcs r4, r4, %[r]\n\t"
  187816. #elif defined(__clang__)
  187817. "adcs r4, %[r]\n\t"
  187818. #else
  187819. "adc r4, %[r]\n\t"
  187820. #endif
  187821. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187822. "adds r2, r2, r6\n\t"
  187823. #else
  187824. "add r2, r2, r6\n\t"
  187825. #endif
  187826. #ifdef WOLFSSL_KEIL
  187827. "adcs r3, r3, %[r]\n\t"
  187828. #elif defined(__clang__)
  187829. "adcs r3, %[r]\n\t"
  187830. #else
  187831. "adc r3, %[r]\n\t"
  187832. #endif
  187833. #ifdef WOLFSSL_KEIL
  187834. "adcs r4, r4, %[r]\n\t"
  187835. #elif defined(__clang__)
  187836. "adcs r4, %[r]\n\t"
  187837. #else
  187838. "adc r4, %[r]\n\t"
  187839. #endif
  187840. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187841. "lsrs r6, r7, #16\n\t"
  187842. #else
  187843. "lsr r6, r7, #16\n\t"
  187844. #endif
  187845. #ifdef WOLFSSL_KEIL
  187846. "muls r5, r6, r5\n\t"
  187847. #elif defined(__clang__)
  187848. "muls r5, r6\n\t"
  187849. #else
  187850. "mul r5, r6\n\t"
  187851. #endif
  187852. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187853. "lsrs r6, r5, #16\n\t"
  187854. #else
  187855. "lsr r6, r5, #16\n\t"
  187856. #endif
  187857. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187858. "lsls r5, r5, #16\n\t"
  187859. #else
  187860. "lsl r5, r5, #16\n\t"
  187861. #endif
  187862. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187863. "adds r2, r2, r5\n\t"
  187864. #else
  187865. "add r2, r2, r5\n\t"
  187866. #endif
  187867. #ifdef WOLFSSL_KEIL
  187868. "adcs r3, r3, r6\n\t"
  187869. #elif defined(__clang__)
  187870. "adcs r3, r6\n\t"
  187871. #else
  187872. "adc r3, r6\n\t"
  187873. #endif
  187874. #ifdef WOLFSSL_KEIL
  187875. "adcs r4, r4, %[r]\n\t"
  187876. #elif defined(__clang__)
  187877. "adcs r4, %[r]\n\t"
  187878. #else
  187879. "adc r4, %[r]\n\t"
  187880. #endif
  187881. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187882. "adds r2, r2, r5\n\t"
  187883. #else
  187884. "add r2, r2, r5\n\t"
  187885. #endif
  187886. #ifdef WOLFSSL_KEIL
  187887. "adcs r3, r3, r6\n\t"
  187888. #elif defined(__clang__)
  187889. "adcs r3, r6\n\t"
  187890. #else
  187891. "adc r3, r6\n\t"
  187892. #endif
  187893. #ifdef WOLFSSL_KEIL
  187894. "adcs r4, r4, %[r]\n\t"
  187895. #elif defined(__clang__)
  187896. "adcs r4, %[r]\n\t"
  187897. #else
  187898. "adc r4, %[r]\n\t"
  187899. #endif
  187900. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187901. "lsrs r5, %[a], #16\n\t"
  187902. #else
  187903. "lsr r5, %[a], #16\n\t"
  187904. #endif
  187905. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187906. "lsrs r6, r7, #16\n\t"
  187907. #else
  187908. "lsr r6, r7, #16\n\t"
  187909. #endif
  187910. #ifdef WOLFSSL_KEIL
  187911. "muls r6, r5, r6\n\t"
  187912. #elif defined(__clang__)
  187913. "muls r6, r5\n\t"
  187914. #else
  187915. "mul r6, r5\n\t"
  187916. #endif
  187917. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187918. "adds r3, r3, r6\n\t"
  187919. #else
  187920. "add r3, r3, r6\n\t"
  187921. #endif
  187922. #ifdef WOLFSSL_KEIL
  187923. "adcs r4, r4, %[r]\n\t"
  187924. #elif defined(__clang__)
  187925. "adcs r4, %[r]\n\t"
  187926. #else
  187927. "adc r4, %[r]\n\t"
  187928. #endif
  187929. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187930. "adds r3, r3, r6\n\t"
  187931. #else
  187932. "add r3, r3, r6\n\t"
  187933. #endif
  187934. #ifdef WOLFSSL_KEIL
  187935. "adcs r4, r4, %[r]\n\t"
  187936. #elif defined(__clang__)
  187937. "adcs r4, %[r]\n\t"
  187938. #else
  187939. "adc r4, %[r]\n\t"
  187940. #endif
  187941. "uxth r6, r7\n\t"
  187942. #ifdef WOLFSSL_KEIL
  187943. "muls r5, r6, r5\n\t"
  187944. #elif defined(__clang__)
  187945. "muls r5, r6\n\t"
  187946. #else
  187947. "mul r5, r6\n\t"
  187948. #endif
  187949. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187950. "lsrs r6, r5, #16\n\t"
  187951. #else
  187952. "lsr r6, r5, #16\n\t"
  187953. #endif
  187954. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187955. "lsls r5, r5, #16\n\t"
  187956. #else
  187957. "lsl r5, r5, #16\n\t"
  187958. #endif
  187959. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187960. "adds r2, r2, r5\n\t"
  187961. #else
  187962. "add r2, r2, r5\n\t"
  187963. #endif
  187964. #ifdef WOLFSSL_KEIL
  187965. "adcs r3, r3, r6\n\t"
  187966. #elif defined(__clang__)
  187967. "adcs r3, r6\n\t"
  187968. #else
  187969. "adc r3, r6\n\t"
  187970. #endif
  187971. #ifdef WOLFSSL_KEIL
  187972. "adcs r4, r4, %[r]\n\t"
  187973. #elif defined(__clang__)
  187974. "adcs r4, %[r]\n\t"
  187975. #else
  187976. "adc r4, %[r]\n\t"
  187977. #endif
  187978. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187979. "adds r2, r2, r5\n\t"
  187980. #else
  187981. "add r2, r2, r5\n\t"
  187982. #endif
  187983. #ifdef WOLFSSL_KEIL
  187984. "adcs r3, r3, r6\n\t"
  187985. #elif defined(__clang__)
  187986. "adcs r3, r6\n\t"
  187987. #else
  187988. "adc r3, r6\n\t"
  187989. #endif
  187990. #ifdef WOLFSSL_KEIL
  187991. "adcs r4, r4, %[r]\n\t"
  187992. #elif defined(__clang__)
  187993. "adcs r4, %[r]\n\t"
  187994. #else
  187995. "adc r4, %[r]\n\t"
  187996. #endif
  187997. "# A[14] * A[4]\n\t"
  187998. "mov %[a], r9\n\t"
  187999. "ldr r7, [%[a], #16]\n\t"
  188000. "mov %[a], r12\n\t"
  188001. "uxth r5, %[a]\n\t"
  188002. "uxth r6, r7\n\t"
  188003. #ifdef WOLFSSL_KEIL
  188004. "muls r6, r5, r6\n\t"
  188005. #elif defined(__clang__)
  188006. "muls r6, r5\n\t"
  188007. #else
  188008. "mul r6, r5\n\t"
  188009. #endif
  188010. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188011. "adds r2, r2, r6\n\t"
  188012. #else
  188013. "add r2, r2, r6\n\t"
  188014. #endif
  188015. #ifdef WOLFSSL_KEIL
  188016. "adcs r3, r3, %[r]\n\t"
  188017. #elif defined(__clang__)
  188018. "adcs r3, %[r]\n\t"
  188019. #else
  188020. "adc r3, %[r]\n\t"
  188021. #endif
  188022. #ifdef WOLFSSL_KEIL
  188023. "adcs r4, r4, %[r]\n\t"
  188024. #elif defined(__clang__)
  188025. "adcs r4, %[r]\n\t"
  188026. #else
  188027. "adc r4, %[r]\n\t"
  188028. #endif
  188029. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188030. "adds r2, r2, r6\n\t"
  188031. #else
  188032. "add r2, r2, r6\n\t"
  188033. #endif
  188034. #ifdef WOLFSSL_KEIL
  188035. "adcs r3, r3, %[r]\n\t"
  188036. #elif defined(__clang__)
  188037. "adcs r3, %[r]\n\t"
  188038. #else
  188039. "adc r3, %[r]\n\t"
  188040. #endif
  188041. #ifdef WOLFSSL_KEIL
  188042. "adcs r4, r4, %[r]\n\t"
  188043. #elif defined(__clang__)
  188044. "adcs r4, %[r]\n\t"
  188045. #else
  188046. "adc r4, %[r]\n\t"
  188047. #endif
  188048. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188049. "lsrs r6, r7, #16\n\t"
  188050. #else
  188051. "lsr r6, r7, #16\n\t"
  188052. #endif
  188053. #ifdef WOLFSSL_KEIL
  188054. "muls r5, r6, r5\n\t"
  188055. #elif defined(__clang__)
  188056. "muls r5, r6\n\t"
  188057. #else
  188058. "mul r5, r6\n\t"
  188059. #endif
  188060. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188061. "lsrs r6, r5, #16\n\t"
  188062. #else
  188063. "lsr r6, r5, #16\n\t"
  188064. #endif
  188065. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188066. "lsls r5, r5, #16\n\t"
  188067. #else
  188068. "lsl r5, r5, #16\n\t"
  188069. #endif
  188070. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188071. "adds r2, r2, r5\n\t"
  188072. #else
  188073. "add r2, r2, r5\n\t"
  188074. #endif
  188075. #ifdef WOLFSSL_KEIL
  188076. "adcs r3, r3, r6\n\t"
  188077. #elif defined(__clang__)
  188078. "adcs r3, r6\n\t"
  188079. #else
  188080. "adc r3, r6\n\t"
  188081. #endif
  188082. #ifdef WOLFSSL_KEIL
  188083. "adcs r4, r4, %[r]\n\t"
  188084. #elif defined(__clang__)
  188085. "adcs r4, %[r]\n\t"
  188086. #else
  188087. "adc r4, %[r]\n\t"
  188088. #endif
  188089. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188090. "adds r2, r2, r5\n\t"
  188091. #else
  188092. "add r2, r2, r5\n\t"
  188093. #endif
  188094. #ifdef WOLFSSL_KEIL
  188095. "adcs r3, r3, r6\n\t"
  188096. #elif defined(__clang__)
  188097. "adcs r3, r6\n\t"
  188098. #else
  188099. "adc r3, r6\n\t"
  188100. #endif
  188101. #ifdef WOLFSSL_KEIL
  188102. "adcs r4, r4, %[r]\n\t"
  188103. #elif defined(__clang__)
  188104. "adcs r4, %[r]\n\t"
  188105. #else
  188106. "adc r4, %[r]\n\t"
  188107. #endif
  188108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188109. "lsrs r5, %[a], #16\n\t"
  188110. #else
  188111. "lsr r5, %[a], #16\n\t"
  188112. #endif
  188113. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188114. "lsrs r6, r7, #16\n\t"
  188115. #else
  188116. "lsr r6, r7, #16\n\t"
  188117. #endif
  188118. #ifdef WOLFSSL_KEIL
  188119. "muls r6, r5, r6\n\t"
  188120. #elif defined(__clang__)
  188121. "muls r6, r5\n\t"
  188122. #else
  188123. "mul r6, r5\n\t"
  188124. #endif
  188125. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188126. "adds r3, r3, r6\n\t"
  188127. #else
  188128. "add r3, r3, r6\n\t"
  188129. #endif
  188130. #ifdef WOLFSSL_KEIL
  188131. "adcs r4, r4, %[r]\n\t"
  188132. #elif defined(__clang__)
  188133. "adcs r4, %[r]\n\t"
  188134. #else
  188135. "adc r4, %[r]\n\t"
  188136. #endif
  188137. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188138. "adds r3, r3, r6\n\t"
  188139. #else
  188140. "add r3, r3, r6\n\t"
  188141. #endif
  188142. #ifdef WOLFSSL_KEIL
  188143. "adcs r4, r4, %[r]\n\t"
  188144. #elif defined(__clang__)
  188145. "adcs r4, %[r]\n\t"
  188146. #else
  188147. "adc r4, %[r]\n\t"
  188148. #endif
  188149. "uxth r6, r7\n\t"
  188150. #ifdef WOLFSSL_KEIL
  188151. "muls r5, r6, r5\n\t"
  188152. #elif defined(__clang__)
  188153. "muls r5, r6\n\t"
  188154. #else
  188155. "mul r5, r6\n\t"
  188156. #endif
  188157. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188158. "lsrs r6, r5, #16\n\t"
  188159. #else
  188160. "lsr r6, r5, #16\n\t"
  188161. #endif
  188162. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188163. "lsls r5, r5, #16\n\t"
  188164. #else
  188165. "lsl r5, r5, #16\n\t"
  188166. #endif
  188167. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188168. "adds r2, r2, r5\n\t"
  188169. #else
  188170. "add r2, r2, r5\n\t"
  188171. #endif
  188172. #ifdef WOLFSSL_KEIL
  188173. "adcs r3, r3, r6\n\t"
  188174. #elif defined(__clang__)
  188175. "adcs r3, r6\n\t"
  188176. #else
  188177. "adc r3, r6\n\t"
  188178. #endif
  188179. #ifdef WOLFSSL_KEIL
  188180. "adcs r4, r4, %[r]\n\t"
  188181. #elif defined(__clang__)
  188182. "adcs r4, %[r]\n\t"
  188183. #else
  188184. "adc r4, %[r]\n\t"
  188185. #endif
  188186. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188187. "adds r2, r2, r5\n\t"
  188188. #else
  188189. "add r2, r2, r5\n\t"
  188190. #endif
  188191. #ifdef WOLFSSL_KEIL
  188192. "adcs r3, r3, r6\n\t"
  188193. #elif defined(__clang__)
  188194. "adcs r3, r6\n\t"
  188195. #else
  188196. "adc r3, r6\n\t"
  188197. #endif
  188198. #ifdef WOLFSSL_KEIL
  188199. "adcs r4, r4, %[r]\n\t"
  188200. #elif defined(__clang__)
  188201. "adcs r4, %[r]\n\t"
  188202. #else
  188203. "adc r4, %[r]\n\t"
  188204. #endif
  188205. "# A[13] * A[5]\n\t"
  188206. "mov %[a], r9\n\t"
  188207. "ldr r7, [%[a], #20]\n\t"
  188208. "mov %[a], r11\n\t"
  188209. "uxth r5, %[a]\n\t"
  188210. "uxth r6, r7\n\t"
  188211. #ifdef WOLFSSL_KEIL
  188212. "muls r6, r5, r6\n\t"
  188213. #elif defined(__clang__)
  188214. "muls r6, r5\n\t"
  188215. #else
  188216. "mul r6, r5\n\t"
  188217. #endif
  188218. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188219. "adds r2, r2, r6\n\t"
  188220. #else
  188221. "add r2, r2, r6\n\t"
  188222. #endif
  188223. #ifdef WOLFSSL_KEIL
  188224. "adcs r3, r3, %[r]\n\t"
  188225. #elif defined(__clang__)
  188226. "adcs r3, %[r]\n\t"
  188227. #else
  188228. "adc r3, %[r]\n\t"
  188229. #endif
  188230. #ifdef WOLFSSL_KEIL
  188231. "adcs r4, r4, %[r]\n\t"
  188232. #elif defined(__clang__)
  188233. "adcs r4, %[r]\n\t"
  188234. #else
  188235. "adc r4, %[r]\n\t"
  188236. #endif
  188237. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188238. "adds r2, r2, r6\n\t"
  188239. #else
  188240. "add r2, r2, r6\n\t"
  188241. #endif
  188242. #ifdef WOLFSSL_KEIL
  188243. "adcs r3, r3, %[r]\n\t"
  188244. #elif defined(__clang__)
  188245. "adcs r3, %[r]\n\t"
  188246. #else
  188247. "adc r3, %[r]\n\t"
  188248. #endif
  188249. #ifdef WOLFSSL_KEIL
  188250. "adcs r4, r4, %[r]\n\t"
  188251. #elif defined(__clang__)
  188252. "adcs r4, %[r]\n\t"
  188253. #else
  188254. "adc r4, %[r]\n\t"
  188255. #endif
  188256. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188257. "lsrs r6, r7, #16\n\t"
  188258. #else
  188259. "lsr r6, r7, #16\n\t"
  188260. #endif
  188261. #ifdef WOLFSSL_KEIL
  188262. "muls r5, r6, r5\n\t"
  188263. #elif defined(__clang__)
  188264. "muls r5, r6\n\t"
  188265. #else
  188266. "mul r5, r6\n\t"
  188267. #endif
  188268. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188269. "lsrs r6, r5, #16\n\t"
  188270. #else
  188271. "lsr r6, r5, #16\n\t"
  188272. #endif
  188273. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188274. "lsls r5, r5, #16\n\t"
  188275. #else
  188276. "lsl r5, r5, #16\n\t"
  188277. #endif
  188278. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188279. "adds r2, r2, r5\n\t"
  188280. #else
  188281. "add r2, r2, r5\n\t"
  188282. #endif
  188283. #ifdef WOLFSSL_KEIL
  188284. "adcs r3, r3, r6\n\t"
  188285. #elif defined(__clang__)
  188286. "adcs r3, r6\n\t"
  188287. #else
  188288. "adc r3, r6\n\t"
  188289. #endif
  188290. #ifdef WOLFSSL_KEIL
  188291. "adcs r4, r4, %[r]\n\t"
  188292. #elif defined(__clang__)
  188293. "adcs r4, %[r]\n\t"
  188294. #else
  188295. "adc r4, %[r]\n\t"
  188296. #endif
  188297. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188298. "adds r2, r2, r5\n\t"
  188299. #else
  188300. "add r2, r2, r5\n\t"
  188301. #endif
  188302. #ifdef WOLFSSL_KEIL
  188303. "adcs r3, r3, r6\n\t"
  188304. #elif defined(__clang__)
  188305. "adcs r3, r6\n\t"
  188306. #else
  188307. "adc r3, r6\n\t"
  188308. #endif
  188309. #ifdef WOLFSSL_KEIL
  188310. "adcs r4, r4, %[r]\n\t"
  188311. #elif defined(__clang__)
  188312. "adcs r4, %[r]\n\t"
  188313. #else
  188314. "adc r4, %[r]\n\t"
  188315. #endif
  188316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188317. "lsrs r5, %[a], #16\n\t"
  188318. #else
  188319. "lsr r5, %[a], #16\n\t"
  188320. #endif
  188321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188322. "lsrs r6, r7, #16\n\t"
  188323. #else
  188324. "lsr r6, r7, #16\n\t"
  188325. #endif
  188326. #ifdef WOLFSSL_KEIL
  188327. "muls r6, r5, r6\n\t"
  188328. #elif defined(__clang__)
  188329. "muls r6, r5\n\t"
  188330. #else
  188331. "mul r6, r5\n\t"
  188332. #endif
  188333. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188334. "adds r3, r3, r6\n\t"
  188335. #else
  188336. "add r3, r3, r6\n\t"
  188337. #endif
  188338. #ifdef WOLFSSL_KEIL
  188339. "adcs r4, r4, %[r]\n\t"
  188340. #elif defined(__clang__)
  188341. "adcs r4, %[r]\n\t"
  188342. #else
  188343. "adc r4, %[r]\n\t"
  188344. #endif
  188345. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188346. "adds r3, r3, r6\n\t"
  188347. #else
  188348. "add r3, r3, r6\n\t"
  188349. #endif
  188350. #ifdef WOLFSSL_KEIL
  188351. "adcs r4, r4, %[r]\n\t"
  188352. #elif defined(__clang__)
  188353. "adcs r4, %[r]\n\t"
  188354. #else
  188355. "adc r4, %[r]\n\t"
  188356. #endif
  188357. "uxth r6, r7\n\t"
  188358. #ifdef WOLFSSL_KEIL
  188359. "muls r5, r6, r5\n\t"
  188360. #elif defined(__clang__)
  188361. "muls r5, r6\n\t"
  188362. #else
  188363. "mul r5, r6\n\t"
  188364. #endif
  188365. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188366. "lsrs r6, r5, #16\n\t"
  188367. #else
  188368. "lsr r6, r5, #16\n\t"
  188369. #endif
  188370. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188371. "lsls r5, r5, #16\n\t"
  188372. #else
  188373. "lsl r5, r5, #16\n\t"
  188374. #endif
  188375. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188376. "adds r2, r2, r5\n\t"
  188377. #else
  188378. "add r2, r2, r5\n\t"
  188379. #endif
  188380. #ifdef WOLFSSL_KEIL
  188381. "adcs r3, r3, r6\n\t"
  188382. #elif defined(__clang__)
  188383. "adcs r3, r6\n\t"
  188384. #else
  188385. "adc r3, r6\n\t"
  188386. #endif
  188387. #ifdef WOLFSSL_KEIL
  188388. "adcs r4, r4, %[r]\n\t"
  188389. #elif defined(__clang__)
  188390. "adcs r4, %[r]\n\t"
  188391. #else
  188392. "adc r4, %[r]\n\t"
  188393. #endif
  188394. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188395. "adds r2, r2, r5\n\t"
  188396. #else
  188397. "add r2, r2, r5\n\t"
  188398. #endif
  188399. #ifdef WOLFSSL_KEIL
  188400. "adcs r3, r3, r6\n\t"
  188401. #elif defined(__clang__)
  188402. "adcs r3, r6\n\t"
  188403. #else
  188404. "adc r3, r6\n\t"
  188405. #endif
  188406. #ifdef WOLFSSL_KEIL
  188407. "adcs r4, r4, %[r]\n\t"
  188408. #elif defined(__clang__)
  188409. "adcs r4, %[r]\n\t"
  188410. #else
  188411. "adc r4, %[r]\n\t"
  188412. #endif
  188413. "# A[12] * A[6]\n\t"
  188414. "mov %[a], r9\n\t"
  188415. "ldr r7, [%[a], #24]\n\t"
  188416. "mov %[a], r10\n\t"
  188417. "uxth r5, %[a]\n\t"
  188418. "uxth r6, r7\n\t"
  188419. #ifdef WOLFSSL_KEIL
  188420. "muls r6, r5, r6\n\t"
  188421. #elif defined(__clang__)
  188422. "muls r6, r5\n\t"
  188423. #else
  188424. "mul r6, r5\n\t"
  188425. #endif
  188426. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188427. "adds r2, r2, r6\n\t"
  188428. #else
  188429. "add r2, r2, r6\n\t"
  188430. #endif
  188431. #ifdef WOLFSSL_KEIL
  188432. "adcs r3, r3, %[r]\n\t"
  188433. #elif defined(__clang__)
  188434. "adcs r3, %[r]\n\t"
  188435. #else
  188436. "adc r3, %[r]\n\t"
  188437. #endif
  188438. #ifdef WOLFSSL_KEIL
  188439. "adcs r4, r4, %[r]\n\t"
  188440. #elif defined(__clang__)
  188441. "adcs r4, %[r]\n\t"
  188442. #else
  188443. "adc r4, %[r]\n\t"
  188444. #endif
  188445. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188446. "adds r2, r2, r6\n\t"
  188447. #else
  188448. "add r2, r2, r6\n\t"
  188449. #endif
  188450. #ifdef WOLFSSL_KEIL
  188451. "adcs r3, r3, %[r]\n\t"
  188452. #elif defined(__clang__)
  188453. "adcs r3, %[r]\n\t"
  188454. #else
  188455. "adc r3, %[r]\n\t"
  188456. #endif
  188457. #ifdef WOLFSSL_KEIL
  188458. "adcs r4, r4, %[r]\n\t"
  188459. #elif defined(__clang__)
  188460. "adcs r4, %[r]\n\t"
  188461. #else
  188462. "adc r4, %[r]\n\t"
  188463. #endif
  188464. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188465. "lsrs r6, r7, #16\n\t"
  188466. #else
  188467. "lsr r6, r7, #16\n\t"
  188468. #endif
  188469. #ifdef WOLFSSL_KEIL
  188470. "muls r5, r6, r5\n\t"
  188471. #elif defined(__clang__)
  188472. "muls r5, r6\n\t"
  188473. #else
  188474. "mul r5, r6\n\t"
  188475. #endif
  188476. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188477. "lsrs r6, r5, #16\n\t"
  188478. #else
  188479. "lsr r6, r5, #16\n\t"
  188480. #endif
  188481. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188482. "lsls r5, r5, #16\n\t"
  188483. #else
  188484. "lsl r5, r5, #16\n\t"
  188485. #endif
  188486. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188487. "adds r2, r2, r5\n\t"
  188488. #else
  188489. "add r2, r2, r5\n\t"
  188490. #endif
  188491. #ifdef WOLFSSL_KEIL
  188492. "adcs r3, r3, r6\n\t"
  188493. #elif defined(__clang__)
  188494. "adcs r3, r6\n\t"
  188495. #else
  188496. "adc r3, r6\n\t"
  188497. #endif
  188498. #ifdef WOLFSSL_KEIL
  188499. "adcs r4, r4, %[r]\n\t"
  188500. #elif defined(__clang__)
  188501. "adcs r4, %[r]\n\t"
  188502. #else
  188503. "adc r4, %[r]\n\t"
  188504. #endif
  188505. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188506. "adds r2, r2, r5\n\t"
  188507. #else
  188508. "add r2, r2, r5\n\t"
  188509. #endif
  188510. #ifdef WOLFSSL_KEIL
  188511. "adcs r3, r3, r6\n\t"
  188512. #elif defined(__clang__)
  188513. "adcs r3, r6\n\t"
  188514. #else
  188515. "adc r3, r6\n\t"
  188516. #endif
  188517. #ifdef WOLFSSL_KEIL
  188518. "adcs r4, r4, %[r]\n\t"
  188519. #elif defined(__clang__)
  188520. "adcs r4, %[r]\n\t"
  188521. #else
  188522. "adc r4, %[r]\n\t"
  188523. #endif
  188524. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188525. "lsrs r5, %[a], #16\n\t"
  188526. #else
  188527. "lsr r5, %[a], #16\n\t"
  188528. #endif
  188529. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188530. "lsrs r6, r7, #16\n\t"
  188531. #else
  188532. "lsr r6, r7, #16\n\t"
  188533. #endif
  188534. #ifdef WOLFSSL_KEIL
  188535. "muls r6, r5, r6\n\t"
  188536. #elif defined(__clang__)
  188537. "muls r6, r5\n\t"
  188538. #else
  188539. "mul r6, r5\n\t"
  188540. #endif
  188541. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188542. "adds r3, r3, r6\n\t"
  188543. #else
  188544. "add r3, r3, r6\n\t"
  188545. #endif
  188546. #ifdef WOLFSSL_KEIL
  188547. "adcs r4, r4, %[r]\n\t"
  188548. #elif defined(__clang__)
  188549. "adcs r4, %[r]\n\t"
  188550. #else
  188551. "adc r4, %[r]\n\t"
  188552. #endif
  188553. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188554. "adds r3, r3, r6\n\t"
  188555. #else
  188556. "add r3, r3, r6\n\t"
  188557. #endif
  188558. #ifdef WOLFSSL_KEIL
  188559. "adcs r4, r4, %[r]\n\t"
  188560. #elif defined(__clang__)
  188561. "adcs r4, %[r]\n\t"
  188562. #else
  188563. "adc r4, %[r]\n\t"
  188564. #endif
  188565. "uxth r6, r7\n\t"
  188566. #ifdef WOLFSSL_KEIL
  188567. "muls r5, r6, r5\n\t"
  188568. #elif defined(__clang__)
  188569. "muls r5, r6\n\t"
  188570. #else
  188571. "mul r5, r6\n\t"
  188572. #endif
  188573. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188574. "lsrs r6, r5, #16\n\t"
  188575. #else
  188576. "lsr r6, r5, #16\n\t"
  188577. #endif
  188578. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188579. "lsls r5, r5, #16\n\t"
  188580. #else
  188581. "lsl r5, r5, #16\n\t"
  188582. #endif
  188583. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188584. "adds r2, r2, r5\n\t"
  188585. #else
  188586. "add r2, r2, r5\n\t"
  188587. #endif
  188588. #ifdef WOLFSSL_KEIL
  188589. "adcs r3, r3, r6\n\t"
  188590. #elif defined(__clang__)
  188591. "adcs r3, r6\n\t"
  188592. #else
  188593. "adc r3, r6\n\t"
  188594. #endif
  188595. #ifdef WOLFSSL_KEIL
  188596. "adcs r4, r4, %[r]\n\t"
  188597. #elif defined(__clang__)
  188598. "adcs r4, %[r]\n\t"
  188599. #else
  188600. "adc r4, %[r]\n\t"
  188601. #endif
  188602. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188603. "adds r2, r2, r5\n\t"
  188604. #else
  188605. "add r2, r2, r5\n\t"
  188606. #endif
  188607. #ifdef WOLFSSL_KEIL
  188608. "adcs r3, r3, r6\n\t"
  188609. #elif defined(__clang__)
  188610. "adcs r3, r6\n\t"
  188611. #else
  188612. "adc r3, r6\n\t"
  188613. #endif
  188614. #ifdef WOLFSSL_KEIL
  188615. "adcs r4, r4, %[r]\n\t"
  188616. #elif defined(__clang__)
  188617. "adcs r4, %[r]\n\t"
  188618. #else
  188619. "adc r4, %[r]\n\t"
  188620. #endif
  188621. "# A[11] * A[7]\n\t"
  188622. "mov %[a], r9\n\t"
  188623. "ldr r7, [%[a], #28]\n\t"
  188624. "ldr %[a], [%[a], #44]\n\t"
  188625. "uxth r5, %[a]\n\t"
  188626. "uxth r6, r7\n\t"
  188627. #ifdef WOLFSSL_KEIL
  188628. "muls r6, r5, r6\n\t"
  188629. #elif defined(__clang__)
  188630. "muls r6, r5\n\t"
  188631. #else
  188632. "mul r6, r5\n\t"
  188633. #endif
  188634. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188635. "adds r2, r2, r6\n\t"
  188636. #else
  188637. "add r2, r2, r6\n\t"
  188638. #endif
  188639. #ifdef WOLFSSL_KEIL
  188640. "adcs r3, r3, %[r]\n\t"
  188641. #elif defined(__clang__)
  188642. "adcs r3, %[r]\n\t"
  188643. #else
  188644. "adc r3, %[r]\n\t"
  188645. #endif
  188646. #ifdef WOLFSSL_KEIL
  188647. "adcs r4, r4, %[r]\n\t"
  188648. #elif defined(__clang__)
  188649. "adcs r4, %[r]\n\t"
  188650. #else
  188651. "adc r4, %[r]\n\t"
  188652. #endif
  188653. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188654. "adds r2, r2, r6\n\t"
  188655. #else
  188656. "add r2, r2, r6\n\t"
  188657. #endif
  188658. #ifdef WOLFSSL_KEIL
  188659. "adcs r3, r3, %[r]\n\t"
  188660. #elif defined(__clang__)
  188661. "adcs r3, %[r]\n\t"
  188662. #else
  188663. "adc r3, %[r]\n\t"
  188664. #endif
  188665. #ifdef WOLFSSL_KEIL
  188666. "adcs r4, r4, %[r]\n\t"
  188667. #elif defined(__clang__)
  188668. "adcs r4, %[r]\n\t"
  188669. #else
  188670. "adc r4, %[r]\n\t"
  188671. #endif
  188672. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188673. "lsrs r6, r7, #16\n\t"
  188674. #else
  188675. "lsr r6, r7, #16\n\t"
  188676. #endif
  188677. #ifdef WOLFSSL_KEIL
  188678. "muls r5, r6, r5\n\t"
  188679. #elif defined(__clang__)
  188680. "muls r5, r6\n\t"
  188681. #else
  188682. "mul r5, r6\n\t"
  188683. #endif
  188684. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188685. "lsrs r6, r5, #16\n\t"
  188686. #else
  188687. "lsr r6, r5, #16\n\t"
  188688. #endif
  188689. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188690. "lsls r5, r5, #16\n\t"
  188691. #else
  188692. "lsl r5, r5, #16\n\t"
  188693. #endif
  188694. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188695. "adds r2, r2, r5\n\t"
  188696. #else
  188697. "add r2, r2, r5\n\t"
  188698. #endif
  188699. #ifdef WOLFSSL_KEIL
  188700. "adcs r3, r3, r6\n\t"
  188701. #elif defined(__clang__)
  188702. "adcs r3, r6\n\t"
  188703. #else
  188704. "adc r3, r6\n\t"
  188705. #endif
  188706. #ifdef WOLFSSL_KEIL
  188707. "adcs r4, r4, %[r]\n\t"
  188708. #elif defined(__clang__)
  188709. "adcs r4, %[r]\n\t"
  188710. #else
  188711. "adc r4, %[r]\n\t"
  188712. #endif
  188713. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188714. "adds r2, r2, r5\n\t"
  188715. #else
  188716. "add r2, r2, r5\n\t"
  188717. #endif
  188718. #ifdef WOLFSSL_KEIL
  188719. "adcs r3, r3, r6\n\t"
  188720. #elif defined(__clang__)
  188721. "adcs r3, r6\n\t"
  188722. #else
  188723. "adc r3, r6\n\t"
  188724. #endif
  188725. #ifdef WOLFSSL_KEIL
  188726. "adcs r4, r4, %[r]\n\t"
  188727. #elif defined(__clang__)
  188728. "adcs r4, %[r]\n\t"
  188729. #else
  188730. "adc r4, %[r]\n\t"
  188731. #endif
  188732. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188733. "lsrs r5, %[a], #16\n\t"
  188734. #else
  188735. "lsr r5, %[a], #16\n\t"
  188736. #endif
  188737. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188738. "lsrs r6, r7, #16\n\t"
  188739. #else
  188740. "lsr r6, r7, #16\n\t"
  188741. #endif
  188742. #ifdef WOLFSSL_KEIL
  188743. "muls r6, r5, r6\n\t"
  188744. #elif defined(__clang__)
  188745. "muls r6, r5\n\t"
  188746. #else
  188747. "mul r6, r5\n\t"
  188748. #endif
  188749. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188750. "adds r3, r3, r6\n\t"
  188751. #else
  188752. "add r3, r3, r6\n\t"
  188753. #endif
  188754. #ifdef WOLFSSL_KEIL
  188755. "adcs r4, r4, %[r]\n\t"
  188756. #elif defined(__clang__)
  188757. "adcs r4, %[r]\n\t"
  188758. #else
  188759. "adc r4, %[r]\n\t"
  188760. #endif
  188761. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188762. "adds r3, r3, r6\n\t"
  188763. #else
  188764. "add r3, r3, r6\n\t"
  188765. #endif
  188766. #ifdef WOLFSSL_KEIL
  188767. "adcs r4, r4, %[r]\n\t"
  188768. #elif defined(__clang__)
  188769. "adcs r4, %[r]\n\t"
  188770. #else
  188771. "adc r4, %[r]\n\t"
  188772. #endif
  188773. "uxth r6, r7\n\t"
  188774. #ifdef WOLFSSL_KEIL
  188775. "muls r5, r6, r5\n\t"
  188776. #elif defined(__clang__)
  188777. "muls r5, r6\n\t"
  188778. #else
  188779. "mul r5, r6\n\t"
  188780. #endif
  188781. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188782. "lsrs r6, r5, #16\n\t"
  188783. #else
  188784. "lsr r6, r5, #16\n\t"
  188785. #endif
  188786. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188787. "lsls r5, r5, #16\n\t"
  188788. #else
  188789. "lsl r5, r5, #16\n\t"
  188790. #endif
  188791. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188792. "adds r2, r2, r5\n\t"
  188793. #else
  188794. "add r2, r2, r5\n\t"
  188795. #endif
  188796. #ifdef WOLFSSL_KEIL
  188797. "adcs r3, r3, r6\n\t"
  188798. #elif defined(__clang__)
  188799. "adcs r3, r6\n\t"
  188800. #else
  188801. "adc r3, r6\n\t"
  188802. #endif
  188803. #ifdef WOLFSSL_KEIL
  188804. "adcs r4, r4, %[r]\n\t"
  188805. #elif defined(__clang__)
  188806. "adcs r4, %[r]\n\t"
  188807. #else
  188808. "adc r4, %[r]\n\t"
  188809. #endif
  188810. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188811. "adds r2, r2, r5\n\t"
  188812. #else
  188813. "add r2, r2, r5\n\t"
  188814. #endif
  188815. #ifdef WOLFSSL_KEIL
  188816. "adcs r3, r3, r6\n\t"
  188817. #elif defined(__clang__)
  188818. "adcs r3, r6\n\t"
  188819. #else
  188820. "adc r3, r6\n\t"
  188821. #endif
  188822. #ifdef WOLFSSL_KEIL
  188823. "adcs r4, r4, %[r]\n\t"
  188824. #elif defined(__clang__)
  188825. "adcs r4, %[r]\n\t"
  188826. #else
  188827. "adc r4, %[r]\n\t"
  188828. #endif
  188829. "# A[10] * A[8]\n\t"
  188830. "mov %[a], r9\n\t"
  188831. "ldr r7, [%[a], #32]\n\t"
  188832. "ldr %[a], [%[a], #40]\n\t"
  188833. "uxth r5, %[a]\n\t"
  188834. "uxth r6, r7\n\t"
  188835. #ifdef WOLFSSL_KEIL
  188836. "muls r6, r5, r6\n\t"
  188837. #elif defined(__clang__)
  188838. "muls r6, r5\n\t"
  188839. #else
  188840. "mul r6, r5\n\t"
  188841. #endif
  188842. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188843. "adds r2, r2, r6\n\t"
  188844. #else
  188845. "add r2, r2, r6\n\t"
  188846. #endif
  188847. #ifdef WOLFSSL_KEIL
  188848. "adcs r3, r3, %[r]\n\t"
  188849. #elif defined(__clang__)
  188850. "adcs r3, %[r]\n\t"
  188851. #else
  188852. "adc r3, %[r]\n\t"
  188853. #endif
  188854. #ifdef WOLFSSL_KEIL
  188855. "adcs r4, r4, %[r]\n\t"
  188856. #elif defined(__clang__)
  188857. "adcs r4, %[r]\n\t"
  188858. #else
  188859. "adc r4, %[r]\n\t"
  188860. #endif
  188861. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188862. "adds r2, r2, r6\n\t"
  188863. #else
  188864. "add r2, r2, r6\n\t"
  188865. #endif
  188866. #ifdef WOLFSSL_KEIL
  188867. "adcs r3, r3, %[r]\n\t"
  188868. #elif defined(__clang__)
  188869. "adcs r3, %[r]\n\t"
  188870. #else
  188871. "adc r3, %[r]\n\t"
  188872. #endif
  188873. #ifdef WOLFSSL_KEIL
  188874. "adcs r4, r4, %[r]\n\t"
  188875. #elif defined(__clang__)
  188876. "adcs r4, %[r]\n\t"
  188877. #else
  188878. "adc r4, %[r]\n\t"
  188879. #endif
  188880. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188881. "lsrs r6, r7, #16\n\t"
  188882. #else
  188883. "lsr r6, r7, #16\n\t"
  188884. #endif
  188885. #ifdef WOLFSSL_KEIL
  188886. "muls r5, r6, r5\n\t"
  188887. #elif defined(__clang__)
  188888. "muls r5, r6\n\t"
  188889. #else
  188890. "mul r5, r6\n\t"
  188891. #endif
  188892. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188893. "lsrs r6, r5, #16\n\t"
  188894. #else
  188895. "lsr r6, r5, #16\n\t"
  188896. #endif
  188897. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188898. "lsls r5, r5, #16\n\t"
  188899. #else
  188900. "lsl r5, r5, #16\n\t"
  188901. #endif
  188902. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188903. "adds r2, r2, r5\n\t"
  188904. #else
  188905. "add r2, r2, r5\n\t"
  188906. #endif
  188907. #ifdef WOLFSSL_KEIL
  188908. "adcs r3, r3, r6\n\t"
  188909. #elif defined(__clang__)
  188910. "adcs r3, r6\n\t"
  188911. #else
  188912. "adc r3, r6\n\t"
  188913. #endif
  188914. #ifdef WOLFSSL_KEIL
  188915. "adcs r4, r4, %[r]\n\t"
  188916. #elif defined(__clang__)
  188917. "adcs r4, %[r]\n\t"
  188918. #else
  188919. "adc r4, %[r]\n\t"
  188920. #endif
  188921. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188922. "adds r2, r2, r5\n\t"
  188923. #else
  188924. "add r2, r2, r5\n\t"
  188925. #endif
  188926. #ifdef WOLFSSL_KEIL
  188927. "adcs r3, r3, r6\n\t"
  188928. #elif defined(__clang__)
  188929. "adcs r3, r6\n\t"
  188930. #else
  188931. "adc r3, r6\n\t"
  188932. #endif
  188933. #ifdef WOLFSSL_KEIL
  188934. "adcs r4, r4, %[r]\n\t"
  188935. #elif defined(__clang__)
  188936. "adcs r4, %[r]\n\t"
  188937. #else
  188938. "adc r4, %[r]\n\t"
  188939. #endif
  188940. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188941. "lsrs r5, %[a], #16\n\t"
  188942. #else
  188943. "lsr r5, %[a], #16\n\t"
  188944. #endif
  188945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188946. "lsrs r6, r7, #16\n\t"
  188947. #else
  188948. "lsr r6, r7, #16\n\t"
  188949. #endif
  188950. #ifdef WOLFSSL_KEIL
  188951. "muls r6, r5, r6\n\t"
  188952. #elif defined(__clang__)
  188953. "muls r6, r5\n\t"
  188954. #else
  188955. "mul r6, r5\n\t"
  188956. #endif
  188957. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188958. "adds r3, r3, r6\n\t"
  188959. #else
  188960. "add r3, r3, r6\n\t"
  188961. #endif
  188962. #ifdef WOLFSSL_KEIL
  188963. "adcs r4, r4, %[r]\n\t"
  188964. #elif defined(__clang__)
  188965. "adcs r4, %[r]\n\t"
  188966. #else
  188967. "adc r4, %[r]\n\t"
  188968. #endif
  188969. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188970. "adds r3, r3, r6\n\t"
  188971. #else
  188972. "add r3, r3, r6\n\t"
  188973. #endif
  188974. #ifdef WOLFSSL_KEIL
  188975. "adcs r4, r4, %[r]\n\t"
  188976. #elif defined(__clang__)
  188977. "adcs r4, %[r]\n\t"
  188978. #else
  188979. "adc r4, %[r]\n\t"
  188980. #endif
  188981. "uxth r6, r7\n\t"
  188982. #ifdef WOLFSSL_KEIL
  188983. "muls r5, r6, r5\n\t"
  188984. #elif defined(__clang__)
  188985. "muls r5, r6\n\t"
  188986. #else
  188987. "mul r5, r6\n\t"
  188988. #endif
  188989. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188990. "lsrs r6, r5, #16\n\t"
  188991. #else
  188992. "lsr r6, r5, #16\n\t"
  188993. #endif
  188994. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188995. "lsls r5, r5, #16\n\t"
  188996. #else
  188997. "lsl r5, r5, #16\n\t"
  188998. #endif
  188999. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189000. "adds r2, r2, r5\n\t"
  189001. #else
  189002. "add r2, r2, r5\n\t"
  189003. #endif
  189004. #ifdef WOLFSSL_KEIL
  189005. "adcs r3, r3, r6\n\t"
  189006. #elif defined(__clang__)
  189007. "adcs r3, r6\n\t"
  189008. #else
  189009. "adc r3, r6\n\t"
  189010. #endif
  189011. #ifdef WOLFSSL_KEIL
  189012. "adcs r4, r4, %[r]\n\t"
  189013. #elif defined(__clang__)
  189014. "adcs r4, %[r]\n\t"
  189015. #else
  189016. "adc r4, %[r]\n\t"
  189017. #endif
  189018. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189019. "adds r2, r2, r5\n\t"
  189020. #else
  189021. "add r2, r2, r5\n\t"
  189022. #endif
  189023. #ifdef WOLFSSL_KEIL
  189024. "adcs r3, r3, r6\n\t"
  189025. #elif defined(__clang__)
  189026. "adcs r3, r6\n\t"
  189027. #else
  189028. "adc r3, r6\n\t"
  189029. #endif
  189030. #ifdef WOLFSSL_KEIL
  189031. "adcs r4, r4, %[r]\n\t"
  189032. #elif defined(__clang__)
  189033. "adcs r4, %[r]\n\t"
  189034. #else
  189035. "adc r4, %[r]\n\t"
  189036. #endif
  189037. "# A[9] * A[9]\n\t"
  189038. "mov %[a], r9\n\t"
  189039. "ldr r7, [%[a], #36]\n\t"
  189040. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189041. "lsrs r6, r7, #16\n\t"
  189042. #else
  189043. "lsr r6, r7, #16\n\t"
  189044. #endif
  189045. "uxth r5, r7\n\t"
  189046. #ifdef WOLFSSL_KEIL
  189047. "muls r5, r5, r5\n\t"
  189048. #elif defined(__clang__)
  189049. "muls r5, r5\n\t"
  189050. #else
  189051. "mul r5, r5\n\t"
  189052. #endif
  189053. #ifdef WOLFSSL_KEIL
  189054. "muls r6, r6, r6\n\t"
  189055. #elif defined(__clang__)
  189056. "muls r6, r6\n\t"
  189057. #else
  189058. "mul r6, r6\n\t"
  189059. #endif
  189060. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189061. "adds r2, r2, r5\n\t"
  189062. #else
  189063. "add r2, r2, r5\n\t"
  189064. #endif
  189065. #ifdef WOLFSSL_KEIL
  189066. "adcs r3, r3, r6\n\t"
  189067. #elif defined(__clang__)
  189068. "adcs r3, r6\n\t"
  189069. #else
  189070. "adc r3, r6\n\t"
  189071. #endif
  189072. #ifdef WOLFSSL_KEIL
  189073. "adcs r4, r4, %[r]\n\t"
  189074. #elif defined(__clang__)
  189075. "adcs r4, %[r]\n\t"
  189076. #else
  189077. "adc r4, %[r]\n\t"
  189078. #endif
  189079. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189080. "lsrs r6, r7, #16\n\t"
  189081. #else
  189082. "lsr r6, r7, #16\n\t"
  189083. #endif
  189084. "uxth r5, r7\n\t"
  189085. #ifdef WOLFSSL_KEIL
  189086. "muls r5, r6, r5\n\t"
  189087. #elif defined(__clang__)
  189088. "muls r5, r6\n\t"
  189089. #else
  189090. "mul r5, r6\n\t"
  189091. #endif
  189092. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189093. "lsrs r6, r5, #15\n\t"
  189094. #else
  189095. "lsr r6, r5, #15\n\t"
  189096. #endif
  189097. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189098. "lsls r5, r5, #17\n\t"
  189099. #else
  189100. "lsl r5, r5, #17\n\t"
  189101. #endif
  189102. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189103. "adds r2, r2, r5\n\t"
  189104. #else
  189105. "add r2, r2, r5\n\t"
  189106. #endif
  189107. #ifdef WOLFSSL_KEIL
  189108. "adcs r3, r3, r6\n\t"
  189109. #elif defined(__clang__)
  189110. "adcs r3, r6\n\t"
  189111. #else
  189112. "adc r3, r6\n\t"
  189113. #endif
  189114. #ifdef WOLFSSL_KEIL
  189115. "adcs r4, r4, %[r]\n\t"
  189116. #elif defined(__clang__)
  189117. "adcs r4, %[r]\n\t"
  189118. #else
  189119. "adc r4, %[r]\n\t"
  189120. #endif
  189121. "mov %[r], r8\n\t"
  189122. "str r2, [%[r], #72]\n\t"
  189123. "movs %[r], #0\n\t"
  189124. "# A[10] * A[9]\n\t"
  189125. "movs r2, #0\n\t"
  189126. "ldr %[a], [%[a], #40]\n\t"
  189127. "uxth r5, %[a]\n\t"
  189128. "uxth r6, r7\n\t"
  189129. #ifdef WOLFSSL_KEIL
  189130. "muls r6, r5, r6\n\t"
  189131. #elif defined(__clang__)
  189132. "muls r6, r5\n\t"
  189133. #else
  189134. "mul r6, r5\n\t"
  189135. #endif
  189136. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189137. "adds r3, r3, r6\n\t"
  189138. #else
  189139. "add r3, r3, r6\n\t"
  189140. #endif
  189141. #ifdef WOLFSSL_KEIL
  189142. "adcs r4, r4, %[r]\n\t"
  189143. #elif defined(__clang__)
  189144. "adcs r4, %[r]\n\t"
  189145. #else
  189146. "adc r4, %[r]\n\t"
  189147. #endif
  189148. #ifdef WOLFSSL_KEIL
  189149. "adcs r2, r2, %[r]\n\t"
  189150. #elif defined(__clang__)
  189151. "adcs r2, %[r]\n\t"
  189152. #else
  189153. "adc r2, %[r]\n\t"
  189154. #endif
  189155. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189156. "adds r3, r3, r6\n\t"
  189157. #else
  189158. "add r3, r3, r6\n\t"
  189159. #endif
  189160. #ifdef WOLFSSL_KEIL
  189161. "adcs r4, r4, %[r]\n\t"
  189162. #elif defined(__clang__)
  189163. "adcs r4, %[r]\n\t"
  189164. #else
  189165. "adc r4, %[r]\n\t"
  189166. #endif
  189167. #ifdef WOLFSSL_KEIL
  189168. "adcs r2, r2, %[r]\n\t"
  189169. #elif defined(__clang__)
  189170. "adcs r2, %[r]\n\t"
  189171. #else
  189172. "adc r2, %[r]\n\t"
  189173. #endif
  189174. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189175. "lsrs r6, r7, #16\n\t"
  189176. #else
  189177. "lsr r6, r7, #16\n\t"
  189178. #endif
  189179. #ifdef WOLFSSL_KEIL
  189180. "muls r5, r6, r5\n\t"
  189181. #elif defined(__clang__)
  189182. "muls r5, r6\n\t"
  189183. #else
  189184. "mul r5, r6\n\t"
  189185. #endif
  189186. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189187. "lsrs r6, r5, #16\n\t"
  189188. #else
  189189. "lsr r6, r5, #16\n\t"
  189190. #endif
  189191. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189192. "lsls r5, r5, #16\n\t"
  189193. #else
  189194. "lsl r5, r5, #16\n\t"
  189195. #endif
  189196. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189197. "adds r3, r3, r5\n\t"
  189198. #else
  189199. "add r3, r3, r5\n\t"
  189200. #endif
  189201. #ifdef WOLFSSL_KEIL
  189202. "adcs r4, r4, r6\n\t"
  189203. #elif defined(__clang__)
  189204. "adcs r4, r6\n\t"
  189205. #else
  189206. "adc r4, r6\n\t"
  189207. #endif
  189208. #ifdef WOLFSSL_KEIL
  189209. "adcs r2, r2, %[r]\n\t"
  189210. #elif defined(__clang__)
  189211. "adcs r2, %[r]\n\t"
  189212. #else
  189213. "adc r2, %[r]\n\t"
  189214. #endif
  189215. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189216. "adds r3, r3, r5\n\t"
  189217. #else
  189218. "add r3, r3, r5\n\t"
  189219. #endif
  189220. #ifdef WOLFSSL_KEIL
  189221. "adcs r4, r4, r6\n\t"
  189222. #elif defined(__clang__)
  189223. "adcs r4, r6\n\t"
  189224. #else
  189225. "adc r4, r6\n\t"
  189226. #endif
  189227. #ifdef WOLFSSL_KEIL
  189228. "adcs r2, r2, %[r]\n\t"
  189229. #elif defined(__clang__)
  189230. "adcs r2, %[r]\n\t"
  189231. #else
  189232. "adc r2, %[r]\n\t"
  189233. #endif
  189234. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189235. "lsrs r5, %[a], #16\n\t"
  189236. #else
  189237. "lsr r5, %[a], #16\n\t"
  189238. #endif
  189239. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189240. "lsrs r6, r7, #16\n\t"
  189241. #else
  189242. "lsr r6, r7, #16\n\t"
  189243. #endif
  189244. #ifdef WOLFSSL_KEIL
  189245. "muls r6, r5, r6\n\t"
  189246. #elif defined(__clang__)
  189247. "muls r6, r5\n\t"
  189248. #else
  189249. "mul r6, r5\n\t"
  189250. #endif
  189251. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189252. "adds r4, r4, r6\n\t"
  189253. #else
  189254. "add r4, r4, r6\n\t"
  189255. #endif
  189256. #ifdef WOLFSSL_KEIL
  189257. "adcs r2, r2, %[r]\n\t"
  189258. #elif defined(__clang__)
  189259. "adcs r2, %[r]\n\t"
  189260. #else
  189261. "adc r2, %[r]\n\t"
  189262. #endif
  189263. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189264. "adds r4, r4, r6\n\t"
  189265. #else
  189266. "add r4, r4, r6\n\t"
  189267. #endif
  189268. #ifdef WOLFSSL_KEIL
  189269. "adcs r2, r2, %[r]\n\t"
  189270. #elif defined(__clang__)
  189271. "adcs r2, %[r]\n\t"
  189272. #else
  189273. "adc r2, %[r]\n\t"
  189274. #endif
  189275. "uxth r6, r7\n\t"
  189276. #ifdef WOLFSSL_KEIL
  189277. "muls r5, r6, r5\n\t"
  189278. #elif defined(__clang__)
  189279. "muls r5, r6\n\t"
  189280. #else
  189281. "mul r5, r6\n\t"
  189282. #endif
  189283. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189284. "lsrs r6, r5, #16\n\t"
  189285. #else
  189286. "lsr r6, r5, #16\n\t"
  189287. #endif
  189288. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189289. "lsls r5, r5, #16\n\t"
  189290. #else
  189291. "lsl r5, r5, #16\n\t"
  189292. #endif
  189293. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189294. "adds r3, r3, r5\n\t"
  189295. #else
  189296. "add r3, r3, r5\n\t"
  189297. #endif
  189298. #ifdef WOLFSSL_KEIL
  189299. "adcs r4, r4, r6\n\t"
  189300. #elif defined(__clang__)
  189301. "adcs r4, r6\n\t"
  189302. #else
  189303. "adc r4, r6\n\t"
  189304. #endif
  189305. #ifdef WOLFSSL_KEIL
  189306. "adcs r2, r2, %[r]\n\t"
  189307. #elif defined(__clang__)
  189308. "adcs r2, %[r]\n\t"
  189309. #else
  189310. "adc r2, %[r]\n\t"
  189311. #endif
  189312. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189313. "adds r3, r3, r5\n\t"
  189314. #else
  189315. "add r3, r3, r5\n\t"
  189316. #endif
  189317. #ifdef WOLFSSL_KEIL
  189318. "adcs r4, r4, r6\n\t"
  189319. #elif defined(__clang__)
  189320. "adcs r4, r6\n\t"
  189321. #else
  189322. "adc r4, r6\n\t"
  189323. #endif
  189324. #ifdef WOLFSSL_KEIL
  189325. "adcs r2, r2, %[r]\n\t"
  189326. #elif defined(__clang__)
  189327. "adcs r2, %[r]\n\t"
  189328. #else
  189329. "adc r2, %[r]\n\t"
  189330. #endif
  189331. "# A[11] * A[8]\n\t"
  189332. "mov %[a], r9\n\t"
  189333. "ldr r7, [%[a], #32]\n\t"
  189334. "ldr %[a], [%[a], #44]\n\t"
  189335. "uxth r5, %[a]\n\t"
  189336. "uxth r6, r7\n\t"
  189337. #ifdef WOLFSSL_KEIL
  189338. "muls r6, r5, r6\n\t"
  189339. #elif defined(__clang__)
  189340. "muls r6, r5\n\t"
  189341. #else
  189342. "mul r6, r5\n\t"
  189343. #endif
  189344. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189345. "adds r3, r3, r6\n\t"
  189346. #else
  189347. "add r3, r3, r6\n\t"
  189348. #endif
  189349. #ifdef WOLFSSL_KEIL
  189350. "adcs r4, r4, %[r]\n\t"
  189351. #elif defined(__clang__)
  189352. "adcs r4, %[r]\n\t"
  189353. #else
  189354. "adc r4, %[r]\n\t"
  189355. #endif
  189356. #ifdef WOLFSSL_KEIL
  189357. "adcs r2, r2, %[r]\n\t"
  189358. #elif defined(__clang__)
  189359. "adcs r2, %[r]\n\t"
  189360. #else
  189361. "adc r2, %[r]\n\t"
  189362. #endif
  189363. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189364. "adds r3, r3, r6\n\t"
  189365. #else
  189366. "add r3, r3, r6\n\t"
  189367. #endif
  189368. #ifdef WOLFSSL_KEIL
  189369. "adcs r4, r4, %[r]\n\t"
  189370. #elif defined(__clang__)
  189371. "adcs r4, %[r]\n\t"
  189372. #else
  189373. "adc r4, %[r]\n\t"
  189374. #endif
  189375. #ifdef WOLFSSL_KEIL
  189376. "adcs r2, r2, %[r]\n\t"
  189377. #elif defined(__clang__)
  189378. "adcs r2, %[r]\n\t"
  189379. #else
  189380. "adc r2, %[r]\n\t"
  189381. #endif
  189382. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189383. "lsrs r6, r7, #16\n\t"
  189384. #else
  189385. "lsr r6, r7, #16\n\t"
  189386. #endif
  189387. #ifdef WOLFSSL_KEIL
  189388. "muls r5, r6, r5\n\t"
  189389. #elif defined(__clang__)
  189390. "muls r5, r6\n\t"
  189391. #else
  189392. "mul r5, r6\n\t"
  189393. #endif
  189394. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189395. "lsrs r6, r5, #16\n\t"
  189396. #else
  189397. "lsr r6, r5, #16\n\t"
  189398. #endif
  189399. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189400. "lsls r5, r5, #16\n\t"
  189401. #else
  189402. "lsl r5, r5, #16\n\t"
  189403. #endif
  189404. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189405. "adds r3, r3, r5\n\t"
  189406. #else
  189407. "add r3, r3, r5\n\t"
  189408. #endif
  189409. #ifdef WOLFSSL_KEIL
  189410. "adcs r4, r4, r6\n\t"
  189411. #elif defined(__clang__)
  189412. "adcs r4, r6\n\t"
  189413. #else
  189414. "adc r4, r6\n\t"
  189415. #endif
  189416. #ifdef WOLFSSL_KEIL
  189417. "adcs r2, r2, %[r]\n\t"
  189418. #elif defined(__clang__)
  189419. "adcs r2, %[r]\n\t"
  189420. #else
  189421. "adc r2, %[r]\n\t"
  189422. #endif
  189423. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189424. "adds r3, r3, r5\n\t"
  189425. #else
  189426. "add r3, r3, r5\n\t"
  189427. #endif
  189428. #ifdef WOLFSSL_KEIL
  189429. "adcs r4, r4, r6\n\t"
  189430. #elif defined(__clang__)
  189431. "adcs r4, r6\n\t"
  189432. #else
  189433. "adc r4, r6\n\t"
  189434. #endif
  189435. #ifdef WOLFSSL_KEIL
  189436. "adcs r2, r2, %[r]\n\t"
  189437. #elif defined(__clang__)
  189438. "adcs r2, %[r]\n\t"
  189439. #else
  189440. "adc r2, %[r]\n\t"
  189441. #endif
  189442. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189443. "lsrs r5, %[a], #16\n\t"
  189444. #else
  189445. "lsr r5, %[a], #16\n\t"
  189446. #endif
  189447. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189448. "lsrs r6, r7, #16\n\t"
  189449. #else
  189450. "lsr r6, r7, #16\n\t"
  189451. #endif
  189452. #ifdef WOLFSSL_KEIL
  189453. "muls r6, r5, r6\n\t"
  189454. #elif defined(__clang__)
  189455. "muls r6, r5\n\t"
  189456. #else
  189457. "mul r6, r5\n\t"
  189458. #endif
  189459. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189460. "adds r4, r4, r6\n\t"
  189461. #else
  189462. "add r4, r4, r6\n\t"
  189463. #endif
  189464. #ifdef WOLFSSL_KEIL
  189465. "adcs r2, r2, %[r]\n\t"
  189466. #elif defined(__clang__)
  189467. "adcs r2, %[r]\n\t"
  189468. #else
  189469. "adc r2, %[r]\n\t"
  189470. #endif
  189471. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189472. "adds r4, r4, r6\n\t"
  189473. #else
  189474. "add r4, r4, r6\n\t"
  189475. #endif
  189476. #ifdef WOLFSSL_KEIL
  189477. "adcs r2, r2, %[r]\n\t"
  189478. #elif defined(__clang__)
  189479. "adcs r2, %[r]\n\t"
  189480. #else
  189481. "adc r2, %[r]\n\t"
  189482. #endif
  189483. "uxth r6, r7\n\t"
  189484. #ifdef WOLFSSL_KEIL
  189485. "muls r5, r6, r5\n\t"
  189486. #elif defined(__clang__)
  189487. "muls r5, r6\n\t"
  189488. #else
  189489. "mul r5, r6\n\t"
  189490. #endif
  189491. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189492. "lsrs r6, r5, #16\n\t"
  189493. #else
  189494. "lsr r6, r5, #16\n\t"
  189495. #endif
  189496. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189497. "lsls r5, r5, #16\n\t"
  189498. #else
  189499. "lsl r5, r5, #16\n\t"
  189500. #endif
  189501. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189502. "adds r3, r3, r5\n\t"
  189503. #else
  189504. "add r3, r3, r5\n\t"
  189505. #endif
  189506. #ifdef WOLFSSL_KEIL
  189507. "adcs r4, r4, r6\n\t"
  189508. #elif defined(__clang__)
  189509. "adcs r4, r6\n\t"
  189510. #else
  189511. "adc r4, r6\n\t"
  189512. #endif
  189513. #ifdef WOLFSSL_KEIL
  189514. "adcs r2, r2, %[r]\n\t"
  189515. #elif defined(__clang__)
  189516. "adcs r2, %[r]\n\t"
  189517. #else
  189518. "adc r2, %[r]\n\t"
  189519. #endif
  189520. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189521. "adds r3, r3, r5\n\t"
  189522. #else
  189523. "add r3, r3, r5\n\t"
  189524. #endif
  189525. #ifdef WOLFSSL_KEIL
  189526. "adcs r4, r4, r6\n\t"
  189527. #elif defined(__clang__)
  189528. "adcs r4, r6\n\t"
  189529. #else
  189530. "adc r4, r6\n\t"
  189531. #endif
  189532. #ifdef WOLFSSL_KEIL
  189533. "adcs r2, r2, %[r]\n\t"
  189534. #elif defined(__clang__)
  189535. "adcs r2, %[r]\n\t"
  189536. #else
  189537. "adc r2, %[r]\n\t"
  189538. #endif
  189539. "# A[12] * A[7]\n\t"
  189540. "mov %[a], r9\n\t"
  189541. "ldr r7, [%[a], #28]\n\t"
  189542. "mov %[a], r10\n\t"
  189543. "uxth r5, %[a]\n\t"
  189544. "uxth r6, r7\n\t"
  189545. #ifdef WOLFSSL_KEIL
  189546. "muls r6, r5, r6\n\t"
  189547. #elif defined(__clang__)
  189548. "muls r6, r5\n\t"
  189549. #else
  189550. "mul r6, r5\n\t"
  189551. #endif
  189552. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189553. "adds r3, r3, r6\n\t"
  189554. #else
  189555. "add r3, r3, r6\n\t"
  189556. #endif
  189557. #ifdef WOLFSSL_KEIL
  189558. "adcs r4, r4, %[r]\n\t"
  189559. #elif defined(__clang__)
  189560. "adcs r4, %[r]\n\t"
  189561. #else
  189562. "adc r4, %[r]\n\t"
  189563. #endif
  189564. #ifdef WOLFSSL_KEIL
  189565. "adcs r2, r2, %[r]\n\t"
  189566. #elif defined(__clang__)
  189567. "adcs r2, %[r]\n\t"
  189568. #else
  189569. "adc r2, %[r]\n\t"
  189570. #endif
  189571. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189572. "adds r3, r3, r6\n\t"
  189573. #else
  189574. "add r3, r3, r6\n\t"
  189575. #endif
  189576. #ifdef WOLFSSL_KEIL
  189577. "adcs r4, r4, %[r]\n\t"
  189578. #elif defined(__clang__)
  189579. "adcs r4, %[r]\n\t"
  189580. #else
  189581. "adc r4, %[r]\n\t"
  189582. #endif
  189583. #ifdef WOLFSSL_KEIL
  189584. "adcs r2, r2, %[r]\n\t"
  189585. #elif defined(__clang__)
  189586. "adcs r2, %[r]\n\t"
  189587. #else
  189588. "adc r2, %[r]\n\t"
  189589. #endif
  189590. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189591. "lsrs r6, r7, #16\n\t"
  189592. #else
  189593. "lsr r6, r7, #16\n\t"
  189594. #endif
  189595. #ifdef WOLFSSL_KEIL
  189596. "muls r5, r6, r5\n\t"
  189597. #elif defined(__clang__)
  189598. "muls r5, r6\n\t"
  189599. #else
  189600. "mul r5, r6\n\t"
  189601. #endif
  189602. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189603. "lsrs r6, r5, #16\n\t"
  189604. #else
  189605. "lsr r6, r5, #16\n\t"
  189606. #endif
  189607. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189608. "lsls r5, r5, #16\n\t"
  189609. #else
  189610. "lsl r5, r5, #16\n\t"
  189611. #endif
  189612. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189613. "adds r3, r3, r5\n\t"
  189614. #else
  189615. "add r3, r3, r5\n\t"
  189616. #endif
  189617. #ifdef WOLFSSL_KEIL
  189618. "adcs r4, r4, r6\n\t"
  189619. #elif defined(__clang__)
  189620. "adcs r4, r6\n\t"
  189621. #else
  189622. "adc r4, r6\n\t"
  189623. #endif
  189624. #ifdef WOLFSSL_KEIL
  189625. "adcs r2, r2, %[r]\n\t"
  189626. #elif defined(__clang__)
  189627. "adcs r2, %[r]\n\t"
  189628. #else
  189629. "adc r2, %[r]\n\t"
  189630. #endif
  189631. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189632. "adds r3, r3, r5\n\t"
  189633. #else
  189634. "add r3, r3, r5\n\t"
  189635. #endif
  189636. #ifdef WOLFSSL_KEIL
  189637. "adcs r4, r4, r6\n\t"
  189638. #elif defined(__clang__)
  189639. "adcs r4, r6\n\t"
  189640. #else
  189641. "adc r4, r6\n\t"
  189642. #endif
  189643. #ifdef WOLFSSL_KEIL
  189644. "adcs r2, r2, %[r]\n\t"
  189645. #elif defined(__clang__)
  189646. "adcs r2, %[r]\n\t"
  189647. #else
  189648. "adc r2, %[r]\n\t"
  189649. #endif
  189650. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189651. "lsrs r5, %[a], #16\n\t"
  189652. #else
  189653. "lsr r5, %[a], #16\n\t"
  189654. #endif
  189655. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189656. "lsrs r6, r7, #16\n\t"
  189657. #else
  189658. "lsr r6, r7, #16\n\t"
  189659. #endif
  189660. #ifdef WOLFSSL_KEIL
  189661. "muls r6, r5, r6\n\t"
  189662. #elif defined(__clang__)
  189663. "muls r6, r5\n\t"
  189664. #else
  189665. "mul r6, r5\n\t"
  189666. #endif
  189667. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189668. "adds r4, r4, r6\n\t"
  189669. #else
  189670. "add r4, r4, r6\n\t"
  189671. #endif
  189672. #ifdef WOLFSSL_KEIL
  189673. "adcs r2, r2, %[r]\n\t"
  189674. #elif defined(__clang__)
  189675. "adcs r2, %[r]\n\t"
  189676. #else
  189677. "adc r2, %[r]\n\t"
  189678. #endif
  189679. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189680. "adds r4, r4, r6\n\t"
  189681. #else
  189682. "add r4, r4, r6\n\t"
  189683. #endif
  189684. #ifdef WOLFSSL_KEIL
  189685. "adcs r2, r2, %[r]\n\t"
  189686. #elif defined(__clang__)
  189687. "adcs r2, %[r]\n\t"
  189688. #else
  189689. "adc r2, %[r]\n\t"
  189690. #endif
  189691. "uxth r6, r7\n\t"
  189692. #ifdef WOLFSSL_KEIL
  189693. "muls r5, r6, r5\n\t"
  189694. #elif defined(__clang__)
  189695. "muls r5, r6\n\t"
  189696. #else
  189697. "mul r5, r6\n\t"
  189698. #endif
  189699. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189700. "lsrs r6, r5, #16\n\t"
  189701. #else
  189702. "lsr r6, r5, #16\n\t"
  189703. #endif
  189704. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189705. "lsls r5, r5, #16\n\t"
  189706. #else
  189707. "lsl r5, r5, #16\n\t"
  189708. #endif
  189709. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189710. "adds r3, r3, r5\n\t"
  189711. #else
  189712. "add r3, r3, r5\n\t"
  189713. #endif
  189714. #ifdef WOLFSSL_KEIL
  189715. "adcs r4, r4, r6\n\t"
  189716. #elif defined(__clang__)
  189717. "adcs r4, r6\n\t"
  189718. #else
  189719. "adc r4, r6\n\t"
  189720. #endif
  189721. #ifdef WOLFSSL_KEIL
  189722. "adcs r2, r2, %[r]\n\t"
  189723. #elif defined(__clang__)
  189724. "adcs r2, %[r]\n\t"
  189725. #else
  189726. "adc r2, %[r]\n\t"
  189727. #endif
  189728. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189729. "adds r3, r3, r5\n\t"
  189730. #else
  189731. "add r3, r3, r5\n\t"
  189732. #endif
  189733. #ifdef WOLFSSL_KEIL
  189734. "adcs r4, r4, r6\n\t"
  189735. #elif defined(__clang__)
  189736. "adcs r4, r6\n\t"
  189737. #else
  189738. "adc r4, r6\n\t"
  189739. #endif
  189740. #ifdef WOLFSSL_KEIL
  189741. "adcs r2, r2, %[r]\n\t"
  189742. #elif defined(__clang__)
  189743. "adcs r2, %[r]\n\t"
  189744. #else
  189745. "adc r2, %[r]\n\t"
  189746. #endif
  189747. "# A[13] * A[6]\n\t"
  189748. "mov %[a], r9\n\t"
  189749. "ldr r7, [%[a], #24]\n\t"
  189750. "mov %[a], r11\n\t"
  189751. "uxth r5, %[a]\n\t"
  189752. "uxth r6, r7\n\t"
  189753. #ifdef WOLFSSL_KEIL
  189754. "muls r6, r5, r6\n\t"
  189755. #elif defined(__clang__)
  189756. "muls r6, r5\n\t"
  189757. #else
  189758. "mul r6, r5\n\t"
  189759. #endif
  189760. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189761. "adds r3, r3, r6\n\t"
  189762. #else
  189763. "add r3, r3, r6\n\t"
  189764. #endif
  189765. #ifdef WOLFSSL_KEIL
  189766. "adcs r4, r4, %[r]\n\t"
  189767. #elif defined(__clang__)
  189768. "adcs r4, %[r]\n\t"
  189769. #else
  189770. "adc r4, %[r]\n\t"
  189771. #endif
  189772. #ifdef WOLFSSL_KEIL
  189773. "adcs r2, r2, %[r]\n\t"
  189774. #elif defined(__clang__)
  189775. "adcs r2, %[r]\n\t"
  189776. #else
  189777. "adc r2, %[r]\n\t"
  189778. #endif
  189779. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189780. "adds r3, r3, r6\n\t"
  189781. #else
  189782. "add r3, r3, r6\n\t"
  189783. #endif
  189784. #ifdef WOLFSSL_KEIL
  189785. "adcs r4, r4, %[r]\n\t"
  189786. #elif defined(__clang__)
  189787. "adcs r4, %[r]\n\t"
  189788. #else
  189789. "adc r4, %[r]\n\t"
  189790. #endif
  189791. #ifdef WOLFSSL_KEIL
  189792. "adcs r2, r2, %[r]\n\t"
  189793. #elif defined(__clang__)
  189794. "adcs r2, %[r]\n\t"
  189795. #else
  189796. "adc r2, %[r]\n\t"
  189797. #endif
  189798. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189799. "lsrs r6, r7, #16\n\t"
  189800. #else
  189801. "lsr r6, r7, #16\n\t"
  189802. #endif
  189803. #ifdef WOLFSSL_KEIL
  189804. "muls r5, r6, r5\n\t"
  189805. #elif defined(__clang__)
  189806. "muls r5, r6\n\t"
  189807. #else
  189808. "mul r5, r6\n\t"
  189809. #endif
  189810. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189811. "lsrs r6, r5, #16\n\t"
  189812. #else
  189813. "lsr r6, r5, #16\n\t"
  189814. #endif
  189815. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189816. "lsls r5, r5, #16\n\t"
  189817. #else
  189818. "lsl r5, r5, #16\n\t"
  189819. #endif
  189820. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189821. "adds r3, r3, r5\n\t"
  189822. #else
  189823. "add r3, r3, r5\n\t"
  189824. #endif
  189825. #ifdef WOLFSSL_KEIL
  189826. "adcs r4, r4, r6\n\t"
  189827. #elif defined(__clang__)
  189828. "adcs r4, r6\n\t"
  189829. #else
  189830. "adc r4, r6\n\t"
  189831. #endif
  189832. #ifdef WOLFSSL_KEIL
  189833. "adcs r2, r2, %[r]\n\t"
  189834. #elif defined(__clang__)
  189835. "adcs r2, %[r]\n\t"
  189836. #else
  189837. "adc r2, %[r]\n\t"
  189838. #endif
  189839. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189840. "adds r3, r3, r5\n\t"
  189841. #else
  189842. "add r3, r3, r5\n\t"
  189843. #endif
  189844. #ifdef WOLFSSL_KEIL
  189845. "adcs r4, r4, r6\n\t"
  189846. #elif defined(__clang__)
  189847. "adcs r4, r6\n\t"
  189848. #else
  189849. "adc r4, r6\n\t"
  189850. #endif
  189851. #ifdef WOLFSSL_KEIL
  189852. "adcs r2, r2, %[r]\n\t"
  189853. #elif defined(__clang__)
  189854. "adcs r2, %[r]\n\t"
  189855. #else
  189856. "adc r2, %[r]\n\t"
  189857. #endif
  189858. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189859. "lsrs r5, %[a], #16\n\t"
  189860. #else
  189861. "lsr r5, %[a], #16\n\t"
  189862. #endif
  189863. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189864. "lsrs r6, r7, #16\n\t"
  189865. #else
  189866. "lsr r6, r7, #16\n\t"
  189867. #endif
  189868. #ifdef WOLFSSL_KEIL
  189869. "muls r6, r5, r6\n\t"
  189870. #elif defined(__clang__)
  189871. "muls r6, r5\n\t"
  189872. #else
  189873. "mul r6, r5\n\t"
  189874. #endif
  189875. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189876. "adds r4, r4, r6\n\t"
  189877. #else
  189878. "add r4, r4, r6\n\t"
  189879. #endif
  189880. #ifdef WOLFSSL_KEIL
  189881. "adcs r2, r2, %[r]\n\t"
  189882. #elif defined(__clang__)
  189883. "adcs r2, %[r]\n\t"
  189884. #else
  189885. "adc r2, %[r]\n\t"
  189886. #endif
  189887. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189888. "adds r4, r4, r6\n\t"
  189889. #else
  189890. "add r4, r4, r6\n\t"
  189891. #endif
  189892. #ifdef WOLFSSL_KEIL
  189893. "adcs r2, r2, %[r]\n\t"
  189894. #elif defined(__clang__)
  189895. "adcs r2, %[r]\n\t"
  189896. #else
  189897. "adc r2, %[r]\n\t"
  189898. #endif
  189899. "uxth r6, r7\n\t"
  189900. #ifdef WOLFSSL_KEIL
  189901. "muls r5, r6, r5\n\t"
  189902. #elif defined(__clang__)
  189903. "muls r5, r6\n\t"
  189904. #else
  189905. "mul r5, r6\n\t"
  189906. #endif
  189907. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189908. "lsrs r6, r5, #16\n\t"
  189909. #else
  189910. "lsr r6, r5, #16\n\t"
  189911. #endif
  189912. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189913. "lsls r5, r5, #16\n\t"
  189914. #else
  189915. "lsl r5, r5, #16\n\t"
  189916. #endif
  189917. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189918. "adds r3, r3, r5\n\t"
  189919. #else
  189920. "add r3, r3, r5\n\t"
  189921. #endif
  189922. #ifdef WOLFSSL_KEIL
  189923. "adcs r4, r4, r6\n\t"
  189924. #elif defined(__clang__)
  189925. "adcs r4, r6\n\t"
  189926. #else
  189927. "adc r4, r6\n\t"
  189928. #endif
  189929. #ifdef WOLFSSL_KEIL
  189930. "adcs r2, r2, %[r]\n\t"
  189931. #elif defined(__clang__)
  189932. "adcs r2, %[r]\n\t"
  189933. #else
  189934. "adc r2, %[r]\n\t"
  189935. #endif
  189936. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189937. "adds r3, r3, r5\n\t"
  189938. #else
  189939. "add r3, r3, r5\n\t"
  189940. #endif
  189941. #ifdef WOLFSSL_KEIL
  189942. "adcs r4, r4, r6\n\t"
  189943. #elif defined(__clang__)
  189944. "adcs r4, r6\n\t"
  189945. #else
  189946. "adc r4, r6\n\t"
  189947. #endif
  189948. #ifdef WOLFSSL_KEIL
  189949. "adcs r2, r2, %[r]\n\t"
  189950. #elif defined(__clang__)
  189951. "adcs r2, %[r]\n\t"
  189952. #else
  189953. "adc r2, %[r]\n\t"
  189954. #endif
  189955. "# A[14] * A[5]\n\t"
  189956. "mov %[a], r9\n\t"
  189957. "ldr r7, [%[a], #20]\n\t"
  189958. "mov %[a], r12\n\t"
  189959. "uxth r5, %[a]\n\t"
  189960. "uxth r6, r7\n\t"
  189961. #ifdef WOLFSSL_KEIL
  189962. "muls r6, r5, r6\n\t"
  189963. #elif defined(__clang__)
  189964. "muls r6, r5\n\t"
  189965. #else
  189966. "mul r6, r5\n\t"
  189967. #endif
  189968. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189969. "adds r3, r3, r6\n\t"
  189970. #else
  189971. "add r3, r3, r6\n\t"
  189972. #endif
  189973. #ifdef WOLFSSL_KEIL
  189974. "adcs r4, r4, %[r]\n\t"
  189975. #elif defined(__clang__)
  189976. "adcs r4, %[r]\n\t"
  189977. #else
  189978. "adc r4, %[r]\n\t"
  189979. #endif
  189980. #ifdef WOLFSSL_KEIL
  189981. "adcs r2, r2, %[r]\n\t"
  189982. #elif defined(__clang__)
  189983. "adcs r2, %[r]\n\t"
  189984. #else
  189985. "adc r2, %[r]\n\t"
  189986. #endif
  189987. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189988. "adds r3, r3, r6\n\t"
  189989. #else
  189990. "add r3, r3, r6\n\t"
  189991. #endif
  189992. #ifdef WOLFSSL_KEIL
  189993. "adcs r4, r4, %[r]\n\t"
  189994. #elif defined(__clang__)
  189995. "adcs r4, %[r]\n\t"
  189996. #else
  189997. "adc r4, %[r]\n\t"
  189998. #endif
  189999. #ifdef WOLFSSL_KEIL
  190000. "adcs r2, r2, %[r]\n\t"
  190001. #elif defined(__clang__)
  190002. "adcs r2, %[r]\n\t"
  190003. #else
  190004. "adc r2, %[r]\n\t"
  190005. #endif
  190006. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190007. "lsrs r6, r7, #16\n\t"
  190008. #else
  190009. "lsr r6, r7, #16\n\t"
  190010. #endif
  190011. #ifdef WOLFSSL_KEIL
  190012. "muls r5, r6, r5\n\t"
  190013. #elif defined(__clang__)
  190014. "muls r5, r6\n\t"
  190015. #else
  190016. "mul r5, r6\n\t"
  190017. #endif
  190018. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190019. "lsrs r6, r5, #16\n\t"
  190020. #else
  190021. "lsr r6, r5, #16\n\t"
  190022. #endif
  190023. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190024. "lsls r5, r5, #16\n\t"
  190025. #else
  190026. "lsl r5, r5, #16\n\t"
  190027. #endif
  190028. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190029. "adds r3, r3, r5\n\t"
  190030. #else
  190031. "add r3, r3, r5\n\t"
  190032. #endif
  190033. #ifdef WOLFSSL_KEIL
  190034. "adcs r4, r4, r6\n\t"
  190035. #elif defined(__clang__)
  190036. "adcs r4, r6\n\t"
  190037. #else
  190038. "adc r4, r6\n\t"
  190039. #endif
  190040. #ifdef WOLFSSL_KEIL
  190041. "adcs r2, r2, %[r]\n\t"
  190042. #elif defined(__clang__)
  190043. "adcs r2, %[r]\n\t"
  190044. #else
  190045. "adc r2, %[r]\n\t"
  190046. #endif
  190047. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190048. "adds r3, r3, r5\n\t"
  190049. #else
  190050. "add r3, r3, r5\n\t"
  190051. #endif
  190052. #ifdef WOLFSSL_KEIL
  190053. "adcs r4, r4, r6\n\t"
  190054. #elif defined(__clang__)
  190055. "adcs r4, r6\n\t"
  190056. #else
  190057. "adc r4, r6\n\t"
  190058. #endif
  190059. #ifdef WOLFSSL_KEIL
  190060. "adcs r2, r2, %[r]\n\t"
  190061. #elif defined(__clang__)
  190062. "adcs r2, %[r]\n\t"
  190063. #else
  190064. "adc r2, %[r]\n\t"
  190065. #endif
  190066. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190067. "lsrs r5, %[a], #16\n\t"
  190068. #else
  190069. "lsr r5, %[a], #16\n\t"
  190070. #endif
  190071. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190072. "lsrs r6, r7, #16\n\t"
  190073. #else
  190074. "lsr r6, r7, #16\n\t"
  190075. #endif
  190076. #ifdef WOLFSSL_KEIL
  190077. "muls r6, r5, r6\n\t"
  190078. #elif defined(__clang__)
  190079. "muls r6, r5\n\t"
  190080. #else
  190081. "mul r6, r5\n\t"
  190082. #endif
  190083. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190084. "adds r4, r4, r6\n\t"
  190085. #else
  190086. "add r4, r4, r6\n\t"
  190087. #endif
  190088. #ifdef WOLFSSL_KEIL
  190089. "adcs r2, r2, %[r]\n\t"
  190090. #elif defined(__clang__)
  190091. "adcs r2, %[r]\n\t"
  190092. #else
  190093. "adc r2, %[r]\n\t"
  190094. #endif
  190095. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190096. "adds r4, r4, r6\n\t"
  190097. #else
  190098. "add r4, r4, r6\n\t"
  190099. #endif
  190100. #ifdef WOLFSSL_KEIL
  190101. "adcs r2, r2, %[r]\n\t"
  190102. #elif defined(__clang__)
  190103. "adcs r2, %[r]\n\t"
  190104. #else
  190105. "adc r2, %[r]\n\t"
  190106. #endif
  190107. "uxth r6, r7\n\t"
  190108. #ifdef WOLFSSL_KEIL
  190109. "muls r5, r6, r5\n\t"
  190110. #elif defined(__clang__)
  190111. "muls r5, r6\n\t"
  190112. #else
  190113. "mul r5, r6\n\t"
  190114. #endif
  190115. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190116. "lsrs r6, r5, #16\n\t"
  190117. #else
  190118. "lsr r6, r5, #16\n\t"
  190119. #endif
  190120. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190121. "lsls r5, r5, #16\n\t"
  190122. #else
  190123. "lsl r5, r5, #16\n\t"
  190124. #endif
  190125. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190126. "adds r3, r3, r5\n\t"
  190127. #else
  190128. "add r3, r3, r5\n\t"
  190129. #endif
  190130. #ifdef WOLFSSL_KEIL
  190131. "adcs r4, r4, r6\n\t"
  190132. #elif defined(__clang__)
  190133. "adcs r4, r6\n\t"
  190134. #else
  190135. "adc r4, r6\n\t"
  190136. #endif
  190137. #ifdef WOLFSSL_KEIL
  190138. "adcs r2, r2, %[r]\n\t"
  190139. #elif defined(__clang__)
  190140. "adcs r2, %[r]\n\t"
  190141. #else
  190142. "adc r2, %[r]\n\t"
  190143. #endif
  190144. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190145. "adds r3, r3, r5\n\t"
  190146. #else
  190147. "add r3, r3, r5\n\t"
  190148. #endif
  190149. #ifdef WOLFSSL_KEIL
  190150. "adcs r4, r4, r6\n\t"
  190151. #elif defined(__clang__)
  190152. "adcs r4, r6\n\t"
  190153. #else
  190154. "adc r4, r6\n\t"
  190155. #endif
  190156. #ifdef WOLFSSL_KEIL
  190157. "adcs r2, r2, %[r]\n\t"
  190158. #elif defined(__clang__)
  190159. "adcs r2, %[r]\n\t"
  190160. #else
  190161. "adc r2, %[r]\n\t"
  190162. #endif
  190163. "# A[15] * A[4]\n\t"
  190164. "mov %[a], r9\n\t"
  190165. "ldr r7, [%[a], #16]\n\t"
  190166. "mov %[a], lr\n\t"
  190167. "uxth r5, %[a]\n\t"
  190168. "uxth r6, r7\n\t"
  190169. #ifdef WOLFSSL_KEIL
  190170. "muls r6, r5, r6\n\t"
  190171. #elif defined(__clang__)
  190172. "muls r6, r5\n\t"
  190173. #else
  190174. "mul r6, r5\n\t"
  190175. #endif
  190176. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190177. "adds r3, r3, r6\n\t"
  190178. #else
  190179. "add r3, r3, r6\n\t"
  190180. #endif
  190181. #ifdef WOLFSSL_KEIL
  190182. "adcs r4, r4, %[r]\n\t"
  190183. #elif defined(__clang__)
  190184. "adcs r4, %[r]\n\t"
  190185. #else
  190186. "adc r4, %[r]\n\t"
  190187. #endif
  190188. #ifdef WOLFSSL_KEIL
  190189. "adcs r2, r2, %[r]\n\t"
  190190. #elif defined(__clang__)
  190191. "adcs r2, %[r]\n\t"
  190192. #else
  190193. "adc r2, %[r]\n\t"
  190194. #endif
  190195. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190196. "adds r3, r3, r6\n\t"
  190197. #else
  190198. "add r3, r3, r6\n\t"
  190199. #endif
  190200. #ifdef WOLFSSL_KEIL
  190201. "adcs r4, r4, %[r]\n\t"
  190202. #elif defined(__clang__)
  190203. "adcs r4, %[r]\n\t"
  190204. #else
  190205. "adc r4, %[r]\n\t"
  190206. #endif
  190207. #ifdef WOLFSSL_KEIL
  190208. "adcs r2, r2, %[r]\n\t"
  190209. #elif defined(__clang__)
  190210. "adcs r2, %[r]\n\t"
  190211. #else
  190212. "adc r2, %[r]\n\t"
  190213. #endif
  190214. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190215. "lsrs r6, r7, #16\n\t"
  190216. #else
  190217. "lsr r6, r7, #16\n\t"
  190218. #endif
  190219. #ifdef WOLFSSL_KEIL
  190220. "muls r5, r6, r5\n\t"
  190221. #elif defined(__clang__)
  190222. "muls r5, r6\n\t"
  190223. #else
  190224. "mul r5, r6\n\t"
  190225. #endif
  190226. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190227. "lsrs r6, r5, #16\n\t"
  190228. #else
  190229. "lsr r6, r5, #16\n\t"
  190230. #endif
  190231. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190232. "lsls r5, r5, #16\n\t"
  190233. #else
  190234. "lsl r5, r5, #16\n\t"
  190235. #endif
  190236. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190237. "adds r3, r3, r5\n\t"
  190238. #else
  190239. "add r3, r3, r5\n\t"
  190240. #endif
  190241. #ifdef WOLFSSL_KEIL
  190242. "adcs r4, r4, r6\n\t"
  190243. #elif defined(__clang__)
  190244. "adcs r4, r6\n\t"
  190245. #else
  190246. "adc r4, r6\n\t"
  190247. #endif
  190248. #ifdef WOLFSSL_KEIL
  190249. "adcs r2, r2, %[r]\n\t"
  190250. #elif defined(__clang__)
  190251. "adcs r2, %[r]\n\t"
  190252. #else
  190253. "adc r2, %[r]\n\t"
  190254. #endif
  190255. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190256. "adds r3, r3, r5\n\t"
  190257. #else
  190258. "add r3, r3, r5\n\t"
  190259. #endif
  190260. #ifdef WOLFSSL_KEIL
  190261. "adcs r4, r4, r6\n\t"
  190262. #elif defined(__clang__)
  190263. "adcs r4, r6\n\t"
  190264. #else
  190265. "adc r4, r6\n\t"
  190266. #endif
  190267. #ifdef WOLFSSL_KEIL
  190268. "adcs r2, r2, %[r]\n\t"
  190269. #elif defined(__clang__)
  190270. "adcs r2, %[r]\n\t"
  190271. #else
  190272. "adc r2, %[r]\n\t"
  190273. #endif
  190274. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190275. "lsrs r5, %[a], #16\n\t"
  190276. #else
  190277. "lsr r5, %[a], #16\n\t"
  190278. #endif
  190279. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190280. "lsrs r6, r7, #16\n\t"
  190281. #else
  190282. "lsr r6, r7, #16\n\t"
  190283. #endif
  190284. #ifdef WOLFSSL_KEIL
  190285. "muls r6, r5, r6\n\t"
  190286. #elif defined(__clang__)
  190287. "muls r6, r5\n\t"
  190288. #else
  190289. "mul r6, r5\n\t"
  190290. #endif
  190291. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190292. "adds r4, r4, r6\n\t"
  190293. #else
  190294. "add r4, r4, r6\n\t"
  190295. #endif
  190296. #ifdef WOLFSSL_KEIL
  190297. "adcs r2, r2, %[r]\n\t"
  190298. #elif defined(__clang__)
  190299. "adcs r2, %[r]\n\t"
  190300. #else
  190301. "adc r2, %[r]\n\t"
  190302. #endif
  190303. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190304. "adds r4, r4, r6\n\t"
  190305. #else
  190306. "add r4, r4, r6\n\t"
  190307. #endif
  190308. #ifdef WOLFSSL_KEIL
  190309. "adcs r2, r2, %[r]\n\t"
  190310. #elif defined(__clang__)
  190311. "adcs r2, %[r]\n\t"
  190312. #else
  190313. "adc r2, %[r]\n\t"
  190314. #endif
  190315. "uxth r6, r7\n\t"
  190316. #ifdef WOLFSSL_KEIL
  190317. "muls r5, r6, r5\n\t"
  190318. #elif defined(__clang__)
  190319. "muls r5, r6\n\t"
  190320. #else
  190321. "mul r5, r6\n\t"
  190322. #endif
  190323. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190324. "lsrs r6, r5, #16\n\t"
  190325. #else
  190326. "lsr r6, r5, #16\n\t"
  190327. #endif
  190328. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190329. "lsls r5, r5, #16\n\t"
  190330. #else
  190331. "lsl r5, r5, #16\n\t"
  190332. #endif
  190333. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190334. "adds r3, r3, r5\n\t"
  190335. #else
  190336. "add r3, r3, r5\n\t"
  190337. #endif
  190338. #ifdef WOLFSSL_KEIL
  190339. "adcs r4, r4, r6\n\t"
  190340. #elif defined(__clang__)
  190341. "adcs r4, r6\n\t"
  190342. #else
  190343. "adc r4, r6\n\t"
  190344. #endif
  190345. #ifdef WOLFSSL_KEIL
  190346. "adcs r2, r2, %[r]\n\t"
  190347. #elif defined(__clang__)
  190348. "adcs r2, %[r]\n\t"
  190349. #else
  190350. "adc r2, %[r]\n\t"
  190351. #endif
  190352. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190353. "adds r3, r3, r5\n\t"
  190354. #else
  190355. "add r3, r3, r5\n\t"
  190356. #endif
  190357. #ifdef WOLFSSL_KEIL
  190358. "adcs r4, r4, r6\n\t"
  190359. #elif defined(__clang__)
  190360. "adcs r4, r6\n\t"
  190361. #else
  190362. "adc r4, r6\n\t"
  190363. #endif
  190364. #ifdef WOLFSSL_KEIL
  190365. "adcs r2, r2, %[r]\n\t"
  190366. #elif defined(__clang__)
  190367. "adcs r2, %[r]\n\t"
  190368. #else
  190369. "adc r2, %[r]\n\t"
  190370. #endif
  190371. "mov %[r], r8\n\t"
  190372. "str r3, [%[r], #76]\n\t"
  190373. "movs %[r], #0\n\t"
  190374. "# A[15] * A[5]\n\t"
  190375. "movs r3, #0\n\t"
  190376. "mov %[a], r9\n\t"
  190377. "ldr r7, [%[a], #20]\n\t"
  190378. "mov %[a], lr\n\t"
  190379. "uxth r5, %[a]\n\t"
  190380. "uxth r6, r7\n\t"
  190381. #ifdef WOLFSSL_KEIL
  190382. "muls r6, r5, r6\n\t"
  190383. #elif defined(__clang__)
  190384. "muls r6, r5\n\t"
  190385. #else
  190386. "mul r6, r5\n\t"
  190387. #endif
  190388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190389. "adds r4, r4, r6\n\t"
  190390. #else
  190391. "add r4, r4, r6\n\t"
  190392. #endif
  190393. #ifdef WOLFSSL_KEIL
  190394. "adcs r2, r2, %[r]\n\t"
  190395. #elif defined(__clang__)
  190396. "adcs r2, %[r]\n\t"
  190397. #else
  190398. "adc r2, %[r]\n\t"
  190399. #endif
  190400. #ifdef WOLFSSL_KEIL
  190401. "adcs r3, r3, %[r]\n\t"
  190402. #elif defined(__clang__)
  190403. "adcs r3, %[r]\n\t"
  190404. #else
  190405. "adc r3, %[r]\n\t"
  190406. #endif
  190407. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190408. "adds r4, r4, r6\n\t"
  190409. #else
  190410. "add r4, r4, r6\n\t"
  190411. #endif
  190412. #ifdef WOLFSSL_KEIL
  190413. "adcs r2, r2, %[r]\n\t"
  190414. #elif defined(__clang__)
  190415. "adcs r2, %[r]\n\t"
  190416. #else
  190417. "adc r2, %[r]\n\t"
  190418. #endif
  190419. #ifdef WOLFSSL_KEIL
  190420. "adcs r3, r3, %[r]\n\t"
  190421. #elif defined(__clang__)
  190422. "adcs r3, %[r]\n\t"
  190423. #else
  190424. "adc r3, %[r]\n\t"
  190425. #endif
  190426. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190427. "lsrs r6, r7, #16\n\t"
  190428. #else
  190429. "lsr r6, r7, #16\n\t"
  190430. #endif
  190431. #ifdef WOLFSSL_KEIL
  190432. "muls r5, r6, r5\n\t"
  190433. #elif defined(__clang__)
  190434. "muls r5, r6\n\t"
  190435. #else
  190436. "mul r5, r6\n\t"
  190437. #endif
  190438. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190439. "lsrs r6, r5, #16\n\t"
  190440. #else
  190441. "lsr r6, r5, #16\n\t"
  190442. #endif
  190443. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190444. "lsls r5, r5, #16\n\t"
  190445. #else
  190446. "lsl r5, r5, #16\n\t"
  190447. #endif
  190448. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190449. "adds r4, r4, r5\n\t"
  190450. #else
  190451. "add r4, r4, r5\n\t"
  190452. #endif
  190453. #ifdef WOLFSSL_KEIL
  190454. "adcs r2, r2, r6\n\t"
  190455. #elif defined(__clang__)
  190456. "adcs r2, r6\n\t"
  190457. #else
  190458. "adc r2, r6\n\t"
  190459. #endif
  190460. #ifdef WOLFSSL_KEIL
  190461. "adcs r3, r3, %[r]\n\t"
  190462. #elif defined(__clang__)
  190463. "adcs r3, %[r]\n\t"
  190464. #else
  190465. "adc r3, %[r]\n\t"
  190466. #endif
  190467. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190468. "adds r4, r4, r5\n\t"
  190469. #else
  190470. "add r4, r4, r5\n\t"
  190471. #endif
  190472. #ifdef WOLFSSL_KEIL
  190473. "adcs r2, r2, r6\n\t"
  190474. #elif defined(__clang__)
  190475. "adcs r2, r6\n\t"
  190476. #else
  190477. "adc r2, r6\n\t"
  190478. #endif
  190479. #ifdef WOLFSSL_KEIL
  190480. "adcs r3, r3, %[r]\n\t"
  190481. #elif defined(__clang__)
  190482. "adcs r3, %[r]\n\t"
  190483. #else
  190484. "adc r3, %[r]\n\t"
  190485. #endif
  190486. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190487. "lsrs r5, %[a], #16\n\t"
  190488. #else
  190489. "lsr r5, %[a], #16\n\t"
  190490. #endif
  190491. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190492. "lsrs r6, r7, #16\n\t"
  190493. #else
  190494. "lsr r6, r7, #16\n\t"
  190495. #endif
  190496. #ifdef WOLFSSL_KEIL
  190497. "muls r6, r5, r6\n\t"
  190498. #elif defined(__clang__)
  190499. "muls r6, r5\n\t"
  190500. #else
  190501. "mul r6, r5\n\t"
  190502. #endif
  190503. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190504. "adds r2, r2, r6\n\t"
  190505. #else
  190506. "add r2, r2, r6\n\t"
  190507. #endif
  190508. #ifdef WOLFSSL_KEIL
  190509. "adcs r3, r3, %[r]\n\t"
  190510. #elif defined(__clang__)
  190511. "adcs r3, %[r]\n\t"
  190512. #else
  190513. "adc r3, %[r]\n\t"
  190514. #endif
  190515. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190516. "adds r2, r2, r6\n\t"
  190517. #else
  190518. "add r2, r2, r6\n\t"
  190519. #endif
  190520. #ifdef WOLFSSL_KEIL
  190521. "adcs r3, r3, %[r]\n\t"
  190522. #elif defined(__clang__)
  190523. "adcs r3, %[r]\n\t"
  190524. #else
  190525. "adc r3, %[r]\n\t"
  190526. #endif
  190527. "uxth r6, r7\n\t"
  190528. #ifdef WOLFSSL_KEIL
  190529. "muls r5, r6, r5\n\t"
  190530. #elif defined(__clang__)
  190531. "muls r5, r6\n\t"
  190532. #else
  190533. "mul r5, r6\n\t"
  190534. #endif
  190535. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190536. "lsrs r6, r5, #16\n\t"
  190537. #else
  190538. "lsr r6, r5, #16\n\t"
  190539. #endif
  190540. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190541. "lsls r5, r5, #16\n\t"
  190542. #else
  190543. "lsl r5, r5, #16\n\t"
  190544. #endif
  190545. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190546. "adds r4, r4, r5\n\t"
  190547. #else
  190548. "add r4, r4, r5\n\t"
  190549. #endif
  190550. #ifdef WOLFSSL_KEIL
  190551. "adcs r2, r2, r6\n\t"
  190552. #elif defined(__clang__)
  190553. "adcs r2, r6\n\t"
  190554. #else
  190555. "adc r2, r6\n\t"
  190556. #endif
  190557. #ifdef WOLFSSL_KEIL
  190558. "adcs r3, r3, %[r]\n\t"
  190559. #elif defined(__clang__)
  190560. "adcs r3, %[r]\n\t"
  190561. #else
  190562. "adc r3, %[r]\n\t"
  190563. #endif
  190564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190565. "adds r4, r4, r5\n\t"
  190566. #else
  190567. "add r4, r4, r5\n\t"
  190568. #endif
  190569. #ifdef WOLFSSL_KEIL
  190570. "adcs r2, r2, r6\n\t"
  190571. #elif defined(__clang__)
  190572. "adcs r2, r6\n\t"
  190573. #else
  190574. "adc r2, r6\n\t"
  190575. #endif
  190576. #ifdef WOLFSSL_KEIL
  190577. "adcs r3, r3, %[r]\n\t"
  190578. #elif defined(__clang__)
  190579. "adcs r3, %[r]\n\t"
  190580. #else
  190581. "adc r3, %[r]\n\t"
  190582. #endif
  190583. "# A[14] * A[6]\n\t"
  190584. "mov %[a], r9\n\t"
  190585. "ldr r7, [%[a], #24]\n\t"
  190586. "mov %[a], r12\n\t"
  190587. "uxth r5, %[a]\n\t"
  190588. "uxth r6, r7\n\t"
  190589. #ifdef WOLFSSL_KEIL
  190590. "muls r6, r5, r6\n\t"
  190591. #elif defined(__clang__)
  190592. "muls r6, r5\n\t"
  190593. #else
  190594. "mul r6, r5\n\t"
  190595. #endif
  190596. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190597. "adds r4, r4, r6\n\t"
  190598. #else
  190599. "add r4, r4, r6\n\t"
  190600. #endif
  190601. #ifdef WOLFSSL_KEIL
  190602. "adcs r2, r2, %[r]\n\t"
  190603. #elif defined(__clang__)
  190604. "adcs r2, %[r]\n\t"
  190605. #else
  190606. "adc r2, %[r]\n\t"
  190607. #endif
  190608. #ifdef WOLFSSL_KEIL
  190609. "adcs r3, r3, %[r]\n\t"
  190610. #elif defined(__clang__)
  190611. "adcs r3, %[r]\n\t"
  190612. #else
  190613. "adc r3, %[r]\n\t"
  190614. #endif
  190615. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190616. "adds r4, r4, r6\n\t"
  190617. #else
  190618. "add r4, r4, r6\n\t"
  190619. #endif
  190620. #ifdef WOLFSSL_KEIL
  190621. "adcs r2, r2, %[r]\n\t"
  190622. #elif defined(__clang__)
  190623. "adcs r2, %[r]\n\t"
  190624. #else
  190625. "adc r2, %[r]\n\t"
  190626. #endif
  190627. #ifdef WOLFSSL_KEIL
  190628. "adcs r3, r3, %[r]\n\t"
  190629. #elif defined(__clang__)
  190630. "adcs r3, %[r]\n\t"
  190631. #else
  190632. "adc r3, %[r]\n\t"
  190633. #endif
  190634. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190635. "lsrs r6, r7, #16\n\t"
  190636. #else
  190637. "lsr r6, r7, #16\n\t"
  190638. #endif
  190639. #ifdef WOLFSSL_KEIL
  190640. "muls r5, r6, r5\n\t"
  190641. #elif defined(__clang__)
  190642. "muls r5, r6\n\t"
  190643. #else
  190644. "mul r5, r6\n\t"
  190645. #endif
  190646. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190647. "lsrs r6, r5, #16\n\t"
  190648. #else
  190649. "lsr r6, r5, #16\n\t"
  190650. #endif
  190651. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190652. "lsls r5, r5, #16\n\t"
  190653. #else
  190654. "lsl r5, r5, #16\n\t"
  190655. #endif
  190656. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190657. "adds r4, r4, r5\n\t"
  190658. #else
  190659. "add r4, r4, r5\n\t"
  190660. #endif
  190661. #ifdef WOLFSSL_KEIL
  190662. "adcs r2, r2, r6\n\t"
  190663. #elif defined(__clang__)
  190664. "adcs r2, r6\n\t"
  190665. #else
  190666. "adc r2, r6\n\t"
  190667. #endif
  190668. #ifdef WOLFSSL_KEIL
  190669. "adcs r3, r3, %[r]\n\t"
  190670. #elif defined(__clang__)
  190671. "adcs r3, %[r]\n\t"
  190672. #else
  190673. "adc r3, %[r]\n\t"
  190674. #endif
  190675. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190676. "adds r4, r4, r5\n\t"
  190677. #else
  190678. "add r4, r4, r5\n\t"
  190679. #endif
  190680. #ifdef WOLFSSL_KEIL
  190681. "adcs r2, r2, r6\n\t"
  190682. #elif defined(__clang__)
  190683. "adcs r2, r6\n\t"
  190684. #else
  190685. "adc r2, r6\n\t"
  190686. #endif
  190687. #ifdef WOLFSSL_KEIL
  190688. "adcs r3, r3, %[r]\n\t"
  190689. #elif defined(__clang__)
  190690. "adcs r3, %[r]\n\t"
  190691. #else
  190692. "adc r3, %[r]\n\t"
  190693. #endif
  190694. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190695. "lsrs r5, %[a], #16\n\t"
  190696. #else
  190697. "lsr r5, %[a], #16\n\t"
  190698. #endif
  190699. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190700. "lsrs r6, r7, #16\n\t"
  190701. #else
  190702. "lsr r6, r7, #16\n\t"
  190703. #endif
  190704. #ifdef WOLFSSL_KEIL
  190705. "muls r6, r5, r6\n\t"
  190706. #elif defined(__clang__)
  190707. "muls r6, r5\n\t"
  190708. #else
  190709. "mul r6, r5\n\t"
  190710. #endif
  190711. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190712. "adds r2, r2, r6\n\t"
  190713. #else
  190714. "add r2, r2, r6\n\t"
  190715. #endif
  190716. #ifdef WOLFSSL_KEIL
  190717. "adcs r3, r3, %[r]\n\t"
  190718. #elif defined(__clang__)
  190719. "adcs r3, %[r]\n\t"
  190720. #else
  190721. "adc r3, %[r]\n\t"
  190722. #endif
  190723. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190724. "adds r2, r2, r6\n\t"
  190725. #else
  190726. "add r2, r2, r6\n\t"
  190727. #endif
  190728. #ifdef WOLFSSL_KEIL
  190729. "adcs r3, r3, %[r]\n\t"
  190730. #elif defined(__clang__)
  190731. "adcs r3, %[r]\n\t"
  190732. #else
  190733. "adc r3, %[r]\n\t"
  190734. #endif
  190735. "uxth r6, r7\n\t"
  190736. #ifdef WOLFSSL_KEIL
  190737. "muls r5, r6, r5\n\t"
  190738. #elif defined(__clang__)
  190739. "muls r5, r6\n\t"
  190740. #else
  190741. "mul r5, r6\n\t"
  190742. #endif
  190743. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190744. "lsrs r6, r5, #16\n\t"
  190745. #else
  190746. "lsr r6, r5, #16\n\t"
  190747. #endif
  190748. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190749. "lsls r5, r5, #16\n\t"
  190750. #else
  190751. "lsl r5, r5, #16\n\t"
  190752. #endif
  190753. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190754. "adds r4, r4, r5\n\t"
  190755. #else
  190756. "add r4, r4, r5\n\t"
  190757. #endif
  190758. #ifdef WOLFSSL_KEIL
  190759. "adcs r2, r2, r6\n\t"
  190760. #elif defined(__clang__)
  190761. "adcs r2, r6\n\t"
  190762. #else
  190763. "adc r2, r6\n\t"
  190764. #endif
  190765. #ifdef WOLFSSL_KEIL
  190766. "adcs r3, r3, %[r]\n\t"
  190767. #elif defined(__clang__)
  190768. "adcs r3, %[r]\n\t"
  190769. #else
  190770. "adc r3, %[r]\n\t"
  190771. #endif
  190772. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190773. "adds r4, r4, r5\n\t"
  190774. #else
  190775. "add r4, r4, r5\n\t"
  190776. #endif
  190777. #ifdef WOLFSSL_KEIL
  190778. "adcs r2, r2, r6\n\t"
  190779. #elif defined(__clang__)
  190780. "adcs r2, r6\n\t"
  190781. #else
  190782. "adc r2, r6\n\t"
  190783. #endif
  190784. #ifdef WOLFSSL_KEIL
  190785. "adcs r3, r3, %[r]\n\t"
  190786. #elif defined(__clang__)
  190787. "adcs r3, %[r]\n\t"
  190788. #else
  190789. "adc r3, %[r]\n\t"
  190790. #endif
  190791. "# A[13] * A[7]\n\t"
  190792. "mov %[a], r9\n\t"
  190793. "ldr r7, [%[a], #28]\n\t"
  190794. "mov %[a], r11\n\t"
  190795. "uxth r5, %[a]\n\t"
  190796. "uxth r6, r7\n\t"
  190797. #ifdef WOLFSSL_KEIL
  190798. "muls r6, r5, r6\n\t"
  190799. #elif defined(__clang__)
  190800. "muls r6, r5\n\t"
  190801. #else
  190802. "mul r6, r5\n\t"
  190803. #endif
  190804. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190805. "adds r4, r4, r6\n\t"
  190806. #else
  190807. "add r4, r4, r6\n\t"
  190808. #endif
  190809. #ifdef WOLFSSL_KEIL
  190810. "adcs r2, r2, %[r]\n\t"
  190811. #elif defined(__clang__)
  190812. "adcs r2, %[r]\n\t"
  190813. #else
  190814. "adc r2, %[r]\n\t"
  190815. #endif
  190816. #ifdef WOLFSSL_KEIL
  190817. "adcs r3, r3, %[r]\n\t"
  190818. #elif defined(__clang__)
  190819. "adcs r3, %[r]\n\t"
  190820. #else
  190821. "adc r3, %[r]\n\t"
  190822. #endif
  190823. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190824. "adds r4, r4, r6\n\t"
  190825. #else
  190826. "add r4, r4, r6\n\t"
  190827. #endif
  190828. #ifdef WOLFSSL_KEIL
  190829. "adcs r2, r2, %[r]\n\t"
  190830. #elif defined(__clang__)
  190831. "adcs r2, %[r]\n\t"
  190832. #else
  190833. "adc r2, %[r]\n\t"
  190834. #endif
  190835. #ifdef WOLFSSL_KEIL
  190836. "adcs r3, r3, %[r]\n\t"
  190837. #elif defined(__clang__)
  190838. "adcs r3, %[r]\n\t"
  190839. #else
  190840. "adc r3, %[r]\n\t"
  190841. #endif
  190842. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190843. "lsrs r6, r7, #16\n\t"
  190844. #else
  190845. "lsr r6, r7, #16\n\t"
  190846. #endif
  190847. #ifdef WOLFSSL_KEIL
  190848. "muls r5, r6, r5\n\t"
  190849. #elif defined(__clang__)
  190850. "muls r5, r6\n\t"
  190851. #else
  190852. "mul r5, r6\n\t"
  190853. #endif
  190854. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190855. "lsrs r6, r5, #16\n\t"
  190856. #else
  190857. "lsr r6, r5, #16\n\t"
  190858. #endif
  190859. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190860. "lsls r5, r5, #16\n\t"
  190861. #else
  190862. "lsl r5, r5, #16\n\t"
  190863. #endif
  190864. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190865. "adds r4, r4, r5\n\t"
  190866. #else
  190867. "add r4, r4, r5\n\t"
  190868. #endif
  190869. #ifdef WOLFSSL_KEIL
  190870. "adcs r2, r2, r6\n\t"
  190871. #elif defined(__clang__)
  190872. "adcs r2, r6\n\t"
  190873. #else
  190874. "adc r2, r6\n\t"
  190875. #endif
  190876. #ifdef WOLFSSL_KEIL
  190877. "adcs r3, r3, %[r]\n\t"
  190878. #elif defined(__clang__)
  190879. "adcs r3, %[r]\n\t"
  190880. #else
  190881. "adc r3, %[r]\n\t"
  190882. #endif
  190883. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190884. "adds r4, r4, r5\n\t"
  190885. #else
  190886. "add r4, r4, r5\n\t"
  190887. #endif
  190888. #ifdef WOLFSSL_KEIL
  190889. "adcs r2, r2, r6\n\t"
  190890. #elif defined(__clang__)
  190891. "adcs r2, r6\n\t"
  190892. #else
  190893. "adc r2, r6\n\t"
  190894. #endif
  190895. #ifdef WOLFSSL_KEIL
  190896. "adcs r3, r3, %[r]\n\t"
  190897. #elif defined(__clang__)
  190898. "adcs r3, %[r]\n\t"
  190899. #else
  190900. "adc r3, %[r]\n\t"
  190901. #endif
  190902. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190903. "lsrs r5, %[a], #16\n\t"
  190904. #else
  190905. "lsr r5, %[a], #16\n\t"
  190906. #endif
  190907. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190908. "lsrs r6, r7, #16\n\t"
  190909. #else
  190910. "lsr r6, r7, #16\n\t"
  190911. #endif
  190912. #ifdef WOLFSSL_KEIL
  190913. "muls r6, r5, r6\n\t"
  190914. #elif defined(__clang__)
  190915. "muls r6, r5\n\t"
  190916. #else
  190917. "mul r6, r5\n\t"
  190918. #endif
  190919. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190920. "adds r2, r2, r6\n\t"
  190921. #else
  190922. "add r2, r2, r6\n\t"
  190923. #endif
  190924. #ifdef WOLFSSL_KEIL
  190925. "adcs r3, r3, %[r]\n\t"
  190926. #elif defined(__clang__)
  190927. "adcs r3, %[r]\n\t"
  190928. #else
  190929. "adc r3, %[r]\n\t"
  190930. #endif
  190931. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190932. "adds r2, r2, r6\n\t"
  190933. #else
  190934. "add r2, r2, r6\n\t"
  190935. #endif
  190936. #ifdef WOLFSSL_KEIL
  190937. "adcs r3, r3, %[r]\n\t"
  190938. #elif defined(__clang__)
  190939. "adcs r3, %[r]\n\t"
  190940. #else
  190941. "adc r3, %[r]\n\t"
  190942. #endif
  190943. "uxth r6, r7\n\t"
  190944. #ifdef WOLFSSL_KEIL
  190945. "muls r5, r6, r5\n\t"
  190946. #elif defined(__clang__)
  190947. "muls r5, r6\n\t"
  190948. #else
  190949. "mul r5, r6\n\t"
  190950. #endif
  190951. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190952. "lsrs r6, r5, #16\n\t"
  190953. #else
  190954. "lsr r6, r5, #16\n\t"
  190955. #endif
  190956. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190957. "lsls r5, r5, #16\n\t"
  190958. #else
  190959. "lsl r5, r5, #16\n\t"
  190960. #endif
  190961. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190962. "adds r4, r4, r5\n\t"
  190963. #else
  190964. "add r4, r4, r5\n\t"
  190965. #endif
  190966. #ifdef WOLFSSL_KEIL
  190967. "adcs r2, r2, r6\n\t"
  190968. #elif defined(__clang__)
  190969. "adcs r2, r6\n\t"
  190970. #else
  190971. "adc r2, r6\n\t"
  190972. #endif
  190973. #ifdef WOLFSSL_KEIL
  190974. "adcs r3, r3, %[r]\n\t"
  190975. #elif defined(__clang__)
  190976. "adcs r3, %[r]\n\t"
  190977. #else
  190978. "adc r3, %[r]\n\t"
  190979. #endif
  190980. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190981. "adds r4, r4, r5\n\t"
  190982. #else
  190983. "add r4, r4, r5\n\t"
  190984. #endif
  190985. #ifdef WOLFSSL_KEIL
  190986. "adcs r2, r2, r6\n\t"
  190987. #elif defined(__clang__)
  190988. "adcs r2, r6\n\t"
  190989. #else
  190990. "adc r2, r6\n\t"
  190991. #endif
  190992. #ifdef WOLFSSL_KEIL
  190993. "adcs r3, r3, %[r]\n\t"
  190994. #elif defined(__clang__)
  190995. "adcs r3, %[r]\n\t"
  190996. #else
  190997. "adc r3, %[r]\n\t"
  190998. #endif
  190999. "# A[12] * A[8]\n\t"
  191000. "mov %[a], r9\n\t"
  191001. "ldr r7, [%[a], #32]\n\t"
  191002. "mov %[a], r10\n\t"
  191003. "uxth r5, %[a]\n\t"
  191004. "uxth r6, r7\n\t"
  191005. #ifdef WOLFSSL_KEIL
  191006. "muls r6, r5, r6\n\t"
  191007. #elif defined(__clang__)
  191008. "muls r6, r5\n\t"
  191009. #else
  191010. "mul r6, r5\n\t"
  191011. #endif
  191012. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191013. "adds r4, r4, r6\n\t"
  191014. #else
  191015. "add r4, r4, r6\n\t"
  191016. #endif
  191017. #ifdef WOLFSSL_KEIL
  191018. "adcs r2, r2, %[r]\n\t"
  191019. #elif defined(__clang__)
  191020. "adcs r2, %[r]\n\t"
  191021. #else
  191022. "adc r2, %[r]\n\t"
  191023. #endif
  191024. #ifdef WOLFSSL_KEIL
  191025. "adcs r3, r3, %[r]\n\t"
  191026. #elif defined(__clang__)
  191027. "adcs r3, %[r]\n\t"
  191028. #else
  191029. "adc r3, %[r]\n\t"
  191030. #endif
  191031. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191032. "adds r4, r4, r6\n\t"
  191033. #else
  191034. "add r4, r4, r6\n\t"
  191035. #endif
  191036. #ifdef WOLFSSL_KEIL
  191037. "adcs r2, r2, %[r]\n\t"
  191038. #elif defined(__clang__)
  191039. "adcs r2, %[r]\n\t"
  191040. #else
  191041. "adc r2, %[r]\n\t"
  191042. #endif
  191043. #ifdef WOLFSSL_KEIL
  191044. "adcs r3, r3, %[r]\n\t"
  191045. #elif defined(__clang__)
  191046. "adcs r3, %[r]\n\t"
  191047. #else
  191048. "adc r3, %[r]\n\t"
  191049. #endif
  191050. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191051. "lsrs r6, r7, #16\n\t"
  191052. #else
  191053. "lsr r6, r7, #16\n\t"
  191054. #endif
  191055. #ifdef WOLFSSL_KEIL
  191056. "muls r5, r6, r5\n\t"
  191057. #elif defined(__clang__)
  191058. "muls r5, r6\n\t"
  191059. #else
  191060. "mul r5, r6\n\t"
  191061. #endif
  191062. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191063. "lsrs r6, r5, #16\n\t"
  191064. #else
  191065. "lsr r6, r5, #16\n\t"
  191066. #endif
  191067. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191068. "lsls r5, r5, #16\n\t"
  191069. #else
  191070. "lsl r5, r5, #16\n\t"
  191071. #endif
  191072. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191073. "adds r4, r4, r5\n\t"
  191074. #else
  191075. "add r4, r4, r5\n\t"
  191076. #endif
  191077. #ifdef WOLFSSL_KEIL
  191078. "adcs r2, r2, r6\n\t"
  191079. #elif defined(__clang__)
  191080. "adcs r2, r6\n\t"
  191081. #else
  191082. "adc r2, r6\n\t"
  191083. #endif
  191084. #ifdef WOLFSSL_KEIL
  191085. "adcs r3, r3, %[r]\n\t"
  191086. #elif defined(__clang__)
  191087. "adcs r3, %[r]\n\t"
  191088. #else
  191089. "adc r3, %[r]\n\t"
  191090. #endif
  191091. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191092. "adds r4, r4, r5\n\t"
  191093. #else
  191094. "add r4, r4, r5\n\t"
  191095. #endif
  191096. #ifdef WOLFSSL_KEIL
  191097. "adcs r2, r2, r6\n\t"
  191098. #elif defined(__clang__)
  191099. "adcs r2, r6\n\t"
  191100. #else
  191101. "adc r2, r6\n\t"
  191102. #endif
  191103. #ifdef WOLFSSL_KEIL
  191104. "adcs r3, r3, %[r]\n\t"
  191105. #elif defined(__clang__)
  191106. "adcs r3, %[r]\n\t"
  191107. #else
  191108. "adc r3, %[r]\n\t"
  191109. #endif
  191110. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191111. "lsrs r5, %[a], #16\n\t"
  191112. #else
  191113. "lsr r5, %[a], #16\n\t"
  191114. #endif
  191115. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191116. "lsrs r6, r7, #16\n\t"
  191117. #else
  191118. "lsr r6, r7, #16\n\t"
  191119. #endif
  191120. #ifdef WOLFSSL_KEIL
  191121. "muls r6, r5, r6\n\t"
  191122. #elif defined(__clang__)
  191123. "muls r6, r5\n\t"
  191124. #else
  191125. "mul r6, r5\n\t"
  191126. #endif
  191127. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191128. "adds r2, r2, r6\n\t"
  191129. #else
  191130. "add r2, r2, r6\n\t"
  191131. #endif
  191132. #ifdef WOLFSSL_KEIL
  191133. "adcs r3, r3, %[r]\n\t"
  191134. #elif defined(__clang__)
  191135. "adcs r3, %[r]\n\t"
  191136. #else
  191137. "adc r3, %[r]\n\t"
  191138. #endif
  191139. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191140. "adds r2, r2, r6\n\t"
  191141. #else
  191142. "add r2, r2, r6\n\t"
  191143. #endif
  191144. #ifdef WOLFSSL_KEIL
  191145. "adcs r3, r3, %[r]\n\t"
  191146. #elif defined(__clang__)
  191147. "adcs r3, %[r]\n\t"
  191148. #else
  191149. "adc r3, %[r]\n\t"
  191150. #endif
  191151. "uxth r6, r7\n\t"
  191152. #ifdef WOLFSSL_KEIL
  191153. "muls r5, r6, r5\n\t"
  191154. #elif defined(__clang__)
  191155. "muls r5, r6\n\t"
  191156. #else
  191157. "mul r5, r6\n\t"
  191158. #endif
  191159. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191160. "lsrs r6, r5, #16\n\t"
  191161. #else
  191162. "lsr r6, r5, #16\n\t"
  191163. #endif
  191164. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191165. "lsls r5, r5, #16\n\t"
  191166. #else
  191167. "lsl r5, r5, #16\n\t"
  191168. #endif
  191169. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191170. "adds r4, r4, r5\n\t"
  191171. #else
  191172. "add r4, r4, r5\n\t"
  191173. #endif
  191174. #ifdef WOLFSSL_KEIL
  191175. "adcs r2, r2, r6\n\t"
  191176. #elif defined(__clang__)
  191177. "adcs r2, r6\n\t"
  191178. #else
  191179. "adc r2, r6\n\t"
  191180. #endif
  191181. #ifdef WOLFSSL_KEIL
  191182. "adcs r3, r3, %[r]\n\t"
  191183. #elif defined(__clang__)
  191184. "adcs r3, %[r]\n\t"
  191185. #else
  191186. "adc r3, %[r]\n\t"
  191187. #endif
  191188. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191189. "adds r4, r4, r5\n\t"
  191190. #else
  191191. "add r4, r4, r5\n\t"
  191192. #endif
  191193. #ifdef WOLFSSL_KEIL
  191194. "adcs r2, r2, r6\n\t"
  191195. #elif defined(__clang__)
  191196. "adcs r2, r6\n\t"
  191197. #else
  191198. "adc r2, r6\n\t"
  191199. #endif
  191200. #ifdef WOLFSSL_KEIL
  191201. "adcs r3, r3, %[r]\n\t"
  191202. #elif defined(__clang__)
  191203. "adcs r3, %[r]\n\t"
  191204. #else
  191205. "adc r3, %[r]\n\t"
  191206. #endif
  191207. "# A[11] * A[9]\n\t"
  191208. "mov %[a], r9\n\t"
  191209. "ldr r7, [%[a], #36]\n\t"
  191210. "ldr %[a], [%[a], #44]\n\t"
  191211. "uxth r5, %[a]\n\t"
  191212. "uxth r6, r7\n\t"
  191213. #ifdef WOLFSSL_KEIL
  191214. "muls r6, r5, r6\n\t"
  191215. #elif defined(__clang__)
  191216. "muls r6, r5\n\t"
  191217. #else
  191218. "mul r6, r5\n\t"
  191219. #endif
  191220. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191221. "adds r4, r4, r6\n\t"
  191222. #else
  191223. "add r4, r4, r6\n\t"
  191224. #endif
  191225. #ifdef WOLFSSL_KEIL
  191226. "adcs r2, r2, %[r]\n\t"
  191227. #elif defined(__clang__)
  191228. "adcs r2, %[r]\n\t"
  191229. #else
  191230. "adc r2, %[r]\n\t"
  191231. #endif
  191232. #ifdef WOLFSSL_KEIL
  191233. "adcs r3, r3, %[r]\n\t"
  191234. #elif defined(__clang__)
  191235. "adcs r3, %[r]\n\t"
  191236. #else
  191237. "adc r3, %[r]\n\t"
  191238. #endif
  191239. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191240. "adds r4, r4, r6\n\t"
  191241. #else
  191242. "add r4, r4, r6\n\t"
  191243. #endif
  191244. #ifdef WOLFSSL_KEIL
  191245. "adcs r2, r2, %[r]\n\t"
  191246. #elif defined(__clang__)
  191247. "adcs r2, %[r]\n\t"
  191248. #else
  191249. "adc r2, %[r]\n\t"
  191250. #endif
  191251. #ifdef WOLFSSL_KEIL
  191252. "adcs r3, r3, %[r]\n\t"
  191253. #elif defined(__clang__)
  191254. "adcs r3, %[r]\n\t"
  191255. #else
  191256. "adc r3, %[r]\n\t"
  191257. #endif
  191258. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191259. "lsrs r6, r7, #16\n\t"
  191260. #else
  191261. "lsr r6, r7, #16\n\t"
  191262. #endif
  191263. #ifdef WOLFSSL_KEIL
  191264. "muls r5, r6, r5\n\t"
  191265. #elif defined(__clang__)
  191266. "muls r5, r6\n\t"
  191267. #else
  191268. "mul r5, r6\n\t"
  191269. #endif
  191270. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191271. "lsrs r6, r5, #16\n\t"
  191272. #else
  191273. "lsr r6, r5, #16\n\t"
  191274. #endif
  191275. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191276. "lsls r5, r5, #16\n\t"
  191277. #else
  191278. "lsl r5, r5, #16\n\t"
  191279. #endif
  191280. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191281. "adds r4, r4, r5\n\t"
  191282. #else
  191283. "add r4, r4, r5\n\t"
  191284. #endif
  191285. #ifdef WOLFSSL_KEIL
  191286. "adcs r2, r2, r6\n\t"
  191287. #elif defined(__clang__)
  191288. "adcs r2, r6\n\t"
  191289. #else
  191290. "adc r2, r6\n\t"
  191291. #endif
  191292. #ifdef WOLFSSL_KEIL
  191293. "adcs r3, r3, %[r]\n\t"
  191294. #elif defined(__clang__)
  191295. "adcs r3, %[r]\n\t"
  191296. #else
  191297. "adc r3, %[r]\n\t"
  191298. #endif
  191299. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191300. "adds r4, r4, r5\n\t"
  191301. #else
  191302. "add r4, r4, r5\n\t"
  191303. #endif
  191304. #ifdef WOLFSSL_KEIL
  191305. "adcs r2, r2, r6\n\t"
  191306. #elif defined(__clang__)
  191307. "adcs r2, r6\n\t"
  191308. #else
  191309. "adc r2, r6\n\t"
  191310. #endif
  191311. #ifdef WOLFSSL_KEIL
  191312. "adcs r3, r3, %[r]\n\t"
  191313. #elif defined(__clang__)
  191314. "adcs r3, %[r]\n\t"
  191315. #else
  191316. "adc r3, %[r]\n\t"
  191317. #endif
  191318. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191319. "lsrs r5, %[a], #16\n\t"
  191320. #else
  191321. "lsr r5, %[a], #16\n\t"
  191322. #endif
  191323. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191324. "lsrs r6, r7, #16\n\t"
  191325. #else
  191326. "lsr r6, r7, #16\n\t"
  191327. #endif
  191328. #ifdef WOLFSSL_KEIL
  191329. "muls r6, r5, r6\n\t"
  191330. #elif defined(__clang__)
  191331. "muls r6, r5\n\t"
  191332. #else
  191333. "mul r6, r5\n\t"
  191334. #endif
  191335. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191336. "adds r2, r2, r6\n\t"
  191337. #else
  191338. "add r2, r2, r6\n\t"
  191339. #endif
  191340. #ifdef WOLFSSL_KEIL
  191341. "adcs r3, r3, %[r]\n\t"
  191342. #elif defined(__clang__)
  191343. "adcs r3, %[r]\n\t"
  191344. #else
  191345. "adc r3, %[r]\n\t"
  191346. #endif
  191347. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191348. "adds r2, r2, r6\n\t"
  191349. #else
  191350. "add r2, r2, r6\n\t"
  191351. #endif
  191352. #ifdef WOLFSSL_KEIL
  191353. "adcs r3, r3, %[r]\n\t"
  191354. #elif defined(__clang__)
  191355. "adcs r3, %[r]\n\t"
  191356. #else
  191357. "adc r3, %[r]\n\t"
  191358. #endif
  191359. "uxth r6, r7\n\t"
  191360. #ifdef WOLFSSL_KEIL
  191361. "muls r5, r6, r5\n\t"
  191362. #elif defined(__clang__)
  191363. "muls r5, r6\n\t"
  191364. #else
  191365. "mul r5, r6\n\t"
  191366. #endif
  191367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191368. "lsrs r6, r5, #16\n\t"
  191369. #else
  191370. "lsr r6, r5, #16\n\t"
  191371. #endif
  191372. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191373. "lsls r5, r5, #16\n\t"
  191374. #else
  191375. "lsl r5, r5, #16\n\t"
  191376. #endif
  191377. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191378. "adds r4, r4, r5\n\t"
  191379. #else
  191380. "add r4, r4, r5\n\t"
  191381. #endif
  191382. #ifdef WOLFSSL_KEIL
  191383. "adcs r2, r2, r6\n\t"
  191384. #elif defined(__clang__)
  191385. "adcs r2, r6\n\t"
  191386. #else
  191387. "adc r2, r6\n\t"
  191388. #endif
  191389. #ifdef WOLFSSL_KEIL
  191390. "adcs r3, r3, %[r]\n\t"
  191391. #elif defined(__clang__)
  191392. "adcs r3, %[r]\n\t"
  191393. #else
  191394. "adc r3, %[r]\n\t"
  191395. #endif
  191396. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191397. "adds r4, r4, r5\n\t"
  191398. #else
  191399. "add r4, r4, r5\n\t"
  191400. #endif
  191401. #ifdef WOLFSSL_KEIL
  191402. "adcs r2, r2, r6\n\t"
  191403. #elif defined(__clang__)
  191404. "adcs r2, r6\n\t"
  191405. #else
  191406. "adc r2, r6\n\t"
  191407. #endif
  191408. #ifdef WOLFSSL_KEIL
  191409. "adcs r3, r3, %[r]\n\t"
  191410. #elif defined(__clang__)
  191411. "adcs r3, %[r]\n\t"
  191412. #else
  191413. "adc r3, %[r]\n\t"
  191414. #endif
  191415. "# A[10] * A[10]\n\t"
  191416. "mov %[a], r9\n\t"
  191417. "ldr r7, [%[a], #40]\n\t"
  191418. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191419. "lsrs r6, r7, #16\n\t"
  191420. #else
  191421. "lsr r6, r7, #16\n\t"
  191422. #endif
  191423. "uxth r5, r7\n\t"
  191424. #ifdef WOLFSSL_KEIL
  191425. "muls r5, r5, r5\n\t"
  191426. #elif defined(__clang__)
  191427. "muls r5, r5\n\t"
  191428. #else
  191429. "mul r5, r5\n\t"
  191430. #endif
  191431. #ifdef WOLFSSL_KEIL
  191432. "muls r6, r6, r6\n\t"
  191433. #elif defined(__clang__)
  191434. "muls r6, r6\n\t"
  191435. #else
  191436. "mul r6, r6\n\t"
  191437. #endif
  191438. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191439. "adds r4, r4, r5\n\t"
  191440. #else
  191441. "add r4, r4, r5\n\t"
  191442. #endif
  191443. #ifdef WOLFSSL_KEIL
  191444. "adcs r2, r2, r6\n\t"
  191445. #elif defined(__clang__)
  191446. "adcs r2, r6\n\t"
  191447. #else
  191448. "adc r2, r6\n\t"
  191449. #endif
  191450. #ifdef WOLFSSL_KEIL
  191451. "adcs r3, r3, %[r]\n\t"
  191452. #elif defined(__clang__)
  191453. "adcs r3, %[r]\n\t"
  191454. #else
  191455. "adc r3, %[r]\n\t"
  191456. #endif
  191457. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191458. "lsrs r6, r7, #16\n\t"
  191459. #else
  191460. "lsr r6, r7, #16\n\t"
  191461. #endif
  191462. "uxth r5, r7\n\t"
  191463. #ifdef WOLFSSL_KEIL
  191464. "muls r5, r6, r5\n\t"
  191465. #elif defined(__clang__)
  191466. "muls r5, r6\n\t"
  191467. #else
  191468. "mul r5, r6\n\t"
  191469. #endif
  191470. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191471. "lsrs r6, r5, #15\n\t"
  191472. #else
  191473. "lsr r6, r5, #15\n\t"
  191474. #endif
  191475. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191476. "lsls r5, r5, #17\n\t"
  191477. #else
  191478. "lsl r5, r5, #17\n\t"
  191479. #endif
  191480. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191481. "adds r4, r4, r5\n\t"
  191482. #else
  191483. "add r4, r4, r5\n\t"
  191484. #endif
  191485. #ifdef WOLFSSL_KEIL
  191486. "adcs r2, r2, r6\n\t"
  191487. #elif defined(__clang__)
  191488. "adcs r2, r6\n\t"
  191489. #else
  191490. "adc r2, r6\n\t"
  191491. #endif
  191492. #ifdef WOLFSSL_KEIL
  191493. "adcs r3, r3, %[r]\n\t"
  191494. #elif defined(__clang__)
  191495. "adcs r3, %[r]\n\t"
  191496. #else
  191497. "adc r3, %[r]\n\t"
  191498. #endif
  191499. "mov %[r], r8\n\t"
  191500. "str r4, [%[r], #80]\n\t"
  191501. "movs %[r], #0\n\t"
  191502. "# A[11] * A[10]\n\t"
  191503. "movs r4, #0\n\t"
  191504. "ldr %[a], [%[a], #44]\n\t"
  191505. "uxth r5, %[a]\n\t"
  191506. "uxth r6, r7\n\t"
  191507. #ifdef WOLFSSL_KEIL
  191508. "muls r6, r5, r6\n\t"
  191509. #elif defined(__clang__)
  191510. "muls r6, r5\n\t"
  191511. #else
  191512. "mul r6, r5\n\t"
  191513. #endif
  191514. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191515. "adds r2, r2, r6\n\t"
  191516. #else
  191517. "add r2, r2, r6\n\t"
  191518. #endif
  191519. #ifdef WOLFSSL_KEIL
  191520. "adcs r3, r3, %[r]\n\t"
  191521. #elif defined(__clang__)
  191522. "adcs r3, %[r]\n\t"
  191523. #else
  191524. "adc r3, %[r]\n\t"
  191525. #endif
  191526. #ifdef WOLFSSL_KEIL
  191527. "adcs r4, r4, %[r]\n\t"
  191528. #elif defined(__clang__)
  191529. "adcs r4, %[r]\n\t"
  191530. #else
  191531. "adc r4, %[r]\n\t"
  191532. #endif
  191533. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191534. "adds r2, r2, r6\n\t"
  191535. #else
  191536. "add r2, r2, r6\n\t"
  191537. #endif
  191538. #ifdef WOLFSSL_KEIL
  191539. "adcs r3, r3, %[r]\n\t"
  191540. #elif defined(__clang__)
  191541. "adcs r3, %[r]\n\t"
  191542. #else
  191543. "adc r3, %[r]\n\t"
  191544. #endif
  191545. #ifdef WOLFSSL_KEIL
  191546. "adcs r4, r4, %[r]\n\t"
  191547. #elif defined(__clang__)
  191548. "adcs r4, %[r]\n\t"
  191549. #else
  191550. "adc r4, %[r]\n\t"
  191551. #endif
  191552. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191553. "lsrs r6, r7, #16\n\t"
  191554. #else
  191555. "lsr r6, r7, #16\n\t"
  191556. #endif
  191557. #ifdef WOLFSSL_KEIL
  191558. "muls r5, r6, r5\n\t"
  191559. #elif defined(__clang__)
  191560. "muls r5, r6\n\t"
  191561. #else
  191562. "mul r5, r6\n\t"
  191563. #endif
  191564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191565. "lsrs r6, r5, #16\n\t"
  191566. #else
  191567. "lsr r6, r5, #16\n\t"
  191568. #endif
  191569. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191570. "lsls r5, r5, #16\n\t"
  191571. #else
  191572. "lsl r5, r5, #16\n\t"
  191573. #endif
  191574. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191575. "adds r2, r2, r5\n\t"
  191576. #else
  191577. "add r2, r2, r5\n\t"
  191578. #endif
  191579. #ifdef WOLFSSL_KEIL
  191580. "adcs r3, r3, r6\n\t"
  191581. #elif defined(__clang__)
  191582. "adcs r3, r6\n\t"
  191583. #else
  191584. "adc r3, r6\n\t"
  191585. #endif
  191586. #ifdef WOLFSSL_KEIL
  191587. "adcs r4, r4, %[r]\n\t"
  191588. #elif defined(__clang__)
  191589. "adcs r4, %[r]\n\t"
  191590. #else
  191591. "adc r4, %[r]\n\t"
  191592. #endif
  191593. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191594. "adds r2, r2, r5\n\t"
  191595. #else
  191596. "add r2, r2, r5\n\t"
  191597. #endif
  191598. #ifdef WOLFSSL_KEIL
  191599. "adcs r3, r3, r6\n\t"
  191600. #elif defined(__clang__)
  191601. "adcs r3, r6\n\t"
  191602. #else
  191603. "adc r3, r6\n\t"
  191604. #endif
  191605. #ifdef WOLFSSL_KEIL
  191606. "adcs r4, r4, %[r]\n\t"
  191607. #elif defined(__clang__)
  191608. "adcs r4, %[r]\n\t"
  191609. #else
  191610. "adc r4, %[r]\n\t"
  191611. #endif
  191612. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191613. "lsrs r5, %[a], #16\n\t"
  191614. #else
  191615. "lsr r5, %[a], #16\n\t"
  191616. #endif
  191617. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191618. "lsrs r6, r7, #16\n\t"
  191619. #else
  191620. "lsr r6, r7, #16\n\t"
  191621. #endif
  191622. #ifdef WOLFSSL_KEIL
  191623. "muls r6, r5, r6\n\t"
  191624. #elif defined(__clang__)
  191625. "muls r6, r5\n\t"
  191626. #else
  191627. "mul r6, r5\n\t"
  191628. #endif
  191629. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191630. "adds r3, r3, r6\n\t"
  191631. #else
  191632. "add r3, r3, r6\n\t"
  191633. #endif
  191634. #ifdef WOLFSSL_KEIL
  191635. "adcs r4, r4, %[r]\n\t"
  191636. #elif defined(__clang__)
  191637. "adcs r4, %[r]\n\t"
  191638. #else
  191639. "adc r4, %[r]\n\t"
  191640. #endif
  191641. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191642. "adds r3, r3, r6\n\t"
  191643. #else
  191644. "add r3, r3, r6\n\t"
  191645. #endif
  191646. #ifdef WOLFSSL_KEIL
  191647. "adcs r4, r4, %[r]\n\t"
  191648. #elif defined(__clang__)
  191649. "adcs r4, %[r]\n\t"
  191650. #else
  191651. "adc r4, %[r]\n\t"
  191652. #endif
  191653. "uxth r6, r7\n\t"
  191654. #ifdef WOLFSSL_KEIL
  191655. "muls r5, r6, r5\n\t"
  191656. #elif defined(__clang__)
  191657. "muls r5, r6\n\t"
  191658. #else
  191659. "mul r5, r6\n\t"
  191660. #endif
  191661. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191662. "lsrs r6, r5, #16\n\t"
  191663. #else
  191664. "lsr r6, r5, #16\n\t"
  191665. #endif
  191666. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191667. "lsls r5, r5, #16\n\t"
  191668. #else
  191669. "lsl r5, r5, #16\n\t"
  191670. #endif
  191671. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191672. "adds r2, r2, r5\n\t"
  191673. #else
  191674. "add r2, r2, r5\n\t"
  191675. #endif
  191676. #ifdef WOLFSSL_KEIL
  191677. "adcs r3, r3, r6\n\t"
  191678. #elif defined(__clang__)
  191679. "adcs r3, r6\n\t"
  191680. #else
  191681. "adc r3, r6\n\t"
  191682. #endif
  191683. #ifdef WOLFSSL_KEIL
  191684. "adcs r4, r4, %[r]\n\t"
  191685. #elif defined(__clang__)
  191686. "adcs r4, %[r]\n\t"
  191687. #else
  191688. "adc r4, %[r]\n\t"
  191689. #endif
  191690. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191691. "adds r2, r2, r5\n\t"
  191692. #else
  191693. "add r2, r2, r5\n\t"
  191694. #endif
  191695. #ifdef WOLFSSL_KEIL
  191696. "adcs r3, r3, r6\n\t"
  191697. #elif defined(__clang__)
  191698. "adcs r3, r6\n\t"
  191699. #else
  191700. "adc r3, r6\n\t"
  191701. #endif
  191702. #ifdef WOLFSSL_KEIL
  191703. "adcs r4, r4, %[r]\n\t"
  191704. #elif defined(__clang__)
  191705. "adcs r4, %[r]\n\t"
  191706. #else
  191707. "adc r4, %[r]\n\t"
  191708. #endif
  191709. "# A[12] * A[9]\n\t"
  191710. "mov %[a], r9\n\t"
  191711. "ldr r7, [%[a], #36]\n\t"
  191712. "mov %[a], r10\n\t"
  191713. "uxth r5, %[a]\n\t"
  191714. "uxth r6, r7\n\t"
  191715. #ifdef WOLFSSL_KEIL
  191716. "muls r6, r5, r6\n\t"
  191717. #elif defined(__clang__)
  191718. "muls r6, r5\n\t"
  191719. #else
  191720. "mul r6, r5\n\t"
  191721. #endif
  191722. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191723. "adds r2, r2, r6\n\t"
  191724. #else
  191725. "add r2, r2, r6\n\t"
  191726. #endif
  191727. #ifdef WOLFSSL_KEIL
  191728. "adcs r3, r3, %[r]\n\t"
  191729. #elif defined(__clang__)
  191730. "adcs r3, %[r]\n\t"
  191731. #else
  191732. "adc r3, %[r]\n\t"
  191733. #endif
  191734. #ifdef WOLFSSL_KEIL
  191735. "adcs r4, r4, %[r]\n\t"
  191736. #elif defined(__clang__)
  191737. "adcs r4, %[r]\n\t"
  191738. #else
  191739. "adc r4, %[r]\n\t"
  191740. #endif
  191741. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191742. "adds r2, r2, r6\n\t"
  191743. #else
  191744. "add r2, r2, r6\n\t"
  191745. #endif
  191746. #ifdef WOLFSSL_KEIL
  191747. "adcs r3, r3, %[r]\n\t"
  191748. #elif defined(__clang__)
  191749. "adcs r3, %[r]\n\t"
  191750. #else
  191751. "adc r3, %[r]\n\t"
  191752. #endif
  191753. #ifdef WOLFSSL_KEIL
  191754. "adcs r4, r4, %[r]\n\t"
  191755. #elif defined(__clang__)
  191756. "adcs r4, %[r]\n\t"
  191757. #else
  191758. "adc r4, %[r]\n\t"
  191759. #endif
  191760. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191761. "lsrs r6, r7, #16\n\t"
  191762. #else
  191763. "lsr r6, r7, #16\n\t"
  191764. #endif
  191765. #ifdef WOLFSSL_KEIL
  191766. "muls r5, r6, r5\n\t"
  191767. #elif defined(__clang__)
  191768. "muls r5, r6\n\t"
  191769. #else
  191770. "mul r5, r6\n\t"
  191771. #endif
  191772. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191773. "lsrs r6, r5, #16\n\t"
  191774. #else
  191775. "lsr r6, r5, #16\n\t"
  191776. #endif
  191777. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191778. "lsls r5, r5, #16\n\t"
  191779. #else
  191780. "lsl r5, r5, #16\n\t"
  191781. #endif
  191782. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191783. "adds r2, r2, r5\n\t"
  191784. #else
  191785. "add r2, r2, r5\n\t"
  191786. #endif
  191787. #ifdef WOLFSSL_KEIL
  191788. "adcs r3, r3, r6\n\t"
  191789. #elif defined(__clang__)
  191790. "adcs r3, r6\n\t"
  191791. #else
  191792. "adc r3, r6\n\t"
  191793. #endif
  191794. #ifdef WOLFSSL_KEIL
  191795. "adcs r4, r4, %[r]\n\t"
  191796. #elif defined(__clang__)
  191797. "adcs r4, %[r]\n\t"
  191798. #else
  191799. "adc r4, %[r]\n\t"
  191800. #endif
  191801. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191802. "adds r2, r2, r5\n\t"
  191803. #else
  191804. "add r2, r2, r5\n\t"
  191805. #endif
  191806. #ifdef WOLFSSL_KEIL
  191807. "adcs r3, r3, r6\n\t"
  191808. #elif defined(__clang__)
  191809. "adcs r3, r6\n\t"
  191810. #else
  191811. "adc r3, r6\n\t"
  191812. #endif
  191813. #ifdef WOLFSSL_KEIL
  191814. "adcs r4, r4, %[r]\n\t"
  191815. #elif defined(__clang__)
  191816. "adcs r4, %[r]\n\t"
  191817. #else
  191818. "adc r4, %[r]\n\t"
  191819. #endif
  191820. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191821. "lsrs r5, %[a], #16\n\t"
  191822. #else
  191823. "lsr r5, %[a], #16\n\t"
  191824. #endif
  191825. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191826. "lsrs r6, r7, #16\n\t"
  191827. #else
  191828. "lsr r6, r7, #16\n\t"
  191829. #endif
  191830. #ifdef WOLFSSL_KEIL
  191831. "muls r6, r5, r6\n\t"
  191832. #elif defined(__clang__)
  191833. "muls r6, r5\n\t"
  191834. #else
  191835. "mul r6, r5\n\t"
  191836. #endif
  191837. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191838. "adds r3, r3, r6\n\t"
  191839. #else
  191840. "add r3, r3, r6\n\t"
  191841. #endif
  191842. #ifdef WOLFSSL_KEIL
  191843. "adcs r4, r4, %[r]\n\t"
  191844. #elif defined(__clang__)
  191845. "adcs r4, %[r]\n\t"
  191846. #else
  191847. "adc r4, %[r]\n\t"
  191848. #endif
  191849. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191850. "adds r3, r3, r6\n\t"
  191851. #else
  191852. "add r3, r3, r6\n\t"
  191853. #endif
  191854. #ifdef WOLFSSL_KEIL
  191855. "adcs r4, r4, %[r]\n\t"
  191856. #elif defined(__clang__)
  191857. "adcs r4, %[r]\n\t"
  191858. #else
  191859. "adc r4, %[r]\n\t"
  191860. #endif
  191861. "uxth r6, r7\n\t"
  191862. #ifdef WOLFSSL_KEIL
  191863. "muls r5, r6, r5\n\t"
  191864. #elif defined(__clang__)
  191865. "muls r5, r6\n\t"
  191866. #else
  191867. "mul r5, r6\n\t"
  191868. #endif
  191869. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191870. "lsrs r6, r5, #16\n\t"
  191871. #else
  191872. "lsr r6, r5, #16\n\t"
  191873. #endif
  191874. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191875. "lsls r5, r5, #16\n\t"
  191876. #else
  191877. "lsl r5, r5, #16\n\t"
  191878. #endif
  191879. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191880. "adds r2, r2, r5\n\t"
  191881. #else
  191882. "add r2, r2, r5\n\t"
  191883. #endif
  191884. #ifdef WOLFSSL_KEIL
  191885. "adcs r3, r3, r6\n\t"
  191886. #elif defined(__clang__)
  191887. "adcs r3, r6\n\t"
  191888. #else
  191889. "adc r3, r6\n\t"
  191890. #endif
  191891. #ifdef WOLFSSL_KEIL
  191892. "adcs r4, r4, %[r]\n\t"
  191893. #elif defined(__clang__)
  191894. "adcs r4, %[r]\n\t"
  191895. #else
  191896. "adc r4, %[r]\n\t"
  191897. #endif
  191898. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191899. "adds r2, r2, r5\n\t"
  191900. #else
  191901. "add r2, r2, r5\n\t"
  191902. #endif
  191903. #ifdef WOLFSSL_KEIL
  191904. "adcs r3, r3, r6\n\t"
  191905. #elif defined(__clang__)
  191906. "adcs r3, r6\n\t"
  191907. #else
  191908. "adc r3, r6\n\t"
  191909. #endif
  191910. #ifdef WOLFSSL_KEIL
  191911. "adcs r4, r4, %[r]\n\t"
  191912. #elif defined(__clang__)
  191913. "adcs r4, %[r]\n\t"
  191914. #else
  191915. "adc r4, %[r]\n\t"
  191916. #endif
  191917. "# A[13] * A[8]\n\t"
  191918. "mov %[a], r9\n\t"
  191919. "ldr r7, [%[a], #32]\n\t"
  191920. "mov %[a], r11\n\t"
  191921. "uxth r5, %[a]\n\t"
  191922. "uxth r6, r7\n\t"
  191923. #ifdef WOLFSSL_KEIL
  191924. "muls r6, r5, r6\n\t"
  191925. #elif defined(__clang__)
  191926. "muls r6, r5\n\t"
  191927. #else
  191928. "mul r6, r5\n\t"
  191929. #endif
  191930. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191931. "adds r2, r2, r6\n\t"
  191932. #else
  191933. "add r2, r2, r6\n\t"
  191934. #endif
  191935. #ifdef WOLFSSL_KEIL
  191936. "adcs r3, r3, %[r]\n\t"
  191937. #elif defined(__clang__)
  191938. "adcs r3, %[r]\n\t"
  191939. #else
  191940. "adc r3, %[r]\n\t"
  191941. #endif
  191942. #ifdef WOLFSSL_KEIL
  191943. "adcs r4, r4, %[r]\n\t"
  191944. #elif defined(__clang__)
  191945. "adcs r4, %[r]\n\t"
  191946. #else
  191947. "adc r4, %[r]\n\t"
  191948. #endif
  191949. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191950. "adds r2, r2, r6\n\t"
  191951. #else
  191952. "add r2, r2, r6\n\t"
  191953. #endif
  191954. #ifdef WOLFSSL_KEIL
  191955. "adcs r3, r3, %[r]\n\t"
  191956. #elif defined(__clang__)
  191957. "adcs r3, %[r]\n\t"
  191958. #else
  191959. "adc r3, %[r]\n\t"
  191960. #endif
  191961. #ifdef WOLFSSL_KEIL
  191962. "adcs r4, r4, %[r]\n\t"
  191963. #elif defined(__clang__)
  191964. "adcs r4, %[r]\n\t"
  191965. #else
  191966. "adc r4, %[r]\n\t"
  191967. #endif
  191968. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191969. "lsrs r6, r7, #16\n\t"
  191970. #else
  191971. "lsr r6, r7, #16\n\t"
  191972. #endif
  191973. #ifdef WOLFSSL_KEIL
  191974. "muls r5, r6, r5\n\t"
  191975. #elif defined(__clang__)
  191976. "muls r5, r6\n\t"
  191977. #else
  191978. "mul r5, r6\n\t"
  191979. #endif
  191980. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191981. "lsrs r6, r5, #16\n\t"
  191982. #else
  191983. "lsr r6, r5, #16\n\t"
  191984. #endif
  191985. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191986. "lsls r5, r5, #16\n\t"
  191987. #else
  191988. "lsl r5, r5, #16\n\t"
  191989. #endif
  191990. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191991. "adds r2, r2, r5\n\t"
  191992. #else
  191993. "add r2, r2, r5\n\t"
  191994. #endif
  191995. #ifdef WOLFSSL_KEIL
  191996. "adcs r3, r3, r6\n\t"
  191997. #elif defined(__clang__)
  191998. "adcs r3, r6\n\t"
  191999. #else
  192000. "adc r3, r6\n\t"
  192001. #endif
  192002. #ifdef WOLFSSL_KEIL
  192003. "adcs r4, r4, %[r]\n\t"
  192004. #elif defined(__clang__)
  192005. "adcs r4, %[r]\n\t"
  192006. #else
  192007. "adc r4, %[r]\n\t"
  192008. #endif
  192009. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192010. "adds r2, r2, r5\n\t"
  192011. #else
  192012. "add r2, r2, r5\n\t"
  192013. #endif
  192014. #ifdef WOLFSSL_KEIL
  192015. "adcs r3, r3, r6\n\t"
  192016. #elif defined(__clang__)
  192017. "adcs r3, r6\n\t"
  192018. #else
  192019. "adc r3, r6\n\t"
  192020. #endif
  192021. #ifdef WOLFSSL_KEIL
  192022. "adcs r4, r4, %[r]\n\t"
  192023. #elif defined(__clang__)
  192024. "adcs r4, %[r]\n\t"
  192025. #else
  192026. "adc r4, %[r]\n\t"
  192027. #endif
  192028. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192029. "lsrs r5, %[a], #16\n\t"
  192030. #else
  192031. "lsr r5, %[a], #16\n\t"
  192032. #endif
  192033. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192034. "lsrs r6, r7, #16\n\t"
  192035. #else
  192036. "lsr r6, r7, #16\n\t"
  192037. #endif
  192038. #ifdef WOLFSSL_KEIL
  192039. "muls r6, r5, r6\n\t"
  192040. #elif defined(__clang__)
  192041. "muls r6, r5\n\t"
  192042. #else
  192043. "mul r6, r5\n\t"
  192044. #endif
  192045. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192046. "adds r3, r3, r6\n\t"
  192047. #else
  192048. "add r3, r3, r6\n\t"
  192049. #endif
  192050. #ifdef WOLFSSL_KEIL
  192051. "adcs r4, r4, %[r]\n\t"
  192052. #elif defined(__clang__)
  192053. "adcs r4, %[r]\n\t"
  192054. #else
  192055. "adc r4, %[r]\n\t"
  192056. #endif
  192057. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192058. "adds r3, r3, r6\n\t"
  192059. #else
  192060. "add r3, r3, r6\n\t"
  192061. #endif
  192062. #ifdef WOLFSSL_KEIL
  192063. "adcs r4, r4, %[r]\n\t"
  192064. #elif defined(__clang__)
  192065. "adcs r4, %[r]\n\t"
  192066. #else
  192067. "adc r4, %[r]\n\t"
  192068. #endif
  192069. "uxth r6, r7\n\t"
  192070. #ifdef WOLFSSL_KEIL
  192071. "muls r5, r6, r5\n\t"
  192072. #elif defined(__clang__)
  192073. "muls r5, r6\n\t"
  192074. #else
  192075. "mul r5, r6\n\t"
  192076. #endif
  192077. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192078. "lsrs r6, r5, #16\n\t"
  192079. #else
  192080. "lsr r6, r5, #16\n\t"
  192081. #endif
  192082. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192083. "lsls r5, r5, #16\n\t"
  192084. #else
  192085. "lsl r5, r5, #16\n\t"
  192086. #endif
  192087. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192088. "adds r2, r2, r5\n\t"
  192089. #else
  192090. "add r2, r2, r5\n\t"
  192091. #endif
  192092. #ifdef WOLFSSL_KEIL
  192093. "adcs r3, r3, r6\n\t"
  192094. #elif defined(__clang__)
  192095. "adcs r3, r6\n\t"
  192096. #else
  192097. "adc r3, r6\n\t"
  192098. #endif
  192099. #ifdef WOLFSSL_KEIL
  192100. "adcs r4, r4, %[r]\n\t"
  192101. #elif defined(__clang__)
  192102. "adcs r4, %[r]\n\t"
  192103. #else
  192104. "adc r4, %[r]\n\t"
  192105. #endif
  192106. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192107. "adds r2, r2, r5\n\t"
  192108. #else
  192109. "add r2, r2, r5\n\t"
  192110. #endif
  192111. #ifdef WOLFSSL_KEIL
  192112. "adcs r3, r3, r6\n\t"
  192113. #elif defined(__clang__)
  192114. "adcs r3, r6\n\t"
  192115. #else
  192116. "adc r3, r6\n\t"
  192117. #endif
  192118. #ifdef WOLFSSL_KEIL
  192119. "adcs r4, r4, %[r]\n\t"
  192120. #elif defined(__clang__)
  192121. "adcs r4, %[r]\n\t"
  192122. #else
  192123. "adc r4, %[r]\n\t"
  192124. #endif
  192125. "# A[14] * A[7]\n\t"
  192126. "mov %[a], r9\n\t"
  192127. "ldr r7, [%[a], #28]\n\t"
  192128. "mov %[a], r12\n\t"
  192129. "uxth r5, %[a]\n\t"
  192130. "uxth r6, r7\n\t"
  192131. #ifdef WOLFSSL_KEIL
  192132. "muls r6, r5, r6\n\t"
  192133. #elif defined(__clang__)
  192134. "muls r6, r5\n\t"
  192135. #else
  192136. "mul r6, r5\n\t"
  192137. #endif
  192138. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192139. "adds r2, r2, r6\n\t"
  192140. #else
  192141. "add r2, r2, r6\n\t"
  192142. #endif
  192143. #ifdef WOLFSSL_KEIL
  192144. "adcs r3, r3, %[r]\n\t"
  192145. #elif defined(__clang__)
  192146. "adcs r3, %[r]\n\t"
  192147. #else
  192148. "adc r3, %[r]\n\t"
  192149. #endif
  192150. #ifdef WOLFSSL_KEIL
  192151. "adcs r4, r4, %[r]\n\t"
  192152. #elif defined(__clang__)
  192153. "adcs r4, %[r]\n\t"
  192154. #else
  192155. "adc r4, %[r]\n\t"
  192156. #endif
  192157. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192158. "adds r2, r2, r6\n\t"
  192159. #else
  192160. "add r2, r2, r6\n\t"
  192161. #endif
  192162. #ifdef WOLFSSL_KEIL
  192163. "adcs r3, r3, %[r]\n\t"
  192164. #elif defined(__clang__)
  192165. "adcs r3, %[r]\n\t"
  192166. #else
  192167. "adc r3, %[r]\n\t"
  192168. #endif
  192169. #ifdef WOLFSSL_KEIL
  192170. "adcs r4, r4, %[r]\n\t"
  192171. #elif defined(__clang__)
  192172. "adcs r4, %[r]\n\t"
  192173. #else
  192174. "adc r4, %[r]\n\t"
  192175. #endif
  192176. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192177. "lsrs r6, r7, #16\n\t"
  192178. #else
  192179. "lsr r6, r7, #16\n\t"
  192180. #endif
  192181. #ifdef WOLFSSL_KEIL
  192182. "muls r5, r6, r5\n\t"
  192183. #elif defined(__clang__)
  192184. "muls r5, r6\n\t"
  192185. #else
  192186. "mul r5, r6\n\t"
  192187. #endif
  192188. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192189. "lsrs r6, r5, #16\n\t"
  192190. #else
  192191. "lsr r6, r5, #16\n\t"
  192192. #endif
  192193. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192194. "lsls r5, r5, #16\n\t"
  192195. #else
  192196. "lsl r5, r5, #16\n\t"
  192197. #endif
  192198. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192199. "adds r2, r2, r5\n\t"
  192200. #else
  192201. "add r2, r2, r5\n\t"
  192202. #endif
  192203. #ifdef WOLFSSL_KEIL
  192204. "adcs r3, r3, r6\n\t"
  192205. #elif defined(__clang__)
  192206. "adcs r3, r6\n\t"
  192207. #else
  192208. "adc r3, r6\n\t"
  192209. #endif
  192210. #ifdef WOLFSSL_KEIL
  192211. "adcs r4, r4, %[r]\n\t"
  192212. #elif defined(__clang__)
  192213. "adcs r4, %[r]\n\t"
  192214. #else
  192215. "adc r4, %[r]\n\t"
  192216. #endif
  192217. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192218. "adds r2, r2, r5\n\t"
  192219. #else
  192220. "add r2, r2, r5\n\t"
  192221. #endif
  192222. #ifdef WOLFSSL_KEIL
  192223. "adcs r3, r3, r6\n\t"
  192224. #elif defined(__clang__)
  192225. "adcs r3, r6\n\t"
  192226. #else
  192227. "adc r3, r6\n\t"
  192228. #endif
  192229. #ifdef WOLFSSL_KEIL
  192230. "adcs r4, r4, %[r]\n\t"
  192231. #elif defined(__clang__)
  192232. "adcs r4, %[r]\n\t"
  192233. #else
  192234. "adc r4, %[r]\n\t"
  192235. #endif
  192236. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192237. "lsrs r5, %[a], #16\n\t"
  192238. #else
  192239. "lsr r5, %[a], #16\n\t"
  192240. #endif
  192241. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192242. "lsrs r6, r7, #16\n\t"
  192243. #else
  192244. "lsr r6, r7, #16\n\t"
  192245. #endif
  192246. #ifdef WOLFSSL_KEIL
  192247. "muls r6, r5, r6\n\t"
  192248. #elif defined(__clang__)
  192249. "muls r6, r5\n\t"
  192250. #else
  192251. "mul r6, r5\n\t"
  192252. #endif
  192253. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192254. "adds r3, r3, r6\n\t"
  192255. #else
  192256. "add r3, r3, r6\n\t"
  192257. #endif
  192258. #ifdef WOLFSSL_KEIL
  192259. "adcs r4, r4, %[r]\n\t"
  192260. #elif defined(__clang__)
  192261. "adcs r4, %[r]\n\t"
  192262. #else
  192263. "adc r4, %[r]\n\t"
  192264. #endif
  192265. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192266. "adds r3, r3, r6\n\t"
  192267. #else
  192268. "add r3, r3, r6\n\t"
  192269. #endif
  192270. #ifdef WOLFSSL_KEIL
  192271. "adcs r4, r4, %[r]\n\t"
  192272. #elif defined(__clang__)
  192273. "adcs r4, %[r]\n\t"
  192274. #else
  192275. "adc r4, %[r]\n\t"
  192276. #endif
  192277. "uxth r6, r7\n\t"
  192278. #ifdef WOLFSSL_KEIL
  192279. "muls r5, r6, r5\n\t"
  192280. #elif defined(__clang__)
  192281. "muls r5, r6\n\t"
  192282. #else
  192283. "mul r5, r6\n\t"
  192284. #endif
  192285. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192286. "lsrs r6, r5, #16\n\t"
  192287. #else
  192288. "lsr r6, r5, #16\n\t"
  192289. #endif
  192290. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192291. "lsls r5, r5, #16\n\t"
  192292. #else
  192293. "lsl r5, r5, #16\n\t"
  192294. #endif
  192295. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192296. "adds r2, r2, r5\n\t"
  192297. #else
  192298. "add r2, r2, r5\n\t"
  192299. #endif
  192300. #ifdef WOLFSSL_KEIL
  192301. "adcs r3, r3, r6\n\t"
  192302. #elif defined(__clang__)
  192303. "adcs r3, r6\n\t"
  192304. #else
  192305. "adc r3, r6\n\t"
  192306. #endif
  192307. #ifdef WOLFSSL_KEIL
  192308. "adcs r4, r4, %[r]\n\t"
  192309. #elif defined(__clang__)
  192310. "adcs r4, %[r]\n\t"
  192311. #else
  192312. "adc r4, %[r]\n\t"
  192313. #endif
  192314. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192315. "adds r2, r2, r5\n\t"
  192316. #else
  192317. "add r2, r2, r5\n\t"
  192318. #endif
  192319. #ifdef WOLFSSL_KEIL
  192320. "adcs r3, r3, r6\n\t"
  192321. #elif defined(__clang__)
  192322. "adcs r3, r6\n\t"
  192323. #else
  192324. "adc r3, r6\n\t"
  192325. #endif
  192326. #ifdef WOLFSSL_KEIL
  192327. "adcs r4, r4, %[r]\n\t"
  192328. #elif defined(__clang__)
  192329. "adcs r4, %[r]\n\t"
  192330. #else
  192331. "adc r4, %[r]\n\t"
  192332. #endif
  192333. "# A[15] * A[6]\n\t"
  192334. "mov %[a], r9\n\t"
  192335. "ldr r7, [%[a], #24]\n\t"
  192336. "mov %[a], lr\n\t"
  192337. "uxth r5, %[a]\n\t"
  192338. "uxth r6, r7\n\t"
  192339. #ifdef WOLFSSL_KEIL
  192340. "muls r6, r5, r6\n\t"
  192341. #elif defined(__clang__)
  192342. "muls r6, r5\n\t"
  192343. #else
  192344. "mul r6, r5\n\t"
  192345. #endif
  192346. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192347. "adds r2, r2, r6\n\t"
  192348. #else
  192349. "add r2, r2, r6\n\t"
  192350. #endif
  192351. #ifdef WOLFSSL_KEIL
  192352. "adcs r3, r3, %[r]\n\t"
  192353. #elif defined(__clang__)
  192354. "adcs r3, %[r]\n\t"
  192355. #else
  192356. "adc r3, %[r]\n\t"
  192357. #endif
  192358. #ifdef WOLFSSL_KEIL
  192359. "adcs r4, r4, %[r]\n\t"
  192360. #elif defined(__clang__)
  192361. "adcs r4, %[r]\n\t"
  192362. #else
  192363. "adc r4, %[r]\n\t"
  192364. #endif
  192365. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192366. "adds r2, r2, r6\n\t"
  192367. #else
  192368. "add r2, r2, r6\n\t"
  192369. #endif
  192370. #ifdef WOLFSSL_KEIL
  192371. "adcs r3, r3, %[r]\n\t"
  192372. #elif defined(__clang__)
  192373. "adcs r3, %[r]\n\t"
  192374. #else
  192375. "adc r3, %[r]\n\t"
  192376. #endif
  192377. #ifdef WOLFSSL_KEIL
  192378. "adcs r4, r4, %[r]\n\t"
  192379. #elif defined(__clang__)
  192380. "adcs r4, %[r]\n\t"
  192381. #else
  192382. "adc r4, %[r]\n\t"
  192383. #endif
  192384. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192385. "lsrs r6, r7, #16\n\t"
  192386. #else
  192387. "lsr r6, r7, #16\n\t"
  192388. #endif
  192389. #ifdef WOLFSSL_KEIL
  192390. "muls r5, r6, r5\n\t"
  192391. #elif defined(__clang__)
  192392. "muls r5, r6\n\t"
  192393. #else
  192394. "mul r5, r6\n\t"
  192395. #endif
  192396. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192397. "lsrs r6, r5, #16\n\t"
  192398. #else
  192399. "lsr r6, r5, #16\n\t"
  192400. #endif
  192401. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192402. "lsls r5, r5, #16\n\t"
  192403. #else
  192404. "lsl r5, r5, #16\n\t"
  192405. #endif
  192406. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192407. "adds r2, r2, r5\n\t"
  192408. #else
  192409. "add r2, r2, r5\n\t"
  192410. #endif
  192411. #ifdef WOLFSSL_KEIL
  192412. "adcs r3, r3, r6\n\t"
  192413. #elif defined(__clang__)
  192414. "adcs r3, r6\n\t"
  192415. #else
  192416. "adc r3, r6\n\t"
  192417. #endif
  192418. #ifdef WOLFSSL_KEIL
  192419. "adcs r4, r4, %[r]\n\t"
  192420. #elif defined(__clang__)
  192421. "adcs r4, %[r]\n\t"
  192422. #else
  192423. "adc r4, %[r]\n\t"
  192424. #endif
  192425. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192426. "adds r2, r2, r5\n\t"
  192427. #else
  192428. "add r2, r2, r5\n\t"
  192429. #endif
  192430. #ifdef WOLFSSL_KEIL
  192431. "adcs r3, r3, r6\n\t"
  192432. #elif defined(__clang__)
  192433. "adcs r3, r6\n\t"
  192434. #else
  192435. "adc r3, r6\n\t"
  192436. #endif
  192437. #ifdef WOLFSSL_KEIL
  192438. "adcs r4, r4, %[r]\n\t"
  192439. #elif defined(__clang__)
  192440. "adcs r4, %[r]\n\t"
  192441. #else
  192442. "adc r4, %[r]\n\t"
  192443. #endif
  192444. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192445. "lsrs r5, %[a], #16\n\t"
  192446. #else
  192447. "lsr r5, %[a], #16\n\t"
  192448. #endif
  192449. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192450. "lsrs r6, r7, #16\n\t"
  192451. #else
  192452. "lsr r6, r7, #16\n\t"
  192453. #endif
  192454. #ifdef WOLFSSL_KEIL
  192455. "muls r6, r5, r6\n\t"
  192456. #elif defined(__clang__)
  192457. "muls r6, r5\n\t"
  192458. #else
  192459. "mul r6, r5\n\t"
  192460. #endif
  192461. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192462. "adds r3, r3, r6\n\t"
  192463. #else
  192464. "add r3, r3, r6\n\t"
  192465. #endif
  192466. #ifdef WOLFSSL_KEIL
  192467. "adcs r4, r4, %[r]\n\t"
  192468. #elif defined(__clang__)
  192469. "adcs r4, %[r]\n\t"
  192470. #else
  192471. "adc r4, %[r]\n\t"
  192472. #endif
  192473. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192474. "adds r3, r3, r6\n\t"
  192475. #else
  192476. "add r3, r3, r6\n\t"
  192477. #endif
  192478. #ifdef WOLFSSL_KEIL
  192479. "adcs r4, r4, %[r]\n\t"
  192480. #elif defined(__clang__)
  192481. "adcs r4, %[r]\n\t"
  192482. #else
  192483. "adc r4, %[r]\n\t"
  192484. #endif
  192485. "uxth r6, r7\n\t"
  192486. #ifdef WOLFSSL_KEIL
  192487. "muls r5, r6, r5\n\t"
  192488. #elif defined(__clang__)
  192489. "muls r5, r6\n\t"
  192490. #else
  192491. "mul r5, r6\n\t"
  192492. #endif
  192493. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192494. "lsrs r6, r5, #16\n\t"
  192495. #else
  192496. "lsr r6, r5, #16\n\t"
  192497. #endif
  192498. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192499. "lsls r5, r5, #16\n\t"
  192500. #else
  192501. "lsl r5, r5, #16\n\t"
  192502. #endif
  192503. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192504. "adds r2, r2, r5\n\t"
  192505. #else
  192506. "add r2, r2, r5\n\t"
  192507. #endif
  192508. #ifdef WOLFSSL_KEIL
  192509. "adcs r3, r3, r6\n\t"
  192510. #elif defined(__clang__)
  192511. "adcs r3, r6\n\t"
  192512. #else
  192513. "adc r3, r6\n\t"
  192514. #endif
  192515. #ifdef WOLFSSL_KEIL
  192516. "adcs r4, r4, %[r]\n\t"
  192517. #elif defined(__clang__)
  192518. "adcs r4, %[r]\n\t"
  192519. #else
  192520. "adc r4, %[r]\n\t"
  192521. #endif
  192522. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192523. "adds r2, r2, r5\n\t"
  192524. #else
  192525. "add r2, r2, r5\n\t"
  192526. #endif
  192527. #ifdef WOLFSSL_KEIL
  192528. "adcs r3, r3, r6\n\t"
  192529. #elif defined(__clang__)
  192530. "adcs r3, r6\n\t"
  192531. #else
  192532. "adc r3, r6\n\t"
  192533. #endif
  192534. #ifdef WOLFSSL_KEIL
  192535. "adcs r4, r4, %[r]\n\t"
  192536. #elif defined(__clang__)
  192537. "adcs r4, %[r]\n\t"
  192538. #else
  192539. "adc r4, %[r]\n\t"
  192540. #endif
  192541. "mov %[r], r8\n\t"
  192542. "str r2, [%[r], #84]\n\t"
  192543. "movs %[r], #0\n\t"
  192544. "# A[15] * A[7]\n\t"
  192545. "movs r2, #0\n\t"
  192546. "mov %[a], r9\n\t"
  192547. "ldr r7, [%[a], #28]\n\t"
  192548. "mov %[a], lr\n\t"
  192549. "uxth r5, %[a]\n\t"
  192550. "uxth r6, r7\n\t"
  192551. #ifdef WOLFSSL_KEIL
  192552. "muls r6, r5, r6\n\t"
  192553. #elif defined(__clang__)
  192554. "muls r6, r5\n\t"
  192555. #else
  192556. "mul r6, r5\n\t"
  192557. #endif
  192558. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192559. "adds r3, r3, r6\n\t"
  192560. #else
  192561. "add r3, r3, r6\n\t"
  192562. #endif
  192563. #ifdef WOLFSSL_KEIL
  192564. "adcs r4, r4, %[r]\n\t"
  192565. #elif defined(__clang__)
  192566. "adcs r4, %[r]\n\t"
  192567. #else
  192568. "adc r4, %[r]\n\t"
  192569. #endif
  192570. #ifdef WOLFSSL_KEIL
  192571. "adcs r2, r2, %[r]\n\t"
  192572. #elif defined(__clang__)
  192573. "adcs r2, %[r]\n\t"
  192574. #else
  192575. "adc r2, %[r]\n\t"
  192576. #endif
  192577. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192578. "adds r3, r3, r6\n\t"
  192579. #else
  192580. "add r3, r3, r6\n\t"
  192581. #endif
  192582. #ifdef WOLFSSL_KEIL
  192583. "adcs r4, r4, %[r]\n\t"
  192584. #elif defined(__clang__)
  192585. "adcs r4, %[r]\n\t"
  192586. #else
  192587. "adc r4, %[r]\n\t"
  192588. #endif
  192589. #ifdef WOLFSSL_KEIL
  192590. "adcs r2, r2, %[r]\n\t"
  192591. #elif defined(__clang__)
  192592. "adcs r2, %[r]\n\t"
  192593. #else
  192594. "adc r2, %[r]\n\t"
  192595. #endif
  192596. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192597. "lsrs r6, r7, #16\n\t"
  192598. #else
  192599. "lsr r6, r7, #16\n\t"
  192600. #endif
  192601. #ifdef WOLFSSL_KEIL
  192602. "muls r5, r6, r5\n\t"
  192603. #elif defined(__clang__)
  192604. "muls r5, r6\n\t"
  192605. #else
  192606. "mul r5, r6\n\t"
  192607. #endif
  192608. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192609. "lsrs r6, r5, #16\n\t"
  192610. #else
  192611. "lsr r6, r5, #16\n\t"
  192612. #endif
  192613. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192614. "lsls r5, r5, #16\n\t"
  192615. #else
  192616. "lsl r5, r5, #16\n\t"
  192617. #endif
  192618. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192619. "adds r3, r3, r5\n\t"
  192620. #else
  192621. "add r3, r3, r5\n\t"
  192622. #endif
  192623. #ifdef WOLFSSL_KEIL
  192624. "adcs r4, r4, r6\n\t"
  192625. #elif defined(__clang__)
  192626. "adcs r4, r6\n\t"
  192627. #else
  192628. "adc r4, r6\n\t"
  192629. #endif
  192630. #ifdef WOLFSSL_KEIL
  192631. "adcs r2, r2, %[r]\n\t"
  192632. #elif defined(__clang__)
  192633. "adcs r2, %[r]\n\t"
  192634. #else
  192635. "adc r2, %[r]\n\t"
  192636. #endif
  192637. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192638. "adds r3, r3, r5\n\t"
  192639. #else
  192640. "add r3, r3, r5\n\t"
  192641. #endif
  192642. #ifdef WOLFSSL_KEIL
  192643. "adcs r4, r4, r6\n\t"
  192644. #elif defined(__clang__)
  192645. "adcs r4, r6\n\t"
  192646. #else
  192647. "adc r4, r6\n\t"
  192648. #endif
  192649. #ifdef WOLFSSL_KEIL
  192650. "adcs r2, r2, %[r]\n\t"
  192651. #elif defined(__clang__)
  192652. "adcs r2, %[r]\n\t"
  192653. #else
  192654. "adc r2, %[r]\n\t"
  192655. #endif
  192656. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192657. "lsrs r5, %[a], #16\n\t"
  192658. #else
  192659. "lsr r5, %[a], #16\n\t"
  192660. #endif
  192661. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192662. "lsrs r6, r7, #16\n\t"
  192663. #else
  192664. "lsr r6, r7, #16\n\t"
  192665. #endif
  192666. #ifdef WOLFSSL_KEIL
  192667. "muls r6, r5, r6\n\t"
  192668. #elif defined(__clang__)
  192669. "muls r6, r5\n\t"
  192670. #else
  192671. "mul r6, r5\n\t"
  192672. #endif
  192673. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192674. "adds r4, r4, r6\n\t"
  192675. #else
  192676. "add r4, r4, r6\n\t"
  192677. #endif
  192678. #ifdef WOLFSSL_KEIL
  192679. "adcs r2, r2, %[r]\n\t"
  192680. #elif defined(__clang__)
  192681. "adcs r2, %[r]\n\t"
  192682. #else
  192683. "adc r2, %[r]\n\t"
  192684. #endif
  192685. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192686. "adds r4, r4, r6\n\t"
  192687. #else
  192688. "add r4, r4, r6\n\t"
  192689. #endif
  192690. #ifdef WOLFSSL_KEIL
  192691. "adcs r2, r2, %[r]\n\t"
  192692. #elif defined(__clang__)
  192693. "adcs r2, %[r]\n\t"
  192694. #else
  192695. "adc r2, %[r]\n\t"
  192696. #endif
  192697. "uxth r6, r7\n\t"
  192698. #ifdef WOLFSSL_KEIL
  192699. "muls r5, r6, r5\n\t"
  192700. #elif defined(__clang__)
  192701. "muls r5, r6\n\t"
  192702. #else
  192703. "mul r5, r6\n\t"
  192704. #endif
  192705. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192706. "lsrs r6, r5, #16\n\t"
  192707. #else
  192708. "lsr r6, r5, #16\n\t"
  192709. #endif
  192710. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192711. "lsls r5, r5, #16\n\t"
  192712. #else
  192713. "lsl r5, r5, #16\n\t"
  192714. #endif
  192715. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192716. "adds r3, r3, r5\n\t"
  192717. #else
  192718. "add r3, r3, r5\n\t"
  192719. #endif
  192720. #ifdef WOLFSSL_KEIL
  192721. "adcs r4, r4, r6\n\t"
  192722. #elif defined(__clang__)
  192723. "adcs r4, r6\n\t"
  192724. #else
  192725. "adc r4, r6\n\t"
  192726. #endif
  192727. #ifdef WOLFSSL_KEIL
  192728. "adcs r2, r2, %[r]\n\t"
  192729. #elif defined(__clang__)
  192730. "adcs r2, %[r]\n\t"
  192731. #else
  192732. "adc r2, %[r]\n\t"
  192733. #endif
  192734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192735. "adds r3, r3, r5\n\t"
  192736. #else
  192737. "add r3, r3, r5\n\t"
  192738. #endif
  192739. #ifdef WOLFSSL_KEIL
  192740. "adcs r4, r4, r6\n\t"
  192741. #elif defined(__clang__)
  192742. "adcs r4, r6\n\t"
  192743. #else
  192744. "adc r4, r6\n\t"
  192745. #endif
  192746. #ifdef WOLFSSL_KEIL
  192747. "adcs r2, r2, %[r]\n\t"
  192748. #elif defined(__clang__)
  192749. "adcs r2, %[r]\n\t"
  192750. #else
  192751. "adc r2, %[r]\n\t"
  192752. #endif
  192753. "# A[14] * A[8]\n\t"
  192754. "mov %[a], r9\n\t"
  192755. "ldr r7, [%[a], #32]\n\t"
  192756. "mov %[a], r12\n\t"
  192757. "uxth r5, %[a]\n\t"
  192758. "uxth r6, r7\n\t"
  192759. #ifdef WOLFSSL_KEIL
  192760. "muls r6, r5, r6\n\t"
  192761. #elif defined(__clang__)
  192762. "muls r6, r5\n\t"
  192763. #else
  192764. "mul r6, r5\n\t"
  192765. #endif
  192766. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192767. "adds r3, r3, r6\n\t"
  192768. #else
  192769. "add r3, r3, r6\n\t"
  192770. #endif
  192771. #ifdef WOLFSSL_KEIL
  192772. "adcs r4, r4, %[r]\n\t"
  192773. #elif defined(__clang__)
  192774. "adcs r4, %[r]\n\t"
  192775. #else
  192776. "adc r4, %[r]\n\t"
  192777. #endif
  192778. #ifdef WOLFSSL_KEIL
  192779. "adcs r2, r2, %[r]\n\t"
  192780. #elif defined(__clang__)
  192781. "adcs r2, %[r]\n\t"
  192782. #else
  192783. "adc r2, %[r]\n\t"
  192784. #endif
  192785. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192786. "adds r3, r3, r6\n\t"
  192787. #else
  192788. "add r3, r3, r6\n\t"
  192789. #endif
  192790. #ifdef WOLFSSL_KEIL
  192791. "adcs r4, r4, %[r]\n\t"
  192792. #elif defined(__clang__)
  192793. "adcs r4, %[r]\n\t"
  192794. #else
  192795. "adc r4, %[r]\n\t"
  192796. #endif
  192797. #ifdef WOLFSSL_KEIL
  192798. "adcs r2, r2, %[r]\n\t"
  192799. #elif defined(__clang__)
  192800. "adcs r2, %[r]\n\t"
  192801. #else
  192802. "adc r2, %[r]\n\t"
  192803. #endif
  192804. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192805. "lsrs r6, r7, #16\n\t"
  192806. #else
  192807. "lsr r6, r7, #16\n\t"
  192808. #endif
  192809. #ifdef WOLFSSL_KEIL
  192810. "muls r5, r6, r5\n\t"
  192811. #elif defined(__clang__)
  192812. "muls r5, r6\n\t"
  192813. #else
  192814. "mul r5, r6\n\t"
  192815. #endif
  192816. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192817. "lsrs r6, r5, #16\n\t"
  192818. #else
  192819. "lsr r6, r5, #16\n\t"
  192820. #endif
  192821. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192822. "lsls r5, r5, #16\n\t"
  192823. #else
  192824. "lsl r5, r5, #16\n\t"
  192825. #endif
  192826. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192827. "adds r3, r3, r5\n\t"
  192828. #else
  192829. "add r3, r3, r5\n\t"
  192830. #endif
  192831. #ifdef WOLFSSL_KEIL
  192832. "adcs r4, r4, r6\n\t"
  192833. #elif defined(__clang__)
  192834. "adcs r4, r6\n\t"
  192835. #else
  192836. "adc r4, r6\n\t"
  192837. #endif
  192838. #ifdef WOLFSSL_KEIL
  192839. "adcs r2, r2, %[r]\n\t"
  192840. #elif defined(__clang__)
  192841. "adcs r2, %[r]\n\t"
  192842. #else
  192843. "adc r2, %[r]\n\t"
  192844. #endif
  192845. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192846. "adds r3, r3, r5\n\t"
  192847. #else
  192848. "add r3, r3, r5\n\t"
  192849. #endif
  192850. #ifdef WOLFSSL_KEIL
  192851. "adcs r4, r4, r6\n\t"
  192852. #elif defined(__clang__)
  192853. "adcs r4, r6\n\t"
  192854. #else
  192855. "adc r4, r6\n\t"
  192856. #endif
  192857. #ifdef WOLFSSL_KEIL
  192858. "adcs r2, r2, %[r]\n\t"
  192859. #elif defined(__clang__)
  192860. "adcs r2, %[r]\n\t"
  192861. #else
  192862. "adc r2, %[r]\n\t"
  192863. #endif
  192864. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192865. "lsrs r5, %[a], #16\n\t"
  192866. #else
  192867. "lsr r5, %[a], #16\n\t"
  192868. #endif
  192869. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192870. "lsrs r6, r7, #16\n\t"
  192871. #else
  192872. "lsr r6, r7, #16\n\t"
  192873. #endif
  192874. #ifdef WOLFSSL_KEIL
  192875. "muls r6, r5, r6\n\t"
  192876. #elif defined(__clang__)
  192877. "muls r6, r5\n\t"
  192878. #else
  192879. "mul r6, r5\n\t"
  192880. #endif
  192881. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192882. "adds r4, r4, r6\n\t"
  192883. #else
  192884. "add r4, r4, r6\n\t"
  192885. #endif
  192886. #ifdef WOLFSSL_KEIL
  192887. "adcs r2, r2, %[r]\n\t"
  192888. #elif defined(__clang__)
  192889. "adcs r2, %[r]\n\t"
  192890. #else
  192891. "adc r2, %[r]\n\t"
  192892. #endif
  192893. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192894. "adds r4, r4, r6\n\t"
  192895. #else
  192896. "add r4, r4, r6\n\t"
  192897. #endif
  192898. #ifdef WOLFSSL_KEIL
  192899. "adcs r2, r2, %[r]\n\t"
  192900. #elif defined(__clang__)
  192901. "adcs r2, %[r]\n\t"
  192902. #else
  192903. "adc r2, %[r]\n\t"
  192904. #endif
  192905. "uxth r6, r7\n\t"
  192906. #ifdef WOLFSSL_KEIL
  192907. "muls r5, r6, r5\n\t"
  192908. #elif defined(__clang__)
  192909. "muls r5, r6\n\t"
  192910. #else
  192911. "mul r5, r6\n\t"
  192912. #endif
  192913. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192914. "lsrs r6, r5, #16\n\t"
  192915. #else
  192916. "lsr r6, r5, #16\n\t"
  192917. #endif
  192918. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192919. "lsls r5, r5, #16\n\t"
  192920. #else
  192921. "lsl r5, r5, #16\n\t"
  192922. #endif
  192923. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192924. "adds r3, r3, r5\n\t"
  192925. #else
  192926. "add r3, r3, r5\n\t"
  192927. #endif
  192928. #ifdef WOLFSSL_KEIL
  192929. "adcs r4, r4, r6\n\t"
  192930. #elif defined(__clang__)
  192931. "adcs r4, r6\n\t"
  192932. #else
  192933. "adc r4, r6\n\t"
  192934. #endif
  192935. #ifdef WOLFSSL_KEIL
  192936. "adcs r2, r2, %[r]\n\t"
  192937. #elif defined(__clang__)
  192938. "adcs r2, %[r]\n\t"
  192939. #else
  192940. "adc r2, %[r]\n\t"
  192941. #endif
  192942. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192943. "adds r3, r3, r5\n\t"
  192944. #else
  192945. "add r3, r3, r5\n\t"
  192946. #endif
  192947. #ifdef WOLFSSL_KEIL
  192948. "adcs r4, r4, r6\n\t"
  192949. #elif defined(__clang__)
  192950. "adcs r4, r6\n\t"
  192951. #else
  192952. "adc r4, r6\n\t"
  192953. #endif
  192954. #ifdef WOLFSSL_KEIL
  192955. "adcs r2, r2, %[r]\n\t"
  192956. #elif defined(__clang__)
  192957. "adcs r2, %[r]\n\t"
  192958. #else
  192959. "adc r2, %[r]\n\t"
  192960. #endif
  192961. "# A[13] * A[9]\n\t"
  192962. "mov %[a], r9\n\t"
  192963. "ldr r7, [%[a], #36]\n\t"
  192964. "mov %[a], r11\n\t"
  192965. "uxth r5, %[a]\n\t"
  192966. "uxth r6, r7\n\t"
  192967. #ifdef WOLFSSL_KEIL
  192968. "muls r6, r5, r6\n\t"
  192969. #elif defined(__clang__)
  192970. "muls r6, r5\n\t"
  192971. #else
  192972. "mul r6, r5\n\t"
  192973. #endif
  192974. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192975. "adds r3, r3, r6\n\t"
  192976. #else
  192977. "add r3, r3, r6\n\t"
  192978. #endif
  192979. #ifdef WOLFSSL_KEIL
  192980. "adcs r4, r4, %[r]\n\t"
  192981. #elif defined(__clang__)
  192982. "adcs r4, %[r]\n\t"
  192983. #else
  192984. "adc r4, %[r]\n\t"
  192985. #endif
  192986. #ifdef WOLFSSL_KEIL
  192987. "adcs r2, r2, %[r]\n\t"
  192988. #elif defined(__clang__)
  192989. "adcs r2, %[r]\n\t"
  192990. #else
  192991. "adc r2, %[r]\n\t"
  192992. #endif
  192993. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192994. "adds r3, r3, r6\n\t"
  192995. #else
  192996. "add r3, r3, r6\n\t"
  192997. #endif
  192998. #ifdef WOLFSSL_KEIL
  192999. "adcs r4, r4, %[r]\n\t"
  193000. #elif defined(__clang__)
  193001. "adcs r4, %[r]\n\t"
  193002. #else
  193003. "adc r4, %[r]\n\t"
  193004. #endif
  193005. #ifdef WOLFSSL_KEIL
  193006. "adcs r2, r2, %[r]\n\t"
  193007. #elif defined(__clang__)
  193008. "adcs r2, %[r]\n\t"
  193009. #else
  193010. "adc r2, %[r]\n\t"
  193011. #endif
  193012. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193013. "lsrs r6, r7, #16\n\t"
  193014. #else
  193015. "lsr r6, r7, #16\n\t"
  193016. #endif
  193017. #ifdef WOLFSSL_KEIL
  193018. "muls r5, r6, r5\n\t"
  193019. #elif defined(__clang__)
  193020. "muls r5, r6\n\t"
  193021. #else
  193022. "mul r5, r6\n\t"
  193023. #endif
  193024. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193025. "lsrs r6, r5, #16\n\t"
  193026. #else
  193027. "lsr r6, r5, #16\n\t"
  193028. #endif
  193029. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193030. "lsls r5, r5, #16\n\t"
  193031. #else
  193032. "lsl r5, r5, #16\n\t"
  193033. #endif
  193034. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193035. "adds r3, r3, r5\n\t"
  193036. #else
  193037. "add r3, r3, r5\n\t"
  193038. #endif
  193039. #ifdef WOLFSSL_KEIL
  193040. "adcs r4, r4, r6\n\t"
  193041. #elif defined(__clang__)
  193042. "adcs r4, r6\n\t"
  193043. #else
  193044. "adc r4, r6\n\t"
  193045. #endif
  193046. #ifdef WOLFSSL_KEIL
  193047. "adcs r2, r2, %[r]\n\t"
  193048. #elif defined(__clang__)
  193049. "adcs r2, %[r]\n\t"
  193050. #else
  193051. "adc r2, %[r]\n\t"
  193052. #endif
  193053. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193054. "adds r3, r3, r5\n\t"
  193055. #else
  193056. "add r3, r3, r5\n\t"
  193057. #endif
  193058. #ifdef WOLFSSL_KEIL
  193059. "adcs r4, r4, r6\n\t"
  193060. #elif defined(__clang__)
  193061. "adcs r4, r6\n\t"
  193062. #else
  193063. "adc r4, r6\n\t"
  193064. #endif
  193065. #ifdef WOLFSSL_KEIL
  193066. "adcs r2, r2, %[r]\n\t"
  193067. #elif defined(__clang__)
  193068. "adcs r2, %[r]\n\t"
  193069. #else
  193070. "adc r2, %[r]\n\t"
  193071. #endif
  193072. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193073. "lsrs r5, %[a], #16\n\t"
  193074. #else
  193075. "lsr r5, %[a], #16\n\t"
  193076. #endif
  193077. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193078. "lsrs r6, r7, #16\n\t"
  193079. #else
  193080. "lsr r6, r7, #16\n\t"
  193081. #endif
  193082. #ifdef WOLFSSL_KEIL
  193083. "muls r6, r5, r6\n\t"
  193084. #elif defined(__clang__)
  193085. "muls r6, r5\n\t"
  193086. #else
  193087. "mul r6, r5\n\t"
  193088. #endif
  193089. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193090. "adds r4, r4, r6\n\t"
  193091. #else
  193092. "add r4, r4, r6\n\t"
  193093. #endif
  193094. #ifdef WOLFSSL_KEIL
  193095. "adcs r2, r2, %[r]\n\t"
  193096. #elif defined(__clang__)
  193097. "adcs r2, %[r]\n\t"
  193098. #else
  193099. "adc r2, %[r]\n\t"
  193100. #endif
  193101. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193102. "adds r4, r4, r6\n\t"
  193103. #else
  193104. "add r4, r4, r6\n\t"
  193105. #endif
  193106. #ifdef WOLFSSL_KEIL
  193107. "adcs r2, r2, %[r]\n\t"
  193108. #elif defined(__clang__)
  193109. "adcs r2, %[r]\n\t"
  193110. #else
  193111. "adc r2, %[r]\n\t"
  193112. #endif
  193113. "uxth r6, r7\n\t"
  193114. #ifdef WOLFSSL_KEIL
  193115. "muls r5, r6, r5\n\t"
  193116. #elif defined(__clang__)
  193117. "muls r5, r6\n\t"
  193118. #else
  193119. "mul r5, r6\n\t"
  193120. #endif
  193121. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193122. "lsrs r6, r5, #16\n\t"
  193123. #else
  193124. "lsr r6, r5, #16\n\t"
  193125. #endif
  193126. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193127. "lsls r5, r5, #16\n\t"
  193128. #else
  193129. "lsl r5, r5, #16\n\t"
  193130. #endif
  193131. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193132. "adds r3, r3, r5\n\t"
  193133. #else
  193134. "add r3, r3, r5\n\t"
  193135. #endif
  193136. #ifdef WOLFSSL_KEIL
  193137. "adcs r4, r4, r6\n\t"
  193138. #elif defined(__clang__)
  193139. "adcs r4, r6\n\t"
  193140. #else
  193141. "adc r4, r6\n\t"
  193142. #endif
  193143. #ifdef WOLFSSL_KEIL
  193144. "adcs r2, r2, %[r]\n\t"
  193145. #elif defined(__clang__)
  193146. "adcs r2, %[r]\n\t"
  193147. #else
  193148. "adc r2, %[r]\n\t"
  193149. #endif
  193150. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193151. "adds r3, r3, r5\n\t"
  193152. #else
  193153. "add r3, r3, r5\n\t"
  193154. #endif
  193155. #ifdef WOLFSSL_KEIL
  193156. "adcs r4, r4, r6\n\t"
  193157. #elif defined(__clang__)
  193158. "adcs r4, r6\n\t"
  193159. #else
  193160. "adc r4, r6\n\t"
  193161. #endif
  193162. #ifdef WOLFSSL_KEIL
  193163. "adcs r2, r2, %[r]\n\t"
  193164. #elif defined(__clang__)
  193165. "adcs r2, %[r]\n\t"
  193166. #else
  193167. "adc r2, %[r]\n\t"
  193168. #endif
  193169. "# A[12] * A[10]\n\t"
  193170. "mov %[a], r9\n\t"
  193171. "ldr r7, [%[a], #40]\n\t"
  193172. "mov %[a], r10\n\t"
  193173. "uxth r5, %[a]\n\t"
  193174. "uxth r6, r7\n\t"
  193175. #ifdef WOLFSSL_KEIL
  193176. "muls r6, r5, r6\n\t"
  193177. #elif defined(__clang__)
  193178. "muls r6, r5\n\t"
  193179. #else
  193180. "mul r6, r5\n\t"
  193181. #endif
  193182. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193183. "adds r3, r3, r6\n\t"
  193184. #else
  193185. "add r3, r3, r6\n\t"
  193186. #endif
  193187. #ifdef WOLFSSL_KEIL
  193188. "adcs r4, r4, %[r]\n\t"
  193189. #elif defined(__clang__)
  193190. "adcs r4, %[r]\n\t"
  193191. #else
  193192. "adc r4, %[r]\n\t"
  193193. #endif
  193194. #ifdef WOLFSSL_KEIL
  193195. "adcs r2, r2, %[r]\n\t"
  193196. #elif defined(__clang__)
  193197. "adcs r2, %[r]\n\t"
  193198. #else
  193199. "adc r2, %[r]\n\t"
  193200. #endif
  193201. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193202. "adds r3, r3, r6\n\t"
  193203. #else
  193204. "add r3, r3, r6\n\t"
  193205. #endif
  193206. #ifdef WOLFSSL_KEIL
  193207. "adcs r4, r4, %[r]\n\t"
  193208. #elif defined(__clang__)
  193209. "adcs r4, %[r]\n\t"
  193210. #else
  193211. "adc r4, %[r]\n\t"
  193212. #endif
  193213. #ifdef WOLFSSL_KEIL
  193214. "adcs r2, r2, %[r]\n\t"
  193215. #elif defined(__clang__)
  193216. "adcs r2, %[r]\n\t"
  193217. #else
  193218. "adc r2, %[r]\n\t"
  193219. #endif
  193220. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193221. "lsrs r6, r7, #16\n\t"
  193222. #else
  193223. "lsr r6, r7, #16\n\t"
  193224. #endif
  193225. #ifdef WOLFSSL_KEIL
  193226. "muls r5, r6, r5\n\t"
  193227. #elif defined(__clang__)
  193228. "muls r5, r6\n\t"
  193229. #else
  193230. "mul r5, r6\n\t"
  193231. #endif
  193232. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193233. "lsrs r6, r5, #16\n\t"
  193234. #else
  193235. "lsr r6, r5, #16\n\t"
  193236. #endif
  193237. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193238. "lsls r5, r5, #16\n\t"
  193239. #else
  193240. "lsl r5, r5, #16\n\t"
  193241. #endif
  193242. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193243. "adds r3, r3, r5\n\t"
  193244. #else
  193245. "add r3, r3, r5\n\t"
  193246. #endif
  193247. #ifdef WOLFSSL_KEIL
  193248. "adcs r4, r4, r6\n\t"
  193249. #elif defined(__clang__)
  193250. "adcs r4, r6\n\t"
  193251. #else
  193252. "adc r4, r6\n\t"
  193253. #endif
  193254. #ifdef WOLFSSL_KEIL
  193255. "adcs r2, r2, %[r]\n\t"
  193256. #elif defined(__clang__)
  193257. "adcs r2, %[r]\n\t"
  193258. #else
  193259. "adc r2, %[r]\n\t"
  193260. #endif
  193261. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193262. "adds r3, r3, r5\n\t"
  193263. #else
  193264. "add r3, r3, r5\n\t"
  193265. #endif
  193266. #ifdef WOLFSSL_KEIL
  193267. "adcs r4, r4, r6\n\t"
  193268. #elif defined(__clang__)
  193269. "adcs r4, r6\n\t"
  193270. #else
  193271. "adc r4, r6\n\t"
  193272. #endif
  193273. #ifdef WOLFSSL_KEIL
  193274. "adcs r2, r2, %[r]\n\t"
  193275. #elif defined(__clang__)
  193276. "adcs r2, %[r]\n\t"
  193277. #else
  193278. "adc r2, %[r]\n\t"
  193279. #endif
  193280. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193281. "lsrs r5, %[a], #16\n\t"
  193282. #else
  193283. "lsr r5, %[a], #16\n\t"
  193284. #endif
  193285. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193286. "lsrs r6, r7, #16\n\t"
  193287. #else
  193288. "lsr r6, r7, #16\n\t"
  193289. #endif
  193290. #ifdef WOLFSSL_KEIL
  193291. "muls r6, r5, r6\n\t"
  193292. #elif defined(__clang__)
  193293. "muls r6, r5\n\t"
  193294. #else
  193295. "mul r6, r5\n\t"
  193296. #endif
  193297. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193298. "adds r4, r4, r6\n\t"
  193299. #else
  193300. "add r4, r4, r6\n\t"
  193301. #endif
  193302. #ifdef WOLFSSL_KEIL
  193303. "adcs r2, r2, %[r]\n\t"
  193304. #elif defined(__clang__)
  193305. "adcs r2, %[r]\n\t"
  193306. #else
  193307. "adc r2, %[r]\n\t"
  193308. #endif
  193309. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193310. "adds r4, r4, r6\n\t"
  193311. #else
  193312. "add r4, r4, r6\n\t"
  193313. #endif
  193314. #ifdef WOLFSSL_KEIL
  193315. "adcs r2, r2, %[r]\n\t"
  193316. #elif defined(__clang__)
  193317. "adcs r2, %[r]\n\t"
  193318. #else
  193319. "adc r2, %[r]\n\t"
  193320. #endif
  193321. "uxth r6, r7\n\t"
  193322. #ifdef WOLFSSL_KEIL
  193323. "muls r5, r6, r5\n\t"
  193324. #elif defined(__clang__)
  193325. "muls r5, r6\n\t"
  193326. #else
  193327. "mul r5, r6\n\t"
  193328. #endif
  193329. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193330. "lsrs r6, r5, #16\n\t"
  193331. #else
  193332. "lsr r6, r5, #16\n\t"
  193333. #endif
  193334. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193335. "lsls r5, r5, #16\n\t"
  193336. #else
  193337. "lsl r5, r5, #16\n\t"
  193338. #endif
  193339. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193340. "adds r3, r3, r5\n\t"
  193341. #else
  193342. "add r3, r3, r5\n\t"
  193343. #endif
  193344. #ifdef WOLFSSL_KEIL
  193345. "adcs r4, r4, r6\n\t"
  193346. #elif defined(__clang__)
  193347. "adcs r4, r6\n\t"
  193348. #else
  193349. "adc r4, r6\n\t"
  193350. #endif
  193351. #ifdef WOLFSSL_KEIL
  193352. "adcs r2, r2, %[r]\n\t"
  193353. #elif defined(__clang__)
  193354. "adcs r2, %[r]\n\t"
  193355. #else
  193356. "adc r2, %[r]\n\t"
  193357. #endif
  193358. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193359. "adds r3, r3, r5\n\t"
  193360. #else
  193361. "add r3, r3, r5\n\t"
  193362. #endif
  193363. #ifdef WOLFSSL_KEIL
  193364. "adcs r4, r4, r6\n\t"
  193365. #elif defined(__clang__)
  193366. "adcs r4, r6\n\t"
  193367. #else
  193368. "adc r4, r6\n\t"
  193369. #endif
  193370. #ifdef WOLFSSL_KEIL
  193371. "adcs r2, r2, %[r]\n\t"
  193372. #elif defined(__clang__)
  193373. "adcs r2, %[r]\n\t"
  193374. #else
  193375. "adc r2, %[r]\n\t"
  193376. #endif
  193377. "# A[11] * A[11]\n\t"
  193378. "mov %[a], r9\n\t"
  193379. "ldr r7, [%[a], #44]\n\t"
  193380. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193381. "lsrs r6, r7, #16\n\t"
  193382. #else
  193383. "lsr r6, r7, #16\n\t"
  193384. #endif
  193385. "uxth r5, r7\n\t"
  193386. #ifdef WOLFSSL_KEIL
  193387. "muls r5, r5, r5\n\t"
  193388. #elif defined(__clang__)
  193389. "muls r5, r5\n\t"
  193390. #else
  193391. "mul r5, r5\n\t"
  193392. #endif
  193393. #ifdef WOLFSSL_KEIL
  193394. "muls r6, r6, r6\n\t"
  193395. #elif defined(__clang__)
  193396. "muls r6, r6\n\t"
  193397. #else
  193398. "mul r6, r6\n\t"
  193399. #endif
  193400. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193401. "adds r3, r3, r5\n\t"
  193402. #else
  193403. "add r3, r3, r5\n\t"
  193404. #endif
  193405. #ifdef WOLFSSL_KEIL
  193406. "adcs r4, r4, r6\n\t"
  193407. #elif defined(__clang__)
  193408. "adcs r4, r6\n\t"
  193409. #else
  193410. "adc r4, r6\n\t"
  193411. #endif
  193412. #ifdef WOLFSSL_KEIL
  193413. "adcs r2, r2, %[r]\n\t"
  193414. #elif defined(__clang__)
  193415. "adcs r2, %[r]\n\t"
  193416. #else
  193417. "adc r2, %[r]\n\t"
  193418. #endif
  193419. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193420. "lsrs r6, r7, #16\n\t"
  193421. #else
  193422. "lsr r6, r7, #16\n\t"
  193423. #endif
  193424. "uxth r5, r7\n\t"
  193425. #ifdef WOLFSSL_KEIL
  193426. "muls r5, r6, r5\n\t"
  193427. #elif defined(__clang__)
  193428. "muls r5, r6\n\t"
  193429. #else
  193430. "mul r5, r6\n\t"
  193431. #endif
  193432. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193433. "lsrs r6, r5, #15\n\t"
  193434. #else
  193435. "lsr r6, r5, #15\n\t"
  193436. #endif
  193437. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193438. "lsls r5, r5, #17\n\t"
  193439. #else
  193440. "lsl r5, r5, #17\n\t"
  193441. #endif
  193442. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193443. "adds r3, r3, r5\n\t"
  193444. #else
  193445. "add r3, r3, r5\n\t"
  193446. #endif
  193447. #ifdef WOLFSSL_KEIL
  193448. "adcs r4, r4, r6\n\t"
  193449. #elif defined(__clang__)
  193450. "adcs r4, r6\n\t"
  193451. #else
  193452. "adc r4, r6\n\t"
  193453. #endif
  193454. #ifdef WOLFSSL_KEIL
  193455. "adcs r2, r2, %[r]\n\t"
  193456. #elif defined(__clang__)
  193457. "adcs r2, %[r]\n\t"
  193458. #else
  193459. "adc r2, %[r]\n\t"
  193460. #endif
  193461. "mov %[r], r8\n\t"
  193462. "str r3, [%[r], #88]\n\t"
  193463. "movs %[r], #0\n\t"
  193464. "# A[12] * A[11]\n\t"
  193465. "movs r3, #0\n\t"
  193466. "mov %[a], r10\n\t"
  193467. "uxth r5, %[a]\n\t"
  193468. "uxth r6, r7\n\t"
  193469. #ifdef WOLFSSL_KEIL
  193470. "muls r6, r5, r6\n\t"
  193471. #elif defined(__clang__)
  193472. "muls r6, r5\n\t"
  193473. #else
  193474. "mul r6, r5\n\t"
  193475. #endif
  193476. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193477. "adds r4, r4, r6\n\t"
  193478. #else
  193479. "add r4, r4, r6\n\t"
  193480. #endif
  193481. #ifdef WOLFSSL_KEIL
  193482. "adcs r2, r2, %[r]\n\t"
  193483. #elif defined(__clang__)
  193484. "adcs r2, %[r]\n\t"
  193485. #else
  193486. "adc r2, %[r]\n\t"
  193487. #endif
  193488. #ifdef WOLFSSL_KEIL
  193489. "adcs r3, r3, %[r]\n\t"
  193490. #elif defined(__clang__)
  193491. "adcs r3, %[r]\n\t"
  193492. #else
  193493. "adc r3, %[r]\n\t"
  193494. #endif
  193495. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193496. "adds r4, r4, r6\n\t"
  193497. #else
  193498. "add r4, r4, r6\n\t"
  193499. #endif
  193500. #ifdef WOLFSSL_KEIL
  193501. "adcs r2, r2, %[r]\n\t"
  193502. #elif defined(__clang__)
  193503. "adcs r2, %[r]\n\t"
  193504. #else
  193505. "adc r2, %[r]\n\t"
  193506. #endif
  193507. #ifdef WOLFSSL_KEIL
  193508. "adcs r3, r3, %[r]\n\t"
  193509. #elif defined(__clang__)
  193510. "adcs r3, %[r]\n\t"
  193511. #else
  193512. "adc r3, %[r]\n\t"
  193513. #endif
  193514. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193515. "lsrs r6, r7, #16\n\t"
  193516. #else
  193517. "lsr r6, r7, #16\n\t"
  193518. #endif
  193519. #ifdef WOLFSSL_KEIL
  193520. "muls r5, r6, r5\n\t"
  193521. #elif defined(__clang__)
  193522. "muls r5, r6\n\t"
  193523. #else
  193524. "mul r5, r6\n\t"
  193525. #endif
  193526. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193527. "lsrs r6, r5, #16\n\t"
  193528. #else
  193529. "lsr r6, r5, #16\n\t"
  193530. #endif
  193531. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193532. "lsls r5, r5, #16\n\t"
  193533. #else
  193534. "lsl r5, r5, #16\n\t"
  193535. #endif
  193536. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193537. "adds r4, r4, r5\n\t"
  193538. #else
  193539. "add r4, r4, r5\n\t"
  193540. #endif
  193541. #ifdef WOLFSSL_KEIL
  193542. "adcs r2, r2, r6\n\t"
  193543. #elif defined(__clang__)
  193544. "adcs r2, r6\n\t"
  193545. #else
  193546. "adc r2, r6\n\t"
  193547. #endif
  193548. #ifdef WOLFSSL_KEIL
  193549. "adcs r3, r3, %[r]\n\t"
  193550. #elif defined(__clang__)
  193551. "adcs r3, %[r]\n\t"
  193552. #else
  193553. "adc r3, %[r]\n\t"
  193554. #endif
  193555. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193556. "adds r4, r4, r5\n\t"
  193557. #else
  193558. "add r4, r4, r5\n\t"
  193559. #endif
  193560. #ifdef WOLFSSL_KEIL
  193561. "adcs r2, r2, r6\n\t"
  193562. #elif defined(__clang__)
  193563. "adcs r2, r6\n\t"
  193564. #else
  193565. "adc r2, r6\n\t"
  193566. #endif
  193567. #ifdef WOLFSSL_KEIL
  193568. "adcs r3, r3, %[r]\n\t"
  193569. #elif defined(__clang__)
  193570. "adcs r3, %[r]\n\t"
  193571. #else
  193572. "adc r3, %[r]\n\t"
  193573. #endif
  193574. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193575. "lsrs r5, %[a], #16\n\t"
  193576. #else
  193577. "lsr r5, %[a], #16\n\t"
  193578. #endif
  193579. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193580. "lsrs r6, r7, #16\n\t"
  193581. #else
  193582. "lsr r6, r7, #16\n\t"
  193583. #endif
  193584. #ifdef WOLFSSL_KEIL
  193585. "muls r6, r5, r6\n\t"
  193586. #elif defined(__clang__)
  193587. "muls r6, r5\n\t"
  193588. #else
  193589. "mul r6, r5\n\t"
  193590. #endif
  193591. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193592. "adds r2, r2, r6\n\t"
  193593. #else
  193594. "add r2, r2, r6\n\t"
  193595. #endif
  193596. #ifdef WOLFSSL_KEIL
  193597. "adcs r3, r3, %[r]\n\t"
  193598. #elif defined(__clang__)
  193599. "adcs r3, %[r]\n\t"
  193600. #else
  193601. "adc r3, %[r]\n\t"
  193602. #endif
  193603. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193604. "adds r2, r2, r6\n\t"
  193605. #else
  193606. "add r2, r2, r6\n\t"
  193607. #endif
  193608. #ifdef WOLFSSL_KEIL
  193609. "adcs r3, r3, %[r]\n\t"
  193610. #elif defined(__clang__)
  193611. "adcs r3, %[r]\n\t"
  193612. #else
  193613. "adc r3, %[r]\n\t"
  193614. #endif
  193615. "uxth r6, r7\n\t"
  193616. #ifdef WOLFSSL_KEIL
  193617. "muls r5, r6, r5\n\t"
  193618. #elif defined(__clang__)
  193619. "muls r5, r6\n\t"
  193620. #else
  193621. "mul r5, r6\n\t"
  193622. #endif
  193623. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193624. "lsrs r6, r5, #16\n\t"
  193625. #else
  193626. "lsr r6, r5, #16\n\t"
  193627. #endif
  193628. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193629. "lsls r5, r5, #16\n\t"
  193630. #else
  193631. "lsl r5, r5, #16\n\t"
  193632. #endif
  193633. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193634. "adds r4, r4, r5\n\t"
  193635. #else
  193636. "add r4, r4, r5\n\t"
  193637. #endif
  193638. #ifdef WOLFSSL_KEIL
  193639. "adcs r2, r2, r6\n\t"
  193640. #elif defined(__clang__)
  193641. "adcs r2, r6\n\t"
  193642. #else
  193643. "adc r2, r6\n\t"
  193644. #endif
  193645. #ifdef WOLFSSL_KEIL
  193646. "adcs r3, r3, %[r]\n\t"
  193647. #elif defined(__clang__)
  193648. "adcs r3, %[r]\n\t"
  193649. #else
  193650. "adc r3, %[r]\n\t"
  193651. #endif
  193652. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193653. "adds r4, r4, r5\n\t"
  193654. #else
  193655. "add r4, r4, r5\n\t"
  193656. #endif
  193657. #ifdef WOLFSSL_KEIL
  193658. "adcs r2, r2, r6\n\t"
  193659. #elif defined(__clang__)
  193660. "adcs r2, r6\n\t"
  193661. #else
  193662. "adc r2, r6\n\t"
  193663. #endif
  193664. #ifdef WOLFSSL_KEIL
  193665. "adcs r3, r3, %[r]\n\t"
  193666. #elif defined(__clang__)
  193667. "adcs r3, %[r]\n\t"
  193668. #else
  193669. "adc r3, %[r]\n\t"
  193670. #endif
  193671. "# A[13] * A[10]\n\t"
  193672. "mov %[a], r9\n\t"
  193673. "ldr r7, [%[a], #40]\n\t"
  193674. "mov %[a], r11\n\t"
  193675. "uxth r5, %[a]\n\t"
  193676. "uxth r6, r7\n\t"
  193677. #ifdef WOLFSSL_KEIL
  193678. "muls r6, r5, r6\n\t"
  193679. #elif defined(__clang__)
  193680. "muls r6, r5\n\t"
  193681. #else
  193682. "mul r6, r5\n\t"
  193683. #endif
  193684. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193685. "adds r4, r4, r6\n\t"
  193686. #else
  193687. "add r4, r4, r6\n\t"
  193688. #endif
  193689. #ifdef WOLFSSL_KEIL
  193690. "adcs r2, r2, %[r]\n\t"
  193691. #elif defined(__clang__)
  193692. "adcs r2, %[r]\n\t"
  193693. #else
  193694. "adc r2, %[r]\n\t"
  193695. #endif
  193696. #ifdef WOLFSSL_KEIL
  193697. "adcs r3, r3, %[r]\n\t"
  193698. #elif defined(__clang__)
  193699. "adcs r3, %[r]\n\t"
  193700. #else
  193701. "adc r3, %[r]\n\t"
  193702. #endif
  193703. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193704. "adds r4, r4, r6\n\t"
  193705. #else
  193706. "add r4, r4, r6\n\t"
  193707. #endif
  193708. #ifdef WOLFSSL_KEIL
  193709. "adcs r2, r2, %[r]\n\t"
  193710. #elif defined(__clang__)
  193711. "adcs r2, %[r]\n\t"
  193712. #else
  193713. "adc r2, %[r]\n\t"
  193714. #endif
  193715. #ifdef WOLFSSL_KEIL
  193716. "adcs r3, r3, %[r]\n\t"
  193717. #elif defined(__clang__)
  193718. "adcs r3, %[r]\n\t"
  193719. #else
  193720. "adc r3, %[r]\n\t"
  193721. #endif
  193722. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193723. "lsrs r6, r7, #16\n\t"
  193724. #else
  193725. "lsr r6, r7, #16\n\t"
  193726. #endif
  193727. #ifdef WOLFSSL_KEIL
  193728. "muls r5, r6, r5\n\t"
  193729. #elif defined(__clang__)
  193730. "muls r5, r6\n\t"
  193731. #else
  193732. "mul r5, r6\n\t"
  193733. #endif
  193734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193735. "lsrs r6, r5, #16\n\t"
  193736. #else
  193737. "lsr r6, r5, #16\n\t"
  193738. #endif
  193739. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193740. "lsls r5, r5, #16\n\t"
  193741. #else
  193742. "lsl r5, r5, #16\n\t"
  193743. #endif
  193744. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193745. "adds r4, r4, r5\n\t"
  193746. #else
  193747. "add r4, r4, r5\n\t"
  193748. #endif
  193749. #ifdef WOLFSSL_KEIL
  193750. "adcs r2, r2, r6\n\t"
  193751. #elif defined(__clang__)
  193752. "adcs r2, r6\n\t"
  193753. #else
  193754. "adc r2, r6\n\t"
  193755. #endif
  193756. #ifdef WOLFSSL_KEIL
  193757. "adcs r3, r3, %[r]\n\t"
  193758. #elif defined(__clang__)
  193759. "adcs r3, %[r]\n\t"
  193760. #else
  193761. "adc r3, %[r]\n\t"
  193762. #endif
  193763. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193764. "adds r4, r4, r5\n\t"
  193765. #else
  193766. "add r4, r4, r5\n\t"
  193767. #endif
  193768. #ifdef WOLFSSL_KEIL
  193769. "adcs r2, r2, r6\n\t"
  193770. #elif defined(__clang__)
  193771. "adcs r2, r6\n\t"
  193772. #else
  193773. "adc r2, r6\n\t"
  193774. #endif
  193775. #ifdef WOLFSSL_KEIL
  193776. "adcs r3, r3, %[r]\n\t"
  193777. #elif defined(__clang__)
  193778. "adcs r3, %[r]\n\t"
  193779. #else
  193780. "adc r3, %[r]\n\t"
  193781. #endif
  193782. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193783. "lsrs r5, %[a], #16\n\t"
  193784. #else
  193785. "lsr r5, %[a], #16\n\t"
  193786. #endif
  193787. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193788. "lsrs r6, r7, #16\n\t"
  193789. #else
  193790. "lsr r6, r7, #16\n\t"
  193791. #endif
  193792. #ifdef WOLFSSL_KEIL
  193793. "muls r6, r5, r6\n\t"
  193794. #elif defined(__clang__)
  193795. "muls r6, r5\n\t"
  193796. #else
  193797. "mul r6, r5\n\t"
  193798. #endif
  193799. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193800. "adds r2, r2, r6\n\t"
  193801. #else
  193802. "add r2, r2, r6\n\t"
  193803. #endif
  193804. #ifdef WOLFSSL_KEIL
  193805. "adcs r3, r3, %[r]\n\t"
  193806. #elif defined(__clang__)
  193807. "adcs r3, %[r]\n\t"
  193808. #else
  193809. "adc r3, %[r]\n\t"
  193810. #endif
  193811. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193812. "adds r2, r2, r6\n\t"
  193813. #else
  193814. "add r2, r2, r6\n\t"
  193815. #endif
  193816. #ifdef WOLFSSL_KEIL
  193817. "adcs r3, r3, %[r]\n\t"
  193818. #elif defined(__clang__)
  193819. "adcs r3, %[r]\n\t"
  193820. #else
  193821. "adc r3, %[r]\n\t"
  193822. #endif
  193823. "uxth r6, r7\n\t"
  193824. #ifdef WOLFSSL_KEIL
  193825. "muls r5, r6, r5\n\t"
  193826. #elif defined(__clang__)
  193827. "muls r5, r6\n\t"
  193828. #else
  193829. "mul r5, r6\n\t"
  193830. #endif
  193831. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193832. "lsrs r6, r5, #16\n\t"
  193833. #else
  193834. "lsr r6, r5, #16\n\t"
  193835. #endif
  193836. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193837. "lsls r5, r5, #16\n\t"
  193838. #else
  193839. "lsl r5, r5, #16\n\t"
  193840. #endif
  193841. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193842. "adds r4, r4, r5\n\t"
  193843. #else
  193844. "add r4, r4, r5\n\t"
  193845. #endif
  193846. #ifdef WOLFSSL_KEIL
  193847. "adcs r2, r2, r6\n\t"
  193848. #elif defined(__clang__)
  193849. "adcs r2, r6\n\t"
  193850. #else
  193851. "adc r2, r6\n\t"
  193852. #endif
  193853. #ifdef WOLFSSL_KEIL
  193854. "adcs r3, r3, %[r]\n\t"
  193855. #elif defined(__clang__)
  193856. "adcs r3, %[r]\n\t"
  193857. #else
  193858. "adc r3, %[r]\n\t"
  193859. #endif
  193860. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193861. "adds r4, r4, r5\n\t"
  193862. #else
  193863. "add r4, r4, r5\n\t"
  193864. #endif
  193865. #ifdef WOLFSSL_KEIL
  193866. "adcs r2, r2, r6\n\t"
  193867. #elif defined(__clang__)
  193868. "adcs r2, r6\n\t"
  193869. #else
  193870. "adc r2, r6\n\t"
  193871. #endif
  193872. #ifdef WOLFSSL_KEIL
  193873. "adcs r3, r3, %[r]\n\t"
  193874. #elif defined(__clang__)
  193875. "adcs r3, %[r]\n\t"
  193876. #else
  193877. "adc r3, %[r]\n\t"
  193878. #endif
  193879. "# A[14] * A[9]\n\t"
  193880. "mov %[a], r9\n\t"
  193881. "ldr r7, [%[a], #36]\n\t"
  193882. "mov %[a], r12\n\t"
  193883. "uxth r5, %[a]\n\t"
  193884. "uxth r6, r7\n\t"
  193885. #ifdef WOLFSSL_KEIL
  193886. "muls r6, r5, r6\n\t"
  193887. #elif defined(__clang__)
  193888. "muls r6, r5\n\t"
  193889. #else
  193890. "mul r6, r5\n\t"
  193891. #endif
  193892. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193893. "adds r4, r4, r6\n\t"
  193894. #else
  193895. "add r4, r4, r6\n\t"
  193896. #endif
  193897. #ifdef WOLFSSL_KEIL
  193898. "adcs r2, r2, %[r]\n\t"
  193899. #elif defined(__clang__)
  193900. "adcs r2, %[r]\n\t"
  193901. #else
  193902. "adc r2, %[r]\n\t"
  193903. #endif
  193904. #ifdef WOLFSSL_KEIL
  193905. "adcs r3, r3, %[r]\n\t"
  193906. #elif defined(__clang__)
  193907. "adcs r3, %[r]\n\t"
  193908. #else
  193909. "adc r3, %[r]\n\t"
  193910. #endif
  193911. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193912. "adds r4, r4, r6\n\t"
  193913. #else
  193914. "add r4, r4, r6\n\t"
  193915. #endif
  193916. #ifdef WOLFSSL_KEIL
  193917. "adcs r2, r2, %[r]\n\t"
  193918. #elif defined(__clang__)
  193919. "adcs r2, %[r]\n\t"
  193920. #else
  193921. "adc r2, %[r]\n\t"
  193922. #endif
  193923. #ifdef WOLFSSL_KEIL
  193924. "adcs r3, r3, %[r]\n\t"
  193925. #elif defined(__clang__)
  193926. "adcs r3, %[r]\n\t"
  193927. #else
  193928. "adc r3, %[r]\n\t"
  193929. #endif
  193930. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193931. "lsrs r6, r7, #16\n\t"
  193932. #else
  193933. "lsr r6, r7, #16\n\t"
  193934. #endif
  193935. #ifdef WOLFSSL_KEIL
  193936. "muls r5, r6, r5\n\t"
  193937. #elif defined(__clang__)
  193938. "muls r5, r6\n\t"
  193939. #else
  193940. "mul r5, r6\n\t"
  193941. #endif
  193942. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193943. "lsrs r6, r5, #16\n\t"
  193944. #else
  193945. "lsr r6, r5, #16\n\t"
  193946. #endif
  193947. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193948. "lsls r5, r5, #16\n\t"
  193949. #else
  193950. "lsl r5, r5, #16\n\t"
  193951. #endif
  193952. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193953. "adds r4, r4, r5\n\t"
  193954. #else
  193955. "add r4, r4, r5\n\t"
  193956. #endif
  193957. #ifdef WOLFSSL_KEIL
  193958. "adcs r2, r2, r6\n\t"
  193959. #elif defined(__clang__)
  193960. "adcs r2, r6\n\t"
  193961. #else
  193962. "adc r2, r6\n\t"
  193963. #endif
  193964. #ifdef WOLFSSL_KEIL
  193965. "adcs r3, r3, %[r]\n\t"
  193966. #elif defined(__clang__)
  193967. "adcs r3, %[r]\n\t"
  193968. #else
  193969. "adc r3, %[r]\n\t"
  193970. #endif
  193971. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193972. "adds r4, r4, r5\n\t"
  193973. #else
  193974. "add r4, r4, r5\n\t"
  193975. #endif
  193976. #ifdef WOLFSSL_KEIL
  193977. "adcs r2, r2, r6\n\t"
  193978. #elif defined(__clang__)
  193979. "adcs r2, r6\n\t"
  193980. #else
  193981. "adc r2, r6\n\t"
  193982. #endif
  193983. #ifdef WOLFSSL_KEIL
  193984. "adcs r3, r3, %[r]\n\t"
  193985. #elif defined(__clang__)
  193986. "adcs r3, %[r]\n\t"
  193987. #else
  193988. "adc r3, %[r]\n\t"
  193989. #endif
  193990. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193991. "lsrs r5, %[a], #16\n\t"
  193992. #else
  193993. "lsr r5, %[a], #16\n\t"
  193994. #endif
  193995. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193996. "lsrs r6, r7, #16\n\t"
  193997. #else
  193998. "lsr r6, r7, #16\n\t"
  193999. #endif
  194000. #ifdef WOLFSSL_KEIL
  194001. "muls r6, r5, r6\n\t"
  194002. #elif defined(__clang__)
  194003. "muls r6, r5\n\t"
  194004. #else
  194005. "mul r6, r5\n\t"
  194006. #endif
  194007. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194008. "adds r2, r2, r6\n\t"
  194009. #else
  194010. "add r2, r2, r6\n\t"
  194011. #endif
  194012. #ifdef WOLFSSL_KEIL
  194013. "adcs r3, r3, %[r]\n\t"
  194014. #elif defined(__clang__)
  194015. "adcs r3, %[r]\n\t"
  194016. #else
  194017. "adc r3, %[r]\n\t"
  194018. #endif
  194019. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194020. "adds r2, r2, r6\n\t"
  194021. #else
  194022. "add r2, r2, r6\n\t"
  194023. #endif
  194024. #ifdef WOLFSSL_KEIL
  194025. "adcs r3, r3, %[r]\n\t"
  194026. #elif defined(__clang__)
  194027. "adcs r3, %[r]\n\t"
  194028. #else
  194029. "adc r3, %[r]\n\t"
  194030. #endif
  194031. "uxth r6, r7\n\t"
  194032. #ifdef WOLFSSL_KEIL
  194033. "muls r5, r6, r5\n\t"
  194034. #elif defined(__clang__)
  194035. "muls r5, r6\n\t"
  194036. #else
  194037. "mul r5, r6\n\t"
  194038. #endif
  194039. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194040. "lsrs r6, r5, #16\n\t"
  194041. #else
  194042. "lsr r6, r5, #16\n\t"
  194043. #endif
  194044. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194045. "lsls r5, r5, #16\n\t"
  194046. #else
  194047. "lsl r5, r5, #16\n\t"
  194048. #endif
  194049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194050. "adds r4, r4, r5\n\t"
  194051. #else
  194052. "add r4, r4, r5\n\t"
  194053. #endif
  194054. #ifdef WOLFSSL_KEIL
  194055. "adcs r2, r2, r6\n\t"
  194056. #elif defined(__clang__)
  194057. "adcs r2, r6\n\t"
  194058. #else
  194059. "adc r2, r6\n\t"
  194060. #endif
  194061. #ifdef WOLFSSL_KEIL
  194062. "adcs r3, r3, %[r]\n\t"
  194063. #elif defined(__clang__)
  194064. "adcs r3, %[r]\n\t"
  194065. #else
  194066. "adc r3, %[r]\n\t"
  194067. #endif
  194068. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194069. "adds r4, r4, r5\n\t"
  194070. #else
  194071. "add r4, r4, r5\n\t"
  194072. #endif
  194073. #ifdef WOLFSSL_KEIL
  194074. "adcs r2, r2, r6\n\t"
  194075. #elif defined(__clang__)
  194076. "adcs r2, r6\n\t"
  194077. #else
  194078. "adc r2, r6\n\t"
  194079. #endif
  194080. #ifdef WOLFSSL_KEIL
  194081. "adcs r3, r3, %[r]\n\t"
  194082. #elif defined(__clang__)
  194083. "adcs r3, %[r]\n\t"
  194084. #else
  194085. "adc r3, %[r]\n\t"
  194086. #endif
  194087. "# A[15] * A[8]\n\t"
  194088. "mov %[a], r9\n\t"
  194089. "ldr r7, [%[a], #32]\n\t"
  194090. "mov %[a], lr\n\t"
  194091. "uxth r5, %[a]\n\t"
  194092. "uxth r6, r7\n\t"
  194093. #ifdef WOLFSSL_KEIL
  194094. "muls r6, r5, r6\n\t"
  194095. #elif defined(__clang__)
  194096. "muls r6, r5\n\t"
  194097. #else
  194098. "mul r6, r5\n\t"
  194099. #endif
  194100. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194101. "adds r4, r4, r6\n\t"
  194102. #else
  194103. "add r4, r4, r6\n\t"
  194104. #endif
  194105. #ifdef WOLFSSL_KEIL
  194106. "adcs r2, r2, %[r]\n\t"
  194107. #elif defined(__clang__)
  194108. "adcs r2, %[r]\n\t"
  194109. #else
  194110. "adc r2, %[r]\n\t"
  194111. #endif
  194112. #ifdef WOLFSSL_KEIL
  194113. "adcs r3, r3, %[r]\n\t"
  194114. #elif defined(__clang__)
  194115. "adcs r3, %[r]\n\t"
  194116. #else
  194117. "adc r3, %[r]\n\t"
  194118. #endif
  194119. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194120. "adds r4, r4, r6\n\t"
  194121. #else
  194122. "add r4, r4, r6\n\t"
  194123. #endif
  194124. #ifdef WOLFSSL_KEIL
  194125. "adcs r2, r2, %[r]\n\t"
  194126. #elif defined(__clang__)
  194127. "adcs r2, %[r]\n\t"
  194128. #else
  194129. "adc r2, %[r]\n\t"
  194130. #endif
  194131. #ifdef WOLFSSL_KEIL
  194132. "adcs r3, r3, %[r]\n\t"
  194133. #elif defined(__clang__)
  194134. "adcs r3, %[r]\n\t"
  194135. #else
  194136. "adc r3, %[r]\n\t"
  194137. #endif
  194138. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194139. "lsrs r6, r7, #16\n\t"
  194140. #else
  194141. "lsr r6, r7, #16\n\t"
  194142. #endif
  194143. #ifdef WOLFSSL_KEIL
  194144. "muls r5, r6, r5\n\t"
  194145. #elif defined(__clang__)
  194146. "muls r5, r6\n\t"
  194147. #else
  194148. "mul r5, r6\n\t"
  194149. #endif
  194150. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194151. "lsrs r6, r5, #16\n\t"
  194152. #else
  194153. "lsr r6, r5, #16\n\t"
  194154. #endif
  194155. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194156. "lsls r5, r5, #16\n\t"
  194157. #else
  194158. "lsl r5, r5, #16\n\t"
  194159. #endif
  194160. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194161. "adds r4, r4, r5\n\t"
  194162. #else
  194163. "add r4, r4, r5\n\t"
  194164. #endif
  194165. #ifdef WOLFSSL_KEIL
  194166. "adcs r2, r2, r6\n\t"
  194167. #elif defined(__clang__)
  194168. "adcs r2, r6\n\t"
  194169. #else
  194170. "adc r2, r6\n\t"
  194171. #endif
  194172. #ifdef WOLFSSL_KEIL
  194173. "adcs r3, r3, %[r]\n\t"
  194174. #elif defined(__clang__)
  194175. "adcs r3, %[r]\n\t"
  194176. #else
  194177. "adc r3, %[r]\n\t"
  194178. #endif
  194179. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194180. "adds r4, r4, r5\n\t"
  194181. #else
  194182. "add r4, r4, r5\n\t"
  194183. #endif
  194184. #ifdef WOLFSSL_KEIL
  194185. "adcs r2, r2, r6\n\t"
  194186. #elif defined(__clang__)
  194187. "adcs r2, r6\n\t"
  194188. #else
  194189. "adc r2, r6\n\t"
  194190. #endif
  194191. #ifdef WOLFSSL_KEIL
  194192. "adcs r3, r3, %[r]\n\t"
  194193. #elif defined(__clang__)
  194194. "adcs r3, %[r]\n\t"
  194195. #else
  194196. "adc r3, %[r]\n\t"
  194197. #endif
  194198. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194199. "lsrs r5, %[a], #16\n\t"
  194200. #else
  194201. "lsr r5, %[a], #16\n\t"
  194202. #endif
  194203. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194204. "lsrs r6, r7, #16\n\t"
  194205. #else
  194206. "lsr r6, r7, #16\n\t"
  194207. #endif
  194208. #ifdef WOLFSSL_KEIL
  194209. "muls r6, r5, r6\n\t"
  194210. #elif defined(__clang__)
  194211. "muls r6, r5\n\t"
  194212. #else
  194213. "mul r6, r5\n\t"
  194214. #endif
  194215. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194216. "adds r2, r2, r6\n\t"
  194217. #else
  194218. "add r2, r2, r6\n\t"
  194219. #endif
  194220. #ifdef WOLFSSL_KEIL
  194221. "adcs r3, r3, %[r]\n\t"
  194222. #elif defined(__clang__)
  194223. "adcs r3, %[r]\n\t"
  194224. #else
  194225. "adc r3, %[r]\n\t"
  194226. #endif
  194227. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194228. "adds r2, r2, r6\n\t"
  194229. #else
  194230. "add r2, r2, r6\n\t"
  194231. #endif
  194232. #ifdef WOLFSSL_KEIL
  194233. "adcs r3, r3, %[r]\n\t"
  194234. #elif defined(__clang__)
  194235. "adcs r3, %[r]\n\t"
  194236. #else
  194237. "adc r3, %[r]\n\t"
  194238. #endif
  194239. "uxth r6, r7\n\t"
  194240. #ifdef WOLFSSL_KEIL
  194241. "muls r5, r6, r5\n\t"
  194242. #elif defined(__clang__)
  194243. "muls r5, r6\n\t"
  194244. #else
  194245. "mul r5, r6\n\t"
  194246. #endif
  194247. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194248. "lsrs r6, r5, #16\n\t"
  194249. #else
  194250. "lsr r6, r5, #16\n\t"
  194251. #endif
  194252. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194253. "lsls r5, r5, #16\n\t"
  194254. #else
  194255. "lsl r5, r5, #16\n\t"
  194256. #endif
  194257. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194258. "adds r4, r4, r5\n\t"
  194259. #else
  194260. "add r4, r4, r5\n\t"
  194261. #endif
  194262. #ifdef WOLFSSL_KEIL
  194263. "adcs r2, r2, r6\n\t"
  194264. #elif defined(__clang__)
  194265. "adcs r2, r6\n\t"
  194266. #else
  194267. "adc r2, r6\n\t"
  194268. #endif
  194269. #ifdef WOLFSSL_KEIL
  194270. "adcs r3, r3, %[r]\n\t"
  194271. #elif defined(__clang__)
  194272. "adcs r3, %[r]\n\t"
  194273. #else
  194274. "adc r3, %[r]\n\t"
  194275. #endif
  194276. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194277. "adds r4, r4, r5\n\t"
  194278. #else
  194279. "add r4, r4, r5\n\t"
  194280. #endif
  194281. #ifdef WOLFSSL_KEIL
  194282. "adcs r2, r2, r6\n\t"
  194283. #elif defined(__clang__)
  194284. "adcs r2, r6\n\t"
  194285. #else
  194286. "adc r2, r6\n\t"
  194287. #endif
  194288. #ifdef WOLFSSL_KEIL
  194289. "adcs r3, r3, %[r]\n\t"
  194290. #elif defined(__clang__)
  194291. "adcs r3, %[r]\n\t"
  194292. #else
  194293. "adc r3, %[r]\n\t"
  194294. #endif
  194295. "mov %[r], r8\n\t"
  194296. "str r4, [%[r], #92]\n\t"
  194297. "movs %[r], #0\n\t"
  194298. "# A[15] * A[9]\n\t"
  194299. "movs r4, #0\n\t"
  194300. "mov %[a], r9\n\t"
  194301. "ldr r7, [%[a], #36]\n\t"
  194302. "mov %[a], lr\n\t"
  194303. "uxth r5, %[a]\n\t"
  194304. "uxth r6, r7\n\t"
  194305. #ifdef WOLFSSL_KEIL
  194306. "muls r6, r5, r6\n\t"
  194307. #elif defined(__clang__)
  194308. "muls r6, r5\n\t"
  194309. #else
  194310. "mul r6, r5\n\t"
  194311. #endif
  194312. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194313. "adds r2, r2, r6\n\t"
  194314. #else
  194315. "add r2, r2, r6\n\t"
  194316. #endif
  194317. #ifdef WOLFSSL_KEIL
  194318. "adcs r3, r3, %[r]\n\t"
  194319. #elif defined(__clang__)
  194320. "adcs r3, %[r]\n\t"
  194321. #else
  194322. "adc r3, %[r]\n\t"
  194323. #endif
  194324. #ifdef WOLFSSL_KEIL
  194325. "adcs r4, r4, %[r]\n\t"
  194326. #elif defined(__clang__)
  194327. "adcs r4, %[r]\n\t"
  194328. #else
  194329. "adc r4, %[r]\n\t"
  194330. #endif
  194331. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194332. "adds r2, r2, r6\n\t"
  194333. #else
  194334. "add r2, r2, r6\n\t"
  194335. #endif
  194336. #ifdef WOLFSSL_KEIL
  194337. "adcs r3, r3, %[r]\n\t"
  194338. #elif defined(__clang__)
  194339. "adcs r3, %[r]\n\t"
  194340. #else
  194341. "adc r3, %[r]\n\t"
  194342. #endif
  194343. #ifdef WOLFSSL_KEIL
  194344. "adcs r4, r4, %[r]\n\t"
  194345. #elif defined(__clang__)
  194346. "adcs r4, %[r]\n\t"
  194347. #else
  194348. "adc r4, %[r]\n\t"
  194349. #endif
  194350. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194351. "lsrs r6, r7, #16\n\t"
  194352. #else
  194353. "lsr r6, r7, #16\n\t"
  194354. #endif
  194355. #ifdef WOLFSSL_KEIL
  194356. "muls r5, r6, r5\n\t"
  194357. #elif defined(__clang__)
  194358. "muls r5, r6\n\t"
  194359. #else
  194360. "mul r5, r6\n\t"
  194361. #endif
  194362. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194363. "lsrs r6, r5, #16\n\t"
  194364. #else
  194365. "lsr r6, r5, #16\n\t"
  194366. #endif
  194367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194368. "lsls r5, r5, #16\n\t"
  194369. #else
  194370. "lsl r5, r5, #16\n\t"
  194371. #endif
  194372. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194373. "adds r2, r2, r5\n\t"
  194374. #else
  194375. "add r2, r2, r5\n\t"
  194376. #endif
  194377. #ifdef WOLFSSL_KEIL
  194378. "adcs r3, r3, r6\n\t"
  194379. #elif defined(__clang__)
  194380. "adcs r3, r6\n\t"
  194381. #else
  194382. "adc r3, r6\n\t"
  194383. #endif
  194384. #ifdef WOLFSSL_KEIL
  194385. "adcs r4, r4, %[r]\n\t"
  194386. #elif defined(__clang__)
  194387. "adcs r4, %[r]\n\t"
  194388. #else
  194389. "adc r4, %[r]\n\t"
  194390. #endif
  194391. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194392. "adds r2, r2, r5\n\t"
  194393. #else
  194394. "add r2, r2, r5\n\t"
  194395. #endif
  194396. #ifdef WOLFSSL_KEIL
  194397. "adcs r3, r3, r6\n\t"
  194398. #elif defined(__clang__)
  194399. "adcs r3, r6\n\t"
  194400. #else
  194401. "adc r3, r6\n\t"
  194402. #endif
  194403. #ifdef WOLFSSL_KEIL
  194404. "adcs r4, r4, %[r]\n\t"
  194405. #elif defined(__clang__)
  194406. "adcs r4, %[r]\n\t"
  194407. #else
  194408. "adc r4, %[r]\n\t"
  194409. #endif
  194410. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194411. "lsrs r5, %[a], #16\n\t"
  194412. #else
  194413. "lsr r5, %[a], #16\n\t"
  194414. #endif
  194415. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194416. "lsrs r6, r7, #16\n\t"
  194417. #else
  194418. "lsr r6, r7, #16\n\t"
  194419. #endif
  194420. #ifdef WOLFSSL_KEIL
  194421. "muls r6, r5, r6\n\t"
  194422. #elif defined(__clang__)
  194423. "muls r6, r5\n\t"
  194424. #else
  194425. "mul r6, r5\n\t"
  194426. #endif
  194427. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194428. "adds r3, r3, r6\n\t"
  194429. #else
  194430. "add r3, r3, r6\n\t"
  194431. #endif
  194432. #ifdef WOLFSSL_KEIL
  194433. "adcs r4, r4, %[r]\n\t"
  194434. #elif defined(__clang__)
  194435. "adcs r4, %[r]\n\t"
  194436. #else
  194437. "adc r4, %[r]\n\t"
  194438. #endif
  194439. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194440. "adds r3, r3, r6\n\t"
  194441. #else
  194442. "add r3, r3, r6\n\t"
  194443. #endif
  194444. #ifdef WOLFSSL_KEIL
  194445. "adcs r4, r4, %[r]\n\t"
  194446. #elif defined(__clang__)
  194447. "adcs r4, %[r]\n\t"
  194448. #else
  194449. "adc r4, %[r]\n\t"
  194450. #endif
  194451. "uxth r6, r7\n\t"
  194452. #ifdef WOLFSSL_KEIL
  194453. "muls r5, r6, r5\n\t"
  194454. #elif defined(__clang__)
  194455. "muls r5, r6\n\t"
  194456. #else
  194457. "mul r5, r6\n\t"
  194458. #endif
  194459. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194460. "lsrs r6, r5, #16\n\t"
  194461. #else
  194462. "lsr r6, r5, #16\n\t"
  194463. #endif
  194464. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194465. "lsls r5, r5, #16\n\t"
  194466. #else
  194467. "lsl r5, r5, #16\n\t"
  194468. #endif
  194469. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194470. "adds r2, r2, r5\n\t"
  194471. #else
  194472. "add r2, r2, r5\n\t"
  194473. #endif
  194474. #ifdef WOLFSSL_KEIL
  194475. "adcs r3, r3, r6\n\t"
  194476. #elif defined(__clang__)
  194477. "adcs r3, r6\n\t"
  194478. #else
  194479. "adc r3, r6\n\t"
  194480. #endif
  194481. #ifdef WOLFSSL_KEIL
  194482. "adcs r4, r4, %[r]\n\t"
  194483. #elif defined(__clang__)
  194484. "adcs r4, %[r]\n\t"
  194485. #else
  194486. "adc r4, %[r]\n\t"
  194487. #endif
  194488. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194489. "adds r2, r2, r5\n\t"
  194490. #else
  194491. "add r2, r2, r5\n\t"
  194492. #endif
  194493. #ifdef WOLFSSL_KEIL
  194494. "adcs r3, r3, r6\n\t"
  194495. #elif defined(__clang__)
  194496. "adcs r3, r6\n\t"
  194497. #else
  194498. "adc r3, r6\n\t"
  194499. #endif
  194500. #ifdef WOLFSSL_KEIL
  194501. "adcs r4, r4, %[r]\n\t"
  194502. #elif defined(__clang__)
  194503. "adcs r4, %[r]\n\t"
  194504. #else
  194505. "adc r4, %[r]\n\t"
  194506. #endif
  194507. "# A[14] * A[10]\n\t"
  194508. "mov %[a], r9\n\t"
  194509. "ldr r7, [%[a], #40]\n\t"
  194510. "mov %[a], r12\n\t"
  194511. "uxth r5, %[a]\n\t"
  194512. "uxth r6, r7\n\t"
  194513. #ifdef WOLFSSL_KEIL
  194514. "muls r6, r5, r6\n\t"
  194515. #elif defined(__clang__)
  194516. "muls r6, r5\n\t"
  194517. #else
  194518. "mul r6, r5\n\t"
  194519. #endif
  194520. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194521. "adds r2, r2, r6\n\t"
  194522. #else
  194523. "add r2, r2, r6\n\t"
  194524. #endif
  194525. #ifdef WOLFSSL_KEIL
  194526. "adcs r3, r3, %[r]\n\t"
  194527. #elif defined(__clang__)
  194528. "adcs r3, %[r]\n\t"
  194529. #else
  194530. "adc r3, %[r]\n\t"
  194531. #endif
  194532. #ifdef WOLFSSL_KEIL
  194533. "adcs r4, r4, %[r]\n\t"
  194534. #elif defined(__clang__)
  194535. "adcs r4, %[r]\n\t"
  194536. #else
  194537. "adc r4, %[r]\n\t"
  194538. #endif
  194539. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194540. "adds r2, r2, r6\n\t"
  194541. #else
  194542. "add r2, r2, r6\n\t"
  194543. #endif
  194544. #ifdef WOLFSSL_KEIL
  194545. "adcs r3, r3, %[r]\n\t"
  194546. #elif defined(__clang__)
  194547. "adcs r3, %[r]\n\t"
  194548. #else
  194549. "adc r3, %[r]\n\t"
  194550. #endif
  194551. #ifdef WOLFSSL_KEIL
  194552. "adcs r4, r4, %[r]\n\t"
  194553. #elif defined(__clang__)
  194554. "adcs r4, %[r]\n\t"
  194555. #else
  194556. "adc r4, %[r]\n\t"
  194557. #endif
  194558. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194559. "lsrs r6, r7, #16\n\t"
  194560. #else
  194561. "lsr r6, r7, #16\n\t"
  194562. #endif
  194563. #ifdef WOLFSSL_KEIL
  194564. "muls r5, r6, r5\n\t"
  194565. #elif defined(__clang__)
  194566. "muls r5, r6\n\t"
  194567. #else
  194568. "mul r5, r6\n\t"
  194569. #endif
  194570. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194571. "lsrs r6, r5, #16\n\t"
  194572. #else
  194573. "lsr r6, r5, #16\n\t"
  194574. #endif
  194575. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194576. "lsls r5, r5, #16\n\t"
  194577. #else
  194578. "lsl r5, r5, #16\n\t"
  194579. #endif
  194580. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194581. "adds r2, r2, r5\n\t"
  194582. #else
  194583. "add r2, r2, r5\n\t"
  194584. #endif
  194585. #ifdef WOLFSSL_KEIL
  194586. "adcs r3, r3, r6\n\t"
  194587. #elif defined(__clang__)
  194588. "adcs r3, r6\n\t"
  194589. #else
  194590. "adc r3, r6\n\t"
  194591. #endif
  194592. #ifdef WOLFSSL_KEIL
  194593. "adcs r4, r4, %[r]\n\t"
  194594. #elif defined(__clang__)
  194595. "adcs r4, %[r]\n\t"
  194596. #else
  194597. "adc r4, %[r]\n\t"
  194598. #endif
  194599. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194600. "adds r2, r2, r5\n\t"
  194601. #else
  194602. "add r2, r2, r5\n\t"
  194603. #endif
  194604. #ifdef WOLFSSL_KEIL
  194605. "adcs r3, r3, r6\n\t"
  194606. #elif defined(__clang__)
  194607. "adcs r3, r6\n\t"
  194608. #else
  194609. "adc r3, r6\n\t"
  194610. #endif
  194611. #ifdef WOLFSSL_KEIL
  194612. "adcs r4, r4, %[r]\n\t"
  194613. #elif defined(__clang__)
  194614. "adcs r4, %[r]\n\t"
  194615. #else
  194616. "adc r4, %[r]\n\t"
  194617. #endif
  194618. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194619. "lsrs r5, %[a], #16\n\t"
  194620. #else
  194621. "lsr r5, %[a], #16\n\t"
  194622. #endif
  194623. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194624. "lsrs r6, r7, #16\n\t"
  194625. #else
  194626. "lsr r6, r7, #16\n\t"
  194627. #endif
  194628. #ifdef WOLFSSL_KEIL
  194629. "muls r6, r5, r6\n\t"
  194630. #elif defined(__clang__)
  194631. "muls r6, r5\n\t"
  194632. #else
  194633. "mul r6, r5\n\t"
  194634. #endif
  194635. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194636. "adds r3, r3, r6\n\t"
  194637. #else
  194638. "add r3, r3, r6\n\t"
  194639. #endif
  194640. #ifdef WOLFSSL_KEIL
  194641. "adcs r4, r4, %[r]\n\t"
  194642. #elif defined(__clang__)
  194643. "adcs r4, %[r]\n\t"
  194644. #else
  194645. "adc r4, %[r]\n\t"
  194646. #endif
  194647. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194648. "adds r3, r3, r6\n\t"
  194649. #else
  194650. "add r3, r3, r6\n\t"
  194651. #endif
  194652. #ifdef WOLFSSL_KEIL
  194653. "adcs r4, r4, %[r]\n\t"
  194654. #elif defined(__clang__)
  194655. "adcs r4, %[r]\n\t"
  194656. #else
  194657. "adc r4, %[r]\n\t"
  194658. #endif
  194659. "uxth r6, r7\n\t"
  194660. #ifdef WOLFSSL_KEIL
  194661. "muls r5, r6, r5\n\t"
  194662. #elif defined(__clang__)
  194663. "muls r5, r6\n\t"
  194664. #else
  194665. "mul r5, r6\n\t"
  194666. #endif
  194667. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194668. "lsrs r6, r5, #16\n\t"
  194669. #else
  194670. "lsr r6, r5, #16\n\t"
  194671. #endif
  194672. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194673. "lsls r5, r5, #16\n\t"
  194674. #else
  194675. "lsl r5, r5, #16\n\t"
  194676. #endif
  194677. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194678. "adds r2, r2, r5\n\t"
  194679. #else
  194680. "add r2, r2, r5\n\t"
  194681. #endif
  194682. #ifdef WOLFSSL_KEIL
  194683. "adcs r3, r3, r6\n\t"
  194684. #elif defined(__clang__)
  194685. "adcs r3, r6\n\t"
  194686. #else
  194687. "adc r3, r6\n\t"
  194688. #endif
  194689. #ifdef WOLFSSL_KEIL
  194690. "adcs r4, r4, %[r]\n\t"
  194691. #elif defined(__clang__)
  194692. "adcs r4, %[r]\n\t"
  194693. #else
  194694. "adc r4, %[r]\n\t"
  194695. #endif
  194696. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194697. "adds r2, r2, r5\n\t"
  194698. #else
  194699. "add r2, r2, r5\n\t"
  194700. #endif
  194701. #ifdef WOLFSSL_KEIL
  194702. "adcs r3, r3, r6\n\t"
  194703. #elif defined(__clang__)
  194704. "adcs r3, r6\n\t"
  194705. #else
  194706. "adc r3, r6\n\t"
  194707. #endif
  194708. #ifdef WOLFSSL_KEIL
  194709. "adcs r4, r4, %[r]\n\t"
  194710. #elif defined(__clang__)
  194711. "adcs r4, %[r]\n\t"
  194712. #else
  194713. "adc r4, %[r]\n\t"
  194714. #endif
  194715. "# A[13] * A[11]\n\t"
  194716. "mov %[a], r9\n\t"
  194717. "ldr r7, [%[a], #44]\n\t"
  194718. "mov %[a], r11\n\t"
  194719. "uxth r5, %[a]\n\t"
  194720. "uxth r6, r7\n\t"
  194721. #ifdef WOLFSSL_KEIL
  194722. "muls r6, r5, r6\n\t"
  194723. #elif defined(__clang__)
  194724. "muls r6, r5\n\t"
  194725. #else
  194726. "mul r6, r5\n\t"
  194727. #endif
  194728. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194729. "adds r2, r2, r6\n\t"
  194730. #else
  194731. "add r2, r2, r6\n\t"
  194732. #endif
  194733. #ifdef WOLFSSL_KEIL
  194734. "adcs r3, r3, %[r]\n\t"
  194735. #elif defined(__clang__)
  194736. "adcs r3, %[r]\n\t"
  194737. #else
  194738. "adc r3, %[r]\n\t"
  194739. #endif
  194740. #ifdef WOLFSSL_KEIL
  194741. "adcs r4, r4, %[r]\n\t"
  194742. #elif defined(__clang__)
  194743. "adcs r4, %[r]\n\t"
  194744. #else
  194745. "adc r4, %[r]\n\t"
  194746. #endif
  194747. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194748. "adds r2, r2, r6\n\t"
  194749. #else
  194750. "add r2, r2, r6\n\t"
  194751. #endif
  194752. #ifdef WOLFSSL_KEIL
  194753. "adcs r3, r3, %[r]\n\t"
  194754. #elif defined(__clang__)
  194755. "adcs r3, %[r]\n\t"
  194756. #else
  194757. "adc r3, %[r]\n\t"
  194758. #endif
  194759. #ifdef WOLFSSL_KEIL
  194760. "adcs r4, r4, %[r]\n\t"
  194761. #elif defined(__clang__)
  194762. "adcs r4, %[r]\n\t"
  194763. #else
  194764. "adc r4, %[r]\n\t"
  194765. #endif
  194766. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194767. "lsrs r6, r7, #16\n\t"
  194768. #else
  194769. "lsr r6, r7, #16\n\t"
  194770. #endif
  194771. #ifdef WOLFSSL_KEIL
  194772. "muls r5, r6, r5\n\t"
  194773. #elif defined(__clang__)
  194774. "muls r5, r6\n\t"
  194775. #else
  194776. "mul r5, r6\n\t"
  194777. #endif
  194778. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194779. "lsrs r6, r5, #16\n\t"
  194780. #else
  194781. "lsr r6, r5, #16\n\t"
  194782. #endif
  194783. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194784. "lsls r5, r5, #16\n\t"
  194785. #else
  194786. "lsl r5, r5, #16\n\t"
  194787. #endif
  194788. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194789. "adds r2, r2, r5\n\t"
  194790. #else
  194791. "add r2, r2, r5\n\t"
  194792. #endif
  194793. #ifdef WOLFSSL_KEIL
  194794. "adcs r3, r3, r6\n\t"
  194795. #elif defined(__clang__)
  194796. "adcs r3, r6\n\t"
  194797. #else
  194798. "adc r3, r6\n\t"
  194799. #endif
  194800. #ifdef WOLFSSL_KEIL
  194801. "adcs r4, r4, %[r]\n\t"
  194802. #elif defined(__clang__)
  194803. "adcs r4, %[r]\n\t"
  194804. #else
  194805. "adc r4, %[r]\n\t"
  194806. #endif
  194807. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194808. "adds r2, r2, r5\n\t"
  194809. #else
  194810. "add r2, r2, r5\n\t"
  194811. #endif
  194812. #ifdef WOLFSSL_KEIL
  194813. "adcs r3, r3, r6\n\t"
  194814. #elif defined(__clang__)
  194815. "adcs r3, r6\n\t"
  194816. #else
  194817. "adc r3, r6\n\t"
  194818. #endif
  194819. #ifdef WOLFSSL_KEIL
  194820. "adcs r4, r4, %[r]\n\t"
  194821. #elif defined(__clang__)
  194822. "adcs r4, %[r]\n\t"
  194823. #else
  194824. "adc r4, %[r]\n\t"
  194825. #endif
  194826. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194827. "lsrs r5, %[a], #16\n\t"
  194828. #else
  194829. "lsr r5, %[a], #16\n\t"
  194830. #endif
  194831. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194832. "lsrs r6, r7, #16\n\t"
  194833. #else
  194834. "lsr r6, r7, #16\n\t"
  194835. #endif
  194836. #ifdef WOLFSSL_KEIL
  194837. "muls r6, r5, r6\n\t"
  194838. #elif defined(__clang__)
  194839. "muls r6, r5\n\t"
  194840. #else
  194841. "mul r6, r5\n\t"
  194842. #endif
  194843. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194844. "adds r3, r3, r6\n\t"
  194845. #else
  194846. "add r3, r3, r6\n\t"
  194847. #endif
  194848. #ifdef WOLFSSL_KEIL
  194849. "adcs r4, r4, %[r]\n\t"
  194850. #elif defined(__clang__)
  194851. "adcs r4, %[r]\n\t"
  194852. #else
  194853. "adc r4, %[r]\n\t"
  194854. #endif
  194855. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194856. "adds r3, r3, r6\n\t"
  194857. #else
  194858. "add r3, r3, r6\n\t"
  194859. #endif
  194860. #ifdef WOLFSSL_KEIL
  194861. "adcs r4, r4, %[r]\n\t"
  194862. #elif defined(__clang__)
  194863. "adcs r4, %[r]\n\t"
  194864. #else
  194865. "adc r4, %[r]\n\t"
  194866. #endif
  194867. "uxth r6, r7\n\t"
  194868. #ifdef WOLFSSL_KEIL
  194869. "muls r5, r6, r5\n\t"
  194870. #elif defined(__clang__)
  194871. "muls r5, r6\n\t"
  194872. #else
  194873. "mul r5, r6\n\t"
  194874. #endif
  194875. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194876. "lsrs r6, r5, #16\n\t"
  194877. #else
  194878. "lsr r6, r5, #16\n\t"
  194879. #endif
  194880. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194881. "lsls r5, r5, #16\n\t"
  194882. #else
  194883. "lsl r5, r5, #16\n\t"
  194884. #endif
  194885. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194886. "adds r2, r2, r5\n\t"
  194887. #else
  194888. "add r2, r2, r5\n\t"
  194889. #endif
  194890. #ifdef WOLFSSL_KEIL
  194891. "adcs r3, r3, r6\n\t"
  194892. #elif defined(__clang__)
  194893. "adcs r3, r6\n\t"
  194894. #else
  194895. "adc r3, r6\n\t"
  194896. #endif
  194897. #ifdef WOLFSSL_KEIL
  194898. "adcs r4, r4, %[r]\n\t"
  194899. #elif defined(__clang__)
  194900. "adcs r4, %[r]\n\t"
  194901. #else
  194902. "adc r4, %[r]\n\t"
  194903. #endif
  194904. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194905. "adds r2, r2, r5\n\t"
  194906. #else
  194907. "add r2, r2, r5\n\t"
  194908. #endif
  194909. #ifdef WOLFSSL_KEIL
  194910. "adcs r3, r3, r6\n\t"
  194911. #elif defined(__clang__)
  194912. "adcs r3, r6\n\t"
  194913. #else
  194914. "adc r3, r6\n\t"
  194915. #endif
  194916. #ifdef WOLFSSL_KEIL
  194917. "adcs r4, r4, %[r]\n\t"
  194918. #elif defined(__clang__)
  194919. "adcs r4, %[r]\n\t"
  194920. #else
  194921. "adc r4, %[r]\n\t"
  194922. #endif
  194923. "# A[12] * A[12]\n\t"
  194924. "mov r7, r10\n\t"
  194925. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194926. "lsrs r6, r7, #16\n\t"
  194927. #else
  194928. "lsr r6, r7, #16\n\t"
  194929. #endif
  194930. "uxth r5, r7\n\t"
  194931. #ifdef WOLFSSL_KEIL
  194932. "muls r5, r5, r5\n\t"
  194933. #elif defined(__clang__)
  194934. "muls r5, r5\n\t"
  194935. #else
  194936. "mul r5, r5\n\t"
  194937. #endif
  194938. #ifdef WOLFSSL_KEIL
  194939. "muls r6, r6, r6\n\t"
  194940. #elif defined(__clang__)
  194941. "muls r6, r6\n\t"
  194942. #else
  194943. "mul r6, r6\n\t"
  194944. #endif
  194945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194946. "adds r2, r2, r5\n\t"
  194947. #else
  194948. "add r2, r2, r5\n\t"
  194949. #endif
  194950. #ifdef WOLFSSL_KEIL
  194951. "adcs r3, r3, r6\n\t"
  194952. #elif defined(__clang__)
  194953. "adcs r3, r6\n\t"
  194954. #else
  194955. "adc r3, r6\n\t"
  194956. #endif
  194957. #ifdef WOLFSSL_KEIL
  194958. "adcs r4, r4, %[r]\n\t"
  194959. #elif defined(__clang__)
  194960. "adcs r4, %[r]\n\t"
  194961. #else
  194962. "adc r4, %[r]\n\t"
  194963. #endif
  194964. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194965. "lsrs r6, r7, #16\n\t"
  194966. #else
  194967. "lsr r6, r7, #16\n\t"
  194968. #endif
  194969. "uxth r5, r7\n\t"
  194970. #ifdef WOLFSSL_KEIL
  194971. "muls r5, r6, r5\n\t"
  194972. #elif defined(__clang__)
  194973. "muls r5, r6\n\t"
  194974. #else
  194975. "mul r5, r6\n\t"
  194976. #endif
  194977. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194978. "lsrs r6, r5, #15\n\t"
  194979. #else
  194980. "lsr r6, r5, #15\n\t"
  194981. #endif
  194982. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194983. "lsls r5, r5, #17\n\t"
  194984. #else
  194985. "lsl r5, r5, #17\n\t"
  194986. #endif
  194987. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194988. "adds r2, r2, r5\n\t"
  194989. #else
  194990. "add r2, r2, r5\n\t"
  194991. #endif
  194992. #ifdef WOLFSSL_KEIL
  194993. "adcs r3, r3, r6\n\t"
  194994. #elif defined(__clang__)
  194995. "adcs r3, r6\n\t"
  194996. #else
  194997. "adc r3, r6\n\t"
  194998. #endif
  194999. #ifdef WOLFSSL_KEIL
  195000. "adcs r4, r4, %[r]\n\t"
  195001. #elif defined(__clang__)
  195002. "adcs r4, %[r]\n\t"
  195003. #else
  195004. "adc r4, %[r]\n\t"
  195005. #endif
  195006. "mov %[r], r8\n\t"
  195007. "str r2, [%[r], #96]\n\t"
  195008. "movs %[r], #0\n\t"
  195009. "# A[13] * A[12]\n\t"
  195010. "movs r2, #0\n\t"
  195011. "mov %[a], r9\n\t"
  195012. "mov %[a], r11\n\t"
  195013. "uxth r5, %[a]\n\t"
  195014. "uxth r6, r7\n\t"
  195015. #ifdef WOLFSSL_KEIL
  195016. "muls r6, r5, r6\n\t"
  195017. #elif defined(__clang__)
  195018. "muls r6, r5\n\t"
  195019. #else
  195020. "mul r6, r5\n\t"
  195021. #endif
  195022. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195023. "adds r3, r3, r6\n\t"
  195024. #else
  195025. "add r3, r3, r6\n\t"
  195026. #endif
  195027. #ifdef WOLFSSL_KEIL
  195028. "adcs r4, r4, %[r]\n\t"
  195029. #elif defined(__clang__)
  195030. "adcs r4, %[r]\n\t"
  195031. #else
  195032. "adc r4, %[r]\n\t"
  195033. #endif
  195034. #ifdef WOLFSSL_KEIL
  195035. "adcs r2, r2, %[r]\n\t"
  195036. #elif defined(__clang__)
  195037. "adcs r2, %[r]\n\t"
  195038. #else
  195039. "adc r2, %[r]\n\t"
  195040. #endif
  195041. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195042. "adds r3, r3, r6\n\t"
  195043. #else
  195044. "add r3, r3, r6\n\t"
  195045. #endif
  195046. #ifdef WOLFSSL_KEIL
  195047. "adcs r4, r4, %[r]\n\t"
  195048. #elif defined(__clang__)
  195049. "adcs r4, %[r]\n\t"
  195050. #else
  195051. "adc r4, %[r]\n\t"
  195052. #endif
  195053. #ifdef WOLFSSL_KEIL
  195054. "adcs r2, r2, %[r]\n\t"
  195055. #elif defined(__clang__)
  195056. "adcs r2, %[r]\n\t"
  195057. #else
  195058. "adc r2, %[r]\n\t"
  195059. #endif
  195060. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195061. "lsrs r6, r7, #16\n\t"
  195062. #else
  195063. "lsr r6, r7, #16\n\t"
  195064. #endif
  195065. #ifdef WOLFSSL_KEIL
  195066. "muls r5, r6, r5\n\t"
  195067. #elif defined(__clang__)
  195068. "muls r5, r6\n\t"
  195069. #else
  195070. "mul r5, r6\n\t"
  195071. #endif
  195072. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195073. "lsrs r6, r5, #16\n\t"
  195074. #else
  195075. "lsr r6, r5, #16\n\t"
  195076. #endif
  195077. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195078. "lsls r5, r5, #16\n\t"
  195079. #else
  195080. "lsl r5, r5, #16\n\t"
  195081. #endif
  195082. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195083. "adds r3, r3, r5\n\t"
  195084. #else
  195085. "add r3, r3, r5\n\t"
  195086. #endif
  195087. #ifdef WOLFSSL_KEIL
  195088. "adcs r4, r4, r6\n\t"
  195089. #elif defined(__clang__)
  195090. "adcs r4, r6\n\t"
  195091. #else
  195092. "adc r4, r6\n\t"
  195093. #endif
  195094. #ifdef WOLFSSL_KEIL
  195095. "adcs r2, r2, %[r]\n\t"
  195096. #elif defined(__clang__)
  195097. "adcs r2, %[r]\n\t"
  195098. #else
  195099. "adc r2, %[r]\n\t"
  195100. #endif
  195101. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195102. "adds r3, r3, r5\n\t"
  195103. #else
  195104. "add r3, r3, r5\n\t"
  195105. #endif
  195106. #ifdef WOLFSSL_KEIL
  195107. "adcs r4, r4, r6\n\t"
  195108. #elif defined(__clang__)
  195109. "adcs r4, r6\n\t"
  195110. #else
  195111. "adc r4, r6\n\t"
  195112. #endif
  195113. #ifdef WOLFSSL_KEIL
  195114. "adcs r2, r2, %[r]\n\t"
  195115. #elif defined(__clang__)
  195116. "adcs r2, %[r]\n\t"
  195117. #else
  195118. "adc r2, %[r]\n\t"
  195119. #endif
  195120. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195121. "lsrs r5, %[a], #16\n\t"
  195122. #else
  195123. "lsr r5, %[a], #16\n\t"
  195124. #endif
  195125. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195126. "lsrs r6, r7, #16\n\t"
  195127. #else
  195128. "lsr r6, r7, #16\n\t"
  195129. #endif
  195130. #ifdef WOLFSSL_KEIL
  195131. "muls r6, r5, r6\n\t"
  195132. #elif defined(__clang__)
  195133. "muls r6, r5\n\t"
  195134. #else
  195135. "mul r6, r5\n\t"
  195136. #endif
  195137. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195138. "adds r4, r4, r6\n\t"
  195139. #else
  195140. "add r4, r4, r6\n\t"
  195141. #endif
  195142. #ifdef WOLFSSL_KEIL
  195143. "adcs r2, r2, %[r]\n\t"
  195144. #elif defined(__clang__)
  195145. "adcs r2, %[r]\n\t"
  195146. #else
  195147. "adc r2, %[r]\n\t"
  195148. #endif
  195149. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195150. "adds r4, r4, r6\n\t"
  195151. #else
  195152. "add r4, r4, r6\n\t"
  195153. #endif
  195154. #ifdef WOLFSSL_KEIL
  195155. "adcs r2, r2, %[r]\n\t"
  195156. #elif defined(__clang__)
  195157. "adcs r2, %[r]\n\t"
  195158. #else
  195159. "adc r2, %[r]\n\t"
  195160. #endif
  195161. "uxth r6, r7\n\t"
  195162. #ifdef WOLFSSL_KEIL
  195163. "muls r5, r6, r5\n\t"
  195164. #elif defined(__clang__)
  195165. "muls r5, r6\n\t"
  195166. #else
  195167. "mul r5, r6\n\t"
  195168. #endif
  195169. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195170. "lsrs r6, r5, #16\n\t"
  195171. #else
  195172. "lsr r6, r5, #16\n\t"
  195173. #endif
  195174. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195175. "lsls r5, r5, #16\n\t"
  195176. #else
  195177. "lsl r5, r5, #16\n\t"
  195178. #endif
  195179. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195180. "adds r3, r3, r5\n\t"
  195181. #else
  195182. "add r3, r3, r5\n\t"
  195183. #endif
  195184. #ifdef WOLFSSL_KEIL
  195185. "adcs r4, r4, r6\n\t"
  195186. #elif defined(__clang__)
  195187. "adcs r4, r6\n\t"
  195188. #else
  195189. "adc r4, r6\n\t"
  195190. #endif
  195191. #ifdef WOLFSSL_KEIL
  195192. "adcs r2, r2, %[r]\n\t"
  195193. #elif defined(__clang__)
  195194. "adcs r2, %[r]\n\t"
  195195. #else
  195196. "adc r2, %[r]\n\t"
  195197. #endif
  195198. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195199. "adds r3, r3, r5\n\t"
  195200. #else
  195201. "add r3, r3, r5\n\t"
  195202. #endif
  195203. #ifdef WOLFSSL_KEIL
  195204. "adcs r4, r4, r6\n\t"
  195205. #elif defined(__clang__)
  195206. "adcs r4, r6\n\t"
  195207. #else
  195208. "adc r4, r6\n\t"
  195209. #endif
  195210. #ifdef WOLFSSL_KEIL
  195211. "adcs r2, r2, %[r]\n\t"
  195212. #elif defined(__clang__)
  195213. "adcs r2, %[r]\n\t"
  195214. #else
  195215. "adc r2, %[r]\n\t"
  195216. #endif
  195217. "# A[14] * A[11]\n\t"
  195218. "mov %[a], r9\n\t"
  195219. "ldr r7, [%[a], #44]\n\t"
  195220. "mov %[a], r12\n\t"
  195221. "uxth r5, %[a]\n\t"
  195222. "uxth r6, r7\n\t"
  195223. #ifdef WOLFSSL_KEIL
  195224. "muls r6, r5, r6\n\t"
  195225. #elif defined(__clang__)
  195226. "muls r6, r5\n\t"
  195227. #else
  195228. "mul r6, r5\n\t"
  195229. #endif
  195230. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195231. "adds r3, r3, r6\n\t"
  195232. #else
  195233. "add r3, r3, r6\n\t"
  195234. #endif
  195235. #ifdef WOLFSSL_KEIL
  195236. "adcs r4, r4, %[r]\n\t"
  195237. #elif defined(__clang__)
  195238. "adcs r4, %[r]\n\t"
  195239. #else
  195240. "adc r4, %[r]\n\t"
  195241. #endif
  195242. #ifdef WOLFSSL_KEIL
  195243. "adcs r2, r2, %[r]\n\t"
  195244. #elif defined(__clang__)
  195245. "adcs r2, %[r]\n\t"
  195246. #else
  195247. "adc r2, %[r]\n\t"
  195248. #endif
  195249. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195250. "adds r3, r3, r6\n\t"
  195251. #else
  195252. "add r3, r3, r6\n\t"
  195253. #endif
  195254. #ifdef WOLFSSL_KEIL
  195255. "adcs r4, r4, %[r]\n\t"
  195256. #elif defined(__clang__)
  195257. "adcs r4, %[r]\n\t"
  195258. #else
  195259. "adc r4, %[r]\n\t"
  195260. #endif
  195261. #ifdef WOLFSSL_KEIL
  195262. "adcs r2, r2, %[r]\n\t"
  195263. #elif defined(__clang__)
  195264. "adcs r2, %[r]\n\t"
  195265. #else
  195266. "adc r2, %[r]\n\t"
  195267. #endif
  195268. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195269. "lsrs r6, r7, #16\n\t"
  195270. #else
  195271. "lsr r6, r7, #16\n\t"
  195272. #endif
  195273. #ifdef WOLFSSL_KEIL
  195274. "muls r5, r6, r5\n\t"
  195275. #elif defined(__clang__)
  195276. "muls r5, r6\n\t"
  195277. #else
  195278. "mul r5, r6\n\t"
  195279. #endif
  195280. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195281. "lsrs r6, r5, #16\n\t"
  195282. #else
  195283. "lsr r6, r5, #16\n\t"
  195284. #endif
  195285. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195286. "lsls r5, r5, #16\n\t"
  195287. #else
  195288. "lsl r5, r5, #16\n\t"
  195289. #endif
  195290. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195291. "adds r3, r3, r5\n\t"
  195292. #else
  195293. "add r3, r3, r5\n\t"
  195294. #endif
  195295. #ifdef WOLFSSL_KEIL
  195296. "adcs r4, r4, r6\n\t"
  195297. #elif defined(__clang__)
  195298. "adcs r4, r6\n\t"
  195299. #else
  195300. "adc r4, r6\n\t"
  195301. #endif
  195302. #ifdef WOLFSSL_KEIL
  195303. "adcs r2, r2, %[r]\n\t"
  195304. #elif defined(__clang__)
  195305. "adcs r2, %[r]\n\t"
  195306. #else
  195307. "adc r2, %[r]\n\t"
  195308. #endif
  195309. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195310. "adds r3, r3, r5\n\t"
  195311. #else
  195312. "add r3, r3, r5\n\t"
  195313. #endif
  195314. #ifdef WOLFSSL_KEIL
  195315. "adcs r4, r4, r6\n\t"
  195316. #elif defined(__clang__)
  195317. "adcs r4, r6\n\t"
  195318. #else
  195319. "adc r4, r6\n\t"
  195320. #endif
  195321. #ifdef WOLFSSL_KEIL
  195322. "adcs r2, r2, %[r]\n\t"
  195323. #elif defined(__clang__)
  195324. "adcs r2, %[r]\n\t"
  195325. #else
  195326. "adc r2, %[r]\n\t"
  195327. #endif
  195328. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195329. "lsrs r5, %[a], #16\n\t"
  195330. #else
  195331. "lsr r5, %[a], #16\n\t"
  195332. #endif
  195333. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195334. "lsrs r6, r7, #16\n\t"
  195335. #else
  195336. "lsr r6, r7, #16\n\t"
  195337. #endif
  195338. #ifdef WOLFSSL_KEIL
  195339. "muls r6, r5, r6\n\t"
  195340. #elif defined(__clang__)
  195341. "muls r6, r5\n\t"
  195342. #else
  195343. "mul r6, r5\n\t"
  195344. #endif
  195345. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195346. "adds r4, r4, r6\n\t"
  195347. #else
  195348. "add r4, r4, r6\n\t"
  195349. #endif
  195350. #ifdef WOLFSSL_KEIL
  195351. "adcs r2, r2, %[r]\n\t"
  195352. #elif defined(__clang__)
  195353. "adcs r2, %[r]\n\t"
  195354. #else
  195355. "adc r2, %[r]\n\t"
  195356. #endif
  195357. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195358. "adds r4, r4, r6\n\t"
  195359. #else
  195360. "add r4, r4, r6\n\t"
  195361. #endif
  195362. #ifdef WOLFSSL_KEIL
  195363. "adcs r2, r2, %[r]\n\t"
  195364. #elif defined(__clang__)
  195365. "adcs r2, %[r]\n\t"
  195366. #else
  195367. "adc r2, %[r]\n\t"
  195368. #endif
  195369. "uxth r6, r7\n\t"
  195370. #ifdef WOLFSSL_KEIL
  195371. "muls r5, r6, r5\n\t"
  195372. #elif defined(__clang__)
  195373. "muls r5, r6\n\t"
  195374. #else
  195375. "mul r5, r6\n\t"
  195376. #endif
  195377. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195378. "lsrs r6, r5, #16\n\t"
  195379. #else
  195380. "lsr r6, r5, #16\n\t"
  195381. #endif
  195382. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195383. "lsls r5, r5, #16\n\t"
  195384. #else
  195385. "lsl r5, r5, #16\n\t"
  195386. #endif
  195387. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195388. "adds r3, r3, r5\n\t"
  195389. #else
  195390. "add r3, r3, r5\n\t"
  195391. #endif
  195392. #ifdef WOLFSSL_KEIL
  195393. "adcs r4, r4, r6\n\t"
  195394. #elif defined(__clang__)
  195395. "adcs r4, r6\n\t"
  195396. #else
  195397. "adc r4, r6\n\t"
  195398. #endif
  195399. #ifdef WOLFSSL_KEIL
  195400. "adcs r2, r2, %[r]\n\t"
  195401. #elif defined(__clang__)
  195402. "adcs r2, %[r]\n\t"
  195403. #else
  195404. "adc r2, %[r]\n\t"
  195405. #endif
  195406. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195407. "adds r3, r3, r5\n\t"
  195408. #else
  195409. "add r3, r3, r5\n\t"
  195410. #endif
  195411. #ifdef WOLFSSL_KEIL
  195412. "adcs r4, r4, r6\n\t"
  195413. #elif defined(__clang__)
  195414. "adcs r4, r6\n\t"
  195415. #else
  195416. "adc r4, r6\n\t"
  195417. #endif
  195418. #ifdef WOLFSSL_KEIL
  195419. "adcs r2, r2, %[r]\n\t"
  195420. #elif defined(__clang__)
  195421. "adcs r2, %[r]\n\t"
  195422. #else
  195423. "adc r2, %[r]\n\t"
  195424. #endif
  195425. "# A[15] * A[10]\n\t"
  195426. "mov %[a], r9\n\t"
  195427. "ldr r7, [%[a], #40]\n\t"
  195428. "mov %[a], lr\n\t"
  195429. "uxth r5, %[a]\n\t"
  195430. "uxth r6, r7\n\t"
  195431. #ifdef WOLFSSL_KEIL
  195432. "muls r6, r5, r6\n\t"
  195433. #elif defined(__clang__)
  195434. "muls r6, r5\n\t"
  195435. #else
  195436. "mul r6, r5\n\t"
  195437. #endif
  195438. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195439. "adds r3, r3, r6\n\t"
  195440. #else
  195441. "add r3, r3, r6\n\t"
  195442. #endif
  195443. #ifdef WOLFSSL_KEIL
  195444. "adcs r4, r4, %[r]\n\t"
  195445. #elif defined(__clang__)
  195446. "adcs r4, %[r]\n\t"
  195447. #else
  195448. "adc r4, %[r]\n\t"
  195449. #endif
  195450. #ifdef WOLFSSL_KEIL
  195451. "adcs r2, r2, %[r]\n\t"
  195452. #elif defined(__clang__)
  195453. "adcs r2, %[r]\n\t"
  195454. #else
  195455. "adc r2, %[r]\n\t"
  195456. #endif
  195457. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195458. "adds r3, r3, r6\n\t"
  195459. #else
  195460. "add r3, r3, r6\n\t"
  195461. #endif
  195462. #ifdef WOLFSSL_KEIL
  195463. "adcs r4, r4, %[r]\n\t"
  195464. #elif defined(__clang__)
  195465. "adcs r4, %[r]\n\t"
  195466. #else
  195467. "adc r4, %[r]\n\t"
  195468. #endif
  195469. #ifdef WOLFSSL_KEIL
  195470. "adcs r2, r2, %[r]\n\t"
  195471. #elif defined(__clang__)
  195472. "adcs r2, %[r]\n\t"
  195473. #else
  195474. "adc r2, %[r]\n\t"
  195475. #endif
  195476. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195477. "lsrs r6, r7, #16\n\t"
  195478. #else
  195479. "lsr r6, r7, #16\n\t"
  195480. #endif
  195481. #ifdef WOLFSSL_KEIL
  195482. "muls r5, r6, r5\n\t"
  195483. #elif defined(__clang__)
  195484. "muls r5, r6\n\t"
  195485. #else
  195486. "mul r5, r6\n\t"
  195487. #endif
  195488. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195489. "lsrs r6, r5, #16\n\t"
  195490. #else
  195491. "lsr r6, r5, #16\n\t"
  195492. #endif
  195493. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195494. "lsls r5, r5, #16\n\t"
  195495. #else
  195496. "lsl r5, r5, #16\n\t"
  195497. #endif
  195498. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195499. "adds r3, r3, r5\n\t"
  195500. #else
  195501. "add r3, r3, r5\n\t"
  195502. #endif
  195503. #ifdef WOLFSSL_KEIL
  195504. "adcs r4, r4, r6\n\t"
  195505. #elif defined(__clang__)
  195506. "adcs r4, r6\n\t"
  195507. #else
  195508. "adc r4, r6\n\t"
  195509. #endif
  195510. #ifdef WOLFSSL_KEIL
  195511. "adcs r2, r2, %[r]\n\t"
  195512. #elif defined(__clang__)
  195513. "adcs r2, %[r]\n\t"
  195514. #else
  195515. "adc r2, %[r]\n\t"
  195516. #endif
  195517. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195518. "adds r3, r3, r5\n\t"
  195519. #else
  195520. "add r3, r3, r5\n\t"
  195521. #endif
  195522. #ifdef WOLFSSL_KEIL
  195523. "adcs r4, r4, r6\n\t"
  195524. #elif defined(__clang__)
  195525. "adcs r4, r6\n\t"
  195526. #else
  195527. "adc r4, r6\n\t"
  195528. #endif
  195529. #ifdef WOLFSSL_KEIL
  195530. "adcs r2, r2, %[r]\n\t"
  195531. #elif defined(__clang__)
  195532. "adcs r2, %[r]\n\t"
  195533. #else
  195534. "adc r2, %[r]\n\t"
  195535. #endif
  195536. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195537. "lsrs r5, %[a], #16\n\t"
  195538. #else
  195539. "lsr r5, %[a], #16\n\t"
  195540. #endif
  195541. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195542. "lsrs r6, r7, #16\n\t"
  195543. #else
  195544. "lsr r6, r7, #16\n\t"
  195545. #endif
  195546. #ifdef WOLFSSL_KEIL
  195547. "muls r6, r5, r6\n\t"
  195548. #elif defined(__clang__)
  195549. "muls r6, r5\n\t"
  195550. #else
  195551. "mul r6, r5\n\t"
  195552. #endif
  195553. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195554. "adds r4, r4, r6\n\t"
  195555. #else
  195556. "add r4, r4, r6\n\t"
  195557. #endif
  195558. #ifdef WOLFSSL_KEIL
  195559. "adcs r2, r2, %[r]\n\t"
  195560. #elif defined(__clang__)
  195561. "adcs r2, %[r]\n\t"
  195562. #else
  195563. "adc r2, %[r]\n\t"
  195564. #endif
  195565. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195566. "adds r4, r4, r6\n\t"
  195567. #else
  195568. "add r4, r4, r6\n\t"
  195569. #endif
  195570. #ifdef WOLFSSL_KEIL
  195571. "adcs r2, r2, %[r]\n\t"
  195572. #elif defined(__clang__)
  195573. "adcs r2, %[r]\n\t"
  195574. #else
  195575. "adc r2, %[r]\n\t"
  195576. #endif
  195577. "uxth r6, r7\n\t"
  195578. #ifdef WOLFSSL_KEIL
  195579. "muls r5, r6, r5\n\t"
  195580. #elif defined(__clang__)
  195581. "muls r5, r6\n\t"
  195582. #else
  195583. "mul r5, r6\n\t"
  195584. #endif
  195585. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195586. "lsrs r6, r5, #16\n\t"
  195587. #else
  195588. "lsr r6, r5, #16\n\t"
  195589. #endif
  195590. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195591. "lsls r5, r5, #16\n\t"
  195592. #else
  195593. "lsl r5, r5, #16\n\t"
  195594. #endif
  195595. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195596. "adds r3, r3, r5\n\t"
  195597. #else
  195598. "add r3, r3, r5\n\t"
  195599. #endif
  195600. #ifdef WOLFSSL_KEIL
  195601. "adcs r4, r4, r6\n\t"
  195602. #elif defined(__clang__)
  195603. "adcs r4, r6\n\t"
  195604. #else
  195605. "adc r4, r6\n\t"
  195606. #endif
  195607. #ifdef WOLFSSL_KEIL
  195608. "adcs r2, r2, %[r]\n\t"
  195609. #elif defined(__clang__)
  195610. "adcs r2, %[r]\n\t"
  195611. #else
  195612. "adc r2, %[r]\n\t"
  195613. #endif
  195614. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195615. "adds r3, r3, r5\n\t"
  195616. #else
  195617. "add r3, r3, r5\n\t"
  195618. #endif
  195619. #ifdef WOLFSSL_KEIL
  195620. "adcs r4, r4, r6\n\t"
  195621. #elif defined(__clang__)
  195622. "adcs r4, r6\n\t"
  195623. #else
  195624. "adc r4, r6\n\t"
  195625. #endif
  195626. #ifdef WOLFSSL_KEIL
  195627. "adcs r2, r2, %[r]\n\t"
  195628. #elif defined(__clang__)
  195629. "adcs r2, %[r]\n\t"
  195630. #else
  195631. "adc r2, %[r]\n\t"
  195632. #endif
  195633. "mov %[r], r8\n\t"
  195634. "str r3, [%[r], #100]\n\t"
  195635. "movs %[r], #0\n\t"
  195636. "# A[15] * A[11]\n\t"
  195637. "movs r3, #0\n\t"
  195638. "mov %[a], r9\n\t"
  195639. "ldr r7, [%[a], #44]\n\t"
  195640. "mov %[a], lr\n\t"
  195641. "uxth r5, %[a]\n\t"
  195642. "uxth r6, r7\n\t"
  195643. #ifdef WOLFSSL_KEIL
  195644. "muls r6, r5, r6\n\t"
  195645. #elif defined(__clang__)
  195646. "muls r6, r5\n\t"
  195647. #else
  195648. "mul r6, r5\n\t"
  195649. #endif
  195650. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195651. "adds r4, r4, r6\n\t"
  195652. #else
  195653. "add r4, r4, r6\n\t"
  195654. #endif
  195655. #ifdef WOLFSSL_KEIL
  195656. "adcs r2, r2, %[r]\n\t"
  195657. #elif defined(__clang__)
  195658. "adcs r2, %[r]\n\t"
  195659. #else
  195660. "adc r2, %[r]\n\t"
  195661. #endif
  195662. #ifdef WOLFSSL_KEIL
  195663. "adcs r3, r3, %[r]\n\t"
  195664. #elif defined(__clang__)
  195665. "adcs r3, %[r]\n\t"
  195666. #else
  195667. "adc r3, %[r]\n\t"
  195668. #endif
  195669. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195670. "adds r4, r4, r6\n\t"
  195671. #else
  195672. "add r4, r4, r6\n\t"
  195673. #endif
  195674. #ifdef WOLFSSL_KEIL
  195675. "adcs r2, r2, %[r]\n\t"
  195676. #elif defined(__clang__)
  195677. "adcs r2, %[r]\n\t"
  195678. #else
  195679. "adc r2, %[r]\n\t"
  195680. #endif
  195681. #ifdef WOLFSSL_KEIL
  195682. "adcs r3, r3, %[r]\n\t"
  195683. #elif defined(__clang__)
  195684. "adcs r3, %[r]\n\t"
  195685. #else
  195686. "adc r3, %[r]\n\t"
  195687. #endif
  195688. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195689. "lsrs r6, r7, #16\n\t"
  195690. #else
  195691. "lsr r6, r7, #16\n\t"
  195692. #endif
  195693. #ifdef WOLFSSL_KEIL
  195694. "muls r5, r6, r5\n\t"
  195695. #elif defined(__clang__)
  195696. "muls r5, r6\n\t"
  195697. #else
  195698. "mul r5, r6\n\t"
  195699. #endif
  195700. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195701. "lsrs r6, r5, #16\n\t"
  195702. #else
  195703. "lsr r6, r5, #16\n\t"
  195704. #endif
  195705. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195706. "lsls r5, r5, #16\n\t"
  195707. #else
  195708. "lsl r5, r5, #16\n\t"
  195709. #endif
  195710. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195711. "adds r4, r4, r5\n\t"
  195712. #else
  195713. "add r4, r4, r5\n\t"
  195714. #endif
  195715. #ifdef WOLFSSL_KEIL
  195716. "adcs r2, r2, r6\n\t"
  195717. #elif defined(__clang__)
  195718. "adcs r2, r6\n\t"
  195719. #else
  195720. "adc r2, r6\n\t"
  195721. #endif
  195722. #ifdef WOLFSSL_KEIL
  195723. "adcs r3, r3, %[r]\n\t"
  195724. #elif defined(__clang__)
  195725. "adcs r3, %[r]\n\t"
  195726. #else
  195727. "adc r3, %[r]\n\t"
  195728. #endif
  195729. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195730. "adds r4, r4, r5\n\t"
  195731. #else
  195732. "add r4, r4, r5\n\t"
  195733. #endif
  195734. #ifdef WOLFSSL_KEIL
  195735. "adcs r2, r2, r6\n\t"
  195736. #elif defined(__clang__)
  195737. "adcs r2, r6\n\t"
  195738. #else
  195739. "adc r2, r6\n\t"
  195740. #endif
  195741. #ifdef WOLFSSL_KEIL
  195742. "adcs r3, r3, %[r]\n\t"
  195743. #elif defined(__clang__)
  195744. "adcs r3, %[r]\n\t"
  195745. #else
  195746. "adc r3, %[r]\n\t"
  195747. #endif
  195748. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195749. "lsrs r5, %[a], #16\n\t"
  195750. #else
  195751. "lsr r5, %[a], #16\n\t"
  195752. #endif
  195753. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195754. "lsrs r6, r7, #16\n\t"
  195755. #else
  195756. "lsr r6, r7, #16\n\t"
  195757. #endif
  195758. #ifdef WOLFSSL_KEIL
  195759. "muls r6, r5, r6\n\t"
  195760. #elif defined(__clang__)
  195761. "muls r6, r5\n\t"
  195762. #else
  195763. "mul r6, r5\n\t"
  195764. #endif
  195765. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195766. "adds r2, r2, r6\n\t"
  195767. #else
  195768. "add r2, r2, r6\n\t"
  195769. #endif
  195770. #ifdef WOLFSSL_KEIL
  195771. "adcs r3, r3, %[r]\n\t"
  195772. #elif defined(__clang__)
  195773. "adcs r3, %[r]\n\t"
  195774. #else
  195775. "adc r3, %[r]\n\t"
  195776. #endif
  195777. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195778. "adds r2, r2, r6\n\t"
  195779. #else
  195780. "add r2, r2, r6\n\t"
  195781. #endif
  195782. #ifdef WOLFSSL_KEIL
  195783. "adcs r3, r3, %[r]\n\t"
  195784. #elif defined(__clang__)
  195785. "adcs r3, %[r]\n\t"
  195786. #else
  195787. "adc r3, %[r]\n\t"
  195788. #endif
  195789. "uxth r6, r7\n\t"
  195790. #ifdef WOLFSSL_KEIL
  195791. "muls r5, r6, r5\n\t"
  195792. #elif defined(__clang__)
  195793. "muls r5, r6\n\t"
  195794. #else
  195795. "mul r5, r6\n\t"
  195796. #endif
  195797. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195798. "lsrs r6, r5, #16\n\t"
  195799. #else
  195800. "lsr r6, r5, #16\n\t"
  195801. #endif
  195802. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195803. "lsls r5, r5, #16\n\t"
  195804. #else
  195805. "lsl r5, r5, #16\n\t"
  195806. #endif
  195807. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195808. "adds r4, r4, r5\n\t"
  195809. #else
  195810. "add r4, r4, r5\n\t"
  195811. #endif
  195812. #ifdef WOLFSSL_KEIL
  195813. "adcs r2, r2, r6\n\t"
  195814. #elif defined(__clang__)
  195815. "adcs r2, r6\n\t"
  195816. #else
  195817. "adc r2, r6\n\t"
  195818. #endif
  195819. #ifdef WOLFSSL_KEIL
  195820. "adcs r3, r3, %[r]\n\t"
  195821. #elif defined(__clang__)
  195822. "adcs r3, %[r]\n\t"
  195823. #else
  195824. "adc r3, %[r]\n\t"
  195825. #endif
  195826. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195827. "adds r4, r4, r5\n\t"
  195828. #else
  195829. "add r4, r4, r5\n\t"
  195830. #endif
  195831. #ifdef WOLFSSL_KEIL
  195832. "adcs r2, r2, r6\n\t"
  195833. #elif defined(__clang__)
  195834. "adcs r2, r6\n\t"
  195835. #else
  195836. "adc r2, r6\n\t"
  195837. #endif
  195838. #ifdef WOLFSSL_KEIL
  195839. "adcs r3, r3, %[r]\n\t"
  195840. #elif defined(__clang__)
  195841. "adcs r3, %[r]\n\t"
  195842. #else
  195843. "adc r3, %[r]\n\t"
  195844. #endif
  195845. "# A[14] * A[12]\n\t"
  195846. "mov %[a], r9\n\t"
  195847. "mov r7, r10\n\t"
  195848. "mov %[a], r12\n\t"
  195849. "uxth r5, %[a]\n\t"
  195850. "uxth r6, r7\n\t"
  195851. #ifdef WOLFSSL_KEIL
  195852. "muls r6, r5, r6\n\t"
  195853. #elif defined(__clang__)
  195854. "muls r6, r5\n\t"
  195855. #else
  195856. "mul r6, r5\n\t"
  195857. #endif
  195858. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195859. "adds r4, r4, r6\n\t"
  195860. #else
  195861. "add r4, r4, r6\n\t"
  195862. #endif
  195863. #ifdef WOLFSSL_KEIL
  195864. "adcs r2, r2, %[r]\n\t"
  195865. #elif defined(__clang__)
  195866. "adcs r2, %[r]\n\t"
  195867. #else
  195868. "adc r2, %[r]\n\t"
  195869. #endif
  195870. #ifdef WOLFSSL_KEIL
  195871. "adcs r3, r3, %[r]\n\t"
  195872. #elif defined(__clang__)
  195873. "adcs r3, %[r]\n\t"
  195874. #else
  195875. "adc r3, %[r]\n\t"
  195876. #endif
  195877. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195878. "adds r4, r4, r6\n\t"
  195879. #else
  195880. "add r4, r4, r6\n\t"
  195881. #endif
  195882. #ifdef WOLFSSL_KEIL
  195883. "adcs r2, r2, %[r]\n\t"
  195884. #elif defined(__clang__)
  195885. "adcs r2, %[r]\n\t"
  195886. #else
  195887. "adc r2, %[r]\n\t"
  195888. #endif
  195889. #ifdef WOLFSSL_KEIL
  195890. "adcs r3, r3, %[r]\n\t"
  195891. #elif defined(__clang__)
  195892. "adcs r3, %[r]\n\t"
  195893. #else
  195894. "adc r3, %[r]\n\t"
  195895. #endif
  195896. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195897. "lsrs r6, r7, #16\n\t"
  195898. #else
  195899. "lsr r6, r7, #16\n\t"
  195900. #endif
  195901. #ifdef WOLFSSL_KEIL
  195902. "muls r5, r6, r5\n\t"
  195903. #elif defined(__clang__)
  195904. "muls r5, r6\n\t"
  195905. #else
  195906. "mul r5, r6\n\t"
  195907. #endif
  195908. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195909. "lsrs r6, r5, #16\n\t"
  195910. #else
  195911. "lsr r6, r5, #16\n\t"
  195912. #endif
  195913. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195914. "lsls r5, r5, #16\n\t"
  195915. #else
  195916. "lsl r5, r5, #16\n\t"
  195917. #endif
  195918. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195919. "adds r4, r4, r5\n\t"
  195920. #else
  195921. "add r4, r4, r5\n\t"
  195922. #endif
  195923. #ifdef WOLFSSL_KEIL
  195924. "adcs r2, r2, r6\n\t"
  195925. #elif defined(__clang__)
  195926. "adcs r2, r6\n\t"
  195927. #else
  195928. "adc r2, r6\n\t"
  195929. #endif
  195930. #ifdef WOLFSSL_KEIL
  195931. "adcs r3, r3, %[r]\n\t"
  195932. #elif defined(__clang__)
  195933. "adcs r3, %[r]\n\t"
  195934. #else
  195935. "adc r3, %[r]\n\t"
  195936. #endif
  195937. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195938. "adds r4, r4, r5\n\t"
  195939. #else
  195940. "add r4, r4, r5\n\t"
  195941. #endif
  195942. #ifdef WOLFSSL_KEIL
  195943. "adcs r2, r2, r6\n\t"
  195944. #elif defined(__clang__)
  195945. "adcs r2, r6\n\t"
  195946. #else
  195947. "adc r2, r6\n\t"
  195948. #endif
  195949. #ifdef WOLFSSL_KEIL
  195950. "adcs r3, r3, %[r]\n\t"
  195951. #elif defined(__clang__)
  195952. "adcs r3, %[r]\n\t"
  195953. #else
  195954. "adc r3, %[r]\n\t"
  195955. #endif
  195956. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195957. "lsrs r5, %[a], #16\n\t"
  195958. #else
  195959. "lsr r5, %[a], #16\n\t"
  195960. #endif
  195961. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195962. "lsrs r6, r7, #16\n\t"
  195963. #else
  195964. "lsr r6, r7, #16\n\t"
  195965. #endif
  195966. #ifdef WOLFSSL_KEIL
  195967. "muls r6, r5, r6\n\t"
  195968. #elif defined(__clang__)
  195969. "muls r6, r5\n\t"
  195970. #else
  195971. "mul r6, r5\n\t"
  195972. #endif
  195973. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195974. "adds r2, r2, r6\n\t"
  195975. #else
  195976. "add r2, r2, r6\n\t"
  195977. #endif
  195978. #ifdef WOLFSSL_KEIL
  195979. "adcs r3, r3, %[r]\n\t"
  195980. #elif defined(__clang__)
  195981. "adcs r3, %[r]\n\t"
  195982. #else
  195983. "adc r3, %[r]\n\t"
  195984. #endif
  195985. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195986. "adds r2, r2, r6\n\t"
  195987. #else
  195988. "add r2, r2, r6\n\t"
  195989. #endif
  195990. #ifdef WOLFSSL_KEIL
  195991. "adcs r3, r3, %[r]\n\t"
  195992. #elif defined(__clang__)
  195993. "adcs r3, %[r]\n\t"
  195994. #else
  195995. "adc r3, %[r]\n\t"
  195996. #endif
  195997. "uxth r6, r7\n\t"
  195998. #ifdef WOLFSSL_KEIL
  195999. "muls r5, r6, r5\n\t"
  196000. #elif defined(__clang__)
  196001. "muls r5, r6\n\t"
  196002. #else
  196003. "mul r5, r6\n\t"
  196004. #endif
  196005. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196006. "lsrs r6, r5, #16\n\t"
  196007. #else
  196008. "lsr r6, r5, #16\n\t"
  196009. #endif
  196010. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196011. "lsls r5, r5, #16\n\t"
  196012. #else
  196013. "lsl r5, r5, #16\n\t"
  196014. #endif
  196015. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196016. "adds r4, r4, r5\n\t"
  196017. #else
  196018. "add r4, r4, r5\n\t"
  196019. #endif
  196020. #ifdef WOLFSSL_KEIL
  196021. "adcs r2, r2, r6\n\t"
  196022. #elif defined(__clang__)
  196023. "adcs r2, r6\n\t"
  196024. #else
  196025. "adc r2, r6\n\t"
  196026. #endif
  196027. #ifdef WOLFSSL_KEIL
  196028. "adcs r3, r3, %[r]\n\t"
  196029. #elif defined(__clang__)
  196030. "adcs r3, %[r]\n\t"
  196031. #else
  196032. "adc r3, %[r]\n\t"
  196033. #endif
  196034. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196035. "adds r4, r4, r5\n\t"
  196036. #else
  196037. "add r4, r4, r5\n\t"
  196038. #endif
  196039. #ifdef WOLFSSL_KEIL
  196040. "adcs r2, r2, r6\n\t"
  196041. #elif defined(__clang__)
  196042. "adcs r2, r6\n\t"
  196043. #else
  196044. "adc r2, r6\n\t"
  196045. #endif
  196046. #ifdef WOLFSSL_KEIL
  196047. "adcs r3, r3, %[r]\n\t"
  196048. #elif defined(__clang__)
  196049. "adcs r3, %[r]\n\t"
  196050. #else
  196051. "adc r3, %[r]\n\t"
  196052. #endif
  196053. "# A[13] * A[13]\n\t"
  196054. "mov r7, r11\n\t"
  196055. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196056. "lsrs r6, r7, #16\n\t"
  196057. #else
  196058. "lsr r6, r7, #16\n\t"
  196059. #endif
  196060. "uxth r5, r7\n\t"
  196061. #ifdef WOLFSSL_KEIL
  196062. "muls r5, r5, r5\n\t"
  196063. #elif defined(__clang__)
  196064. "muls r5, r5\n\t"
  196065. #else
  196066. "mul r5, r5\n\t"
  196067. #endif
  196068. #ifdef WOLFSSL_KEIL
  196069. "muls r6, r6, r6\n\t"
  196070. #elif defined(__clang__)
  196071. "muls r6, r6\n\t"
  196072. #else
  196073. "mul r6, r6\n\t"
  196074. #endif
  196075. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196076. "adds r4, r4, r5\n\t"
  196077. #else
  196078. "add r4, r4, r5\n\t"
  196079. #endif
  196080. #ifdef WOLFSSL_KEIL
  196081. "adcs r2, r2, r6\n\t"
  196082. #elif defined(__clang__)
  196083. "adcs r2, r6\n\t"
  196084. #else
  196085. "adc r2, r6\n\t"
  196086. #endif
  196087. #ifdef WOLFSSL_KEIL
  196088. "adcs r3, r3, %[r]\n\t"
  196089. #elif defined(__clang__)
  196090. "adcs r3, %[r]\n\t"
  196091. #else
  196092. "adc r3, %[r]\n\t"
  196093. #endif
  196094. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196095. "lsrs r6, r7, #16\n\t"
  196096. #else
  196097. "lsr r6, r7, #16\n\t"
  196098. #endif
  196099. "uxth r5, r7\n\t"
  196100. #ifdef WOLFSSL_KEIL
  196101. "muls r5, r6, r5\n\t"
  196102. #elif defined(__clang__)
  196103. "muls r5, r6\n\t"
  196104. #else
  196105. "mul r5, r6\n\t"
  196106. #endif
  196107. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196108. "lsrs r6, r5, #15\n\t"
  196109. #else
  196110. "lsr r6, r5, #15\n\t"
  196111. #endif
  196112. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196113. "lsls r5, r5, #17\n\t"
  196114. #else
  196115. "lsl r5, r5, #17\n\t"
  196116. #endif
  196117. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196118. "adds r4, r4, r5\n\t"
  196119. #else
  196120. "add r4, r4, r5\n\t"
  196121. #endif
  196122. #ifdef WOLFSSL_KEIL
  196123. "adcs r2, r2, r6\n\t"
  196124. #elif defined(__clang__)
  196125. "adcs r2, r6\n\t"
  196126. #else
  196127. "adc r2, r6\n\t"
  196128. #endif
  196129. #ifdef WOLFSSL_KEIL
  196130. "adcs r3, r3, %[r]\n\t"
  196131. #elif defined(__clang__)
  196132. "adcs r3, %[r]\n\t"
  196133. #else
  196134. "adc r3, %[r]\n\t"
  196135. #endif
  196136. "mov %[r], r8\n\t"
  196137. "str r4, [%[r], #104]\n\t"
  196138. "movs %[r], #0\n\t"
  196139. "# A[14] * A[13]\n\t"
  196140. "movs r4, #0\n\t"
  196141. "mov %[a], r9\n\t"
  196142. "mov %[a], r12\n\t"
  196143. "uxth r5, %[a]\n\t"
  196144. "uxth r6, r7\n\t"
  196145. #ifdef WOLFSSL_KEIL
  196146. "muls r6, r5, r6\n\t"
  196147. #elif defined(__clang__)
  196148. "muls r6, r5\n\t"
  196149. #else
  196150. "mul r6, r5\n\t"
  196151. #endif
  196152. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196153. "adds r2, r2, r6\n\t"
  196154. #else
  196155. "add r2, r2, r6\n\t"
  196156. #endif
  196157. #ifdef WOLFSSL_KEIL
  196158. "adcs r3, r3, %[r]\n\t"
  196159. #elif defined(__clang__)
  196160. "adcs r3, %[r]\n\t"
  196161. #else
  196162. "adc r3, %[r]\n\t"
  196163. #endif
  196164. #ifdef WOLFSSL_KEIL
  196165. "adcs r4, r4, %[r]\n\t"
  196166. #elif defined(__clang__)
  196167. "adcs r4, %[r]\n\t"
  196168. #else
  196169. "adc r4, %[r]\n\t"
  196170. #endif
  196171. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196172. "adds r2, r2, r6\n\t"
  196173. #else
  196174. "add r2, r2, r6\n\t"
  196175. #endif
  196176. #ifdef WOLFSSL_KEIL
  196177. "adcs r3, r3, %[r]\n\t"
  196178. #elif defined(__clang__)
  196179. "adcs r3, %[r]\n\t"
  196180. #else
  196181. "adc r3, %[r]\n\t"
  196182. #endif
  196183. #ifdef WOLFSSL_KEIL
  196184. "adcs r4, r4, %[r]\n\t"
  196185. #elif defined(__clang__)
  196186. "adcs r4, %[r]\n\t"
  196187. #else
  196188. "adc r4, %[r]\n\t"
  196189. #endif
  196190. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196191. "lsrs r6, r7, #16\n\t"
  196192. #else
  196193. "lsr r6, r7, #16\n\t"
  196194. #endif
  196195. #ifdef WOLFSSL_KEIL
  196196. "muls r5, r6, r5\n\t"
  196197. #elif defined(__clang__)
  196198. "muls r5, r6\n\t"
  196199. #else
  196200. "mul r5, r6\n\t"
  196201. #endif
  196202. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196203. "lsrs r6, r5, #16\n\t"
  196204. #else
  196205. "lsr r6, r5, #16\n\t"
  196206. #endif
  196207. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196208. "lsls r5, r5, #16\n\t"
  196209. #else
  196210. "lsl r5, r5, #16\n\t"
  196211. #endif
  196212. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196213. "adds r2, r2, r5\n\t"
  196214. #else
  196215. "add r2, r2, r5\n\t"
  196216. #endif
  196217. #ifdef WOLFSSL_KEIL
  196218. "adcs r3, r3, r6\n\t"
  196219. #elif defined(__clang__)
  196220. "adcs r3, r6\n\t"
  196221. #else
  196222. "adc r3, r6\n\t"
  196223. #endif
  196224. #ifdef WOLFSSL_KEIL
  196225. "adcs r4, r4, %[r]\n\t"
  196226. #elif defined(__clang__)
  196227. "adcs r4, %[r]\n\t"
  196228. #else
  196229. "adc r4, %[r]\n\t"
  196230. #endif
  196231. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196232. "adds r2, r2, r5\n\t"
  196233. #else
  196234. "add r2, r2, r5\n\t"
  196235. #endif
  196236. #ifdef WOLFSSL_KEIL
  196237. "adcs r3, r3, r6\n\t"
  196238. #elif defined(__clang__)
  196239. "adcs r3, r6\n\t"
  196240. #else
  196241. "adc r3, r6\n\t"
  196242. #endif
  196243. #ifdef WOLFSSL_KEIL
  196244. "adcs r4, r4, %[r]\n\t"
  196245. #elif defined(__clang__)
  196246. "adcs r4, %[r]\n\t"
  196247. #else
  196248. "adc r4, %[r]\n\t"
  196249. #endif
  196250. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196251. "lsrs r5, %[a], #16\n\t"
  196252. #else
  196253. "lsr r5, %[a], #16\n\t"
  196254. #endif
  196255. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196256. "lsrs r6, r7, #16\n\t"
  196257. #else
  196258. "lsr r6, r7, #16\n\t"
  196259. #endif
  196260. #ifdef WOLFSSL_KEIL
  196261. "muls r6, r5, r6\n\t"
  196262. #elif defined(__clang__)
  196263. "muls r6, r5\n\t"
  196264. #else
  196265. "mul r6, r5\n\t"
  196266. #endif
  196267. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196268. "adds r3, r3, r6\n\t"
  196269. #else
  196270. "add r3, r3, r6\n\t"
  196271. #endif
  196272. #ifdef WOLFSSL_KEIL
  196273. "adcs r4, r4, %[r]\n\t"
  196274. #elif defined(__clang__)
  196275. "adcs r4, %[r]\n\t"
  196276. #else
  196277. "adc r4, %[r]\n\t"
  196278. #endif
  196279. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196280. "adds r3, r3, r6\n\t"
  196281. #else
  196282. "add r3, r3, r6\n\t"
  196283. #endif
  196284. #ifdef WOLFSSL_KEIL
  196285. "adcs r4, r4, %[r]\n\t"
  196286. #elif defined(__clang__)
  196287. "adcs r4, %[r]\n\t"
  196288. #else
  196289. "adc r4, %[r]\n\t"
  196290. #endif
  196291. "uxth r6, r7\n\t"
  196292. #ifdef WOLFSSL_KEIL
  196293. "muls r5, r6, r5\n\t"
  196294. #elif defined(__clang__)
  196295. "muls r5, r6\n\t"
  196296. #else
  196297. "mul r5, r6\n\t"
  196298. #endif
  196299. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196300. "lsrs r6, r5, #16\n\t"
  196301. #else
  196302. "lsr r6, r5, #16\n\t"
  196303. #endif
  196304. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196305. "lsls r5, r5, #16\n\t"
  196306. #else
  196307. "lsl r5, r5, #16\n\t"
  196308. #endif
  196309. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196310. "adds r2, r2, r5\n\t"
  196311. #else
  196312. "add r2, r2, r5\n\t"
  196313. #endif
  196314. #ifdef WOLFSSL_KEIL
  196315. "adcs r3, r3, r6\n\t"
  196316. #elif defined(__clang__)
  196317. "adcs r3, r6\n\t"
  196318. #else
  196319. "adc r3, r6\n\t"
  196320. #endif
  196321. #ifdef WOLFSSL_KEIL
  196322. "adcs r4, r4, %[r]\n\t"
  196323. #elif defined(__clang__)
  196324. "adcs r4, %[r]\n\t"
  196325. #else
  196326. "adc r4, %[r]\n\t"
  196327. #endif
  196328. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196329. "adds r2, r2, r5\n\t"
  196330. #else
  196331. "add r2, r2, r5\n\t"
  196332. #endif
  196333. #ifdef WOLFSSL_KEIL
  196334. "adcs r3, r3, r6\n\t"
  196335. #elif defined(__clang__)
  196336. "adcs r3, r6\n\t"
  196337. #else
  196338. "adc r3, r6\n\t"
  196339. #endif
  196340. #ifdef WOLFSSL_KEIL
  196341. "adcs r4, r4, %[r]\n\t"
  196342. #elif defined(__clang__)
  196343. "adcs r4, %[r]\n\t"
  196344. #else
  196345. "adc r4, %[r]\n\t"
  196346. #endif
  196347. "# A[15] * A[12]\n\t"
  196348. "mov %[a], r9\n\t"
  196349. "mov r7, r10\n\t"
  196350. "mov %[a], lr\n\t"
  196351. "uxth r5, %[a]\n\t"
  196352. "uxth r6, r7\n\t"
  196353. #ifdef WOLFSSL_KEIL
  196354. "muls r6, r5, r6\n\t"
  196355. #elif defined(__clang__)
  196356. "muls r6, r5\n\t"
  196357. #else
  196358. "mul r6, r5\n\t"
  196359. #endif
  196360. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196361. "adds r2, r2, r6\n\t"
  196362. #else
  196363. "add r2, r2, r6\n\t"
  196364. #endif
  196365. #ifdef WOLFSSL_KEIL
  196366. "adcs r3, r3, %[r]\n\t"
  196367. #elif defined(__clang__)
  196368. "adcs r3, %[r]\n\t"
  196369. #else
  196370. "adc r3, %[r]\n\t"
  196371. #endif
  196372. #ifdef WOLFSSL_KEIL
  196373. "adcs r4, r4, %[r]\n\t"
  196374. #elif defined(__clang__)
  196375. "adcs r4, %[r]\n\t"
  196376. #else
  196377. "adc r4, %[r]\n\t"
  196378. #endif
  196379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196380. "adds r2, r2, r6\n\t"
  196381. #else
  196382. "add r2, r2, r6\n\t"
  196383. #endif
  196384. #ifdef WOLFSSL_KEIL
  196385. "adcs r3, r3, %[r]\n\t"
  196386. #elif defined(__clang__)
  196387. "adcs r3, %[r]\n\t"
  196388. #else
  196389. "adc r3, %[r]\n\t"
  196390. #endif
  196391. #ifdef WOLFSSL_KEIL
  196392. "adcs r4, r4, %[r]\n\t"
  196393. #elif defined(__clang__)
  196394. "adcs r4, %[r]\n\t"
  196395. #else
  196396. "adc r4, %[r]\n\t"
  196397. #endif
  196398. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196399. "lsrs r6, r7, #16\n\t"
  196400. #else
  196401. "lsr r6, r7, #16\n\t"
  196402. #endif
  196403. #ifdef WOLFSSL_KEIL
  196404. "muls r5, r6, r5\n\t"
  196405. #elif defined(__clang__)
  196406. "muls r5, r6\n\t"
  196407. #else
  196408. "mul r5, r6\n\t"
  196409. #endif
  196410. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196411. "lsrs r6, r5, #16\n\t"
  196412. #else
  196413. "lsr r6, r5, #16\n\t"
  196414. #endif
  196415. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196416. "lsls r5, r5, #16\n\t"
  196417. #else
  196418. "lsl r5, r5, #16\n\t"
  196419. #endif
  196420. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196421. "adds r2, r2, r5\n\t"
  196422. #else
  196423. "add r2, r2, r5\n\t"
  196424. #endif
  196425. #ifdef WOLFSSL_KEIL
  196426. "adcs r3, r3, r6\n\t"
  196427. #elif defined(__clang__)
  196428. "adcs r3, r6\n\t"
  196429. #else
  196430. "adc r3, r6\n\t"
  196431. #endif
  196432. #ifdef WOLFSSL_KEIL
  196433. "adcs r4, r4, %[r]\n\t"
  196434. #elif defined(__clang__)
  196435. "adcs r4, %[r]\n\t"
  196436. #else
  196437. "adc r4, %[r]\n\t"
  196438. #endif
  196439. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196440. "adds r2, r2, r5\n\t"
  196441. #else
  196442. "add r2, r2, r5\n\t"
  196443. #endif
  196444. #ifdef WOLFSSL_KEIL
  196445. "adcs r3, r3, r6\n\t"
  196446. #elif defined(__clang__)
  196447. "adcs r3, r6\n\t"
  196448. #else
  196449. "adc r3, r6\n\t"
  196450. #endif
  196451. #ifdef WOLFSSL_KEIL
  196452. "adcs r4, r4, %[r]\n\t"
  196453. #elif defined(__clang__)
  196454. "adcs r4, %[r]\n\t"
  196455. #else
  196456. "adc r4, %[r]\n\t"
  196457. #endif
  196458. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196459. "lsrs r5, %[a], #16\n\t"
  196460. #else
  196461. "lsr r5, %[a], #16\n\t"
  196462. #endif
  196463. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196464. "lsrs r6, r7, #16\n\t"
  196465. #else
  196466. "lsr r6, r7, #16\n\t"
  196467. #endif
  196468. #ifdef WOLFSSL_KEIL
  196469. "muls r6, r5, r6\n\t"
  196470. #elif defined(__clang__)
  196471. "muls r6, r5\n\t"
  196472. #else
  196473. "mul r6, r5\n\t"
  196474. #endif
  196475. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196476. "adds r3, r3, r6\n\t"
  196477. #else
  196478. "add r3, r3, r6\n\t"
  196479. #endif
  196480. #ifdef WOLFSSL_KEIL
  196481. "adcs r4, r4, %[r]\n\t"
  196482. #elif defined(__clang__)
  196483. "adcs r4, %[r]\n\t"
  196484. #else
  196485. "adc r4, %[r]\n\t"
  196486. #endif
  196487. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196488. "adds r3, r3, r6\n\t"
  196489. #else
  196490. "add r3, r3, r6\n\t"
  196491. #endif
  196492. #ifdef WOLFSSL_KEIL
  196493. "adcs r4, r4, %[r]\n\t"
  196494. #elif defined(__clang__)
  196495. "adcs r4, %[r]\n\t"
  196496. #else
  196497. "adc r4, %[r]\n\t"
  196498. #endif
  196499. "uxth r6, r7\n\t"
  196500. #ifdef WOLFSSL_KEIL
  196501. "muls r5, r6, r5\n\t"
  196502. #elif defined(__clang__)
  196503. "muls r5, r6\n\t"
  196504. #else
  196505. "mul r5, r6\n\t"
  196506. #endif
  196507. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196508. "lsrs r6, r5, #16\n\t"
  196509. #else
  196510. "lsr r6, r5, #16\n\t"
  196511. #endif
  196512. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196513. "lsls r5, r5, #16\n\t"
  196514. #else
  196515. "lsl r5, r5, #16\n\t"
  196516. #endif
  196517. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196518. "adds r2, r2, r5\n\t"
  196519. #else
  196520. "add r2, r2, r5\n\t"
  196521. #endif
  196522. #ifdef WOLFSSL_KEIL
  196523. "adcs r3, r3, r6\n\t"
  196524. #elif defined(__clang__)
  196525. "adcs r3, r6\n\t"
  196526. #else
  196527. "adc r3, r6\n\t"
  196528. #endif
  196529. #ifdef WOLFSSL_KEIL
  196530. "adcs r4, r4, %[r]\n\t"
  196531. #elif defined(__clang__)
  196532. "adcs r4, %[r]\n\t"
  196533. #else
  196534. "adc r4, %[r]\n\t"
  196535. #endif
  196536. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196537. "adds r2, r2, r5\n\t"
  196538. #else
  196539. "add r2, r2, r5\n\t"
  196540. #endif
  196541. #ifdef WOLFSSL_KEIL
  196542. "adcs r3, r3, r6\n\t"
  196543. #elif defined(__clang__)
  196544. "adcs r3, r6\n\t"
  196545. #else
  196546. "adc r3, r6\n\t"
  196547. #endif
  196548. #ifdef WOLFSSL_KEIL
  196549. "adcs r4, r4, %[r]\n\t"
  196550. #elif defined(__clang__)
  196551. "adcs r4, %[r]\n\t"
  196552. #else
  196553. "adc r4, %[r]\n\t"
  196554. #endif
  196555. "mov %[r], r8\n\t"
  196556. "str r2, [%[r], #108]\n\t"
  196557. "movs %[r], #0\n\t"
  196558. "# A[15] * A[13]\n\t"
  196559. "movs r2, #0\n\t"
  196560. "mov %[a], r9\n\t"
  196561. "mov r7, r11\n\t"
  196562. "mov %[a], lr\n\t"
  196563. "uxth r5, %[a]\n\t"
  196564. "uxth r6, r7\n\t"
  196565. #ifdef WOLFSSL_KEIL
  196566. "muls r6, r5, r6\n\t"
  196567. #elif defined(__clang__)
  196568. "muls r6, r5\n\t"
  196569. #else
  196570. "mul r6, r5\n\t"
  196571. #endif
  196572. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196573. "adds r3, r3, r6\n\t"
  196574. #else
  196575. "add r3, r3, r6\n\t"
  196576. #endif
  196577. #ifdef WOLFSSL_KEIL
  196578. "adcs r4, r4, %[r]\n\t"
  196579. #elif defined(__clang__)
  196580. "adcs r4, %[r]\n\t"
  196581. #else
  196582. "adc r4, %[r]\n\t"
  196583. #endif
  196584. #ifdef WOLFSSL_KEIL
  196585. "adcs r2, r2, %[r]\n\t"
  196586. #elif defined(__clang__)
  196587. "adcs r2, %[r]\n\t"
  196588. #else
  196589. "adc r2, %[r]\n\t"
  196590. #endif
  196591. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196592. "adds r3, r3, r6\n\t"
  196593. #else
  196594. "add r3, r3, r6\n\t"
  196595. #endif
  196596. #ifdef WOLFSSL_KEIL
  196597. "adcs r4, r4, %[r]\n\t"
  196598. #elif defined(__clang__)
  196599. "adcs r4, %[r]\n\t"
  196600. #else
  196601. "adc r4, %[r]\n\t"
  196602. #endif
  196603. #ifdef WOLFSSL_KEIL
  196604. "adcs r2, r2, %[r]\n\t"
  196605. #elif defined(__clang__)
  196606. "adcs r2, %[r]\n\t"
  196607. #else
  196608. "adc r2, %[r]\n\t"
  196609. #endif
  196610. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196611. "lsrs r6, r7, #16\n\t"
  196612. #else
  196613. "lsr r6, r7, #16\n\t"
  196614. #endif
  196615. #ifdef WOLFSSL_KEIL
  196616. "muls r5, r6, r5\n\t"
  196617. #elif defined(__clang__)
  196618. "muls r5, r6\n\t"
  196619. #else
  196620. "mul r5, r6\n\t"
  196621. #endif
  196622. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196623. "lsrs r6, r5, #16\n\t"
  196624. #else
  196625. "lsr r6, r5, #16\n\t"
  196626. #endif
  196627. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196628. "lsls r5, r5, #16\n\t"
  196629. #else
  196630. "lsl r5, r5, #16\n\t"
  196631. #endif
  196632. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196633. "adds r3, r3, r5\n\t"
  196634. #else
  196635. "add r3, r3, r5\n\t"
  196636. #endif
  196637. #ifdef WOLFSSL_KEIL
  196638. "adcs r4, r4, r6\n\t"
  196639. #elif defined(__clang__)
  196640. "adcs r4, r6\n\t"
  196641. #else
  196642. "adc r4, r6\n\t"
  196643. #endif
  196644. #ifdef WOLFSSL_KEIL
  196645. "adcs r2, r2, %[r]\n\t"
  196646. #elif defined(__clang__)
  196647. "adcs r2, %[r]\n\t"
  196648. #else
  196649. "adc r2, %[r]\n\t"
  196650. #endif
  196651. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196652. "adds r3, r3, r5\n\t"
  196653. #else
  196654. "add r3, r3, r5\n\t"
  196655. #endif
  196656. #ifdef WOLFSSL_KEIL
  196657. "adcs r4, r4, r6\n\t"
  196658. #elif defined(__clang__)
  196659. "adcs r4, r6\n\t"
  196660. #else
  196661. "adc r4, r6\n\t"
  196662. #endif
  196663. #ifdef WOLFSSL_KEIL
  196664. "adcs r2, r2, %[r]\n\t"
  196665. #elif defined(__clang__)
  196666. "adcs r2, %[r]\n\t"
  196667. #else
  196668. "adc r2, %[r]\n\t"
  196669. #endif
  196670. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196671. "lsrs r5, %[a], #16\n\t"
  196672. #else
  196673. "lsr r5, %[a], #16\n\t"
  196674. #endif
  196675. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196676. "lsrs r6, r7, #16\n\t"
  196677. #else
  196678. "lsr r6, r7, #16\n\t"
  196679. #endif
  196680. #ifdef WOLFSSL_KEIL
  196681. "muls r6, r5, r6\n\t"
  196682. #elif defined(__clang__)
  196683. "muls r6, r5\n\t"
  196684. #else
  196685. "mul r6, r5\n\t"
  196686. #endif
  196687. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196688. "adds r4, r4, r6\n\t"
  196689. #else
  196690. "add r4, r4, r6\n\t"
  196691. #endif
  196692. #ifdef WOLFSSL_KEIL
  196693. "adcs r2, r2, %[r]\n\t"
  196694. #elif defined(__clang__)
  196695. "adcs r2, %[r]\n\t"
  196696. #else
  196697. "adc r2, %[r]\n\t"
  196698. #endif
  196699. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196700. "adds r4, r4, r6\n\t"
  196701. #else
  196702. "add r4, r4, r6\n\t"
  196703. #endif
  196704. #ifdef WOLFSSL_KEIL
  196705. "adcs r2, r2, %[r]\n\t"
  196706. #elif defined(__clang__)
  196707. "adcs r2, %[r]\n\t"
  196708. #else
  196709. "adc r2, %[r]\n\t"
  196710. #endif
  196711. "uxth r6, r7\n\t"
  196712. #ifdef WOLFSSL_KEIL
  196713. "muls r5, r6, r5\n\t"
  196714. #elif defined(__clang__)
  196715. "muls r5, r6\n\t"
  196716. #else
  196717. "mul r5, r6\n\t"
  196718. #endif
  196719. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196720. "lsrs r6, r5, #16\n\t"
  196721. #else
  196722. "lsr r6, r5, #16\n\t"
  196723. #endif
  196724. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196725. "lsls r5, r5, #16\n\t"
  196726. #else
  196727. "lsl r5, r5, #16\n\t"
  196728. #endif
  196729. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196730. "adds r3, r3, r5\n\t"
  196731. #else
  196732. "add r3, r3, r5\n\t"
  196733. #endif
  196734. #ifdef WOLFSSL_KEIL
  196735. "adcs r4, r4, r6\n\t"
  196736. #elif defined(__clang__)
  196737. "adcs r4, r6\n\t"
  196738. #else
  196739. "adc r4, r6\n\t"
  196740. #endif
  196741. #ifdef WOLFSSL_KEIL
  196742. "adcs r2, r2, %[r]\n\t"
  196743. #elif defined(__clang__)
  196744. "adcs r2, %[r]\n\t"
  196745. #else
  196746. "adc r2, %[r]\n\t"
  196747. #endif
  196748. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196749. "adds r3, r3, r5\n\t"
  196750. #else
  196751. "add r3, r3, r5\n\t"
  196752. #endif
  196753. #ifdef WOLFSSL_KEIL
  196754. "adcs r4, r4, r6\n\t"
  196755. #elif defined(__clang__)
  196756. "adcs r4, r6\n\t"
  196757. #else
  196758. "adc r4, r6\n\t"
  196759. #endif
  196760. #ifdef WOLFSSL_KEIL
  196761. "adcs r2, r2, %[r]\n\t"
  196762. #elif defined(__clang__)
  196763. "adcs r2, %[r]\n\t"
  196764. #else
  196765. "adc r2, %[r]\n\t"
  196766. #endif
  196767. "# A[14] * A[14]\n\t"
  196768. "mov r7, r12\n\t"
  196769. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196770. "lsrs r6, r7, #16\n\t"
  196771. #else
  196772. "lsr r6, r7, #16\n\t"
  196773. #endif
  196774. "uxth r5, r7\n\t"
  196775. #ifdef WOLFSSL_KEIL
  196776. "muls r5, r5, r5\n\t"
  196777. #elif defined(__clang__)
  196778. "muls r5, r5\n\t"
  196779. #else
  196780. "mul r5, r5\n\t"
  196781. #endif
  196782. #ifdef WOLFSSL_KEIL
  196783. "muls r6, r6, r6\n\t"
  196784. #elif defined(__clang__)
  196785. "muls r6, r6\n\t"
  196786. #else
  196787. "mul r6, r6\n\t"
  196788. #endif
  196789. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196790. "adds r3, r3, r5\n\t"
  196791. #else
  196792. "add r3, r3, r5\n\t"
  196793. #endif
  196794. #ifdef WOLFSSL_KEIL
  196795. "adcs r4, r4, r6\n\t"
  196796. #elif defined(__clang__)
  196797. "adcs r4, r6\n\t"
  196798. #else
  196799. "adc r4, r6\n\t"
  196800. #endif
  196801. #ifdef WOLFSSL_KEIL
  196802. "adcs r2, r2, %[r]\n\t"
  196803. #elif defined(__clang__)
  196804. "adcs r2, %[r]\n\t"
  196805. #else
  196806. "adc r2, %[r]\n\t"
  196807. #endif
  196808. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196809. "lsrs r6, r7, #16\n\t"
  196810. #else
  196811. "lsr r6, r7, #16\n\t"
  196812. #endif
  196813. "uxth r5, r7\n\t"
  196814. #ifdef WOLFSSL_KEIL
  196815. "muls r5, r6, r5\n\t"
  196816. #elif defined(__clang__)
  196817. "muls r5, r6\n\t"
  196818. #else
  196819. "mul r5, r6\n\t"
  196820. #endif
  196821. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196822. "lsrs r6, r5, #15\n\t"
  196823. #else
  196824. "lsr r6, r5, #15\n\t"
  196825. #endif
  196826. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196827. "lsls r5, r5, #17\n\t"
  196828. #else
  196829. "lsl r5, r5, #17\n\t"
  196830. #endif
  196831. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196832. "adds r3, r3, r5\n\t"
  196833. #else
  196834. "add r3, r3, r5\n\t"
  196835. #endif
  196836. #ifdef WOLFSSL_KEIL
  196837. "adcs r4, r4, r6\n\t"
  196838. #elif defined(__clang__)
  196839. "adcs r4, r6\n\t"
  196840. #else
  196841. "adc r4, r6\n\t"
  196842. #endif
  196843. #ifdef WOLFSSL_KEIL
  196844. "adcs r2, r2, %[r]\n\t"
  196845. #elif defined(__clang__)
  196846. "adcs r2, %[r]\n\t"
  196847. #else
  196848. "adc r2, %[r]\n\t"
  196849. #endif
  196850. "mov %[r], r8\n\t"
  196851. "str r3, [%[r], #112]\n\t"
  196852. "movs %[r], #0\n\t"
  196853. "# A[15] * A[14]\n\t"
  196854. "movs r3, #0\n\t"
  196855. "mov %[a], r9\n\t"
  196856. "mov %[a], lr\n\t"
  196857. "uxth r5, %[a]\n\t"
  196858. "uxth r6, r7\n\t"
  196859. #ifdef WOLFSSL_KEIL
  196860. "muls r6, r5, r6\n\t"
  196861. #elif defined(__clang__)
  196862. "muls r6, r5\n\t"
  196863. #else
  196864. "mul r6, r5\n\t"
  196865. #endif
  196866. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196867. "adds r4, r4, r6\n\t"
  196868. #else
  196869. "add r4, r4, r6\n\t"
  196870. #endif
  196871. #ifdef WOLFSSL_KEIL
  196872. "adcs r2, r2, %[r]\n\t"
  196873. #elif defined(__clang__)
  196874. "adcs r2, %[r]\n\t"
  196875. #else
  196876. "adc r2, %[r]\n\t"
  196877. #endif
  196878. #ifdef WOLFSSL_KEIL
  196879. "adcs r3, r3, %[r]\n\t"
  196880. #elif defined(__clang__)
  196881. "adcs r3, %[r]\n\t"
  196882. #else
  196883. "adc r3, %[r]\n\t"
  196884. #endif
  196885. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196886. "adds r4, r4, r6\n\t"
  196887. #else
  196888. "add r4, r4, r6\n\t"
  196889. #endif
  196890. #ifdef WOLFSSL_KEIL
  196891. "adcs r2, r2, %[r]\n\t"
  196892. #elif defined(__clang__)
  196893. "adcs r2, %[r]\n\t"
  196894. #else
  196895. "adc r2, %[r]\n\t"
  196896. #endif
  196897. #ifdef WOLFSSL_KEIL
  196898. "adcs r3, r3, %[r]\n\t"
  196899. #elif defined(__clang__)
  196900. "adcs r3, %[r]\n\t"
  196901. #else
  196902. "adc r3, %[r]\n\t"
  196903. #endif
  196904. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196905. "lsrs r6, r7, #16\n\t"
  196906. #else
  196907. "lsr r6, r7, #16\n\t"
  196908. #endif
  196909. #ifdef WOLFSSL_KEIL
  196910. "muls r5, r6, r5\n\t"
  196911. #elif defined(__clang__)
  196912. "muls r5, r6\n\t"
  196913. #else
  196914. "mul r5, r6\n\t"
  196915. #endif
  196916. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196917. "lsrs r6, r5, #16\n\t"
  196918. #else
  196919. "lsr r6, r5, #16\n\t"
  196920. #endif
  196921. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196922. "lsls r5, r5, #16\n\t"
  196923. #else
  196924. "lsl r5, r5, #16\n\t"
  196925. #endif
  196926. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196927. "adds r4, r4, r5\n\t"
  196928. #else
  196929. "add r4, r4, r5\n\t"
  196930. #endif
  196931. #ifdef WOLFSSL_KEIL
  196932. "adcs r2, r2, r6\n\t"
  196933. #elif defined(__clang__)
  196934. "adcs r2, r6\n\t"
  196935. #else
  196936. "adc r2, r6\n\t"
  196937. #endif
  196938. #ifdef WOLFSSL_KEIL
  196939. "adcs r3, r3, %[r]\n\t"
  196940. #elif defined(__clang__)
  196941. "adcs r3, %[r]\n\t"
  196942. #else
  196943. "adc r3, %[r]\n\t"
  196944. #endif
  196945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196946. "adds r4, r4, r5\n\t"
  196947. #else
  196948. "add r4, r4, r5\n\t"
  196949. #endif
  196950. #ifdef WOLFSSL_KEIL
  196951. "adcs r2, r2, r6\n\t"
  196952. #elif defined(__clang__)
  196953. "adcs r2, r6\n\t"
  196954. #else
  196955. "adc r2, r6\n\t"
  196956. #endif
  196957. #ifdef WOLFSSL_KEIL
  196958. "adcs r3, r3, %[r]\n\t"
  196959. #elif defined(__clang__)
  196960. "adcs r3, %[r]\n\t"
  196961. #else
  196962. "adc r3, %[r]\n\t"
  196963. #endif
  196964. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196965. "lsrs r5, %[a], #16\n\t"
  196966. #else
  196967. "lsr r5, %[a], #16\n\t"
  196968. #endif
  196969. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196970. "lsrs r6, r7, #16\n\t"
  196971. #else
  196972. "lsr r6, r7, #16\n\t"
  196973. #endif
  196974. #ifdef WOLFSSL_KEIL
  196975. "muls r6, r5, r6\n\t"
  196976. #elif defined(__clang__)
  196977. "muls r6, r5\n\t"
  196978. #else
  196979. "mul r6, r5\n\t"
  196980. #endif
  196981. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196982. "adds r2, r2, r6\n\t"
  196983. #else
  196984. "add r2, r2, r6\n\t"
  196985. #endif
  196986. #ifdef WOLFSSL_KEIL
  196987. "adcs r3, r3, %[r]\n\t"
  196988. #elif defined(__clang__)
  196989. "adcs r3, %[r]\n\t"
  196990. #else
  196991. "adc r3, %[r]\n\t"
  196992. #endif
  196993. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196994. "adds r2, r2, r6\n\t"
  196995. #else
  196996. "add r2, r2, r6\n\t"
  196997. #endif
  196998. #ifdef WOLFSSL_KEIL
  196999. "adcs r3, r3, %[r]\n\t"
  197000. #elif defined(__clang__)
  197001. "adcs r3, %[r]\n\t"
  197002. #else
  197003. "adc r3, %[r]\n\t"
  197004. #endif
  197005. "uxth r6, r7\n\t"
  197006. #ifdef WOLFSSL_KEIL
  197007. "muls r5, r6, r5\n\t"
  197008. #elif defined(__clang__)
  197009. "muls r5, r6\n\t"
  197010. #else
  197011. "mul r5, r6\n\t"
  197012. #endif
  197013. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  197014. "lsrs r6, r5, #16\n\t"
  197015. #else
  197016. "lsr r6, r5, #16\n\t"
  197017. #endif
  197018. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  197019. "lsls r5, r5, #16\n\t"
  197020. #else
  197021. "lsl r5, r5, #16\n\t"
  197022. #endif
  197023. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  197024. "adds r4, r4, r5\n\t"
  197025. #else
  197026. "add r4, r4, r5\n\t"
  197027. #endif
  197028. #ifdef WOLFSSL_KEIL
  197029. "adcs r2, r2, r6\n\t"
  197030. #elif defined(__clang__)
  197031. "adcs r2, r6\n\t"
  197032. #else
  197033. "adc r2, r6\n\t"
  197034. #endif
  197035. #ifdef WOLFSSL_KEIL
  197036. "adcs r3, r3, %[r]\n\t"
  197037. #elif defined(__clang__)
  197038. "adcs r3, %[r]\n\t"
  197039. #else
  197040. "adc r3, %[r]\n\t"
  197041. #endif
  197042. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  197043. "adds r4, r4, r5\n\t"
  197044. #else
  197045. "add r4, r4, r5\n\t"
  197046. #endif
  197047. #ifdef WOLFSSL_KEIL
  197048. "adcs r2, r2, r6\n\t"
  197049. #elif defined(__clang__)
  197050. "adcs r2, r6\n\t"
  197051. #else
  197052. "adc r2, r6\n\t"
  197053. #endif
  197054. #ifdef WOLFSSL_KEIL
  197055. "adcs r3, r3, %[r]\n\t"
  197056. #elif defined(__clang__)
  197057. "adcs r3, %[r]\n\t"
  197058. #else
  197059. "adc r3, %[r]\n\t"
  197060. #endif
  197061. "mov %[r], r8\n\t"
  197062. "str r4, [%[r], #116]\n\t"
  197063. "movs %[r], #0\n\t"
  197064. "# A[15] * A[15]\n\t"
  197065. "mov %[a], r9\n\t"
  197066. "mov r7, lr\n\t"
  197067. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  197068. "lsrs r6, r7, #16\n\t"
  197069. #else
  197070. "lsr r6, r7, #16\n\t"
  197071. #endif
  197072. "uxth r5, r7\n\t"
  197073. #ifdef WOLFSSL_KEIL
  197074. "muls r5, r5, r5\n\t"
  197075. #elif defined(__clang__)
  197076. "muls r5, r5\n\t"
  197077. #else
  197078. "mul r5, r5\n\t"
  197079. #endif
  197080. #ifdef WOLFSSL_KEIL
  197081. "muls r6, r6, r6\n\t"
  197082. #elif defined(__clang__)
  197083. "muls r6, r6\n\t"
  197084. #else
  197085. "mul r6, r6\n\t"
  197086. #endif
  197087. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  197088. "adds r2, r2, r5\n\t"
  197089. #else
  197090. "add r2, r2, r5\n\t"
  197091. #endif
  197092. #ifdef WOLFSSL_KEIL
  197093. "adcs r3, r3, r6\n\t"
  197094. #elif defined(__clang__)
  197095. "adcs r3, r6\n\t"
  197096. #else
  197097. "adc r3, r6\n\t"
  197098. #endif
  197099. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  197100. "lsrs r6, r7, #16\n\t"
  197101. #else
  197102. "lsr r6, r7, #16\n\t"
  197103. #endif
  197104. "uxth r5, r7\n\t"
  197105. #ifdef WOLFSSL_KEIL
  197106. "muls r5, r6, r5\n\t"
  197107. #elif defined(__clang__)
  197108. "muls r5, r6\n\t"
  197109. #else
  197110. "mul r5, r6\n\t"
  197111. #endif
  197112. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  197113. "lsrs r6, r5, #15\n\t"
  197114. #else
  197115. "lsr r6, r5, #15\n\t"
  197116. #endif
  197117. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  197118. "lsls r5, r5, #17\n\t"
  197119. #else
  197120. "lsl r5, r5, #17\n\t"
  197121. #endif
  197122. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  197123. "adds r2, r2, r5\n\t"
  197124. #else
  197125. "add r2, r2, r5\n\t"
  197126. #endif
  197127. #ifdef WOLFSSL_KEIL
  197128. "adcs r3, r3, r6\n\t"
  197129. #elif defined(__clang__)
  197130. "adcs r3, r6\n\t"
  197131. #else
  197132. "adc r3, r6\n\t"
  197133. #endif
  197134. "mov %[r], r8\n\t"
  197135. "str r2, [%[r], #120]\n\t"
  197136. "str r3, [%[r], #124]\n\t"
  197137. "pop {r2, r3, r4, r5}\n\t"
  197138. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  197139. "pop {r2, r3, r4, r5}\n\t"
  197140. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  197141. "pop {r2, r3, r4, r5}\n\t"
  197142. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  197143. "pop {r2, r3, r4, r5}\n\t"
  197144. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  197145. : [r] "+l" (r), [a] "+l" (a)
  197146. :
  197147. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr"
  197148. );
  197149. }
  197150. #endif /* !WOLFSSL_SP_LARGE_CODE */
  197151. /* Add b to a into r. (r = a + b)
  197152. *
  197153. * r A single precision integer.
  197154. * a A single precision integer.
  197155. * b A single precision integer.
  197156. */
  197157. SP_NOINLINE static sp_digit sp_1024_add_16(sp_digit* r, const sp_digit* a,
  197158. const sp_digit* b)
  197159. {
  197160. __asm__ __volatile__ (
  197161. "ldm %[b]!, {r5, r6}\n\t"
  197162. "ldm %[a]!, {r3, r4}\n\t"
  197163. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  197164. "adds r3, r3, r5\n\t"
  197165. #else
  197166. "add r3, r3, r5\n\t"
  197167. #endif
  197168. #ifdef WOLFSSL_KEIL
  197169. "adcs r4, r4, r6\n\t"
  197170. #elif defined(__clang__)
  197171. "adcs r4, r6\n\t"
  197172. #else
  197173. "adc r4, r6\n\t"
  197174. #endif
  197175. "stm %[r]!, {r3, r4}\n\t"
  197176. "ldm %[b]!, {r5, r6}\n\t"
  197177. "ldm %[a]!, {r3, r4}\n\t"
  197178. #ifdef WOLFSSL_KEIL
  197179. "adcs r3, r3, r5\n\t"
  197180. #elif defined(__clang__)
  197181. "adcs r3, r5\n\t"
  197182. #else
  197183. "adc r3, r5\n\t"
  197184. #endif
  197185. #ifdef WOLFSSL_KEIL
  197186. "adcs r4, r4, r6\n\t"
  197187. #elif defined(__clang__)
  197188. "adcs r4, r6\n\t"
  197189. #else
  197190. "adc r4, r6\n\t"
  197191. #endif
  197192. "stm %[r]!, {r3, r4}\n\t"
  197193. "ldm %[b]!, {r5, r6}\n\t"
  197194. "ldm %[a]!, {r3, r4}\n\t"
  197195. #ifdef WOLFSSL_KEIL
  197196. "adcs r3, r3, r5\n\t"
  197197. #elif defined(__clang__)
  197198. "adcs r3, r5\n\t"
  197199. #else
  197200. "adc r3, r5\n\t"
  197201. #endif
  197202. #ifdef WOLFSSL_KEIL
  197203. "adcs r4, r4, r6\n\t"
  197204. #elif defined(__clang__)
  197205. "adcs r4, r6\n\t"
  197206. #else
  197207. "adc r4, r6\n\t"
  197208. #endif
  197209. "stm %[r]!, {r3, r4}\n\t"
  197210. "ldm %[b]!, {r5, r6}\n\t"
  197211. "ldm %[a]!, {r3, r4}\n\t"
  197212. #ifdef WOLFSSL_KEIL
  197213. "adcs r3, r3, r5\n\t"
  197214. #elif defined(__clang__)
  197215. "adcs r3, r5\n\t"
  197216. #else
  197217. "adc r3, r5\n\t"
  197218. #endif
  197219. #ifdef WOLFSSL_KEIL
  197220. "adcs r4, r4, r6\n\t"
  197221. #elif defined(__clang__)
  197222. "adcs r4, r6\n\t"
  197223. #else
  197224. "adc r4, r6\n\t"
  197225. #endif
  197226. "stm %[r]!, {r3, r4}\n\t"
  197227. "ldm %[b]!, {r5, r6}\n\t"
  197228. "ldm %[a]!, {r3, r4}\n\t"
  197229. #ifdef WOLFSSL_KEIL
  197230. "adcs r3, r3, r5\n\t"
  197231. #elif defined(__clang__)
  197232. "adcs r3, r5\n\t"
  197233. #else
  197234. "adc r3, r5\n\t"
  197235. #endif
  197236. #ifdef WOLFSSL_KEIL
  197237. "adcs r4, r4, r6\n\t"
  197238. #elif defined(__clang__)
  197239. "adcs r4, r6\n\t"
  197240. #else
  197241. "adc r4, r6\n\t"
  197242. #endif
  197243. "stm %[r]!, {r3, r4}\n\t"
  197244. "ldm %[b]!, {r5, r6}\n\t"
  197245. "ldm %[a]!, {r3, r4}\n\t"
  197246. #ifdef WOLFSSL_KEIL
  197247. "adcs r3, r3, r5\n\t"
  197248. #elif defined(__clang__)
  197249. "adcs r3, r5\n\t"
  197250. #else
  197251. "adc r3, r5\n\t"
  197252. #endif
  197253. #ifdef WOLFSSL_KEIL
  197254. "adcs r4, r4, r6\n\t"
  197255. #elif defined(__clang__)
  197256. "adcs r4, r6\n\t"
  197257. #else
  197258. "adc r4, r6\n\t"
  197259. #endif
  197260. "stm %[r]!, {r3, r4}\n\t"
  197261. "ldm %[b]!, {r5, r6}\n\t"
  197262. "ldm %[a]!, {r3, r4}\n\t"
  197263. #ifdef WOLFSSL_KEIL
  197264. "adcs r3, r3, r5\n\t"
  197265. #elif defined(__clang__)
  197266. "adcs r3, r5\n\t"
  197267. #else
  197268. "adc r3, r5\n\t"
  197269. #endif
  197270. #ifdef WOLFSSL_KEIL
  197271. "adcs r4, r4, r6\n\t"
  197272. #elif defined(__clang__)
  197273. "adcs r4, r6\n\t"
  197274. #else
  197275. "adc r4, r6\n\t"
  197276. #endif
  197277. "stm %[r]!, {r3, r4}\n\t"
  197278. "ldm %[b]!, {r5, r6}\n\t"
  197279. "ldm %[a]!, {r3, r4}\n\t"
  197280. #ifdef WOLFSSL_KEIL
  197281. "adcs r3, r3, r5\n\t"
  197282. #elif defined(__clang__)
  197283. "adcs r3, r5\n\t"
  197284. #else
  197285. "adc r3, r5\n\t"
  197286. #endif
  197287. #ifdef WOLFSSL_KEIL
  197288. "adcs r4, r4, r6\n\t"
  197289. #elif defined(__clang__)
  197290. "adcs r4, r6\n\t"
  197291. #else
  197292. "adc r4, r6\n\t"
  197293. #endif
  197294. "stm %[r]!, {r3, r4}\n\t"
  197295. "movs %[r], #0\n\t"
  197296. #ifdef WOLFSSL_KEIL
  197297. "adcs %[r], %[r], %[r]\n\t"
  197298. #elif defined(__clang__)
  197299. "adcs %[r], %[r]\n\t"
  197300. #else
  197301. "adc %[r], %[r]\n\t"
  197302. #endif
  197303. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  197304. :
  197305. : "memory", "r3", "r4", "r5", "r6"
  197306. );
  197307. return (uint32_t)(size_t)r;
  197308. }
  197309. /* Add b to a into r. (r = a + b)
  197310. *
  197311. * r A single precision integer.
  197312. * a A single precision integer.
  197313. * b A single precision integer.
  197314. */
  197315. SP_NOINLINE static sp_digit sp_1024_add_word_16(sp_digit* r, const sp_digit* a,
  197316. sp_digit b)
  197317. {
  197318. __asm__ __volatile__ (
  197319. "movs r5, #0\n\t"
  197320. "ldm %[a]!, {r3, r4}\n\t"
  197321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  197322. "adds r3, r3, %[b]\n\t"
  197323. #else
  197324. "add r3, r3, %[b]\n\t"
  197325. #endif
  197326. #ifdef WOLFSSL_KEIL
  197327. "adcs r4, r4, r5\n\t"
  197328. #elif defined(__clang__)
  197329. "adcs r4, r5\n\t"
  197330. #else
  197331. "adc r4, r5\n\t"
  197332. #endif
  197333. "stm %[r]!, {r3, r4}\n\t"
  197334. "ldm %[a]!, {r3, r4}\n\t"
  197335. #ifdef WOLFSSL_KEIL
  197336. "adcs r3, r3, r5\n\t"
  197337. #elif defined(__clang__)
  197338. "adcs r3, r5\n\t"
  197339. #else
  197340. "adc r3, r5\n\t"
  197341. #endif
  197342. #ifdef WOLFSSL_KEIL
  197343. "adcs r4, r4, r5\n\t"
  197344. #elif defined(__clang__)
  197345. "adcs r4, r5\n\t"
  197346. #else
  197347. "adc r4, r5\n\t"
  197348. #endif
  197349. "stm %[r]!, {r3, r4}\n\t"
  197350. "ldm %[a]!, {r3, r4}\n\t"
  197351. #ifdef WOLFSSL_KEIL
  197352. "adcs r3, r3, r5\n\t"
  197353. #elif defined(__clang__)
  197354. "adcs r3, r5\n\t"
  197355. #else
  197356. "adc r3, r5\n\t"
  197357. #endif
  197358. #ifdef WOLFSSL_KEIL
  197359. "adcs r4, r4, r5\n\t"
  197360. #elif defined(__clang__)
  197361. "adcs r4, r5\n\t"
  197362. #else
  197363. "adc r4, r5\n\t"
  197364. #endif
  197365. "stm %[r]!, {r3, r4}\n\t"
  197366. "ldm %[a]!, {r3, r4}\n\t"
  197367. #ifdef WOLFSSL_KEIL
  197368. "adcs r3, r3, r5\n\t"
  197369. #elif defined(__clang__)
  197370. "adcs r3, r5\n\t"
  197371. #else
  197372. "adc r3, r5\n\t"
  197373. #endif
  197374. #ifdef WOLFSSL_KEIL
  197375. "adcs r4, r4, r5\n\t"
  197376. #elif defined(__clang__)
  197377. "adcs r4, r5\n\t"
  197378. #else
  197379. "adc r4, r5\n\t"
  197380. #endif
  197381. "stm %[r]!, {r3, r4}\n\t"
  197382. "ldm %[a]!, {r3, r4}\n\t"
  197383. #ifdef WOLFSSL_KEIL
  197384. "adcs r3, r3, r5\n\t"
  197385. #elif defined(__clang__)
  197386. "adcs r3, r5\n\t"
  197387. #else
  197388. "adc r3, r5\n\t"
  197389. #endif
  197390. #ifdef WOLFSSL_KEIL
  197391. "adcs r4, r4, r5\n\t"
  197392. #elif defined(__clang__)
  197393. "adcs r4, r5\n\t"
  197394. #else
  197395. "adc r4, r5\n\t"
  197396. #endif
  197397. "stm %[r]!, {r3, r4}\n\t"
  197398. "ldm %[a]!, {r3, r4}\n\t"
  197399. #ifdef WOLFSSL_KEIL
  197400. "adcs r3, r3, r5\n\t"
  197401. #elif defined(__clang__)
  197402. "adcs r3, r5\n\t"
  197403. #else
  197404. "adc r3, r5\n\t"
  197405. #endif
  197406. #ifdef WOLFSSL_KEIL
  197407. "adcs r4, r4, r5\n\t"
  197408. #elif defined(__clang__)
  197409. "adcs r4, r5\n\t"
  197410. #else
  197411. "adc r4, r5\n\t"
  197412. #endif
  197413. "stm %[r]!, {r3, r4}\n\t"
  197414. "ldm %[a]!, {r3, r4}\n\t"
  197415. #ifdef WOLFSSL_KEIL
  197416. "adcs r3, r3, r5\n\t"
  197417. #elif defined(__clang__)
  197418. "adcs r3, r5\n\t"
  197419. #else
  197420. "adc r3, r5\n\t"
  197421. #endif
  197422. #ifdef WOLFSSL_KEIL
  197423. "adcs r4, r4, r5\n\t"
  197424. #elif defined(__clang__)
  197425. "adcs r4, r5\n\t"
  197426. #else
  197427. "adc r4, r5\n\t"
  197428. #endif
  197429. "stm %[r]!, {r3, r4}\n\t"
  197430. "ldm %[a]!, {r3, r4}\n\t"
  197431. #ifdef WOLFSSL_KEIL
  197432. "adcs r3, r3, r5\n\t"
  197433. #elif defined(__clang__)
  197434. "adcs r3, r5\n\t"
  197435. #else
  197436. "adc r3, r5\n\t"
  197437. #endif
  197438. #ifdef WOLFSSL_KEIL
  197439. "adcs r4, r4, r5\n\t"
  197440. #elif defined(__clang__)
  197441. "adcs r4, r5\n\t"
  197442. #else
  197443. "adc r4, r5\n\t"
  197444. #endif
  197445. "stm %[r]!, {r3, r4}\n\t"
  197446. "movs %[r], #0\n\t"
  197447. #ifdef WOLFSSL_KEIL
  197448. "adcs %[r], %[r], %[r]\n\t"
  197449. #elif defined(__clang__)
  197450. "adcs %[r], %[r]\n\t"
  197451. #else
  197452. "adc %[r], %[r]\n\t"
  197453. #endif
  197454. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  197455. :
  197456. : "memory", "r3", "r4", "r5"
  197457. );
  197458. return (uint32_t)(size_t)r;
  197459. }
  197460. /* Sub b from a into a. (a -= b)
  197461. *
  197462. * a A single precision integer.
  197463. * b A single precision integer.
  197464. */
  197465. SP_NOINLINE static sp_digit sp_1024_sub_in_place_32(sp_digit* a,
  197466. const sp_digit* b)
  197467. {
  197468. __asm__ __volatile__ (
  197469. "ldm %[b]!, {r4, r5}\n\t"
  197470. "ldr r2, [%[a]]\n\t"
  197471. "ldr r3, [%[a], #4]\n\t"
  197472. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  197473. "subs r2, r2, r4\n\t"
  197474. #else
  197475. "sub r2, r2, r4\n\t"
  197476. #endif
  197477. #ifdef WOLFSSL_KEIL
  197478. "sbcs r3, r3, r5\n\t"
  197479. #elif defined(__clang__)
  197480. "sbcs r3, r5\n\t"
  197481. #else
  197482. "sbc r3, r5\n\t"
  197483. #endif
  197484. "stm %[a]!, {r2, r3}\n\t"
  197485. "ldm %[b]!, {r4, r5}\n\t"
  197486. "ldr r2, [%[a]]\n\t"
  197487. "ldr r3, [%[a], #4]\n\t"
  197488. #ifdef WOLFSSL_KEIL
  197489. "sbcs r2, r2, r4\n\t"
  197490. #elif defined(__clang__)
  197491. "sbcs r2, r4\n\t"
  197492. #else
  197493. "sbc r2, r4\n\t"
  197494. #endif
  197495. #ifdef WOLFSSL_KEIL
  197496. "sbcs r3, r3, r5\n\t"
  197497. #elif defined(__clang__)
  197498. "sbcs r3, r5\n\t"
  197499. #else
  197500. "sbc r3, r5\n\t"
  197501. #endif
  197502. "stm %[a]!, {r2, r3}\n\t"
  197503. "ldm %[b]!, {r4, r5}\n\t"
  197504. "ldr r2, [%[a]]\n\t"
  197505. "ldr r3, [%[a], #4]\n\t"
  197506. #ifdef WOLFSSL_KEIL
  197507. "sbcs r2, r2, r4\n\t"
  197508. #elif defined(__clang__)
  197509. "sbcs r2, r4\n\t"
  197510. #else
  197511. "sbc r2, r4\n\t"
  197512. #endif
  197513. #ifdef WOLFSSL_KEIL
  197514. "sbcs r3, r3, r5\n\t"
  197515. #elif defined(__clang__)
  197516. "sbcs r3, r5\n\t"
  197517. #else
  197518. "sbc r3, r5\n\t"
  197519. #endif
  197520. "stm %[a]!, {r2, r3}\n\t"
  197521. "ldm %[b]!, {r4, r5}\n\t"
  197522. "ldr r2, [%[a]]\n\t"
  197523. "ldr r3, [%[a], #4]\n\t"
  197524. #ifdef WOLFSSL_KEIL
  197525. "sbcs r2, r2, r4\n\t"
  197526. #elif defined(__clang__)
  197527. "sbcs r2, r4\n\t"
  197528. #else
  197529. "sbc r2, r4\n\t"
  197530. #endif
  197531. #ifdef WOLFSSL_KEIL
  197532. "sbcs r3, r3, r5\n\t"
  197533. #elif defined(__clang__)
  197534. "sbcs r3, r5\n\t"
  197535. #else
  197536. "sbc r3, r5\n\t"
  197537. #endif
  197538. "stm %[a]!, {r2, r3}\n\t"
  197539. "ldm %[b]!, {r4, r5}\n\t"
  197540. "ldr r2, [%[a]]\n\t"
  197541. "ldr r3, [%[a], #4]\n\t"
  197542. #ifdef WOLFSSL_KEIL
  197543. "sbcs r2, r2, r4\n\t"
  197544. #elif defined(__clang__)
  197545. "sbcs r2, r4\n\t"
  197546. #else
  197547. "sbc r2, r4\n\t"
  197548. #endif
  197549. #ifdef WOLFSSL_KEIL
  197550. "sbcs r3, r3, r5\n\t"
  197551. #elif defined(__clang__)
  197552. "sbcs r3, r5\n\t"
  197553. #else
  197554. "sbc r3, r5\n\t"
  197555. #endif
  197556. "stm %[a]!, {r2, r3}\n\t"
  197557. "ldm %[b]!, {r4, r5}\n\t"
  197558. "ldr r2, [%[a]]\n\t"
  197559. "ldr r3, [%[a], #4]\n\t"
  197560. #ifdef WOLFSSL_KEIL
  197561. "sbcs r2, r2, r4\n\t"
  197562. #elif defined(__clang__)
  197563. "sbcs r2, r4\n\t"
  197564. #else
  197565. "sbc r2, r4\n\t"
  197566. #endif
  197567. #ifdef WOLFSSL_KEIL
  197568. "sbcs r3, r3, r5\n\t"
  197569. #elif defined(__clang__)
  197570. "sbcs r3, r5\n\t"
  197571. #else
  197572. "sbc r3, r5\n\t"
  197573. #endif
  197574. "stm %[a]!, {r2, r3}\n\t"
  197575. "ldm %[b]!, {r4, r5}\n\t"
  197576. "ldr r2, [%[a]]\n\t"
  197577. "ldr r3, [%[a], #4]\n\t"
  197578. #ifdef WOLFSSL_KEIL
  197579. "sbcs r2, r2, r4\n\t"
  197580. #elif defined(__clang__)
  197581. "sbcs r2, r4\n\t"
  197582. #else
  197583. "sbc r2, r4\n\t"
  197584. #endif
  197585. #ifdef WOLFSSL_KEIL
  197586. "sbcs r3, r3, r5\n\t"
  197587. #elif defined(__clang__)
  197588. "sbcs r3, r5\n\t"
  197589. #else
  197590. "sbc r3, r5\n\t"
  197591. #endif
  197592. "stm %[a]!, {r2, r3}\n\t"
  197593. "ldm %[b]!, {r4, r5}\n\t"
  197594. "ldr r2, [%[a]]\n\t"
  197595. "ldr r3, [%[a], #4]\n\t"
  197596. #ifdef WOLFSSL_KEIL
  197597. "sbcs r2, r2, r4\n\t"
  197598. #elif defined(__clang__)
  197599. "sbcs r2, r4\n\t"
  197600. #else
  197601. "sbc r2, r4\n\t"
  197602. #endif
  197603. #ifdef WOLFSSL_KEIL
  197604. "sbcs r3, r3, r5\n\t"
  197605. #elif defined(__clang__)
  197606. "sbcs r3, r5\n\t"
  197607. #else
  197608. "sbc r3, r5\n\t"
  197609. #endif
  197610. "stm %[a]!, {r2, r3}\n\t"
  197611. "ldm %[b]!, {r4, r5}\n\t"
  197612. "ldr r2, [%[a]]\n\t"
  197613. "ldr r3, [%[a], #4]\n\t"
  197614. #ifdef WOLFSSL_KEIL
  197615. "sbcs r2, r2, r4\n\t"
  197616. #elif defined(__clang__)
  197617. "sbcs r2, r4\n\t"
  197618. #else
  197619. "sbc r2, r4\n\t"
  197620. #endif
  197621. #ifdef WOLFSSL_KEIL
  197622. "sbcs r3, r3, r5\n\t"
  197623. #elif defined(__clang__)
  197624. "sbcs r3, r5\n\t"
  197625. #else
  197626. "sbc r3, r5\n\t"
  197627. #endif
  197628. "stm %[a]!, {r2, r3}\n\t"
  197629. "ldm %[b]!, {r4, r5}\n\t"
  197630. "ldr r2, [%[a]]\n\t"
  197631. "ldr r3, [%[a], #4]\n\t"
  197632. #ifdef WOLFSSL_KEIL
  197633. "sbcs r2, r2, r4\n\t"
  197634. #elif defined(__clang__)
  197635. "sbcs r2, r4\n\t"
  197636. #else
  197637. "sbc r2, r4\n\t"
  197638. #endif
  197639. #ifdef WOLFSSL_KEIL
  197640. "sbcs r3, r3, r5\n\t"
  197641. #elif defined(__clang__)
  197642. "sbcs r3, r5\n\t"
  197643. #else
  197644. "sbc r3, r5\n\t"
  197645. #endif
  197646. "stm %[a]!, {r2, r3}\n\t"
  197647. "ldm %[b]!, {r4, r5}\n\t"
  197648. "ldr r2, [%[a]]\n\t"
  197649. "ldr r3, [%[a], #4]\n\t"
  197650. #ifdef WOLFSSL_KEIL
  197651. "sbcs r2, r2, r4\n\t"
  197652. #elif defined(__clang__)
  197653. "sbcs r2, r4\n\t"
  197654. #else
  197655. "sbc r2, r4\n\t"
  197656. #endif
  197657. #ifdef WOLFSSL_KEIL
  197658. "sbcs r3, r3, r5\n\t"
  197659. #elif defined(__clang__)
  197660. "sbcs r3, r5\n\t"
  197661. #else
  197662. "sbc r3, r5\n\t"
  197663. #endif
  197664. "stm %[a]!, {r2, r3}\n\t"
  197665. "ldm %[b]!, {r4, r5}\n\t"
  197666. "ldr r2, [%[a]]\n\t"
  197667. "ldr r3, [%[a], #4]\n\t"
  197668. #ifdef WOLFSSL_KEIL
  197669. "sbcs r2, r2, r4\n\t"
  197670. #elif defined(__clang__)
  197671. "sbcs r2, r4\n\t"
  197672. #else
  197673. "sbc r2, r4\n\t"
  197674. #endif
  197675. #ifdef WOLFSSL_KEIL
  197676. "sbcs r3, r3, r5\n\t"
  197677. #elif defined(__clang__)
  197678. "sbcs r3, r5\n\t"
  197679. #else
  197680. "sbc r3, r5\n\t"
  197681. #endif
  197682. "stm %[a]!, {r2, r3}\n\t"
  197683. "ldm %[b]!, {r4, r5}\n\t"
  197684. "ldr r2, [%[a]]\n\t"
  197685. "ldr r3, [%[a], #4]\n\t"
  197686. #ifdef WOLFSSL_KEIL
  197687. "sbcs r2, r2, r4\n\t"
  197688. #elif defined(__clang__)
  197689. "sbcs r2, r4\n\t"
  197690. #else
  197691. "sbc r2, r4\n\t"
  197692. #endif
  197693. #ifdef WOLFSSL_KEIL
  197694. "sbcs r3, r3, r5\n\t"
  197695. #elif defined(__clang__)
  197696. "sbcs r3, r5\n\t"
  197697. #else
  197698. "sbc r3, r5\n\t"
  197699. #endif
  197700. "stm %[a]!, {r2, r3}\n\t"
  197701. "ldm %[b]!, {r4, r5}\n\t"
  197702. "ldr r2, [%[a]]\n\t"
  197703. "ldr r3, [%[a], #4]\n\t"
  197704. #ifdef WOLFSSL_KEIL
  197705. "sbcs r2, r2, r4\n\t"
  197706. #elif defined(__clang__)
  197707. "sbcs r2, r4\n\t"
  197708. #else
  197709. "sbc r2, r4\n\t"
  197710. #endif
  197711. #ifdef WOLFSSL_KEIL
  197712. "sbcs r3, r3, r5\n\t"
  197713. #elif defined(__clang__)
  197714. "sbcs r3, r5\n\t"
  197715. #else
  197716. "sbc r3, r5\n\t"
  197717. #endif
  197718. "stm %[a]!, {r2, r3}\n\t"
  197719. "ldm %[b]!, {r4, r5}\n\t"
  197720. "ldr r2, [%[a]]\n\t"
  197721. "ldr r3, [%[a], #4]\n\t"
  197722. #ifdef WOLFSSL_KEIL
  197723. "sbcs r2, r2, r4\n\t"
  197724. #elif defined(__clang__)
  197725. "sbcs r2, r4\n\t"
  197726. #else
  197727. "sbc r2, r4\n\t"
  197728. #endif
  197729. #ifdef WOLFSSL_KEIL
  197730. "sbcs r3, r3, r5\n\t"
  197731. #elif defined(__clang__)
  197732. "sbcs r3, r5\n\t"
  197733. #else
  197734. "sbc r3, r5\n\t"
  197735. #endif
  197736. "stm %[a]!, {r2, r3}\n\t"
  197737. "ldm %[b]!, {r4, r5}\n\t"
  197738. "ldr r2, [%[a]]\n\t"
  197739. "ldr r3, [%[a], #4]\n\t"
  197740. #ifdef WOLFSSL_KEIL
  197741. "sbcs r2, r2, r4\n\t"
  197742. #elif defined(__clang__)
  197743. "sbcs r2, r4\n\t"
  197744. #else
  197745. "sbc r2, r4\n\t"
  197746. #endif
  197747. #ifdef WOLFSSL_KEIL
  197748. "sbcs r3, r3, r5\n\t"
  197749. #elif defined(__clang__)
  197750. "sbcs r3, r5\n\t"
  197751. #else
  197752. "sbc r3, r5\n\t"
  197753. #endif
  197754. "stm %[a]!, {r2, r3}\n\t"
  197755. #ifdef WOLFSSL_KEIL
  197756. "sbcs %[a], %[a], %[a]\n\t"
  197757. #elif defined(__clang__)
  197758. "sbcs %[a], %[a]\n\t"
  197759. #else
  197760. "sbc %[a], %[a]\n\t"
  197761. #endif
  197762. : [a] "+l" (a), [b] "+l" (b)
  197763. :
  197764. : "memory", "r2", "r3", "r4", "r5"
  197765. );
  197766. return (uint32_t)(size_t)a;
  197767. }
  197768. /* Add b to a into r. (r = a + b)
  197769. *
  197770. * r A single precision integer.
  197771. * a A single precision integer.
  197772. * b A single precision integer.
  197773. */
  197774. SP_NOINLINE static sp_digit sp_1024_add_32(sp_digit* r, const sp_digit* a,
  197775. const sp_digit* b)
  197776. {
  197777. __asm__ __volatile__ (
  197778. "ldm %[b]!, {r5, r6}\n\t"
  197779. "ldm %[a]!, {r3, r4}\n\t"
  197780. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  197781. "adds r3, r3, r5\n\t"
  197782. #else
  197783. "add r3, r3, r5\n\t"
  197784. #endif
  197785. #ifdef WOLFSSL_KEIL
  197786. "adcs r4, r4, r6\n\t"
  197787. #elif defined(__clang__)
  197788. "adcs r4, r6\n\t"
  197789. #else
  197790. "adc r4, r6\n\t"
  197791. #endif
  197792. "stm %[r]!, {r3, r4}\n\t"
  197793. "ldm %[b]!, {r5, r6}\n\t"
  197794. "ldm %[a]!, {r3, r4}\n\t"
  197795. #ifdef WOLFSSL_KEIL
  197796. "adcs r3, r3, r5\n\t"
  197797. #elif defined(__clang__)
  197798. "adcs r3, r5\n\t"
  197799. #else
  197800. "adc r3, r5\n\t"
  197801. #endif
  197802. #ifdef WOLFSSL_KEIL
  197803. "adcs r4, r4, r6\n\t"
  197804. #elif defined(__clang__)
  197805. "adcs r4, r6\n\t"
  197806. #else
  197807. "adc r4, r6\n\t"
  197808. #endif
  197809. "stm %[r]!, {r3, r4}\n\t"
  197810. "ldm %[b]!, {r5, r6}\n\t"
  197811. "ldm %[a]!, {r3, r4}\n\t"
  197812. #ifdef WOLFSSL_KEIL
  197813. "adcs r3, r3, r5\n\t"
  197814. #elif defined(__clang__)
  197815. "adcs r3, r5\n\t"
  197816. #else
  197817. "adc r3, r5\n\t"
  197818. #endif
  197819. #ifdef WOLFSSL_KEIL
  197820. "adcs r4, r4, r6\n\t"
  197821. #elif defined(__clang__)
  197822. "adcs r4, r6\n\t"
  197823. #else
  197824. "adc r4, r6\n\t"
  197825. #endif
  197826. "stm %[r]!, {r3, r4}\n\t"
  197827. "ldm %[b]!, {r5, r6}\n\t"
  197828. "ldm %[a]!, {r3, r4}\n\t"
  197829. #ifdef WOLFSSL_KEIL
  197830. "adcs r3, r3, r5\n\t"
  197831. #elif defined(__clang__)
  197832. "adcs r3, r5\n\t"
  197833. #else
  197834. "adc r3, r5\n\t"
  197835. #endif
  197836. #ifdef WOLFSSL_KEIL
  197837. "adcs r4, r4, r6\n\t"
  197838. #elif defined(__clang__)
  197839. "adcs r4, r6\n\t"
  197840. #else
  197841. "adc r4, r6\n\t"
  197842. #endif
  197843. "stm %[r]!, {r3, r4}\n\t"
  197844. "ldm %[b]!, {r5, r6}\n\t"
  197845. "ldm %[a]!, {r3, r4}\n\t"
  197846. #ifdef WOLFSSL_KEIL
  197847. "adcs r3, r3, r5\n\t"
  197848. #elif defined(__clang__)
  197849. "adcs r3, r5\n\t"
  197850. #else
  197851. "adc r3, r5\n\t"
  197852. #endif
  197853. #ifdef WOLFSSL_KEIL
  197854. "adcs r4, r4, r6\n\t"
  197855. #elif defined(__clang__)
  197856. "adcs r4, r6\n\t"
  197857. #else
  197858. "adc r4, r6\n\t"
  197859. #endif
  197860. "stm %[r]!, {r3, r4}\n\t"
  197861. "ldm %[b]!, {r5, r6}\n\t"
  197862. "ldm %[a]!, {r3, r4}\n\t"
  197863. #ifdef WOLFSSL_KEIL
  197864. "adcs r3, r3, r5\n\t"
  197865. #elif defined(__clang__)
  197866. "adcs r3, r5\n\t"
  197867. #else
  197868. "adc r3, r5\n\t"
  197869. #endif
  197870. #ifdef WOLFSSL_KEIL
  197871. "adcs r4, r4, r6\n\t"
  197872. #elif defined(__clang__)
  197873. "adcs r4, r6\n\t"
  197874. #else
  197875. "adc r4, r6\n\t"
  197876. #endif
  197877. "stm %[r]!, {r3, r4}\n\t"
  197878. "ldm %[b]!, {r5, r6}\n\t"
  197879. "ldm %[a]!, {r3, r4}\n\t"
  197880. #ifdef WOLFSSL_KEIL
  197881. "adcs r3, r3, r5\n\t"
  197882. #elif defined(__clang__)
  197883. "adcs r3, r5\n\t"
  197884. #else
  197885. "adc r3, r5\n\t"
  197886. #endif
  197887. #ifdef WOLFSSL_KEIL
  197888. "adcs r4, r4, r6\n\t"
  197889. #elif defined(__clang__)
  197890. "adcs r4, r6\n\t"
  197891. #else
  197892. "adc r4, r6\n\t"
  197893. #endif
  197894. "stm %[r]!, {r3, r4}\n\t"
  197895. "ldm %[b]!, {r5, r6}\n\t"
  197896. "ldm %[a]!, {r3, r4}\n\t"
  197897. #ifdef WOLFSSL_KEIL
  197898. "adcs r3, r3, r5\n\t"
  197899. #elif defined(__clang__)
  197900. "adcs r3, r5\n\t"
  197901. #else
  197902. "adc r3, r5\n\t"
  197903. #endif
  197904. #ifdef WOLFSSL_KEIL
  197905. "adcs r4, r4, r6\n\t"
  197906. #elif defined(__clang__)
  197907. "adcs r4, r6\n\t"
  197908. #else
  197909. "adc r4, r6\n\t"
  197910. #endif
  197911. "stm %[r]!, {r3, r4}\n\t"
  197912. "ldm %[b]!, {r5, r6}\n\t"
  197913. "ldm %[a]!, {r3, r4}\n\t"
  197914. #ifdef WOLFSSL_KEIL
  197915. "adcs r3, r3, r5\n\t"
  197916. #elif defined(__clang__)
  197917. "adcs r3, r5\n\t"
  197918. #else
  197919. "adc r3, r5\n\t"
  197920. #endif
  197921. #ifdef WOLFSSL_KEIL
  197922. "adcs r4, r4, r6\n\t"
  197923. #elif defined(__clang__)
  197924. "adcs r4, r6\n\t"
  197925. #else
  197926. "adc r4, r6\n\t"
  197927. #endif
  197928. "stm %[r]!, {r3, r4}\n\t"
  197929. "ldm %[b]!, {r5, r6}\n\t"
  197930. "ldm %[a]!, {r3, r4}\n\t"
  197931. #ifdef WOLFSSL_KEIL
  197932. "adcs r3, r3, r5\n\t"
  197933. #elif defined(__clang__)
  197934. "adcs r3, r5\n\t"
  197935. #else
  197936. "adc r3, r5\n\t"
  197937. #endif
  197938. #ifdef WOLFSSL_KEIL
  197939. "adcs r4, r4, r6\n\t"
  197940. #elif defined(__clang__)
  197941. "adcs r4, r6\n\t"
  197942. #else
  197943. "adc r4, r6\n\t"
  197944. #endif
  197945. "stm %[r]!, {r3, r4}\n\t"
  197946. "ldm %[b]!, {r5, r6}\n\t"
  197947. "ldm %[a]!, {r3, r4}\n\t"
  197948. #ifdef WOLFSSL_KEIL
  197949. "adcs r3, r3, r5\n\t"
  197950. #elif defined(__clang__)
  197951. "adcs r3, r5\n\t"
  197952. #else
  197953. "adc r3, r5\n\t"
  197954. #endif
  197955. #ifdef WOLFSSL_KEIL
  197956. "adcs r4, r4, r6\n\t"
  197957. #elif defined(__clang__)
  197958. "adcs r4, r6\n\t"
  197959. #else
  197960. "adc r4, r6\n\t"
  197961. #endif
  197962. "stm %[r]!, {r3, r4}\n\t"
  197963. "ldm %[b]!, {r5, r6}\n\t"
  197964. "ldm %[a]!, {r3, r4}\n\t"
  197965. #ifdef WOLFSSL_KEIL
  197966. "adcs r3, r3, r5\n\t"
  197967. #elif defined(__clang__)
  197968. "adcs r3, r5\n\t"
  197969. #else
  197970. "adc r3, r5\n\t"
  197971. #endif
  197972. #ifdef WOLFSSL_KEIL
  197973. "adcs r4, r4, r6\n\t"
  197974. #elif defined(__clang__)
  197975. "adcs r4, r6\n\t"
  197976. #else
  197977. "adc r4, r6\n\t"
  197978. #endif
  197979. "stm %[r]!, {r3, r4}\n\t"
  197980. "ldm %[b]!, {r5, r6}\n\t"
  197981. "ldm %[a]!, {r3, r4}\n\t"
  197982. #ifdef WOLFSSL_KEIL
  197983. "adcs r3, r3, r5\n\t"
  197984. #elif defined(__clang__)
  197985. "adcs r3, r5\n\t"
  197986. #else
  197987. "adc r3, r5\n\t"
  197988. #endif
  197989. #ifdef WOLFSSL_KEIL
  197990. "adcs r4, r4, r6\n\t"
  197991. #elif defined(__clang__)
  197992. "adcs r4, r6\n\t"
  197993. #else
  197994. "adc r4, r6\n\t"
  197995. #endif
  197996. "stm %[r]!, {r3, r4}\n\t"
  197997. "ldm %[b]!, {r5, r6}\n\t"
  197998. "ldm %[a]!, {r3, r4}\n\t"
  197999. #ifdef WOLFSSL_KEIL
  198000. "adcs r3, r3, r5\n\t"
  198001. #elif defined(__clang__)
  198002. "adcs r3, r5\n\t"
  198003. #else
  198004. "adc r3, r5\n\t"
  198005. #endif
  198006. #ifdef WOLFSSL_KEIL
  198007. "adcs r4, r4, r6\n\t"
  198008. #elif defined(__clang__)
  198009. "adcs r4, r6\n\t"
  198010. #else
  198011. "adc r4, r6\n\t"
  198012. #endif
  198013. "stm %[r]!, {r3, r4}\n\t"
  198014. "ldm %[b]!, {r5, r6}\n\t"
  198015. "ldm %[a]!, {r3, r4}\n\t"
  198016. #ifdef WOLFSSL_KEIL
  198017. "adcs r3, r3, r5\n\t"
  198018. #elif defined(__clang__)
  198019. "adcs r3, r5\n\t"
  198020. #else
  198021. "adc r3, r5\n\t"
  198022. #endif
  198023. #ifdef WOLFSSL_KEIL
  198024. "adcs r4, r4, r6\n\t"
  198025. #elif defined(__clang__)
  198026. "adcs r4, r6\n\t"
  198027. #else
  198028. "adc r4, r6\n\t"
  198029. #endif
  198030. "stm %[r]!, {r3, r4}\n\t"
  198031. "ldm %[b]!, {r5, r6}\n\t"
  198032. "ldm %[a]!, {r3, r4}\n\t"
  198033. #ifdef WOLFSSL_KEIL
  198034. "adcs r3, r3, r5\n\t"
  198035. #elif defined(__clang__)
  198036. "adcs r3, r5\n\t"
  198037. #else
  198038. "adc r3, r5\n\t"
  198039. #endif
  198040. #ifdef WOLFSSL_KEIL
  198041. "adcs r4, r4, r6\n\t"
  198042. #elif defined(__clang__)
  198043. "adcs r4, r6\n\t"
  198044. #else
  198045. "adc r4, r6\n\t"
  198046. #endif
  198047. "stm %[r]!, {r3, r4}\n\t"
  198048. "movs %[r], #0\n\t"
  198049. #ifdef WOLFSSL_KEIL
  198050. "adcs %[r], %[r], %[r]\n\t"
  198051. #elif defined(__clang__)
  198052. "adcs %[r], %[r]\n\t"
  198053. #else
  198054. "adc %[r], %[r]\n\t"
  198055. #endif
  198056. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  198057. :
  198058. : "memory", "r3", "r4", "r5", "r6"
  198059. );
  198060. return (uint32_t)(size_t)r;
  198061. }
  198062. /* AND m into each word of a and store in r.
  198063. *
  198064. * r A single precision integer.
  198065. * a A single precision integer.
  198066. * m Mask to AND against each digit.
  198067. */
  198068. static void sp_1024_mask_16(sp_digit* r, const sp_digit* a, sp_digit m)
  198069. {
  198070. #ifdef WOLFSSL_SP_SMALL
  198071. int i;
  198072. for (i=0; i<16; i++) {
  198073. r[i] = a[i] & m;
  198074. }
  198075. #else
  198076. int i;
  198077. for (i = 0; i < 16; i += 8) {
  198078. r[i+0] = a[i+0] & m;
  198079. r[i+1] = a[i+1] & m;
  198080. r[i+2] = a[i+2] & m;
  198081. r[i+3] = a[i+3] & m;
  198082. r[i+4] = a[i+4] & m;
  198083. r[i+5] = a[i+5] & m;
  198084. r[i+6] = a[i+6] & m;
  198085. r[i+7] = a[i+7] & m;
  198086. }
  198087. #endif
  198088. }
  198089. /* Multiply a and b into r. (r = a * b)
  198090. *
  198091. * r A single precision integer.
  198092. * a A single precision integer.
  198093. * b A single precision integer.
  198094. */
  198095. SP_NOINLINE static void sp_1024_mul_32(sp_digit* r, const sp_digit* a,
  198096. const sp_digit* b)
  198097. {
  198098. sp_digit* z0 = r;
  198099. sp_digit z1[32];
  198100. sp_digit a1[16];
  198101. sp_digit b1[16];
  198102. sp_digit* z2 = r + 32;
  198103. sp_digit u;
  198104. sp_digit ca;
  198105. sp_digit cb;
  198106. ca = sp_1024_add_16(a1, a, &a[16]);
  198107. cb = sp_1024_add_16(b1, b, &b[16]);
  198108. u = ca & cb;
  198109. sp_1024_mul_16(z2, &a[16], &b[16]);
  198110. sp_1024_mul_16(z0, a, b);
  198111. sp_1024_mul_16(z1, a1, b1);
  198112. u += sp_1024_sub_in_place_32(z1, z0);
  198113. u += sp_1024_sub_in_place_32(z1, z2);
  198114. sp_1024_mask_16(a1, a1, 0 - cb);
  198115. u += sp_1024_add_16(z1 + 16, z1 + 16, a1);
  198116. sp_1024_mask_16(b1, b1, 0 - ca);
  198117. u += sp_1024_add_16(z1 + 16, z1 + 16, b1);
  198118. u += sp_1024_add_32(r + 16, r + 16, z1);
  198119. (void)sp_1024_add_word_16(r + 48, r + 48, u);
  198120. }
  198121. /* Sub b from a into r. (r = a - b)
  198122. *
  198123. * r A single precision integer.
  198124. * a A single precision integer.
  198125. * b A single precision integer.
  198126. */
  198127. SP_NOINLINE static sp_digit sp_1024_sub_16(sp_digit* r, const sp_digit* a,
  198128. const sp_digit* b)
  198129. {
  198130. __asm__ __volatile__ (
  198131. "ldm %[b]!, {r5, r6}\n\t"
  198132. "ldm %[a]!, {r3, r4}\n\t"
  198133. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198134. "subs r3, r3, r5\n\t"
  198135. #else
  198136. "sub r3, r3, r5\n\t"
  198137. #endif
  198138. #ifdef WOLFSSL_KEIL
  198139. "sbcs r4, r4, r6\n\t"
  198140. #elif defined(__clang__)
  198141. "sbcs r4, r6\n\t"
  198142. #else
  198143. "sbc r4, r6\n\t"
  198144. #endif
  198145. "stm %[r]!, {r3, r4}\n\t"
  198146. "ldm %[b]!, {r5, r6}\n\t"
  198147. "ldm %[a]!, {r3, r4}\n\t"
  198148. #ifdef WOLFSSL_KEIL
  198149. "sbcs r3, r3, r5\n\t"
  198150. #elif defined(__clang__)
  198151. "sbcs r3, r5\n\t"
  198152. #else
  198153. "sbc r3, r5\n\t"
  198154. #endif
  198155. #ifdef WOLFSSL_KEIL
  198156. "sbcs r4, r4, r6\n\t"
  198157. #elif defined(__clang__)
  198158. "sbcs r4, r6\n\t"
  198159. #else
  198160. "sbc r4, r6\n\t"
  198161. #endif
  198162. "stm %[r]!, {r3, r4}\n\t"
  198163. "ldm %[b]!, {r5, r6}\n\t"
  198164. "ldm %[a]!, {r3, r4}\n\t"
  198165. #ifdef WOLFSSL_KEIL
  198166. "sbcs r3, r3, r5\n\t"
  198167. #elif defined(__clang__)
  198168. "sbcs r3, r5\n\t"
  198169. #else
  198170. "sbc r3, r5\n\t"
  198171. #endif
  198172. #ifdef WOLFSSL_KEIL
  198173. "sbcs r4, r4, r6\n\t"
  198174. #elif defined(__clang__)
  198175. "sbcs r4, r6\n\t"
  198176. #else
  198177. "sbc r4, r6\n\t"
  198178. #endif
  198179. "stm %[r]!, {r3, r4}\n\t"
  198180. "ldm %[b]!, {r5, r6}\n\t"
  198181. "ldm %[a]!, {r3, r4}\n\t"
  198182. #ifdef WOLFSSL_KEIL
  198183. "sbcs r3, r3, r5\n\t"
  198184. #elif defined(__clang__)
  198185. "sbcs r3, r5\n\t"
  198186. #else
  198187. "sbc r3, r5\n\t"
  198188. #endif
  198189. #ifdef WOLFSSL_KEIL
  198190. "sbcs r4, r4, r6\n\t"
  198191. #elif defined(__clang__)
  198192. "sbcs r4, r6\n\t"
  198193. #else
  198194. "sbc r4, r6\n\t"
  198195. #endif
  198196. "stm %[r]!, {r3, r4}\n\t"
  198197. "ldm %[b]!, {r5, r6}\n\t"
  198198. "ldm %[a]!, {r3, r4}\n\t"
  198199. #ifdef WOLFSSL_KEIL
  198200. "sbcs r3, r3, r5\n\t"
  198201. #elif defined(__clang__)
  198202. "sbcs r3, r5\n\t"
  198203. #else
  198204. "sbc r3, r5\n\t"
  198205. #endif
  198206. #ifdef WOLFSSL_KEIL
  198207. "sbcs r4, r4, r6\n\t"
  198208. #elif defined(__clang__)
  198209. "sbcs r4, r6\n\t"
  198210. #else
  198211. "sbc r4, r6\n\t"
  198212. #endif
  198213. "stm %[r]!, {r3, r4}\n\t"
  198214. "ldm %[b]!, {r5, r6}\n\t"
  198215. "ldm %[a]!, {r3, r4}\n\t"
  198216. #ifdef WOLFSSL_KEIL
  198217. "sbcs r3, r3, r5\n\t"
  198218. #elif defined(__clang__)
  198219. "sbcs r3, r5\n\t"
  198220. #else
  198221. "sbc r3, r5\n\t"
  198222. #endif
  198223. #ifdef WOLFSSL_KEIL
  198224. "sbcs r4, r4, r6\n\t"
  198225. #elif defined(__clang__)
  198226. "sbcs r4, r6\n\t"
  198227. #else
  198228. "sbc r4, r6\n\t"
  198229. #endif
  198230. "stm %[r]!, {r3, r4}\n\t"
  198231. "ldm %[b]!, {r5, r6}\n\t"
  198232. "ldm %[a]!, {r3, r4}\n\t"
  198233. #ifdef WOLFSSL_KEIL
  198234. "sbcs r3, r3, r5\n\t"
  198235. #elif defined(__clang__)
  198236. "sbcs r3, r5\n\t"
  198237. #else
  198238. "sbc r3, r5\n\t"
  198239. #endif
  198240. #ifdef WOLFSSL_KEIL
  198241. "sbcs r4, r4, r6\n\t"
  198242. #elif defined(__clang__)
  198243. "sbcs r4, r6\n\t"
  198244. #else
  198245. "sbc r4, r6\n\t"
  198246. #endif
  198247. "stm %[r]!, {r3, r4}\n\t"
  198248. "ldm %[b]!, {r5, r6}\n\t"
  198249. "ldm %[a]!, {r3, r4}\n\t"
  198250. #ifdef WOLFSSL_KEIL
  198251. "sbcs r3, r3, r5\n\t"
  198252. #elif defined(__clang__)
  198253. "sbcs r3, r5\n\t"
  198254. #else
  198255. "sbc r3, r5\n\t"
  198256. #endif
  198257. #ifdef WOLFSSL_KEIL
  198258. "sbcs r4, r4, r6\n\t"
  198259. #elif defined(__clang__)
  198260. "sbcs r4, r6\n\t"
  198261. #else
  198262. "sbc r4, r6\n\t"
  198263. #endif
  198264. "stm %[r]!, {r3, r4}\n\t"
  198265. #ifdef WOLFSSL_KEIL
  198266. "sbcs %[r], %[r], %[r]\n\t"
  198267. #elif defined(__clang__)
  198268. "sbcs %[r], %[r]\n\t"
  198269. #else
  198270. "sbc %[r], %[r]\n\t"
  198271. #endif
  198272. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  198273. :
  198274. : "memory", "r3", "r4", "r5", "r6"
  198275. );
  198276. return (uint32_t)(size_t)r;
  198277. }
  198278. /* Square a and put result in r. (r = a * a)
  198279. *
  198280. * r A single precision integer.
  198281. * a A single precision integer.
  198282. */
  198283. SP_NOINLINE static void sp_1024_sqr_32(sp_digit* r, const sp_digit* a)
  198284. {
  198285. sp_digit* z0 = r;
  198286. sp_digit* z2 = r + 32;
  198287. sp_digit z1[32];
  198288. sp_digit* a1 = z1;
  198289. sp_digit* zero = z1 + 16;
  198290. sp_digit u;
  198291. sp_digit mask;
  198292. sp_digit* p1;
  198293. sp_digit* p2;
  198294. XMEMSET(zero, 0, sizeof(sp_digit) * 16);
  198295. mask = sp_1024_sub_16(a1, a, &a[16]);
  198296. p1 = (sp_digit*)(((sp_digit)zero & mask ) | ((sp_digit)a1 & (~mask)));
  198297. p2 = (sp_digit*)(((sp_digit)zero & (~mask)) | ((sp_digit)a1 & mask ));
  198298. (void)sp_1024_sub_16(a1, p1, p2);
  198299. sp_1024_sqr_16(z2, &a[16]);
  198300. sp_1024_sqr_16(z0, a);
  198301. sp_1024_sqr_16(z1, a1);
  198302. u = 0;
  198303. u -= sp_1024_sub_in_place_32(z1, z2);
  198304. u -= sp_1024_sub_in_place_32(z1, z0);
  198305. u += sp_1024_sub_in_place_32(r + 16, z1);
  198306. sp_1024_add_word_16(r + 48, r + 48, u);
  198307. }
  198308. #else
  198309. /* Multiply a and b into r. (r = a * b)
  198310. *
  198311. * r A single precision integer.
  198312. * a A single precision integer.
  198313. * b A single precision integer.
  198314. */
  198315. SP_NOINLINE static void sp_1024_mul_32(sp_digit* r, const sp_digit* a,
  198316. const sp_digit* b)
  198317. {
  198318. sp_digit t[32 * 2];
  198319. sp_digit* tmp = t;
  198320. __asm__ __volatile__ (
  198321. "movs r3, #0\n\t"
  198322. "movs r4, #0\n\t"
  198323. "mov r8, r3\n\t"
  198324. "mov r11, %[tmp]\n\t"
  198325. "mov r9, %[a]\n\t"
  198326. "mov r10, %[b]\n\t"
  198327. "movs r6, #0x80\n\t"
  198328. "add r6, r6, r9\n\t"
  198329. "mov r12, r6\n\t"
  198330. "\n"
  198331. "L_sp_1024_mul_32_words_%=:\n\t"
  198332. "movs %[tmp], #0\n\t"
  198333. "movs r5, #0\n\t"
  198334. "movs r6, #0x7c\n\t"
  198335. "mov %[a], r8\n\t"
  198336. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198337. "subs %[a], %[a], r6\n\t"
  198338. #else
  198339. "sub %[a], %[a], r6\n\t"
  198340. #endif
  198341. #ifdef WOLFSSL_KEIL
  198342. "sbcs r6, r6, r6\n\t"
  198343. #elif defined(__clang__)
  198344. "sbcs r6, r6\n\t"
  198345. #else
  198346. "sbc r6, r6\n\t"
  198347. #endif
  198348. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198349. "mvns r6, r6\n\t"
  198350. #else
  198351. "mvn r6, r6\n\t"
  198352. #endif
  198353. #ifdef WOLFSSL_KEIL
  198354. "ands %[a], %[a], r6\n\t"
  198355. #elif defined(__clang__)
  198356. "ands %[a], r6\n\t"
  198357. #else
  198358. "and %[a], r6\n\t"
  198359. #endif
  198360. "mov %[b], r8\n\t"
  198361. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198362. "subs %[b], %[b], %[a]\n\t"
  198363. #else
  198364. "sub %[b], %[b], %[a]\n\t"
  198365. #endif
  198366. "add %[a], %[a], r9\n\t"
  198367. "add %[b], %[b], r10\n\t"
  198368. "\n"
  198369. "L_sp_1024_mul_32_mul_%=:\n\t"
  198370. "# Multiply Start\n\t"
  198371. "ldrh r6, [%[a]]\n\t"
  198372. "ldrh r7, [%[b]]\n\t"
  198373. #ifdef WOLFSSL_KEIL
  198374. "muls r7, r6, r7\n\t"
  198375. #elif defined(__clang__)
  198376. "muls r7, r6\n\t"
  198377. #else
  198378. "mul r7, r6\n\t"
  198379. #endif
  198380. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198381. "adds r3, r3, r7\n\t"
  198382. #else
  198383. "add r3, r3, r7\n\t"
  198384. #endif
  198385. #ifdef WOLFSSL_KEIL
  198386. "adcs r4, r4, %[tmp]\n\t"
  198387. #elif defined(__clang__)
  198388. "adcs r4, %[tmp]\n\t"
  198389. #else
  198390. "adc r4, %[tmp]\n\t"
  198391. #endif
  198392. #ifdef WOLFSSL_KEIL
  198393. "adcs r5, r5, %[tmp]\n\t"
  198394. #elif defined(__clang__)
  198395. "adcs r5, %[tmp]\n\t"
  198396. #else
  198397. "adc r5, %[tmp]\n\t"
  198398. #endif
  198399. "ldr r7, [%[b]]\n\t"
  198400. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198401. "lsrs r7, r7, #16\n\t"
  198402. #else
  198403. "lsr r7, r7, #16\n\t"
  198404. #endif
  198405. #ifdef WOLFSSL_KEIL
  198406. "muls r6, r7, r6\n\t"
  198407. #elif defined(__clang__)
  198408. "muls r6, r7\n\t"
  198409. #else
  198410. "mul r6, r7\n\t"
  198411. #endif
  198412. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198413. "lsrs r7, r6, #16\n\t"
  198414. #else
  198415. "lsr r7, r6, #16\n\t"
  198416. #endif
  198417. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198418. "lsls r6, r6, #16\n\t"
  198419. #else
  198420. "lsl r6, r6, #16\n\t"
  198421. #endif
  198422. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198423. "adds r3, r3, r6\n\t"
  198424. #else
  198425. "add r3, r3, r6\n\t"
  198426. #endif
  198427. #ifdef WOLFSSL_KEIL
  198428. "adcs r4, r4, r7\n\t"
  198429. #elif defined(__clang__)
  198430. "adcs r4, r7\n\t"
  198431. #else
  198432. "adc r4, r7\n\t"
  198433. #endif
  198434. #ifdef WOLFSSL_KEIL
  198435. "adcs r5, r5, %[tmp]\n\t"
  198436. #elif defined(__clang__)
  198437. "adcs r5, %[tmp]\n\t"
  198438. #else
  198439. "adc r5, %[tmp]\n\t"
  198440. #endif
  198441. "ldr r6, [%[a]]\n\t"
  198442. "ldr r7, [%[b]]\n\t"
  198443. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198444. "lsrs r6, r6, #16\n\t"
  198445. #else
  198446. "lsr r6, r6, #16\n\t"
  198447. #endif
  198448. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198449. "lsrs r7, r7, #16\n\t"
  198450. #else
  198451. "lsr r7, r7, #16\n\t"
  198452. #endif
  198453. #ifdef WOLFSSL_KEIL
  198454. "muls r7, r6, r7\n\t"
  198455. #elif defined(__clang__)
  198456. "muls r7, r6\n\t"
  198457. #else
  198458. "mul r7, r6\n\t"
  198459. #endif
  198460. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198461. "adds r4, r4, r7\n\t"
  198462. #else
  198463. "add r4, r4, r7\n\t"
  198464. #endif
  198465. #ifdef WOLFSSL_KEIL
  198466. "adcs r5, r5, %[tmp]\n\t"
  198467. #elif defined(__clang__)
  198468. "adcs r5, %[tmp]\n\t"
  198469. #else
  198470. "adc r5, %[tmp]\n\t"
  198471. #endif
  198472. "ldrh r7, [%[b]]\n\t"
  198473. #ifdef WOLFSSL_KEIL
  198474. "muls r6, r7, r6\n\t"
  198475. #elif defined(__clang__)
  198476. "muls r6, r7\n\t"
  198477. #else
  198478. "mul r6, r7\n\t"
  198479. #endif
  198480. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198481. "lsrs r7, r6, #16\n\t"
  198482. #else
  198483. "lsr r7, r6, #16\n\t"
  198484. #endif
  198485. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198486. "lsls r6, r6, #16\n\t"
  198487. #else
  198488. "lsl r6, r6, #16\n\t"
  198489. #endif
  198490. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198491. "adds r3, r3, r6\n\t"
  198492. #else
  198493. "add r3, r3, r6\n\t"
  198494. #endif
  198495. #ifdef WOLFSSL_KEIL
  198496. "adcs r4, r4, r7\n\t"
  198497. #elif defined(__clang__)
  198498. "adcs r4, r7\n\t"
  198499. #else
  198500. "adc r4, r7\n\t"
  198501. #endif
  198502. #ifdef WOLFSSL_KEIL
  198503. "adcs r5, r5, %[tmp]\n\t"
  198504. #elif defined(__clang__)
  198505. "adcs r5, %[tmp]\n\t"
  198506. #else
  198507. "adc r5, %[tmp]\n\t"
  198508. #endif
  198509. "# Multiply Done\n\t"
  198510. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198511. "adds %[a], %[a], #4\n\t"
  198512. #else
  198513. "add %[a], %[a], #4\n\t"
  198514. #endif
  198515. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198516. "subs %[b], %[b], #4\n\t"
  198517. #else
  198518. "sub %[b], %[b], #4\n\t"
  198519. #endif
  198520. "cmp %[a], r12\n\t"
  198521. "beq L_sp_1024_mul_32_done_mul_%=\n\t"
  198522. "mov r6, r8\n\t"
  198523. "add r6, r6, r9\n\t"
  198524. "cmp %[a], r6\n\t"
  198525. "ble L_sp_1024_mul_32_mul_%=\n\t"
  198526. "\n"
  198527. "L_sp_1024_mul_32_done_mul_%=:\n\t"
  198528. "mov %[tmp], r11\n\t"
  198529. "mov r7, r8\n\t"
  198530. "str r3, [%[tmp], r7]\n\t"
  198531. "movs r3, r4\n\t"
  198532. "movs r4, r5\n\t"
  198533. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198534. "adds r7, r7, #4\n\t"
  198535. #else
  198536. "add r7, r7, #4\n\t"
  198537. #endif
  198538. "mov r8, r7\n\t"
  198539. "movs r6, #0xf8\n\t"
  198540. "cmp r7, r6\n\t"
  198541. "ble L_sp_1024_mul_32_words_%=\n\t"
  198542. "str r3, [%[tmp], r7]\n\t"
  198543. "mov %[a], r9\n\t"
  198544. "mov %[b], r10\n\t"
  198545. : [a] "+l" (a), [b] "+l" (b), [tmp] "+l" (tmp)
  198546. :
  198547. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  198548. );
  198549. XMEMCPY(r, t, sizeof(t));
  198550. }
  198551. /* Square a and put result in r. (r = a * a)
  198552. *
  198553. * r A single precision integer.
  198554. * a A single precision integer.
  198555. */
  198556. SP_NOINLINE static void sp_1024_sqr_32(sp_digit* r, const sp_digit* a)
  198557. {
  198558. __asm__ __volatile__ (
  198559. "movs r3, #0\n\t"
  198560. "movs r4, #0\n\t"
  198561. "movs r5, #0\n\t"
  198562. "mov r8, r3\n\t"
  198563. "mov r11, %[r]\n\t"
  198564. "movs r6, #0xff\n\t"
  198565. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198566. "adds r6, r6, #1\n\t"
  198567. #else
  198568. "add r6, r6, #1\n\t"
  198569. #endif
  198570. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198571. "negs r6, r6\n\t"
  198572. #else
  198573. "neg r6, r6\n\t"
  198574. #endif
  198575. "add sp, sp, r6\n\t"
  198576. "mov r10, sp\n\t"
  198577. "mov r9, %[a]\n\t"
  198578. "\n"
  198579. "L_sp_1024_sqr_32_words_%=:\n\t"
  198580. "movs %[r], #0\n\t"
  198581. "movs r6, #0x7c\n\t"
  198582. "mov %[a], r8\n\t"
  198583. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198584. "subs %[a], %[a], r6\n\t"
  198585. #else
  198586. "sub %[a], %[a], r6\n\t"
  198587. #endif
  198588. #ifdef WOLFSSL_KEIL
  198589. "sbcs r6, r6, r6\n\t"
  198590. #elif defined(__clang__)
  198591. "sbcs r6, r6\n\t"
  198592. #else
  198593. "sbc r6, r6\n\t"
  198594. #endif
  198595. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198596. "mvns r6, r6\n\t"
  198597. #else
  198598. "mvn r6, r6\n\t"
  198599. #endif
  198600. #ifdef WOLFSSL_KEIL
  198601. "ands %[a], %[a], r6\n\t"
  198602. #elif defined(__clang__)
  198603. "ands %[a], r6\n\t"
  198604. #else
  198605. "and %[a], r6\n\t"
  198606. #endif
  198607. "mov r2, r8\n\t"
  198608. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198609. "subs r2, r2, %[a]\n\t"
  198610. #else
  198611. "sub r2, r2, %[a]\n\t"
  198612. #endif
  198613. "add %[a], %[a], r9\n\t"
  198614. "add r2, r2, r9\n\t"
  198615. "\n"
  198616. "L_sp_1024_sqr_32_mul_%=:\n\t"
  198617. "cmp r2, %[a]\n\t"
  198618. "beq L_sp_1024_sqr_32_sqr_%=\n\t"
  198619. "# Multiply * 2: Start\n\t"
  198620. "ldrh r6, [%[a]]\n\t"
  198621. "ldrh r7, [r2]\n\t"
  198622. #ifdef WOLFSSL_KEIL
  198623. "muls r7, r6, r7\n\t"
  198624. #elif defined(__clang__)
  198625. "muls r7, r6\n\t"
  198626. #else
  198627. "mul r7, r6\n\t"
  198628. #endif
  198629. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198630. "adds r3, r3, r7\n\t"
  198631. #else
  198632. "add r3, r3, r7\n\t"
  198633. #endif
  198634. #ifdef WOLFSSL_KEIL
  198635. "adcs r4, r4, %[r]\n\t"
  198636. #elif defined(__clang__)
  198637. "adcs r4, %[r]\n\t"
  198638. #else
  198639. "adc r4, %[r]\n\t"
  198640. #endif
  198641. #ifdef WOLFSSL_KEIL
  198642. "adcs r5, r5, %[r]\n\t"
  198643. #elif defined(__clang__)
  198644. "adcs r5, %[r]\n\t"
  198645. #else
  198646. "adc r5, %[r]\n\t"
  198647. #endif
  198648. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198649. "adds r3, r3, r7\n\t"
  198650. #else
  198651. "add r3, r3, r7\n\t"
  198652. #endif
  198653. #ifdef WOLFSSL_KEIL
  198654. "adcs r4, r4, %[r]\n\t"
  198655. #elif defined(__clang__)
  198656. "adcs r4, %[r]\n\t"
  198657. #else
  198658. "adc r4, %[r]\n\t"
  198659. #endif
  198660. #ifdef WOLFSSL_KEIL
  198661. "adcs r5, r5, %[r]\n\t"
  198662. #elif defined(__clang__)
  198663. "adcs r5, %[r]\n\t"
  198664. #else
  198665. "adc r5, %[r]\n\t"
  198666. #endif
  198667. "ldr r7, [r2]\n\t"
  198668. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198669. "lsrs r7, r7, #16\n\t"
  198670. #else
  198671. "lsr r7, r7, #16\n\t"
  198672. #endif
  198673. #ifdef WOLFSSL_KEIL
  198674. "muls r6, r7, r6\n\t"
  198675. #elif defined(__clang__)
  198676. "muls r6, r7\n\t"
  198677. #else
  198678. "mul r6, r7\n\t"
  198679. #endif
  198680. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198681. "lsrs r7, r6, #16\n\t"
  198682. #else
  198683. "lsr r7, r6, #16\n\t"
  198684. #endif
  198685. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198686. "lsls r6, r6, #16\n\t"
  198687. #else
  198688. "lsl r6, r6, #16\n\t"
  198689. #endif
  198690. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198691. "adds r3, r3, r6\n\t"
  198692. #else
  198693. "add r3, r3, r6\n\t"
  198694. #endif
  198695. #ifdef WOLFSSL_KEIL
  198696. "adcs r4, r4, r7\n\t"
  198697. #elif defined(__clang__)
  198698. "adcs r4, r7\n\t"
  198699. #else
  198700. "adc r4, r7\n\t"
  198701. #endif
  198702. #ifdef WOLFSSL_KEIL
  198703. "adcs r5, r5, %[r]\n\t"
  198704. #elif defined(__clang__)
  198705. "adcs r5, %[r]\n\t"
  198706. #else
  198707. "adc r5, %[r]\n\t"
  198708. #endif
  198709. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198710. "adds r3, r3, r6\n\t"
  198711. #else
  198712. "add r3, r3, r6\n\t"
  198713. #endif
  198714. #ifdef WOLFSSL_KEIL
  198715. "adcs r4, r4, r7\n\t"
  198716. #elif defined(__clang__)
  198717. "adcs r4, r7\n\t"
  198718. #else
  198719. "adc r4, r7\n\t"
  198720. #endif
  198721. #ifdef WOLFSSL_KEIL
  198722. "adcs r5, r5, %[r]\n\t"
  198723. #elif defined(__clang__)
  198724. "adcs r5, %[r]\n\t"
  198725. #else
  198726. "adc r5, %[r]\n\t"
  198727. #endif
  198728. "ldr r6, [%[a]]\n\t"
  198729. "ldr r7, [r2]\n\t"
  198730. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198731. "lsrs r6, r6, #16\n\t"
  198732. #else
  198733. "lsr r6, r6, #16\n\t"
  198734. #endif
  198735. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198736. "lsrs r7, r7, #16\n\t"
  198737. #else
  198738. "lsr r7, r7, #16\n\t"
  198739. #endif
  198740. #ifdef WOLFSSL_KEIL
  198741. "muls r7, r6, r7\n\t"
  198742. #elif defined(__clang__)
  198743. "muls r7, r6\n\t"
  198744. #else
  198745. "mul r7, r6\n\t"
  198746. #endif
  198747. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198748. "adds r4, r4, r7\n\t"
  198749. #else
  198750. "add r4, r4, r7\n\t"
  198751. #endif
  198752. #ifdef WOLFSSL_KEIL
  198753. "adcs r5, r5, %[r]\n\t"
  198754. #elif defined(__clang__)
  198755. "adcs r5, %[r]\n\t"
  198756. #else
  198757. "adc r5, %[r]\n\t"
  198758. #endif
  198759. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198760. "adds r4, r4, r7\n\t"
  198761. #else
  198762. "add r4, r4, r7\n\t"
  198763. #endif
  198764. #ifdef WOLFSSL_KEIL
  198765. "adcs r5, r5, %[r]\n\t"
  198766. #elif defined(__clang__)
  198767. "adcs r5, %[r]\n\t"
  198768. #else
  198769. "adc r5, %[r]\n\t"
  198770. #endif
  198771. "ldrh r7, [r2]\n\t"
  198772. #ifdef WOLFSSL_KEIL
  198773. "muls r6, r7, r6\n\t"
  198774. #elif defined(__clang__)
  198775. "muls r6, r7\n\t"
  198776. #else
  198777. "mul r6, r7\n\t"
  198778. #endif
  198779. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198780. "lsrs r7, r6, #16\n\t"
  198781. #else
  198782. "lsr r7, r6, #16\n\t"
  198783. #endif
  198784. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198785. "lsls r6, r6, #16\n\t"
  198786. #else
  198787. "lsl r6, r6, #16\n\t"
  198788. #endif
  198789. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198790. "adds r3, r3, r6\n\t"
  198791. #else
  198792. "add r3, r3, r6\n\t"
  198793. #endif
  198794. #ifdef WOLFSSL_KEIL
  198795. "adcs r4, r4, r7\n\t"
  198796. #elif defined(__clang__)
  198797. "adcs r4, r7\n\t"
  198798. #else
  198799. "adc r4, r7\n\t"
  198800. #endif
  198801. #ifdef WOLFSSL_KEIL
  198802. "adcs r5, r5, %[r]\n\t"
  198803. #elif defined(__clang__)
  198804. "adcs r5, %[r]\n\t"
  198805. #else
  198806. "adc r5, %[r]\n\t"
  198807. #endif
  198808. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198809. "adds r3, r3, r6\n\t"
  198810. #else
  198811. "add r3, r3, r6\n\t"
  198812. #endif
  198813. #ifdef WOLFSSL_KEIL
  198814. "adcs r4, r4, r7\n\t"
  198815. #elif defined(__clang__)
  198816. "adcs r4, r7\n\t"
  198817. #else
  198818. "adc r4, r7\n\t"
  198819. #endif
  198820. #ifdef WOLFSSL_KEIL
  198821. "adcs r5, r5, %[r]\n\t"
  198822. #elif defined(__clang__)
  198823. "adcs r5, %[r]\n\t"
  198824. #else
  198825. "adc r5, %[r]\n\t"
  198826. #endif
  198827. "# Multiply * 2: Done\n\t"
  198828. "bal L_sp_1024_sqr_32_done_sqr_%=\n\t"
  198829. "\n"
  198830. "L_sp_1024_sqr_32_sqr_%=:\n\t"
  198831. "mov r12, r2\n\t"
  198832. "ldr r2, [%[a]]\n\t"
  198833. "# Square: Start\n\t"
  198834. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198835. "lsrs r7, r2, #16\n\t"
  198836. #else
  198837. "lsr r7, r2, #16\n\t"
  198838. #endif
  198839. "uxth r6, r2\n\t"
  198840. #ifdef WOLFSSL_KEIL
  198841. "muls r6, r6, r6\n\t"
  198842. #elif defined(__clang__)
  198843. "muls r6, r6\n\t"
  198844. #else
  198845. "mul r6, r6\n\t"
  198846. #endif
  198847. #ifdef WOLFSSL_KEIL
  198848. "muls r7, r7, r7\n\t"
  198849. #elif defined(__clang__)
  198850. "muls r7, r7\n\t"
  198851. #else
  198852. "mul r7, r7\n\t"
  198853. #endif
  198854. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198855. "adds r3, r3, r6\n\t"
  198856. #else
  198857. "add r3, r3, r6\n\t"
  198858. #endif
  198859. #ifdef WOLFSSL_KEIL
  198860. "adcs r4, r4, r7\n\t"
  198861. #elif defined(__clang__)
  198862. "adcs r4, r7\n\t"
  198863. #else
  198864. "adc r4, r7\n\t"
  198865. #endif
  198866. #ifdef WOLFSSL_KEIL
  198867. "adcs r5, r5, %[r]\n\t"
  198868. #elif defined(__clang__)
  198869. "adcs r5, %[r]\n\t"
  198870. #else
  198871. "adc r5, %[r]\n\t"
  198872. #endif
  198873. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198874. "lsrs r7, r2, #16\n\t"
  198875. #else
  198876. "lsr r7, r2, #16\n\t"
  198877. #endif
  198878. "uxth r6, r2\n\t"
  198879. #ifdef WOLFSSL_KEIL
  198880. "muls r6, r7, r6\n\t"
  198881. #elif defined(__clang__)
  198882. "muls r6, r7\n\t"
  198883. #else
  198884. "mul r6, r7\n\t"
  198885. #endif
  198886. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198887. "lsrs r7, r6, #15\n\t"
  198888. #else
  198889. "lsr r7, r6, #15\n\t"
  198890. #endif
  198891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198892. "lsls r6, r6, #17\n\t"
  198893. #else
  198894. "lsl r6, r6, #17\n\t"
  198895. #endif
  198896. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198897. "adds r3, r3, r6\n\t"
  198898. #else
  198899. "add r3, r3, r6\n\t"
  198900. #endif
  198901. #ifdef WOLFSSL_KEIL
  198902. "adcs r4, r4, r7\n\t"
  198903. #elif defined(__clang__)
  198904. "adcs r4, r7\n\t"
  198905. #else
  198906. "adc r4, r7\n\t"
  198907. #endif
  198908. #ifdef WOLFSSL_KEIL
  198909. "adcs r5, r5, %[r]\n\t"
  198910. #elif defined(__clang__)
  198911. "adcs r5, %[r]\n\t"
  198912. #else
  198913. "adc r5, %[r]\n\t"
  198914. #endif
  198915. "# Square: Done\n\t"
  198916. "mov r2, r12\n\t"
  198917. "\n"
  198918. "L_sp_1024_sqr_32_done_sqr_%=:\n\t"
  198919. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198920. "adds %[a], %[a], #4\n\t"
  198921. #else
  198922. "add %[a], %[a], #4\n\t"
  198923. #endif
  198924. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198925. "subs r2, r2, #4\n\t"
  198926. #else
  198927. "sub r2, r2, #4\n\t"
  198928. #endif
  198929. "movs r6, #0x80\n\t"
  198930. "add r6, r6, r9\n\t"
  198931. "cmp %[a], r6\n\t"
  198932. "beq L_sp_1024_sqr_32_done_mul_%=\n\t"
  198933. "cmp %[a], r2\n\t"
  198934. "bgt L_sp_1024_sqr_32_done_mul_%=\n\t"
  198935. "mov r7, r8\n\t"
  198936. "add r7, r7, r9\n\t"
  198937. "cmp %[a], r7\n\t"
  198938. "ble L_sp_1024_sqr_32_mul_%=\n\t"
  198939. "\n"
  198940. "L_sp_1024_sqr_32_done_mul_%=:\n\t"
  198941. "mov %[r], r10\n\t"
  198942. "mov r7, r8\n\t"
  198943. "str r3, [%[r], r7]\n\t"
  198944. "movs r3, r4\n\t"
  198945. "movs r4, r5\n\t"
  198946. "movs r5, #0\n\t"
  198947. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198948. "adds r7, r7, #4\n\t"
  198949. #else
  198950. "add r7, r7, #4\n\t"
  198951. #endif
  198952. "mov r8, r7\n\t"
  198953. "movs r6, #0xf8\n\t"
  198954. "cmp r7, r6\n\t"
  198955. "ble L_sp_1024_sqr_32_words_%=\n\t"
  198956. "mov %[a], r9\n\t"
  198957. "str r3, [%[r], r7]\n\t"
  198958. "mov %[r], r11\n\t"
  198959. "mov %[a], r10\n\t"
  198960. "movs r3, #0xfc\n\t"
  198961. "\n"
  198962. "L_sp_1024_sqr_32_store_%=:\n\t"
  198963. "ldr r6, [%[a], r3]\n\t"
  198964. "str r6, [%[r], r3]\n\t"
  198965. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198966. "subs r3, r3, #4\n\t"
  198967. #else
  198968. "sub r3, r3, #4\n\t"
  198969. #endif
  198970. "bge L_sp_1024_sqr_32_store_%=\n\t"
  198971. "movs r6, #0xff\n\t"
  198972. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198973. "adds r6, r6, #1\n\t"
  198974. #else
  198975. "add r6, r6, #1\n\t"
  198976. #endif
  198977. "add sp, sp, r6\n\t"
  198978. : [r] "+l" (r), [a] "+l" (a)
  198979. :
  198980. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  198981. );
  198982. }
  198983. #endif /* !WOLFSSL_SP_SMALL */
  198984. /* The modulus (prime) of the curve P1024. */
  198985. static const sp_digit p1024_mod[32] = {
  198986. 0xfea85feb,0x666d807a,0xac7ace87,0x80c5df10,0x89857db0,0xfce3e823,
  198987. 0x56971f1f,0x9f94d6af,0x1c3c09aa,0xa7cf3c52,0x31852a82,0xb6aff4a8,
  198988. 0x65681ce1,0x512ac5cd,0x326b4cd4,0xe26c6487,0xa666a6d0,0x356d27f4,
  198989. 0xf7c88a19,0xe791b39f,0x31a59cb0,0x228730d5,0xe2fc0f1b,0xf40aab27,
  198990. 0xb3e01a2e,0xbe9ae358,0x9cb48261,0x416c0ce1,0xdad0657a,0x65c61198,
  198991. 0x0a563fda,0x997abb1f
  198992. };
  198993. /* The Montgomery normalizer for modulus of the curve P1024. */
  198994. static const sp_digit p1024_norm_mod[32] = {
  198995. 0x0157a015,0x99927f85,0x53853178,0x7f3a20ef,0x767a824f,0x031c17dc,
  198996. 0xa968e0e0,0x606b2950,0xe3c3f655,0x5830c3ad,0xce7ad57d,0x49500b57,
  198997. 0x9a97e31e,0xaed53a32,0xcd94b32b,0x1d939b78,0x5999592f,0xca92d80b,
  198998. 0x083775e6,0x186e4c60,0xce5a634f,0xdd78cf2a,0x1d03f0e4,0x0bf554d8,
  198999. 0x4c1fe5d1,0x41651ca7,0x634b7d9e,0xbe93f31e,0x252f9a85,0x9a39ee67,
  199000. 0xf5a9c025,0x668544e0
  199001. };
  199002. /* The Montgomery multiplier for modulus of the curve P1024. */
  199003. static sp_digit p1024_mp_mod = 0x7c8f2f3d;
  199004. #if defined(WOLFSSL_SP_SMALL) || defined(HAVE_ECC_CHECK_KEY)
  199005. /* The order of the curve P1024. */
  199006. static const sp_digit p1024_order[32] = {
  199007. 0xbfaa17fb,0xd99b601e,0x2b1eb3a1,0x203177c4,0xe2615f6c,0xff38fa08,
  199008. 0xd5a5c7c7,0xa7e535ab,0x870f026a,0xa9f3cf14,0x0c614aa0,0x6dabfd2a,
  199009. 0x595a0738,0x144ab173,0xcc9ad335,0x389b1921,0x2999a9b4,0x4d5b49fd,
  199010. 0xfdf22286,0x39e46ce7,0x4c69672c,0xc8a1cc35,0xf8bf03c6,0xbd02aac9,
  199011. 0x2cf8068b,0x6fa6b8d6,0x672d2098,0x905b0338,0x36b4195e,0x99718466,
  199012. 0xc2958ff6,0x265eaec7
  199013. };
  199014. #endif
  199015. /* The base point of curve P1024. */
  199016. static const sp_point_1024 p1024_base = {
  199017. /* X ordinate */
  199018. {
  199019. 0xeae63895,0x880dc8ab,0x967e0979,0x80ec46c4,0xb63f73ec,0xee9163a5,
  199020. 0x80728d87,0xd5cfb4cc,0xba66910d,0xa7c1514d,0x7a60de74,0xa702c339,
  199021. 0x8b72f2e1,0x337c8654,0x5dd5bccb,0x9760af76,0x406ce890,0x718bd9e7,
  199022. 0xdb9dfa55,0x43d5f22c,0x30b09e10,0xab10db90,0xf6ce2308,0xb5edb6c0,
  199023. 0xb6ff7cbf,0x98b2f204,0x0aec69c6,0x2b1a2fd6,0x3ed9b52a,0x0a799005,
  199024. 0x332c29ad,0x53fc09ee,
  199025. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  199026. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  199027. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  199028. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  199029. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  199030. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  199031. (sp_digit)0, (sp_digit)0
  199032. },
  199033. /* Y ordinate */
  199034. {
  199035. 0x1bef16d7,0x75573fd7,0x6a67dcde,0xadb9b570,0xd5bb4636,0x80bdad5a,
  199036. 0xe9cb99a9,0x13515ad7,0xc5a4d5f2,0x492d979f,0x164aa989,0xac6f1e80,
  199037. 0xb7652fe0,0xcad696b5,0xad547c6c,0x70dae117,0xa9e032b9,0x416cff0c,
  199038. 0x9a140b2e,0x6b598ccf,0xf0de55f6,0xe7f7f5e5,0x654ec2b9,0xf5ea69f4,
  199039. 0x1e141178,0x3d778d82,0x02990696,0xd3e82016,0x3634a135,0xf9f1f053,
  199040. 0x3f6009f1,0x0a824906,
  199041. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  199042. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  199043. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  199044. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  199045. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  199046. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  199047. (sp_digit)0, (sp_digit)0
  199048. },
  199049. /* Z ordinate */
  199050. {
  199051. 0x00000001,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  199052. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  199053. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  199054. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  199055. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  199056. 0x00000000,0x00000000,
  199057. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  199058. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  199059. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  199060. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  199061. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  199062. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  199063. (sp_digit)0, (sp_digit)0
  199064. },
  199065. /* infinity */
  199066. 0
  199067. };
  199068. #ifdef WOLFSSL_SP_SMALL
  199069. /* Sub b from a into a. (a -= b)
  199070. *
  199071. * a A single precision integer.
  199072. * b A single precision integer.
  199073. */
  199074. SP_NOINLINE static sp_digit sp_1024_sub_in_place_32(sp_digit* a,
  199075. const sp_digit* b)
  199076. {
  199077. __asm__ __volatile__ (
  199078. "movs r7, %[a]\n\t"
  199079. "movs r2, #0\n\t"
  199080. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199081. "adds r7, r7, #0x80\n\t"
  199082. #else
  199083. "add r7, r7, #0x80\n\t"
  199084. #endif
  199085. "\n"
  199086. "L_sp_1024_sub_in_place_32_words_%=:\n\t"
  199087. "movs r5, #0\n\t"
  199088. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199089. "subs r5, r5, r2\n\t"
  199090. #else
  199091. "sub r5, r5, r2\n\t"
  199092. #endif
  199093. "ldr r3, [%[a]]\n\t"
  199094. "ldr r4, [%[a], #4]\n\t"
  199095. "ldr r5, [%[b]]\n\t"
  199096. "ldr r6, [%[b], #4]\n\t"
  199097. #ifdef WOLFSSL_KEIL
  199098. "sbcs r3, r3, r5\n\t"
  199099. #elif defined(__clang__)
  199100. "sbcs r3, r5\n\t"
  199101. #else
  199102. "sbc r3, r5\n\t"
  199103. #endif
  199104. #ifdef WOLFSSL_KEIL
  199105. "sbcs r4, r4, r6\n\t"
  199106. #elif defined(__clang__)
  199107. "sbcs r4, r6\n\t"
  199108. #else
  199109. "sbc r4, r6\n\t"
  199110. #endif
  199111. "str r3, [%[a]]\n\t"
  199112. "str r4, [%[a], #4]\n\t"
  199113. #ifdef WOLFSSL_KEIL
  199114. "sbcs r2, r2, r2\n\t"
  199115. #elif defined(__clang__)
  199116. "sbcs r2, r2\n\t"
  199117. #else
  199118. "sbc r2, r2\n\t"
  199119. #endif
  199120. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199121. "adds %[a], %[a], #8\n\t"
  199122. #else
  199123. "add %[a], %[a], #8\n\t"
  199124. #endif
  199125. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199126. "adds %[b], %[b], #8\n\t"
  199127. #else
  199128. "add %[b], %[b], #8\n\t"
  199129. #endif
  199130. "cmp %[a], r7\n\t"
  199131. "bne L_sp_1024_sub_in_place_32_words_%=\n\t"
  199132. "movs %[a], r2\n\t"
  199133. : [a] "+l" (a), [b] "+l" (b)
  199134. :
  199135. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  199136. );
  199137. return (uint32_t)(size_t)a;
  199138. }
  199139. #endif /* WOLFSSL_SP_SMALL */
  199140. /* Conditionally subtract b from a using the mask m.
  199141. * m is -1 to subtract and 0 when not copying.
  199142. *
  199143. * r A single precision number representing condition subtract result.
  199144. * a A single precision number to subtract from.
  199145. * b A single precision number to subtract.
  199146. * m Mask value to apply.
  199147. */
  199148. SP_NOINLINE static sp_digit sp_1024_cond_sub_32(sp_digit* r, const sp_digit* a,
  199149. const sp_digit* b, sp_digit m)
  199150. {
  199151. __asm__ __volatile__ (
  199152. "movs r4, #0\n\t"
  199153. "movs r5, #0x80\n\t"
  199154. "mov r8, r5\n\t"
  199155. "movs r7, #0\n\t"
  199156. "\n"
  199157. "L_sp_1024_cond_sub_32_words_%=:\n\t"
  199158. "ldr r6, [%[b], r7]\n\t"
  199159. #ifdef WOLFSSL_KEIL
  199160. "ands r6, r6, %[m]\n\t"
  199161. #elif defined(__clang__)
  199162. "ands r6, %[m]\n\t"
  199163. #else
  199164. "and r6, %[m]\n\t"
  199165. #endif
  199166. "movs r5, #0\n\t"
  199167. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199168. "subs r5, r5, r4\n\t"
  199169. #else
  199170. "sub r5, r5, r4\n\t"
  199171. #endif
  199172. "ldr r5, [%[a], r7]\n\t"
  199173. #ifdef WOLFSSL_KEIL
  199174. "sbcs r5, r5, r6\n\t"
  199175. #elif defined(__clang__)
  199176. "sbcs r5, r6\n\t"
  199177. #else
  199178. "sbc r5, r6\n\t"
  199179. #endif
  199180. #ifdef WOLFSSL_KEIL
  199181. "sbcs r4, r4, r4\n\t"
  199182. #elif defined(__clang__)
  199183. "sbcs r4, r4\n\t"
  199184. #else
  199185. "sbc r4, r4\n\t"
  199186. #endif
  199187. "str r5, [%[r], r7]\n\t"
  199188. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199189. "adds r7, r7, #4\n\t"
  199190. #else
  199191. "add r7, r7, #4\n\t"
  199192. #endif
  199193. "cmp r7, r8\n\t"
  199194. "blt L_sp_1024_cond_sub_32_words_%=\n\t"
  199195. "movs %[r], r4\n\t"
  199196. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m)
  199197. :
  199198. : "memory", "r4", "r5", "r6", "r7", "r8"
  199199. );
  199200. return (uint32_t)(size_t)r;
  199201. }
  199202. #ifdef WOLFSSL_SP_SMALL
  199203. /* Add b to a into r. (r = a + b)
  199204. *
  199205. * r A single precision integer.
  199206. * a A single precision integer.
  199207. * b A single precision integer.
  199208. */
  199209. SP_NOINLINE static sp_digit sp_1024_add_32(sp_digit* r, const sp_digit* a,
  199210. const sp_digit* b)
  199211. {
  199212. __asm__ __volatile__ (
  199213. "movs r6, %[a]\n\t"
  199214. "movs r7, #0\n\t"
  199215. "movs r3, #0\n\t"
  199216. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199217. "adds r6, r6, #0x80\n\t"
  199218. #else
  199219. "add r6, r6, #0x80\n\t"
  199220. #endif
  199221. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199222. "subs r7, r7, #1\n\t"
  199223. #else
  199224. "sub r7, r7, #1\n\t"
  199225. #endif
  199226. "\n"
  199227. "L_sp_1024_add_32_word_%=:\n\t"
  199228. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199229. "adds r3, r3, r7\n\t"
  199230. #else
  199231. "add r3, r3, r7\n\t"
  199232. #endif
  199233. "ldr r4, [%[a]]\n\t"
  199234. "ldr r5, [%[b]]\n\t"
  199235. #ifdef WOLFSSL_KEIL
  199236. "adcs r4, r4, r5\n\t"
  199237. #elif defined(__clang__)
  199238. "adcs r4, r5\n\t"
  199239. #else
  199240. "adc r4, r5\n\t"
  199241. #endif
  199242. "str r4, [%[r]]\n\t"
  199243. "movs r3, #0\n\t"
  199244. #ifdef WOLFSSL_KEIL
  199245. "adcs r3, r3, r3\n\t"
  199246. #elif defined(__clang__)
  199247. "adcs r3, r3\n\t"
  199248. #else
  199249. "adc r3, r3\n\t"
  199250. #endif
  199251. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199252. "adds %[a], %[a], #4\n\t"
  199253. #else
  199254. "add %[a], %[a], #4\n\t"
  199255. #endif
  199256. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199257. "adds %[b], %[b], #4\n\t"
  199258. #else
  199259. "add %[b], %[b], #4\n\t"
  199260. #endif
  199261. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199262. "adds %[r], %[r], #4\n\t"
  199263. #else
  199264. "add %[r], %[r], #4\n\t"
  199265. #endif
  199266. "cmp %[a], r6\n\t"
  199267. "bne L_sp_1024_add_32_word_%=\n\t"
  199268. "movs %[r], r3\n\t"
  199269. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  199270. :
  199271. : "memory", "r3", "r4", "r5", "r6", "r7"
  199272. );
  199273. return (uint32_t)(size_t)r;
  199274. }
  199275. #endif /* WOLFSSL_SP_SMALL */
  199276. /* Mul a by digit b into r. (r = a * b)
  199277. *
  199278. * r A single precision integer.
  199279. * a A single precision integer.
  199280. * b A single precision digit.
  199281. */
  199282. SP_NOINLINE static void sp_1024_mul_d_32(sp_digit* r, const sp_digit* a,
  199283. sp_digit b)
  199284. {
  199285. __asm__ __volatile__ (
  199286. "movs r6, #0x80\n\t"
  199287. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199288. "adds r6, r6, %[a]\n\t"
  199289. #else
  199290. "add r6, r6, %[a]\n\t"
  199291. #endif
  199292. "mov r8, %[r]\n\t"
  199293. "mov r9, r6\n\t"
  199294. "movs r3, #0\n\t"
  199295. "movs r4, #0\n\t"
  199296. "\n"
  199297. "L_sp_1024_mul_d_32_%=:\n\t"
  199298. "movs %[r], #0\n\t"
  199299. "movs r5, #0\n\t"
  199300. "# A[] * B\n\t"
  199301. "ldrh r6, [%[a]]\n\t"
  199302. "uxth r7, %[b]\n\t"
  199303. #ifdef WOLFSSL_KEIL
  199304. "muls r7, r6, r7\n\t"
  199305. #elif defined(__clang__)
  199306. "muls r7, r6\n\t"
  199307. #else
  199308. "mul r7, r6\n\t"
  199309. #endif
  199310. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199311. "adds r3, r3, r7\n\t"
  199312. #else
  199313. "add r3, r3, r7\n\t"
  199314. #endif
  199315. #ifdef WOLFSSL_KEIL
  199316. "adcs r4, r4, %[r]\n\t"
  199317. #elif defined(__clang__)
  199318. "adcs r4, %[r]\n\t"
  199319. #else
  199320. "adc r4, %[r]\n\t"
  199321. #endif
  199322. #ifdef WOLFSSL_KEIL
  199323. "adcs r5, r5, %[r]\n\t"
  199324. #elif defined(__clang__)
  199325. "adcs r5, %[r]\n\t"
  199326. #else
  199327. "adc r5, %[r]\n\t"
  199328. #endif
  199329. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199330. "lsrs r7, %[b], #16\n\t"
  199331. #else
  199332. "lsr r7, %[b], #16\n\t"
  199333. #endif
  199334. #ifdef WOLFSSL_KEIL
  199335. "muls r6, r7, r6\n\t"
  199336. #elif defined(__clang__)
  199337. "muls r6, r7\n\t"
  199338. #else
  199339. "mul r6, r7\n\t"
  199340. #endif
  199341. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199342. "lsrs r7, r6, #16\n\t"
  199343. #else
  199344. "lsr r7, r6, #16\n\t"
  199345. #endif
  199346. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199347. "lsls r6, r6, #16\n\t"
  199348. #else
  199349. "lsl r6, r6, #16\n\t"
  199350. #endif
  199351. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199352. "adds r3, r3, r6\n\t"
  199353. #else
  199354. "add r3, r3, r6\n\t"
  199355. #endif
  199356. #ifdef WOLFSSL_KEIL
  199357. "adcs r4, r4, r7\n\t"
  199358. #elif defined(__clang__)
  199359. "adcs r4, r7\n\t"
  199360. #else
  199361. "adc r4, r7\n\t"
  199362. #endif
  199363. #ifdef WOLFSSL_KEIL
  199364. "adcs r5, r5, %[r]\n\t"
  199365. #elif defined(__clang__)
  199366. "adcs r5, %[r]\n\t"
  199367. #else
  199368. "adc r5, %[r]\n\t"
  199369. #endif
  199370. "ldr r6, [%[a]]\n\t"
  199371. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199372. "lsrs r6, r6, #16\n\t"
  199373. #else
  199374. "lsr r6, r6, #16\n\t"
  199375. #endif
  199376. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199377. "lsrs r7, %[b], #16\n\t"
  199378. #else
  199379. "lsr r7, %[b], #16\n\t"
  199380. #endif
  199381. #ifdef WOLFSSL_KEIL
  199382. "muls r7, r6, r7\n\t"
  199383. #elif defined(__clang__)
  199384. "muls r7, r6\n\t"
  199385. #else
  199386. "mul r7, r6\n\t"
  199387. #endif
  199388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199389. "adds r4, r4, r7\n\t"
  199390. #else
  199391. "add r4, r4, r7\n\t"
  199392. #endif
  199393. #ifdef WOLFSSL_KEIL
  199394. "adcs r5, r5, %[r]\n\t"
  199395. #elif defined(__clang__)
  199396. "adcs r5, %[r]\n\t"
  199397. #else
  199398. "adc r5, %[r]\n\t"
  199399. #endif
  199400. "uxth r7, %[b]\n\t"
  199401. #ifdef WOLFSSL_KEIL
  199402. "muls r6, r7, r6\n\t"
  199403. #elif defined(__clang__)
  199404. "muls r6, r7\n\t"
  199405. #else
  199406. "mul r6, r7\n\t"
  199407. #endif
  199408. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199409. "lsrs r7, r6, #16\n\t"
  199410. #else
  199411. "lsr r7, r6, #16\n\t"
  199412. #endif
  199413. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199414. "lsls r6, r6, #16\n\t"
  199415. #else
  199416. "lsl r6, r6, #16\n\t"
  199417. #endif
  199418. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199419. "adds r3, r3, r6\n\t"
  199420. #else
  199421. "add r3, r3, r6\n\t"
  199422. #endif
  199423. #ifdef WOLFSSL_KEIL
  199424. "adcs r4, r4, r7\n\t"
  199425. #elif defined(__clang__)
  199426. "adcs r4, r7\n\t"
  199427. #else
  199428. "adc r4, r7\n\t"
  199429. #endif
  199430. #ifdef WOLFSSL_KEIL
  199431. "adcs r5, r5, %[r]\n\t"
  199432. #elif defined(__clang__)
  199433. "adcs r5, %[r]\n\t"
  199434. #else
  199435. "adc r5, %[r]\n\t"
  199436. #endif
  199437. "# A[] * B - Done\n\t"
  199438. "mov %[r], r8\n\t"
  199439. "str r3, [%[r]]\n\t"
  199440. "movs r3, r4\n\t"
  199441. "movs r4, r5\n\t"
  199442. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199443. "adds %[r], %[r], #4\n\t"
  199444. #else
  199445. "add %[r], %[r], #4\n\t"
  199446. #endif
  199447. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199448. "adds %[a], %[a], #4\n\t"
  199449. #else
  199450. "add %[a], %[a], #4\n\t"
  199451. #endif
  199452. "mov r8, %[r]\n\t"
  199453. "cmp %[a], r9\n\t"
  199454. "blt L_sp_1024_mul_d_32_%=\n\t"
  199455. "str r3, [%[r]]\n\t"
  199456. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  199457. :
  199458. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  199459. );
  199460. }
  199461. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  199462. *
  199463. * d1 The high order half of the number to divide.
  199464. * d0 The low order half of the number to divide.
  199465. * div The divisor.
  199466. * returns the result of the division.
  199467. *
  199468. * Note that this is an approximate div. It may give an answer 1 larger.
  199469. */
  199470. SP_NOINLINE static sp_digit div_1024_word_32(sp_digit d1, sp_digit d0,
  199471. sp_digit div)
  199472. {
  199473. __asm__ __volatile__ (
  199474. "movs r3, #0\n\t"
  199475. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199476. "lsrs r5, %[div], #1\n\t"
  199477. #else
  199478. "lsr r5, %[div], #1\n\t"
  199479. #endif
  199480. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199481. "adds r5, r5, #1\n\t"
  199482. #else
  199483. "add r5, r5, #1\n\t"
  199484. #endif
  199485. "mov r8, %[d0]\n\t"
  199486. "mov r9, %[d1]\n\t"
  199487. "# Do top 32\n\t"
  199488. "movs r6, r5\n\t"
  199489. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199490. "subs r6, r6, %[d1]\n\t"
  199491. #else
  199492. "sub r6, r6, %[d1]\n\t"
  199493. #endif
  199494. #ifdef WOLFSSL_KEIL
  199495. "sbcs r6, r6, r6\n\t"
  199496. #elif defined(__clang__)
  199497. "sbcs r6, r6\n\t"
  199498. #else
  199499. "sbc r6, r6\n\t"
  199500. #endif
  199501. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199502. "adds r3, r3, r3\n\t"
  199503. #else
  199504. "add r3, r3, r3\n\t"
  199505. #endif
  199506. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199507. "subs r3, r3, r6\n\t"
  199508. #else
  199509. "sub r3, r3, r6\n\t"
  199510. #endif
  199511. #ifdef WOLFSSL_KEIL
  199512. "ands r6, r6, r5\n\t"
  199513. #elif defined(__clang__)
  199514. "ands r6, r5\n\t"
  199515. #else
  199516. "and r6, r5\n\t"
  199517. #endif
  199518. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199519. "subs %[d1], %[d1], r6\n\t"
  199520. #else
  199521. "sub %[d1], %[d1], r6\n\t"
  199522. #endif
  199523. "movs r4, #29\n\t"
  199524. "\n"
  199525. "L_div_1024_word_32_loop_%=:\n\t"
  199526. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199527. "lsls %[d0], %[d0], #1\n\t"
  199528. #else
  199529. "lsl %[d0], %[d0], #1\n\t"
  199530. #endif
  199531. #ifdef WOLFSSL_KEIL
  199532. "adcs %[d1], %[d1], %[d1]\n\t"
  199533. #elif defined(__clang__)
  199534. "adcs %[d1], %[d1]\n\t"
  199535. #else
  199536. "adc %[d1], %[d1]\n\t"
  199537. #endif
  199538. "movs r6, r5\n\t"
  199539. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199540. "subs r6, r6, %[d1]\n\t"
  199541. #else
  199542. "sub r6, r6, %[d1]\n\t"
  199543. #endif
  199544. #ifdef WOLFSSL_KEIL
  199545. "sbcs r6, r6, r6\n\t"
  199546. #elif defined(__clang__)
  199547. "sbcs r6, r6\n\t"
  199548. #else
  199549. "sbc r6, r6\n\t"
  199550. #endif
  199551. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199552. "adds r3, r3, r3\n\t"
  199553. #else
  199554. "add r3, r3, r3\n\t"
  199555. #endif
  199556. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199557. "subs r3, r3, r6\n\t"
  199558. #else
  199559. "sub r3, r3, r6\n\t"
  199560. #endif
  199561. #ifdef WOLFSSL_KEIL
  199562. "ands r6, r6, r5\n\t"
  199563. #elif defined(__clang__)
  199564. "ands r6, r5\n\t"
  199565. #else
  199566. "and r6, r5\n\t"
  199567. #endif
  199568. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199569. "subs %[d1], %[d1], r6\n\t"
  199570. #else
  199571. "sub %[d1], %[d1], r6\n\t"
  199572. #endif
  199573. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199574. "subs r4, r4, #1\n\t"
  199575. #else
  199576. "sub r4, r4, #1\n\t"
  199577. #endif
  199578. "bpl L_div_1024_word_32_loop_%=\n\t"
  199579. "movs r7, #0\n\t"
  199580. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199581. "adds r3, r3, r3\n\t"
  199582. #else
  199583. "add r3, r3, r3\n\t"
  199584. #endif
  199585. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199586. "adds r3, r3, #1\n\t"
  199587. #else
  199588. "add r3, r3, #1\n\t"
  199589. #endif
  199590. "# r * div - Start\n\t"
  199591. "uxth %[d1], r3\n\t"
  199592. "uxth r4, %[div]\n\t"
  199593. #ifdef WOLFSSL_KEIL
  199594. "muls r4, %[d1], r4\n\t"
  199595. #elif defined(__clang__)
  199596. "muls r4, %[d1]\n\t"
  199597. #else
  199598. "mul r4, %[d1]\n\t"
  199599. #endif
  199600. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199601. "lsrs r6, %[div], #16\n\t"
  199602. #else
  199603. "lsr r6, %[div], #16\n\t"
  199604. #endif
  199605. #ifdef WOLFSSL_KEIL
  199606. "muls %[d1], r6, %[d1]\n\t"
  199607. #elif defined(__clang__)
  199608. "muls %[d1], r6\n\t"
  199609. #else
  199610. "mul %[d1], r6\n\t"
  199611. #endif
  199612. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199613. "lsrs r5, %[d1], #16\n\t"
  199614. #else
  199615. "lsr r5, %[d1], #16\n\t"
  199616. #endif
  199617. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199618. "lsls %[d1], %[d1], #16\n\t"
  199619. #else
  199620. "lsl %[d1], %[d1], #16\n\t"
  199621. #endif
  199622. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199623. "adds r4, r4, %[d1]\n\t"
  199624. #else
  199625. "add r4, r4, %[d1]\n\t"
  199626. #endif
  199627. #ifdef WOLFSSL_KEIL
  199628. "adcs r5, r5, r7\n\t"
  199629. #elif defined(__clang__)
  199630. "adcs r5, r7\n\t"
  199631. #else
  199632. "adc r5, r7\n\t"
  199633. #endif
  199634. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199635. "lsrs %[d1], r3, #16\n\t"
  199636. #else
  199637. "lsr %[d1], r3, #16\n\t"
  199638. #endif
  199639. #ifdef WOLFSSL_KEIL
  199640. "muls r6, %[d1], r6\n\t"
  199641. #elif defined(__clang__)
  199642. "muls r6, %[d1]\n\t"
  199643. #else
  199644. "mul r6, %[d1]\n\t"
  199645. #endif
  199646. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199647. "adds r5, r5, r6\n\t"
  199648. #else
  199649. "add r5, r5, r6\n\t"
  199650. #endif
  199651. "uxth r6, %[div]\n\t"
  199652. #ifdef WOLFSSL_KEIL
  199653. "muls %[d1], r6, %[d1]\n\t"
  199654. #elif defined(__clang__)
  199655. "muls %[d1], r6\n\t"
  199656. #else
  199657. "mul %[d1], r6\n\t"
  199658. #endif
  199659. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199660. "lsrs r6, %[d1], #16\n\t"
  199661. #else
  199662. "lsr r6, %[d1], #16\n\t"
  199663. #endif
  199664. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199665. "lsls %[d1], %[d1], #16\n\t"
  199666. #else
  199667. "lsl %[d1], %[d1], #16\n\t"
  199668. #endif
  199669. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199670. "adds r4, r4, %[d1]\n\t"
  199671. #else
  199672. "add r4, r4, %[d1]\n\t"
  199673. #endif
  199674. #ifdef WOLFSSL_KEIL
  199675. "adcs r5, r5, r6\n\t"
  199676. #elif defined(__clang__)
  199677. "adcs r5, r6\n\t"
  199678. #else
  199679. "adc r5, r6\n\t"
  199680. #endif
  199681. "# r * div - Done\n\t"
  199682. "mov %[d1], r8\n\t"
  199683. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199684. "subs %[d1], %[d1], r4\n\t"
  199685. #else
  199686. "sub %[d1], %[d1], r4\n\t"
  199687. #endif
  199688. "movs r4, %[d1]\n\t"
  199689. "mov %[d1], r9\n\t"
  199690. #ifdef WOLFSSL_KEIL
  199691. "sbcs %[d1], %[d1], r5\n\t"
  199692. #elif defined(__clang__)
  199693. "sbcs %[d1], r5\n\t"
  199694. #else
  199695. "sbc %[d1], r5\n\t"
  199696. #endif
  199697. "movs r5, %[d1]\n\t"
  199698. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199699. "adds r3, r3, r5\n\t"
  199700. #else
  199701. "add r3, r3, r5\n\t"
  199702. #endif
  199703. "# r * div - Start\n\t"
  199704. "uxth %[d1], r3\n\t"
  199705. "uxth r4, %[div]\n\t"
  199706. #ifdef WOLFSSL_KEIL
  199707. "muls r4, %[d1], r4\n\t"
  199708. #elif defined(__clang__)
  199709. "muls r4, %[d1]\n\t"
  199710. #else
  199711. "mul r4, %[d1]\n\t"
  199712. #endif
  199713. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199714. "lsrs r6, %[div], #16\n\t"
  199715. #else
  199716. "lsr r6, %[div], #16\n\t"
  199717. #endif
  199718. #ifdef WOLFSSL_KEIL
  199719. "muls %[d1], r6, %[d1]\n\t"
  199720. #elif defined(__clang__)
  199721. "muls %[d1], r6\n\t"
  199722. #else
  199723. "mul %[d1], r6\n\t"
  199724. #endif
  199725. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199726. "lsrs r5, %[d1], #16\n\t"
  199727. #else
  199728. "lsr r5, %[d1], #16\n\t"
  199729. #endif
  199730. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199731. "lsls %[d1], %[d1], #16\n\t"
  199732. #else
  199733. "lsl %[d1], %[d1], #16\n\t"
  199734. #endif
  199735. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199736. "adds r4, r4, %[d1]\n\t"
  199737. #else
  199738. "add r4, r4, %[d1]\n\t"
  199739. #endif
  199740. #ifdef WOLFSSL_KEIL
  199741. "adcs r5, r5, r7\n\t"
  199742. #elif defined(__clang__)
  199743. "adcs r5, r7\n\t"
  199744. #else
  199745. "adc r5, r7\n\t"
  199746. #endif
  199747. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199748. "lsrs %[d1], r3, #16\n\t"
  199749. #else
  199750. "lsr %[d1], r3, #16\n\t"
  199751. #endif
  199752. #ifdef WOLFSSL_KEIL
  199753. "muls r6, %[d1], r6\n\t"
  199754. #elif defined(__clang__)
  199755. "muls r6, %[d1]\n\t"
  199756. #else
  199757. "mul r6, %[d1]\n\t"
  199758. #endif
  199759. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199760. "adds r5, r5, r6\n\t"
  199761. #else
  199762. "add r5, r5, r6\n\t"
  199763. #endif
  199764. "uxth r6, %[div]\n\t"
  199765. #ifdef WOLFSSL_KEIL
  199766. "muls %[d1], r6, %[d1]\n\t"
  199767. #elif defined(__clang__)
  199768. "muls %[d1], r6\n\t"
  199769. #else
  199770. "mul %[d1], r6\n\t"
  199771. #endif
  199772. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199773. "lsrs r6, %[d1], #16\n\t"
  199774. #else
  199775. "lsr r6, %[d1], #16\n\t"
  199776. #endif
  199777. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199778. "lsls %[d1], %[d1], #16\n\t"
  199779. #else
  199780. "lsl %[d1], %[d1], #16\n\t"
  199781. #endif
  199782. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199783. "adds r4, r4, %[d1]\n\t"
  199784. #else
  199785. "add r4, r4, %[d1]\n\t"
  199786. #endif
  199787. #ifdef WOLFSSL_KEIL
  199788. "adcs r5, r5, r6\n\t"
  199789. #elif defined(__clang__)
  199790. "adcs r5, r6\n\t"
  199791. #else
  199792. "adc r5, r6\n\t"
  199793. #endif
  199794. "# r * div - Done\n\t"
  199795. "mov %[d1], r8\n\t"
  199796. "mov r6, r9\n\t"
  199797. #ifdef WOLFSSL_KEIL
  199798. "subs r4, %[d1], r4\n\t"
  199799. #else
  199800. #ifdef __clang__
  199801. "subs r4, %[d1], r4\n\t"
  199802. #else
  199803. "sub r4, %[d1], r4\n\t"
  199804. #endif
  199805. #endif
  199806. #ifdef WOLFSSL_KEIL
  199807. "sbcs r6, r6, r5\n\t"
  199808. #elif defined(__clang__)
  199809. "sbcs r6, r5\n\t"
  199810. #else
  199811. "sbc r6, r5\n\t"
  199812. #endif
  199813. "movs r5, r6\n\t"
  199814. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199815. "adds r3, r3, r5\n\t"
  199816. #else
  199817. "add r3, r3, r5\n\t"
  199818. #endif
  199819. "# r * div - Start\n\t"
  199820. "uxth %[d1], r3\n\t"
  199821. "uxth r4, %[div]\n\t"
  199822. #ifdef WOLFSSL_KEIL
  199823. "muls r4, %[d1], r4\n\t"
  199824. #elif defined(__clang__)
  199825. "muls r4, %[d1]\n\t"
  199826. #else
  199827. "mul r4, %[d1]\n\t"
  199828. #endif
  199829. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199830. "lsrs r6, %[div], #16\n\t"
  199831. #else
  199832. "lsr r6, %[div], #16\n\t"
  199833. #endif
  199834. #ifdef WOLFSSL_KEIL
  199835. "muls %[d1], r6, %[d1]\n\t"
  199836. #elif defined(__clang__)
  199837. "muls %[d1], r6\n\t"
  199838. #else
  199839. "mul %[d1], r6\n\t"
  199840. #endif
  199841. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199842. "lsrs r5, %[d1], #16\n\t"
  199843. #else
  199844. "lsr r5, %[d1], #16\n\t"
  199845. #endif
  199846. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199847. "lsls %[d1], %[d1], #16\n\t"
  199848. #else
  199849. "lsl %[d1], %[d1], #16\n\t"
  199850. #endif
  199851. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199852. "adds r4, r4, %[d1]\n\t"
  199853. #else
  199854. "add r4, r4, %[d1]\n\t"
  199855. #endif
  199856. #ifdef WOLFSSL_KEIL
  199857. "adcs r5, r5, r7\n\t"
  199858. #elif defined(__clang__)
  199859. "adcs r5, r7\n\t"
  199860. #else
  199861. "adc r5, r7\n\t"
  199862. #endif
  199863. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199864. "lsrs %[d1], r3, #16\n\t"
  199865. #else
  199866. "lsr %[d1], r3, #16\n\t"
  199867. #endif
  199868. #ifdef WOLFSSL_KEIL
  199869. "muls r6, %[d1], r6\n\t"
  199870. #elif defined(__clang__)
  199871. "muls r6, %[d1]\n\t"
  199872. #else
  199873. "mul r6, %[d1]\n\t"
  199874. #endif
  199875. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199876. "adds r5, r5, r6\n\t"
  199877. #else
  199878. "add r5, r5, r6\n\t"
  199879. #endif
  199880. "uxth r6, %[div]\n\t"
  199881. #ifdef WOLFSSL_KEIL
  199882. "muls %[d1], r6, %[d1]\n\t"
  199883. #elif defined(__clang__)
  199884. "muls %[d1], r6\n\t"
  199885. #else
  199886. "mul %[d1], r6\n\t"
  199887. #endif
  199888. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199889. "lsrs r6, %[d1], #16\n\t"
  199890. #else
  199891. "lsr r6, %[d1], #16\n\t"
  199892. #endif
  199893. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199894. "lsls %[d1], %[d1], #16\n\t"
  199895. #else
  199896. "lsl %[d1], %[d1], #16\n\t"
  199897. #endif
  199898. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199899. "adds r4, r4, %[d1]\n\t"
  199900. #else
  199901. "add r4, r4, %[d1]\n\t"
  199902. #endif
  199903. #ifdef WOLFSSL_KEIL
  199904. "adcs r5, r5, r6\n\t"
  199905. #elif defined(__clang__)
  199906. "adcs r5, r6\n\t"
  199907. #else
  199908. "adc r5, r6\n\t"
  199909. #endif
  199910. "# r * div - Done\n\t"
  199911. "mov %[d1], r8\n\t"
  199912. "mov r6, r9\n\t"
  199913. #ifdef WOLFSSL_KEIL
  199914. "subs r4, %[d1], r4\n\t"
  199915. #else
  199916. #ifdef __clang__
  199917. "subs r4, %[d1], r4\n\t"
  199918. #else
  199919. "sub r4, %[d1], r4\n\t"
  199920. #endif
  199921. #endif
  199922. #ifdef WOLFSSL_KEIL
  199923. "sbcs r6, r6, r5\n\t"
  199924. #elif defined(__clang__)
  199925. "sbcs r6, r5\n\t"
  199926. #else
  199927. "sbc r6, r5\n\t"
  199928. #endif
  199929. "movs r5, r6\n\t"
  199930. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199931. "adds r3, r3, r5\n\t"
  199932. #else
  199933. "add r3, r3, r5\n\t"
  199934. #endif
  199935. "# r * div - Start\n\t"
  199936. "uxth %[d1], r3\n\t"
  199937. "uxth r4, %[div]\n\t"
  199938. #ifdef WOLFSSL_KEIL
  199939. "muls r4, %[d1], r4\n\t"
  199940. #elif defined(__clang__)
  199941. "muls r4, %[d1]\n\t"
  199942. #else
  199943. "mul r4, %[d1]\n\t"
  199944. #endif
  199945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199946. "lsrs r6, %[div], #16\n\t"
  199947. #else
  199948. "lsr r6, %[div], #16\n\t"
  199949. #endif
  199950. #ifdef WOLFSSL_KEIL
  199951. "muls %[d1], r6, %[d1]\n\t"
  199952. #elif defined(__clang__)
  199953. "muls %[d1], r6\n\t"
  199954. #else
  199955. "mul %[d1], r6\n\t"
  199956. #endif
  199957. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199958. "lsrs r5, %[d1], #16\n\t"
  199959. #else
  199960. "lsr r5, %[d1], #16\n\t"
  199961. #endif
  199962. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199963. "lsls %[d1], %[d1], #16\n\t"
  199964. #else
  199965. "lsl %[d1], %[d1], #16\n\t"
  199966. #endif
  199967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199968. "adds r4, r4, %[d1]\n\t"
  199969. #else
  199970. "add r4, r4, %[d1]\n\t"
  199971. #endif
  199972. #ifdef WOLFSSL_KEIL
  199973. "adcs r5, r5, r7\n\t"
  199974. #elif defined(__clang__)
  199975. "adcs r5, r7\n\t"
  199976. #else
  199977. "adc r5, r7\n\t"
  199978. #endif
  199979. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199980. "lsrs %[d1], r3, #16\n\t"
  199981. #else
  199982. "lsr %[d1], r3, #16\n\t"
  199983. #endif
  199984. #ifdef WOLFSSL_KEIL
  199985. "muls r6, %[d1], r6\n\t"
  199986. #elif defined(__clang__)
  199987. "muls r6, %[d1]\n\t"
  199988. #else
  199989. "mul r6, %[d1]\n\t"
  199990. #endif
  199991. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199992. "adds r5, r5, r6\n\t"
  199993. #else
  199994. "add r5, r5, r6\n\t"
  199995. #endif
  199996. "uxth r6, %[div]\n\t"
  199997. #ifdef WOLFSSL_KEIL
  199998. "muls %[d1], r6, %[d1]\n\t"
  199999. #elif defined(__clang__)
  200000. "muls %[d1], r6\n\t"
  200001. #else
  200002. "mul %[d1], r6\n\t"
  200003. #endif
  200004. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200005. "lsrs r6, %[d1], #16\n\t"
  200006. #else
  200007. "lsr r6, %[d1], #16\n\t"
  200008. #endif
  200009. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200010. "lsls %[d1], %[d1], #16\n\t"
  200011. #else
  200012. "lsl %[d1], %[d1], #16\n\t"
  200013. #endif
  200014. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200015. "adds r4, r4, %[d1]\n\t"
  200016. #else
  200017. "add r4, r4, %[d1]\n\t"
  200018. #endif
  200019. #ifdef WOLFSSL_KEIL
  200020. "adcs r5, r5, r6\n\t"
  200021. #elif defined(__clang__)
  200022. "adcs r5, r6\n\t"
  200023. #else
  200024. "adc r5, r6\n\t"
  200025. #endif
  200026. "# r * div - Done\n\t"
  200027. "mov %[d1], r8\n\t"
  200028. "mov r6, r9\n\t"
  200029. #ifdef WOLFSSL_KEIL
  200030. "subs r4, %[d1], r4\n\t"
  200031. #else
  200032. #ifdef __clang__
  200033. "subs r4, %[d1], r4\n\t"
  200034. #else
  200035. "sub r4, %[d1], r4\n\t"
  200036. #endif
  200037. #endif
  200038. #ifdef WOLFSSL_KEIL
  200039. "sbcs r6, r6, r5\n\t"
  200040. #elif defined(__clang__)
  200041. "sbcs r6, r5\n\t"
  200042. #else
  200043. "sbc r6, r5\n\t"
  200044. #endif
  200045. "movs r5, r6\n\t"
  200046. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200047. "adds r3, r3, r5\n\t"
  200048. #else
  200049. "add r3, r3, r5\n\t"
  200050. #endif
  200051. "movs r6, %[div]\n\t"
  200052. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200053. "subs r6, r6, r4\n\t"
  200054. #else
  200055. "sub r6, r6, r4\n\t"
  200056. #endif
  200057. #ifdef WOLFSSL_KEIL
  200058. "sbcs r6, r6, r6\n\t"
  200059. #elif defined(__clang__)
  200060. "sbcs r6, r6\n\t"
  200061. #else
  200062. "sbc r6, r6\n\t"
  200063. #endif
  200064. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200065. "subs r3, r3, r6\n\t"
  200066. #else
  200067. "sub r3, r3, r6\n\t"
  200068. #endif
  200069. "movs %[d1], r3\n\t"
  200070. : [d1] "+l" (d1), [d0] "+l" (d0), [div] "+l" (div)
  200071. :
  200072. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  200073. );
  200074. return (uint32_t)(size_t)d1;
  200075. }
  200076. /* AND m into each word of a and store in r.
  200077. *
  200078. * r A single precision integer.
  200079. * a A single precision integer.
  200080. * m Mask to AND against each digit.
  200081. */
  200082. static void sp_1024_mask_32(sp_digit* r, const sp_digit* a, sp_digit m)
  200083. {
  200084. #ifdef WOLFSSL_SP_SMALL
  200085. int i;
  200086. for (i=0; i<32; i++) {
  200087. r[i] = a[i] & m;
  200088. }
  200089. #else
  200090. int i;
  200091. for (i = 0; i < 32; i += 8) {
  200092. r[i+0] = a[i+0] & m;
  200093. r[i+1] = a[i+1] & m;
  200094. r[i+2] = a[i+2] & m;
  200095. r[i+3] = a[i+3] & m;
  200096. r[i+4] = a[i+4] & m;
  200097. r[i+5] = a[i+5] & m;
  200098. r[i+6] = a[i+6] & m;
  200099. r[i+7] = a[i+7] & m;
  200100. }
  200101. #endif
  200102. }
  200103. /* Compare a with b in constant time.
  200104. *
  200105. * a A single precision integer.
  200106. * b A single precision integer.
  200107. * return -ve, 0 or +ve if a is less than, equal to or greater than b
  200108. * respectively.
  200109. */
  200110. SP_NOINLINE static sp_int32 sp_1024_cmp_32(const sp_digit* a, const sp_digit* b)
  200111. {
  200112. __asm__ __volatile__ (
  200113. "movs r2, #0\n\t"
  200114. "movs r3, #0\n\t"
  200115. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200116. "mvns r3, r3\n\t"
  200117. #else
  200118. "mvn r3, r3\n\t"
  200119. #endif
  200120. "movs r6, #0x7c\n\t"
  200121. "\n"
  200122. "L_sp_1024_cmp_32_words_%=:\n\t"
  200123. "ldr r7, [%[a], r6]\n\t"
  200124. "ldr r5, [%[b], r6]\n\t"
  200125. #ifdef WOLFSSL_KEIL
  200126. "ands r7, r7, r3\n\t"
  200127. #elif defined(__clang__)
  200128. "ands r7, r3\n\t"
  200129. #else
  200130. "and r7, r3\n\t"
  200131. #endif
  200132. #ifdef WOLFSSL_KEIL
  200133. "ands r5, r5, r3\n\t"
  200134. #elif defined(__clang__)
  200135. "ands r5, r3\n\t"
  200136. #else
  200137. "and r5, r3\n\t"
  200138. #endif
  200139. "movs r4, r7\n\t"
  200140. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200141. "subs r7, r7, r5\n\t"
  200142. #else
  200143. "sub r7, r7, r5\n\t"
  200144. #endif
  200145. #ifdef WOLFSSL_KEIL
  200146. "sbcs r7, r7, r7\n\t"
  200147. #elif defined(__clang__)
  200148. "sbcs r7, r7\n\t"
  200149. #else
  200150. "sbc r7, r7\n\t"
  200151. #endif
  200152. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200153. "adds r2, r2, r7\n\t"
  200154. #else
  200155. "add r2, r2, r7\n\t"
  200156. #endif
  200157. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200158. "mvns r7, r7\n\t"
  200159. #else
  200160. "mvn r7, r7\n\t"
  200161. #endif
  200162. #ifdef WOLFSSL_KEIL
  200163. "ands r3, r3, r7\n\t"
  200164. #elif defined(__clang__)
  200165. "ands r3, r7\n\t"
  200166. #else
  200167. "and r3, r7\n\t"
  200168. #endif
  200169. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200170. "subs r5, r5, r4\n\t"
  200171. #else
  200172. "sub r5, r5, r4\n\t"
  200173. #endif
  200174. #ifdef WOLFSSL_KEIL
  200175. "sbcs r7, r7, r7\n\t"
  200176. #elif defined(__clang__)
  200177. "sbcs r7, r7\n\t"
  200178. #else
  200179. "sbc r7, r7\n\t"
  200180. #endif
  200181. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200182. "subs r2, r2, r7\n\t"
  200183. #else
  200184. "sub r2, r2, r7\n\t"
  200185. #endif
  200186. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200187. "mvns r7, r7\n\t"
  200188. #else
  200189. "mvn r7, r7\n\t"
  200190. #endif
  200191. #ifdef WOLFSSL_KEIL
  200192. "ands r3, r3, r7\n\t"
  200193. #elif defined(__clang__)
  200194. "ands r3, r7\n\t"
  200195. #else
  200196. "and r3, r7\n\t"
  200197. #endif
  200198. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200199. "subs r6, r6, #4\n\t"
  200200. #else
  200201. "sub r6, r6, #4\n\t"
  200202. #endif
  200203. "bge L_sp_1024_cmp_32_words_%=\n\t"
  200204. "movs %[a], r2\n\t"
  200205. : [a] "+l" (a), [b] "+l" (b)
  200206. :
  200207. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  200208. );
  200209. return (uint32_t)(size_t)a;
  200210. }
  200211. /* Divide d in a and put remainder into r (m*d + r = a)
  200212. * m is not calculated as it is not needed at this time.
  200213. *
  200214. * a Number to be divided.
  200215. * d Number to divide with.
  200216. * m Multiplier result.
  200217. * r Remainder from the division.
  200218. * returns MP_OKAY indicating success.
  200219. */
  200220. static WC_INLINE int sp_1024_div_32(const sp_digit* a, const sp_digit* d, sp_digit* m,
  200221. sp_digit* r)
  200222. {
  200223. sp_digit t1[64], t2[33];
  200224. sp_digit div, r1;
  200225. int i;
  200226. (void)m;
  200227. div = d[31];
  200228. XMEMCPY(t1, a, sizeof(*t1) * 2 * 32);
  200229. r1 = sp_1024_cmp_32(&t1[32], d) >= 0;
  200230. sp_1024_cond_sub_32(&t1[32], &t1[32], d, (sp_digit)0 - r1);
  200231. for (i = 31; i >= 0; i--) {
  200232. volatile sp_digit mask = (sp_digit)0 - (t1[32 + i] == div);
  200233. sp_digit hi = t1[32 + i] + mask;
  200234. r1 = div_1024_word_32(hi, t1[32 + i - 1], div);
  200235. r1 |= mask;
  200236. sp_1024_mul_d_32(t2, d, r1);
  200237. t1[32 + i] += sp_1024_sub_in_place_32(&t1[i], t2);
  200238. t1[32 + i] -= t2[32];
  200239. sp_1024_mask_32(t2, d, t1[32 + i]);
  200240. t1[32 + i] += sp_1024_add_32(&t1[i], &t1[i], t2);
  200241. sp_1024_mask_32(t2, d, t1[32 + i]);
  200242. t1[32 + i] += sp_1024_add_32(&t1[i], &t1[i], t2);
  200243. }
  200244. r1 = sp_1024_cmp_32(t1, d) >= 0;
  200245. sp_1024_cond_sub_32(r, t1, d, (sp_digit)0 - r1);
  200246. return MP_OKAY;
  200247. }
  200248. /* Reduce a modulo m into r. (r = a mod m)
  200249. *
  200250. * r A single precision number that is the reduced result.
  200251. * a A single precision number that is to be reduced.
  200252. * m A single precision number that is the modulus to reduce with.
  200253. * returns MP_OKAY indicating success.
  200254. */
  200255. static WC_INLINE int sp_1024_mod_32(sp_digit* r, const sp_digit* a, const sp_digit* m)
  200256. {
  200257. int ret;
  200258. ret = sp_1024_div_32(a, m, NULL, r);
  200259. return ret;
  200260. }
  200261. /* Multiply a number by Montgomery normalizer mod modulus (prime).
  200262. *
  200263. * r The resulting Montgomery form number.
  200264. * a The number to convert.
  200265. * m The modulus (prime).
  200266. * returns MEMORY_E when memory allocation fails and MP_OKAY otherwise.
  200267. */
  200268. static int sp_1024_mod_mul_norm_32(sp_digit* r, const sp_digit* a,
  200269. const sp_digit* m)
  200270. {
  200271. sp_1024_mul_32(r, a, p1024_norm_mod);
  200272. return sp_1024_mod_32(r, r, m);
  200273. }
  200274. #ifdef WOLFCRYPT_HAVE_SAKKE
  200275. /* Create a new point.
  200276. *
  200277. * heap [in] Buffer to allocate dynamic memory from.
  200278. * sp [in] Data for point - only if not allocating.
  200279. * p [out] New point.
  200280. * returns MEMORY_E when dynamic memory allocation fails and 0 otherwise.
  200281. */
  200282. static int sp_1024_point_new_ex_32(void* heap, sp_point_1024* sp,
  200283. sp_point_1024** p)
  200284. {
  200285. int ret = MP_OKAY;
  200286. (void)heap;
  200287. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && !defined(WOLFSSL_SP_NO_MALLOC)
  200288. (void)sp;
  200289. *p = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024), heap, DYNAMIC_TYPE_ECC);
  200290. #else
  200291. *p = sp;
  200292. #endif
  200293. if (*p == NULL) {
  200294. ret = MEMORY_E;
  200295. }
  200296. return ret;
  200297. }
  200298. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && !defined(WOLFSSL_SP_NO_MALLOC)
  200299. /* Allocate memory for point and return error. */
  200300. #define sp_1024_point_new_32(heap, sp, p) sp_1024_point_new_ex_32((heap), NULL, &(p))
  200301. #else
  200302. /* Set pointer to data and return no error. */
  200303. #define sp_1024_point_new_32(heap, sp, p) sp_1024_point_new_ex_32((heap), &(sp), &(p))
  200304. #endif
  200305. #endif /* WOLFCRYPT_HAVE_SAKKE */
  200306. #ifdef WOLFCRYPT_HAVE_SAKKE
  200307. /* Free the point.
  200308. *
  200309. * p [in,out] Point to free.
  200310. * clear [in] Indicates whether to zeroize point.
  200311. * heap [in] Buffer from which dynamic memory was allocate from.
  200312. */
  200313. static void sp_1024_point_free_32(sp_point_1024* p, int clear, void* heap)
  200314. {
  200315. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && !defined(WOLFSSL_SP_NO_MALLOC)
  200316. /* If valid pointer then clear point data if requested and free data. */
  200317. if (p != NULL) {
  200318. if (clear != 0) {
  200319. XMEMSET(p, 0, sizeof(*p));
  200320. }
  200321. XFREE(p, heap, DYNAMIC_TYPE_ECC);
  200322. }
  200323. #else
  200324. /* Clear point data if requested. */
  200325. if ((p != NULL) && (clear != 0)) {
  200326. XMEMSET(p, 0, sizeof(*p));
  200327. }
  200328. #endif
  200329. (void)heap;
  200330. }
  200331. #endif /* WOLFCRYPT_HAVE_SAKKE */
  200332. /* Convert an mp_int to an array of sp_digit.
  200333. *
  200334. * r A single precision integer.
  200335. * size Maximum number of bytes to convert
  200336. * a A multi-precision integer.
  200337. */
  200338. static void sp_1024_from_mp(sp_digit* r, int size, const mp_int* a)
  200339. {
  200340. #if DIGIT_BIT == 32
  200341. int i;
  200342. int j = 0;
  200343. for (i = 0; i < size; i++) {
  200344. sp_digit mask =
  200345. (((sp_digit)(a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1;
  200346. r[i] = a->dp[j] & mask;
  200347. j += (int)(((sp_digit)1) -
  200348. (((sp_digit)(a->used - i - 2)) >> (SP_WORD_SIZE - 1)));
  200349. }
  200350. #elif DIGIT_BIT > 32
  200351. int i;
  200352. int j = 0;
  200353. word32 s = 0;
  200354. r[0] = 0;
  200355. for (i = 0; i < a->used && j < size; i++) {
  200356. r[j] |= ((sp_digit)a->dp[i] << s);
  200357. r[j] &= 0xffffffff;
  200358. s = 32U - s;
  200359. if (j + 1 >= size) {
  200360. break;
  200361. }
  200362. /* lint allow cast of mismatch word32 and mp_digit */
  200363. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  200364. while ((s + 32U) <= (word32)DIGIT_BIT) {
  200365. s += 32U;
  200366. r[j] &= 0xffffffff;
  200367. if (j + 1 >= size) {
  200368. break;
  200369. }
  200370. if (s < (word32)DIGIT_BIT) {
  200371. /* lint allow cast of mismatch word32 and mp_digit */
  200372. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  200373. }
  200374. else {
  200375. r[++j] = (sp_digit)0;
  200376. }
  200377. }
  200378. s = (word32)DIGIT_BIT - s;
  200379. }
  200380. for (j++; j < size; j++) {
  200381. r[j] = 0;
  200382. }
  200383. #else
  200384. int i;
  200385. int j = 0;
  200386. int s = 0;
  200387. r[0] = 0;
  200388. for (i = 0; i < a->used && j < size; i++) {
  200389. r[j] |= ((sp_digit)a->dp[i]) << s;
  200390. if (s + DIGIT_BIT >= 32) {
  200391. r[j] &= 0xffffffff;
  200392. if (j + 1 >= size) {
  200393. break;
  200394. }
  200395. s = 32 - s;
  200396. if (s == DIGIT_BIT) {
  200397. r[++j] = 0;
  200398. s = 0;
  200399. }
  200400. else {
  200401. r[++j] = a->dp[i] >> s;
  200402. s = DIGIT_BIT - s;
  200403. }
  200404. }
  200405. else {
  200406. s += DIGIT_BIT;
  200407. }
  200408. }
  200409. for (j++; j < size; j++) {
  200410. r[j] = 0;
  200411. }
  200412. #endif
  200413. }
  200414. /* Convert a point of type ecc_point to type sp_point_1024.
  200415. *
  200416. * p Point of type sp_point_1024 (result).
  200417. * pm Point of type ecc_point.
  200418. */
  200419. static void sp_1024_point_from_ecc_point_32(sp_point_1024* p,
  200420. const ecc_point* pm)
  200421. {
  200422. XMEMSET(p->x, 0, sizeof(p->x));
  200423. XMEMSET(p->y, 0, sizeof(p->y));
  200424. XMEMSET(p->z, 0, sizeof(p->z));
  200425. sp_1024_from_mp(p->x, 32, pm->x);
  200426. sp_1024_from_mp(p->y, 32, pm->y);
  200427. sp_1024_from_mp(p->z, 32, pm->z);
  200428. p->infinity = 0;
  200429. }
  200430. /* Convert an array of sp_digit to an mp_int.
  200431. *
  200432. * a A single precision integer.
  200433. * r A multi-precision integer.
  200434. */
  200435. static int sp_1024_to_mp(const sp_digit* a, mp_int* r)
  200436. {
  200437. int err;
  200438. err = mp_grow(r, (1024 + DIGIT_BIT - 1) / DIGIT_BIT);
  200439. if (err == MP_OKAY) { /*lint !e774 case where err is always MP_OKAY*/
  200440. #if DIGIT_BIT == 32
  200441. XMEMCPY(r->dp, a, sizeof(sp_digit) * 32);
  200442. r->used = 32;
  200443. mp_clamp(r);
  200444. #elif DIGIT_BIT < 32
  200445. int i;
  200446. int j = 0;
  200447. int s = 0;
  200448. r->dp[0] = 0;
  200449. for (i = 0; i < 32; i++) {
  200450. r->dp[j] |= (mp_digit)(a[i] << s);
  200451. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  200452. s = DIGIT_BIT - s;
  200453. r->dp[++j] = (mp_digit)(a[i] >> s);
  200454. while (s + DIGIT_BIT <= 32) {
  200455. s += DIGIT_BIT;
  200456. r->dp[j++] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  200457. if (s == SP_WORD_SIZE) {
  200458. r->dp[j] = 0;
  200459. }
  200460. else {
  200461. r->dp[j] = (mp_digit)(a[i] >> s);
  200462. }
  200463. }
  200464. s = 32 - s;
  200465. }
  200466. r->used = (1024 + DIGIT_BIT - 1) / DIGIT_BIT;
  200467. mp_clamp(r);
  200468. #else
  200469. int i;
  200470. int j = 0;
  200471. int s = 0;
  200472. r->dp[0] = 0;
  200473. for (i = 0; i < 32; i++) {
  200474. r->dp[j] |= ((mp_digit)a[i]) << s;
  200475. if (s + 32 >= DIGIT_BIT) {
  200476. #if DIGIT_BIT != 32 && DIGIT_BIT != 64
  200477. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  200478. #endif
  200479. s = DIGIT_BIT - s;
  200480. r->dp[++j] = a[i] >> s;
  200481. s = 32 - s;
  200482. }
  200483. else {
  200484. s += 32;
  200485. }
  200486. }
  200487. r->used = (1024 + DIGIT_BIT - 1) / DIGIT_BIT;
  200488. mp_clamp(r);
  200489. #endif
  200490. }
  200491. return err;
  200492. }
  200493. /* Convert a point of type sp_point_1024 to type ecc_point.
  200494. *
  200495. * p Point of type sp_point_1024.
  200496. * pm Point of type ecc_point (result).
  200497. * returns MEMORY_E when allocation of memory in ecc_point fails otherwise
  200498. * MP_OKAY.
  200499. */
  200500. static int sp_1024_point_to_ecc_point_32(const sp_point_1024* p, ecc_point* pm)
  200501. {
  200502. int err;
  200503. err = sp_1024_to_mp(p->x, pm->x);
  200504. if (err == MP_OKAY) {
  200505. err = sp_1024_to_mp(p->y, pm->y);
  200506. }
  200507. if (err == MP_OKAY) {
  200508. err = sp_1024_to_mp(p->z, pm->z);
  200509. }
  200510. return err;
  200511. }
  200512. /* Reduce the number back to 1024 bits using Montgomery reduction.
  200513. *
  200514. * a A single precision number to reduce in place.
  200515. * m The single precision number representing the modulus.
  200516. * mp The digit representing the negative inverse of m mod 2^n.
  200517. */
  200518. SP_NOINLINE static void sp_1024_mont_reduce_32(sp_digit* a, const sp_digit* m,
  200519. sp_digit mp)
  200520. {
  200521. __asm__ __volatile__ (
  200522. "movs r7, #0\n\t"
  200523. "mov r8, %[mp]\n\t"
  200524. "mov r12, r7\n\t"
  200525. "mov lr, %[m]\n\t"
  200526. "mov r9, %[a]\n\t"
  200527. "mov r11, %[a]\n\t"
  200528. "movs r5, #0x7c\n\t"
  200529. "movs r6, #0x80\n\t"
  200530. "add r9, r9, r5\n\t"
  200531. "add r11, r11, r6\n\t"
  200532. "\n"
  200533. "L_sp_1024_mont_reduce_32_mod_%=:\n\t"
  200534. "movs r7, #0\n\t"
  200535. "movs r4, #0\n\t"
  200536. "# a[i] += m[0] * mu\n\t"
  200537. "ldm %[m]!, {%[mp]}\n\t"
  200538. "ldm %[a]!, {r3}\n\t"
  200539. "# mu = a[i] * mp\n\t"
  200540. "mov r5, r8\n\t"
  200541. #ifdef WOLFSSL_KEIL
  200542. "muls r5, r3, r5\n\t"
  200543. #elif defined(__clang__)
  200544. "muls r5, r3\n\t"
  200545. #else
  200546. "mul r5, r3\n\t"
  200547. #endif
  200548. "mov r10, r5\n\t"
  200549. "# Multiply m[0] and mu - Start\n\t"
  200550. "mov r5, r10\n\t"
  200551. "uxth r6, %[mp]\n\t"
  200552. "uxth r5, r5\n\t"
  200553. #ifdef WOLFSSL_KEIL
  200554. "muls r6, r5, r6\n\t"
  200555. #elif defined(__clang__)
  200556. "muls r6, r5\n\t"
  200557. #else
  200558. "mul r6, r5\n\t"
  200559. #endif
  200560. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200561. "adds r3, r3, r6\n\t"
  200562. #else
  200563. "add r3, r3, r6\n\t"
  200564. #endif
  200565. #ifdef WOLFSSL_KEIL
  200566. "adcs r4, r4, r7\n\t"
  200567. #elif defined(__clang__)
  200568. "adcs r4, r7\n\t"
  200569. #else
  200570. "adc r4, r7\n\t"
  200571. #endif
  200572. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200573. "lsrs r6, %[mp], #16\n\t"
  200574. #else
  200575. "lsr r6, %[mp], #16\n\t"
  200576. #endif
  200577. #ifdef WOLFSSL_KEIL
  200578. "muls r5, r6, r5\n\t"
  200579. #elif defined(__clang__)
  200580. "muls r5, r6\n\t"
  200581. #else
  200582. "mul r5, r6\n\t"
  200583. #endif
  200584. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200585. "lsrs r6, r5, #16\n\t"
  200586. #else
  200587. "lsr r6, r5, #16\n\t"
  200588. #endif
  200589. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200590. "lsls r5, r5, #16\n\t"
  200591. #else
  200592. "lsl r5, r5, #16\n\t"
  200593. #endif
  200594. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200595. "adds r3, r3, r5\n\t"
  200596. #else
  200597. "add r3, r3, r5\n\t"
  200598. #endif
  200599. #ifdef WOLFSSL_KEIL
  200600. "adcs r4, r4, r6\n\t"
  200601. #elif defined(__clang__)
  200602. "adcs r4, r6\n\t"
  200603. #else
  200604. "adc r4, r6\n\t"
  200605. #endif
  200606. "mov r5, r10\n\t"
  200607. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200608. "lsrs r6, %[mp], #16\n\t"
  200609. #else
  200610. "lsr r6, %[mp], #16\n\t"
  200611. #endif
  200612. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200613. "lsrs r5, r5, #16\n\t"
  200614. #else
  200615. "lsr r5, r5, #16\n\t"
  200616. #endif
  200617. #ifdef WOLFSSL_KEIL
  200618. "muls r6, r5, r6\n\t"
  200619. #elif defined(__clang__)
  200620. "muls r6, r5\n\t"
  200621. #else
  200622. "mul r6, r5\n\t"
  200623. #endif
  200624. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200625. "adds r4, r4, r6\n\t"
  200626. #else
  200627. "add r4, r4, r6\n\t"
  200628. #endif
  200629. "uxth r6, %[mp]\n\t"
  200630. #ifdef WOLFSSL_KEIL
  200631. "muls r5, r6, r5\n\t"
  200632. #elif defined(__clang__)
  200633. "muls r5, r6\n\t"
  200634. #else
  200635. "mul r5, r6\n\t"
  200636. #endif
  200637. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200638. "lsrs r6, r5, #16\n\t"
  200639. #else
  200640. "lsr r6, r5, #16\n\t"
  200641. #endif
  200642. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200643. "lsls r5, r5, #16\n\t"
  200644. #else
  200645. "lsl r5, r5, #16\n\t"
  200646. #endif
  200647. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200648. "adds r3, r3, r5\n\t"
  200649. #else
  200650. "add r3, r3, r5\n\t"
  200651. #endif
  200652. #ifdef WOLFSSL_KEIL
  200653. "adcs r4, r4, r6\n\t"
  200654. #elif defined(__clang__)
  200655. "adcs r4, r6\n\t"
  200656. #else
  200657. "adc r4, r6\n\t"
  200658. #endif
  200659. "# Multiply m[0] and mu - Done\n\t"
  200660. "\n"
  200661. "L_sp_1024_mont_reduce_32_word_%=:\n\t"
  200662. "# a[i+j] += m[j] * mu\n\t"
  200663. "ldr r3, [%[a]]\n\t"
  200664. "ldm %[m]!, {%[mp]}\n\t"
  200665. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200666. "adds r3, r3, r4\n\t"
  200667. #else
  200668. "add r3, r3, r4\n\t"
  200669. #endif
  200670. "movs r4, #0\n\t"
  200671. #ifdef WOLFSSL_KEIL
  200672. "adcs r4, r4, r7\n\t"
  200673. #elif defined(__clang__)
  200674. "adcs r4, r7\n\t"
  200675. #else
  200676. "adc r4, r7\n\t"
  200677. #endif
  200678. "# Multiply m[j] and mu - Start\n\t"
  200679. "mov r5, r10\n\t"
  200680. "uxth r6, %[mp]\n\t"
  200681. "uxth r5, r5\n\t"
  200682. #ifdef WOLFSSL_KEIL
  200683. "muls r6, r5, r6\n\t"
  200684. #elif defined(__clang__)
  200685. "muls r6, r5\n\t"
  200686. #else
  200687. "mul r6, r5\n\t"
  200688. #endif
  200689. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200690. "adds r3, r3, r6\n\t"
  200691. #else
  200692. "add r3, r3, r6\n\t"
  200693. #endif
  200694. #ifdef WOLFSSL_KEIL
  200695. "adcs r4, r4, r7\n\t"
  200696. #elif defined(__clang__)
  200697. "adcs r4, r7\n\t"
  200698. #else
  200699. "adc r4, r7\n\t"
  200700. #endif
  200701. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200702. "lsrs r6, %[mp], #16\n\t"
  200703. #else
  200704. "lsr r6, %[mp], #16\n\t"
  200705. #endif
  200706. #ifdef WOLFSSL_KEIL
  200707. "muls r5, r6, r5\n\t"
  200708. #elif defined(__clang__)
  200709. "muls r5, r6\n\t"
  200710. #else
  200711. "mul r5, r6\n\t"
  200712. #endif
  200713. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200714. "lsrs r6, r5, #16\n\t"
  200715. #else
  200716. "lsr r6, r5, #16\n\t"
  200717. #endif
  200718. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200719. "lsls r5, r5, #16\n\t"
  200720. #else
  200721. "lsl r5, r5, #16\n\t"
  200722. #endif
  200723. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200724. "adds r3, r3, r5\n\t"
  200725. #else
  200726. "add r3, r3, r5\n\t"
  200727. #endif
  200728. #ifdef WOLFSSL_KEIL
  200729. "adcs r4, r4, r6\n\t"
  200730. #elif defined(__clang__)
  200731. "adcs r4, r6\n\t"
  200732. #else
  200733. "adc r4, r6\n\t"
  200734. #endif
  200735. "mov r5, r10\n\t"
  200736. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200737. "lsrs r6, %[mp], #16\n\t"
  200738. #else
  200739. "lsr r6, %[mp], #16\n\t"
  200740. #endif
  200741. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200742. "lsrs r5, r5, #16\n\t"
  200743. #else
  200744. "lsr r5, r5, #16\n\t"
  200745. #endif
  200746. #ifdef WOLFSSL_KEIL
  200747. "muls r6, r5, r6\n\t"
  200748. #elif defined(__clang__)
  200749. "muls r6, r5\n\t"
  200750. #else
  200751. "mul r6, r5\n\t"
  200752. #endif
  200753. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200754. "adds r4, r4, r6\n\t"
  200755. #else
  200756. "add r4, r4, r6\n\t"
  200757. #endif
  200758. "uxth r6, %[mp]\n\t"
  200759. #ifdef WOLFSSL_KEIL
  200760. "muls r5, r6, r5\n\t"
  200761. #elif defined(__clang__)
  200762. "muls r5, r6\n\t"
  200763. #else
  200764. "mul r5, r6\n\t"
  200765. #endif
  200766. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200767. "lsrs r6, r5, #16\n\t"
  200768. #else
  200769. "lsr r6, r5, #16\n\t"
  200770. #endif
  200771. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200772. "lsls r5, r5, #16\n\t"
  200773. #else
  200774. "lsl r5, r5, #16\n\t"
  200775. #endif
  200776. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200777. "adds r3, r3, r5\n\t"
  200778. #else
  200779. "add r3, r3, r5\n\t"
  200780. #endif
  200781. #ifdef WOLFSSL_KEIL
  200782. "adcs r4, r4, r6\n\t"
  200783. #elif defined(__clang__)
  200784. "adcs r4, r6\n\t"
  200785. #else
  200786. "adc r4, r6\n\t"
  200787. #endif
  200788. "# Multiply m[j] and mu - Done\n\t"
  200789. "stm %[a]!, {r3}\n\t"
  200790. "cmp %[a], r9\n\t"
  200791. "blt L_sp_1024_mont_reduce_32_word_%=\n\t"
  200792. "# a[i+31] += m[31] * mu\n\t"
  200793. "ldr %[mp], [%[m]]\n\t"
  200794. "mov r3, r12\n\t"
  200795. "# Multiply m[31] and mu - Start\n\t"
  200796. "mov r5, r10\n\t"
  200797. "uxth r6, %[mp]\n\t"
  200798. "uxth r5, r5\n\t"
  200799. #ifdef WOLFSSL_KEIL
  200800. "muls r6, r5, r6\n\t"
  200801. #elif defined(__clang__)
  200802. "muls r6, r5\n\t"
  200803. #else
  200804. "mul r6, r5\n\t"
  200805. #endif
  200806. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200807. "adds r4, r4, r6\n\t"
  200808. #else
  200809. "add r4, r4, r6\n\t"
  200810. #endif
  200811. #ifdef WOLFSSL_KEIL
  200812. "adcs r3, r3, r7\n\t"
  200813. #elif defined(__clang__)
  200814. "adcs r3, r7\n\t"
  200815. #else
  200816. "adc r3, r7\n\t"
  200817. #endif
  200818. #ifdef WOLFSSL_KEIL
  200819. "adcs r7, r7, r7\n\t"
  200820. #elif defined(__clang__)
  200821. "adcs r7, r7\n\t"
  200822. #else
  200823. "adc r7, r7\n\t"
  200824. #endif
  200825. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200826. "lsrs r6, %[mp], #16\n\t"
  200827. #else
  200828. "lsr r6, %[mp], #16\n\t"
  200829. #endif
  200830. #ifdef WOLFSSL_KEIL
  200831. "muls r5, r6, r5\n\t"
  200832. #elif defined(__clang__)
  200833. "muls r5, r6\n\t"
  200834. #else
  200835. "mul r5, r6\n\t"
  200836. #endif
  200837. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200838. "lsrs r6, r5, #16\n\t"
  200839. #else
  200840. "lsr r6, r5, #16\n\t"
  200841. #endif
  200842. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200843. "lsls r5, r5, #16\n\t"
  200844. #else
  200845. "lsl r5, r5, #16\n\t"
  200846. #endif
  200847. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200848. "adds r4, r4, r5\n\t"
  200849. #else
  200850. "add r4, r4, r5\n\t"
  200851. #endif
  200852. #ifdef WOLFSSL_KEIL
  200853. "adcs r3, r3, r6\n\t"
  200854. #elif defined(__clang__)
  200855. "adcs r3, r6\n\t"
  200856. #else
  200857. "adc r3, r6\n\t"
  200858. #endif
  200859. #ifdef WOLFSSL_KEIL
  200860. "adcs r7, r7, r7\n\t"
  200861. #elif defined(__clang__)
  200862. "adcs r7, r7\n\t"
  200863. #else
  200864. "adc r7, r7\n\t"
  200865. #endif
  200866. "mov r5, r10\n\t"
  200867. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200868. "lsrs r6, %[mp], #16\n\t"
  200869. #else
  200870. "lsr r6, %[mp], #16\n\t"
  200871. #endif
  200872. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200873. "lsrs r5, r5, #16\n\t"
  200874. #else
  200875. "lsr r5, r5, #16\n\t"
  200876. #endif
  200877. #ifdef WOLFSSL_KEIL
  200878. "muls r6, r5, r6\n\t"
  200879. #elif defined(__clang__)
  200880. "muls r6, r5\n\t"
  200881. #else
  200882. "mul r6, r5\n\t"
  200883. #endif
  200884. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200885. "adds r3, r3, r6\n\t"
  200886. #else
  200887. "add r3, r3, r6\n\t"
  200888. #endif
  200889. #ifdef WOLFSSL_KEIL
  200890. "adcs r7, r7, r7\n\t"
  200891. #elif defined(__clang__)
  200892. "adcs r7, r7\n\t"
  200893. #else
  200894. "adc r7, r7\n\t"
  200895. #endif
  200896. "uxth r6, %[mp]\n\t"
  200897. #ifdef WOLFSSL_KEIL
  200898. "muls r5, r6, r5\n\t"
  200899. #elif defined(__clang__)
  200900. "muls r5, r6\n\t"
  200901. #else
  200902. "mul r5, r6\n\t"
  200903. #endif
  200904. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200905. "lsrs r6, r5, #16\n\t"
  200906. #else
  200907. "lsr r6, r5, #16\n\t"
  200908. #endif
  200909. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200910. "lsls r5, r5, #16\n\t"
  200911. #else
  200912. "lsl r5, r5, #16\n\t"
  200913. #endif
  200914. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200915. "adds r4, r4, r5\n\t"
  200916. #else
  200917. "add r4, r4, r5\n\t"
  200918. #endif
  200919. #ifdef WOLFSSL_KEIL
  200920. "adcs r3, r3, r6\n\t"
  200921. #elif defined(__clang__)
  200922. "adcs r3, r6\n\t"
  200923. #else
  200924. "adc r3, r6\n\t"
  200925. #endif
  200926. #ifdef WOLFSSL_KEIL
  200927. "adcs r7, r7, r7\n\t"
  200928. #elif defined(__clang__)
  200929. "adcs r7, r7\n\t"
  200930. #else
  200931. "adc r7, r7\n\t"
  200932. #endif
  200933. "# Multiply m[31] and mu - Done\n\t"
  200934. "ldr r5, [%[a]]\n\t"
  200935. "ldr r6, [%[a], #4]\n\t"
  200936. "movs %[mp], #0\n\t"
  200937. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200938. "adds r5, r5, r4\n\t"
  200939. #else
  200940. "add r5, r5, r4\n\t"
  200941. #endif
  200942. #ifdef WOLFSSL_KEIL
  200943. "adcs r6, r6, r3\n\t"
  200944. #elif defined(__clang__)
  200945. "adcs r6, r3\n\t"
  200946. #else
  200947. "adc r6, r3\n\t"
  200948. #endif
  200949. #ifdef WOLFSSL_KEIL
  200950. "adcs r7, r7, %[mp]\n\t"
  200951. #elif defined(__clang__)
  200952. "adcs r7, %[mp]\n\t"
  200953. #else
  200954. "adc r7, %[mp]\n\t"
  200955. #endif
  200956. "stm %[a]!, {r5, r6}\n\t"
  200957. "# i += 1\n\t"
  200958. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200959. "subs %[a], %[a], #4\n\t"
  200960. #else
  200961. "sub %[a], %[a], #4\n\t"
  200962. #endif
  200963. "movs r3, #0x7c\n\t"
  200964. "mov r9, %[a]\n\t"
  200965. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200966. "subs %[a], %[a], r3\n\t"
  200967. #else
  200968. "sub %[a], %[a], r3\n\t"
  200969. #endif
  200970. "mov r12, r7\n\t"
  200971. "mov %[m], lr\n\t"
  200972. "cmp r11, %[a]\n\t"
  200973. "bgt L_sp_1024_mont_reduce_32_mod_%=\n\t"
  200974. "ldr r5, [%[m], #124]\n\t"
  200975. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200976. "negs r7, r7\n\t"
  200977. #else
  200978. "neg r7, r7\n\t"
  200979. #endif
  200980. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200981. "subs r5, r5, r6\n\t"
  200982. #else
  200983. "sub r5, r5, r6\n\t"
  200984. #endif
  200985. #ifdef WOLFSSL_KEIL
  200986. "sbcs r5, r5, r5\n\t"
  200987. #elif defined(__clang__)
  200988. "sbcs r5, r5\n\t"
  200989. #else
  200990. "sbc r5, r5\n\t"
  200991. #endif
  200992. #ifdef WOLFSSL_KEIL
  200993. "orrs r7, r7, r5\n\t"
  200994. #elif defined(__clang__)
  200995. "orrs r7, r5\n\t"
  200996. #else
  200997. "orr r7, r5\n\t"
  200998. #endif
  200999. "# Subtract masked modulus\n\t"
  201000. "movs r4, #0x80\n\t"
  201001. "movs %[mp], #0\n\t"
  201002. "movs r3, #0\n\t"
  201003. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  201004. "subs %[a], %[a], r4\n\t"
  201005. #else
  201006. "sub %[a], %[a], r4\n\t"
  201007. #endif
  201008. #ifndef WOLFSSL_SP_LARGE_CODE
  201009. "\n"
  201010. "L_sp_1024_mont_reduce_32_sub_mask_%=:\n\t"
  201011. "ldm %[m]!, {r6}\n\t"
  201012. "movs r5, #0\n\t"
  201013. #ifdef WOLFSSL_KEIL
  201014. "ands r6, r6, r7\n\t"
  201015. #elif defined(__clang__)
  201016. "ands r6, r7\n\t"
  201017. #else
  201018. "and r6, r7\n\t"
  201019. #endif
  201020. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  201021. "subs r5, r5, %[mp]\n\t"
  201022. #else
  201023. "sub r5, r5, %[mp]\n\t"
  201024. #endif
  201025. "ldr r5, [%[a], r4]\n\t"
  201026. #ifdef WOLFSSL_KEIL
  201027. "sbcs r5, r5, r6\n\t"
  201028. #elif defined(__clang__)
  201029. "sbcs r5, r6\n\t"
  201030. #else
  201031. "sbc r5, r6\n\t"
  201032. #endif
  201033. #ifdef WOLFSSL_KEIL
  201034. "sbcs %[mp], %[mp], %[mp]\n\t"
  201035. #elif defined(__clang__)
  201036. "sbcs %[mp], %[mp]\n\t"
  201037. #else
  201038. "sbc %[mp], %[mp]\n\t"
  201039. #endif
  201040. "stm %[a]!, {r5}\n\t"
  201041. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  201042. "adds r3, r3, #4\n\t"
  201043. #else
  201044. "add r3, r3, #4\n\t"
  201045. #endif
  201046. "cmp r3, r4\n\t"
  201047. "blt L_sp_1024_mont_reduce_32_sub_mask_%=\n\t"
  201048. #else /* WOLFSSL_SP_LARGE_CODE */
  201049. "ldm %[m]!, {r6}\n\t"
  201050. #ifdef WOLFSSL_KEIL
  201051. "ands r6, r6, r7\n\t"
  201052. #elif defined(__clang__)
  201053. "ands r6, r7\n\t"
  201054. #else
  201055. "and r6, r7\n\t"
  201056. #endif
  201057. "ldr r5, [%[a], r4]\n\t"
  201058. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  201059. "subs r5, r5, r6\n\t"
  201060. #else
  201061. "sub r5, r5, r6\n\t"
  201062. #endif
  201063. "stm %[a]!, {r5}\n\t"
  201064. "ldm %[m]!, {r6}\n\t"
  201065. #ifdef WOLFSSL_KEIL
  201066. "ands r6, r6, r7\n\t"
  201067. #elif defined(__clang__)
  201068. "ands r6, r7\n\t"
  201069. #else
  201070. "and r6, r7\n\t"
  201071. #endif
  201072. "ldr r5, [%[a], r4]\n\t"
  201073. #ifdef WOLFSSL_KEIL
  201074. "sbcs r5, r5, r6\n\t"
  201075. #elif defined(__clang__)
  201076. "sbcs r5, r6\n\t"
  201077. #else
  201078. "sbc r5, r6\n\t"
  201079. #endif
  201080. "stm %[a]!, {r5}\n\t"
  201081. "ldm %[m]!, {r6}\n\t"
  201082. #ifdef WOLFSSL_KEIL
  201083. "ands r6, r6, r7\n\t"
  201084. #elif defined(__clang__)
  201085. "ands r6, r7\n\t"
  201086. #else
  201087. "and r6, r7\n\t"
  201088. #endif
  201089. "ldr r5, [%[a], r4]\n\t"
  201090. #ifdef WOLFSSL_KEIL
  201091. "sbcs r5, r5, r6\n\t"
  201092. #elif defined(__clang__)
  201093. "sbcs r5, r6\n\t"
  201094. #else
  201095. "sbc r5, r6\n\t"
  201096. #endif
  201097. "stm %[a]!, {r5}\n\t"
  201098. "ldm %[m]!, {r6}\n\t"
  201099. #ifdef WOLFSSL_KEIL
  201100. "ands r6, r6, r7\n\t"
  201101. #elif defined(__clang__)
  201102. "ands r6, r7\n\t"
  201103. #else
  201104. "and r6, r7\n\t"
  201105. #endif
  201106. "ldr r5, [%[a], r4]\n\t"
  201107. #ifdef WOLFSSL_KEIL
  201108. "sbcs r5, r5, r6\n\t"
  201109. #elif defined(__clang__)
  201110. "sbcs r5, r6\n\t"
  201111. #else
  201112. "sbc r5, r6\n\t"
  201113. #endif
  201114. "stm %[a]!, {r5}\n\t"
  201115. "ldm %[m]!, {r6}\n\t"
  201116. #ifdef WOLFSSL_KEIL
  201117. "ands r6, r6, r7\n\t"
  201118. #elif defined(__clang__)
  201119. "ands r6, r7\n\t"
  201120. #else
  201121. "and r6, r7\n\t"
  201122. #endif
  201123. "ldr r5, [%[a], r4]\n\t"
  201124. #ifdef WOLFSSL_KEIL
  201125. "sbcs r5, r5, r6\n\t"
  201126. #elif defined(__clang__)
  201127. "sbcs r5, r6\n\t"
  201128. #else
  201129. "sbc r5, r6\n\t"
  201130. #endif
  201131. "stm %[a]!, {r5}\n\t"
  201132. "ldm %[m]!, {r6}\n\t"
  201133. #ifdef WOLFSSL_KEIL
  201134. "ands r6, r6, r7\n\t"
  201135. #elif defined(__clang__)
  201136. "ands r6, r7\n\t"
  201137. #else
  201138. "and r6, r7\n\t"
  201139. #endif
  201140. "ldr r5, [%[a], r4]\n\t"
  201141. #ifdef WOLFSSL_KEIL
  201142. "sbcs r5, r5, r6\n\t"
  201143. #elif defined(__clang__)
  201144. "sbcs r5, r6\n\t"
  201145. #else
  201146. "sbc r5, r6\n\t"
  201147. #endif
  201148. "stm %[a]!, {r5}\n\t"
  201149. "ldm %[m]!, {r6}\n\t"
  201150. #ifdef WOLFSSL_KEIL
  201151. "ands r6, r6, r7\n\t"
  201152. #elif defined(__clang__)
  201153. "ands r6, r7\n\t"
  201154. #else
  201155. "and r6, r7\n\t"
  201156. #endif
  201157. "ldr r5, [%[a], r4]\n\t"
  201158. #ifdef WOLFSSL_KEIL
  201159. "sbcs r5, r5, r6\n\t"
  201160. #elif defined(__clang__)
  201161. "sbcs r5, r6\n\t"
  201162. #else
  201163. "sbc r5, r6\n\t"
  201164. #endif
  201165. "stm %[a]!, {r5}\n\t"
  201166. "ldm %[m]!, {r6}\n\t"
  201167. #ifdef WOLFSSL_KEIL
  201168. "ands r6, r6, r7\n\t"
  201169. #elif defined(__clang__)
  201170. "ands r6, r7\n\t"
  201171. #else
  201172. "and r6, r7\n\t"
  201173. #endif
  201174. "ldr r5, [%[a], r4]\n\t"
  201175. #ifdef WOLFSSL_KEIL
  201176. "sbcs r5, r5, r6\n\t"
  201177. #elif defined(__clang__)
  201178. "sbcs r5, r6\n\t"
  201179. #else
  201180. "sbc r5, r6\n\t"
  201181. #endif
  201182. "stm %[a]!, {r5}\n\t"
  201183. "ldm %[m]!, {r6}\n\t"
  201184. #ifdef WOLFSSL_KEIL
  201185. "ands r6, r6, r7\n\t"
  201186. #elif defined(__clang__)
  201187. "ands r6, r7\n\t"
  201188. #else
  201189. "and r6, r7\n\t"
  201190. #endif
  201191. "ldr r5, [%[a], r4]\n\t"
  201192. #ifdef WOLFSSL_KEIL
  201193. "sbcs r5, r5, r6\n\t"
  201194. #elif defined(__clang__)
  201195. "sbcs r5, r6\n\t"
  201196. #else
  201197. "sbc r5, r6\n\t"
  201198. #endif
  201199. "stm %[a]!, {r5}\n\t"
  201200. "ldm %[m]!, {r6}\n\t"
  201201. #ifdef WOLFSSL_KEIL
  201202. "ands r6, r6, r7\n\t"
  201203. #elif defined(__clang__)
  201204. "ands r6, r7\n\t"
  201205. #else
  201206. "and r6, r7\n\t"
  201207. #endif
  201208. "ldr r5, [%[a], r4]\n\t"
  201209. #ifdef WOLFSSL_KEIL
  201210. "sbcs r5, r5, r6\n\t"
  201211. #elif defined(__clang__)
  201212. "sbcs r5, r6\n\t"
  201213. #else
  201214. "sbc r5, r6\n\t"
  201215. #endif
  201216. "stm %[a]!, {r5}\n\t"
  201217. "ldm %[m]!, {r6}\n\t"
  201218. #ifdef WOLFSSL_KEIL
  201219. "ands r6, r6, r7\n\t"
  201220. #elif defined(__clang__)
  201221. "ands r6, r7\n\t"
  201222. #else
  201223. "and r6, r7\n\t"
  201224. #endif
  201225. "ldr r5, [%[a], r4]\n\t"
  201226. #ifdef WOLFSSL_KEIL
  201227. "sbcs r5, r5, r6\n\t"
  201228. #elif defined(__clang__)
  201229. "sbcs r5, r6\n\t"
  201230. #else
  201231. "sbc r5, r6\n\t"
  201232. #endif
  201233. "stm %[a]!, {r5}\n\t"
  201234. "ldm %[m]!, {r6}\n\t"
  201235. #ifdef WOLFSSL_KEIL
  201236. "ands r6, r6, r7\n\t"
  201237. #elif defined(__clang__)
  201238. "ands r6, r7\n\t"
  201239. #else
  201240. "and r6, r7\n\t"
  201241. #endif
  201242. "ldr r5, [%[a], r4]\n\t"
  201243. #ifdef WOLFSSL_KEIL
  201244. "sbcs r5, r5, r6\n\t"
  201245. #elif defined(__clang__)
  201246. "sbcs r5, r6\n\t"
  201247. #else
  201248. "sbc r5, r6\n\t"
  201249. #endif
  201250. "stm %[a]!, {r5}\n\t"
  201251. "ldm %[m]!, {r6}\n\t"
  201252. #ifdef WOLFSSL_KEIL
  201253. "ands r6, r6, r7\n\t"
  201254. #elif defined(__clang__)
  201255. "ands r6, r7\n\t"
  201256. #else
  201257. "and r6, r7\n\t"
  201258. #endif
  201259. "ldr r5, [%[a], r4]\n\t"
  201260. #ifdef WOLFSSL_KEIL
  201261. "sbcs r5, r5, r6\n\t"
  201262. #elif defined(__clang__)
  201263. "sbcs r5, r6\n\t"
  201264. #else
  201265. "sbc r5, r6\n\t"
  201266. #endif
  201267. "stm %[a]!, {r5}\n\t"
  201268. "ldm %[m]!, {r6}\n\t"
  201269. #ifdef WOLFSSL_KEIL
  201270. "ands r6, r6, r7\n\t"
  201271. #elif defined(__clang__)
  201272. "ands r6, r7\n\t"
  201273. #else
  201274. "and r6, r7\n\t"
  201275. #endif
  201276. "ldr r5, [%[a], r4]\n\t"
  201277. #ifdef WOLFSSL_KEIL
  201278. "sbcs r5, r5, r6\n\t"
  201279. #elif defined(__clang__)
  201280. "sbcs r5, r6\n\t"
  201281. #else
  201282. "sbc r5, r6\n\t"
  201283. #endif
  201284. "stm %[a]!, {r5}\n\t"
  201285. "ldm %[m]!, {r6}\n\t"
  201286. #ifdef WOLFSSL_KEIL
  201287. "ands r6, r6, r7\n\t"
  201288. #elif defined(__clang__)
  201289. "ands r6, r7\n\t"
  201290. #else
  201291. "and r6, r7\n\t"
  201292. #endif
  201293. "ldr r5, [%[a], r4]\n\t"
  201294. #ifdef WOLFSSL_KEIL
  201295. "sbcs r5, r5, r6\n\t"
  201296. #elif defined(__clang__)
  201297. "sbcs r5, r6\n\t"
  201298. #else
  201299. "sbc r5, r6\n\t"
  201300. #endif
  201301. "stm %[a]!, {r5}\n\t"
  201302. "ldm %[m]!, {r6}\n\t"
  201303. #ifdef WOLFSSL_KEIL
  201304. "ands r6, r6, r7\n\t"
  201305. #elif defined(__clang__)
  201306. "ands r6, r7\n\t"
  201307. #else
  201308. "and r6, r7\n\t"
  201309. #endif
  201310. "ldr r5, [%[a], r4]\n\t"
  201311. #ifdef WOLFSSL_KEIL
  201312. "sbcs r5, r5, r6\n\t"
  201313. #elif defined(__clang__)
  201314. "sbcs r5, r6\n\t"
  201315. #else
  201316. "sbc r5, r6\n\t"
  201317. #endif
  201318. "stm %[a]!, {r5}\n\t"
  201319. "ldm %[m]!, {r6}\n\t"
  201320. #ifdef WOLFSSL_KEIL
  201321. "ands r6, r6, r7\n\t"
  201322. #elif defined(__clang__)
  201323. "ands r6, r7\n\t"
  201324. #else
  201325. "and r6, r7\n\t"
  201326. #endif
  201327. "ldr r5, [%[a], r4]\n\t"
  201328. #ifdef WOLFSSL_KEIL
  201329. "sbcs r5, r5, r6\n\t"
  201330. #elif defined(__clang__)
  201331. "sbcs r5, r6\n\t"
  201332. #else
  201333. "sbc r5, r6\n\t"
  201334. #endif
  201335. "stm %[a]!, {r5}\n\t"
  201336. "ldm %[m]!, {r6}\n\t"
  201337. #ifdef WOLFSSL_KEIL
  201338. "ands r6, r6, r7\n\t"
  201339. #elif defined(__clang__)
  201340. "ands r6, r7\n\t"
  201341. #else
  201342. "and r6, r7\n\t"
  201343. #endif
  201344. "ldr r5, [%[a], r4]\n\t"
  201345. #ifdef WOLFSSL_KEIL
  201346. "sbcs r5, r5, r6\n\t"
  201347. #elif defined(__clang__)
  201348. "sbcs r5, r6\n\t"
  201349. #else
  201350. "sbc r5, r6\n\t"
  201351. #endif
  201352. "stm %[a]!, {r5}\n\t"
  201353. "ldm %[m]!, {r6}\n\t"
  201354. #ifdef WOLFSSL_KEIL
  201355. "ands r6, r6, r7\n\t"
  201356. #elif defined(__clang__)
  201357. "ands r6, r7\n\t"
  201358. #else
  201359. "and r6, r7\n\t"
  201360. #endif
  201361. "ldr r5, [%[a], r4]\n\t"
  201362. #ifdef WOLFSSL_KEIL
  201363. "sbcs r5, r5, r6\n\t"
  201364. #elif defined(__clang__)
  201365. "sbcs r5, r6\n\t"
  201366. #else
  201367. "sbc r5, r6\n\t"
  201368. #endif
  201369. "stm %[a]!, {r5}\n\t"
  201370. "ldm %[m]!, {r6}\n\t"
  201371. #ifdef WOLFSSL_KEIL
  201372. "ands r6, r6, r7\n\t"
  201373. #elif defined(__clang__)
  201374. "ands r6, r7\n\t"
  201375. #else
  201376. "and r6, r7\n\t"
  201377. #endif
  201378. "ldr r5, [%[a], r4]\n\t"
  201379. #ifdef WOLFSSL_KEIL
  201380. "sbcs r5, r5, r6\n\t"
  201381. #elif defined(__clang__)
  201382. "sbcs r5, r6\n\t"
  201383. #else
  201384. "sbc r5, r6\n\t"
  201385. #endif
  201386. "stm %[a]!, {r5}\n\t"
  201387. "ldm %[m]!, {r6}\n\t"
  201388. #ifdef WOLFSSL_KEIL
  201389. "ands r6, r6, r7\n\t"
  201390. #elif defined(__clang__)
  201391. "ands r6, r7\n\t"
  201392. #else
  201393. "and r6, r7\n\t"
  201394. #endif
  201395. "ldr r5, [%[a], r4]\n\t"
  201396. #ifdef WOLFSSL_KEIL
  201397. "sbcs r5, r5, r6\n\t"
  201398. #elif defined(__clang__)
  201399. "sbcs r5, r6\n\t"
  201400. #else
  201401. "sbc r5, r6\n\t"
  201402. #endif
  201403. "stm %[a]!, {r5}\n\t"
  201404. "ldm %[m]!, {r6}\n\t"
  201405. #ifdef WOLFSSL_KEIL
  201406. "ands r6, r6, r7\n\t"
  201407. #elif defined(__clang__)
  201408. "ands r6, r7\n\t"
  201409. #else
  201410. "and r6, r7\n\t"
  201411. #endif
  201412. "ldr r5, [%[a], r4]\n\t"
  201413. #ifdef WOLFSSL_KEIL
  201414. "sbcs r5, r5, r6\n\t"
  201415. #elif defined(__clang__)
  201416. "sbcs r5, r6\n\t"
  201417. #else
  201418. "sbc r5, r6\n\t"
  201419. #endif
  201420. "stm %[a]!, {r5}\n\t"
  201421. "ldm %[m]!, {r6}\n\t"
  201422. #ifdef WOLFSSL_KEIL
  201423. "ands r6, r6, r7\n\t"
  201424. #elif defined(__clang__)
  201425. "ands r6, r7\n\t"
  201426. #else
  201427. "and r6, r7\n\t"
  201428. #endif
  201429. "ldr r5, [%[a], r4]\n\t"
  201430. #ifdef WOLFSSL_KEIL
  201431. "sbcs r5, r5, r6\n\t"
  201432. #elif defined(__clang__)
  201433. "sbcs r5, r6\n\t"
  201434. #else
  201435. "sbc r5, r6\n\t"
  201436. #endif
  201437. "stm %[a]!, {r5}\n\t"
  201438. "ldm %[m]!, {r6}\n\t"
  201439. #ifdef WOLFSSL_KEIL
  201440. "ands r6, r6, r7\n\t"
  201441. #elif defined(__clang__)
  201442. "ands r6, r7\n\t"
  201443. #else
  201444. "and r6, r7\n\t"
  201445. #endif
  201446. "ldr r5, [%[a], r4]\n\t"
  201447. #ifdef WOLFSSL_KEIL
  201448. "sbcs r5, r5, r6\n\t"
  201449. #elif defined(__clang__)
  201450. "sbcs r5, r6\n\t"
  201451. #else
  201452. "sbc r5, r6\n\t"
  201453. #endif
  201454. "stm %[a]!, {r5}\n\t"
  201455. "ldm %[m]!, {r6}\n\t"
  201456. #ifdef WOLFSSL_KEIL
  201457. "ands r6, r6, r7\n\t"
  201458. #elif defined(__clang__)
  201459. "ands r6, r7\n\t"
  201460. #else
  201461. "and r6, r7\n\t"
  201462. #endif
  201463. "ldr r5, [%[a], r4]\n\t"
  201464. #ifdef WOLFSSL_KEIL
  201465. "sbcs r5, r5, r6\n\t"
  201466. #elif defined(__clang__)
  201467. "sbcs r5, r6\n\t"
  201468. #else
  201469. "sbc r5, r6\n\t"
  201470. #endif
  201471. "stm %[a]!, {r5}\n\t"
  201472. "ldm %[m]!, {r6}\n\t"
  201473. #ifdef WOLFSSL_KEIL
  201474. "ands r6, r6, r7\n\t"
  201475. #elif defined(__clang__)
  201476. "ands r6, r7\n\t"
  201477. #else
  201478. "and r6, r7\n\t"
  201479. #endif
  201480. "ldr r5, [%[a], r4]\n\t"
  201481. #ifdef WOLFSSL_KEIL
  201482. "sbcs r5, r5, r6\n\t"
  201483. #elif defined(__clang__)
  201484. "sbcs r5, r6\n\t"
  201485. #else
  201486. "sbc r5, r6\n\t"
  201487. #endif
  201488. "stm %[a]!, {r5}\n\t"
  201489. "ldm %[m]!, {r6}\n\t"
  201490. #ifdef WOLFSSL_KEIL
  201491. "ands r6, r6, r7\n\t"
  201492. #elif defined(__clang__)
  201493. "ands r6, r7\n\t"
  201494. #else
  201495. "and r6, r7\n\t"
  201496. #endif
  201497. "ldr r5, [%[a], r4]\n\t"
  201498. #ifdef WOLFSSL_KEIL
  201499. "sbcs r5, r5, r6\n\t"
  201500. #elif defined(__clang__)
  201501. "sbcs r5, r6\n\t"
  201502. #else
  201503. "sbc r5, r6\n\t"
  201504. #endif
  201505. "stm %[a]!, {r5}\n\t"
  201506. "ldm %[m]!, {r6}\n\t"
  201507. #ifdef WOLFSSL_KEIL
  201508. "ands r6, r6, r7\n\t"
  201509. #elif defined(__clang__)
  201510. "ands r6, r7\n\t"
  201511. #else
  201512. "and r6, r7\n\t"
  201513. #endif
  201514. "ldr r5, [%[a], r4]\n\t"
  201515. #ifdef WOLFSSL_KEIL
  201516. "sbcs r5, r5, r6\n\t"
  201517. #elif defined(__clang__)
  201518. "sbcs r5, r6\n\t"
  201519. #else
  201520. "sbc r5, r6\n\t"
  201521. #endif
  201522. "stm %[a]!, {r5}\n\t"
  201523. "ldm %[m]!, {r6}\n\t"
  201524. #ifdef WOLFSSL_KEIL
  201525. "ands r6, r6, r7\n\t"
  201526. #elif defined(__clang__)
  201527. "ands r6, r7\n\t"
  201528. #else
  201529. "and r6, r7\n\t"
  201530. #endif
  201531. "ldr r5, [%[a], r4]\n\t"
  201532. #ifdef WOLFSSL_KEIL
  201533. "sbcs r5, r5, r6\n\t"
  201534. #elif defined(__clang__)
  201535. "sbcs r5, r6\n\t"
  201536. #else
  201537. "sbc r5, r6\n\t"
  201538. #endif
  201539. "stm %[a]!, {r5}\n\t"
  201540. "ldm %[m]!, {r6}\n\t"
  201541. #ifdef WOLFSSL_KEIL
  201542. "ands r6, r6, r7\n\t"
  201543. #elif defined(__clang__)
  201544. "ands r6, r7\n\t"
  201545. #else
  201546. "and r6, r7\n\t"
  201547. #endif
  201548. "ldr r5, [%[a], r4]\n\t"
  201549. #ifdef WOLFSSL_KEIL
  201550. "sbcs r5, r5, r6\n\t"
  201551. #elif defined(__clang__)
  201552. "sbcs r5, r6\n\t"
  201553. #else
  201554. "sbc r5, r6\n\t"
  201555. #endif
  201556. "stm %[a]!, {r5}\n\t"
  201557. "ldm %[m]!, {r6}\n\t"
  201558. #ifdef WOLFSSL_KEIL
  201559. "ands r6, r6, r7\n\t"
  201560. #elif defined(__clang__)
  201561. "ands r6, r7\n\t"
  201562. #else
  201563. "and r6, r7\n\t"
  201564. #endif
  201565. "ldr r5, [%[a], r4]\n\t"
  201566. #ifdef WOLFSSL_KEIL
  201567. "sbcs r5, r5, r6\n\t"
  201568. #elif defined(__clang__)
  201569. "sbcs r5, r6\n\t"
  201570. #else
  201571. "sbc r5, r6\n\t"
  201572. #endif
  201573. "stm %[a]!, {r5}\n\t"
  201574. "ldm %[m]!, {r6}\n\t"
  201575. #ifdef WOLFSSL_KEIL
  201576. "ands r6, r6, r7\n\t"
  201577. #elif defined(__clang__)
  201578. "ands r6, r7\n\t"
  201579. #else
  201580. "and r6, r7\n\t"
  201581. #endif
  201582. "ldr r5, [%[a], r4]\n\t"
  201583. #ifdef WOLFSSL_KEIL
  201584. "sbcs r5, r5, r6\n\t"
  201585. #elif defined(__clang__)
  201586. "sbcs r5, r6\n\t"
  201587. #else
  201588. "sbc r5, r6\n\t"
  201589. #endif
  201590. "stm %[a]!, {r5}\n\t"
  201591. #endif /* WOLFSSL_SP_LARGE_CODE */
  201592. : [a] "+l" (a), [m] "+l" (m), [mp] "+l" (mp)
  201593. :
  201594. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr"
  201595. );
  201596. }
  201597. /* Multiply two Montgomery form numbers mod the modulus (prime).
  201598. * (r = a * b mod m)
  201599. *
  201600. * r Result of multiplication.
  201601. * a First number to multiply in Montgomery form.
  201602. * b Second number to multiply in Montgomery form.
  201603. * m Modulus (prime).
  201604. * mp Montgomery mulitplier.
  201605. */
  201606. SP_NOINLINE static void sp_1024_mont_mul_32(sp_digit* r, const sp_digit* a,
  201607. const sp_digit* b, const sp_digit* m, sp_digit mp)
  201608. {
  201609. sp_1024_mul_32(r, a, b);
  201610. sp_1024_mont_reduce_32(r, m, mp);
  201611. }
  201612. /* Square the Montgomery form number. (r = a * a mod m)
  201613. *
  201614. * r Result of squaring.
  201615. * a Number to square in Montgomery form.
  201616. * m Modulus (prime).
  201617. * mp Montgomery mulitplier.
  201618. */
  201619. SP_NOINLINE static void sp_1024_mont_sqr_32(sp_digit* r, const sp_digit* a,
  201620. const sp_digit* m, sp_digit mp)
  201621. {
  201622. sp_1024_sqr_32(r, a);
  201623. sp_1024_mont_reduce_32(r, m, mp);
  201624. }
  201625. /* Mod-2 for the P1024 curve. */
  201626. static const uint8_t p1024_mod_minus_2[] = {
  201627. 6,0x06, 7,0x0f, 7,0x0b, 6,0x0c, 7,0x1e, 9,0x09, 7,0x0c, 7,0x1f,
  201628. 6,0x16, 6,0x06, 7,0x0e, 8,0x10, 6,0x03, 8,0x11, 6,0x0d, 7,0x14,
  201629. 9,0x12, 6,0x0f, 7,0x04, 9,0x0d, 6,0x00, 7,0x13, 6,0x01, 6,0x07,
  201630. 8,0x0d, 8,0x00, 6,0x06, 9,0x17, 6,0x14, 6,0x15, 6,0x11, 6,0x0b,
  201631. 9,0x0c, 6,0x1e, 13,0x14, 7,0x0e, 6,0x1d, 12,0x0a, 6,0x0b, 8,0x07,
  201632. 6,0x18, 6,0x0f, 6,0x10, 8,0x1c, 7,0x16, 7,0x02, 6,0x01, 6,0x13,
  201633. 10,0x15, 7,0x06, 8,0x14, 6,0x0c, 6,0x19, 7,0x10, 6,0x19, 6,0x19,
  201634. 9,0x16, 7,0x19, 6,0x1f, 6,0x17, 6,0x12, 8,0x02, 6,0x01, 6,0x04,
  201635. 6,0x15, 7,0x16, 6,0x04, 6,0x1f, 6,0x09, 7,0x06, 7,0x13, 7,0x09,
  201636. 6,0x0d, 10,0x18, 6,0x06, 6,0x11, 6,0x04, 6,0x01, 6,0x13, 8,0x06,
  201637. 6,0x0d, 8,0x13, 7,0x08, 6,0x08, 6,0x05, 7,0x0c, 7,0x0e, 7,0x15,
  201638. 6,0x05, 7,0x14, 10,0x19, 6,0x10, 6,0x16, 6,0x15, 7,0x1f, 6,0x14,
  201639. 6,0x0a, 10,0x11, 6,0x01, 7,0x05, 7,0x08, 8,0x0a, 7,0x1e, 7,0x1c,
  201640. 6,0x1c, 7,0x09, 10,0x18, 7,0x1c, 10,0x06, 6,0x0a, 6,0x07, 6,0x19,
  201641. 7,0x06, 6,0x0d, 7,0x0f, 7,0x0b, 7,0x05, 6,0x11, 6,0x1c, 7,0x1f,
  201642. 6,0x1e, 7,0x18, 6,0x1e, 6,0x00, 6,0x03, 6,0x02, 7,0x10, 6,0x0b,
  201643. 6,0x1b, 7,0x10, 6,0x00, 8,0x11, 7,0x1b, 6,0x18, 6,0x01, 7,0x0c,
  201644. 7,0x1d, 7,0x13, 6,0x08, 7,0x1b, 8,0x13, 7,0x16, 13,0x1d, 7,0x1f,
  201645. 6,0x0a, 6,0x01, 7,0x1f, 6,0x14, 1,0x01
  201646. };
  201647. /* Invert the number, in Montgomery form, modulo the modulus (prime) of the
  201648. * P1024 curve. (r = 1 / a mod m)
  201649. *
  201650. * r Inverse result.
  201651. * a Number to invert.
  201652. * td Temporary data.
  201653. */
  201654. static void sp_1024_mont_inv_32(sp_digit* r, const sp_digit* a,
  201655. sp_digit* td)
  201656. {
  201657. sp_digit* t = td;
  201658. int i;
  201659. int j;
  201660. sp_digit table[32][2 * 32];
  201661. XMEMCPY(table[0], a, sizeof(sp_digit) * 32);
  201662. for (i = 1; i < 6; i++) {
  201663. sp_1024_mont_sqr_32(table[0], table[0], p1024_mod, p1024_mp_mod);
  201664. }
  201665. for (i = 1; i < 32; i++) {
  201666. sp_1024_mont_mul_32(table[i], table[i-1], a, p1024_mod, p1024_mp_mod);
  201667. }
  201668. XMEMCPY(t, table[p1024_mod_minus_2[1]], sizeof(sp_digit) * 32);
  201669. for (i = 2; i < (int)sizeof(p1024_mod_minus_2) - 2; i += 2) {
  201670. for (j = 0; j < p1024_mod_minus_2[i]; j++) {
  201671. sp_1024_mont_sqr_32(t, t, p1024_mod, p1024_mp_mod);
  201672. }
  201673. sp_1024_mont_mul_32(t, t, table[p1024_mod_minus_2[i+1]], p1024_mod,
  201674. p1024_mp_mod);
  201675. }
  201676. sp_1024_mont_sqr_32(t, t, p1024_mod, p1024_mp_mod);
  201677. sp_1024_mont_mul_32(r, t, a, p1024_mod, p1024_mp_mod);
  201678. }
  201679. /* Normalize the values in each word to 32.
  201680. *
  201681. * a Array of sp_digit to normalize.
  201682. */
  201683. #define sp_1024_norm_32(a)
  201684. /* Map the Montgomery form projective coordinate point to an affine point.
  201685. *
  201686. * r Resulting affine coordinate point.
  201687. * p Montgomery form projective coordinate point.
  201688. * t Temporary ordinate data.
  201689. */
  201690. static void sp_1024_map_32(sp_point_1024* r, const sp_point_1024* p,
  201691. sp_digit* t)
  201692. {
  201693. sp_digit* t1 = t;
  201694. sp_digit* t2 = t + 2*32;
  201695. sp_int32 n;
  201696. sp_1024_mont_inv_32(t1, p->z, t + 2*32);
  201697. sp_1024_mont_sqr_32(t2, t1, p1024_mod, p1024_mp_mod);
  201698. sp_1024_mont_mul_32(t1, t2, t1, p1024_mod, p1024_mp_mod);
  201699. /* x /= z^2 */
  201700. sp_1024_mont_mul_32(r->x, p->x, t2, p1024_mod, p1024_mp_mod);
  201701. XMEMSET(r->x + 32, 0, sizeof(r->x) / 2U);
  201702. sp_1024_mont_reduce_32(r->x, p1024_mod, p1024_mp_mod);
  201703. /* Reduce x to less than modulus */
  201704. n = sp_1024_cmp_32(r->x, p1024_mod);
  201705. sp_1024_cond_sub_32(r->x, r->x, p1024_mod, ~(n >> 31));
  201706. sp_1024_norm_32(r->x);
  201707. /* y /= z^3 */
  201708. sp_1024_mont_mul_32(r->y, p->y, t1, p1024_mod, p1024_mp_mod);
  201709. XMEMSET(r->y + 32, 0, sizeof(r->y) / 2U);
  201710. sp_1024_mont_reduce_32(r->y, p1024_mod, p1024_mp_mod);
  201711. /* Reduce y to less than modulus */
  201712. n = sp_1024_cmp_32(r->y, p1024_mod);
  201713. sp_1024_cond_sub_32(r->y, r->y, p1024_mod, ~(n >> 31));
  201714. sp_1024_norm_32(r->y);
  201715. XMEMSET(r->z, 0, sizeof(r->z) / 2);
  201716. r->z[0] = 1;
  201717. }
  201718. /* Add two Montgomery form numbers (r = a + b % m).
  201719. *
  201720. * r Result of addition.
  201721. * a First number to add in Montgomery form.
  201722. * b Second number to add in Montgomery form.
  201723. * m Modulus (prime).
  201724. */
  201725. SP_NOINLINE static void sp_1024_mont_add_32(sp_digit* r, const sp_digit* a,
  201726. const sp_digit* b, const sp_digit* m)
  201727. {
  201728. __asm__ __volatile__ (
  201729. "ldr r4, [%[a]]\n\t"
  201730. "ldr r5, [%[a], #4]\n\t"
  201731. "ldr r6, [%[b]]\n\t"
  201732. "ldr r7, [%[b], #4]\n\t"
  201733. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  201734. "adds r4, r4, r6\n\t"
  201735. #else
  201736. "add r4, r4, r6\n\t"
  201737. #endif
  201738. #ifdef WOLFSSL_KEIL
  201739. "adcs r5, r5, r7\n\t"
  201740. #elif defined(__clang__)
  201741. "adcs r5, r7\n\t"
  201742. #else
  201743. "adc r5, r7\n\t"
  201744. #endif
  201745. "str r4, [%[r]]\n\t"
  201746. "str r5, [%[r], #4]\n\t"
  201747. "ldr r4, [%[a], #8]\n\t"
  201748. "ldr r5, [%[a], #12]\n\t"
  201749. "ldr r6, [%[b], #8]\n\t"
  201750. "ldr r7, [%[b], #12]\n\t"
  201751. #ifdef WOLFSSL_KEIL
  201752. "adcs r4, r4, r6\n\t"
  201753. #elif defined(__clang__)
  201754. "adcs r4, r6\n\t"
  201755. #else
  201756. "adc r4, r6\n\t"
  201757. #endif
  201758. #ifdef WOLFSSL_KEIL
  201759. "adcs r5, r5, r7\n\t"
  201760. #elif defined(__clang__)
  201761. "adcs r5, r7\n\t"
  201762. #else
  201763. "adc r5, r7\n\t"
  201764. #endif
  201765. "str r4, [%[r], #8]\n\t"
  201766. "str r5, [%[r], #12]\n\t"
  201767. "ldr r4, [%[a], #16]\n\t"
  201768. "ldr r5, [%[a], #20]\n\t"
  201769. "ldr r6, [%[b], #16]\n\t"
  201770. "ldr r7, [%[b], #20]\n\t"
  201771. #ifdef WOLFSSL_KEIL
  201772. "adcs r4, r4, r6\n\t"
  201773. #elif defined(__clang__)
  201774. "adcs r4, r6\n\t"
  201775. #else
  201776. "adc r4, r6\n\t"
  201777. #endif
  201778. #ifdef WOLFSSL_KEIL
  201779. "adcs r5, r5, r7\n\t"
  201780. #elif defined(__clang__)
  201781. "adcs r5, r7\n\t"
  201782. #else
  201783. "adc r5, r7\n\t"
  201784. #endif
  201785. "str r4, [%[r], #16]\n\t"
  201786. "str r5, [%[r], #20]\n\t"
  201787. "ldr r4, [%[a], #24]\n\t"
  201788. "ldr r5, [%[a], #28]\n\t"
  201789. "ldr r6, [%[b], #24]\n\t"
  201790. "ldr r7, [%[b], #28]\n\t"
  201791. #ifdef WOLFSSL_KEIL
  201792. "adcs r4, r4, r6\n\t"
  201793. #elif defined(__clang__)
  201794. "adcs r4, r6\n\t"
  201795. #else
  201796. "adc r4, r6\n\t"
  201797. #endif
  201798. #ifdef WOLFSSL_KEIL
  201799. "adcs r5, r5, r7\n\t"
  201800. #elif defined(__clang__)
  201801. "adcs r5, r7\n\t"
  201802. #else
  201803. "adc r5, r7\n\t"
  201804. #endif
  201805. "str r4, [%[r], #24]\n\t"
  201806. "str r5, [%[r], #28]\n\t"
  201807. "ldr r4, [%[a], #32]\n\t"
  201808. "ldr r5, [%[a], #36]\n\t"
  201809. "ldr r6, [%[b], #32]\n\t"
  201810. "ldr r7, [%[b], #36]\n\t"
  201811. #ifdef WOLFSSL_KEIL
  201812. "adcs r4, r4, r6\n\t"
  201813. #elif defined(__clang__)
  201814. "adcs r4, r6\n\t"
  201815. #else
  201816. "adc r4, r6\n\t"
  201817. #endif
  201818. #ifdef WOLFSSL_KEIL
  201819. "adcs r5, r5, r7\n\t"
  201820. #elif defined(__clang__)
  201821. "adcs r5, r7\n\t"
  201822. #else
  201823. "adc r5, r7\n\t"
  201824. #endif
  201825. "str r4, [%[r], #32]\n\t"
  201826. "str r5, [%[r], #36]\n\t"
  201827. "ldr r4, [%[a], #40]\n\t"
  201828. "ldr r5, [%[a], #44]\n\t"
  201829. "ldr r6, [%[b], #40]\n\t"
  201830. "ldr r7, [%[b], #44]\n\t"
  201831. #ifdef WOLFSSL_KEIL
  201832. "adcs r4, r4, r6\n\t"
  201833. #elif defined(__clang__)
  201834. "adcs r4, r6\n\t"
  201835. #else
  201836. "adc r4, r6\n\t"
  201837. #endif
  201838. #ifdef WOLFSSL_KEIL
  201839. "adcs r5, r5, r7\n\t"
  201840. #elif defined(__clang__)
  201841. "adcs r5, r7\n\t"
  201842. #else
  201843. "adc r5, r7\n\t"
  201844. #endif
  201845. "str r4, [%[r], #40]\n\t"
  201846. "str r5, [%[r], #44]\n\t"
  201847. "ldr r4, [%[a], #48]\n\t"
  201848. "ldr r5, [%[a], #52]\n\t"
  201849. "ldr r6, [%[b], #48]\n\t"
  201850. "ldr r7, [%[b], #52]\n\t"
  201851. #ifdef WOLFSSL_KEIL
  201852. "adcs r4, r4, r6\n\t"
  201853. #elif defined(__clang__)
  201854. "adcs r4, r6\n\t"
  201855. #else
  201856. "adc r4, r6\n\t"
  201857. #endif
  201858. #ifdef WOLFSSL_KEIL
  201859. "adcs r5, r5, r7\n\t"
  201860. #elif defined(__clang__)
  201861. "adcs r5, r7\n\t"
  201862. #else
  201863. "adc r5, r7\n\t"
  201864. #endif
  201865. "str r4, [%[r], #48]\n\t"
  201866. "str r5, [%[r], #52]\n\t"
  201867. "ldr r4, [%[a], #56]\n\t"
  201868. "ldr r5, [%[a], #60]\n\t"
  201869. "ldr r6, [%[b], #56]\n\t"
  201870. "ldr r7, [%[b], #60]\n\t"
  201871. #ifdef WOLFSSL_KEIL
  201872. "adcs r4, r4, r6\n\t"
  201873. #elif defined(__clang__)
  201874. "adcs r4, r6\n\t"
  201875. #else
  201876. "adc r4, r6\n\t"
  201877. #endif
  201878. #ifdef WOLFSSL_KEIL
  201879. "adcs r5, r5, r7\n\t"
  201880. #elif defined(__clang__)
  201881. "adcs r5, r7\n\t"
  201882. #else
  201883. "adc r5, r7\n\t"
  201884. #endif
  201885. "str r4, [%[r], #56]\n\t"
  201886. "str r5, [%[r], #60]\n\t"
  201887. "ldr r4, [%[a], #64]\n\t"
  201888. "ldr r5, [%[a], #68]\n\t"
  201889. "ldr r6, [%[b], #64]\n\t"
  201890. "ldr r7, [%[b], #68]\n\t"
  201891. #ifdef WOLFSSL_KEIL
  201892. "adcs r4, r4, r6\n\t"
  201893. #elif defined(__clang__)
  201894. "adcs r4, r6\n\t"
  201895. #else
  201896. "adc r4, r6\n\t"
  201897. #endif
  201898. #ifdef WOLFSSL_KEIL
  201899. "adcs r5, r5, r7\n\t"
  201900. #elif defined(__clang__)
  201901. "adcs r5, r7\n\t"
  201902. #else
  201903. "adc r5, r7\n\t"
  201904. #endif
  201905. "str r4, [%[r], #64]\n\t"
  201906. "str r5, [%[r], #68]\n\t"
  201907. "ldr r4, [%[a], #72]\n\t"
  201908. "ldr r5, [%[a], #76]\n\t"
  201909. "ldr r6, [%[b], #72]\n\t"
  201910. "ldr r7, [%[b], #76]\n\t"
  201911. #ifdef WOLFSSL_KEIL
  201912. "adcs r4, r4, r6\n\t"
  201913. #elif defined(__clang__)
  201914. "adcs r4, r6\n\t"
  201915. #else
  201916. "adc r4, r6\n\t"
  201917. #endif
  201918. #ifdef WOLFSSL_KEIL
  201919. "adcs r5, r5, r7\n\t"
  201920. #elif defined(__clang__)
  201921. "adcs r5, r7\n\t"
  201922. #else
  201923. "adc r5, r7\n\t"
  201924. #endif
  201925. "str r4, [%[r], #72]\n\t"
  201926. "str r5, [%[r], #76]\n\t"
  201927. "ldr r4, [%[a], #80]\n\t"
  201928. "ldr r5, [%[a], #84]\n\t"
  201929. "ldr r6, [%[b], #80]\n\t"
  201930. "ldr r7, [%[b], #84]\n\t"
  201931. #ifdef WOLFSSL_KEIL
  201932. "adcs r4, r4, r6\n\t"
  201933. #elif defined(__clang__)
  201934. "adcs r4, r6\n\t"
  201935. #else
  201936. "adc r4, r6\n\t"
  201937. #endif
  201938. #ifdef WOLFSSL_KEIL
  201939. "adcs r5, r5, r7\n\t"
  201940. #elif defined(__clang__)
  201941. "adcs r5, r7\n\t"
  201942. #else
  201943. "adc r5, r7\n\t"
  201944. #endif
  201945. "str r4, [%[r], #80]\n\t"
  201946. "str r5, [%[r], #84]\n\t"
  201947. "ldr r4, [%[a], #88]\n\t"
  201948. "ldr r5, [%[a], #92]\n\t"
  201949. "ldr r6, [%[b], #88]\n\t"
  201950. "ldr r7, [%[b], #92]\n\t"
  201951. #ifdef WOLFSSL_KEIL
  201952. "adcs r4, r4, r6\n\t"
  201953. #elif defined(__clang__)
  201954. "adcs r4, r6\n\t"
  201955. #else
  201956. "adc r4, r6\n\t"
  201957. #endif
  201958. #ifdef WOLFSSL_KEIL
  201959. "adcs r5, r5, r7\n\t"
  201960. #elif defined(__clang__)
  201961. "adcs r5, r7\n\t"
  201962. #else
  201963. "adc r5, r7\n\t"
  201964. #endif
  201965. "str r4, [%[r], #88]\n\t"
  201966. "str r5, [%[r], #92]\n\t"
  201967. "ldr r4, [%[a], #96]\n\t"
  201968. "ldr r5, [%[a], #100]\n\t"
  201969. "ldr r6, [%[b], #96]\n\t"
  201970. "ldr r7, [%[b], #100]\n\t"
  201971. #ifdef WOLFSSL_KEIL
  201972. "adcs r4, r4, r6\n\t"
  201973. #elif defined(__clang__)
  201974. "adcs r4, r6\n\t"
  201975. #else
  201976. "adc r4, r6\n\t"
  201977. #endif
  201978. #ifdef WOLFSSL_KEIL
  201979. "adcs r5, r5, r7\n\t"
  201980. #elif defined(__clang__)
  201981. "adcs r5, r7\n\t"
  201982. #else
  201983. "adc r5, r7\n\t"
  201984. #endif
  201985. "str r4, [%[r], #96]\n\t"
  201986. "str r5, [%[r], #100]\n\t"
  201987. "ldr r4, [%[a], #104]\n\t"
  201988. "ldr r5, [%[a], #108]\n\t"
  201989. "ldr r6, [%[b], #104]\n\t"
  201990. "ldr r7, [%[b], #108]\n\t"
  201991. #ifdef WOLFSSL_KEIL
  201992. "adcs r4, r4, r6\n\t"
  201993. #elif defined(__clang__)
  201994. "adcs r4, r6\n\t"
  201995. #else
  201996. "adc r4, r6\n\t"
  201997. #endif
  201998. #ifdef WOLFSSL_KEIL
  201999. "adcs r5, r5, r7\n\t"
  202000. #elif defined(__clang__)
  202001. "adcs r5, r7\n\t"
  202002. #else
  202003. "adc r5, r7\n\t"
  202004. #endif
  202005. "str r4, [%[r], #104]\n\t"
  202006. "str r5, [%[r], #108]\n\t"
  202007. "ldr r4, [%[a], #112]\n\t"
  202008. "ldr r5, [%[a], #116]\n\t"
  202009. "ldr r6, [%[b], #112]\n\t"
  202010. "ldr r7, [%[b], #116]\n\t"
  202011. #ifdef WOLFSSL_KEIL
  202012. "adcs r4, r4, r6\n\t"
  202013. #elif defined(__clang__)
  202014. "adcs r4, r6\n\t"
  202015. #else
  202016. "adc r4, r6\n\t"
  202017. #endif
  202018. #ifdef WOLFSSL_KEIL
  202019. "adcs r5, r5, r7\n\t"
  202020. #elif defined(__clang__)
  202021. "adcs r5, r7\n\t"
  202022. #else
  202023. "adc r5, r7\n\t"
  202024. #endif
  202025. "str r4, [%[r], #112]\n\t"
  202026. "str r5, [%[r], #116]\n\t"
  202027. "ldr r4, [%[a], #120]\n\t"
  202028. "ldr r5, [%[a], #124]\n\t"
  202029. "ldr r6, [%[b], #120]\n\t"
  202030. "ldr r7, [%[b], #124]\n\t"
  202031. #ifdef WOLFSSL_KEIL
  202032. "adcs r4, r4, r6\n\t"
  202033. #elif defined(__clang__)
  202034. "adcs r4, r6\n\t"
  202035. #else
  202036. "adc r4, r6\n\t"
  202037. #endif
  202038. #ifdef WOLFSSL_KEIL
  202039. "adcs r5, r5, r7\n\t"
  202040. #elif defined(__clang__)
  202041. "adcs r5, r7\n\t"
  202042. #else
  202043. "adc r5, r7\n\t"
  202044. #endif
  202045. "str r4, [%[r], #120]\n\t"
  202046. "str r5, [%[r], #124]\n\t"
  202047. "movs %[b], #0\n\t"
  202048. "ldr r7, [%[m], #124]\n\t"
  202049. #ifdef WOLFSSL_KEIL
  202050. "adcs %[b], %[b], %[b]\n\t"
  202051. #elif defined(__clang__)
  202052. "adcs %[b], %[b]\n\t"
  202053. #else
  202054. "adc %[b], %[b]\n\t"
  202055. #endif
  202056. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  202057. "subs r7, r7, r5\n\t"
  202058. #else
  202059. "sub r7, r7, r5\n\t"
  202060. #endif
  202061. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  202062. "negs %[b], %[b]\n\t"
  202063. #else
  202064. "neg %[b], %[b]\n\t"
  202065. #endif
  202066. #ifdef WOLFSSL_KEIL
  202067. "sbcs r7, r7, r7\n\t"
  202068. #elif defined(__clang__)
  202069. "sbcs r7, r7\n\t"
  202070. #else
  202071. "sbc r7, r7\n\t"
  202072. #endif
  202073. #ifdef WOLFSSL_KEIL
  202074. "orrs %[b], %[b], r7\n\t"
  202075. #elif defined(__clang__)
  202076. "orrs %[b], r7\n\t"
  202077. #else
  202078. "orr %[b], r7\n\t"
  202079. #endif
  202080. "ldr r4, [%[r]]\n\t"
  202081. "ldr r5, [%[r], #4]\n\t"
  202082. "ldr r6, [%[m]]\n\t"
  202083. "ldr r7, [%[m], #4]\n\t"
  202084. #ifdef WOLFSSL_KEIL
  202085. "ands r6, r6, %[b]\n\t"
  202086. #elif defined(__clang__)
  202087. "ands r6, %[b]\n\t"
  202088. #else
  202089. "and r6, %[b]\n\t"
  202090. #endif
  202091. #ifdef WOLFSSL_KEIL
  202092. "ands r7, r7, %[b]\n\t"
  202093. #elif defined(__clang__)
  202094. "ands r7, %[b]\n\t"
  202095. #else
  202096. "and r7, %[b]\n\t"
  202097. #endif
  202098. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  202099. "subs r4, r4, r6\n\t"
  202100. #else
  202101. "sub r4, r4, r6\n\t"
  202102. #endif
  202103. #ifdef WOLFSSL_KEIL
  202104. "sbcs r5, r5, r7\n\t"
  202105. #elif defined(__clang__)
  202106. "sbcs r5, r7\n\t"
  202107. #else
  202108. "sbc r5, r7\n\t"
  202109. #endif
  202110. "str r4, [%[r]]\n\t"
  202111. "str r5, [%[r], #4]\n\t"
  202112. "ldr r4, [%[r], #8]\n\t"
  202113. "ldr r5, [%[r], #12]\n\t"
  202114. "ldr r6, [%[m], #8]\n\t"
  202115. "ldr r7, [%[m], #12]\n\t"
  202116. #ifdef WOLFSSL_KEIL
  202117. "ands r6, r6, %[b]\n\t"
  202118. #elif defined(__clang__)
  202119. "ands r6, %[b]\n\t"
  202120. #else
  202121. "and r6, %[b]\n\t"
  202122. #endif
  202123. #ifdef WOLFSSL_KEIL
  202124. "ands r7, r7, %[b]\n\t"
  202125. #elif defined(__clang__)
  202126. "ands r7, %[b]\n\t"
  202127. #else
  202128. "and r7, %[b]\n\t"
  202129. #endif
  202130. #ifdef WOLFSSL_KEIL
  202131. "sbcs r4, r4, r6\n\t"
  202132. #elif defined(__clang__)
  202133. "sbcs r4, r6\n\t"
  202134. #else
  202135. "sbc r4, r6\n\t"
  202136. #endif
  202137. #ifdef WOLFSSL_KEIL
  202138. "sbcs r5, r5, r7\n\t"
  202139. #elif defined(__clang__)
  202140. "sbcs r5, r7\n\t"
  202141. #else
  202142. "sbc r5, r7\n\t"
  202143. #endif
  202144. "str r4, [%[r], #8]\n\t"
  202145. "str r5, [%[r], #12]\n\t"
  202146. "ldr r4, [%[r], #16]\n\t"
  202147. "ldr r5, [%[r], #20]\n\t"
  202148. "ldr r6, [%[m], #16]\n\t"
  202149. "ldr r7, [%[m], #20]\n\t"
  202150. #ifdef WOLFSSL_KEIL
  202151. "ands r6, r6, %[b]\n\t"
  202152. #elif defined(__clang__)
  202153. "ands r6, %[b]\n\t"
  202154. #else
  202155. "and r6, %[b]\n\t"
  202156. #endif
  202157. #ifdef WOLFSSL_KEIL
  202158. "ands r7, r7, %[b]\n\t"
  202159. #elif defined(__clang__)
  202160. "ands r7, %[b]\n\t"
  202161. #else
  202162. "and r7, %[b]\n\t"
  202163. #endif
  202164. #ifdef WOLFSSL_KEIL
  202165. "sbcs r4, r4, r6\n\t"
  202166. #elif defined(__clang__)
  202167. "sbcs r4, r6\n\t"
  202168. #else
  202169. "sbc r4, r6\n\t"
  202170. #endif
  202171. #ifdef WOLFSSL_KEIL
  202172. "sbcs r5, r5, r7\n\t"
  202173. #elif defined(__clang__)
  202174. "sbcs r5, r7\n\t"
  202175. #else
  202176. "sbc r5, r7\n\t"
  202177. #endif
  202178. "str r4, [%[r], #16]\n\t"
  202179. "str r5, [%[r], #20]\n\t"
  202180. "ldr r4, [%[r], #24]\n\t"
  202181. "ldr r5, [%[r], #28]\n\t"
  202182. "ldr r6, [%[m], #24]\n\t"
  202183. "ldr r7, [%[m], #28]\n\t"
  202184. #ifdef WOLFSSL_KEIL
  202185. "ands r6, r6, %[b]\n\t"
  202186. #elif defined(__clang__)
  202187. "ands r6, %[b]\n\t"
  202188. #else
  202189. "and r6, %[b]\n\t"
  202190. #endif
  202191. #ifdef WOLFSSL_KEIL
  202192. "ands r7, r7, %[b]\n\t"
  202193. #elif defined(__clang__)
  202194. "ands r7, %[b]\n\t"
  202195. #else
  202196. "and r7, %[b]\n\t"
  202197. #endif
  202198. #ifdef WOLFSSL_KEIL
  202199. "sbcs r4, r4, r6\n\t"
  202200. #elif defined(__clang__)
  202201. "sbcs r4, r6\n\t"
  202202. #else
  202203. "sbc r4, r6\n\t"
  202204. #endif
  202205. #ifdef WOLFSSL_KEIL
  202206. "sbcs r5, r5, r7\n\t"
  202207. #elif defined(__clang__)
  202208. "sbcs r5, r7\n\t"
  202209. #else
  202210. "sbc r5, r7\n\t"
  202211. #endif
  202212. "str r4, [%[r], #24]\n\t"
  202213. "str r5, [%[r], #28]\n\t"
  202214. "ldr r4, [%[r], #32]\n\t"
  202215. "ldr r5, [%[r], #36]\n\t"
  202216. "ldr r6, [%[m], #32]\n\t"
  202217. "ldr r7, [%[m], #36]\n\t"
  202218. #ifdef WOLFSSL_KEIL
  202219. "ands r6, r6, %[b]\n\t"
  202220. #elif defined(__clang__)
  202221. "ands r6, %[b]\n\t"
  202222. #else
  202223. "and r6, %[b]\n\t"
  202224. #endif
  202225. #ifdef WOLFSSL_KEIL
  202226. "ands r7, r7, %[b]\n\t"
  202227. #elif defined(__clang__)
  202228. "ands r7, %[b]\n\t"
  202229. #else
  202230. "and r7, %[b]\n\t"
  202231. #endif
  202232. #ifdef WOLFSSL_KEIL
  202233. "sbcs r4, r4, r6\n\t"
  202234. #elif defined(__clang__)
  202235. "sbcs r4, r6\n\t"
  202236. #else
  202237. "sbc r4, r6\n\t"
  202238. #endif
  202239. #ifdef WOLFSSL_KEIL
  202240. "sbcs r5, r5, r7\n\t"
  202241. #elif defined(__clang__)
  202242. "sbcs r5, r7\n\t"
  202243. #else
  202244. "sbc r5, r7\n\t"
  202245. #endif
  202246. "str r4, [%[r], #32]\n\t"
  202247. "str r5, [%[r], #36]\n\t"
  202248. "ldr r4, [%[r], #40]\n\t"
  202249. "ldr r5, [%[r], #44]\n\t"
  202250. "ldr r6, [%[m], #40]\n\t"
  202251. "ldr r7, [%[m], #44]\n\t"
  202252. #ifdef WOLFSSL_KEIL
  202253. "ands r6, r6, %[b]\n\t"
  202254. #elif defined(__clang__)
  202255. "ands r6, %[b]\n\t"
  202256. #else
  202257. "and r6, %[b]\n\t"
  202258. #endif
  202259. #ifdef WOLFSSL_KEIL
  202260. "ands r7, r7, %[b]\n\t"
  202261. #elif defined(__clang__)
  202262. "ands r7, %[b]\n\t"
  202263. #else
  202264. "and r7, %[b]\n\t"
  202265. #endif
  202266. #ifdef WOLFSSL_KEIL
  202267. "sbcs r4, r4, r6\n\t"
  202268. #elif defined(__clang__)
  202269. "sbcs r4, r6\n\t"
  202270. #else
  202271. "sbc r4, r6\n\t"
  202272. #endif
  202273. #ifdef WOLFSSL_KEIL
  202274. "sbcs r5, r5, r7\n\t"
  202275. #elif defined(__clang__)
  202276. "sbcs r5, r7\n\t"
  202277. #else
  202278. "sbc r5, r7\n\t"
  202279. #endif
  202280. "str r4, [%[r], #40]\n\t"
  202281. "str r5, [%[r], #44]\n\t"
  202282. "ldr r4, [%[r], #48]\n\t"
  202283. "ldr r5, [%[r], #52]\n\t"
  202284. "ldr r6, [%[m], #48]\n\t"
  202285. "ldr r7, [%[m], #52]\n\t"
  202286. #ifdef WOLFSSL_KEIL
  202287. "ands r6, r6, %[b]\n\t"
  202288. #elif defined(__clang__)
  202289. "ands r6, %[b]\n\t"
  202290. #else
  202291. "and r6, %[b]\n\t"
  202292. #endif
  202293. #ifdef WOLFSSL_KEIL
  202294. "ands r7, r7, %[b]\n\t"
  202295. #elif defined(__clang__)
  202296. "ands r7, %[b]\n\t"
  202297. #else
  202298. "and r7, %[b]\n\t"
  202299. #endif
  202300. #ifdef WOLFSSL_KEIL
  202301. "sbcs r4, r4, r6\n\t"
  202302. #elif defined(__clang__)
  202303. "sbcs r4, r6\n\t"
  202304. #else
  202305. "sbc r4, r6\n\t"
  202306. #endif
  202307. #ifdef WOLFSSL_KEIL
  202308. "sbcs r5, r5, r7\n\t"
  202309. #elif defined(__clang__)
  202310. "sbcs r5, r7\n\t"
  202311. #else
  202312. "sbc r5, r7\n\t"
  202313. #endif
  202314. "str r4, [%[r], #48]\n\t"
  202315. "str r5, [%[r], #52]\n\t"
  202316. "ldr r4, [%[r], #56]\n\t"
  202317. "ldr r5, [%[r], #60]\n\t"
  202318. "ldr r6, [%[m], #56]\n\t"
  202319. "ldr r7, [%[m], #60]\n\t"
  202320. #ifdef WOLFSSL_KEIL
  202321. "ands r6, r6, %[b]\n\t"
  202322. #elif defined(__clang__)
  202323. "ands r6, %[b]\n\t"
  202324. #else
  202325. "and r6, %[b]\n\t"
  202326. #endif
  202327. #ifdef WOLFSSL_KEIL
  202328. "ands r7, r7, %[b]\n\t"
  202329. #elif defined(__clang__)
  202330. "ands r7, %[b]\n\t"
  202331. #else
  202332. "and r7, %[b]\n\t"
  202333. #endif
  202334. #ifdef WOLFSSL_KEIL
  202335. "sbcs r4, r4, r6\n\t"
  202336. #elif defined(__clang__)
  202337. "sbcs r4, r6\n\t"
  202338. #else
  202339. "sbc r4, r6\n\t"
  202340. #endif
  202341. #ifdef WOLFSSL_KEIL
  202342. "sbcs r5, r5, r7\n\t"
  202343. #elif defined(__clang__)
  202344. "sbcs r5, r7\n\t"
  202345. #else
  202346. "sbc r5, r7\n\t"
  202347. #endif
  202348. "str r4, [%[r], #56]\n\t"
  202349. "str r5, [%[r], #60]\n\t"
  202350. "ldr r4, [%[r], #64]\n\t"
  202351. "ldr r5, [%[r], #68]\n\t"
  202352. "ldr r6, [%[m], #64]\n\t"
  202353. "ldr r7, [%[m], #68]\n\t"
  202354. #ifdef WOLFSSL_KEIL
  202355. "ands r6, r6, %[b]\n\t"
  202356. #elif defined(__clang__)
  202357. "ands r6, %[b]\n\t"
  202358. #else
  202359. "and r6, %[b]\n\t"
  202360. #endif
  202361. #ifdef WOLFSSL_KEIL
  202362. "ands r7, r7, %[b]\n\t"
  202363. #elif defined(__clang__)
  202364. "ands r7, %[b]\n\t"
  202365. #else
  202366. "and r7, %[b]\n\t"
  202367. #endif
  202368. #ifdef WOLFSSL_KEIL
  202369. "sbcs r4, r4, r6\n\t"
  202370. #elif defined(__clang__)
  202371. "sbcs r4, r6\n\t"
  202372. #else
  202373. "sbc r4, r6\n\t"
  202374. #endif
  202375. #ifdef WOLFSSL_KEIL
  202376. "sbcs r5, r5, r7\n\t"
  202377. #elif defined(__clang__)
  202378. "sbcs r5, r7\n\t"
  202379. #else
  202380. "sbc r5, r7\n\t"
  202381. #endif
  202382. "str r4, [%[r], #64]\n\t"
  202383. "str r5, [%[r], #68]\n\t"
  202384. "ldr r4, [%[r], #72]\n\t"
  202385. "ldr r5, [%[r], #76]\n\t"
  202386. "ldr r6, [%[m], #72]\n\t"
  202387. "ldr r7, [%[m], #76]\n\t"
  202388. #ifdef WOLFSSL_KEIL
  202389. "ands r6, r6, %[b]\n\t"
  202390. #elif defined(__clang__)
  202391. "ands r6, %[b]\n\t"
  202392. #else
  202393. "and r6, %[b]\n\t"
  202394. #endif
  202395. #ifdef WOLFSSL_KEIL
  202396. "ands r7, r7, %[b]\n\t"
  202397. #elif defined(__clang__)
  202398. "ands r7, %[b]\n\t"
  202399. #else
  202400. "and r7, %[b]\n\t"
  202401. #endif
  202402. #ifdef WOLFSSL_KEIL
  202403. "sbcs r4, r4, r6\n\t"
  202404. #elif defined(__clang__)
  202405. "sbcs r4, r6\n\t"
  202406. #else
  202407. "sbc r4, r6\n\t"
  202408. #endif
  202409. #ifdef WOLFSSL_KEIL
  202410. "sbcs r5, r5, r7\n\t"
  202411. #elif defined(__clang__)
  202412. "sbcs r5, r7\n\t"
  202413. #else
  202414. "sbc r5, r7\n\t"
  202415. #endif
  202416. "str r4, [%[r], #72]\n\t"
  202417. "str r5, [%[r], #76]\n\t"
  202418. "ldr r4, [%[r], #80]\n\t"
  202419. "ldr r5, [%[r], #84]\n\t"
  202420. "ldr r6, [%[m], #80]\n\t"
  202421. "ldr r7, [%[m], #84]\n\t"
  202422. #ifdef WOLFSSL_KEIL
  202423. "ands r6, r6, %[b]\n\t"
  202424. #elif defined(__clang__)
  202425. "ands r6, %[b]\n\t"
  202426. #else
  202427. "and r6, %[b]\n\t"
  202428. #endif
  202429. #ifdef WOLFSSL_KEIL
  202430. "ands r7, r7, %[b]\n\t"
  202431. #elif defined(__clang__)
  202432. "ands r7, %[b]\n\t"
  202433. #else
  202434. "and r7, %[b]\n\t"
  202435. #endif
  202436. #ifdef WOLFSSL_KEIL
  202437. "sbcs r4, r4, r6\n\t"
  202438. #elif defined(__clang__)
  202439. "sbcs r4, r6\n\t"
  202440. #else
  202441. "sbc r4, r6\n\t"
  202442. #endif
  202443. #ifdef WOLFSSL_KEIL
  202444. "sbcs r5, r5, r7\n\t"
  202445. #elif defined(__clang__)
  202446. "sbcs r5, r7\n\t"
  202447. #else
  202448. "sbc r5, r7\n\t"
  202449. #endif
  202450. "str r4, [%[r], #80]\n\t"
  202451. "str r5, [%[r], #84]\n\t"
  202452. "ldr r4, [%[r], #88]\n\t"
  202453. "ldr r5, [%[r], #92]\n\t"
  202454. "ldr r6, [%[m], #88]\n\t"
  202455. "ldr r7, [%[m], #92]\n\t"
  202456. #ifdef WOLFSSL_KEIL
  202457. "ands r6, r6, %[b]\n\t"
  202458. #elif defined(__clang__)
  202459. "ands r6, %[b]\n\t"
  202460. #else
  202461. "and r6, %[b]\n\t"
  202462. #endif
  202463. #ifdef WOLFSSL_KEIL
  202464. "ands r7, r7, %[b]\n\t"
  202465. #elif defined(__clang__)
  202466. "ands r7, %[b]\n\t"
  202467. #else
  202468. "and r7, %[b]\n\t"
  202469. #endif
  202470. #ifdef WOLFSSL_KEIL
  202471. "sbcs r4, r4, r6\n\t"
  202472. #elif defined(__clang__)
  202473. "sbcs r4, r6\n\t"
  202474. #else
  202475. "sbc r4, r6\n\t"
  202476. #endif
  202477. #ifdef WOLFSSL_KEIL
  202478. "sbcs r5, r5, r7\n\t"
  202479. #elif defined(__clang__)
  202480. "sbcs r5, r7\n\t"
  202481. #else
  202482. "sbc r5, r7\n\t"
  202483. #endif
  202484. "str r4, [%[r], #88]\n\t"
  202485. "str r5, [%[r], #92]\n\t"
  202486. "ldr r4, [%[r], #96]\n\t"
  202487. "ldr r5, [%[r], #100]\n\t"
  202488. "ldr r6, [%[m], #96]\n\t"
  202489. "ldr r7, [%[m], #100]\n\t"
  202490. #ifdef WOLFSSL_KEIL
  202491. "ands r6, r6, %[b]\n\t"
  202492. #elif defined(__clang__)
  202493. "ands r6, %[b]\n\t"
  202494. #else
  202495. "and r6, %[b]\n\t"
  202496. #endif
  202497. #ifdef WOLFSSL_KEIL
  202498. "ands r7, r7, %[b]\n\t"
  202499. #elif defined(__clang__)
  202500. "ands r7, %[b]\n\t"
  202501. #else
  202502. "and r7, %[b]\n\t"
  202503. #endif
  202504. #ifdef WOLFSSL_KEIL
  202505. "sbcs r4, r4, r6\n\t"
  202506. #elif defined(__clang__)
  202507. "sbcs r4, r6\n\t"
  202508. #else
  202509. "sbc r4, r6\n\t"
  202510. #endif
  202511. #ifdef WOLFSSL_KEIL
  202512. "sbcs r5, r5, r7\n\t"
  202513. #elif defined(__clang__)
  202514. "sbcs r5, r7\n\t"
  202515. #else
  202516. "sbc r5, r7\n\t"
  202517. #endif
  202518. "str r4, [%[r], #96]\n\t"
  202519. "str r5, [%[r], #100]\n\t"
  202520. "ldr r4, [%[r], #104]\n\t"
  202521. "ldr r5, [%[r], #108]\n\t"
  202522. "ldr r6, [%[m], #104]\n\t"
  202523. "ldr r7, [%[m], #108]\n\t"
  202524. #ifdef WOLFSSL_KEIL
  202525. "ands r6, r6, %[b]\n\t"
  202526. #elif defined(__clang__)
  202527. "ands r6, %[b]\n\t"
  202528. #else
  202529. "and r6, %[b]\n\t"
  202530. #endif
  202531. #ifdef WOLFSSL_KEIL
  202532. "ands r7, r7, %[b]\n\t"
  202533. #elif defined(__clang__)
  202534. "ands r7, %[b]\n\t"
  202535. #else
  202536. "and r7, %[b]\n\t"
  202537. #endif
  202538. #ifdef WOLFSSL_KEIL
  202539. "sbcs r4, r4, r6\n\t"
  202540. #elif defined(__clang__)
  202541. "sbcs r4, r6\n\t"
  202542. #else
  202543. "sbc r4, r6\n\t"
  202544. #endif
  202545. #ifdef WOLFSSL_KEIL
  202546. "sbcs r5, r5, r7\n\t"
  202547. #elif defined(__clang__)
  202548. "sbcs r5, r7\n\t"
  202549. #else
  202550. "sbc r5, r7\n\t"
  202551. #endif
  202552. "str r4, [%[r], #104]\n\t"
  202553. "str r5, [%[r], #108]\n\t"
  202554. "ldr r4, [%[r], #112]\n\t"
  202555. "ldr r5, [%[r], #116]\n\t"
  202556. "ldr r6, [%[m], #112]\n\t"
  202557. "ldr r7, [%[m], #116]\n\t"
  202558. #ifdef WOLFSSL_KEIL
  202559. "ands r6, r6, %[b]\n\t"
  202560. #elif defined(__clang__)
  202561. "ands r6, %[b]\n\t"
  202562. #else
  202563. "and r6, %[b]\n\t"
  202564. #endif
  202565. #ifdef WOLFSSL_KEIL
  202566. "ands r7, r7, %[b]\n\t"
  202567. #elif defined(__clang__)
  202568. "ands r7, %[b]\n\t"
  202569. #else
  202570. "and r7, %[b]\n\t"
  202571. #endif
  202572. #ifdef WOLFSSL_KEIL
  202573. "sbcs r4, r4, r6\n\t"
  202574. #elif defined(__clang__)
  202575. "sbcs r4, r6\n\t"
  202576. #else
  202577. "sbc r4, r6\n\t"
  202578. #endif
  202579. #ifdef WOLFSSL_KEIL
  202580. "sbcs r5, r5, r7\n\t"
  202581. #elif defined(__clang__)
  202582. "sbcs r5, r7\n\t"
  202583. #else
  202584. "sbc r5, r7\n\t"
  202585. #endif
  202586. "str r4, [%[r], #112]\n\t"
  202587. "str r5, [%[r], #116]\n\t"
  202588. "ldr r4, [%[r], #120]\n\t"
  202589. "ldr r5, [%[r], #124]\n\t"
  202590. "ldr r6, [%[m], #120]\n\t"
  202591. "ldr r7, [%[m], #124]\n\t"
  202592. #ifdef WOLFSSL_KEIL
  202593. "ands r6, r6, %[b]\n\t"
  202594. #elif defined(__clang__)
  202595. "ands r6, %[b]\n\t"
  202596. #else
  202597. "and r6, %[b]\n\t"
  202598. #endif
  202599. #ifdef WOLFSSL_KEIL
  202600. "ands r7, r7, %[b]\n\t"
  202601. #elif defined(__clang__)
  202602. "ands r7, %[b]\n\t"
  202603. #else
  202604. "and r7, %[b]\n\t"
  202605. #endif
  202606. #ifdef WOLFSSL_KEIL
  202607. "sbcs r4, r4, r6\n\t"
  202608. #elif defined(__clang__)
  202609. "sbcs r4, r6\n\t"
  202610. #else
  202611. "sbc r4, r6\n\t"
  202612. #endif
  202613. #ifdef WOLFSSL_KEIL
  202614. "sbcs r5, r5, r7\n\t"
  202615. #elif defined(__clang__)
  202616. "sbcs r5, r7\n\t"
  202617. #else
  202618. "sbc r5, r7\n\t"
  202619. #endif
  202620. "str r4, [%[r], #120]\n\t"
  202621. "str r5, [%[r], #124]\n\t"
  202622. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m)
  202623. :
  202624. : "memory", "r4", "r5", "r6", "r7"
  202625. );
  202626. }
  202627. /* Double a Montgomery form number (r = a + a % m).
  202628. *
  202629. * r Result of doubling.
  202630. * a Number to double in Montgomery form.
  202631. * m Modulus (prime).
  202632. */
  202633. SP_NOINLINE static void sp_1024_mont_dbl_32(sp_digit* r, const sp_digit* a,
  202634. const sp_digit* m)
  202635. {
  202636. __asm__ __volatile__ (
  202637. "ldr r4, [%[a]]\n\t"
  202638. "ldr r5, [%[a], #4]\n\t"
  202639. "ldr r6, [%[a], #8]\n\t"
  202640. "ldr r7, [%[a], #12]\n\t"
  202641. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  202642. "adds r4, r4, r4\n\t"
  202643. #else
  202644. "add r4, r4, r4\n\t"
  202645. #endif
  202646. #ifdef WOLFSSL_KEIL
  202647. "adcs r5, r5, r5\n\t"
  202648. #elif defined(__clang__)
  202649. "adcs r5, r5\n\t"
  202650. #else
  202651. "adc r5, r5\n\t"
  202652. #endif
  202653. #ifdef WOLFSSL_KEIL
  202654. "adcs r6, r6, r6\n\t"
  202655. #elif defined(__clang__)
  202656. "adcs r6, r6\n\t"
  202657. #else
  202658. "adc r6, r6\n\t"
  202659. #endif
  202660. #ifdef WOLFSSL_KEIL
  202661. "adcs r7, r7, r7\n\t"
  202662. #elif defined(__clang__)
  202663. "adcs r7, r7\n\t"
  202664. #else
  202665. "adc r7, r7\n\t"
  202666. #endif
  202667. "str r4, [%[r]]\n\t"
  202668. "str r5, [%[r], #4]\n\t"
  202669. "str r6, [%[r], #8]\n\t"
  202670. "str r7, [%[r], #12]\n\t"
  202671. "ldr r4, [%[a], #16]\n\t"
  202672. "ldr r5, [%[a], #20]\n\t"
  202673. "ldr r6, [%[a], #24]\n\t"
  202674. "ldr r7, [%[a], #28]\n\t"
  202675. #ifdef WOLFSSL_KEIL
  202676. "adcs r4, r4, r4\n\t"
  202677. #elif defined(__clang__)
  202678. "adcs r4, r4\n\t"
  202679. #else
  202680. "adc r4, r4\n\t"
  202681. #endif
  202682. #ifdef WOLFSSL_KEIL
  202683. "adcs r5, r5, r5\n\t"
  202684. #elif defined(__clang__)
  202685. "adcs r5, r5\n\t"
  202686. #else
  202687. "adc r5, r5\n\t"
  202688. #endif
  202689. #ifdef WOLFSSL_KEIL
  202690. "adcs r6, r6, r6\n\t"
  202691. #elif defined(__clang__)
  202692. "adcs r6, r6\n\t"
  202693. #else
  202694. "adc r6, r6\n\t"
  202695. #endif
  202696. #ifdef WOLFSSL_KEIL
  202697. "adcs r7, r7, r7\n\t"
  202698. #elif defined(__clang__)
  202699. "adcs r7, r7\n\t"
  202700. #else
  202701. "adc r7, r7\n\t"
  202702. #endif
  202703. "str r4, [%[r], #16]\n\t"
  202704. "str r5, [%[r], #20]\n\t"
  202705. "str r6, [%[r], #24]\n\t"
  202706. "str r7, [%[r], #28]\n\t"
  202707. "ldr r4, [%[a], #32]\n\t"
  202708. "ldr r5, [%[a], #36]\n\t"
  202709. "ldr r6, [%[a], #40]\n\t"
  202710. "ldr r7, [%[a], #44]\n\t"
  202711. #ifdef WOLFSSL_KEIL
  202712. "adcs r4, r4, r4\n\t"
  202713. #elif defined(__clang__)
  202714. "adcs r4, r4\n\t"
  202715. #else
  202716. "adc r4, r4\n\t"
  202717. #endif
  202718. #ifdef WOLFSSL_KEIL
  202719. "adcs r5, r5, r5\n\t"
  202720. #elif defined(__clang__)
  202721. "adcs r5, r5\n\t"
  202722. #else
  202723. "adc r5, r5\n\t"
  202724. #endif
  202725. #ifdef WOLFSSL_KEIL
  202726. "adcs r6, r6, r6\n\t"
  202727. #elif defined(__clang__)
  202728. "adcs r6, r6\n\t"
  202729. #else
  202730. "adc r6, r6\n\t"
  202731. #endif
  202732. #ifdef WOLFSSL_KEIL
  202733. "adcs r7, r7, r7\n\t"
  202734. #elif defined(__clang__)
  202735. "adcs r7, r7\n\t"
  202736. #else
  202737. "adc r7, r7\n\t"
  202738. #endif
  202739. "str r4, [%[r], #32]\n\t"
  202740. "str r5, [%[r], #36]\n\t"
  202741. "str r6, [%[r], #40]\n\t"
  202742. "str r7, [%[r], #44]\n\t"
  202743. "ldr r4, [%[a], #48]\n\t"
  202744. "ldr r5, [%[a], #52]\n\t"
  202745. "ldr r6, [%[a], #56]\n\t"
  202746. "ldr r7, [%[a], #60]\n\t"
  202747. #ifdef WOLFSSL_KEIL
  202748. "adcs r4, r4, r4\n\t"
  202749. #elif defined(__clang__)
  202750. "adcs r4, r4\n\t"
  202751. #else
  202752. "adc r4, r4\n\t"
  202753. #endif
  202754. #ifdef WOLFSSL_KEIL
  202755. "adcs r5, r5, r5\n\t"
  202756. #elif defined(__clang__)
  202757. "adcs r5, r5\n\t"
  202758. #else
  202759. "adc r5, r5\n\t"
  202760. #endif
  202761. #ifdef WOLFSSL_KEIL
  202762. "adcs r6, r6, r6\n\t"
  202763. #elif defined(__clang__)
  202764. "adcs r6, r6\n\t"
  202765. #else
  202766. "adc r6, r6\n\t"
  202767. #endif
  202768. #ifdef WOLFSSL_KEIL
  202769. "adcs r7, r7, r7\n\t"
  202770. #elif defined(__clang__)
  202771. "adcs r7, r7\n\t"
  202772. #else
  202773. "adc r7, r7\n\t"
  202774. #endif
  202775. "str r4, [%[r], #48]\n\t"
  202776. "str r5, [%[r], #52]\n\t"
  202777. "str r6, [%[r], #56]\n\t"
  202778. "str r7, [%[r], #60]\n\t"
  202779. "ldr r4, [%[a], #64]\n\t"
  202780. "ldr r5, [%[a], #68]\n\t"
  202781. "ldr r6, [%[a], #72]\n\t"
  202782. "ldr r7, [%[a], #76]\n\t"
  202783. #ifdef WOLFSSL_KEIL
  202784. "adcs r4, r4, r4\n\t"
  202785. #elif defined(__clang__)
  202786. "adcs r4, r4\n\t"
  202787. #else
  202788. "adc r4, r4\n\t"
  202789. #endif
  202790. #ifdef WOLFSSL_KEIL
  202791. "adcs r5, r5, r5\n\t"
  202792. #elif defined(__clang__)
  202793. "adcs r5, r5\n\t"
  202794. #else
  202795. "adc r5, r5\n\t"
  202796. #endif
  202797. #ifdef WOLFSSL_KEIL
  202798. "adcs r6, r6, r6\n\t"
  202799. #elif defined(__clang__)
  202800. "adcs r6, r6\n\t"
  202801. #else
  202802. "adc r6, r6\n\t"
  202803. #endif
  202804. #ifdef WOLFSSL_KEIL
  202805. "adcs r7, r7, r7\n\t"
  202806. #elif defined(__clang__)
  202807. "adcs r7, r7\n\t"
  202808. #else
  202809. "adc r7, r7\n\t"
  202810. #endif
  202811. "str r4, [%[r], #64]\n\t"
  202812. "str r5, [%[r], #68]\n\t"
  202813. "str r6, [%[r], #72]\n\t"
  202814. "str r7, [%[r], #76]\n\t"
  202815. "ldr r4, [%[a], #80]\n\t"
  202816. "ldr r5, [%[a], #84]\n\t"
  202817. "ldr r6, [%[a], #88]\n\t"
  202818. "ldr r7, [%[a], #92]\n\t"
  202819. #ifdef WOLFSSL_KEIL
  202820. "adcs r4, r4, r4\n\t"
  202821. #elif defined(__clang__)
  202822. "adcs r4, r4\n\t"
  202823. #else
  202824. "adc r4, r4\n\t"
  202825. #endif
  202826. #ifdef WOLFSSL_KEIL
  202827. "adcs r5, r5, r5\n\t"
  202828. #elif defined(__clang__)
  202829. "adcs r5, r5\n\t"
  202830. #else
  202831. "adc r5, r5\n\t"
  202832. #endif
  202833. #ifdef WOLFSSL_KEIL
  202834. "adcs r6, r6, r6\n\t"
  202835. #elif defined(__clang__)
  202836. "adcs r6, r6\n\t"
  202837. #else
  202838. "adc r6, r6\n\t"
  202839. #endif
  202840. #ifdef WOLFSSL_KEIL
  202841. "adcs r7, r7, r7\n\t"
  202842. #elif defined(__clang__)
  202843. "adcs r7, r7\n\t"
  202844. #else
  202845. "adc r7, r7\n\t"
  202846. #endif
  202847. "str r4, [%[r], #80]\n\t"
  202848. "str r5, [%[r], #84]\n\t"
  202849. "str r6, [%[r], #88]\n\t"
  202850. "str r7, [%[r], #92]\n\t"
  202851. "ldr r4, [%[a], #96]\n\t"
  202852. "ldr r5, [%[a], #100]\n\t"
  202853. "ldr r6, [%[a], #104]\n\t"
  202854. "ldr r7, [%[a], #108]\n\t"
  202855. #ifdef WOLFSSL_KEIL
  202856. "adcs r4, r4, r4\n\t"
  202857. #elif defined(__clang__)
  202858. "adcs r4, r4\n\t"
  202859. #else
  202860. "adc r4, r4\n\t"
  202861. #endif
  202862. #ifdef WOLFSSL_KEIL
  202863. "adcs r5, r5, r5\n\t"
  202864. #elif defined(__clang__)
  202865. "adcs r5, r5\n\t"
  202866. #else
  202867. "adc r5, r5\n\t"
  202868. #endif
  202869. #ifdef WOLFSSL_KEIL
  202870. "adcs r6, r6, r6\n\t"
  202871. #elif defined(__clang__)
  202872. "adcs r6, r6\n\t"
  202873. #else
  202874. "adc r6, r6\n\t"
  202875. #endif
  202876. #ifdef WOLFSSL_KEIL
  202877. "adcs r7, r7, r7\n\t"
  202878. #elif defined(__clang__)
  202879. "adcs r7, r7\n\t"
  202880. #else
  202881. "adc r7, r7\n\t"
  202882. #endif
  202883. "str r4, [%[r], #96]\n\t"
  202884. "str r5, [%[r], #100]\n\t"
  202885. "str r6, [%[r], #104]\n\t"
  202886. "str r7, [%[r], #108]\n\t"
  202887. "ldr r4, [%[a], #112]\n\t"
  202888. "ldr r5, [%[a], #116]\n\t"
  202889. "ldr r6, [%[a], #120]\n\t"
  202890. "ldr r7, [%[a], #124]\n\t"
  202891. #ifdef WOLFSSL_KEIL
  202892. "adcs r4, r4, r4\n\t"
  202893. #elif defined(__clang__)
  202894. "adcs r4, r4\n\t"
  202895. #else
  202896. "adc r4, r4\n\t"
  202897. #endif
  202898. #ifdef WOLFSSL_KEIL
  202899. "adcs r5, r5, r5\n\t"
  202900. #elif defined(__clang__)
  202901. "adcs r5, r5\n\t"
  202902. #else
  202903. "adc r5, r5\n\t"
  202904. #endif
  202905. #ifdef WOLFSSL_KEIL
  202906. "adcs r6, r6, r6\n\t"
  202907. #elif defined(__clang__)
  202908. "adcs r6, r6\n\t"
  202909. #else
  202910. "adc r6, r6\n\t"
  202911. #endif
  202912. #ifdef WOLFSSL_KEIL
  202913. "adcs r7, r7, r7\n\t"
  202914. #elif defined(__clang__)
  202915. "adcs r7, r7\n\t"
  202916. #else
  202917. "adc r7, r7\n\t"
  202918. #endif
  202919. "str r4, [%[r], #112]\n\t"
  202920. "str r5, [%[r], #116]\n\t"
  202921. "str r6, [%[r], #120]\n\t"
  202922. "str r7, [%[r], #124]\n\t"
  202923. "movs r3, #0\n\t"
  202924. "ldr r4, [%[m], #124]\n\t"
  202925. #ifdef WOLFSSL_KEIL
  202926. "adcs r3, r3, r3\n\t"
  202927. #elif defined(__clang__)
  202928. "adcs r3, r3\n\t"
  202929. #else
  202930. "adc r3, r3\n\t"
  202931. #endif
  202932. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  202933. "subs r4, r4, r7\n\t"
  202934. #else
  202935. "sub r4, r4, r7\n\t"
  202936. #endif
  202937. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  202938. "negs r3, r3\n\t"
  202939. #else
  202940. "neg r3, r3\n\t"
  202941. #endif
  202942. #ifdef WOLFSSL_KEIL
  202943. "sbcs r4, r4, r4\n\t"
  202944. #elif defined(__clang__)
  202945. "sbcs r4, r4\n\t"
  202946. #else
  202947. "sbc r4, r4\n\t"
  202948. #endif
  202949. #ifdef WOLFSSL_KEIL
  202950. "orrs r3, r3, r4\n\t"
  202951. #elif defined(__clang__)
  202952. "orrs r3, r4\n\t"
  202953. #else
  202954. "orr r3, r4\n\t"
  202955. #endif
  202956. "ldr r4, [%[r]]\n\t"
  202957. "ldr r5, [%[r], #4]\n\t"
  202958. "ldr r6, [%[m]]\n\t"
  202959. "ldr r7, [%[m], #4]\n\t"
  202960. #ifdef WOLFSSL_KEIL
  202961. "ands r6, r6, r3\n\t"
  202962. #elif defined(__clang__)
  202963. "ands r6, r3\n\t"
  202964. #else
  202965. "and r6, r3\n\t"
  202966. #endif
  202967. #ifdef WOLFSSL_KEIL
  202968. "ands r7, r7, r3\n\t"
  202969. #elif defined(__clang__)
  202970. "ands r7, r3\n\t"
  202971. #else
  202972. "and r7, r3\n\t"
  202973. #endif
  202974. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  202975. "subs r4, r4, r6\n\t"
  202976. #else
  202977. "sub r4, r4, r6\n\t"
  202978. #endif
  202979. #ifdef WOLFSSL_KEIL
  202980. "sbcs r5, r5, r7\n\t"
  202981. #elif defined(__clang__)
  202982. "sbcs r5, r7\n\t"
  202983. #else
  202984. "sbc r5, r7\n\t"
  202985. #endif
  202986. "str r4, [%[r]]\n\t"
  202987. "str r5, [%[r], #4]\n\t"
  202988. "ldr r4, [%[r], #8]\n\t"
  202989. "ldr r5, [%[r], #12]\n\t"
  202990. "ldr r6, [%[m], #8]\n\t"
  202991. "ldr r7, [%[m], #12]\n\t"
  202992. #ifdef WOLFSSL_KEIL
  202993. "ands r6, r6, r3\n\t"
  202994. #elif defined(__clang__)
  202995. "ands r6, r3\n\t"
  202996. #else
  202997. "and r6, r3\n\t"
  202998. #endif
  202999. #ifdef WOLFSSL_KEIL
  203000. "ands r7, r7, r3\n\t"
  203001. #elif defined(__clang__)
  203002. "ands r7, r3\n\t"
  203003. #else
  203004. "and r7, r3\n\t"
  203005. #endif
  203006. #ifdef WOLFSSL_KEIL
  203007. "sbcs r4, r4, r6\n\t"
  203008. #elif defined(__clang__)
  203009. "sbcs r4, r6\n\t"
  203010. #else
  203011. "sbc r4, r6\n\t"
  203012. #endif
  203013. #ifdef WOLFSSL_KEIL
  203014. "sbcs r5, r5, r7\n\t"
  203015. #elif defined(__clang__)
  203016. "sbcs r5, r7\n\t"
  203017. #else
  203018. "sbc r5, r7\n\t"
  203019. #endif
  203020. "str r4, [%[r], #8]\n\t"
  203021. "str r5, [%[r], #12]\n\t"
  203022. "ldr r4, [%[r], #16]\n\t"
  203023. "ldr r5, [%[r], #20]\n\t"
  203024. "ldr r6, [%[m], #16]\n\t"
  203025. "ldr r7, [%[m], #20]\n\t"
  203026. #ifdef WOLFSSL_KEIL
  203027. "ands r6, r6, r3\n\t"
  203028. #elif defined(__clang__)
  203029. "ands r6, r3\n\t"
  203030. #else
  203031. "and r6, r3\n\t"
  203032. #endif
  203033. #ifdef WOLFSSL_KEIL
  203034. "ands r7, r7, r3\n\t"
  203035. #elif defined(__clang__)
  203036. "ands r7, r3\n\t"
  203037. #else
  203038. "and r7, r3\n\t"
  203039. #endif
  203040. #ifdef WOLFSSL_KEIL
  203041. "sbcs r4, r4, r6\n\t"
  203042. #elif defined(__clang__)
  203043. "sbcs r4, r6\n\t"
  203044. #else
  203045. "sbc r4, r6\n\t"
  203046. #endif
  203047. #ifdef WOLFSSL_KEIL
  203048. "sbcs r5, r5, r7\n\t"
  203049. #elif defined(__clang__)
  203050. "sbcs r5, r7\n\t"
  203051. #else
  203052. "sbc r5, r7\n\t"
  203053. #endif
  203054. "str r4, [%[r], #16]\n\t"
  203055. "str r5, [%[r], #20]\n\t"
  203056. "ldr r4, [%[r], #24]\n\t"
  203057. "ldr r5, [%[r], #28]\n\t"
  203058. "ldr r6, [%[m], #24]\n\t"
  203059. "ldr r7, [%[m], #28]\n\t"
  203060. #ifdef WOLFSSL_KEIL
  203061. "ands r6, r6, r3\n\t"
  203062. #elif defined(__clang__)
  203063. "ands r6, r3\n\t"
  203064. #else
  203065. "and r6, r3\n\t"
  203066. #endif
  203067. #ifdef WOLFSSL_KEIL
  203068. "ands r7, r7, r3\n\t"
  203069. #elif defined(__clang__)
  203070. "ands r7, r3\n\t"
  203071. #else
  203072. "and r7, r3\n\t"
  203073. #endif
  203074. #ifdef WOLFSSL_KEIL
  203075. "sbcs r4, r4, r6\n\t"
  203076. #elif defined(__clang__)
  203077. "sbcs r4, r6\n\t"
  203078. #else
  203079. "sbc r4, r6\n\t"
  203080. #endif
  203081. #ifdef WOLFSSL_KEIL
  203082. "sbcs r5, r5, r7\n\t"
  203083. #elif defined(__clang__)
  203084. "sbcs r5, r7\n\t"
  203085. #else
  203086. "sbc r5, r7\n\t"
  203087. #endif
  203088. "str r4, [%[r], #24]\n\t"
  203089. "str r5, [%[r], #28]\n\t"
  203090. "ldr r4, [%[r], #32]\n\t"
  203091. "ldr r5, [%[r], #36]\n\t"
  203092. "ldr r6, [%[m], #32]\n\t"
  203093. "ldr r7, [%[m], #36]\n\t"
  203094. #ifdef WOLFSSL_KEIL
  203095. "ands r6, r6, r3\n\t"
  203096. #elif defined(__clang__)
  203097. "ands r6, r3\n\t"
  203098. #else
  203099. "and r6, r3\n\t"
  203100. #endif
  203101. #ifdef WOLFSSL_KEIL
  203102. "ands r7, r7, r3\n\t"
  203103. #elif defined(__clang__)
  203104. "ands r7, r3\n\t"
  203105. #else
  203106. "and r7, r3\n\t"
  203107. #endif
  203108. #ifdef WOLFSSL_KEIL
  203109. "sbcs r4, r4, r6\n\t"
  203110. #elif defined(__clang__)
  203111. "sbcs r4, r6\n\t"
  203112. #else
  203113. "sbc r4, r6\n\t"
  203114. #endif
  203115. #ifdef WOLFSSL_KEIL
  203116. "sbcs r5, r5, r7\n\t"
  203117. #elif defined(__clang__)
  203118. "sbcs r5, r7\n\t"
  203119. #else
  203120. "sbc r5, r7\n\t"
  203121. #endif
  203122. "str r4, [%[r], #32]\n\t"
  203123. "str r5, [%[r], #36]\n\t"
  203124. "ldr r4, [%[r], #40]\n\t"
  203125. "ldr r5, [%[r], #44]\n\t"
  203126. "ldr r6, [%[m], #40]\n\t"
  203127. "ldr r7, [%[m], #44]\n\t"
  203128. #ifdef WOLFSSL_KEIL
  203129. "ands r6, r6, r3\n\t"
  203130. #elif defined(__clang__)
  203131. "ands r6, r3\n\t"
  203132. #else
  203133. "and r6, r3\n\t"
  203134. #endif
  203135. #ifdef WOLFSSL_KEIL
  203136. "ands r7, r7, r3\n\t"
  203137. #elif defined(__clang__)
  203138. "ands r7, r3\n\t"
  203139. #else
  203140. "and r7, r3\n\t"
  203141. #endif
  203142. #ifdef WOLFSSL_KEIL
  203143. "sbcs r4, r4, r6\n\t"
  203144. #elif defined(__clang__)
  203145. "sbcs r4, r6\n\t"
  203146. #else
  203147. "sbc r4, r6\n\t"
  203148. #endif
  203149. #ifdef WOLFSSL_KEIL
  203150. "sbcs r5, r5, r7\n\t"
  203151. #elif defined(__clang__)
  203152. "sbcs r5, r7\n\t"
  203153. #else
  203154. "sbc r5, r7\n\t"
  203155. #endif
  203156. "str r4, [%[r], #40]\n\t"
  203157. "str r5, [%[r], #44]\n\t"
  203158. "ldr r4, [%[r], #48]\n\t"
  203159. "ldr r5, [%[r], #52]\n\t"
  203160. "ldr r6, [%[m], #48]\n\t"
  203161. "ldr r7, [%[m], #52]\n\t"
  203162. #ifdef WOLFSSL_KEIL
  203163. "ands r6, r6, r3\n\t"
  203164. #elif defined(__clang__)
  203165. "ands r6, r3\n\t"
  203166. #else
  203167. "and r6, r3\n\t"
  203168. #endif
  203169. #ifdef WOLFSSL_KEIL
  203170. "ands r7, r7, r3\n\t"
  203171. #elif defined(__clang__)
  203172. "ands r7, r3\n\t"
  203173. #else
  203174. "and r7, r3\n\t"
  203175. #endif
  203176. #ifdef WOLFSSL_KEIL
  203177. "sbcs r4, r4, r6\n\t"
  203178. #elif defined(__clang__)
  203179. "sbcs r4, r6\n\t"
  203180. #else
  203181. "sbc r4, r6\n\t"
  203182. #endif
  203183. #ifdef WOLFSSL_KEIL
  203184. "sbcs r5, r5, r7\n\t"
  203185. #elif defined(__clang__)
  203186. "sbcs r5, r7\n\t"
  203187. #else
  203188. "sbc r5, r7\n\t"
  203189. #endif
  203190. "str r4, [%[r], #48]\n\t"
  203191. "str r5, [%[r], #52]\n\t"
  203192. "ldr r4, [%[r], #56]\n\t"
  203193. "ldr r5, [%[r], #60]\n\t"
  203194. "ldr r6, [%[m], #56]\n\t"
  203195. "ldr r7, [%[m], #60]\n\t"
  203196. #ifdef WOLFSSL_KEIL
  203197. "ands r6, r6, r3\n\t"
  203198. #elif defined(__clang__)
  203199. "ands r6, r3\n\t"
  203200. #else
  203201. "and r6, r3\n\t"
  203202. #endif
  203203. #ifdef WOLFSSL_KEIL
  203204. "ands r7, r7, r3\n\t"
  203205. #elif defined(__clang__)
  203206. "ands r7, r3\n\t"
  203207. #else
  203208. "and r7, r3\n\t"
  203209. #endif
  203210. #ifdef WOLFSSL_KEIL
  203211. "sbcs r4, r4, r6\n\t"
  203212. #elif defined(__clang__)
  203213. "sbcs r4, r6\n\t"
  203214. #else
  203215. "sbc r4, r6\n\t"
  203216. #endif
  203217. #ifdef WOLFSSL_KEIL
  203218. "sbcs r5, r5, r7\n\t"
  203219. #elif defined(__clang__)
  203220. "sbcs r5, r7\n\t"
  203221. #else
  203222. "sbc r5, r7\n\t"
  203223. #endif
  203224. "str r4, [%[r], #56]\n\t"
  203225. "str r5, [%[r], #60]\n\t"
  203226. "ldr r4, [%[r], #64]\n\t"
  203227. "ldr r5, [%[r], #68]\n\t"
  203228. "ldr r6, [%[m], #64]\n\t"
  203229. "ldr r7, [%[m], #68]\n\t"
  203230. #ifdef WOLFSSL_KEIL
  203231. "ands r6, r6, r3\n\t"
  203232. #elif defined(__clang__)
  203233. "ands r6, r3\n\t"
  203234. #else
  203235. "and r6, r3\n\t"
  203236. #endif
  203237. #ifdef WOLFSSL_KEIL
  203238. "ands r7, r7, r3\n\t"
  203239. #elif defined(__clang__)
  203240. "ands r7, r3\n\t"
  203241. #else
  203242. "and r7, r3\n\t"
  203243. #endif
  203244. #ifdef WOLFSSL_KEIL
  203245. "sbcs r4, r4, r6\n\t"
  203246. #elif defined(__clang__)
  203247. "sbcs r4, r6\n\t"
  203248. #else
  203249. "sbc r4, r6\n\t"
  203250. #endif
  203251. #ifdef WOLFSSL_KEIL
  203252. "sbcs r5, r5, r7\n\t"
  203253. #elif defined(__clang__)
  203254. "sbcs r5, r7\n\t"
  203255. #else
  203256. "sbc r5, r7\n\t"
  203257. #endif
  203258. "str r4, [%[r], #64]\n\t"
  203259. "str r5, [%[r], #68]\n\t"
  203260. "ldr r4, [%[r], #72]\n\t"
  203261. "ldr r5, [%[r], #76]\n\t"
  203262. "ldr r6, [%[m], #72]\n\t"
  203263. "ldr r7, [%[m], #76]\n\t"
  203264. #ifdef WOLFSSL_KEIL
  203265. "ands r6, r6, r3\n\t"
  203266. #elif defined(__clang__)
  203267. "ands r6, r3\n\t"
  203268. #else
  203269. "and r6, r3\n\t"
  203270. #endif
  203271. #ifdef WOLFSSL_KEIL
  203272. "ands r7, r7, r3\n\t"
  203273. #elif defined(__clang__)
  203274. "ands r7, r3\n\t"
  203275. #else
  203276. "and r7, r3\n\t"
  203277. #endif
  203278. #ifdef WOLFSSL_KEIL
  203279. "sbcs r4, r4, r6\n\t"
  203280. #elif defined(__clang__)
  203281. "sbcs r4, r6\n\t"
  203282. #else
  203283. "sbc r4, r6\n\t"
  203284. #endif
  203285. #ifdef WOLFSSL_KEIL
  203286. "sbcs r5, r5, r7\n\t"
  203287. #elif defined(__clang__)
  203288. "sbcs r5, r7\n\t"
  203289. #else
  203290. "sbc r5, r7\n\t"
  203291. #endif
  203292. "str r4, [%[r], #72]\n\t"
  203293. "str r5, [%[r], #76]\n\t"
  203294. "ldr r4, [%[r], #80]\n\t"
  203295. "ldr r5, [%[r], #84]\n\t"
  203296. "ldr r6, [%[m], #80]\n\t"
  203297. "ldr r7, [%[m], #84]\n\t"
  203298. #ifdef WOLFSSL_KEIL
  203299. "ands r6, r6, r3\n\t"
  203300. #elif defined(__clang__)
  203301. "ands r6, r3\n\t"
  203302. #else
  203303. "and r6, r3\n\t"
  203304. #endif
  203305. #ifdef WOLFSSL_KEIL
  203306. "ands r7, r7, r3\n\t"
  203307. #elif defined(__clang__)
  203308. "ands r7, r3\n\t"
  203309. #else
  203310. "and r7, r3\n\t"
  203311. #endif
  203312. #ifdef WOLFSSL_KEIL
  203313. "sbcs r4, r4, r6\n\t"
  203314. #elif defined(__clang__)
  203315. "sbcs r4, r6\n\t"
  203316. #else
  203317. "sbc r4, r6\n\t"
  203318. #endif
  203319. #ifdef WOLFSSL_KEIL
  203320. "sbcs r5, r5, r7\n\t"
  203321. #elif defined(__clang__)
  203322. "sbcs r5, r7\n\t"
  203323. #else
  203324. "sbc r5, r7\n\t"
  203325. #endif
  203326. "str r4, [%[r], #80]\n\t"
  203327. "str r5, [%[r], #84]\n\t"
  203328. "ldr r4, [%[r], #88]\n\t"
  203329. "ldr r5, [%[r], #92]\n\t"
  203330. "ldr r6, [%[m], #88]\n\t"
  203331. "ldr r7, [%[m], #92]\n\t"
  203332. #ifdef WOLFSSL_KEIL
  203333. "ands r6, r6, r3\n\t"
  203334. #elif defined(__clang__)
  203335. "ands r6, r3\n\t"
  203336. #else
  203337. "and r6, r3\n\t"
  203338. #endif
  203339. #ifdef WOLFSSL_KEIL
  203340. "ands r7, r7, r3\n\t"
  203341. #elif defined(__clang__)
  203342. "ands r7, r3\n\t"
  203343. #else
  203344. "and r7, r3\n\t"
  203345. #endif
  203346. #ifdef WOLFSSL_KEIL
  203347. "sbcs r4, r4, r6\n\t"
  203348. #elif defined(__clang__)
  203349. "sbcs r4, r6\n\t"
  203350. #else
  203351. "sbc r4, r6\n\t"
  203352. #endif
  203353. #ifdef WOLFSSL_KEIL
  203354. "sbcs r5, r5, r7\n\t"
  203355. #elif defined(__clang__)
  203356. "sbcs r5, r7\n\t"
  203357. #else
  203358. "sbc r5, r7\n\t"
  203359. #endif
  203360. "str r4, [%[r], #88]\n\t"
  203361. "str r5, [%[r], #92]\n\t"
  203362. "ldr r4, [%[r], #96]\n\t"
  203363. "ldr r5, [%[r], #100]\n\t"
  203364. "ldr r6, [%[m], #96]\n\t"
  203365. "ldr r7, [%[m], #100]\n\t"
  203366. #ifdef WOLFSSL_KEIL
  203367. "ands r6, r6, r3\n\t"
  203368. #elif defined(__clang__)
  203369. "ands r6, r3\n\t"
  203370. #else
  203371. "and r6, r3\n\t"
  203372. #endif
  203373. #ifdef WOLFSSL_KEIL
  203374. "ands r7, r7, r3\n\t"
  203375. #elif defined(__clang__)
  203376. "ands r7, r3\n\t"
  203377. #else
  203378. "and r7, r3\n\t"
  203379. #endif
  203380. #ifdef WOLFSSL_KEIL
  203381. "sbcs r4, r4, r6\n\t"
  203382. #elif defined(__clang__)
  203383. "sbcs r4, r6\n\t"
  203384. #else
  203385. "sbc r4, r6\n\t"
  203386. #endif
  203387. #ifdef WOLFSSL_KEIL
  203388. "sbcs r5, r5, r7\n\t"
  203389. #elif defined(__clang__)
  203390. "sbcs r5, r7\n\t"
  203391. #else
  203392. "sbc r5, r7\n\t"
  203393. #endif
  203394. "str r4, [%[r], #96]\n\t"
  203395. "str r5, [%[r], #100]\n\t"
  203396. "ldr r4, [%[r], #104]\n\t"
  203397. "ldr r5, [%[r], #108]\n\t"
  203398. "ldr r6, [%[m], #104]\n\t"
  203399. "ldr r7, [%[m], #108]\n\t"
  203400. #ifdef WOLFSSL_KEIL
  203401. "ands r6, r6, r3\n\t"
  203402. #elif defined(__clang__)
  203403. "ands r6, r3\n\t"
  203404. #else
  203405. "and r6, r3\n\t"
  203406. #endif
  203407. #ifdef WOLFSSL_KEIL
  203408. "ands r7, r7, r3\n\t"
  203409. #elif defined(__clang__)
  203410. "ands r7, r3\n\t"
  203411. #else
  203412. "and r7, r3\n\t"
  203413. #endif
  203414. #ifdef WOLFSSL_KEIL
  203415. "sbcs r4, r4, r6\n\t"
  203416. #elif defined(__clang__)
  203417. "sbcs r4, r6\n\t"
  203418. #else
  203419. "sbc r4, r6\n\t"
  203420. #endif
  203421. #ifdef WOLFSSL_KEIL
  203422. "sbcs r5, r5, r7\n\t"
  203423. #elif defined(__clang__)
  203424. "sbcs r5, r7\n\t"
  203425. #else
  203426. "sbc r5, r7\n\t"
  203427. #endif
  203428. "str r4, [%[r], #104]\n\t"
  203429. "str r5, [%[r], #108]\n\t"
  203430. "ldr r4, [%[r], #112]\n\t"
  203431. "ldr r5, [%[r], #116]\n\t"
  203432. "ldr r6, [%[m], #112]\n\t"
  203433. "ldr r7, [%[m], #116]\n\t"
  203434. #ifdef WOLFSSL_KEIL
  203435. "ands r6, r6, r3\n\t"
  203436. #elif defined(__clang__)
  203437. "ands r6, r3\n\t"
  203438. #else
  203439. "and r6, r3\n\t"
  203440. #endif
  203441. #ifdef WOLFSSL_KEIL
  203442. "ands r7, r7, r3\n\t"
  203443. #elif defined(__clang__)
  203444. "ands r7, r3\n\t"
  203445. #else
  203446. "and r7, r3\n\t"
  203447. #endif
  203448. #ifdef WOLFSSL_KEIL
  203449. "sbcs r4, r4, r6\n\t"
  203450. #elif defined(__clang__)
  203451. "sbcs r4, r6\n\t"
  203452. #else
  203453. "sbc r4, r6\n\t"
  203454. #endif
  203455. #ifdef WOLFSSL_KEIL
  203456. "sbcs r5, r5, r7\n\t"
  203457. #elif defined(__clang__)
  203458. "sbcs r5, r7\n\t"
  203459. #else
  203460. "sbc r5, r7\n\t"
  203461. #endif
  203462. "str r4, [%[r], #112]\n\t"
  203463. "str r5, [%[r], #116]\n\t"
  203464. "ldr r4, [%[r], #120]\n\t"
  203465. "ldr r5, [%[r], #124]\n\t"
  203466. "ldr r6, [%[m], #120]\n\t"
  203467. "ldr r7, [%[m], #124]\n\t"
  203468. #ifdef WOLFSSL_KEIL
  203469. "ands r6, r6, r3\n\t"
  203470. #elif defined(__clang__)
  203471. "ands r6, r3\n\t"
  203472. #else
  203473. "and r6, r3\n\t"
  203474. #endif
  203475. #ifdef WOLFSSL_KEIL
  203476. "ands r7, r7, r3\n\t"
  203477. #elif defined(__clang__)
  203478. "ands r7, r3\n\t"
  203479. #else
  203480. "and r7, r3\n\t"
  203481. #endif
  203482. #ifdef WOLFSSL_KEIL
  203483. "sbcs r4, r4, r6\n\t"
  203484. #elif defined(__clang__)
  203485. "sbcs r4, r6\n\t"
  203486. #else
  203487. "sbc r4, r6\n\t"
  203488. #endif
  203489. #ifdef WOLFSSL_KEIL
  203490. "sbcs r5, r5, r7\n\t"
  203491. #elif defined(__clang__)
  203492. "sbcs r5, r7\n\t"
  203493. #else
  203494. "sbc r5, r7\n\t"
  203495. #endif
  203496. "str r4, [%[r], #120]\n\t"
  203497. "str r5, [%[r], #124]\n\t"
  203498. : [r] "+l" (r), [a] "+l" (a), [m] "+l" (m)
  203499. :
  203500. : "memory", "r3", "r4", "r5", "r6", "r7"
  203501. );
  203502. }
  203503. /* Triple a Montgomery form number (r = a + a + a % m).
  203504. *
  203505. * r Result of Tripling.
  203506. * a Number to triple in Montgomery form.
  203507. * m Modulus (prime).
  203508. */
  203509. SP_NOINLINE static void sp_1024_mont_tpl_32(sp_digit* r, const sp_digit* a,
  203510. const sp_digit* m)
  203511. {
  203512. __asm__ __volatile__ (
  203513. "ldr r4, [%[a]]\n\t"
  203514. "ldr r5, [%[a], #4]\n\t"
  203515. "ldr r6, [%[a], #8]\n\t"
  203516. "ldr r7, [%[a], #12]\n\t"
  203517. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  203518. "adds r4, r4, r4\n\t"
  203519. #else
  203520. "add r4, r4, r4\n\t"
  203521. #endif
  203522. #ifdef WOLFSSL_KEIL
  203523. "adcs r5, r5, r5\n\t"
  203524. #elif defined(__clang__)
  203525. "adcs r5, r5\n\t"
  203526. #else
  203527. "adc r5, r5\n\t"
  203528. #endif
  203529. #ifdef WOLFSSL_KEIL
  203530. "adcs r6, r6, r6\n\t"
  203531. #elif defined(__clang__)
  203532. "adcs r6, r6\n\t"
  203533. #else
  203534. "adc r6, r6\n\t"
  203535. #endif
  203536. #ifdef WOLFSSL_KEIL
  203537. "adcs r7, r7, r7\n\t"
  203538. #elif defined(__clang__)
  203539. "adcs r7, r7\n\t"
  203540. #else
  203541. "adc r7, r7\n\t"
  203542. #endif
  203543. "str r4, [%[r]]\n\t"
  203544. "str r5, [%[r], #4]\n\t"
  203545. "str r6, [%[r], #8]\n\t"
  203546. "str r7, [%[r], #12]\n\t"
  203547. "ldr r4, [%[a], #16]\n\t"
  203548. "ldr r5, [%[a], #20]\n\t"
  203549. "ldr r6, [%[a], #24]\n\t"
  203550. "ldr r7, [%[a], #28]\n\t"
  203551. #ifdef WOLFSSL_KEIL
  203552. "adcs r4, r4, r4\n\t"
  203553. #elif defined(__clang__)
  203554. "adcs r4, r4\n\t"
  203555. #else
  203556. "adc r4, r4\n\t"
  203557. #endif
  203558. #ifdef WOLFSSL_KEIL
  203559. "adcs r5, r5, r5\n\t"
  203560. #elif defined(__clang__)
  203561. "adcs r5, r5\n\t"
  203562. #else
  203563. "adc r5, r5\n\t"
  203564. #endif
  203565. #ifdef WOLFSSL_KEIL
  203566. "adcs r6, r6, r6\n\t"
  203567. #elif defined(__clang__)
  203568. "adcs r6, r6\n\t"
  203569. #else
  203570. "adc r6, r6\n\t"
  203571. #endif
  203572. #ifdef WOLFSSL_KEIL
  203573. "adcs r7, r7, r7\n\t"
  203574. #elif defined(__clang__)
  203575. "adcs r7, r7\n\t"
  203576. #else
  203577. "adc r7, r7\n\t"
  203578. #endif
  203579. "str r4, [%[r], #16]\n\t"
  203580. "str r5, [%[r], #20]\n\t"
  203581. "str r6, [%[r], #24]\n\t"
  203582. "str r7, [%[r], #28]\n\t"
  203583. "ldr r4, [%[a], #32]\n\t"
  203584. "ldr r5, [%[a], #36]\n\t"
  203585. "ldr r6, [%[a], #40]\n\t"
  203586. "ldr r7, [%[a], #44]\n\t"
  203587. #ifdef WOLFSSL_KEIL
  203588. "adcs r4, r4, r4\n\t"
  203589. #elif defined(__clang__)
  203590. "adcs r4, r4\n\t"
  203591. #else
  203592. "adc r4, r4\n\t"
  203593. #endif
  203594. #ifdef WOLFSSL_KEIL
  203595. "adcs r5, r5, r5\n\t"
  203596. #elif defined(__clang__)
  203597. "adcs r5, r5\n\t"
  203598. #else
  203599. "adc r5, r5\n\t"
  203600. #endif
  203601. #ifdef WOLFSSL_KEIL
  203602. "adcs r6, r6, r6\n\t"
  203603. #elif defined(__clang__)
  203604. "adcs r6, r6\n\t"
  203605. #else
  203606. "adc r6, r6\n\t"
  203607. #endif
  203608. #ifdef WOLFSSL_KEIL
  203609. "adcs r7, r7, r7\n\t"
  203610. #elif defined(__clang__)
  203611. "adcs r7, r7\n\t"
  203612. #else
  203613. "adc r7, r7\n\t"
  203614. #endif
  203615. "str r4, [%[r], #32]\n\t"
  203616. "str r5, [%[r], #36]\n\t"
  203617. "str r6, [%[r], #40]\n\t"
  203618. "str r7, [%[r], #44]\n\t"
  203619. "ldr r4, [%[a], #48]\n\t"
  203620. "ldr r5, [%[a], #52]\n\t"
  203621. "ldr r6, [%[a], #56]\n\t"
  203622. "ldr r7, [%[a], #60]\n\t"
  203623. #ifdef WOLFSSL_KEIL
  203624. "adcs r4, r4, r4\n\t"
  203625. #elif defined(__clang__)
  203626. "adcs r4, r4\n\t"
  203627. #else
  203628. "adc r4, r4\n\t"
  203629. #endif
  203630. #ifdef WOLFSSL_KEIL
  203631. "adcs r5, r5, r5\n\t"
  203632. #elif defined(__clang__)
  203633. "adcs r5, r5\n\t"
  203634. #else
  203635. "adc r5, r5\n\t"
  203636. #endif
  203637. #ifdef WOLFSSL_KEIL
  203638. "adcs r6, r6, r6\n\t"
  203639. #elif defined(__clang__)
  203640. "adcs r6, r6\n\t"
  203641. #else
  203642. "adc r6, r6\n\t"
  203643. #endif
  203644. #ifdef WOLFSSL_KEIL
  203645. "adcs r7, r7, r7\n\t"
  203646. #elif defined(__clang__)
  203647. "adcs r7, r7\n\t"
  203648. #else
  203649. "adc r7, r7\n\t"
  203650. #endif
  203651. "str r4, [%[r], #48]\n\t"
  203652. "str r5, [%[r], #52]\n\t"
  203653. "str r6, [%[r], #56]\n\t"
  203654. "str r7, [%[r], #60]\n\t"
  203655. "ldr r4, [%[a], #64]\n\t"
  203656. "ldr r5, [%[a], #68]\n\t"
  203657. "ldr r6, [%[a], #72]\n\t"
  203658. "ldr r7, [%[a], #76]\n\t"
  203659. #ifdef WOLFSSL_KEIL
  203660. "adcs r4, r4, r4\n\t"
  203661. #elif defined(__clang__)
  203662. "adcs r4, r4\n\t"
  203663. #else
  203664. "adc r4, r4\n\t"
  203665. #endif
  203666. #ifdef WOLFSSL_KEIL
  203667. "adcs r5, r5, r5\n\t"
  203668. #elif defined(__clang__)
  203669. "adcs r5, r5\n\t"
  203670. #else
  203671. "adc r5, r5\n\t"
  203672. #endif
  203673. #ifdef WOLFSSL_KEIL
  203674. "adcs r6, r6, r6\n\t"
  203675. #elif defined(__clang__)
  203676. "adcs r6, r6\n\t"
  203677. #else
  203678. "adc r6, r6\n\t"
  203679. #endif
  203680. #ifdef WOLFSSL_KEIL
  203681. "adcs r7, r7, r7\n\t"
  203682. #elif defined(__clang__)
  203683. "adcs r7, r7\n\t"
  203684. #else
  203685. "adc r7, r7\n\t"
  203686. #endif
  203687. "str r4, [%[r], #64]\n\t"
  203688. "str r5, [%[r], #68]\n\t"
  203689. "str r6, [%[r], #72]\n\t"
  203690. "str r7, [%[r], #76]\n\t"
  203691. "ldr r4, [%[a], #80]\n\t"
  203692. "ldr r5, [%[a], #84]\n\t"
  203693. "ldr r6, [%[a], #88]\n\t"
  203694. "ldr r7, [%[a], #92]\n\t"
  203695. #ifdef WOLFSSL_KEIL
  203696. "adcs r4, r4, r4\n\t"
  203697. #elif defined(__clang__)
  203698. "adcs r4, r4\n\t"
  203699. #else
  203700. "adc r4, r4\n\t"
  203701. #endif
  203702. #ifdef WOLFSSL_KEIL
  203703. "adcs r5, r5, r5\n\t"
  203704. #elif defined(__clang__)
  203705. "adcs r5, r5\n\t"
  203706. #else
  203707. "adc r5, r5\n\t"
  203708. #endif
  203709. #ifdef WOLFSSL_KEIL
  203710. "adcs r6, r6, r6\n\t"
  203711. #elif defined(__clang__)
  203712. "adcs r6, r6\n\t"
  203713. #else
  203714. "adc r6, r6\n\t"
  203715. #endif
  203716. #ifdef WOLFSSL_KEIL
  203717. "adcs r7, r7, r7\n\t"
  203718. #elif defined(__clang__)
  203719. "adcs r7, r7\n\t"
  203720. #else
  203721. "adc r7, r7\n\t"
  203722. #endif
  203723. "str r4, [%[r], #80]\n\t"
  203724. "str r5, [%[r], #84]\n\t"
  203725. "str r6, [%[r], #88]\n\t"
  203726. "str r7, [%[r], #92]\n\t"
  203727. "ldr r4, [%[a], #96]\n\t"
  203728. "ldr r5, [%[a], #100]\n\t"
  203729. "ldr r6, [%[a], #104]\n\t"
  203730. "ldr r7, [%[a], #108]\n\t"
  203731. #ifdef WOLFSSL_KEIL
  203732. "adcs r4, r4, r4\n\t"
  203733. #elif defined(__clang__)
  203734. "adcs r4, r4\n\t"
  203735. #else
  203736. "adc r4, r4\n\t"
  203737. #endif
  203738. #ifdef WOLFSSL_KEIL
  203739. "adcs r5, r5, r5\n\t"
  203740. #elif defined(__clang__)
  203741. "adcs r5, r5\n\t"
  203742. #else
  203743. "adc r5, r5\n\t"
  203744. #endif
  203745. #ifdef WOLFSSL_KEIL
  203746. "adcs r6, r6, r6\n\t"
  203747. #elif defined(__clang__)
  203748. "adcs r6, r6\n\t"
  203749. #else
  203750. "adc r6, r6\n\t"
  203751. #endif
  203752. #ifdef WOLFSSL_KEIL
  203753. "adcs r7, r7, r7\n\t"
  203754. #elif defined(__clang__)
  203755. "adcs r7, r7\n\t"
  203756. #else
  203757. "adc r7, r7\n\t"
  203758. #endif
  203759. "str r4, [%[r], #96]\n\t"
  203760. "str r5, [%[r], #100]\n\t"
  203761. "str r6, [%[r], #104]\n\t"
  203762. "str r7, [%[r], #108]\n\t"
  203763. "ldr r4, [%[a], #112]\n\t"
  203764. "ldr r5, [%[a], #116]\n\t"
  203765. "ldr r6, [%[a], #120]\n\t"
  203766. "ldr r7, [%[a], #124]\n\t"
  203767. #ifdef WOLFSSL_KEIL
  203768. "adcs r4, r4, r4\n\t"
  203769. #elif defined(__clang__)
  203770. "adcs r4, r4\n\t"
  203771. #else
  203772. "adc r4, r4\n\t"
  203773. #endif
  203774. #ifdef WOLFSSL_KEIL
  203775. "adcs r5, r5, r5\n\t"
  203776. #elif defined(__clang__)
  203777. "adcs r5, r5\n\t"
  203778. #else
  203779. "adc r5, r5\n\t"
  203780. #endif
  203781. #ifdef WOLFSSL_KEIL
  203782. "adcs r6, r6, r6\n\t"
  203783. #elif defined(__clang__)
  203784. "adcs r6, r6\n\t"
  203785. #else
  203786. "adc r6, r6\n\t"
  203787. #endif
  203788. #ifdef WOLFSSL_KEIL
  203789. "adcs r7, r7, r7\n\t"
  203790. #elif defined(__clang__)
  203791. "adcs r7, r7\n\t"
  203792. #else
  203793. "adc r7, r7\n\t"
  203794. #endif
  203795. "str r4, [%[r], #112]\n\t"
  203796. "str r5, [%[r], #116]\n\t"
  203797. "str r6, [%[r], #120]\n\t"
  203798. "str r7, [%[r], #124]\n\t"
  203799. "movs r3, #0\n\t"
  203800. "ldr r4, [%[m], #124]\n\t"
  203801. #ifdef WOLFSSL_KEIL
  203802. "adcs r3, r3, r3\n\t"
  203803. #elif defined(__clang__)
  203804. "adcs r3, r3\n\t"
  203805. #else
  203806. "adc r3, r3\n\t"
  203807. #endif
  203808. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  203809. "subs r4, r4, r7\n\t"
  203810. #else
  203811. "sub r4, r4, r7\n\t"
  203812. #endif
  203813. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  203814. "negs r3, r3\n\t"
  203815. #else
  203816. "neg r3, r3\n\t"
  203817. #endif
  203818. #ifdef WOLFSSL_KEIL
  203819. "sbcs r4, r4, r4\n\t"
  203820. #elif defined(__clang__)
  203821. "sbcs r4, r4\n\t"
  203822. #else
  203823. "sbc r4, r4\n\t"
  203824. #endif
  203825. #ifdef WOLFSSL_KEIL
  203826. "orrs r3, r3, r4\n\t"
  203827. #elif defined(__clang__)
  203828. "orrs r3, r4\n\t"
  203829. #else
  203830. "orr r3, r4\n\t"
  203831. #endif
  203832. "ldr r4, [%[r]]\n\t"
  203833. "ldr r5, [%[r], #4]\n\t"
  203834. "ldr r6, [%[m]]\n\t"
  203835. "ldr r7, [%[m], #4]\n\t"
  203836. #ifdef WOLFSSL_KEIL
  203837. "ands r6, r6, r3\n\t"
  203838. #elif defined(__clang__)
  203839. "ands r6, r3\n\t"
  203840. #else
  203841. "and r6, r3\n\t"
  203842. #endif
  203843. #ifdef WOLFSSL_KEIL
  203844. "ands r7, r7, r3\n\t"
  203845. #elif defined(__clang__)
  203846. "ands r7, r3\n\t"
  203847. #else
  203848. "and r7, r3\n\t"
  203849. #endif
  203850. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  203851. "subs r4, r4, r6\n\t"
  203852. #else
  203853. "sub r4, r4, r6\n\t"
  203854. #endif
  203855. #ifdef WOLFSSL_KEIL
  203856. "sbcs r5, r5, r7\n\t"
  203857. #elif defined(__clang__)
  203858. "sbcs r5, r7\n\t"
  203859. #else
  203860. "sbc r5, r7\n\t"
  203861. #endif
  203862. "str r4, [%[r]]\n\t"
  203863. "str r5, [%[r], #4]\n\t"
  203864. "ldr r4, [%[r], #8]\n\t"
  203865. "ldr r5, [%[r], #12]\n\t"
  203866. "ldr r6, [%[m], #8]\n\t"
  203867. "ldr r7, [%[m], #12]\n\t"
  203868. #ifdef WOLFSSL_KEIL
  203869. "ands r6, r6, r3\n\t"
  203870. #elif defined(__clang__)
  203871. "ands r6, r3\n\t"
  203872. #else
  203873. "and r6, r3\n\t"
  203874. #endif
  203875. #ifdef WOLFSSL_KEIL
  203876. "ands r7, r7, r3\n\t"
  203877. #elif defined(__clang__)
  203878. "ands r7, r3\n\t"
  203879. #else
  203880. "and r7, r3\n\t"
  203881. #endif
  203882. #ifdef WOLFSSL_KEIL
  203883. "sbcs r4, r4, r6\n\t"
  203884. #elif defined(__clang__)
  203885. "sbcs r4, r6\n\t"
  203886. #else
  203887. "sbc r4, r6\n\t"
  203888. #endif
  203889. #ifdef WOLFSSL_KEIL
  203890. "sbcs r5, r5, r7\n\t"
  203891. #elif defined(__clang__)
  203892. "sbcs r5, r7\n\t"
  203893. #else
  203894. "sbc r5, r7\n\t"
  203895. #endif
  203896. "str r4, [%[r], #8]\n\t"
  203897. "str r5, [%[r], #12]\n\t"
  203898. "ldr r4, [%[r], #16]\n\t"
  203899. "ldr r5, [%[r], #20]\n\t"
  203900. "ldr r6, [%[m], #16]\n\t"
  203901. "ldr r7, [%[m], #20]\n\t"
  203902. #ifdef WOLFSSL_KEIL
  203903. "ands r6, r6, r3\n\t"
  203904. #elif defined(__clang__)
  203905. "ands r6, r3\n\t"
  203906. #else
  203907. "and r6, r3\n\t"
  203908. #endif
  203909. #ifdef WOLFSSL_KEIL
  203910. "ands r7, r7, r3\n\t"
  203911. #elif defined(__clang__)
  203912. "ands r7, r3\n\t"
  203913. #else
  203914. "and r7, r3\n\t"
  203915. #endif
  203916. #ifdef WOLFSSL_KEIL
  203917. "sbcs r4, r4, r6\n\t"
  203918. #elif defined(__clang__)
  203919. "sbcs r4, r6\n\t"
  203920. #else
  203921. "sbc r4, r6\n\t"
  203922. #endif
  203923. #ifdef WOLFSSL_KEIL
  203924. "sbcs r5, r5, r7\n\t"
  203925. #elif defined(__clang__)
  203926. "sbcs r5, r7\n\t"
  203927. #else
  203928. "sbc r5, r7\n\t"
  203929. #endif
  203930. "str r4, [%[r], #16]\n\t"
  203931. "str r5, [%[r], #20]\n\t"
  203932. "ldr r4, [%[r], #24]\n\t"
  203933. "ldr r5, [%[r], #28]\n\t"
  203934. "ldr r6, [%[m], #24]\n\t"
  203935. "ldr r7, [%[m], #28]\n\t"
  203936. #ifdef WOLFSSL_KEIL
  203937. "ands r6, r6, r3\n\t"
  203938. #elif defined(__clang__)
  203939. "ands r6, r3\n\t"
  203940. #else
  203941. "and r6, r3\n\t"
  203942. #endif
  203943. #ifdef WOLFSSL_KEIL
  203944. "ands r7, r7, r3\n\t"
  203945. #elif defined(__clang__)
  203946. "ands r7, r3\n\t"
  203947. #else
  203948. "and r7, r3\n\t"
  203949. #endif
  203950. #ifdef WOLFSSL_KEIL
  203951. "sbcs r4, r4, r6\n\t"
  203952. #elif defined(__clang__)
  203953. "sbcs r4, r6\n\t"
  203954. #else
  203955. "sbc r4, r6\n\t"
  203956. #endif
  203957. #ifdef WOLFSSL_KEIL
  203958. "sbcs r5, r5, r7\n\t"
  203959. #elif defined(__clang__)
  203960. "sbcs r5, r7\n\t"
  203961. #else
  203962. "sbc r5, r7\n\t"
  203963. #endif
  203964. "str r4, [%[r], #24]\n\t"
  203965. "str r5, [%[r], #28]\n\t"
  203966. "ldr r4, [%[r], #32]\n\t"
  203967. "ldr r5, [%[r], #36]\n\t"
  203968. "ldr r6, [%[m], #32]\n\t"
  203969. "ldr r7, [%[m], #36]\n\t"
  203970. #ifdef WOLFSSL_KEIL
  203971. "ands r6, r6, r3\n\t"
  203972. #elif defined(__clang__)
  203973. "ands r6, r3\n\t"
  203974. #else
  203975. "and r6, r3\n\t"
  203976. #endif
  203977. #ifdef WOLFSSL_KEIL
  203978. "ands r7, r7, r3\n\t"
  203979. #elif defined(__clang__)
  203980. "ands r7, r3\n\t"
  203981. #else
  203982. "and r7, r3\n\t"
  203983. #endif
  203984. #ifdef WOLFSSL_KEIL
  203985. "sbcs r4, r4, r6\n\t"
  203986. #elif defined(__clang__)
  203987. "sbcs r4, r6\n\t"
  203988. #else
  203989. "sbc r4, r6\n\t"
  203990. #endif
  203991. #ifdef WOLFSSL_KEIL
  203992. "sbcs r5, r5, r7\n\t"
  203993. #elif defined(__clang__)
  203994. "sbcs r5, r7\n\t"
  203995. #else
  203996. "sbc r5, r7\n\t"
  203997. #endif
  203998. "str r4, [%[r], #32]\n\t"
  203999. "str r5, [%[r], #36]\n\t"
  204000. "ldr r4, [%[r], #40]\n\t"
  204001. "ldr r5, [%[r], #44]\n\t"
  204002. "ldr r6, [%[m], #40]\n\t"
  204003. "ldr r7, [%[m], #44]\n\t"
  204004. #ifdef WOLFSSL_KEIL
  204005. "ands r6, r6, r3\n\t"
  204006. #elif defined(__clang__)
  204007. "ands r6, r3\n\t"
  204008. #else
  204009. "and r6, r3\n\t"
  204010. #endif
  204011. #ifdef WOLFSSL_KEIL
  204012. "ands r7, r7, r3\n\t"
  204013. #elif defined(__clang__)
  204014. "ands r7, r3\n\t"
  204015. #else
  204016. "and r7, r3\n\t"
  204017. #endif
  204018. #ifdef WOLFSSL_KEIL
  204019. "sbcs r4, r4, r6\n\t"
  204020. #elif defined(__clang__)
  204021. "sbcs r4, r6\n\t"
  204022. #else
  204023. "sbc r4, r6\n\t"
  204024. #endif
  204025. #ifdef WOLFSSL_KEIL
  204026. "sbcs r5, r5, r7\n\t"
  204027. #elif defined(__clang__)
  204028. "sbcs r5, r7\n\t"
  204029. #else
  204030. "sbc r5, r7\n\t"
  204031. #endif
  204032. "str r4, [%[r], #40]\n\t"
  204033. "str r5, [%[r], #44]\n\t"
  204034. "ldr r4, [%[r], #48]\n\t"
  204035. "ldr r5, [%[r], #52]\n\t"
  204036. "ldr r6, [%[m], #48]\n\t"
  204037. "ldr r7, [%[m], #52]\n\t"
  204038. #ifdef WOLFSSL_KEIL
  204039. "ands r6, r6, r3\n\t"
  204040. #elif defined(__clang__)
  204041. "ands r6, r3\n\t"
  204042. #else
  204043. "and r6, r3\n\t"
  204044. #endif
  204045. #ifdef WOLFSSL_KEIL
  204046. "ands r7, r7, r3\n\t"
  204047. #elif defined(__clang__)
  204048. "ands r7, r3\n\t"
  204049. #else
  204050. "and r7, r3\n\t"
  204051. #endif
  204052. #ifdef WOLFSSL_KEIL
  204053. "sbcs r4, r4, r6\n\t"
  204054. #elif defined(__clang__)
  204055. "sbcs r4, r6\n\t"
  204056. #else
  204057. "sbc r4, r6\n\t"
  204058. #endif
  204059. #ifdef WOLFSSL_KEIL
  204060. "sbcs r5, r5, r7\n\t"
  204061. #elif defined(__clang__)
  204062. "sbcs r5, r7\n\t"
  204063. #else
  204064. "sbc r5, r7\n\t"
  204065. #endif
  204066. "str r4, [%[r], #48]\n\t"
  204067. "str r5, [%[r], #52]\n\t"
  204068. "ldr r4, [%[r], #56]\n\t"
  204069. "ldr r5, [%[r], #60]\n\t"
  204070. "ldr r6, [%[m], #56]\n\t"
  204071. "ldr r7, [%[m], #60]\n\t"
  204072. #ifdef WOLFSSL_KEIL
  204073. "ands r6, r6, r3\n\t"
  204074. #elif defined(__clang__)
  204075. "ands r6, r3\n\t"
  204076. #else
  204077. "and r6, r3\n\t"
  204078. #endif
  204079. #ifdef WOLFSSL_KEIL
  204080. "ands r7, r7, r3\n\t"
  204081. #elif defined(__clang__)
  204082. "ands r7, r3\n\t"
  204083. #else
  204084. "and r7, r3\n\t"
  204085. #endif
  204086. #ifdef WOLFSSL_KEIL
  204087. "sbcs r4, r4, r6\n\t"
  204088. #elif defined(__clang__)
  204089. "sbcs r4, r6\n\t"
  204090. #else
  204091. "sbc r4, r6\n\t"
  204092. #endif
  204093. #ifdef WOLFSSL_KEIL
  204094. "sbcs r5, r5, r7\n\t"
  204095. #elif defined(__clang__)
  204096. "sbcs r5, r7\n\t"
  204097. #else
  204098. "sbc r5, r7\n\t"
  204099. #endif
  204100. "str r4, [%[r], #56]\n\t"
  204101. "str r5, [%[r], #60]\n\t"
  204102. "ldr r4, [%[r], #64]\n\t"
  204103. "ldr r5, [%[r], #68]\n\t"
  204104. "ldr r6, [%[m], #64]\n\t"
  204105. "ldr r7, [%[m], #68]\n\t"
  204106. #ifdef WOLFSSL_KEIL
  204107. "ands r6, r6, r3\n\t"
  204108. #elif defined(__clang__)
  204109. "ands r6, r3\n\t"
  204110. #else
  204111. "and r6, r3\n\t"
  204112. #endif
  204113. #ifdef WOLFSSL_KEIL
  204114. "ands r7, r7, r3\n\t"
  204115. #elif defined(__clang__)
  204116. "ands r7, r3\n\t"
  204117. #else
  204118. "and r7, r3\n\t"
  204119. #endif
  204120. #ifdef WOLFSSL_KEIL
  204121. "sbcs r4, r4, r6\n\t"
  204122. #elif defined(__clang__)
  204123. "sbcs r4, r6\n\t"
  204124. #else
  204125. "sbc r4, r6\n\t"
  204126. #endif
  204127. #ifdef WOLFSSL_KEIL
  204128. "sbcs r5, r5, r7\n\t"
  204129. #elif defined(__clang__)
  204130. "sbcs r5, r7\n\t"
  204131. #else
  204132. "sbc r5, r7\n\t"
  204133. #endif
  204134. "str r4, [%[r], #64]\n\t"
  204135. "str r5, [%[r], #68]\n\t"
  204136. "ldr r4, [%[r], #72]\n\t"
  204137. "ldr r5, [%[r], #76]\n\t"
  204138. "ldr r6, [%[m], #72]\n\t"
  204139. "ldr r7, [%[m], #76]\n\t"
  204140. #ifdef WOLFSSL_KEIL
  204141. "ands r6, r6, r3\n\t"
  204142. #elif defined(__clang__)
  204143. "ands r6, r3\n\t"
  204144. #else
  204145. "and r6, r3\n\t"
  204146. #endif
  204147. #ifdef WOLFSSL_KEIL
  204148. "ands r7, r7, r3\n\t"
  204149. #elif defined(__clang__)
  204150. "ands r7, r3\n\t"
  204151. #else
  204152. "and r7, r3\n\t"
  204153. #endif
  204154. #ifdef WOLFSSL_KEIL
  204155. "sbcs r4, r4, r6\n\t"
  204156. #elif defined(__clang__)
  204157. "sbcs r4, r6\n\t"
  204158. #else
  204159. "sbc r4, r6\n\t"
  204160. #endif
  204161. #ifdef WOLFSSL_KEIL
  204162. "sbcs r5, r5, r7\n\t"
  204163. #elif defined(__clang__)
  204164. "sbcs r5, r7\n\t"
  204165. #else
  204166. "sbc r5, r7\n\t"
  204167. #endif
  204168. "str r4, [%[r], #72]\n\t"
  204169. "str r5, [%[r], #76]\n\t"
  204170. "ldr r4, [%[r], #80]\n\t"
  204171. "ldr r5, [%[r], #84]\n\t"
  204172. "ldr r6, [%[m], #80]\n\t"
  204173. "ldr r7, [%[m], #84]\n\t"
  204174. #ifdef WOLFSSL_KEIL
  204175. "ands r6, r6, r3\n\t"
  204176. #elif defined(__clang__)
  204177. "ands r6, r3\n\t"
  204178. #else
  204179. "and r6, r3\n\t"
  204180. #endif
  204181. #ifdef WOLFSSL_KEIL
  204182. "ands r7, r7, r3\n\t"
  204183. #elif defined(__clang__)
  204184. "ands r7, r3\n\t"
  204185. #else
  204186. "and r7, r3\n\t"
  204187. #endif
  204188. #ifdef WOLFSSL_KEIL
  204189. "sbcs r4, r4, r6\n\t"
  204190. #elif defined(__clang__)
  204191. "sbcs r4, r6\n\t"
  204192. #else
  204193. "sbc r4, r6\n\t"
  204194. #endif
  204195. #ifdef WOLFSSL_KEIL
  204196. "sbcs r5, r5, r7\n\t"
  204197. #elif defined(__clang__)
  204198. "sbcs r5, r7\n\t"
  204199. #else
  204200. "sbc r5, r7\n\t"
  204201. #endif
  204202. "str r4, [%[r], #80]\n\t"
  204203. "str r5, [%[r], #84]\n\t"
  204204. "ldr r4, [%[r], #88]\n\t"
  204205. "ldr r5, [%[r], #92]\n\t"
  204206. "ldr r6, [%[m], #88]\n\t"
  204207. "ldr r7, [%[m], #92]\n\t"
  204208. #ifdef WOLFSSL_KEIL
  204209. "ands r6, r6, r3\n\t"
  204210. #elif defined(__clang__)
  204211. "ands r6, r3\n\t"
  204212. #else
  204213. "and r6, r3\n\t"
  204214. #endif
  204215. #ifdef WOLFSSL_KEIL
  204216. "ands r7, r7, r3\n\t"
  204217. #elif defined(__clang__)
  204218. "ands r7, r3\n\t"
  204219. #else
  204220. "and r7, r3\n\t"
  204221. #endif
  204222. #ifdef WOLFSSL_KEIL
  204223. "sbcs r4, r4, r6\n\t"
  204224. #elif defined(__clang__)
  204225. "sbcs r4, r6\n\t"
  204226. #else
  204227. "sbc r4, r6\n\t"
  204228. #endif
  204229. #ifdef WOLFSSL_KEIL
  204230. "sbcs r5, r5, r7\n\t"
  204231. #elif defined(__clang__)
  204232. "sbcs r5, r7\n\t"
  204233. #else
  204234. "sbc r5, r7\n\t"
  204235. #endif
  204236. "str r4, [%[r], #88]\n\t"
  204237. "str r5, [%[r], #92]\n\t"
  204238. "ldr r4, [%[r], #96]\n\t"
  204239. "ldr r5, [%[r], #100]\n\t"
  204240. "ldr r6, [%[m], #96]\n\t"
  204241. "ldr r7, [%[m], #100]\n\t"
  204242. #ifdef WOLFSSL_KEIL
  204243. "ands r6, r6, r3\n\t"
  204244. #elif defined(__clang__)
  204245. "ands r6, r3\n\t"
  204246. #else
  204247. "and r6, r3\n\t"
  204248. #endif
  204249. #ifdef WOLFSSL_KEIL
  204250. "ands r7, r7, r3\n\t"
  204251. #elif defined(__clang__)
  204252. "ands r7, r3\n\t"
  204253. #else
  204254. "and r7, r3\n\t"
  204255. #endif
  204256. #ifdef WOLFSSL_KEIL
  204257. "sbcs r4, r4, r6\n\t"
  204258. #elif defined(__clang__)
  204259. "sbcs r4, r6\n\t"
  204260. #else
  204261. "sbc r4, r6\n\t"
  204262. #endif
  204263. #ifdef WOLFSSL_KEIL
  204264. "sbcs r5, r5, r7\n\t"
  204265. #elif defined(__clang__)
  204266. "sbcs r5, r7\n\t"
  204267. #else
  204268. "sbc r5, r7\n\t"
  204269. #endif
  204270. "str r4, [%[r], #96]\n\t"
  204271. "str r5, [%[r], #100]\n\t"
  204272. "ldr r4, [%[r], #104]\n\t"
  204273. "ldr r5, [%[r], #108]\n\t"
  204274. "ldr r6, [%[m], #104]\n\t"
  204275. "ldr r7, [%[m], #108]\n\t"
  204276. #ifdef WOLFSSL_KEIL
  204277. "ands r6, r6, r3\n\t"
  204278. #elif defined(__clang__)
  204279. "ands r6, r3\n\t"
  204280. #else
  204281. "and r6, r3\n\t"
  204282. #endif
  204283. #ifdef WOLFSSL_KEIL
  204284. "ands r7, r7, r3\n\t"
  204285. #elif defined(__clang__)
  204286. "ands r7, r3\n\t"
  204287. #else
  204288. "and r7, r3\n\t"
  204289. #endif
  204290. #ifdef WOLFSSL_KEIL
  204291. "sbcs r4, r4, r6\n\t"
  204292. #elif defined(__clang__)
  204293. "sbcs r4, r6\n\t"
  204294. #else
  204295. "sbc r4, r6\n\t"
  204296. #endif
  204297. #ifdef WOLFSSL_KEIL
  204298. "sbcs r5, r5, r7\n\t"
  204299. #elif defined(__clang__)
  204300. "sbcs r5, r7\n\t"
  204301. #else
  204302. "sbc r5, r7\n\t"
  204303. #endif
  204304. "str r4, [%[r], #104]\n\t"
  204305. "str r5, [%[r], #108]\n\t"
  204306. "ldr r4, [%[r], #112]\n\t"
  204307. "ldr r5, [%[r], #116]\n\t"
  204308. "ldr r6, [%[m], #112]\n\t"
  204309. "ldr r7, [%[m], #116]\n\t"
  204310. #ifdef WOLFSSL_KEIL
  204311. "ands r6, r6, r3\n\t"
  204312. #elif defined(__clang__)
  204313. "ands r6, r3\n\t"
  204314. #else
  204315. "and r6, r3\n\t"
  204316. #endif
  204317. #ifdef WOLFSSL_KEIL
  204318. "ands r7, r7, r3\n\t"
  204319. #elif defined(__clang__)
  204320. "ands r7, r3\n\t"
  204321. #else
  204322. "and r7, r3\n\t"
  204323. #endif
  204324. #ifdef WOLFSSL_KEIL
  204325. "sbcs r4, r4, r6\n\t"
  204326. #elif defined(__clang__)
  204327. "sbcs r4, r6\n\t"
  204328. #else
  204329. "sbc r4, r6\n\t"
  204330. #endif
  204331. #ifdef WOLFSSL_KEIL
  204332. "sbcs r5, r5, r7\n\t"
  204333. #elif defined(__clang__)
  204334. "sbcs r5, r7\n\t"
  204335. #else
  204336. "sbc r5, r7\n\t"
  204337. #endif
  204338. "str r4, [%[r], #112]\n\t"
  204339. "str r5, [%[r], #116]\n\t"
  204340. "ldr r4, [%[r], #120]\n\t"
  204341. "ldr r5, [%[r], #124]\n\t"
  204342. "ldr r6, [%[m], #120]\n\t"
  204343. "ldr r7, [%[m], #124]\n\t"
  204344. #ifdef WOLFSSL_KEIL
  204345. "ands r6, r6, r3\n\t"
  204346. #elif defined(__clang__)
  204347. "ands r6, r3\n\t"
  204348. #else
  204349. "and r6, r3\n\t"
  204350. #endif
  204351. #ifdef WOLFSSL_KEIL
  204352. "ands r7, r7, r3\n\t"
  204353. #elif defined(__clang__)
  204354. "ands r7, r3\n\t"
  204355. #else
  204356. "and r7, r3\n\t"
  204357. #endif
  204358. #ifdef WOLFSSL_KEIL
  204359. "sbcs r4, r4, r6\n\t"
  204360. #elif defined(__clang__)
  204361. "sbcs r4, r6\n\t"
  204362. #else
  204363. "sbc r4, r6\n\t"
  204364. #endif
  204365. #ifdef WOLFSSL_KEIL
  204366. "sbcs r5, r5, r7\n\t"
  204367. #elif defined(__clang__)
  204368. "sbcs r5, r7\n\t"
  204369. #else
  204370. "sbc r5, r7\n\t"
  204371. #endif
  204372. "str r4, [%[r], #120]\n\t"
  204373. "str r5, [%[r], #124]\n\t"
  204374. "ldr r4, [%[a]]\n\t"
  204375. "ldr r5, [%[a], #4]\n\t"
  204376. "ldr r6, [%[r]]\n\t"
  204377. "ldr r7, [%[r], #4]\n\t"
  204378. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  204379. "adds r6, r6, r4\n\t"
  204380. #else
  204381. "add r6, r6, r4\n\t"
  204382. #endif
  204383. #ifdef WOLFSSL_KEIL
  204384. "adcs r7, r7, r5\n\t"
  204385. #elif defined(__clang__)
  204386. "adcs r7, r5\n\t"
  204387. #else
  204388. "adc r7, r5\n\t"
  204389. #endif
  204390. "str r6, [%[r]]\n\t"
  204391. "str r7, [%[r], #4]\n\t"
  204392. "ldr r4, [%[a], #8]\n\t"
  204393. "ldr r5, [%[a], #12]\n\t"
  204394. "ldr r6, [%[r], #8]\n\t"
  204395. "ldr r7, [%[r], #12]\n\t"
  204396. #ifdef WOLFSSL_KEIL
  204397. "adcs r6, r6, r4\n\t"
  204398. #elif defined(__clang__)
  204399. "adcs r6, r4\n\t"
  204400. #else
  204401. "adc r6, r4\n\t"
  204402. #endif
  204403. #ifdef WOLFSSL_KEIL
  204404. "adcs r7, r7, r5\n\t"
  204405. #elif defined(__clang__)
  204406. "adcs r7, r5\n\t"
  204407. #else
  204408. "adc r7, r5\n\t"
  204409. #endif
  204410. "str r6, [%[r], #8]\n\t"
  204411. "str r7, [%[r], #12]\n\t"
  204412. "ldr r4, [%[a], #16]\n\t"
  204413. "ldr r5, [%[a], #20]\n\t"
  204414. "ldr r6, [%[r], #16]\n\t"
  204415. "ldr r7, [%[r], #20]\n\t"
  204416. #ifdef WOLFSSL_KEIL
  204417. "adcs r6, r6, r4\n\t"
  204418. #elif defined(__clang__)
  204419. "adcs r6, r4\n\t"
  204420. #else
  204421. "adc r6, r4\n\t"
  204422. #endif
  204423. #ifdef WOLFSSL_KEIL
  204424. "adcs r7, r7, r5\n\t"
  204425. #elif defined(__clang__)
  204426. "adcs r7, r5\n\t"
  204427. #else
  204428. "adc r7, r5\n\t"
  204429. #endif
  204430. "str r6, [%[r], #16]\n\t"
  204431. "str r7, [%[r], #20]\n\t"
  204432. "ldr r4, [%[a], #24]\n\t"
  204433. "ldr r5, [%[a], #28]\n\t"
  204434. "ldr r6, [%[r], #24]\n\t"
  204435. "ldr r7, [%[r], #28]\n\t"
  204436. #ifdef WOLFSSL_KEIL
  204437. "adcs r6, r6, r4\n\t"
  204438. #elif defined(__clang__)
  204439. "adcs r6, r4\n\t"
  204440. #else
  204441. "adc r6, r4\n\t"
  204442. #endif
  204443. #ifdef WOLFSSL_KEIL
  204444. "adcs r7, r7, r5\n\t"
  204445. #elif defined(__clang__)
  204446. "adcs r7, r5\n\t"
  204447. #else
  204448. "adc r7, r5\n\t"
  204449. #endif
  204450. "str r6, [%[r], #24]\n\t"
  204451. "str r7, [%[r], #28]\n\t"
  204452. "ldr r4, [%[a], #32]\n\t"
  204453. "ldr r5, [%[a], #36]\n\t"
  204454. "ldr r6, [%[r], #32]\n\t"
  204455. "ldr r7, [%[r], #36]\n\t"
  204456. #ifdef WOLFSSL_KEIL
  204457. "adcs r6, r6, r4\n\t"
  204458. #elif defined(__clang__)
  204459. "adcs r6, r4\n\t"
  204460. #else
  204461. "adc r6, r4\n\t"
  204462. #endif
  204463. #ifdef WOLFSSL_KEIL
  204464. "adcs r7, r7, r5\n\t"
  204465. #elif defined(__clang__)
  204466. "adcs r7, r5\n\t"
  204467. #else
  204468. "adc r7, r5\n\t"
  204469. #endif
  204470. "str r6, [%[r], #32]\n\t"
  204471. "str r7, [%[r], #36]\n\t"
  204472. "ldr r4, [%[a], #40]\n\t"
  204473. "ldr r5, [%[a], #44]\n\t"
  204474. "ldr r6, [%[r], #40]\n\t"
  204475. "ldr r7, [%[r], #44]\n\t"
  204476. #ifdef WOLFSSL_KEIL
  204477. "adcs r6, r6, r4\n\t"
  204478. #elif defined(__clang__)
  204479. "adcs r6, r4\n\t"
  204480. #else
  204481. "adc r6, r4\n\t"
  204482. #endif
  204483. #ifdef WOLFSSL_KEIL
  204484. "adcs r7, r7, r5\n\t"
  204485. #elif defined(__clang__)
  204486. "adcs r7, r5\n\t"
  204487. #else
  204488. "adc r7, r5\n\t"
  204489. #endif
  204490. "str r6, [%[r], #40]\n\t"
  204491. "str r7, [%[r], #44]\n\t"
  204492. "ldr r4, [%[a], #48]\n\t"
  204493. "ldr r5, [%[a], #52]\n\t"
  204494. "ldr r6, [%[r], #48]\n\t"
  204495. "ldr r7, [%[r], #52]\n\t"
  204496. #ifdef WOLFSSL_KEIL
  204497. "adcs r6, r6, r4\n\t"
  204498. #elif defined(__clang__)
  204499. "adcs r6, r4\n\t"
  204500. #else
  204501. "adc r6, r4\n\t"
  204502. #endif
  204503. #ifdef WOLFSSL_KEIL
  204504. "adcs r7, r7, r5\n\t"
  204505. #elif defined(__clang__)
  204506. "adcs r7, r5\n\t"
  204507. #else
  204508. "adc r7, r5\n\t"
  204509. #endif
  204510. "str r6, [%[r], #48]\n\t"
  204511. "str r7, [%[r], #52]\n\t"
  204512. "ldr r4, [%[a], #56]\n\t"
  204513. "ldr r5, [%[a], #60]\n\t"
  204514. "ldr r6, [%[r], #56]\n\t"
  204515. "ldr r7, [%[r], #60]\n\t"
  204516. #ifdef WOLFSSL_KEIL
  204517. "adcs r6, r6, r4\n\t"
  204518. #elif defined(__clang__)
  204519. "adcs r6, r4\n\t"
  204520. #else
  204521. "adc r6, r4\n\t"
  204522. #endif
  204523. #ifdef WOLFSSL_KEIL
  204524. "adcs r7, r7, r5\n\t"
  204525. #elif defined(__clang__)
  204526. "adcs r7, r5\n\t"
  204527. #else
  204528. "adc r7, r5\n\t"
  204529. #endif
  204530. "str r6, [%[r], #56]\n\t"
  204531. "str r7, [%[r], #60]\n\t"
  204532. "ldr r4, [%[a], #64]\n\t"
  204533. "ldr r5, [%[a], #68]\n\t"
  204534. "ldr r6, [%[r], #64]\n\t"
  204535. "ldr r7, [%[r], #68]\n\t"
  204536. #ifdef WOLFSSL_KEIL
  204537. "adcs r6, r6, r4\n\t"
  204538. #elif defined(__clang__)
  204539. "adcs r6, r4\n\t"
  204540. #else
  204541. "adc r6, r4\n\t"
  204542. #endif
  204543. #ifdef WOLFSSL_KEIL
  204544. "adcs r7, r7, r5\n\t"
  204545. #elif defined(__clang__)
  204546. "adcs r7, r5\n\t"
  204547. #else
  204548. "adc r7, r5\n\t"
  204549. #endif
  204550. "str r6, [%[r], #64]\n\t"
  204551. "str r7, [%[r], #68]\n\t"
  204552. "ldr r4, [%[a], #72]\n\t"
  204553. "ldr r5, [%[a], #76]\n\t"
  204554. "ldr r6, [%[r], #72]\n\t"
  204555. "ldr r7, [%[r], #76]\n\t"
  204556. #ifdef WOLFSSL_KEIL
  204557. "adcs r6, r6, r4\n\t"
  204558. #elif defined(__clang__)
  204559. "adcs r6, r4\n\t"
  204560. #else
  204561. "adc r6, r4\n\t"
  204562. #endif
  204563. #ifdef WOLFSSL_KEIL
  204564. "adcs r7, r7, r5\n\t"
  204565. #elif defined(__clang__)
  204566. "adcs r7, r5\n\t"
  204567. #else
  204568. "adc r7, r5\n\t"
  204569. #endif
  204570. "str r6, [%[r], #72]\n\t"
  204571. "str r7, [%[r], #76]\n\t"
  204572. "ldr r4, [%[a], #80]\n\t"
  204573. "ldr r5, [%[a], #84]\n\t"
  204574. "ldr r6, [%[r], #80]\n\t"
  204575. "ldr r7, [%[r], #84]\n\t"
  204576. #ifdef WOLFSSL_KEIL
  204577. "adcs r6, r6, r4\n\t"
  204578. #elif defined(__clang__)
  204579. "adcs r6, r4\n\t"
  204580. #else
  204581. "adc r6, r4\n\t"
  204582. #endif
  204583. #ifdef WOLFSSL_KEIL
  204584. "adcs r7, r7, r5\n\t"
  204585. #elif defined(__clang__)
  204586. "adcs r7, r5\n\t"
  204587. #else
  204588. "adc r7, r5\n\t"
  204589. #endif
  204590. "str r6, [%[r], #80]\n\t"
  204591. "str r7, [%[r], #84]\n\t"
  204592. "ldr r4, [%[a], #88]\n\t"
  204593. "ldr r5, [%[a], #92]\n\t"
  204594. "ldr r6, [%[r], #88]\n\t"
  204595. "ldr r7, [%[r], #92]\n\t"
  204596. #ifdef WOLFSSL_KEIL
  204597. "adcs r6, r6, r4\n\t"
  204598. #elif defined(__clang__)
  204599. "adcs r6, r4\n\t"
  204600. #else
  204601. "adc r6, r4\n\t"
  204602. #endif
  204603. #ifdef WOLFSSL_KEIL
  204604. "adcs r7, r7, r5\n\t"
  204605. #elif defined(__clang__)
  204606. "adcs r7, r5\n\t"
  204607. #else
  204608. "adc r7, r5\n\t"
  204609. #endif
  204610. "str r6, [%[r], #88]\n\t"
  204611. "str r7, [%[r], #92]\n\t"
  204612. "ldr r4, [%[a], #96]\n\t"
  204613. "ldr r5, [%[a], #100]\n\t"
  204614. "ldr r6, [%[r], #96]\n\t"
  204615. "ldr r7, [%[r], #100]\n\t"
  204616. #ifdef WOLFSSL_KEIL
  204617. "adcs r6, r6, r4\n\t"
  204618. #elif defined(__clang__)
  204619. "adcs r6, r4\n\t"
  204620. #else
  204621. "adc r6, r4\n\t"
  204622. #endif
  204623. #ifdef WOLFSSL_KEIL
  204624. "adcs r7, r7, r5\n\t"
  204625. #elif defined(__clang__)
  204626. "adcs r7, r5\n\t"
  204627. #else
  204628. "adc r7, r5\n\t"
  204629. #endif
  204630. "str r6, [%[r], #96]\n\t"
  204631. "str r7, [%[r], #100]\n\t"
  204632. "ldr r4, [%[a], #104]\n\t"
  204633. "ldr r5, [%[a], #108]\n\t"
  204634. "ldr r6, [%[r], #104]\n\t"
  204635. "ldr r7, [%[r], #108]\n\t"
  204636. #ifdef WOLFSSL_KEIL
  204637. "adcs r6, r6, r4\n\t"
  204638. #elif defined(__clang__)
  204639. "adcs r6, r4\n\t"
  204640. #else
  204641. "adc r6, r4\n\t"
  204642. #endif
  204643. #ifdef WOLFSSL_KEIL
  204644. "adcs r7, r7, r5\n\t"
  204645. #elif defined(__clang__)
  204646. "adcs r7, r5\n\t"
  204647. #else
  204648. "adc r7, r5\n\t"
  204649. #endif
  204650. "str r6, [%[r], #104]\n\t"
  204651. "str r7, [%[r], #108]\n\t"
  204652. "ldr r4, [%[a], #112]\n\t"
  204653. "ldr r5, [%[a], #116]\n\t"
  204654. "ldr r6, [%[r], #112]\n\t"
  204655. "ldr r7, [%[r], #116]\n\t"
  204656. #ifdef WOLFSSL_KEIL
  204657. "adcs r6, r6, r4\n\t"
  204658. #elif defined(__clang__)
  204659. "adcs r6, r4\n\t"
  204660. #else
  204661. "adc r6, r4\n\t"
  204662. #endif
  204663. #ifdef WOLFSSL_KEIL
  204664. "adcs r7, r7, r5\n\t"
  204665. #elif defined(__clang__)
  204666. "adcs r7, r5\n\t"
  204667. #else
  204668. "adc r7, r5\n\t"
  204669. #endif
  204670. "str r6, [%[r], #112]\n\t"
  204671. "str r7, [%[r], #116]\n\t"
  204672. "ldr r4, [%[a], #120]\n\t"
  204673. "ldr r5, [%[a], #124]\n\t"
  204674. "ldr r6, [%[r], #120]\n\t"
  204675. "ldr r7, [%[r], #124]\n\t"
  204676. #ifdef WOLFSSL_KEIL
  204677. "adcs r6, r6, r4\n\t"
  204678. #elif defined(__clang__)
  204679. "adcs r6, r4\n\t"
  204680. #else
  204681. "adc r6, r4\n\t"
  204682. #endif
  204683. #ifdef WOLFSSL_KEIL
  204684. "adcs r7, r7, r5\n\t"
  204685. #elif defined(__clang__)
  204686. "adcs r7, r5\n\t"
  204687. #else
  204688. "adc r7, r5\n\t"
  204689. #endif
  204690. "str r6, [%[r], #120]\n\t"
  204691. "str r7, [%[r], #124]\n\t"
  204692. "movs r3, #0\n\t"
  204693. "ldr r5, [%[m], #124]\n\t"
  204694. #ifdef WOLFSSL_KEIL
  204695. "adcs r3, r3, r3\n\t"
  204696. #elif defined(__clang__)
  204697. "adcs r3, r3\n\t"
  204698. #else
  204699. "adc r3, r3\n\t"
  204700. #endif
  204701. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  204702. "subs r5, r5, r7\n\t"
  204703. #else
  204704. "sub r5, r5, r7\n\t"
  204705. #endif
  204706. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  204707. "negs r3, r3\n\t"
  204708. #else
  204709. "neg r3, r3\n\t"
  204710. #endif
  204711. #ifdef WOLFSSL_KEIL
  204712. "sbcs r5, r5, r5\n\t"
  204713. #elif defined(__clang__)
  204714. "sbcs r5, r5\n\t"
  204715. #else
  204716. "sbc r5, r5\n\t"
  204717. #endif
  204718. #ifdef WOLFSSL_KEIL
  204719. "orrs r3, r3, r5\n\t"
  204720. #elif defined(__clang__)
  204721. "orrs r3, r5\n\t"
  204722. #else
  204723. "orr r3, r5\n\t"
  204724. #endif
  204725. "ldr r6, [%[r]]\n\t"
  204726. "ldr r7, [%[r], #4]\n\t"
  204727. "ldr r4, [%[m]]\n\t"
  204728. "ldr r5, [%[m], #4]\n\t"
  204729. #ifdef WOLFSSL_KEIL
  204730. "ands r4, r4, r3\n\t"
  204731. #elif defined(__clang__)
  204732. "ands r4, r3\n\t"
  204733. #else
  204734. "and r4, r3\n\t"
  204735. #endif
  204736. #ifdef WOLFSSL_KEIL
  204737. "ands r5, r5, r3\n\t"
  204738. #elif defined(__clang__)
  204739. "ands r5, r3\n\t"
  204740. #else
  204741. "and r5, r3\n\t"
  204742. #endif
  204743. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  204744. "subs r6, r6, r4\n\t"
  204745. #else
  204746. "sub r6, r6, r4\n\t"
  204747. #endif
  204748. #ifdef WOLFSSL_KEIL
  204749. "sbcs r7, r7, r5\n\t"
  204750. #elif defined(__clang__)
  204751. "sbcs r7, r5\n\t"
  204752. #else
  204753. "sbc r7, r5\n\t"
  204754. #endif
  204755. "str r6, [%[r]]\n\t"
  204756. "str r7, [%[r], #4]\n\t"
  204757. "ldr r6, [%[r], #8]\n\t"
  204758. "ldr r7, [%[r], #12]\n\t"
  204759. "ldr r4, [%[m], #8]\n\t"
  204760. "ldr r5, [%[m], #12]\n\t"
  204761. #ifdef WOLFSSL_KEIL
  204762. "ands r4, r4, r3\n\t"
  204763. #elif defined(__clang__)
  204764. "ands r4, r3\n\t"
  204765. #else
  204766. "and r4, r3\n\t"
  204767. #endif
  204768. #ifdef WOLFSSL_KEIL
  204769. "ands r5, r5, r3\n\t"
  204770. #elif defined(__clang__)
  204771. "ands r5, r3\n\t"
  204772. #else
  204773. "and r5, r3\n\t"
  204774. #endif
  204775. #ifdef WOLFSSL_KEIL
  204776. "sbcs r6, r6, r4\n\t"
  204777. #elif defined(__clang__)
  204778. "sbcs r6, r4\n\t"
  204779. #else
  204780. "sbc r6, r4\n\t"
  204781. #endif
  204782. #ifdef WOLFSSL_KEIL
  204783. "sbcs r7, r7, r5\n\t"
  204784. #elif defined(__clang__)
  204785. "sbcs r7, r5\n\t"
  204786. #else
  204787. "sbc r7, r5\n\t"
  204788. #endif
  204789. "str r6, [%[r], #8]\n\t"
  204790. "str r7, [%[r], #12]\n\t"
  204791. "ldr r6, [%[r], #16]\n\t"
  204792. "ldr r7, [%[r], #20]\n\t"
  204793. "ldr r4, [%[m], #16]\n\t"
  204794. "ldr r5, [%[m], #20]\n\t"
  204795. #ifdef WOLFSSL_KEIL
  204796. "ands r4, r4, r3\n\t"
  204797. #elif defined(__clang__)
  204798. "ands r4, r3\n\t"
  204799. #else
  204800. "and r4, r3\n\t"
  204801. #endif
  204802. #ifdef WOLFSSL_KEIL
  204803. "ands r5, r5, r3\n\t"
  204804. #elif defined(__clang__)
  204805. "ands r5, r3\n\t"
  204806. #else
  204807. "and r5, r3\n\t"
  204808. #endif
  204809. #ifdef WOLFSSL_KEIL
  204810. "sbcs r6, r6, r4\n\t"
  204811. #elif defined(__clang__)
  204812. "sbcs r6, r4\n\t"
  204813. #else
  204814. "sbc r6, r4\n\t"
  204815. #endif
  204816. #ifdef WOLFSSL_KEIL
  204817. "sbcs r7, r7, r5\n\t"
  204818. #elif defined(__clang__)
  204819. "sbcs r7, r5\n\t"
  204820. #else
  204821. "sbc r7, r5\n\t"
  204822. #endif
  204823. "str r6, [%[r], #16]\n\t"
  204824. "str r7, [%[r], #20]\n\t"
  204825. "ldr r6, [%[r], #24]\n\t"
  204826. "ldr r7, [%[r], #28]\n\t"
  204827. "ldr r4, [%[m], #24]\n\t"
  204828. "ldr r5, [%[m], #28]\n\t"
  204829. #ifdef WOLFSSL_KEIL
  204830. "ands r4, r4, r3\n\t"
  204831. #elif defined(__clang__)
  204832. "ands r4, r3\n\t"
  204833. #else
  204834. "and r4, r3\n\t"
  204835. #endif
  204836. #ifdef WOLFSSL_KEIL
  204837. "ands r5, r5, r3\n\t"
  204838. #elif defined(__clang__)
  204839. "ands r5, r3\n\t"
  204840. #else
  204841. "and r5, r3\n\t"
  204842. #endif
  204843. #ifdef WOLFSSL_KEIL
  204844. "sbcs r6, r6, r4\n\t"
  204845. #elif defined(__clang__)
  204846. "sbcs r6, r4\n\t"
  204847. #else
  204848. "sbc r6, r4\n\t"
  204849. #endif
  204850. #ifdef WOLFSSL_KEIL
  204851. "sbcs r7, r7, r5\n\t"
  204852. #elif defined(__clang__)
  204853. "sbcs r7, r5\n\t"
  204854. #else
  204855. "sbc r7, r5\n\t"
  204856. #endif
  204857. "str r6, [%[r], #24]\n\t"
  204858. "str r7, [%[r], #28]\n\t"
  204859. "ldr r6, [%[r], #32]\n\t"
  204860. "ldr r7, [%[r], #36]\n\t"
  204861. "ldr r4, [%[m], #32]\n\t"
  204862. "ldr r5, [%[m], #36]\n\t"
  204863. #ifdef WOLFSSL_KEIL
  204864. "ands r4, r4, r3\n\t"
  204865. #elif defined(__clang__)
  204866. "ands r4, r3\n\t"
  204867. #else
  204868. "and r4, r3\n\t"
  204869. #endif
  204870. #ifdef WOLFSSL_KEIL
  204871. "ands r5, r5, r3\n\t"
  204872. #elif defined(__clang__)
  204873. "ands r5, r3\n\t"
  204874. #else
  204875. "and r5, r3\n\t"
  204876. #endif
  204877. #ifdef WOLFSSL_KEIL
  204878. "sbcs r6, r6, r4\n\t"
  204879. #elif defined(__clang__)
  204880. "sbcs r6, r4\n\t"
  204881. #else
  204882. "sbc r6, r4\n\t"
  204883. #endif
  204884. #ifdef WOLFSSL_KEIL
  204885. "sbcs r7, r7, r5\n\t"
  204886. #elif defined(__clang__)
  204887. "sbcs r7, r5\n\t"
  204888. #else
  204889. "sbc r7, r5\n\t"
  204890. #endif
  204891. "str r6, [%[r], #32]\n\t"
  204892. "str r7, [%[r], #36]\n\t"
  204893. "ldr r6, [%[r], #40]\n\t"
  204894. "ldr r7, [%[r], #44]\n\t"
  204895. "ldr r4, [%[m], #40]\n\t"
  204896. "ldr r5, [%[m], #44]\n\t"
  204897. #ifdef WOLFSSL_KEIL
  204898. "ands r4, r4, r3\n\t"
  204899. #elif defined(__clang__)
  204900. "ands r4, r3\n\t"
  204901. #else
  204902. "and r4, r3\n\t"
  204903. #endif
  204904. #ifdef WOLFSSL_KEIL
  204905. "ands r5, r5, r3\n\t"
  204906. #elif defined(__clang__)
  204907. "ands r5, r3\n\t"
  204908. #else
  204909. "and r5, r3\n\t"
  204910. #endif
  204911. #ifdef WOLFSSL_KEIL
  204912. "sbcs r6, r6, r4\n\t"
  204913. #elif defined(__clang__)
  204914. "sbcs r6, r4\n\t"
  204915. #else
  204916. "sbc r6, r4\n\t"
  204917. #endif
  204918. #ifdef WOLFSSL_KEIL
  204919. "sbcs r7, r7, r5\n\t"
  204920. #elif defined(__clang__)
  204921. "sbcs r7, r5\n\t"
  204922. #else
  204923. "sbc r7, r5\n\t"
  204924. #endif
  204925. "str r6, [%[r], #40]\n\t"
  204926. "str r7, [%[r], #44]\n\t"
  204927. "ldr r6, [%[r], #48]\n\t"
  204928. "ldr r7, [%[r], #52]\n\t"
  204929. "ldr r4, [%[m], #48]\n\t"
  204930. "ldr r5, [%[m], #52]\n\t"
  204931. #ifdef WOLFSSL_KEIL
  204932. "ands r4, r4, r3\n\t"
  204933. #elif defined(__clang__)
  204934. "ands r4, r3\n\t"
  204935. #else
  204936. "and r4, r3\n\t"
  204937. #endif
  204938. #ifdef WOLFSSL_KEIL
  204939. "ands r5, r5, r3\n\t"
  204940. #elif defined(__clang__)
  204941. "ands r5, r3\n\t"
  204942. #else
  204943. "and r5, r3\n\t"
  204944. #endif
  204945. #ifdef WOLFSSL_KEIL
  204946. "sbcs r6, r6, r4\n\t"
  204947. #elif defined(__clang__)
  204948. "sbcs r6, r4\n\t"
  204949. #else
  204950. "sbc r6, r4\n\t"
  204951. #endif
  204952. #ifdef WOLFSSL_KEIL
  204953. "sbcs r7, r7, r5\n\t"
  204954. #elif defined(__clang__)
  204955. "sbcs r7, r5\n\t"
  204956. #else
  204957. "sbc r7, r5\n\t"
  204958. #endif
  204959. "str r6, [%[r], #48]\n\t"
  204960. "str r7, [%[r], #52]\n\t"
  204961. "ldr r6, [%[r], #56]\n\t"
  204962. "ldr r7, [%[r], #60]\n\t"
  204963. "ldr r4, [%[m], #56]\n\t"
  204964. "ldr r5, [%[m], #60]\n\t"
  204965. #ifdef WOLFSSL_KEIL
  204966. "ands r4, r4, r3\n\t"
  204967. #elif defined(__clang__)
  204968. "ands r4, r3\n\t"
  204969. #else
  204970. "and r4, r3\n\t"
  204971. #endif
  204972. #ifdef WOLFSSL_KEIL
  204973. "ands r5, r5, r3\n\t"
  204974. #elif defined(__clang__)
  204975. "ands r5, r3\n\t"
  204976. #else
  204977. "and r5, r3\n\t"
  204978. #endif
  204979. #ifdef WOLFSSL_KEIL
  204980. "sbcs r6, r6, r4\n\t"
  204981. #elif defined(__clang__)
  204982. "sbcs r6, r4\n\t"
  204983. #else
  204984. "sbc r6, r4\n\t"
  204985. #endif
  204986. #ifdef WOLFSSL_KEIL
  204987. "sbcs r7, r7, r5\n\t"
  204988. #elif defined(__clang__)
  204989. "sbcs r7, r5\n\t"
  204990. #else
  204991. "sbc r7, r5\n\t"
  204992. #endif
  204993. "str r6, [%[r], #56]\n\t"
  204994. "str r7, [%[r], #60]\n\t"
  204995. "ldr r6, [%[r], #64]\n\t"
  204996. "ldr r7, [%[r], #68]\n\t"
  204997. "ldr r4, [%[m], #64]\n\t"
  204998. "ldr r5, [%[m], #68]\n\t"
  204999. #ifdef WOLFSSL_KEIL
  205000. "ands r4, r4, r3\n\t"
  205001. #elif defined(__clang__)
  205002. "ands r4, r3\n\t"
  205003. #else
  205004. "and r4, r3\n\t"
  205005. #endif
  205006. #ifdef WOLFSSL_KEIL
  205007. "ands r5, r5, r3\n\t"
  205008. #elif defined(__clang__)
  205009. "ands r5, r3\n\t"
  205010. #else
  205011. "and r5, r3\n\t"
  205012. #endif
  205013. #ifdef WOLFSSL_KEIL
  205014. "sbcs r6, r6, r4\n\t"
  205015. #elif defined(__clang__)
  205016. "sbcs r6, r4\n\t"
  205017. #else
  205018. "sbc r6, r4\n\t"
  205019. #endif
  205020. #ifdef WOLFSSL_KEIL
  205021. "sbcs r7, r7, r5\n\t"
  205022. #elif defined(__clang__)
  205023. "sbcs r7, r5\n\t"
  205024. #else
  205025. "sbc r7, r5\n\t"
  205026. #endif
  205027. "str r6, [%[r], #64]\n\t"
  205028. "str r7, [%[r], #68]\n\t"
  205029. "ldr r6, [%[r], #72]\n\t"
  205030. "ldr r7, [%[r], #76]\n\t"
  205031. "ldr r4, [%[m], #72]\n\t"
  205032. "ldr r5, [%[m], #76]\n\t"
  205033. #ifdef WOLFSSL_KEIL
  205034. "ands r4, r4, r3\n\t"
  205035. #elif defined(__clang__)
  205036. "ands r4, r3\n\t"
  205037. #else
  205038. "and r4, r3\n\t"
  205039. #endif
  205040. #ifdef WOLFSSL_KEIL
  205041. "ands r5, r5, r3\n\t"
  205042. #elif defined(__clang__)
  205043. "ands r5, r3\n\t"
  205044. #else
  205045. "and r5, r3\n\t"
  205046. #endif
  205047. #ifdef WOLFSSL_KEIL
  205048. "sbcs r6, r6, r4\n\t"
  205049. #elif defined(__clang__)
  205050. "sbcs r6, r4\n\t"
  205051. #else
  205052. "sbc r6, r4\n\t"
  205053. #endif
  205054. #ifdef WOLFSSL_KEIL
  205055. "sbcs r7, r7, r5\n\t"
  205056. #elif defined(__clang__)
  205057. "sbcs r7, r5\n\t"
  205058. #else
  205059. "sbc r7, r5\n\t"
  205060. #endif
  205061. "str r6, [%[r], #72]\n\t"
  205062. "str r7, [%[r], #76]\n\t"
  205063. "ldr r6, [%[r], #80]\n\t"
  205064. "ldr r7, [%[r], #84]\n\t"
  205065. "ldr r4, [%[m], #80]\n\t"
  205066. "ldr r5, [%[m], #84]\n\t"
  205067. #ifdef WOLFSSL_KEIL
  205068. "ands r4, r4, r3\n\t"
  205069. #elif defined(__clang__)
  205070. "ands r4, r3\n\t"
  205071. #else
  205072. "and r4, r3\n\t"
  205073. #endif
  205074. #ifdef WOLFSSL_KEIL
  205075. "ands r5, r5, r3\n\t"
  205076. #elif defined(__clang__)
  205077. "ands r5, r3\n\t"
  205078. #else
  205079. "and r5, r3\n\t"
  205080. #endif
  205081. #ifdef WOLFSSL_KEIL
  205082. "sbcs r6, r6, r4\n\t"
  205083. #elif defined(__clang__)
  205084. "sbcs r6, r4\n\t"
  205085. #else
  205086. "sbc r6, r4\n\t"
  205087. #endif
  205088. #ifdef WOLFSSL_KEIL
  205089. "sbcs r7, r7, r5\n\t"
  205090. #elif defined(__clang__)
  205091. "sbcs r7, r5\n\t"
  205092. #else
  205093. "sbc r7, r5\n\t"
  205094. #endif
  205095. "str r6, [%[r], #80]\n\t"
  205096. "str r7, [%[r], #84]\n\t"
  205097. "ldr r6, [%[r], #88]\n\t"
  205098. "ldr r7, [%[r], #92]\n\t"
  205099. "ldr r4, [%[m], #88]\n\t"
  205100. "ldr r5, [%[m], #92]\n\t"
  205101. #ifdef WOLFSSL_KEIL
  205102. "ands r4, r4, r3\n\t"
  205103. #elif defined(__clang__)
  205104. "ands r4, r3\n\t"
  205105. #else
  205106. "and r4, r3\n\t"
  205107. #endif
  205108. #ifdef WOLFSSL_KEIL
  205109. "ands r5, r5, r3\n\t"
  205110. #elif defined(__clang__)
  205111. "ands r5, r3\n\t"
  205112. #else
  205113. "and r5, r3\n\t"
  205114. #endif
  205115. #ifdef WOLFSSL_KEIL
  205116. "sbcs r6, r6, r4\n\t"
  205117. #elif defined(__clang__)
  205118. "sbcs r6, r4\n\t"
  205119. #else
  205120. "sbc r6, r4\n\t"
  205121. #endif
  205122. #ifdef WOLFSSL_KEIL
  205123. "sbcs r7, r7, r5\n\t"
  205124. #elif defined(__clang__)
  205125. "sbcs r7, r5\n\t"
  205126. #else
  205127. "sbc r7, r5\n\t"
  205128. #endif
  205129. "str r6, [%[r], #88]\n\t"
  205130. "str r7, [%[r], #92]\n\t"
  205131. "ldr r6, [%[r], #96]\n\t"
  205132. "ldr r7, [%[r], #100]\n\t"
  205133. "ldr r4, [%[m], #96]\n\t"
  205134. "ldr r5, [%[m], #100]\n\t"
  205135. #ifdef WOLFSSL_KEIL
  205136. "ands r4, r4, r3\n\t"
  205137. #elif defined(__clang__)
  205138. "ands r4, r3\n\t"
  205139. #else
  205140. "and r4, r3\n\t"
  205141. #endif
  205142. #ifdef WOLFSSL_KEIL
  205143. "ands r5, r5, r3\n\t"
  205144. #elif defined(__clang__)
  205145. "ands r5, r3\n\t"
  205146. #else
  205147. "and r5, r3\n\t"
  205148. #endif
  205149. #ifdef WOLFSSL_KEIL
  205150. "sbcs r6, r6, r4\n\t"
  205151. #elif defined(__clang__)
  205152. "sbcs r6, r4\n\t"
  205153. #else
  205154. "sbc r6, r4\n\t"
  205155. #endif
  205156. #ifdef WOLFSSL_KEIL
  205157. "sbcs r7, r7, r5\n\t"
  205158. #elif defined(__clang__)
  205159. "sbcs r7, r5\n\t"
  205160. #else
  205161. "sbc r7, r5\n\t"
  205162. #endif
  205163. "str r6, [%[r], #96]\n\t"
  205164. "str r7, [%[r], #100]\n\t"
  205165. "ldr r6, [%[r], #104]\n\t"
  205166. "ldr r7, [%[r], #108]\n\t"
  205167. "ldr r4, [%[m], #104]\n\t"
  205168. "ldr r5, [%[m], #108]\n\t"
  205169. #ifdef WOLFSSL_KEIL
  205170. "ands r4, r4, r3\n\t"
  205171. #elif defined(__clang__)
  205172. "ands r4, r3\n\t"
  205173. #else
  205174. "and r4, r3\n\t"
  205175. #endif
  205176. #ifdef WOLFSSL_KEIL
  205177. "ands r5, r5, r3\n\t"
  205178. #elif defined(__clang__)
  205179. "ands r5, r3\n\t"
  205180. #else
  205181. "and r5, r3\n\t"
  205182. #endif
  205183. #ifdef WOLFSSL_KEIL
  205184. "sbcs r6, r6, r4\n\t"
  205185. #elif defined(__clang__)
  205186. "sbcs r6, r4\n\t"
  205187. #else
  205188. "sbc r6, r4\n\t"
  205189. #endif
  205190. #ifdef WOLFSSL_KEIL
  205191. "sbcs r7, r7, r5\n\t"
  205192. #elif defined(__clang__)
  205193. "sbcs r7, r5\n\t"
  205194. #else
  205195. "sbc r7, r5\n\t"
  205196. #endif
  205197. "str r6, [%[r], #104]\n\t"
  205198. "str r7, [%[r], #108]\n\t"
  205199. "ldr r6, [%[r], #112]\n\t"
  205200. "ldr r7, [%[r], #116]\n\t"
  205201. "ldr r4, [%[m], #112]\n\t"
  205202. "ldr r5, [%[m], #116]\n\t"
  205203. #ifdef WOLFSSL_KEIL
  205204. "ands r4, r4, r3\n\t"
  205205. #elif defined(__clang__)
  205206. "ands r4, r3\n\t"
  205207. #else
  205208. "and r4, r3\n\t"
  205209. #endif
  205210. #ifdef WOLFSSL_KEIL
  205211. "ands r5, r5, r3\n\t"
  205212. #elif defined(__clang__)
  205213. "ands r5, r3\n\t"
  205214. #else
  205215. "and r5, r3\n\t"
  205216. #endif
  205217. #ifdef WOLFSSL_KEIL
  205218. "sbcs r6, r6, r4\n\t"
  205219. #elif defined(__clang__)
  205220. "sbcs r6, r4\n\t"
  205221. #else
  205222. "sbc r6, r4\n\t"
  205223. #endif
  205224. #ifdef WOLFSSL_KEIL
  205225. "sbcs r7, r7, r5\n\t"
  205226. #elif defined(__clang__)
  205227. "sbcs r7, r5\n\t"
  205228. #else
  205229. "sbc r7, r5\n\t"
  205230. #endif
  205231. "str r6, [%[r], #112]\n\t"
  205232. "str r7, [%[r], #116]\n\t"
  205233. "ldr r6, [%[r], #120]\n\t"
  205234. "ldr r7, [%[r], #124]\n\t"
  205235. "ldr r4, [%[m], #120]\n\t"
  205236. "ldr r5, [%[m], #124]\n\t"
  205237. #ifdef WOLFSSL_KEIL
  205238. "ands r4, r4, r3\n\t"
  205239. #elif defined(__clang__)
  205240. "ands r4, r3\n\t"
  205241. #else
  205242. "and r4, r3\n\t"
  205243. #endif
  205244. #ifdef WOLFSSL_KEIL
  205245. "ands r5, r5, r3\n\t"
  205246. #elif defined(__clang__)
  205247. "ands r5, r3\n\t"
  205248. #else
  205249. "and r5, r3\n\t"
  205250. #endif
  205251. #ifdef WOLFSSL_KEIL
  205252. "sbcs r6, r6, r4\n\t"
  205253. #elif defined(__clang__)
  205254. "sbcs r6, r4\n\t"
  205255. #else
  205256. "sbc r6, r4\n\t"
  205257. #endif
  205258. #ifdef WOLFSSL_KEIL
  205259. "sbcs r7, r7, r5\n\t"
  205260. #elif defined(__clang__)
  205261. "sbcs r7, r5\n\t"
  205262. #else
  205263. "sbc r7, r5\n\t"
  205264. #endif
  205265. "str r6, [%[r], #120]\n\t"
  205266. "str r7, [%[r], #124]\n\t"
  205267. : [r] "+l" (r), [a] "+l" (a), [m] "+l" (m)
  205268. :
  205269. : "memory", "r3", "r4", "r5", "r6", "r7"
  205270. );
  205271. }
  205272. /* Subtract two Montgomery form numbers (r = a - b % m).
  205273. *
  205274. * r Result of subtration.
  205275. * a Number to subtract from in Montgomery form.
  205276. * b Number to subtract with in Montgomery form.
  205277. * m Modulus (prime).
  205278. */
  205279. SP_NOINLINE static void sp_1024_mont_sub_32(sp_digit* r, const sp_digit* a,
  205280. const sp_digit* b, const sp_digit* m)
  205281. {
  205282. __asm__ __volatile__ (
  205283. "ldr r4, [%[a]]\n\t"
  205284. "ldr r5, [%[a], #4]\n\t"
  205285. "ldr r6, [%[b]]\n\t"
  205286. "ldr r7, [%[b], #4]\n\t"
  205287. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  205288. "subs r4, r4, r6\n\t"
  205289. #else
  205290. "sub r4, r4, r6\n\t"
  205291. #endif
  205292. #ifdef WOLFSSL_KEIL
  205293. "sbcs r5, r5, r7\n\t"
  205294. #elif defined(__clang__)
  205295. "sbcs r5, r7\n\t"
  205296. #else
  205297. "sbc r5, r7\n\t"
  205298. #endif
  205299. "str r4, [%[r]]\n\t"
  205300. "str r5, [%[r], #4]\n\t"
  205301. "ldr r4, [%[a], #8]\n\t"
  205302. "ldr r5, [%[a], #12]\n\t"
  205303. "ldr r6, [%[b], #8]\n\t"
  205304. "ldr r7, [%[b], #12]\n\t"
  205305. #ifdef WOLFSSL_KEIL
  205306. "sbcs r4, r4, r6\n\t"
  205307. #elif defined(__clang__)
  205308. "sbcs r4, r6\n\t"
  205309. #else
  205310. "sbc r4, r6\n\t"
  205311. #endif
  205312. #ifdef WOLFSSL_KEIL
  205313. "sbcs r5, r5, r7\n\t"
  205314. #elif defined(__clang__)
  205315. "sbcs r5, r7\n\t"
  205316. #else
  205317. "sbc r5, r7\n\t"
  205318. #endif
  205319. "str r4, [%[r], #8]\n\t"
  205320. "str r5, [%[r], #12]\n\t"
  205321. "ldr r4, [%[a], #16]\n\t"
  205322. "ldr r5, [%[a], #20]\n\t"
  205323. "ldr r6, [%[b], #16]\n\t"
  205324. "ldr r7, [%[b], #20]\n\t"
  205325. #ifdef WOLFSSL_KEIL
  205326. "sbcs r4, r4, r6\n\t"
  205327. #elif defined(__clang__)
  205328. "sbcs r4, r6\n\t"
  205329. #else
  205330. "sbc r4, r6\n\t"
  205331. #endif
  205332. #ifdef WOLFSSL_KEIL
  205333. "sbcs r5, r5, r7\n\t"
  205334. #elif defined(__clang__)
  205335. "sbcs r5, r7\n\t"
  205336. #else
  205337. "sbc r5, r7\n\t"
  205338. #endif
  205339. "str r4, [%[r], #16]\n\t"
  205340. "str r5, [%[r], #20]\n\t"
  205341. "ldr r4, [%[a], #24]\n\t"
  205342. "ldr r5, [%[a], #28]\n\t"
  205343. "ldr r6, [%[b], #24]\n\t"
  205344. "ldr r7, [%[b], #28]\n\t"
  205345. #ifdef WOLFSSL_KEIL
  205346. "sbcs r4, r4, r6\n\t"
  205347. #elif defined(__clang__)
  205348. "sbcs r4, r6\n\t"
  205349. #else
  205350. "sbc r4, r6\n\t"
  205351. #endif
  205352. #ifdef WOLFSSL_KEIL
  205353. "sbcs r5, r5, r7\n\t"
  205354. #elif defined(__clang__)
  205355. "sbcs r5, r7\n\t"
  205356. #else
  205357. "sbc r5, r7\n\t"
  205358. #endif
  205359. "str r4, [%[r], #24]\n\t"
  205360. "str r5, [%[r], #28]\n\t"
  205361. "ldr r4, [%[a], #32]\n\t"
  205362. "ldr r5, [%[a], #36]\n\t"
  205363. "ldr r6, [%[b], #32]\n\t"
  205364. "ldr r7, [%[b], #36]\n\t"
  205365. #ifdef WOLFSSL_KEIL
  205366. "sbcs r4, r4, r6\n\t"
  205367. #elif defined(__clang__)
  205368. "sbcs r4, r6\n\t"
  205369. #else
  205370. "sbc r4, r6\n\t"
  205371. #endif
  205372. #ifdef WOLFSSL_KEIL
  205373. "sbcs r5, r5, r7\n\t"
  205374. #elif defined(__clang__)
  205375. "sbcs r5, r7\n\t"
  205376. #else
  205377. "sbc r5, r7\n\t"
  205378. #endif
  205379. "str r4, [%[r], #32]\n\t"
  205380. "str r5, [%[r], #36]\n\t"
  205381. "ldr r4, [%[a], #40]\n\t"
  205382. "ldr r5, [%[a], #44]\n\t"
  205383. "ldr r6, [%[b], #40]\n\t"
  205384. "ldr r7, [%[b], #44]\n\t"
  205385. #ifdef WOLFSSL_KEIL
  205386. "sbcs r4, r4, r6\n\t"
  205387. #elif defined(__clang__)
  205388. "sbcs r4, r6\n\t"
  205389. #else
  205390. "sbc r4, r6\n\t"
  205391. #endif
  205392. #ifdef WOLFSSL_KEIL
  205393. "sbcs r5, r5, r7\n\t"
  205394. #elif defined(__clang__)
  205395. "sbcs r5, r7\n\t"
  205396. #else
  205397. "sbc r5, r7\n\t"
  205398. #endif
  205399. "str r4, [%[r], #40]\n\t"
  205400. "str r5, [%[r], #44]\n\t"
  205401. "ldr r4, [%[a], #48]\n\t"
  205402. "ldr r5, [%[a], #52]\n\t"
  205403. "ldr r6, [%[b], #48]\n\t"
  205404. "ldr r7, [%[b], #52]\n\t"
  205405. #ifdef WOLFSSL_KEIL
  205406. "sbcs r4, r4, r6\n\t"
  205407. #elif defined(__clang__)
  205408. "sbcs r4, r6\n\t"
  205409. #else
  205410. "sbc r4, r6\n\t"
  205411. #endif
  205412. #ifdef WOLFSSL_KEIL
  205413. "sbcs r5, r5, r7\n\t"
  205414. #elif defined(__clang__)
  205415. "sbcs r5, r7\n\t"
  205416. #else
  205417. "sbc r5, r7\n\t"
  205418. #endif
  205419. "str r4, [%[r], #48]\n\t"
  205420. "str r5, [%[r], #52]\n\t"
  205421. "ldr r4, [%[a], #56]\n\t"
  205422. "ldr r5, [%[a], #60]\n\t"
  205423. "ldr r6, [%[b], #56]\n\t"
  205424. "ldr r7, [%[b], #60]\n\t"
  205425. #ifdef WOLFSSL_KEIL
  205426. "sbcs r4, r4, r6\n\t"
  205427. #elif defined(__clang__)
  205428. "sbcs r4, r6\n\t"
  205429. #else
  205430. "sbc r4, r6\n\t"
  205431. #endif
  205432. #ifdef WOLFSSL_KEIL
  205433. "sbcs r5, r5, r7\n\t"
  205434. #elif defined(__clang__)
  205435. "sbcs r5, r7\n\t"
  205436. #else
  205437. "sbc r5, r7\n\t"
  205438. #endif
  205439. "str r4, [%[r], #56]\n\t"
  205440. "str r5, [%[r], #60]\n\t"
  205441. "ldr r4, [%[a], #64]\n\t"
  205442. "ldr r5, [%[a], #68]\n\t"
  205443. "ldr r6, [%[b], #64]\n\t"
  205444. "ldr r7, [%[b], #68]\n\t"
  205445. #ifdef WOLFSSL_KEIL
  205446. "sbcs r4, r4, r6\n\t"
  205447. #elif defined(__clang__)
  205448. "sbcs r4, r6\n\t"
  205449. #else
  205450. "sbc r4, r6\n\t"
  205451. #endif
  205452. #ifdef WOLFSSL_KEIL
  205453. "sbcs r5, r5, r7\n\t"
  205454. #elif defined(__clang__)
  205455. "sbcs r5, r7\n\t"
  205456. #else
  205457. "sbc r5, r7\n\t"
  205458. #endif
  205459. "str r4, [%[r], #64]\n\t"
  205460. "str r5, [%[r], #68]\n\t"
  205461. "ldr r4, [%[a], #72]\n\t"
  205462. "ldr r5, [%[a], #76]\n\t"
  205463. "ldr r6, [%[b], #72]\n\t"
  205464. "ldr r7, [%[b], #76]\n\t"
  205465. #ifdef WOLFSSL_KEIL
  205466. "sbcs r4, r4, r6\n\t"
  205467. #elif defined(__clang__)
  205468. "sbcs r4, r6\n\t"
  205469. #else
  205470. "sbc r4, r6\n\t"
  205471. #endif
  205472. #ifdef WOLFSSL_KEIL
  205473. "sbcs r5, r5, r7\n\t"
  205474. #elif defined(__clang__)
  205475. "sbcs r5, r7\n\t"
  205476. #else
  205477. "sbc r5, r7\n\t"
  205478. #endif
  205479. "str r4, [%[r], #72]\n\t"
  205480. "str r5, [%[r], #76]\n\t"
  205481. "ldr r4, [%[a], #80]\n\t"
  205482. "ldr r5, [%[a], #84]\n\t"
  205483. "ldr r6, [%[b], #80]\n\t"
  205484. "ldr r7, [%[b], #84]\n\t"
  205485. #ifdef WOLFSSL_KEIL
  205486. "sbcs r4, r4, r6\n\t"
  205487. #elif defined(__clang__)
  205488. "sbcs r4, r6\n\t"
  205489. #else
  205490. "sbc r4, r6\n\t"
  205491. #endif
  205492. #ifdef WOLFSSL_KEIL
  205493. "sbcs r5, r5, r7\n\t"
  205494. #elif defined(__clang__)
  205495. "sbcs r5, r7\n\t"
  205496. #else
  205497. "sbc r5, r7\n\t"
  205498. #endif
  205499. "str r4, [%[r], #80]\n\t"
  205500. "str r5, [%[r], #84]\n\t"
  205501. "ldr r4, [%[a], #88]\n\t"
  205502. "ldr r5, [%[a], #92]\n\t"
  205503. "ldr r6, [%[b], #88]\n\t"
  205504. "ldr r7, [%[b], #92]\n\t"
  205505. #ifdef WOLFSSL_KEIL
  205506. "sbcs r4, r4, r6\n\t"
  205507. #elif defined(__clang__)
  205508. "sbcs r4, r6\n\t"
  205509. #else
  205510. "sbc r4, r6\n\t"
  205511. #endif
  205512. #ifdef WOLFSSL_KEIL
  205513. "sbcs r5, r5, r7\n\t"
  205514. #elif defined(__clang__)
  205515. "sbcs r5, r7\n\t"
  205516. #else
  205517. "sbc r5, r7\n\t"
  205518. #endif
  205519. "str r4, [%[r], #88]\n\t"
  205520. "str r5, [%[r], #92]\n\t"
  205521. "ldr r4, [%[a], #96]\n\t"
  205522. "ldr r5, [%[a], #100]\n\t"
  205523. "ldr r6, [%[b], #96]\n\t"
  205524. "ldr r7, [%[b], #100]\n\t"
  205525. #ifdef WOLFSSL_KEIL
  205526. "sbcs r4, r4, r6\n\t"
  205527. #elif defined(__clang__)
  205528. "sbcs r4, r6\n\t"
  205529. #else
  205530. "sbc r4, r6\n\t"
  205531. #endif
  205532. #ifdef WOLFSSL_KEIL
  205533. "sbcs r5, r5, r7\n\t"
  205534. #elif defined(__clang__)
  205535. "sbcs r5, r7\n\t"
  205536. #else
  205537. "sbc r5, r7\n\t"
  205538. #endif
  205539. "str r4, [%[r], #96]\n\t"
  205540. "str r5, [%[r], #100]\n\t"
  205541. "ldr r4, [%[a], #104]\n\t"
  205542. "ldr r5, [%[a], #108]\n\t"
  205543. "ldr r6, [%[b], #104]\n\t"
  205544. "ldr r7, [%[b], #108]\n\t"
  205545. #ifdef WOLFSSL_KEIL
  205546. "sbcs r4, r4, r6\n\t"
  205547. #elif defined(__clang__)
  205548. "sbcs r4, r6\n\t"
  205549. #else
  205550. "sbc r4, r6\n\t"
  205551. #endif
  205552. #ifdef WOLFSSL_KEIL
  205553. "sbcs r5, r5, r7\n\t"
  205554. #elif defined(__clang__)
  205555. "sbcs r5, r7\n\t"
  205556. #else
  205557. "sbc r5, r7\n\t"
  205558. #endif
  205559. "str r4, [%[r], #104]\n\t"
  205560. "str r5, [%[r], #108]\n\t"
  205561. "ldr r4, [%[a], #112]\n\t"
  205562. "ldr r5, [%[a], #116]\n\t"
  205563. "ldr r6, [%[b], #112]\n\t"
  205564. "ldr r7, [%[b], #116]\n\t"
  205565. #ifdef WOLFSSL_KEIL
  205566. "sbcs r4, r4, r6\n\t"
  205567. #elif defined(__clang__)
  205568. "sbcs r4, r6\n\t"
  205569. #else
  205570. "sbc r4, r6\n\t"
  205571. #endif
  205572. #ifdef WOLFSSL_KEIL
  205573. "sbcs r5, r5, r7\n\t"
  205574. #elif defined(__clang__)
  205575. "sbcs r5, r7\n\t"
  205576. #else
  205577. "sbc r5, r7\n\t"
  205578. #endif
  205579. "str r4, [%[r], #112]\n\t"
  205580. "str r5, [%[r], #116]\n\t"
  205581. "ldr r4, [%[a], #120]\n\t"
  205582. "ldr r5, [%[a], #124]\n\t"
  205583. "ldr r6, [%[b], #120]\n\t"
  205584. "ldr r7, [%[b], #124]\n\t"
  205585. #ifdef WOLFSSL_KEIL
  205586. "sbcs r4, r4, r6\n\t"
  205587. #elif defined(__clang__)
  205588. "sbcs r4, r6\n\t"
  205589. #else
  205590. "sbc r4, r6\n\t"
  205591. #endif
  205592. #ifdef WOLFSSL_KEIL
  205593. "sbcs r5, r5, r7\n\t"
  205594. #elif defined(__clang__)
  205595. "sbcs r5, r7\n\t"
  205596. #else
  205597. "sbc r5, r7\n\t"
  205598. #endif
  205599. "str r4, [%[r], #120]\n\t"
  205600. "str r5, [%[r], #124]\n\t"
  205601. #ifdef WOLFSSL_KEIL
  205602. "sbcs %[b], %[b], %[b]\n\t"
  205603. #elif defined(__clang__)
  205604. "sbcs %[b], %[b]\n\t"
  205605. #else
  205606. "sbc %[b], %[b]\n\t"
  205607. #endif
  205608. "ldr r4, [%[r]]\n\t"
  205609. "ldr r5, [%[r], #4]\n\t"
  205610. "ldr r6, [%[m]]\n\t"
  205611. "ldr r7, [%[m], #4]\n\t"
  205612. #ifdef WOLFSSL_KEIL
  205613. "ands r6, r6, %[b]\n\t"
  205614. #elif defined(__clang__)
  205615. "ands r6, %[b]\n\t"
  205616. #else
  205617. "and r6, %[b]\n\t"
  205618. #endif
  205619. #ifdef WOLFSSL_KEIL
  205620. "ands r7, r7, %[b]\n\t"
  205621. #elif defined(__clang__)
  205622. "ands r7, %[b]\n\t"
  205623. #else
  205624. "and r7, %[b]\n\t"
  205625. #endif
  205626. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  205627. "adds r4, r4, r6\n\t"
  205628. #else
  205629. "add r4, r4, r6\n\t"
  205630. #endif
  205631. #ifdef WOLFSSL_KEIL
  205632. "adcs r5, r5, r7\n\t"
  205633. #elif defined(__clang__)
  205634. "adcs r5, r7\n\t"
  205635. #else
  205636. "adc r5, r7\n\t"
  205637. #endif
  205638. "str r4, [%[r]]\n\t"
  205639. "str r5, [%[r], #4]\n\t"
  205640. "ldr r4, [%[r], #8]\n\t"
  205641. "ldr r5, [%[r], #12]\n\t"
  205642. "ldr r6, [%[m], #8]\n\t"
  205643. "ldr r7, [%[m], #12]\n\t"
  205644. #ifdef WOLFSSL_KEIL
  205645. "ands r6, r6, %[b]\n\t"
  205646. #elif defined(__clang__)
  205647. "ands r6, %[b]\n\t"
  205648. #else
  205649. "and r6, %[b]\n\t"
  205650. #endif
  205651. #ifdef WOLFSSL_KEIL
  205652. "ands r7, r7, %[b]\n\t"
  205653. #elif defined(__clang__)
  205654. "ands r7, %[b]\n\t"
  205655. #else
  205656. "and r7, %[b]\n\t"
  205657. #endif
  205658. #ifdef WOLFSSL_KEIL
  205659. "adcs r4, r4, r6\n\t"
  205660. #elif defined(__clang__)
  205661. "adcs r4, r6\n\t"
  205662. #else
  205663. "adc r4, r6\n\t"
  205664. #endif
  205665. #ifdef WOLFSSL_KEIL
  205666. "adcs r5, r5, r7\n\t"
  205667. #elif defined(__clang__)
  205668. "adcs r5, r7\n\t"
  205669. #else
  205670. "adc r5, r7\n\t"
  205671. #endif
  205672. "str r4, [%[r], #8]\n\t"
  205673. "str r5, [%[r], #12]\n\t"
  205674. "ldr r4, [%[r], #16]\n\t"
  205675. "ldr r5, [%[r], #20]\n\t"
  205676. "ldr r6, [%[m], #16]\n\t"
  205677. "ldr r7, [%[m], #20]\n\t"
  205678. #ifdef WOLFSSL_KEIL
  205679. "ands r6, r6, %[b]\n\t"
  205680. #elif defined(__clang__)
  205681. "ands r6, %[b]\n\t"
  205682. #else
  205683. "and r6, %[b]\n\t"
  205684. #endif
  205685. #ifdef WOLFSSL_KEIL
  205686. "ands r7, r7, %[b]\n\t"
  205687. #elif defined(__clang__)
  205688. "ands r7, %[b]\n\t"
  205689. #else
  205690. "and r7, %[b]\n\t"
  205691. #endif
  205692. #ifdef WOLFSSL_KEIL
  205693. "adcs r4, r4, r6\n\t"
  205694. #elif defined(__clang__)
  205695. "adcs r4, r6\n\t"
  205696. #else
  205697. "adc r4, r6\n\t"
  205698. #endif
  205699. #ifdef WOLFSSL_KEIL
  205700. "adcs r5, r5, r7\n\t"
  205701. #elif defined(__clang__)
  205702. "adcs r5, r7\n\t"
  205703. #else
  205704. "adc r5, r7\n\t"
  205705. #endif
  205706. "str r4, [%[r], #16]\n\t"
  205707. "str r5, [%[r], #20]\n\t"
  205708. "ldr r4, [%[r], #24]\n\t"
  205709. "ldr r5, [%[r], #28]\n\t"
  205710. "ldr r6, [%[m], #24]\n\t"
  205711. "ldr r7, [%[m], #28]\n\t"
  205712. #ifdef WOLFSSL_KEIL
  205713. "ands r6, r6, %[b]\n\t"
  205714. #elif defined(__clang__)
  205715. "ands r6, %[b]\n\t"
  205716. #else
  205717. "and r6, %[b]\n\t"
  205718. #endif
  205719. #ifdef WOLFSSL_KEIL
  205720. "ands r7, r7, %[b]\n\t"
  205721. #elif defined(__clang__)
  205722. "ands r7, %[b]\n\t"
  205723. #else
  205724. "and r7, %[b]\n\t"
  205725. #endif
  205726. #ifdef WOLFSSL_KEIL
  205727. "adcs r4, r4, r6\n\t"
  205728. #elif defined(__clang__)
  205729. "adcs r4, r6\n\t"
  205730. #else
  205731. "adc r4, r6\n\t"
  205732. #endif
  205733. #ifdef WOLFSSL_KEIL
  205734. "adcs r5, r5, r7\n\t"
  205735. #elif defined(__clang__)
  205736. "adcs r5, r7\n\t"
  205737. #else
  205738. "adc r5, r7\n\t"
  205739. #endif
  205740. "str r4, [%[r], #24]\n\t"
  205741. "str r5, [%[r], #28]\n\t"
  205742. "ldr r4, [%[r], #32]\n\t"
  205743. "ldr r5, [%[r], #36]\n\t"
  205744. "ldr r6, [%[m], #32]\n\t"
  205745. "ldr r7, [%[m], #36]\n\t"
  205746. #ifdef WOLFSSL_KEIL
  205747. "ands r6, r6, %[b]\n\t"
  205748. #elif defined(__clang__)
  205749. "ands r6, %[b]\n\t"
  205750. #else
  205751. "and r6, %[b]\n\t"
  205752. #endif
  205753. #ifdef WOLFSSL_KEIL
  205754. "ands r7, r7, %[b]\n\t"
  205755. #elif defined(__clang__)
  205756. "ands r7, %[b]\n\t"
  205757. #else
  205758. "and r7, %[b]\n\t"
  205759. #endif
  205760. #ifdef WOLFSSL_KEIL
  205761. "adcs r4, r4, r6\n\t"
  205762. #elif defined(__clang__)
  205763. "adcs r4, r6\n\t"
  205764. #else
  205765. "adc r4, r6\n\t"
  205766. #endif
  205767. #ifdef WOLFSSL_KEIL
  205768. "adcs r5, r5, r7\n\t"
  205769. #elif defined(__clang__)
  205770. "adcs r5, r7\n\t"
  205771. #else
  205772. "adc r5, r7\n\t"
  205773. #endif
  205774. "str r4, [%[r], #32]\n\t"
  205775. "str r5, [%[r], #36]\n\t"
  205776. "ldr r4, [%[r], #40]\n\t"
  205777. "ldr r5, [%[r], #44]\n\t"
  205778. "ldr r6, [%[m], #40]\n\t"
  205779. "ldr r7, [%[m], #44]\n\t"
  205780. #ifdef WOLFSSL_KEIL
  205781. "ands r6, r6, %[b]\n\t"
  205782. #elif defined(__clang__)
  205783. "ands r6, %[b]\n\t"
  205784. #else
  205785. "and r6, %[b]\n\t"
  205786. #endif
  205787. #ifdef WOLFSSL_KEIL
  205788. "ands r7, r7, %[b]\n\t"
  205789. #elif defined(__clang__)
  205790. "ands r7, %[b]\n\t"
  205791. #else
  205792. "and r7, %[b]\n\t"
  205793. #endif
  205794. #ifdef WOLFSSL_KEIL
  205795. "adcs r4, r4, r6\n\t"
  205796. #elif defined(__clang__)
  205797. "adcs r4, r6\n\t"
  205798. #else
  205799. "adc r4, r6\n\t"
  205800. #endif
  205801. #ifdef WOLFSSL_KEIL
  205802. "adcs r5, r5, r7\n\t"
  205803. #elif defined(__clang__)
  205804. "adcs r5, r7\n\t"
  205805. #else
  205806. "adc r5, r7\n\t"
  205807. #endif
  205808. "str r4, [%[r], #40]\n\t"
  205809. "str r5, [%[r], #44]\n\t"
  205810. "ldr r4, [%[r], #48]\n\t"
  205811. "ldr r5, [%[r], #52]\n\t"
  205812. "ldr r6, [%[m], #48]\n\t"
  205813. "ldr r7, [%[m], #52]\n\t"
  205814. #ifdef WOLFSSL_KEIL
  205815. "ands r6, r6, %[b]\n\t"
  205816. #elif defined(__clang__)
  205817. "ands r6, %[b]\n\t"
  205818. #else
  205819. "and r6, %[b]\n\t"
  205820. #endif
  205821. #ifdef WOLFSSL_KEIL
  205822. "ands r7, r7, %[b]\n\t"
  205823. #elif defined(__clang__)
  205824. "ands r7, %[b]\n\t"
  205825. #else
  205826. "and r7, %[b]\n\t"
  205827. #endif
  205828. #ifdef WOLFSSL_KEIL
  205829. "adcs r4, r4, r6\n\t"
  205830. #elif defined(__clang__)
  205831. "adcs r4, r6\n\t"
  205832. #else
  205833. "adc r4, r6\n\t"
  205834. #endif
  205835. #ifdef WOLFSSL_KEIL
  205836. "adcs r5, r5, r7\n\t"
  205837. #elif defined(__clang__)
  205838. "adcs r5, r7\n\t"
  205839. #else
  205840. "adc r5, r7\n\t"
  205841. #endif
  205842. "str r4, [%[r], #48]\n\t"
  205843. "str r5, [%[r], #52]\n\t"
  205844. "ldr r4, [%[r], #56]\n\t"
  205845. "ldr r5, [%[r], #60]\n\t"
  205846. "ldr r6, [%[m], #56]\n\t"
  205847. "ldr r7, [%[m], #60]\n\t"
  205848. #ifdef WOLFSSL_KEIL
  205849. "ands r6, r6, %[b]\n\t"
  205850. #elif defined(__clang__)
  205851. "ands r6, %[b]\n\t"
  205852. #else
  205853. "and r6, %[b]\n\t"
  205854. #endif
  205855. #ifdef WOLFSSL_KEIL
  205856. "ands r7, r7, %[b]\n\t"
  205857. #elif defined(__clang__)
  205858. "ands r7, %[b]\n\t"
  205859. #else
  205860. "and r7, %[b]\n\t"
  205861. #endif
  205862. #ifdef WOLFSSL_KEIL
  205863. "adcs r4, r4, r6\n\t"
  205864. #elif defined(__clang__)
  205865. "adcs r4, r6\n\t"
  205866. #else
  205867. "adc r4, r6\n\t"
  205868. #endif
  205869. #ifdef WOLFSSL_KEIL
  205870. "adcs r5, r5, r7\n\t"
  205871. #elif defined(__clang__)
  205872. "adcs r5, r7\n\t"
  205873. #else
  205874. "adc r5, r7\n\t"
  205875. #endif
  205876. "str r4, [%[r], #56]\n\t"
  205877. "str r5, [%[r], #60]\n\t"
  205878. "ldr r4, [%[r], #64]\n\t"
  205879. "ldr r5, [%[r], #68]\n\t"
  205880. "ldr r6, [%[m], #64]\n\t"
  205881. "ldr r7, [%[m], #68]\n\t"
  205882. #ifdef WOLFSSL_KEIL
  205883. "ands r6, r6, %[b]\n\t"
  205884. #elif defined(__clang__)
  205885. "ands r6, %[b]\n\t"
  205886. #else
  205887. "and r6, %[b]\n\t"
  205888. #endif
  205889. #ifdef WOLFSSL_KEIL
  205890. "ands r7, r7, %[b]\n\t"
  205891. #elif defined(__clang__)
  205892. "ands r7, %[b]\n\t"
  205893. #else
  205894. "and r7, %[b]\n\t"
  205895. #endif
  205896. #ifdef WOLFSSL_KEIL
  205897. "adcs r4, r4, r6\n\t"
  205898. #elif defined(__clang__)
  205899. "adcs r4, r6\n\t"
  205900. #else
  205901. "adc r4, r6\n\t"
  205902. #endif
  205903. #ifdef WOLFSSL_KEIL
  205904. "adcs r5, r5, r7\n\t"
  205905. #elif defined(__clang__)
  205906. "adcs r5, r7\n\t"
  205907. #else
  205908. "adc r5, r7\n\t"
  205909. #endif
  205910. "str r4, [%[r], #64]\n\t"
  205911. "str r5, [%[r], #68]\n\t"
  205912. "ldr r4, [%[r], #72]\n\t"
  205913. "ldr r5, [%[r], #76]\n\t"
  205914. "ldr r6, [%[m], #72]\n\t"
  205915. "ldr r7, [%[m], #76]\n\t"
  205916. #ifdef WOLFSSL_KEIL
  205917. "ands r6, r6, %[b]\n\t"
  205918. #elif defined(__clang__)
  205919. "ands r6, %[b]\n\t"
  205920. #else
  205921. "and r6, %[b]\n\t"
  205922. #endif
  205923. #ifdef WOLFSSL_KEIL
  205924. "ands r7, r7, %[b]\n\t"
  205925. #elif defined(__clang__)
  205926. "ands r7, %[b]\n\t"
  205927. #else
  205928. "and r7, %[b]\n\t"
  205929. #endif
  205930. #ifdef WOLFSSL_KEIL
  205931. "adcs r4, r4, r6\n\t"
  205932. #elif defined(__clang__)
  205933. "adcs r4, r6\n\t"
  205934. #else
  205935. "adc r4, r6\n\t"
  205936. #endif
  205937. #ifdef WOLFSSL_KEIL
  205938. "adcs r5, r5, r7\n\t"
  205939. #elif defined(__clang__)
  205940. "adcs r5, r7\n\t"
  205941. #else
  205942. "adc r5, r7\n\t"
  205943. #endif
  205944. "str r4, [%[r], #72]\n\t"
  205945. "str r5, [%[r], #76]\n\t"
  205946. "ldr r4, [%[r], #80]\n\t"
  205947. "ldr r5, [%[r], #84]\n\t"
  205948. "ldr r6, [%[m], #80]\n\t"
  205949. "ldr r7, [%[m], #84]\n\t"
  205950. #ifdef WOLFSSL_KEIL
  205951. "ands r6, r6, %[b]\n\t"
  205952. #elif defined(__clang__)
  205953. "ands r6, %[b]\n\t"
  205954. #else
  205955. "and r6, %[b]\n\t"
  205956. #endif
  205957. #ifdef WOLFSSL_KEIL
  205958. "ands r7, r7, %[b]\n\t"
  205959. #elif defined(__clang__)
  205960. "ands r7, %[b]\n\t"
  205961. #else
  205962. "and r7, %[b]\n\t"
  205963. #endif
  205964. #ifdef WOLFSSL_KEIL
  205965. "adcs r4, r4, r6\n\t"
  205966. #elif defined(__clang__)
  205967. "adcs r4, r6\n\t"
  205968. #else
  205969. "adc r4, r6\n\t"
  205970. #endif
  205971. #ifdef WOLFSSL_KEIL
  205972. "adcs r5, r5, r7\n\t"
  205973. #elif defined(__clang__)
  205974. "adcs r5, r7\n\t"
  205975. #else
  205976. "adc r5, r7\n\t"
  205977. #endif
  205978. "str r4, [%[r], #80]\n\t"
  205979. "str r5, [%[r], #84]\n\t"
  205980. "ldr r4, [%[r], #88]\n\t"
  205981. "ldr r5, [%[r], #92]\n\t"
  205982. "ldr r6, [%[m], #88]\n\t"
  205983. "ldr r7, [%[m], #92]\n\t"
  205984. #ifdef WOLFSSL_KEIL
  205985. "ands r6, r6, %[b]\n\t"
  205986. #elif defined(__clang__)
  205987. "ands r6, %[b]\n\t"
  205988. #else
  205989. "and r6, %[b]\n\t"
  205990. #endif
  205991. #ifdef WOLFSSL_KEIL
  205992. "ands r7, r7, %[b]\n\t"
  205993. #elif defined(__clang__)
  205994. "ands r7, %[b]\n\t"
  205995. #else
  205996. "and r7, %[b]\n\t"
  205997. #endif
  205998. #ifdef WOLFSSL_KEIL
  205999. "adcs r4, r4, r6\n\t"
  206000. #elif defined(__clang__)
  206001. "adcs r4, r6\n\t"
  206002. #else
  206003. "adc r4, r6\n\t"
  206004. #endif
  206005. #ifdef WOLFSSL_KEIL
  206006. "adcs r5, r5, r7\n\t"
  206007. #elif defined(__clang__)
  206008. "adcs r5, r7\n\t"
  206009. #else
  206010. "adc r5, r7\n\t"
  206011. #endif
  206012. "str r4, [%[r], #88]\n\t"
  206013. "str r5, [%[r], #92]\n\t"
  206014. "ldr r4, [%[r], #96]\n\t"
  206015. "ldr r5, [%[r], #100]\n\t"
  206016. "ldr r6, [%[m], #96]\n\t"
  206017. "ldr r7, [%[m], #100]\n\t"
  206018. #ifdef WOLFSSL_KEIL
  206019. "ands r6, r6, %[b]\n\t"
  206020. #elif defined(__clang__)
  206021. "ands r6, %[b]\n\t"
  206022. #else
  206023. "and r6, %[b]\n\t"
  206024. #endif
  206025. #ifdef WOLFSSL_KEIL
  206026. "ands r7, r7, %[b]\n\t"
  206027. #elif defined(__clang__)
  206028. "ands r7, %[b]\n\t"
  206029. #else
  206030. "and r7, %[b]\n\t"
  206031. #endif
  206032. #ifdef WOLFSSL_KEIL
  206033. "adcs r4, r4, r6\n\t"
  206034. #elif defined(__clang__)
  206035. "adcs r4, r6\n\t"
  206036. #else
  206037. "adc r4, r6\n\t"
  206038. #endif
  206039. #ifdef WOLFSSL_KEIL
  206040. "adcs r5, r5, r7\n\t"
  206041. #elif defined(__clang__)
  206042. "adcs r5, r7\n\t"
  206043. #else
  206044. "adc r5, r7\n\t"
  206045. #endif
  206046. "str r4, [%[r], #96]\n\t"
  206047. "str r5, [%[r], #100]\n\t"
  206048. "ldr r4, [%[r], #104]\n\t"
  206049. "ldr r5, [%[r], #108]\n\t"
  206050. "ldr r6, [%[m], #104]\n\t"
  206051. "ldr r7, [%[m], #108]\n\t"
  206052. #ifdef WOLFSSL_KEIL
  206053. "ands r6, r6, %[b]\n\t"
  206054. #elif defined(__clang__)
  206055. "ands r6, %[b]\n\t"
  206056. #else
  206057. "and r6, %[b]\n\t"
  206058. #endif
  206059. #ifdef WOLFSSL_KEIL
  206060. "ands r7, r7, %[b]\n\t"
  206061. #elif defined(__clang__)
  206062. "ands r7, %[b]\n\t"
  206063. #else
  206064. "and r7, %[b]\n\t"
  206065. #endif
  206066. #ifdef WOLFSSL_KEIL
  206067. "adcs r4, r4, r6\n\t"
  206068. #elif defined(__clang__)
  206069. "adcs r4, r6\n\t"
  206070. #else
  206071. "adc r4, r6\n\t"
  206072. #endif
  206073. #ifdef WOLFSSL_KEIL
  206074. "adcs r5, r5, r7\n\t"
  206075. #elif defined(__clang__)
  206076. "adcs r5, r7\n\t"
  206077. #else
  206078. "adc r5, r7\n\t"
  206079. #endif
  206080. "str r4, [%[r], #104]\n\t"
  206081. "str r5, [%[r], #108]\n\t"
  206082. "ldr r4, [%[r], #112]\n\t"
  206083. "ldr r5, [%[r], #116]\n\t"
  206084. "ldr r6, [%[m], #112]\n\t"
  206085. "ldr r7, [%[m], #116]\n\t"
  206086. #ifdef WOLFSSL_KEIL
  206087. "ands r6, r6, %[b]\n\t"
  206088. #elif defined(__clang__)
  206089. "ands r6, %[b]\n\t"
  206090. #else
  206091. "and r6, %[b]\n\t"
  206092. #endif
  206093. #ifdef WOLFSSL_KEIL
  206094. "ands r7, r7, %[b]\n\t"
  206095. #elif defined(__clang__)
  206096. "ands r7, %[b]\n\t"
  206097. #else
  206098. "and r7, %[b]\n\t"
  206099. #endif
  206100. #ifdef WOLFSSL_KEIL
  206101. "adcs r4, r4, r6\n\t"
  206102. #elif defined(__clang__)
  206103. "adcs r4, r6\n\t"
  206104. #else
  206105. "adc r4, r6\n\t"
  206106. #endif
  206107. #ifdef WOLFSSL_KEIL
  206108. "adcs r5, r5, r7\n\t"
  206109. #elif defined(__clang__)
  206110. "adcs r5, r7\n\t"
  206111. #else
  206112. "adc r5, r7\n\t"
  206113. #endif
  206114. "str r4, [%[r], #112]\n\t"
  206115. "str r5, [%[r], #116]\n\t"
  206116. "ldr r4, [%[r], #120]\n\t"
  206117. "ldr r5, [%[r], #124]\n\t"
  206118. "ldr r6, [%[m], #120]\n\t"
  206119. "ldr r7, [%[m], #124]\n\t"
  206120. #ifdef WOLFSSL_KEIL
  206121. "ands r6, r6, %[b]\n\t"
  206122. #elif defined(__clang__)
  206123. "ands r6, %[b]\n\t"
  206124. #else
  206125. "and r6, %[b]\n\t"
  206126. #endif
  206127. #ifdef WOLFSSL_KEIL
  206128. "ands r7, r7, %[b]\n\t"
  206129. #elif defined(__clang__)
  206130. "ands r7, %[b]\n\t"
  206131. #else
  206132. "and r7, %[b]\n\t"
  206133. #endif
  206134. #ifdef WOLFSSL_KEIL
  206135. "adcs r4, r4, r6\n\t"
  206136. #elif defined(__clang__)
  206137. "adcs r4, r6\n\t"
  206138. #else
  206139. "adc r4, r6\n\t"
  206140. #endif
  206141. #ifdef WOLFSSL_KEIL
  206142. "adcs r5, r5, r7\n\t"
  206143. #elif defined(__clang__)
  206144. "adcs r5, r7\n\t"
  206145. #else
  206146. "adc r5, r7\n\t"
  206147. #endif
  206148. "str r4, [%[r], #120]\n\t"
  206149. "str r5, [%[r], #124]\n\t"
  206150. "movs r6, #0\n\t"
  206151. #ifdef WOLFSSL_KEIL
  206152. "adcs %[b], %[b], r6\n\t"
  206153. #elif defined(__clang__)
  206154. "adcs %[b], r6\n\t"
  206155. #else
  206156. "adc %[b], r6\n\t"
  206157. #endif
  206158. "ldr r4, [%[r]]\n\t"
  206159. "ldr r5, [%[r], #4]\n\t"
  206160. "ldr r6, [%[m]]\n\t"
  206161. "ldr r7, [%[m], #4]\n\t"
  206162. #ifdef WOLFSSL_KEIL
  206163. "ands r6, r6, %[b]\n\t"
  206164. #elif defined(__clang__)
  206165. "ands r6, %[b]\n\t"
  206166. #else
  206167. "and r6, %[b]\n\t"
  206168. #endif
  206169. #ifdef WOLFSSL_KEIL
  206170. "ands r7, r7, %[b]\n\t"
  206171. #elif defined(__clang__)
  206172. "ands r7, %[b]\n\t"
  206173. #else
  206174. "and r7, %[b]\n\t"
  206175. #endif
  206176. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206177. "adds r4, r4, r6\n\t"
  206178. #else
  206179. "add r4, r4, r6\n\t"
  206180. #endif
  206181. #ifdef WOLFSSL_KEIL
  206182. "adcs r5, r5, r7\n\t"
  206183. #elif defined(__clang__)
  206184. "adcs r5, r7\n\t"
  206185. #else
  206186. "adc r5, r7\n\t"
  206187. #endif
  206188. "str r4, [%[r]]\n\t"
  206189. "str r5, [%[r], #4]\n\t"
  206190. "ldr r4, [%[r], #8]\n\t"
  206191. "ldr r5, [%[r], #12]\n\t"
  206192. "ldr r6, [%[m], #8]\n\t"
  206193. "ldr r7, [%[m], #12]\n\t"
  206194. #ifdef WOLFSSL_KEIL
  206195. "ands r6, r6, %[b]\n\t"
  206196. #elif defined(__clang__)
  206197. "ands r6, %[b]\n\t"
  206198. #else
  206199. "and r6, %[b]\n\t"
  206200. #endif
  206201. #ifdef WOLFSSL_KEIL
  206202. "ands r7, r7, %[b]\n\t"
  206203. #elif defined(__clang__)
  206204. "ands r7, %[b]\n\t"
  206205. #else
  206206. "and r7, %[b]\n\t"
  206207. #endif
  206208. #ifdef WOLFSSL_KEIL
  206209. "adcs r4, r4, r6\n\t"
  206210. #elif defined(__clang__)
  206211. "adcs r4, r6\n\t"
  206212. #else
  206213. "adc r4, r6\n\t"
  206214. #endif
  206215. #ifdef WOLFSSL_KEIL
  206216. "adcs r5, r5, r7\n\t"
  206217. #elif defined(__clang__)
  206218. "adcs r5, r7\n\t"
  206219. #else
  206220. "adc r5, r7\n\t"
  206221. #endif
  206222. "str r4, [%[r], #8]\n\t"
  206223. "str r5, [%[r], #12]\n\t"
  206224. "ldr r4, [%[r], #16]\n\t"
  206225. "ldr r5, [%[r], #20]\n\t"
  206226. "ldr r6, [%[m], #16]\n\t"
  206227. "ldr r7, [%[m], #20]\n\t"
  206228. #ifdef WOLFSSL_KEIL
  206229. "ands r6, r6, %[b]\n\t"
  206230. #elif defined(__clang__)
  206231. "ands r6, %[b]\n\t"
  206232. #else
  206233. "and r6, %[b]\n\t"
  206234. #endif
  206235. #ifdef WOLFSSL_KEIL
  206236. "ands r7, r7, %[b]\n\t"
  206237. #elif defined(__clang__)
  206238. "ands r7, %[b]\n\t"
  206239. #else
  206240. "and r7, %[b]\n\t"
  206241. #endif
  206242. #ifdef WOLFSSL_KEIL
  206243. "adcs r4, r4, r6\n\t"
  206244. #elif defined(__clang__)
  206245. "adcs r4, r6\n\t"
  206246. #else
  206247. "adc r4, r6\n\t"
  206248. #endif
  206249. #ifdef WOLFSSL_KEIL
  206250. "adcs r5, r5, r7\n\t"
  206251. #elif defined(__clang__)
  206252. "adcs r5, r7\n\t"
  206253. #else
  206254. "adc r5, r7\n\t"
  206255. #endif
  206256. "str r4, [%[r], #16]\n\t"
  206257. "str r5, [%[r], #20]\n\t"
  206258. "ldr r4, [%[r], #24]\n\t"
  206259. "ldr r5, [%[r], #28]\n\t"
  206260. "ldr r6, [%[m], #24]\n\t"
  206261. "ldr r7, [%[m], #28]\n\t"
  206262. #ifdef WOLFSSL_KEIL
  206263. "ands r6, r6, %[b]\n\t"
  206264. #elif defined(__clang__)
  206265. "ands r6, %[b]\n\t"
  206266. #else
  206267. "and r6, %[b]\n\t"
  206268. #endif
  206269. #ifdef WOLFSSL_KEIL
  206270. "ands r7, r7, %[b]\n\t"
  206271. #elif defined(__clang__)
  206272. "ands r7, %[b]\n\t"
  206273. #else
  206274. "and r7, %[b]\n\t"
  206275. #endif
  206276. #ifdef WOLFSSL_KEIL
  206277. "adcs r4, r4, r6\n\t"
  206278. #elif defined(__clang__)
  206279. "adcs r4, r6\n\t"
  206280. #else
  206281. "adc r4, r6\n\t"
  206282. #endif
  206283. #ifdef WOLFSSL_KEIL
  206284. "adcs r5, r5, r7\n\t"
  206285. #elif defined(__clang__)
  206286. "adcs r5, r7\n\t"
  206287. #else
  206288. "adc r5, r7\n\t"
  206289. #endif
  206290. "str r4, [%[r], #24]\n\t"
  206291. "str r5, [%[r], #28]\n\t"
  206292. "ldr r4, [%[r], #32]\n\t"
  206293. "ldr r5, [%[r], #36]\n\t"
  206294. "ldr r6, [%[m], #32]\n\t"
  206295. "ldr r7, [%[m], #36]\n\t"
  206296. #ifdef WOLFSSL_KEIL
  206297. "ands r6, r6, %[b]\n\t"
  206298. #elif defined(__clang__)
  206299. "ands r6, %[b]\n\t"
  206300. #else
  206301. "and r6, %[b]\n\t"
  206302. #endif
  206303. #ifdef WOLFSSL_KEIL
  206304. "ands r7, r7, %[b]\n\t"
  206305. #elif defined(__clang__)
  206306. "ands r7, %[b]\n\t"
  206307. #else
  206308. "and r7, %[b]\n\t"
  206309. #endif
  206310. #ifdef WOLFSSL_KEIL
  206311. "adcs r4, r4, r6\n\t"
  206312. #elif defined(__clang__)
  206313. "adcs r4, r6\n\t"
  206314. #else
  206315. "adc r4, r6\n\t"
  206316. #endif
  206317. #ifdef WOLFSSL_KEIL
  206318. "adcs r5, r5, r7\n\t"
  206319. #elif defined(__clang__)
  206320. "adcs r5, r7\n\t"
  206321. #else
  206322. "adc r5, r7\n\t"
  206323. #endif
  206324. "str r4, [%[r], #32]\n\t"
  206325. "str r5, [%[r], #36]\n\t"
  206326. "ldr r4, [%[r], #40]\n\t"
  206327. "ldr r5, [%[r], #44]\n\t"
  206328. "ldr r6, [%[m], #40]\n\t"
  206329. "ldr r7, [%[m], #44]\n\t"
  206330. #ifdef WOLFSSL_KEIL
  206331. "ands r6, r6, %[b]\n\t"
  206332. #elif defined(__clang__)
  206333. "ands r6, %[b]\n\t"
  206334. #else
  206335. "and r6, %[b]\n\t"
  206336. #endif
  206337. #ifdef WOLFSSL_KEIL
  206338. "ands r7, r7, %[b]\n\t"
  206339. #elif defined(__clang__)
  206340. "ands r7, %[b]\n\t"
  206341. #else
  206342. "and r7, %[b]\n\t"
  206343. #endif
  206344. #ifdef WOLFSSL_KEIL
  206345. "adcs r4, r4, r6\n\t"
  206346. #elif defined(__clang__)
  206347. "adcs r4, r6\n\t"
  206348. #else
  206349. "adc r4, r6\n\t"
  206350. #endif
  206351. #ifdef WOLFSSL_KEIL
  206352. "adcs r5, r5, r7\n\t"
  206353. #elif defined(__clang__)
  206354. "adcs r5, r7\n\t"
  206355. #else
  206356. "adc r5, r7\n\t"
  206357. #endif
  206358. "str r4, [%[r], #40]\n\t"
  206359. "str r5, [%[r], #44]\n\t"
  206360. "ldr r4, [%[r], #48]\n\t"
  206361. "ldr r5, [%[r], #52]\n\t"
  206362. "ldr r6, [%[m], #48]\n\t"
  206363. "ldr r7, [%[m], #52]\n\t"
  206364. #ifdef WOLFSSL_KEIL
  206365. "ands r6, r6, %[b]\n\t"
  206366. #elif defined(__clang__)
  206367. "ands r6, %[b]\n\t"
  206368. #else
  206369. "and r6, %[b]\n\t"
  206370. #endif
  206371. #ifdef WOLFSSL_KEIL
  206372. "ands r7, r7, %[b]\n\t"
  206373. #elif defined(__clang__)
  206374. "ands r7, %[b]\n\t"
  206375. #else
  206376. "and r7, %[b]\n\t"
  206377. #endif
  206378. #ifdef WOLFSSL_KEIL
  206379. "adcs r4, r4, r6\n\t"
  206380. #elif defined(__clang__)
  206381. "adcs r4, r6\n\t"
  206382. #else
  206383. "adc r4, r6\n\t"
  206384. #endif
  206385. #ifdef WOLFSSL_KEIL
  206386. "adcs r5, r5, r7\n\t"
  206387. #elif defined(__clang__)
  206388. "adcs r5, r7\n\t"
  206389. #else
  206390. "adc r5, r7\n\t"
  206391. #endif
  206392. "str r4, [%[r], #48]\n\t"
  206393. "str r5, [%[r], #52]\n\t"
  206394. "ldr r4, [%[r], #56]\n\t"
  206395. "ldr r5, [%[r], #60]\n\t"
  206396. "ldr r6, [%[m], #56]\n\t"
  206397. "ldr r7, [%[m], #60]\n\t"
  206398. #ifdef WOLFSSL_KEIL
  206399. "ands r6, r6, %[b]\n\t"
  206400. #elif defined(__clang__)
  206401. "ands r6, %[b]\n\t"
  206402. #else
  206403. "and r6, %[b]\n\t"
  206404. #endif
  206405. #ifdef WOLFSSL_KEIL
  206406. "ands r7, r7, %[b]\n\t"
  206407. #elif defined(__clang__)
  206408. "ands r7, %[b]\n\t"
  206409. #else
  206410. "and r7, %[b]\n\t"
  206411. #endif
  206412. #ifdef WOLFSSL_KEIL
  206413. "adcs r4, r4, r6\n\t"
  206414. #elif defined(__clang__)
  206415. "adcs r4, r6\n\t"
  206416. #else
  206417. "adc r4, r6\n\t"
  206418. #endif
  206419. #ifdef WOLFSSL_KEIL
  206420. "adcs r5, r5, r7\n\t"
  206421. #elif defined(__clang__)
  206422. "adcs r5, r7\n\t"
  206423. #else
  206424. "adc r5, r7\n\t"
  206425. #endif
  206426. "str r4, [%[r], #56]\n\t"
  206427. "str r5, [%[r], #60]\n\t"
  206428. "ldr r4, [%[r], #64]\n\t"
  206429. "ldr r5, [%[r], #68]\n\t"
  206430. "ldr r6, [%[m], #64]\n\t"
  206431. "ldr r7, [%[m], #68]\n\t"
  206432. #ifdef WOLFSSL_KEIL
  206433. "ands r6, r6, %[b]\n\t"
  206434. #elif defined(__clang__)
  206435. "ands r6, %[b]\n\t"
  206436. #else
  206437. "and r6, %[b]\n\t"
  206438. #endif
  206439. #ifdef WOLFSSL_KEIL
  206440. "ands r7, r7, %[b]\n\t"
  206441. #elif defined(__clang__)
  206442. "ands r7, %[b]\n\t"
  206443. #else
  206444. "and r7, %[b]\n\t"
  206445. #endif
  206446. #ifdef WOLFSSL_KEIL
  206447. "adcs r4, r4, r6\n\t"
  206448. #elif defined(__clang__)
  206449. "adcs r4, r6\n\t"
  206450. #else
  206451. "adc r4, r6\n\t"
  206452. #endif
  206453. #ifdef WOLFSSL_KEIL
  206454. "adcs r5, r5, r7\n\t"
  206455. #elif defined(__clang__)
  206456. "adcs r5, r7\n\t"
  206457. #else
  206458. "adc r5, r7\n\t"
  206459. #endif
  206460. "str r4, [%[r], #64]\n\t"
  206461. "str r5, [%[r], #68]\n\t"
  206462. "ldr r4, [%[r], #72]\n\t"
  206463. "ldr r5, [%[r], #76]\n\t"
  206464. "ldr r6, [%[m], #72]\n\t"
  206465. "ldr r7, [%[m], #76]\n\t"
  206466. #ifdef WOLFSSL_KEIL
  206467. "ands r6, r6, %[b]\n\t"
  206468. #elif defined(__clang__)
  206469. "ands r6, %[b]\n\t"
  206470. #else
  206471. "and r6, %[b]\n\t"
  206472. #endif
  206473. #ifdef WOLFSSL_KEIL
  206474. "ands r7, r7, %[b]\n\t"
  206475. #elif defined(__clang__)
  206476. "ands r7, %[b]\n\t"
  206477. #else
  206478. "and r7, %[b]\n\t"
  206479. #endif
  206480. #ifdef WOLFSSL_KEIL
  206481. "adcs r4, r4, r6\n\t"
  206482. #elif defined(__clang__)
  206483. "adcs r4, r6\n\t"
  206484. #else
  206485. "adc r4, r6\n\t"
  206486. #endif
  206487. #ifdef WOLFSSL_KEIL
  206488. "adcs r5, r5, r7\n\t"
  206489. #elif defined(__clang__)
  206490. "adcs r5, r7\n\t"
  206491. #else
  206492. "adc r5, r7\n\t"
  206493. #endif
  206494. "str r4, [%[r], #72]\n\t"
  206495. "str r5, [%[r], #76]\n\t"
  206496. "ldr r4, [%[r], #80]\n\t"
  206497. "ldr r5, [%[r], #84]\n\t"
  206498. "ldr r6, [%[m], #80]\n\t"
  206499. "ldr r7, [%[m], #84]\n\t"
  206500. #ifdef WOLFSSL_KEIL
  206501. "ands r6, r6, %[b]\n\t"
  206502. #elif defined(__clang__)
  206503. "ands r6, %[b]\n\t"
  206504. #else
  206505. "and r6, %[b]\n\t"
  206506. #endif
  206507. #ifdef WOLFSSL_KEIL
  206508. "ands r7, r7, %[b]\n\t"
  206509. #elif defined(__clang__)
  206510. "ands r7, %[b]\n\t"
  206511. #else
  206512. "and r7, %[b]\n\t"
  206513. #endif
  206514. #ifdef WOLFSSL_KEIL
  206515. "adcs r4, r4, r6\n\t"
  206516. #elif defined(__clang__)
  206517. "adcs r4, r6\n\t"
  206518. #else
  206519. "adc r4, r6\n\t"
  206520. #endif
  206521. #ifdef WOLFSSL_KEIL
  206522. "adcs r5, r5, r7\n\t"
  206523. #elif defined(__clang__)
  206524. "adcs r5, r7\n\t"
  206525. #else
  206526. "adc r5, r7\n\t"
  206527. #endif
  206528. "str r4, [%[r], #80]\n\t"
  206529. "str r5, [%[r], #84]\n\t"
  206530. "ldr r4, [%[r], #88]\n\t"
  206531. "ldr r5, [%[r], #92]\n\t"
  206532. "ldr r6, [%[m], #88]\n\t"
  206533. "ldr r7, [%[m], #92]\n\t"
  206534. #ifdef WOLFSSL_KEIL
  206535. "ands r6, r6, %[b]\n\t"
  206536. #elif defined(__clang__)
  206537. "ands r6, %[b]\n\t"
  206538. #else
  206539. "and r6, %[b]\n\t"
  206540. #endif
  206541. #ifdef WOLFSSL_KEIL
  206542. "ands r7, r7, %[b]\n\t"
  206543. #elif defined(__clang__)
  206544. "ands r7, %[b]\n\t"
  206545. #else
  206546. "and r7, %[b]\n\t"
  206547. #endif
  206548. #ifdef WOLFSSL_KEIL
  206549. "adcs r4, r4, r6\n\t"
  206550. #elif defined(__clang__)
  206551. "adcs r4, r6\n\t"
  206552. #else
  206553. "adc r4, r6\n\t"
  206554. #endif
  206555. #ifdef WOLFSSL_KEIL
  206556. "adcs r5, r5, r7\n\t"
  206557. #elif defined(__clang__)
  206558. "adcs r5, r7\n\t"
  206559. #else
  206560. "adc r5, r7\n\t"
  206561. #endif
  206562. "str r4, [%[r], #88]\n\t"
  206563. "str r5, [%[r], #92]\n\t"
  206564. "ldr r4, [%[r], #96]\n\t"
  206565. "ldr r5, [%[r], #100]\n\t"
  206566. "ldr r6, [%[m], #96]\n\t"
  206567. "ldr r7, [%[m], #100]\n\t"
  206568. #ifdef WOLFSSL_KEIL
  206569. "ands r6, r6, %[b]\n\t"
  206570. #elif defined(__clang__)
  206571. "ands r6, %[b]\n\t"
  206572. #else
  206573. "and r6, %[b]\n\t"
  206574. #endif
  206575. #ifdef WOLFSSL_KEIL
  206576. "ands r7, r7, %[b]\n\t"
  206577. #elif defined(__clang__)
  206578. "ands r7, %[b]\n\t"
  206579. #else
  206580. "and r7, %[b]\n\t"
  206581. #endif
  206582. #ifdef WOLFSSL_KEIL
  206583. "adcs r4, r4, r6\n\t"
  206584. #elif defined(__clang__)
  206585. "adcs r4, r6\n\t"
  206586. #else
  206587. "adc r4, r6\n\t"
  206588. #endif
  206589. #ifdef WOLFSSL_KEIL
  206590. "adcs r5, r5, r7\n\t"
  206591. #elif defined(__clang__)
  206592. "adcs r5, r7\n\t"
  206593. #else
  206594. "adc r5, r7\n\t"
  206595. #endif
  206596. "str r4, [%[r], #96]\n\t"
  206597. "str r5, [%[r], #100]\n\t"
  206598. "ldr r4, [%[r], #104]\n\t"
  206599. "ldr r5, [%[r], #108]\n\t"
  206600. "ldr r6, [%[m], #104]\n\t"
  206601. "ldr r7, [%[m], #108]\n\t"
  206602. #ifdef WOLFSSL_KEIL
  206603. "ands r6, r6, %[b]\n\t"
  206604. #elif defined(__clang__)
  206605. "ands r6, %[b]\n\t"
  206606. #else
  206607. "and r6, %[b]\n\t"
  206608. #endif
  206609. #ifdef WOLFSSL_KEIL
  206610. "ands r7, r7, %[b]\n\t"
  206611. #elif defined(__clang__)
  206612. "ands r7, %[b]\n\t"
  206613. #else
  206614. "and r7, %[b]\n\t"
  206615. #endif
  206616. #ifdef WOLFSSL_KEIL
  206617. "adcs r4, r4, r6\n\t"
  206618. #elif defined(__clang__)
  206619. "adcs r4, r6\n\t"
  206620. #else
  206621. "adc r4, r6\n\t"
  206622. #endif
  206623. #ifdef WOLFSSL_KEIL
  206624. "adcs r5, r5, r7\n\t"
  206625. #elif defined(__clang__)
  206626. "adcs r5, r7\n\t"
  206627. #else
  206628. "adc r5, r7\n\t"
  206629. #endif
  206630. "str r4, [%[r], #104]\n\t"
  206631. "str r5, [%[r], #108]\n\t"
  206632. "ldr r4, [%[r], #112]\n\t"
  206633. "ldr r5, [%[r], #116]\n\t"
  206634. "ldr r6, [%[m], #112]\n\t"
  206635. "ldr r7, [%[m], #116]\n\t"
  206636. #ifdef WOLFSSL_KEIL
  206637. "ands r6, r6, %[b]\n\t"
  206638. #elif defined(__clang__)
  206639. "ands r6, %[b]\n\t"
  206640. #else
  206641. "and r6, %[b]\n\t"
  206642. #endif
  206643. #ifdef WOLFSSL_KEIL
  206644. "ands r7, r7, %[b]\n\t"
  206645. #elif defined(__clang__)
  206646. "ands r7, %[b]\n\t"
  206647. #else
  206648. "and r7, %[b]\n\t"
  206649. #endif
  206650. #ifdef WOLFSSL_KEIL
  206651. "adcs r4, r4, r6\n\t"
  206652. #elif defined(__clang__)
  206653. "adcs r4, r6\n\t"
  206654. #else
  206655. "adc r4, r6\n\t"
  206656. #endif
  206657. #ifdef WOLFSSL_KEIL
  206658. "adcs r5, r5, r7\n\t"
  206659. #elif defined(__clang__)
  206660. "adcs r5, r7\n\t"
  206661. #else
  206662. "adc r5, r7\n\t"
  206663. #endif
  206664. "str r4, [%[r], #112]\n\t"
  206665. "str r5, [%[r], #116]\n\t"
  206666. "ldr r4, [%[r], #120]\n\t"
  206667. "ldr r5, [%[r], #124]\n\t"
  206668. "ldr r6, [%[m], #120]\n\t"
  206669. "ldr r7, [%[m], #124]\n\t"
  206670. #ifdef WOLFSSL_KEIL
  206671. "ands r6, r6, %[b]\n\t"
  206672. #elif defined(__clang__)
  206673. "ands r6, %[b]\n\t"
  206674. #else
  206675. "and r6, %[b]\n\t"
  206676. #endif
  206677. #ifdef WOLFSSL_KEIL
  206678. "ands r7, r7, %[b]\n\t"
  206679. #elif defined(__clang__)
  206680. "ands r7, %[b]\n\t"
  206681. #else
  206682. "and r7, %[b]\n\t"
  206683. #endif
  206684. #ifdef WOLFSSL_KEIL
  206685. "adcs r4, r4, r6\n\t"
  206686. #elif defined(__clang__)
  206687. "adcs r4, r6\n\t"
  206688. #else
  206689. "adc r4, r6\n\t"
  206690. #endif
  206691. #ifdef WOLFSSL_KEIL
  206692. "adcs r5, r5, r7\n\t"
  206693. #elif defined(__clang__)
  206694. "adcs r5, r7\n\t"
  206695. #else
  206696. "adc r5, r7\n\t"
  206697. #endif
  206698. "str r4, [%[r], #120]\n\t"
  206699. "str r5, [%[r], #124]\n\t"
  206700. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m)
  206701. :
  206702. : "memory", "r4", "r5", "r6", "r7"
  206703. );
  206704. }
  206705. #define sp_1024_mont_sub_lower_32 sp_1024_mont_sub_32
  206706. /* Conditionally add a and b using the mask m.
  206707. * m is -1 to add and 0 when not.
  206708. *
  206709. * r A single precision number representing conditional add result.
  206710. * a A single precision number to add with.
  206711. * b A single precision number to add.
  206712. * m Mask value to apply.
  206713. */
  206714. SP_NOINLINE static sp_digit sp_1024_cond_add_32(sp_digit* r, const sp_digit* a,
  206715. const sp_digit* b, sp_digit m)
  206716. {
  206717. __asm__ __volatile__ (
  206718. "movs r4, #0\n\t"
  206719. "movs r5, #0x80\n\t"
  206720. "mov r8, r5\n\t"
  206721. "movs r7, #0\n\t"
  206722. "\n"
  206723. "L_sp_1024_cond_add_32_words_%=:\n\t"
  206724. "ldr r6, [%[b], r7]\n\t"
  206725. #ifdef WOLFSSL_KEIL
  206726. "ands r6, r6, %[m]\n\t"
  206727. #elif defined(__clang__)
  206728. "ands r6, %[m]\n\t"
  206729. #else
  206730. "and r6, %[m]\n\t"
  206731. #endif
  206732. "movs r5, #0\n\t"
  206733. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206734. "subs r5, r5, #1\n\t"
  206735. #else
  206736. "sub r5, r5, #1\n\t"
  206737. #endif
  206738. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206739. "adds r5, r5, r4\n\t"
  206740. #else
  206741. "add r5, r5, r4\n\t"
  206742. #endif
  206743. "ldr r5, [%[a], r7]\n\t"
  206744. #ifdef WOLFSSL_KEIL
  206745. "adcs r5, r5, r6\n\t"
  206746. #elif defined(__clang__)
  206747. "adcs r5, r6\n\t"
  206748. #else
  206749. "adc r5, r6\n\t"
  206750. #endif
  206751. "movs r4, #0\n\t"
  206752. #ifdef WOLFSSL_KEIL
  206753. "adcs r4, r4, r4\n\t"
  206754. #elif defined(__clang__)
  206755. "adcs r4, r4\n\t"
  206756. #else
  206757. "adc r4, r4\n\t"
  206758. #endif
  206759. "str r5, [%[r], r7]\n\t"
  206760. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206761. "adds r7, r7, #4\n\t"
  206762. #else
  206763. "add r7, r7, #4\n\t"
  206764. #endif
  206765. "cmp r7, r8\n\t"
  206766. "blt L_sp_1024_cond_add_32_words_%=\n\t"
  206767. "movs %[r], r4\n\t"
  206768. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m)
  206769. :
  206770. : "memory", "r4", "r5", "r6", "r7", "r8"
  206771. );
  206772. return (uint32_t)(size_t)r;
  206773. }
  206774. /* Right shift a by 1 bit into r. (r = a >> 1)
  206775. *
  206776. * r A single precision integer.
  206777. * a A single precision integer.
  206778. */
  206779. static void sp_1024_rshift1_32(sp_digit* r, const sp_digit* a)
  206780. {
  206781. __asm__ __volatile__ (
  206782. "ldr r2, [%[a]]\n\t"
  206783. "ldr r3, [%[a], #4]\n\t"
  206784. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206785. "lsrs r2, r2, #1\n\t"
  206786. #else
  206787. "lsr r2, r2, #1\n\t"
  206788. #endif
  206789. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206790. "lsls r5, r3, #31\n\t"
  206791. #else
  206792. "lsl r5, r3, #31\n\t"
  206793. #endif
  206794. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206795. "lsrs r3, r3, #1\n\t"
  206796. #else
  206797. "lsr r3, r3, #1\n\t"
  206798. #endif
  206799. #ifdef WOLFSSL_KEIL
  206800. "orrs r2, r2, r5\n\t"
  206801. #elif defined(__clang__)
  206802. "orrs r2, r5\n\t"
  206803. #else
  206804. "orr r2, r5\n\t"
  206805. #endif
  206806. "ldr r4, [%[a], #8]\n\t"
  206807. "str r2, [%[r]]\n\t"
  206808. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206809. "lsls r5, r4, #31\n\t"
  206810. #else
  206811. "lsl r5, r4, #31\n\t"
  206812. #endif
  206813. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206814. "lsrs r4, r4, #1\n\t"
  206815. #else
  206816. "lsr r4, r4, #1\n\t"
  206817. #endif
  206818. #ifdef WOLFSSL_KEIL
  206819. "orrs r3, r3, r5\n\t"
  206820. #elif defined(__clang__)
  206821. "orrs r3, r5\n\t"
  206822. #else
  206823. "orr r3, r5\n\t"
  206824. #endif
  206825. "ldr r2, [%[a], #12]\n\t"
  206826. "str r3, [%[r], #4]\n\t"
  206827. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206828. "lsls r5, r2, #31\n\t"
  206829. #else
  206830. "lsl r5, r2, #31\n\t"
  206831. #endif
  206832. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206833. "lsrs r2, r2, #1\n\t"
  206834. #else
  206835. "lsr r2, r2, #1\n\t"
  206836. #endif
  206837. #ifdef WOLFSSL_KEIL
  206838. "orrs r4, r4, r5\n\t"
  206839. #elif defined(__clang__)
  206840. "orrs r4, r5\n\t"
  206841. #else
  206842. "orr r4, r5\n\t"
  206843. #endif
  206844. "ldr r3, [%[a], #16]\n\t"
  206845. "str r4, [%[r], #8]\n\t"
  206846. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206847. "lsls r5, r3, #31\n\t"
  206848. #else
  206849. "lsl r5, r3, #31\n\t"
  206850. #endif
  206851. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206852. "lsrs r3, r3, #1\n\t"
  206853. #else
  206854. "lsr r3, r3, #1\n\t"
  206855. #endif
  206856. #ifdef WOLFSSL_KEIL
  206857. "orrs r2, r2, r5\n\t"
  206858. #elif defined(__clang__)
  206859. "orrs r2, r5\n\t"
  206860. #else
  206861. "orr r2, r5\n\t"
  206862. #endif
  206863. "ldr r4, [%[a], #20]\n\t"
  206864. "str r2, [%[r], #12]\n\t"
  206865. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206866. "lsls r5, r4, #31\n\t"
  206867. #else
  206868. "lsl r5, r4, #31\n\t"
  206869. #endif
  206870. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206871. "lsrs r4, r4, #1\n\t"
  206872. #else
  206873. "lsr r4, r4, #1\n\t"
  206874. #endif
  206875. #ifdef WOLFSSL_KEIL
  206876. "orrs r3, r3, r5\n\t"
  206877. #elif defined(__clang__)
  206878. "orrs r3, r5\n\t"
  206879. #else
  206880. "orr r3, r5\n\t"
  206881. #endif
  206882. "ldr r2, [%[a], #24]\n\t"
  206883. "str r3, [%[r], #16]\n\t"
  206884. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206885. "lsls r5, r2, #31\n\t"
  206886. #else
  206887. "lsl r5, r2, #31\n\t"
  206888. #endif
  206889. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206890. "lsrs r2, r2, #1\n\t"
  206891. #else
  206892. "lsr r2, r2, #1\n\t"
  206893. #endif
  206894. #ifdef WOLFSSL_KEIL
  206895. "orrs r4, r4, r5\n\t"
  206896. #elif defined(__clang__)
  206897. "orrs r4, r5\n\t"
  206898. #else
  206899. "orr r4, r5\n\t"
  206900. #endif
  206901. "ldr r3, [%[a], #28]\n\t"
  206902. "str r4, [%[r], #20]\n\t"
  206903. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206904. "lsls r5, r3, #31\n\t"
  206905. #else
  206906. "lsl r5, r3, #31\n\t"
  206907. #endif
  206908. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206909. "lsrs r3, r3, #1\n\t"
  206910. #else
  206911. "lsr r3, r3, #1\n\t"
  206912. #endif
  206913. #ifdef WOLFSSL_KEIL
  206914. "orrs r2, r2, r5\n\t"
  206915. #elif defined(__clang__)
  206916. "orrs r2, r5\n\t"
  206917. #else
  206918. "orr r2, r5\n\t"
  206919. #endif
  206920. "ldr r4, [%[a], #32]\n\t"
  206921. "str r2, [%[r], #24]\n\t"
  206922. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206923. "lsls r5, r4, #31\n\t"
  206924. #else
  206925. "lsl r5, r4, #31\n\t"
  206926. #endif
  206927. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206928. "lsrs r4, r4, #1\n\t"
  206929. #else
  206930. "lsr r4, r4, #1\n\t"
  206931. #endif
  206932. #ifdef WOLFSSL_KEIL
  206933. "orrs r3, r3, r5\n\t"
  206934. #elif defined(__clang__)
  206935. "orrs r3, r5\n\t"
  206936. #else
  206937. "orr r3, r5\n\t"
  206938. #endif
  206939. "ldr r2, [%[a], #36]\n\t"
  206940. "str r3, [%[r], #28]\n\t"
  206941. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206942. "lsls r5, r2, #31\n\t"
  206943. #else
  206944. "lsl r5, r2, #31\n\t"
  206945. #endif
  206946. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206947. "lsrs r2, r2, #1\n\t"
  206948. #else
  206949. "lsr r2, r2, #1\n\t"
  206950. #endif
  206951. #ifdef WOLFSSL_KEIL
  206952. "orrs r4, r4, r5\n\t"
  206953. #elif defined(__clang__)
  206954. "orrs r4, r5\n\t"
  206955. #else
  206956. "orr r4, r5\n\t"
  206957. #endif
  206958. "ldr r3, [%[a], #40]\n\t"
  206959. "str r4, [%[r], #32]\n\t"
  206960. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206961. "lsls r5, r3, #31\n\t"
  206962. #else
  206963. "lsl r5, r3, #31\n\t"
  206964. #endif
  206965. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206966. "lsrs r3, r3, #1\n\t"
  206967. #else
  206968. "lsr r3, r3, #1\n\t"
  206969. #endif
  206970. #ifdef WOLFSSL_KEIL
  206971. "orrs r2, r2, r5\n\t"
  206972. #elif defined(__clang__)
  206973. "orrs r2, r5\n\t"
  206974. #else
  206975. "orr r2, r5\n\t"
  206976. #endif
  206977. "ldr r4, [%[a], #44]\n\t"
  206978. "str r2, [%[r], #36]\n\t"
  206979. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206980. "lsls r5, r4, #31\n\t"
  206981. #else
  206982. "lsl r5, r4, #31\n\t"
  206983. #endif
  206984. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206985. "lsrs r4, r4, #1\n\t"
  206986. #else
  206987. "lsr r4, r4, #1\n\t"
  206988. #endif
  206989. #ifdef WOLFSSL_KEIL
  206990. "orrs r3, r3, r5\n\t"
  206991. #elif defined(__clang__)
  206992. "orrs r3, r5\n\t"
  206993. #else
  206994. "orr r3, r5\n\t"
  206995. #endif
  206996. "ldr r2, [%[a], #48]\n\t"
  206997. "str r3, [%[r], #40]\n\t"
  206998. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206999. "lsls r5, r2, #31\n\t"
  207000. #else
  207001. "lsl r5, r2, #31\n\t"
  207002. #endif
  207003. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207004. "lsrs r2, r2, #1\n\t"
  207005. #else
  207006. "lsr r2, r2, #1\n\t"
  207007. #endif
  207008. #ifdef WOLFSSL_KEIL
  207009. "orrs r4, r4, r5\n\t"
  207010. #elif defined(__clang__)
  207011. "orrs r4, r5\n\t"
  207012. #else
  207013. "orr r4, r5\n\t"
  207014. #endif
  207015. "ldr r3, [%[a], #52]\n\t"
  207016. "str r4, [%[r], #44]\n\t"
  207017. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207018. "lsls r5, r3, #31\n\t"
  207019. #else
  207020. "lsl r5, r3, #31\n\t"
  207021. #endif
  207022. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207023. "lsrs r3, r3, #1\n\t"
  207024. #else
  207025. "lsr r3, r3, #1\n\t"
  207026. #endif
  207027. #ifdef WOLFSSL_KEIL
  207028. "orrs r2, r2, r5\n\t"
  207029. #elif defined(__clang__)
  207030. "orrs r2, r5\n\t"
  207031. #else
  207032. "orr r2, r5\n\t"
  207033. #endif
  207034. "ldr r4, [%[a], #56]\n\t"
  207035. "str r2, [%[r], #48]\n\t"
  207036. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207037. "lsls r5, r4, #31\n\t"
  207038. #else
  207039. "lsl r5, r4, #31\n\t"
  207040. #endif
  207041. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207042. "lsrs r4, r4, #1\n\t"
  207043. #else
  207044. "lsr r4, r4, #1\n\t"
  207045. #endif
  207046. #ifdef WOLFSSL_KEIL
  207047. "orrs r3, r3, r5\n\t"
  207048. #elif defined(__clang__)
  207049. "orrs r3, r5\n\t"
  207050. #else
  207051. "orr r3, r5\n\t"
  207052. #endif
  207053. "ldr r2, [%[a], #60]\n\t"
  207054. "str r3, [%[r], #52]\n\t"
  207055. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207056. "lsls r5, r2, #31\n\t"
  207057. #else
  207058. "lsl r5, r2, #31\n\t"
  207059. #endif
  207060. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207061. "lsrs r2, r2, #1\n\t"
  207062. #else
  207063. "lsr r2, r2, #1\n\t"
  207064. #endif
  207065. #ifdef WOLFSSL_KEIL
  207066. "orrs r4, r4, r5\n\t"
  207067. #elif defined(__clang__)
  207068. "orrs r4, r5\n\t"
  207069. #else
  207070. "orr r4, r5\n\t"
  207071. #endif
  207072. "ldr r3, [%[a], #64]\n\t"
  207073. "str r4, [%[r], #56]\n\t"
  207074. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207075. "lsls r5, r3, #31\n\t"
  207076. #else
  207077. "lsl r5, r3, #31\n\t"
  207078. #endif
  207079. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207080. "lsrs r3, r3, #1\n\t"
  207081. #else
  207082. "lsr r3, r3, #1\n\t"
  207083. #endif
  207084. #ifdef WOLFSSL_KEIL
  207085. "orrs r2, r2, r5\n\t"
  207086. #elif defined(__clang__)
  207087. "orrs r2, r5\n\t"
  207088. #else
  207089. "orr r2, r5\n\t"
  207090. #endif
  207091. "ldr r4, [%[a], #68]\n\t"
  207092. "str r2, [%[r], #60]\n\t"
  207093. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207094. "lsls r5, r4, #31\n\t"
  207095. #else
  207096. "lsl r5, r4, #31\n\t"
  207097. #endif
  207098. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207099. "lsrs r4, r4, #1\n\t"
  207100. #else
  207101. "lsr r4, r4, #1\n\t"
  207102. #endif
  207103. #ifdef WOLFSSL_KEIL
  207104. "orrs r3, r3, r5\n\t"
  207105. #elif defined(__clang__)
  207106. "orrs r3, r5\n\t"
  207107. #else
  207108. "orr r3, r5\n\t"
  207109. #endif
  207110. "ldr r2, [%[a], #72]\n\t"
  207111. "str r3, [%[r], #64]\n\t"
  207112. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207113. "lsls r5, r2, #31\n\t"
  207114. #else
  207115. "lsl r5, r2, #31\n\t"
  207116. #endif
  207117. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207118. "lsrs r2, r2, #1\n\t"
  207119. #else
  207120. "lsr r2, r2, #1\n\t"
  207121. #endif
  207122. #ifdef WOLFSSL_KEIL
  207123. "orrs r4, r4, r5\n\t"
  207124. #elif defined(__clang__)
  207125. "orrs r4, r5\n\t"
  207126. #else
  207127. "orr r4, r5\n\t"
  207128. #endif
  207129. "ldr r3, [%[a], #76]\n\t"
  207130. "str r4, [%[r], #68]\n\t"
  207131. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207132. "lsls r5, r3, #31\n\t"
  207133. #else
  207134. "lsl r5, r3, #31\n\t"
  207135. #endif
  207136. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207137. "lsrs r3, r3, #1\n\t"
  207138. #else
  207139. "lsr r3, r3, #1\n\t"
  207140. #endif
  207141. #ifdef WOLFSSL_KEIL
  207142. "orrs r2, r2, r5\n\t"
  207143. #elif defined(__clang__)
  207144. "orrs r2, r5\n\t"
  207145. #else
  207146. "orr r2, r5\n\t"
  207147. #endif
  207148. "ldr r4, [%[a], #80]\n\t"
  207149. "str r2, [%[r], #72]\n\t"
  207150. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207151. "lsls r5, r4, #31\n\t"
  207152. #else
  207153. "lsl r5, r4, #31\n\t"
  207154. #endif
  207155. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207156. "lsrs r4, r4, #1\n\t"
  207157. #else
  207158. "lsr r4, r4, #1\n\t"
  207159. #endif
  207160. #ifdef WOLFSSL_KEIL
  207161. "orrs r3, r3, r5\n\t"
  207162. #elif defined(__clang__)
  207163. "orrs r3, r5\n\t"
  207164. #else
  207165. "orr r3, r5\n\t"
  207166. #endif
  207167. "ldr r2, [%[a], #84]\n\t"
  207168. "str r3, [%[r], #76]\n\t"
  207169. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207170. "lsls r5, r2, #31\n\t"
  207171. #else
  207172. "lsl r5, r2, #31\n\t"
  207173. #endif
  207174. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207175. "lsrs r2, r2, #1\n\t"
  207176. #else
  207177. "lsr r2, r2, #1\n\t"
  207178. #endif
  207179. #ifdef WOLFSSL_KEIL
  207180. "orrs r4, r4, r5\n\t"
  207181. #elif defined(__clang__)
  207182. "orrs r4, r5\n\t"
  207183. #else
  207184. "orr r4, r5\n\t"
  207185. #endif
  207186. "ldr r3, [%[a], #88]\n\t"
  207187. "str r4, [%[r], #80]\n\t"
  207188. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207189. "lsls r5, r3, #31\n\t"
  207190. #else
  207191. "lsl r5, r3, #31\n\t"
  207192. #endif
  207193. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207194. "lsrs r3, r3, #1\n\t"
  207195. #else
  207196. "lsr r3, r3, #1\n\t"
  207197. #endif
  207198. #ifdef WOLFSSL_KEIL
  207199. "orrs r2, r2, r5\n\t"
  207200. #elif defined(__clang__)
  207201. "orrs r2, r5\n\t"
  207202. #else
  207203. "orr r2, r5\n\t"
  207204. #endif
  207205. "ldr r4, [%[a], #92]\n\t"
  207206. "str r2, [%[r], #84]\n\t"
  207207. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207208. "lsls r5, r4, #31\n\t"
  207209. #else
  207210. "lsl r5, r4, #31\n\t"
  207211. #endif
  207212. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207213. "lsrs r4, r4, #1\n\t"
  207214. #else
  207215. "lsr r4, r4, #1\n\t"
  207216. #endif
  207217. #ifdef WOLFSSL_KEIL
  207218. "orrs r3, r3, r5\n\t"
  207219. #elif defined(__clang__)
  207220. "orrs r3, r5\n\t"
  207221. #else
  207222. "orr r3, r5\n\t"
  207223. #endif
  207224. "ldr r2, [%[a], #96]\n\t"
  207225. "str r3, [%[r], #88]\n\t"
  207226. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207227. "lsls r5, r2, #31\n\t"
  207228. #else
  207229. "lsl r5, r2, #31\n\t"
  207230. #endif
  207231. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207232. "lsrs r2, r2, #1\n\t"
  207233. #else
  207234. "lsr r2, r2, #1\n\t"
  207235. #endif
  207236. #ifdef WOLFSSL_KEIL
  207237. "orrs r4, r4, r5\n\t"
  207238. #elif defined(__clang__)
  207239. "orrs r4, r5\n\t"
  207240. #else
  207241. "orr r4, r5\n\t"
  207242. #endif
  207243. "ldr r3, [%[a], #100]\n\t"
  207244. "str r4, [%[r], #92]\n\t"
  207245. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207246. "lsls r5, r3, #31\n\t"
  207247. #else
  207248. "lsl r5, r3, #31\n\t"
  207249. #endif
  207250. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207251. "lsrs r3, r3, #1\n\t"
  207252. #else
  207253. "lsr r3, r3, #1\n\t"
  207254. #endif
  207255. #ifdef WOLFSSL_KEIL
  207256. "orrs r2, r2, r5\n\t"
  207257. #elif defined(__clang__)
  207258. "orrs r2, r5\n\t"
  207259. #else
  207260. "orr r2, r5\n\t"
  207261. #endif
  207262. "ldr r4, [%[a], #104]\n\t"
  207263. "str r2, [%[r], #96]\n\t"
  207264. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207265. "lsls r5, r4, #31\n\t"
  207266. #else
  207267. "lsl r5, r4, #31\n\t"
  207268. #endif
  207269. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207270. "lsrs r4, r4, #1\n\t"
  207271. #else
  207272. "lsr r4, r4, #1\n\t"
  207273. #endif
  207274. #ifdef WOLFSSL_KEIL
  207275. "orrs r3, r3, r5\n\t"
  207276. #elif defined(__clang__)
  207277. "orrs r3, r5\n\t"
  207278. #else
  207279. "orr r3, r5\n\t"
  207280. #endif
  207281. "ldr r2, [%[a], #108]\n\t"
  207282. "str r3, [%[r], #100]\n\t"
  207283. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207284. "lsls r5, r2, #31\n\t"
  207285. #else
  207286. "lsl r5, r2, #31\n\t"
  207287. #endif
  207288. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207289. "lsrs r2, r2, #1\n\t"
  207290. #else
  207291. "lsr r2, r2, #1\n\t"
  207292. #endif
  207293. #ifdef WOLFSSL_KEIL
  207294. "orrs r4, r4, r5\n\t"
  207295. #elif defined(__clang__)
  207296. "orrs r4, r5\n\t"
  207297. #else
  207298. "orr r4, r5\n\t"
  207299. #endif
  207300. "ldr r3, [%[a], #112]\n\t"
  207301. "str r4, [%[r], #104]\n\t"
  207302. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207303. "lsls r5, r3, #31\n\t"
  207304. #else
  207305. "lsl r5, r3, #31\n\t"
  207306. #endif
  207307. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207308. "lsrs r3, r3, #1\n\t"
  207309. #else
  207310. "lsr r3, r3, #1\n\t"
  207311. #endif
  207312. #ifdef WOLFSSL_KEIL
  207313. "orrs r2, r2, r5\n\t"
  207314. #elif defined(__clang__)
  207315. "orrs r2, r5\n\t"
  207316. #else
  207317. "orr r2, r5\n\t"
  207318. #endif
  207319. "ldr r4, [%[a], #116]\n\t"
  207320. "str r2, [%[r], #108]\n\t"
  207321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207322. "lsls r5, r4, #31\n\t"
  207323. #else
  207324. "lsl r5, r4, #31\n\t"
  207325. #endif
  207326. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207327. "lsrs r4, r4, #1\n\t"
  207328. #else
  207329. "lsr r4, r4, #1\n\t"
  207330. #endif
  207331. #ifdef WOLFSSL_KEIL
  207332. "orrs r3, r3, r5\n\t"
  207333. #elif defined(__clang__)
  207334. "orrs r3, r5\n\t"
  207335. #else
  207336. "orr r3, r5\n\t"
  207337. #endif
  207338. "ldr r2, [%[a], #120]\n\t"
  207339. "str r3, [%[r], #112]\n\t"
  207340. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207341. "lsls r5, r2, #31\n\t"
  207342. #else
  207343. "lsl r5, r2, #31\n\t"
  207344. #endif
  207345. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207346. "lsrs r2, r2, #1\n\t"
  207347. #else
  207348. "lsr r2, r2, #1\n\t"
  207349. #endif
  207350. #ifdef WOLFSSL_KEIL
  207351. "orrs r4, r4, r5\n\t"
  207352. #elif defined(__clang__)
  207353. "orrs r4, r5\n\t"
  207354. #else
  207355. "orr r4, r5\n\t"
  207356. #endif
  207357. "ldr r3, [%[a], #124]\n\t"
  207358. "str r4, [%[r], #116]\n\t"
  207359. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207360. "lsls r5, r3, #31\n\t"
  207361. #else
  207362. "lsl r5, r3, #31\n\t"
  207363. #endif
  207364. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207365. "lsrs r3, r3, #1\n\t"
  207366. #else
  207367. "lsr r3, r3, #1\n\t"
  207368. #endif
  207369. #ifdef WOLFSSL_KEIL
  207370. "orrs r2, r2, r5\n\t"
  207371. #elif defined(__clang__)
  207372. "orrs r2, r5\n\t"
  207373. #else
  207374. "orr r2, r5\n\t"
  207375. #endif
  207376. "str r2, [%[r], #120]\n\t"
  207377. "str r3, [%[r], #124]\n\t"
  207378. : [r] "+l" (r), [a] "+l" (a)
  207379. :
  207380. : "memory", "r2", "r3", "r4", "r5"
  207381. );
  207382. }
  207383. /* Divide the number by 2 mod the modulus (prime). (r = a / 2 % m)
  207384. *
  207385. * r Result of division by 2.
  207386. * a Number to divide.
  207387. * m Modulus (prime).
  207388. */
  207389. SP_NOINLINE static void sp_1024_div2_32(sp_digit* r, const sp_digit* a,
  207390. const sp_digit* m)
  207391. {
  207392. sp_digit o;
  207393. o = sp_1024_cond_add_32(r, a, m, 0 - (a[0] & 1));
  207394. sp_1024_rshift1_32(r, r);
  207395. r[31] |= o << 31;
  207396. }
  207397. /* Double the Montgomery form projective point p.
  207398. *
  207399. * r Result of doubling point.
  207400. * p Point to double.
  207401. * t Temporary ordinate data.
  207402. */
  207403. #ifdef WOLFSSL_SP_NONBLOCK
  207404. typedef struct sp_1024_proj_point_dbl_32_ctx {
  207405. int state;
  207406. sp_digit* t1;
  207407. sp_digit* t2;
  207408. sp_digit* x;
  207409. sp_digit* y;
  207410. sp_digit* z;
  207411. } sp_1024_proj_point_dbl_32_ctx;
  207412. 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)
  207413. {
  207414. int err = FP_WOULDBLOCK;
  207415. sp_1024_proj_point_dbl_32_ctx* ctx = (sp_1024_proj_point_dbl_32_ctx*)sp_ctx->data;
  207416. typedef char ctx_size_test[sizeof(sp_1024_proj_point_dbl_32_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  207417. (void)sizeof(ctx_size_test);
  207418. switch (ctx->state) {
  207419. case 0:
  207420. ctx->t1 = t;
  207421. ctx->t2 = t + 2*32;
  207422. ctx->x = r->x;
  207423. ctx->y = r->y;
  207424. ctx->z = r->z;
  207425. /* Put infinity into result. */
  207426. if (r != p) {
  207427. r->infinity = p->infinity;
  207428. }
  207429. ctx->state = 1;
  207430. break;
  207431. case 1:
  207432. /* T1 = Z * Z */
  207433. sp_1024_mont_sqr_32(ctx->t1, p->z, p1024_mod, p1024_mp_mod);
  207434. ctx->state = 2;
  207435. break;
  207436. case 2:
  207437. /* Z = Y * Z */
  207438. sp_1024_mont_mul_32(ctx->z, p->y, p->z, p1024_mod, p1024_mp_mod);
  207439. ctx->state = 3;
  207440. break;
  207441. case 3:
  207442. /* Z = 2Z */
  207443. sp_1024_mont_dbl_32(ctx->z, ctx->z, p1024_mod);
  207444. ctx->state = 4;
  207445. break;
  207446. case 4:
  207447. /* T2 = X - T1 */
  207448. sp_1024_mont_sub_32(ctx->t2, p->x, ctx->t1, p1024_mod);
  207449. ctx->state = 5;
  207450. break;
  207451. case 5:
  207452. /* T1 = X + T1 */
  207453. sp_1024_mont_add_32(ctx->t1, p->x, ctx->t1, p1024_mod);
  207454. ctx->state = 6;
  207455. break;
  207456. case 6:
  207457. /* T2 = T1 * T2 */
  207458. sp_1024_mont_mul_32(ctx->t2, ctx->t1, ctx->t2, p1024_mod, p1024_mp_mod);
  207459. ctx->state = 7;
  207460. break;
  207461. case 7:
  207462. /* T1 = 3T2 */
  207463. sp_1024_mont_tpl_32(ctx->t1, ctx->t2, p1024_mod);
  207464. ctx->state = 8;
  207465. break;
  207466. case 8:
  207467. /* Y = 2Y */
  207468. sp_1024_mont_dbl_32(ctx->y, p->y, p1024_mod);
  207469. ctx->state = 9;
  207470. break;
  207471. case 9:
  207472. /* Y = Y * Y */
  207473. sp_1024_mont_sqr_32(ctx->y, ctx->y, p1024_mod, p1024_mp_mod);
  207474. ctx->state = 10;
  207475. break;
  207476. case 10:
  207477. /* T2 = Y * Y */
  207478. sp_1024_mont_sqr_32(ctx->t2, ctx->y, p1024_mod, p1024_mp_mod);
  207479. ctx->state = 11;
  207480. break;
  207481. case 11:
  207482. /* T2 = T2/2 */
  207483. sp_1024_div2_32(ctx->t2, ctx->t2, p1024_mod);
  207484. ctx->state = 12;
  207485. break;
  207486. case 12:
  207487. /* Y = Y * X */
  207488. sp_1024_mont_mul_32(ctx->y, ctx->y, p->x, p1024_mod, p1024_mp_mod);
  207489. ctx->state = 13;
  207490. break;
  207491. case 13:
  207492. /* X = T1 * T1 */
  207493. sp_1024_mont_sqr_32(ctx->x, ctx->t1, p1024_mod, p1024_mp_mod);
  207494. ctx->state = 14;
  207495. break;
  207496. case 14:
  207497. /* X = X - Y */
  207498. sp_1024_mont_sub_32(ctx->x, ctx->x, ctx->y, p1024_mod);
  207499. ctx->state = 15;
  207500. break;
  207501. case 15:
  207502. /* X = X - Y */
  207503. sp_1024_mont_sub_32(ctx->x, ctx->x, ctx->y, p1024_mod);
  207504. ctx->state = 16;
  207505. break;
  207506. case 16:
  207507. /* Y = Y - X */
  207508. sp_1024_mont_sub_lower_32(ctx->y, ctx->y, ctx->x, p1024_mod);
  207509. ctx->state = 17;
  207510. break;
  207511. case 17:
  207512. /* Y = Y * T1 */
  207513. sp_1024_mont_mul_32(ctx->y, ctx->y, ctx->t1, p1024_mod, p1024_mp_mod);
  207514. ctx->state = 18;
  207515. break;
  207516. case 18:
  207517. /* Y = Y - T2 */
  207518. sp_1024_mont_sub_32(ctx->y, ctx->y, ctx->t2, p1024_mod);
  207519. ctx->state = 19;
  207520. /* fall-through */
  207521. case 19:
  207522. err = MP_OKAY;
  207523. break;
  207524. }
  207525. if (err == MP_OKAY && ctx->state != 19) {
  207526. err = FP_WOULDBLOCK;
  207527. }
  207528. return err;
  207529. }
  207530. #endif /* WOLFSSL_SP_NONBLOCK */
  207531. static void sp_1024_proj_point_dbl_32(sp_point_1024* r, const sp_point_1024* p,
  207532. sp_digit* t)
  207533. {
  207534. sp_digit* t1 = t;
  207535. sp_digit* t2 = t + 2*32;
  207536. sp_digit* x;
  207537. sp_digit* y;
  207538. sp_digit* z;
  207539. x = r->x;
  207540. y = r->y;
  207541. z = r->z;
  207542. /* Put infinity into result. */
  207543. if (r != p) {
  207544. r->infinity = p->infinity;
  207545. }
  207546. /* T1 = Z * Z */
  207547. sp_1024_mont_sqr_32(t1, p->z, p1024_mod, p1024_mp_mod);
  207548. /* Z = Y * Z */
  207549. sp_1024_mont_mul_32(z, p->y, p->z, p1024_mod, p1024_mp_mod);
  207550. /* Z = 2Z */
  207551. sp_1024_mont_dbl_32(z, z, p1024_mod);
  207552. /* T2 = X - T1 */
  207553. sp_1024_mont_sub_32(t2, p->x, t1, p1024_mod);
  207554. /* T1 = X + T1 */
  207555. sp_1024_mont_add_32(t1, p->x, t1, p1024_mod);
  207556. /* T2 = T1 * T2 */
  207557. sp_1024_mont_mul_32(t2, t1, t2, p1024_mod, p1024_mp_mod);
  207558. /* T1 = 3T2 */
  207559. sp_1024_mont_tpl_32(t1, t2, p1024_mod);
  207560. /* Y = 2Y */
  207561. sp_1024_mont_dbl_32(y, p->y, p1024_mod);
  207562. /* Y = Y * Y */
  207563. sp_1024_mont_sqr_32(y, y, p1024_mod, p1024_mp_mod);
  207564. /* T2 = Y * Y */
  207565. sp_1024_mont_sqr_32(t2, y, p1024_mod, p1024_mp_mod);
  207566. /* T2 = T2/2 */
  207567. sp_1024_div2_32(t2, t2, p1024_mod);
  207568. /* Y = Y * X */
  207569. sp_1024_mont_mul_32(y, y, p->x, p1024_mod, p1024_mp_mod);
  207570. /* X = T1 * T1 */
  207571. sp_1024_mont_sqr_32(x, t1, p1024_mod, p1024_mp_mod);
  207572. /* X = X - Y */
  207573. sp_1024_mont_sub_32(x, x, y, p1024_mod);
  207574. /* X = X - Y */
  207575. sp_1024_mont_sub_32(x, x, y, p1024_mod);
  207576. /* Y = Y - X */
  207577. sp_1024_mont_sub_lower_32(y, y, x, p1024_mod);
  207578. /* Y = Y * T1 */
  207579. sp_1024_mont_mul_32(y, y, t1, p1024_mod, p1024_mp_mod);
  207580. /* Y = Y - T2 */
  207581. sp_1024_mont_sub_32(y, y, t2, p1024_mod);
  207582. }
  207583. #ifdef WOLFSSL_SP_SMALL
  207584. /* Sub b from a into r. (r = a - b)
  207585. *
  207586. * r A single precision integer.
  207587. * a A single precision integer.
  207588. * b A single precision integer.
  207589. */
  207590. SP_NOINLINE static sp_digit sp_1024_sub_32(sp_digit* r, const sp_digit* a,
  207591. const sp_digit* b)
  207592. {
  207593. __asm__ __volatile__ (
  207594. "movs r6, %[a]\n\t"
  207595. "movs r3, #0\n\t"
  207596. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207597. "adds r6, r6, #0x80\n\t"
  207598. #else
  207599. "add r6, r6, #0x80\n\t"
  207600. #endif
  207601. "\n"
  207602. "L_sp_1024_sub_32_word_%=:\n\t"
  207603. "movs r5, #0\n\t"
  207604. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207605. "subs r5, r5, r3\n\t"
  207606. #else
  207607. "sub r5, r5, r3\n\t"
  207608. #endif
  207609. "ldr r4, [%[a]]\n\t"
  207610. "ldr r5, [%[b]]\n\t"
  207611. #ifdef WOLFSSL_KEIL
  207612. "sbcs r4, r4, r5\n\t"
  207613. #elif defined(__clang__)
  207614. "sbcs r4, r5\n\t"
  207615. #else
  207616. "sbc r4, r5\n\t"
  207617. #endif
  207618. "str r4, [%[r]]\n\t"
  207619. #ifdef WOLFSSL_KEIL
  207620. "sbcs r3, r3, r3\n\t"
  207621. #elif defined(__clang__)
  207622. "sbcs r3, r3\n\t"
  207623. #else
  207624. "sbc r3, r3\n\t"
  207625. #endif
  207626. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207627. "adds %[a], %[a], #4\n\t"
  207628. #else
  207629. "add %[a], %[a], #4\n\t"
  207630. #endif
  207631. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207632. "adds %[b], %[b], #4\n\t"
  207633. #else
  207634. "add %[b], %[b], #4\n\t"
  207635. #endif
  207636. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207637. "adds %[r], %[r], #4\n\t"
  207638. #else
  207639. "add %[r], %[r], #4\n\t"
  207640. #endif
  207641. "cmp %[a], r6\n\t"
  207642. "bne L_sp_1024_sub_32_word_%=\n\t"
  207643. "movs %[r], r3\n\t"
  207644. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  207645. :
  207646. : "memory", "r3", "r4", "r5", "r6"
  207647. );
  207648. return (uint32_t)(size_t)r;
  207649. }
  207650. #else
  207651. /* Sub b from a into r. (r = a - b)
  207652. *
  207653. * r A single precision integer.
  207654. * a A single precision integer.
  207655. * b A single precision integer.
  207656. */
  207657. SP_NOINLINE static sp_digit sp_1024_sub_32(sp_digit* r, const sp_digit* a,
  207658. const sp_digit* b)
  207659. {
  207660. __asm__ __volatile__ (
  207661. "ldm %[b]!, {r5, r6}\n\t"
  207662. "ldm %[a]!, {r3, r4}\n\t"
  207663. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207664. "subs r3, r3, r5\n\t"
  207665. #else
  207666. "sub r3, r3, r5\n\t"
  207667. #endif
  207668. #ifdef WOLFSSL_KEIL
  207669. "sbcs r4, r4, r6\n\t"
  207670. #elif defined(__clang__)
  207671. "sbcs r4, r6\n\t"
  207672. #else
  207673. "sbc r4, r6\n\t"
  207674. #endif
  207675. "stm %[r]!, {r3, r4}\n\t"
  207676. "ldm %[b]!, {r5, r6}\n\t"
  207677. "ldm %[a]!, {r3, r4}\n\t"
  207678. #ifdef WOLFSSL_KEIL
  207679. "sbcs r3, r3, r5\n\t"
  207680. #elif defined(__clang__)
  207681. "sbcs r3, r5\n\t"
  207682. #else
  207683. "sbc r3, r5\n\t"
  207684. #endif
  207685. #ifdef WOLFSSL_KEIL
  207686. "sbcs r4, r4, r6\n\t"
  207687. #elif defined(__clang__)
  207688. "sbcs r4, r6\n\t"
  207689. #else
  207690. "sbc r4, r6\n\t"
  207691. #endif
  207692. "stm %[r]!, {r3, r4}\n\t"
  207693. "ldm %[b]!, {r5, r6}\n\t"
  207694. "ldm %[a]!, {r3, r4}\n\t"
  207695. #ifdef WOLFSSL_KEIL
  207696. "sbcs r3, r3, r5\n\t"
  207697. #elif defined(__clang__)
  207698. "sbcs r3, r5\n\t"
  207699. #else
  207700. "sbc r3, r5\n\t"
  207701. #endif
  207702. #ifdef WOLFSSL_KEIL
  207703. "sbcs r4, r4, r6\n\t"
  207704. #elif defined(__clang__)
  207705. "sbcs r4, r6\n\t"
  207706. #else
  207707. "sbc r4, r6\n\t"
  207708. #endif
  207709. "stm %[r]!, {r3, r4}\n\t"
  207710. "ldm %[b]!, {r5, r6}\n\t"
  207711. "ldm %[a]!, {r3, r4}\n\t"
  207712. #ifdef WOLFSSL_KEIL
  207713. "sbcs r3, r3, r5\n\t"
  207714. #elif defined(__clang__)
  207715. "sbcs r3, r5\n\t"
  207716. #else
  207717. "sbc r3, r5\n\t"
  207718. #endif
  207719. #ifdef WOLFSSL_KEIL
  207720. "sbcs r4, r4, r6\n\t"
  207721. #elif defined(__clang__)
  207722. "sbcs r4, r6\n\t"
  207723. #else
  207724. "sbc r4, r6\n\t"
  207725. #endif
  207726. "stm %[r]!, {r3, r4}\n\t"
  207727. "ldm %[b]!, {r5, r6}\n\t"
  207728. "ldm %[a]!, {r3, r4}\n\t"
  207729. #ifdef WOLFSSL_KEIL
  207730. "sbcs r3, r3, r5\n\t"
  207731. #elif defined(__clang__)
  207732. "sbcs r3, r5\n\t"
  207733. #else
  207734. "sbc r3, r5\n\t"
  207735. #endif
  207736. #ifdef WOLFSSL_KEIL
  207737. "sbcs r4, r4, r6\n\t"
  207738. #elif defined(__clang__)
  207739. "sbcs r4, r6\n\t"
  207740. #else
  207741. "sbc r4, r6\n\t"
  207742. #endif
  207743. "stm %[r]!, {r3, r4}\n\t"
  207744. "ldm %[b]!, {r5, r6}\n\t"
  207745. "ldm %[a]!, {r3, r4}\n\t"
  207746. #ifdef WOLFSSL_KEIL
  207747. "sbcs r3, r3, r5\n\t"
  207748. #elif defined(__clang__)
  207749. "sbcs r3, r5\n\t"
  207750. #else
  207751. "sbc r3, r5\n\t"
  207752. #endif
  207753. #ifdef WOLFSSL_KEIL
  207754. "sbcs r4, r4, r6\n\t"
  207755. #elif defined(__clang__)
  207756. "sbcs r4, r6\n\t"
  207757. #else
  207758. "sbc r4, r6\n\t"
  207759. #endif
  207760. "stm %[r]!, {r3, r4}\n\t"
  207761. "ldm %[b]!, {r5, r6}\n\t"
  207762. "ldm %[a]!, {r3, r4}\n\t"
  207763. #ifdef WOLFSSL_KEIL
  207764. "sbcs r3, r3, r5\n\t"
  207765. #elif defined(__clang__)
  207766. "sbcs r3, r5\n\t"
  207767. #else
  207768. "sbc r3, r5\n\t"
  207769. #endif
  207770. #ifdef WOLFSSL_KEIL
  207771. "sbcs r4, r4, r6\n\t"
  207772. #elif defined(__clang__)
  207773. "sbcs r4, r6\n\t"
  207774. #else
  207775. "sbc r4, r6\n\t"
  207776. #endif
  207777. "stm %[r]!, {r3, r4}\n\t"
  207778. "ldm %[b]!, {r5, r6}\n\t"
  207779. "ldm %[a]!, {r3, r4}\n\t"
  207780. #ifdef WOLFSSL_KEIL
  207781. "sbcs r3, r3, r5\n\t"
  207782. #elif defined(__clang__)
  207783. "sbcs r3, r5\n\t"
  207784. #else
  207785. "sbc r3, r5\n\t"
  207786. #endif
  207787. #ifdef WOLFSSL_KEIL
  207788. "sbcs r4, r4, r6\n\t"
  207789. #elif defined(__clang__)
  207790. "sbcs r4, r6\n\t"
  207791. #else
  207792. "sbc r4, r6\n\t"
  207793. #endif
  207794. "stm %[r]!, {r3, r4}\n\t"
  207795. "ldm %[b]!, {r5, r6}\n\t"
  207796. "ldm %[a]!, {r3, r4}\n\t"
  207797. #ifdef WOLFSSL_KEIL
  207798. "sbcs r3, r3, r5\n\t"
  207799. #elif defined(__clang__)
  207800. "sbcs r3, r5\n\t"
  207801. #else
  207802. "sbc r3, r5\n\t"
  207803. #endif
  207804. #ifdef WOLFSSL_KEIL
  207805. "sbcs r4, r4, r6\n\t"
  207806. #elif defined(__clang__)
  207807. "sbcs r4, r6\n\t"
  207808. #else
  207809. "sbc r4, r6\n\t"
  207810. #endif
  207811. "stm %[r]!, {r3, r4}\n\t"
  207812. "ldm %[b]!, {r5, r6}\n\t"
  207813. "ldm %[a]!, {r3, r4}\n\t"
  207814. #ifdef WOLFSSL_KEIL
  207815. "sbcs r3, r3, r5\n\t"
  207816. #elif defined(__clang__)
  207817. "sbcs r3, r5\n\t"
  207818. #else
  207819. "sbc r3, r5\n\t"
  207820. #endif
  207821. #ifdef WOLFSSL_KEIL
  207822. "sbcs r4, r4, r6\n\t"
  207823. #elif defined(__clang__)
  207824. "sbcs r4, r6\n\t"
  207825. #else
  207826. "sbc r4, r6\n\t"
  207827. #endif
  207828. "stm %[r]!, {r3, r4}\n\t"
  207829. "ldm %[b]!, {r5, r6}\n\t"
  207830. "ldm %[a]!, {r3, r4}\n\t"
  207831. #ifdef WOLFSSL_KEIL
  207832. "sbcs r3, r3, r5\n\t"
  207833. #elif defined(__clang__)
  207834. "sbcs r3, r5\n\t"
  207835. #else
  207836. "sbc r3, r5\n\t"
  207837. #endif
  207838. #ifdef WOLFSSL_KEIL
  207839. "sbcs r4, r4, r6\n\t"
  207840. #elif defined(__clang__)
  207841. "sbcs r4, r6\n\t"
  207842. #else
  207843. "sbc r4, r6\n\t"
  207844. #endif
  207845. "stm %[r]!, {r3, r4}\n\t"
  207846. "ldm %[b]!, {r5, r6}\n\t"
  207847. "ldm %[a]!, {r3, r4}\n\t"
  207848. #ifdef WOLFSSL_KEIL
  207849. "sbcs r3, r3, r5\n\t"
  207850. #elif defined(__clang__)
  207851. "sbcs r3, r5\n\t"
  207852. #else
  207853. "sbc r3, r5\n\t"
  207854. #endif
  207855. #ifdef WOLFSSL_KEIL
  207856. "sbcs r4, r4, r6\n\t"
  207857. #elif defined(__clang__)
  207858. "sbcs r4, r6\n\t"
  207859. #else
  207860. "sbc r4, r6\n\t"
  207861. #endif
  207862. "stm %[r]!, {r3, r4}\n\t"
  207863. "ldm %[b]!, {r5, r6}\n\t"
  207864. "ldm %[a]!, {r3, r4}\n\t"
  207865. #ifdef WOLFSSL_KEIL
  207866. "sbcs r3, r3, r5\n\t"
  207867. #elif defined(__clang__)
  207868. "sbcs r3, r5\n\t"
  207869. #else
  207870. "sbc r3, r5\n\t"
  207871. #endif
  207872. #ifdef WOLFSSL_KEIL
  207873. "sbcs r4, r4, r6\n\t"
  207874. #elif defined(__clang__)
  207875. "sbcs r4, r6\n\t"
  207876. #else
  207877. "sbc r4, r6\n\t"
  207878. #endif
  207879. "stm %[r]!, {r3, r4}\n\t"
  207880. "ldm %[b]!, {r5, r6}\n\t"
  207881. "ldm %[a]!, {r3, r4}\n\t"
  207882. #ifdef WOLFSSL_KEIL
  207883. "sbcs r3, r3, r5\n\t"
  207884. #elif defined(__clang__)
  207885. "sbcs r3, r5\n\t"
  207886. #else
  207887. "sbc r3, r5\n\t"
  207888. #endif
  207889. #ifdef WOLFSSL_KEIL
  207890. "sbcs r4, r4, r6\n\t"
  207891. #elif defined(__clang__)
  207892. "sbcs r4, r6\n\t"
  207893. #else
  207894. "sbc r4, r6\n\t"
  207895. #endif
  207896. "stm %[r]!, {r3, r4}\n\t"
  207897. "ldm %[b]!, {r5, r6}\n\t"
  207898. "ldm %[a]!, {r3, r4}\n\t"
  207899. #ifdef WOLFSSL_KEIL
  207900. "sbcs r3, r3, r5\n\t"
  207901. #elif defined(__clang__)
  207902. "sbcs r3, r5\n\t"
  207903. #else
  207904. "sbc r3, r5\n\t"
  207905. #endif
  207906. #ifdef WOLFSSL_KEIL
  207907. "sbcs r4, r4, r6\n\t"
  207908. #elif defined(__clang__)
  207909. "sbcs r4, r6\n\t"
  207910. #else
  207911. "sbc r4, r6\n\t"
  207912. #endif
  207913. "stm %[r]!, {r3, r4}\n\t"
  207914. "ldm %[b]!, {r5, r6}\n\t"
  207915. "ldm %[a]!, {r3, r4}\n\t"
  207916. #ifdef WOLFSSL_KEIL
  207917. "sbcs r3, r3, r5\n\t"
  207918. #elif defined(__clang__)
  207919. "sbcs r3, r5\n\t"
  207920. #else
  207921. "sbc r3, r5\n\t"
  207922. #endif
  207923. #ifdef WOLFSSL_KEIL
  207924. "sbcs r4, r4, r6\n\t"
  207925. #elif defined(__clang__)
  207926. "sbcs r4, r6\n\t"
  207927. #else
  207928. "sbc r4, r6\n\t"
  207929. #endif
  207930. "stm %[r]!, {r3, r4}\n\t"
  207931. #ifdef WOLFSSL_KEIL
  207932. "sbcs %[r], %[r], %[r]\n\t"
  207933. #elif defined(__clang__)
  207934. "sbcs %[r], %[r]\n\t"
  207935. #else
  207936. "sbc %[r], %[r]\n\t"
  207937. #endif
  207938. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  207939. :
  207940. : "memory", "r3", "r4", "r5", "r6"
  207941. );
  207942. return (uint32_t)(size_t)r;
  207943. }
  207944. #endif /* WOLFSSL_SP_SMALL */
  207945. /* Compare two numbers to determine if they are equal.
  207946. * Constant time implementation.
  207947. *
  207948. * a First number to compare.
  207949. * b Second number to compare.
  207950. * returns 1 when equal and 0 otherwise.
  207951. */
  207952. static int sp_1024_cmp_equal_32(const sp_digit* a, const sp_digit* b)
  207953. {
  207954. return ((a[0] ^ b[0]) | (a[1] ^ b[1]) | (a[2] ^ b[2]) |
  207955. (a[3] ^ b[3]) | (a[4] ^ b[4]) | (a[5] ^ b[5]) |
  207956. (a[6] ^ b[6]) | (a[7] ^ b[7]) | (a[8] ^ b[8]) |
  207957. (a[9] ^ b[9]) | (a[10] ^ b[10]) | (a[11] ^ b[11]) |
  207958. (a[12] ^ b[12]) | (a[13] ^ b[13]) | (a[14] ^ b[14]) |
  207959. (a[15] ^ b[15]) | (a[16] ^ b[16]) | (a[17] ^ b[17]) |
  207960. (a[18] ^ b[18]) | (a[19] ^ b[19]) | (a[20] ^ b[20]) |
  207961. (a[21] ^ b[21]) | (a[22] ^ b[22]) | (a[23] ^ b[23]) |
  207962. (a[24] ^ b[24]) | (a[25] ^ b[25]) | (a[26] ^ b[26]) |
  207963. (a[27] ^ b[27]) | (a[28] ^ b[28]) | (a[29] ^ b[29]) |
  207964. (a[30] ^ b[30]) | (a[31] ^ b[31])) == 0;
  207965. }
  207966. /* Returns 1 if the number of zero.
  207967. * Implementation is constant time.
  207968. *
  207969. * a Number to check.
  207970. * returns 1 if the number is zero and 0 otherwise.
  207971. */
  207972. static int sp_1024_iszero_32(const sp_digit* a)
  207973. {
  207974. return (a[0] | a[1] | a[2] | a[3] | a[4] | a[5] | a[6] | a[7] |
  207975. a[8] | a[9] | a[10] | a[11] | a[12] | a[13] | a[14] | a[15] |
  207976. a[16] | a[17] | a[18] | a[19] | a[20] | a[21] | a[22] | a[23] |
  207977. a[24] | a[25] | a[26] | a[27] | a[28] | a[29] | a[30] | a[31]) == 0;
  207978. }
  207979. /* Add two Montgomery form projective points.
  207980. *
  207981. * r Result of addition.
  207982. * p First point to add.
  207983. * q Second point to add.
  207984. * t Temporary ordinate data.
  207985. */
  207986. #ifdef WOLFSSL_SP_NONBLOCK
  207987. typedef struct sp_1024_proj_point_add_32_ctx {
  207988. int state;
  207989. sp_1024_proj_point_dbl_32_ctx dbl_ctx;
  207990. const sp_point_1024* ap[2];
  207991. sp_point_1024* rp[2];
  207992. sp_digit* t1;
  207993. sp_digit* t2;
  207994. sp_digit* t3;
  207995. sp_digit* t4;
  207996. sp_digit* t5;
  207997. sp_digit* t6;
  207998. sp_digit* x;
  207999. sp_digit* y;
  208000. sp_digit* z;
  208001. } sp_1024_proj_point_add_32_ctx;
  208002. static int sp_1024_proj_point_add_32_nb(sp_ecc_ctx_t* sp_ctx, sp_point_1024* r,
  208003. const sp_point_1024* p, const sp_point_1024* q, sp_digit* t)
  208004. {
  208005. int err = FP_WOULDBLOCK;
  208006. sp_1024_proj_point_add_32_ctx* ctx = (sp_1024_proj_point_add_32_ctx*)sp_ctx->data;
  208007. /* Ensure only the first point is the same as the result. */
  208008. if (q == r) {
  208009. const sp_point_1024* a = p;
  208010. p = q;
  208011. q = a;
  208012. }
  208013. typedef char ctx_size_test[sizeof(sp_1024_proj_point_add_32_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  208014. (void)sizeof(ctx_size_test);
  208015. switch (ctx->state) {
  208016. case 0: /* INIT */
  208017. ctx->t1 = t;
  208018. ctx->t2 = t + 2*32;
  208019. ctx->t3 = t + 4*32;
  208020. ctx->t4 = t + 6*32;
  208021. ctx->t5 = t + 8*32;
  208022. ctx->t6 = t + 10*32;
  208023. ctx->x = ctx->t6;
  208024. ctx->y = ctx->t1;
  208025. ctx->z = ctx->t2;
  208026. ctx->state = 1;
  208027. break;
  208028. case 1:
  208029. /* Check double */
  208030. (void)sp_1024_sub_32(ctx->t1, p1024_mod, q->y);
  208031. sp_1024_norm_32(ctx->t1);
  208032. if ((~p->infinity & ~q->infinity &
  208033. sp_1024_cmp_equal_32(p->x, q->x) & sp_1024_cmp_equal_32(p->z, q->z) &
  208034. (sp_1024_cmp_equal_32(p->y, q->y) | sp_1024_cmp_equal_32(p->y, ctx->t1))) != 0)
  208035. {
  208036. XMEMSET(&ctx->dbl_ctx, 0, sizeof(ctx->dbl_ctx));
  208037. ctx->state = 2;
  208038. }
  208039. else {
  208040. ctx->state = 3;
  208041. }
  208042. break;
  208043. case 2:
  208044. err = sp_1024_proj_point_dbl_32_nb((sp_ecc_ctx_t*)&ctx->dbl_ctx, r, p, t);
  208045. if (err == MP_OKAY)
  208046. ctx->state = 27; /* done */
  208047. break;
  208048. case 3:
  208049. {
  208050. ctx->state = 4;
  208051. break;
  208052. }
  208053. case 4:
  208054. /* U1 = X1*Z2^2 */
  208055. sp_1024_mont_sqr_32(ctx->t1, q->z, p1024_mod, p1024_mp_mod);
  208056. ctx->state = 5;
  208057. break;
  208058. case 5:
  208059. sp_1024_mont_mul_32(ctx->t3, ctx->t1, q->z, p1024_mod, p1024_mp_mod);
  208060. ctx->state = 6;
  208061. break;
  208062. case 6:
  208063. sp_1024_mont_mul_32(ctx->t1, ctx->t1, p->x, p1024_mod, p1024_mp_mod);
  208064. ctx->state = 7;
  208065. break;
  208066. case 7:
  208067. /* U2 = X2*Z1^2 */
  208068. sp_1024_mont_sqr_32(ctx->t2, p->z, p1024_mod, p1024_mp_mod);
  208069. ctx->state = 8;
  208070. break;
  208071. case 8:
  208072. sp_1024_mont_mul_32(ctx->t4, ctx->t2, p->z, p1024_mod, p1024_mp_mod);
  208073. ctx->state = 9;
  208074. break;
  208075. case 9:
  208076. sp_1024_mont_mul_32(ctx->t2, ctx->t2, q->x, p1024_mod, p1024_mp_mod);
  208077. ctx->state = 10;
  208078. break;
  208079. case 10:
  208080. /* S1 = Y1*Z2^3 */
  208081. sp_1024_mont_mul_32(ctx->t3, ctx->t3, p->y, p1024_mod, p1024_mp_mod);
  208082. ctx->state = 11;
  208083. break;
  208084. case 11:
  208085. /* S2 = Y2*Z1^3 */
  208086. sp_1024_mont_mul_32(ctx->t4, ctx->t4, q->y, p1024_mod, p1024_mp_mod);
  208087. ctx->state = 12;
  208088. break;
  208089. case 12:
  208090. /* H = U2 - U1 */
  208091. sp_1024_mont_sub_32(ctx->t2, ctx->t2, ctx->t1, p1024_mod);
  208092. ctx->state = 13;
  208093. break;
  208094. case 13:
  208095. /* R = S2 - S1 */
  208096. sp_1024_mont_sub_32(ctx->t4, ctx->t4, ctx->t3, p1024_mod);
  208097. ctx->state = 14;
  208098. break;
  208099. case 14:
  208100. /* X3 = R^2 - H^3 - 2*U1*H^2 */
  208101. sp_1024_mont_sqr_32(ctx->t5, ctx->t2, p1024_mod, p1024_mp_mod);
  208102. ctx->state = 15;
  208103. break;
  208104. case 15:
  208105. sp_1024_mont_mul_32(ctx->y, ctx->t1, ctx->t5, p1024_mod, p1024_mp_mod);
  208106. ctx->state = 16;
  208107. break;
  208108. case 16:
  208109. sp_1024_mont_mul_32(ctx->t5, ctx->t5, ctx->t2, p1024_mod, p1024_mp_mod);
  208110. ctx->state = 17;
  208111. break;
  208112. case 17:
  208113. /* Z3 = H*Z1*Z2 */
  208114. sp_1024_mont_mul_32(ctx->z, p->z, ctx->t2, p1024_mod, p1024_mp_mod);
  208115. ctx->state = 18;
  208116. break;
  208117. case 18:
  208118. sp_1024_mont_mul_32(ctx->z, ctx->z, q->z, p1024_mod, p1024_mp_mod);
  208119. ctx->state = 19;
  208120. break;
  208121. case 19:
  208122. sp_1024_mont_sqr_32(ctx->x, ctx->t4, p1024_mod, p1024_mp_mod);
  208123. ctx->state = 20;
  208124. break;
  208125. case 20:
  208126. sp_1024_mont_sub_32(ctx->x, ctx->x, ctx->t5, p1024_mod);
  208127. ctx->state = 21;
  208128. break;
  208129. case 21:
  208130. sp_1024_mont_mul_32(ctx->t5, ctx->t5, ctx->t3, p1024_mod, p1024_mp_mod);
  208131. ctx->state = 22;
  208132. break;
  208133. case 22:
  208134. sp_1024_mont_dbl_32(ctx->t3, ctx->y, p1024_mod);
  208135. ctx->state = 23;
  208136. break;
  208137. case 23:
  208138. sp_1024_mont_sub_32(ctx->x, ctx->x, ctx->t3, p1024_mod);
  208139. ctx->state = 24;
  208140. break;
  208141. case 24:
  208142. /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
  208143. sp_1024_mont_sub_lower_32(ctx->y, ctx->y, ctx->x, p1024_mod);
  208144. ctx->state = 25;
  208145. break;
  208146. case 25:
  208147. sp_1024_mont_mul_32(ctx->y, ctx->y, ctx->t4, p1024_mod, p1024_mp_mod);
  208148. ctx->state = 26;
  208149. break;
  208150. case 26:
  208151. sp_1024_mont_sub_32(ctx->y, ctx->y, ctx->t5, p1024_mod);
  208152. ctx->state = 27;
  208153. /* fall-through */
  208154. case 27:
  208155. {
  208156. int i;
  208157. sp_digit maskp = 0 - (q->infinity & (!p->infinity));
  208158. sp_digit maskq = 0 - (p->infinity & (!q->infinity));
  208159. sp_digit maskt = ~(maskp | maskq);
  208160. for (i = 0; i < 32; i++) {
  208161. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) |
  208162. (ctx->x[i] & maskt);
  208163. }
  208164. for (i = 0; i < 32; i++) {
  208165. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) |
  208166. (ctx->y[i] & maskt);
  208167. }
  208168. for (i = 0; i < 32; i++) {
  208169. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) |
  208170. (ctx->z[i] & maskt);
  208171. }
  208172. r->z[0] |= p->infinity & q->infinity;
  208173. r->infinity = p->infinity & q->infinity;
  208174. err = MP_OKAY;
  208175. break;
  208176. }
  208177. }
  208178. if (err == MP_OKAY && ctx->state != 27) {
  208179. err = FP_WOULDBLOCK;
  208180. }
  208181. return err;
  208182. }
  208183. #endif /* WOLFSSL_SP_NONBLOCK */
  208184. static void sp_1024_proj_point_add_32(sp_point_1024* r,
  208185. const sp_point_1024* p, const sp_point_1024* q, sp_digit* t)
  208186. {
  208187. sp_digit* t1 = t;
  208188. sp_digit* t2 = t + 2*32;
  208189. sp_digit* t3 = t + 4*32;
  208190. sp_digit* t4 = t + 6*32;
  208191. sp_digit* t5 = t + 8*32;
  208192. sp_digit* t6 = t + 10*32;
  208193. /* Check double */
  208194. (void)sp_1024_mont_sub_32(t1, p1024_mod, q->y, p1024_mod);
  208195. sp_1024_norm_32(t1);
  208196. if ((~p->infinity & ~q->infinity &
  208197. sp_1024_cmp_equal_32(p->x, q->x) & sp_1024_cmp_equal_32(p->z, q->z) &
  208198. (sp_1024_cmp_equal_32(p->y, q->y) | sp_1024_cmp_equal_32(p->y, t1))) != 0) {
  208199. sp_1024_proj_point_dbl_32(r, p, t);
  208200. }
  208201. else {
  208202. sp_digit maskp;
  208203. sp_digit maskq;
  208204. sp_digit maskt;
  208205. sp_digit* x = t6;
  208206. sp_digit* y = t1;
  208207. sp_digit* z = t2;
  208208. int i;
  208209. maskp = 0 - (q->infinity & (!p->infinity));
  208210. maskq = 0 - (p->infinity & (!q->infinity));
  208211. maskt = ~(maskp | maskq);
  208212. /* U1 = X1*Z2^2 */
  208213. sp_1024_mont_sqr_32(t1, q->z, p1024_mod, p1024_mp_mod);
  208214. sp_1024_mont_mul_32(t3, t1, q->z, p1024_mod, p1024_mp_mod);
  208215. sp_1024_mont_mul_32(t1, t1, p->x, p1024_mod, p1024_mp_mod);
  208216. /* U2 = X2*Z1^2 */
  208217. sp_1024_mont_sqr_32(t2, p->z, p1024_mod, p1024_mp_mod);
  208218. sp_1024_mont_mul_32(t4, t2, p->z, p1024_mod, p1024_mp_mod);
  208219. sp_1024_mont_mul_32(t2, t2, q->x, p1024_mod, p1024_mp_mod);
  208220. /* S1 = Y1*Z2^3 */
  208221. sp_1024_mont_mul_32(t3, t3, p->y, p1024_mod, p1024_mp_mod);
  208222. /* S2 = Y2*Z1^3 */
  208223. sp_1024_mont_mul_32(t4, t4, q->y, p1024_mod, p1024_mp_mod);
  208224. /* H = U2 - U1 */
  208225. sp_1024_mont_sub_32(t2, t2, t1, p1024_mod);
  208226. /* R = S2 - S1 */
  208227. sp_1024_mont_sub_32(t4, t4, t3, p1024_mod);
  208228. if (~p->infinity & ~q->infinity &
  208229. sp_1024_iszero_32(t2) & sp_1024_iszero_32(t4) & maskt) {
  208230. sp_1024_proj_point_dbl_32(r, p, t);
  208231. }
  208232. else {
  208233. /* X3 = R^2 - H^3 - 2*U1*H^2 */
  208234. sp_1024_mont_sqr_32(t5, t2, p1024_mod, p1024_mp_mod);
  208235. sp_1024_mont_mul_32(y, t1, t5, p1024_mod, p1024_mp_mod);
  208236. sp_1024_mont_mul_32(t5, t5, t2, p1024_mod, p1024_mp_mod);
  208237. /* Z3 = H*Z1*Z2 */
  208238. sp_1024_mont_mul_32(z, p->z, t2, p1024_mod, p1024_mp_mod);
  208239. sp_1024_mont_mul_32(z, z, q->z, p1024_mod, p1024_mp_mod);
  208240. sp_1024_mont_sqr_32(x, t4, p1024_mod, p1024_mp_mod);
  208241. sp_1024_mont_sub_32(x, x, t5, p1024_mod);
  208242. sp_1024_mont_mul_32(t5, t5, t3, p1024_mod, p1024_mp_mod);
  208243. sp_1024_mont_dbl_32(t3, y, p1024_mod);
  208244. sp_1024_mont_sub_32(x, x, t3, p1024_mod);
  208245. /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
  208246. sp_1024_mont_sub_lower_32(y, y, x, p1024_mod);
  208247. sp_1024_mont_mul_32(y, y, t4, p1024_mod, p1024_mp_mod);
  208248. sp_1024_mont_sub_32(y, y, t5, p1024_mod);
  208249. for (i = 0; i < 32; i++) {
  208250. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) |
  208251. (x[i] & maskt);
  208252. }
  208253. for (i = 0; i < 32; i++) {
  208254. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) |
  208255. (y[i] & maskt);
  208256. }
  208257. for (i = 0; i < 32; i++) {
  208258. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) |
  208259. (z[i] & maskt);
  208260. }
  208261. r->z[0] |= p->infinity & q->infinity;
  208262. r->infinity = p->infinity & q->infinity;
  208263. }
  208264. }
  208265. }
  208266. /* Multiply the point by the scalar and return the result.
  208267. * If map is true then convert result to affine coordinates.
  208268. *
  208269. * Fast implementation that generates a pre-computation table.
  208270. * 4 bits of window (no sliding!).
  208271. * Uses add and double for calculating table.
  208272. * 1024 doubles.
  208273. * 268 adds.
  208274. *
  208275. * r Resulting point.
  208276. * g Point to multiply.
  208277. * k Scalar to multiply by.
  208278. * map Indicates whether to convert result to affine.
  208279. * ct Constant time required.
  208280. * heap Heap to use for allocation.
  208281. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  208282. */
  208283. static int sp_1024_ecc_mulmod_fast_32(sp_point_1024* r, const sp_point_1024* g, const sp_digit* k,
  208284. int map, int ct, void* heap)
  208285. {
  208286. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  208287. sp_point_1024* t = NULL;
  208288. sp_digit* tmp = NULL;
  208289. #else
  208290. sp_point_1024 t[16 + 1];
  208291. sp_digit tmp[2 * 32 * 6];
  208292. #endif
  208293. sp_point_1024* rt = NULL;
  208294. sp_digit n;
  208295. int i;
  208296. int c;
  208297. int y;
  208298. int err = MP_OKAY;
  208299. /* Constant time used for cache attack resistance implementation. */
  208300. (void)ct;
  208301. (void)heap;
  208302. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  208303. t = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * (16 + 1),
  208304. heap, DYNAMIC_TYPE_ECC);
  208305. if (t == NULL)
  208306. err = MEMORY_E;
  208307. if (err == MP_OKAY) {
  208308. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 32 * 6, heap,
  208309. DYNAMIC_TYPE_ECC);
  208310. if (tmp == NULL)
  208311. err = MEMORY_E;
  208312. }
  208313. #endif
  208314. if (err == MP_OKAY) {
  208315. rt = t + 16;
  208316. /* t[0] = {0, 0, 1} * norm */
  208317. XMEMSET(&t[0], 0, sizeof(t[0]));
  208318. t[0].infinity = 1;
  208319. /* t[1] = {g->x, g->y, g->z} * norm */
  208320. (void)sp_1024_mod_mul_norm_32(t[1].x, g->x, p1024_mod);
  208321. (void)sp_1024_mod_mul_norm_32(t[1].y, g->y, p1024_mod);
  208322. (void)sp_1024_mod_mul_norm_32(t[1].z, g->z, p1024_mod);
  208323. t[1].infinity = 0;
  208324. sp_1024_proj_point_dbl_32(&t[ 2], &t[ 1], tmp);
  208325. t[ 2].infinity = 0;
  208326. sp_1024_proj_point_add_32(&t[ 3], &t[ 2], &t[ 1], tmp);
  208327. t[ 3].infinity = 0;
  208328. sp_1024_proj_point_dbl_32(&t[ 4], &t[ 2], tmp);
  208329. t[ 4].infinity = 0;
  208330. sp_1024_proj_point_add_32(&t[ 5], &t[ 3], &t[ 2], tmp);
  208331. t[ 5].infinity = 0;
  208332. sp_1024_proj_point_dbl_32(&t[ 6], &t[ 3], tmp);
  208333. t[ 6].infinity = 0;
  208334. sp_1024_proj_point_add_32(&t[ 7], &t[ 4], &t[ 3], tmp);
  208335. t[ 7].infinity = 0;
  208336. sp_1024_proj_point_dbl_32(&t[ 8], &t[ 4], tmp);
  208337. t[ 8].infinity = 0;
  208338. sp_1024_proj_point_add_32(&t[ 9], &t[ 5], &t[ 4], tmp);
  208339. t[ 9].infinity = 0;
  208340. sp_1024_proj_point_dbl_32(&t[10], &t[ 5], tmp);
  208341. t[10].infinity = 0;
  208342. sp_1024_proj_point_add_32(&t[11], &t[ 6], &t[ 5], tmp);
  208343. t[11].infinity = 0;
  208344. sp_1024_proj_point_dbl_32(&t[12], &t[ 6], tmp);
  208345. t[12].infinity = 0;
  208346. sp_1024_proj_point_add_32(&t[13], &t[ 7], &t[ 6], tmp);
  208347. t[13].infinity = 0;
  208348. sp_1024_proj_point_dbl_32(&t[14], &t[ 7], tmp);
  208349. t[14].infinity = 0;
  208350. sp_1024_proj_point_add_32(&t[15], &t[ 8], &t[ 7], tmp);
  208351. t[15].infinity = 0;
  208352. i = 30;
  208353. n = k[i+1] << 0;
  208354. c = 28;
  208355. y = (int)(n >> 28);
  208356. XMEMCPY(rt, &t[y], sizeof(sp_point_1024));
  208357. n <<= 4;
  208358. for (; i>=0 || c>=4; ) {
  208359. if (c < 4) {
  208360. n |= k[i--];
  208361. c += 32;
  208362. }
  208363. y = (n >> 28) & 0xf;
  208364. n <<= 4;
  208365. c -= 4;
  208366. sp_1024_proj_point_dbl_32(rt, rt, tmp);
  208367. sp_1024_proj_point_dbl_32(rt, rt, tmp);
  208368. sp_1024_proj_point_dbl_32(rt, rt, tmp);
  208369. sp_1024_proj_point_dbl_32(rt, rt, tmp);
  208370. sp_1024_proj_point_add_32(rt, rt, &t[y], tmp);
  208371. }
  208372. if (map != 0) {
  208373. sp_1024_map_32(r, rt, tmp);
  208374. }
  208375. else {
  208376. XMEMCPY(r, rt, sizeof(sp_point_1024));
  208377. }
  208378. }
  208379. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  208380. if (tmp != NULL)
  208381. #endif
  208382. {
  208383. ForceZero(tmp, sizeof(sp_digit) * 2 * 32 * 6);
  208384. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  208385. XFREE(tmp, heap, DYNAMIC_TYPE_ECC);
  208386. #endif
  208387. }
  208388. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  208389. if (t != NULL)
  208390. #endif
  208391. {
  208392. ForceZero(t, sizeof(sp_point_1024) * 17);
  208393. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  208394. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  208395. #endif
  208396. }
  208397. return err;
  208398. }
  208399. #if defined(FP_ECC) || !defined(WOLFSSL_SP_SMALL)
  208400. #define sp_1024_mont_dbl_lower_32 sp_1024_mont_dbl_32
  208401. #define sp_1024_mont_tpl_lower_32 sp_1024_mont_tpl_32
  208402. /* Double the Montgomery form projective point p a number of times.
  208403. *
  208404. * r Result of repeated doubling of point.
  208405. * p Point to double.
  208406. * n Number of times to double
  208407. * t Temporary ordinate data.
  208408. */
  208409. static void sp_1024_proj_point_dbl_n_32(sp_point_1024* p, int i,
  208410. sp_digit* t)
  208411. {
  208412. sp_digit* w = t;
  208413. sp_digit* a = t + 2*32;
  208414. sp_digit* b = t + 4*32;
  208415. sp_digit* t1 = t + 6*32;
  208416. sp_digit* t2 = t + 8*32;
  208417. sp_digit* x;
  208418. sp_digit* y;
  208419. sp_digit* z;
  208420. volatile int n = i;
  208421. x = p->x;
  208422. y = p->y;
  208423. z = p->z;
  208424. /* Y = 2*Y */
  208425. sp_1024_mont_dbl_32(y, y, p1024_mod);
  208426. /* W = Z^4 */
  208427. sp_1024_mont_sqr_32(w, z, p1024_mod, p1024_mp_mod);
  208428. sp_1024_mont_sqr_32(w, w, p1024_mod, p1024_mp_mod);
  208429. #ifndef WOLFSSL_SP_SMALL
  208430. while (--n > 0)
  208431. #else
  208432. while (--n >= 0)
  208433. #endif
  208434. {
  208435. /* A = 3*(X^2 - W) */
  208436. sp_1024_mont_sqr_32(t1, x, p1024_mod, p1024_mp_mod);
  208437. sp_1024_mont_sub_32(t1, t1, w, p1024_mod);
  208438. sp_1024_mont_tpl_lower_32(a, t1, p1024_mod);
  208439. /* B = X*Y^2 */
  208440. sp_1024_mont_sqr_32(t1, y, p1024_mod, p1024_mp_mod);
  208441. sp_1024_mont_mul_32(b, t1, x, p1024_mod, p1024_mp_mod);
  208442. /* X = A^2 - 2B */
  208443. sp_1024_mont_sqr_32(x, a, p1024_mod, p1024_mp_mod);
  208444. sp_1024_mont_dbl_32(t2, b, p1024_mod);
  208445. sp_1024_mont_sub_32(x, x, t2, p1024_mod);
  208446. /* b = 2.(B - X) */
  208447. sp_1024_mont_sub_lower_32(t2, b, x, p1024_mod);
  208448. sp_1024_mont_dbl_lower_32(b, t2, p1024_mod);
  208449. /* Z = Z*Y */
  208450. sp_1024_mont_mul_32(z, z, y, p1024_mod, p1024_mp_mod);
  208451. /* t1 = Y^4 */
  208452. sp_1024_mont_sqr_32(t1, t1, p1024_mod, p1024_mp_mod);
  208453. #ifdef WOLFSSL_SP_SMALL
  208454. if (n != 0)
  208455. #endif
  208456. {
  208457. /* W = W*Y^4 */
  208458. sp_1024_mont_mul_32(w, w, t1, p1024_mod, p1024_mp_mod);
  208459. }
  208460. /* y = 2*A*(B - X) - Y^4 */
  208461. sp_1024_mont_mul_32(y, b, a, p1024_mod, p1024_mp_mod);
  208462. sp_1024_mont_sub_32(y, y, t1, p1024_mod);
  208463. }
  208464. #ifndef WOLFSSL_SP_SMALL
  208465. /* A = 3*(X^2 - W) */
  208466. sp_1024_mont_sqr_32(t1, x, p1024_mod, p1024_mp_mod);
  208467. sp_1024_mont_sub_32(t1, t1, w, p1024_mod);
  208468. sp_1024_mont_tpl_lower_32(a, t1, p1024_mod);
  208469. /* B = X*Y^2 */
  208470. sp_1024_mont_sqr_32(t1, y, p1024_mod, p1024_mp_mod);
  208471. sp_1024_mont_mul_32(b, t1, x, p1024_mod, p1024_mp_mod);
  208472. /* X = A^2 - 2B */
  208473. sp_1024_mont_sqr_32(x, a, p1024_mod, p1024_mp_mod);
  208474. sp_1024_mont_dbl_32(t2, b, p1024_mod);
  208475. sp_1024_mont_sub_32(x, x, t2, p1024_mod);
  208476. /* b = 2.(B - X) */
  208477. sp_1024_mont_sub_lower_32(t2, b, x, p1024_mod);
  208478. sp_1024_mont_dbl_lower_32(b, t2, p1024_mod);
  208479. /* Z = Z*Y */
  208480. sp_1024_mont_mul_32(z, z, y, p1024_mod, p1024_mp_mod);
  208481. /* t1 = Y^4 */
  208482. sp_1024_mont_sqr_32(t1, t1, p1024_mod, p1024_mp_mod);
  208483. /* y = 2*A*(B - X) - Y^4 */
  208484. sp_1024_mont_mul_32(y, b, a, p1024_mod, p1024_mp_mod);
  208485. sp_1024_mont_sub_32(y, y, t1, p1024_mod);
  208486. #endif
  208487. /* Y = Y/2 */
  208488. sp_1024_div2_32(y, y, p1024_mod);
  208489. }
  208490. /* Convert the projective point to affine.
  208491. * Ordinates are in Montgomery form.
  208492. *
  208493. * a Point to convert.
  208494. * t Temporary data.
  208495. */
  208496. static void sp_1024_proj_to_affine_32(sp_point_1024* a, sp_digit* t)
  208497. {
  208498. sp_digit* t1 = t;
  208499. sp_digit* t2 = t + 2 * 32;
  208500. sp_digit* tmp = t + 4 * 32;
  208501. sp_1024_mont_inv_32(t1, a->z, tmp);
  208502. sp_1024_mont_sqr_32(t2, t1, p1024_mod, p1024_mp_mod);
  208503. sp_1024_mont_mul_32(t1, t2, t1, p1024_mod, p1024_mp_mod);
  208504. sp_1024_mont_mul_32(a->x, a->x, t2, p1024_mod, p1024_mp_mod);
  208505. sp_1024_mont_mul_32(a->y, a->y, t1, p1024_mod, p1024_mp_mod);
  208506. XMEMCPY(a->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  208507. }
  208508. #endif /* FP_ECC || !WOLFSSL_SP_SMALL */
  208509. /* A table entry for pre-computed points. */
  208510. typedef struct sp_table_entry_1024 {
  208511. sp_digit x[32];
  208512. sp_digit y[32];
  208513. } sp_table_entry_1024;
  208514. #ifdef FP_ECC
  208515. #endif /* FP_ECC */
  208516. /* Add two Montgomery form projective points. The second point has a q value of
  208517. * one.
  208518. * Only the first point can be the same pointer as the result point.
  208519. *
  208520. * r Result of addition.
  208521. * p First point to add.
  208522. * q Second point to add.
  208523. * t Temporary ordinate data.
  208524. */
  208525. static void sp_1024_proj_point_add_qz1_32(sp_point_1024* r, const sp_point_1024* p,
  208526. const sp_point_1024* q, sp_digit* t)
  208527. {
  208528. sp_digit* t1 = t;
  208529. sp_digit* t2 = t + 2*32;
  208530. sp_digit* t3 = t + 4*32;
  208531. sp_digit* t4 = t + 6*32;
  208532. sp_digit* t5 = t + 8*32;
  208533. sp_digit* t6 = t + 10*32;
  208534. /* Check double */
  208535. (void)sp_1024_mont_sub_32(t1, p1024_mod, q->y, p1024_mod);
  208536. sp_1024_norm_32(t1);
  208537. if ((~p->infinity & ~q->infinity &
  208538. sp_1024_cmp_equal_32(p->x, q->x) & sp_1024_cmp_equal_32(p->z, q->z) &
  208539. (sp_1024_cmp_equal_32(p->y, q->y) | sp_1024_cmp_equal_32(p->y, t1))) != 0) {
  208540. sp_1024_proj_point_dbl_32(r, p, t);
  208541. }
  208542. else {
  208543. sp_digit maskp;
  208544. sp_digit maskq;
  208545. sp_digit maskt;
  208546. sp_digit* x = t2;
  208547. sp_digit* y = t5;
  208548. sp_digit* z = t6;
  208549. int i;
  208550. /* U2 = X2*Z1^2 */
  208551. sp_1024_mont_sqr_32(t2, p->z, p1024_mod, p1024_mp_mod);
  208552. sp_1024_mont_mul_32(t4, t2, p->z, p1024_mod, p1024_mp_mod);
  208553. sp_1024_mont_mul_32(t2, t2, q->x, p1024_mod, p1024_mp_mod);
  208554. /* S2 = Y2*Z1^3 */
  208555. sp_1024_mont_mul_32(t4, t4, q->y, p1024_mod, p1024_mp_mod);
  208556. /* H = U2 - X1 */
  208557. sp_1024_mont_sub_32(t2, t2, p->x, p1024_mod);
  208558. /* R = S2 - Y1 */
  208559. sp_1024_mont_sub_32(t4, t4, p->y, p1024_mod);
  208560. /* Z3 = H*Z1 */
  208561. sp_1024_mont_mul_32(z, p->z, t2, p1024_mod, p1024_mp_mod);
  208562. /* X3 = R^2 - H^3 - 2*X1*H^2 */
  208563. sp_1024_mont_sqr_32(t1, t4, p1024_mod, p1024_mp_mod);
  208564. sp_1024_mont_sqr_32(t5, t2, p1024_mod, p1024_mp_mod);
  208565. sp_1024_mont_mul_32(t3, p->x, t5, p1024_mod, p1024_mp_mod);
  208566. sp_1024_mont_mul_32(t5, t5, t2, p1024_mod, p1024_mp_mod);
  208567. sp_1024_mont_sub_32(x, t1, t5, p1024_mod);
  208568. sp_1024_mont_dbl_32(t1, t3, p1024_mod);
  208569. sp_1024_mont_sub_32(x, x, t1, p1024_mod);
  208570. /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */
  208571. sp_1024_mont_sub_lower_32(t3, t3, x, p1024_mod);
  208572. sp_1024_mont_mul_32(t3, t3, t4, p1024_mod, p1024_mp_mod);
  208573. sp_1024_mont_mul_32(t5, t5, p->y, p1024_mod, p1024_mp_mod);
  208574. sp_1024_mont_sub_32(y, t3, t5, p1024_mod);
  208575. maskp = 0 - (q->infinity & (!p->infinity));
  208576. maskq = 0 - (p->infinity & (!q->infinity));
  208577. maskt = ~(maskp | maskq);
  208578. for (i = 0; i < 32; i++) {
  208579. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt);
  208580. }
  208581. for (i = 0; i < 32; i++) {
  208582. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt);
  208583. }
  208584. for (i = 0; i < 32; i++) {
  208585. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt);
  208586. }
  208587. r->z[0] |= p->infinity & q->infinity;
  208588. r->infinity = p->infinity & q->infinity;
  208589. }
  208590. }
  208591. #ifdef WOLFSSL_SP_SMALL
  208592. #if defined(FP_ECC) || !defined(WOLFSSL_SP_SMALL)
  208593. /* Generate the pre-computed table of points for the base point.
  208594. *
  208595. * width = 4
  208596. * 16 entries
  208597. * 256 bits between
  208598. *
  208599. * a The base point.
  208600. * table Place to store generated point data.
  208601. * tmp Temporary data.
  208602. * heap Heap to use for allocation.
  208603. */
  208604. static int sp_1024_gen_stripe_table_32(const sp_point_1024* a,
  208605. sp_table_entry_1024* table, sp_digit* tmp, void* heap)
  208606. {
  208607. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  208608. sp_point_1024* t = NULL;
  208609. #else
  208610. sp_point_1024 t[3];
  208611. #endif
  208612. sp_point_1024* s1 = NULL;
  208613. sp_point_1024* s2 = NULL;
  208614. int i;
  208615. int j;
  208616. int err = MP_OKAY;
  208617. (void)heap;
  208618. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  208619. t = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * 3, heap,
  208620. DYNAMIC_TYPE_ECC);
  208621. if (t == NULL)
  208622. err = MEMORY_E;
  208623. #endif
  208624. if (err == MP_OKAY) {
  208625. s1 = t + 1;
  208626. s2 = t + 2;
  208627. err = sp_1024_mod_mul_norm_32(t->x, a->x, p1024_mod);
  208628. }
  208629. if (err == MP_OKAY) {
  208630. err = sp_1024_mod_mul_norm_32(t->y, a->y, p1024_mod);
  208631. }
  208632. if (err == MP_OKAY) {
  208633. err = sp_1024_mod_mul_norm_32(t->z, a->z, p1024_mod);
  208634. }
  208635. if (err == MP_OKAY) {
  208636. t->infinity = 0;
  208637. sp_1024_proj_to_affine_32(t, tmp);
  208638. XMEMCPY(s1->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  208639. s1->infinity = 0;
  208640. XMEMCPY(s2->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  208641. s2->infinity = 0;
  208642. /* table[0] = {0, 0, infinity} */
  208643. XMEMSET(&table[0], 0, sizeof(sp_table_entry_1024));
  208644. /* table[1] = Affine version of 'a' in Montgomery form */
  208645. XMEMCPY(table[1].x, t->x, sizeof(table->x));
  208646. XMEMCPY(table[1].y, t->y, sizeof(table->y));
  208647. for (i=1; i<4; i++) {
  208648. sp_1024_proj_point_dbl_n_32(t, 256, tmp);
  208649. sp_1024_proj_to_affine_32(t, tmp);
  208650. XMEMCPY(table[1<<i].x, t->x, sizeof(table->x));
  208651. XMEMCPY(table[1<<i].y, t->y, sizeof(table->y));
  208652. }
  208653. for (i=1; i<4; i++) {
  208654. XMEMCPY(s1->x, table[1<<i].x, sizeof(table->x));
  208655. XMEMCPY(s1->y, table[1<<i].y, sizeof(table->y));
  208656. for (j=(1<<i)+1; j<(1<<(i+1)); j++) {
  208657. XMEMCPY(s2->x, table[j-(1<<i)].x, sizeof(table->x));
  208658. XMEMCPY(s2->y, table[j-(1<<i)].y, sizeof(table->y));
  208659. sp_1024_proj_point_add_qz1_32(t, s1, s2, tmp);
  208660. sp_1024_proj_to_affine_32(t, tmp);
  208661. XMEMCPY(table[j].x, t->x, sizeof(table->x));
  208662. XMEMCPY(table[j].y, t->y, sizeof(table->y));
  208663. }
  208664. }
  208665. }
  208666. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  208667. if (t != NULL)
  208668. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  208669. #endif
  208670. return err;
  208671. }
  208672. #endif /* FP_ECC || !WOLFSSL_SP_SMALL */
  208673. /* Multiply the point by the scalar and return the result.
  208674. * If map is true then convert result to affine coordinates.
  208675. *
  208676. * Stripe implementation.
  208677. * Pre-generated: 2^0, 2^256, ...
  208678. * Pre-generated: products of all combinations of above.
  208679. * 4 doubles and adds (with qz=1)
  208680. *
  208681. * r Resulting point.
  208682. * k Scalar to multiply by.
  208683. * table Pre-computed table.
  208684. * map Indicates whether to convert result to affine.
  208685. * ct Constant time required.
  208686. * heap Heap to use for allocation.
  208687. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  208688. */
  208689. static int sp_1024_ecc_mulmod_stripe_32(sp_point_1024* r, const sp_point_1024* g,
  208690. const sp_table_entry_1024* table, const sp_digit* k, int map,
  208691. int ct, void* heap)
  208692. {
  208693. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  208694. sp_point_1024* rt = NULL;
  208695. sp_digit* t = NULL;
  208696. #else
  208697. sp_point_1024 rt[2];
  208698. sp_digit t[2 * 32 * 6];
  208699. #endif
  208700. sp_point_1024* p = NULL;
  208701. int i;
  208702. int j;
  208703. int y;
  208704. int x;
  208705. int err = MP_OKAY;
  208706. (void)g;
  208707. /* Constant time used for cache attack resistance implementation. */
  208708. (void)ct;
  208709. (void)heap;
  208710. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  208711. rt = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * 2, heap,
  208712. DYNAMIC_TYPE_ECC);
  208713. if (rt == NULL)
  208714. err = MEMORY_E;
  208715. if (err == MP_OKAY) {
  208716. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 32 * 6, heap,
  208717. DYNAMIC_TYPE_ECC);
  208718. if (t == NULL)
  208719. err = MEMORY_E;
  208720. }
  208721. #endif
  208722. if (err == MP_OKAY) {
  208723. p = rt + 1;
  208724. XMEMCPY(p->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  208725. XMEMCPY(rt->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  208726. y = 0;
  208727. x = 255;
  208728. for (j=0; j<4; j++) {
  208729. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  208730. x += 256;
  208731. }
  208732. XMEMCPY(rt->x, table[y].x, sizeof(table[y].x));
  208733. XMEMCPY(rt->y, table[y].y, sizeof(table[y].y));
  208734. rt->infinity = !y;
  208735. for (i=254; i>=0; i--) {
  208736. y = 0;
  208737. x = i;
  208738. for (j=0; j<4; j++) {
  208739. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  208740. x += 256;
  208741. }
  208742. sp_1024_proj_point_dbl_32(rt, rt, t);
  208743. XMEMCPY(p->x, table[y].x, sizeof(table[y].x));
  208744. XMEMCPY(p->y, table[y].y, sizeof(table[y].y));
  208745. p->infinity = !y;
  208746. sp_1024_proj_point_add_qz1_32(rt, rt, p, t);
  208747. }
  208748. if (map != 0) {
  208749. sp_1024_map_32(r, rt, t);
  208750. }
  208751. else {
  208752. XMEMCPY(r, rt, sizeof(sp_point_1024));
  208753. }
  208754. }
  208755. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  208756. if (t != NULL)
  208757. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  208758. if (rt != NULL)
  208759. XFREE(rt, heap, DYNAMIC_TYPE_ECC);
  208760. #endif
  208761. return err;
  208762. }
  208763. #ifdef FP_ECC
  208764. #ifndef FP_ENTRIES
  208765. #define FP_ENTRIES 16
  208766. #endif
  208767. /* Cache entry - holds precomputation tables for a point. */
  208768. typedef struct sp_cache_1024_t {
  208769. /* X ordinate of point that table was generated from. */
  208770. sp_digit x[32];
  208771. /* Y ordinate of point that table was generated from. */
  208772. sp_digit y[32];
  208773. /* Precomputation table for point. */
  208774. sp_table_entry_1024 table[16];
  208775. /* Count of entries in table. */
  208776. uint32_t cnt;
  208777. /* Point and table set in entry. */
  208778. int set;
  208779. } sp_cache_1024_t;
  208780. /* Cache of tables. */
  208781. static THREAD_LS_T sp_cache_1024_t sp_cache_1024[FP_ENTRIES];
  208782. /* Index of last entry in cache. */
  208783. static THREAD_LS_T int sp_cache_1024_last = -1;
  208784. /* Cache has been initialized. */
  208785. static THREAD_LS_T int sp_cache_1024_inited = 0;
  208786. #ifndef HAVE_THREAD_LS
  208787. static volatile int initCacheMutex_1024 = 0;
  208788. static wolfSSL_Mutex sp_cache_1024_lock;
  208789. #endif
  208790. /* Get the cache entry for the point.
  208791. *
  208792. * g [in] Point scalar multipling.
  208793. * cache [out] Cache table to use.
  208794. */
  208795. static void sp_ecc_get_cache_1024(const sp_point_1024* g, sp_cache_1024_t** cache)
  208796. {
  208797. int i;
  208798. int j;
  208799. uint32_t least;
  208800. if (sp_cache_1024_inited == 0) {
  208801. for (i=0; i<FP_ENTRIES; i++) {
  208802. sp_cache_1024[i].set = 0;
  208803. }
  208804. sp_cache_1024_inited = 1;
  208805. }
  208806. /* Compare point with those in cache. */
  208807. for (i=0; i<FP_ENTRIES; i++) {
  208808. if (!sp_cache_1024[i].set)
  208809. continue;
  208810. if (sp_1024_cmp_equal_32(g->x, sp_cache_1024[i].x) &
  208811. sp_1024_cmp_equal_32(g->y, sp_cache_1024[i].y)) {
  208812. sp_cache_1024[i].cnt++;
  208813. break;
  208814. }
  208815. }
  208816. /* No match. */
  208817. if (i == FP_ENTRIES) {
  208818. /* Find empty entry. */
  208819. i = (sp_cache_1024_last + 1) % FP_ENTRIES;
  208820. for (; i != sp_cache_1024_last; i=(i+1)%FP_ENTRIES) {
  208821. if (!sp_cache_1024[i].set) {
  208822. break;
  208823. }
  208824. }
  208825. /* Evict least used. */
  208826. if (i == sp_cache_1024_last) {
  208827. least = sp_cache_1024[0].cnt;
  208828. for (j=1; j<FP_ENTRIES; j++) {
  208829. if (sp_cache_1024[j].cnt < least) {
  208830. i = j;
  208831. least = sp_cache_1024[i].cnt;
  208832. }
  208833. }
  208834. }
  208835. XMEMCPY(sp_cache_1024[i].x, g->x, sizeof(sp_cache_1024[i].x));
  208836. XMEMCPY(sp_cache_1024[i].y, g->y, sizeof(sp_cache_1024[i].y));
  208837. sp_cache_1024[i].set = 1;
  208838. sp_cache_1024[i].cnt = 1;
  208839. }
  208840. *cache = &sp_cache_1024[i];
  208841. sp_cache_1024_last = i;
  208842. }
  208843. #endif /* FP_ECC */
  208844. /* Multiply the base point of P1024 by the scalar and return the result.
  208845. * If map is true then convert result to affine coordinates.
  208846. *
  208847. * r Resulting point.
  208848. * g Point to multiply.
  208849. * k Scalar to multiply by.
  208850. * map Indicates whether to convert result to affine.
  208851. * ct Constant time required.
  208852. * heap Heap to use for allocation.
  208853. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  208854. */
  208855. static int sp_1024_ecc_mulmod_32(sp_point_1024* r, const sp_point_1024* g, const sp_digit* k,
  208856. int map, int ct, void* heap)
  208857. {
  208858. #ifndef FP_ECC
  208859. return sp_1024_ecc_mulmod_fast_32(r, g, k, map, ct, heap);
  208860. #else
  208861. sp_digit tmp[2 * 32 * 6];
  208862. sp_cache_1024_t* cache;
  208863. int err = MP_OKAY;
  208864. #ifndef HAVE_THREAD_LS
  208865. if (initCacheMutex_1024 == 0) {
  208866. wc_InitMutex(&sp_cache_1024_lock);
  208867. initCacheMutex_1024 = 1;
  208868. }
  208869. if (wc_LockMutex(&sp_cache_1024_lock) != 0)
  208870. err = BAD_MUTEX_E;
  208871. #endif /* HAVE_THREAD_LS */
  208872. if (err == MP_OKAY) {
  208873. sp_ecc_get_cache_1024(g, &cache);
  208874. if (cache->cnt == 2)
  208875. sp_1024_gen_stripe_table_32(g, cache->table, tmp, heap);
  208876. #ifndef HAVE_THREAD_LS
  208877. wc_UnLockMutex(&sp_cache_1024_lock);
  208878. #endif /* HAVE_THREAD_LS */
  208879. if (cache->cnt < 2) {
  208880. err = sp_1024_ecc_mulmod_fast_32(r, g, k, map, ct, heap);
  208881. }
  208882. else {
  208883. err = sp_1024_ecc_mulmod_stripe_32(r, g, cache->table, k,
  208884. map, ct, heap);
  208885. }
  208886. }
  208887. return err;
  208888. #endif
  208889. }
  208890. #else
  208891. #if defined(FP_ECC) || !defined(WOLFSSL_SP_SMALL)
  208892. /* Generate the pre-computed table of points for the base point.
  208893. *
  208894. * width = 8
  208895. * 256 entries
  208896. * 128 bits between
  208897. *
  208898. * a The base point.
  208899. * table Place to store generated point data.
  208900. * tmp Temporary data.
  208901. * heap Heap to use for allocation.
  208902. */
  208903. static int sp_1024_gen_stripe_table_32(const sp_point_1024* a,
  208904. sp_table_entry_1024* table, sp_digit* tmp, void* heap)
  208905. {
  208906. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  208907. sp_point_1024* t = NULL;
  208908. #else
  208909. sp_point_1024 t[3];
  208910. #endif
  208911. sp_point_1024* s1 = NULL;
  208912. sp_point_1024* s2 = NULL;
  208913. int i;
  208914. int j;
  208915. int err = MP_OKAY;
  208916. (void)heap;
  208917. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  208918. t = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * 3, heap,
  208919. DYNAMIC_TYPE_ECC);
  208920. if (t == NULL)
  208921. err = MEMORY_E;
  208922. #endif
  208923. if (err == MP_OKAY) {
  208924. s1 = t + 1;
  208925. s2 = t + 2;
  208926. err = sp_1024_mod_mul_norm_32(t->x, a->x, p1024_mod);
  208927. }
  208928. if (err == MP_OKAY) {
  208929. err = sp_1024_mod_mul_norm_32(t->y, a->y, p1024_mod);
  208930. }
  208931. if (err == MP_OKAY) {
  208932. err = sp_1024_mod_mul_norm_32(t->z, a->z, p1024_mod);
  208933. }
  208934. if (err == MP_OKAY) {
  208935. t->infinity = 0;
  208936. sp_1024_proj_to_affine_32(t, tmp);
  208937. XMEMCPY(s1->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  208938. s1->infinity = 0;
  208939. XMEMCPY(s2->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  208940. s2->infinity = 0;
  208941. /* table[0] = {0, 0, infinity} */
  208942. XMEMSET(&table[0], 0, sizeof(sp_table_entry_1024));
  208943. /* table[1] = Affine version of 'a' in Montgomery form */
  208944. XMEMCPY(table[1].x, t->x, sizeof(table->x));
  208945. XMEMCPY(table[1].y, t->y, sizeof(table->y));
  208946. for (i=1; i<8; i++) {
  208947. sp_1024_proj_point_dbl_n_32(t, 128, tmp);
  208948. sp_1024_proj_to_affine_32(t, tmp);
  208949. XMEMCPY(table[1<<i].x, t->x, sizeof(table->x));
  208950. XMEMCPY(table[1<<i].y, t->y, sizeof(table->y));
  208951. }
  208952. for (i=1; i<8; i++) {
  208953. XMEMCPY(s1->x, table[1<<i].x, sizeof(table->x));
  208954. XMEMCPY(s1->y, table[1<<i].y, sizeof(table->y));
  208955. for (j=(1<<i)+1; j<(1<<(i+1)); j++) {
  208956. XMEMCPY(s2->x, table[j-(1<<i)].x, sizeof(table->x));
  208957. XMEMCPY(s2->y, table[j-(1<<i)].y, sizeof(table->y));
  208958. sp_1024_proj_point_add_qz1_32(t, s1, s2, tmp);
  208959. sp_1024_proj_to_affine_32(t, tmp);
  208960. XMEMCPY(table[j].x, t->x, sizeof(table->x));
  208961. XMEMCPY(table[j].y, t->y, sizeof(table->y));
  208962. }
  208963. }
  208964. }
  208965. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  208966. if (t != NULL)
  208967. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  208968. #endif
  208969. return err;
  208970. }
  208971. #endif /* FP_ECC || !WOLFSSL_SP_SMALL */
  208972. /* Multiply the point by the scalar and return the result.
  208973. * If map is true then convert result to affine coordinates.
  208974. *
  208975. * Stripe implementation.
  208976. * Pre-generated: 2^0, 2^128, ...
  208977. * Pre-generated: products of all combinations of above.
  208978. * 8 doubles and adds (with qz=1)
  208979. *
  208980. * r Resulting point.
  208981. * k Scalar to multiply by.
  208982. * table Pre-computed table.
  208983. * map Indicates whether to convert result to affine.
  208984. * ct Constant time required.
  208985. * heap Heap to use for allocation.
  208986. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  208987. */
  208988. static int sp_1024_ecc_mulmod_stripe_32(sp_point_1024* r, const sp_point_1024* g,
  208989. const sp_table_entry_1024* table, const sp_digit* k, int map,
  208990. int ct, void* heap)
  208991. {
  208992. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  208993. sp_point_1024* rt = NULL;
  208994. sp_digit* t = NULL;
  208995. #else
  208996. sp_point_1024 rt[2];
  208997. sp_digit t[2 * 32 * 6];
  208998. #endif
  208999. sp_point_1024* p = NULL;
  209000. int i;
  209001. int j;
  209002. int y;
  209003. int x;
  209004. int err = MP_OKAY;
  209005. (void)g;
  209006. /* Constant time used for cache attack resistance implementation. */
  209007. (void)ct;
  209008. (void)heap;
  209009. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  209010. rt = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * 2, heap,
  209011. DYNAMIC_TYPE_ECC);
  209012. if (rt == NULL)
  209013. err = MEMORY_E;
  209014. if (err == MP_OKAY) {
  209015. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 32 * 6, heap,
  209016. DYNAMIC_TYPE_ECC);
  209017. if (t == NULL)
  209018. err = MEMORY_E;
  209019. }
  209020. #endif
  209021. if (err == MP_OKAY) {
  209022. p = rt + 1;
  209023. XMEMCPY(p->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  209024. XMEMCPY(rt->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  209025. y = 0;
  209026. x = 127;
  209027. for (j=0; j<8; j++) {
  209028. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  209029. x += 128;
  209030. }
  209031. XMEMCPY(rt->x, table[y].x, sizeof(table[y].x));
  209032. XMEMCPY(rt->y, table[y].y, sizeof(table[y].y));
  209033. rt->infinity = !y;
  209034. for (i=126; i>=0; i--) {
  209035. y = 0;
  209036. x = i;
  209037. for (j=0; j<8; j++) {
  209038. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  209039. x += 128;
  209040. }
  209041. sp_1024_proj_point_dbl_32(rt, rt, t);
  209042. XMEMCPY(p->x, table[y].x, sizeof(table[y].x));
  209043. XMEMCPY(p->y, table[y].y, sizeof(table[y].y));
  209044. p->infinity = !y;
  209045. sp_1024_proj_point_add_qz1_32(rt, rt, p, t);
  209046. }
  209047. if (map != 0) {
  209048. sp_1024_map_32(r, rt, t);
  209049. }
  209050. else {
  209051. XMEMCPY(r, rt, sizeof(sp_point_1024));
  209052. }
  209053. }
  209054. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  209055. if (t != NULL)
  209056. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  209057. if (rt != NULL)
  209058. XFREE(rt, heap, DYNAMIC_TYPE_ECC);
  209059. #endif
  209060. return err;
  209061. }
  209062. #ifdef FP_ECC
  209063. #ifndef FP_ENTRIES
  209064. #define FP_ENTRIES 16
  209065. #endif
  209066. /* Cache entry - holds precomputation tables for a point. */
  209067. typedef struct sp_cache_1024_t {
  209068. /* X ordinate of point that table was generated from. */
  209069. sp_digit x[32];
  209070. /* Y ordinate of point that table was generated from. */
  209071. sp_digit y[32];
  209072. /* Precomputation table for point. */
  209073. sp_table_entry_1024 table[256];
  209074. /* Count of entries in table. */
  209075. uint32_t cnt;
  209076. /* Point and table set in entry. */
  209077. int set;
  209078. } sp_cache_1024_t;
  209079. /* Cache of tables. */
  209080. static THREAD_LS_T sp_cache_1024_t sp_cache_1024[FP_ENTRIES];
  209081. /* Index of last entry in cache. */
  209082. static THREAD_LS_T int sp_cache_1024_last = -1;
  209083. /* Cache has been initialized. */
  209084. static THREAD_LS_T int sp_cache_1024_inited = 0;
  209085. #ifndef HAVE_THREAD_LS
  209086. static volatile int initCacheMutex_1024 = 0;
  209087. static wolfSSL_Mutex sp_cache_1024_lock;
  209088. #endif
  209089. /* Get the cache entry for the point.
  209090. *
  209091. * g [in] Point scalar multipling.
  209092. * cache [out] Cache table to use.
  209093. */
  209094. static void sp_ecc_get_cache_1024(const sp_point_1024* g, sp_cache_1024_t** cache)
  209095. {
  209096. int i;
  209097. int j;
  209098. uint32_t least;
  209099. if (sp_cache_1024_inited == 0) {
  209100. for (i=0; i<FP_ENTRIES; i++) {
  209101. sp_cache_1024[i].set = 0;
  209102. }
  209103. sp_cache_1024_inited = 1;
  209104. }
  209105. /* Compare point with those in cache. */
  209106. for (i=0; i<FP_ENTRIES; i++) {
  209107. if (!sp_cache_1024[i].set)
  209108. continue;
  209109. if (sp_1024_cmp_equal_32(g->x, sp_cache_1024[i].x) &
  209110. sp_1024_cmp_equal_32(g->y, sp_cache_1024[i].y)) {
  209111. sp_cache_1024[i].cnt++;
  209112. break;
  209113. }
  209114. }
  209115. /* No match. */
  209116. if (i == FP_ENTRIES) {
  209117. /* Find empty entry. */
  209118. i = (sp_cache_1024_last + 1) % FP_ENTRIES;
  209119. for (; i != sp_cache_1024_last; i=(i+1)%FP_ENTRIES) {
  209120. if (!sp_cache_1024[i].set) {
  209121. break;
  209122. }
  209123. }
  209124. /* Evict least used. */
  209125. if (i == sp_cache_1024_last) {
  209126. least = sp_cache_1024[0].cnt;
  209127. for (j=1; j<FP_ENTRIES; j++) {
  209128. if (sp_cache_1024[j].cnt < least) {
  209129. i = j;
  209130. least = sp_cache_1024[i].cnt;
  209131. }
  209132. }
  209133. }
  209134. XMEMCPY(sp_cache_1024[i].x, g->x, sizeof(sp_cache_1024[i].x));
  209135. XMEMCPY(sp_cache_1024[i].y, g->y, sizeof(sp_cache_1024[i].y));
  209136. sp_cache_1024[i].set = 1;
  209137. sp_cache_1024[i].cnt = 1;
  209138. }
  209139. *cache = &sp_cache_1024[i];
  209140. sp_cache_1024_last = i;
  209141. }
  209142. #endif /* FP_ECC */
  209143. /* Multiply the base point of P1024 by the scalar and return the result.
  209144. * If map is true then convert result to affine coordinates.
  209145. *
  209146. * r Resulting point.
  209147. * g Point to multiply.
  209148. * k Scalar to multiply by.
  209149. * map Indicates whether to convert result to affine.
  209150. * ct Constant time required.
  209151. * heap Heap to use for allocation.
  209152. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  209153. */
  209154. static int sp_1024_ecc_mulmod_32(sp_point_1024* r, const sp_point_1024* g, const sp_digit* k,
  209155. int map, int ct, void* heap)
  209156. {
  209157. #ifndef FP_ECC
  209158. return sp_1024_ecc_mulmod_fast_32(r, g, k, map, ct, heap);
  209159. #else
  209160. sp_digit tmp[2 * 32 * 6];
  209161. sp_cache_1024_t* cache;
  209162. int err = MP_OKAY;
  209163. #ifndef HAVE_THREAD_LS
  209164. if (initCacheMutex_1024 == 0) {
  209165. wc_InitMutex(&sp_cache_1024_lock);
  209166. initCacheMutex_1024 = 1;
  209167. }
  209168. if (wc_LockMutex(&sp_cache_1024_lock) != 0)
  209169. err = BAD_MUTEX_E;
  209170. #endif /* HAVE_THREAD_LS */
  209171. if (err == MP_OKAY) {
  209172. sp_ecc_get_cache_1024(g, &cache);
  209173. if (cache->cnt == 2)
  209174. sp_1024_gen_stripe_table_32(g, cache->table, tmp, heap);
  209175. #ifndef HAVE_THREAD_LS
  209176. wc_UnLockMutex(&sp_cache_1024_lock);
  209177. #endif /* HAVE_THREAD_LS */
  209178. if (cache->cnt < 2) {
  209179. err = sp_1024_ecc_mulmod_fast_32(r, g, k, map, ct, heap);
  209180. }
  209181. else {
  209182. err = sp_1024_ecc_mulmod_stripe_32(r, g, cache->table, k,
  209183. map, ct, heap);
  209184. }
  209185. }
  209186. return err;
  209187. #endif
  209188. }
  209189. #endif /* WOLFSSL_SP_SMALL */
  209190. /* Multiply the point by the scalar and return the result.
  209191. * If map is true then convert result to affine coordinates.
  209192. *
  209193. * km Scalar to multiply by.
  209194. * p Point to multiply.
  209195. * r Resulting point.
  209196. * map Indicates whether to convert result to affine.
  209197. * heap Heap to use for allocation.
  209198. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  209199. */
  209200. int sp_ecc_mulmod_1024(const mp_int* km, const ecc_point* gm, ecc_point* r,
  209201. int map, void* heap)
  209202. {
  209203. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  209204. sp_point_1024* point = NULL;
  209205. sp_digit* k = NULL;
  209206. #else
  209207. sp_point_1024 point[1];
  209208. sp_digit k[32];
  209209. #endif
  209210. int err = MP_OKAY;
  209211. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  209212. point = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024), heap,
  209213. DYNAMIC_TYPE_ECC);
  209214. if (point == NULL)
  209215. err = MEMORY_E;
  209216. if (err == MP_OKAY) {
  209217. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32, heap,
  209218. DYNAMIC_TYPE_ECC);
  209219. if (k == NULL)
  209220. err = MEMORY_E;
  209221. }
  209222. #endif
  209223. if (err == MP_OKAY) {
  209224. sp_1024_from_mp(k, 32, km);
  209225. sp_1024_point_from_ecc_point_32(point, gm);
  209226. err = sp_1024_ecc_mulmod_32(point, point, k, map, 1, heap);
  209227. }
  209228. if (err == MP_OKAY) {
  209229. err = sp_1024_point_to_ecc_point_32(point, r);
  209230. }
  209231. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  209232. if (k != NULL)
  209233. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  209234. if (point != NULL)
  209235. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  209236. #endif
  209237. return err;
  209238. }
  209239. #ifdef WOLFSSL_SP_SMALL
  209240. /* Striping precomputation table.
  209241. * 4 points combined into a table of 16 points.
  209242. * Distance of 256 between points.
  209243. */
  209244. static const sp_table_entry_1024 p1024_table[16] = {
  209245. /* 0 */
  209246. { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  209247. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  209248. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  209249. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  209250. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  209251. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
  209252. /* 1 */
  209253. { { 0xe0162bc2,0xbf9c7ec6,0x10a89289,0xddecc6e3,0x9e499d81,0x5d599df0,
  209254. 0x6d358218,0x9a96ea28,0x70c5f8db,0x01aec7d3,0x8cf5d066,0xe72e4995,
  209255. 0x3e91d7f8,0xc2e7297d,0xda9f2f5a,0x8621db92,0x5a5679ed,0x4b26c867,
  209256. 0x2c56aac1,0x233385df,0xc6a13f99,0xb88e74d4,0xffa8ec11,0x1214b173,
  209257. 0x1f3f9fef,0xa0386a27,0xc0e7b44e,0xbd9b1b4e,0xeecd3496,0xafe528dc,
  209258. 0x1c49f80b,0x8dfff96a },
  209259. { 0xc03c0c83,0xb4a4753a,0xabcdcd75,0x68e69d18,0xf775b649,0xe3839b88,
  209260. 0xbf58f352,0x803f949a,0xbd0bc15c,0x5f702679,0x8ff298c2,0x85bf5d16,
  209261. 0xc6c7976e,0x3f6ebd98,0x45e3e1b4,0x20618af4,0x54e64093,0x67d5598e,
  209262. 0x504fed9e,0xb047283b,0x70d87517,0x450cabfd,0x3f5addbe,0x47d628bf,
  209263. 0x78cb4cca,0x0037ef30,0x6b1c4908,0x4e148d3c,0x4fcfd837,0xe256d329,
  209264. 0xde3c01f3,0x2aa1207b } },
  209265. /* 2 */
  209266. { { 0x755c2a27,0xcf3e0bb2,0x59585c44,0xd38e42f9,0x19285e60,0x46b13e0f,
  209267. 0x76273d0f,0xc3ecd0c0,0x193c569a,0x7800f085,0x4351818a,0xf04e74ab,
  209268. 0x8496363b,0x9258aa38,0xb8c894fe,0x8456617c,0x2af969a0,0x8bc62aaa,
  209269. 0x5a4668d9,0x66c2280b,0xa992f4fa,0xbc9df58e,0x3f401e99,0x5db0b7d9,
  209270. 0xc4c38c0e,0xe0614fe1,0x2ccdf6b3,0xd531151c,0xe143b618,0x1c7575ec,
  209271. 0xdf9398a4,0x40247985 },
  209272. { 0x8f055746,0xfba25178,0x0ab1e6e0,0xc5ba0040,0xac292697,0xe1b194fb,
  209273. 0x5b4f4740,0x77152119,0x9bb7ba54,0x250091d0,0xb9a139a4,0x7a674861,
  209274. 0xf353aa7e,0xba8413b3,0x2443ceee,0xafe77192,0x3847bbd0,0x14468d36,
  209275. 0x3da4942d,0x61f79ff6,0xd425b456,0x1563a1c1,0x75ff4630,0x3c270fcd,
  209276. 0xeb2802c9,0x42072090,0xc85c7004,0x68f0cdcb,0xfa032e74,0xca4372fb,
  209277. 0xc8b79d80,0x1a6fd1e6 } },
  209278. /* 3 */
  209279. { { 0x8d5116a3,0x967a901a,0xb2f5f47f,0x0b844394,0x60ebaf3b,0xe39ad452,
  209280. 0x60ccfc0c,0x1e1be617,0xcc3f53f2,0xac07e3d2,0x1ed11bb6,0xdd838e0e,
  209281. 0x1c15b0c2,0x45475307,0x920fe5b8,0x70dd4748,0xe471896d,0x1a20be2d,
  209282. 0x59276c7c,0x3c3fad8a,0xc886ee07,0x026a1cc3,0x6e831ac4,0x9fdb6f37,
  209283. 0xac501d65,0x26a35d1a,0x40da8574,0x0ae98905,0xabd734e5,0x65dde0a4,
  209284. 0x15614750,0x29b7d4dc },
  209285. { 0xcbf4e20b,0x44b3c2cb,0x58cc44c5,0x1c3f548f,0x5b0cac1f,0x39809b54,
  209286. 0x00f80621,0x0c0f02b5,0x066905e0,0xe612b890,0x8350188c,0x8f158ed7,
  209287. 0x3f5576b2,0xc01dc458,0xa45492e0,0x29803272,0x0ff92443,0x77a5623a,
  209288. 0x29d0dc41,0xd12a2b00,0x2780e87a,0xb4125459,0x0d53f272,0x1ebcf903,
  209289. 0x24301e8d,0xbae6ea40,0xa37d0798,0x1e5f3f2f,0x22b4126c,0x9342c310,
  209290. 0x5382497e,0x5d092802 } },
  209291. /* 4 */
  209292. { { 0x4b59213a,0xf5b495d0,0x8d70200e,0xca672039,0x2b6771c1,0x4bcb09a6,
  209293. 0x2b9eb0cb,0x26adeed4,0x8cdba212,0xeb544754,0xf08890d1,0x0e1abfcd,
  209294. 0x698e46b4,0x52509963,0x82e9c138,0xe1bff0b0,0x51099a71,0xa189e4cd,
  209295. 0xc9b91cc7,0x2360c9bc,0x137ec4be,0x9bd4d7dc,0xd1519f6e,0xd0356521,
  209296. 0xcf832503,0xbf5f6d78,0x8deea2b4,0xe4301031,0xef4c319c,0xc3132494,
  209297. 0x0f1fa7d7,0x2ab3bd47 },
  209298. { 0x922c9fbb,0x5753b680,0x0f16c6d1,0x869e7dc8,0xbac16efc,0x83445135,
  209299. 0x846d1d9b,0x4326a3b4,0xb2d62c21,0xb517fee3,0x0b292ad5,0x6905afa2,
  209300. 0x2cadac13,0x2a57131a,0xebdbca8d,0xcd904d8f,0x3f365fb2,0xdfeda86f,
  209301. 0xdc7eaa1c,0x7097b208,0xa45e77c0,0x89a35a84,0xcf5d118e,0x417a062c,
  209302. 0x1f6e99e8,0x3c0c04a8,0xba7a087d,0xc44704b0,0x3ea22ad2,0x6f8a27d1,
  209303. 0x4c27d229,0x93a4b416 } },
  209304. /* 5 */
  209305. { { 0x1f1efb7a,0xd4271bc1,0x33fccc0d,0xae4e68e6,0xb11f50a8,0x9d9bc8f1,
  209306. 0xaf076089,0x5430398f,0x443d0e03,0x45e242fb,0xf6e3d4c1,0x73ec2519,
  209307. 0xba9bad09,0xab70f790,0xf9add10f,0xde612ad5,0x14e942b4,0xb837e54e,
  209308. 0xddb8b68a,0x175a56d3,0x1ac2a408,0xe85b233c,0xf0c80f94,0xf8ff6c30,
  209309. 0x898db4f9,0x4b7f3fb7,0x45a7dcdd,0xa2c6044f,0xfe3d3895,0xf3abb2f6,
  209310. 0x32ee7763,0x342ce0d7 },
  209311. { 0xcf491b1f,0xeb261394,0x1909e395,0xdcaaeed7,0x9fe4dbea,0xdcc4055a,
  209312. 0x493d604d,0x17a6611d,0x1ce5ebef,0xba445a3a,0xe3989cb5,0xe82e2858,
  209313. 0x83f58406,0xb96f4282,0xa156cf55,0x99877b99,0x4e166a0e,0xaf906a66,
  209314. 0xb2976d13,0xcea1d353,0x36c61a01,0xefc16f27,0xb0f55d86,0xdb04c433,
  209315. 0x8eb34c01,0x3cb4b269,0x2ae60280,0x38d07f78,0x43be3ec5,0x43ac3bcb,
  209316. 0xe156fd20,0x455f4af3 } },
  209317. /* 6 */
  209318. { { 0x95532833,0x2e6fe0a6,0xd626d067,0xabca228e,0x649e73bd,0x22aef3d9,
  209319. 0xf03c4c0c,0x2083a87a,0x35169b45,0xe954e75d,0x74506a89,0x577509ee,
  209320. 0x2aeacf90,0x49cb276e,0xfa409f91,0x08275d77,0xf0bbd6b9,0x61eb6f3d,
  209321. 0xe4132704,0x948202cb,0xb1c498b1,0x35f3fc21,0x361fee59,0x76c68ba8,
  209322. 0x50e051f3,0xa18cbbd9,0x318e7042,0x2384a879,0x80dd1e8b,0x292abead,
  209323. 0x5c37c334,0x65713c29 },
  209324. { 0xceb77b9a,0xdccca8e9,0x23b69469,0x2f97e727,0xa01d6b28,0xc76abee6,
  209325. 0x5abecdfe,0x3925203d,0x29290d70,0x89448082,0xb0314438,0xf9931424,
  209326. 0x7cd447c3,0x04209df1,0xc855c827,0x7c6f2059,0x56c0e069,0xd97d7862,
  209327. 0x412d94c4,0x5a9db6fe,0x994c41dd,0x19a64591,0xc89e21a3,0x12348aa1,
  209328. 0xc6a03f0e,0xd6904b50,0xa616feac,0x55c15156,0x7cc7693b,0x4e36d1b5,
  209329. 0x3bae3c38,0x6b0e996c } },
  209330. /* 7 */
  209331. { { 0xcceced00,0x32789fab,0xe5b7aa66,0x3237e71a,0x2ddebcdf,0x87b2e269,
  209332. 0xb61dad8f,0xb7245120,0xd35f803c,0xe11e5e48,0x98e50f0d,0xfb4df5d7,
  209333. 0xbcd2ab92,0x60ee68b4,0x1ce3363d,0x98ab2f5c,0x7cd42647,0x15ba39da,
  209334. 0x83f4fb3f,0x1a6572eb,0xe56f08db,0x0f77de88,0x172562c2,0x1743761e,
  209335. 0x8a58f0f4,0xbe349ff8,0x84d1d6e2,0xe04da71b,0x9e9ff3b4,0x368f0342,
  209336. 0x678223f8,0x4022a205 },
  209337. { 0x83847375,0x527bbd05,0x3f451af0,0x3ae56b62,0x4b2c7f18,0x6198f24d,
  209338. 0x4525b98d,0xee323f5b,0x0e0884b5,0xa9d8d39a,0xfb12c776,0xd005d7f6,
  209339. 0x708bc154,0xd71c483e,0x742541bc,0x8ca6fd28,0xf8397ddb,0x0af3dccd,
  209340. 0x3eccf243,0xb80d3125,0x58d81b8d,0xc743a108,0x71391f68,0x3f48eb21,
  209341. 0x33bb657f,0x493aff88,0x07e47e31,0x1d15ed66,0xe08279f6,0x10159b11,
  209342. 0x24a6a956,0x312179cb } },
  209343. /* 8 */
  209344. { { 0xfb99cfe6,0x950323d3,0xc9334178,0x7b09bc26,0x7cbdfb6f,0x64111e41,
  209345. 0x89a75760,0x91141744,0x10919cb0,0x4c633df9,0x396bfd2f,0x715fc7c7,
  209346. 0x8cab62db,0x8ca19512,0x4db81aac,0x30672473,0xb4c4c54a,0xe67a246b,
  209347. 0xbf229646,0xd77ea0fa,0xfa5b5d70,0x5bed15f1,0xc2f192f3,0xa5686da5,
  209348. 0x7f6690ad,0xdecac72a,0xcaa50b7d,0x0c4af2a2,0x6049ad2f,0xf44631c1,
  209349. 0x04ecf056,0x325d2796 },
  209350. { 0x4848c144,0xee11fb55,0xb6a7af32,0x4e062925,0x369e0f9a,0x125b68e1,
  209351. 0xca53b21e,0xad9bdae6,0x2e98ea1b,0xf50d605c,0x9f2fa395,0xbdb9e153,
  209352. 0xe91532f5,0x4570e32d,0x46a250d7,0x810698ae,0xad9d9145,0x7fd9546c,
  209353. 0x11e97a5e,0xabf67721,0x249f82e9,0xca29f7d5,0x9851df63,0xa9c539a9,
  209354. 0x71d0e3e5,0xfd84d54b,0x041d2b56,0xd1e0459c,0xfd80096a,0xceb3eb6e,
  209355. 0xe32a79d3,0x19d48546 } },
  209356. /* 9 */
  209357. { { 0xb540f5e5,0xfe19ee8f,0x04e68d17,0x86d2a52f,0xadbdc871,0xd2320db0,
  209358. 0xd03a7fc8,0xa83ad5a8,0x08bcb916,0x54bf83c7,0x2e51e840,0x092133ea,
  209359. 0xcb52dddf,0xbce38424,0x31063583,0xd5c7be40,0x458e3176,0xc1ebb9df,
  209360. 0xbc4dabbf,0xafb19639,0xc05725a8,0x36350fe4,0x84e1cd24,0xac4a0634,
  209361. 0xc145b8de,0xadf73154,0xb3483237,0x0aa6dd9e,0xcbff2720,0xa3345c3d,
  209362. 0xb4e453b0,0x1b3ace6c },
  209363. { 0x90a8bdc5,0x0343e5e9,0x6306a089,0xa203bf9d,0x8e48520e,0x98489a35,
  209364. 0xde7d1d06,0xbd17debe,0x5f795d3f,0x8fafa6d7,0x387b0a3f,0xa4ceb630,
  209365. 0xffddeafa,0xe0166b32,0x7e764e02,0xa2fe2054,0xe871f304,0x55ab9824,
  209366. 0x952ec45e,0xa2bd36bb,0xa90d20ca,0x7b4c1484,0x75bcfb53,0x5319f387,
  209367. 0x6982c4e5,0x34238a4a,0xa102921d,0xa2bb61c7,0xdb3ab17e,0x1e061b64,
  209368. 0x192f0a14,0x538ec33e } },
  209369. /* 10 */
  209370. { { 0x576374c2,0xe53c7785,0x84727040,0xe60526d1,0x228ca044,0x8a066dc8,
  209371. 0xf1ce1313,0x1fe1c1b2,0xcdeb0c5d,0x2aeec832,0x9cbf826f,0xa7596699,
  209372. 0xde77a589,0xcd188e81,0x118d1254,0xe5ce0fe0,0x0790b86a,0xa142a984,
  209373. 0x39ac28ce,0xe28f043f,0x87de5804,0x4eef8290,0xf639a8c5,0x83c31b32,
  209374. 0x5887794f,0xd70454a7,0x18b1b391,0xca635d50,0x31d9c795,0xcefea076,
  209375. 0xb6f8aa25,0x13cbee76 },
  209376. { 0x8d3f34f3,0x79cabe0f,0xa3617fe3,0xbda9c31c,0xdd9426a1,0xb26dee23,
  209377. 0xf29c9104,0xe9dd9627,0xe2c6cd3b,0x033eb169,0xfcba2196,0x8a73f492,
  209378. 0xb858c83c,0x92e37e0b,0x23b3fbb7,0xe4f2aca6,0x64be00a2,0x8101fb1e,
  209379. 0x948f6448,0x91a7826a,0x907260e7,0x414067b4,0xe30bb835,0xf774aa50,
  209380. 0xc999c06e,0xf922ca80,0x0ba08511,0x6b8635b9,0x25fa04f0,0xbf936b5c,
  209381. 0xe02e8967,0x4e0a1ada } },
  209382. /* 11 */
  209383. { { 0x8ba29c4d,0x00ca6670,0x22988094,0xc08240ce,0x16dda752,0x21c5ca67,
  209384. 0xabbbfa34,0x689c0e45,0x3ed28b72,0x1d7545fd,0xd7c56ab4,0x5f221198,
  209385. 0x38759d65,0x4b3d8f74,0x8fe50b89,0x93490dfb,0xe80eba16,0xb641f5d7,
  209386. 0x79acb537,0x7b0da5eb,0x0c1d5e5e,0xab6b1497,0xa5da429a,0x2338e68d,
  209387. 0x2f6d2f25,0xe010c437,0x6530f3a7,0x226f16d2,0xcbef08bc,0xefb0f7b6,
  209388. 0x9f99c999,0x733e30d9 },
  209389. { 0xa42a38f9,0xecfe1582,0x4730b500,0xaec2d58e,0xde976b2c,0x2ee2f2a7,
  209390. 0xa969c1bb,0xf0539db5,0xfcecdb4a,0x31954168,0xe7a8e902,0xf2f7348a,
  209391. 0x3121541f,0x1d58d7cc,0x2202ae52,0x5d25b75c,0xf40835a7,0xdea9965a,
  209392. 0x529b4e46,0x3feb6a41,0xbd27ad9b,0x5c97fb6f,0x261f900b,0xd87554c0,
  209393. 0x04d5b19e,0xb43031d9,0xcb219b9c,0x33d5e9b8,0x3ee00bcf,0x7a43d492,
  209394. 0xb79a5c0c,0x56facb39 } },
  209395. /* 12 */
  209396. { { 0x7c834915,0x667eaed6,0xbc5eb64d,0x9f77aa6a,0x25d62011,0x729ebcb6,
  209397. 0x699fd9c2,0x0aee24f2,0x2b8d4f6c,0xe1eb5874,0x14c976d6,0x7f12710c,
  209398. 0xf6d9ea65,0x91390335,0x06b50064,0x668b7049,0x0876ee4f,0x65969a0e,
  209399. 0x2f9d9360,0xf901bf3f,0xb499e3ce,0xfb1a8651,0xf2dbcaaa,0x80b953fb,
  209400. 0x973b06b6,0x312cc566,0x3af36c64,0x3534d9c3,0x10ffd815,0xe4463a52,
  209401. 0xf18c2b91,0x57ea2b4b },
  209402. { 0x8aa0f2f2,0x00f5e162,0x0e46bcaa,0x8c7e75c5,0xa4a2c42d,0x97ab479a,
  209403. 0x14baa202,0xb4f308ea,0x6943cc2e,0xa901bd14,0xeed58804,0xbb125fee,
  209404. 0x9d180f7c,0x6502c8f9,0x1580c61c,0xe5353919,0x27101ee3,0x7e278069,
  209405. 0xfaa72717,0x7a0a40a1,0x4c75b153,0x32edce02,0x538f1c22,0xda23660b,
  209406. 0xbe307d2e,0x4d511e98,0x9baee0b4,0x24276e40,0x7ff1f307,0xa78c3927,
  209407. 0xea7935c9,0x60480b46 } },
  209408. /* 13 */
  209409. { { 0x3872ece3,0x31087d66,0x955b70f8,0x5f29be7d,0x9cf95bb8,0xb50b4fc7,
  209410. 0xdbffa621,0xbae3b58d,0xe022ba5d,0x0e61d280,0x4181449c,0x78ae5117,
  209411. 0xcf555485,0x0b132840,0xb8ce0b0e,0x800ed1b6,0x78d5de3d,0x35dffdd5,
  209412. 0x69a56b47,0xf7e42374,0x8d910ae7,0xd5e32369,0x6313c7c7,0xb6ff52a0,
  209413. 0xa92de9e5,0x5a2fe20d,0xd12110bb,0x41b347d3,0x40c16f23,0xc5905edb,
  209414. 0x9a8f88cc,0x0774a0d3 },
  209415. { 0xe3b6c106,0x3ae181ab,0x8de150b7,0x4ebe163f,0x6f354836,0xcf75b82f,
  209416. 0x3ac7ac16,0xaa0d2063,0x291722af,0x5c680668,0x11545553,0x73941e61,
  209417. 0xbf5de3f7,0x17127e38,0x1afb41da,0x32cfdf03,0x87bc8663,0xc6893c91,
  209418. 0xa62c9c99,0x75046744,0x962c1947,0x96866e2d,0x378cdf4c,0x489ec8df,
  209419. 0x3407fa32,0x3a60709b,0x551290d1,0xd37d2159,0xbab92273,0x9623d303,
  209420. 0x2432014b,0x08151954 } },
  209421. /* 14 */
  209422. { { 0xb05f2b26,0x569044f3,0x80b9f76c,0xb35a294a,0x4290f6ae,0x8839fe28,
  209423. 0x026a5877,0x761cfb23,0x2e5ff9c3,0x768926b6,0x0b11c576,0xbae6cd20,
  209424. 0x72a03efe,0xdc857756,0xe1bad63a,0x0cae074a,0xd709d99c,0x3fe491a1,
  209425. 0x6501d9c1,0x76c5ded6,0xc32aeff7,0x1da6eca1,0xc57683e8,0x50849d55,
  209426. 0xdf98d847,0x9e392e9c,0x64d9a564,0xfad7982f,0xa37b98b2,0xf7c3bdb7,
  209427. 0xf0860497,0x1fe09f94 },
  209428. { 0x7648cc63,0x49a7eaae,0x67cfa714,0x13ea2511,0x653f4559,0xfc8b923c,
  209429. 0x81a16e86,0xd957619b,0x3c864674,0x0c7e804b,0x1616599a,0xfc88134a,
  209430. 0x0a652328,0x366ea969,0x4bc9029e,0x41532960,0xae2aad2b,0xef9e1994,
  209431. 0x7f10bef5,0x9e2a8c52,0xc67bf860,0x73dcb586,0x844cc25d,0xf61a43fa,
  209432. 0x74eb3653,0xd74e7eea,0xdd240f02,0xf3356706,0xfd83bcb4,0xeec7694c,
  209433. 0xdb62526a,0x4de95786 } },
  209434. /* 15 */
  209435. { { 0x3deac2f7,0x4867d315,0xb61d9a8e,0xa084778a,0x0ab7b2d5,0xf3b76f96,
  209436. 0xcfdf4f79,0x00b30056,0x31ab8f4b,0xd0701e15,0x9c779d01,0x07f948d5,
  209437. 0x82675371,0x7c994ebc,0x48bad4c0,0x1104d4ee,0xbfc9d058,0x798ce0b5,
  209438. 0x309fa80b,0xc7ca898d,0xacb33eaf,0x0244f225,0x5b2f3175,0xd51e8dfc,
  209439. 0xa4d7be34,0x3e49ba6b,0xbda02b43,0x1760f4c7,0x4435275a,0x37e36a7e,
  209440. 0xe636980c,0x1c94418b },
  209441. { 0x09dc1414,0x43a21313,0x43c93537,0x060765fc,0xdf5f79ce,0x6ff3207a,
  209442. 0x85d4cfca,0x6f18b1fa,0x63e995ab,0xf5c4272e,0xa82b3002,0x121a09e4,
  209443. 0x97147f16,0x82b65d1b,0x20a7fe26,0x4993c20c,0xe6716726,0x99c9cb98,
  209444. 0xfeb440a0,0x5a02d673,0x251b4bc5,0x3f3fa9e1,0xa05338ea,0x75dbc474,
  209445. 0x7b09f6cb,0x3cb4044b,0x80434609,0x6767da18,0x098ceac2,0x97851422,
  209446. 0xb55235ba,0x611bfbb2 } },
  209447. };
  209448. /* Multiply the base point of P1024 by the scalar and return the result.
  209449. * If map is true then convert result to affine coordinates.
  209450. *
  209451. * Stripe implementation.
  209452. * Pre-generated: 2^0, 2^256, ...
  209453. * Pre-generated: products of all combinations of above.
  209454. * 4 doubles and adds (with qz=1)
  209455. *
  209456. * r Resulting point.
  209457. * k Scalar to multiply by.
  209458. * map Indicates whether to convert result to affine.
  209459. * ct Constant time required.
  209460. * heap Heap to use for allocation.
  209461. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  209462. */
  209463. static int sp_1024_ecc_mulmod_base_32(sp_point_1024* r, const sp_digit* k,
  209464. int map, int ct, void* heap)
  209465. {
  209466. return sp_1024_ecc_mulmod_stripe_32(r, &p1024_base, p1024_table,
  209467. k, map, ct, heap);
  209468. }
  209469. #else
  209470. /* Striping precomputation table.
  209471. * 8 points combined into a table of 256 points.
  209472. * Distance of 128 between points.
  209473. */
  209474. static const sp_table_entry_1024 p1024_table[256] = {
  209475. /* 0 */
  209476. { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  209477. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  209478. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  209479. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  209480. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  209481. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
  209482. /* 1 */
  209483. { { 0xe0162bc2,0xbf9c7ec6,0x10a89289,0xddecc6e3,0x9e499d81,0x5d599df0,
  209484. 0x6d358218,0x9a96ea28,0x70c5f8db,0x01aec7d3,0x8cf5d066,0xe72e4995,
  209485. 0x3e91d7f8,0xc2e7297d,0xda9f2f5a,0x8621db92,0x5a5679ed,0x4b26c867,
  209486. 0x2c56aac1,0x233385df,0xc6a13f99,0xb88e74d4,0xffa8ec11,0x1214b173,
  209487. 0x1f3f9fef,0xa0386a27,0xc0e7b44e,0xbd9b1b4e,0xeecd3496,0xafe528dc,
  209488. 0x1c49f80b,0x8dfff96a },
  209489. { 0xc03c0c83,0xb4a4753a,0xabcdcd75,0x68e69d18,0xf775b649,0xe3839b88,
  209490. 0xbf58f352,0x803f949a,0xbd0bc15c,0x5f702679,0x8ff298c2,0x85bf5d16,
  209491. 0xc6c7976e,0x3f6ebd98,0x45e3e1b4,0x20618af4,0x54e64093,0x67d5598e,
  209492. 0x504fed9e,0xb047283b,0x70d87517,0x450cabfd,0x3f5addbe,0x47d628bf,
  209493. 0x78cb4cca,0x0037ef30,0x6b1c4908,0x4e148d3c,0x4fcfd837,0xe256d329,
  209494. 0xde3c01f3,0x2aa1207b } },
  209495. /* 2 */
  209496. { { 0x01900955,0xa95b6dae,0xceb4656d,0xa5dc9cc1,0xe72fe95b,0x50c78907,
  209497. 0xa040c334,0xa1ae5447,0x7952ea6e,0x91191370,0x6d097305,0x54ff7343,
  209498. 0xbda4d10f,0xa4db0074,0x91644070,0xfd5306f1,0x8b24522c,0x14b9fe73,
  209499. 0x7849f762,0x1468dad6,0xb0dcd2e4,0x87b29a18,0x5e1ad492,0xadd7f1a1,
  209500. 0xdbba2a1a,0x9ac63a81,0x81223379,0x01379c5b,0xb0e53bc8,0xf402b2f0,
  209501. 0x0bf13b61,0x8c3eb27f },
  209502. { 0xe513696f,0x9a4ad3e1,0x18c81ffa,0x0350ba5c,0x3c033d13,0x1e2fc136,
  209503. 0x17a531bc,0x53da6e71,0x1aed610d,0x42ec6490,0xe99ff567,0xd33e8df7,
  209504. 0x3deed12a,0xe4aad73e,0x180f4deb,0xd983b465,0x502f30b4,0x99365269,
  209505. 0xa8918d7f,0x7e2799ab,0x700fc79a,0x0ffe84b6,0x40bfd8c2,0x7b4400d6,
  209506. 0x5d2641bd,0xc3a21d21,0xc32621cb,0x79839442,0xb1401e83,0xace6500b,
  209507. 0x251c4310,0x7bf4163e } },
  209508. /* 3 */
  209509. { { 0xe3fd589e,0x1c174f88,0xdf974a03,0xdb501790,0x3e70549f,0xd09623e3,
  209510. 0x15924f34,0x8d091eff,0xf9b65ac5,0xeef79cad,0x3f69c2cf,0xd2cc4262,
  209511. 0x52cd82bc,0x817d9032,0xa5f1dddd,0xacf4f4d9,0x5011b6bd,0xd0612635,
  209512. 0x2ed140c9,0x9f74490d,0x4db686d2,0x64092e8c,0x776b0fcc,0x225eef16,
  209513. 0xdf16aeb6,0x0e8c01e9,0x84bbd82a,0x62836741,0x8956e337,0x757574e2,
  209514. 0x705a7f07,0x9871edc6 },
  209515. { 0x776535f7,0xbd0b76d5,0x2635b3b8,0x5214d602,0x9d216f64,0xc0c25ad9,
  209516. 0x5515bf75,0xfd4df3a7,0x5e9f1675,0x24a625bc,0x406873e7,0x3c35efb7,
  209517. 0xbb2e5c4a,0xef5c9a33,0x806b198a,0xa971b35e,0xa3c690ed,0x9f5c0ca5,
  209518. 0x8e1e2341,0xa8d5dd89,0x955ad9e4,0x4cecbcce,0x248d3416,0x2ecf4407,
  209519. 0x45c0af6e,0x1abb3811,0x1c780fff,0x3f4bee82,0xc272ed57,0xd14df768,
  209520. 0x371637ad,0x397ed10a } },
  209521. /* 4 */
  209522. { { 0x755c2a27,0xcf3e0bb2,0x59585c44,0xd38e42f9,0x19285e60,0x46b13e0f,
  209523. 0x76273d0f,0xc3ecd0c0,0x193c569a,0x7800f085,0x4351818a,0xf04e74ab,
  209524. 0x8496363b,0x9258aa38,0xb8c894fe,0x8456617c,0x2af969a0,0x8bc62aaa,
  209525. 0x5a4668d9,0x66c2280b,0xa992f4fa,0xbc9df58e,0x3f401e99,0x5db0b7d9,
  209526. 0xc4c38c0e,0xe0614fe1,0x2ccdf6b3,0xd531151c,0xe143b618,0x1c7575ec,
  209527. 0xdf9398a4,0x40247985 },
  209528. { 0x8f055746,0xfba25178,0x0ab1e6e0,0xc5ba0040,0xac292697,0xe1b194fb,
  209529. 0x5b4f4740,0x77152119,0x9bb7ba54,0x250091d0,0xb9a139a4,0x7a674861,
  209530. 0xf353aa7e,0xba8413b3,0x2443ceee,0xafe77192,0x3847bbd0,0x14468d36,
  209531. 0x3da4942d,0x61f79ff6,0xd425b456,0x1563a1c1,0x75ff4630,0x3c270fcd,
  209532. 0xeb2802c9,0x42072090,0xc85c7004,0x68f0cdcb,0xfa032e74,0xca4372fb,
  209533. 0xc8b79d80,0x1a6fd1e6 } },
  209534. /* 5 */
  209535. { { 0x8d5116a3,0x967a901a,0xb2f5f47f,0x0b844394,0x60ebaf3b,0xe39ad452,
  209536. 0x60ccfc0c,0x1e1be617,0xcc3f53f2,0xac07e3d2,0x1ed11bb6,0xdd838e0e,
  209537. 0x1c15b0c2,0x45475307,0x920fe5b8,0x70dd4748,0xe471896d,0x1a20be2d,
  209538. 0x59276c7c,0x3c3fad8a,0xc886ee07,0x026a1cc3,0x6e831ac4,0x9fdb6f37,
  209539. 0xac501d65,0x26a35d1a,0x40da8574,0x0ae98905,0xabd734e5,0x65dde0a4,
  209540. 0x15614750,0x29b7d4dc },
  209541. { 0xcbf4e20b,0x44b3c2cb,0x58cc44c5,0x1c3f548f,0x5b0cac1f,0x39809b54,
  209542. 0x00f80621,0x0c0f02b5,0x066905e0,0xe612b890,0x8350188c,0x8f158ed7,
  209543. 0x3f5576b2,0xc01dc458,0xa45492e0,0x29803272,0x0ff92443,0x77a5623a,
  209544. 0x29d0dc41,0xd12a2b00,0x2780e87a,0xb4125459,0x0d53f272,0x1ebcf903,
  209545. 0x24301e8d,0xbae6ea40,0xa37d0798,0x1e5f3f2f,0x22b4126c,0x9342c310,
  209546. 0x5382497e,0x5d092802 } },
  209547. /* 6 */
  209548. { { 0xff2f780d,0x583a2b7e,0xd7d76b1d,0x34d26820,0x86f74aec,0xe3c32847,
  209549. 0x10823feb,0x0fd42212,0xfb5e7bf4,0x227e417e,0xa568f8cd,0x510d49b6,
  209550. 0x1781bbec,0x53bce7d6,0x2f3718b7,0x9cfe3f22,0xd9de6c1f,0x7f44e89f,
  209551. 0x3fac9b55,0xf1cc553f,0xe6f300bc,0x9d2d0846,0x9f0ae6b1,0x976c82a2,
  209552. 0x24b8bbe0,0xe63dbf5e,0x973a5aa7,0x4cac7f45,0x84dd33c7,0xc6eb6237,
  209553. 0x142fee5d,0x0a26e434 },
  209554. { 0xacaa9a08,0x8081339f,0x5246ece1,0x40f31105,0x61393747,0x892c8170,
  209555. 0x242f02e1,0x8d8d4103,0x3b5de98a,0x482bfd20,0x5abbe952,0x89ef946b,
  209556. 0x37698249,0xb8d218b9,0x66617c7a,0xd5268e89,0x8b7d2b91,0x962e7551,
  209557. 0xfe8d67c3,0x2c5c7973,0x2b017c51,0x42e3150a,0xc1a29469,0x6f4e5ebc,
  209558. 0x531c7083,0xa39910ce,0xb77b9e50,0xaf4f6eb4,0xda120ad0,0x68cbb175,
  209559. 0xb92636ec,0x19497c61 } },
  209560. /* 7 */
  209561. { { 0x417659a8,0x6920b0c6,0x92cb28ff,0xc77ab9c7,0xb687797f,0x55b67180,
  209562. 0xe7759363,0x4caf58c1,0x5561b186,0x5155bdb6,0x780f4946,0x2e64e355,
  209563. 0x229a8b20,0xeb0ac9b7,0x2571bd60,0x88594d78,0xe3fa78f9,0x5dcc0939,
  209564. 0x2ac2d379,0x7b8b4830,0xb90f1444,0x505fbf60,0x3ce4b3c1,0xac610e81,
  209565. 0xd59b5c18,0x39a4f27a,0x7cea0222,0x5fa33973,0x8dff1c7b,0xe578730b,
  209566. 0x517bf7a6,0x96b91b8b },
  209567. { 0x9aac087c,0xc1a991f4,0x6cfdb28d,0xce62f74e,0x5f7600d6,0x08d6ff9a,
  209568. 0xf917f9c9,0xd781cd04,0x3de52dbf,0x7796f5f6,0x2ed72180,0xe7db64e0,
  209569. 0x6fa4137d,0x0f0876f6,0x3ca1f716,0x3271ee64,0x7c4ab8a3,0xcb9b2058,
  209570. 0x39481047,0xcba17107,0x598c5c37,0xdf9a190d,0x6f20e125,0x0cb6e72a,
  209571. 0xf4f2902d,0xa3142204,0x7ce2dcfb,0x42d28cb9,0xa3d3c351,0xdf261b8a,
  209572. 0xcffc249d,0x73f3d315 } },
  209573. /* 8 */
  209574. { { 0xe6fd3673,0x5d86855b,0x9d214b7b,0x309b70af,0xdcc46cd3,0x8d332f90,
  209575. 0x595510de,0xe553c015,0x38c1251c,0x5746a096,0x85cc1bc9,0xcd7cea5b,
  209576. 0x002eba8f,0x4ffa1468,0x22fcd77c,0x10a3cb70,0xc4ea05e3,0xb6999dfb,
  209577. 0x4efa756e,0x3375a0d0,0xdced5fd8,0x4d90279e,0x251fd56e,0x48192403,
  209578. 0x82a4c5f1,0xe87633a4,0x1b34105b,0x3170d130,0x7247e578,0x93998b0f,
  209579. 0x436ba1fa,0x88934f64 },
  209580. { 0x4713eabc,0xf09f43b0,0xaccdc517,0x4ca7dd91,0xef13ca7c,0x27daa63b,
  209581. 0x2588184b,0x8b2e5a7a,0xd95dc269,0x0a8cb612,0xe1f2f14c,0x346975a2,
  209582. 0xe172935c,0x1f29b8ed,0xd40bc1e3,0xc3cbfd6e,0x132623da,0xd3f46b3f,
  209583. 0xfb0b7681,0xc115be6d,0x56da4344,0x5e31c345,0xa8e43d98,0xa7c63f18,
  209584. 0x4bddb4ea,0x55cb2083,0x4a54f58c,0xb16a0c38,0x46fd69d9,0x74eacca2,
  209585. 0x153548e1,0x0d1898bb } },
  209586. /* 9 */
  209587. { { 0xe35ef043,0x4ea73461,0x3496b564,0x107b67d9,0xd0f83a3c,0xd62c173b,
  209588. 0x51d29c35,0xfad4b038,0x71b1c1a4,0x3f42882a,0x54b43b9e,0x5d2bcf66,
  209589. 0x2abdf543,0xc77b15aa,0xdabe3dc1,0x5cb38a80,0xa481673b,0x15fda0ae,
  209590. 0xe7b90ebe,0x86996b4d,0x2bc8f3d8,0x84f87e25,0x37c4e424,0xaded03d6,
  209591. 0xd7a7afd8,0xe5ede666,0xa1ccb93a,0x80dd95a2,0x46fba391,0xa55cfd25,
  209592. 0x46f82e60,0x2bdab1dc },
  209593. { 0xfa6fed61,0x7a4de22b,0xcc8dd94e,0xca458aa5,0x071222f5,0x3e372df1,
  209594. 0xe5aff377,0x06a4b44f,0x4a738e6d,0xbc2d0ba7,0x5f31f136,0x1a470e1d,
  209595. 0xe102a911,0x77ff933a,0x310c7885,0x8b380a50,0x783fc5ac,0x9f3c0228,
  209596. 0x44725d06,0xec668925,0x5ac84221,0x878f0e16,0xcfda6e8a,0x9a3af1af,
  209597. 0x78cd2aba,0x0183ed37,0x826d0eae,0x32cdbd60,0xcbee6415,0xb3234661,
  209598. 0xb9c10120,0x353eb892 } },
  209599. /* 10 */
  209600. { { 0x10b5521e,0xc8fdcad6,0x52e702f0,0x1a11b440,0x8ffda49c,0x6302680d,
  209601. 0xcbf36bad,0xcdb9654a,0x4c10a2d7,0x7b58ce11,0xe630e7e0,0x1e5d1f7d,
  209602. 0x6760a813,0x8cbe3d7d,0x6480d77f,0xeb35866b,0x7f036219,0x58728cf3,
  209603. 0x42a8a757,0xdd5865ed,0x906a2870,0x283f1f1d,0xa51f906b,0x79e23fa4,
  209604. 0x543b20a8,0xf2ac6e83,0xb81e7754,0x4f0b6379,0x840016ee,0x57fbc0d4,
  209605. 0xe621b67d,0x8da20771 },
  209606. { 0xecce65ec,0x3c855004,0xb748185e,0x76d10d1f,0x78797ad2,0x64be7bca,
  209607. 0x77e54aad,0x43444db0,0xbe0df0ff,0x17b6b0c9,0x055086a4,0x8fc4256c,
  209608. 0xfd74d5a3,0xf952c43b,0x01c4edb8,0x501e005a,0x4a57e328,0xd5172dfc,
  209609. 0x535d6ee3,0xdb40ce4e,0x0c650918,0xbaef1e5c,0x857561fc,0xe85145e7,
  209610. 0x34a224c6,0xe468536a,0x0ec0e0a2,0x69a8e227,0x242b03fc,0xb3f52247,
  209611. 0xc3bebd5f,0x862f55e2 } },
  209612. /* 11 */
  209613. { { 0x226049fe,0x2d6a390f,0xdcbbc9fb,0xcc92a578,0x97634fb7,0xa52feca4,
  209614. 0x3dea5893,0x2b340cb6,0x2a49e916,0xa39f338a,0x949e41f3,0x26b2df3d,
  209615. 0x065a7e40,0xc71c7cdb,0x468281a2,0x4a9b84a0,0x731eeeca,0x63eeb503,
  209616. 0x76cbb725,0xe6d09134,0xb94a678c,0x0cf979a9,0x808fd9f1,0xb44d8c3b,
  209617. 0xe0afc5b9,0xe60da613,0x3ea5be69,0x52dce7de,0xdc1ee74f,0x3a5d6864,
  209618. 0x3bc80790,0x71ab2891 },
  209619. { 0x3b5b60ad,0xcf618fc4,0x4a0c3184,0x0afb5e30,0xbc403302,0xd22381cc,
  209620. 0xdb1c0c66,0x33cf8953,0xa6112a8d,0x9c994e4d,0xd1967a86,0xd7aae2c3,
  209621. 0x5b7acd29,0xc28d5493,0x6c9a57fb,0x8075bd13,0x9c8427f9,0xc9c0373e,
  209622. 0x193225f5,0x2cbca18d,0x442c018c,0x73777d13,0xfbb3a727,0xebe5ed47,
  209623. 0x1962dc18,0x70437d49,0x2dc08806,0xf39c1e09,0x15fff35c,0x03e9c6f7,
  209624. 0x5e360a65,0x8d087bb6 } },
  209625. /* 12 */
  209626. { { 0x3fdc1844,0xbe212302,0x105eac56,0x6eca27ef,0xf168a348,0x2183a606,
  209627. 0xe1d7a4cb,0x295f807d,0x7ef5d43e,0x7246a632,0xc77025c7,0xae143205,
  209628. 0xf3484e3e,0x4bdfc7ca,0xdf52c075,0xec939895,0xd7a9cac0,0x82e655f6,
  209629. 0x8baeddb0,0x985dfe20,0x527de731,0x79c817e4,0x313de1ea,0x30ce0fbc,
  209630. 0xcc4f6cbb,0x9df95b89,0xf5bb20cd,0xf2aedf1e,0x1a8cfb01,0xfc1e0a89,
  209631. 0x63edb7ec,0x225ed34a },
  209632. { 0xbabb1a85,0x3e13154d,0x1e6a565a,0xd3d8dae7,0xab4b100f,0xd3217d56,
  209633. 0xebc78e1a,0xd44d934e,0x48e73d37,0x0215321b,0x201e43cb,0xbbc90bfa,
  209634. 0x27500905,0x3c23f1d0,0xc86691a1,0x2a2e5000,0x6065841c,0x08b2bad2,
  209635. 0x30026b60,0x15d41caf,0x5276ce61,0x1712c2f4,0x15932ffb,0x01c4c3e7,
  209636. 0x6a74caf2,0x7894e13d,0x0c0537a4,0x02d6f5df,0xc2b1c97e,0xa8fb7602,
  209637. 0xd0887c7b,0x612b60e5 } },
  209638. /* 13 */
  209639. { { 0xba245d6b,0xefd495cf,0xa2ce3ff6,0x5cf0cbb7,0xdff5feee,0x24da2ac0,
  209640. 0xcf28c6a3,0x90c914f8,0x4308a56b,0x72fdb50d,0x13d72034,0x03dbf779,
  209641. 0x822ac9e9,0xcfa5ec91,0x3aea3e81,0x0dde73c8,0x66289139,0x545ba962,
  209642. 0xca6acbd3,0xa52f648b,0x98a0683a,0xff6f276e,0xa378ed52,0x2536d3ac,
  209643. 0x885ac1d9,0x353c2c54,0x00bc84a7,0xcaff52da,0x37684167,0x3971f81c,
  209644. 0xd2d7986e,0x0f7334e1 },
  209645. { 0x6596067e,0xafbb5c83,0x38c19806,0x33e54e19,0x39cb0dcc,0x8285d967,
  209646. 0x424035f9,0x2b53f43d,0xdfef9095,0x38c531f8,0xdb0f571a,0x90fbe8e4,
  209647. 0xa39ca787,0x9a0c1ed2,0x606f2620,0x2fecc1d6,0x72b7cb4a,0x9dc890b1,
  209648. 0xccbb7868,0xc33ca6fb,0xfe73ee49,0xd1b11082,0xfcb66c48,0x590b7d17,
  209649. 0x86e14573,0x9356b0a6,0x053ead85,0x75d682c4,0xc54d30fb,0xb2ae55fa,
  209650. 0xf8aee949,0x67636a72 } },
  209651. /* 14 */
  209652. { { 0xb91d6bea,0x638063bc,0x923ecb96,0xae263a2e,0xc627aca6,0x9d7b0992,
  209653. 0x77af9e7e,0xc6ed001a,0x24aafebb,0x9214accf,0x78055a90,0xa3564b96,
  209654. 0xe027499d,0x00999b1c,0xe46a06a5,0xe413a4e1,0x2e51efe7,0xa05d13f6,
  209655. 0x9ba843be,0x35e87d34,0x3183159e,0x0a633825,0x54601923,0x6023e8ba,
  209656. 0xb7fd1cf2,0x9b107721,0xfdf2fd53,0x46b5542b,0x1c18af38,0xb314f4f8,
  209657. 0x60ac8965,0x086f9876 },
  209658. { 0x8cbb9850,0x76701954,0xa20d2c8c,0x6210b730,0x5335670c,0x4084d057,
  209659. 0x0324baea,0x3ecdc595,0xc76ee9b4,0x607fc5f2,0x440ffa64,0xf393d00f,
  209660. 0x2dc1463c,0xe0111796,0x9c7725e7,0xf00b8251,0x5bd1d186,0x35e60736,
  209661. 0x2cf72aac,0xf3d8554c,0xefa3497d,0xb4dd0fde,0xf646ad11,0xd712268c,
  209662. 0x9f7b8ead,0x07c20afb,0xfc06dfe5,0x630969d4,0x7245549a,0x76b7df1c,
  209663. 0xe61ae810,0x681f9403 } },
  209664. /* 15 */
  209665. { { 0xc9a0623b,0x7cad5163,0x67fab8d4,0xdbf82957,0x81af7c7c,0x2ccab0ec,
  209666. 0xe966d5c2,0x469e38c8,0xf0d4e41c,0x34430d52,0xa52b359c,0x426075a2,
  209667. 0x33bd0127,0x242dd3e3,0x9fed2341,0xcda3f635,0xd7d52ffa,0x4df33730,
  209668. 0x7640c3ef,0x5fff56f0,0x1bbde57c,0x4783c21c,0xeb8bb336,0xd8784a2a,
  209669. 0xead08405,0x1ec7c533,0xf9b62bd4,0x4b7f1423,0x7075d4af,0x5543145c,
  209670. 0xba60590a,0x0c9de94a },
  209671. { 0x95d5682b,0x8ed72735,0x2ec276ed,0x711c4283,0x8b36a0d2,0xd1f4aed5,
  209672. 0x8498a88f,0x62ab40c4,0x4480f451,0x58c8fc62,0xb79cffe2,0x8bc8ca4b,
  209673. 0x701a359d,0x90ab583c,0x3fd5d15d,0xaee31a73,0xc912333c,0x02a5597b,
  209674. 0xb6c3e3c2,0x1019cae4,0x29938088,0xe513042c,0xf47c8199,0x0e00283d,
  209675. 0xf2a00e92,0x90d68e58,0xa775ae3b,0x69e2df41,0x871c30b2,0xb8d2eca5,
  209676. 0xbb1de396,0x733dca0e } },
  209677. /* 16 */
  209678. { { 0x4b59213a,0xf5b495d0,0x8d70200e,0xca672039,0x2b6771c1,0x4bcb09a6,
  209679. 0x2b9eb0cb,0x26adeed4,0x8cdba212,0xeb544754,0xf08890d1,0x0e1abfcd,
  209680. 0x698e46b4,0x52509963,0x82e9c138,0xe1bff0b0,0x51099a71,0xa189e4cd,
  209681. 0xc9b91cc7,0x2360c9bc,0x137ec4be,0x9bd4d7dc,0xd1519f6e,0xd0356521,
  209682. 0xcf832503,0xbf5f6d78,0x8deea2b4,0xe4301031,0xef4c319c,0xc3132494,
  209683. 0x0f1fa7d7,0x2ab3bd47 },
  209684. { 0x922c9fbb,0x5753b680,0x0f16c6d1,0x869e7dc8,0xbac16efc,0x83445135,
  209685. 0x846d1d9b,0x4326a3b4,0xb2d62c21,0xb517fee3,0x0b292ad5,0x6905afa2,
  209686. 0x2cadac13,0x2a57131a,0xebdbca8d,0xcd904d8f,0x3f365fb2,0xdfeda86f,
  209687. 0xdc7eaa1c,0x7097b208,0xa45e77c0,0x89a35a84,0xcf5d118e,0x417a062c,
  209688. 0x1f6e99e8,0x3c0c04a8,0xba7a087d,0xc44704b0,0x3ea22ad2,0x6f8a27d1,
  209689. 0x4c27d229,0x93a4b416 } },
  209690. /* 17 */
  209691. { { 0x1f1efb7a,0xd4271bc1,0x33fccc0d,0xae4e68e6,0xb11f50a8,0x9d9bc8f1,
  209692. 0xaf076089,0x5430398f,0x443d0e03,0x45e242fb,0xf6e3d4c1,0x73ec2519,
  209693. 0xba9bad09,0xab70f790,0xf9add10f,0xde612ad5,0x14e942b4,0xb837e54e,
  209694. 0xddb8b68a,0x175a56d3,0x1ac2a408,0xe85b233c,0xf0c80f94,0xf8ff6c30,
  209695. 0x898db4f9,0x4b7f3fb7,0x45a7dcdd,0xa2c6044f,0xfe3d3895,0xf3abb2f6,
  209696. 0x32ee7763,0x342ce0d7 },
  209697. { 0xcf491b1f,0xeb261394,0x1909e395,0xdcaaeed7,0x9fe4dbea,0xdcc4055a,
  209698. 0x493d604d,0x17a6611d,0x1ce5ebef,0xba445a3a,0xe3989cb5,0xe82e2858,
  209699. 0x83f58406,0xb96f4282,0xa156cf55,0x99877b99,0x4e166a0e,0xaf906a66,
  209700. 0xb2976d13,0xcea1d353,0x36c61a01,0xefc16f27,0xb0f55d86,0xdb04c433,
  209701. 0x8eb34c01,0x3cb4b269,0x2ae60280,0x38d07f78,0x43be3ec5,0x43ac3bcb,
  209702. 0xe156fd20,0x455f4af3 } },
  209703. /* 18 */
  209704. { { 0x754ec21c,0xc057f262,0xe3a1ba38,0x3eacd4c9,0x116c1fe9,0x3a0210d1,
  209705. 0xeacc8ab6,0xe4ea4e94,0xea6f32ca,0x31c00c9a,0x86b975ce,0x5cb6239d,
  209706. 0xa14ea1e9,0x654d5d8c,0x5067fc8b,0x230d31f4,0x6355fecb,0x48bb90cb,
  209707. 0xdc172e8e,0x78f81ece,0xcb006737,0x288380a8,0xe162d012,0x19b02e01,
  209708. 0xc5af145c,0x0e087a06,0xb72dc354,0xf04dc8b7,0x8de3c066,0xf70ef214,
  209709. 0x13009fb7,0x4f148243 },
  209710. { 0x6e2055e2,0x5e004fce,0x86c32067,0x89e247ea,0x5f9daaa2,0x4ebcbd95,
  209711. 0xceb7f63b,0xd15f212f,0x863784a0,0x5ecc5c1f,0x75760251,0x53b3800b,
  209712. 0x8a6a2954,0xeb9301c3,0xa13cdd19,0x0f16ba18,0x887c2d24,0x8313d251,
  209713. 0x9a9413f6,0xf9923585,0xfe3fd7c5,0x423405e6,0x16e0ee05,0x678aeb34,
  209714. 0x3fadaab0,0x1f3be7bb,0x82884471,0x7901fa2c,0x4d662ff6,0xc950db30,
  209715. 0x3c01170b,0x74d5d2d4 } },
  209716. /* 19 */
  209717. { { 0x2b5bfe11,0xa3002dc0,0x52d321e7,0x0733410d,0x9679ba89,0x15920f65,
  209718. 0x685b236e,0x0e248c14,0x346f6040,0x8cfab594,0x40c717f0,0x9f57afb7,
  209719. 0x66044576,0x0dbab28c,0x9cdc3247,0x0fa09968,0xc230ed05,0x41e02ae2,
  209720. 0xe45bef74,0x0d961554,0xce4d7b6f,0x9688a982,0x5e62d22e,0xfadefac7,
  209721. 0xbd2cba28,0xaf1512a6,0xbe7c749f,0x78868e62,0xae9f5a6b,0x88048d81,
  209722. 0xc5857a29,0x6b1a5442 },
  209723. { 0x43242066,0x9f5ab9ad,0x2ccca2ae,0x0afef1b5,0x988edc4e,0xb1b43ec7,
  209724. 0x0341b0d5,0x0d0c00f1,0xb50aab37,0x4d68b8f7,0xf3a64a99,0x9a8e4e6f,
  209725. 0x7f1a684e,0x198338fb,0x351a0f5c,0x8bc0e748,0xdac44515,0x2cacf2cd,
  209726. 0x5e9ff76b,0xc14d3999,0x16393055,0x54a01b3f,0x888d8376,0x6ac3eea5,
  209727. 0x723277b1,0xb84d9a9a,0xe11dbbbf,0x99132691,0xabb67178,0x597717ae,
  209728. 0x8bb14ac8,0x4c213526 } },
  209729. /* 20 */
  209730. { { 0x95532833,0x2e6fe0a6,0xd626d067,0xabca228e,0x649e73bd,0x22aef3d9,
  209731. 0xf03c4c0c,0x2083a87a,0x35169b45,0xe954e75d,0x74506a89,0x577509ee,
  209732. 0x2aeacf90,0x49cb276e,0xfa409f91,0x08275d77,0xf0bbd6b9,0x61eb6f3d,
  209733. 0xe4132704,0x948202cb,0xb1c498b1,0x35f3fc21,0x361fee59,0x76c68ba8,
  209734. 0x50e051f3,0xa18cbbd9,0x318e7042,0x2384a879,0x80dd1e8b,0x292abead,
  209735. 0x5c37c334,0x65713c29 },
  209736. { 0xceb77b9a,0xdccca8e9,0x23b69469,0x2f97e727,0xa01d6b28,0xc76abee6,
  209737. 0x5abecdfe,0x3925203d,0x29290d70,0x89448082,0xb0314438,0xf9931424,
  209738. 0x7cd447c3,0x04209df1,0xc855c827,0x7c6f2059,0x56c0e069,0xd97d7862,
  209739. 0x412d94c4,0x5a9db6fe,0x994c41dd,0x19a64591,0xc89e21a3,0x12348aa1,
  209740. 0xc6a03f0e,0xd6904b50,0xa616feac,0x55c15156,0x7cc7693b,0x4e36d1b5,
  209741. 0x3bae3c38,0x6b0e996c } },
  209742. /* 21 */
  209743. { { 0xcceced00,0x32789fab,0xe5b7aa66,0x3237e71a,0x2ddebcdf,0x87b2e269,
  209744. 0xb61dad8f,0xb7245120,0xd35f803c,0xe11e5e48,0x98e50f0d,0xfb4df5d7,
  209745. 0xbcd2ab92,0x60ee68b4,0x1ce3363d,0x98ab2f5c,0x7cd42647,0x15ba39da,
  209746. 0x83f4fb3f,0x1a6572eb,0xe56f08db,0x0f77de88,0x172562c2,0x1743761e,
  209747. 0x8a58f0f4,0xbe349ff8,0x84d1d6e2,0xe04da71b,0x9e9ff3b4,0x368f0342,
  209748. 0x678223f8,0x4022a205 },
  209749. { 0x83847375,0x527bbd05,0x3f451af0,0x3ae56b62,0x4b2c7f18,0x6198f24d,
  209750. 0x4525b98d,0xee323f5b,0x0e0884b5,0xa9d8d39a,0xfb12c776,0xd005d7f6,
  209751. 0x708bc154,0xd71c483e,0x742541bc,0x8ca6fd28,0xf8397ddb,0x0af3dccd,
  209752. 0x3eccf243,0xb80d3125,0x58d81b8d,0xc743a108,0x71391f68,0x3f48eb21,
  209753. 0x33bb657f,0x493aff88,0x07e47e31,0x1d15ed66,0xe08279f6,0x10159b11,
  209754. 0x24a6a956,0x312179cb } },
  209755. /* 22 */
  209756. { { 0x07615ac2,0xa94cc3ca,0x121ad581,0x85865e64,0xa7986b79,0xae47616f,
  209757. 0x9d5e0f1d,0x395a40eb,0x3d9457ea,0xa9143264,0xfa2865d9,0x8de6d6a3,
  209758. 0x1014ae8c,0x0771db96,0x976a87cb,0x77a7cce6,0x143a0f60,0xa7de42e1,
  209759. 0xd993d934,0xe203cc09,0x98ec4c3d,0x92018693,0x3a25df4b,0xd77546d8,
  209760. 0x62b02d6b,0x0ad9eb47,0xd05a7189,0xfaaaf208,0x431221bb,0x5238181f,
  209761. 0x733511ea,0x417d6c78 },
  209762. { 0x0e91e9a8,0x3cbd81b7,0xc370d6b3,0x73340418,0x8eaa2373,0x825db10a,
  209763. 0x6c7d6756,0x8f2b09e4,0x94c33ded,0xe288ee9b,0x1695e3fb,0xcd8426bb,
  209764. 0xdce9e888,0xa6176c86,0x6165e362,0x3f4c8922,0x6063fb09,0x514e411f,
  209765. 0xc8f9e04c,0x6907ac20,0xdfd2ad61,0xcef7469c,0x8452199a,0xba30bae4,
  209766. 0x12ac3462,0x30681293,0xc92d482d,0x011be873,0xe8330995,0xff4cbf89,
  209767. 0xd1470a0a,0x02189d52 } },
  209768. /* 23 */
  209769. { { 0x92599c69,0x73e419dd,0x7fec32ca,0x5b94221b,0x09bbfbfd,0xb2bf9bd2,
  209770. 0x63ed895b,0x61ea97a4,0x3f486f79,0x6609146b,0xfd141a39,0xbd1c7a05,
  209771. 0x83d64135,0xc79ec8cf,0x9883507b,0x7f8fd42f,0x17b3d027,0xafcb53b7,
  209772. 0x67ca5a21,0x86658dcd,0xcd149786,0xa6a6c0ac,0x34b95067,0x16f3d70e,
  209773. 0xdf44958c,0x371208e3,0xec280212,0xd2dd64e6,0x30782c71,0x33b2c4ab,
  209774. 0x521176fa,0x7bbf8abd },
  209775. { 0xa78b981a,0xbe9e4aaf,0x304ec828,0x788b4e36,0x3959dea3,0x0c45cf39,
  209776. 0x240b39c7,0x70a9bdd3,0x28383b7d,0x499cd7dd,0x307a1026,0x30690b2e,
  209777. 0xee92f1b3,0x2262d598,0xb4725a48,0xc62d77de,0x7bc3aa0e,0xa16f25bc,
  209778. 0xd15ef7fa,0x62dd8b65,0x0b96d68f,0xd979221d,0xa00f1906,0xb92885c3,
  209779. 0xeb74c740,0xfa476b9b,0xc7576222,0x217ddbb5,0x5788504f,0xc2782c30,
  209780. 0xf812716b,0x860d096c } },
  209781. /* 24 */
  209782. { { 0x4d79bbf9,0xfebc337d,0x69f74f80,0x5d53eab8,0x33104d53,0xff36a095,
  209783. 0x196f8b97,0x2ab820da,0x75ce6909,0x961d3d1f,0x04683754,0xb197ec04,
  209784. 0x93a6cb9b,0xa68ce1bf,0xc5f021a3,0x503456ff,0x8940ffdb,0xb50a2db1,
  209785. 0xef004209,0x77c50f8f,0x04965875,0xd635d177,0x8bb8770a,0x725766d9,
  209786. 0xa078e53e,0x8e19b028,0xf9fc8378,0x364d4cca,0xf0dd39a0,0x1a3df411,
  209787. 0x03adf920,0x7e80e442 },
  209788. { 0x539a1ddf,0x4b5f8a57,0xee486562,0xd248e7ae,0x816021e1,0x1c7b491d,
  209789. 0xfd36d2c4,0x2e7b871b,0x0aec00d9,0xda38b504,0x6193f1b3,0xf2827612,
  209790. 0xfb1f78d6,0x69c3fe86,0xe827ac33,0x56c8b786,0x3487c8f7,0x1687f6c7,
  209791. 0x19dee5bc,0xab8f2217,0xff399418,0x04e8473f,0xa9027c80,0xf384c014,
  209792. 0xaa1d2e28,0x9967be9a,0xe065eef1,0x869686d3,0xc7bd837c,0x737c6b08,
  209793. 0x9e8bd863,0x5dcab5d1 } },
  209794. /* 25 */
  209795. { { 0x9a7d772b,0x0784283a,0xe540959b,0x6b49e525,0x86414ab5,0x546bb008,
  209796. 0x9d74b2a9,0xd4448162,0x203b0b1b,0x267890ad,0xc8d3f86b,0x1e7a82bc,
  209797. 0xd85a83c7,0x1352bfb5,0xfad07ccf,0xf29f16e3,0x41e0c43f,0xc02a63b8,
  209798. 0x6b379fef,0x904f22c5,0xb1244f26,0x19d8a653,0x3a28bdea,0x6635b6df,
  209799. 0xf6d455ce,0x18b68851,0x9cff3735,0x74ac2818,0x8b2cbdab,0xad40f9df,
  209800. 0xadc9d498,0x08cc2d9e },
  209801. { 0xc170c84b,0x2e6a6866,0x5a49a484,0xbb989e8b,0xd04c8992,0x7b0e00e0,
  209802. 0x61b3a423,0x55ad3478,0xb0d01899,0x3c952450,0xe3100cb3,0xe3922155,
  209803. 0xf03276d0,0x19265b6e,0x76d42b53,0x0fe8595a,0xfc6353b6,0x0a96dee0,
  209804. 0x246f893e,0x761e0dc8,0xf0a74cba,0x4ec902be,0x3fdfad9b,0x61008684,
  209805. 0x4fdb6975,0x5d6a60e4,0x7ef7590a,0x3f53aac8,0x12870a37,0xd29e6be0,
  209806. 0x55aa55b0,0x991fadc1 } },
  209807. /* 26 */
  209808. { { 0xb4844ffe,0x82bc4b0f,0x60f8b871,0x73922714,0x4ce3f1f3,0x8ac000e2,
  209809. 0x163519ec,0xf0d548b4,0x88288b5f,0x7aaf842b,0x2bdc9a70,0x9e8b0c4c,
  209810. 0x4ba5fd67,0xa06d5152,0xf93cdec3,0xd0b1afa0,0xdf89f8f0,0x280955ba,
  209811. 0xeea32c92,0x86cbe92d,0x3fe05be4,0x0cae3f99,0xfa6919aa,0xf2607095,
  209812. 0x6e0f1b8b,0x0f54741e,0x30ecf988,0x2aed1f74,0x734991d7,0x9296f76b,
  209813. 0x259f0fe9,0x66cf8d28 },
  209814. { 0x226f5868,0x9b01905b,0x16909e9e,0xc102e88c,0x4a37eb54,0x2bd08916,
  209815. 0xc9816323,0xf72253e8,0x86bac53c,0x37f84e9d,0xafeaaaf7,0x2e352454,
  209816. 0x2ca0046e,0x67c86f77,0x6663372e,0x86bce50e,0xb6950a04,0xf6a3a960,
  209817. 0xfc1aba93,0x61f994d7,0xc1326e6e,0x1957c12b,0x2e56b005,0x9b658fe4,
  209818. 0x8592740c,0x9cd297fc,0x177f26a5,0x7654ce9b,0xa79d2ebb,0xaaa699db,
  209819. 0x0ecb6448,0x5fca0c5a } },
  209820. /* 27 */
  209821. { { 0x569a6663,0xe26e25f3,0xe6aa4ca7,0x09597ee7,0x8d18b80c,0x25a4cda6,
  209822. 0x22926730,0x450602b5,0x07387209,0x9af5f650,0x26733a53,0xfeeedb34,
  209823. 0x86572951,0x0f5ce768,0x8398ae9a,0x872a360b,0x2b30f6c3,0x60347a80,
  209824. 0x1a162158,0xd2113b23,0xee6c6dec,0x6fd9cf92,0x5cbcf9e6,0x85f0a5a8,
  209825. 0x2ba3fe84,0xd7a5a6e4,0x51ecd727,0xaafe6720,0xa2081a10,0xe09c6bb2,
  209826. 0xb973b0b4,0x657acbf0 },
  209827. { 0xc274c8d4,0x3130466f,0x30a994d1,0x42765176,0x7079435f,0x217258ca,
  209828. 0xeb897a06,0x44850406,0x561ee130,0xf38dfeee,0xaa1778bb,0x11f4facf,
  209829. 0xb9abb9e9,0x765c6617,0xd8f10932,0xb135499b,0xa73b9159,0xc0eb6337,
  209830. 0x6f7e8b6a,0xf2c1ccf1,0x187def53,0x5b32c03a,0x830b9c62,0x89ad1d49,
  209831. 0x2f10e538,0x1735eae3,0x9d5f55bc,0xb1cbd9c2,0xe539db0d,0x42428c47,
  209832. 0xc852b3bb,0x3d2da412 } },
  209833. /* 28 */
  209834. { { 0x871f2865,0x97702b6e,0x142920d6,0x56cb639f,0x45b58611,0x328522a0,
  209835. 0xf3b13812,0xf3943ad1,0x712206e8,0xe6c2200a,0xa34d59ea,0xc2890e5a,
  209836. 0xf6b7f759,0xab52fd40,0x180bf567,0xf522c8de,0xaccee396,0x181e97b2,
  209837. 0xc4ea5cbb,0xe0375819,0xab51d3ef,0x0d9985e8,0xbcb50fd8,0xe26c96ca,
  209838. 0x97e1c80d,0xfb9d6b13,0xf796357d,0x582b1814,0x07f4c7fb,0x89a78221,
  209839. 0xc0357e61,0x02aeef2d },
  209840. { 0x2c7ec9be,0x2ba7926f,0x7258b201,0x292f307e,0xc6fa6b4a,0x74e62a10,
  209841. 0xe2bcc5ab,0x80c08549,0x7bb8c073,0xb4160db8,0x329f194d,0xd5ef0529,
  209842. 0x6dda4a9c,0x0eb8da14,0x15ea23d1,0x0b5d43d2,0xfc34bfae,0x6cebef02,
  209843. 0x848757a7,0xacd364d0,0x2d34cca3,0xc1401368,0x1d2d95e2,0x09ca6742,
  209844. 0x786eaa28,0xc3fd1d6e,0xa2965fec,0x9eb1136d,0xc0779203,0x48871baa,
  209845. 0x4b15aeb0,0x6b446c01 } },
  209846. /* 29 */
  209847. { { 0x25e8fe80,0xc819eb2e,0x98238a17,0x2b5f7906,0x81e41849,0xd6f1e996,
  209848. 0x98ea6d45,0x58ad8ad6,0xbfd02e40,0x5bae5ad4,0xa812416d,0x016dc327,
  209849. 0xa3347ca1,0x8b31a985,0x82a65391,0x0b4da610,0xb48c35fb,0x1cb91b2d,
  209850. 0xd2aaf8c4,0x9e96817c,0xcdfdcdc0,0x1a630483,0x12b69254,0x70559361,
  209851. 0xf8a2a097,0x5fdcd712,0x35cc5281,0x59ab623a,0x932b6095,0x30c8ebe0,
  209852. 0xb08e052f,0x8613424b },
  209853. { 0xb2231d8a,0x28902063,0xd9a61667,0xb0f62329,0x071a9f27,0xaafa0fe7,
  209854. 0x603f047e,0x6bcd8960,0xfd92a1c3,0x118cca76,0x71d483b6,0x3414e62b,
  209855. 0xba705262,0xa123ccdd,0xfd9b5c5a,0x1a576437,0x4c8d0fa3,0xa5301bc2,
  209856. 0x102427cd,0x96f0ad44,0xd3aa6c02,0x0e6fb5e0,0x072a3996,0xcd8c4880,
  209857. 0x840d3fad,0x4dafca12,0xde91d541,0x29f4ca3d,0x8441734d,0x0037c598,
  209858. 0x9ccfe57c,0x86333a99 } },
  209859. /* 30 */
  209860. { { 0xecf53b40,0xd213a751,0x2f78a542,0xcff2c6f2,0xf13ae56d,0x0f59f0e2,
  209861. 0x0e61748e,0x91f8ccbf,0xd72c4145,0x0aadecb9,0x4c9cdcb7,0x6b2ed852,
  209862. 0x1eaffc70,0x8e00b72c,0xaa728102,0x89b24285,0xb679cafa,0xaa7ea7e0,
  209863. 0x4f0a6f6f,0x5d2b8c26,0x0e804397,0x7ed7b173,0xc8573049,0x5a93eb45,
  209864. 0x0986e93e,0xc92bf5d4,0x6a20c0af,0x526b5a9c,0xb99dc3af,0x0adf47c9,
  209865. 0xba202cc9,0x12b25fe2 },
  209866. { 0x33eea395,0x09b8d78a,0xf633fc5c,0xc7a93618,0x270eceef,0x7e821629,
  209867. 0xc628ed0c,0x524779b8,0xa1d68939,0x91db5ca1,0x586edc90,0x8626e18e,
  209868. 0xfeb3f3bf,0xfe023e8b,0x0250171c,0x6279fde1,0x55e172de,0xe52ec7dc,
  209869. 0xc6d4ca45,0x445e8695,0xbdbc10f1,0x42de3878,0x6fc3835e,0x2b114de8,
  209870. 0x7e10b652,0x9faba456,0x390e78fe,0x4111d82a,0xaedf0aca,0x576b61c2,
  209871. 0x74accb74,0x216279a9 } },
  209872. /* 31 */
  209873. { { 0x4047f747,0xc14cdabf,0xc1315a1e,0x03ca233d,0x40e5d0a7,0x59e7cbd3,
  209874. 0xbb413869,0x1fd0c4e9,0x0f01fbd8,0x189d08b1,0xa76b823d,0x50449c42,
  209875. 0x398b00a1,0x81c224a1,0x8e8179e4,0x08084e4f,0x698e41e9,0xfd8af994,
  209876. 0x5610bf2e,0x1e30e37c,0xa7d2790f,0x4e6a043f,0xb3195388,0x9d96e60c,
  209877. 0x03799dfd,0xe75f986d,0xf8ff902f,0x3b4a8f11,0x7588416e,0xfa945378,
  209878. 0x9827535e,0x20683e3f },
  209879. { 0xd0378878,0xcb582e26,0xa7945787,0x9e214c23,0x8f6688b3,0x13d000bf,
  209880. 0x40515270,0x7548d4f5,0x40111f5d,0x7113c15d,0xa8bff902,0x3bf5a526,
  209881. 0x9b4945cc,0xbda6b010,0xbc2f3a05,0x83dcc74e,0x43efdfa1,0x2aef6284,
  209882. 0x565c5bf4,0xd2e60ee9,0x592f243a,0x4f0fa10d,0x1bc3bf51,0x6ae58b32,
  209883. 0x60576a74,0x813b0868,0x4d73081a,0x0bc023f8,0x32dcee59,0x9fd03aa0,
  209884. 0x27d6c795,0x5e416bf5 } },
  209885. /* 32 */
  209886. { { 0x026cc23c,0x24313760,0xb5b29058,0xf819aaee,0xc5d2ee17,0xa92272f8,
  209887. 0xee5cc402,0x8048e7cb,0x77def07d,0xdbc7d6ee,0xf6af821e,0x61d69244,
  209888. 0x996cbb89,0x5f7966ed,0x96a155a4,0xf81b17ea,0x03f3ed56,0xb2d9ef70,
  209889. 0xe882a5b2,0x5e6e5906,0xae947180,0x86fa1072,0x658c76f4,0x34d9fc51,
  209890. 0xcb035aa0,0x9f603dc0,0x75be6481,0xb7b39feb,0xcf04a9ef,0xca87554a,
  209891. 0x87b4fde3,0x4ff682ec },
  209892. { 0xd0a10ad5,0x3125627f,0x968e6f45,0x7fd45c72,0x806a1163,0x2981bd6b,
  209893. 0xde5033e3,0xb92de1cd,0xbf4f8988,0x3b44b45e,0xdae7e1dc,0xca1b9896,
  209894. 0x0778d878,0x52166e5a,0xa5116847,0x82d472be,0xf2895445,0xfbdd382a,
  209895. 0x5d6ec4c9,0x22ed1602,0xb6552b02,0x3614eb1c,0xa1e6210f,0x63c5df73,
  209896. 0x021a74a7,0xe9160285,0xc65cbd4d,0xa44ca400,0x0f15e299,0x48cb187e,
  209897. 0x3402507c,0x51eb818e } },
  209898. /* 33 */
  209899. { { 0xb92100ab,0x1fc1d178,0x9605b839,0xdf2e3d60,0xb71e59d0,0x12a7c255,
  209900. 0x14fcbe04,0x3f8b6675,0x59fd06af,0x0e8a3935,0x12020d07,0x56326502,
  209901. 0x528e7be5,0x6696fcd1,0x0c7b7654,0x6588514b,0x5912a5b5,0x0cd80f8c,
  209902. 0xf324cb7f,0x8bafef04,0xc6da3d75,0x6b53eecf,0x31d1df2f,0xedef48d8,
  209903. 0x73812b6d,0xf336b965,0xee626031,0xc82eae4a,0xd244f09b,0x300abd32,
  209904. 0x31d9647f,0x8b0af955 },
  209905. { 0x2e603544,0xb770180a,0x221acd9e,0x2b573ac3,0x62407032,0x3a17f665,
  209906. 0xb89abc3d,0xad3e74ad,0xd793225a,0x8a3d2e3a,0xef02564b,0x457bba04,
  209907. 0xfc2dd2b5,0x8875652f,0xe67143e8,0xd2905d15,0x02e48d70,0x6d884b42,
  209908. 0xc7636a57,0x06f99219,0x35e378df,0xa8dc3421,0x10c64a02,0x95c1d73d,
  209909. 0xcc157a66,0xcd6a4ece,0x8e24a354,0xbadcc1c8,0x9839329d,0x8024f1b2,
  209910. 0x4da48ad0,0x5363e549 } },
  209911. /* 34 */
  209912. { { 0xe23fc641,0x1f5523b7,0x86667063,0xfe54e72f,0x8e009d2f,0x294a15f5,
  209913. 0x8c57f5e1,0xf203997f,0xb16d64dc,0xa229724c,0x4baa2ffb,0x697be4fd,
  209914. 0x0a6e8ed6,0x3f507e46,0x78508536,0x0afe3a5d,0x95408208,0xeeef6cdd,
  209915. 0xf2c4237c,0x701fd889,0x5c385253,0x496d883a,0x72a212f1,0xe25c67ed,
  209916. 0x1ff78fcd,0x4b416783,0xc16f4146,0xe9967004,0xc45b0697,0xfa45c3a1,
  209917. 0x3fbd30c3,0x63334018 },
  209918. { 0xa2fbbbce,0x39c9a0cc,0xaa0cb744,0x876f6e5c,0x3438ece3,0x9ce6010e,
  209919. 0x13802d82,0x0aad148e,0x9cd45a1b,0x9c3e5c60,0x7bcfc1e0,0x875cb859,
  209920. 0xd8584dd0,0xb19ff790,0xd81c2a2b,0x2598b81e,0x02be07e3,0x118bdf2f,
  209921. 0xb9765ce9,0x074fc8ee,0xb24f95ae,0x125e9d88,0x0c98f09d,0x3bb12cdc,
  209922. 0xa0b74b27,0x4a6aee07,0xc08077ce,0x4723d2f9,0xbea8026f,0x959447d6,
  209923. 0x16280b73,0x93a7075c } },
  209924. /* 35 */
  209925. { { 0x715b27f9,0x26bbefe2,0x2a280923,0xa935a5e2,0xfd58a26a,0x5ddf23af,
  209926. 0x7c138694,0x54c83e16,0x892a2153,0x44799bc9,0x9b8d09f5,0x4e6e4710,
  209927. 0xd588ea68,0xc63af616,0x883ab1b6,0x5e896706,0x3d209336,0x3c1393a0,
  209928. 0x92c23dda,0xd02f2921,0xdcf6ea43,0xab70cb7a,0x791559e1,0x12434ea8,
  209929. 0x6d70ff0b,0x040680db,0x2832ba45,0x1a10fe52,0xe5f0cb8f,0xd69f9c08,
  209930. 0x44b141fd,0x1a7422ac },
  209931. { 0x9f40b675,0xc3a9dd2e,0xfcc71f39,0x2a7c6603,0x1948e342,0x18939a61,
  209932. 0xed0ab484,0x8f3b6158,0xee31ca6b,0xa3aa7d97,0xf7a8db63,0xbc1e865e,
  209933. 0x2c7c62e4,0x315f8c09,0x9f5c6d0f,0xa260788f,0x4b6f3ec5,0xb1833129,
  209934. 0x36b4d849,0x73adbcd6,0xbc699a9b,0x66e14890,0x2a1175e7,0xbf3790d8,
  209935. 0xfc53ca4f,0x7f43605a,0x87ff6091,0x577f6c47,0x600c82b6,0x827c7552,
  209936. 0x9d25599c,0x0944d630 } },
  209937. /* 36 */
  209938. { { 0xe6ab9620,0xcfdeb63e,0x786cd808,0xdff4fa6d,0x456320b3,0x145edd82,
  209939. 0xc4943915,0x2ae5f862,0xb73b3f87,0x9508e813,0xe52f97a9,0x3bd805f3,
  209940. 0xc9829b62,0xf71b5c28,0x86e0cefc,0xb394c70e,0x23bdb36e,0x534fb1a9,
  209941. 0xdbe27e5a,0xd64f5862,0x83ab6169,0xbae23df3,0x27c828cb,0xdd6df1b1,
  209942. 0x3a307a8a,0x1901899f,0x811ddf66,0x36cc8659,0x79943b77,0xa3cb7774,
  209943. 0x6fd86576,0x7d89f383 },
  209944. { 0xc9f92b2b,0xf8564242,0xc46e32bd,0x700c6a75,0x7f99a5c5,0x93e768b7,
  209945. 0x03149568,0xb6efe858,0xc2ce6709,0xbbfe8a19,0xee6ec493,0x721a3b1b,
  209946. 0xc371c28d,0x26eeeea9,0x15177e1d,0xd798115e,0xb068a5a5,0xd7bf3bce,
  209947. 0x46d2b4b2,0xdf8da220,0x59be9dfc,0x3df0995b,0x77640b79,0xc96897bc,
  209948. 0x5a2bd3c5,0xce0cf4c2,0x89afe744,0x16f45d6e,0x3a8509bb,0xb53f3acb,
  209949. 0x63f2a6e6,0x449af81f } },
  209950. /* 37 */
  209951. { { 0xa16d9377,0xc2fcf132,0x7e1a2f9e,0x9ab377b3,0x86d19ae5,0x72e1a12e,
  209952. 0xd013bbb1,0xd2b12e66,0xcb5f66ba,0x0972e055,0x399eab50,0xd11de1c0,
  209953. 0xc65f5ec2,0xc1f314fd,0x8a9ff593,0xfc311841,0xe05246e6,0xdf73c1ec,
  209954. 0x1625056d,0xc28d1363,0x6fb25e19,0x30a9dbd7,0x845cd2d7,0x049ed244,
  209955. 0xd36e852d,0xc779b83f,0xf68c8a83,0x85a35fc7,0xc95e8033,0x299bf1e1,
  209956. 0x20891af5,0x0e8617c3 },
  209957. { 0x67c81b5c,0x53720602,0xe737873c,0x2fa89dcd,0xa8144fd0,0x2a7430b0,
  209958. 0x26208c83,0x3006c5a7,0xd8ea40f5,0x4e066660,0x896413a4,0x9dd025f9,
  209959. 0x46b9149f,0xbdf380cc,0x0a125cc2,0x80156619,0x52793c37,0x04d6a3b7,
  209960. 0x6b7a62f2,0xb6001374,0x585d5978,0xa9cfe268,0x8395fe66,0xdcad0cb8,
  209961. 0x46b261f6,0xbab468fc,0x9d9d9218,0xca0ef5ef,0x5e452402,0xc507d4a8,
  209962. 0x326cf687,0x6f4404f1 } },
  209963. /* 38 */
  209964. { { 0x4febd3ff,0xa3e1920b,0xfdfd2bba,0xca6234d8,0xe19a9829,0xb7d1af2a,
  209965. 0xc6f5bc20,0x23de1610,0xdaa39ca9,0xe204dbf3,0x6d8c70ab,0x2a2de9b8,
  209966. 0x7c9d370b,0x272e0c37,0xe565510e,0x80914c06,0x57cbb6b0,0xb611e7a8,
  209967. 0xd8266a6e,0x076fc6ef,0x3095801c,0xdfac34ee,0xb9e24063,0x69ff40a2,
  209968. 0x787aa5c5,0xa7ba31a9,0x33c70cd2,0x0e4d1fdf,0x6895f074,0x903e3132,
  209969. 0x7fb671e2,0x905771f8 },
  209970. { 0xa4062bee,0x5199ba0d,0x94d7d9f9,0x18e7238c,0x1e0922c0,0xf53f29bc,
  209971. 0xb12d855f,0xde9b2a81,0x6d68ca29,0x649f3eed,0xc50c097f,0x64adfc34,
  209972. 0x9db398a0,0x81964ab9,0x7a587224,0x00d59c47,0x74c5903a,0x09fea396,
  209973. 0x15043dd0,0x6aafd8ee,0x5f1ecc20,0xc5721a6e,0x0db9b7b4,0xb6d6a483,
  209974. 0x66c8d52a,0x06ffc617,0xacc82a27,0x3de241d6,0x27f2f7a8,0x0605f052,
  209975. 0x6404decc,0x6a22953b } },
  209976. /* 39 */
  209977. { { 0x74fce389,0x92452d8f,0x2afa5564,0x059634c0,0xf0ed7825,0x9377ccbb,
  209978. 0x37718e0d,0x89f4045b,0x9fa69a4d,0x11074e7d,0x7295b0ba,0x5d70bb07,
  209979. 0xf107ede6,0xb22d54ad,0xa1a29c7b,0x5c39a3d8,0xd795e3ab,0x37236c02,
  209980. 0x2b589951,0xf7282d00,0x5790bee2,0x5e2265be,0xa8e65ea2,0x91e0ea11,
  209981. 0x6001cebd,0x0e71a708,0x2c1c5402,0x16900f5a,0x357f6981,0xc3b2d5c0,
  209982. 0x619e3427,0x528c9ea0 },
  209983. { 0x5f26c577,0x1edc86b4,0x9438bd45,0xf8074708,0x792582a7,0x2dfe1013,
  209984. 0xde1e569f,0xe08eaca0,0x9a55a356,0x5f952efa,0xe4976216,0xa4d80b53,
  209985. 0xcd5d71f2,0xd2b65855,0x66cea3f0,0x246704bf,0x492323ca,0x193f641f,
  209986. 0x9adb1325,0xa681855c,0x2d19d652,0x86d522ce,0x5b82ed7b,0x53609f10,
  209987. 0x8e150d29,0x3b0f0094,0x0b13e891,0x23ad8bfb,0xf794b449,0xcbb1556c,
  209988. 0x738bcf57,0x200f9093 } },
  209989. /* 40 */
  209990. { { 0x8388387f,0xf9b22fc5,0x28e883c5,0xcf26f170,0xd1b7973c,0x447cab90,
  209991. 0xf6ec9171,0x8d5d4ea2,0xc30cdbc0,0x2e16f498,0x48623c2b,0xdc92910c,
  209992. 0x30dbc545,0xeb1491b0,0x14de21b0,0x631deb2e,0x2fe830f4,0x04a21066,
  209993. 0x379c1f3f,0xa4c6979c,0xfb06a795,0x8a732b68,0x1619dfa9,0x3a44327a,
  209994. 0x8dbe2c9b,0x91a307d3,0x03989fea,0x939bc8d2,0x0f4a331f,0x3daabaf2,
  209995. 0xdd0f55dc,0x5c307e98 },
  209996. { 0x35b233da,0xbbc4e0c4,0x22f6f985,0xe3d29085,0xa8b02468,0x99dd2d21,
  209997. 0xa96916e7,0x978f40e9,0x614bcced,0x0327d86c,0xb290762c,0x95e95502,
  209998. 0xa879f2ed,0x0ffd2197,0x50e0bd33,0xc4365137,0x0827c4c4,0x26c3148a,
  209999. 0x3fcfc0b2,0xc79812a8,0x31928589,0xc3d8d17e,0x8830f42d,0x8b572cfe,
  210000. 0x4b07f83f,0x7cd9ff92,0x0a51148f,0x331ca950,0x4c59f9ac,0xd0c53968,
  210001. 0xc1434785,0x1df16dfa } },
  210002. /* 41 */
  210003. { { 0x68bcacc3,0xcc7bb4ac,0x430f58cf,0x06ded34f,0xd461855a,0xc59f9f4f,
  210004. 0x45c9f0bc,0xf5491994,0x4375c892,0xdc5f7ec6,0x3c85983a,0x1b8708f1,
  210005. 0x82fcd087,0xb32a5cc4,0x2d6b4c0f,0xefdcdc35,0x8ac6fb2d,0x4bb24f04,
  210006. 0x33906471,0x5982d4f5,0xb83a3ac4,0x162eb52f,0x2337a223,0x7130df28,
  210007. 0xcbc3dbd3,0xdce7b802,0x2467ac0e,0x8b395959,0x1b56717e,0x21d3d2e8,
  210008. 0x46512617,0x729a7f50 },
  210009. { 0x8420f90a,0x874ed1aa,0x0fe4c855,0x6368e19e,0xb0be74af,0xb62d4aaa,
  210010. 0x8ca60ca9,0x76fcc480,0x7645a867,0xf310b5a5,0xddb1b24c,0x131bac9b,
  210011. 0x2dea5b44,0xef77d71d,0x72fcc64e,0x4706d210,0x673d77f0,0x29b92691,
  210012. 0xe89e0663,0x22e00bf3,0x74077d40,0x472d0cd3,0x829232e2,0x3e21040d,
  210013. 0x38dc8533,0x2f916dfb,0x14b8f667,0x48bbb59b,0xd44be19d,0x19de9f4a,
  210014. 0x232d9d5c,0x7f6d3649 } },
  210015. /* 42 */
  210016. { { 0x6e794819,0x3bd064de,0xf82ebda1,0x5a6b694e,0xb91e2804,0x1f017fe0,
  210017. 0x07a43cd2,0x190d31f3,0x630433e9,0x6c26f226,0x0abfdcb4,0xba488aa7,
  210018. 0xa46411c0,0x418d9085,0xbffb5880,0x1b934fe6,0xe200f849,0x75d1e237,
  210019. 0xa55413db,0xdf04d63f,0xe23b3f77,0xe216ed75,0x0f91bd30,0xa05866cb,
  210020. 0x7729c509,0x84c395d9,0x452ab2d7,0xec97e188,0x0093d686,0x8cb7c1f9,
  210021. 0x628f086c,0x2d032395 },
  210022. { 0x4a44b4c5,0xa81c9407,0xcc702c98,0xb9846879,0xceb0dc97,0xcb502287,
  210023. 0x6e3aa321,0x30301126,0xe4c256c2,0xc0ac8763,0xe55b4845,0x65034d20,
  210024. 0xf240f35b,0xaa96a040,0x7cf7eedc,0x046d26d3,0x3b810656,0x62a5a8e1,
  210025. 0x83d70c2b,0x86044b97,0x59e4da8f,0x2fbaff88,0x5457f5d1,0x929d901a,
  210026. 0xb531b757,0xd29e1eb2,0x9e4e9739,0x214dabdc,0x4eaa9bd9,0x5bd724fc,
  210027. 0x1ef9bb9b,0x734c12b3 } },
  210028. /* 43 */
  210029. { { 0x92f9b086,0x98fe3c2e,0xb3fd4544,0x4641b93e,0x5c02c65c,0x47ce208b,
  210030. 0xc4f03242,0x8a52dca1,0x679d29f6,0xb5ec17d9,0x9406f5f4,0x11d2fed0,
  210031. 0x0d9ba811,0x260f63dc,0x15472a3f,0xde2b056f,0x007290e6,0x1b170d9f,
  210032. 0xb6b5c8f9,0xa2e23e8d,0xcf34c3ee,0x345a2839,0x1b973ee2,0x9bdc5461,
  210033. 0xbb24d1c5,0x65bda6c2,0x3c6141a1,0x97d52ba3,0x9d2eb201,0x47bb1612,
  210034. 0x21fbe49f,0x7c558a87 },
  210035. { 0x3f350fec,0xb9485a52,0x6a38d4c0,0x016678c5,0x0d5aa64d,0x8ef346a2,
  210036. 0xd96da2e4,0xb85daa02,0x4f647b3c,0x845ec4ea,0x0d5e946c,0xc0d1a6ca,
  210037. 0x4fa9f4ab,0x41d8d1c1,0x9c8b1303,0x43972cc5,0x434ffbfb,0x67e1f48d,
  210038. 0x819d2318,0x350ce93a,0x6ddef23f,0x49f53090,0x200cf12c,0x3c2e6cf9,
  210039. 0x640432fc,0x42691cc1,0x72496b52,0xbfff74b4,0x020a97be,0x44527c9f,
  210040. 0x7b3c4348,0x34cd7dca } },
  210041. /* 44 */
  210042. { { 0x59e7fe87,0xf031761a,0x0047cd72,0xb1eae31a,0xfae30f62,0x27902e68,
  210043. 0xb71db143,0xa666f48d,0x0e0038f4,0x75ee6678,0x02bdd76d,0x3b45ac67,
  210044. 0xa0d6cd5c,0x0d2fb828,0x9d8c5b11,0x27ce7f1d,0x120b5e96,0x141fe0e4,
  210045. 0xb9267c37,0x95a1b984,0xd60312cd,0x5206e589,0xda549356,0x1867342e,
  210046. 0x070c74ac,0x374520b9,0x9557b0b3,0x2703cbb5,0xa6ed8c14,0xf621f59c,
  210047. 0xabf7b887,0x7ceb1cc2 },
  210048. { 0xdb7fd65b,0x0647a5bb,0x36c9457c,0xd8d45cc0,0x9e12718a,0xc6da99db,
  210049. 0xe93a7fb1,0xed1dbbf4,0xbd1566a1,0x4512c95c,0xdbc0c919,0x4861ba00,
  210050. 0x9e7f5269,0x3c6cc298,0x0941aaae,0x67196150,0xc8c538e3,0xbfcf5d0f,
  210051. 0xa25a551f,0xad6e9929,0x17ca0f26,0x90710985,0xfa89ef7e,0x743b78ea,
  210052. 0x71ab4549,0x39d5ea31,0xe6d1c36d,0x7442f3f3,0x059d568d,0x25a683e0,
  210053. 0x227ced5c,0x1f629a99 } },
  210054. /* 45 */
  210055. { { 0xe45a1c3e,0x8925ddac,0x41f7545f,0x72d29365,0x37e7f828,0x45622fcb,
  210056. 0x3e4c79d2,0x88234513,0x9c2645d6,0x5dffaf84,0x994802b9,0x3078f4dd,
  210057. 0x9d339fa0,0x566927f0,0x9fd91dcc,0x9a500a1e,0x0ab0abd7,0xce008180,
  210058. 0x8194e5df,0xd97135a3,0x98adf088,0x9e876307,0x9a45a2a7,0x3baf01b8,
  210059. 0x788b4399,0x6fed6154,0xe77a997d,0x980e5722,0x2a378eed,0xaac90ffa,
  210060. 0x8bd805a2,0x4a75fda2 },
  210061. { 0x55e74cbc,0xd09a8fbb,0xfab18f25,0x737738ce,0x9764ec3a,0x0fc23ad6,
  210062. 0xe7e0ad31,0xc5a7d35b,0xe481cc9b,0xe75e068e,0x3d4aec34,0xf0c2ea99,
  210063. 0x0d4a63c4,0xf1324fe8,0x99b0592c,0x5dbb7c16,0xa7e0f46b,0x442d674d,
  210064. 0xa300faea,0x5a5d66c7,0x3333ac83,0xe83dc821,0x8c408496,0x70ef812e,
  210065. 0x99ef5fc1,0x96e1dcb6,0x1734e862,0x6e2b771b,0x583507d8,0x04629cdc,
  210066. 0x23d8179a,0x5819f9ae } },
  210067. /* 46 */
  210068. { { 0x6aa78811,0xd9969121,0x2103e7c3,0xf64ee8f4,0x22b9e698,0xddf01070,
  210069. 0x4f582cde,0xe6001f9e,0x2ecfac1a,0x24a608af,0x06393009,0x6ef4c784,
  210070. 0xebf72911,0x5262eae6,0x8c4ee5a0,0xddbd0af5,0xecd87bc7,0x875aff90,
  210071. 0x6f24f114,0x2fddb34c,0xe865f172,0x48104281,0x886c1b9a,0x95692426,
  210072. 0x9ef4231f,0x6f5f3208,0xd0a7e82e,0xaf587acf,0x9ac395c8,0xd6571917,
  210073. 0x1364a750,0x7459603c },
  210074. { 0xf41ae519,0x1c2475bf,0x4af8f251,0x34401fb1,0xaefb2c3d,0x70ddfcd2,
  210075. 0x51cdaf08,0x9b2d385b,0x8208bb19,0x8531c256,0x4c33f3f6,0x16c89df6,
  210076. 0x24571769,0xc23cfa99,0x86d010ba,0x2339b51e,0x22638313,0x08db0e8d,
  210077. 0x00fedeb7,0xf769e179,0xa3687ef1,0x3fd96dcb,0x91476475,0xcd046b23,
  210078. 0x0c45c8dd,0xf3ff2064,0xb8343d78,0xefd167bd,0x4b77ee90,0x493ccb6d,
  210079. 0xb3cf7b45,0x33025513 } },
  210080. /* 47 */
  210081. { { 0x35eaaca1,0x36f00469,0x89119102,0x0c384b75,0xe6d2954c,0xcb375665,
  210082. 0xb1e9d6d7,0xcb9199b9,0xc29c2757,0x75852349,0xb8e738d0,0x89cbd1ba,
  210083. 0x5923a427,0x9b8dbe90,0x18fe1889,0xa237793e,0xa742e083,0xa4271757,
  210084. 0x4eebd613,0x8c4979d2,0xd4f2cf77,0x40325054,0x958705de,0xa3b8a091,
  210085. 0x33d999ba,0x1b191bd9,0x3b0fee1e,0xbafefba4,0x3facdf14,0xb3bad184,
  210086. 0x4387561c,0x9328adb0 },
  210087. { 0xf906b872,0xabe84e80,0x78262665,0x705523a0,0x3398ccf7,0xd89c6a7e,
  210088. 0xf55b5323,0x2fab551d,0x0554dea8,0xa0578eca,0x375589cd,0xef26523d,
  210089. 0x864ad750,0xd8fd6242,0x178fe1fe,0x93f27fc5,0x9df87422,0x7b3e6f30,
  210090. 0x3750d054,0x2862e49e,0x5dc038a1,0x7d90c6b2,0x84db682b,0xc1a1ae22,
  210091. 0x9881930a,0x47f3dab7,0xbaf3e0a4,0x30e6bd52,0xf62d25c5,0x0680025b,
  210092. 0xadd0d5e7,0x0aa1f3cf } },
  210093. /* 48 */
  210094. { { 0x22a10453,0xa9822190,0x2a03a10b,0xdd1eb91c,0x96646f3b,0xafbb5d95,
  210095. 0xf38b6fc6,0xa58de344,0xb8cfca1d,0xce47c3e5,0x0f70da04,0xfcd8e16d,
  210096. 0xda262ed6,0xac44349b,0xc56e2f8e,0x9320d87b,0x19138e58,0x9ce3ea08,
  210097. 0xa2b236c0,0xa5862dff,0x8e7efb0d,0x6b0f9a5c,0x16ac78eb,0x4b53432b,
  210098. 0x709b51af,0x6ff43105,0x8f519628,0x08e236f8,0xeed403ad,0x1f93f176,
  210099. 0x9636545e,0x559337e0 },
  210100. { 0xd8fd807a,0x30ddf738,0xab131222,0xf4e0ec9d,0x625afbc3,0x14a2f4db,
  210101. 0x9f12f895,0xd5b70604,0xac3044fd,0xb46f3c23,0xf540148f,0x1b232d1f,
  210102. 0x39b4e554,0x61b458f5,0x0dd70b75,0xf694b24a,0x289581d9,0x0fc64299,
  210103. 0xee5fe22d,0xc05d49be,0x6a18bf63,0x7af3447f,0x7f1929d6,0xe96a1dc2,
  210104. 0xc1551e8c,0x6afe6028,0x2b5d4fa2,0x27dacaf3,0x545c2cb4,0x4a1631bc,
  210105. 0xb0c914d3,0x930070f9 } },
  210106. /* 49 */
  210107. { { 0x69a9bc05,0xd2f32c5e,0x589c4b73,0x0a5c19c6,0x94665f9c,0x095c9e5e,
  210108. 0xbcfb4c39,0x8ab0f293,0x1ddb7c31,0xb9070877,0x66b38048,0x894e9658,
  210109. 0x606bd9bd,0xf19a90cf,0xb6fd2d69,0xcc1d58df,0x461d8a69,0x886dcc4e,
  210110. 0xf9ce4831,0xc455c277,0x765f8a82,0x749a5996,0xc3badc8d,0x2ffc668c,
  210111. 0x9112cdab,0x38018396,0xb243c7cb,0xa98795c3,0x010a2224,0x8775f310,
  210112. 0x587b5e14,0x043a2141 },
  210113. { 0x3a873752,0x7bbe9dbc,0x2f442fee,0xee1493f4,0xc18c2181,0x981ca2c8,
  210114. 0xe29769e7,0x00ce3090,0xde768c5f,0xb4626ac8,0x34d7677e,0x33e9ce46,
  210115. 0xe0fa94e6,0xf89c2cad,0x41f5b5bf,0x04f5cc11,0x2228c12c,0x2565f736,
  210116. 0x0c05cce5,0xf1bf706a,0xbe487c4f,0x5d07ffff,0xa499f1a4,0x3ec43c09,
  210117. 0x98d94800,0x4f4e79bb,0x073f12f8,0x8a335a16,0x0f970d6d,0x4bb5eaf7,
  210118. 0xf24d0ae8,0x18d0747b } },
  210119. /* 50 */
  210120. { { 0x84601faf,0x58d3c77c,0xaf1c1f72,0xc9465be2,0xd116d806,0xff626798,
  210121. 0xd5b0d93c,0x3996c0c6,0x5ec6723a,0x2fa1ad75,0x03ba5349,0x966a8144,
  210122. 0x2ac34d8a,0xdc4c9422,0xed675865,0xddf471de,0x953d528f,0xd8aca597,
  210123. 0x24ebf67d,0xb2e463b5,0x7e25b4d3,0x25824871,0x43159daa,0x23c5adba,
  210124. 0x83357540,0x5458f9c6,0xf938b1a6,0xcf685da7,0xcefed231,0x981a4fda,
  210125. 0x08bb5e59,0x711093ed },
  210126. { 0x401f161a,0x12aa3fc6,0x974c5e87,0xf7358560,0x17b5df82,0x4aa252fb,
  210127. 0xa48e6299,0xb0b82b07,0x29dd847d,0x00234157,0x4529c5a6,0xf1e54d00,
  210128. 0x6d98f538,0xcc1c539e,0x28d3abcb,0x36162b53,0x2a84f0cd,0x75a37938,
  210129. 0x4dee7484,0xf717a81b,0x4c23bf1b,0x16cf35fb,0x787e8b3e,0x7fd1c29f,
  210130. 0x59b79ab0,0xb7da7e68,0x85f6c60b,0x072100a0,0xe7ed48b5,0x31840159,
  210131. 0x4d9c97d4,0x17898bda } },
  210132. /* 51 */
  210133. { { 0xae1b8cf8,0xcd8483d8,0xe9a28856,0x323d4b42,0x204a4bc2,0x7633584f,
  210134. 0xca7a69fa,0x4e0b2228,0xf757bab2,0x8afbda8b,0x6cc5f9ca,0x85b24088,
  210135. 0xd41a95c3,0x47fb4813,0xc2aabe6b,0x3f1bc53c,0x1ad1599d,0xf22cda3f,
  210136. 0xc31ea9b1,0x1b2ec081,0x01614ac1,0x048f304b,0xc6afa7ab,0xce31cee9,
  210137. 0x4140dc3d,0x55af7633,0xdce8abba,0x84b7ab37,0xc7cf3efe,0x50de7648,
  210138. 0x15356ab2,0x73a88dcf },
  210139. { 0x06e83b39,0x3f868288,0x9f44037d,0x477a4413,0x17dbc841,0xf9058b0f,
  210140. 0x54d17549,0x2db64f4f,0xf2307ffe,0xa23cea6a,0x4f126261,0x393efd55,
  210141. 0x10f37f26,0x2f4e658a,0xf4ee1e35,0xa4437ce3,0xa93cde8b,0x64ef42a7,
  210142. 0x939aa901,0x1debc9f4,0x3d7b5cd4,0x44223d6a,0xf88a3acc,0x789a6a11,
  210143. 0x2c608a2d,0x56fb9df8,0xbbf56c06,0xe79db8e3,0x668fa300,0x73c56af2,
  210144. 0xae396a1e,0x52f32b17 } },
  210145. /* 52 */
  210146. { { 0xe714f71a,0x56f524c1,0x9add8519,0xc1be1262,0x65cadbe3,0xad9189d8,
  210147. 0x5a0fb649,0xd88bf5c8,0x21d192d9,0x9efa6a92,0x6f724b6f,0xe3fe8389,
  210148. 0xb250119c,0xec3fae24,0x2ae0d3c0,0x4b6af9f6,0xd619624d,0x8fceba0b,
  210149. 0x2fdb6e3a,0x7dc3092b,0x3263cd29,0xc91da376,0xf95c43bd,0x30c0761e,
  210150. 0xcdeb44d9,0x89136400,0x43c0d31d,0xfd7dce84,0x9871899f,0x78fec3b1,
  210151. 0xefdf58c1,0x79e14d28 },
  210152. { 0x9bb40c55,0xe3822235,0x0ed07a42,0x0a27202d,0x4838c1f4,0x48e6c1a9,
  210153. 0xd864a78e,0x2b5f24a7,0x0c6c55c9,0x7e7f140a,0xce12d508,0xe62c104a,
  210154. 0xc11b1e10,0x9b0a1a7e,0xafbb3dd5,0xfd8a275f,0x9a3b6b30,0xdff354fe,
  210155. 0x46602a01,0x5a105d9e,0x93bb65f7,0x3d371b4d,0x0f82fdeb,0xda5cbf0b,
  210156. 0xde468545,0x4601229b,0xc73d517e,0x505e10b9,0x672ff492,0x77cfa541,
  210157. 0x99566ce2,0x0d8ec28a } },
  210158. /* 53 */
  210159. { { 0xcbeee995,0x014cf73e,0xd491e80c,0xb2eb88bc,0xd9aba5d4,0x615a6cad,
  210160. 0x9304c84d,0x2f7d4633,0x8ab03c9a,0xba0501d2,0x91babb94,0xc8f723de,
  210161. 0x50405772,0xc885f977,0xc7fcb094,0xb5e1d2b3,0xdf96c71a,0x61ee7995,
  210162. 0x3464499e,0xb8c8daab,0x5f607932,0xdb425ddd,0xb1243587,0x70251ca1,
  210163. 0x9fc74340,0x26d7d3be,0xc902ac89,0x8c179310,0x4559a74f,0x72522c15,
  210164. 0xc3734afc,0x86001e27 },
  210165. { 0xe7693947,0x13b00ba5,0x012c062b,0x6478641e,0xe85490a8,0xe1a438e0,
  210166. 0xd9574d5e,0x5173dbbf,0x9bd3ba61,0x9532eb8c,0x5f3ea075,0x1f41bcb8,
  210167. 0x8cbb92b9,0xac1cc247,0x1ef901b4,0x0f34648e,0xd2b3b2ee,0xdd929d1e,
  210168. 0xc3d75bfc,0x470f1eab,0x139cf4d2,0x5cdbc6f7,0xf0424953,0xcd86454d,
  210169. 0x47fcb383,0x1e079812,0x17df930c,0xb9f209b4,0x114ebc00,0x4225fc31,
  210170. 0x347946c1,0x020591cb } },
  210171. /* 54 */
  210172. { { 0x275e0af4,0xe3003721,0xe78a4a4b,0x721141ef,0xd1757485,0x666cfcf6,
  210173. 0x168e659e,0x5fa1d737,0x0e2842ee,0x263e3e54,0x948bd5f6,0xadecc3d4,
  210174. 0x246b104a,0x019de03d,0xf343d818,0xf8a9e903,0x5b0c0d31,0xcb57ba4a,
  210175. 0x51e2765f,0x8246c506,0x6519bf67,0x80c5751f,0xf2119a01,0x5f05c200,
  210176. 0x7821d4f4,0x7e6487b8,0x261c3a06,0x262f94aa,0x72146052,0x56cfe489,
  210177. 0xa1df05ef,0x5119985f },
  210178. { 0xb18586c0,0x5819497d,0xc6eeaa62,0x004415d6,0x97cda28b,0x7c6a46b6,
  210179. 0x7c194594,0x9a149b28,0x4ed3a506,0xb56369fa,0x43c94cb4,0x7092aa66,
  210180. 0xa9e9eee2,0x55bce73a,0x77893509,0x34bb2870,0x06eb5326,0x8af95fb0,
  210181. 0x9638f485,0x87cd0323,0x5ba75bf8,0x29376268,0x9d42d581,0xf32d6f3d,
  210182. 0x65c6d64d,0xa4cad574,0xb2cded41,0x985f50fb,0x9006a067,0xcf34ce0e,
  210183. 0x58a57f9a,0x59eaf265 } },
  210184. /* 55 */
  210185. { { 0x6ec3876f,0x7b407efb,0xf0f48648,0x780c6123,0xbf893039,0x2abb56ff,
  210186. 0x45a91ab0,0x9592eaa0,0x78811b82,0xce5b84d7,0x1f9f3fc9,0x86a71a34,
  210187. 0xf0e7e13b,0xc17fdd86,0x655a0880,0x88ed8297,0x81d5e666,0x75d6dc74,
  210188. 0x1d171797,0xeffc9df6,0xe3f79e1f,0x36ad4c8d,0x2046192e,0xdb15317d,
  210189. 0x274fda62,0x78c9fa7a,0x82dd9914,0x04ec924f,0x3a64971c,0x059d1e38,
  210190. 0x2620bbfb,0x3b4450ea },
  210191. { 0xc776dcdb,0x3db7a955,0x81c8ba47,0x35c4a57c,0x505760fb,0xae285003,
  210192. 0xb3aec353,0xe3e80691,0x47117be5,0x380335be,0x056ccf61,0xe1c47e3a,
  210193. 0x33977916,0x253cfdeb,0xf5cb7ee1,0x3decdfba,0x7cf4b704,0xf3c9794f,
  210194. 0x9ff81462,0x2401680c,0xbe3daa9f,0x4e440e11,0x69f91d8a,0xc5d04377,
  210195. 0xcb5e9c5d,0x4106c7a8,0x33b7d24d,0x191909a1,0x3764b4a2,0xe893c838,
  210196. 0xc429b614,0x4a7fe30c } },
  210197. /* 56 */
  210198. { { 0x2455c7c5,0xe78f3a70,0x70157754,0x5b7636e8,0x7623262c,0xf32c4524,
  210199. 0x1bc780c7,0x2c98b11e,0x915ed877,0xd48eaeac,0x199265f4,0xbb04d3c0,
  210200. 0xcfa5200f,0x6b52b19b,0x93ea3fe8,0xc46a0981,0xba758059,0xd82c733d,
  210201. 0x1896aacc,0xd324bbd6,0xce8ecd51,0xac09a2fc,0x02fc44b3,0x529918fd,
  210202. 0xaaa1784b,0xf0c45e4a,0xfe22085c,0x35626340,0xc50c7d61,0x53cbb676,
  210203. 0x65126b23,0x83fa1ea3 },
  210204. { 0x10ccc646,0x60ac86da,0x7b0451e9,0x2ce0637f,0x8a088610,0xbbbcf630,
  210205. 0x20349982,0x23c19019,0xfc0bcda0,0x707fc39c,0x1bd4fd7d,0x7f4d1f15,
  210206. 0x44713bbb,0xd6a64e74,0xc5ac9e60,0x57bdc676,0x37b61169,0x456c5303,
  210207. 0xdcf40a1d,0xd3451396,0x4997d2c7,0xf3edec25,0xc2c4a739,0x534ae9a4,
  210208. 0x6a6ad2e2,0x1401397e,0x23e95f81,0x20769d4d,0xde98fabf,0xcee007c6,
  210209. 0x931c51e0,0x61409779 } },
  210210. /* 57 */
  210211. { { 0x15156623,0x3ddb32db,0xab7a67c2,0x68137fbc,0x6f19e3c2,0x26011f50,
  210212. 0x89924c61,0x34218b02,0xc6804c1c,0x492a0b0f,0xafaae6a7,0xd65be706,
  210213. 0x0d01be61,0x3b13d23e,0xf87f4c69,0x44545b47,0x04dc1aa3,0xd42236e2,
  210214. 0x3c5161ec,0x6135261d,0xbd88bc07,0x1eb46a63,0x1599d720,0x78c6d836,
  210215. 0x69baf0f3,0xf6955fe1,0x17072820,0x467eebd6,0x3e3a340a,0x2f1b8a2a,
  210216. 0x2d0b5f88,0x636dac76 },
  210217. { 0xb4c80af3,0x94280db9,0x4e3892ab,0x9a189cd1,0xd1477ddc,0x26e702e0,
  210218. 0x68f9f14f,0xe91aee38,0x80baa0b2,0x2864f63a,0x8b714a29,0xacd81f73,
  210219. 0xc5fe7cb6,0x30e1b870,0xb10837fd,0x883ea1c3,0x6b20489f,0x2da27953,
  210220. 0x58a2da5f,0x3aeb2a68,0x03a8fa14,0xe2330bf2,0xdc70b1c4,0xb5c488b5,
  210221. 0x299678f4,0x0a78c4d9,0x25df675c,0x233bd098,0x7b67d368,0x37b5c076,
  210222. 0x4d0bef3f,0x2f6dbdfe } },
  210223. /* 58 */
  210224. { { 0x2e4da7c7,0x2f8472fd,0xae677932,0x708cfc91,0x3dc268e2,0x364af08a,
  210225. 0x799a2424,0x0f10dfe0,0x71d58bff,0xef912d58,0x988962e6,0x6bf35dfc,
  210226. 0x5f47ea0a,0x28b96fa9,0xaad308c1,0x734a79ea,0x9f437bba,0x95730337,
  210227. 0x6cf54f75,0x002cbd8e,0xe7632eec,0x47606dcf,0x53193104,0x404b5ecb,
  210228. 0x0acf729d,0x0ae0897c,0x3bddf1de,0x89628b86,0xf87d7448,0xeced154e,
  210229. 0x458d5d4e,0x5cb6e197 },
  210230. { 0x008c75ed,0x98cef197,0xf6eeaaf8,0x7cf49d3e,0x1875e96d,0x1d6f9e02,
  210231. 0xdd9b0d8a,0xfcec2cfe,0xb9576daa,0x38a61cfe,0x36a7dbb8,0x10003f39,
  210232. 0x23b814f4,0xb37c3868,0xb80e3153,0x9fb66dcb,0x059847a8,0x9e7e2eba,
  210233. 0x35a72770,0xa4ec63fd,0xfc9e0ed0,0x311f3d91,0xd515baa4,0x3c1dc094,
  210234. 0xa08cd4e3,0x75a06ebc,0x2ed5eeaa,0xab617238,0xe1f52c1f,0x2e82bbb0,
  210235. 0x5175d6e5,0x2149d630 } },
  210236. /* 59 */
  210237. { { 0x5f9311f6,0xee1a8e6f,0xbabc1f85,0xc97e3c9f,0xb494209a,0x4fa7c52e,
  210238. 0x19774fe1,0x04c2f51c,0x8555844f,0x5cefd122,0xb5873ab3,0xb53862a3,
  210239. 0xcbed19fc,0x768efdd6,0xee58469a,0xcdc12479,0x3d80c09c,0x11237e31,
  210240. 0xc044c28c,0xdd74a290,0xbd47e287,0x9ee6517a,0xad0ffeef,0xc2421228,
  210241. 0x818d281f,0x4273088f,0x43ec0de1,0xebc744bc,0xb415bd73,0x5b26eccf,
  210242. 0xcb07c26c,0x14e2f350 },
  210243. { 0x4216946b,0x548d2a10,0x7a4bd92d,0x6e801f07,0x43695160,0x5996d0a3,
  210244. 0x63a197c9,0x0f1b5c2f,0x061f77c9,0x79da3c4f,0x93ff7b22,0x1c1cd634,
  210245. 0xa234123f,0x5e61b650,0xf284033c,0x826b34c5,0xc2f34214,0x718b90e8,
  210246. 0xae806ec5,0xa5f35620,0xe324a9b4,0xa2fae345,0x8b53cb51,0x8c0bb95e,
  210247. 0xf9965778,0xc94f6ac2,0x6b9def32,0x07ec607d,0xd0ed8f27,0x63bf1dba,
  210248. 0xdcb61e4f,0x58537e02 } },
  210249. /* 60 */
  210250. { { 0x64f80ba2,0x1f64b064,0x0559a45b,0xe8e055e7,0xf1f4b634,0xc3262b34,
  210251. 0xde8c8482,0xef4f7d5f,0xc30c780a,0x9d55dea0,0xcfa1e693,0x1740afb9,
  210252. 0x7460c34b,0x2cfe6a66,0x1187c1ee,0xf6695941,0x5f974d94,0x1382f277,
  210253. 0x004549eb,0x1ca0ace4,0xbabded02,0xf8244b3f,0x4e3653ea,0xc36f4d06,
  210254. 0xc55c5f83,0xeab9f0dc,0xacebce90,0xd93b9cef,0x19061425,0x16658e72,
  210255. 0x82d7970d,0x4857835f },
  210256. { 0xd2576210,0xdcd525bc,0xd51b5443,0x9f378aa7,0x1bd83994,0xfe97bf17,
  210257. 0xf38ac621,0x930d0f63,0x818408cc,0xaf8f2c17,0x260f53f6,0x2692c87e,
  210258. 0xdb0a75e4,0x0ee45407,0xffdb1b37,0x0ec47ae5,0x7aa6a44b,0x769129dc,
  210259. 0x2e40b75d,0xb6f932b2,0x95ef3b77,0xe06764d0,0x68bc63e8,0x28fd47f5,
  210260. 0x9c0014c0,0xd1810494,0xd7995d8e,0x90e2d3fd,0x6c2a85af,0xeb39a05d,
  210261. 0xa21f3128,0x6c0277bd } },
  210262. /* 61 */
  210263. { { 0xb509e7ef,0xe41b7086,0x3d7f9f91,0x8842ec7b,0x5526b88b,0xcd285f94,
  210264. 0x051dd0ab,0x6e44e064,0x774f1ceb,0x90198c10,0x123e661b,0x6ecabe98,
  210265. 0x32f647d9,0x44811136,0x26c52aee,0x1dd82b45,0x939dc9d5,0xd650907f,
  210266. 0xfcd455bf,0xbd5eeef2,0x8d2e5d7c,0x7815a4dd,0x88bc9f2a,0x5ad4ec92,
  210267. 0x57a3b322,0xc6f10d0b,0x20b9cbdb,0xe8d0c1e7,0x9b774ee8,0x5a0b071a,
  210268. 0xf22fcf8f,0x3067bc9a },
  210269. { 0xb7ca9326,0xe0e589f2,0xb1224f63,0x17a106fd,0x747a57bd,0xb2354521,
  210270. 0x62b0882e,0x2614982d,0x4391ffcf,0x7f3af544,0xa84e440d,0x1aaa337b,
  210271. 0x941bb071,0x28ea37b0,0x2e4a7f54,0xa957dcb4,0x1a6ad5fb,0xe7ab662c,
  210272. 0xf7c36a20,0xd135e381,0x9baa0b6b,0x42e7980c,0x94e4671f,0x4237030c,
  210273. 0x8b0922e3,0x24cc63ff,0x445a589f,0xd10d5279,0xa870ff6c,0xbb99d316,
  210274. 0xa996c195,0x390c83ca } },
  210275. /* 62 */
  210276. { { 0xffc4a73f,0x50d3fa82,0x3bd53303,0x2665d635,0x264bb77d,0x80a06f8a,
  210277. 0x22d73d84,0x81c04a6e,0x0323b8aa,0x2409cff5,0x8c4c4d5a,0x31dce217,
  210278. 0x0c0f9c19,0x374aa80e,0x00186bb8,0x0b25a387,0xaaf1487f,0xd0b77a10,
  210279. 0xab498de1,0x15f39ad5,0x1aa0c116,0x92e32da6,0x96e25ce8,0x228e3dbd,
  210280. 0x5e8646d1,0xb57c88dc,0x267b1c68,0x672b1164,0x600bdec5,0x5d0d807f,
  210281. 0x223e573a,0x3ea4007d },
  210282. { 0xa595d0a3,0xd76debd0,0xaff0b3b4,0xa6bd76cb,0x9b1bdb97,0xbf2c154f,
  210283. 0x4c714c71,0x62b19ab4,0x221af663,0xc9bf33b9,0x8c941ef6,0x23d87c49,
  210284. 0xd79f0f6d,0x255804c3,0x2a7acbc1,0x6f1a1005,0x550528af,0x5dab79d9,
  210285. 0xc8d16213,0xfd77a6f0,0xde5e1029,0x40508b6d,0xf95da12b,0xd95ac0f2,
  210286. 0x758a8ba1,0x8860af71,0x7160c8fb,0x0b194c83,0xce004d34,0xa40e6c80,
  210287. 0x6b14aaa0,0x09f82a17 } },
  210288. /* 63 */
  210289. { { 0xc21366dc,0x60abe588,0xaf75daf9,0x729c0a4f,0xacb93ed4,0x70501fd9,
  210290. 0x87a16d70,0xb97e744e,0x98e7361b,0xa42e0a7a,0x28b54cf3,0x1acdaff2,
  210291. 0xb7bd9078,0xf087ccbb,0x663250e7,0xda6f3983,0xbaf07c09,0x66d693ee,
  210292. 0x8cbaf157,0x79baf4c3,0xdfca99d0,0x5a984e07,0xf26d8dab,0xab4d3247,
  210293. 0x7eba36f9,0x4d0be701,0x0e8dd216,0x37bb9e65,0x531c4f03,0x72aa4e24,
  210294. 0xb753d85a,0x77d1e984 },
  210295. { 0xd8e62367,0xd9373239,0xb9820cf1,0x3361848b,0x5a9c97c4,0x00c7e344,
  210296. 0x14f960fc,0x9a0ec9ae,0x740474b5,0xcf41f0cf,0xece065d5,0xa5eede8f,
  210297. 0x9e808610,0xb1de5a4e,0xae0cf75d,0x17c44ae4,0x6b148d0b,0x2fa56323,
  210298. 0xd29ff2dc,0x64fa740f,0x88cb212e,0xc605eb8a,0x6a863016,0xf2c771ad,
  210299. 0x607b4c17,0x6d6112e7,0x40d49785,0xfe90ec07,0xe256e0e5,0x599be18b,
  210300. 0xca54adb0,0x4e6eabec } },
  210301. /* 64 */
  210302. { { 0xfb99cfe6,0x950323d3,0xc9334178,0x7b09bc26,0x7cbdfb6f,0x64111e41,
  210303. 0x89a75760,0x91141744,0x10919cb0,0x4c633df9,0x396bfd2f,0x715fc7c7,
  210304. 0x8cab62db,0x8ca19512,0x4db81aac,0x30672473,0xb4c4c54a,0xe67a246b,
  210305. 0xbf229646,0xd77ea0fa,0xfa5b5d70,0x5bed15f1,0xc2f192f3,0xa5686da5,
  210306. 0x7f6690ad,0xdecac72a,0xcaa50b7d,0x0c4af2a2,0x6049ad2f,0xf44631c1,
  210307. 0x04ecf056,0x325d2796 },
  210308. { 0x4848c144,0xee11fb55,0xb6a7af32,0x4e062925,0x369e0f9a,0x125b68e1,
  210309. 0xca53b21e,0xad9bdae6,0x2e98ea1b,0xf50d605c,0x9f2fa395,0xbdb9e153,
  210310. 0xe91532f5,0x4570e32d,0x46a250d7,0x810698ae,0xad9d9145,0x7fd9546c,
  210311. 0x11e97a5e,0xabf67721,0x249f82e9,0xca29f7d5,0x9851df63,0xa9c539a9,
  210312. 0x71d0e3e5,0xfd84d54b,0x041d2b56,0xd1e0459c,0xfd80096a,0xceb3eb6e,
  210313. 0xe32a79d3,0x19d48546 } },
  210314. /* 65 */
  210315. { { 0xb540f5e5,0xfe19ee8f,0x04e68d17,0x86d2a52f,0xadbdc871,0xd2320db0,
  210316. 0xd03a7fc8,0xa83ad5a8,0x08bcb916,0x54bf83c7,0x2e51e840,0x092133ea,
  210317. 0xcb52dddf,0xbce38424,0x31063583,0xd5c7be40,0x458e3176,0xc1ebb9df,
  210318. 0xbc4dabbf,0xafb19639,0xc05725a8,0x36350fe4,0x84e1cd24,0xac4a0634,
  210319. 0xc145b8de,0xadf73154,0xb3483237,0x0aa6dd9e,0xcbff2720,0xa3345c3d,
  210320. 0xb4e453b0,0x1b3ace6c },
  210321. { 0x90a8bdc5,0x0343e5e9,0x6306a089,0xa203bf9d,0x8e48520e,0x98489a35,
  210322. 0xde7d1d06,0xbd17debe,0x5f795d3f,0x8fafa6d7,0x387b0a3f,0xa4ceb630,
  210323. 0xffddeafa,0xe0166b32,0x7e764e02,0xa2fe2054,0xe871f304,0x55ab9824,
  210324. 0x952ec45e,0xa2bd36bb,0xa90d20ca,0x7b4c1484,0x75bcfb53,0x5319f387,
  210325. 0x6982c4e5,0x34238a4a,0xa102921d,0xa2bb61c7,0xdb3ab17e,0x1e061b64,
  210326. 0x192f0a14,0x538ec33e } },
  210327. /* 66 */
  210328. { { 0xa19b56cf,0x193496fe,0x7bb99acd,0x663d77f4,0x57d0a881,0x8f04afa8,
  210329. 0x082835fd,0xcced3da2,0x5d82cec7,0x7e21faed,0xf8009c85,0x6e175b99,
  210330. 0x2d05a307,0xd9c6e31b,0x81487d82,0x96948d4a,0xd46f6655,0x86ebd3f2,
  210331. 0x773ccc49,0x86851aa8,0x8b1640a6,0x3e220f22,0x41a20b75,0x9f06e3a8,
  210332. 0x90ac0a6f,0x2cfffe5e,0x8ebeb3fb,0xf5a9b1da,0x6e08e2c9,0x2587d997,
  210333. 0x03e9f401,0x6fd60298 },
  210334. { 0x8eb7516a,0x54709f8d,0xbdc598ab,0x83058a74,0x87e801ce,0xd234dd98,
  210335. 0xd17b8a96,0xfd0f9d90,0x6e90f6ab,0xaa1e549f,0x5a7ed55b,0x2496ff80,
  210336. 0x6c254c19,0x0d9f657a,0xb8962575,0x3cdea49c,0x2dff27de,0xb685a3f0,
  210337. 0xdb8bc04b,0x3c50e7fd,0x987236b0,0x904ff0ff,0xbb0d5055,0x494298fd,
  210338. 0xe14be8d0,0x34b3386d,0x7c3d30d6,0x7ad34e9c,0xe159fdd9,0x1f2b32bd,
  210339. 0xc761e5c0,0x84cfa23c } },
  210340. /* 67 */
  210341. { { 0x8b99b964,0x13bc11eb,0x58e2fc47,0x8e280c0a,0xd4c9a54b,0x870fbc49,
  210342. 0xbf6e20fa,0x37a334a2,0xd7c88cfa,0xee583d0d,0xef4af1da,0x05e029a8,
  210343. 0x0c2ef8a6,0x6d55e234,0x209e9b62,0x61b6fdfe,0xbb8e080f,0x3b1dad26,
  210344. 0x9392fc1a,0x5adbc162,0x0aae3f4e,0x02ac0fe6,0xc2bf4d5b,0x8d99801a,
  210345. 0xc282fed2,0x2333f93f,0xb52db33f,0x16dcb10c,0xc55752e7,0x09f90f84,
  210346. 0xc84a0d8e,0x287d4c51 },
  210347. { 0x0e9867da,0x5fa58201,0x1a874cda,0x614589b3,0xfbdee22e,0x005e27c5,
  210348. 0xe612bda8,0xe357fef5,0x2d3635f9,0x4e0dbedf,0x6f125a86,0x62be70e4,
  210349. 0x0d94a2e5,0xa09b9884,0x28b5e5d1,0x7eb99a15,0x751028b5,0x21b9416e,
  210350. 0xe06d2cc4,0x1b137fd7,0xfea09845,0x6fa1f517,0xffcecbd7,0x3ba1e966,
  210351. 0x832f453e,0xd4c89a4a,0xeca68fa1,0x07b1e2af,0x4bd395a3,0xd0fb4453,
  210352. 0xd8ef9e13,0x0132a3dc } },
  210353. /* 68 */
  210354. { { 0x576374c2,0xe53c7785,0x84727040,0xe60526d1,0x228ca044,0x8a066dc8,
  210355. 0xf1ce1313,0x1fe1c1b2,0xcdeb0c5d,0x2aeec832,0x9cbf826f,0xa7596699,
  210356. 0xde77a589,0xcd188e81,0x118d1254,0xe5ce0fe0,0x0790b86a,0xa142a984,
  210357. 0x39ac28ce,0xe28f043f,0x87de5804,0x4eef8290,0xf639a8c5,0x83c31b32,
  210358. 0x5887794f,0xd70454a7,0x18b1b391,0xca635d50,0x31d9c795,0xcefea076,
  210359. 0xb6f8aa25,0x13cbee76 },
  210360. { 0x8d3f34f3,0x79cabe0f,0xa3617fe3,0xbda9c31c,0xdd9426a1,0xb26dee23,
  210361. 0xf29c9104,0xe9dd9627,0xe2c6cd3b,0x033eb169,0xfcba2196,0x8a73f492,
  210362. 0xb858c83c,0x92e37e0b,0x23b3fbb7,0xe4f2aca6,0x64be00a2,0x8101fb1e,
  210363. 0x948f6448,0x91a7826a,0x907260e7,0x414067b4,0xe30bb835,0xf774aa50,
  210364. 0xc999c06e,0xf922ca80,0x0ba08511,0x6b8635b9,0x25fa04f0,0xbf936b5c,
  210365. 0xe02e8967,0x4e0a1ada } },
  210366. /* 69 */
  210367. { { 0x8ba29c4d,0x00ca6670,0x22988094,0xc08240ce,0x16dda752,0x21c5ca67,
  210368. 0xabbbfa34,0x689c0e45,0x3ed28b72,0x1d7545fd,0xd7c56ab4,0x5f221198,
  210369. 0x38759d65,0x4b3d8f74,0x8fe50b89,0x93490dfb,0xe80eba16,0xb641f5d7,
  210370. 0x79acb537,0x7b0da5eb,0x0c1d5e5e,0xab6b1497,0xa5da429a,0x2338e68d,
  210371. 0x2f6d2f25,0xe010c437,0x6530f3a7,0x226f16d2,0xcbef08bc,0xefb0f7b6,
  210372. 0x9f99c999,0x733e30d9 },
  210373. { 0xa42a38f9,0xecfe1582,0x4730b500,0xaec2d58e,0xde976b2c,0x2ee2f2a7,
  210374. 0xa969c1bb,0xf0539db5,0xfcecdb4a,0x31954168,0xe7a8e902,0xf2f7348a,
  210375. 0x3121541f,0x1d58d7cc,0x2202ae52,0x5d25b75c,0xf40835a7,0xdea9965a,
  210376. 0x529b4e46,0x3feb6a41,0xbd27ad9b,0x5c97fb6f,0x261f900b,0xd87554c0,
  210377. 0x04d5b19e,0xb43031d9,0xcb219b9c,0x33d5e9b8,0x3ee00bcf,0x7a43d492,
  210378. 0xb79a5c0c,0x56facb39 } },
  210379. /* 70 */
  210380. { { 0xa3018bfa,0x019165a2,0x9ffad984,0x100c6b24,0x55341a9b,0xbbf1b1f6,
  210381. 0x25dc4cc9,0xe6bd1d97,0x2bfffe60,0x52850ed5,0x7e5509ab,0x24e992cc,
  210382. 0x4ceb59f1,0xff6c502e,0x1aa7d148,0x2f0b3573,0xe7e3aa46,0xe90c1ddd,
  210383. 0xd1142880,0xbaec9f45,0x65be5dd5,0x475cfd26,0x1febce13,0x83abb14e,
  210384. 0x80942d30,0x6aba4829,0x297e82c8,0x1e1b235d,0x50d8218d,0xb771cdbe,
  210385. 0xd94d6cbb,0x88599266 },
  210386. { 0x155ccaf2,0x08847290,0x7c5b773e,0x8679ebc7,0xb2dd08ed,0xa88b2dd1,
  210387. 0x87d475db,0x960a180e,0x6694d02a,0x80fdb6b7,0x3f3f9e96,0x3e8758c9,
  210388. 0x4ad836c4,0xbda3f6fa,0x32fb387d,0x9400c581,0x2550200f,0x25a78542,
  210389. 0x776ecf18,0x2a97c351,0x566db59a,0x03ebf46e,0x26545eda,0x4743a280,
  210390. 0xcf74ab44,0xed169d84,0x88cb3f69,0xbaab931d,0xd8257196,0x70ae932c,
  210391. 0xa0c09719,0x797224a6 } },
  210392. /* 71 */
  210393. { { 0x441f3567,0x632923f8,0x2e24bf1d,0xc11c3168,0xb7671fff,0x4b97726b,
  210394. 0x7a5e1a22,0x601746a7,0x3addb417,0x53dddea0,0x7f59b846,0x57867a3c,
  210395. 0x56cd7ff7,0xb012a987,0xf19ba9a8,0x1bd5fec9,0xf8306748,0x750379a2,
  210396. 0xab8c05d1,0x7763445d,0x7903f42a,0x5d7f441b,0xa903e46d,0xc011674d,
  210397. 0xadd126c1,0x1b1d3c4d,0x61455b40,0xa2752aac,0x555c356e,0x4da42a68,
  210398. 0xd820852c,0x3ff09c15 },
  210399. { 0xf9cb7784,0x4c0a1bce,0x2422f305,0xaec539bc,0x0c414aa7,0x5f40f9fd,
  210400. 0xffd42bc4,0xd3aa316c,0x2f358e15,0x42f5a4c3,0xd6e27682,0x00bdcd9e,
  210401. 0xf8a5ecee,0x069f789f,0x05e14f5d,0x8078018e,0x8b40c741,0x2bb3e493,
  210402. 0x7917f72d,0x5dbc8c1d,0xcc57150c,0xe0eea664,0xc3fa8920,0xa25ecc5a,
  210403. 0x1c797164,0x3c21b0f5,0x634ad16b,0x8f09a2f2,0x58391d9a,0x8e730fc5,
  210404. 0x4fdfae4c,0x47ef1805 } },
  210405. /* 72 */
  210406. { { 0x3da285e4,0x9965f3d1,0x3a01e3f4,0xba7d4dba,0x61214ad0,0x4738413a,
  210407. 0x22397549,0xd3b7d535,0x5a730b92,0xa53dbdcf,0x332d165d,0x3130d92b,
  210408. 0x82f97ef4,0x44a28541,0x44dce1b6,0xbf62221c,0x7e2a0ec9,0xbba13858,
  210409. 0xcbfad998,0x33f32c8d,0xb5fed44b,0x409e5f3f,0xc66217bb,0x5c328c65,
  210410. 0xfcdf71a9,0xb00db69f,0xb8920788,0xa23c2a21,0x3ae6464b,0xf8ab28e6,
  210411. 0xb8de0861,0x1a6b6e9c },
  210412. { 0x06af77aa,0xaf6ec2b6,0xa887f065,0x2e60f5cd,0x9f498c56,0x87d21400,
  210413. 0xfcbaaf4b,0xdb595b59,0x271ab855,0x0fb592a1,0xd4349b0c,0xa0ce10e5,
  210414. 0x887d8c9c,0x9d6187d8,0x154bd6db,0x03ee95f9,0x5d06c999,0x8fe53213,
  210415. 0xfb6a64d0,0xf4a7bc30,0x66a4cb60,0x3d22af0d,0x5d37367c,0x16952cef,
  210416. 0x997d8e55,0x6f0ea734,0x731732d0,0xb447c70f,0xa9cb3942,0x00ab3034,
  210417. 0x28510fd0,0x79dd0180 } },
  210418. /* 73 */
  210419. { { 0x3ac7424e,0x04e0033a,0x60fda4d0,0xdb06b688,0xbcb772fb,0x236a9766,
  210420. 0xf297cda4,0x294a8e2b,0xdb013c6e,0x4b0aab85,0x8723a3ad,0x3d2aec98,
  210421. 0x13c84a6b,0x0cae32cd,0x70ec169e,0x21888f5e,0x42a88262,0x739633bd,
  210422. 0x7b60d9b8,0x68ac792e,0x10769fe1,0x89f2b722,0xd24bed34,0x8f3fcfe6,
  210423. 0xa3eb24aa,0xd35efb88,0x484c706b,0xddecfa3f,0x929ece0d,0x7cc119a9,
  210424. 0x8d405436,0x87e5ad45 },
  210425. { 0x7d1000a7,0xba99aa9d,0xae823833,0x8b94affc,0xdfb83dc5,0xc8229628,
  210426. 0x845a418d,0x2f59fe11,0x5d417054,0xa8b970f8,0x72b71581,0x8918c265,
  210427. 0xc0d1dd17,0xe4ef477d,0x3afad7c0,0xb50b4cf3,0x01870a5b,0x21baea79,
  210428. 0xbb3a2868,0xc77087f9,0x124a59cd,0x7857531e,0x57f43239,0xed74c26f,
  210429. 0x0164c94a,0xd5f5ae25,0xf094bf74,0x6608b7e2,0xfdceea32,0xf4cdb5ba,
  210430. 0x990cc045,0x0b712519 } },
  210431. /* 74 */
  210432. { { 0x88d5c64d,0x5a290ca1,0xa7492534,0x0596d749,0x2a00e925,0xa04b0d3d,
  210433. 0xcaf7b66b,0x082cd02c,0xecdded83,0x912b50c2,0xff31646e,0x813ce9de,
  210434. 0xc75fff95,0x62ae70c7,0x7e2a4615,0x6f6852e0,0x03804fd1,0x320fd7d0,
  210435. 0x8218e8d9,0xb1a2a4dd,0xafc645d7,0x4918a6fb,0xe8d9fdbe,0xfb080fa1,
  210436. 0x4470b6ee,0x33d4d08a,0x6d974ef7,0xd2ba2077,0x69dae5d2,0x8ecb95a7,
  210437. 0x7d69596d,0x7a3f423a },
  210438. { 0x9a929387,0x362d2ca6,0xcb1c1fff,0xabdb7581,0x7e51b6cb,0xd892ec9f,
  210439. 0x3a4e131f,0xee8d8632,0x5bd87561,0x4680e3f1,0xd4e7e732,0xe3a597e1,
  210440. 0x5581fefe,0x3cc72b7c,0xca8cae0b,0xf3e77f8a,0x5e2fd4af,0xfcc7d7dc,
  210441. 0x21355b79,0xdd3a4552,0xa2c07177,0x546b24f2,0x0689621f,0x415b532d,
  210442. 0x3f78163e,0x2be9af51,0x33d7ed21,0x27d63b9b,0x96802943,0xab019ef2,
  210443. 0x1623faf4,0x2da5fc55 } },
  210444. /* 75 */
  210445. { { 0xc8a5c600,0x62429cf3,0x3fe33e7c,0xa7a80c22,0x0a57ddcb,0x9ffda740,
  210446. 0x925b0c74,0xd1ae156d,0x6b100eb0,0x097a43f9,0xef943c81,0x169e945c,
  210447. 0x1128cf24,0xa1f734e5,0x419f0133,0x04387c4a,0x01044024,0xc007868b,
  210448. 0x90359cf2,0xe5416abf,0x478d54e3,0xf9c76fee,0x42a2173e,0x66219da6,
  210449. 0x9fe30141,0x61e03156,0x93ef247e,0xa0ff5ce3,0x072b6592,0x811792ba,
  210450. 0x70c854d3,0x855f0219 },
  210451. { 0x847314c4,0x61fbfb6c,0xeb45b96a,0x97906155,0x6ba2afac,0x7102e146,
  210452. 0xab949781,0xed51f975,0xc110c4fe,0x9d2f5b17,0xaff57667,0x7ac8ce70,
  210453. 0x6eb244e7,0xe7366a21,0x551c65c7,0xdd1bbcec,0xe1a859de,0xb525060a,
  210454. 0x8ba7d2e7,0x7a048174,0xab8ea8c4,0xe1a2c541,0x6fdff078,0x6e7824c3,
  210455. 0x14874b04,0x79b49fc7,0x06b1f733,0x22ae337f,0x6f8fe6cf,0x1c352192,
  210456. 0x525d0797,0x292236cf } },
  210457. /* 76 */
  210458. { { 0x7d8b29dc,0xcdb8d80a,0x08ea648a,0xd17a2024,0xae92be91,0x7db12c5e,
  210459. 0xfda72fbc,0x1f347d18,0x9e760c6f,0x11374b40,0xd8e38d91,0x7361e8f1,
  210460. 0x739ac1f4,0x7714be9d,0xb4df5c4e,0xc1f9701c,0x6f72cae1,0xd9138ed8,
  210461. 0x6ad180c4,0x1c7fe1f7,0x9e2dbf9c,0xf8c185be,0x7c70c44d,0x835db269,
  210462. 0xb0d15b5f,0xf997cfea,0x61e6545e,0x5101445a,0x25184e5e,0x16b06884,
  210463. 0x7521e7aa,0x7cfac359 },
  210464. { 0x3c0bc53a,0x81182167,0x7e751367,0x84b5ede3,0xa3657a18,0x3ca255fd,
  210465. 0xba1fdd98,0x096abbf4,0xc5da77d8,0x9ce8369f,0xaab342c5,0xf27b9ae7,
  210466. 0x972059f1,0x06c91bd6,0x914ecfe9,0xee0dab30,0x93f53f12,0xbb647fbb,
  210467. 0xffa57e0e,0x30c38a7a,0x9f2ad607,0x517d06ef,0xbb99dcc9,0x49728d87,
  210468. 0x446080a1,0xb0034af1,0x12b9c17d,0xcc810c3f,0x772a22a0,0x7225f14f,
  210469. 0x1ddf82bd,0x6ce3dc7f } },
  210470. /* 77 */
  210471. { { 0xa4397830,0xc07cd835,0xf4733306,0x4dd9290c,0x29989e8c,0xdd35d3a8,
  210472. 0x563d8152,0x79902559,0xe87de61b,0xf278d911,0x1024e35c,0x9c7340c7,
  210473. 0x4a0d0e59,0x2d444461,0xf32626a1,0x63e7608f,0xc4c9baa9,0x627a37e9,
  210474. 0x76fffd25,0x0c56dc51,0xcef2a1cd,0xcb6defc8,0xefc559d9,0xcbcc0d56,
  210475. 0x041cb692,0xe45f3fc5,0xe5161e09,0xcd05c239,0x5c3b559c,0x2a731ee9,
  210476. 0xa3d0a16d,0x85151122 },
  210477. { 0x86ff19e2,0x782d0335,0x1da28603,0xc2c60daa,0x557c7eed,0xb2e78cfe,
  210478. 0x1bc4e8b0,0xa8f6f984,0x3df35c67,0xcc1f9b4b,0x4764462a,0x96e13603,
  210479. 0x7c7ae0b0,0xbf910b97,0x51435956,0x27c7f305,0xf631eae5,0xc14db15c,
  210480. 0x7e69b34c,0xa51d6142,0x5fc12ff2,0xdec82851,0xfb887162,0xfcceae13,
  210481. 0xde1488bd,0xda332ac1,0x2ee3e74c,0xa20374e2,0xf0ae069c,0x597ea1a1,
  210482. 0x77bdec04,0x8b1159f2 } },
  210483. /* 78 */
  210484. { { 0x2f961d30,0x4af71a44,0x7ac7248f,0xbdf968a8,0xb1a906cd,0xd32df87c,
  210485. 0x04abf925,0x00c10e26,0xb9f04d4c,0xb8711759,0x939705da,0x00d54e60,
  210486. 0xc9f80849,0xf7587433,0x6a7a2375,0x2e9abade,0x94ac17ac,0x5676d478,
  210487. 0xc202d99c,0x4ca0525b,0xabfae73d,0x95b8bcad,0x3405991b,0x2371ed38,
  210488. 0x458a99c3,0x2b69e47a,0x2b78c866,0x7cac0b18,0xe0232c7c,0x6ceaa79b,
  210489. 0x588f7459,0x0bd86433 },
  210490. { 0x7e734189,0xdea1a8b4,0xcfe5fa17,0x52c5ac88,0x11437664,0x444a4d4e,
  210491. 0xaf9e9750,0xc2522308,0xd30c6b3b,0x78b1d0c3,0x4c6df477,0x2edae5f0,
  210492. 0x2ee88dd7,0x53131d9a,0xacc93e34,0xc4e380ee,0xa8db0e8e,0xd499b1ac,
  210493. 0x7f5d49d7,0x77348c16,0x1556ccd7,0xc9663257,0x2611d13d,0x65ce0e8c,
  210494. 0xb5a2fdcc,0x2c95fe66,0x8658faa1,0x26698832,0x31c32c98,0xda87d1f4,
  210495. 0xfcd91907,0x46650598 } },
  210496. /* 79 */
  210497. { { 0x6b4a5efa,0x4c6c13cc,0x1d07b265,0xc481989b,0x8bdc69c0,0x10b966ce,
  210498. 0x2c2531d4,0xf54cfaa2,0xcad0a100,0xcb5f1808,0xee5da449,0xbeb52538,
  210499. 0xbedd83cc,0xa6240085,0xd6255c78,0xe792dacf,0x2062058f,0x88371906,
  210500. 0xed1658c1,0x96615e83,0x7d28d542,0x4b549b27,0x83b75df3,0xeaf127db,
  210501. 0x17fbb942,0x4f60df6d,0xf6f7c930,0xd08631db,0x6018789f,0x17c38f98,
  210502. 0xb9a9280c,0x0c43574a },
  210503. { 0x1d20cad0,0x76eb324c,0x8c61108a,0x90decb09,0x6f06d36d,0xa6e9d39c,
  210504. 0xbc0da197,0x6cd978ba,0x507ac5ce,0x5948b1c0,0xc5497eb5,0x2bd47164,
  210505. 0x4d5914e3,0x2a9c4c0f,0xa759f03c,0x772c5046,0x69ac847e,0xe7d7328a,
  210506. 0x3048b330,0xa8d57d0c,0x40f7bace,0xe60034e0,0xa85f1790,0x823d9193,
  210507. 0x5c859736,0xa6e9b66c,0x679e1022,0x22ca2c7a,0x09023fa4,0x00e7a19c,
  210508. 0x2726d5b9,0x324999f1 } },
  210509. /* 80 */
  210510. { { 0x7c834915,0x667eaed6,0xbc5eb64d,0x9f77aa6a,0x25d62011,0x729ebcb6,
  210511. 0x699fd9c2,0x0aee24f2,0x2b8d4f6c,0xe1eb5874,0x14c976d6,0x7f12710c,
  210512. 0xf6d9ea65,0x91390335,0x06b50064,0x668b7049,0x0876ee4f,0x65969a0e,
  210513. 0x2f9d9360,0xf901bf3f,0xb499e3ce,0xfb1a8651,0xf2dbcaaa,0x80b953fb,
  210514. 0x973b06b6,0x312cc566,0x3af36c64,0x3534d9c3,0x10ffd815,0xe4463a52,
  210515. 0xf18c2b91,0x57ea2b4b },
  210516. { 0x8aa0f2f2,0x00f5e162,0x0e46bcaa,0x8c7e75c5,0xa4a2c42d,0x97ab479a,
  210517. 0x14baa202,0xb4f308ea,0x6943cc2e,0xa901bd14,0xeed58804,0xbb125fee,
  210518. 0x9d180f7c,0x6502c8f9,0x1580c61c,0xe5353919,0x27101ee3,0x7e278069,
  210519. 0xfaa72717,0x7a0a40a1,0x4c75b153,0x32edce02,0x538f1c22,0xda23660b,
  210520. 0xbe307d2e,0x4d511e98,0x9baee0b4,0x24276e40,0x7ff1f307,0xa78c3927,
  210521. 0xea7935c9,0x60480b46 } },
  210522. /* 81 */
  210523. { { 0x3872ece3,0x31087d66,0x955b70f8,0x5f29be7d,0x9cf95bb8,0xb50b4fc7,
  210524. 0xdbffa621,0xbae3b58d,0xe022ba5d,0x0e61d280,0x4181449c,0x78ae5117,
  210525. 0xcf555485,0x0b132840,0xb8ce0b0e,0x800ed1b6,0x78d5de3d,0x35dffdd5,
  210526. 0x69a56b47,0xf7e42374,0x8d910ae7,0xd5e32369,0x6313c7c7,0xb6ff52a0,
  210527. 0xa92de9e5,0x5a2fe20d,0xd12110bb,0x41b347d3,0x40c16f23,0xc5905edb,
  210528. 0x9a8f88cc,0x0774a0d3 },
  210529. { 0xe3b6c106,0x3ae181ab,0x8de150b7,0x4ebe163f,0x6f354836,0xcf75b82f,
  210530. 0x3ac7ac16,0xaa0d2063,0x291722af,0x5c680668,0x11545553,0x73941e61,
  210531. 0xbf5de3f7,0x17127e38,0x1afb41da,0x32cfdf03,0x87bc8663,0xc6893c91,
  210532. 0xa62c9c99,0x75046744,0x962c1947,0x96866e2d,0x378cdf4c,0x489ec8df,
  210533. 0x3407fa32,0x3a60709b,0x551290d1,0xd37d2159,0xbab92273,0x9623d303,
  210534. 0x2432014b,0x08151954 } },
  210535. /* 82 */
  210536. { { 0xfb7b2108,0xf9236d89,0xad75f9aa,0x3ecc83cc,0xb4e1da11,0xf7c72b15,
  210537. 0x0315c362,0x552aeaef,0xf272fe3f,0x11e140ed,0x87843ee8,0x99d79bf6,
  210538. 0x1d9bb25b,0xce6b54fd,0x5b1bad74,0xb20b0e21,0x5b84c90d,0x54a0214f,
  210539. 0xfca6cec9,0x459bbf52,0x9e4df76f,0xe363c48d,0xd64cf17e,0x3045f84e,
  210540. 0xf62ada48,0x8402a167,0x6a74ca01,0x2c9e1bf3,0xf691c42d,0xe8cf9d41,
  210541. 0xc2c4b874,0x5abf2178 },
  210542. { 0xf3b3bccd,0x4777966b,0xbe3e0caa,0x0047e0f0,0x8c7d5043,0xcb8383b3,
  210543. 0x946fd5fc,0xe77e3baf,0xe9ec0e87,0x79baa785,0xc8a18d25,0xd83c557c,
  210544. 0x25befcfe,0x9b96e5af,0x98c71b61,0x4f05d15e,0x77e62da1,0x081f991a,
  210545. 0xcbaa3821,0x1c6ec781,0xe54d9bfb,0x7522f65d,0x44ed1430,0xf5d05573,
  210546. 0x95cafdda,0x3035b31f,0x6378f5bf,0x47e67f43,0x5270b9d9,0x029f7cad,
  210547. 0x4d916a48,0x15ad1587 } },
  210548. /* 83 */
  210549. { { 0xaa588ae4,0x00de2ece,0xa371a232,0x552ebc58,0x71230444,0xd00ea934,
  210550. 0xe4b1832d,0xafbfa67d,0xb689e843,0x29216341,0x61f4e2e8,0x1f96bbbd,
  210551. 0x04c29dc5,0x95420684,0x42317fd1,0xc7fe3827,0x63483162,0xe0a0aec6,
  210552. 0x0700184f,0xfc2b94d1,0xfe1fbd85,0x07219973,0xfb074352,0x648b6ab1,
  210553. 0xc46e5392,0x23bbdaad,0x00fa56ff,0x0db8dd1f,0x866725f6,0x104815eb,
  210554. 0x52e81963,0x3f9c4cca },
  210555. { 0x32ce637e,0xff36b297,0xf5d25cdd,0x81a15f2d,0x8b02ad97,0x1a1d052d,
  210556. 0xcfbab3e9,0x2e5f3bbc,0x614eeb75,0x60d2cbd7,0xcd5a793a,0xd4491843,
  210557. 0xcdba2144,0x2242cf75,0x88b99766,0xa20705e7,0xec77e132,0x64e12cc0,
  210558. 0xb61a9b05,0xb1c14df6,0x74825b5a,0x8fd97f04,0x3da31223,0x95604821,
  210559. 0x4d30c70d,0xde486727,0x1c12ee69,0xbcab8f15,0x668d893d,0x5dc638b4,
  210560. 0x223f574b,0x6479dad6 } },
  210561. /* 84 */
  210562. { { 0xb05f2b26,0x569044f3,0x80b9f76c,0xb35a294a,0x4290f6ae,0x8839fe28,
  210563. 0x026a5877,0x761cfb23,0x2e5ff9c3,0x768926b6,0x0b11c576,0xbae6cd20,
  210564. 0x72a03efe,0xdc857756,0xe1bad63a,0x0cae074a,0xd709d99c,0x3fe491a1,
  210565. 0x6501d9c1,0x76c5ded6,0xc32aeff7,0x1da6eca1,0xc57683e8,0x50849d55,
  210566. 0xdf98d847,0x9e392e9c,0x64d9a564,0xfad7982f,0xa37b98b2,0xf7c3bdb7,
  210567. 0xf0860497,0x1fe09f94 },
  210568. { 0x7648cc63,0x49a7eaae,0x67cfa714,0x13ea2511,0x653f4559,0xfc8b923c,
  210569. 0x81a16e86,0xd957619b,0x3c864674,0x0c7e804b,0x1616599a,0xfc88134a,
  210570. 0x0a652328,0x366ea969,0x4bc9029e,0x41532960,0xae2aad2b,0xef9e1994,
  210571. 0x7f10bef5,0x9e2a8c52,0xc67bf860,0x73dcb586,0x844cc25d,0xf61a43fa,
  210572. 0x74eb3653,0xd74e7eea,0xdd240f02,0xf3356706,0xfd83bcb4,0xeec7694c,
  210573. 0xdb62526a,0x4de95786 } },
  210574. /* 85 */
  210575. { { 0x3deac2f7,0x4867d315,0xb61d9a8e,0xa084778a,0x0ab7b2d5,0xf3b76f96,
  210576. 0xcfdf4f79,0x00b30056,0x31ab8f4b,0xd0701e15,0x9c779d01,0x07f948d5,
  210577. 0x82675371,0x7c994ebc,0x48bad4c0,0x1104d4ee,0xbfc9d058,0x798ce0b5,
  210578. 0x309fa80b,0xc7ca898d,0xacb33eaf,0x0244f225,0x5b2f3175,0xd51e8dfc,
  210579. 0xa4d7be34,0x3e49ba6b,0xbda02b43,0x1760f4c7,0x4435275a,0x37e36a7e,
  210580. 0xe636980c,0x1c94418b },
  210581. { 0x09dc1414,0x43a21313,0x43c93537,0x060765fc,0xdf5f79ce,0x6ff3207a,
  210582. 0x85d4cfca,0x6f18b1fa,0x63e995ab,0xf5c4272e,0xa82b3002,0x121a09e4,
  210583. 0x97147f16,0x82b65d1b,0x20a7fe26,0x4993c20c,0xe6716726,0x99c9cb98,
  210584. 0xfeb440a0,0x5a02d673,0x251b4bc5,0x3f3fa9e1,0xa05338ea,0x75dbc474,
  210585. 0x7b09f6cb,0x3cb4044b,0x80434609,0x6767da18,0x098ceac2,0x97851422,
  210586. 0xb55235ba,0x611bfbb2 } },
  210587. /* 86 */
  210588. { { 0xf00ad2a1,0xbdbaa55e,0x14a290d7,0x29efa85e,0xe92b1694,0x3b4a4768,
  210589. 0x11ec8130,0x67111bcd,0x88bd27b2,0x0e425702,0xd9a03c06,0xf28cf2a3,
  210590. 0xf318884a,0xbb7c8d2d,0xe3aaeb20,0xe2ea1462,0x43b85d77,0x33535804,
  210591. 0x554ee9bd,0x81ee4482,0xe6aa198f,0xeb2eee9e,0xc26c5944,0x7a5aa804,
  210592. 0x82ab167c,0xa0ef2da5,0x02fe21a5,0x5a2ab476,0x3370298e,0x169cb3b8,
  210593. 0x0eb3aa8d,0x86e6c544 },
  210594. { 0x0b793d9b,0xede03321,0x1ddb5ece,0xf79fade1,0x68930b64,0xf73fda92,
  210595. 0xfe4fd1b2,0x06aad97d,0x92a4dc88,0x073a5b1d,0xbc976d75,0x8af8cbd8,
  210596. 0x63ce26c0,0x60b4abb1,0xdcb1fb06,0x9c8300a9,0xda95b3d3,0x335a594c,
  210597. 0xb37eac87,0x1f97d7d4,0x20eefaab,0xa3d2eba2,0xf3e828c8,0x3258c906,
  210598. 0x85ab7781,0xc832616f,0x8c28b617,0x72597192,0x3233b82d,0xcd7196bc,
  210599. 0x19fa126d,0x83867eb9 } },
  210600. /* 87 */
  210601. { { 0x22474edb,0x774fe73e,0x1a84e1ae,0x2a766394,0x9c6dd6e3,0x270329ad,
  210602. 0x14f8bf5d,0x00c4a415,0xd2267b90,0x3ce2ea37,0x11d24fae,0x12753015,
  210603. 0x263a1b78,0x7c14d854,0x1ae0b206,0x20c8401b,0x081f49fc,0xf32a011b,
  210604. 0x959c6df8,0x1e8123fb,0x800e1d06,0xa328dc7c,0x24259a9a,0x5876a378,
  210605. 0xb7ef6c37,0x23ada8b5,0xa93d4c9f,0x023f6b6e,0xffb6389f,0x89f5414d,
  210606. 0xe628b39e,0x4b26bba2 },
  210607. { 0x5d318454,0xd30b1cb4,0xd7436cb6,0x123b749f,0x568a7461,0x3110c726,
  210608. 0x1c84fd1e,0xc85de123,0x08403d55,0xa5f8d6e6,0x9b1fabf8,0x395b6e13,
  210609. 0x3cfedce0,0xfe6d68c3,0x94b91110,0x1d90381f,0x2dcc6eb7,0xf0a8ea81,
  210610. 0x7e90ca2b,0x59e80413,0xc8a25c5a,0xbeb5fc07,0x5d84663c,0x009c253a,
  210611. 0x910b6a7c,0x00b15073,0x4108f8d5,0x8607da4c,0xcb901e65,0x02c3d9c3,
  210612. 0x2c9615c6,0x4d697bc5 } },
  210613. /* 88 */
  210614. { { 0xefa8fb40,0xe0db1ef0,0x5ba3989c,0x29021c5b,0x809d19df,0xa8d6fb15,
  210615. 0x4c1219e1,0x6b787b73,0x14ef05e2,0x6417e168,0x8f9796e2,0x449342db,
  210616. 0xbf84421b,0x2f878a5e,0xe94a4536,0xe71916d7,0xae119693,0x9818bba3,
  210617. 0x5768804e,0xec674be9,0xf8424f8a,0x0a26074c,0x466ce6ab,0xdbc93b9d,
  210618. 0xc920078b,0xb3f15a98,0x3870f1a3,0x9d10fd0d,0xe4e785a7,0xa61241d9,
  210619. 0xe6c8cd80,0x76ca87a1 },
  210620. { 0xe02e48b7,0x4357fb56,0xcc09e9c6,0xfbd14b13,0x24069cf0,0xdb5f2435,
  210621. 0x2c3b01a9,0xf878165c,0xe6956dad,0xe549e7c4,0xbbd60b68,0xf2fe9538,
  210622. 0x059dc653,0x952f856b,0xb377fe9b,0xd3f60225,0xbfe908c4,0x6a0c7328,
  210623. 0xbc8f5f2d,0xce6aa2d3,0x24425050,0xf7213443,0x3d3b3ce5,0x17e1266a,
  210624. 0xc1677512,0x75b5e43f,0x37fb894a,0x15927062,0x2be3e375,0x15260753,
  210625. 0x6da3b7be,0x27e7f2c6 } },
  210626. /* 89 */
  210627. { { 0xe6a15883,0x638f65ad,0x66afdb33,0xd4a7e68c,0xd3f12de5,0x6207b6ab,
  210628. 0x37b87810,0x1c6ff950,0x64acf6d3,0xc0d44cb2,0xf2be78c2,0x163ac601,
  210629. 0x1636980e,0x1c63cc5a,0x95c9349b,0x3e92cfe8,0x41ec7220,0x7738e0d8,
  210630. 0x2d5fa961,0x6169d764,0xc3e028e9,0x2aa776c1,0xb16d5409,0x93dc5646,
  210631. 0x706df4d9,0xa0b27fb5,0xce9c6b97,0x9e991170,0x53c85f40,0xea8e42be,
  210632. 0x83246528,0x02e96437 },
  210633. { 0xae78ea1f,0x91540add,0x7b670e96,0x51a1b74d,0xf7006826,0xf9936441,
  210634. 0x7d7520c7,0x8f97d6ea,0x69ce12e1,0x0faa6a02,0x79208342,0x2590aca8,
  210635. 0x75614436,0x7a483863,0xf381408f,0x07c6149e,0xd7853406,0x733bf584,
  210636. 0x9abbb6f7,0x8761b010,0xf528a09a,0xe4eb249f,0x2e00ae3c,0x08781ed8,
  210637. 0x2178effa,0x864c1b25,0x9d513a7e,0xcc1e62a2,0x1919062f,0xedb8b94e,
  210638. 0x4f16527d,0x739f53da } },
  210639. /* 90 */
  210640. { { 0x924adc5f,0x7a5f4a88,0xa818f56d,0x95646c16,0x7795f954,0x0ec49129,
  210641. 0xd19c5400,0x2b48753d,0x205912b4,0x16fa236b,0xe87a4946,0x6b3d65f3,
  210642. 0x045fd066,0xa7174a01,0x12a5e140,0xb6350313,0xa96b8623,0xa79c4b44,
  210643. 0x9ab003d5,0x7a339d65,0x3826f31a,0xc72f30c6,0x6f7090cd,0xb4e7390c,
  210644. 0x906ebe24,0x59ac6c36,0xbba4505a,0x39a7f06d,0xc58c413a,0x839991e1,
  210645. 0xa20e0e84,0x020c23ff },
  210646. { 0xafc74661,0x120e4ada,0x277fc065,0x37bbcf63,0xb6dce799,0x41049cf6,
  210647. 0x7b161ba1,0x5b8d6b53,0xa9610fb2,0x22218431,0xdfdde769,0xde9ec9d1,
  210648. 0x42d80630,0xd32bfa4d,0x6244df4b,0x3885702a,0x45592dfb,0xcdedd1ed,
  210649. 0xfb4e01b8,0x0e1df45b,0x86e215b0,0x8f4bded2,0x6a937e6a,0x80935487,
  210650. 0x8130f723,0x415278ba,0x38a821f8,0xc6dc4692,0xfd8b4f8a,0x2207b119,
  210651. 0xf9269cef,0x76e7bf53 } },
  210652. /* 91 */
  210653. { { 0x27ebd187,0x5f128428,0xb65aadbb,0x8d3320ab,0x72258695,0xb042765a,
  210654. 0x8f0986ab,0xda3f33f9,0xaebff503,0x411807a7,0x825f71a5,0x25c776ca,
  210655. 0xff7df24b,0xc0de7bed,0x165f1fb4,0xda8b0f42,0x731f3ae3,0x5f3ff737,
  210656. 0x193e0a52,0x4cd1d7e7,0xb6b3ba46,0x8df84aa3,0xaa1f3782,0xba84b897,
  210657. 0xe7733ac7,0x6e7960cc,0x50981a21,0x4d46d6ab,0x7cbb80ed,0x1ec12c25,
  210658. 0x2b96ef09,0x79e7ad27 },
  210659. { 0x8f30caae,0x3cd970dc,0x0a6ebef4,0x85cabcf1,0xc714616d,0x63c1863e,
  210660. 0x519e3a98,0x1c50db0b,0x64cb13d6,0xf39b8963,0x22547b69,0xdf67d81f,
  210661. 0xd67db0cc,0x7157abb9,0x889491b7,0xccca25ba,0x7a27e0dc,0xf689207c,
  210662. 0x0fd43281,0x34ae8fbe,0x5720ec09,0xa5d91f73,0xcdfd7bed,0xb2f61909,
  210663. 0x4a039e32,0x1ec10232,0xdb0d8fdc,0xd3c3d65e,0x4fe5005d,0x32c916c8,
  210664. 0x4c0bea94,0x7f8c37ac } },
  210665. /* 92 */
  210666. { { 0x43ac05e5,0x33ec1e54,0xcd8d3825,0xda4a4da4,0x88bf9e2b,0x86d88c0b,
  210667. 0xb53811dc,0x34d71dd0,0xa3c3aba4,0x655040d2,0xb61611be,0x2bc40949,
  210668. 0x279a4fa0,0x1c2d426e,0x3b065ac3,0x535a5aa2,0xc52ea890,0xdaa8a32f,
  210669. 0x9fddad22,0x5a5deca7,0x2ab3b26f,0x911f05fd,0xf37cd81e,0x5dace7db,
  210670. 0x90d16b8c,0x0e0e44e7,0xe4f5894e,0x15e68aed,0xfc92a74f,0xafe04999,
  210671. 0x970e7c2f,0x1d7703aa },
  210672. { 0x3f0062a9,0xa8a4c81d,0xd96a20ba,0xe31eb2b8,0x864bd101,0x66dd98df,
  210673. 0x4413b614,0xba05f592,0xe9a555f8,0x51a67a0d,0x2e4b52d1,0xacc2f097,
  210674. 0x7184ab23,0xab5daaec,0x7c7f691b,0xce08b43e,0x76c427f4,0x520e530b,
  210675. 0xe423ebdc,0x7d352069,0x34df14ce,0x6b5e39e8,0x446305ac,0x3dcbf295,
  210676. 0xfe34cdc1,0x682cb2e1,0x111f5afb,0xd4ac45d1,0x47f296f9,0xc5ef63cd,
  210677. 0x93c20871,0x0a2c40ec } },
  210678. /* 93 */
  210679. { { 0xaf5747db,0x09bc384f,0xc06ab86b,0x3bad6086,0x9e7c1547,0xa406882e,
  210680. 0x55977abf,0x2d5326d1,0xda81deb0,0x063a9a05,0x524b6111,0x9a86e4a7,
  210681. 0x4ab2eb90,0x1402f87a,0xd5c600ba,0x7d0721d4,0xf289fdbf,0x1a2fd9a9,
  210682. 0xecde6f07,0xf5dce66d,0xdab9fa73,0x62171277,0x6c474bab,0x6d2dc49f,
  210683. 0x76eed033,0xdc017e1f,0x4da825d3,0xb97175c0,0x54b05e43,0x6c297e3d,
  210684. 0x56c9c87e,0x2efb4546 },
  210685. { 0x8b21c064,0xa4712b00,0x4a70629e,0xd186fe42,0x9b74f0af,0x6435b340,
  210686. 0x7ec9e629,0x6965aa43,0xc4c60d08,0xdda14673,0xbf3057aa,0x0b656670,
  210687. 0x3ce86f60,0x7f05e840,0x04401a16,0xc05073a9,0x294e607e,0x16b1e638,
  210688. 0x69cf7046,0x20783252,0xe8ce7d3a,0x2941141b,0x7577053d,0xd38ad8d3,
  210689. 0xcaa6630d,0xdba68fb3,0xe9504350,0xecbeaff1,0x1d2d760b,0x9f5166d5,
  210690. 0x462891e4,0x337532ce } },
  210691. /* 94 */
  210692. { { 0x3a00bb9b,0x3f111853,0x45f66685,0x2d2ffbae,0xd4aee24d,0x9ae11a85,
  210693. 0x0341856e,0x18ba1e1b,0x2731349f,0xa9ac8178,0x545715b5,0xc13dfd4a,
  210694. 0x5daad2ea,0xa5f7423c,0x535b76a7,0x30a483b9,0xff873e9b,0x92e9ada4,
  210695. 0x723a1055,0x15662d84,0x8edac4e0,0xb935497b,0x39d8fa70,0x61b6441a,
  210696. 0x40d1589f,0x1541d756,0xf0a05f0a,0x62994237,0x6bb28908,0xfd8b0034,
  210697. 0xd4cd32bf,0x192a2b5d },
  210698. { 0x365ced07,0x63576628,0x05de1d1f,0x029f32fb,0xbf40a7aa,0x6d17b9bc,
  210699. 0x9bb50a47,0x1b1b2a08,0x795a6278,0x9389abbb,0xb34fc19b,0x52cff60f,
  210700. 0x387d8739,0xf3ab9492,0x6920ccd6,0xa8f053e6,0x63a9b4f0,0x3ef2dd4b,
  210701. 0x51e82129,0x9ab0ede1,0x0838bfa1,0xafba0c0b,0x9ffc11be,0x2bd5a7ac,
  210702. 0x95cc0878,0x058bfd95,0xf8c2f0c6,0x686d48a3,0x1d9b31ba,0xc33abaaf,
  210703. 0x3bc0c268,0x632e2289 } },
  210704. /* 95 */
  210705. { { 0x15a1ccca,0x1c851d20,0x7e522bc3,0x4efe290c,0x18eab053,0x0b741d55,
  210706. 0xbc85e217,0xae656197,0x01cf8b29,0xae13141e,0x66948478,0x2e2cb593,
  210707. 0xc31bd8ae,0xeb57bb0f,0xc264e788,0xdecef5d6,0x9cb96d86,0x6fa856cc,
  210708. 0x279183da,0x2db16813,0x383d796a,0xf03f3820,0x1d0c6fed,0x58a456ff,
  210709. 0x8a6abd9b,0x25589805,0x83f96f19,0x339f52c5,0xda7e9ea7,0xcf6ded8f,
  210710. 0x5d1ccd45,0x68c3d9c1 },
  210711. { 0xe6b392b7,0x67e26265,0x775d9509,0xcec1d9bf,0xd76514f7,0xe16abcd4,
  210712. 0x0de72e1c,0xd86f59b2,0x1adfb033,0xa66e43cd,0x05e457cc,0xdb344340,
  210713. 0x5681daa2,0xb67a7916,0xf0114731,0xc32e7bab,0xd3b1e961,0x066fe16e,
  210714. 0xf63d26e6,0x924e298e,0x541add6d,0x9bea0dd8,0x9982f971,0xef9500df,
  210715. 0xc5f076ac,0x5c876e63,0xb23d396b,0x55e12ae5,0x2ec6747a,0x09efbb36,
  210716. 0x233286a5,0x8f2055ee } },
  210717. /* 96 */
  210718. { { 0xb82c1af0,0x4a4ab9e3,0xf2cae264,0xfc65e9e7,0x60187d46,0x4feaac0a,
  210719. 0xe393b363,0x27d3f335,0x819bacce,0x9c9f7c00,0xb8aa6611,0x3f7418b5,
  210720. 0x372aae95,0xffa94557,0x8db38589,0x937d7804,0x6f1fbc1c,0xd10c86df,
  210721. 0xa2f0a0ce,0x48aebd89,0x367439eb,0xae5d5fa2,0x3f17d2d8,0x103a6a0b,
  210722. 0x411d9894,0xf233f68a,0x218b67a2,0x7fece8b3,0x2319bf06,0x0422540f,
  210723. 0x340d322e,0x1292c8c9 },
  210724. { 0x0386463d,0xf5eb5587,0x0371d97f,0xd4bbc2b2,0x0b819c5a,0x1b364571,
  210725. 0xcf04ad41,0x0cbb42d6,0x66939ec1,0x5d819c76,0xa01847e7,0x8745ac13,
  210726. 0x1c7232e4,0x4f704b02,0xacb05780,0x2c9e58a0,0xb561e295,0x9523b8b3,
  210727. 0x79f9ba35,0x3384df00,0x1eaa9628,0x78231fc2,0x8aea2b90,0xa2eac54f,
  210728. 0x30d1c263,0x8075ed77,0xfb339000,0xacb44ed5,0xf011293a,0x92546ac2,
  210729. 0xeb821764,0x7c78762b } },
  210730. /* 97 */
  210731. { { 0x067902b6,0xb8f7d6fb,0xd1735980,0xb2823a43,0x59741ddd,0x062cfb12,
  210732. 0x4033f95c,0x6e391b07,0x68589b8c,0x3831d0a3,0x522290f2,0xe3474d49,
  210733. 0x222e1f3a,0x4dab14d6,0x53f08d39,0x8f00fcde,0x707f28f5,0x559917ae,
  210734. 0x068e607c,0x166aa0ba,0xd7e1f824,0x602713e7,0x4d6a328f,0x7c255540,
  210735. 0x9890cd2a,0x0d2e3264,0xeca0b20a,0xf2207944,0x52f4e09c,0x5c98dc07,
  210736. 0xd84de81d,0x69403504 },
  210737. { 0xe5407206,0xf8b7b366,0x0d88fa8c,0x1ecf54cf,0xf7272e6f,0x6fefe548,
  210738. 0x81ab4468,0xd6531372,0x4e474408,0x52cb5f0e,0x6490737f,0x9e426b3a,
  210739. 0x4980d071,0x2576c19b,0x0f272caf,0x91f34628,0x468f31c9,0x78e60a4f,
  210740. 0x90844d89,0x8776a329,0xb951582b,0x8a55700c,0x14b1adbf,0xab1af365,
  210741. 0xfbd343ef,0x22ebff92,0xb7d81f34,0x32f9fb01,0xba6b30e1,0xad850e06,
  210742. 0xbc5f9546,0x6da9e027 } },
  210743. /* 98 */
  210744. { { 0x5c9490ce,0x21eee4c2,0x0df68381,0xa96ec4a3,0xa4a9368e,0xe6c607e0,
  210745. 0x4bc262f3,0xd8b0492a,0x460c34ff,0x0846a210,0x28df33cd,0xf7ff7a64,
  210746. 0x21827612,0x10c55044,0x149bcd01,0x9d25fce9,0xcfc613dc,0x725611cd,
  210747. 0x97f51ce5,0x159f7e88,0x4e8c08b5,0x3fa3bf31,0x75e7538f,0xea156115,
  210748. 0x91c84020,0xd1e0a951,0xcf02ad0a,0x0d2268ba,0x058b8e5f,0xa04c6ac4,
  210749. 0xb3515912,0x773b40b9 },
  210750. { 0x3631cfd2,0x00ff2cdc,0x807737bc,0x14c4c2d3,0x338a5270,0xd600616a,
  210751. 0xb32cabde,0xd0e3306d,0xa70b17ca,0x336738ea,0x79f353ee,0xf2f4aa8d,
  210752. 0x576f3ad3,0x712f6ad9,0x89b2bce0,0xe4279852,0xda92ca30,0x05d8f94d,
  210753. 0xd8492dd9,0x9891d475,0x4d15e4bd,0x3e06a5ca,0x254eabbd,0x4725d4eb,
  210754. 0xc0ed513c,0x31394ace,0xbbfaae6c,0x7e0f9859,0x833fd137,0xdc125546,
  210755. 0xc56c4f75,0x12b46385 } },
  210756. /* 99 */
  210757. { { 0x932951de,0x810dbebd,0x5aa69c94,0x96959d42,0xecb2f08d,0x5fc49c04,
  210758. 0x2250b82c,0xac74f0cc,0x3aec4e1d,0x96a439a5,0x90499acd,0xc33cab9a,
  210759. 0x54d9b3af,0x2fccde66,0x3863ae8b,0xf4af285c,0x46febf88,0x2373373e,
  210760. 0x3c9ab7ed,0x751d672c,0xfe12020c,0xc1c51130,0x52f3e56e,0xad82402f,
  210761. 0xa4a64a81,0x3489ab7a,0xd9f163f2,0x0a1fb661,0x0e553317,0x17c69be1,
  210762. 0x7d88d417,0x61c1935e },
  210763. { 0x3492ae43,0x2e722d9b,0x0538f05a,0x1ef89d95,0x200aab63,0xae77e588,
  210764. 0xeba4b117,0x2872c120,0x3a461cb8,0x5c2432c8,0xcb938f26,0x315b3434,
  210765. 0x8c4c7dc0,0x05bf2ac5,0x596b378d,0xd2e501dd,0xcb890c30,0xa8506c9f,
  210766. 0x7c361f0c,0x3d0af461,0x5a35cbae,0x21f7b718,0xf3fc0138,0xbd1035f1,
  210767. 0x8b248edf,0x74628af5,0x48c9cae0,0x8d6421d0,0x2ca18773,0x75e3da39,
  210768. 0x71d3db94,0x27ad0df2 } },
  210769. /* 100 */
  210770. { { 0x305b5aed,0x9e3bda79,0x5998d6a7,0x2c67d4a4,0x0f7eb700,0xc855e1d3,
  210771. 0x147d1c44,0xc18a7e9e,0xc89540ed,0x3ea99618,0x7e6bfd20,0xa53be20a,
  210772. 0xecc14437,0xc9487e64,0x34ef85c6,0x72979207,0xd5e1ebd5,0xfa0d4e71,
  210773. 0x4d48d6b6,0xfda2b1e6,0x66e200d4,0x782a1e05,0x5a5366a1,0x2a3c70da,
  210774. 0x1a473738,0xfe3fbd2b,0x7fe020e8,0xd7ef8c06,0xeacfb665,0xec686fde,
  210775. 0x6dd1542f,0x5d9b5e27 },
  210776. { 0xcb3e472e,0x3637c5a5,0x30a1405e,0x2153d927,0xb4498558,0x009992e5,
  210777. 0xf39a0851,0x18f00ccd,0xb5c6c560,0x26237c11,0x1343540e,0x418ed408,
  210778. 0x7e7f3184,0xfef7cbf0,0xbf48576b,0xecd92366,0xbc94c91a,0x1b75be1a,
  210779. 0x4a162276,0x8e1778de,0xc5c6bcb8,0xc52e57d3,0x5ab71858,0x5cc382c7,
  210780. 0x3f6e39f9,0xe12c2c28,0xd62735fc,0x4c7e0ef2,0x835a5996,0xe071deb1,
  210781. 0xcbb8c766,0x24f891cd } },
  210782. /* 101 */
  210783. { { 0x6778c1e2,0x24ef60bf,0x00d5be5c,0xff49c03d,0x2f01a09f,0xec11986e,
  210784. 0xae096e58,0x59a728a4,0x7077984c,0xaabbcedb,0x870ca5a5,0xfb473bd2,
  210785. 0x4de30e3d,0x8c928c61,0x4f67abca,0x3fae7f9a,0xec21a9cf,0x83c2b2eb,
  210786. 0x9cd9b5de,0xafa70d62,0xc60b18df,0xadeaea59,0x4049b54c,0xd5fef7be,
  210787. 0x6dd310e3,0xfceebc76,0x8f6321cc,0x7748efe3,0x18ee8af5,0xfe9c32b1,
  210788. 0xd42df612,0x863ac3cf },
  210789. { 0xb85a2fe2,0x0a36fca7,0xee429dc6,0xf3e70d08,0x141c3944,0x8c9ba209,
  210790. 0x67272a0a,0x306a8106,0xf968bd06,0xe69a1555,0x153c603d,0xb86f7e47,
  210791. 0xef56e4fa,0x9706614a,0x98780b4c,0xc0dc36b8,0x3a1d3263,0x43657fe2,
  210792. 0x435522c9,0x01f97a86,0xedfef679,0xd91897f6,0x6daa17a0,0xebbe31d4,
  210793. 0x85accfbd,0x6f179100,0x8f9fc1de,0xe0da6e32,0xe1e7142c,0x1c9d53db,
  210794. 0x8b86725a,0x3e3f1b1e } },
  210795. /* 102 */
  210796. { { 0x7b7fbf05,0xb7ea15c0,0x1f1a3882,0x992f11b6,0xd1dcd1bc,0xc9ddd95a,
  210797. 0xad0f7e8b,0x31f5b7fa,0xfca7ab79,0x2936e5eb,0x19a55be6,0x30f417dc,
  210798. 0x43cde554,0x1f6f4e43,0x82f044bf,0x971f5e65,0x4288c408,0x73c3b8e4,
  210799. 0xb807f575,0x61aac59f,0x818b58f0,0xa64ee2dd,0x97a3b0d3,0x6f7a0a60,
  210800. 0x0394b058,0x8b85ecc8,0xbfb3517d,0x9a059474,0xa79c3f06,0x89ad5977,
  210801. 0x700a8025,0x81208ed8 },
  210802. { 0x14c4ce37,0x10935099,0xa1aa48a6,0xf34bb843,0x580d58e8,0x86007024,
  210803. 0xb375b8ba,0x6db42c49,0xed3bde83,0xac365524,0x649233b6,0x5521e1b4,
  210804. 0x64dd946f,0xbc7cc5d5,0xbfb5b6ae,0x9c14b035,0x0146c1a3,0x7f22ba18,
  210805. 0x872214f5,0x0b62fbbc,0xb4921764,0x3acfd7f7,0xcb4d6df1,0x5ff10da1,
  210806. 0x62600a91,0x660e2620,0x81d9167f,0x7ac7da9d,0xb6e7a199,0x6e8e260c,
  210807. 0x80deb3c2,0x44383fb8 } },
  210808. /* 103 */
  210809. { { 0xe44f9af6,0xe107f01d,0x8cb1fa1c,0x36381a4d,0xfb7dd493,0xe65be3ec,
  210810. 0x26a8839f,0xd0b8435a,0x3ec789d8,0xee60f915,0x2bcc5e1f,0xe25fea50,
  210811. 0x7e44a81c,0x0477c0c5,0x230ba5b8,0x349e9f83,0xde180dd9,0xdd42f32f,
  210812. 0x64a3d11c,0x8b039eaf,0xbeb7083a,0x80ef884e,0xf12742cb,0x288e60c4,
  210813. 0x720a0262,0x44156cc5,0x7253b77f,0xcd547de6,0xa6013a59,0x9829a6ec,
  210814. 0x0d548445,0x8aee708f },
  210815. { 0x32c54409,0x18f22d9c,0x75ebaac4,0xa9ebfa46,0x86284981,0x90e2e928,
  210816. 0x6b3a8e0c,0xd0201f6f,0xbd77641e,0xc973016c,0x70170575,0xf926f2f0,
  210817. 0xfec0ce01,0x4984048f,0xf319d304,0xbf696211,0xc91a88c4,0x74b5c844,
  210818. 0xe0030a82,0x4c40fbce,0xe4f6d521,0xbed67525,0x29d67d1e,0xaf7e47cc,
  210819. 0xc21d3536,0xfa307db8,0xbbb29405,0x56b6c46a,0x033e805f,0xf059a7e3,
  210820. 0x6096a5a0,0x970f61fe } },
  210821. /* 104 */
  210822. { { 0x1bec8e4a,0x1bc53d23,0x35a6034c,0x8809ac14,0x509e464d,0x4ee081da,
  210823. 0x8a488235,0x496ae1fd,0x325864b6,0xa1ae9863,0x74cd069f,0xbaca13e9,
  210824. 0xb1d8a6b4,0x3738cc58,0xe76b9da4,0x5fa71f58,0xc7eb16fb,0xc919be88,
  210825. 0xad4e429d,0xf5c8f13f,0x2499f9ed,0x4583b671,0xa10d8bd7,0xbce20115,
  210826. 0x5790bb7e,0xf66d7605,0x482b78dd,0x9316aede,0x75f855fa,0xe0d8fb2d,
  210827. 0x5a7dcca7,0x404b5b94 },
  210828. { 0x517a15c7,0xf9ee682a,0xef880202,0xaae4cfbc,0x5106a354,0xcee2c139,
  210829. 0x170febe7,0x5de60192,0x73d0c54b,0x589e39fd,0x8c9092b7,0x195c7135,
  210830. 0x0a7bfe5f,0xcb7ed53f,0xf61cc979,0x2bd9242a,0x5395f7d9,0x8d2ef16c,
  210831. 0x70b32f09,0x0d4ac1ca,0x52d185c1,0xa587526d,0x942d6195,0x2932b04a,
  210832. 0xa500b0ac,0xfe25a979,0x562fd230,0x5fa1f4ae,0x20da253c,0x60f55af2,
  210833. 0x83146002,0x7faa11b5 } },
  210834. /* 105 */
  210835. { { 0x6e402149,0xb0ba4f0c,0x963cc119,0x3584cc1d,0xa6527476,0x7740dc1a,
  210836. 0xc95715f2,0x3f77ff75,0x3f89fb0e,0xb2f234ad,0xef9be3ff,0x55159032,
  210837. 0x04237e82,0xfc9fb21d,0xa153ed93,0xeb2eff38,0x10041d13,0x89d53ae0,
  210838. 0x7f1bd828,0xcf2e545b,0x43953ea5,0xdd4a27ce,0xd85e75c8,0x00d2e5d4,
  210839. 0x241be1c3,0xeb93ed62,0x0242032d,0x1e53f25f,0xc3a4e701,0xb9957636,
  210840. 0xed98febf,0x14b63a52 },
  210841. { 0x71c43336,0x7610b553,0x23a4824b,0x19dfd4a6,0x0286051b,0x7b97a2e0,
  210842. 0x8f5f1edb,0x86abbb9c,0x9b67daad,0x67a57d77,0xcd5ffafb,0x8ace506d,
  210843. 0x89ac3c63,0x85da9f95,0x75a3d150,0x081cbaa8,0xe9346ed2,0x03353d8f,
  210844. 0xa1f9a02d,0xb2ab61f1,0x3a659c71,0xb0cb0937,0x4f5df8a1,0xb7e0e30b,
  210845. 0xeb7d5a1d,0x77c4c741,0x728e5cf0,0x8f046c9c,0xf7c171ac,0x32dd0bc7,
  210846. 0x836d2655,0x02485873 } },
  210847. /* 106 */
  210848. { { 0x75a4cd8d,0xcd40dd23,0x97bcba78,0x132ca433,0x258d61f5,0x30c5cd84,
  210849. 0xda1e8e68,0x0a7ec059,0x1d65d40a,0x07a8f171,0xf4350d76,0x869e655e,
  210850. 0x5983ae42,0xb98ce6f0,0x9d8bebd0,0x7b61391d,0xb1ba5d49,0x3a529e25,
  210851. 0x1f6b2cf6,0x46f732e9,0x3fa3b629,0xbd66ec6a,0xc3ef0ed2,0x397950ec,
  210852. 0x5f08b476,0xee9008cb,0x965a0e2e,0xfd6be425,0x1177bc87,0x78ed513c,
  210853. 0xfe512dae,0x6798cedf },
  210854. { 0x1b97c5c6,0x49e3f8fd,0x78c3b33f,0x39fbab3e,0x40f595ba,0x44274412,
  210855. 0x5d7d4376,0x174225b9,0x79c44777,0x880b3fcc,0x3296b245,0xdc3aca83,
  210856. 0x1734e184,0x55913df7,0x9c934472,0xa4db23d3,0xd1420a11,0xcebb3733,
  210857. 0xf3608bdc,0xb9d20cf9,0x30cfe13f,0xa618acf6,0x5f30874c,0x75f06b31,
  210858. 0x9f0005a5,0x506efe7f,0x01bfc9db,0x8aaea78c,0xf78e7c41,0xf9179255,
  210859. 0x52e96395,0x3ea7aed2 } },
  210860. /* 107 */
  210861. { { 0x5b06ae25,0x98617e04,0xcb5750ef,0xbcac148d,0x604c2ba2,0x91ea2f0e,
  210862. 0x76b78975,0x00c19f6b,0x651da181,0x79b9b6d0,0xc945705b,0xf3225beb,
  210863. 0x5c005bf1,0x30b435f3,0xbc24d86d,0x440b4482,0xd6373777,0x2b8f0996,
  210864. 0x1c44b4dc,0x65fd6c56,0x30906999,0xe9405ee6,0x08aa1ec1,0x19ff0924,
  210865. 0x3d2f2895,0xeef3246a,0xbc746797,0x016c3765,0xd0705f7e,0x62d2569f,
  210866. 0x05250044,0x6a8ad39c },
  210867. { 0x46be7282,0xe45f020d,0x21380f12,0x9405afed,0xd5da6ad0,0x4cdca5bd,
  210868. 0x7f8be61e,0xc2d6f184,0x596b8178,0x20132953,0x7a8df954,0x8d3b1e7b,
  210869. 0x39572b4d,0x757c61bb,0x80cc3b56,0xd749b57b,0x37b3ffec,0x9590ff93,
  210870. 0x145dc94d,0x39bbb653,0x2335e573,0x70c1c606,0xf763feba,0x9c2e72d7,
  210871. 0xcc61b732,0x4768e424,0xaa73f2ca,0x777d2fa6,0xc5cb58cd,0xdee4dbaa,
  210872. 0x9cfae1aa,0x1a181179 } },
  210873. /* 108 */
  210874. { { 0x77575ed0,0x6f6ff62f,0x7d1da99b,0x18f14fa9,0x69efd7f6,0x2e72aefb,
  210875. 0xddc28633,0xc45ab4cb,0x586c5834,0xb0e20d48,0x39775dd8,0xd397011a,
  210876. 0xf4134498,0x0130c808,0xf5115ed8,0x2d408eba,0x0260ded9,0xc506a05c,
  210877. 0x19cab911,0x9e5b7362,0xe8693a86,0x4cf508c6,0xcc773617,0x4e71245f,
  210878. 0x95d89ca3,0x2f71aa1f,0x607bbc98,0x4bba7c6a,0x212b7fd2,0xf3a515e7,
  210879. 0x9230f5a8,0x7d2ddc75 },
  210880. { 0x4ed2cae8,0x3d05816d,0xb9c00377,0x4cf6bc7d,0x646b08d4,0xc23e98e6,
  210881. 0x4b9c0180,0xf9ee6c61,0xef9179c1,0xe11c9a13,0x8ed9688a,0xa5b6147e,
  210882. 0xd06670a7,0x7afeb648,0x17685275,0xd670333c,0x75f9e8f2,0xa89dd969,
  210883. 0x37a68ade,0xbb57228d,0x454cb186,0x21a05d5e,0x063dd550,0x4810158f,
  210884. 0x4cb6caf3,0x92dd4f08,0x7854abe7,0x70c4d852,0x6e729d76,0x845969dc,
  210885. 0xb1bf40ba,0x5a52f87a } },
  210886. /* 109 */
  210887. { { 0x09ecacbd,0xed019e91,0x7b89bdea,0x6544023d,0x5707371e,0x7cc51f0b,
  210888. 0x16c8e217,0x14832b04,0x81259ab5,0xb1aa6682,0x23e361d4,0x6e100f92,
  210889. 0xe3a95c2a,0xe593eee9,0x16c10e26,0x699b6bbd,0x9473a13f,0xad487873,
  210890. 0xb274987c,0xf1c14dc5,0x2559e2e9,0x57dc0075,0xc3d47ad2,0x8449849d,
  210891. 0xdd527793,0x83df278a,0xeefd5b99,0x770e3ec8,0x76bd02a0,0x2ae58446,
  210892. 0x3e705ffe,0x17f02764 },
  210893. { 0x29abea1f,0xdda4010d,0x2407ac4c,0x636b9695,0x0433218b,0x96a60129,
  210894. 0x163d534a,0xf221fc3b,0xccc20565,0x05ba15be,0x96285577,0x1238e54d,
  210895. 0x878804d3,0x1b144257,0xa89a9fe4,0x96fbf304,0x4be642b1,0xc8a7f06c,
  210896. 0x6e2b085e,0xdd1a20e8,0xff4a591d,0x8f7f27c2,0xa4a343b8,0xc17b0753,
  210897. 0xbb173d4d,0x684b1e88,0x3dc07bbe,0x3accea44,0x4c441d77,0xdb15c88d,
  210898. 0x53e5957e,0x0ef0309a } },
  210899. /* 110 */
  210900. { { 0xfa8e5b60,0x4fc25721,0x691c0bb2,0x646938ad,0x0b0a2248,0xe46d4b76,
  210901. 0x7de16877,0x863f9ac2,0x2721c630,0x503bb6ef,0x0b67fb02,0xf8c199df,
  210902. 0xe07abd39,0x78c1ed72,0xb32f0dda,0xcf9deb7b,0x6c3c89f3,0xaff726f0,
  210903. 0x1972225a,0xb7008b2d,0x4f145f5c,0x8f5a6117,0x457c4f37,0x4e0e6f8c,
  210904. 0x1c453c64,0x8bbdaa44,0xa6e92c80,0x57be326d,0x5d773561,0xa9bc3fd9,
  210905. 0xbb37b72a,0x3d3b6cc6 },
  210906. { 0x9722c880,0x6e6f12cc,0x286b6889,0x3a1b6ae7,0xad2fafec,0xba1cc09b,
  210907. 0x43bb8bef,0xad64ad7a,0x97c3f4c3,0xa5af6a00,0xc353a91b,0x2afcb0d9,
  210908. 0x69ccbf6b,0xca13fcab,0xf2abc190,0x699a1391,0x23a247e5,0x2dbd5542,
  210909. 0x95488d9a,0xe206180f,0x1244cc3c,0xba9e7bff,0x87d3a365,0x29297abe,
  210910. 0xfa4ca5e2,0x4054fa38,0x67be1b6c,0xb390623d,0x78f41a44,0x1fa67c57,
  210911. 0xc7b544e7,0x2e946e43 } },
  210912. /* 111 */
  210913. { { 0xc60934ae,0x2980fddf,0x164206d1,0x2c3e7eff,0x416ed75a,0xf75e7f96,
  210914. 0x5cd0b2dc,0xfac60cf3,0x1faad87b,0xddc4bece,0x9849e5dd,0x753fa87c,
  210915. 0x2c1bf1ae,0xc5d516a3,0x14732b4b,0x565dbea8,0xce48696b,0x007ebe3a,
  210916. 0xcdb97694,0x40ca74d6,0x65e4e7be,0x3f5cd270,0x3aac4ebc,0x74847c01,
  210917. 0x43d6c3a1,0x6762e034,0x467a076a,0x690d8c95,0x1eda677d,0x768d78d6,
  210918. 0x0181d8c2,0x0997ce55 },
  210919. { 0x965a0b81,0x9297746c,0xe5e12dfa,0x48b58be6,0x715f437f,0x5573b3c4,
  210920. 0xb565c459,0xe425e907,0x1582797c,0x4f43f512,0x8ea5474f,0xe5dafa6f,
  210921. 0x13de04ac,0x2aeb8fbe,0xe8a07c83,0xed7f95f0,0x662c09fe,0x3e012a6e,
  210922. 0xc742cf17,0xbf96e9b8,0xe28a1c45,0x8ea5759a,0x5cf4e2f3,0x475941b4,
  210923. 0xf901a019,0x7dd3c02d,0x70916b2e,0xe7a4deea,0x2fa9b988,0x50b272b5,
  210924. 0xd0917fe6,0x96f9f09f } },
  210925. /* 112 */
  210926. { { 0x2c310a96,0x78e8aac4,0xf7a2a734,0x32a98303,0x23962207,0xc46ca83d,
  210927. 0xd9541280,0xad131e6e,0x2cabe911,0x5791fc5e,0x841b6c68,0x50cb77eb,
  210928. 0x3d3c8878,0xaff93dea,0xf1007bce,0x06541f1d,0x55cdf1fd,0x4ee729c2,
  210929. 0x323e3972,0xe0f71317,0xad4d08c1,0xa2de7a41,0xa35e22bf,0xa9912abf,
  210930. 0x89b03325,0xa050122b,0x06514d4e,0x8b9e51f4,0x79d3e0ab,0x423c7aad,
  210931. 0x40b8fea5,0x71998e26 },
  210932. { 0xceb6ed78,0x40140fcd,0x18534516,0x653cf377,0xe8d60dcc,0x0450b65a,
  210933. 0x9dac55f8,0xce6c1a76,0xae05686c,0x8a96a92d,0x12712562,0x2fe44762,
  210934. 0xa4f39425,0x747bcb50,0xfc531fc2,0xf0ec6ff2,0x10fe9ff0,0xc97c3447,
  210935. 0x9c792cff,0xfb488783,0x026fb019,0x552c5248,0xd804c290,0x4001a29c,
  210936. 0x35c8ca73,0x742b5ad8,0x6ee5dfa0,0xc3781f17,0x3dfa4ab1,0xca6b85f0,
  210937. 0x0b0d32ac,0x8389941a } },
  210938. /* 113 */
  210939. { { 0xde067dff,0xc0f062a2,0xbcb80162,0xd4f32690,0x0707a2bd,0x98cd990d,
  210940. 0xfae4a391,0x5afc63b8,0xb32ad814,0x684f1b7b,0xf199dfb1,0xb0a2dce2,
  210941. 0x48f25848,0x2260e17f,0xc2d5e862,0x7393db00,0x338cf171,0x9e88f854,
  210942. 0x02acf522,0x00679429,0x6835af3d,0x19157cb8,0xb8a2614c,0x2faa6f92,
  210943. 0x134ec46c,0x04ff95f5,0xfb7a8135,0xcf00626e,0xb37a4704,0x454b3d05,
  210944. 0x2694ec25,0x1fbfda31 },
  210945. { 0xc8f69c77,0xfdebb657,0xa3df88fa,0x92a8278b,0xc1fb78b4,0x463b5571,
  210946. 0x11c71a33,0xd2066a1a,0x089958b0,0x10c88143,0xcf9d67a6,0xb975c7e0,
  210947. 0x73037b8f,0xdaa5d208,0x40bf5861,0x5ee5005d,0x7dba69a9,0x300e6ce7,
  210948. 0xc962cc74,0x893c3cb3,0x4cf84055,0x0ac98629,0x225c9d70,0x0a7ef63a,
  210949. 0xb91e47e8,0xfe184869,0x8c2f84be,0x1b9d7deb,0xc0e278bf,0x67788915,
  210950. 0xc426f19e,0x4f9488ca } },
  210951. /* 114 */
  210952. { { 0xdd51b8ce,0x610dfcd4,0x36230e80,0x08579278,0x36599562,0xedc7ff1c,
  210953. 0xe2cae877,0x905ead4b,0xe7967608,0xa1c325d9,0xbd38926c,0x3e39eddd,
  210954. 0x5f6f0a4e,0xda92c868,0xf47a0fa4,0xe16f800a,0xe5f60aab,0x50b4db5b,
  210955. 0x983853d3,0x3665412f,0x9b79789c,0x64b62250,0x4e0e72b2,0xea560058,
  210956. 0xe555c2bb,0xabbd4901,0x17292e11,0x378419a7,0xe174218f,0x6e0b5aaa,
  210957. 0x8f796b92,0x688e0684 },
  210958. { 0x313b8f64,0xcdfef641,0x942c7462,0xaef11b7b,0x5c0d8abd,0x067cfb77,
  210959. 0xaf4041a9,0x608ea5f0,0x6935210f,0x23d5bd82,0x27917a08,0x5ab904fc,
  210960. 0x45d22d21,0x85dbb1fe,0x4d36159f,0xc3d5e509,0x1d39b8f2,0xaebb528e,
  210961. 0xf44acef0,0xdd5ca828,0x20c57a54,0x24209adf,0x78f95f44,0x5742b433,
  210962. 0xa9337d37,0xd11fa7d9,0xc64cfdb7,0xd66a0c09,0x9bb817ec,0x56e55b8f,
  210963. 0xe4c41265,0x1723c7e3 } },
  210964. /* 115 */
  210965. { { 0xdc8b43f3,0x9a6486d8,0x26409e68,0xfc3e0e61,0xd9b46003,0x1889c437,
  210966. 0x6284ec7b,0x3a850335,0x6a9dbaea,0x5a3665c4,0xe978933c,0x7bf6941d,
  210967. 0x69341490,0x1ed5a510,0x8cb8002d,0x664a7b7a,0x60ed0a59,0x603f76e4,
  210968. 0x1f4ebf27,0xc3e06ba3,0xf2c38a7f,0x296ced41,0xcf1db08a,0x2ac18f79,
  210969. 0xcde7a3b6,0xc919e882,0xdbf68b06,0x15e77d29,0x4e947cb5,0x21978baa,
  210970. 0x7630993a,0x84bf542b },
  210971. { 0xe364f21e,0xc1decda9,0x012e557e,0x0d6cf345,0x588f90e1,0xba246848,
  210972. 0xe3b104b8,0x9f6dda4b,0xe3aef57a,0x6bf7a346,0xe8327ea9,0x210299fe,
  210973. 0xda95e6c7,0xaa99f487,0xd2cdf645,0x24ff813e,0x8bd414b8,0xd1dbb2d2,
  210974. 0xcafa1a61,0x065101af,0x9cdebda4,0x7d9f4b9a,0xe41039e4,0xaf41b395,
  210975. 0xc50adf42,0xe3e9e6ba,0x341e9e49,0x4f2133ae,0xcb157f23,0x4968c0f3,
  210976. 0xda068153,0x383f827b } },
  210977. /* 116 */
  210978. { { 0x6583ff4c,0x2ec46a21,0x4ad709e7,0x4e645a29,0xc04ca12a,0xdc66e9cf,
  210979. 0x9160a7e5,0x82f128f4,0x569c762e,0xbfb227b1,0xc2edb8e7,0xf80c7963,
  210980. 0x49a0f688,0xa7dafe06,0x2d14b8cc,0xb7e41754,0x86de40be,0x3a0c5c53,
  210981. 0x1db79331,0xf0d05286,0xfbfe071b,0xb902ce69,0x210e9903,0x61e46956,
  210982. 0xf703ebb8,0xfaef874e,0xdd5f78b6,0xf668947e,0x5af5ea3a,0x6fe86547,
  210983. 0x43f94625,0x3b121f15 },
  210984. { 0x659275e9,0x5b26e847,0x6d0fce50,0x47581cfd,0x8aa3f1ef,0x55f5cbfd,
  210985. 0xe484e60e,0x1e7be315,0xfe9698e4,0xd8f1a20f,0x7ab04784,0x25d46da9,
  210986. 0x834cdb3e,0xa526db75,0x8d08a009,0x1fd408d9,0x5b5ca816,0xfc004b20,
  210987. 0x65e4bbe8,0x5b3e3bb3,0x759bb6ef,0xf50cc125,0xc2fac737,0xf05fa817,
  210988. 0xd273951a,0x9ee102d2,0xfecb3367,0x2a8e540b,0x2a6a515f,0x673446fb,
  210989. 0x37290c83,0x5505e1d1 } },
  210990. /* 117 */
  210991. { { 0xd15e68a6,0x0c3014a1,0x64dd35e5,0x6f9f0b26,0x03ad67f9,0x18c3742d,
  210992. 0xd2c14484,0x74818c0e,0x0d41a3cb,0xc5181169,0xc49f3e9e,0x65c8c83f,
  210993. 0x2c279386,0x9b260c61,0xced04e9c,0xf6086fae,0xfd7c4758,0xa7b2cceb,
  210994. 0x90297fd8,0x4b3c3133,0x09701ac8,0xca8264e8,0x508b3762,0x9f976a87,
  210995. 0x983a8dfe,0x5d582714,0xd9d598e9,0x350d2669,0x0f6fd348,0x85cb89cb,
  210996. 0xa574317c,0x617d80d4 },
  210997. { 0x70022b67,0x4cef267e,0x3768b94a,0x80536bb5,0xd2784462,0x3153a566,
  210998. 0x38243919,0x49054d44,0x5df78c4a,0x8d11e172,0xd5a1e35a,0x9b252a71,
  210999. 0x8171e31d,0x07866c80,0x1b38a00e,0x0a8501db,0xce770236,0x2ed932b8,
  211000. 0x8edaf7d0,0xa2d77609,0xb93006e9,0x3aee5dab,0xbbfeb036,0xfaffc8c4,
  211001. 0x4e21b38b,0x077b9678,0xdca8e069,0x491fc59f,0x0e938471,0x3f624f55,
  211002. 0x7cd1780b,0x5156f508 } },
  211003. /* 118 */
  211004. { { 0x0206e8d0,0x58234e22,0x7f15af32,0xf5f6f5d4,0xd638950f,0xafab7289,
  211005. 0x7d4495f4,0x66ec4d09,0x68da80a9,0xad890c5d,0x64f8a36b,0xe4aa0920,
  211006. 0x0f4d5c5f,0x799e257e,0x24495e31,0x44c677ae,0xa5b8e352,0x720387b3,
  211007. 0x75a287b9,0x703790f4,0xc3c1f2f7,0x54895cc5,0x41a7fa41,0xb8680f9b,
  211008. 0xb00b008b,0xfcd47458,0xba6473cb,0x149cc838,0xac9be19a,0x78ed5f7a,
  211009. 0xb33765ba,0x5254599c },
  211010. { 0xa21b54c4,0x08739679,0xb6497d9d,0x029ece2a,0xc8488640,0xf14f1a92,
  211011. 0xe9fa79d9,0xae48dcff,0x46c208db,0x14b911c2,0xdae3f69e,0x5ab0fbf2,
  211012. 0xd1edb838,0x180ac87e,0x188586bb,0x146fd718,0x5467cbd0,0x210eb654,
  211013. 0x1667cfee,0xaa239408,0xb73d1a60,0xdb125c1a,0x881c1cbe,0xde685300,
  211014. 0x37c30232,0xfe34c713,0x6f3c8d18,0xc6c6070e,0xb4af4e83,0x07e365ba,
  211015. 0xdcf82b45,0x22f0a7ed } },
  211016. /* 119 */
  211017. { { 0xea7f1b7f,0xe262791f,0xdcff09d4,0x9c3d8c5d,0x39c7dc58,0x86c2a9c3,
  211018. 0x4276e8c0,0x4dad4017,0xe9fe1d56,0x0a918f59,0x2aa810c9,0xb8d79670,
  211019. 0x4aa5cdc4,0xeb7a8836,0xe7afa72e,0xfc4c23bb,0x4ac86908,0x4dbb5c9e,
  211020. 0x6a0c7e6f,0x37e39013,0x49c218d2,0x855d7001,0x94b324a2,0xe475bc67,
  211021. 0x6287a071,0xc98a8dc6,0x5fb4323c,0x395a299b,0x0c0389e9,0xe186c3ee,
  211022. 0x16734c46,0x79f81e6f },
  211023. { 0x364f3c4e,0x83f2c1f3,0x1367e14b,0x536b2ac5,0x5933e43d,0x44a6dcfc,
  211024. 0x10d961fe,0x34e59475,0x7e3f2aae,0x08234ece,0xbdea7f25,0xcb92e00a,
  211025. 0xa791a124,0x1efba4f0,0x1192d53a,0xc2086fd2,0xb51c8af6,0xfec0d0fc,
  211026. 0xdc0f1b5f,0x48d1b2ca,0x812dbe19,0xb07a388f,0xdedbdd45,0x40873a6a,
  211027. 0xd702589a,0xbc2a1268,0x17e27b64,0xbbf6e3a8,0x6d386e85,0x73ee5663,
  211028. 0x9de7c000,0x442ecd37 } },
  211029. /* 120 */
  211030. { { 0x8a2f90a6,0xb4cd1ae6,0x6f5ad0cc,0xf277d41d,0x401d4b8e,0x6a3828c4,
  211031. 0xd8376631,0xe817a134,0xf5e1124b,0x142b758d,0xfd6b95e4,0x25fbc69d,
  211032. 0xd74a9e3e,0xa30c9f5f,0xd89663ce,0x5ac0f163,0x0ce6386d,0x32a9eef7,
  211033. 0xd8ed5544,0x7a690ea5,0x9889427a,0x5de23ff0,0xeaaced58,0x75ad36a5,
  211034. 0xd3e18465,0x3514a6c1,0x7f093910,0x3d9162c3,0xe33d56e8,0x5c10add9,
  211035. 0x06aa691e,0x85176b73 },
  211036. { 0x28a21e38,0xa32110fa,0x5773d538,0x97b6379d,0x2d020dc4,0xd3697bbf,
  211037. 0x961833cd,0x59177593,0xe5fa8516,0x6d7045fa,0x786ab5d2,0x3390f29a,
  211038. 0xdc4f5b70,0xac0bda30,0xdcc615c6,0xcca0240a,0xc5146d91,0x8e1f1702,
  211039. 0xa72cef87,0xceb472d0,0x0b669ba1,0x84840708,0x7e61aa0a,0x79b08f9d,
  211040. 0x4669560b,0x388160be,0x948eb71e,0x23935c2d,0x9431590c,0xd7fd83c0,
  211041. 0x6e5768b3,0x8ab154bb } },
  211042. /* 121 */
  211043. { { 0x353c4a96,0x28686003,0x905cd835,0x4e5c60e8,0x8f66f8cc,0xbd591364,
  211044. 0x9faccf9e,0xb6b80b98,0xe32639e5,0xbc1c1fae,0x278aadeb,0x2f6396d2,
  211045. 0x1898202d,0x00a796d0,0x3a474835,0x18ab548f,0xb31b0e3e,0xacd056c3,
  211046. 0x0164512d,0x15ba68dd,0x4b03f3bc,0x203836d9,0xd8f206c5,0xd64eca6b,
  211047. 0x9f1779b6,0x931a361e,0x52ab34a8,0xd82690fc,0x92922e22,0x342bb8e0,
  211048. 0xe00b02a9,0x1bfcdd84 },
  211049. { 0x75a365d9,0x310b9a43,0x08d8fb03,0xd4ade15e,0xd742df83,0x9c9753d7,
  211050. 0xde318742,0xcf7309d4,0x3360ace0,0x1228e212,0xf7669643,0x1043d238,
  211051. 0xf90f5a53,0xfc2adbed,0x7b5f9397,0x41d64cb7,0xc446d010,0x5200b30a,
  211052. 0x231720fe,0xc3c8642d,0xb9aa2075,0xfcc0122d,0x041eae47,0x856e3b12,
  211053. 0x68c876a4,0x45864455,0x233606b1,0x1a1c7842,0x227757bf,0x9b766d1f,
  211054. 0xf7b9d4f1,0x25b78a3b } },
  211055. /* 122 */
  211056. { { 0x156707ce,0x90835718,0x4314f90a,0x9bdc2398,0x8be57dbd,0x017c885a,
  211057. 0xad63a4b8,0xd4bba225,0x15aacffd,0x5ce71b86,0x72954722,0x5f266475,
  211058. 0x4f0ad3dd,0x0a80f1f7,0xfc352ed7,0x010538a3,0x4203c6ca,0xf8a64045,
  211059. 0x330c73b4,0x2b2c7a88,0x02dcac1b,0xb3433ee6,0xed2b17c7,0x2e0499cf,
  211060. 0xbd6329c7,0x9f8681a4,0x36fadc37,0x38979946,0x92b7895b,0xdc5650c8,
  211061. 0x65a51cf0,0x70ab9570 },
  211062. { 0x7b585d93,0x46778ec4,0xa633fe4e,0xca6d3610,0x4ea0311a,0x21da154e,
  211063. 0xbd64002f,0xaf22190b,0xd91cb7a9,0x9e633ac7,0xee6837d7,0xed13c31f,
  211064. 0x1616ee8a,0xda4a07d7,0x3afcd616,0xd78a2732,0xba14d694,0xc06696e5,
  211065. 0x4df58420,0x733754d7,0x2778e3c9,0xe85e504e,0x55b5a5c2,0x3055aa0c,
  211066. 0x8a3acb5c,0x313df538,0x2a088eda,0x5896acb5,0x84c85dde,0xfc8842a0,
  211067. 0x51dde6be,0x5fec9f79 } },
  211068. /* 123 */
  211069. { { 0xfe519f99,0x5ebc2c7c,0xe5410353,0xe396bd80,0x8a3988f3,0xaded9402,
  211070. 0xd601bda1,0x1c03b735,0x14ce64ac,0xfd302036,0x01240290,0x5837ebe9,
  211071. 0xa554097d,0xcaaea1a3,0xb0b88139,0xdce73d25,0xecb090b9,0x35ed412b,
  211072. 0xd63dab3c,0x99029ff7,0x062db071,0x555437d9,0x42a4c11d,0x277d2f56,
  211073. 0x24fc9109,0x477fa645,0x2799254d,0x7b12e9b7,0xd84c618c,0x7ad2ae22,
  211074. 0xce8ed195,0x0a8d5663 },
  211075. { 0x0a21fde1,0x43ac5163,0x6903d849,0xcfcf5dd6,0x5fdd6281,0x6d2499ee,
  211076. 0x77a49a34,0x4dedc6f0,0x2875c06f,0x46bda2c0,0x347b8046,0xd0e0e0f6,
  211077. 0x5e67836f,0x1058169b,0xde8a8042,0xc961912a,0xa93b3d32,0xdf3fea0a,
  211078. 0x0c576bc5,0x9f138edb,0xd8d37e47,0x7971ad6e,0xcce5e7cb,0xeab85739,
  211079. 0x1d202b40,0x88a4b434,0xe3a1fd26,0x5d842557,0xb3a86f91,0x872fabd5,
  211080. 0x6aa4629f,0x95b93493 } },
  211081. /* 124 */
  211082. { { 0x99f951de,0x9998a701,0xf058db45,0x8fade596,0xf3d03dd3,0x4d479c1e,
  211083. 0x33b141d3,0x6e928d5d,0xacfe8a40,0x9a465800,0xc1cefa3d,0xd108ad2f,
  211084. 0xe013726e,0x64b96921,0x8e83bb9f,0xb9b6a6b6,0x1242e544,0x29f1e6dc,
  211085. 0x2f65966b,0xd3f8f676,0x5e105b41,0xa34dd096,0x16011e1c,0xd4e9139a,
  211086. 0x2515541b,0xeea4dc68,0xc822166d,0x6f8030ac,0x31d16124,0xbdc7ae1d,
  211087. 0x621afa7d,0x2e25ef51 },
  211088. { 0xdd8e7357,0x2533cf8f,0xeaceddb8,0x333ba218,0x0784d2ac,0x68e3e31d,
  211089. 0xf2804ae2,0x1c927f36,0x77e7ad7e,0x01433d22,0x587f78a0,0x0b401cf0,
  211090. 0xaa0027ae,0x9dfcf036,0x1d9a46b5,0xc9e46c8b,0x1f288d32,0xaa6de486,
  211091. 0x1b8a043d,0xdd56da2f,0xf2d0bb56,0x346230e5,0x19defb56,0x19f0b6e4,
  211092. 0x21d2c874,0x55ec37cd,0xb70e45b3,0x3dbf0397,0xac7ce852,0xf0862a8d,
  211093. 0xe141f3d6,0x87979ea7 } },
  211094. /* 125 */
  211095. { { 0x7f1c747f,0x9b7e7b3f,0xc6e63369,0x151a4c1d,0xb372dba0,0x4273ff70,
  211096. 0xd3ee54fe,0xca6d2234,0xd33cae0f,0x12fc8e0c,0x5dd6f10c,0x27328538,
  211097. 0xf01a9cf9,0xc86f3fbd,0xe36cae91,0x5322677f,0x2fefea44,0x39a70033,
  211098. 0xce8af217,0x2c9ca328,0xf6a731f4,0xc0256776,0x66a96813,0xc687b3df,
  211099. 0x8db2eda8,0x194aab12,0xeec4febd,0xde30dc5a,0x979241b2,0xc052236a,
  211100. 0xc23d4c16,0x3ec98802 },
  211101. { 0x4072f74d,0x0f9e760c,0xab594059,0xe78eb0de,0xc9b009c2,0xdb3dea40,
  211102. 0x38b59ae5,0x47e875f0,0x2b4daa06,0xf40eb436,0x090f3788,0x9a6a4f92,
  211103. 0xedbfaf8b,0xefebe9af,0x9867e256,0xf87f96a5,0x75ab6aeb,0x1e6fed23,
  211104. 0x3fdb13cb,0x17f2782a,0x70fa2621,0x5102c71e,0xfd4c0dbe,0x5d2b06ec,
  211105. 0x30347297,0x537cc268,0x2b67e780,0x8dbf5e2b,0xba25da32,0x2f633f3a,
  211106. 0xefaec914,0x3e9315e8 } },
  211107. /* 126 */
  211108. { { 0x239a9ea9,0x9255cfa5,0x0be33a62,0x20f3c690,0x9cb642bd,0x759eeb4b,
  211109. 0x00bae718,0x3316c546,0xf3410f84,0x874a76d5,0x90f129b6,0x123b502e,
  211110. 0x12851f1c,0xadc8f9a8,0x1b62408c,0xf57b764a,0x1a80777b,0x116ec01f,
  211111. 0x1f0ddc5c,0x746ecef2,0xe5a6a5a7,0x3c49d47c,0x06e955ba,0x1e15dbe7,
  211112. 0xb45d79b0,0x629c0c79,0x778d1087,0x11278308,0x8c6a22d7,0x22585dc7,
  211113. 0x0a682791,0x2ed02a0d },
  211114. { 0x4daa2682,0x53043416,0x01359625,0x0e26d32b,0xbd867097,0x449c834a,
  211115. 0xee77ae2e,0x11a19d2b,0x3af6c169,0x39bd529a,0x5cd61054,0x36cca5c0,
  211116. 0xdc6c0fe1,0x6370a59b,0xb93d5135,0xca420d27,0x554c451a,0xd8730d45,
  211117. 0x96cdebf2,0xebd258c9,0xa50f9a05,0x0cb1b990,0x7b0f0151,0x69a8c97a,
  211118. 0x11d217e1,0x2cc36d34,0x752f75e8,0xf117688a,0xa09b2a61,0x1db01394,
  211119. 0xa9efd7dd,0x14627844 } },
  211120. /* 127 */
  211121. { { 0x232803cf,0x6bca3aed,0x9a96ff34,0xc1e4398b,0x74ab788b,0xcaf6757f,
  211122. 0x7e68c04d,0xc3a53e00,0x5cb7cd20,0x5f969c19,0xdc068bca,0xf28b65a6,
  211123. 0x1d863032,0xe3ca01d3,0x87808e14,0x9b733b81,0xefe618be,0xb5d704d9,
  211124. 0xb01b946d,0x276f3542,0xfbedddbf,0xe057e19e,0x903275ce,0x7d182f2b,
  211125. 0x880f7bc6,0x3cdc5f77,0x78476c14,0xd6f03d3f,0xa9ba5072,0x035f5557,
  211126. 0xb4029628,0x7acb57b6 },
  211127. { 0x44e6b07c,0xd2413569,0xe1c7345d,0x451c4cc9,0xe273b9fb,0x407444d8,
  211128. 0xb88e34fc,0xfe496079,0xf152776d,0x77d184cf,0xc742299c,0x6d1033b9,
  211129. 0x77bf2897,0x29a0a684,0xee8f0420,0x59ffdf10,0x44bb56d6,0x4e17146c,
  211130. 0xfb9ae855,0x831d06c2,0xd93e7cd5,0xb2cb82db,0x3c96b607,0x83381c46,
  211131. 0x7549e2a8,0x06aed251,0x774a21d4,0xef97891c,0x8675fbdd,0xae9807c7,
  211132. 0x6363516c,0x6a5a05b9 } },
  211133. /* 128 */
  211134. { { 0x6a8f4f33,0x92e71ea6,0x4dea8f4a,0xf2fc6fc6,0xfee88461,0xd356252c,
  211135. 0x08954d08,0x59b0a83e,0x468ab766,0x5bd68c23,0x900f8d04,0x40281357,
  211136. 0x52b867ae,0x181c19c0,0x18764c41,0x986a5169,0x13575d24,0xcb01dfae,
  211137. 0x593677b7,0x17269ae5,0x46dc9b19,0xf6d17025,0xc40097c8,0x8de68499,
  211138. 0x259c407b,0x76df0032,0x17d29d8b,0x4091aad9,0x4a7ab5f6,0xa7f46d21,
  211139. 0x70ece48c,0x688054b4 },
  211140. { 0x51a5b86c,0xf0d168aa,0x95777247,0x2437e4d8,0xf1720329,0xae844076,
  211141. 0x9647a54e,0x0a7ac87d,0x0405622c,0x1e597a4b,0xf0a79f2f,0xedefe5c6,
  211142. 0x4d55156d,0xaf3ef0c2,0xef047cf6,0x917fb04e,0x54b62137,0x3792799f,
  211143. 0x314be0b8,0x875ea32f,0x0c466b0c,0xe157c65b,0x7e218978,0xd28c90ce,
  211144. 0xcde587af,0xb90fc3ba,0x8b877bed,0xdd32d71c,0xca8e10cd,0x3b432200,
  211145. 0xd94f6e53,0x0021f419 } },
  211146. /* 129 */
  211147. { { 0x43519d26,0x2191122c,0x40a51845,0xbdafac1d,0x548bb89f,0xcc6f71e9,
  211148. 0x16844bf9,0x9ef3375c,0x178e8d55,0xe7789f79,0x1f8be1c5,0x04f599b6,
  211149. 0x2cbbde40,0x8088c99a,0x893206c9,0x8939a260,0xfcd30851,0xa1ae4bff,
  211150. 0xe08feafe,0x664cb3fe,0xff14aabc,0x61f38099,0x2a841ef9,0x0d8394cc,
  211151. 0x17f01db6,0x75fad8ad,0x6debb773,0x6fc34576,0xa4252512,0x1e716b05,
  211152. 0x29e1ed9f,0x79855880 },
  211153. { 0x95106473,0xa2cb3aaa,0x5a61da04,0x95fafa41,0x539563c0,0xfd3c9362,
  211154. 0x95312b87,0xbaa48091,0xbf885c76,0x6c7e7582,0x230c78d5,0x70f6dab6,
  211155. 0x7747440d,0x8ce3051c,0xffdb6186,0x6dbebd14,0x190e4096,0xb0e041fa,
  211156. 0x6ee62e2a,0xba10c466,0x74f333d6,0x93d57e2a,0xfe7b9b66,0x006aadc4,
  211157. 0x06d2837d,0xfaf72f6c,0x910741ea,0x318cc5e6,0x65692477,0x9c502609,
  211158. 0x1d0fb08d,0x95d823c3 } },
  211159. /* 130 */
  211160. { { 0x140528a5,0x6aeebd86,0x53979bc8,0xf268c2ba,0x4ec144ab,0xb1bc9b8a,
  211161. 0x82a7d7ed,0x1efabb0d,0x4e0118d8,0xf12c70d1,0xa1c1558e,0x31607168,
  211162. 0xe4b7e73e,0x33e428b7,0x83aec9dd,0x63176637,0xe12ac35c,0x5172ffbe,
  211163. 0xbc17b2a4,0x37df0bfb,0x741f812a,0x4212f870,0xe2888f9c,0x3dcecbdb,
  211164. 0x756ca55d,0xa9dc15aa,0xb9028e41,0xf31918ec,0x6aeadb03,0x7ede0285,
  211165. 0x78654f54,0x0e2708d5 },
  211166. { 0xcde20f88,0x2270cc53,0x5f5b1039,0x9338272c,0x5dcb1dbf,0x5042e19e,
  211167. 0xb72d74c1,0x4b3de219,0x2aaaaa55,0x16c49a8b,0xbba86ba6,0x008443e5,
  211168. 0x20cf1695,0xee6bcd72,0xa89abd11,0x59ffac6b,0xf115639d,0x2831217b,
  211169. 0xf34cba52,0xe4d28af2,0x0727a906,0xf27f03e7,0x69017766,0x6842c79f,
  211170. 0x7a81123e,0xcb3469bd,0xa42973b8,0x48c0f346,0x23990dbd,0xfc5784a6,
  211171. 0xfb299678,0x0d3dab3b } },
  211172. /* 131 */
  211173. { { 0xce29c3cc,0x8f8376e6,0xf016cbc6,0xcb0507ec,0x5e394ce1,0xdebff996,
  211174. 0x73c50d41,0x24fc526f,0x2d16ce3d,0x4edd5a54,0x91c13141,0xbb37bdd9,
  211175. 0xe33a8606,0xe3442ef2,0xc0629da8,0x2ae90337,0x592ab331,0x57faec64,
  211176. 0xd82b857b,0x1a938997,0xa3373176,0xad6c8cb9,0x9086751f,0x82595de2,
  211177. 0x18c17196,0xa81e97fb,0xbf697357,0xe4f48a13,0x5cb89f69,0xa1387c2e,
  211178. 0x5874b426,0x530b4eeb },
  211179. { 0xbab7b5ae,0xe9f275a1,0x03a57bf4,0xbb69dc4d,0xa45c505b,0xc974dc4a,
  211180. 0x416ac402,0x726369f3,0xaed985dc,0x735e4e78,0xcdd446a1,0x0548d879,
  211181. 0x9e16b02a,0x84ceb069,0x789b11a6,0xf73f6fa4,0xb2a4e784,0x6aa0c41f,
  211182. 0x93a9b697,0xb1f76902,0xf03a8ab2,0x814cce00,0x844d66c1,0x64cb255b,
  211183. 0x30952201,0xb794e7d6,0x3da32271,0xe052d4e4,0x08b6a4d9,0x5278b2e7,
  211184. 0x80c6577f,0x90942552 } },
  211185. /* 132 */
  211186. { { 0x0d5b4c2f,0xd269a14d,0x5c8a649c,0x2b8fc59b,0xb0e37d4a,0x95becb3a,
  211187. 0x9111037e,0xfda1a768,0x94e35322,0x5810e05a,0xa178fafc,0xa24dcc12,
  211188. 0x8e3dce62,0x5c2c63b2,0x9452c444,0x995c3f17,0x42d45161,0x35330ec3,
  211189. 0xb4ef8129,0xa025a60a,0x8bae9c13,0x85493252,0xe2e3caf8,0x25d1a606,
  211190. 0x3649bf47,0xd44091ab,0x704ec5f1,0xc7d0afbf,0xbd8b3333,0x27bd1d62,
  211191. 0xcfe616f5,0x50570111 },
  211192. { 0xf534356b,0xd0084ace,0x4b4b0fbc,0x9df1de05,0xcee04dc1,0x021afe05,
  211193. 0x361b78e1,0x64bde688,0xef78d38b,0xa324fcc7,0xeb0a5e4e,0xfeb372ce,
  211194. 0x65811996,0xef04fcb3,0x5eb0ab4e,0x7dce5d50,0x238c586e,0x1e29b588,
  211195. 0xbcd80037,0xde5e3197,0x4806b9cf,0x8bf5e451,0xd18e67ab,0x4330968b,
  211196. 0xf9f63fad,0x26a7d04e,0xb5c18bb4,0xa1c7f123,0x25dce22c,0x485b8482,
  211197. 0xd540e79f,0x8ff0b36f } },
  211198. /* 133 */
  211199. { { 0x3ff42cff,0x99f2e2f4,0x1c35317c,0xa3c19f9d,0xaba1b545,0xdb749392,
  211200. 0x4afa9a32,0x84232b05,0xd7dcd436,0x0b855d46,0x45cf9915,0x8ac35e20,
  211201. 0xf001a218,0xd7cf22c7,0xed408305,0x057d35ae,0x553ccfcd,0x25a4a519,
  211202. 0x93e2b939,0x5e565793,0x3422ec27,0xa20332b0,0x3ac53958,0x9b09005e,
  211203. 0x79e9b163,0x628051a3,0xfc6618d6,0xb4a0dc09,0x6748e7af,0x9e0e857f,
  211204. 0xc577d63e,0x71b28eee },
  211205. { 0x99726bf8,0x4942b0cd,0x1c208f3c,0x1290a3b9,0xb0598eaa,0xfd7290e7,
  211206. 0xa25a9128,0xc6a7791f,0xc037d7da,0x2d33db24,0x70e2837b,0xc21efeb0,
  211207. 0xe3dae2a0,0xbf70d96e,0x85076027,0x43ed8191,0x4d4ad7e3,0x4aeb0aa8,
  211208. 0xe8c5b74c,0xbc75101f,0xad26ebdd,0xdbfb2a6e,0x6b78aa4e,0xba812068,
  211209. 0xe1159848,0xc94aa8f2,0x3eba5c4e,0x0d10d9db,0x6318295a,0xce7fec47,
  211210. 0x330d925a,0x7294711a } },
  211211. /* 134 */
  211212. { { 0x32bbd495,0xfce45904,0xbe54973f,0x330f4dd1,0x5d9c3f4e,0x006bee1d,
  211213. 0x59ba7204,0x40ee6078,0x42c2c768,0xc194fd3f,0xe9fe88be,0xa0e76b12,
  211214. 0xec2b0210,0x17cddddb,0x00811ec7,0x689d436b,0x284be9e4,0xa6a6ba37,
  211215. 0x007d4114,0xabc395b2,0x0f11e744,0xf8cdf9f3,0xe9396402,0xc5febec8,
  211216. 0xeeb46285,0x8a751743,0xc6e0d137,0x99bf8782,0xbeb292e3,0x3965e170,
  211217. 0x5801fd5f,0x001c39d8 },
  211218. { 0xda4a0912,0xf4805cb9,0x4410bca4,0xd27cb76a,0xec71d65b,0xef3dcb8e,
  211219. 0x4816849a,0x780fbb2b,0xa8b24635,0xef6a7026,0x12c44e68,0x15625c88,
  211220. 0x4d7a74a8,0x624c232c,0x4b1631e4,0x81a77037,0xdb917c2e,0x04e4f7f1,
  211221. 0x1f61ed95,0x1d0465fd,0xcbde6e3d,0xb1048049,0xd7131fcf,0x637ce0c1,
  211222. 0x8ada4715,0x22e4dbc2,0xace99726,0xf7530c5c,0xee287450,0xa0160dcc,
  211223. 0xbb91af13,0x9132e670 } },
  211224. /* 135 */
  211225. { { 0x7996099d,0x8057efe2,0xa06e608c,0xb72344db,0xd0958588,0xeb4a8740,
  211226. 0x79e5aee9,0xe53daf06,0x908a2fad,0xc9560a9a,0x107e706a,0x7f4be131,
  211227. 0x2830246a,0x6d5f3d9b,0x27cca3e6,0xa5f8e8da,0x4c28f292,0xeb51dca6,
  211228. 0xf31dfd78,0x4cfa310e,0x2ca073e5,0x92e0c7c2,0xa40da683,0x102f1694,
  211229. 0x750d38fc,0x16bb07cc,0xbadae035,0x703e83e2,0xb4d3c9dd,0xea93c066,
  211230. 0x79940ed1,0x7d0b03e5 },
  211231. { 0x4dd94c63,0x5fe7ea30,0x738b0b3a,0x57ef01c5,0xa14e6b4b,0x9534a78c,
  211232. 0xa5353276,0x07622cde,0x7c22d006,0xaf696a07,0x7d46b209,0x733c1886,
  211233. 0x626c2b4a,0x9654ccbb,0xa84f3c4c,0xa098d3a1,0x2d734b74,0x3596f9ed,
  211234. 0x5d551c90,0xdfd3021a,0x1ec5123f,0xe2ba7d2f,0xb2c1aa39,0xf9726925,
  211235. 0xf8eb2927,0xd2e75d0e,0x19192a6f,0xfaba712e,0x9b83e50e,0xa606b43a,
  211236. 0xdab5de60,0x31b1782f } },
  211237. /* 136 */
  211238. { { 0x4034db92,0x878dba45,0x8f34dc4d,0xa3977901,0xdf754c33,0x8d004f2e,
  211239. 0xcd563a88,0xeaa5954a,0xbb5ffad1,0xa29d6c89,0xb0d8bdb8,0xa8adf655,
  211240. 0x8cdbdb47,0xf7fb842d,0x80d3205b,0xb72e3a03,0x7cac7ca9,0xc335b0b2,
  211241. 0xd8a5475d,0xffc60bcb,0xeba4d25f,0x736f7719,0x0c50fca6,0x3d901c38,
  211242. 0x80c01900,0x1fdacf7b,0x5681f84d,0x75cf658f,0x5cefbbc1,0x57a7e634,
  211243. 0x3e07ed1f,0x6fc0fbe5 },
  211244. { 0xb81b0e5f,0x496d116b,0x2ac853b8,0xd82dd2a5,0x327387f0,0x357e22d4,
  211245. 0xba912c59,0x3e332a84,0x49d5dcc1,0x8b71c643,0x438d85d3,0x0c982ee9,
  211246. 0xbf7fcd4e,0x90b9553c,0x38fed5e3,0x2cb39bbc,0x5ac42903,0xa2c67c9c,
  211247. 0xbf07da55,0xebf21217,0xa0b9e4ee,0x55ac05ad,0x8ee9e0c6,0x10bb12c2,
  211248. 0x48bb6e3f,0x5cf3aee5,0x8b046e91,0x4ae7269c,0xaa0e553f,0xcb266012,
  211249. 0xa94c8fc8,0x701935a1 } },
  211250. /* 137 */
  211251. { { 0xa4626dea,0xde58d41d,0x15b9039f,0x25ef66ca,0x3164e65b,0x99a810a4,
  211252. 0x748cfccf,0x9fe6daad,0x2f142fa9,0x7ab9a6bd,0x5d471796,0xa4cba168,
  211253. 0x6bc3a39b,0x12d30b36,0x8bf45076,0x1f46a5dc,0x1421ac0e,0xb868e529,
  211254. 0x59bba1c4,0x7a686206,0xda698b90,0x2b4b552e,0xe5453707,0x5039dcd4,
  211255. 0x9e90165f,0x42a07a9e,0xd7d45dfc,0xa838fff3,0x3b5ceb30,0x41991e5a,
  211256. 0x969ca600,0x6c961ec8 },
  211257. { 0xc4e7eb46,0x703bdc1b,0x596c7b48,0xd6bac557,0x66afd74d,0x4f9917cd,
  211258. 0x656ce6f3,0x56355105,0x32497175,0x3d1fb50c,0x63effb2d,0xfda6783e,
  211259. 0xeefaa2bd,0xbd79f1f3,0x17af9ef7,0xa4efbe54,0x5a55b7a4,0x6cef6462,
  211260. 0x1a713304,0x116f3238,0xb95625a3,0xdb2a2a7f,0x0b027e96,0x6a0aa43a,
  211261. 0x4832b3bc,0x458fe5d2,0x5adfaac0,0x523418df,0xc49e7f9a,0xc05a89cb,
  211262. 0x69e24b53,0x830883d8 } },
  211263. /* 138 */
  211264. { { 0x02557389,0x959b1c62,0xadefc0bc,0x5fe5ce97,0x8330f383,0x893bbe7f,
  211265. 0x16cfb81e,0x27e0c6af,0xd04428fd,0x6f64e65b,0xb79e6182,0x53de9245,
  211266. 0x487e11ca,0x08a313c1,0x445bce93,0x65cec3b9,0xd67ed49e,0x33bc0314,
  211267. 0x30782352,0x69f36b24,0x93ad31d2,0xd78e5daf,0xc780890c,0xf2682b70,
  211268. 0x9e45efe9,0x7015c34f,0xe6cbafea,0x135d4ba4,0x7e3fcc6c,0x43a378a4,
  211269. 0x96638f8c,0x2376f97f },
  211270. { 0xae575b99,0x0a6e1ec0,0x81b970dc,0x7e14cb4f,0xd3a73947,0xf00a3824,
  211271. 0xfb235a9d,0x0b4b9c81,0x5bf62944,0x8d15115f,0x1e165d7a,0xcfd35b43,
  211272. 0xb2ee3e3b,0x5d12fea2,0xf5182e7b,0x629984a6,0xc365d08e,0x4e43e2f3,
  211273. 0x30f36e72,0x99327091,0xfd345401,0x698b4a00,0xbaf96dce,0x23c4fd0e,
  211274. 0x23675554,0xa60ba0ae,0xb0325784,0x51bdac2d,0x215464a1,0x8ab4190a,
  211275. 0x6bf10296,0x8c461661 } },
  211276. /* 139 */
  211277. { { 0x2d1f36a5,0xeffca258,0x894c5f2d,0x0eded2b2,0x43ced84f,0x35a5cdb8,
  211278. 0xdb0e3b9b,0x290f8982,0x0719a112,0xcce0eaf0,0x39a362d6,0xd0e657e4,
  211279. 0x62697e47,0x5516a55d,0x8e636514,0x269e1f77,0xd50269bc,0x5e3dedcb,
  211280. 0x441c57c5,0xecec2300,0xc705578d,0xdb83f31c,0x1e489eab,0x1bdefb73,
  211281. 0x395fcdb4,0x20b678cf,0xff9db001,0x908cf91c,0x55f52cc8,0xcbebc6f4,
  211282. 0xb4c61162,0x155ea622 },
  211283. { 0x876fa42e,0x94be2f1f,0x7fadeee7,0xab5e8749,0x38c865af,0x692e70f5,
  211284. 0xdf8059b0,0x16e99b84,0x8b5a7ac9,0x0ceb606e,0x2d463d2b,0xced23357,
  211285. 0x2a9a09a0,0x2d0f2623,0x3861fbdf,0x2529998c,0xc1be310b,0x711888a7,
  211286. 0x0d8aade3,0x9b1229c5,0x3b13533d,0xdbcf9b78,0xff029708,0x3ca746f8,
  211287. 0xda83ef88,0xa5a013a1,0x4ab28444,0x8e904d18,0xbcbd4aba,0x2fe84b3d,
  211288. 0x259058c3,0x8f570f24 } },
  211289. /* 140 */
  211290. { { 0x2ca9c508,0xdeb66c8a,0x69d6b780,0x2dc5bec2,0x88ead600,0x16d61266,
  211291. 0x49d72614,0x61841b97,0xce472e6f,0x41e40e6c,0x1fa7a876,0xada24264,
  211292. 0xcc3997a0,0x45b9fd33,0x7c15dcf4,0xb25e8fa9,0x12e9629d,0x0124ceb2,
  211293. 0x7db3d956,0x3a8c72c6,0x7c1a7844,0x8e2ded2b,0x6dd027ff,0x94ab09c6,
  211294. 0x7e7a2bc6,0xf89a057d,0xcf70c763,0xad8bf226,0xc8a26212,0x4cb268e7,
  211295. 0xb2c44c1d,0x3d171e87 },
  211296. { 0x8ce49820,0x382ac16e,0xc0c44dc9,0x24ee45e2,0x73e858c4,0x0ec67912,
  211297. 0x46327cf9,0x918cb25c,0xc6159c1f,0x43e3876b,0x37545cb3,0xb6b6e0e0,
  211298. 0x5d12347e,0x64b839ab,0xa300d541,0x72e09274,0x881c1169,0x26ab28e6,
  211299. 0xeb75a843,0x4a580fff,0x359120df,0x0a5802ca,0x3209f4a3,0x7fee82d0,
  211300. 0x8e6a9380,0xb518016b,0xc2ee11ca,0xb99c6c70,0xab9d4ec7,0x16105af1,
  211301. 0x34cd9004,0x234e98f8 } },
  211302. /* 141 */
  211303. { { 0x14db9cda,0xff435208,0x96adec90,0x99cfdc47,0xaf458b6d,0x843aaa6f,
  211304. 0x743eaa31,0x3f1f7415,0x61735d81,0x915e192e,0x0ac595d5,0x3441a22d,
  211305. 0xc044bc8d,0x704bbf67,0xbe23a236,0x2f960471,0x15d1d557,0xcc326388,
  211306. 0x76b1dd94,0x9410230b,0x0c1c8a67,0xf2e5439f,0x833c910d,0x56b141ac,
  211307. 0x865b84df,0x467c999f,0x21f02b7b,0x1b0251fa,0x96216950,0xde5b5260,
  211308. 0xce3a1e93,0x6a2130e3 },
  211309. { 0x4b3ca1a7,0xd21b67a0,0x00c0ce80,0xaf42ed53,0x932cf07a,0x22ccd368,
  211310. 0x5c25c35a,0x36523a81,0x8dd04d06,0xecdd3958,0xb2f93a3b,0x73da3502,
  211311. 0xd5e5b530,0x4c5e0c3c,0x13268777,0xef9f5486,0x1e742292,0xed87fefc,
  211312. 0xa24e5ede,0x6d9ac29e,0x33849f1a,0x08abc9f0,0x40f23905,0xb09b2292,
  211313. 0x7f934353,0x6791072c,0xe6aeb550,0x102a6381,0x96feb870,0x3ee07409,
  211314. 0x9c4d2830,0x34f06faa } },
  211315. /* 142 */
  211316. { { 0x2348f005,0x869dc79f,0xdf4920b1,0x9b5c5d71,0x6dee64a4,0xfd1b57ca,
  211317. 0xe82a4fb4,0x21b7f734,0xb9578366,0x637cb834,0x7d287d96,0xc934101b,
  211318. 0x0392ecab,0x1590f8ac,0x7f75f4e3,0x280dc373,0x6a61ac62,0x8b36f50f,
  211319. 0xa65568da,0x74f58304,0xd930870a,0x80d792a9,0xfc8895cc,0x6d17b192,
  211320. 0x4914939f,0x498392fa,0xd41d5b9e,0xaf36027d,0x5caa82b5,0x452d79e2,
  211321. 0xf4115d1a,0x764d47b1 },
  211322. { 0xa2ee8b9c,0x5df22303,0x85dfcd48,0x1b9f72d3,0x10813a37,0x6b42b983,
  211323. 0x3de741f5,0xe28c523b,0xf303bb5b,0x0857625a,0xac9bf9af,0x926f299a,
  211324. 0x0d445b34,0x21beac08,0xd6ba2c0e,0x6a523a02,0x7fce2864,0xe302a1b1,
  211325. 0xe300c1ea,0x4516a235,0x7b4a9311,0x4543736a,0xc0cc89f7,0xd3c0b9e8,
  211326. 0x40ed88de,0x0481904f,0x3cb7fc70,0x4f269b56,0x321b9738,0x09a1d53a,
  211327. 0x230a3810,0x1c0dd9c3 } },
  211328. /* 143 */
  211329. { { 0xc46a7d9a,0xffaa1f67,0xbedf91cc,0x64743334,0x47a42f2e,0x45833a74,
  211330. 0x241ffaa9,0x67980051,0x335efe6b,0x70979a84,0xf08b2403,0x5f0613f5,
  211331. 0x64f211dc,0x6bb22fcd,0xa0572cfc,0xe1b8b2a3,0x7950a14a,0x19e0eb41,
  211332. 0x3eb6cd4c,0xe634bb29,0x470a25ff,0x31a04b25,0xa3d15a0a,0xa41f7ac9,
  211333. 0xbf2fede9,0xefed85ec,0x81b94a00,0x1f581f5f,0x9ef4a15c,0xaa3996b0,
  211334. 0xb06041bc,0x52d8be39 },
  211335. { 0xfd631a2f,0xbd1536f6,0xb351a8dc,0x91fae7f0,0x9b126212,0xd1a590c7,
  211336. 0x2bd0f435,0x52d4875f,0x92b0ea70,0x9aedb6d3,0xb83ab89e,0x0bd0abdc,
  211337. 0x89fe192c,0x827a1062,0x102a0bda,0x6566a960,0xce036814,0xda083037,
  211338. 0x58639405,0x30bed79f,0xdbca8df9,0x972019b6,0xefdaa3f5,0x89201286,
  211339. 0x5236b892,0xb337b996,0x28fc2e73,0x11d3e38e,0x880e8da3,0x70787f41,
  211340. 0xdae4a45d,0x6cff6367 } },
  211341. /* 144 */
  211342. { { 0xf89a8bb4,0xbd3d0433,0x93b98f71,0x42144c33,0x03470a2d,0x82b616c8,
  211343. 0xe5da089e,0x98fcc757,0x7bf5fda6,0x542354ef,0x9ebd34cc,0x1885c253,
  211344. 0xbec5dd0d,0x2e20b285,0x782a1bca,0xe71bbbe1,0x9b854ef0,0x959ded30,
  211345. 0x8997fa6a,0x17249979,0xd81f3c45,0x50cf8fa8,0x60c11152,0xa9a3b517,
  211346. 0xecf845ea,0xc9b0ef7d,0xb9fed11b,0xc9339e23,0x28256080,0xc93e9c5c,
  211347. 0x613ec1e7,0x1d2c8217 },
  211348. { 0x987cfc93,0x7381347d,0xf187f810,0x047603bb,0x1250ca31,0x3fa6bc9d,
  211349. 0xbb055bf3,0x480091e0,0x3a3af87c,0xbdf95f1a,0x140540ab,0xe2687770,
  211350. 0xd7fe045b,0x998df730,0xb723bc2d,0xb398135f,0x15ebec46,0xac230f8c,
  211351. 0x5f5561c0,0xe08e1830,0xda60a47f,0x7c0fbf4c,0xe16d4bfc,0x06e95c24,
  211352. 0x74617e92,0x74163495,0x4ae0c20e,0x39719869,0x2131e2b6,0xfe269312,
  211353. 0x0a537722,0x25486e36 } },
  211354. /* 145 */
  211355. { { 0x53572806,0x618795ca,0x656968e1,0xb2c89449,0x3fb323ae,0x149c2c97,
  211356. 0x409bc7d6,0xfb15de26,0xc79121b3,0xa90cda72,0x204cabbb,0x6d2fa14e,
  211357. 0x91604125,0xcbcda6f7,0xb435f947,0x25086261,0xc282eb10,0xdb686c38,
  211358. 0xf1a791cb,0x51016d62,0x61a2266c,0x6b1c7ed1,0x271d74a6,0x26780666,
  211359. 0x824287a4,0xb5ffeda1,0xbbe4f0f3,0xcbe503ff,0xb9482a74,0xd7f7f0be,
  211360. 0x088493f1,0x751b2358 },
  211361. { 0xe9c9be68,0xd597b9d6,0x67d10c6c,0x1794b5c4,0x7762b2f4,0xa88cdc3d,
  211362. 0xa1b44e11,0x6d94a63a,0xaaa8eca8,0xfb0bbbb9,0xc963d87f,0xf4b0f2d0,
  211363. 0x5dc7075d,0xb753062c,0x49933989,0xfed726ac,0x57f9ccde,0x5da60638,
  211364. 0x75f8c766,0x221c392a,0x5dc672ca,0xcd264d95,0xb66ecc8d,0x7004ff22,
  211365. 0x18a458ba,0xfb1aa9ae,0x8babd653,0xea9644df,0x2ba0de7c,0xa9378e80,
  211366. 0xca2c6c75,0x144cc12d } },
  211367. /* 146 */
  211368. { { 0x2989aa3a,0x593a0a1d,0x59e6e64d,0xd83f2283,0xd32e732e,0xe938b0cb,
  211369. 0x3c3cb249,0xf4c464c5,0xf89ea6ac,0x9750a5f8,0x346cfc32,0x467e5bbf,
  211370. 0x37b2b809,0xc9bfab9d,0x3b339c6d,0xf8eb7453,0x3b766dee,0x3fe01fbe,
  211371. 0xef6aea27,0xb3154254,0x7be61b10,0x555c3df2,0xdd818488,0x70fb6d81,
  211372. 0xbbe714f9,0xda1af3a4,0x9d18f693,0x575f2017,0x2465b839,0xdc08fc6b,
  211373. 0x6b84a951,0x874ecf33 },
  211374. { 0xbbb3f6be,0x624af83e,0x08bb423d,0xf578fbb9,0xd7873527,0x5623b0ba,
  211375. 0xa62e0442,0xc3659bd8,0xfe236f79,0x2903b167,0xe53f26a6,0x55a430c6,
  211376. 0x3ad712cf,0x222547ae,0x76eb272b,0xb73890d7,0x3d628df9,0x95b4f70b,
  211377. 0x53eae4ac,0x9f0e13b0,0xe7f2174e,0x5b4f5138,0x98dbae17,0x75482cf9,
  211378. 0x44518480,0x2b69bbde,0xcafef15c,0x4f279652,0xb6bcaf19,0xa0a3ef2b,
  211379. 0xce4c634f,0x31fb8581 } },
  211380. /* 147 */
  211381. { { 0x615cd607,0x398306d1,0xaa32c3a6,0x680c9faa,0x7779131d,0xe87a705b,
  211382. 0x36708b00,0x1031013a,0x9445297f,0x814fa0e1,0xa6a79b56,0x70c5583a,
  211383. 0x4b16bed4,0x03039cbf,0xaaaaf8d3,0x18a7ca8d,0x5cdb68a5,0xf33159e7,
  211384. 0xd23814fa,0xdea0e738,0x8d0f4f9f,0xeb352718,0xdcdff032,0xb0b76609,
  211385. 0x3d48338b,0x65ba8ea9,0x55dd507a,0x18044d82,0x4a4a50b4,0x844a223e,
  211386. 0x18e19e54,0x98323000 },
  211387. { 0x57f3d5a6,0x28a21027,0x6e8cadcd,0xffce5648,0x02551f3b,0x9590381b,
  211388. 0x935ebdf1,0xb26cc64f,0xc083aa6e,0x60611291,0x88e4cf41,0xcd988a66,
  211389. 0xdd53b1b5,0x581c3f73,0x77fc621d,0x78c804a9,0xfadca2fa,0x31874330,
  211390. 0xc83ccf02,0xf7008da4,0xa79a4707,0xc4122a1d,0x4a915eb5,0x9a8e0d3f,
  211391. 0xd0123660,0xa2de157d,0x65ead2a0,0x45ef43b2,0x188db285,0xd0a22ade,
  211392. 0x922e0caa,0x8abbe39e } },
  211393. /* 148 */
  211394. { { 0x3a2d2f01,0xb4446905,0x5dc6685c,0xd27c3193,0x1d74a027,0x6a908bbf,
  211395. 0x5b50ec1d,0x01da350f,0x3f3c2e26,0x1d3dd45e,0xb836ee92,0xf66e11d0,
  211396. 0x474b979c,0x7e03908f,0x98b87834,0x19e7c5b9,0xbd3d1de9,0xa741d3fe,
  211397. 0x1ef6059b,0x63c68e8d,0x3674e247,0x9b9ff939,0x3e7e67f6,0x1d7d53e7,
  211398. 0xaee9e248,0x698dc326,0xb3bd984c,0x52f23eda,0x6f8fe8a7,0xf95e31b0,
  211399. 0xc3d0ba95,0x0f15b4d0 },
  211400. { 0x790a8d85,0x8f2f6635,0xe2595af1,0x51bffbae,0x24b51287,0xd15b7ec6,
  211401. 0x3234715d,0x7639b6ab,0x2bc5441d,0x0cdd5299,0xf6d05833,0x54800ea4,
  211402. 0xf6d6e360,0x21efd752,0x19290613,0xc0b7ffe5,0xeea898cd,0xb68a5825,
  211403. 0x22982266,0xecedba92,0xbbd06bb2,0x678a91b0,0x4bb6b0cb,0xb2436dc0,
  211404. 0xcaf8ea98,0xcf7a99e7,0x71aa05bb,0xb92d0e6e,0xf5993eb1,0xbf8d0471,
  211405. 0x20385ddb,0x515db378 } },
  211406. /* 149 */
  211407. { { 0x6f5bef22,0xee43eaaa,0x20348712,0x952d2698,0x7a3af6c6,0x1e4c484e,
  211408. 0x9a8c9403,0x18d434c6,0x5001899a,0x63e5d741,0xfe8ea40c,0x5238dbbc,
  211409. 0x96798721,0xca6cc8d2,0x04acbde8,0x73db6aee,0xb7f993ce,0xbf69328d,
  211410. 0xad45e334,0xa3f79bbf,0x7c1f1630,0x8c51ec93,0x9b00a6de,0x4907325f,
  211411. 0x12d82bc3,0x49e6acb4,0x0ec59fc9,0x5901b36d,0x9cf34e3b,0xcb09b710,
  211412. 0x1abf4c02,0x2de0487e },
  211413. { 0x8dd9d484,0x18b722f3,0x7c77bacc,0x83349393,0x93d92b8a,0x58dbb8f1,
  211414. 0x8e3fac25,0x80d78d50,0x745f4a7d,0xf0500981,0x877cc29d,0xd072bfed,
  211415. 0xc30a89f8,0x67abf8f2,0x9a0820d7,0x92c567ea,0x8a3a5738,0x425ab12e,
  211416. 0xf055521b,0xc162faeb,0xb94ea5e9,0xee1c4f26,0x3d71e546,0x1e414994,
  211417. 0x43e8be1d,0x258183b8,0xef9eae0b,0x44917c82,0x73874a30,0x6813a457,
  211418. 0xcc42f86e,0x6f6ac071 } },
  211419. /* 150 */
  211420. { { 0x4dd6e3b1,0xd38822ad,0xad620869,0xfc78e1cc,0x2cacde80,0xe7843845,
  211421. 0xa8469fe3,0x121cc14a,0xe67e8ef2,0x8e8f3da7,0x4d347448,0xdb83d16e,
  211422. 0x798631f4,0x3ba1dd98,0x0a4c4c17,0xdfab5977,0x3edc701f,0x1f0a1306,
  211423. 0x6cd8ff28,0x4649d601,0xbcc55bc9,0x2267230b,0x5760412a,0x02a19c60,
  211424. 0x328faef6,0xc719d5f1,0xf67eaad9,0x27cb969e,0x719bafb5,0xf342530e,
  211425. 0xff5a82cb,0x6e2c24cc },
  211426. { 0xadaf8793,0x6313024b,0x035c948e,0x944bccf1,0x953500bf,0xe9a066b7,
  211427. 0x1d116765,0x7991a946,0x9fd93c78,0x95addb2e,0xe92e5495,0x05d2c037,
  211428. 0x9f03e5cf,0xcb145b18,0x95aa1f72,0x81ae48ca,0x135a6e4f,0x203f2702,
  211429. 0x49b2a7d5,0x2bcef5a2,0x02d7f2a3,0x0687a900,0x6c6745b0,0x2f7d3228,
  211430. 0x86507305,0x3da8a875,0x2e8dc58f,0xbe38b884,0xdbf11185,0x6b48bf34,
  211431. 0x97c08f91,0x5af7fd0d } },
  211432. /* 151 */
  211433. { { 0xf4a224a5,0x55f9b950,0xcc50273a,0x41904574,0x643f1fd5,0x34f81330,
  211434. 0x0e50f783,0x996801bb,0x89581712,0x866d7403,0xa4091d36,0xdb9a405d,
  211435. 0x16a46fe7,0xf1e379df,0x83bf9168,0x8d04a93f,0x32b20bca,0xae4c8335,
  211436. 0xf72a1c10,0x99d334b1,0xd8195db4,0x8fbc9977,0xfba14b5d,0xcaeb3dff,
  211437. 0x76daf476,0x60fef022,0xdb5b72f4,0x4b948dfe,0xb6dfb062,0x5185c925,
  211438. 0x9609d4ae,0x27a9c381 },
  211439. { 0xf12a93af,0x73c37346,0x5536634d,0x028b707c,0x498193d1,0x8efa58d5,
  211440. 0xef21b69d,0x4f83a5cc,0xa788a0e2,0x05cbb0a3,0x65b13c98,0x01031781,
  211441. 0x2b73784c,0xfea20e58,0xe50361f2,0xdf9713a0,0xd0cc22d9,0x31449a0f,
  211442. 0x7c5e2e1b,0x183752e7,0xb67044cf,0x6e44d6bd,0x733e177a,0x012dde95,
  211443. 0x08ee2c23,0x68b49669,0x1f5f1949,0xd9bb0541,0x6acd886f,0x95182c71,
  211444. 0xfbde9244,0x1c690694 } },
  211445. /* 152 */
  211446. { { 0x3a880026,0x5db67d17,0x125d95f2,0x89c4f0a0,0x3f6cb7a4,0x29050551,
  211447. 0x5cbbdca5,0x3eb231d1,0x972bcbd3,0xf8cffc99,0xad55a03a,0xcb4ef4d4,
  211448. 0x22867c2f,0x944d47ca,0x0ead1aa5,0x96d88548,0xcbc8b045,0x76a57cf8,
  211449. 0x005e55a0,0xdfe5844b,0x1d18a097,0x5e9e7e19,0x52923c74,0x957a26e8,
  211450. 0x7f5db339,0xd0867b79,0x63bed0c8,0x2553408e,0x689ad23c,0x1596e5d5,
  211451. 0xa504c339,0x7b8c13d6 },
  211452. { 0x52fb6901,0x2fc43aad,0x16ca253b,0x1c0313f9,0x515aadc6,0x1475830a,
  211453. 0x7f577dc2,0xc93d1926,0xf723c0dd,0x26e52e8e,0x3eb9f6da,0x2f1e0eb8,
  211454. 0xf180376d,0x9979de82,0xb0834939,0x43e28ecb,0xa39c38e7,0x9a2d51dc,
  211455. 0xa8e3f6b5,0x6e6063a9,0x4b9b3270,0x4cf1da3a,0xd2f8915d,0x6e5348a2,
  211456. 0x50507912,0x5e75e3e0,0x20d383fa,0xaeffce57,0x8fd2fb29,0x1d6d53cc,
  211457. 0x696f4cd0,0x0e3c3ef6 } },
  211458. /* 153 */
  211459. { { 0x21ee1d83,0x3bc337c1,0x787b7788,0x97e08f6d,0x138fa4ce,0xbf709fcc,
  211460. 0xa0348e58,0xbaf77647,0xa55e672d,0x04f8babc,0x7d5ec5dd,0x0ed2919d,
  211461. 0x33e99218,0x8ce64bff,0x24b059af,0xac09fc57,0xdc5e32ba,0x506831f9,
  211462. 0x465af6a9,0x26a22677,0xc97f1ff8,0x3c5efe66,0xbc6087fd,0x1515e0d6,
  211463. 0xaa8edc6b,0xb1a39c5e,0x0e79ed29,0x3dd816bb,0xbc3788b8,0x6cc13769,
  211464. 0xc092a51c,0x463098e3 },
  211465. { 0xc8bd0fa7,0x3a6408c7,0xce6bde49,0xd1764311,0x283ef7be,0xe315e108,
  211466. 0x99b5d938,0x8213cc77,0x45a49a6b,0xaf7f1581,0xe529e4d1,0xd00fdb0f,
  211467. 0xce66c9d6,0x55d38f77,0x1bd4b952,0xb4f7ccc0,0xaf71f986,0x8d975b49,
  211468. 0xcd64d00a,0x12b59fcb,0xa5a3bad7,0x1860e504,0x2b5c89f1,0x6d976044,
  211469. 0x7a3e231f,0xfed0c659,0x178cba92,0x58114c33,0x6698e11e,0xe2e74c06,
  211470. 0xa348b85a,0x7f8fd093 } },
  211471. /* 154 */
  211472. { { 0xc19428af,0xf24592ca,0x3a308665,0x192a1c81,0xe30bbd7f,0x42589812,
  211473. 0x836c6bb9,0x10db0723,0x598e4987,0x9c7a41e9,0x6ead6f4b,0x8aff179e,
  211474. 0x75862c44,0x70f8f9b9,0x6f21983e,0x6b3b0237,0x98e65152,0x25d83e9b,
  211475. 0xd751218a,0x3b2d26a8,0x9d6f1da6,0x9508281a,0xa5a81f74,0x8df78d05,
  211476. 0xe4687471,0xd79ee559,0x6787d8cc,0x2060ca57,0xa8476c95,0x427a84ff,
  211477. 0xe6435131,0x87b64c51 },
  211478. { 0x4b30d3c4,0x87f46f65,0x23b4ef14,0xcdec4c5c,0x63ca4d68,0xb3b74766,
  211479. 0xcf3fb56d,0x1df34269,0x0fd7d46a,0xd4f139c4,0x6a69a8bd,0xa3b7c7c7,
  211480. 0xcbadd7d2,0xee56b4c9,0xac942334,0xb28ff342,0x786f1da3,0x0046fdfa,
  211481. 0xb700c82e,0xce5d149c,0x50966597,0xca30ef81,0xfcff4bdd,0x44a20609,
  211482. 0x44925268,0x0f2f65e7,0xd4021f38,0xe5b6552c,0x042dbbd0,0x77ea9c2a,
  211483. 0xd9c062f5,0x8c95267c } },
  211484. /* 155 */
  211485. { { 0x5fc1abb1,0x6655032e,0x12fe4743,0x2215af54,0x29f05ef5,0xfd657560,
  211486. 0xdc191be9,0xb0e73325,0xc08639b0,0x7ab3c65e,0x1c3e6673,0x67507f51,
  211487. 0xc8615555,0x638befc3,0x42f0c4ad,0x5d0188cf,0xd896186d,0x843a301c,
  211488. 0xb2c6741e,0x045603f7,0xfa3cd1d0,0xf7545c0c,0x4a40672e,0xf612affd,
  211489. 0x45b9e8dd,0x56197c9f,0x87922d74,0xb453237d,0x4b2d59bf,0xbf132e3a,
  211490. 0xb84a6a16,0x8afa1b73 },
  211491. { 0xe793ac70,0x6b3596ea,0xeef6dd10,0x4c94ef8e,0x70422e40,0x926b4fa2,
  211492. 0xe9e5d763,0xc8c71dce,0xf512aadf,0x352fcb70,0xa883975f,0x1b7ba138,
  211493. 0x058c3b13,0x57991390,0x97740fd1,0x9692092a,0x160b0697,0x19ad945b,
  211494. 0x10837ab2,0xbc634388,0xf174bb71,0x76ee11c4,0xab1b80eb,0x6111bfc1,
  211495. 0x70ec458a,0xbc82bac8,0x312d3325,0xeee60127,0xb240adc8,0xb4118b1a,
  211496. 0x2b5a093c,0x67211191 } },
  211497. /* 156 */
  211498. { { 0xf55cf9bf,0x91e99306,0xa46b96d9,0x9b045308,0x9e7a65df,0xae3c1e1d,
  211499. 0xc731bcbb,0x453cb151,0xa4d58a61,0x14be5227,0x97c74cc2,0x39dac922,
  211500. 0x822e00d6,0x4d0f7a45,0xc62b03df,0xafeb1d51,0xbaa18b2d,0xbb1dc3a4,
  211501. 0xdf2b74f0,0x7f3c7178,0x896b6a33,0xfcd328a6,0x1dce055f,0xe95ed454,
  211502. 0x6a4e2b87,0x97fbc76b,0xfa59dce9,0xe5ec67f1,0xcc0367c1,0x052368ac,
  211503. 0x54e4a3fe,0x7c863916 },
  211504. { 0xca7388cf,0x55e94b5e,0xc0335d38,0x17cc0a60,0x616f85ba,0x9b69b78b,
  211505. 0x10122980,0x705d02ef,0x1cfd0a79,0x565a6e80,0x7d1ee352,0xeb74a96d,
  211506. 0x427b9dad,0x5c8832ed,0xe6d5330f,0x96ea8528,0x18d24ee8,0x30d8862b,
  211507. 0x9ff939f7,0x9cd38ed5,0x01060252,0x690fc9a2,0x2303b3ff,0xc62d88b8,
  211508. 0xdd52b469,0xfc42d7a4,0x8cad2d93,0x06f8dfa2,0x60920438,0x50236090,
  211509. 0xfce855ad,0x32582758 } },
  211510. /* 157 */
  211511. { { 0x359e8c60,0xeb20e45f,0x364ca186,0xc71bb8a5,0xdff8e110,0x02b15071,
  211512. 0x4c93e578,0x074e91d3,0xb829d0d8,0xc0326e00,0x626a83fa,0x3c192258,
  211513. 0xfb29a09e,0x387a64d5,0xe5ac5c82,0xcaaa3d34,0xada2da29,0x8ed685e5,
  211514. 0xeb29650e,0x92720267,0x763802f3,0xf7184b19,0xdf6b1aea,0x23f5dd0e,
  211515. 0x25e6125d,0xbe1fa347,0x0c872a1a,0xd6287f9d,0xac57c3af,0x49aa93d2,
  211516. 0x5bda7656,0x1a4e6a71 },
  211517. { 0x554d1267,0x1a126ede,0x1cd02b48,0x37f94533,0xce31fb1d,0xd70af04c,
  211518. 0x097dc012,0xcf410b0b,0x36c7b6c5,0x930e1d17,0xc6891085,0x902fee41,
  211519. 0x79fb638f,0x349ba4a7,0xacd6f8df,0xa16c5821,0x2e076ace,0xfb3b83c1,
  211520. 0xe501d14d,0x6b8d033b,0x20f2d2da,0x0593d452,0x99df1880,0x3752526d,
  211521. 0x9feb33a6,0xca32351c,0x1f6ef456,0xd91343bc,0x35b9dc8a,0xc74857db,
  211522. 0x85b4e832,0x856a7c93 } },
  211523. /* 158 */
  211524. { { 0x0d0a5583,0xa007d002,0xeda4658a,0x2f1301dd,0x34d939be,0x91c07964,
  211525. 0xa70c0836,0xa0cb6780,0xbe81e540,0xc0b4df95,0x5d4ac8b8,0x6cbbcd34,
  211526. 0x54756239,0x57c52ed0,0x1805ceb6,0xcac2dca4,0x79344255,0x915ee6ab,
  211527. 0x24c9a2a6,0x366def31,0x8c12c674,0xbd3b962f,0x7dbb7c3b,0xaab64f1b,
  211528. 0xe22bb95b,0x3c0e4553,0xc4c63b74,0x2408feba,0x2a4da631,0x3ca77312,
  211529. 0xc636da40,0x62889084 },
  211530. { 0x8cb8d208,0xa457fd53,0x543f06d4,0x7a8f8009,0xf2eff2ab,0xb66de154,
  211531. 0xf72517e7,0xfddb28eb,0xf9389d2c,0x0149fe66,0xd85b88ce,0x79e8773f,
  211532. 0x0ba543f7,0x452e090b,0xb0b03fc0,0xdeb9b5cf,0x6c5ed77b,0x3113448a,
  211533. 0x8ffc0372,0x3609f3cf,0x5c1b4c4a,0x2bc9c46d,0x8fa59be9,0xe66f3bf3,
  211534. 0xcdb02691,0x1396bf5f,0x009f88f9,0xf1ec59d4,0x2ad9dfe3,0xc2903456,
  211535. 0x5ada4d58,0x79d8122c } },
  211536. /* 159 */
  211537. { { 0xaa529507,0x14d4e4ce,0x74655d00,0x056a0814,0x4f0fc474,0xc0d30a38,
  211538. 0x3443cb8e,0x8a8203ea,0x97f1728d,0x33c62fb0,0xb520ef52,0x8a38dcfd,
  211539. 0x7cac9d3e,0xa0f90d5d,0x873cea50,0x28a7b0bf,0x6c6c41cb,0xd115ae3a,
  211540. 0xa13812c1,0xa35171da,0x624d507e,0x25d4bba5,0x7e98f42f,0x91dad289,
  211541. 0x96a41371,0xffd6b1e9,0xb69e5b77,0xd46c2125,0x20c4f707,0xc7d2b424,
  211542. 0x8142557a,0x2ab3af95 },
  211543. { 0x6a5372a6,0x86ca074c,0x56292ba7,0x728fb83e,0x77741cf5,0x745596dc,
  211544. 0x520ef49d,0x70b4cea1,0x61e46472,0x1472fe34,0x3fb8ac5d,0xf4d6bd66,
  211545. 0xc10bc071,0x46e52cc9,0x371a3461,0x28794efe,0x276fe877,0xa4850718,
  211546. 0x9bef5ab4,0xedad5773,0x3f15c815,0x24c2d9ff,0x8f8395c3,0x188950e5,
  211547. 0x80b6a855,0xbae40996,0x8a8803e1,0x4f53e22c,0x039d25ee,0xaf233f61,
  211548. 0x250409ca,0x07db2c35 } },
  211549. /* 160 */
  211550. { { 0x037d4703,0xc7f3b8db,0xc5f488b9,0xe83708df,0x8471d402,0x1fba830f,
  211551. 0x5a2faae9,0xa55ee8d2,0x5404fc1e,0xc2e5bf10,0xaa2d5651,0x647d5027,
  211552. 0x7ebaf5f9,0x37a53c0c,0x95b30abf,0x7adf0bb2,0xd64c93ba,0x5a62e1fe,
  211553. 0xe2ef4a78,0x7ffc18c0,0x4d2cd04f,0x139dd9d9,0x5ea0af02,0x253fbab7,
  211554. 0x0fef9acf,0x7c8100ea,0xc8615aa7,0x74c5384d,0x9fe52069,0xcb28682d,
  211555. 0xcf7dd759,0x08b6ca8f },
  211556. { 0x036c3b5a,0xe04e5bea,0x7f9f2b4b,0x38726102,0x29797c0f,0xa9fca570,
  211557. 0x82879ea3,0x1656180b,0x607f0ddf,0x153389bb,0x67b0e087,0x99a1223c,
  211558. 0x9d897fc7,0x0d1808ec,0x916edf19,0x9470711a,0x07217118,0xf8f52f2b,
  211559. 0xd18888b6,0x5d8b29ff,0x4cc6f900,0xef1e22c5,0xeb24877f,0xc4036165,
  211560. 0x35479525,0xfda95233,0x6861468a,0xd622a421,0x74faba08,0x5d043b07,
  211561. 0x0d31a7d2,0x2c337b02 } },
  211562. /* 161 */
  211563. { { 0xea22fa65,0x7b2305bc,0xd159f63a,0xbe183ef4,0x3f35923f,0x3473d87d,
  211564. 0xc11d7753,0xb27fb306,0x2a054cff,0x702e7e6b,0xaf185619,0x3ce9f97c,
  211565. 0x4e7d51c5,0x83550243,0xf356ac5b,0xa63e3d82,0xd7645131,0x867b7caa,
  211566. 0xa671fc9d,0xee85e6af,0x2b07cd77,0x3b985ede,0xffda5193,0x07d598b0,
  211567. 0xa942dc36,0xb10eca39,0x506218a9,0x17f3dcee,0x06b7d5ca,0x3d94e8d1,
  211568. 0xed8831c9,0x509b2634 },
  211569. { 0x48caed54,0xb1b9414e,0xcbf51e97,0x77a78c6c,0x4de9b258,0xa4688c8d,
  211570. 0x91ee3d78,0x0024137c,0xe30ee64c,0xa68f9234,0x88190d78,0x573255bc,
  211571. 0xba80690b,0x41e8e05f,0xec354f4c,0x50038d84,0xdfa52816,0xb18f02d6,
  211572. 0xccb63fda,0xc47f9007,0xe98ae455,0x29d480fb,0x5d0e319d,0x4ac45d22,
  211573. 0x026db719,0xd06f3575,0x2c3587b9,0x733b9e20,0x2c317727,0x22483992,
  211574. 0x54bb8752,0x1592d5a7 } },
  211575. /* 162 */
  211576. { { 0xcf7453f0,0x5778d9a2,0xed83c1f0,0xaffb899a,0xe0a82ba7,0xae6506d3,
  211577. 0xea3d5081,0x32c84e1a,0x810aa38b,0x9ad528c0,0xbd37d041,0xb1fdb020,
  211578. 0xd06ce41f,0x78d6cbe1,0x2e74b7f6,0xd287f0f0,0xc43bb022,0xf5cd2575,
  211579. 0xf81a71b3,0x6d28f2f3,0xc633e7f4,0xe65bb1f5,0xc4fc580e,0x32e5fc1c,
  211580. 0xbb7b07a5,0xcd55539f,0xc3caaf3a,0xb5a94471,0x4cc22d2d,0xb958bdf4,
  211581. 0x77a2777c,0x1614bdbd },
  211582. { 0xed0ab04d,0x4c1f0230,0x6e2082ea,0xae347b00,0xc42c5b5f,0x9f10bc63,
  211583. 0xde019935,0xb0539e6f,0x65dd0825,0xd89bd4e7,0xbbceda16,0x92260fef,
  211584. 0xe62aca32,0x8aaa755c,0x5ec82c5f,0xed762fa9,0x18650768,0x99e64c01,
  211585. 0xc92e348c,0x57dd6245,0x31ea6d68,0x0db88a77,0x07b44736,0xef0012ab,
  211586. 0x171d70fe,0xb9356b94,0x03f891b0,0xe68b0628,0xb79c20a2,0x3a54a53a,
  211587. 0xb00b0728,0x489656c7 } },
  211588. /* 163 */
  211589. { { 0x71353c25,0xe43649ba,0x13f67e24,0x517f27a1,0x1c1eb9e3,0x10bd333a,
  211590. 0x78e29bf9,0x94e1c05c,0x4743f15d,0x84fe7d97,0x90da2df0,0x9c874908,
  211591. 0x53673be1,0x82403fa7,0x1baea1b1,0x7ebf5db4,0x24180ead,0xcfe0ae35,
  211592. 0xc2f50c3f,0x1d15873f,0x70661cd9,0x16851ad6,0xa51e8c2c,0x802968d9,
  211593. 0xe0161099,0xe7d1a9cd,0xa8a7ea56,0x2b153c89,0x06e3c498,0x6d41b789,
  211594. 0xd6769dcb,0x082bb2e9 },
  211595. { 0xc4d6615f,0x6180ef46,0x01b9829c,0xfc629dc1,0x0fb264ca,0xde222ec0,
  211596. 0x10ecc2c4,0xc5457e06,0x1eea2c4d,0x95ce599f,0x8f9c5b2c,0x0433fa72,
  211597. 0xcd6310f9,0xee035462,0xce2e2253,0x84c57c3b,0x96d87e44,0x6c8ec31a,
  211598. 0xa452c5a7,0x30bfe393,0xa047b235,0xc592b140,0xc018545e,0x7bd8be18,
  211599. 0x5c178c46,0x794e0107,0x2e23005b,0x48471946,0x622a54f3,0x2665e237,
  211600. 0x901c9042,0x36451a46 } },
  211601. /* 164 */
  211602. { { 0x19893e71,0x17802d18,0x539a2082,0xa1765d8b,0x2302ecfc,0xfc6aea01,
  211603. 0x365bf59d,0x8d4cf51b,0x0d232a80,0x87741d72,0x18e80427,0xac343eb3,
  211604. 0xe74739ec,0x553ecb2f,0x1a8b07ca,0xaeca79a8,0x56f4ab3a,0x089ff322,
  211605. 0x3fa1d1f7,0x5e95d729,0xf62a9a16,0x260569ae,0xaa08ddc2,0x5e776232,
  211606. 0x1b7bb54a,0x93fabec3,0x743d56e7,0x48a20956,0xeb0ebeff,0x749cdb12,
  211607. 0x69b8fcf1,0x705307a4 },
  211608. { 0xe488310b,0x7a8e4c04,0x5325cd7b,0x12726e32,0x4983efac,0x5d0fd8b0,
  211609. 0x02ddb913,0x796e552c,0x77b9685c,0x0eeca3f7,0xb15f24a3,0x9b766e89,
  211610. 0x48efc979,0x7c2736d6,0xa8021c6c,0x3d619685,0xa0b2f1ea,0xfe33e278,
  211611. 0xb676d6b0,0x95c69879,0x1af4e0be,0xa0747319,0x36c4ee55,0xa2fab5f1,
  211612. 0x59e5f3b9,0x6938b8ff,0x39cafe6e,0x1e114da4,0x6a6ad120,0xc9595ec3,
  211613. 0x57e62aec,0x80f79bd0 } },
  211614. /* 165 */
  211615. { { 0x60af09b3,0x3cef42a7,0x933dfe14,0x3c016ebd,0xed85eaa8,0x720cf1e0,
  211616. 0xceaa3bc9,0xd4f5e99f,0xb7106f97,0x7216b9d2,0xc9668ad2,0x65f34c36,
  211617. 0x5b0c651f,0xa8fb82bc,0xf2fda4de,0x20f42f1c,0xd21f659e,0xeb31ab2c,
  211618. 0xa13d1618,0xb7a776c7,0x38662be5,0xec441022,0xcad08e0b,0xc825da70,
  211619. 0x022c0180,0x99299079,0x2aef9ffd,0x7623bda0,0xf5c58b50,0xde84f4f3,
  211620. 0xd824ff19,0x5f5a5da4 },
  211621. { 0x7e8311dc,0x5737257e,0x466cf136,0xdef94f51,0xb05ca21a,0xa73e1645,
  211622. 0x02e4ab37,0x38ea9b3c,0x8579165b,0x7760eac9,0xc24b01a4,0xdffdd047,
  211623. 0x3fb95584,0x188d4fd1,0x25548bda,0xfaac38b8,0x59e9dcac,0x1a79a6f0,
  211624. 0x09a2700f,0x983f720f,0xfb8a7e48,0x8cbba554,0x47a1fad5,0x38a19968,
  211625. 0x5abd6b5e,0x11856547,0xf3716ec2,0x75113d31,0x4212907b,0x1391e781,
  211626. 0x0dc15889,0x5319c801 } },
  211627. /* 166 */
  211628. { { 0x6b61c3af,0x2320136e,0x07b4bb68,0x1d40f2de,0x380c97f0,0x651dee7f,
  211629. 0x6a8c313a,0xa978ba70,0x2011ca10,0x22c587d6,0xab1f445b,0x48bba218,
  211630. 0xe50444e6,0x8c5eaf07,0x442fccf9,0x5549f02a,0x3d80493d,0x2564746f,
  211631. 0x79c04591,0x42d24f61,0xabdc8887,0x1600fa18,0xded38f8f,0x5cb8600a,
  211632. 0x923aeb46,0xa4bf9b90,0x1e1c578a,0xd63fee35,0xebb9ea14,0xf3c9c5ac,
  211633. 0xf11a4ff0,0x3d13314d },
  211634. { 0xb4513d1e,0xe5cc662d,0xd55952bd,0xde78a8c5,0xe7f86d0a,0xe8a37a3f,
  211635. 0x7a04f0c5,0xca2d12a4,0x2e25d06c,0x4c6696e4,0xb2136071,0x52614698,
  211636. 0x89f6e1cb,0xf4d2701b,0x80efd95e,0xaafd6177,0xc5bb6907,0xe6d73ac4,
  211637. 0x420db35a,0x49e874ac,0xf2751fa0,0x11631de4,0xa1fa2edd,0xb29f7336,
  211638. 0xb7fd794d,0x4c406864,0xe22f92a6,0x73cb21d3,0x2043cc76,0xeae904e6,
  211639. 0xb322c6ad,0x67f28a9f } },
  211640. /* 167 */
  211641. { { 0xca148ab5,0x7c17b258,0xb3c60051,0xb9a1976f,0xc8f28df9,0xea260698,
  211642. 0xe8d45017,0x87b2cc74,0x0578a422,0x37257329,0x17bec732,0x81d5ee25,
  211643. 0x1d48bbc4,0xd7411fcf,0x487f5cfe,0x46217e6b,0x41eb8e1b,0xcb007ac5,
  211644. 0xe05a00c8,0xc41c57a6,0xd2f9fa99,0x1f954d2b,0x40941cad,0x370bd5db,
  211645. 0x3829509d,0xe487879c,0x5ceca5ee,0x4c137552,0xfd3efb9e,0xe8ef7fa4,
  211646. 0x1bd1bdb2,0x5ff09174 },
  211647. { 0x579c6632,0x791912a4,0xb8a20815,0xbb19a44f,0x535639d3,0xf4f97b84,
  211648. 0xbc3c9bce,0xe57e2bcb,0xf19e6410,0x122b3f2b,0x1357d9ad,0x1f0189da,
  211649. 0x79e5ff66,0x675573bb,0xef2f3c4c,0x444e5c98,0x04d10731,0xd6f61e20,
  211650. 0xac75d635,0x0dfa366f,0x2c854f23,0x9fc47c86,0x0ad0850b,0xc04ae43e,
  211651. 0x2f720c32,0x5ce94f64,0xa753bc9d,0x67efae65,0xb0373a63,0xc27d30d3,
  211652. 0x29721646,0x6681013a } },
  211653. /* 168 */
  211654. { { 0xe84509df,0x1385d913,0xcf339376,0xe978bedd,0x3423a148,0x2df425d3,
  211655. 0xee8cb579,0x43fa0ae3,0x31c4553c,0xf015369d,0xdfbf1d48,0x05cf08bb,
  211656. 0x9444244a,0xadff4be6,0xa35dda33,0x01635f81,0xe76fab7c,0x085c8949,
  211657. 0x16737783,0x4bd7fcde,0xa254f8d2,0xfd8cb52c,0x413ec985,0x62168a66,
  211658. 0x7a9026cc,0xf2db9741,0x50e1e1b7,0x3962ee56,0xd3beffde,0xbee0a346,
  211659. 0x0bdfab1f,0x3b35b72f },
  211660. { 0x535c3749,0xbff8de9f,0x8add9c48,0x23c1f20f,0xc8f8f663,0xa975b37b,
  211661. 0xe8f3ae49,0x2529e475,0x1d5e2628,0xc32f10d5,0x67862f1d,0x5ac0d297,
  211662. 0x854cbe36,0x13c79338,0x4b67e462,0x48f004ef,0xe5d10ee1,0xfa37a150,
  211663. 0xd28288a0,0x4974778d,0xcfb73f4d,0x96830a66,0x07804952,0x9f444013,
  211664. 0x9760b694,0x8233c709,0x25b75c99,0x8340cca5,0xc771f99c,0x3f62e40b,
  211665. 0xcd95c685,0x47d0a1eb } },
  211666. /* 169 */
  211667. { { 0x652811f1,0x266f4fff,0x62ef3002,0xeaacaa93,0x50cba0ca,0x6c387a55,
  211668. 0x007f5467,0xa350142a,0x202f2673,0xc7fd102a,0x33dc6e65,0x5daee570,
  211669. 0x064a63d9,0x60682ec3,0x462b251e,0x46cf0bb0,0x5da936e7,0x0e030ca5,
  211670. 0x434265b5,0xc87a60f2,0x69b4e8f5,0x9637b2bb,0x7ad7770a,0x601fb58c,
  211671. 0xed3a15a6,0x1f2147f6,0x2995e961,0x05b47d5e,0x83213a16,0xcb0ca9b3,
  211672. 0x4995a85c,0x8f4b614a },
  211673. { 0x4b4eb3c1,0x5aa8ec19,0x20323a70,0x8c549ac4,0x4f6cc6aa,0x00d49322,
  211674. 0x45f9a5a3,0x0e53b9bb,0x0897abbb,0xe46ef110,0xd7acd7d0,0xfe873e57,
  211675. 0x0f7cb588,0x7cfccfe5,0xc85557d1,0x0ea53d65,0x7288f2e2,0xfdd9eb44,
  211676. 0xc0eb68a8,0xab2dedfa,0x08603a0c,0x58221470,0x00feb06c,0x69464689,
  211677. 0x25e5caac,0x804cf5bf,0x9fc91ae9,0xd8559858,0x73c45eae,0xed9378b1,
  211678. 0x524c9801,0x8f942d02 } },
  211679. /* 170 */
  211680. { { 0x8e845808,0x1f1ec302,0xb77abfc5,0xc302bffa,0xf8d97dc7,0x26afd4b9,
  211681. 0x3aac594b,0x3d3a83c4,0x674d94dc,0xe3b74bd1,0xcaa5911c,0x4464b737,
  211682. 0x871c2cd2,0x62925773,0x3b4440fe,0x419f2485,0xe052ad7d,0xdda6a0f3,
  211683. 0x846c86c0,0x645280d6,0xf8324f42,0xa25689fa,0x07cf117a,0xc74ad1e8,
  211684. 0x8ddc9db7,0x5626dea0,0x966fc85d,0x52620373,0xf3b1eb53,0xe0ad57c3,
  211685. 0x949c1acb,0x38300252 },
  211686. { 0x5e744723,0xa0ef5a40,0x1ae08481,0xdb5bcf75,0xfec1f76f,0xabfad8cc,
  211687. 0xfab37fc6,0xfba5d831,0xc8fedb78,0xbe39e248,0xad93f310,0xa5cfad5f,
  211688. 0x913d5c24,0x747fdb1e,0x4518b7f5,0x052a47c9,0x7cfb4327,0x9e208d6c,
  211689. 0x70e538be,0xb135cb9c,0x5bb17916,0x36352759,0x5b3106c7,0xa2c07880,
  211690. 0xc209bb06,0xd2d42a06,0xd3c504ad,0xb525b471,0x822ce034,0xc9f4b368,
  211691. 0xeb4185a5,0x15f18796 } },
  211692. /* 171 */
  211693. { { 0x0aee4684,0x094dea06,0x7cdbdbc8,0x42b21f06,0xb1931319,0xa439e149,
  211694. 0x81a7dba6,0xea4bdd41,0x3c2ae80f,0xc6213706,0x12823dc2,0xb58b0967,
  211695. 0x832611b1,0x7443d515,0x13c20384,0x2e16f831,0x2bd992d2,0x0ce204d6,
  211696. 0xf419388b,0x499dbcd6,0x1d3778c7,0x492ded1d,0xc5ddae73,0x9d5bd74f,
  211697. 0x994b6259,0xd4813d52,0x0e86ca68,0x191d9cf6,0xf3e9c2ac,0x562179ea,
  211698. 0x9fee1238,0x6146f1f3 },
  211699. { 0x078e2aa6,0xbd06d33e,0x9dee9265,0x693af7f7,0xdaa40e84,0xd56e0f81,
  211700. 0x9b9a407e,0x05fbbb88,0xede99519,0xdcf44adc,0x092dba39,0x7f71f8d3,
  211701. 0x4231774b,0x675b5da5,0xa5f605eb,0x7456a251,0x87a39a9e,0x9031d4af,
  211702. 0x05b474bd,0xdb430006,0xb665aa91,0xbda5dbf2,0x6631eeb4,0x5d1a3df5,
  211703. 0x62377c58,0x028149ef,0x685d0bff,0x2e1af4e9,0x82a465de,0xe0ea0875,
  211704. 0x06bd0050,0x95543f9e } },
  211705. /* 172 */
  211706. { { 0x85d7c6ef,0xf7cbc6f4,0x63b1bc24,0xcad8084d,0xbf8cba62,0xdf90ce88,
  211707. 0xb455c192,0x98e4b686,0x774fc6ed,0x6146b8d5,0x7ae20077,0x70e2389e,
  211708. 0x61c22529,0x5241c479,0x3884e5f5,0x7d221510,0x17e28273,0xd6d20ce2,
  211709. 0x4f2674f8,0xe3119f51,0x70c011db,0x85459055,0xfcfb760e,0xdfab75d9,
  211710. 0x9e8c2a19,0x9546362a,0x4a7d4b27,0x4b6d3f8a,0xee5d698c,0xa5c87104,
  211711. 0x2ba296ff,0x6db43478 },
  211712. { 0x5c3f0d95,0x06486493,0x4e748895,0x8917db82,0x6b2f3e44,0xf73fdf62,
  211713. 0x2b7f574b,0xc60edc54,0xaf732723,0xbe1c09a2,0x7cad114c,0x7d34669d,
  211714. 0x321aaff9,0x9646600a,0xed0cd61c,0xb94e2bba,0xdec4750e,0x866e1a41,
  211715. 0xb1a89f58,0xa1be990d,0xf2759693,0xc39e4d6c,0xc0e0dddf,0x11cfb780,
  211716. 0xd99c8a41,0xf0afcd7f,0x6e1c3050,0xcebffadb,0x96d2c6e4,0x4f3981b0,
  211717. 0x2ae27a94,0x07a791e7 } },
  211718. /* 173 */
  211719. { { 0x1e9f0300,0xe70e9047,0xbccdf904,0xe0253ad9,0xff053078,0x51c0289d,
  211720. 0xae893462,0xf1ef092e,0xa4846845,0x2c90a91a,0xf1dad4b4,0x1946eda0,
  211721. 0x33df67b2,0xf07650f3,0x0b15a014,0xc6e988db,0xb542f0f9,0x72e0c66e,
  211722. 0xe0c0378f,0x5d4b6311,0xae86950d,0x548badaa,0xb35f1c8f,0x6801638d,
  211723. 0x944d1ad4,0x129e3216,0x40471d32,0x9951bac8,0x85e94dde,0x03cc29f3,
  211724. 0x4543ecac,0x6d6acc2e },
  211725. { 0x57b2d299,0xeb999e95,0xe3d721cd,0x3a2bcd9b,0xbb4cb444,0x2e60384f,
  211726. 0xdc060faa,0xae177709,0x8c987cde,0x74f0e6d3,0x1076fbed,0x9a237cf8,
  211727. 0x7983fbff,0x69af1513,0x323f9584,0x6c3f7a1d,0x6db64398,0x3e21cacf,
  211728. 0x96703d92,0x7cd8134f,0xb8393f76,0x0755898f,0x2e825222,0x1b5b28bc,
  211729. 0x7924aa7c,0xb78799c1,0x81427a8a,0x1db378f2,0xff289492,0xd5a451b1,
  211730. 0x3d3c46ee,0x79d18212 } },
  211731. /* 174 */
  211732. { { 0x109d5589,0x1a3edff9,0x029b4499,0xded52eb4,0xb4b54adf,0x13eb9d30,
  211733. 0xa27bff67,0x4f9214c1,0x67f0f460,0x4c817ee7,0xc3a50e28,0xbadf8d83,
  211734. 0x94026237,0xc5dc03c9,0x966647c1,0x5f29581b,0x8a0687f3,0x10b6a089,
  211735. 0x31634517,0xae787cec,0x62e75188,0x2001dba5,0x45e2c3fb,0x55d4e1a7,
  211736. 0xb67d3395,0xbfcacdeb,0xbc6842ee,0xa1a0af9c,0x3e88580b,0x50590a2b,
  211737. 0xa784cdc8,0x73104491 },
  211738. { 0x2648d676,0x44ca2cdf,0x4f1b12b1,0x9a85eca5,0x2980e1eb,0x1b9dac94,
  211739. 0x1ac8aa89,0xf30d3709,0xc719e195,0x73072ab7,0x2f703797,0xba518c82,
  211740. 0xac0067f6,0xac090e14,0x8dcd2927,0x0e6cfc70,0x21e7da63,0x4f5889e2,
  211741. 0x8371c7c6,0xb4aaa40b,0x8f7878c9,0x1f9dabe2,0xd84caf3f,0xf78aed6b,
  211742. 0x9e0e1d92,0x3c39dd07,0x122424dc,0x680be5fb,0x0bdc0099,0xf41b214d,
  211743. 0x5180c54f,0x6a8f8fc9 } },
  211744. /* 175 */
  211745. { { 0x53235132,0x62a1ed63,0x59dba88b,0x1db233f1,0x291efdd8,0x85625452,
  211746. 0xb25111ae,0xc7505297,0x1d701bd8,0xb5921af9,0x9774f45d,0xb4d05d72,
  211747. 0xf18e73ff,0x6e3d4c5e,0x899b3038,0x897d985f,0xc89b1558,0x8a9c30fb,
  211748. 0x4d13181c,0x3c92d1a3,0x2223320e,0x292e86ba,0x01ceed02,0xcf2454c2,
  211749. 0x583f309f,0x27a45f74,0xad0fd1a3,0x75a6102c,0xcb9c7538,0xdb4f45d2,
  211750. 0xdb283fd7,0x4752d8c1 },
  211751. { 0xd5dff4d5,0x514d6cea,0x45a827f4,0x74cd5fdb,0x4fc7135e,0x1070a60c,
  211752. 0x1be5778e,0xdec0bb78,0x58dc6b08,0x271e12cd,0x54bc2496,0xb765089b,
  211753. 0x619098ac,0x6ddf2c63,0x67528832,0xfd6ebac6,0xc2508af1,0xeaa2d025,
  211754. 0x4dcfc1f0,0x13c2cda8,0x45510be0,0x1c7836a8,0x1a886801,0x3904688d,
  211755. 0xafaf2545,0x643132aa,0x2830a88d,0x49685577,0x8744b470,0x569491ca,
  211756. 0x75fb8552,0x3a6518f3 } },
  211757. /* 176 */
  211758. { { 0x224042a0,0xaaa8ed50,0x2452f1e6,0x6cb4e3b0,0x768211d8,0xedca5f4c,
  211759. 0xef4d5d3f,0x4e0fe3f9,0x522d46e5,0x33a8e2a4,0xf1446775,0x5998e21f,
  211760. 0xf592d01b,0x1496c50e,0x83a67739,0x69104c2f,0x472bbf00,0x28670bcb,
  211761. 0x503177bd,0x8ea883b2,0x7d2712a2,0xc5d8bc05,0xb439c994,0x41ef9317,
  211762. 0xdcda1aff,0x9801d3a8,0x7038f6fb,0xd686eeb5,0xfbfbf820,0xe80c5cd0,
  211763. 0xedc25817,0x540ac363 },
  211764. { 0xfe7f43df,0xa71969a9,0x2c1b9e4c,0xe6653808,0x859c2917,0xad9677d8,
  211765. 0x96aa4404,0xbaca9545,0xff1297da,0x0e9d855f,0x22aea7de,0x1f61897b,
  211766. 0x36f13f8e,0x96edccfd,0x16e200df,0x627d3070,0xc98988a4,0x729f0736,
  211767. 0x97f231d2,0x95e25e60,0xf6048752,0xaf7f221b,0x4019b299,0xd6682609,
  211768. 0x26b4b1d9,0x1d99de09,0x1acdd7a3,0xec47cf66,0x6ebe15e9,0x4de9f2b3,
  211769. 0xfa16974f,0x17db32ec } },
  211770. /* 177 */
  211771. { { 0x6cf40599,0x75ef6919,0x00c020ea,0x7ea10dfb,0xfcaaf679,0x3da5ae7b,
  211772. 0x88ddd678,0x0d663ca3,0x255bcfcd,0x5a21f8fe,0xe344bc7e,0xe9c3f538,
  211773. 0x548e0632,0x35f62b1d,0x43c6e64d,0x654f2425,0x26993627,0xc755a7a6,
  211774. 0xb0f41324,0xa3b7c5f7,0x3a2180f3,0x05697f79,0x1e81675b,0x6cf85fb1,
  211775. 0xe53428f5,0x6d3cdb35,0x52d28b02,0xe3aa1591,0xf7a3fb78,0xa8470255,
  211776. 0xa194445d,0x460bd01b },
  211777. { 0xc24d8077,0xbc34dc23,0x4c720d2c,0x82f4b580,0x6f5d1ffe,0xa29da911,
  211778. 0x92783ce2,0x578af520,0xb5904af3,0xe29f51ab,0xf7aa1190,0x46c570d7,
  211779. 0x571bddf0,0x4a522fba,0xae89bb51,0xbf4e2a06,0x59f3444d,0x799b35cc,
  211780. 0x26cc2557,0xc3028367,0xafcec177,0x94a4e985,0x7c36cbd0,0xadaf7dcb,
  211781. 0x75d39077,0xed31b787,0x2d3e24bc,0x52d6904f,0x1f95421b,0xc5ca2669,
  211782. 0x1734878d,0x7d342c3c } },
  211783. /* 178 */
  211784. { { 0x11fd127f,0xe5cf2c0a,0x119e4c5e,0x66d36bb8,0x6ef56ac3,0x621ab252,
  211785. 0xe5430675,0x30cfeaee,0xac3e9619,0x2ede27d2,0xf8fce671,0x6413513a,
  211786. 0x075f4c3d,0x6159c61b,0x59069d98,0xd447efe9,0xea76aea9,0xaf8d6f68,
  211787. 0x0f5bd164,0xac5dc61b,0x1e88bb98,0xdbab446e,0x1ba92320,0x618b8b16,
  211788. 0x78989865,0xa0eafb3c,0xc08b7e82,0x0c7abcc2,0x20d160bb,0x10f09b6e,
  211789. 0x8e4c63a7,0x5be0afa6 },
  211790. { 0x1bbbf49c,0x82ab6d38,0x8c0703fe,0x3e09ce49,0xe10f4263,0xeca58b5d,
  211791. 0xda5a4532,0xd9cc6581,0xf618f7b7,0x07e18876,0x250f7fe7,0x0419a5e3,
  211792. 0xde6b86be,0xbb1a9e90,0x37359169,0x584a7deb,0x5149db2c,0x38eb3489,
  211793. 0xb0ebabb8,0x14546a33,0xc2f88a92,0x0067f0b0,0x0a2db019,0xbde0dfe7,
  211794. 0xc63e6f3e,0xba51b06c,0xe9206fad,0xa19127b9,0xfe80dc0a,0xe4eb5e87,
  211795. 0xd4de30ae,0x1e6fccf5 } },
  211796. /* 179 */
  211797. { { 0xaa8ac924,0xb57dff66,0xc298b3e8,0x06e9ad31,0x65fb080c,0xd140e329,
  211798. 0x1d95c93f,0x7dab211d,0x8a180caa,0x6d68d842,0xa20ded69,0x1a929408,
  211799. 0x38df461f,0xa8151753,0x60eae932,0xff5604ae,0x7dae4c0b,0x901b9e49,
  211800. 0xde262e89,0x4573a97f,0xf1084983,0xed69d9a4,0x64724f1d,0x8ffa022f,
  211801. 0xea85a15f,0xd5f1c2e4,0x01453794,0x4c626ce9,0xbf0907dd,0x80440cd6,
  211802. 0x5ddaa837,0x4522d461 },
  211803. { 0xebfbe7c5,0x8895f079,0x84ef3446,0x30ea1ded,0xd4a1ab96,0x716a9eb6,
  211804. 0x50a30c68,0x1a4a5d22,0x0043bbaa,0x5a16631c,0x5010e5f5,0xbd107502,
  211805. 0x3d8c0556,0xbffe3e9d,0x07772419,0x31b30b18,0x84b82297,0x90ff7ef0,
  211806. 0xf21a18c3,0x00c37d75,0x565bb8f8,0x18d0a635,0x45e3bceb,0xbac1da2a,
  211807. 0x23f0b08d,0x1c38e90c,0x5fbc5ac5,0xf1ba1aa2,0xdda71fc6,0x09d5256b,
  211808. 0x6d7e40ba,0x346501a9 } },
  211809. /* 180 */
  211810. { { 0xcc2b0f1d,0x86be448c,0xac4c3703,0xe3eb45c9,0x9fc96bbf,0x5387f65d,
  211811. 0x5ae27fda,0xcef3c4e9,0x1bc18089,0xa008f776,0x22ca18a1,0xf374a084,
  211812. 0x53b73371,0xee882842,0x7cc09354,0xcb6fc6d8,0x61496d6b,0x8489ec1b,
  211813. 0x49e325c4,0xa92c29b9,0x7bdec166,0x15c6ca52,0xdcea2813,0x95444eee,
  211814. 0x3a21154f,0x34683eb3,0xd39061cf,0x8fb26f98,0x06c940bb,0xc3b08aa8,
  211815. 0xe554c96d,0x7c1d42cf },
  211816. { 0xdc110aa7,0x766e703f,0xf362e378,0xab7b79d7,0x5aadca3c,0xd259c75d,
  211817. 0x60be3373,0x2a6eca79,0x06c4e8ff,0xf4744a4b,0xf3b705bf,0xb2842cce,
  211818. 0xae304b53,0x1a3af5aa,0x1b2d31b8,0x7bbfa201,0x4bee88d9,0xc4ba6eba,
  211819. 0x565cb839,0x2d3565ce,0xdaf7ece8,0x24808696,0xe6959745,0x2c7ccce7,
  211820. 0xe94f9837,0xefd6eb3c,0x3811a326,0x0a33b4cf,0xfffa93a6,0x14203f43,
  211821. 0x73c31d90,0x031e9828 } },
  211822. /* 181 */
  211823. { { 0x765a17ff,0x4fefecfc,0xd1290a65,0xa09f3888,0x938da038,0xbf265c46,
  211824. 0xa169ad46,0x4bb6145d,0x23a62fe8,0x33cf8214,0xabc860a5,0x562df571,
  211825. 0x815c38c4,0xbf2a90fa,0x17eda875,0x45ba1d6e,0x946fa5e1,0x799d881a,
  211826. 0xb90f5a3b,0x6c1be784,0xb10ff52a,0x0910a37c,0xa4f4fd36,0xc38c1fe4,
  211827. 0x8e2d3ba0,0xc3180fc5,0xb17a6187,0x3e2ff050,0x943a35c2,0x3a00059b,
  211828. 0xa28cc51c,0x494d3645 },
  211829. { 0x4ba021f8,0x398426b6,0x796deb6c,0xd14c9083,0x7e36c762,0x6d2e5395,
  211830. 0x751cf216,0x8f556eca,0x19b24a19,0xdaca1e00,0x4b20c2ae,0x47887da4,
  211831. 0xff41a733,0x93ed4ccd,0x5c7c0cd7,0x8d717c44,0x91bf7009,0xcc48634a,
  211832. 0x3b59bbaf,0xa1f146f9,0xe5624f15,0xdd38bb39,0x303f8443,0x96d41aad,
  211833. 0x4bf104fc,0x6b670f03,0x29706582,0x0503f9ed,0xb34200f5,0x768e1f47,
  211834. 0xbbd4c6f3,0x3cfdcc5e } },
  211835. /* 182 */
  211836. { { 0xb523e13d,0x536c2a86,0x2920d0a0,0x1014a458,0xe7571296,0x3d52b478,
  211837. 0x7eb51bea,0x05746066,0x87b0e919,0x709f7861,0x686888e8,0x028aed88,
  211838. 0xd94afcd4,0x79a809d7,0xe2129af3,0x50c6032f,0x983c4082,0x75e4be72,
  211839. 0x7ab3be8e,0x98331bbb,0xb618c728,0xd31a032c,0x3f59c4a4,0x36dd85a1,
  211840. 0xed4f61e2,0xdbece345,0x1e571715,0xba7aaccd,0x64a1ebd7,0x138c58da,
  211841. 0x3d1aeea1,0x89296d0f },
  211842. { 0xcca82c97,0xb165288f,0x1427e8dc,0x26c6c12d,0x4c3edda9,0x66a94f07,
  211843. 0xeaa01ebe,0x94600e1e,0x30f5e86d,0x14abce7c,0xcb456a31,0x741d7020,
  211844. 0x279f42c2,0xab05aa13,0xd4238468,0x70b60faf,0x318d39e6,0xa18efec1,
  211845. 0x8920b318,0xeb07f1ac,0xd8399e03,0x01e3cba8,0x3c81a301,0x65f8932e,
  211846. 0xccc667d8,0xae8bca7d,0xa268607c,0xcee1ae79,0xcac0a12c,0x3182e64c,
  211847. 0x2b1a4c54,0x9233a2f7 } },
  211848. /* 183 */
  211849. { { 0x0acbee17,0x717e8df6,0x5c24fcdc,0x0f0959c2,0xe54ffcb0,0x46f09887,
  211850. 0xd285116b,0xb993deca,0xbba1fa51,0x0bfaa4f8,0xd0f2183e,0x9c9249ef,
  211851. 0x96847779,0xf93cb358,0x2322d421,0x284bfb7f,0xd42af009,0x40cc709a,
  211852. 0x9bb1d615,0xc69f2274,0x717c3c6a,0x76f50b3a,0xbb9c5eeb,0x8b21e985,
  211853. 0xa4783b5f,0x58fb19ae,0x52e1c3e7,0x04c86b9b,0xf2971ac8,0xaca59092,
  211854. 0x21ed8291,0x2bb26a69 },
  211855. { 0x15f81416,0x98a34435,0xaaff5bb4,0x086e72e7,0x0317261c,0x3d1f64de,
  211856. 0x5c0a1cfe,0x31c0786c,0xb3683401,0x542ea4d8,0x1a39b4cd,0x2f77273a,
  211857. 0xcbef27f1,0x14fe7ee1,0x16bb27dc,0xee7fc09e,0x410e5dc7,0xc0dccc17,
  211858. 0x1943b3dd,0xa3466742,0x3f31c1b7,0x92934b60,0xc22c1070,0x0186ded9,
  211859. 0x799f966b,0xa37ee8ba,0x249b0893,0x0f3bfcb4,0x2e92d4de,0xbae61447,
  211860. 0xe196eb08,0x937cb3f8 } },
  211861. /* 184 */
  211862. { { 0x16fbfdce,0x57c0e77c,0xc98d4cc0,0xea034cc9,0x42572d20,0xe7606d72,
  211863. 0x0019a83c,0x9861b55c,0xf1597162,0x80ba2803,0x05a0fd7b,0x0f4141dd,
  211864. 0x4b0daaa2,0x8865913b,0xaa3848ec,0xe6685746,0x3e0485d2,0x16d15a5a,
  211865. 0x3b6905dd,0x81c0c774,0x818af2ba,0xcec31b7d,0xd2b74b78,0x80d8f194,
  211866. 0x543e2f28,0xca659db2,0x9fb07c1c,0x31b83a7d,0x1f1048c0,0x86537fdc,
  211867. 0x78586a11,0x4d57bb07 },
  211868. { 0x53b396b6,0xbc4b768a,0x93b51dac,0xbc8b24c4,0xa30ae1b3,0x33e511eb,
  211869. 0x945147c5,0x893bbd95,0x179fe3ce,0x6cc86031,0x3f920bd4,0x34b0a167,
  211870. 0x6b256160,0xb32912eb,0x9d168d83,0xbc69a2a4,0xef0dd128,0xb4949e7a,
  211871. 0x872699e1,0x2613419a,0xbf21376b,0x06c58477,0xa4f97147,0xe55b1909,
  211872. 0x7b9b745f,0x63d6eb75,0x08df3c85,0xb5365b29,0x55fcfae3,0x0e257e43,
  211873. 0x979f2aa8,0x1067c118 } },
  211874. /* 185 */
  211875. { { 0x32bf8883,0xc8455084,0x6fd06667,0x4755286a,0x77c2335d,0xd70b0f8f,
  211876. 0x2f4a2c94,0x678e60da,0xd118acf5,0xa468d8ac,0xbf5b90d9,0xce93830b,
  211877. 0xed4e9104,0xea4b1c74,0x27776ea4,0xac67316d,0x361bab12,0xb98ad75c,
  211878. 0x99122451,0xc323d482,0x530a43ae,0x26440220,0x3292d5a5,0x3a44532e,
  211879. 0x5fecf1bc,0xdb48694b,0xc667b8b8,0xe4e0516e,0xa4306ade,0xb3aa595f,
  211880. 0xf34e9725,0x7e4f7091 },
  211881. { 0xb7f70919,0x3f3816e9,0x16b003f5,0x765216ed,0x778c99e5,0x46c6cff4,
  211882. 0x30a51810,0xe6a5abe8,0x45e728db,0xef6f49e6,0xcaccefd6,0x6fdd73ea,
  211883. 0x8c37f3f7,0xec394e6f,0xb6407fc3,0x73320802,0x96625cbd,0x988e8f7a,
  211884. 0x7cabfb00,0x83292363,0x407f359a,0x258ba9df,0xccbfae50,0xff01aee5,
  211885. 0xfe251813,0xfbeaeace,0x83f1cba1,0x9c69f161,0x9eadcdb5,0x512c58ad,
  211886. 0x6ccce8bd,0x2ae49cd4 } },
  211887. /* 186 */
  211888. { { 0xc40849f2,0x1239b0e3,0xa441098c,0x5136a4cd,0xe547f649,0x61535a99,
  211889. 0x7a9bbac6,0x92e4bdc4,0x53547af6,0x195a1646,0x8b47a74a,0x85ecb319,
  211890. 0x9de6a2b2,0x278553fc,0x0e2ba52d,0x471c038a,0x35bcba93,0x12ba1b88,
  211891. 0x6f31eca2,0xd4bf50da,0x802b32c6,0xd146e3f6,0x3c64c8c4,0x0c9c0131,
  211892. 0xeed21297,0xad30f12d,0x9c68530f,0x9b75bffb,0x8918de51,0x23c0ad3e,
  211893. 0xa73771b7,0x180e9d52 },
  211894. { 0x29ab77b0,0xc316542f,0xf7aee628,0xdd411d9c,0x353c2f40,0x044c0685,
  211895. 0x4b0ae4cf,0x638dc7e4,0x95fc266f,0xa0924185,0xfd2feb7d,0x639da671,
  211896. 0x5ea39798,0x56858ed5,0x58f3832a,0x7a694f31,0xd316d831,0xa94233c6,
  211897. 0x30a35a7b,0x2fcacb26,0xf1ff713b,0xfef8f7dd,0x59eee2f3,0x8b9b4525,
  211898. 0x156d064a,0xd1b4f91b,0x2f5cfcfc,0x177866c2,0x3777eb41,0x12bc2566,
  211899. 0xd8ab85b4,0x21ca6f3c } },
  211900. /* 187 */
  211901. { { 0xa3e66635,0x0e162b13,0x2a9f76af,0x1ef20a2b,0x46db3356,0xab473a30,
  211902. 0x7802bb8d,0x0840bd77,0xa699b44c,0x5b6baf5e,0x1b2207f1,0xc6e11900,
  211903. 0x790b0105,0xe5de16a9,0xdb67f004,0x22b12f15,0x8a025d25,0x185fad45,
  211904. 0xdf0a1142,0xbccf6953,0xf45034c0,0x4c42129b,0x1c277bff,0x0f740400,
  211905. 0x280a9e18,0x6e440b4c,0x842aa2b4,0x767de8f5,0x05e8d94f,0x3de20ab8,
  211906. 0x20227635,0x5aff5859 },
  211907. { 0xa8458e40,0x805acd20,0x149732bd,0x5a5557d8,0x5f1ca72d,0xc7074131,
  211908. 0x952b5323,0x7f2e269c,0x6494fadf,0x5c592556,0x1a7d2666,0x153b7acd,
  211909. 0x86fe2865,0xa6df063d,0x57d53b6b,0x1e91db13,0xe93ead01,0x9195bb89,
  211910. 0x2963bfe6,0x3d71e1af,0x88278886,0xfab2b9c2,0x3b859b6f,0x77836692,
  211911. 0xf7029dd1,0x6e695174,0x7b984561,0xc7987876,0x5907d849,0x64fb4f1d,
  211912. 0x88d8a977,0x3eab7e1c } },
  211913. /* 188 */
  211914. { { 0x52e5718b,0xc73a94b6,0xf4cee1e9,0xe3aefa54,0x553eedea,0x654e9e63,
  211915. 0x5f3aca1a,0xf2541e1b,0x0d083316,0xd7129489,0xfb7f950e,0x7965af63,
  211916. 0xc74e3e4a,0xd8fc9e0d,0xeaf79ebc,0xb4ee48d2,0x8b7787e6,0xa458a86a,
  211917. 0xf7cceaf0,0xd8c7621f,0xdf67980d,0x8228eeff,0xf9106727,0x210d4742,
  211918. 0xb07e3629,0x91f63501,0x7971e29d,0x441761c6,0x03a3b8a5,0xc0ccc65f,
  211919. 0x38e09544,0x3491da4f },
  211920. { 0xcb062eae,0x6706d046,0x5d08776d,0xee7db735,0x292315d2,0x80de8052,
  211921. 0xc402bbdb,0x40785662,0x26ed3337,0x5f93525c,0x7d568ed3,0x6cea14d6,
  211922. 0x66888b1e,0x916a1189,0x5dc71675,0x0fbd5205,0xe4575df2,0x833d1077,
  211923. 0xec092335,0x4e93100a,0x6cd85389,0x2f9e1d01,0x43226368,0xeebd3725,
  211924. 0x1ba4cfd7,0x401d172b,0x574c5838,0x377dab9d,0x80d517de,0xaeaa6958,
  211925. 0x6ad15a18,0x0c843dfd } },
  211926. /* 189 */
  211927. { { 0xc9373300,0x455811ff,0x99fdc300,0x1c39332a,0x353cb655,0xe19bb81c,
  211928. 0x96a83d27,0x774b924a,0xb2ee3f1a,0xcbfc8fcb,0x010d56c7,0xaf278ec4,
  211929. 0xe0abaf79,0x6fde682f,0x7339aebf,0x7566d072,0x71205db6,0xbd35ad5d,
  211930. 0x7051c9d0,0xb5bbe694,0xd3a3067c,0x577db480,0x572d7530,0x2c70ff54,
  211931. 0xe06d853d,0xe8615aec,0x05abfb5d,0x71999ccb,0xea0a8ed7,0xeeefc96b,
  211932. 0x35f6df69,0x2dcc469d },
  211933. { 0xc65f0e77,0xcca6cd06,0xbd71b14a,0xddcc7980,0x3c93cc00,0xb6221f8b,
  211934. 0xae8cbf57,0xddfcd5b3,0x76f8e63f,0xbc92973f,0x06e132b7,0xe9848a34,
  211935. 0xd51ec9e2,0x4cc59a03,0x3a33081a,0x9c9d32bb,0x80e8466b,0x00121052,
  211936. 0x1bbe7295,0xc2b0032a,0x24938448,0xdbfc6572,0xb6bba0ff,0xe972a0ce,
  211937. 0xc0a94802,0xf60c0a4f,0x599d8bc7,0xf62c41cc,0x312da0b8,0x820c96ee,
  211938. 0xcdbdf9fc,0x5a1a65db } },
  211939. /* 190 */
  211940. { { 0x42485684,0xbfba691a,0x29c470c9,0x613116b9,0xe62a0519,0xb4b01971,
  211941. 0x5ff499da,0xf3245aa6,0xa5238eff,0xc2ef87f4,0xcc9d5515,0xc16dc6ba,
  211942. 0x2dbdacac,0x5a7f227e,0xa9bbaecb,0x8dedaac4,0x2e7c9885,0xff308a6d,
  211943. 0xe6895593,0x4c6f2fc2,0x177e0611,0x3655f285,0x300b1bee,0xa63e8d06,
  211944. 0x13c17b54,0xbed0ce79,0xc4974262,0xca4abe35,0xbc4e4037,0xf4b44a17,
  211945. 0xefe5fbd9,0x5ae95099 },
  211946. { 0x804f7455,0x122e5ee7,0x22066682,0x341a4997,0x7795e333,0x97d24c31,
  211947. 0xe48efced,0x12f4123c,0x19fbc21c,0xe8738d92,0x0663a3ae,0xbb3bdc61,
  211948. 0x8593a6db,0x3603d8c2,0xe3c1ac75,0x926227f2,0x5eaae519,0xfea92ac0,
  211949. 0xfd6812ac,0x5b596f0b,0xfc2a82dc,0x3ce7e844,0x63522b27,0x3840481a,
  211950. 0x52867895,0x836088b1,0x26588688,0x21ffb7cc,0x2f4a7cac,0x0ca33161,
  211951. 0xa3edd298,0x4110667e } },
  211952. /* 191 */
  211953. { { 0xc2d04b63,0x81830357,0xf4929a18,0x3fc5a34d,0x22d195df,0xc73bf6da,
  211954. 0xcb432473,0x14df2f89,0xe997f138,0x345afe5c,0x8b9604f4,0xd8e3f5f9,
  211955. 0x50c10ae5,0xad7942e9,0xeed25ff3,0xcefd5447,0x0e73c0cc,0xbf68e51e,
  211956. 0xab54fa4c,0x5b1ad591,0x12b61c8c,0x8bbc1105,0xb5abf760,0xbb932913,
  211957. 0x01e79649,0xdb1231be,0x040ccbe7,0xd0a83e91,0x90a96db9,0x3dde426f,
  211958. 0x34df11ea,0x1cceb645 },
  211959. { 0x0c6d0f55,0x2d210c4f,0x9c673c9d,0x6cadf61b,0xa9ce3fbb,0xdd7f9919,
  211960. 0x93b063e4,0x135f494c,0x145a93be,0x580bdb3c,0x0f52ef7c,0x4d872332,
  211961. 0x8814bb6a,0x74d876e8,0xc7a97dee,0x4f6f723a,0x3e3cd833,0x7de2b8f0,
  211962. 0xae720270,0x6162f082,0xddfa486e,0xe88ec2d4,0x8d3a17c6,0xd965c859,
  211963. 0x3980171a,0x62e59e54,0xbbef6b22,0x0ab6285d,0x4d48b203,0x3cf45195,
  211964. 0x4ea25ea3,0x1f175233 } },
  211965. /* 192 */
  211966. { { 0x3467ea91,0x808a765b,0xfd2d9c45,0x3f4632ee,0x9cf2bc6f,0x7b75dc6d,
  211967. 0x359813ae,0xefc8d240,0xe44cbd8d,0x23ecb209,0x21525622,0x59ba10e3,
  211968. 0x3f1ee19a,0xfa14d934,0xfb0c48f7,0xdf97c21b,0xea30d437,0xc4e62890,
  211969. 0x651475c2,0xb286e2a4,0x126672a5,0x291f01e4,0x31aab3b8,0x9c6fda5c,
  211970. 0xe17d22ec,0xb7277a5a,0x914f0bad,0xbd88ed83,0x6a2392e1,0xd0b05d1b,
  211971. 0x65893c2b,0x4cb8af90 },
  211972. { 0xbb4b1953,0xa2b02057,0xf597f6ee,0x4ce08b44,0x5e6412c8,0x854f5d9b,
  211973. 0xb3cd4919,0x1913262d,0x6e42bb5d,0x902762e4,0xd78e7f60,0x8355c8e6,
  211974. 0x38b6c16c,0x8efaa824,0xe550f618,0xd0173790,0xe57d778e,0x118af462,
  211975. 0x715b4714,0xa16ad5e8,0x41dea4f9,0x900596c3,0x280ca610,0x2a957c32,
  211976. 0x374c65a1,0x2faee800,0x50080414,0xdb105127,0xff080fa1,0x8c1db931,
  211977. 0xd79878fc,0x486a5c25 } },
  211978. /* 193 */
  211979. { { 0x941b4f36,0x0521e213,0xf803b4f9,0xbaacfb14,0x52a54ba8,0xfdf1e22e,
  211980. 0x8fe4796c,0xacfabbba,0x58dbacb6,0xae0788db,0xc19dfa51,0xdf98d736,
  211981. 0x35a716ee,0x155c286a,0x9c86461b,0xbe7d4676,0x63a64a5e,0x50b6380f,
  211982. 0x9f609262,0x14b41914,0xa2dfc5b3,0x0919a7d0,0xcef466ac,0xc454da55,
  211983. 0x6986aaec,0x93fa4a24,0x71a49ced,0x5090b171,0xc1fa75ad,0x602f1d6c,
  211984. 0x78e4c054,0x5d269f89 },
  211985. { 0x14920419,0x3a74030c,0x90968739,0x0845d868,0xeeb70fa6,0x81b994c4,
  211986. 0xd9fc5bcb,0xabcaa06d,0xf58f8f2d,0x06539427,0xb1dc52aa,0x35c85f67,
  211987. 0x2c911baa,0x5a7d8d72,0xaec2d834,0x4041005c,0x7a8e5347,0xb5868a44,
  211988. 0x8de512c3,0x04ee180b,0x211168eb,0x4daa66e5,0x2317cd8a,0xc0bd5dab,
  211989. 0x61164df6,0xa1d4185d,0x1dbad7c9,0xacedca26,0x09b02683,0x0fe4b5ac,
  211990. 0x26d9550f,0x8ac9995a } },
  211991. /* 194 */
  211992. { { 0x2640a39d,0xb2c8dc9b,0xede0c9f9,0x21ff0b38,0xa1ecba0a,0x74f469bd,
  211993. 0x080d0417,0x8a902ccd,0xf4994604,0xe956fa32,0x9776ab15,0x348f85cf,
  211994. 0x0066f492,0xc21fc6ee,0xfeeef367,0x35b1ebfe,0x4613e5ed,0x7804581c,
  211995. 0xea6ba071,0xcbdfe8e6,0x950d73ed,0xddfcaa32,0x1da48889,0xc9747936,
  211996. 0xdbaffbd1,0xce867c8c,0x1cbaeae7,0xd267431f,0x897912c8,0x68255045,
  211997. 0xd7ea1e4d,0x0c7c1ddc },
  211998. { 0x1ce963a7,0x53aa30cc,0xc4c5fade,0x7352f64c,0x2828afbf,0x2b9aa2f8,
  211999. 0xca212107,0x64273c56,0x85a576dc,0xaadd7654,0x90b5c77c,0x6196ac3e,
  212000. 0xd1aaf39b,0x20d43e9f,0xcd05cbc4,0xfc392062,0x4c0ff2fd,0x14163872,
  212001. 0x2ae821e6,0xcf32b8d8,0x3fa7a3f0,0x5f58f943,0xf644ca92,0xaebf1d2d,
  212002. 0x1918a75f,0x0c061563,0x6b876118,0x7989b5ed,0xad412441,0xbf342445,
  212003. 0x1df633ab,0x24ffc9ae } },
  212004. /* 195 */
  212005. { { 0x93c7cb2b,0x89fcdc05,0x590053fb,0xc1243b95,0x6182343c,0x601debcf,
  212006. 0x66c18a63,0x364546ef,0xec913287,0xa5290701,0xf9788c31,0xc35b8026,
  212007. 0x92d1f7d7,0x852b862a,0x0aa79728,0x1809cb05,0xa3cb2005,0x897d467c,
  212008. 0x9ef5b946,0xf20c77c0,0xf2241984,0xc3372c42,0xf35bb206,0xda053e0d,
  212009. 0xa9c140b5,0xbc26c6d0,0xcb56fb33,0x61cfcc0c,0x299b3968,0x1c3cf9ef,
  212010. 0x40621ba4,0x89e4d3d1 },
  212011. { 0xa45a9be3,0xd35e80e7,0x07356fbd,0xc4daa578,0xb967bc2f,0x0186d62e,
  212012. 0x47cd16e3,0xa702679e,0x5f30ce9b,0xca2f1c02,0x1f864f50,0xf1205b46,
  212013. 0x85061d66,0x7fd6d797,0x8a08809e,0x47edc4f6,0x9a4d3ae2,0x5dac0449,
  212014. 0x6d1f9da8,0xf844664a,0xd7a83a71,0x9f30ce84,0xeaac33f1,0xe9382bac,
  212015. 0x948622ab,0x1f033831,0xf7681eb2,0xb037a4ba,0x99a1b5c7,0xd156a908,
  212016. 0xe6f1d0fb,0x675d3e6f } },
  212017. /* 196 */
  212018. { { 0x707193e5,0xd9767ffd,0x810358e5,0xe478aa91,0x328d8ef7,0x5634f9ff,
  212019. 0x6dbbd9a7,0x913a0ee8,0x7e215686,0x379b2968,0x89d9da38,0x903f410a,
  212020. 0x1b1334d2,0xd9f8d7b9,0xbd82efb5,0x9fe74229,0x3803c778,0xdb568b62,
  212021. 0xd3d25344,0x93e9a350,0x724497e8,0x559c35b0,0xa169e23b,0xc472d436,
  212022. 0xcc5b4c69,0x09864632,0x83c7f531,0x9f6d759d,0x1e497888,0xa91cf1db,
  212023. 0x60af1a4b,0x5f7f92fe },
  212024. { 0x0545167e,0xf18a1cc6,0xaffa88e0,0x55ee2e02,0x432a7bcf,0x24cdff51,
  212025. 0xa7510866,0x7382da42,0x40511af7,0xe894c11f,0x2aaf1423,0xaa4e4e31,
  212026. 0xf63dd2ae,0x8c3d36f0,0xd7660635,0xfc5c9550,0x37ea7eab,0x01253731,
  212027. 0x39b950f6,0x2a5cd598,0x40e63442,0x95a0f601,0xf2ac7045,0x905e238e,
  212028. 0x446b0f73,0x44bacc0e,0xc448578a,0x4cd4206e,0xa5bd7803,0x367b1aaa,
  212029. 0x0a2b458d,0x25beced9 } },
  212030. /* 197 */
  212031. { { 0x0c33a8fb,0x079a7382,0x0f25dc1d,0xcfbf6cd1,0xc6d482b6,0x4ffc73f8,
  212032. 0x07bf844a,0x3e51f18c,0x599162f0,0xa7651236,0x14013811,0xac59a74e,
  212033. 0xe55018a0,0x957a6865,0xe3ca09b1,0xe1ec51bd,0xa960253f,0xbc0c7eb3,
  212034. 0x7de03f84,0xe83bfd14,0x52fbdb09,0xc0540ed1,0xcea15ec1,0x6ba52edd,
  212035. 0x4b261307,0xf3d30ed5,0xe8397206,0x9bd7bae8,0x096373aa,0xf20d8692,
  212036. 0xc3b0bf63,0x0a616a4b },
  212037. { 0x6e1339c9,0x2075f3ed,0xbf8b00a6,0x7afaa072,0xbccd9b47,0xdfafec82,
  212038. 0x00ca54c7,0x4713158f,0x38bc31ae,0x449102f1,0x310dfc8a,0xaf98f158,
  212039. 0x59e954d4,0xc9ef2075,0xc527a0c4,0xe8021af9,0x7a192023,0x6e801277,
  212040. 0x7fb02377,0x635f538c,0xe8c9e951,0x5df1974f,0x15cc9097,0x0287faed,
  212041. 0xf7a5115c,0xfa0728f0,0x0fac623d,0x90dbfbe6,0x0311ba09,0xa8d40fd4,
  212042. 0x07c6464c,0x876d154e } },
  212043. /* 198 */
  212044. { { 0xc2d3ea8a,0xd3a4d6d2,0xa842600e,0x36be681b,0xe4070672,0xc53f100d,
  212045. 0x6a7d7a7b,0xe3e5b6fe,0x5d5e1a83,0x6e6994f9,0x76097c2a,0x07cacd22,
  212046. 0xa6791011,0x12d98dba,0x102e0e24,0xddfc4461,0xd493272a,0x4815dbc2,
  212047. 0xa9436696,0x7e38e64b,0x32b2bf90,0x4960eb1a,0xd928e28b,0xda457525,
  212048. 0x2a077c9e,0x72f75b39,0x7fd61d00,0x27760cbb,0x0f4b1456,0xaf235d1b,
  212049. 0xe76d1700,0x3040c23b },
  212050. { 0x4efa9a70,0xb10dc55b,0x53e86610,0xd4de414f,0x09f8a27f,0x3d95c113,
  212051. 0x06661d3c,0x505109a5,0x60eb513e,0xcaa2994a,0x1e7d338b,0x3ee41537,
  212052. 0x4651e71f,0x4fd145fc,0xcbc313b4,0x51bbf838,0x1eb92150,0xb039e078,
  212053. 0x14bf5ac7,0xe8696b44,0x8be0d48c,0x2d667188,0xdd8f2b6f,0xbe93b2f5,
  212054. 0xeb8a7f8a,0xc1dfd1e7,0x90f751c5,0x862b3dd9,0xa32a74be,0x1eb1ad58,
  212055. 0x1ebbc9a2,0x5486d79a } },
  212056. /* 199 */
  212057. { { 0xa1359e13,0xcb2e34ff,0x28196051,0x202d8dbf,0x23564b5e,0xe95e023d,
  212058. 0x42f6ac12,0xfb1340b6,0xb653725d,0x543ba852,0x8d2466ad,0x81aedcd6,
  212059. 0x547c728b,0xbf780224,0x9569fb65,0x559f8a11,0xdfb22ec9,0x505b7a62,
  212060. 0x9eed5e52,0x07107540,0x299f6f11,0x9c899288,0x3db6f8c7,0xa7d69261,
  212061. 0xb3ca79a9,0x30eb7fb3,0xfb2160b0,0xcab99bb8,0xd28b409a,0xd2012568,
  212062. 0x5ac45f8b,0x380f1b0f },
  212063. { 0xe6a0068f,0xc0b99e6b,0xc8a73753,0x4b67cf2a,0xb2faeb7c,0xa6c9a548,
  212064. 0x340260c3,0x7f417f99,0xcc0f739e,0x8ee56855,0x780949da,0xf08b510f,
  212065. 0x8d5c6eff,0xb1770fc2,0xfd96a7bb,0xb4f5abee,0xf2665a2a,0xa07b1136,
  212066. 0xb601dcf9,0x2fb380a4,0x162becc6,0xcc803614,0xee6b83b3,0x3498fb96,
  212067. 0xa8c17eeb,0xea9b0fd6,0xa177efc2,0x5834b5ba,0x5b110b3e,0x929044f5,
  212068. 0xebd7285e,0x4abedded } },
  212069. /* 200 */
  212070. { { 0x700ef376,0x3355e1b9,0x66cdabff,0xd56e5d9a,0x47e87646,0xb3dc2575,
  212071. 0x00f79369,0x28f44b8a,0xa0c52e29,0x08c32b1e,0x3729b392,0x5a78de12,
  212072. 0xb26d239d,0x4184519a,0xe0ce4a6b,0x23f6b4b7,0xacb2a9f9,0x235f6f8a,
  212073. 0xe2064a59,0xbb8bc454,0x1bf3062e,0x37efd034,0x94dff6f9,0x6bac683b,
  212074. 0x8aa7fa06,0xc3364b1e,0xce0b3745,0x0616772a,0xd1e3fb0f,0x46f08d08,
  212075. 0x18e132d3,0x6a20abb3 },
  212076. { 0x6a85cbc7,0xea831016,0x934f9aa7,0xd0990946,0xe778f1b3,0xc2211088,
  212077. 0x2247b799,0x7ea4ff8f,0x454484ce,0xb3171d71,0x4f98c364,0x29403949,
  212078. 0x97df1458,0x5da911f3,0x09439116,0xa6b58093,0x174238bc,0x75f9509a,
  212079. 0x8209758d,0xfeb51821,0xa47925d0,0xae0c6021,0xaf8a315e,0x0e946694,
  212080. 0x6bad04b7,0xae7af8a3,0xf072447d,0x44c15e7f,0xa5456ffe,0x5184668a,
  212081. 0xbf36b977,0x45e353a7 } },
  212082. /* 201 */
  212083. { { 0x93092f71,0x76056764,0xf5b92d71,0xeb66b6c2,0xe2c8b6c5,0x9db3149b,
  212084. 0x20c0363e,0xf62f583a,0x03cd7097,0x688acd33,0xebb916ac,0x85d0c0f8,
  212085. 0x84c19b0e,0x1bf7462c,0x7c4a6ad1,0xc76ed5f9,0xd119f369,0xec8b88ba,
  212086. 0xebe50b83,0x59b8371b,0x866706a6,0x0cc69508,0xf8373d2c,0x531c75a3,
  212087. 0x2a5a02fb,0x4e1cd3a3,0xda39a1d0,0xe8274778,0x75da333e,0xedfc5bbb,
  212088. 0xca79bd36,0x15941f24 },
  212089. { 0xa77dd512,0x42e8c0f8,0x1dc365f6,0xa91b59a7,0x08753862,0xe80d14cd,
  212090. 0xd272faca,0x1624230d,0x4027cb5a,0xeea3ec16,0xc1ef9f03,0xc1700b59,
  212091. 0x0da3148d,0xd411c127,0xc4181af1,0x801ee448,0x9e3a900b,0xedf28559,
  212092. 0x0d09affd,0x5d67b0bd,0x8b370024,0xd839df96,0xe6f836b8,0x3b6307e0,
  212093. 0xbd3201c9,0x5382e588,0x7a1d02bb,0x636d8a6b,0x968641e9,0x70b7db76,
  212094. 0x118fad03,0x6d17c34a } },
  212095. /* 202 */
  212096. { { 0xc181c99b,0xcf608841,0xc87bdcaf,0xb65dc901,0x3720dabe,0xb460b447,
  212097. 0x5377515b,0x4c79c396,0x0a96c277,0xd447f22e,0x2ac0f440,0x0d952130,
  212098. 0xc90583ad,0x8330b26b,0x928904a0,0xe25e977a,0x85c50b18,0x1deaffd9,
  212099. 0xa5ad5f6a,0xcf4dbcb7,0xc8a37ed5,0xcbcd0019,0x1e9850b6,0x7846dd90,
  212100. 0xb0b8e605,0x1ac8194a,0x34132f90,0xb9728571,0xf56ee28b,0x4ce9f149,
  212101. 0x3e9e1d4e,0x1ab9b5a4 },
  212102. { 0x314fa7a3,0x206dab92,0x478ff963,0xcc4af0f0,0x904d9fdb,0x4cce1713,
  212103. 0x12c045fe,0xac20a2eb,0xfd8f6d7d,0x44fc5478,0xca7b6ffa,0x886e72c5,
  212104. 0x6fd6f758,0x7fa4529b,0x92a820d5,0x4df1d1b1,0x2789f149,0x3d812f9f,
  212105. 0xaabb53d2,0x9842f083,0x2a03ab32,0x2648539b,0xb1512502,0x631ce090,
  212106. 0x731f6bd5,0xe1294d15,0x9436e634,0xb229361d,0x3ca966af,0x8c4281c4,
  212107. 0xc21ab3ed,0x24b34956 } },
  212108. /* 203 */
  212109. { { 0x659824e2,0x49bdcb86,0x4e13e74c,0x6dc4ce48,0x6bbe1eea,0xa4c01a26,
  212110. 0x1e3ec457,0x47b2b8e7,0x2f5a8e4b,0x7e8b15e0,0xe333530d,0xe81eb6e6,
  212111. 0x17a45202,0xacba369e,0xd70e4c9f,0x81241431,0x3e12beb8,0xc190af4b,
  212112. 0x11f486fd,0x53270523,0x29fb2bce,0x9f6c41e1,0xb70f6c08,0xbe6287eb,
  212113. 0x3feb4477,0x1479850a,0x9bcf18bb,0xfcfdfb11,0xda80d040,0x925c292f,
  212114. 0x7e3c5bf9,0x212d65e5 },
  212115. { 0xca15cf08,0x23adb386,0x81e172eb,0x4dfa4ac4,0x4d42d0c0,0x9d1dbf93,
  212116. 0x74404dc7,0xd9cf6073,0xe932bfcd,0x60508441,0x1c682a98,0x9ae910ca,
  212117. 0x41ac1cc0,0x9528fc18,0xdbbed630,0xe6a120ae,0x30ccf250,0x94e0e1ec,
  212118. 0xe58bbf2f,0xfe84ba54,0x9faa4415,0xc66d0b4f,0xecee7ce5,0x0c58f1e7,
  212119. 0x6fa6873a,0x7a1d43eb,0x399f1348,0x96c6c5a0,0xe6727ab7,0xe6ef9aaa,
  212120. 0x9a5c2447,0x66afa554 } },
  212121. /* 204 */
  212122. { { 0xc980e91d,0xda5aaba8,0x6ac98efa,0xa93cf509,0x8da32662,0xb0990e0a,
  212123. 0x0081453e,0x01d21530,0x3d71de84,0x2bb0d33e,0x3e19a012,0x465f6d80,
  212124. 0x78a838e7,0x5902ff4c,0x1931348c,0x74e2afb7,0x9cfb057b,0xa4932757,
  212125. 0x3ad03f8f,0x761ea642,0x58ffa40a,0xb7d4c245,0x77a87e30,0xb5e9c0d9,
  212126. 0xc9c84d26,0xd1c5edba,0x3d1963a0,0xeca8839a,0xebf6bf0d,0xbc6f2f35,
  212127. 0x0d58abdf,0x01ef0631 },
  212128. { 0x3ecdcbb0,0x2bf90316,0x27c1c955,0x19e2d728,0x9575c930,0x9e527030,
  212129. 0x96983930,0x0dc1c5a9,0x7cd082df,0xef9f80ff,0xdf97e051,0xcd915075,
  212130. 0x9cc61b55,0xf286fffe,0x80f24cc4,0x352db38f,0x36523ae3,0xed9b99ec,
  212131. 0x10b104a9,0x109a8ca8,0x305203ad,0xc2700fe7,0x769400f5,0x2a2ee24e,
  212132. 0xee0c452c,0xd595d399,0xf7f02a41,0x0ab75d6a,0x0db730b7,0x34108099,
  212133. 0x5e8d1202,0x0e4f5ffd } },
  212134. /* 205 */
  212135. { { 0x0ff14c38,0xbd1c6444,0xaece11f2,0x9a5b59fa,0x22af6330,0xaa4605a7,
  212136. 0x82af24ee,0xddc9f65a,0xeb9a1159,0xf4ee4bfe,0x74e84eaf,0x2463d076,
  212137. 0x0e0baace,0x88cbe1e0,0xd5fabdcb,0x7ca568ea,0xc57eb99d,0xbd80d524,
  212138. 0xe9be9873,0x9c46572c,0x7300b85e,0x918a1dcd,0x40f54176,0x49221312,
  212139. 0xb5b14236,0xf7e324ff,0x2434f16a,0x40dda501,0xa133d97c,0x08833421,
  212140. 0x0876f020,0x33d41161 },
  212141. { 0x9878e5ec,0x7531a36b,0x46918232,0x5de3e321,0xd0a30464,0xd15f9a33,
  212142. 0xaa173659,0x734c1b87,0xf925d4fe,0xac2094a2,0xc262b0f4,0x43c965a1,
  212143. 0x447d5cbc,0x759c903e,0x05239300,0x92af215e,0x1f593f34,0xfffb6d5f,
  212144. 0xc3cddb5f,0x65943b4b,0xbfdd5408,0x9d03a29c,0x198d76c0,0x8f7cda6b,
  212145. 0xc0f27b59,0xc0790a22,0x8cb58ccf,0xba557a84,0x76c54fdc,0x5922052d,
  212146. 0x47b6b466,0x2d3de7aa } },
  212147. /* 206 */
  212148. { { 0x65add3b7,0xaade7462,0xabf24c2a,0xe5888f35,0xe1a57d93,0xd41549ca,
  212149. 0x2c76f7bf,0x0e22e18e,0xbe3202b3,0x67f288ea,0x1d1d0f0a,0xb79a66ba,
  212150. 0x2881ad18,0x0e0ab749,0xc7adb0e9,0x7d424086,0x2842132f,0x870c32c5,
  212151. 0x58f9a09e,0x858477f1,0xec025589,0x422a9372,0xa5098777,0xbe428c5c,
  212152. 0x57660058,0x45b79564,0x957f37cf,0x6c7fc631,0xd6316289,0x8b7023dd,
  212153. 0x5b1c12a6,0x47003bb6 },
  212154. { 0xc91c1c96,0xd99401c1,0x27a12970,0xaa5dcdf9,0xc3c29107,0x3ab92e17,
  212155. 0xa3fe4710,0x26fce8f7,0x4ee998ee,0xb0d09d5e,0x8e3a41f8,0xafa62204,
  212156. 0xa26ca506,0xb1c012a5,0x99b57252,0x2c6f734c,0x512f7fe1,0x1093d79f,
  212157. 0xacee19a6,0x2f30906e,0x056d1ea6,0x6bff8381,0xeff35f21,0x61c75856,
  212158. 0xc1ad2224,0x6e07e978,0x6b20fde8,0x2cca6ca1,0x633fe81b,0xab4d6d2d,
  212159. 0xb06a2ce6,0x73dff504 } },
  212160. /* 207 */
  212161. { { 0xd8e20fb8,0x8b615805,0x82b533f0,0x7c6873e4,0x56a854ca,0x5205f001,
  212162. 0xcb369211,0x87fec6ac,0xc7f092b7,0x1fa3c0ec,0xe845fe4c,0x5b36647e,
  212163. 0xf8b1f112,0xd4781e85,0x8b0f1a6f,0xc6526839,0xdcb8eb92,0xceeb8c6c,
  212164. 0x8e5f6d52,0x133f0ead,0xc8d934dc,0x31883e23,0x428ac45a,0x214ed5bd,
  212165. 0xdbbfca85,0xf77ca492,0x07e5ae13,0xdf4113fe,0x72ab05fb,0x63e4a0d2,
  212166. 0x7148f535,0x7544d0b7 },
  212167. { 0x80797ace,0x4fe8d134,0xaf86d97e,0x216d6aa0,0xef5a68fc,0xdbf0a688,
  212168. 0x9f9b2684,0x18b26f45,0x8999d2fc,0x52fefcfa,0x62423955,0xd5af8d82,
  212169. 0xf63a3780,0x8f123469,0xdcd4feaf,0x2933454f,0xa73b5d09,0xba8018b7,
  212170. 0xe5552c18,0x9af1f276,0xff26bb1c,0xc5d4773d,0x06dd4f44,0x9ef49410,
  212171. 0x5f39ba49,0xad8f12f9,0xf66ca4f2,0x5767f6dc,0x7922f59a,0xba8773f1,
  212172. 0xc1e42d49,0x220081ea } },
  212173. /* 208 */
  212174. { { 0xba37a0ba,0x3043d573,0xdd176df6,0x05a431bc,0xc42070f7,0x03322cfc,
  212175. 0x67c2d109,0x5cabd30e,0xcbf8bcfa,0x362c95de,0x7787b10b,0xd767d277,
  212176. 0x6ec05e64,0x612c915e,0xce69c30e,0x9e669631,0x682e2635,0x27c9dd8f,
  212177. 0x95ffcc38,0x79021f12,0x8a2adca2,0x06a8ee79,0x4b5d500a,0x8e00e784,
  212178. 0x8d80d6c5,0x87746fc7,0x915f10cc,0x246053be,0x219f6fd8,0x844e328b,
  212179. 0x11bd3733,0x620541ac },
  212180. { 0x509e5a29,0x0f7fd382,0xb432531e,0x8748d7d0,0xcd3883b9,0x8f749354,
  212181. 0x8bfbb17a,0xc6b8ac74,0x05f2d2c5,0xa4616a66,0x1bcb1b83,0xb3d96625,
  212182. 0x2fee265a,0xcf753104,0xdb225058,0xc70d73fb,0xf0c2d556,0x1211d434,
  212183. 0x54b259b3,0x862061d8,0xc42b3f7d,0xffe4606d,0xe86a4949,0x4c5c8585,
  212184. 0x160eedac,0x04ddcc8b,0x568e2420,0x1804ce67,0x42141656,0x91f3855a,
  212185. 0xf932be97,0x7f378198 } },
  212186. /* 209 */
  212187. { { 0xdfa6639a,0x9a374bda,0x02ab7391,0x0cbd48d4,0x47031e2d,0x5c5ef236,
  212188. 0xd0599d1f,0xb49ee2bc,0xe0d38443,0xd285eb60,0x269392e8,0xdbbea92f,
  212189. 0xb8bc538f,0x91455fbf,0xe469b768,0xae259ff1,0x41de5682,0xc1cecb1f,
  212190. 0x9952d1ae,0xc876f071,0xe7bf7446,0x1ce25181,0x282ad2f1,0xcb93ad86,
  212191. 0x6ba4ef67,0x8fa3cd31,0xe507aa3e,0xfce68a04,0xa61bb608,0xced74170,
  212192. 0xf6ac10d0,0x6de716b3 },
  212193. { 0x172d6dc5,0xd4e58d04,0x6397c65c,0xbed2cde6,0x0c9eb4e8,0x7ae77e18,
  212194. 0x75fa2edb,0x56275468,0xa91e6738,0x4b30324e,0x235c8b2e,0x6023a856,
  212195. 0xa8f92887,0x9df6d6c2,0xf6f5e8b5,0xec2c185f,0x3ad5748a,0x7892e12b,
  212196. 0xd54aefbc,0x7aebb4f2,0xee868821,0x14915448,0xb1d9bd5b,0xa26c5f71,
  212197. 0x2ff00df7,0xe5ccd166,0xb95b1dee,0xebc99f17,0x3fe1f774,0x90983616,
  212198. 0xbb3d25b0,0x51f90830 } },
  212199. /* 210 */
  212200. { { 0xf2922461,0x49376fa1,0x1650d0d1,0xdbb1b1c3,0x0dd8608d,0x92b91c33,
  212201. 0x36b89906,0x3e612c4b,0xdf560052,0xe1977b0b,0x636a2545,0xf8afff70,
  212202. 0x11723d8e,0xcda7d278,0x81bde7ba,0x0b0bc4bb,0xed2a578e,0x3cb080b2,
  212203. 0x171b2e02,0x5bda0d0d,0x941bb9ae,0xf6df38cf,0xc14a65c5,0x85dd81db,
  212204. 0xc19dd98e,0x7f98c82d,0x52206f93,0xc613747f,0x5f5bbe78,0x9e13a2c2,
  212205. 0x0aa34be7,0x5eed218e },
  212206. { 0x01d4dc0b,0xe1565754,0xf566bb07,0xa1ae5f27,0xb82225d5,0xe985ebeb,
  212207. 0x1189ec6b,0x5f3ad21c,0xecce4d9d,0x17da518c,0xd6b65b59,0xc84a2d3e,
  212208. 0x8ffa771c,0x7f988175,0x2ac69a7a,0x50d6ae12,0xc6e6846d,0xcb7f30b1,
  212209. 0x5bd0bb13,0x8c023a60,0xd73f2407,0x9a10fecd,0xe5f0a996,0x8c5158cc,
  212210. 0xbd8f5806,0xd26bf615,0x915a46e1,0xaf32ea87,0x0287d308,0xeaf74e81,
  212211. 0xa6264254,0x8c14ba06 } },
  212212. /* 211 */
  212213. { { 0xb17ee201,0x0c877895,0x88e57a77,0xc05aa471,0x97822456,0x19c3e763,
  212214. 0xc9c3ba1d,0x0be6f8c0,0xb4389ebe,0xfe85f4ff,0x0ce7fbb6,0x538bccce,
  212215. 0x65266c64,0x876eab2a,0xcf9a3842,0x5c9ac690,0xccc8f981,0x9f5cf3b1,
  212216. 0x9cf687de,0xfa17be6a,0x83835c15,0xfcfc10fc,0x150ef2eb,0x086b0fdb,
  212217. 0x884a52e6,0x9f97ecd9,0xb0cd1eb8,0x416e6fa2,0x3ecc03ba,0xe2bd1599,
  212218. 0xeabb165e,0x645c0a5d },
  212219. { 0x50aa7e31,0xd94c4205,0x2f851da5,0xaec8df0c,0x3c726e6a,0x99646909,
  212220. 0x2619bf9a,0x72dbdc36,0xe253fbd5,0x1b4260e0,0x8c709e06,0x97c259fb,
  212221. 0xcddaec5b,0xfabf7cbb,0xe4b703e9,0xb4d5e8b1,0x0734efdd,0x1b06e56e,
  212222. 0x1f55f8a5,0x02d4a4f9,0x3f565c8d,0x7f8608ba,0x816d1d94,0x822f47d2,
  212223. 0x5ce7b136,0x0cc36156,0x31d04242,0xe46ee5ef,0x683567f6,0xb2a65f70,
  212224. 0xd2fa6c91,0x27e9ff40 } },
  212225. /* 212 */
  212226. { { 0xd7e952e7,0x75251893,0xc735bf18,0x15b30583,0x96fe0491,0x732b5992,
  212227. 0x806d2fca,0x27451858,0x1b885ed9,0x71ab76a0,0x6d9f55ec,0xbdce9d97,
  212228. 0x48f2ba9c,0x3da60b20,0x592b132b,0x6977c086,0x099051d7,0xb6dca9cb,
  212229. 0xd188ae25,0xd9c2ab23,0xe20aaf3d,0x9f469f3f,0x5aad74d0,0xdbd1f7cf,
  212230. 0x22a9eb3b,0x3d5efe5c,0x137010c4,0x8c5edfa2,0x57870260,0xada2217b,
  212231. 0x3dac9776,0x4feee567 },
  212232. { 0xb5d3d780,0x30e18d52,0x07166744,0x4dadb5d3,0x5a742156,0x320d386e,
  212233. 0x8d6bbb86,0x5d8c290e,0x2d263dd1,0x981a4323,0x98984636,0x33d0e7ca,
  212234. 0xa519acb1,0x5138784d,0xdddc81ff,0x832e3fab,0x3199a43a,0xfc278594,
  212235. 0x32743163,0x5b4cabcf,0x74f94fa7,0x9fa010bd,0x5694a627,0xc28a743d,
  212236. 0xcb657a24,0xc1d2a888,0xe86a25ea,0x7eef2503,0x04c561ff,0xed11a5d3,
  212237. 0x9c9ede0e,0x4fe818e7 } },
  212238. /* 213 */
  212239. { { 0x7fc1c7ff,0x00252c9d,0x9fa89ad1,0xa9bd419d,0x4064e9cc,0xc93a124a,
  212240. 0x43942ecc,0x384cbcb8,0x8749695b,0x004c21fd,0x421165bf,0x69c81d9f,
  212241. 0xdde01102,0xe2325628,0x5a9b004d,0xec937457,0xf6dcfc21,0xfb3346bf,
  212242. 0x4d372c7d,0xac4da64b,0xf20494e2,0xcecb7ad3,0xe867c150,0x562c41b5,
  212243. 0xc2b723d8,0x299395ce,0x7ee53231,0xc91adfc5,0xf10b6597,0xe06f1161,
  212244. 0xb74d3ffc,0x81915529 },
  212245. { 0x6ed9d4ee,0x8ec12431,0x689aff01,0x3dffa154,0x2a89a3f4,0x4aba349f,
  212246. 0xd467efb2,0x2db1e8e2,0x039102e2,0x18dea354,0xe52f082b,0x422ab853,
  212247. 0xed36dd47,0x7130a2c1,0x0295d1ee,0xca60e86d,0x7c7f5ad3,0xe6ac6808,
  212248. 0xde864658,0x0f83cecf,0x461d1265,0x72e66c21,0xbd385099,0xfeef4150,
  212249. 0xa6632289,0x0f183f3a,0x792dc795,0x275454be,0x11367702,0x2744c11b,
  212250. 0xe8ea6ef3,0x7d06bcc7 } },
  212251. /* 214 */
  212252. { { 0x7090212f,0x89285942,0x5521e844,0x691b7d4c,0xbe2dbb92,0x4c038422,
  212253. 0xbd81f880,0x317721ed,0xac89bc36,0xc136cbee,0x7b8f004d,0x4f71b60b,
  212254. 0x4e218ab8,0x269132d0,0xe6cc814d,0xb0e2496e,0x75fadc15,0x0b2ce317,
  212255. 0x66d223c5,0x82e3c084,0x4c612f8b,0x9721caa6,0xa4b65355,0x59a751eb,
  212256. 0xc7d3d9d1,0x3433aad5,0xe80d4246,0x1e61b9d2,0xfc673caa,0x149f655f,
  212257. 0xd0f9cb92,0x48b52b99 },
  212258. { 0xefdc05be,0xa3915399,0x13e095e9,0xde70db18,0xcddb3fda,0x447862e9,
  212259. 0x1a009451,0xa2b03162,0x23920ea3,0x4b27980c,0xa23b8feb,0xac5394f1,
  212260. 0x3e5616d4,0x163f7256,0xb714219a,0xaa0ff93f,0x93d62474,0xd26f96d2,
  212261. 0x7dcfe276,0xdd212ea8,0x47038d15,0xab27bf2f,0xf418168e,0xe58c8325,
  212262. 0xb32a989a,0xe3704222,0xbfc9f13b,0xa3694390,0x0d0684ad,0xf16e2606,
  212263. 0x9d8c76ec,0x17c0de87 } },
  212264. /* 215 */
  212265. { { 0xdcc01958,0xbca5f453,0x1ce88393,0x7d945954,0x561f5b6d,0x5e6350a1,
  212266. 0x7e2d36bc,0x291c3c86,0xa5ac3a6c,0xf6c7ed84,0xd98006cd,0x7913c40b,
  212267. 0x5671ec3b,0xf78bb087,0xb43e89a9,0x1c928f6e,0xae1ea1ed,0xfdf28df3,
  212268. 0xb924b2b5,0x62bba5b1,0x1a116e05,0x491d2705,0x167ed3e3,0x08ec02b7,
  212269. 0x5bc0b046,0xe291cf7b,0x8c5d7f59,0x30e50169,0xf5c799b7,0x0c7c350d,
  212270. 0x0ac6e1d7,0x6862b9e2 },
  212271. { 0x9ffa1f64,0x56c6f4e7,0xa1e24349,0xfed6a91a,0xcdb75232,0xe9a0ee0c,
  212272. 0x0322d607,0xbfc90b37,0x462fef87,0x29480ad2,0xc2bfcf34,0xfc214969,
  212273. 0xa539e38f,0x6e5211e0,0x12a5149c,0x2a59ec26,0xd706b532,0x195fe212,
  212274. 0xe99c8429,0xf77fb108,0x5dc80482,0x74ceaea3,0xbd92d298,0xa5a6030b,
  212275. 0xaaea15ee,0xad42dca5,0x4987109c,0xd6ac3bc7,0x290af649,0xc64e1c40,
  212276. 0x51f8de6c,0x5093fa2d } },
  212277. /* 216 */
  212278. { { 0x4c2d553b,0xc4cf3280,0x3b966c29,0xdc1abe22,0x2296914a,0x556a549c,
  212279. 0x999976c9,0xd8c9f8b5,0x776e83f3,0xc22c57bd,0x7c85ec57,0x4f2942ab,
  212280. 0x6e2c61f5,0xef3407e5,0xf213db48,0xf005e8ca,0xf32698c7,0x470c853d,
  212281. 0xcac0a54b,0xe6f488d7,0x60b7501e,0xb6bd6bed,0x714a4bd9,0xf0103106,
  212282. 0x6e098894,0x5285bc3b,0xf5f92a00,0xec06741a,0xef7ef24a,0x32f16426,
  212283. 0x6c77a438,0x12f9c44d },
  212284. { 0x83313a1c,0x1951e964,0x33c58b37,0x98edd3da,0xc7ac4044,0x4edbbf52,
  212285. 0x0dcb5ee8,0x866ca6f7,0x6dd422f8,0xec0ae8f5,0x0661ec2e,0x1077bc54,
  212286. 0xd422523c,0x6d39913a,0x58e7cb3e,0xd105e1e8,0xc979bb45,0x47c9397f,
  212287. 0x0997b592,0x3221d4a9,0xe8952fe7,0x0ef628a3,0x4e946241,0xd08d5827,
  212288. 0x59780f40,0x64cbed0f,0x08e110ec,0x13d7c227,0x7679b1a3,0xd186d866,
  212289. 0x26ae1d18,0x02f75e4e } },
  212290. /* 217 */
  212291. { { 0x47f307d7,0x1b637ebf,0xd0141477,0x6b644a6a,0x2e05a80c,0x82a33d65,
  212292. 0xfed07b31,0xc8f1a0f3,0x3696e597,0xc09ee7f9,0xc7ffc01e,0xcdaa7ec3,
  212293. 0xf8f373b9,0x549f88fe,0xc3bb8989,0xc88d1961,0xdfcaa7b7,0xd92a4fe9,
  212294. 0x3ae4ab20,0x12ff9ee2,0xf5ecb1a5,0xf5aea641,0xe32fb47d,0xe769237f,
  212295. 0x25d085c0,0x96a5c420,0x26c755a2,0xdc912558,0x9bce9723,0x580b985f,
  212296. 0x63961941,0x72b1b566 },
  212297. { 0x790e5558,0x9d708a08,0x0689af80,0x98536041,0x42313b5f,0xe85e7b8a,
  212298. 0x55a49d1a,0xe6ba1292,0xac371b0b,0x5e76c4b0,0x938e6e19,0x58504f39,
  212299. 0x60ae9a21,0x8dd41422,0x968485ce,0xd8b04e9b,0x887efe43,0xf94c4ba5,
  212300. 0xf11c5e73,0x11268e67,0xcf6b99c4,0x92623e28,0x7a0a9662,0xf2d0aaa8,
  212301. 0x4ca02ed3,0xb266772a,0x2d63b551,0x68ee8e4e,0x2e78b5b5,0xcdebb299,
  212302. 0xe17225ad,0x5df19216 } },
  212303. /* 218 */
  212304. { { 0x8df2e7e3,0x20027e1e,0xd8da07de,0xb183cc68,0x4b4ae694,0xce35ba69,
  212305. 0x3ca62e88,0x896d97df,0x52efed2c,0x3de4713b,0x26bd084f,0xd006c40e,
  212306. 0xfc81923b,0x1e9b71bb,0x1aacc6b0,0x9991c7b6,0x8f656840,0x650c9364,
  212307. 0x87f47524,0x138561d1,0xbffd3ca2,0x610f2b11,0xfa191418,0x96915faf,
  212308. 0x955e5309,0x8f1236de,0xa1872d79,0x613cbeea,0x66a2a48b,0x7f7b44ea,
  212309. 0xe0a89c32,0x452265c2 },
  212310. { 0x25430010,0x4ad5ec79,0xebd090c0,0xcac786ff,0x20a9d3f5,0xa5f9f4ff,
  212311. 0xa3edc65f,0xfcbf4112,0x0cf3eb11,0x8824839c,0x8aa5b700,0xb8dd6d4e,
  212312. 0xb7568ab8,0xe2271dfd,0xb744560e,0xe43ec373,0x1cf75296,0x78eaf926,
  212313. 0x3fa96d9b,0x1809ae0e,0xdc25dfd5,0x0b312d2d,0x6bab7711,0x6b8f78b4,
  212314. 0xb5ecf1e4,0x069efc8d,0x609fecaa,0xc1952bae,0x5f4dbde1,0x43e302ed,
  212315. 0x1e078555,0x14b02bf9 } },
  212316. /* 219 */
  212317. { { 0xb87e5b57,0x2c71c768,0xf531a557,0x0bcc78f7,0xf7597dc8,0x4ff93f8b,
  212318. 0x139e175f,0xb28e026d,0xcb94ca6c,0x6b83b727,0x0079f7fc,0x2eafe3b2,
  212319. 0xcf3bd170,0x2aca54de,0x6af0dc6c,0x17c4133c,0xccf5e35e,0xbea1e665,
  212320. 0x345505c6,0xa6691a48,0xe6100b89,0x2633abd0,0xc17d0388,0x966c6706,
  212321. 0x1a0cf90c,0x7aefffbe,0xd0add64c,0x4d847be7,0xaea2aa46,0xd49bcdfb,
  212322. 0x2cc7d0a5,0x85e07e74 },
  212323. { 0x0bc25bca,0x23aae0a6,0xe44f64ec,0x6e8e55f1,0xb607b773,0xe1e696d8,
  212324. 0xd3005909,0xaa90a746,0x2cbc4990,0x072b1ccd,0xc68e2f5d,0x0d0fe6c6,
  212325. 0x53e28ec9,0x920ec5f0,0xf0040cc1,0x79b21fb4,0xfcc4a2c7,0xa7375bd3,
  212326. 0xe1bac7dd,0xf5f5def9,0x35c0f8d3,0xdc315d79,0x2cacd318,0x7117c170,
  212327. 0xe926f71c,0x6f2823c4,0xed02f39a,0x38db58bb,0x7db69323,0xe5b49231,
  212328. 0x8d49f430,0x0964039f } },
  212329. /* 220 */
  212330. { { 0x56999eba,0x21774f16,0xb1de6305,0x3d8ee287,0xde0b2669,0xd81af726,
  212331. 0x3f8942a1,0x37446939,0xea03e13c,0xbcf6b615,0x94e273cf,0xd30c0c35,
  212332. 0xc6725c56,0x4fd33a56,0xa8be97a2,0xa57534ad,0x7c22a251,0x799242a6,
  212333. 0x9d0c5c49,0x4e51bdb5,0xc6a42768,0xd7cd76cc,0xd426bf59,0x914097ac,
  212334. 0x66e9beb2,0x59404a2c,0x5c96e3e9,0x4738fe98,0xaad666d0,0xbcbb3e0e,
  212335. 0x63bc5e56,0x626b0fd2 },
  212336. { 0xe1a1ec42,0x47217dba,0xab5acc50,0xaa6ae7db,0x865331d1,0xb7e1ab1e,
  212337. 0x3d30126f,0xb8453070,0xdee61851,0x280649e0,0xea689544,0x8806f4a3,
  212338. 0xcb56f632,0x4bbe43ad,0xbcaff94f,0x036b9bda,0xbd0637be,0x0d941e65,
  212339. 0x686f3abb,0x82179d44,0xaad6afd6,0x1486912c,0xff7e1534,0x9a3b891e,
  212340. 0xeb86fd96,0x88c426ce,0x117928c3,0xb56e6a81,0x96399e00,0x933e7135,
  212341. 0xa17b6ac1,0x09bbddd9 } },
  212342. /* 221 */
  212343. { { 0xe4fd3673,0x75e39c1d,0xa65c8e07,0xf880d9d1,0x7289c7fe,0x4725c1dc,
  212344. 0x3529d200,0x5b6735ee,0x3c747af3,0xc1f8f2ed,0x912efdf5,0x5cf3998f,
  212345. 0x49859c39,0xed722618,0x0e69795d,0x23793a2f,0x86b1d2a7,0x8a6ab8d6,
  212346. 0x22a882e4,0x00c815de,0xf9db8d7e,0xbe77d6fc,0x02267547,0x0886fb32,
  212347. 0x49c10edc,0xb62687d4,0x7c83ed4c,0x9f1c3e17,0x5af366ea,0xe6d5d7f0,
  212348. 0xd1efad24,0x2eaa01b8 },
  212349. { 0x1f357c74,0x5e47fb70,0xa9e3b794,0x93085c4a,0x6e85a905,0x4f098733,
  212350. 0xbe0244c9,0xf53808ff,0xa3b5660d,0x91dddf93,0xf3b95ed6,0x8b76377b,
  212351. 0xbb3920d4,0x91b911b7,0x86a13cf3,0x7ccf08bf,0xea018e58,0x53ed8f97,
  212352. 0x78c55194,0xb1ea4343,0xe0d2d5a6,0x8e6adde9,0x9b96259a,0xfc2b248f,
  212353. 0xeef17ddd,0x96ebceae,0x557f9c85,0xf694b443,0x07d5bba8,0x48cd150f,
  212354. 0xb4c1986b,0x02d31de9 } },
  212355. /* 222 */
  212356. { { 0xde79499d,0xa6bb9e1e,0xfd0fc2ad,0xf6ca8ff8,0x1a7d9356,0xbec0f8e8,
  212357. 0xe8f06327,0xbc3d1c9f,0x3b300beb,0x805c7217,0x413c181b,0x00420a08,
  212358. 0xf0ca9d01,0x9e9a167e,0x1aeeddd6,0x076c909d,0x8e3a8a72,0x64a1997f,
  212359. 0xa77b429e,0x3ce7f7a7,0x5c94d3e9,0xaac0fbf4,0xe6d48407,0xf37694a7,
  212360. 0xa91921e7,0xf56679e2,0xee1dbbd6,0xf23fe0f3,0xcbf9fa99,0xc7917566,
  212361. 0xe0f4d765,0x965860f2 },
  212362. { 0x7fa5f79c,0xe734702b,0x5af2d26d,0x930bd426,0x6c73e0ce,0x45bd8b98,
  212363. 0x4ee44a2d,0x7dbe7bed,0x956c8a1a,0xc129e024,0x77cdf80e,0x6fdc05ac,
  212364. 0x589ca59b,0x70a6ba2b,0x999825af,0xfc484021,0x7a23f0b6,0x1d284b54,
  212365. 0x28a0a8af,0xb1da10a4,0x2b2af6d8,0xb1eb1b31,0x33935ee3,0xf051443a,
  212366. 0x8effa6ec,0x7a07eb26,0xd662654c,0x16ee4086,0x4549ee4c,0x7a7bc501,
  212367. 0x1fa98a52,0x65081032 } },
  212368. /* 223 */
  212369. { { 0xb67ed9b2,0x49f0e460,0xc36d93d2,0x0cda0fd0,0x88c75e1c,0xbb5963e9,
  212370. 0x614bc0c9,0x757bbe93,0x9a768605,0x9a9b8801,0x48edc544,0xa8b7e2af,
  212371. 0xb51a5985,0x9e77ed9e,0xebbf024c,0xdd025274,0x1545c636,0x598b6288,
  212372. 0x4800dba0,0x39bdaed0,0x81e2a23a,0x7fc20139,0x550cb4f2,0xdc66fd5c,
  212373. 0xb52068c7,0xad27032f,0x8169fa15,0xc9a0bcae,0x3a7ca8a2,0x60606f21,
  212374. 0x9862652f,0x98295046 },
  212375. { 0x2e11c128,0x3e374600,0x0e6dca7e,0x80dfae5d,0xd9552264,0xe44016e2,
  212376. 0x880b7143,0xf65f88f2,0x526b881c,0xca3d28d4,0xdfb86afe,0xf9c59dd1,
  212377. 0x4c74f958,0x548860c2,0x9cb69f4f,0xd06ea43c,0x7334ecec,0x5343c9ae,
  212378. 0x35329713,0x5cc2ccd6,0x5f3a6c0c,0xa95ff403,0xb372653b,0x2e01a1cc,
  212379. 0xa250523d,0x31510fdf,0xa6227eb2,0xeee538e2,0xca23cd10,0xeadfc8a0,
  212380. 0x3e78f54b,0x4b7e6e1b } },
  212381. /* 224 */
  212382. { { 0xdb5f928b,0x79c9076f,0xb7347cec,0xe6250bb6,0xac00ec41,0x54b67798,
  212383. 0x9d9619c7,0x900d20ba,0x59e4343f,0xed42c0d0,0x451935d7,0x3df39e85,
  212384. 0x64f701ce,0x26391182,0xe1f87aac,0xce8f2554,0x65f91aaa,0xfddd6789,
  212385. 0xa324539f,0x96cd163f,0x4bace995,0x5c815f2c,0xa94f9ea5,0xd78c8c2a,
  212386. 0xef24e455,0x7ab2aff4,0x1cddc26a,0xf0ed6409,0x00ca2822,0x954a420b,
  212387. 0xd3297658,0x0611c4c5 },
  212388. { 0xa9e81829,0xf192001c,0x08a282cc,0xded33320,0x8f9ded9b,0x0bfd7de1,
  212389. 0xb7889003,0x6793ac0d,0x3577a5dd,0xbb00d91d,0x802d3c2b,0xe17a23a7,
  212390. 0xfb549014,0xff95f88c,0xc71b6e07,0x7cd1bf4b,0x23588c8b,0x2e3b24a0,
  212391. 0xa4112076,0x9b5335b8,0xc4056d30,0x2481c05e,0xe916a1b5,0x55c7410c,
  212392. 0x850179f4,0xbbe03271,0xb3cd1208,0x15e6c177,0x90cbfe50,0x509a24c0,
  212393. 0x1c108566,0x82079529 } },
  212394. /* 225 */
  212395. { { 0x1c7d353e,0x5d2d3cff,0x7de0ce3b,0xd5e7eccd,0x6ca87635,0xb4b1075f,
  212396. 0x25f9ad3e,0xda8404e0,0x205cb5ae,0x6b963e89,0x09f221a1,0x9e5ee0d8,
  212397. 0xea41aca4,0xd64c85d9,0x34442a34,0x6a46c4e9,0x3cf655a4,0xac6ff97e,
  212398. 0xe5417d7c,0x76565c1e,0xeebf9c4c,0x681009a9,0x88da6388,0x95b61d39,
  212399. 0xf6b472c6,0x6402b46a,0x0b7f1171,0x1fde5165,0xbe0c05e3,0x94f8f273,
  212400. 0xa88344a7,0x7487b036 },
  212401. { 0x9c3e2370,0xa860e575,0xf8048719,0x19d58193,0xa6e2f9aa,0x3a0dbf3c,
  212402. 0x6144719b,0xb6c7e959,0xdeffec21,0xa9049c74,0x3f50cebf,0x8ba064b2,
  212403. 0x49a1de15,0xb12822c0,0xb1d527f2,0xb654b7d9,0x0ffd0430,0xc470859d,
  212404. 0x4f05446b,0x37c74a67,0xa3add995,0xe553251b,0xe33533b5,0x4a3ed6cb,
  212405. 0x27e419ce,0x2f2f44d0,0xa5d1b979,0x2d84ee82,0xdb6fa69f,0xcc76b123,
  212406. 0x21fa3bdd,0x834f85c5 } },
  212407. /* 226 */
  212408. { { 0x2ce9b31a,0x329347c1,0xfe3fb3b7,0x1d88522a,0x52ff90fd,0x4bcefb4d,
  212409. 0x2b1a081d,0x53b17386,0x2a411f08,0x538c11ba,0x141b603a,0x7895b93c,
  212410. 0xb10bd741,0x2993b9aa,0x09912986,0xccbbd046,0xeea0aba5,0x669fafb0,
  212411. 0x35661897,0xd4844622,0x367ffa54,0x4a63b89c,0x1c3478da,0xcbad5d1d,
  212412. 0xaa6034f7,0xc5339227,0xe61b1391,0x0e6d705f,0xf74ff515,0xdd14b660,
  212413. 0x5332b54c,0x639d8b0a },
  212414. { 0x162217cd,0xfa423162,0x811c28e6,0x2e0e4a2a,0x21766dc0,0x68d9ce18,
  212415. 0x046a06ef,0x51263739,0xdde92101,0x44eea231,0x114298d3,0x0607c8f2,
  212416. 0x63d957e9,0x27f272ba,0xa5e8cae1,0xe7ce80cc,0x24f7a63f,0x5816ebe2,
  212417. 0x89673e34,0x4dece5a7,0x536babd4,0x13756a22,0xe3bf77af,0x644d61ae,
  212418. 0x2bcf98bc,0x60b2bf6e,0x29fa962c,0x3b0b59f3,0xabb50023,0xb0769a1a,
  212419. 0x0c75402c,0x40903136 } },
  212420. /* 227 */
  212421. { { 0x1670433f,0x84d2873a,0x25493dfc,0xc9394df6,0x80fcf89e,0xeb05a19a,
  212422. 0xdb297616,0xe39e4310,0xd9e63046,0x50742dc9,0x1de9ca9e,0xf31ad8c8,
  212423. 0xfb7b1d0d,0x86aabf94,0x1b3c82d1,0x36cda27a,0x39702d84,0xfb1a2ef4,
  212424. 0x46081299,0x280bfddc,0xd2396238,0xe4b2b48d,0x7b3c9353,0x2db2c2f3,
  212425. 0x12fb8a69,0xd5b5b317,0x08180474,0xf9b87a3b,0x1e952578,0xd8590986,
  212426. 0xf37a2bc8,0x80668eed },
  212427. { 0xb39a0249,0xe2edcd35,0xb2f8aeae,0xaf230cd4,0x7223df05,0x295b15e4,
  212428. 0xe0e937f4,0xbb66982a,0x8cbc9162,0x019d2b72,0xcf49dca1,0x5c512ae9,
  212429. 0x630f07b4,0x11b491a7,0xa03874e9,0x48d4f34c,0x44cb7433,0xc1fd0ea6,
  212430. 0xf95b30c3,0x13f79ae1,0xed8b60ac,0x40362d4d,0x61ead81c,0x9e8314ff,
  212431. 0x498c3d28,0xed600dd4,0xc2521702,0x5fcb1c19,0x3a9c1f33,0x592329fc,
  212432. 0x1bde6ce9,0x04677548 } },
  212433. /* 228 */
  212434. { { 0x39233c96,0xee3de56e,0x80737eaf,0x868c409c,0x201abc68,0xacae11bd,
  212435. 0x2b486205,0x0f2cea9b,0x6f19056c,0xe32387e1,0xa5dc2a41,0xea75365a,
  212436. 0x12b4be86,0x76c29acc,0x8d63294d,0xa01fcab7,0x0cab9f24,0x81dbe88b,
  212437. 0xf414c054,0x76646e5b,0xcb96b7aa,0xfe111893,0x7664e097,0xb649f5b1,
  212438. 0x53fcf5a9,0xa196422e,0x0b7ff634,0x5978c9bd,0x3c229895,0xb5feb38e,
  212439. 0x0833c456,0x038a49fb },
  212440. { 0x13e93257,0x35e3818c,0xa612741b,0x14cebc9d,0x7caac06b,0x4f6e9249,
  212441. 0x3daa1116,0x82278e33,0x4de2034a,0xe7cc565e,0x0a1ba630,0xbb7dc95f,
  212442. 0x66956fbd,0x81dd9f23,0xbb132dd6,0xc63e6319,0xfc241337,0x6e22b022,
  212443. 0x7e8beb1c,0x23848193,0xd8c938ac,0x83b1994d,0xa6bb5644,0xb54cfaca,
  212444. 0x06f91807,0x1a7cd44e,0xa8f8d9f3,0x1dd439bb,0x7f74a8e6,0x660c2a78,
  212445. 0x121b5660,0x4bb76e22 } },
  212446. /* 229 */
  212447. { { 0xe6354817,0x7a151e8a,0xf038b438,0x33d494ea,0x85958986,0x4c86c688,
  212448. 0x1dcbac12,0x72153827,0xc0edad06,0xf487af8c,0xe500e5d6,0xad33051f,
  212449. 0xd6e47f55,0x0a711b1b,0x8c746ad5,0xa68709a7,0x6402f35e,0x27f17262,
  212450. 0xfb30c130,0xc6d08efa,0xc06c7497,0x9ef1c041,0xdcc3e2da,0xd0c74ece,
  212451. 0x092e1073,0x30c5f96e,0x2aa12b74,0x0f1393cf,0x2107eb02,0x24584016,
  212452. 0x7b76f98b,0x8843d25f },
  212453. { 0xedb2a83e,0x4e1501dc,0x2bb8d724,0xbcfe8fb0,0xd925df62,0x09020659,
  212454. 0x42ab6fc3,0x3c715dcf,0xa0f09dfd,0x73c05055,0xe3590aea,0x126745d8,
  212455. 0x76ff749e,0x5382f4d8,0xa920c663,0xfc69feef,0x9fd711ca,0xde160211,
  212456. 0x9075c4d5,0x4219c3bd,0x3ded6bf2,0x3800cbd1,0x6263a116,0x8c7ea0eb,
  212457. 0x7d264c37,0x35bd7958,0x7159c98c,0x56e22e45,0xfa7373b5,0x71bf2a2d,
  212458. 0x8935c949,0x0503f939 } },
  212459. /* 230 */
  212460. { { 0x71dad4f6,0x65addc66,0x024bea1b,0x238e4889,0xf605d3dd,0xfb76c8e2,
  212461. 0xb0d96b89,0x13d5f5de,0x6601b2cb,0xe0b5ba35,0x83e3d254,0xe37d491d,
  212462. 0x240c8ea7,0xe8860423,0xe91c99ba,0x374182f3,0xa87ad919,0x26c2caf9,
  212463. 0xf574f295,0x4b13040a,0x944000a3,0x5b9bced1,0x06df42e7,0x4ccc57be,
  212464. 0x4bd1089d,0x22e8ec50,0xdddbb500,0x0c53177a,0x9ecfeadb,0x690d31d2,
  212465. 0x176668f9,0x735778fe },
  212466. { 0x843c1137,0x0f86ee3e,0x3f0b73cd,0x3c1c42fa,0x8ab20e3a,0x0e75679d,
  212467. 0x16242fae,0x6f95f1f4,0x39b092e4,0x7b88e11c,0x4c236ac0,0x1629403e,
  212468. 0x2dac02e6,0x66105f41,0x862e0632,0x74dc28a7,0xf3b23c8d,0x2118ffb2,
  212469. 0x0745ffbf,0x1182417c,0x4c05711e,0x49b55a04,0xcefbe4de,0x2c665b74,
  212470. 0x97bf7107,0x1cc4c01d,0xc54f0676,0xb2ca06da,0x7450d0f8,0xfc599daa,
  212471. 0x1a3182a1,0x52e637a6 } },
  212472. /* 231 */
  212473. { { 0x6bebc6db,0x481700f1,0xf9503d92,0x4a6b45db,0x5d153919,0xc715cd3c,
  212474. 0xe5ad2abc,0x942a1c05,0xab7b466f,0x36a82433,0xba13918b,0xba413bed,
  212475. 0x90f4e6ce,0x698a5624,0xf3f1f3ca,0xbb720da6,0x63471ab3,0x2116d41d,
  212476. 0x303d3609,0xe00d2227,0x463ba69e,0x7fd4cc00,0x62845fd1,0xac609e4d,
  212477. 0x80adc9c7,0x63603b2c,0x45fafbca,0xbf16fc9a,0xc4bc94ab,0x41007f7f,
  212478. 0xa74b1698,0x7c916b4f },
  212479. { 0x78bac2d4,0xc1026f91,0x2601a875,0x8a2e8098,0x0073d640,0xad2f276e,
  212480. 0xfcc1fb88,0x443610c4,0xca6b291f,0x5727b822,0x88ec60fc,0x0645532c,
  212481. 0xed9ad48b,0x51e48899,0xf543f103,0x841b48b5,0xd591ceeb,0xa6ccb1be,
  212482. 0x9dcf5a8b,0xfc4adf0f,0xb347ddb4,0x3a7ca020,0xcb44c521,0xaa1accc2,
  212483. 0x0527c0c4,0x773b6828,0x7023cf50,0xaa374c10,0x6b74c926,0x733d1000,
  212484. 0x77a8d07c,0x1ff3916f } },
  212485. /* 232 */
  212486. { { 0xf997939d,0xaa218fe4,0x791583b3,0x3d4dfbbb,0x87f7560b,0xb3a7b5da,
  212487. 0x5da92c98,0xa9c02801,0x46666f4a,0xe1eb4aad,0x14ce9dd7,0x2eb17a51,
  212488. 0xef8f3076,0xf46a66a4,0x810e546e,0x900b45c6,0x4baf04dd,0xf7af2258,
  212489. 0x5c84d42f,0x3cc1c872,0x8e4c83de,0x3093f225,0x170d88b2,0x62fade41,
  212490. 0xac076e44,0xe19612e4,0x32dd141b,0xf48d7346,0x925e34da,0xc1b1f759,
  212491. 0x072b90c9,0x19ed1a56 },
  212492. { 0x6c735473,0x9cf7fcde,0x6003bc3e,0xaab88e67,0xfb199bb8,0x12187cbc,
  212493. 0x9accccbd,0xbb730441,0xb0f65459,0x214aff3c,0x6f926282,0x6aec81a3,
  212494. 0x9f9d20b8,0xaa82cb32,0x5773cc90,0x82f3f90f,0xf62257e1,0x4af60e6b,
  212495. 0xbd4762df,0xf18b44bf,0xdb970753,0x3948b129,0x7c22c18e,0xc6e920e9,
  212496. 0x57be97ad,0x393d6208,0x46b637f9,0xe8d7382c,0xf1fed1d5,0xf6625ccb,
  212497. 0x68681599,0x6f31e0f9 } },
  212498. /* 233 */
  212499. { { 0x82b8f204,0xc45afe55,0xd358b54a,0xac0441b6,0xacd5f5ed,0x7213e7bf,
  212500. 0x139bcd93,0x1914c70b,0x96dbcbb0,0x714b4581,0x1ed35d21,0xe9297d35,
  212501. 0x6a3e1f20,0x8f640837,0x2f3cd705,0x150a8a9d,0xdcdd9f6d,0xfb36e801,
  212502. 0x5cf56d82,0x5a54eb65,0x92aa5a21,0x7610500c,0x3b089f03,0xd10d0ae2,
  212503. 0xc42b66e8,0x491b2079,0x0eee8d48,0x4af1ae3d,0x41556f45,0x137e4c28,
  212504. 0x63d8a7e6,0x875e3308 },
  212505. { 0xaf6c0acc,0xdc80fddc,0xbb1e7c08,0xd5ad1e66,0x828585ad,0xdc717ae1,
  212506. 0x275c7da6,0xbdc54340,0xd26b9e15,0xf4b4c852,0x6a05fa50,0x5f0a1fbf,
  212507. 0x817bcb32,0xc6f81e47,0x70ff2e1d,0x2cbd4328,0x67c7f7fc,0x8a249016,
  212508. 0xb585a6c4,0xd045acb7,0x4666c057,0x2e972ad4,0xe6d7d63d,0xc74d87cf,
  212509. 0x0e274144,0xf7067d87,0x8b2584ae,0xb2ca157a,0x75f0fdeb,0x495c5bfb,
  212510. 0xf386e009,0x5abb0581 } },
  212511. /* 234 */
  212512. { { 0xf0c97f57,0x8be62d2b,0x962f28c7,0x0fe04871,0x47b50abb,0xc548a467,
  212513. 0x44fa09ed,0xf6b26e03,0xab05a96e,0xfd44c6e3,0x70e6ae82,0xedb0032c,
  212514. 0xd7e4899d,0x28bd402b,0x9b7c11c2,0x43f2e963,0xce913716,0x0ec3fc0e,
  212515. 0x02fd0f8c,0x769b8bc9,0x7cabc3ac,0x9d9cb3aa,0x06924cc9,0xe88a8892,
  212516. 0x42609014,0xa51461aa,0x962e79e0,0xc7f4aa8b,0x8b1b3e80,0x4ef0210a,
  212517. 0x1bfee4bc,0x70544680 },
  212518. { 0x121901c1,0xfab3d713,0xfead54aa,0xe90a2627,0xbc08ba23,0x64f6d285,
  212519. 0x36ec227e,0x8d993015,0x06c191ab,0x99a16ab9,0xf649ce2c,0x86b1cf5b,
  212520. 0x66be3a80,0x59206759,0xccba2cf0,0x18836279,0xeff53486,0x2c157b87,
  212521. 0x4b223af2,0xbfac9896,0x0aae7a57,0xcd0fd4f0,0x63218a80,0xdaddb940,
  212522. 0xdf88f14e,0x3844bb79,0xb71ed9fd,0xc1b3e3d4,0xd6205036,0x6c634a13,
  212523. 0xb8680a6b,0x6f56aecf } },
  212524. /* 235 */
  212525. { { 0xd9205c5d,0xb01dc803,0x67123929,0x68955f7d,0x9d9b6565,0x3debbffd,
  212526. 0xd3b1acfe,0xb844395e,0x6094eeff,0x04328b21,0x22991feb,0x6631ffa8,
  212527. 0x190dd075,0x0dde66e6,0xe8577c05,0x75b03c55,0x91722407,0x6c91ce5f,
  212528. 0x8ebb3a3f,0x9a288a40,0x058a1396,0x1d376f8a,0x9a6e0676,0xf3a59457,
  212529. 0x7b71d288,0x103029c5,0xb44c30c0,0x0843f428,0x730e0b9c,0xd8e6aff8,
  212530. 0x4ed644ad,0x7b6be811 },
  212531. { 0x3d3aa54e,0x3ec38e4a,0xd83d509a,0x10233943,0x243955e2,0xf84aa621,
  212532. 0xf51d3d44,0x29104717,0x7eca4e37,0x62d2442c,0x85fa55de,0x8c5a523d,
  212533. 0x851da1b5,0xc6f5ccda,0x20001468,0x044bcaa8,0xe01702e0,0xf7501e68,
  212534. 0xe6a0acec,0xf0819359,0xac0ef0b2,0x33dda6ad,0xfd964f01,0x97aeedc8,
  212535. 0x530b90d8,0x48dacd0e,0xb84122eb,0x4c5fad6f,0xd700a1de,0x2284ec1e,
  212536. 0xdbca5474,0x86f9a835 } },
  212537. /* 236 */
  212538. { { 0x450cc69f,0x0e1d9055,0xc9edf98f,0x50eb14bc,0xee7eba01,0x1bb94e77,
  212539. 0x998f8e53,0x5f7a6737,0x1b16eef0,0x588384e3,0xd85c5e15,0xbb928723,
  212540. 0xcbd952aa,0xfe51e345,0x7e241674,0xc5d0ee28,0x100182f0,0xfdc146ef,
  212541. 0xe7f5be2c,0x0f739e92,0xb656bd3e,0x501ab3af,0x5168e289,0xb1552dde,
  212542. 0xb8ee104a,0x940dfe31,0xc4304475,0x42923603,0xc460a913,0x9306f114,
  212543. 0x03b51f86,0x5bfa9faf },
  212544. { 0x107b258e,0x2a23f52c,0xd66341dc,0x989e82bb,0x823cff1a,0x54a3ced8,
  212545. 0x719b491f,0xf45b7794,0x2433dfb8,0x898c2218,0xc49250ee,0x0f9dd91c,
  212546. 0x4fa17655,0x50c2a2ae,0x2c327f45,0xf7aa1ce4,0x583b1e41,0x13a15ad6,
  212547. 0xa1bfad9e,0x9aa0d5a5,0x8e1fbdcd,0x9b1caa28,0x915f7f87,0xaf9283b6,
  212548. 0x87e81a1e,0xc10e4e0c,0x1080d296,0x04fdca56,0x12755bd8,0x6acc9616,
  212549. 0x828feeda,0x1b1266aa } },
  212550. /* 237 */
  212551. { { 0x774ee49c,0x4ebc0a00,0xcb6237d7,0x776f6852,0x5df938a3,0xfc0544ac,
  212552. 0xb6fbfbbd,0xc3388ec8,0x745f2eae,0x84ac8bcd,0xb1ece937,0xa9c56609,
  212553. 0x7de8fa13,0x656fb6ac,0xa532b871,0x5f8ded74,0xaa889f09,0xab0d428b,
  212554. 0x10b7aec2,0x43b27f28,0xfeecb34c,0x26426e1e,0x9e89c2db,0x44431b6b,
  212555. 0x39211090,0xaac4bc5d,0x4fd81058,0x926f7368,0x471ef60e,0x452fa691,
  212556. 0x218d7a23,0x33517fdb },
  212557. { 0x593c4a36,0xa9c33f46,0x36b1a9ee,0xac69d718,0x4277beec,0x55a20c1d,
  212558. 0x7e4f179c,0x3e8ca24e,0xd46d88a2,0x57373369,0x730702f8,0x71ceb1cc,
  212559. 0x35eed574,0x8b184d97,0x0704cec2,0x7f4517a2,0xd7062a53,0x7f129d18,
  212560. 0xb1d77e1c,0x07a4571b,0x8350d8b2,0x774ac309,0x61fab8ef,0x27b2919f,
  212561. 0xb5dd801b,0xa7c4cc13,0x1434591f,0xe7e6255b,0x5a3592b3,0x349937b8,
  212562. 0x30c77549,0x31fac63d } },
  212563. /* 238 */
  212564. { { 0x04913fb6,0x2ee8cf1b,0x1769a6b3,0x7e401350,0x783e61f0,0x790ebb71,
  212565. 0xe27f2ffe,0x1e5107f9,0xedaf89bf,0x124ba67f,0xe58de68d,0x189200e1,
  212566. 0x6df5abee,0x962732a3,0xacbeb4aa,0x72cc37cf,0xe93c5a76,0xb0c5fa96,
  212567. 0xde63393b,0x4c2a317c,0x830b2d6c,0x97f65e67,0x1be5b96a,0x4afc3504,
  212568. 0x730ce66d,0x0bf40a60,0x9340d84f,0x96a1ba79,0x07626b08,0x3ee18254,
  212569. 0x7ab0cbf5,0x01db35db },
  212570. { 0xac0efee2,0x6e0fbc2d,0xd71dbb45,0x8406ebcd,0x19b69abe,0xe72bde3e,
  212571. 0x37e01822,0x49cb7e61,0x11458b4c,0xcbb8c01c,0x687c5d63,0x420b4847,
  212572. 0x454c6776,0x1847dfa1,0xd1839d18,0xbede911d,0x278df046,0x1b9dc9c9,
  212573. 0x881a336c,0x294bd62b,0x93e77adc,0x7f096879,0x43ce3ba7,0x7ac90665,
  212574. 0x7764eefc,0x148695fd,0x9ac465cf,0xe0c20f0b,0xa6e2cdb1,0x636e8d28,
  212575. 0xd755341d,0x7b6ba98c } },
  212576. /* 239 */
  212577. { { 0xc1881ab4,0xcb1d9e03,0xb3168c88,0x19c25d55,0x282364ce,0xa82d3d47,
  212578. 0xf161aa24,0x95994390,0xe1ebb2c9,0x7838bc00,0xbdec7a75,0x8fd5dfcc,
  212579. 0x4ff7220a,0x4dd203c2,0x0efeff48,0x5ec173b3,0x16428b35,0x99f1d2b3,
  212580. 0x056e813f,0xc06bd9e5,0xc0b319f1,0x929172ba,0xfd223b15,0x6ae0e384,
  212581. 0x98d091ed,0xbd01059e,0xa654648e,0x6b3168e4,0x3375e798,0x2211447f,
  212582. 0x71eb4508,0x47e81019 },
  212583. { 0xbc8c290d,0x7045d45a,0x810fb33a,0xa33d1355,0x46fbbf2f,0x2baf0092,
  212584. 0x385c7cd9,0xacff3f1b,0xe161985c,0xc5b150ec,0x2a888748,0xc6ee0a7f,
  212585. 0x5e88dcc8,0x9d888c8e,0xccb86443,0x4dd735f2,0x3c40f6f2,0xcc1e13b7,
  212586. 0xf3fed691,0xfc3a25ff,0x257ee5c7,0x4cb43b17,0xf32db135,0xaa654f93,
  212587. 0x02dff2d3,0x44f58d0a,0xa8ca6394,0x78e3f188,0xf3e86697,0x39646cce,
  212588. 0xe0dce87b,0x785b1902 } },
  212589. /* 240 */
  212590. { { 0xa92f9a20,0xfcce2361,0x9d64540e,0xb7bdca87,0x1d00d7c5,0xd4739a85,
  212591. 0x2e97c926,0x067ac8dc,0x78da6a8b,0x2aea3ffe,0x63c51b69,0x6828bf54,
  212592. 0x7155141a,0x76f1c479,0x3977d810,0xf4bcbef6,0x541bce7a,0x75bc4949,
  212593. 0xd17041a5,0xe01f4066,0x87755eaf,0xd282d5bd,0x59e7ae80,0x6e2107dd,
  212594. 0x382ab36f,0xaa56e166,0xb9d1d634,0x65ee8ef6,0xce4ed844,0x99a2160a,
  212595. 0xb7712c27,0x6557c367 },
  212596. { 0xd75b6e52,0x561b0268,0x118d0e89,0xb0813640,0x6a2eb1ae,0xcff53330,
  212597. 0x6d090894,0x4e462226,0xb5fc1d48,0xbb351227,0x57a3062d,0x9365ea07,
  212598. 0xd66e2dc5,0x4caca37b,0xb9095887,0x220d7d23,0x8c4473bf,0x9c0fd393,
  212599. 0x6787da4f,0xadff370a,0xd057f4b8,0xef0aebcc,0x1173f33a,0x205e744c,
  212600. 0x925a26b4,0xb8d1f0a5,0x722fbbfd,0xa9364f49,0x8227d284,0xc891ae77,
  212601. 0xa0e08ab4,0x15c40d04 } },
  212602. /* 241 */
  212603. { { 0x2a0e18d1,0x9baf169a,0x4c0327c2,0x9971c017,0x7bc262ce,0xd81a323f,
  212604. 0x818ff379,0x2099db8d,0x4cd3c330,0x663f663d,0x011a0553,0xef5325c3,
  212605. 0xf980a470,0x9cd70bdc,0x1c9ed070,0xe64452d1,0xac676e13,0xafbf43f4,
  212606. 0xae85c2a5,0x97bec0a6,0x470490c4,0x2faae550,0x491e6ba9,0x0ab97a87,
  212607. 0xaafa9914,0x4055f537,0x36726557,0xfc95adbb,0xd119d6bf,0x646343b9,
  212608. 0x9d341e37,0x788e94a0 },
  212609. { 0x9c53461a,0x053a6fe5,0x08e3b6ed,0x75ec897e,0x0768d939,0xa8f5d2f3,
  212610. 0xcc213d4f,0x9bd6bff6,0x05b0147c,0x590c7b41,0x7c7b8169,0x20a3628b,
  212611. 0x5bce78e9,0xc66a086e,0x4dec1d8f,0x3dd4d282,0xc19dcce9,0x890acf44,
  212612. 0xd8435a7e,0x6632d875,0xea6381b2,0x590167c1,0xf0dcc128,0xb2259797,
  212613. 0x46f8d463,0x91a612b4,0xc15efa39,0x42185d78,0x119f6788,0xdf55ec37,
  212614. 0x780dea93,0x91b19cc6 } },
  212615. /* 242 */
  212616. { { 0xcb5d8b80,0xebf2709d,0xfc35660e,0x03b96182,0x055ef969,0xb873d991,
  212617. 0xe47c4342,0xd1ea4b4d,0xd54f8867,0xcc4b9244,0xfd8d77ef,0x93b1a2ca,
  212618. 0xe8c1f563,0x068d24e7,0x49973056,0x5f5fabb6,0x0542374f,0x83248c50,
  212619. 0x3f38e913,0xc36de2b5,0x7bb680be,0xed07e8eb,0xd8f313b5,0x964813d7,
  212620. 0xafd2d392,0x7bb6a069,0x0848a31a,0xc06d848e,0xe4f0c325,0x6867fb2f,
  212621. 0x067343af,0x3c2ba834 },
  212622. { 0x9d3ad63b,0xab62d775,0x59e0eb1f,0x3f9cab97,0x3885e117,0x70332a63,
  212623. 0xe20b2f9e,0xf22cafce,0x49eca947,0xb529ba7e,0x6228d88d,0x24954216,
  212624. 0x39239561,0x80ea23ec,0xd4370644,0x1b8907e7,0x563e4e44,0x4b7fa455,
  212625. 0xb2a4b0fa,0xcca9829e,0x48060792,0xd0a720a4,0x246991ce,0x8ccdda0c,
  212626. 0x348d086b,0x37a2325b,0xf60aee13,0x566ed509,0x147f253f,0x3d30e091,
  212627. 0xc1073bd8,0x1fa627a5 } },
  212628. /* 243 */
  212629. { { 0x42478fd4,0xa11222a2,0x670b2000,0xacf4c6f1,0x8359c6de,0xf71bb04f,
  212630. 0x7b93cdbc,0x618e2829,0x230db60b,0x96e1bae3,0x965b3b29,0xf17fd3b4,
  212631. 0xbc7055dd,0xa58639c6,0x4b817d7f,0xc3ea92ed,0xd23b08a4,0x9082b2a6,
  212632. 0xdc17010e,0x8471228a,0x20e89d97,0x753b9e46,0x03ff77c9,0xcf7e4f97,
  212633. 0x2bbe60e5,0x6c3f8245,0xb80e017d,0x9e432cbc,0xc0a45edb,0x150a5acd,
  212634. 0x4798743e,0x67b8bd05 },
  212635. { 0xf4797cf7,0xe66079b4,0xd03fde02,0xe31c998a,0x54caaef1,0x5aa3763a,
  212636. 0xf7649711,0x64d9a1fe,0xaf29b1a7,0x7ce0dc73,0xfb66ca93,0x6661b083,
  212637. 0x32fb6a78,0xbf4d74fe,0xdf00a561,0x25f6ef09,0x831d1159,0x2bc4383f,
  212638. 0x536bde37,0x6d5cc10c,0x882cc65b,0xd4945f9f,0x451a99b8,0x81f48f13,
  212639. 0x6bac11a4,0x140161cd,0xf18a4a0a,0x9d94d4ed,0xa467a824,0x65363165,
  212640. 0xa4c9aedf,0x74297aa9 } },
  212641. /* 244 */
  212642. { { 0xe21124ba,0xc49758a4,0xa87ffbd2,0x99bd8198,0x3d6638a8,0x45fbcdd1,
  212643. 0x15f7bf76,0x94645ff8,0xc4e6d57e,0x5fa6736f,0x92e61db9,0x1eae6475,
  212644. 0xcbdf944a,0x79575c0c,0x25b31d74,0xa3d13047,0x4cab5ae6,0x7881df22,
  212645. 0x1a2887f2,0x8dbfd299,0xa26ac459,0x23d07590,0xd8661d4a,0x2e589852,
  212646. 0x8a0140f7,0x37b5c13b,0x3fb3782a,0x0f94199e,0x1bc14e90,0x722aa059,
  212647. 0xd55bbb12,0x89aab7ba },
  212648. { 0xd656bdc7,0x8b345a96,0xe176cd3b,0x43bdc8af,0x32d64c43,0xd69518b6,
  212649. 0x79b82b41,0xfcf364a7,0xffb0cf82,0x907b344e,0x5101287b,0xf3d0c83c,
  212650. 0x34cd90ef,0xe9f26a59,0x07082b5c,0xe5f5aaf2,0xece7c165,0x4eb72c75,
  212651. 0xbe986cd6,0xe9590a81,0xff1536aa,0xfeef498f,0xa8263d5e,0x04560243,
  212652. 0x54ae872b,0x940be14f,0xe3207686,0xbee7bcc9,0xc1bc4d7a,0xd496a27d,
  212653. 0x5940ab46,0x002dc297 } },
  212654. /* 245 */
  212655. { { 0xb69d60c3,0xee533937,0xfe972755,0x260be552,0xc0c725a6,0xb11fb78d,
  212656. 0xcab2e7c2,0x6982c27e,0xee2322cb,0x4bceedd9,0x122704f7,0x952b19ed,
  212657. 0x854a6165,0x2df4c285,0x7b192485,0xba40b5bf,0x0119f52a,0xfcbca950,
  212658. 0xe5add86f,0x7467d1cb,0xd9d0f2c1,0x9bf536fb,0xb8d4ebc9,0x3c296e34,
  212659. 0x05a81317,0x0495f8f4,0x73335f76,0x8c59e8d6,0xe0542122,0x0b53d324,
  212660. 0x3c3bda73,0x4d564535 },
  212661. { 0x7e5c0877,0x7322f800,0x0ca9a764,0x481b43e6,0xa2c12716,0x231f4f4b,
  212662. 0xed3136c2,0x09596857,0x38db30de,0xae826322,0x99908ebc,0x652fad40,
  212663. 0xaf0d231e,0x0b8d1814,0x09cbc349,0x2680c54b,0x4bf3bf8e,0xfd4562f3,
  212664. 0x092b595f,0x2985090b,0x5e15fc34,0xe6f39ca4,0xbc378168,0x70175191,
  212665. 0x845a4a87,0x906944b3,0x82a1541a,0xacc6d74a,0xb155c8b4,0xadc9bab3,
  212666. 0x77306c62,0x1f2f89ce } },
  212667. /* 246 */
  212668. { { 0x9affefdf,0x8253ef41,0x4cf9256b,0x05d7ece5,0xb444e483,0x377002f2,
  212669. 0xcba5471f,0xb189755f,0xd5cbe015,0xc88483cb,0x6a0b8429,0x254f7c69,
  212670. 0x61f3f61d,0x18850bd4,0x0a247157,0x7ba21089,0xd92eeb0d,0x35abbc2e,
  212671. 0x965dec89,0xfb56cabe,0xbc55684a,0x9da23724,0x6a7a7492,0xd8ba396f,
  212672. 0x2ef4ba46,0xfcb90db7,0x9909b27a,0xdd234fe0,0x76f4366e,0xbdf3c164,
  212673. 0x17e50d47,0x09c8097f },
  212674. { 0x60050c07,0x6a04b140,0x43a8e37e,0xc29e8318,0xbb55e41f,0xcb9429b2,
  212675. 0x2ce60e3a,0xed2fea5a,0xdb9d82f4,0xdc7b1ff3,0x687d37fa,0x48ebecc3,
  212676. 0xecb07539,0x79153e32,0x57075692,0x6a60054f,0x800759ba,0x3871cd0c,
  212677. 0x30922df1,0x17a7386f,0x83357b7c,0x4e9fc59e,0x39415186,0x1d26b3a9,
  212678. 0xd34db889,0x912a0222,0x59fcdb71,0x6672fcf4,0x44ff3036,0x5a3f268d,
  212679. 0x6911e16c,0x6f113ed3 } },
  212680. /* 247 */
  212681. { { 0x1836f1c9,0x52a9df59,0x4232307d,0xfa6519f5,0x5ded285a,0x8406c701,
  212682. 0xaf627f75,0x0a1545ca,0xace0417d,0xae1111ee,0xa6113443,0xfb28bdf6,
  212683. 0x52dbcbcb,0xde9ef0ab,0x7813e658,0xe9dc181b,0x99127225,0x0b1dabdb,
  212684. 0x22814c59,0x5f0598e3,0xd934ee7e,0x5c3b966e,0xb99ba4bf,0x4eb84eda,
  212685. 0x3c1b55e7,0xb2919a34,0x94aa860f,0xa9addb49,0xf6811ff6,0x1b7220df,
  212686. 0xd1a183e2,0x6636a23b },
  212687. { 0x20587283,0xdf5d5a2d,0xef07fc5d,0x0b3822c9,0x0ef6de38,0x1786bd55,
  212688. 0x25d1671d,0x163cf907,0x1cdb1def,0x74bf971f,0x0842fc4a,0x5749e830,
  212689. 0x27f854f7,0x0e2edbc7,0xbce24acb,0xbb27bbda,0x05bed08d,0xc1b19cec,
  212690. 0xf7c904bc,0xaada123e,0xd89982db,0x02429f1b,0x65f6e632,0x49d3616e,
  212691. 0xee59fd32,0xa3789fa8,0xfe9f29f5,0x160ba3ba,0xaf5378a0,0x0f2d3b61,
  212692. 0x73c2a6f8,0x7aeecc76 } },
  212693. /* 248 */
  212694. { { 0xdc43b0db,0xf3a4757c,0x98119cad,0x3d8a4e85,0x4616c156,0xf8095bf6,
  212695. 0x4f533e97,0x3e2a07bc,0x39cfc5ad,0xa9824367,0xcd68052c,0x18a6ba3a,
  212696. 0x8a1cec66,0xbd60e590,0x02b1b695,0xae3841a5,0x190a195b,0x986dff12,
  212697. 0xad31fd9b,0x2df2beac,0xcc728f7b,0x7d893224,0x0cf0a992,0xc38ea738,
  212698. 0x586a44ea,0xa8439a80,0x1615f03c,0xede7f7f0,0x27a1f885,0x48249908,
  212699. 0xb78a7645,0x28ec4006 },
  212700. { 0xa2fe0009,0xe1820c2e,0xf13874e9,0xe11ba5d2,0xc524db52,0x97522454,
  212701. 0x7fede529,0x4d477426,0x9b2500d4,0x01d3419a,0x1869244b,0xce08a492,
  212702. 0xdd1be1b9,0xba169023,0x32a301e0,0x242c3e54,0x70906788,0x9b56f7ba,
  212703. 0xc74a8cc4,0xf0ad2a09,0xd76f9439,0x99cd1841,0x621fb60e,0xeddafe0b,
  212704. 0xbc397634,0x056bee54,0xff7f0a84,0x4653f860,0x2011c0af,0x6bd4876f,
  212705. 0x0c9525c3,0x134f4cc7 } },
  212706. /* 249 */
  212707. { { 0xe938dff4,0x9621a3ec,0x486a79a3,0x7d101a7b,0xde950537,0xf2c4ef97,
  212708. 0xe65d87db,0xf3184099,0x373b8cfa,0xb89c7ffb,0xe842916e,0x68baa505,
  212709. 0x4ebea764,0xa790fd09,0xe592892b,0x679df6d4,0xfcfed741,0x2023331c,
  212710. 0x9880ff21,0x0bf4efd2,0xd0344501,0x7ca78ddd,0x342858c8,0x2cb09ecb,
  212711. 0x2575487a,0x9e5eb6dc,0xebcb0491,0x50675a15,0x7381d471,0x09d2e74f,
  212712. 0x83d3d6f4,0x6ea37829 },
  212713. { 0x4e5cc40a,0xc65c094b,0x1af37dfb,0x7a2e3f6a,0xf9026e44,0xef677e9d,
  212714. 0x93880f53,0xb7878c95,0x7f644aa9,0x4aa30b07,0x2f208c3c,0xa0c51683,
  212715. 0x658d663b,0x7c0277ae,0xae1d9130,0xef0b3c38,0x695c3ea4,0x302f37a7,
  212716. 0x6a0c5e0d,0xe004c1c5,0x20cbcf9f,0x9fd495c4,0x568a0e7c,0x706d5b9d,
  212717. 0x59286454,0x8b225dff,0x8d9a709c,0x527d4465,0x87c08d68,0x47c558da,
  212718. 0xbb4ef07d,0x606ee6e6 } },
  212719. /* 250 */
  212720. { { 0x57c621f6,0x02d99fc7,0x7fe83d48,0x292e40c1,0x9ef199b0,0x1bdfc7a1,
  212721. 0xe62c7666,0x78a04102,0xe6738753,0x16cda370,0x1e3a65af,0xbc81974d,
  212722. 0xf78fe209,0x19742048,0xbf5981c6,0xc83a058a,0x9c89702d,0xf26b2434,
  212723. 0x9d1a678a,0x988b2f1e,0xff29ae29,0x472bf9b0,0x1d7cf5ec,0xa143e398,
  212724. 0xb268ddd8,0x9c9d7e45,0x5fc4ff76,0x166cda55,0xa4aa7673,0x6044cdf0,
  212725. 0xe9148707,0x49dba6f7 },
  212726. { 0xa758e37a,0x20e47fb2,0x2d8eaf66,0xaf6b31d7,0x6f9c2210,0x352ad5f9,
  212727. 0x90efc32b,0x0093f727,0x41e4b264,0x435c99dc,0x05b15795,0xbfa878e0,
  212728. 0x0e673575,0x99c520a4,0x87eea759,0xca682594,0xf12a348b,0x029f7b81,
  212729. 0x2aa2ce35,0xa547cc18,0xead5e2c5,0xa11d874b,0x55682cdf,0x9af0349b,
  212730. 0x8bbe8e66,0xf86ebfea,0xf55394ab,0x3dab8782,0xebc8eb8f,0x458bf797,
  212731. 0x9b7de78c,0x4890a7a4 } },
  212732. /* 251 */
  212733. { { 0x8da995f6,0xd7299689,0xec6156ef,0xd39eaae7,0x356a82d5,0x6959040c,
  212734. 0xc135bcfe,0xb2046b21,0x0f595c78,0xea720b64,0xe7c5fb40,0x02824efa,
  212735. 0x0edb3bfc,0x97d8fd4c,0x79f24ebe,0x12f02905,0x187ea6b9,0x16fc47cf,
  212736. 0x789d5c23,0xc219fd27,0x89263ecc,0x233a6b6c,0x8b6d30a6,0x823634b2,
  212737. 0xc9b33680,0xca352e25,0x40c77456,0x9388d6ca,0x3c92065b,0xf8e55b0b,
  212738. 0x02439a76,0x5c17474b },
  212739. { 0x8aaccab5,0xd888e7c2,0xaaced05b,0x18027836,0xccec0f65,0x185b877d,
  212740. 0x125c2882,0x93cadc1c,0x67fdc54c,0x45df540a,0xc2788a33,0x4f3c86e2,
  212741. 0xe3a0fa2c,0x3e874469,0x273983cf,0xc59daa47,0x4a96d8a5,0x3063c48b,
  212742. 0xc2e58915,0xc38d2bcf,0x84e428c3,0x90e78b87,0xf0c4fd53,0x900a292c,
  212743. 0x941e6005,0xb7f92db7,0x6ca53a1c,0x95679241,0xb1ab0fa7,0x35f6f31d,
  212744. 0x7b58408c,0x5d675eb4 } },
  212745. /* 252 */
  212746. { { 0x870c6025,0xaeee1a77,0x91a2dfca,0xfc4a23b7,0x386b64c4,0x7b0e60c4,
  212747. 0xe5ae72b1,0xd5d5b17d,0x9eefa212,0x6dfc88ac,0xd4038b96,0x4feaefbe,
  212748. 0x8e2d2ecc,0x099ac356,0x012af207,0x548ea612,0x89c31218,0x4ffed9db,
  212749. 0xe0e67331,0x1c1e91c4,0xaf8300e0,0x009bb64f,0x6773c3be,0x8780501c,
  212750. 0xc08219fa,0xe0cd6ede,0xf81b06ff,0x7c055e07,0xe080b36f,0x82b63f9c,
  212751. 0x0a9feca3,0x02fccbaf },
  212752. { 0xb47cac61,0x9991d4d1,0xab86e12c,0x2e9d1687,0x2b94f042,0x8c6855ec,
  212753. 0x48e648e5,0xca400519,0xef89ac57,0x9ba91fb2,0x1be792cd,0x4f419206,
  212754. 0xbd0f1e15,0x82d221cb,0xfc444019,0x062eb13b,0x99790fdc,0xf3a97c32,
  212755. 0x6067a64b,0x4e796d94,0x6d23775a,0xc46dd300,0xed7f0f23,0x8672c4d5,
  212756. 0x3b4f63d7,0x821851dc,0xd26273f2,0x50a3ae0c,0xeac60f6f,0x800e58fc,
  212757. 0x13845545,0x56f1e456 } },
  212758. /* 253 */
  212759. { { 0x32c24f3b,0x01ccb3f6,0x06d817e6,0x99eb1c7f,0x6aa26776,0x8dc640bb,
  212760. 0x0845d5e0,0x7838affe,0xf81a79a8,0xf34fecb1,0x3e6819b0,0x6a2e282d,
  212761. 0x8237a4b8,0xc4b977ce,0x87636439,0x0f46b3db,0x97970497,0xa465f540,
  212762. 0x8791be43,0xd7e08762,0x34198ec6,0x00220b6c,0x093d94bb,0x57b38637,
  212763. 0x29d690b2,0x84012e16,0x20aad1a4,0x02ec9db5,0x85dc34e3,0xafee2fc6,
  212764. 0x25500cf8,0x911d1936 },
  212765. { 0xf5e5af5b,0x13b1bd58,0x7b6a22a7,0xa7ca263b,0xf3af2adc,0xab6bec4d,
  212766. 0xa04420bd,0x16651e59,0x4ba36c11,0x3b448b3b,0xff424310,0x3c62bfcd,
  212767. 0xf1a96cbb,0xde15c4a5,0xe4d1f980,0xbe0ad8a1,0x36673a3a,0x812bd14e,
  212768. 0x9212acdd,0x40303af6,0x576095ce,0x8f6dab9c,0x107f5ca5,0x7df1882a,
  212769. 0x8896a3b0,0xb903e63c,0xd863b3f0,0xf5048544,0xc09887de,0x5e5019b9,
  212770. 0xa0f53865,0x2be744fe } },
  212771. /* 254 */
  212772. { { 0x5b50f324,0x054cd05f,0x1ea3c7a2,0xb9b1eb24,0x7ff8e6b7,0x4a858a5c,
  212773. 0xec040882,0xd83902fe,0xd0cba9bd,0x72b26494,0xb29c9e1e,0xd0176f90,
  212774. 0xcebadb81,0x05d4eb02,0x372b8bfc,0x874405b1,0x79ead190,0x5c412881,
  212775. 0xec2b48cd,0xd44a3dd3,0x3f4d5033,0x84499a77,0x564c3a09,0xb37b38cd,
  212776. 0xf42e803b,0x80e99497,0xb8f518b2,0xc07b47a0,0x3568fde4,0xc710e3c5,
  212777. 0xcead0e7a,0x735f542f },
  212778. { 0x38380039,0xcaa9a171,0xf74d19c8,0xadfafe17,0xccbc1a8b,0x92d4393e,
  212779. 0xfe029705,0x3c5dbf39,0x930e9b36,0x4552b5ab,0x2afd494a,0x7ee63032,
  212780. 0x3f02ac43,0x826a9ad7,0x99356298,0x98c53562,0x7342bb39,0x0c869f87,
  212781. 0xe4f9b79a,0xd7510020,0xd34789a9,0x6361d1a4,0xcfa85637,0xf0ded5ba,
  212782. 0x88ac07e4,0x407ee73f,0x09ef1cbd,0xfac7d03f,0x4d475bad,0x25d697cb,
  212783. 0x14bd399e,0x1e984c9d } },
  212784. /* 255 */
  212785. { { 0x4850c817,0xc76d0561,0x3489812d,0xb08a5b19,0x5e58cbbe,0x7273d154,
  212786. 0x4be61e5a,0x8900b5fa,0xd7aeb8e1,0xaa088691,0xd35a3d4b,0xe66666af,
  212787. 0x57ec7d3d,0x38a2c199,0x668d6f5c,0xa0648e8f,0x7adc1746,0x1f9fc92c,
  212788. 0x843065c3,0x23a116c0,0x61e6ae69,0x36370a20,0x2aa47e73,0x626c3736,
  212789. 0xdeff6d84,0x540c25f2,0xcdbed2d4,0x9804824c,0x039a9492,0x4b5bfce0,
  212790. 0x76942e01,0x6c474a56 },
  212791. { 0x7d88e3a1,0x3aeb9a41,0xc484742a,0x105d3c88,0x3fe61131,0xe59de8d1,
  212792. 0x1a869e8b,0x148f5b6b,0xaa75d90a,0x7a8abc59,0x62146013,0x2f0c9bc7,
  212793. 0xc3824cd9,0x43faa747,0x6a5d0b92,0x81763a18,0x9bcbaebc,0xbbc341bc,
  212794. 0xf745d1dd,0xe1813160,0xb75ce5f4,0xa53ce52d,0xd50de4c2,0x15eae66c,
  212795. 0x75d7656d,0x5ed8996c,0xc4ca552a,0xe4ff5711,0x3c5305b4,0x215e985a,
  212796. 0xfa1ba2ce,0x6b258954 } },
  212797. };
  212798. /* Multiply the base point of P1024 by the scalar and return the result.
  212799. * If map is true then convert result to affine coordinates.
  212800. *
  212801. * Stripe implementation.
  212802. * Pre-generated: 2^0, 2^128, ...
  212803. * Pre-generated: products of all combinations of above.
  212804. * 8 doubles and adds (with qz=1)
  212805. *
  212806. * r Resulting point.
  212807. * k Scalar to multiply by.
  212808. * map Indicates whether to convert result to affine.
  212809. * ct Constant time required.
  212810. * heap Heap to use for allocation.
  212811. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  212812. */
  212813. static int sp_1024_ecc_mulmod_base_32(sp_point_1024* r, const sp_digit* k,
  212814. int map, int ct, void* heap)
  212815. {
  212816. return sp_1024_ecc_mulmod_stripe_32(r, &p1024_base, p1024_table,
  212817. k, map, ct, heap);
  212818. }
  212819. #endif
  212820. /* Multiply the base point of P1024 by the scalar and return the result.
  212821. * If map is true then convert result to affine coordinates.
  212822. *
  212823. * km Scalar to multiply by.
  212824. * r Resulting point.
  212825. * map Indicates whether to convert result to affine.
  212826. * heap Heap to use for allocation.
  212827. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  212828. */
  212829. int sp_ecc_mulmod_base_1024(const mp_int* km, ecc_point* r, int map, void* heap)
  212830. {
  212831. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  212832. sp_point_1024* point = NULL;
  212833. sp_digit* k = NULL;
  212834. #else
  212835. sp_point_1024 point[1];
  212836. sp_digit k[32];
  212837. #endif
  212838. int err = MP_OKAY;
  212839. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  212840. point = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024), heap,
  212841. DYNAMIC_TYPE_ECC);
  212842. if (point == NULL)
  212843. err = MEMORY_E;
  212844. if (err == MP_OKAY) {
  212845. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32, heap,
  212846. DYNAMIC_TYPE_ECC);
  212847. if (k == NULL)
  212848. err = MEMORY_E;
  212849. }
  212850. #endif
  212851. if (err == MP_OKAY) {
  212852. sp_1024_from_mp(k, 32, km);
  212853. err = sp_1024_ecc_mulmod_base_32(point, k, map, 1, heap);
  212854. }
  212855. if (err == MP_OKAY) {
  212856. err = sp_1024_point_to_ecc_point_32(point, r);
  212857. }
  212858. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  212859. if (k != NULL)
  212860. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  212861. if (point != NULL)
  212862. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  212863. #endif
  212864. return err;
  212865. }
  212866. /* Multiply the base point of P1024 by the scalar, add point a and return
  212867. * the result. If map is true then convert result to affine coordinates.
  212868. *
  212869. * km Scalar to multiply by.
  212870. * am Point to add to scalar mulitply result.
  212871. * inMont Point to add is in montgomery form.
  212872. * r Resulting point.
  212873. * map Indicates whether to convert result to affine.
  212874. * heap Heap to use for allocation.
  212875. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  212876. */
  212877. int sp_ecc_mulmod_base_add_1024(const mp_int* km, const ecc_point* am,
  212878. int inMont, ecc_point* r, int map, void* heap)
  212879. {
  212880. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  212881. sp_point_1024* point = NULL;
  212882. sp_digit* k = NULL;
  212883. #else
  212884. sp_point_1024 point[2];
  212885. sp_digit k[32 + 32 * 2 * 6];
  212886. #endif
  212887. sp_point_1024* addP = NULL;
  212888. sp_digit* tmp = NULL;
  212889. int err = MP_OKAY;
  212890. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  212891. point = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * 2, heap,
  212892. DYNAMIC_TYPE_ECC);
  212893. if (point == NULL)
  212894. err = MEMORY_E;
  212895. if (err == MP_OKAY) {
  212896. k = (sp_digit*)XMALLOC(
  212897. sizeof(sp_digit) * (32 + 32 * 2 * 6),
  212898. heap, DYNAMIC_TYPE_ECC);
  212899. if (k == NULL)
  212900. err = MEMORY_E;
  212901. }
  212902. #endif
  212903. if (err == MP_OKAY) {
  212904. addP = point + 1;
  212905. tmp = k + 32;
  212906. sp_1024_from_mp(k, 32, km);
  212907. sp_1024_point_from_ecc_point_32(addP, am);
  212908. }
  212909. if ((err == MP_OKAY) && (!inMont)) {
  212910. err = sp_1024_mod_mul_norm_32(addP->x, addP->x, p1024_mod);
  212911. }
  212912. if ((err == MP_OKAY) && (!inMont)) {
  212913. err = sp_1024_mod_mul_norm_32(addP->y, addP->y, p1024_mod);
  212914. }
  212915. if ((err == MP_OKAY) && (!inMont)) {
  212916. err = sp_1024_mod_mul_norm_32(addP->z, addP->z, p1024_mod);
  212917. }
  212918. if (err == MP_OKAY) {
  212919. err = sp_1024_ecc_mulmod_base_32(point, k, 0, 0, heap);
  212920. }
  212921. if (err == MP_OKAY) {
  212922. sp_1024_proj_point_add_32(point, point, addP, tmp);
  212923. if (map) {
  212924. sp_1024_map_32(point, point, tmp);
  212925. }
  212926. err = sp_1024_point_to_ecc_point_32(point, r);
  212927. }
  212928. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  212929. if (k != NULL)
  212930. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  212931. if (point)
  212932. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  212933. #endif
  212934. return err;
  212935. }
  212936. #ifndef WOLFSSL_SP_SMALL
  212937. /* Generate a pre-computation table for the point.
  212938. *
  212939. * gm Point to generate table for.
  212940. * table Buffer to hold pre-computed points table.
  212941. * len Length of table.
  212942. * heap Heap to use for allocation.
  212943. * returns BAD_FUNC_ARG when gm or len is NULL, LENGTH_ONLY_E when table is
  212944. * NULL and length is returned, BUFFER_E if length is too small and 0 otherwise.
  212945. */
  212946. int sp_ecc_gen_table_1024(const ecc_point* gm, byte* table, word32* len,
  212947. void* heap)
  212948. {
  212949. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  212950. sp_point_1024* point = NULL;
  212951. sp_digit* t = NULL;
  212952. #else
  212953. sp_point_1024 point[1];
  212954. sp_digit t[6 * 2 * 32];
  212955. #endif
  212956. int err = MP_OKAY;
  212957. if ((gm == NULL) || (len == NULL)) {
  212958. err = BAD_FUNC_ARG;
  212959. }
  212960. if ((err == MP_OKAY) && (table == NULL)) {
  212961. *len = sizeof(sp_table_entry_1024) * 256;
  212962. err = LENGTH_ONLY_E;
  212963. }
  212964. if ((err == MP_OKAY) && (*len < (int)(sizeof(sp_table_entry_1024) * 256))) {
  212965. err = BUFFER_E;
  212966. }
  212967. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  212968. if (err == MP_OKAY) {
  212969. point = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024), heap,
  212970. DYNAMIC_TYPE_ECC);
  212971. if (point == NULL)
  212972. err = MEMORY_E;
  212973. }
  212974. if (err == MP_OKAY) {
  212975. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 6 * 2 * 32, heap,
  212976. DYNAMIC_TYPE_ECC);
  212977. if (t == NULL)
  212978. err = MEMORY_E;
  212979. }
  212980. #endif
  212981. if (err == MP_OKAY) {
  212982. sp_1024_point_from_ecc_point_32(point, gm);
  212983. err = sp_1024_gen_stripe_table_32(point,
  212984. (sp_table_entry_1024*)table, t, heap);
  212985. }
  212986. if (err == 0) {
  212987. *len = sizeof(sp_table_entry_1024) * 256;
  212988. }
  212989. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  212990. if (t != NULL)
  212991. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  212992. if (point != NULL)
  212993. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  212994. #endif
  212995. return err;
  212996. }
  212997. #else
  212998. /* Generate a pre-computation table for the point.
  212999. *
  213000. * gm Point to generate table for.
  213001. * table Buffer to hold pre-computed points table.
  213002. * len Length of table.
  213003. * heap Heap to use for allocation.
  213004. * returns BAD_FUNC_ARG when gm or len is NULL, LENGTH_ONLY_E when table is
  213005. * NULL and length is returned, BUFFER_E if length is too small and 0 otherwise.
  213006. */
  213007. int sp_ecc_gen_table_1024(const ecc_point* gm, byte* table, word32* len,
  213008. void* heap)
  213009. {
  213010. int err = 0;
  213011. if ((gm == NULL) || (len == NULL)) {
  213012. err = BAD_FUNC_ARG;
  213013. }
  213014. if ((err == 0) && (table == NULL)) {
  213015. *len = 0;
  213016. err = LENGTH_ONLY_E;
  213017. }
  213018. if ((err == 0) && (*len != 0)) {
  213019. err = BUFFER_E;
  213020. }
  213021. if (err == 0) {
  213022. *len = 0;
  213023. }
  213024. (void)heap;
  213025. return err;
  213026. }
  213027. #endif
  213028. /* Multiply the point by the scalar and return the result.
  213029. * If map is true then convert result to affine coordinates.
  213030. *
  213031. * km Scalar to multiply by.
  213032. * gm Point to multiply.
  213033. * table Pre-computed points.
  213034. * r Resulting point.
  213035. * map Indicates whether to convert result to affine.
  213036. * heap Heap to use for allocation.
  213037. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  213038. */
  213039. int sp_ecc_mulmod_table_1024(const mp_int* km, const ecc_point* gm, byte* table,
  213040. ecc_point* r, int map, void* heap)
  213041. {
  213042. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  213043. sp_point_1024* point = NULL;
  213044. sp_digit* k = NULL;
  213045. #else
  213046. sp_point_1024 point[1];
  213047. sp_digit k[32];
  213048. #endif
  213049. int err = MP_OKAY;
  213050. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  213051. point = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024), heap,
  213052. DYNAMIC_TYPE_ECC);
  213053. if (point == NULL) {
  213054. err = MEMORY_E;
  213055. }
  213056. if (err == MP_OKAY) {
  213057. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32, heap, DYNAMIC_TYPE_ECC);
  213058. if (k == NULL)
  213059. err = MEMORY_E;
  213060. }
  213061. #endif
  213062. if (err == MP_OKAY) {
  213063. sp_1024_from_mp(k, 32, km);
  213064. sp_1024_point_from_ecc_point_32(point, gm);
  213065. #ifndef WOLFSSL_SP_SMALL
  213066. err = sp_1024_ecc_mulmod_stripe_32(point, point,
  213067. (const sp_table_entry_1024*)table, k, map, 0, heap);
  213068. #else
  213069. (void)table;
  213070. err = sp_1024_ecc_mulmod_32(point, point, k, map, 0, heap);
  213071. #endif
  213072. }
  213073. if (err == MP_OKAY) {
  213074. err = sp_1024_point_to_ecc_point_32(point, r);
  213075. }
  213076. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  213077. if (k != NULL)
  213078. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  213079. if (point != NULL)
  213080. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  213081. #endif
  213082. return err;
  213083. }
  213084. /* Multiply p* in projective co-ordinates by q*.
  213085. *
  213086. * r.x = p.x - (p.y * q.y)
  213087. * r.y = (p.x * q.y) + p.y
  213088. *
  213089. * px [in,out] A single precision integer - X ordinate of number to multiply.
  213090. * py [in,out] A single precision integer - Y ordinate of number to multiply.
  213091. * q [in] A single precision integer - multiplier.
  213092. * t [in] Two single precision integers - temps.
  213093. */
  213094. static void sp_1024_proj_mul_qx1_32(sp_digit* px, sp_digit* py,
  213095. const sp_digit* q, sp_digit* t)
  213096. {
  213097. sp_digit* t1 = t;
  213098. sp_digit* t2 = t + 2 * 32;
  213099. /* t1 = p.x * q.y */
  213100. sp_1024_mont_mul_32(t1, px, q, p1024_mod, p1024_mp_mod);
  213101. /* t2 = p.y * q.y */
  213102. sp_1024_mont_mul_32(t2, py, q, p1024_mod, p1024_mp_mod);
  213103. /* r.x = p.x - (p.y * q.y) */
  213104. sp_1024_mont_sub_32(px, px, t2, p1024_mod);
  213105. /* r.y = (p.x * q.y) + p.y */
  213106. sp_1024_mont_add_32(py, t1, py, p1024_mod);
  213107. }
  213108. /* Square p* in projective co-ordinates.
  213109. *
  213110. * px' = (p.x + p.y) * (p.x - p.y) = p.x^2 - p.y^2
  213111. * py' = 2 * p.x * p.y
  213112. *
  213113. * px [in,out] A single precision integer - X ordinate of number to square.
  213114. * py [in,out] A single precision integer - Y ordinate of number to square.
  213115. * t [in] Two single precision integers - temps.
  213116. */
  213117. static void sp_1024_proj_sqr_32(sp_digit* px, sp_digit* py, sp_digit* t)
  213118. {
  213119. sp_digit* t1 = t;
  213120. sp_digit* t2 = t + 2 * 32;
  213121. /* t1 = p.x + p.y */
  213122. sp_1024_mont_add_32(t1, px, py, p1024_mod);
  213123. /* t2 = p.x - p.y */
  213124. sp_1024_mont_sub_32(t2, px, py, p1024_mod);
  213125. /* r.y = p.x * p.y */
  213126. sp_1024_mont_mul_32(py, px, py, p1024_mod, p1024_mp_mod);
  213127. /* r.x = (p.x + p.y) * (p.x - p.y) */
  213128. sp_1024_mont_mul_32(px, t1, t2, p1024_mod, p1024_mp_mod);
  213129. /* r.y = (p.x * p.y) * 2 */
  213130. sp_1024_mont_dbl_32(py, py, p1024_mod);
  213131. }
  213132. #ifdef WOLFSSL_SP_SMALL
  213133. /* Perform the modular exponentiation in Fp* for SAKKE.
  213134. *
  213135. * Simple square and multiply when expontent bit is one algorithm.
  213136. * Square and multiply performed in Fp*.
  213137. *
  213138. * base [in] Base. MP integer.
  213139. * exp [in] Exponent. MP integer.
  213140. * res [out] Result. MP integer.
  213141. * returns 0 on success and MEMORY_E if memory allocation fails.
  213142. */
  213143. int sp_ModExp_Fp_star_1024(const mp_int* base, mp_int* exp, mp_int* res)
  213144. {
  213145. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  213146. !defined(WOLFSSL_SP_NO_MALLOC)
  213147. sp_digit* td;
  213148. sp_digit* t;
  213149. sp_digit* tx;
  213150. sp_digit* ty;
  213151. sp_digit* b;
  213152. sp_digit* e;
  213153. #else
  213154. sp_digit t[4 * 2 * 32];
  213155. sp_digit tx[2 * 32];
  213156. sp_digit ty[2 * 32];
  213157. sp_digit b[2 * 32];
  213158. sp_digit e[2 * 32];
  213159. #endif
  213160. sp_digit* r;
  213161. int err = MP_OKAY;
  213162. int bits;
  213163. int i;
  213164. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  213165. !defined(WOLFSSL_SP_NO_MALLOC)
  213166. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 8 * 32 * 2, NULL,
  213167. DYNAMIC_TYPE_TMP_BUFFER);
  213168. if (td == NULL) {
  213169. err = MEMORY_E;
  213170. }
  213171. #endif
  213172. if (err == MP_OKAY) {
  213173. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  213174. !defined(WOLFSSL_SP_NO_MALLOC)
  213175. t = td;
  213176. tx = td + 4 * 32 * 2;
  213177. ty = td + 5 * 32 * 2;
  213178. b = td + 6 * 32 * 2;
  213179. e = td + 7 * 32 * 2;
  213180. #endif
  213181. r = ty;
  213182. bits = mp_count_bits(exp);
  213183. sp_1024_from_mp(b, 32, base);
  213184. sp_1024_from_mp(e, 32, exp);
  213185. XMEMCPY(tx, p1024_norm_mod, sizeof(sp_digit) * 32);
  213186. sp_1024_mul_32(b, b, p1024_norm_mod);
  213187. err = sp_1024_mod_32(b, b, p1024_mod);
  213188. }
  213189. if (err == MP_OKAY) {
  213190. XMEMCPY(ty, b, sizeof(sp_digit) * 32);
  213191. for (i = bits - 2; i >= 0; i--) {
  213192. sp_1024_proj_sqr_32(tx, ty, t);
  213193. if ((e[i / 32] >> (i % 32)) & 1) {
  213194. sp_1024_proj_mul_qx1_32(tx, ty, b, t);
  213195. }
  213196. }
  213197. }
  213198. if (err == MP_OKAY) {
  213199. sp_1024_mont_inv_32(tx, tx, t);
  213200. XMEMSET(tx + 32, 0, sizeof(sp_digit) * 32);
  213201. sp_1024_mont_reduce_32(tx, p1024_mod, p1024_mp_mod);
  213202. XMEMSET(ty + 32, 0, sizeof(sp_digit) * 32);
  213203. sp_1024_mont_reduce_32(ty, p1024_mod, p1024_mp_mod);
  213204. sp_1024_mul_32(r, tx, ty);
  213205. err = sp_1024_mod_32(r, r, p1024_mod);
  213206. }
  213207. if (err == MP_OKAY) {
  213208. err = sp_1024_to_mp(r, res);
  213209. }
  213210. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  213211. !defined(WOLFSSL_SP_NO_MALLOC)
  213212. if (td != NULL) {
  213213. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  213214. }
  213215. #endif
  213216. return err;
  213217. }
  213218. #else
  213219. /* Pre-computed table for exponentiating g.
  213220. * Striping: 8 points at a distance of (128 combined for
  213221. * a total of 256 points.
  213222. */
  213223. static const sp_digit sp_1024_g_table[256][32] = {
  213224. { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  213225. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  213226. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  213227. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  213228. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  213229. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  213230. 0x00000000, 0x00000000 },
  213231. { 0x335c1685, 0x170a46d2, 0xe1007a58, 0xeac9e971, 0x43ca4a73,
  213232. 0x40e8f3df, 0x82642475, 0x2646f815, 0xb36576d1, 0x3af49bb4,
  213233. 0x72bf1afb, 0xd89e2d14, 0x2fd151e6, 0x27be882c, 0x8f88717c,
  213234. 0xaddedc85, 0x16ac6c6f, 0xd6d859bf, 0x2d8eae58, 0x0e741a1b,
  213235. 0x61c1f30d, 0x6faf7a00, 0x9b67e096, 0x66dbd09a, 0x7d3b4f7d,
  213236. 0x21f11c06, 0xc727c98e, 0x6152ba02, 0xe86cb221, 0xafd58891,
  213237. 0x6bd3baf4, 0x59e93c6a },
  213238. { 0x71dd4594, 0xe54dd36f, 0x00aef1e6, 0xbbc9cc9f, 0xa19f6530,
  213239. 0x9ea5a44e, 0x3f520928, 0x8588aa99, 0x8f5c1418, 0x9753794c,
  213240. 0xc11399fa, 0x118bd792, 0xf5cb6ab5, 0xb9bd3afd, 0x2ecb9652,
  213241. 0x813d1cb2, 0x40389813, 0xfd456267, 0x4ac8431c, 0x51f7119b,
  213242. 0x0a180eb6, 0xdd9f6a91, 0x9f7bfa2e, 0x13946d17, 0x50a9d0d9,
  213243. 0x16f18631, 0x6f8373d3, 0x5f19c20d, 0x9b6a52b9, 0xbe85ac6a,
  213244. 0x74f62e03, 0x63ef187b },
  213245. { 0x016f45e7, 0x7c376b7f, 0x2bec82f8, 0x1c1bdb57, 0xce429b60,
  213246. 0x7392f741, 0xc7afd81d, 0x6fdbf0a2, 0x7241098b, 0xbda41b1f,
  213247. 0xbb60f8cf, 0x5b407474, 0xb330bc4d, 0x933e0d41, 0x733fa3be,
  213248. 0xae182830, 0x0f5c6cd1, 0xa0ed299b, 0x3f9860c8, 0x7ff3354e,
  213249. 0x15559c41, 0xb1360986, 0x129f85cb, 0xab0cb63c, 0x47685fbe,
  213250. 0x682ecc49, 0xeb199633, 0x505e8ec2, 0xddac2cda, 0x90dcc794,
  213251. 0xf192da23, 0x4fe6791c },
  213252. { 0x05e8733c, 0x94a423d5, 0x1d5717c1, 0xcc845e65, 0xe961b322,
  213253. 0x237c7e88, 0xdb4181cc, 0x0c4471c6, 0x713bd721, 0x00c875e2,
  213254. 0xb2c17b09, 0x9dfde9ed, 0xe88ceaf6, 0x430a6de5, 0x7b81cea6,
  213255. 0xaaa7a61a, 0x233f98d5, 0xea52d026, 0x60689a9a, 0xb55efdd0,
  213256. 0x5cac4aab, 0x30cfa7ce, 0x8e950761, 0xfa4db114, 0x4e9a1e52,
  213257. 0x309570c4, 0x1a040170, 0x18c21f61, 0xbe78d9d2, 0x555d1ffe,
  213258. 0x561db297, 0x04482a18 },
  213259. { 0x73d486d8, 0xe7758ac2, 0x61cdc1e7, 0x8169f946, 0x2188ab4f,
  213260. 0x723c99fc, 0xf3373630, 0xa0e54f02, 0xbd8c2260, 0x560bee25,
  213261. 0x4531bc60, 0x28fc307c, 0x7e44feb5, 0xd6f21f1a, 0x57128d37,
  213262. 0xc8e4499c, 0xd7b2ea45, 0x963b053e, 0x32a3d222, 0x40c27a04,
  213263. 0x35459668, 0x5b51854d, 0xd73557e9, 0x66e1a49f, 0x8692077a,
  213264. 0x0d267fd9, 0xe7342702, 0xfa1350d3, 0x68ccdb44, 0x1a9c3f25,
  213265. 0xdedbf89f, 0x833a0ff8 },
  213266. { 0xab376b76, 0xa8c419c7, 0x27d0f0cc, 0x3b7294f3, 0xa90c514d,
  213267. 0xe56bb9e2, 0xa62575a6, 0x931ba51e, 0x098c0a88, 0x56fee07b,
  213268. 0xb4c16a2a, 0x04be5aee, 0xe6eb260b, 0xe513350b, 0xa1d5c270,
  213269. 0x339edad6, 0xe9dbadd1, 0xf366ed59, 0x2dd06ec0, 0x4213be88,
  213270. 0xcb1187db, 0x22d639c8, 0xd8a1058a, 0x1fec95e1, 0xa2b744f1,
  213271. 0x03f73ea6, 0xf4f05c0c, 0x741fd51a, 0x85f811a0, 0x2e2df95a,
  213272. 0xeb24965f, 0x692b3ce3 },
  213273. { 0xd2a127b4, 0x0ce6cb72, 0x8f92816f, 0x66a46ea5, 0x47a37616,
  213274. 0x43ecf463, 0xe0ab96ee, 0x163d9a01, 0xb2edbe8c, 0xc8145c6d,
  213275. 0x4de4e665, 0x2f426cae, 0x74e252f9, 0x174d0b40, 0x7d2af831,
  213276. 0x54c240d7, 0x3d652936, 0x581fa397, 0xa09d4695, 0x05b9491c,
  213277. 0x5452643c, 0x8c4e8533, 0xd4128327, 0x32d64331, 0x70361f25,
  213278. 0x64479038, 0x89ef09f2, 0x774191b1, 0x81de5fe0, 0xc0cf0aaf,
  213279. 0xf40042d6, 0x333e430a },
  213280. { 0xcf26d3b7, 0x5df04de4, 0xb53f79be, 0x57a77306, 0x1808b664,
  213281. 0xa4013c5f, 0x85037360, 0xef291ea4, 0x0b061037, 0x1ffc9d7d,
  213282. 0x65c913bb, 0xd9d04dd9, 0xf13b8587, 0x948a37af, 0xfe3ee755,
  213283. 0xb5443483, 0x04631386, 0x3fc21e74, 0xcddeb58c, 0xb3a104e5,
  213284. 0x6572cd52, 0x94fe1862, 0x15aaa408, 0xeb9a71a1, 0x459ea462,
  213285. 0x8adc6fe5, 0x4aeb02a3, 0xbb18d175, 0x2f7791d1, 0xae127636,
  213286. 0xd6bbd708, 0x10e8b31d },
  213287. { 0x3ed9f1af, 0xb87f03e5, 0x56676166, 0x03ad2477, 0x74ce15b8,
  213288. 0x38dcd630, 0x26b1e85b, 0x1877e2b0, 0x1af99c15, 0xb1654d17,
  213289. 0x9382547a, 0x9782e9e4, 0x26d55ef5, 0x6dc7fc7c, 0x2fbeb54c,
  213290. 0x9038f95d, 0x036c0357, 0xfe590dfe, 0x4fdc3f7f, 0xcfcb6eae,
  213291. 0xf35e1a88, 0xcb1fbc54, 0xda0a5568, 0x3c8e1db2, 0x5b6f5557,
  213292. 0x9a87393f, 0xe7ac0a06, 0x38646b32, 0x2a8495ab, 0xfd261c83,
  213293. 0x0cdcc4bc, 0x6485524c },
  213294. { 0xc4a6ff2a, 0x1abfb3e2, 0x35a6428a, 0x2aa03fba, 0x89aff742,
  213295. 0x884227f0, 0xba5dbd93, 0x2337883a, 0xd2a182cb, 0x38186ae9,
  213296. 0x49a01f05, 0xb9f0764d, 0x917b1e7a, 0x92411feb, 0x570cbb5b,
  213297. 0x700b1903, 0xb914be7c, 0x5d5181d5, 0x1981182d, 0x135c4437,
  213298. 0x574b9997, 0x32758d24, 0x632d28b2, 0xa650a8f5, 0xfa383f09,
  213299. 0x24078bac, 0x00a33d80, 0x6546a60c, 0x2df8b449, 0xa4061c7a,
  213300. 0xf234563c, 0x1f76f3f2 },
  213301. { 0x44c436b0, 0x9aa2c143, 0x1f69c87a, 0x79070556, 0x5f6db2df,
  213302. 0x35f3117b, 0xed56ba82, 0x85761f41, 0x7d0afa48, 0xf831464f,
  213303. 0x3adce71e, 0xa99f2915, 0x116b7488, 0xb27bf693, 0x9bb9443a,
  213304. 0xa98a5a8c, 0x2ee5fde8, 0x7f878026, 0x1812acb7, 0x3a6f93dd,
  213305. 0xdc84bc92, 0xaf92a4cc, 0xf1d4995a, 0x3c2562af, 0x04ed899d,
  213306. 0xfd9fc33c, 0x4ed2a538, 0xc028ca94, 0x049ea726, 0xd0f367bb,
  213307. 0x3d108e05, 0x04924ffb },
  213308. { 0xc673562f, 0x06548e3d, 0xe2eae48c, 0xd3b33025, 0x5e1c6977,
  213309. 0xe61fd32b, 0x6ebe557b, 0x424e2064, 0x41d6e18e, 0x767391c0,
  213310. 0x14d7e95b, 0x4b8ebb8e, 0x20991b8c, 0x4ae8b7d4, 0xe01290d3,
  213311. 0xf8a0df66, 0x925e5f4e, 0xc97e24a3, 0x1508272a, 0x79a7b2cb,
  213312. 0x25072661, 0xb40b072e, 0x9062fa49, 0xdad9e182, 0xf3c53bce,
  213313. 0x8780a784, 0x9f142799, 0x58a82b76, 0xc1468426, 0x08cd849c,
  213314. 0xc380ae35, 0x4dfce809 },
  213315. { 0xd527b780, 0x45069cb2, 0x977930dd, 0xd52da015, 0xe27d0263,
  213316. 0x10cc600b, 0xbb2d1b2b, 0x34102c26, 0x554adf3c, 0x4c652623,
  213317. 0x45f0ff47, 0xd6891382, 0xca916e7c, 0x83fa8cc5, 0xd15c8d8a,
  213318. 0x1e10f139, 0x81dc56b3, 0xf173dc2e, 0x5c4ed9ba, 0x7fcecb04,
  213319. 0x47d01228, 0x307fd7d8, 0x9f3a532f, 0x24a57153, 0xe2153c22,
  213320. 0x59e9e81d, 0xe428a408, 0xc562595d, 0x9339bd23, 0xdc7daff8,
  213321. 0xb8a06802, 0x0d075908 },
  213322. { 0xde085f2a, 0x870af2a7, 0xbe99b2e5, 0x88fcd24f, 0x59ca413b,
  213323. 0x88c0d261, 0x8559f851, 0x1f02a2e4, 0xf622da0d, 0x83b96021,
  213324. 0x6dca3615, 0x5c05c2f5, 0x7910c682, 0x0148cf1c, 0x272695be,
  213325. 0x392f2896, 0xa8d64ef6, 0x883d0bb5, 0x1cfcbc52, 0xef0d2244,
  213326. 0x526117e5, 0xf5dafcec, 0xf04928e9, 0xb68612b9, 0x393f2e2a,
  213327. 0x283f744d, 0x700c1151, 0xfbeed7ed, 0xa4360dfe, 0xf2cde215,
  213328. 0x2f08535a, 0x24fa961c },
  213329. { 0x616df7f6, 0x0767db3f, 0xfbd90326, 0x643057d8, 0x6e82d544,
  213330. 0x174daa90, 0x689643db, 0x2284f345, 0xcc89a060, 0x18b191df,
  213331. 0xd6c27d12, 0xbab46af4, 0xc9895145, 0x5a57f486, 0xcc942f9e,
  213332. 0xc03214e9, 0x41950158, 0x273e1c8f, 0x39ad43ab, 0x8ceb759f,
  213333. 0xe50ee173, 0x5e1b8b7f, 0x8f4d7d4e, 0xf635b1fc, 0x755603f3,
  213334. 0x8eff77e3, 0x7752fa60, 0x201f61d1, 0x4a6fb6e1, 0x94d7a03d,
  213335. 0xfc4f0114, 0x371cc23d },
  213336. { 0xda90c351, 0x289b115d, 0x364d9c06, 0x6d196ebf, 0xf650b31b,
  213337. 0x77a89202, 0x6f57642f, 0xcc28c164, 0x08100127, 0xdc4f7e36,
  213338. 0xdc4c807b, 0x8836cd08, 0xe00240f2, 0x1280f156, 0x99cb3953,
  213339. 0x3f9a6d78, 0x3a802038, 0x40a494d3, 0xe87d3474, 0x45697e91,
  213340. 0x26dde24a, 0x70d97d07, 0x7640c30e, 0x06f6a58d, 0x5ba6e6c6,
  213341. 0x03c2c0e8, 0xf1bc13e8, 0x330f6a7a, 0xc9f4d78f, 0x3e602e4f,
  213342. 0x0c80fb7f, 0x92b6bca0 },
  213343. { 0x5f00822e, 0x2e3d5c83, 0xb8b16f12, 0x0e825712, 0x92b0a330,
  213344. 0x81c329c4, 0xa7cc1954, 0x6b4e32ad, 0x1bb1413f, 0x0bee9cee,
  213345. 0x4a92ca27, 0xedfb7baa, 0xea3b9153, 0xcd472afa, 0x00f0c0f9,
  213346. 0xe8f09e7e, 0x5cdebb70, 0xa4e1d872, 0x4a9b63b6, 0xfe2bae08,
  213347. 0x3fd58f65, 0xf40141b8, 0xa3b62759, 0xd7ec5eda, 0x790e3088,
  213348. 0x9aaf6e67, 0x1f277e31, 0x215ad830, 0xcf33871c, 0xe7db4b98,
  213349. 0x4f02f89d, 0x71ff62c9 },
  213350. { 0x2a4a84d9, 0xaa4c7102, 0x5ebc71e6, 0xe2ee4acd, 0xf1cd6578,
  213351. 0x3b11a8a5, 0xfff120a5, 0x83f5ef9f, 0x09e65033, 0xa4c598e1,
  213352. 0xca044180, 0xe1e9f990, 0xf59828c1, 0x8b832d46, 0x33af536b,
  213353. 0x753f28a0, 0xb6d4f68a, 0x92edc4b1, 0x72ccd1f0, 0xedde692a,
  213354. 0xd2226432, 0xd3aa0f7d, 0xa3d2661c, 0x38dbb63e, 0xfdc37dda,
  213355. 0xf1e19fc6, 0x84ef6b4c, 0x6c18b350, 0xdf1bba69, 0xe6a83fe9,
  213356. 0x5f958273, 0x40fd47e7 },
  213357. { 0x267140a4, 0x5b88b746, 0xeab6f2fb, 0x6dbbfc1e, 0x69862548,
  213358. 0xdd9ec88e, 0x2eb6efc2, 0x69beeba1, 0x8ac8ff88, 0xcfc2214a,
  213359. 0xb5a21950, 0x95d5c96e, 0x4171fb69, 0x93389c05, 0x1b468337,
  213360. 0x2d85d452, 0x4113425c, 0x14d68a08, 0xec6c2174, 0xe52c0139,
  213361. 0xf730084d, 0x20cf0b97, 0x1f578aa3, 0x1ac16a26, 0xf9b6ae43,
  213362. 0x18b9fab3, 0xd854a695, 0x68d82111, 0xdffbe286, 0x0b334d98,
  213363. 0xe639338c, 0x5b1c1157 },
  213364. { 0x72b6bb8f, 0x90edaab1, 0x02fc92c2, 0x8dc64ed2, 0xfe694c73,
  213365. 0xf42ba3c5, 0xcb54dce4, 0x316dc65f, 0x632420dc, 0xcb2d66a3,
  213366. 0x056dcf94, 0x16e706e7, 0xa4f32c9d, 0x2809c764, 0xea6edca8,
  213367. 0xab18d830, 0x81c65f57, 0x4fd1ace6, 0x7da12c10, 0x1f91651c,
  213368. 0xc7791a48, 0x0ac3bd66, 0x785e67a3, 0xb6ad1cf4, 0xda0fd591,
  213369. 0xe4d3fc44, 0x6e1c6344, 0xce164801, 0x33e50ab3, 0x84de9cb8,
  213370. 0xa756eef4, 0x963ab83a },
  213371. { 0xdf4ea5a3, 0x944b47d8, 0x5cfe45fe, 0x96568815, 0x8a3c3564,
  213372. 0xd16e7d58, 0xe7c99e15, 0x84e55b3e, 0xf55071bc, 0x3fee204d,
  213373. 0x04057dce, 0x71006f29, 0xbba75570, 0xfe8c390d, 0x3319adac,
  213374. 0x3645bcb6, 0x7c20bfd8, 0x8189e8b0, 0x7d7d9578, 0x8e550969,
  213375. 0xb99f4e3b, 0x037d1321, 0xa60cfb6a, 0x011b2521, 0x837382da,
  213376. 0x66594aaa, 0x83c1dc07, 0xc89b91fd, 0x076b9884, 0x6b82b899,
  213377. 0xbe45c558, 0x443480fc },
  213378. { 0x9114221a, 0xf8ffffb4, 0x3e857a7a, 0x4aec4f2e, 0x0fa54787,
  213379. 0x42e2d0e4, 0xd6f96152, 0xef3e6b31, 0xfbfe9b77, 0xb2296537,
  213380. 0xfb43a86a, 0xc2a9d0f2, 0x24572ac6, 0x241284ed, 0xe721ba7b,
  213381. 0xa3868917, 0xc117a78d, 0xdbef7c00, 0xd31605ac, 0x38149071,
  213382. 0x065a8ee9, 0xc2dada9e, 0xc442be82, 0xd5b138d8, 0xf6d72b58,
  213383. 0x9b6c224b, 0x8eb03e6d, 0xb9d355cf, 0xa1700371, 0xab6d1eb0,
  213384. 0xcffaa7eb, 0x97118a88 },
  213385. { 0xcdecb5d8, 0xbf9c59a2, 0xa93a6866, 0x8083c81b, 0x04774fbf,
  213386. 0x24e0dd81, 0xa02070b4, 0xe779a3ca, 0x0fbfb781, 0x9d352fbb,
  213387. 0x3ef2a1c4, 0xa8b0d820, 0x14b3e501, 0xb858637b, 0x8a882ff2,
  213388. 0x5ba70a49, 0x3b06efa5, 0xa2730083, 0x102fee2a, 0xa42c02f4,
  213389. 0x8a0223a5, 0xe4e76299, 0x85c3fc72, 0xdba2ba26, 0xfe52eae7,
  213390. 0x554fe763, 0x270f45f6, 0x30b5405a, 0xa573387c, 0xd56a177a,
  213391. 0x4b71fa82, 0x17c0778d },
  213392. { 0x2735e37b, 0x0e6dff1d, 0x656ec572, 0xc9884e56, 0x9ebba978,
  213393. 0xa2f5ac9d, 0xba09f3c4, 0x40fa4518, 0xf5b04377, 0x8c3fa177,
  213394. 0x967a2eca, 0xa1a1decd, 0x0528bd40, 0x768bca70, 0x18691c4a,
  213395. 0xf224952b, 0xe86d5fd5, 0x16e12c45, 0x37859a6a, 0x7a0d9157,
  213396. 0xa0ffce0e, 0x723f4309, 0xa96cc9a3, 0x5a8db79b, 0x1ad23a38,
  213397. 0x6dd12ae0, 0xe2bf5d84, 0x9ffec3a1, 0xa452ed66, 0xd6ce84e1,
  213398. 0x571fe4c6, 0x1219d5c8 },
  213399. { 0x262969eb, 0x43eaa67f, 0x2f03e773, 0x3a3ab39d, 0x57bb0909,
  213400. 0xe6127e51, 0x8d150274, 0x0f82b0ed, 0xe580bdbd, 0xffffcad8,
  213401. 0xa9743e6b, 0x51d3d075, 0x8bac11d6, 0x1484bdb1, 0xeb24c388,
  213402. 0x95cd9990, 0x7fac67c6, 0x216a61d0, 0xa04e6b87, 0x4308f762,
  213403. 0xcba57cc8, 0x2865dd61, 0xd234a07a, 0x3c296b0d, 0x3a0793f9,
  213404. 0x76f92839, 0x0be29ece, 0x70b57e1f, 0x7e626f42, 0x1314a82f,
  213405. 0xd657f230, 0x2c8d7ab2 },
  213406. { 0x0825e4d6, 0x67cf5892, 0x6ef83b44, 0xdf51eaa5, 0x1310108d,
  213407. 0x63e665d8, 0x8dd0963f, 0x229f89f5, 0x9df6436a, 0x8c4b14dd,
  213408. 0xd45ebba7, 0x99dae469, 0x5a4df381, 0x118aab77, 0x29e37feb,
  213409. 0xda8978bd, 0xaca2d7ef, 0x69ced5aa, 0xc67d6a8a, 0x6c98d05d,
  213410. 0x77f84a34, 0x7474bf0d, 0xed8cd59a, 0xd4428b2e, 0xd1d398fb,
  213411. 0xb0fd1cd5, 0x94a20b11, 0x596013db, 0x1b404c44, 0x96eb705a,
  213412. 0x4b09d958, 0x2299d277 },
  213413. { 0xc64397e6, 0x5b9cd58d, 0xbf6dd31e, 0xac198f1e, 0x3e9f1db2,
  213414. 0x5866d8e1, 0x8fcdc68c, 0x405ae287, 0xe53c01fd, 0xa4b280cd,
  213415. 0x411db5f6, 0xdc963f2d, 0xbec4f8a0, 0xed5d5189, 0x916ee98b,
  213416. 0x336fd13d, 0x042df48e, 0x6925b1b3, 0xace0074e, 0x0cf56291,
  213417. 0x25317e95, 0xe8d38b48, 0x821c446b, 0xc7ad1d2b, 0xf0b65934,
  213418. 0x71c44135, 0x52ca0d50, 0x971b736f, 0x27b46c26, 0xaf9ffa57,
  213419. 0x1936618e, 0x21ac6779 },
  213420. { 0x2d7fbcd2, 0xab420e3f, 0x97bdfc18, 0x12722473, 0x4df5d4b4,
  213421. 0x492033f8, 0x3807b7d3, 0x6fcd4236, 0xb33c3625, 0xdfc19b09,
  213422. 0xa0f22814, 0x13d6f375, 0x037c19b8, 0x70978a59, 0x0ff27b9c,
  213423. 0x4f398997, 0x615a4389, 0xfc0e1a45, 0x3e602f74, 0xffa3496a,
  213424. 0xb261ca1c, 0xc3f1c431, 0xee0164cd, 0x612211db, 0xe7f7be9f,
  213425. 0x30463ee4, 0x92c2e1bb, 0x015f7e78, 0x24483a56, 0x663d88d6,
  213426. 0x0e62d9d8, 0x0e8ec1e7 },
  213427. { 0x8a0878dd, 0xa88ccc29, 0x6640071a, 0x99ac175d, 0xa5173617,
  213428. 0x90344820, 0xdd58a315, 0x316d023e, 0x88d221a1, 0x30785bd4,
  213429. 0x959c48e3, 0xb74b3de7, 0x4c67a771, 0x42ee0382, 0xe0b91453,
  213430. 0x59ef6cdd, 0x9b237e91, 0x7830ae28, 0x495d8325, 0xe1847a4c,
  213431. 0xd0773666, 0x67b1217e, 0xa294a325, 0x58192c86, 0x864d8326,
  213432. 0x76aa0f56, 0xf4b13e5b, 0xe2a2bd12, 0x1b6b73fd, 0xd850c1c0,
  213433. 0x5d103635, 0x653a795f },
  213434. { 0x50dcb199, 0xcfe28985, 0x7fa02b60, 0xb35b8e5e, 0xc97603d0,
  213435. 0xbca7d7c3, 0x27f131b5, 0xb0e5288d, 0xe2b12d52, 0x3aa704de,
  213436. 0x1db725c7, 0xe206b1d8, 0xc5d1b113, 0x0b12839a, 0xdb45d763,
  213437. 0x14f970cb, 0xb2125e8e, 0xc997f93e, 0xee7daa26, 0xbd75739c,
  213438. 0x1fef20e9, 0x46ecbd3f, 0x7c6a42b1, 0xf994a114, 0x27fb0fd1,
  213439. 0xd289eb4f, 0x9a40da4b, 0x11186d31, 0xfb9d7976, 0x083f65a5,
  213440. 0xd444675e, 0x30dfc47b },
  213441. { 0x9eaadfe8, 0xbcfc5ae2, 0xb4d4e812, 0x25027e54, 0x8b533561,
  213442. 0xab0702df, 0x56a6a214, 0xa2b9c204, 0x3059068e, 0xb1a3df7a,
  213443. 0x9883110f, 0xa3514b21, 0xc4b78e1c, 0xb7be2336, 0x3e2f6984,
  213444. 0x17073ce6, 0x2ddf7ac6, 0x86e114a6, 0x07d7c3c8, 0x276192bf,
  213445. 0xeb1ae289, 0x5da69e0b, 0x25184939, 0x983af175, 0x407a3aa0,
  213446. 0x9ac52a4d, 0xae0fe218, 0x1535c7da, 0x397f2501, 0xe16fe872,
  213447. 0x54c212cf, 0x572a591f },
  213448. { 0x09a5553a, 0x49668419, 0x327733bc, 0x3f054318, 0x3eefd690,
  213449. 0xf9ceb4b2, 0xf22126d4, 0xbd3cbf9b, 0x2fed9578, 0x6d9671c0,
  213450. 0xca0306d8, 0xbba597ce, 0x3d674fe5, 0xb705ed61, 0x67f33f76,
  213451. 0xf1d3622b, 0x11cb8c31, 0x15bcf3c6, 0xe53d1aa9, 0xa38467dc,
  213452. 0xf908ab43, 0x902fe929, 0x8d15767a, 0x6e3e499d, 0x90afd07b,
  213453. 0x8142db5c, 0x6c8b190e, 0x120c6fbc, 0x24919a4e, 0x80c86553,
  213454. 0xd8c82c3c, 0x65c2cbe1 },
  213455. { 0xa660bb63, 0x684cda20, 0x86e86245, 0x27dc3b0a, 0x6ba0eed7,
  213456. 0x76472cf6, 0x679dd158, 0x79c162e5, 0x08452d44, 0xb6884277,
  213457. 0x413f579e, 0x829bc6b3, 0x95011770, 0x92ea15ec, 0x47738183,
  213458. 0x5e34e300, 0x73e1d2f1, 0x8c3ca349, 0x229bd3de, 0xa5c4f1dc,
  213459. 0x94ef7ed3, 0x783eff1b, 0xdfae7a1a, 0x46db738d, 0x1a099852,
  213460. 0x4353d72e, 0xa0dcf4ab, 0x2533ad58, 0x0e7888b9, 0xd8055016,
  213461. 0x3ba77f66, 0x831440d5 },
  213462. { 0xf611b2da, 0xf43e2e32, 0xd0fa46ac, 0x5d066e29, 0x820b3c0d,
  213463. 0xe897f3e8, 0x1d3e44f0, 0xc45c28e6, 0xdfd27a66, 0x929d7f66,
  213464. 0x101e8517, 0x735b860a, 0x3de078dd, 0xea3fce98, 0x638ce11a,
  213465. 0xc9977db5, 0x48536b3b, 0x0488382f, 0x64cadfc6, 0x7e0c7a3c,
  213466. 0x82147b71, 0x3cd17f7f, 0x1b411e3e, 0xe95663cc, 0x985fb46d,
  213467. 0x5739ac8f, 0xbcf119ca, 0x385399cd, 0xe15a2815, 0x4a985a70,
  213468. 0x6d5f4566, 0x504c3a8a },
  213469. { 0xb8fa53c7, 0x00b55283, 0x509474e3, 0x985cff38, 0x437ce25f,
  213470. 0x234d241c, 0xe5a129ed, 0x29832430, 0xaabcc674, 0x6ad38956,
  213471. 0x7ee81ee1, 0xa2dc001d, 0x670b2702, 0x4c23c6b6, 0xa6e8a3bb,
  213472. 0xb35e567e, 0xa69673ea, 0xbc70b3ce, 0xe6e28eac, 0x85a7a9c3,
  213473. 0x5537b7da, 0x2ae684de, 0x6de937dc, 0x5ecac3e5, 0xf8430422,
  213474. 0xbf2ea6c9, 0x77fdc520, 0x38caf7d0, 0x69f56add, 0xc27af0b1,
  213475. 0xc71d21d2, 0x496e4699 },
  213476. { 0x9fa93467, 0xba14fc82, 0x0eb2a614, 0xc2e37684, 0x4833e09b,
  213477. 0x659bcfaf, 0x3686bdcc, 0xbc859752, 0x81f3216a, 0x40bfd080,
  213478. 0x17c081b8, 0xc463bda6, 0xbb04793b, 0xbd01fa86, 0x2cd640c5,
  213479. 0x5a21ece6, 0x2203d5c4, 0x97bf6a54, 0x951167b7, 0xceb40edc,
  213480. 0x765ba268, 0xd67aacaf, 0xaeab51f9, 0x8ba0d9e9, 0xb0d6863a,
  213481. 0xc14b215e, 0xe5f06952, 0x354cdcdb, 0xcb3744b5, 0x4f2b5ccf,
  213482. 0x13037fe8, 0x13389173 },
  213483. { 0x45003cd1, 0xee680640, 0x44ae2ac6, 0xfdac17bc, 0xde8e5314,
  213484. 0x4bcd419f, 0xc7cea95c, 0x81e34eb9, 0x38f37e01, 0xbb57762d,
  213485. 0x260990c8, 0xecc4cfb0, 0x50a34a7b, 0x0bc493f9, 0x543304ef,
  213486. 0x68074172, 0x6bc8aa2a, 0xaec0fcb2, 0x3b45fea5, 0x9e7a9b46,
  213487. 0x55fbdbac, 0x4bb2952e, 0x0485dff4, 0x50f0c0a6, 0x4dea4796,
  213488. 0x02c5104d, 0x695e3a02, 0xd2cefa09, 0x6da1f345, 0x4c8102b4,
  213489. 0xf3833fbd, 0x422eb573 },
  213490. { 0xa6ad3f47, 0xac592eb6, 0x9714ba0e, 0xb0861f6d, 0x07281459,
  213491. 0x57c1e919, 0x64ea5803, 0xcf7c94e2, 0x54b12723, 0x725376ac,
  213492. 0xdafb736a, 0xf2a6ba41, 0xcba03cdc, 0xc89e8920, 0x5b0fd3ad,
  213493. 0xf2e20cb4, 0xd66059fe, 0x26ea5a54, 0x889df8bc, 0xee63fa8b,
  213494. 0x66a3f2bf, 0x40f1c7e1, 0x747312e1, 0x09febc9c, 0x727999ff,
  213495. 0x7d19b9c2, 0xb7fd2b05, 0xa9fbbb4c, 0xa0da2dc6, 0xcfba27d7,
  213496. 0x2c252582, 0x368541cf },
  213497. { 0x22799d37, 0x510d3c9e, 0xacfa333a, 0x1b677de5, 0x080f795b,
  213498. 0x4e6ae18f, 0xafc8dfc2, 0x69b53c2a, 0x0e842dc2, 0x797541b6,
  213499. 0xac067fe8, 0xd5a6f2af, 0xbd07d877, 0xd0208a03, 0x654be2f2,
  213500. 0x34b473f0, 0xf515e23e, 0xe67c102a, 0x2ac1af48, 0xb00dbf9d,
  213501. 0xb6a13d00, 0xe264fa41, 0x97e94c11, 0x1669786a, 0x86a586f4,
  213502. 0x09d8cf2d, 0xc7f927e9, 0x073bf869, 0x2241a566, 0xb8977880,
  213503. 0x22261334, 0x59a5bf59 },
  213504. { 0x81347191, 0xe9d1c91e, 0xeb969972, 0x186c1abc, 0xa9d46a7f,
  213505. 0x07888767, 0xdaa7d397, 0xda93cfcc, 0xd91b9aa0, 0x08bee9f1,
  213506. 0xf8dd3c6c, 0x8267fd78, 0x94228100, 0xf93860d0, 0xdadb47fb,
  213507. 0x6a6a71aa, 0xa6156f8a, 0x9caa06b7, 0x39848bc9, 0xaa1b05e0,
  213508. 0x2aaa9135, 0x36ddc237, 0xb13f3bd1, 0x77e7e079, 0x4acc5f4d,
  213509. 0x8d0b5cbe, 0x984cfd36, 0x04da45f8, 0xd3d3e0f8, 0xf14ef618,
  213510. 0x43eb799c, 0x467564c1 },
  213511. { 0xb6fff5d7, 0x8d725904, 0x92dc4752, 0x037f33af, 0x6d20b8aa,
  213512. 0x9095d575, 0x43baec39, 0x32235fc1, 0x68a2b9b0, 0xa2feb4af,
  213513. 0x94d35c61, 0x61c50318, 0xea877486, 0xac92b6a2, 0x011bc6f3,
  213514. 0x8eb48b15, 0xc79edcb2, 0xa28fe128, 0xa5d2a006, 0x9f71bc0c,
  213515. 0x2f15b850, 0xf3167732, 0x7a036218, 0xfe8d728c, 0x4f81e09e,
  213516. 0x068f39cb, 0x7b7c50d9, 0x1773f016, 0xed6a1e03, 0x0d0f7adb,
  213517. 0x4ee984d5, 0x8a0dee16 },
  213518. { 0x47366e6f, 0x504991bf, 0xe86c3005, 0xb8084d9f, 0xa40cce36,
  213519. 0x14c4c751, 0x3f1961e2, 0xbbb46aa6, 0x40445e43, 0x56a785f9,
  213520. 0xc91e215f, 0xdb8d1b57, 0xc7ee808d, 0x6a8e453e, 0xbbaa1e8c,
  213521. 0xc0367ef8, 0xe3e18109, 0x310d91f1, 0x7e20a2c3, 0xf97cfd0e,
  213522. 0x554cc277, 0xf1e80c84, 0x7b628403, 0xe89bbc1d, 0x3fe0a17c,
  213523. 0x7778a966, 0xc1f00073, 0x9e9db19f, 0xb6f6bed2, 0x2ce7fe7d,
  213524. 0xee97ce23, 0x7b04b5d2 },
  213525. { 0x82c5faf8, 0x5b546bc7, 0x8eb81097, 0x1a734c5e, 0xe77851e0,
  213526. 0x3d566861, 0xe956d51f, 0x833a1013, 0xc3c3c37c, 0xc7351731,
  213527. 0xe0c148ec, 0x607738fb, 0xe1bbef41, 0x2ec6f0bb, 0xcfa51857,
  213528. 0x0aa2ac6e, 0x66e3adf0, 0x072902d7, 0xc622d6e3, 0xcd4d5089,
  213529. 0xa6dd802f, 0x3ae21b23, 0x33886372, 0xe5465a55, 0xa8d81822,
  213530. 0xd85119a0, 0x3786977a, 0x4f14d032, 0x9c7b272c, 0x515b081c,
  213531. 0xc99be31c, 0x1c6a95a4 },
  213532. { 0xc2821363, 0xa6b14ad5, 0x4d17de1c, 0x829c1823, 0xccade848,
  213533. 0xaef5d2c4, 0x82489e27, 0xf412ab39, 0xf081d927, 0x92c9c098,
  213534. 0x75cbad1f, 0x6f87bdf4, 0x1a1d9fb1, 0xf4aadab8, 0xb75f3b76,
  213535. 0x475a7923, 0xdbbba8fe, 0x99dd0ad6, 0x4b70ab45, 0x836f6164,
  213536. 0x34bd9af1, 0x2a464881, 0xba9abda3, 0x5c91226e, 0xe65625fb,
  213537. 0x4cec8709, 0x0818e4be, 0xd4b3919e, 0x14f6879c, 0xa5c09c84,
  213538. 0x30a864c9, 0x72708a02 },
  213539. { 0xf34a466c, 0x4f33c0b1, 0x7f9d45ba, 0xa1bae09c, 0x0e28785c,
  213540. 0xd70f0fee, 0x90880881, 0x824c7146, 0xbb043da3, 0xe2416c2a,
  213541. 0xcec6f432, 0x733da713, 0xc9793e1c, 0x2b590649, 0xb35c9365,
  213542. 0xdb62d5b0, 0x3e5c1b2a, 0x355eb6e2, 0xbb16b515, 0xcfe8b5ce,
  213543. 0xf709691c, 0x9e081869, 0x61a85bd5, 0xc865f9fb, 0xfae103f7,
  213544. 0xf169d3cc, 0x73467e9d, 0x9525c473, 0x43695113, 0x7db55c0b,
  213545. 0x73265d21, 0x7491c74c },
  213546. { 0x80d2b94d, 0x312ed5bf, 0xba4b260b, 0x1b8ac633, 0xd62219a1,
  213547. 0xac86c58c, 0xaeb82c8e, 0x317ccf6b, 0x59ef9ced, 0x2dfb29ee,
  213548. 0xe42bcd5a, 0xdaa7d898, 0x5974b201, 0x93e295c8, 0xd9fc5adc,
  213549. 0x69e75784, 0x012aa3ba, 0xd6c4709f, 0xc85d3cb9, 0x1fda9f37,
  213550. 0xd3dd4abd, 0xe5487e25, 0x0b3ba22e, 0x00fd4b01, 0xc6e8dcbb,
  213551. 0xcb591493, 0xbce68664, 0xb7329fab, 0x68906b76, 0x6829d1c2,
  213552. 0x74176841, 0x8bcfd3e5 },
  213553. { 0xd3c8c314, 0x06882734, 0x11870833, 0x95f0b2f1, 0xc068ba16,
  213554. 0xb937f7c3, 0x77924787, 0x5365e0d8, 0x1f992227, 0x15527e5e,
  213555. 0x27dffd4f, 0x0a069648, 0x2f586389, 0xd58b3df2, 0x6af20ead,
  213556. 0x83446b89, 0x50746257, 0x09d7970b, 0x4022a691, 0xd9e8d206,
  213557. 0x671ec379, 0xd1e5f8af, 0x057fe91e, 0x6f542509, 0x52890418,
  213558. 0xf14dda81, 0x1db932ad, 0xbd78010e, 0x905a9378, 0x3e18d1e4,
  213559. 0xbd37ab49, 0x53cadcf7 },
  213560. { 0x5e53d0ff, 0x1bb5edf7, 0x888abf67, 0xd886606c, 0x12206d15,
  213561. 0x6491b0f8, 0xe22b6a33, 0xb3018345, 0xb173b317, 0xaba6794b,
  213562. 0x7dc9e595, 0x8c1e5867, 0x239624d1, 0x4e106482, 0xda55dd53,
  213563. 0x61752e59, 0x9e42879c, 0x018b4eab, 0x491f2bed, 0xcaf6784b,
  213564. 0x1e79429e, 0x3dcdb9d2, 0x10f26224, 0x36941485, 0xa650ec5c,
  213565. 0x106f190a, 0xb69a9760, 0x7542a5ae, 0xc32d1046, 0x69bd75e9,
  213566. 0xbf8c62b1, 0x90849964 },
  213567. { 0x5a93c661, 0xb1390cf6, 0x9db5f056, 0x18486264, 0xa51a1788,
  213568. 0x92a93a9d, 0x6772de9a, 0x1b0cbb8f, 0x7c71487c, 0x6e67febd,
  213569. 0x4e62423e, 0xf9b4382d, 0xbb5a42f8, 0x96fda50e, 0x6089a4f2,
  213570. 0xc921b337, 0x875ec516, 0x49d32d7b, 0xc410124b, 0xbd86d2ca,
  213571. 0xc421fb7a, 0xf6862209, 0xf6b7de33, 0x3e1949ab, 0xe93c9268,
  213572. 0xcdee18f0, 0x08dc4cc0, 0xd4edbd5e, 0x73580d22, 0xc2b75be4,
  213573. 0x468cd7e8, 0x3d7f6ffa },
  213574. { 0xdffbd5d1, 0xea7b290c, 0x970338df, 0x9d759da6, 0x90feedc9,
  213575. 0x56680b08, 0x42dce68e, 0xbc690af5, 0xb2ae4d82, 0x8519df2b,
  213576. 0x7f195b60, 0x5612467f, 0xd83c21f4, 0x659a342c, 0x55651633,
  213577. 0x55771bf5, 0x548ba562, 0x5fc68935, 0x9492f23a, 0xb5419203,
  213578. 0x9c9c6017, 0x567528e3, 0x511e6019, 0x3f064ed4, 0x1d16a555,
  213579. 0x303f9eb9, 0x2254abee, 0x3e18c4fd, 0xfd434e7c, 0x40994d6f,
  213580. 0x6dde74e6, 0x8fb12d3f },
  213581. { 0x293cb7a4, 0x6c6381a2, 0xb87b7e4d, 0x453e09f0, 0x078ac3ef,
  213582. 0x4f212823, 0x578cae91, 0xe89ffad0, 0x716ba4dd, 0x4a2b696a,
  213583. 0xf6f580a0, 0x14681a14, 0x4c2f1307, 0x1358f97b, 0x2932fb89,
  213584. 0x87896996, 0x268a5af7, 0x29dd850a, 0xfe239f83, 0xaf771f6d,
  213585. 0x4f47499d, 0x5f20fd2e, 0x867ca0e9, 0x9b643e77, 0x375981ec,
  213586. 0xe7858ecd, 0x19ab1c97, 0xbe946a59, 0x06ff3453, 0x4f9303a2,
  213587. 0x75d237b1, 0x3fcc6731 },
  213588. { 0xdf21f920, 0x509debd5, 0xc1401b90, 0xfaf70e1f, 0x95a64aaf,
  213589. 0x2429cbfd, 0x2c37a122, 0xf2120855, 0x7deb926b, 0x1d4c93f4,
  213590. 0x9fb3f1dc, 0x12f3e4c0, 0x5b51bc46, 0x56085a59, 0xf10fdbd2,
  213591. 0x2a2f5d62, 0xdf0cb3c2, 0x60dd62cf, 0x6b0f254b, 0x154424a3,
  213592. 0x564612b7, 0xc3a5a05d, 0xa1f5249c, 0xbebe30cf, 0x7e62a188,
  213593. 0x24ec6903, 0xaf429939, 0x75f0fbac, 0xb3fa8685, 0xd41345dc,
  213594. 0xc7151c34, 0x645146fd },
  213595. { 0xba1924f9, 0xecec633a, 0x006326e1, 0xbba6f136, 0x7e50fc17,
  213596. 0x203757ac, 0xef3d8e00, 0xca531919, 0x51dc5a74, 0x9545a6aa,
  213597. 0xd31412b8, 0x6e21d58f, 0x7bb1d000, 0x01bc3005, 0x6ed1a9c3,
  213598. 0xf1789c69, 0x9858fa48, 0x7af2d35f, 0x8197be85, 0x434d09b9,
  213599. 0x29aa265d, 0x1dc07755, 0xc058fa80, 0xcad03be7, 0x54ba14ce,
  213600. 0x92d70a9f, 0x6c050a74, 0x6dc78505, 0x4d005dda, 0x2a7ca4a9,
  213601. 0xabfb9f2e, 0x448d3d72 },
  213602. { 0x29b33989, 0xdc56f145, 0xa9ae815a, 0x868351bc, 0x4b074414,
  213603. 0xb3f45613, 0x3cd9f33b, 0x955ce42a, 0x5ff6e4a3, 0x13ade4ec,
  213604. 0xa50eaa91, 0xd3aac715, 0x5666efdf, 0x0c61ec99, 0xf6a4470a,
  213605. 0x108a28b8, 0xe54844c9, 0x402ef584, 0xd0e2f337, 0xb825b162,
  213606. 0xb46f7cbc, 0x3dcd131f, 0x96f2fd89, 0x208178ec, 0x25928c78,
  213607. 0x4d8c5d67, 0x9963c459, 0x285a33df, 0xd92a309f, 0x72497175,
  213608. 0xcb7019a5, 0x76881479 },
  213609. { 0x91767eed, 0xba43a114, 0x92bf65db, 0x5e11b9ad, 0x03a5e21a,
  213610. 0xe8a22ce0, 0x2a335415, 0x63604421, 0x4a9ead62, 0xc2c563b4,
  213611. 0xa0b2aee5, 0x4bc06264, 0x8bf2e1d7, 0x75b8d575, 0xd08a265d,
  213612. 0x1cff0ee7, 0xb0b712a7, 0x17914e1d, 0x4b18692d, 0xc35925d0,
  213613. 0x56cce815, 0xde253f4c, 0x9fff0e3a, 0xa479241c, 0xddabed19,
  213614. 0x50b9d06e, 0x59fae506, 0x67135260, 0x532ce180, 0xf37600fb,
  213615. 0x5e5a8626, 0x670eb01c },
  213616. { 0x73cdbb43, 0xdf73c0af, 0x7f2431ad, 0xcf08ecc5, 0x2a1a3845,
  213617. 0x91780541, 0x9224ddf1, 0x69a104f2, 0xbeac7eff, 0x4352f38d,
  213618. 0x7c2d1322, 0xfc3b3b4e, 0xb5e4b476, 0xa69e9430, 0x975a46f0,
  213619. 0x7d932340, 0x5d64eece, 0x8093899e, 0xdb2345e9, 0x7b821250,
  213620. 0x7f4b796b, 0x23552932, 0x4bb90b1f, 0x2ee9cc15, 0x9112f7d6,
  213621. 0x1fa9c8f5, 0x1cbaae32, 0x2d0f2f98, 0x0075166a, 0xb77f0366,
  213622. 0x635dff27, 0x504852e7 },
  213623. { 0xa2f392fa, 0x2f0f3ce5, 0xec6c9078, 0x326c076a, 0x84baaaf6,
  213624. 0xad01de92, 0xcbe8e993, 0xb01b16d3, 0x2d950908, 0x71305c24,
  213625. 0x3853af38, 0xc66fd617, 0xd3c429a0, 0x7735140e, 0x1fabf027,
  213626. 0x8a31b12a, 0x058b3177, 0xa0530002, 0xa9c7deb9, 0xabffd9fc,
  213627. 0xe8667d30, 0xd05ef69b, 0xe9a9e13f, 0x2f3a7308, 0xb91eae9c,
  213628. 0x3f4c9a19, 0x618ce6c4, 0x50d0cee7, 0x5240f8b0, 0xfb24dc40,
  213629. 0xf7e90cc4, 0x992fe151 },
  213630. { 0x38f197aa, 0x4454db31, 0x87872f98, 0xa4ded69d, 0x44f0a828,
  213631. 0x97b427b0, 0xa31e48c6, 0x9821e1ae, 0xdd98efec, 0xe38cb09f,
  213632. 0x480cb3ae, 0x20b84fa8, 0x47475573, 0xba5bb4a8, 0xcd50e96b,
  213633. 0xa9be080a, 0xef103550, 0xc4451e9c, 0xc441325c, 0x626ee75f,
  213634. 0x38a5e33d, 0x6eea5e98, 0xa2b0abd2, 0x7321beb9, 0x9b6082a9,
  213635. 0xca92e484, 0x992bcc2a, 0x1dc8168a, 0x9c8eb9fb, 0x134ecf4b,
  213636. 0x4c5b71e0, 0x5a68bfa8 },
  213637. { 0xff0a2bfb, 0xb4ff3b45, 0x5502f8b0, 0xd105fff9, 0x5b1c0c26,
  213638. 0x14de5885, 0x0d3b9d04, 0xed16865b, 0x026d3917, 0x2f5a2453,
  213639. 0xf4db3c0e, 0x6a22f493, 0xe2418f2e, 0x4871548a, 0x509bef61,
  213640. 0x6ab363a8, 0xb8cbbbec, 0x91ca1e3a, 0x4011a396, 0x71e0dc98,
  213641. 0x0d5ca577, 0xff982e0a, 0x81897bc1, 0xeb40b045, 0x085ad5e7,
  213642. 0x4bc24a46, 0xa6337b7c, 0xd15c8fa0, 0xbef1628f, 0x56ce6ef7,
  213643. 0x9f5ef439, 0x78acfdf9 },
  213644. { 0xf8520189, 0x45bf7f15, 0xc77f61c4, 0x954202a0, 0xdfa22e1b,
  213645. 0x39edc6b9, 0x1f4a3487, 0xd2d60267, 0x4814cc52, 0xcd933929,
  213646. 0x05e9f123, 0xde76a124, 0xae36b6f7, 0xe2306ea0, 0xb83a58e0,
  213647. 0x53815218, 0xa041231a, 0x9862bb76, 0xbf31be71, 0xe8da253c,
  213648. 0x37de861f, 0x2dfc5332, 0x90ae4890, 0xf25c93f6, 0x8baa6ed2,
  213649. 0x66bcb8f0, 0x908b4a29, 0x6f10ae0f, 0xb061c949, 0x8cb4b48c,
  213650. 0xd075a366, 0x0ad92d73 },
  213651. { 0xc2ca548a, 0xbfb95fed, 0x80cd89ab, 0x4778c620, 0x3466c280,
  213652. 0xbe99154b, 0xd4be8902, 0xea3be093, 0x13e681ed, 0x847b7995,
  213653. 0x02f40161, 0xf22a8f4b, 0x4aeb7fe8, 0x3ef2cb4d, 0xb3aed5f6,
  213654. 0x9adc5151, 0x98c31163, 0xec1ccfd1, 0xa3d7d88f, 0xdc2ac17b,
  213655. 0x46421097, 0x08fa64d3, 0x94b90bcf, 0x5ebf80b7, 0x0b50a9eb,
  213656. 0x1b78b4ba, 0x279aa66b, 0x1a4fe934, 0x075b3ced, 0x8ef4dcaf,
  213657. 0x70a6e9ae, 0x95bbd8a0 },
  213658. { 0xe614bbd0, 0x59f92495, 0xb823e363, 0x7567a887, 0xfc1bd6a7,
  213659. 0xe247c9ec, 0x8e835c42, 0x2bfaaf47, 0xaade066a, 0x314ef4e0,
  213660. 0x5c16d336, 0x072baa63, 0xe2f0e389, 0xfa429c71, 0xbd07d90f,
  213661. 0xcac1e5d0, 0x514f5c04, 0x69ff35ea, 0xc0554ec1, 0x893053fc,
  213662. 0x2a35947f, 0xab1d86b7, 0x2aebe487, 0xe29fb060, 0xdfb9cf21,
  213663. 0xa0a10d6d, 0xf20dfcf5, 0xad147059, 0xb8867a2a, 0x480dc66f,
  213664. 0xc125a919, 0x375a884f },
  213665. { 0x1217f7ea, 0x178cbe2e, 0x875c6dab, 0x1a161e2a, 0x1bdb1a54,
  213666. 0xf7707ec0, 0xe4fd73ca, 0x678864a0, 0xd13a0d86, 0xbaebc664,
  213667. 0xc8d30668, 0x40325f99, 0x2f1c5950, 0xb93ed9c9, 0x541e0667,
  213668. 0xfdf36763, 0xb91a6763, 0xfd97fbb0, 0x6079c9a0, 0x26aa69ea,
  213669. 0x1eaa8c47, 0xc7303c80, 0xafa63c55, 0xdec75c81, 0x4fd12adb,
  213670. 0x01cdcde2, 0x1968838a, 0x9fe0dda7, 0x38415379, 0x66bb093b,
  213671. 0x08cb84ec, 0x268d818b },
  213672. { 0x41580555, 0x73dae358, 0x473d103b, 0x4fc32e67, 0xbeccc1ab,
  213673. 0x240c1013, 0xb24ee9de, 0xda4099f2, 0x9fa8e066, 0x37b0cb5b,
  213674. 0x6438d7ee, 0xb5ae04e4, 0x2b720140, 0x7f7d3164, 0x339e4a78,
  213675. 0x86ef4edb, 0x3a7d8375, 0xa5e77eed, 0xbd707c2e, 0x883fad37,
  213676. 0x0f979189, 0x816b633a, 0x2e7a208e, 0xe24c028a, 0x4435516a,
  213677. 0x1171fe3c, 0x4f5f2bf5, 0x3eb93b33, 0x01b53a56, 0x8419ed4b,
  213678. 0x056ca44b, 0x8b02735c },
  213679. { 0xe1019195, 0xb89bb464, 0xf3fc28c1, 0x1de4c026, 0x2bfc3b21,
  213680. 0xac120e6e, 0x91bdf92f, 0xec71bc5a, 0x0d995bc9, 0x485d7ab4,
  213681. 0xe6491ffe, 0x97c6768e, 0xafbce265, 0xd9552d19, 0x8e1b76c2,
  213682. 0xbae6c7fe, 0xd7e3ad1b, 0x167d8281, 0x5e989734, 0x3e149af9,
  213683. 0x8a0c8182, 0xd1f0024c, 0xc3006c0d, 0xf571ffdb, 0x58773d4c,
  213684. 0xb32ecf7e, 0xfd3540d8, 0x5822a782, 0x04365042, 0x5ab45c3f,
  213685. 0x4b4d85fe, 0x400e3aa0 },
  213686. { 0x5e46e4a2, 0x47321649, 0x24136074, 0x37a2ed64, 0xc60ec77d,
  213687. 0x659223b1, 0xe5e0ac2e, 0x5e13aac3, 0xc5107ab7, 0xda17c41b,
  213688. 0x73c253db, 0x65b22ec9, 0xa5012296, 0xff3867b8, 0x0621a99b,
  213689. 0xfed660d5, 0xc89fc3f5, 0xa3c28506, 0xf16451a7, 0x3ed350b9,
  213690. 0x67cb586f, 0x27c3e032, 0x967185b1, 0xc807c779, 0x4a13009b,
  213691. 0x09c157d4, 0xadaf1f4d, 0x362f7647, 0xf3a6a198, 0x4a42b9ac,
  213692. 0x8da6e039, 0x131c3da2 },
  213693. { 0xa7da83ba, 0x4a785ff1, 0xd04f4436, 0xf415b425, 0xec03f812,
  213694. 0x7c0899bd, 0x80f5f4a2, 0xc58d411a, 0xfda251b9, 0x3d32d610,
  213695. 0xcd3b2f32, 0x99bb4504, 0xf4c2083c, 0x198c444b, 0x730e83fd,
  213696. 0x60c261af, 0xcb02db90, 0x060ca4df, 0x9df1e7c8, 0x0ff7838b,
  213697. 0xc4c690c9, 0x6b79cf97, 0x5d75f154, 0x131514d7, 0x1cb0e8ff,
  213698. 0xa7c074f1, 0xb2c17615, 0xb920aac1, 0x44aa0ff0, 0xde8098ad,
  213699. 0x34545ce9, 0x71d1a46a },
  213700. { 0xfa1b382e, 0x76178f76, 0x772dda0d, 0xa0d8ecc3, 0xc5d4d130,
  213701. 0xaa5aab2a, 0x8d72622c, 0x27d38ba4, 0xca3bed06, 0xc5410db6,
  213702. 0x793ceccf, 0xf637a588, 0x6e65e3d7, 0x1f65dafd, 0x60a45641,
  213703. 0xc3b44a85, 0x4f78540b, 0x0f47b3a8, 0x5e4d60f6, 0x824fdadd,
  213704. 0x17d3b6d5, 0xd8ccf90c, 0x325fc13a, 0x008eabdf, 0x3648fab9,
  213705. 0x3e90d716, 0x24c52d4b, 0x3964ff3a, 0x533d0acb, 0xb95cc416,
  213706. 0x1167f521, 0x6cd2699f },
  213707. { 0x12f4f3ac, 0x2d8c0b3b, 0x99d1bdfb, 0xb03dcfe2, 0x30f37326,
  213708. 0x540034f8, 0x7c5a8c82, 0x22dd6893, 0xcd8f1442, 0xeb7093d0,
  213709. 0x585742f2, 0x892795a7, 0x087adadd, 0xe15f282c, 0x16ab7b5e,
  213710. 0x7bbdc749, 0xa58acbb4, 0xd30fe40b, 0xe2bac39b, 0x0de417eb,
  213711. 0xc61a04bc, 0x4b4b19a6, 0xf2735569, 0x9338c34d, 0x30ab196f,
  213712. 0xe8f03742, 0x6c88c965, 0xfa2efcb8, 0xc7eeb826, 0x19eee274,
  213713. 0xda345dc2, 0x327c063f },
  213714. { 0x5b47cd53, 0xab399eff, 0x1943aefe, 0xbbe9869d, 0x1402a866,
  213715. 0xe64ecc7b, 0xb1c25a16, 0xc3e7c2aa, 0x022de271, 0xc4216b79,
  213716. 0x366d6a5f, 0xe58dfcc8, 0xda813336, 0xd159509e, 0x130bfb7c,
  213717. 0x370400f2, 0x93b48780, 0x1be4e059, 0x39f3cd22, 0x0623a1fe,
  213718. 0xeecb4f87, 0x72aa22b2, 0x6c27b83b, 0x1af4c496, 0xda5fa5bf,
  213719. 0x7a42a94b, 0x48b01af2, 0x9afba822, 0x3670112c, 0xeb6b9d2a,
  213720. 0xc0df6856, 0x020f19d1 },
  213721. { 0xa4dbba20, 0x37051a86, 0xdb1de5c5, 0xb618ebc6, 0xe6525840,
  213722. 0x9a780a19, 0xd2bccc4d, 0x9440302d, 0x10285a24, 0xe9ff023d,
  213723. 0x3a486268, 0x3b937ee3, 0x4cd61147, 0xe37ee2f2, 0xa3d057cf,
  213724. 0x79fbbfd3, 0xccddefce, 0x5fba16d3, 0x5b231727, 0x916058ec,
  213725. 0x720c3adb, 0x47699ebe, 0x8b4f6bba, 0x26274386, 0xf18a0770,
  213726. 0x54b0092a, 0xacca1160, 0x99d090eb, 0x0c888f60, 0xf757e1ff,
  213727. 0xb0050544, 0x79e72720 },
  213728. { 0x2820a239, 0x632acf25, 0xaae6b310, 0xb1a3974e, 0x48c0a1df,
  213729. 0xd61fd6ba, 0x5a3ee7aa, 0xd2453c39, 0xb980446d, 0x548455a0,
  213730. 0xde16676f, 0x9f29d97b, 0x789375a1, 0xf252ca0c, 0x7743a985,
  213731. 0xe961af3e, 0x66cdbd8d, 0x70c79c56, 0xcbc538f9, 0x14a3854e,
  213732. 0xa126851c, 0x58daa73a, 0x2a9f558c, 0xe9b5bb45, 0xfbd15e05,
  213733. 0x37af7f83, 0x38a1939d, 0xa4487927, 0x9511a056, 0xe428b2b5,
  213734. 0x7015846d, 0x001d3ce3 },
  213735. { 0xe145b1d7, 0xd6be36b9, 0x009c5664, 0xf3e3938a, 0xe7c0f6db,
  213736. 0x2e562e7d, 0xc343f539, 0x951044e6, 0xd90897b1, 0xa5ab62b8,
  213737. 0x512f797c, 0xb1a1f70b, 0x750f28e4, 0x91cdd754, 0xffb8165d,
  213738. 0xb4c80e2f, 0x594d02b3, 0x65ed39c7, 0x56833edc, 0xcc12a49d,
  213739. 0xf3693a18, 0xe73694bc, 0xfcd2c404, 0x34cc134a, 0x11d40194,
  213740. 0x071bd5fc, 0xfc585e46, 0x05759047, 0x790b7a04, 0xb3280360,
  213741. 0x40afc684, 0x4bb8c6fc },
  213742. { 0xfd0f8796, 0x3120e2dd, 0xb133c9de, 0x6968a40d, 0xa9369c6e,
  213743. 0xfea366c0, 0x6007273b, 0x37e5b6d6, 0x8cb81439, 0x39e4ecf0,
  213744. 0x9febc005, 0x487fe9cd, 0x0199b53c, 0xeb8af444, 0x293519eb,
  213745. 0x2f124e3b, 0xc82c9c16, 0x860c218a, 0x709dc590, 0xacd1d6f2,
  213746. 0x36d50529, 0x5696d545, 0x59120bfc, 0xc03f5df9, 0x10ffa690,
  213747. 0x99a3e88d, 0x6c432827, 0xd4f9cfa5, 0x9a135d89, 0x2e8fea9e,
  213748. 0xb6a77e78, 0x3699a881 },
  213749. { 0x1eb1c64d, 0x5bca3372, 0xf1d28154, 0xe9cf3a2d, 0x6537106f,
  213750. 0xb7e2e9b3, 0x4f7cbf4d, 0x06c17151, 0x2058b37f, 0xcbde416e,
  213751. 0x8834e9c5, 0x82c53a7e, 0xe9ac3a75, 0x94dbdfe2, 0xc5e67c02,
  213752. 0x795ec6cb, 0x1426a80d, 0x8c23c25f, 0x6a8d4f9f, 0xee2cd20d,
  213753. 0xd3b7c235, 0x838daa54, 0x3d7a4d52, 0xb9e08ec0, 0x781cb473,
  213754. 0xca9475e9, 0x5ec31caa, 0x7271f39e, 0x82535187, 0x1df08e9f,
  213755. 0x208aff8b, 0x4f3a4b03 },
  213756. { 0x1ed095f8, 0x0f7b8107, 0xda226d4e, 0x23e37fa6, 0xafb36d1d,
  213757. 0x8b0f9852, 0x07d8e311, 0xb114634e, 0xe3e0f16e, 0xb9634a97,
  213758. 0x421eec37, 0x2454bb9c, 0xd72b21c1, 0xb4ecd5db, 0x6df20d7c,
  213759. 0xf9603868, 0xdf86e0a2, 0x9f5359fd, 0x5ac488aa, 0xc43d54fa,
  213760. 0xd1049df4, 0x56d714ab, 0xb020607a, 0x13152b3e, 0x7a02325e,
  213761. 0x49be1c18, 0x52ae84db, 0x44f24f4a, 0x0b5a7b80, 0x9e525c03,
  213762. 0xa6d179fd, 0x6d874446 },
  213763. { 0xbe9a42f5, 0xd29d07aa, 0x3781ccc8, 0x1fd5316c, 0x9dc69ea1,
  213764. 0x71a75a6d, 0x88fee91a, 0x4e19e0df, 0xf8d44f12, 0x99c2b4dc,
  213765. 0x31ae94e4, 0x05f6df92, 0xcf28ccc2, 0x27fba876, 0xf57f7ceb,
  213766. 0x6e1a0f01, 0xf3fd3b74, 0xe03f1f34, 0x42c1d213, 0xa0edc4a7,
  213767. 0x7deb8580, 0x5caac270, 0xaf0848bc, 0x0f5d791f, 0x07ac759d,
  213768. 0x17f514ad, 0x904fc531, 0x95a39734, 0x7bb70f3d, 0x95a4aca9,
  213769. 0xff9c5609, 0x3cf384c9 },
  213770. { 0xce1fc9e3, 0x700506ba, 0x676b0399, 0x49721742, 0xe72bf7b3,
  213771. 0x2b4a1b8d, 0x79b209f7, 0xca8602a8, 0xce26a8e1, 0x90580b90,
  213772. 0xfe24f39a, 0x1ef339b7, 0x629362e1, 0xb6c5d991, 0x577b24f4,
  213773. 0x51174e1a, 0x05e451e9, 0xf380fcb5, 0x148321bd, 0xf4d97afb,
  213774. 0x747e5d2a, 0x099806bb, 0xbe99a608, 0x85525d65, 0xd455e820,
  213775. 0x264828d9, 0xd8560a65, 0x8c8c5405, 0x71030770, 0x3c67e73c,
  213776. 0xee73df26, 0x2b248850 },
  213777. { 0x8541159f, 0x2173cde6, 0x4fb410b2, 0x78224c18, 0x1f2ca1c7,
  213778. 0x07a28619, 0xa8b23e40, 0x52c207d6, 0xa6b2344a, 0x071a0210,
  213779. 0xb5ed2945, 0xdb0e587c, 0x810fcc6c, 0x6c56b8ef, 0x62d843b9,
  213780. 0x1248c58f, 0x74c66975, 0x4b90363d, 0xe66c66f6, 0x6348f7f2,
  213781. 0xc126bcbe, 0xb2f9d441, 0x73ce49e8, 0xac07f2a3, 0xe81b0df0,
  213782. 0x52486758, 0x1d4621d1, 0xa108b54d, 0x74414a1c, 0x17261ece,
  213783. 0x6a3ac215, 0x938b3bcc },
  213784. { 0xe4ded340, 0xa9e4a16b, 0x80e88036, 0x8e65fb2a, 0xdcd73acb,
  213785. 0x97089606, 0xaaa657a9, 0x1c3a0434, 0x49101b06, 0xf304fc58,
  213786. 0xda0bb64c, 0xe60fb61a, 0xf5542df5, 0x818c2aec, 0x56f76d5f,
  213787. 0x74020576, 0x92533d97, 0xb566b790, 0x74d6eb5f, 0xae4655e5,
  213788. 0xa55b44b7, 0x60f7a1b5, 0x93747ea5, 0x7970179b, 0xf2dace56,
  213789. 0x8ae7e0e8, 0x84e83c06, 0x98474607, 0x15307341, 0x24e8c9ed,
  213790. 0xd9e89d6b, 0x6cff58a5 },
  213791. { 0x03e51f68, 0x508c01b0, 0x1d2fe7d6, 0xe1d1f225, 0x09bd8805,
  213792. 0xf7998d0b, 0x03e415b7, 0x255e907a, 0x607d9798, 0xd148467d,
  213793. 0x9b453896, 0x055c3b1e, 0x809f50f4, 0x35001013, 0xd0233fdc,
  213794. 0xfbbb2fa6, 0xff1820b8, 0x0b680b0a, 0x38d317e0, 0xb1d404dc,
  213795. 0xccc8c7df, 0x133d5444, 0x6ec13f84, 0x7fa847e6, 0x046e2e48,
  213796. 0xc33f83d8, 0x4863b3ac, 0x3c627fc5, 0xeb936af7, 0x5f67f8aa,
  213797. 0x31b79327, 0x5fe4ac8f },
  213798. { 0x8b6f401e, 0x581aa4bf, 0xad5c7ed4, 0x05db12a3, 0x6fb07b4a,
  213799. 0x7b018726, 0x9c22bcd4, 0xfdd11f04, 0x69371c95, 0x5454a7d4,
  213800. 0x99a46eaf, 0x066c55fb, 0x7fef96d0, 0x18637c7c, 0x6b83e95c,
  213801. 0xbafc1d34, 0x00bb42dc, 0x55c38593, 0x34e7e712, 0xdd8dec2b,
  213802. 0xb184cee8, 0x69c9cfb0, 0x49a27864, 0x8dcc0c42, 0x2010f2e7,
  213803. 0x290d95f2, 0x6977a420, 0x86e254c9, 0xeb2abdad, 0x20931c89,
  213804. 0x121c0548, 0x81377164 },
  213805. { 0x9c5a8edf, 0x6266b25e, 0x1078a7ad, 0x6e1388c2, 0x4876eedf,
  213806. 0x5f02737d, 0x62744617, 0x242fa7f9, 0xb385382a, 0x3e2cfbd9,
  213807. 0x02f71bef, 0xbadad7b1, 0x677d0a92, 0x562abcfa, 0x51fdff34,
  213808. 0x573ebd17, 0x7c250c78, 0xd7f65852, 0xc47ca896, 0xe0cf16ee,
  213809. 0x67622c9e, 0x8ccd79b0, 0xf8f2c075, 0x31fc5882, 0xa6008515,
  213810. 0x9232b37e, 0x82e8c5ba, 0x4d7bb361, 0xd2f146fe, 0xbf24735c,
  213811. 0x9cd2db98, 0x79c280ee },
  213812. { 0xf2b48122, 0xbdcc8203, 0xb04ac48e, 0xa8c04916, 0x9fc4885e,
  213813. 0xacf064dc, 0x82c1001c, 0xab838997, 0x676de250, 0x7339e721,
  213814. 0x8e1ab820, 0x17aa5aea, 0x6bc14b2e, 0x24d28ca0, 0x816b6230,
  213815. 0x570c5bb7, 0xcee6b606, 0x6c51235c, 0x183eae42, 0x1b2bf89f,
  213816. 0x9c66274b, 0x3e3af3c6, 0xb51e38bc, 0xe0b04426, 0x73e40e3b,
  213817. 0x26dbc58e, 0xb5be5be4, 0x3f9dd578, 0x52c8f408, 0x9fd9f791,
  213818. 0xa9e3ff4f, 0x758073a4 },
  213819. { 0x8691ca22, 0x7d27b057, 0x13a2a1b6, 0xf206bfd6, 0xac795413,
  213820. 0xe84bd385, 0x75536607, 0xc5d18a2a, 0xc8a0e24c, 0x2e166de7,
  213821. 0x3c474dbd, 0x56d5750c, 0x1366843a, 0xdef444c1, 0xcf4b8432,
  213822. 0x14646e53, 0xa9fd9783, 0x4bc0d030, 0x297ee203, 0xbda4c824,
  213823. 0xfd7be6c7, 0x3d0b10bf, 0x08c7f3ff, 0x2d216476, 0xb4fd4c45,
  213824. 0x06e52599, 0x49e9e104, 0xfbab9fa1, 0x8661d32d, 0x9342a7fa,
  213825. 0xfaf66aa8, 0x3f3e3458 },
  213826. { 0x951597aa, 0x51ec35af, 0x49df64eb, 0xb677d4ac, 0x9bf4eff5,
  213827. 0x0276cd9c, 0x515a2935, 0x423eca49, 0xfd9bb9c3, 0x8a696553,
  213828. 0xede1f09c, 0xf99ee9df, 0x199e5f98, 0xb8fa2956, 0x35292c32,
  213829. 0xb7638758, 0xfc40e81b, 0x8734eddc, 0x65457d95, 0xd82d5e9f,
  213830. 0x30c78d2b, 0xc8ee323e, 0xc1433d67, 0xe77b2e4c, 0x3c8314ae,
  213831. 0x56d9f807, 0x2a0e2f63, 0x441eede2, 0x6c48295e, 0x1e9e17ed,
  213832. 0x34c294ef, 0x640d20c4 },
  213833. { 0x3284d513, 0x4e9a0b8e, 0xf315053a, 0x074c3545, 0x45acd52a,
  213834. 0xb36e7407, 0x1de50db7, 0xd80bdcfc, 0x2549fc46, 0x8d9d47dc,
  213835. 0x303f07a8, 0x29b6ef13, 0x6d4ad4c2, 0x4e461aca, 0xfc9f1b73,
  213836. 0xca8e351d, 0x57460e65, 0x8bc4094d, 0x0f32d367, 0xb6302b33,
  213837. 0x285742e8, 0x69a074b6, 0x876c29c3, 0xdfe52b11, 0x912bd17a,
  213838. 0xf39e4609, 0x349aa639, 0x8ee40d66, 0xc72e05c1, 0xb968902a,
  213839. 0xc0d92816, 0x0f9c1ca8 },
  213840. { 0x67433df3, 0x1ebbaab3, 0x15d3628c, 0xb6aa5347, 0x97f0c5cc,
  213841. 0x13a320d8, 0x65e408f9, 0x72c918cb, 0xd5373451, 0x4b638854,
  213842. 0x0b4dca09, 0x731399a3, 0x0a3b1326, 0xcf256730, 0x6608b388,
  213843. 0x5ea60dfa, 0x7b290dfd, 0x58ad74b0, 0xd7694f9b, 0x83202789,
  213844. 0xb6630fb1, 0x48593db8, 0xc65e3eaf, 0x3db47f70, 0x3e7263f8,
  213845. 0x63949c91, 0xe6e6ff33, 0x9b9acec6, 0x098a8240, 0x34bd9ba7,
  213846. 0x45d36ec5, 0x7e31c12f },
  213847. { 0x0dfd2dd7, 0xbe281d68, 0x24ab61d8, 0x1efacb00, 0x94431f97,
  213848. 0xb9c3005f, 0x959cb3bc, 0x660c8dfa, 0xcffbb406, 0xfdd5fc30,
  213849. 0x7969a10d, 0x7a4631be, 0xde13fd1b, 0x336e309e, 0xfc947076,
  213850. 0x76b3bfad, 0xdcc72223, 0xfa91925d, 0x156c4ee1, 0x741f0d73,
  213851. 0x0e2b3747, 0x4f64ee41, 0xefc4d93c, 0x86be92d3, 0xfc4fbb2e,
  213852. 0xc53b7e03, 0x337ca1bb, 0xac196cf5, 0x7e23ba60, 0x4de41a30,
  213853. 0x326d5357, 0x1a219c45 },
  213854. { 0xaa4db0bc, 0xfdcf7ef8, 0x7b6c9963, 0x2e231806, 0x3d8a192f,
  213855. 0xc2639067, 0xffdc7771, 0xc0cec2e2, 0xa2fc0edb, 0x997c8e35,
  213856. 0x82cc6043, 0x78e10ec1, 0x2b0c8120, 0xfd0de2cb, 0x69e57f8e,
  213857. 0x4d6c457f, 0x5b53f1c3, 0x953e69b2, 0xc4f89cb8, 0x422a330a,
  213858. 0x95566be6, 0x92ff2329, 0x437442d1, 0x73cd502d, 0xbea69403,
  213859. 0xf04ce590, 0xf8030662, 0x6ac1537e, 0xb6d0bf93, 0xe02bcf77,
  213860. 0xbc90192f, 0x17aaa999 },
  213861. { 0x8e55db2e, 0x0d3d5643, 0x3b946851, 0x835dee43, 0x5b88462f,
  213862. 0x1a1440e5, 0xea17e27c, 0xa6ff3b35, 0xdd95f7a9, 0x23f99c36,
  213863. 0xbdd672cf, 0x7217fdd9, 0xdd2045c0, 0xf400ac1e, 0x4ff06b25,
  213864. 0x94b55c87, 0x0e4a49be, 0x0a44a0e5, 0xb43b6813, 0xe8925e91,
  213865. 0x214f96c5, 0x78bedde1, 0x0f97fa97, 0x0f456a4c, 0xa5bfd267,
  213866. 0xa28fd86b, 0xbe7608ef, 0x3b4b2d8f, 0x226474bc, 0xfbd5ff8c,
  213867. 0xa5f3b24a, 0x6b282af0 },
  213868. { 0x6341a595, 0x78fc025f, 0xa445e28c, 0x591c38d6, 0xeb446842,
  213869. 0x72bd6e3d, 0x75547833, 0x3f9466d3, 0x083e16c4, 0x911414d3,
  213870. 0x95a7acb4, 0x145d9466, 0x8fd2fb64, 0x102ddf09, 0x0bfd87b1,
  213871. 0x2a2b2d2d, 0x59455088, 0x69e9be5c, 0xa80245de, 0xee378bf4,
  213872. 0xb2306b0e, 0x80b0bd68, 0xc2be9f3d, 0x76a545c6, 0x4802c245,
  213873. 0x429d167b, 0x2b412dfb, 0x13e64427, 0xee8d9762, 0xb664f529,
  213874. 0x54706ebf, 0x6d4f5d23 },
  213875. { 0x00ba9f88, 0x35c8f2b6, 0x7bb6d0bf, 0xfdc807e0, 0xb3b81e5b,
  213876. 0x0a126d42, 0xa7ac781e, 0x335ce6ce, 0xf37dcba6, 0x3e308e6f,
  213877. 0x63c96487, 0x028dca62, 0x8818434d, 0x72eba57e, 0x79b78a26,
  213878. 0xa9e3d59f, 0x2f07aea3, 0xd2f0a7dd, 0x24d05f74, 0xe0fe4678,
  213879. 0x0116deb6, 0xb2085170, 0x58f37580, 0x9c2a5e92, 0x74070bb3,
  213880. 0xe78bd7a5, 0xb9977d90, 0x551fc872, 0x40db81b4, 0x6eda93c4,
  213881. 0xd65d34ad, 0x4aaf0b4f },
  213882. { 0x3514c7af, 0x9bef2506, 0xbc181ead, 0xb09e7dad, 0x8fa3ec58,
  213883. 0xef3cae87, 0x173b8685, 0xd8dbfab5, 0x921d32dd, 0xb2490fc0,
  213884. 0x8bd9c466, 0x4eef386b, 0xa061dbdb, 0xc1cdd52f, 0x25bc04db,
  213885. 0x64de989a, 0x85728636, 0x06f9836b, 0x8be44aa0, 0x11a5a804,
  213886. 0x097018c7, 0x16dede4e, 0xb2c11fb1, 0x72aec577, 0xa721ecd9,
  213887. 0x144dade1, 0xd6ebf3a9, 0xf99c526b, 0x1c2e14d7, 0xa1d4165b,
  213888. 0x82bc6337, 0x8b2cbd39 },
  213889. { 0x8a52e991, 0x28ec1bf2, 0xcf9d42ec, 0x0ba202f6, 0xc634ea45,
  213890. 0x8307d130, 0xc5762b9c, 0x3fc257b3, 0x487c2a2d, 0xbd3298d1,
  213891. 0xa319488a, 0xca14f1a7, 0x06ba06d2, 0xc70ca93b, 0xee405e89,
  213892. 0x9aa3f4b3, 0x35deeae7, 0xcc64eeb3, 0x03bf1d4c, 0xd155f578,
  213893. 0x45616bfd, 0x041ec0b5, 0x086e33f6, 0x23df80e6, 0xf0243cf5,
  213894. 0x399a79c8, 0x874ccd58, 0x86c2824e, 0x8fc5c831, 0x220eeaec,
  213895. 0x7dbe3670, 0x57e28304 },
  213896. { 0xfbcdf666, 0x6e60b698, 0x8bebb1d2, 0xbdd06a99, 0x80498436,
  213897. 0x4044adba, 0x522bc88d, 0xd76bf75e, 0x28423b20, 0x655c4b9b,
  213898. 0x53398a72, 0x65c0f492, 0x0ca37601, 0x76d4f2b7, 0x2030fa5a,
  213899. 0x46989925, 0xb6054705, 0x96b37e87, 0x53de1b2f, 0xef96f731,
  213900. 0xad54ef05, 0x5ecbbc8c, 0xa93617b0, 0xeb289d0a, 0x7cba217d,
  213901. 0x3ac0fbd5, 0x19d4a2d7, 0xd0d3cb56, 0xc91d6063, 0xe8bee9d4,
  213902. 0x696ffda6, 0x4f12e037 },
  213903. { 0x15f1a610, 0x4ccfa422, 0x3786519a, 0x804a5c55, 0x73838134,
  213904. 0x1246a454, 0x4b284e2a, 0xfa15b484, 0x146d1320, 0x36464c65,
  213905. 0x70a8a0fa, 0xfb6ba88c, 0x93c4804e, 0x74e7cee7, 0xb95ae16a,
  213906. 0x8c34d22c, 0xf9c1d4dd, 0x9d9ed89f, 0x32025371, 0x61a0866d,
  213907. 0x9bd6444a, 0x45b232b2, 0xf277bab1, 0xf888e92c, 0xa9448b02,
  213908. 0x73e69c6e, 0x5b521ecb, 0x1a496ea9, 0x5858afb2, 0xa8f78ea7,
  213909. 0xb1266f91, 0x83d2333e },
  213910. { 0x67b478d7, 0x1c633288, 0x50a2fc9c, 0xa1ee1ae1, 0x18d2241b,
  213911. 0x05b6ab30, 0x893cd696, 0x69f1f288, 0xa8117a87, 0x159d6660,
  213912. 0x70e73d77, 0xe8120119, 0x93f55f0a, 0x528fef00, 0xd854dfb2,
  213913. 0xb3978db8, 0xf45d9fbb, 0xd6b43ef6, 0xd5bee397, 0x17de4bfe,
  213914. 0x6bf76dad, 0xa01e0f59, 0x3d40754c, 0x28b2280e, 0xf8e86ef3,
  213915. 0x8edb6122, 0xb7d1e586, 0x8226b6af, 0x2f40a55b, 0x46353215,
  213916. 0xc5a31621, 0x7362f13e },
  213917. { 0x73c0c430, 0x792eb27c, 0xa51c3657, 0x8cc0a65f, 0xd2194f1b,
  213918. 0x50a5cece, 0x814b4947, 0x18945688, 0x4b6fbbf4, 0xbbf0a81a,
  213919. 0xf0aa8608, 0x376f4f58, 0x3987795e, 0xd9361d68, 0xe3a8d0d5,
  213920. 0xb6510cd8, 0xb6c1a455, 0x63e2fdbf, 0xaec891f9, 0x2c91154e,
  213921. 0xff568f64, 0x0eb1e715, 0x2f2b399e, 0xe7af9cd7, 0x89f0bf0b,
  213922. 0x1fc39bac, 0x90983695, 0xf0861d92, 0xda0a20a8, 0xd9b16f02,
  213923. 0xa38c0ead, 0x2f10693f },
  213924. { 0x0c06ded2, 0x07a6ce91, 0x2fd9087b, 0xf974842f, 0xa9f635a6,
  213925. 0xe468bfd6, 0x1ed60626, 0x04b61891, 0x369ee548, 0x1fb2f89f,
  213926. 0xdc96a201, 0x9cbd1113, 0x10d633ac, 0x6759acfe, 0x8faa629e,
  213927. 0x64ba66fc, 0x47f38283, 0xa686ae49, 0xd59cda99, 0x828c3a05,
  213928. 0x08ea2f6e, 0x7c7afb14, 0xaf3953c8, 0x2551c8e4, 0x9daa9e4f,
  213929. 0x5b53d279, 0xad6f1940, 0x1eff68d4, 0x96437cdb, 0x2775dbdd,
  213930. 0x4fe7a043, 0x985f83e4 },
  213931. { 0xeaf45294, 0x89603c16, 0xc24b5751, 0x70131160, 0x39d6b52d,
  213932. 0x4c112018, 0xed943340, 0x7079cf02, 0x74f41b68, 0x0c5b028b,
  213933. 0x9c8ac1e1, 0x3dc3f076, 0xf8b24f0e, 0x5ac5eea3, 0xe34c5c22,
  213934. 0xee6684ba, 0x9abc452a, 0xa5259e63, 0xe9df45cc, 0xb07d2cd1,
  213935. 0x1a443cfa, 0x07019c93, 0x92c003b3, 0x68fddaa9, 0x0d8cbc2e,
  213936. 0x2d9f179c, 0x1e781ca7, 0xbbf15a6f, 0x50dcc799, 0x54d779d5,
  213937. 0x0fe962f1, 0x0c88e540 },
  213938. { 0xe8f44357, 0x84f71a6a, 0x3a3cab6a, 0xf75b4bf6, 0x5aebc680,
  213939. 0x334c9d9e, 0x8a753ef2, 0xcecaf084, 0x075e3c8e, 0xe28014c1,
  213940. 0xf74f8d3a, 0xbb9d5a38, 0xb80e32ae, 0x75988464, 0xf2bc3792,
  213941. 0x7b328e6f, 0xeed0e197, 0xebbb1faf, 0x5a33065a, 0x674eac95,
  213942. 0x922dbce8, 0x8c19fd8f, 0x987b907a, 0x8c17ae85, 0x3b3a2cd7,
  213943. 0x89f33627, 0xfa87772f, 0xebaea019, 0x3a25ced6, 0x4e5de499,
  213944. 0xaf110715, 0x8e2560b8 },
  213945. { 0x3141aba6, 0x56d3746c, 0xbab2cf9e, 0x45a1079f, 0x9cdd27c7,
  213946. 0xb6382831, 0x9dfd950e, 0x22237632, 0x3a9408ff, 0x1e0b15cd,
  213947. 0xb1160118, 0x49a80200, 0xa383bba7, 0x2719db5d, 0x651046d5,
  213948. 0x6078340a, 0x97523b1f, 0x8929d4de, 0x8e0a28ab, 0x4040345c,
  213949. 0x0adf09c7, 0x61275ac2, 0x2331d611, 0xb41ab265, 0x5391ca50,
  213950. 0x230cc77c, 0x8f922315, 0x88be0c92, 0x92fd9a29, 0xfef3d92b,
  213951. 0x8324f2e5, 0x59005f22 },
  213952. { 0x3c4c1c74, 0x6bb1750c, 0xe966fb79, 0xbe73aac0, 0x66c5973f,
  213953. 0x85a75d92, 0x3a8656b6, 0x8c97f932, 0x50446cde, 0x2b7043b1,
  213954. 0x3ff3897f, 0x548916f7, 0xb18b72b2, 0x913dd01c, 0x488c0de6,
  213955. 0xd0a751f1, 0x8558ca58, 0x19175714, 0x44a663da, 0x97714301,
  213956. 0xb0e08618, 0x2df190ac, 0xf39ead9c, 0x0080fc0c, 0x17382da1,
  213957. 0x0085ac6e, 0x3262a338, 0xe9791851, 0xb43bae8d, 0xe4495936,
  213958. 0xd783df6e, 0x57a78e26 },
  213959. { 0x40dbddd8, 0x161b346f, 0x9410c3ac, 0x2b49a927, 0x1886cf3b,
  213960. 0x8c542783, 0x33b93deb, 0x72df3232, 0x40df579d, 0x9c8d59f5,
  213961. 0xc20ef500, 0xe5d7a67d, 0x67f08643, 0xc46b3918, 0xad96adc3,
  213962. 0xecfa2445, 0x0c4544d0, 0x658f589b, 0xe08417d7, 0xe6ec9301,
  213963. 0xc454e288, 0x6ca5ef6a, 0xac0f462d, 0x4191048f, 0x08d8a036,
  213964. 0x852407d8, 0xf6d35b7e, 0xb4c533a7, 0x8f6ada87, 0x3251e412,
  213965. 0x81c472e8, 0x1ca370c5 },
  213966. { 0xa801b68a, 0x94bd5171, 0xfd1998b3, 0x7312879c, 0x41163202,
  213967. 0x4905aabf, 0xf5b01fdb, 0xb5fe87f4, 0x9cda128b, 0x78de523a,
  213968. 0xc7bd31f7, 0x0bf161a1, 0x23904c35, 0xb5decfd0, 0xe188f12d,
  213969. 0x224b2882, 0xf99dae74, 0x0dd2801d, 0x08cd1cd2, 0xcad467b5,
  213970. 0xc0867e39, 0x6c311c3d, 0x2b425072, 0x71a11720, 0x2efd9003,
  213971. 0x83bf464e, 0x1dbd3b03, 0x53d0448a, 0xe6265baa, 0x32db52f4,
  213972. 0x4c33ac79, 0x2584b34c },
  213973. { 0x2aeec688, 0x3cb86389, 0x45fbe523, 0xa5e740ba, 0xfd60b5f8,
  213974. 0x422e71f7, 0x4874913d, 0x455d185c, 0xfa17d80d, 0x04c2bb36,
  213975. 0xac054524, 0x3f271854, 0xa8b9a657, 0x76dd3045, 0x62ee7cc8,
  213976. 0x2e42c3e1, 0x4df6c7d0, 0x00266706, 0xdc7cb488, 0x5927dd51,
  213977. 0x187897e0, 0x6b3faabe, 0xf2d5737c, 0xfe6ad22e, 0xff51a9ff,
  213978. 0xafb60269, 0x69807baa, 0xe1c83545, 0x951ca49a, 0xacddb6ff,
  213979. 0x3f9ab085, 0x7e811374 },
  213980. { 0x830a88b1, 0xad722a8b, 0xce1117e1, 0x91918ea8, 0x0409b47d,
  213981. 0x3e02d0b8, 0x6c46d1d3, 0xb53812d3, 0xe589669c, 0x2fd09db0,
  213982. 0x15b0cd5e, 0x9845cd06, 0x2386c453, 0x0c1c155a, 0xf5ff43cb,
  213983. 0xda774de5, 0xe391c0cd, 0xbb076b98, 0x5004f286, 0x97d71eff,
  213984. 0xaeec0bfe, 0x23e0b46c, 0x32a1ad94, 0xe4538667, 0x396da422,
  213985. 0xfe0c9f81, 0x63db2bfe, 0x6376c1a2, 0xba56fa91, 0x001c7918,
  213986. 0xdf8485a6, 0x436b8c64 },
  213987. { 0x8ab764bc, 0x88117e9d, 0xa077df84, 0xdfa61e94, 0x0c18eebd,
  213988. 0x5a7765d3, 0xfc9451dc, 0x548916af, 0x071a347a, 0x01a52e33,
  213989. 0xb23b41df, 0x633b95de, 0x43c8c286, 0xdd7d68c9, 0x18d97068,
  213990. 0xe4f9d41e, 0x8c92799d, 0x79908b90, 0xd47394a3, 0xe614148e,
  213991. 0xcd51e53f, 0xe5018517, 0x0243dcb6, 0x5060075e, 0x17954405,
  213992. 0xe5dcde62, 0x537da5ff, 0x6f7c90e1, 0x0768cb66, 0x1df7aae4,
  213993. 0x6dbe95e1, 0x5266ca9e },
  213994. { 0x1386b3db, 0x84ddee6d, 0x7c38e540, 0xf9e4af5a, 0xeb04f49d,
  213995. 0xb3418440, 0xfde5a4fd, 0x2138a1e8, 0x30257cfc, 0x3e6e6924,
  213996. 0x19fd70c1, 0x3519c6e3, 0x86c31ff0, 0x8f34e174, 0x940ce1e8,
  213997. 0xf1e298fd, 0x14960d7c, 0x6fb8cb1d, 0x2b2f3bff, 0x207c1347,
  213998. 0x146ef8ff, 0x899a20b4, 0x7bd3e220, 0x7dec362b, 0x626bea27,
  213999. 0xa975044e, 0x4fb4cb67, 0x0f32b449, 0x1fc6703a, 0xc17a0920,
  214000. 0x9cd84a2b, 0x41f325b9 },
  214001. { 0xce2843a4, 0x312ed513, 0x00728afc, 0xe748498e, 0x4d864ce5,
  214002. 0xa8ef2822, 0xa620083b, 0x34064704, 0x4bed338d, 0x5905e1d9,
  214003. 0x063e7b38, 0x2a578cb5, 0x289e7bb9, 0x98276d96, 0xf17b7341,
  214004. 0xdfe2dc47, 0x1dac8944, 0x5923521f, 0x23400aa7, 0x3db6d28d,
  214005. 0xa761ba43, 0xc647705e, 0x9bfd07dd, 0x8947ba6d, 0x242ca8fd,
  214006. 0x00f2e3ac, 0xeb8c3468, 0x49ef4670, 0xd9aa18fd, 0x7db3d37b,
  214007. 0xe58cea9e, 0x56b30fb6 },
  214008. { 0xcd80a428, 0x07ecdcaa, 0x8732c891, 0x7af922dc, 0x3ada441f,
  214009. 0x20d88798, 0x924b008a, 0x3bed9a44, 0xb2e81c3a, 0x2123533c,
  214010. 0x65f807d3, 0xc34e4075, 0x1f2faecb, 0x0bfaefa5, 0xade8a88d,
  214011. 0x78b634a5, 0x94392a91, 0xc4e0b7f8, 0x90bb1cd8, 0x30922377,
  214012. 0xf87204ae, 0xdea9b4fa, 0x85d3cd83, 0x3edf81f5, 0xc6523a79,
  214013. 0x58f88c51, 0x17c0d969, 0xe472fb8b, 0xdccf7f07, 0x899081e5,
  214014. 0x58bdd146, 0x1353cc57 },
  214015. { 0x39bf6e18, 0x28a56497, 0x649b89c7, 0x59e8b5a2, 0xdce8b8e7,
  214016. 0x8d9434a0, 0x2047040c, 0xd935bf51, 0x6a7b8e82, 0x2ab3a164,
  214017. 0x27f81294, 0xf1583ed6, 0x72d67297, 0x8416a7e0, 0xcd39e42b,
  214018. 0x49685d86, 0x958ddbad, 0x8a797fc7, 0x155ce6de, 0xa558f928,
  214019. 0xf8a36235, 0x75f4e570, 0x52877ae5, 0xbc69cfc0, 0xa6b16ebd,
  214020. 0x8f4193a9, 0xbb1cc1f1, 0x8d1df43c, 0x5a21e789, 0x723a830e,
  214021. 0xf451df58, 0x3ec2185d },
  214022. { 0x1f0bc2d7, 0xb9d4c7d7, 0x6e51d412, 0x6982c6cc, 0xa09f80f6,
  214023. 0x92e02d93, 0x047ae09c, 0xb7dd2d25, 0x37f351f9, 0x3503149f,
  214024. 0xc77850be, 0x69d49ce1, 0x12f0d2c8, 0x60242acb, 0x7bc28b9d,
  214025. 0xba188c56, 0x06bc0550, 0x8e406121, 0x8d7d4329, 0xb0d84b1f,
  214026. 0xd38951e0, 0xb4a67ae7, 0x8bc97607, 0xb527c57b, 0x5497aa72,
  214027. 0xbc93c5f3, 0x39bdd666, 0x5f1de8cc, 0xe9d447a3, 0x3087dc5c,
  214028. 0xa211abe5, 0x89b356b6 },
  214029. { 0xdfdcc837, 0xed6db0af, 0xa871b7a9, 0x0fb80baa, 0x1c1d4b72,
  214030. 0x413abfc9, 0xadac9e5c, 0xf5b56bf7, 0x8b8657a3, 0x5664a2da,
  214031. 0x0e41d94e, 0x11b04f72, 0x37433658, 0x63e11d26, 0xf426daea,
  214032. 0xee628ece, 0xcb162dc2, 0x011619c9, 0x87648643, 0x9cf5817f,
  214033. 0x5584bc86, 0xe1bb9702, 0x00bf7928, 0x2cc27cef, 0xdc60eee5,
  214034. 0x4ef3a80e, 0x87adc2f9, 0x7e1202be, 0x8a0d4f52, 0x656f18e0,
  214035. 0x57c5d126, 0x39c4f10d },
  214036. { 0xe88aecd3, 0xb3a9b68c, 0xa518aa9d, 0x555b0918, 0x4bd4ee54,
  214037. 0xedc1cdad, 0x02068d84, 0x79b68b67, 0x811ac72d, 0x7dac80d0,
  214038. 0xa81a0a78, 0x6d1e6d35, 0x3bd16283, 0xc841e9ea, 0x894c4444,
  214039. 0xa7bc1775, 0xf1aa1202, 0xf2b63725, 0xc7d4c556, 0xbec7767e,
  214040. 0xd46ff51b, 0x2817ebb3, 0x73f7e339, 0xfde5be8d, 0x5aed24c4,
  214041. 0x44c6c977, 0xb6e579cf, 0x0b9a1707, 0x9069fbcc, 0xcff16478,
  214042. 0x49152b00, 0x414b542d },
  214043. { 0x606e173b, 0x33c31e58, 0x90e6713a, 0x5b7f4e1b, 0xdebb20af,
  214044. 0x425fb512, 0x05120e70, 0xc788c617, 0x9013e4ec, 0x3ef05602,
  214045. 0x81c6e6d7, 0x9f9d35ac, 0x9450690a, 0xe131e88f, 0x44af082e,
  214046. 0x708f9b32, 0x1ba2aea9, 0xb2e4d66c, 0x740db29c, 0xaf1f4a6e,
  214047. 0xd1843007, 0x74ab9248, 0xed556a6c, 0x13338ef8, 0x270d17a6,
  214048. 0xf48e623e, 0x9608f5bf, 0x3c7362fa, 0x444e8515, 0x43977874,
  214049. 0xe00b8b2a, 0x52678d6a },
  214050. { 0xdf36aeb4, 0x5dff1c59, 0xa92bc0ab, 0x52d6653c, 0x927a5f81,
  214051. 0x0e03f496, 0x2dfd491f, 0x8509d414, 0xa571f89b, 0x258c2c52,
  214052. 0x93334485, 0x2bd61804, 0x3f7d9e09, 0x1a33e94f, 0x2c1bf906,
  214053. 0xfab418d3, 0x5aa5695c, 0xf39c490e, 0xf6d2d7ff, 0x0e41196e,
  214054. 0x0f7948a9, 0x3ecd4075, 0xd3053b4f, 0x4b58f9b2, 0x5d9974c9,
  214055. 0xb8ee842a, 0xbf22f682, 0x23a59c1d, 0xc8efcea6, 0x045ac614,
  214056. 0xc10ceedd, 0x7040ba5b },
  214057. { 0x515a1a96, 0x2c364f81, 0x184327e0, 0x31a63503, 0x1ad93d4f,
  214058. 0x0a096650, 0x273b6173, 0x9d7694f1, 0xd2cda9d2, 0x8886d876,
  214059. 0x2814c177, 0x1e01a742, 0x8667696b, 0x3492276b, 0x5b25f006,
  214060. 0x2fd4f0c6, 0xfb294c4a, 0x6527349f, 0xde1d336f, 0xc1fe0d8a,
  214061. 0xe7e3860e, 0xaf9a23e8, 0xb774c31e, 0x97d2b721, 0x4365784a,
  214062. 0xfac3e582, 0x70f4eaa3, 0xff2dff4e, 0xfe873248, 0x3d281e1a,
  214063. 0x0bd1c9c1, 0x9043a6d6 },
  214064. { 0x766c7937, 0x1511a0fe, 0xabbc3be3, 0x1b2ded5c, 0xe00888ac,
  214065. 0x2ac160cc, 0x616200f3, 0x928754bd, 0x34a2ea06, 0xb801c83d,
  214066. 0x9cbe106f, 0x8ad7a03a, 0xcedfcd94, 0x996b0822, 0xe4069880,
  214067. 0xc3c3463a, 0xf597f663, 0xfb12ea4d, 0x40c92af9, 0x2c8d3834,
  214068. 0x4e8da154, 0x79bc85c6, 0xdb4e801a, 0x95771fa2, 0x1e3579b2,
  214069. 0x7bd2c138, 0xffaad078, 0xe45c75df, 0xb73eac46, 0xb0760a3c,
  214070. 0x3a125f35, 0x26362b48 },
  214071. { 0xeefc3e89, 0x25c68d28, 0x69e9ee71, 0x2d0ee877, 0xaf5e4b75,
  214072. 0x8b07bb86, 0xcb86b333, 0xdb709072, 0xff552bac, 0xfd3d20ea,
  214073. 0x4c0da1e9, 0xa5eeb2b1, 0x44f97145, 0x391f688a, 0x1e06d485,
  214074. 0x21fbd310, 0xbea9cd49, 0x45e4f2a5, 0xa7bf21da, 0x7b60d464,
  214075. 0x054d5471, 0x193f88c8, 0xbee0f2e9, 0x5ace53d1, 0xc1439273,
  214076. 0x92c26563, 0x96c6b5ee, 0x9c86e0b2, 0x09ff59ba, 0x452fe231,
  214077. 0x555c935e, 0x2e952b20 },
  214078. { 0xd75f886e, 0x2a846bca, 0xd43dfc58, 0xe68a5dbe, 0x007b1b86,
  214079. 0x103e45b6, 0x355ff2b5, 0x580e2ec9, 0xa263ecc9, 0xbc702f26,
  214080. 0x181e5e33, 0x2835b386, 0x6c122076, 0x025113ec, 0x7fbd856d,
  214081. 0xa5c26e3a, 0x9d6ebcb1, 0x8ef83fb3, 0xa44d2fa8, 0x7aaa53f2,
  214082. 0x53b1fa97, 0x7c14ef33, 0x17559a30, 0xff604a11, 0xb09377e0,
  214083. 0x2bcd96b0, 0xdb2f0273, 0xa5c14896, 0xeb53ef06, 0x1c0a84c9,
  214084. 0x30378e4b, 0x1236d017 },
  214085. { 0xc084373b, 0xd7481c8f, 0x646097ae, 0x29ae4768, 0x613bc34b,
  214086. 0x1300dfa0, 0x934bc2b0, 0x3712714c, 0x0e2be7e2, 0x86524629,
  214087. 0xed010800, 0x554fbb9f, 0x42314576, 0xf0ec0b38, 0x330a3282,
  214088. 0x65baf594, 0x706ef817, 0x3bdde1a8, 0xba7530e9, 0x7d2c727d,
  214089. 0x74cc95cb, 0xbb0c5d66, 0x2438906d, 0xb3fcd365, 0xd14658f3,
  214090. 0x19881941, 0x6c97f0e9, 0xe616f555, 0x4b9ec7ea, 0x353c2d85,
  214091. 0x620cb56e, 0x02a48014 },
  214092. { 0x506ccd38, 0x11d6d23d, 0x9059baa6, 0x229a1c54, 0x69d011c5,
  214093. 0x717c9c27, 0xd828937d, 0xe87e1b46, 0x83835083, 0xf5d63bbb,
  214094. 0xaadac258, 0xf0a7b427, 0x9f154d1f, 0x99ab26bd, 0x8ec955fd,
  214095. 0xdec0ffbf, 0x49fcb880, 0xee957c67, 0x1e0114de, 0x32395dee,
  214096. 0x369f46c7, 0x192a64b7, 0x91eb2599, 0x43044660, 0xa2e8c3da,
  214097. 0xbe2da887, 0xc3556d18, 0xa44e2c25, 0xb55f75f3, 0x31390414,
  214098. 0x8f217fe0, 0x1d8bde6f },
  214099. { 0xa2028924, 0x03cd39f8, 0xb06ecb9f, 0x6e54f19c, 0xd6f05846,
  214100. 0x862bbcb7, 0x5a060776, 0xdbe06716, 0xb10fec10, 0x9397c97a,
  214101. 0x6f1bb65c, 0xf4213826, 0xa672ba38, 0x414deccb, 0xf88b05e6,
  214102. 0x594d4d43, 0xac94d4d1, 0x7993f57a, 0xbfb17638, 0x74fc2a6a,
  214103. 0xb6fc655a, 0xd8196b5b, 0xee8d2139, 0xdc375c84, 0x360d3a26,
  214104. 0xb9b00a02, 0xdeb93b87, 0xb36ed35c, 0xcc83209e, 0xf565b28b,
  214105. 0xc61013c1, 0x349c6943 },
  214106. { 0x4de6c88a, 0xd1b39444, 0x4700207e, 0xd5c2c471, 0x21c2b780,
  214107. 0xb6f458a2, 0x0850993e, 0x749f7564, 0xbaef0c18, 0x400ba579,
  214108. 0x737c70f0, 0x2d742938, 0x21467ebf, 0xc5a8e2ec, 0x5337f453,
  214109. 0x243a666e, 0xed0bd50a, 0xc991f1c7, 0xf4bd1f91, 0x3a7f3e90,
  214110. 0x5f0e129b, 0x96089e8a, 0x07389635, 0xd0d3a177, 0x27182ac9,
  214111. 0x9cf842d5, 0x0817c5c2, 0x21195299, 0x87255769, 0xa32f327e,
  214112. 0x89c2d8fa, 0x056587ab },
  214113. { 0x1ce4733d, 0x008562ed, 0x98e51444, 0x5faff7cb, 0xa9ab46b9,
  214114. 0x5f03021f, 0xb61a8c13, 0x89494c5e, 0x36b35976, 0x57c95036,
  214115. 0x2ac2d2f6, 0x6be84c8f, 0x9bd2703e, 0x0e5b34d8, 0x7e872abb,
  214116. 0xc4ad918f, 0xc4052ee1, 0xc2a89e9f, 0x3190b51e, 0xc2caee3f,
  214117. 0x6fff254f, 0x58fd1437, 0x883e0972, 0x6f3c0d68, 0x0fb15438,
  214118. 0x63d0a0e9, 0xf6caae00, 0xc438764b, 0x3f1d0f6c, 0x815f1565,
  214119. 0xb86cdbde, 0x1b87f2ed },
  214120. { 0x2b0b15b1, 0x35792bbb, 0xce6ba779, 0xa3e4b5a7, 0xdd8f3779,
  214121. 0xfbacffd9, 0xc298d1ef, 0x005450bd, 0xc47031c6, 0x0e3f5556,
  214122. 0x95d68066, 0x0770f07a, 0x2d1052c2, 0xce3e84e0, 0x7aa8cc54,
  214123. 0xb050791e, 0xba3223a3, 0x4d621e73, 0x39632990, 0x87b9b94d,
  214124. 0x7eb8056d, 0x8df9cb47, 0xedfca0cc, 0xe2430de8, 0x9712a0ca,
  214125. 0x374bf416, 0x88848a99, 0xbe3f3c77, 0xc4a3e59e, 0xb22b87b1,
  214126. 0x3e95bc23, 0x8e0227c4 },
  214127. { 0x3210964d, 0x000e22a8, 0xff056eeb, 0xdccd5df5, 0xdaf1ead7,
  214128. 0x02173a1f, 0x67cdcae3, 0xd02833e0, 0x8bdcc90c, 0x1cc574cb,
  214129. 0x3224b4f5, 0x86eca714, 0xbb3f8298, 0xd00e603a, 0x0c1a8deb,
  214130. 0xb98ece1b, 0x378c261d, 0x228a46e4, 0xa6165e5d, 0xc6f9dd0d,
  214131. 0x4b7ef0e2, 0xb3ae3899, 0xbda9f306, 0x3a3c16b3, 0x38a084db,
  214132. 0x5e9a26d3, 0x5394e950, 0x528e5993, 0x4ea206bc, 0x848ecb11,
  214133. 0x40545d6e, 0x14b15ab5 },
  214134. { 0x664c59a2, 0x0f6d86c9, 0x60fd7aa5, 0x3dfe2be1, 0x9072cb8e,
  214135. 0x33f9b569, 0x8176a7e0, 0x5f2325d9, 0x4587080b, 0x79a0d4e7,
  214136. 0x0d5d4e05, 0xa4ee0def, 0xc87b28e1, 0xc0ad9ffa, 0x3f09b4ee,
  214137. 0xd6f18d2f, 0x292e9d87, 0xcc896ae7, 0x6094763c, 0xca88953d,
  214138. 0x18fbf9fa, 0xdbee97a8, 0x4b63d701, 0xdf20e0e9, 0x47ea722f,
  214139. 0xcbba6e30, 0x612b571f, 0xce57e1ca, 0x009a55f5, 0x1e16ac76,
  214140. 0xc4389e2e, 0x742bbed8 },
  214141. { 0xc1dc2c73, 0x23ea86dc, 0xc1643abf, 0x4bbbfd5b, 0x24d8ca1f,
  214142. 0x07f8fa1f, 0x8cb5cac7, 0xde68a6e0, 0x54e66a7d, 0x7d54c64b,
  214143. 0xa9b7ad78, 0x789dba22, 0xe364ab94, 0x4d88d540, 0x1f72e011,
  214144. 0xc8c2e02d, 0x46e2a278, 0x4c826057, 0x4b187c7d, 0xe6c35bb3,
  214145. 0xeb8fe0c9, 0xed8b3dfe, 0x7d11e415, 0xb6bc34e8, 0xb865c7f9,
  214146. 0xb3908bbf, 0xe1ecc17c, 0x717d1ce6, 0xf7cdd69b, 0x151e3308,
  214147. 0xb5c94124, 0x97bd5a14 },
  214148. { 0x81e82861, 0xe01c62fe, 0xdd42c40e, 0x703d4b6d, 0xe65e91e5,
  214149. 0x7e52e55b, 0x5abbbfdd, 0xb8b49374, 0xc72a45f4, 0xb4f15f52,
  214150. 0x550f29d8, 0xce8435a8, 0x582de75f, 0x9df76b9b, 0xa20c8b96,
  214151. 0x52e84c5f, 0x0a8a0af4, 0xaf77d2d1, 0xca6013c3, 0x0389bbd8,
  214152. 0x26f8305f, 0xb0d9b9ba, 0x0cec8b9a, 0xf053e848, 0xffabda18,
  214153. 0x4d63367a, 0xa6424c2a, 0x50f53be4, 0x864fba2e, 0xf892c58c,
  214154. 0x48cc5469, 0x317c6d31 },
  214155. { 0x2cb7d42b, 0x0c3525b0, 0x310facae, 0x55240bc9, 0xff20408f,
  214156. 0x8d5d2022, 0xe0c10ea0, 0x6b01402f, 0x718eb23d, 0x7fbef68a,
  214157. 0x41252a19, 0xa0146b5a, 0x110e0d6e, 0x59afce48, 0x022de181,
  214158. 0xe9a1d27f, 0xdc3f49da, 0x6db96d16, 0xefbe4008, 0xfc1ae3f5,
  214159. 0xeccbc11c, 0xf9d70641, 0x525f8636, 0x49022279, 0xc2763c30,
  214160. 0x3769796a, 0x1d90630b, 0x9cc3483c, 0xee3d3f17, 0x451651f0,
  214161. 0x9da0b8fd, 0x6ae59739 },
  214162. { 0xbff4d2ee, 0x57b13bc7, 0x30b173d8, 0x20754229, 0x0794936c,
  214163. 0xb6254bd5, 0x5efd55be, 0x1d5f232a, 0x4e0c3389, 0xc06f4a85,
  214164. 0x8e61f944, 0xcf2c5b59, 0xfd5f87b7, 0xc564861f, 0x5a2afa4c,
  214165. 0xee261fb1, 0x2d97a774, 0xb0ff7226, 0xd6cf007a, 0x1a89ae22,
  214166. 0xd346f214, 0x28880534, 0x97b6497e, 0x8fe73bff, 0xfa2afffc,
  214167. 0x8a8595b2, 0xf151a726, 0x9ef9cf3e, 0xe744b82b, 0xa84ee5f1,
  214168. 0xbc63fe72, 0x6649048d },
  214169. { 0x1e8b760d, 0x91b7bb78, 0x25aadaa0, 0xd47b0bd8, 0xfab5226f,
  214170. 0x81493d9f, 0xbffc148e, 0x4a6dd226, 0xa29be3db, 0x5a032f8a,
  214171. 0x34b0ab0b, 0x318dbc70, 0x7d654868, 0xdcccbfb5, 0x9c581e46,
  214172. 0x8506ab37, 0x2830ece2, 0x09136a6e, 0xcf6c80c7, 0x48b79356,
  214173. 0xef6b1e86, 0xfa176377, 0x83f0f1c9, 0x2c9c1cc1, 0x16abeddd,
  214174. 0x96f0526d, 0xa93b0de4, 0x3e0e98e2, 0x0f13873a, 0x6f2d7ada,
  214175. 0xf3fa49ec, 0x4eb93b5c },
  214176. { 0xe11fae32, 0xbd89f7e5, 0xc4023f51, 0xd13d74f5, 0x491c3f6f,
  214177. 0x1b0014df, 0x555279b7, 0x1d849a57, 0x05ba0068, 0xbb9e8897,
  214178. 0xc13ca2ca, 0x82222419, 0xfd33676f, 0xafbbb685, 0x75878a2a,
  214179. 0x931c3f52, 0xef3d5173, 0x12aeefef, 0xbd8a6878, 0x189a5cc8,
  214180. 0xd99f0c16, 0x82cffdb3, 0xa19d48b6, 0xbf565406, 0xe9c6c4e0,
  214181. 0x5605e223, 0x86804172, 0x53e781de, 0xc7001cc8, 0xcdf5c90b,
  214182. 0x7c043f68, 0x2b582d93 },
  214183. { 0x81abc2ae, 0xa1165c82, 0xe2b69eca, 0xa73380f5, 0x07fff66f,
  214184. 0xc097b3d2, 0x54776506, 0x5d603826, 0xb57fa21c, 0xdcbac9f3,
  214185. 0xc98dbdd5, 0x78750db4, 0xd9eff32a, 0x85e21103, 0x2f11c41c,
  214186. 0xceed172c, 0x9e348c09, 0xa8e39264, 0x831eddfb, 0x71cb936b,
  214187. 0xf50864a3, 0x915c3d06, 0xe93acfcd, 0xfe8e33cd, 0xb3f2f7aa,
  214188. 0x4bee10d7, 0xeb7cee9a, 0xc1d8eb48, 0xfa574afd, 0x4fa49ce3,
  214189. 0x862db4c0, 0x78615109 },
  214190. { 0x7ae72c21, 0x3fe3f480, 0xfd0f0da5, 0x631aa144, 0xf8c3a454,
  214191. 0xc76ee1e8, 0x51b4f1ab, 0x379ae094, 0xd7cdbb24, 0x2a3a4397,
  214192. 0x82bd5fcd, 0x7a14cffe, 0xf427ef5a, 0xbbe4ed12, 0x284d3ccf,
  214193. 0x9b0a43ee, 0x8eec6e1e, 0x57b78b93, 0x67b8e87b, 0x18d404e4,
  214194. 0x34374c20, 0x0c8adc05, 0x5428deb5, 0x64373605, 0xc3afa2cf,
  214195. 0xb4d80ec0, 0x3aa956f9, 0x6d51f93c, 0x84161c68, 0x9f9a28ab,
  214196. 0x6bc9c025, 0x540b6bb7 },
  214197. { 0x321d315d, 0x04e1734c, 0xd86e05d0, 0x4ef56612, 0xbba8cd81,
  214198. 0xeafae145, 0xacdc789a, 0x1fb07a49, 0x5877570f, 0x6a21e9ad,
  214199. 0xb9bc53de, 0x2e4a837e, 0x1d6298eb, 0x436db293, 0xea362f45,
  214200. 0x43afbc78, 0xaabf6585, 0x2a973d97, 0x0c924d60, 0xdce7dabe,
  214201. 0x7cadf0e9, 0xf69d98f0, 0x75020538, 0xe0b505a1, 0x4461cd29,
  214202. 0x3db7d1a3, 0x5e20e818, 0xe1c28776, 0x52dd50f6, 0x2ca25867,
  214203. 0x92e0388c, 0x897cab14 },
  214204. { 0x0d8bab8a, 0x59ed3813, 0xa438200a, 0xc11d364c, 0x40581415,
  214205. 0x0687bf2c, 0x7ac89674, 0x86ad0d3a, 0xb97411a0, 0x44928105,
  214206. 0xf383371c, 0x74984b11, 0x0d1a831e, 0x70d2ed84, 0x6c912fe0,
  214207. 0xd883628b, 0x14fa88d2, 0x44f8f7fb, 0xcf0ac93e, 0x564f2a4d,
  214208. 0xa6c24fa6, 0x82f629aa, 0xbf6cd949, 0xab906ba3, 0x20a5182d,
  214209. 0x2c822e67, 0x30eb93a5, 0x2ff47dac, 0xfff673aa, 0xdc62c4a4,
  214210. 0x476b0ec5, 0x64b00763 },
  214211. { 0xb3c9a404, 0x1e3f533e, 0xb7ef9952, 0xb1db7f73, 0x6c253693,
  214212. 0xc7f13e29, 0x0738eed4, 0x7ce7f4c4, 0xce26cad0, 0xccfd3b33,
  214213. 0x01ec5cf1, 0xd8784935, 0xdc084e01, 0x3f8fc09d, 0xc39b5acf,
  214214. 0x217cab32, 0x9ef5551c, 0x42daf0bb, 0xe1217a95, 0xfbc76f56,
  214215. 0xc237002a, 0x80178b12, 0xb070a293, 0x0b52c39f, 0x576ca964,
  214216. 0xe3925153, 0x19d68e36, 0x25559424, 0x09e50e84, 0x291fb82c,
  214217. 0x6618ed8c, 0x7dd22ea6 },
  214218. { 0x49cbb3bf, 0x7ffe844b, 0x5562fb25, 0xde0cc704, 0x9f5a845a,
  214219. 0x1e6ee537, 0xe51277fc, 0x956d7f26, 0x30635718, 0x2c75d4b9,
  214220. 0x96957f34, 0x39a14892, 0x82e5742b, 0x8cf4eb32, 0x83247b72,
  214221. 0x6b0d3ddd, 0x201a4237, 0x67a9f633, 0x1414a485, 0x416403c1,
  214222. 0xb6f6a916, 0x60afd447, 0xdac6f790, 0x95f94930, 0xbd3b9d82,
  214223. 0x685ff94b, 0x51cadf0f, 0x5c8f98fc, 0xb13b7489, 0x9559c88a,
  214224. 0x5f18fcc8, 0x31377c66 },
  214225. { 0x7dcfb35f, 0x35c5de09, 0x01cc36f8, 0x2dccca9f, 0x7576cb63,
  214226. 0x7e93e85d, 0xf7b4b375, 0x0c2dd48a, 0xb09a19b5, 0x9d95cd4f,
  214227. 0x71bfe607, 0x752ed159, 0x2596dad2, 0x439880cf, 0x69e90a6f,
  214228. 0xe52efb53, 0x03d3e60a, 0x44097663, 0xa95070e0, 0xfcf364fa,
  214229. 0x05624dd2, 0xd8f993b6, 0x00d5e467, 0xb35a9824, 0x0c8f4524,
  214230. 0xe289d024, 0x648a0179, 0xef45423c, 0x587edabd, 0x3a5fd695,
  214231. 0xa11e5271, 0x3dacc50c },
  214232. { 0x6499ae4c, 0xcb3e4f94, 0x7053c527, 0xa46dcbe1, 0xbe782e8a,
  214233. 0x807f5ce9, 0xd8481e45, 0xb6c64d28, 0xaa286fd0, 0xf35e4518,
  214234. 0xdf1cdb49, 0xf7b7b9ba, 0xaec23eaf, 0xf3fb6210, 0xb9bfd2fb,
  214235. 0x0a9ba385, 0x8807f3a0, 0xe51a0d53, 0xb17b2842, 0x7ab24404,
  214236. 0xf9dd9f0a, 0x6fd57687, 0xf3e9df64, 0xcd1efdb4, 0x60df194d,
  214237. 0x5dd2df7a, 0xe069df05, 0xbed3f2c3, 0x23248a31, 0x469b7561,
  214238. 0x694744f7, 0x866949e1 },
  214239. { 0x3f4ab07a, 0x3a9a0da5, 0xf54a6fbf, 0x2cd6f333, 0xb23cf290,
  214240. 0x0c92e921, 0x848e3d58, 0xc9581c3e, 0xd3b218ab, 0x93af1fbd,
  214241. 0x066cb4d7, 0x38598ea1, 0x990c03a0, 0x5001394e, 0x7d0877b5,
  214242. 0x3b664b1e, 0xd74c7091, 0xd79db1bb, 0x4e2d5dd0, 0x852d4435,
  214243. 0x3329db82, 0x0d2b841b, 0x7b96d480, 0xfa844eb0, 0xc295dc46,
  214244. 0x37a50569, 0x94f7ec4e, 0xc2d38373, 0x5b083177, 0xdc3884ff,
  214245. 0x8b1fa598, 0x574352b8 },
  214246. { 0x0d5d7ce9, 0xed2193f7, 0x0b487eaf, 0x3c19fd26, 0x7be65fd0,
  214247. 0x7c44ab59, 0x78270d56, 0xdd9da860, 0xbaa70198, 0x8a84ec00,
  214248. 0x285985df, 0x2ec27e49, 0xde2028d8, 0x996ccaf0, 0x61c2201d,
  214249. 0x4e7648c7, 0x091c19eb, 0xa96335bc, 0xf0d6782b, 0x253a3a69,
  214250. 0xd2946493, 0x3f204340, 0x099f6873, 0x444521a1, 0x6996011a,
  214251. 0x5fcbcc09, 0xf853a94e, 0x3884d5d8, 0xd3b6a3a1, 0x2418c624,
  214252. 0x06ae3c4f, 0x3e431af2 },
  214253. { 0x83d381f1, 0xf967d939, 0xd0c033c3, 0x36501aae, 0x54410768,
  214254. 0xbf3af4d0, 0x5093a6d3, 0xa86d1598, 0xd92f2900, 0x43ae0741,
  214255. 0x36f0b755, 0xfeb2afa6, 0xaa456d6f, 0xd090a6a3, 0xaefdb646,
  214256. 0x336a4fda, 0x1a942f7d, 0xfd1bfe44, 0x851ee41e, 0x7fc2a3ed,
  214257. 0x11e935c5, 0x4f1c9686, 0x53bbb343, 0xcd577666, 0xad896c2a,
  214258. 0xf26931ba, 0x86bbfa41, 0x8a0fbbd1, 0xa203cef1, 0x1c3d7d82,
  214259. 0xe2664d35, 0x6dad3f15 },
  214260. { 0x12ec35a1, 0xd1940b7d, 0xe7dfb128, 0x6219c5b6, 0xf13321d5,
  214261. 0x2cc278c6, 0x33c58eb6, 0x5e76904a, 0xd9903c43, 0x15090f55,
  214262. 0xc3d96a19, 0x061bc926, 0x8c0acba7, 0x974a9f03, 0x7198b21b,
  214263. 0x7a414021, 0xf8958c6f, 0xb069599d, 0xbebd0129, 0x517f2f1d,
  214264. 0xdf3a8dc3, 0x1109a613, 0x672375c5, 0x08e58448, 0x9383d2d3,
  214265. 0x56590ba4, 0x0bff837c, 0xfc3ee7c6, 0x27d2d55f, 0xc87a5390,
  214266. 0x5f517a3f, 0x2438e9d4 },
  214267. { 0x8815af3c, 0xc4a45308, 0xf3c9bed5, 0xe55f1a32, 0x97b65ddf,
  214268. 0xaef1cdc9, 0x12e51eb5, 0x61c61d94, 0xe63f2490, 0xbd0dac54,
  214269. 0xd0b3e231, 0x6f14429c, 0xf1da6010, 0xf737c3c2, 0x6bbc4fb1,
  214270. 0x7150e04b, 0x1be281cb, 0x205b4c89, 0xd7701f5b, 0xf1b4633c,
  214271. 0x2a513490, 0x8b33ef46, 0x68f1f7f2, 0xddb47c73, 0xbd416b67,
  214272. 0xf4ada511, 0xff795bb3, 0x9d2a97cd, 0x96200e67, 0x00a8b7b2,
  214273. 0xafe30e01, 0x13f39011 },
  214274. { 0x7bd0c827, 0x3dd296ef, 0x4a29ff46, 0x506110f3, 0x1c9a515a,
  214275. 0xf8793068, 0x268bca77, 0xde8d8045, 0x998045df, 0xcbb83024,
  214276. 0x68c0e584, 0x3f90d710, 0x263b6062, 0x2a838ca8, 0x535c5d0b,
  214277. 0x293bb5e7, 0x56415110, 0xceea99d5, 0x1bbda005, 0xfe311ad0,
  214278. 0xa4d8d018, 0x2497e0bf, 0x1cf2b866, 0x33dd77a0, 0xd8c4ba8b,
  214279. 0xbc075b73, 0x722b7bc9, 0x298466d4, 0xcbda1b0b, 0x17a7ce24,
  214280. 0x680703b6, 0x458d4b6b },
  214281. { 0x4d54d8b2, 0x8a26a20e, 0x4d320a0d, 0x05a5696e, 0xf994f700,
  214282. 0x698b5858, 0x2f6549a8, 0x7a4adc3c, 0x3694d00d, 0x1812e819,
  214283. 0x730402bd, 0x46b9b000, 0xa1b36410, 0xe10a1449, 0x99230220,
  214284. 0xeae95ea5, 0x1b4820c3, 0x3efc2e9b, 0x85c9eb8a, 0xfe5b5cb5,
  214285. 0x97847064, 0x21ae0319, 0x8f27d49f, 0x68ef0b70, 0x2f72556b,
  214286. 0x3259ef18, 0x624db01a, 0x00ae0457, 0x5668f95c, 0x628e3b06,
  214287. 0xb6fbbf91, 0x5f13f5fa },
  214288. { 0x3a9b0dc6, 0x7c6ed9ae, 0x6f883ec8, 0xaea1bde9, 0xea8b3677,
  214289. 0xea66bf88, 0x9a66e3ab, 0xdefa6abc, 0x68217ffd, 0xc4d3317b,
  214290. 0x290df05c, 0xf741c8f2, 0x7d11674e, 0x1f0fdf17, 0xc35989ca,
  214291. 0xfdf0ece7, 0x6b9c482d, 0x0eed92df, 0x55bf1ca7, 0x73713e66,
  214292. 0x25cec99c, 0x90acb290, 0xe803e69c, 0x37c9e3a2, 0x17713a1a,
  214293. 0x7c0a3c53, 0x6f5a174d, 0x350dc565, 0x05f802f6, 0x11625a44,
  214294. 0xa37ba4a2, 0x2196495d },
  214295. { 0x13142680, 0x00cb2fd3, 0x65d14cf4, 0xab9e91d7, 0xdfe2669e,
  214296. 0xc6a0ceab, 0x0ae22bc5, 0xbeefce58, 0xcb6ec250, 0x3c2b7986,
  214297. 0xd738f1ff, 0x84adb1a2, 0x516ec8ec, 0x9709bc28, 0x8e8f7db5,
  214298. 0xf3693129, 0x95b197f9, 0xc48efc6b, 0x9aaaa404, 0x9ff10952,
  214299. 0x144154b0, 0x2c3c8cbd, 0x427f3435, 0x33ef7bc3, 0xd21897c1,
  214300. 0x04a17940, 0x6ce548a0, 0x5aa0c47d, 0x3d56fa62, 0x2971cea7,
  214301. 0x04475f08, 0x93ad0eb0 },
  214302. { 0x988a9963, 0x7a0b6967, 0x6515e8dd, 0x61e477f7, 0x3b6b50f2,
  214303. 0x6274e386, 0xd33922de, 0x63a9b8d5, 0x687a5b3d, 0x3c38d3fb,
  214304. 0x1302e323, 0x18f6f09c, 0xe02fcccf, 0x254c05c3, 0x26e662f7,
  214305. 0xc04ed0b7, 0x143fe079, 0x1d5646b8, 0xc9016c8c, 0xef8a9448,
  214306. 0xf823d797, 0xe5674c4b, 0xbccde451, 0x0586f72f, 0x4417eade,
  214307. 0xc5fc88d5, 0x576e588d, 0x2b952209, 0x5844d1f9, 0x4408dd42,
  214308. 0xea41c034, 0x73f8c3f0 },
  214309. { 0x5df763dd, 0x89534fc8, 0x3ac71836, 0x3b1427f3, 0x6e8f15a0,
  214310. 0x0db5be17, 0xcb20888e, 0x1d390944, 0x857caea6, 0x7804c9ad,
  214311. 0x519f7bf3, 0xaa584428, 0x293aa8cf, 0x626eecf1, 0xea36a015,
  214312. 0x749e0d98, 0x3321edcd, 0xefff6dae, 0x28b791cc, 0x963deea6,
  214313. 0x2d16e361, 0xa14e0552, 0xb15ae206, 0xa2e058fc, 0xfca325e4,
  214314. 0x0f268745, 0x21341a8a, 0x7cf9d407, 0x7caa51b8, 0xdfed25d9,
  214315. 0xadbedd75, 0x0108ae39 },
  214316. { 0xa9e88f63, 0x54d178f3, 0xab0c7325, 0xaa05b11e, 0xe261d8a6,
  214317. 0x773a53e6, 0x8d0b91c8, 0x24db7dae, 0xe9bb004d, 0xde10b073,
  214318. 0x54e3090b, 0xfc8befe7, 0x0cc69c89, 0x16af0599, 0x9d59511a,
  214319. 0xddc83803, 0x46c5dafc, 0xc3f65b99, 0x1ee0a599, 0xfbbe4be8,
  214320. 0xfb3a9b17, 0x88891e36, 0x445dad00, 0x0c9aad75, 0xd5097e1f,
  214321. 0xdffc46ab, 0xac85a4e1, 0x8848089b, 0xa0c45233, 0x348bb42f,
  214322. 0xeb13c1df, 0x807c06d8 },
  214323. { 0x98ee0ef6, 0x00a969ec, 0x8bb7b7af, 0xba9d5483, 0xa02f8fdb,
  214324. 0x24484c92, 0x8b70557c, 0x7bdb201a, 0x60ad1af2, 0xe59343e4,
  214325. 0x998c95fb, 0x53a9a942, 0xda861d3b, 0x974db3de, 0xed399c0e,
  214326. 0xce1525c9, 0xf72109bd, 0x89b56881, 0x998211a4, 0x08ff7d15,
  214327. 0xef0f275a, 0x5df76b3a, 0xfa2f358b, 0x93f180f7, 0xc39b0634,
  214328. 0xaac4ffcf, 0x17583b53, 0x2692c626, 0xb55399fc, 0xb2fdfa36,
  214329. 0x99607a61, 0x16424c6c },
  214330. { 0xdd2744a9, 0x5dd65c55, 0xfe3af418, 0x2544c1c2, 0xefe8b089,
  214331. 0x32c82e99, 0xa9df691a, 0x30b7ab25, 0x9be99674, 0x98384550,
  214332. 0xcaf2d122, 0xbcecd258, 0xbcc77272, 0x88ae4098, 0x4b8efa0c,
  214333. 0xd4396141, 0xed64d12c, 0x44ff67b9, 0x2e7f3404, 0xa9e655e4,
  214334. 0x45b0e9eb, 0x3d16fc45, 0xf03ded28, 0x474a3e14, 0xacccb85c,
  214335. 0xa3c9adff, 0x7253a51b, 0x3dfe6bc1, 0xfb5831b1, 0xdddaf4b9,
  214336. 0xa4f4478a, 0x5544e602 },
  214337. { 0xbaa80b4f, 0x897c5313, 0x63bdc8ef, 0x0122716f, 0x7b42c5a8,
  214338. 0xae2742db, 0x0883308c, 0xe9d9e1e9, 0x2d341ab1, 0x352c8c3f,
  214339. 0xed945870, 0x163d0500, 0xc290d9d8, 0x8349dd73, 0x1f6c7d29,
  214340. 0x2053c5e0, 0xcb42033c, 0x83107446, 0x09d09af1, 0x76c88bd2,
  214341. 0xb2794681, 0xd0f70e6e, 0x19b1b540, 0x720b59de, 0x22994b43,
  214342. 0x80b7ecdc, 0x2dec53cf, 0xc1a4cdce, 0x1ed60f42, 0xdd7d3edd,
  214343. 0xe241d261, 0x5735995c },
  214344. { 0xa0237056, 0xdc4ba3fb, 0x33ab3388, 0x6856c164, 0x271ec612,
  214345. 0xc01eebbd, 0xe3031bec, 0xabdeb033, 0x6118a1f5, 0x4eee4419,
  214346. 0x5b600f33, 0xec497421, 0x08868773, 0x1b7185cf, 0x7c1b7dfd,
  214347. 0x7b0c46cd, 0x4a4c5e89, 0xd143b2da, 0xbb1ff94d, 0xdb9a5984,
  214348. 0xc9cf3465, 0xac3904e4, 0xeace64c9, 0xf8729bc0, 0x768ad99a,
  214349. 0x5cc22821, 0x8a9540c2, 0xbbd3b081, 0x049a6917, 0xe468ed5f,
  214350. 0x3ec45ef0, 0x885486df },
  214351. { 0x4bdff464, 0x6a942c93, 0x25a7b451, 0x3db2719f, 0x325be324,
  214352. 0xccb0070b, 0x19fe3339, 0x2055a31b, 0x241ee8ff, 0xaca69ae8,
  214353. 0x55ef8def, 0x7607dd08, 0x1a1b73c6, 0x9e24960f, 0x71d36810,
  214354. 0xbcb0e8a2, 0x6885e6b9, 0x29e11aa2, 0x185eae19, 0x98b5d0ab,
  214355. 0x0f81f91c, 0x1a0b96e4, 0x994fc503, 0x4d0e8bcf, 0xf119d6e0,
  214356. 0x33d81697, 0xaaa4ce0c, 0x29083287, 0xc91ff9d7, 0xc5dd4d3e,
  214357. 0xd4ab962d, 0x31cecfe8 },
  214358. { 0xfc8b21e8, 0x437bfd9a, 0xb19436df, 0xe5dd32b3, 0x921c36a0,
  214359. 0xfe5902d4, 0xa3d0fa90, 0x8e9de84d, 0x5bb523bd, 0x9663e6ad,
  214360. 0xaecd6975, 0x9800a23f, 0xb4fbb59c, 0x1009c0d9, 0xc9d20ff1,
  214361. 0x839aa7bd, 0xecd6fa3d, 0xf502f66d, 0xc5516ca9, 0x480ed4fb,
  214362. 0x6c742ac4, 0x65ffa5f6, 0xff3252f8, 0x2b7c7945, 0x75d9cb3d,
  214363. 0x72fefc05, 0xd6d6f1d2, 0x11b0863b, 0x9a6a4ec3, 0x5d8f3cf0,
  214364. 0xda2547b3, 0x6961b46a },
  214365. { 0xcb35e2ac, 0xd07b587e, 0x57af14d9, 0x1ed5546b, 0xdb28a04c,
  214366. 0xeca17a5b, 0x709d54f0, 0xa1f91d44, 0x9c6f400e, 0xa6e719fd,
  214367. 0xfb8ce190, 0x4e4b88ed, 0x246e3fd2, 0xf9781edd, 0xb655af5d,
  214368. 0xd67120e6, 0x93413ca7, 0xda782d1d, 0x9707fa21, 0x697e20a2,
  214369. 0x54e84123, 0x1eb51f32, 0x36051f9f, 0x2e254d9e, 0x73ce5be9,
  214370. 0xddaec42b, 0xcd3f794f, 0x89a9a32e, 0x0781aad9, 0x1964e22f,
  214371. 0x53755212, 0x6a63a90c },
  214372. { 0x3d7acbbb, 0x76554e00, 0xb74f6108, 0x2c01668a, 0x388c519b,
  214373. 0xe4a29672, 0x3eb94d4f, 0x01667714, 0x0cd6d2f6, 0x086a3cdf,
  214374. 0x7b370f7f, 0xf8658021, 0x5a4d3e7c, 0x658880c1, 0x5ba3f4a1,
  214375. 0xd6ed5816, 0x5ca471dd, 0xabcc7813, 0xe844a576, 0x809bf074,
  214376. 0x6ea502ea, 0xa53a81b3, 0x0e021ed3, 0xc20b9307, 0x8617f165,
  214377. 0x8c27f892, 0x8235cd0b, 0xa5476446, 0x82552961, 0xffc89ffd,
  214378. 0xd151d90e, 0x51ed4a22 },
  214379. { 0x449701b4, 0x37d6963a, 0xbb27caf2, 0xea8d91a3, 0xb572965f,
  214380. 0x3ef9be15, 0xdb50bf7d, 0x75a7a055, 0xce643b9b, 0xfd67480e,
  214381. 0x6ceb5d5e, 0xf2a60d2d, 0x5ed7c897, 0x68fc320c, 0x28ce685f,
  214382. 0x41c53cf6, 0x7106615e, 0x0e29711f, 0x23500ecc, 0x7a872138,
  214383. 0x6c29fe48, 0xaf0a9260, 0xe1ef9712, 0x93df3f2a, 0xd2d169bf,
  214384. 0x0d5f6fb1, 0x74a9793c, 0xeb7afe26, 0xe9f49256, 0x4173d94a,
  214385. 0x2b8b5ce5, 0x2d6951bc },
  214386. { 0x904e222e, 0xdd007d9f, 0x86f4e109, 0x333f248f, 0x8f429eee,
  214387. 0xd4994e8b, 0xcfc77518, 0x29573415, 0x0b0f42f1, 0x6e7fea3a,
  214388. 0xc2743519, 0xc795cb7d, 0x711e71a0, 0x820a8f66, 0x2b874f55,
  214389. 0x83d95d9c, 0xe70e1627, 0xd4b64d78, 0x8b92a742, 0x924353f5,
  214390. 0x447b5e6d, 0x322048b1, 0xbcf931a0, 0x0bad730c, 0xa7af2268,
  214391. 0x75c4d089, 0xb83b93f9, 0x464904c1, 0x165b3aee, 0xa24eba02,
  214392. 0xe08cc5f0, 0x65c48e78 },
  214393. { 0xde222c22, 0x1a1c73ce, 0xfcea23b4, 0x5683d8cd, 0xb2143b06,
  214394. 0x0301cb14, 0x59fcec77, 0x284adf8f, 0x31204cef, 0xfb1c581c,
  214395. 0x94735107, 0xf54d3eee, 0x4d3188c0, 0xdbf67f0b, 0x10f18d12,
  214396. 0x76a3f2d1, 0x07d3e013, 0x3809fa28, 0x25e7ece0, 0xf06f0a46,
  214397. 0xb2895d2e, 0xd82867ed, 0x08b0553a, 0xe106f489, 0xef245445,
  214398. 0xe2280fa6, 0xa8d9a3cb, 0x402d5785, 0xd438ba2d, 0xf63dd9ff,
  214399. 0x7a6b226f, 0x36b5cd2c },
  214400. { 0x545679a7, 0x87ff4e20, 0x4520c750, 0x64d80b41, 0x9b459cd8,
  214401. 0x90a357fa, 0xc85af1a3, 0xa19eaf39, 0x8d935a5e, 0x0d475d79,
  214402. 0x781a678a, 0x74501983, 0x0cc2e810, 0x74839779, 0x2f412244,
  214403. 0xc6a21d11, 0x36a51a37, 0x8d0e85f9, 0xeaa74df8, 0xff50151e,
  214404. 0x93cf99c4, 0x14e182a7, 0x376a9ab6, 0x45593df1, 0x522389ff,
  214405. 0x18f73caf, 0xf7445e8a, 0xd27cc960, 0x39a51dc8, 0x0692f4c5,
  214406. 0xdb39bfd8, 0x08d7c144 },
  214407. { 0x3ecca773, 0x809c0d96, 0xd48c2156, 0x87ea9192, 0xdb6bd641,
  214408. 0xf0eccd74, 0x2a678cdf, 0x77312374, 0xd1587b7e, 0x7a966d8b,
  214409. 0x6130a4c6, 0xf3c1a101, 0x5fce17bd, 0x7cc6e838, 0xa8de7aa4,
  214410. 0x95e95bb8, 0x898308e3, 0x3fe1e8b5, 0xe347694a, 0x0197243e,
  214411. 0xbb0cd2bf, 0xf3fe9c42, 0x0f9b2b49, 0xb5905264, 0xc7367d1f,
  214412. 0x4c385e8b, 0xb5ee147b, 0x1d3050ae, 0x04004ad9, 0x8e2c3879,
  214413. 0xbab70202, 0x5f2aa8ee },
  214414. { 0x1266524b, 0xe208d464, 0xd0a19f66, 0xb7bf3880, 0xda106ebf,
  214415. 0xa5aa685e, 0xe642dd46, 0x0a69e8d3, 0xc682e4d6, 0xef349c61,
  214416. 0x0fcb534c, 0x26f6ee3b, 0x05eb67b8, 0x7daba127, 0x18be05f6,
  214417. 0x2babb27e, 0x8e2d85d1, 0x959afcba, 0xe2d9d386, 0xedcf2d1a,
  214418. 0x1ea6f06e, 0x59dc52e6, 0x866e5ae8, 0xc28278b4, 0x02bcd3c7,
  214419. 0xd9ff0340, 0x784be82f, 0xe884ac76, 0x83c9f224, 0xa3164980,
  214420. 0xb46ff949, 0x62501a98 },
  214421. { 0xad264086, 0x563f7d9a, 0xa5e0e4bd, 0xca6a33db, 0x8c8d3d67,
  214422. 0xe8253002, 0x46e64b19, 0xa288dac8, 0x20aa4536, 0xfa3c9197,
  214423. 0xed553eac, 0x8130c9b0, 0x2ea8abd3, 0x622806e0, 0xceccfe77,
  214424. 0x52fbf54d, 0x4f0d1b70, 0xbd9a8e31, 0xd59b1741, 0x519d2133,
  214425. 0x9a6fea8a, 0xfd74101c, 0xb5c4eb10, 0xd1acf7a0, 0x91f9da5e,
  214426. 0x78499b73, 0xc0dea586, 0xabaa4c49, 0xa1f3531a, 0xcc9c5f73,
  214427. 0xfd3fc665, 0x497b15fe },
  214428. { 0xf45568e9, 0x8a56cbaa, 0xc7192a6f, 0xf491a0fe, 0x9ab2539a,
  214429. 0xdbb03dd3, 0x4ac37da9, 0xc86522f8, 0x02a0f5b4, 0x8c8cdba2,
  214430. 0xa29c539f, 0x8109fc75, 0xca90f02e, 0x9cd06d31, 0x3e216dbf,
  214431. 0x8f31f044, 0xba3ebd91, 0x99aa68ac, 0x42c007f4, 0x2a80d0d2,
  214432. 0x86a9b7ce, 0xdd8dffbf, 0xd6308edc, 0x405d3e84, 0x068012ca,
  214433. 0xdafa33fe, 0xedea1071, 0xc2eebd13, 0x2ff637e6, 0xb7ae7e5c,
  214434. 0x9e514cb7, 0x18d46a6c },
  214435. { 0xa78b7802, 0x868cbb22, 0x497cbaf4, 0x0745ddb2, 0x42ae8add,
  214436. 0xc4eb2f3e, 0xb4ceb4e4, 0xac0abcda, 0xa325fd40, 0x2e0d8325,
  214437. 0x13ac7345, 0x6cfe0571, 0xb14171b9, 0x7407a788, 0x6da7a52b,
  214438. 0x70eb0603, 0xd85176ac, 0xab0b36f9, 0x7c2954f3, 0x14109d29,
  214439. 0xdcd705ad, 0x370de9c8, 0x7bb5e751, 0x3f0db5cd, 0xa06e708c,
  214440. 0x45f93d41, 0x7e93050d, 0x10d54f8a, 0x5a38fef9, 0x69e6f8e4,
  214441. 0xd3f62e40, 0x55044601 },
  214442. { 0x06cb9cc9, 0xd1c5c910, 0x41d00014, 0x542074d7, 0x11236fb8,
  214443. 0x7cd8663e, 0x29ad5f82, 0x39721ffe, 0x2951fc83, 0x1d21fbfa,
  214444. 0x400d144f, 0x1cde06e7, 0x91792e6b, 0x9042596b, 0x29ad5166,
  214445. 0x3365c8e5, 0x9aeefe98, 0xe2220e85, 0x70c2aee3, 0xbcb53189,
  214446. 0x9ff100bc, 0x477ca3db, 0xf532973f, 0x27074176, 0x9a2bd01b,
  214447. 0xa12118ac, 0x3dd79f93, 0xf3425209, 0xc6f5d7db, 0x563a8ff7,
  214448. 0xd7b0ec4f, 0x0da313fc },
  214449. { 0x15aa2557, 0x37125a8c, 0x00893e9c, 0xca21d70c, 0x67b8a823,
  214450. 0x48713994, 0x7cb0042a, 0x0d3e9a74, 0xc9e2ce18, 0x2d2bf4ff,
  214451. 0x049aeac2, 0xd5531a0d, 0xf03d0660, 0x4d29a616, 0x1f1b7f00,
  214452. 0x473d50d6, 0xca3de50c, 0x3af0ecbb, 0x09c28f27, 0xe2959bea,
  214453. 0xf8704664, 0x6d7c2ea0, 0x731083ef, 0xadfae4e1, 0x941c2554,
  214454. 0x50940c26, 0xa1162d03, 0x44167410, 0x1e82290e, 0x620230d8,
  214455. 0xdb414acc, 0x63630be8 },
  214456. { 0x8a7d2e41, 0xbf8d5222, 0xeb62f879, 0x49e75823, 0x6c402d89,
  214457. 0x1b4d33dd, 0xde2c59ad, 0x883e04d6, 0x49b9dc38, 0xbf3f38f4,
  214458. 0xb4b70c4c, 0x9d997d18, 0x13cea045, 0x1f69b20c, 0x58e2606d,
  214459. 0xca3d7025, 0x261d1b79, 0x3d4fd977, 0x5a1436fa, 0x56aeafa8,
  214460. 0xbb443c07, 0x369b3e98, 0xe558f6be, 0xfce5186c, 0xf8ac8f89,
  214461. 0xeb0cd478, 0xd5e5aa72, 0x68074f37, 0x68544eb0, 0x295845c0,
  214462. 0xf16688ed, 0x306a9871 },
  214463. { 0x634ec136, 0xbc451e9d, 0x0e6f658f, 0x1edf27ca, 0xc0db4120,
  214464. 0xa9be0152, 0xc5bfee67, 0x87b6ef20, 0x9a2d6023, 0x35283238,
  214465. 0xc7afb899, 0x60e564d8, 0x0ac9c2de, 0x4af22bc0, 0x82a9d22b,
  214466. 0x28e6f631, 0xf532701b, 0xc075c701, 0x82075f91, 0xf6d418f8,
  214467. 0x1beaa511, 0xf9fa628d, 0x6e72a13d, 0x551e7a17, 0x77f4c01c,
  214468. 0x9306215b, 0x93c9d588, 0x71aba731, 0x58e57cd4, 0x6443ebe0,
  214469. 0xe8103e37, 0x2833ac41 },
  214470. { 0x8da5ec5c, 0x7e564b86, 0x1c08db24, 0xac3d9da8, 0x8c57a728,
  214471. 0x9d7c1f0b, 0x9d343dc2, 0x3512afe7, 0xfdc60339, 0xb438e4cf,
  214472. 0xdcfa1941, 0x7d5a2700, 0x27320449, 0xd5f323f8, 0x1393c6e6,
  214473. 0x1b87a58e, 0x04baa431, 0xecb68bd1, 0x4722b4d7, 0xc09c1c5a,
  214474. 0x206b5faa, 0xf42faa97, 0x9976327e, 0xe1dcbcd6, 0x087787d9,
  214475. 0x655ba9e4, 0xde5c0191, 0xbd59c757, 0x0bcf3538, 0x673020ed,
  214476. 0xa49d6303, 0x120cd454 },
  214477. { 0xcab0f9ee, 0xebfdb8f4, 0x2cce58ee, 0xbc003ef0, 0x5a8d0665,
  214478. 0x9b6a6841, 0x9b957774, 0x642ed3a6, 0x4721ab5c, 0x3de487f0,
  214479. 0x21a4f0d3, 0xef2ff380, 0x29dbddcd, 0xbd16f558, 0x0e93dff2,
  214480. 0x2ef05b4b, 0x0bc9aec1, 0xde1faa12, 0xd467fa92, 0x66dae2c2,
  214481. 0x5eb33e34, 0x758daf64, 0x8f0103cb, 0xa67ad9f6, 0x9be02430,
  214482. 0x151f693a, 0xeb4054bc, 0xd5698496, 0x7019336e, 0x8ef1677e,
  214483. 0x7fdeea3e, 0x021cfd16 },
  214484. { 0xdf5c36f3, 0x5c73715f, 0xd64ad254, 0x703bde37, 0xf2cf7713,
  214485. 0x55368d10, 0x0f3993c8, 0x1e5ec7b7, 0x304ae4ca, 0xfdb16776,
  214486. 0x3d3bb18b, 0x0d8f717e, 0x66343d5a, 0x5267073f, 0x156008b5,
  214487. 0xfaeb52ef, 0x224a470f, 0xb97ad5f9, 0xed2ab51a, 0xaf86e391,
  214488. 0x9974302c, 0xdc0c7e57, 0xfd0ae28a, 0xc88fa817, 0xbf8ed59c,
  214489. 0x807c22df, 0xeb128bb6, 0x5dedc231, 0xa20595a3, 0x71edcd9c,
  214490. 0xc73cf78e, 0x07265b46 },
  214491. { 0xbd66232f, 0x73dd99f0, 0xc4027716, 0xc59aaf89, 0x5b860fc4,
  214492. 0xaf826dfa, 0x7a943f3b, 0x239ea8aa, 0x523c428d, 0x0e0e1b1a,
  214493. 0x6973b95a, 0x55ea0e3a, 0x2557753b, 0xea399caa, 0x06957b1f,
  214494. 0xf8adf72f, 0x3bd34302, 0x0389f341, 0xf8a43a97, 0x333f27d0,
  214495. 0xadaf796f, 0xcd9c0c08, 0x49c12aa2, 0x6dcca49b, 0x7a0ac6e9,
  214496. 0xdd88deee, 0x0644080e, 0x8f47575d, 0x0cc2f4bd, 0x6e9d667d,
  214497. 0x31d1496c, 0x36c5754b },
  214498. { 0xf323d84b, 0x9120046e, 0x7e789c4f, 0xa6991122, 0x921b8055,
  214499. 0x4b0eaf4e, 0x8079974e, 0x6339844a, 0x740f8c79, 0xc905466a,
  214500. 0xcd6def49, 0x1c18d0f7, 0x4b23e4ba, 0x5297da6b, 0xc41800c5,
  214501. 0x1c09dff3, 0x37ef6777, 0x6c49075b, 0x50513ded, 0xa94c3a40,
  214502. 0x6b0b1705, 0x3d6742e9, 0xc48af5ae, 0xc0784494, 0xc95822de,
  214503. 0x40c01532, 0xc164d94f, 0xa2ddade5, 0xa2975eb5, 0xfc8a8ac9,
  214504. 0x1946944e, 0x06fbf861 },
  214505. { 0x3f45aa97, 0x2d65338e, 0x1d040feb, 0xd83b58c8, 0x0fdef8b9,
  214506. 0x05fef59b, 0xe4d7417c, 0x7beb071a, 0xb30a1a23, 0x982b61f5,
  214507. 0xfb65bd03, 0x4c5f2a2a, 0x5cbf6bf3, 0xe40abc9d, 0xf06612a5,
  214508. 0x422c326d, 0x9571ae28, 0xc921e69d, 0x23d3434e, 0x7c88b10b,
  214509. 0x9da07933, 0x96d2e957, 0x3619cf4d, 0x833d46a1, 0xd95eefa1,
  214510. 0xd9d19653, 0xa03e8f0e, 0x2a7d8411, 0x04bb5ab1, 0x5e642953,
  214511. 0x1f0fa9ea, 0x5e9ca0fd },
  214512. { 0x197c5dc4, 0x5bd54571, 0xe78a95a2, 0xe2da40bf, 0xffdb0eb2,
  214513. 0x65fb9efc, 0x0d17467c, 0xe952dc2c, 0xc758c6a3, 0xc1fc9c7b,
  214514. 0xd4034a9a, 0xfc79562c, 0x61f64b56, 0x26e36fbe, 0x1e84728b,
  214515. 0x6adc4b9e, 0xa8f9ac8a, 0x7f165fd3, 0x03e3e013, 0x7bc93a45,
  214516. 0x656478e3, 0xeacc5513, 0x064ddc77, 0xd3391717, 0x76936914,
  214517. 0x75b318dc, 0x362424a6, 0x69b1f1c7, 0x49955f34, 0x8cc2045b,
  214518. 0xc6836af8, 0x940622b3 },
  214519. { 0x0d997973, 0x4710ccb7, 0xd3f8f115, 0x3b29625d, 0x5b97abd5,
  214520. 0x8cf0c4d5, 0x673e14a5, 0xc6321e0a, 0x3d262246, 0x0541af9d,
  214521. 0x6fc83b11, 0xde6d8754, 0xf01652a4, 0x47e97da8, 0xad9802b6,
  214522. 0x0f82b3a6, 0xae9c44b2, 0x69aa4075, 0xced2bf77, 0xaf3f5de2,
  214523. 0x497a40da, 0x1ef1ea8a, 0x3c23ba9c, 0x2e0f8608, 0xf190a2c8,
  214524. 0xd8a998a4, 0xcfde3368, 0xe2b49c8c, 0xbde6bd71, 0xb9f49824,
  214525. 0x785bedb6, 0x80bb1664 },
  214526. { 0xfd145cb5, 0x05e575fe, 0xac5e6883, 0x155ee561, 0x8793b273,
  214527. 0x461e70cf, 0x133b2338, 0x9f1553de, 0xa2a7ba07, 0x2fb9e0c3,
  214528. 0x3e7086fa, 0xc3bfd6a8, 0x8bb4cb93, 0xb6ba8500, 0x76f82dbd,
  214529. 0x0b66d789, 0x54eb49ff, 0x7d5a6ff6, 0x1f20b322, 0xcd65d237,
  214530. 0x54e29cdc, 0x79ea49c2, 0xcb118ff9, 0x64975963, 0xcc58000b,
  214531. 0x969598dd, 0x110c779c, 0x95107918, 0x63b85a35, 0xedfc1548,
  214532. 0x41212350, 0x077ba5ea },
  214533. { 0xcdd86f61, 0x0b3a38d3, 0x0502a0ab, 0x43121445, 0x806d0272,
  214534. 0x1912edc5, 0x8a32f10f, 0x01dc1f98, 0x0e80c760, 0xbb1d31d1,
  214535. 0xf464e8b3, 0xd46ec7e5, 0x9abf49ee, 0xd569af36, 0x2cdade77,
  214536. 0x9d286ea7, 0x45ad5920, 0x2be7020d, 0x6299ae7f, 0xabe5236e,
  214537. 0xd3f55c07, 0xc93179bd, 0x52350e80, 0x8138995a, 0xaff07586,
  214538. 0x0901265c, 0xf4739653, 0x5b3c81b2, 0x9bc77d21, 0xbaf7581d,
  214539. 0x4591a2e2, 0x6b2006df },
  214540. { 0x965b1bc1, 0xb2fe50a8, 0x962bb4fd, 0x931f536a, 0x000e7f99,
  214541. 0xd5718d33, 0x53d5125e, 0x84728f25, 0xd2125caf, 0x4f8a6184,
  214542. 0x357f679e, 0x54f1a701, 0x1531c05a, 0x70a9f40c, 0x6fa8b775,
  214543. 0x10d0cb97, 0x9dc12ce9, 0xb476f41e, 0x2755f894, 0x5c8d7a75,
  214544. 0x625741a4, 0xd6c12e10, 0xc917b16c, 0x262a6fb8, 0x38d6b0a0,
  214545. 0x24d116e6, 0x32c38e83, 0x849540c0, 0x66868afc, 0x855b911c,
  214546. 0xbd26b550, 0x53217ea6 },
  214547. { 0x259f52b4, 0xfc840473, 0xe621146c, 0x968da9cb, 0xcacbd26e,
  214548. 0x964eb85e, 0xe4a54344, 0xab7daa2d, 0x381a4ff7, 0x6dc3b848,
  214549. 0x41c815ef, 0xa07a96b3, 0xc3d4b1e1, 0xc4fae9e8, 0x42ce9ea8,
  214550. 0x0f938d1e, 0x35cc052f, 0xa727dacc, 0xe9a06f07, 0xc81e01c9,
  214551. 0x4a6d65a1, 0xa9e08dcb, 0x6044a9a6, 0xf8e2d173, 0xf2bd295b,
  214552. 0x99893dd0, 0xf9781b12, 0xa08d3379, 0x61830ac2, 0x64bd6001,
  214553. 0xd9adbeef, 0x0386931e },
  214554. { 0xd09885a5, 0xd0d7abb3, 0xe355bb07, 0xed9d2b67, 0x536ebaed,
  214555. 0x3bc238cf, 0x699ce4d6, 0x61ca2e78, 0x111594cd, 0x354ff447,
  214556. 0x03316ad2, 0x55cbe709, 0x49fff5c4, 0x418679fd, 0x0f9c6c40,
  214557. 0x75bacd75, 0x2972721a, 0x677edc88, 0xe5ef502f, 0x82596887,
  214558. 0xbf320e0e, 0x459e9367, 0x8bbdccb2, 0x81ce36ef, 0xb766863d,
  214559. 0x1ba097fc, 0xd58c6db8, 0xcd3a21d6, 0xb4a8748b, 0x0e4967cd,
  214560. 0x15041c20, 0x2caaf749 },
  214561. { 0x6ed20424, 0x44f98006, 0x22471545, 0xb3e4ea23, 0x781a8c86,
  214562. 0x268ed1a5, 0x7ae5b70b, 0x48d0ab75, 0x356d3982, 0x6ca8b320,
  214563. 0x2df31fa4, 0x9ce8e681, 0xd925dcf2, 0xb909d232, 0xf56723de,
  214564. 0x302c8f78, 0xabac96f9, 0x11725d69, 0x57d1a170, 0x656a47ca,
  214565. 0xc18a2be7, 0x6bb5d511, 0xad50d9d9, 0xb56e45f1, 0x70b05518,
  214566. 0x36e886e2, 0x09d8ff91, 0xc7c71f3d, 0x9350361e, 0x65a1bbe2,
  214567. 0x45fe3bd8, 0x86d7f532 },
  214568. { 0xb0bf719a, 0x99f16eb6, 0x8bc3d913, 0xb6975098, 0x26cd01b4,
  214569. 0xfae50e52, 0x90898d1c, 0xd3e3ac54, 0x887ec666, 0x4da3b9db,
  214570. 0xfbea45b8, 0x58300644, 0x8355b058, 0x369f3bd9, 0x579bcc13,
  214571. 0x0fb239a8, 0x6e2bd811, 0x4f5b4539, 0x24198fd2, 0x007f3baf,
  214572. 0x8837d51d, 0x68a676db, 0xeae75b16, 0x68eeea62, 0x3db6083c,
  214573. 0x5ffe5f94, 0x7d836c5a, 0x52c94d0f, 0xcbc1ff85, 0x5a4c3c6f,
  214574. 0x86c0b4dd, 0x682a55e3 },
  214575. { 0x587495aa, 0xc8f235a4, 0x34c7245d, 0x2276026c, 0xb75a46e3,
  214576. 0xd6ae0cc5, 0xecc3e5e7, 0x890d3965, 0x14296629, 0x1b13342f,
  214577. 0x8a877227, 0xc89927e6, 0x2324a68b, 0x1543f27e, 0x49cdc21a,
  214578. 0x6c447684, 0x1452d0ac, 0x9bc7fd4f, 0xff4b045c, 0x2cc30a31,
  214579. 0x852f7611, 0x415d46a0, 0xc6fdd7a6, 0xad737052, 0x7b4c7c91,
  214580. 0xdcecc3ab, 0x7688d70c, 0xd2cdf01b, 0xe40d3905, 0x054f2542,
  214581. 0xfefe4dcd, 0x02227fa6 },
  214582. { 0xb751948b, 0x1805efd9, 0xfdfd225d, 0x8efeed46, 0x4f2c8b22,
  214583. 0xcb128e09, 0x96f7c5e5, 0x9d1090bf, 0xb4cbeca0, 0x0959d044,
  214584. 0x8e08cb04, 0x21c955f9, 0x68fa4fce, 0xbc1f279d, 0x0710ae9a,
  214585. 0xb021e14e, 0x881167f4, 0x64d16e9f, 0xbbc9f1a5, 0xf5a5c22e,
  214586. 0xe3420eea, 0x5f3716df, 0xd5c4e843, 0x971eb915, 0x28ffba81,
  214587. 0x64fc55fc, 0x7dd37578, 0x3427e54d, 0x15ebc7d0, 0x446e6a62,
  214588. 0x29269778, 0x547e249a },
  214589. { 0xa1ffda27, 0x4706868a, 0x7955cf50, 0xb4e6cdcc, 0x0a63f3d8,
  214590. 0xf65151e1, 0x9de5e70a, 0x5b4127ea, 0xf9342823, 0x3d2c09ba,
  214591. 0xaa2f7d51, 0x18c99d83, 0xddeec025, 0xa0c5bb1d, 0x03dcf1ce,
  214592. 0x7ffddf84, 0x616fdeda, 0xe57e4d29, 0x7932a1f0, 0xd2456569,
  214593. 0x3191d4e3, 0x7475e0e8, 0xc220218b, 0x3479bea1, 0x8bcb2505,
  214594. 0xfceb5c90, 0x3c6132e6, 0x1c685cea, 0xbfe6c1eb, 0xc42dc745,
  214595. 0xd2b08eea, 0x45a41cc0 },
  214596. { 0x4dbbf0e1, 0x3ea9b2c7, 0xa17cf70e, 0x41ff962f, 0x5eeb4c66,
  214597. 0xdc1ea758, 0xa9beb17e, 0x4f5412d2, 0xa285741a, 0x2c9e4f52,
  214598. 0x984fd11f, 0x93df7da4, 0x0df3184e, 0xb2afbddc, 0x2421e375,
  214599. 0x96323d25, 0x49df781e, 0xc87be1e4, 0x3d589bea, 0x145601ed,
  214600. 0x28fff6dd, 0x0f0bd9bd, 0x8a0f298c, 0x2d3259d4, 0xd88e6944,
  214601. 0x362d7a77, 0xb6ac2af6, 0xa84c06b6, 0xd087da02, 0xba850ac9,
  214602. 0x42ee40c8, 0x128763c9 },
  214603. { 0xacbac178, 0x29a80f07, 0x34b08f6e, 0x7cc20044, 0x70feded2,
  214604. 0xe9631d14, 0x86615767, 0xb2115da3, 0xcb088548, 0x7c75f5c4,
  214605. 0x9a2e8e03, 0x5b29d213, 0x8b881752, 0xfe9fda66, 0xc1de7ebc,
  214606. 0x3f1d8d88, 0x03218123, 0xb476565e, 0xb1c995f3, 0x07365561,
  214607. 0xb13eb71b, 0x2160cb18, 0x99b3a0eb, 0x7e8da513, 0xb20fcd74,
  214608. 0x5e8ca1f9, 0xb4126d72, 0x6a7e0067, 0x68bb637f, 0x1e8204b7,
  214609. 0xfc4f74d2, 0x75e96bcc },
  214610. { 0x0d19716e, 0x189d1fdc, 0x7c384525, 0xdf585058, 0xea987d2a,
  214611. 0x64a846d1, 0x6c07150f, 0x12b6bf83, 0x4d6fd5b7, 0x91d85d46,
  214612. 0x4f53f55f, 0xa9788836, 0x81509129, 0x60083bd8, 0xea876f48,
  214613. 0xa7672683, 0xc15b2489, 0xe80b2e7a, 0x42d1d992, 0x985ef8d2,
  214614. 0xcf3de492, 0x9c57b029, 0xb1487627, 0xfe02f83c, 0x8ae5b687,
  214615. 0xaeba4fe4, 0x5d6b8196, 0x8a86f09b, 0xa16e523d, 0xd88f566b,
  214616. 0xba268949, 0x309a6e9a },
  214617. { 0xbdfbe97a, 0xef27ee50, 0xb8c50c4d, 0x1a5fe70f, 0x7fe09f5c,
  214618. 0xcc7beb01, 0xbed36cc5, 0x8fa15a85, 0x7550ed3a, 0xc0c3acdb,
  214619. 0xeb908681, 0xc581ef87, 0xc49d5ccb, 0xa15b3362, 0x1fa264e8,
  214620. 0x0fbb1714, 0x8e1eee88, 0x267f8d8f, 0x21c2b63d, 0xd31ccfd6,
  214621. 0x53be7efd, 0x924dbe7d, 0xdb2a358a, 0xd42e877f, 0x75d68ac1,
  214622. 0xcf9673c7, 0x714fea55, 0xe35978fd, 0x5769b202, 0xeeb36653,
  214623. 0xd7593789, 0x0458258a },
  214624. { 0xa042dbdf, 0x5df71a74, 0x5779dfa2, 0x2d405857, 0x0d2e6657,
  214625. 0x0e66cba7, 0xca2e892e, 0x285d6745, 0x0f0e6b5f, 0xf56a8def,
  214626. 0xa30767c3, 0xe0ee851d, 0x43346b9c, 0x98c05658, 0xd6b3c742,
  214627. 0xb35fce26, 0x39777e00, 0xc0895bff, 0xe7b6d886, 0x83c8f6a6,
  214628. 0x4f02904b, 0xbee14843, 0x2e84ec34, 0x7f74915b, 0x96d10991,
  214629. 0xbaaf663c, 0xe41facc0, 0x004b8757, 0x6f86c029, 0xa2b880e5,
  214630. 0x95b77358, 0x53f4a3e0 },
  214631. { 0x89fc48e7, 0x11bb08ce, 0xafab5aeb, 0xba60c577, 0xa0c1cb5a,
  214632. 0xf06bcbf8, 0x79757cb6, 0x7d2efaea, 0x76319160, 0xe26d90b1,
  214633. 0x2b77b7a9, 0x42aa1ab6, 0x285df2bf, 0x38eec0cd, 0xf3a8f7f0,
  214634. 0xd35947f5, 0xfc1cb5b5, 0x97c8dc0e, 0xc45845cf, 0xfeb8cca0,
  214635. 0x249e26f2, 0x16e8d989, 0x483ed89a, 0x7c264e6d, 0x51d91073,
  214636. 0x13a3f145, 0x305e99f0, 0x8501562e, 0x6908d563, 0xaaf98d74,
  214637. 0xd723d236, 0x0a99e653 },
  214638. { 0xabbc0559, 0x23536f46, 0x9aa1a160, 0xc163067b, 0x0c1681b5,
  214639. 0x229fd229, 0x1378e907, 0x61254be1, 0xab793a2d, 0xc60ff57a,
  214640. 0x466552db, 0xa6f2df8b, 0x8c170a36, 0x9ad31893, 0x29b74d9a,
  214641. 0xc5cd9abe, 0xf7848523, 0xcf747273, 0x0d0e3063, 0xc126a93a,
  214642. 0x4248e3d8, 0xfe2021e3, 0x8323ddfa, 0xd97343ee, 0x332639e7,
  214643. 0x9f768775, 0x75325548, 0x9650fc31, 0x3eebf7ea, 0xb595dbd1,
  214644. 0x010fcbc0, 0x3a95cb45 },
  214645. { 0x39d7ff2e, 0x954e68cb, 0xc1d5c48f, 0x8dd1cb4b, 0x7169438a,
  214646. 0x02a92c77, 0x91cad8ce, 0x7965c0b0, 0x32cd08d2, 0x0c5798ab,
  214647. 0xa6902bda, 0x1a5bc3c3, 0x5186d218, 0x545d0925, 0xd27e64db,
  214648. 0xf0077cdb, 0x8cd092da, 0x0157caa4, 0x24532ab3, 0x2a2fa3a0,
  214649. 0x41ccaba3, 0xa5fb639b, 0x4744aee6, 0x01702dc1, 0xcdba93da,
  214650. 0x485bb436, 0x329784f1, 0x93597f66, 0xdad672c3, 0x5d713c1d,
  214651. 0x030b7245, 0x366d222e },
  214652. { 0x573ea5b2, 0xd50b4875, 0xa90da44d, 0x0fce401b, 0x7a1a0310,
  214653. 0x7b53fa65, 0xcf114460, 0x722a80a5, 0xa538bf49, 0x0b8ebf05,
  214654. 0xd32acd21, 0xae141147, 0x7b5ad07d, 0x6692712c, 0x3f48ca07,
  214655. 0x6dc5fee7, 0x2b8a78d8, 0x98ed1499, 0xdd2f1759, 0x4e8b3145,
  214656. 0x5f971b8e, 0x43408de1, 0xadf1b368, 0x055ea6dd, 0xe5932b7e,
  214657. 0x4bb76e73, 0xd30893fd, 0x44287153, 0x0661bfda, 0x173dccd2,
  214658. 0x79defd25, 0x9072ba99 },
  214659. { 0x9620ea39, 0x474de4dd, 0xc831cee8, 0xfbf1649f, 0xcd3a9c43,
  214660. 0x0b0e8bb1, 0x3f3df1d5, 0x6a38286f, 0x8f0ec9b3, 0x4ed072b3,
  214661. 0x729c09e3, 0xa6e4c987, 0x8ad12242, 0xea3e8ac6, 0xfbdfa5ba,
  214662. 0x6ae0e22b, 0xb0a0f592, 0x56171ecf, 0x6b871f8d, 0x33b2886d,
  214663. 0x35e11bda, 0x6b19bea9, 0x7f0f153f, 0x4d815a40, 0x7d6c02ee,
  214664. 0x7e608d97, 0xb6a88f46, 0x7e8f23d9, 0x439d1654, 0x26ac9652,
  214665. 0x35546c29, 0x8d92c6bd },
  214666. { 0xabeb0ff7, 0xb3e0d7ce, 0x3e0e42f8, 0xfbe35254, 0xde808499,
  214667. 0x57d1b226, 0x1cd44bc3, 0x9ece2e1f, 0x435cfee1, 0x1245adbc,
  214668. 0xf93f581c, 0x874ee840, 0xbda0b947, 0x916a779c, 0xfa57ae0a,
  214669. 0xabcc815a, 0xf0a621b0, 0x97adec2d, 0x81f90bdc, 0xbe6a502b,
  214670. 0x53bde63d, 0x54bf9de1, 0x78884c25, 0xa88fdabf, 0xcbbb5470,
  214671. 0x30aa52b1, 0x29053ef5, 0xf805396c, 0x8dd827ea, 0x8d43d898,
  214672. 0x5c1ae5c0, 0x4e4bec17 },
  214673. { 0xfcc09676, 0xbf8483a2, 0x19ea9a94, 0x457c4a3f, 0xd702a5dd,
  214674. 0xa6852ef3, 0x843fe7d8, 0xe7915fd2, 0x16e35158, 0x644bba98,
  214675. 0x9ed746f0, 0x8d1b95d0, 0xb90af0b5, 0x47704581, 0xd4fd135e,
  214676. 0x0bd4bc6b, 0xb4e833a5, 0xa6dce067, 0xff56a9a1, 0x2c0e8f30,
  214677. 0xec2c63fe, 0xa9c80800, 0x98f508a8, 0x449c20a5, 0x3292813a,
  214678. 0x02b94cb3, 0xec7e81a2, 0x647e3d28, 0xb4877677, 0x72e67d1a,
  214679. 0x6f9ded24, 0x7a4aa3f5 },
  214680. { 0xe27a0045, 0x559ef1ba, 0xb242cb50, 0xdc812d4f, 0x39cf8d24,
  214681. 0x23a478e4, 0x9b3f9c54, 0x97544fc5, 0xaffa1fcf, 0x5ac68132,
  214682. 0x34a2c83b, 0x74f8fee0, 0xcd3f4bb7, 0x96cc640f, 0xb0512ea6,
  214683. 0x775dce9d, 0xcdce381e, 0x67dca19d, 0xa9d3fe55, 0xc1eeb3f3,
  214684. 0x1a19274f, 0x38e0bf42, 0x28d69b12, 0x15992fb4, 0x9fd09df8,
  214685. 0x48fcebde, 0xb41ab5df, 0xdc9dfa4f, 0xc0a269c5, 0x0cbd7dc8,
  214686. 0xf7f0ade1, 0x60282a7b },
  214687. { 0xdceea2e7, 0x7c07e538, 0x3c42061d, 0x38a322c8, 0x4f1f6516,
  214688. 0x676828f9, 0xc7776a10, 0xf21b69fb, 0xb5e6b405, 0xc63a3417,
  214689. 0x91a7b642, 0x4c99f258, 0x2cad1440, 0x38692ca8, 0x00869bcd,
  214690. 0xf1e82ffe, 0x16fe466a, 0xc30b714e, 0x19019138, 0x5fb742f9,
  214691. 0x0fa516ae, 0xe90166d0, 0xd8c73a43, 0x5550f7ac, 0xfbc5c372,
  214692. 0x2d6a407d, 0x68cc39ed, 0xe47a7539, 0x4a5fbe70, 0x3fd286d9,
  214693. 0x23c6b942, 0x5f4ae9c7 },
  214694. { 0x53f4d561, 0xd96a2dda, 0x16da1992, 0x286d45d0, 0xfdd4b051,
  214695. 0x449a01fb, 0x9f2195ea, 0x25488a0d, 0xa37661b3, 0xc4151b0a,
  214696. 0xf9e5ee02, 0xb98c471e, 0xa8658817, 0xa4bca86e, 0x7a68fc0a,
  214697. 0xbbcadb87, 0x6b7366a9, 0x88b34649, 0x15661c2d, 0x32ee98d4,
  214698. 0xc901420c, 0xf5b3b4c6, 0x2f2752af, 0xa2352735, 0x510e4d9c,
  214699. 0x2f64ce73, 0xaca4aa80, 0x939a7f26, 0x401aa503, 0x9cd3e291,
  214700. 0xdc46afd2, 0x92a01423 },
  214701. { 0x1c2f7dbd, 0xe9f24be1, 0xb7d527fa, 0xda8c900f, 0x8648f128,
  214702. 0x963e25bb, 0x48141941, 0x9ab713e2, 0x7a6756fb, 0xe87f7d01,
  214703. 0x058d90bd, 0x274dd85e, 0x82566abd, 0x823fee7a, 0x74240195,
  214704. 0x9f6230d7, 0xacb5e46e, 0x04579f2c, 0x16a4c87e, 0x2a226263,
  214705. 0xd99b0857, 0x9ca19a43, 0xe488789e, 0x86dc2ba3, 0x9406c3bd,
  214706. 0xf960b5b9, 0x8960957e, 0x6f2c428b, 0x161c515b, 0x90748706,
  214707. 0xaa88cb9b, 0x0fc8fe1e },
  214708. { 0xfeb90f2d, 0x68ae1bed, 0xa48b1559, 0xf393bb3c, 0xf64e9635,
  214709. 0x2be62f9c, 0xf8be75c2, 0x354c2410, 0x5e6f7529, 0xbd7ea703,
  214710. 0x162cab31, 0xc264868e, 0xc860f3ff, 0xb1391e70, 0x1d89837e,
  214711. 0xdf367c75, 0x2bf32941, 0xe150b6b4, 0x78c1318f, 0x95e8f46e,
  214712. 0xa2c4b160, 0x2b3f1dab, 0x701afbf3, 0xc6ccf5ce, 0x5e8874c5,
  214713. 0x3ad27530, 0x5dc6dcbe, 0x39285e51, 0xd99892dd, 0x3c954d86,
  214714. 0xdfd3789f, 0x2d0ba862 },
  214715. { 0xb472e1af, 0xeacd8ee8, 0xb76abbcc, 0xeb354eae, 0xd0d93fbd,
  214716. 0x9b520bf8, 0xfe6fc706, 0xfccd60d7, 0xa4ee2f39, 0xa9353dde,
  214717. 0x9a81e51e, 0x5eb0925e, 0xd1366777, 0xee334da1, 0xd5354d69,
  214718. 0xc1d28c9f, 0x92a5ed54, 0xb9771755, 0xb7f70d81, 0x5d3e367f,
  214719. 0xa933ae7a, 0x7be7eeca, 0xe23cfbb7, 0x264cf1f9, 0x89497681,
  214720. 0x0d129f4a, 0x09b6235b, 0x705375a4, 0x48a376da, 0xccf64c75,
  214721. 0x4d41dbfc, 0x963c8712 },
  214722. { 0xde36a814, 0xbae290cb, 0x733b12b5, 0x9bdb0195, 0xf77fe0e1,
  214723. 0x0ebad867, 0x29720cea, 0x0a7d19fd, 0x9029ec72, 0x434d7651,
  214724. 0xbb51911e, 0x856aff17, 0xd80a7f60, 0xd0a25d9a, 0xf848c106,
  214725. 0xffca86af, 0x43ad749c, 0x53e8bdf9, 0xe3e696bb, 0xfb9e0284,
  214726. 0xeeee4215, 0x3eb6630a, 0x2ecf3c63, 0x9d8fbb9e, 0x4e00c0c0,
  214727. 0x71da4ffa, 0x5d57beac, 0xb296be59, 0xa8cec7ef, 0x1751fbad,
  214728. 0xff55d7bd, 0x2d03eb3c },
  214729. { 0x04f2ec1d, 0xeb16925f, 0x0d147ee2, 0xa878f276, 0xaad9d9e0,
  214730. 0x442df604, 0x3f71035b, 0x891df44b, 0x8cb95d5b, 0xc28272b3,
  214731. 0x5ee8ed23, 0x6f14efb5, 0x13b0f3e3, 0xf3c4460f, 0x6bd7335e,
  214732. 0x889f9bd7, 0xf755ba6e, 0x889ee771, 0xed219b6c, 0x626984fe,
  214733. 0xec2ee411, 0x2d44c737, 0x63efcd37, 0xb94385a2, 0x6637826b,
  214734. 0xd909321b, 0x3ee6b7a7, 0xc24f8a79, 0xa7cf61b7, 0xa3ca8d24,
  214735. 0xc54bacd9, 0x842e40c1 },
  214736. { 0xa661d843, 0x5a268ed6, 0x4f5b30cd, 0x02328cca, 0x1311e177,
  214737. 0x16e6fed1, 0xc6695967, 0x690decb4, 0x57b2e280, 0xbdac5bf6,
  214738. 0x1efe42d0, 0x827f82ca, 0xca5fca2f, 0xc554ec0a, 0xdde45506,
  214739. 0xac5276c1, 0xe3077513, 0xb7f4cb08, 0xcc8797cc, 0x8caf6d9a,
  214740. 0x0d9332d2, 0xd5964814, 0x285a409f, 0xcc6ae297, 0x6223d093,
  214741. 0x7773c2a5, 0x5128fc09, 0x2d5266ac, 0xbc31fe6c, 0xa596b7cb,
  214742. 0xcac91328, 0x0e63319a },
  214743. { 0xf0360ac2, 0xb5cd2fad, 0x285e605a, 0x86b660de, 0xe25b9b14,
  214744. 0x82c6cf10, 0xaa9ac554, 0x9d5fa38d, 0x526c070e, 0x3dfcf1b8,
  214745. 0x3fccc52d, 0x0379a96b, 0x0bfcc7f5, 0xe3659c29, 0x69d3e6a1,
  214746. 0x5b1a3db5, 0x9b7b42d5, 0xb41528b5, 0x9c22a006, 0x934defa4,
  214747. 0x9b4ce3b6, 0x90f38018, 0xb3abaf32, 0xb073bc04, 0xff8389e2,
  214748. 0x27a5a222, 0xffa5a35b, 0x0b7a9d51, 0x28e1a7c2, 0x4939ecef,
  214749. 0x1872705a, 0x88839da2 },
  214750. { 0x701ce29a, 0x56b66c30, 0x58981d50, 0x3acaf126, 0x105f9f21,
  214751. 0xd4dafc0c, 0x373e3d13, 0xfee571e6, 0xfa2ee3ca, 0xe7269c86,
  214752. 0xdd20385a, 0xf5cca64a, 0x3000e9ac, 0x217f2757, 0x0e7273ef,
  214753. 0xc934db47, 0x355b6776, 0x4294f4f7, 0x6fc05180, 0x1faa36b9,
  214754. 0xb052190b, 0x8f88b1db, 0xe9eaef52, 0x35791b90, 0xdb681b90,
  214755. 0xf37fb2eb, 0x4415c369, 0x39d0a51d, 0x1d2e21c9, 0xfc59cca7,
  214756. 0xa1f50c26, 0x64128cfe },
  214757. { 0xe8f5b0b5, 0xf03678a2, 0xd340f059, 0x5c7e249c, 0x93ca7cec,
  214758. 0x41440441, 0xbc83af98, 0x075ca346, 0xfaa8bbb0, 0xf39f0033,
  214759. 0xf38230f7, 0x3d18f0ed, 0xd448f345, 0x78dff00c, 0xd51aa475,
  214760. 0x849228c0, 0x30c928d1, 0xdd4e2708, 0x8f12cfd3, 0xc66ba686,
  214761. 0x88b3a206, 0x091049db, 0x016dae01, 0xd865d059, 0xe253e37d,
  214762. 0x4599e905, 0x7ce9871b, 0x322cf0c2, 0x174a132e, 0x014f54da,
  214763. 0xbdabcbda, 0x93634a09 },
  214764. { 0xa9a2e304, 0x62826b27, 0xc1a4c124, 0xc57e1866, 0x22381710,
  214765. 0x913ab832, 0xa9847cfe, 0x7e9b6b85, 0x2b5f46fd, 0x29655cf1,
  214766. 0x8038e66d, 0x7295572b, 0x6fa95eab, 0xe4cba601, 0xb9deda81,
  214767. 0xbbc11071, 0x3f1cf61e, 0x97f0009a, 0x373e0cfb, 0x5372777b,
  214768. 0xd139d63b, 0x302f909c, 0x4f87d78e, 0x1ed672da, 0xb4048763,
  214769. 0x362077a3, 0x9dcc22b2, 0xc408c32d, 0x26deeee7, 0x4b4c5bf2,
  214770. 0xbc06357e, 0x266cb467 },
  214771. { 0xb56363e8, 0x6faa4154, 0x3c1aa4db, 0x4b4fd078, 0x2b9e6597,
  214772. 0x14358dde, 0xfa004b84, 0x5b34ae3e, 0xf19911a6, 0xcf44b2ec,
  214773. 0xa536bf78, 0x55caa833, 0x8870dc95, 0x606e1eb9, 0x09f3511d,
  214774. 0xe3c3287d, 0x9d5cf364, 0x68b2f4eb, 0x63ab8c9e, 0xc154e892,
  214775. 0xc36ab611, 0x1548828e, 0xa1b7d120, 0x0932bfcb, 0x5315b8d7,
  214776. 0x7ee7b5bc, 0xf7473ac1, 0x782fd0d1, 0x3c8f2af3, 0xbcb029a8,
  214777. 0x52454ee1, 0x4b1d5a1b },
  214778. { 0x63d52c0c, 0x12fe5174, 0x188c099d, 0x3735525e, 0x360e3956,
  214779. 0x5c621563, 0xacfa5a43, 0x88b3f1ca, 0x797e8107, 0x90123a0a,
  214780. 0xb15e080a, 0xba31f6b5, 0xfca3dada, 0xd7de5e12, 0x0df511c8,
  214781. 0x3287361b, 0x65757d4e, 0x7cc800d4, 0x5207ec91, 0x10810f3d,
  214782. 0x30eea0e3, 0x0d4e56f1, 0x3ea5a2ec, 0xbbf7ee13, 0xbe6abbd0,
  214783. 0x6fc07762, 0x120bf619, 0xc831fdce, 0xb622d42a, 0xe07439fa,
  214784. 0x508e4b27, 0x8186b93f },
  214785. { 0x09312867, 0xc619d154, 0xbfaf7db4, 0x7e042c05, 0x1f5f5dda,
  214786. 0xc1cf1668, 0xa4fc3d82, 0x50aa5057, 0xce68b8fe, 0xed30ed65,
  214787. 0xbeb4d644, 0xecb01c0b, 0x831c0497, 0x7b5dc444, 0x9b7d9b1c,
  214788. 0x351e6a00, 0xd9477c91, 0x4bb863b9, 0x05d4110a, 0xaba65891,
  214789. 0x43580b7a, 0x30086cf4, 0x90be357e, 0xb139c076, 0x27b5214e,
  214790. 0x12bfff1a, 0x22c3ab57, 0x79cfc6d7, 0xf34a9bfa, 0x4743de57,
  214791. 0xc9ee2b2a, 0x0bf97e97 },
  214792. { 0xdda19e96, 0x96ec4ec8, 0x6c306e8b, 0x54ce18ea, 0x65f6918a,
  214793. 0x7e83612b, 0x0d9a0d99, 0x1ac6f68b, 0x62fdcc09, 0x98a697a4,
  214794. 0x95bc3e13, 0x65ce25f1, 0xb3939730, 0x1896ecda, 0x32f12806,
  214795. 0x9eb81a0f, 0x1d2dc7df, 0xd3d7416e, 0xad473599, 0xe22c7976,
  214796. 0x9f5ef439, 0x3de37a9a, 0x9e69d94e, 0x6b7ac0ab, 0x0a9d0bc8,
  214797. 0xe6bfa9e0, 0x5676f120, 0x576a870d, 0xfeaac23f, 0x3bd91bb4,
  214798. 0x3e40aabb, 0x8fe5482c },
  214799. { 0xce9a4d1e, 0x85ae67c2, 0x4f1d2038, 0x4c3eb803, 0x25d06192,
  214800. 0x5c6c8f3a, 0x308fb41c, 0x803de0ad, 0xe71c294e, 0x9961f5bc,
  214801. 0xf02eb0da, 0xdc62078d, 0xb64ae8b6, 0xc87ef515, 0x50b4d18f,
  214802. 0x69679f1e, 0x52199f43, 0xc5c009a1, 0x0f640a5f, 0xa7d484be,
  214803. 0x23dab566, 0x4c918bb1, 0x64275d2c, 0xa67c114c, 0xcad2ded6,
  214804. 0x95a913b9, 0x6b4b5c8d, 0x189ed18b, 0xb42d3bf6, 0x4aeb6206,
  214805. 0xbbc8bc3f, 0x3928c669 },
  214806. { 0xdacb4b64, 0xde4bea4a, 0xf26179a1, 0x03f62a44, 0x7a9112a4,
  214807. 0xf3aac94e, 0xd36f331e, 0x90448fbd, 0x407b85c4, 0x426042bc,
  214808. 0x2121b77b, 0x5ad8a596, 0x67cee984, 0x31674a4f, 0x4e3b2f0d,
  214809. 0x7fae8bbe, 0xa7c930eb, 0x681df6dd, 0xc259d0d4, 0xadeefa98,
  214810. 0xbea1c1fd, 0x1b14d9e6, 0x21d405d1, 0x3baadc8b, 0x73892754,
  214811. 0xf01dff93, 0xf071cde4, 0x81c35b3e, 0x9150d0d9, 0x1704d2e1,
  214812. 0x355134f6, 0x6ccc888f },
  214813. { 0x7ad7504c, 0xf8d36f0e, 0xf7959ddd, 0xbca3265f, 0xfede67aa,
  214814. 0x0dcd1ede, 0xbaebf32f, 0x1276f4ce, 0x014edcfc, 0x6825a6e6,
  214815. 0x99ad8eb7, 0x0b8c1a82, 0x09b8ce1e, 0x312024a9, 0x9cbd351a,
  214816. 0xcb8fd98b, 0xfab1e8be, 0xa4841378, 0x3973cacf, 0x17ed0f5d,
  214817. 0x259d5254, 0xa17e1484, 0x74b91393, 0x53d5b843, 0x1aca3ce9,
  214818. 0x8f792b21, 0xc8c0f815, 0x035ff110, 0xad4ed7bd, 0x6afa6357,
  214819. 0xb26faef9, 0x2f151980 },
  214820. { 0x29d2d439, 0x0c8631da, 0xbc039955, 0x121fbbc2, 0x6c05b75b,
  214821. 0x3e5a9792, 0xb6ce47ec, 0x6d6cf4c0, 0x9d88c658, 0xbaaa1767,
  214822. 0xf3355a17, 0x031db9e7, 0x0aef5a85, 0x8381e3d8, 0x15a31bdf,
  214823. 0xc71db290, 0x9498fd7d, 0x638f6b74, 0x13beeef6, 0x44edf3f9,
  214824. 0xf4ab67b3, 0xe6173271, 0xfd22df11, 0x3a202c70, 0x205c4e92,
  214825. 0xf7be0389, 0xa8eb9920, 0x1c219085, 0xbeb54aaa, 0x6c805ce8,
  214826. 0x0ac58d65, 0x354b05b7 },
  214827. { 0x7a9170e9, 0x7171e236, 0x4cad50cd, 0x01eec42d, 0x3cddccfb,
  214828. 0xffbe824f, 0xa66cae1a, 0xa73e8ce3, 0x965c7d01, 0xb7138a7f,
  214829. 0x5c3d971e, 0x00058e3f, 0x2ff0a72b, 0x52591ac3, 0xbbbce76f,
  214830. 0xa32fb5bc, 0xa9f81a18, 0xf3241ab8, 0xeca68630, 0xf31d3332,
  214831. 0x4482f13b, 0x847af9fc, 0xa4681be2, 0x6196e217, 0xe55efcf9,
  214832. 0x9938f932, 0x70acc705, 0x3e7dacb8, 0xcf09fac2, 0xd41be893,
  214833. 0xae3523a1, 0x48dc55c4 },
  214834. { 0xa5092193, 0x8e623826, 0x6898970c, 0xe46ec362, 0x25c9eb41,
  214835. 0x2f1356af, 0x83c7d245, 0x41780640, 0x97d00e38, 0x982def67,
  214836. 0xa512151c, 0x382eb6e7, 0x8af58869, 0x154e1077, 0x8a51cf02,
  214837. 0x18707075, 0x71313c58, 0xcdeba9f7, 0xba155904, 0x5d67b973,
  214838. 0x1d0d7b3a, 0x851c9f4b, 0x8b8af2cd, 0x19f29d71, 0x986b8d62,
  214839. 0xcb94ccff, 0xb93b9c33, 0x8725e24b, 0x66e38c68, 0x405ce4c5,
  214840. 0x0b6dc021, 0x5f6a8edd },
  214841. { 0x8f9a8690, 0x83704ca5, 0x2f76a407, 0x3f369766, 0x69201028,
  214842. 0xfbc12d8c, 0xbce3a4cf, 0x4cd58f16, 0x04aab26d, 0x7804664a,
  214843. 0x4ea457a8, 0x005cfbba, 0xb8a59794, 0x537951b3, 0x4fe1f739,
  214844. 0x4ca2b9e4, 0xdf325797, 0xe4428acd, 0x0ea243db, 0x648da342,
  214845. 0xf43ce01e, 0xcce6562b, 0xf27db490, 0x840f0421, 0x8bfb7cf0,
  214846. 0x156ccb70, 0x5a8797d3, 0x9b33480d, 0x9eb814bb, 0x2e12e07a,
  214847. 0xca7f87ac, 0x1ca65072 },
  214848. { 0x2b9d25a0, 0xfbb321cf, 0x40a746db, 0x66affdca, 0x59e368b5,
  214849. 0xc1c1530e, 0x7d80068f, 0x56ed1ea4, 0x5647dd68, 0x9b74d8fe,
  214850. 0x89b78da8, 0x1d96b507, 0x8bbe3391, 0x39b75243, 0x0d858c5f,
  214851. 0xef8d443e, 0x9646aa34, 0x4dd2db49, 0xe667543c, 0x7fad3bd1,
  214852. 0x68980985, 0xd0d710c0, 0x49facaba, 0x9f7aff32, 0x14f9a192,
  214853. 0x055dec1c, 0x1fb307a1, 0xaca66399, 0x35ffff64, 0xac44fd91,
  214854. 0xcbad3cee, 0x462cafb6 },
  214855. { 0xde3237dd, 0x1660a647, 0x82b87404, 0x95f735cc, 0xddfa55f8,
  214856. 0xf7879f59, 0x726b914a, 0x15ef043e, 0x1c93e298, 0x1875393d,
  214857. 0x6ef18331, 0xa1a2be74, 0x25a9a12b, 0x4e7e8dfc, 0xa9c3917f,
  214858. 0xdfefc97d, 0x0a2ebe41, 0xbc875d03, 0xa732d1cc, 0x0f75d235,
  214859. 0xd9baa6d3, 0x06fee7fe, 0x65f48576, 0xaa784fab, 0x513f83c0,
  214860. 0x23155e22, 0x3e8f9d13, 0xd2fb7718, 0xb546eafd, 0x2a291503,
  214861. 0x6cd93608, 0x1293c98c },
  214862. { 0x49d53b77, 0x72781251, 0x96eafac7, 0xa6ab403d, 0x4a36b711,
  214863. 0xb7d7c7db, 0x87e771c1, 0x8238c708, 0x33b37522, 0x495f6abf,
  214864. 0x8c87530d, 0xb0b0289c, 0xe77b111a, 0xca83cb86, 0xa1bd189e,
  214865. 0xbe1c0fb8, 0x1ae9d7c7, 0x58cfb2fb, 0x4940c3e8, 0xd05c23c5,
  214866. 0x74ad9107, 0x16e79e41, 0x064e7142, 0xa0a47f05, 0xfdfd614f,
  214867. 0xc6929cd4, 0x3946988b, 0xedb2584c, 0xe46f8fb1, 0x73e4b5f3,
  214868. 0x68ea94ba, 0x53b79aa1 },
  214869. { 0x44bbb6a1, 0x216fafce, 0x67821728, 0xd3a5bba0, 0xa9dd939a,
  214870. 0xef1e4b30, 0xf19efafe, 0x022eaf3d, 0x7b4ec014, 0xfed5abce,
  214871. 0x512c6738, 0x64968ee6, 0x29fe89a2, 0x23119869, 0x47397c05,
  214872. 0x0d539d8d, 0x234596c4, 0x6400bc54, 0x5346611d, 0xb9287f58,
  214873. 0xc9d5da0f, 0x04099903, 0xc83af2a8, 0xe5ef4997, 0x328151e1,
  214874. 0xc89dc01b, 0x58401104, 0x150fb4a9, 0xf3872c9d, 0x40a6f7d5,
  214875. 0x56c2e833, 0x8290d6d1 },
  214876. { 0xd8546946, 0xf84637c6, 0x69ec57fa, 0xda134a39, 0xd789007e,
  214877. 0xd42359a4, 0x0dc7b809, 0xb42557fe, 0x2d6784a9, 0xe62ae52d,
  214878. 0x0bcadb5f, 0xa2714ca6, 0x33aafca5, 0xcc208de6, 0xed967811,
  214879. 0x2380ed5c, 0xdb321660, 0x6e6b55e9, 0xa675235a, 0x1bead02c,
  214880. 0xb33fa0e1, 0x51cc6ef9, 0xf06a2a08, 0xfd223e26, 0xec47b3cf,
  214881. 0x00f332e1, 0xa0aa984e, 0x459f297b, 0xee952e14, 0x6fa1d969,
  214882. 0x304fabb0, 0x506ef1ab },
  214883. { 0x35bff163, 0x11b4eb27, 0xea9fa984, 0x7130b96f, 0x9deb27ce,
  214884. 0x66aceb3f, 0x9dd1c3d5, 0xa2daf1a5, 0xa73075aa, 0xf5090a7e,
  214885. 0xe3071b58, 0x36a6af39, 0xdf73ad9c, 0xa28d633d, 0xbdc89a16,
  214886. 0xdd354cac, 0xd4dcbc3c, 0xdfea3423, 0x379d92d1, 0x6eec74d2,
  214887. 0x8eed6765, 0xe14a456f, 0xfa8feb1f, 0xfabe7743, 0xb98fcbc7,
  214888. 0x1404ccf8, 0xf71a706e, 0x6ccd2fbf, 0x4d85c678, 0xdaaf3fdb,
  214889. 0x15200344, 0x415b7dbf },
  214890. { 0x7d8377a7, 0x97010586, 0xcb803272, 0x068a3d68, 0xf03a4c32,
  214891. 0xfd67d289, 0x93c8f290, 0x4bc7095d, 0xe9e5a2b8, 0x712fa13c,
  214892. 0x0feb9f3b, 0xfc6ac6c6, 0x6e0e54c2, 0x0cda36d9, 0x86320a01,
  214893. 0x45499751, 0x97f00f11, 0xf9318c91, 0xe6936508, 0x01dc4c3f,
  214894. 0x85f068aa, 0x769a2ef9, 0xa2b5511c, 0x3522cef0, 0xb4122e05,
  214895. 0x006965ed, 0xc175d43f, 0xfce0fafc, 0xec831d59, 0x525dc9bd,
  214896. 0xaf58879d, 0x1ec314f1 },
  214897. { 0x2c8310c2, 0x0663feef, 0x457e3f74, 0xaa7e14da, 0xe5346887,
  214898. 0x392b10fc, 0x637ec2c5, 0xcde4a38f, 0xb542f8df, 0x50773320,
  214899. 0xf7de1711, 0x341302f9, 0xae4b9bc6, 0x018b1c63, 0xdd2f9e6f,
  214900. 0xf001c46e, 0x26eccfa0, 0xd3bb0a97, 0x7746e0c7, 0xa931b99d,
  214901. 0xf5875aec, 0xe0c8b6f7, 0x96939c82, 0xbb32f17c, 0x3de5a664,
  214902. 0x765135d2, 0x52abfa6b, 0x71936cb4, 0x2dc105de, 0xad5cc08f,
  214903. 0x7fff5788, 0x17e91d12 },
  214904. { 0xb7e051ca, 0xbe92ced3, 0x19c776d4, 0xc644d4fd, 0x0086784b,
  214905. 0xc8ab4b52, 0xce9d6b31, 0x3ea66227, 0xd289e9c7, 0x395249a3,
  214906. 0xd12a19ee, 0x54509e65, 0x8c365aec, 0xa7bd4692, 0x77963e0e,
  214907. 0x354997e4, 0xb599732d, 0x0d765957, 0x91d4a3b6, 0x99584aeb,
  214908. 0x1deb3e28, 0x6e653ea4, 0x572571df, 0xca7c98ed, 0xb18ae1f9,
  214909. 0xf301a38f, 0x63f7b97e, 0x1629f7c2, 0xafc4a0d5, 0xdf242282,
  214910. 0x3ddd0c01, 0x118f3b4b },
  214911. { 0x7ad4762b, 0x74a0a0a8, 0x8c58d175, 0x1aef84da, 0x4cf76d86,
  214912. 0x16ff4960, 0x7e60d98b, 0xc0be8786, 0x3ecc1dba, 0x83637ffb,
  214913. 0x5dd6147a, 0xc244a609, 0x5b0846e5, 0xa3e17834, 0xe77a4c05,
  214914. 0x735eb686, 0xdf758695, 0x5bc18b4f, 0x1bdfe52f, 0x15618d0b,
  214915. 0x00715ba1, 0x878ecc0d, 0xc2dd617f, 0x1dbdbd1a, 0x21b61710,
  214916. 0x21d2b631, 0x44f593c2, 0x22ce8a79, 0x44f17024, 0x3b9b536a,
  214917. 0x8d03e727, 0x01d0a67c },
  214918. { 0x1e46533c, 0x7b964236, 0xfb88c2ae, 0xe9477990, 0xa42c4a18,
  214919. 0x019b5d16, 0xd83c7a45, 0x7135e81d, 0x4cb663e3, 0x74a69bdd,
  214920. 0xe76c0d63, 0x7b67ecdb, 0x11e68da6, 0x03d54521, 0xd2e8650a,
  214921. 0x596cceb5, 0x2af03b37, 0xcd572dfd, 0xfabd5952, 0x52364ba1,
  214922. 0xb4ed8569, 0x7f47d456, 0xc950d5d4, 0x5ad8b572, 0x486e2f84,
  214923. 0xcadd2dfa, 0xc56bb044, 0xdd527b43, 0x997c08e6, 0xc9adba24,
  214924. 0x7da6320f, 0x1b625b06 },
  214925. { 0x4fd8446d, 0x44dfaa7b, 0xaf6febeb, 0xc01b2f01, 0xfe8838b5,
  214926. 0xbf444388, 0xbba9758b, 0xf33c434f, 0x87156bc9, 0x2b971cba,
  214927. 0x1f49098b, 0x6b245e5c, 0x2b41c5dd, 0x87dcb534, 0x34d852d7,
  214928. 0xdb1f80c6, 0x2433da34, 0x6d6e3258, 0x3f7df0c2, 0xf6682065,
  214929. 0x360cb365, 0xc4ca567c, 0x9826656a, 0x321faac2, 0xbf069768,
  214930. 0x13f5ca6f, 0xa7076639, 0x15397921, 0x8400736e, 0xbdf14328,
  214931. 0x19fc948d, 0x333eca96 },
  214932. { 0xac775d81, 0x23337948, 0xd41dbbca, 0x38c2518f, 0xbcfce948,
  214933. 0x623c7a4f, 0x54703fe7, 0xaad36236, 0x13fb3b5b, 0x2b3a13a4,
  214934. 0x7f5c01f0, 0x5db3565a, 0x52359661, 0xd72408dc, 0x1d616e91,
  214935. 0x5a17f8e5, 0xcb25b999, 0x90c16eeb, 0x3393743e, 0xf35e8cf1,
  214936. 0xe54b64a7, 0x987da74a, 0x65cd449d, 0x557b322a, 0x37e7b15d,
  214937. 0x765082a5, 0xf2cd134f, 0x4d25c742, 0x4ccf0746, 0xae9d9c07,
  214938. 0x8728d135, 0x72fc2110 },
  214939. { 0xf96004c8, 0xa906b203, 0x458055ff, 0xd83f95cf, 0x55f35909,
  214940. 0xd77d5867, 0xe550c8ee, 0x4a9ea6fb, 0x55a06081, 0x91c8cca9,
  214941. 0xbce82062, 0x4a1fee78, 0x9a3df85e, 0xeb9ade06, 0x7d3de666,
  214942. 0xfbbdcf0c, 0x5d336d51, 0x228a391b, 0x5c2ffc3c, 0x760f8d28,
  214943. 0x2f7b165b, 0x1ee48de3, 0x56177040, 0x03803d84, 0x9deff9a0,
  214944. 0xe573f648, 0xa17e35a4, 0xe1a2738e, 0x8840a6c6, 0x238ef17c,
  214945. 0xb11ed92d, 0x480946f8 },
  214946. { 0xfd71f119, 0x84c747a8, 0x53eb3695, 0x19e65c5e, 0x6298587a,
  214947. 0x0e2f6786, 0xab18d6f4, 0x48a48899, 0xc630b8c0, 0xa1a99024,
  214948. 0x2caaf892, 0x84975096, 0xe20fd624, 0xc8869aba, 0x6c2b7dd4,
  214949. 0x3b72b04d, 0x0992f7d0, 0xe2775eb6, 0x7d06e684, 0x0089c06e,
  214950. 0xe4bbd007, 0xcb3b4361, 0x4ba846e4, 0xa1ae666b, 0x46464d9e,
  214951. 0xc01c2eb2, 0xc1f8539f, 0xf86f2be6, 0xcf68afc7, 0x16e8e8ae,
  214952. 0xc7386902, 0x8dab61fd },
  214953. { 0xd54d1d45, 0x42a5c903, 0xff4f9ba2, 0xacd4297e, 0x34d478b4,
  214954. 0x2d88b520, 0x08c4621a, 0x35b2ba2b, 0x34865402, 0xd3d239bb,
  214955. 0x911f32e6, 0x1de76aed, 0x3f06fdc2, 0x877f8bcf, 0x9ec51502,
  214956. 0x802714c1, 0xa590700d, 0xa10444eb, 0x31dcc957, 0x8694229f,
  214957. 0xb8169fed, 0x5ece77ab, 0x2caf080e, 0x55be8a15, 0xcbd7cef1,
  214958. 0x3eb21b14, 0x67b97ee1, 0x9def7ad1, 0x118f690c, 0xe03ca879,
  214959. 0xf99b29e7, 0x6f77e62d },
  214960. { 0xe40bbf59, 0xa271bded, 0x6401aad6, 0x177ba453, 0x73541cd1,
  214961. 0x1755e035, 0x4b71b02f, 0x3465b466, 0xa813359f, 0x22eb7113,
  214962. 0x6f38eac7, 0x9792a8fd, 0xff3bf3b5, 0x11aa012f, 0xf85c3fbf,
  214963. 0x99aafabf, 0x06c0cc42, 0x91e0a2ef, 0x773b7b3a, 0x314d5d57,
  214964. 0xd669840a, 0xae5e2e76, 0x2e5a8be6, 0x86136073, 0xc1cf5580,
  214965. 0xee6d7578, 0x68bed102, 0x2344e00f, 0x8184f0eb, 0x799d7886,
  214966. 0xc3d2cf80, 0x63819c91 },
  214967. { 0x7884b073, 0xca5392e1, 0xeb1267ea, 0x9ec3a1fc, 0x907038a7,
  214968. 0x3d07f5f0, 0xe4c47b70, 0xcb2ac07c, 0x1bf96b91, 0xf96664ee,
  214969. 0x2aea4fbf, 0xebf57589, 0xfade6500, 0x5aabf391, 0x171d1204,
  214970. 0xc5b3376f, 0xa0d3d81a, 0x1ff60c51, 0x976a844b, 0x10b2cfe7,
  214971. 0xbda6125a, 0xe131cc9a, 0x4ebd453e, 0xe0fc16d3, 0x504b6bc1,
  214972. 0xc0d0319a, 0x0a2f8cab, 0xe43a0be7, 0x55e49b47, 0xc80afeec,
  214973. 0x8265d7ee, 0x67d48d12 },
  214974. { 0xea2d56d6, 0x068d59a7, 0x27480a63, 0xd71abd0e, 0xae7366cd,
  214975. 0x6bd11db0, 0x07204ebc, 0xfbb639ca, 0xf77e6293, 0x89a242e7,
  214976. 0x75ba8c3d, 0xdee7ca2b, 0x64a2f9a8, 0x472ddc3d, 0x7561a010,
  214977. 0x84229df4, 0xc5b649d4, 0x95f62c85, 0x4dc927cd, 0xfdd56b1b,
  214978. 0x5ee60596, 0xfe8bb120, 0xabf29401, 0x3efcaa50, 0x10d1c184,
  214979. 0xd4900d0f, 0x28b01df5, 0x2cf113a9, 0x1f0e43f5, 0xa3d7ebc3,
  214980. 0xe8384dc7, 0x27950e38 },
  214981. { 0xe1d0fa79, 0xeab21ff0, 0x048b5de9, 0x4b9fd033, 0x2fe374cb,
  214982. 0x4c934689, 0x4eb21f6b, 0xbb4827fa, 0xa925e7e7, 0x46716f79,
  214983. 0x7dd4c531, 0x1442bf36, 0xd2e96ddf, 0x2073954c, 0x8502aa89,
  214984. 0x4e0141ae, 0x8eef6cc9, 0x8ee00e1a, 0x5880cdaf, 0x55ce8491,
  214985. 0x69628046, 0xff3aba5c, 0x5d15dfbf, 0x335cc4f8, 0x9f684f25,
  214986. 0xa7f0440c, 0xbb1e5bd8, 0xae80453f, 0xff2225ab, 0xa1c99813,
  214987. 0x79b25d71, 0x54ff7884 },
  214988. { 0xde40b068, 0x27c6ee30, 0xe6f3a51e, 0x9226465b, 0xfa3b21f6,
  214989. 0xe24a4604, 0xc0418115, 0x50a5a5ad, 0x8df90d2b, 0xe3285441,
  214990. 0xdcb0c00f, 0xbb74e58f, 0x4a2c08e3, 0xc68f1b3b, 0x0ccd9ec9,
  214991. 0x339df081, 0xb786ea9f, 0x915362dc, 0xc955aead, 0x28945e31,
  214992. 0x8b6a6c6b, 0xd6a2c01d, 0x3678a427, 0x069e82dc, 0x28c9302c,
  214993. 0x17875500, 0x9fa101e6, 0x8acda965, 0xee30b286, 0x4e4e4573,
  214994. 0x3f1830fe, 0x8adbad85 },
  214995. { 0x0969d524, 0x060ae11f, 0xf39bcc79, 0xf42fdaf7, 0x7cc1fcc2,
  214996. 0x3cec6766, 0xe2336d4f, 0x456b9cf2, 0x8e1c0f7f, 0x6aa1f5de,
  214997. 0x0984fb0e, 0xcdbc2ad2, 0x1b464b28, 0x4090cfa6, 0x1243f3ef,
  214998. 0x40d86f30, 0xcd5e87e7, 0x95b16ccc, 0x3026cd41, 0x403f168c,
  214999. 0x816c0730, 0xdbe386cb, 0x58407a1d, 0x14eb86f3, 0x1717e1af,
  215000. 0xf588b4f8, 0x66cbc96c, 0xb75c41a6, 0x027e71c1, 0xf342c1aa,
  215001. 0xc0945e5f, 0x73930036 },
  215002. { 0x22cdaf42, 0x954f757d, 0xf4181aab, 0x788b591d, 0xf5514f25,
  215003. 0x8b986819, 0xf18fd5bc, 0x69642e08, 0x022ceb91, 0x92b305d1,
  215004. 0x6a4f6985, 0x1715903e, 0x61179cae, 0x4bd7d69d, 0xd29c01aa,
  215005. 0xdacdfd5d, 0xd91108cc, 0x705ddd5a, 0x64ac8f15, 0x434ac7b1,
  215006. 0xb524632f, 0x61a514e1, 0x731fc447, 0x45b9e61b, 0xe0961b31,
  215007. 0xcf561348, 0x73eaf223, 0x9c28a967, 0xaa7c99d3, 0x5bd10182,
  215008. 0xe42965e2, 0x8bc6ec4a },
  215009. { 0xe7f2a32b, 0xd096e5c0, 0x09388a30, 0xff54800c, 0x401e360c,
  215010. 0x06fe437c, 0xbb6054a6, 0x6655fc9c, 0x8457aa6e, 0x510e1860,
  215011. 0x2b29b2b7, 0xa0acfca2, 0x51b7da61, 0x732483e3, 0x6be6c8ca,
  215012. 0xe31471ee, 0x8b65c9a1, 0xe565431c, 0x48d65cbb, 0xfc9ac3b9,
  215013. 0xae9b2aa8, 0xd308fc21, 0xaa60aa6a, 0xd6a7df0d, 0x982fc0d4,
  215014. 0x2844d96a, 0x5847a4d7, 0xab012c2c, 0xdceb8955, 0x2b3c8f71,
  215015. 0xbe9c7e15, 0x8e85437d },
  215016. };
  215017. /* Perform the modular exponentiation in Fp* for SAKKE.
  215018. *
  215019. * Base is fixed to be the g parameter - a precomputed table is used.
  215020. *
  215021. * Striping: 128 points at a distance of 8 combined.
  215022. * Total of 256 points in table.
  215023. * Square and multiply performed in Fp*.
  215024. *
  215025. * base [in] Base. MP integer.
  215026. * exp [in] Exponent. MP integer.
  215027. * res [out] Result. MP integer.
  215028. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  215029. * and MEMORY_E if memory allocation fails.
  215030. */
  215031. int sp_ModExp_Fp_star_1024(const mp_int* base, mp_int* exp, mp_int* res)
  215032. {
  215033. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  215034. !defined(WOLFSSL_SP_NO_MALLOC)
  215035. sp_digit* td;
  215036. sp_digit* t;
  215037. sp_digit* tx;
  215038. sp_digit* ty;
  215039. #else
  215040. sp_digit t[4 * 2 * 32];
  215041. sp_digit tx[2 * 32];
  215042. sp_digit ty[2 * 32];
  215043. #endif
  215044. sp_digit* r = NULL;
  215045. unsigned char e[128];
  215046. int err = MP_OKAY;
  215047. int i;
  215048. int y;
  215049. (void)base;
  215050. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  215051. !defined(WOLFSSL_SP_NO_MALLOC)
  215052. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 6 * 32 * 2, NULL,
  215053. DYNAMIC_TYPE_TMP_BUFFER);
  215054. if (td == NULL) {
  215055. err = MEMORY_E;
  215056. }
  215057. #endif
  215058. if (err == MP_OKAY) {
  215059. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  215060. !defined(WOLFSSL_SP_NO_MALLOC)
  215061. t = td;
  215062. tx = td + 4 * 32 * 2;
  215063. ty = td + 5 * 32 * 2;
  215064. #endif
  215065. r = ty;
  215066. (void)mp_to_unsigned_bin_len(exp, e, 128);
  215067. XMEMCPY(tx, p1024_norm_mod, sizeof(sp_digit) * 32);
  215068. y = e[112] >> 7;
  215069. y |= (e[96] >> 7) << 1;
  215070. y |= (e[80] >> 7) << 2;
  215071. y |= (e[64] >> 7) << 3;
  215072. y |= (e[48] >> 7) << 4;
  215073. y |= (e[32] >> 7) << 5;
  215074. y |= (e[16] >> 7) << 6;
  215075. y |= (e[0] >> 7) << 7;
  215076. XMEMCPY(ty, sp_1024_g_table[y], sizeof(sp_digit) * 32);
  215077. for (i = 126; i >= 0; i--) {
  215078. y = (e[127 - (i / 8)] >> (i & 0x7)) & 1;
  215079. y |= ((e[111 - (i / 8)] >> (i & 0x7)) & 1) << 1;
  215080. y |= ((e[95 - (i / 8)] >> (i & 0x7)) & 1) << 2;
  215081. y |= ((e[79 - (i / 8)] >> (i & 0x7)) & 1) << 3;
  215082. y |= ((e[63 - (i / 8)] >> (i & 0x7)) & 1) << 4;
  215083. y |= ((e[47 - (i / 8)] >> (i & 0x7)) & 1) << 5;
  215084. y |= ((e[31 - (i / 8)] >> (i & 0x7)) & 1) << 6;
  215085. y |= ((e[15 - (i / 8)] >> (i & 0x7)) & 1) << 7;
  215086. sp_1024_proj_sqr_32(tx, ty, t);
  215087. sp_1024_proj_mul_qx1_32(tx, ty, sp_1024_g_table[y], t);
  215088. }
  215089. }
  215090. if (err == MP_OKAY) {
  215091. sp_1024_mont_inv_32(tx, tx, t);
  215092. sp_1024_mont_mul_32(r, tx, ty, p1024_mod, p1024_mp_mod);
  215093. XMEMSET(r + 32, 0, sizeof(sp_digit) * 32);
  215094. sp_1024_mont_reduce_32(r, p1024_mod, p1024_mp_mod);
  215095. err = sp_1024_to_mp(r, res);
  215096. }
  215097. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  215098. !defined(WOLFSSL_SP_NO_MALLOC)
  215099. if (td != NULL) {
  215100. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  215101. }
  215102. #endif
  215103. return err;
  215104. }
  215105. #endif /* WOLFSSL_SP_SMALL */
  215106. /* Multiply p* by q* in projective co-ordinates.
  215107. *
  215108. * p.x' = (p.x * q.x) - (p.y * q.y)
  215109. * p.y' = (p.x * q.y) + (p.y * q.x)
  215110. * But applying Karatsuba:
  215111. * v0 = p.x * q.x
  215112. * v1 = p.y * q.y
  215113. * p.x' = v0 - v1
  215114. * p.y' = (px + py) * (qx + qy) - v0 - v1
  215115. *
  215116. * px [in,out] A single precision integer - X ordinate of number to multiply.
  215117. * py [in,out] A single precision integer - Y ordinate of number to multiply.
  215118. * qx [in] A single precision integer - X ordinate of number of
  215119. * multiplier.
  215120. * qy [in] A single precision integer - Y ordinate of number of
  215121. * multiplier.
  215122. * t [in] Two single precision integers - temps.
  215123. */
  215124. static void sp_1024_proj_mul_32(sp_digit* px, sp_digit* py,
  215125. const sp_digit* qx, const sp_digit* qy, sp_digit* t)
  215126. {
  215127. sp_digit* t1 = t;
  215128. sp_digit* t2 = t + 2 * 32;
  215129. /* t1 = px + py */
  215130. sp_1024_mont_add_32(t1, px, py, p1024_mod);
  215131. /* t2 = qx + qy */
  215132. sp_1024_mont_add_32(t2, qx, qy, p1024_mod);
  215133. /* t2 = (px + py) * (qx + qy) */
  215134. sp_1024_mont_mul_32(t2, t1, t2, p1024_mod, p1024_mp_mod);
  215135. /* t1 = py * qy */
  215136. sp_1024_mont_mul_32(t1, py, qy, p1024_mod, p1024_mp_mod);
  215137. /* t2 = (px + py) * (qx + qy) - (py * qy) */
  215138. sp_1024_mont_sub_32(t2, t2, t1, p1024_mod);
  215139. /* px = px * qx */
  215140. sp_1024_mont_mul_32(px, px, qx, p1024_mod, p1024_mp_mod);
  215141. /* py = (px + py) * (qx + qy) - (py * qy) - (px * qx) */
  215142. sp_1024_mont_sub_32(py, t2, px, p1024_mod);
  215143. /* px = (px * qx) - (py * qy)*/
  215144. sp_1024_mont_sub_32(px, px, t1, p1024_mod);
  215145. }
  215146. #ifndef WOLFSSL_SP_SMALL
  215147. /*
  215148. * Convert point from projective to affine but keep in Montgomery form.
  215149. *
  215150. * p [in,out] Point to convert.
  215151. * t [in] Temporary numbers: 2.
  215152. */
  215153. static void sp_1024_mont_map_32(sp_point_1024* p, sp_digit* t)
  215154. {
  215155. sp_digit* t1 = t;
  215156. sp_digit* t2 = t + 2 * 32;
  215157. sp_1024_mont_inv_32(t1, p->z, t2);
  215158. sp_1024_mont_sqr_32(t2, t1, p1024_mod, p1024_mp_mod);
  215159. sp_1024_mont_mul_32(t1, t2, t1, p1024_mod, p1024_mp_mod);
  215160. sp_1024_mont_mul_32(p->x, p->x, t2, p1024_mod, p1024_mp_mod);
  215161. sp_1024_mont_mul_32(p->y, p->y, t1, p1024_mod, p1024_mp_mod);
  215162. XMEMCPY(p->z, p1024_norm_mod, sizeof(sp_digit) * 32);
  215163. }
  215164. #endif /* WOLFSSL_SP_SMALL */
  215165. /*
  215166. * Calculate gradient of line through P, P and [-2]P, accumulate line and
  215167. * double P.
  215168. *
  215169. * Calculations:
  215170. * l = 3 * (p.x^2 - p.z^4) = 3 * (p.x - p.z^2) * (p.x + p.z^2)
  215171. * r.x = l * (p.x + q.x * p.z^2) - 2 * p.y^2
  215172. * r.y = 2 * p.y * p.z^3 * q.y (= p'.z * p.z^2 * q.y)
  215173. * v* = v*^2 * r*
  215174. * p'.x = l^2 - 8 * p.y^2 * p.x
  215175. * p'.y = (4 * p.y^2 * p.x - p'.x) * l - 8 * p.y^4
  215176. * p'.z = 2 * p.y * p.z
  215177. *
  215178. * @param [in,out] vx X-ordinate of projective value in F*.
  215179. * @param [in,out] vy Y-ordinate of projective value in F*.
  215180. * @param [in,out] p ECC point - point on E(F_p^2) to double.
  215181. * @param [in] q ECC point - second point on E(F_P^2).
  215182. * @param [in] t SP temporaries (6 used).
  215183. */
  215184. static void sp_1024_accumulate_line_dbl_32(sp_digit* vx, sp_digit* vy,
  215185. sp_point_1024* p, const sp_point_1024* q, sp_digit* t)
  215186. {
  215187. sp_digit* t1 = t + 0 * 32;
  215188. sp_digit* pz2 = t + 2 * 32;
  215189. sp_digit* rx = t + 4 * 32;
  215190. sp_digit* ry = t + 6 * 32;
  215191. sp_digit* l = t + 8 * 32;
  215192. sp_digit* ty = t + 10 * 32;
  215193. /* v = v^2 */
  215194. sp_1024_proj_sqr_32(vx, vy, t);
  215195. /* pz2 = p.z^2 */
  215196. sp_1024_mont_sqr_32(pz2, p->z, p1024_mod, p1024_mp_mod);
  215197. /* t1 = p.x + p.z^2 */
  215198. sp_1024_mont_add_32(ty, p->x, pz2, p1024_mod);
  215199. /* l = p.x - p.z^2 */
  215200. sp_1024_mont_sub_32(l, p->x, pz2, p1024_mod);
  215201. /* t1 = (p.x + p.z^2) * (p.x - p.z^2) = p.x^2 - p.z^4 */
  215202. sp_1024_mont_mul_32(t1, l, ty, p1024_mod, p1024_mp_mod);
  215203. /* l = 3 * (p.x^2 - p.z^4) */
  215204. sp_1024_mont_tpl_32(l, t1, p1024_mod);
  215205. /* t1 = q.x * p.z^2 */
  215206. sp_1024_mont_mul_32(t1, q->x, pz2, p1024_mod, p1024_mp_mod);
  215207. /* t1 = p.x + q.x * p.z^2 */
  215208. sp_1024_mont_add_32(t1, p->x, t1, p1024_mod);
  215209. /* r.x = l * (p.x + q.x * p.z^2) */
  215210. sp_1024_mont_mul_32(rx, l, t1, p1024_mod, p1024_mp_mod);
  215211. /* r.y = 2 * p.y */
  215212. sp_1024_mont_dbl_32(ry, p->y, p1024_mod);
  215213. /* ty = 4 * p.y ^ 2 */
  215214. sp_1024_mont_sqr_32(ty, ry, p1024_mod, p1024_mp_mod);
  215215. /* t1 = 2 * p.y ^ 2 */
  215216. sp_1024_div2_32(t1, ty, p1024_mod);
  215217. /* r.x -= 2 * (p.y ^ 2) */
  215218. sp_1024_mont_sub_32(rx, rx, t1, p1024_mod);
  215219. /* p'.z = p.y * 2 * p.z */
  215220. sp_1024_mont_mul_32(p->z, p->z, ry, p1024_mod, p1024_mp_mod);
  215221. /* r.y = p'.z * p.z^2 */
  215222. sp_1024_mont_mul_32(t1, p->z, pz2, p1024_mod, p1024_mp_mod);
  215223. /* r.y = p'.z * p.z^2 * q.y */
  215224. sp_1024_mont_mul_32(ry, t1, q->y, p1024_mod, p1024_mp_mod);
  215225. /* v = v^2 * r */
  215226. sp_1024_proj_mul_32(vx, vy, rx, ry, t);
  215227. /* Double point using previously calculated values
  215228. * l = 3 * (p.x - p.z^2).(p.x + p.z^2)
  215229. * ty = 4 * p.y^2
  215230. * p'.z = 2 * p.y * p.z
  215231. */
  215232. /* t1 = (4 * p.y^2) ^ 2 = 16 * p.y^4 */
  215233. sp_1024_mont_sqr_32(t1, ty, p1024_mod, p1024_mp_mod);
  215234. /* t1 = 16 * p.y^4 / 2 = 8 * p.y^4 */
  215235. sp_1024_div2_32(t1, t1, p1024_mod);
  215236. /* p'.y = 4 * p.y^2 * p.x */
  215237. sp_1024_mont_mul_32(p->y, ty, p->x, p1024_mod, p1024_mp_mod);
  215238. /* p'.x = l^2 */
  215239. sp_1024_mont_sqr_32(p->x, l, p1024_mod, p1024_mp_mod);
  215240. /* p'.x = l^2 - 4 * p.y^2 * p.x */
  215241. sp_1024_mont_sub_32(p->x, p->x, p->y, p1024_mod);
  215242. /* p'.x = l^2 - 8 * p.y^2 * p.x */
  215243. sp_1024_mont_sub_32(p->x, p->x, p->y, p1024_mod);
  215244. /* p'.y = 4 * p.y^2 * p.x - p.x' */
  215245. sp_1024_mont_sub_32(ty, p->y, p->x, p1024_mod);
  215246. /* p'.y = (4 * p.y^2 * p.x - p'.x) * l */
  215247. sp_1024_mont_mul_32(p->y, ty, l, p1024_mod, p1024_mp_mod);
  215248. /* p'.y = (4 * p.y^2 * p.x - p'.x) * l - 8 * p.y^4 */
  215249. sp_1024_mont_sub_32(p->y, p->y, t1, p1024_mod);
  215250. }
  215251. #ifdef WOLFSSL_SP_SMALL
  215252. /*
  215253. * Calculate gradient of line through C, P and -C-P, accumulate line and
  215254. * add P to C.
  215255. *
  215256. * Calculations:
  215257. * r.x = (q.x + p.x) * c.y - (q.x * c.z^2 + c.x) * p.y * c.z
  215258. * r.y = (c.x - p.x * c.z^2) * q.y * c.z
  215259. * v* = v* * r*
  215260. * r = p.y * c.z^3 - c.y
  215261. * c'.x = r^2 + h^3 - 2 * c.x * h^2
  215262. * c'.y = r * (c'.x - c.x * h^2) - c.y * h^3
  215263. * c'.z = (c.x - p.x * c.z^2) * c.z
  215264. *
  215265. * @param [in,out] vx X-ordinate of projective value in F*.
  215266. * @param [in,out] vy Y-ordinate of projective value in F*.
  215267. * @param [in,out] c ECC point - current point on E(F_p^2) to be added
  215268. * to.
  215269. * @param [in] p ECC point - point on E(F_p^2) to add.
  215270. * @param [in] q ECC point - second point on E(F_P^2).
  215271. * @param [in] qx_px SP that is a constant value across adds.
  215272. * @param [in] t SP temporaries (6 used).
  215273. */
  215274. static void sp_1024_accumulate_line_add_one_32(sp_digit* vx, sp_digit* vy,
  215275. sp_point_1024* c, sp_point_1024* p, sp_point_1024* q, sp_digit* qx_px,
  215276. sp_digit* t)
  215277. {
  215278. sp_digit* t1 = t;
  215279. sp_digit* t2 = t + 2 * 32;
  215280. sp_digit* rx = t + 4 * 32;
  215281. sp_digit* ry = t + 6 * 32;
  215282. sp_digit* h = t + 8 * 32;
  215283. sp_digit* r = t + 10 * 32;
  215284. /* r.x = (q.x + p.x) * c.y */
  215285. sp_1024_mont_mul_32(rx, qx_px, c->y, p1024_mod, p1024_mp_mod);
  215286. /* t2 = c.z^2 */
  215287. sp_1024_mont_sqr_32(t2, c->z, p1024_mod, p1024_mp_mod);
  215288. /* t1 = q.x * c.z^2 */
  215289. sp_1024_mont_mul_32(t1, q->x, t2, p1024_mod, p1024_mp_mod);
  215290. /* t1 = q.x * c.z^2 + c.x */
  215291. sp_1024_mont_add_32(h, t1, c->x, p1024_mod);
  215292. /* r = p.y * c.z */
  215293. sp_1024_mont_mul_32(ry, p->y, c->z, p1024_mod, p1024_mp_mod);
  215294. /* t1 = (q.x * c.z^2 + c.x) * p.y * c.z */
  215295. sp_1024_mont_mul_32(t1, h, ry, p1024_mod, p1024_mp_mod);
  215296. /* r = p.y * c.z * c.z^2 = p.y * c.z^3 */
  215297. sp_1024_mont_mul_32(r, ry, t2, p1024_mod, p1024_mp_mod);
  215298. /* r.x -= (q.x * c.z^2 + c.x) * p.y * c.z */
  215299. sp_1024_mont_sub_32(rx, rx, t1, p1024_mod);
  215300. /* t1 = p.x * c.z^2 */
  215301. sp_1024_mont_mul_32(t1, p->x, t2, p1024_mod, p1024_mp_mod);
  215302. /* h = c.x - p.x * c.z^2 */
  215303. sp_1024_mont_sub_32(h, c->x, t1, p1024_mod);
  215304. /* c'.z = (c.x - p.x * c.z^2) * c.z */
  215305. sp_1024_mont_mul_32(c->z, h, c->z, p1024_mod, p1024_mp_mod);
  215306. /* r.y = (c.x - p.x * c.z^2) * c.z * q.y */
  215307. sp_1024_mont_mul_32(ry, c->z, q->y, p1024_mod, p1024_mp_mod);
  215308. /* v = v * r */
  215309. sp_1024_proj_mul_32(vx, vy, rx, ry, t);
  215310. /* Add p to c using previously calculated values.
  215311. * h = c.x - p.x * c.z^2
  215312. * r = p.y * c.z^3
  215313. * c'.z = (c.x - p.x * c.z^2) * c.z
  215314. */
  215315. /* r = p.y * c.z^3 - c.y */
  215316. sp_1024_mont_sub_32(r, r, c->y, p1024_mod);
  215317. /* t1 = r^2 */
  215318. sp_1024_mont_sqr_32(t1, r, p1024_mod, p1024_mp_mod);
  215319. /* t2 = h^2 */
  215320. sp_1024_mont_sqr_32(rx, h, p1024_mod, p1024_mp_mod);
  215321. /* ry = c.x * h^2 */
  215322. sp_1024_mont_mul_32(ry, c->x, rx, p1024_mod, p1024_mp_mod);
  215323. /* t2 = h^3 */
  215324. sp_1024_mont_mul_32(t2, rx, h, p1024_mod, p1024_mp_mod);
  215325. /* c->x = r^2 + h^3 */
  215326. sp_1024_mont_add_32(c->x, t1, t2, p1024_mod);
  215327. /* t1 = 2 * c.x * h^2 */
  215328. sp_1024_mont_dbl_32(t1, ry, p1024_mod);
  215329. /* c'.x = r^2 + h^3 - 2 * c.x * h^2 */
  215330. sp_1024_mont_sub_32(c->x, c->x, t1, p1024_mod);
  215331. /* ry = c'.x - c.x * h^2 */
  215332. sp_1024_mont_sub_32(t1, c->x, ry, p1024_mod);
  215333. /* ry = r * (c'.x - c.x * h^2) */
  215334. sp_1024_mont_mul_32(ry, t1, r, p1024_mod, p1024_mp_mod);
  215335. /* t2 = c.y * h^3 */
  215336. sp_1024_mont_mul_32(t1, t2, c->y, p1024_mod, p1024_mp_mod);
  215337. /* c'.y = r * (c'.x - c.x * h^2) - c.y * h^3 */
  215338. sp_1024_mont_sub_32(c->y, ry, t1, p1024_mod);
  215339. }
  215340. /*
  215341. * Calculate r = pairing <P, Q>.
  215342. *
  215343. * That is, multiply base in PF_p[q] by the scalar s, such that s.P = Q.
  215344. *
  215345. * @param [in] key SAKKE key.
  215346. * @param [in] p First point on E(F_p)[q].
  215347. * @param [in] q Second point on E(F_p)[q].
  215348. * @param [in] r Result of calculation.
  215349. * @return 0 on success.
  215350. * @return MEMORY_E when dynamic memory allocation fails.
  215351. * @return Other -ve value on internal failure.
  215352. */
  215353. int sp_Pairing_1024(const ecc_point* pm, const ecc_point* qm, mp_int* res)
  215354. {
  215355. int err = MP_OKAY;
  215356. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  215357. !defined(WOLFSSL_SP_NO_MALLOC)
  215358. sp_digit* td = NULL;
  215359. sp_digit* t;
  215360. sp_digit* vx;
  215361. sp_digit* vy;
  215362. sp_digit* qx_px;
  215363. #else
  215364. sp_digit t[6 * 2 * 32];
  215365. sp_digit vx[2 * 32];
  215366. sp_digit vy[2 * 32];
  215367. sp_digit qx_px[2 * 32];
  215368. sp_point_1024 pd;
  215369. sp_point_1024 qd;
  215370. sp_point_1024 cd;
  215371. #endif
  215372. sp_point_1024* p = NULL;
  215373. sp_point_1024* q = NULL;
  215374. sp_point_1024* c = NULL;
  215375. sp_digit* r = NULL;
  215376. int i;
  215377. err = sp_1024_point_new_32(NULL, pd, p);
  215378. if (err == MP_OKAY) {
  215379. err = sp_1024_point_new_32(NULL, qd, q);
  215380. }
  215381. if (err == MP_OKAY) {
  215382. err = sp_1024_point_new_32(NULL, cd, c);
  215383. }
  215384. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  215385. !defined(WOLFSSL_SP_NO_MALLOC)
  215386. if (err == MP_OKAY) {
  215387. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 9 * 32 * 2, NULL,
  215388. DYNAMIC_TYPE_TMP_BUFFER);
  215389. if (td == NULL) {
  215390. err = MEMORY_E;
  215391. }
  215392. }
  215393. #endif
  215394. if (err == MP_OKAY) {
  215395. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  215396. !defined(WOLFSSL_SP_NO_MALLOC)
  215397. t = td;
  215398. vx = td + 6 * 32 * 2;
  215399. vy = td + 7 * 32 * 2;
  215400. qx_px = td + 8 * 32 * 2;
  215401. #endif
  215402. r = vy;
  215403. sp_1024_point_from_ecc_point_32(p, pm);
  215404. sp_1024_point_from_ecc_point_32(q, qm);
  215405. err = sp_1024_mod_mul_norm_32(p->x, p->x, p1024_mod);
  215406. }
  215407. if (err == MP_OKAY) {
  215408. err = sp_1024_mod_mul_norm_32(p->y, p->y, p1024_mod);
  215409. }
  215410. if (err == MP_OKAY) {
  215411. err = sp_1024_mod_mul_norm_32(p->z, p->z, p1024_mod);
  215412. }
  215413. if (err == MP_OKAY) {
  215414. err = sp_1024_mod_mul_norm_32(q->x, q->x, p1024_mod);
  215415. }
  215416. if (err == MP_OKAY) {
  215417. err = sp_1024_mod_mul_norm_32(q->y, q->y, p1024_mod);
  215418. }
  215419. if (err == MP_OKAY) {
  215420. XMEMCPY(c, p, sizeof(sp_point_1024));
  215421. XMEMSET(vx, 0, sizeof(sp_digit) * 2 * 32);
  215422. vx[0] = 1;
  215423. XMEMSET(vy, 0, sizeof(sp_digit) * 2 * 32);
  215424. sp_1024_mont_add_32(qx_px, q->x, p->x, p1024_mod);
  215425. for (i = 1020; i >= 0; i--) {
  215426. /* Accumulate line into v and double point. */
  215427. sp_1024_accumulate_line_dbl_32(vx, vy, c, q, t);
  215428. if ((i > 0) && ((p1024_order[i / 32] >> (i % 32)) & 1)) {
  215429. /* Accumulate line into v and add P into C. */
  215430. sp_1024_accumulate_line_add_one_32(vx, vy, c, p, q, qx_px, t);
  215431. }
  215432. }
  215433. /* Final exponentiation */
  215434. sp_1024_proj_sqr_32(vx, vy, t);
  215435. sp_1024_proj_sqr_32(vx, vy, t);
  215436. /* Convert from PF_p[q] to F_p */
  215437. sp_1024_mont_inv_32(vx, vx, t);
  215438. sp_1024_mont_mul_32(r, vx, vy, p1024_mod, p1024_mp_mod);
  215439. XMEMSET(r + 32, 0, sizeof(sp_digit) * 32);
  215440. sp_1024_mont_reduce_32(r, p1024_mod, p1024_mp_mod);
  215441. err = sp_1024_to_mp(r, res);
  215442. }
  215443. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  215444. !defined(WOLFSSL_SP_NO_MALLOC)
  215445. if (td != NULL) {
  215446. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  215447. }
  215448. #endif
  215449. sp_1024_point_free_32(c, 1, NULL);
  215450. sp_1024_point_free_32(q, 1, NULL);
  215451. sp_1024_point_free_32(p, 1, NULL);
  215452. return err;
  215453. }
  215454. #else
  215455. /*
  215456. * Calculate gradient of line through C, P and -C-P, accumulate line and
  215457. * add P to C.
  215458. *
  215459. * Both C and P have z ordinates to use in the calculation.
  215460. *
  215461. * Calculations:
  215462. * r.x = (q.x * c.z^2 + c.x) * p.y * c.z - (q.x * p.z^2 + p.x) * c.y * p.z
  215463. * r.y = (p.x * c.z^2 - c.x * p.z^2) * q.y * p.z * c.z
  215464. * v* = v* * r*
  215465. * h = p.x * c.z^2 - c.x * p.z^2
  215466. * r = p.y * c.z^3 - c.y * p.z^3
  215467. * c'.x = r^2 - h^3 - 2 * c.x * p.z^2 * h^2
  215468. * c'.y = r * (c.x * p.z^2 * h^2 - c'.x) - c.y * p.z^3 * h^3
  215469. * c'.z = (p.x * c.z^2 - c.x * p.z^2) * c.z
  215470. *
  215471. * @param [in,out] vx X-ordinate of projective value in F*.
  215472. * @param [in,out] vy Y-ordinate of projective value in F*.
  215473. * @param [in,out] c ECC point - current point on E(F_p^2) to be added
  215474. * to.
  215475. * @param [in,out] p ECC point - point on E(F_p^2) to add.
  215476. * @param [in,out] q ECC point - second point on E(F_P^2).
  215477. * @param [in,out] t SP temporaries (6 used).
  215478. * @param [in,out] neg Indicates to use negative P.
  215479. * @return 0 on success.
  215480. * @return MEMORY_E when dynamic memory allocation fails.
  215481. * @return Other -ve value on internal failure.
  215482. */
  215483. static void sp_1024_accumulate_line_add_n_32(sp_digit* vx, sp_digit* vy,
  215484. const sp_point_1024* p, const sp_point_1024* q,
  215485. sp_point_1024* c, sp_digit* t, int neg)
  215486. {
  215487. sp_digit* t1 = t;
  215488. sp_digit* t2 = t + 2 * 32;
  215489. sp_digit* rx = t + 4 * 32;
  215490. sp_digit* ry = t + 6 * 32;
  215491. sp_digit* h = t + 8 * 32;
  215492. sp_digit* r = t + 10 * 32;
  215493. /* h = p.z^2 */
  215494. sp_1024_mont_sqr_32(h, p->z, p1024_mod, p1024_mp_mod);
  215495. /* rx = q.x * p.z^2 */
  215496. sp_1024_mont_mul_32(rx, q->x, h, p1024_mod, p1024_mp_mod);
  215497. /* rx = q.x * p.z^2 + p.x */
  215498. sp_1024_mont_add_32(t2, rx, p->x, p1024_mod);
  215499. /* c.y = c.y * p.z */
  215500. sp_1024_mont_mul_32(t1, c->y, p->z, p1024_mod, p1024_mp_mod);
  215501. /* r.x = (q.x * p.z^2 + p.x) * c.y * p.z */
  215502. sp_1024_mont_mul_32(rx, t2, t1, p1024_mod, p1024_mp_mod);
  215503. /* c.y = c.y * p.z^3 */
  215504. sp_1024_mont_mul_32(c->y, t1, h, p1024_mod, p1024_mp_mod);
  215505. /* t2 = c.z^2 */
  215506. sp_1024_mont_sqr_32(t2, c->z, p1024_mod, p1024_mp_mod);
  215507. /* t1 = q.x * c.z^2 */
  215508. sp_1024_mont_mul_32(t1, q->x, t2, p1024_mod, p1024_mp_mod);
  215509. /* t1 = q.x * c.z^2 + c.x */
  215510. sp_1024_mont_add_32(t1, t1, c->x, p1024_mod);
  215511. /* c.x = c.x * p.z^2 */
  215512. sp_1024_mont_mul_32(c->x, c->x, h, p1024_mod, p1024_mp_mod);
  215513. /* r = p.y * c.z */
  215514. sp_1024_mont_mul_32(r, p->y, c->z, p1024_mod, p1024_mp_mod);
  215515. if (neg) {
  215516. /* r = -p.y * c.z */
  215517. sp_1024_mont_sub_32(r, p1024_mod, r, p1024_mod);
  215518. }
  215519. /* t1 = (q.x * c.z^2 + c.x) * p.y * c.z */
  215520. sp_1024_mont_mul_32(ry, t1, r, p1024_mod, p1024_mp_mod);
  215521. /* r.x -= (q.x * c.z^2 + c.x) * p.y * c.z */
  215522. sp_1024_mont_sub_32(rx, ry, rx, p1024_mod);
  215523. /* t1 = p.x * c.z^2 */
  215524. sp_1024_mont_mul_32(t1, p->x, t2, p1024_mod, p1024_mp_mod);
  215525. /* h = p.x * c.z^2 - c.x * p.z^2 */
  215526. sp_1024_mont_sub_32(h, t1, c->x, p1024_mod);
  215527. /* c'.z = (p.x * c.z^2 - c.x * p.z^2) * c.z */
  215528. sp_1024_mont_mul_32(t1, h, c->z, p1024_mod, p1024_mp_mod);
  215529. /* c'.z = (p.x * c.z^2 - c.x * p.z^2) * c.z * p.z */
  215530. sp_1024_mont_mul_32(c->z, t1, p->z, p1024_mod, p1024_mp_mod);
  215531. /* r.y = (p.x * c.z^2 - c.x * p.z^2) * c.z * p.z * q.y */
  215532. sp_1024_mont_mul_32(ry, c->z, q->y, p1024_mod, p1024_mp_mod);
  215533. /* r = p.y * c.z^3 */
  215534. sp_1024_mont_mul_32(t1, r, t2, p1024_mod, p1024_mp_mod);
  215535. /* r = p.y * c.z^3 - c.y * p.z^3 */
  215536. sp_1024_mont_sub_32(r, t1, c->y, p1024_mod);
  215537. /* v = v * r */
  215538. sp_1024_proj_mul_32(vx, vy, rx, ry, t);
  215539. /* Add p to c using previously calculated values.
  215540. * h = p.x * c.z^2 - c.x * p.z^2
  215541. * r = p.y * c.z^3 - c.y * p.z^3
  215542. * c'.z = (p.x * c.z^2 - c.x * p.z^2) * c.z
  215543. */
  215544. /* t1 = r^2 */
  215545. sp_1024_mont_sqr_32(t1, r, p1024_mod, p1024_mp_mod);
  215546. /* t2 = h^2 */
  215547. sp_1024_mont_sqr_32(rx, h, p1024_mod, p1024_mp_mod);
  215548. /* ry = c.x * p.z^2 * h^2 */
  215549. sp_1024_mont_mul_32(ry, rx, c->x, p1024_mod, p1024_mp_mod);
  215550. /* t2 = h^3 */
  215551. sp_1024_mont_mul_32(t2, rx, h, p1024_mod, p1024_mp_mod);
  215552. /* c'.x = r^2 - h^3 */
  215553. sp_1024_mont_sub_32(c->x, t1, t2, p1024_mod);
  215554. /* t1 = 2 * c.x * p.z^2 * h^2 */
  215555. sp_1024_mont_dbl_32(t1, ry, p1024_mod);
  215556. /* c'.x = r^2 - h^3 - 2 * c.x * p.z^2 * h^2 */
  215557. sp_1024_mont_sub_32(c->x, c->x, t1, p1024_mod);
  215558. /* ry = c.x * p.z^2 * h^2 - c'.x */
  215559. sp_1024_mont_sub_32(t1, ry, c->x, p1024_mod);
  215560. /* ry = r * (c.x * p.z^2 * h^2 - c'.x) */
  215561. sp_1024_mont_mul_32(ry, t1, r, p1024_mod, p1024_mp_mod);
  215562. /* t2 = c.y * p.z^3 * h^3 */
  215563. sp_1024_mont_mul_32(t1, t2, c->y, p1024_mod, p1024_mp_mod);
  215564. /* c'.y = r * (c.x * p.z^2 * h^2 - c'.x) - c.y * p.z^3 * h^3 */
  215565. sp_1024_mont_sub_32(c->y, ry, t1, p1024_mod);
  215566. }
  215567. /*
  215568. * Perform n accumulate doubles and doubles of P.
  215569. *
  215570. * py = 2 * p.y
  215571. *
  215572. * For each double:
  215573. * Calculate gradient of line through P, P and [-2]P, accumulate line and
  215574. * double P.
  215575. *
  215576. * Calculations:
  215577. * l = 3 * (p.x^2 - p.z^4) = 3 * (p.x - p.z^2) * (p.x + p.z^2)
  215578. * r.x = l * (p.x + q.x * p.z^2) - py^2 / 2
  215579. * r.y = py * p.z^3 * q.y (= p'.z * p.z^2 * q.y)
  215580. * v* = v*^2 * r*
  215581. * p'.x = l^2 - 2 * py^2 * p.x
  215582. * py' = (py^2 * p.x - p'.x) * l - py^4 (= 2 * p'.y)
  215583. * p'.z = py * p.z
  215584. *
  215585. * Finally:
  215586. * p'.y = py' / 2
  215587. *
  215588. * @param [in,out] vx X-ordinate of projective value in F*.
  215589. * @param [in,out] vy Y-ordinate of projective value in F*.
  215590. * @param [in,out] p ECC point - point on E(F_p^2) to double.
  215591. * @param [in] q ECC point - second point on E(F_P^2).
  215592. * @param [in] n Number of times to double.
  215593. * @param [in] t SP temporaries (6 used).
  215594. */
  215595. static void sp_1024_accumulate_line_dbl_n_32(sp_digit* vx, sp_digit* vy,
  215596. sp_point_1024* p, const sp_point_1024* q, int n, sp_digit* t)
  215597. {
  215598. sp_digit* t1 = t + 0 * 32;
  215599. sp_digit* pz2 = t + 2 * 32;
  215600. sp_digit* rx = t + 4 * 32;
  215601. sp_digit* ry = t + 6 * 32;
  215602. sp_digit* l = t + 8 * 32;
  215603. sp_digit* ty = t + 10 * 32;
  215604. int i;
  215605. /* py = 2 * p.y */
  215606. sp_1024_mont_dbl_32(p->y, p->y, p1024_mod);
  215607. for (i = 0; i < n; i++) {
  215608. /* v = v^2 */
  215609. sp_1024_proj_sqr_32(vx, vy, t);
  215610. /* pz2 = p.z^2 */
  215611. sp_1024_mont_sqr_32(pz2, p->z, p1024_mod, p1024_mp_mod);
  215612. /* t1 = p.x + p.z^2 */
  215613. sp_1024_mont_add_32(t1, p->x, pz2, p1024_mod);
  215614. /* l = p.x - p.z^2 */
  215615. sp_1024_mont_sub_32(l, p->x, pz2, p1024_mod);
  215616. /* t1 = (p.x + p.z^2) * (p.x - p.z^2) = p.x^2 - p.z^4 */
  215617. sp_1024_mont_mul_32(ty, l, t1, p1024_mod, p1024_mp_mod);
  215618. /* l = 3 * (p.x^2 - p.z^4) */
  215619. sp_1024_mont_tpl_32(l, ty, p1024_mod);
  215620. /* t1 = q.x * p.z^2 */
  215621. sp_1024_mont_mul_32(t1, q->x, pz2, p1024_mod, p1024_mp_mod);
  215622. /* t1 = p.x + q.x * p.z^2 */
  215623. sp_1024_mont_add_32(t1, p->x, t1, p1024_mod);
  215624. /* r.x = l * (p.x + q.x * p.z^2) */
  215625. sp_1024_mont_mul_32(rx, l, t1, p1024_mod, p1024_mp_mod);
  215626. /* ty = py ^ 2 */
  215627. sp_1024_mont_sqr_32(ty, p->y, p1024_mod, p1024_mp_mod);
  215628. /* t1 = py ^ 2 / 2 */
  215629. sp_1024_div2_32(t1, ty, p1024_mod);
  215630. /* r.x -= py ^ 2 / 2 */
  215631. sp_1024_mont_sub_32(rx, rx, t1, p1024_mod);
  215632. /* p'.z = py * pz */
  215633. sp_1024_mont_mul_32(p->z, p->z, p->y, p1024_mod, p1024_mp_mod);
  215634. /* r.y = p'.z * p.z^2 */
  215635. sp_1024_mont_mul_32(t1, p->z, pz2, p1024_mod, p1024_mp_mod);
  215636. /* r.y = p'.z * p.z^2 * q.y */
  215637. sp_1024_mont_mul_32(ry, t1, q->y, p1024_mod, p1024_mp_mod);
  215638. /* v = v^2 * r */
  215639. sp_1024_proj_mul_32(vx, vy, rx, ry, t);
  215640. /* Double point using previously calculated values
  215641. * l = 3 * (p.x - p.z^2).(p.x + p.z^2)
  215642. * ty = py^2
  215643. * p'.z = py * p.z
  215644. */
  215645. /* t1 = py^2 ^ 2 = py^4 */
  215646. sp_1024_mont_sqr_32(t1, ty, p1024_mod, p1024_mp_mod);
  215647. /* py' = py^2 * p. x */
  215648. sp_1024_mont_mul_32(p->y, ty, p->x, p1024_mod, p1024_mp_mod);
  215649. /* p'.x = l^2 */
  215650. sp_1024_mont_sqr_32(p->x, l, p1024_mod, p1024_mp_mod);
  215651. /* p'.x = l^2 - py^2 * p.x */
  215652. sp_1024_mont_sub_32(p->x, p->x, p->y, p1024_mod);
  215653. /* p'.x = l^2 - 2 * p.y^2 * p.x */
  215654. sp_1024_mont_sub_32(p->x, p->x, p->y, p1024_mod);
  215655. /* py' = py^2 * p.x - p.x' */
  215656. sp_1024_mont_sub_32(ty, p->y, p->x, p1024_mod);
  215657. /* py' = (p.y^2 * p.x - p'.x) * l */
  215658. sp_1024_mont_mul_32(p->y, ty, l, p1024_mod, p1024_mp_mod);
  215659. /* py' = (p.y^2 * p.x - p'.x) * l * 2 */
  215660. sp_1024_mont_dbl_32(p->y, p->y, p1024_mod);
  215661. /* py' = (p.y^2 * p.x - p'.x) * l * 2 - p.y^4 */
  215662. sp_1024_mont_sub_32(p->y, p->y, t1, p1024_mod);
  215663. }
  215664. /* p'.y = py' / 2 */
  215665. sp_1024_div2_32(p->y, p->y, p1024_mod);
  215666. }
  215667. /* Operations to perform based on order - 1.
  215668. * Sliding window. Start at bottom and stop when bottom bit is one.
  215669. * Subtract if top bit in window is one.
  215670. * Width of 6 bits.
  215671. * Pairs: #dbls, add/subtract window value
  215672. */
  215673. static const signed char sp_1024_order_op[] = {
  215674. 5, 6, -13, 9, -21, 6, -5, 8, 31, 6, 3, 6, -27, 6, 25, 9,
  215675. -1, 6, -11, 6, -13, 6, -7, 6, -15, 6, -29, 7, 25, 6, -9, 6,
  215676. -19, 7, 3, 6, 11, 9, -23, 6, 1, 6, 27, 6, 1, 7, -25, 8,
  215677. 13, 7, -13, 7, -23, 10, 19, 7, 7, 7, -3, 7, 27, 6, -7, 7,
  215678. -21, 7, 11, 7, 31, 8, 1, 7, -23, 6, -17, 6, -3, 10, 11, 6,
  215679. -21, 7, -27, 11, -29, 6, -1, 10, 15, 8, 27, 7, 17, 6, 17, 7,
  215680. -13, 8, 13, 6, 21, 7, -29, 6, 19, 7, -25, 6, 11, 9, 29, 7,
  215681. -7, 8, 27, 7, 29, 10, -1, 8, -7, 8, 17, 6, 17, 7, -27, 7,
  215682. -21, 6, -9, 6, -27, 12, -23, 6, 19, 6, 13, 6, -11, 7, 27, 6,
  215683. 17, 6, -7, 6, -25, 7, -29, 6, 9, 7, 7, 6, 13, 6, -25, 6,
  215684. -19, 6, 13, 6, -11, 6, 5, 8, 19, 6, -21, 8, 23, 7, 27, 6,
  215685. -13, 6, -19, 11, 29, 7, -15, 6, -9, 7, -21, 10, -3, 7, 21, 10,
  215686. 25, 6, -15, 6, -23, 6, 21, 6, 1, 6, 21, 7, -3, 6, -3, 7,
  215687. -7, 6, -23, 7, 7, 8, 15, 9, 5, 6, -11, 6, 21, 11, -27, 7,
  215688. 27, 6, -11, 6, 31, 6, -21, 6, 19, 6, -7, 8, -7, 13, -3, 6,
  215689. -7, 7, -3, 6, 1, 6, 7, 8, 19, 8, 11, 9, -9, 7, -31, 12,
  215690. 25, 6, -17, 9, -15, 7, 5, 6, 25, 7, -5, 7, -25, 6, 17, 8,
  215691. -19, 6, -13, 6, 27, 8, 1, 7, -5, 7, -1, 6, 21, 6, 3, 10,
  215692. -3, 1,
  215693. };
  215694. /*
  215695. * Calculate r = pairing <P, Q>.
  215696. *
  215697. * That is, multiply base in PF_p[q] by the scalar s, such that s.P = Q.
  215698. *
  215699. * Sliding window. Start at bottom and stop when bottom bit is one.
  215700. * Subtract if top bit in window is one.
  215701. * Width of 6 bits.
  215702. *
  215703. * @param [in] pm First point on E(F_p)[q].
  215704. * @param [in] qm Second point on E(F_p)[q].
  215705. * @param [in] res Result of calculation.
  215706. * @return 0 on success.
  215707. * @return MEMORY_E when dynamic memory allocation fails.
  215708. */
  215709. int sp_Pairing_1024(const ecc_point* pm, const ecc_point* qm, mp_int* res)
  215710. {
  215711. int err;
  215712. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  215713. !defined(WOLFSSL_SP_NO_MALLOC)
  215714. sp_digit* td = NULL;
  215715. sp_digit* t;
  215716. sp_digit* vx;
  215717. sp_digit* vy;
  215718. sp_digit (*pre_vx)[64];
  215719. sp_digit (*pre_vy)[64];
  215720. sp_digit (*pre_nvy)[64];
  215721. sp_point_1024* pre_p;
  215722. #else
  215723. sp_digit t[6 * 2 * 32];
  215724. sp_digit vx[2 * 32];
  215725. sp_digit vy[2 * 32];
  215726. sp_digit pre_vx[16][64];
  215727. sp_digit pre_vy[16][64];
  215728. sp_digit pre_nvy[16][64];
  215729. sp_point_1024 pre_p[16];
  215730. sp_point_1024 pd;
  215731. sp_point_1024 qd;
  215732. sp_point_1024 cd;
  215733. #endif
  215734. sp_point_1024* p = NULL;
  215735. sp_point_1024* q = NULL;
  215736. sp_point_1024* c = NULL;
  215737. sp_digit* r = NULL;
  215738. int i;
  215739. int j;
  215740. err = sp_1024_point_new_32(NULL, pd, p);
  215741. if (err == MP_OKAY) {
  215742. err = sp_1024_point_new_32(NULL, qd, q);
  215743. }
  215744. if (err == MP_OKAY) {
  215745. err = sp_1024_point_new_32(NULL, cd, c);
  215746. }
  215747. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  215748. !defined(WOLFSSL_SP_NO_MALLOC)
  215749. if (err == MP_OKAY) {
  215750. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 56 * 32 * 2 + 16 * sizeof(sp_point_1024), NULL,
  215751. DYNAMIC_TYPE_TMP_BUFFER);
  215752. if (td == NULL) {
  215753. err = MEMORY_E;
  215754. }
  215755. }
  215756. #endif
  215757. if (err == MP_OKAY) {
  215758. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  215759. !defined(WOLFSSL_SP_NO_MALLOC)
  215760. t = td;
  215761. vx = td + 6 * 32 * 2;
  215762. vy = td + 7 * 32 * 2;
  215763. pre_vx = (sp_digit(*)[64])(td + 8 * 32 * 2);
  215764. pre_vy = (sp_digit(*)[64])(td + 24 * 32 * 2);
  215765. pre_nvy = (sp_digit(*)[64])(td + 40 * 32 * 2);
  215766. pre_p = (sp_point_1024*)(td + 56 * 32 * 2);
  215767. #endif
  215768. r = vy;
  215769. sp_1024_point_from_ecc_point_32(p, pm);
  215770. sp_1024_point_from_ecc_point_32(q, qm);
  215771. err = sp_1024_mod_mul_norm_32(p->x, p->x, p1024_mod);
  215772. }
  215773. if (err == MP_OKAY) {
  215774. err = sp_1024_mod_mul_norm_32(p->y, p->y, p1024_mod);
  215775. }
  215776. if (err == MP_OKAY) {
  215777. err = sp_1024_mod_mul_norm_32(p->z, p->z, p1024_mod);
  215778. }
  215779. if (err == MP_OKAY) {
  215780. err = sp_1024_mod_mul_norm_32(q->x, q->x, p1024_mod);
  215781. }
  215782. if (err == MP_OKAY) {
  215783. err = sp_1024_mod_mul_norm_32(q->y, q->y, p1024_mod);
  215784. }
  215785. if (err == MP_OKAY) {
  215786. /* Generate pre-computation table: 1, 3, ... , 31 */
  215787. XMEMCPY(&pre_p[0], p, sizeof(sp_point_1024));
  215788. XMEMSET(pre_vx[0], 0, sizeof(sp_digit) * 2 * 32);
  215789. pre_vx[0][0] = 1;
  215790. XMEMSET(pre_vy[0], 0, sizeof(sp_digit) * 2 * 32);
  215791. sp_1024_mont_sub_32(pre_nvy[0], p1024_mod, pre_vy[0], p1024_mod);
  215792. /* [2]P for adding */
  215793. XMEMCPY(c, p, sizeof(sp_point_1024));
  215794. XMEMSET(vx, 0, sizeof(sp_digit) * 2 * 32);
  215795. vx[0] = 1;
  215796. XMEMSET(vy, 0, sizeof(sp_digit) * 2 * 32);
  215797. sp_1024_accumulate_line_dbl_32(vx, vy, c, q, t);
  215798. /* 3, 5, ... */
  215799. for (i = 1; i < 16; i++) {
  215800. XMEMCPY(&pre_p[i], &pre_p[i-1], sizeof(sp_point_1024));
  215801. XMEMCPY(pre_vx[i], pre_vx[i-1], sizeof(sp_digit) * 2 * 32);
  215802. XMEMCPY(pre_vy[i], pre_vy[i-1], sizeof(sp_digit) * 2 * 32);
  215803. sp_1024_proj_mul_32(pre_vx[i], pre_vy[i], vx, vy, t);
  215804. sp_1024_accumulate_line_add_n_32(pre_vx[i], pre_vy[i], c,
  215805. q, &pre_p[i], t, 0);
  215806. sp_1024_mont_sub_32(pre_nvy[i], p1024_mod, pre_vy[i], p1024_mod);
  215807. }
  215808. j = sp_1024_order_op[0] / 2;
  215809. XMEMCPY(c, &pre_p[j], sizeof(sp_point_1024));
  215810. XMEMCPY(vx, pre_vx[j], sizeof(sp_digit) * 2 * 32);
  215811. XMEMCPY(vy, pre_vy[j], sizeof(sp_digit) * 2 * 32);
  215812. /* Accumulate line into v and double point n times. */
  215813. sp_1024_accumulate_line_dbl_n_32(vx, vy, c, q,
  215814. sp_1024_order_op[1], t);
  215815. for (i = 2; i < 290; i += 2) {
  215816. j = sp_1024_order_op[i];
  215817. if (j > 0) {
  215818. j /= 2;
  215819. /* Accumulate line into v and add P into C. */
  215820. sp_1024_proj_mul_32(vx, vy, pre_vx[j], pre_vy[j], t);
  215821. sp_1024_accumulate_line_add_n_32(vx, vy, &pre_p[j], q, c,
  215822. t, 0);
  215823. }
  215824. else {
  215825. j = -j / 2;
  215826. /* Accumulate line into v and add P into C. */
  215827. sp_1024_proj_mul_32(vx, vy, pre_vx[j], pre_nvy[j], t);
  215828. sp_1024_accumulate_line_add_n_32(vx, vy, &pre_p[j], q, c,
  215829. t, 1);
  215830. }
  215831. /* Accumulate line into v and double point n times. */
  215832. sp_1024_accumulate_line_dbl_n_32(vx, vy, c, q,
  215833. sp_1024_order_op[i + 1], t);
  215834. }
  215835. /* Final exponentiation */
  215836. sp_1024_proj_sqr_32(vx, vy, t);
  215837. sp_1024_proj_sqr_32(vx, vy, t);
  215838. /* Convert from PF_p[q] to F_p */
  215839. sp_1024_mont_inv_32(vx, vx, t);
  215840. sp_1024_mont_mul_32(r, vx, vy, p1024_mod, p1024_mp_mod);
  215841. XMEMSET(r + 32, 0, sizeof(sp_digit) * 32);
  215842. sp_1024_mont_reduce_32(r, p1024_mod, p1024_mp_mod);
  215843. err = sp_1024_to_mp(r, res);
  215844. }
  215845. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  215846. !defined(WOLFSSL_SP_NO_MALLOC)
  215847. if (td != NULL) {
  215848. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  215849. }
  215850. #endif
  215851. sp_1024_point_free_32(c, 1, NULL);
  215852. sp_1024_point_free_32(q, 1, NULL);
  215853. sp_1024_point_free_32(p, 1, NULL);
  215854. return err;
  215855. }
  215856. #endif /* WOLFSSL_SP_SMALL */
  215857. #ifdef WOLFSSL_SP_SMALL
  215858. /*
  215859. * Generate table for pairing.
  215860. *
  215861. * Small implementation does not use a table - returns 0 length.
  215862. *
  215863. * pm [in] Point to generate table for.
  215864. * table [in] Generated table.
  215865. * len [in,out] On in, the size of the buffer.
  215866. * On out, length of table generated.
  215867. * @return 0 on success.
  215868. * LENGTH_ONLY_E when table is NULL and only length returned.
  215869. * BUFFER_E when len is too small.
  215870. */
  215871. int sp_Pairing_gen_precomp_1024(const ecc_point* pm, byte* table,
  215872. word32* len)
  215873. {
  215874. int err = 0;
  215875. if (table == NULL) {
  215876. *len = 0;
  215877. err = LENGTH_ONLY_E;
  215878. }
  215879. else if (*len != 0) {
  215880. err = BUFFER_E;
  215881. }
  215882. (void)*pm;
  215883. return err;
  215884. }
  215885. /*
  215886. * Calculate r = pairing <P, Q>.
  215887. *
  215888. * That is, multiply base in PF_p[q] by the scalar s, such that s.P = Q.
  215889. *
  215890. * Small implementation does not use a table - use the normal implementation.
  215891. *
  215892. * @param [in] pm First point on E(F_p)[q].
  215893. * @param [in] qm Second point on E(F_p)[q].
  215894. * @param [in] res Result of calculation.
  215895. * @param [in] table Precomputed table of values.
  215896. * @param [in] len Length of precomputed table of values in bytes.
  215897. * @return 0 on success.
  215898. * @return MEMORY_E when dynamic memory allocation fails.
  215899. */
  215900. int sp_Pairing_precomp_1024(const ecc_point* pm, const ecc_point* qm,
  215901. mp_int* res, const byte* table, word32 len)
  215902. {
  215903. (void)table;
  215904. (void)len;
  215905. return sp_Pairing_1024(pm, qm, res);
  215906. }
  215907. #else
  215908. /*
  215909. * Calc l and c for the point when doubling p.
  215910. *
  215911. * l = 3 * (p.x^2 - 1) / (2 * p.y)
  215912. * c = l * p.x - p.y
  215913. *
  215914. * @param [out] lr Gradient result - table entry.
  215915. * @param [out] cr Constant result - table entry.
  215916. * @param [in] px X-ordinate of point to double.
  215917. * @param [in] py Y-ordinate of point to double.
  215918. * @param [in] t SP temporaries (3 used).
  215919. */
  215920. static void sp_1024_accum_dbl_calc_lc_32(sp_digit* lr, sp_digit* cr,
  215921. const sp_digit* px, const sp_digit* py, sp_digit* t)
  215922. {
  215923. sp_digit* t1 = t + 0 * 2 * 32;
  215924. sp_digit* t2 = t + 2 * 2 * 32;
  215925. sp_digit* l = t + 4 * 2 * 32;
  215926. /* l = 1 / 2 * p.y */
  215927. sp_1024_mont_dbl_32(l, py, p1024_mod);
  215928. sp_1024_mont_inv_32(l, l, t);
  215929. /* t1 = p.x^2 */
  215930. sp_1024_mont_sqr_32(t1, px, p1024_mod, p1024_mp_mod);
  215931. /* t1 = p.x - 1 */
  215932. sp_1024_mont_sub_32(t1, t1, p1024_norm_mod, p1024_mod);
  215933. /* t1 = 3 * (p.x^2 - 1) */
  215934. sp_1024_mont_dbl_32(t2, t1, p1024_mod);
  215935. sp_1024_mont_add_32(t1, t1, t2, p1024_mod);
  215936. /* t1 = 3 * (p.x^2 - 1) / (2 * p.y) */
  215937. sp_1024_mont_mul_32(l, l, t1, p1024_mod, p1024_mp_mod);
  215938. /* t2 = l * p.x */
  215939. sp_1024_mont_mul_32(t2, l, px, p1024_mod, p1024_mp_mod);
  215940. /* c = t2 = l * p.x - p.y */
  215941. sp_1024_mont_sub_32(t2, t2, py, p1024_mod);
  215942. XMEMCPY(lr, l, sizeof(sp_digit) * 32);
  215943. XMEMCPY(cr, t2, sizeof(sp_digit) * 32);
  215944. }
  215945. /*
  215946. * Calc l and c when adding p and c.
  215947. *
  215948. * l = (c.y - p.y) / (c.x - p.x)
  215949. * c = (p.x * c.y - cx * p.y) / (cx - p.x)
  215950. *
  215951. * @param [out] lr Gradient result - table entry.
  215952. * @param [out] cr Constant result - table entry.
  215953. * @param [in] px X-ordinate of point to add.
  215954. * @param [in] py Y-ordinate of point to add.
  215955. * @param [in] cx X-ordinate of current point.
  215956. * @param [in] cy Y-ordinate of current point.
  215957. * @param [in] t SP temporaries (3 used).
  215958. */
  215959. static void sp_1024_accum_add_calc_lc_32(sp_digit* lr, sp_digit* cr,
  215960. const sp_digit* px, const sp_digit* py, const sp_digit* cx,
  215961. const sp_digit* cy, sp_digit* t)
  215962. {
  215963. sp_digit* t1 = t + 0 * 2 * 32;
  215964. sp_digit* c = t + 2 * 2 * 32;
  215965. sp_digit* l = t + 4 * 2 * 32;
  215966. /* l = 1 / (c.x - p.x) */
  215967. sp_1024_mont_sub_32(l, cx, px, p1024_mod);
  215968. sp_1024_mont_inv_32(l, l, t);
  215969. /* c = p.x * c.y */
  215970. sp_1024_mont_mul_32(c, px, cy, p1024_mod, p1024_mp_mod);
  215971. /* t1 = c.x * p.y */
  215972. sp_1024_mont_mul_32(t1, cx, py, p1024_mod, p1024_mp_mod);
  215973. /* c = (p.x * c.y) - (c.x * p.y) */
  215974. sp_1024_mont_sub_32(c, c, t1, p1024_mod);
  215975. /* c = ((p.x * c.y) - (c.x * p.y)) / (c.x - p.x) */
  215976. sp_1024_mont_mul_32(c, c, l, p1024_mod, p1024_mp_mod);
  215977. /* t1 = c.y - p.y */
  215978. sp_1024_mont_sub_32(t1, cy, py, p1024_mod);
  215979. /* l = (c.y - p.y) / (c.x - p.x) */
  215980. sp_1024_mont_mul_32(l, t1, l, p1024_mod, p1024_mp_mod);
  215981. XMEMCPY(lr, l, sizeof(sp_digit) * 32);
  215982. XMEMCPY(cr, c, sizeof(sp_digit) * 32);
  215983. }
  215984. /*
  215985. * Calculate vx and vy given gradient l and constant c and point q.
  215986. *
  215987. * l is a the gradient and is multiplied by q->x.
  215988. * c is a the constant that is added to the multiplicative result.
  215989. * q->y is the y-ordinate in result to multiply.
  215990. *
  215991. * if dbl
  215992. * v* = v*^2
  215993. * r.x = l * q.x + c
  215994. * r.y = q->y
  215995. * v* = v* * r*
  215996. *
  215997. * @param [in,out] vx X-ordinate of projective value in F*.
  215998. * @param [in,out] vy Y-ordinate of projective value in F*.
  215999. * @param [in] l Gradient to multiply with.
  216000. * @param [in] c Constant to add with.
  216001. * @param [in] q ECC point - second point on E(F_P^2).
  216002. * @param [in] t SP temporaries (3 used).
  216003. * @param [in] dbl Indicates whether this is for doubling. Otherwise
  216004. * adding.
  216005. */
  216006. static void sp_1024_accumulate_line_lc_32(sp_digit* vx, sp_digit* vy,
  216007. const sp_digit* l, const sp_digit* c, const sp_point_1024* q,
  216008. sp_digit* t, int dbl)
  216009. {
  216010. sp_digit* rx = t + 4 * 2 * 32;
  216011. /* v = v^2 */
  216012. if (dbl) {
  216013. sp_1024_proj_sqr_32(vx, vy, t);
  216014. }
  216015. /* rx = l * q.x + c */
  216016. sp_1024_mont_mul_32(rx, l, q->x, p1024_mod, p1024_mp_mod);
  216017. sp_1024_mont_add_32(rx, rx, c, p1024_mod);
  216018. /* v = v^2 * r */
  216019. sp_1024_proj_mul_32(vx, vy, rx, q->y, t);
  216020. }
  216021. /* Operations to perform based on order - 1.
  216022. * Sliding window. Start at bottom and stop when bottom bit is one.
  216023. * Subtract if top bit in window is one.
  216024. * Width of 6 bits.
  216025. * Pairs: #dbls, add/subtract window value
  216026. */
  216027. static const signed char sp_1024_order_op_pre[] = {
  216028. 5, 6, -13, 9, -21, 6, -5, 8, 31, 6, 3, 6, -27, 6, 25, 9,
  216029. -1, 6, -11, 6, -13, 6, -7, 6, -15, 6, -29, 7, 25, 6, -9, 6,
  216030. -19, 7, 3, 6, 11, 9, -23, 6, 1, 6, 27, 6, 1, 7, -25, 8,
  216031. 13, 7, -13, 7, -23, 10, 19, 7, 7, 7, -3, 7, 27, 6, -7, 7,
  216032. -21, 7, 11, 7, 31, 8, 1, 7, -23, 6, -17, 6, -3, 10, 11, 6,
  216033. -21, 7, -27, 11, -29, 6, -1, 10, 15, 8, 27, 7, 17, 6, 17, 7,
  216034. -13, 8, 13, 6, 21, 7, -29, 6, 19, 7, -25, 6, 11, 9, 29, 7,
  216035. -7, 8, 27, 7, 29, 10, -1, 8, -7, 8, 17, 6, 17, 7, -27, 7,
  216036. -21, 6, -9, 6, -27, 12, -23, 6, 19, 6, 13, 6, -11, 7, 27, 6,
  216037. 17, 6, -7, 6, -25, 7, -29, 6, 9, 7, 7, 6, 13, 6, -25, 6,
  216038. -19, 6, 13, 6, -11, 6, 5, 8, 19, 6, -21, 8, 23, 7, 27, 6,
  216039. -13, 6, -19, 11, 29, 7, -15, 6, -9, 7, -21, 10, -3, 7, 21, 10,
  216040. 25, 6, -15, 6, -23, 6, 21, 6, 1, 6, 21, 7, -3, 6, -3, 7,
  216041. -7, 6, -23, 7, 7, 8, 15, 9, 5, 6, -11, 6, 21, 11, -27, 7,
  216042. 27, 6, -11, 6, 31, 6, -21, 6, 19, 6, -7, 8, -7, 13, -3, 6,
  216043. -7, 7, -3, 6, 1, 6, 7, 8, 19, 8, 11, 9, -9, 7, -31, 12,
  216044. 25, 6, -17, 9, -15, 7, 5, 6, 25, 7, -5, 7, -25, 6, 17, 8,
  216045. -19, 6, -13, 6, 27, 8, 1, 7, -5, 7, -1, 6, 21, 6, 3, 10,
  216046. -3, 1,
  216047. };
  216048. /*
  216049. * Generate table for pairing.
  216050. *
  216051. * Calculate the graident (l) and constant (c) at each step of the way.
  216052. * Sliding window. Start at bottom and stop when bottom bit is one.
  216053. * Subtract if top bit in window is one.
  216054. * Width of 6 bits.
  216055. *
  216056. * pm [in] Point to generate table for.
  216057. * table [in] Generated table.
  216058. * len [in,out] On in, the size of the buffer.
  216059. * On out, length of table generated.
  216060. * @return 0 on success.
  216061. * LENGTH_ONLY_E when table is NULL and only length returned.
  216062. * BUFFER_E when len is too small.
  216063. * MEMORY_E when dynamic memory allocation fauls.
  216064. */
  216065. int sp_Pairing_gen_precomp_1024(const ecc_point* pm, byte* table,
  216066. word32* len)
  216067. {
  216068. int err = 0;
  216069. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  216070. !defined(WOLFSSL_SP_NO_MALLOC)
  216071. sp_digit* td = NULL;
  216072. sp_digit* t;
  216073. sp_point_1024* pre_p;
  216074. #else
  216075. sp_digit t[6 * 2 * 32];
  216076. sp_point_1024 pre_p[16];
  216077. sp_point_1024 pd;
  216078. sp_point_1024 cd;
  216079. sp_point_1024 negd;
  216080. #endif
  216081. sp_point_1024* p = NULL;
  216082. sp_point_1024* c = NULL;
  216083. sp_point_1024* neg = NULL;
  216084. int i;
  216085. int j;
  216086. int k;
  216087. sp_table_entry_1024* precomp = (sp_table_entry_1024*)table;
  216088. if (table == NULL) {
  216089. *len = sizeof(sp_table_entry_1024) * 1167;
  216090. err = LENGTH_ONLY_E;
  216091. }
  216092. if ((err == MP_OKAY) &&
  216093. (*len < (int)(sizeof(sp_table_entry_1024) * 1167))) {
  216094. err = BUFFER_E;
  216095. }
  216096. if (err == MP_OKAY) {
  216097. err = sp_1024_point_new_32(NULL, pd, p);
  216098. }
  216099. if (err == MP_OKAY) {
  216100. err = sp_1024_point_new_32(NULL, cd, c);
  216101. }
  216102. if (err == MP_OKAY) {
  216103. err = sp_1024_point_new_32(NULL, negd, neg);
  216104. }
  216105. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  216106. !defined(WOLFSSL_SP_NO_MALLOC)
  216107. if (err == MP_OKAY) {
  216108. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 6 * 32 * 2 + 16 * sizeof(sp_point_1024), NULL,
  216109. DYNAMIC_TYPE_TMP_BUFFER);
  216110. if (td == NULL) {
  216111. err = MEMORY_E;
  216112. }
  216113. }
  216114. #endif
  216115. if (err == MP_OKAY) {
  216116. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  216117. !defined(WOLFSSL_SP_NO_MALLOC)
  216118. t = td;
  216119. pre_p = (sp_point_1024*)(td + 6 * 32 * 2);
  216120. #endif
  216121. sp_1024_point_from_ecc_point_32(p, pm);
  216122. err = sp_1024_mod_mul_norm_32(p->x, p->x, p1024_mod);
  216123. }
  216124. if (err == MP_OKAY) {
  216125. err = sp_1024_mod_mul_norm_32(p->y, p->y, p1024_mod);
  216126. }
  216127. if (err == MP_OKAY) {
  216128. XMEMCPY(p->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  216129. neg->infinity = 0;
  216130. c->infinity = 0;
  216131. /* Generate pre-computation table: 1, 3, ... , 31 */
  216132. XMEMCPY(&pre_p[0], p, sizeof(sp_point_1024));
  216133. /* [2]P for adding */
  216134. sp_1024_proj_point_dbl_32(c, p, t);
  216135. /* 1, 3, ... */
  216136. for (i = 1; i < 16; i++) {
  216137. sp_1024_proj_point_add_32(&pre_p[i], &pre_p[i-1], c, t);
  216138. sp_1024_mont_map_32(&pre_p[i], t);
  216139. }
  216140. k = 0;
  216141. j = sp_1024_order_op_pre[0] / 2;
  216142. XMEMCPY(c, &pre_p[j], sizeof(sp_point_1024));
  216143. for (j = 0; j < sp_1024_order_op_pre[1]; j++) {
  216144. sp_1024_accum_dbl_calc_lc_32(precomp[k].x, precomp[k].y, c->x, c->y, t);
  216145. k++;
  216146. sp_1024_proj_point_dbl_32(c, c, t);
  216147. sp_1024_mont_map_32(c, t);
  216148. }
  216149. for (i = 2; i < 290; i += 2) {
  216150. j = sp_1024_order_op_pre[i];
  216151. if (j > 0) {
  216152. sp_1024_accum_add_calc_lc_32(precomp[k].x, precomp[k].y,
  216153. pre_p[j/2].x, pre_p[j/2].y, c->x, c->y, t);
  216154. k++;
  216155. sp_1024_proj_point_add_32(c, c, &pre_p[j/2], t);
  216156. sp_1024_mont_map_32(c, t);
  216157. }
  216158. else {
  216159. XMEMCPY(neg->x, pre_p[-j / 2].x, sizeof(pre_p->x));
  216160. sp_1024_mont_sub_32(neg->y, p1024_mod, pre_p[-j / 2].y,
  216161. p1024_mod);
  216162. XMEMCPY(neg->z, pre_p[-j / 2].z, sizeof(pre_p->z));
  216163. sp_1024_accum_add_calc_lc_32(precomp[k].x, precomp[k].y,
  216164. neg->x, neg->y, c->x, c->y, t);
  216165. k++;
  216166. sp_1024_proj_point_add_32(c, c, neg, t);
  216167. sp_1024_mont_map_32(c, t);
  216168. }
  216169. for (j = 0; j < sp_1024_order_op_pre[i + 1]; j++) {
  216170. sp_1024_accum_dbl_calc_lc_32(precomp[k].x, precomp[k].y, c->x, c->y, t);
  216171. k++;
  216172. sp_1024_proj_point_dbl_32(c, c, t);
  216173. sp_1024_mont_map_32(c, t);
  216174. }
  216175. }
  216176. *len = sizeof(sp_table_entry_1024) * 1167;
  216177. }
  216178. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  216179. !defined(WOLFSSL_SP_NO_MALLOC)
  216180. if (td != NULL) {
  216181. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  216182. }
  216183. #endif
  216184. sp_1024_point_free_32(neg, 1, NULL);
  216185. sp_1024_point_free_32(c, 1, NULL);
  216186. sp_1024_point_free_32(p, 1, NULL);
  216187. return err;
  216188. }
  216189. /*
  216190. * Calculate r = pairing <P, Q>.
  216191. *
  216192. * That is, multiply base in PF_p[q] by the scalar s, such that s.P = Q.
  216193. *
  216194. * Sliding window. Start at bottom and stop when bottom bit is one.
  216195. * Subtract if top bit in window is one.
  216196. * Width of 6 bits.
  216197. * Pre-generate values in window (1, 3, ...) - only V.
  216198. * Table contains all gradient l and a constant for each point on the path.
  216199. *
  216200. * @param [in] pm First point on E(F_p)[q].
  216201. * @param [in] qm Second point on E(F_p)[q].
  216202. * @param [in] res Result of calculation.
  216203. * @param [in] table Precomputed table of values.
  216204. * @param [in] len Length of precomputed table of values in bytes.
  216205. * @return 0 on success.
  216206. * @return MEMORY_E when dynamic memory allocation fails.
  216207. */
  216208. int sp_Pairing_precomp_1024(const ecc_point* pm, const ecc_point* qm,
  216209. mp_int* res, const byte* table, word32 len)
  216210. {
  216211. int err = 0;
  216212. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  216213. !defined(WOLFSSL_SP_NO_MALLOC)
  216214. sp_digit* td = NULL;
  216215. sp_digit* t;
  216216. sp_digit* vx;
  216217. sp_digit* vy;
  216218. sp_digit (*pre_vx)[64];
  216219. sp_digit (*pre_vy)[64];
  216220. sp_digit (*pre_nvy)[64];
  216221. #else
  216222. sp_digit t[6 * 2 * 32];
  216223. sp_digit vx[2 * 32];
  216224. sp_digit vy[2 * 32];
  216225. sp_digit pre_vx[16][64];
  216226. sp_digit pre_vy[16][64];
  216227. sp_digit pre_nvy[16][64];
  216228. sp_point_1024 pd;
  216229. sp_point_1024 qd;
  216230. sp_point_1024 cd;
  216231. #endif
  216232. sp_point_1024* p = NULL;
  216233. sp_point_1024* q = NULL;
  216234. sp_point_1024* c = NULL;
  216235. sp_digit* r = NULL;
  216236. int i;
  216237. int j;
  216238. int k;
  216239. const sp_table_entry_1024* precomp = (const sp_table_entry_1024*)table;
  216240. if (len < (int)(sizeof(sp_table_entry_1024) * 1167)) {
  216241. err = BUFFER_E;
  216242. }
  216243. if (err == MP_OKAY) {
  216244. err = sp_1024_point_new_32(NULL, pd, p);
  216245. }
  216246. if (err == MP_OKAY) {
  216247. err = sp_1024_point_new_32(NULL, qd, q);
  216248. }
  216249. if (err == MP_OKAY) {
  216250. err = sp_1024_point_new_32(NULL, cd, c);
  216251. }
  216252. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  216253. !defined(WOLFSSL_SP_NO_MALLOC)
  216254. if (err == MP_OKAY) {
  216255. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 56 * 32 * 2, NULL,
  216256. DYNAMIC_TYPE_TMP_BUFFER);
  216257. if (td == NULL) {
  216258. err = MEMORY_E;
  216259. }
  216260. }
  216261. #endif
  216262. if (err == MP_OKAY) {
  216263. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  216264. !defined(WOLFSSL_SP_NO_MALLOC)
  216265. t = td;
  216266. vx = td + 6 * 32 * 2;
  216267. vy = td + 7 * 32 * 2;
  216268. pre_vx = (sp_digit(*)[64])(td + 8 * 32 * 2);
  216269. pre_vy = (sp_digit(*)[64])(td + 24 * 32 * 2);
  216270. pre_nvy = (sp_digit(*)[64])(td + 40 * 32 * 2);
  216271. #endif
  216272. r = vy;
  216273. sp_1024_point_from_ecc_point_32(p, pm);
  216274. sp_1024_point_from_ecc_point_32(q, qm);
  216275. err = sp_1024_mod_mul_norm_32(p->x, p->x, p1024_mod);
  216276. }
  216277. if (err == MP_OKAY) {
  216278. err = sp_1024_mod_mul_norm_32(p->y, p->y, p1024_mod);
  216279. }
  216280. if (err == MP_OKAY) {
  216281. err = sp_1024_mod_mul_norm_32(p->z, p->z, p1024_mod);
  216282. }
  216283. if (err == MP_OKAY) {
  216284. err = sp_1024_mod_mul_norm_32(q->x, q->x, p1024_mod);
  216285. }
  216286. if (err == MP_OKAY) {
  216287. err = sp_1024_mod_mul_norm_32(q->y, q->y, p1024_mod);
  216288. }
  216289. if (err == MP_OKAY) {
  216290. /* Generate pre-computation table: 1, 3, ... , 31 */
  216291. XMEMSET(pre_vx[0], 0, sizeof(sp_digit) * 2 * 32);
  216292. pre_vx[0][0] = 1;
  216293. XMEMSET(pre_vy[0], 0, sizeof(sp_digit) * 2 * 32);
  216294. sp_1024_mont_sub_32(pre_nvy[0], p1024_mod, pre_vy[0], p1024_mod);
  216295. /* [2]P for adding */
  216296. XMEMCPY(c, p, sizeof(sp_point_1024));
  216297. XMEMSET(vx, 0, sizeof(sp_digit) * 2 * 32);
  216298. vx[0] = 1;
  216299. XMEMSET(vy, 0, sizeof(sp_digit) * 2 * 32);
  216300. sp_1024_accumulate_line_dbl_32(vx, vy, c, q, t);
  216301. /* 3, 5, ... */
  216302. for (i = 1; i < 16; i++) {
  216303. XMEMCPY(pre_vx[i], pre_vx[i-1], sizeof(sp_digit) * 2 * 32);
  216304. XMEMCPY(pre_vy[i], pre_vy[i-1], sizeof(sp_digit) * 2 * 32);
  216305. sp_1024_proj_mul_32(pre_vx[i], pre_vy[i], vx, vy, t);
  216306. sp_1024_accumulate_line_add_n_32(pre_vx[i], pre_vy[i], c,
  216307. q, p, t, 0);
  216308. sp_1024_mont_sub_32(pre_nvy[i], p1024_mod, pre_vy[i],
  216309. p1024_mod);
  216310. }
  216311. XMEMCPY(c->z, p1024_norm_mod, sizeof(sp_digit) * 32);
  216312. c->infinity = 0;
  216313. j = sp_1024_order_op_pre[0] / 2;
  216314. XMEMCPY(vx, pre_vx[j], sizeof(sp_digit) * 2 * 32);
  216315. XMEMCPY(vy, pre_vy[j], sizeof(sp_digit) * 2 * 32);
  216316. k = 0;
  216317. for (j = 0; j < sp_1024_order_op_pre[1]; j++) {
  216318. /* Accumulate line into v and double point. */
  216319. sp_1024_accumulate_line_lc_32(vx, vy, precomp[k].x,
  216320. precomp[k].y, q, t, 1);
  216321. k++;
  216322. }
  216323. for (i = 2; i < 290; i += 2) {
  216324. sp_1024_accumulate_line_lc_32(vx, vy, precomp[k].x,
  216325. precomp[k].y, q, t, 0);
  216326. k++;
  216327. j = sp_1024_order_op_pre[i];
  216328. if (j > 0) {
  216329. j /= 2;
  216330. /* Accumulate line into v. */
  216331. sp_1024_proj_mul_32(vx, vy, pre_vx[j], pre_vy[j], t);
  216332. }
  216333. else {
  216334. j = -j / 2;
  216335. /* Accumulate line into v. */
  216336. sp_1024_proj_mul_32(vx, vy, pre_vx[j], pre_nvy[j], t);
  216337. }
  216338. for (j = 0; j < sp_1024_order_op_pre[i + 1]; j++) {
  216339. /* Accumulate line into v and double point. */
  216340. sp_1024_accumulate_line_lc_32(vx, vy, precomp[k].x,
  216341. precomp[k].y, q, t, 1);
  216342. k++;
  216343. }
  216344. }
  216345. /* Final exponentiation */
  216346. sp_1024_proj_sqr_32(vx, vy, t);
  216347. sp_1024_proj_sqr_32(vx, vy, t);
  216348. /* Convert from PF_p[q] to F_p */
  216349. sp_1024_mont_inv_32(vx, vx, t);
  216350. sp_1024_mont_mul_32(r, vx, vy, p1024_mod, p1024_mp_mod);
  216351. XMEMSET(r + 32, 0, sizeof(sp_digit) * 32);
  216352. sp_1024_mont_reduce_32(r, p1024_mod, p1024_mp_mod);
  216353. err = sp_1024_to_mp(r, res);
  216354. }
  216355. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  216356. !defined(WOLFSSL_SP_NO_MALLOC)
  216357. if (td != NULL) {
  216358. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  216359. }
  216360. #endif
  216361. sp_1024_point_free_32(c, 1, NULL);
  216362. sp_1024_point_free_32(q, 1, NULL);
  216363. sp_1024_point_free_32(p, 1, NULL);
  216364. return err;
  216365. }
  216366. #endif /* WOLFSSL_SP_SMALL */
  216367. #ifdef HAVE_ECC_CHECK_KEY
  216368. /* Read big endian unsigned byte array into r.
  216369. *
  216370. * r A single precision integer.
  216371. * size Maximum number of bytes to convert
  216372. * a Byte array.
  216373. * n Number of bytes in array to read.
  216374. */
  216375. static void sp_1024_from_bin(sp_digit* r, int size, const byte* a, int n)
  216376. {
  216377. int i;
  216378. int j;
  216379. byte* d;
  216380. for (i = n - 1,j = 0; i >= 3; i -= 4) {
  216381. r[j] = ((sp_digit)a[i - 0] << 0) |
  216382. ((sp_digit)a[i - 1] << 8) |
  216383. ((sp_digit)a[i - 2] << 16) |
  216384. ((sp_digit)a[i - 3] << 24);
  216385. j++;
  216386. }
  216387. if (i >= 0) {
  216388. r[j] = 0;
  216389. d = (byte*)r;
  216390. switch (i) {
  216391. case 2: d[n - 1 - 2] = a[2]; //fallthrough
  216392. case 1: d[n - 1 - 1] = a[1]; //fallthrough
  216393. case 0: d[n - 1 - 0] = a[0]; //fallthrough
  216394. }
  216395. j++;
  216396. }
  216397. for (; j < size; j++) {
  216398. r[j] = 0;
  216399. }
  216400. }
  216401. /* Check that the x and y oridinates are a valid point on the curve.
  216402. *
  216403. * point EC point.
  216404. * heap Heap to use if dynamically allocating.
  216405. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  216406. * not on the curve and MP_OKAY otherwise.
  216407. */
  216408. static int sp_1024_ecc_is_point_32(const sp_point_1024* point,
  216409. void* heap)
  216410. {
  216411. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  216412. sp_digit* t1 = NULL;
  216413. #else
  216414. sp_digit t1[32 * 4];
  216415. #endif
  216416. sp_digit* t2 = NULL;
  216417. sp_int32 n;
  216418. int err = MP_OKAY;
  216419. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  216420. t1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32 * 4, heap, DYNAMIC_TYPE_ECC);
  216421. if (t1 == NULL)
  216422. err = MEMORY_E;
  216423. #endif
  216424. (void)heap;
  216425. if (err == MP_OKAY) {
  216426. t2 = t1 + 2 * 32;
  216427. sp_1024_sqr_32(t1, point->y);
  216428. (void)sp_1024_mod_32(t1, t1, p1024_mod);
  216429. sp_1024_sqr_32(t2, point->x);
  216430. (void)sp_1024_mod_32(t2, t2, p1024_mod);
  216431. sp_1024_mul_32(t2, t2, point->x);
  216432. (void)sp_1024_mod_32(t2, t2, p1024_mod);
  216433. (void)sp_1024_sub_32(t2, p1024_mod, t2);
  216434. sp_1024_mont_add_32(t1, t1, t2, p1024_mod);
  216435. sp_1024_mont_add_32(t1, t1, point->x, p1024_mod);
  216436. sp_1024_mont_add_32(t1, t1, point->x, p1024_mod);
  216437. sp_1024_mont_add_32(t1, t1, point->x, p1024_mod);
  216438. n = sp_1024_cmp_32(t1, p1024_mod);
  216439. sp_1024_cond_sub_32(t1, t1, p1024_mod, ~(n >> 31));
  216440. sp_1024_norm_32(t1);
  216441. if (!sp_1024_iszero_32(t1)) {
  216442. err = MP_VAL;
  216443. }
  216444. }
  216445. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  216446. if (t1 != NULL)
  216447. XFREE(t1, heap, DYNAMIC_TYPE_ECC);
  216448. #endif
  216449. return err;
  216450. }
  216451. /* Check that the x and y oridinates are a valid point on the curve.
  216452. *
  216453. * pX X ordinate of EC point.
  216454. * pY Y ordinate of EC point.
  216455. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  216456. * not on the curve and MP_OKAY otherwise.
  216457. */
  216458. int sp_ecc_is_point_1024(const mp_int* pX, const mp_int* pY)
  216459. {
  216460. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  216461. sp_point_1024* pub = NULL;
  216462. #else
  216463. sp_point_1024 pub[1];
  216464. #endif
  216465. const byte one[1] = { 1 };
  216466. int err = MP_OKAY;
  216467. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  216468. pub = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024), NULL,
  216469. DYNAMIC_TYPE_ECC);
  216470. if (pub == NULL)
  216471. err = MEMORY_E;
  216472. #endif
  216473. if (err == MP_OKAY) {
  216474. sp_1024_from_mp(pub->x, 32, pX);
  216475. sp_1024_from_mp(pub->y, 32, pY);
  216476. sp_1024_from_bin(pub->z, 32, one, (int)sizeof(one));
  216477. err = sp_1024_ecc_is_point_32(pub, NULL);
  216478. }
  216479. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  216480. if (pub != NULL)
  216481. XFREE(pub, NULL, DYNAMIC_TYPE_ECC);
  216482. #endif
  216483. return err;
  216484. }
  216485. /* Check that the private scalar generates the EC point (px, py), the point is
  216486. * on the curve and the point has the correct order.
  216487. *
  216488. * pX X ordinate of EC point.
  216489. * pY Y ordinate of EC point.
  216490. * privm Private scalar that generates EC point.
  216491. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  216492. * not on the curve, ECC_INF_E if the point does not have the correct order,
  216493. * ECC_PRIV_KEY_E when the private scalar doesn't generate the EC point and
  216494. * MP_OKAY otherwise.
  216495. */
  216496. int sp_ecc_check_key_1024(const mp_int* pX, const mp_int* pY,
  216497. const mp_int* privm, void* heap)
  216498. {
  216499. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  216500. sp_digit* priv = NULL;
  216501. sp_point_1024* pub = NULL;
  216502. #else
  216503. sp_digit priv[32];
  216504. sp_point_1024 pub[2];
  216505. #endif
  216506. sp_point_1024* p = NULL;
  216507. const byte one[1] = { 1 };
  216508. int err = MP_OKAY;
  216509. /* Quick check the lengs of public key ordinates and private key are in
  216510. * range. Proper check later.
  216511. */
  216512. if (((mp_count_bits(pX) > 1024) ||
  216513. (mp_count_bits(pY) > 1024) ||
  216514. ((privm != NULL) && (mp_count_bits(privm) > 1024)))) {
  216515. err = ECC_OUT_OF_RANGE_E;
  216516. }
  216517. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  216518. if (err == MP_OKAY) {
  216519. pub = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * 2, heap,
  216520. DYNAMIC_TYPE_ECC);
  216521. if (pub == NULL)
  216522. err = MEMORY_E;
  216523. }
  216524. if (err == MP_OKAY && privm) {
  216525. priv = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32, heap,
  216526. DYNAMIC_TYPE_ECC);
  216527. if (priv == NULL)
  216528. err = MEMORY_E;
  216529. }
  216530. #endif
  216531. if (err == MP_OKAY) {
  216532. p = pub + 1;
  216533. sp_1024_from_mp(pub->x, 32, pX);
  216534. sp_1024_from_mp(pub->y, 32, pY);
  216535. sp_1024_from_bin(pub->z, 32, one, (int)sizeof(one));
  216536. if (privm)
  216537. sp_1024_from_mp(priv, 32, privm);
  216538. /* Check point at infinitiy. */
  216539. if ((sp_1024_iszero_32(pub->x) != 0) &&
  216540. (sp_1024_iszero_32(pub->y) != 0)) {
  216541. err = ECC_INF_E;
  216542. }
  216543. }
  216544. /* Check range of X and Y */
  216545. if ((err == MP_OKAY) &&
  216546. ((sp_1024_cmp_32(pub->x, p1024_mod) >= 0) ||
  216547. (sp_1024_cmp_32(pub->y, p1024_mod) >= 0))) {
  216548. err = ECC_OUT_OF_RANGE_E;
  216549. }
  216550. if (err == MP_OKAY) {
  216551. /* Check point is on curve */
  216552. err = sp_1024_ecc_is_point_32(pub, heap);
  216553. }
  216554. if (err == MP_OKAY) {
  216555. /* Point * order = infinity */
  216556. err = sp_1024_ecc_mulmod_32(p, pub, p1024_order, 1, 1, heap);
  216557. }
  216558. /* Check result is infinity */
  216559. if ((err == MP_OKAY) && ((sp_1024_iszero_32(p->x) == 0) ||
  216560. (sp_1024_iszero_32(p->y) == 0))) {
  216561. err = ECC_INF_E;
  216562. }
  216563. if (privm) {
  216564. if (err == MP_OKAY) {
  216565. /* Base * private = point */
  216566. err = sp_1024_ecc_mulmod_base_32(p, priv, 1, 1, heap);
  216567. }
  216568. /* Check result is public key */
  216569. if ((err == MP_OKAY) &&
  216570. ((sp_1024_cmp_32(p->x, pub->x) != 0) ||
  216571. (sp_1024_cmp_32(p->y, pub->y) != 0))) {
  216572. err = ECC_PRIV_KEY_E;
  216573. }
  216574. }
  216575. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  216576. if (pub != NULL)
  216577. XFREE(pub, heap, DYNAMIC_TYPE_ECC);
  216578. if (priv != NULL)
  216579. XFREE(priv, heap, DYNAMIC_TYPE_ECC);
  216580. #endif
  216581. return err;
  216582. }
  216583. #endif
  216584. #endif /* WOLFSSL_SP_1024 */
  216585. #endif /* WOLFCRYPT_HAVE_SAKKE */
  216586. #endif /* WOLFSSL_HAVE_SP_ECC */
  216587. #endif /* WOLFSSL_SP_ARM_THUMB_ASM */
  216588. #endif /* WOLFSSL_HAVE_SP_RSA | WOLFSSL_HAVE_SP_DH | WOLFSSL_HAVE_SP_ECC */